@ponythewhite/base-context 1.0.6 → 1.0.8

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 (136) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/dist/base-context-runtime/pyproject.toml +1 -1
  3. package/dist/base-context-runtime/src/rlm/__init__.py +3 -0
  4. package/dist/base-context-runtime/src/rlm/harness.py +86 -48
  5. package/dist/base-context-runtime/test/test_harness.py +215 -140
  6. package/dist/base-context-runtime/uv.lock +1 -1
  7. package/dist/build-info.json +1 -1
  8. package/dist/bundle/amazon-bedrock.js +3 -3
  9. package/dist/bundle/{anthropic-UV5GZDGU.js → anthropic-5PSCZEER.js} +2 -7
  10. package/dist/bundle/{azure-openai-responses-WSNPXLYC.js → azure-openai-responses-AYTLJR33.js} +2 -2
  11. package/dist/bundle/{bundled-modules-MEACET4U.js → bundled-modules-IGMJH2MU.js} +5 -5
  12. package/dist/bundle/{chunk-UPVDERMD.js → chunk-2IPDSTDR.js} +11 -9
  13. package/dist/bundle/chunk-D3KOF57W.js +22040 -0
  14. package/dist/bundle/{chunk-QKI6KEGP.js → chunk-EXEFSSF4.js} +1509 -577
  15. package/dist/bundle/{chunk-VSIYFWYI.js → chunk-KT2BNEPE.js} +21 -8
  16. package/dist/bundle/{chunk-KTNETTHI.js → chunk-Q3MBSBEB.js} +3 -101
  17. package/dist/bundle/{chunk-LFPWHI42.js → chunk-QKIFBA7N.js} +2 -2
  18. package/dist/bundle/{chunk-LIZVVGHR.js → chunk-RVJVXZCS.js} +13 -10
  19. package/dist/bundle/{cli-main-ANUJY7Y4.js → cli-main-BUK7QTHO.js} +4 -4
  20. package/dist/bundle/cli.js +1 -1
  21. package/dist/bundle/{google-T32FMD4G.js → google-HTMCUJ7X.js} +2 -2
  22. package/dist/bundle/{google-vertex-56KP6I3B.js → google-vertex-ZQO65AXF.js} +2 -2
  23. package/dist/bundle/{main-4GIKOHIT.js → main-2FWHT2WZ.js} +5 -5
  24. package/dist/bundle/{mistral-WGBMYIVU.js → mistral-SB7LU56G.js} +1 -1
  25. package/dist/bundle/{openai-codex-responses-PIV2RQ3G.js → openai-codex-responses-5CEW4VN3.js} +53 -27
  26. package/dist/bundle/{openai-completions-64C3JPR4.js → openai-completions-BAZJQSS2.js} +1 -1
  27. package/dist/bundle/{openai-responses-UI7RSTDV.js → openai-responses-VHOE427P.js} +48 -5
  28. package/dist/core/agent-session.d.ts +6 -1
  29. package/dist/core/agent-session.d.ts.map +1 -1
  30. package/dist/core/agent-session.js +189 -31
  31. package/dist/core/agent-session.js.map +1 -1
  32. package/dist/core/canonical-context.d.ts +8 -0
  33. package/dist/core/canonical-context.d.ts.map +1 -1
  34. package/dist/core/canonical-context.js +37 -5
  35. package/dist/core/canonical-context.js.map +1 -1
  36. package/dist/core/compaction/compaction.d.ts +2 -2
  37. package/dist/core/compaction/compaction.d.ts.map +1 -1
  38. package/dist/core/compaction/compaction.js +31 -13
  39. package/dist/core/compaction/compaction.js.map +1 -1
  40. package/dist/core/context-epoch.d.ts +1 -1
  41. package/dist/core/context-epoch.d.ts.map +1 -1
  42. package/dist/core/context-epoch.js +20 -12
  43. package/dist/core/context-epoch.js.map +1 -1
  44. package/dist/core/extensions/types.d.ts +2 -2
  45. package/dist/core/extensions/types.d.ts.map +1 -1
  46. package/dist/core/extensions/types.js.map +1 -1
  47. package/dist/core/history-index-worker.d.ts.map +1 -1
  48. package/dist/core/history-index-worker.js +29 -8
  49. package/dist/core/history-index-worker.js.map +1 -1
  50. package/dist/core/history-index.d.ts +11 -1
  51. package/dist/core/history-index.d.ts.map +1 -1
  52. package/dist/core/history-index.js +2 -1
  53. package/dist/core/history-index.js.map +1 -1
  54. package/dist/core/inference-coordinator.d.ts.map +1 -1
  55. package/dist/core/inference-coordinator.js +110 -13
  56. package/dist/core/inference-coordinator.js.map +1 -1
  57. package/dist/core/kernel/bootstrap.d.ts.map +1 -1
  58. package/dist/core/kernel/bootstrap.js +97 -107
  59. package/dist/core/kernel/bootstrap.js.map +1 -1
  60. package/dist/core/kernel/repl-manager.d.ts.map +1 -1
  61. package/dist/core/kernel/repl-manager.js +11 -0
  62. package/dist/core/kernel/repl-manager.js.map +1 -1
  63. package/dist/core/kernel/shared.d.ts +2 -0
  64. package/dist/core/kernel/shared.d.ts.map +1 -1
  65. package/dist/core/kernel/shared.js.map +1 -1
  66. package/dist/core/messages.d.ts.map +1 -1
  67. package/dist/core/messages.js +4 -1
  68. package/dist/core/messages.js.map +1 -1
  69. package/dist/core/prompts/rlm.d.ts.map +1 -1
  70. package/dist/core/prompts/rlm.js +4 -2
  71. package/dist/core/prompts/rlm.js.map +1 -1
  72. package/dist/core/public-context.d.ts.map +1 -1
  73. package/dist/core/public-context.js +16 -0
  74. package/dist/core/public-context.js.map +1 -1
  75. package/dist/core/refinement/refinement.d.ts +19 -5
  76. package/dist/core/refinement/refinement.d.ts.map +1 -1
  77. package/dist/core/refinement/refinement.js +90 -35
  78. package/dist/core/refinement/refinement.js.map +1 -1
  79. package/dist/core/request-view-selection.d.ts +12 -4
  80. package/dist/core/request-view-selection.d.ts.map +1 -1
  81. package/dist/core/request-view-selection.js +242 -100
  82. package/dist/core/request-view-selection.js.map +1 -1
  83. package/dist/core/retained-tool-output.d.ts +28 -0
  84. package/dist/core/retained-tool-output.d.ts.map +1 -0
  85. package/dist/core/retained-tool-output.js +102 -0
  86. package/dist/core/retained-tool-output.js.map +1 -0
  87. package/dist/core/sdk.d.ts.map +1 -1
  88. package/dist/core/sdk.js +1 -1
  89. package/dist/core/sdk.js.map +1 -1
  90. package/dist/core/selective-recovery.d.ts +47 -3
  91. package/dist/core/selective-recovery.d.ts.map +1 -1
  92. package/dist/core/selective-recovery.js +428 -109
  93. package/dist/core/selective-recovery.js.map +1 -1
  94. package/dist/core/session-history-index.d.ts +3 -1
  95. package/dist/core/session-history-index.d.ts.map +1 -1
  96. package/dist/core/session-history-index.js +1 -1
  97. package/dist/core/session-history-index.js.map +1 -1
  98. package/dist/core/settings-manager.d.ts +5 -0
  99. package/dist/core/settings-manager.d.ts.map +1 -1
  100. package/dist/core/settings-manager.js +3 -0
  101. package/dist/core/settings-manager.js.map +1 -1
  102. package/dist/core/system-prompt.d.ts +3 -1
  103. package/dist/core/system-prompt.d.ts.map +1 -1
  104. package/dist/core/system-prompt.js +3 -3
  105. package/dist/core/system-prompt.js.map +1 -1
  106. package/dist/core/task-frame.d.ts +1 -1
  107. package/dist/core/task-frame.d.ts.map +1 -1
  108. package/dist/core/task-frame.js +21 -1
  109. package/dist/core/task-frame.js.map +1 -1
  110. package/dist/core/task-state-reader.d.ts +10 -2
  111. package/dist/core/task-state-reader.d.ts.map +1 -1
  112. package/dist/core/task-state-reader.js +75 -9
  113. package/dist/core/task-state-reader.js.map +1 -1
  114. package/dist/core/tools/ipython.d.ts +5 -0
  115. package/dist/core/tools/ipython.d.ts.map +1 -1
  116. package/dist/core/tools/ipython.js +59 -17
  117. package/dist/core/tools/ipython.js.map +1 -1
  118. package/dist/core/tools/prime-context.d.ts.map +1 -1
  119. package/dist/core/tools/prime-context.js +1 -1
  120. package/dist/core/tools/prime-context.js.map +1 -1
  121. package/dist/core/view-units.d.ts +4 -0
  122. package/dist/core/view-units.d.ts.map +1 -1
  123. package/dist/core/view-units.js +28 -19
  124. package/dist/core/view-units.js.map +1 -1
  125. package/dist/installer.mjs +98 -77
  126. package/dist/modes/interactive/components/refinement-outcome-message.d.ts.map +1 -1
  127. package/dist/modes/interactive/components/refinement-outcome-message.js.map +1 -1
  128. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  129. package/dist/modes/interactive/interactive-mode.js +5 -5
  130. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  131. package/dist/skills/skill-creator/SKILL.md +18 -1
  132. package/docs/settings.md +45 -0
  133. package/docs/skills.md +77 -2
  134. package/package.json +4 -4
  135. package/skills/skill-creator/SKILL.md +18 -1
  136. package/dist/bundle/chunk-W46VZFI6.js +0 -21681
