@caupulican/pi-adaptative 0.93.5 → 0.93.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (77) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/dist/bundled-resources/skills/n-plus-2-architecture/SKILL.md +13 -0
  3. package/dist/core/agent-session.d.ts.map +1 -1
  4. package/dist/core/agent-session.js +5 -20
  5. package/dist/core/agent-session.js.map +1 -1
  6. package/dist/core/autonomy/envelope-enforcement.d.ts +3 -1
  7. package/dist/core/autonomy/envelope-enforcement.d.ts.map +1 -1
  8. package/dist/core/autonomy/envelope-enforcement.js +23 -12
  9. package/dist/core/autonomy/envelope-enforcement.js.map +1 -1
  10. package/dist/core/autonomy/gates.d.ts.map +1 -1
  11. package/dist/core/autonomy/gates.js +24 -26
  12. package/dist/core/autonomy/gates.js.map +1 -1
  13. package/dist/core/context-gc.d.ts.map +1 -1
  14. package/dist/core/context-gc.js +128 -3
  15. package/dist/core/context-gc.js.map +1 -1
  16. package/dist/core/session-shutdown.d.ts +9 -0
  17. package/dist/core/session-shutdown.d.ts.map +1 -0
  18. package/dist/core/session-shutdown.js +44 -0
  19. package/dist/core/session-shutdown.js.map +1 -0
  20. package/dist/core/settings-manager.js.map +1 -1
  21. package/dist/core/skill-vault.d.ts +6 -2
  22. package/dist/core/skill-vault.d.ts.map +1 -1
  23. package/dist/core/skill-vault.js +30 -12
  24. package/dist/core/skill-vault.js.map +1 -1
  25. package/dist/core/system-prompt.d.ts.map +1 -1
  26. package/dist/core/system-prompt.js +7 -18
  27. package/dist/core/system-prompt.js.map +1 -1
  28. package/dist/core/tools/bash.d.ts.map +1 -1
  29. package/dist/core/tools/bash.js +2 -3
  30. package/dist/core/tools/bash.js.map +1 -1
  31. package/dist/core/tools/edit.d.ts.map +1 -1
  32. package/dist/core/tools/edit.js +86 -33
  33. package/dist/core/tools/edit.js.map +1 -1
  34. package/dist/core/tools/file-mutation-intent.d.ts +16 -0
  35. package/dist/core/tools/file-mutation-intent.d.ts.map +1 -1
  36. package/dist/core/tools/file-mutation-intent.js +51 -2
  37. package/dist/core/tools/file-mutation-intent.js.map +1 -1
  38. package/dist/core/tools/persistent-process-coordinator.d.ts +8 -2
  39. package/dist/core/tools/persistent-process-coordinator.d.ts.map +1 -1
  40. package/dist/core/tools/persistent-process-coordinator.js +52 -4
  41. package/dist/core/tools/persistent-process-coordinator.js.map +1 -1
  42. package/dist/core/tools/shell-execution-session.d.ts +8 -1
  43. package/dist/core/tools/shell-execution-session.d.ts.map +1 -1
  44. package/dist/core/tools/shell-execution-session.js +54 -3
  45. package/dist/core/tools/shell-execution-session.js.map +1 -1
  46. package/dist/core/tools/shell-session.d.ts +2 -1
  47. package/dist/core/tools/shell-session.d.ts.map +1 -1
  48. package/dist/core/tools/shell-session.js +22 -2
  49. package/dist/core/tools/shell-session.js.map +1 -1
  50. package/dist/core/tools/skill.d.ts +1 -0
  51. package/dist/core/tools/skill.d.ts.map +1 -1
  52. package/dist/core/tools/skill.js +11 -6
  53. package/dist/core/tools/skill.js.map +1 -1
  54. package/dist/core/tools/windows-shell-engine.d.ts +1 -1
  55. package/dist/core/tools/windows-shell-engine.d.ts.map +1 -1
  56. package/dist/core/tools/windows-shell-engine.js +6 -2
  57. package/dist/core/tools/windows-shell-engine.js.map +1 -1
  58. package/dist/index.d.ts +1 -1
  59. package/dist/index.d.ts.map +1 -1
  60. package/dist/index.js +1 -1
  61. package/dist/index.js.map +1 -1
  62. package/dist/modes/interactive/components/settings-selector.js +2 -2
  63. package/dist/modes/interactive/components/settings-selector.js.map +1 -1
  64. package/dist/utils/shell.d.ts +3 -5
  65. package/dist/utils/shell.d.ts.map +1 -1
  66. package/dist/utils/shell.js +4 -7
  67. package/dist/utils/shell.js.map +1 -1
  68. package/docs/settings.md +7 -7
  69. package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
  70. package/examples/extensions/custom-provider-anthropic/package.json +1 -1
  71. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  72. package/examples/extensions/sandbox/package-lock.json +2 -2
  73. package/examples/extensions/sandbox/package.json +1 -1
  74. package/examples/extensions/with-deps/package-lock.json +2 -2
  75. package/examples/extensions/with-deps/package.json +1 -1
  76. package/npm-shrinkwrap.json +12 -12
  77. package/package.json +4 -4
