@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
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The guarded-address classifier of the web research tools.
|
|
3
|
+
*
|
|
4
|
+
* One pure function over one address: `isGuardedAddress` answers whether the
|
|
5
|
+
* address falls in a range that `web_fetch` asks the user about before it
|
|
6
|
+
* connects. The ranges are a pinned subset of the special-purpose address
|
|
7
|
+
* ranges of the IANA registries — loopback, private, shared, link-local,
|
|
8
|
+
* multicast, reserved, documentation, and benchmarking space, IPv4 and IPv6.
|
|
9
|
+
* A public unicast address is never guarded.
|
|
10
|
+
*
|
|
11
|
+
* The caller owns the question "which address does the connection use": the
|
|
12
|
+
* classifier never resolves a name and it never reads the network.
|
|
13
|
+
*/
|
|
14
|
+
/**
|
|
15
|
+
* Is this address one the web tools guard? An IP literal of either family
|
|
16
|
+
* classifies against the pinned table; the IPv4-mapped IPv6 form
|
|
17
|
+
* (`::ffff:10.0.0.1`) classifies as its IPv4 half. A value that is not an IP
|
|
18
|
+
* address gives false — the caller resolves names before it reaches here.
|
|
19
|
+
*/
|
|
20
|
+
export declare function isGuardedAddress(ip: string): boolean;
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The guarded-address classifier of the web research tools.
|
|
3
|
+
*
|
|
4
|
+
* One pure function over one address: `isGuardedAddress` answers whether the
|
|
5
|
+
* address falls in a range that `web_fetch` asks the user about before it
|
|
6
|
+
* connects. The ranges are a pinned subset of the special-purpose address
|
|
7
|
+
* ranges of the IANA registries — loopback, private, shared, link-local,
|
|
8
|
+
* multicast, reserved, documentation, and benchmarking space, IPv4 and IPv6.
|
|
9
|
+
* A public unicast address is never guarded.
|
|
10
|
+
*
|
|
11
|
+
* The caller owns the question "which address does the connection use": the
|
|
12
|
+
* classifier never resolves a name and it never reads the network.
|
|
13
|
+
*/
|
|
14
|
+
import { isIP } from "node:net";
|
|
15
|
+
import { isAllDigits, isAllHex } from "../../lib/text.js";
|
|
16
|
+
/** Parse a dotted-quad IPv4 address into its 32-bit value. Anything else gives null. */
|
|
17
|
+
function ipv4ToNumber(ip) {
|
|
18
|
+
const parts = ip.split(".");
|
|
19
|
+
if (parts.length !== 4)
|
|
20
|
+
return null;
|
|
21
|
+
let value = 0;
|
|
22
|
+
for (const part of parts) {
|
|
23
|
+
if (part.length === 0 || part.length > 3 || !isAllDigits(part))
|
|
24
|
+
return null;
|
|
25
|
+
const octet = Number(part);
|
|
26
|
+
if (octet > 255)
|
|
27
|
+
return null;
|
|
28
|
+
value = (value << 8) | octet;
|
|
29
|
+
}
|
|
30
|
+
return value >>> 0;
|
|
31
|
+
}
|
|
32
|
+
/** Parse an IPv6 address into its 128-bit value. Anything else gives null. */
|
|
33
|
+
function ipv6ToBigInt(ip) {
|
|
34
|
+
let text = ip.toLowerCase();
|
|
35
|
+
// An embedded IPv4 tail stands for its two low-order groups.
|
|
36
|
+
if (text.includes(".")) {
|
|
37
|
+
const lastColon = text.lastIndexOf(":");
|
|
38
|
+
const tail = ipv4ToNumber(text.slice(lastColon + 1));
|
|
39
|
+
if (tail === null)
|
|
40
|
+
return null;
|
|
41
|
+
const high = ((tail >>> 16) & 0xffff).toString(16);
|
|
42
|
+
const low = (tail & 0xffff).toString(16);
|
|
43
|
+
text = `${text.slice(0, lastColon + 1)}${high}:${low}`;
|
|
44
|
+
}
|
|
45
|
+
const groupsOf = (half) => {
|
|
46
|
+
if (half === "")
|
|
47
|
+
return [];
|
|
48
|
+
const groups = [];
|
|
49
|
+
for (const group of half.split(":")) {
|
|
50
|
+
if (group.length === 0 || group.length > 4 || !isAllHex(group))
|
|
51
|
+
return null;
|
|
52
|
+
groups.push(BigInt(`0x${group}`));
|
|
53
|
+
}
|
|
54
|
+
return groups;
|
|
55
|
+
};
|
|
56
|
+
const halves = text.split("::");
|
|
57
|
+
if (halves.length > 2)
|
|
58
|
+
return null;
|
|
59
|
+
const left = groupsOf(halves[0] ?? "");
|
|
60
|
+
const right = halves.length === 2 ? groupsOf(halves[1] ?? "") : [];
|
|
61
|
+
if (left === null || right === null)
|
|
62
|
+
return null;
|
|
63
|
+
const fill = 8 - left.length - right.length;
|
|
64
|
+
if (halves.length === 2 ? fill < 0 : fill !== 0)
|
|
65
|
+
return null;
|
|
66
|
+
return [...left, ...new Array(Math.max(fill, 0)).fill(0n), ...right].reduce((acc, group) => (acc << 16n) | group, 0n);
|
|
67
|
+
}
|
|
68
|
+
const ipv4Span = (first, last) => {
|
|
69
|
+
const low = ipv4ToNumber(first);
|
|
70
|
+
const high = ipv4ToNumber(last);
|
|
71
|
+
if (low === null || high === null)
|
|
72
|
+
throw new Error(`Bad IPv4 range literal: ${first}..${last}`);
|
|
73
|
+
return { first: low, last: high };
|
|
74
|
+
};
|
|
75
|
+
const ipv6Span = (first, last) => {
|
|
76
|
+
const low = ipv6ToBigInt(first);
|
|
77
|
+
const high = ipv6ToBigInt(last);
|
|
78
|
+
if (low === null || high === null)
|
|
79
|
+
throw new Error(`Bad IPv6 range literal: ${first}..${last}`);
|
|
80
|
+
return { first: low, last: high };
|
|
81
|
+
};
|
|
82
|
+
/**
|
|
83
|
+
* The pinned IPv4 table. `240.0.0.0/4` holds the reserved and the broadcast
|
|
84
|
+
* space together, and it ends at the top of the address family.
|
|
85
|
+
*/
|
|
86
|
+
const GUARDED_IPV4_RANGES = [
|
|
87
|
+
ipv4Span("0.0.0.0", "0.255.255.255"), // 0.0.0.0/8
|
|
88
|
+
ipv4Span("10.0.0.0", "10.255.255.255"), // 10.0.0.0/8
|
|
89
|
+
ipv4Span("100.64.0.0", "100.127.255.255"), // 100.64.0.0/10
|
|
90
|
+
ipv4Span("127.0.0.0", "127.255.255.255"), // 127.0.0.0/8
|
|
91
|
+
ipv4Span("169.254.0.0", "169.254.255.255"), // 169.254.0.0/16
|
|
92
|
+
ipv4Span("172.16.0.0", "172.31.255.255"), // 172.16.0.0/12
|
|
93
|
+
ipv4Span("192.0.0.0", "192.0.0.255"), // 192.0.0.0/24
|
|
94
|
+
ipv4Span("192.0.2.0", "192.0.2.255"), // 192.0.2.0/24
|
|
95
|
+
ipv4Span("192.88.99.0", "192.88.99.255"), // 192.88.99.0/24
|
|
96
|
+
ipv4Span("192.168.0.0", "192.168.255.255"), // 192.168.0.0/16
|
|
97
|
+
ipv4Span("198.18.0.0", "198.19.255.255"), // 198.18.0.0/15
|
|
98
|
+
ipv4Span("198.51.100.0", "198.51.100.255"), // 198.51.100.0/24
|
|
99
|
+
ipv4Span("203.0.113.0", "203.0.113.255"), // 203.0.113.0/24
|
|
100
|
+
ipv4Span("224.0.0.0", "239.255.255.255"), // 224.0.0.0/4
|
|
101
|
+
ipv4Span("240.0.0.0", "255.255.255.255"), // 240.0.0.0/4
|
|
102
|
+
];
|
|
103
|
+
/**
|
|
104
|
+
* The pinned IPv6 table, without `::ffff:0:0/96`: an IPv4-mapped address
|
|
105
|
+
* normalizes to its IPv4 half first, thus that range classifies through the
|
|
106
|
+
* IPv4 table above.
|
|
107
|
+
*/
|
|
108
|
+
const GUARDED_IPV6_RANGES = [
|
|
109
|
+
ipv6Span("::", "::"), // ::/128
|
|
110
|
+
ipv6Span("::1", "::1"), // ::1/128
|
|
111
|
+
ipv6Span("64:ff9b::", "64:ff9b::ffff:ffff"), // 64:ff9b::/96
|
|
112
|
+
ipv6Span("64:ff9b:1::", "64:ff9b:1:ffff:ffff:ffff:ffff:ffff"), // 64:ff9b:1::/48
|
|
113
|
+
ipv6Span("100::", "100::ffff:ffff:ffff:ffff"), // 100::/64
|
|
114
|
+
ipv6Span("2001::", "2001:0:ffff:ffff:ffff:ffff:ffff:ffff"), // 2001::/32
|
|
115
|
+
ipv6Span("2001:db8::", "2001:db8:ffff:ffff:ffff:ffff:ffff:ffff"), // 2001:db8::/32
|
|
116
|
+
ipv6Span("2002::", "2002:ffff:ffff:ffff:ffff:ffff:ffff:ffff"), // 2002::/16
|
|
117
|
+
ipv6Span("fc00::", "fdff:ffff:ffff:ffff:ffff:ffff:ffff:ffff"), // fc00::/7
|
|
118
|
+
ipv6Span("fe80::", "febf:ffff:ffff:ffff:ffff:ffff:ffff:ffff"), // fe80::/10
|
|
119
|
+
ipv6Span("ff00::", "ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff"), // ff00::/8
|
|
120
|
+
];
|
|
121
|
+
function isGuardedIpv4(value) {
|
|
122
|
+
return GUARDED_IPV4_RANGES.some((range) => value >= range.first && value <= range.last);
|
|
123
|
+
}
|
|
124
|
+
function isGuardedIpv6(value) {
|
|
125
|
+
return GUARDED_IPV6_RANGES.some((range) => value >= range.first && value <= range.last);
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Is this address one the web tools guard? An IP literal of either family
|
|
129
|
+
* classifies against the pinned table; the IPv4-mapped IPv6 form
|
|
130
|
+
* (`::ffff:10.0.0.1`) classifies as its IPv4 half. A value that is not an IP
|
|
131
|
+
* address gives false — the caller resolves names before it reaches here.
|
|
132
|
+
*/
|
|
133
|
+
export function isGuardedAddress(ip) {
|
|
134
|
+
const family = isIP(ip);
|
|
135
|
+
if (family === 4) {
|
|
136
|
+
const value = ipv4ToNumber(ip);
|
|
137
|
+
return value !== null && isGuardedIpv4(value);
|
|
138
|
+
}
|
|
139
|
+
if (family === 6) {
|
|
140
|
+
const value = ipv6ToBigInt(ip);
|
|
141
|
+
if (value === null)
|
|
142
|
+
return false;
|
|
143
|
+
// The IPv4-mapped form, ::ffff:0:0/96, classifies as its IPv4 half.
|
|
144
|
+
if (value >> 32n === 0xffffn)
|
|
145
|
+
return isGuardedIpv4(Number(value & 0xffffffffn));
|
|
146
|
+
return isGuardedIpv6(value);
|
|
147
|
+
}
|
|
148
|
+
return false;
|
|
149
|
+
}
|
|
@@ -29,21 +29,23 @@
|
|
|
29
29
|
* form names a file that does not exist in the frame of the caller. The same
|
|
30
30
|
* projection guards the step briefing (`app/data-profile-orientation.ts`).
|
|
31
31
|
*/
|
|
32
|
-
import type {
|
|
32
|
+
import type { Querier } from "../../state/db.js";
|
|
33
|
+
import { z } from "zod";
|
|
33
34
|
import { type DataProfileFile, type DataProfileResult } from "../../state/index.js";
|
|
35
|
+
import { type Tool } from "../define-tool.js";
|
|
34
36
|
/**
|
|
35
37
|
* Whether the served profile can be trusted to describe the analysis's CURRENT inputs.
|
|
36
38
|
* `"stale"` still carries the full profile — a stale profile is far better than none —
|
|
37
39
|
* but says plainly why it may be wrong.
|
|
38
40
|
*/
|
|
39
41
|
type Freshness = "ready" | "stale";
|
|
40
|
-
|
|
42
|
+
type ProfileEnvelope = {
|
|
41
43
|
readonly state: Freshness;
|
|
42
44
|
/** Why the profile may not describe the current inputs. Present only when `state` is `"stale"`. */
|
|
43
45
|
readonly staleReason?: string;
|
|
44
46
|
readonly profiledAt: string;
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
+
};
|
|
48
|
+
type OverviewOutput = ProfileEnvelope & {
|
|
47
49
|
readonly scope: "overview";
|
|
48
50
|
readonly summary: string;
|
|
49
51
|
readonly domain?: string;
|
|
@@ -76,7 +78,7 @@ interface OverviewOutput extends ProfileEnvelope {
|
|
|
76
78
|
*/
|
|
77
79
|
readonly partition?: DataProfileResult["partition"];
|
|
78
80
|
readonly coverage?: DataProfileResult["coverage"];
|
|
79
|
-
}
|
|
81
|
+
};
|
|
80
82
|
/**
|
|
81
83
|
* The dataset's structure. A snapshot carrying none reports `available: false` rather
|
|
82
84
|
* than an empty list: "this profile predates the structure" and "this dataset has no
|
|
@@ -85,7 +87,7 @@ interface OverviewOutput extends ProfileEnvelope {
|
|
|
85
87
|
* A snapshot written under the previous model is served through `kinds`/`axes`, labelled
|
|
86
88
|
* — the structure exists, and an agent must not be told the dataset has none.
|
|
87
89
|
*/
|
|
88
|
-
|
|
90
|
+
type GroupsOutput = ProfileEnvelope & {
|
|
89
91
|
readonly scope: "groups";
|
|
90
92
|
readonly available: boolean;
|
|
91
93
|
/** Authored under the previous model — `kinds`/`axes` rather than resolved groups. */
|
|
@@ -99,13 +101,13 @@ interface GroupsOutput extends ProfileEnvelope {
|
|
|
99
101
|
readonly axes?: DataProfileResult["axes"];
|
|
100
102
|
readonly coverage?: DataProfileResult["coverage"];
|
|
101
103
|
readonly message?: string;
|
|
102
|
-
}
|
|
104
|
+
};
|
|
103
105
|
/**
|
|
104
106
|
* The members the profile describes individually — annotated members on a resolved
|
|
105
107
|
* snapshot, the notable-file records on an older one. Never the dataset: `datasetFileCount`
|
|
106
108
|
* on the overview is what says how big that is.
|
|
107
109
|
*/
|
|
108
|
-
|
|
110
|
+
type FilesOutput = ProfileEnvelope & {
|
|
109
111
|
readonly scope: "files";
|
|
110
112
|
readonly page: number;
|
|
111
113
|
readonly pageSize: number;
|
|
@@ -116,7 +118,7 @@ interface FilesOutput extends ProfileEnvelope {
|
|
|
116
118
|
/** How many files the dataset holds, so a page of 20 never reads as the whole of it. */
|
|
117
119
|
readonly datasetFileCount: number | null;
|
|
118
120
|
readonly files: DataProfileFile[];
|
|
119
|
-
}
|
|
121
|
+
};
|
|
120
122
|
/**
|
|
121
123
|
* No profile to serve — the honest lifecycle states, in the ok channel.
|
|
122
124
|
*
|
|
@@ -128,15 +130,15 @@ interface FilesOutput extends ProfileEnvelope {
|
|
|
128
130
|
* constant here, and a constant field carries no information while implying
|
|
129
131
|
* that it does. `FailedOutput` omits one for the same reason — see its note.
|
|
130
132
|
*/
|
|
131
|
-
|
|
133
|
+
type AbsentOutput = {
|
|
132
134
|
readonly state: "absent";
|
|
133
135
|
readonly message: string;
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
+
};
|
|
137
|
+
type PendingOutput = {
|
|
136
138
|
readonly state: "pending";
|
|
137
139
|
readonly status: "pending" | "running";
|
|
138
140
|
readonly message: string;
|
|
139
|
-
}
|
|
141
|
+
};
|
|
140
142
|
/**
|
|
141
143
|
* A recorded failure with no profile to fall back on.
|
|
142
144
|
*
|
|
@@ -152,17 +154,22 @@ interface PendingOutput {
|
|
|
152
154
|
* `failedAt` is reported instead: a fact the row actually holds, and one an agent
|
|
153
155
|
* that knows when the input set last changed can act on.
|
|
154
156
|
*/
|
|
155
|
-
|
|
157
|
+
type FailedOutput = {
|
|
156
158
|
readonly state: "failed";
|
|
157
159
|
readonly error: string | null;
|
|
158
160
|
/** When the failure was recorded; `null` when the row holds no time. */
|
|
159
161
|
readonly failedAt: string | null;
|
|
160
162
|
readonly message: string;
|
|
161
|
-
}
|
|
163
|
+
};
|
|
162
164
|
export type InspectDataProfileOutput = OverviewOutput | GroupsOutput | FilesOutput | AbsentOutput | PendingOutput | FailedOutput;
|
|
163
|
-
|
|
164
|
-
scope
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
165
|
+
declare const InspectDataProfileInputSchema: z.ZodObject<{
|
|
166
|
+
scope: z.ZodOptional<z.ZodEnum<{
|
|
167
|
+
files: "files";
|
|
168
|
+
groups: "groups";
|
|
169
|
+
overview: "overview";
|
|
170
|
+
}>>;
|
|
171
|
+
page: z.ZodOptional<z.ZodNumber>;
|
|
172
|
+
pageSize: z.ZodOptional<z.ZodNumber>;
|
|
173
|
+
}, z.core.$strip>;
|
|
174
|
+
export declare function createInspectDataProfileTool(pool: Querier): Tool<z.infer<typeof InspectDataProfileInputSchema>, InspectDataProfileOutput>;
|
|
168
175
|
export {};
|
|
@@ -90,6 +90,22 @@ function stalenessReasons(status) {
|
|
|
90
90
|
const FAILURE_SCOPE_NOTE = "This records an earlier attempt; this row cannot establish whether it covered the input files the analysis " +
|
|
91
91
|
"holds now, so do not read it as a verdict on the current data. Compare failedAt against when the input set " +
|
|
92
92
|
"last changed, and re-profile if they have moved apart.";
|
|
93
|
+
const InspectDataProfileInputSchema = z.object({
|
|
94
|
+
scope: z
|
|
95
|
+
.enum(["overview", "groups", "files"])
|
|
96
|
+
.optional()
|
|
97
|
+
.describe("'overview' (default): dataset-level facts, the partition accounting, the annotated-member count, and the dataset file count. " +
|
|
98
|
+
"'groups': the groups the dataset is made of, with their slots, and the dimensions that vary across it. " +
|
|
99
|
+
"'files': paged records for the individually annotated members."),
|
|
100
|
+
page: z.number().int().min(1).optional().describe("1-based page of member records. Only used when scope is 'files'. Default 1."),
|
|
101
|
+
pageSize: z
|
|
102
|
+
.number()
|
|
103
|
+
.int()
|
|
104
|
+
.min(1)
|
|
105
|
+
.max(MAX_PAGE_SIZE)
|
|
106
|
+
.optional()
|
|
107
|
+
.describe(`Member records per page. Only used when scope is 'files'. Default ${DEFAULT_PAGE_SIZE}, max ${MAX_PAGE_SIZE}.`),
|
|
108
|
+
});
|
|
93
109
|
export function createInspectDataProfileTool(pool) {
|
|
94
110
|
return defineTool({
|
|
95
111
|
id: "inspect_data_profile",
|
|
@@ -119,22 +135,7 @@ export function createInspectDataProfileTool(pool) {
|
|
|
119
135
|
"input files you are holding now, and this tool cannot tell you whether that attempt covered them. Compare failedAt " +
|
|
120
136
|
"against when the input set last changed before you conclude anything: if the data moved since, say the profile " +
|
|
121
137
|
"needs re-running rather than diagnosing the data itself.",
|
|
122
|
-
inputSchema:
|
|
123
|
-
scope: z
|
|
124
|
-
.enum(["overview", "groups", "files"])
|
|
125
|
-
.optional()
|
|
126
|
-
.describe("'overview' (default): dataset-level facts, the partition accounting, the annotated-member count, and the dataset file count. " +
|
|
127
|
-
"'groups': the groups the dataset is made of, with their slots, and the dimensions that vary across it. " +
|
|
128
|
-
"'files': paged records for the individually annotated members."),
|
|
129
|
-
page: z.number().int().min(1).optional().describe("1-based page of member records. Only used when scope is 'files'. Default 1."),
|
|
130
|
-
pageSize: z
|
|
131
|
-
.number()
|
|
132
|
-
.int()
|
|
133
|
-
.min(1)
|
|
134
|
-
.max(MAX_PAGE_SIZE)
|
|
135
|
-
.optional()
|
|
136
|
-
.describe(`Member records per page. Only used when scope is 'files'. Default ${DEFAULT_PAGE_SIZE}, max ${MAX_PAGE_SIZE}.`),
|
|
137
|
-
}),
|
|
138
|
+
inputSchema: InspectDataProfileInputSchema,
|
|
138
139
|
// `execute` defaults both fields internally, and the hook applies the same
|
|
139
140
|
// defaults. Without them the ordinary call, which names no field at all,
|
|
140
141
|
// gives no detail. `page` acts only on the `files` scope, as in `execute`.
|
|
@@ -214,9 +215,9 @@ export function createInspectDataProfileTool(pool) {
|
|
|
214
215
|
// nothing of carries `groups: []`, and "zero groups" is a finding — reading
|
|
215
216
|
// it as "no structure record" would report the analysis unprofiled.
|
|
216
217
|
groupCount: result.groups !== undefined || result.kinds !== undefined ? groups.length : null,
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
218
|
+
structureNote,
|
|
219
|
+
partition: result.partition,
|
|
220
|
+
coverage: result.coverage,
|
|
220
221
|
});
|
|
221
222
|
}
|
|
222
223
|
if (scope === "groups") {
|
|
@@ -226,10 +227,10 @@ export function createInspectDataProfileTool(pool) {
|
|
|
226
227
|
scope: "groups",
|
|
227
228
|
available: true,
|
|
228
229
|
groups: rootGroupPatterns(result.groups, resourceId),
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
230
|
+
dimensions: result.dimensions,
|
|
231
|
+
probes: result.probes,
|
|
232
|
+
partition: result.partition,
|
|
233
|
+
recipe: result.recipe,
|
|
233
234
|
});
|
|
234
235
|
}
|
|
235
236
|
if (result.kinds === undefined) {
|
|
@@ -251,8 +252,8 @@ export function createInspectDataProfileTool(pool) {
|
|
|
251
252
|
available: true,
|
|
252
253
|
legacy: true,
|
|
253
254
|
kinds: rootKindPatterns(result.kinds, resourceId),
|
|
254
|
-
|
|
255
|
-
|
|
255
|
+
axes: result.axes,
|
|
256
|
+
coverage: result.coverage,
|
|
256
257
|
message: "Authored under the previous model: these are kinds and axes, not resolved groups and dimensions. " +
|
|
257
258
|
"Counts and patterns were the profiler's own claims rather than a computed partition, and there is no " +
|
|
258
259
|
"unclassified sweep or quarantine accounting on a profile of that era.",
|
|
@@ -5,10 +5,24 @@
|
|
|
5
5
|
* conversation. List mode puts the running runs first and is paged. Targeted mode makes
|
|
6
6
|
* readiness explicit and can perform one bounded, abort-aware wait.
|
|
7
7
|
*/
|
|
8
|
-
import type {
|
|
8
|
+
import type { QueryConfig } from "pg";
|
|
9
|
+
import { z } from "zod";
|
|
10
|
+
import type { PauseCause } from "../../contracts/chat-parts.js";
|
|
9
11
|
import type { CortexRunRow } from "../../state/schema.js";
|
|
10
|
-
type
|
|
11
|
-
|
|
12
|
+
import { type Tool } from "../define-tool.js";
|
|
13
|
+
type FormattedRun = {
|
|
14
|
+
runId: string;
|
|
15
|
+
workflowName: string;
|
|
16
|
+
status: CortexRunRow["status"];
|
|
17
|
+
startedAt: string;
|
|
18
|
+
completedAt: string | null;
|
|
19
|
+
planId: string | null;
|
|
20
|
+
synthesisPath: string | null;
|
|
21
|
+
synthesisStatus: CortexRunRow["synthesisStatus"];
|
|
22
|
+
error: string | null | undefined;
|
|
23
|
+
synthesisReason?: string;
|
|
24
|
+
};
|
|
25
|
+
type FormattedStep = {
|
|
12
26
|
stepId: string;
|
|
13
27
|
agentId: string;
|
|
14
28
|
wave: number;
|
|
@@ -20,11 +34,11 @@ interface FormattedStep {
|
|
|
20
34
|
lastErrorClass?: string | null;
|
|
21
35
|
finishReason?: string | null;
|
|
22
36
|
hitMaxSteps?: boolean | null;
|
|
23
|
-
}
|
|
24
|
-
|
|
37
|
+
};
|
|
38
|
+
type WaitMetadata = {
|
|
25
39
|
readonly requestedSeconds: number;
|
|
26
40
|
readonly cutoffReached: boolean;
|
|
27
|
-
}
|
|
41
|
+
};
|
|
28
42
|
type InspectRunOutput = {
|
|
29
43
|
runs: FormattedRun[];
|
|
30
44
|
total: number;
|
|
@@ -36,7 +50,20 @@ type InspectRunOutput = {
|
|
|
36
50
|
message: string;
|
|
37
51
|
wait?: WaitMetadata;
|
|
38
52
|
} | {
|
|
39
|
-
inspectionState: "
|
|
53
|
+
inspectionState: "paused";
|
|
54
|
+
message: string;
|
|
55
|
+
run: FormattedRun;
|
|
56
|
+
steps: FormattedStep[];
|
|
57
|
+
/** Each workflow of the run that waits: a step, or the synthesis. */
|
|
58
|
+
pauses: {
|
|
59
|
+
state: "retrying" | "paused";
|
|
60
|
+
cause: PauseCause;
|
|
61
|
+
attempt: number;
|
|
62
|
+
retryAt?: string;
|
|
63
|
+
}[];
|
|
64
|
+
wait?: WaitMetadata;
|
|
65
|
+
} | {
|
|
66
|
+
inspectionState: "in_progress" | "terminal";
|
|
40
67
|
message: string;
|
|
41
68
|
run: FormattedRun;
|
|
42
69
|
steps: FormattedStep[];
|
|
@@ -44,31 +71,31 @@ type InspectRunOutput = {
|
|
|
44
71
|
wait?: WaitMetadata;
|
|
45
72
|
selfWaitPrevented?: boolean;
|
|
46
73
|
};
|
|
47
|
-
|
|
74
|
+
type InspectRunClock = {
|
|
48
75
|
now(): number;
|
|
49
76
|
wait(ms: number, signal: AbortSignal): Promise<void>;
|
|
50
|
-
}
|
|
51
|
-
declare
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
77
|
+
};
|
|
78
|
+
declare const inputSchema: z.ZodObject<{
|
|
79
|
+
runId: z.ZodOptional<z.ZodString>;
|
|
80
|
+
page: z.ZodOptional<z.ZodNumber>;
|
|
81
|
+
pageSize: z.ZodOptional<z.ZodNumber>;
|
|
82
|
+
waitForTerminalSeconds: z.ZodOptional<z.ZodNumber>;
|
|
83
|
+
includeDiagnostics: z.ZodOptional<z.ZodBoolean>;
|
|
84
|
+
}, z.core.$strip>;
|
|
85
|
+
/**
|
|
86
|
+
* The pool surface this tool reads: one query whose rows the state row parsers type. A computed test fake
|
|
87
|
+
* satisfies this shape directly, where the row-generic of `Querier` cannot be implemented by a fake that
|
|
88
|
+
* computes its rows.
|
|
89
|
+
*/
|
|
90
|
+
export type InspectRunQuerier = {
|
|
91
|
+
query(queryTextOrConfig: string | QueryConfig, values?: unknown[]): Promise<{
|
|
92
|
+
rows: Record<string, unknown>[];
|
|
93
|
+
rowCount: number | null;
|
|
94
|
+
}>;
|
|
62
95
|
};
|
|
63
96
|
/**
|
|
64
97
|
* Build the run-inspection tool. The optional clock is an internal testing
|
|
65
98
|
* seam for deterministic cutoff and transition coverage.
|
|
66
99
|
*/
|
|
67
|
-
export declare function createInspectRunTool(pool:
|
|
68
|
-
runId?: string | undefined;
|
|
69
|
-
page?: number | undefined;
|
|
70
|
-
pageSize?: number | undefined;
|
|
71
|
-
waitForTerminalSeconds?: number | undefined;
|
|
72
|
-
includeDiagnostics?: boolean | undefined;
|
|
73
|
-
}, InspectRunOutput>;
|
|
100
|
+
export declare function createInspectRunTool(pool: InspectRunQuerier, clock?: InspectRunClock): Tool<z.infer<typeof inputSchema>, InspectRunOutput>;
|
|
74
101
|
export {};
|
|
@@ -11,6 +11,7 @@ import { z } from "zod";
|
|
|
11
11
|
import { scopeResource } from "../../auth/types.js";
|
|
12
12
|
import { unwrapOrThrow } from "../../lib/result.js";
|
|
13
13
|
import { queryRun, queryRunsForInspection, queryStepsByRun } from "../../state/index.js";
|
|
14
|
+
import { queryPausesOfWork } from "../../state/paused-work.js";
|
|
14
15
|
import { SYNTHESIS_STEP_ID } from "../../workspace/paths.js";
|
|
15
16
|
import { defineTool } from "../define-tool.js";
|
|
16
17
|
const DEFAULT_PAGE_SIZE = 50;
|
|
@@ -20,10 +21,10 @@ const systemClock = {
|
|
|
20
21
|
wait: (ms, signal) => sleep(ms, undefined, { signal }),
|
|
21
22
|
};
|
|
22
23
|
function isTerminal(status) {
|
|
23
|
-
return status === "completed" || status === "partial" || status === "failed" || status === "canceled"
|
|
24
|
+
return status === "completed" || status === "partial" || status === "failed" || status === "canceled";
|
|
24
25
|
}
|
|
25
26
|
function formatRun(r, verbose, exposePaths = isTerminal(r.status)) {
|
|
26
|
-
|
|
27
|
+
const run = {
|
|
27
28
|
runId: r.runId,
|
|
28
29
|
workflowName: r.workflowName,
|
|
29
30
|
status: r.status,
|
|
@@ -32,30 +33,33 @@ function formatRun(r, verbose, exposePaths = isTerminal(r.status)) {
|
|
|
32
33
|
planId: r.planId,
|
|
33
34
|
synthesisPath: exposePaths && r.synthesisStatus === "produced" ? `runs/${r.runId}/synthesis.json` : null,
|
|
34
35
|
synthesisStatus: r.synthesisStatus,
|
|
35
|
-
|
|
36
|
-
...(verbose ? { error: r.error } : {}),
|
|
36
|
+
error: verbose ? (r.error ?? null) : undefined,
|
|
37
37
|
};
|
|
38
|
+
if (r.synthesisReason !== null)
|
|
39
|
+
return { ...run, synthesisReason: r.synthesisReason };
|
|
40
|
+
return run;
|
|
38
41
|
}
|
|
39
42
|
function formatSteps(runId, stepRows, verbose, exposePaths) {
|
|
40
|
-
return stepRows.map((s) =>
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
43
|
+
return stepRows.map((s) => {
|
|
44
|
+
const step = {
|
|
45
|
+
stepId: s.stepId,
|
|
46
|
+
agentId: s.agentId,
|
|
47
|
+
wave: s.wave,
|
|
48
|
+
status: s.status,
|
|
49
|
+
};
|
|
50
|
+
if (exposePaths && s.status !== "pending" && s.status !== "skipped" && s.stepId !== SYNTHESIS_STEP_ID) {
|
|
51
|
+
step.summaryPath = `runs/${runId}/${s.stepId}/output/summary.md`;
|
|
52
|
+
}
|
|
53
|
+
if (verbose) {
|
|
54
|
+
step.durationMs = s.durationMs;
|
|
55
|
+
step.error = s.error;
|
|
56
|
+
step.attempts = s.attempts;
|
|
57
|
+
step.lastErrorClass = s.lastErrorClass;
|
|
58
|
+
step.finishReason = s.finishReason;
|
|
59
|
+
step.hitMaxSteps = s.hitMaxSteps;
|
|
60
|
+
}
|
|
61
|
+
return step;
|
|
62
|
+
});
|
|
59
63
|
}
|
|
60
64
|
const inputSchema = z
|
|
61
65
|
.object({
|
|
@@ -77,14 +81,14 @@ const inputSchema = z
|
|
|
77
81
|
.superRefine((input, refinement) => {
|
|
78
82
|
if (input.runId && (input.page !== undefined || input.pageSize !== undefined)) {
|
|
79
83
|
refinement.addIssue({
|
|
80
|
-
code:
|
|
84
|
+
code: "custom",
|
|
81
85
|
message: "page and pageSize are valid only when runId is omitted",
|
|
82
86
|
path: input.page !== undefined ? ["page"] : ["pageSize"],
|
|
83
87
|
});
|
|
84
88
|
}
|
|
85
89
|
if (!input.runId && input.waitForTerminalSeconds !== undefined) {
|
|
86
90
|
refinement.addIssue({
|
|
87
|
-
code:
|
|
91
|
+
code: "custom",
|
|
88
92
|
message: "waitForTerminalSeconds requires runId",
|
|
89
93
|
path: ["waitForTerminalSeconds"],
|
|
90
94
|
});
|
|
@@ -99,9 +103,9 @@ export function createInspectRunTool(pool, clock = systemClock) {
|
|
|
99
103
|
id: "inspect_run",
|
|
100
104
|
description: "Inspect workflow runs for this analysis. A run never posts its completion into the conversation; this tool is how you read it. " +
|
|
101
105
|
"Without a runId, returns a paged list (running runs first, then each other run) with total and hasMore. " +
|
|
102
|
-
"With a runId, returns the run, its steps, and an inspectionState: not_found; in_progress;
|
|
106
|
+
"With a runId, returns the run, its steps, and an inspectionState: not_found; in_progress; paused (a step waits until the user resumes or stops the run, and pauses gives each cause); " +
|
|
103
107
|
"or terminal (run.status completed, partial, failed, or canceled). " +
|
|
104
|
-
"Output paths appear only on a
|
|
108
|
+
"Output paths appear only on a terminal run: run.synthesisPath when synthesisStatus is produced, and the summaryPath of each step that ran. " +
|
|
105
109
|
"For a user-directed check, waitForTerminalSeconds can wait once for 1-30 seconds; if the cutoff returns in_progress, stop polling for that turn. " +
|
|
106
110
|
"A wait on the run that the caller itself runs inside returns at once with selfWaitPrevented. " +
|
|
107
111
|
"Default response is lightweight — pass includeDiagnostics:true to add error/duration/retry telemetry.",
|
|
@@ -132,14 +136,17 @@ export function createInspectRunTool(pool, clock = systemClock) {
|
|
|
132
136
|
return ok({
|
|
133
137
|
inspectionState: "not_found",
|
|
134
138
|
message: `Run ${input.runId} was not found in this analysis.`,
|
|
135
|
-
|
|
139
|
+
wait: waitSeconds === undefined ? undefined : { requestedSeconds: waitSeconds, cutoffReached: false },
|
|
136
140
|
});
|
|
137
141
|
}
|
|
138
142
|
const selfWait = waitSeconds !== undefined && ctx.session.runFrame?.runId === input.runId;
|
|
143
|
+
const runId = input.runId;
|
|
144
|
+
const pausesOf = async (status) => status === "running" ? unwrapOrThrow(await queryPausesOfWork(pool, resourceId, runId)) : [];
|
|
145
|
+
let pauses = await pausesOf(run.status);
|
|
139
146
|
let cutoffReached = false;
|
|
140
|
-
if (waitSeconds !== undefined && run.status === "running" && !selfWait) {
|
|
147
|
+
if (waitSeconds !== undefined && run.status === "running" && pauses.length === 0 && !selfWait) {
|
|
141
148
|
const deadline = clock.now() + waitSeconds * 1_000;
|
|
142
|
-
while (run.status === "running") {
|
|
149
|
+
while (run.status === "running" && pauses.length === 0) {
|
|
143
150
|
const remaining = deadline - clock.now();
|
|
144
151
|
if (remaining <= 0) {
|
|
145
152
|
cutoffReached = true;
|
|
@@ -154,12 +161,24 @@ export function createInspectRunTool(pool, clock = systemClock) {
|
|
|
154
161
|
wait: { requestedSeconds: waitSeconds, cutoffReached: false },
|
|
155
162
|
});
|
|
156
163
|
}
|
|
164
|
+
pauses = await pausesOf(run.status);
|
|
157
165
|
}
|
|
158
166
|
}
|
|
159
167
|
const terminal = isTerminal(run.status);
|
|
160
168
|
const stepRows = unwrapOrThrow(await queryStepsByRun(pool, input.runId));
|
|
161
169
|
const steps = formatSteps(input.runId, stepRows, verbose, terminal);
|
|
162
170
|
const wait = waitSeconds === undefined ? {} : { wait: { requestedSeconds: waitSeconds, cutoffReached } };
|
|
171
|
+
if (run.status === "running" && pauses.length > 0) {
|
|
172
|
+
return ok({
|
|
173
|
+
inspectionState: "paused",
|
|
174
|
+
message: "This run waits in a pause, and results are not ready. Tell the user the cause of each pause. " +
|
|
175
|
+
"The user can resume the run or stop it. A pause in the state retrying also sends its request again at retryAt.",
|
|
176
|
+
run: formatRun(run, verbose, false),
|
|
177
|
+
steps,
|
|
178
|
+
pauses: pauses.map((pause) => ({ state: pause.state, cause: pause.cause, attempt: pause.attempt, retryAt: pause.retryAt })),
|
|
179
|
+
...wait,
|
|
180
|
+
});
|
|
181
|
+
}
|
|
163
182
|
if (run.status === "running") {
|
|
164
183
|
const message = selfWait
|
|
165
184
|
? "This run is still in progress. Results are not ready, and the enclosing workflow cannot finish while its current step waits for itself."
|
|
@@ -173,16 +192,7 @@ export function createInspectRunTool(pool, clock = systemClock) {
|
|
|
173
192
|
steps,
|
|
174
193
|
elapsedMs: Math.max(0, clock.now() - Date.parse(run.startedAt)),
|
|
175
194
|
...wait,
|
|
176
|
-
|
|
177
|
-
});
|
|
178
|
-
}
|
|
179
|
-
if (run.status === "suspended_insufficient_funds") {
|
|
180
|
-
return ok({
|
|
181
|
-
inspectionState: "suspended",
|
|
182
|
-
message: "The host suspended this run. The run does not progress. A new run of the plan can start.",
|
|
183
|
-
run: formatRun(run, verbose, true),
|
|
184
|
-
steps,
|
|
185
|
-
...wait,
|
|
195
|
+
selfWaitPrevented: selfWait ? true : undefined,
|
|
186
196
|
});
|
|
187
197
|
}
|
|
188
198
|
return ok({
|