@inflexa-ai/harness 0.45.1 → 0.46.2
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/README.md +6 -3
- package/dist/agents/conversation-agent.d.ts +9 -3
- package/dist/agents/conversation-agent.js +34 -33
- package/dist/agents/report-session-agent.d.ts +15 -15
- package/dist/agents/report-session-agent.js +23 -15
- package/dist/agents/sandbox/index.d.ts +1 -1
- package/dist/agents/sandbox/index.js +1 -1
- package/dist/agents/sandbox/shared.d.ts +12 -14
- package/dist/agents/sandbox/shared.js +18 -12
- package/dist/agents/sandbox/types.d.ts +4 -4
- package/dist/agents/sandbox/validate-skills.d.ts +2 -2
- package/dist/agents/sandbox/validate-skills.js +3 -1
- package/dist/agents/sandbox-catalog.d.ts +2 -2
- package/dist/agents/sandbox-catalog.js +3 -3
- package/dist/agents/system-prompt.d.ts +2 -2
- package/dist/app/chat-turn-workflow.d.ts +114 -0
- package/dist/app/chat-turn-workflow.js +306 -0
- package/dist/app/chat-turn.d.ts +85 -57
- package/dist/app/chat-turn.js +123 -100
- package/dist/app/data-profile-orientation.js +10 -8
- package/dist/app/data-profile-view.d.ts +4 -4
- package/dist/app/data-profile-view.js +9 -8
- package/dist/app/in-process-turn.d.ts +42 -0
- package/dist/app/in-process-turn.js +139 -0
- package/dist/app/message-assembly.d.ts +10 -4
- package/dist/app/message-assembly.js +13 -8
- package/dist/app/report-session-runtime.d.ts +4 -4
- package/dist/app/report-session-runtime.js +36 -21
- package/dist/app/spawn-report-session.d.ts +33 -28
- package/dist/app/spawn-report-session.js +25 -40
- package/dist/app/synthesize-run.d.ts +22 -16
- package/dist/app/synthesize-run.js +41 -35
- package/dist/app/work.d.ts +96 -0
- package/dist/app/work.js +147 -0
- package/dist/auth/local-auth-context.d.ts +1 -3
- package/dist/auth/local-auth-context.js +1 -3
- package/dist/auth/local-run-authorizer.d.ts +1 -1
- package/dist/auth/local-run-authorizer.js +5 -3
- package/dist/auth/types.d.ts +26 -26
- package/dist/billing/cached-resolver.d.ts +4 -4
- package/dist/billing/run-charge.d.ts +5 -8
- package/dist/billing/run-charge.js +2 -2
- package/dist/billing/usage-recorder.d.ts +9 -9
- package/dist/citations/aggregate.js +1 -1
- package/dist/citations/clients/arxiv.d.ts +2 -2
- package/dist/citations/clients/arxiv.js +12 -4
- package/dist/citations/clients/common.js +4 -2
- package/dist/citations/clients/crossref.d.ts +2 -2
- package/dist/citations/clients/crossref.js +37 -37
- package/dist/citations/clients/doi-registry.js +15 -16
- package/dist/citations/clients/pubmed.d.ts +2 -2
- package/dist/citations/clients/pubmed.js +20 -13
- package/dist/citations/clients/semantic-scholar.d.ts +2 -2
- package/dist/citations/clients/semantic-scholar.js +9 -9
- package/dist/citations/compare.js +2 -2
- package/dist/citations/match.d.ts +2 -2
- package/dist/citations/match.js +12 -7
- package/dist/citations/normalize.js +35 -26
- package/dist/citations/plan.js +6 -2
- package/dist/citations/resolve.d.ts +6 -6
- package/dist/citations/resolve.js +34 -25
- package/dist/citations/types.d.ts +77 -77
- package/dist/config/environment-stores.d.ts +6 -6
- package/dist/config/resource-limits.js +1 -3
- package/dist/contracts/analogy-report.d.ts +7 -7
- package/dist/contracts/analogy-report.js +2 -2
- package/dist/contracts/chat-events.d.ts +38 -24
- package/dist/contracts/chat-frame.d.ts +15 -5
- package/dist/contracts/chat-frame.js +64 -41
- package/dist/contracts/chat-parts.d.ts +130 -67
- package/dist/contracts/chat-parts.js +1 -0
- package/dist/contracts/content-url.js +16 -2
- package/dist/contracts/data-profile.d.ts +38 -38
- package/dist/contracts/index.d.ts +2 -2
- package/dist/contracts/index.js +1 -1
- package/dist/contracts/message.d.ts +6 -6
- package/dist/contracts/organ-system.d.ts +11 -11
- package/dist/contracts/part-registry.d.ts +5 -4
- package/dist/contracts/part-registry.js +5 -0
- package/dist/contracts/profile-vocabulary.d.ts +11 -10
- package/dist/contracts/profile-vocabulary.js +10 -3
- package/dist/contracts/report-blocks.d.ts +329 -329
- package/dist/contracts/report-reference.d.ts +105 -81
- package/dist/contracts/report-reference.js +30 -13
- package/dist/contracts/schemas/chat-events.d.ts +30 -16
- package/dist/contracts/schemas/chat-events.js +15 -6
- package/dist/contracts/schemas/chat-parts.d.ts +175 -102
- package/dist/contracts/schemas/chat-parts.js +33 -7
- package/dist/contracts/severity.d.ts +1 -1
- package/dist/contracts/structure-source.d.ts +3 -3
- package/dist/contracts/structure-source.js +6 -2
- package/dist/contracts/subagent-activity.d.ts +2 -2
- package/dist/contracts/subagent-activity.js +5 -3
- package/dist/contracts/usage.d.ts +2 -2
- package/dist/data/safety-panel-schema.d.ts +25 -25
- package/dist/data/safety-panel-schema.js +13 -4
- package/dist/execution/artifact-metadata.d.ts +23 -15
- package/dist/execution/artifact-metadata.js +33 -10
- package/dist/execution/artifact-record.d.ts +2 -2
- package/dist/execution/artifact-registration.d.ts +5 -5
- package/dist/execution/artifact-registry.d.ts +8 -8
- package/dist/execution/dbos-run-launcher.d.ts +24 -4
- package/dist/execution/dbos-run-launcher.js +58 -4
- package/dist/execution/dbos-workflow-purger.d.ts +5 -6
- package/dist/execution/dbos-workflow-purger.js +8 -7
- package/dist/execution/input-signature.d.ts +2 -2
- package/dist/execution/post-step-pipeline.d.ts +9 -9
- package/dist/execution/post-step-pipeline.js +1 -1
- package/dist/execution/post-step.js +2 -2
- package/dist/execution/reconcile-manifest.d.ts +4 -4
- package/dist/execution/reconcile-manifest.js +3 -2
- package/dist/execution/run-authorizer.d.ts +46 -37
- package/dist/execution/run-authorizer.js +8 -8
- package/dist/execution/run-canceler.d.ts +7 -7
- package/dist/execution/run-canceler.js +14 -7
- package/dist/execution/run-end-record.d.ts +2 -3
- package/dist/execution/run-event-parts.d.ts +0 -8
- package/dist/execution/run-event-parts.js +29 -24
- package/dist/execution/run-event-stream.d.ts +8 -8
- package/dist/execution/run-event-stream.js +3 -4
- package/dist/execution/run-launcher.d.ts +4 -4
- package/dist/execution/run-synthesis.d.ts +49 -48
- package/dist/execution/run-synthesis.js +96 -255
- package/dist/execution/staged-input.d.ts +2 -2
- package/dist/execution/step-summary.d.ts +6 -6
- package/dist/execution/step-summary.js +4 -8
- package/dist/execution/topo-sort.js +4 -3
- package/dist/execution/workflow-purger.d.ts +2 -2
- package/dist/index.d.ts +17 -20
- package/dist/index.js +25 -36
- package/dist/input-sanitization.js +9 -2
- package/dist/input-scan/clustering.d.ts +6 -6
- package/dist/input-scan/clustering.js +11 -5
- package/dist/input-scan/companions.js +3 -2
- package/dist/input-scan/detect-sets.d.ts +2 -2
- package/dist/input-scan/detect-sets.js +25 -21
- package/dist/input-scan/enrich.d.ts +6 -6
- package/dist/input-scan/enrich.js +29 -12
- package/dist/input-scan/formats.d.ts +2 -2
- package/dist/input-scan/formats.js +8 -2
- package/dist/input-scan/markers.d.ts +2 -2
- package/dist/input-scan/markers.js +14 -5
- package/dist/input-scan/menu.d.ts +10 -10
- package/dist/input-scan/menu.js +0 -0
- package/dist/input-scan/quarantine.d.ts +2 -2
- package/dist/input-scan/quarantine.js +23 -18
- package/dist/input-scan/readout-budget.d.ts +2 -2
- package/dist/input-scan/readout-budget.js +1 -1
- package/dist/input-scan/readout.d.ts +2 -2
- package/dist/input-scan/readout.js +47 -34
- package/dist/input-scan/scan.d.ts +2 -2
- package/dist/input-scan/scan.js +7 -5
- package/dist/input-scan/set-types.d.ts +28 -28
- package/dist/input-scan/shapes.d.ts +4 -4
- package/dist/input-scan/shapes.js +0 -0
- package/dist/input-scan/templates.d.ts +10 -10
- package/dist/input-scan/templates.js +30 -22
- package/dist/input-scan/tokens.d.ts +6 -4
- package/dist/input-scan/tokens.js +100 -38
- package/dist/input-scan/types.d.ts +22 -22
- package/dist/lib/async-utils.d.ts +3 -7
- package/dist/lib/async-utils.js +5 -9
- package/dist/lib/cache.js +1 -1
- package/dist/lib/chrome.d.ts +46 -6
- package/dist/lib/console-logger.js +2 -2
- package/dist/lib/db-result.d.ts +22 -6
- package/dist/lib/db-result.js +9 -13
- package/dist/lib/eyes.d.ts +4 -4
- package/dist/lib/eyes.js +1 -1
- package/dist/lib/fs-helpers.js +18 -6
- package/dist/lib/fs-result.d.ts +1 -0
- package/dist/lib/fs-result.js +5 -6
- package/dist/lib/hooks.d.ts +32 -7
- package/dist/lib/hooks.js +22 -3
- package/dist/lib/host-concurrency.js +3 -2
- package/dist/lib/logger.d.ts +2 -2
- package/dist/lib/logger.js +2 -1
- package/dist/lib/metrics.d.ts +1 -1
- package/dist/lib/null-proto.d.ts +6 -0
- package/dist/lib/null-proto.js +17 -0
- package/dist/lib/otel-spans.d.ts +1 -1
- package/dist/lib/otel-spans.js +9 -5
- package/dist/lib/otel.d.ts +4 -2
- package/dist/lib/otel.js +10 -2
- package/dist/lib/page-capture.d.ts +8 -8
- package/dist/lib/page-capture.js +9 -4
- package/dist/lib/parse-json.d.ts +5 -0
- package/dist/lib/parse-json.js +12 -0
- package/dist/lib/present.d.ts +12 -0
- package/dist/lib/present.js +39 -0
- package/dist/lib/rate-limit.d.ts +4 -4
- package/dist/lib/rate-limit.js +12 -13
- package/dist/lib/regulatory-corpus/fetch-fda-guidance.d.ts +4 -4
- package/dist/lib/regulatory-corpus/fetch-fda-guidance.js +4 -10
- package/dist/lib/regulatory-corpus/fetch-ich.d.ts +4 -4
- package/dist/lib/regulatory-corpus/fetch-ich.js +18 -14
- package/dist/lib/regulatory-corpus/normalize-whitespace.d.ts +6 -0
- package/dist/lib/regulatory-corpus/normalize-whitespace.js +41 -0
- package/dist/lib/regulatory-corpus.d.ts +10 -10
- package/dist/lib/regulatory-corpus.js +3 -1
- package/dist/lib/result.d.ts +10 -11
- package/dist/lib/result.js +15 -13
- package/dist/lib/storage.d.ts +2 -2
- package/dist/lib/test/async-iterable.d.ts +9 -0
- package/dist/lib/test/async-iterable.js +28 -0
- package/dist/lib/test/request-url.d.ts +5 -0
- package/dist/lib/test/request-url.js +7 -0
- package/dist/lib/test/result-assert.d.ts +12 -0
- package/dist/lib/test/result-assert.js +17 -0
- package/dist/lib/test/text-shapes.d.ts +24 -0
- package/dist/lib/test/text-shapes.js +63 -0
- package/dist/lib/text.d.ts +22 -0
- package/dist/lib/text.js +68 -0
- package/dist/lib/thrown.d.ts +18 -0
- package/dist/lib/thrown.js +30 -0
- package/dist/lib/unknown-array.d.ts +6 -0
- package/dist/lib/unknown-array.js +8 -0
- package/dist/lib/unknown-containers.d.ts +14 -0
- package/dist/lib/unknown-containers.js +17 -0
- package/dist/lib/unknown-text.d.ts +8 -0
- package/dist/lib/unknown-text.js +28 -0
- package/dist/lib/zod-issue-shape.d.ts +1 -1
- package/dist/lib/zod-issue-shape.js +31 -31
- package/dist/lib/zod-issues.d.ts +3 -3
- package/dist/lib/zod-issues.js +30 -17
- package/dist/literature/sources/arxiv.d.ts +6 -6
- package/dist/literature/sources/arxiv.js +92 -35
- package/dist/literature/sources/http.d.ts +2 -2
- package/dist/literature/sources/http.js +16 -15
- package/dist/literature/sources/pubmed.d.ts +16 -16
- package/dist/literature/sources/pubmed.js +96 -61
- package/dist/literature/sources/semantic-scholar.d.ts +8 -8
- package/dist/literature/sources/semantic-scholar.js +22 -13
- package/dist/loop/accounting.d.ts +63 -0
- package/dist/loop/accounting.js +141 -0
- package/dist/loop/call-policy.d.ts +73 -0
- package/dist/loop/call-policy.js +109 -0
- package/dist/loop/chat-stream.d.ts +62 -0
- package/dist/loop/chat-stream.js +237 -0
- package/dist/loop/compaction.d.ts +9 -9
- package/dist/loop/compaction.js +1 -1
- package/dist/loop/metrics.d.ts +12 -15
- package/dist/loop/metrics.js +14 -26
- package/dist/loop/run-loop.d.ts +233 -0
- package/dist/loop/run-loop.js +770 -0
- package/dist/loop/sub-agent.d.ts +61 -0
- package/dist/loop/sub-agent.js +160 -0
- package/dist/loop/tool-adapter.d.ts +98 -0
- package/dist/loop/tool-adapter.js +364 -0
- package/dist/loop/tool-detail.d.ts +1 -1
- package/dist/loop/tool-detail.js +6 -5
- package/dist/loop/tool-outcome.d.ts +1 -1
- package/dist/loop/tool-output.d.ts +4 -4
- package/dist/loop/tool-output.js +2 -2
- package/dist/loop/turn-credentials.d.ts +39 -0
- package/dist/loop/turn-credentials.js +90 -0
- package/dist/loop/types.d.ts +29 -38
- package/dist/loop/types.js +2 -7
- package/dist/memory/ai-sdk-message-storage.d.ts +5 -5
- package/dist/memory/ai-sdk-message-storage.js +13 -11
- package/dist/memory/card-builders.d.ts +14 -14
- package/dist/memory/card-builders.js +19 -15
- package/dist/memory/conversation-display-recorder.d.ts +22 -4
- package/dist/memory/conversation-display-recorder.js +43 -24
- package/dist/memory/conversation-display-replay.js +3 -2
- package/dist/memory/conversation-display-storage.d.ts +15 -7
- package/dist/memory/conversation-display-storage.js +141 -36
- package/dist/memory/conversation-view.d.ts +4 -4
- package/dist/memory/conversation-view.js +5 -4
- package/dist/memory/count-tokens.js +10 -8
- package/dist/memory/derive-thread-title.d.ts +0 -13
- package/dist/memory/derive-thread-title.js +2 -1
- package/dist/memory/message-backfill.d.ts +12 -5
- package/dist/memory/message-backfill.js +5 -3
- package/dist/memory/thread-history.d.ts +36 -21
- package/dist/memory/thread-history.js +78 -54
- package/dist/memory/thread-store.d.ts +26 -17
- package/dist/memory/thread-store.js +15 -9
- package/dist/memory/tool-call-integrity.d.ts +2 -2
- package/dist/memory/tool-call-integrity.js +4 -3
- package/dist/memory/working-memory.d.ts +16 -12
- package/dist/memory/working-memory.js +72 -61
- package/dist/prompts/briefing.d.ts +12 -12
- package/dist/prompts/briefing.js +1 -1
- package/dist/prompts/synthesis-agent.d.ts +1 -1
- package/dist/prompts/synthesis-agent.js +6 -14
- package/dist/provenance/collector.d.ts +6 -6
- package/dist/provenance/collector.js +15 -8
- package/dist/provenance/exec-frame.d.ts +2 -2
- package/dist/provenance/exec-frame.js +6 -1
- package/dist/provenance/seam.d.ts +1 -4
- package/dist/provenance/types.d.ts +6 -6
- package/dist/providers/ai-sdk.d.ts +113 -62
- package/dist/providers/ai-sdk.js +283 -518
- package/dist/providers/embedding.d.ts +2 -2
- package/dist/providers/embedding.js +1 -1
- package/dist/providers/errors.d.ts +22 -2
- package/dist/providers/errors.js +98 -50
- package/dist/providers/prompt-cache.d.ts +8 -8
- package/dist/providers/prompt-cache.js +13 -11
- package/dist/providers/reasoning.d.ts +2 -2
- package/dist/providers/reasoning.js +2 -2
- package/dist/providers/request-headers.js +12 -3
- package/dist/providers/types.d.ts +55 -94
- package/dist/reference-data/catalog.d.ts +2 -15
- package/dist/reference-data/catalog.js +25 -8
- package/dist/reference-data/receipt.d.ts +2 -2
- package/dist/report-model/assert-rules.js +1 -1
- package/dist/report-model/authoring-grammar.d.ts +211 -233
- package/dist/report-model/block-walk.d.ts +10 -10
- package/dist/report-model/block-walk.js +2 -0
- package/dist/report-model/draft-finish.d.ts +8 -8
- package/dist/report-model/draft-finish.js +1 -1
- package/dist/report-model/draft-hash.js +8 -7
- package/dist/report-model/draft-operations.d.ts +22 -10
- package/dist/report-model/draft-operations.js +48 -30
- package/dist/report-model/draft-read.d.ts +19 -7
- package/dist/report-model/draft-read.js +16 -6
- package/dist/report-model/draft.d.ts +844 -2
- package/dist/report-model/draft.js +3 -1
- package/dist/report-model/fixture-resolver.js +39 -16
- package/dist/report-model/pin-snapshot.d.ts +2 -2
- package/dist/report-model/pin-snapshot.js +15 -15
- package/dist/report-model/production-resolver.d.ts +18 -18
- package/dist/report-model/production-resolver.js +50 -42
- package/dist/report-model/reference-resolver.d.ts +26 -10
- package/dist/report-model/reference-resolver.js +68 -5
- package/dist/report-model/reference-stamp.js +30 -38
- package/dist/report-model/structural-validation.js +12 -4
- package/dist/report-model/validate.d.ts +7 -7
- package/dist/report-model/validate.js +6 -6
- package/dist/report-render/assets.d.ts +2 -2
- package/dist/report-render/assets.js +27 -3
- package/dist/report-render/chart-export.d.ts +10 -2
- package/dist/report-render/chart-export.js +37 -11
- package/dist/report-render/chart-presets.d.ts +8 -8
- package/dist/report-render/chart-presets.js +3 -3
- package/dist/report-render/chart-renderers.d.ts +23 -16
- package/dist/report-render/chart-renderers.js +74 -53
- package/dist/report-render/chart-toolbox.d.ts +2 -2
- package/dist/report-render/chart-toolbox.js +7 -6
- package/dist/report-render/chart.d.ts +15 -16
- package/dist/report-render/chart.js +369 -252
- package/dist/report-render/design.d.ts +36 -297
- package/dist/report-render/design.js +0 -12
- package/dist/report-render/figures/common.d.ts +12 -12
- package/dist/report-render/figures/common.js +42 -31
- package/dist/report-render/figures/dendrogram.d.ts +3 -3
- package/dist/report-render/figures/dendrogram.js +10 -10
- package/dist/report-render/figures/dense.js +15 -8
- package/dist/report-render/figures/dotplot.js +46 -33
- package/dist/report-render/figures/embedding.js +52 -43
- package/dist/report-render/figures/equal-units.d.ts +10 -10
- package/dist/report-render/figures/equal-units.js +27 -27
- package/dist/report-render/figures/forest.js +9 -7
- package/dist/report-render/figures/gsea.js +21 -11
- package/dist/report-render/figures/heatmap.js +13 -9
- package/dist/report-render/figures/index.d.ts +10 -10
- package/dist/report-render/figures/index.js +4 -2
- package/dist/report-render/figures/km.js +10 -9
- package/dist/report-render/figures/label-room.d.ts +12 -12
- package/dist/report-render/figures/label-room.js +7 -2
- package/dist/report-render/figures/locuszoom.d.ts +2 -2
- package/dist/report-render/figures/locuszoom.js +59 -31
- package/dist/report-render/figures/lollipop.js +3 -2
- package/dist/report-render/figures/ma.js +8 -4
- package/dist/report-render/figures/manhattan.d.ts +1 -2
- package/dist/report-render/figures/manhattan.js +52 -34
- package/dist/report-render/figures/oncoprint.js +4 -5
- package/dist/report-render/figures/pca.js +25 -11
- package/dist/report-render/figures/qq.js +20 -9
- package/dist/report-render/figures/roc.js +1 -1
- package/dist/report-render/figures/sankey.d.ts +2 -2
- package/dist/report-render/figures/sankey.js +11 -10
- package/dist/report-render/figures/upset.d.ts +6 -6
- package/dist/report-render/figures/upset.js +7 -4
- package/dist/report-render/figures/volcano.js +12 -10
- package/dist/report-render/hybrid-svg.d.ts +4 -4
- package/dist/report-render/hybrid-svg.js +7 -5
- package/dist/report-render/number-format.d.ts +4 -4
- package/dist/report-render/number-format.js +62 -27
- package/dist/report-render/page.js +2 -1
- package/dist/report-render/provenance-data.d.ts +2 -2
- package/dist/report-render/references.d.ts +4 -4
- package/dist/report-render/render.d.ts +2 -2
- package/dist/report-render/render.js +10 -11
- package/dist/report-render/script-json.js +1 -1
- package/dist/report-render/table-data.d.ts +6 -6
- package/dist/report-render/test/options.d.ts +49 -0
- package/dist/report-render/test/options.js +143 -0
- package/dist/report-render/test/page-function.d.ts +19 -0
- package/dist/report-render/test/page-function.js +33 -0
- package/dist/report-render/types.d.ts +10 -10
- package/dist/report-render/value-bridge.d.ts +4 -4
- package/dist/report-render/value-bridge.js +27 -14
- package/dist/report-render/views/chart-view.d.ts +2 -2
- package/dist/report-render/views/chart-view.js +2 -2
- package/dist/report-render/views/lineage.d.ts +6 -6
- package/dist/report-render/views/lineage.js +2 -0
- package/dist/report-render/views/page-view.d.ts +2 -2
- package/dist/report-render/views/page-view.js +1 -0
- package/dist/report-render/views/prose.js +25 -8
- package/dist/report-render/views/references-view.js +12 -1
- package/dist/report-render/views/values.js +1 -1
- package/dist/runtime/assemble.d.ts +53 -26
- package/dist/runtime/assemble.js +103 -56
- package/dist/runtime/boot.d.ts +8 -7
- package/dist/runtime/boot.js +1 -1
- package/dist/runtime/connection-budget.d.ts +6 -6
- package/dist/runtime/connection-budget.js +1 -1
- package/dist/runtime/dbos.d.ts +29 -19
- package/dist/runtime/dbos.js +35 -20
- package/dist/runtime/result-serialization.js +18 -5
- package/dist/runtime/shutdown.d.ts +2 -2
- package/dist/sandbox/client.d.ts +7 -3
- package/dist/sandbox/cpu-files.d.ts +2 -2
- package/dist/sandbox/cpu-files.js +21 -4
- package/dist/sandbox/create-sandbox.d.ts +7 -8
- package/dist/sandbox/create-sandbox.js +6 -12
- package/dist/sandbox/docker-client.d.ts +48 -3
- package/dist/sandbox/docker-client.js +10 -6
- package/dist/sandbox/estimate-data-profile-resources.js +2 -7
- package/dist/sandbox/exec-outcome.d.ts +2 -2
- package/dist/sandbox/exec-outcome.js +1 -1
- package/dist/sandbox/exec.d.ts +10 -6
- package/dist/sandbox/exec.js +27 -12
- package/dist/sandbox/execution-id.js +14 -6
- package/dist/sandbox/farm.d.ts +2 -2
- package/dist/sandbox/farm.js +22 -27
- package/dist/sandbox/identity.d.ts +7 -0
- package/dist/sandbox/identity.js +14 -3
- package/dist/sandbox/image-packages.js +15 -27
- package/dist/sandbox/k8s-client.d.ts +35 -8
- package/dist/sandbox/k8s-client.js +6 -5
- package/dist/sandbox/labels.js +1 -0
- package/dist/sandbox/liveness.js +3 -1
- package/dist/sandbox/mount-plan.d.ts +10 -10
- package/dist/sandbox/mount-plan.js +13 -14
- package/dist/sandbox/notification-sweep.d.ts +4 -4
- package/dist/sandbox/notification-sweep.js +4 -7
- package/dist/sandbox/package-identity.d.ts +6 -13
- package/dist/sandbox/package-identity.js +46 -28
- package/dist/sandbox/reaper.d.ts +10 -10
- package/dist/sandbox/reaper.js +4 -6
- package/dist/sandbox/sandbox-error.d.ts +2 -9
- package/dist/sandbox/sandbox-error.js +21 -8
- package/dist/sandbox/sandbox-step-translate.d.ts +8 -5
- package/dist/sandbox/sandbox-step-translate.js +22 -8
- package/dist/sandbox/step-sandbox.d.ts +47 -0
- package/dist/sandbox/step-sandbox.js +53 -0
- package/dist/sandbox/types.d.ts +18 -19
- package/dist/sandbox/types.js +1 -1
- package/dist/schemas/artifact-manifest.d.ts +4 -4
- package/dist/schemas/data-profile-schemas.d.ts +343 -298
- package/dist/schemas/file-metadata.js +2 -4
- package/dist/schemas/plan-schemas.d.ts +31 -31
- package/dist/schemas/run-synthesis.d.ts +95 -26
- package/dist/schemas/run-synthesis.js +3 -1
- package/dist/schemas/validate-plan.d.ts +4 -4
- package/dist/schemas/validate-plan.js +17 -5
- package/dist/schemas/workflow-state.d.ts +19 -19
- package/dist/schemas/workflow-state.js +2 -2
- package/dist/state/active-turns.d.ts +36 -0
- package/dist/state/active-turns.js +67 -0
- package/dist/state/analyses-metrics.d.ts +8 -8
- package/dist/state/analyses-metrics.js +4 -4
- package/dist/state/analyses.d.ts +0 -14
- package/dist/state/analyses.js +0 -32
- package/dist/state/artifacts.d.ts +32 -19
- package/dist/state/artifacts.js +28 -5
- package/dist/state/data-profile.d.ts +2 -2
- package/dist/state/db.d.ts +12 -2
- package/dist/state/db.js +5 -0
- package/dist/state/edit-intents.d.ts +4 -0
- package/dist/state/edit-intents.js +71 -0
- package/dist/state/index.d.ts +4 -4
- package/dist/state/index.js +2 -2
- package/dist/state/init.d.ts +2 -1
- package/dist/state/init.js +5 -2
- package/dist/state/migrations/20260927120000_baseline.js +3 -1
- package/dist/state/migrations/20261026120000_add_the_edit_intents.d.ts +7 -0
- package/dist/state/migrations/20261026120000_add_the_edit_intents.js +21 -0
- package/dist/state/migrations/20261027120000_record_the_applied_memory_edits.d.ts +7 -0
- package/dist/state/migrations/20261027120000_record_the_applied_memory_edits.js +16 -0
- package/dist/state/migrations/20261027120100_store_the_authoring_results.d.ts +8 -0
- package/dist/state/migrations/20261027120100_store_the_authoring_results.js +20 -0
- package/dist/state/migrations/20261027120200_key_the_groups_of_a_turn.d.ts +7 -0
- package/dist/state/migrations/20261027120200_key_the_groups_of_a_turn.js +12 -0
- package/dist/state/migrations/20261027120300_mark_the_active_turn_of_a_thread.d.ts +7 -0
- package/dist/state/migrations/20261027120300_mark_the_active_turn_of_a_thread.js +11 -0
- package/dist/state/migrations/20261028120000_record_the_paused_work.d.ts +7 -0
- package/dist/state/migrations/20261028120000_record_the_paused_work.js +25 -0
- package/dist/state/migrations/20261028120100_end_the_suspended_runs.d.ts +8 -0
- package/dist/state/migrations/20261028120100_end_the_suspended_runs.js +13 -0
- package/dist/state/migrations/20261029120000_reference_the_run_mandate.d.ts +7 -0
- package/dist/state/migrations/20261029120000_reference_the_run_mandate.js +23 -0
- package/dist/state/migrations/20261029120100_record_the_run_session_of_a_pause.d.ts +7 -0
- package/dist/state/migrations/20261029120100_record_the_run_session_of_a_pause.js +11 -0
- package/dist/state/migrations/index.js +18 -0
- package/dist/state/paused-work.d.ts +52 -0
- package/dist/state/paused-work.js +105 -0
- package/dist/state/plans.d.ts +27 -8
- package/dist/state/plans.js +14 -11
- package/dist/state/purge-analysis.d.ts +6 -6
- package/dist/state/purge-analysis.js +10 -2
- package/dist/state/report-session-state.d.ts +43 -18
- package/dist/state/report-session-state.js +43 -4
- package/dist/state/report-versions.d.ts +16 -11
- package/dist/state/report-versions.js +5 -3
- package/dist/state/runs.d.ts +30 -19
- package/dist/state/runs.js +43 -51
- package/dist/state/schema.d.ts +18 -21
- package/dist/state/schema.js +4 -5
- package/dist/state/snapshot-parse.d.ts +2 -2
- package/dist/state/snapshot-parse.js +14 -8
- package/dist/state/step-executions.d.ts +20 -8
- package/dist/state/step-executions.js +6 -4
- package/dist/state/tool-outputs.d.ts +2 -2
- package/dist/state/tool-outputs.js +2 -1
- package/dist/state/vector-store.d.ts +16 -16
- package/dist/state/vector-store.js +11 -7
- package/dist/tasks/data-profile-absorb.d.ts +3 -3
- package/dist/tasks/data-profile-absorb.js +21 -16
- package/dist/tasks/data-profile-activity.d.ts +5 -5
- package/dist/tasks/data-profile-activity.js +5 -5
- package/dist/tasks/data-profile-index.d.ts +4 -4
- package/dist/tasks/data-profile-index.js +32 -17
- package/dist/tasks/data-profile-resolve.d.ts +8 -8
- package/dist/tasks/data-profile-resolve.js +88 -62
- package/dist/tasks/data-profile.d.ts +40 -31
- package/dist/tasks/data-profile.js +138 -95
- package/dist/tasks/extract-values.d.ts +26 -79
- package/dist/tasks/extract-values.js +48 -108
- package/dist/tasks/refresh-regulatory-corpus.d.ts +4 -20
- package/dist/tasks/refresh-regulatory-corpus.js +12 -8
- package/dist/tasks/regulatory-corpus-boot-refresh.d.ts +2 -2
- package/dist/tasks/regulatory-corpus-boot-refresh.js +12 -10
- package/dist/testing.d.ts +62 -0
- package/dist/testing.js +101 -0
- package/dist/tools/ad-hoc-router.d.ts +9 -9
- package/dist/tools/ad-hoc-router.js +65 -52
- package/dist/tools/analysis-invocation.d.ts +7 -0
- package/dist/tools/analysis-invocation.js +29 -5
- package/dist/tools/approval/contract.d.ts +8 -52
- package/dist/tools/approval/contract.js +7 -36
- package/dist/tools/approval/gateway.d.ts +27 -28
- package/dist/tools/approval/gateway.js +33 -130
- package/dist/tools/approval/queries.d.ts +6 -11
- package/dist/tools/approval/queries.js +43 -29
- package/dist/tools/approval/uuidv7.js +2 -2
- package/dist/tools/bio/chembl.d.ts +3 -3
- package/dist/tools/bio/chembl.js +10 -0
- package/dist/tools/bio/comptox.d.ts +25 -8
- package/dist/tools/bio/comptox.js +4 -2
- package/dist/tools/bio/drug-gene-interactions.d.ts +27 -17
- package/dist/tools/bio/drug-gene-interactions.js +11 -8
- package/dist/tools/bio/gene-disease-evidence.d.ts +61 -15
- package/dist/tools/bio/gene-disease-evidence.js +10 -6
- package/dist/tools/bio/gene-preclinical-profile.d.ts +11 -11
- package/dist/tools/bio/keys.d.ts +2 -2
- package/dist/tools/bio/keys.js +3 -3
- package/dist/tools/bio/lookup-annotation.d.ts +5 -5
- package/dist/tools/bio/lookup-annotation.js +3 -0
- package/dist/tools/bio/opentargets.d.ts +1 -1
- package/dist/tools/bio/opentargets.js +6 -0
- package/dist/tools/bio/pubchem.d.ts +2 -2
- package/dist/tools/bio/pubchem.js +6 -0
- package/dist/tools/bio/pubmed.d.ts +26 -16
- package/dist/tools/bio/pubmed.js +9 -3
- package/dist/tools/bio/search-clinical-trials.d.ts +4 -4
- package/dist/tools/bio/search-clinical-trials.js +5 -1
- package/dist/tools/bio/search-faers.d.ts +2 -2
- package/dist/tools/bio/search-faers.js +1 -1
- package/dist/tools/bio/search-gene.d.ts +2 -2
- package/dist/tools/bio/search-gene.js +1 -0
- package/dist/tools/bio/search-geo-datasets.d.ts +4 -4
- package/dist/tools/bio/search-geo-datasets.js +5 -5
- package/dist/tools/bio/search-interactions.d.ts +1 -1
- package/dist/tools/bio/search-patents.d.ts +28 -22
- package/dist/tools/bio/search-patents.js +20 -17
- package/dist/tools/bio/search-protein.d.ts +2 -2
- package/dist/tools/bio/search-protein.js +1 -1
- package/dist/tools/bio/search-regulatory-approvals.d.ts +64 -18
- package/dist/tools/bio/search-regulatory-approvals.js +21 -16
- package/dist/tools/bio/target-safety.d.ts +8 -8
- package/dist/tools/bio/target-safety.js +11 -6
- package/dist/tools/capability-data.d.ts +9 -5
- package/dist/tools/capability-data.js +2 -1
- package/dist/tools/define-tool.d.ts +55 -46
- package/dist/tools/define-tool.js +39 -27
- package/dist/tools/display/normalize-echart-spec.d.ts +2 -2
- package/dist/tools/display/normalize-echart-spec.js +51 -27
- package/dist/tools/display/show-user.d.ts +2 -2
- package/dist/tools/display/show-user.js +1 -1
- package/dist/tools/execute-analysis.d.ts +19 -10
- package/dist/tools/execute-analysis.js +83 -62
- package/dist/tools/knowledge/check.d.ts +166 -44
- package/dist/tools/knowledge/check.js +5 -3
- package/dist/tools/knowledge/client.d.ts +31 -62
- package/dist/tools/knowledge/client.js +44 -27
- package/dist/tools/knowledge/environment.d.ts +6 -6
- package/dist/tools/knowledge/environment.js +18 -7
- package/dist/tools/knowledge/index.d.ts +2 -2
- package/dist/tools/knowledge/index.js +9 -9
- package/dist/tools/knowledge/local-slots.d.ts +4 -4
- package/dist/tools/knowledge/local-slots.js +11 -4
- package/dist/tools/knowledge/pin.d.ts +2 -2
- package/dist/tools/knowledge/recommend.d.ts +20 -45
- package/dist/tools/knowledge/recommend.js +27 -19
- package/dist/tools/knowledge/situation.d.ts +40 -40
- package/dist/tools/knowledge/situation.js +2 -9
- package/dist/tools/knowledge/skeleton.d.ts +4 -4
- package/dist/tools/knowledge/skeleton.js +10 -11
- package/dist/tools/knowledge/template.d.ts +20 -18
- package/dist/tools/knowledge/template.js +38 -32
- package/dist/tools/lib/alphafold-client.js +2 -1
- package/dist/tools/lib/amass-client.d.ts +28 -28
- package/dist/tools/lib/amass-client.js +20 -10
- package/dist/tools/lib/api-utils.d.ts +13 -3
- package/dist/tools/lib/api-utils.js +17 -3
- package/dist/tools/lib/bgee-client.d.ts +6 -6
- package/dist/tools/lib/bgee-client.js +16 -10
- package/dist/tools/lib/cbioportal-client.d.ts +4 -4
- package/dist/tools/lib/cbioportal-client.js +9 -8
- package/dist/tools/lib/chembl-client.d.ts +14 -14
- package/dist/tools/lib/chembl-client.js +11 -4
- package/dist/tools/lib/clinical-benchmarks-client.d.ts +4 -4
- package/dist/tools/lib/clinical-benchmarks-client.js +4 -7
- package/dist/tools/lib/clinical-trials-client.d.ts +18 -18
- package/dist/tools/lib/clinical-trials-client.js +10 -10
- package/dist/tools/lib/clinvar-client.d.ts +2 -2
- package/dist/tools/lib/clinvar-client.js +6 -6
- package/dist/tools/lib/ctx-ops.d.ts +23 -23
- package/dist/tools/lib/ctx-ops.js +13 -10
- package/dist/tools/lib/dgidb-client.d.ts +6 -6
- package/dist/tools/lib/dgidb-client.js +10 -12
- package/dist/tools/lib/disgenet-client.d.ts +4 -4
- package/dist/tools/lib/ema-client.d.ts +2 -2
- package/dist/tools/lib/ensembl-client.d.ts +4 -4
- package/dist/tools/lib/ensembl-client.js +5 -4
- package/dist/tools/lib/gwas-catalog-client.d.ts +4 -4
- package/dist/tools/lib/gwas-catalog-client.js +17 -17
- package/dist/tools/lib/html-text.d.ts +6 -0
- package/dist/tools/lib/html-text.js +9 -0
- package/dist/tools/lib/identifier-resolver.d.ts +4 -4
- package/dist/tools/lib/identifier-resolver.js +7 -3
- package/dist/tools/lib/impc-client.d.ts +8 -8
- package/dist/tools/lib/impc-client.js +46 -35
- package/dist/tools/lib/iuphar-client.d.ts +2 -2
- package/dist/tools/lib/iuphar-client.js +7 -16
- package/dist/tools/lib/monarch-client.d.ts +4 -4
- package/dist/tools/lib/openfda-client.d.ts +22 -22
- package/dist/tools/lib/openfda-client.js +23 -22
- package/dist/tools/lib/opentargets-client.d.ts +12 -12
- package/dist/tools/lib/pathway-client.d.ts +4 -4
- package/dist/tools/lib/pathway-client.js +15 -19
- package/dist/tools/lib/pharmgkb-client.d.ts +2 -2
- package/dist/tools/lib/pharmgkb-client.js +1 -1
- package/dist/tools/lib/protein-family-modality.d.ts +2 -2
- package/dist/tools/lib/protein-family-modality.js +0 -2
- package/dist/tools/lib/protein-family-normalize.js +7 -0
- package/dist/tools/lib/pubchem-client.d.ts +2 -2
- package/dist/tools/lib/pubchem-client.js +1 -0
- package/dist/tools/lib/pubchem-ops.d.ts +4 -4
- package/dist/tools/lib/pubchem-ops.js +8 -0
- package/dist/tools/lib/pubmed-client.d.ts +9 -9
- package/dist/tools/lib/pubmed-client.js +1 -1
- package/dist/tools/lib/string-client.d.ts +6 -6
- package/dist/tools/lib/uniprot-client.d.ts +8 -8
- package/dist/tools/lib/uniprot-client.js +5 -1
- package/dist/tools/memory/update-working-memory.d.ts +16 -13
- package/dist/tools/memory/update-working-memory.js +21 -3
- package/dist/tools/read-tool-output.js +8 -2
- package/dist/tools/registry.d.ts +2 -2
- package/dist/tools/report-authoring/authoring-tools.d.ts +54 -23
- package/dist/tools/report-authoring/authoring-tools.js +128 -62
- package/dist/tools/report-session/derive-table.d.ts +19 -59
- package/dist/tools/report-session/derive-table.js +120 -122
- package/dist/tools/report-session/examine-page.d.ts +6 -6
- package/dist/tools/report-session/examine-page.js +14 -12
- package/dist/tools/report-session/list-artifacts.d.ts +6 -6
- package/dist/tools/report-session/list-artifacts.js +5 -5
- package/dist/tools/report-session/page-faults.d.ts +6 -6
- package/dist/tools/report-session/page-faults.js +3 -1
- package/dist/tools/report-session/preview-report.d.ts +4 -3
- package/dist/tools/report-session/preview-report.js +26 -7
- package/dist/tools/report-session/record-version.d.ts +9 -4
- package/dist/tools/report-session/record-version.js +16 -9
- package/dist/tools/report-session/session-page-publisher.d.ts +6 -6
- package/dist/tools/research/generate-analogy-report.d.ts +14 -7
- package/dist/tools/research/generate-analogy-report.js +80 -76
- package/dist/tools/research/generate-plan.d.ts +16 -16
- package/dist/tools/research/generate-plan.js +410 -374
- package/dist/tools/research/guarded-address.js +3 -2
- package/dist/tools/research/inspect-data-profile.d.ts +27 -20
- package/dist/tools/research/inspect-data-profile.js +26 -25
- package/dist/tools/research/inspect-run.d.ts +54 -27
- package/dist/tools/research/inspect-run.js +50 -40
- package/dist/tools/research/literature-reviewer.d.ts +8 -7
- package/dist/tools/research/literature-reviewer.js +29 -28
- package/dist/tools/research/search-arxiv.d.ts +1 -1
- package/dist/tools/research/search-arxiv.js +1 -1
- package/dist/tools/research/search-github-repos.d.ts +10 -7
- package/dist/tools/research/search-github-repos.js +25 -22
- package/dist/tools/research/search-semantic-scholar.js +1 -1
- package/dist/tools/research/searxng-engine.d.ts +2 -2
- package/dist/tools/research/searxng-engine.js +6 -4
- package/dist/tools/research/web-fetch.d.ts +24 -21
- package/dist/tools/research/web-fetch.js +65 -74
- package/dist/tools/research/web-search.d.ts +26 -17
- package/dist/tools/research/web-search.js +26 -21
- package/dist/tools/sandbox/link-packages.d.ts +11 -7
- package/dist/tools/sandbox/link-packages.js +11 -8
- package/dist/tools/sandbox/list-available-packages.d.ts +17 -8
- package/dist/tools/sandbox/list-available-packages.js +31 -25
- package/dist/tools/sandbox/list-available-refs.d.ts +17 -14
- package/dist/tools/sandbox/list-available-refs.js +61 -36
- package/dist/tools/sandbox/report-blocker.d.ts +30 -37
- package/dist/tools/sandbox/report-blocker.js +23 -73
- package/dist/tools/sandbox/skills.d.ts +16 -12
- package/dist/tools/sandbox/skills.js +16 -12
- package/dist/tools/sandbox/submit-file-metadata.d.ts +12 -9
- package/dist/tools/sandbox/submit-file-metadata.js +18 -21
- package/dist/tools/start-report-session.d.ts +13 -5
- package/dist/tools/start-report-session.js +35 -8
- package/dist/tools/terminal-text.d.ts +5 -2
- package/dist/tools/terminal-text.js +35 -3
- package/dist/tools/workspace/decision-record.d.ts +4 -4
- package/dist/tools/workspace/decision-record.js +23 -13
- package/dist/tools/workspace/edit-file.d.ts +59 -20
- package/dist/tools/workspace/edit-file.js +81 -16
- package/dist/tools/workspace/execute-command.d.ts +15 -13
- package/dist/tools/workspace/execute-command.js +11 -9
- package/dist/tools/workspace/file-stat.d.ts +6 -3
- package/dist/tools/workspace/grep.d.ts +10 -7
- package/dist/tools/workspace/grep.js +9 -3
- package/dist/tools/workspace/list-files.d.ts +6 -3
- package/dist/tools/workspace/mutator.d.ts +28 -15
- package/dist/tools/workspace/mutator.js +107 -53
- package/dist/tools/workspace/read-file.d.ts +8 -5
- package/dist/tools/workspace/result-bounds.d.ts +5 -5
- package/dist/tools/workspace/result-bounds.js +4 -2
- package/dist/tools/workspace/run-exec.d.ts +2 -2
- package/dist/tools/workspace/run-exec.js +3 -3
- package/dist/tools/workspace/scan-inputs.d.ts +8 -5
- package/dist/tools/workspace/scan-inputs.js +17 -5
- package/dist/tools/workspace/show-file.d.ts +1 -1
- package/dist/tools/workspace/show-file.js +2 -1
- package/dist/tools/workspace/show-plan.d.ts +8 -5
- package/dist/tools/workspace/show-plan.js +9 -8
- package/dist/tools/workspace/workspace-search.d.ts +41 -13
- package/dist/tools/workspace/workspace-search.js +27 -14
- package/dist/tools/workspace/write-file.d.ts +9 -7
- package/dist/workflows/execute-analysis-scheduler.d.ts +9 -9
- package/dist/workflows/execute-analysis-scheduler.js +6 -3
- package/dist/workflows/execute-analysis.d.ts +46 -62
- package/dist/workflows/execute-analysis.js +137 -219
- package/dist/workflows/pause.d.ts +71 -0
- package/dist/workflows/pause.js +173 -0
- package/dist/workflows/sandbox-step.d.ts +38 -61
- package/dist/workflows/sandbox-step.js +99 -106
- package/dist/workflows/test/sql-writes.d.ts +21 -0
- package/dist/workflows/test/sql-writes.js +36 -0
- package/dist/workspace/filesystem.d.ts +6 -6
- package/dist/workspace/filesystem.js +10 -8
- package/dist/workspace/paths.d.ts +1 -1
- package/dist/workspace/paths.js +15 -4
- package/dist/workspace/search-config.d.ts +2 -2
- package/dist/workspace/search-config.js +1 -1
- package/package.json +21 -22
- package/dist/loop/call-guard.d.ts +0 -50
- package/dist/loop/call-guard.js +0 -90
- package/dist/loop/continue-agent.d.ts +0 -40
- package/dist/loop/continue-agent.js +0 -38
- package/dist/loop/genai-spans.d.ts +0 -47
- package/dist/loop/genai-spans.js +0 -134
- package/dist/loop/run-agent.d.ts +0 -245
- package/dist/loop/run-agent.js +0 -1124
- package/dist/loop/run-step.d.ts +0 -29
- package/dist/loop/run-step.js +0 -34
- package/dist/loop/run-to-terminal.d.ts +0 -66
- package/dist/loop/run-to-terminal.js +0 -93
- package/dist/loop/tool-mask.d.ts +0 -23
- package/dist/loop/tool-mask.js +0 -46
- package/dist/providers/streaming-chat.d.ts +0 -32
- package/dist/providers/streaming-chat.js +0 -91
- package/dist/tasks/derive-table-exec.d.ts +0 -54
- package/dist/tasks/derive-table-exec.js +0 -86
- package/dist/workflows/suspension.d.ts +0 -32
- package/dist/workflows/suspension.js +0 -38
|
@@ -0,0 +1,364 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The adapter from a harness `Tool` to an AI SDK tool.
|
|
3
|
+
*
|
|
4
|
+
* Each call runs as one durable step inside a workflow (`durableTools`), and
|
|
5
|
+
* directly outside one. The step output is one plain JSON value, the
|
|
6
|
+
* `ToolCallOutput`: the outcome of the call, its value or its excerpt, the
|
|
7
|
+
* call record, and the pictures. Thus a replay gets back each fact that the
|
|
8
|
+
* loop reads later, and the tool body does not run again.
|
|
9
|
+
*
|
|
10
|
+
* The adapter never throws for a failed call: the failure becomes an error
|
|
11
|
+
* output that the model reads. Only a fatal error leaves the call, for example
|
|
12
|
+
* the cancel of the workflow, and the loop then ends the run with it.
|
|
13
|
+
*
|
|
14
|
+
* The model reads the view that `toModelOutput` builds from the output. It never
|
|
15
|
+
* reads the call record.
|
|
16
|
+
*/
|
|
17
|
+
import { durableTools } from "@dbos-inc/vercel-ai";
|
|
18
|
+
import { jsonSchema, tool as aiTool } from "ai";
|
|
19
|
+
import { z } from "zod";
|
|
20
|
+
import { stripNulCharacters } from "../input-sanitization.js";
|
|
21
|
+
import { ResultError } from "../lib/result.js";
|
|
22
|
+
import { errorMessageOf, errorNameOf, errorOf } from "../lib/thrown.js";
|
|
23
|
+
import { textOf } from "../lib/unknown-text.js";
|
|
24
|
+
import { describeZodIssueShapes } from "../lib/zod-issue-shape.js";
|
|
25
|
+
import { hintForZodIssue, repairToolInput } from "../lib/zod-issues.js";
|
|
26
|
+
import { classifyProviderError } from "../providers/errors.js";
|
|
27
|
+
import { isWorkflowCancellation } from "../runtime/dbos.js";
|
|
28
|
+
import { isToolError, readToolCallRecord, readToolResultImages, } from "../tools/define-tool.js";
|
|
29
|
+
import { recordKeyFor } from "./accounting.js";
|
|
30
|
+
import { computeDetail, computeResultDetail } from "./tool-detail.js";
|
|
31
|
+
import { excerptOf, keptTextOf, TOOL_RESULT_CAP, toolOutputRef } from "./tool-output.js";
|
|
32
|
+
const ToolResultImageSchema = z.object({ base64: z.string(), mediaType: z.string() });
|
|
33
|
+
const JsonSchema = z.json();
|
|
34
|
+
/**
|
|
35
|
+
* The output of one tool call, as its step records it.
|
|
36
|
+
*
|
|
37
|
+
* - `ok`: the value that the tool gave, or the excerpt of a value longer than
|
|
38
|
+
* the cap. A cut value keeps only its excerpt. `record` is the call record,
|
|
39
|
+
* and `images` are the pictures that the wire of the run carries.
|
|
40
|
+
* - `error`: the text that the model reads, already cut when it is long.
|
|
41
|
+
* - `denied`: the user rejected the approval that the tool asked for.
|
|
42
|
+
*/
|
|
43
|
+
export const ToolCallOutputSchema = z.discriminatedUnion("outcome", [
|
|
44
|
+
z.object({
|
|
45
|
+
outcome: z.literal("ok"),
|
|
46
|
+
value: JsonSchema.optional(),
|
|
47
|
+
excerpt: z.string().optional(),
|
|
48
|
+
record: JsonSchema.optional(),
|
|
49
|
+
images: z.array(ToolResultImageSchema).optional(),
|
|
50
|
+
}),
|
|
51
|
+
z.object({ outcome: z.literal("error"), text: z.string() }),
|
|
52
|
+
z.object({ outcome: z.literal("denied"), reason: z.string() }),
|
|
53
|
+
]);
|
|
54
|
+
/**
|
|
55
|
+
* The input of a recorded call as the call itself read it. A stringified
|
|
56
|
+
* argument gets the repair of the call, thus a selector of the outcome reads
|
|
57
|
+
* the value that the tool checked.
|
|
58
|
+
*/
|
|
59
|
+
export function recordedInputOf(schema, raw) {
|
|
60
|
+
const parsed = schema.safeParse(raw);
|
|
61
|
+
if (parsed.success)
|
|
62
|
+
return parsed.data;
|
|
63
|
+
const repaired = schema.safeParse(repairToolInput(raw, parsed.error));
|
|
64
|
+
return repaired.success ? repaired.data : undefined;
|
|
65
|
+
}
|
|
66
|
+
/** A cancel of the run or of its workflow is control flow, never a result that the model reads. */
|
|
67
|
+
export function isFatalToolError(err) {
|
|
68
|
+
return errorNameOf(err) === "AbortError" || isWorkflowCancellation(err);
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* The AI SDK tools of a run. Inside a workflow each call is a durable step
|
|
72
|
+
* named `<tool>.<toolCallId>`. A throw from a call is fatal by construction,
|
|
73
|
+
* because the adapter turns each other failure into an output.
|
|
74
|
+
*/
|
|
75
|
+
export function adaptTools(tools, run) {
|
|
76
|
+
const set = {};
|
|
77
|
+
for (const harnessTool of tools) {
|
|
78
|
+
set[harnessTool.id] = aiTool({
|
|
79
|
+
description: harnessTool.description,
|
|
80
|
+
// No validation here: the call validates its input, thus a failure keeps
|
|
81
|
+
// the repair of a stringified argument and the hints of the harness.
|
|
82
|
+
inputSchema: jsonSchema(harnessTool.jsonSchema),
|
|
83
|
+
execute: (input, options) => runToolCall(harnessTool, input, options, run),
|
|
84
|
+
toModelOutput: ({ output }) => modelViewOf(output),
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
// A call that starts a child workflow runs in the body, because a step cannot start a workflow.
|
|
88
|
+
const inBody = Object.fromEntries(tools.filter((tool) => tool.startsWorkflow === true).map((tool) => [tool.id, false]));
|
|
89
|
+
const durable = durableTools(set, { tools: inBody, writer: run.writer });
|
|
90
|
+
const guarded = {};
|
|
91
|
+
for (const [name, definition] of Object.entries(durable)) {
|
|
92
|
+
const execute = definition.execute;
|
|
93
|
+
if (execute === undefined) {
|
|
94
|
+
guarded[name] = definition;
|
|
95
|
+
continue;
|
|
96
|
+
}
|
|
97
|
+
guarded[name] = {
|
|
98
|
+
...definition,
|
|
99
|
+
execute: async (input, options) => {
|
|
100
|
+
try {
|
|
101
|
+
return await execute(input, options);
|
|
102
|
+
}
|
|
103
|
+
catch (err) {
|
|
104
|
+
run.fail(err);
|
|
105
|
+
throw err;
|
|
106
|
+
}
|
|
107
|
+
},
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
return guarded;
|
|
111
|
+
}
|
|
112
|
+
/** What the model reads of one output. */
|
|
113
|
+
export function modelViewOf(output) {
|
|
114
|
+
switch (output.outcome) {
|
|
115
|
+
case "ok": {
|
|
116
|
+
const images = output.images ?? [];
|
|
117
|
+
if (images.length > 0) {
|
|
118
|
+
return {
|
|
119
|
+
type: "content",
|
|
120
|
+
value: [
|
|
121
|
+
{ type: "text", text: output.excerpt ?? JSON.stringify(output.value ?? null) },
|
|
122
|
+
...images.map((image) => ({ type: "file", mediaType: image.mediaType, data: { type: "data", data: image.base64 } })),
|
|
123
|
+
],
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
return output.excerpt === undefined ? { type: "json", value: output.value ?? null } : { type: "text", value: output.excerpt };
|
|
127
|
+
}
|
|
128
|
+
case "error":
|
|
129
|
+
return { type: "error-text", value: output.text };
|
|
130
|
+
case "denied":
|
|
131
|
+
return { type: "execution-denied", reason: output.reason };
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
/** The outcome that an event and a counter report for one output. */
|
|
135
|
+
export function outcomeOf(output) {
|
|
136
|
+
return output.outcome;
|
|
137
|
+
}
|
|
138
|
+
/** Hand the call record of each output to its tool, in the order of the calls. A throw is logged, because the call has settled already. */
|
|
139
|
+
export function foldCallRecords(tools, calls, log) {
|
|
140
|
+
const byId = new Map(tools.map((t) => [t.id, t]));
|
|
141
|
+
for (const call of calls) {
|
|
142
|
+
const output = call.output;
|
|
143
|
+
if (output?.outcome !== "ok" || output.record === undefined)
|
|
144
|
+
continue;
|
|
145
|
+
const tool = byId.get(call.toolName);
|
|
146
|
+
if (tool?.foldCallRecord === undefined)
|
|
147
|
+
continue;
|
|
148
|
+
try {
|
|
149
|
+
tool.foldCallRecord(output.record);
|
|
150
|
+
}
|
|
151
|
+
catch (err) {
|
|
152
|
+
log.error("a tool call record did not fold", { tool: tool.id, toolCallId: call.toolCallId, ...log.errorFields(err) });
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
async function runToolCall(tool, input, options, run) {
|
|
157
|
+
const startedAt = performance.now();
|
|
158
|
+
const { toolCallId } = options;
|
|
159
|
+
const detail = computeDetail(tool, input, run.log);
|
|
160
|
+
// The emit and the call start before the first await: a call that runs in the body of a workflow takes its
|
|
161
|
+
// function ids in the order of the calls, thus a replay gives each call its own child.
|
|
162
|
+
const started = run.emit({ type: "tool-started", source: run.source, toolUseId: toolCallId, name: tool.id, input, ...detailField(detail) });
|
|
163
|
+
const ctx = {
|
|
164
|
+
invocationId: toolCallId,
|
|
165
|
+
session: run.session,
|
|
166
|
+
signal: options.abortSignal ?? new AbortController().signal,
|
|
167
|
+
emit: run.emit,
|
|
168
|
+
turnUsage: run.turnUsage,
|
|
169
|
+
};
|
|
170
|
+
// One wait reads the two, thus a failed emit leaves no rejection of the call unread.
|
|
171
|
+
const [, settled] = await Promise.all([started, settleCall(tool, input, ctx, run)]);
|
|
172
|
+
const output = await cutLongOutput(settled.output, tool.id, toolCallId, run);
|
|
173
|
+
await run.emit({
|
|
174
|
+
type: "tool-finished",
|
|
175
|
+
source: run.source,
|
|
176
|
+
toolUseId: toolCallId,
|
|
177
|
+
name: tool.id,
|
|
178
|
+
outcome: output.outcome,
|
|
179
|
+
...detailField(settled.detail ?? detail),
|
|
180
|
+
durationMs: Math.round(performance.now() - startedAt),
|
|
181
|
+
});
|
|
182
|
+
return output;
|
|
183
|
+
}
|
|
184
|
+
async function settleCall(tool, input, ctx, run) {
|
|
185
|
+
const parsed = tool.inputSchema.safeParse(input);
|
|
186
|
+
let data;
|
|
187
|
+
if (parsed.success) {
|
|
188
|
+
data = parsed.data;
|
|
189
|
+
}
|
|
190
|
+
else {
|
|
191
|
+
// A complete JSON argument can arrive as a string behind function-call
|
|
192
|
+
// markup or a code fence. Repair only makes the schema reachable — the
|
|
193
|
+
// repaired value is validated in full, and the tool's own semantic checks
|
|
194
|
+
// still run, so nothing here weakens validation.
|
|
195
|
+
const repairedInput = repairToolInput(input, parsed.error);
|
|
196
|
+
const repaired = repairedInput === undefined ? undefined : tool.inputSchema.safeParse(repairedInput);
|
|
197
|
+
if (repaired?.success !== true) {
|
|
198
|
+
// The Zod text can quote the input, thus the log gets only the shape of the failure.
|
|
199
|
+
run.log.warn("tool call rejected", { tool: tool.id, toolCallId: ctx.invocationId, issues: describeZodIssueShapes(parsed.error, tool.inputSchema) });
|
|
200
|
+
return { output: errorOutput(`input validation failed: ${formatZodIssues(parsed.error, input)}`) };
|
|
201
|
+
}
|
|
202
|
+
data = repaired.data;
|
|
203
|
+
}
|
|
204
|
+
try {
|
|
205
|
+
const result = await tool.execute(data, ctx);
|
|
206
|
+
if (result.isErr()) {
|
|
207
|
+
logToolFailure(tool, ctx.invocationId, result.error, run.log);
|
|
208
|
+
return { output: errorOutput(toolErrorContent(result.error)) };
|
|
209
|
+
}
|
|
210
|
+
// The one place a result description runs: the ok value in hand, the
|
|
211
|
+
// input already validated, and the guard inside the compute.
|
|
212
|
+
return { output: okOutput(tool.id, result.value, run), detail: computeResultDetail(tool, data, result.value, run.log) };
|
|
213
|
+
}
|
|
214
|
+
catch (err) {
|
|
215
|
+
if (isFatalToolError(err))
|
|
216
|
+
throw err;
|
|
217
|
+
logToolFailure(tool, ctx.invocationId, err, run.log);
|
|
218
|
+
return { output: errorOutput(toolErrorContent(err)) };
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* The ok output of a value. The JSON data loses each NUL, and the pictures leave
|
|
223
|
+
* it. A wire that carries no picture in a tool result gets the text alone, and
|
|
224
|
+
* one warn with the count rides the log: base64 text floods the context, and the
|
|
225
|
+
* model cannot see it.
|
|
226
|
+
*/
|
|
227
|
+
function okOutput(toolId, value, run) {
|
|
228
|
+
const output = {
|
|
229
|
+
outcome: "ok",
|
|
230
|
+
value: jsonValue(value),
|
|
231
|
+
};
|
|
232
|
+
const record = readToolCallRecord(value);
|
|
233
|
+
// The record crosses the step cache, thus the contract of a call record is plain JSON.
|
|
234
|
+
if (record !== undefined)
|
|
235
|
+
output.record = jsonValue(record);
|
|
236
|
+
const images = readToolResultImages(value);
|
|
237
|
+
if (images.length > 0) {
|
|
238
|
+
if (run.capabilities.imageToolResults === true) {
|
|
239
|
+
output.images = images.map((image) => ({ base64: image.base64, mediaType: image.mediaType }));
|
|
240
|
+
}
|
|
241
|
+
else {
|
|
242
|
+
run.log.warn("the wired provider carries no picture in a tool result, thus the pictures are dropped", {
|
|
243
|
+
toolName: toolId,
|
|
244
|
+
imageCount: images.length,
|
|
245
|
+
});
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
return output;
|
|
249
|
+
}
|
|
250
|
+
function errorOutput(text) {
|
|
251
|
+
// A thrown tool error routinely quotes stderr verbatim — as exposed to NUL as a success payload.
|
|
252
|
+
return { outcome: "error", text: stripNulCharacters(text) };
|
|
253
|
+
}
|
|
254
|
+
/**
|
|
255
|
+
* The output with an excerpt in place of a text longer than the cap. The text
|
|
256
|
+
* is kept first under a reference that a rerun of the call gives again, and the
|
|
257
|
+
* excerpt does not depend on the outcome of the put. Thus a rerun gives the
|
|
258
|
+
* same bytes.
|
|
259
|
+
*/
|
|
260
|
+
async function cutLongOutput(output, toolName, toolCallId, run) {
|
|
261
|
+
if (output.outcome === "denied")
|
|
262
|
+
return output;
|
|
263
|
+
const text = output.outcome === "ok" ? JSON.stringify(output.value ?? null) : output.text;
|
|
264
|
+
if (text.length <= TOOL_RESULT_CAP)
|
|
265
|
+
return output;
|
|
266
|
+
let kept;
|
|
267
|
+
if (run.store !== undefined) {
|
|
268
|
+
const { session } = run;
|
|
269
|
+
const ref = toolOutputRef(recordKeyFor(session, run.invocationId, toolCallId));
|
|
270
|
+
const content = keptTextOf(text);
|
|
271
|
+
// A run session carries the thread of the chat that started the run, but a run belongs to its analysis.
|
|
272
|
+
const threadId = session.runFrame === undefined ? session.scope.threadId : undefined;
|
|
273
|
+
const put = await run.store.put({
|
|
274
|
+
analysisId: session.scope.analysisId,
|
|
275
|
+
ref,
|
|
276
|
+
toolName,
|
|
277
|
+
toolCallId,
|
|
278
|
+
content,
|
|
279
|
+
totalLength: text.length,
|
|
280
|
+
threadId,
|
|
281
|
+
});
|
|
282
|
+
if (put.isErr())
|
|
283
|
+
run.log.warn("tool output not kept", { toolName, toolCallId, ref, errorType: put.error.type });
|
|
284
|
+
kept = { ref, keptLength: content.length };
|
|
285
|
+
}
|
|
286
|
+
const excerpt = excerptOf(text, kept);
|
|
287
|
+
if (output.outcome === "error")
|
|
288
|
+
return { outcome: "error", text: excerpt };
|
|
289
|
+
const cut = {
|
|
290
|
+
outcome: "ok",
|
|
291
|
+
excerpt,
|
|
292
|
+
};
|
|
293
|
+
if (output.record !== undefined)
|
|
294
|
+
cut.record = output.record;
|
|
295
|
+
if (output.images !== undefined)
|
|
296
|
+
cut.images = output.images;
|
|
297
|
+
return cut;
|
|
298
|
+
}
|
|
299
|
+
/**
|
|
300
|
+
* Log a tool failure. A `ToolError` is a failure that the tool modeled, thus its
|
|
301
|
+
* own text is the account. Any other `Error` is a fault that the tool did not
|
|
302
|
+
* model, and the log gets one warn.
|
|
303
|
+
*/
|
|
304
|
+
function logToolFailure(tool, toolCallId, failure, log) {
|
|
305
|
+
if (modeledToolError(failure) !== undefined)
|
|
306
|
+
return;
|
|
307
|
+
const failureError = errorOf(failure);
|
|
308
|
+
if (failureError !== undefined)
|
|
309
|
+
log.warn("tool call threw", { tool: tool.id, toolCallId, ...log.errorFields(failureError) });
|
|
310
|
+
}
|
|
311
|
+
/** The `ToolError` of a failure: the value itself, or the value that `unwrapOrThrow` wrapped in a `ResultError`. */
|
|
312
|
+
function modeledToolError(failure) {
|
|
313
|
+
if (isToolError(failure))
|
|
314
|
+
return failure;
|
|
315
|
+
return failure instanceof ResultError && isToolError(failure.value) ? failure.value : undefined;
|
|
316
|
+
}
|
|
317
|
+
/**
|
|
318
|
+
* Normalize a tool's return value to plain JSON, stripping NUL from every string
|
|
319
|
+
* it holds. The reviver sees values, not keys — a NUL in an object KEY would
|
|
320
|
+
* still reach the row, but keys come from tool result types rather than scanned
|
|
321
|
+
* bytes, so nothing produces one.
|
|
322
|
+
*/
|
|
323
|
+
function jsonValue(value) {
|
|
324
|
+
// The stringify/parse round trip holds only JSON values, so the parse never
|
|
325
|
+
// refuses; it moves the parser's `any` out of the tool-result field.
|
|
326
|
+
// oxlint-disable-next-line eslint-js/no-restricted-syntax -- the NUL-stripping reviver walks a value this code serialized one line above, not text of unknown shape; a schema proves nothing here.
|
|
327
|
+
const serialized = JSON.parse(JSON.stringify(value ?? null), (_key, v) => (typeof v === "string" ? stripNulCharacters(v) : v));
|
|
328
|
+
return JsonSchema.parse(serialized);
|
|
329
|
+
}
|
|
330
|
+
// NUL is stripped from the prose BEFORE it is serialized: past the stringify it
|
|
331
|
+
// is the six-character escape \u0000 — legitimate JSON text, and no longer
|
|
332
|
+
// distinguishable from an error that happens to quote that escape.
|
|
333
|
+
function toolErrorContent(value) {
|
|
334
|
+
const toolError = modeledToolError(value);
|
|
335
|
+
if (toolError !== undefined) {
|
|
336
|
+
return JSON.stringify({ error: stripNulCharacters(toolError.error), retryable: toolError.retryable });
|
|
337
|
+
}
|
|
338
|
+
const { retryable } = classifyProviderError(value);
|
|
339
|
+
const error = stripNulCharacters(errorMessageOf(value) ?? textOf(value));
|
|
340
|
+
return JSON.stringify({ error, retryable });
|
|
341
|
+
}
|
|
342
|
+
/** The prose of a rejected approval is the only account that the model gets of the denial. */
|
|
343
|
+
export function deniedReason(feedback) {
|
|
344
|
+
return feedback === undefined || feedback.length === 0
|
|
345
|
+
? "The user rejected this action."
|
|
346
|
+
: `The user rejected this action with the following feedback: ${feedback}`;
|
|
347
|
+
}
|
|
348
|
+
/**
|
|
349
|
+
* The optional `detail` field, present only when there is one. Spread rather
|
|
350
|
+
* than assigned so an undescribed call emits an event with no `detail` key at
|
|
351
|
+
* all, which is what the contract promises: absent, never empty.
|
|
352
|
+
*/
|
|
353
|
+
function detailField(detail) {
|
|
354
|
+
return detail === undefined ? {} : { detail };
|
|
355
|
+
}
|
|
356
|
+
function formatZodIssues(error, input) {
|
|
357
|
+
return error.issues
|
|
358
|
+
.map((issue) => {
|
|
359
|
+
const path = issue.path.length > 0 ? issue.path.join(".") : "(root)";
|
|
360
|
+
const hint = hintForZodIssue(issue, input);
|
|
361
|
+
return hint === undefined ? `${path}: ${issue.message}` : `${path}: ${issue.message} — ${hint}`;
|
|
362
|
+
})
|
|
363
|
+
.join("; ");
|
|
364
|
+
}
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
import type { ToolCallDetail } from "../contracts/chat-events.js";
|
|
20
20
|
import type { Logger } from "../lib/logger.js";
|
|
21
21
|
import type { Tool } from "../tools/define-tool.js";
|
|
22
|
-
export type { ToolCallDetail };
|
|
22
|
+
export type { ToolCallDetail } from "../contracts/chat-events.js";
|
|
23
23
|
/**
|
|
24
24
|
* The length cap, in characters. A full workspace path with a line range fits
|
|
25
25
|
* comfortably; a `write_file` content field does not, which is the point — a
|
package/dist/loop/tool-detail.js
CHANGED
|
@@ -17,6 +17,7 @@
|
|
|
17
17
|
* the length cap slightly wrong. Here it is one auditable path.
|
|
18
18
|
*/
|
|
19
19
|
import { normalizeUnicode, redactSecrets } from "../input-sanitization.js";
|
|
20
|
+
import { collapseWhitespace } from "../lib/text.js";
|
|
20
21
|
/**
|
|
21
22
|
* The length cap, in characters. A full workspace path with a line range fits
|
|
22
23
|
* comfortably; a `write_file` content field does not, which is the point — a
|
|
@@ -88,7 +89,7 @@ export function normalizeDetail(raw) {
|
|
|
88
89
|
// `normalizeUnicode` leaves tab, newline and carriage return in place (they
|
|
89
90
|
// are legitimate whitespace in prose); the collapse below is what turns them
|
|
90
91
|
// into the single line this contract promises.
|
|
91
|
-
const oneLine = normalizeUnicode(raw)
|
|
92
|
+
const oneLine = collapseWhitespace(normalizeUnicode(raw));
|
|
92
93
|
if (oneLine.length === 0)
|
|
93
94
|
return undefined;
|
|
94
95
|
const capped = capCodePoints(redactSecrets(oneLine), DETAIL_MAX_LENGTH);
|
|
@@ -112,9 +113,9 @@ export function computeDetail(tool, rawInput, log) {
|
|
|
112
113
|
// an open list — an embedder contributes its own through the host-tools seam —
|
|
113
114
|
// so a `describeCall` that is not callable is reachable. Such a tool counts as
|
|
114
115
|
// undescribed, because the alternative is a TypeError on every one of its calls.
|
|
115
|
-
|
|
116
|
-
if (typeof describeCall !== "function")
|
|
116
|
+
if (typeof tool.describeCall !== "function")
|
|
117
117
|
return undefined;
|
|
118
|
+
const describeCall = tool.describeCall.bind(tool);
|
|
118
119
|
try {
|
|
119
120
|
// The parse is INSIDE the guard, not before it. `safeParse` returns an
|
|
120
121
|
// error for a rejected value but THROWS for a schema it cannot run
|
|
@@ -155,9 +156,9 @@ export function computeResultDetail(tool, parsedInput, result, log) {
|
|
|
155
156
|
// The guard tests for a function, not for presence, for the same reason as in
|
|
156
157
|
// `computeDetail`: a packaged tool comes from an open list, thus a
|
|
157
158
|
// `describeResult` that is not callable is reachable.
|
|
158
|
-
|
|
159
|
-
if (typeof describeResult !== "function")
|
|
159
|
+
if (typeof tool.describeResult !== "function")
|
|
160
160
|
return undefined;
|
|
161
|
+
const describeResult = tool.describeResult.bind(tool);
|
|
161
162
|
try {
|
|
162
163
|
return normalizeDetail(describeResult(parsedInput, result));
|
|
163
164
|
}
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
* reporting success for every call because it never looked at the result at all.
|
|
10
10
|
*/
|
|
11
11
|
import type { ToolOutcome } from "../contracts/chat-events.js";
|
|
12
|
-
export type { ToolOutcome };
|
|
12
|
+
export type { ToolOutcome } from "../contracts/chat-events.js";
|
|
13
13
|
/**
|
|
14
14
|
* Classify a tool result's output type.
|
|
15
15
|
*
|
|
@@ -14,7 +14,7 @@ export declare const EXCERPT_TAIL_CHARS: number;
|
|
|
14
14
|
/** The bound of a file that `grep` reads, thus a pattern search over a kept text costs no more than a `grep`. */
|
|
15
15
|
export declare const TOOL_OUTPUT_KEEP_MAX: number;
|
|
16
16
|
export declare const READ_TOOL_OUTPUT_TOOL_ID = "read_tool_output";
|
|
17
|
-
export
|
|
17
|
+
export type KeptToolOutput = {
|
|
18
18
|
readonly analysisId: string;
|
|
19
19
|
readonly ref: string;
|
|
20
20
|
readonly toolName: string;
|
|
@@ -25,13 +25,13 @@ export interface KeptToolOutput {
|
|
|
25
25
|
readonly content: string;
|
|
26
26
|
/** The length of the whole text of the result. */
|
|
27
27
|
readonly totalLength: number;
|
|
28
|
-
}
|
|
28
|
+
};
|
|
29
29
|
/** Keeps the text of each cut tool result for `read_tool_output`. */
|
|
30
|
-
export
|
|
30
|
+
export type ToolOutputStore = {
|
|
31
31
|
/** A second put of the same analysis id and reference replaces the text. */
|
|
32
32
|
put(output: KeptToolOutput): ResultAsync<void, DomainError>;
|
|
33
33
|
get(analysisId: string, ref: string): ResultAsync<KeptToolOutput | null, DomainError>;
|
|
34
|
-
}
|
|
34
|
+
};
|
|
35
35
|
/** The reference of one kept text. It is short, because the model copies it. */
|
|
36
36
|
export declare function toolOutputRef(key: string): string;
|
|
37
37
|
/** The text that the model reads for a result, or `undefined` for a denial, which is never cut. */
|
package/dist/loop/tool-output.js
CHANGED
|
@@ -26,7 +26,7 @@ export function resultTextOf(output) {
|
|
|
26
26
|
case "error-text":
|
|
27
27
|
return output.value;
|
|
28
28
|
case "content":
|
|
29
|
-
return output.value.map((part) => (
|
|
29
|
+
return output.value.map((part) => ("text" in part ? part.text : "")).join("");
|
|
30
30
|
case "execution-denied":
|
|
31
31
|
return undefined;
|
|
32
32
|
}
|
|
@@ -72,7 +72,7 @@ export function withExcerpt(part, excerpt) {
|
|
|
72
72
|
case "error-text":
|
|
73
73
|
return { ...part, output: { type: "error-text", value: excerpt } };
|
|
74
74
|
case "content":
|
|
75
|
-
return { ...part, output: { type: "content", value: [{ type: "text", text: excerpt }, ...output.value.filter((p) =>
|
|
75
|
+
return { ...part, output: { type: "content", value: [{ type: "text", text: excerpt }, ...output.value.filter((p) => !("text" in p))] } };
|
|
76
76
|
case "execution-denied":
|
|
77
77
|
return part;
|
|
78
78
|
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The live credential of each chat turn of this process.
|
|
3
|
+
*
|
|
4
|
+
* A chat turn stores no credential in its workflow. The open of a turn puts the
|
|
5
|
+
* credential of the request here, and the end of the turn takes it away. A turn
|
|
6
|
+
* that a recovery runs in a new process finds no entry, thus the function of
|
|
7
|
+
* the host gives its credential, or nothing. A sub-agent of a turn asks for the
|
|
8
|
+
* credential of its root turn, which it knows from the context of its body.
|
|
9
|
+
*/
|
|
10
|
+
import type { LanguageModelMiddleware } from "ai";
|
|
11
|
+
import type { AuthContext } from "../auth/types.js";
|
|
12
|
+
export declare const turnCredentials: {
|
|
13
|
+
put(turnId: string, auth: AuthContext): void;
|
|
14
|
+
drop(turnId: string): void;
|
|
15
|
+
/** The credential of a turn: the live one of this process, else the one that the function of the host gives. */
|
|
16
|
+
of(turnId: string): AuthContext | undefined;
|
|
17
|
+
/** The function of the host for a turn that this process did not open. */
|
|
18
|
+
setHostCredential(credentialFor: ((turnId: string) => AuthContext | undefined) | undefined): void;
|
|
19
|
+
};
|
|
20
|
+
/**
|
|
21
|
+
* The `auth` of a session whose credential can come later: each read goes to `current`, and no credential reads as an
|
|
22
|
+
* empty object. A copy of the session keeps this object, thus each copy sees the credential that a resume puts.
|
|
23
|
+
*/
|
|
24
|
+
export declare function liveAuth(current: () => AuthContext | undefined): AuthContext;
|
|
25
|
+
/** Run the body of a turn, or of one of its sub-agents, with the id of its root turn in its context. */
|
|
26
|
+
export declare function withRootTurn<T>(turnId: string, body: () => Promise<T>): Promise<T>;
|
|
27
|
+
/** The id of the root chat turn of the body that runs, or `undefined` outside a chat turn. */
|
|
28
|
+
export declare function currentRootTurn(): string | undefined;
|
|
29
|
+
/** The error of a model call of a turn whose host gives no credential. The turn pauses on it with the cause `credential`. */
|
|
30
|
+
export declare class TurnCredentialMissingError extends Error {
|
|
31
|
+
constructor();
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* A middleware that fails each model call while `credentialOf` gives no credential. It runs inside the step of the
|
|
35
|
+
* call, thus a replay of a recorded call does not read the credential again.
|
|
36
|
+
*/
|
|
37
|
+
export declare function credentialGuard(credentialOf: () => AuthContext | undefined): LanguageModelMiddleware;
|
|
38
|
+
/** Whether an error, or an error on its cause chain, is a missing credential of a turn. A replay of a step gives the name again. */
|
|
39
|
+
export declare function isTurnCredentialMissing(err: unknown): boolean;
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The live credential of each chat turn of this process.
|
|
3
|
+
*
|
|
4
|
+
* A chat turn stores no credential in its workflow. The open of a turn puts the
|
|
5
|
+
* credential of the request here, and the end of the turn takes it away. A turn
|
|
6
|
+
* that a recovery runs in a new process finds no entry, thus the function of
|
|
7
|
+
* the host gives its credential, or nothing. A sub-agent of a turn asks for the
|
|
8
|
+
* credential of its root turn, which it knows from the context of its body.
|
|
9
|
+
*/
|
|
10
|
+
import { AsyncLocalStorage } from "node:async_hooks";
|
|
11
|
+
import { z } from "zod";
|
|
12
|
+
import { errorNameOf } from "../lib/thrown.js";
|
|
13
|
+
const credentials = new Map();
|
|
14
|
+
let hostCredential;
|
|
15
|
+
const rootTurn = new AsyncLocalStorage();
|
|
16
|
+
export const turnCredentials = {
|
|
17
|
+
put(turnId, auth) {
|
|
18
|
+
credentials.set(turnId, auth);
|
|
19
|
+
},
|
|
20
|
+
drop(turnId) {
|
|
21
|
+
credentials.delete(turnId);
|
|
22
|
+
},
|
|
23
|
+
/** The credential of a turn: the live one of this process, else the one that the function of the host gives. */
|
|
24
|
+
of(turnId) {
|
|
25
|
+
return credentials.get(turnId) ?? hostCredential?.(turnId);
|
|
26
|
+
},
|
|
27
|
+
/** The function of the host for a turn that this process did not open. */
|
|
28
|
+
setHostCredential(credentialFor) {
|
|
29
|
+
hostCredential = credentialFor;
|
|
30
|
+
},
|
|
31
|
+
};
|
|
32
|
+
/**
|
|
33
|
+
* The `auth` of a session whose credential can come later: each read goes to `current`, and no credential reads as an
|
|
34
|
+
* empty object. A copy of the session keeps this object, thus each copy sees the credential that a resume puts.
|
|
35
|
+
*/
|
|
36
|
+
export function liveAuth(current) {
|
|
37
|
+
const credential = () => current() ?? {};
|
|
38
|
+
return new Proxy({}, {
|
|
39
|
+
get: (_shell, key) => Reflect.get(credential(), key),
|
|
40
|
+
has: (_shell, key) => Reflect.has(credential(), key),
|
|
41
|
+
ownKeys: () => Reflect.ownKeys(credential()),
|
|
42
|
+
getOwnPropertyDescriptor: (_shell, key) => {
|
|
43
|
+
const descriptor = Reflect.getOwnPropertyDescriptor(credential(), key);
|
|
44
|
+
// A proxy can report a key that its shell does not hold only as configurable.
|
|
45
|
+
return descriptor === undefined ? undefined : { ...descriptor, configurable: true };
|
|
46
|
+
},
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
/** Run the body of a turn, or of one of its sub-agents, with the id of its root turn in its context. */
|
|
50
|
+
export function withRootTurn(turnId, body) {
|
|
51
|
+
return rootTurn.run(turnId, body);
|
|
52
|
+
}
|
|
53
|
+
/** The id of the root chat turn of the body that runs, or `undefined` outside a chat turn. */
|
|
54
|
+
export function currentRootTurn() {
|
|
55
|
+
return rootTurn.getStore();
|
|
56
|
+
}
|
|
57
|
+
/** The error of a model call of a turn whose host gives no credential. The turn pauses on it with the cause `credential`. */
|
|
58
|
+
export class TurnCredentialMissingError extends Error {
|
|
59
|
+
constructor() {
|
|
60
|
+
super("The turn has no credential of its user.");
|
|
61
|
+
this.name = "TurnCredentialMissingError";
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* A middleware that fails each model call while `credentialOf` gives no credential. It runs inside the step of the
|
|
66
|
+
* call, thus a replay of a recorded call does not read the credential again.
|
|
67
|
+
*/
|
|
68
|
+
export function credentialGuard(credentialOf) {
|
|
69
|
+
const missing = () => credentialOf() === undefined;
|
|
70
|
+
return {
|
|
71
|
+
specificationVersion: "v4",
|
|
72
|
+
wrapStream: ({ doStream }) => (missing() ? Promise.reject(new TurnCredentialMissingError()) : doStream()),
|
|
73
|
+
wrapGenerate: ({ doGenerate }) => (missing() ? Promise.reject(new TurnCredentialMissingError()) : doGenerate()),
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
/** A link of the chain whose cause is an error. The error of a missing credential is an `Error`, thus the walk follows errors only. */
|
|
77
|
+
const CauseLinkSchema = z.looseObject({ cause: z.instanceof(Error) });
|
|
78
|
+
/** The depth of a cause chain that the walk reads, as a bound for a chain with a cycle. */
|
|
79
|
+
const CAUSE_CHAIN_DEPTH = 8;
|
|
80
|
+
/** Whether an error, or an error on its cause chain, is a missing credential of a turn. A replay of a step gives the name again. */
|
|
81
|
+
export function isTurnCredentialMissing(err) {
|
|
82
|
+
let link = err;
|
|
83
|
+
for (let depth = 0; depth < CAUSE_CHAIN_DEPTH && link !== undefined; depth++) {
|
|
84
|
+
if (errorNameOf(link) === "TurnCredentialMissingError")
|
|
85
|
+
return true;
|
|
86
|
+
const next = CauseLinkSchema.safeParse(link);
|
|
87
|
+
link = next.success ? next.data.cause : undefined;
|
|
88
|
+
}
|
|
89
|
+
return false;
|
|
90
|
+
}
|