@@ -1 +1 @@
1
- {"version":3,"file":"context-gc.js","sourceRoot":"","sources":["../../src/core/context-gc.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHash } from \"node:crypto\";\nimport { existsSync } from \"node:fs\";\nimport { isAbsolute, resolve } from \"node:path\";\nimport type { AgentMessage } from \"@caupulican/pi-agent-core\";\nimport { estimateTokens } from \"@caupulican/pi-agent-core/compaction/compaction\";\nimport type { ToolResultMessage } from \"@caupulican/pi-ai\";\nimport { normalizePath } from \"../utils/paths.ts\";\nimport { boundedTextPreview } from \"./text-preview.ts\";\nimport { withFileLockSync, writeFileAtomicSync } from \"./util/atomic-file.ts\";\n\nexport interface SemanticMemoryGcSettings {\n\tenabled?: boolean;\n\t/** Number of newest Automata/Mind injected pages to preserve verbatim. */\n\tpreserveRecentPages?: number;\n\t/** Minimum provider-visible text chars before a stale semantic memory page is packed. */\n\tminChars?: number;\n\t/** Markers that identify deterministic Automata/Mind context pages. */\n\tmarkers?: string[];\n}\n\nexport interface ContextGcSettings {\n\tenabled?: boolean;\n\t/** Number of most recent AgentMessage rows to preserve verbatim. */\n\tpreserveRecentMessages?: number;\n\t/** Minimum provider-visible text chars before a stale tool result is packed. */\n\tminToolResultChars?: number;\n\t/** Tool names eligible for stale result packing. */\n\ttools?: string[];\n\t/** Provider-context control for deterministic Automata/Mind semantic memory pages. */\n\tsemanticMemory?: SemanticMemoryGcSettings;\n}\n\nexport interface NormalizedContextGcSettings extends Omit<Required<ContextGcSettings>, \"semanticMemory\"> {\n\tsemanticMemory: Required<SemanticMemoryGcSettings>;\n}\n\n/**\n * Brain-curation hooks (both optional; absent hooks are byte-for-byte today's behavior).\n * `resolveDigest` is a pure lookup keyed by the record's content hash — it must return the digest\n * already fenced in the untrusted-content boundary (e.g. BrainCurator.getDigest), with the fence's\n * nonce fixed once at store time, since GC re-renders the stub from raw messages on every request\n * and renders the returned string VERBATIM. `onPacked` lets the caller enqueue digest work with the\n * exact original text at the moment it is packed.\n */\nexport interface ContextGcCurationHooks {\n\tresolveDigest?: (digestKey: string) => string | undefined;\n\tonPacked?: (record: ContextGcPackedRecord, originalText: string) => void;\n}\n\nexport interface ContextGcOptions extends NormalizedContextGcSettings {\n\tcwd: string;\n\tstorageDir?: string;\n\t/** Acquire the leased store only when an eligible payload is actually written. */\n\tacquireStorageDir?: () => string;\n\twritePayloads?: boolean;\n\tcuration?: ContextGcCurationHooks;\n}\n\nexport interface ContextGcPackedRecord {\n\ttoolName: string;\n\ttoolCallId: string;\n\tmessageIndex: number;\n\treason: \"superseded-read\" | \"stale-tool-result\" | \"stale-semantic-memory\";\n\toriginalChars: number;\n\toriginalTokens: number;\n\tpackedTokens: number;\n\tstoragePath?: string;\n\tpath?: string;\n\tcommand?: string;\n\tkey?: string;\n\t/** Brain-curator semantic digest of the packed content (model-generated; advisory only). Arrives\n\t * already fenced in the untrusted-content boundary (see ContextGcCurationHooks.resolveDigest) —\n\t * render verbatim, never re-wrap. */\n\tdigest?: string;\n}\n\nexport interface ContextGcReport {\n\tenabled: boolean;\n\tpackedCount: number;\n\toriginalTokens: number;\n\tpackedTokens: number;\n\tsavedTokens: number;\n\trecords: ContextGcPackedRecord[];\n}\n\nexport interface ContextGcResult {\n\tmessages: AgentMessage[];\n\treport: ContextGcReport;\n}\n\nconst DEFAULT_SEMANTIC_MEMORY_GC_SETTINGS: Required<SemanticMemoryGcSettings> = {\n\tenabled: true,\n\tpreserveRecentPages: 1,\n\tminChars: 900,\n\tmarkers: [\n\t\t// Generic memory-subsystem recall page marker (brand-free). Provider-specific markers are\n\t\t// merged in dynamically at runtime via MemoryManager.getContextMarkers().\n\t\t\"<memory_context\",\n\t\t// Pre-existing provider-specific markers (to be generalized to provider-declared markers).\n\t\t\"<automata_context\",\n\t\t\"<automata_response\",\n\t\t\"<automata_query\",\n\t\t\"<automata_fetch\",\n\t\t\"<memory_lifecycle_audit\",\n\t\t\"<memory_lifecycle_purge\",\n\t\t\"<automata_doctor\",\n\t\t\"<automata_optimizer\",\n\t\t\"<automata_mesh\",\n\t\t// Injected task_steps checklist page (tasks/task-state.ts formatTaskStepsContext), re-derived\n\t\t// fresh every turn from live TaskStepsState -- same GC treatment as a memory recall page (Bug\n\t\t// #7 lineage): pack stale turn-copies down to the most recent one instead of accumulating.\n\t\t\"<task_steps_context\",\n\t\t\"<pipeline_context\",\n\t],\n};\n\nexport const DEFAULT_CONTEXT_GC_SETTINGS: NormalizedContextGcSettings = {\n\tenabled: true,\n\tpreserveRecentMessages: 8,\n\tminToolResultChars: 1200,\n\ttools: [\n\t\t\"read\",\n\t\t\"bash\",\n\t\t\"python\",\n\t\t\"powershell\",\n\t\t\"rg\",\n\t\t\"grep\",\n\t\t\"find\",\n\t\t\"run_toolkit_script\",\n\t\t\"ls\",\n\t\t\"skill_open\",\n\t\t\"automata_graph_status\",\n\t\t\"automata_graph_search\",\n\t\t\"automata_graph_query\",\n\t\t\"automata_graph_neighbors\",\n\t\t\"automata_graph_path\",\n\t\t\"automata_graph_pointer_pack\",\n\t\t\"learning_query_memory\",\n\t\t\"subagent\",\n\t\t\"delegate\",\n\t\t\"task_steps\",\n\t\t\"pipeline\",\n\t\t\"task_background\",\n\t\t\"task_goal\",\n\t\t\"run_ledger\",\n\t\t\"context_headroom_retrieve\",\n\t\t\"headroom_retrieve\",\n\t],\n\tsemanticMemory: DEFAULT_SEMANTIC_MEMORY_GC_SETTINGS,\n};\n\ntype ToolCallMeta = {\n\tid: string;\n\tname: string;\n\targs: Record<string, unknown>;\n\tmessageIndex: number;\n};\n\nfunction normalizeSemanticMemoryGcSettings(settings?: SemanticMemoryGcSettings): Required<SemanticMemoryGcSettings> {\n\treturn {\n\t\tenabled: settings?.enabled ?? DEFAULT_SEMANTIC_MEMORY_GC_SETTINGS.enabled,\n\t\tpreserveRecentPages: Math.max(\n\t\t\t0,\n\t\t\tMath.floor(settings?.preserveRecentPages ?? DEFAULT_SEMANTIC_MEMORY_GC_SETTINGS.preserveRecentPages),\n\t\t),\n\t\tminChars: Math.max(0, Math.floor(settings?.minChars ?? DEFAULT_SEMANTIC_MEMORY_GC_SETTINGS.minChars)),\n\t\tmarkers:\n\t\t\tsettings?.markers && settings.markers.length > 0\n\t\t\t\t? settings.markers\n\t\t\t\t: DEFAULT_SEMANTIC_MEMORY_GC_SETTINGS.markers,\n\t};\n}\n\nfunction normalizeContextGcSettings(settings?: ContextGcSettings): NormalizedContextGcSettings {\n\treturn {\n\t\tenabled: settings?.enabled ?? DEFAULT_CONTEXT_GC_SETTINGS.enabled,\n\t\tpreserveRecentMessages: Math.max(\n\t\t\t0,\n\t\t\tMath.floor(settings?.preserveRecentMessages ?? DEFAULT_CONTEXT_GC_SETTINGS.preserveRecentMessages),\n\t\t),\n\t\tminToolResultChars: Math.max(\n\t\t\t0,\n\t\t\tMath.floor(settings?.minToolResultChars ?? DEFAULT_CONTEXT_GC_SETTINGS.minToolResultChars),\n\t\t),\n\t\ttools: settings?.tools && settings.tools.length > 0 ? settings.tools : DEFAULT_CONTEXT_GC_SETTINGS.tools,\n\t\tsemanticMemory: normalizeSemanticMemoryGcSettings(settings?.semanticMemory),\n\t};\n}\n\nexport function getContextGcSettings(settings?: ContextGcSettings): NormalizedContextGcSettings {\n\treturn normalizeContextGcSettings(settings);\n}\n\nfunction textContentParts(content: unknown): string[] | undefined {\n\tif (typeof content === \"string\") return [content];\n\tif (!Array.isArray(content)) return undefined;\n\tconst parts: string[] = [];\n\tfor (const part of content) {\n\t\tif (typeof part !== \"object\" || part === null) return undefined;\n\t\tconst typed = part as { type?: string; text?: string; mimeType?: string };\n\t\tif (typed.type === \"text\" && typeof typed.text === \"string\") parts.push(typed.text);\n\t\telse if (typed.type === \"image\") return undefined;\n\t\telse return undefined;\n\t}\n\treturn parts;\n}\n\nfunction joinTextParts(parts: readonly string[]): string {\n\tif (parts.length === 0) return \"\";\n\tif (parts.length === 1) return parts[0];\n\treturn parts.join(\"\\n\");\n}\n\nfunction contentText(content: unknown): string | undefined {\n\tif (typeof content === \"string\") return content;\n\tconst parts = textContentParts(content);\n\treturn parts ? joinTextParts(parts) : undefined;\n}\n\nfunction toolResultParts(message: ToolResultMessage): string[] {\n\tconst parts: string[] = [];\n\tfor (const part of message.content) {\n\t\tif (part.type === \"text\" && part.text) parts.push(part.text);\n\t\telse if (part.type === \"image\") parts.push(`[image ${part.mimeType}]`);\n\t}\n\treturn parts;\n}\n\nfunction toolResultText(message: ToolResultMessage): string {\n\treturn joinTextParts(toolResultParts(message));\n}\n\nfunction smallStringSlice(value: string, start?: number, end?: number): string {\n\tconst sliced = value.slice(start, end);\n\treturn sliced ? ` ${sliced}`.slice(1) : \"\";\n}\n\nfunction joinedPartsContainMarker(parts: string[], marker: string): boolean {\n\tif (marker.length === 0) return true;\n\tconst tailLength = marker.length - 1;\n\tlet tail = \"\";\n\tlet first = true;\n\tfor (const part of parts) {\n\t\tif (part.includes(marker)) return true;\n\t\tif (!first && `${tail}\\n${smallStringSlice(part, 0, tailLength)}`.includes(marker)) return true;\n\t\tif (tailLength === 0) tail = \"\";\n\t\telse if (part.length >= tailLength) tail = smallStringSlice(part, -tailLength);\n\t\telse tail = `${tail}${first ? \"\" : \"\\n\"}${part}`.slice(-tailLength);\n\t\tfirst = false;\n\t}\n\treturn false;\n}\n\nfunction joinedPartsContainAnyMarker(parts: string[], markers: readonly string[]): boolean {\n\treturn markers.some((marker) => joinedPartsContainMarker(parts, marker));\n}\n\n// Gates which custom-message types are eligible for the semantic-memory packer below. Despite the\n// name, this now also covers the injected task_steps checklist page (customType \"task_steps_context\",\n// see agent-session.ts) -- it is a deterministic, re-derivable-from-live-state context page exactly\n// like a memory recall page, so it gets the same GC treatment. A marker match alone\n// is not enough: semanticMessageHasMarker/agentMessageText only inspect a custom message's text at all\n// once it passes this gate, so a customType that doesn't match here never reaches the marker check.\nfunction isSemanticMemoryCustomMessage(message: AgentMessage): boolean {\n\tif (message.role !== \"custom\") return false;\n\tconst customType = String((message as { customType?: unknown }).customType ?? \"\").toLowerCase();\n\treturn (\n\t\tcustomType.includes(\"automata\") ||\n\t\tcustomType.includes(\"memory\") ||\n\t\tcustomType.includes(\"mind\") ||\n\t\tcustomType.includes(\"task_steps\")\n\t);\n}\n\nfunction agentMessageText(message: AgentMessage): string | undefined {\n\tif (message.role === \"toolResult\") return toolResultText(message);\n\tif (isSemanticMemoryCustomMessage(message)) return contentText((message as { content?: unknown }).content);\n\treturn undefined;\n}\n\nfunction semanticMessageHasMarker(message: AgentMessage, settings: Required<SemanticMemoryGcSettings>): boolean {\n\tif (message.role === \"toolResult\") return joinedPartsContainAnyMarker(toolResultParts(message), settings.markers);\n\tif (isSemanticMemoryCustomMessage(message)) {\n\t\tconst parts = textContentParts((message as { content?: unknown }).content);\n\t\treturn parts ? joinedPartsContainAnyMarker(parts, settings.markers) : false;\n\t}\n\treturn false;\n}\n\ninterface ContextGcPlan {\n\tcalls: Map<string, ToolCallMeta>;\n\tlatestReadByPath: Map<string, string>;\n\tsemanticIndexes: number[];\n}\n\nfunction normalizeToolPath(cwd: string, value: unknown): string | undefined {\n\tif (typeof value !== \"string\" || value.trim() === \"\") return undefined;\n\tconst path = value.trim();\n\treturn normalizePath(isAbsolute(path) ? path : resolve(cwd, path));\n}\n\nfunction collectContextGcPlan(\n\tmessages: AgentMessage[],\n\tcwd: string,\n\tsemanticSettings: Required<SemanticMemoryGcSettings>,\n): ContextGcPlan {\n\tconst calls = new Map<string, ToolCallMeta>();\n\tconst readResultCallIds: string[] = [];\n\tconst semanticIndexes: number[] = [];\n\n\tfor (let messageIndex = 0; messageIndex < messages.length; messageIndex++) {\n\t\tconst message = messages[messageIndex];\n\t\tif (message.role === \"assistant\") {\n\t\t\tfor (const part of message.content) {\n\t\t\t\tif (part.type !== \"toolCall\") continue;\n\t\t\t\tcalls.set(part.id, {\n\t\t\t\t\tid: part.id,\n\t\t\t\t\tname: part.name,\n\t\t\t\t\targs: part.arguments ?? {},\n\t\t\t\t\tmessageIndex,\n\t\t\t\t});\n\t\t\t}\n\t\t} else if (message.role === \"toolResult\" && message.toolName === \"read\") {\n\t\t\treadResultCallIds.push(message.toolCallId);\n\t\t}\n\n\t\tif (semanticSettings.enabled && semanticMessageHasMarker(message, semanticSettings)) {\n\t\t\tsemanticIndexes.push(messageIndex);\n\t\t}\n\t}\n\n\tconst latestReadByPath = new Map<string, string>();\n\tfor (const toolCallId of readResultCallIds) {\n\t\tconst call = calls.get(toolCallId);\n\t\tconst path = normalizeToolPath(cwd, call?.args.path);\n\t\tif (path) latestReadByPath.set(path, toolCallId);\n\t}\n\n\treturn { calls, latestReadByPath, semanticIndexes };\n}\n\nfunction storagePathFor(storageDir: string | undefined, key: string): string | undefined {\n\tif (!storageDir || !isAbsolute(storageDir)) return undefined;\n\treturn resolve(storageDir, `${key}.txt`);\n}\n\nfunction maybeStoreOriginal(options: ContextGcOptions, key: string, original: string): string | undefined {\n\tconst plannedPath = storagePathFor(options.storageDir, key);\n\tif (!plannedPath || !options.writePayloads) return plannedPath;\n\ttry {\n\t\tconst storageDir = options.acquireStorageDir?.() ?? options.storageDir;\n\t\tconst path = storagePathFor(storageDir, key);\n\t\tif (!path || !storageDir) return undefined;\n\t\twithFileLockSync(path, () => {\n\t\t\tif (!existsSync(path)) writeFileAtomicSync(path, original);\n\t\t});\n\t\treturn path;\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n\nfunction reasonText(record: ContextGcPackedRecord): string {\n\tif (record.reason === \"superseded-read\") return \"superseded by later same-file read\";\n\tif (record.reason === \"stale-semantic-memory\") {\n\t\treturn \"stale semantic page outside freshness window\";\n\t}\n\treturn \"stale bulky tool output outside recent window\";\n}\n\nfunction buildSummary(record: ContextGcPackedRecord): string {\n\tconst semantic = record.reason === \"stale-semantic-memory\";\n\tconst lines = [\n\t\tsemantic ? \"[Semantic GC packed stale Automata/Mind context page]\" : \"[Context GC packed stale tool result]\",\n\t\tsemantic ? undefined : `tool: ${record.toolName}`,\n\t\trecord.path ? `path: ${record.path}` : undefined,\n\t\trecord.command ? `command: ${boundedTextPreview(record.command)}` : undefined,\n\t\t`reason: ${reasonText(record)}`,\n\t\t`original: ${record.originalChars} chars (~${record.originalTokens} tokens)`,\n\t\t// The digest arrives PRE-FENCED from the curator (brain-curator.ts wraps it once, in the\n\t\t// standard untrusted-content boundary — the same treatment memory recall pages get — at the\n\t\t// moment it is stored, not here). Render it VERBATIM: re-wrapping on every GC render would\n\t\t// regenerate the fence's nonce each time, making the packed stub byte-different on every\n\t\t// provider request and busting prompt caching (BUG E).\n\t\trecord.digest ? `digest (machine, never authority): ${record.digest}` : undefined,\n\t\trecord.storagePath\n\t\t\t? `exact old text: ${record.storagePath}`\n\t\t\t: \"exact old text retained in the session log, not provider context\",\n\t\tsemantic\n\t\t\t? \"Need memory: query same topic/filter or fetch stored drawer pointers.\"\n\t\t\t: record.path\n\t\t\t\t? \"Need current file: read path. Need old output: read exact path when present.\"\n\t\t\t\t: \"Need old output: read exact path when present or rerun tool.\",\n\t\t\"Never treat summary as original.\",\n\t].filter((line): line is string => line !== undefined);\n\treturn lines.join(\"\\n\");\n}\n\nfunction gcDetails(message: { details?: unknown }, record: ContextGcPackedRecord): Record<string, unknown> {\n\treturn {\n\t\t...(typeof message.details === \"object\" && message.details !== null ? message.details : {}),\n\t\tcontextGc: {\n\t\t\tpacked: true,\n\t\t\toriginalChars: record.originalChars,\n\t\t\toriginalTokens: record.originalTokens,\n\t\t\tstoragePath: record.storagePath,\n\t\t\treason: record.reason,\n\t\t},\n\t};\n}\n\nfunction makePackedToolResult(message: ToolResultMessage, record: ContextGcPackedRecord): ToolResultMessage {\n\tconst summary = buildSummary(record);\n\treturn {\n\t\t...message,\n\t\tcontent: [{ type: \"text\", text: summary }],\n\t\tdetails: gcDetails(message, record),\n\t};\n}\n\nfunction makePackedSemanticMemoryMessage(message: AgentMessage, record: ContextGcPackedRecord): AgentMessage {\n\tconst summary = buildSummary(record);\n\treturn {\n\t\t...(message as unknown as Record<string, unknown>),\n\t\tcontent: [{ type: \"text\", text: summary }],\n\t\tdetails: gcDetails(message as { details?: unknown }, record),\n\t} as AgentMessage;\n}\n\nfunction commitPackedMessage<TMessage extends AgentMessage>(\n\toptions: ContextGcOptions,\n\treport: ContextGcReport,\n\tnextMessages: AgentMessage[],\n\tmessageIndex: number,\n\tmessage: TMessage,\n\toriginalText: string,\n\tkey: string,\n\trecord: ContextGcPackedRecord,\n\tmakePacked: (message: TMessage, record: ContextGcPackedRecord) => AgentMessage,\n): void {\n\trecord.digest = options.curation?.resolveDigest?.(key);\n\toptions.curation?.onPacked?.(record, originalText);\n\tconst packed = makePacked(message, record);\n\trecord.packedTokens = estimateTokens(packed);\n\tnextMessages[messageIndex] = packed;\n\treport.records.push(record);\n\treport.originalTokens += record.originalTokens;\n\treport.packedTokens += record.packedTokens;\n}\n\nexport function applyContextGc(\n\tmessages: AgentMessage[],\n\trawSettings: ContextGcSettings & {\n\t\tcwd?: string;\n\t\tstorageDir?: string;\n\t\tacquireStorageDir?: () => string;\n\t\twritePayloads?: boolean;\n\t\tcuration?: ContextGcCurationHooks;\n\t},\n): ContextGcResult {\n\tconst settings = normalizeContextGcSettings(rawSettings);\n\tconst baseReport: ContextGcReport = {\n\t\tenabled: settings.enabled,\n\t\tpackedCount: 0,\n\t\toriginalTokens: 0,\n\t\tpackedTokens: 0,\n\t\tsavedTokens: 0,\n\t\trecords: [],\n\t};\n\tif (!settings.enabled) return { messages, report: baseReport };\n\n\tconst options: ContextGcOptions = {\n\t\t...settings,\n\t\tcwd: rawSettings.cwd ?? process.cwd(),\n\t\tstorageDir: rawSettings.storageDir,\n\t\tacquireStorageDir: rawSettings.acquireStorageDir,\n\t\twritePayloads: rawSettings.writePayloads ?? true,\n\t\tcuration: rawSettings.curation,\n\t};\n\tconst eligibleTools = new Set(options.tools);\n\tconst plan = collectContextGcPlan(messages, options.cwd, options.semanticMemory);\n\tconst recentStart = Math.max(0, messages.length - options.preserveRecentMessages);\n\tconst semanticIndexSet = new Set(plan.semanticIndexes);\n\tconst preservedSemanticIndexes = new Set(\n\t\toptions.semanticMemory.preserveRecentPages > 0\n\t\t\t? plan.semanticIndexes.slice(-options.semanticMemory.preserveRecentPages)\n\t\t\t: [],\n\t);\n\tconst nextMessages = messages.slice();\n\tlet changed = false;\n\n\tfor (let index = 0; index < messages.length; index++) {\n\t\tconst message = messages[index];\n\t\tif (semanticIndexSet.has(index) && !preservedSemanticIndexes.has(index) && index < recentStart) {\n\t\t\tconst originalText = agentMessageText(message);\n\t\t\tif (originalText && originalText.length >= options.semanticMemory.minChars) {\n\t\t\t\tconst originalTokens = estimateTokens(message);\n\t\t\t\tconst key = createHash(\"sha256\")\n\t\t\t\t\t.update(\"semantic-memory\\0\")\n\t\t\t\t\t.update(String(index))\n\t\t\t\t\t.update(\"\\0\")\n\t\t\t\t\t.update(originalText)\n\t\t\t\t\t.digest(\"hex\")\n\t\t\t\t\t.slice(0, 24);\n\t\t\t\tconst storagePath = maybeStoreOriginal(options, key, originalText);\n\t\t\t\tconst record: ContextGcPackedRecord = {\n\t\t\t\t\ttoolName: \"automata-mind\",\n\t\t\t\t\ttoolCallId: `semantic-${index}`,\n\t\t\t\t\tmessageIndex: index,\n\t\t\t\t\treason: \"stale-semantic-memory\",\n\t\t\t\t\toriginalChars: originalText.length,\n\t\t\t\t\toriginalTokens,\n\t\t\t\t\tpackedTokens: 0,\n\t\t\t\t\tstoragePath,\n\t\t\t\t\tkey,\n\t\t\t\t};\n\t\t\t\tcommitPackedMessage(\n\t\t\t\t\toptions,\n\t\t\t\t\tbaseReport,\n\t\t\t\t\tnextMessages,\n\t\t\t\t\tindex,\n\t\t\t\t\tmessage,\n\t\t\t\t\toriginalText,\n\t\t\t\t\tkey,\n\t\t\t\t\trecord,\n\t\t\t\t\tmakePackedSemanticMemoryMessage,\n\t\t\t\t);\n\t\t\t\tchanged = true;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t}\n\n\t\tif (message.role !== \"toolResult\") continue;\n\t\tif (!eligibleTools.has(message.toolName)) continue;\n\t\tif (index >= recentStart) continue;\n\n\t\tconst originalText = toolResultText(message);\n\t\tif (originalText.length < options.minToolResultChars) continue;\n\n\t\tconst call = plan.calls.get(message.toolCallId);\n\t\tconst path = normalizeToolPath(options.cwd, call?.args.path);\n\t\tlet reason: ContextGcPackedRecord[\"reason\"] = \"stale-tool-result\";\n\t\tif (message.toolName === \"read\" && path) {\n\t\t\tif (plan.latestReadByPath.get(path) === message.toolCallId) continue;\n\t\t\treason = \"superseded-read\";\n\t\t}\n\n\t\tconst originalTokens = estimateTokens(message);\n\t\tconst key = createHash(\"sha256\")\n\t\t\t.update(message.toolName)\n\t\t\t.update(\"\\0\")\n\t\t\t.update(message.toolCallId)\n\t\t\t.update(\"\\0\")\n\t\t\t.update(originalText)\n\t\t\t.digest(\"hex\")\n\t\t\t.slice(0, 24);\n\t\tconst storagePath = maybeStoreOriginal(options, key, originalText);\n\t\tconst record: ContextGcPackedRecord = {\n\t\t\ttoolName: message.toolName,\n\t\t\ttoolCallId: message.toolCallId,\n\t\t\tmessageIndex: index,\n\t\t\treason,\n\t\t\toriginalChars: originalText.length,\n\t\t\toriginalTokens,\n\t\t\tpackedTokens: 0,\n\t\t\tstoragePath,\n\t\t\tpath,\n\t\t\tcommand: typeof call?.args.command === \"string\" ? call.args.command : undefined,\n\t\t\tkey,\n\t\t};\n\t\tcommitPackedMessage(\n\t\t\toptions,\n\t\t\tbaseReport,\n\t\t\tnextMessages,\n\t\t\tindex,\n\t\t\tmessage,\n\t\t\toriginalText,\n\t\t\tkey,\n\t\t\trecord,\n\t\t\tmakePackedToolResult,\n\t\t);\n\t\tchanged = true;\n\t}\n\n\tbaseReport.packedCount = baseReport.records.length;\n\tbaseReport.savedTokens = Math.max(0, baseReport.originalTokens - baseReport.packedTokens);\n\treturn { messages: changed ? nextMessages : messages, report: baseReport };\n}\n"]}
1
+ {"version":3,"file":"context-gc.js","sourceRoot":"","sources":["../../src/core/context-gc.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHash } from \"node:crypto\";\nimport { existsSync } from \"node:fs\";\nimport { isAbsolute, resolve } from \"node:path\";\nimport type { AgentMessage } from \"@caupulican/pi-agent-core\";\nimport { estimateTokens } from \"@caupulican/pi-agent-core/compaction/compaction\";\nimport type { ToolResultMessage } from \"@caupulican/pi-ai\";\nimport { normalizePath } from \"../utils/paths.ts\";\nimport { boundedTextPreview } from \"./text-preview.ts\";\nimport { withFileLockSync, writeFileAtomicSync } from \"./util/atomic-file.ts\";\n\nexport interface SemanticMemoryGcSettings {\n\tenabled?: boolean;\n\t/** Number of newest Automata/Mind injected pages to preserve verbatim. */\n\tpreserveRecentPages?: number;\n\t/** Minimum provider-visible text chars before a stale semantic memory page is packed. */\n\tminChars?: number;\n\t/** Markers that identify deterministic Automata/Mind context pages. */\n\tmarkers?: string[];\n}\n\nexport interface ContextGcSettings {\n\tenabled?: boolean;\n\t/** Number of most recent AgentMessage rows to preserve verbatim. */\n\tpreserveRecentMessages?: number;\n\t/** Minimum provider-visible text chars before a stale tool result is packed. */\n\tminToolResultChars?: number;\n\t/** Tool names eligible for stale result packing. */\n\ttools?: string[];\n\t/** Provider-context control for deterministic Automata/Mind semantic memory pages. */\n\tsemanticMemory?: SemanticMemoryGcSettings;\n}\n\nexport interface NormalizedContextGcSettings extends Omit<Required<ContextGcSettings>, \"semanticMemory\"> {\n\tsemanticMemory: Required<SemanticMemoryGcSettings>;\n}\n\n/**\n * Brain-curation hooks (both optional; absent hooks are byte-for-byte today's behavior).\n * `resolveDigest` is a pure lookup keyed by the record's content hash — it must return the digest\n * already fenced in the untrusted-content boundary (e.g. BrainCurator.getDigest), with the fence's\n * nonce fixed once at store time, since GC re-renders the stub from raw messages on every request\n * and renders the returned string VERBATIM. `onPacked` lets the caller enqueue digest work with the\n * exact original text at the moment it is packed.\n */\nexport interface ContextGcCurationHooks {\n\tresolveDigest?: (digestKey: string) => string | undefined;\n\tonPacked?: (record: ContextGcPackedRecord, originalText: string) => void;\n}\n\nexport interface ContextGcOptions extends NormalizedContextGcSettings {\n\tcwd: string;\n\tstorageDir?: string;\n\t/** Acquire the leased store only when an eligible payload is actually written. */\n\tacquireStorageDir?: () => string;\n\twritePayloads?: boolean;\n\tcuration?: ContextGcCurationHooks;\n}\n\nexport interface ContextGcPackedRecord {\n\ttoolName: string;\n\ttoolCallId: string;\n\tmessageIndex: number;\n\treason: \"superseded-read\" | \"stale-tool-result\" | \"stale-semantic-memory\";\n\toriginalChars: number;\n\toriginalTokens: number;\n\tpackedTokens: number;\n\tstoragePath?: string;\n\tpath?: string;\n\tcommand?: string;\n\tkey?: string;\n\t/** Brain-curator semantic digest of the packed content (model-generated; advisory only). Arrives\n\t * already fenced in the untrusted-content boundary (see ContextGcCurationHooks.resolveDigest) —\n\t * render verbatim, never re-wrap. */\n\tdigest?: string;\n}\n\nexport interface ContextGcReport {\n\tenabled: boolean;\n\tpackedCount: number;\n\toriginalTokens: number;\n\tpackedTokens: number;\n\tsavedTokens: number;\n\trecords: ContextGcPackedRecord[];\n}\n\nexport interface ContextGcResult {\n\tmessages: AgentMessage[];\n\treport: ContextGcReport;\n}\n\nconst DEFAULT_SEMANTIC_MEMORY_GC_SETTINGS: Required<SemanticMemoryGcSettings> = {\n\tenabled: true,\n\tpreserveRecentPages: 1,\n\tminChars: 900,\n\tmarkers: [\n\t\t// Generic memory-subsystem recall page marker (brand-free). Provider-specific markers are\n\t\t// merged in dynamically at runtime via MemoryManager.getContextMarkers().\n\t\t\"<memory_context\",\n\t\t// Pre-existing provider-specific markers (to be generalized to provider-declared markers).\n\t\t\"<automata_context\",\n\t\t\"<automata_response\",\n\t\t\"<automata_query\",\n\t\t\"<automata_fetch\",\n\t\t\"<memory_lifecycle_audit\",\n\t\t\"<memory_lifecycle_purge\",\n\t\t\"<automata_doctor\",\n\t\t\"<automata_optimizer\",\n\t\t\"<automata_mesh\",\n\t\t// Injected task_steps checklist page (tasks/task-state.ts formatTaskStepsContext), re-derived\n\t\t// fresh every turn from live TaskStepsState -- same GC treatment as a memory recall page (Bug\n\t\t// #7 lineage): pack stale turn-copies down to the most recent one instead of accumulating.\n\t\t\"<task_steps_context\",\n\t\t\"<pipeline_context\",\n\t],\n};\n\nexport const DEFAULT_CONTEXT_GC_SETTINGS: NormalizedContextGcSettings = {\n\tenabled: true,\n\tpreserveRecentMessages: 24,\n\tminToolResultChars: 1200,\n\ttools: [\n\t\t\"read\",\n\t\t\"bash\",\n\t\t\"python\",\n\t\t\"powershell\",\n\t\t\"rg\",\n\t\t\"grep\",\n\t\t\"find\",\n\t\t\"run_toolkit_script\",\n\t\t\"ls\",\n\t\t\"skill_open\",\n\t\t\"automata_graph_status\",\n\t\t\"automata_graph_search\",\n\t\t\"automata_graph_query\",\n\t\t\"automata_graph_neighbors\",\n\t\t\"automata_graph_path\",\n\t\t\"automata_graph_pointer_pack\",\n\t\t\"learning_query_memory\",\n\t\t\"subagent\",\n\t\t\"delegate\",\n\t\t\"task_steps\",\n\t\t\"pipeline\",\n\t\t\"task_background\",\n\t\t\"task_goal\",\n\t\t\"run_ledger\",\n\t\t\"context_headroom_retrieve\",\n\t\t\"headroom_retrieve\",\n\t],\n\tsemanticMemory: DEFAULT_SEMANTIC_MEMORY_GC_SETTINGS,\n};\n\ntype ToolCallMeta = {\n\tid: string;\n\tname: string;\n\targs: Record<string, unknown>;\n\tmessageIndex: number;\n};\n\nfunction normalizeSemanticMemoryGcSettings(settings?: SemanticMemoryGcSettings): Required<SemanticMemoryGcSettings> {\n\treturn {\n\t\tenabled: settings?.enabled ?? DEFAULT_SEMANTIC_MEMORY_GC_SETTINGS.enabled,\n\t\tpreserveRecentPages: Math.max(\n\t\t\t0,\n\t\t\tMath.floor(settings?.preserveRecentPages ?? DEFAULT_SEMANTIC_MEMORY_GC_SETTINGS.preserveRecentPages),\n\t\t),\n\t\tminChars: Math.max(0, Math.floor(settings?.minChars ?? DEFAULT_SEMANTIC_MEMORY_GC_SETTINGS.minChars)),\n\t\tmarkers:\n\t\t\tsettings?.markers && settings.markers.length > 0\n\t\t\t\t? settings.markers\n\t\t\t\t: DEFAULT_SEMANTIC_MEMORY_GC_SETTINGS.markers,\n\t};\n}\n\nfunction normalizeContextGcSettings(settings?: ContextGcSettings): NormalizedContextGcSettings {\n\treturn {\n\t\tenabled: settings?.enabled ?? DEFAULT_CONTEXT_GC_SETTINGS.enabled,\n\t\tpreserveRecentMessages: Math.max(\n\t\t\t0,\n\t\t\tMath.floor(settings?.preserveRecentMessages ?? DEFAULT_CONTEXT_GC_SETTINGS.preserveRecentMessages),\n\t\t),\n\t\tminToolResultChars: Math.max(\n\t\t\t0,\n\t\t\tMath.floor(settings?.minToolResultChars ?? DEFAULT_CONTEXT_GC_SETTINGS.minToolResultChars),\n\t\t),\n\t\ttools: settings?.tools && settings.tools.length > 0 ? settings.tools : DEFAULT_CONTEXT_GC_SETTINGS.tools,\n\t\tsemanticMemory: normalizeSemanticMemoryGcSettings(settings?.semanticMemory),\n\t};\n}\n\nexport function getContextGcSettings(settings?: ContextGcSettings): NormalizedContextGcSettings {\n\treturn normalizeContextGcSettings(settings);\n}\n\nfunction textContentParts(content: unknown): string[] | undefined {\n\tif (typeof content === \"string\") return [content];\n\tif (!Array.isArray(content)) return undefined;\n\tconst parts: string[] = [];\n\tfor (const part of content) {\n\t\tif (typeof part !== \"object\" || part === null) return undefined;\n\t\tconst typed = part as { type?: string; text?: string; mimeType?: string };\n\t\tif (typed.type === \"text\" && typeof typed.text === \"string\") parts.push(typed.text);\n\t\telse if (typed.type === \"image\") return undefined;\n\t\telse return undefined;\n\t}\n\treturn parts;\n}\n\nfunction joinTextParts(parts: readonly string[]): string {\n\tif (parts.length === 0) return \"\";\n\tif (parts.length === 1) return parts[0];\n\treturn parts.join(\"\\n\");\n}\n\nfunction contentText(content: unknown): string | undefined {\n\tif (typeof content === \"string\") return content;\n\tconst parts = textContentParts(content);\n\treturn parts ? joinTextParts(parts) : undefined;\n}\n\nfunction toolResultParts(message: ToolResultMessage): string[] {\n\tconst parts: string[] = [];\n\tfor (const part of message.content) {\n\t\tif (part.type === \"text\" && part.text) parts.push(part.text);\n\t\telse if (part.type === \"image\") parts.push(`[image ${part.mimeType}]`);\n\t}\n\treturn parts;\n}\n\nfunction toolResultText(message: ToolResultMessage): string {\n\treturn joinTextParts(toolResultParts(message));\n}\n\nfunction smallStringSlice(value: string, start?: number, end?: number): string {\n\tconst sliced = value.slice(start, end);\n\treturn sliced ? ` ${sliced}`.slice(1) : \"\";\n}\n\nfunction joinedPartsContainMarker(parts: string[], marker: string): boolean {\n\tif (marker.length === 0) return true;\n\tconst tailLength = marker.length - 1;\n\tlet tail = \"\";\n\tlet first = true;\n\tfor (const part of parts) {\n\t\tif (part.includes(marker)) return true;\n\t\tif (!first && `${tail}\\n${smallStringSlice(part, 0, tailLength)}`.includes(marker)) return true;\n\t\tif (tailLength === 0) tail = \"\";\n\t\telse if (part.length >= tailLength) tail = smallStringSlice(part, -tailLength);\n\t\telse tail = `${tail}${first ? \"\" : \"\\n\"}${part}`.slice(-tailLength);\n\t\tfirst = false;\n\t}\n\treturn false;\n}\n\nfunction joinedPartsContainAnyMarker(parts: string[], markers: readonly string[]): boolean {\n\treturn markers.some((marker) => joinedPartsContainMarker(parts, marker));\n}\n\n// Gates which custom-message types are eligible for the semantic-memory packer below. Despite the\n// name, this now also covers the injected task_steps checklist page (customType \"task_steps_context\",\n// see agent-session.ts) -- it is a deterministic, re-derivable-from-live-state context page exactly\n// like a memory recall page, so it gets the same GC treatment. A marker match alone\n// is not enough: semanticMessageHasMarker/agentMessageText only inspect a custom message's text at all\n// once it passes this gate, so a customType that doesn't match here never reaches the marker check.\nfunction isSemanticMemoryCustomMessage(message: AgentMessage): boolean {\n\tif (message.role !== \"custom\") return false;\n\tconst customType = String((message as { customType?: unknown }).customType ?? \"\").toLowerCase();\n\treturn (\n\t\tcustomType.includes(\"automata\") ||\n\t\tcustomType.includes(\"memory\") ||\n\t\tcustomType.includes(\"mind\") ||\n\t\tcustomType.includes(\"task_steps\")\n\t);\n}\n\nfunction agentMessageText(message: AgentMessage): string | undefined {\n\tif (message.role === \"toolResult\") return toolResultText(message);\n\tif (isSemanticMemoryCustomMessage(message)) return contentText((message as { content?: unknown }).content);\n\treturn undefined;\n}\n\nfunction semanticMessageHasMarker(message: AgentMessage, settings: Required<SemanticMemoryGcSettings>): boolean {\n\tif (message.role === \"toolResult\") return joinedPartsContainAnyMarker(toolResultParts(message), settings.markers);\n\tif (isSemanticMemoryCustomMessage(message)) {\n\t\tconst parts = textContentParts((message as { content?: unknown }).content);\n\t\treturn parts ? joinedPartsContainAnyMarker(parts, settings.markers) : false;\n\t}\n\treturn false;\n}\n\ninterface ContextGcPlan {\n\tcalls: Map<string, ToolCallMeta>;\n\tlatestReadByPath: Map<string, string>;\n\tsemanticIndexes: number[];\n}\n\nfunction normalizeToolPath(cwd: string, value: unknown): string | undefined {\n\tif (typeof value !== \"string\" || value.trim() === \"\") return undefined;\n\tconst path = value.trim();\n\treturn normalizePath(isAbsolute(path) ? path : resolve(cwd, path));\n}\n\nfunction collectContextGcPlan(\n\tmessages: AgentMessage[],\n\tcwd: string,\n\tsemanticSettings: Required<SemanticMemoryGcSettings>,\n): ContextGcPlan {\n\tconst calls = new Map<string, ToolCallMeta>();\n\tconst readResultCallIds: string[] = [];\n\tconst semanticIndexes: number[] = [];\n\n\tfor (let messageIndex = 0; messageIndex < messages.length; messageIndex++) {\n\t\tconst message = messages[messageIndex];\n\t\tif (message.role === \"assistant\") {\n\t\t\tfor (const part of message.content) {\n\t\t\t\tif (part.type !== \"toolCall\") continue;\n\t\t\t\tcalls.set(part.id, {\n\t\t\t\t\tid: part.id,\n\t\t\t\t\tname: part.name,\n\t\t\t\t\targs: part.arguments ?? {},\n\t\t\t\t\tmessageIndex,\n\t\t\t\t});\n\t\t\t}\n\t\t} else if (message.role === \"toolResult\" && message.toolName === \"read\") {\n\t\t\treadResultCallIds.push(message.toolCallId);\n\t\t}\n\n\t\tif (semanticSettings.enabled && semanticMessageHasMarker(message, semanticSettings)) {\n\t\t\tsemanticIndexes.push(messageIndex);\n\t\t}\n\t}\n\n\tconst latestReadByPath = new Map<string, string>();\n\tfor (const toolCallId of readResultCallIds) {\n\t\tconst call = calls.get(toolCallId);\n\t\tconst path = normalizeToolPath(cwd, call?.args.path);\n\t\tif (path) latestReadByPath.set(path, toolCallId);\n\t}\n\n\treturn { calls, latestReadByPath, semanticIndexes };\n}\n\nconst REFERENCE_PROTECTION_ASSISTANT_MESSAGES = 8;\nconst REFERENCE_FRAGMENT_MAX_COUNT = 8;\nconst REFERENCE_FRAGMENT_MAX_CHARS = 200;\nconst REFERENCE_COMMAND_MAX_SEGMENTS = 4;\n\nfunction assistantMessageText(message: AgentMessage): string {\n\tif (message.role !== \"assistant\") return \"\";\n\tconst parts: string[] = [];\n\tfor (const part of message.content) {\n\t\tif (part.type === \"text\" && part.text) parts.push(part.text);\n\t\telse if (part.type === \"thinking\" && part.thinking) parts.push(part.thinking);\n\t}\n\treturn joinTextParts(parts);\n}\n\nfunction collectRecentAssistantText(messages: AgentMessage[]): string {\n\tconst collected: string[] = [];\n\tfor (let index = messages.length - 1; index >= 0; index--) {\n\t\tif (collected.length >= REFERENCE_PROTECTION_ASSISTANT_MESSAGES) break;\n\t\tconst message = messages[index];\n\t\tif (message.role !== \"assistant\") continue;\n\t\tcollected.push(assistantMessageText(message));\n\t}\n\treturn joinTextParts(collected);\n}\n\nfunction lastPathSegment(value: string): string {\n\treturn value.slice(Math.max(value.lastIndexOf(\"/\"), value.lastIndexOf(\"\\\\\")) + 1);\n}\n\nfunction stripTokenWrappers(token: string): string {\n\treturn token.replace(/^[\"'`(]+/, \"\").replace(/[\"'`),;:]+$/, \"\");\n}\n\nfunction pushReferenceFragment(fragments: string[], fragment: string): void {\n\tif (fragments.length >= REFERENCE_FRAGMENT_MAX_COUNT) return;\n\tif (fragment.length === 0 || fragment.length > REFERENCE_FRAGMENT_MAX_CHARS) return;\n\tif (!fragments.includes(fragment)) fragments.push(fragment);\n}\n\nfunction isDistinctiveCommandWord(word: string): boolean {\n\tif (word.startsWith(\"-\")) return false;\n\tif (word.length >= 5) return true;\n\treturn word.length >= 4 && (word.includes(\"/\") || word.includes(\"\\\\\") || word.includes(\".\"));\n}\n\nfunction collectCommandReferenceFragments(fragments: string[], command: string): void {\n\tfor (const segment of command.split(/&&|\\|\\||[;|\\n]/).slice(0, REFERENCE_COMMAND_MAX_SEGMENTS)) {\n\t\tconst words = segment\n\t\t\t.split(/\\s+/)\n\t\t\t.map(stripTokenWrappers)\n\t\t\t.filter((word) => word.length > 0 && !word.startsWith(\"-\"));\n\t\tif (words.length >= 2 && `${words[0]} ${words[1]}`.length >= 6) {\n\t\t\tpushReferenceFragment(fragments, `${words[0]} ${words[1]}`);\n\t\t}\n\t}\n\tfor (const token of command.split(/\\s+/)) {\n\t\tif (fragments.length >= REFERENCE_FRAGMENT_MAX_COUNT) break;\n\t\tconst word = stripTokenWrappers(token);\n\t\tif (isDistinctiveCommandWord(word)) pushReferenceFragment(fragments, word);\n\t\tconst base = lastPathSegment(word);\n\t\tif (base !== word && !base.startsWith(\"-\") && base.length >= 4) pushReferenceFragment(fragments, base);\n\t}\n}\n\n/**\n * Review finding (ledger #144 follow-up): `args.path`/`args.command` are not the only citable\n * evidence carriers -- python results carry `scriptPath` (path-shaped) or inline `code`, and\n * run_process results carry `executable` + `args` argv (joined with spaces). Widen ONLY the\n * reference check's inputs through the existing path/command-fragment rules and bounds; the\n * packed record's own `path`/`command` fields stay exactly what the tool args named.\n */\nfunction referenceEvidenceInputs(\n\tcwd: string,\n\tcall: ToolCallMeta | undefined,\n\tpath: string | undefined,\n\tcommand: string | undefined,\n): { path: string | undefined; command: string | undefined } {\n\tconst scriptPath = normalizeToolPath(cwd, call?.args.scriptPath ?? call?.args.script_path);\n\tconst code = typeof call?.args.code === \"string\" ? call.args.code : undefined;\n\tconst executable = typeof call?.args.executable === \"string\" ? call.args.executable : undefined;\n\tconst argv =\n\t\texecutable !== undefined && Array.isArray(call?.args.args)\n\t\t\t? [executable, ...call.args.args.filter((entry): entry is string => typeof entry === \"string\")].join(\" \")\n\t\t\t: undefined;\n\tconst commandText = [command, code, argv]\n\t\t.filter((entry): entry is string => entry !== undefined && entry.length > 0)\n\t\t.join(\"\\n\");\n\treturn { path: path ?? scriptPath, command: commandText.length > 0 ? commandText : undefined };\n}\n\nfunction referenceFragmentsFor(path: string | undefined, command: string | undefined): string[] {\n\tconst fragments: string[] = [];\n\tif (path) {\n\t\tconst base = lastPathSegment(path);\n\t\tconst fileLike = base.includes(\".\") && base.length >= 3;\n\t\tpushReferenceFragment(fragments, fileLike || base.length >= 5 ? base : path);\n\t}\n\tif (command) collectCommandReferenceFragments(fragments, command);\n\treturn fragments;\n}\n\n/**\n * Reference protection (ledger #144): a stale tool result the model is still citing is not\n * packable — packing mid-investigation evidence forces re-derivation of already-paid-for work\n * (field trace: 64 gc stores / 10.1 MB persisted, zero retrievals). \"Still citing\" is a bounded\n * pure check: the result's `path` (its file-like final segment) or a distinctive fragment of its\n * shell `command` (leading non-flag bigram per segment, non-flag words of >= 5 chars or\n * path-shaped words of >= 4, plus their final segments) appears in the text/thinking of the last\n * REFERENCE_PROTECTION_ASSISTANT_MESSAGES assistant messages. Fragment count and length are\n * capped, so the check stays O(recent assistant text) per candidate. The `superseded-read`\n * reason is exempt at the call site: a newer read of the same file supersedes regardless of\n * references.\n */\nfunction isReferencedByRecentAssistantText(recentAssistantText: string, path?: string, command?: string): boolean {\n\tif (recentAssistantText.length === 0) return false;\n\treturn referenceFragmentsFor(path, command).some((fragment) => recentAssistantText.includes(fragment));\n}\n\nfunction storagePathFor(storageDir: string | undefined, key: string): string | undefined {\n\tif (!storageDir || !isAbsolute(storageDir)) return undefined;\n\treturn resolve(storageDir, `${key}.txt`);\n}\n\nfunction maybeStoreOriginal(options: ContextGcOptions, key: string, original: string): string | undefined {\n\tconst plannedPath = storagePathFor(options.storageDir, key);\n\tif (!plannedPath || !options.writePayloads) return plannedPath;\n\ttry {\n\t\tconst storageDir = options.acquireStorageDir?.() ?? options.storageDir;\n\t\tconst path = storagePathFor(storageDir, key);\n\t\tif (!path || !storageDir) return undefined;\n\t\twithFileLockSync(path, () => {\n\t\t\tif (!existsSync(path)) writeFileAtomicSync(path, original);\n\t\t});\n\t\treturn path;\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n\nfunction reasonText(record: ContextGcPackedRecord): string {\n\tif (record.reason === \"superseded-read\") return \"superseded by later same-file read\";\n\tif (record.reason === \"stale-semantic-memory\") {\n\t\treturn \"stale semantic page outside freshness window\";\n\t}\n\treturn \"stale bulky tool output outside recent window\";\n}\n\nfunction buildSummary(record: ContextGcPackedRecord): string {\n\tconst semantic = record.reason === \"stale-semantic-memory\";\n\tconst lines = [\n\t\tsemantic ? \"[Semantic GC packed stale Automata/Mind context page]\" : \"[Context GC packed stale tool result]\",\n\t\tsemantic ? undefined : `tool: ${record.toolName}`,\n\t\trecord.path ? `path: ${record.path}` : undefined,\n\t\trecord.command ? `command: ${boundedTextPreview(record.command)}` : undefined,\n\t\t`reason: ${reasonText(record)}`,\n\t\t`original: ${record.originalChars} chars (~${record.originalTokens} tokens)`,\n\t\t// The digest arrives PRE-FENCED from the curator (brain-curator.ts wraps it once, in the\n\t\t// standard untrusted-content boundary — the same treatment memory recall pages get — at the\n\t\t// moment it is stored, not here). Render it VERBATIM: re-wrapping on every GC render would\n\t\t// regenerate the fence's nonce each time, making the packed stub byte-different on every\n\t\t// provider request and busting prompt caching (BUG E).\n\t\trecord.digest ? `digest (machine, never authority): ${record.digest}` : undefined,\n\t\trecord.storagePath\n\t\t\t? `exact old text: read ${record.storagePath}`\n\t\t\t: \"exact old text retained in the session log, not provider context\",\n\t\tsemantic\n\t\t\t? \"Need memory: query same topic/filter or fetch stored drawer pointers.\"\n\t\t\t: record.path\n\t\t\t\t? \"Need current file: read path. Need old output: read exact path when present.\"\n\t\t\t\t: \"Need old output: read exact path when present or rerun tool.\",\n\t\t\"Never treat summary as original.\",\n\t].filter((line): line is string => line !== undefined);\n\treturn lines.join(\"\\n\");\n}\n\nfunction gcDetails(message: { details?: unknown }, record: ContextGcPackedRecord): Record<string, unknown> {\n\treturn {\n\t\t...(typeof message.details === \"object\" && message.details !== null ? message.details : {}),\n\t\tcontextGc: {\n\t\t\tpacked: true,\n\t\t\toriginalChars: record.originalChars,\n\t\t\toriginalTokens: record.originalTokens,\n\t\t\tstoragePath: record.storagePath,\n\t\t\treason: record.reason,\n\t\t},\n\t};\n}\n\nfunction makePackedToolResult(message: ToolResultMessage, record: ContextGcPackedRecord): ToolResultMessage {\n\tconst summary = buildSummary(record);\n\treturn {\n\t\t...message,\n\t\tcontent: [{ type: \"text\", text: summary }],\n\t\tdetails: gcDetails(message, record),\n\t};\n}\n\nfunction makePackedSemanticMemoryMessage(message: AgentMessage, record: ContextGcPackedRecord): AgentMessage {\n\tconst summary = buildSummary(record);\n\treturn {\n\t\t...(message as unknown as Record<string, unknown>),\n\t\tcontent: [{ type: \"text\", text: summary }],\n\t\tdetails: gcDetails(message as { details?: unknown }, record),\n\t} as AgentMessage;\n}\n\nfunction commitPackedMessage<TMessage extends AgentMessage>(\n\toptions: ContextGcOptions,\n\treport: ContextGcReport,\n\tnextMessages: AgentMessage[],\n\tmessageIndex: number,\n\tmessage: TMessage,\n\toriginalText: string,\n\tkey: string,\n\trecord: ContextGcPackedRecord,\n\tmakePacked: (message: TMessage, record: ContextGcPackedRecord) => AgentMessage,\n): void {\n\trecord.digest = options.curation?.resolveDigest?.(key);\n\toptions.curation?.onPacked?.(record, originalText);\n\tconst packed = makePacked(message, record);\n\trecord.packedTokens = estimateTokens(packed);\n\tnextMessages[messageIndex] = packed;\n\treport.records.push(record);\n\treport.originalTokens += record.originalTokens;\n\treport.packedTokens += record.packedTokens;\n}\n\nexport function applyContextGc(\n\tmessages: AgentMessage[],\n\trawSettings: ContextGcSettings & {\n\t\tcwd?: string;\n\t\tstorageDir?: string;\n\t\tacquireStorageDir?: () => string;\n\t\twritePayloads?: boolean;\n\t\tcuration?: ContextGcCurationHooks;\n\t},\n): ContextGcResult {\n\tconst settings = normalizeContextGcSettings(rawSettings);\n\tconst baseReport: ContextGcReport = {\n\t\tenabled: settings.enabled,\n\t\tpackedCount: 0,\n\t\toriginalTokens: 0,\n\t\tpackedTokens: 0,\n\t\tsavedTokens: 0,\n\t\trecords: [],\n\t};\n\tif (!settings.enabled) return { messages, report: baseReport };\n\n\tconst options: ContextGcOptions = {\n\t\t...settings,\n\t\tcwd: rawSettings.cwd ?? process.cwd(),\n\t\tstorageDir: rawSettings.storageDir,\n\t\tacquireStorageDir: rawSettings.acquireStorageDir,\n\t\twritePayloads: rawSettings.writePayloads ?? true,\n\t\tcuration: rawSettings.curation,\n\t};\n\tconst eligibleTools = new Set(options.tools);\n\tconst plan = collectContextGcPlan(messages, options.cwd, options.semanticMemory);\n\tconst recentStart = Math.max(0, messages.length - options.preserveRecentMessages);\n\tconst semanticIndexSet = new Set(plan.semanticIndexes);\n\tconst preservedSemanticIndexes = new Set(\n\t\toptions.semanticMemory.preserveRecentPages > 0\n\t\t\t? plan.semanticIndexes.slice(-options.semanticMemory.preserveRecentPages)\n\t\t\t: [],\n\t);\n\tconst nextMessages = messages.slice();\n\tlet changed = false;\n\tlet recentAssistantText: string | undefined;\n\n\tfor (let index = 0; index < messages.length; index++) {\n\t\tconst message = messages[index];\n\t\tif (semanticIndexSet.has(index) && !preservedSemanticIndexes.has(index) && index < recentStart) {\n\t\t\tconst originalText = agentMessageText(message);\n\t\t\tif (originalText && originalText.length >= options.semanticMemory.minChars) {\n\t\t\t\tconst originalTokens = estimateTokens(message);\n\t\t\t\tconst key = createHash(\"sha256\")\n\t\t\t\t\t.update(\"semantic-memory\\0\")\n\t\t\t\t\t.update(String(index))\n\t\t\t\t\t.update(\"\\0\")\n\t\t\t\t\t.update(originalText)\n\t\t\t\t\t.digest(\"hex\")\n\t\t\t\t\t.slice(0, 24);\n\t\t\t\tconst storagePath = maybeStoreOriginal(options, key, originalText);\n\t\t\t\tconst record: ContextGcPackedRecord = {\n\t\t\t\t\ttoolName: \"automata-mind\",\n\t\t\t\t\ttoolCallId: `semantic-${index}`,\n\t\t\t\t\tmessageIndex: index,\n\t\t\t\t\treason: \"stale-semantic-memory\",\n\t\t\t\t\toriginalChars: originalText.length,\n\t\t\t\t\toriginalTokens,\n\t\t\t\t\tpackedTokens: 0,\n\t\t\t\t\tstoragePath,\n\t\t\t\t\tkey,\n\t\t\t\t};\n\t\t\t\tcommitPackedMessage(\n\t\t\t\t\toptions,\n\t\t\t\t\tbaseReport,\n\t\t\t\t\tnextMessages,\n\t\t\t\t\tindex,\n\t\t\t\t\tmessage,\n\t\t\t\t\toriginalText,\n\t\t\t\t\tkey,\n\t\t\t\t\trecord,\n\t\t\t\t\tmakePackedSemanticMemoryMessage,\n\t\t\t\t);\n\t\t\t\tchanged = true;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t}\n\n\t\tif (message.role !== \"toolResult\") continue;\n\t\tif (!eligibleTools.has(message.toolName)) continue;\n\t\tif (index >= recentStart) continue;\n\n\t\tconst originalText = toolResultText(message);\n\t\tif (originalText.length < options.minToolResultChars) continue;\n\n\t\tconst call = plan.calls.get(message.toolCallId);\n\t\tconst path = normalizeToolPath(options.cwd, call?.args.path);\n\t\tconst command = typeof call?.args.command === \"string\" ? call.args.command : undefined;\n\t\tlet reason: ContextGcPackedRecord[\"reason\"] = \"stale-tool-result\";\n\t\tif (message.toolName === \"read\" && path) {\n\t\t\tif (plan.latestReadByPath.get(path) === message.toolCallId) continue;\n\t\t\treason = \"superseded-read\";\n\t\t}\n\t\tif (reason === \"stale-tool-result\") {\n\t\t\trecentAssistantText ??= collectRecentAssistantText(messages);\n\t\t\tconst reference = referenceEvidenceInputs(options.cwd, call, path, command);\n\t\t\tif (isReferencedByRecentAssistantText(recentAssistantText, reference.path, reference.command)) continue;\n\t\t}\n\n\t\tconst originalTokens = estimateTokens(message);\n\t\tconst key = createHash(\"sha256\")\n\t\t\t.update(message.toolName)\n\t\t\t.update(\"\\0\")\n\t\t\t.update(message.toolCallId)\n\t\t\t.update(\"\\0\")\n\t\t\t.update(originalText)\n\t\t\t.digest(\"hex\")\n\t\t\t.slice(0, 24);\n\t\tconst storagePath = maybeStoreOriginal(options, key, originalText);\n\t\tconst record: ContextGcPackedRecord = {\n\t\t\ttoolName: message.toolName,\n\t\t\ttoolCallId: message.toolCallId,\n\t\t\tmessageIndex: index,\n\t\t\treason,\n\t\t\toriginalChars: originalText.length,\n\t\t\toriginalTokens,\n\t\t\tpackedTokens: 0,\n\t\t\tstoragePath,\n\t\t\tpath,\n\t\t\tcommand,\n\t\t\tkey,\n\t\t};\n\t\tcommitPackedMessage(\n\t\t\toptions,\n\t\t\tbaseReport,\n\t\t\tnextMessages,\n\t\t\tindex,\n\t\t\tmessage,\n\t\t\toriginalText,\n\t\t\tkey,\n\t\t\trecord,\n\t\t\tmakePackedToolResult,\n\t\t);\n\t\tchanged = true;\n\t}\n\n\tbaseReport.packedCount = baseReport.records.length;\n\tbaseReport.savedTokens = Math.max(0, baseReport.originalTokens - baseReport.packedTokens);\n\treturn { messages: changed ? nextMessages : messages, report: baseReport };\n}\n"]}
@@ -0,0 +1,9 @@
1
+ export interface SessionShutdownTracker {
2
+ safely(action: () => void): void;
3
+ track(action: () => Promise<unknown>): void;
4
+ trackRequired(action: () => Promise<unknown>): void;
5
+ finish(): Promise<void>;
6
+ }
7
+ /** Aggregates independent session cleanup while preserving failures from required release barriers. */
8
+ export declare function createSessionShutdownTracker(): SessionShutdownTracker;
9
+ //# sourceMappingURL=session-shutdown.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-shutdown.d.ts","sourceRoot":"","sources":["../../src/core/session-shutdown.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,sBAAsB;IACtC,MAAM,CAAC,MAAM,EAAE,MAAM,IAAI,GAAG,IAAI,CAAC;IACjC,KAAK,CAAC,MAAM,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC;IAC5C,aAAa,CAAC,MAAM,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC;IACpD,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAED,uGAAuG;AACvG,wBAAgB,4BAA4B,IAAI,sBAAsB,CAyCrE"}
@@ -0,0 +1,44 @@
1
+ /** Aggregates independent session cleanup while preserving failures from required release barriers. */
2
+ export function createSessionShutdownTracker() {
3
+ const shutdowns = [];
4
+ const requiredFailures = [];
5
+ const safely = (action) => {
6
+ try {
7
+ action();
8
+ }
9
+ catch {
10
+ // One synchronous cleanup failure cannot skip independent resources.
11
+ }
12
+ };
13
+ const track = (action) => {
14
+ try {
15
+ shutdowns.push(action());
16
+ }
17
+ catch {
18
+ // A synchronously throwing adapter cannot skip independent resources.
19
+ }
20
+ };
21
+ const trackRequired = (action) => {
22
+ try {
23
+ shutdowns.push(action().catch((reason) => {
24
+ requiredFailures.push(reason);
25
+ }));
26
+ }
27
+ catch (reason) {
28
+ requiredFailures.push(reason);
29
+ }
30
+ };
31
+ const finish = () => {
32
+ const completion = Promise.allSettled(shutdowns).then(() => {
33
+ if (requiredFailures.length === 1)
34
+ throw requiredFailures[0];
35
+ if (requiredFailures.length > 1) {
36
+ throw new AggregateError(requiredFailures, "Required session resource release failed");
37
+ }
38
+ });
39
+ void completion.catch(() => undefined);
40
+ return completion;
41
+ };
42
+ return { safely, track, trackRequired, finish };
43
+ }
44
+ //# sourceMappingURL=session-shutdown.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-shutdown.js","sourceRoot":"","sources":["../../src/core/session-shutdown.ts"],"names":[],"mappings":"AAOA,uGAAuG;AACvG,MAAM,UAAU,4BAA4B;IAC3C,MAAM,SAAS,GAAuB,EAAE,CAAC;IACzC,MAAM,gBAAgB,GAAc,EAAE,CAAC;IAEvC,MAAM,MAAM,GAAG,CAAC,MAAkB,EAAQ,EAAE;QAC3C,IAAI,CAAC;YACJ,MAAM,EAAE,CAAC;QACV,CAAC;QAAC,MAAM,CAAC;YACR,qEAAqE;QACtE,CAAC;IACF,CAAC,CAAC;IACF,MAAM,KAAK,GAAG,CAAC,MAA8B,EAAQ,EAAE;QACtD,IAAI,CAAC;YACJ,SAAS,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;QAC1B,CAAC;QAAC,MAAM,CAAC;YACR,sEAAsE;QACvE,CAAC;IACF,CAAC,CAAC;IACF,MAAM,aAAa,GAAG,CAAC,MAA8B,EAAQ,EAAE;QAC9D,IAAI,CAAC;YACJ,SAAS,CAAC,IAAI,CACb,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC,MAAe,EAAE,EAAE;gBAClC,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAC/B,CAAC,CAAC,CACF,CAAC;QACH,CAAC;QAAC,OAAO,MAAM,EAAE,CAAC;YACjB,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC/B,CAAC;IACF,CAAC,CAAC;IACF,MAAM,MAAM,GAAG,GAAkB,EAAE;QAClC,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE;YAC1D,IAAI,gBAAgB,CAAC,MAAM,KAAK,CAAC;gBAAE,MAAM,gBAAgB,CAAC,CAAC,CAAC,CAAC;YAC7D,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACjC,MAAM,IAAI,cAAc,CAAC,gBAAgB,EAAE,0CAA0C,CAAC,CAAC;YACxF,CAAC;QACF,CAAC,CAAC,CAAC;QACH,KAAK,UAAU,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QACvC,OAAO,UAAU,CAAC;IACnB,CAAC,CAAC;IAEF,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,EAAE,CAAC;AACjD,CAAC","sourcesContent":["export interface SessionShutdownTracker {\n\tsafely(action: () => void): void;\n\ttrack(action: () => Promise<unknown>): void;\n\ttrackRequired(action: () => Promise<unknown>): void;\n\tfinish(): Promise<void>;\n}\n\n/** Aggregates independent session cleanup while preserving failures from required release barriers. */\nexport function createSessionShutdownTracker(): SessionShutdownTracker {\n\tconst shutdowns: Promise<unknown>[] = [];\n\tconst requiredFailures: unknown[] = [];\n\n\tconst safely = (action: () => void): void => {\n\t\ttry {\n\t\t\taction();\n\t\t} catch {\n\t\t\t// One synchronous cleanup failure cannot skip independent resources.\n\t\t}\n\t};\n\tconst track = (action: () => Promise<unknown>): void => {\n\t\ttry {\n\t\t\tshutdowns.push(action());\n\t\t} catch {\n\t\t\t// A synchronously throwing adapter cannot skip independent resources.\n\t\t}\n\t};\n\tconst trackRequired = (action: () => Promise<unknown>): void => {\n\t\ttry {\n\t\t\tshutdowns.push(\n\t\t\t\taction().catch((reason: unknown) => {\n\t\t\t\t\trequiredFailures.push(reason);\n\t\t\t\t}),\n\t\t\t);\n\t\t} catch (reason) {\n\t\t\trequiredFailures.push(reason);\n\t\t}\n\t};\n\tconst finish = (): Promise<void> => {\n\t\tconst completion = Promise.allSettled(shutdowns).then(() => {\n\t\t\tif (requiredFailures.length === 1) throw requiredFailures[0];\n\t\t\tif (requiredFailures.length > 1) {\n\t\t\t\tthrow new AggregateError(requiredFailures, \"Required session resource release failed\");\n\t\t\t}\n\t\t});\n\t\tvoid completion.catch(() => undefined);\n\t\treturn completion;\n\t};\n\n\treturn { safely, track, trackRequired, finish };\n}\n"]}