@inflexa-ai/harness 0.45.0 → 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 +19 -3
- package/dist/agents/conversation-agent.js +49 -30
- 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 +35 -16
- package/dist/agents/sandbox/shared.js +63 -24
- package/dist/agents/sandbox/translational-safety-agent.js +26 -0
- package/dist/agents/sandbox/types.d.ts +26 -3
- 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 +16 -2
- package/dist/agents/sandbox-catalog.js +22 -3
- package/dist/agents/system-prompt.d.ts +2 -2
- package/dist/app/approve-plan.d.ts +5 -2
- package/dist/app/approve-plan.js +1 -1
- 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 +125 -99
- 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 +10 -8
- 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 +46 -22
- package/dist/contracts/chat-events.js +1 -1
- package/dist/contracts/chat-frame.d.ts +15 -5
- package/dist/contracts/chat-frame.js +67 -40
- 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 +3 -3
- 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 +45 -6
- package/dist/contracts/schemas/chat-events.js +16 -0
- package/dist/contracts/schemas/chat-parts.d.ts +214 -102
- package/dist/contracts/schemas/chat-parts.js +50 -7
- package/dist/contracts/schemas/index.d.ts +1 -1
- package/dist/contracts/schemas/index.js +1 -1
- 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 +7 -6
- package/dist/execution/dbos-workflow-purger.js +29 -21
- 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 +39 -17
- package/dist/execution/run-canceler.js +137 -28
- package/dist/execution/run-end-record.d.ts +29 -0
- package/dist/execution/run-end-record.js +27 -0
- 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 +25 -24
- package/dist/index.js +36 -37
- 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 +14 -9
- package/dist/loop/compaction.js +17 -0
- 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 +34 -37
- 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 -6
- package/dist/memory/conversation-display-recorder.js +64 -20
- 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 +66 -24
- package/dist/memory/thread-history.js +212 -79
- 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 +63 -9
- package/dist/prompts/briefing.js +130 -3
- package/dist/prompts/planner.js +13 -2
- 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 +24 -19
- package/dist/provenance/seam.js +7 -5
- package/dist/provenance/types.d.ts +6 -6
- package/dist/providers/ai-sdk.d.ts +113 -62
- package/dist/providers/ai-sdk.js +303 -458
- 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 +59 -92
- package/dist/reference-data/catalog.d.ts +2 -15
- package/dist/reference-data/catalog.js +166 -10
- 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 +209 -231
- 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.d.ts +26 -4
- package/dist/sandbox/image-packages.js +29 -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 +351 -306
- package/dist/schemas/file-metadata.js +2 -4
- package/dist/schemas/plan-schemas.d.ts +79 -25
- package/dist/schemas/plan-schemas.js +1 -1
- 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 +127 -14
- package/dist/schemas/workflow-state.js +56 -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 +47 -18
- package/dist/state/artifacts.js +48 -7
- 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 +5 -5
- package/dist/state/index.js +3 -3
- 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 +70 -25
- package/dist/state/runs.js +127 -64
- 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 +29 -8
- package/dist/state/step-executions.js +28 -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 +11 -9
- package/dist/tools/ad-hoc-router.js +80 -51
- 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 +40 -0
- package/dist/tools/capability-data.js +74 -0
- 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 +54 -17
- package/dist/tools/execute-analysis.js +193 -62
- package/dist/tools/knowledge/check.d.ts +182 -0
- package/dist/tools/knowledge/check.js +94 -0
- package/dist/tools/knowledge/client.d.ts +351 -0
- package/dist/tools/knowledge/client.js +319 -0
- package/dist/tools/knowledge/environment.d.ts +78 -0
- package/dist/tools/knowledge/environment.js +116 -0
- package/dist/tools/knowledge/index.d.ts +49 -0
- package/dist/tools/knowledge/index.js +70 -0
- package/dist/tools/knowledge/local-slots.d.ts +62 -0
- package/dist/tools/knowledge/local-slots.js +184 -0
- package/dist/tools/knowledge/pin.d.ts +14 -0
- package/dist/tools/knowledge/pin.js +17 -0
- package/dist/tools/knowledge/recommend.d.ts +67 -0
- package/dist/tools/knowledge/recommend.js +106 -0
- package/dist/tools/knowledge/situation.d.ts +143 -0
- package/dist/tools/knowledge/situation.js +157 -0
- package/dist/tools/knowledge/skeleton.d.ts +69 -0
- package/dist/tools/knowledge/skeleton.js +201 -0
- package/dist/tools/knowledge/template.d.ts +139 -0
- package/dist/tools/knowledge/template.js +273 -0
- 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 +39 -16
- package/dist/tools/research/generate-plan.js +565 -338
- package/dist/tools/research/guarded-address.d.ts +20 -0
- package/dist/tools/research/guarded-address.js +149 -0
- 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 +40 -0
- package/dist/tools/research/searxng-engine.js +122 -0
- package/dist/tools/research/web-fetch.d.ts +127 -0
- package/dist/tools/research/web-fetch.js +618 -0
- package/dist/tools/research/web-search.d.ts +84 -0
- package/dist/tools/research/web-search.js +117 -0
- 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 +24 -12
- package/dist/tools/sandbox/list-available-packages.js +43 -29
- package/dist/tools/sandbox/list-available-refs.d.ts +38 -14
- package/dist/tools/sandbox/list-available-refs.js +119 -37
- package/dist/tools/sandbox/report-blocker.d.ts +30 -37
- package/dist/tools/sandbox/report-blocker.js +22 -68
- 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 +14 -0
- package/dist/tools/terminal-text.js +51 -0
- package/dist/tools/workspace/decision-record.d.ts +81 -0
- package/dist/tools/workspace/decision-record.js +127 -0
- package/dist/tools/workspace/edit-file.d.ts +59 -18
- package/dist/tools/workspace/edit-file.js +98 -15
- package/dist/tools/workspace/execute-command.d.ts +31 -12
- package/dist/tools/workspace/execute-command.js +37 -8
- 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/index.d.ts +1 -0
- package/dist/tools/workspace/index.js +1 -0
- 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 +100 -76
- package/dist/workflows/execute-analysis.js +380 -247
- package/dist/workflows/pause.d.ts +71 -0
- package/dist/workflows/pause.js +173 -0
- package/dist/workflows/sandbox-step.d.ts +50 -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 +25 -22
- 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 -236
- package/dist/loop/run-agent.js +0 -1110
- 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 -90
- 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
|
@@ -32,6 +32,10 @@ import { join as hostJoin, posix as posixPath } from "node:path";
|
|
|
32
32
|
import { ok } from "neverthrow";
|
|
33
33
|
import { z } from "zod";
|
|
34
34
|
import { capCodePoints, DETAIL_MAX_LENGTH, DETAIL_NEEDLE_MAX_LENGTH } from "../../loop/tool-detail.js";
|
|
35
|
+
import { errnoOf } from "../../lib/fs-result.js";
|
|
36
|
+
import { parseJsonAs } from "../../lib/parse-json.js";
|
|
37
|
+
import { isUnknownArray } from "../../lib/unknown-array.js";
|
|
38
|
+
import { parseUnknownRecord } from "../../lib/unknown-containers.js";
|
|
35
39
|
import { REFERENCE_DATA_CATALOG } from "../../reference-data/catalog.js";
|
|
36
40
|
import { parseReferenceInstallReceipt } from "../../reference-data/receipt.js";
|
|
37
41
|
import { REFS_CONTAINER_PATH } from "../../sandbox/mount-plan.js";
|
|
@@ -158,6 +162,8 @@ async function summarizeDirectory(directory, scanned) {
|
|
|
158
162
|
const stack = [directory];
|
|
159
163
|
while (stack.length > 0 && scanned < MAX_SCANNED_ENTRIES) {
|
|
160
164
|
const current = stack.pop();
|
|
165
|
+
if (current === undefined)
|
|
166
|
+
break;
|
|
161
167
|
const { values, cut } = await cappedEntries(current, MAX_SCANNED_ENTRIES - scanned);
|
|
162
168
|
truncated = truncated || cut;
|
|
163
169
|
const childDirectories = [];
|
|
@@ -196,7 +202,7 @@ async function readReceipts(root) {
|
|
|
196
202
|
// A shared try would abandon the loop and silently drop every receipt sorting
|
|
197
203
|
// after the bad one, quietly stripping metadata from datasets that are fine.
|
|
198
204
|
try {
|
|
199
|
-
receipts.push(
|
|
205
|
+
receipts.push(parseJsonAs(await readFile(hostJoin(receiptsDirectory, entry.name), "utf-8"), z.json()));
|
|
200
206
|
totalBytes += entry.bytes;
|
|
201
207
|
}
|
|
202
208
|
catch {
|
|
@@ -205,6 +211,54 @@ async function readReceipts(root) {
|
|
|
205
211
|
}
|
|
206
212
|
return receipts;
|
|
207
213
|
}
|
|
214
|
+
/**
|
|
215
|
+
* The dataset ids the install receipts of the store report, for a caller that must know whether a
|
|
216
|
+
* declared dataset is present BEFORE a run starts.
|
|
217
|
+
*
|
|
218
|
+
* `undefined` means the store itself could not be answered for: an unreadable root, a `.inflexa`
|
|
219
|
+
* that crosses a symlink, or a receipts directory that exists and cannot be listed. That is NOT an
|
|
220
|
+
* empty install, and a caller must never collapse the two — every dataset would read as absent, and
|
|
221
|
+
* a launch would be refused over data that is sitting in the store.
|
|
222
|
+
*
|
|
223
|
+
* An empty set is a real answer: the store is readable and it holds no receipt.
|
|
224
|
+
*/
|
|
225
|
+
export async function readInstalledDatasetIds(deps) {
|
|
226
|
+
const storeRoot = deps.refStorePath ?? REFS_ROOT;
|
|
227
|
+
try {
|
|
228
|
+
await lstat(storeRoot);
|
|
229
|
+
}
|
|
230
|
+
catch {
|
|
231
|
+
return undefined;
|
|
232
|
+
}
|
|
233
|
+
if (await crossesSymlink(storeRoot, ".inflexa"))
|
|
234
|
+
return undefined;
|
|
235
|
+
const receiptsDirectory = hostJoin(storeRoot, ".inflexa", "receipts");
|
|
236
|
+
let names;
|
|
237
|
+
try {
|
|
238
|
+
names = (await readdir(receiptsDirectory)).slice(0, MAX_RECEIPT_FILES);
|
|
239
|
+
}
|
|
240
|
+
catch (error) {
|
|
241
|
+
// An absent directory is a readable store with nothing installed. Any other failure is the
|
|
242
|
+
// store declining to answer, which is a different fact and gets the honest `undefined`.
|
|
243
|
+
if (errnoOf(error) === "ENOENT")
|
|
244
|
+
return new Set();
|
|
245
|
+
return undefined;
|
|
246
|
+
}
|
|
247
|
+
const ids = new Set();
|
|
248
|
+
for (const name of names) {
|
|
249
|
+
// Per-file, so one malformed receipt costs only its own dataset. A shared try would drop
|
|
250
|
+
// every receipt after the bad one and read as a store that holds almost nothing.
|
|
251
|
+
try {
|
|
252
|
+
const receipt = parseReferenceInstallReceipt(parseJsonAs(await readFile(hostJoin(receiptsDirectory, name), "utf-8"), z.json()));
|
|
253
|
+
if (receipt)
|
|
254
|
+
ids.add(receipt.datasetId);
|
|
255
|
+
}
|
|
256
|
+
catch {
|
|
257
|
+
continue;
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
return ids;
|
|
261
|
+
}
|
|
208
262
|
/** Labels from a `registry.json` an externally-provisioned store may carry. */
|
|
209
263
|
async function readLegacyEntries(root) {
|
|
210
264
|
const legacyEntries = [];
|
|
@@ -214,21 +268,24 @@ async function readLegacyEntries(root) {
|
|
|
214
268
|
const registryPath = hostJoin(root, "registry.json");
|
|
215
269
|
if ((await lstat(registryPath)).size > MAX_REGISTRY_BYTES)
|
|
216
270
|
return [];
|
|
217
|
-
const registry =
|
|
218
|
-
|
|
271
|
+
const registry = parseJsonAs(await readFile(registryPath, "utf-8"), z.json());
|
|
272
|
+
const registryRecord = parseUnknownRecord(registry);
|
|
273
|
+
if (!registryRecord)
|
|
219
274
|
return [];
|
|
220
|
-
const
|
|
221
|
-
|
|
275
|
+
const files = parseUnknownRecord(registryRecord.files);
|
|
276
|
+
const categories = parseUnknownRecord(files?.by_category);
|
|
277
|
+
if (!categories)
|
|
222
278
|
return [];
|
|
223
|
-
for (const category of Object.keys(
|
|
224
|
-
const values =
|
|
225
|
-
if (!
|
|
279
|
+
for (const category of Object.keys(categories).sort()) {
|
|
280
|
+
const values = categories[category];
|
|
281
|
+
if (!isUnknownArray(values))
|
|
226
282
|
continue;
|
|
227
283
|
for (const item of values) {
|
|
228
284
|
if (legacyEntries.length >= MAX_LEGACY_ENTRIES)
|
|
229
285
|
break;
|
|
230
|
-
|
|
231
|
-
|
|
286
|
+
const itemRecord = parseUnknownRecord(item);
|
|
287
|
+
if (itemRecord && typeof itemRecord.local_path === "string") {
|
|
288
|
+
legacyEntries.push({ ...itemRecord, category });
|
|
232
289
|
}
|
|
233
290
|
}
|
|
234
291
|
}
|
|
@@ -253,6 +310,8 @@ async function collectFiles(directory, relative, budget) {
|
|
|
253
310
|
const stack = [{ path: directory, relative }];
|
|
254
311
|
while (stack.length > 0 && budget.scanned < MAX_SCANNED_ENTRIES) {
|
|
255
312
|
const current = stack.pop();
|
|
313
|
+
if (current === undefined)
|
|
314
|
+
break;
|
|
256
315
|
const { values, cut } = await cappedEntries(current.path, MAX_SCANNED_ENTRIES - budget.scanned);
|
|
257
316
|
truncated = truncated || cut;
|
|
258
317
|
for (const child of values) {
|
|
@@ -391,41 +450,55 @@ function enrichEntries(entries, raw) {
|
|
|
391
450
|
// Per-artifact, not per-dataset: format and contents differ between files of the
|
|
392
451
|
// same dataset (a Seurat object and its Annoy index are read nothing alike).
|
|
393
452
|
const catalogArtifact = dataset?.artifacts.find((candidate) => candidate.path === artifact.path);
|
|
394
|
-
|
|
453
|
+
const managedMetadata = {
|
|
395
454
|
datasetId: receipt.datasetId,
|
|
396
455
|
version: receipt.datasetVersion,
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
456
|
+
};
|
|
457
|
+
if (dataset) {
|
|
458
|
+
managedMetadata.title = dataset.title;
|
|
459
|
+
managedMetadata.description = dataset.description;
|
|
460
|
+
managedMetadata.sourceUrl = dataset.sourceUrl;
|
|
461
|
+
managedMetadata.license = dataset.license.url ?? dataset.license.identifier;
|
|
462
|
+
managedMetadata.category = dataset.recommendation.group;
|
|
463
|
+
if (dataset.organism)
|
|
464
|
+
managedMetadata.organism = dataset.organism;
|
|
465
|
+
}
|
|
466
|
+
if (catalogArtifact) {
|
|
467
|
+
managedMetadata.format = catalogArtifact.format;
|
|
468
|
+
managedMetadata.contents = catalogArtifact.contents;
|
|
469
|
+
}
|
|
470
|
+
metadata.set(`${REFS_ROOT}/managed/${receipt.datasetId}/${receipt.datasetVersion}/${artifact.path}`, managedMetadata);
|
|
409
471
|
}
|
|
410
472
|
}
|
|
411
473
|
for (const value of raw.legacyEntries ?? []) {
|
|
412
|
-
|
|
474
|
+
const item = parseUnknownRecord(value);
|
|
475
|
+
if (!item)
|
|
413
476
|
continue;
|
|
414
|
-
const item = value;
|
|
415
477
|
const localPath = stringValue(item.local_path);
|
|
416
478
|
if (!localPath)
|
|
417
479
|
continue;
|
|
418
480
|
const resolved = resolveRequestedPath(localPath);
|
|
419
481
|
if (!resolved.ok)
|
|
420
482
|
continue;
|
|
421
|
-
const
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
483
|
+
const datasetId = stringValue(item.dataset);
|
|
484
|
+
const category = stringValue(item.category);
|
|
485
|
+
const subtype = stringValue(item.subtype);
|
|
486
|
+
const organism = stringValue(item.organism);
|
|
487
|
+
const rows = numberValue(item.rows);
|
|
488
|
+
const endpoint = stringValue(item.endpoint);
|
|
489
|
+
const legacyMetadata = {};
|
|
490
|
+
if (datasetId)
|
|
491
|
+
legacyMetadata.datasetId = datasetId;
|
|
492
|
+
if (category)
|
|
493
|
+
legacyMetadata.category = category;
|
|
494
|
+
if (subtype)
|
|
495
|
+
legacyMetadata.subtype = subtype;
|
|
496
|
+
if (organism)
|
|
497
|
+
legacyMetadata.organism = organism;
|
|
498
|
+
if (rows !== undefined)
|
|
499
|
+
legacyMetadata.rows = rows;
|
|
500
|
+
if (endpoint)
|
|
501
|
+
legacyMetadata.endpoint = endpoint;
|
|
429
502
|
metadata.set(resolved.path, { ...legacyMetadata, ...metadata.get(resolved.path) });
|
|
430
503
|
}
|
|
431
504
|
return entries.map((entry) => {
|
|
@@ -465,8 +538,8 @@ function collectCategories(entries) {
|
|
|
465
538
|
}
|
|
466
539
|
function renderContent(path, scan, entries) {
|
|
467
540
|
if (scan.state === "unavailable")
|
|
468
|
-
return ("No reference store is provisioned. Nothing in the analysis environment can fetch reference data
|
|
469
|
-
"
|
|
541
|
+
return ("No reference store is provisioned for this session. Nothing in the analysis environment can fetch reference data, and a later call " +
|
|
542
|
+
"in this run gives the same answer. Plan with the data at hand, or ask for the reference by what it is.");
|
|
470
543
|
if (scan.state === "not_found")
|
|
471
544
|
return `Reference path does not exist: ${path}`;
|
|
472
545
|
if (scan.state === "not_a_directory")
|
|
@@ -499,6 +572,15 @@ function renderContent(path, scan, entries) {
|
|
|
499
572
|
return lines.join("\n");
|
|
500
573
|
}
|
|
501
574
|
/** Create reference discovery over the host-visible reference store. */
|
|
575
|
+
/**
|
|
576
|
+
* The whole enriched inventory of the store, for a host-side join: which
|
|
577
|
+
* collection a procedure names is present, and where. No envelope bound,
|
|
578
|
+
* because the caller keeps the join and drops the listing.
|
|
579
|
+
*/
|
|
580
|
+
export async function readReferenceInventory(storeRoot) {
|
|
581
|
+
const raw = await scanStore(storeRoot, ".", true);
|
|
582
|
+
return { available: raw.state !== "unavailable", entries: enrichEntries(raw.entries, raw) };
|
|
583
|
+
}
|
|
502
584
|
export function createListAvailableRefsTool(deps) {
|
|
503
585
|
const storeRoot = deps.refStorePath ?? REFS_ROOT;
|
|
504
586
|
return defineTool({
|
|
@@ -516,7 +598,7 @@ export function createListAvailableRefsTool(deps) {
|
|
|
516
598
|
"pass a group label as `query`, because `category` inspects a top-level directory by name and a label that is not a directory reads as `not_found`; " +
|
|
517
599
|
"`limit` caps the entries returned. The response carries `returned`, `total`, and `hasMore`, so truncation is never silent. " +
|
|
518
600
|
"An empty result means the dataset is absent right now — not that it is unobtainable. Say so; never guess a path, and never silently substitute a different dataset. " +
|
|
519
|
-
"The store is provisioned by the host and is NOT frozen: datasets can be added through the host's own provisioning path, and whatever is added shows up
|
|
601
|
+
"The store is provisioned by the host and is NOT frozen: datasets can be added through the host's own provisioning path between runs, and whatever is added shows up in a later run. Within one run the listing does not change, thus one call per question is enough.",
|
|
520
602
|
inputSchema: ListAvailableRefsInputSchema,
|
|
521
603
|
// `execute` resolves `path ?? category` for the subtree it inspects, and
|
|
522
604
|
// it ignores `category` when `path` is present. `query` is an ADDITIVE
|
|
@@ -551,7 +633,7 @@ export function createListAvailableRefsTool(deps) {
|
|
|
551
633
|
// The budget comes off the rendered filter, never off a count of its
|
|
552
634
|
// parts, thus it cannot drift from the template above. One code point
|
|
553
635
|
// pays for the joining space.
|
|
554
|
-
return `${capCodePoints(named, DETAIL_MAX_LENGTH -
|
|
636
|
+
return `${capCodePoints(named, DETAIL_MAX_LENGTH - Array.from(filter).length - 1)} ${filter}`;
|
|
555
637
|
},
|
|
556
638
|
execute: async ({ path, category, query, limit }) => {
|
|
557
639
|
// `category` is shorthand for a top-level path; an explicit `path` wins.
|
|
@@ -10,57 +10,50 @@
|
|
|
10
10
|
* sandbox step agent, the planner (`tools/research/generate-plan.ts`), the
|
|
11
11
|
* run synthesizer (`execution/run-synthesis.ts`) and the analogical reasoner
|
|
12
12
|
* (`tools/research/generate-analogy-report.ts`) — and all four share one id,
|
|
13
|
-
* one input schema and one
|
|
14
|
-
*
|
|
15
|
-
* injects its own `blockedWhen` prose
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
* runs in durable steps, so it reads the blocker back from the transcript
|
|
19
|
-
* (`recordedBlocker`) on replay, not only from its cell.
|
|
13
|
+
* one input schema and one result via `createReportBlockerToolFor`. What
|
|
14
|
+
* differs per loop is only what a blocker *means* there, so each call site
|
|
15
|
+
* injects its own `blockedWhen` prose. The result of the call carries the
|
|
16
|
+
* reason, and the driving body selects the blocker from the recorded calls of
|
|
17
|
+
* the run (`blockerOf`). Thus a replay selects the same blocker.
|
|
20
18
|
*/
|
|
21
|
-
import
|
|
19
|
+
import { z } from "zod";
|
|
20
|
+
import type { LoopStep } from "../../loop/run-loop.js";
|
|
22
21
|
import { type Tool } from "../define-tool.js";
|
|
23
22
|
export declare const REPORT_BLOCKER_TOOL_ID = "report_blocker";
|
|
24
|
-
export
|
|
23
|
+
export type BlockerOutcome = {
|
|
25
24
|
readonly kind: "blocker";
|
|
26
25
|
readonly reason: string;
|
|
27
|
-
}
|
|
28
|
-
/**
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
readonly record: (outcome: BlockerOutcome) => void;
|
|
26
|
+
};
|
|
27
|
+
/** The one input every `report_blocker` takes, wherever it is offered. */
|
|
28
|
+
declare const ReportBlockerInputSchema: z.ZodObject<{
|
|
29
|
+
reason: z.ZodString;
|
|
30
|
+
}, z.core.$strip>;
|
|
31
|
+
/** The result of a call: the blocker that the call recorded. */
|
|
32
|
+
declare const BlockerResultSchema: z.ZodObject<{
|
|
33
|
+
kind: z.ZodLiteral<"blocker">;
|
|
34
|
+
reason: z.ZodString;
|
|
35
|
+
message: z.ZodString;
|
|
36
|
+
}, z.core.$strip>;
|
|
37
|
+
type BlockerResult = z.infer<typeof BlockerResultSchema>;
|
|
38
|
+
export type ReportBlockerDeps = {
|
|
41
39
|
/**
|
|
42
40
|
* What a blocker means in THIS loop: which loop the call ends and the
|
|
43
41
|
* conditions that warrant it. Composed into the shared terminal contract,
|
|
44
42
|
* so a description can never promise a loop this instance does not end.
|
|
45
43
|
*/
|
|
46
44
|
readonly blockedWhen: string;
|
|
47
|
-
}
|
|
45
|
+
};
|
|
48
46
|
/**
|
|
49
47
|
* Build the `report_blocker` tool for one loop. The id, the input schema and
|
|
50
48
|
* the terminal contract ("pass a reason, then stop") are fixed here; the call
|
|
51
|
-
* site supplies only the per-loop meaning
|
|
52
|
-
*/
|
|
53
|
-
export declare function createReportBlockerToolFor(deps: ReportBlockerDeps): Tool;
|
|
54
|
-
/**
|
|
55
|
-
* The blocker that a run recorded, read from its transcript: the reason of the
|
|
56
|
-
* first `report_blocker` call, in call order, whose result is ok.
|
|
57
|
-
*
|
|
58
|
-
* A replay returns each tool step's cached result without re-running
|
|
59
|
-
* `execute`, so the in-memory cell is empty on replay; the transcript is not.
|
|
49
|
+
* site supplies only the per-loop meaning.
|
|
60
50
|
*/
|
|
61
|
-
export declare function
|
|
51
|
+
export declare function createReportBlockerToolFor(deps: ReportBlockerDeps): Tool<z.infer<typeof ReportBlockerInputSchema>, BlockerResult>;
|
|
52
|
+
/** The blocker that a run recorded: the reason of the first `report_blocker` call, in call order, whose result is ok. */
|
|
53
|
+
export declare function blockerOf(steps: readonly LoopStep[]): BlockerOutcome | null;
|
|
62
54
|
/**
|
|
63
|
-
* The sandbox step agent's `report_blocker
|
|
64
|
-
*
|
|
55
|
+
* The sandbox step agent's `report_blocker`. A blocker here ends the step with
|
|
56
|
+
* no deliverables and a blocked reason.
|
|
65
57
|
*/
|
|
66
|
-
export declare function createReportBlockerTool(
|
|
58
|
+
export declare function createReportBlockerTool(): Tool;
|
|
59
|
+
export {};
|
|
@@ -10,34 +10,27 @@
|
|
|
10
10
|
* sandbox step agent, the planner (`tools/research/generate-plan.ts`), the
|
|
11
11
|
* run synthesizer (`execution/run-synthesis.ts`) and the analogical reasoner
|
|
12
12
|
* (`tools/research/generate-analogy-report.ts`) — and all four share one id,
|
|
13
|
-
* one input schema and one
|
|
14
|
-
*
|
|
15
|
-
* injects its own `blockedWhen` prose
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
* runs in durable steps, so it reads the blocker back from the transcript
|
|
19
|
-
* (`recordedBlocker`) on replay, not only from its cell.
|
|
13
|
+
* one input schema and one result via `createReportBlockerToolFor`. What
|
|
14
|
+
* differs per loop is only what a blocker *means* there, so each call site
|
|
15
|
+
* injects its own `blockedWhen` prose. The result of the call carries the
|
|
16
|
+
* reason, and the driving body selects the blocker from the recorded calls of
|
|
17
|
+
* the run (`blockerOf`). Thus a replay selects the same blocker.
|
|
20
18
|
*/
|
|
21
19
|
import { ok } from "neverthrow";
|
|
22
20
|
import { z } from "zod";
|
|
23
|
-
import {
|
|
24
|
-
import { toolOutcomeForOutputType } from "../../loop/tool-outcome.js";
|
|
21
|
+
import { terminalTextSchema } from "../terminal-text.js";
|
|
25
22
|
import { defineTool } from "../define-tool.js";
|
|
26
23
|
export const REPORT_BLOCKER_TOOL_ID = "report_blocker";
|
|
27
|
-
export function createBlockerHolder() {
|
|
28
|
-
return { outcome: null };
|
|
29
|
-
}
|
|
30
24
|
/** The one input every `report_blocker` takes, wherever it is offered. */
|
|
31
25
|
const ReportBlockerInputSchema = z.object({
|
|
32
|
-
reason:
|
|
33
|
-
.string()
|
|
34
|
-
.min(1)
|
|
35
|
-
.describe("What blocks the work, stated as a fact: the missing or unreadable input, or the capability that is not available, and what you tried."),
|
|
26
|
+
reason: terminalTextSchema("What blocks the work, stated as a fact: the missing or unreadable input, or the capability that is not available, and what you tried."),
|
|
36
27
|
});
|
|
28
|
+
/** The result of a call: the blocker that the call recorded. */
|
|
29
|
+
const BlockerResultSchema = z.object({ kind: z.literal("blocker"), reason: z.string(), message: z.string() });
|
|
37
30
|
/**
|
|
38
31
|
* Build the `report_blocker` tool for one loop. The id, the input schema and
|
|
39
32
|
* the terminal contract ("pass a reason, then stop") are fixed here; the call
|
|
40
|
-
* site supplies only the per-loop meaning
|
|
33
|
+
* site supplies only the per-loop meaning.
|
|
41
34
|
*/
|
|
42
35
|
export function createReportBlockerToolFor(deps) {
|
|
43
36
|
return defineTool({
|
|
@@ -45,67 +38,28 @@ export function createReportBlockerToolFor(deps) {
|
|
|
45
38
|
description: `Terminal. ${deps.blockedWhen} Pass a clear reason. Stop immediately after calling — take no further actions.`,
|
|
46
39
|
inputSchema: ReportBlockerInputSchema,
|
|
47
40
|
describeCall: "none",
|
|
48
|
-
execute:
|
|
49
|
-
deps.record({ kind: "blocker", reason: input.reason });
|
|
50
|
-
return ok({
|
|
51
|
-
recorded: true,
|
|
52
|
-
message: "Blocker recorded. You are done — stop now and do not take further actions.",
|
|
53
|
-
});
|
|
54
|
-
},
|
|
41
|
+
execute: (input) => Promise.resolve(ok({ kind: "blocker", reason: input.reason, message: "Blocker recorded. You are done — stop now and do not take further actions." })),
|
|
55
42
|
});
|
|
56
43
|
}
|
|
57
|
-
/**
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
* `execute`, so the in-memory cell is empty on replay; the transcript is not.
|
|
63
|
-
*/
|
|
64
|
-
export function recordedBlocker(messages) {
|
|
65
|
-
const recorded = new Set();
|
|
66
|
-
for (const message of messages) {
|
|
67
|
-
if (message.role !== "tool")
|
|
68
|
-
continue;
|
|
69
|
-
for (const part of message.content) {
|
|
70
|
-
if (part.type === "tool-result" && part.toolName === REPORT_BLOCKER_TOOL_ID && toolOutcomeForOutputType(part.output.type) === "ok") {
|
|
71
|
-
recorded.add(part.toolCallId);
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
for (const message of messages) {
|
|
76
|
-
if (message.role !== "assistant" || typeof message.content === "string")
|
|
77
|
-
continue;
|
|
78
|
-
for (const part of message.content) {
|
|
79
|
-
if (part.type !== "tool-call" || part.toolName !== REPORT_BLOCKER_TOOL_ID || !recorded.has(part.toolCallId))
|
|
44
|
+
/** The blocker that a run recorded: the reason of the first `report_blocker` call, in call order, whose result is ok. */
|
|
45
|
+
export function blockerOf(steps) {
|
|
46
|
+
for (const step of steps) {
|
|
47
|
+
for (const call of step.calls) {
|
|
48
|
+
if (call.toolName !== REPORT_BLOCKER_TOOL_ID || call.output?.outcome !== "ok")
|
|
80
49
|
continue;
|
|
81
|
-
const
|
|
82
|
-
if (
|
|
83
|
-
return { kind: "blocker", reason };
|
|
50
|
+
const result = BlockerResultSchema.safeParse(call.output.value);
|
|
51
|
+
if (result.success)
|
|
52
|
+
return { kind: "blocker", reason: result.data.reason };
|
|
84
53
|
}
|
|
85
54
|
}
|
|
86
55
|
return null;
|
|
87
56
|
}
|
|
88
|
-
/** The reason of a `report_blocker` input, validated as the dispatch validates it. */
|
|
89
|
-
function blockerReason(input) {
|
|
90
|
-
const parsed = ReportBlockerInputSchema.safeParse(input);
|
|
91
|
-
if (parsed.success)
|
|
92
|
-
return parsed.data.reason;
|
|
93
|
-
const repaired = repairToolInput(input, parsed.error);
|
|
94
|
-
if (repaired === undefined)
|
|
95
|
-
return undefined;
|
|
96
|
-
const reparsed = ReportBlockerInputSchema.safeParse(repaired);
|
|
97
|
-
return reparsed.success ? reparsed.data.reason : undefined;
|
|
98
|
-
}
|
|
99
57
|
/**
|
|
100
|
-
* The sandbox step agent's `report_blocker
|
|
101
|
-
*
|
|
58
|
+
* The sandbox step agent's `report_blocker`. A blocker here ends the step with
|
|
59
|
+
* no deliverables and a blocked reason.
|
|
102
60
|
*/
|
|
103
|
-
export function createReportBlockerTool(
|
|
61
|
+
export function createReportBlockerTool() {
|
|
104
62
|
return createReportBlockerToolFor({
|
|
105
|
-
record: (outcome) => {
|
|
106
|
-
if (holder.outcome === null)
|
|
107
|
-
holder.outcome = outcome;
|
|
108
|
-
},
|
|
109
63
|
blockedWhen: "Ends this analysis step with no deliverables. Call it when you cannot " +
|
|
110
64
|
"fulfil the step — required inputs are missing or unreadable, the " +
|
|
111
65
|
"requested analysis is infeasible with the available data/packages, or " +
|
|
@@ -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;
|