@inflexa-ai/harness 0.45.1 → 0.46.0
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 +307 -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 +23 -7
- package/dist/lib/hooks.js +17 -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 +161 -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 +34 -0
- package/dist/loop/turn-credentials.js +73 -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/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 +60 -0
- package/dist/testing.js +96 -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/loop/types.d.ts
CHANGED
|
@@ -1,15 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
* `runAgent` (run-agent.ts) is a pure-async function: it owns the message
|
|
5
|
-
* loop and nothing else. Durability and streaming are *injected* — a
|
|
6
|
-
* `RunStep` wraps each LLM/tool call (`passthroughStep` for chat, a
|
|
7
|
-
* `DBOS.runStep` wrapper in PR #3) and an `EmitFn` is the flat event sink.
|
|
8
|
-
* The loop body itself knows nothing about DBOS, HTTP, or memory.
|
|
2
|
+
* The shared types of the agent loop: the definition of an agent, its
|
|
3
|
+
* messages, and the flat event sink.
|
|
9
4
|
*/
|
|
10
5
|
import type { ModelMessage } from "ai";
|
|
11
6
|
import type { ToolCallDetail, ToolOutcome } from "../contracts/chat-events.js";
|
|
12
|
-
import type { ChatStreamEvent } from "../providers/types.js";
|
|
7
|
+
import type { ChatStreamEvent, ProviderOptions } from "../providers/types.js";
|
|
13
8
|
import type { Tool } from "../tools/define-tool.js";
|
|
14
9
|
import type { CompactionRules } from "./compaction.js";
|
|
15
10
|
/**
|
|
@@ -18,37 +13,37 @@ import type { CompactionRules } from "./compaction.js";
|
|
|
18
13
|
*/
|
|
19
14
|
export type LoopMessage = ModelMessage;
|
|
20
15
|
/**
|
|
21
|
-
* Everything
|
|
16
|
+
* Everything the loop needs to drive one agent: identity, the system
|
|
22
17
|
* prompt, the model id (provenance / metric label — the `ChatProvider`
|
|
23
18
|
* owns the wire model), the tool surface, and the runaway-guard cap.
|
|
24
19
|
*/
|
|
25
|
-
export
|
|
20
|
+
export type AgentDefinition = {
|
|
26
21
|
readonly id: string;
|
|
27
22
|
readonly systemPrompt: string;
|
|
28
23
|
readonly model: string;
|
|
29
24
|
readonly tools: readonly Tool[];
|
|
30
|
-
/** Runaway guard:
|
|
25
|
+
/** Runaway guard: the cap of model requests of one run. The run ends at the cap. */
|
|
31
26
|
readonly maxIterations: number;
|
|
32
27
|
/** The compaction rules of an agent that a chat thread runs. Absent: the conversation never compacts. */
|
|
33
28
|
readonly compaction?: CompactionRules;
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
29
|
+
/**
|
|
30
|
+
* Provider options that each request of the agent sends, beside the options of
|
|
31
|
+
* the provider. They are part of the agent, thus each request of a
|
|
32
|
+
* conversation sends the same options.
|
|
33
|
+
*/
|
|
34
|
+
readonly providerOptions?: ProviderOptions;
|
|
35
|
+
};
|
|
41
36
|
/**
|
|
42
37
|
* Provenance stamped onto every orchestration event — the agent call
|
|
43
38
|
* chain at the point of emission, derived from the `Session` (see the harness-durable-runtime spec).
|
|
44
39
|
* `callPath` is provenance only; nothing branches on it.
|
|
45
40
|
*/
|
|
46
|
-
export
|
|
41
|
+
export type EventSource = {
|
|
47
42
|
readonly agentId: string;
|
|
48
43
|
readonly callPath: readonly string[];
|
|
49
44
|
/** The id of the tool call that runs this loop. For a data profile, the workflow id of its attempt. */
|
|
50
45
|
readonly invocationId?: string;
|
|
51
|
-
}
|
|
46
|
+
};
|
|
52
47
|
/**
|
|
53
48
|
* Orchestration events the loop emits: iteration boundaries and tool-call
|
|
54
49
|
* lifecycle. Distinct from `ChatStreamEvent` (model-output text deltas) —
|
|
@@ -57,12 +52,9 @@ export interface EventSource {
|
|
|
57
52
|
export type EmitEvent = {
|
|
58
53
|
readonly type: "iteration";
|
|
59
54
|
readonly source: EventSource;
|
|
60
|
-
/** Zero-based.
|
|
55
|
+
/** Zero-based. A follow-up request counts from 0. */
|
|
61
56
|
readonly index: number;
|
|
62
|
-
/**
|
|
63
|
-
* True when this iteration produced the loop's terminal reply, including
|
|
64
|
-
* the last wrap-up even when its reply called a tool.
|
|
65
|
-
*/
|
|
57
|
+
/** True when this request produced the terminal reply of the loop. */
|
|
66
58
|
readonly final: boolean;
|
|
67
59
|
} | {
|
|
68
60
|
readonly type: "tool-started";
|
|
@@ -90,16 +82,9 @@ export type EmitEvent = {
|
|
|
90
82
|
/** The same detail the matching `tool-started` carried. */
|
|
91
83
|
readonly detail?: ToolCallDetail;
|
|
92
84
|
/**
|
|
93
|
-
* The time
|
|
94
|
-
*
|
|
95
|
-
*
|
|
96
|
-
* `tool-started` of a round before it dispatches anything, and every
|
|
97
|
-
* `tool-finished` after the round settles. Thus a host that brackets
|
|
98
|
-
* the two events measures the round, and each call of a multi-call
|
|
99
|
-
* round reports the same figure.
|
|
100
|
-
*
|
|
101
|
-
* The field is optional, and it is absent when no measurement was
|
|
102
|
-
* taken. As a result a host can fall back to its own observation.
|
|
85
|
+
* The time of this call itself, in milliseconds, measured inside its
|
|
86
|
+
* step. A refused call did not run, thus it has no figure, and a host
|
|
87
|
+
* can fall back to its own observation.
|
|
103
88
|
*/
|
|
104
89
|
readonly durationMs?: number;
|
|
105
90
|
} | {
|
|
@@ -107,7 +92,13 @@ export type EmitEvent = {
|
|
|
107
92
|
readonly type: "message-start";
|
|
108
93
|
readonly source: EventSource;
|
|
109
94
|
readonly messageId: string;
|
|
110
|
-
readonly role: "user"
|
|
95
|
+
readonly role: "user";
|
|
96
|
+
readonly text: string;
|
|
97
|
+
} | {
|
|
98
|
+
readonly type: "message-start";
|
|
99
|
+
readonly source: EventSource;
|
|
100
|
+
readonly messageId: string;
|
|
101
|
+
readonly role: "assistant";
|
|
111
102
|
};
|
|
112
103
|
/**
|
|
113
104
|
* A UI presentation event a tool streams to chat — an AI-SDK `data-*`
|
|
@@ -115,7 +106,7 @@ export type EmitEvent = {
|
|
|
115
106
|
* synthesized content). The loop and `emit` are agnostic to the payload
|
|
116
107
|
* shape; the typed contract lives in `harness/contracts`.
|
|
117
108
|
*/
|
|
118
|
-
export
|
|
109
|
+
export type ChatDataPart = {
|
|
119
110
|
readonly type: `data-${string}`;
|
|
120
111
|
readonly data: unknown;
|
|
121
112
|
/**
|
|
@@ -125,7 +116,7 @@ export interface ChatDataPart {
|
|
|
125
116
|
* routing envelopes).
|
|
126
117
|
*/
|
|
127
118
|
readonly source?: EventSource;
|
|
128
|
-
}
|
|
119
|
+
};
|
|
129
120
|
/**
|
|
130
121
|
* The flat event sink. One function reference flows unchanged through
|
|
131
122
|
* every nesting level. It carries three event categories: orchestration
|
package/dist/loop/types.js
CHANGED
|
@@ -1,10 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
* `runAgent` (run-agent.ts) is a pure-async function: it owns the message
|
|
5
|
-
* loop and nothing else. Durability and streaming are *injected* — a
|
|
6
|
-
* `RunStep` wraps each LLM/tool call (`passthroughStep` for chat, a
|
|
7
|
-
* `DBOS.runStep` wrapper in PR #3) and an `EmitFn` is the flat event sink.
|
|
8
|
-
* The loop body itself knows nothing about DBOS, HTTP, or memory.
|
|
2
|
+
* The shared types of the agent loop: the definition of an agent, its
|
|
3
|
+
* messages, and the flat event sink.
|
|
9
4
|
*/
|
|
10
5
|
export {};
|
|
@@ -118,20 +118,20 @@ declare const CompactionMarkerSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
|
118
118
|
tokensBefore: z.ZodNumber;
|
|
119
119
|
durationMs: z.ZodNumber;
|
|
120
120
|
trigger: z.ZodOptional<z.ZodEnum<{
|
|
121
|
-
"turn-start": "turn-start";
|
|
122
121
|
"mid-turn": "mid-turn";
|
|
122
|
+
"turn-start": "turn-start";
|
|
123
123
|
}>>;
|
|
124
124
|
kind: z.ZodLiteral<"summary">;
|
|
125
125
|
}, z.core.$strip>, z.ZodObject<{
|
|
126
|
-
keptTurns: z.ZodNumber;
|
|
127
126
|
id: z.ZodString;
|
|
128
127
|
tokensBefore: z.ZodNumber;
|
|
129
128
|
durationMs: z.ZodNumber;
|
|
130
129
|
trigger: z.ZodOptional<z.ZodEnum<{
|
|
131
|
-
"turn-start": "turn-start";
|
|
132
130
|
"mid-turn": "mid-turn";
|
|
131
|
+
"turn-start": "turn-start";
|
|
133
132
|
}>>;
|
|
134
133
|
kind: z.ZodLiteral<"drop">;
|
|
134
|
+
keptTurns: z.ZodNumber;
|
|
135
135
|
}, z.core.$strip>], "kind">;
|
|
136
136
|
export type CompactionMarker = z.infer<typeof CompactionMarkerSchema>;
|
|
137
137
|
/** The {@link HARNESS_PROVIDER_NAMESPACE} key that holds the input tokens that the provider reported for the request of an assistant message. */
|
|
@@ -152,11 +152,11 @@ export declare function dropMarkerMessage(marker: Extract<CompactionMarker, {
|
|
|
152
152
|
}>): ModelMessage;
|
|
153
153
|
export declare function compactionMarkerOf(message: ModelMessage): CompactionMarker | undefined;
|
|
154
154
|
type LegacyContent = string | Array<Record<string, unknown>>;
|
|
155
|
-
export
|
|
155
|
+
export type LegacyMessageRow = {
|
|
156
156
|
readonly threadId: string;
|
|
157
157
|
readonly seq: number;
|
|
158
158
|
readonly role: string;
|
|
159
159
|
readonly content: LegacyContent;
|
|
160
|
-
}
|
|
160
|
+
};
|
|
161
161
|
export declare function legacyAnthropicToModelMessage(row: LegacyMessageRow): ModelMessage;
|
|
162
162
|
export {};
|
|
@@ -1,5 +1,8 @@
|
|
|
1
|
+
import { textOf } from "../lib/unknown-text.js";
|
|
2
|
+
import { parseUnknownRecord } from "../lib/unknown-containers.js";
|
|
1
3
|
import { createHash } from "node:crypto";
|
|
2
4
|
import { modelMessageSchema } from "ai";
|
|
5
|
+
import { isJSONValue } from "@ai-sdk/provider";
|
|
3
6
|
import { z } from "zod";
|
|
4
7
|
export const SUPPORTED_AI_SDK_MAJOR = 7;
|
|
5
8
|
export const StoredMessageEnvelopeSchema = z.object({
|
|
@@ -52,6 +55,7 @@ export const CONTEXT_KIND_KEY = "contextKind";
|
|
|
52
55
|
/** The {@link HARNESS_PROVIDER_NAMESPACE} key that holds the SHA-256 hex hash of the text of a context record. */
|
|
53
56
|
export const CONTEXT_HASH_KEY = "contextHash";
|
|
54
57
|
const CONTEXT_KINDS = ["analysis-context", "run-activity", "working-memory"];
|
|
58
|
+
const ContextKindSchema = z.enum(CONTEXT_KINDS);
|
|
55
59
|
/**
|
|
56
60
|
* A context record: a synthetic `user` message, and no host record, thus it opens no turn and the
|
|
57
61
|
* display does not show it.
|
|
@@ -64,17 +68,14 @@ export function contextRecordMessage(kind, text) {
|
|
|
64
68
|
providerOptions: { [HARNESS_PROVIDER_NAMESPACE]: { [SYNTHETIC_MESSAGE_KEY]: true, [CONTEXT_KIND_KEY]: kind, [CONTEXT_HASH_KEY]: hash } },
|
|
65
69
|
};
|
|
66
70
|
}
|
|
67
|
-
function isContextKind(value) {
|
|
68
|
-
return CONTEXT_KINDS.some((kind) => kind === value);
|
|
69
|
-
}
|
|
70
71
|
/** The kind and the hash of a context record, or `undefined` for a message that is no record. */
|
|
71
72
|
export function contextRecordOf(message) {
|
|
72
73
|
const harness = message.providerOptions?.[HARNESS_PROVIDER_NAMESPACE];
|
|
73
|
-
const kind = harness?.[CONTEXT_KIND_KEY];
|
|
74
|
+
const kind = ContextKindSchema.safeParse(harness?.[CONTEXT_KIND_KEY]);
|
|
74
75
|
const hash = harness?.[CONTEXT_HASH_KEY];
|
|
75
|
-
if (typeof hash !== "string" || !
|
|
76
|
+
if (typeof hash !== "string" || !kind.success)
|
|
76
77
|
return undefined;
|
|
77
|
-
return { kind, hash };
|
|
78
|
+
return { kind: kind.data, hash };
|
|
78
79
|
}
|
|
79
80
|
/**
|
|
80
81
|
* Return a copy of `message` carrying the interruption marker in the harness namespace.
|
|
@@ -232,8 +233,9 @@ function providerOptionsFromLegacy(block) {
|
|
|
232
233
|
const anthropic = {};
|
|
233
234
|
if (typeof block.signature === "string")
|
|
234
235
|
anthropic.signature = block.signature;
|
|
235
|
-
|
|
236
|
-
|
|
236
|
+
const cacheControl = block.cache_control;
|
|
237
|
+
if (cacheControl !== null && isJSONValue(cacheControl) && parseUnknownRecord(cacheControl) !== undefined) {
|
|
238
|
+
anthropic.cacheControl = cacheControl;
|
|
237
239
|
}
|
|
238
240
|
return Object.keys(anthropic).length > 0 ? { anthropic } : undefined;
|
|
239
241
|
}
|
|
@@ -268,9 +270,9 @@ export function legacyAnthropicToModelMessage(row) {
|
|
|
268
270
|
}
|
|
269
271
|
const unrepresentable = content.find((block) => !(block.type === "text" && typeof block.text === "string"));
|
|
270
272
|
if (unrepresentable !== undefined) {
|
|
271
|
-
throw new Error(`Legacy user row ${row.threadId}/${row.seq} contains unrepresentable block type "${
|
|
273
|
+
throw new Error(`Legacy user row ${row.threadId}/${row.seq} contains unrepresentable block type "${textOf(unrepresentable.type)}"; failing rather than writing a lossy envelope`);
|
|
272
274
|
}
|
|
273
|
-
const userContent = content.map((block) => ({ type: "text", text:
|
|
275
|
+
const userContent = content.map((block) => ({ type: "text", text: textOf(block.text), providerOptions: providerOptionsFromLegacy(block) }));
|
|
274
276
|
return {
|
|
275
277
|
role: "user",
|
|
276
278
|
content: userContent,
|
|
@@ -304,7 +306,7 @@ export function legacyAnthropicToModelMessage(row) {
|
|
|
304
306
|
}
|
|
305
307
|
// Any other block (e.g. redacted_thinking) may carry signed provider
|
|
306
308
|
// data required for continuation; fail the row instead of dropping it.
|
|
307
|
-
throw new Error(`Legacy assistant row ${row.threadId}/${row.seq} contains unrepresentable block type "${
|
|
309
|
+
throw new Error(`Legacy assistant row ${row.threadId}/${row.seq} contains unrepresentable block type "${textOf(block.type)}"; failing rather than writing a lossy envelope`);
|
|
308
310
|
}
|
|
309
311
|
return {
|
|
310
312
|
role: "assistant",
|
|
@@ -14,11 +14,11 @@
|
|
|
14
14
|
* under the part `type` directly.
|
|
15
15
|
*/
|
|
16
16
|
import { type ResultAsync } from "neverthrow";
|
|
17
|
-
import type {
|
|
17
|
+
import type { Querier } from "../state/db.js";
|
|
18
18
|
import { type DbError } from "../lib/db-result.js";
|
|
19
19
|
import type { PlanPart } from "../contracts/chat-parts.js";
|
|
20
|
-
import { type PlanRecord } from "../state/index.js";
|
|
21
|
-
export
|
|
20
|
+
import { type PlanRecord, type PlanRowQuerier } from "../state/index.js";
|
|
21
|
+
export type PlanCardData = {
|
|
22
22
|
id: string;
|
|
23
23
|
planId: string;
|
|
24
24
|
parentPlanId?: string;
|
|
@@ -27,19 +27,19 @@ export interface PlanCardData {
|
|
|
27
27
|
analytical_narrative: unknown;
|
|
28
28
|
omicsType: unknown;
|
|
29
29
|
omicsSubtype: unknown;
|
|
30
|
-
}
|
|
31
|
-
export
|
|
30
|
+
};
|
|
31
|
+
export type PresentationCardData = {
|
|
32
32
|
id: string;
|
|
33
33
|
title?: string;
|
|
34
34
|
content: Record<string, unknown>;
|
|
35
|
-
}
|
|
36
|
-
export
|
|
35
|
+
};
|
|
36
|
+
export type RunCardData = {
|
|
37
37
|
id: string;
|
|
38
38
|
runId: string;
|
|
39
39
|
planId: string;
|
|
40
40
|
title: string;
|
|
41
41
|
stepCount: number;
|
|
42
|
-
}
|
|
42
|
+
};
|
|
43
43
|
/** Build the `data-plan` payload of a stored plan record. `null` when the
|
|
44
44
|
* document no longer parses. An explicit `title` overrides the plan title. */
|
|
45
45
|
export declare function planCardOf(record: PlanRecord, title?: string): PlanCardData | null;
|
|
@@ -51,14 +51,14 @@ export declare function planPartOf(record: PlanRecord): PlanPart | null;
|
|
|
51
51
|
/** Build the `data-plan` payload by loading the stored plan. `ok(null)` when
|
|
52
52
|
* the plan is missing or no longer parses (absence is NOT an error) — the
|
|
53
53
|
* caller falls back to a chip. */
|
|
54
|
-
export declare function buildPlanCardData(pool:
|
|
54
|
+
export declare function buildPlanCardData(pool: PlanRowQuerier, planId: string, analysisId: string, title?: string): ResultAsync<PlanCardData | null, DbError>;
|
|
55
55
|
/** Build the `data-run-card` payload for a started analysis run. Loads the
|
|
56
56
|
* plan (for `title` + `stepCount`) the same way `buildPlanCardData` does. The
|
|
57
57
|
* live emit path passes the freshly-minted `runId`; the reconstruct-on-read
|
|
58
58
|
* path omits it and the most recent run for `(analysisId, planId)` is looked
|
|
59
59
|
* up from `cortex_runs`. Null when the plan or run cannot be resolved — the
|
|
60
60
|
* caller falls back to a chip. */
|
|
61
|
-
export declare function buildRunCardData(pool:
|
|
61
|
+
export declare function buildRunCardData(pool: Querier, opts: {
|
|
62
62
|
planId: string;
|
|
63
63
|
analysisId: string;
|
|
64
64
|
runId?: string;
|
|
@@ -82,17 +82,17 @@ export declare function buildPresentationCardData(input: Record<string, unknown>
|
|
|
82
82
|
/** Max files a `show_file` group may reference; multiple render as a gallery. */
|
|
83
83
|
export declare const MAX_FILES = 10;
|
|
84
84
|
/** One referenced file in a `data-file-reference` card. */
|
|
85
|
-
export
|
|
85
|
+
export type FileReferenceEntryData = {
|
|
86
86
|
path: string;
|
|
87
87
|
runId?: string;
|
|
88
88
|
caption?: string;
|
|
89
|
-
}
|
|
89
|
+
};
|
|
90
90
|
/** The `data-file-reference` payload: a group of referenced analysis artifacts. */
|
|
91
|
-
export
|
|
91
|
+
export type FileReferenceCardData = {
|
|
92
92
|
id: string;
|
|
93
93
|
title?: string;
|
|
94
94
|
files: FileReferenceEntryData[];
|
|
95
|
-
}
|
|
95
|
+
};
|
|
96
96
|
/** Extracts `runId` from paths shaped `runs/{runId}/...`; undefined otherwise. */
|
|
97
97
|
export declare function deriveRunId(path: string): string | undefined;
|
|
98
98
|
/** Stable dedup key over sorted paths + optional title. */
|
|
@@ -16,15 +16,13 @@
|
|
|
16
16
|
import { createHash } from "node:crypto";
|
|
17
17
|
import { okAsync } from "neverthrow";
|
|
18
18
|
import { tryQuery } from "../lib/db-result.js";
|
|
19
|
+
import { parseUnknownRecord } from "../lib/unknown-containers.js";
|
|
19
20
|
import { PlanPartSchema } from "../contracts/schemas/chat-parts.js";
|
|
20
21
|
import { AnalysisPlanSchema } from "../schemas/workflow-state.js";
|
|
21
22
|
import { loadPlan, loadPlanRecord } from "../state/index.js";
|
|
22
23
|
import { parseStructureUrl } from "../contracts/structure-source.js";
|
|
23
24
|
import { normalizeEchartSpec } from "../tools/display/normalize-echart-spec.js";
|
|
24
25
|
import { validatePath } from "../tools/lib/path-validation.js";
|
|
25
|
-
function isRecord(value) {
|
|
26
|
-
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
27
|
-
}
|
|
28
26
|
/** Deterministic presentation id — must match `show_user`'s. */
|
|
29
27
|
function presentationId(input) {
|
|
30
28
|
const hash = createHash("sha256")
|
|
@@ -43,16 +41,18 @@ export function planCardOf(record, title) {
|
|
|
43
41
|
// Explicit `show_plan({ title })` overrides; otherwise default to the
|
|
44
42
|
// planner-set plan title so both cards share one source.
|
|
45
43
|
const heading = title ?? parsed.data.title;
|
|
46
|
-
|
|
44
|
+
const card = {
|
|
47
45
|
id,
|
|
48
46
|
planId: record.planId,
|
|
49
|
-
|
|
50
|
-
...(heading !== undefined ? { title: heading } : {}),
|
|
47
|
+
title: heading,
|
|
51
48
|
steps: parsed.data.steps,
|
|
52
49
|
analytical_narrative: parsed.data.analytical_narrative,
|
|
53
50
|
omicsType: parsed.data.omicsType,
|
|
54
51
|
omicsSubtype: parsed.data.omicsSubtype,
|
|
55
52
|
};
|
|
53
|
+
if (record.parentPlanId !== null)
|
|
54
|
+
card.parentPlanId = record.parentPlanId;
|
|
55
|
+
return card;
|
|
56
56
|
}
|
|
57
57
|
/** The `data-plan` part of a stored plan record, with the title of the plan. The
|
|
58
58
|
* part schema drops each key that it does not name, thus the part equals the
|
|
@@ -139,8 +139,9 @@ export function buildPresentationCardData(input) {
|
|
|
139
139
|
return null;
|
|
140
140
|
content = { kind, format: source.format, url: source.url, provider: source.provider, accession: source.accession, version: source.version };
|
|
141
141
|
}
|
|
142
|
-
else if (kind === "echart"
|
|
143
|
-
|
|
142
|
+
else if (kind === "echart") {
|
|
143
|
+
const spec = parseUnknownRecord(rest.spec);
|
|
144
|
+
content = spec !== undefined ? { kind, ...rest, spec: normalizeEchartSpec(spec, { title: cardTitle }) } : { kind, ...rest };
|
|
144
145
|
}
|
|
145
146
|
else {
|
|
146
147
|
// Every other kind (and an echart the model called without a `spec`) is carried through
|
|
@@ -149,7 +150,7 @@ export function buildPresentationCardData(input) {
|
|
|
149
150
|
}
|
|
150
151
|
return {
|
|
151
152
|
id: presentationId(input),
|
|
152
|
-
|
|
153
|
+
title: cardTitle,
|
|
153
154
|
content,
|
|
154
155
|
};
|
|
155
156
|
}
|
|
@@ -158,8 +159,9 @@ export const MAX_FILES = 10;
|
|
|
158
159
|
/** Extracts `runId` from paths shaped `runs/{runId}/...`; undefined otherwise. */
|
|
159
160
|
export function deriveRunId(path) {
|
|
160
161
|
const segments = path.split("/");
|
|
161
|
-
|
|
162
|
-
|
|
162
|
+
const runId = segments[1];
|
|
163
|
+
if (segments.length >= 2 && segments[0] === "runs" && runId !== undefined && runId.length > 0) {
|
|
164
|
+
return runId;
|
|
163
165
|
}
|
|
164
166
|
return undefined;
|
|
165
167
|
}
|
|
@@ -185,7 +187,9 @@ export function buildFileReferenceCardData(input) {
|
|
|
185
187
|
return null;
|
|
186
188
|
const files = [];
|
|
187
189
|
for (const raw of rawFiles) {
|
|
188
|
-
const file = (raw
|
|
190
|
+
const file = parseUnknownRecord(raw);
|
|
191
|
+
if (file === undefined)
|
|
192
|
+
return null;
|
|
189
193
|
const path = typeof file.path === "string" ? file.path : "";
|
|
190
194
|
if (validatePath(path) !== null)
|
|
191
195
|
return null;
|
|
@@ -193,10 +197,10 @@ export function buildFileReferenceCardData(input) {
|
|
|
193
197
|
const caption = typeof file.caption === "string" ? file.caption : undefined;
|
|
194
198
|
files.push({
|
|
195
199
|
path,
|
|
196
|
-
|
|
197
|
-
|
|
200
|
+
runId,
|
|
201
|
+
caption,
|
|
198
202
|
});
|
|
199
203
|
}
|
|
200
204
|
const id = `pres-${fileGroupHash(files.map((f) => f.path), title)}`;
|
|
201
|
-
return { id,
|
|
205
|
+
return { id, title, files };
|
|
202
206
|
}
|
|
@@ -1,8 +1,18 @@
|
|
|
1
1
|
import type { ModelMessage } from "ai";
|
|
2
|
+
import type { ChatFrame } from "../contracts/chat-events.js";
|
|
2
3
|
import type { EmitFn } from "../loop/types.js";
|
|
3
4
|
import { type ConversationUIMessage } from "./conversation-display-storage.js";
|
|
4
|
-
export
|
|
5
|
+
export type ConversationDisplayRecorder = {
|
|
5
6
|
readonly emit: EmitFn;
|
|
7
|
+
/**
|
|
8
|
+
* Record one frame that reached the stream of the turn by another path, and forward nothing. A turn workflow
|
|
9
|
+
* records each frame of its stream with it, the frames that a replay of a tool step gives again included.
|
|
10
|
+
*/
|
|
11
|
+
observe(frame: ChatFrame): void;
|
|
12
|
+
/** The id of the assistant message that the next parts go to. A marker of a round gives the next message a new id. */
|
|
13
|
+
assistantMessageId(): string;
|
|
14
|
+
/** The id of the user message of the turn. */
|
|
15
|
+
userMessageId(): string;
|
|
6
16
|
/** The user message of the turn. */
|
|
7
17
|
takeOpening(): ConversationUIMessage[];
|
|
8
18
|
/** The assistant message of one round, when the recorder got parts after the last take, and the divider of a marker of the round. */
|
|
@@ -12,15 +22,23 @@ export interface ConversationDisplayRecorder {
|
|
|
12
22
|
readonly fallbackText?: string;
|
|
13
23
|
readonly interrupted?: boolean;
|
|
14
24
|
}): ConversationUIMessage[];
|
|
15
|
-
}
|
|
16
|
-
export
|
|
25
|
+
};
|
|
26
|
+
export type ConversationDisplayRecorderOptions = {
|
|
17
27
|
readonly userText: string;
|
|
18
28
|
/** The root agent of the turn. Its call path is `[agentId]`, and an event with a longer path is from a sub-agent. */
|
|
19
29
|
readonly agentId: string;
|
|
20
30
|
readonly sink: EmitFn;
|
|
21
31
|
/** The clock for the times of the sub-agent activity, in milliseconds. The default is the wall clock. */
|
|
22
32
|
readonly now?: () => number;
|
|
23
|
-
|
|
33
|
+
/**
|
|
34
|
+
* The ids of the messages of the turn: the user message, and the assistant message after each marker, from 0 on.
|
|
35
|
+
* A turn workflow gives ids from its turn id, thus a replay gives the same ids. The default is a random id.
|
|
36
|
+
*/
|
|
37
|
+
readonly messageIds?: {
|
|
38
|
+
readonly user: string;
|
|
39
|
+
readonly assistant: (index: number) => string;
|
|
40
|
+
};
|
|
41
|
+
};
|
|
24
42
|
/**
|
|
25
43
|
* Record the display of a turn through the same translation path as a live surface: each event becomes a
|
|
26
44
|
* frame (`toChatFrame`), and the frames build the messages of the round (`applyChatFrame`). Only a part that
|
|
@@ -3,15 +3,19 @@ import { applyChatFrame, checkChatPart, isRootFrame, toChatFrame } from "../cont
|
|
|
3
3
|
import { PART_REGISTRY } from "../contracts/part-registry.js";
|
|
4
4
|
import { createSubAgentActivityTracker } from "../contracts/subagent-activity.js";
|
|
5
5
|
import { compactionExchangeOf, compactionMarkerOf } from "./ai-sdk-message-storage.js";
|
|
6
|
-
import { conversationDisplayPart } from "./conversation-display-storage.js";
|
|
6
|
+
import { conversationDisplayPart, isStoredSourcePart } from "./conversation-display-storage.js";
|
|
7
7
|
function jsonCopy(value) {
|
|
8
|
-
return
|
|
8
|
+
return structuredClone(value);
|
|
9
9
|
}
|
|
10
|
+
const DURABLE_CONVERSATION_PART_TYPES = new Set(Object.entries(PART_REGISTRY)
|
|
11
|
+
.filter(([, descriptor]) => descriptor.emitter === "conversation" && descriptor.consumer === "conversation" && !descriptor.transient)
|
|
12
|
+
.map(([type]) => type));
|
|
10
13
|
function durableConversationType(type) {
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
14
|
+
return DURABLE_CONVERSATION_PART_TYPES.has(type);
|
|
15
|
+
}
|
|
16
|
+
/** Each chat event type is named without the `data-` prefix, thus a `data-` frame is a part frame. */
|
|
17
|
+
function isPartFrame(frame) {
|
|
18
|
+
return frame.type.startsWith("data-");
|
|
15
19
|
}
|
|
16
20
|
/** The checked part of a data frame, copied at receipt, because the emitter keeps its own reference to the payload. */
|
|
17
21
|
function recordedPart(frame) {
|
|
@@ -28,6 +32,8 @@ function displayParts(parts) {
|
|
|
28
32
|
return parts.flatMap((part) => {
|
|
29
33
|
if (part.type === "text")
|
|
30
34
|
return part.text.length === 0 ? [] : [{ type: "text", text: part.text, state: "done" }];
|
|
35
|
+
if (!isStoredSourcePart(part))
|
|
36
|
+
return [];
|
|
31
37
|
if (part.type === "data-ask" && part.status === "pending")
|
|
32
38
|
return [conversationDisplayPart({ ...part, status: "aborted" })];
|
|
33
39
|
return [conversationDisplayPart(part)];
|
|
@@ -47,14 +53,16 @@ function assistantText(messages) {
|
|
|
47
53
|
}
|
|
48
54
|
/** The divider of a compaction marker: a `system` message with the part at the final status of the compaction. */
|
|
49
55
|
function compactionDivider(marker) {
|
|
50
|
-
const
|
|
56
|
+
const compaction = {
|
|
51
57
|
type: "data-compaction",
|
|
52
58
|
id: marker.id,
|
|
53
59
|
status: marker.kind === "summary" ? "done" : "failed",
|
|
54
60
|
tokensBefore: marker.tokensBefore,
|
|
55
61
|
durationMs: marker.durationMs,
|
|
56
|
-
|
|
57
|
-
|
|
62
|
+
};
|
|
63
|
+
if (marker.trigger !== undefined)
|
|
64
|
+
compaction.trigger = marker.trigger;
|
|
65
|
+
const part = conversationDisplayPart(compaction);
|
|
58
66
|
return { id: marker.id, role: "system", parts: [part] };
|
|
59
67
|
}
|
|
60
68
|
/**
|
|
@@ -64,8 +72,10 @@ function compactionDivider(marker) {
|
|
|
64
72
|
*/
|
|
65
73
|
export function createConversationDisplayRecorder(options) {
|
|
66
74
|
// One id for each message of the turn, thus the rounds of a turn replay as one assistant message.
|
|
67
|
-
const userMessageId = randomUUID();
|
|
68
|
-
let
|
|
75
|
+
const userMessageId = options.messageIds?.user ?? randomUUID();
|
|
76
|
+
let assistantIndex = 0;
|
|
77
|
+
const assistantIdAt = (index) => options.messageIds?.assistant(index) ?? randomUUID();
|
|
78
|
+
let assistantMessageId = assistantIdAt(assistantIndex);
|
|
69
79
|
let userAnnounced = false;
|
|
70
80
|
let announcedAssistantId;
|
|
71
81
|
const rootSource = { agentId: options.agentId, callPath: [options.agentId] };
|
|
@@ -89,7 +99,11 @@ export function createConversationDisplayRecorder(options) {
|
|
|
89
99
|
}
|
|
90
100
|
function record(event) {
|
|
91
101
|
const frame = toChatFrame(event, rootSource);
|
|
92
|
-
if (frame
|
|
102
|
+
if (frame !== null)
|
|
103
|
+
observe(frame);
|
|
104
|
+
}
|
|
105
|
+
function observe(frame) {
|
|
106
|
+
if (finished)
|
|
93
107
|
return;
|
|
94
108
|
// The tracker reads the frames of the sub-agents, and `applyChatFrame` ignores them.
|
|
95
109
|
const activity = subAgentActivity.track(frame, now());
|
|
@@ -97,27 +111,29 @@ export function createConversationDisplayRecorder(options) {
|
|
|
97
111
|
apply(recordedPart(activity));
|
|
98
112
|
if (!isRootFrame(frame))
|
|
99
113
|
return;
|
|
100
|
-
if (frame
|
|
101
|
-
// Each chat event type is named without the `data-` prefix, thus a `data-` frame is a part frame.
|
|
114
|
+
if (isPartFrame(frame)) {
|
|
102
115
|
if (durableConversationType(frame.type))
|
|
103
116
|
apply(recordedPart(frame));
|
|
104
117
|
return;
|
|
105
118
|
}
|
|
106
119
|
apply(frame);
|
|
107
120
|
}
|
|
108
|
-
function
|
|
109
|
-
return { type: "message-start", messageId, role, source: rootSource };
|
|
121
|
+
function userMessageStart() {
|
|
122
|
+
return { type: "message-start", messageId: userMessageId, role: "user", text: options.userText, source: rootSource };
|
|
123
|
+
}
|
|
124
|
+
function assistantMessageStart(messageId) {
|
|
125
|
+
return { type: "message-start", messageId, role: "assistant", source: rootSource };
|
|
110
126
|
}
|
|
111
127
|
/** The `message-start` of each id that the sink did not get yet. */
|
|
112
128
|
function announcements() {
|
|
113
129
|
const starts = [];
|
|
114
130
|
if (!userAnnounced) {
|
|
115
131
|
userAnnounced = true;
|
|
116
|
-
starts.push(
|
|
132
|
+
starts.push(userMessageStart());
|
|
117
133
|
}
|
|
118
134
|
if (announcedAssistantId !== assistantMessageId) {
|
|
119
135
|
announcedAssistantId = assistantMessageId;
|
|
120
|
-
starts.push(
|
|
136
|
+
starts.push(assistantMessageStart(assistantMessageId));
|
|
121
137
|
}
|
|
122
138
|
return starts;
|
|
123
139
|
}
|
|
@@ -131,7 +147,7 @@ export function createConversationDisplayRecorder(options) {
|
|
|
131
147
|
return options.sink(event);
|
|
132
148
|
// The calls start in the order of the stream with no await between them: a later emit that its caller does
|
|
133
149
|
// not await, for example a text delta, must not reach the sink before them.
|
|
134
|
-
return Promise.all([...starts, event].map((next) => options.sink(next))).then(() => undefined);
|
|
150
|
+
return Promise.all([...starts, event].map((next) => Promise.resolve(options.sink(next)))).then(() => undefined);
|
|
135
151
|
};
|
|
136
152
|
function takeOpening() {
|
|
137
153
|
return [{ id: userMessageId, role: "user", parts: [{ type: "text", text: options.userText, state: "done" }] }];
|
|
@@ -146,7 +162,8 @@ export function createConversationDisplayRecorder(options) {
|
|
|
146
162
|
if (marker !== undefined) {
|
|
147
163
|
taken.push(compactionDivider(marker));
|
|
148
164
|
// The divider splits the turn into two assistant messages of the replay, and two messages must not share an id.
|
|
149
|
-
|
|
165
|
+
assistantIndex += 1;
|
|
166
|
+
assistantMessageId = assistantIdAt(assistantIndex);
|
|
150
167
|
}
|
|
151
168
|
return taken;
|
|
152
169
|
}
|
|
@@ -159,14 +176,16 @@ export function createConversationDisplayRecorder(options) {
|
|
|
159
176
|
const messages = takeOpening();
|
|
160
177
|
const parts = displayParts(roundParts());
|
|
161
178
|
if (parts.length > 0) {
|
|
162
|
-
|
|
179
|
+
const message = {
|
|
163
180
|
id: assistantMessageId,
|
|
164
181
|
role: "assistant",
|
|
165
|
-
...(finishOptions?.interrupted ? { metadata: { interrupted: true } } : {}),
|
|
166
182
|
parts: jsonCopy(parts),
|
|
167
|
-
}
|
|
183
|
+
};
|
|
184
|
+
if (finishOptions?.interrupted)
|
|
185
|
+
message.metadata = { interrupted: true };
|
|
186
|
+
messages.push(message);
|
|
168
187
|
}
|
|
169
188
|
return messages;
|
|
170
189
|
}
|
|
171
|
-
return { emit, takeOpening, takeRound, finish };
|
|
190
|
+
return { emit, observe, assistantMessageId: () => assistantMessageId, userMessageId: () => userMessageId, takeOpening, takeRound, finish };
|
|
172
191
|
}
|
|
@@ -46,10 +46,11 @@ export function storedMessagesToChat(messages) {
|
|
|
46
46
|
// spreads the message acquires one that overwrites a real value. `Date`
|
|
47
47
|
// does not survive the JSON crossing typed, hence the ISO string here.
|
|
48
48
|
const createdAt = row.createdAt === undefined ? {} : { createdAt: row.createdAt.toISOString() };
|
|
49
|
-
const author = row.author === undefined ? {} : { author: row.author };
|
|
50
49
|
groupLast = undefined;
|
|
51
50
|
for (const message of conversationUIToChatMessages(row.displayEnvelope.messages)) {
|
|
52
|
-
const stamped = { ...message, ...createdAt
|
|
51
|
+
const stamped = { ...message, ...createdAt };
|
|
52
|
+
if (message.role === "user" && row.author !== undefined)
|
|
53
|
+
stamped.author = row.author;
|
|
53
54
|
const previous = out.at(-1);
|
|
54
55
|
// The merged message keeps the creation time of its first round.
|
|
55
56
|
if (stamped.role === "assistant" && previous?.role === "assistant" && previous.id === stamped.id)
|