@inflexa-ai/harness 0.45.1 → 0.46.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +6 -3
- package/dist/agents/conversation-agent.d.ts +9 -3
- package/dist/agents/conversation-agent.js +34 -33
- package/dist/agents/report-session-agent.d.ts +15 -15
- package/dist/agents/report-session-agent.js +23 -15
- package/dist/agents/sandbox/index.d.ts +1 -1
- package/dist/agents/sandbox/index.js +1 -1
- package/dist/agents/sandbox/shared.d.ts +12 -14
- package/dist/agents/sandbox/shared.js +18 -12
- package/dist/agents/sandbox/types.d.ts +4 -4
- package/dist/agents/sandbox/validate-skills.d.ts +2 -2
- package/dist/agents/sandbox/validate-skills.js +3 -1
- package/dist/agents/sandbox-catalog.d.ts +2 -2
- package/dist/agents/sandbox-catalog.js +3 -3
- package/dist/agents/system-prompt.d.ts +2 -2
- package/dist/app/chat-turn-workflow.d.ts +114 -0
- package/dist/app/chat-turn-workflow.js +307 -0
- package/dist/app/chat-turn.d.ts +85 -57
- package/dist/app/chat-turn.js +123 -100
- package/dist/app/data-profile-orientation.js +10 -8
- package/dist/app/data-profile-view.d.ts +4 -4
- package/dist/app/data-profile-view.js +9 -8
- package/dist/app/in-process-turn.d.ts +42 -0
- package/dist/app/in-process-turn.js +139 -0
- package/dist/app/message-assembly.d.ts +10 -4
- package/dist/app/message-assembly.js +13 -8
- package/dist/app/report-session-runtime.d.ts +4 -4
- package/dist/app/report-session-runtime.js +36 -21
- package/dist/app/spawn-report-session.d.ts +33 -28
- package/dist/app/spawn-report-session.js +25 -40
- package/dist/app/synthesize-run.d.ts +22 -16
- package/dist/app/synthesize-run.js +41 -35
- package/dist/app/work.d.ts +96 -0
- package/dist/app/work.js +147 -0
- package/dist/auth/local-auth-context.d.ts +1 -3
- package/dist/auth/local-auth-context.js +1 -3
- package/dist/auth/local-run-authorizer.d.ts +1 -1
- package/dist/auth/local-run-authorizer.js +5 -3
- package/dist/auth/types.d.ts +26 -26
- package/dist/billing/cached-resolver.d.ts +4 -4
- package/dist/billing/run-charge.d.ts +5 -8
- package/dist/billing/run-charge.js +2 -2
- package/dist/billing/usage-recorder.d.ts +9 -9
- package/dist/citations/aggregate.js +1 -1
- package/dist/citations/clients/arxiv.d.ts +2 -2
- package/dist/citations/clients/arxiv.js +12 -4
- package/dist/citations/clients/common.js +4 -2
- package/dist/citations/clients/crossref.d.ts +2 -2
- package/dist/citations/clients/crossref.js +37 -37
- package/dist/citations/clients/doi-registry.js +15 -16
- package/dist/citations/clients/pubmed.d.ts +2 -2
- package/dist/citations/clients/pubmed.js +20 -13
- package/dist/citations/clients/semantic-scholar.d.ts +2 -2
- package/dist/citations/clients/semantic-scholar.js +9 -9
- package/dist/citations/compare.js +2 -2
- package/dist/citations/match.d.ts +2 -2
- package/dist/citations/match.js +12 -7
- package/dist/citations/normalize.js +35 -26
- package/dist/citations/plan.js +6 -2
- package/dist/citations/resolve.d.ts +6 -6
- package/dist/citations/resolve.js +34 -25
- package/dist/citations/types.d.ts +77 -77
- package/dist/config/environment-stores.d.ts +6 -6
- package/dist/config/resource-limits.js +1 -3
- package/dist/contracts/analogy-report.d.ts +7 -7
- package/dist/contracts/analogy-report.js +2 -2
- package/dist/contracts/chat-events.d.ts +38 -24
- package/dist/contracts/chat-frame.d.ts +15 -5
- package/dist/contracts/chat-frame.js +64 -41
- package/dist/contracts/chat-parts.d.ts +130 -67
- package/dist/contracts/chat-parts.js +1 -0
- package/dist/contracts/content-url.js +16 -2
- package/dist/contracts/data-profile.d.ts +38 -38
- package/dist/contracts/index.d.ts +2 -2
- package/dist/contracts/index.js +1 -1
- package/dist/contracts/message.d.ts +6 -6
- package/dist/contracts/organ-system.d.ts +11 -11
- package/dist/contracts/part-registry.d.ts +5 -4
- package/dist/contracts/part-registry.js +5 -0
- package/dist/contracts/profile-vocabulary.d.ts +11 -10
- package/dist/contracts/profile-vocabulary.js +10 -3
- package/dist/contracts/report-blocks.d.ts +329 -329
- package/dist/contracts/report-reference.d.ts +105 -81
- package/dist/contracts/report-reference.js +30 -13
- package/dist/contracts/schemas/chat-events.d.ts +30 -16
- package/dist/contracts/schemas/chat-events.js +15 -6
- package/dist/contracts/schemas/chat-parts.d.ts +175 -102
- package/dist/contracts/schemas/chat-parts.js +33 -7
- package/dist/contracts/severity.d.ts +1 -1
- package/dist/contracts/structure-source.d.ts +3 -3
- package/dist/contracts/structure-source.js +6 -2
- package/dist/contracts/subagent-activity.d.ts +2 -2
- package/dist/contracts/subagent-activity.js +5 -3
- package/dist/contracts/usage.d.ts +2 -2
- package/dist/data/safety-panel-schema.d.ts +25 -25
- package/dist/data/safety-panel-schema.js +13 -4
- package/dist/execution/artifact-metadata.d.ts +23 -15
- package/dist/execution/artifact-metadata.js +33 -10
- package/dist/execution/artifact-record.d.ts +2 -2
- package/dist/execution/artifact-registration.d.ts +5 -5
- package/dist/execution/artifact-registry.d.ts +8 -8
- package/dist/execution/dbos-run-launcher.d.ts +24 -4
- package/dist/execution/dbos-run-launcher.js +58 -4
- package/dist/execution/dbos-workflow-purger.d.ts +5 -6
- package/dist/execution/dbos-workflow-purger.js +8 -7
- package/dist/execution/input-signature.d.ts +2 -2
- package/dist/execution/post-step-pipeline.d.ts +9 -9
- package/dist/execution/post-step-pipeline.js +1 -1
- package/dist/execution/post-step.js +2 -2
- package/dist/execution/reconcile-manifest.d.ts +4 -4
- package/dist/execution/reconcile-manifest.js +3 -2
- package/dist/execution/run-authorizer.d.ts +46 -37
- package/dist/execution/run-authorizer.js +8 -8
- package/dist/execution/run-canceler.d.ts +7 -7
- package/dist/execution/run-canceler.js +14 -7
- package/dist/execution/run-end-record.d.ts +2 -3
- package/dist/execution/run-event-parts.d.ts +0 -8
- package/dist/execution/run-event-parts.js +29 -24
- package/dist/execution/run-event-stream.d.ts +8 -8
- package/dist/execution/run-event-stream.js +3 -4
- package/dist/execution/run-launcher.d.ts +4 -4
- package/dist/execution/run-synthesis.d.ts +49 -48
- package/dist/execution/run-synthesis.js +96 -255
- package/dist/execution/staged-input.d.ts +2 -2
- package/dist/execution/step-summary.d.ts +6 -6
- package/dist/execution/step-summary.js +4 -8
- package/dist/execution/topo-sort.js +4 -3
- package/dist/execution/workflow-purger.d.ts +2 -2
- package/dist/index.d.ts +17 -20
- package/dist/index.js +25 -36
- package/dist/input-sanitization.js +9 -2
- package/dist/input-scan/clustering.d.ts +6 -6
- package/dist/input-scan/clustering.js +11 -5
- package/dist/input-scan/companions.js +3 -2
- package/dist/input-scan/detect-sets.d.ts +2 -2
- package/dist/input-scan/detect-sets.js +25 -21
- package/dist/input-scan/enrich.d.ts +6 -6
- package/dist/input-scan/enrich.js +29 -12
- package/dist/input-scan/formats.d.ts +2 -2
- package/dist/input-scan/formats.js +8 -2
- package/dist/input-scan/markers.d.ts +2 -2
- package/dist/input-scan/markers.js +14 -5
- package/dist/input-scan/menu.d.ts +10 -10
- package/dist/input-scan/menu.js +0 -0
- package/dist/input-scan/quarantine.d.ts +2 -2
- package/dist/input-scan/quarantine.js +23 -18
- package/dist/input-scan/readout-budget.d.ts +2 -2
- package/dist/input-scan/readout-budget.js +1 -1
- package/dist/input-scan/readout.d.ts +2 -2
- package/dist/input-scan/readout.js +47 -34
- package/dist/input-scan/scan.d.ts +2 -2
- package/dist/input-scan/scan.js +7 -5
- package/dist/input-scan/set-types.d.ts +28 -28
- package/dist/input-scan/shapes.d.ts +4 -4
- package/dist/input-scan/shapes.js +0 -0
- package/dist/input-scan/templates.d.ts +10 -10
- package/dist/input-scan/templates.js +30 -22
- package/dist/input-scan/tokens.d.ts +6 -4
- package/dist/input-scan/tokens.js +100 -38
- package/dist/input-scan/types.d.ts +22 -22
- package/dist/lib/async-utils.d.ts +3 -7
- package/dist/lib/async-utils.js +5 -9
- package/dist/lib/cache.js +1 -1
- package/dist/lib/chrome.d.ts +46 -6
- package/dist/lib/console-logger.js +2 -2
- package/dist/lib/db-result.d.ts +22 -6
- package/dist/lib/db-result.js +9 -13
- package/dist/lib/eyes.d.ts +4 -4
- package/dist/lib/eyes.js +1 -1
- package/dist/lib/fs-helpers.js +18 -6
- package/dist/lib/fs-result.d.ts +1 -0
- package/dist/lib/fs-result.js +5 -6
- package/dist/lib/hooks.d.ts +23 -7
- package/dist/lib/hooks.js +17 -3
- package/dist/lib/host-concurrency.js +3 -2
- package/dist/lib/logger.d.ts +2 -2
- package/dist/lib/logger.js +2 -1
- package/dist/lib/metrics.d.ts +1 -1
- package/dist/lib/null-proto.d.ts +6 -0
- package/dist/lib/null-proto.js +17 -0
- package/dist/lib/otel-spans.d.ts +1 -1
- package/dist/lib/otel-spans.js +9 -5
- package/dist/lib/otel.d.ts +4 -2
- package/dist/lib/otel.js +10 -2
- package/dist/lib/page-capture.d.ts +8 -8
- package/dist/lib/page-capture.js +9 -4
- package/dist/lib/parse-json.d.ts +5 -0
- package/dist/lib/parse-json.js +12 -0
- package/dist/lib/present.d.ts +12 -0
- package/dist/lib/present.js +39 -0
- package/dist/lib/rate-limit.d.ts +4 -4
- package/dist/lib/rate-limit.js +12 -13
- package/dist/lib/regulatory-corpus/fetch-fda-guidance.d.ts +4 -4
- package/dist/lib/regulatory-corpus/fetch-fda-guidance.js +4 -10
- package/dist/lib/regulatory-corpus/fetch-ich.d.ts +4 -4
- package/dist/lib/regulatory-corpus/fetch-ich.js +18 -14
- package/dist/lib/regulatory-corpus/normalize-whitespace.d.ts +6 -0
- package/dist/lib/regulatory-corpus/normalize-whitespace.js +41 -0
- package/dist/lib/regulatory-corpus.d.ts +10 -10
- package/dist/lib/regulatory-corpus.js +3 -1
- package/dist/lib/result.d.ts +10 -11
- package/dist/lib/result.js +15 -13
- package/dist/lib/storage.d.ts +2 -2
- package/dist/lib/test/async-iterable.d.ts +9 -0
- package/dist/lib/test/async-iterable.js +28 -0
- package/dist/lib/test/request-url.d.ts +5 -0
- package/dist/lib/test/request-url.js +7 -0
- package/dist/lib/test/result-assert.d.ts +12 -0
- package/dist/lib/test/result-assert.js +17 -0
- package/dist/lib/test/text-shapes.d.ts +24 -0
- package/dist/lib/test/text-shapes.js +63 -0
- package/dist/lib/text.d.ts +22 -0
- package/dist/lib/text.js +68 -0
- package/dist/lib/thrown.d.ts +18 -0
- package/dist/lib/thrown.js +30 -0
- package/dist/lib/unknown-array.d.ts +6 -0
- package/dist/lib/unknown-array.js +8 -0
- package/dist/lib/unknown-containers.d.ts +14 -0
- package/dist/lib/unknown-containers.js +17 -0
- package/dist/lib/unknown-text.d.ts +8 -0
- package/dist/lib/unknown-text.js +28 -0
- package/dist/lib/zod-issue-shape.d.ts +1 -1
- package/dist/lib/zod-issue-shape.js +31 -31
- package/dist/lib/zod-issues.d.ts +3 -3
- package/dist/lib/zod-issues.js +30 -17
- package/dist/literature/sources/arxiv.d.ts +6 -6
- package/dist/literature/sources/arxiv.js +92 -35
- package/dist/literature/sources/http.d.ts +2 -2
- package/dist/literature/sources/http.js +16 -15
- package/dist/literature/sources/pubmed.d.ts +16 -16
- package/dist/literature/sources/pubmed.js +96 -61
- package/dist/literature/sources/semantic-scholar.d.ts +8 -8
- package/dist/literature/sources/semantic-scholar.js +22 -13
- package/dist/loop/accounting.d.ts +63 -0
- package/dist/loop/accounting.js +141 -0
- package/dist/loop/call-policy.d.ts +73 -0
- package/dist/loop/call-policy.js +109 -0
- package/dist/loop/chat-stream.d.ts +62 -0
- package/dist/loop/chat-stream.js +237 -0
- package/dist/loop/compaction.d.ts +9 -9
- package/dist/loop/compaction.js +1 -1
- package/dist/loop/metrics.d.ts +12 -15
- package/dist/loop/metrics.js +14 -26
- package/dist/loop/run-loop.d.ts +233 -0
- package/dist/loop/run-loop.js +770 -0
- package/dist/loop/sub-agent.d.ts +61 -0
- package/dist/loop/sub-agent.js +161 -0
- package/dist/loop/tool-adapter.d.ts +98 -0
- package/dist/loop/tool-adapter.js +364 -0
- package/dist/loop/tool-detail.d.ts +1 -1
- package/dist/loop/tool-detail.js +6 -5
- package/dist/loop/tool-outcome.d.ts +1 -1
- package/dist/loop/tool-output.d.ts +4 -4
- package/dist/loop/tool-output.js +2 -2
- package/dist/loop/turn-credentials.d.ts +34 -0
- package/dist/loop/turn-credentials.js +73 -0
- package/dist/loop/types.d.ts +29 -38
- package/dist/loop/types.js +2 -7
- package/dist/memory/ai-sdk-message-storage.d.ts +5 -5
- package/dist/memory/ai-sdk-message-storage.js +13 -11
- package/dist/memory/card-builders.d.ts +14 -14
- package/dist/memory/card-builders.js +19 -15
- package/dist/memory/conversation-display-recorder.d.ts +22 -4
- package/dist/memory/conversation-display-recorder.js +43 -24
- package/dist/memory/conversation-display-replay.js +3 -2
- package/dist/memory/conversation-display-storage.d.ts +15 -7
- package/dist/memory/conversation-display-storage.js +141 -36
- package/dist/memory/conversation-view.d.ts +4 -4
- package/dist/memory/conversation-view.js +5 -4
- package/dist/memory/count-tokens.js +10 -8
- package/dist/memory/derive-thread-title.d.ts +0 -13
- package/dist/memory/derive-thread-title.js +2 -1
- package/dist/memory/message-backfill.d.ts +12 -5
- package/dist/memory/message-backfill.js +5 -3
- package/dist/memory/thread-history.d.ts +36 -21
- package/dist/memory/thread-history.js +78 -54
- package/dist/memory/thread-store.d.ts +26 -17
- package/dist/memory/thread-store.js +15 -9
- package/dist/memory/tool-call-integrity.d.ts +2 -2
- package/dist/memory/tool-call-integrity.js +4 -3
- package/dist/memory/working-memory.d.ts +16 -12
- package/dist/memory/working-memory.js +72 -61
- package/dist/prompts/briefing.d.ts +12 -12
- package/dist/prompts/briefing.js +1 -1
- package/dist/prompts/synthesis-agent.d.ts +1 -1
- package/dist/prompts/synthesis-agent.js +6 -14
- package/dist/provenance/collector.d.ts +6 -6
- package/dist/provenance/collector.js +15 -8
- package/dist/provenance/exec-frame.d.ts +2 -2
- package/dist/provenance/exec-frame.js +6 -1
- package/dist/provenance/seam.d.ts +1 -4
- package/dist/provenance/types.d.ts +6 -6
- package/dist/providers/ai-sdk.d.ts +113 -62
- package/dist/providers/ai-sdk.js +283 -518
- package/dist/providers/embedding.d.ts +2 -2
- package/dist/providers/embedding.js +1 -1
- package/dist/providers/errors.d.ts +22 -2
- package/dist/providers/errors.js +98 -50
- package/dist/providers/prompt-cache.d.ts +8 -8
- package/dist/providers/prompt-cache.js +13 -11
- package/dist/providers/reasoning.d.ts +2 -2
- package/dist/providers/reasoning.js +2 -2
- package/dist/providers/types.d.ts +55 -94
- package/dist/reference-data/catalog.d.ts +2 -15
- package/dist/reference-data/catalog.js +25 -8
- package/dist/reference-data/receipt.d.ts +2 -2
- package/dist/report-model/assert-rules.js +1 -1
- package/dist/report-model/authoring-grammar.d.ts +211 -233
- package/dist/report-model/block-walk.d.ts +10 -10
- package/dist/report-model/block-walk.js +2 -0
- package/dist/report-model/draft-finish.d.ts +8 -8
- package/dist/report-model/draft-finish.js +1 -1
- package/dist/report-model/draft-hash.js +8 -7
- package/dist/report-model/draft-operations.d.ts +22 -10
- package/dist/report-model/draft-operations.js +48 -30
- package/dist/report-model/draft-read.d.ts +19 -7
- package/dist/report-model/draft-read.js +16 -6
- package/dist/report-model/draft.d.ts +844 -2
- package/dist/report-model/draft.js +3 -1
- package/dist/report-model/fixture-resolver.js +39 -16
- package/dist/report-model/pin-snapshot.d.ts +2 -2
- package/dist/report-model/pin-snapshot.js +15 -15
- package/dist/report-model/production-resolver.d.ts +18 -18
- package/dist/report-model/production-resolver.js +50 -42
- package/dist/report-model/reference-resolver.d.ts +26 -10
- package/dist/report-model/reference-resolver.js +68 -5
- package/dist/report-model/reference-stamp.js +30 -38
- package/dist/report-model/structural-validation.js +12 -4
- package/dist/report-model/validate.d.ts +7 -7
- package/dist/report-model/validate.js +6 -6
- package/dist/report-render/assets.d.ts +2 -2
- package/dist/report-render/assets.js +27 -3
- package/dist/report-render/chart-export.d.ts +10 -2
- package/dist/report-render/chart-export.js +37 -11
- package/dist/report-render/chart-presets.d.ts +8 -8
- package/dist/report-render/chart-presets.js +3 -3
- package/dist/report-render/chart-renderers.d.ts +23 -16
- package/dist/report-render/chart-renderers.js +74 -53
- package/dist/report-render/chart-toolbox.d.ts +2 -2
- package/dist/report-render/chart-toolbox.js +7 -6
- package/dist/report-render/chart.d.ts +15 -16
- package/dist/report-render/chart.js +369 -252
- package/dist/report-render/design.d.ts +36 -297
- package/dist/report-render/design.js +0 -12
- package/dist/report-render/figures/common.d.ts +12 -12
- package/dist/report-render/figures/common.js +42 -31
- package/dist/report-render/figures/dendrogram.d.ts +3 -3
- package/dist/report-render/figures/dendrogram.js +10 -10
- package/dist/report-render/figures/dense.js +15 -8
- package/dist/report-render/figures/dotplot.js +46 -33
- package/dist/report-render/figures/embedding.js +52 -43
- package/dist/report-render/figures/equal-units.d.ts +10 -10
- package/dist/report-render/figures/equal-units.js +27 -27
- package/dist/report-render/figures/forest.js +9 -7
- package/dist/report-render/figures/gsea.js +21 -11
- package/dist/report-render/figures/heatmap.js +13 -9
- package/dist/report-render/figures/index.d.ts +10 -10
- package/dist/report-render/figures/index.js +4 -2
- package/dist/report-render/figures/km.js +10 -9
- package/dist/report-render/figures/label-room.d.ts +12 -12
- package/dist/report-render/figures/label-room.js +7 -2
- package/dist/report-render/figures/locuszoom.d.ts +2 -2
- package/dist/report-render/figures/locuszoom.js +59 -31
- package/dist/report-render/figures/lollipop.js +3 -2
- package/dist/report-render/figures/ma.js +8 -4
- package/dist/report-render/figures/manhattan.d.ts +1 -2
- package/dist/report-render/figures/manhattan.js +52 -34
- package/dist/report-render/figures/oncoprint.js +4 -5
- package/dist/report-render/figures/pca.js +25 -11
- package/dist/report-render/figures/qq.js +20 -9
- package/dist/report-render/figures/roc.js +1 -1
- package/dist/report-render/figures/sankey.d.ts +2 -2
- package/dist/report-render/figures/sankey.js +11 -10
- package/dist/report-render/figures/upset.d.ts +6 -6
- package/dist/report-render/figures/upset.js +7 -4
- package/dist/report-render/figures/volcano.js +12 -10
- package/dist/report-render/hybrid-svg.d.ts +4 -4
- package/dist/report-render/hybrid-svg.js +7 -5
- package/dist/report-render/number-format.d.ts +4 -4
- package/dist/report-render/number-format.js +62 -27
- package/dist/report-render/page.js +2 -1
- package/dist/report-render/provenance-data.d.ts +2 -2
- package/dist/report-render/references.d.ts +4 -4
- package/dist/report-render/render.d.ts +2 -2
- package/dist/report-render/render.js +10 -11
- package/dist/report-render/script-json.js +1 -1
- package/dist/report-render/table-data.d.ts +6 -6
- package/dist/report-render/test/options.d.ts +49 -0
- package/dist/report-render/test/options.js +143 -0
- package/dist/report-render/test/page-function.d.ts +19 -0
- package/dist/report-render/test/page-function.js +33 -0
- package/dist/report-render/types.d.ts +10 -10
- package/dist/report-render/value-bridge.d.ts +4 -4
- package/dist/report-render/value-bridge.js +27 -14
- package/dist/report-render/views/chart-view.d.ts +2 -2
- package/dist/report-render/views/chart-view.js +2 -2
- package/dist/report-render/views/lineage.d.ts +6 -6
- package/dist/report-render/views/lineage.js +2 -0
- package/dist/report-render/views/page-view.d.ts +2 -2
- package/dist/report-render/views/page-view.js +1 -0
- package/dist/report-render/views/prose.js +25 -8
- package/dist/report-render/views/references-view.js +12 -1
- package/dist/report-render/views/values.js +1 -1
- package/dist/runtime/assemble.d.ts +53 -26
- package/dist/runtime/assemble.js +103 -56
- package/dist/runtime/boot.d.ts +8 -7
- package/dist/runtime/boot.js +1 -1
- package/dist/runtime/connection-budget.d.ts +6 -6
- package/dist/runtime/connection-budget.js +1 -1
- package/dist/runtime/dbos.d.ts +29 -19
- package/dist/runtime/dbos.js +35 -20
- package/dist/runtime/result-serialization.js +18 -5
- package/dist/runtime/shutdown.d.ts +2 -2
- package/dist/sandbox/client.d.ts +7 -3
- package/dist/sandbox/cpu-files.d.ts +2 -2
- package/dist/sandbox/cpu-files.js +21 -4
- package/dist/sandbox/create-sandbox.d.ts +7 -8
- package/dist/sandbox/create-sandbox.js +6 -12
- package/dist/sandbox/docker-client.d.ts +48 -3
- package/dist/sandbox/docker-client.js +10 -6
- package/dist/sandbox/estimate-data-profile-resources.js +2 -7
- package/dist/sandbox/exec-outcome.d.ts +2 -2
- package/dist/sandbox/exec-outcome.js +1 -1
- package/dist/sandbox/exec.d.ts +10 -6
- package/dist/sandbox/exec.js +27 -12
- package/dist/sandbox/execution-id.js +14 -6
- package/dist/sandbox/farm.d.ts +2 -2
- package/dist/sandbox/farm.js +22 -27
- package/dist/sandbox/identity.d.ts +7 -0
- package/dist/sandbox/identity.js +14 -3
- package/dist/sandbox/image-packages.js +15 -27
- package/dist/sandbox/k8s-client.d.ts +35 -8
- package/dist/sandbox/k8s-client.js +6 -5
- package/dist/sandbox/labels.js +1 -0
- package/dist/sandbox/liveness.js +3 -1
- package/dist/sandbox/mount-plan.d.ts +10 -10
- package/dist/sandbox/mount-plan.js +13 -14
- package/dist/sandbox/notification-sweep.d.ts +4 -4
- package/dist/sandbox/notification-sweep.js +4 -7
- package/dist/sandbox/package-identity.d.ts +6 -13
- package/dist/sandbox/package-identity.js +46 -28
- package/dist/sandbox/reaper.d.ts +10 -10
- package/dist/sandbox/reaper.js +4 -6
- package/dist/sandbox/sandbox-error.d.ts +2 -9
- package/dist/sandbox/sandbox-error.js +21 -8
- package/dist/sandbox/sandbox-step-translate.d.ts +8 -5
- package/dist/sandbox/sandbox-step-translate.js +22 -8
- package/dist/sandbox/step-sandbox.d.ts +47 -0
- package/dist/sandbox/step-sandbox.js +53 -0
- package/dist/sandbox/types.d.ts +18 -19
- package/dist/sandbox/types.js +1 -1
- package/dist/schemas/artifact-manifest.d.ts +4 -4
- package/dist/schemas/data-profile-schemas.d.ts +343 -298
- package/dist/schemas/file-metadata.js +2 -4
- package/dist/schemas/plan-schemas.d.ts +31 -31
- package/dist/schemas/run-synthesis.d.ts +95 -26
- package/dist/schemas/run-synthesis.js +3 -1
- package/dist/schemas/validate-plan.d.ts +4 -4
- package/dist/schemas/validate-plan.js +17 -5
- package/dist/schemas/workflow-state.d.ts +19 -19
- package/dist/schemas/workflow-state.js +2 -2
- package/dist/state/active-turns.d.ts +36 -0
- package/dist/state/active-turns.js +67 -0
- package/dist/state/analyses-metrics.d.ts +8 -8
- package/dist/state/analyses-metrics.js +4 -4
- package/dist/state/analyses.d.ts +0 -14
- package/dist/state/analyses.js +0 -32
- package/dist/state/artifacts.d.ts +32 -19
- package/dist/state/artifacts.js +28 -5
- package/dist/state/data-profile.d.ts +2 -2
- package/dist/state/db.d.ts +12 -2
- package/dist/state/db.js +5 -0
- package/dist/state/edit-intents.d.ts +4 -0
- package/dist/state/edit-intents.js +71 -0
- package/dist/state/index.d.ts +4 -4
- package/dist/state/index.js +2 -2
- package/dist/state/init.d.ts +2 -1
- package/dist/state/init.js +5 -2
- package/dist/state/migrations/20260927120000_baseline.js +3 -1
- package/dist/state/migrations/20261026120000_add_the_edit_intents.d.ts +7 -0
- package/dist/state/migrations/20261026120000_add_the_edit_intents.js +21 -0
- package/dist/state/migrations/20261027120000_record_the_applied_memory_edits.d.ts +7 -0
- package/dist/state/migrations/20261027120000_record_the_applied_memory_edits.js +16 -0
- package/dist/state/migrations/20261027120100_store_the_authoring_results.d.ts +8 -0
- package/dist/state/migrations/20261027120100_store_the_authoring_results.js +20 -0
- package/dist/state/migrations/20261027120200_key_the_groups_of_a_turn.d.ts +7 -0
- package/dist/state/migrations/20261027120200_key_the_groups_of_a_turn.js +12 -0
- package/dist/state/migrations/20261027120300_mark_the_active_turn_of_a_thread.d.ts +7 -0
- package/dist/state/migrations/20261027120300_mark_the_active_turn_of_a_thread.js +11 -0
- package/dist/state/migrations/20261028120000_record_the_paused_work.d.ts +7 -0
- package/dist/state/migrations/20261028120000_record_the_paused_work.js +25 -0
- package/dist/state/migrations/20261028120100_end_the_suspended_runs.d.ts +8 -0
- package/dist/state/migrations/20261028120100_end_the_suspended_runs.js +13 -0
- package/dist/state/migrations/20261029120000_reference_the_run_mandate.d.ts +7 -0
- package/dist/state/migrations/20261029120000_reference_the_run_mandate.js +23 -0
- package/dist/state/migrations/20261029120100_record_the_run_session_of_a_pause.d.ts +7 -0
- package/dist/state/migrations/20261029120100_record_the_run_session_of_a_pause.js +11 -0
- package/dist/state/migrations/index.js +18 -0
- package/dist/state/paused-work.d.ts +52 -0
- package/dist/state/paused-work.js +105 -0
- package/dist/state/plans.d.ts +27 -8
- package/dist/state/plans.js +14 -11
- package/dist/state/purge-analysis.d.ts +6 -6
- package/dist/state/purge-analysis.js +10 -2
- package/dist/state/report-session-state.d.ts +43 -18
- package/dist/state/report-session-state.js +43 -4
- package/dist/state/report-versions.d.ts +16 -11
- package/dist/state/report-versions.js +5 -3
- package/dist/state/runs.d.ts +30 -19
- package/dist/state/runs.js +43 -51
- package/dist/state/schema.d.ts +18 -21
- package/dist/state/schema.js +4 -5
- package/dist/state/snapshot-parse.d.ts +2 -2
- package/dist/state/snapshot-parse.js +14 -8
- package/dist/state/step-executions.d.ts +20 -8
- package/dist/state/step-executions.js +6 -4
- package/dist/state/tool-outputs.d.ts +2 -2
- package/dist/state/tool-outputs.js +2 -1
- package/dist/state/vector-store.d.ts +16 -16
- package/dist/state/vector-store.js +11 -7
- package/dist/tasks/data-profile-absorb.d.ts +3 -3
- package/dist/tasks/data-profile-absorb.js +21 -16
- package/dist/tasks/data-profile-activity.d.ts +5 -5
- package/dist/tasks/data-profile-activity.js +5 -5
- package/dist/tasks/data-profile-index.d.ts +4 -4
- package/dist/tasks/data-profile-index.js +32 -17
- package/dist/tasks/data-profile-resolve.d.ts +8 -8
- package/dist/tasks/data-profile-resolve.js +88 -62
- package/dist/tasks/data-profile.d.ts +40 -31
- package/dist/tasks/data-profile.js +138 -95
- package/dist/tasks/extract-values.d.ts +26 -79
- package/dist/tasks/extract-values.js +48 -108
- package/dist/tasks/refresh-regulatory-corpus.d.ts +4 -20
- package/dist/tasks/refresh-regulatory-corpus.js +12 -8
- package/dist/tasks/regulatory-corpus-boot-refresh.d.ts +2 -2
- package/dist/tasks/regulatory-corpus-boot-refresh.js +12 -10
- package/dist/testing.d.ts +60 -0
- package/dist/testing.js +96 -0
- package/dist/tools/ad-hoc-router.d.ts +9 -9
- package/dist/tools/ad-hoc-router.js +65 -52
- package/dist/tools/analysis-invocation.d.ts +7 -0
- package/dist/tools/analysis-invocation.js +29 -5
- package/dist/tools/approval/contract.d.ts +8 -52
- package/dist/tools/approval/contract.js +7 -36
- package/dist/tools/approval/gateway.d.ts +27 -28
- package/dist/tools/approval/gateway.js +33 -130
- package/dist/tools/approval/queries.d.ts +6 -11
- package/dist/tools/approval/queries.js +43 -29
- package/dist/tools/approval/uuidv7.js +2 -2
- package/dist/tools/bio/chembl.d.ts +3 -3
- package/dist/tools/bio/chembl.js +10 -0
- package/dist/tools/bio/comptox.d.ts +25 -8
- package/dist/tools/bio/comptox.js +4 -2
- package/dist/tools/bio/drug-gene-interactions.d.ts +27 -17
- package/dist/tools/bio/drug-gene-interactions.js +11 -8
- package/dist/tools/bio/gene-disease-evidence.d.ts +61 -15
- package/dist/tools/bio/gene-disease-evidence.js +10 -6
- package/dist/tools/bio/gene-preclinical-profile.d.ts +11 -11
- package/dist/tools/bio/keys.d.ts +2 -2
- package/dist/tools/bio/keys.js +3 -3
- package/dist/tools/bio/lookup-annotation.d.ts +5 -5
- package/dist/tools/bio/lookup-annotation.js +3 -0
- package/dist/tools/bio/opentargets.d.ts +1 -1
- package/dist/tools/bio/opentargets.js +6 -0
- package/dist/tools/bio/pubchem.d.ts +2 -2
- package/dist/tools/bio/pubchem.js +6 -0
- package/dist/tools/bio/pubmed.d.ts +26 -16
- package/dist/tools/bio/pubmed.js +9 -3
- package/dist/tools/bio/search-clinical-trials.d.ts +4 -4
- package/dist/tools/bio/search-clinical-trials.js +5 -1
- package/dist/tools/bio/search-faers.d.ts +2 -2
- package/dist/tools/bio/search-faers.js +1 -1
- package/dist/tools/bio/search-gene.d.ts +2 -2
- package/dist/tools/bio/search-gene.js +1 -0
- package/dist/tools/bio/search-geo-datasets.d.ts +4 -4
- package/dist/tools/bio/search-geo-datasets.js +5 -5
- package/dist/tools/bio/search-interactions.d.ts +1 -1
- package/dist/tools/bio/search-patents.d.ts +28 -22
- package/dist/tools/bio/search-patents.js +20 -17
- package/dist/tools/bio/search-protein.d.ts +2 -2
- package/dist/tools/bio/search-protein.js +1 -1
- package/dist/tools/bio/search-regulatory-approvals.d.ts +64 -18
- package/dist/tools/bio/search-regulatory-approvals.js +21 -16
- package/dist/tools/bio/target-safety.d.ts +8 -8
- package/dist/tools/bio/target-safety.js +11 -6
- package/dist/tools/capability-data.d.ts +9 -5
- package/dist/tools/capability-data.js +2 -1
- package/dist/tools/define-tool.d.ts +55 -46
- package/dist/tools/define-tool.js +39 -27
- package/dist/tools/display/normalize-echart-spec.d.ts +2 -2
- package/dist/tools/display/normalize-echart-spec.js +51 -27
- package/dist/tools/display/show-user.d.ts +2 -2
- package/dist/tools/display/show-user.js +1 -1
- package/dist/tools/execute-analysis.d.ts +19 -10
- package/dist/tools/execute-analysis.js +83 -62
- package/dist/tools/knowledge/check.d.ts +166 -44
- package/dist/tools/knowledge/check.js +5 -3
- package/dist/tools/knowledge/client.d.ts +31 -62
- package/dist/tools/knowledge/client.js +44 -27
- package/dist/tools/knowledge/environment.d.ts +6 -6
- package/dist/tools/knowledge/environment.js +18 -7
- package/dist/tools/knowledge/index.d.ts +2 -2
- package/dist/tools/knowledge/index.js +9 -9
- package/dist/tools/knowledge/local-slots.d.ts +4 -4
- package/dist/tools/knowledge/local-slots.js +11 -4
- package/dist/tools/knowledge/pin.d.ts +2 -2
- package/dist/tools/knowledge/recommend.d.ts +20 -45
- package/dist/tools/knowledge/recommend.js +27 -19
- package/dist/tools/knowledge/situation.d.ts +40 -40
- package/dist/tools/knowledge/situation.js +2 -9
- package/dist/tools/knowledge/skeleton.d.ts +4 -4
- package/dist/tools/knowledge/skeleton.js +10 -11
- package/dist/tools/knowledge/template.d.ts +20 -18
- package/dist/tools/knowledge/template.js +38 -32
- package/dist/tools/lib/alphafold-client.js +2 -1
- package/dist/tools/lib/amass-client.d.ts +28 -28
- package/dist/tools/lib/amass-client.js +20 -10
- package/dist/tools/lib/api-utils.d.ts +13 -3
- package/dist/tools/lib/api-utils.js +17 -3
- package/dist/tools/lib/bgee-client.d.ts +6 -6
- package/dist/tools/lib/bgee-client.js +16 -10
- package/dist/tools/lib/cbioportal-client.d.ts +4 -4
- package/dist/tools/lib/cbioportal-client.js +9 -8
- package/dist/tools/lib/chembl-client.d.ts +14 -14
- package/dist/tools/lib/chembl-client.js +11 -4
- package/dist/tools/lib/clinical-benchmarks-client.d.ts +4 -4
- package/dist/tools/lib/clinical-benchmarks-client.js +4 -7
- package/dist/tools/lib/clinical-trials-client.d.ts +18 -18
- package/dist/tools/lib/clinical-trials-client.js +10 -10
- package/dist/tools/lib/clinvar-client.d.ts +2 -2
- package/dist/tools/lib/clinvar-client.js +6 -6
- package/dist/tools/lib/ctx-ops.d.ts +23 -23
- package/dist/tools/lib/ctx-ops.js +13 -10
- package/dist/tools/lib/dgidb-client.d.ts +6 -6
- package/dist/tools/lib/dgidb-client.js +10 -12
- package/dist/tools/lib/disgenet-client.d.ts +4 -4
- package/dist/tools/lib/ema-client.d.ts +2 -2
- package/dist/tools/lib/ensembl-client.d.ts +4 -4
- package/dist/tools/lib/ensembl-client.js +5 -4
- package/dist/tools/lib/gwas-catalog-client.d.ts +4 -4
- package/dist/tools/lib/gwas-catalog-client.js +17 -17
- package/dist/tools/lib/html-text.d.ts +6 -0
- package/dist/tools/lib/html-text.js +9 -0
- package/dist/tools/lib/identifier-resolver.d.ts +4 -4
- package/dist/tools/lib/identifier-resolver.js +7 -3
- package/dist/tools/lib/impc-client.d.ts +8 -8
- package/dist/tools/lib/impc-client.js +46 -35
- package/dist/tools/lib/iuphar-client.d.ts +2 -2
- package/dist/tools/lib/iuphar-client.js +7 -16
- package/dist/tools/lib/monarch-client.d.ts +4 -4
- package/dist/tools/lib/openfda-client.d.ts +22 -22
- package/dist/tools/lib/openfda-client.js +23 -22
- package/dist/tools/lib/opentargets-client.d.ts +12 -12
- package/dist/tools/lib/pathway-client.d.ts +4 -4
- package/dist/tools/lib/pathway-client.js +15 -19
- package/dist/tools/lib/pharmgkb-client.d.ts +2 -2
- package/dist/tools/lib/pharmgkb-client.js +1 -1
- package/dist/tools/lib/protein-family-modality.d.ts +2 -2
- package/dist/tools/lib/protein-family-modality.js +0 -2
- package/dist/tools/lib/protein-family-normalize.js +7 -0
- package/dist/tools/lib/pubchem-client.d.ts +2 -2
- package/dist/tools/lib/pubchem-client.js +1 -0
- package/dist/tools/lib/pubchem-ops.d.ts +4 -4
- package/dist/tools/lib/pubchem-ops.js +8 -0
- package/dist/tools/lib/pubmed-client.d.ts +9 -9
- package/dist/tools/lib/pubmed-client.js +1 -1
- package/dist/tools/lib/string-client.d.ts +6 -6
- package/dist/tools/lib/uniprot-client.d.ts +8 -8
- package/dist/tools/lib/uniprot-client.js +5 -1
- package/dist/tools/memory/update-working-memory.d.ts +16 -13
- package/dist/tools/memory/update-working-memory.js +21 -3
- package/dist/tools/read-tool-output.js +8 -2
- package/dist/tools/registry.d.ts +2 -2
- package/dist/tools/report-authoring/authoring-tools.d.ts +54 -23
- package/dist/tools/report-authoring/authoring-tools.js +128 -62
- package/dist/tools/report-session/derive-table.d.ts +19 -59
- package/dist/tools/report-session/derive-table.js +120 -122
- package/dist/tools/report-session/examine-page.d.ts +6 -6
- package/dist/tools/report-session/examine-page.js +14 -12
- package/dist/tools/report-session/list-artifacts.d.ts +6 -6
- package/dist/tools/report-session/list-artifacts.js +5 -5
- package/dist/tools/report-session/page-faults.d.ts +6 -6
- package/dist/tools/report-session/page-faults.js +3 -1
- package/dist/tools/report-session/preview-report.d.ts +4 -3
- package/dist/tools/report-session/preview-report.js +26 -7
- package/dist/tools/report-session/record-version.d.ts +9 -4
- package/dist/tools/report-session/record-version.js +16 -9
- package/dist/tools/report-session/session-page-publisher.d.ts +6 -6
- package/dist/tools/research/generate-analogy-report.d.ts +14 -7
- package/dist/tools/research/generate-analogy-report.js +80 -76
- package/dist/tools/research/generate-plan.d.ts +16 -16
- package/dist/tools/research/generate-plan.js +410 -374
- package/dist/tools/research/guarded-address.js +3 -2
- package/dist/tools/research/inspect-data-profile.d.ts +27 -20
- package/dist/tools/research/inspect-data-profile.js +26 -25
- package/dist/tools/research/inspect-run.d.ts +54 -27
- package/dist/tools/research/inspect-run.js +50 -40
- package/dist/tools/research/literature-reviewer.d.ts +8 -7
- package/dist/tools/research/literature-reviewer.js +29 -28
- package/dist/tools/research/search-arxiv.d.ts +1 -1
- package/dist/tools/research/search-arxiv.js +1 -1
- package/dist/tools/research/search-github-repos.d.ts +10 -7
- package/dist/tools/research/search-github-repos.js +25 -22
- package/dist/tools/research/search-semantic-scholar.js +1 -1
- package/dist/tools/research/searxng-engine.d.ts +2 -2
- package/dist/tools/research/searxng-engine.js +6 -4
- package/dist/tools/research/web-fetch.d.ts +24 -21
- package/dist/tools/research/web-fetch.js +65 -74
- package/dist/tools/research/web-search.d.ts +26 -17
- package/dist/tools/research/web-search.js +26 -21
- package/dist/tools/sandbox/link-packages.d.ts +11 -7
- package/dist/tools/sandbox/link-packages.js +11 -8
- package/dist/tools/sandbox/list-available-packages.d.ts +17 -8
- package/dist/tools/sandbox/list-available-packages.js +31 -25
- package/dist/tools/sandbox/list-available-refs.d.ts +17 -14
- package/dist/tools/sandbox/list-available-refs.js +61 -36
- package/dist/tools/sandbox/report-blocker.d.ts +30 -37
- package/dist/tools/sandbox/report-blocker.js +23 -73
- package/dist/tools/sandbox/skills.d.ts +16 -12
- package/dist/tools/sandbox/skills.js +16 -12
- package/dist/tools/sandbox/submit-file-metadata.d.ts +12 -9
- package/dist/tools/sandbox/submit-file-metadata.js +18 -21
- package/dist/tools/start-report-session.d.ts +13 -5
- package/dist/tools/start-report-session.js +35 -8
- package/dist/tools/terminal-text.d.ts +5 -2
- package/dist/tools/terminal-text.js +35 -3
- package/dist/tools/workspace/decision-record.d.ts +4 -4
- package/dist/tools/workspace/decision-record.js +23 -13
- package/dist/tools/workspace/edit-file.d.ts +59 -20
- package/dist/tools/workspace/edit-file.js +81 -16
- package/dist/tools/workspace/execute-command.d.ts +15 -13
- package/dist/tools/workspace/execute-command.js +11 -9
- package/dist/tools/workspace/file-stat.d.ts +6 -3
- package/dist/tools/workspace/grep.d.ts +10 -7
- package/dist/tools/workspace/grep.js +9 -3
- package/dist/tools/workspace/list-files.d.ts +6 -3
- package/dist/tools/workspace/mutator.d.ts +28 -15
- package/dist/tools/workspace/mutator.js +107 -53
- package/dist/tools/workspace/read-file.d.ts +8 -5
- package/dist/tools/workspace/result-bounds.d.ts +5 -5
- package/dist/tools/workspace/result-bounds.js +4 -2
- package/dist/tools/workspace/run-exec.d.ts +2 -2
- package/dist/tools/workspace/run-exec.js +3 -3
- package/dist/tools/workspace/scan-inputs.d.ts +8 -5
- package/dist/tools/workspace/scan-inputs.js +17 -5
- package/dist/tools/workspace/show-file.d.ts +1 -1
- package/dist/tools/workspace/show-file.js +2 -1
- package/dist/tools/workspace/show-plan.d.ts +8 -5
- package/dist/tools/workspace/show-plan.js +9 -8
- package/dist/tools/workspace/workspace-search.d.ts +41 -13
- package/dist/tools/workspace/workspace-search.js +27 -14
- package/dist/tools/workspace/write-file.d.ts +9 -7
- package/dist/workflows/execute-analysis-scheduler.d.ts +9 -9
- package/dist/workflows/execute-analysis-scheduler.js +6 -3
- package/dist/workflows/execute-analysis.d.ts +46 -62
- package/dist/workflows/execute-analysis.js +137 -219
- package/dist/workflows/pause.d.ts +71 -0
- package/dist/workflows/pause.js +173 -0
- package/dist/workflows/sandbox-step.d.ts +38 -61
- package/dist/workflows/sandbox-step.js +99 -106
- package/dist/workflows/test/sql-writes.d.ts +21 -0
- package/dist/workflows/test/sql-writes.js +36 -0
- package/dist/workspace/filesystem.d.ts +6 -6
- package/dist/workspace/filesystem.js +10 -8
- package/dist/workspace/paths.d.ts +1 -1
- package/dist/workspace/paths.js +15 -4
- package/dist/workspace/search-config.d.ts +2 -2
- package/dist/workspace/search-config.js +1 -1
- package/package.json +21 -22
- package/dist/loop/call-guard.d.ts +0 -50
- package/dist/loop/call-guard.js +0 -90
- package/dist/loop/continue-agent.d.ts +0 -40
- package/dist/loop/continue-agent.js +0 -38
- package/dist/loop/genai-spans.d.ts +0 -47
- package/dist/loop/genai-spans.js +0 -134
- package/dist/loop/run-agent.d.ts +0 -245
- package/dist/loop/run-agent.js +0 -1124
- package/dist/loop/run-step.d.ts +0 -29
- package/dist/loop/run-step.js +0 -34
- package/dist/loop/run-to-terminal.d.ts +0 -66
- package/dist/loop/run-to-terminal.js +0 -93
- package/dist/loop/tool-mask.d.ts +0 -23
- package/dist/loop/tool-mask.js +0 -46
- package/dist/providers/streaming-chat.d.ts +0 -32
- package/dist/providers/streaming-chat.js +0 -91
- package/dist/tasks/derive-table-exec.d.ts +0 -54
- package/dist/tasks/derive-table-exec.js +0 -86
- package/dist/workflows/suspension.d.ts +0 -32
- package/dist/workflows/suspension.js +0 -38
package/dist/state/init.js
CHANGED
|
@@ -7,9 +7,12 @@
|
|
|
7
7
|
* Postgres advisory lock. A run with no pending migration runs no DDL, thus it
|
|
8
8
|
* takes no lock on a Cortex table.
|
|
9
9
|
*/
|
|
10
|
+
import { errorOf } from "../lib/thrown.js";
|
|
11
|
+
import { textOf } from "../lib/unknown-text.js";
|
|
10
12
|
import { Kysely, PostgresDialect, sql } from "kysely";
|
|
11
13
|
import { Migrator } from "kysely/migration";
|
|
12
14
|
import { createNoopLogger } from "../lib/console-logger.js";
|
|
15
|
+
import { presentFirst } from "../lib/present.js";
|
|
13
16
|
import { cortexMigrations } from "./migrations/index.js";
|
|
14
17
|
/**
|
|
15
18
|
* The longest time that a migration statement waits for a lock. An `ALTER TABLE`
|
|
@@ -37,7 +40,7 @@ export async function initCortexState(pool, injected) {
|
|
|
37
40
|
migrationLockTableName: "cortex_migration_lock",
|
|
38
41
|
// Without a schema, the migrator finds its tables in any schema, thus a
|
|
39
42
|
// test schema would see the tables of the other test schemas.
|
|
40
|
-
migrationTableSchema: rows
|
|
43
|
+
migrationTableSchema: presentFirst(rows, "the current schema row").schema,
|
|
41
44
|
});
|
|
42
45
|
const { error, results } = await migrator.migrateToLatest();
|
|
43
46
|
for (const result of results ?? []) {
|
|
@@ -45,7 +48,7 @@ export async function initCortexState(pool, injected) {
|
|
|
45
48
|
logger.info("migration applied", { migration: result.migrationName });
|
|
46
49
|
}
|
|
47
50
|
if (error !== undefined) {
|
|
48
|
-
throw error
|
|
51
|
+
throw errorOf(error) ?? new Error(`cortex state migration failed: ${textOf(error)}`);
|
|
49
52
|
}
|
|
50
53
|
}
|
|
51
54
|
finally {
|
|
@@ -6,6 +6,8 @@
|
|
|
6
6
|
* that an earlier harness created with its boot-time DDL: it brings that
|
|
7
7
|
* database to this schema, and the migrator records it.
|
|
8
8
|
*/
|
|
9
|
+
import { errorMessageOf } from "../../lib/thrown.js";
|
|
10
|
+
import { textOf } from "../../lib/unknown-text.js";
|
|
9
11
|
import { CompiledQuery, sql } from "kysely";
|
|
10
12
|
import { backfillAiSdkMessageEnvelopes } from "../../memory/message-backfill.js";
|
|
11
13
|
// No ';' may appear anywhere in this text, comments included: it is executed by
|
|
@@ -635,7 +637,7 @@ export function baseline(logger) {
|
|
|
635
637
|
await sql.raw("CREATE EXTENSION IF NOT EXISTS vector").execute(db);
|
|
636
638
|
}
|
|
637
639
|
catch (err) {
|
|
638
|
-
const msg = err
|
|
640
|
+
const msg = errorMessageOf(err) ?? textOf(err);
|
|
639
641
|
throw new Error(`Cortex requires the pgvector extension. ` +
|
|
640
642
|
`CREATE EXTENSION IF NOT EXISTS vector failed: ${msg}. ` +
|
|
641
643
|
`Ask platform-infra to enable pgvector on the RDS parameter group, ` +
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Record the intent of each `edit_file` call inside a durable step, keyed by
|
|
3
|
+
* the step. A rerun of the step after the write, before its checkpoint, then
|
|
4
|
+
* gives back the result of the edit and does not apply it a second time.
|
|
5
|
+
*/
|
|
6
|
+
import type { Migration } from "kysely/migration";
|
|
7
|
+
export declare const addTheEditIntents: Migration;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Record the intent of each `edit_file` call inside a durable step, keyed by
|
|
3
|
+
* the step. A rerun of the step after the write, before its checkpoint, then
|
|
4
|
+
* gives back the result of the edit and does not apply it a second time.
|
|
5
|
+
*/
|
|
6
|
+
import { sql } from "kysely";
|
|
7
|
+
export const addTheEditIntents = {
|
|
8
|
+
async up(db) {
|
|
9
|
+
await sql `CREATE TABLE IF NOT EXISTS cortex_edit_intents (
|
|
10
|
+
step_key TEXT PRIMARY KEY,
|
|
11
|
+
analysis_id TEXT NOT NULL,
|
|
12
|
+
path TEXT NOT NULL,
|
|
13
|
+
hash_before TEXT NOT NULL,
|
|
14
|
+
hash_after TEXT NOT NULL,
|
|
15
|
+
result JSONB NOT NULL,
|
|
16
|
+
call_record JSONB NOT NULL,
|
|
17
|
+
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
|
|
18
|
+
)`.execute(db);
|
|
19
|
+
await sql `CREATE INDEX IF NOT EXISTS idx_cortex_edit_intents_analysis ON cortex_edit_intents (analysis_id)`.execute(db);
|
|
20
|
+
},
|
|
21
|
+
};
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Record the key of each `update_working_memory` call that a durable step
|
|
3
|
+
* applied, in the transaction of the edit. A rerun of the step after the edit,
|
|
4
|
+
* before its checkpoint, then finds its key and changes nothing.
|
|
5
|
+
*/
|
|
6
|
+
import type { Migration } from "kysely/migration";
|
|
7
|
+
export declare const recordTheAppliedMemoryEdits: Migration;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Record the key of each `update_working_memory` call that a durable step
|
|
3
|
+
* applied, in the transaction of the edit. A rerun of the step after the edit,
|
|
4
|
+
* before its checkpoint, then finds its key and changes nothing.
|
|
5
|
+
*/
|
|
6
|
+
import { sql } from "kysely";
|
|
7
|
+
export const recordTheAppliedMemoryEdits = {
|
|
8
|
+
async up(db) {
|
|
9
|
+
await sql `CREATE TABLE IF NOT EXISTS cortex_applied_memory_edits (
|
|
10
|
+
call_key TEXT PRIMARY KEY,
|
|
11
|
+
analysis_id TEXT NOT NULL,
|
|
12
|
+
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
|
|
13
|
+
)`.execute(db);
|
|
14
|
+
await sql `CREATE INDEX IF NOT EXISTS idx_cortex_applied_memory_edits_analysis ON cortex_applied_memory_edits (analysis_id)`.execute(db);
|
|
15
|
+
},
|
|
16
|
+
};
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Store the result of each authoring call that a durable step landed, keyed by
|
|
3
|
+
* the report thread and the step. The result lands in the transaction of the
|
|
4
|
+
* document. A rerun of the step after the landing, before its checkpoint, then
|
|
5
|
+
* gives the stored result and does not apply the operation a second time.
|
|
6
|
+
*/
|
|
7
|
+
import type { Migration } from "kysely/migration";
|
|
8
|
+
export declare const storeTheAuthoringResults: Migration;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Store the result of each authoring call that a durable step landed, keyed by
|
|
3
|
+
* the report thread and the step. The result lands in the transaction of the
|
|
4
|
+
* document. A rerun of the step after the landing, before its checkpoint, then
|
|
5
|
+
* gives the stored result and does not apply the operation a second time.
|
|
6
|
+
*/
|
|
7
|
+
import { sql } from "kysely";
|
|
8
|
+
export const storeTheAuthoringResults = {
|
|
9
|
+
async up(db) {
|
|
10
|
+
await sql `CREATE TABLE IF NOT EXISTS cortex_authoring_results (
|
|
11
|
+
thread_id TEXT NOT NULL,
|
|
12
|
+
call_key TEXT NOT NULL,
|
|
13
|
+
analysis_id TEXT NOT NULL,
|
|
14
|
+
result JSONB NOT NULL,
|
|
15
|
+
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
16
|
+
PRIMARY KEY (thread_id, call_key)
|
|
17
|
+
)`.execute(db);
|
|
18
|
+
await sql `CREATE INDEX IF NOT EXISTS idx_cortex_authoring_results_analysis ON cortex_authoring_results (analysis_id)`.execute(db);
|
|
19
|
+
},
|
|
20
|
+
};
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Key each group of a chat turn on its first row. A turn workflow writes each
|
|
3
|
+
* round in a step, and a step that runs again after its commit finds the key
|
|
4
|
+
* and stores nothing, thus no row of a turn lands two times.
|
|
5
|
+
*/
|
|
6
|
+
import type { Migration } from "kysely/migration";
|
|
7
|
+
export declare const keyTheGroupsOfATurn: Migration;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Key each group of a chat turn on its first row. A turn workflow writes each
|
|
3
|
+
* round in a step, and a step that runs again after its commit finds the key
|
|
4
|
+
* and stores nothing, thus no row of a turn lands two times.
|
|
5
|
+
*/
|
|
6
|
+
import { sql } from "kysely";
|
|
7
|
+
export const keyTheGroupsOfATurn = {
|
|
8
|
+
async up(db) {
|
|
9
|
+
await sql `ALTER TABLE messages ADD COLUMN IF NOT EXISTS round_key TEXT`.execute(db);
|
|
10
|
+
await sql `CREATE UNIQUE INDEX IF NOT EXISTS idx_messages_round_key ON messages(thread_id, round_key) WHERE round_key IS NOT NULL`.execute(db);
|
|
11
|
+
},
|
|
12
|
+
};
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Mark the turn that runs on a thread. The open of a turn claims the thread,
|
|
3
|
+
* and the end of the turn releases it, thus a second turn on the same thread
|
|
4
|
+
* is refused before it writes a row.
|
|
5
|
+
*/
|
|
6
|
+
import type { Migration } from "kysely/migration";
|
|
7
|
+
export declare const markTheActiveTurnOfAThread: Migration;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Mark the turn that runs on a thread. The open of a turn claims the thread,
|
|
3
|
+
* and the end of the turn releases it, thus a second turn on the same thread
|
|
4
|
+
* is refused before it writes a row.
|
|
5
|
+
*/
|
|
6
|
+
import { sql } from "kysely";
|
|
7
|
+
export const markTheActiveTurnOfAThread = {
|
|
8
|
+
async up(db) {
|
|
9
|
+
await sql `ALTER TABLE cortex_analysis_threads ADD COLUMN IF NOT EXISTS active_turn_id TEXT`.execute(db);
|
|
10
|
+
},
|
|
11
|
+
};
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Record each workflow that waits in a pause. The row is the state that a host
|
|
3
|
+
* reads when it lists the paused work of an analysis, for example after a
|
|
4
|
+
* restart, and it names the topic that the resume sends to.
|
|
5
|
+
*/
|
|
6
|
+
import type { Migration } from "kysely/migration";
|
|
7
|
+
export declare const recordThePausedWork: Migration;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Record each workflow that waits in a pause. The row is the state that a host
|
|
3
|
+
* reads when it lists the paused work of an analysis, for example after a
|
|
4
|
+
* restart, and it names the topic that the resume sends to.
|
|
5
|
+
*/
|
|
6
|
+
import { sql } from "kysely";
|
|
7
|
+
export const recordThePausedWork = {
|
|
8
|
+
async up(db) {
|
|
9
|
+
await sql `CREATE TABLE IF NOT EXISTS cortex_paused_work (
|
|
10
|
+
workflow_id TEXT PRIMARY KEY,
|
|
11
|
+
work_id TEXT NOT NULL,
|
|
12
|
+
work_kind TEXT NOT NULL,
|
|
13
|
+
analysis_id TEXT NOT NULL,
|
|
14
|
+
thread_id TEXT,
|
|
15
|
+
state TEXT NOT NULL,
|
|
16
|
+
cause JSONB NOT NULL,
|
|
17
|
+
attempt INTEGER NOT NULL,
|
|
18
|
+
retry_at TIMESTAMPTZ,
|
|
19
|
+
topic TEXT NOT NULL,
|
|
20
|
+
paused_at TIMESTAMPTZ NOT NULL
|
|
21
|
+
)`.execute(db);
|
|
22
|
+
await sql `CREATE INDEX IF NOT EXISTS idx_cortex_paused_work_analysis ON cortex_paused_work(analysis_id)`.execute(db);
|
|
23
|
+
await sql `CREATE INDEX IF NOT EXISTS idx_cortex_paused_work_work ON cortex_paused_work(work_id)`.execute(db);
|
|
24
|
+
},
|
|
25
|
+
};
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* End the rows of the suspended state. A suspended run ended `CANCELLED` in the
|
|
3
|
+
* engine, and no code can resume it, thus its row reads as `failed` with its
|
|
4
|
+
* reason. An analysis has no suspended state any more, because paused work
|
|
5
|
+
* records itself in `cortex_paused_work`.
|
|
6
|
+
*/
|
|
7
|
+
import type { Migration } from "kysely/migration";
|
|
8
|
+
export declare const endTheSuspendedRuns: Migration;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* End the rows of the suspended state. A suspended run ended `CANCELLED` in the
|
|
3
|
+
* engine, and no code can resume it, thus its row reads as `failed` with its
|
|
4
|
+
* reason. An analysis has no suspended state any more, because paused work
|
|
5
|
+
* records itself in `cortex_paused_work`.
|
|
6
|
+
*/
|
|
7
|
+
import { sql } from "kysely";
|
|
8
|
+
export const endTheSuspendedRuns = {
|
|
9
|
+
async up(db) {
|
|
10
|
+
await sql `UPDATE cortex_runs SET status = 'failed' WHERE status = 'suspended_insufficient_funds'`.execute(db);
|
|
11
|
+
await sql `UPDATE cortex_analysis_state SET status = 'active' WHERE status = 'suspended_insufficient_funds'`.execute(db);
|
|
12
|
+
},
|
|
13
|
+
};
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The run ledger keeps a reference to the run credential, not a token: the id
|
|
3
|
+
* of the mandate, which a realization resolves to a short-lived credential.
|
|
4
|
+
* The reference has no expiry, because the run does not depend on a clock.
|
|
5
|
+
*/
|
|
6
|
+
import type { Migration } from "kysely/migration";
|
|
7
|
+
export declare const referenceTheRunMandate: Migration;
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The run ledger keeps a reference to the run credential, not a token: the id
|
|
3
|
+
* of the mandate, which a realization resolves to a short-lived credential.
|
|
4
|
+
* The reference has no expiry, because the run does not depend on a clock.
|
|
5
|
+
*/
|
|
6
|
+
import { sql } from "kysely";
|
|
7
|
+
export const referenceTheRunMandate = {
|
|
8
|
+
async up(db) {
|
|
9
|
+
// The baseline adds `mandate_jti` again on a database that ran it before, thus the column can stand beside
|
|
10
|
+
// `mandate_id`. Then it holds no value that `mandate_id` does not.
|
|
11
|
+
await sql `DO $$
|
|
12
|
+
BEGIN
|
|
13
|
+
IF EXISTS (SELECT 1 FROM information_schema.columns WHERE table_name = 'cortex_runs' AND column_name = 'mandate_jti') THEN
|
|
14
|
+
IF EXISTS (SELECT 1 FROM information_schema.columns WHERE table_name = 'cortex_runs' AND column_name = 'mandate_id') THEN
|
|
15
|
+
ALTER TABLE cortex_runs DROP COLUMN mandate_jti;
|
|
16
|
+
ELSE
|
|
17
|
+
ALTER TABLE cortex_runs RENAME COLUMN mandate_jti TO mandate_id;
|
|
18
|
+
END IF;
|
|
19
|
+
END IF;
|
|
20
|
+
END $$`.execute(db); // oss-core-managed-ok: run-mandate ledger (nullable; OSS leaves null)
|
|
21
|
+
await sql `ALTER TABLE cortex_runs DROP COLUMN IF EXISTS mandate_expires_at`.execute(db); // oss-core-managed-ok: run-mandate ledger
|
|
22
|
+
},
|
|
23
|
+
};
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A pause row of a run or a profile keeps the run session of its workflow. A
|
|
3
|
+
* resume renews the run credential from it before the work goes on, and a
|
|
4
|
+
* turn, whose credential comes with the person, keeps none.
|
|
5
|
+
*/
|
|
6
|
+
import type { Migration } from "kysely/migration";
|
|
7
|
+
export declare const recordTheRunSessionOfAPause: Migration;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A pause row of a run or a profile keeps the run session of its workflow. A
|
|
3
|
+
* resume renews the run credential from it before the work goes on, and a
|
|
4
|
+
* turn, whose credential comes with the person, keeps none.
|
|
5
|
+
*/
|
|
6
|
+
import { sql } from "kysely";
|
|
7
|
+
export const recordTheRunSessionOfAPause = {
|
|
8
|
+
async up(db) {
|
|
9
|
+
await sql `ALTER TABLE cortex_paused_work ADD COLUMN IF NOT EXISTS run_session JSONB`.execute(db);
|
|
10
|
+
},
|
|
11
|
+
};
|
|
@@ -12,6 +12,15 @@ import { indexTheRunsByStart } from "./20261012120000_index_the_runs_by_start.js
|
|
|
12
12
|
import { indexTheEndedRunsAndTheRecentThreads } from "./20261013120000_index_the_ended_runs_and_the_recent_threads.js";
|
|
13
13
|
import { narrowTheActiveRunIndex } from "./20261013180000_narrow_the_active_run_index.js";
|
|
14
14
|
import { indexThePlansByParentAndTheRunsByPlan } from "./20261014120000_index_the_plans_by_parent_and_the_runs_by_plan.js";
|
|
15
|
+
import { addTheEditIntents } from "./20261026120000_add_the_edit_intents.js";
|
|
16
|
+
import { recordTheAppliedMemoryEdits } from "./20261027120000_record_the_applied_memory_edits.js";
|
|
17
|
+
import { storeTheAuthoringResults } from "./20261027120100_store_the_authoring_results.js";
|
|
18
|
+
import { keyTheGroupsOfATurn } from "./20261027120200_key_the_groups_of_a_turn.js";
|
|
19
|
+
import { markTheActiveTurnOfAThread } from "./20261027120300_mark_the_active_turn_of_a_thread.js";
|
|
20
|
+
import { recordThePausedWork } from "./20261028120000_record_the_paused_work.js";
|
|
21
|
+
import { endTheSuspendedRuns } from "./20261028120100_end_the_suspended_runs.js";
|
|
22
|
+
import { referenceTheRunMandate } from "./20261029120000_reference_the_run_mandate.js";
|
|
23
|
+
import { recordTheRunSessionOfAPause } from "./20261029120100_record_the_run_session_of_a_pause.js";
|
|
15
24
|
export function cortexMigrations(logger) {
|
|
16
25
|
return {
|
|
17
26
|
"20260927120000_baseline": baseline(logger),
|
|
@@ -21,5 +30,14 @@ export function cortexMigrations(logger) {
|
|
|
21
30
|
"20261013120000_index_the_ended_runs_and_the_recent_threads": indexTheEndedRunsAndTheRecentThreads,
|
|
22
31
|
"20261013180000_narrow_the_active_run_index": narrowTheActiveRunIndex,
|
|
23
32
|
"20261014120000_index_the_plans_by_parent_and_the_runs_by_plan": indexThePlansByParentAndTheRunsByPlan,
|
|
33
|
+
"20261026120000_add_the_edit_intents": addTheEditIntents,
|
|
34
|
+
"20261027120000_record_the_applied_memory_edits": recordTheAppliedMemoryEdits,
|
|
35
|
+
"20261027120100_store_the_authoring_results": storeTheAuthoringResults,
|
|
36
|
+
"20261027120200_key_the_groups_of_a_turn": keyTheGroupsOfATurn,
|
|
37
|
+
"20261027120300_mark_the_active_turn_of_a_thread": markTheActiveTurnOfAThread,
|
|
38
|
+
"20261028120000_record_the_paused_work": recordThePausedWork,
|
|
39
|
+
"20261028120100_end_the_suspended_runs": endTheSuspendedRuns,
|
|
40
|
+
"20261029120000_reference_the_run_mandate": referenceTheRunMandate,
|
|
41
|
+
"20261029120100_record_the_run_session_of_a_pause": recordTheRunSessionOfAPause,
|
|
24
42
|
};
|
|
25
43
|
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The rows of `cortex_paused_work`: one row for each workflow that waits in a pause. The workflow writes its row
|
|
3
|
+
* before it waits and deletes it when the wait ends. A stop of the work deletes the rows of the work.
|
|
4
|
+
*/
|
|
5
|
+
import type { ResultAsync } from "neverthrow";
|
|
6
|
+
import type { QueryConfig } from "pg";
|
|
7
|
+
import type { RunSession } from "../auth/types.js";
|
|
8
|
+
import type { PauseCause, WorkKind } from "../contracts/chat-parts.js";
|
|
9
|
+
import { type DbError } from "../lib/db-result.js";
|
|
10
|
+
import type { Querier } from "./db.js";
|
|
11
|
+
/** One waiting workflow, as its row records it. */
|
|
12
|
+
export type PauseRecord = {
|
|
13
|
+
readonly workflowId: string;
|
|
14
|
+
readonly workId: string;
|
|
15
|
+
readonly workKind: WorkKind;
|
|
16
|
+
readonly analysisId: string;
|
|
17
|
+
readonly threadId?: 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
|
+
/** The topic that the message of a resume goes to. */
|
|
25
|
+
readonly topic: string;
|
|
26
|
+
/** ISO 8601. */
|
|
27
|
+
readonly pausedAt: string;
|
|
28
|
+
/** The run session of the workflow, for a run and a profile. A resume renews the run credential from it. */
|
|
29
|
+
readonly runSession?: RunSession;
|
|
30
|
+
};
|
|
31
|
+
/**
|
|
32
|
+
* The row-reading surface of the reads: one query whose rows the row schema types. A computed test fake satisfies
|
|
33
|
+
* it directly, where the row-generic of `Querier` cannot be implemented by a fake that computes its rows.
|
|
34
|
+
*/
|
|
35
|
+
export type PauseRowQuerier = {
|
|
36
|
+
query(queryTextOrConfig: string | QueryConfig, values?: unknown[]): Promise<{
|
|
37
|
+
rows: Record<string, unknown>[];
|
|
38
|
+
rowCount: number | null;
|
|
39
|
+
}>;
|
|
40
|
+
};
|
|
41
|
+
/** Write the row of a waiting workflow. A workflow waits in one pause at a time, thus a new pause replaces its row. */
|
|
42
|
+
export declare function recordPause(pool: Querier, record: PauseRecord): ResultAsync<void, DbError>;
|
|
43
|
+
/** Delete the row of a workflow whose wait ended. A second delete changes nothing. */
|
|
44
|
+
export declare function clearPause(pool: Querier, workflowId: string): ResultAsync<void, DbError>;
|
|
45
|
+
/** Delete the rows of workflows that no longer wait, in one statement. */
|
|
46
|
+
export declare function clearPauses(pool: Querier, workflowIds: readonly string[]): ResultAsync<void, DbError>;
|
|
47
|
+
/** Delete the rows of each workflow of the work, for a stop of the work. */
|
|
48
|
+
export declare function clearPausesOfWork(pool: Querier, workId: string): ResultAsync<void, DbError>;
|
|
49
|
+
/** The rows of the paused work of an analysis, the oldest pause first. */
|
|
50
|
+
export declare function queryPausesOfAnalysis(pool: PauseRowQuerier, analysisId: string): ResultAsync<PauseRecord[], DbError>;
|
|
51
|
+
/** The rows of the waiting workflows of one work in an analysis. */
|
|
52
|
+
export declare function queryPausesOfWork(pool: PauseRowQuerier, analysisId: string, workId: string): ResultAsync<PauseRecord[], DbError>;
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The rows of `cortex_paused_work`: one row for each workflow that waits in a pause. The workflow writes its row
|
|
3
|
+
* before it waits and deletes it when the wait ends. A stop of the work deletes the rows of the work.
|
|
4
|
+
*/
|
|
5
|
+
import { z } from "zod";
|
|
6
|
+
import { tryMutation, tryQuery } from "../lib/db-result.js";
|
|
7
|
+
const PauseCauseSchema = z.discriminatedUnion("kind", [
|
|
8
|
+
z.object({ kind: z.literal("outage") }),
|
|
9
|
+
z.object({ kind: z.literal("credential") }),
|
|
10
|
+
z.object({ kind: z.literal("host"), reason: z.string() }),
|
|
11
|
+
]);
|
|
12
|
+
const PauseRowSchema = z.object({
|
|
13
|
+
workflow_id: z.string(),
|
|
14
|
+
work_id: z.string(),
|
|
15
|
+
work_kind: z.enum(["turn", "run", "profile"]),
|
|
16
|
+
analysis_id: z.string(),
|
|
17
|
+
thread_id: z.string().nullable(),
|
|
18
|
+
state: z.enum(["retrying", "paused"]),
|
|
19
|
+
cause: PauseCauseSchema,
|
|
20
|
+
attempt: z.number(),
|
|
21
|
+
retry_at: z.date().nullable(),
|
|
22
|
+
topic: z.string(),
|
|
23
|
+
paused_at: z.date(),
|
|
24
|
+
run_session: z
|
|
25
|
+
.object({
|
|
26
|
+
identity: z.object({ user: z.string() }),
|
|
27
|
+
scope: z.object({ kind: z.literal("analysis"), analysisId: z.string(), threadId: z.string().optional() }),
|
|
28
|
+
provenance: z.object({ agentId: z.string(), callPath: z.array(z.string()) }),
|
|
29
|
+
runFrame: z.object({ runId: z.string(), stepId: z.string().optional() }),
|
|
30
|
+
// The harness never reads the opaque `auth`: the row holds the JSON that the workflow wrote from its own
|
|
31
|
+
// `RunSession`, and the realization of the host downcasts it.
|
|
32
|
+
auth: z.record(z.string(), z.json()),
|
|
33
|
+
})
|
|
34
|
+
.nullable(),
|
|
35
|
+
});
|
|
36
|
+
const COLUMNS = "workflow_id, work_id, work_kind, analysis_id, thread_id, state, cause, attempt, retry_at, topic, paused_at, run_session";
|
|
37
|
+
function recordOf(row) {
|
|
38
|
+
const parsed = PauseRowSchema.parse(row);
|
|
39
|
+
return {
|
|
40
|
+
workflowId: parsed.workflow_id,
|
|
41
|
+
workId: parsed.work_id,
|
|
42
|
+
workKind: parsed.work_kind,
|
|
43
|
+
analysisId: parsed.analysis_id,
|
|
44
|
+
threadId: parsed.thread_id ?? undefined,
|
|
45
|
+
state: parsed.state,
|
|
46
|
+
cause: parsed.cause,
|
|
47
|
+
attempt: parsed.attempt,
|
|
48
|
+
retryAt: parsed.retry_at?.toISOString(),
|
|
49
|
+
topic: parsed.topic,
|
|
50
|
+
pausedAt: parsed.paused_at.toISOString(),
|
|
51
|
+
runSession: parsed.run_session ?? undefined,
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
/** Write the row of a waiting workflow. A workflow waits in one pause at a time, thus a new pause replaces its row. */
|
|
55
|
+
export function recordPause(pool, record) {
|
|
56
|
+
return tryMutation("pausedWork.record", () => pool.query(`INSERT INTO cortex_paused_work (${COLUMNS})
|
|
57
|
+
VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12)
|
|
58
|
+
ON CONFLICT (workflow_id) DO UPDATE SET
|
|
59
|
+
work_id = EXCLUDED.work_id, work_kind = EXCLUDED.work_kind, analysis_id = EXCLUDED.analysis_id,
|
|
60
|
+
thread_id = EXCLUDED.thread_id, state = EXCLUDED.state, cause = EXCLUDED.cause, attempt = EXCLUDED.attempt,
|
|
61
|
+
retry_at = EXCLUDED.retry_at, topic = EXCLUDED.topic, paused_at = EXCLUDED.paused_at,
|
|
62
|
+
run_session = EXCLUDED.run_session`, [
|
|
63
|
+
record.workflowId,
|
|
64
|
+
record.workId,
|
|
65
|
+
record.workKind,
|
|
66
|
+
record.analysisId,
|
|
67
|
+
record.threadId ?? null,
|
|
68
|
+
record.state,
|
|
69
|
+
JSON.stringify(record.cause),
|
|
70
|
+
record.attempt,
|
|
71
|
+
record.retryAt ?? null,
|
|
72
|
+
record.topic,
|
|
73
|
+
record.pausedAt,
|
|
74
|
+
record.runSession === undefined ? null : JSON.stringify(record.runSession),
|
|
75
|
+
])).map(() => undefined);
|
|
76
|
+
}
|
|
77
|
+
/** Delete the row of a workflow whose wait ended. A second delete changes nothing. */
|
|
78
|
+
export function clearPause(pool, workflowId) {
|
|
79
|
+
return tryMutation("pausedWork.clear", () => pool.query("DELETE FROM cortex_paused_work WHERE workflow_id = $1", [workflowId])).map(() => undefined);
|
|
80
|
+
}
|
|
81
|
+
/** Delete the rows of workflows that no longer wait, in one statement. */
|
|
82
|
+
export function clearPauses(pool, workflowIds) {
|
|
83
|
+
return tryMutation("pausedWork.clearMany", () => pool.query("DELETE FROM cortex_paused_work WHERE workflow_id = ANY($1)", [workflowIds])).map(() => undefined);
|
|
84
|
+
}
|
|
85
|
+
/** Delete the rows of each workflow of the work, for a stop of the work. */
|
|
86
|
+
export function clearPausesOfWork(pool, workId) {
|
|
87
|
+
return tryMutation("pausedWork.clearWork", () => pool.query("DELETE FROM cortex_paused_work WHERE work_id = $1", [workId])).map(() => undefined);
|
|
88
|
+
}
|
|
89
|
+
/** The rows of the paused work of an analysis, the oldest pause first. */
|
|
90
|
+
export function queryPausesOfAnalysis(pool, analysisId) {
|
|
91
|
+
return tryQuery("pausedWork.ofAnalysis", async () => {
|
|
92
|
+
const { rows } = await pool.query(`SELECT ${COLUMNS} FROM cortex_paused_work WHERE analysis_id = $1 ORDER BY paused_at, workflow_id`, [analysisId]);
|
|
93
|
+
return rows.map(recordOf);
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
/** The rows of the waiting workflows of one work in an analysis. */
|
|
97
|
+
export function queryPausesOfWork(pool, analysisId, workId) {
|
|
98
|
+
return tryQuery("pausedWork.ofWork", async () => {
|
|
99
|
+
const { rows } = await pool.query(`SELECT ${COLUMNS} FROM cortex_paused_work WHERE analysis_id = $1 AND work_id = $2 ORDER BY workflow_id`, [
|
|
100
|
+
analysisId,
|
|
101
|
+
workId,
|
|
102
|
+
]);
|
|
103
|
+
return rows.map(recordOf);
|
|
104
|
+
});
|
|
105
|
+
}
|
package/dist/state/plans.d.ts
CHANGED
|
@@ -3,13 +3,32 @@
|
|
|
3
3
|
* and analysis-scoped lookup.
|
|
4
4
|
*/
|
|
5
5
|
import type { ResultAsync } from "neverthrow";
|
|
6
|
+
import type { QueryConfig } from "pg";
|
|
6
7
|
import { type DbError } from "../lib/db-result.js";
|
|
7
8
|
import type { Querier } from "./db.js";
|
|
8
|
-
|
|
9
|
+
/**
|
|
10
|
+
* What the plan reads of the pool: one row-reading query over concrete rows.
|
|
11
|
+
* A real `Pool` and a `Querier`-typed caller satisfy it; a computed test fake
|
|
12
|
+
* satisfies it directly, where the row-generic `Querier` refuses it.
|
|
13
|
+
*/
|
|
14
|
+
export type PlanRowQuerier = {
|
|
15
|
+
query(queryTextOrConfig: string | QueryConfig, values?: unknown[]): Promise<{
|
|
16
|
+
rows: Record<string, unknown>[];
|
|
17
|
+
rowCount: number | null;
|
|
18
|
+
}>;
|
|
19
|
+
};
|
|
20
|
+
/**
|
|
21
|
+
* `cortex_plans.plan_id` shape contract — `pln-` followed by 8 lowercase hex
|
|
22
|
+
* chars. The chat trigger (`tools/execute-analysis.ts`) enforces the same regex on
|
|
23
|
+
* its tool input; `upsertPlan` re-asserts it because it accepts a caller-derived
|
|
24
|
+
* id rather than minting one. The shape itself is the `PLAN_ID_RE` home in
|
|
25
|
+
* `contracts/schemas/chat-parts.ts`.
|
|
26
|
+
*/
|
|
27
|
+
export type InsertPlanInput = {
|
|
9
28
|
analysisId: string;
|
|
10
29
|
plan: unknown;
|
|
11
30
|
parentPlanId?: string | null;
|
|
12
|
-
}
|
|
31
|
+
};
|
|
13
32
|
/**
|
|
14
33
|
* Insert a plan and return the generated planId.
|
|
15
34
|
* Validates that parentPlanId (if set) belongs to the same analysis —
|
|
@@ -21,13 +40,13 @@ export interface InsertPlanInput {
|
|
|
21
40
|
* as a query failure and they surface verbatim to the caller.
|
|
22
41
|
*/
|
|
23
42
|
export declare function insertPlan(pool: Querier, input: InsertPlanInput): ResultAsync<string, DbError>;
|
|
24
|
-
export
|
|
43
|
+
export type UpsertPlanInput = {
|
|
25
44
|
/** Caller-derived id — must match the `pln-<8hex>` contract. */
|
|
26
45
|
planId: string;
|
|
27
46
|
analysisId: string;
|
|
28
47
|
plan: unknown;
|
|
29
48
|
parentPlanId?: string | null;
|
|
30
|
-
}
|
|
49
|
+
};
|
|
31
50
|
/**
|
|
32
51
|
* Insert a plan under a caller-supplied id, or no-op if that id already exists
|
|
33
52
|
* (`ON CONFLICT (plan_id) DO NOTHING`). Unlike {@link insertPlan}, the id is
|
|
@@ -53,9 +72,9 @@ export declare function upsertPlan(pool: Querier, input: UpsertPlanInput): Resul
|
|
|
53
72
|
*/
|
|
54
73
|
export declare function loadPlan(pool: Querier, planId: string, opts: {
|
|
55
74
|
analysisId: string;
|
|
56
|
-
}): ResultAsync<unknown
|
|
75
|
+
}): ResultAsync<unknown, DbError>;
|
|
57
76
|
/** A stored plan with its lineage, as {@link loadPlanRecord} reads it. */
|
|
58
|
-
export
|
|
77
|
+
export type PlanRecord = {
|
|
59
78
|
planId: string;
|
|
60
79
|
/** The stored document, as the store holds it. A reader parses it. */
|
|
61
80
|
plan: unknown;
|
|
@@ -63,7 +82,7 @@ export interface PlanRecord {
|
|
|
63
82
|
/** The newest plan of the same analysis that names this plan as its parent. */
|
|
64
83
|
supersededBy: string | null;
|
|
65
84
|
createdAt: string;
|
|
66
|
-
}
|
|
85
|
+
};
|
|
67
86
|
/**
|
|
68
87
|
* Analysis-scoped read of one plan with its parent and the newest plan that
|
|
69
88
|
* replaced it, in one statement. Returns `ok(null)` for an unknown planId OR a
|
|
@@ -72,6 +91,6 @@ export interface PlanRecord {
|
|
|
72
91
|
* `created_at` is ISO 8601 text, thus the text order is the time order; the plan
|
|
73
92
|
* id breaks a tie so that the answer is stable.
|
|
74
93
|
*/
|
|
75
|
-
export declare function loadPlanRecord(pool:
|
|
94
|
+
export declare function loadPlanRecord(pool: PlanRowQuerier, planId: string, opts: {
|
|
76
95
|
analysisId: string;
|
|
77
96
|
}): ResultAsync<PlanRecord | null, DbError>;
|
package/dist/state/plans.js
CHANGED
|
@@ -3,14 +3,9 @@
|
|
|
3
3
|
* and analysis-scoped lookup.
|
|
4
4
|
*/
|
|
5
5
|
import { randomUUID } from "node:crypto";
|
|
6
|
+
import { PLAN_ID_RE } from "../contracts/schemas/chat-parts.js";
|
|
7
|
+
import { z } from "zod";
|
|
6
8
|
import { tryMutation, tryQuery } from "../lib/db-result.js";
|
|
7
|
-
/**
|
|
8
|
-
* `cortex_plans.plan_id` shape contract — `pln-` followed by 8 lowercase hex
|
|
9
|
-
* chars. The chat trigger (`tools/execute-analysis.ts`) enforces the same regex on
|
|
10
|
-
* its tool input; `upsertPlan` re-asserts it because it accepts a caller-derived
|
|
11
|
-
* id rather than minting one.
|
|
12
|
-
*/
|
|
13
|
-
const PLAN_ID_PATTERN = /^pln-[a-f0-9]{8}$/;
|
|
14
9
|
/**
|
|
15
10
|
* Enforce tenant scope for a `parentPlanId`: the parent row must exist AND belong
|
|
16
11
|
* to `analysisId`. Shared by {@link insertPlan} and {@link upsertPlan} — the
|
|
@@ -30,7 +25,7 @@ function checkParentScope(pool, parentPlanId, analysisId, label) {
|
|
|
30
25
|
if ((parent.rowCount ?? 0) === 0) {
|
|
31
26
|
throw new Error(`parent plan ${parentPlanId} not found`);
|
|
32
27
|
}
|
|
33
|
-
if (parent.rows[0]
|
|
28
|
+
if (parent.rows[0]?.analysis_id !== analysisId) {
|
|
34
29
|
throw new Error(`parent plan ${parentPlanId} belongs to a different analysis`);
|
|
35
30
|
}
|
|
36
31
|
});
|
|
@@ -80,7 +75,7 @@ export function insertPlan(pool, input) {
|
|
|
80
75
|
* (mirroring the parent-scope violations, which throw before the INSERT).
|
|
81
76
|
*/
|
|
82
77
|
export function upsertPlan(pool, input) {
|
|
83
|
-
if (!
|
|
78
|
+
if (!PLAN_ID_RE.test(input.planId)) {
|
|
84
79
|
throw new Error(`upsertPlan: invalid plan id "${input.planId}" — expected the pln-<8hex> shape`);
|
|
85
80
|
}
|
|
86
81
|
const upsert = () => {
|
|
@@ -115,6 +110,13 @@ export function loadPlan(pool, planId, opts) {
|
|
|
115
110
|
return result.rows[0]?.plan ?? null;
|
|
116
111
|
});
|
|
117
112
|
}
|
|
113
|
+
/** The `cortex_plans` row of {@link loadPlanRecord}, as the SELECT returns it. */
|
|
114
|
+
const PlanRecordRowSchema = z.object({
|
|
115
|
+
plan: z.json(),
|
|
116
|
+
parent_plan_id: z.string().nullable(),
|
|
117
|
+
created_at: z.string(),
|
|
118
|
+
superseded_by: z.string().nullable(),
|
|
119
|
+
});
|
|
118
120
|
/**
|
|
119
121
|
* Analysis-scoped read of one plan with its parent and the newest plan that
|
|
120
122
|
* replaced it, in one statement. Returns `ok(null)` for an unknown planId OR a
|
|
@@ -134,9 +136,10 @@ export function loadPlanRecord(pool, planId, opts) {
|
|
|
134
136
|
WHERE p.plan_id = $1 AND p.analysis_id = $2`,
|
|
135
137
|
values: [planId, opts.analysisId],
|
|
136
138
|
});
|
|
137
|
-
const
|
|
138
|
-
if (!
|
|
139
|
+
const raw = result.rows[0];
|
|
140
|
+
if (!raw)
|
|
139
141
|
return null;
|
|
142
|
+
const row = PlanRecordRowSchema.parse(raw);
|
|
140
143
|
return { planId, plan: row.plan, parentPlanId: row.parent_plan_id, supersededBy: row.superseded_by, createdAt: row.created_at };
|
|
141
144
|
});
|
|
142
145
|
}
|