@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,237 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The durable stream of a chat turn, and of each sub-agent of the turn.
|
|
3
|
+
*
|
|
4
|
+
* The turn writes to the stream of its workflow with the writer of
|
|
5
|
+
* `@dbos-inc/vercel-ai`: each model call writes its text from inside its step,
|
|
6
|
+
* and the harness writes each of its own frames as one `data-harness-frame`
|
|
7
|
+
* chunk. The reader converts the chunks to the `ChatFrame`s that a host gives
|
|
8
|
+
* its client. A model record also holds the input of each tool call, and the
|
|
9
|
+
* converter drops it, thus a client gets the frames of an in-process turn.
|
|
10
|
+
*/
|
|
11
|
+
import { setTimeout as sleep } from "node:timers/promises";
|
|
12
|
+
import { DBOS } from "@dbos-inc/dbos-sdk";
|
|
13
|
+
import { functionIDGetIncrement, getCurrentContextStore } from "@dbos-inc/dbos-sdk/internal/context";
|
|
14
|
+
import { readDurableStream, toolWriter, writeDurableStream } from "@dbos-inc/vercel-ai";
|
|
15
|
+
import { z } from "zod";
|
|
16
|
+
import { checkChatPart, isRootFrame, toChatFrame } from "../contracts/chat-frame.js";
|
|
17
|
+
import { isKnownPartType, PART_REGISTRY } from "../contracts/part-registry.js";
|
|
18
|
+
import { ChatEventSchema } from "../contracts/schemas/chat-events.js";
|
|
19
|
+
/** The key of the durable stream of a chat turn. */
|
|
20
|
+
export const CHAT_STREAM_KEY = "chat";
|
|
21
|
+
/** The data part that names the child workflow of a sub-agent call in the stream of its caller. */
|
|
22
|
+
export const SUB_AGENT_STREAM_PART = "data-subagent-stream";
|
|
23
|
+
const SubAgentStreamFrameSchema = z.object({ type: z.literal(SUB_AGENT_STREAM_PART), workflowId: z.string() });
|
|
24
|
+
const HARNESS_FRAME_CHUNK = "data-harness-frame";
|
|
25
|
+
/** The source of a frame that comes before the first frame of the harness. A turn writes no such frame. */
|
|
26
|
+
const UNKNOWN_SOURCE = { agentId: "", callPath: [] };
|
|
27
|
+
const HarnessFrameChunkSchema = z.object({
|
|
28
|
+
type: z.literal(HARNESS_FRAME_CHUNK),
|
|
29
|
+
data: z.looseObject({ type: z.string() }),
|
|
30
|
+
});
|
|
31
|
+
/** The chunk that carries one frame of the harness in the stream of a turn. A transient chunk is live only. */
|
|
32
|
+
export function chunkOfFrame(frame, transient = false) {
|
|
33
|
+
return transient ? { type: HARNESS_FRAME_CHUNK, data: frame, transient: true } : { type: HARNESS_FRAME_CHUNK, data: frame };
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Whether a frame from a tool step shows progress only. The library gives such a frame live, and a replay of the
|
|
37
|
+
* step does not give it again. Each other frame of a tool step is checkpointed with the step, and the display of a
|
|
38
|
+
* round that a recovery stores keeps it: the end of each call, and each part of the root agent.
|
|
39
|
+
*/
|
|
40
|
+
function isProgressFrame(frame) {
|
|
41
|
+
if (!isRootFrame(frame) || frame.type === "tool-started" || frame.type === "iteration")
|
|
42
|
+
return true;
|
|
43
|
+
return isKnownPartType(frame.type) && PART_REGISTRY[frame.type].transient;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Run each body write of one workflow after the body write before it ends.
|
|
47
|
+
*
|
|
48
|
+
* DBOS gives a stream write its offset inside the insert, thus two writes in flight take the same offset, and the
|
|
49
|
+
* write that loses sleeps 100 ms before it tries again. A body write must still take its function id at the call,
|
|
50
|
+
* because a replay finds each checkpoint by the order of the calls. Thus the call reserves its id now, and the
|
|
51
|
+
* chained write takes the reserved id from the context of the workflow when it starts.
|
|
52
|
+
*/
|
|
53
|
+
function chainBodyWrites() {
|
|
54
|
+
let tail = Promise.resolve();
|
|
55
|
+
return (start) => {
|
|
56
|
+
const ctx = getCurrentContextStore();
|
|
57
|
+
if (ctx === undefined || !DBOS.isInWorkflow() || DBOS.isInStep())
|
|
58
|
+
return start();
|
|
59
|
+
const reserved = functionIDGetIncrement();
|
|
60
|
+
const run = () => {
|
|
61
|
+
// A continuation keeps the async context of its call, thus DBOS reads the id from this same context.
|
|
62
|
+
if (getCurrentContextStore() !== ctx)
|
|
63
|
+
throw new Error("A chained stream write lost the context of its workflow.");
|
|
64
|
+
const next = ctx.curWFFunctionId;
|
|
65
|
+
ctx.curWFFunctionId = reserved;
|
|
66
|
+
try {
|
|
67
|
+
// DBOS takes the function id before its first await, thus the swap ends before any other call can read it.
|
|
68
|
+
return start();
|
|
69
|
+
}
|
|
70
|
+
finally {
|
|
71
|
+
ctx.curWFFunctionId = next;
|
|
72
|
+
}
|
|
73
|
+
};
|
|
74
|
+
const write = tail.then(run, run);
|
|
75
|
+
tail = write.then(() => undefined, () => undefined);
|
|
76
|
+
return write;
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* The writer of the stream of a turn workflow. `observe` gets each frame of the turn that goes to the stream: the
|
|
81
|
+
* frames of the body, and the frames of each tool step, the frames that a replay of a step gives again included.
|
|
82
|
+
*
|
|
83
|
+
* From the body a write is checkpointed, thus a replay writes nothing again. From a step a write is at-least-once,
|
|
84
|
+
* and a fold of the frames by the id of a tool call or a part makes a second copy harmless.
|
|
85
|
+
*/
|
|
86
|
+
export function createTurnStreamWriter(rootSource, observe) {
|
|
87
|
+
const pending = [];
|
|
88
|
+
const chained = chainBodyWrites();
|
|
89
|
+
const track = (write) => {
|
|
90
|
+
// Observed now, thus a failure before the settle is not an unhandled rejection. The settle still sees it.
|
|
91
|
+
write.catch(() => undefined);
|
|
92
|
+
pending.push(write);
|
|
93
|
+
};
|
|
94
|
+
const writer = {
|
|
95
|
+
write(chunk) {
|
|
96
|
+
const frame = harnessFrameOf(chunk);
|
|
97
|
+
if (frame !== undefined)
|
|
98
|
+
observe(frame);
|
|
99
|
+
track(chained(() => writeDurableStream(CHAT_STREAM_KEY, [chunk])));
|
|
100
|
+
},
|
|
101
|
+
merge(stream) {
|
|
102
|
+
track((async () => {
|
|
103
|
+
for await (const chunk of stream)
|
|
104
|
+
writer.write(chunk);
|
|
105
|
+
})());
|
|
106
|
+
},
|
|
107
|
+
onError: undefined,
|
|
108
|
+
};
|
|
109
|
+
const write = async (frame) => {
|
|
110
|
+
observe(frame);
|
|
111
|
+
await chained(() => writeDurableStream(CHAT_STREAM_KEY, [chunkOfFrame(frame)]));
|
|
112
|
+
};
|
|
113
|
+
const emit = async (event) => {
|
|
114
|
+
const frame = toChatFrame(event, rootSource);
|
|
115
|
+
if (frame === null)
|
|
116
|
+
return;
|
|
117
|
+
// A tool step gives its frames to the library, which checkpoints each one that is not progress.
|
|
118
|
+
if (DBOS.isInStep()) {
|
|
119
|
+
toolWriter().write(chunkOfFrame(frame, isProgressFrame(frame)));
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
await write(frame);
|
|
123
|
+
};
|
|
124
|
+
return {
|
|
125
|
+
emit,
|
|
126
|
+
toolWriter: writer,
|
|
127
|
+
write,
|
|
128
|
+
async settle() {
|
|
129
|
+
while (pending.length > 0)
|
|
130
|
+
await Promise.all(pending.splice(0));
|
|
131
|
+
},
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
/** The frame that one harness chunk carries, checked as a frame from outside the process. */
|
|
135
|
+
function harnessFrameOf(chunk) {
|
|
136
|
+
const carried = HarnessFrameChunkSchema.safeParse(chunk);
|
|
137
|
+
if (!carried.success)
|
|
138
|
+
return undefined;
|
|
139
|
+
if (carried.data.data.type.startsWith("data-")) {
|
|
140
|
+
const part = checkChatPart(carried.data.data);
|
|
141
|
+
return part.ok ? part.frame : undefined;
|
|
142
|
+
}
|
|
143
|
+
const event = ChatEventSchema.safeParse(carried.data.data);
|
|
144
|
+
return event.success ? event.data : undefined;
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* The frames of one chunk of the stream. The text of a model call is the text of the root agent, because a
|
|
148
|
+
* sub-agent writes to the stream of its own workflow. The end chunks of the library carry no fact of the turn,
|
|
149
|
+
* except the error and the abort of a workflow that ended before the turn wrote its own end.
|
|
150
|
+
*/
|
|
151
|
+
export function framesOfChunk(chunk, rootSource) {
|
|
152
|
+
switch (chunk.type) {
|
|
153
|
+
case "text-delta":
|
|
154
|
+
return chunk.delta.length === 0 ? [] : [{ type: "text-delta", text: chunk.delta, source: rootSource }];
|
|
155
|
+
case "error":
|
|
156
|
+
return [{ type: "error", message: chunk.errorText, source: rootSource }];
|
|
157
|
+
case "abort":
|
|
158
|
+
return [{ type: "finish", source: rootSource }];
|
|
159
|
+
default: {
|
|
160
|
+
const frame = harnessFrameOf(chunk);
|
|
161
|
+
return frame === undefined ? [] : [frame];
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
/** How long a read waits for a child workflow that its caller named, and the interval of each look. */
|
|
166
|
+
const CHILD_START_WAIT_MS = 10_000;
|
|
167
|
+
const CHILD_START_POLL_MS = 50;
|
|
168
|
+
/**
|
|
169
|
+
* The chunks of the stream of a sub-agent child. The caller names the child in the same tick as it starts the child,
|
|
170
|
+
* thus the name can arrive before the child exists, and a read of a stream of no workflow fails. A child that never
|
|
171
|
+
* starts fails the tool call of its caller, and the result of that call tells it.
|
|
172
|
+
*/
|
|
173
|
+
async function* childChunks(workflowID, client) {
|
|
174
|
+
const source = client ?? DBOS;
|
|
175
|
+
const deadline = Date.now() + CHILD_START_WAIT_MS;
|
|
176
|
+
while ((await source.retrieveWorkflow(workflowID).getStatus()) === null) {
|
|
177
|
+
if (Date.now() > deadline)
|
|
178
|
+
return;
|
|
179
|
+
await sleep(CHILD_START_POLL_MS);
|
|
180
|
+
}
|
|
181
|
+
yield* readDurableStream({ workflowID, key: CHAT_STREAM_KEY, client, sendReasoning: false });
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Read the frames of a turn from its start, live, until the turn ends. A second read gives the same frames.
|
|
185
|
+
*
|
|
186
|
+
* The read merges the stream of each sub-agent child that the turn names, in the order of arrival. A child stream
|
|
187
|
+
* gives only the frames of the harness: the child ends before its caller continues, and the result of its tool call
|
|
188
|
+
* tells its outcome. The end frame of the turn comes last.
|
|
189
|
+
*/
|
|
190
|
+
export async function* readChatTurn(turnId, options) {
|
|
191
|
+
const readers = [];
|
|
192
|
+
const reads = new Map();
|
|
193
|
+
const pull = (reader) => {
|
|
194
|
+
reads.set(reader, reader.next().then((next) => ({ reader, next })));
|
|
195
|
+
};
|
|
196
|
+
const open = (chunks) => {
|
|
197
|
+
const reader = chunks[Symbol.asyncIterator]();
|
|
198
|
+
readers.push(reader);
|
|
199
|
+
pull(reader);
|
|
200
|
+
return reader;
|
|
201
|
+
};
|
|
202
|
+
const root = open(readDurableStream({ workflowID: turnId, key: CHAT_STREAM_KEY, client: options.client, sendReasoning: false }));
|
|
203
|
+
let rootSource = options.rootSource;
|
|
204
|
+
const ends = [];
|
|
205
|
+
try {
|
|
206
|
+
while (reads.size > 0) {
|
|
207
|
+
const { reader, next } = await Promise.race(reads.values());
|
|
208
|
+
if (next.done === true) {
|
|
209
|
+
reads.delete(reader);
|
|
210
|
+
continue;
|
|
211
|
+
}
|
|
212
|
+
pull(reader);
|
|
213
|
+
const frame = harnessFrameOf(next.value);
|
|
214
|
+
const child = SubAgentStreamFrameSchema.safeParse(frame);
|
|
215
|
+
if (child.success) {
|
|
216
|
+
open(childChunks(child.data.workflowId, options.client));
|
|
217
|
+
continue;
|
|
218
|
+
}
|
|
219
|
+
if (reader !== root) {
|
|
220
|
+
if (frame !== undefined)
|
|
221
|
+
yield frame;
|
|
222
|
+
continue;
|
|
223
|
+
}
|
|
224
|
+
rootSource ??= frame?.source;
|
|
225
|
+
for (const rootFrame of framesOfChunk(next.value, rootSource ?? UNKNOWN_SOURCE)) {
|
|
226
|
+
if (rootFrame.type === "finish" || rootFrame.type === "error")
|
|
227
|
+
ends.push(rootFrame);
|
|
228
|
+
else
|
|
229
|
+
yield rootFrame;
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
yield* ends;
|
|
233
|
+
}
|
|
234
|
+
finally {
|
|
235
|
+
await Promise.all(readers.map(async (reader) => await reader.return?.()));
|
|
236
|
+
}
|
|
237
|
+
}
|
|
@@ -1,24 +1,24 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
import type { ToolMask } from "./tool-mask.js";
|
|
1
|
+
import type { ToolMask } from "./call-policy.js";
|
|
3
2
|
import type { LoopMessage } from "./types.js";
|
|
4
3
|
/** The cap of requests of one compaction exchange: up to 3 rounds of memory edits, and then the summary. */
|
|
5
4
|
export declare const COMPACTION_MAX_REQUESTS = 4;
|
|
6
5
|
/** When an agent compacts its conversation, in the input tokens that the provider reported for the last request. */
|
|
7
|
-
export
|
|
6
|
+
export type CompactionRules = {
|
|
8
7
|
/** The budget before each request of a turn. */
|
|
9
8
|
readonly budget: number;
|
|
10
9
|
/** The budget before the user message of a turn joins the conversation. Absent: no compaction before the user message. */
|
|
11
10
|
readonly turnStartBudget?: number;
|
|
12
|
-
}
|
|
11
|
+
};
|
|
13
12
|
/**
|
|
14
13
|
* The rules of an agent for a model with `contextWindow`. The budget is the smaller of the declared budget and 80% of
|
|
15
14
|
* the window. The turn-start budget keeps its ratio to the budget. An absent window keeps the declared rules.
|
|
16
15
|
*/
|
|
17
16
|
export declare function rulesForContextWindow(rules: CompactionRules, contextWindow: number | undefined): CompactionRules;
|
|
18
|
-
/**
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
17
|
+
/**
|
|
18
|
+
* How the loop compacts its conversation when the last request passed a budget. The exchange streams no
|
|
19
|
+
* text to the surface, because the summary is no reply.
|
|
20
|
+
*/
|
|
21
|
+
export type CompactionPolicy = CompactionRules & {
|
|
22
22
|
/** The text of the compaction request. */
|
|
23
23
|
readonly request: string;
|
|
24
24
|
/** The tools that can run in the exchange. */
|
|
@@ -27,4 +27,4 @@ export interface CompactionPolicy extends CompactionRules {
|
|
|
27
27
|
readonly keepFirstTurn: boolean;
|
|
28
28
|
/** The context records that come after a new marker, for the view that starts at the marker. */
|
|
29
29
|
readonly recordsAfter: (view: readonly LoopMessage[]) => Promise<readonly LoopMessage[]>;
|
|
30
|
-
}
|
|
30
|
+
};
|
package/dist/loop/compaction.js
CHANGED
|
@@ -14,6 +14,6 @@ export function rulesForContextWindow(rules, contextWindow) {
|
|
|
14
14
|
return rules;
|
|
15
15
|
return {
|
|
16
16
|
budget,
|
|
17
|
-
|
|
17
|
+
turnStartBudget: rules.turnStartBudget === undefined ? undefined : Math.floor((rules.turnStartBudget * budget) / rules.budget),
|
|
18
18
|
};
|
|
19
19
|
}
|
package/dist/loop/metrics.d.ts
CHANGED
|
@@ -12,11 +12,11 @@
|
|
|
12
12
|
* agree on whether `outputTokens` includes the reasoning tokens, so the
|
|
13
13
|
* reasoning counter keeps a `provider` label.
|
|
14
14
|
*
|
|
15
|
-
* Each
|
|
16
|
-
* - cortex.harness.agent.iterations — histogram of
|
|
15
|
+
* Each run of the loop also records, with the `agent_id` label only:
|
|
16
|
+
* - cortex.harness.agent.iterations — histogram of model requests per run.
|
|
17
17
|
* A creeping distribution is a leading indicator of prompt drift.
|
|
18
18
|
* - cortex.harness.agent.cap_hits — counter, incremented once per run that
|
|
19
|
-
*
|
|
19
|
+
* reached its step cap.
|
|
20
20
|
*
|
|
21
21
|
* The two cache counters are what make prompt caching *observable*: the hit
|
|
22
22
|
* rate for an agent type is `cache_read_tokens / input_tokens` (the harness's
|
|
@@ -33,19 +33,19 @@
|
|
|
33
33
|
* exporter from `harness/lib/otel.ts`; tests: an in-memory reader).
|
|
34
34
|
*/
|
|
35
35
|
import { type TokenUsageRollup } from "../contracts/usage.js";
|
|
36
|
-
import type {
|
|
36
|
+
import type { ChatUsage } from "../providers/types.js";
|
|
37
37
|
/**
|
|
38
|
-
* Token usage summed over LLM calls, either one
|
|
38
|
+
* Token usage summed over LLM calls, either one run of the loop or a whole
|
|
39
39
|
* turn. A field stays `undefined` until a call reports it, so an unreported
|
|
40
40
|
* field never masquerades as a measured zero.
|
|
41
41
|
*/
|
|
42
|
-
export
|
|
42
|
+
export type AgentRunUsage = {
|
|
43
43
|
inputTokens?: number;
|
|
44
44
|
outputTokens?: number;
|
|
45
45
|
cacheCreationInputTokens?: number;
|
|
46
46
|
cacheReadInputTokens?: number;
|
|
47
47
|
reasoningTokens?: number;
|
|
48
|
-
}
|
|
48
|
+
};
|
|
49
49
|
/** Fold one call's reported usage into a run's running total. */
|
|
50
50
|
export declare function addChatUsage(total: AgentRunUsage, usage: ChatUsage | undefined): void;
|
|
51
51
|
/**
|
|
@@ -59,17 +59,14 @@ export declare function addChatUsage(total: AgentRunUsage, usage: ChatUsage | un
|
|
|
59
59
|
* at either end is how the two would come to disagree.
|
|
60
60
|
*/
|
|
61
61
|
export declare function hasReportedUsage(usage: AgentRunUsage | ChatUsage | TokenUsageRollup | undefined): boolean;
|
|
62
|
-
/**
|
|
63
|
-
* Maps a step's response to grow its token counters. Use inside the step
|
|
64
|
-
* body, `provider.chat(...).map(countChatTokens(agentId))`. A call that gives
|
|
65
|
-
* `err` counts nothing.
|
|
66
|
-
*/
|
|
67
|
-
export declare function countChatTokens(agentId: string): (response: ChatResponse) => ChatResponse;
|
|
62
|
+
/** Grow the token counters by one completed call. A figure that the provider did not report counts nothing. */
|
|
68
63
|
export declare function recordChatCall(call: {
|
|
69
64
|
readonly agentId: string;
|
|
70
|
-
readonly
|
|
65
|
+
readonly usage: ChatUsage;
|
|
66
|
+
readonly servedModelId?: string;
|
|
67
|
+
readonly provider?: string;
|
|
71
68
|
}): void;
|
|
72
|
-
/** Record one completed
|
|
69
|
+
/** Record one completed run of the loop. */
|
|
73
70
|
export declare function recordAgentRun(run: {
|
|
74
71
|
readonly agentId: string;
|
|
75
72
|
readonly iterations: number;
|
package/dist/loop/metrics.js
CHANGED
|
@@ -12,11 +12,11 @@
|
|
|
12
12
|
* agree on whether `outputTokens` includes the reasoning tokens, so the
|
|
13
13
|
* reasoning counter keeps a `provider` label.
|
|
14
14
|
*
|
|
15
|
-
* Each
|
|
16
|
-
* - cortex.harness.agent.iterations — histogram of
|
|
15
|
+
* Each run of the loop also records, with the `agent_id` label only:
|
|
16
|
+
* - cortex.harness.agent.iterations — histogram of model requests per run.
|
|
17
17
|
* A creeping distribution is a leading indicator of prompt drift.
|
|
18
18
|
* - cortex.harness.agent.cap_hits — counter, incremented once per run that
|
|
19
|
-
*
|
|
19
|
+
* reached its step cap.
|
|
20
20
|
*
|
|
21
21
|
* The two cache counters are what make prompt caching *observable*: the hit
|
|
22
22
|
* rate for an agent type is `cache_read_tokens / input_tokens` (the harness's
|
|
@@ -40,11 +40,11 @@ function getInstruments() {
|
|
|
40
40
|
const meter = metrics.getMeter("cortex.harness.loop");
|
|
41
41
|
instruments = {
|
|
42
42
|
iterations: meter.createHistogram("cortex.harness.agent.iterations", {
|
|
43
|
-
description: "
|
|
43
|
+
description: "Model requests of each run of the agent loop",
|
|
44
44
|
unit: "{iteration}",
|
|
45
45
|
}),
|
|
46
46
|
capHits: meter.createCounter("cortex.harness.agent.cap_hits", {
|
|
47
|
-
description: "
|
|
47
|
+
description: "Runs of the agent loop that reached their step cap",
|
|
48
48
|
}),
|
|
49
49
|
inputTokens: meter.createCounter("cortex.harness.agent.input_tokens", {
|
|
50
50
|
description: "Input tokens billed for each completed LLM call, cache reads included",
|
|
@@ -94,29 +94,17 @@ export function addChatUsage(total, usage) {
|
|
|
94
94
|
export function hasReportedUsage(usage) {
|
|
95
95
|
if (usage === undefined)
|
|
96
96
|
return false;
|
|
97
|
-
return
|
|
98
|
-
}
|
|
99
|
-
/**
|
|
100
|
-
* Maps a step's response to grow its token counters. Use inside the step
|
|
101
|
-
* body, `provider.chat(...).map(countChatTokens(agentId))`. A call that gives
|
|
102
|
-
* `err` counts nothing.
|
|
103
|
-
*/
|
|
104
|
-
export function countChatTokens(agentId) {
|
|
105
|
-
return (response) => {
|
|
106
|
-
recordChatCall({ agentId, response });
|
|
107
|
-
return response;
|
|
108
|
-
};
|
|
97
|
+
return TOKEN_USAGE_FIELDS.some((field) => usage[field] !== undefined);
|
|
109
98
|
}
|
|
99
|
+
/** Grow the token counters by one completed call. A figure that the provider did not report counts nothing. */
|
|
110
100
|
export function recordChatCall(call) {
|
|
111
|
-
const { usage
|
|
112
|
-
if (usage === undefined)
|
|
113
|
-
return;
|
|
101
|
+
const { usage } = call;
|
|
114
102
|
const { inputTokens, outputTokens, cacheReadTokens, cacheWriteTokens, reasoningTokens } = getInstruments();
|
|
115
|
-
const attributes = {
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
103
|
+
const attributes = { agent_id: call.agentId };
|
|
104
|
+
if (call.servedModelId !== undefined)
|
|
105
|
+
attributes.model = call.servedModelId;
|
|
106
|
+
if (call.provider !== undefined)
|
|
107
|
+
attributes.provider = call.provider;
|
|
120
108
|
if (usage.inputTokens !== undefined)
|
|
121
109
|
inputTokens.add(usage.inputTokens, attributes);
|
|
122
110
|
if (usage.outputTokens !== undefined)
|
|
@@ -128,7 +116,7 @@ export function recordChatCall(call) {
|
|
|
128
116
|
if (usage.reasoningTokens !== undefined)
|
|
129
117
|
reasoningTokens.add(usage.reasoningTokens, attributes);
|
|
130
118
|
}
|
|
131
|
-
/** Record one completed
|
|
119
|
+
/** Record one completed run of the loop. */
|
|
132
120
|
export function recordAgentRun(run) {
|
|
133
121
|
const { iterations, capHits } = getInstruments();
|
|
134
122
|
const attributes = { agent_id: run.agentId };
|
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The agent loop: one conversation of one agent with a model and its tools.
|
|
3
|
+
*
|
|
4
|
+
* The AI SDK drives each request series with `streamText`. Inside a DBOS
|
|
5
|
+
* workflow, `durableCalls` makes each model call a step, and the tool adapter
|
|
6
|
+
* makes each tool call a step, thus a recovery replays each completed call
|
|
7
|
+
* from its checkpoint. Outside a workflow, each call runs directly. The same
|
|
8
|
+
* loop serves a chat turn, a workflow step, and a sub-agent.
|
|
9
|
+
*
|
|
10
|
+
* The loop keeps the transcript itself, and each request sends its view of
|
|
11
|
+
* the transcript. This gives the loop the work that the SDK does not do: the
|
|
12
|
+
* append-only record of each round, the round sink, the compaction, the
|
|
13
|
+
* follow-up request, the salvage, the not-run answer of each unanswered call
|
|
14
|
+
* at an exit, and the finish record.
|
|
15
|
+
*/
|
|
16
|
+
import { type LanguageModelMiddleware, type UIMessageStreamWriter } from "ai";
|
|
17
|
+
import { type AgentSession } from "../auth/types.js";
|
|
18
|
+
import type { UsageRecorder } from "../billing/usage-recorder.js";
|
|
19
|
+
import type { Logger } from "../lib/logger.js";
|
|
20
|
+
import type { ChatProvider, PromptCachePolicy, ReasoningPolicy } from "../providers/types.js";
|
|
21
|
+
import type { AskRequest } from "../tools/approval/contract.js";
|
|
22
|
+
import { type CallPolicy, type ToolMask } from "./call-policy.js";
|
|
23
|
+
import { type CompactionPolicy } from "./compaction.js";
|
|
24
|
+
import { type AgentRunUsage } from "./metrics.js";
|
|
25
|
+
import { type ToolCallOutput } from "./tool-adapter.js";
|
|
26
|
+
import { type ToolOutputStore } from "./tool-output.js";
|
|
27
|
+
import type { AgentDefinition, EmitFn, LoopMessage } from "./types.js";
|
|
28
|
+
export type AgentFinish = {
|
|
29
|
+
/**
|
|
30
|
+
* The stop reason: the finish reason of the last reply, `aborted`, `max_iterations` at the step cap, or
|
|
31
|
+
* `denied` after a denial of the user. A word outside the modeled union stays as the provider sent it.
|
|
32
|
+
*/
|
|
33
|
+
readonly reason: "stop" | "length" | "content-filter" | "tool-calls" | "error" | "other" | "aborted" | "max_iterations" | "denied" | (string & {});
|
|
34
|
+
/** The word of the endpoint for the stop, when the provider captured one. */
|
|
35
|
+
readonly rawFinishReason?: string;
|
|
36
|
+
readonly cappedOut: boolean;
|
|
37
|
+
/** What the model calls of this run reported. Absent when no call reported anything — never an all-zero figure. */
|
|
38
|
+
readonly usage?: AgentRunUsage;
|
|
39
|
+
/**
|
|
40
|
+
* The whole turn's total, every descendant loop included. Present only on
|
|
41
|
+
* the loop that created the turn accumulator — the run whose options
|
|
42
|
+
* carried none, which is by construction the turn's root.
|
|
43
|
+
*/
|
|
44
|
+
readonly turnUsage?: AgentRunUsage;
|
|
45
|
+
};
|
|
46
|
+
/** One tool call of a completed request, in the order that the model made the calls. */
|
|
47
|
+
export type LoopToolCall = {
|
|
48
|
+
readonly toolCallId: string;
|
|
49
|
+
readonly toolName: string;
|
|
50
|
+
readonly input: unknown;
|
|
51
|
+
/** The output of a call that ran. Absent for a refused call and for an input that did not parse. */
|
|
52
|
+
readonly output?: ToolCallOutput;
|
|
53
|
+
/** The policy of the run refused the call, thus it did not run. */
|
|
54
|
+
readonly refused: boolean;
|
|
55
|
+
/** The call has a result in the conversation. */
|
|
56
|
+
readonly answered: boolean;
|
|
57
|
+
};
|
|
58
|
+
/** One completed model request of a run, and the tool calls of its reply. */
|
|
59
|
+
export type LoopStep = {
|
|
60
|
+
readonly finishReason: string;
|
|
61
|
+
readonly rawFinishReason?: string;
|
|
62
|
+
readonly calls: readonly LoopToolCall[];
|
|
63
|
+
};
|
|
64
|
+
export type LoopResult = {
|
|
65
|
+
readonly messages: LoopMessage[];
|
|
66
|
+
readonly finish: AgentFinish;
|
|
67
|
+
/** Each completed request of the run, in order. A selector reads the outcome of a run from them. */
|
|
68
|
+
readonly steps: readonly LoopStep[];
|
|
69
|
+
};
|
|
70
|
+
/** A request that the provider refused for its content: the HTTP status and the text of the provider error. */
|
|
71
|
+
export type RequestRefusal = {
|
|
72
|
+
readonly status: number;
|
|
73
|
+
readonly message: string;
|
|
74
|
+
};
|
|
75
|
+
/** The messages that the loop appended after the last call of the round sink. */
|
|
76
|
+
export type AgentRound = {
|
|
77
|
+
readonly messages: readonly LoopMessage[];
|
|
78
|
+
};
|
|
79
|
+
/** The decision of the user on the approval of one call. */
|
|
80
|
+
export type ApprovalDecision = {
|
|
81
|
+
readonly kind: "approved";
|
|
82
|
+
} | {
|
|
83
|
+
readonly kind: "denied";
|
|
84
|
+
readonly feedback?: string;
|
|
85
|
+
};
|
|
86
|
+
export type LoopOptions = {
|
|
87
|
+
readonly provider: ChatProvider;
|
|
88
|
+
readonly signal: AbortSignal;
|
|
89
|
+
readonly emit: EmitFn;
|
|
90
|
+
/** Receives each text delta of the reply as it streams. A loop with a live reader of its text gives it. */
|
|
91
|
+
readonly onText?: (text: string) => void | Promise<void>;
|
|
92
|
+
/**
|
|
93
|
+
* The round sink. The loop awaits it before each model request, at each exit, and before a throw.
|
|
94
|
+
* A durable loop passes no sink, because DBOS replays the loop body.
|
|
95
|
+
*/
|
|
96
|
+
readonly onRound?: (round: AgentRound) => Promise<void>;
|
|
97
|
+
/**
|
|
98
|
+
* The compaction policy. Each request then sends the view of the transcript, and the loop compacts
|
|
99
|
+
* before a task request whose view passes the budget. A durable loop passes no policy, because
|
|
100
|
+
* `recordsAfter` reads the database outside a step.
|
|
101
|
+
*/
|
|
102
|
+
readonly compaction?: CompactionPolicy;
|
|
103
|
+
/**
|
|
104
|
+
* The messages that open the turn of a chat thread: the user message and its context records. The loop appends
|
|
105
|
+
* them after the turn-start compaction, thus the conversation holds each message in the order that it was sent.
|
|
106
|
+
* Absent: `initial` holds the whole conversation.
|
|
107
|
+
*/
|
|
108
|
+
readonly turnInput?: readonly LoopMessage[];
|
|
109
|
+
/**
|
|
110
|
+
* The decision of the user on a call whose tool asks for approval. The loop asks before the call runs, after the
|
|
111
|
+
* call policy. Absent: no surface can answer, and the loop denies each such call.
|
|
112
|
+
*/
|
|
113
|
+
readonly approve?: (request: AskRequest, call: {
|
|
114
|
+
readonly toolCallId: string;
|
|
115
|
+
readonly toolName: string;
|
|
116
|
+
}) => Promise<ApprovalDecision>;
|
|
117
|
+
/** The mask of the task, the budget, and the guard of the run. A refused call does not run. */
|
|
118
|
+
readonly policy?: CallPolicy;
|
|
119
|
+
/** Ends the run when its outcome is final, for example a blocker of a step agent. The finish reason is `stop`. */
|
|
120
|
+
readonly stopWhen?: (steps: readonly LoopStep[]) => boolean;
|
|
121
|
+
/** An early cap: the run ends as if it reached its step cap, for example after the refusal limit of a guard. */
|
|
122
|
+
readonly capWhen?: () => boolean;
|
|
123
|
+
/**
|
|
124
|
+
* Prompt-cache policy for every model call of this run. Defaults to `DEFAULT_PROMPT_CACHE` (5m) — an agent
|
|
125
|
+
* loop always re-sends its prefix, so it breaks even by the second request. A host whose endpoint ignores
|
|
126
|
+
* or charges badly for cache directives passes `"off"`.
|
|
127
|
+
*/
|
|
128
|
+
readonly promptCache?: PromptCachePolicy;
|
|
129
|
+
/**
|
|
130
|
+
* The reasoning effort for each model call of this run. Anthropic discards its message cache when the
|
|
131
|
+
* top-level effort changes, so the run sends the same value, or none, throughout.
|
|
132
|
+
*/
|
|
133
|
+
readonly reasoning?: ReasoningPolicy;
|
|
134
|
+
readonly logger?: Logger;
|
|
135
|
+
/** Per-call usage accounting. Omitted falls back to the no-op recorder. */
|
|
136
|
+
readonly usageRecorder?: UsageRecorder;
|
|
137
|
+
/** Keeps the text of each cut tool result. A run with no store cuts, and it keeps nothing. */
|
|
138
|
+
readonly toolOutputStore?: ToolOutputStore;
|
|
139
|
+
/**
|
|
140
|
+
* The turn's usage accumulator, supplied by whatever ran this loop as part of a larger turn (a
|
|
141
|
+
* sub-agent-running tool passes `ctx.turnUsage`). A run that receives none creates its own and is
|
|
142
|
+
* therefore the turn's root: it alone reports `turnUsage` on its finish.
|
|
143
|
+
*/
|
|
144
|
+
readonly turnUsage?: AgentRunUsage;
|
|
145
|
+
/**
|
|
146
|
+
* The durable stream that each model call of the run writes its text to, from inside its step. A loop
|
|
147
|
+
* outside a workflow writes nothing, and `onText` gives its text.
|
|
148
|
+
*/
|
|
149
|
+
readonly chatStream?: string;
|
|
150
|
+
/** Receives the chunks that each tool step writes through the tool writer of the library, on a replay too. */
|
|
151
|
+
readonly toolWriter?: UIMessageStreamWriter;
|
|
152
|
+
/** Model middleware inside the step of each model call, thus a replay of a recorded call does not run it. */
|
|
153
|
+
readonly modelMiddleware?: readonly LanguageModelMiddleware[];
|
|
154
|
+
/**
|
|
155
|
+
* The id of the tool call this loop runs inside, supplied by a sub-agent-running tool from its
|
|
156
|
+
* `ctx.invocationId`. It separates two dispatches of the same sub-agent in one round in the usage record
|
|
157
|
+
* key. The data profile gives the workflow id of its attempt, because each profile runs under the same
|
|
158
|
+
* constant frame.
|
|
159
|
+
*/
|
|
160
|
+
readonly invocationId?: string;
|
|
161
|
+
/**
|
|
162
|
+
* Waits out a failed request whose cause a person or time can repair, and gives how the wait ended: the deadline
|
|
163
|
+
* of a retry, a resume, or a stop. `undefined`: the failure does not pause, and the loop throws it. The body of a
|
|
164
|
+
* workflow gives the pause of its work. A loop with no pause throws each failure.
|
|
165
|
+
*/
|
|
166
|
+
readonly pause?: (failure: unknown, attempt: number, signal: AbortSignal) => Promise<"retry" | "resume" | "abort" | undefined>;
|
|
167
|
+
};
|
|
168
|
+
/** The harness request after a reply that a failed request cut. The model reads its partial reply, and continues it. */
|
|
169
|
+
export declare const CONTINUE_REQUEST = "[The model request failed during your reply above. Continue the reply from where it stopped.]";
|
|
170
|
+
/** A run that receives no turn accumulator is the turn's root. See `LoopOptions.turnUsage`. */
|
|
171
|
+
export declare const isTurnRoot: (opts: Pick<LoopOptions, "turnUsage">) => boolean;
|
|
172
|
+
/** Run an agent over `initial` until its reply ends the run. */
|
|
173
|
+
export declare function runLoop(agent: AgentDefinition, initial: readonly LoopMessage[], session: AgentSession, opts: LoopOptions): Promise<LoopResult>;
|
|
174
|
+
/** One harness request that continues a finished conversation. */
|
|
175
|
+
export type FollowUpRequest = {
|
|
176
|
+
/** Appended as a synthetic user message, thus it opens no turn in a stored thread. */
|
|
177
|
+
readonly text: string;
|
|
178
|
+
/** The tools that can run. The request still declares every tool of the agent. */
|
|
179
|
+
readonly mask: ToolMask;
|
|
180
|
+
readonly maxRequests: number;
|
|
181
|
+
/**
|
|
182
|
+
* When set, metrics and token counts are attributed to this id instead of
|
|
183
|
+
* `agent.id`, through `forSubAgent`. Omitted, both stay the agent's own.
|
|
184
|
+
*/
|
|
185
|
+
readonly accountingAgentId?: string;
|
|
186
|
+
/** A `provider` error with the status `400` or `413` ends the request with the finish reason `error`, and no throw. */
|
|
187
|
+
readonly endOnRequestRefusal?: boolean;
|
|
188
|
+
};
|
|
189
|
+
export type FollowUpResult = LoopResult & {
|
|
190
|
+
/** The refusal that ended a request with `endOnRequestRefusal`. */
|
|
191
|
+
readonly refusal?: RequestRefusal;
|
|
192
|
+
};
|
|
193
|
+
/**
|
|
194
|
+
* Continue a finished conversation with one harness request. `agent` and `opts`
|
|
195
|
+
* must match the conversation's own, since each request extends its cached
|
|
196
|
+
* prefix. `conversation` itself is never changed. The result holds only the new
|
|
197
|
+
* messages, starting with the request.
|
|
198
|
+
*/
|
|
199
|
+
export declare function continueLoop(agent: AgentDefinition, conversation: readonly LoopMessage[], request: FollowUpRequest, session: AgentSession, opts: LoopOptions): Promise<FollowUpResult>;
|
|
200
|
+
/** Default salvage budget: one submit plus a fix of a refused submission or two. */
|
|
201
|
+
export declare const DEFAULT_SALVAGE_REQUESTS = 3;
|
|
202
|
+
/** How to salvage a run that ended with no outcome. */
|
|
203
|
+
export type TerminalSalvage = {
|
|
204
|
+
/** The tools that can run in the salvage request. Each one must be a declared tool of the agent. */
|
|
205
|
+
readonly tools: readonly string[];
|
|
206
|
+
/** Opens the salvage request as a synthetic user message. */
|
|
207
|
+
readonly nudge: string;
|
|
208
|
+
/** The cap of salvage requests. Defaults to {@link DEFAULT_SALVAGE_REQUESTS}. */
|
|
209
|
+
readonly maxRequests?: number;
|
|
210
|
+
/** Whether the recorded steps hold the outcome of the agent. */
|
|
211
|
+
readonly hasOutcome: (steps: readonly LoopStep[]) => boolean;
|
|
212
|
+
};
|
|
213
|
+
/**
|
|
214
|
+
* What a salvage request was and how it went — present only when one ran. The first finish is the
|
|
215
|
+
* diagnosis of why a salvage was needed: a run that capped out spent its budget, and a run that ended
|
|
216
|
+
* on prose gave up early.
|
|
217
|
+
*/
|
|
218
|
+
export type SalvageRecord = {
|
|
219
|
+
readonly firstFinish: AgentFinish;
|
|
220
|
+
readonly finish: AgentFinish;
|
|
221
|
+
};
|
|
222
|
+
export type SalvagedResult = LoopResult & {
|
|
223
|
+
/** Null when the first run reached its outcome and no salvage ran. */
|
|
224
|
+
readonly salvage: SalvageRecord | null;
|
|
225
|
+
};
|
|
226
|
+
/**
|
|
227
|
+
* Run an agent that has an outcome, and send one salvage request when the run
|
|
228
|
+
* ends with none and was not aborted. The salvage request lets only the
|
|
229
|
+
* terminal tools of the agent run. A salvaged result carries both runs'
|
|
230
|
+
* messages and steps and the summed rollups, with the finish of the salvage.
|
|
231
|
+
*/
|
|
232
|
+
export declare function runWithSalvage(agent: AgentDefinition, initial: readonly LoopMessage[], session: AgentSession, opts: LoopOptions, salvage: TerminalSalvage): Promise<SalvagedResult>;
|
|
233
|
+
export declare function finalText(messages: readonly LoopMessage[]): string;
|