@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
|
@@ -13,19 +13,21 @@
|
|
|
13
13
|
* reference. Expected outcomes are data variants — never throws on a missing
|
|
14
14
|
* skill, an undeclared skill, or no matches.
|
|
15
15
|
*/
|
|
16
|
-
|
|
16
|
+
import { z } from "zod";
|
|
17
|
+
import { type Tool } from "../define-tool.js";
|
|
18
|
+
export type SkillToolsDeps = {
|
|
17
19
|
/** Absolute path to the skills tree (one subdirectory per skill). */
|
|
18
20
|
readonly skillsDir: string;
|
|
19
21
|
/** The agent's declared skills (`meta.skills`) — the access allowlist. */
|
|
20
22
|
readonly skills: readonly string[];
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
+
};
|
|
24
|
+
type SkillMatch = {
|
|
23
25
|
readonly skill: string;
|
|
24
26
|
readonly path: string;
|
|
25
27
|
readonly line: number;
|
|
26
28
|
readonly snippet: string;
|
|
27
29
|
readonly score: number;
|
|
28
|
-
}
|
|
30
|
+
};
|
|
29
31
|
type SkillSearchOutput = {
|
|
30
32
|
status: "no_skills";
|
|
31
33
|
} | {
|
|
@@ -59,14 +61,16 @@ type SkillReadOutput = {
|
|
|
59
61
|
path: string;
|
|
60
62
|
content: string;
|
|
61
63
|
};
|
|
64
|
+
declare const SkillSearchInputSchema: z.ZodObject<{
|
|
65
|
+
query: z.ZodString;
|
|
66
|
+
topK: z.ZodOptional<z.ZodNumber>;
|
|
67
|
+
}, z.core.$strip>;
|
|
68
|
+
declare const SkillReadInputSchema: z.ZodObject<{
|
|
69
|
+
skill: z.ZodString;
|
|
70
|
+
path: z.ZodString;
|
|
71
|
+
}, z.core.$strip>;
|
|
62
72
|
export declare function createSkillTools(deps: SkillToolsDeps): {
|
|
63
|
-
skillSearch:
|
|
64
|
-
|
|
65
|
-
topK?: number | undefined;
|
|
66
|
-
}, SkillSearchOutput>;
|
|
67
|
-
skillRead: import("../define-tool.js").Tool<{
|
|
68
|
-
skill: string;
|
|
69
|
-
path: string;
|
|
70
|
-
}, SkillReadOutput>;
|
|
73
|
+
skillSearch: Tool<z.infer<typeof SkillSearchInputSchema>, SkillSearchOutput>;
|
|
74
|
+
skillRead: Tool<z.infer<typeof SkillReadInputSchema>, SkillReadOutput>;
|
|
71
75
|
};
|
|
72
76
|
export {};
|
|
@@ -18,12 +18,14 @@ import { join, relative, resolve, sep } from "node:path";
|
|
|
18
18
|
import { ok } from "neverthrow";
|
|
19
19
|
import { z } from "zod";
|
|
20
20
|
import { defineTool } from "../define-tool.js";
|
|
21
|
+
import { collapseWhitespace, splitLines } from "../../lib/text.js";
|
|
21
22
|
/** Bounds — keep a search over a deep skill tree cheap and context-safe. */
|
|
22
23
|
const MAX_FILE_BYTES = 512 * 1024;
|
|
23
24
|
const MAX_SNIPPET = 240;
|
|
24
25
|
const DEFAULT_TOP_K = 10;
|
|
25
26
|
const MAX_TOP_K = 25;
|
|
26
|
-
|
|
27
|
+
/** The file-name extensions a skill may carry text in. */
|
|
28
|
+
const TEXT_EXTENSIONS = [".md", ".markdown", ".txt", ".py", ".r", ".R", ".json", ".yaml", ".yml", ".csv", ".tsv"];
|
|
27
29
|
async function collectTextFiles(dir, acc) {
|
|
28
30
|
let entries;
|
|
29
31
|
try {
|
|
@@ -37,11 +39,19 @@ async function collectTextFiles(dir, acc) {
|
|
|
37
39
|
if (e.isDirectory()) {
|
|
38
40
|
await collectTextFiles(full, acc);
|
|
39
41
|
}
|
|
40
|
-
else if (
|
|
42
|
+
else if (TEXT_EXTENSIONS.some((extension) => e.name.endsWith(extension))) {
|
|
41
43
|
acc.push(full);
|
|
42
44
|
}
|
|
43
45
|
}
|
|
44
46
|
}
|
|
47
|
+
const SkillSearchInputSchema = z.object({
|
|
48
|
+
query: z.string().min(1).describe("Keywords to match (e.g. 'PyDESeq2 contrast syntax')."),
|
|
49
|
+
topK: z.number().int().min(1).max(MAX_TOP_K).optional().describe(`Max results to return. Defaults to ${DEFAULT_TOP_K}.`),
|
|
50
|
+
});
|
|
51
|
+
const SkillReadInputSchema = z.object({
|
|
52
|
+
skill: z.string().min(1).describe("Skill name (one of your declared skills)."),
|
|
53
|
+
path: z.string().min(1).describe("File path within the skill, e.g. 'SKILL.md' or 'references/pydeseq2-api.md'."),
|
|
54
|
+
});
|
|
45
55
|
export function createSkillTools(deps) {
|
|
46
56
|
const allowed = new Set(deps.skills);
|
|
47
57
|
const skillSearch = defineTool({
|
|
@@ -52,16 +62,13 @@ export function createSkillTools(deps) {
|
|
|
52
62
|
"case-insensitive substring. Returns one entry per matching skill file — its skill, its path, " +
|
|
53
63
|
"and the first line that holds a query word — ranked by how many distinct query words the file " +
|
|
54
64
|
"holds. Then `skill_read` the file. No matches returns a data variant.",
|
|
55
|
-
inputSchema:
|
|
56
|
-
query: z.string().min(1).describe("Keywords to match (e.g. 'PyDESeq2 contrast syntax')."),
|
|
57
|
-
topK: z.number().int().min(1).max(MAX_TOP_K).optional().describe(`Max results to return. Defaults to ${DEFAULT_TOP_K}.`),
|
|
58
|
-
}),
|
|
65
|
+
inputSchema: SkillSearchInputSchema,
|
|
59
66
|
describeCall: "none",
|
|
60
67
|
execute: async ({ query, topK }) => {
|
|
61
68
|
if (allowed.size === 0) {
|
|
62
69
|
return ok({ status: "no_skills" });
|
|
63
70
|
}
|
|
64
|
-
const tokens = query.toLowerCase().split(
|
|
71
|
+
const tokens = collapseWhitespace(query.toLowerCase()).split(" ").filter(Boolean);
|
|
65
72
|
const matches = [];
|
|
66
73
|
for (const skill of allowed) {
|
|
67
74
|
const skillRoot = resolve(deps.skillsDir, skill);
|
|
@@ -82,7 +89,7 @@ export function createSkillTools(deps) {
|
|
|
82
89
|
const distinct = tokens.filter((t) => lower.includes(t)).length;
|
|
83
90
|
if (distinct === 0)
|
|
84
91
|
continue;
|
|
85
|
-
const lines = content
|
|
92
|
+
const lines = splitLines(content);
|
|
86
93
|
const hitIdx = lines.findIndex((l) => {
|
|
87
94
|
const ll = l.toLowerCase();
|
|
88
95
|
return tokens.some((t) => ll.includes(t));
|
|
@@ -113,10 +120,7 @@ export function createSkillTools(deps) {
|
|
|
113
120
|
description: "Read a file from one of your skills (e.g. its SKILL.md or a reference " +
|
|
114
121
|
"found via skill_search). Confined to your declared skills. Undeclared " +
|
|
115
122
|
"skills and missing paths return a data variant.",
|
|
116
|
-
inputSchema:
|
|
117
|
-
skill: z.string().min(1).describe("Skill name (one of your declared skills)."),
|
|
118
|
-
path: z.string().min(1).describe("File path within the skill, e.g. 'SKILL.md' or 'references/pydeseq2-api.md'."),
|
|
119
|
-
}),
|
|
123
|
+
inputSchema: SkillReadInputSchema,
|
|
120
124
|
describeCall: "none",
|
|
121
125
|
execute: async ({ skill, path }) => {
|
|
122
126
|
if (!allowed.has(skill)) {
|
|
@@ -10,21 +10,24 @@
|
|
|
10
10
|
* index, so a dropped, reordered, or extra entry can never attach a
|
|
11
11
|
* description to the wrong file.
|
|
12
12
|
*/
|
|
13
|
-
import { type SubmittedFileDescription } from "../../schemas/file-metadata.js";
|
|
14
13
|
import { type Tool } from "../define-tool.js";
|
|
15
14
|
export declare const SUBMIT_FILE_METADATA_TOOL_ID = "submit_file_metadata";
|
|
16
15
|
/**
|
|
17
|
-
* The per-step cell of the file-metadata
|
|
18
|
-
* beside the
|
|
16
|
+
* The per-step cell of the file-metadata follow-up request. The step body makes
|
|
17
|
+
* it beside the step agent, and the agent factory binds the output tool to it.
|
|
18
|
+
* The descriptions themselves live in the inputs of the calls: the post-step
|
|
19
|
+
* code reads them from the recorded calls.
|
|
19
20
|
*/
|
|
20
|
-
export
|
|
21
|
-
/** The paths that the
|
|
21
|
+
export type FileMetadataCell = {
|
|
22
|
+
/** The paths that the follow-up request describes, or `null` before the first `expect`. */
|
|
22
23
|
readonly knownPaths: ReadonlySet<string> | null;
|
|
23
|
-
/** The
|
|
24
|
-
readonly
|
|
25
|
-
/** Arm the cell for one
|
|
24
|
+
/** The known paths that the earlier calls described. The loop folds each call record into it. */
|
|
25
|
+
readonly described: ReadonlySet<string>;
|
|
26
|
+
/** Arm the cell for one follow-up request: set the known paths, and forget each described path. */
|
|
26
27
|
expect(paths: readonly string[]): void;
|
|
27
|
-
|
|
28
|
+
/** Add the paths of one call record. */
|
|
29
|
+
fold(paths: readonly string[]): void;
|
|
30
|
+
};
|
|
28
31
|
export declare function createFileMetadataCell(): FileMetadataCell;
|
|
29
32
|
/** Build the `submit_file_metadata` tool bound to the cell of one step. */
|
|
30
33
|
export declare function createSubmitFileMetadataTool(cell: FileMetadataCell): Tool;
|
|
@@ -12,19 +12,23 @@
|
|
|
12
12
|
*/
|
|
13
13
|
import { err, ok } from "neverthrow";
|
|
14
14
|
import { SubmitFileMetadataInputSchema } from "../../schemas/file-metadata.js";
|
|
15
|
-
import { defineTool } from "../define-tool.js";
|
|
15
|
+
import { defineTool, withToolCallRecord } from "../define-tool.js";
|
|
16
16
|
export const SUBMIT_FILE_METADATA_TOOL_ID = "submit_file_metadata";
|
|
17
17
|
export function createFileMetadataCell() {
|
|
18
18
|
let knownPaths = null;
|
|
19
|
-
const
|
|
19
|
+
const described = new Set();
|
|
20
20
|
return {
|
|
21
21
|
get knownPaths() {
|
|
22
22
|
return knownPaths;
|
|
23
23
|
},
|
|
24
|
-
|
|
24
|
+
described,
|
|
25
25
|
expect(paths) {
|
|
26
26
|
knownPaths = new Set(paths);
|
|
27
|
-
|
|
27
|
+
described.clear();
|
|
28
|
+
},
|
|
29
|
+
fold(paths) {
|
|
30
|
+
for (const path of paths)
|
|
31
|
+
described.add(path);
|
|
28
32
|
},
|
|
29
33
|
};
|
|
30
34
|
}
|
|
@@ -40,28 +44,21 @@ export function createSubmitFileMetadataTool(cell) {
|
|
|
40
44
|
"the unknownPaths and describe the remaining files.",
|
|
41
45
|
inputSchema: SubmitFileMetadataInputSchema,
|
|
42
46
|
describeCall: "none",
|
|
43
|
-
execute:
|
|
47
|
+
execute: (input) => {
|
|
44
48
|
const knownPaths = cell.knownPaths;
|
|
45
49
|
if (knownPaths === null) {
|
|
46
|
-
return err({
|
|
50
|
+
return Promise.resolve(err({
|
|
47
51
|
error: "No list of files is known yet. The harness asks for the file metadata after the task, with the list of the files.",
|
|
48
52
|
retryable: false,
|
|
49
|
-
});
|
|
50
|
-
}
|
|
51
|
-
const unknownPaths = [];
|
|
52
|
-
for (const entry of input.files) {
|
|
53
|
-
if (!knownPaths.has(entry.path)) {
|
|
54
|
-
unknownPaths.push(entry.path);
|
|
55
|
-
continue;
|
|
56
|
-
}
|
|
57
|
-
cell.descriptions.set(entry.path, entry);
|
|
53
|
+
}));
|
|
58
54
|
}
|
|
59
|
-
const
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
});
|
|
55
|
+
const unknownPaths = input.files.map((entry) => entry.path).filter((path) => !knownPaths.has(path));
|
|
56
|
+
const described = input.files.map((entry) => entry.path).filter((path) => knownPaths.has(path));
|
|
57
|
+
const covered = new Set([...cell.described, ...described]);
|
|
58
|
+
const remaining = [...knownPaths].filter((path) => !covered.has(path));
|
|
59
|
+
const outcome = { accepted: unknownPaths.length === 0 && remaining.length === 0, unknownPaths, remaining };
|
|
60
|
+
return Promise.resolve(ok(withToolCallRecord(outcome, { described })));
|
|
65
61
|
},
|
|
62
|
+
foldCallRecord: (record) => cell.fold(record.described),
|
|
66
63
|
});
|
|
67
64
|
}
|
|
@@ -12,17 +12,23 @@
|
|
|
12
12
|
* past the anchor of the newest report child, the tool starts nothing and it
|
|
13
13
|
* names that child. The spawn runs last.
|
|
14
14
|
*
|
|
15
|
+
* Inside a durable step, the child id is the UUIDv5 of the key of the step. A
|
|
16
|
+
* rerun of the call after the spawn, before the checkpoint of the step, finds
|
|
17
|
+
* that child. It skips the advice, and it gives the same session and the same
|
|
18
|
+
* part.
|
|
19
|
+
*
|
|
15
20
|
* Each degraded condition is a typed outcome in the ok channel: a scope with no
|
|
16
21
|
* thread id, a composition with no eyes, the advice, each refusal of the spawn,
|
|
17
22
|
* and a store fault. The tool never throws for one of them.
|
|
18
23
|
*/
|
|
19
|
-
import type {
|
|
24
|
+
import type { Querier } from "../state/db.js";
|
|
20
25
|
import { z } from "zod";
|
|
21
26
|
import type { EnsureSessionStateResult } from "../app/report-session-runtime.js";
|
|
22
27
|
import type { ChromeConfig } from "../lib/chrome.js";
|
|
28
|
+
import { type Connectable } from "../lib/db-result.js";
|
|
23
29
|
import type { AcquireEyes } from "../lib/eyes.js";
|
|
24
30
|
import type { Logger } from "../lib/logger.js";
|
|
25
|
-
import type
|
|
31
|
+
import { type ThreadType } from "../memory/thread-store.js";
|
|
26
32
|
import { type Tool } from "./define-tool.js";
|
|
27
33
|
import type { ProvenanceSeam } from "../provenance/seam.js";
|
|
28
34
|
/**
|
|
@@ -85,8 +91,8 @@ export type StartReportSessionResult = {
|
|
|
85
91
|
* a page. A composition that binds a capture seam straight to the spawn still
|
|
86
92
|
* opens the gate of that spawn.
|
|
87
93
|
*/
|
|
88
|
-
export
|
|
89
|
-
readonly pool:
|
|
94
|
+
export type StartReportSessionToolDeps = {
|
|
95
|
+
readonly pool: Querier & Connectable;
|
|
90
96
|
readonly chrome: ChromeConfig;
|
|
91
97
|
/**
|
|
92
98
|
* The eyes seam of the composition. A bound seam gives a browser for one
|
|
@@ -107,7 +113,9 @@ export interface StartReportSessionToolDeps {
|
|
|
107
113
|
*/
|
|
108
114
|
readonly provenance?: ProvenanceSeam;
|
|
109
115
|
readonly logger?: Logger;
|
|
110
|
-
}
|
|
116
|
+
/** The key of the durable step that runs the call, `undefined` outside one. Defaults to {@link durableStepKey}. */
|
|
117
|
+
readonly stepKey?: () => string | undefined;
|
|
118
|
+
};
|
|
111
119
|
/**
|
|
112
120
|
* Make the tool that starts a report session, over one Postgres pool and the
|
|
113
121
|
* eyes of the composition.
|
|
@@ -12,6 +12,11 @@
|
|
|
12
12
|
* past the anchor of the newest report child, the tool starts nothing and it
|
|
13
13
|
* names that child. The spawn runs last.
|
|
14
14
|
*
|
|
15
|
+
* Inside a durable step, the child id is the UUIDv5 of the key of the step. A
|
|
16
|
+
* rerun of the call after the spawn, before the checkpoint of the step, finds
|
|
17
|
+
* that child. It skips the advice, and it gives the same session and the same
|
|
18
|
+
* part.
|
|
19
|
+
*
|
|
15
20
|
* Each degraded condition is a typed outcome in the ok channel: a scope with no
|
|
16
21
|
* thread id, a composition with no eyes, the advice, each refusal of the spawn,
|
|
17
22
|
* and a store fault. The tool never throws for one of them.
|
|
@@ -21,7 +26,9 @@ import { z } from "zod";
|
|
|
21
26
|
import { compositionHasEyes, createReportSessionSpawn } from "../app/spawn-report-session.js";
|
|
22
27
|
import { createNoopLogger } from "../lib/console-logger.js";
|
|
23
28
|
import { describeDbError } from "../lib/db-result.js";
|
|
29
|
+
import { createThreadStore } from "../memory/thread-store.js";
|
|
24
30
|
import { defineTool } from "./define-tool.js";
|
|
31
|
+
import { durableStepKey, stepUuid } from "./workspace/edit-file.js";
|
|
25
32
|
/**
|
|
26
33
|
* The character bound of each brief field. The whole brief lands in one durable
|
|
27
34
|
* message row, thus the schema holds no unbounded string out of the store.
|
|
@@ -107,12 +114,14 @@ export function createStartReportSessionTool(deps) {
|
|
|
107
114
|
const spawnDeps = {
|
|
108
115
|
pool: deps.pool,
|
|
109
116
|
chrome: deps.chrome,
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
117
|
+
eyes: deps.eyes,
|
|
118
|
+
anchorSession: deps.anchorSession,
|
|
119
|
+
provenance: deps.provenance,
|
|
120
|
+
logger: deps.logger,
|
|
114
121
|
};
|
|
115
122
|
const spawn = createReportSessionSpawn(spawnDeps);
|
|
123
|
+
const threads = createThreadStore(deps.pool);
|
|
124
|
+
const stepKey = deps.stepKey ?? durableStepKey;
|
|
116
125
|
// The gate reads the routes of the very spawn below, thus the two answers
|
|
117
126
|
// come from one value. The routes are fixed at construction, thus the gate
|
|
118
127
|
// reads one boolean and never a live probe of the sidecar.
|
|
@@ -132,7 +141,6 @@ export function createStartReportSessionTool(deps) {
|
|
|
132
141
|
"`no_browser` means that this deployment has no browser for the report agent, thus no report session can start; tell the user. " +
|
|
133
142
|
"`refused`, `parent_not_found`, `parent_not_a_conversation`, and `failed` mean that nothing started, and `detail` gives the reason where there is one.",
|
|
134
143
|
inputSchema: startReportSessionInput,
|
|
135
|
-
executionMode: "inline",
|
|
136
144
|
describeCall: "none",
|
|
137
145
|
execute: async (input, ctx) => {
|
|
138
146
|
const brief = {
|
|
@@ -143,16 +151,35 @@ export function createStartReportSessionTool(deps) {
|
|
|
143
151
|
openQuestions: input.openQuestions,
|
|
144
152
|
};
|
|
145
153
|
const { scope } = ctx.session;
|
|
146
|
-
if (scope.
|
|
154
|
+
if (scope.threadId === undefined || scope.threadId.length === 0) {
|
|
147
155
|
return ok({ outcome: "refused", detail: NO_THREAD_SCOPE_DETAIL });
|
|
148
156
|
}
|
|
149
157
|
const parentThreadId = scope.threadId;
|
|
158
|
+
// Inside a durable step the child id comes from the step, thus a rerun of
|
|
159
|
+
// the call finds the child of its first run. The advice would name that
|
|
160
|
+
// child as an existing session, thus a found child skips the advice, and
|
|
161
|
+
// the spawn gives the child back with no second write.
|
|
162
|
+
const key = stepKey();
|
|
163
|
+
const childThreadId = key === undefined ? undefined : stepUuid(key);
|
|
164
|
+
let rerun = false;
|
|
165
|
+
if (childThreadId !== undefined) {
|
|
166
|
+
const earlier = await threads.getThread(childThreadId);
|
|
167
|
+
if (earlier.isErr()) {
|
|
168
|
+
logger.warn("the child of an earlier run did not read", {
|
|
169
|
+
parentThreadId,
|
|
170
|
+
reason: earlier.error.type,
|
|
171
|
+
...logger.errorFields(earlier.error.cause),
|
|
172
|
+
});
|
|
173
|
+
return ok(toOutcome(earlier.error));
|
|
174
|
+
}
|
|
175
|
+
rerun = earlier.value !== null;
|
|
176
|
+
}
|
|
150
177
|
// The eyes gate has priority over the advice, and the advice costs two
|
|
151
178
|
// reads. The spawn holds the same gate before each read of its own,
|
|
152
179
|
// thus a blind composition reaches the `no_browser` refusal of the
|
|
153
180
|
// spawn with no read and no write. As a result the tool copies no
|
|
154
181
|
// detail line of the spawn.
|
|
155
|
-
if (eyesAvailable) {
|
|
182
|
+
if (eyesAvailable && !rerun) {
|
|
156
183
|
const delta = await spawn.reportSessionDelta(parentThreadId);
|
|
157
184
|
if (delta.isErr()) {
|
|
158
185
|
logger.warn("the report session delta did not read", {
|
|
@@ -172,7 +199,7 @@ export function createStartReportSessionTool(deps) {
|
|
|
172
199
|
return ok({ outcome: "existing-session", threadId: newestChild.threadId, title: newestChild.title });
|
|
173
200
|
}
|
|
174
201
|
}
|
|
175
|
-
const spawned = await spawn.spawnReportSession(parentThreadId, brief);
|
|
202
|
+
const spawned = await spawn.spawnReportSession(parentThreadId, brief, childThreadId);
|
|
176
203
|
if (spawned.isOk()) {
|
|
177
204
|
const child = spawned.value;
|
|
178
205
|
// The part rides the started arm only. The existing-session arm
|
|
@@ -3,9 +3,12 @@
|
|
|
3
3
|
*
|
|
4
4
|
* A terminal call whose text is a placeholder ends a run with nothing. A small
|
|
5
5
|
* model emits such a call when it drafts several calls at once and fills the
|
|
6
|
-
* text later, or never. The
|
|
7
|
-
* and the loop continues with the real work.
|
|
6
|
+
* text later, or never. The input schema of the tool names the fault, the call
|
|
7
|
+
* gets an error result, and the loop continues with the real work.
|
|
8
8
|
*/
|
|
9
|
+
import { z } from "zod";
|
|
9
10
|
export declare const MIN_TERMINAL_TEXT = 4;
|
|
10
11
|
/** The reason a text cannot end a run, or undefined when it can. */
|
|
11
12
|
export declare function degenerateTerminalText(text: string): string | undefined;
|
|
13
|
+
/** The text of a terminal call. The schema refuses a placeholder, and the issue says what to do instead. */
|
|
14
|
+
export declare function terminalTextSchema(description: string): z.ZodString;
|
|
@@ -3,9 +3,11 @@
|
|
|
3
3
|
*
|
|
4
4
|
* A terminal call whose text is a placeholder ends a run with nothing. A small
|
|
5
5
|
* model emits such a call when it drafts several calls at once and fills the
|
|
6
|
-
* text later, or never. The
|
|
7
|
-
* and the loop continues with the real work.
|
|
6
|
+
* text later, or never. The input schema of the tool names the fault, the call
|
|
7
|
+
* gets an error result, and the loop continues with the real work.
|
|
8
8
|
*/
|
|
9
|
+
import { z } from "zod";
|
|
10
|
+
// oxlint-disable-next-line eslint-js/no-restricted-syntax -- the anchored placeholder words and their n/a spellings, at the start of the text; the alternation is the guard's own word list.
|
|
9
11
|
const PLACEHOLDER_TEXT = /^\s*(?:placeholder|todo|tbd|skip|n\/?a|none|null|test|x+|\.+|-+)\b/i;
|
|
10
12
|
export const MIN_TERMINAL_TEXT = 4;
|
|
11
13
|
/** The reason a text cannot end a run, or undefined when it can. */
|
|
@@ -13,7 +15,37 @@ export function degenerateTerminalText(text) {
|
|
|
13
15
|
const trimmed = text.trim();
|
|
14
16
|
if (trimmed.length < MIN_TERMINAL_TEXT)
|
|
15
17
|
return `The text has ${trimmed.length} characters, and a real question or reason has at least ${MIN_TERMINAL_TEXT}.`;
|
|
16
|
-
if (PLACEHOLDER_TEXT.test(trimmed) ||
|
|
18
|
+
if (PLACEHOLDER_TEXT.test(trimmed) || holdsStandaloneWord(trimmed, "placeholder"))
|
|
17
19
|
return "The text is a placeholder.";
|
|
18
20
|
return undefined;
|
|
19
21
|
}
|
|
22
|
+
/** The text of a terminal call. The schema refuses a placeholder, and the issue says what to do instead. */
|
|
23
|
+
export function terminalTextSchema(description) {
|
|
24
|
+
return z
|
|
25
|
+
.string()
|
|
26
|
+
.min(1)
|
|
27
|
+
.check(z.superRefine((text, ctx) => {
|
|
28
|
+
const degenerate = degenerateTerminalText(text);
|
|
29
|
+
if (degenerate !== undefined)
|
|
30
|
+
ctx.addIssue({ code: "custom", message: `${degenerate} Give the real text, or continue the work.` });
|
|
31
|
+
}))
|
|
32
|
+
.describe(description);
|
|
33
|
+
}
|
|
34
|
+
/** Whether `word` occurs in `text` as a standalone word, case-insensitively. */
|
|
35
|
+
function holdsStandaloneWord(text, word) {
|
|
36
|
+
const lower = text.toLowerCase();
|
|
37
|
+
const needle = word.toLowerCase();
|
|
38
|
+
let at = lower.indexOf(needle);
|
|
39
|
+
while (at >= 0) {
|
|
40
|
+
const boundedBefore = at === 0 || !isWordChar(lower.charAt(at - 1));
|
|
41
|
+
const end = at + needle.length;
|
|
42
|
+
const boundedAfter = end >= lower.length || !isWordChar(lower.charAt(end));
|
|
43
|
+
if (boundedBefore && boundedAfter)
|
|
44
|
+
return true;
|
|
45
|
+
at = lower.indexOf(needle, at + 1);
|
|
46
|
+
}
|
|
47
|
+
return false;
|
|
48
|
+
}
|
|
49
|
+
function isWordChar(char) {
|
|
50
|
+
return (char >= "a" && char <= "z") || (char >= "A" && char <= "Z") || (char >= "0" && char <= "9") || char === "_";
|
|
51
|
+
}
|
|
@@ -27,15 +27,15 @@ export declare function decisionRecordPath(scriptFile: string): string;
|
|
|
27
27
|
export declare function decisionRecordPathFor(scriptPath: string): string | undefined;
|
|
28
28
|
export declare function scriptSha256(content: string | Uint8Array): string;
|
|
29
29
|
/** One change of a script after its render, as the record keeps it. */
|
|
30
|
-
export
|
|
30
|
+
export type UnvettedEdit = {
|
|
31
31
|
readonly path: string;
|
|
32
32
|
readonly note: string;
|
|
33
33
|
/** The digest of the script after the change. */
|
|
34
34
|
readonly sha256: string;
|
|
35
|
-
}
|
|
35
|
+
};
|
|
36
36
|
/** The digest the record expects of the script now: the last recorded change, else the bytes the render wrote. */
|
|
37
37
|
export declare function expectedScriptSha256(record: Readonly<Record<string, unknown>>): string | undefined;
|
|
38
|
-
export
|
|
38
|
+
export type NoteScriptChangeArgs = {
|
|
39
39
|
readonly filesystem: WorkspaceFilesystem;
|
|
40
40
|
readonly mutator: WorkspaceMutator;
|
|
41
41
|
readonly session: AgentSession;
|
|
@@ -49,7 +49,7 @@ export interface NoteScriptChangeArgs {
|
|
|
49
49
|
readonly note: string;
|
|
50
50
|
/** The digest of the script after the change. */
|
|
51
51
|
readonly sha256: string;
|
|
52
|
-
}
|
|
52
|
+
};
|
|
53
53
|
/**
|
|
54
54
|
* The outcome of a change note. `noted` carries the record of the write,
|
|
55
55
|
* thus the calling tool carries it as its call record, and its fold hands it
|
|
@@ -11,14 +11,23 @@
|
|
|
11
11
|
*/
|
|
12
12
|
import { createHash } from "node:crypto";
|
|
13
13
|
import { posix as posixPath } from "node:path";
|
|
14
|
+
import { z } from "zod";
|
|
14
15
|
import { unwrapOrThrow } from "../../lib/result.js";
|
|
16
|
+
import { safeParseJsonAs } from "../../lib/parse-json.js";
|
|
17
|
+
import { isUnknownArray } from "../../lib/unknown-array.js";
|
|
18
|
+
import { UnknownRecordSchema } from "../../lib/unknown-containers.js";
|
|
15
19
|
/**
|
|
16
20
|
* The path of the decision record of one rendered script inside the step:
|
|
17
21
|
* `output/decision_record_<script stem>.json`. One record per render, thus a
|
|
18
22
|
* step that renders two scripts keeps both records.
|
|
19
23
|
*/
|
|
20
24
|
export function decisionRecordPath(scriptFile) {
|
|
21
|
-
const
|
|
25
|
+
const dot = scriptFile.lastIndexOf(".");
|
|
26
|
+
const suffix = scriptFile.slice(dot + 1);
|
|
27
|
+
const isSuffixAlnum = dot !== -1 &&
|
|
28
|
+
suffix.length > 0 &&
|
|
29
|
+
Array.from(suffix).every((char) => (char >= "a" && char <= "z") || (char >= "A" && char <= "Z") || (char >= "0" && char <= "9"));
|
|
30
|
+
const stem = isSuffixAlnum ? scriptFile.slice(0, dot) : scriptFile;
|
|
22
31
|
return `output/decision_record_${stem}.json`;
|
|
23
32
|
}
|
|
24
33
|
/**
|
|
@@ -37,12 +46,13 @@ export function decisionRecordPathFor(scriptPath) {
|
|
|
37
46
|
export function scriptSha256(content) {
|
|
38
47
|
return `sha256:${createHash("sha256").update(content).digest("hex")}`;
|
|
39
48
|
}
|
|
49
|
+
const LastEditRecordSchema = z.looseObject({ sha256: z.string() });
|
|
40
50
|
/** The digest the record expects of the script now: the last recorded change, else the bytes the render wrote. */
|
|
41
51
|
export function expectedScriptSha256(record) {
|
|
42
|
-
const edits =
|
|
43
|
-
const
|
|
44
|
-
if (
|
|
45
|
-
return
|
|
52
|
+
const edits = isUnknownArray(record.unvetted_edits) ? record.unvetted_edits : [];
|
|
53
|
+
const parsed = LastEditRecordSchema.safeParse(edits.at(-1));
|
|
54
|
+
if (parsed.success)
|
|
55
|
+
return parsed.data.sha256;
|
|
46
56
|
return typeof record.written_sha256 === "string" ? record.written_sha256 : undefined;
|
|
47
57
|
}
|
|
48
58
|
/**
|
|
@@ -56,20 +66,20 @@ export async function noteScriptChange(args) {
|
|
|
56
66
|
const recordPath = decisionRecordPathFor(args.scriptPath);
|
|
57
67
|
if (!recordPath)
|
|
58
68
|
return { status: "no_record" };
|
|
59
|
-
const read = unwrapOrThrow(await args.filesystem.readFile({ session: args.session, path: recordPath,
|
|
69
|
+
const read = unwrapOrThrow(await args.filesystem.readFile({ session: args.session, path: recordPath, workingDir: args.workingDir }));
|
|
60
70
|
if (read.kind !== "ok")
|
|
61
71
|
return { status: "no_record" };
|
|
62
72
|
let record;
|
|
63
73
|
try {
|
|
64
|
-
const parsed =
|
|
65
|
-
if (parsed
|
|
74
|
+
const parsed = safeParseJsonAs(read.content.toString("utf8"), UnknownRecordSchema);
|
|
75
|
+
if (!parsed.success)
|
|
66
76
|
return { status: "no_record" };
|
|
67
|
-
record = parsed;
|
|
77
|
+
record = parsed.data;
|
|
68
78
|
}
|
|
69
79
|
catch {
|
|
70
80
|
return { status: "no_record" };
|
|
71
81
|
}
|
|
72
|
-
const edits =
|
|
82
|
+
const edits = isUnknownArray(record.unvetted_edits) ? record.unvetted_edits : [];
|
|
73
83
|
const entry = { path: args.scriptPath, note: args.note, sha256: args.sha256 };
|
|
74
84
|
const next = { ...record, unvetted_edits: [...edits, entry] };
|
|
75
85
|
const written = await args.mutator.writeFile({
|
|
@@ -97,10 +107,10 @@ export async function reconcileScriptRecord(args) {
|
|
|
97
107
|
return { status: "no_record" };
|
|
98
108
|
let expected;
|
|
99
109
|
try {
|
|
100
|
-
const parsed =
|
|
101
|
-
if (parsed
|
|
110
|
+
const parsed = safeParseJsonAs(record.content.toString("utf8"), UnknownRecordSchema);
|
|
111
|
+
if (!parsed.success)
|
|
102
112
|
return { status: "no_record" };
|
|
103
|
-
expected = expectedScriptSha256(parsed);
|
|
113
|
+
expected = expectedScriptSha256(parsed.data);
|
|
104
114
|
}
|
|
105
115
|
catch {
|
|
106
116
|
return { status: "no_record" };
|