# 컨텍스트와 지속성 공개 API

<a id="overview"></a>

이 페이지는 고정 소스 리비전의 production(non-test) Go 파일을 AST로 열거한 공개 계약 색인이다. 테스트 선언, 비공개 식별자, 비공개 receiver 메서드는 제외했다. 각 행의 근거는 선언이 있는 파일 자체이며, 자세한 기본값과 실패 의미는 [설정 참조](configuration.md), [도구 계약](tools.md), [저장 스키마](persistence-schemas.md)에서 보완한다.

다른 묶음: [실행 코어](public-api-runtime.md) · [도구/권한](public-api-actions.md) · [컨텍스트/지속성](public-api-context.md) · [확장/조정](public-api-extensions.md)

<a id="pkg-compaction"></a>

## `compaction`

| 종류 | 식별자 | 선언/시그니처 | 근거 |
|---|---|---|---|
| field | `Config.ContextWindow` | <code>ContextWindow int</code> | [compaction/compaction.go](evidence:api-compaction-compaction) |
| field | `Config.KeepRecent` | <code>KeepRecent int</code> | [compaction/compaction.go](evidence:api-compaction-compaction) |
| field | `Config.MaxOutputTokens` | <code>MaxOutputTokens int</code> | [compaction/compaction.go](evidence:api-compaction-compaction) |
| func | `EstimateTokens` | <code>func EstimateTokens(msgs []llm.Message) int</code> | [compaction/compaction.go](evidence:api-compaction-compaction) |
| func | `IsOverflow` | <code>func IsOverflow(err error) bool</code> | [compaction/compaction.go](evidence:api-compaction-compaction) |
| func | `New` | <code>func New(cfg Config, summarize Summarizer) *Compactor</code> | [compaction/compaction.go](evidence:api-compaction-compaction) |
| func | `ProviderSummarizer` | <code>func ProviderSummarizer(p llm.Provider, maxOutputTokens int, nonStreaming bool) Summarizer</code> | [compaction/summarizer.go](evidence:api-compaction-summarizer) |
| method | `Compactor.IsOverflow` | <code>func (*Compactor) IsOverflow(err error) bool</code> | [compaction/compaction.go](evidence:api-compaction-compaction) |
| method | `Compactor.Pre` | <code>func (*Compactor) Pre(ctx context.Context, msgs []llm.Message, lastInputTokens int) []llm.Message</code> | [compaction/compaction.go](evidence:api-compaction-compaction) |
| method | `Compactor.Reactive` | <code>func (*Compactor) Reactive(ctx context.Context, msgs []llm.Message) ([]llm.Message, bool)</code> | [compaction/compaction.go](evidence:api-compaction-compaction) |
| type | `Compactor` | <code>type Compactor struct</code> | [compaction/compaction.go](evidence:api-compaction-compaction) |
| type | `Config` | <code>type Config struct</code> | [compaction/compaction.go](evidence:api-compaction-compaction) |
| type | `Summarizer` | <code>type Summarizer func(ctx context.Context, msgs []llm.Message) (string, error)</code> | [compaction/compaction.go](evidence:api-compaction-compaction) |

<a id="pkg-transcript"></a>

## `transcript`

| 종류 | 식별자 | 선언/시그니처 | 근거 |
|---|---|---|---|
| field | `Record.AgentID` | <code>AgentID string `json:&#34;agent_id,omitempty&#34;`</code> | [transcript/transcript.go](evidence:api-transcript-transcript) |
| field | `Record.Boundary` | <code>Boundary *llm.BoundaryMeta `json:&#34;boundary,omitempty&#34;`</code> | [transcript/transcript.go](evidence:api-transcript-transcript) |
| field | `Record.IsSidechain` | <code>IsSidechain bool `json:&#34;is_sidechain,omitempty&#34;`</code> | [transcript/transcript.go](evidence:api-transcript-transcript) |
| field | `Record.Message` | <code>Message *llm.Message `json:&#34;message,omitempty&#34;`</code> | [transcript/transcript.go](evidence:api-transcript-transcript) |
| field | `Record.ParentUUID` | <code>ParentUUID string `json:&#34;parent_uuid,omitempty&#34;`</code> | [transcript/transcript.go](evidence:api-transcript-transcript) |
| field | `Record.SessionID` | <code>SessionID string `json:&#34;session_id&#34;`</code> | [transcript/transcript.go](evidence:api-transcript-transcript) |
| field | `Record.Timestamp` | <code>Timestamp string `json:&#34;timestamp&#34;`</code> | [transcript/transcript.go](evidence:api-transcript-transcript) |
| field | `Record.Type` | <code>Type string `json:&#34;type&#34;`</code> | [transcript/transcript.go](evidence:api-transcript-transcript) |
| field | `Record.UUID` | <code>UUID string `json:&#34;uuid&#34;`</code> | [transcript/transcript.go](evidence:api-transcript-transcript) |
| field | `Record.Usage` | <code>Usage *llm.Usage `json:&#34;usage,omitempty&#34;`</code> | [transcript/transcript.go](evidence:api-transcript-transcript) |
| func | `LastUUID` | <code>func LastUUID(recs []Record) string</code> | [transcript/transcript.go](evidence:api-transcript-transcript) |
| func | `Messages` | <code>func Messages(recs []Record) ([]llm.Message, llm.Usage)</code> | [transcript/transcript.go](evidence:api-transcript-transcript) |
| func | `NewAgentID` | <code>func NewAgentID() string</code> | [transcript/transcript.go](evidence:api-transcript-transcript) |
| func | `NewSessionID` | <code>func NewSessionID() string</code> | [transcript/transcript.go](evidence:api-transcript-transcript) |
| func | `NewStore` | <code>func NewStore(dir string) *Store</code> | [transcript/transcript.go](evidence:api-transcript-transcript) |
| func | `SessionIDFrom` | <code>func SessionIDFrom(ctx context.Context) string</code> | [transcript/context.go](evidence:api-transcript-context) |
| func | `WithSessionID` | <code>func WithSessionID(ctx context.Context, sessionID string) context.Context</code> | [transcript/context.go](evidence:api-transcript-context) |
| method | `Store.AgentPath` | <code>func (*Store) AgentPath(sessionID, agentID string) string</code> | [transcript/transcript.go](evidence:api-transcript-transcript) |
| method | `Store.Append` | <code>func (*Store) Append(path string, recs ...Record) error</code> | [transcript/transcript.go](evidence:api-transcript-transcript) |
| method | `Store.Load` | <code>func (*Store) Load(path string) ([]Record, error)</code> | [transcript/transcript.go](evidence:api-transcript-transcript) |
| method | `Store.MainPath` | <code>func (*Store) MainPath(sessionID string) string</code> | [transcript/transcript.go](evidence:api-transcript-transcript) |
| method | `Store.NewWriter` | <code>func (*Store) NewWriter(sessionID, agentID string) *Writer</code> | [transcript/transcript.go](evidence:api-transcript-transcript) |
| method | `Store.ResumeWriter` | <code>func (*Store) ResumeWriter(sessionID, lastUUID string) *Writer</code> | [transcript/transcript.go](evidence:api-transcript-transcript) |
| method | `Writer.Err` | <code>func (*Writer) Err() error</code> | [transcript/transcript.go](evidence:api-transcript-transcript) |
| method | `Writer.RecordBoundary` | <code>func (*Writer) RecordBoundary(meta llm.BoundaryMeta)</code> | [transcript/transcript.go](evidence:api-transcript-transcript) |
| method | `Writer.RecordMessage` | <code>func (*Writer) RecordMessage(m llm.Message, usage llm.Usage)</code> | [transcript/transcript.go](evidence:api-transcript-transcript) |
| type | `Record` | <code>type Record struct</code> | [transcript/transcript.go](evidence:api-transcript-transcript) |
| type | `Store` | <code>type Store struct</code> | [transcript/transcript.go](evidence:api-transcript-transcript) |
| type | `Writer` | <code>type Writer struct</code> | [transcript/transcript.go](evidence:api-transcript-transcript) |

<a id="pkg-memory"></a>

## `memory`

| 종류 | 식별자 | 선언/시그니처 | 근거 |
|---|---|---|---|
| const | `TypeFeedback` | <code>const TypeFeedback Type = &#34;feedback&#34;</code> | [memory/memory.go](evidence:api-memory-memory) |
| const | `TypeProject` | <code>const TypeProject Type = &#34;project&#34;</code> | [memory/memory.go](evidence:api-memory-memory) |
| const | `TypeReference` | <code>const TypeReference Type = &#34;reference&#34;</code> | [memory/memory.go](evidence:api-memory-memory) |
| const | `TypeUser` | <code>const TypeUser Type = &#34;user&#34;</code> | [memory/memory.go](evidence:api-memory-memory) |
| field | `Memory.Content` | <code>Content string</code> | [memory/memory.go](evidence:api-memory-memory) |
| field | `Memory.Description` | <code>Description string</code> | [memory/memory.go](evidence:api-memory-memory) |
| field | `Memory.ModTime` | <code>ModTime time.Time</code> | [memory/memory.go](evidence:api-memory-memory) |
| field | `Memory.Name` | <code>Name string</code> | [memory/memory.go](evidence:api-memory-memory) |
| field | `Memory.Path` | <code>Path string</code> | [memory/memory.go](evidence:api-memory-memory) |
| field | `Memory.Type` | <code>Type Type</code> | [memory/memory.go](evidence:api-memory-memory) |
| field | `Store.Dir` | <code>Dir string</code> | [memory/memory.go](evidence:api-memory-memory) |
| func | `Age` | <code>func Age(m Memory, now time.Time) string</code> | [memory/relevant.go](evidence:api-memory-relevant) |
| func | `NewStore` | <code>func NewStore(dir string) *Store</code> | [memory/memory.go](evidence:api-memory-memory) |
| func | `RecallTool` | <code>func RecallTool(s *Store) tool.CoreTool</code> | [memory/tools.go](evidence:api-memory-tools) |
| func | `RecordTool` | <code>func RecordTool(s *Store) tool.CoreTool</code> | [memory/tools.go](evidence:api-memory-tools) |
| func | `RenderForInjection` | <code>func RenderForInjection(mems []Memory, now time.Time) string</code> | [memory/relevant.go](evidence:api-memory-relevant) |
| func | `Tools` | <code>func Tools(s *Store) []tool.CoreTool</code> | [memory/tools.go](evidence:api-memory-tools) |
| method | `Store.Index` | <code>func (*Store) Index() string</code> | [memory/memory.go](evidence:api-memory-memory) |
| method | `Store.Read` | <code>func (*Store) Read(name string) (Memory, error)</code> | [memory/memory.go](evidence:api-memory-memory) |
| method | `Store.Relevant` | <code>func (*Store) Relevant(query string, max int) []Memory</code> | [memory/relevant.go](evidence:api-memory-relevant) |
| method | `Store.Save` | <code>func (*Store) Save(m Memory) error</code> | [memory/memory.go](evidence:api-memory-memory) |
| method | `Store.Scan` | <code>func (*Store) Scan() ([]Memory, error)</code> | [memory/memory.go](evidence:api-memory-memory) |
| method | `Store.SystemSegment` | <code>func (*Store) SystemSegment() string</code> | [memory/relevant.go](evidence:api-memory-relevant) |
| type | `Memory` | <code>type Memory struct</code> | [memory/memory.go](evidence:api-memory-memory) |
| type | `Store` | <code>type Store struct</code> | [memory/memory.go](evidence:api-memory-memory) |
| type | `Type` | <code>type Type string</code> | [memory/memory.go](evidence:api-memory-memory) |

