@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
|
@@ -25,11 +25,12 @@ import { metrics } from "@opentelemetry/api";
|
|
|
25
25
|
import { ResultAsync, ok, okAsync } from "neverthrow";
|
|
26
26
|
import { stripNulCharacters } from "../input-sanitization.js";
|
|
27
27
|
import { tryMutation, tryQuery, withTransaction } from "../lib/db-result.js";
|
|
28
|
+
import { presentFirst } from "../lib/present.js";
|
|
28
29
|
import { hasReportedUsage } from "../loop/metrics.js";
|
|
29
30
|
import { countTokens } from "./count-tokens.js";
|
|
30
31
|
import { conversationView, groupTurns, isGenuineUserStart } from "./conversation-view.js";
|
|
31
32
|
import { HARNESS_PROVIDER_NAMESPACE, SYNTHETIC_MESSAGE_KEY, envelopeMessage, parseStoredMessageEnvelope, syntheticRecordMessage, } from "./ai-sdk-message-storage.js";
|
|
32
|
-
import { conversationDisplayPart, envelopeDisplayMessages, parseStoredDisplayEnvelope, } from "./conversation-display-storage.js";
|
|
33
|
+
import { conversationDisplayPart, envelopeDisplayMessages, isStoredSourcePart, parseStoredDisplayEnvelope, } from "./conversation-display-storage.js";
|
|
33
34
|
/** A resolved `ok(undefined)` ResultAsync — the empty/seed transaction step. */
|
|
34
35
|
function okVoid() {
|
|
35
36
|
return new ResultAsync(Promise.resolve(ok(undefined)));
|
|
@@ -56,7 +57,9 @@ export function conversationRecordTurn(text, displayParts) {
|
|
|
56
57
|
{
|
|
57
58
|
id: randomUUID(),
|
|
58
59
|
role: "system",
|
|
59
|
-
parts: displayParts !== undefined && displayParts.length > 0
|
|
60
|
+
parts: displayParts !== undefined && displayParts.length > 0
|
|
61
|
+
? displayParts.filter(isStoredSourcePart).map(conversationDisplayPart)
|
|
62
|
+
: [{ type: "text", text, state: "done" }],
|
|
60
63
|
},
|
|
61
64
|
],
|
|
62
65
|
};
|
|
@@ -128,12 +131,12 @@ function nextSeq(client, threadId, op) {
|
|
|
128
131
|
const { rows } = await client.query("SELECT COALESCE(MAX(seq), -1)::text AS max_seq FROM messages WHERE thread_id = $1", [
|
|
129
132
|
threadId,
|
|
130
133
|
]);
|
|
131
|
-
return Number(rows
|
|
134
|
+
return Number(presentFirst(rows, "the max-seq row").max_seq) + 1;
|
|
132
135
|
});
|
|
133
136
|
}
|
|
134
137
|
/** Insert the rows of one group, from `startSeq` on. */
|
|
135
138
|
function insertGroup(client, threadId, startSeq, group, op) {
|
|
136
|
-
const { modelMessages: messages, displayMessages, author } = group;
|
|
139
|
+
const { modelMessages: messages, displayMessages, author, key } = group;
|
|
137
140
|
// The display projection rides the group's FIRST row, so one SELECT of a
|
|
138
141
|
// thread's rows yields every envelope in order with no join and no grouping.
|
|
139
142
|
// Whichever row that is — a genuine user message opening a turn, or the lone
|
|
@@ -154,19 +157,21 @@ function insertGroup(client, threadId, startSeq, group, op) {
|
|
|
154
157
|
return messages.reduce((chain, message, i) => chain.andThen(() => tryMutation(`${op}.insert`, () => client.query(
|
|
155
158
|
// `message_envelope::json`, never `::jsonb`; `display_envelope::jsonb`,
|
|
156
159
|
// never `::json` — see the column comments in the state-init DDL.
|
|
157
|
-
`INSERT INTO messages (thread_id, seq, message_envelope, display_envelope, tokens, author)
|
|
158
|
-
VALUES ($1, $2, $3::json, $4::jsonb, $5, $6)
|
|
160
|
+
`INSERT INTO messages (thread_id, seq, message_envelope, display_envelope, tokens, author, round_key)
|
|
161
|
+
VALUES ($1, $2, $3::json, $4::jsonb, $5, $6, $7)
|
|
159
162
|
ON CONFLICT (thread_id, seq) DO UPDATE
|
|
160
163
|
SET message_envelope = EXCLUDED.message_envelope,
|
|
161
164
|
display_envelope = EXCLUDED.display_envelope,
|
|
162
165
|
tokens = EXCLUDED.tokens,
|
|
163
|
-
author = EXCLUDED.author
|
|
166
|
+
author = EXCLUDED.author,
|
|
167
|
+
round_key = EXCLUDED.round_key`, [
|
|
164
168
|
threadId,
|
|
165
169
|
startSeq + i,
|
|
166
170
|
serializeEnvelope(message),
|
|
167
171
|
i === 0 ? displayEnvelope : null,
|
|
168
172
|
countTokens(message.content),
|
|
169
173
|
i === authorRow ? turnAuthor : null,
|
|
174
|
+
i === 0 ? (key ?? null) : null,
|
|
170
175
|
])).map(() => undefined)), okVoid());
|
|
171
176
|
}
|
|
172
177
|
/** Move `cortex_analysis_threads.updated_at` forward inside the write transaction. */
|
|
@@ -209,6 +214,16 @@ function touchThread(client, threadId, op) {
|
|
|
209
214
|
.map(() => undefined)
|
|
210
215
|
.orElse(() => okVoid()));
|
|
211
216
|
}
|
|
217
|
+
/** The `seq` of the first row of a group that a write stored before, by the key of the group. */
|
|
218
|
+
function storedGroupSeq(client, threadId, key, op) {
|
|
219
|
+
if (key === undefined)
|
|
220
|
+
return okAsync(undefined);
|
|
221
|
+
return tryQuery(`${op}.storedKey`, async () => {
|
|
222
|
+
const { rows } = await client.query("SELECT seq::text AS seq FROM messages WHERE thread_id = $1 AND round_key = $2", [threadId, key]);
|
|
223
|
+
const row = rows[0];
|
|
224
|
+
return row === undefined ? undefined : Number(row.seq);
|
|
225
|
+
});
|
|
226
|
+
}
|
|
212
227
|
/** Add the `open` record of a turn. The upsert replaces a record whose rows are gone, because the opening row holds its key now. */
|
|
213
228
|
function openTurnRecord(client, threadId, startSeq) {
|
|
214
229
|
return tryMutation("thread-history.writeTurn.openRecord", () => client.query(`INSERT INTO cortex_thread_turns (thread_id, start_seq, status)
|
|
@@ -320,46 +335,50 @@ const PAGE_SQL = `WITH RECURSIVE page_walk(seq, starts) AS (
|
|
|
320
335
|
function pageLimit(limit) {
|
|
321
336
|
return Number.isFinite(limit) ? Math.min(Math.max(1, Math.trunc(limit)), Number.MAX_SAFE_INTEGER) : 1;
|
|
322
337
|
}
|
|
323
|
-
/**
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
*/
|
|
338
|
+
/** `appendTurn` inside the transaction of the caller, thus another write of the caller commits with the turn or not at all. */
|
|
339
|
+
export function appendTurnIn(client, threadId, turn) {
|
|
340
|
+
if (turn.modelMessages.length === 0)
|
|
341
|
+
return okVoid();
|
|
342
|
+
return lockThread(client, threadId, "thread-history.appendTurn")
|
|
343
|
+
.andThen(() => nextSeq(client, threadId, "thread-history.appendTurn"))
|
|
344
|
+
.andThen((startSeq) => insertGroup(client, threadId, startSeq, turn, "thread-history.appendTurn"))
|
|
345
|
+
.andThen(() => touchThread(client, threadId, "thread-history.appendTurn"));
|
|
346
|
+
}
|
|
333
347
|
export function createThreadHistory(pool, logger) {
|
|
334
348
|
function appendTurn(threadId, turn) {
|
|
335
349
|
if (turn.modelMessages.length === 0)
|
|
336
350
|
return okVoid();
|
|
337
|
-
return withTransaction(pool, "thread-history.appendTurn", (client) =>
|
|
338
|
-
.andThen(() => nextSeq(client, threadId, "thread-history.appendTurn"))
|
|
339
|
-
.andThen((startSeq) => insertGroup(client, threadId, startSeq, turn, "thread-history.appendTurn"))
|
|
340
|
-
.andThen(() => touchThread(client, threadId, "thread-history.appendTurn")));
|
|
351
|
+
return withTransaction(pool, "thread-history.appendTurn", (client) => appendTurnIn(client, threadId, turn));
|
|
341
352
|
}
|
|
342
353
|
function writeTurn(threadId, write) {
|
|
343
354
|
const { close } = write;
|
|
344
355
|
const groups = [...(write.opening === undefined ? [] : [write.opening]), ...write.rounds, ...(close?.note === undefined ? [] : [close.note])];
|
|
345
356
|
return withTransaction(pool, "thread-history.writeTurn", (client) => lockThread(client, threadId, "thread-history.writeTurn")
|
|
346
|
-
|
|
347
|
-
.andThen((
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
const groupSeq = seq;
|
|
353
|
-
seq += group.modelMessages.length;
|
|
354
|
-
steps.push(() => insertGroup(client, threadId, groupSeq, group, "thread-history.writeTurn"));
|
|
355
|
-
if (index === 0 && write.opening !== undefined)
|
|
356
|
-
steps.push(() => openTurnRecord(client, threadId, startSeq));
|
|
357
|
-
}
|
|
358
|
-
if (close !== undefined)
|
|
359
|
-
steps.push(() => closeTurnRecord(client, threadId, startSeq, close));
|
|
360
|
-
steps.push(() => touchThread(client, threadId, "thread-history.writeTurn"));
|
|
361
|
-
return steps.reduce((chain, step) => chain.andThen(step), okVoid()).map(() => ({ startSeq }));
|
|
357
|
+
// One transaction stores each group of a write, thus a stored first group means a stored write.
|
|
358
|
+
.andThen(() => storedGroupSeq(client, threadId, groups[0]?.key, "thread-history.writeTurn"))
|
|
359
|
+
.andThen((storedSeq) => {
|
|
360
|
+
if (storedSeq === undefined)
|
|
361
|
+
return writeGroups(client);
|
|
362
|
+
return okAsync({ startSeq: write.opening === undefined ? write.startSeq : storedSeq });
|
|
362
363
|
}));
|
|
364
|
+
function writeGroups(client) {
|
|
365
|
+
return nextSeq(client, threadId, "thread-history.writeTurn").andThen((firstSeq) => {
|
|
366
|
+
const startSeq = write.opening === undefined ? write.startSeq : firstSeq;
|
|
367
|
+
const steps = [];
|
|
368
|
+
let seq = firstSeq;
|
|
369
|
+
for (const [index, group] of groups.entries()) {
|
|
370
|
+
const groupSeq = seq;
|
|
371
|
+
seq += group.modelMessages.length;
|
|
372
|
+
steps.push(() => insertGroup(client, threadId, groupSeq, group, "thread-history.writeTurn"));
|
|
373
|
+
if (index === 0 && write.opening !== undefined)
|
|
374
|
+
steps.push(() => openTurnRecord(client, threadId, startSeq));
|
|
375
|
+
}
|
|
376
|
+
if (close !== undefined)
|
|
377
|
+
steps.push(() => closeTurnRecord(client, threadId, startSeq, close));
|
|
378
|
+
steps.push(() => touchThread(client, threadId, "thread-history.writeTurn"));
|
|
379
|
+
return steps.reduce((chain, step) => chain.andThen(step), okVoid()).map(() => ({ startSeq }));
|
|
380
|
+
});
|
|
381
|
+
}
|
|
363
382
|
}
|
|
364
383
|
function loadRecent(threadId, options) {
|
|
365
384
|
return tryQuery("thread-history.loadRecent", async () => {
|
|
@@ -375,7 +394,7 @@ export function createThreadHistory(pool, logger) {
|
|
|
375
394
|
// nothing has no rollup at all. The two are different measurements
|
|
376
395
|
// sharing a unit; see the column comments.
|
|
377
396
|
`SELECT seq::text AS seq, message_envelope, tokens
|
|
378
|
-
FROM messages WHERE thread_id = $1 ORDER BY messages.seq ASC`, [threadId]);
|
|
397
|
+
FROM messages WHERE thread_id = $1 AND ($2::bigint IS NULL OR messages.seq <= $2::bigint) ORDER BY messages.seq ASC`, [threadId, options?.throughSeq ?? null]);
|
|
379
398
|
const parsed = rows.map((row, index) => ({
|
|
380
399
|
index,
|
|
381
400
|
message: parseStoredMessageEnvelope(row.message_envelope, `${threadId}/${row.seq}`).message,
|
|
@@ -405,25 +424,30 @@ export function createThreadHistory(pool, logger) {
|
|
|
405
424
|
async function toStoredMessage(threadId, r) {
|
|
406
425
|
const envelope = parseStoredMessageEnvelope(r.message_envelope, `${threadId}/${r.seq}`);
|
|
407
426
|
const displayEnvelope = r.display_envelope == null ? undefined : await parseStoredDisplayEnvelope(r.display_envelope, `${threadId}/${r.seq}/display`, logger);
|
|
408
|
-
const
|
|
409
|
-
? undefined
|
|
410
|
-
: {
|
|
411
|
-
status: r.turn_status,
|
|
412
|
-
...(r.turn_reason === null ? {} : { reason: r.turn_reason }),
|
|
413
|
-
...(r.turn_usage === null ? {} : { usage: r.turn_usage }),
|
|
414
|
-
...(r.turn_record_duration_ms === null ? {} : { durationMs: Number(r.turn_record_duration_ms) }),
|
|
415
|
-
};
|
|
416
|
-
return {
|
|
427
|
+
const row = {
|
|
417
428
|
seq: Number(r.seq),
|
|
418
429
|
envelope,
|
|
419
430
|
message: envelope.message,
|
|
420
|
-
|
|
421
|
-
...(r.reported_usage === null ? {} : { usage: r.reported_usage }),
|
|
422
|
-
...(r.turn_duration_ms === null ? {} : { durationMs: Number(r.turn_duration_ms) }),
|
|
423
|
-
...(turn === undefined ? {} : { turn }),
|
|
424
|
-
...(r.author === null ? {} : { author: r.author }),
|
|
431
|
+
displayEnvelope,
|
|
425
432
|
createdAt: r.created_at,
|
|
426
433
|
};
|
|
434
|
+
if (r.reported_usage !== null)
|
|
435
|
+
row.usage = r.reported_usage;
|
|
436
|
+
if (r.turn_duration_ms !== null)
|
|
437
|
+
row.durationMs = Number(r.turn_duration_ms);
|
|
438
|
+
if (r.author !== null)
|
|
439
|
+
row.author = r.author;
|
|
440
|
+
if (r.turn_status !== null) {
|
|
441
|
+
const turn = { status: r.turn_status };
|
|
442
|
+
if (r.turn_reason !== null)
|
|
443
|
+
turn.reason = r.turn_reason;
|
|
444
|
+
if (r.turn_usage !== null)
|
|
445
|
+
turn.usage = r.turn_usage;
|
|
446
|
+
if (r.turn_record_duration_ms !== null)
|
|
447
|
+
turn.durationMs = Number(r.turn_record_duration_ms);
|
|
448
|
+
row.turn = turn;
|
|
449
|
+
}
|
|
450
|
+
return row;
|
|
427
451
|
}
|
|
428
452
|
async function toTurns(threadId, rows) {
|
|
429
453
|
const stored = await Promise.all(rows.map((row) => toStoredMessage(threadId, row)));
|
|
@@ -488,7 +512,7 @@ export function createThreadHistory(pool, logger) {
|
|
|
488
512
|
(SELECT MAX(seq)::text FROM messages
|
|
489
513
|
WHERE thread_id = $1
|
|
490
514
|
AND ${GENUINE_USER_START_SQL}) AS boundary`, [threadId]);
|
|
491
|
-
return rows
|
|
515
|
+
return presentFirst(rows, "the thread boundary row");
|
|
492
516
|
}))
|
|
493
517
|
.andThen(({ has_rows, boundary }) => {
|
|
494
518
|
if (!has_rows)
|
|
@@ -533,7 +557,7 @@ export function createThreadHistory(pool, logger) {
|
|
|
533
557
|
return tryQuery("thread-history.countUserTurnsAfter", () => pool.query(`SELECT COUNT(*)::text AS turns FROM messages
|
|
534
558
|
WHERE thread_id = $1
|
|
535
559
|
AND seq > $2::bigint
|
|
536
|
-
AND ${GENUINE_USER_START_SQL}`, [threadId, seq])).map(({ rows }) => Number(rows
|
|
560
|
+
AND ${GENUINE_USER_START_SQL}`, [threadId, seq])).map(({ rows }) => Number(presentFirst(rows, "the user-turn count row").turns));
|
|
537
561
|
}
|
|
538
562
|
return { appendTurn, writeTurn, loadRecent, loadAll, loadPage, retractLastTurn, latestSeq, latestTurnAt, countUserTurnsAfter };
|
|
539
563
|
}
|
|
@@ -44,8 +44,9 @@
|
|
|
44
44
|
* so it does not enforce that.
|
|
45
45
|
*/
|
|
46
46
|
import { type ResultAsync } from "neverthrow";
|
|
47
|
-
import type
|
|
48
|
-
import {
|
|
47
|
+
import { type DbError, type Connectable } from "../lib/db-result.js";
|
|
48
|
+
import type { Querier } from "../state/db.js";
|
|
49
|
+
import { type ConversationTurn } from "./thread-history.js";
|
|
49
50
|
/**
|
|
50
51
|
* The kind of session a thread holds. `conversation` is the analysis
|
|
51
52
|
* conversation the product has always had; `report` is a report session spawned
|
|
@@ -65,7 +66,7 @@ import { type DbError } from "../lib/db-result.js";
|
|
|
65
66
|
declare const THREAD_TYPES: readonly ["conversation", "report"];
|
|
66
67
|
export type ThreadType = (typeof THREAD_TYPES)[number];
|
|
67
68
|
/** One conversation thread's metadata, as returned by the store. */
|
|
68
|
-
export
|
|
69
|
+
export type Thread = {
|
|
69
70
|
readonly threadId: string;
|
|
70
71
|
readonly analysisId: string;
|
|
71
72
|
readonly title: string | null;
|
|
@@ -93,13 +94,13 @@ export interface Thread {
|
|
|
93
94
|
* fall through and render a tombstoned conversation as live.
|
|
94
95
|
*/
|
|
95
96
|
readonly deletedAt: Date | null;
|
|
96
|
-
}
|
|
97
|
-
export
|
|
97
|
+
};
|
|
98
|
+
export type CreateThreadInput = {
|
|
98
99
|
readonly threadId: string;
|
|
99
100
|
readonly analysisId: string;
|
|
100
101
|
readonly title?: string | null;
|
|
101
|
-
/** Omitted is `conversation` — what a thread is when nothing says otherwise. */
|
|
102
|
-
readonly type?:
|
|
102
|
+
/** Omitted is `conversation` — what a thread is when nothing says otherwise. The store refuses a value outside the closed set at runtime: an untyped caller (a JSON body across a package boundary) can hand in any string, and `unknown_thread_type` is the declared refusal for it. */
|
|
103
|
+
readonly type?: string;
|
|
103
104
|
/**
|
|
104
105
|
* The thread this one is spawned from. It must belong to the same analysis
|
|
105
106
|
* as the child; whether it exists at all is the foreign key's verdict, not
|
|
@@ -112,7 +113,13 @@ export interface CreateThreadInput {
|
|
|
112
113
|
* and either half alone describes no place.
|
|
113
114
|
*/
|
|
114
115
|
readonly parentSeq?: number;
|
|
115
|
-
|
|
116
|
+
/**
|
|
117
|
+
* The first turn of the new thread. The row and the turn commit in one
|
|
118
|
+
* transaction. A create that finds the row already there writes no turn,
|
|
119
|
+
* thus a second create with the same id gives the thread with one turn.
|
|
120
|
+
*/
|
|
121
|
+
readonly firstTurn?: ConversationTurn;
|
|
122
|
+
};
|
|
116
123
|
/**
|
|
117
124
|
* A create the store refuses on its own, before any row is written. Distinct
|
|
118
125
|
* from `DbError`: nothing failed at the driver — the request described a thread
|
|
@@ -143,7 +150,7 @@ export type ThreadInputError = {
|
|
|
143
150
|
readonly threadId: string;
|
|
144
151
|
readonly threadType: string;
|
|
145
152
|
};
|
|
146
|
-
export
|
|
153
|
+
export type ListThreadsInput = {
|
|
147
154
|
readonly analysisId: string;
|
|
148
155
|
readonly page?: number;
|
|
149
156
|
readonly perPage?: number;
|
|
@@ -168,21 +175,21 @@ export interface ListThreadsInput {
|
|
|
168
175
|
readonly type?: ThreadType;
|
|
169
176
|
/** Narrow to one thread's direct children, exact match. Same polarity as `type`: omitting it narrows nothing. */
|
|
170
177
|
readonly parentThreadId?: string;
|
|
171
|
-
}
|
|
172
|
-
export
|
|
178
|
+
};
|
|
179
|
+
export type ListRecentThreadsInput = {
|
|
173
180
|
/** The most threads to give. It clamps to 1 to 200, the bounds of a page of `listThreads`. */
|
|
174
181
|
readonly limit: number;
|
|
175
182
|
/** Narrow to one kind of session, exact match. Omitting it narrows nothing. */
|
|
176
183
|
readonly type?: ThreadType;
|
|
177
|
-
}
|
|
178
|
-
export
|
|
184
|
+
};
|
|
185
|
+
export type ThreadPage = {
|
|
179
186
|
readonly threads: Thread[];
|
|
180
187
|
readonly total: number;
|
|
181
188
|
readonly page: number;
|
|
182
189
|
readonly perPage: number;
|
|
183
190
|
readonly hasMore: boolean;
|
|
184
|
-
}
|
|
185
|
-
export
|
|
191
|
+
};
|
|
192
|
+
export type ThreadStore = {
|
|
186
193
|
/**
|
|
187
194
|
* Create a thread row. Idempotent on `thread_id` — a second create for an
|
|
188
195
|
* existing id is a no-op that preserves the existing row (including its
|
|
@@ -260,11 +267,13 @@ export interface ThreadStore {
|
|
|
260
267
|
* archived thread is never in it.
|
|
261
268
|
*/
|
|
262
269
|
listRecentThreads(input: ListRecentThreadsInput): ResultAsync<Thread[], DbError>;
|
|
263
|
-
}
|
|
270
|
+
};
|
|
264
271
|
/**
|
|
265
272
|
* Create a `ThreadStore` bound to a Postgres pool — a factory closure
|
|
266
273
|
* capturing `pool` (dependency injection per the harness-durable-runtime spec). The
|
|
267
274
|
* `cortex_analysis_threads` table is provisioned by the state-init DDL.
|
|
268
275
|
*/
|
|
269
|
-
|
|
276
|
+
/** What this module reads of the pool: the direct `query` plus the transactional `connect`. */
|
|
277
|
+
type ThreadStorePool = Querier & Connectable;
|
|
278
|
+
export declare function createThreadStore(pool: ThreadStorePool): ThreadStore;
|
|
270
279
|
export {};
|
|
@@ -45,6 +45,8 @@
|
|
|
45
45
|
*/
|
|
46
46
|
import { errAsync, okAsync } from "neverthrow";
|
|
47
47
|
import { tryMutation, tryQuery, withTransaction } from "../lib/db-result.js";
|
|
48
|
+
import { presentFirst } from "../lib/present.js";
|
|
49
|
+
import { appendTurnIn } from "./thread-history.js";
|
|
48
50
|
/**
|
|
49
51
|
* The kind of session a thread holds. `conversation` is the analysis
|
|
50
52
|
* conversation the product has always had; `report` is a report session spawned
|
|
@@ -106,11 +108,6 @@ function toThread(row) {
|
|
|
106
108
|
}
|
|
107
109
|
const DEFAULT_PER_PAGE = 100;
|
|
108
110
|
const MAX_PER_PAGE = 200;
|
|
109
|
-
/**
|
|
110
|
-
* Create a `ThreadStore` bound to a Postgres pool — a factory closure
|
|
111
|
-
* capturing `pool` (dependency injection per the harness-durable-runtime spec). The
|
|
112
|
-
* `cortex_analysis_threads` table is provisioned by the state-init DDL.
|
|
113
|
-
*/
|
|
114
111
|
export function createThreadStore(pool) {
|
|
115
112
|
/**
|
|
116
113
|
* The parent's own analysis scope, or `null` when no such row exists.
|
|
@@ -141,16 +138,22 @@ export function createThreadStore(pool) {
|
|
|
141
138
|
* returned row.
|
|
142
139
|
*/
|
|
143
140
|
function insertThread(input) {
|
|
144
|
-
|
|
141
|
+
const { firstTurn } = input;
|
|
142
|
+
if (firstTurn === undefined)
|
|
143
|
+
return insertRow(pool, input).map(({ thread }) => thread);
|
|
144
|
+
return withTransaction(pool, "thread-store.createThread", (client) => insertRow(client, input).andThen(({ thread, inserted }) => inserted ? appendTurnIn(client, thread.threadId, firstTurn).map(() => thread) : okAsync(thread)));
|
|
145
|
+
}
|
|
146
|
+
function insertRow(querier, input) {
|
|
147
|
+
return tryMutation("thread-store.createThread.insert", () => querier.query(`INSERT INTO cortex_analysis_threads (thread_id, analysis_id, title, thread_type, parent_thread_id, parent_seq)
|
|
145
148
|
VALUES ($1, $2, $3, $4, $5, $6)
|
|
146
149
|
ON CONFLICT (thread_id) DO NOTHING
|
|
147
150
|
RETURNING ${THREAD_COLUMNS}`, [input.threadId, input.analysisId, input.title ?? null, input.type ?? "conversation", input.parentThreadId ?? null, input.parentSeq ?? null])).andThen(({ rows }) => {
|
|
148
151
|
if (rows[0])
|
|
149
|
-
return okAsync(toThread(rows[0]));
|
|
152
|
+
return okAsync({ thread: toThread(rows[0]), inserted: true });
|
|
150
153
|
// Row already existed — ON CONFLICT DO NOTHING returns nothing. Read it
|
|
151
154
|
// back (it may be archived; return it regardless so the caller sees
|
|
152
155
|
// the existing row's identity).
|
|
153
|
-
return tryQuery("thread-store.createThread.readback", () =>
|
|
156
|
+
return tryQuery("thread-store.createThread.readback", () => querier.query(`SELECT ${THREAD_COLUMNS} FROM cortex_analysis_threads WHERE thread_id = $1`, [input.threadId])).map(({ rows: existing }) => ({ thread: toThread(presentFirst(existing, "the thread row read back")), inserted: false }));
|
|
154
157
|
});
|
|
155
158
|
}
|
|
156
159
|
function createThread(input) {
|
|
@@ -289,6 +292,7 @@ export function createThreadStore(pool) {
|
|
|
289
292
|
// `cortex_analysis_threads` either, so the cascade cannot reach it. Its row
|
|
290
293
|
// holds a whole draft document, and a purged thread can never be composed
|
|
291
294
|
// again, so a row left behind is dead weight until the analysis purge runs.
|
|
295
|
+
// The stored results of its authoring calls go with it, for the same reason.
|
|
292
296
|
//
|
|
293
297
|
// Messages go first, and the thread rows go last: the walk every statement
|
|
294
298
|
// shares reads the very rows the last one removes. Thus a thread delete before
|
|
@@ -305,6 +309,8 @@ export function createThreadStore(pool) {
|
|
|
305
309
|
DELETE FROM cortex_thread_turns WHERE thread_id IN (SELECT thread_id FROM subtree)`, [threadId])))
|
|
306
310
|
.andThen(() => tryMutation("thread-store.purgeThread.reportSessionState", () => client.query(`${SUBTREE_CTE}
|
|
307
311
|
DELETE FROM cortex_report_session_state WHERE thread_id IN (SELECT thread_id FROM subtree)`, [threadId])))
|
|
312
|
+
.andThen(() => tryMutation("thread-store.purgeThread.authoringResults", () => client.query(`${SUBTREE_CTE}
|
|
313
|
+
DELETE FROM cortex_authoring_results WHERE thread_id IN (SELECT thread_id FROM subtree)`, [threadId])))
|
|
308
314
|
// A kept text of a run names no thread, thus it stays for the analysis purge.
|
|
309
315
|
.andThen(() => tryMutation("thread-store.purgeThread.toolOutputs", () => client.query(`${SUBTREE_CTE}
|
|
310
316
|
DELETE FROM cortex_tool_outputs WHERE thread_id IN (SELECT thread_id FROM subtree)`, [threadId])))
|
|
@@ -352,7 +358,7 @@ export function createThreadStore(pool) {
|
|
|
352
358
|
return tryQuery("thread-store.listThreads.count", () => pool.query(`SELECT COUNT(*)::text AS count
|
|
353
359
|
FROM cortex_analysis_threads
|
|
354
360
|
WHERE ${scope}`, scopeValues)).andThen((totalResult) => {
|
|
355
|
-
const total = Number(totalResult.rows
|
|
361
|
+
const total = Number(presentFirst(totalResult.rows, "the thread count row").count);
|
|
356
362
|
return tryQuery("thread-store.listThreads.page", () => pool.query(`SELECT ${THREAD_COLUMNS}
|
|
357
363
|
FROM cortex_analysis_threads
|
|
358
364
|
WHERE ${scope}
|
|
@@ -18,10 +18,10 @@ import type { ModelMessage, ToolCallPart, ToolResultPart } from "ai";
|
|
|
18
18
|
export declare const NOT_RUN_TOOL_RESULT = "Not run: the turn ended before this call ran.";
|
|
19
19
|
export declare function notRunResult(call: Pick<ToolCallPart, "toolCallId" | "toolName">): ToolResultPart;
|
|
20
20
|
/** One tool call that {@link answerUnansweredToolCalls} answered, identified for the caller's diagnostic record. */
|
|
21
|
-
export
|
|
21
|
+
export type AnsweredToolCall = {
|
|
22
22
|
readonly toolCallId: string;
|
|
23
23
|
readonly toolName: string;
|
|
24
|
-
}
|
|
24
|
+
};
|
|
25
25
|
/**
|
|
26
26
|
* Answer, in place, every tool call at or past `fromIndex` that has no matching
|
|
27
27
|
* tool result anywhere in `messages`. No message is removed or changed. Returns
|
|
@@ -14,6 +14,7 @@
|
|
|
14
14
|
* because a signed thinking block and the prompt cache both key on the exact
|
|
15
15
|
* prior prefix.
|
|
16
16
|
*/
|
|
17
|
+
import { presentAt } from "../lib/present.js";
|
|
17
18
|
export const NOT_RUN_TOOL_RESULT = "Not run: the turn ended before this call ran.";
|
|
18
19
|
export function notRunResult(call) {
|
|
19
20
|
return {
|
|
@@ -67,14 +68,14 @@ export function answerUnansweredToolCalls(messages, fromIndex = 0) {
|
|
|
67
68
|
// Backward, so an insertion after a message cannot shift an index this walk
|
|
68
69
|
// has yet to visit.
|
|
69
70
|
for (let idx = messages.length - 1; idx >= fromIndex; idx--) {
|
|
70
|
-
const message = messages
|
|
71
|
+
const message = presentAt(messages, idx, "the message at the index");
|
|
71
72
|
if (message.role !== "assistant" || typeof message.content === "string")
|
|
72
73
|
continue;
|
|
73
|
-
const unanswered = message.content.
|
|
74
|
+
const unanswered = message.content.flatMap((part) => part.type === "tool-call" && needsClientResult(part) && !resultIds.has(part.toolCallId) ? [part] : []);
|
|
74
75
|
if (unanswered.length === 0)
|
|
75
76
|
continue;
|
|
76
77
|
let insertAt = idx + 1;
|
|
77
|
-
while (insertAt < messages.length && messages
|
|
78
|
+
while (insertAt < messages.length && presentAt(messages, insertAt, "the message at the insert point").role === "tool")
|
|
78
79
|
insertAt++;
|
|
79
80
|
messages.splice(insertAt, 0, { role: "tool", content: unanswered.map((part) => notRunResult(part)) });
|
|
80
81
|
// Prepended as a batch: the walk visits messages tail-first, but the
|
|
@@ -28,9 +28,9 @@
|
|
|
28
28
|
* list; the run's detail stays retrievable via `inspect_run`.
|
|
29
29
|
*/
|
|
30
30
|
import { type ResultAsync } from "neverthrow";
|
|
31
|
-
import type { Pool } from "pg";
|
|
32
31
|
import { z } from "zod";
|
|
33
|
-
import { type DbError } from "../lib/db-result.js";
|
|
32
|
+
import { type Connectable, type DbError } from "../lib/db-result.js";
|
|
33
|
+
import type { Querier } from "../state/db.js";
|
|
34
34
|
/**
|
|
35
35
|
* The write-time bounds on working memory. `updateSection` enforces them, the
|
|
36
36
|
* `update_working_memory` input schema declares them to the model (importing
|
|
@@ -53,8 +53,8 @@ export declare const constraintSchema: z.ZodObject<{
|
|
|
53
53
|
id: z.ZodString;
|
|
54
54
|
text: z.ZodString;
|
|
55
55
|
origin: z.ZodEnum<{
|
|
56
|
-
user: "user";
|
|
57
56
|
agent: "agent";
|
|
57
|
+
user: "user";
|
|
58
58
|
}>;
|
|
59
59
|
}, z.core.$strip>;
|
|
60
60
|
export type Constraint = z.infer<typeof constraintSchema>;
|
|
@@ -85,8 +85,8 @@ export declare const workingMemorySchema: z.ZodObject<{
|
|
|
85
85
|
id: z.ZodString;
|
|
86
86
|
text: z.ZodString;
|
|
87
87
|
origin: z.ZodEnum<{
|
|
88
|
-
user: "user";
|
|
89
88
|
agent: "agent";
|
|
89
|
+
user: "user";
|
|
90
90
|
}>;
|
|
91
91
|
}, z.core.$strip>>;
|
|
92
92
|
hypotheses: z.ZodArray<z.ZodObject<{
|
|
@@ -107,10 +107,10 @@ export declare function emptyWorkingMemory(): WorkingMemory;
|
|
|
107
107
|
* written for the model and says what to do next (shorten this, retire that).
|
|
108
108
|
* The tool surfaces it as an `is_error` tool result; the row is untouched.
|
|
109
109
|
*/
|
|
110
|
-
export
|
|
110
|
+
export type WorkingMemoryRejection = {
|
|
111
111
|
readonly type: "working_memory_rejected";
|
|
112
112
|
readonly message: string;
|
|
113
|
-
}
|
|
113
|
+
};
|
|
114
114
|
/** `updateSection`'s error channel: a storage failure, or a refused write. */
|
|
115
115
|
export type WorkingMemoryError = DbError | WorkingMemoryRejection;
|
|
116
116
|
/** Narrow a `WorkingMemoryError` to the model-correctable branch. */
|
|
@@ -162,21 +162,21 @@ export type FindingOp = {
|
|
|
162
162
|
readonly id: string;
|
|
163
163
|
};
|
|
164
164
|
/** The `value` argument of `updateSection`, keyed by the `section` name. */
|
|
165
|
-
export
|
|
165
|
+
export type SectionValue = {
|
|
166
166
|
readonly goal: {
|
|
167
167
|
readonly text: string;
|
|
168
168
|
};
|
|
169
169
|
readonly constraint: ConstraintOp;
|
|
170
170
|
readonly hypothesis: ListOp;
|
|
171
171
|
readonly finding: FindingOp;
|
|
172
|
-
}
|
|
172
|
+
};
|
|
173
173
|
export type Section = keyof SectionValue;
|
|
174
174
|
/**
|
|
175
175
|
* The working-memory store. Three methods — `load` reads the structured
|
|
176
176
|
* shape, `updateSection` amends one section, `render` serializes to the
|
|
177
177
|
* Markdown the chat route injects.
|
|
178
178
|
*/
|
|
179
|
-
export
|
|
179
|
+
export type WorkingMemoryStore = {
|
|
180
180
|
/** Read the row; return the empty shape if absent (no lazy insert). */
|
|
181
181
|
load(analysisId: string): ResultAsync<WorkingMemory, DbError>;
|
|
182
182
|
/**
|
|
@@ -184,11 +184,15 @@ export interface WorkingMemoryStore {
|
|
|
184
184
|
* left byte-identical; the row is upserted if absent. A write that breaks a
|
|
185
185
|
* cap or addresses an unknown id is refused — `err(WorkingMemoryRejection)`,
|
|
186
186
|
* and the row is left exactly as it was.
|
|
187
|
+
*
|
|
188
|
+
* `callKey` names the durable step of the call. The edit records it in its
|
|
189
|
+
* own transaction, and an edit whose key is recorded already changes nothing
|
|
190
|
+
* and gives ok. Thus a rerun of the step applies the edit one time.
|
|
187
191
|
*/
|
|
188
|
-
updateSection<S extends Section>(analysisId: string, section: S, value: SectionValue[S]): ResultAsync<void, WorkingMemoryError>;
|
|
192
|
+
updateSection<S extends Section>(analysisId: string, section: S, value: SectionValue[S], callKey?: string): ResultAsync<void, WorkingMemoryError>;
|
|
189
193
|
/** Serialize working memory to a Markdown document for injection. */
|
|
190
194
|
render(analysisId: string): ResultAsync<string, DbError>;
|
|
191
|
-
}
|
|
195
|
+
};
|
|
192
196
|
/**
|
|
193
197
|
* Serialize working memory to the Markdown document of the working-memory context record.
|
|
194
198
|
*
|
|
@@ -212,4 +216,4 @@ export declare function renderWorkingMemory(wm: WorkingMemory): string;
|
|
|
212
216
|
* `cortex_working_memory` table is provisioned by the project's state-init
|
|
213
217
|
* DDL.
|
|
214
218
|
*/
|
|
215
|
-
export declare function createWorkingMemory(pool:
|
|
219
|
+
export declare function createWorkingMemory(pool: Querier & Connectable): WorkingMemoryStore;
|