@inflexa-ai/harness 0.45.1 → 0.46.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +6 -3
- package/dist/agents/conversation-agent.d.ts +9 -3
- package/dist/agents/conversation-agent.js +34 -33
- package/dist/agents/report-session-agent.d.ts +15 -15
- package/dist/agents/report-session-agent.js +23 -15
- package/dist/agents/sandbox/index.d.ts +1 -1
- package/dist/agents/sandbox/index.js +1 -1
- package/dist/agents/sandbox/shared.d.ts +12 -14
- package/dist/agents/sandbox/shared.js +18 -12
- package/dist/agents/sandbox/types.d.ts +4 -4
- package/dist/agents/sandbox/validate-skills.d.ts +2 -2
- package/dist/agents/sandbox/validate-skills.js +3 -1
- package/dist/agents/sandbox-catalog.d.ts +2 -2
- package/dist/agents/sandbox-catalog.js +3 -3
- package/dist/agents/system-prompt.d.ts +2 -2
- package/dist/app/chat-turn-workflow.d.ts +114 -0
- package/dist/app/chat-turn-workflow.js +307 -0
- package/dist/app/chat-turn.d.ts +85 -57
- package/dist/app/chat-turn.js +123 -100
- package/dist/app/data-profile-orientation.js +10 -8
- package/dist/app/data-profile-view.d.ts +4 -4
- package/dist/app/data-profile-view.js +9 -8
- package/dist/app/in-process-turn.d.ts +42 -0
- package/dist/app/in-process-turn.js +139 -0
- package/dist/app/message-assembly.d.ts +10 -4
- package/dist/app/message-assembly.js +13 -8
- package/dist/app/report-session-runtime.d.ts +4 -4
- package/dist/app/report-session-runtime.js +36 -21
- package/dist/app/spawn-report-session.d.ts +33 -28
- package/dist/app/spawn-report-session.js +25 -40
- package/dist/app/synthesize-run.d.ts +22 -16
- package/dist/app/synthesize-run.js +41 -35
- package/dist/app/work.d.ts +96 -0
- package/dist/app/work.js +147 -0
- package/dist/auth/local-auth-context.d.ts +1 -3
- package/dist/auth/local-auth-context.js +1 -3
- package/dist/auth/local-run-authorizer.d.ts +1 -1
- package/dist/auth/local-run-authorizer.js +5 -3
- package/dist/auth/types.d.ts +26 -26
- package/dist/billing/cached-resolver.d.ts +4 -4
- package/dist/billing/run-charge.d.ts +5 -8
- package/dist/billing/run-charge.js +2 -2
- package/dist/billing/usage-recorder.d.ts +9 -9
- package/dist/citations/aggregate.js +1 -1
- package/dist/citations/clients/arxiv.d.ts +2 -2
- package/dist/citations/clients/arxiv.js +12 -4
- package/dist/citations/clients/common.js +4 -2
- package/dist/citations/clients/crossref.d.ts +2 -2
- package/dist/citations/clients/crossref.js +37 -37
- package/dist/citations/clients/doi-registry.js +15 -16
- package/dist/citations/clients/pubmed.d.ts +2 -2
- package/dist/citations/clients/pubmed.js +20 -13
- package/dist/citations/clients/semantic-scholar.d.ts +2 -2
- package/dist/citations/clients/semantic-scholar.js +9 -9
- package/dist/citations/compare.js +2 -2
- package/dist/citations/match.d.ts +2 -2
- package/dist/citations/match.js +12 -7
- package/dist/citations/normalize.js +35 -26
- package/dist/citations/plan.js +6 -2
- package/dist/citations/resolve.d.ts +6 -6
- package/dist/citations/resolve.js +34 -25
- package/dist/citations/types.d.ts +77 -77
- package/dist/config/environment-stores.d.ts +6 -6
- package/dist/config/resource-limits.js +1 -3
- package/dist/contracts/analogy-report.d.ts +7 -7
- package/dist/contracts/analogy-report.js +2 -2
- package/dist/contracts/chat-events.d.ts +38 -24
- package/dist/contracts/chat-frame.d.ts +15 -5
- package/dist/contracts/chat-frame.js +64 -41
- package/dist/contracts/chat-parts.d.ts +130 -67
- package/dist/contracts/chat-parts.js +1 -0
- package/dist/contracts/content-url.js +16 -2
- package/dist/contracts/data-profile.d.ts +38 -38
- package/dist/contracts/index.d.ts +2 -2
- package/dist/contracts/index.js +1 -1
- package/dist/contracts/message.d.ts +6 -6
- package/dist/contracts/organ-system.d.ts +11 -11
- package/dist/contracts/part-registry.d.ts +5 -4
- package/dist/contracts/part-registry.js +5 -0
- package/dist/contracts/profile-vocabulary.d.ts +11 -10
- package/dist/contracts/profile-vocabulary.js +10 -3
- package/dist/contracts/report-blocks.d.ts +329 -329
- package/dist/contracts/report-reference.d.ts +105 -81
- package/dist/contracts/report-reference.js +30 -13
- package/dist/contracts/schemas/chat-events.d.ts +30 -16
- package/dist/contracts/schemas/chat-events.js +15 -6
- package/dist/contracts/schemas/chat-parts.d.ts +175 -102
- package/dist/contracts/schemas/chat-parts.js +33 -7
- package/dist/contracts/severity.d.ts +1 -1
- package/dist/contracts/structure-source.d.ts +3 -3
- package/dist/contracts/structure-source.js +6 -2
- package/dist/contracts/subagent-activity.d.ts +2 -2
- package/dist/contracts/subagent-activity.js +5 -3
- package/dist/contracts/usage.d.ts +2 -2
- package/dist/data/safety-panel-schema.d.ts +25 -25
- package/dist/data/safety-panel-schema.js +13 -4
- package/dist/execution/artifact-metadata.d.ts +23 -15
- package/dist/execution/artifact-metadata.js +33 -10
- package/dist/execution/artifact-record.d.ts +2 -2
- package/dist/execution/artifact-registration.d.ts +5 -5
- package/dist/execution/artifact-registry.d.ts +8 -8
- package/dist/execution/dbos-run-launcher.d.ts +24 -4
- package/dist/execution/dbos-run-launcher.js +58 -4
- package/dist/execution/dbos-workflow-purger.d.ts +5 -6
- package/dist/execution/dbos-workflow-purger.js +8 -7
- package/dist/execution/input-signature.d.ts +2 -2
- package/dist/execution/post-step-pipeline.d.ts +9 -9
- package/dist/execution/post-step-pipeline.js +1 -1
- package/dist/execution/post-step.js +2 -2
- package/dist/execution/reconcile-manifest.d.ts +4 -4
- package/dist/execution/reconcile-manifest.js +3 -2
- package/dist/execution/run-authorizer.d.ts +46 -37
- package/dist/execution/run-authorizer.js +8 -8
- package/dist/execution/run-canceler.d.ts +7 -7
- package/dist/execution/run-canceler.js +14 -7
- package/dist/execution/run-end-record.d.ts +2 -3
- package/dist/execution/run-event-parts.d.ts +0 -8
- package/dist/execution/run-event-parts.js +29 -24
- package/dist/execution/run-event-stream.d.ts +8 -8
- package/dist/execution/run-event-stream.js +3 -4
- package/dist/execution/run-launcher.d.ts +4 -4
- package/dist/execution/run-synthesis.d.ts +49 -48
- package/dist/execution/run-synthesis.js +96 -255
- package/dist/execution/staged-input.d.ts +2 -2
- package/dist/execution/step-summary.d.ts +6 -6
- package/dist/execution/step-summary.js +4 -8
- package/dist/execution/topo-sort.js +4 -3
- package/dist/execution/workflow-purger.d.ts +2 -2
- package/dist/index.d.ts +17 -20
- package/dist/index.js +25 -36
- package/dist/input-sanitization.js +9 -2
- package/dist/input-scan/clustering.d.ts +6 -6
- package/dist/input-scan/clustering.js +11 -5
- package/dist/input-scan/companions.js +3 -2
- package/dist/input-scan/detect-sets.d.ts +2 -2
- package/dist/input-scan/detect-sets.js +25 -21
- package/dist/input-scan/enrich.d.ts +6 -6
- package/dist/input-scan/enrich.js +29 -12
- package/dist/input-scan/formats.d.ts +2 -2
- package/dist/input-scan/formats.js +8 -2
- package/dist/input-scan/markers.d.ts +2 -2
- package/dist/input-scan/markers.js +14 -5
- package/dist/input-scan/menu.d.ts +10 -10
- package/dist/input-scan/menu.js +0 -0
- package/dist/input-scan/quarantine.d.ts +2 -2
- package/dist/input-scan/quarantine.js +23 -18
- package/dist/input-scan/readout-budget.d.ts +2 -2
- package/dist/input-scan/readout-budget.js +1 -1
- package/dist/input-scan/readout.d.ts +2 -2
- package/dist/input-scan/readout.js +47 -34
- package/dist/input-scan/scan.d.ts +2 -2
- package/dist/input-scan/scan.js +7 -5
- package/dist/input-scan/set-types.d.ts +28 -28
- package/dist/input-scan/shapes.d.ts +4 -4
- package/dist/input-scan/shapes.js +0 -0
- package/dist/input-scan/templates.d.ts +10 -10
- package/dist/input-scan/templates.js +30 -22
- package/dist/input-scan/tokens.d.ts +6 -4
- package/dist/input-scan/tokens.js +100 -38
- package/dist/input-scan/types.d.ts +22 -22
- package/dist/lib/async-utils.d.ts +3 -7
- package/dist/lib/async-utils.js +5 -9
- package/dist/lib/cache.js +1 -1
- package/dist/lib/chrome.d.ts +46 -6
- package/dist/lib/console-logger.js +2 -2
- package/dist/lib/db-result.d.ts +22 -6
- package/dist/lib/db-result.js +9 -13
- package/dist/lib/eyes.d.ts +4 -4
- package/dist/lib/eyes.js +1 -1
- package/dist/lib/fs-helpers.js +18 -6
- package/dist/lib/fs-result.d.ts +1 -0
- package/dist/lib/fs-result.js +5 -6
- package/dist/lib/hooks.d.ts +23 -7
- package/dist/lib/hooks.js +17 -3
- package/dist/lib/host-concurrency.js +3 -2
- package/dist/lib/logger.d.ts +2 -2
- package/dist/lib/logger.js +2 -1
- package/dist/lib/metrics.d.ts +1 -1
- package/dist/lib/null-proto.d.ts +6 -0
- package/dist/lib/null-proto.js +17 -0
- package/dist/lib/otel-spans.d.ts +1 -1
- package/dist/lib/otel-spans.js +9 -5
- package/dist/lib/otel.d.ts +4 -2
- package/dist/lib/otel.js +10 -2
- package/dist/lib/page-capture.d.ts +8 -8
- package/dist/lib/page-capture.js +9 -4
- package/dist/lib/parse-json.d.ts +5 -0
- package/dist/lib/parse-json.js +12 -0
- package/dist/lib/present.d.ts +12 -0
- package/dist/lib/present.js +39 -0
- package/dist/lib/rate-limit.d.ts +4 -4
- package/dist/lib/rate-limit.js +12 -13
- package/dist/lib/regulatory-corpus/fetch-fda-guidance.d.ts +4 -4
- package/dist/lib/regulatory-corpus/fetch-fda-guidance.js +4 -10
- package/dist/lib/regulatory-corpus/fetch-ich.d.ts +4 -4
- package/dist/lib/regulatory-corpus/fetch-ich.js +18 -14
- package/dist/lib/regulatory-corpus/normalize-whitespace.d.ts +6 -0
- package/dist/lib/regulatory-corpus/normalize-whitespace.js +41 -0
- package/dist/lib/regulatory-corpus.d.ts +10 -10
- package/dist/lib/regulatory-corpus.js +3 -1
- package/dist/lib/result.d.ts +10 -11
- package/dist/lib/result.js +15 -13
- package/dist/lib/storage.d.ts +2 -2
- package/dist/lib/test/async-iterable.d.ts +9 -0
- package/dist/lib/test/async-iterable.js +28 -0
- package/dist/lib/test/request-url.d.ts +5 -0
- package/dist/lib/test/request-url.js +7 -0
- package/dist/lib/test/result-assert.d.ts +12 -0
- package/dist/lib/test/result-assert.js +17 -0
- package/dist/lib/test/text-shapes.d.ts +24 -0
- package/dist/lib/test/text-shapes.js +63 -0
- package/dist/lib/text.d.ts +22 -0
- package/dist/lib/text.js +68 -0
- package/dist/lib/thrown.d.ts +18 -0
- package/dist/lib/thrown.js +30 -0
- package/dist/lib/unknown-array.d.ts +6 -0
- package/dist/lib/unknown-array.js +8 -0
- package/dist/lib/unknown-containers.d.ts +14 -0
- package/dist/lib/unknown-containers.js +17 -0
- package/dist/lib/unknown-text.d.ts +8 -0
- package/dist/lib/unknown-text.js +28 -0
- package/dist/lib/zod-issue-shape.d.ts +1 -1
- package/dist/lib/zod-issue-shape.js +31 -31
- package/dist/lib/zod-issues.d.ts +3 -3
- package/dist/lib/zod-issues.js +30 -17
- package/dist/literature/sources/arxiv.d.ts +6 -6
- package/dist/literature/sources/arxiv.js +92 -35
- package/dist/literature/sources/http.d.ts +2 -2
- package/dist/literature/sources/http.js +16 -15
- package/dist/literature/sources/pubmed.d.ts +16 -16
- package/dist/literature/sources/pubmed.js +96 -61
- package/dist/literature/sources/semantic-scholar.d.ts +8 -8
- package/dist/literature/sources/semantic-scholar.js +22 -13
- package/dist/loop/accounting.d.ts +63 -0
- package/dist/loop/accounting.js +141 -0
- package/dist/loop/call-policy.d.ts +73 -0
- package/dist/loop/call-policy.js +109 -0
- package/dist/loop/chat-stream.d.ts +62 -0
- package/dist/loop/chat-stream.js +237 -0
- package/dist/loop/compaction.d.ts +9 -9
- package/dist/loop/compaction.js +1 -1
- package/dist/loop/metrics.d.ts +12 -15
- package/dist/loop/metrics.js +14 -26
- package/dist/loop/run-loop.d.ts +233 -0
- package/dist/loop/run-loop.js +770 -0
- package/dist/loop/sub-agent.d.ts +61 -0
- package/dist/loop/sub-agent.js +161 -0
- package/dist/loop/tool-adapter.d.ts +98 -0
- package/dist/loop/tool-adapter.js +364 -0
- package/dist/loop/tool-detail.d.ts +1 -1
- package/dist/loop/tool-detail.js +6 -5
- package/dist/loop/tool-outcome.d.ts +1 -1
- package/dist/loop/tool-output.d.ts +4 -4
- package/dist/loop/tool-output.js +2 -2
- package/dist/loop/turn-credentials.d.ts +34 -0
- package/dist/loop/turn-credentials.js +73 -0
- package/dist/loop/types.d.ts +29 -38
- package/dist/loop/types.js +2 -7
- package/dist/memory/ai-sdk-message-storage.d.ts +5 -5
- package/dist/memory/ai-sdk-message-storage.js +13 -11
- package/dist/memory/card-builders.d.ts +14 -14
- package/dist/memory/card-builders.js +19 -15
- package/dist/memory/conversation-display-recorder.d.ts +22 -4
- package/dist/memory/conversation-display-recorder.js +43 -24
- package/dist/memory/conversation-display-replay.js +3 -2
- package/dist/memory/conversation-display-storage.d.ts +15 -7
- package/dist/memory/conversation-display-storage.js +141 -36
- package/dist/memory/conversation-view.d.ts +4 -4
- package/dist/memory/conversation-view.js +5 -4
- package/dist/memory/count-tokens.js +10 -8
- package/dist/memory/derive-thread-title.d.ts +0 -13
- package/dist/memory/derive-thread-title.js +2 -1
- package/dist/memory/message-backfill.d.ts +12 -5
- package/dist/memory/message-backfill.js +5 -3
- package/dist/memory/thread-history.d.ts +36 -21
- package/dist/memory/thread-history.js +78 -54
- package/dist/memory/thread-store.d.ts +26 -17
- package/dist/memory/thread-store.js +15 -9
- package/dist/memory/tool-call-integrity.d.ts +2 -2
- package/dist/memory/tool-call-integrity.js +4 -3
- package/dist/memory/working-memory.d.ts +16 -12
- package/dist/memory/working-memory.js +72 -61
- package/dist/prompts/briefing.d.ts +12 -12
- package/dist/prompts/briefing.js +1 -1
- package/dist/prompts/synthesis-agent.d.ts +1 -1
- package/dist/prompts/synthesis-agent.js +6 -14
- package/dist/provenance/collector.d.ts +6 -6
- package/dist/provenance/collector.js +15 -8
- package/dist/provenance/exec-frame.d.ts +2 -2
- package/dist/provenance/exec-frame.js +6 -1
- package/dist/provenance/seam.d.ts +1 -4
- package/dist/provenance/types.d.ts +6 -6
- package/dist/providers/ai-sdk.d.ts +113 -62
- package/dist/providers/ai-sdk.js +283 -518
- package/dist/providers/embedding.d.ts +2 -2
- package/dist/providers/embedding.js +1 -1
- package/dist/providers/errors.d.ts +22 -2
- package/dist/providers/errors.js +98 -50
- package/dist/providers/prompt-cache.d.ts +8 -8
- package/dist/providers/prompt-cache.js +13 -11
- package/dist/providers/reasoning.d.ts +2 -2
- package/dist/providers/reasoning.js +2 -2
- package/dist/providers/types.d.ts +55 -94
- package/dist/reference-data/catalog.d.ts +2 -15
- package/dist/reference-data/catalog.js +25 -8
- package/dist/reference-data/receipt.d.ts +2 -2
- package/dist/report-model/assert-rules.js +1 -1
- package/dist/report-model/authoring-grammar.d.ts +211 -233
- package/dist/report-model/block-walk.d.ts +10 -10
- package/dist/report-model/block-walk.js +2 -0
- package/dist/report-model/draft-finish.d.ts +8 -8
- package/dist/report-model/draft-finish.js +1 -1
- package/dist/report-model/draft-hash.js +8 -7
- package/dist/report-model/draft-operations.d.ts +22 -10
- package/dist/report-model/draft-operations.js +48 -30
- package/dist/report-model/draft-read.d.ts +19 -7
- package/dist/report-model/draft-read.js +16 -6
- package/dist/report-model/draft.d.ts +844 -2
- package/dist/report-model/draft.js +3 -1
- package/dist/report-model/fixture-resolver.js +39 -16
- package/dist/report-model/pin-snapshot.d.ts +2 -2
- package/dist/report-model/pin-snapshot.js +15 -15
- package/dist/report-model/production-resolver.d.ts +18 -18
- package/dist/report-model/production-resolver.js +50 -42
- package/dist/report-model/reference-resolver.d.ts +26 -10
- package/dist/report-model/reference-resolver.js +68 -5
- package/dist/report-model/reference-stamp.js +30 -38
- package/dist/report-model/structural-validation.js +12 -4
- package/dist/report-model/validate.d.ts +7 -7
- package/dist/report-model/validate.js +6 -6
- package/dist/report-render/assets.d.ts +2 -2
- package/dist/report-render/assets.js +27 -3
- package/dist/report-render/chart-export.d.ts +10 -2
- package/dist/report-render/chart-export.js +37 -11
- package/dist/report-render/chart-presets.d.ts +8 -8
- package/dist/report-render/chart-presets.js +3 -3
- package/dist/report-render/chart-renderers.d.ts +23 -16
- package/dist/report-render/chart-renderers.js +74 -53
- package/dist/report-render/chart-toolbox.d.ts +2 -2
- package/dist/report-render/chart-toolbox.js +7 -6
- package/dist/report-render/chart.d.ts +15 -16
- package/dist/report-render/chart.js +369 -252
- package/dist/report-render/design.d.ts +36 -297
- package/dist/report-render/design.js +0 -12
- package/dist/report-render/figures/common.d.ts +12 -12
- package/dist/report-render/figures/common.js +42 -31
- package/dist/report-render/figures/dendrogram.d.ts +3 -3
- package/dist/report-render/figures/dendrogram.js +10 -10
- package/dist/report-render/figures/dense.js +15 -8
- package/dist/report-render/figures/dotplot.js +46 -33
- package/dist/report-render/figures/embedding.js +52 -43
- package/dist/report-render/figures/equal-units.d.ts +10 -10
- package/dist/report-render/figures/equal-units.js +27 -27
- package/dist/report-render/figures/forest.js +9 -7
- package/dist/report-render/figures/gsea.js +21 -11
- package/dist/report-render/figures/heatmap.js +13 -9
- package/dist/report-render/figures/index.d.ts +10 -10
- package/dist/report-render/figures/index.js +4 -2
- package/dist/report-render/figures/km.js +10 -9
- package/dist/report-render/figures/label-room.d.ts +12 -12
- package/dist/report-render/figures/label-room.js +7 -2
- package/dist/report-render/figures/locuszoom.d.ts +2 -2
- package/dist/report-render/figures/locuszoom.js +59 -31
- package/dist/report-render/figures/lollipop.js +3 -2
- package/dist/report-render/figures/ma.js +8 -4
- package/dist/report-render/figures/manhattan.d.ts +1 -2
- package/dist/report-render/figures/manhattan.js +52 -34
- package/dist/report-render/figures/oncoprint.js +4 -5
- package/dist/report-render/figures/pca.js +25 -11
- package/dist/report-render/figures/qq.js +20 -9
- package/dist/report-render/figures/roc.js +1 -1
- package/dist/report-render/figures/sankey.d.ts +2 -2
- package/dist/report-render/figures/sankey.js +11 -10
- package/dist/report-render/figures/upset.d.ts +6 -6
- package/dist/report-render/figures/upset.js +7 -4
- package/dist/report-render/figures/volcano.js +12 -10
- package/dist/report-render/hybrid-svg.d.ts +4 -4
- package/dist/report-render/hybrid-svg.js +7 -5
- package/dist/report-render/number-format.d.ts +4 -4
- package/dist/report-render/number-format.js +62 -27
- package/dist/report-render/page.js +2 -1
- package/dist/report-render/provenance-data.d.ts +2 -2
- package/dist/report-render/references.d.ts +4 -4
- package/dist/report-render/render.d.ts +2 -2
- package/dist/report-render/render.js +10 -11
- package/dist/report-render/script-json.js +1 -1
- package/dist/report-render/table-data.d.ts +6 -6
- package/dist/report-render/test/options.d.ts +49 -0
- package/dist/report-render/test/options.js +143 -0
- package/dist/report-render/test/page-function.d.ts +19 -0
- package/dist/report-render/test/page-function.js +33 -0
- package/dist/report-render/types.d.ts +10 -10
- package/dist/report-render/value-bridge.d.ts +4 -4
- package/dist/report-render/value-bridge.js +27 -14
- package/dist/report-render/views/chart-view.d.ts +2 -2
- package/dist/report-render/views/chart-view.js +2 -2
- package/dist/report-render/views/lineage.d.ts +6 -6
- package/dist/report-render/views/lineage.js +2 -0
- package/dist/report-render/views/page-view.d.ts +2 -2
- package/dist/report-render/views/page-view.js +1 -0
- package/dist/report-render/views/prose.js +25 -8
- package/dist/report-render/views/references-view.js +12 -1
- package/dist/report-render/views/values.js +1 -1
- package/dist/runtime/assemble.d.ts +53 -26
- package/dist/runtime/assemble.js +103 -56
- package/dist/runtime/boot.d.ts +8 -7
- package/dist/runtime/boot.js +1 -1
- package/dist/runtime/connection-budget.d.ts +6 -6
- package/dist/runtime/connection-budget.js +1 -1
- package/dist/runtime/dbos.d.ts +29 -19
- package/dist/runtime/dbos.js +35 -20
- package/dist/runtime/result-serialization.js +18 -5
- package/dist/runtime/shutdown.d.ts +2 -2
- package/dist/sandbox/client.d.ts +7 -3
- package/dist/sandbox/cpu-files.d.ts +2 -2
- package/dist/sandbox/cpu-files.js +21 -4
- package/dist/sandbox/create-sandbox.d.ts +7 -8
- package/dist/sandbox/create-sandbox.js +6 -12
- package/dist/sandbox/docker-client.d.ts +48 -3
- package/dist/sandbox/docker-client.js +10 -6
- package/dist/sandbox/estimate-data-profile-resources.js +2 -7
- package/dist/sandbox/exec-outcome.d.ts +2 -2
- package/dist/sandbox/exec-outcome.js +1 -1
- package/dist/sandbox/exec.d.ts +10 -6
- package/dist/sandbox/exec.js +27 -12
- package/dist/sandbox/execution-id.js +14 -6
- package/dist/sandbox/farm.d.ts +2 -2
- package/dist/sandbox/farm.js +22 -27
- package/dist/sandbox/identity.d.ts +7 -0
- package/dist/sandbox/identity.js +14 -3
- package/dist/sandbox/image-packages.js +15 -27
- package/dist/sandbox/k8s-client.d.ts +35 -8
- package/dist/sandbox/k8s-client.js +6 -5
- package/dist/sandbox/labels.js +1 -0
- package/dist/sandbox/liveness.js +3 -1
- package/dist/sandbox/mount-plan.d.ts +10 -10
- package/dist/sandbox/mount-plan.js +13 -14
- package/dist/sandbox/notification-sweep.d.ts +4 -4
- package/dist/sandbox/notification-sweep.js +4 -7
- package/dist/sandbox/package-identity.d.ts +6 -13
- package/dist/sandbox/package-identity.js +46 -28
- package/dist/sandbox/reaper.d.ts +10 -10
- package/dist/sandbox/reaper.js +4 -6
- package/dist/sandbox/sandbox-error.d.ts +2 -9
- package/dist/sandbox/sandbox-error.js +21 -8
- package/dist/sandbox/sandbox-step-translate.d.ts +8 -5
- package/dist/sandbox/sandbox-step-translate.js +22 -8
- package/dist/sandbox/step-sandbox.d.ts +47 -0
- package/dist/sandbox/step-sandbox.js +53 -0
- package/dist/sandbox/types.d.ts +18 -19
- package/dist/sandbox/types.js +1 -1
- package/dist/schemas/artifact-manifest.d.ts +4 -4
- package/dist/schemas/data-profile-schemas.d.ts +343 -298
- package/dist/schemas/file-metadata.js +2 -4
- package/dist/schemas/plan-schemas.d.ts +31 -31
- package/dist/schemas/run-synthesis.d.ts +95 -26
- package/dist/schemas/run-synthesis.js +3 -1
- package/dist/schemas/validate-plan.d.ts +4 -4
- package/dist/schemas/validate-plan.js +17 -5
- package/dist/schemas/workflow-state.d.ts +19 -19
- package/dist/schemas/workflow-state.js +2 -2
- package/dist/state/active-turns.d.ts +36 -0
- package/dist/state/active-turns.js +67 -0
- package/dist/state/analyses-metrics.d.ts +8 -8
- package/dist/state/analyses-metrics.js +4 -4
- package/dist/state/analyses.d.ts +0 -14
- package/dist/state/analyses.js +0 -32
- package/dist/state/artifacts.d.ts +32 -19
- package/dist/state/artifacts.js +28 -5
- package/dist/state/data-profile.d.ts +2 -2
- package/dist/state/db.d.ts +12 -2
- package/dist/state/db.js +5 -0
- package/dist/state/edit-intents.d.ts +4 -0
- package/dist/state/edit-intents.js +71 -0
- package/dist/state/index.d.ts +4 -4
- package/dist/state/index.js +2 -2
- package/dist/state/init.d.ts +2 -1
- package/dist/state/init.js +5 -2
- package/dist/state/migrations/20260927120000_baseline.js +3 -1
- package/dist/state/migrations/20261026120000_add_the_edit_intents.d.ts +7 -0
- package/dist/state/migrations/20261026120000_add_the_edit_intents.js +21 -0
- package/dist/state/migrations/20261027120000_record_the_applied_memory_edits.d.ts +7 -0
- package/dist/state/migrations/20261027120000_record_the_applied_memory_edits.js +16 -0
- package/dist/state/migrations/20261027120100_store_the_authoring_results.d.ts +8 -0
- package/dist/state/migrations/20261027120100_store_the_authoring_results.js +20 -0
- package/dist/state/migrations/20261027120200_key_the_groups_of_a_turn.d.ts +7 -0
- package/dist/state/migrations/20261027120200_key_the_groups_of_a_turn.js +12 -0
- package/dist/state/migrations/20261027120300_mark_the_active_turn_of_a_thread.d.ts +7 -0
- package/dist/state/migrations/20261027120300_mark_the_active_turn_of_a_thread.js +11 -0
- package/dist/state/migrations/20261028120000_record_the_paused_work.d.ts +7 -0
- package/dist/state/migrations/20261028120000_record_the_paused_work.js +25 -0
- package/dist/state/migrations/20261028120100_end_the_suspended_runs.d.ts +8 -0
- package/dist/state/migrations/20261028120100_end_the_suspended_runs.js +13 -0
- package/dist/state/migrations/20261029120000_reference_the_run_mandate.d.ts +7 -0
- package/dist/state/migrations/20261029120000_reference_the_run_mandate.js +23 -0
- package/dist/state/migrations/20261029120100_record_the_run_session_of_a_pause.d.ts +7 -0
- package/dist/state/migrations/20261029120100_record_the_run_session_of_a_pause.js +11 -0
- package/dist/state/migrations/index.js +18 -0
- package/dist/state/paused-work.d.ts +52 -0
- package/dist/state/paused-work.js +105 -0
- package/dist/state/plans.d.ts +27 -8
- package/dist/state/plans.js +14 -11
- package/dist/state/purge-analysis.d.ts +6 -6
- package/dist/state/purge-analysis.js +10 -2
- package/dist/state/report-session-state.d.ts +43 -18
- package/dist/state/report-session-state.js +43 -4
- package/dist/state/report-versions.d.ts +16 -11
- package/dist/state/report-versions.js +5 -3
- package/dist/state/runs.d.ts +30 -19
- package/dist/state/runs.js +43 -51
- package/dist/state/schema.d.ts +18 -21
- package/dist/state/schema.js +4 -5
- package/dist/state/snapshot-parse.d.ts +2 -2
- package/dist/state/snapshot-parse.js +14 -8
- package/dist/state/step-executions.d.ts +20 -8
- package/dist/state/step-executions.js +6 -4
- package/dist/state/tool-outputs.d.ts +2 -2
- package/dist/state/tool-outputs.js +2 -1
- package/dist/state/vector-store.d.ts +16 -16
- package/dist/state/vector-store.js +11 -7
- package/dist/tasks/data-profile-absorb.d.ts +3 -3
- package/dist/tasks/data-profile-absorb.js +21 -16
- package/dist/tasks/data-profile-activity.d.ts +5 -5
- package/dist/tasks/data-profile-activity.js +5 -5
- package/dist/tasks/data-profile-index.d.ts +4 -4
- package/dist/tasks/data-profile-index.js +32 -17
- package/dist/tasks/data-profile-resolve.d.ts +8 -8
- package/dist/tasks/data-profile-resolve.js +88 -62
- package/dist/tasks/data-profile.d.ts +40 -31
- package/dist/tasks/data-profile.js +138 -95
- package/dist/tasks/extract-values.d.ts +26 -79
- package/dist/tasks/extract-values.js +48 -108
- package/dist/tasks/refresh-regulatory-corpus.d.ts +4 -20
- package/dist/tasks/refresh-regulatory-corpus.js +12 -8
- package/dist/tasks/regulatory-corpus-boot-refresh.d.ts +2 -2
- package/dist/tasks/regulatory-corpus-boot-refresh.js +12 -10
- package/dist/testing.d.ts +60 -0
- package/dist/testing.js +96 -0
- package/dist/tools/ad-hoc-router.d.ts +9 -9
- package/dist/tools/ad-hoc-router.js +65 -52
- package/dist/tools/analysis-invocation.d.ts +7 -0
- package/dist/tools/analysis-invocation.js +29 -5
- package/dist/tools/approval/contract.d.ts +8 -52
- package/dist/tools/approval/contract.js +7 -36
- package/dist/tools/approval/gateway.d.ts +27 -28
- package/dist/tools/approval/gateway.js +33 -130
- package/dist/tools/approval/queries.d.ts +6 -11
- package/dist/tools/approval/queries.js +43 -29
- package/dist/tools/approval/uuidv7.js +2 -2
- package/dist/tools/bio/chembl.d.ts +3 -3
- package/dist/tools/bio/chembl.js +10 -0
- package/dist/tools/bio/comptox.d.ts +25 -8
- package/dist/tools/bio/comptox.js +4 -2
- package/dist/tools/bio/drug-gene-interactions.d.ts +27 -17
- package/dist/tools/bio/drug-gene-interactions.js +11 -8
- package/dist/tools/bio/gene-disease-evidence.d.ts +61 -15
- package/dist/tools/bio/gene-disease-evidence.js +10 -6
- package/dist/tools/bio/gene-preclinical-profile.d.ts +11 -11
- package/dist/tools/bio/keys.d.ts +2 -2
- package/dist/tools/bio/keys.js +3 -3
- package/dist/tools/bio/lookup-annotation.d.ts +5 -5
- package/dist/tools/bio/lookup-annotation.js +3 -0
- package/dist/tools/bio/opentargets.d.ts +1 -1
- package/dist/tools/bio/opentargets.js +6 -0
- package/dist/tools/bio/pubchem.d.ts +2 -2
- package/dist/tools/bio/pubchem.js +6 -0
- package/dist/tools/bio/pubmed.d.ts +26 -16
- package/dist/tools/bio/pubmed.js +9 -3
- package/dist/tools/bio/search-clinical-trials.d.ts +4 -4
- package/dist/tools/bio/search-clinical-trials.js +5 -1
- package/dist/tools/bio/search-faers.d.ts +2 -2
- package/dist/tools/bio/search-faers.js +1 -1
- package/dist/tools/bio/search-gene.d.ts +2 -2
- package/dist/tools/bio/search-gene.js +1 -0
- package/dist/tools/bio/search-geo-datasets.d.ts +4 -4
- package/dist/tools/bio/search-geo-datasets.js +5 -5
- package/dist/tools/bio/search-interactions.d.ts +1 -1
- package/dist/tools/bio/search-patents.d.ts +28 -22
- package/dist/tools/bio/search-patents.js +20 -17
- package/dist/tools/bio/search-protein.d.ts +2 -2
- package/dist/tools/bio/search-protein.js +1 -1
- package/dist/tools/bio/search-regulatory-approvals.d.ts +64 -18
- package/dist/tools/bio/search-regulatory-approvals.js +21 -16
- package/dist/tools/bio/target-safety.d.ts +8 -8
- package/dist/tools/bio/target-safety.js +11 -6
- package/dist/tools/capability-data.d.ts +9 -5
- package/dist/tools/capability-data.js +2 -1
- package/dist/tools/define-tool.d.ts +55 -46
- package/dist/tools/define-tool.js +39 -27
- package/dist/tools/display/normalize-echart-spec.d.ts +2 -2
- package/dist/tools/display/normalize-echart-spec.js +51 -27
- package/dist/tools/display/show-user.d.ts +2 -2
- package/dist/tools/display/show-user.js +1 -1
- package/dist/tools/execute-analysis.d.ts +19 -10
- package/dist/tools/execute-analysis.js +83 -62
- package/dist/tools/knowledge/check.d.ts +166 -44
- package/dist/tools/knowledge/check.js +5 -3
- package/dist/tools/knowledge/client.d.ts +31 -62
- package/dist/tools/knowledge/client.js +44 -27
- package/dist/tools/knowledge/environment.d.ts +6 -6
- package/dist/tools/knowledge/environment.js +18 -7
- package/dist/tools/knowledge/index.d.ts +2 -2
- package/dist/tools/knowledge/index.js +9 -9
- package/dist/tools/knowledge/local-slots.d.ts +4 -4
- package/dist/tools/knowledge/local-slots.js +11 -4
- package/dist/tools/knowledge/pin.d.ts +2 -2
- package/dist/tools/knowledge/recommend.d.ts +20 -45
- package/dist/tools/knowledge/recommend.js +27 -19
- package/dist/tools/knowledge/situation.d.ts +40 -40
- package/dist/tools/knowledge/situation.js +2 -9
- package/dist/tools/knowledge/skeleton.d.ts +4 -4
- package/dist/tools/knowledge/skeleton.js +10 -11
- package/dist/tools/knowledge/template.d.ts +20 -18
- package/dist/tools/knowledge/template.js +38 -32
- package/dist/tools/lib/alphafold-client.js +2 -1
- package/dist/tools/lib/amass-client.d.ts +28 -28
- package/dist/tools/lib/amass-client.js +20 -10
- package/dist/tools/lib/api-utils.d.ts +13 -3
- package/dist/tools/lib/api-utils.js +17 -3
- package/dist/tools/lib/bgee-client.d.ts +6 -6
- package/dist/tools/lib/bgee-client.js +16 -10
- package/dist/tools/lib/cbioportal-client.d.ts +4 -4
- package/dist/tools/lib/cbioportal-client.js +9 -8
- package/dist/tools/lib/chembl-client.d.ts +14 -14
- package/dist/tools/lib/chembl-client.js +11 -4
- package/dist/tools/lib/clinical-benchmarks-client.d.ts +4 -4
- package/dist/tools/lib/clinical-benchmarks-client.js +4 -7
- package/dist/tools/lib/clinical-trials-client.d.ts +18 -18
- package/dist/tools/lib/clinical-trials-client.js +10 -10
- package/dist/tools/lib/clinvar-client.d.ts +2 -2
- package/dist/tools/lib/clinvar-client.js +6 -6
- package/dist/tools/lib/ctx-ops.d.ts +23 -23
- package/dist/tools/lib/ctx-ops.js +13 -10
- package/dist/tools/lib/dgidb-client.d.ts +6 -6
- package/dist/tools/lib/dgidb-client.js +10 -12
- package/dist/tools/lib/disgenet-client.d.ts +4 -4
- package/dist/tools/lib/ema-client.d.ts +2 -2
- package/dist/tools/lib/ensembl-client.d.ts +4 -4
- package/dist/tools/lib/ensembl-client.js +5 -4
- package/dist/tools/lib/gwas-catalog-client.d.ts +4 -4
- package/dist/tools/lib/gwas-catalog-client.js +17 -17
- package/dist/tools/lib/html-text.d.ts +6 -0
- package/dist/tools/lib/html-text.js +9 -0
- package/dist/tools/lib/identifier-resolver.d.ts +4 -4
- package/dist/tools/lib/identifier-resolver.js +7 -3
- package/dist/tools/lib/impc-client.d.ts +8 -8
- package/dist/tools/lib/impc-client.js +46 -35
- package/dist/tools/lib/iuphar-client.d.ts +2 -2
- package/dist/tools/lib/iuphar-client.js +7 -16
- package/dist/tools/lib/monarch-client.d.ts +4 -4
- package/dist/tools/lib/openfda-client.d.ts +22 -22
- package/dist/tools/lib/openfda-client.js +23 -22
- package/dist/tools/lib/opentargets-client.d.ts +12 -12
- package/dist/tools/lib/pathway-client.d.ts +4 -4
- package/dist/tools/lib/pathway-client.js +15 -19
- package/dist/tools/lib/pharmgkb-client.d.ts +2 -2
- package/dist/tools/lib/pharmgkb-client.js +1 -1
- package/dist/tools/lib/protein-family-modality.d.ts +2 -2
- package/dist/tools/lib/protein-family-modality.js +0 -2
- package/dist/tools/lib/protein-family-normalize.js +7 -0
- package/dist/tools/lib/pubchem-client.d.ts +2 -2
- package/dist/tools/lib/pubchem-client.js +1 -0
- package/dist/tools/lib/pubchem-ops.d.ts +4 -4
- package/dist/tools/lib/pubchem-ops.js +8 -0
- package/dist/tools/lib/pubmed-client.d.ts +9 -9
- package/dist/tools/lib/pubmed-client.js +1 -1
- package/dist/tools/lib/string-client.d.ts +6 -6
- package/dist/tools/lib/uniprot-client.d.ts +8 -8
- package/dist/tools/lib/uniprot-client.js +5 -1
- package/dist/tools/memory/update-working-memory.d.ts +16 -13
- package/dist/tools/memory/update-working-memory.js +21 -3
- package/dist/tools/read-tool-output.js +8 -2
- package/dist/tools/registry.d.ts +2 -2
- package/dist/tools/report-authoring/authoring-tools.d.ts +54 -23
- package/dist/tools/report-authoring/authoring-tools.js +128 -62
- package/dist/tools/report-session/derive-table.d.ts +19 -59
- package/dist/tools/report-session/derive-table.js +120 -122
- package/dist/tools/report-session/examine-page.d.ts +6 -6
- package/dist/tools/report-session/examine-page.js +14 -12
- package/dist/tools/report-session/list-artifacts.d.ts +6 -6
- package/dist/tools/report-session/list-artifacts.js +5 -5
- package/dist/tools/report-session/page-faults.d.ts +6 -6
- package/dist/tools/report-session/page-faults.js +3 -1
- package/dist/tools/report-session/preview-report.d.ts +4 -3
- package/dist/tools/report-session/preview-report.js +26 -7
- package/dist/tools/report-session/record-version.d.ts +9 -4
- package/dist/tools/report-session/record-version.js +16 -9
- package/dist/tools/report-session/session-page-publisher.d.ts +6 -6
- package/dist/tools/research/generate-analogy-report.d.ts +14 -7
- package/dist/tools/research/generate-analogy-report.js +80 -76
- package/dist/tools/research/generate-plan.d.ts +16 -16
- package/dist/tools/research/generate-plan.js +410 -374
- package/dist/tools/research/guarded-address.js +3 -2
- package/dist/tools/research/inspect-data-profile.d.ts +27 -20
- package/dist/tools/research/inspect-data-profile.js +26 -25
- package/dist/tools/research/inspect-run.d.ts +54 -27
- package/dist/tools/research/inspect-run.js +50 -40
- package/dist/tools/research/literature-reviewer.d.ts +8 -7
- package/dist/tools/research/literature-reviewer.js +29 -28
- package/dist/tools/research/search-arxiv.d.ts +1 -1
- package/dist/tools/research/search-arxiv.js +1 -1
- package/dist/tools/research/search-github-repos.d.ts +10 -7
- package/dist/tools/research/search-github-repos.js +25 -22
- package/dist/tools/research/search-semantic-scholar.js +1 -1
- package/dist/tools/research/searxng-engine.d.ts +2 -2
- package/dist/tools/research/searxng-engine.js +6 -4
- package/dist/tools/research/web-fetch.d.ts +24 -21
- package/dist/tools/research/web-fetch.js +65 -74
- package/dist/tools/research/web-search.d.ts +26 -17
- package/dist/tools/research/web-search.js +26 -21
- package/dist/tools/sandbox/link-packages.d.ts +11 -7
- package/dist/tools/sandbox/link-packages.js +11 -8
- package/dist/tools/sandbox/list-available-packages.d.ts +17 -8
- package/dist/tools/sandbox/list-available-packages.js +31 -25
- package/dist/tools/sandbox/list-available-refs.d.ts +17 -14
- package/dist/tools/sandbox/list-available-refs.js +61 -36
- package/dist/tools/sandbox/report-blocker.d.ts +30 -37
- package/dist/tools/sandbox/report-blocker.js +23 -73
- package/dist/tools/sandbox/skills.d.ts +16 -12
- package/dist/tools/sandbox/skills.js +16 -12
- package/dist/tools/sandbox/submit-file-metadata.d.ts +12 -9
- package/dist/tools/sandbox/submit-file-metadata.js +18 -21
- package/dist/tools/start-report-session.d.ts +13 -5
- package/dist/tools/start-report-session.js +35 -8
- package/dist/tools/terminal-text.d.ts +5 -2
- package/dist/tools/terminal-text.js +35 -3
- package/dist/tools/workspace/decision-record.d.ts +4 -4
- package/dist/tools/workspace/decision-record.js +23 -13
- package/dist/tools/workspace/edit-file.d.ts +59 -20
- package/dist/tools/workspace/edit-file.js +81 -16
- package/dist/tools/workspace/execute-command.d.ts +15 -13
- package/dist/tools/workspace/execute-command.js +11 -9
- package/dist/tools/workspace/file-stat.d.ts +6 -3
- package/dist/tools/workspace/grep.d.ts +10 -7
- package/dist/tools/workspace/grep.js +9 -3
- package/dist/tools/workspace/list-files.d.ts +6 -3
- package/dist/tools/workspace/mutator.d.ts +28 -15
- package/dist/tools/workspace/mutator.js +107 -53
- package/dist/tools/workspace/read-file.d.ts +8 -5
- package/dist/tools/workspace/result-bounds.d.ts +5 -5
- package/dist/tools/workspace/result-bounds.js +4 -2
- package/dist/tools/workspace/run-exec.d.ts +2 -2
- package/dist/tools/workspace/run-exec.js +3 -3
- package/dist/tools/workspace/scan-inputs.d.ts +8 -5
- package/dist/tools/workspace/scan-inputs.js +17 -5
- package/dist/tools/workspace/show-file.d.ts +1 -1
- package/dist/tools/workspace/show-file.js +2 -1
- package/dist/tools/workspace/show-plan.d.ts +8 -5
- package/dist/tools/workspace/show-plan.js +9 -8
- package/dist/tools/workspace/workspace-search.d.ts +41 -13
- package/dist/tools/workspace/workspace-search.js +27 -14
- package/dist/tools/workspace/write-file.d.ts +9 -7
- package/dist/workflows/execute-analysis-scheduler.d.ts +9 -9
- package/dist/workflows/execute-analysis-scheduler.js +6 -3
- package/dist/workflows/execute-analysis.d.ts +46 -62
- package/dist/workflows/execute-analysis.js +137 -219
- package/dist/workflows/pause.d.ts +71 -0
- package/dist/workflows/pause.js +173 -0
- package/dist/workflows/sandbox-step.d.ts +38 -61
- package/dist/workflows/sandbox-step.js +99 -106
- package/dist/workflows/test/sql-writes.d.ts +21 -0
- package/dist/workflows/test/sql-writes.js +36 -0
- package/dist/workspace/filesystem.d.ts +6 -6
- package/dist/workspace/filesystem.js +10 -8
- package/dist/workspace/paths.d.ts +1 -1
- package/dist/workspace/paths.js +15 -4
- package/dist/workspace/search-config.d.ts +2 -2
- package/dist/workspace/search-config.js +1 -1
- package/package.json +21 -22
- package/dist/loop/call-guard.d.ts +0 -50
- package/dist/loop/call-guard.js +0 -90
- package/dist/loop/continue-agent.d.ts +0 -40
- package/dist/loop/continue-agent.js +0 -38
- package/dist/loop/genai-spans.d.ts +0 -47
- package/dist/loop/genai-spans.js +0 -134
- package/dist/loop/run-agent.d.ts +0 -245
- package/dist/loop/run-agent.js +0 -1124
- package/dist/loop/run-step.d.ts +0 -29
- package/dist/loop/run-step.js +0 -34
- package/dist/loop/run-to-terminal.d.ts +0 -66
- package/dist/loop/run-to-terminal.js +0 -93
- package/dist/loop/tool-mask.d.ts +0 -23
- package/dist/loop/tool-mask.js +0 -46
- package/dist/providers/streaming-chat.d.ts +0 -32
- package/dist/providers/streaming-chat.js +0 -91
- package/dist/tasks/derive-table-exec.d.ts +0 -54
- package/dist/tasks/derive-table-exec.js +0 -86
- package/dist/workflows/suspension.d.ts +0 -32
- package/dist/workflows/suspension.js +0 -38
|
@@ -5,10 +5,12 @@
|
|
|
5
5
|
* table that a block can bind: a join, a pivot, or an aggregate. The agent writes the script, and the record
|
|
6
6
|
* chains the derived table back to the evidence that made it.
|
|
7
7
|
*
|
|
8
|
-
* A session derivation is not an analysis run. It mints no run id,
|
|
8
|
+
* A session derivation is not an analysis run. It mints no run id, no mandate, and no artifact, and it writes
|
|
9
9
|
* under the session directory alone. The rails are the rails of the value tier (`tasks/extract-values.ts`):
|
|
10
|
-
*
|
|
11
|
-
*
|
|
10
|
+
* one ephemeral container inside the step of the call (`sandbox/step-sandbox.ts`), which goes away with the
|
|
11
|
+
* work. The container stays until the record lands, thus a rerun of the step before the record adopts the
|
|
12
|
+
* container and the exec record of the first attempt, and the script does not run again. A rerun after the
|
|
13
|
+
* record finds the record of its call, and it gives that table back.
|
|
12
14
|
*
|
|
13
15
|
* The container mounts the analysis tree read-only, and one write mount covers the `derived/` directory of
|
|
14
16
|
* the session alone. The script writes its table into that mount directly, thus a large table makes no
|
|
@@ -25,24 +27,19 @@
|
|
|
25
27
|
* The tool refuses an output name that the membership already holds. A record is immutable, and a second
|
|
26
28
|
* derivation of one table takes a new name.
|
|
27
29
|
*
|
|
28
|
-
* A composition with no sandbox client
|
|
29
|
-
*
|
|
30
|
-
*
|
|
31
|
-
*
|
|
32
|
-
* The container runs behind a seam, and never in the turn. An exec is a durable step of a workflow, and a
|
|
33
|
-
* report turn is not a workflow. Thus the tool takes an injected runner, and a registered workflow owns the
|
|
34
|
-
* container. The tool holds no sandbox client, and it imports no DBOS.
|
|
30
|
+
* A composition with no sandbox client cannot derive at all. The tool reports that condition one time, up
|
|
31
|
+
* front, the same discipline as the eyes. A per-attempt failure would instead read as a transient fault, and
|
|
32
|
+
* it would invite a repeat of a call that can never pass.
|
|
35
33
|
*/
|
|
36
34
|
import { ok } from "neverthrow";
|
|
37
|
-
import { unlink } from "node:fs/promises";
|
|
38
35
|
import { join } from "node:path";
|
|
39
36
|
import { z } from "zod";
|
|
40
37
|
import { createNoopLogger } from "../../lib/console-logger.js";
|
|
41
|
-
import { deliverNotice, passGate } from "../../lib/hooks.js";
|
|
42
38
|
import { classifyWithinRoot, computeSha256, computeSha256File } from "../../lib/fs-helpers.js";
|
|
43
39
|
import { defaultErrorFields } from "../../lib/logger.js";
|
|
44
40
|
import { snapshotEntry } from "../../report-model/reference-resolver.js";
|
|
45
|
-
import {
|
|
41
|
+
import { isWorkflowCancellation } from "../../runtime/dbos.js";
|
|
42
|
+
import { passSpawnSession, withStepSandbox } from "../../sandbox/step-sandbox.js";
|
|
46
43
|
import { isSafeId, reportSessionDerivedDir, toSandboxPath } from "../../workspace/paths.js";
|
|
47
44
|
import { defineTool } from "../define-tool.js";
|
|
48
45
|
import { openReportThread } from "../report-authoring/authoring-tools.js";
|
|
@@ -55,17 +52,17 @@ const deriveTableInput = z.object({
|
|
|
55
52
|
output: z.string().min(1),
|
|
56
53
|
});
|
|
57
54
|
/** The synthetic run id and step id of one derivation. Both are constants, and neither names a run row. */
|
|
58
|
-
|
|
59
|
-
|
|
55
|
+
const DERIVE_RUN_LITERAL = "derive-table";
|
|
56
|
+
const DERIVE_STEP_LITERAL = "derive";
|
|
60
57
|
/** The provenance agent id. No agent loop runs in the container, thus this names the derivation pass. */
|
|
61
58
|
const DERIVE_AGENT_ID = "table-deriver";
|
|
62
59
|
/** The exec budget of one derivation. It matches the budget of the value tier. */
|
|
63
|
-
|
|
60
|
+
const DERIVATION_DEADLINE_MS = 300_000;
|
|
64
61
|
/**
|
|
65
62
|
* The container size of one derivation. A join or a pivot loads each declared input into pandas at one
|
|
66
63
|
* time, thus the container needs the headroom of the value tier.
|
|
67
64
|
*/
|
|
68
|
-
|
|
65
|
+
const DERIVATION_RESOURCES = { cpu: 2, memoryGb: 8 };
|
|
69
66
|
/** The cap of the script, in bytes. A reshaping script sits far under it, and the command line carries it. */
|
|
70
67
|
const SCRIPT_CAP_BYTES = 64 * 1024;
|
|
71
68
|
/** The cap of the declared inputs. One derivation reads the evidence of a few artifacts, and never a tree. */
|
|
@@ -74,12 +71,23 @@ const INPUT_CAP = 20;
|
|
|
74
71
|
export const DERIVE_INPUT_ENV = "DERIVE_INPUTS";
|
|
75
72
|
/** The environment variable that carries the container path of the output file into the container. */
|
|
76
73
|
export const DERIVE_OUTPUT_ENV = "DERIVE_OUTPUT";
|
|
74
|
+
/**
|
|
75
|
+
* The shell of the exec: clear the output path, then run the script. The script rides as the first
|
|
76
|
+
* positional argument, thus `python3 -c` gets it byte for byte.
|
|
77
|
+
*
|
|
78
|
+
* The clearance belongs to the exec, and not to the host. A failed derivation can leave a file at the name
|
|
79
|
+
* that this one declares, and a script that writes nothing must not adopt those bytes as its table.
|
|
80
|
+
* sandbox-server runs one exec id one time, thus a rerun that attaches to the exec of an earlier attempt
|
|
81
|
+
* keeps the table of that exec. A clearance on the host would remove it.
|
|
82
|
+
*/
|
|
83
|
+
const CLEAR_THEN_RUN = `rm -f -- "$${DERIVE_OUTPUT_ENV}" && exec python3 -c "$1"`;
|
|
77
84
|
/** The cap of the failure detail that the tool copies out of the standard error of the script. */
|
|
78
85
|
const STDERR_TAIL_CAP = 2_000;
|
|
79
86
|
/** The line that the agent reads when the composition binds no sandbox rails. */
|
|
80
87
|
const NO_SANDBOX_DETAIL = "the composition gives no sandbox, thus this session cannot derive a table";
|
|
81
88
|
/**
|
|
82
|
-
* Build the sandbox exec of one derivation. The command
|
|
89
|
+
* Build the sandbox exec of one derivation. The command clears the output path, and then it runs the script
|
|
90
|
+
* of the agent through `python3 -c`.
|
|
83
91
|
*
|
|
84
92
|
* The working directory is the write mount, thus the script writes its table beside where it stands. Each
|
|
85
93
|
* declared input rides as its mounted path, thus the script opens the file wherever it works from. The
|
|
@@ -89,7 +97,7 @@ const NO_SANDBOX_DETAIL = "the composition gives no sandbox, thus this session c
|
|
|
89
97
|
*/
|
|
90
98
|
export function buildDerivationExec(args) {
|
|
91
99
|
return {
|
|
92
|
-
command: ["
|
|
100
|
+
command: ["sh", "-c", CLEAR_THEN_RUN, "derive_table", args.script],
|
|
93
101
|
cwd: args.workingDir,
|
|
94
102
|
env: {
|
|
95
103
|
[DERIVE_INPUT_ENV]: JSON.stringify(args.inputs.map((input) => ({ path: input.path, hash: input.hash }))),
|
|
@@ -130,7 +138,20 @@ export function describeExecFailure(result) {
|
|
|
130
138
|
export function createDeriveTableTool(deps) {
|
|
131
139
|
const logger = (deps.logger ?? createNoopLogger()).named("derive-table");
|
|
132
140
|
const observe = bindSessionEmit(deps.provenance, logger);
|
|
133
|
-
const
|
|
141
|
+
const observeDerived = (analysisId, threadId, result) => {
|
|
142
|
+
if (result.outcome !== "derived")
|
|
143
|
+
return;
|
|
144
|
+
observe({
|
|
145
|
+
type: "run-derivation",
|
|
146
|
+
analysisId,
|
|
147
|
+
threadId,
|
|
148
|
+
outputPath: result.path,
|
|
149
|
+
outputHash: result.hash,
|
|
150
|
+
scriptHash: result.scriptHash,
|
|
151
|
+
sources: result.sources,
|
|
152
|
+
});
|
|
153
|
+
};
|
|
154
|
+
const { sandboxClient } = deps;
|
|
134
155
|
return defineTool({
|
|
135
156
|
id: "derive_table",
|
|
136
157
|
description: "Derive one table from the pinned evidence with a Python script, and pin the result to this session. " +
|
|
@@ -149,15 +170,14 @@ export function createDeriveTableTool(deps) {
|
|
|
149
170
|
"A failed script gives back exec-failed with the tail of its standard error. " +
|
|
150
171
|
"The outcome unavailable means that this host cannot run a derivation, and a repeat gives the same outcome.",
|
|
151
172
|
inputSchema: deriveTableInput,
|
|
152
|
-
executionMode: "inline",
|
|
153
173
|
describeCall: (input) => `derive ${input.output}`,
|
|
154
174
|
// The derived path is the one durable product of the call, thus the derived arm names it. Each other
|
|
155
175
|
// arm is a condition that refused, and the kind of the arm is what a watcher must read.
|
|
156
176
|
describeResult: (_input, result) => (result.outcome === "derived" ? result.path : result.outcome),
|
|
157
177
|
execute: async (input, ctx) => {
|
|
158
178
|
// The check runs before every read, thus one clear signal replaces a failure for each attempt.
|
|
159
|
-
// It also narrows the
|
|
160
|
-
if (
|
|
179
|
+
// It also narrows the rail below, thus the exec needs no assertion.
|
|
180
|
+
if (sandboxClient === undefined) {
|
|
161
181
|
logger.warn("the composition gives no sandbox, thus no derivation can run");
|
|
162
182
|
return ok({ outcome: "unavailable", detail: NO_SANDBOX_DETAIL });
|
|
163
183
|
}
|
|
@@ -165,7 +185,7 @@ export function createDeriveTableTool(deps) {
|
|
|
165
185
|
if (opened.isErr()) {
|
|
166
186
|
return ok({ outcome: "refused", refusal: opened.error });
|
|
167
187
|
}
|
|
168
|
-
const { threadId, analysisId, state } = opened.value;
|
|
188
|
+
const { threadId, analysisId, state, derivations } = opened.value;
|
|
169
189
|
const bytes = Buffer.byteLength(input.script, "utf8");
|
|
170
190
|
if (bytes > SCRIPT_CAP_BYTES) {
|
|
171
191
|
return ok({
|
|
@@ -210,15 +230,6 @@ export function createDeriveTableTool(deps) {
|
|
|
210
230
|
// compose from the session-directory builder, thus the layout has one owner.
|
|
211
231
|
const writableTail = reportSessionDerivedDir(threadId);
|
|
212
232
|
const outputPath = `${writableTail}/${input.output}`;
|
|
213
|
-
// The served membership carries each derivation of the session, thus this one test refuses a
|
|
214
|
-
// repeated name and a collision with a pinned artifact alike.
|
|
215
|
-
if (snapshotEntry(state.snapshot, outputPath) !== undefined) {
|
|
216
|
-
return ok({
|
|
217
|
-
outcome: "repeated-name",
|
|
218
|
-
outputPath,
|
|
219
|
-
detail: `the evidence of this session already holds ${outputPath}, thus this derivation takes a new name`,
|
|
220
|
-
});
|
|
221
|
-
}
|
|
222
233
|
let root;
|
|
223
234
|
try {
|
|
224
235
|
root = await deps.resolveWorkspaceRoot(analysisId);
|
|
@@ -227,59 +238,56 @@ export function createDeriveTableTool(deps) {
|
|
|
227
238
|
logger.warn("the workspace root did not resolve", { threadId, analysisId, ...defaultErrorFields(cause) });
|
|
228
239
|
return ok({ outcome: "unavailable", detail: "the workspace root did not resolve, thus the derived table has no place to land" });
|
|
229
240
|
}
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
241
|
+
// A rerun of a call whose record landed gives that record back. The membership holds the output of
|
|
242
|
+
// the record by now, thus the name test below would refuse the call its own table.
|
|
243
|
+
const recorded = derivations.find((record) => record.toolCallId === ctx.invocationId);
|
|
244
|
+
if (recorded !== undefined) {
|
|
245
|
+
const replayed = {
|
|
246
|
+
outcome: "derived",
|
|
247
|
+
path: recorded.outputPath,
|
|
248
|
+
hash: recorded.outputHash,
|
|
249
|
+
scriptHash: recorded.scriptHash,
|
|
250
|
+
sources: [...recorded.sources],
|
|
251
|
+
columns: await readColumnsQuietly(outputPath, join(root, outputPath), logger),
|
|
252
|
+
};
|
|
253
|
+
// A crash between the record and the emit of the earlier run loses its event, thus the rerun
|
|
254
|
+
// emits again. A consumer can get the act two times, never zero times.
|
|
255
|
+
observeDerived(analysisId, threadId, replayed);
|
|
256
|
+
return ok(replayed);
|
|
242
257
|
}
|
|
243
|
-
|
|
244
|
-
//
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
try {
|
|
249
|
-
result = await derive({
|
|
250
|
-
runDerivation,
|
|
251
|
-
derivations: deps.derivations,
|
|
252
|
-
root,
|
|
253
|
-
threadId,
|
|
254
|
-
analysisId,
|
|
255
|
-
runSession: authorization.runSession,
|
|
256
|
-
script: input.script,
|
|
257
|
-
sources,
|
|
258
|
-
writableTail,
|
|
258
|
+
// The served membership carries each derivation of the session, thus this one test refuses a
|
|
259
|
+
// repeated name and a collision with a pinned artifact alike.
|
|
260
|
+
if (snapshotEntry(state.snapshot, outputPath) !== undefined) {
|
|
261
|
+
return ok({
|
|
262
|
+
outcome: "repeated-name",
|
|
259
263
|
outputPath,
|
|
260
|
-
|
|
261
|
-
logger,
|
|
264
|
+
detail: `the evidence of this session already holds ${outputPath}, thus this derivation takes a new name`,
|
|
262
265
|
});
|
|
263
|
-
// The record of the derivation lands before this point, thus the event states a table that
|
|
264
|
-
// the session already holds as evidence. Each other arm derived nothing.
|
|
265
|
-
if (result.outcome === "derived") {
|
|
266
|
-
observe({
|
|
267
|
-
type: "run-derivation",
|
|
268
|
-
analysisId,
|
|
269
|
-
threadId,
|
|
270
|
-
outputPath: result.path,
|
|
271
|
-
outputHash: result.hash,
|
|
272
|
-
scriptHash: result.scriptHash,
|
|
273
|
-
sources: result.sources,
|
|
274
|
-
});
|
|
275
|
-
}
|
|
276
|
-
return ok(result);
|
|
277
|
-
}
|
|
278
|
-
finally {
|
|
279
|
-
// The revoke is a notice: its failure changes no outcome of the call, thus it reaches the log
|
|
280
|
-
// alone. An absent result means that the work threw, and a throw is a failed derivation.
|
|
281
|
-
await deliverNotice(logger.with({ threadId, analysisId }), "RunAuthorizer.revoke", runAuthorizer.revoke(authorization, result?.outcome === "derived" ? "derive-table-completed" : "derive-table-failed"));
|
|
282
266
|
}
|
|
267
|
+
const result = await derive({
|
|
268
|
+
sandboxClient,
|
|
269
|
+
session: passSpawnSession(ctx.session, {
|
|
270
|
+
analysisId,
|
|
271
|
+
runId: DERIVE_RUN_LITERAL,
|
|
272
|
+
stepId: DERIVE_STEP_LITERAL,
|
|
273
|
+
agentId: DERIVE_AGENT_ID,
|
|
274
|
+
}),
|
|
275
|
+
derivations: deps.derivations,
|
|
276
|
+
root,
|
|
277
|
+
threadId,
|
|
278
|
+
analysisId,
|
|
279
|
+
toolCallId: ctx.invocationId,
|
|
280
|
+
script: input.script,
|
|
281
|
+
sources,
|
|
282
|
+
writableTail,
|
|
283
|
+
outputPath,
|
|
284
|
+
outputName: input.output,
|
|
285
|
+
logger,
|
|
286
|
+
});
|
|
287
|
+
// The record of the derivation lands before this point, thus the event states a table that the
|
|
288
|
+
// session already holds as evidence. Each other arm derived nothing.
|
|
289
|
+
observeDerived(analysisId, threadId, result);
|
|
290
|
+
return ok(result);
|
|
283
291
|
},
|
|
284
292
|
});
|
|
285
293
|
}
|
|
@@ -288,62 +296,51 @@ export function createDeriveTableTool(deps) {
|
|
|
288
296
|
*
|
|
289
297
|
* The order is the order of the evidence. The script writes into the write mount, the host classifies the
|
|
290
298
|
* file, the hash comes off the disk, and the record lands last. Thus the recorded hash is the hash of the
|
|
291
|
-
* file that a verifier reads.
|
|
299
|
+
* file that a verifier reads. The container goes away after the record.
|
|
292
300
|
*
|
|
293
301
|
* The classification is the guard of the read. A script can leave a symbolic link at the output name, and a
|
|
294
302
|
* link that resolves outside the tree would otherwise carry a host file into the evidence of the session.
|
|
295
|
-
*
|
|
296
|
-
* The output path clears before the exec. The host owns the `derived/` directory, and a failed attempt can
|
|
297
|
-
* leave a file at the name that this attempt declares. Without the clearance a script that writes nothing
|
|
298
|
-
* would adopt those bytes as its own table, and the record would chain a script to a file that it never
|
|
299
|
-
* wrote. A clearance fault refuses the derivation, because the same doubt stands.
|
|
300
303
|
*/
|
|
301
304
|
async function derive(args) {
|
|
302
|
-
const executionId = generateExecutionId(DERIVE_AGENT_ID);
|
|
303
305
|
const absolute = join(args.root, args.outputPath);
|
|
304
306
|
// The container sees the tree at its own mount point, thus each path that the script reads maps through
|
|
305
|
-
// the one host-to-container mapper and never through a formula here.
|
|
306
|
-
|
|
307
|
-
//
|
|
308
|
-
|
|
309
|
-
try {
|
|
310
|
-
await unlink(absolute);
|
|
311
|
-
}
|
|
312
|
-
catch (cause) {
|
|
313
|
-
if (cause.code !== "ENOENT") {
|
|
314
|
-
args.logger.error("the output path did not clear before the derivation", { threadId: args.threadId, ...defaultErrorFields(cause) });
|
|
315
|
-
return { outcome: "exec-failed", detail: `${args.outputName} already holds a file that did not clear, thus this derivation takes a new name` };
|
|
316
|
-
}
|
|
317
|
-
}
|
|
318
|
-
// The path mapper refuses a stored path that escapes the root, with a throw. It runs before the try,
|
|
319
|
-
// thus that refusal stays a throw and it never reads as a fault of the container.
|
|
320
|
-
const execInput = {
|
|
321
|
-
analysisId: args.analysisId,
|
|
322
|
-
runSession: args.runSession,
|
|
323
|
-
executionId,
|
|
307
|
+
// the one host-to-container mapper and never through a formula here. The mapper refuses a stored path
|
|
308
|
+
// that escapes the root with a throw. It runs before the try, thus that refusal stays a throw and it never
|
|
309
|
+
// reads as a fault of the container.
|
|
310
|
+
const request = buildDerivationExec({
|
|
324
311
|
script: args.script,
|
|
325
|
-
|
|
326
|
-
workingDir,
|
|
312
|
+
workingDir: toSandboxPath(args.root, args.analysisId, join(args.root, args.writableTail)),
|
|
327
313
|
inputs: args.sources.map((source) => ({ path: toSandboxPath(args.root, args.analysisId, join(args.root, source.path)), hash: source.hash })),
|
|
328
314
|
output: toSandboxPath(args.root, args.analysisId, absolute),
|
|
329
|
-
};
|
|
315
|
+
});
|
|
330
316
|
let ran;
|
|
331
317
|
try {
|
|
332
|
-
ran = await args.
|
|
318
|
+
ran = await withStepSandbox(args.sandboxClient, { session: args.session, spec: { resources: DERIVATION_RESOURCES, writableTail: args.writableTail } }, args.logger, async (exec) => {
|
|
319
|
+
const failure = describeExecFailure(await exec(request, DERIVATION_DEADLINE_MS));
|
|
320
|
+
if (failure !== undefined) {
|
|
321
|
+
return { outcome: "exec-failed", detail: failure };
|
|
322
|
+
}
|
|
323
|
+
return recordDerivedTable({ ...args, absolute });
|
|
324
|
+
});
|
|
333
325
|
}
|
|
334
326
|
catch (cause) {
|
|
327
|
+
if (isWorkflowCancellation(cause))
|
|
328
|
+
throw cause;
|
|
335
329
|
args.logger.error("the derivation exec did not complete", { threadId: args.threadId, ...defaultErrorFields(cause) });
|
|
336
330
|
return { outcome: "exec-failed", detail: "the derivation exec did not complete" };
|
|
337
331
|
}
|
|
338
332
|
if (ran.isErr()) {
|
|
339
|
-
return {
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
return { outcome: "exec-failed", detail: failure };
|
|
333
|
+
return {
|
|
334
|
+
outcome: "suspended",
|
|
335
|
+
reason: ran.error.reason,
|
|
336
|
+
detail: `the host refused the sandbox (${ran.error.reason}), thus the derivation did not run`,
|
|
337
|
+
};
|
|
345
338
|
}
|
|
346
|
-
|
|
339
|
+
return ran.value;
|
|
340
|
+
}
|
|
341
|
+
/** Classify, hash, and record the table that a green script wrote. */
|
|
342
|
+
async function recordDerivedTable(args) {
|
|
343
|
+
const verdict = await classifyWithinRoot(args.root, args.absolute).catch((cause) => {
|
|
347
344
|
args.logger.error("the derived table did not classify", { threadId: args.threadId, ...defaultErrorFields(cause) });
|
|
348
345
|
return "escaped";
|
|
349
346
|
});
|
|
@@ -361,7 +358,7 @@ async function derive(args) {
|
|
|
361
358
|
}
|
|
362
359
|
let outputHash;
|
|
363
360
|
try {
|
|
364
|
-
outputHash = await computeSha256File(absolute);
|
|
361
|
+
outputHash = await computeSha256File(args.absolute);
|
|
365
362
|
}
|
|
366
363
|
catch (cause) {
|
|
367
364
|
args.logger.error("the derived table did not hash", { threadId: args.threadId, ...defaultErrorFields(cause) });
|
|
@@ -373,6 +370,7 @@ async function derive(args) {
|
|
|
373
370
|
sources: [...args.sources],
|
|
374
371
|
scriptHash: computeSha256(Buffer.from(args.script, "utf8")),
|
|
375
372
|
script: args.script,
|
|
373
|
+
toolCallId: args.toolCallId,
|
|
376
374
|
};
|
|
377
375
|
const appended = await args.derivations.appendDerivation(args.threadId, record);
|
|
378
376
|
if (appended.isErr()) {
|
|
@@ -394,14 +392,14 @@ async function derive(args) {
|
|
|
394
392
|
}
|
|
395
393
|
// The columns describe the derived table the same way as the listing describes a pinned one. A file that
|
|
396
394
|
// gives no header gives no columns, and absence is a normal condition here.
|
|
397
|
-
const columns = await readColumnsQuietly(args.outputPath, absolute, args.logger);
|
|
395
|
+
const columns = await readColumnsQuietly(args.outputPath, args.absolute, args.logger);
|
|
398
396
|
return {
|
|
399
397
|
outcome: "derived",
|
|
400
398
|
path: args.outputPath,
|
|
401
399
|
hash: outputHash,
|
|
402
400
|
scriptHash: record.scriptHash,
|
|
403
401
|
sources: [...args.sources],
|
|
404
|
-
|
|
402
|
+
columns,
|
|
405
403
|
};
|
|
406
404
|
}
|
|
407
405
|
/**
|
|
@@ -56,12 +56,12 @@ import { type ChromeConfig } from "../../lib/chrome.js";
|
|
|
56
56
|
import type { GateFailure } from "../../lib/hooks.js";
|
|
57
57
|
import { type AcquireEyes } from "../../lib/eyes.js";
|
|
58
58
|
import { type Logger } from "../../lib/logger.js";
|
|
59
|
-
import { type CaptureCoverage, type CapturePage
|
|
59
|
+
import { type CaptureCoverage, type CapturePage } from "../../lib/page-capture.js";
|
|
60
60
|
import { type ResolveWorkspaceRoot } from "../../workspace/paths.js";
|
|
61
61
|
import { type Tool } from "../define-tool.js";
|
|
62
62
|
import { type ReportSessionStateGateway, type SessionRefusal } from "../report-authoring/authoring-tools.js";
|
|
63
63
|
import { type ConsoleErrorEntry, type FailedRequestEntry } from "./page-faults.js";
|
|
64
|
-
export type { CaptureCoverage, CapturePage, FailedRequest, PageCapture };
|
|
64
|
+
export type { CaptureCoverage, CapturePage, FailedRequest, PageCapture } from "../../lib/page-capture.js";
|
|
65
65
|
/**
|
|
66
66
|
* The URL formation of one look. It maps the page of the thread onto the URL that the browser opens.
|
|
67
67
|
* A composition whose browser cannot reach the workspace tree binds a resolver that names a served URL.
|
|
@@ -80,11 +80,11 @@ declare const examinePageInput: z.ZodObject<{
|
|
|
80
80
|
}, z.core.$strip>;
|
|
81
81
|
export type ExaminePageInput = z.infer<typeof examinePageInput>;
|
|
82
82
|
/** The document range of one slice of a tiled look, in the order that the pictures ride. */
|
|
83
|
-
export
|
|
83
|
+
export type ExaminedTile = {
|
|
84
84
|
index: number;
|
|
85
85
|
fromY: number;
|
|
86
86
|
toY: number;
|
|
87
|
-
}
|
|
87
|
+
};
|
|
88
88
|
/**
|
|
89
89
|
* The typed outcome of the eyes tool. Each arm is ok-channel data, thus the tool never throws for a
|
|
90
90
|
* degraded condition. `examined` carries the coverage of the look, the digest of the console errors and the
|
|
@@ -137,7 +137,7 @@ export type ExaminePageResult = {
|
|
|
137
137
|
* tree names a served URL instead. `capture` is optional and it replaces the whole transport, thus a test
|
|
138
138
|
* injects a seam that reads no browser.
|
|
139
139
|
*/
|
|
140
|
-
export
|
|
140
|
+
export type ExaminePageToolDeps = {
|
|
141
141
|
readonly gateway: ReportSessionStateGateway;
|
|
142
142
|
readonly resolveWorkspaceRoot: ResolveWorkspaceRoot;
|
|
143
143
|
readonly chrome: ChromeConfig;
|
|
@@ -154,7 +154,7 @@ export interface ExaminePageToolDeps {
|
|
|
154
154
|
readonly acquireMs?: number;
|
|
155
155
|
readonly releaseMs?: number;
|
|
156
156
|
};
|
|
157
|
-
}
|
|
157
|
+
};
|
|
158
158
|
/**
|
|
159
159
|
* Make the eyes tool over the session-state gateway, the workspace-root seam, and the eyes of the composition.
|
|
160
160
|
*
|
|
@@ -49,12 +49,16 @@
|
|
|
49
49
|
* deadline. A realization that hangs while it starts a browser would otherwise hold the whole agent turn,
|
|
50
50
|
* and no outcome would ever arrive.
|
|
51
51
|
*/
|
|
52
|
+
import { errorMessageOf } from "../../lib/thrown.js";
|
|
53
|
+
import { textOf } from "../../lib/unknown-text.js";
|
|
52
54
|
import { err, ok } from "neverthrow";
|
|
53
55
|
import { access } from "node:fs/promises";
|
|
54
56
|
import { join } from "node:path";
|
|
55
57
|
import { pathToFileURL } from "node:url";
|
|
58
|
+
import { setTimeout as sleep } from "node:timers/promises";
|
|
56
59
|
import { z } from "zod";
|
|
57
60
|
import { hasBrowserUrl } from "../../lib/chrome.js";
|
|
61
|
+
import { errnoOf } from "../../lib/fs-result.js";
|
|
58
62
|
import { createNoopLogger } from "../../lib/console-logger.js";
|
|
59
63
|
import { createStaticEyes } from "../../lib/eyes.js";
|
|
60
64
|
import { defaultErrorFields } from "../../lib/logger.js";
|
|
@@ -114,7 +118,7 @@ const ACQUIRE_DEADLINE_MS = 60_000;
|
|
|
114
118
|
* provisions.
|
|
115
119
|
*/
|
|
116
120
|
const RELEASE_DEADLINE_MS = 10_000;
|
|
117
|
-
/** The win of the
|
|
121
|
+
/** The win of the expiry arm. A symbol cannot collide with a value that the operation gives. */
|
|
118
122
|
const EXPIRED = Symbol("expired");
|
|
119
123
|
/**
|
|
120
124
|
* Run one operation against a deadline, and give the value, the cause, or the expiry.
|
|
@@ -122,19 +126,17 @@ const EXPIRED = Symbol("expired");
|
|
|
122
126
|
* The eyes seam takes no abort signal, thus a race is the whole bound. The loser of the race stays in
|
|
123
127
|
* flight, and the caller of an expired operation owns whatever arrives late.
|
|
124
128
|
*
|
|
125
|
-
*
|
|
126
|
-
* operation that wins its race would still keep the process alive for the rest of the budget.
|
|
129
|
+
* The abort after the race clears the wait of a settled operation, so no armed timer outlives the budget.
|
|
127
130
|
*/
|
|
128
131
|
async function withDeadline(work, ms) {
|
|
129
|
-
let timer;
|
|
130
132
|
// The settled arm never rejects. Thus a fault that arrives after the expiry stays contained here, and it
|
|
131
133
|
// never reaches the process as an unhandled rejection.
|
|
132
134
|
const settled = work.then((value) => ok(value), (cause) => err({ kind: "threw", cause }));
|
|
133
|
-
const
|
|
134
|
-
|
|
135
|
-
});
|
|
135
|
+
const gate = new AbortController();
|
|
136
|
+
// The rejection arm answers the abort of a settled race, and its value is never read.
|
|
137
|
+
const expiry = sleep(ms, undefined, { signal: gate.signal }).then(() => EXPIRED, () => EXPIRED);
|
|
136
138
|
const winner = await Promise.race([settled, expiry]);
|
|
137
|
-
|
|
139
|
+
gate.abort();
|
|
138
140
|
return winner === EXPIRED ? err({ kind: "expired" }) : winner;
|
|
139
141
|
}
|
|
140
142
|
/** The cause of one such fault. An expiry names its budget, thus the detail of the outcome names it too. */
|
|
@@ -153,6 +155,7 @@ function startSeamCall(call) {
|
|
|
153
155
|
return call();
|
|
154
156
|
}
|
|
155
157
|
catch (cause) {
|
|
158
|
+
// oxlint-disable-next-line typescript/prefer-promise-reject-errors -- the rejection reason is the thrown value itself; the awaiter reads its identity, and a wrapper would erase it.
|
|
156
159
|
return Promise.reject(cause);
|
|
157
160
|
}
|
|
158
161
|
}
|
|
@@ -251,7 +254,6 @@ export function createExaminePageTool(deps) {
|
|
|
251
254
|
"The outcomes no-page and missed-stamp mean that no preview rendered the current page: run preview_report, then look again. " +
|
|
252
255
|
"The outcome no-browser means that this host gives no browser, and a repeat gives the same outcome.",
|
|
253
256
|
inputSchema: examinePageInput,
|
|
254
|
-
executionMode: "inline",
|
|
255
257
|
describeCall: (input) => {
|
|
256
258
|
const blockId = input.blockId ?? undefined;
|
|
257
259
|
return blockId === undefined ? "look at the page" : `look at ${blockId}`;
|
|
@@ -288,7 +290,7 @@ export function createExaminePageTool(deps) {
|
|
|
288
290
|
await access(pagePath);
|
|
289
291
|
}
|
|
290
292
|
catch (cause) {
|
|
291
|
-
if (cause
|
|
293
|
+
if (errnoOf(cause) === "ENOENT") {
|
|
292
294
|
// No preview wrote the page yet. The agent runs the preview first.
|
|
293
295
|
return ok({ outcome: "no-page" });
|
|
294
296
|
}
|
|
@@ -330,7 +332,7 @@ export function createExaminePageTool(deps) {
|
|
|
330
332
|
if (looked.isErr()) {
|
|
331
333
|
const { stage, cause } = looked.error;
|
|
332
334
|
logger.warn(LOOK_FAULT_MESSAGE[stage], { threadId, analysisId, ...defaultErrorFields(cause) });
|
|
333
|
-
return ok({ outcome: "capture-failed", detail: cause
|
|
335
|
+
return ok({ outcome: "capture-failed", detail: errorMessageOf(cause) ?? textOf(cause) });
|
|
334
336
|
}
|
|
335
337
|
const captured = looked.value;
|
|
336
338
|
if (blockId !== undefined && captured.coverage.kind === "no-block") {
|
|
@@ -360,7 +362,7 @@ export function createExaminePageTool(deps) {
|
|
|
360
362
|
return ok(withToolResultImages({
|
|
361
363
|
outcome: "examined",
|
|
362
364
|
coverage: captured.coverage,
|
|
363
|
-
|
|
365
|
+
tiles: tiles.length === 0 ? undefined : tiles,
|
|
364
366
|
...digestPageFaults(captured.consoleErrors, captured.failedRequests),
|
|
365
367
|
pagePath: relativePagePath,
|
|
366
368
|
}, captured.screenshots.map((shot) => ({ base64: shot.base64, mediaType: SCREENSHOT_MEDIA_TYPE }))));
|
|
@@ -38,12 +38,12 @@ export type ListPinnedArtifactsInput = z.infer<typeof listPinnedArtifactsInput>;
|
|
|
38
38
|
* only for a header that the read recovered, thus their absence says nothing about the content of the file.
|
|
39
39
|
* The listing gives `columnCount`, and a call with a path gives `columns` as well.
|
|
40
40
|
*/
|
|
41
|
-
export
|
|
41
|
+
export type PinnedArtifact = {
|
|
42
42
|
path: string;
|
|
43
43
|
fileType?: string;
|
|
44
44
|
columnCount?: number;
|
|
45
45
|
columns?: string[];
|
|
46
|
-
}
|
|
46
|
+
};
|
|
47
47
|
/**
|
|
48
48
|
* One pinned citation of the listing: the key, and the short citation of its pinned record.
|
|
49
49
|
*
|
|
@@ -51,10 +51,10 @@ export interface PinnedArtifact {
|
|
|
51
51
|
* the pin recorded no citation for carries none, because absence is a normal condition. The description of
|
|
52
52
|
* the record stays out, because the listing is an orientation surface.
|
|
53
53
|
*/
|
|
54
|
-
export
|
|
54
|
+
export type PinnedCitation = {
|
|
55
55
|
key: string;
|
|
56
56
|
citation?: string;
|
|
57
|
-
}
|
|
57
|
+
};
|
|
58
58
|
/**
|
|
59
59
|
* The typed outcome of the listing tool. Each arm is ok-channel data, thus the tool never throws for one
|
|
60
60
|
* of them.
|
|
@@ -87,11 +87,11 @@ export type ListPinnedArtifactsResult = {
|
|
|
87
87
|
* `resolveWorkspaceRoot` maps the analysis of the call onto its workspace root, thus one singleton tool
|
|
88
88
|
* serves every analysis and it resolves the root per call from the scope.
|
|
89
89
|
*/
|
|
90
|
-
export
|
|
90
|
+
export type ListPinnedArtifactsToolDeps = {
|
|
91
91
|
readonly gateway: ReportSessionStateGateway;
|
|
92
92
|
readonly resolveWorkspaceRoot: ResolveWorkspaceRoot;
|
|
93
93
|
readonly logger?: Logger;
|
|
94
|
-
}
|
|
94
|
+
};
|
|
95
95
|
/**
|
|
96
96
|
* The header columns of a file on disk, or `undefined` when the file gives none.
|
|
97
97
|
*
|
|
@@ -27,9 +27,10 @@ import { extname } from "node:path";
|
|
|
27
27
|
import { z } from "zod";
|
|
28
28
|
import { resolveWorkspacePath } from "../../workspace/paths.js";
|
|
29
29
|
import { createNoopLogger } from "../../lib/console-logger.js";
|
|
30
|
+
import { splitLines } from "../../lib/text.js";
|
|
30
31
|
import { tryFs } from "../../lib/fs-result.js";
|
|
31
32
|
import { defaultErrorFields } from "../../lib/logger.js";
|
|
32
|
-
import { citationRecordOf, fileTypeHoldsNoCell } from "../../report-model/reference-resolver.js";
|
|
33
|
+
import { citationRecordOf, fileTypeHoldsNoCell, snapshotEntry } from "../../report-model/reference-resolver.js";
|
|
33
34
|
import { defineTool } from "../define-tool.js";
|
|
34
35
|
import { openReportThread } from "../report-authoring/authoring-tools.js";
|
|
35
36
|
/** No path lists the pinned set. A path gives the header columns of that one pinned artifact. */
|
|
@@ -87,7 +88,7 @@ async function readHeaderLine(absolute) {
|
|
|
87
88
|
if (head === undefined) {
|
|
88
89
|
return undefined;
|
|
89
90
|
}
|
|
90
|
-
const line = head.text.
|
|
91
|
+
const [line = ""] = splitLines(head.text).slice(0, 1);
|
|
91
92
|
if (line.length === 0) {
|
|
92
93
|
return undefined;
|
|
93
94
|
}
|
|
@@ -147,7 +148,6 @@ export function createListPinnedArtifactsTool(deps) {
|
|
|
147
148
|
"Read the listing to orient before you bind a block. Read the columns of one artifact to choose the column that a locator names. " +
|
|
148
149
|
"A reference names the path alone: the session stamps the hash from this evidence, thus the tool gives no hash.",
|
|
149
150
|
inputSchema: listPinnedArtifactsInput,
|
|
150
|
-
executionMode: "inline",
|
|
151
151
|
describeCall: (input) => input.path ?? "the pinned set",
|
|
152
152
|
// The size of the listing is what a watcher reads, and the cap makes that size differ from the
|
|
153
153
|
// pinned set. Thus a truncated listing names the total beside the count, and a whole listing names
|
|
@@ -180,8 +180,8 @@ export function createListPinnedArtifactsTool(deps) {
|
|
|
180
180
|
logger.warn("the workspace root did not resolve", { threadId, analysisId, ...defaultErrorFields(cause) });
|
|
181
181
|
}
|
|
182
182
|
const describe = async (path) => {
|
|
183
|
-
const fileType = state.snapshot
|
|
184
|
-
const artifact = { path,
|
|
183
|
+
const fileType = snapshotEntry(state.snapshot, path)?.fileType ?? undefined;
|
|
184
|
+
const artifact = { path, fileType };
|
|
185
185
|
if (root === undefined || fileTypeHoldsNoCell(fileType)) {
|
|
186
186
|
return { artifact };
|
|
187
187
|
}
|
|
@@ -4,25 +4,25 @@
|
|
|
4
4
|
*/
|
|
5
5
|
import type { FailedRequest } from "../../lib/page-capture.js";
|
|
6
6
|
/** One distinct console error of a look, and how many times the page logged it. */
|
|
7
|
-
export
|
|
7
|
+
export type ConsoleErrorEntry = {
|
|
8
8
|
text: string;
|
|
9
9
|
count: number;
|
|
10
|
-
}
|
|
10
|
+
};
|
|
11
11
|
/** One distinct failed request of a look, and how many times the page made it. */
|
|
12
|
-
export
|
|
12
|
+
export type FailedRequestEntry = {
|
|
13
13
|
url: string;
|
|
14
14
|
reason: string;
|
|
15
15
|
count: number;
|
|
16
|
-
}
|
|
16
|
+
};
|
|
17
17
|
/** The digest of one look. `omittedFaults` counts the distinct entries that the cap left out, thus a cut is never silent. */
|
|
18
|
-
export
|
|
18
|
+
export type PageFaults = {
|
|
19
19
|
consoleErrors: ConsoleErrorEntry[];
|
|
20
20
|
failedRequests: FailedRequestEntry[];
|
|
21
21
|
omittedFaults?: {
|
|
22
22
|
consoleErrors: number;
|
|
23
23
|
failedRequests: number;
|
|
24
24
|
};
|
|
25
|
-
}
|
|
25
|
+
};
|
|
26
26
|
/** Shorten one fault text: the inline data becomes placeholders, and the text stops at the cap. */
|
|
27
27
|
export declare function shortenFaultText(text: string): string;
|
|
28
28
|
/** Digest the raw faults of one capture into the short lists that the agent reads. */
|