<a id="pkg-noa"></a>

## `noa`

| 종류 | 식별자 | 선언/시그니처 | 근거 |
|---|---|---|---|
| const | `BlockedRef` | <code>const BlockedRef = &#34;BLOCKED&#34;</code> | [noa/const.go](evidence:api-noa-const) |
| const | `BoundaryBlock` | <code>const BoundaryBlock BoundaryKind = &#34;block&#34;</code> | [noa/boundaries.go](evidence:api-noa-boundaries) |
| const | `BoundaryMessage` | <code>const BoundaryMessage BoundaryKind = &#34;message&#34;</code> | [noa/boundaries.go](evidence:api-noa-boundaries) |
| const | `CTReasoning` | <code>const CTReasoning ContentType = &#34;reasoning&#34;</code> | [noa/types.go](evidence:api-noa-types) |
| const | `CTText` | <code>const CTText ContentType = &#34;text&#34;</code> | [noa/types.go](evidence:api-noa-types) |
| const | `CTToolCall` | <code>const CTToolCall ContentType = &#34;tool-call&#34;</code> | [noa/types.go](evidence:api-noa-types) |
| const | `CTToolResult` | <code>const CTToolResult ContentType = &#34;tool-result&#34;</code> | [noa/types.go](evidence:api-noa-types) |
| const | `CompressPhilosophy` | <code>const CompressPhilosophy = &lt;expression omitted; 534 source chars&gt;</code> | [noa/prompts_rules.go](evidence:api-noa-prompts-rules) |
| const | `CompressToolDescription` | <code>const CompressToolDescription = &lt;expression omitted; 304 source chars&gt;</code> | [noa/schema.go](evidence:api-noa-schema) |
| const | `CompressToolName` | <code>const CompressToolName = &#34;Compress&#34;</code> | [noa/const.go](evidence:api-noa-const) |
| const | `DeadRepeatReject` | <code>const DeadRepeatReject = 2</code> | [noa/const.go](evidence:api-noa-const) |
| const | `HowToCompressRules` | <code>const HowToCompressRules = &lt;expression omitted; 5659 source chars&gt;</code> | [noa/prompts_rules.go](evidence:api-noa-prompts-rules) |
| const | `KeepLastOrphaned` | <code>const KeepLastOrphaned = 2</code> | [noa/const.go](evidence:api-noa-const) |
| const | `MaxRefIndex` | <code>const MaxRefIndex = 99999</code> | [noa/const.go](evidence:api-noa-const) |
| const | `MinRefIndex` | <code>const MinRefIndex = 1</code> | [noa/const.go](evidence:api-noa-const) |
| const | `NoRangesMessage` | <code>const NoRangesMessage = &#34;No ranges provided.&#34;</code> | [noa/panel.go](evidence:api-noa-panel) |
| const | `NotFoundConsumed` | <code>const NotFoundConsumed BoundaryNotFoundKind = &#34;consumed&#34;</code> | [noa/boundaries.go](evidence:api-noa-boundaries) |
| const | `NotFoundInvalid` | <code>const NotFoundInvalid BoundaryNotFoundKind = &#34;invalid&#34;</code> | [noa/boundaries.go](evidence:api-noa-boundaries) |
| const | `NotFoundUnknown` | <code>const NotFoundUnknown BoundaryNotFoundKind = &#34;unknown&#34;</code> | [noa/boundaries.go](evidence:api-noa-boundaries) |
| const | `NudgeMessageID` | <code>const NudgeMessageID = &#34;noa_nudge&#34;</code> | [noa/const.go](evidence:api-noa-const) |
| const | `ParseContentNotList` | <code>const ParseContentNotList CompressParseKind = &#34;content-not-array&#34;</code> | [noa/parseinput.go](evidence:api-noa-parseinput) |
| const | `ParseEmptyInput` | <code>const ParseEmptyInput CompressParseKind = &#34;empty-input&#34;</code> | [noa/parseinput.go](evidence:api-noa-parseinput) |
| const | `ParseMalformedJSON` | <code>const ParseMalformedJSON CompressParseKind = &#34;malformed-json&#34;</code> | [noa/parseinput.go](evidence:api-noa-parseinput) |
| const | `ParseMissingContent` | <code>const ParseMissingContent CompressParseKind = &#34;missing-content&#34;</code> | [noa/parseinput.go](evidence:api-noa-parseinput) |
| const | `ParseNoValidRanges` | <code>const ParseNoValidRanges CompressParseKind = &#34;no-valid-ranges&#34;</code> | [noa/parseinput.go](evidence:api-noa-parseinput) |
| const | `ParseNotObject` | <code>const ParseNotObject CompressParseKind = &#34;not-object&#34;</code> | [noa/parseinput.go](evidence:api-noa-parseinput) |
| const | `ParseOK` | <code>const ParseOK CompressParseKind = &#34;ok&#34;</code> | [noa/parseinput.go](evidence:api-noa-parseinput) |
| const | `ParseTruncated` | <code>const ParseTruncated CompressParseKind = &#34;truncated&#34;</code> | [noa/parseinput.go](evidence:api-noa-parseinput) |
| const | `RefWidth` | <code>const RefWidth = 5</code> | [noa/const.go](evidence:api-noa-const) |
| const | `RoleAssistant` | <code>const RoleAssistant Role = &#34;assistant&#34;</code> | [noa/types.go](evidence:api-noa-types) |
| const | `RoleTool` | <code>const RoleTool Role = &#34;tool&#34;</code> | [noa/types.go](evidence:api-noa-types) |
| const | `RoleUser` | <code>const RoleUser Role = &#34;user&#34;</code> | [noa/types.go](evidence:api-noa-types) |
| const | `SummaryHeader` | <code>const SummaryHeader = &#34;[Compressed conversation section]&#34;</code> | [noa/const.go](evidence:api-noa-const) |
| const | `SummaryIDPrefix` | <code>const SummaryIDPrefix = &#34;noa_summary_&#34;</code> | [noa/const.go](evidence:api-noa-const) |
| const | `SummaryStubChars` | <code>const SummaryStubChars = 200</code> | [noa/const.go](evidence:api-noa-const) |
| const | `SystemPromptHeader` | <code>const SystemPromptHeader = &#34;noa context management&#34;</code> | [noa/prompts_system.go](evidence:api-noa-prompts-system) |
| const | `Tier2Rules` | <code>const Tier2Rules = &lt;expression omitted; 2978 source chars&gt;</code> | [noa/prompts_rules.go](evidence:api-noa-prompts-rules) |
| const | `Tier3Rules` | <code>const Tier3Rules = &lt;expression omitted; 2070 source chars&gt;</code> | [noa/prompts_rules.go](evidence:api-noa-prompts-rules) |
| const | `ToolPairMaxScan` | <code>const ToolPairMaxScan = 20</code> | [noa/const.go](evidence:api-noa-const) |
| const | `TruncationMarker` | <code>const TruncationMarker = &#34;[truncated for context space&#34;</code> | [noa/const.go](evidence:api-noa-const) |
| const | `ViableRangeMinTokens` | <code>const ViableRangeMinTokens = 200</code> | [noa/const.go](evidence:api-noa-const) |
| const | `VoiceEmergency` | <code>const VoiceEmergency NudgeVoice = &#34;emergency&#34;</code> | [noa/nudgetext.go](evidence:api-noa-nudgetext) |
| const | `VoiceGentle` | <code>const VoiceGentle NudgeVoice = &#34;gentle&#34;</code> | [noa/nudgetext.go](evidence:api-noa-nudgetext) |
| field | `ApplyInput.Archiver` | <code>Archiver Archiver</code> | [noa/compress.go](evidence:api-noa-compress) |
| field | `ApplyInput.CallID` | <code>CallID string</code> | [noa/compress.go](evidence:api-noa-compress) |
| field | `ApplyInput.Config` | <code>Config Config</code> | [noa/compress.go](evidence:api-noa-compress) |
| field | `ApplyInput.CountTokens` | <code>CountTokens TokenCountFn</code> | [noa/compress.go](evidence:api-noa-compress) |
| field | `ApplyInput.CreatedAt` | <code>CreatedAt string</code> | [noa/compress.go](evidence:api-noa-compress) |
| field | `ApplyInput.Messages` | <code>Messages []CoreMessage</code> | [noa/compress.go](evidence:api-noa-compress) |
| field | `ApplyInput.Now` | <code>Now int64</code> | [noa/compress.go](evidence:api-noa-compress) |
| field | `ApplyInput.Ranges` | <code>Ranges []CompressRange</code> | [noa/compress.go](evidence:api-noa-compress) |
| field | `ApplyInput.State` | <code>State CompressionState</code> | [noa/compress.go](evidence:api-noa-compress) |
| field | `ApplyResult.BlocksCreated` | <code>BlocksCreated []CompressionBlock</code> | [noa/compress.go](evidence:api-noa-compress) |
| field | `ApplyResult.Errors` | <code>Errors []string</code> | [noa/compress.go](evidence:api-noa-compress) |
| field | `ApplyResult.State` | <code>State CompressionState</code> | [noa/compress.go](evidence:api-noa-compress) |
| field | `ApplyResult.SurvivingBlockIDs` | <code>SurvivingBlockIDs []string</code> | [noa/compress.go](evidence:api-noa-compress) |
| field | `ApplyResult.TokensCompressed` | <code>TokensCompressed int</code> | [noa/compress.go](evidence:api-noa-compress) |
| field | `ApplyResult.Warnings` | <code>Warnings []string</code> | [noa/compress.go](evidence:api-noa-compress) |
| field | `ArchiveEntry.Block` | <code>Block *CompressionBlock</code> | [noa/archive.go](evidence:api-noa-archive) |
| field | `ArchiveEntry.Message` | <code>Message *CoreMessage</code> | [noa/archive.go](evidence:api-noa-archive) |
| field | `ArchiveEntry.Ref` | <code>Ref string</code> | [noa/archive.go](evidence:api-noa-archive) |
| field | `ArchiveRenderInput.BlockID` | <code>BlockID string</code> | [noa/archive.go](evidence:api-noa-archive) |
| field | `ArchiveRenderInput.CreatedAt` | <code>CreatedAt string</code> | [noa/archive.go](evidence:api-noa-archive) |
| field | `ArchiveRenderInput.EndRef` | <code>EndRef string</code> | [noa/archive.go](evidence:api-noa-archive) |
| field | `ArchiveRenderInput.Entries` | <code>Entries []ArchiveEntry</code> | [noa/archive.go](evidence:api-noa-archive) |
| field | `ArchiveRenderInput.OriginalTokens` | <code>OriginalTokens int</code> | [noa/archive.go](evidence:api-noa-archive) |
| field | `ArchiveRenderInput.SessionID` | <code>SessionID string</code> | [noa/archive.go](evidence:api-noa-archive) |
| field | `ArchiveRenderInput.StartRef` | <code>StartRef string</code> | [noa/archive.go](evidence:api-noa-archive) |
| field | `ArchiveRenderInput.Summary` | <code>Summary string</code> | [noa/archive.go](evidence:api-noa-archive) |
| field | `ArchiveRenderInput.Tier` | <code>Tier Tier</code> | [noa/archive.go](evidence:api-noa-archive) |
| field | `ArchiveRenderInput.Topic` | <code>Topic string</code> | [noa/archive.go](evidence:api-noa-archive) |
| field | `AssignRefsOptions.Existing` | <code>Existing MessageRefMap</code> | [noa/refs.go](evidence:api-noa-refs) |
| field | `AssignRefsOptions.IsProtected` | <code>IsProtected func(CoreMessage) bool</code> | [noa/refs.go](evidence:api-noa-refs) |
| field | `AssignRefsOptions.NextIndex` | <code>NextIndex int</code> | [noa/refs.go](evidence:api-noa-refs) |
| field | `AssignRefsOptions.ShouldSkip` | <code>ShouldSkip func(CoreMessage) bool</code> | [noa/refs.go](evidence:api-noa-refs) |
| field | `AssignRefsResult.Map` | <code>Map MessageRefMap</code> | [noa/refs.go](evidence:api-noa-refs) |
| field | `AssignRefsResult.NewlyAssigned` | <code>NewlyAssigned int</code> | [noa/refs.go](evidence:api-noa-refs) |
| field | `AssignRefsResult.NextIndex` | <code>NextIndex int</code> | [noa/refs.go](evidence:api-noa-refs) |
| field | `BlockSpan.BlockID` | <code>BlockID string</code> | [noa/nudge_types.go](evidence:api-noa-nudge-types) |
| field | `BlockSpan.EndRef` | <code>EndRef string</code> | [noa/nudge_types.go](evidence:api-noa-nudge-types) |
| field | `BlockSpan.StartRef` | <code>StartRef string</code> | [noa/nudge_types.go](evidence:api-noa-nudge-types) |
| field | `BlockSpan.Tier` | <code>Tier Tier</code> | [noa/nudge_types.go](evidence:api-noa-nudge-types) |
| field | `BoundaryNotFoundError.Kind` | <code>Kind BoundaryNotFoundKind</code> | [noa/boundaries.go](evidence:api-noa-boundaries) |
| field | `BoundaryNotFoundError.Msg` | <code>Msg string</code> | [noa/boundaries.go](evidence:api-noa-boundaries) |
| field | `BoundaryNotFoundError.Ref` | <code>Ref string</code> | [noa/boundaries.go](evidence:api-noa-boundaries) |
| field | `CompressConfig.MaxSummaryLength` | <code>MaxSummaryLength int</code> | [noa/config.go](evidence:api-noa-config) |
| field | `CompressConfig.MinCompressRange` | <code>MinCompressRange int</code> | [noa/config.go](evidence:api-noa-config) |
| field | `CompressConfig.MinSummaryLength` | <code>MinSummaryLength int</code> | [noa/config.go](evidence:api-noa-config) |
| field | `CompressParseDiagnostics.InvalidItems` | <code>InvalidItems int</code> | [noa/parseinput.go](evidence:api-noa-parseinput) |
| field | `CompressParseDiagnostics.InvalidReasons` | <code>InvalidReasons []string</code> | [noa/parseinput.go](evidence:api-noa-parseinput) |
| field | `CompressParseDiagnostics.Keys` | <code>Keys []string</code> | [noa/parseinput.go](evidence:api-noa-parseinput) |
| field | `CompressParseDiagnostics.Kind` | <code>Kind CompressParseKind</code> | [noa/parseinput.go](evidence:api-noa-parseinput) |
| field | `CompressParseDiagnostics.Length` | <code>Length int</code> | [noa/parseinput.go](evidence:api-noa-parseinput) |
| field | `CompressParseDiagnostics.Ok` | <code>Ok bool</code> | [noa/parseinput.go](evidence:api-noa-parseinput) |
| field | `CompressParseDiagnostics.RawPrefix` | <code>RawPrefix string</code> | [noa/parseinput.go](evidence:api-noa-parseinput) |
| field | `CompressParseDiagnostics.Salvaged` | <code>Salvaged bool</code> | [noa/parseinput.go](evidence:api-noa-parseinput) |
| field | `CompressParseDiagnostics.TailRepaired` | <code>TailRepaired bool</code> | [noa/parseinput.go](evidence:api-noa-parseinput) |
| field | `CompressParseResult.Diagnostics` | <code>Diagnostics CompressParseDiagnostics</code> | [noa/parseinput.go](evidence:api-noa-parseinput) |
| field | `CompressParseResult.Ranges` | <code>Ranges []CompressRange</code> | [noa/parseinput.go](evidence:api-noa-parseinput) |
| field | `CompressParseResult.SummaryMaxChars` | <code>SummaryMaxChars *int</code> | [noa/parseinput.go](evidence:api-noa-parseinput) |
| field | `CompressParseResult.TopLevelTopic` | <code>TopLevelTopic string</code> | [noa/parseinput.go](evidence:api-noa-parseinput) |
| field | `CompressRange.EndRef` | <code>EndRef string</code> | [noa/compress.go](evidence:api-noa-compress) |
| field | `CompressRange.StartRef` | <code>StartRef string</code> | [noa/compress.go](evidence:api-noa-compress) |
| field | `CompressRange.Summary` | <code>Summary string</code> | [noa/compress.go](evidence:api-noa-compress) |
| field | `CompressRange.SummaryMaxChars` | <code>SummaryMaxChars *int</code> | [noa/compress.go](evidence:api-noa-compress) |
| field | `CompressRange.Topic` | <code>Topic string</code> | [noa/compress.go](evidence:api-noa-compress) |
| field | `CompressionBlock.Active` | <code>Active bool</code> | [noa/types.go](evidence:api-noa-types) |
| field | `CompressionBlock.ArchivePath` | <code>ArchivePath string</code> | [noa/types.go](evidence:api-noa-types) |
| field | `CompressionBlock.ArchiveRel` | <code>ArchiveRel string</code> | [noa/types.go](evidence:api-noa-types) |
| field | `CompressionBlock.BlockID` | <code>BlockID string</code> | [noa/types.go](evidence:api-noa-types) |
| field | `CompressionBlock.CompressCallID` | <code>CompressCallID string</code> | [noa/types.go](evidence:api-noa-types) |
| field | `CompressionBlock.CompressedTokens` | <code>CompressedTokens int</code> | [noa/types.go](evidence:api-noa-types) |
| field | `CompressionBlock.CreatedAt` | <code>CreatedAt int64</code> | [noa/types.go](evidence:api-noa-types) |
| field | `CompressionBlock.DirectBlockIDs` | <code>DirectBlockIDs []string</code> | [noa/types.go](evidence:api-noa-types) |
| field | `CompressionBlock.DirectMessageIDs` | <code>DirectMessageIDs []string</code> | [noa/types.go](evidence:api-noa-types) |
| field | `CompressionBlock.EffectiveMessageIDs` | <code>EffectiveMessageIDs []string</code> | [noa/types.go](evidence:api-noa-types) |
| field | `CompressionBlock.EndRef` | <code>EndRef string</code> | [noa/types.go](evidence:api-noa-types) |
| field | `CompressionBlock.StartRef` | <code>StartRef string</code> | [noa/types.go](evidence:api-noa-types) |
| field | `CompressionBlock.Summary` | <code>Summary string</code> | [noa/types.go](evidence:api-noa-types) |
| field | `CompressionBlock.Tier` | <code>Tier Tier</code> | [noa/types.go](evidence:api-noa-types) |
| field | `CompressionBlock.Topic` | <code>Topic string</code> | [noa/types.go](evidence:api-noa-types) |
| field | `CompressionState.ArchiveRoot` | <code>ArchiveRoot string</code> | [noa/types.go](evidence:api-noa-types) |
| field | `CompressionState.Blocks` | <code>Blocks []CompressionBlock</code> | [noa/types.go](evidence:api-noa-types) |
| field | `CompressionState.MessageRefs` | <code>MessageRefs MessageRefMap</code> | [noa/types.go](evidence:api-noa-types) |
| field | `CompressionState.NextBlockID` | <code>NextBlockID int</code> | [noa/types.go](evidence:api-noa-types) |
| field | `CompressionState.Nudge` | <code>Nudge NudgeState</code> | [noa/types.go](evidence:api-noa-types) |
| field | `CompressionState.SessionID` | <code>SessionID string</code> | [noa/types.go](evidence:api-noa-types) |
| field | `CompressionState.Stats` | <code>Stats Stats</code> | [noa/types.go](evidence:api-noa-types) |
| field | `CompressionState.TokenSnapshot` | <code>TokenSnapshot map[string]int</code> | [noa/types.go](evidence:api-noa-types) |
| field | `Config.Compress` | <code>Compress CompressConfig</code> | [noa/config.go](evidence:api-noa-config) |
| field | `Config.IsToolProtected` | <code>IsToolProtected func(toolName string) bool</code> | [noa/config.go](evidence:api-noa-config) |
| field | `Config.MaxCompressAttempts` | <code>MaxCompressAttempts int</code> | [noa/config.go](evidence:api-noa-config) |
| field | `Config.ModelContextLimit` | <code>ModelContextLimit int</code> | [noa/config.go](evidence:api-noa-config) |
| field | `Config.Nudge` | <code>Nudge NudgeConfig</code> | [noa/config.go](evidence:api-noa-config) |
| field | `Config.PreserveRecentMessages` | <code>PreserveRecentMessages int</code> | [noa/config.go](evidence:api-noa-config) |
| field | `Config.PreserveRecentTokens` | <code>PreserveRecentTokens int</code> | [noa/config.go](evidence:api-noa-config) |
| field | `Config.ProtectedTools` | <code>ProtectedTools []string</code> | [noa/config.go](evidence:api-noa-config) |
| field | `Config.Tiers` | <code>Tiers TierConfig</code> | [noa/config.go](evidence:api-noa-config) |
| field | `Config.Truncate` | <code>Truncate TruncateConfig</code> | [noa/config.go](evidence:api-noa-config) |
| field | `CoreMessage.ContentType` | <code>ContentType ContentType</code> | [noa/types.go](evidence:api-noa-types) |
| field | `CoreMessage.ID` | <code>ID string</code> | [noa/types.go](evidence:api-noa-types) |
| field | `CoreMessage.Role` | <code>Role Role</code> | [noa/types.go](evidence:api-noa-types) |
| field | `CoreMessage.Text` | <code>Text string</code> | [noa/types.go](evidence:api-noa-types) |
| field | `CoreMessage.ToolCallID` | <code>ToolCallID string</code> | [noa/types.go](evidence:api-noa-types) |
| field | `CoreMessage.ToolName` | <code>ToolName string</code> | [noa/types.go](evidence:api-noa-types) |
| field | `DecideNudgeInput.Config` | <code>Config Config</code> | [noa/nudge.go](evidence:api-noa-nudge) |
| field | `DecideNudgeInput.CountTokens` | <code>CountTokens TokenCountFn</code> | [noa/nudge.go](evidence:api-noa-nudge) |
| field | `DecideNudgeInput.Messages` | <code>Messages []CoreMessage</code> | [noa/nudge.go](evidence:api-noa-nudge) |
| field | `DecideNudgeInput.Recommendation` | <code>Recommendation Recommendation</code> | [noa/nudge.go](evidence:api-noa-nudge) |
| field | `DecideNudgeInput.State` | <code>State CompressionState</code> | [noa/nudge.go](evidence:api-noa-nudge) |
| field | `DecideNudgeInput.TokenCount` | <code>TokenCount int</code> | [noa/nudge.go](evidence:api-noa-nudge) |
| field | `DecideNudgeInput.TruncatedCount` | <code>TruncatedCount int</code> | [noa/nudge.go](evidence:api-noa-nudge) |
| field | `MessageRefMap.ByRaw` | <code>ByRaw map[string]string</code> | [noa/types.go](evidence:api-noa-types) |
| field | `MessageRefMap.ByRef` | <code>ByRef map[string]string</code> | [noa/types.go](evidence:api-noa-types) |
| field | `NodeIO.Messages` | <code>Messages []CoreMessage</code> | [noa/pipeline.go](evidence:api-noa-pipeline) |
| field | `NodeIO.Nudge` | <code>Nudge *NudgeDecision</code> | [noa/pipeline.go](evidence:api-noa-pipeline) |
| field | `NodeIO.State` | <code>State CompressionState</code> | [noa/pipeline.go](evidence:api-noa-pipeline) |
| field | `NodeIO.TruncatedCount` | <code>TruncatedCount int</code> | [noa/pipeline.go](evidence:api-noa-pipeline) |
| field | `NudgeBreakdown.AdaptiveGrowth` | <code>AdaptiveGrowth int</code> | [noa/nudge_types.go](evidence:api-noa-nudge-types) |
| field | `NudgeBreakdown.CountT1` | <code>CountT1 int</code> | [noa/nudge_types.go](evidence:api-noa-nudge-types) |
| field | `NudgeBreakdown.CountT2` | <code>CountT2 int</code> | [noa/nudge_types.go](evidence:api-noa-nudge-types) |
| field | `NudgeBreakdown.Emergency` | <code>Emergency bool</code> | [noa/nudge_types.go](evidence:api-noa-nudge-types) |
| field | `NudgeBreakdown.Growth` | <code>Growth int</code> | [noa/nudge_types.go](evidence:api-noa-nudge-types) |
| field | `NudgeBreakdown.GrowthFloor` | <code>GrowthFloor int</code> | [noa/nudge_types.go](evidence:api-noa-nudge-types) |
| field | `NudgeBreakdown.GrowthReference` | <code>GrowthReference int</code> | [noa/nudge_types.go](evidence:api-noa-nudge-types) |
| field | `NudgeBreakdown.MinPressureBenefit` | <code>MinPressureBenefit int</code> | [noa/nudge_types.go](evidence:api-noa-nudge-types) |
| field | `NudgeBreakdown.OverLimit` | <code>OverLimit bool</code> | [noa/nudge_types.go](evidence:api-noa-nudge-types) |
| field | `NudgeBreakdown.PendingT1` | <code>PendingT1 int</code> | [noa/nudge_types.go](evidence:api-noa-nudge-types) |
| field | `NudgeBreakdown.PendingT2` | <code>PendingT2 int</code> | [noa/nudge_types.go](evidence:api-noa-nudge-types) |
| field | `NudgeBreakdown.PendingT3` | <code>PendingT3 int</code> | [noa/nudge_types.go](evidence:api-noa-nudge-types) |
| field | `NudgeBreakdown.Usage` | <code>Usage float64</code> | [noa/nudge_types.go](evidence:api-noa-nudge-types) |
| field | `NudgeConfig.EmergencyThresholdPct` | <code>EmergencyThresholdPct float64</code> | [noa/config.go](evidence:api-noa-config) |
| field | `NudgeConfig.GrowthCap` | <code>GrowthCap int</code> | [noa/config.go](evidence:api-noa-config) |
| field | `NudgeConfig.GrowthFloor` | <code>GrowthFloor int</code> | [noa/config.go](evidence:api-noa-config) |
| field | `NudgeConfig.GrowthRatio` | <code>GrowthRatio float64</code> | [noa/config.go](evidence:api-noa-config) |
| field | `NudgeConfig.MaxContextLimitPct` | <code>MaxContextLimitPct float64</code> | [noa/config.go](evidence:api-noa-config) |
| field | `NudgeConfig.MinContextLimitPct` | <code>MinContextLimitPct float64</code> | [noa/config.go](evidence:api-noa-config) |
| field | `NudgeConfig.MinGrowthFloor` | <code>MinGrowthFloor int</code> | [noa/config.go](evidence:api-noa-config) |
| field | `NudgeConfig.MinGrowthRatio` | <code>MinGrowthRatio float64</code> | [noa/config.go](evidence:api-noa-config) |
| field | `NudgeConfig.MinPressureBenefitTokens` | <code>MinPressureBenefitTokens *int</code> | [noa/config.go](evidence:api-noa-config) |
| field | `NudgeConfig.Tier2GrowthMultiplier` | <code>Tier2GrowthMultiplier float64</code> | [noa/config.go](evidence:api-noa-config) |
| field | `NudgeDecision.ActiveBlockSpans` | <code>ActiveBlockSpans []BlockSpan</code> | [noa/nudge_types.go](evidence:api-noa-nudge-types) |
| field | `NudgeDecision.Breakdown` | <code>Breakdown NudgeBreakdown</code> | [noa/nudge_types.go](evidence:api-noa-nudge-types) |
| field | `NudgeDecision.CompressibleRanges` | <code>CompressibleRanges []RangeInfo</code> | [noa/nudge_types.go](evidence:api-noa-nudge-types) |
| field | `NudgeDecision.ContextBreakdown` | <code>ContextBreakdown map[string]int</code> | [noa/nudge_types.go](evidence:api-noa-nudge-types) |
| field | `NudgeDecision.ContextUsage` | <code>ContextUsage float64</code> | [noa/nudge_types.go](evidence:api-noa-nudge-types) |
| field | `NudgeDecision.ProtectedRanges` | <code>ProtectedRanges []ProtectedRange</code> | [noa/nudge_types.go](evidence:api-noa-nudge-types) |
| field | `NudgeDecision.Reason` | <code>Reason string</code> | [noa/nudge_types.go](evidence:api-noa-nudge-types) |
| field | `NudgeDecision.ShouldInject` | <code>ShouldInject bool</code> | [noa/nudge_types.go](evidence:api-noa-nudge-types) |
| field | `NudgeDecision.Tier` | <code>Tier Tier</code> | [noa/nudge_types.go](evidence:api-noa-nudge-types) |
| field | `NudgeDecision.TierTargetBlocks` | <code>TierTargetBlocks []CompressionBlock</code> | [noa/nudge_types.go](evidence:api-noa-nudge-types) |
| field | `NudgeDecision.TruncatedCount` | <code>TruncatedCount int</code> | [noa/nudge_types.go](evidence:api-noa-nudge-types) |
| field | `NudgeSections.EfficiencyNote` | <code>EfficiencyNote SectionOverride</code> | [noa/nudgetext.go](evidence:api-noa-nudgetext) |
| field | `NudgeSections.EmergencyHeader` | <code>EmergencyHeader SectionOverride</code> | [noa/nudgetext.go](evidence:api-noa-nudgetext) |
| field | `NudgeSections.T2Guidance` | <code>T2Guidance SectionOverride</code> | [noa/nudgetext.go](evidence:api-noa-nudgetext) |
| field | `NudgeSections.T3Guidance` | <code>T3Guidance SectionOverride</code> | [noa/nudgetext.go](evidence:api-noa-nudgetext) |
| field | `NudgeState.LastNudgeShownTokens` | <code>LastNudgeShownTokens int</code> | [noa/types.go](evidence:api-noa-types) |
| field | `NudgeState.LastPerMessageNudgeTokens` | <code>LastPerMessageNudgeTokens int</code> | [noa/types.go](evidence:api-noa-types) |
| field | `NudgeState.LastShownByTier` | <code>LastShownByTier map[Tier]int</code> | [noa/types.go](evidence:api-noa-types) |
| field | `PanelInput.AfterTokens` | <code>AfterTokens int</code> | [noa/panel.go](evidence:api-noa-panel) |
| field | `PanelInput.BeforeTokens` | <code>BeforeTokens int</code> | [noa/panel.go](evidence:api-noa-panel) |
| field | `PanelInput.Messages` | <code>Messages []CoreMessage</code> | [noa/panel.go](evidence:api-noa-panel) |
| field | `PanelInput.Result` | <code>Result ApplyResult</code> | [noa/panel.go](evidence:api-noa-panel) |
| field | `PipelineContext.Config` | <code>Config Config</code> | [noa/pipeline.go](evidence:api-noa-pipeline) |
| field | `PipelineContext.CountTokens` | <code>CountTokens TokenCountFn</code> | [noa/pipeline.go](evidence:api-noa-pipeline) |
| field | `PipelineContext.TokenCount` | <code>TokenCount int</code> | [noa/pipeline.go](evidence:api-noa-pipeline) |
| field | `ProcessTurnInput.Config` | <code>Config Config</code> | [noa/processturn.go](evidence:api-noa-processturn) |
| field | `ProcessTurnInput.CountTokens` | <code>CountTokens TokenCountFn</code> | [noa/processturn.go](evidence:api-noa-processturn) |
| field | `ProcessTurnInput.Messages` | <code>Messages []CoreMessage</code> | [noa/processturn.go](evidence:api-noa-processturn) |
| field | `ProcessTurnInput.State` | <code>State CompressionState</code> | [noa/processturn.go](evidence:api-noa-processturn) |
| field | `ProcessTurnInput.TokenCount` | <code>TokenCount int</code> | [noa/processturn.go](evidence:api-noa-processturn) |
| field | `ProcessTurnResult.Messages` | <code>Messages []CoreMessage</code> | [noa/processturn.go](evidence:api-noa-processturn) |
| field | `ProcessTurnResult.Nudge` | <code>Nudge *NudgeDecision</code> | [noa/processturn.go](evidence:api-noa-processturn) |
| field | `ProcessTurnResult.State` | <code>State CompressionState</code> | [noa/processturn.go](evidence:api-noa-processturn) |
| field | `ProcessTurnResult.TruncatedCount` | <code>TruncatedCount int</code> | [noa/processturn.go](evidence:api-noa-processturn) |
| field | `ProtectedRange.Count` | <code>Count int</code> | [noa/nudge_types.go](evidence:api-noa-nudge-types) |
| field | `ProtectedRange.EndRef` | <code>EndRef string</code> | [noa/nudge_types.go](evidence:api-noa-nudge-types) |
| field | `ProtectedRange.StartRef` | <code>StartRef string</code> | [noa/nudge_types.go](evidence:api-noa-nudge-types) |
| field | `ProtectedRange.Tokens` | <code>Tokens int</code> | [noa/nudge_types.go](evidence:api-noa-nudge-types) |
| field | `ProtectedRange.Tools` | <code>Tools []string</code> | [noa/nudge_types.go](evidence:api-noa-nudge-types) |
| field | `RangeInfo.Chars` | <code>Chars int</code> | [noa/nudge_types.go](evidence:api-noa-nudge-types) |
| field | `RangeInfo.Count` | <code>Count int</code> | [noa/nudge_types.go](evidence:api-noa-nudge-types) |
| field | `RangeInfo.Dangerous` | <code>Dangerous bool</code> | [noa/nudge_types.go](evidence:api-noa-nudge-types) |
| field | `RangeInfo.EndRef` | <code>EndRef string</code> | [noa/nudge_types.go](evidence:api-noa-nudge-types) |
| field | `RangeInfo.StartRef` | <code>StartRef string</code> | [noa/nudge_types.go](evidence:api-noa-nudge-types) |
| field | `RangeInfo.TextPct` | <code>TextPct int</code> | [noa/nudge_types.go](evidence:api-noa-nudge-types) |
| field | `RangeInfo.Tokens` | <code>Tokens int</code> | [noa/nudge_types.go](evidence:api-noa-nudge-types) |
| field | `RangeInfo.ToolPct` | <code>ToolPct int</code> | [noa/nudge_types.go](evidence:api-noa-nudge-types) |
| field | `RangeInfo.UserMsgs` | <code>UserMsgs int</code> | [noa/nudge_types.go](evidence:api-noa-nudge-types) |
| field | `RebuildInput.ArchiveRoot` | <code>ArchiveRoot string</code> | [noa/rebuild.go](evidence:api-noa-rebuild) |
| field | `RebuildInput.Archiver` | <code>Archiver Archiver</code> | [noa/rebuild.go](evidence:api-noa-rebuild) |
| field | `RebuildInput.Config` | <code>Config Config</code> | [noa/rebuild.go](evidence:api-noa-rebuild) |
| field | `RebuildInput.CountTokens` | <code>CountTokens TokenCountFn</code> | [noa/rebuild.go](evidence:api-noa-rebuild) |
| field | `RebuildInput.CreatedAt` | <code>CreatedAt string</code> | [noa/rebuild.go](evidence:api-noa-rebuild) |
| field | `RebuildInput.Messages` | <code>Messages []CoreMessage</code> | [noa/rebuild.go](evidence:api-noa-rebuild) |
| field | `RebuildInput.Now` | <code>Now int64</code> | [noa/rebuild.go](evidence:api-noa-rebuild) |
| field | `RebuildInput.SessionID` | <code>SessionID string</code> | [noa/rebuild.go](evidence:api-noa-rebuild) |
| field | `RebuildResult.Replayed` | <code>Replayed int</code> | [noa/rebuild.go](evidence:api-noa-rebuild) |
| field | `RebuildResult.Skipped` | <code>Skipped int</code> | [noa/rebuild.go](evidence:api-noa-rebuild) |
| field | `RebuildResult.State` | <code>State CompressionState</code> | [noa/rebuild.go](evidence:api-noa-rebuild) |
| field | `RebuildResult.Warnings` | <code>Warnings []string</code> | [noa/rebuild.go](evidence:api-noa-rebuild) |
| field | `Recommendation.CompressibleRanges` | <code>CompressibleRanges []RangeInfo</code> | [noa/recommend.go](evidence:api-noa-recommend) |
| field | `Recommendation.NothingToCompress` | <code>NothingToCompress bool</code> | [noa/recommend.go](evidence:api-noa-recommend) |
| field | `Recommendation.ProtectedRanges` | <code>ProtectedRanges []ProtectedRange</code> | [noa/recommend.go](evidence:api-noa-recommend) |
| field | `ResolvedRange.EndIndex` | <code>EndIndex int</code> | [noa/boundaries.go](evidence:api-noa-boundaries) |
| field | `ResolvedRange.Kind` | <code>Kind BoundaryKind</code> | [noa/boundaries.go](evidence:api-noa-boundaries) |
| field | `ResolvedRange.MessageIDs` | <code>MessageIDs []string</code> | [noa/boundaries.go](evidence:api-noa-boundaries) |
| field | `ResolvedRange.NestedBlockIDs` | <code>NestedBlockIDs []string</code> | [noa/boundaries.go](evidence:api-noa-boundaries) |
| field | `ResolvedRange.StartIndex` | <code>StartIndex int</code> | [noa/boundaries.go](evidence:api-noa-boundaries) |
| field | `ResolvedRange.Warnings` | <code>Warnings []string</code> | [noa/boundaries.go](evidence:api-noa-boundaries) |
| field | `Sections.Archive` | <code>Archive SectionOverride</code> | [noa/prompts_system.go](evidence:api-noa-prompts-system) |
| field | `Sections.NoaTags` | <code>NoaTags SectionOverride</code> | [noa/prompts_system.go](evidence:api-noa-prompts-system) |
| field | `Sections.SummariesInContext` | <code>SummariesInContext SectionOverride</code> | [noa/prompts_system.go](evidence:api-noa-prompts-system) |
| field | `Stats.CompressionCount` | <code>CompressionCount int</code> | [noa/types.go](evidence:api-noa-types) |
| field | `Stats.TokensCompressed` | <code>TokensCompressed int</code> | [noa/types.go](evidence:api-noa-types) |
| field | `TierConfig.Enabled` | <code>Enabled bool</code> | [noa/config.go](evidence:api-noa-config) |
| field | `TierConfig.MaxTier` | <code>MaxTier Tier</code> | [noa/config.go](evidence:api-noa-config) |
| field | `TierConfig.Tier2Trigger` | <code>Tier2Trigger int</code> | [noa/config.go](evidence:api-noa-config) |
| field | `TierConfig.Tier3Trigger` | <code>Tier3Trigger int</code> | [noa/config.go](evidence:api-noa-config) |
| field | `TierDecision.ConsumedBlockIDs` | <code>ConsumedBlockIDs []string</code> | [noa/tier.go](evidence:api-noa-tier) |
| field | `TierDecision.OutputTier` | <code>OutputTier Tier</code> | [noa/tier.go](evidence:api-noa-tier) |
| field | `TierDecision.SurvivingBlockIDs` | <code>SurvivingBlockIDs []string</code> | [noa/tier.go](evidence:api-noa-tier) |
| field | `TierDecision.TargetTier` | <code>TargetTier Tier</code> | [noa/tier.go](evidence:api-noa-tier) |
| field | `TruncateConfig.Threshold` | <code>Threshold float64</code> | [noa/config.go](evidence:api-noa-config) |
| field | `TruncateResult.Messages` | <code>Messages []CoreMessage</code> | [noa/truncate.go](evidence:api-noa-truncate) |
| field | `TruncateResult.SavedTokens` | <code>SavedTokens int</code> | [noa/truncate.go](evidence:api-noa-truncate) |
| field | `TruncateResult.TruncatedCount` | <code>TruncatedCount int</code> | [noa/truncate.go](evidence:api-noa-truncate) |
| field | `TurnGroup.ActIdx` | <code>ActIdx []int</code> | [noa/turnintegrity.go](evidence:api-noa-turnintegrity) |
| field | `TurnGroup.ReasoningIdx` | <code>ReasoningIdx []int</code> | [noa/turnintegrity.go](evidence:api-noa-turnintegrity) |
| field | `TurnGroup.ResultIdx` | <code>ResultIdx []int</code> | [noa/turnintegrity.go](evidence:api-noa-turnintegrity) |
| func | `ActiveBlockSpans` | <code>func ActiveBlockSpans(state CompressionState) []BlockSpan</code> | [noa/recommend.go](evidence:api-noa-recommend) |
| func | `ActiveBlocks` | <code>func ActiveBlocks(s CompressionState) []CompressionBlock</code> | [noa/state.go](evidence:api-noa-state) |
| func | `AdjustBoundariesForReasoningPairs` | <code>func AdjustBoundariesForReasoningPairs(start, end int, msgs []CoreMessage) (int, int)</code> | [noa/toolpairs.go](evidence:api-noa-toolpairs) |
| func | `AdjustBoundariesForToolPairs` | <code>func AdjustBoundariesForToolPairs(start, end int, msgs []CoreMessage, maxScan int) (int, int)</code> | [noa/toolpairs.go](evidence:api-noa-toolpairs) |
| func | `AllocateBlockID` | <code>func AllocateBlockID(s *CompressionState) string</code> | [noa/state.go](evidence:api-noa-state) |
| func | `ApplyCompression` | <code>func ApplyCompression(in ApplyInput) ApplyResult</code> | [noa/compress.go](evidence:api-noa-compress) |
| func | `ApplyPairBoundaryAdjustments` | <code>func ApplyPairBoundaryAdjustments(start, end int, msgs []CoreMessage) (int, int)</code> | [noa/toolpairs.go](evidence:api-noa-toolpairs) |
| func | `ArchiveFileName` | <code>func ArchiveFileName(blockID, startRef, endRef string) string</code> | [noa/archive.go](evidence:api-noa-archive) |
| func | `ArchiveTag` | <code>func ArchiveTag(b CompressionBlock) string</code> | [noa/prune.go](evidence:api-noa-prune) |
| func | `ArchiveTierDir` | <code>func ArchiveTierDir(t Tier) string</code> | [noa/archive.go](evidence:api-noa-archive) |
| func | `AssignRefs` | <code>func AssignRefs(messages []CoreMessage, opts AssignRefsOptions) AssignRefsResult</code> | [noa/refs.go](evidence:api-noa-refs) |
| func | `BlockIDFromSummaryID` | <code>func BlockIDFromSummaryID(s string) (string, bool)</code> | [noa/state.go](evidence:api-noa-state) |
| func | `BuildCompressibleRanges` | <code>func BuildCompressibleRanges(msgs []CoreMessage, state CompressionState, cfg Config, protectedRefs map[string]bool, count TokenCountFn) ([]RangeInfo, []ProtectedRange)</code> | [noa/recommend.go](evidence:api-noa-recommend) |
| func | `BuildRecommendation` | <code>func BuildRecommendation(msgs []CoreMessage, state CompressionState, cfg Config, count TokenCountFn) Recommendation</code> | [noa/recommend.go](evidence:api-noa-recommend) |
| func | `BuildSystemPrompt` | <code>func BuildSystemPrompt(s Sections) string</code> | [noa/prompts_system.go](evidence:api-noa-prompts-system) |
| func | `CloneState` | <code>func CloneState(s CompressionState) CompressionState</code> | [noa/state.go](evidence:api-noa-state) |
| func | `CompressToolSchema` | <code>func CompressToolSchema() map[string]any</code> | [noa/schema.go](evidence:api-noa-schema) |
| func | `ComputeContextBreakdown` | <code>func ComputeContextBreakdown(msgs []CoreMessage, count TokenCountFn) map[string]int</code> | [noa/nudge.go](evidence:api-noa-nudge) |
| func | `ComputeProtectedRefs` | <code>func ComputeProtectedRefs(msgs []CoreMessage, state CompressionState, cfg Config) map[string]bool</code> | [noa/recommend.go](evidence:api-noa-recommend) |
| func | `ComputeTurnGroups` | <code>func ComputeTurnGroups(msgs []CoreMessage) []TurnGroup</code> | [noa/turnintegrity.go](evidence:api-noa-turnintegrity) |
| func | `CountMessageTokens` | <code>func CountMessageTokens(m CoreMessage, count TokenCountFn) int</code> | [noa/tokenize.go](evidence:api-noa-tokenize) |
| func | `CoveredMessageIDs` | <code>func CoveredMessageIDs(s CompressionState) map[string]bool</code> | [noa/state.go](evidence:api-noa-state) |
| func | `CreateInitialState` | <code>func CreateInitialState(sessionID, archiveRoot string) CompressionState</code> | [noa/types.go](evidence:api-noa-types) |
| func | `DecideNudge` | <code>func DecideNudge(in DecideNudgeInput) NudgeDecision</code> | [noa/nudge.go](evidence:api-noa-nudge) |
| func | `DecideTier` | <code>func DecideTier(r ResolvedRange, state CompressionState, cfg Config) TierDecision</code> | [noa/tier.go](evidence:api-noa-tier) |
| func | `DefaultConfig` | <code>func DefaultConfig(modelContextLimit int) Config</code> | [noa/config.go](evidence:api-noa-config) |
| func | `DefaultCountTokens` | <code>func DefaultCountTokens(text string) int</code> | [noa/tokenize.go](evidence:api-noa-tokenize) |
| func | `EstimateTokensFast` | <code>func EstimateTokensFast(text string) int</code> | [noa/tokenize.go](evidence:api-noa-tokenize) |
| func | `FindBlock` | <code>func FindBlock(s *CompressionState, blockID string) *CompressionBlock</code> | [noa/state.go](evidence:api-noa-state) |
| func | `FormatBlockMap` | <code>func FormatBlockMap(spans []BlockSpan) string</code> | [noa/nudgetext.go](evidence:api-noa-nudgetext) |
| func | `FormatBreakdown` | <code>func FormatBreakdown(d NudgeDecision) string</code> | [noa/nudgetext.go](evidence:api-noa-nudgetext) |
| func | `FormatPanel` | <code>func FormatPanel(in PanelInput) string</code> | [noa/panel.go](evidence:api-noa-panel) |
| func | `FormatRanges` | <code>func FormatRanges(compressible []RangeInfo, protected []ProtectedRange) string</code> | [noa/nudgetext.go](evidence:api-noa-nudgetext) |
| func | `FormatTierTargetBlocks` | <code>func FormatTierTargetBlocks(blocks []CompressionBlock) string</code> | [noa/nudgetext.go](evidence:api-noa-nudgetext) |
| func | `FormatTokens` | <code>func FormatTokens(n int) string</code> | [noa/panel.go](evidence:api-noa-panel) |
| func | `HighestUsedIndex` | <code>func HighestUsedIndex(m MessageRefMap) int</code> | [noa/refs.go](evidence:api-noa-refs) |
| func | `IndexToRef` | <code>func IndexToRef(index int) string</code> | [noa/refs.go](evidence:api-noa-refs) |
| func | `IsMessageProtected` | <code>func IsMessageProtected(m CoreMessage, cfg Config) bool</code> | [noa/protected.go](evidence:api-noa-protected) |
| func | `IsNeverPreserveRecentTool` | <code>func IsNeverPreserveRecentTool(m CoreMessage) bool</code> | [noa/protected.go](evidence:api-noa-protected) |
| func | `IsTerminalRewrite` | <code>func IsTerminalRewrite(d TierDecision, directCount int, cfg Config) bool</code> | [noa/tier.go](evidence:api-noa-tier) |
| func | `MatchToolPattern` | <code>func MatchToolPattern(pattern, toolName string) bool</code> | [noa/protected.go](evidence:api-noa-protected) |
| func | `MergeRangesToThreshold` | <code>func MergeRangesToThreshold(ranges []RangeInfo, minChars int) []RangeInfo</code> | [noa/recommend.go](evidence:api-noa-recommend) |
| func | `NudgeGrowthFloor` | <code>func NudgeGrowthFloor(cfg Config) int</code> | [noa/nudge.go](evidence:api-noa-nudge) |
| func | `PanelBlockCount` | <code>func PanelBlockCount(panel string) int</code> | [noa/panel.go](evidence:api-noa-panel) |
| func | `ParseBlockID` | <code>func ParseBlockID(s string) (string, bool)</code> | [noa/state.go](evidence:api-noa-state) |
| func | `ParseBoundary` | <code>func ParseBoundary(s string) (boundaryRef, bool)</code> | [noa/boundaries.go](evidence:api-noa-boundaries) |
| func | `ParseCompressArgs` | <code>func ParseCompressArgs(raw []byte) CompressParseResult</code> | [noa/parseinput.go](evidence:api-noa-parseinput) |
| func | `ProcessTurn` | <code>func ProcessTurn(in ProcessTurnInput) ProcessTurnResult</code> | [noa/processturn.go](evidence:api-noa-processturn) |
| func | `ProjectedTokenCount` | <code>func ProjectedTokenCount(msgs []CoreMessage, state CompressionState, cfg Config, count TokenCountFn) int</code> | [noa/processturn.go](evidence:api-noa-processturn) |
| func | `RawForRef` | <code>func RawForRef(m MessageRefMap, ref string) (string, bool)</code> | [noa/refs.go](evidence:api-noa-refs) |
| func | `RebuildStateFromLog` | <code>func RebuildStateFromLog(in RebuildInput) RebuildResult</code> | [noa/rebuild.go](evidence:api-noa-rebuild) |
| func | `RefForRaw` | <code>func RefForRaw(m MessageRefMap, rawID string) (string, bool)</code> | [noa/refs.go](evidence:api-noa-refs) |
| func | `RefToIndex` | <code>func RefToIndex(ref string) (int, bool)</code> | [noa/refs.go](evidence:api-noa-refs) |
| func | `RenderArchive` | <code>func RenderArchive(in ArchiveRenderInput) []byte</code> | [noa/archive.go](evidence:api-noa-archive) |
| func | `RenderNudgeText` | <code>func RenderNudgeText(d NudgeDecision, s NudgeSections) (NudgeVoice, string)</code> | [noa/nudgetext.go](evidence:api-noa-nudgetext) |
| func | `RenderSummaryMessage` | <code>func RenderSummaryMessage(b CompressionBlock) CoreMessage</code> | [noa/prune.go](evidence:api-noa-prune) |
| func | `ResolveBoundaries` | <code>func ResolveBoundaries(startRef, endRef string, messages []CoreMessage, state CompressionState) (ResolvedRange, *BoundaryNotFoundError)</code> | [noa/boundaries.go](evidence:api-noa-boundaries) |
| func | `RunPipeline` | <code>func RunPipeline(nodes []PipelineNode, io NodeIO, ctx PipelineContext) NodeIO</code> | [noa/pipeline.go](evidence:api-noa-pipeline) |
| func | `RunPruneOnly` | <code>func RunPruneOnly(msgs []CoreMessage, state CompressionState, cfg Config) ([]CoreMessage, CompressionState)</code> | [noa/rebuild.go](evidence:api-noa-rebuild) |
| func | `SummaryMessageID` | <code>func SummaryMessageID(blockID string) string</code> | [noa/state.go](evidence:api-noa-state) |
| func | `TruncateLargeToolOutputs` | <code>func TruncateLargeToolOutputs(msgs []CoreMessage, tokenCount int, cfg Config, count TokenCountFn) TruncateResult</code> | [noa/truncate.go](evidence:api-noa-truncate) |
| func | `ValidateConfig` | <code>func ValidateConfig(c Config) []string</code> | [noa/config.go](evidence:api-noa-config) |
| func | `ViableRanges` | <code>func ViableRanges(ranges []RangeInfo) []RangeInfo</code> | [noa/recommend.go](evidence:api-noa-recommend) |
| func | `WithdrawSplitTurns` | <code>func WithdrawSplitTurns(msgs []CoreMessage, folded map[string]bool) (map[string]bool, []string)</code> | [noa/turnintegrity.go](evidence:api-noa-turnintegrity) |
| interface method | `Archiver.Remove` | <code>Removefunc(abs string) error</code> | [noa/archive.go](evidence:api-noa-archive) |
| interface method | `Archiver.Write` | <code>Writefunc(tier Tier, blockID, startRef, endRef string, content []byte) (abs, rel string, err error)</code> | [noa/archive.go](evidence:api-noa-archive) |
| interface method | `PipelineNode.Enabled` | <code>Enabledfunc(io NodeIO, ctx PipelineContext) bool</code> | [noa/pipeline.go](evidence:api-noa-pipeline) |
| interface method | `PipelineNode.Name` | <code>Namefunc() string</code> | [noa/pipeline.go](evidence:api-noa-pipeline) |
| interface method | `PipelineNode.Run` | <code>Runfunc(io NodeIO, ctx PipelineContext) NodeIO</code> | [noa/pipeline.go](evidence:api-noa-pipeline) |
| method | `BoundaryNotFoundError.Error` | <code>func (*BoundaryNotFoundError) Error() string</code> | [noa/boundaries.go](evidence:api-noa-boundaries) |
| type | `ApplyInput` | <code>type ApplyInput struct</code> | [noa/compress.go](evidence:api-noa-compress) |
| type | `ApplyResult` | <code>type ApplyResult struct</code> | [noa/compress.go](evidence:api-noa-compress) |
| type | `ArchiveEntry` | <code>type ArchiveEntry struct</code> | [noa/archive.go](evidence:api-noa-archive) |
| type | `ArchiveRenderInput` | <code>type ArchiveRenderInput struct</code> | [noa/archive.go](evidence:api-noa-archive) |
| type | `Archiver` | <code>type Archiver interface</code> | [noa/archive.go](evidence:api-noa-archive) |
| type | `AssignRefsOptions` | <code>type AssignRefsOptions struct</code> | [noa/refs.go](evidence:api-noa-refs) |
| type | `AssignRefsResult` | <code>type AssignRefsResult struct</code> | [noa/refs.go](evidence:api-noa-refs) |
| type | `BlockSpan` | <code>type BlockSpan struct</code> | [noa/nudge_types.go](evidence:api-noa-nudge-types) |
| type | `BoundaryKind` | <code>type BoundaryKind string</code> | [noa/boundaries.go](evidence:api-noa-boundaries) |
| type | `BoundaryNotFoundError` | <code>type BoundaryNotFoundError struct</code> | [noa/boundaries.go](evidence:api-noa-boundaries) |
| type | `BoundaryNotFoundKind` | <code>type BoundaryNotFoundKind string</code> | [noa/boundaries.go](evidence:api-noa-boundaries) |
| type | `CompressConfig` | <code>type CompressConfig struct</code> | [noa/config.go](evidence:api-noa-config) |
| type | `CompressParseDiagnostics` | <code>type CompressParseDiagnostics struct</code> | [noa/parseinput.go](evidence:api-noa-parseinput) |
| type | `CompressParseKind` | <code>type CompressParseKind string</code> | [noa/parseinput.go](evidence:api-noa-parseinput) |
| type | `CompressParseResult` | <code>type CompressParseResult struct</code> | [noa/parseinput.go](evidence:api-noa-parseinput) |
| type | `CompressRange` | <code>type CompressRange struct</code> | [noa/compress.go](evidence:api-noa-compress) |
| type | `CompressionBlock` | <code>type CompressionBlock struct</code> | [noa/types.go](evidence:api-noa-types) |
| type | `CompressionState` | <code>type CompressionState struct</code> | [noa/types.go](evidence:api-noa-types) |
| type | `Config` | <code>type Config struct</code> | [noa/config.go](evidence:api-noa-config) |
| type | `ContentType` | <code>type ContentType string</code> | [noa/types.go](evidence:api-noa-types) |
| type | `CoreMessage` | <code>type CoreMessage struct</code> | [noa/types.go](evidence:api-noa-types) |
| type | `DecideNudgeInput` | <code>type DecideNudgeInput struct</code> | [noa/nudge.go](evidence:api-noa-nudge) |
| type | `MessageRefMap` | <code>type MessageRefMap struct</code> | [noa/types.go](evidence:api-noa-types) |
| type | `NodeIO` | <code>type NodeIO struct</code> | [noa/pipeline.go](evidence:api-noa-pipeline) |
| type | `NudgeBreakdown` | <code>type NudgeBreakdown struct</code> | [noa/nudge_types.go](evidence:api-noa-nudge-types) |
| type | `NudgeConfig` | <code>type NudgeConfig struct</code> | [noa/config.go](evidence:api-noa-config) |
| type | `NudgeDecision` | <code>type NudgeDecision struct</code> | [noa/nudge_types.go](evidence:api-noa-nudge-types) |
| type | `NudgeSections` | <code>type NudgeSections struct</code> | [noa/nudgetext.go](evidence:api-noa-nudgetext) |
| type | `NudgeState` | <code>type NudgeState struct</code> | [noa/types.go](evidence:api-noa-types) |
| type | `NudgeVoice` | <code>type NudgeVoice string</code> | [noa/nudgetext.go](evidence:api-noa-nudgetext) |
| type | `PanelInput` | <code>type PanelInput struct</code> | [noa/panel.go](evidence:api-noa-panel) |
| type | `PipelineContext` | <code>type PipelineContext struct</code> | [noa/pipeline.go](evidence:api-noa-pipeline) |
| type | `PipelineNode` | <code>type PipelineNode interface</code> | [noa/pipeline.go](evidence:api-noa-pipeline) |
| type | `ProcessTurnInput` | <code>type ProcessTurnInput struct</code> | [noa/processturn.go](evidence:api-noa-processturn) |
| type | `ProcessTurnResult` | <code>type ProcessTurnResult struct</code> | [noa/processturn.go](evidence:api-noa-processturn) |
| type | `ProtectedRange` | <code>type ProtectedRange struct</code> | [noa/nudge_types.go](evidence:api-noa-nudge-types) |
| type | `RangeInfo` | <code>type RangeInfo struct</code> | [noa/nudge_types.go](evidence:api-noa-nudge-types) |
| type | `RebuildInput` | <code>type RebuildInput struct</code> | [noa/rebuild.go](evidence:api-noa-rebuild) |
| type | `RebuildResult` | <code>type RebuildResult struct</code> | [noa/rebuild.go](evidence:api-noa-rebuild) |
| type | `Recommendation` | <code>type Recommendation struct</code> | [noa/recommend.go](evidence:api-noa-recommend) |
| type | `ResolvedRange` | <code>type ResolvedRange struct</code> | [noa/boundaries.go](evidence:api-noa-boundaries) |
| type | `Role` | <code>type Role string</code> | [noa/types.go](evidence:api-noa-types) |
| type | `SectionOverride` | <code>type SectionOverride = *string</code> | [noa/prompts_system.go](evidence:api-noa-prompts-system) |
| type | `Sections` | <code>type Sections struct</code> | [noa/prompts_system.go](evidence:api-noa-prompts-system) |
| type | `Stats` | <code>type Stats struct</code> | [noa/types.go](evidence:api-noa-types) |
| type | `Tier` | <code>type Tier int</code> | [noa/types.go](evidence:api-noa-types) |
| type | `TierConfig` | <code>type TierConfig struct</code> | [noa/config.go](evidence:api-noa-config) |
| type | `TierDecision` | <code>type TierDecision struct</code> | [noa/tier.go](evidence:api-noa-tier) |
| type | `TokenCountFn` | <code>type TokenCountFn func(string) int</code> | [noa/tokenize.go](evidence:api-noa-tokenize) |
| type | `TruncateConfig` | <code>type TruncateConfig struct</code> | [noa/config.go](evidence:api-noa-config) |
| type | `TruncateResult` | <code>type TruncateResult struct</code> | [noa/truncate.go](evidence:api-noa-truncate) |
| type | `TurnGroup` | <code>type TurnGroup struct</code> | [noa/turnintegrity.go](evidence:api-noa-turnintegrity) |
| var | `AlwaysProtectedTools` | <code>var AlwaysProtectedTools = []string{CompressToolName}</code> | [noa/const.go](evidence:api-noa-const) |
| var | `NeverPreserveRecentTools` | <code>var NeverPreserveRecentTools = []string{&#34;Read&#34;, &#34;Grep&#34;, &#34;Glob&#34;, &#34;Bash&#34;, &#34;LS&#34;}</code> | [noa/const.go](evidence:api-noa-const) |

<a id="pkg-noaadapter"></a>

## `noaadapter`

| 종류 | 식별자 | 선언/시그니처 | 근거 |
|---|---|---|---|
| field | `InheritOptions.ArchiveBaseDir` | <code>ArchiveBaseDir string</code> | [noaadapter/inherit.go](evidence:api-noaadapter-inherit) |
| field | `InheritOptions.ParentIDs` | <code>ParentIDs []string</code> | [noaadapter/inherit.go](evidence:api-noaadapter-inherit) |
| field | `InheritOptions.SessionID` | <code>SessionID string</code> | [noaadapter/inherit.go](evidence:api-noaadapter-inherit) |
| field | `Options.ArchiveBaseDir` | <code>ArchiveBaseDir string</code> | [noaadapter/session.go](evidence:api-noaadapter-session) |
| field | `Options.Config` | <code>Config *noa.Config</code> | [noaadapter/session.go](evidence:api-noaadapter-session) |
| field | `Options.ModelContextLimit` | <code>ModelContextLimit int</code> | [noaadapter/session.go](evidence:api-noaadapter-session) |
| field | `Options.Now` | <code>Now func() time.Time</code> | [noaadapter/session.go](evidence:api-noaadapter-session) |
| field | `Options.OnWarn` | <code>OnWarn func(string)</code> | [noaadapter/session.go](evidence:api-noaadapter-session) |
| field | `Options.ParentSessionIDs` | <code>ParentSessionIDs []string</code> | [noaadapter/session.go](evidence:api-noaadapter-session) |
| field | `Options.SessionID` | <code>SessionID string</code> | [noaadapter/session.go](evidence:api-noaadapter-session) |
| field | `ReassembleOptions.State` | <code>State *noa.CompressionState</code> | [noaadapter/project.go](evidence:api-noaadapter-project) |
| field | `ReassembleOptions.Tag` | <code>Tag bool</code> | [noaadapter/project.go](evidence:api-noaadapter-project) |
| field | `Sidecar.Origins` | <code>Origins map[string]origin</code> | [noaadapter/project.go](evidence:api-noaadapter-project) |
| field | `Sidecar.Signatures` | <code>Signatures map[string]string</code> | [noaadapter/project.go](evidence:api-noaadapter-project) |
| field | `Sidecar.ToolResultIsError` | <code>ToolResultIsError map[string]bool</code> | [noaadapter/project.go](evidence:api-noaadapter-project) |
| func | `AppendRefTag` | <code>func AppendRefTag(body, tag string) string</code> | [noaadapter/tags.go](evidence:api-noaadapter-tags) |
| func | `DeriveChildState` | <code>func DeriveChildState(parent noa.CompressionState, childSessionID, childArchiveRoot string) noa.CompressionState</code> | [noaadapter/inherit.go](evidence:api-noaadapter-inherit) |
| func | `DeriveMessageID` | <code>func DeriveMessageID(role noa.Role, ct noa.ContentType, text, toolCallID, toolName string) string</code> | [noaadapter/identity.go](evidence:api-noaadapter-identity) |
| func | `Enable` | <code>func Enable(opts *agentcore.Options, o Options) error</code> | [noaadapter/noa.go](evidence:api-noaadapter-noa) |
| func | `EnableWithSession` | <code>func EnableWithSession(opts *agentcore.Options, o Options) (*Session, error)</code> | [noaadapter/noa.go](evidence:api-noaadapter-noa) |
| func | `InheritState` | <code>func InheritState(o InheritOptions) (noa.CompressionState, string, bool)</code> | [noaadapter/inherit.go](evidence:api-noaadapter-inherit) |
| func | `Materialize` | <code>func Materialize(msgs []llm.Message, o Options) ([]llm.Message, error)</code> | [noaadapter/materialize.go](evidence:api-noaadapter-materialize) |
| func | `MessageRef` | <code>func MessageRef(m llm.Message) string</code> | [noaadapter/tags.go](evidence:api-noaadapter-tags) |
| func | `NewClusterCounter` | <code>func NewClusterCounter() *ClusterCounter</code> | [noaadapter/identity.go](evidence:api-noaadapter-identity) |
| func | `NewDeadRangeTracker` | <code>func NewDeadRangeTracker() *DeadRangeTracker</code> | [noaadapter/deadrange.go](evidence:api-noaadapter-deadrange) |
| func | `NewFileArchiver` | <code>func NewFileArchiver(root string) noa.Archiver</code> | [noaadapter/archive.go](evidence:api-noaadapter-archive) |
| func | `NewReuseArchiver` | <code>func NewReuseArchiver(root string) noa.Archiver</code> | [noaadapter/archive.go](evidence:api-noaadapter-archive) |
| func | `NewStateStore` | <code>func NewStateStore(root string) *StateStore</code> | [noaadapter/state_store.go](evidence:api-noaadapter-state-store) |
| func | `ParseOverflowWindow` | <code>func ParseOverflowWindow(msg string) int</code> | [noaadapter/overflow.go](evidence:api-noaadapter-overflow) |
| func | `Project` | <code>func Project(msgs []llm.Message) ([]noa.CoreMessage, *Sidecar)</code> | [noaadapter/project.go](evidence:api-noaadapter-project) |
| func | `Reassemble` | <code>func Reassemble(cores []noa.CoreMessage, originals []llm.Message, sc *Sidecar, opts ReassembleOptions) []llm.Message</code> | [noaadapter/project.go](evidence:api-noaadapter-project) |
| func | `RebuildFromHistory` | <code>func RebuildFromHistory(msgs []llm.Message, o Options) (*Session, error)</code> | [noaadapter/materialize.go](evidence:api-noaadapter-materialize) |
| func | `RefTag` | <code>func RefTag(ref string, m noa.CoreMessage, tokens int) string</code> | [noaadapter/tags.go](evidence:api-noaadapter-tags) |
| func | `StripRefTag` | <code>func StripRefTag(s string) string</code> | [noaadapter/tags.go](evidence:api-noaadapter-tags) |
| func | `SubagentArchiveRoot` | <code>func SubagentArchiveRoot(base, sessionID, agentID string) string</code> | [noaadapter/inherit.go](evidence:api-noaadapter-inherit) |
| method | `ClusterCounter.Next` | <code>func (*ClusterCounter) Next(base string) string</code> | [noaadapter/identity.go](evidence:api-noaadapter-identity) |
| method | `Compactor.IsOverflow` | <code>func (*Compactor) IsOverflow(err error) bool</code> | [noaadapter/compactor.go](evidence:api-noaadapter-compactor) |
| method | `Compactor.Pre` | <code>func (*Compactor) Pre(_ context.Context, msgs []llm.Message, lastInputTokens int) []llm.Message</code> | [noaadapter/compactor.go](evidence:api-noaadapter-compactor) |
| method | `Compactor.Reactive` | <code>func (*Compactor) Reactive(ctx context.Context, msgs []llm.Message) ([]llm.Message, bool)</code> | [noaadapter/compactor.go](evidence:api-noaadapter-compactor) |
| method | `Compactor.View` | <code>func (*Compactor) View(_ context.Context, msgs []llm.Message) []llm.Message</code> | [noaadapter/compactor.go](evidence:api-noaadapter-compactor) |
| method | `DeadRangeTracker.Check` | <code>func (*DeadRangeTracker) Check(ranges []noa.CompressRange, state noa.CompressionState) string</code> | [noaadapter/deadrange.go](evidence:api-noaadapter-deadrange) |
| method | `DeadRangeTracker.Record` | <code>func (*DeadRangeTracker) Record(ranges []noa.CompressRange)</code> | [noaadapter/deadrange.go](evidence:api-noaadapter-deadrange) |
| method | `DeadRangeTracker.Reset` | <code>func (*DeadRangeTracker) Reset()</code> | [noaadapter/deadrange.go](evidence:api-noaadapter-deadrange) |
| method | `Session.ArchiveRoot` | <code>func (*Session) ArchiveRoot() string</code> | [noaadapter/session.go](evidence:api-noaadapter-session) |
| method | `Session.Config` | <code>func (*Session) Config() noa.Config</code> | [noaadapter/session.go](evidence:api-noaadapter-session) |
| method | `Session.State` | <code>func (*Session) State() noa.CompressionState</code> | [noaadapter/session.go](evidence:api-noaadapter-session) |
| method | `Session.View` | <code>func (*Session) View(msgs []llm.Message) []llm.Message</code> | [noaadapter/session.go](evidence:api-noaadapter-session) |
| method | `StateStore.Exists` | <code>func (*StateStore) Exists() bool</code> | [noaadapter/state_store.go](evidence:api-noaadapter-state-store) |
| method | `StateStore.Load` | <code>func (*StateStore) Load(sessionID, archiveRoot string) (noa.CompressionState, error)</code> | [noaadapter/state_store.go](evidence:api-noaadapter-state-store) |
| method | `StateStore.Save` | <code>func (*StateStore) Save(st noa.CompressionState) error</code> | [noaadapter/state_store.go](evidence:api-noaadapter-state-store) |
| type | `ClusterCounter` | <code>type ClusterCounter struct</code> | [noaadapter/identity.go](evidence:api-noaadapter-identity) |
| type | `Compactor` | <code>type Compactor struct</code> | [noaadapter/compactor.go](evidence:api-noaadapter-compactor) |
| type | `DeadRangeTracker` | <code>type DeadRangeTracker struct</code> | [noaadapter/deadrange.go](evidence:api-noaadapter-deadrange) |
| type | `InheritOptions` | <code>type InheritOptions struct</code> | [noaadapter/inherit.go](evidence:api-noaadapter-inherit) |
| type | `Options` | <code>type Options struct</code> | [noaadapter/session.go](evidence:api-noaadapter-session) |
| type | `ReassembleOptions` | <code>type ReassembleOptions struct</code> | [noaadapter/project.go](evidence:api-noaadapter-project) |
| type | `Session` | <code>type Session struct</code> | [noaadapter/session.go](evidence:api-noaadapter-session) |
| type | `Sidecar` | <code>type Sidecar struct</code> | [noaadapter/project.go](evidence:api-noaadapter-project) |
| type | `StateStore` | <code>type StateStore struct</code> | [noaadapter/state_store.go](evidence:api-noaadapter-state-store) |
| var | `ErrNoArchiveDir` | <code>var ErrNoArchiveDir = &lt;expression omitted; 123 source chars&gt;</code> | [noaadapter/session.go](evidence:api-noaadapter-session) |

