@nhtio/adk 1.20260609.1 → 1.20260610.1
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.
- package/CHANGELOG.md +89 -0
- package/batteries/embeddings/openai/adapter.cjs +1 -1
- package/batteries/embeddings/openai/adapter.mjs +1 -1
- package/batteries/embeddings/webllm/adapter.cjs +1 -1
- package/batteries/embeddings/webllm/adapter.mjs +1 -1
- package/batteries/llm/ollama/adapter.cjs +5 -5
- package/batteries/llm/ollama/adapter.mjs +5 -5
- package/batteries/llm/ollama/helpers.cjs +11 -2
- package/batteries/llm/ollama/helpers.cjs.map +1 -1
- package/batteries/llm/ollama/helpers.mjs +11 -2
- package/batteries/llm/ollama/helpers.mjs.map +1 -1
- package/batteries/llm/ollama/validation.cjs +1 -1
- package/batteries/llm/ollama/validation.mjs +1 -1
- package/batteries/llm/openai_chat_completions/adapter.cjs +5 -5
- package/batteries/llm/openai_chat_completions/adapter.mjs +5 -5
- package/batteries/llm/openai_chat_completions/helpers.cjs +21 -2
- package/batteries/llm/openai_chat_completions/helpers.cjs.map +1 -1
- package/batteries/llm/openai_chat_completions/helpers.mjs +21 -2
- package/batteries/llm/openai_chat_completions/helpers.mjs.map +1 -1
- package/batteries/llm/openai_chat_completions/validation.cjs +1 -1
- package/batteries/llm/openai_chat_completions/validation.mjs +1 -1
- package/batteries/llm/webllm_chat_completions/adapter.cjs +5 -5
- package/batteries/llm/webllm_chat_completions/adapter.mjs +5 -5
- package/batteries/llm/webllm_chat_completions/validation.cjs +1 -1
- package/batteries/llm/webllm_chat_completions/validation.mjs +1 -1
- package/batteries/media/builder.d.ts +245 -0
- package/batteries/media/contracts.cjs +119 -0
- package/batteries/media/contracts.cjs.map +1 -0
- package/batteries/media/contracts.d.ts +321 -0
- package/batteries/media/contracts.mjs +110 -0
- package/batteries/media/contracts.mjs.map +1 -0
- package/batteries/media/engines/audio_decode.cjs +92 -0
- package/batteries/media/engines/audio_decode.cjs.map +1 -0
- package/batteries/media/engines/audio_decode.d.ts +50 -0
- package/batteries/media/engines/audio_decode.mjs +90 -0
- package/batteries/media/engines/audio_decode.mjs.map +1 -0
- package/batteries/media/engines/execa_executor.cjs +64 -0
- package/batteries/media/engines/execa_executor.cjs.map +1 -0
- package/batteries/media/engines/execa_executor.d.ts +54 -0
- package/batteries/media/engines/execa_executor.mjs +62 -0
- package/batteries/media/engines/execa_executor.mjs.map +1 -0
- package/batteries/media/engines/fs_workspace.cjs +84 -0
- package/batteries/media/engines/fs_workspace.cjs.map +1 -0
- package/batteries/media/engines/fs_workspace.d.ts +51 -0
- package/batteries/media/engines/fs_workspace.mjs +82 -0
- package/batteries/media/engines/fs_workspace.mjs.map +1 -0
- package/batteries/media/engines/jimp.cjs +116 -0
- package/batteries/media/engines/jimp.cjs.map +1 -0
- package/batteries/media/engines/jimp.d.ts +32 -0
- package/batteries/media/engines/jimp.mjs +114 -0
- package/batteries/media/engines/jimp.mjs.map +1 -0
- package/batteries/media/engines/sharp.cjs +120 -0
- package/batteries/media/engines/sharp.cjs.map +1 -0
- package/batteries/media/engines/sharp.d.ts +42 -0
- package/batteries/media/engines/sharp.mjs +117 -0
- package/batteries/media/engines/sharp.mjs.map +1 -0
- package/batteries/media/engines/soffice.cjs +246 -0
- package/batteries/media/engines/soffice.cjs.map +1 -0
- package/batteries/media/engines/soffice.d.ts +39 -0
- package/batteries/media/engines/soffice.mjs +244 -0
- package/batteries/media/engines/soffice.mjs.map +1 -0
- package/batteries/media/engines/tesseract_js.cjs +87 -0
- package/batteries/media/engines/tesseract_js.cjs.map +1 -0
- package/batteries/media/engines/tesseract_js.d.ts +41 -0
- package/batteries/media/engines/tesseract_js.mjs +85 -0
- package/batteries/media/engines/tesseract_js.mjs.map +1 -0
- package/batteries/media/engines/transformers_asr.cjs +111 -0
- package/batteries/media/engines/transformers_asr.cjs.map +1 -0
- package/batteries/media/engines/transformers_asr.d.ts +41 -0
- package/batteries/media/engines/transformers_asr.mjs +109 -0
- package/batteries/media/engines/transformers_asr.mjs.map +1 -0
- package/batteries/media/exceptions.d.ts +103 -0
- package/batteries/media/forge.cjs +403 -0
- package/batteries/media/forge.cjs.map +1 -0
- package/batteries/media/forge.d.ts +90 -0
- package/batteries/media/forge.mjs +399 -0
- package/batteries/media/forge.mjs.map +1 -0
- package/batteries/media/formats.d.ts +72 -0
- package/batteries/media/index.d.ts +136 -0
- package/batteries/media/lint.cjs +339 -0
- package/batteries/media/lint.cjs.map +1 -0
- package/batteries/media/lint.d.ts +117 -0
- package/batteries/media/lint.mjs +331 -0
- package/batteries/media/lint.mjs.map +1 -0
- package/batteries/media/pipe.d.ts +66 -0
- package/batteries/media/plan.d.ts +133 -0
- package/batteries/media/registry.d.ts +92 -0
- package/batteries/media/runtime.d.ts +105 -0
- package/batteries/media/steps/doc.d.ts +33 -0
- package/batteries/media/steps/image_audio.d.ts +24 -0
- package/batteries/media/steps/ingest.d.ts +25 -0
- package/batteries/media/steps/pages.d.ts +18 -0
- package/batteries/media/steps/sheet.d.ts +36 -0
- package/batteries/media/steps/slides.d.ts +35 -0
- package/batteries/media/steps/text.d.ts +43 -0
- package/batteries/media/validate.d.ts +49 -0
- package/batteries/media/verbs.d.ts +126 -0
- package/batteries/media.cjs +3049 -0
- package/batteries/media.cjs.map +1 -0
- package/batteries/media.mjs +3009 -0
- package/batteries/media.mjs.map +1 -0
- package/batteries/storage/flydrive.cjs +1 -1
- package/batteries/storage/flydrive.mjs +1 -1
- package/batteries/storage/in_memory.cjs +1 -1
- package/batteries/storage/in_memory.mjs +1 -1
- package/batteries/storage/opfs.cjs +1 -1
- package/batteries/storage/opfs.mjs +1 -1
- package/batteries/tools/_shared/index.d.ts +21 -0
- package/batteries/tools/_shared.cjs +18 -2
- package/batteries/tools/_shared.cjs.map +1 -1
- package/batteries/tools/_shared.mjs +18 -3
- package/batteries/tools/_shared.mjs.map +1 -1
- package/batteries/tools/color.cjs +2 -2
- package/batteries/tools/color.mjs +2 -2
- package/batteries/tools/comparison.cjs +3 -3
- package/batteries/tools/comparison.mjs +3 -3
- package/batteries/tools/data_structure.cjs +3 -3
- package/batteries/tools/data_structure.mjs +3 -3
- package/batteries/tools/datetime_extended.cjs +2 -2
- package/batteries/tools/datetime_extended.mjs +2 -2
- package/batteries/tools/datetime_math.cjs +2 -2
- package/batteries/tools/datetime_math.mjs +2 -2
- package/batteries/tools/encoding.cjs +3 -3
- package/batteries/tools/encoding.mjs +3 -3
- package/batteries/tools/formatting.cjs +3 -3
- package/batteries/tools/formatting.mjs +3 -3
- package/batteries/tools/geo_basics.cjs +2 -2
- package/batteries/tools/geo_basics.mjs +2 -2
- package/batteries/tools/math.cjs +3 -3
- package/batteries/tools/math.mjs +3 -3
- package/batteries/tools/memory.cjs +5 -5
- package/batteries/tools/memory.mjs +5 -5
- package/batteries/tools/parsing.cjs +4 -4
- package/batteries/tools/parsing.mjs +4 -4
- package/batteries/tools/retrievables.cjs +4 -4
- package/batteries/tools/retrievables.mjs +4 -4
- package/batteries/tools/scrapper/index.d.ts +1 -0
- package/batteries/tools/scrapper/shared.d.ts +8 -1
- package/batteries/tools/scrapper.cjs +1 -1
- package/batteries/tools/scrapper.mjs +1 -1
- package/batteries/tools/searxng/index.d.ts +8 -1
- package/batteries/tools/searxng.cjs +1 -1
- package/batteries/tools/searxng.mjs +1 -1
- package/batteries/tools/standing_instructions.cjs +4 -4
- package/batteries/tools/standing_instructions.mjs +4 -4
- package/batteries/tools/statistics.cjs +4 -4
- package/batteries/tools/statistics.mjs +4 -4
- package/batteries/tools/string_processing.cjs +3 -3
- package/batteries/tools/string_processing.mjs +3 -3
- package/batteries/tools/structured_data.cjs +3 -3
- package/batteries/tools/structured_data.mjs +3 -3
- package/batteries/tools/text_analysis.cjs +3 -3
- package/batteries/tools/text_analysis.mjs +3 -3
- package/batteries/tools/text_comparison.cjs +2 -2
- package/batteries/tools/text_comparison.mjs +2 -2
- package/batteries/tools/time.cjs +2 -2
- package/batteries/tools/time.mjs +2 -2
- package/batteries/tools/unit_conversion.cjs +2 -2
- package/batteries/tools/unit_conversion.mjs +2 -2
- package/batteries/tools/web_retrieval/index.d.ts +4 -4
- package/batteries/tools/web_retrieval.cjs +4 -4
- package/batteries/tools/web_retrieval.cjs.map +1 -1
- package/batteries/tools/web_retrieval.mjs +4 -4
- package/batteries/tools/web_retrieval.mjs.map +1 -1
- package/batteries/tools.cjs +2 -2
- package/batteries/tools.mjs +2 -2
- package/batteries/vector/arangodb.cjs +1 -1
- package/batteries/vector/arangodb.mjs +1 -1
- package/batteries/vector/clickhouse.cjs +1 -1
- package/batteries/vector/clickhouse.mjs +1 -1
- package/batteries/vector/cloudflare.cjs +1 -1
- package/batteries/vector/cloudflare.mjs +1 -1
- package/batteries/vector/couchbase.cjs +1 -1
- package/batteries/vector/couchbase.mjs +1 -1
- package/batteries/vector/duckdb.cjs +1 -1
- package/batteries/vector/duckdb.mjs +1 -1
- package/batteries/vector/elasticsearch.cjs +1 -1
- package/batteries/vector/elasticsearch.mjs +1 -1
- package/batteries/vector/filters.cjs +1 -1
- package/batteries/vector/filters.mjs +1 -1
- package/batteries/vector/hnswlib.cjs +1 -1
- package/batteries/vector/hnswlib.mjs +1 -1
- package/batteries/vector/lancedb.cjs +1 -1
- package/batteries/vector/lancedb.mjs +1 -1
- package/batteries/vector/mariadb.cjs +1 -1
- package/batteries/vector/mariadb.mjs +1 -1
- package/batteries/vector/meilisearch.cjs +1 -1
- package/batteries/vector/meilisearch.mjs +1 -1
- package/batteries/vector/migrate.cjs +1 -1
- package/batteries/vector/migrate.mjs +1 -1
- package/batteries/vector/mongodb.cjs +1 -1
- package/batteries/vector/mongodb.mjs +1 -1
- package/batteries/vector/neo4j.cjs +1 -1
- package/batteries/vector/neo4j.mjs +1 -1
- package/batteries/vector/opensearch.cjs +1 -1
- package/batteries/vector/opensearch.mjs +1 -1
- package/batteries/vector/oracle23ai.cjs +1 -1
- package/batteries/vector/oracle23ai.mjs +1 -1
- package/batteries/vector/pinecone.cjs +1 -1
- package/batteries/vector/pinecone.mjs +1 -1
- package/batteries/vector/redis.cjs +1 -1
- package/batteries/vector/redis.mjs +1 -1
- package/batteries/vector/retrievable.cjs +1 -1
- package/batteries/vector/retrievable.mjs +1 -1
- package/batteries/vector/s3vectors.cjs +1 -1
- package/batteries/vector/s3vectors.mjs +1 -1
- package/batteries/vector/solr.cjs +1 -1
- package/batteries/vector/solr.mjs +1 -1
- package/batteries/vector/surrealdb.cjs +1 -1
- package/batteries/vector/surrealdb.mjs +1 -1
- package/batteries/vector/typesense.cjs +1 -1
- package/batteries/vector/typesense.mjs +1 -1
- package/batteries/vector/vespa.cjs +1 -1
- package/batteries/vector/vespa.mjs +1 -1
- package/batteries/vector/weaviate.cjs +1 -1
- package/batteries/vector/weaviate.mjs +1 -1
- package/batteries.cjs +2 -2
- package/batteries.mjs +2 -2
- package/{common-DYDUi99O.mjs → common-Bs4H4NOD.mjs} +8 -8
- package/{common-DYDUi99O.mjs.map → common-Bs4H4NOD.mjs.map} +1 -1
- package/{common-DZl3ADJs.js → common-CCDLEmQk.js} +8 -8
- package/{common-DZl3ADJs.js.map → common-CCDLEmQk.js.map} +1 -1
- package/common.cjs +7 -7
- package/common.mjs +7 -7
- package/{dispatch_runner--ZhdDWRZ.mjs → dispatch_runner-CKi8SWSF.mjs} +3 -3
- package/{dispatch_runner--ZhdDWRZ.mjs.map → dispatch_runner-CKi8SWSF.mjs.map} +1 -1
- package/{dispatch_runner-nHDKkxye.js → dispatch_runner-e0i6VAKX.js} +3 -3
- package/{dispatch_runner-nHDKkxye.js.map → dispatch_runner-e0i6VAKX.js.map} +1 -1
- package/dispatch_runner.cjs +1 -1
- package/dispatch_runner.mjs +1 -1
- package/eslint/rules.cjs +1 -1
- package/eslint/rules.mjs +1 -1
- package/eslint.cjs +2 -2
- package/eslint.mjs +2 -2
- package/exceptions-C7FSHEnV.mjs +87 -0
- package/exceptions-C7FSHEnV.mjs.map +1 -0
- package/exceptions-CQi_lNs1.js +152 -0
- package/exceptions-CQi_lNs1.js.map +1 -0
- package/exceptions.cjs +1 -1
- package/exceptions.mjs +1 -1
- package/forge.cjs +4 -4
- package/forge.mjs +4 -4
- package/guards.cjs +8 -8
- package/guards.mjs +8 -8
- package/index.cjs +12 -12
- package/index.mjs +12 -12
- package/mcp/adk-docs-corpus.json +1 -1
- package/package.json +286 -178
- package/{runtime-DslE1aBw.js → runtime-CRF56t7P.js} +1 -1
- package/{runtime-DslE1aBw.js.map → runtime-CRF56t7P.js.map} +1 -1
- package/{runtime-Bz5zA8wc.mjs → runtime-s8MPiRk2.mjs} +1 -1
- package/{runtime-Bz5zA8wc.mjs.map → runtime-s8MPiRk2.mjs.map} +1 -1
- package/{scrapper-BHM1mCde.mjs → scrapper-BIEo8YFO.mjs} +7 -6
- package/scrapper-BIEo8YFO.mjs.map +1 -0
- package/{scrapper-BeweWurk.js → scrapper-CdETSAvg.js} +6 -5
- package/scrapper-CdETSAvg.js.map +1 -0
- package/{searxng-BJFulNcK.mjs → searxng-COvSyS9X.mjs} +7 -6
- package/searxng-COvSyS9X.mjs.map +1 -0
- package/{searxng-B_D--V5q.js → searxng-DZexynBu.js} +6 -5
- package/searxng-DZexynBu.js.map +1 -0
- package/skills/adk-assembly/SKILL.md +2 -2
- package/{spooled_artifact-DX8LLyUX.js → spooled_artifact-DmZKXhnn.js} +4 -4
- package/{spooled_artifact-DX8LLyUX.js.map → spooled_artifact-DmZKXhnn.js.map} +1 -1
- package/{spooled_artifact-7eePq7JA.mjs → spooled_artifact-PV0MTlL1.mjs} +4 -4
- package/{spooled_artifact-7eePq7JA.mjs.map → spooled_artifact-PV0MTlL1.mjs.map} +1 -1
- package/spooled_artifact.cjs +2 -2
- package/spooled_artifact.mjs +2 -2
- package/{spooled_markdown_artifact-ClX72lek.js → spooled_markdown_artifact-CyedUE_d.js} +3 -3
- package/{spooled_markdown_artifact-ClX72lek.js.map → spooled_markdown_artifact-CyedUE_d.js.map} +1 -1
- package/{spooled_markdown_artifact-wkrBF3oX.mjs → spooled_markdown_artifact-IcqG7qmv.mjs} +3 -3
- package/{spooled_markdown_artifact-wkrBF3oX.mjs.map → spooled_markdown_artifact-IcqG7qmv.mjs.map} +1 -1
- package/{thought-DLwpF7MI.js → thought-BSpZK-Q3.js} +4 -4
- package/{thought-DLwpF7MI.js.map → thought-BSpZK-Q3.js.map} +1 -1
- package/{thought-B_vxAiKU.mjs → thought-Dpvmq9yj.mjs} +4 -4
- package/{thought-B_vxAiKU.mjs.map → thought-Dpvmq9yj.mjs.map} +1 -1
- package/{tool-wMYMVl60.mjs → tool-AaLCDVjO.mjs} +3 -3
- package/{tool-wMYMVl60.mjs.map → tool-AaLCDVjO.mjs.map} +1 -1
- package/{tool-D5WGVIcI.js → tool-aEQQxXve.js} +3 -3
- package/{tool-D5WGVIcI.js.map → tool-aEQQxXve.js.map} +1 -1
- package/{tool_call-DixVlW40.js → tool_call-B1VXAAmn.js} +4 -4
- package/{tool_call-DixVlW40.js.map → tool_call-B1VXAAmn.js.map} +1 -1
- package/{tool_call-B4-_-vjG.mjs → tool_call-B2Ty8FuQ.mjs} +4 -4
- package/{tool_call-B4-_-vjG.mjs.map → tool_call-B2Ty8FuQ.mjs.map} +1 -1
- package/{tool_registry-791Vrjtf.mjs → tool_registry-D6gaqCO1.mjs} +3 -3
- package/{tool_registry-791Vrjtf.mjs.map → tool_registry-D6gaqCO1.mjs.map} +1 -1
- package/{tool_registry-CKJPze3j.js → tool_registry-qQXq9zs0.js} +3 -3
- package/{tool_registry-CKJPze3j.js.map → tool_registry-qQXq9zs0.js.map} +1 -1
- package/{turn_runner-HXImLGIn.js → turn_runner-C3DBh465.js} +5 -5
- package/{turn_runner-HXImLGIn.js.map → turn_runner-C3DBh465.js.map} +1 -1
- package/{turn_runner-ZyYO-Kti.mjs → turn_runner-CVHrXNnw.mjs} +5 -5
- package/{turn_runner-ZyYO-Kti.mjs.map → turn_runner-CVHrXNnw.mjs.map} +1 -1
- package/turn_runner.cjs +1 -1
- package/turn_runner.mjs +1 -1
- package/validate-DUnMQTt1.js +1298 -0
- package/validate-DUnMQTt1.js.map +1 -0
- package/validate-DokBgtG-.mjs +1215 -0
- package/validate-DokBgtG-.mjs.map +1 -0
- package/scrapper-BHM1mCde.mjs.map +0 -1
- package/scrapper-BeweWurk.js.map +0 -1
- package/searxng-BJFulNcK.mjs.map +0 -1
- package/searxng-B_D--V5q.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helpers.mjs","names":[],"sources":["../../../../src/batteries/llm/ollama/helpers.ts"],"sourcesContent":["/**\n * Swappable translation helpers for rendering ADK state into native Ollama `/api/chat` requests.\n *\n * @module @nhtio/adk/batteries/llm/ollama/helpers\n *\n * @remarks\n * The wire-shape-agnostic helpers (`renderUntrustedContent`, `renderMemories`,\n * `renderChatCompletionsSystemPrompt`, `toolsToChatCompletionsTools`, …) are shared with the OpenAI\n * battery via the internal `../chat_common/helpers` submodule and re-exported here under their\n * original names. Only the Ollama-WIRE-SPECIFIC helpers are defined here:\n * `renderOllamaTimelineMessage` (flat `content` + base64 `images[]` + `thinking`),\n * `renderOllamaToolCallResult` (string-only result content), `buildOllamaHistory` (synthetic\n * `assistant.tool_calls` with object-form `arguments` + `tool`-role messages labelled by\n * `tool_name`), and `ollamaToolsFromTools` (alias of the shared tool-definition renderer — native\n * `/api/chat` uses the same function-tool wire shape).\n *\n * Native `/api/chat` supports only base64 `images[]`; every non-image modality routes through the\n * `unsupportedMediaPolicy` fallback (stash text / synthetic description) or throws.\n */\n\nimport { Media } from '@nhtio/adk/common'\nimport { isInstanceOf } from '@nhtio/adk/guards'\nimport { E_OLLAMA_UNSUPPORTED_MEDIA_MODALITY } from './exceptions'\nimport {\n escapeXmlAttribute,\n memoryToAttrs,\n retrievableToAttrs,\n renderTrustedContent,\n renderUntrustedContent,\n toolsToChatCompletionsTools,\n} from '../chat_common/helpers'\nimport type { ChatHelpersCommon } from '../chat_common/types'\nimport type {\n OllamaMessage,\n OllamaTool,\n OllamaHelpers,\n MemoryAttrs,\n RetrievableAttrs,\n ChatCompletionsBucketOrder,\n UnsupportedMediaPolicy,\n} from './types'\nimport type {\n Tool,\n ArtifactTool,\n ToolRegistry,\n Tokenizable,\n Memory,\n Message,\n Thought,\n ToolCall,\n Retrievable,\n SpooledArtifact,\n MediaModalityHazard,\n MediaStashEntry,\n} from '@nhtio/adk/common'\n\n// ─── Re-exported wire-shape-agnostic helpers (shared submodule) ───────────────\nexport {\n descriptionToChatCompletionsJsonSchema,\n defaultDescriptionToChatCompletionsJsonSchema,\n renderUntrustedContent,\n defaultRenderUntrustedContent,\n renderTrustedContent,\n defaultRenderTrustedContent,\n renderStandingInstructions,\n defaultRenderStandingInstructions,\n renderMemories,\n defaultRenderMemories,\n renderRetrievableSafetyDirective,\n defaultRenderRetrievableSafetyDirective,\n renderFirstPartyRetrievables,\n defaultRenderFirstPartyRetrievables,\n renderThirdPartyPublicRetrievables,\n defaultRenderThirdPartyPublicRetrievables,\n renderThirdPartyPrivateRetrievables,\n defaultRenderThirdPartyPrivateRetrievables,\n renderRetrievables,\n defaultRenderRetrievables,\n renderThought,\n defaultRenderThought,\n filterThoughts,\n defaultFilterThoughts,\n toolsToChatCompletionsTools,\n defaultToolsToChatCompletionsTools,\n renderChatCompletionsSystemPrompt,\n defaultRenderChatCompletionsSystemPrompt,\n} from '../chat_common/helpers'\n\n// ─── ollamaToolsFromTools (alias — native tool wire == Chat Completions wire) ──\n\n/**\n * Convert ADK tools to the native Ollama `tools[]` wire. Native `/api/chat` uses the identical\n * `{ type: 'function', function: { name, description, parameters } }` shape as Chat Completions, so\n * this is an alias of the shared renderer.\n */\nexport const ollamaToolsFromTools = (\n tools: ReadonlyArray<Tool | ArtifactTool>,\n deps: Parameters<typeof toolsToChatCompletionsTools>[1]\n): OllamaTool[] => toolsToChatCompletionsTools(tools, deps)\n/** Default implementation of {@link OllamaHelpers}-style tool translation; alias of {@link ollamaToolsFromTools}. */\nexport const defaultOllamaToolsFromTools = ollamaToolsFromTools\n\n// ─── Media rendering (Ollama native — images only) ────────────────────────────\n\nconst DEFAULT_STASH_FALLBACK_KEYS: ReadonlyArray<string> = [\n 'text:transcript',\n 'text:caption',\n 'text:description',\n]\n\nconst modalityHazardToAttr = (h: MediaModalityHazard): 'inert' | 'extractable' | 'opaque' => {\n if (h === 'inert') return 'inert'\n if (h === 'extractable-instructions') return 'extractable'\n return 'opaque'\n}\n\nconst formatBytesHumanReadable = (bytes: number | undefined): string => {\n if (bytes === undefined || !Number.isFinite(bytes)) return 'unknown size'\n if (bytes < 1024) return `${bytes} B`\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`\n if (bytes < 1024 * 1024 * 1024) return `${(bytes / (1024 * 1024)).toFixed(1)} MB`\n return `${(bytes / (1024 * 1024 * 1024)).toFixed(1)} GB`\n}\n\nconst isMediaTextStashEntry = (e: unknown): e is MediaStashEntry => {\n if (!e || typeof e !== 'object') return false\n const r = e as Record<string, unknown>\n return typeof r.value === 'string' && typeof r.trustTier === 'string'\n}\n\nconst resolveFallbackStash = (\n media: Media,\n keys: ReadonlyArray<string>\n): { text: string; entryTier: MediaStashEntry['trustTier'] } | undefined => {\n for (const key of keys) {\n const entry = media.stash.get(key)\n if (isMediaTextStashEntry(entry)) {\n return { text: entry.value as string, entryTier: entry.trustTier }\n }\n }\n return undefined\n}\n\nconst renderTextInEnvelope = (\n text: string,\n args: {\n trustTier: MediaStashEntry['trustTier']\n modality: 'inert' | 'extractable' | 'opaque'\n nonce: string\n toolName: string | undefined\n renderTrustedContent: ChatHelpersCommon['renderTrustedContent']\n renderUntrustedContent: ChatHelpersCommon['renderUntrustedContent']\n }\n): string => {\n if (args.trustTier === 'first-party') {\n return args.renderTrustedContent(text, {\n nonce: args.nonce,\n kind: 'media-fallback',\n tool: args.toolName,\n modality: args.modality,\n })\n }\n return args.renderUntrustedContent(text, {\n nonce: args.nonce,\n kind: 'media-fallback',\n tool: args.toolName,\n modality: args.modality,\n })\n}\n\nconst renderSyntheticMediaDescription = (media: Media, byteLen: number | undefined): string =>\n `[media: ${media.filename}, ${media.mimeType}, ${formatBytesHumanReadable(byteLen)}]`\n\n/**\n * Render a single {@link Media} for the native Ollama wire. Images become a base64 entry pushed to\n * the message's `images[]` array (returned via `image`); every other modality is unsupported and\n * routes through `unsupportedMediaPolicy` to a text envelope (returned via `text`) or throws.\n */\nconst renderMediaForOllama = async (input: {\n media: Media\n toolName: string | undefined\n nonce: string\n unsupportedMediaPolicy: UnsupportedMediaPolicy\n renderTrustedContent: ChatHelpersCommon['renderTrustedContent']\n renderUntrustedContent: ChatHelpersCommon['renderUntrustedContent']\n warn?: (msg: string) => void\n}): Promise<{ image?: string; text?: string }> => {\n const { media, toolName, nonce, unsupportedMediaPolicy, warn } = input\n const modality = modalityHazardToAttr(media.modalityHazard)\n\n if (media.kind === 'image') {\n const b64 = await media.asBase64()\n return { image: b64 }\n }\n\n // Non-image modality — native /api/chat has no representation for it.\n const fallbackText = async (\n keys: ReadonlyArray<string>,\n allowSyntheticFallthrough: boolean\n ): Promise<{ text: string }> => {\n const fallback = resolveFallbackStash(media, keys)\n if (fallback) {\n return {\n text: renderTextInEnvelope(fallback.text, {\n trustTier: fallback.entryTier,\n modality,\n nonce,\n toolName,\n renderTrustedContent: input.renderTrustedContent,\n renderUntrustedContent: input.renderUntrustedContent,\n }),\n }\n }\n if (!allowSyntheticFallthrough) {\n warn?.(\n `unsupportedMediaPolicy='fallback-stash' for ${media.filename}: no matching stash entry — falling through to synthetic description.`\n )\n }\n const byteLen = await media.byteLength()\n return {\n text: renderTextInEnvelope(renderSyntheticMediaDescription(media, byteLen), {\n trustTier: media.trustTier,\n modality,\n nonce,\n toolName,\n renderTrustedContent: input.renderTrustedContent,\n renderUntrustedContent: input.renderUntrustedContent,\n }),\n }\n }\n\n if (unsupportedMediaPolicy === 'throw') {\n throw new E_OLLAMA_UNSUPPORTED_MEDIA_MODALITY([media.kind, media.mimeType, media.filename])\n }\n if (\n unsupportedMediaPolicy === 'fallback-stash' ||\n (typeof unsupportedMediaPolicy === 'object' && unsupportedMediaPolicy.mode === 'fallback-stash')\n ) {\n const keys =\n typeof unsupportedMediaPolicy === 'object'\n ? unsupportedMediaPolicy.stashKeys\n : DEFAULT_STASH_FALLBACK_KEYS\n return fallbackText(keys, false)\n }\n return fallbackText([], true)\n}\n\n// ─── renderOllamaTimelineMessage ──────────────────────────────────────────────\n\n/**\n * Renders a single timeline {@link @nhtio/adk!Message} into a native Ollama message — flattening any\n * media into the base64 `images[]` array, surfacing reasoning as `thinking`, and wrapping textual\n * bodies in the appropriate trust envelope.\n */\nexport const renderOllamaTimelineMessage = async (input: {\n message: Message\n selfIdentity: string\n unsupportedMediaPolicy: UnsupportedMediaPolicy\n warn?: (msg: string) => void\n}): Promise<OllamaMessage> => {\n const { message, selfIdentity, unsupportedMediaPolicy, warn } = input\n const identifier =\n message.identity?.identifier !== undefined && message.identity?.identifier !== null\n ? String(message.identity.identifier)\n : ''\n const representationRaw =\n message.identity?.representation !== undefined && message.identity?.representation !== null\n ? message.identity.representation.toString()\n : ''\n const representation = representationRaw.length > 0 ? representationRaw : identifier\n const text = message.content !== undefined ? message.content.toString() : ''\n const createdAtStr = message.createdAt.toISO?.() ?? ''\n const createdAtAttr = createdAtStr ? ` createdAt=\"${escapeXmlAttribute(createdAtStr)}\"` : ''\n const attachments = message.attachments\n\n // Build the text envelope (same identity logic as the OpenAI battery — wire-agnostic).\n let envelopeText: string\n let role: 'user' | 'assistant'\n if (message.role === 'user') {\n role = 'user'\n if (identifier.length === 0) {\n envelopeText = text\n } else {\n const fromAttr = escapeXmlAttribute(representation)\n envelopeText = `<message_${message.id} from=\"${fromAttr}\" role=\"user\"${createdAtAttr}>\\n${text}\\n</message_${message.id}>`\n }\n } else {\n role = 'assistant'\n if (identifier.length === 0 || identifier === selfIdentity) {\n envelopeText = text\n } else {\n const fromAttr = escapeXmlAttribute(representation)\n envelopeText = `<peer_agent_output_${message.id} from=\"${fromAttr}\"${createdAtAttr}>\\n${text}\\n</peer_agent_output_${message.id}>`\n }\n }\n\n const images: string[] = []\n const extraTexts: string[] = []\n for (const media of attachments) {\n const rendered = await renderMediaForOllama({\n media,\n toolName: undefined,\n nonce: message.id,\n unsupportedMediaPolicy,\n renderTrustedContent,\n renderUntrustedContent,\n warn,\n })\n if (rendered.image !== undefined) images.push(rendered.image)\n if (rendered.text !== undefined) extraTexts.push(rendered.text)\n }\n\n // Non-image fallbacks (text envelopes) are appended to the message content; images ride in the\n // separate native `images[]` field.\n const contentParts: string[] = []\n if (envelopeText.length > 0) contentParts.push(envelopeText)\n for (const t of extraTexts) contentParts.push(t)\n const out: OllamaMessage = { role, content: contentParts.join('\\n') }\n if (images.length > 0) out.images = images\n return out\n}\n/** Default timeline-message renderer; alias of {@link renderOllamaTimelineMessage}. */\nexport const defaultRenderOllamaTimelineMessage = renderOllamaTimelineMessage\n\n// ─── renderOllamaToolCallResult ───────────────────────────────────────────────\n\nconst looksLikeSpooledArtifact = (value: unknown): value is SpooledArtifact => {\n if (!value || typeof value !== 'object') return false\n const v = value as Record<string, unknown>\n return (\n typeof v.asString === 'function' &&\n typeof v.byteLength === 'function' &&\n typeof v.lineCount === 'function' &&\n typeof v.estimateTokens === 'function'\n )\n}\n\nconst renderArtifactHandleBody = (\n toolCall: ToolCall,\n artifact: SpooledArtifact,\n byteLength: number,\n lineCount: number\n): string => {\n const ctor = (\n artifact as unknown as {\n constructor: { toolMethods?: ReadonlyArray<{ name: string; description?: string }> }\n }\n ).constructor\n const methods = ctor?.toolMethods ?? []\n const lines: string[] = []\n lines.push(`This tool returned a large artifact that was not inlined to preserve context budget.`)\n lines.push(``)\n lines.push(`Artifact metadata:`)\n lines.push(`- callId: ${toolCall.id}`)\n lines.push(`- kind: ${ctor?.constructor?.name ?? 'SpooledArtifact'}`)\n lines.push(`- byteLength: ${byteLength}`)\n lines.push(`- lineCount: ${lineCount}`)\n lines.push(``)\n lines.push(`To read this artifact in this turn, call one of the following tools with`)\n lines.push(`callId=${toolCall.id}:`)\n for (const m of methods) {\n if (m.description) {\n lines.push(`- ${m.name} — ${m.description}`)\n } else {\n lines.push(`- ${m.name}`)\n }\n }\n lines.push(``)\n lines.push(\n `The artifact persists in this turn's context — multiple queries against the same callId are allowed and efficient. Do not assume the body has been inlined anywhere else.`\n )\n return lines.join('\\n')\n}\n\n/**\n * Render a tool-call result to native Ollama tool-message content (always a string). Media results\n * are routed through the internal media renderer: images cannot ride on a tool-role message's\n * `content`, so an image result is replaced with a short text marker (the image bytes are not\n * re-sent on a tool message); non-image media use the same fallback-text path as elsewhere.\n */\nexport const renderOllamaToolCallResult = async (input: {\n toolCall: ToolCall\n results: Tokenizable | SpooledArtifact | SpooledArtifact[] | Media | Media[]\n tool: Tool | ArtifactTool | undefined\n renderUntrustedContent: ChatHelpersCommon['renderUntrustedContent']\n renderTrustedContent: ChatHelpersCommon['renderTrustedContent']\n unsupportedMediaPolicy: UnsupportedMediaPolicy\n warn?: (msg: string) => void\n}): Promise<string> => {\n const { toolCall, results, tool, warn, unsupportedMediaPolicy } = input\n const isTrusted =\n tool !== null && tool !== undefined && (tool as { trusted?: boolean }).trusted === true\n\n if (tool === undefined) {\n warn?.(\n `Tool \"${toolCall.tool}\" is not present in the bound tool registry at render time; defaulting to untrusted envelope.`\n )\n }\n\n // Media silo — bypasses Tool.trusted (Trust-Is-Content rule).\n const isMediaResult = Media.isMedia(results)\n const isMediaArrayResult =\n Array.isArray(results) && results.length > 0 && results.every((r) => Media.isMedia(r))\n if (isMediaResult || isMediaArrayResult) {\n const mediaList = isMediaResult ? [results as Media] : (results as Media[])\n const parts: string[] = []\n for (const media of mediaList) {\n const rendered = await renderMediaForOllama({\n media,\n toolName: toolCall.tool,\n nonce: toolCall.checksum,\n unsupportedMediaPolicy,\n renderTrustedContent: input.renderTrustedContent,\n renderUntrustedContent: input.renderUntrustedContent,\n warn,\n })\n if (rendered.text !== undefined) {\n parts.push(rendered.text)\n } else {\n // An image tool-result cannot be carried on a tool-role message's string content; emit a\n // text marker in its place so the model knows an image was produced.\n const byteLen = await media.byteLength()\n parts.push(\n input.renderUntrustedContent(renderSyntheticMediaDescription(media, byteLen), {\n nonce: toolCall.checksum,\n kind: 'tool-result-image',\n tool: toolCall.tool,\n modality: modalityHazardToAttr(media.modalityHazard),\n })\n )\n }\n }\n return parts.join('\\n')\n }\n\n // SpooledArtifact[] silo.\n if (Array.isArray(results)) {\n const parts: string[] = []\n for (const a of results) {\n parts.push(await (a as SpooledArtifact).asString())\n }\n const joined = parts.join('\\n\\n')\n return isTrusted\n ? input.renderTrustedContent(joined, {\n nonce: toolCall.checksum,\n kind: 'trusted-tool-result',\n tool: toolCall.tool,\n })\n : input.renderUntrustedContent(joined, {\n nonce: toolCall.checksum,\n kind: 'tool-result',\n tool: toolCall.tool,\n })\n }\n\n const isSpooled = looksLikeSpooledArtifact(results)\n\n // Handle-pattern branch: spooled + inline=false → always untrusted (queryable-data).\n if (isSpooled && toolCall.inline === false) {\n const artifact = results as SpooledArtifact\n let byteLength = 0\n let lineCount = 0\n try {\n byteLength = await artifact.byteLength()\n } catch {\n byteLength = 0\n }\n try {\n lineCount = await artifact.lineCount()\n } catch {\n lineCount = 0\n }\n const body = renderArtifactHandleBody(toolCall, artifact, byteLength, lineCount)\n return input.renderUntrustedContent(body, {\n nonce: toolCall.checksum,\n kind: 'artifact-handle',\n tool: toolCall.tool,\n })\n }\n\n if (!isSpooled && toolCall.inline === false) {\n warn?.(\n `Tool call ${toolCall.id} has inline=false but results is a Tokenizable (not a SpooledArtifact); rendering inline anyway.`\n )\n }\n\n const body = isSpooled\n ? await (results as SpooledArtifact).asString()\n : (results as Tokenizable).toString()\n\n return isTrusted\n ? input.renderTrustedContent(body, {\n nonce: toolCall.checksum,\n kind: 'trusted-tool-result',\n tool: toolCall.tool,\n })\n : input.renderUntrustedContent(body, {\n nonce: toolCall.checksum,\n kind: 'tool-result',\n tool: toolCall.tool,\n })\n}\n/** Default tool-call-result renderer; alias of {@link renderOllamaToolCallResult}. */\nexport const defaultRenderOllamaToolCallResult = renderOllamaToolCallResult\n\n// ─── buildOllamaHistory ───────────────────────────────────────────────────────\n\ntype TimelineItem =\n | { kind: 'message'; createdAt: number; value: Message }\n | { kind: 'thought'; createdAt: number; value: Thought }\n | { kind: 'toolCall'; createdAt: number; value: ToolCall }\n\n/**\n * Assembles the complete native Ollama message history for a dispatch — system prompt and content\n * buckets, the interleaved timeline of messages/thoughts/tool calls, and the collected opaque\n * reasoning payloads — by delegating to the injected sub-renderers.\n */\nexport const buildOllamaHistory = async (input: {\n systemPrompt: Tokenizable\n standingInstructions: Iterable<Tokenizable>\n memories: Iterable<Memory>\n retrievables: Iterable<Retrievable>\n messages: Iterable<Message>\n thoughts: Iterable<Thought>\n toolCalls: Iterable<ToolCall>\n tools: ToolRegistry\n renderedToolCallResults: Map<string, string>\n bucketOrder: ChatCompletionsBucketOrder\n selfIdentity: string\n thoughtSurfacing: 'all-self' | 'latest-self' | 'all'\n replayCompatibility: ReadonlyArray<string>\n unsupportedMediaPolicy: UnsupportedMediaPolicy\n renderOllamaToolCallResult: OllamaHelpers['renderOllamaToolCallResult']\n renderChatCompletionsSystemPrompt: ChatHelpersCommon['renderChatCompletionsSystemPrompt']\n renderStandingInstructions: ChatHelpersCommon['renderStandingInstructions']\n renderMemories: ChatHelpersCommon['renderMemories']\n renderRetrievables: ChatHelpersCommon['renderRetrievables']\n renderRetrievableSafetyDirective: ChatHelpersCommon['renderRetrievableSafetyDirective']\n renderFirstPartyRetrievables: ChatHelpersCommon['renderFirstPartyRetrievables']\n renderThirdPartyPublicRetrievables: ChatHelpersCommon['renderThirdPartyPublicRetrievables']\n renderThirdPartyPrivateRetrievables: ChatHelpersCommon['renderThirdPartyPrivateRetrievables']\n renderOllamaTimelineMessage: OllamaHelpers['renderOllamaTimelineMessage']\n renderThought: ChatHelpersCommon['renderThought']\n filterThoughts: ChatHelpersCommon['filterThoughts']\n renderUntrustedContent: ChatHelpersCommon['renderUntrustedContent']\n renderTrustedContent: ChatHelpersCommon['renderTrustedContent']\n warn?: (msg: string) => void\n}): Promise<{\n messages: OllamaMessage[]\n reasoningPayloads: Array<{ id: string; replayCompatibility: string; payload: unknown }>\n}> => {\n const out: OllamaMessage[] = []\n const reasoningPayloads: Array<{ id: string; replayCompatibility: string; payload: unknown }> = []\n\n const buckets = input.bucketOrder\n const timelineIdx = buckets.indexOf('timeline')\n\n const leadingSystem = await input.renderChatCompletionsSystemPrompt({\n systemPrompt: input.systemPrompt,\n standingInstructions: input.standingInstructions,\n memories: input.memories,\n retrievables: input.retrievables,\n bucketOrder: buckets,\n renderStandingInstructions: input.renderStandingInstructions,\n renderMemories: input.renderMemories,\n renderRetrievables: input.renderRetrievables,\n renderRetrievableSafetyDirective: input.renderRetrievableSafetyDirective,\n renderFirstPartyRetrievables: input.renderFirstPartyRetrievables,\n renderThirdPartyPublicRetrievables: input.renderThirdPartyPublicRetrievables,\n renderThirdPartyPrivateRetrievables: input.renderThirdPartyPrivateRetrievables,\n renderUntrustedContent: input.renderUntrustedContent,\n })\n if (leadingSystem.length > 0) {\n out.push({ role: 'system', content: leadingSystem })\n }\n\n const includesTimeline = timelineIdx !== -1\n if (includesTimeline) {\n const survivingThoughts = input.filterThoughts(\n input.thoughts,\n input.thoughtSurfacing,\n input.selfIdentity,\n input.replayCompatibility\n )\n\n const items: TimelineItem[] = []\n for (const m of input.messages) {\n items.push({ kind: 'message', createdAt: m.createdAt.toMillis(), value: m })\n }\n for (const t of survivingThoughts) {\n items.push({ kind: 'thought', createdAt: t.createdAt.toMillis(), value: t })\n }\n for (const tc of input.toolCalls) {\n items.push({ kind: 'toolCall', createdAt: tc.createdAt.toMillis(), value: tc })\n }\n items.sort((a, b) => a.createdAt - b.createdAt)\n\n const replaySet = new Set<string>([...input.replayCompatibility])\n\n for (const item of items) {\n if (item.kind === 'message') {\n out.push(\n await input.renderOllamaTimelineMessage({\n message: item.value,\n selfIdentity: input.selfIdentity,\n unsupportedMediaPolicy: input.unsupportedMediaPolicy,\n warn: input.warn,\n })\n )\n } else if (item.kind === 'thought') {\n const t = item.value\n const identifier = String(t.identity?.identifier ?? '')\n const isSelf = identifier === input.selfIdentity\n const hasPayload = t.payload !== undefined\n const compatTag = t.replayCompatibility\n\n if (hasPayload && compatTag && replaySet.has(compatTag)) {\n reasoningPayloads.push({ id: t.id, replayCompatibility: compatTag, payload: t.payload })\n const envelope = input.renderThought(\n t.content.toString(),\n {\n nonce: t.id,\n kind: 'opaque-reasoning',\n from: identifier,\n createdAt: t.createdAt?.toISO?.() ?? undefined,\n replayCompatibility: compatTag,\n },\n t.payload\n )\n out.push({ role: 'assistant', content: envelope })\n } else if (!hasPayload) {\n const envelope = input.renderThought(t.content.toString(), {\n nonce: t.id,\n kind: isSelf ? 'self-reasoning' : 'peer-reasoning',\n from: identifier,\n createdAt: t.createdAt?.toISO?.() ?? undefined,\n })\n out.push({ role: 'assistant', content: envelope })\n }\n // else: opaque, non-matching → elided.\n } else {\n // tool call: synthetic assistant message carrying tool_calls[] (object-form arguments),\n // followed by a tool-role message labelled by `tool_name` (NOT tool_call_id).\n const tc = item.value\n const args =\n tc.args !== null && typeof tc.args === 'object' && !Array.isArray(tc.args)\n ? (tc.args as Record<string, unknown>)\n : {}\n out.push({\n role: 'assistant',\n content: '',\n tool_calls: [{ function: { name: tc.tool, arguments: args } }],\n })\n\n let rendered = input.renderedToolCallResults.get(tc.id)\n if (rendered === undefined) {\n const tool = input.tools.get?.(tc.tool)\n rendered = await input.renderOllamaToolCallResult({\n toolCall: tc,\n results: tc.results as\n | Tokenizable\n | SpooledArtifact\n | SpooledArtifact[]\n | Media\n | Media[],\n tool: tool as Tool | ArtifactTool | undefined,\n renderUntrustedContent: input.renderUntrustedContent,\n renderTrustedContent: input.renderTrustedContent,\n unsupportedMediaPolicy: input.unsupportedMediaPolicy,\n warn: input.warn,\n })\n }\n out.push({ role: 'tool', content: rendered, tool_name: tc.tool })\n }\n }\n }\n\n if (includesTimeline) {\n const trailingParts: string[] = []\n for (let i = timelineIdx + 1; i < buckets.length; i++) {\n const label = buckets[i]!\n if (label === 'standingInstructions') {\n const block = input.renderStandingInstructions(input.standingInstructions)\n if (block.length > 0) trailingParts.push(block)\n } else if (label === 'memories') {\n const wrapped: Array<{ memory: Memory; attrs: MemoryAttrs }> = []\n for (const m of input.memories) {\n wrapped.push(memoryToAttrs(m))\n }\n const block = input.renderMemories(wrapped)\n if (block.length > 0) trailingParts.push(block)\n } else if (label === 'retrievables') {\n const wrapped: Array<{ retrievable: Retrievable; attrs: RetrievableAttrs }> = []\n for (const r of input.retrievables) {\n wrapped.push(retrievableToAttrs(r))\n }\n const block = await input.renderRetrievables(wrapped, {\n renderRetrievableSafetyDirective: input.renderRetrievableSafetyDirective,\n renderFirstPartyRetrievables: input.renderFirstPartyRetrievables,\n renderThirdPartyPublicRetrievables: input.renderThirdPartyPublicRetrievables,\n renderThirdPartyPrivateRetrievables: input.renderThirdPartyPrivateRetrievables,\n renderUntrustedContent: input.renderUntrustedContent,\n })\n if (block.length > 0) trailingParts.push(block)\n }\n }\n if (trailingParts.length > 0) {\n out.push({ role: 'system', content: trailingParts.join('\\n\\n') })\n }\n }\n\n return { messages: out, reasoningPayloads }\n}\n/** Default native-history assembler; alias of {@link buildOllamaHistory}. */\nexport const defaultBuildOllamaHistory = buildOllamaHistory\n\n// suppress unused\nvoid isInstanceOf\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"helpers.mjs","names":[],"sources":["../../../../src/batteries/llm/ollama/helpers.ts"],"sourcesContent":["/**\n * Swappable translation helpers for rendering ADK state into native Ollama `/api/chat` requests.\n *\n * @module @nhtio/adk/batteries/llm/ollama/helpers\n *\n * @remarks\n * The wire-shape-agnostic helpers (`renderUntrustedContent`, `renderMemories`,\n * `renderChatCompletionsSystemPrompt`, `toolsToChatCompletionsTools`, …) are shared with the OpenAI\n * battery via the internal `../chat_common/helpers` submodule and re-exported here under their\n * original names. Only the Ollama-WIRE-SPECIFIC helpers are defined here:\n * `renderOllamaTimelineMessage` (flat `content` + base64 `images[]` + `thinking`),\n * `renderOllamaToolCallResult` (string-only result content), `buildOllamaHistory` (synthetic\n * `assistant.tool_calls` with object-form `arguments` + `tool`-role messages labelled by\n * `tool_name`), and `ollamaToolsFromTools` (alias of the shared tool-definition renderer — native\n * `/api/chat` uses the same function-tool wire shape).\n *\n * Native `/api/chat` supports only base64 `images[]`; every non-image modality routes through the\n * `unsupportedMediaPolicy` fallback (stash text / synthetic description) or throws.\n */\n\nimport { Media } from '@nhtio/adk/common'\nimport { isInstanceOf } from '@nhtio/adk/guards'\nimport { E_OLLAMA_UNSUPPORTED_MEDIA_MODALITY } from './exceptions'\nimport {\n escapeXmlAttribute,\n memoryToAttrs,\n retrievableToAttrs,\n renderTrustedContent,\n renderUntrustedContent,\n toolsToChatCompletionsTools,\n} from '../chat_common/helpers'\nimport type { ChatHelpersCommon } from '../chat_common/types'\nimport type {\n OllamaMessage,\n OllamaTool,\n OllamaHelpers,\n MemoryAttrs,\n RetrievableAttrs,\n ChatCompletionsBucketOrder,\n UnsupportedMediaPolicy,\n} from './types'\nimport type {\n Tool,\n ArtifactTool,\n ToolRegistry,\n Tokenizable,\n Memory,\n Message,\n Thought,\n ToolCall,\n Retrievable,\n SpooledArtifact,\n MediaModalityHazard,\n MediaStashEntry,\n} from '@nhtio/adk/common'\n\n// ─── Re-exported wire-shape-agnostic helpers (shared submodule) ───────────────\nexport {\n descriptionToChatCompletionsJsonSchema,\n defaultDescriptionToChatCompletionsJsonSchema,\n renderUntrustedContent,\n defaultRenderUntrustedContent,\n renderTrustedContent,\n defaultRenderTrustedContent,\n renderStandingInstructions,\n defaultRenderStandingInstructions,\n renderMemories,\n defaultRenderMemories,\n renderRetrievableSafetyDirective,\n defaultRenderRetrievableSafetyDirective,\n renderFirstPartyRetrievables,\n defaultRenderFirstPartyRetrievables,\n renderThirdPartyPublicRetrievables,\n defaultRenderThirdPartyPublicRetrievables,\n renderThirdPartyPrivateRetrievables,\n defaultRenderThirdPartyPrivateRetrievables,\n renderRetrievables,\n defaultRenderRetrievables,\n renderThought,\n defaultRenderThought,\n filterThoughts,\n defaultFilterThoughts,\n toolsToChatCompletionsTools,\n defaultToolsToChatCompletionsTools,\n renderChatCompletionsSystemPrompt,\n defaultRenderChatCompletionsSystemPrompt,\n} from '../chat_common/helpers'\n\n// ─── ollamaToolsFromTools (alias — native tool wire == Chat Completions wire) ──\n\n/**\n * Convert ADK tools to the native Ollama `tools[]` wire. Native `/api/chat` uses the identical\n * `{ type: 'function', function: { name, description, parameters } }` shape as Chat Completions, so\n * this is an alias of the shared renderer.\n */\nexport const ollamaToolsFromTools = (\n tools: ReadonlyArray<Tool | ArtifactTool>,\n deps: Parameters<typeof toolsToChatCompletionsTools>[1]\n): OllamaTool[] => toolsToChatCompletionsTools(tools, deps)\n/** Default implementation of {@link OllamaHelpers}-style tool translation; alias of {@link ollamaToolsFromTools}. */\nexport const defaultOllamaToolsFromTools = ollamaToolsFromTools\n\n// ─── Media rendering (Ollama native — images only) ────────────────────────────\n\nconst DEFAULT_STASH_FALLBACK_KEYS: ReadonlyArray<string> = [\n 'text:transcript',\n 'text:caption',\n 'text:description',\n]\n\nconst modalityHazardToAttr = (h: MediaModalityHazard): 'inert' | 'extractable' | 'opaque' => {\n if (h === 'inert') return 'inert'\n if (h === 'extractable-instructions') return 'extractable'\n return 'opaque'\n}\n\nconst formatBytesHumanReadable = (bytes: number | undefined): string => {\n if (bytes === undefined || !Number.isFinite(bytes)) return 'unknown size'\n if (bytes < 1024) return `${bytes} B`\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`\n if (bytes < 1024 * 1024 * 1024) return `${(bytes / (1024 * 1024)).toFixed(1)} MB`\n return `${(bytes / (1024 * 1024 * 1024)).toFixed(1)} GB`\n}\n\nconst isMediaTextStashEntry = (e: unknown): e is MediaStashEntry => {\n if (!e || typeof e !== 'object') return false\n const r = e as Record<string, unknown>\n return typeof r.value === 'string' && typeof r.trustTier === 'string'\n}\n\nconst resolveFallbackStash = (\n media: Media,\n keys: ReadonlyArray<string>\n): { text: string; entryTier: MediaStashEntry['trustTier'] } | undefined => {\n for (const key of keys) {\n const entry = media.stash.get(key)\n if (isMediaTextStashEntry(entry)) {\n return { text: entry.value as string, entryTier: entry.trustTier }\n }\n }\n return undefined\n}\n\nconst renderTextInEnvelope = (\n text: string,\n args: {\n trustTier: MediaStashEntry['trustTier']\n modality: 'inert' | 'extractable' | 'opaque'\n nonce: string\n toolName: string | undefined\n renderTrustedContent: ChatHelpersCommon['renderTrustedContent']\n renderUntrustedContent: ChatHelpersCommon['renderUntrustedContent']\n }\n): string => {\n if (args.trustTier === 'first-party') {\n return args.renderTrustedContent(text, {\n nonce: args.nonce,\n kind: 'media-fallback',\n tool: args.toolName,\n modality: args.modality,\n })\n }\n return args.renderUntrustedContent(text, {\n nonce: args.nonce,\n kind: 'media-fallback',\n tool: args.toolName,\n modality: args.modality,\n })\n}\n\nconst renderSyntheticMediaDescription = (media: Media, byteLen: number | undefined): string =>\n `[media: ${media.filename}, ${media.mimeType}, ${formatBytesHumanReadable(byteLen)}]`\n\n/**\n * Render a single {@link Media} for the native Ollama wire. Images become a base64 entry pushed to\n * the message's `images[]` array (returned via `image`); every other modality is unsupported and\n * routes through `unsupportedMediaPolicy` to a text envelope (returned via `text`) or throws.\n */\n/**\n * The inline media id-marker (cross-battery convention; see the OpenAI battery's\n * `renderMediaIdMarker`): structural reference text authored by the harness from the\n * harness-controlled `Media.id`, rendered alongside each media so the model can reference it\n * by id in tool calls. Carries no authority; renders outside the untrusted envelope.\n */\nconst renderMediaIdMarker = (media: Media): string => `[media id: ${media.id} | ${media.filename}]`\n\nconst renderMediaForOllama = async (input: {\n media: Media\n toolName: string | undefined\n nonce: string\n unsupportedMediaPolicy: UnsupportedMediaPolicy\n renderTrustedContent: ChatHelpersCommon['renderTrustedContent']\n renderUntrustedContent: ChatHelpersCommon['renderUntrustedContent']\n warn?: (msg: string) => void\n}): Promise<{ image?: string; text?: string }> => {\n const { media, toolName, nonce, unsupportedMediaPolicy, warn } = input\n const modality = modalityHazardToAttr(media.modalityHazard)\n\n if (media.kind === 'image') {\n const b64 = await media.asBase64()\n return { image: b64 }\n }\n\n // Non-image modality — native /api/chat has no representation for it.\n const fallbackText = async (\n keys: ReadonlyArray<string>,\n allowSyntheticFallthrough: boolean\n ): Promise<{ text: string }> => {\n const fallback = resolveFallbackStash(media, keys)\n if (fallback) {\n return {\n text: renderTextInEnvelope(fallback.text, {\n trustTier: fallback.entryTier,\n modality,\n nonce,\n toolName,\n renderTrustedContent: input.renderTrustedContent,\n renderUntrustedContent: input.renderUntrustedContent,\n }),\n }\n }\n if (!allowSyntheticFallthrough) {\n warn?.(\n `unsupportedMediaPolicy='fallback-stash' for ${media.filename}: no matching stash entry — falling through to synthetic description.`\n )\n }\n const byteLen = await media.byteLength()\n return {\n text: renderTextInEnvelope(renderSyntheticMediaDescription(media, byteLen), {\n trustTier: media.trustTier,\n modality,\n nonce,\n toolName,\n renderTrustedContent: input.renderTrustedContent,\n renderUntrustedContent: input.renderUntrustedContent,\n }),\n }\n }\n\n if (unsupportedMediaPolicy === 'throw') {\n throw new E_OLLAMA_UNSUPPORTED_MEDIA_MODALITY([media.kind, media.mimeType, media.filename])\n }\n if (\n unsupportedMediaPolicy === 'fallback-stash' ||\n (typeof unsupportedMediaPolicy === 'object' && unsupportedMediaPolicy.mode === 'fallback-stash')\n ) {\n const keys =\n typeof unsupportedMediaPolicy === 'object'\n ? unsupportedMediaPolicy.stashKeys\n : DEFAULT_STASH_FALLBACK_KEYS\n return fallbackText(keys, false)\n }\n return fallbackText([], true)\n}\n\n// ─── renderOllamaTimelineMessage ──────────────────────────────────────────────\n\n/**\n * Renders a single timeline {@link @nhtio/adk!Message} into a native Ollama message — flattening any\n * media into the base64 `images[]` array, surfacing reasoning as `thinking`, and wrapping textual\n * bodies in the appropriate trust envelope.\n */\nexport const renderOllamaTimelineMessage = async (input: {\n message: Message\n selfIdentity: string\n unsupportedMediaPolicy: UnsupportedMediaPolicy\n warn?: (msg: string) => void\n}): Promise<OllamaMessage> => {\n const { message, selfIdentity, unsupportedMediaPolicy, warn } = input\n const identifier =\n message.identity?.identifier !== undefined && message.identity?.identifier !== null\n ? String(message.identity.identifier)\n : ''\n const representationRaw =\n message.identity?.representation !== undefined && message.identity?.representation !== null\n ? message.identity.representation.toString()\n : ''\n const representation = representationRaw.length > 0 ? representationRaw : identifier\n const text = message.content !== undefined ? message.content.toString() : ''\n const createdAtStr = message.createdAt.toISO?.() ?? ''\n const createdAtAttr = createdAtStr ? ` createdAt=\"${escapeXmlAttribute(createdAtStr)}\"` : ''\n const attachments = message.attachments\n\n // Build the text envelope (same identity logic as the OpenAI battery — wire-agnostic).\n let envelopeText: string\n let role: 'user' | 'assistant'\n if (message.role === 'user') {\n role = 'user'\n if (identifier.length === 0) {\n envelopeText = text\n } else {\n const fromAttr = escapeXmlAttribute(representation)\n envelopeText = `<message_${message.id} from=\"${fromAttr}\" role=\"user\"${createdAtAttr}>\\n${text}\\n</message_${message.id}>`\n }\n } else {\n role = 'assistant'\n if (identifier.length === 0 || identifier === selfIdentity) {\n envelopeText = text\n } else {\n const fromAttr = escapeXmlAttribute(representation)\n envelopeText = `<peer_agent_output_${message.id} from=\"${fromAttr}\"${createdAtAttr}>\\n${text}\\n</peer_agent_output_${message.id}>`\n }\n }\n\n const images: string[] = []\n const extraTexts: string[] = []\n for (const media of attachments) {\n const rendered = await renderMediaForOllama({\n media,\n toolName: undefined,\n nonce: message.id,\n unsupportedMediaPolicy,\n renderTrustedContent,\n renderUntrustedContent,\n warn,\n })\n extraTexts.push(renderMediaIdMarker(media))\n if (rendered.image !== undefined) images.push(rendered.image)\n if (rendered.text !== undefined) extraTexts.push(rendered.text)\n }\n\n // Non-image fallbacks (text envelopes) are appended to the message content; images ride in the\n // separate native `images[]` field.\n const contentParts: string[] = []\n if (envelopeText.length > 0) contentParts.push(envelopeText)\n for (const t of extraTexts) contentParts.push(t)\n const out: OllamaMessage = { role, content: contentParts.join('\\n') }\n if (images.length > 0) out.images = images\n return out\n}\n/** Default timeline-message renderer; alias of {@link renderOllamaTimelineMessage}. */\nexport const defaultRenderOllamaTimelineMessage = renderOllamaTimelineMessage\n\n// ─── renderOllamaToolCallResult ───────────────────────────────────────────────\n\nconst looksLikeSpooledArtifact = (value: unknown): value is SpooledArtifact => {\n if (!value || typeof value !== 'object') return false\n const v = value as Record<string, unknown>\n return (\n typeof v.asString === 'function' &&\n typeof v.byteLength === 'function' &&\n typeof v.lineCount === 'function' &&\n typeof v.estimateTokens === 'function'\n )\n}\n\nconst renderArtifactHandleBody = (\n toolCall: ToolCall,\n artifact: SpooledArtifact,\n byteLength: number,\n lineCount: number\n): string => {\n const ctor = (\n artifact as unknown as {\n constructor: { toolMethods?: ReadonlyArray<{ name: string; description?: string }> }\n }\n ).constructor\n const methods = ctor?.toolMethods ?? []\n const lines: string[] = []\n lines.push(`This tool returned a large artifact that was not inlined to preserve context budget.`)\n lines.push(``)\n lines.push(`Artifact metadata:`)\n lines.push(`- callId: ${toolCall.id}`)\n lines.push(`- kind: ${ctor?.constructor?.name ?? 'SpooledArtifact'}`)\n lines.push(`- byteLength: ${byteLength}`)\n lines.push(`- lineCount: ${lineCount}`)\n lines.push(``)\n lines.push(`To read this artifact in this turn, call one of the following tools with`)\n lines.push(`callId=${toolCall.id}:`)\n for (const m of methods) {\n if (m.description) {\n lines.push(`- ${m.name} — ${m.description}`)\n } else {\n lines.push(`- ${m.name}`)\n }\n }\n lines.push(``)\n lines.push(\n `The artifact persists in this turn's context — multiple queries against the same callId are allowed and efficient. Do not assume the body has been inlined anywhere else.`\n )\n return lines.join('\\n')\n}\n\n/**\n * Render a tool-call result to native Ollama tool-message content (always a string). Media results\n * are routed through the internal media renderer: images cannot ride on a tool-role message's\n * `content`, so an image result is replaced with a short text marker (the image bytes are not\n * re-sent on a tool message); non-image media use the same fallback-text path as elsewhere.\n */\nexport const renderOllamaToolCallResult = async (input: {\n toolCall: ToolCall\n results: Tokenizable | SpooledArtifact | SpooledArtifact[] | Media | Media[]\n tool: Tool | ArtifactTool | undefined\n renderUntrustedContent: ChatHelpersCommon['renderUntrustedContent']\n renderTrustedContent: ChatHelpersCommon['renderTrustedContent']\n unsupportedMediaPolicy: UnsupportedMediaPolicy\n warn?: (msg: string) => void\n}): Promise<string> => {\n const { toolCall, results, tool, warn, unsupportedMediaPolicy } = input\n const isTrusted =\n tool !== null && tool !== undefined && (tool as { trusted?: boolean }).trusted === true\n\n if (tool === undefined) {\n warn?.(\n `Tool \"${toolCall.tool}\" is not present in the bound tool registry at render time; defaulting to untrusted envelope.`\n )\n }\n\n // Media silo — bypasses Tool.trusted (Trust-Is-Content rule).\n const isMediaResult = Media.isMedia(results)\n const isMediaArrayResult =\n Array.isArray(results) && results.length > 0 && results.every((r) => Media.isMedia(r))\n if (isMediaResult || isMediaArrayResult) {\n const mediaList = isMediaResult ? [results as Media] : (results as Media[])\n const parts: string[] = []\n for (const media of mediaList) {\n const rendered = await renderMediaForOllama({\n media,\n toolName: toolCall.tool,\n nonce: toolCall.checksum,\n unsupportedMediaPolicy,\n renderTrustedContent: input.renderTrustedContent,\n renderUntrustedContent: input.renderUntrustedContent,\n warn,\n })\n parts.push(renderMediaIdMarker(media))\n if (rendered.text !== undefined) {\n parts.push(rendered.text)\n } else {\n // An image tool-result cannot be carried on a tool-role message's string content; emit a\n // text marker in its place so the model knows an image was produced.\n const byteLen = await media.byteLength()\n parts.push(\n input.renderUntrustedContent(renderSyntheticMediaDescription(media, byteLen), {\n nonce: toolCall.checksum,\n kind: 'tool-result-image',\n tool: toolCall.tool,\n modality: modalityHazardToAttr(media.modalityHazard),\n })\n )\n }\n }\n return parts.join('\\n')\n }\n\n // SpooledArtifact[] silo.\n if (Array.isArray(results)) {\n const parts: string[] = []\n for (const a of results) {\n parts.push(await (a as SpooledArtifact).asString())\n }\n const joined = parts.join('\\n\\n')\n return isTrusted\n ? input.renderTrustedContent(joined, {\n nonce: toolCall.checksum,\n kind: 'trusted-tool-result',\n tool: toolCall.tool,\n })\n : input.renderUntrustedContent(joined, {\n nonce: toolCall.checksum,\n kind: 'tool-result',\n tool: toolCall.tool,\n })\n }\n\n const isSpooled = looksLikeSpooledArtifact(results)\n\n // Handle-pattern branch: spooled + inline=false → always untrusted (queryable-data).\n if (isSpooled && toolCall.inline === false) {\n const artifact = results as SpooledArtifact\n let byteLength = 0\n let lineCount = 0\n try {\n byteLength = await artifact.byteLength()\n } catch {\n byteLength = 0\n }\n try {\n lineCount = await artifact.lineCount()\n } catch {\n lineCount = 0\n }\n const body = renderArtifactHandleBody(toolCall, artifact, byteLength, lineCount)\n return input.renderUntrustedContent(body, {\n nonce: toolCall.checksum,\n kind: 'artifact-handle',\n tool: toolCall.tool,\n })\n }\n\n if (!isSpooled && toolCall.inline === false) {\n warn?.(\n `Tool call ${toolCall.id} has inline=false but results is a Tokenizable (not a SpooledArtifact); rendering inline anyway.`\n )\n }\n\n const body = isSpooled\n ? await (results as SpooledArtifact).asString()\n : (results as Tokenizable).toString()\n\n return isTrusted\n ? input.renderTrustedContent(body, {\n nonce: toolCall.checksum,\n kind: 'trusted-tool-result',\n tool: toolCall.tool,\n })\n : input.renderUntrustedContent(body, {\n nonce: toolCall.checksum,\n kind: 'tool-result',\n tool: toolCall.tool,\n })\n}\n/** Default tool-call-result renderer; alias of {@link renderOllamaToolCallResult}. */\nexport const defaultRenderOllamaToolCallResult = renderOllamaToolCallResult\n\n// ─── buildOllamaHistory ───────────────────────────────────────────────────────\n\ntype TimelineItem =\n | { kind: 'message'; createdAt: number; value: Message }\n | { kind: 'thought'; createdAt: number; value: Thought }\n | { kind: 'toolCall'; createdAt: number; value: ToolCall }\n\n/**\n * Assembles the complete native Ollama message history for a dispatch — system prompt and content\n * buckets, the interleaved timeline of messages/thoughts/tool calls, and the collected opaque\n * reasoning payloads — by delegating to the injected sub-renderers.\n */\nexport const buildOllamaHistory = async (input: {\n systemPrompt: Tokenizable\n standingInstructions: Iterable<Tokenizable>\n memories: Iterable<Memory>\n retrievables: Iterable<Retrievable>\n messages: Iterable<Message>\n thoughts: Iterable<Thought>\n toolCalls: Iterable<ToolCall>\n tools: ToolRegistry\n renderedToolCallResults: Map<string, string>\n bucketOrder: ChatCompletionsBucketOrder\n selfIdentity: string\n thoughtSurfacing: 'all-self' | 'latest-self' | 'all'\n replayCompatibility: ReadonlyArray<string>\n unsupportedMediaPolicy: UnsupportedMediaPolicy\n renderOllamaToolCallResult: OllamaHelpers['renderOllamaToolCallResult']\n renderChatCompletionsSystemPrompt: ChatHelpersCommon['renderChatCompletionsSystemPrompt']\n renderStandingInstructions: ChatHelpersCommon['renderStandingInstructions']\n renderMemories: ChatHelpersCommon['renderMemories']\n renderRetrievables: ChatHelpersCommon['renderRetrievables']\n renderRetrievableSafetyDirective: ChatHelpersCommon['renderRetrievableSafetyDirective']\n renderFirstPartyRetrievables: ChatHelpersCommon['renderFirstPartyRetrievables']\n renderThirdPartyPublicRetrievables: ChatHelpersCommon['renderThirdPartyPublicRetrievables']\n renderThirdPartyPrivateRetrievables: ChatHelpersCommon['renderThirdPartyPrivateRetrievables']\n renderOllamaTimelineMessage: OllamaHelpers['renderOllamaTimelineMessage']\n renderThought: ChatHelpersCommon['renderThought']\n filterThoughts: ChatHelpersCommon['filterThoughts']\n renderUntrustedContent: ChatHelpersCommon['renderUntrustedContent']\n renderTrustedContent: ChatHelpersCommon['renderTrustedContent']\n warn?: (msg: string) => void\n}): Promise<{\n messages: OllamaMessage[]\n reasoningPayloads: Array<{ id: string; replayCompatibility: string; payload: unknown }>\n}> => {\n const out: OllamaMessage[] = []\n const reasoningPayloads: Array<{ id: string; replayCompatibility: string; payload: unknown }> = []\n\n const buckets = input.bucketOrder\n const timelineIdx = buckets.indexOf('timeline')\n\n const leadingSystem = await input.renderChatCompletionsSystemPrompt({\n systemPrompt: input.systemPrompt,\n standingInstructions: input.standingInstructions,\n memories: input.memories,\n retrievables: input.retrievables,\n bucketOrder: buckets,\n renderStandingInstructions: input.renderStandingInstructions,\n renderMemories: input.renderMemories,\n renderRetrievables: input.renderRetrievables,\n renderRetrievableSafetyDirective: input.renderRetrievableSafetyDirective,\n renderFirstPartyRetrievables: input.renderFirstPartyRetrievables,\n renderThirdPartyPublicRetrievables: input.renderThirdPartyPublicRetrievables,\n renderThirdPartyPrivateRetrievables: input.renderThirdPartyPrivateRetrievables,\n renderUntrustedContent: input.renderUntrustedContent,\n })\n if (leadingSystem.length > 0) {\n out.push({ role: 'system', content: leadingSystem })\n }\n\n const includesTimeline = timelineIdx !== -1\n if (includesTimeline) {\n const survivingThoughts = input.filterThoughts(\n input.thoughts,\n input.thoughtSurfacing,\n input.selfIdentity,\n input.replayCompatibility\n )\n\n const items: TimelineItem[] = []\n for (const m of input.messages) {\n items.push({ kind: 'message', createdAt: m.createdAt.toMillis(), value: m })\n }\n for (const t of survivingThoughts) {\n items.push({ kind: 'thought', createdAt: t.createdAt.toMillis(), value: t })\n }\n for (const tc of input.toolCalls) {\n items.push({ kind: 'toolCall', createdAt: tc.createdAt.toMillis(), value: tc })\n }\n items.sort((a, b) => a.createdAt - b.createdAt)\n\n const replaySet = new Set<string>([...input.replayCompatibility])\n\n for (const item of items) {\n if (item.kind === 'message') {\n out.push(\n await input.renderOllamaTimelineMessage({\n message: item.value,\n selfIdentity: input.selfIdentity,\n unsupportedMediaPolicy: input.unsupportedMediaPolicy,\n warn: input.warn,\n })\n )\n } else if (item.kind === 'thought') {\n const t = item.value\n const identifier = String(t.identity?.identifier ?? '')\n const isSelf = identifier === input.selfIdentity\n const hasPayload = t.payload !== undefined\n const compatTag = t.replayCompatibility\n\n if (hasPayload && compatTag && replaySet.has(compatTag)) {\n reasoningPayloads.push({ id: t.id, replayCompatibility: compatTag, payload: t.payload })\n const envelope = input.renderThought(\n t.content.toString(),\n {\n nonce: t.id,\n kind: 'opaque-reasoning',\n from: identifier,\n createdAt: t.createdAt?.toISO?.() ?? undefined,\n replayCompatibility: compatTag,\n },\n t.payload\n )\n out.push({ role: 'assistant', content: envelope })\n } else if (!hasPayload) {\n const envelope = input.renderThought(t.content.toString(), {\n nonce: t.id,\n kind: isSelf ? 'self-reasoning' : 'peer-reasoning',\n from: identifier,\n createdAt: t.createdAt?.toISO?.() ?? undefined,\n })\n out.push({ role: 'assistant', content: envelope })\n }\n // else: opaque, non-matching → elided.\n } else {\n // tool call: synthetic assistant message carrying tool_calls[] (object-form arguments),\n // followed by a tool-role message labelled by `tool_name` (NOT tool_call_id).\n const tc = item.value\n const args =\n tc.args !== null && typeof tc.args === 'object' && !Array.isArray(tc.args)\n ? (tc.args as Record<string, unknown>)\n : {}\n out.push({\n role: 'assistant',\n content: '',\n tool_calls: [{ function: { name: tc.tool, arguments: args } }],\n })\n\n let rendered = input.renderedToolCallResults.get(tc.id)\n if (rendered === undefined) {\n const tool = input.tools.get?.(tc.tool)\n rendered = await input.renderOllamaToolCallResult({\n toolCall: tc,\n results: tc.results as\n | Tokenizable\n | SpooledArtifact\n | SpooledArtifact[]\n | Media\n | Media[],\n tool: tool as Tool | ArtifactTool | undefined,\n renderUntrustedContent: input.renderUntrustedContent,\n renderTrustedContent: input.renderTrustedContent,\n unsupportedMediaPolicy: input.unsupportedMediaPolicy,\n warn: input.warn,\n })\n }\n out.push({ role: 'tool', content: rendered, tool_name: tc.tool })\n }\n }\n }\n\n if (includesTimeline) {\n const trailingParts: string[] = []\n for (let i = timelineIdx + 1; i < buckets.length; i++) {\n const label = buckets[i]!\n if (label === 'standingInstructions') {\n const block = input.renderStandingInstructions(input.standingInstructions)\n if (block.length > 0) trailingParts.push(block)\n } else if (label === 'memories') {\n const wrapped: Array<{ memory: Memory; attrs: MemoryAttrs }> = []\n for (const m of input.memories) {\n wrapped.push(memoryToAttrs(m))\n }\n const block = input.renderMemories(wrapped)\n if (block.length > 0) trailingParts.push(block)\n } else if (label === 'retrievables') {\n const wrapped: Array<{ retrievable: Retrievable; attrs: RetrievableAttrs }> = []\n for (const r of input.retrievables) {\n wrapped.push(retrievableToAttrs(r))\n }\n const block = await input.renderRetrievables(wrapped, {\n renderRetrievableSafetyDirective: input.renderRetrievableSafetyDirective,\n renderFirstPartyRetrievables: input.renderFirstPartyRetrievables,\n renderThirdPartyPublicRetrievables: input.renderThirdPartyPublicRetrievables,\n renderThirdPartyPrivateRetrievables: input.renderThirdPartyPrivateRetrievables,\n renderUntrustedContent: input.renderUntrustedContent,\n })\n if (block.length > 0) trailingParts.push(block)\n }\n }\n if (trailingParts.length > 0) {\n out.push({ role: 'system', content: trailingParts.join('\\n\\n') })\n }\n }\n\n return { messages: out, reasoningPayloads }\n}\n/** Default native-history assembler; alias of {@link buildOllamaHistory}. */\nexport const defaultBuildOllamaHistory = buildOllamaHistory\n\n// suppress unused\nvoid isInstanceOf\n"],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
2
|
require("../../../chunk-Ble4zEEl.js");
|
|
3
|
-
const require_common = require("../../../common-
|
|
3
|
+
const require_common = require("../../../common-CCDLEmQk.js");
|
|
4
4
|
require("../../../guards.cjs");
|
|
5
5
|
const require_batteries_llm_ollama_exceptions = require("./exceptions.cjs");
|
|
6
6
|
let _nhtio_validation = require("@nhtio/validation");
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { i as byteStoreSchema } from "../../../common-
|
|
1
|
+
import { i as byteStoreSchema } from "../../../common-Bs4H4NOD.mjs";
|
|
2
2
|
import "../../../guards.mjs";
|
|
3
3
|
import { E_INVALID_OLLAMA_OPTIONS } from "./exceptions.mjs";
|
|
4
4
|
import { validator } from "@nhtio/validation";
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
2
|
require("../../../chunk-Ble4zEEl.js");
|
|
3
|
-
const require_tool_registry = require("../../../tool_registry-
|
|
4
|
-
const require_thought = require("../../../thought-
|
|
5
|
-
const require_spooled_artifact = require("../../../spooled_artifact-
|
|
6
|
-
require("../../../common-
|
|
7
|
-
const require_tool_call = require("../../../tool_call-
|
|
3
|
+
const require_tool_registry = require("../../../tool_registry-qQXq9zs0.js");
|
|
4
|
+
const require_thought = require("../../../thought-BSpZK-Q3.js");
|
|
5
|
+
const require_spooled_artifact = require("../../../spooled_artifact-DmZKXhnn.js");
|
|
6
|
+
require("../../../common-CCDLEmQk.js");
|
|
7
|
+
const require_tool_call = require("../../../tool_call-B1VXAAmn.js");
|
|
8
8
|
require("../../../guards.cjs");
|
|
9
9
|
const require_lib_utils_retry = require("../../../lib/utils/retry.cjs");
|
|
10
10
|
const require_batteries_llm_openai_chat_completions_exceptions = require("./exceptions.cjs");
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { a as Tokenizable, c as isObject, n as canonicalStringify, o as isError, s as isInstanceOf, t as ToolRegistry } from "../../../tool_registry-
|
|
2
|
-
import { n as Message, t as Thought } from "../../../thought-
|
|
3
|
-
import { i as ArtifactTool, t as SpooledArtifact } from "../../../spooled_artifact-
|
|
4
|
-
import "../../../common-
|
|
5
|
-
import { n as Media, t as ToolCall } from "../../../tool_call-
|
|
1
|
+
import { a as Tokenizable, c as isObject, n as canonicalStringify, o as isError, s as isInstanceOf, t as ToolRegistry } from "../../../tool_registry-D6gaqCO1.mjs";
|
|
2
|
+
import { n as Message, t as Thought } from "../../../thought-Dpvmq9yj.mjs";
|
|
3
|
+
import { i as ArtifactTool, t as SpooledArtifact } from "../../../spooled_artifact-PV0MTlL1.mjs";
|
|
4
|
+
import "../../../common-Bs4H4NOD.mjs";
|
|
5
|
+
import { n as Media, t as ToolCall } from "../../../tool_call-B2Ty8FuQ.mjs";
|
|
6
6
|
import "../../../guards.mjs";
|
|
7
7
|
import { computeBackoff, linkAbortSignals, parseRetryAfter, sleepWithJitter } from "../../../lib/utils/retry.mjs";
|
|
8
8
|
import { E_INVALID_OPENAI_CHAT_COMPLETIONS_OPTIONS, E_OPENAI_CHAT_COMPLETIONS_CONTEXT_OVERFLOW, E_OPENAI_CHAT_COMPLETIONS_HTTP_ERROR, E_OPENAI_CHAT_COMPLETIONS_INVALID_TOOL_CALL_ARGS, E_OPENAI_CHAT_COMPLETIONS_REQUEST_TIMEOUT, E_OPENAI_CHAT_COMPLETIONS_STREAM_ERROR, E_OPENAI_CHAT_COMPLETIONS_STREAM_STALLED } from "./exceptions.mjs";
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
2
|
require("../../../chunk-Ble4zEEl.js");
|
|
3
|
-
require("../../../common-
|
|
4
|
-
const require_tool_call = require("../../../tool_call-
|
|
3
|
+
require("../../../common-CCDLEmQk.js");
|
|
4
|
+
const require_tool_call = require("../../../tool_call-B1VXAAmn.js");
|
|
5
5
|
require("../../../guards.cjs");
|
|
6
6
|
const require_batteries_llm_openai_chat_completions_exceptions = require("./exceptions.cjs");
|
|
7
7
|
const require_helpers = require("../../../helpers-DSTFxTiC.js");
|
|
@@ -109,7 +109,26 @@ var renderTextInEnvelope = (text, args) => {
|
|
|
109
109
|
});
|
|
110
110
|
};
|
|
111
111
|
var renderSyntheticMediaDescription = (media, byteLen) => `[media: ${media.filename}, ${media.mimeType}, ${formatBytesHumanReadable(byteLen)}]`;
|
|
112
|
+
/**
|
|
113
|
+
* The inline media id-marker: a harness-authored text block rendered immediately BEFORE each
|
|
114
|
+
* media content block, so the model can reference the media by id in subsequent tool calls
|
|
115
|
+
* (`media_id` args, `@id` pipe refs).
|
|
116
|
+
*
|
|
117
|
+
* Trust posture: the marker is structural reference data authored by the harness from the
|
|
118
|
+
* harness-controlled `Media.id` (a UUID, not derivable from the payload) — it is NOT payload
|
|
119
|
+
* content, carries no authority, and deliberately renders OUTSIDE the untrusted envelope with
|
|
120
|
+
* fixed, non-instruction phrasing. This is a documented cross-battery convention: every LLM
|
|
121
|
+
* battery that renders media emits the same marker shape.
|
|
122
|
+
*/
|
|
123
|
+
var renderMediaIdMarker = (media) => `[media id: ${media.id} | ${media.filename}]`;
|
|
112
124
|
var renderMediaToContentBlocks = async (input) => {
|
|
125
|
+
const blocks = await renderMediaBodyBlocks(input);
|
|
126
|
+
return [{
|
|
127
|
+
type: "text",
|
|
128
|
+
text: renderMediaIdMarker(input.media)
|
|
129
|
+
}, ...blocks];
|
|
130
|
+
};
|
|
131
|
+
var renderMediaBodyBlocks = async (input) => {
|
|
113
132
|
const { media, toolName, nonce, unsupportedMediaPolicy, warn } = input;
|
|
114
133
|
const modality = modalityHazardToAttr(media.modalityHazard);
|
|
115
134
|
const kind = media.kind;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helpers.cjs","names":[],"sources":["../../../../src/batteries/llm/openai_chat_completions/helpers.ts"],"sourcesContent":["/**\n * Swappable translation helpers for rendering ADK state into Chat Completions requests.\n *\n * @module @nhtio/adk/batteries/llm/openai_chat_completions/helpers\n *\n * @remarks\n * The swappable translation helpers that turn ADK primitives into OpenAI Chat Completions wire\n * shapes. Each helper is exported under its unprefixed name AND under a `default*` alias so\n * consumers can compose partial overrides. Helpers that compose other helpers receive their\n * dependents via explicit input arguments — never via module-level closure — so a swap at any\n * layer propagates correctly.\n *\n * The wire-shape-AGNOSTIC helpers (`renderUntrustedContent`, `renderMemories`,\n * `renderChatCompletionsSystemPrompt`, `toolsToChatCompletionsTools`, …) now live in the shared,\n * internal `../chat_common/helpers` submodule and are re-exported here under their original names\n * so every existing import keeps resolving. Only the OpenAI-WIRE-SPECIFIC helpers\n * (`renderTimelineMessage`, `renderChatCompletionsToolCallResult`, `buildChatCompletionsHistory`,\n * `createChatCompletionsToolCallDeltaAccumulator`) and the reasoning-field extractor are defined\n * here.\n */\n\nimport { Media } from '@nhtio/adk/common'\nimport { isInstanceOf } from '@nhtio/adk/guards'\nimport { E_UNSUPPORTED_MEDIA_MODALITY } from './exceptions'\nimport {\n escapeXmlAttribute,\n sanitiseNameField,\n memoryToAttrs,\n retrievableToAttrs,\n renderTrustedContent,\n renderUntrustedContent,\n} from '../chat_common/helpers'\nimport type { ChatHelpersCommon } from '../chat_common/types'\nimport type {\n Tool,\n ArtifactTool,\n ToolRegistry,\n Tokenizable,\n Memory,\n Message,\n Thought,\n ToolCall,\n Retrievable,\n SpooledArtifact,\n MediaModalityHazard,\n MediaStashEntry,\n} from '@nhtio/adk/common'\nimport type {\n ChatCompletionsMessage,\n ChatCompletionsContentBlock,\n ChatCompletionsToolCallDelta,\n ChatCompletionsToolCallDeltaAccumulator,\n AssembledToolCall,\n ChatCompletionsBucketOrder,\n MemoryAttrs,\n RetrievableAttrs,\n ChatCompletionsHelpers,\n UnsupportedMediaPolicy,\n ReasoningField,\n ReasoningFieldPrecedence,\n ReasoningExtract,\n} from './types'\n\n// ─── Re-exported wire-shape-agnostic helpers (shared submodule) ───────────────\n// These are defined once in `../chat_common/helpers` and shared with the native Ollama battery.\n// Re-exported here (bare + `default*`) so every existing\n// `@nhtio/adk/batteries/llm/openai_chat_completions` import keeps resolving unchanged.\nexport {\n descriptionToChatCompletionsJsonSchema,\n defaultDescriptionToChatCompletionsJsonSchema,\n renderUntrustedContent,\n defaultRenderUntrustedContent,\n renderTrustedContent,\n defaultRenderTrustedContent,\n renderStandingInstructions,\n defaultRenderStandingInstructions,\n renderMemories,\n defaultRenderMemories,\n renderRetrievableSafetyDirective,\n defaultRenderRetrievableSafetyDirective,\n renderFirstPartyRetrievables,\n defaultRenderFirstPartyRetrievables,\n renderThirdPartyPublicRetrievables,\n defaultRenderThirdPartyPublicRetrievables,\n renderThirdPartyPrivateRetrievables,\n defaultRenderThirdPartyPrivateRetrievables,\n renderRetrievables,\n defaultRenderRetrievables,\n renderThought,\n defaultRenderThought,\n filterThoughts,\n defaultFilterThoughts,\n toolsToChatCompletionsTools,\n defaultToolsToChatCompletionsTools,\n renderChatCompletionsSystemPrompt,\n defaultRenderChatCompletionsSystemPrompt,\n} from '../chat_common/helpers'\n\n// ─── extractReasoningFields ───────────────────────────────────────────────────\n\n/**\n * Pulls model reasoning/thinking text out of a Chat Completions response message or stream delta,\n * reading every wire field named in `precedence` that carries a non-empty string.\n *\n * @remarks\n * Reasoning is not part of OpenAI's official Chat Completions spec, so OpenAI-compatible providers\n * disagree on the field name (`reasoning` for Ollama and current vLLM; `reasoning_content` for\n * legacy vLLM and DeepSeek). This reads the union, in `precedence` order, and de-duplicates by\n * content value: a field whose text exactly matches one already kept is dropped.\n *\n * The result length encodes the emission rule the callers follow:\n * - `0` — no reasoning present.\n * - `1` — a single thought (covers \"only one field present\" AND \"several present but identical\").\n * - `≥2` — divergent fields; each surfaces as its own thought rather than silently dropping one.\n *\n * @param src - The response `message` or stream `delta` to read from.\n * @param precedence - Ordered, de-duplicated field names to read (see `reasoningFieldPrecedence`).\n * @returns The present, content-deduplicated reasoning traces in precedence order.\n */\nexport const extractReasoningFields = (\n src: Partial<Record<ReasoningField, string | null | undefined>> | undefined,\n precedence: ReasoningFieldPrecedence\n): ReasoningExtract[] => {\n const out: ReasoningExtract[] = []\n for (const field of precedence) {\n const value = src?.[field]\n if (typeof value !== 'string' || value.length === 0) continue\n if (out.some((e) => e.content === value)) continue\n out.push({ field, content: value })\n }\n return out\n}\n\n// ─── Media rendering helpers (OpenAI content-block specific) ──────────────────\n\nconst DEFAULT_STASH_FALLBACK_KEYS: ReadonlyArray<string> = [\n 'text:transcript',\n 'text:caption',\n 'text:description',\n]\n\nconst modalityHazardToAttr = (h: MediaModalityHazard): 'inert' | 'extractable' | 'opaque' => {\n if (h === 'inert') return 'inert'\n if (h === 'extractable-instructions') return 'extractable'\n return 'opaque'\n}\n\nconst formatBytesHumanReadable = (bytes: number | undefined): string => {\n if (bytes === undefined || !Number.isFinite(bytes)) return 'unknown size'\n if (bytes < 1024) return `${bytes} B`\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`\n if (bytes < 1024 * 1024 * 1024) return `${(bytes / (1024 * 1024)).toFixed(1)} MB`\n return `${(bytes / (1024 * 1024 * 1024)).toFixed(1)} GB`\n}\n\nconst audioFormatFromMime = (mime: string): 'wav' | 'mp3' | undefined => {\n const m = mime.toLowerCase()\n if (m.includes('wav') || m.includes('x-wav') || m.includes('wave')) return 'wav'\n if (m.includes('mpeg') || m.includes('mp3')) return 'mp3'\n return undefined\n}\n\nconst isMediaTextStashEntry = (e: unknown): e is MediaStashEntry => {\n if (!e || typeof e !== 'object') return false\n const r = e as Record<string, unknown>\n return typeof r.value === 'string' && typeof r.trustTier === 'string'\n}\n\nconst resolveFallbackStash = (\n media: Media,\n keys: ReadonlyArray<string>\n): { text: string; entryTier: MediaStashEntry['trustTier'] } | undefined => {\n for (const key of keys) {\n const entry = media.stash.get(key)\n if (isMediaTextStashEntry(entry)) {\n return { text: entry.value as string, entryTier: entry.trustTier }\n }\n }\n return undefined\n}\n\nconst renderTextInEnvelope = (\n text: string,\n args: {\n trustTier: MediaStashEntry['trustTier']\n modality: 'inert' | 'extractable' | 'opaque'\n nonce: string\n toolName: string | undefined\n renderTrustedContent: ChatHelpersCommon['renderTrustedContent']\n renderUntrustedContent: ChatHelpersCommon['renderUntrustedContent']\n }\n): string => {\n if (args.trustTier === 'first-party') {\n return args.renderTrustedContent(text, {\n nonce: args.nonce,\n kind: 'media-fallback',\n tool: args.toolName,\n modality: args.modality,\n })\n }\n return args.renderUntrustedContent(text, {\n nonce: args.nonce,\n kind: 'media-fallback',\n tool: args.toolName,\n modality: args.modality,\n })\n}\n\nconst renderSyntheticMediaDescription = (media: Media, byteLen: number | undefined): string =>\n `[media: ${media.filename}, ${media.mimeType}, ${formatBytesHumanReadable(byteLen)}]`\n\nconst renderMediaToContentBlocks = async (input: {\n media: Media\n toolName: string | undefined\n nonce: string\n unsupportedMediaPolicy: UnsupportedMediaPolicy\n renderTrustedContent: ChatHelpersCommon['renderTrustedContent']\n renderUntrustedContent: ChatHelpersCommon['renderUntrustedContent']\n warn?: (msg: string) => void\n}): Promise<ChatCompletionsContentBlock[]> => {\n const { media, toolName, nonce, unsupportedMediaPolicy, warn } = input\n const modality = modalityHazardToAttr(media.modalityHazard)\n const kind = media.kind\n\n const fallbackPath = async (\n keys: ReadonlyArray<string>,\n allowSyntheticFallthrough: boolean\n ): Promise<ChatCompletionsContentBlock[]> => {\n const fallback = resolveFallbackStash(media, keys)\n if (fallback) {\n const text = renderTextInEnvelope(fallback.text, {\n trustTier: fallback.entryTier,\n modality,\n nonce,\n toolName,\n renderTrustedContent: input.renderTrustedContent,\n renderUntrustedContent: input.renderUntrustedContent,\n })\n return [{ type: 'text', text }]\n }\n if (!allowSyntheticFallthrough) {\n // 'fallback-stash' falls through to 'synthetic-description' when no entry is found.\n warn?.(\n `unsupportedMediaPolicy='fallback-stash' for ${media.filename}: no matching stash entry — falling through to synthetic description.`\n )\n }\n const byteLen = await media.byteLength()\n const text = renderTextInEnvelope(renderSyntheticMediaDescription(media, byteLen), {\n trustTier: media.trustTier,\n modality,\n nonce,\n toolName,\n renderTrustedContent: input.renderTrustedContent,\n renderUntrustedContent: input.renderUntrustedContent,\n })\n return [{ type: 'text', text }]\n }\n\n if (kind === 'image') {\n const b64 = await media.asBase64()\n return [\n {\n type: 'image_url',\n image_url: { url: `data:${media.mimeType};base64,${b64}` },\n },\n ]\n }\n\n if (kind === 'audio') {\n const fmt = audioFormatFromMime(media.mimeType)\n if (fmt === undefined) {\n // Audio mime not natively expressible — same policy path as video.\n if (unsupportedMediaPolicy === 'throw') {\n throw new E_UNSUPPORTED_MEDIA_MODALITY([media.kind, media.mimeType, media.filename])\n }\n if (\n unsupportedMediaPolicy === 'fallback-stash' ||\n (typeof unsupportedMediaPolicy === 'object' &&\n unsupportedMediaPolicy.mode === 'fallback-stash')\n ) {\n const keys =\n typeof unsupportedMediaPolicy === 'object'\n ? unsupportedMediaPolicy.stashKeys\n : DEFAULT_STASH_FALLBACK_KEYS\n return fallbackPath(keys, false)\n }\n return fallbackPath([], true)\n }\n const data = await media.asBase64()\n return [\n {\n type: 'input_audio',\n input_audio: { data, format: fmt },\n },\n ]\n }\n\n if (kind === 'document') {\n const b64 = await media.asBase64()\n return [\n {\n type: 'file',\n file: {\n filename: media.filename,\n file_data: `data:${media.mimeType};base64,${b64}`,\n },\n },\n ]\n }\n\n // kind === 'video' — not natively supported by Chat Completions wire format.\n if (unsupportedMediaPolicy === 'throw') {\n throw new E_UNSUPPORTED_MEDIA_MODALITY([media.kind, media.mimeType, media.filename])\n }\n if (\n unsupportedMediaPolicy === 'fallback-stash' ||\n (typeof unsupportedMediaPolicy === 'object' && unsupportedMediaPolicy.mode === 'fallback-stash')\n ) {\n const keys =\n typeof unsupportedMediaPolicy === 'object'\n ? unsupportedMediaPolicy.stashKeys\n : DEFAULT_STASH_FALLBACK_KEYS\n return fallbackPath(keys, false)\n }\n return fallbackPath([], true)\n}\n\n// ─── renderTimelineMessage ────────────────────────────────────────────────────\n\n/**\n * Renders a single timeline {@link @nhtio/adk!Message} into an OpenAI Chat Completions message —\n * mapping media to content blocks (`image_url` / `input_audio` / `file`), wrapping textual bodies\n * in the appropriate trust envelope, and applying the unsupported-media policy.\n */\nexport const renderTimelineMessage = async (input: {\n message: Message\n selfIdentity: string\n unsupportedMediaPolicy: UnsupportedMediaPolicy\n warn?: (msg: string) => void\n}): Promise<ChatCompletionsMessage> => {\n const { message, selfIdentity, unsupportedMediaPolicy, warn } = input\n const identifier =\n message.identity?.identifier !== undefined && message.identity?.identifier !== null\n ? String(message.identity.identifier)\n : ''\n const representationRaw =\n message.identity?.representation !== undefined && message.identity?.representation !== null\n ? message.identity.representation.toString()\n : ''\n // Prompt-facing identity (the `from=` attribute) reads `representation`;\n // structural `messages[].name` reads `identifier`. Fall back to `identifier`\n // when `representation` is empty so a bare-string identity still renders.\n const representation = representationRaw.length > 0 ? representationRaw : identifier\n const text = message.content !== undefined ? message.content.toString() : ''\n const createdAtStr = message.createdAt.toISO?.() ?? ''\n const createdAtAttr = createdAtStr ? ` createdAt=\"${escapeXmlAttribute(createdAtStr)}\"` : ''\n const attachments = message.attachments\n const hasAttachments = attachments.length > 0\n\n // Build the text envelope first (same logic as before).\n let envelopeText: string\n let nameField: string | undefined\n let role: 'user' | 'assistant'\n if (message.role === 'user') {\n role = 'user'\n if (identifier.length === 0) {\n envelopeText = text\n } else {\n nameField = sanitiseNameField(identifier)\n const fromAttr = escapeXmlAttribute(representation)\n envelopeText = `<message_${message.id} from=\"${fromAttr}\" role=\"user\"${createdAtAttr}>\\n${text}\\n</message_${message.id}>`\n }\n } else {\n role = 'assistant'\n if (identifier.length === 0 || identifier === selfIdentity) {\n if (identifier.length > 0) {\n nameField = sanitiseNameField(identifier)\n }\n envelopeText = text\n } else {\n nameField = sanitiseNameField(identifier)\n const fromAttr = escapeXmlAttribute(representation)\n envelopeText = `<peer_agent_output_${message.id} from=\"${fromAttr}\"${createdAtAttr}>\\n${text}\\n</peer_agent_output_${message.id}>`\n }\n }\n\n if (!hasAttachments) {\n const out: ChatCompletionsMessage = { role, content: envelopeText }\n if (nameField !== undefined) out.name = nameField\n return out\n }\n\n // Content-array path: text first (when present), then attachment blocks in array order.\n const blocks: ChatCompletionsContentBlock[] = []\n if (text.length > 0) {\n blocks.push({ type: 'text', text: envelopeText })\n }\n for (const media of attachments) {\n const mediaBlocks = await renderMediaToContentBlocks({\n media,\n toolName: undefined,\n nonce: message.id,\n unsupportedMediaPolicy,\n renderTrustedContent,\n renderUntrustedContent,\n warn,\n })\n for (const b of mediaBlocks) blocks.push(b)\n }\n const out: ChatCompletionsMessage = { role, content: blocks }\n if (nameField !== undefined) out.name = nameField\n return out\n}\n/** Default timeline-message renderer; alias of {@link renderTimelineMessage}. */\nexport const defaultRenderTimelineMessage = renderTimelineMessage\n\n// ─── renderChatCompletionsToolCallResult ──────────────────────────────────────\n\nconst isSpooledArtifactResult = (\n results: SpooledArtifact | Tokenizable\n): results is SpooledArtifact =>\n isInstanceOf(results, 'SpooledArtifact') ||\n // Subclasses identify via the base class guard upstream\n ((results as unknown as { constructor?: { isSpooledArtifactConstructor?: boolean } })\n ?.constructor !== null &&\n (results as unknown as { constructor?: { isSpooledArtifactConstructor?: boolean } })\n ?.constructor !== undefined &&\n typeof (\n results as unknown as {\n constructor: { isSpooledArtifactConstructor?: (c: unknown) => boolean }\n }\n ).constructor.isSpooledArtifactConstructor === 'function')\n\nconst looksLikeSpooledArtifact = (value: unknown): value is SpooledArtifact => {\n if (!value || typeof value !== 'object') return false\n const v = value as Record<string, unknown>\n return (\n typeof v.asString === 'function' &&\n typeof v.byteLength === 'function' &&\n typeof v.lineCount === 'function' &&\n typeof v.estimateTokens === 'function'\n )\n}\n\nconst renderArtifactHandleBody = (\n toolCall: ToolCall,\n artifact: SpooledArtifact,\n byteLength: number,\n lineCount: number,\n estimatedTokens: number | undefined,\n encoding: string | undefined\n): string => {\n const ctor = (\n artifact as unknown as {\n constructor: { toolMethods?: ReadonlyArray<{ name: string; description?: string }> }\n }\n ).constructor\n const methods = ctor?.toolMethods ?? []\n const lines: string[] = []\n lines.push(`This tool returned a large artifact that was not inlined to preserve context budget.`)\n lines.push(``)\n lines.push(`Artifact metadata:`)\n lines.push(`- callId: ${toolCall.id}`)\n lines.push(`- kind: ${ctor?.constructor?.name ?? 'SpooledArtifact'}`)\n lines.push(`- byteLength: ${byteLength}`)\n lines.push(`- lineCount: ${lineCount}`)\n if (estimatedTokens !== undefined && encoding) {\n lines.push(`- estimatedTokens: ${estimatedTokens} (encoding: ${encoding})`)\n }\n lines.push(``)\n lines.push(`To read this artifact in this turn, call one of the following tools with`)\n lines.push(`callId=${toolCall.id}:`)\n for (const m of methods) {\n if (m.description) {\n lines.push(`- ${m.name} — ${m.description}`)\n } else {\n lines.push(`- ${m.name}`)\n }\n }\n lines.push(``)\n lines.push(\n `The artifact persists in this turn's context — multiple queries against the same callId are allowed and efficient. Do not assume the body has been inlined anywhere else.`\n )\n return lines.join('\\n')\n}\n\n/**\n * Renders a tool call's result(s) into the OpenAI Chat Completions tool-message body — either a\n * plain string or an array of content blocks when the result carries media — wrapping textual\n * output in the trust envelope appropriate to the tool's trust level.\n */\nexport const renderChatCompletionsToolCallResult = async (input: {\n toolCall: ToolCall\n results: Tokenizable | SpooledArtifact | SpooledArtifact[] | Media | Media[]\n tool: Tool | ArtifactTool | undefined\n renderUntrustedContent: ChatHelpersCommon['renderUntrustedContent']\n renderTrustedContent: ChatHelpersCommon['renderTrustedContent']\n unsupportedMediaPolicy: UnsupportedMediaPolicy\n warn?: (msg: string) => void\n}): Promise<string | ChatCompletionsContentBlock[]> => {\n const { toolCall, results, tool, warn, unsupportedMediaPolicy } = input\n const isTrusted =\n tool !== null && tool !== undefined && (tool as { trusted?: boolean }).trusted === true\n\n if (tool === undefined) {\n warn?.(\n `Tool \"${toolCall.tool}\" is not present in the bound tool registry at render time; defaulting to untrusted envelope.`\n )\n }\n\n // Media / Media[] silo — bypasses Tool.trusted (Trust-Is-Content rule). Envelope is sourced\n // from each Media's own trustTier; modality from each Media's modalityHazard.\n const isMediaResult = Media.isMedia(results)\n const isMediaArrayResult =\n Array.isArray(results) && results.length > 0 && results.every((r) => Media.isMedia(r))\n if (isMediaResult || isMediaArrayResult) {\n const mediaList = isMediaResult ? [results as Media] : (results as Media[])\n const blocks: ChatCompletionsContentBlock[] = []\n for (const media of mediaList) {\n const mediaBlocks = await renderMediaToContentBlocks({\n media,\n toolName: toolCall.tool,\n nonce: toolCall.checksum,\n unsupportedMediaPolicy,\n renderTrustedContent: input.renderTrustedContent,\n renderUntrustedContent: input.renderUntrustedContent,\n warn,\n })\n for (const b of mediaBlocks) blocks.push(b)\n }\n return blocks\n }\n\n // SpooledArtifact[] silo — render each artifact through the existing single-artifact path\n // and concatenate the bodies. Trust envelope is decided per-artifact via the surrounding\n // Tool.trusted flag (same as single SpooledArtifact today).\n if (Array.isArray(results)) {\n const parts: string[] = []\n for (const a of results) {\n const body = await (a as SpooledArtifact).asString()\n parts.push(body)\n }\n const joined = parts.join('\\n\\n')\n if (isTrusted) {\n return input.renderTrustedContent(joined, {\n nonce: toolCall.checksum,\n kind: 'trusted-tool-result',\n tool: toolCall.tool,\n })\n }\n return input.renderUntrustedContent(joined, {\n nonce: toolCall.checksum,\n kind: 'tool-result',\n tool: toolCall.tool,\n })\n }\n\n const isSpooled = looksLikeSpooledArtifact(results)\n\n // Handle-pattern branch: spooled + inline=false → always untrusted (queryable-data, not policy).\n if (isSpooled && toolCall.inline === false) {\n const artifact = results as SpooledArtifact\n let byteLength = 0\n let lineCount = 0\n try {\n byteLength = await artifact.byteLength()\n } catch {\n byteLength = 0\n }\n try {\n lineCount = await artifact.lineCount()\n } catch {\n lineCount = 0\n }\n const body = renderArtifactHandleBody(\n toolCall,\n artifact,\n byteLength,\n lineCount,\n undefined,\n undefined\n )\n return input.renderUntrustedContent(body, {\n nonce: toolCall.checksum,\n kind: 'artifact-handle',\n tool: toolCall.tool,\n })\n }\n\n // Inline path: render full body via the appropriate envelope.\n if (!isSpooled && toolCall.inline === false) {\n warn?.(\n `Tool call ${toolCall.id} has inline=false but results is a Tokenizable (not a SpooledArtifact); rendering inline anyway.`\n )\n }\n\n let body: string\n if (isSpooled) {\n body = await (results as SpooledArtifact).asString()\n } else {\n body = (results as Tokenizable).toString()\n }\n\n if (isTrusted) {\n return input.renderTrustedContent(body, {\n nonce: toolCall.checksum,\n kind: 'trusted-tool-result',\n tool: toolCall.tool,\n })\n }\n return input.renderUntrustedContent(body, {\n nonce: toolCall.checksum,\n kind: 'tool-result',\n tool: toolCall.tool,\n })\n}\n/** Default tool-call-result renderer; alias of {@link renderChatCompletionsToolCallResult}. */\nexport const defaultRenderChatCompletionsToolCallResult = renderChatCompletionsToolCallResult\n\n// suppress unused; kept for forward-compat with stricter spool guards\nvoid isSpooledArtifactResult\n\n// ─── buildChatCompletionsHistory ──────────────────────────────────────────────\n\ntype TimelineItem =\n | { kind: 'message'; createdAt: number; value: Message }\n | { kind: 'thought'; createdAt: number; value: Thought }\n | { kind: 'toolCall'; createdAt: number; value: ToolCall }\n\n/**\n * Assembles the complete OpenAI Chat Completions message history for a dispatch — system prompt and\n * content buckets, the interleaved timeline of messages/thoughts/tool calls (with synthetic\n * `assistant.tool_calls` and `tool.tool_call_id` shaping), and the collected opaque reasoning\n * payloads — by delegating to the injected sub-renderers.\n */\nexport const buildChatCompletionsHistory = async (input: {\n systemPrompt: Tokenizable\n standingInstructions: Iterable<Tokenizable>\n memories: Iterable<Memory>\n retrievables: Iterable<Retrievable>\n messages: Iterable<Message>\n thoughts: Iterable<Thought>\n toolCalls: Iterable<ToolCall>\n tools: ToolRegistry\n renderedToolCallResults: Map<string, string | ChatCompletionsContentBlock[]>\n bucketOrder: ChatCompletionsBucketOrder\n selfIdentity: string\n thoughtSurfacing: 'all-self' | 'latest-self' | 'all'\n replayCompatibility: ReadonlyArray<string>\n unsupportedMediaPolicy: UnsupportedMediaPolicy\n renderChatCompletionsToolCallResult: ChatCompletionsHelpers['renderChatCompletionsToolCallResult']\n renderChatCompletionsSystemPrompt: ChatHelpersCommon['renderChatCompletionsSystemPrompt']\n renderStandingInstructions: ChatHelpersCommon['renderStandingInstructions']\n renderMemories: ChatHelpersCommon['renderMemories']\n renderRetrievables: ChatHelpersCommon['renderRetrievables']\n renderRetrievableSafetyDirective: ChatHelpersCommon['renderRetrievableSafetyDirective']\n renderFirstPartyRetrievables: ChatHelpersCommon['renderFirstPartyRetrievables']\n renderThirdPartyPublicRetrievables: ChatHelpersCommon['renderThirdPartyPublicRetrievables']\n renderThirdPartyPrivateRetrievables: ChatHelpersCommon['renderThirdPartyPrivateRetrievables']\n renderTimelineMessage: ChatCompletionsHelpers['renderTimelineMessage']\n renderThought: ChatHelpersCommon['renderThought']\n filterThoughts: ChatHelpersCommon['filterThoughts']\n renderUntrustedContent: ChatHelpersCommon['renderUntrustedContent']\n renderTrustedContent: ChatHelpersCommon['renderTrustedContent']\n warn?: (msg: string) => void\n}): Promise<{\n messages: ChatCompletionsMessage[]\n reasoningPayloads: Array<{ id: string; replayCompatibility: string; payload: unknown }>\n}> => {\n const out: ChatCompletionsMessage[] = []\n const reasoningPayloads: Array<{\n id: string\n replayCompatibility: string\n payload: unknown\n }> = []\n\n const buckets = input.bucketOrder\n const timelineIdx = buckets.indexOf('timeline')\n\n // Build leading system content from base prompt + before-timeline buckets.\n const leadingSystem = await input.renderChatCompletionsSystemPrompt({\n systemPrompt: input.systemPrompt,\n standingInstructions: input.standingInstructions,\n memories: input.memories,\n retrievables: input.retrievables,\n bucketOrder: buckets,\n renderStandingInstructions: input.renderStandingInstructions,\n renderMemories: input.renderMemories,\n renderRetrievables: input.renderRetrievables,\n renderRetrievableSafetyDirective: input.renderRetrievableSafetyDirective,\n renderFirstPartyRetrievables: input.renderFirstPartyRetrievables,\n renderThirdPartyPublicRetrievables: input.renderThirdPartyPublicRetrievables,\n renderThirdPartyPrivateRetrievables: input.renderThirdPartyPrivateRetrievables,\n renderUntrustedContent: input.renderUntrustedContent,\n })\n if (leadingSystem.length > 0) {\n out.push({ role: 'system', content: leadingSystem })\n }\n\n // Build the timeline (if present in bucketOrder).\n const includesTimeline = timelineIdx !== -1\n if (includesTimeline) {\n // Filter thoughts per surfacing mode + compatibility.\n const survivingThoughts = input.filterThoughts(\n input.thoughts,\n input.thoughtSurfacing,\n input.selfIdentity,\n input.replayCompatibility\n )\n\n // Build sorted timeline items.\n const items: TimelineItem[] = []\n for (const m of input.messages) {\n items.push({ kind: 'message', createdAt: m.createdAt.toMillis(), value: m })\n }\n for (const t of survivingThoughts) {\n items.push({ kind: 'thought', createdAt: t.createdAt.toMillis(), value: t })\n }\n for (const tc of input.toolCalls) {\n items.push({ kind: 'toolCall', createdAt: tc.createdAt.toMillis(), value: tc })\n }\n items.sort((a, b) => a.createdAt - b.createdAt)\n\n const replaySet = new Set<string>([...input.replayCompatibility])\n\n for (const item of items) {\n if (item.kind === 'message') {\n out.push(\n await input.renderTimelineMessage({\n message: item.value,\n selfIdentity: input.selfIdentity,\n unsupportedMediaPolicy: input.unsupportedMediaPolicy,\n warn: input.warn,\n })\n )\n } else if (item.kind === 'thought') {\n const t = item.value\n const identifier = String(t.identity?.identifier ?? '')\n const isSelf = identifier === input.selfIdentity\n const hasPayload = t.payload !== undefined\n const compatTag = t.replayCompatibility\n\n if (hasPayload && compatTag && replaySet.has(compatTag)) {\n // Opaque reasoning — side-channel + summary envelope.\n reasoningPayloads.push({\n id: t.id,\n replayCompatibility: compatTag,\n payload: t.payload,\n })\n const envelope = input.renderThought(\n t.content.toString(),\n {\n nonce: t.id,\n kind: 'opaque-reasoning',\n from: identifier,\n createdAt: t.createdAt?.toISO?.() ?? undefined,\n replayCompatibility: compatTag,\n },\n t.payload\n )\n const synthetic: ChatCompletionsMessage = {\n role: 'assistant',\n content: envelope,\n }\n if (!isSelf && identifier.length > 0) {\n synthetic.name = sanitiseNameField(identifier)\n }\n out.push(synthetic)\n } else if (!hasPayload) {\n // Plain-text reasoning (no payload, or tagged plain-text, or tagged but matched).\n const envelope = input.renderThought(t.content.toString(), {\n nonce: t.id,\n kind: isSelf ? 'self-reasoning' : 'peer-reasoning',\n from: identifier,\n createdAt: t.createdAt?.toISO?.() ?? undefined,\n })\n const synthetic: ChatCompletionsMessage = {\n role: 'assistant',\n content: envelope,\n }\n if (!isSelf && identifier.length > 0) {\n synthetic.name = sanitiseNameField(identifier)\n }\n out.push(synthetic)\n }\n // else: opaque, non-matching → elided (NOT removed from ctx.turnThoughts upstream).\n } else {\n // tool call: emit a synthetic assistant message carrying tool_calls[],\n // followed by a tool-role message with the result.\n const tc = item.value\n const assistantMsg: ChatCompletionsMessage = {\n role: 'assistant',\n content: null,\n tool_calls: [\n {\n id: tc.id,\n type: 'function',\n function: {\n name: tc.tool,\n arguments: typeof tc.args === 'string' ? tc.args : JSON.stringify(tc.args ?? {}),\n },\n },\n ],\n }\n out.push(assistantMsg)\n\n let rendered = input.renderedToolCallResults.get(tc.id)\n if (rendered === undefined) {\n const tool = input.tools.get?.(tc.tool)\n rendered = await input.renderChatCompletionsToolCallResult({\n toolCall: tc,\n results: tc.results as\n | Tokenizable\n | SpooledArtifact\n | SpooledArtifact[]\n | Media\n | Media[],\n tool: tool as Tool | ArtifactTool | undefined,\n renderUntrustedContent: input.renderUntrustedContent,\n renderTrustedContent: input.renderTrustedContent,\n unsupportedMediaPolicy: input.unsupportedMediaPolicy,\n warn: input.warn,\n })\n }\n out.push({\n role: 'tool',\n content: rendered,\n tool_call_id: tc.id,\n })\n }\n }\n }\n\n // Trailing system message for after-timeline buckets.\n if (includesTimeline) {\n const trailingParts: string[] = []\n for (let i = timelineIdx + 1; i < buckets.length; i++) {\n const label = buckets[i]!\n if (label === 'standingInstructions') {\n const block = input.renderStandingInstructions(input.standingInstructions)\n if (block.length > 0) trailingParts.push(block)\n } else if (label === 'memories') {\n const wrapped: Array<{ memory: Memory; attrs: MemoryAttrs }> = []\n for (const m of input.memories) {\n wrapped.push(memoryToAttrs(m))\n }\n const block = input.renderMemories(wrapped)\n if (block.length > 0) trailingParts.push(block)\n } else if (label === 'retrievables') {\n const wrapped: Array<{ retrievable: Retrievable; attrs: RetrievableAttrs }> = []\n for (const r of input.retrievables) {\n wrapped.push(retrievableToAttrs(r))\n }\n const block = await input.renderRetrievables(wrapped, {\n renderRetrievableSafetyDirective: input.renderRetrievableSafetyDirective,\n renderFirstPartyRetrievables: input.renderFirstPartyRetrievables,\n renderThirdPartyPublicRetrievables: input.renderThirdPartyPublicRetrievables,\n renderThirdPartyPrivateRetrievables: input.renderThirdPartyPrivateRetrievables,\n renderUntrustedContent: input.renderUntrustedContent,\n })\n if (block.length > 0) trailingParts.push(block)\n }\n }\n if (trailingParts.length > 0) {\n out.push({ role: 'system', content: trailingParts.join('\\n\\n') })\n }\n }\n\n return { messages: out, reasoningPayloads }\n}\n/** Default history assembler; alias of {@link buildChatCompletionsHistory}. */\nexport const defaultBuildChatCompletionsHistory = buildChatCompletionsHistory\n\n// ─── createChatCompletionsToolCallDeltaAccumulator ────────────────────────────\n\n/**\n * Creates a fresh accumulator that stitches streamed {@link ChatCompletionsToolCallDelta} fragments\n * (keyed by their stream index) into fully-assembled tool calls, drained once the stream completes.\n */\nexport const createChatCompletionsToolCallDeltaAccumulator =\n (): ChatCompletionsToolCallDeltaAccumulator => {\n const byIndex = new Map<\n number,\n { id?: string; type?: 'function'; name: string; args: string }\n >()\n return {\n feed(delta: ChatCompletionsToolCallDelta): void {\n const idx = delta.index\n let entry = byIndex.get(idx)\n if (!entry) {\n entry = { name: '', args: '' }\n byIndex.set(idx, entry)\n }\n if (delta.id !== undefined) entry.id = delta.id\n if (delta.type !== undefined) entry.type = delta.type\n if (delta.function?.name !== undefined) {\n entry.name = entry.name + delta.function.name\n }\n if (delta.function?.arguments !== undefined) {\n entry.args = entry.args + delta.function.arguments\n }\n },\n drain(): AssembledToolCall[] {\n const out: AssembledToolCall[] = []\n const indices = Array.from(byIndex.keys()).sort((a, b) => a - b)\n for (const idx of indices) {\n const e = byIndex.get(idx)!\n out.push({\n id: e.id ?? `call_${idx}`,\n type: e.type ?? 'function',\n name: e.name,\n args: e.args,\n })\n }\n return out\n },\n }\n }\n/** Default delta-accumulator factory; alias of {@link createChatCompletionsToolCallDeltaAccumulator}. */\nexport const defaultCreateChatCompletionsToolCallDeltaAccumulator =\n createChatCompletionsToolCallDeltaAccumulator\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"helpers.cjs","names":[],"sources":["../../../../src/batteries/llm/openai_chat_completions/helpers.ts"],"sourcesContent":["/**\n * Swappable translation helpers for rendering ADK state into Chat Completions requests.\n *\n * @module @nhtio/adk/batteries/llm/openai_chat_completions/helpers\n *\n * @remarks\n * The swappable translation helpers that turn ADK primitives into OpenAI Chat Completions wire\n * shapes. Each helper is exported under its unprefixed name AND under a `default*` alias so\n * consumers can compose partial overrides. Helpers that compose other helpers receive their\n * dependents via explicit input arguments — never via module-level closure — so a swap at any\n * layer propagates correctly.\n *\n * The wire-shape-AGNOSTIC helpers (`renderUntrustedContent`, `renderMemories`,\n * `renderChatCompletionsSystemPrompt`, `toolsToChatCompletionsTools`, …) now live in the shared,\n * internal `../chat_common/helpers` submodule and are re-exported here under their original names\n * so every existing import keeps resolving. Only the OpenAI-WIRE-SPECIFIC helpers\n * (`renderTimelineMessage`, `renderChatCompletionsToolCallResult`, `buildChatCompletionsHistory`,\n * `createChatCompletionsToolCallDeltaAccumulator`) and the reasoning-field extractor are defined\n * here.\n */\n\nimport { Media } from '@nhtio/adk/common'\nimport { isInstanceOf } from '@nhtio/adk/guards'\nimport { E_UNSUPPORTED_MEDIA_MODALITY } from './exceptions'\nimport {\n escapeXmlAttribute,\n sanitiseNameField,\n memoryToAttrs,\n retrievableToAttrs,\n renderTrustedContent,\n renderUntrustedContent,\n} from '../chat_common/helpers'\nimport type { ChatHelpersCommon } from '../chat_common/types'\nimport type {\n Tool,\n ArtifactTool,\n ToolRegistry,\n Tokenizable,\n Memory,\n Message,\n Thought,\n ToolCall,\n Retrievable,\n SpooledArtifact,\n MediaModalityHazard,\n MediaStashEntry,\n} from '@nhtio/adk/common'\nimport type {\n ChatCompletionsMessage,\n ChatCompletionsContentBlock,\n ChatCompletionsToolCallDelta,\n ChatCompletionsToolCallDeltaAccumulator,\n AssembledToolCall,\n ChatCompletionsBucketOrder,\n MemoryAttrs,\n RetrievableAttrs,\n ChatCompletionsHelpers,\n UnsupportedMediaPolicy,\n ReasoningField,\n ReasoningFieldPrecedence,\n ReasoningExtract,\n} from './types'\n\n// ─── Re-exported wire-shape-agnostic helpers (shared submodule) ───────────────\n// These are defined once in `../chat_common/helpers` and shared with the native Ollama battery.\n// Re-exported here (bare + `default*`) so every existing\n// `@nhtio/adk/batteries/llm/openai_chat_completions` import keeps resolving unchanged.\nexport {\n descriptionToChatCompletionsJsonSchema,\n defaultDescriptionToChatCompletionsJsonSchema,\n renderUntrustedContent,\n defaultRenderUntrustedContent,\n renderTrustedContent,\n defaultRenderTrustedContent,\n renderStandingInstructions,\n defaultRenderStandingInstructions,\n renderMemories,\n defaultRenderMemories,\n renderRetrievableSafetyDirective,\n defaultRenderRetrievableSafetyDirective,\n renderFirstPartyRetrievables,\n defaultRenderFirstPartyRetrievables,\n renderThirdPartyPublicRetrievables,\n defaultRenderThirdPartyPublicRetrievables,\n renderThirdPartyPrivateRetrievables,\n defaultRenderThirdPartyPrivateRetrievables,\n renderRetrievables,\n defaultRenderRetrievables,\n renderThought,\n defaultRenderThought,\n filterThoughts,\n defaultFilterThoughts,\n toolsToChatCompletionsTools,\n defaultToolsToChatCompletionsTools,\n renderChatCompletionsSystemPrompt,\n defaultRenderChatCompletionsSystemPrompt,\n} from '../chat_common/helpers'\n\n// ─── extractReasoningFields ───────────────────────────────────────────────────\n\n/**\n * Pulls model reasoning/thinking text out of a Chat Completions response message or stream delta,\n * reading every wire field named in `precedence` that carries a non-empty string.\n *\n * @remarks\n * Reasoning is not part of OpenAI's official Chat Completions spec, so OpenAI-compatible providers\n * disagree on the field name (`reasoning` for Ollama and current vLLM; `reasoning_content` for\n * legacy vLLM and DeepSeek). This reads the union, in `precedence` order, and de-duplicates by\n * content value: a field whose text exactly matches one already kept is dropped.\n *\n * The result length encodes the emission rule the callers follow:\n * - `0` — no reasoning present.\n * - `1` — a single thought (covers \"only one field present\" AND \"several present but identical\").\n * - `≥2` — divergent fields; each surfaces as its own thought rather than silently dropping one.\n *\n * @param src - The response `message` or stream `delta` to read from.\n * @param precedence - Ordered, de-duplicated field names to read (see `reasoningFieldPrecedence`).\n * @returns The present, content-deduplicated reasoning traces in precedence order.\n */\nexport const extractReasoningFields = (\n src: Partial<Record<ReasoningField, string | null | undefined>> | undefined,\n precedence: ReasoningFieldPrecedence\n): ReasoningExtract[] => {\n const out: ReasoningExtract[] = []\n for (const field of precedence) {\n const value = src?.[field]\n if (typeof value !== 'string' || value.length === 0) continue\n if (out.some((e) => e.content === value)) continue\n out.push({ field, content: value })\n }\n return out\n}\n\n// ─── Media rendering helpers (OpenAI content-block specific) ──────────────────\n\nconst DEFAULT_STASH_FALLBACK_KEYS: ReadonlyArray<string> = [\n 'text:transcript',\n 'text:caption',\n 'text:description',\n]\n\nconst modalityHazardToAttr = (h: MediaModalityHazard): 'inert' | 'extractable' | 'opaque' => {\n if (h === 'inert') return 'inert'\n if (h === 'extractable-instructions') return 'extractable'\n return 'opaque'\n}\n\nconst formatBytesHumanReadable = (bytes: number | undefined): string => {\n if (bytes === undefined || !Number.isFinite(bytes)) return 'unknown size'\n if (bytes < 1024) return `${bytes} B`\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`\n if (bytes < 1024 * 1024 * 1024) return `${(bytes / (1024 * 1024)).toFixed(1)} MB`\n return `${(bytes / (1024 * 1024 * 1024)).toFixed(1)} GB`\n}\n\nconst audioFormatFromMime = (mime: string): 'wav' | 'mp3' | undefined => {\n const m = mime.toLowerCase()\n if (m.includes('wav') || m.includes('x-wav') || m.includes('wave')) return 'wav'\n if (m.includes('mpeg') || m.includes('mp3')) return 'mp3'\n return undefined\n}\n\nconst isMediaTextStashEntry = (e: unknown): e is MediaStashEntry => {\n if (!e || typeof e !== 'object') return false\n const r = e as Record<string, unknown>\n return typeof r.value === 'string' && typeof r.trustTier === 'string'\n}\n\nconst resolveFallbackStash = (\n media: Media,\n keys: ReadonlyArray<string>\n): { text: string; entryTier: MediaStashEntry['trustTier'] } | undefined => {\n for (const key of keys) {\n const entry = media.stash.get(key)\n if (isMediaTextStashEntry(entry)) {\n return { text: entry.value as string, entryTier: entry.trustTier }\n }\n }\n return undefined\n}\n\nconst renderTextInEnvelope = (\n text: string,\n args: {\n trustTier: MediaStashEntry['trustTier']\n modality: 'inert' | 'extractable' | 'opaque'\n nonce: string\n toolName: string | undefined\n renderTrustedContent: ChatHelpersCommon['renderTrustedContent']\n renderUntrustedContent: ChatHelpersCommon['renderUntrustedContent']\n }\n): string => {\n if (args.trustTier === 'first-party') {\n return args.renderTrustedContent(text, {\n nonce: args.nonce,\n kind: 'media-fallback',\n tool: args.toolName,\n modality: args.modality,\n })\n }\n return args.renderUntrustedContent(text, {\n nonce: args.nonce,\n kind: 'media-fallback',\n tool: args.toolName,\n modality: args.modality,\n })\n}\n\nconst renderSyntheticMediaDescription = (media: Media, byteLen: number | undefined): string =>\n `[media: ${media.filename}, ${media.mimeType}, ${formatBytesHumanReadable(byteLen)}]`\n\n/**\n * The inline media id-marker: a harness-authored text block rendered immediately BEFORE each\n * media content block, so the model can reference the media by id in subsequent tool calls\n * (`media_id` args, `@id` pipe refs).\n *\n * Trust posture: the marker is structural reference data authored by the harness from the\n * harness-controlled `Media.id` (a UUID, not derivable from the payload) — it is NOT payload\n * content, carries no authority, and deliberately renders OUTSIDE the untrusted envelope with\n * fixed, non-instruction phrasing. This is a documented cross-battery convention: every LLM\n * battery that renders media emits the same marker shape.\n */\nconst renderMediaIdMarker = (media: Media): string => `[media id: ${media.id} | ${media.filename}]`\n\nconst renderMediaToContentBlocks = async (input: {\n media: Media\n toolName: string | undefined\n nonce: string\n unsupportedMediaPolicy: UnsupportedMediaPolicy\n renderTrustedContent: ChatHelpersCommon['renderTrustedContent']\n renderUntrustedContent: ChatHelpersCommon['renderUntrustedContent']\n warn?: (msg: string) => void\n}): Promise<ChatCompletionsContentBlock[]> => {\n const blocks = await renderMediaBodyBlocks(input)\n return [{ type: 'text', text: renderMediaIdMarker(input.media) }, ...blocks]\n}\n\nconst renderMediaBodyBlocks = async (input: {\n media: Media\n toolName: string | undefined\n nonce: string\n unsupportedMediaPolicy: UnsupportedMediaPolicy\n renderTrustedContent: ChatHelpersCommon['renderTrustedContent']\n renderUntrustedContent: ChatHelpersCommon['renderUntrustedContent']\n warn?: (msg: string) => void\n}): Promise<ChatCompletionsContentBlock[]> => {\n const { media, toolName, nonce, unsupportedMediaPolicy, warn } = input\n const modality = modalityHazardToAttr(media.modalityHazard)\n const kind = media.kind\n\n const fallbackPath = async (\n keys: ReadonlyArray<string>,\n allowSyntheticFallthrough: boolean\n ): Promise<ChatCompletionsContentBlock[]> => {\n const fallback = resolveFallbackStash(media, keys)\n if (fallback) {\n const text = renderTextInEnvelope(fallback.text, {\n trustTier: fallback.entryTier,\n modality,\n nonce,\n toolName,\n renderTrustedContent: input.renderTrustedContent,\n renderUntrustedContent: input.renderUntrustedContent,\n })\n return [{ type: 'text', text }]\n }\n if (!allowSyntheticFallthrough) {\n // 'fallback-stash' falls through to 'synthetic-description' when no entry is found.\n warn?.(\n `unsupportedMediaPolicy='fallback-stash' for ${media.filename}: no matching stash entry — falling through to synthetic description.`\n )\n }\n const byteLen = await media.byteLength()\n const text = renderTextInEnvelope(renderSyntheticMediaDescription(media, byteLen), {\n trustTier: media.trustTier,\n modality,\n nonce,\n toolName,\n renderTrustedContent: input.renderTrustedContent,\n renderUntrustedContent: input.renderUntrustedContent,\n })\n return [{ type: 'text', text }]\n }\n\n if (kind === 'image') {\n const b64 = await media.asBase64()\n return [\n {\n type: 'image_url',\n image_url: { url: `data:${media.mimeType};base64,${b64}` },\n },\n ]\n }\n\n if (kind === 'audio') {\n const fmt = audioFormatFromMime(media.mimeType)\n if (fmt === undefined) {\n // Audio mime not natively expressible — same policy path as video.\n if (unsupportedMediaPolicy === 'throw') {\n throw new E_UNSUPPORTED_MEDIA_MODALITY([media.kind, media.mimeType, media.filename])\n }\n if (\n unsupportedMediaPolicy === 'fallback-stash' ||\n (typeof unsupportedMediaPolicy === 'object' &&\n unsupportedMediaPolicy.mode === 'fallback-stash')\n ) {\n const keys =\n typeof unsupportedMediaPolicy === 'object'\n ? unsupportedMediaPolicy.stashKeys\n : DEFAULT_STASH_FALLBACK_KEYS\n return fallbackPath(keys, false)\n }\n return fallbackPath([], true)\n }\n const data = await media.asBase64()\n return [\n {\n type: 'input_audio',\n input_audio: { data, format: fmt },\n },\n ]\n }\n\n if (kind === 'document') {\n const b64 = await media.asBase64()\n return [\n {\n type: 'file',\n file: {\n filename: media.filename,\n file_data: `data:${media.mimeType};base64,${b64}`,\n },\n },\n ]\n }\n\n // kind === 'video' — not natively supported by Chat Completions wire format.\n if (unsupportedMediaPolicy === 'throw') {\n throw new E_UNSUPPORTED_MEDIA_MODALITY([media.kind, media.mimeType, media.filename])\n }\n if (\n unsupportedMediaPolicy === 'fallback-stash' ||\n (typeof unsupportedMediaPolicy === 'object' && unsupportedMediaPolicy.mode === 'fallback-stash')\n ) {\n const keys =\n typeof unsupportedMediaPolicy === 'object'\n ? unsupportedMediaPolicy.stashKeys\n : DEFAULT_STASH_FALLBACK_KEYS\n return fallbackPath(keys, false)\n }\n return fallbackPath([], true)\n}\n\n// ─── renderTimelineMessage ────────────────────────────────────────────────────\n\n/**\n * Renders a single timeline {@link @nhtio/adk!Message} into an OpenAI Chat Completions message —\n * mapping media to content blocks (`image_url` / `input_audio` / `file`), wrapping textual bodies\n * in the appropriate trust envelope, and applying the unsupported-media policy.\n */\nexport const renderTimelineMessage = async (input: {\n message: Message\n selfIdentity: string\n unsupportedMediaPolicy: UnsupportedMediaPolicy\n warn?: (msg: string) => void\n}): Promise<ChatCompletionsMessage> => {\n const { message, selfIdentity, unsupportedMediaPolicy, warn } = input\n const identifier =\n message.identity?.identifier !== undefined && message.identity?.identifier !== null\n ? String(message.identity.identifier)\n : ''\n const representationRaw =\n message.identity?.representation !== undefined && message.identity?.representation !== null\n ? message.identity.representation.toString()\n : ''\n // Prompt-facing identity (the `from=` attribute) reads `representation`;\n // structural `messages[].name` reads `identifier`. Fall back to `identifier`\n // when `representation` is empty so a bare-string identity still renders.\n const representation = representationRaw.length > 0 ? representationRaw : identifier\n const text = message.content !== undefined ? message.content.toString() : ''\n const createdAtStr = message.createdAt.toISO?.() ?? ''\n const createdAtAttr = createdAtStr ? ` createdAt=\"${escapeXmlAttribute(createdAtStr)}\"` : ''\n const attachments = message.attachments\n const hasAttachments = attachments.length > 0\n\n // Build the text envelope first (same logic as before).\n let envelopeText: string\n let nameField: string | undefined\n let role: 'user' | 'assistant'\n if (message.role === 'user') {\n role = 'user'\n if (identifier.length === 0) {\n envelopeText = text\n } else {\n nameField = sanitiseNameField(identifier)\n const fromAttr = escapeXmlAttribute(representation)\n envelopeText = `<message_${message.id} from=\"${fromAttr}\" role=\"user\"${createdAtAttr}>\\n${text}\\n</message_${message.id}>`\n }\n } else {\n role = 'assistant'\n if (identifier.length === 0 || identifier === selfIdentity) {\n if (identifier.length > 0) {\n nameField = sanitiseNameField(identifier)\n }\n envelopeText = text\n } else {\n nameField = sanitiseNameField(identifier)\n const fromAttr = escapeXmlAttribute(representation)\n envelopeText = `<peer_agent_output_${message.id} from=\"${fromAttr}\"${createdAtAttr}>\\n${text}\\n</peer_agent_output_${message.id}>`\n }\n }\n\n if (!hasAttachments) {\n const out: ChatCompletionsMessage = { role, content: envelopeText }\n if (nameField !== undefined) out.name = nameField\n return out\n }\n\n // Content-array path: text first (when present), then attachment blocks in array order.\n const blocks: ChatCompletionsContentBlock[] = []\n if (text.length > 0) {\n blocks.push({ type: 'text', text: envelopeText })\n }\n for (const media of attachments) {\n const mediaBlocks = await renderMediaToContentBlocks({\n media,\n toolName: undefined,\n nonce: message.id,\n unsupportedMediaPolicy,\n renderTrustedContent,\n renderUntrustedContent,\n warn,\n })\n for (const b of mediaBlocks) blocks.push(b)\n }\n const out: ChatCompletionsMessage = { role, content: blocks }\n if (nameField !== undefined) out.name = nameField\n return out\n}\n/** Default timeline-message renderer; alias of {@link renderTimelineMessage}. */\nexport const defaultRenderTimelineMessage = renderTimelineMessage\n\n// ─── renderChatCompletionsToolCallResult ──────────────────────────────────────\n\nconst isSpooledArtifactResult = (\n results: SpooledArtifact | Tokenizable\n): results is SpooledArtifact =>\n isInstanceOf(results, 'SpooledArtifact') ||\n // Subclasses identify via the base class guard upstream\n ((results as unknown as { constructor?: { isSpooledArtifactConstructor?: boolean } })\n ?.constructor !== null &&\n (results as unknown as { constructor?: { isSpooledArtifactConstructor?: boolean } })\n ?.constructor !== undefined &&\n typeof (\n results as unknown as {\n constructor: { isSpooledArtifactConstructor?: (c: unknown) => boolean }\n }\n ).constructor.isSpooledArtifactConstructor === 'function')\n\nconst looksLikeSpooledArtifact = (value: unknown): value is SpooledArtifact => {\n if (!value || typeof value !== 'object') return false\n const v = value as Record<string, unknown>\n return (\n typeof v.asString === 'function' &&\n typeof v.byteLength === 'function' &&\n typeof v.lineCount === 'function' &&\n typeof v.estimateTokens === 'function'\n )\n}\n\nconst renderArtifactHandleBody = (\n toolCall: ToolCall,\n artifact: SpooledArtifact,\n byteLength: number,\n lineCount: number,\n estimatedTokens: number | undefined,\n encoding: string | undefined\n): string => {\n const ctor = (\n artifact as unknown as {\n constructor: { toolMethods?: ReadonlyArray<{ name: string; description?: string }> }\n }\n ).constructor\n const methods = ctor?.toolMethods ?? []\n const lines: string[] = []\n lines.push(`This tool returned a large artifact that was not inlined to preserve context budget.`)\n lines.push(``)\n lines.push(`Artifact metadata:`)\n lines.push(`- callId: ${toolCall.id}`)\n lines.push(`- kind: ${ctor?.constructor?.name ?? 'SpooledArtifact'}`)\n lines.push(`- byteLength: ${byteLength}`)\n lines.push(`- lineCount: ${lineCount}`)\n if (estimatedTokens !== undefined && encoding) {\n lines.push(`- estimatedTokens: ${estimatedTokens} (encoding: ${encoding})`)\n }\n lines.push(``)\n lines.push(`To read this artifact in this turn, call one of the following tools with`)\n lines.push(`callId=${toolCall.id}:`)\n for (const m of methods) {\n if (m.description) {\n lines.push(`- ${m.name} — ${m.description}`)\n } else {\n lines.push(`- ${m.name}`)\n }\n }\n lines.push(``)\n lines.push(\n `The artifact persists in this turn's context — multiple queries against the same callId are allowed and efficient. Do not assume the body has been inlined anywhere else.`\n )\n return lines.join('\\n')\n}\n\n/**\n * Renders a tool call's result(s) into the OpenAI Chat Completions tool-message body — either a\n * plain string or an array of content blocks when the result carries media — wrapping textual\n * output in the trust envelope appropriate to the tool's trust level.\n */\nexport const renderChatCompletionsToolCallResult = async (input: {\n toolCall: ToolCall\n results: Tokenizable | SpooledArtifact | SpooledArtifact[] | Media | Media[]\n tool: Tool | ArtifactTool | undefined\n renderUntrustedContent: ChatHelpersCommon['renderUntrustedContent']\n renderTrustedContent: ChatHelpersCommon['renderTrustedContent']\n unsupportedMediaPolicy: UnsupportedMediaPolicy\n warn?: (msg: string) => void\n}): Promise<string | ChatCompletionsContentBlock[]> => {\n const { toolCall, results, tool, warn, unsupportedMediaPolicy } = input\n const isTrusted =\n tool !== null && tool !== undefined && (tool as { trusted?: boolean }).trusted === true\n\n if (tool === undefined) {\n warn?.(\n `Tool \"${toolCall.tool}\" is not present in the bound tool registry at render time; defaulting to untrusted envelope.`\n )\n }\n\n // Media / Media[] silo — bypasses Tool.trusted (Trust-Is-Content rule). Envelope is sourced\n // from each Media's own trustTier; modality from each Media's modalityHazard.\n const isMediaResult = Media.isMedia(results)\n const isMediaArrayResult =\n Array.isArray(results) && results.length > 0 && results.every((r) => Media.isMedia(r))\n if (isMediaResult || isMediaArrayResult) {\n const mediaList = isMediaResult ? [results as Media] : (results as Media[])\n const blocks: ChatCompletionsContentBlock[] = []\n for (const media of mediaList) {\n const mediaBlocks = await renderMediaToContentBlocks({\n media,\n toolName: toolCall.tool,\n nonce: toolCall.checksum,\n unsupportedMediaPolicy,\n renderTrustedContent: input.renderTrustedContent,\n renderUntrustedContent: input.renderUntrustedContent,\n warn,\n })\n for (const b of mediaBlocks) blocks.push(b)\n }\n return blocks\n }\n\n // SpooledArtifact[] silo — render each artifact through the existing single-artifact path\n // and concatenate the bodies. Trust envelope is decided per-artifact via the surrounding\n // Tool.trusted flag (same as single SpooledArtifact today).\n if (Array.isArray(results)) {\n const parts: string[] = []\n for (const a of results) {\n const body = await (a as SpooledArtifact).asString()\n parts.push(body)\n }\n const joined = parts.join('\\n\\n')\n if (isTrusted) {\n return input.renderTrustedContent(joined, {\n nonce: toolCall.checksum,\n kind: 'trusted-tool-result',\n tool: toolCall.tool,\n })\n }\n return input.renderUntrustedContent(joined, {\n nonce: toolCall.checksum,\n kind: 'tool-result',\n tool: toolCall.tool,\n })\n }\n\n const isSpooled = looksLikeSpooledArtifact(results)\n\n // Handle-pattern branch: spooled + inline=false → always untrusted (queryable-data, not policy).\n if (isSpooled && toolCall.inline === false) {\n const artifact = results as SpooledArtifact\n let byteLength = 0\n let lineCount = 0\n try {\n byteLength = await artifact.byteLength()\n } catch {\n byteLength = 0\n }\n try {\n lineCount = await artifact.lineCount()\n } catch {\n lineCount = 0\n }\n const body = renderArtifactHandleBody(\n toolCall,\n artifact,\n byteLength,\n lineCount,\n undefined,\n undefined\n )\n return input.renderUntrustedContent(body, {\n nonce: toolCall.checksum,\n kind: 'artifact-handle',\n tool: toolCall.tool,\n })\n }\n\n // Inline path: render full body via the appropriate envelope.\n if (!isSpooled && toolCall.inline === false) {\n warn?.(\n `Tool call ${toolCall.id} has inline=false but results is a Tokenizable (not a SpooledArtifact); rendering inline anyway.`\n )\n }\n\n let body: string\n if (isSpooled) {\n body = await (results as SpooledArtifact).asString()\n } else {\n body = (results as Tokenizable).toString()\n }\n\n if (isTrusted) {\n return input.renderTrustedContent(body, {\n nonce: toolCall.checksum,\n kind: 'trusted-tool-result',\n tool: toolCall.tool,\n })\n }\n return input.renderUntrustedContent(body, {\n nonce: toolCall.checksum,\n kind: 'tool-result',\n tool: toolCall.tool,\n })\n}\n/** Default tool-call-result renderer; alias of {@link renderChatCompletionsToolCallResult}. */\nexport const defaultRenderChatCompletionsToolCallResult = renderChatCompletionsToolCallResult\n\n// suppress unused; kept for forward-compat with stricter spool guards\nvoid isSpooledArtifactResult\n\n// ─── buildChatCompletionsHistory ──────────────────────────────────────────────\n\ntype TimelineItem =\n | { kind: 'message'; createdAt: number; value: Message }\n | { kind: 'thought'; createdAt: number; value: Thought }\n | { kind: 'toolCall'; createdAt: number; value: ToolCall }\n\n/**\n * Assembles the complete OpenAI Chat Completions message history for a dispatch — system prompt and\n * content buckets, the interleaved timeline of messages/thoughts/tool calls (with synthetic\n * `assistant.tool_calls` and `tool.tool_call_id` shaping), and the collected opaque reasoning\n * payloads — by delegating to the injected sub-renderers.\n */\nexport const buildChatCompletionsHistory = async (input: {\n systemPrompt: Tokenizable\n standingInstructions: Iterable<Tokenizable>\n memories: Iterable<Memory>\n retrievables: Iterable<Retrievable>\n messages: Iterable<Message>\n thoughts: Iterable<Thought>\n toolCalls: Iterable<ToolCall>\n tools: ToolRegistry\n renderedToolCallResults: Map<string, string | ChatCompletionsContentBlock[]>\n bucketOrder: ChatCompletionsBucketOrder\n selfIdentity: string\n thoughtSurfacing: 'all-self' | 'latest-self' | 'all'\n replayCompatibility: ReadonlyArray<string>\n unsupportedMediaPolicy: UnsupportedMediaPolicy\n renderChatCompletionsToolCallResult: ChatCompletionsHelpers['renderChatCompletionsToolCallResult']\n renderChatCompletionsSystemPrompt: ChatHelpersCommon['renderChatCompletionsSystemPrompt']\n renderStandingInstructions: ChatHelpersCommon['renderStandingInstructions']\n renderMemories: ChatHelpersCommon['renderMemories']\n renderRetrievables: ChatHelpersCommon['renderRetrievables']\n renderRetrievableSafetyDirective: ChatHelpersCommon['renderRetrievableSafetyDirective']\n renderFirstPartyRetrievables: ChatHelpersCommon['renderFirstPartyRetrievables']\n renderThirdPartyPublicRetrievables: ChatHelpersCommon['renderThirdPartyPublicRetrievables']\n renderThirdPartyPrivateRetrievables: ChatHelpersCommon['renderThirdPartyPrivateRetrievables']\n renderTimelineMessage: ChatCompletionsHelpers['renderTimelineMessage']\n renderThought: ChatHelpersCommon['renderThought']\n filterThoughts: ChatHelpersCommon['filterThoughts']\n renderUntrustedContent: ChatHelpersCommon['renderUntrustedContent']\n renderTrustedContent: ChatHelpersCommon['renderTrustedContent']\n warn?: (msg: string) => void\n}): Promise<{\n messages: ChatCompletionsMessage[]\n reasoningPayloads: Array<{ id: string; replayCompatibility: string; payload: unknown }>\n}> => {\n const out: ChatCompletionsMessage[] = []\n const reasoningPayloads: Array<{\n id: string\n replayCompatibility: string\n payload: unknown\n }> = []\n\n const buckets = input.bucketOrder\n const timelineIdx = buckets.indexOf('timeline')\n\n // Build leading system content from base prompt + before-timeline buckets.\n const leadingSystem = await input.renderChatCompletionsSystemPrompt({\n systemPrompt: input.systemPrompt,\n standingInstructions: input.standingInstructions,\n memories: input.memories,\n retrievables: input.retrievables,\n bucketOrder: buckets,\n renderStandingInstructions: input.renderStandingInstructions,\n renderMemories: input.renderMemories,\n renderRetrievables: input.renderRetrievables,\n renderRetrievableSafetyDirective: input.renderRetrievableSafetyDirective,\n renderFirstPartyRetrievables: input.renderFirstPartyRetrievables,\n renderThirdPartyPublicRetrievables: input.renderThirdPartyPublicRetrievables,\n renderThirdPartyPrivateRetrievables: input.renderThirdPartyPrivateRetrievables,\n renderUntrustedContent: input.renderUntrustedContent,\n })\n if (leadingSystem.length > 0) {\n out.push({ role: 'system', content: leadingSystem })\n }\n\n // Build the timeline (if present in bucketOrder).\n const includesTimeline = timelineIdx !== -1\n if (includesTimeline) {\n // Filter thoughts per surfacing mode + compatibility.\n const survivingThoughts = input.filterThoughts(\n input.thoughts,\n input.thoughtSurfacing,\n input.selfIdentity,\n input.replayCompatibility\n )\n\n // Build sorted timeline items.\n const items: TimelineItem[] = []\n for (const m of input.messages) {\n items.push({ kind: 'message', createdAt: m.createdAt.toMillis(), value: m })\n }\n for (const t of survivingThoughts) {\n items.push({ kind: 'thought', createdAt: t.createdAt.toMillis(), value: t })\n }\n for (const tc of input.toolCalls) {\n items.push({ kind: 'toolCall', createdAt: tc.createdAt.toMillis(), value: tc })\n }\n items.sort((a, b) => a.createdAt - b.createdAt)\n\n const replaySet = new Set<string>([...input.replayCompatibility])\n\n for (const item of items) {\n if (item.kind === 'message') {\n out.push(\n await input.renderTimelineMessage({\n message: item.value,\n selfIdentity: input.selfIdentity,\n unsupportedMediaPolicy: input.unsupportedMediaPolicy,\n warn: input.warn,\n })\n )\n } else if (item.kind === 'thought') {\n const t = item.value\n const identifier = String(t.identity?.identifier ?? '')\n const isSelf = identifier === input.selfIdentity\n const hasPayload = t.payload !== undefined\n const compatTag = t.replayCompatibility\n\n if (hasPayload && compatTag && replaySet.has(compatTag)) {\n // Opaque reasoning — side-channel + summary envelope.\n reasoningPayloads.push({\n id: t.id,\n replayCompatibility: compatTag,\n payload: t.payload,\n })\n const envelope = input.renderThought(\n t.content.toString(),\n {\n nonce: t.id,\n kind: 'opaque-reasoning',\n from: identifier,\n createdAt: t.createdAt?.toISO?.() ?? undefined,\n replayCompatibility: compatTag,\n },\n t.payload\n )\n const synthetic: ChatCompletionsMessage = {\n role: 'assistant',\n content: envelope,\n }\n if (!isSelf && identifier.length > 0) {\n synthetic.name = sanitiseNameField(identifier)\n }\n out.push(synthetic)\n } else if (!hasPayload) {\n // Plain-text reasoning (no payload, or tagged plain-text, or tagged but matched).\n const envelope = input.renderThought(t.content.toString(), {\n nonce: t.id,\n kind: isSelf ? 'self-reasoning' : 'peer-reasoning',\n from: identifier,\n createdAt: t.createdAt?.toISO?.() ?? undefined,\n })\n const synthetic: ChatCompletionsMessage = {\n role: 'assistant',\n content: envelope,\n }\n if (!isSelf && identifier.length > 0) {\n synthetic.name = sanitiseNameField(identifier)\n }\n out.push(synthetic)\n }\n // else: opaque, non-matching → elided (NOT removed from ctx.turnThoughts upstream).\n } else {\n // tool call: emit a synthetic assistant message carrying tool_calls[],\n // followed by a tool-role message with the result.\n const tc = item.value\n const assistantMsg: ChatCompletionsMessage = {\n role: 'assistant',\n content: null,\n tool_calls: [\n {\n id: tc.id,\n type: 'function',\n function: {\n name: tc.tool,\n arguments: typeof tc.args === 'string' ? tc.args : JSON.stringify(tc.args ?? {}),\n },\n },\n ],\n }\n out.push(assistantMsg)\n\n let rendered = input.renderedToolCallResults.get(tc.id)\n if (rendered === undefined) {\n const tool = input.tools.get?.(tc.tool)\n rendered = await input.renderChatCompletionsToolCallResult({\n toolCall: tc,\n results: tc.results as\n | Tokenizable\n | SpooledArtifact\n | SpooledArtifact[]\n | Media\n | Media[],\n tool: tool as Tool | ArtifactTool | undefined,\n renderUntrustedContent: input.renderUntrustedContent,\n renderTrustedContent: input.renderTrustedContent,\n unsupportedMediaPolicy: input.unsupportedMediaPolicy,\n warn: input.warn,\n })\n }\n out.push({\n role: 'tool',\n content: rendered,\n tool_call_id: tc.id,\n })\n }\n }\n }\n\n // Trailing system message for after-timeline buckets.\n if (includesTimeline) {\n const trailingParts: string[] = []\n for (let i = timelineIdx + 1; i < buckets.length; i++) {\n const label = buckets[i]!\n if (label === 'standingInstructions') {\n const block = input.renderStandingInstructions(input.standingInstructions)\n if (block.length > 0) trailingParts.push(block)\n } else if (label === 'memories') {\n const wrapped: Array<{ memory: Memory; attrs: MemoryAttrs }> = []\n for (const m of input.memories) {\n wrapped.push(memoryToAttrs(m))\n }\n const block = input.renderMemories(wrapped)\n if (block.length > 0) trailingParts.push(block)\n } else if (label === 'retrievables') {\n const wrapped: Array<{ retrievable: Retrievable; attrs: RetrievableAttrs }> = []\n for (const r of input.retrievables) {\n wrapped.push(retrievableToAttrs(r))\n }\n const block = await input.renderRetrievables(wrapped, {\n renderRetrievableSafetyDirective: input.renderRetrievableSafetyDirective,\n renderFirstPartyRetrievables: input.renderFirstPartyRetrievables,\n renderThirdPartyPublicRetrievables: input.renderThirdPartyPublicRetrievables,\n renderThirdPartyPrivateRetrievables: input.renderThirdPartyPrivateRetrievables,\n renderUntrustedContent: input.renderUntrustedContent,\n })\n if (block.length > 0) trailingParts.push(block)\n }\n }\n if (trailingParts.length > 0) {\n out.push({ role: 'system', content: trailingParts.join('\\n\\n') })\n }\n }\n\n return { messages: out, reasoningPayloads }\n}\n/** Default history assembler; alias of {@link buildChatCompletionsHistory}. */\nexport const defaultBuildChatCompletionsHistory = buildChatCompletionsHistory\n\n// ─── createChatCompletionsToolCallDeltaAccumulator ────────────────────────────\n\n/**\n * Creates a fresh accumulator that stitches streamed {@link ChatCompletionsToolCallDelta} fragments\n * (keyed by their stream index) into fully-assembled tool calls, drained once the stream completes.\n */\nexport const createChatCompletionsToolCallDeltaAccumulator =\n (): ChatCompletionsToolCallDeltaAccumulator => {\n const byIndex = new Map<\n number,\n { id?: string; type?: 'function'; name: string; args: string }\n >()\n return {\n feed(delta: ChatCompletionsToolCallDelta): void {\n const idx = delta.index\n let entry = byIndex.get(idx)\n if (!entry) {\n entry = { name: '', args: '' }\n byIndex.set(idx, entry)\n }\n if (delta.id !== undefined) entry.id = delta.id\n if (delta.type !== undefined) entry.type = delta.type\n if (delta.function?.name !== undefined) {\n entry.name = entry.name + delta.function.name\n }\n if (delta.function?.arguments !== undefined) {\n entry.args = entry.args + delta.function.arguments\n }\n },\n drain(): AssembledToolCall[] {\n const out: AssembledToolCall[] = []\n const indices = Array.from(byIndex.keys()).sort((a, b) => a - b)\n for (const idx of indices) {\n const e = byIndex.get(idx)!\n out.push({\n id: e.id ?? `call_${idx}`,\n type: e.type ?? 'function',\n name: e.name,\n args: e.args,\n })\n }\n return out\n },\n }\n }\n/** Default delta-accumulator factory; alias of {@link createChatCompletionsToolCallDeltaAccumulator}. */\nexport const defaultCreateChatCompletionsToolCallDeltaAccumulator =\n createChatCompletionsToolCallDeltaAccumulator\n"],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import "../../../common-
|
|
2
|
-
import { n as Media } from "../../../tool_call-
|
|
1
|
+
import "../../../common-Bs4H4NOD.mjs";
|
|
2
|
+
import { n as Media } from "../../../tool_call-B2Ty8FuQ.mjs";
|
|
3
3
|
import "../../../guards.mjs";
|
|
4
4
|
import { E_UNSUPPORTED_MEDIA_MODALITY } from "./exceptions.mjs";
|
|
5
5
|
import { A as retrievableToAttrs, C as renderRetrievables, D as renderThought, E as renderThirdPartyPublicRetrievables, M as toolsToChatCompletionsTools, O as renderTrustedContent, S as renderRetrievableSafetyDirective, T as renderThirdPartyPrivateRetrievables, _ as filterThoughts, a as defaultRenderMemories, b as renderFirstPartyRetrievables, c as defaultRenderStandingInstructions, d as defaultRenderThought, f as defaultRenderTrustedContent, g as escapeXmlAttribute, h as descriptionToChatCompletionsJsonSchema, i as defaultRenderFirstPartyRetrievables, j as sanitiseNameField, k as renderUntrustedContent, l as defaultRenderThirdPartyPrivateRetrievables, m as defaultToolsToChatCompletionsTools, n as defaultFilterThoughts, o as defaultRenderRetrievableSafetyDirective, p as defaultRenderUntrustedContent, r as defaultRenderChatCompletionsSystemPrompt, s as defaultRenderRetrievables, t as defaultDescriptionToChatCompletionsJsonSchema, u as defaultRenderThirdPartyPublicRetrievables, v as memoryToAttrs, w as renderStandingInstructions, x as renderMemories, y as renderChatCompletionsSystemPrompt } from "../../../helpers-xhrQbMAG.mjs";
|
|
@@ -107,7 +107,26 @@ var renderTextInEnvelope = (text, args) => {
|
|
|
107
107
|
});
|
|
108
108
|
};
|
|
109
109
|
var renderSyntheticMediaDescription = (media, byteLen) => `[media: ${media.filename}, ${media.mimeType}, ${formatBytesHumanReadable(byteLen)}]`;
|
|
110
|
+
/**
|
|
111
|
+
* The inline media id-marker: a harness-authored text block rendered immediately BEFORE each
|
|
112
|
+
* media content block, so the model can reference the media by id in subsequent tool calls
|
|
113
|
+
* (`media_id` args, `@id` pipe refs).
|
|
114
|
+
*
|
|
115
|
+
* Trust posture: the marker is structural reference data authored by the harness from the
|
|
116
|
+
* harness-controlled `Media.id` (a UUID, not derivable from the payload) — it is NOT payload
|
|
117
|
+
* content, carries no authority, and deliberately renders OUTSIDE the untrusted envelope with
|
|
118
|
+
* fixed, non-instruction phrasing. This is a documented cross-battery convention: every LLM
|
|
119
|
+
* battery that renders media emits the same marker shape.
|
|
120
|
+
*/
|
|
121
|
+
var renderMediaIdMarker = (media) => `[media id: ${media.id} | ${media.filename}]`;
|
|
110
122
|
var renderMediaToContentBlocks = async (input) => {
|
|
123
|
+
const blocks = await renderMediaBodyBlocks(input);
|
|
124
|
+
return [{
|
|
125
|
+
type: "text",
|
|
126
|
+
text: renderMediaIdMarker(input.media)
|
|
127
|
+
}, ...blocks];
|
|
128
|
+
};
|
|
129
|
+
var renderMediaBodyBlocks = async (input) => {
|
|
111
130
|
const { media, toolName, nonce, unsupportedMediaPolicy, warn } = input;
|
|
112
131
|
const modality = modalityHazardToAttr(media.modalityHazard);
|
|
113
132
|
const kind = media.kind;
|