@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
|
@@ -1,18 +1,16 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Run synthesizer — a single-shot agent loop driven through `
|
|
2
|
+
* Run synthesizer — a single-shot agent loop driven through `runWithSalvage`:
|
|
3
3
|
*
|
|
4
|
-
* - `
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
* the
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
* sub-agent loop's brief is the only context handed
|
|
15
|
-
* across the boundary (forSubAgent semantics).
|
|
4
|
+
* - `submit_synthesis` — checks one synthesis against the schema and the
|
|
5
|
+
* semantic checks, and gives back the issues. It
|
|
6
|
+
* does not end the run. The last accepted
|
|
7
|
+
* submission is the synthesis.
|
|
8
|
+
* - `report_blocker` — the run produced nothing synthesizable. An
|
|
9
|
+
* accepted synthesis wins over a blocker.
|
|
10
|
+
* - `literature_reviewer` — research sub-agent exposed as a tool. The
|
|
11
|
+
* runtime registers it one time and gives it here;
|
|
12
|
+
* the sub-agent loop's brief is the only context
|
|
13
|
+
* handed across the boundary (forSubAgent semantics).
|
|
16
14
|
*
|
|
17
15
|
* Two deliverables on a happy path: `synthesis.json` written to the run dir
|
|
18
16
|
* and a `data-run-synthesis` chat data part emitted via the `emit` callback
|
|
@@ -28,20 +26,18 @@ import { join } from "node:path";
|
|
|
28
26
|
import { ok } from "neverthrow";
|
|
29
27
|
import { z } from "zod";
|
|
30
28
|
import { writeFileWithinRoot } from "../lib/fs-helpers.js";
|
|
29
|
+
import { isAllDigits } from "../lib/text.js";
|
|
31
30
|
import { tryFs } from "../lib/fs-result.js";
|
|
32
|
-
import {
|
|
33
|
-
import {
|
|
31
|
+
import { safeParseJsonAs } from "../lib/parse-json.js";
|
|
32
|
+
import { RunSynthesisSchema, SynthesisDraftSchema, } from "../schemas/run-synthesis.js";
|
|
34
33
|
import { synthesisAgentPrompt } from "../prompts/synthesis-agent.js";
|
|
35
34
|
import { composeSystemPrompt } from "../agents/system-prompt.js";
|
|
36
|
-
import { flattenDataPart } from "../contracts/chat-frame.js";
|
|
37
35
|
import { isSafeId, runDir } from "../workspace/paths.js";
|
|
38
|
-
import {
|
|
39
|
-
import {
|
|
40
|
-
import { passthroughStep } from "../loop/run-step.js";
|
|
36
|
+
import { runWithSalvage } from "../loop/run-loop.js";
|
|
37
|
+
import { recordedInputOf } from "../loop/tool-adapter.js";
|
|
41
38
|
import { defineTool } from "../tools/define-tool.js";
|
|
42
39
|
import { createReadToolOutputTool } from "../tools/read-tool-output.js";
|
|
43
|
-
import { createReportBlockerToolFor } from "../tools/sandbox/report-blocker.js";
|
|
44
|
-
import { createLiteratureReviewerTool } from "../tools/research/literature-reviewer.js";
|
|
40
|
+
import { blockerOf, createReportBlockerToolFor, REPORT_BLOCKER_TOOL_ID } from "../tools/sandbox/report-blocker.js";
|
|
45
41
|
// ── Agent identity / budgets ────────────────────────────────────────
|
|
46
42
|
/**
|
|
47
43
|
* The synthesizer's agent identity — the `source.agentId` on its loop events
|
|
@@ -60,35 +56,15 @@ const SYNTHESIZER_MAX_ITERATIONS = 25;
|
|
|
60
56
|
* model treats a stated call-count limit as a target to hit, not a maximum.
|
|
61
57
|
*/
|
|
62
58
|
const LITERATURE_REVIEWER_BUDGET = 3;
|
|
59
|
+
const SubmitSynthesisOutputSchema = z.object({ accepted: z.boolean() });
|
|
60
|
+
const SUBMIT_SYNTHESIS_TOOL_ID = "submit_synthesis";
|
|
63
61
|
// ── Validation ──────────────────────────────────────────────────────
|
|
64
|
-
function zodIssuesToValidationIssues(error, input, rootPath = "synthesis") {
|
|
65
|
-
return error.issues.map((i) => ({
|
|
66
|
-
path: [rootPath, ...i.path.map((p) => String(p))].join("."),
|
|
67
|
-
code: "schema",
|
|
68
|
-
message: i.message,
|
|
69
|
-
hint: hintForZodIssue(i, input),
|
|
70
|
-
}));
|
|
71
|
-
}
|
|
72
|
-
const PMID_PATTERN = /^\d+$/;
|
|
73
62
|
// ── Semantic checks ─────────────────────────────────────────────────
|
|
74
63
|
//
|
|
75
|
-
// Each check takes only the fields it reads, never the whole synthesis.
|
|
76
|
-
//
|
|
77
|
-
//
|
|
78
|
-
//
|
|
79
|
-
// composes them for the schema-valid path — it is the one definition of "all
|
|
80
|
-
// semantic checks, in report order".
|
|
81
|
-
function checkRunId(runId, ctx) {
|
|
82
|
-
if (runId === ctx.runId)
|
|
83
|
-
return [];
|
|
84
|
-
return [
|
|
85
|
-
{
|
|
86
|
-
path: "synthesis.runId",
|
|
87
|
-
code: "semantic",
|
|
88
|
-
message: `runId must be "${ctx.runId}"`,
|
|
89
|
-
},
|
|
90
|
-
];
|
|
91
|
-
}
|
|
64
|
+
// Each check takes only the fields it reads, never the whole synthesis.
|
|
65
|
+
// `semanticCheck` composes them — it is the one definition of "all semantic
|
|
66
|
+
// checks, in report order". The input schema of the tool checks the shape
|
|
67
|
+
// before them.
|
|
92
68
|
function checkFindingStepIds(findings, ctx) {
|
|
93
69
|
const issues = [];
|
|
94
70
|
for (const [i, f] of findings.entries()) {
|
|
@@ -138,7 +114,7 @@ function checkFindingPmidFormat(findings) {
|
|
|
138
114
|
const issues = [];
|
|
139
115
|
for (const [fi, f] of findings.entries()) {
|
|
140
116
|
for (const [ri, r] of f.references.entries()) {
|
|
141
|
-
if (!
|
|
117
|
+
if (r.pmid.length === 0 || !isAllDigits(r.pmid)) {
|
|
142
118
|
issues.push({
|
|
143
119
|
path: `synthesis.findings[${fi}].references[${ri}].pmid`,
|
|
144
120
|
code: "semantic",
|
|
@@ -152,7 +128,7 @@ function checkFindingPmidFormat(findings) {
|
|
|
152
128
|
function checkKeyReferencePmidFormat(keyReferences) {
|
|
153
129
|
const issues = [];
|
|
154
130
|
for (const [i, r] of keyReferences.entries()) {
|
|
155
|
-
if (!
|
|
131
|
+
if (r.pmid.length === 0 || !isAllDigits(r.pmid)) {
|
|
156
132
|
issues.push({
|
|
157
133
|
path: `synthesis.keyReferences[${i}].pmid`,
|
|
158
134
|
code: "semantic",
|
|
@@ -164,7 +140,6 @@ function checkKeyReferencePmidFormat(keyReferences) {
|
|
|
164
140
|
}
|
|
165
141
|
function semanticCheck(synthesis, ctx) {
|
|
166
142
|
return [
|
|
167
|
-
...checkRunId(synthesis.runId, ctx),
|
|
168
143
|
...checkFindingStepIds(synthesis.findings, ctx),
|
|
169
144
|
...checkThemeReferences(synthesis.themes, synthesis.findings),
|
|
170
145
|
...checkKeyReferencesCited(synthesis.keyReferences, synthesis.findings),
|
|
@@ -172,157 +147,42 @@ function semanticCheck(synthesis, ctx) {
|
|
|
172
147
|
...checkKeyReferencePmidFormat(synthesis.keyReferences),
|
|
173
148
|
];
|
|
174
149
|
}
|
|
175
|
-
function salvageInputs(candidate) {
|
|
176
|
-
const record = typeof candidate === "object" && candidate !== null ? candidate : {};
|
|
177
|
-
const runId = z.string().safeParse(record.runId);
|
|
178
|
-
const findings = z.array(SynthesizedFindingSchema).safeParse(record.findings);
|
|
179
|
-
const themes = z.array(BiologicalThemeSchema).safeParse(record.themes);
|
|
180
|
-
const keyReferences = z.array(KeyReferenceSchema).safeParse(record.keyReferences);
|
|
181
|
-
return {
|
|
182
|
-
runId: runId.success ? runId.data : undefined,
|
|
183
|
-
findings: findings.success ? findings.data : undefined,
|
|
184
|
-
themes: themes.success ? themes.data : undefined,
|
|
185
|
-
keyReferences: keyReferences.success ? keyReferences.data : undefined,
|
|
186
|
-
};
|
|
187
|
-
}
|
|
188
|
-
/**
|
|
189
|
-
* A short issue list must never read as "everything else is fine". When the
|
|
190
|
-
* payload failed schema validation and some checks could not run, the deferred
|
|
191
|
-
* ones are named back to the model as an issue of their own.
|
|
192
|
-
*/
|
|
193
|
-
function deferredChecksNotice(deferred) {
|
|
194
|
-
return {
|
|
195
|
-
path: "synthesis",
|
|
196
|
-
code: "semantic",
|
|
197
|
-
message: `This issue list is INCOMPLETE: ${deferred.length} semantic check(s) could not run because the fields ` +
|
|
198
|
-
`they read did not survive schema validation — ${deferred.join("; ")}.`,
|
|
199
|
-
hint: "Fix the schema issues above and call validate_synthesis again; the deferred checks will run then and may report further problems.",
|
|
200
|
-
};
|
|
201
|
-
}
|
|
202
|
-
/**
|
|
203
|
-
* Semantic checks over a candidate that failed `RunSynthesisSchema`. Every check
|
|
204
|
-
* whose own inputs parsed is run; the rest are reported as deferred.
|
|
205
|
-
*/
|
|
206
|
-
function salvagedSemanticCheck(candidate, ctx) {
|
|
207
|
-
const { runId, findings, themes, keyReferences } = salvageInputs(candidate);
|
|
208
|
-
const issues = [];
|
|
209
|
-
const deferred = [];
|
|
210
|
-
if (runId !== undefined)
|
|
211
|
-
issues.push(...checkRunId(runId, ctx));
|
|
212
|
-
else
|
|
213
|
-
deferred.push("runId matches the run");
|
|
214
|
-
if (findings !== undefined)
|
|
215
|
-
issues.push(...checkFindingStepIds(findings, ctx));
|
|
216
|
-
else
|
|
217
|
-
deferred.push("finding stepIds are present in the input summaries");
|
|
218
|
-
if (themes !== undefined && findings !== undefined)
|
|
219
|
-
issues.push(...checkThemeReferences(themes, findings));
|
|
220
|
-
else
|
|
221
|
-
deferred.push("theme references resolve to entries in findings[]");
|
|
222
|
-
if (keyReferences !== undefined && findings !== undefined)
|
|
223
|
-
issues.push(...checkKeyReferencesCited(keyReferences, findings));
|
|
224
|
-
else
|
|
225
|
-
deferred.push("keyReferences PMIDs are cited by some finding");
|
|
226
|
-
if (findings !== undefined)
|
|
227
|
-
issues.push(...checkFindingPmidFormat(findings));
|
|
228
|
-
else
|
|
229
|
-
deferred.push("finding reference PMIDs are numeric");
|
|
230
|
-
if (keyReferences !== undefined)
|
|
231
|
-
issues.push(...checkKeyReferencePmidFormat(keyReferences));
|
|
232
|
-
else
|
|
233
|
-
deferred.push("keyReferences PMIDs are numeric");
|
|
234
|
-
if (deferred.length > 0)
|
|
235
|
-
issues.push(deferredChecksNotice(deferred));
|
|
236
|
-
return issues;
|
|
237
|
-
}
|
|
238
|
-
/**
|
|
239
|
-
* Validate a candidate in one pass. A schema failure no longer hides the
|
|
240
|
-
* semantic problems behind it: structure issues come first, then every semantic
|
|
241
|
-
* check whose inputs survived, then an explicit note of what was deferred.
|
|
242
|
-
*/
|
|
243
|
-
function fullyValidate(candidate, ctx) {
|
|
244
|
-
const parsed = RunSynthesisSchema.safeParse(candidate);
|
|
245
|
-
if (!parsed.success) {
|
|
246
|
-
return {
|
|
247
|
-
valid: false,
|
|
248
|
-
issues: [...zodIssuesToValidationIssues(parsed.error, candidate), ...salvagedSemanticCheck(candidate, ctx)],
|
|
249
|
-
};
|
|
250
|
-
}
|
|
251
|
-
const semanticIssues = semanticCheck(parsed.data, ctx);
|
|
252
|
-
if (semanticIssues.length > 0) {
|
|
253
|
-
return { valid: false, issues: semanticIssues };
|
|
254
|
-
}
|
|
255
|
-
return { valid: true, synthesis: parsed.data };
|
|
256
|
-
}
|
|
257
150
|
// ── Inner tools ─────────────────────────────────────────────────────
|
|
258
|
-
function
|
|
151
|
+
function buildSubmitTool(ctx) {
|
|
259
152
|
return defineTool({
|
|
260
|
-
id:
|
|
261
|
-
description: "
|
|
262
|
-
"
|
|
263
|
-
"
|
|
264
|
-
"{
|
|
265
|
-
"
|
|
266
|
-
"
|
|
267
|
-
"
|
|
268
|
-
|
|
269
|
-
"field is too malformed for a semantic check to read, that check is " +
|
|
270
|
-
"reported as deferred rather than silently skipped. The authoritative " +
|
|
271
|
-
"field-by-field synthesis schema is the arg schema of " +
|
|
272
|
-
"submit_synthesis — this tool deliberately does not restate it. " +
|
|
273
|
-
"Non-terminal: call as often as needed to iterate toward a clean " +
|
|
274
|
-
"synthesis, then submit_synthesis. A candidate that arrives as a " +
|
|
275
|
-
"JSON-encoded string is decoded before the checks run, so the " +
|
|
276
|
-
"result describes the synthesis inside the string.",
|
|
277
|
-
// Deliberately permissive: a structurally-invalid candidate must reach
|
|
278
|
-
// `execute` so the model gets a structured {valid:false, issues} result —
|
|
279
|
-
// including semantic issues — instead of a bare Zod rejection at the loop's
|
|
280
|
-
// input boundary. `execute` re-parses against RunSynthesisSchema itself.
|
|
281
|
-
// The permissive schema also means the loop's string repair never runs
|
|
282
|
-
// here, so `execute` decodes a JSON-encoded string itself.
|
|
283
|
-
inputSchema: z.object({
|
|
284
|
-
synthesis: z.unknown().describe("The candidate synthesis, in any shape. Field-by-field schema: see submit_synthesis."),
|
|
285
|
-
}),
|
|
153
|
+
id: SUBMIT_SYNTHESIS_TOOL_ID,
|
|
154
|
+
description: "Submit the synthesis. Checks the payload against the semantic checks " +
|
|
155
|
+
"the arg schema cannot express (stepId refs, theme→finding refs, " +
|
|
156
|
+
"keyReferences PMIDs cited, numeric PMIDs). On success returns " +
|
|
157
|
+
"{accepted: true} — STOP after this. On rejection returns " +
|
|
158
|
+
"{accepted: false, issues} — fix the specific fields at each issue " +
|
|
159
|
+
"path and call again, or switch to report_blocker if the synthesis " +
|
|
160
|
+
"cannot be made valid. The last accepted submission is the synthesis.",
|
|
161
|
+
inputSchema: z.object({ synthesis: SynthesisDraftSchema }),
|
|
286
162
|
describeCall: "none",
|
|
287
|
-
execute:
|
|
288
|
-
const
|
|
289
|
-
return ok(
|
|
163
|
+
execute: (input) => {
|
|
164
|
+
const issues = semanticCheck(input.synthesis, ctx);
|
|
165
|
+
return Promise.resolve(ok(issues.length > 0 ? { accepted: false, issues } : { accepted: true }));
|
|
290
166
|
},
|
|
291
167
|
});
|
|
292
168
|
}
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
execute: async (input) => {
|
|
308
|
-
const result = fullyValidate(input.synthesis, ctx);
|
|
309
|
-
if (!result.valid) {
|
|
310
|
-
// A rejection is not terminal — submission is last-valid-wins, so this
|
|
311
|
-
// leaves any already-recorded outcome intact and the model may fix the
|
|
312
|
-
// cited paths and submit again.
|
|
313
|
-
return ok({ accepted: false, issues: result.issues });
|
|
314
|
-
}
|
|
315
|
-
holder.outcome = { kind: "submitted", synthesis: result.synthesis };
|
|
316
|
-
return ok({ accepted: true });
|
|
317
|
-
},
|
|
318
|
-
});
|
|
169
|
+
/** The last accepted synthesis of a run, from the inputs of the calls of `submit_synthesis` that it accepted. */
|
|
170
|
+
export function acceptedSynthesisOf(steps) {
|
|
171
|
+
let accepted;
|
|
172
|
+
for (const step of steps) {
|
|
173
|
+
for (const call of step.calls) {
|
|
174
|
+
if (call.toolName !== SUBMIT_SYNTHESIS_TOOL_ID || call.output?.outcome !== "ok")
|
|
175
|
+
continue;
|
|
176
|
+
const outcome = SubmitSynthesisOutputSchema.safeParse(call.output.value);
|
|
177
|
+
const input = recordedInputOf(z.object({ synthesis: SynthesisDraftSchema }), call.input);
|
|
178
|
+
if (outcome.success && outcome.data.accepted && input !== undefined)
|
|
179
|
+
accepted = input.synthesis;
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
return accepted;
|
|
319
183
|
}
|
|
320
|
-
function buildBlockerTool(
|
|
184
|
+
function buildBlockerTool() {
|
|
321
185
|
return createReportBlockerToolFor({
|
|
322
|
-
record: (outcome) => {
|
|
323
|
-
if (holder.outcome === null)
|
|
324
|
-
holder.outcome = outcome;
|
|
325
|
-
},
|
|
326
186
|
blockedWhen: "Ends run synthesis with no synthesis written. Use it ONLY when the " +
|
|
327
187
|
"run produced no synthesizable content — every step summary is empty, " +
|
|
328
188
|
"or the summaries are contradictory to the point of incoherence. A run " +
|
|
@@ -333,46 +193,28 @@ function buildBlockerTool(holder) {
|
|
|
333
193
|
}
|
|
334
194
|
/**
|
|
335
195
|
* Test-only — expose the inner-tool factory so unit tests can assert on
|
|
336
|
-
*
|
|
196
|
+
* the checks without driving the whole agent loop.
|
|
337
197
|
*/
|
|
338
198
|
export function __buildInnerToolsForTest(args) {
|
|
339
|
-
const
|
|
340
|
-
|
|
341
|
-
knownStepIds: args.knownStepIds,
|
|
342
|
-
runId: args.runId,
|
|
343
|
-
};
|
|
344
|
-
return {
|
|
345
|
-
validate: buildValidateTool(ctx),
|
|
346
|
-
submit: buildSubmitTool(holder, ctx),
|
|
347
|
-
blocker: buildBlockerTool(holder),
|
|
348
|
-
holder,
|
|
349
|
-
};
|
|
199
|
+
const ctx = { knownStepIds: args.knownStepIds };
|
|
200
|
+
return { submit: buildSubmitTool(ctx), blocker: buildBlockerTool() };
|
|
350
201
|
}
|
|
351
202
|
/**
|
|
352
|
-
* Drive the synthesizer agent loop to
|
|
353
|
-
*
|
|
354
|
-
* Throws when
|
|
203
|
+
* Drive the synthesizer agent loop to an outcome — the last accepted
|
|
204
|
+
* synthesis (`submit_synthesis`), else a blocker (`report_blocker`).
|
|
205
|
+
* Throws when the run and its salvage end with neither (loop cap or external abort).
|
|
355
206
|
*/
|
|
356
207
|
export async function generateRunSynthesis(input) {
|
|
357
208
|
if (input.summaries.length === 0) {
|
|
358
209
|
throw new Error("Run synthesis: no step summaries to synthesize");
|
|
359
210
|
}
|
|
360
211
|
const knownStepIds = new Set(input.summaries.map((s) => s.stepId));
|
|
361
|
-
const
|
|
362
|
-
const
|
|
363
|
-
const
|
|
364
|
-
|
|
365
|
-
model: input.model,
|
|
366
|
-
bioKeys: input.bioKeys,
|
|
367
|
-
citationResolver: input.citationResolver,
|
|
368
|
-
usageRecorder: input.usageRecorder,
|
|
369
|
-
...(input.toolOutputStore ? { toolOutputStore: input.toolOutputStore } : {}),
|
|
370
|
-
});
|
|
371
|
-
const validateTool = buildValidateTool(innerCtx);
|
|
372
|
-
const submitTool = buildSubmitTool(holder, innerCtx);
|
|
373
|
-
const blockerTool = buildBlockerTool(holder);
|
|
212
|
+
const innerCtx = { knownStepIds };
|
|
213
|
+
const reviewer = input.literatureReviewer;
|
|
214
|
+
const submitTool = buildSubmitTool(innerCtx);
|
|
215
|
+
const blockerTool = buildBlockerTool();
|
|
374
216
|
const readTools = input.toolOutputStore ? [createReadToolOutputTool(input.toolOutputStore)] : [];
|
|
375
|
-
const tools = [
|
|
217
|
+
const tools = [submitTool, blockerTool, reviewer, ...readTools];
|
|
376
218
|
const agent = {
|
|
377
219
|
id: SYNTHESIS_AGENT_ID,
|
|
378
220
|
systemPrompt: composeSystemPrompt(synthesisAgentPrompt),
|
|
@@ -380,31 +222,32 @@ export async function generateRunSynthesis(input) {
|
|
|
380
222
|
tools,
|
|
381
223
|
maxIterations: SYNTHESIZER_MAX_ITERATIONS,
|
|
382
224
|
};
|
|
383
|
-
const prompt = buildSynthesizerPrompt(input.planNarrative, input.summaries
|
|
225
|
+
const prompt = buildSynthesizerPrompt(input.planNarrative, input.summaries);
|
|
384
226
|
const signal = input.signal ?? new AbortController().signal;
|
|
385
227
|
const emit = input.emit ?? (() => { });
|
|
386
|
-
const
|
|
228
|
+
const run = await runWithSalvage(agent, [{ role: "user", content: prompt }], input.session, {
|
|
387
229
|
provider: input.provider,
|
|
388
230
|
signal,
|
|
389
231
|
emit,
|
|
390
|
-
runStep: passthroughStep,
|
|
391
|
-
resolved: () => holder.outcome !== null,
|
|
392
232
|
usageRecorder: input.usageRecorder,
|
|
393
233
|
toolOutputStore: input.toolOutputStore,
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
tools: [
|
|
398
|
-
nudge: "You ended without
|
|
234
|
+
policy: { budget: { [reviewer.id]: LITERATURE_REVIEWER_BUDGET } },
|
|
235
|
+
pause: input.pause,
|
|
236
|
+
}, {
|
|
237
|
+
tools: [SUBMIT_SYNTHESIS_TOOL_ID, REPORT_BLOCKER_TOOL_ID],
|
|
238
|
+
nudge: "You ended without an accepted synthesis. You MUST call " +
|
|
399
239
|
"submit_synthesis with the final synthesis now, or report_blocker " +
|
|
400
240
|
"if the run produced nothing synthesizable. Do not reply with prose.",
|
|
241
|
+
hasOutcome: (steps) => acceptedSynthesisOf(steps) !== undefined || blockerOf(steps) !== null,
|
|
401
242
|
});
|
|
402
|
-
const
|
|
403
|
-
if (
|
|
404
|
-
|
|
243
|
+
const accepted = acceptedSynthesisOf(run.steps);
|
|
244
|
+
if (accepted !== undefined) {
|
|
245
|
+
// The model never types the run id: the host stamps the id of its own run.
|
|
246
|
+
return { kind: "synthesis", synthesis: { runId: input.runId, ...accepted } };
|
|
405
247
|
}
|
|
406
|
-
|
|
407
|
-
|
|
248
|
+
const blocker = blockerOf(run.steps);
|
|
249
|
+
if (blocker !== null) {
|
|
250
|
+
return { kind: "skipped", reason: blocker.reason };
|
|
408
251
|
}
|
|
409
252
|
if (signal.aborted) {
|
|
410
253
|
throw new Error("Run synthesis was cancelled.");
|
|
@@ -503,20 +346,17 @@ export async function readRunSynthesis(args) {
|
|
|
503
346
|
if (text === undefined) {
|
|
504
347
|
return null;
|
|
505
348
|
}
|
|
506
|
-
let
|
|
349
|
+
let parsed;
|
|
507
350
|
try {
|
|
508
|
-
|
|
351
|
+
parsed = safeParseJsonAs(text, RunSynthesisSchema);
|
|
509
352
|
}
|
|
510
353
|
catch {
|
|
511
354
|
return null;
|
|
512
355
|
}
|
|
513
|
-
const parsed = RunSynthesisSchema.safeParse(json);
|
|
514
356
|
if (!parsed.success) {
|
|
515
357
|
return null;
|
|
516
358
|
}
|
|
517
|
-
|
|
518
|
-
// The tests parse the result with `RunSynthesisPartSchema`.
|
|
519
|
-
return flattenDataPart(buildRunSynthesisPart(args.runId, parsed.data));
|
|
359
|
+
return { type: "data-run-synthesis", ...runSynthesisPartFields(args.runId, parsed.data) };
|
|
520
360
|
}
|
|
521
361
|
// ── Embedding text ──────────────────────────────────────────────────
|
|
522
362
|
export function formatSynthesisEmbeddingText(synthesis) {
|
|
@@ -545,9 +385,9 @@ export function formatSynthesisEmbeddingText(synthesis) {
|
|
|
545
385
|
].join("\n");
|
|
546
386
|
}
|
|
547
387
|
// ── Prompt builder ──────────────────────────────────────────────────
|
|
548
|
-
function buildSynthesizerPrompt(planNarrative, summaries
|
|
388
|
+
function buildSynthesizerPrompt(planNarrative, summaries) {
|
|
549
389
|
const summaryBlock = summaries.map((s) => `### ${s.stepId} (${s.agentId})\n\n${s.markdown}`).join("\n\n---\n\n");
|
|
550
|
-
return [
|
|
390
|
+
return ["## Analytical Narrative", planNarrative, "", "## Step Summaries", summaryBlock].join("\n");
|
|
551
391
|
}
|
|
552
392
|
// ── Chat data part builders ─────────────────────────────────────────
|
|
553
393
|
/**
|
|
@@ -556,17 +396,18 @@ function buildSynthesizerPrompt(planNarrative, summaries, runId) {
|
|
|
556
396
|
* `RunSynthesisPart` interface — keep them in lockstep.
|
|
557
397
|
*/
|
|
558
398
|
export function buildRunSynthesisPart(runId, synthesis) {
|
|
399
|
+
return { type: "data-run-synthesis", data: runSynthesisPartFields(runId, synthesis) };
|
|
400
|
+
}
|
|
401
|
+
/** The flat fields of the `data-run-synthesis` part, shared by the stream part and the stored-record read. */
|
|
402
|
+
function runSynthesisPartFields(runId, synthesis) {
|
|
559
403
|
return {
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
limitations: synthesis.limitations,
|
|
569
|
-
keyReferences: synthesis.keyReferences,
|
|
570
|
-
},
|
|
404
|
+
id: `synthesis-${runId}`,
|
|
405
|
+
runId,
|
|
406
|
+
overview: synthesis.overview,
|
|
407
|
+
conclusions: synthesis.conclusions,
|
|
408
|
+
findings: synthesis.findings,
|
|
409
|
+
themes: synthesis.themes,
|
|
410
|
+
limitations: synthesis.limitations,
|
|
411
|
+
keyReferences: synthesis.keyReferences,
|
|
571
412
|
};
|
|
572
413
|
}
|
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
* service derives from its object-store index and the CLI synthesizes from the
|
|
19
19
|
* local path — the harness treats them as opaque labels.
|
|
20
20
|
*/
|
|
21
|
-
export
|
|
21
|
+
export type StagedInput = {
|
|
22
22
|
readonly fileId: string;
|
|
23
23
|
readonly mountName: string;
|
|
24
24
|
readonly key: string;
|
|
@@ -38,4 +38,4 @@ export interface StagedInput {
|
|
|
38
38
|
readonly mtimeMs: number;
|
|
39
39
|
/** Path relative to the data dir, e.g. "inputs/{mountName}/{key}". */
|
|
40
40
|
readonly relativePath: string;
|
|
41
|
-
}
|
|
41
|
+
};
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Per-step interpretive summary. Continues the step agent's conversation
|
|
3
|
-
* (`
|
|
3
|
+
* (`continueLoop`) so the request reuses the cached prefix and keeps
|
|
4
4
|
* signed thinking blocks valid.
|
|
5
5
|
*
|
|
6
6
|
* Contract:
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
* summary as its final assistant text.
|
|
10
10
|
* - Returns `{ stepId, agentId, markdown }` on non-empty final text;
|
|
11
11
|
* `undefined` on empty text, on a throw, or when the request cap is hit
|
|
12
|
-
* before a final answer
|
|
12
|
+
* before a final answer. Non-fatal.
|
|
13
13
|
* - `Session` is taken explicitly (see the harness-durable-runtime spec).
|
|
14
14
|
*
|
|
15
15
|
* Honest empty: with no output artifacts the request directs the model to
|
|
@@ -24,11 +24,11 @@
|
|
|
24
24
|
import type { AgentSession } from "../auth/types.js";
|
|
25
25
|
import { type ToolOutputStore } from "../loop/tool-output.js";
|
|
26
26
|
import type { AgentDefinition, LoopMessage } from "../loop/types.js";
|
|
27
|
-
import type {
|
|
27
|
+
import type { ChatProvider } from "../providers/types.js";
|
|
28
28
|
import { type StepSummary } from "../schemas/step-summary.js";
|
|
29
29
|
import type { Logger } from "../lib/logger.js";
|
|
30
30
|
import type { UsageRecorder } from "../billing/usage-recorder.js";
|
|
31
|
-
export
|
|
31
|
+
export type GenerateStepSummaryOptions = {
|
|
32
32
|
/** Operational logging seam; omitted falls back to no-op. */
|
|
33
33
|
readonly logger?: Logger;
|
|
34
34
|
/** LLM usage-accounting seam for the continuation; omitted falls back to the no-op recorder. */
|
|
@@ -36,7 +36,7 @@ export interface GenerateStepSummaryOptions {
|
|
|
36
36
|
/** The store of the task, thus the loop of the continuation keeps its texts where the read tool of the agent reads them. */
|
|
37
37
|
readonly toolOutputStore?: ToolOutputStore;
|
|
38
38
|
/** The provider of the task, thus each request extends the prefix that the task cached. */
|
|
39
|
-
readonly provider:
|
|
39
|
+
readonly provider: ChatProvider;
|
|
40
40
|
readonly session: AgentSession;
|
|
41
41
|
/** The step agent: the continuation sends its system prompt and its declared tools. */
|
|
42
42
|
readonly agent: AgentDefinition;
|
|
@@ -47,6 +47,6 @@ export interface GenerateStepSummaryOptions {
|
|
|
47
47
|
readonly agentId: string;
|
|
48
48
|
readonly runId: string;
|
|
49
49
|
readonly signal?: AbortSignal;
|
|
50
|
-
}
|
|
50
|
+
};
|
|
51
51
|
/** Returns `undefined` on non-fatal failure instead of throwing. */
|
|
52
52
|
export declare function generateStepSummary(opts: GenerateStepSummaryOptions): Promise<StepSummary | undefined>;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Per-step interpretive summary. Continues the step agent's conversation
|
|
3
|
-
* (`
|
|
3
|
+
* (`continueLoop`) so the request reuses the cached prefix and keeps
|
|
4
4
|
* signed thinking blocks valid.
|
|
5
5
|
*
|
|
6
6
|
* Contract:
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
* summary as its final assistant text.
|
|
10
10
|
* - Returns `{ stepId, agentId, markdown }` on non-empty final text;
|
|
11
11
|
* `undefined` on empty text, on a throw, or when the request cap is hit
|
|
12
|
-
* before a final answer
|
|
12
|
+
* before a final answer. Non-fatal.
|
|
13
13
|
* - `Session` is taken explicitly (see the harness-durable-runtime spec).
|
|
14
14
|
*
|
|
15
15
|
* Honest empty: with no output artifacts the request directs the model to
|
|
@@ -21,9 +21,7 @@
|
|
|
21
21
|
* step time the workflow body already holds the array — pass it in. The task
|
|
22
22
|
* always closes its unanswered calls, so the transcript needs no repair.
|
|
23
23
|
*/
|
|
24
|
-
import {
|
|
25
|
-
import { finalText } from "../loop/run-agent.js";
|
|
26
|
-
import { passthroughStep } from "../loop/run-step.js";
|
|
24
|
+
import { continueLoop, finalText } from "../loop/run-loop.js";
|
|
27
25
|
import { READ_TOOL_OUTPUT_TOOL_ID } from "../loop/tool-output.js";
|
|
28
26
|
import { stepSummaryPrompt } from "../prompts/execute-analysis/step-summary.js";
|
|
29
27
|
import { StepSummarySchema } from "../schemas/step-summary.js";
|
|
@@ -49,17 +47,15 @@ export async function generateStepSummary(opts) {
|
|
|
49
47
|
const logger = (opts.logger ?? createNoopLogger()).named("step-summary").with({ runId: opts.runId, stepId: opts.stepId, agentId: opts.agentId });
|
|
50
48
|
let result;
|
|
51
49
|
try {
|
|
52
|
-
result = await
|
|
50
|
+
result = await continueLoop(opts.agent, opts.conversation, {
|
|
53
51
|
text: summaryRequest(opts.artifactPaths),
|
|
54
52
|
mask: { allow: SUMMARY_TOOLS },
|
|
55
53
|
maxRequests: SUMMARY_MAX_REQUESTS,
|
|
56
|
-
stepNamespace: "step-summary",
|
|
57
54
|
accountingAgentId: SUMMARY_AGENT_ID,
|
|
58
55
|
}, opts.session, {
|
|
59
56
|
provider: opts.provider,
|
|
60
57
|
signal: opts.signal ?? new AbortController().signal,
|
|
61
58
|
emit: () => { },
|
|
62
|
-
runStep: passthroughStep,
|
|
63
59
|
usageRecorder: opts.usageRecorder,
|
|
64
60
|
toolOutputStore: opts.toolOutputStore,
|
|
65
61
|
});
|
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
* Uses Kahn's algorithm to group steps into waves where steps within
|
|
5
5
|
* a wave have no inter-dependencies and can run in parallel.
|
|
6
6
|
*/
|
|
7
|
+
import { presentGet } from "../lib/present.js";
|
|
7
8
|
// ── Errors ─────────────────────────────────────────────────────────
|
|
8
9
|
/** Thrown when the plan DAG contains a dependency cycle. */
|
|
9
10
|
export class CycleError extends Error {
|
|
@@ -64,7 +65,7 @@ export function topoSortIntoWaves(steps) {
|
|
|
64
65
|
for (const step of steps) {
|
|
65
66
|
for (const dep of step.depends_on) {
|
|
66
67
|
inDegree.set(step.id, (inDegree.get(step.id) ?? 0) + 1);
|
|
67
|
-
dependents
|
|
68
|
+
presentGet(dependents, dep, "the dependents list of the dependency").push(step.id);
|
|
68
69
|
}
|
|
69
70
|
}
|
|
70
71
|
// Process wave by wave: each wave consists of all nodes with in-degree 0
|
|
@@ -74,13 +75,13 @@ export function topoSortIntoWaves(steps) {
|
|
|
74
75
|
let frontier = steps.filter((s) => inDegree.get(s.id) === 0).map((s) => s.id);
|
|
75
76
|
while (frontier.length > 0) {
|
|
76
77
|
// Current frontier forms a wave
|
|
77
|
-
const wave = frontier.map((id) => stepById
|
|
78
|
+
const wave = frontier.map((id) => presentGet(stepById, id, "the step of the frontier id"));
|
|
78
79
|
waves.push(wave);
|
|
79
80
|
remaining -= frontier.length;
|
|
80
81
|
// Compute next frontier
|
|
81
82
|
const nextFrontier = [];
|
|
82
83
|
for (const id of frontier) {
|
|
83
|
-
for (const dep of dependents
|
|
84
|
+
for (const dep of presentGet(dependents, id, "the dependents list of the wave id")) {
|
|
84
85
|
const newDeg = (inDegree.get(dep) ?? 1) - 1;
|
|
85
86
|
inDegree.set(dep, newDeg);
|
|
86
87
|
if (newDeg === 0) {
|
|
@@ -23,7 +23,7 @@
|
|
|
23
23
|
*/
|
|
24
24
|
import type { ResultAsync } from "neverthrow";
|
|
25
25
|
import type { DbError } from "../lib/db-result.js";
|
|
26
|
-
export
|
|
26
|
+
export type WorkflowPurger = {
|
|
27
27
|
/** Workflow ids in a given id namespace (e.g. `dataprofile:{analysisId}:`). Empty when the ledger has no schema yet. */
|
|
28
28
|
findByIdPrefix(prefix: string): ResultAsync<string[], DbError>;
|
|
29
29
|
/** Cancel the given workflows so no executor keeps writing behind a purge. Unknown ids are ignored. */
|
|
@@ -35,4 +35,4 @@ export interface WorkflowPurger {
|
|
|
35
35
|
* reports no count of its own.
|
|
36
36
|
*/
|
|
37
37
|
deleteWorkflows(workflowIds: readonly string[], includeDescendants?: boolean): ResultAsync<number, DbError>;
|
|
38
|
-
}
|
|
38
|
+
};
|