@@ -1 +1 @@
1
- {"version":3,"file":"request-view-selection.js","sourceRoot":"","sources":["../../src/core/request-view-selection.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AgentMessage } from \"@ponythewhite/base-context-agent\";\nimport {\n\ttype Context,\n\ttype ProviderRequestProjection,\n\ttype ProviderRequestPublicMessage,\n\ttype ProviderRequestRepresentation,\n\ttype RequestTokenAssessment,\n\tRequestTokenBudgetError,\n\ttype RequestTokenBudgetEvaluator,\n} from \"@ponythewhite/base-context-ai\";\nimport {\n\ttype CanonicalViewSelectionSource,\n\tcaptureCanonicalRequestMessages,\n\tgetCanonicalViewSelectionSource,\n\tpreparePublicContextWindow,\n\tprepareToolContinuationWindow,\n} from \"./canonical-context.js\";\nimport { convertToLlm } from \"./messages.js\";\nimport type { ContextEpochEntryRef, SourceSnapshotRef } from \"./request-events.js\";\nimport { bindMessageReplayUnits, closeViewSelection } from \"./view-units.js\";\n\n/** Actual adapter-public measurement, not a verdict about the opaque native request. */\nexport class PublicContextBudgetError extends RequestTokenBudgetError {\n\treadonly source: SourceSnapshotRef;\n\n\tconstructor(\n\t\tsource: SourceSnapshotRef,\n\t\tassessment: RequestTokenAssessment,\n\t\treadonly originalAssessment: RequestTokenAssessment,\n\t) {\n\t\tsuper(assessment);\n\t\tthis.name = \"PublicContextBudgetError\";\n\t\tthis.source = Object.freeze({ ...source });\n\t}\n}\n\nexport interface RequestViewCandidate {\n\treadonly source: SourceSnapshotRef;\n\treadonly selectedUnitIds: readonly string[];\n\treadonly request: ProviderRequestRepresentation;\n\treadonly projection: ProviderRequestProjection;\n\treadonly assessment: RequestTokenAssessment;\n\treadonly originalAssessment: RequestTokenAssessment;\n\t/** Exact public messages represented by the accepted candidate, with captured source recipes. */\n\treadonly publicMessages?: readonly AgentMessage[];\n}\n\n/** Root resolves only after its canonical epoch checkpoint ACK. This module owns no epoch state. */\nexport type RequestViewCommit = (\n\tcandidate: RequestViewCandidate,\n) => Promise<ContextEpochEntryRef | undefined> | Promise<void>;\nexport type RequestViewValidate = (\n\trequest: ProviderRequestRepresentation,\n\tassessment: RequestTokenAssessment | undefined,\n) => void;\n\nexport type RequestViewFixedPrepare = (\n\trequest: ProviderRequestRepresentation,\n\tprojection: ProviderRequestProjection,\n\tassessment: RequestTokenAssessment | undefined,\n) => ContextEpochEntryRef | void | Promise<ContextEpochEntryRef | undefined> | Promise<void>;\n\nexport interface CapturedRequestViewBoundary extends CanonicalViewSelectionSource {\n\treadonly messages: readonly AgentMessage[];\n\t/** Provider logical positions mapped to the unchanged canonical messages/units. */\n\treadonly providerMessageIndices: readonly number[];\n\treadonly providerPendingPublicMessageGroups?: readonly (readonly number[])[];\n\treadonly commit: RequestViewCommit;\n\treadonly validate?: RequestViewValidate;\n\treadonly fixedPrepare?: RequestViewFixedPrepare;\n}\n\nexport function captureRequestViewBoundary(\n\tmessages: readonly AgentMessage[],\n\tcommit: RequestViewCommit,\n\tvalidate?: RequestViewValidate,\n\tfixedPrepare?: RequestViewFixedPrepare,\n): CapturedRequestViewBoundary {\n\tconst source = getCanonicalViewSelectionSource(messages);\n\tif (!source) throw new Error(\"Request view boundary requires compiled canonical messages\");\n\tconst providerMessageIndices = messages.flatMap((message, index) => convertToLlm([message]).map(() => index));\n\treturn {\n\t\t...source,\n\t\tmessages: captureCanonicalRequestMessages(messages),\n\t\tproviderMessageIndices,\n\t\t...(source.pendingPublicMessageGroups\n\t\t\t? {\n\t\t\t\t\tproviderPendingPublicMessageGroups: source.pendingPublicMessageGroups.map((group) =>\n\t\t\t\t\t\tgroup.map((index) => providerMessageIndex(providerMessageIndices, index)),\n\t\t\t\t\t),\n\t\t\t\t}\n\t\t\t: {}),\n\t\tcommit,\n\t\tvalidate,\n\t\tfixedPrepare,\n\t};\n}\n\nfunction providerMessageIndex(indices: readonly number[], canonicalIndex: number): number {\n\tconst index = indices.indexOf(canonicalIndex);\n\tif (index < 0) throw new Error(\"Provider projection cannot address a filtered canonical message\");\n\treturn index;\n}\n\n/** Keep canonical UI barriers while translating the native serializer's provider-only positions. */\nfunction canonicalRequestProjection(\n\tboundary: CapturedRequestViewBoundary,\n\tprojection: ProviderRequestProjection,\n): ProviderRequestProjection {\n\tconst indices = boundary.providerMessageIndices;\n\tif (indices.length === boundary.messages.length) return projection;\n\tconst canonicalIndex = (index: number): number => {\n\t\tconst canonical = indices[index];\n\t\tif (canonical === undefined) throw new Error(\"Provider projection message index is outside its captured view\");\n\t\treturn canonical;\n\t};\n\treturn {\n\t\t...projection,\n\t\tmessageIndices: projection.messageIndices.map((index) => (index === null ? null : canonicalIndex(index))),\n\t\t...(projection.optionalMessageIndices\n\t\t\t? { optionalMessageIndices: projection.optionalMessageIndices.map(canonicalIndex) }\n\t\t\t: {}),\n\t\t...(projection.generatedMessageIndices\n\t\t\t? { generatedMessageIndices: projection.generatedMessageIndices.map(canonicalIndex) }\n\t\t\t: {}),\n\t\t...(projection.publicMessageGroups\n\t\t\t? { publicMessageGroups: projection.publicMessageGroups.map((group) => group.map(canonicalIndex)) }\n\t\t\t: {}),\n\t\t...(projection.pendingPublicMessageGroups\n\t\t\t? {\n\t\t\t\t\tpendingPublicMessageGroups: projection.pendingPublicMessageGroups.map((group) =>\n\t\t\t\t\t\tgroup.map(canonicalIndex),\n\t\t\t\t\t),\n\t\t\t\t}\n\t\t\t: {}),\n\t\t...(projection.encodePublicWindow\n\t\t\t? {\n\t\t\t\t\tencodePublicWindow: (replacements: readonly ProviderRequestPublicMessage[]) => {\n\t\t\t\t\t\tconst encoded = projection.encodePublicWindow!(\n\t\t\t\t\t\t\treplacements.map((replacement) => ({\n\t\t\t\t\t\t\t\t...replacement,\n\t\t\t\t\t\t\t\tmessageIndex: providerMessageIndex(indices, replacement.messageIndex),\n\t\t\t\t\t\t\t})),\n\t\t\t\t\t\t);\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\tencoded && { ...encoded, projection: canonicalRequestProjection(boundary, encoded.projection) }\n\t\t\t\t\t\t);\n\t\t\t\t\t},\n\t\t\t\t}\n\t\t\t: {}),\n\t};\n}\n\nexport function matchesRequestView(\n\tboundary: CapturedRequestViewBoundary,\n\tsource: SourceSnapshotRef,\n\tcontext: Context,\n): boolean {\n\tconst expected = boundary.source;\n\tif (\n\t\texpected.sessionId !== source.sessionId ||\n\t\texpected.sessionFile !== source.sessionFile ||\n\t\texpected.leafId !== source.leafId ||\n\t\texpected.sourceSequence !== source.sourceSequence\n\t)\n\t\treturn false;\n\tconst rendered = convertToLlm([...boundary.messages]);\n\treturn (\n\t\tboundary.messages.length === boundary.units.length &&\n\t\trendered.length === boundary.providerMessageIndices.length &&\n\t\tJSON.stringify(rendered) === JSON.stringify(context.messages)\n\t);\n}\n\n/** Projection kinds describe their actual provider body, never an OpenAI-format route alias. */\nfunction requestInputKey(\n\trequest: ProviderRequestRepresentation,\n\tprojection: ProviderRequestProjection,\n): \"input\" | \"messages\" | undefined {\n\tif (\n\t\t(request.api === \"openai-responses\" || request.api === \"openai-codex-responses\") &&\n\t\t(projection.kind === \"openai-responses-text-v1\" || projection.kind === \"openai-responses-replay-v1\")\n\t)\n\t\treturn \"input\";\n\tif (\n\t\trequest.api === \"openai-completions\" &&\n\t\trequest.provider === \"deepseek\" &&\n\t\trequest.url === \"https://api.deepseek.com/chat/completions\" &&\n\t\tprojection.kind === \"deepseek-completions-text-tools-v1\" &&\n\t\trequest.body !== undefined &&\n\t\tJSON.parse(request.body).model === \"deepseek-flash\"\n\t)\n\t\treturn \"messages\";\n\treturn undefined;\n}\n\n/** Check the actual final mapping without selecting, converting, or committing another view. */\nexport async function prepareFixedRequestView(\n\tboundary: CapturedRequestViewBoundary,\n\trequest: ProviderRequestRepresentation,\n\tprojection: ProviderRequestProjection,\n\tassessment: RequestTokenAssessment | undefined,\n) {\n\tprojection = canonicalRequestProjection(boundary, projection);\n\tconst inputKey = requestInputKey(request, projection);\n\tconst payload = JSON.parse(request.body!) as Record<string, unknown> | null;\n\tconst input = inputKey && payload ? payload[inputKey] : undefined;\n\tif (!Array.isArray(input) || input.length !== projection.messageIndices.length)\n\t\tthrow new Error(\"Fixed context requires its final provider projection\");\n\tif (\n\t\tprojection.kind === \"openai-responses-text-v1\" &&\n\t\tboundary.messages.some(\n\t\t\t(message) =>\n\t\t\t\tmessage.role === \"toolResult\" ||\n\t\t\t\t(message.role === \"assistant\" && (message.content.length !== 1 || message.content[0].type !== \"text\")),\n\t\t)\n\t)\n\t\tthrow new Error(\"Fixed context requires its native replay adapter\");\n\tconst units = bindMessageReplayUnits(\n\t\tboundary.messages,\n\t\tboundary.units,\n\t\tboundary.limits,\n\t\tprojection.replayContract ?? \"complete-context\",\n\t);\n\tcloseViewSelection(\n\t\tunits,\n\t\tunits.map((unit) => unit.id),\n\t\tboundary.limits,\n\t);\n\treturn await boundary.fixedPrepare!(request, projection, assessment);\n}\n\n/** Only the actual serializer's established replay contract authorizes historical-literal omission. */\nexport async function selectRequestView(\n\tboundary: CapturedRequestViewBoundary,\n\trequest: ProviderRequestRepresentation,\n\tprojection: ProviderRequestProjection,\n\tbudget: RequestTokenBudgetEvaluator,\n\tallowShrink: boolean,\n): Promise<string | undefined> {\n\tprojection = canonicalRequestProjection(boundary, projection);\n\tconst full = budget.measure(request);\n\tconst inputKey = requestInputKey(request, projection);\n\tif (full.limitSource !== \"explicit-profile\" || !inputKey) return;\n\tconst payload = JSON.parse(request.body!) as Record<string, unknown>;\n\tconst input = payload[inputKey];\n\tif (!Array.isArray(input) || input.length !== projection.messageIndices.length) return;\n\n\t// Absence is complete-context; a profile or tool-shaped message is never group authority.\n\tconst replayContract = projection.replayContract ?? \"complete-context\";\n\tif (\n\t\tprojection.kind === \"openai-responses-text-v1\" &&\n\t\tboundary.messages.some(\n\t\t\t(message) =>\n\t\t\t\tmessage.role === \"toolResult\" ||\n\t\t\t\t(message.role === \"assistant\" && (message.content.length !== 1 || message.content[0].type !== \"text\")),\n\t\t)\n\t)\n\t\treturn;\n\tconst units = bindMessageReplayUnits(\n\t\tboundary.messages,\n\t\tboundary.units,\n\t\tboundary.limits,\n\t\treplayContract,\n\t\tboundary.pendingPublicMessageGroups,\n\t);\n\tconst offer = async (\n\t\tselectedUnitIds: readonly string[],\n\t\tcandidateRequest: ProviderRequestRepresentation,\n\t\tcandidateProjection: ProviderRequestProjection,\n\t\tassessment: RequestTokenAssessment,\n\t\tpublicMessages?: readonly AgentMessage[],\n\t) =>\n\t\tboundary.commit(\n\t\t\tObject.freeze({\n\t\t\t\tsource: Object.freeze({ ...boundary.source }),\n\t\t\t\tselectedUnitIds: Object.freeze([...selectedUnitIds]),\n\t\t\t\trequest: Object.freeze({ ...candidateRequest }),\n\t\t\t\tprojection: Object.freeze({\n\t\t\t\t\t...candidateProjection,\n\t\t\t\t\treplayContract,\n\t\t\t\t\tmessageIndices: Object.freeze([...candidateProjection.messageIndices]),\n\t\t\t\t\t...(candidateProjection.optionalMessageIndices\n\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\toptionalMessageIndices: Object.freeze([...candidateProjection.optionalMessageIndices]),\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t: {}),\n\t\t\t\t\t...(candidateProjection.generatedMessageIndices\n\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\tgeneratedMessageIndices: Object.freeze([...candidateProjection.generatedMessageIndices]),\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t: {}),\n\t\t\t\t}),\n\t\t\t\tassessment,\n\t\t\t\toriginalAssessment: full,\n\t\t\t\t...(publicMessages ? { publicMessages } : {}),\n\t\t\t}),\n\t\t);\n\tif (boundary.pendingPublicMessageGroups?.length) {\n\t\tif (\n\t\t\treplayContract !== \"message-groups\" ||\n\t\t\t!projection.publicWindow ||\n\t\t\t!projection.encodePublicWindow ||\n\t\t\tJSON.stringify(projection.pendingPublicMessageGroups) !== JSON.stringify(boundary.pendingPublicMessageGroups)\n\t\t)\n\t\t\tthrow new Error(\"Original tool group requires current native adapter public conversion\");\n\t\tconst publicView = prepareToolContinuationWindow(boundary.messages);\n\t\tconst encoded = projection.encodePublicWindow(publicView.replacements);\n\t\tif (!encoded || encoded.projection.pendingPublicMessageGroups?.length)\n\t\t\tthrow new Error(\"Native adapter did not convert the whole required tool group\");\n\t\tconst publicSource = getCanonicalViewSelectionSource(publicView.messages)!;\n\t\tconst publicUnits = bindMessageReplayUnits(\n\t\t\tpublicView.messages,\n\t\t\tpublicSource.units,\n\t\t\tboundary.limits,\n\t\t\treplayContract,\n\t\t);\n\t\tconst closed = closeViewSelection(\n\t\t\tpublicUnits,\n\t\t\tpublicUnits.map((unit) => unit.id),\n\t\t\tboundary.limits,\n\t\t);\n\t\tconst assessment = budget.measure(encoded.request);\n\t\tif (assessment.status === \"over-budget\") throw new PublicContextBudgetError(boundary.source, assessment, full);\n\t\tif (assessment.status !== \"within-estimate\")\n\t\t\tthrow new Error(\"Tool continuation public request exceeds its token budget\");\n\t\tawait offer(\n\t\t\tclosed.map((unit) => unit.id),\n\t\t\tencoded.request,\n\t\t\tencoded.projection,\n\t\t\tassessment,\n\t\t\tpublicView.messages,\n\t\t);\n\t\treturn encoded.request.body;\n\t}\n\tif (projection.pendingPublicMessageGroups?.length)\n\t\tthrow new Error(\"Adapter pending group has no original owned source plan\");\n\tconst offerPublicWindow = async (): Promise<string | undefined> => {\n\t\tif (\n\t\t\t!allowShrink ||\n\t\t\treplayContract !== \"message-groups\" ||\n\t\t\t!projection.publicWindow ||\n\t\t\t!projection.encodePublicWindow\n\t\t)\n\t\t\treturn;\n\t\tconst closed = closeViewSelection(\n\t\t\tunits,\n\t\t\tunits.map((unit) => unit.id),\n\t\t\tboundary.limits,\n\t\t);\n\t\tlet firstMessageIndex = 0;\n\t\tif (\n\t\t\tfull.status === \"unknown\" &&\n\t\t\tfull.unknown.length === 1 &&\n\t\t\tfull.unknown[0] === \"media, opaque or unsupported replay token coverage unknown\"\n\t\t) {\n\t\t\t// Credited items are not part of the unknown input. Keep original projection indices.\n\t\t\tconst firstUnmeteredItem = request.retainedPrefix?.inputItems ?? 0;\n\t\t\tconst reasoningItemIndex = input.findIndex(\n\t\t\t\t(item, index) => index >= firstUnmeteredItem && item?.type === \"reasoning\",\n\t\t\t);\n\t\t\tconst messageIndex = projection.messageIndices[reasoningItemIndex];\n\t\t\tconst group =\n\t\t\t\tmessageIndex == null\n\t\t\t\t\t? undefined\n\t\t\t\t\t: projection.publicMessageGroups?.find((members) => members.includes(messageIndex));\n\t\t\t// The adapter still accepts only complete groups; earlier meterable groups stay native.\n\t\t\tfirstMessageIndex = group ? Math.min(...group) : 0;\n\t\t}\n\t\tconst publicView = preparePublicContextWindow(boundary.messages, firstMessageIndex);\n\t\tif (!publicView) {\n\t\t\t// Keep the original measured refusal when no public conversion can be offered.\n\t\t\t// This is not a new recovery signal or permission to reprepare again.\n\t\t\tif (full.status === \"over-budget\") throw new RequestTokenBudgetError(full);\n\t\t\treturn;\n\t\t}\n\t\tconst encoded = projection.encodePublicWindow(publicView.replacements);\n\t\tif (!encoded) return;\n\t\tconst assessment = budget.measure(encoded.request);\n\t\tif (assessment.status === \"over-budget\") throw new PublicContextBudgetError(boundary.source, assessment, full);\n\t\tif (assessment.status !== \"within-estimate\") return;\n\t\tawait offer(\n\t\t\tclosed.map((unit) => unit.id),\n\t\t\tencoded.request,\n\t\t\tencoded.projection,\n\t\t\tassessment,\n\t\t\tpublicView.messages,\n\t\t);\n\t\treturn encoded.request.body;\n\t};\n\tif (full.status === \"within-estimate\") {\n\t\tconst closed = closeViewSelection(\n\t\t\tunits,\n\t\t\tunits.map((unit) => unit.id),\n\t\t\tboundary.limits,\n\t\t);\n\t\tawait offer(\n\t\t\tclosed.map((unit) => unit.id),\n\t\t\trequest,\n\t\t\tprojection,\n\t\t\tfull,\n\t\t);\n\t\treturn request.body;\n\t}\n\tif (!allowShrink || replayContract !== \"message-groups\") return;\n\tif (full.status !== \"over-budget\") return offerPublicWindow();\n\tlet latestAssistant = -1;\n\tfor (const [index, message] of boundary.messages.entries())\n\t\tif (message.role === \"assistant\") latestAssistant = index;\n\tconst retained = new Set(projection.messageIndices.slice(0, request.retainedPrefix?.inputItems ?? 0));\n\tconst projectedOptional =\n\t\tprojection.kind !== \"openai-responses-text-v1\" ? new Set(projection.optionalMessageIndices ?? []) : undefined;\n\tconst optional = units.filter((unit, index) => {\n\t\tconst message = boundary.messages[index];\n\t\treturn (\n\t\t\tindex !== latestAssistant &&\n\t\t\t!retained.has(index) &&\n\t\t\t(!projectedOptional || projectedOptional.has(index)) &&\n\t\t\tunit.kind === \"literal\" &&\n\t\t\tunit.authority === \"assistant-public\" &&\n\t\t\tmessage.role === \"assistant\" &&\n\t\t\tmessage.stopReason === \"stop\" &&\n\t\t\tmessage.content.length === 1 &&\n\t\t\tmessage.content[0].type === \"text\"\n\t\t);\n\t});\n\tconst generatedPositions = new Map<string, number>();\n\tconst generated =\n\t\tprojection.generatedMessageIndices ??\n\t\tboundary.messages.flatMap((message, index) =>\n\t\t\tmessage.role === \"assistant\" &&\n\t\t\tmessage.content.some((block) => block.type === \"text\" && block.textSignature === undefined)\n\t\t\t\t? [index]\n\t\t\t\t: [],\n\t\t);\n\tfor (const index of generated) generatedPositions.set(units[index].id, index);\n\t// All user inputs, the latest assistant, fixed/TaskFrame/recovery units and errors stay selected.\n\tconst selected = new Set(units.map((unit) => unit.id));\n\tfor (const unit of optional) {\n\t\tselected.delete(unit.id);\n\t\tconst closed = closeViewSelection(units, [...selected], boundary.limits);\n\t\t// Normal Responses rendering uses msg_<message index> for unsigned assistants.\n\t\t// Reject any subset that would change a retained generated item ID on reconstruction.\n\t\tif (closed.some((item, index) => generatedPositions.has(item.id) && generatedPositions.get(item.id) !== index))\n\t\t\tcontinue;\n\t\tconst closedIds = new Set(closed.map((item) => item.id));\n\t\tconst keepItem = (index: number) => {\n\t\t\tconst messageIndex = projection.messageIndices[index];\n\t\t\treturn messageIndex === null || closedIds.has(units[messageIndex].id);\n\t\t};\n\t\tconst body = JSON.stringify({ ...payload, [inputKey]: input.filter((_, index) => keepItem(index)) });\n\t\tconst candidateRequest = { ...request, body };\n\t\tconst assessment = budget.measure(candidateRequest);\n\t\tif (assessment.status !== \"within-estimate\") continue;\n\t\tawait offer(\n\t\t\tclosed.map((item) => item.id),\n\t\t\tcandidateRequest,\n\t\t\t{\n\t\t\t\t...projection,\n\t\t\t\tmessageIndices: projection.messageIndices.filter((_, index) => keepItem(index)),\n\t\t\t\t...(projection.optionalMessageIndices\n\t\t\t\t\t? {\n\t\t\t\t\t\t\toptionalMessageIndices: projection.optionalMessageIndices.filter((index) =>\n\t\t\t\t\t\t\t\tclosedIds.has(units[index].id),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t}\n\t\t\t\t\t: {}),\n\t\t\t\t...(projection.generatedMessageIndices\n\t\t\t\t\t? {\n\t\t\t\t\t\t\tgeneratedMessageIndices: projection.generatedMessageIndices.filter((index) =>\n\t\t\t\t\t\t\t\tclosedIds.has(units[index].id),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t}\n\t\t\t\t\t: {}),\n\t\t\t},\n\t\t\tassessment,\n\t\t);\n\t\treturn body;\n\t}\n\treturn offerPublicWindow();\n}\n"]}
1
+ {"version":3,"file":"request-view-selection.js","sourceRoot":"","sources":["../../src/core/request-view-selection.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AgentMessage } from \"@ponythewhite/base-context-agent\";\nimport {\n\ttype Context,\n\ttype ProviderRequestProjection,\n\ttype ProviderRequestPublicMessage,\n\ttype ProviderRequestRepresentation,\n\ttype RequestTokenAssessment,\n\tRequestTokenBudgetError,\n\ttype RequestTokenBudgetEvaluator,\n\twithRequestBody,\n} from \"@ponythewhite/base-context-ai\";\nimport {\n\ttype CanonicalViewSelectionSource,\n\tcaptureCanonicalRequestMessages,\n\tgetCanonicalEpochContext,\n\tgetCanonicalViewSelectionSource,\n\tpreparePublicContextWindow,\n\tprepareToolContinuationWindow,\n} from \"./canonical-context.js\";\nimport { convertToLlm } from \"./messages.js\";\nimport type { ContextEpochEntryRef, SourceSnapshotRef } from \"./request-events.js\";\nimport { bindMessageReplayUnits, closeViewSelection, prepareViewSelection } from \"./view-units.js\";\n\n/** Actual adapter-public measurement, not a verdict about the opaque native request. */\nexport class PublicContextBudgetError extends RequestTokenBudgetError {\n\treadonly source: SourceSnapshotRef;\n\t#compactionKey?: string;\n\t#summaryCapacity?: (retained: ReadonlySet<string>, wrapper: string) => number | undefined;\n\n\tremainingSummaryTokens(retained: ReadonlySet<string>, wrapper: string): number | undefined {\n\t\treturn this.#summaryCapacity?.(retained, wrapper);\n\t}\n\n\tgetCompactionKey(): string | undefined {\n\t\treturn this.#compactionKey;\n\t}\n\n\tconstructor(\n\t\tsource: SourceSnapshotRef,\n\t\tassessment: RequestTokenAssessment,\n\t\treadonly originalAssessment: RequestTokenAssessment,\n\t\treadonly mandatoryAssessment?: RequestTokenAssessment,\n\t\treadonly taskFrameRebaseAvailable = false,\n\t\tcompactionKey?: string,\n\t\tsummaryCapacity?: (retained: ReadonlySet<string>, wrapper: string) => number | undefined,\n\t) {\n\t\tsuper(assessment);\n\t\tthis.name = \"PublicContextBudgetError\";\n\t\tif (mandatoryAssessment?.status === \"over-budget\")\n\t\t\tthis.message =\n\t\t\t\t\"Context capacity exceeded: instructions, tools, mandatory evidence and output allowance cannot fit. Summarizing unrelated history cannot resolve this request.\";\n\t\tthis.source = Object.freeze({ ...source });\n\t\tthis.#compactionKey = compactionKey;\n\t\tthis.#summaryCapacity = summaryCapacity;\n\t}\n}\n\nexport interface RequestViewCandidate {\n\t/** Session-local Responses ID namespace; a new owner requires a fresh representation. */\n\treadonly responseItemIdentity?: string;\n\treadonly source: SourceSnapshotRef;\n\treadonly selectedUnitIds: readonly string[];\n\treadonly request: ProviderRequestRepresentation;\n\treadonly projection: ProviderRequestProjection;\n\t// Absent only for mandatory full-view admission without a configured token budget.\n\treadonly assessment: RequestTokenAssessment | undefined;\n\treadonly originalAssessment: RequestTokenAssessment | undefined;\n\t/** Exact public messages represented by the accepted candidate, with captured source recipes. */\n\treadonly publicMessages?: readonly AgentMessage[];\n}\n\n/** Root resolves only after its canonical epoch checkpoint ACK. This module owns no epoch state. */\nexport type RequestViewCommit = (\n\tcandidate: RequestViewCandidate,\n) => Promise<ContextEpochEntryRef | undefined> | Promise<void>;\nexport type RequestViewValidate = (\n\trequest: ProviderRequestRepresentation,\n\tassessment: RequestTokenAssessment | undefined,\n) => void;\n\nexport type RequestViewFixedPrepare = (\n\trequest: ProviderRequestRepresentation,\n\tprojection: ProviderRequestProjection,\n\tassessment: RequestTokenAssessment | undefined,\n) => ContextEpochEntryRef | void | Promise<ContextEpochEntryRef | undefined> | Promise<void>;\n\nexport interface CapturedRequestViewBoundary extends CanonicalViewSelectionSource {\n\treadonly responseItemIdentity?: string;\n\treadonly messages: readonly AgentMessage[];\n\t/** Provider logical positions mapped to the unchanged canonical messages/units. */\n\treadonly providerMessageIndices: readonly number[];\n\treadonly providerPendingPublicMessageGroups?: readonly (readonly number[])[];\n\treadonly commit: RequestViewCommit;\n\treadonly validate?: RequestViewValidate;\n\treadonly fixedPrepare?: RequestViewFixedPrepare;\n}\n\nexport function captureRequestViewBoundary(\n\tmessages: readonly AgentMessage[],\n\tcommit: RequestViewCommit,\n\tvalidate?: RequestViewValidate,\n\tfixedPrepare?: RequestViewFixedPrepare,\n): CapturedRequestViewBoundary {\n\tconst source = getCanonicalViewSelectionSource(messages);\n\tif (!source) throw new Error(\"Request view boundary requires compiled canonical messages\");\n\tconst providerMessageIndices = messages.flatMap((message, index) => convertToLlm([message]).map(() => index));\n\treturn {\n\t\t...source,\n\t\tmessages: captureCanonicalRequestMessages(messages),\n\t\tproviderMessageIndices,\n\t\t...(source.pendingPublicMessageGroups\n\t\t\t? {\n\t\t\t\t\tproviderPendingPublicMessageGroups: source.pendingPublicMessageGroups.map((group) =>\n\t\t\t\t\t\tgroup.map((index) => providerMessageIndex(providerMessageIndices, index)),\n\t\t\t\t\t),\n\t\t\t\t}\n\t\t\t: {}),\n\t\tcommit,\n\t\tvalidate,\n\t\tfixedPrepare,\n\t};\n}\n\nfunction providerMessageIndex(indices: readonly number[], canonicalIndex: number): number {\n\tconst index = indices.indexOf(canonicalIndex);\n\tif (index < 0) throw new Error(\"Provider projection cannot address a filtered canonical message\");\n\treturn index;\n}\n\n/** Keep canonical UI barriers while translating the native serializer's provider-only positions. */\nfunction canonicalRequestProjection(\n\tboundary: CapturedRequestViewBoundary,\n\tprojection: ProviderRequestProjection,\n): ProviderRequestProjection {\n\tconst indices = boundary.providerMessageIndices;\n\tif (indices.length === boundary.messages.length) return projection;\n\tconst canonicalIndex = (index: number): number => {\n\t\tconst canonical = indices[index];\n\t\tif (canonical === undefined) throw new Error(\"Provider projection message index is outside its captured view\");\n\t\treturn canonical;\n\t};\n\treturn {\n\t\t...projection,\n\t\tmessageIndices: projection.messageIndices.map((index) => (index === null ? null : canonicalIndex(index))),\n\t\t...(projection.optionalMessageIndices\n\t\t\t? { optionalMessageIndices: projection.optionalMessageIndices.map(canonicalIndex) }\n\t\t\t: {}),\n\t\t...(projection.generatedMessageIndices\n\t\t\t? { generatedMessageIndices: projection.generatedMessageIndices.map(canonicalIndex) }\n\t\t\t: {}),\n\t\t...(projection.publicMessageGroups\n\t\t\t? { publicMessageGroups: projection.publicMessageGroups.map((group) => group.map(canonicalIndex)) }\n\t\t\t: {}),\n\t\t...(projection.pendingPublicMessageGroups\n\t\t\t? {\n\t\t\t\t\tpendingPublicMessageGroups: projection.pendingPublicMessageGroups.map((group) =>\n\t\t\t\t\t\tgroup.map(canonicalIndex),\n\t\t\t\t\t),\n\t\t\t\t}\n\t\t\t: {}),\n\t\t...(projection.encodePublicWindow\n\t\t\t? {\n\t\t\t\t\tencodePublicWindow: (replacements: readonly ProviderRequestPublicMessage[]) => {\n\t\t\t\t\t\tconst encoded = projection.encodePublicWindow!(\n\t\t\t\t\t\t\treplacements.map((replacement) => ({\n\t\t\t\t\t\t\t\t...replacement,\n\t\t\t\t\t\t\t\tmessageIndex: providerMessageIndex(indices, replacement.messageIndex),\n\t\t\t\t\t\t\t})),\n\t\t\t\t\t\t);\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\tencoded && { ...encoded, projection: canonicalRequestProjection(boundary, encoded.projection) }\n\t\t\t\t\t\t);\n\t\t\t\t\t},\n\t\t\t\t}\n\t\t\t: {}),\n\t};\n}\n\nexport function matchesRequestView(\n\tboundary: CapturedRequestViewBoundary,\n\tsource: SourceSnapshotRef,\n\tcontext: Context,\n): boolean {\n\tconst expected = boundary.source;\n\tif (\n\t\texpected.sessionId !== source.sessionId ||\n\t\texpected.sessionFile !== source.sessionFile ||\n\t\texpected.leafId !== source.leafId ||\n\t\texpected.sourceSequence !== source.sourceSequence\n\t)\n\t\treturn false;\n\tconst rendered = convertToLlm([...boundary.messages]);\n\treturn (\n\t\tboundary.messages.length === boundary.units.length &&\n\t\trendered.length === boundary.providerMessageIndices.length &&\n\t\tJSON.stringify(rendered) === JSON.stringify(context.messages)\n\t);\n}\n\n/** Projection kinds describe their actual provider body, never an OpenAI-format route alias. */\nfunction requestInputKey(\n\trequest: ProviderRequestRepresentation,\n\tprojection: ProviderRequestProjection,\n): \"input\" | \"messages\" | undefined {\n\tif (\n\t\t(request.api === \"openai-responses\" || request.api === \"openai-codex-responses\") &&\n\t\t(projection.kind === \"openai-responses-text-v1\" || projection.kind === \"openai-responses-replay-v1\")\n\t)\n\t\treturn \"input\";\n\tif (\n\t\trequest.api === \"openai-completions\" &&\n\t\trequest.provider === \"deepseek\" &&\n\t\trequest.url === \"https://api.deepseek.com/chat/completions\" &&\n\t\tprojection.kind === \"deepseek-completions-text-tools-v1\" &&\n\t\trequest.body !== undefined &&\n\t\tJSON.parse(request.body).model === \"deepseek-flash\"\n\t)\n\t\treturn \"messages\";\n\treturn undefined;\n}\n\n/** A lower bound for compaction: fixed policy, current tail and required recorded evidence. */\nfunction publicBudgetFailure(\n\tboundary: CapturedRequestViewBoundary,\n\tmessages: readonly AgentMessage[],\n\trequest: ProviderRequestRepresentation,\n\tprojection: ProviderRequestProjection,\n\tbudget: RequestTokenBudgetEvaluator,\n\tassessment: RequestTokenAssessment,\n\toriginal: RequestTokenAssessment,\n): PublicContextBudgetError {\n\tconst context = getCanonicalEpochContext(messages)!;\n\tconst source = getCanonicalViewSelectionSource(messages)!;\n\tconst toolEntries = new Set(\n\t\tcontext.toolContinuations?.flatMap((group) => [\n\t\t\tgroup.assistantEntryId,\n\t\t\t...group.calls.flatMap((call) => (call.result ? [call.result.id] : [])),\n\t\t]),\n\t);\n\tlet tailSequence = -1;\n\tfor (const reference of context.references)\n\t\tif (reference && reference.ref.kind !== \"compaction\")\n\t\t\ttailSequence = Math.max(tailSequence, reference.ref.sequence);\n\tconst required = new Set(\n\t\tsource.units.flatMap((unit, index) => {\n\t\t\tconst reference = context.references[index];\n\t\t\treturn [\"task-frame\", \"resource-view\", \"recovery\"].includes(unit.kind) ||\n\t\t\t\tunit.id === \"native-selected-skill-versions\" ||\n\t\t\t\t(reference && (reference.ref.sequence === tailSequence || toolEntries.has(reference.ref.entryId)))\n\t\t\t\t? [index]\n\t\t\t\t: [];\n\t\t}),\n\t);\n\tconst inputKey = requestInputKey(request, projection)!;\n\tconst body = JSON.parse(request.body!) as Record<string, unknown>;\n\tconst input = body[inputKey];\n\tif (!Array.isArray(input) || input.length !== projection.messageIndices.length)\n\t\treturn new PublicContextBudgetError(boundary.source, assessment, original);\n\tconst graph = prepareViewSelection(source.units, boundary.limits);\n\tconst retainedInput = (retained: ReadonlySet<string>) => {\n\t\tconst roots = source.units\n\t\t\t.filter((_, index) => required.has(index) || retained.has(context.references[index]?.ref.entryId ?? \"\"))\n\t\t\t.map((unit) => unit.id);\n\t\tconst selected = new Set(graph.close(roots).map((unit) => unit.id));\n\t\treturn input.filter((_, index) => {\n\t\t\tconst messageIndex = projection.messageIndices[index];\n\t\t\treturn messageIndex === null || selected.has(source.units[messageIndex].id);\n\t\t});\n\t};\n\tconst minimum = withRequestBody(request, JSON.stringify({ ...body, [inputKey]: retainedInput(new Set()) }));\n\treturn new PublicContextBudgetError(\n\t\tboundary.source,\n\t\tassessment,\n\t\toriginal,\n\t\tbudget.measure(minimum),\n\t\t(context.taskFrame?.messages.length ?? 0) > 1,\n\t\tJSON.stringify([\n\t\t\tboundary.source.sessionId,\n\t\t\tboundary.source.sessionFile,\n\t\t\tsource.units.map((unit) => [unit.id, unit.sourceRevision]),\n\t\t\tassessment.api,\n\t\t\tassessment.provider,\n\t\t\tassessment.model,\n\t\t\tassessment.route,\n\t\t\tassessment.profile,\n\t\t\tassessment.availableInputTokens,\n\t\t\tassessment.outputReserveTokens,\n\t\t]),\n\t\t(retained, wrapper) => {\n\t\t\t// Meter only; this synthetic empty summary is never admitted or sent.\n\t\t\tconst summary =\n\t\t\t\tinputKey === \"messages\"\n\t\t\t\t\t? { role: \"user\", content: wrapper }\n\t\t\t\t\t: { role: \"user\", content: [{ type: \"input_text\", text: wrapper }] };\n\t\t\tconst kept = retainedInput(retained);\n\t\t\tconst position = kept.findIndex((item) => item?.role !== \"system\" && item?.role !== \"developer\");\n\t\t\tkept.splice(position < 0 ? kept.length : position, 0, summary);\n\t\t\tconst measured = budget.measure(withRequestBody(request, JSON.stringify({ ...body, [inputKey]: kept })));\n\t\t\treturn measured.status === \"unknown\" ||\n\t\t\t\tmeasured.availableInputTokens === null ||\n\t\t\t\tmeasured.estimatedInputTokens === null\n\t\t\t\t? undefined\n\t\t\t\t: Math.floor(measured.availableInputTokens - measured.estimatedInputTokens);\n\t\t},\n\t);\n}\n\n/** Check the actual final mapping without selecting, converting, or committing another view. */\nexport async function prepareFixedRequestView(\n\tboundary: CapturedRequestViewBoundary,\n\trequest: ProviderRequestRepresentation,\n\tprojection: ProviderRequestProjection,\n\tassessment: RequestTokenAssessment | undefined,\n) {\n\tprojection = canonicalRequestProjection(boundary, projection);\n\tconst inputKey = requestInputKey(request, projection);\n\tconst payload = JSON.parse(request.body!) as Record<string, unknown> | null;\n\tconst input = inputKey && payload ? payload[inputKey] : undefined;\n\tif (!Array.isArray(input) || input.length !== projection.messageIndices.length)\n\t\tthrow new Error(\"Fixed context requires its final provider projection\");\n\tif (\n\t\tprojection.kind === \"openai-responses-text-v1\" &&\n\t\tboundary.messages.some(\n\t\t\t(message) =>\n\t\t\t\tmessage.role === \"toolResult\" ||\n\t\t\t\t(message.role === \"assistant\" && (message.content.length !== 1 || message.content[0].type !== \"text\")),\n\t\t)\n\t)\n\t\tthrow new Error(\"Fixed context requires its native replay adapter\");\n\tconst units = bindMessageReplayUnits(\n\t\tboundary.messages,\n\t\tboundary.units,\n\t\tboundary.limits,\n\t\tprojection.replayContract ?? \"complete-context\",\n\t);\n\tcloseViewSelection(\n\t\tunits,\n\t\tunits.map((unit) => unit.id),\n\t\tboundary.limits,\n\t);\n\treturn await boundary.fixedPrepare!(request, projection, assessment);\n}\n\n/** Reuse the same legal omission policy for native and already-converted public requests. */\nasync function offerOptionalSubset(\n\tmessages: readonly AgentMessage[],\n\tunits: CanonicalViewSelectionSource[\"units\"],\n\tselection: ReturnType<typeof prepareViewSelection>,\n\trequest: ProviderRequestRepresentation,\n\tprojection: ProviderRequestProjection,\n\tbudget: RequestTokenBudgetEvaluator,\n\toffer: (\n\t\tids: readonly string[],\n\t\trequest: ProviderRequestRepresentation,\n\t\tprojection: ProviderRequestProjection,\n\t\tassessment: RequestTokenAssessment,\n\t) => Promise<unknown>,\n): Promise<string | undefined> {\n\tconst inputKey = requestInputKey(request, projection);\n\tif (!inputKey) return;\n\tconst payload = JSON.parse(request.body!) as Record<string, unknown>;\n\tconst input = payload[inputKey];\n\tif (!Array.isArray(input) || input.length !== projection.messageIndices.length) return;\n\tlet latestAssistant = -1;\n\tfor (const [index, message] of messages.entries()) if (message.role === \"assistant\") latestAssistant = index;\n\tconst retained = new Set(projection.messageIndices.slice(0, request.retainedPrefix?.inputItems ?? 0));\n\tconst projectedOptional =\n\t\tprojection.kind !== \"openai-responses-text-v1\" ? new Set(projection.optionalMessageIndices ?? []) : undefined;\n\tconst optional = units.filter((unit, index) => {\n\t\tconst message = messages[index];\n\t\treturn (\n\t\t\tindex !== latestAssistant &&\n\t\t\t!retained.has(index) &&\n\t\t\t(!projectedOptional || projectedOptional.has(index)) &&\n\t\t\tunit.kind === \"literal\" &&\n\t\t\tunit.authority === \"assistant-public\" &&\n\t\t\tmessage.role === \"assistant\" &&\n\t\t\tmessage.stopReason === \"stop\" &&\n\t\t\tmessage.content.length === 1 &&\n\t\t\tmessage.content[0].type === \"text\"\n\t\t);\n\t});\n\tconst generatedPositions = new Map<string, number>();\n\tconst generated =\n\t\tprojection.generatedMessageIndices ??\n\t\tmessages.flatMap((message, index) =>\n\t\t\tmessage.role === \"assistant\" &&\n\t\t\tmessage.content.some((block) => block.type === \"text\" && block.textSignature === undefined)\n\t\t\t\t? [index]\n\t\t\t\t: [],\n\t\t);\n\tfor (const index of generated) generatedPositions.set(units[index].id, index);\n\t// All user inputs, the latest assistant, fixed/TaskFrame/recovery units and errors stay selected.\n\tconst selected = new Set(units.map((unit) => unit.id));\n\tfor (const unit of optional) {\n\t\tselected.delete(unit.id);\n\t\tconst closed = selection.close([...selected]);\n\t\t// Normal Responses rendering uses msg_<message index> for unsigned assistants.\n\t\t// Reject any subset that would change a retained generated item ID on reconstruction.\n\t\tif (closed.some((item, index) => generatedPositions.has(item.id) && generatedPositions.get(item.id) !== index))\n\t\t\tcontinue;\n\t\tconst closedIds = new Set(closed.map((item) => item.id));\n\t\tconst keepItem = (index: number) => {\n\t\t\tconst messageIndex = projection.messageIndices[index];\n\t\t\treturn messageIndex === null || closedIds.has(units[messageIndex].id);\n\t\t};\n\t\tconst body = JSON.stringify({ ...payload, [inputKey]: input.filter((_, index) => keepItem(index)) });\n\t\tconst candidateRequest = { ...request, body };\n\t\tconst assessment = budget.measure(candidateRequest);\n\t\tif (assessment.status !== \"within-estimate\") continue;\n\t\tawait offer(\n\t\t\tclosed.map((item) => item.id),\n\t\t\tcandidateRequest,\n\t\t\t{\n\t\t\t\t...projection,\n\t\t\t\tmessageIndices: projection.messageIndices.filter((_, index) => keepItem(index)),\n\t\t\t\t...(projection.optionalMessageIndices\n\t\t\t\t\t? {\n\t\t\t\t\t\t\toptionalMessageIndices: projection.optionalMessageIndices.filter((index) =>\n\t\t\t\t\t\t\t\tclosedIds.has(units[index].id),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t}\n\t\t\t\t\t: {}),\n\t\t\t\t...(projection.generatedMessageIndices\n\t\t\t\t\t? {\n\t\t\t\t\t\t\tgeneratedMessageIndices: projection.generatedMessageIndices.filter((index) =>\n\t\t\t\t\t\t\t\tclosedIds.has(units[index].id),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t}\n\t\t\t\t\t: {}),\n\t\t\t},\n\t\t\tassessment,\n\t\t);\n\t\treturn body;\n\t}\n\treturn;\n}\n\n/** Only the actual serializer's established replay contract authorizes historical-literal omission. */\nexport async function selectRequestView(\n\tboundary: CapturedRequestViewBoundary,\n\trequest: ProviderRequestRepresentation,\n\tprojection: ProviderRequestProjection,\n\tbudget: RequestTokenBudgetEvaluator | undefined,\n\tallowShrink: boolean,\n\tfinalizeMeasurement?: (\n\t\trequest: ProviderRequestRepresentation,\n\t\tassessment: RequestTokenAssessment | undefined,\n\t) => Promise<RequestTokenAssessment | undefined>,\n): Promise<string | undefined> {\n\tprojection = canonicalRequestProjection(boundary, projection);\n\tlet full = budget?.measure(request);\n\tconst inputKey = requestInputKey(request, projection);\n\tif ((budget && full?.limitSource !== \"explicit-profile\") || !inputKey) return;\n\tif (!budget && !boundary.requiresEpoch && !boundary.pendingPublicMessageGroups?.length) return;\n\tconst payload = JSON.parse(request.body!) as Record<string, unknown>;\n\tconst input = payload[inputKey];\n\tif (!Array.isArray(input) || input.length !== projection.messageIndices.length) return;\n\t// Resolve a near-limit estimate before discarding a stable native prefix. Original\n\t// protected tool groups must first pass their public conversion below.\n\tif (\n\t\tfull?.status === \"over-budget\" &&\n\t\t!boundary.pendingPublicMessageGroups?.length &&\n\t\t!projection.pendingPublicMessageGroups?.length\n\t)\n\t\tfull = (await finalizeMeasurement?.(request, full)) ?? full;\n\n\t// Absence is complete-context; a profile or tool-shaped message is never group authority.\n\tconst replayContract = projection.replayContract ?? \"complete-context\";\n\tif (\n\t\tprojection.kind === \"openai-responses-text-v1\" &&\n\t\tboundary.messages.some(\n\t\t\t(message) =>\n\t\t\t\tmessage.role === \"toolResult\" ||\n\t\t\t\t(message.role === \"assistant\" && (message.content.length !== 1 || message.content[0].type !== \"text\")),\n\t\t)\n\t)\n\t\treturn;\n\tconst units = bindMessageReplayUnits(\n\t\tboundary.messages,\n\t\tboundary.units,\n\t\tboundary.limits,\n\t\treplayContract,\n\t\tboundary.pendingPublicMessageGroups,\n\t);\n\tconst selection = prepareViewSelection(units, boundary.limits);\n\tconst offer = async (\n\t\tselectedUnitIds: readonly string[],\n\t\tcandidateRequest: ProviderRequestRepresentation,\n\t\tcandidateProjection: ProviderRequestProjection,\n\t\tassessment: RequestTokenAssessment | undefined,\n\t\tpublicMessages?: readonly AgentMessage[],\n\t) => {\n\t\tassessment = (await finalizeMeasurement?.(candidateRequest, assessment)) ?? assessment;\n\t\tif (budget && assessment) {\n\t\t\tif (assessment.status === \"over-budget\" && full)\n\t\t\t\tthrow publicBudgetFailure(\n\t\t\t\t\tboundary,\n\t\t\t\t\tpublicMessages ?? boundary.messages,\n\t\t\t\t\tcandidateRequest,\n\t\t\t\t\tcandidateProjection,\n\t\t\t\t\tbudget,\n\t\t\t\t\tassessment,\n\t\t\t\t\tfull,\n\t\t\t\t);\n\t\t\tbudget.assert(assessment);\n\t\t}\n\t\treturn boundary.commit(\n\t\t\tObject.freeze({\n\t\t\t\t...(boundary.responseItemIdentity ? { responseItemIdentity: boundary.responseItemIdentity } : {}),\n\t\t\t\tsource: Object.freeze({ ...boundary.source }),\n\t\t\t\tselectedUnitIds: Object.freeze([...selectedUnitIds]),\n\t\t\t\trequest: Object.freeze({ ...candidateRequest }),\n\t\t\t\tprojection: Object.freeze({\n\t\t\t\t\t...candidateProjection,\n\t\t\t\t\treplayContract,\n\t\t\t\t\tmessageIndices: Object.freeze([...candidateProjection.messageIndices]),\n\t\t\t\t\t...(candidateProjection.optionalMessageIndices\n\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\toptionalMessageIndices: Object.freeze([...candidateProjection.optionalMessageIndices]),\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t: {}),\n\t\t\t\t\t...(candidateProjection.generatedMessageIndices\n\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\tgeneratedMessageIndices: Object.freeze([...candidateProjection.generatedMessageIndices]),\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t: {}),\n\t\t\t\t}),\n\t\t\t\tassessment,\n\t\t\t\toriginalAssessment: full,\n\t\t\t\t...(publicMessages ? { publicMessages } : {}),\n\t\t\t}),\n\t\t);\n\t};\n\tconst offerPublicSubset = async (\n\t\tmessages: readonly AgentMessage[],\n\t\trequest: ProviderRequestRepresentation,\n\t\tprojection: ProviderRequestProjection,\n\t): Promise<string | undefined> => {\n\t\tif (!allowShrink || !budget || replayContract !== \"message-groups\") return;\n\t\tconst source = getCanonicalViewSelectionSource(messages)!;\n\t\tconst units = bindMessageReplayUnits(messages, source.units, boundary.limits, replayContract);\n\t\treturn offerOptionalSubset(\n\t\t\tmessages,\n\t\t\tunits,\n\t\t\tprepareViewSelection(units, boundary.limits),\n\t\t\trequest,\n\t\t\tprojection,\n\t\t\tbudget,\n\t\t\t(ids, candidate, mapping, assessment) => offer(ids, candidate, mapping, assessment, messages),\n\t\t);\n\t};\n\tif (boundary.pendingPublicMessageGroups?.length) {\n\t\tif (\n\t\t\treplayContract !== \"message-groups\" ||\n\t\t\t!projection.publicWindow ||\n\t\t\t!projection.encodePublicWindow ||\n\t\t\tJSON.stringify(projection.pendingPublicMessageGroups) !== JSON.stringify(boundary.pendingPublicMessageGroups)\n\t\t)\n\t\t\tthrow new Error(\"Original tool group requires current native adapter public conversion\");\n\t\tconst publicView = prepareToolContinuationWindow(boundary.messages);\n\t\tconst encoded = projection.encodePublicWindow(publicView.replacements);\n\t\tif (!encoded || encoded.projection.pendingPublicMessageGroups?.length)\n\t\t\tthrow new Error(\"Native adapter did not convert the whole required tool group\");\n\t\tconst publicSource = getCanonicalViewSelectionSource(publicView.messages)!;\n\t\tconst publicUnits = bindMessageReplayUnits(\n\t\t\tpublicView.messages,\n\t\t\tpublicSource.units,\n\t\t\tboundary.limits,\n\t\t\treplayContract,\n\t\t);\n\t\tconst closed = closeViewSelection(\n\t\t\tpublicUnits,\n\t\t\tpublicUnits.map((unit) => unit.id),\n\t\t\tboundary.limits,\n\t\t);\n\t\tlet assessment = budget?.measure(encoded.request);\n\t\tif (assessment?.status === \"over-budget\")\n\t\t\tassessment = (await finalizeMeasurement?.(encoded.request, assessment)) ?? assessment;\n\t\tif (assessment && full) {\n\t\t\tif (assessment.status === \"over-budget\") {\n\t\t\t\tconst subset = await offerPublicSubset(publicView.messages, encoded.request, encoded.projection);\n\t\t\t\tif (subset !== undefined) return subset;\n\t\t\t\tthrow publicBudgetFailure(\n\t\t\t\t\tboundary,\n\t\t\t\t\tpublicView.messages,\n\t\t\t\t\tencoded.request,\n\t\t\t\t\tencoded.projection,\n\t\t\t\t\tbudget!,\n\t\t\t\t\tassessment,\n\t\t\t\t\tfull,\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (assessment.status !== \"within-estimate\")\n\t\t\t\tthrow new Error(\"Tool continuation public request exceeds its token budget\");\n\t\t}\n\t\tawait offer(\n\t\t\tclosed.map((unit) => unit.id),\n\t\t\tencoded.request,\n\t\t\tencoded.projection,\n\t\t\tassessment,\n\t\t\tpublicView.messages,\n\t\t);\n\t\treturn encoded.request.body;\n\t}\n\tif (projection.pendingPublicMessageGroups?.length)\n\t\tthrow new Error(\"Adapter pending group has no original owned source plan\");\n\t// Without a configured budget, admit only the exact full native view. Never shrink it.\n\tif (!budget) {\n\t\tconst closed = selection.close(units.map((unit) => unit.id));\n\t\tawait offer(\n\t\t\tclosed.map((unit) => unit.id),\n\t\t\trequest,\n\t\t\tprojection,\n\t\t\tundefined,\n\t\t);\n\t\treturn request.body;\n\t}\n\tif (!full) return;\n\tconst offerPublicWindow = async (): Promise<string | undefined> => {\n\t\tif (\n\t\t\t!allowShrink ||\n\t\t\treplayContract !== \"message-groups\" ||\n\t\t\t!projection.publicWindow ||\n\t\t\t!projection.encodePublicWindow\n\t\t)\n\t\t\treturn;\n\t\tconst closed = selection.close(units.map((unit) => unit.id));\n\t\tlet firstMessageIndex = 0;\n\t\tif (\n\t\t\tfull.status === \"unknown\" &&\n\t\t\tfull.unknown.length === 1 &&\n\t\t\tfull.unknown[0] === \"media, opaque or unsupported replay token coverage unknown\"\n\t\t) {\n\t\t\t// Credited items are not part of the unknown input. Keep original projection indices.\n\t\t\tconst firstUnmeteredItem = request.retainedPrefix?.inputItems ?? 0;\n\t\t\tconst reasoningItemIndex = input.findIndex(\n\t\t\t\t(item, index) => index >= firstUnmeteredItem && item?.type === \"reasoning\",\n\t\t\t);\n\t\t\tconst messageIndex = projection.messageIndices[reasoningItemIndex];\n\t\t\tconst group =\n\t\t\t\tmessageIndex == null\n\t\t\t\t\t? undefined\n\t\t\t\t\t: projection.publicMessageGroups?.find((members) => members.includes(messageIndex));\n\t\t\t// The adapter still accepts only complete groups; earlier meterable groups stay native.\n\t\t\tfirstMessageIndex = group ? Math.min(...group) : 0;\n\t\t}\n\t\tconst publicView = preparePublicContextWindow(boundary.messages, firstMessageIndex);\n\t\tif (!publicView) {\n\t\t\t// Keep the original measured refusal when no public conversion can be offered.\n\t\t\t// This is not a new recovery signal or permission to reprepare again.\n\t\t\tif (full.status === \"over-budget\") throw new RequestTokenBudgetError(full);\n\t\t\treturn;\n\t\t}\n\t\tconst encoded = projection.encodePublicWindow(publicView.replacements);\n\t\tif (!encoded) return;\n\t\tlet assessment = budget.measure(encoded.request);\n\t\tif (assessment.status === \"over-budget\")\n\t\t\tassessment = (await finalizeMeasurement?.(encoded.request, assessment)) ?? assessment;\n\t\tif (assessment.status === \"over-budget\") {\n\t\t\tconst subset = await offerPublicSubset(publicView.messages, encoded.request, encoded.projection);\n\t\t\tif (subset !== undefined) return subset;\n\t\t\tthrow publicBudgetFailure(\n\t\t\t\tboundary,\n\t\t\t\tpublicView.messages,\n\t\t\t\tencoded.request,\n\t\t\t\tencoded.projection,\n\t\t\t\tbudget,\n\t\t\t\tassessment,\n\t\t\t\tfull,\n\t\t\t);\n\t\t}\n\t\tif (assessment.status !== \"within-estimate\") return;\n\t\tawait offer(\n\t\t\tclosed.map((unit) => unit.id),\n\t\t\tencoded.request,\n\t\t\tencoded.projection,\n\t\t\tassessment,\n\t\t\tpublicView.messages,\n\t\t);\n\t\treturn encoded.request.body;\n\t};\n\tif (full.status === \"within-estimate\") {\n\t\tconst closed = selection.close(units.map((unit) => unit.id));\n\t\tawait offer(\n\t\t\tclosed.map((unit) => unit.id),\n\t\t\trequest,\n\t\t\tprojection,\n\t\t\tfull,\n\t\t);\n\t\treturn request.body;\n\t}\n\tif (!allowShrink || replayContract !== \"message-groups\") return;\n\tif (full.status !== \"over-budget\") return offerPublicWindow();\n\tconst subset = await offerOptionalSubset(boundary.messages, units, selection, request, projection, budget, offer);\n\tif (subset !== undefined) return subset;\n\treturn offerPublicWindow();\n}\n"]}
@@ -0,0 +1,28 @@
1
+ export declare const RETAINED_OUTPUT_FIELD = "/message/content/0/text";
2
+ export declare const TOOL_OUTPUT_PREVIEW_BYTES: number;
3
+ export declare const PUBLIC_TEXT_WINDOW_BYTES: number;
4
+ export interface RetainedToolOutput {
5
+ artifactId: string;
6
+ field: typeof RETAINED_OUTPUT_FIELD;
7
+ byteLength: number;
8
+ /** False when upstream already discarded output, or capture completeness was not reported. */
9
+ captureComplete: boolean;
10
+ }
11
+ export declare function retainedToolOutput(value: unknown): RetainedToolOutput | undefined;
12
+ /** Plain UTF-8 logs in the existing session artifact directory, published only after close. */
13
+ export declare function retainToolOutput(directory: string, parts: readonly string[], captureComplete: boolean): Promise<RetainedToolOutput>;
14
+ export declare function decodedTextWindow(text: string, startByte?: number, endByte?: number): {
15
+ text: string;
16
+ startByte: number;
17
+ endByte: number;
18
+ };
19
+ /** A bounded decoded-text byte window; no JSON event or complete artifact is materialized. */
20
+ export declare function readRetainedToolOutput(directory: string, descriptor: RetainedToolOutput, startByte: number, maxBytes: number): Promise<{
21
+ text: string;
22
+ startByte: number;
23
+ endByte: number;
24
+ sourceBytes: number;
25
+ }>;
26
+ /** Bound before encoding, so preview generation never copies a giant string to a second buffer. */
27
+ export declare function outputExcerpt(text: string | undefined, maxBytes: number): string | undefined;
28
+ //# sourceMappingURL=retained-tool-output.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retained-tool-output.d.ts","sourceRoot":"","sources":["../../src/core/retained-tool-output.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,qBAAqB,4BAA4B,CAAC;AAC/D,eAAO,MAAM,yBAAyB,QAAW,CAAC;AAClD,eAAO,MAAM,wBAAwB,QAAY,CAAC;AAElD,MAAM,WAAW,kBAAkB;IAClC,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,OAAO,qBAAqB,CAAC;IACpC,UAAU,EAAE,MAAM,CAAC;IACnB,8FAA8F;IAC9F,eAAe,EAAE,OAAO,CAAC;CACzB;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,GAAG,kBAAkB,GAAG,SAAS,CAWjF;AAED,+FAA+F;AAC/F,wBAAsB,gBAAgB,CACrC,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,SAAS,MAAM,EAAE,EACxB,eAAe,EAAE,OAAO,GACtB,OAAO,CAAC,kBAAkB,CAAC,CAoB7B;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,SAAI,EAAE,OAAO,SAA0B;;;;EAQ/F;AAED,8FAA8F;AAC9F,wBAAsB,sBAAsB,CAC3C,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,kBAAkB,EAC9B,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM;;;;;GA4BhB;AAED,mGAAmG;AACnG,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAS5F","sourcesContent":["import { randomUUID } from \"node:crypto\";\nimport { mkdir, open } from \"node:fs/promises\";\nimport { join } from \"node:path\";\n\nexport const RETAINED_OUTPUT_FIELD = \"/message/content/0/text\";\nexport const TOOL_OUTPUT_PREVIEW_BYTES = 8 * 1024;\nexport const PUBLIC_TEXT_WINDOW_BYTES = 64 * 1024;\n\nexport interface RetainedToolOutput {\n\tartifactId: string;\n\tfield: typeof RETAINED_OUTPUT_FIELD;\n\tbyteLength: number;\n\t/** False when upstream already discarded output, or capture completeness was not reported. */\n\tcaptureComplete: boolean;\n}\n\nexport function retainedToolOutput(value: unknown): RetainedToolOutput | undefined {\n\tif (!value || typeof value !== \"object\") return undefined;\n\tconst item = value as RetainedToolOutput;\n\treturn typeof item.artifactId === \"string\" &&\n\t\t/^[0-9a-f-]{36}\\.log$/.test(item.artifactId) &&\n\t\titem.field === RETAINED_OUTPUT_FIELD &&\n\t\tNumber.isSafeInteger(item.byteLength) &&\n\t\titem.byteLength >= 0 &&\n\t\ttypeof item.captureComplete === \"boolean\"\n\t\t? item\n\t\t: undefined;\n}\n\n/** Plain UTF-8 logs in the existing session artifact directory, published only after close. */\nexport async function retainToolOutput(\n\tdirectory: string,\n\tparts: readonly string[],\n\tcaptureComplete: boolean,\n): Promise<RetainedToolOutput> {\n\tawait mkdir(directory, { recursive: true, mode: 0o700 });\n\tconst descriptor: RetainedToolOutput = {\n\t\tartifactId: `${randomUUID()}.log`,\n\t\tfield: RETAINED_OUTPUT_FIELD,\n\t\tbyteLength: 0,\n\t\tcaptureComplete,\n\t};\n\tconst file = await open(join(directory, descriptor.artifactId), \"wx\", 0o600);\n\ttry {\n\t\tfor (const part of parts) {\n\t\t\tconst bytes = Buffer.from(part);\n\t\t\tlet offset = 0;\n\t\t\twhile (offset < bytes.length) offset += (await file.write(bytes, offset)).bytesWritten;\n\t\t\tdescriptor.byteLength += bytes.length;\n\t\t}\n\t} finally {\n\t\tawait file.close();\n\t}\n\treturn descriptor;\n}\n\nexport function decodedTextWindow(text: string, startByte = 0, endByte = Buffer.byteLength(text)) {\n\tconst bytes = Buffer.from(text);\n\tlet start = Math.min(startByte, bytes.length);\n\tlet end = Math.min(endByte, bytes.length);\n\twhile (start < bytes.length && (bytes[start] & 0xc0) === 0x80) start++;\n\twhile (end > start && end < bytes.length && (bytes[end] & 0xc0) === 0x80) end--;\n\tend = Math.max(start, end);\n\treturn { text: bytes.subarray(start, end).toString(\"utf8\"), startByte: start, endByte: end };\n}\n\n/** A bounded decoded-text byte window; no JSON event or complete artifact is materialized. */\nexport async function readRetainedToolOutput(\n\tdirectory: string,\n\tdescriptor: RetainedToolOutput,\n\tstartByte: number,\n\tmaxBytes: number,\n) {\n\tconst file = await open(join(directory, descriptor.artifactId), \"r\");\n\ttry {\n\t\tconst stat = await file.stat();\n\t\tif (stat.size !== descriptor.byteLength) throw new Error(\"Retained output is unavailable\");\n\t\tconst start = Math.min(startByte, stat.size);\n\t\tconst bytes = Buffer.alloc(Math.min(maxBytes + 4, stat.size - start));\n\t\tlet length = 0;\n\t\twhile (length < bytes.length) {\n\t\t\tconst read = await file.read(bytes, length, bytes.length - length, start + length);\n\t\t\tif (read.bytesRead === 0) throw new Error(\"Retained output is unavailable\");\n\t\t\tlength += read.bytesRead;\n\t\t}\n\t\tlet begin = 0;\n\t\twhile (begin < length && (bytes[begin] & 0xc0) === 0x80) begin++;\n\t\tlet end = Math.min(maxBytes, length);\n\t\twhile (end > begin && end < length && (bytes[end] & 0xc0) === 0x80) end--;\n\t\tend = Math.max(begin, end);\n\t\treturn {\n\t\t\ttext: bytes.subarray(begin, end).toString(\"utf8\"),\n\t\t\tstartByte: start + begin,\n\t\t\tendByte: start + end,\n\t\t\tsourceBytes: length,\n\t\t};\n\t} finally {\n\t\tawait file.close();\n\t}\n}\n\n/** Bound before encoding, so preview generation never copies a giant string to a second buffer. */\nexport function outputExcerpt(text: string | undefined, maxBytes: number): string | undefined {\n\tif (text === undefined) return undefined;\n\tif (Buffer.byteLength(text) <= maxBytes) return text;\n\tconst marker = \"\\n[... omitted; read retained output ...]\\n\";\n\tconst allowance = Math.max(0, Math.floor((maxBytes - Buffer.byteLength(marker)) / 2));\n\tconst head = decodedTextWindow(text.slice(0, allowance + 2), 0, allowance).text;\n\tconst tail = text.slice(-allowance - 2);\n\tconst tailBytes = Buffer.byteLength(tail);\n\treturn head + marker + decodedTextWindow(tail, Math.max(0, tailBytes - allowance), tailBytes).text;\n}\n"]}
@@ -0,0 +1,102 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { mkdir, open } from "node:fs/promises";
3
+ import { join } from "node:path";
4
+ export const RETAINED_OUTPUT_FIELD = "/message/content/0/text";
5
+ export const TOOL_OUTPUT_PREVIEW_BYTES = 8 * 1024;
6
+ export const PUBLIC_TEXT_WINDOW_BYTES = 64 * 1024;
7
+ export function retainedToolOutput(value) {
8
+ if (!value || typeof value !== "object")
9
+ return undefined;
10
+ const item = value;
11
+ return typeof item.artifactId === "string" &&
12
+ /^[0-9a-f-]{36}\.log$/.test(item.artifactId) &&
13
+ item.field === RETAINED_OUTPUT_FIELD &&
14
+ Number.isSafeInteger(item.byteLength) &&
15
+ item.byteLength >= 0 &&
16
+ typeof item.captureComplete === "boolean"
17
+ ? item
18
+ : undefined;
19
+ }
20
+ /** Plain UTF-8 logs in the existing session artifact directory, published only after close. */
21
+ export async function retainToolOutput(directory, parts, captureComplete) {
22
+ await mkdir(directory, { recursive: true, mode: 0o700 });
23
+ const descriptor = {
24
+ artifactId: `${randomUUID()}.log`,
25
+ field: RETAINED_OUTPUT_FIELD,
26
+ byteLength: 0,
27
+ captureComplete,
28
+ };
29
+ const file = await open(join(directory, descriptor.artifactId), "wx", 0o600);
30
+ try {
31
+ for (const part of parts) {
32
+ const bytes = Buffer.from(part);
33
+ let offset = 0;
34
+ while (offset < bytes.length)
35
+ offset += (await file.write(bytes, offset)).bytesWritten;
36
+ descriptor.byteLength += bytes.length;
37
+ }
38
+ }
39
+ finally {
40
+ await file.close();
41
+ }
42
+ return descriptor;
43
+ }
44
+ export function decodedTextWindow(text, startByte = 0, endByte = Buffer.byteLength(text)) {
45
+ const bytes = Buffer.from(text);
46
+ let start = Math.min(startByte, bytes.length);
47
+ let end = Math.min(endByte, bytes.length);
48
+ while (start < bytes.length && (bytes[start] & 0xc0) === 0x80)
49
+ start++;
50
+ while (end > start && end < bytes.length && (bytes[end] & 0xc0) === 0x80)
51
+ end--;
52
+ end = Math.max(start, end);
53
+ return { text: bytes.subarray(start, end).toString("utf8"), startByte: start, endByte: end };
54
+ }
55
+ /** A bounded decoded-text byte window; no JSON event or complete artifact is materialized. */
56
+ export async function readRetainedToolOutput(directory, descriptor, startByte, maxBytes) {
57
+ const file = await open(join(directory, descriptor.artifactId), "r");
58
+ try {
59
+ const stat = await file.stat();
60
+ if (stat.size !== descriptor.byteLength)
61
+ throw new Error("Retained output is unavailable");
62
+ const start = Math.min(startByte, stat.size);
63
+ const bytes = Buffer.alloc(Math.min(maxBytes + 4, stat.size - start));
64
+ let length = 0;
65
+ while (length < bytes.length) {
66
+ const read = await file.read(bytes, length, bytes.length - length, start + length);
67
+ if (read.bytesRead === 0)
68
+ throw new Error("Retained output is unavailable");
69
+ length += read.bytesRead;
70
+ }
71
+ let begin = 0;
72
+ while (begin < length && (bytes[begin] & 0xc0) === 0x80)
73
+ begin++;
74
+ let end = Math.min(maxBytes, length);
75
+ while (end > begin && end < length && (bytes[end] & 0xc0) === 0x80)
76
+ end--;
77
+ end = Math.max(begin, end);
78
+ return {
79
+ text: bytes.subarray(begin, end).toString("utf8"),
80
+ startByte: start + begin,
81
+ endByte: start + end,
82
+ sourceBytes: length,
83
+ };
84
+ }
85
+ finally {
86
+ await file.close();
87
+ }
88
+ }
89
+ /** Bound before encoding, so preview generation never copies a giant string to a second buffer. */
90
+ export function outputExcerpt(text, maxBytes) {
91
+ if (text === undefined)
92
+ return undefined;
93
+ if (Buffer.byteLength(text) <= maxBytes)
94
+ return text;
95
+ const marker = "\n[... omitted; read retained output ...]\n";
96
+ const allowance = Math.max(0, Math.floor((maxBytes - Buffer.byteLength(marker)) / 2));
97
+ const head = decodedTextWindow(text.slice(0, allowance + 2), 0, allowance).text;
98
+ const tail = text.slice(-allowance - 2);
99
+ const tailBytes = Buffer.byteLength(tail);
100
+ return head + marker + decodedTextWindow(tail, Math.max(0, tailBytes - allowance), tailBytes).text;
101
+ }
102
+ //# sourceMappingURL=retained-tool-output.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retained-tool-output.js","sourceRoot":"","sources":["../../src/core/retained-tool-output.ts"],"names":[],"mappings":"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","sourcesContent":["import { randomUUID } from \"node:crypto\";\nimport { mkdir, open } from \"node:fs/promises\";\nimport { join } from \"node:path\";\n\nexport const RETAINED_OUTPUT_FIELD = \"/message/content/0/text\";\nexport const TOOL_OUTPUT_PREVIEW_BYTES = 8 * 1024;\nexport const PUBLIC_TEXT_WINDOW_BYTES = 64 * 1024;\n\nexport interface RetainedToolOutput {\n\tartifactId: string;\n\tfield: typeof RETAINED_OUTPUT_FIELD;\n\tbyteLength: number;\n\t/** False when upstream already discarded output, or capture completeness was not reported. */\n\tcaptureComplete: boolean;\n}\n\nexport function retainedToolOutput(value: unknown): RetainedToolOutput | undefined {\n\tif (!value || typeof value !== \"object\") return undefined;\n\tconst item = value as RetainedToolOutput;\n\treturn typeof item.artifactId === \"string\" &&\n\t\t/^[0-9a-f-]{36}\\.log$/.test(item.artifactId) &&\n\t\titem.field === RETAINED_OUTPUT_FIELD &&\n\t\tNumber.isSafeInteger(item.byteLength) &&\n\t\titem.byteLength >= 0 &&\n\t\ttypeof item.captureComplete === \"boolean\"\n\t\t? item\n\t\t: undefined;\n}\n\n/** Plain UTF-8 logs in the existing session artifact directory, published only after close. */\nexport async function retainToolOutput(\n\tdirectory: string,\n\tparts: readonly string[],\n\tcaptureComplete: boolean,\n): Promise<RetainedToolOutput> {\n\tawait mkdir(directory, { recursive: true, mode: 0o700 });\n\tconst descriptor: RetainedToolOutput = {\n\t\tartifactId: `${randomUUID()}.log`,\n\t\tfield: RETAINED_OUTPUT_FIELD,\n\t\tbyteLength: 0,\n\t\tcaptureComplete,\n\t};\n\tconst file = await open(join(directory, descriptor.artifactId), \"wx\", 0o600);\n\ttry {\n\t\tfor (const part of parts) {\n\t\t\tconst bytes = Buffer.from(part);\n\t\t\tlet offset = 0;\n\t\t\twhile (offset < bytes.length) offset += (await file.write(bytes, offset)).bytesWritten;\n\t\t\tdescriptor.byteLength += bytes.length;\n\t\t}\n\t} finally {\n\t\tawait file.close();\n\t}\n\treturn descriptor;\n}\n\nexport function decodedTextWindow(text: string, startByte = 0, endByte = Buffer.byteLength(text)) {\n\tconst bytes = Buffer.from(text);\n\tlet start = Math.min(startByte, bytes.length);\n\tlet end = Math.min(endByte, bytes.length);\n\twhile (start < bytes.length && (bytes[start] & 0xc0) === 0x80) start++;\n\twhile (end > start && end < bytes.length && (bytes[end] & 0xc0) === 0x80) end--;\n\tend = Math.max(start, end);\n\treturn { text: bytes.subarray(start, end).toString(\"utf8\"), startByte: start, endByte: end };\n}\n\n/** A bounded decoded-text byte window; no JSON event or complete artifact is materialized. */\nexport async function readRetainedToolOutput(\n\tdirectory: string,\n\tdescriptor: RetainedToolOutput,\n\tstartByte: number,\n\tmaxBytes: number,\n) {\n\tconst file = await open(join(directory, descriptor.artifactId), \"r\");\n\ttry {\n\t\tconst stat = await file.stat();\n\t\tif (stat.size !== descriptor.byteLength) throw new Error(\"Retained output is unavailable\");\n\t\tconst start = Math.min(startByte, stat.size);\n\t\tconst bytes = Buffer.alloc(Math.min(maxBytes + 4, stat.size - start));\n\t\tlet length = 0;\n\t\twhile (length < bytes.length) {\n\t\t\tconst read = await file.read(bytes, length, bytes.length - length, start + length);\n\t\t\tif (read.bytesRead === 0) throw new Error(\"Retained output is unavailable\");\n\t\t\tlength += read.bytesRead;\n\t\t}\n\t\tlet begin = 0;\n\t\twhile (begin < length && (bytes[begin] & 0xc0) === 0x80) begin++;\n\t\tlet end = Math.min(maxBytes, length);\n\t\twhile (end > begin && end < length && (bytes[end] & 0xc0) === 0x80) end--;\n\t\tend = Math.max(begin, end);\n\t\treturn {\n\t\t\ttext: bytes.subarray(begin, end).toString(\"utf8\"),\n\t\t\tstartByte: start + begin,\n\t\t\tendByte: start + end,\n\t\t\tsourceBytes: length,\n\t\t};\n\t} finally {\n\t\tawait file.close();\n\t}\n}\n\n/** Bound before encoding, so preview generation never copies a giant string to a second buffer. */\nexport function outputExcerpt(text: string | undefined, maxBytes: number): string | undefined {\n\tif (text === undefined) return undefined;\n\tif (Buffer.byteLength(text) <= maxBytes) return text;\n\tconst marker = \"\\n[... omitted; read retained output ...]\\n\";\n\tconst allowance = Math.max(0, Math.floor((maxBytes - Buffer.byteLength(marker)) / 2));\n\tconst head = decodedTextWindow(text.slice(0, allowance + 2), 0, allowance).text;\n\tconst tail = text.slice(-allowance - 2);\n\tconst tailBytes = Buffer.byteLength(tail);\n\treturn head + marker + decodedTextWindow(tail, Math.max(0, tailBytes - allowance), tailBytes).text;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"sdk.d.ts","sourceRoot":"","sources":["../../src/core/sdk.ts"],"names":[],"mappings":"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","sourcesContent":["import { join } from \"node:path\";\nimport { Agent, type AgentMessage, type AgentOutputLimits, type ThinkingLevel } from \"@ponythewhite/base-context-agent\";\nimport { clampThinkingLevel, type Message, type Model, supportsFastMode } from \"@ponythewhite/base-context-ai\";\nimport { getAgentDir } from \"../config.js\";\nimport { AgentSession } from \"./agent-session.js\";\nimport type { AgentSessionCreationOptions } from \"./agent-session-services.js\";\nimport { formatNoModelsAvailableMessage } from \"./auth-guidance.js\";\nimport { AuthStorage } from \"./auth-storage.js\";\nimport type { AgentAutonomousConfig } from \"./autonomous.js\";\nimport { DEFAULT_THINKING_LEVEL } from \"./defaults.js\";\nimport type { ExtensionRunner, LoadExtensionsResult, SessionStartEvent, ToolDefinition } from \"./extensions/index.js\";\nimport { createNativeInferenceStream } from \"./inference-coordinator.js\";\nimport { McpManager } from \"./mcp/mcp-manager.js\";\nimport { convertToLlm } from \"./messages.js\";\nimport { ModelRegistry } from \"./model-registry.js\";\nimport { findInitialModel } from \"./model-resolver.js\";\nimport type { ResourceLoader } from \"./resource-loader.js\";\nimport { DefaultResourceLoader } from \"./resource-loader.js\";\nimport { readSessionBootstrap } from \"./session-bootstrap.js\";\nimport { getDefaultSessionDir, SessionManager } from \"./session-manager.js\";\nimport { SettingsManager } from \"./settings-manager.js\";\nimport { time } from \"./timings.js\";\nimport {\n\tcreateBashTool,\n\tcreateEditTool,\n\tcreateIpythonTool,\n\tcreatePrimeContextTool,\n\twithFileMutationQueue,\n} from \"./tools/index.js\";\n\nexport interface CreateAgentSessionOptions extends AgentSessionCreationOptions {\n\t/** Working directory for project-local discovery. Default: process.cwd() */\n\tcwd?: string;\n\t/** Global config directory. Default: ~/.base-context */\n\tagentDir?: string;\n\n\t/** Auth storage for credentials. Default: AuthStorage.create(agentDir/auth.json).\n\t * Existing host Codex subscriptions can be injected with\n\t * AuthStorage.fromStorage(readOnlyBackend, { existingOpenAICodexSubscription: true }).\n\t * This retains the built-in owned dispatcher; it does not enable OAuth login/refresh.\n\t */\n\tauthStorage?: AuthStorage;\n\t/** Model registry. Default: ModelRegistry.create(authStorage, agentDir/models.json) */\n\tmodelRegistry?: ModelRegistry;\n\n\t/** Model to use. Undefined restores a saved explicit choice; null leaves the session unselected. */\n\tmodel?: Model<any> | null;\n\t/** Thinking level. Default: from settings, else 'medium' (clamped to model capabilities) */\n\tthinkingLevel?: ThinkingLevel;\n\t/** Models available for cycling (Ctrl+P in interactive mode) */\n\tscopedModels?: Array<{ model: Model<any>; thinkingLevel?: ThinkingLevel }>;\n\n\t/**\n\t * Optional default tool suppression mode when no explicit allowlist is provided.\n\t *\n\t * - \"all\": start with no tools enabled\n\t * - \"builtin\": disable the default built-in tools (ipython and prime_context)\n\t * but keep extension/custom tools enabled\n\t */\n\tnoTools?: \"all\" | \"builtin\";\n\t/**\n\t * Optional allowlist of tool names.\n\t *\n\t * When omitted, Base Context enables the default built-in tools (ipython and prime_context)\n\t * and leaves extension/custom tools enabled unless `noTools` changes that default.\n\t * When provided, only the listed tool names are enabled.\n\t */\n\ttools?: string[];\n\t/** Custom tools to register (in addition to built-in tools). */\n\tcustomTools?: ToolDefinition[];\n\n\t/** Resource loader. When omitted, DefaultResourceLoader is used. */\n\tresourceLoader?: ResourceLoader;\n\n\t/** MCP integration manager. When omitted, MCP host handlers are not wired. */\n\tmcpManager?: McpManager;\n\n\t/** Session manager. Default: SessionManager.create(cwd) */\n\tsessionManager?: SessionManager;\n\n\t/** Override complete native invocation output limits from settings. */\n\tinvocationOutputLimits?: AgentOutputLimits;\n\t/** Settings manager. Default: SettingsManager.create(cwd, agentDir) */\n\tsettingsManager?: SettingsManager;\n\t/** Session start event metadata for extension runtime startup. */\n\tsessionStartEvent?: SessionStartEvent;\n\t/** Host-side autonomous continuation policy. */\n\tautonomous?: AgentAutonomousConfig;\n}\n\n/** Result from createAgentSession */\nexport interface CreateAgentSessionResult {\n\t/** The created session */\n\tsession: AgentSession;\n\t/** Extensions result (for UI context setup in interactive mode) */\n\textensionsResult: LoadExtensionsResult;\n\t/** Diagnostic when the selected session or saved model cannot be used. */\n\tmodelFallbackMessage?: string;\n}\n\nexport type { AgentSessionRuntimeConfig } from \"./agent-session-config.js\";\nexport * from \"./agent-session-runtime.js\";\nexport type { AgentSessionCreationOptions } from \"./agent-session-services.js\";\nexport type {\n\tExtensionAPI,\n\tExtensionCommandContext,\n\tExtensionContext,\n\tExtensionFactory,\n\tSlashCommandInfo,\n\tSlashCommandSource,\n\tToolDefinition,\n} from \"./extensions/index.js\";\nexport type { PromptTemplate } from \"./prompt-templates.js\";\nexport type {\n\tRlmMaxSubagentsStatus,\n\tRlmRootAdmission,\n\tRlmSubagentCapacity,\n\tRlmSubagentCapacityReservation,\n} from \"./rlm-max-subagents.js\";\nexport type {\n\tCreateRlmSubagentRuntimeOptions,\n\tRlmChildAdmission,\n\tRlmSubagentRuntime,\n\tSubagentRuntimeHost,\n} from \"./rlm-runtime.js\";\nexport type { Skill } from \"./skills.js\";\nexport type { Tool } from \"./tools/index.js\";\n\nexport { createBashTool, createEditTool, createIpythonTool, createPrimeContextTool, withFileMutationQueue };\n\nfunction getDefaultAgentDir(): string {\n\treturn getAgentDir();\n}\n\n/**\n * Create an AgentSession with the specified options.\n *\n * @example\n * ```typescript\n * // Minimal - uses defaults\n * const { session } = await createAgentSession();\n *\n * // With explicit model\n * import { getModel } from '@ponythewhite/base-context-ai';\n * const { session } = await createAgentSession({\n * model: getModel('anthropic', 'claude-opus-4-5'),\n * thinkingLevel: 'high',\n * });\n *\n * // Continue previous session\n * const { session, modelFallbackMessage } = await createAgentSession({\n * continueSession: true,\n * });\n *\n * // Full control\n * const loader = new DefaultResourceLoader({\n * cwd: process.cwd(),\n * agentDir: getAgentDir(),\n * settingsManager: SettingsManager.create(),\n * });\n * await loader.reload();\n * const { session } = await createAgentSession({\n * model: myModel,\n * tools: [\"ipython\"],\n * resourceLoader: loader,\n * sessionManager: SessionManager.inMemory(),\n * });\n * ```\n */\nexport async function createAgentSession(options: CreateAgentSessionOptions = {}): Promise<CreateAgentSessionResult> {\n\tconst contextMode = options.contextMode;\n\tif (options.requestTokenBudget)\n\t\toptions = { ...options, requestTokenBudget: structuredClone(options.requestTokenBudget) };\n\tconst cwd = options.cwd ?? options.sessionManager?.getCwd() ?? process.cwd();\n\tconst agentDir = options.agentDir ?? getDefaultAgentDir();\n\tlet resourceLoader = options.resourceLoader;\n\n\tconst authPath = options.agentDir ? join(agentDir, \"auth.json\") : undefined;\n\tconst modelsPath = options.agentDir ? join(agentDir, \"models.json\") : undefined;\n\tconst authStorage = options.authStorage ?? AuthStorage.create(authPath);\n\tconst modelRegistry = options.modelRegistry ?? ModelRegistry.create(authStorage, modelsPath);\n\n\tconst settingsManager = options.settingsManager ?? SettingsManager.create(cwd, agentDir);\n\tconst sessionManager =\n\t\toptions.sessionManager ?? (await SessionManager.create(cwd, getDefaultSessionDir(cwd, agentDir)));\n\n\tlet session: AgentSession | undefined;\n\ttry {\n\t\t// Ensure MCP providers are registered and built-in MCP skills are gated by\n\t\t// auth even on the bare SDK path (not just the CLI's createAgentSessionServices).\n\t\tconst mcpManager =\n\t\t\toptions.mcpManager ??\n\t\t\tnew McpManager({ authStorage, getUserServers: () => settingsManager.getGlobalMcpServers() });\n\t\tmodelRegistry.setOnOAuthProvidersReset(() => mcpManager.registerUserProviders());\n\n\t\tif (!resourceLoader) {\n\t\t\tresourceLoader = new DefaultResourceLoader({\n\t\t\t\tcwd,\n\t\t\t\tagentDir,\n\t\t\t\tsettingsManager,\n\t\t\t\textraBuiltinSkillOverrides: () => mcpManager.getDisabledBuiltinSkillOverrides(),\n\t\t\t});\n\t\t\tawait resourceLoader.reload();\n\t\t\ttime(\"resourceLoader.reload\");\n\t\t}\n\n\t\tconst {\n\t\t\tcontext: existingSession,\n\t\t\thasExistingSession,\n\t\t\thasThinkingEntry,\n\t\t\thasServiceTierEntry,\n\t\t} = await readSessionBootstrap(sessionManager, settingsManager.getCanonicalContextLimits(), {\n\t\t\tallowPendingToolPublic: options.requestTokenBudget !== undefined,\n\t\t\tinitialContextMode: contextMode ?? settingsManager.getContextMode(),\n\t\t});\n\n\t\tlet model = options.model ?? undefined;\n\t\tlet modelFallbackMessage: string | undefined;\n\n\t\tif (options.model === undefined && hasExistingSession && existingSession.model) {\n\t\t\tconst saved = existingSession.model;\n\t\t\tconst restoredModel = modelRegistry.find(saved.provider, saved.modelId);\n\t\t\tmodel = restoredModel;\n\t\t\tif (!restoredModel) {\n\t\t\t\tmodelFallbackMessage = `Could not restore model ${saved.provider}/${saved.modelId}. Use /model to select a supported model.`;\n\t\t\t} else if (!modelRegistry.hasConfiguredAuth(restoredModel)) {\n\t\t\t\tmodelFallbackMessage = `Selected model ${saved.provider}/${saved.modelId} needs authentication. Use /login to configure this provider.`;\n\t\t\t}\n\t\t} else if (options.model === undefined) {\n\t\t\tconst result = await findInitialModel({\n\t\t\t\tscopedModels: [],\n\t\t\t\tisContinuing: hasExistingSession,\n\t\t\t\tdefaultProvider: settingsManager.getDefaultProvider(),\n\t\t\t\tdefaultModelId: settingsManager.getDefaultModel(),\n\t\t\t\tdefaultThinkingLevel: settingsManager.getDefaultThinkingLevel(),\n\t\t\t\tmodelRegistry,\n\t\t\t});\n\t\t\tmodel = result.model;\n\t\t\tif (model && !modelRegistry.hasConfiguredAuth(model)) {\n\t\t\t\tmodelFallbackMessage = `Selected model ${model.provider}/${model.id} needs authentication. Use /login to configure this provider.`;\n\t\t\t} else if (!model) {\n\t\t\t\tconst provider = settingsManager.getDefaultProvider();\n\t\t\t\tconst modelId = settingsManager.getDefaultModel();\n\t\t\t\tmodelFallbackMessage =\n\t\t\t\t\tprovider && modelId\n\t\t\t\t\t\t? `Selected model ${provider}/${modelId} is unavailable. Use /model to select a supported model.`\n\t\t\t\t\t\t: formatNoModelsAvailableMessage();\n\t\t\t}\n\t\t}\n\n\t\tlet thinkingLevel = options.thinkingLevel;\n\n\t\tif (thinkingLevel === undefined && hasExistingSession) {\n\t\t\tthinkingLevel = hasThinkingEntry\n\t\t\t\t? (existingSession.thinkingLevel as ThinkingLevel)\n\t\t\t\t: (settingsManager.getDefaultThinkingLevel() ?? DEFAULT_THINKING_LEVEL);\n\t\t}\n\n\t\tif (thinkingLevel === undefined) {\n\t\t\tthinkingLevel = settingsManager.getDefaultThinkingLevel() ?? DEFAULT_THINKING_LEVEL;\n\t\t}\n\n\t\tif (!model) {\n\t\t\tthinkingLevel = \"off\";\n\t\t} else {\n\t\t\tthinkingLevel = clampThinkingLevel(model, thinkingLevel) as ThinkingLevel;\n\t\t}\n\n\t\tconst serviceTierPreference =\n\t\t\toptions.serviceTier ??\n\t\t\t(hasServiceTierEntry ? existingSession.serviceTier : settingsManager.getDefaultServiceTier());\n\t\tconst serviceTier =\n\t\t\tserviceTierPreference === \"priority\" && (!model || !supportsFastMode(model))\n\t\t\t\t? \"default\"\n\t\t\t\t: serviceTierPreference;\n\n\t\tconst allowedToolNames =\n\t\t\toptions.allowedToolNames ?? options.tools ?? (options.noTools === \"all\" ? [] : undefined);\n\t\tconst includeGoals = options.includeGoals ?? (options.tools !== undefined || options.noTools !== \"all\");\n\t\tconst initialActiveToolNames: string[] =\n\t\t\toptions.initialActiveToolNames ??\n\t\t\t(options.tools ? [...options.tools] : options.noTools ? [] : [\"ipython\", \"prime_context\"]);\n\n\t\tlet agent: Agent;\n\n\t\tconst convertToLlmWithBlockImages = (messages: AgentMessage[]): Message[] => {\n\t\t\tconst converted = convertToLlm(messages);\n\t\t\tif (!settingsManager.getBlockImages()) {\n\t\t\t\treturn converted;\n\t\t\t}\n\t\t\treturn converted.map((msg) => {\n\t\t\t\tif (msg.role === \"user\" || msg.role === \"toolResult\") {\n\t\t\t\t\tconst content = msg.content;\n\t\t\t\t\tif (Array.isArray(content)) {\n\t\t\t\t\t\tconst hasImages = content.some((c) => c.type === \"image\");\n\t\t\t\t\t\tif (hasImages) {\n\t\t\t\t\t\t\tconst filteredContent = content\n\t\t\t\t\t\t\t\t.map((c) =>\n\t\t\t\t\t\t\t\t\tc.type === \"image\" ? { type: \"text\" as const, text: \"Image reading is disabled.\" } : c,\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t.filter(\n\t\t\t\t\t\t\t\t\t(c, i, arr) =>\n\t\t\t\t\t\t\t\t\t\t!(\n\t\t\t\t\t\t\t\t\t\t\tc.type === \"text\" &&\n\t\t\t\t\t\t\t\t\t\t\tc.text === \"Image reading is disabled.\" &&\n\t\t\t\t\t\t\t\t\t\t\ti > 0 &&\n\t\t\t\t\t\t\t\t\t\t\tarr[i - 1].type === \"text\" &&\n\t\t\t\t\t\t\t\t\t\t\t(arr[i - 1] as { type: \"text\"; text: string }).text === \"Image reading is disabled.\"\n\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\treturn { ...msg, content: filteredContent };\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn msg;\n\t\t\t});\n\t\t};\n\n\t\tconst extensionRunnerRef: { current?: ExtensionRunner } = {};\n\n\t\tagent = new Agent({\n\t\t\tinitialState: {\n\t\t\t\tsystemPrompt: \"\",\n\t\t\t\tmodel,\n\t\t\t\tthinkingLevel,\n\t\t\t\tserviceTier,\n\t\t\t\ttools: [],\n\t\t\t},\n\t\t\tconvertToLlm: convertToLlmWithBlockImages,\n\t\t\tstreamFn: createNativeInferenceStream(async (model, _context, options) => {\n\t\t\t\tif (!modelRegistry.hasConfiguredAuth(model)) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`Selected model ${model.provider}/${model.id} needs authentication. Use /login to configure this provider.`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tconst auth = await modelRegistry.getApiKeyAndHeaders(model);\n\t\t\t\tif (!auth.ok) {\n\t\t\t\t\tthrow new Error(auth.error);\n\t\t\t\t}\n\t\t\t\tconst providerRetrySettings = settingsManager.getProviderRetrySettings();\n\t\t\t\treturn {\n\t\t\t\t\t...options,\n\t\t\t\t\tapiKey: auth.apiKey,\n\t\t\t\t\tauthSourceToken: auth.sourceToken,\n\t\t\t\t\ttimeoutMs: options?.timeoutMs ?? providerRetrySettings.timeoutMs,\n\t\t\t\t\tmaxRetries: options?.maxRetries ?? providerRetrySettings.maxRetries,\n\t\t\t\t\tmaxRetryDelayMs: options?.maxRetryDelayMs ?? providerRetrySettings.maxRetryDelayMs,\n\t\t\t\t\theaders: auth.headers || options?.headers ? { ...auth.headers, ...options?.headers } : undefined,\n\t\t\t\t};\n\t\t\t}),\n\t\t\tonPayload: async (payload, _model) => {\n\t\t\t\tconst runner = extensionRunnerRef.current;\n\t\t\t\tif (!runner?.hasHandlers(\"before_provider_request\")) {\n\t\t\t\t\treturn payload;\n\t\t\t\t}\n\t\t\t\treturn runner.emitBeforeProviderRequest(payload);\n\t\t\t},\n\t\t\tonResponse: async (response, _model) => {\n\t\t\t\tconst runner = extensionRunnerRef.current;\n\t\t\t\tif (!runner?.hasHandlers(\"after_provider_response\")) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tawait runner.emit({\n\t\t\t\t\ttype: \"after_provider_response\",\n\t\t\t\t\tstatus: response.status,\n\t\t\t\t\theaders: response.headers,\n\t\t\t\t});\n\t\t\t},\n\t\t\tsessionId: sessionManager.getSessionId(),\n\t\t\ttransformContext: async (messages) => {\n\t\t\t\tconst runner = extensionRunnerRef.current;\n\t\t\t\tif (!runner) return messages;\n\t\t\t\treturn runner.emitContext(messages);\n\t\t\t},\n\t\t\tsteeringMode: settingsManager.getSteeringMode(),\n\t\t\tfollowUpMode: settingsManager.getFollowUpMode(),\n\t\t\ttransport: settingsManager.getTransport(),\n\t\t\tthinkingBudgets: settingsManager.getThinkingBudgets(),\n\t\t\tmaxRetryDelayMs: settingsManager.getProviderRetrySettings().maxRetryDelayMs,\n\t\t});\n\n\t\tif (hasExistingSession) {\n\t\t\tagent.state.messages = existingSession.messages;\n\t\t\tif (!hasThinkingEntry) {\n\t\t\t\tawait sessionManager.appendThinkingLevelChange(thinkingLevel);\n\t\t\t}\n\t\t} else {\n\t\t\tif (model) {\n\t\t\t\tawait sessionManager.appendModelChange(model.provider, model.id);\n\t\t\t}\n\t\t\tawait sessionManager.appendThinkingLevelChange(thinkingLevel);\n\t\t}\n\t\tif (!hasServiceTierEntry) {\n\t\t\tawait sessionManager.appendServiceTierChange(serviceTierPreference);\n\t\t}\n\n\t\tsession = new AgentSession({\n\t\t\tinvocationOutputLimits: options.invocationOutputLimits,\n\t\t\trequestTokenBudget: options.requestTokenBudget,\n\t\t\tcontextMode,\n\t\t\tagent,\n\t\t\tsessionManager,\n\t\t\tsettingsManager,\n\t\t\tserviceTierPreference,\n\t\t\tcwd,\n\t\t\t// Only the explicit dir — the default may not match injected custom storage.\n\t\t\tagentDir: options.agentDir,\n\t\t\tscopedModels: options.scopedModels,\n\t\t\tresourceLoader,\n\t\t\tcustomTools: options.customTools,\n\t\t\tmodelRegistry,\n\t\t\tmcpManager,\n\t\t\tinitialActiveToolNames,\n\t\t\tallowedToolNames,\n\t\t\tincludeGoals,\n\t\t\tincludeCompactSkill: options.includeCompactSkill,\n\t\t\trlmHeartbeatController: options.rlmHeartbeatController,\n\t\t\tagentMessageController: options.agentMessageController,\n\t\t\tagentObserveController: options.agentObserveController,\n\t\t\textensionRunnerRef,\n\t\t\trlmDepth: options.rlmDepth,\n\t\t\trlmMaxDepth: options.rlmMaxDepth,\n\t\t\trlmSessionDir: options.rlmSessionDir,\n\t\t\trlmParentNodeId: options.rlmParentNodeId,\n\t\t\trlmParentAgent: options.rlmParentAgent,\n\t\t\trlmChildAdmission: options.rlmChildAdmission,\n\t\t\trlmSubagentCapacity: options.rlmSubagentCapacity,\n\t\t\trlmRootAdmission: options.rlmRootAdmission,\n\t\t\tsemanticParentSessionId: options.semanticParentSessionId,\n\t\t\tsemanticSpawnedByRequestId: options.semanticSpawnedByRequestId,\n\t\t\tsubagentRuntimeHost: options.subagentRuntimeHost,\n\t\t\tsessionStartEvent: options.sessionStartEvent,\n\t\t\tprewarmIpythonKernel: options.prewarmIpythonKernel,\n\t\t\tautonomous: options.autonomous,\n\t\t\tserializedRefine: options.serializedRefine,\n\t\t\tinitialGoal: options.initialGoal,\n\t\t});\n\t\tawait session.initialize();\n\t\tconst extensionsResult = resourceLoader.getExtensions();\n\n\t\treturn {\n\t\t\tsession,\n\t\t\textensionsResult,\n\t\t\tmodelFallbackMessage,\n\t\t};\n\t} catch (error) {\n\t\ttry {\n\t\t\tconst admitted = options.rlmChildAdmission?.session ?? options.rlmRootAdmission?.session;\n\t\t\tconst failedSession = session ?? (admitted?.sessionManager === sessionManager ? admitted : undefined);\n\t\t\tif (failedSession) await failedSession.disposeAsync();\n\t\t\telse {\n\t\t\t\tawait sessionManager.close();\n\t\t\t\tawait options.rlmChildAdmission?.confirmUnboundCleanup();\n\t\t\t}\n\t\t} catch (cleanupError) {\n\t\t\tif (cleanupError === error || (error instanceof AggregateError && error.errors.includes(cleanupError)))\n\t\t\t\tthrow error;\n\t\t\tthrow new AggregateError([error, cleanupError], \"Session creation and cleanup failed\");\n\t\t}\n\t\tthrow error;\n\t}\n}\n"]}
1
+ {"version":3,"file":"sdk.d.ts","sourceRoot":"","sources":["../../src/core/sdk.ts"],"names":[],"mappings":"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","sourcesContent":["import { join } from \"node:path\";\nimport { Agent, type AgentMessage, type AgentOutputLimits, type ThinkingLevel } from \"@ponythewhite/base-context-agent\";\nimport { clampThinkingLevel, type Message, type Model, supportsFastMode } from \"@ponythewhite/base-context-ai\";\nimport { getAgentDir } from \"../config.js\";\nimport { AgentSession } from \"./agent-session.js\";\nimport type { AgentSessionCreationOptions } from \"./agent-session-services.js\";\nimport { formatNoModelsAvailableMessage } from \"./auth-guidance.js\";\nimport { AuthStorage } from \"./auth-storage.js\";\nimport type { AgentAutonomousConfig } from \"./autonomous.js\";\nimport { DEFAULT_THINKING_LEVEL } from \"./defaults.js\";\nimport type { ExtensionRunner, LoadExtensionsResult, SessionStartEvent, ToolDefinition } from \"./extensions/index.js\";\nimport { createNativeInferenceStream } from \"./inference-coordinator.js\";\nimport { McpManager } from \"./mcp/mcp-manager.js\";\nimport { convertToLlm } from \"./messages.js\";\nimport { ModelRegistry } from \"./model-registry.js\";\nimport { findInitialModel } from \"./model-resolver.js\";\nimport type { ResourceLoader } from \"./resource-loader.js\";\nimport { DefaultResourceLoader } from \"./resource-loader.js\";\nimport { readSessionBootstrap } from \"./session-bootstrap.js\";\nimport { getDefaultSessionDir, SessionManager } from \"./session-manager.js\";\nimport { SettingsManager } from \"./settings-manager.js\";\nimport { time } from \"./timings.js\";\nimport {\n\tcreateBashTool,\n\tcreateEditTool,\n\tcreateIpythonTool,\n\tcreatePrimeContextTool,\n\twithFileMutationQueue,\n} from \"./tools/index.js\";\n\nexport interface CreateAgentSessionOptions extends AgentSessionCreationOptions {\n\t/** Working directory for project-local discovery. Default: process.cwd() */\n\tcwd?: string;\n\t/** Global config directory. Default: ~/.base-context */\n\tagentDir?: string;\n\n\t/** Auth storage for credentials. Default: AuthStorage.create(agentDir/auth.json).\n\t * Existing host Codex subscriptions can be injected with\n\t * AuthStorage.fromStorage(readOnlyBackend, { existingOpenAICodexSubscription: true }).\n\t * This retains the built-in owned dispatcher; it does not enable OAuth login/refresh.\n\t */\n\tauthStorage?: AuthStorage;\n\t/** Model registry. Default: ModelRegistry.create(authStorage, agentDir/models.json) */\n\tmodelRegistry?: ModelRegistry;\n\n\t/** Model to use. Undefined restores a saved explicit choice; null leaves the session unselected. */\n\tmodel?: Model<any> | null;\n\t/** Thinking level. Default: from settings, else 'medium' (clamped to model capabilities) */\n\tthinkingLevel?: ThinkingLevel;\n\t/** Models available for cycling (Ctrl+P in interactive mode) */\n\tscopedModels?: Array<{ model: Model<any>; thinkingLevel?: ThinkingLevel }>;\n\n\t/**\n\t * Optional default tool suppression mode when no explicit allowlist is provided.\n\t *\n\t * - \"all\": start with no tools enabled\n\t * - \"builtin\": disable the default built-in tools (ipython and prime_context)\n\t * but keep extension/custom tools enabled\n\t */\n\tnoTools?: \"all\" | \"builtin\";\n\t/**\n\t * Optional allowlist of tool names.\n\t *\n\t * When omitted, Base Context enables the default built-in tools (ipython and prime_context)\n\t * and leaves extension/custom tools enabled unless `noTools` changes that default.\n\t * When provided, only the listed tool names are enabled.\n\t */\n\ttools?: string[];\n\t/** Custom tools to register (in addition to built-in tools). */\n\tcustomTools?: ToolDefinition[];\n\n\t/** Resource loader. When omitted, DefaultResourceLoader is used. */\n\tresourceLoader?: ResourceLoader;\n\n\t/** MCP integration manager. When omitted, MCP host handlers are not wired. */\n\tmcpManager?: McpManager;\n\n\t/** Session manager. Default: SessionManager.create(cwd) */\n\tsessionManager?: SessionManager;\n\n\t/** Override complete native invocation output limits from settings. */\n\tinvocationOutputLimits?: AgentOutputLimits;\n\t/** Settings manager. Default: SettingsManager.create(cwd, agentDir) */\n\tsettingsManager?: SettingsManager;\n\t/** Session start event metadata for extension runtime startup. */\n\tsessionStartEvent?: SessionStartEvent;\n\t/** Host-side autonomous continuation policy. */\n\tautonomous?: AgentAutonomousConfig;\n}\n\n/** Result from createAgentSession */\nexport interface CreateAgentSessionResult {\n\t/** The created session */\n\tsession: AgentSession;\n\t/** Extensions result (for UI context setup in interactive mode) */\n\textensionsResult: LoadExtensionsResult;\n\t/** Diagnostic when the selected session or saved model cannot be used. */\n\tmodelFallbackMessage?: string;\n}\n\nexport type { AgentSessionRuntimeConfig } from \"./agent-session-config.js\";\nexport * from \"./agent-session-runtime.js\";\nexport type { AgentSessionCreationOptions } from \"./agent-session-services.js\";\nexport type {\n\tExtensionAPI,\n\tExtensionCommandContext,\n\tExtensionContext,\n\tExtensionFactory,\n\tSlashCommandInfo,\n\tSlashCommandSource,\n\tToolDefinition,\n} from \"./extensions/index.js\";\nexport type { PromptTemplate } from \"./prompt-templates.js\";\nexport type {\n\tRlmMaxSubagentsStatus,\n\tRlmRootAdmission,\n\tRlmSubagentCapacity,\n\tRlmSubagentCapacityReservation,\n} from \"./rlm-max-subagents.js\";\nexport type {\n\tCreateRlmSubagentRuntimeOptions,\n\tRlmChildAdmission,\n\tRlmSubagentRuntime,\n\tSubagentRuntimeHost,\n} from \"./rlm-runtime.js\";\nexport type { Skill } from \"./skills.js\";\nexport type { Tool } from \"./tools/index.js\";\n\nexport { createBashTool, createEditTool, createIpythonTool, createPrimeContextTool, withFileMutationQueue };\n\nfunction getDefaultAgentDir(): string {\n\treturn getAgentDir();\n}\n\n/**\n * Create an AgentSession with the specified options.\n *\n * @example\n * ```typescript\n * // Minimal - uses defaults\n * const { session } = await createAgentSession();\n *\n * // With explicit model\n * import { getModel } from '@ponythewhite/base-context-ai';\n * const { session } = await createAgentSession({\n * model: getModel('anthropic', 'claude-opus-4-5'),\n * thinkingLevel: 'high',\n * });\n *\n * // Continue previous session\n * const { session, modelFallbackMessage } = await createAgentSession({\n * continueSession: true,\n * });\n *\n * // Full control\n * const loader = new DefaultResourceLoader({\n * cwd: process.cwd(),\n * agentDir: getAgentDir(),\n * settingsManager: SettingsManager.create(),\n * });\n * await loader.reload();\n * const { session } = await createAgentSession({\n * model: myModel,\n * tools: [\"ipython\"],\n * resourceLoader: loader,\n * sessionManager: SessionManager.inMemory(),\n * });\n * ```\n */\nexport async function createAgentSession(options: CreateAgentSessionOptions = {}): Promise<CreateAgentSessionResult> {\n\tconst contextMode = options.contextMode;\n\tif (options.requestTokenBudget)\n\t\toptions = { ...options, requestTokenBudget: structuredClone(options.requestTokenBudget) };\n\tconst cwd = options.cwd ?? options.sessionManager?.getCwd() ?? process.cwd();\n\tconst agentDir = options.agentDir ?? getDefaultAgentDir();\n\tlet resourceLoader = options.resourceLoader;\n\n\tconst authPath = options.agentDir ? join(agentDir, \"auth.json\") : undefined;\n\tconst modelsPath = options.agentDir ? join(agentDir, \"models.json\") : undefined;\n\tconst authStorage = options.authStorage ?? AuthStorage.create(authPath);\n\tconst modelRegistry = options.modelRegistry ?? ModelRegistry.create(authStorage, modelsPath);\n\n\tconst settingsManager = options.settingsManager ?? SettingsManager.create(cwd, agentDir);\n\tconst sessionManager =\n\t\toptions.sessionManager ?? (await SessionManager.create(cwd, getDefaultSessionDir(cwd, agentDir)));\n\n\tlet session: AgentSession | undefined;\n\ttry {\n\t\t// Ensure MCP providers are registered and built-in MCP skills are gated by\n\t\t// auth even on the bare SDK path (not just the CLI's createAgentSessionServices).\n\t\tconst mcpManager =\n\t\t\toptions.mcpManager ??\n\t\t\tnew McpManager({ authStorage, getUserServers: () => settingsManager.getGlobalMcpServers() });\n\t\tmodelRegistry.setOnOAuthProvidersReset(() => mcpManager.registerUserProviders());\n\n\t\tif (!resourceLoader) {\n\t\t\tresourceLoader = new DefaultResourceLoader({\n\t\t\t\tcwd,\n\t\t\t\tagentDir,\n\t\t\t\tsettingsManager,\n\t\t\t\textraBuiltinSkillOverrides: () => mcpManager.getDisabledBuiltinSkillOverrides(),\n\t\t\t});\n\t\t\tawait resourceLoader.reload();\n\t\t\ttime(\"resourceLoader.reload\");\n\t\t}\n\n\t\tconst {\n\t\t\tcontext: existingSession,\n\t\t\thasExistingSession,\n\t\t\thasThinkingEntry,\n\t\t\thasServiceTierEntry,\n\t\t} = await readSessionBootstrap(sessionManager, settingsManager.getCanonicalContextLimits(), {\n\t\t\tpurpose: \"read\",\n\t\t\tinitialContextMode: contextMode ?? settingsManager.getContextMode(),\n\t\t});\n\n\t\tlet model = options.model ?? undefined;\n\t\tlet modelFallbackMessage: string | undefined;\n\n\t\tif (options.model === undefined && hasExistingSession && existingSession.model) {\n\t\t\tconst saved = existingSession.model;\n\t\t\tconst restoredModel = modelRegistry.find(saved.provider, saved.modelId);\n\t\t\tmodel = restoredModel;\n\t\t\tif (!restoredModel) {\n\t\t\t\tmodelFallbackMessage = `Could not restore model ${saved.provider}/${saved.modelId}. Use /model to select a supported model.`;\n\t\t\t} else if (!modelRegistry.hasConfiguredAuth(restoredModel)) {\n\t\t\t\tmodelFallbackMessage = `Selected model ${saved.provider}/${saved.modelId} needs authentication. Use /login to configure this provider.`;\n\t\t\t}\n\t\t} else if (options.model === undefined) {\n\t\t\tconst result = await findInitialModel({\n\t\t\t\tscopedModels: [],\n\t\t\t\tisContinuing: hasExistingSession,\n\t\t\t\tdefaultProvider: settingsManager.getDefaultProvider(),\n\t\t\t\tdefaultModelId: settingsManager.getDefaultModel(),\n\t\t\t\tdefaultThinkingLevel: settingsManager.getDefaultThinkingLevel(),\n\t\t\t\tmodelRegistry,\n\t\t\t});\n\t\t\tmodel = result.model;\n\t\t\tif (model && !modelRegistry.hasConfiguredAuth(model)) {\n\t\t\t\tmodelFallbackMessage = `Selected model ${model.provider}/${model.id} needs authentication. Use /login to configure this provider.`;\n\t\t\t} else if (!model) {\n\t\t\t\tconst provider = settingsManager.getDefaultProvider();\n\t\t\t\tconst modelId = settingsManager.getDefaultModel();\n\t\t\t\tmodelFallbackMessage =\n\t\t\t\t\tprovider && modelId\n\t\t\t\t\t\t? `Selected model ${provider}/${modelId} is unavailable. Use /model to select a supported model.`\n\t\t\t\t\t\t: formatNoModelsAvailableMessage();\n\t\t\t}\n\t\t}\n\n\t\tlet thinkingLevel = options.thinkingLevel;\n\n\t\tif (thinkingLevel === undefined && hasExistingSession) {\n\t\t\tthinkingLevel = hasThinkingEntry\n\t\t\t\t? (existingSession.thinkingLevel as ThinkingLevel)\n\t\t\t\t: (settingsManager.getDefaultThinkingLevel() ?? DEFAULT_THINKING_LEVEL);\n\t\t}\n\n\t\tif (thinkingLevel === undefined) {\n\t\t\tthinkingLevel = settingsManager.getDefaultThinkingLevel() ?? DEFAULT_THINKING_LEVEL;\n\t\t}\n\n\t\tif (!model) {\n\t\t\tthinkingLevel = \"off\";\n\t\t} else {\n\t\t\tthinkingLevel = clampThinkingLevel(model, thinkingLevel) as ThinkingLevel;\n\t\t}\n\n\t\tconst serviceTierPreference =\n\t\t\toptions.serviceTier ??\n\t\t\t(hasServiceTierEntry ? existingSession.serviceTier : settingsManager.getDefaultServiceTier());\n\t\tconst serviceTier =\n\t\t\tserviceTierPreference === \"priority\" && (!model || !supportsFastMode(model))\n\t\t\t\t? \"default\"\n\t\t\t\t: serviceTierPreference;\n\n\t\tconst allowedToolNames =\n\t\t\toptions.allowedToolNames ?? options.tools ?? (options.noTools === \"all\" ? [] : undefined);\n\t\tconst includeGoals = options.includeGoals ?? (options.tools !== undefined || options.noTools !== \"all\");\n\t\tconst initialActiveToolNames: string[] =\n\t\t\toptions.initialActiveToolNames ??\n\t\t\t(options.tools ? [...options.tools] : options.noTools ? [] : [\"ipython\", \"prime_context\"]);\n\n\t\tlet agent: Agent;\n\n\t\tconst convertToLlmWithBlockImages = (messages: AgentMessage[]): Message[] => {\n\t\t\tconst converted = convertToLlm(messages);\n\t\t\tif (!settingsManager.getBlockImages()) {\n\t\t\t\treturn converted;\n\t\t\t}\n\t\t\treturn converted.map((msg) => {\n\t\t\t\tif (msg.role === \"user\" || msg.role === \"toolResult\") {\n\t\t\t\t\tconst content = msg.content;\n\t\t\t\t\tif (Array.isArray(content)) {\n\t\t\t\t\t\tconst hasImages = content.some((c) => c.type === \"image\");\n\t\t\t\t\t\tif (hasImages) {\n\t\t\t\t\t\t\tconst filteredContent = content\n\t\t\t\t\t\t\t\t.map((c) =>\n\t\t\t\t\t\t\t\t\tc.type === \"image\" ? { type: \"text\" as const, text: \"Image reading is disabled.\" } : c,\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t.filter(\n\t\t\t\t\t\t\t\t\t(c, i, arr) =>\n\t\t\t\t\t\t\t\t\t\t!(\n\t\t\t\t\t\t\t\t\t\t\tc.type === \"text\" &&\n\t\t\t\t\t\t\t\t\t\t\tc.text === \"Image reading is disabled.\" &&\n\t\t\t\t\t\t\t\t\t\t\ti > 0 &&\n\t\t\t\t\t\t\t\t\t\t\tarr[i - 1].type === \"text\" &&\n\t\t\t\t\t\t\t\t\t\t\t(arr[i - 1] as { type: \"text\"; text: string }).text === \"Image reading is disabled.\"\n\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\treturn { ...msg, content: filteredContent };\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn msg;\n\t\t\t});\n\t\t};\n\n\t\tconst extensionRunnerRef: { current?: ExtensionRunner } = {};\n\n\t\tagent = new Agent({\n\t\t\tinitialState: {\n\t\t\t\tsystemPrompt: \"\",\n\t\t\t\tmodel,\n\t\t\t\tthinkingLevel,\n\t\t\t\tserviceTier,\n\t\t\t\ttools: [],\n\t\t\t},\n\t\t\tconvertToLlm: convertToLlmWithBlockImages,\n\t\t\tstreamFn: createNativeInferenceStream(async (model, _context, options) => {\n\t\t\t\tif (!modelRegistry.hasConfiguredAuth(model)) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`Selected model ${model.provider}/${model.id} needs authentication. Use /login to configure this provider.`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tconst auth = await modelRegistry.getApiKeyAndHeaders(model);\n\t\t\t\tif (!auth.ok) {\n\t\t\t\t\tthrow new Error(auth.error);\n\t\t\t\t}\n\t\t\t\tconst providerRetrySettings = settingsManager.getProviderRetrySettings();\n\t\t\t\treturn {\n\t\t\t\t\t...options,\n\t\t\t\t\tapiKey: auth.apiKey,\n\t\t\t\t\tauthSourceToken: auth.sourceToken,\n\t\t\t\t\ttimeoutMs: options?.timeoutMs ?? providerRetrySettings.timeoutMs,\n\t\t\t\t\tmaxRetries: options?.maxRetries ?? providerRetrySettings.maxRetries,\n\t\t\t\t\tmaxRetryDelayMs: options?.maxRetryDelayMs ?? providerRetrySettings.maxRetryDelayMs,\n\t\t\t\t\theaders: auth.headers || options?.headers ? { ...auth.headers, ...options?.headers } : undefined,\n\t\t\t\t};\n\t\t\t}),\n\t\t\tonPayload: async (payload, _model) => {\n\t\t\t\tconst runner = extensionRunnerRef.current;\n\t\t\t\tif (!runner?.hasHandlers(\"before_provider_request\")) {\n\t\t\t\t\treturn payload;\n\t\t\t\t}\n\t\t\t\treturn runner.emitBeforeProviderRequest(payload);\n\t\t\t},\n\t\t\tonResponse: async (response, _model) => {\n\t\t\t\tconst runner = extensionRunnerRef.current;\n\t\t\t\tif (!runner?.hasHandlers(\"after_provider_response\")) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tawait runner.emit({\n\t\t\t\t\ttype: \"after_provider_response\",\n\t\t\t\t\tstatus: response.status,\n\t\t\t\t\theaders: response.headers,\n\t\t\t\t});\n\t\t\t},\n\t\t\tsessionId: sessionManager.getSessionId(),\n\t\t\ttransformContext: async (messages) => {\n\t\t\t\tconst runner = extensionRunnerRef.current;\n\t\t\t\tif (!runner) return messages;\n\t\t\t\treturn runner.emitContext(messages);\n\t\t\t},\n\t\t\tsteeringMode: settingsManager.getSteeringMode(),\n\t\t\tfollowUpMode: settingsManager.getFollowUpMode(),\n\t\t\ttransport: settingsManager.getTransport(),\n\t\t\tthinkingBudgets: settingsManager.getThinkingBudgets(),\n\t\t\tmaxRetryDelayMs: settingsManager.getProviderRetrySettings().maxRetryDelayMs,\n\t\t});\n\n\t\tif (hasExistingSession) {\n\t\t\tagent.state.messages = existingSession.messages;\n\t\t\tif (!hasThinkingEntry) {\n\t\t\t\tawait sessionManager.appendThinkingLevelChange(thinkingLevel);\n\t\t\t}\n\t\t} else {\n\t\t\tif (model) {\n\t\t\t\tawait sessionManager.appendModelChange(model.provider, model.id);\n\t\t\t}\n\t\t\tawait sessionManager.appendThinkingLevelChange(thinkingLevel);\n\t\t}\n\t\tif (!hasServiceTierEntry) {\n\t\t\tawait sessionManager.appendServiceTierChange(serviceTierPreference);\n\t\t}\n\n\t\tsession = new AgentSession({\n\t\t\tinvocationOutputLimits: options.invocationOutputLimits,\n\t\t\trequestTokenBudget: options.requestTokenBudget,\n\t\t\tcontextMode,\n\t\t\tagent,\n\t\t\tsessionManager,\n\t\t\tsettingsManager,\n\t\t\tserviceTierPreference,\n\t\t\tcwd,\n\t\t\t// Only the explicit dir — the default may not match injected custom storage.\n\t\t\tagentDir: options.agentDir,\n\t\t\tscopedModels: options.scopedModels,\n\t\t\tresourceLoader,\n\t\t\tcustomTools: options.customTools,\n\t\t\tmodelRegistry,\n\t\t\tmcpManager,\n\t\t\tinitialActiveToolNames,\n\t\t\tallowedToolNames,\n\t\t\tincludeGoals,\n\t\t\tincludeCompactSkill: options.includeCompactSkill,\n\t\t\trlmHeartbeatController: options.rlmHeartbeatController,\n\t\t\tagentMessageController: options.agentMessageController,\n\t\t\tagentObserveController: options.agentObserveController,\n\t\t\textensionRunnerRef,\n\t\t\trlmDepth: options.rlmDepth,\n\t\t\trlmMaxDepth: options.rlmMaxDepth,\n\t\t\trlmSessionDir: options.rlmSessionDir,\n\t\t\trlmParentNodeId: options.rlmParentNodeId,\n\t\t\trlmParentAgent: options.rlmParentAgent,\n\t\t\trlmChildAdmission: options.rlmChildAdmission,\n\t\t\trlmSubagentCapacity: options.rlmSubagentCapacity,\n\t\t\trlmRootAdmission: options.rlmRootAdmission,\n\t\t\tsemanticParentSessionId: options.semanticParentSessionId,\n\t\t\tsemanticSpawnedByRequestId: options.semanticSpawnedByRequestId,\n\t\t\tsubagentRuntimeHost: options.subagentRuntimeHost,\n\t\t\tsessionStartEvent: options.sessionStartEvent,\n\t\t\tprewarmIpythonKernel: options.prewarmIpythonKernel,\n\t\t\tautonomous: options.autonomous,\n\t\t\tserializedRefine: options.serializedRefine,\n\t\t\tinitialGoal: options.initialGoal,\n\t\t});\n\t\tawait session.initialize();\n\t\tconst extensionsResult = resourceLoader.getExtensions();\n\n\t\treturn {\n\t\t\tsession,\n\t\t\textensionsResult,\n\t\t\tmodelFallbackMessage,\n\t\t};\n\t} catch (error) {\n\t\ttry {\n\t\t\tconst admitted = options.rlmChildAdmission?.session ?? options.rlmRootAdmission?.session;\n\t\t\tconst failedSession = session ?? (admitted?.sessionManager === sessionManager ? admitted : undefined);\n\t\t\tif (failedSession) await failedSession.disposeAsync();\n\t\t\telse {\n\t\t\t\tawait sessionManager.close();\n\t\t\t\tawait options.rlmChildAdmission?.confirmUnboundCleanup();\n\t\t\t}\n\t\t} catch (cleanupError) {\n\t\t\tif (cleanupError === error || (error instanceof AggregateError && error.errors.includes(cleanupError)))\n\t\t\t\tthrow error;\n\t\t\tthrow new AggregateError([error, cleanupError], \"Session creation and cleanup failed\");\n\t\t}\n\t\tthrow error;\n\t}\n}\n"]}
package/dist/core/sdk.js CHANGED
@@ -88,7 +88,7 @@ export async function createAgentSession(options = {}) {
88
88
  time("resourceLoader.reload");
89
89
  }
90
90
  const { context: existingSession, hasExistingSession, hasThinkingEntry, hasServiceTierEntry, } = await readSessionBootstrap(sessionManager, settingsManager.getCanonicalContextLimits(), {
91
- allowPendingToolPublic: options.requestTokenBudget !== undefined,
91
+ purpose: "read",
92
92
  initialContextMode: contextMode ?? settingsManager.getContextMode(),
93
93
  });
94
94
  let model = options.model ?? undefined;