@inflexa-ai/harness 0.45.1 → 0.46.2
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 +306 -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 +32 -7
- package/dist/lib/hooks.js +22 -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 +160 -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 +39 -0
- package/dist/loop/turn-credentials.js +90 -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/request-headers.js +12 -3
- 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 +62 -0
- package/dist/testing.js +101 -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
|
@@ -26,11 +26,17 @@
|
|
|
26
26
|
* The landing is hardened beyond the lexical resolver: missing parent
|
|
27
27
|
* directories are created only inside the write prefix, the deepest existing
|
|
28
28
|
* ancestor is realpath-checked against the realpath'd prefix (a symlinked
|
|
29
|
-
* ancestor cannot re-aim the write), and
|
|
30
|
-
*
|
|
29
|
+
* ancestor cannot re-aim the write), and a symlinked final component is
|
|
30
|
+
* refused, never followed.
|
|
31
|
+
*
|
|
32
|
+
* The landing is atomic: the bytes go to a temporary file in the target's
|
|
33
|
+
* directory, and a rename puts that file over the target. A reader of the
|
|
34
|
+
* target sees the old file or the new file whole, never a part of one, and a
|
|
35
|
+
* process that dies mid-write leaves the target as it was.
|
|
31
36
|
*/
|
|
37
|
+
import { createHash } from "node:crypto";
|
|
32
38
|
import { constants } from "node:fs";
|
|
33
|
-
import { lstat, mkdir, open, realpath } from "node:fs/promises";
|
|
39
|
+
import { lstat, mkdir, open, realpath, rename, unlink } from "node:fs/promises";
|
|
34
40
|
import { basename, dirname, join as joinPath, relative as relativePath, resolve as resolvePath, sep } from "node:path";
|
|
35
41
|
import { createNoopLogger } from "../../lib/console-logger.js";
|
|
36
42
|
import { computeSha256 } from "../../lib/fs-helpers.js";
|
|
@@ -38,6 +44,13 @@ import { tryFs, tryFsWrite } from "../../lib/fs-result.js";
|
|
|
38
44
|
import { unwrapOrThrow } from "../../lib/result.js";
|
|
39
45
|
import { bindSessionEmit } from "../../provenance/seam.js";
|
|
40
46
|
import { resolveForWrite } from "../../workspace/paths.js";
|
|
47
|
+
/**
|
|
48
|
+
* Agent-visible name of the tool driving a confined write. Rides the write args
|
|
49
|
+
* so a successful write is attributed to the invoking tool in provenance
|
|
50
|
+
* (`inflexa:tool` in the signed document) — the seam records the write without
|
|
51
|
+
* inspecting its caller.
|
|
52
|
+
*/
|
|
53
|
+
export const MUTATE_TOOL_NAMES = ["write_file", "edit_file", "knowledge_template", "execute_command"];
|
|
41
54
|
/**
|
|
42
55
|
* Land `bytes` at `absolute`, hardened against a symlink re-aiming the write.
|
|
43
56
|
* `absolute` is already lexically confined under `prefix` by the resolver;
|
|
@@ -53,14 +66,14 @@ import { resolveForWrite } from "../../workspace/paths.js";
|
|
|
53
66
|
* the created directory and refuse when it lands outside the prefix — a
|
|
54
67
|
* symlink raced into a missing segment between the ancestor check and the
|
|
55
68
|
* recursive mkdir would re-aim the tail of the path.
|
|
56
|
-
* 4. Refuse a symlinked final component (lstat), then
|
|
57
|
-
*
|
|
58
|
-
*
|
|
69
|
+
* 4. Refuse a symlinked final component (lstat), then stage the bytes in a
|
|
70
|
+
* temporary file beside it and rename that file over it. The rename
|
|
71
|
+
* replaces a symlink raced in after the check, and never follows it.
|
|
59
72
|
*
|
|
60
73
|
* Refusals are data; a genuine I/O failure throws (the loop's dispatch catch
|
|
61
|
-
* maps it to an error tool result).
|
|
74
|
+
* maps it to an error tool result). A throw removes the temporary file.
|
|
62
75
|
*/
|
|
63
|
-
async function landBytes(prefix, absolute, bytes) {
|
|
76
|
+
async function landBytes(prefix, absolute, bytes, stagingKey, beforeRename) {
|
|
64
77
|
unwrapOrThrow(await tryFsWrite("mutator.mkdirPrefix", () => mkdir(prefix, { recursive: true }), { path: prefix }));
|
|
65
78
|
const realPrefix = unwrapOrThrow(await tryFs("mutator.realpathPrefix", () => realpath(prefix), { path: prefix }));
|
|
66
79
|
// Deepest existing ancestor of the target. The walk stops at the prefix,
|
|
@@ -85,8 +98,8 @@ async function landBytes(prefix, absolute, bytes) {
|
|
|
85
98
|
// a symlink raced into a missing segment after the ancestor check would
|
|
86
99
|
// re-aim the tail. The canonical path of the created directory exposes
|
|
87
100
|
// it; a directory that vanished before the check is hostile too. The
|
|
88
|
-
//
|
|
89
|
-
// raced segment again.
|
|
101
|
+
// staging below uses the canonical path, so the write never traverses
|
|
102
|
+
// the raced segment again.
|
|
90
103
|
const realTarget = unwrapOrThrow(await tryFs("mutator.realpathTarget", () => realpath(targetDir), { path: targetDir, onAbsent: () => null }));
|
|
91
104
|
if (realTarget === null)
|
|
92
105
|
return "symlink_denied";
|
|
@@ -98,24 +111,54 @@ async function landBytes(prefix, absolute, bytes) {
|
|
|
98
111
|
const finalStat = unwrapOrThrow(await tryFs("mutator.lstatFinal", () => lstat(finalPath), { path: finalPath, onAbsent: () => null }));
|
|
99
112
|
if (finalStat !== null && finalStat.isSymbolicLink())
|
|
100
113
|
return "symlink_denied";
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
const handle = unwrapOrThrow(await tryFsWrite("mutator.open", () => open(finalPath, constants.O_WRONLY | constants.O_CREAT | constants.O_TRUNC | constants.O_NOFOLLOW), {
|
|
104
|
-
path: finalPath,
|
|
105
|
-
}));
|
|
114
|
+
const stagingPath = joinPath(landingDir, stagingNameFor(stagingKey, finalPath));
|
|
115
|
+
let landed = false;
|
|
106
116
|
try {
|
|
107
|
-
|
|
117
|
+
await stageBytes(stagingPath, bytes, finalStat?.isFile() === true ? finalStat.mode : undefined);
|
|
118
|
+
if (beforeRename !== undefined)
|
|
119
|
+
await beforeRename();
|
|
120
|
+
unwrapOrThrow(await tryFsWrite("mutator.rename", () => rename(stagingPath, finalPath), { path: finalPath }));
|
|
121
|
+
landed = true;
|
|
108
122
|
}
|
|
109
123
|
finally {
|
|
110
|
-
|
|
124
|
+
if (!landed)
|
|
125
|
+
await tryFsWrite("mutator.removeStaging", () => unlink(stagingPath), { path: stagingPath }).unwrapOr(undefined);
|
|
111
126
|
}
|
|
112
127
|
return "ok";
|
|
113
128
|
}
|
|
129
|
+
/**
|
|
130
|
+
* The name of the temporary file of one write. A rerun of the same call writes
|
|
131
|
+
* the same name, thus it replaces a file that a dead process left behind.
|
|
132
|
+
*/
|
|
133
|
+
function stagingNameFor(stagingKey, finalPath) {
|
|
134
|
+
return `.${createHash("sha256").update(`${stagingKey}\0${finalPath}`).digest("hex").slice(0, 32)}.tmp`;
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Write `bytes` to the temporary file. The file takes the permission bits of
|
|
138
|
+
* the file that it replaces, thus an edit keeps, for example, the execute bit
|
|
139
|
+
* of a script.
|
|
140
|
+
*/
|
|
141
|
+
async function stageBytes(stagingPath, bytes, replacedMode) {
|
|
142
|
+
// `O_NOFOLLOW` refuses a symlink planted at the staging name (`ELOOP`).
|
|
143
|
+
const handle = unwrapOrThrow(await tryFsWrite("mutator.openStaging", () => open(stagingPath, constants.O_WRONLY | constants.O_CREAT | constants.O_TRUNC | constants.O_NOFOLLOW), {
|
|
144
|
+
path: stagingPath,
|
|
145
|
+
}));
|
|
146
|
+
try {
|
|
147
|
+
unwrapOrThrow(await tryFsWrite("mutator.writeBytes", () => handle.writeFile(bytes), { path: stagingPath }));
|
|
148
|
+
if (replacedMode !== undefined) {
|
|
149
|
+
unwrapOrThrow(await tryFsWrite("mutator.chmodStaging", () => handle.chmod(replacedMode & 0o7777), { path: stagingPath }));
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
finally {
|
|
153
|
+
unwrapOrThrow(await tryFsWrite("mutator.close", () => handle.close(), { path: stagingPath }));
|
|
154
|
+
}
|
|
155
|
+
}
|
|
114
156
|
/**
|
|
115
157
|
* The shared write gauntlet both realizations run: resolve + confine
|
|
116
158
|
* (`resolveForWrite`), then the hardened landing. A refusal comes back as data;
|
|
117
159
|
* an ok carries what the caller's provenance record needs — the
|
|
118
|
-
* analysis-relative path and the exact bytes that landed.
|
|
160
|
+
* analysis-relative path and the exact bytes that landed. `beforeLand` gets
|
|
161
|
+
* the same ok while the bytes wait in the temporary file.
|
|
119
162
|
*/
|
|
120
163
|
async function confinedWrite(args) {
|
|
121
164
|
const scoped = resolveForWrite({
|
|
@@ -135,37 +178,44 @@ async function confinedWrite(args) {
|
|
|
135
178
|
const agentPath = `/${args.analysisId}/${relative}`;
|
|
136
179
|
const bytes = Buffer.from(args.content, "utf8");
|
|
137
180
|
const prefix = resolvePath(args.workingDir);
|
|
138
|
-
const
|
|
181
|
+
const confined = { status: "ok", relative, agentPath, bytes };
|
|
182
|
+
const { beforeLand } = args;
|
|
183
|
+
const landed = await landBytes(prefix, scoped.absolute, bytes, args.invocationId, beforeLand === undefined ? undefined : () => beforeLand(confined));
|
|
139
184
|
if (landed !== "ok")
|
|
140
185
|
return { status: landed };
|
|
141
|
-
return
|
|
186
|
+
return confined;
|
|
142
187
|
}
|
|
143
188
|
export function createWorkspaceMutator(deps) {
|
|
144
189
|
return {
|
|
145
|
-
async writeFile({ path, content, toolName, invocationId }) {
|
|
190
|
+
async writeFile({ path, content, toolName, invocationId, beforeLand }) {
|
|
191
|
+
const landedWrite = (landed) => {
|
|
192
|
+
// `invocationId` is replay-stable: the model turn that minted the tool
|
|
193
|
+
// call is a durably cached step, so a re-execution replays the same id.
|
|
194
|
+
// That is what lets the bridge key a DETERMINISTIC call-activity
|
|
195
|
+
// identifier on it — a wall-clock stamp here would be re-minted per
|
|
196
|
+
// replay and must never reach an identifier or a formal PROV position.
|
|
197
|
+
const record = {
|
|
198
|
+
analysisId: deps.analysisId,
|
|
199
|
+
path: landed.relative,
|
|
200
|
+
hash: computeSha256(landed.bytes),
|
|
201
|
+
size: landed.bytes.length,
|
|
202
|
+
toolName,
|
|
203
|
+
invocationId,
|
|
204
|
+
};
|
|
205
|
+
return { status: "ok", path: landed.agentPath, bytesWritten: landed.bytes.length, record };
|
|
206
|
+
};
|
|
146
207
|
const landed = await confinedWrite({
|
|
147
208
|
workspaceRoot: deps.workspaceRoot,
|
|
148
209
|
analysisId: deps.analysisId,
|
|
149
210
|
workingDir: deps.workingDir,
|
|
150
211
|
path,
|
|
151
212
|
content,
|
|
213
|
+
invocationId,
|
|
214
|
+
beforeLand: beforeLand === undefined ? undefined : (staged) => beforeLand(landedWrite(staged)),
|
|
152
215
|
});
|
|
153
216
|
if (landed.status !== "ok")
|
|
154
217
|
return { status: landed.status, path };
|
|
155
|
-
|
|
156
|
-
// call is a durably cached step, so a re-execution replays the same id.
|
|
157
|
-
// That is what lets the bridge key a DETERMINISTIC call-activity
|
|
158
|
-
// identifier on it — a wall-clock stamp here would be re-minted per
|
|
159
|
-
// replay and must never reach an identifier or a formal PROV position.
|
|
160
|
-
const record = {
|
|
161
|
-
analysisId: deps.analysisId,
|
|
162
|
-
path: landed.relative,
|
|
163
|
-
hash: computeSha256(landed.bytes),
|
|
164
|
-
size: landed.bytes.length,
|
|
165
|
-
toolName,
|
|
166
|
-
invocationId,
|
|
167
|
-
};
|
|
168
|
-
return { status: "ok", path: landed.agentPath, bytesWritten: landed.bytes.length, record };
|
|
218
|
+
return landedWrite(landed);
|
|
169
219
|
},
|
|
170
220
|
recordWrite(record) {
|
|
171
221
|
deps.lineageCollector?.recordFileToolWrite({
|
|
@@ -195,12 +245,21 @@ export function createSessionWorkspaceMutator(deps) {
|
|
|
195
245
|
const logger = (deps.logger ?? createNoopLogger()).named("workspace-mutator");
|
|
196
246
|
const observe = bindSessionEmit(deps.provenance, logger);
|
|
197
247
|
return {
|
|
198
|
-
async writeFile({ path, content, toolName, invocationId, session }) {
|
|
199
|
-
// Only an analysis scope has a workspace tree; under any other
|
|
200
|
-
// scope there is nothing in scope to write.
|
|
248
|
+
async writeFile({ path, content, toolName, invocationId, session, beforeLand }) {
|
|
201
249
|
const scope = session.scope;
|
|
202
|
-
|
|
203
|
-
|
|
250
|
+
const landedWrite = (landed) => {
|
|
251
|
+
const record = {
|
|
252
|
+
analysisId: scope.analysisId,
|
|
253
|
+
path: landed.relative,
|
|
254
|
+
hash: computeSha256(landed.bytes),
|
|
255
|
+
size: landed.bytes.length,
|
|
256
|
+
toolName,
|
|
257
|
+
invocationId,
|
|
258
|
+
};
|
|
259
|
+
if (scope.threadId !== undefined)
|
|
260
|
+
record.threadId = scope.threadId;
|
|
261
|
+
return { status: "ok", path: landed.agentPath, bytesWritten: landed.bytes.length, record };
|
|
262
|
+
};
|
|
204
263
|
// Rejects on an unknown analysis — the loop's dispatch catch maps
|
|
205
264
|
// it to an error tool result, like any unexpected host failure.
|
|
206
265
|
const workspaceRoot = await deps.resolveWorkspaceRoot(scope.analysisId);
|
|
@@ -210,31 +269,26 @@ export function createSessionWorkspaceMutator(deps) {
|
|
|
210
269
|
workingDir: workspaceRoot,
|
|
211
270
|
path,
|
|
212
271
|
content,
|
|
272
|
+
invocationId,
|
|
273
|
+
beforeLand: beforeLand === undefined ? undefined : (staged) => beforeLand(landedWrite(staged)),
|
|
213
274
|
});
|
|
214
275
|
if (landed.status !== "ok")
|
|
215
276
|
return { status: landed.status, path };
|
|
216
|
-
|
|
217
|
-
analysisId: scope.analysisId,
|
|
218
|
-
...(scope.threadId !== undefined ? { threadId: scope.threadId } : {}),
|
|
219
|
-
path: landed.relative,
|
|
220
|
-
hash: computeSha256(landed.bytes),
|
|
221
|
-
size: landed.bytes.length,
|
|
222
|
-
toolName,
|
|
223
|
-
invocationId,
|
|
224
|
-
};
|
|
225
|
-
return { status: "ok", path: landed.agentPath, bytesWritten: landed.bytes.length, record };
|
|
277
|
+
return landedWrite(landed);
|
|
226
278
|
},
|
|
227
279
|
recordWrite(record) {
|
|
228
|
-
|
|
280
|
+
const event = {
|
|
229
281
|
type: "write-file",
|
|
230
282
|
analysisId: record.analysisId,
|
|
231
|
-
...(record.threadId !== undefined ? { threadId: record.threadId } : {}),
|
|
232
283
|
path: record.path,
|
|
233
284
|
hash: record.hash,
|
|
234
285
|
size: record.size,
|
|
235
286
|
tool: record.toolName,
|
|
236
287
|
invocationId: record.invocationId,
|
|
237
|
-
}
|
|
288
|
+
};
|
|
289
|
+
if (record.threadId !== undefined)
|
|
290
|
+
event.threadId = record.threadId;
|
|
291
|
+
observe(event);
|
|
238
292
|
},
|
|
239
293
|
};
|
|
240
294
|
}
|
|
@@ -7,6 +7,8 @@
|
|
|
7
7
|
* oversize read is `truncated`. Only unexpected I/O errors throw; the loop
|
|
8
8
|
* wraps them as `is_error`.
|
|
9
9
|
*/
|
|
10
|
+
import { z } from "zod";
|
|
11
|
+
import { type Tool } from "../define-tool.js";
|
|
10
12
|
import type { WorkspaceFilesystem } from "../../workspace/filesystem.js";
|
|
11
13
|
type ReadFileOutput = {
|
|
12
14
|
status: "invalid_input";
|
|
@@ -36,9 +38,10 @@ type ReadFileOutput = {
|
|
|
36
38
|
mode: "head" | "tail" | "full";
|
|
37
39
|
totalSize?: number;
|
|
38
40
|
};
|
|
39
|
-
|
|
40
|
-
path:
|
|
41
|
-
headLines
|
|
42
|
-
tailLines
|
|
43
|
-
},
|
|
41
|
+
declare const ReadFileInputSchema: z.ZodObject<{
|
|
42
|
+
path: z.ZodString;
|
|
43
|
+
headLines: z.ZodOptional<z.ZodNumber>;
|
|
44
|
+
tailLines: z.ZodOptional<z.ZodNumber>;
|
|
45
|
+
}, z.core.$strip>;
|
|
46
|
+
export declare function createReadFileTool(fs: WorkspaceFilesystem, workingDir?: string): Tool<z.infer<typeof ReadFileInputSchema>, ReadFileOutput>;
|
|
44
47
|
export {};
|
|
@@ -17,13 +17,13 @@
|
|
|
17
17
|
import type { ExecResult } from "../../sandbox/types.js";
|
|
18
18
|
/** Per-stream cap: the maximum of a kept tool output, thus the host gets each stream that the store can keep. */
|
|
19
19
|
export declare const EXEC_STREAM_BYTE_CAP: number;
|
|
20
|
-
export
|
|
20
|
+
export type BoundedStream = {
|
|
21
21
|
readonly content: string;
|
|
22
22
|
readonly truncated: boolean;
|
|
23
23
|
readonly totalLength: number;
|
|
24
24
|
readonly returnedBytes: number;
|
|
25
|
-
}
|
|
26
|
-
export
|
|
25
|
+
};
|
|
26
|
+
export type BoundedExecResult = {
|
|
27
27
|
readonly execId: string;
|
|
28
28
|
readonly exitCode: number | null;
|
|
29
29
|
readonly stdout: string;
|
|
@@ -34,10 +34,10 @@ export interface BoundedExecResult {
|
|
|
34
34
|
readonly stderrTotalLength: number;
|
|
35
35
|
readonly durationMs: number | null;
|
|
36
36
|
readonly timedOut: boolean;
|
|
37
|
-
|
|
37
|
+
syntheticFailure?: {
|
|
38
38
|
readonly reason: string;
|
|
39
39
|
};
|
|
40
|
-
}
|
|
40
|
+
};
|
|
41
41
|
/**
|
|
42
42
|
* Bound an `ExecResult`'s streams while keeping its shape.
|
|
43
43
|
*
|
|
@@ -94,7 +94,7 @@ export function capExecStreams(result, cap = EXEC_STREAM_BYTE_CAP) {
|
|
|
94
94
|
export function boundExecResult(result, cap = EXEC_STREAM_BYTE_CAP) {
|
|
95
95
|
const outStream = boundStream(result.stdout, cap);
|
|
96
96
|
const errStream = boundStream(result.stderr, cap);
|
|
97
|
-
|
|
97
|
+
const bounded = {
|
|
98
98
|
execId: result.execId,
|
|
99
99
|
exitCode: result.exitCode,
|
|
100
100
|
stdout: outStream.content,
|
|
@@ -105,6 +105,8 @@ export function boundExecResult(result, cap = EXEC_STREAM_BYTE_CAP) {
|
|
|
105
105
|
stderrTotalLength: result.stderrTotalBytes ?? errStream.totalLength,
|
|
106
106
|
durationMs: result.durationMs,
|
|
107
107
|
timedOut: result.timedOut,
|
|
108
|
-
...(result.syntheticFailure ? { syntheticFailure: result.syntheticFailure } : {}),
|
|
109
108
|
};
|
|
109
|
+
if (result.syntheticFailure)
|
|
110
|
+
bounded.syntheticFailure = result.syntheticFailure;
|
|
111
|
+
return bounded;
|
|
110
112
|
}
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
import type { SandboxClient } from "../../sandbox/client.js";
|
|
11
11
|
import type { ExecResult, SandboxRef } from "../../sandbox/types.js";
|
|
12
12
|
import type { EmitFn } from "../define-tool.js";
|
|
13
|
-
export
|
|
13
|
+
export type RunExecArgs = {
|
|
14
14
|
readonly sandboxClient: SandboxClient;
|
|
15
15
|
readonly sandbox: SandboxRef;
|
|
16
16
|
readonly command: readonly string[];
|
|
@@ -19,5 +19,5 @@ export interface RunExecArgs {
|
|
|
19
19
|
readonly timeoutSeconds?: number;
|
|
20
20
|
readonly deadlineMs: number;
|
|
21
21
|
readonly emit: EmitFn;
|
|
22
|
-
}
|
|
22
|
+
};
|
|
23
23
|
export declare function runSandboxExec(args: RunExecArgs): Promise<ExecResult>;
|
|
@@ -10,8 +10,8 @@
|
|
|
10
10
|
export function runSandboxExec(args) {
|
|
11
11
|
return args.sandboxClient.exec(args.sandbox, {
|
|
12
12
|
command: args.command,
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
13
|
+
cwd: args.cwd,
|
|
14
|
+
env: args.env,
|
|
15
|
+
timeoutSeconds: args.timeoutSeconds,
|
|
16
16
|
}, (event) => args.emit({ type: "data-sandbox-event", data: { event } }), args.deadlineMs);
|
|
17
17
|
}
|
|
@@ -11,17 +11,19 @@
|
|
|
11
11
|
* prefix-sufficient header readout run in-process over the workspace read seam; only a
|
|
12
12
|
* footer-indexed container reaches into the sandbox (see `input-scan/enrich.ts`).
|
|
13
13
|
*/
|
|
14
|
+
import { z } from "zod";
|
|
14
15
|
import type { SandboxClient } from "../../sandbox/client.js";
|
|
15
16
|
import type { SandboxRef } from "../../sandbox/types.js";
|
|
16
17
|
import type { WorkspaceFilesystem } from "../../workspace/filesystem.js";
|
|
17
|
-
|
|
18
|
+
import { type Tool } from "../define-tool.js";
|
|
19
|
+
export type ScanInputsDeps = {
|
|
18
20
|
readonly workspaceFs: WorkspaceFilesystem;
|
|
19
21
|
readonly analysisId: string;
|
|
20
22
|
/** Omit to skip the container readouts; the prefix readouts run regardless. */
|
|
21
23
|
readonly sandboxClient?: SandboxClient;
|
|
22
24
|
readonly sandbox?: SandboxRef;
|
|
23
25
|
readonly deadlineMs: () => number;
|
|
24
|
-
}
|
|
26
|
+
};
|
|
25
27
|
type ScanInputsOutput = {
|
|
26
28
|
readonly path: string;
|
|
27
29
|
readonly fileCount: number;
|
|
@@ -29,7 +31,8 @@ type ScanInputsOutput = {
|
|
|
29
31
|
/** The rendered manifest — bounded whatever the subtree's size. */
|
|
30
32
|
readonly manifest: string;
|
|
31
33
|
};
|
|
32
|
-
|
|
33
|
-
path:
|
|
34
|
-
},
|
|
34
|
+
declare const ScanInputsInputSchema: z.ZodObject<{
|
|
35
|
+
path: z.ZodString;
|
|
36
|
+
}, z.core.$strip>;
|
|
37
|
+
export declare function createScanInputsTool(deps: ScanInputsDeps): Tool<z.infer<typeof ScanInputsInputSchema>, ScanInputsOutput>;
|
|
35
38
|
export {};
|
|
@@ -15,7 +15,20 @@ import { ok } from "neverthrow";
|
|
|
15
15
|
import { z } from "zod";
|
|
16
16
|
import { enrichShapes } from "../../input-scan/enrich.js";
|
|
17
17
|
import { renderInputScanManifest, scanInputTree } from "../../input-scan/scan.js";
|
|
18
|
+
/** The path without its leading and trailing slashes. */
|
|
19
|
+
function stripEdgeSlashes(value) {
|
|
20
|
+
let start = 0;
|
|
21
|
+
let end = value.length;
|
|
22
|
+
while (start < end && value.charAt(start) === "/")
|
|
23
|
+
start++;
|
|
24
|
+
while (end > start && value.charAt(end - 1) === "/")
|
|
25
|
+
end--;
|
|
26
|
+
return value.slice(start, end);
|
|
27
|
+
}
|
|
18
28
|
import { defineTool } from "../define-tool.js";
|
|
29
|
+
const ScanInputsInputSchema = z.object({
|
|
30
|
+
path: z.string().min(1).describe("Directory to scan, relative to the analysis root (e.g. 'data/inputs' or 'data/inputs/vcf')."),
|
|
31
|
+
});
|
|
19
32
|
export function createScanInputsTool(deps) {
|
|
20
33
|
return defineTool({
|
|
21
34
|
id: "scan_inputs",
|
|
@@ -29,22 +42,21 @@ export function createScanInputsTool(deps) {
|
|
|
29
42
|
"Your briefing already carries a scan of the whole input tree; call this to look at a subtree more closely, " +
|
|
30
43
|
"or to check a grouping you are unsure about. " +
|
|
31
44
|
"It reports observations only: which files are one KIND of data, and what a varying position MEANS, are yours to decide.",
|
|
32
|
-
inputSchema:
|
|
33
|
-
path: z.string().min(1).describe("Directory to scan, relative to the analysis root (e.g. 'data/inputs' or 'data/inputs/vcf')."),
|
|
34
|
-
}),
|
|
45
|
+
inputSchema: ScanInputsInputSchema,
|
|
35
46
|
describeCall: ({ path }) => path,
|
|
36
47
|
execute: async ({ path }, ctx) => {
|
|
37
48
|
const scan = await scanInputTree({
|
|
38
49
|
session: ctx.session,
|
|
39
50
|
fs: deps.workspaceFs,
|
|
40
|
-
root: path
|
|
51
|
+
root: stripEdgeSlashes(path),
|
|
41
52
|
signal: ctx.signal,
|
|
42
53
|
});
|
|
43
54
|
const shapes = await enrichShapes({
|
|
44
55
|
shapes: scan.manifest.shapes,
|
|
45
56
|
session: ctx.session,
|
|
46
57
|
fs: deps.workspaceFs,
|
|
47
|
-
|
|
58
|
+
sandboxClient: deps.sandboxClient,
|
|
59
|
+
sandbox: deps.sandbox,
|
|
48
60
|
mountRoot: `/${deps.analysisId}`,
|
|
49
61
|
deadlineMs: deps.deadlineMs(),
|
|
50
62
|
emit: ctx.emit,
|
|
@@ -21,11 +21,11 @@ type ShowFileOutput = {
|
|
|
21
21
|
id: string;
|
|
22
22
|
};
|
|
23
23
|
export declare const showFileTool: import("../define-tool.js").Tool<{
|
|
24
|
+
title?: string | undefined;
|
|
24
25
|
files: {
|
|
25
26
|
path: string;
|
|
26
27
|
caption?: string | undefined;
|
|
27
28
|
}[];
|
|
28
|
-
title?: string | undefined;
|
|
29
29
|
}, ShowFileOutput>;
|
|
30
30
|
/** Exposed for tests. */
|
|
31
31
|
export declare const __testing: {
|
|
@@ -12,6 +12,7 @@
|
|
|
12
12
|
* live emit and the reconstruct-on-read path produce byte-identical cards.
|
|
13
13
|
*/
|
|
14
14
|
import { ok } from "neverthrow";
|
|
15
|
+
import { presentFirst } from "../../lib/present.js";
|
|
15
16
|
import { z } from "zod";
|
|
16
17
|
import { buildFileReferenceCardData, deriveRunId, fileGroupHash, MAX_FILES } from "../../memory/card-builders.js";
|
|
17
18
|
import { defineTool } from "../define-tool.js";
|
|
@@ -42,7 +43,7 @@ export const showFileTool = defineTool({
|
|
|
42
43
|
"(markdown image syntax pointing at a workspace file does NOT render — this tool is the only way to show one).",
|
|
43
44
|
inputSchema: ShowFileInputSchema,
|
|
44
45
|
// `.min(1)` on `files` makes index 0 total after the parse.
|
|
45
|
-
describeCall: ({ files }) => (files.length === 1 ? files
|
|
46
|
+
describeCall: ({ files }) => (files.length === 1 ? presentFirst(files, "the shown file").path : `${files.length} files`),
|
|
46
47
|
execute: async (input, ctx) => {
|
|
47
48
|
const card = buildFileReferenceCardData(input);
|
|
48
49
|
// A malformed/traversal path yields no card — an expected outcome the model can self-correct
|
|
@@ -8,7 +8,9 @@
|
|
|
8
8
|
* Dependency-bearing: the database `Pool` is captured by the factory
|
|
9
9
|
* (see the harness-durable-runtime spec). The analysis id is read from the request-scoped `Session`.
|
|
10
10
|
*/
|
|
11
|
-
import
|
|
11
|
+
import { z } from "zod";
|
|
12
|
+
import type { PlanRowQuerier } from "../../state/plans.js";
|
|
13
|
+
import { type Tool } from "../define-tool.js";
|
|
12
14
|
type ShowPlanOutput = {
|
|
13
15
|
shown: false;
|
|
14
16
|
reason: "plan_not_found";
|
|
@@ -16,8 +18,9 @@ type ShowPlanOutput = {
|
|
|
16
18
|
shown: true;
|
|
17
19
|
id: string;
|
|
18
20
|
};
|
|
19
|
-
|
|
20
|
-
planId:
|
|
21
|
-
title
|
|
22
|
-
},
|
|
21
|
+
declare const ShowPlanInputSchema: z.ZodObject<{
|
|
22
|
+
planId: z.ZodString;
|
|
23
|
+
title: z.ZodOptional<z.ZodString>;
|
|
24
|
+
}, z.core.$strip>;
|
|
25
|
+
export declare function createShowPlanTool(pool: PlanRowQuerier): Tool<z.infer<typeof ShowPlanInputSchema>, ShowPlanOutput>;
|
|
23
26
|
export {};
|
|
@@ -13,8 +13,15 @@ import { z } from "zod";
|
|
|
13
13
|
import { buildPlanCardData } from "../../memory/card-builders.js";
|
|
14
14
|
import { scopeResource } from "../../auth/types.js";
|
|
15
15
|
import { unwrapOrThrow } from "../../lib/result.js";
|
|
16
|
+
import { PLAN_ID_RE } from "../../contracts/schemas/chat-parts.js";
|
|
16
17
|
import { defineTool } from "../define-tool.js";
|
|
17
|
-
const
|
|
18
|
+
const ShowPlanInputSchema = z.object({
|
|
19
|
+
planId: z
|
|
20
|
+
.string()
|
|
21
|
+
.regex(PLAN_ID_RE, "planId must match pln-<8hex>")
|
|
22
|
+
.describe("Plan ID (`pln-<8hex>`) from `generate_plan` (newly created) or `inspect_run` (each run carries the planId it ran)"),
|
|
23
|
+
title: z.string().optional().describe("Optional card heading; defaults to the plan's own title"),
|
|
24
|
+
});
|
|
18
25
|
export function createShowPlanTool(pool) {
|
|
19
26
|
return defineTool({
|
|
20
27
|
id: "show_plan",
|
|
@@ -25,13 +32,7 @@ export function createShowPlanTool(pool) {
|
|
|
25
32
|
"NOT for a plan you are drafting in conversation (that is `generate_plan`), NOT for other synthesized content " +
|
|
26
33
|
"(`show_user`), NOT for analysis files (`show_file`). Never re-type a plan's steps into a `show_user` markdown " +
|
|
27
34
|
"card — that renders a second, divergent copy of the same plan.",
|
|
28
|
-
inputSchema:
|
|
29
|
-
planId: z
|
|
30
|
-
.string()
|
|
31
|
-
.regex(PLAN_ID_REGEX, "planId must match pln-<8hex>")
|
|
32
|
-
.describe("Plan ID (`pln-<8hex>`) from `generate_plan` (newly created) or `inspect_run` (each run carries the planId it ran)"),
|
|
33
|
-
title: z.string().optional().describe("Optional card heading; defaults to the plan's own title"),
|
|
34
|
-
}),
|
|
35
|
+
inputSchema: ShowPlanInputSchema,
|
|
35
36
|
describeCall: ({ planId }) => planId,
|
|
36
37
|
execute: async ({ planId, title }, ctx) => {
|
|
37
38
|
const resourceId = scopeResource(ctx.session.scope).resourceId;
|
|
@@ -10,8 +10,10 @@
|
|
|
10
10
|
* rows by cosine similarity. "Nothing indexed yet" (the index table does not
|
|
11
11
|
* exist) is an expected outcome — an empty result list, not an error.
|
|
12
12
|
*/
|
|
13
|
-
import type {
|
|
13
|
+
import type { QueryConfig } from "pg";
|
|
14
|
+
import { z } from "zod";
|
|
14
15
|
import type { EmbeddingProvider } from "../../providers/types.js";
|
|
16
|
+
import { type Tool } from "../define-tool.js";
|
|
15
17
|
/**
|
|
16
18
|
* The workspace path a hit addresses, or `undefined` for a pattern entry. Resolved here,
|
|
17
19
|
* once, across every index era — group/dimension/kind entries and previous-era entity
|
|
@@ -20,15 +22,41 @@ import type { EmbeddingProvider } from "../../providers/types.js";
|
|
|
20
22
|
* segment. The consumer branches on presence, nothing else.
|
|
21
23
|
*/
|
|
22
24
|
export declare function fileTargetOf(id: string, metadata: unknown): string | undefined;
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
25
|
+
/** One search-hit row, as the pgvector SELECT returns it. */
|
|
26
|
+
type SearchHitRow = {
|
|
27
|
+
id: string;
|
|
28
|
+
score: number;
|
|
29
|
+
metadata: unknown;
|
|
30
|
+
};
|
|
31
|
+
/** One ranked entry the tool returns: the row plus the workspace path it addresses. */
|
|
32
|
+
type WorkspaceSearchHit = {
|
|
33
|
+
id: string;
|
|
34
|
+
score: number;
|
|
35
|
+
path: string | undefined;
|
|
36
|
+
metadata: unknown;
|
|
37
|
+
};
|
|
38
|
+
type WorkspaceSearchOutput = {
|
|
39
|
+
results: WorkspaceSearchHit[];
|
|
40
|
+
};
|
|
41
|
+
declare const WorkspaceSearchInputSchema: z.ZodObject<{
|
|
42
|
+
query: z.ZodString;
|
|
43
|
+
type: z.ZodOptional<z.ZodEnum<{
|
|
44
|
+
input: "input";
|
|
45
|
+
"input-dimension": "input-dimension";
|
|
46
|
+
"input-group": "input-group";
|
|
47
|
+
"input-kind": "input-kind";
|
|
48
|
+
output: "output";
|
|
49
|
+
summary: "summary";
|
|
50
|
+
synthesis: "synthesis";
|
|
51
|
+
}>>;
|
|
52
|
+
limit: z.ZodDefault<z.ZodNumber>;
|
|
53
|
+
}, z.core.$strip>;
|
|
54
|
+
/** What the workspace search reads of the pool: its one row-reading query. A real `Pool` satisfies it. */
|
|
55
|
+
export type WorkspaceSearchQuerier = {
|
|
56
|
+
query(queryTextOrConfig: string | QueryConfig, values?: unknown[]): Promise<{
|
|
57
|
+
rows: SearchHitRow[];
|
|
58
|
+
rowCount: number | null;
|
|
59
|
+
}>;
|
|
60
|
+
};
|
|
61
|
+
export declare function createWorkspaceSearchTool(pool: WorkspaceSearchQuerier, embedding: EmbeddingProvider): Tool<z.infer<typeof WorkspaceSearchInputSchema>, WorkspaceSearchOutput>;
|
|
62
|
+
export {};
|