@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
|
@@ -12,10 +12,31 @@
|
|
|
12
12
|
* capture-group references, and exactly one of `replace_all=true` or
|
|
13
13
|
* `expected_matches` gates the write. Provenance hashes the post-edit
|
|
14
14
|
* content — the mutator records it through the fold of this tool.
|
|
15
|
+
*
|
|
16
|
+
* Inside a durable step, the edit records its intent before the write lands:
|
|
17
|
+
* the hash of the file before, the hash after, and the result. A rerun of the
|
|
18
|
+
* step after the write, before its checkpoint, finds the file at the hash
|
|
19
|
+
* after and gives back the stored result, thus the edit never applies twice.
|
|
20
|
+
* The file at the hash before applies the edit again, and any other hash is a
|
|
21
|
+
* conflict.
|
|
15
22
|
*/
|
|
16
|
-
import { type
|
|
23
|
+
import { type ResultAsync } from "neverthrow";
|
|
24
|
+
import { z } from "zod";
|
|
25
|
+
import { type Tool, type WithToolCallRecord } from "../define-tool.js";
|
|
26
|
+
import { type DomainError } from "../../lib/result.js";
|
|
17
27
|
import type { WorkspaceFilesystem } from "../../workspace/filesystem.js";
|
|
18
28
|
import type { WorkspaceMutator, WriteFileResult, WriteRecord } from "./mutator.js";
|
|
29
|
+
/** The `ok` outcome of an `edit_file` call. */
|
|
30
|
+
export type EditFileOk = {
|
|
31
|
+
readonly status: "ok";
|
|
32
|
+
readonly path: string;
|
|
33
|
+
readonly replacements: number;
|
|
34
|
+
readonly bytesWritten: number;
|
|
35
|
+
/** Regex mode only: 1-based line numbers where the matches started. */
|
|
36
|
+
lines?: readonly number[];
|
|
37
|
+
/** True when the file is a rendered script and its decision record now lists this edit. */
|
|
38
|
+
decision_record_noted?: true;
|
|
39
|
+
};
|
|
19
40
|
/** Outcome of an `edit_file` call — expected outcomes are data variants, never throws. */
|
|
20
41
|
export type EditFileResult = {
|
|
21
42
|
readonly status: "file_not_found";
|
|
@@ -44,17 +65,34 @@ export type EditFileResult = {
|
|
|
44
65
|
readonly lines: readonly number[];
|
|
45
66
|
} | Exclude<WriteFileResult, {
|
|
46
67
|
status: "ok";
|
|
47
|
-
}> | WithToolCallRecord<
|
|
48
|
-
|
|
68
|
+
}> | WithToolCallRecord<EditFileOk, readonly WriteRecord[]>;
|
|
69
|
+
declare const EditFileInputSchema: z.ZodObject<{
|
|
70
|
+
path: z.ZodString;
|
|
71
|
+
old_string: z.ZodString;
|
|
72
|
+
new_string: z.ZodString;
|
|
73
|
+
replace_all: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
|
|
74
|
+
regex: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
|
|
75
|
+
expected_matches: z.ZodOptional<z.ZodNumber>;
|
|
76
|
+
}, z.core.$strip>;
|
|
77
|
+
/** The intent of one `edit_file` call inside a durable step. */
|
|
78
|
+
export type EditIntent = {
|
|
79
|
+
/** `${workflowId}:${stepId}` of the step that runs the call. */
|
|
80
|
+
readonly key: string;
|
|
81
|
+
readonly analysisId: string;
|
|
82
|
+
/** The `/{analysisId}/…` path of the edited file. */
|
|
49
83
|
readonly path: string;
|
|
50
|
-
readonly
|
|
51
|
-
readonly
|
|
52
|
-
|
|
53
|
-
readonly
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
84
|
+
readonly hashBefore: string;
|
|
85
|
+
readonly hashAfter: string;
|
|
86
|
+
readonly result: EditFileOk;
|
|
87
|
+
readonly callRecord: readonly WriteRecord[];
|
|
88
|
+
};
|
|
89
|
+
/** Keeps the intent of each `edit_file` call that runs inside a durable step. */
|
|
90
|
+
export type EditIntentStore = {
|
|
91
|
+
/** A second put of one key replaces the intent. */
|
|
92
|
+
put(intent: EditIntent): ResultAsync<void, DomainError>;
|
|
93
|
+
get(key: string): ResultAsync<EditIntent | null, DomainError>;
|
|
94
|
+
};
|
|
95
|
+
export type EditFileDeps = {
|
|
58
96
|
readonly mutator: WorkspaceMutator;
|
|
59
97
|
/** Read seam used to fetch current file content for search/replace. */
|
|
60
98
|
readonly workspaceFilesystem: WorkspaceFilesystem;
|
|
@@ -64,12 +102,13 @@ export interface EditFileDeps {
|
|
|
64
102
|
* root, matching the session-scoped mutator's write prefix.
|
|
65
103
|
*/
|
|
66
104
|
readonly workingDir?: string;
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
105
|
+
readonly intents: EditIntentStore;
|
|
106
|
+
/** The key of the durable step that runs the call, `undefined` outside one. Defaults to {@link durableStepKey}. */
|
|
107
|
+
readonly stepKey?: () => string | undefined;
|
|
108
|
+
};
|
|
109
|
+
/** The key of the DBOS step that runs the call, or `undefined` outside a workflow, where nothing reruns. */
|
|
110
|
+
export declare function durableStepKey(): string | undefined;
|
|
111
|
+
/** An id that each run of one durable step gives again: the UUIDv5 of the step key. With no step key, nothing reruns, thus the id is random. */
|
|
112
|
+
export declare function stepUuid(stepKey: string | undefined): string;
|
|
113
|
+
export declare function createEditFileTool(deps: EditFileDeps): Tool<z.infer<typeof EditFileInputSchema>, EditFileResult>;
|
|
114
|
+
export {};
|
|
@@ -12,11 +12,24 @@
|
|
|
12
12
|
* capture-group references, and exactly one of `replace_all=true` or
|
|
13
13
|
* `expected_matches` gates the write. Provenance hashes the post-edit
|
|
14
14
|
* content — the mutator records it through the fold of this tool.
|
|
15
|
+
*
|
|
16
|
+
* Inside a durable step, the edit records its intent before the write lands:
|
|
17
|
+
* the hash of the file before, the hash after, and the result. A rerun of the
|
|
18
|
+
* step after the write, before its checkpoint, finds the file at the hash
|
|
19
|
+
* after and gives back the stored result, thus the edit never applies twice.
|
|
20
|
+
* The file at the hash before applies the edit again, and any other hash is a
|
|
21
|
+
* conflict.
|
|
15
22
|
*/
|
|
16
|
-
import {
|
|
23
|
+
import { DBOS } from "@dbos-inc/dbos-sdk";
|
|
24
|
+
import { createHash, randomUUID } from "node:crypto";
|
|
25
|
+
import { errorMessageOf } from "../../lib/thrown.js";
|
|
26
|
+
import { textOf } from "../../lib/unknown-text.js";
|
|
27
|
+
import { err, ok } from "neverthrow";
|
|
17
28
|
import { z } from "zod";
|
|
18
29
|
import { defineTool, withToolCallRecord } from "../define-tool.js";
|
|
30
|
+
import { computeSha256 } from "../../lib/fs-helpers.js";
|
|
19
31
|
import { unwrapOrThrow } from "../../lib/result.js";
|
|
32
|
+
import { stepExecId } from "../../sandbox/exec.js";
|
|
20
33
|
import { noteScriptChange, scriptSha256 } from "./decision-record.js";
|
|
21
34
|
const EditFileInputSchema = z.object({
|
|
22
35
|
path: z
|
|
@@ -52,6 +65,24 @@ const EditFileInputSchema = z.object({
|
|
|
52
65
|
"mismatch the edit writes nothing and returns the actual count with " +
|
|
53
66
|
"the matching line numbers."),
|
|
54
67
|
});
|
|
68
|
+
/** The key of the DBOS step that runs the call, or `undefined` outside a workflow, where nothing reruns. */
|
|
69
|
+
export function durableStepKey() {
|
|
70
|
+
return DBOS.isInStep() ? stepExecId() : undefined;
|
|
71
|
+
}
|
|
72
|
+
const STEP_UUID_NAMESPACE = "1208d858-ffdc-4f80-acec-32131dad545d";
|
|
73
|
+
/** An id that each run of one durable step gives again: the UUIDv5 of the step key. With no step key, nothing reruns, thus the id is random. */
|
|
74
|
+
export function stepUuid(stepKey) {
|
|
75
|
+
if (stepKey === undefined)
|
|
76
|
+
return randomUUID();
|
|
77
|
+
const hash = createHash("sha1")
|
|
78
|
+
.update(Buffer.from(STEP_UUID_NAMESPACE.replaceAll("-", ""), "hex"))
|
|
79
|
+
.update(stepKey, "utf8")
|
|
80
|
+
.digest();
|
|
81
|
+
hash.writeUInt8((hash.readUInt8(6) & 0x0f) | 0x50, 6);
|
|
82
|
+
hash.writeUInt8((hash.readUInt8(8) & 0x3f) | 0x80, 8);
|
|
83
|
+
const hex = hash.subarray(0, 16).toString("hex");
|
|
84
|
+
return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20)}`;
|
|
85
|
+
}
|
|
55
86
|
function replaceString(content, oldString, newString, replaceAll) {
|
|
56
87
|
if (!content.includes(oldString))
|
|
57
88
|
return { kind: "not_found" };
|
|
@@ -92,10 +123,11 @@ function lineNumbersAt(content, offsets) {
|
|
|
92
123
|
function replaceRegex(content, pattern, replacement, expected) {
|
|
93
124
|
let compiled;
|
|
94
125
|
try {
|
|
126
|
+
// oxlint-disable-next-line eslint-js/no-restricted-syntax -- the caller-supplied match pattern is the tool's input; the dynamic form is the feature, and an invalid pattern is the handled error below.
|
|
95
127
|
compiled = new RegExp(pattern, "gm");
|
|
96
128
|
}
|
|
97
129
|
catch (err) {
|
|
98
|
-
return { kind: "invalid_pattern", error: err
|
|
130
|
+
return { kind: "invalid_pattern", error: errorMessageOf(err) ?? textOf(err) };
|
|
99
131
|
}
|
|
100
132
|
const matches = [...content.matchAll(compiled)];
|
|
101
133
|
if (matches.length === 0)
|
|
@@ -107,6 +139,7 @@ function replaceRegex(content, pattern, replacement, expected) {
|
|
|
107
139
|
return { kind: "ok", content: content.replace(compiled, replacement), replacements: matches.length, lines };
|
|
108
140
|
}
|
|
109
141
|
export function createEditFileTool(deps) {
|
|
142
|
+
const stepKey = deps.stepKey ?? durableStepKey;
|
|
110
143
|
return defineTool({
|
|
111
144
|
id: "edit_file",
|
|
112
145
|
description: "Edit a file in your working directory by replacing specific text. " +
|
|
@@ -121,9 +154,7 @@ export function createEditFileTool(deps) {
|
|
|
121
154
|
inputSchema: EditFileInputSchema,
|
|
122
155
|
// The path only. The replaced text is file content, not a description.
|
|
123
156
|
describeCall: ({ path }) => path,
|
|
124
|
-
execute: async ({ path, old_string, new_string, replace_all, regex, expected_matches }, ctx) => {
|
|
125
|
-
const replaceAll = replace_all === true;
|
|
126
|
-
const useRegex = regex === true;
|
|
157
|
+
execute: async ({ path, old_string, new_string, replace_all: replaceAll, regex: useRegex, expected_matches }, ctx) => {
|
|
127
158
|
if (!useRegex && expected_matches !== undefined) {
|
|
128
159
|
return ok({ status: "invalid_arguments", path, reason: "expected_matches requires regex=true." });
|
|
129
160
|
}
|
|
@@ -137,12 +168,25 @@ export function createEditFileTool(deps) {
|
|
|
137
168
|
const read = unwrapOrThrow(await deps.workspaceFilesystem.readFile({
|
|
138
169
|
session: ctx.session,
|
|
139
170
|
path,
|
|
140
|
-
|
|
171
|
+
workingDir: deps.workingDir,
|
|
141
172
|
}));
|
|
142
173
|
if (read.kind === "not_found")
|
|
143
174
|
return ok({ status: "file_not_found", path });
|
|
144
175
|
if (read.kind === "out_of_scope")
|
|
145
176
|
return ok({ status: "out_of_scope", path });
|
|
177
|
+
const currentHash = computeSha256(read.content);
|
|
178
|
+
const key = stepKey();
|
|
179
|
+
if (key !== undefined) {
|
|
180
|
+
const intent = unwrapOrThrow(await deps.intents.get(key));
|
|
181
|
+
if (intent !== null && currentHash === intent.hashAfter)
|
|
182
|
+
return ok(withToolCallRecord(intent.result, intent.callRecord));
|
|
183
|
+
if (intent !== null && currentHash !== intent.hashBefore) {
|
|
184
|
+
return err({
|
|
185
|
+
error: `The file ${path} changed after an earlier run of this edit, thus the edit was not applied. Read the file again before you edit it.`,
|
|
186
|
+
retryable: false,
|
|
187
|
+
});
|
|
188
|
+
}
|
|
189
|
+
}
|
|
146
190
|
const content = read.content.toString("utf8");
|
|
147
191
|
const replaced = useRegex
|
|
148
192
|
? replaceRegex(content, old_string, new_string, expected_matches)
|
|
@@ -164,12 +208,33 @@ export function createEditFileTool(deps) {
|
|
|
164
208
|
lines: replaced.lines,
|
|
165
209
|
});
|
|
166
210
|
}
|
|
211
|
+
const lines = replaced.lines;
|
|
212
|
+
const resultOf = (landed) => ({
|
|
213
|
+
status: "ok",
|
|
214
|
+
path: landed.path,
|
|
215
|
+
replacements: replaced.replacements,
|
|
216
|
+
bytesWritten: landed.bytesWritten,
|
|
217
|
+
lines,
|
|
218
|
+
});
|
|
219
|
+
const intentOf = (stepKey, landed, result, callRecord) => ({
|
|
220
|
+
key: stepKey,
|
|
221
|
+
analysisId: ctx.session.scope.analysisId,
|
|
222
|
+
path: landed.path,
|
|
223
|
+
hashBefore: currentHash,
|
|
224
|
+
hashAfter: landed.record.hash,
|
|
225
|
+
result,
|
|
226
|
+
callRecord,
|
|
227
|
+
});
|
|
167
228
|
const write = await deps.mutator.writeFile({
|
|
168
229
|
path,
|
|
169
230
|
content: replaced.content,
|
|
170
231
|
toolName: "edit_file",
|
|
171
232
|
invocationId: ctx.invocationId,
|
|
172
233
|
session: ctx.session,
|
|
234
|
+
beforeLand: async (landed) => {
|
|
235
|
+
if (key !== undefined)
|
|
236
|
+
unwrapOrThrow(await deps.intents.put(intentOf(key, landed, resultOf(landed), [landed.record])));
|
|
237
|
+
},
|
|
173
238
|
});
|
|
174
239
|
if (write.status !== "ok")
|
|
175
240
|
return ok(write);
|
|
@@ -179,22 +244,22 @@ export function createEditFileTool(deps) {
|
|
|
179
244
|
filesystem: deps.workspaceFilesystem,
|
|
180
245
|
mutator: deps.mutator,
|
|
181
246
|
session: ctx.session,
|
|
182
|
-
|
|
247
|
+
workingDir: deps.workingDir,
|
|
183
248
|
invocationId: ctx.invocationId,
|
|
184
249
|
toolName: "edit_file",
|
|
185
250
|
scriptPath: path,
|
|
186
251
|
note: `edit_file: ${replaced.replacements} replacement(s)`,
|
|
187
252
|
sha256: scriptSha256(replaced.content),
|
|
188
253
|
});
|
|
189
|
-
const
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
254
|
+
const result = resultOf(write);
|
|
255
|
+
if (noted.status !== "noted")
|
|
256
|
+
return ok(withToolCallRecord(result, [write.record]));
|
|
257
|
+
result.decision_record_noted = true;
|
|
258
|
+
const callRecord = [write.record, noted.write];
|
|
259
|
+
// The first put holds the edit already, thus a failed update costs a rerun only the note of the decision record.
|
|
260
|
+
if (key !== undefined)
|
|
261
|
+
await deps.intents.put(intentOf(key, write, result, callRecord)).unwrapOr(undefined);
|
|
262
|
+
return ok(withToolCallRecord(result, callRecord));
|
|
198
263
|
},
|
|
199
264
|
foldCallRecord: (records) => {
|
|
200
265
|
for (const record of records)
|
|
@@ -25,7 +25,8 @@
|
|
|
25
25
|
* of the bytes that run, thus the record connects the cited decision to the
|
|
26
26
|
* code that ran.
|
|
27
27
|
*/
|
|
28
|
-
import {
|
|
28
|
+
import { z } from "zod";
|
|
29
|
+
import { type Tool, type WithToolCallRecord } from "../define-tool.js";
|
|
29
30
|
import type { SandboxClient } from "../../sandbox/client.js";
|
|
30
31
|
import type { ProvenanceFrame, SandboxRef } from "../../sandbox/types.js";
|
|
31
32
|
import type { ProvenanceCollector } from "../../provenance/collector.js";
|
|
@@ -33,19 +34,25 @@ import type { WorkspaceMutator, WriteRecord } from "./mutator.js";
|
|
|
33
34
|
import { type BoundedExecResult } from "./result-bounds.js";
|
|
34
35
|
import type { WorkspaceFilesystem } from "../../workspace/filesystem.js";
|
|
35
36
|
import type { Logger } from "../../lib/logger.js";
|
|
37
|
+
declare const ExecuteCommandInputSchema: z.ZodObject<{
|
|
38
|
+
command: z.ZodArray<z.ZodString>;
|
|
39
|
+
cwd: z.ZodOptional<z.ZodString>;
|
|
40
|
+
env: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
|
|
41
|
+
timeoutSeconds: z.ZodOptional<z.ZodNumber>;
|
|
42
|
+
}, z.core.$strip>;
|
|
36
43
|
/** What one exec leaves for the lineage collector of the step. */
|
|
37
|
-
|
|
44
|
+
type ExecCallRecord = {
|
|
38
45
|
readonly command: readonly string[];
|
|
39
46
|
readonly exitCode: number | null;
|
|
40
47
|
readonly durationMs: number | null;
|
|
41
|
-
|
|
48
|
+
provenance?: ProvenanceFrame;
|
|
42
49
|
/** The decision-record writes of the script check before the exec, for the mutator. */
|
|
43
|
-
|
|
44
|
-
}
|
|
50
|
+
recordWrites?: readonly WriteRecord[];
|
|
51
|
+
};
|
|
45
52
|
type ExecuteCommandResult = {
|
|
46
53
|
readonly status: "ok";
|
|
47
54
|
} & BoundedExecResult;
|
|
48
|
-
export
|
|
55
|
+
export type ExecuteCommandDeps = {
|
|
49
56
|
/** Operational logging seam; omitted falls back to no-op. */
|
|
50
57
|
readonly logger?: Logger;
|
|
51
58
|
readonly sandboxClient: SandboxClient;
|
|
@@ -75,11 +82,6 @@ export interface ExecuteCommandDeps {
|
|
|
75
82
|
*/
|
|
76
83
|
readonly workspaceFilesystem?: WorkspaceFilesystem;
|
|
77
84
|
readonly mutator?: WorkspaceMutator;
|
|
78
|
-
}
|
|
79
|
-
export declare function createExecuteCommandTool(deps: ExecuteCommandDeps):
|
|
80
|
-
command: string[];
|
|
81
|
-
cwd?: string | undefined;
|
|
82
|
-
env?: Record<string, string> | undefined;
|
|
83
|
-
timeoutSeconds?: number | undefined;
|
|
84
|
-
}, ExecuteCommandResult | WithToolCallRecord<ExecuteCommandResult, ExecCallRecord>>;
|
|
85
|
+
};
|
|
86
|
+
export declare function createExecuteCommandTool(deps: ExecuteCommandDeps): Tool<z.infer<typeof ExecuteCommandInputSchema>, ExecuteCommandResult | WithToolCallRecord<ExecuteCommandResult, ExecCallRecord>>;
|
|
85
87
|
export {};
|
|
@@ -51,10 +51,10 @@ const ExecuteCommandInputSchema = z.object({
|
|
|
51
51
|
timeoutSeconds: z.number().int().positive().optional().describe("Per-command timeout in seconds; capped by the step deadline."),
|
|
52
52
|
});
|
|
53
53
|
/** Extensions that mark an argv token as the thing being run, not a flag or a data path. */
|
|
54
|
-
const SCRIPT_EXTENSIONS =
|
|
54
|
+
const SCRIPT_EXTENSIONS = [".py", ".R", ".r", ".sh", ".js", ".ts", ".ipynb"];
|
|
55
55
|
/** The first script-like token in an argv, or `undefined` when none looks like one. */
|
|
56
56
|
function scriptToken(command) {
|
|
57
|
-
return command.find((arg) => SCRIPT_EXTENSIONS.
|
|
57
|
+
return command.find((arg) => SCRIPT_EXTENSIONS.some((extension) => arg.endsWith(extension)));
|
|
58
58
|
}
|
|
59
59
|
export function createExecuteCommandTool(deps) {
|
|
60
60
|
const { sandboxClient, sandbox, deadlineMs, defaultCwd, lineageCollector, mountRoot } = deps;
|
|
@@ -97,7 +97,7 @@ export function createExecuteCommandTool(deps) {
|
|
|
97
97
|
// command, which is a `/{analysisId}/...` path, thus the workspace filesystem resolves it the same way.
|
|
98
98
|
const recordWrites = [];
|
|
99
99
|
if (deps.workspaceFilesystem && deps.mutator) {
|
|
100
|
-
for (const token of command.filter((arg) => SCRIPT_EXTENSIONS.
|
|
100
|
+
for (const token of command.filter((arg) => SCRIPT_EXTENSIONS.some((extension) => arg.endsWith(extension)))) {
|
|
101
101
|
const noted = await reconcileScriptRecord({
|
|
102
102
|
filesystem: deps.workspaceFilesystem,
|
|
103
103
|
mutator: deps.mutator,
|
|
@@ -115,8 +115,8 @@ export function createExecuteCommandTool(deps) {
|
|
|
115
115
|
sandbox,
|
|
116
116
|
command,
|
|
117
117
|
cwd: effectiveCwd,
|
|
118
|
-
|
|
119
|
-
|
|
118
|
+
env,
|
|
119
|
+
timeoutSeconds,
|
|
120
120
|
deadlineMs: deadlineMs(),
|
|
121
121
|
emit: ctx.emit,
|
|
122
122
|
});
|
|
@@ -127,9 +127,11 @@ export function createExecuteCommandTool(deps) {
|
|
|
127
127
|
command,
|
|
128
128
|
exitCode: result.exitCode,
|
|
129
129
|
durationMs: result.durationMs,
|
|
130
|
-
...(result.provenance ? { provenance: result.provenance } : {}),
|
|
131
|
-
...(recordWrites.length > 0 ? { recordWrites } : {}),
|
|
132
130
|
};
|
|
131
|
+
if (result.provenance)
|
|
132
|
+
record.provenance = result.provenance;
|
|
133
|
+
if (recordWrites.length > 0)
|
|
134
|
+
record.recordWrites = recordWrites;
|
|
133
135
|
return ok(withToolCallRecord(bounded, record));
|
|
134
136
|
},
|
|
135
137
|
// Best-effort: a collector failure must never fail the exec.
|
|
@@ -145,8 +147,8 @@ export function createExecuteCommandTool(deps) {
|
|
|
145
147
|
command: record.command,
|
|
146
148
|
exitCode: record.exitCode,
|
|
147
149
|
durationMs: record.durationMs,
|
|
148
|
-
|
|
149
|
-
|
|
150
|
+
logger: deps.logger,
|
|
151
|
+
provenance: record.provenance,
|
|
150
152
|
});
|
|
151
153
|
}
|
|
152
154
|
catch (err) {
|
|
@@ -5,6 +5,8 @@
|
|
|
5
5
|
* and the optional working directory relative paths resolve against (see the harness-workspace-tools spec).
|
|
6
6
|
* Expected outcomes are data variants — `not_found` / `out_of_scope`.
|
|
7
7
|
*/
|
|
8
|
+
import { z } from "zod";
|
|
9
|
+
import { type Tool } from "../define-tool.js";
|
|
8
10
|
import type { WorkspaceFilesystem } from "../../workspace/filesystem.js";
|
|
9
11
|
type FileStatOutput = {
|
|
10
12
|
status: "ok";
|
|
@@ -18,7 +20,8 @@ type FileStatOutput = {
|
|
|
18
20
|
status: "out_of_scope";
|
|
19
21
|
path: string;
|
|
20
22
|
};
|
|
21
|
-
|
|
22
|
-
path:
|
|
23
|
-
},
|
|
23
|
+
declare const FileStatInputSchema: z.ZodObject<{
|
|
24
|
+
path: z.ZodString;
|
|
25
|
+
}, z.core.$strip>;
|
|
26
|
+
export declare function createFileStatTool(fs: WorkspaceFilesystem, workingDir?: string): Tool<z.infer<typeof FileStatInputSchema>, FileStatOutput>;
|
|
24
27
|
export {};
|
|
@@ -7,12 +7,19 @@
|
|
|
7
7
|
* `truncated` with a marker; missing path → `not_found`; escape attempt →
|
|
8
8
|
* `out_of_scope`. Only unexpected I/O failures throw.
|
|
9
9
|
*/
|
|
10
|
+
import { z } from "zod";
|
|
11
|
+
import { type Tool } from "../define-tool.js";
|
|
10
12
|
import type { ListEntry, WorkspaceFilesystem } from "../../workspace/filesystem.js";
|
|
11
|
-
|
|
13
|
+
declare const GrepInputSchema: z.ZodObject<{
|
|
14
|
+
pattern: z.ZodString;
|
|
15
|
+
path: z.ZodString;
|
|
16
|
+
ignoreCase: z.ZodOptional<z.ZodBoolean>;
|
|
17
|
+
}, z.core.$strip>;
|
|
18
|
+
type Match = {
|
|
12
19
|
readonly file: string;
|
|
13
20
|
readonly line: number;
|
|
14
21
|
readonly preview: string;
|
|
15
|
-
}
|
|
22
|
+
};
|
|
16
23
|
type GrepOutput = {
|
|
17
24
|
status: "invalid_pattern";
|
|
18
25
|
pattern: string;
|
|
@@ -42,11 +49,7 @@ type GrepOutput = {
|
|
|
42
49
|
pattern: string;
|
|
43
50
|
matches: Match[];
|
|
44
51
|
};
|
|
45
|
-
export declare function createGrepTool(fs: WorkspaceFilesystem, workingDir?: string):
|
|
46
|
-
pattern: string;
|
|
47
|
-
path: string;
|
|
48
|
-
ignoreCase?: boolean | undefined;
|
|
49
|
-
}, GrepOutput>;
|
|
52
|
+
export declare function createGrepTool(fs: WorkspaceFilesystem, workingDir?: string): Tool<z.infer<typeof GrepInputSchema>, GrepOutput>;
|
|
50
53
|
/** Exposed for tests — the caps `grep` enforces. */
|
|
51
54
|
export declare const GREP_LIMITS: {
|
|
52
55
|
readonly DEFAULT_MAX_MATCHES: 50;
|
|
@@ -7,8 +7,12 @@
|
|
|
7
7
|
* `truncated` with a marker; missing path → `not_found`; escape attempt →
|
|
8
8
|
* `out_of_scope`. Only unexpected I/O failures throw.
|
|
9
9
|
*/
|
|
10
|
+
import { errorMessageOf } from "../../lib/thrown.js";
|
|
11
|
+
import { textOf } from "../../lib/unknown-text.js";
|
|
10
12
|
import { posix as posixPath } from "node:path";
|
|
11
13
|
import { ok } from "neverthrow";
|
|
14
|
+
import { presentAt } from "../../lib/present.js";
|
|
15
|
+
import { splitLines } from "../../lib/text.js";
|
|
12
16
|
import { z } from "zod";
|
|
13
17
|
import { defineTool } from "../define-tool.js";
|
|
14
18
|
import { unwrapOrThrow } from "../../lib/result.js";
|
|
@@ -46,13 +50,14 @@ export function createGrepTool(fs, workingDir) {
|
|
|
46
50
|
execute: async ({ pattern, path, ignoreCase }, ctx) => {
|
|
47
51
|
let regex;
|
|
48
52
|
try {
|
|
53
|
+
// oxlint-disable-next-line eslint-js/no-restricted-syntax -- the caller-supplied grep pattern is the tool's input; the dynamic form is the feature, and an invalid pattern is the handled error below.
|
|
49
54
|
regex = new RegExp(pattern, ignoreCase === true ? "i" : "");
|
|
50
55
|
}
|
|
51
56
|
catch (err) {
|
|
52
57
|
return ok({
|
|
53
58
|
status: "invalid_pattern",
|
|
54
59
|
pattern,
|
|
55
|
-
error: err
|
|
60
|
+
error: errorMessageOf(err) ?? textOf(err),
|
|
56
61
|
});
|
|
57
62
|
}
|
|
58
63
|
const statResult = unwrapOrThrow(await fs.stat({ session: ctx.session, path, workingDir }));
|
|
@@ -84,13 +89,13 @@ export function createGrepTool(fs, workingDir) {
|
|
|
84
89
|
const text = buf.toString("utf8");
|
|
85
90
|
if (read.kind === "truncated")
|
|
86
91
|
truncated = true;
|
|
87
|
-
const lines = text
|
|
92
|
+
const lines = splitLines(text);
|
|
88
93
|
for (let i = 0; i < lines.length; i++) {
|
|
89
94
|
if (matches.length >= DEFAULT_MAX_MATCHES) {
|
|
90
95
|
truncated = true;
|
|
91
96
|
return;
|
|
92
97
|
}
|
|
93
|
-
const line = lines
|
|
98
|
+
const line = presentAt(lines, i, "the scanned line");
|
|
94
99
|
if (regex.test(line)) {
|
|
95
100
|
matches.push({
|
|
96
101
|
file: filePath,
|
|
@@ -133,6 +138,7 @@ export function createGrepTool(fs, workingDir) {
|
|
|
133
138
|
if (matches.length === 0) {
|
|
134
139
|
return ok({ status: "no_matches", path, pattern });
|
|
135
140
|
}
|
|
141
|
+
// oxlint-disable-next-line no-unnecessary-condition -- tsgolint cannot see the walk/searchFile closures that set truncated; the check is live (it returns the truncated result).
|
|
136
142
|
if (truncated) {
|
|
137
143
|
return ok({
|
|
138
144
|
status: "truncated",
|
|
@@ -6,6 +6,8 @@
|
|
|
6
6
|
* Expected outcomes are data variants — a missing path is `not_found`, a path
|
|
7
7
|
* escaping the analysis tree is `out_of_scope`.
|
|
8
8
|
*/
|
|
9
|
+
import { z } from "zod";
|
|
10
|
+
import { type Tool } from "../define-tool.js";
|
|
9
11
|
import type { ListEntry, WorkspaceFilesystem } from "../../workspace/filesystem.js";
|
|
10
12
|
type ListFilesOutput = {
|
|
11
13
|
status: "ok";
|
|
@@ -18,7 +20,8 @@ type ListFilesOutput = {
|
|
|
18
20
|
status: "out_of_scope";
|
|
19
21
|
path: string;
|
|
20
22
|
};
|
|
21
|
-
|
|
22
|
-
path:
|
|
23
|
-
},
|
|
23
|
+
declare const ListFilesInputSchema: z.ZodObject<{
|
|
24
|
+
path: z.ZodString;
|
|
25
|
+
}, z.core.$strip>;
|
|
26
|
+
export declare function createListFilesTool(fs: WorkspaceFilesystem, workingDir?: string): Tool<z.infer<typeof ListFilesInputSchema>, ListFilesOutput>;
|
|
24
27
|
export {};
|
|
@@ -26,8 +26,13 @@
|
|
|
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
|
*/
|
|
32
37
|
import type { AgentSession } from "../../auth/types.js";
|
|
33
38
|
import type { Logger } from "../../lib/logger.js";
|
|
@@ -54,24 +59,26 @@ export type WriteFileResult = {
|
|
|
54
59
|
* exact bytes on disk, computed at the landing. Plain JSON, because the step
|
|
55
60
|
* cache of the tool call holds it.
|
|
56
61
|
*/
|
|
57
|
-
export
|
|
62
|
+
export type WriteRecord = {
|
|
58
63
|
readonly analysisId: string;
|
|
59
64
|
/** The thread of a session write; absent under a run. */
|
|
60
|
-
|
|
65
|
+
threadId?: string;
|
|
61
66
|
/** Analysis-root-relative, forward-slashed. */
|
|
62
67
|
readonly path: string;
|
|
63
68
|
readonly hash: string;
|
|
64
69
|
readonly size: number;
|
|
65
70
|
readonly toolName: MutateToolName;
|
|
66
71
|
readonly invocationId: string;
|
|
67
|
-
}
|
|
68
|
-
/**
|
|
69
|
-
export type
|
|
72
|
+
};
|
|
73
|
+
/** A write that lands: the result, and the record of the write for `recordWrite`. */
|
|
74
|
+
export type LandedWrite = {
|
|
70
75
|
readonly status: "ok";
|
|
71
76
|
readonly path: string;
|
|
72
77
|
readonly bytesWritten: number;
|
|
73
78
|
readonly record: WriteRecord;
|
|
74
|
-
}
|
|
79
|
+
};
|
|
80
|
+
/** `writeFile` gives back the result, and on success the record of the write for `recordWrite`. */
|
|
81
|
+
export type WriteOutcome = LandedWrite | Exclude<WriteFileResult, {
|
|
75
82
|
status: "ok";
|
|
76
83
|
}>;
|
|
77
84
|
/**
|
|
@@ -80,8 +87,9 @@ export type WriteOutcome = {
|
|
|
80
87
|
* (`inflexa:tool` in the signed document) — the seam records the write without
|
|
81
88
|
* inspecting its caller.
|
|
82
89
|
*/
|
|
83
|
-
export
|
|
84
|
-
export
|
|
90
|
+
export declare const MUTATE_TOOL_NAMES: readonly ["write_file", "edit_file", "knowledge_template", "execute_command"];
|
|
91
|
+
export type MutateToolName = (typeof MUTATE_TOOL_NAMES)[number];
|
|
92
|
+
export type WorkspaceMutatorDeps = {
|
|
85
93
|
/** Absolute host root of this analysis's workspace tree — used by the resolver. */
|
|
86
94
|
readonly workspaceRoot: string;
|
|
87
95
|
readonly analysisId: string;
|
|
@@ -94,8 +102,8 @@ export interface WorkspaceMutatorDeps {
|
|
|
94
102
|
* write itself proceeds unchanged.
|
|
95
103
|
*/
|
|
96
104
|
readonly lineageCollector?: ProvenanceCollector;
|
|
97
|
-
}
|
|
98
|
-
export
|
|
105
|
+
};
|
|
106
|
+
export type WorkspaceMutator = {
|
|
99
107
|
/**
|
|
100
108
|
* Resolve `path` against the working directory (relative) or analysis root
|
|
101
109
|
* (absolute `/{analysisId}/...`), confine the result to the working
|
|
@@ -109,6 +117,10 @@ export interface WorkspaceMutator {
|
|
|
109
117
|
* and its provenance attribution from it.
|
|
110
118
|
*
|
|
111
119
|
* Records nothing: a successful write gives back its record for `recordWrite`.
|
|
120
|
+
*
|
|
121
|
+
* `beforeLand` runs when the new bytes wait in the temporary file and the
|
|
122
|
+
* target is still unchanged. It gets the outcome that the write gives back.
|
|
123
|
+
* A rejection lands nothing, and the write rejects with it.
|
|
112
124
|
*/
|
|
113
125
|
writeFile(args: {
|
|
114
126
|
readonly path: string;
|
|
@@ -116,16 +128,17 @@ export interface WorkspaceMutator {
|
|
|
116
128
|
readonly toolName: MutateToolName;
|
|
117
129
|
readonly invocationId: string;
|
|
118
130
|
readonly session: AgentSession;
|
|
131
|
+
readonly beforeLand?: (write: LandedWrite) => Promise<void>;
|
|
119
132
|
}): Promise<WriteOutcome>;
|
|
120
133
|
/**
|
|
121
134
|
* Record one landed write in provenance. A tool calls it from its call-record
|
|
122
135
|
* fold, thus the record reaches process-local state on each replay too.
|
|
123
136
|
*/
|
|
124
137
|
recordWrite(record: WriteRecord): void;
|
|
125
|
-
}
|
|
138
|
+
};
|
|
126
139
|
export declare function createWorkspaceMutator(deps: WorkspaceMutatorDeps): WorkspaceMutator;
|
|
127
140
|
/** Construction deps of the session-scoped realization — see {@link createSessionWorkspaceMutator}. */
|
|
128
|
-
export
|
|
141
|
+
export type SessionWorkspaceMutatorDeps = {
|
|
129
142
|
/** Workspace-root resolution seam — the write coordinates resolve per call from the session's analysis scope. */
|
|
130
143
|
readonly resolveWorkspaceRoot: ResolveWorkspaceRoot;
|
|
131
144
|
/**
|
|
@@ -137,7 +150,7 @@ export interface SessionWorkspaceMutatorDeps {
|
|
|
137
150
|
*/
|
|
138
151
|
readonly provenance?: ProvenanceSeam;
|
|
139
152
|
readonly logger?: Logger;
|
|
140
|
-
}
|
|
153
|
+
};
|
|
141
154
|
/**
|
|
142
155
|
* The session-scoped `WorkspaceMutator` realization — the conversation agent's
|
|
143
156
|
* write path. Where `createWorkspaceMutator` closes over fixed per-step
|