@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
|
@@ -5,11 +5,10 @@
|
|
|
5
5
|
* The operation owns no table. It composes the reads and the writes that the
|
|
6
6
|
* store, the thread history, and the working memory already give. `getThread`
|
|
7
7
|
* finds the parent, and `latestSeq` gives the anchor. `listThreads` counts the
|
|
8
|
-
* report children, and `
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
* the `messages` table.
|
|
8
|
+
* report children, and `render` makes the seed. `createThread` writes the row
|
|
9
|
+
* and the seed in one transaction. The two storage reads that this capability
|
|
10
|
+
* adds, `latestSeq` and `countUserTurnsAfter`, live on the thread history,
|
|
11
|
+
* because that module owns the `messages` table.
|
|
13
12
|
*
|
|
14
13
|
* The reads and the insert take no lock and no transaction. A concurrent turn
|
|
15
14
|
* can append between the anchor read and the insert, and a retract can cut the
|
|
@@ -18,8 +17,10 @@
|
|
|
18
17
|
* past the parent's current end is a normal state a reader expects.
|
|
19
18
|
*
|
|
20
19
|
* A conversation thread id comes from the host UI. But the spawn is a harness
|
|
21
|
-
* operation with no UI in front of it. Thus
|
|
22
|
-
* the
|
|
20
|
+
* operation with no UI in front of it. Thus the caller gives the child id, or
|
|
21
|
+
* the spawn mints a `randomUUID`, and the spawn returns the full row. A managed
|
|
22
|
+
* deployment gets the same behavior with no host code. A second spawn with the
|
|
23
|
+
* id of a child gives that child, and it writes nothing.
|
|
23
24
|
*
|
|
24
25
|
* The spawn also gates on the eyes of the composition. A report session records
|
|
25
26
|
* a version only after a look at the rendered page, and only a browser can look.
|
|
@@ -32,9 +33,9 @@
|
|
|
32
33
|
* The spawn seeds the context of the child at the anchor. It writes one message
|
|
33
34
|
* that holds the brief and a copy of the working-memory render. The transcript
|
|
34
35
|
* is append-only, thus the copy stays frozen at the anchor by construction, and
|
|
35
|
-
* a later change to the working memory leaves it as it is.
|
|
36
|
-
*
|
|
37
|
-
*
|
|
36
|
+
* a later change to the working memory leaves it as it is. The row and the seed
|
|
37
|
+
* commit in one transaction, because a report thread with no context is a dead
|
|
38
|
+
* end.
|
|
38
39
|
*
|
|
39
40
|
* The seed takes no redaction pass, and that is deliberate. The two parts are
|
|
40
41
|
* agent-authored, the same trust tier as the working-memory render of a
|
|
@@ -169,34 +170,14 @@ export function createReportSessionSpawn(deps) {
|
|
|
169
170
|
// An unbound member gives a call that does nothing, thus the spawn emits at
|
|
170
171
|
// one site with no test of its own.
|
|
171
172
|
const observe = bindSessionEmit(deps.provenance, log);
|
|
172
|
-
/**
|
|
173
|
-
* Write the one seed message of the child and give the child back. The
|
|
174
|
-
* message rides as a record, not as user input: nobody typed it in the child
|
|
175
|
-
* thread, and a record is displayed but it never opens a turn.
|
|
176
|
-
*/
|
|
177
|
-
function seedChildContext(child, brief) {
|
|
178
|
-
return workingMemory
|
|
179
|
-
.render(child.analysisId)
|
|
180
|
-
.andThen((memory) => history.appendTurn(child.threadId, conversationRecordTurn(composeSeed(brief, memory))))
|
|
181
|
-
.map(() => child)
|
|
182
|
-
.orElse((fault) =>
|
|
183
|
-
// A report thread with no context is a dead end, thus the purge
|
|
184
|
-
// removes the child. The seed fault is the cause, thus it returns
|
|
185
|
-
// from each route. A failed purge leaves the child, and the caller
|
|
186
|
-
// still reads why the seed stopped.
|
|
187
|
-
store
|
|
188
|
-
.purgeThread(child.threadId)
|
|
189
|
-
.andThen(() => errAsync(fault))
|
|
190
|
-
.orElse(() => errAsync(fault)));
|
|
191
|
-
}
|
|
192
173
|
/**
|
|
193
174
|
* Pin the data snapshot of the child, through the injected anchor operation.
|
|
194
175
|
* The spawn mints one moment, and the transcript anchor and this snapshot are
|
|
195
176
|
* the two pins of that moment.
|
|
196
177
|
*
|
|
197
|
-
* The pin runs after the
|
|
178
|
+
* The pin runs after the row and the seed commit.
|
|
198
179
|
* `cortex_report_session_state` carries no foreign key to the thread table,
|
|
199
|
-
* thus a pin before a
|
|
180
|
+
* thus a pin before a failed create would leave an orphan row.
|
|
200
181
|
*
|
|
201
182
|
* A failed pin keeps the child. The operation is idempotent, thus the first
|
|
202
183
|
* session tool call pins again, and a purge on a transient store fault would
|
|
@@ -247,7 +228,7 @@ export function createReportSessionSpawn(deps) {
|
|
|
247
228
|
return collectReportChildren(analysisId, parentThreadId, page + 1, all);
|
|
248
229
|
});
|
|
249
230
|
}
|
|
250
|
-
function spawnReportSession(parentThreadId, brief) {
|
|
231
|
+
function spawnReportSession(parentThreadId, brief, childThreadId = randomUUID()) {
|
|
251
232
|
// The gate runs before the parent read. A session with no route to a look
|
|
252
233
|
// reaches the record gate and refuses there forever, thus the spawn is the
|
|
253
234
|
// one honest place to say so.
|
|
@@ -274,18 +255,22 @@ export function createReportSessionSpawn(deps) {
|
|
|
274
255
|
// The result is two titles a user renames, and no identifier collides.
|
|
275
256
|
return store
|
|
276
257
|
.listThreads({ analysisId: parent.analysisId, type: "report", parentThreadId })
|
|
277
|
-
.andThen((children) =>
|
|
278
|
-
|
|
279
|
-
|
|
258
|
+
.andThen((children) =>
|
|
259
|
+
// The render follows the anchor read, thus the copy of the
|
|
260
|
+
// working memory is the state at the anchor.
|
|
261
|
+
workingMemory
|
|
262
|
+
.render(parent.analysisId)
|
|
263
|
+
.andThen((memory) => store.createThread({
|
|
264
|
+
threadId: childThreadId,
|
|
280
265
|
analysisId: parent.analysisId,
|
|
281
266
|
title: composeTitle(parent.title, children.total + 1),
|
|
282
267
|
type: "report",
|
|
283
268
|
parentThreadId,
|
|
284
269
|
parentSeq: anchor,
|
|
285
|
-
|
|
286
|
-
//
|
|
287
|
-
|
|
288
|
-
|
|
270
|
+
// The seed rides as a record, not as user input: nobody typed it in
|
|
271
|
+
// the child thread, and a record is displayed but it never opens a turn.
|
|
272
|
+
firstTurn: conversationRecordTurn(composeSeed(brief, memory)),
|
|
273
|
+
}))
|
|
289
274
|
// The pin follows the seed. `pinSessionSnapshot` never
|
|
290
275
|
// rejects, thus the safe bridge adds no error variant.
|
|
291
276
|
.andThen((child) => ResultAsync.fromSafePromise(pinSessionSnapshot(child))));
|
|
@@ -14,23 +14,23 @@
|
|
|
14
14
|
* honest non-fatal outcomes (no summaries, blocker) return empty findings after
|
|
15
15
|
* a `skipped` phase.
|
|
16
16
|
*/
|
|
17
|
-
import type {
|
|
17
|
+
import type { Querier } from "../state/db.js";
|
|
18
18
|
import type { SynthesisPhase } from "@inflexa-ai/harness/contracts/chat-parts.js";
|
|
19
19
|
import type { RunSession } from "../auth/types.js";
|
|
20
|
+
import type { LoopOptions } from "../loop/run-loop.js";
|
|
20
21
|
import type { ToolOutputStore } from "../loop/tool-output.js";
|
|
21
22
|
import type { EmitFn } from "../loop/types.js";
|
|
22
23
|
import type { ChatProvider, EmbeddingProvider } from "../providers/types.js";
|
|
23
|
-
import type { BioToolKeys } from "../tools/bio/keys.js";
|
|
24
24
|
import type { RunFinding } from "../workflows/execute-analysis.js";
|
|
25
25
|
import type { ResolveWorkspaceRoot } from "../workspace/paths.js";
|
|
26
26
|
import type { SynthesisStatus } from "../state/index.js";
|
|
27
27
|
import type { Logger } from "../lib/logger.js";
|
|
28
28
|
import type { UsageRecorder } from "../billing/usage-recorder.js";
|
|
29
|
-
import type {
|
|
30
|
-
export
|
|
29
|
+
import type { Tool } from "../tools/define-tool.js";
|
|
30
|
+
export type SynthesizeRunDeps = {
|
|
31
31
|
/** Operational logging seam; omitted falls back to no-op. */
|
|
32
32
|
readonly logger?: Logger;
|
|
33
|
-
readonly pool:
|
|
33
|
+
readonly pool: Querier;
|
|
34
34
|
readonly provider: ChatProvider;
|
|
35
35
|
/** Write-side embedder — its `dimensions` sizes the per-analysis index. */
|
|
36
36
|
readonly embedding: EmbeddingProvider;
|
|
@@ -38,22 +38,20 @@ export interface SynthesizeRunDeps {
|
|
|
38
38
|
readonly resolveWorkspaceRoot: ResolveWorkspaceRoot;
|
|
39
39
|
/** Model id for the synthesizer agent loop. */
|
|
40
40
|
readonly synthesisModel: string;
|
|
41
|
-
/**
|
|
42
|
-
readonly
|
|
43
|
-
/** Shared resolver used by the embedded literature reviewer. */
|
|
44
|
-
readonly citationResolver: CitationResolver;
|
|
41
|
+
/** The `literature_reviewer` tool of the synthesizer. */
|
|
42
|
+
readonly literatureReviewer: Tool;
|
|
45
43
|
/** LLM usage-accounting seam for the synthesizer loop; omitted falls back to the no-op recorder. */
|
|
46
44
|
readonly usageRecorder?: UsageRecorder;
|
|
47
45
|
/** The store of the synthesizer and reviewer loops and of their read tools. */
|
|
48
46
|
readonly toolOutputStore?: ToolOutputStore;
|
|
49
|
-
}
|
|
47
|
+
};
|
|
50
48
|
/** Optional fields for a progress update, mirroring the wire part. */
|
|
51
|
-
export
|
|
49
|
+
export type SynthesisProgressExtra = {
|
|
52
50
|
readonly delegationCount?: number;
|
|
53
51
|
readonly reason?: string;
|
|
54
52
|
readonly error?: string;
|
|
55
|
-
}
|
|
56
|
-
export
|
|
53
|
+
};
|
|
54
|
+
export type SynthesizeRunParams = {
|
|
57
55
|
readonly analysisId: string;
|
|
58
56
|
readonly runId: string;
|
|
59
57
|
readonly completedSteps: readonly string[];
|
|
@@ -62,10 +60,18 @@ export interface SynthesizeRunParams {
|
|
|
62
60
|
readonly emit: EmitFn;
|
|
63
61
|
/** Domain progress callback — the phases the run-completed UI renders. */
|
|
64
62
|
readonly onProgress: (phase: SynthesisPhase, activity: string, extra?: SynthesisProgressExtra) => void | Promise<void>;
|
|
65
|
-
|
|
66
|
-
|
|
63
|
+
/**
|
|
64
|
+
* Run a read or a write of the synthesis once: a step in the body of a workflow, a plain call in a process. The
|
|
65
|
+
* loop of the synthesizer runs outside it, thus each of its model calls is a step of its own, and each reviewer
|
|
66
|
+
* call starts a child workflow.
|
|
67
|
+
*/
|
|
68
|
+
readonly durably: <T>(name: string, run: () => Promise<T>) => Promise<T>;
|
|
69
|
+
/** The pause of the run, for the loop of the synthesizer. Absent: a failed request fails the synthesis. */
|
|
70
|
+
readonly pause?: LoopOptions["pause"];
|
|
71
|
+
};
|
|
72
|
+
export type SynthesizeRunResult = {
|
|
67
73
|
readonly findings: readonly RunFinding[];
|
|
68
74
|
readonly synthesisStatus: Exclude<SynthesisStatus, "failed">;
|
|
69
75
|
readonly synthesisReason: string | null;
|
|
70
|
-
}
|
|
76
|
+
};
|
|
71
77
|
export declare function synthesizeRun(deps: SynthesizeRunDeps, params: SynthesizeRunParams): Promise<SynthesizeRunResult>;
|
|
@@ -14,6 +14,9 @@
|
|
|
14
14
|
* honest non-fatal outcomes (no summaries, blocker) return empty findings after
|
|
15
15
|
* a `skipped` phase.
|
|
16
16
|
*/
|
|
17
|
+
import { errorMessageOf } from "../lib/thrown.js";
|
|
18
|
+
import { textOf } from "../lib/unknown-text.js";
|
|
19
|
+
import { z } from "zod";
|
|
17
20
|
import { forSubAgent } from "../auth/types.js";
|
|
18
21
|
import { buildRunSynthesisPart, formatSynthesisEmbeddingText, generateRunSynthesis, loadStepSummariesFromDisk, persistSynthesis, } from "../execution/run-synthesis.js";
|
|
19
22
|
import { ensureSearchIndex, searchIndexName } from "../workspace/search-config.js";
|
|
@@ -22,15 +25,13 @@ import { loadPlan, queryRun } from "../state/index.js";
|
|
|
22
25
|
import { unwrapOrThrow } from "../lib/result.js";
|
|
23
26
|
import { createNoopLogger } from "../lib/console-logger.js";
|
|
24
27
|
export async function synthesizeRun(deps, params) {
|
|
25
|
-
const { pool, provider, embedding, resolveWorkspaceRoot, synthesisModel,
|
|
26
|
-
const { analysisId, runId, completedSteps, session, emit, onProgress } = params;
|
|
28
|
+
const { pool, provider, embedding, resolveWorkspaceRoot, synthesisModel, literatureReviewer, usageRecorder } = deps;
|
|
29
|
+
const { analysisId, runId, completedSteps, session, emit, onProgress, durably, pause } = params;
|
|
27
30
|
await onProgress("starting", "Beginning literature-grounded synthesis");
|
|
28
31
|
try {
|
|
29
|
-
const workspaceRoot = await
|
|
30
|
-
|
|
31
|
-
workspaceRoot,
|
|
32
|
-
runId,
|
|
33
|
-
completedSteps,
|
|
32
|
+
const { workspaceRoot, summaries } = await durably("synthesis.read-summaries", async () => {
|
|
33
|
+
const root = await resolveWorkspaceRoot(analysisId);
|
|
34
|
+
return { workspaceRoot: root, summaries: await loadStepSummariesFromDisk({ workspaceRoot: root, runId, completedSteps }) };
|
|
34
35
|
});
|
|
35
36
|
if (summaries.length === 0) {
|
|
36
37
|
const logger = (deps.logger ?? createNoopLogger()).named("synthesize-run");
|
|
@@ -40,20 +41,20 @@ export async function synthesizeRun(deps, params) {
|
|
|
40
41
|
});
|
|
41
42
|
return { findings: [], synthesisStatus: "skipped_no_summaries", synthesisReason: "no-summaries" };
|
|
42
43
|
}
|
|
43
|
-
const planNarrative = await loadPlanNarrative(pool, runId, analysisId);
|
|
44
|
+
const planNarrative = await durably("synthesis.read-plan", () => loadPlanNarrative(pool, runId, analysisId));
|
|
44
45
|
const synthesizerSession = forSubAgent(session, "run-synthesizer");
|
|
45
46
|
const result = await generateRunSynthesis({
|
|
46
47
|
provider,
|
|
47
48
|
session: synthesizerSession,
|
|
48
49
|
model: synthesisModel,
|
|
49
|
-
|
|
50
|
-
citationResolver,
|
|
50
|
+
literatureReviewer,
|
|
51
51
|
usageRecorder,
|
|
52
|
-
|
|
52
|
+
toolOutputStore: deps.toolOutputStore,
|
|
53
53
|
summaries,
|
|
54
54
|
planNarrative,
|
|
55
55
|
runId,
|
|
56
56
|
emit,
|
|
57
|
+
pause,
|
|
57
58
|
});
|
|
58
59
|
if (result.kind === "skipped") {
|
|
59
60
|
const logger = (deps.logger ?? createNoopLogger()).named("synthesize-run");
|
|
@@ -68,27 +69,29 @@ export async function synthesizeRun(deps, params) {
|
|
|
68
69
|
}
|
|
69
70
|
const synthesis = result.synthesis;
|
|
70
71
|
await onProgress("indexing", "Indexing synthesis for search");
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
72
|
+
await durably("synthesis.index", async () => {
|
|
73
|
+
try {
|
|
74
|
+
await ensureSearchIndex(pool, analysisId, embedding.dimensions);
|
|
75
|
+
const vectorStore = createVectorStore(pool);
|
|
76
|
+
const indexName = searchIndexName(analysisId);
|
|
77
|
+
const synthesisText = formatSynthesisEmbeddingText(synthesis);
|
|
78
|
+
const [vector] = unwrapOrThrow(await embedding.embed([synthesisText], synthesizerSession));
|
|
79
|
+
if (!vector)
|
|
80
|
+
throw new Error("synthesize-run: empty embedding response");
|
|
81
|
+
unwrapOrThrow(await vectorStore.upsert({
|
|
82
|
+
indexName,
|
|
83
|
+
vectors: [vector],
|
|
84
|
+
metadata: [{ text: synthesisText, type: "synthesis", runId, path: `runs/${runId}/synthesis.json` }],
|
|
85
|
+
ids: [`/${analysisId}/runs/${runId}/synthesis.json`],
|
|
86
|
+
}));
|
|
87
|
+
}
|
|
88
|
+
catch (indexErr) {
|
|
89
|
+
const logger = (deps.logger ?? createNoopLogger()).named("synthesize-run");
|
|
90
|
+
logger.warn("vector indexing failed", { runId, ...logger.errorFields(indexErr) });
|
|
91
|
+
}
|
|
92
|
+
});
|
|
90
93
|
await onProgress("persisting", "Persisting synthesis");
|
|
91
|
-
await persistSynthesis({ workspaceRoot, runId, synthesis });
|
|
94
|
+
await durably("synthesis.persist", () => persistSynthesis({ workspaceRoot, runId, synthesis }));
|
|
92
95
|
await emit(buildRunSynthesisPart(runId, synthesis));
|
|
93
96
|
await onProgress("complete", "Literature-grounded synthesis ready");
|
|
94
97
|
return {
|
|
@@ -101,11 +104,11 @@ export async function synthesizeRun(deps, params) {
|
|
|
101
104
|
};
|
|
102
105
|
}
|
|
103
106
|
catch (err) {
|
|
104
|
-
const msg = err
|
|
107
|
+
const msg = errorMessageOf(err) ?? textOf(err);
|
|
105
108
|
await onProgress("failed", "Synthesis could not be completed — step summaries are still available", { error: msg });
|
|
106
109
|
// A genuine synthesis failure must fail the run loudly (D10): re-throw so
|
|
107
|
-
// the
|
|
108
|
-
//
|
|
110
|
+
// the parent workflow goes to ERROR. The honest non-fatal outcomes
|
|
111
|
+
// (no-summaries / blocker) early-return above.
|
|
109
112
|
throw err;
|
|
110
113
|
}
|
|
111
114
|
}
|
|
@@ -115,5 +118,8 @@ async function loadPlanNarrative(pool, runId, analysisId) {
|
|
|
115
118
|
if (!planId)
|
|
116
119
|
return "";
|
|
117
120
|
const plan = unwrapOrThrow(await loadPlan(pool, planId, { analysisId }));
|
|
118
|
-
|
|
121
|
+
const parsed = PlanNarrativeSchema.nullable().catch(null).parse(plan);
|
|
122
|
+
return parsed?.analytical_narrative ?? "";
|
|
119
123
|
}
|
|
124
|
+
/** The one field of the stored plan document this reader takes; every other field passes. */
|
|
125
|
+
const PlanNarrativeSchema = z.looseObject({ analytical_narrative: z.string().optional() });
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The durable work of an analysis, as a host lists, stops, resumes, and holds it (work-pause spec).
|
|
3
|
+
*
|
|
4
|
+
* A work is a chat turn, a run, or a data profile. Each work that is active is in the list, and a work that waits
|
|
5
|
+
* in a pause carries each of its waiting workflows. One work can have more than one waiting workflow: a sub-agent
|
|
6
|
+
* of a turn and each step of a run wait in their own workflows. A stop ends a work in each state. A resume and a
|
|
7
|
+
* hold reach only a work that waits. Only a client resumes paused work.
|
|
8
|
+
*/
|
|
9
|
+
import type { PauseCause, WorkKind } from "../contracts/chat-parts.js";
|
|
10
|
+
import type { RunAuthorizer } from "../execution/run-authorizer.js";
|
|
11
|
+
import type { RunCanceler } from "../execution/run-canceler.js";
|
|
12
|
+
import type { Logger } from "../lib/logger.js";
|
|
13
|
+
import type { Querier } from "../state/db.js";
|
|
14
|
+
import type { ChatTurnSession } from "./chat-turn.js";
|
|
15
|
+
/** One waiting workflow of a paused work. */
|
|
16
|
+
export type PausedWorkflow = {
|
|
17
|
+
readonly workflowId: string;
|
|
18
|
+
readonly state: "retrying" | "paused";
|
|
19
|
+
readonly cause: PauseCause;
|
|
20
|
+
/** The count of timer retries before this wait. */
|
|
21
|
+
readonly attempt: number;
|
|
22
|
+
/** ISO 8601. Present for the state `retrying` only. */
|
|
23
|
+
readonly retryAt?: string;
|
|
24
|
+
/** ISO 8601. */
|
|
25
|
+
readonly pausedAt: string;
|
|
26
|
+
};
|
|
27
|
+
/** One active work: a turn, a run, or a data profile. */
|
|
28
|
+
export type Work = {
|
|
29
|
+
/** The turn id, the run id, or the id of the profile workflow. */
|
|
30
|
+
readonly workId: string;
|
|
31
|
+
readonly kind: WorkKind;
|
|
32
|
+
readonly analysisId: string;
|
|
33
|
+
readonly threadId?: string;
|
|
34
|
+
/** Each waiting workflow of the work. Empty for a work that runs. */
|
|
35
|
+
readonly waiting: readonly PausedWorkflow[];
|
|
36
|
+
};
|
|
37
|
+
export type WorkStop = {
|
|
38
|
+
readonly kind: "stopped";
|
|
39
|
+
readonly work: Work;
|
|
40
|
+
} | {
|
|
41
|
+
readonly kind: "not_found";
|
|
42
|
+
};
|
|
43
|
+
export type WorkResume = {
|
|
44
|
+
readonly kind: "resumed";
|
|
45
|
+
readonly workflows: number;
|
|
46
|
+
} | {
|
|
47
|
+
readonly kind: "not_found";
|
|
48
|
+
}
|
|
49
|
+
/** The host refused to renew the run credential under the session, thus the work stays paused. */
|
|
50
|
+
| {
|
|
51
|
+
readonly kind: "refused";
|
|
52
|
+
readonly reason: string;
|
|
53
|
+
};
|
|
54
|
+
/** `workflows` is the count of waits in `retrying` that the hold reached. A wait in `paused` needs no hold. */
|
|
55
|
+
export type WorkHold = {
|
|
56
|
+
readonly kind: "held";
|
|
57
|
+
readonly workflows: number;
|
|
58
|
+
} | {
|
|
59
|
+
readonly kind: "not_found";
|
|
60
|
+
};
|
|
61
|
+
/** The durable work of a runtime, as a host uses it. */
|
|
62
|
+
export type WorkSurface = {
|
|
63
|
+
/**
|
|
64
|
+
* The active work of an analysis: each turn that holds a thread, each `running` run, and the profile that runs.
|
|
65
|
+
* A pause row whose workflow ended is not in it, and the list deletes that row.
|
|
66
|
+
*/
|
|
67
|
+
list(analysisId: string): Promise<Work[]>;
|
|
68
|
+
/**
|
|
69
|
+
* Stop the work, in each state: a turn stops, a run cancels with its children, and a profile fails. Work of a
|
|
70
|
+
* different analysis than the session gives `not_found`.
|
|
71
|
+
*/
|
|
72
|
+
stop(session: ChatTurnSession, workId: string): Promise<WorkStop>;
|
|
73
|
+
/**
|
|
74
|
+
* Resume the work: each of its waiting workflows sends its request again. A wait in `retrying` ends at once, thus
|
|
75
|
+
* the same call is "retry now". For a turn, the credential of the session goes to the turn first. For a run or a
|
|
76
|
+
* profile, the host renews the run credential under the session first, and a refusal sends nothing. Work of a
|
|
77
|
+
* different analysis than the session gives `not_found`.
|
|
78
|
+
*/
|
|
79
|
+
resume(session: ChatTurnSession, workId: string): Promise<WorkResume>;
|
|
80
|
+
/**
|
|
81
|
+
* Hold the work: each of its waits in `retrying` moves to `paused`, and its timer stops. The work then waits for a
|
|
82
|
+
* resume. Work of a different analysis than the session gives `not_found`.
|
|
83
|
+
*/
|
|
84
|
+
hold(session: ChatTurnSession, workId: string): Promise<WorkHold>;
|
|
85
|
+
};
|
|
86
|
+
export type WorkDeps = {
|
|
87
|
+
readonly pool: Querier;
|
|
88
|
+
readonly runAuthorizer: RunAuthorizer;
|
|
89
|
+
readonly logger?: Logger;
|
|
90
|
+
/** The stop of a chat turn. */
|
|
91
|
+
readonly stopTurn: (turnId: string) => Promise<void>;
|
|
92
|
+
readonly runCanceler: RunCanceler;
|
|
93
|
+
/** The stop of the profile workflow of an analysis. */
|
|
94
|
+
readonly stopProfile: (analysisId: string, workflowId: string) => Promise<void>;
|
|
95
|
+
};
|
|
96
|
+
export declare function createWork(deps: WorkDeps): WorkSurface;
|
package/dist/app/work.js
ADDED
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The durable work of an analysis, as a host lists, stops, resumes, and holds it (work-pause spec).
|
|
3
|
+
*
|
|
4
|
+
* A work is a chat turn, a run, or a data profile. Each work that is active is in the list, and a work that waits
|
|
5
|
+
* in a pause carries each of its waiting workflows. One work can have more than one waiting workflow: a sub-agent
|
|
6
|
+
* of a turn and each step of a run wait in their own workflows. A stop ends a work in each state. A resume and a
|
|
7
|
+
* hold reach only a work that waits. Only a client resumes paused work.
|
|
8
|
+
*/
|
|
9
|
+
import { DBOS } from "@dbos-inc/dbos-sdk";
|
|
10
|
+
import { createNoopLogger } from "../lib/console-logger.js";
|
|
11
|
+
import { passGate } from "../lib/hooks.js";
|
|
12
|
+
import { unwrapOrThrow } from "../lib/result.js";
|
|
13
|
+
import { turnCredentials } from "../loop/turn-credentials.js";
|
|
14
|
+
import { queryTurnsOfAnalysis } from "../state/active-turns.js";
|
|
15
|
+
import { loadDataProfileStatus } from "../state/data-profile.js";
|
|
16
|
+
import { clearPauses, queryPausesOfAnalysis, queryPausesOfWork } from "../state/paused-work.js";
|
|
17
|
+
import { queryActiveRunsByAnalysis } from "../state/runs.js";
|
|
18
|
+
import { HOLD_MESSAGE, RESUME_MESSAGE } from "../workflows/pause.js";
|
|
19
|
+
/** The workflow statuses that can still wait. */
|
|
20
|
+
const ACTIVE_STATUSES = new Set(["PENDING", "ENQUEUED"]);
|
|
21
|
+
/** The provenance of a run cancel that a stop of work makes. */
|
|
22
|
+
const WORK_STOP_PROVENANCE = { agentId: "work-stop", callPath: ["work-stop"] };
|
|
23
|
+
function workflowOf(record) {
|
|
24
|
+
return {
|
|
25
|
+
workflowId: record.workflowId,
|
|
26
|
+
state: record.state,
|
|
27
|
+
cause: record.cause,
|
|
28
|
+
attempt: record.attempt,
|
|
29
|
+
retryAt: record.retryAt,
|
|
30
|
+
pausedAt: record.pausedAt,
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
async function activeWorkflows(workflowIds) {
|
|
34
|
+
if (workflowIds.length === 0)
|
|
35
|
+
return new Set();
|
|
36
|
+
const statuses = await DBOS.listWorkflows({ workflowIDs: [...workflowIds], loadInput: false, loadOutput: false });
|
|
37
|
+
return new Set(statuses.filter((status) => ACTIVE_STATUSES.has(status.status)).map((status) => status.workflowID));
|
|
38
|
+
}
|
|
39
|
+
export function createWork(deps) {
|
|
40
|
+
const logger = (deps.logger ?? createNoopLogger()).named("harness.work");
|
|
41
|
+
async function list(analysisId) {
|
|
42
|
+
const [records, turns, runs, profile] = await Promise.all([
|
|
43
|
+
(async () => unwrapOrThrow(await queryPausesOfAnalysis(deps.pool, analysisId)))(),
|
|
44
|
+
(async () => unwrapOrThrow(await queryTurnsOfAnalysis(deps.pool, analysisId)))(),
|
|
45
|
+
(async () => unwrapOrThrow(await queryActiveRunsByAnalysis(deps.pool, analysisId)))(),
|
|
46
|
+
(async () => unwrapOrThrow(await loadDataProfileStatus(deps.pool, analysisId)))(),
|
|
47
|
+
]);
|
|
48
|
+
const profileWorkflowId = profile?.status === "running" ? (profile.workflowId ?? undefined) : undefined;
|
|
49
|
+
const active = await activeWorkflows([
|
|
50
|
+
...records.map((record) => record.workflowId),
|
|
51
|
+
...turns.map((turn) => turn.turnId),
|
|
52
|
+
...(profileWorkflowId === undefined ? [] : [profileWorkflowId]),
|
|
53
|
+
]);
|
|
54
|
+
const ended = records.filter((record) => !active.has(record.workflowId)).map((record) => record.workflowId);
|
|
55
|
+
if (ended.length > 0) {
|
|
56
|
+
const cleared = await clearPauses(deps.pool, ended);
|
|
57
|
+
if (cleared.isErr())
|
|
58
|
+
logger.warn("the rows of ended pauses did not clear", { op: cleared.error.op, workflows: ended.length });
|
|
59
|
+
}
|
|
60
|
+
const waitingOf = new Map();
|
|
61
|
+
for (const record of records) {
|
|
62
|
+
if (!active.has(record.workflowId))
|
|
63
|
+
continue;
|
|
64
|
+
waitingOf.set(record.workId, [...(waitingOf.get(record.workId) ?? []), workflowOf(record)]);
|
|
65
|
+
}
|
|
66
|
+
const work = new Map();
|
|
67
|
+
const add = (workId, kind, threadId) => {
|
|
68
|
+
if (work.has(workId))
|
|
69
|
+
return;
|
|
70
|
+
work.set(workId, { workId, kind, analysisId, threadId, waiting: waitingOf.get(workId) ?? [] });
|
|
71
|
+
};
|
|
72
|
+
// A claim can outlive its turn, thus a turn is active while its workflow is. A `running` run is active while
|
|
73
|
+
// its row is, because the run canceler also converges a row whose workflow ended.
|
|
74
|
+
for (const turn of turns)
|
|
75
|
+
if (active.has(turn.turnId))
|
|
76
|
+
add(turn.turnId, "turn", turn.threadId);
|
|
77
|
+
for (const run of runs)
|
|
78
|
+
add(run.runId, "run", run.threadId ?? undefined);
|
|
79
|
+
if (profileWorkflowId !== undefined && active.has(profileWorkflowId))
|
|
80
|
+
add(profileWorkflowId, "profile", undefined);
|
|
81
|
+
for (const record of records)
|
|
82
|
+
if (active.has(record.workflowId))
|
|
83
|
+
add(record.workId, record.workKind, record.threadId);
|
|
84
|
+
return [...work.values()];
|
|
85
|
+
}
|
|
86
|
+
return {
|
|
87
|
+
list,
|
|
88
|
+
async stop(session, workId) {
|
|
89
|
+
const work = (await list(session.scope.analysisId)).find((candidate) => candidate.workId === workId);
|
|
90
|
+
if (work === undefined)
|
|
91
|
+
return { kind: "not_found" };
|
|
92
|
+
switch (work.kind) {
|
|
93
|
+
case "turn":
|
|
94
|
+
await deps.stopTurn(workId);
|
|
95
|
+
break;
|
|
96
|
+
case "run": {
|
|
97
|
+
const { outcome, converged } = await deps.runCanceler.cancel(workId, { ...session, provenance: WORK_STOP_PROVENANCE });
|
|
98
|
+
// A run that ended before the cancel converged nothing, and needs nothing.
|
|
99
|
+
if (outcome === "canceled" && !(converged.steps && converged.charge && converged.mandate)) {
|
|
100
|
+
logger.warn("the stop of a run did not converge", { workId, ...converged });
|
|
101
|
+
}
|
|
102
|
+
break;
|
|
103
|
+
}
|
|
104
|
+
case "profile":
|
|
105
|
+
await deps.stopProfile(work.analysisId, workId);
|
|
106
|
+
break;
|
|
107
|
+
default: {
|
|
108
|
+
const exhaustive = work.kind;
|
|
109
|
+
throw new Error(`unknown work kind: ${String(exhaustive)}`);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
logger.info("work stopped", { workId, kind: work.kind });
|
|
113
|
+
return { kind: "stopped", work };
|
|
114
|
+
},
|
|
115
|
+
async resume(session, workId) {
|
|
116
|
+
const records = unwrapOrThrow(await queryPausesOfWork(deps.pool, session.scope.analysisId, workId));
|
|
117
|
+
if (records.length === 0)
|
|
118
|
+
return { kind: "not_found" };
|
|
119
|
+
// Each workflow of one work holds the same run credential, thus one renewal covers the work.
|
|
120
|
+
const runSession = records.find((record) => record.runSession !== undefined)?.runSession;
|
|
121
|
+
if (runSession !== undefined) {
|
|
122
|
+
const renewed = await passGate("RunAuthorizer.renew", deps.runAuthorizer.renew(runSession, session.auth));
|
|
123
|
+
if (renewed.isErr()) {
|
|
124
|
+
logger.warn("work resume refused", { workId, reason: renewed.error.reason });
|
|
125
|
+
return { kind: "refused", reason: renewed.error.reason };
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
if (records.some((record) => record.workKind === "turn"))
|
|
129
|
+
turnCredentials.put(workId, session.auth);
|
|
130
|
+
// One send for each waiting workflow of the work. The key of the send is the topic of its pause, thus a
|
|
131
|
+
// second resume of the same pause sends nothing new.
|
|
132
|
+
await Promise.all(records.map((record) => DBOS.send(record.workflowId, RESUME_MESSAGE, record.topic, record.topic)));
|
|
133
|
+
logger.info("work resumed", { workId, workflows: records.length });
|
|
134
|
+
return { kind: "resumed", workflows: records.length };
|
|
135
|
+
},
|
|
136
|
+
async hold(session, workId) {
|
|
137
|
+
const records = unwrapOrThrow(await queryPausesOfWork(deps.pool, session.scope.analysisId, workId));
|
|
138
|
+
if (records.length === 0)
|
|
139
|
+
return { kind: "not_found" };
|
|
140
|
+
const retrying = records.filter((record) => record.state === "retrying");
|
|
141
|
+
// The key of the send names the pause, thus a second hold of the same pause sends nothing new.
|
|
142
|
+
await Promise.all(retrying.map((record) => DBOS.send(record.workflowId, HOLD_MESSAGE, record.topic, `${record.topic}:hold`)));
|
|
143
|
+
logger.info("work held", { workId, workflows: retrying.length });
|
|
144
|
+
return { kind: "held", workflows: retrying.length };
|
|
145
|
+
},
|
|
146
|
+
};
|
|
147
|
+
}
|
|
@@ -12,8 +12,6 @@
|
|
|
12
12
|
import type { AuthContext } from "./types.js";
|
|
13
13
|
/**
|
|
14
14
|
* Build the trivial opaque `auth` value an OSS session constructor stores.
|
|
15
|
-
* Returned as `AuthContext` so callers stay credential-blind.
|
|
16
|
-
* the empty literal to the phantom-branded interface; the brand is an optional
|
|
17
|
-
* `never`, so no real field is fabricated.
|
|
15
|
+
* Returned as `AuthContext` so callers stay credential-blind.
|
|
18
16
|
*/
|
|
19
17
|
export declare function makeLocalAuth(): AuthContext;
|
|
@@ -11,9 +11,7 @@
|
|
|
11
11
|
*/
|
|
12
12
|
/**
|
|
13
13
|
* Build the trivial opaque `auth` value an OSS session constructor stores.
|
|
14
|
-
* Returned as `AuthContext` so callers stay credential-blind.
|
|
15
|
-
* the empty literal to the phantom-branded interface; the brand is an optional
|
|
16
|
-
* `never`, so no real field is fabricated.
|
|
14
|
+
* Returned as `AuthContext` so callers stay credential-blind.
|
|
17
15
|
*/
|
|
18
16
|
export function makeLocalAuth() {
|
|
19
17
|
return {};
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Issues a durable `RunSession` straight from the async-edge input: no remote
|
|
5
5
|
* authorization, no credential read. It owns nothing revocable (it mints no
|
|
6
|
-
*
|
|
6
|
+
* reference), so `revoke`, `revokeByMandateId`, `suspend`, and `renew` are no-ops. The opaque caller `auth` is
|
|
7
7
|
* forwarded untouched — local code never
|
|
8
8
|
* inspects it (no `getAuth`).
|
|
9
9
|
*/
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Issues a durable `RunSession` straight from the async-edge input: no remote
|
|
5
5
|
* authorization, no credential read. It owns nothing revocable (it mints no
|
|
6
|
-
*
|
|
6
|
+
* reference), so `revoke`, `revokeByMandateId`, `suspend`, and `renew` are no-ops. The opaque caller `auth` is
|
|
7
7
|
* forwarded untouched — local code never
|
|
8
8
|
* inspects it (no `getAuth`).
|
|
9
9
|
*/
|
|
@@ -18,9 +18,11 @@ export function createLocalRunAuthorizer() {
|
|
|
18
18
|
runFrame: frame,
|
|
19
19
|
auth,
|
|
20
20
|
};
|
|
21
|
-
return okAsync(
|
|
21
|
+
return okAsync(runSession);
|
|
22
22
|
},
|
|
23
23
|
revoke: () => okAsync(undefined),
|
|
24
|
-
|
|
24
|
+
revokeByMandateId: () => okAsync(undefined), // oss-core-managed-ok
|
|
25
|
+
suspend: () => okAsync(undefined),
|
|
26
|
+
renew: () => okAsync(undefined),
|
|
25
27
|
};
|
|
26
28
|
}
|