@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
package/dist/app/chat-turn.d.ts
CHANGED
|
@@ -1,26 +1,28 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* The
|
|
3
|
-
*
|
|
4
|
-
*
|
|
2
|
+
* The run of one chat turn: `runOpenTurn` runs the root loop over a prepared turn, stores the opening and each
|
|
3
|
+
* round, and closes the turn with its outcome. A transport gives the surface and the store of the turn. The turn
|
|
4
|
+
* workflow (`chat-turn-workflow.ts`) gives the transport of a workflow, and a host reaches the turn through it.
|
|
5
5
|
*/
|
|
6
|
-
import type {
|
|
6
|
+
import type { LanguageModelMiddleware, ModelMessage, UIMessageStreamWriter } from "ai";
|
|
7
7
|
import type { RequestSession } from "../auth/types.js";
|
|
8
8
|
import type { UsageRecorder } from "../billing/usage-recorder.js";
|
|
9
9
|
import type { TokenUsageRollup } from "../contracts/usage.js";
|
|
10
|
-
import type
|
|
11
|
-
import {
|
|
10
|
+
import { type Connectable, type DbError } from "../lib/db-result.js";
|
|
11
|
+
import type { Querier } from "../state/db.js";
|
|
12
|
+
import { type AgentFinish, type LoopOptions } from "../loop/run-loop.js";
|
|
12
13
|
import type { AgentDefinition, EmitFn } from "../loop/types.js";
|
|
14
|
+
import type { ConversationDisplayRecorder } from "../memory/conversation-display-recorder.js";
|
|
13
15
|
import { type ThreadType } from "../memory/thread-store.js";
|
|
14
|
-
import type {
|
|
16
|
+
import type { ChatProvider, PromptCachePolicy } from "../providers/types.js";
|
|
15
17
|
import type { ThreadAgentResolver } from "../runtime/assemble.js";
|
|
16
|
-
import type {
|
|
18
|
+
import type { AskGateway } from "../tools/approval/gateway.js";
|
|
17
19
|
import { type AssembledMessages } from "./message-assembly.js";
|
|
18
20
|
import type { Logger } from "../lib/logger.js";
|
|
19
21
|
import { type ProvenanceSeam } from "../provenance/seam.js";
|
|
20
|
-
export
|
|
22
|
+
export type PrepareChatTurnDeps = {
|
|
21
23
|
/** Operational logging seam; omitted falls back to no-op. */
|
|
22
24
|
readonly logger?: Logger;
|
|
23
|
-
readonly pool:
|
|
25
|
+
readonly pool: Querier & Connectable;
|
|
24
26
|
/**
|
|
25
27
|
* The provenance seam. The turn reads its session emit member, and no other
|
|
26
28
|
* member. The turn holds the one site that writes the conversation thread of
|
|
@@ -31,58 +33,65 @@ export interface PrepareChatTurnDeps {
|
|
|
31
33
|
* of a report session.
|
|
32
34
|
*/
|
|
33
35
|
readonly provenance?: ProvenanceSeam;
|
|
34
|
-
}
|
|
35
|
-
export
|
|
36
|
+
};
|
|
37
|
+
export type PrepareChatTurnParams = {
|
|
36
38
|
readonly analysisId: string;
|
|
37
39
|
readonly threadId: string;
|
|
38
40
|
readonly userInput: string;
|
|
39
|
-
}
|
|
41
|
+
};
|
|
40
42
|
export type PrepareChatTurnResult = ({
|
|
41
43
|
readonly kind: "ok";
|
|
42
44
|
readonly threadType: ThreadType;
|
|
43
45
|
} & AssembledMessages) | {
|
|
44
46
|
readonly kind: "not_found";
|
|
45
47
|
};
|
|
48
|
+
/** A prepared turn: the type of its thread, the view of the thread, and the opening. */
|
|
49
|
+
export type PreparedChatTurn = Extract<PrepareChatTurnResult, {
|
|
50
|
+
kind: "ok";
|
|
51
|
+
}>;
|
|
46
52
|
/**
|
|
47
53
|
* Prepare one chat turn: resolve thread ownership, seed the title, load
|
|
48
54
|
* analysis status, and assemble the message array. Input sanitization stays
|
|
49
55
|
* inside {@link assembleMessages} (applied once to the new user input only).
|
|
50
56
|
*/
|
|
51
57
|
export declare function prepareChatTurn(deps: PrepareChatTurnDeps, params: PrepareChatTurnParams): Promise<PrepareChatTurnResult>;
|
|
52
|
-
|
|
58
|
+
/**
|
|
59
|
+
* Open the thread of a turn: check that the analysis owns it, make it when it is absent, and seed its title. A
|
|
60
|
+
* thread that a different analysis owns is `not_found`.
|
|
61
|
+
*/
|
|
62
|
+
export declare function openThread(deps: PrepareChatTurnDeps, params: PrepareChatTurnParams): Promise<{
|
|
63
|
+
readonly kind: "ok";
|
|
64
|
+
readonly threadType: ThreadType;
|
|
65
|
+
} | {
|
|
66
|
+
readonly kind: "not_found";
|
|
67
|
+
}>;
|
|
68
|
+
/** The analysis context and the run activity of a turn. A failed read gives the fallback of its kind. */
|
|
69
|
+
export declare function readTurnContext(pool: Querier, analysisId: string): Promise<{
|
|
70
|
+
readonly analysisContext: string | null;
|
|
71
|
+
readonly runActivityContext: string;
|
|
72
|
+
}>;
|
|
73
|
+
/** The runtime values of a turn. `assembleCoreRuntime` gives them to the turn workflow. */
|
|
74
|
+
export type RunChatTurnDeps = PrepareChatTurnDeps & {
|
|
53
75
|
/** The agent of a turn comes from the thread type, which only the preparation knows. */
|
|
54
76
|
readonly agents: ThreadAgentResolver;
|
|
55
|
-
|
|
77
|
+
/** The model of the conversation. A host that switches the model swaps the provider between two turns. */
|
|
78
|
+
readonly provider: ChatProvider;
|
|
79
|
+
/** Each model call of the turn reaches it, the calls of a sub-agent included. */
|
|
80
|
+
readonly usageRecorder: UsageRecorder;
|
|
81
|
+
/** The ledger of the asks of a turn. Absent, the loop denies each call that asks for an approval. */
|
|
82
|
+
readonly askGateway?: AskGateway;
|
|
83
|
+
};
|
|
56
84
|
/**
|
|
57
85
|
* The session of a turn without its provenance. The harness sets the provenance from the agent that
|
|
58
86
|
* it resolves, because only the preparation knows the thread type.
|
|
59
87
|
*/
|
|
60
88
|
export type ChatTurnSession = Omit<RequestSession, "provenance">;
|
|
61
89
|
/** What opens a turn: the thread and the user input. */
|
|
62
|
-
export
|
|
90
|
+
export type OpenChatTurnParams = {
|
|
63
91
|
readonly analysisId: string;
|
|
64
92
|
readonly threadId: string;
|
|
65
93
|
readonly userInput: string;
|
|
66
|
-
}
|
|
67
|
-
/** The transport values of a turn that is open. */
|
|
68
|
-
export interface RunOpenChatTurnParams {
|
|
69
|
-
readonly session: ChatTurnSession;
|
|
70
|
-
/** Makes the provider of the turn over the emit sink of the display recorder. */
|
|
71
|
-
readonly chat: (emit: EmitFn) => AgentChat;
|
|
72
|
-
readonly emit: EmitFn;
|
|
73
|
-
readonly signal: AbortSignal;
|
|
74
|
-
readonly usageRecorder: UsageRecorder;
|
|
75
|
-
/** The approval binding. It gets the emit sink of the display recorder, thus the display records each `data-ask`. */
|
|
76
|
-
readonly ask?: (request: AskRequest, emit: EmitFn) => Promise<AskApproval>;
|
|
77
|
-
/** Who sent the user message. */
|
|
78
|
-
readonly author?: string;
|
|
79
|
-
/** When the host opened the turn. Absent counts from the call to {@link openChatTurn}. */
|
|
80
|
-
readonly startedAtMs?: number;
|
|
81
|
-
/** The cache policy of the root loop. Absent gives {@link CONVERSATION_PROMPT_CACHE}. */
|
|
82
|
-
readonly promptCache?: PromptCachePolicy;
|
|
83
|
-
}
|
|
84
|
-
/** The values of one whole turn. */
|
|
85
|
-
export type RunChatTurnParams = OpenChatTurnParams & RunOpenChatTurnParams;
|
|
94
|
+
};
|
|
86
95
|
export type ChatTurnOutcome = {
|
|
87
96
|
readonly status: "done";
|
|
88
97
|
readonly finish: AgentFinish;
|
|
@@ -92,6 +101,7 @@ export type ChatTurnOutcome = {
|
|
|
92
101
|
} | {
|
|
93
102
|
readonly status: "failed";
|
|
94
103
|
readonly reason: string;
|
|
104
|
+
readonly code: string;
|
|
95
105
|
readonly cause: unknown;
|
|
96
106
|
};
|
|
97
107
|
/** A turn that ended before its run. It wrote no row and no turn record. */
|
|
@@ -104,7 +114,7 @@ export type ChatTurnRefusal = {
|
|
|
104
114
|
readonly kind: "agent_unresolved";
|
|
105
115
|
readonly threadType: ThreadType;
|
|
106
116
|
};
|
|
107
|
-
export
|
|
117
|
+
export type ChatTurnRan = {
|
|
108
118
|
readonly kind: "ran";
|
|
109
119
|
readonly outcome: ChatTurnOutcome;
|
|
110
120
|
/** True when the opening of the turn landed. */
|
|
@@ -115,25 +125,43 @@ export interface ChatTurnRan {
|
|
|
115
125
|
readonly turnUsage?: TokenUsageRollup;
|
|
116
126
|
/** The final text of a run that returned. */
|
|
117
127
|
readonly fallbackText?: string;
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
readonly
|
|
126
|
-
/** The
|
|
127
|
-
readonly
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
*/
|
|
134
|
-
|
|
128
|
+
};
|
|
129
|
+
/** How a turn reaches its surface and its store. A turn workflow streams to its durable stream and runs each write as a step. */
|
|
130
|
+
export type TurnTransport = {
|
|
131
|
+
readonly signal: AbortSignal;
|
|
132
|
+
/** The emit sink of the loop. */
|
|
133
|
+
readonly emit: EmitFn;
|
|
134
|
+
/** Receives each text delta of the root reply. A turn workflow gives none, because its model calls stream the text. */
|
|
135
|
+
readonly onText?: (text: string) => void | Promise<void>;
|
|
136
|
+
/** The durable stream that the model calls write their text to. */
|
|
137
|
+
readonly chatStream?: string;
|
|
138
|
+
/** Receives the chunks of each tool step, on a replay too. */
|
|
139
|
+
readonly toolWriter?: UIMessageStreamWriter;
|
|
140
|
+
readonly recorder: ConversationDisplayRecorder;
|
|
141
|
+
/** Runs one write of the turn. A turn workflow runs it as a step. */
|
|
142
|
+
readonly durably: <T>(name: string, write: () => Promise<T>) => Promise<T>;
|
|
143
|
+
/** The key of the group of the turn at an index, thus a write that runs again stores nothing. */
|
|
144
|
+
readonly groupKey?: (index: number) => string;
|
|
145
|
+
/** Called when the display starts a new assistant message, after a marker. */
|
|
146
|
+
readonly announce?: (messageId: string) => Promise<void>;
|
|
147
|
+
/** Model middleware inside the step of each model call. */
|
|
148
|
+
readonly modelMiddleware?: readonly LanguageModelMiddleware[];
|
|
149
|
+
/** The decision of the user on a call whose tool asks for approval. Absent: the loop denies such a call. */
|
|
150
|
+
readonly approve?: LoopOptions["approve"];
|
|
151
|
+
/** The pause of the turn. A turn workflow gives it. Absent: each failure of a request fails the turn. */
|
|
152
|
+
readonly pause?: LoopOptions["pause"];
|
|
153
|
+
};
|
|
154
|
+
/** The values of a turn that its run reads. */
|
|
155
|
+
export type TurnRunParams = {
|
|
156
|
+
readonly session: ChatTurnSession;
|
|
157
|
+
readonly author?: string;
|
|
158
|
+
readonly startedAtMs: number;
|
|
159
|
+
readonly promptCache?: PromptCachePolicy;
|
|
160
|
+
};
|
|
135
161
|
/**
|
|
136
|
-
* Run
|
|
137
|
-
*
|
|
162
|
+
* Run a prepared turn: store its opening, run the root loop with a round sink that stores each round, and close the
|
|
163
|
+
* turn with its outcome.
|
|
138
164
|
*/
|
|
139
|
-
export declare function
|
|
165
|
+
export declare function runOpenTurn(deps: RunChatTurnDeps, turn: OpenChatTurnParams, prepared: PreparedChatTurn, agent: AgentDefinition, params: TurnRunParams, transport: TurnTransport): Promise<ChatTurnRan>;
|
|
166
|
+
/** The sanitized text of the user message, thus the display never holds a secret that the model does not see. */
|
|
167
|
+
export declare function userTextOf(message: ModelMessage): string;
|
package/dist/app/chat-turn.js
CHANGED
|
@@ -1,24 +1,25 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* The
|
|
3
|
-
*
|
|
4
|
-
*
|
|
2
|
+
* The run of one chat turn: `runOpenTurn` runs the root loop over a prepared turn, stores the opening and each
|
|
3
|
+
* round, and closes the turn with its outcome. A transport gives the surface and the store of the turn. The turn
|
|
4
|
+
* workflow (`chat-turn-workflow.ts`) gives the transport of a workflow, and a host reaches the turn through it.
|
|
5
5
|
*/
|
|
6
|
+
import { presentFirst } from "../lib/present.js";
|
|
7
|
+
import { errorNameOf } from "../lib/thrown.js";
|
|
6
8
|
import { unwrapOrThrow } from "../lib/result.js";
|
|
7
9
|
import { rulesForContextWindow } from "../loop/compaction.js";
|
|
8
|
-
import { finalText,
|
|
9
|
-
import {
|
|
10
|
+
import { finalText, runLoop } from "../loop/run-loop.js";
|
|
11
|
+
import { isTurnCredentialMissing } from "../loop/turn-credentials.js";
|
|
10
12
|
import { compactionExchangeOf, syntheticUserMessage } from "../memory/ai-sdk-message-storage.js";
|
|
11
|
-
import { createConversationDisplayRecorder } from "../memory/conversation-display-recorder.js";
|
|
12
13
|
import { deriveThreadTitle } from "../memory/derive-thread-title.js";
|
|
13
14
|
import { conversationRecordTurn, createThreadHistory } from "../memory/thread-history.js";
|
|
14
15
|
import { createThreadStore } from "../memory/thread-store.js";
|
|
16
|
+
import { isWorkflowCancellation } from "../runtime/dbos.js";
|
|
15
17
|
import { createWorkingMemory } from "../memory/working-memory.js";
|
|
16
|
-
import { findProviderError } from "../providers/errors.js";
|
|
18
|
+
import { findProviderError, modelFailureOf } from "../providers/errors.js";
|
|
17
19
|
import { MEMORY_COMPACTION_REQUEST, SUMMARY_COMPACTION_REQUEST } from "../prompts/compaction.js";
|
|
18
20
|
import { CONVERSATION_PROMPT_CACHE } from "../providers/prompt-cache.js";
|
|
19
21
|
import { loadAnalysisStatus, queryNonTerminalRunsByAnalysis } from "../state/index.js";
|
|
20
22
|
import { createToolOutputStore } from "../state/tool-outputs.js";
|
|
21
|
-
import { suspensionOfFailure } from "../workflows/suspension.js";
|
|
22
23
|
import { assembleMessages, contextRecordsFor } from "./message-assembly.js";
|
|
23
24
|
import { renderRunActivity, renderRunActivityUnavailable, RUN_ACTIVITY_DETAIL_LIMIT } from "./run-activity.js";
|
|
24
25
|
import { createNoopLogger } from "../lib/console-logger.js";
|
|
@@ -29,6 +30,28 @@ import { bindSessionEmit } from "../provenance/seam.js";
|
|
|
29
30
|
* inside {@link assembleMessages} (applied once to the new user input only).
|
|
30
31
|
*/
|
|
31
32
|
export async function prepareChatTurn(deps, params) {
|
|
33
|
+
const opened = await openThread(deps, params);
|
|
34
|
+
if (opened.kind === "not_found")
|
|
35
|
+
return opened;
|
|
36
|
+
const { pool } = deps;
|
|
37
|
+
const { analysisId, threadId, userInput } = params;
|
|
38
|
+
const assembled = await assembleMessages({
|
|
39
|
+
threadId,
|
|
40
|
+
threadType: opened.threadType,
|
|
41
|
+
analysisId,
|
|
42
|
+
userInput,
|
|
43
|
+
...(await readTurnContext(pool, analysisId)),
|
|
44
|
+
history: createThreadHistory(pool),
|
|
45
|
+
workingMemory: createWorkingMemory(pool),
|
|
46
|
+
logger: deps.logger,
|
|
47
|
+
});
|
|
48
|
+
return { kind: "ok", threadType: opened.threadType, ...assembled };
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Open the thread of a turn: check that the analysis owns it, make it when it is absent, and seed its title. A
|
|
52
|
+
* thread that a different analysis owns is `not_found`.
|
|
53
|
+
*/
|
|
54
|
+
export async function openThread(deps, params) {
|
|
32
55
|
const { pool } = deps;
|
|
33
56
|
const { analysisId, threadId, userInput } = params;
|
|
34
57
|
const logger = (deps.logger ?? createNoopLogger()).named("harness.chat");
|
|
@@ -80,69 +103,30 @@ export async function prepareChatTurn(deps, params) {
|
|
|
80
103
|
catch (err) {
|
|
81
104
|
logger.warn("title-seed failed (non-fatal)", logger.errorFields(err));
|
|
82
105
|
}
|
|
83
|
-
|
|
84
|
-
threadId,
|
|
85
|
-
threadType,
|
|
86
|
-
analysisId,
|
|
87
|
-
userInput,
|
|
88
|
-
...(await readTurnContext(pool, analysisId)),
|
|
89
|
-
history: createThreadHistory(pool),
|
|
90
|
-
workingMemory: createWorkingMemory(pool),
|
|
91
|
-
...(deps.logger ? { logger: deps.logger } : {}),
|
|
92
|
-
});
|
|
93
|
-
return { kind: "ok", threadType, ...assembled };
|
|
106
|
+
return { kind: "ok", threadType };
|
|
94
107
|
}
|
|
95
108
|
/** The analysis context and the run activity of a turn. A failed read gives the fallback of its kind. */
|
|
96
|
-
async function readTurnContext(pool, analysisId) {
|
|
109
|
+
export async function readTurnContext(pool, analysisId) {
|
|
97
110
|
const analysisState = await loadAnalysisStatus(pool, analysisId).unwrapOr(null);
|
|
98
111
|
const runActivityContext = await queryNonTerminalRunsByAnalysis(pool, analysisId, RUN_ACTIVITY_DETAIL_LIMIT).match((activity) => renderRunActivity(activity), () => renderRunActivityUnavailable());
|
|
99
112
|
return { analysisContext: analysisState?.context ?? null, runActivityContext };
|
|
100
113
|
}
|
|
101
114
|
/**
|
|
102
|
-
*
|
|
103
|
-
* turn
|
|
104
|
-
*/
|
|
105
|
-
export async function openChatTurn(deps, params) {
|
|
106
|
-
const openedAtMs = Date.now();
|
|
107
|
-
let prepared;
|
|
108
|
-
try {
|
|
109
|
-
prepared = await prepareChatTurn(deps, params);
|
|
110
|
-
}
|
|
111
|
-
catch (cause) {
|
|
112
|
-
return { kind: "prepare_failed", cause };
|
|
113
|
-
}
|
|
114
|
-
if (prepared.kind === "not_found")
|
|
115
|
-
return prepared;
|
|
116
|
-
const agent = deps.agents.forThread(prepared.threadType);
|
|
117
|
-
if (agent.isErr())
|
|
118
|
-
return { kind: "agent_unresolved", threadType: prepared.threadType };
|
|
119
|
-
const ready = prepared;
|
|
120
|
-
return {
|
|
121
|
-
kind: "ready",
|
|
122
|
-
agent: agent.value,
|
|
123
|
-
run: (run) => runOpenTurn(deps, params, ready, agent.value, { ...run, startedAtMs: run.startedAtMs ?? openedAtMs }),
|
|
124
|
-
};
|
|
125
|
-
}
|
|
126
|
-
/**
|
|
127
|
-
* Run one chat turn: open it, store its opening, run the root loop with a round sink that stores
|
|
128
|
-
* each round, and close the turn with its outcome.
|
|
115
|
+
* Run a prepared turn: store its opening, run the root loop with a round sink that stores each round, and close the
|
|
116
|
+
* turn with its outcome.
|
|
129
117
|
*/
|
|
130
|
-
export async function
|
|
131
|
-
const { analysisId, threadId, userInput, ...run } = params;
|
|
132
|
-
const opened = await openChatTurn(deps, { analysisId, threadId, userInput });
|
|
133
|
-
if (opened.kind !== "ready")
|
|
134
|
-
return opened;
|
|
135
|
-
return opened.run(run);
|
|
136
|
-
}
|
|
137
|
-
async function runOpenTurn(deps, turn, prepared, agent, params) {
|
|
118
|
+
export async function runOpenTurn(deps, turn, prepared, agent, params, transport) {
|
|
138
119
|
const logger = (deps.logger ?? createNoopLogger()).named("harness.chat");
|
|
139
120
|
const session = { ...params.session, provenance: { agentId: agent.id, callPath: [agent.id] } };
|
|
140
121
|
const history = createThreadHistory(deps.pool, deps.logger);
|
|
141
|
-
const recorder =
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
122
|
+
const { recorder } = transport;
|
|
123
|
+
let groupIndex = 0;
|
|
124
|
+
/** The group with its key in the turn, when the transport keys its writes. */
|
|
125
|
+
const keyed = (group) => {
|
|
126
|
+
const index = groupIndex;
|
|
127
|
+
groupIndex += 1;
|
|
128
|
+
return transport.groupKey === undefined ? group : { ...group, key: transport.groupKey(index) };
|
|
129
|
+
};
|
|
146
130
|
// The groups that did not land yet, in the order of the turn. A failed write keeps them for the next write.
|
|
147
131
|
let pending = [];
|
|
148
132
|
let startSeq;
|
|
@@ -153,9 +137,11 @@ async function runOpenTurn(deps, turn, prepared, agent, params) {
|
|
|
153
137
|
// A turn that ends before its user message was sent has no rows to close.
|
|
154
138
|
if (!opened() || (pending.length === 0 && close === undefined))
|
|
155
139
|
return;
|
|
156
|
-
const closing = close === undefined ? {} : { close };
|
|
157
|
-
const write = startSeq === undefined
|
|
158
|
-
|
|
140
|
+
const closing = close === undefined ? {} : { close: close.note === undefined ? close : { ...close, note: keyed(close.note) } };
|
|
141
|
+
const write = startSeq === undefined
|
|
142
|
+
? { opening: presentFirst(pending, "the pending turn"), rounds: pending.slice(1), ...closing }
|
|
143
|
+
: { startSeq, rounds: pending, ...closing };
|
|
144
|
+
(await transport.durably("chat-turn.write", async () => await history.writeTurn(turn.threadId, write))).match((written) => {
|
|
159
145
|
pending = [];
|
|
160
146
|
startSeq = written.startSeq;
|
|
161
147
|
storeError = undefined;
|
|
@@ -168,7 +154,8 @@ async function runOpenTurn(deps, turn, prepared, agent, params) {
|
|
|
168
154
|
if (!opened() && round.messages[0] !== prepared.userMessage) {
|
|
169
155
|
// A turn-start compaction comes before the user message, thus its rows land before the turn opens. A later
|
|
170
156
|
// write cannot keep that order, thus a failed write is not tried again, and the next turn compacts again.
|
|
171
|
-
const
|
|
157
|
+
const group = keyed({ modelMessages: round.messages, displayMessages: recorder.takeRound(round.messages) });
|
|
158
|
+
const appended = await transport.durably("chat-turn.compaction-write", async () => await history.appendTurn(turn.threadId, group));
|
|
172
159
|
if (appended.isErr()) {
|
|
173
160
|
logger.warn("chat turn compaction write failed", {
|
|
174
161
|
threadId: turn.threadId,
|
|
@@ -179,28 +166,34 @@ async function runOpenTurn(deps, turn, prepared, agent, params) {
|
|
|
179
166
|
return;
|
|
180
167
|
}
|
|
181
168
|
const author = params.author === undefined ? {} : { author: params.author };
|
|
182
|
-
|
|
169
|
+
const assistantBefore = recorder.assistantMessageId();
|
|
170
|
+
pending.push(keyed(opened()
|
|
183
171
|
? { modelMessages: round.messages, displayMessages: recorder.takeRound(round.messages) }
|
|
184
|
-
: { modelMessages: round.messages, displayMessages: recorder.takeOpening(), ...author });
|
|
172
|
+
: { modelMessages: round.messages, displayMessages: recorder.takeOpening(), ...author }));
|
|
185
173
|
await flush();
|
|
174
|
+
if (recorder.assistantMessageId() !== assistantBefore)
|
|
175
|
+
await transport.announce?.(recorder.assistantMessageId());
|
|
186
176
|
};
|
|
187
|
-
const
|
|
188
|
-
const compaction = compactionPolicy(deps, turn.analysisId, params, prepared.threadType, agent, recorder.emit);
|
|
177
|
+
const compaction = compactionPolicy(deps, turn.analysisId, prepared.threadType, agent);
|
|
189
178
|
let outcome;
|
|
190
179
|
let fallbackText;
|
|
191
180
|
try {
|
|
192
|
-
const run = await
|
|
193
|
-
provider:
|
|
194
|
-
signal:
|
|
195
|
-
emit:
|
|
196
|
-
|
|
197
|
-
|
|
181
|
+
const run = await runLoop(agent, prepared.history, session, {
|
|
182
|
+
provider: deps.provider,
|
|
183
|
+
signal: transport.signal,
|
|
184
|
+
emit: transport.emit,
|
|
185
|
+
onText: transport.onText,
|
|
186
|
+
chatStream: transport.chatStream,
|
|
187
|
+
toolWriter: transport.toolWriter,
|
|
188
|
+
modelMiddleware: transport.modelMiddleware,
|
|
189
|
+
usageRecorder: deps.usageRecorder,
|
|
198
190
|
toolOutputStore: createToolOutputStore(deps.pool),
|
|
199
191
|
promptCache: params.promptCache ?? CONVERSATION_PROMPT_CACHE,
|
|
200
192
|
turnInput: [prepared.userMessage, ...prepared.contextRecords],
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
193
|
+
compaction,
|
|
194
|
+
logger: deps.logger,
|
|
195
|
+
approve: transport.approve,
|
|
196
|
+
pause: transport.pause,
|
|
204
197
|
onRound: storeRound,
|
|
205
198
|
});
|
|
206
199
|
outcome = run.finish.reason === "aborted" ? { status: "aborted", finish: run.finish } : { status: "done", finish: run.finish };
|
|
@@ -209,65 +202,95 @@ async function runOpenTurn(deps, turn, prepared, agent, params) {
|
|
|
209
202
|
fallbackText = finalText(run.messages.slice(prepared.history.length).filter((message) => compactionExchangeOf(message) === undefined));
|
|
210
203
|
}
|
|
211
204
|
catch (cause) {
|
|
205
|
+
// A canceled workflow writes nothing more: its recovery, or the stop of its host, closes the turn.
|
|
206
|
+
if (isWorkflowCancellation(cause))
|
|
207
|
+
throw cause;
|
|
212
208
|
// A provider failure that races an abort stays a failure, thus both facts must hold.
|
|
213
|
-
const aborted =
|
|
214
|
-
outcome = aborted ? { status: "aborted" } : { status: "failed", reason: failureReasonOf(cause), cause };
|
|
209
|
+
const aborted = transport.signal.aborted && errorNameOf(cause) === "AbortError";
|
|
210
|
+
outcome = aborted ? { status: "aborted" } : { status: "failed", reason: failureReasonOf(cause), code: failureCodeOf(cause), cause };
|
|
211
|
+
// A host gets the scrubbed text and the code of the failure. This record is the one place where the whole
|
|
212
|
+
// cause survives.
|
|
213
|
+
if (outcome.status === "failed")
|
|
214
|
+
logger.error("chat turn failed", { threadId: turn.threadId, code: outcome.code, ...logger.errorFields(cause) });
|
|
215
215
|
}
|
|
216
216
|
const durationMs = Date.now() - params.startedAtMs;
|
|
217
217
|
const turnUsage = outcome.status === "failed" ? undefined : outcome.finish?.turnUsage;
|
|
218
218
|
await flush({
|
|
219
219
|
status: outcome.status,
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
220
|
+
reason: outcome.status === "failed" ? outcome.reason : undefined,
|
|
221
|
+
note: outcome.status === "failed" ? conversationRecordTurn(failureNote(outcome.reason)) : outcome.status === "aborted" ? interruptionNote() : undefined,
|
|
222
|
+
turnUsage,
|
|
223
223
|
turnDurationMs: durationMs,
|
|
224
224
|
});
|
|
225
|
+
const storeErrorField = storeError === undefined ? undefined : { storeError };
|
|
225
226
|
return {
|
|
226
227
|
kind: "ran",
|
|
227
228
|
outcome,
|
|
228
229
|
opened: startSeq !== undefined,
|
|
229
|
-
...(storeError === undefined ? {} : { storeError }),
|
|
230
230
|
durationMs,
|
|
231
|
-
|
|
232
|
-
|
|
231
|
+
turnUsage: turnUsage === undefined ? undefined : { ...turnUsage },
|
|
232
|
+
fallbackText,
|
|
233
|
+
...storeErrorField,
|
|
233
234
|
};
|
|
234
235
|
}
|
|
235
236
|
/** The sanitized text of the user message, thus the display never holds a secret that the model does not see. */
|
|
236
|
-
function userTextOf(message) {
|
|
237
|
+
export function userTextOf(message) {
|
|
237
238
|
if (typeof message.content === "string")
|
|
238
239
|
return message.content;
|
|
239
240
|
return message.content.map((part) => (part.type === "text" ? part.text : "")).join("");
|
|
240
241
|
}
|
|
241
242
|
const WORKING_MEMORY_TOOL_ID = "update_working_memory";
|
|
242
|
-
function compactionPolicy(deps, analysisId,
|
|
243
|
+
function compactionPolicy(deps, analysisId, threadType, agent) {
|
|
243
244
|
if (agent.compaction === undefined)
|
|
244
245
|
return undefined;
|
|
245
246
|
// A report thread reads a frozen copy of the working memory, thus its agent declares no memory tool.
|
|
246
247
|
const remembers = agent.tools.some((tool) => tool.id === WORKING_MEMORY_TOOL_ID);
|
|
247
248
|
const workingMemory = createWorkingMemory(deps.pool);
|
|
248
|
-
// A streaming provider sends each text delta with no source, thus a delta of the summary would show as a reply.
|
|
249
|
-
const provider = params.chat((event) => (event.type === "text-delta" ? undefined : emit(event)));
|
|
250
249
|
return {
|
|
251
250
|
// The capabilities are read for each turn, because a host can switch the model of the conversation between turns.
|
|
252
|
-
...rulesForContextWindow(agent.compaction, provider.capabilities.contextWindow),
|
|
253
|
-
provider,
|
|
251
|
+
...rulesForContextWindow(agent.compaction, deps.provider.capabilities.contextWindow),
|
|
254
252
|
request: remembers ? MEMORY_COMPACTION_REQUEST : SUMMARY_COMPACTION_REQUEST,
|
|
255
253
|
mask: remembers ? { allow: [WORKING_MEMORY_TOOL_ID] } : "none",
|
|
256
254
|
keepFirstTurn: threadType === "report",
|
|
257
255
|
recordsAfter: async (view) => contextRecordsFor({ threadType, analysisId, workingMemory, ...(await readTurnContext(deps.pool, analysisId)) }, view),
|
|
258
256
|
};
|
|
259
257
|
}
|
|
258
|
+
/**
|
|
259
|
+
* The machine code of a failure, which the end frame of a turn carries for a host. A turn workflow pauses on a
|
|
260
|
+
* suspend error, a refused or missing credential, and an outage, thus their codes come only from a turn with no
|
|
261
|
+
* workflow: the suspend reason of the host, `credential`, or `outage`. Each other provider error gives `provider`,
|
|
262
|
+
* and each other error gives `internal`.
|
|
263
|
+
*/
|
|
264
|
+
function failureCodeOf(err) {
|
|
265
|
+
if (isTurnCredentialMissing(err))
|
|
266
|
+
return "credential";
|
|
267
|
+
const failure = modelFailureOf(err);
|
|
268
|
+
switch (failure.kind) {
|
|
269
|
+
case "billing":
|
|
270
|
+
return failure.reason;
|
|
271
|
+
case "credential":
|
|
272
|
+
return "credential";
|
|
273
|
+
case "outage":
|
|
274
|
+
return "outage";
|
|
275
|
+
case "other":
|
|
276
|
+
return findProviderError(err) === undefined ? "internal" : "provider";
|
|
277
|
+
}
|
|
278
|
+
}
|
|
260
279
|
/** The reason of a failed turn. It never holds the error message, because each later turn sends the note to the vendor. */
|
|
261
280
|
function failureReasonOf(err) {
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
281
|
+
if (isTurnCredentialMissing(err))
|
|
282
|
+
return "The turn has no credential of its user.";
|
|
283
|
+
const failure = modelFailureOf(err);
|
|
284
|
+
switch (failure.kind) {
|
|
285
|
+
case "billing":
|
|
286
|
+
return failure.reason;
|
|
287
|
+
case "credential":
|
|
288
|
+
return "The model endpoint refused the credential.";
|
|
289
|
+
case "outage":
|
|
290
|
+
return "The model request failed.";
|
|
291
|
+
case "other":
|
|
292
|
+
return findProviderError(err) === undefined ? "The turn stopped on an internal error." : "The model request failed.";
|
|
293
|
+
}
|
|
271
294
|
}
|
|
272
295
|
/**
|
|
273
296
|
* The note of an aborted turn. Without it, the next turn reads the request of the aborted turn as open, and
|
|
@@ -38,6 +38,8 @@
|
|
|
38
38
|
* form resolves to the same file in every frame, including the conversation agent's, so
|
|
39
39
|
* the projection is unconditional.
|
|
40
40
|
*/
|
|
41
|
+
import { presentFirst } from "../lib/present.js";
|
|
42
|
+
import { collapseWhitespace } from "../lib/text.js";
|
|
41
43
|
import { toAnalysisRootPath } from "../workspace/paths.js";
|
|
42
44
|
import { profileCaveats, profileDimensions, profileFileRecords, profileGroups } from "./data-profile-view.js";
|
|
43
45
|
/**
|
|
@@ -99,11 +101,11 @@ function clamp(text, max) {
|
|
|
99
101
|
* keeps one record on one line.
|
|
100
102
|
*/
|
|
101
103
|
function clip(text, max) {
|
|
102
|
-
return clamp(text
|
|
104
|
+
return clamp(collapseWhitespace(text), max);
|
|
103
105
|
}
|
|
104
106
|
/** Non-empty, whitespace-collapsed value, or `undefined` — nulls and blanks read the same. */
|
|
105
107
|
function present(value) {
|
|
106
|
-
const flat = value
|
|
108
|
+
const flat = value === null || value === undefined ? undefined : collapseWhitespace(value);
|
|
107
109
|
return flat ? flat : undefined;
|
|
108
110
|
}
|
|
109
111
|
/** `Homo sapiens (taxon 9606)`, plus a confidence marker when the profiler was unsure. */
|
|
@@ -128,9 +130,9 @@ function identityLine(result) {
|
|
|
128
130
|
const identity = [
|
|
129
131
|
[present(result.domain), present(result.subtype)].filter((f) => f !== undefined).join(" / ") || undefined,
|
|
130
132
|
formatOrganism(result.organism),
|
|
131
|
-
present(result.tissue) ? `tissue: ${present(result.tissue)}` : undefined,
|
|
132
|
-
present(result.cellType) ? `cells: ${present(result.cellType)}` : undefined,
|
|
133
|
-
present(result.condition) ? `condition: ${present(result.condition)}` : undefined,
|
|
133
|
+
present(result.tissue) ? `tissue: ${String(present(result.tissue))}` : undefined,
|
|
134
|
+
present(result.cellType) ? `cells: ${String(present(result.cellType))}` : undefined,
|
|
135
|
+
present(result.condition) ? `condition: ${String(present(result.condition))}` : undefined,
|
|
134
136
|
].filter((f) => f !== undefined);
|
|
135
137
|
return `Dataset: ${identity.length > 0 ? identity.join(" — ") : clip(result.summary, MAX_IDENTITY_CHARS)}`;
|
|
136
138
|
}
|
|
@@ -175,7 +177,7 @@ function formatCensus(view, group) {
|
|
|
175
177
|
if (formats.length === 0)
|
|
176
178
|
return present(view.format);
|
|
177
179
|
if (formats.length === 1)
|
|
178
|
-
return present(formats
|
|
180
|
+
return present(presentFirst(formats, "the single group format").format);
|
|
179
181
|
const shown = formats.slice(0, MAX_GROUP_FORMATS).map((entry) => `${entry.format} ${entry.count}`);
|
|
180
182
|
return `${shown.join(", ")}${formats.length > shown.length ? `, +${formats.length - shown.length}` : ""}`;
|
|
181
183
|
}
|
|
@@ -278,7 +280,7 @@ function caveatsSection(caveats, budget) {
|
|
|
278
280
|
return line;
|
|
279
281
|
}
|
|
280
282
|
const room = budget - render([""]).length;
|
|
281
|
-
return room >= MIN_PROSE_CHARS ? render([clamp(capped
|
|
283
|
+
return room >= MIN_PROSE_CHARS ? render([clamp(presentFirst(capped, "the shortened caveat"), room)]) : undefined;
|
|
282
284
|
}
|
|
283
285
|
/**
|
|
284
286
|
* Fit the body sections into `budget`, in order, each one whole or absent.
|
|
@@ -380,7 +382,7 @@ export function buildDataProfileOrientation(result, analysisId, maxChars = DATA_
|
|
|
380
382
|
// what remains, so the one line saying how much of the dataset is accounted for
|
|
381
383
|
// cannot be the line the body's budget drops.
|
|
382
384
|
const identityBudget = Math.max(0, Math.min(MAX_IDENTITY_CHARS, maxChars - (census ? census.length + 1 : 0)));
|
|
383
|
-
const header = [clamp(identityLine(result), identityBudget), census].
|
|
385
|
+
const header = [clamp(identityLine(result), identityBudget), census].flatMap((line) => (line ? [line] : [])).join("\n");
|
|
384
386
|
const headerText = clamp(header, maxChars);
|
|
385
387
|
const bodyBudget = maxChars - headerText.length - 1;
|
|
386
388
|
if (bodyBudget <= 0)
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
*/
|
|
14
14
|
import type { DataProfileDimension, DataProfileFile, DataProfileResult } from "../contracts/data-profile.js";
|
|
15
15
|
/** A group as consumers read it, whether it was authored as a group or as a kind. */
|
|
16
|
-
export
|
|
16
|
+
export type ProfileGroupView = {
|
|
17
17
|
readonly id: string;
|
|
18
18
|
readonly name: string;
|
|
19
19
|
readonly memberRepresents: string;
|
|
@@ -26,18 +26,18 @@ export interface ProfileGroupView {
|
|
|
26
26
|
/** The scanner slots this group carries, on a groups-era row. */
|
|
27
27
|
readonly slotIds?: readonly string[];
|
|
28
28
|
readonly unclassified?: boolean;
|
|
29
|
-
}
|
|
29
|
+
};
|
|
30
30
|
/**
|
|
31
31
|
* A dimension as consumers read it. `cardinalities` carries every number the
|
|
32
32
|
* observations reported, side by side: there is no canonical count, and a single field
|
|
33
33
|
* would be a silent judgement between disagreeing sources.
|
|
34
34
|
*/
|
|
35
|
-
export
|
|
35
|
+
export type ProfileDimensionView = {
|
|
36
36
|
readonly label: string;
|
|
37
37
|
readonly cardinalities: readonly number[];
|
|
38
38
|
readonly exampleValues: readonly string[];
|
|
39
39
|
readonly description?: string;
|
|
40
|
-
}
|
|
40
|
+
};
|
|
41
41
|
/**
|
|
42
42
|
* Every number the observations reported, side by side and de-duplicated.
|
|
43
43
|
*
|