@inflexa-ai/harness 0.45.1 → 0.46.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +6 -3
- package/dist/agents/conversation-agent.d.ts +9 -3
- package/dist/agents/conversation-agent.js +34 -33
- package/dist/agents/report-session-agent.d.ts +15 -15
- package/dist/agents/report-session-agent.js +23 -15
- package/dist/agents/sandbox/index.d.ts +1 -1
- package/dist/agents/sandbox/index.js +1 -1
- package/dist/agents/sandbox/shared.d.ts +12 -14
- package/dist/agents/sandbox/shared.js +18 -12
- package/dist/agents/sandbox/types.d.ts +4 -4
- package/dist/agents/sandbox/validate-skills.d.ts +2 -2
- package/dist/agents/sandbox/validate-skills.js +3 -1
- package/dist/agents/sandbox-catalog.d.ts +2 -2
- package/dist/agents/sandbox-catalog.js +3 -3
- package/dist/agents/system-prompt.d.ts +2 -2
- package/dist/app/chat-turn-workflow.d.ts +114 -0
- package/dist/app/chat-turn-workflow.js +306 -0
- package/dist/app/chat-turn.d.ts +85 -57
- package/dist/app/chat-turn.js +123 -100
- package/dist/app/data-profile-orientation.js +10 -8
- package/dist/app/data-profile-view.d.ts +4 -4
- package/dist/app/data-profile-view.js +9 -8
- package/dist/app/in-process-turn.d.ts +42 -0
- package/dist/app/in-process-turn.js +139 -0
- package/dist/app/message-assembly.d.ts +10 -4
- package/dist/app/message-assembly.js +13 -8
- package/dist/app/report-session-runtime.d.ts +4 -4
- package/dist/app/report-session-runtime.js +36 -21
- package/dist/app/spawn-report-session.d.ts +33 -28
- package/dist/app/spawn-report-session.js +25 -40
- package/dist/app/synthesize-run.d.ts +22 -16
- package/dist/app/synthesize-run.js +41 -35
- package/dist/app/work.d.ts +96 -0
- package/dist/app/work.js +147 -0
- package/dist/auth/local-auth-context.d.ts +1 -3
- package/dist/auth/local-auth-context.js +1 -3
- package/dist/auth/local-run-authorizer.d.ts +1 -1
- package/dist/auth/local-run-authorizer.js +5 -3
- package/dist/auth/types.d.ts +26 -26
- package/dist/billing/cached-resolver.d.ts +4 -4
- package/dist/billing/run-charge.d.ts +5 -8
- package/dist/billing/run-charge.js +2 -2
- package/dist/billing/usage-recorder.d.ts +9 -9
- package/dist/citations/aggregate.js +1 -1
- package/dist/citations/clients/arxiv.d.ts +2 -2
- package/dist/citations/clients/arxiv.js +12 -4
- package/dist/citations/clients/common.js +4 -2
- package/dist/citations/clients/crossref.d.ts +2 -2
- package/dist/citations/clients/crossref.js +37 -37
- package/dist/citations/clients/doi-registry.js +15 -16
- package/dist/citations/clients/pubmed.d.ts +2 -2
- package/dist/citations/clients/pubmed.js +20 -13
- package/dist/citations/clients/semantic-scholar.d.ts +2 -2
- package/dist/citations/clients/semantic-scholar.js +9 -9
- package/dist/citations/compare.js +2 -2
- package/dist/citations/match.d.ts +2 -2
- package/dist/citations/match.js +12 -7
- package/dist/citations/normalize.js +35 -26
- package/dist/citations/plan.js +6 -2
- package/dist/citations/resolve.d.ts +6 -6
- package/dist/citations/resolve.js +34 -25
- package/dist/citations/types.d.ts +77 -77
- package/dist/config/environment-stores.d.ts +6 -6
- package/dist/config/resource-limits.js +1 -3
- package/dist/contracts/analogy-report.d.ts +7 -7
- package/dist/contracts/analogy-report.js +2 -2
- package/dist/contracts/chat-events.d.ts +38 -24
- package/dist/contracts/chat-frame.d.ts +15 -5
- package/dist/contracts/chat-frame.js +64 -41
- package/dist/contracts/chat-parts.d.ts +130 -67
- package/dist/contracts/chat-parts.js +1 -0
- package/dist/contracts/content-url.js +16 -2
- package/dist/contracts/data-profile.d.ts +38 -38
- package/dist/contracts/index.d.ts +2 -2
- package/dist/contracts/index.js +1 -1
- package/dist/contracts/message.d.ts +6 -6
- package/dist/contracts/organ-system.d.ts +11 -11
- package/dist/contracts/part-registry.d.ts +5 -4
- package/dist/contracts/part-registry.js +5 -0
- package/dist/contracts/profile-vocabulary.d.ts +11 -10
- package/dist/contracts/profile-vocabulary.js +10 -3
- package/dist/contracts/report-blocks.d.ts +329 -329
- package/dist/contracts/report-reference.d.ts +105 -81
- package/dist/contracts/report-reference.js +30 -13
- package/dist/contracts/schemas/chat-events.d.ts +30 -16
- package/dist/contracts/schemas/chat-events.js +15 -6
- package/dist/contracts/schemas/chat-parts.d.ts +175 -102
- package/dist/contracts/schemas/chat-parts.js +33 -7
- package/dist/contracts/severity.d.ts +1 -1
- package/dist/contracts/structure-source.d.ts +3 -3
- package/dist/contracts/structure-source.js +6 -2
- package/dist/contracts/subagent-activity.d.ts +2 -2
- package/dist/contracts/subagent-activity.js +5 -3
- package/dist/contracts/usage.d.ts +2 -2
- package/dist/data/safety-panel-schema.d.ts +25 -25
- package/dist/data/safety-panel-schema.js +13 -4
- package/dist/execution/artifact-metadata.d.ts +23 -15
- package/dist/execution/artifact-metadata.js +33 -10
- package/dist/execution/artifact-record.d.ts +2 -2
- package/dist/execution/artifact-registration.d.ts +5 -5
- package/dist/execution/artifact-registry.d.ts +8 -8
- package/dist/execution/dbos-run-launcher.d.ts +24 -4
- package/dist/execution/dbos-run-launcher.js +58 -4
- package/dist/execution/dbos-workflow-purger.d.ts +5 -6
- package/dist/execution/dbos-workflow-purger.js +8 -7
- package/dist/execution/input-signature.d.ts +2 -2
- package/dist/execution/post-step-pipeline.d.ts +9 -9
- package/dist/execution/post-step-pipeline.js +1 -1
- package/dist/execution/post-step.js +2 -2
- package/dist/execution/reconcile-manifest.d.ts +4 -4
- package/dist/execution/reconcile-manifest.js +3 -2
- package/dist/execution/run-authorizer.d.ts +46 -37
- package/dist/execution/run-authorizer.js +8 -8
- package/dist/execution/run-canceler.d.ts +7 -7
- package/dist/execution/run-canceler.js +14 -7
- package/dist/execution/run-end-record.d.ts +2 -3
- package/dist/execution/run-event-parts.d.ts +0 -8
- package/dist/execution/run-event-parts.js +29 -24
- package/dist/execution/run-event-stream.d.ts +8 -8
- package/dist/execution/run-event-stream.js +3 -4
- package/dist/execution/run-launcher.d.ts +4 -4
- package/dist/execution/run-synthesis.d.ts +49 -48
- package/dist/execution/run-synthesis.js +96 -255
- package/dist/execution/staged-input.d.ts +2 -2
- package/dist/execution/step-summary.d.ts +6 -6
- package/dist/execution/step-summary.js +4 -8
- package/dist/execution/topo-sort.js +4 -3
- package/dist/execution/workflow-purger.d.ts +2 -2
- package/dist/index.d.ts +17 -20
- package/dist/index.js +25 -36
- package/dist/input-sanitization.js +9 -2
- package/dist/input-scan/clustering.d.ts +6 -6
- package/dist/input-scan/clustering.js +11 -5
- package/dist/input-scan/companions.js +3 -2
- package/dist/input-scan/detect-sets.d.ts +2 -2
- package/dist/input-scan/detect-sets.js +25 -21
- package/dist/input-scan/enrich.d.ts +6 -6
- package/dist/input-scan/enrich.js +29 -12
- package/dist/input-scan/formats.d.ts +2 -2
- package/dist/input-scan/formats.js +8 -2
- package/dist/input-scan/markers.d.ts +2 -2
- package/dist/input-scan/markers.js +14 -5
- package/dist/input-scan/menu.d.ts +10 -10
- package/dist/input-scan/menu.js +0 -0
- package/dist/input-scan/quarantine.d.ts +2 -2
- package/dist/input-scan/quarantine.js +23 -18
- package/dist/input-scan/readout-budget.d.ts +2 -2
- package/dist/input-scan/readout-budget.js +1 -1
- package/dist/input-scan/readout.d.ts +2 -2
- package/dist/input-scan/readout.js +47 -34
- package/dist/input-scan/scan.d.ts +2 -2
- package/dist/input-scan/scan.js +7 -5
- package/dist/input-scan/set-types.d.ts +28 -28
- package/dist/input-scan/shapes.d.ts +4 -4
- package/dist/input-scan/shapes.js +0 -0
- package/dist/input-scan/templates.d.ts +10 -10
- package/dist/input-scan/templates.js +30 -22
- package/dist/input-scan/tokens.d.ts +6 -4
- package/dist/input-scan/tokens.js +100 -38
- package/dist/input-scan/types.d.ts +22 -22
- package/dist/lib/async-utils.d.ts +3 -7
- package/dist/lib/async-utils.js +5 -9
- package/dist/lib/cache.js +1 -1
- package/dist/lib/chrome.d.ts +46 -6
- package/dist/lib/console-logger.js +2 -2
- package/dist/lib/db-result.d.ts +22 -6
- package/dist/lib/db-result.js +9 -13
- package/dist/lib/eyes.d.ts +4 -4
- package/dist/lib/eyes.js +1 -1
- package/dist/lib/fs-helpers.js +18 -6
- package/dist/lib/fs-result.d.ts +1 -0
- package/dist/lib/fs-result.js +5 -6
- package/dist/lib/hooks.d.ts +32 -7
- package/dist/lib/hooks.js +22 -3
- package/dist/lib/host-concurrency.js +3 -2
- package/dist/lib/logger.d.ts +2 -2
- package/dist/lib/logger.js +2 -1
- package/dist/lib/metrics.d.ts +1 -1
- package/dist/lib/null-proto.d.ts +6 -0
- package/dist/lib/null-proto.js +17 -0
- package/dist/lib/otel-spans.d.ts +1 -1
- package/dist/lib/otel-spans.js +9 -5
- package/dist/lib/otel.d.ts +4 -2
- package/dist/lib/otel.js +10 -2
- package/dist/lib/page-capture.d.ts +8 -8
- package/dist/lib/page-capture.js +9 -4
- package/dist/lib/parse-json.d.ts +5 -0
- package/dist/lib/parse-json.js +12 -0
- package/dist/lib/present.d.ts +12 -0
- package/dist/lib/present.js +39 -0
- package/dist/lib/rate-limit.d.ts +4 -4
- package/dist/lib/rate-limit.js +12 -13
- package/dist/lib/regulatory-corpus/fetch-fda-guidance.d.ts +4 -4
- package/dist/lib/regulatory-corpus/fetch-fda-guidance.js +4 -10
- package/dist/lib/regulatory-corpus/fetch-ich.d.ts +4 -4
- package/dist/lib/regulatory-corpus/fetch-ich.js +18 -14
- package/dist/lib/regulatory-corpus/normalize-whitespace.d.ts +6 -0
- package/dist/lib/regulatory-corpus/normalize-whitespace.js +41 -0
- package/dist/lib/regulatory-corpus.d.ts +10 -10
- package/dist/lib/regulatory-corpus.js +3 -1
- package/dist/lib/result.d.ts +10 -11
- package/dist/lib/result.js +15 -13
- package/dist/lib/storage.d.ts +2 -2
- package/dist/lib/test/async-iterable.d.ts +9 -0
- package/dist/lib/test/async-iterable.js +28 -0
- package/dist/lib/test/request-url.d.ts +5 -0
- package/dist/lib/test/request-url.js +7 -0
- package/dist/lib/test/result-assert.d.ts +12 -0
- package/dist/lib/test/result-assert.js +17 -0
- package/dist/lib/test/text-shapes.d.ts +24 -0
- package/dist/lib/test/text-shapes.js +63 -0
- package/dist/lib/text.d.ts +22 -0
- package/dist/lib/text.js +68 -0
- package/dist/lib/thrown.d.ts +18 -0
- package/dist/lib/thrown.js +30 -0
- package/dist/lib/unknown-array.d.ts +6 -0
- package/dist/lib/unknown-array.js +8 -0
- package/dist/lib/unknown-containers.d.ts +14 -0
- package/dist/lib/unknown-containers.js +17 -0
- package/dist/lib/unknown-text.d.ts +8 -0
- package/dist/lib/unknown-text.js +28 -0
- package/dist/lib/zod-issue-shape.d.ts +1 -1
- package/dist/lib/zod-issue-shape.js +31 -31
- package/dist/lib/zod-issues.d.ts +3 -3
- package/dist/lib/zod-issues.js +30 -17
- package/dist/literature/sources/arxiv.d.ts +6 -6
- package/dist/literature/sources/arxiv.js +92 -35
- package/dist/literature/sources/http.d.ts +2 -2
- package/dist/literature/sources/http.js +16 -15
- package/dist/literature/sources/pubmed.d.ts +16 -16
- package/dist/literature/sources/pubmed.js +96 -61
- package/dist/literature/sources/semantic-scholar.d.ts +8 -8
- package/dist/literature/sources/semantic-scholar.js +22 -13
- package/dist/loop/accounting.d.ts +63 -0
- package/dist/loop/accounting.js +141 -0
- package/dist/loop/call-policy.d.ts +73 -0
- package/dist/loop/call-policy.js +109 -0
- package/dist/loop/chat-stream.d.ts +62 -0
- package/dist/loop/chat-stream.js +237 -0
- package/dist/loop/compaction.d.ts +9 -9
- package/dist/loop/compaction.js +1 -1
- package/dist/loop/metrics.d.ts +12 -15
- package/dist/loop/metrics.js +14 -26
- package/dist/loop/run-loop.d.ts +233 -0
- package/dist/loop/run-loop.js +770 -0
- package/dist/loop/sub-agent.d.ts +61 -0
- package/dist/loop/sub-agent.js +160 -0
- package/dist/loop/tool-adapter.d.ts +98 -0
- package/dist/loop/tool-adapter.js +364 -0
- package/dist/loop/tool-detail.d.ts +1 -1
- package/dist/loop/tool-detail.js +6 -5
- package/dist/loop/tool-outcome.d.ts +1 -1
- package/dist/loop/tool-output.d.ts +4 -4
- package/dist/loop/tool-output.js +2 -2
- package/dist/loop/turn-credentials.d.ts +39 -0
- package/dist/loop/turn-credentials.js +90 -0
- package/dist/loop/types.d.ts +29 -38
- package/dist/loop/types.js +2 -7
- package/dist/memory/ai-sdk-message-storage.d.ts +5 -5
- package/dist/memory/ai-sdk-message-storage.js +13 -11
- package/dist/memory/card-builders.d.ts +14 -14
- package/dist/memory/card-builders.js +19 -15
- package/dist/memory/conversation-display-recorder.d.ts +22 -4
- package/dist/memory/conversation-display-recorder.js +43 -24
- package/dist/memory/conversation-display-replay.js +3 -2
- package/dist/memory/conversation-display-storage.d.ts +15 -7
- package/dist/memory/conversation-display-storage.js +141 -36
- package/dist/memory/conversation-view.d.ts +4 -4
- package/dist/memory/conversation-view.js +5 -4
- package/dist/memory/count-tokens.js +10 -8
- package/dist/memory/derive-thread-title.d.ts +0 -13
- package/dist/memory/derive-thread-title.js +2 -1
- package/dist/memory/message-backfill.d.ts +12 -5
- package/dist/memory/message-backfill.js +5 -3
- package/dist/memory/thread-history.d.ts +36 -21
- package/dist/memory/thread-history.js +78 -54
- package/dist/memory/thread-store.d.ts +26 -17
- package/dist/memory/thread-store.js +15 -9
- package/dist/memory/tool-call-integrity.d.ts +2 -2
- package/dist/memory/tool-call-integrity.js +4 -3
- package/dist/memory/working-memory.d.ts +16 -12
- package/dist/memory/working-memory.js +72 -61
- package/dist/prompts/briefing.d.ts +12 -12
- package/dist/prompts/briefing.js +1 -1
- package/dist/prompts/synthesis-agent.d.ts +1 -1
- package/dist/prompts/synthesis-agent.js +6 -14
- package/dist/provenance/collector.d.ts +6 -6
- package/dist/provenance/collector.js +15 -8
- package/dist/provenance/exec-frame.d.ts +2 -2
- package/dist/provenance/exec-frame.js +6 -1
- package/dist/provenance/seam.d.ts +1 -4
- package/dist/provenance/types.d.ts +6 -6
- package/dist/providers/ai-sdk.d.ts +113 -62
- package/dist/providers/ai-sdk.js +283 -518
- package/dist/providers/embedding.d.ts +2 -2
- package/dist/providers/embedding.js +1 -1
- package/dist/providers/errors.d.ts +22 -2
- package/dist/providers/errors.js +98 -50
- package/dist/providers/prompt-cache.d.ts +8 -8
- package/dist/providers/prompt-cache.js +13 -11
- package/dist/providers/reasoning.d.ts +2 -2
- package/dist/providers/reasoning.js +2 -2
- package/dist/providers/request-headers.js +12 -3
- package/dist/providers/types.d.ts +55 -94
- package/dist/reference-data/catalog.d.ts +2 -15
- package/dist/reference-data/catalog.js +25 -8
- package/dist/reference-data/receipt.d.ts +2 -2
- package/dist/report-model/assert-rules.js +1 -1
- package/dist/report-model/authoring-grammar.d.ts +211 -233
- package/dist/report-model/block-walk.d.ts +10 -10
- package/dist/report-model/block-walk.js +2 -0
- package/dist/report-model/draft-finish.d.ts +8 -8
- package/dist/report-model/draft-finish.js +1 -1
- package/dist/report-model/draft-hash.js +8 -7
- package/dist/report-model/draft-operations.d.ts +22 -10
- package/dist/report-model/draft-operations.js +48 -30
- package/dist/report-model/draft-read.d.ts +19 -7
- package/dist/report-model/draft-read.js +16 -6
- package/dist/report-model/draft.d.ts +844 -2
- package/dist/report-model/draft.js +3 -1
- package/dist/report-model/fixture-resolver.js +39 -16
- package/dist/report-model/pin-snapshot.d.ts +2 -2
- package/dist/report-model/pin-snapshot.js +15 -15
- package/dist/report-model/production-resolver.d.ts +18 -18
- package/dist/report-model/production-resolver.js +50 -42
- package/dist/report-model/reference-resolver.d.ts +26 -10
- package/dist/report-model/reference-resolver.js +68 -5
- package/dist/report-model/reference-stamp.js +30 -38
- package/dist/report-model/structural-validation.js +12 -4
- package/dist/report-model/validate.d.ts +7 -7
- package/dist/report-model/validate.js +6 -6
- package/dist/report-render/assets.d.ts +2 -2
- package/dist/report-render/assets.js +27 -3
- package/dist/report-render/chart-export.d.ts +10 -2
- package/dist/report-render/chart-export.js +37 -11
- package/dist/report-render/chart-presets.d.ts +8 -8
- package/dist/report-render/chart-presets.js +3 -3
- package/dist/report-render/chart-renderers.d.ts +23 -16
- package/dist/report-render/chart-renderers.js +74 -53
- package/dist/report-render/chart-toolbox.d.ts +2 -2
- package/dist/report-render/chart-toolbox.js +7 -6
- package/dist/report-render/chart.d.ts +15 -16
- package/dist/report-render/chart.js +369 -252
- package/dist/report-render/design.d.ts +36 -297
- package/dist/report-render/design.js +0 -12
- package/dist/report-render/figures/common.d.ts +12 -12
- package/dist/report-render/figures/common.js +42 -31
- package/dist/report-render/figures/dendrogram.d.ts +3 -3
- package/dist/report-render/figures/dendrogram.js +10 -10
- package/dist/report-render/figures/dense.js +15 -8
- package/dist/report-render/figures/dotplot.js +46 -33
- package/dist/report-render/figures/embedding.js +52 -43
- package/dist/report-render/figures/equal-units.d.ts +10 -10
- package/dist/report-render/figures/equal-units.js +27 -27
- package/dist/report-render/figures/forest.js +9 -7
- package/dist/report-render/figures/gsea.js +21 -11
- package/dist/report-render/figures/heatmap.js +13 -9
- package/dist/report-render/figures/index.d.ts +10 -10
- package/dist/report-render/figures/index.js +4 -2
- package/dist/report-render/figures/km.js +10 -9
- package/dist/report-render/figures/label-room.d.ts +12 -12
- package/dist/report-render/figures/label-room.js +7 -2
- package/dist/report-render/figures/locuszoom.d.ts +2 -2
- package/dist/report-render/figures/locuszoom.js +59 -31
- package/dist/report-render/figures/lollipop.js +3 -2
- package/dist/report-render/figures/ma.js +8 -4
- package/dist/report-render/figures/manhattan.d.ts +1 -2
- package/dist/report-render/figures/manhattan.js +52 -34
- package/dist/report-render/figures/oncoprint.js +4 -5
- package/dist/report-render/figures/pca.js +25 -11
- package/dist/report-render/figures/qq.js +20 -9
- package/dist/report-render/figures/roc.js +1 -1
- package/dist/report-render/figures/sankey.d.ts +2 -2
- package/dist/report-render/figures/sankey.js +11 -10
- package/dist/report-render/figures/upset.d.ts +6 -6
- package/dist/report-render/figures/upset.js +7 -4
- package/dist/report-render/figures/volcano.js +12 -10
- package/dist/report-render/hybrid-svg.d.ts +4 -4
- package/dist/report-render/hybrid-svg.js +7 -5
- package/dist/report-render/number-format.d.ts +4 -4
- package/dist/report-render/number-format.js +62 -27
- package/dist/report-render/page.js +2 -1
- package/dist/report-render/provenance-data.d.ts +2 -2
- package/dist/report-render/references.d.ts +4 -4
- package/dist/report-render/render.d.ts +2 -2
- package/dist/report-render/render.js +10 -11
- package/dist/report-render/script-json.js +1 -1
- package/dist/report-render/table-data.d.ts +6 -6
- package/dist/report-render/test/options.d.ts +49 -0
- package/dist/report-render/test/options.js +143 -0
- package/dist/report-render/test/page-function.d.ts +19 -0
- package/dist/report-render/test/page-function.js +33 -0
- package/dist/report-render/types.d.ts +10 -10
- package/dist/report-render/value-bridge.d.ts +4 -4
- package/dist/report-render/value-bridge.js +27 -14
- package/dist/report-render/views/chart-view.d.ts +2 -2
- package/dist/report-render/views/chart-view.js +2 -2
- package/dist/report-render/views/lineage.d.ts +6 -6
- package/dist/report-render/views/lineage.js +2 -0
- package/dist/report-render/views/page-view.d.ts +2 -2
- package/dist/report-render/views/page-view.js +1 -0
- package/dist/report-render/views/prose.js +25 -8
- package/dist/report-render/views/references-view.js +12 -1
- package/dist/report-render/views/values.js +1 -1
- package/dist/runtime/assemble.d.ts +53 -26
- package/dist/runtime/assemble.js +103 -56
- package/dist/runtime/boot.d.ts +8 -7
- package/dist/runtime/boot.js +1 -1
- package/dist/runtime/connection-budget.d.ts +6 -6
- package/dist/runtime/connection-budget.js +1 -1
- package/dist/runtime/dbos.d.ts +29 -19
- package/dist/runtime/dbos.js +35 -20
- package/dist/runtime/result-serialization.js +18 -5
- package/dist/runtime/shutdown.d.ts +2 -2
- package/dist/sandbox/client.d.ts +7 -3
- package/dist/sandbox/cpu-files.d.ts +2 -2
- package/dist/sandbox/cpu-files.js +21 -4
- package/dist/sandbox/create-sandbox.d.ts +7 -8
- package/dist/sandbox/create-sandbox.js +6 -12
- package/dist/sandbox/docker-client.d.ts +48 -3
- package/dist/sandbox/docker-client.js +10 -6
- package/dist/sandbox/estimate-data-profile-resources.js +2 -7
- package/dist/sandbox/exec-outcome.d.ts +2 -2
- package/dist/sandbox/exec-outcome.js +1 -1
- package/dist/sandbox/exec.d.ts +10 -6
- package/dist/sandbox/exec.js +27 -12
- package/dist/sandbox/execution-id.js +14 -6
- package/dist/sandbox/farm.d.ts +2 -2
- package/dist/sandbox/farm.js +22 -27
- package/dist/sandbox/identity.d.ts +7 -0
- package/dist/sandbox/identity.js +14 -3
- package/dist/sandbox/image-packages.js +15 -27
- package/dist/sandbox/k8s-client.d.ts +35 -8
- package/dist/sandbox/k8s-client.js +6 -5
- package/dist/sandbox/labels.js +1 -0
- package/dist/sandbox/liveness.js +3 -1
- package/dist/sandbox/mount-plan.d.ts +10 -10
- package/dist/sandbox/mount-plan.js +13 -14
- package/dist/sandbox/notification-sweep.d.ts +4 -4
- package/dist/sandbox/notification-sweep.js +4 -7
- package/dist/sandbox/package-identity.d.ts +6 -13
- package/dist/sandbox/package-identity.js +46 -28
- package/dist/sandbox/reaper.d.ts +10 -10
- package/dist/sandbox/reaper.js +4 -6
- package/dist/sandbox/sandbox-error.d.ts +2 -9
- package/dist/sandbox/sandbox-error.js +21 -8
- package/dist/sandbox/sandbox-step-translate.d.ts +8 -5
- package/dist/sandbox/sandbox-step-translate.js +22 -8
- package/dist/sandbox/step-sandbox.d.ts +47 -0
- package/dist/sandbox/step-sandbox.js +53 -0
- package/dist/sandbox/types.d.ts +18 -19
- package/dist/sandbox/types.js +1 -1
- package/dist/schemas/artifact-manifest.d.ts +4 -4
- package/dist/schemas/data-profile-schemas.d.ts +343 -298
- package/dist/schemas/file-metadata.js +2 -4
- package/dist/schemas/plan-schemas.d.ts +31 -31
- package/dist/schemas/run-synthesis.d.ts +95 -26
- package/dist/schemas/run-synthesis.js +3 -1
- package/dist/schemas/validate-plan.d.ts +4 -4
- package/dist/schemas/validate-plan.js +17 -5
- package/dist/schemas/workflow-state.d.ts +19 -19
- package/dist/schemas/workflow-state.js +2 -2
- package/dist/state/active-turns.d.ts +36 -0
- package/dist/state/active-turns.js +67 -0
- package/dist/state/analyses-metrics.d.ts +8 -8
- package/dist/state/analyses-metrics.js +4 -4
- package/dist/state/analyses.d.ts +0 -14
- package/dist/state/analyses.js +0 -32
- package/dist/state/artifacts.d.ts +32 -19
- package/dist/state/artifacts.js +28 -5
- package/dist/state/data-profile.d.ts +2 -2
- package/dist/state/db.d.ts +12 -2
- package/dist/state/db.js +5 -0
- package/dist/state/edit-intents.d.ts +4 -0
- package/dist/state/edit-intents.js +71 -0
- package/dist/state/index.d.ts +4 -4
- package/dist/state/index.js +2 -2
- package/dist/state/init.d.ts +2 -1
- package/dist/state/init.js +5 -2
- package/dist/state/migrations/20260927120000_baseline.js +3 -1
- package/dist/state/migrations/20261026120000_add_the_edit_intents.d.ts +7 -0
- package/dist/state/migrations/20261026120000_add_the_edit_intents.js +21 -0
- package/dist/state/migrations/20261027120000_record_the_applied_memory_edits.d.ts +7 -0
- package/dist/state/migrations/20261027120000_record_the_applied_memory_edits.js +16 -0
- package/dist/state/migrations/20261027120100_store_the_authoring_results.d.ts +8 -0
- package/dist/state/migrations/20261027120100_store_the_authoring_results.js +20 -0
- package/dist/state/migrations/20261027120200_key_the_groups_of_a_turn.d.ts +7 -0
- package/dist/state/migrations/20261027120200_key_the_groups_of_a_turn.js +12 -0
- package/dist/state/migrations/20261027120300_mark_the_active_turn_of_a_thread.d.ts +7 -0
- package/dist/state/migrations/20261027120300_mark_the_active_turn_of_a_thread.js +11 -0
- package/dist/state/migrations/20261028120000_record_the_paused_work.d.ts +7 -0
- package/dist/state/migrations/20261028120000_record_the_paused_work.js +25 -0
- package/dist/state/migrations/20261028120100_end_the_suspended_runs.d.ts +8 -0
- package/dist/state/migrations/20261028120100_end_the_suspended_runs.js +13 -0
- package/dist/state/migrations/20261029120000_reference_the_run_mandate.d.ts +7 -0
- package/dist/state/migrations/20261029120000_reference_the_run_mandate.js +23 -0
- package/dist/state/migrations/20261029120100_record_the_run_session_of_a_pause.d.ts +7 -0
- package/dist/state/migrations/20261029120100_record_the_run_session_of_a_pause.js +11 -0
- package/dist/state/migrations/index.js +18 -0
- package/dist/state/paused-work.d.ts +52 -0
- package/dist/state/paused-work.js +105 -0
- package/dist/state/plans.d.ts +27 -8
- package/dist/state/plans.js +14 -11
- package/dist/state/purge-analysis.d.ts +6 -6
- package/dist/state/purge-analysis.js +10 -2
- package/dist/state/report-session-state.d.ts +43 -18
- package/dist/state/report-session-state.js +43 -4
- package/dist/state/report-versions.d.ts +16 -11
- package/dist/state/report-versions.js +5 -3
- package/dist/state/runs.d.ts +30 -19
- package/dist/state/runs.js +43 -51
- package/dist/state/schema.d.ts +18 -21
- package/dist/state/schema.js +4 -5
- package/dist/state/snapshot-parse.d.ts +2 -2
- package/dist/state/snapshot-parse.js +14 -8
- package/dist/state/step-executions.d.ts +20 -8
- package/dist/state/step-executions.js +6 -4
- package/dist/state/tool-outputs.d.ts +2 -2
- package/dist/state/tool-outputs.js +2 -1
- package/dist/state/vector-store.d.ts +16 -16
- package/dist/state/vector-store.js +11 -7
- package/dist/tasks/data-profile-absorb.d.ts +3 -3
- package/dist/tasks/data-profile-absorb.js +21 -16
- package/dist/tasks/data-profile-activity.d.ts +5 -5
- package/dist/tasks/data-profile-activity.js +5 -5
- package/dist/tasks/data-profile-index.d.ts +4 -4
- package/dist/tasks/data-profile-index.js +32 -17
- package/dist/tasks/data-profile-resolve.d.ts +8 -8
- package/dist/tasks/data-profile-resolve.js +88 -62
- package/dist/tasks/data-profile.d.ts +40 -31
- package/dist/tasks/data-profile.js +138 -95
- package/dist/tasks/extract-values.d.ts +26 -79
- package/dist/tasks/extract-values.js +48 -108
- package/dist/tasks/refresh-regulatory-corpus.d.ts +4 -20
- package/dist/tasks/refresh-regulatory-corpus.js +12 -8
- package/dist/tasks/regulatory-corpus-boot-refresh.d.ts +2 -2
- package/dist/tasks/regulatory-corpus-boot-refresh.js +12 -10
- package/dist/testing.d.ts +62 -0
- package/dist/testing.js +101 -0
- package/dist/tools/ad-hoc-router.d.ts +9 -9
- package/dist/tools/ad-hoc-router.js +65 -52
- package/dist/tools/analysis-invocation.d.ts +7 -0
- package/dist/tools/analysis-invocation.js +29 -5
- package/dist/tools/approval/contract.d.ts +8 -52
- package/dist/tools/approval/contract.js +7 -36
- package/dist/tools/approval/gateway.d.ts +27 -28
- package/dist/tools/approval/gateway.js +33 -130
- package/dist/tools/approval/queries.d.ts +6 -11
- package/dist/tools/approval/queries.js +43 -29
- package/dist/tools/approval/uuidv7.js +2 -2
- package/dist/tools/bio/chembl.d.ts +3 -3
- package/dist/tools/bio/chembl.js +10 -0
- package/dist/tools/bio/comptox.d.ts +25 -8
- package/dist/tools/bio/comptox.js +4 -2
- package/dist/tools/bio/drug-gene-interactions.d.ts +27 -17
- package/dist/tools/bio/drug-gene-interactions.js +11 -8
- package/dist/tools/bio/gene-disease-evidence.d.ts +61 -15
- package/dist/tools/bio/gene-disease-evidence.js +10 -6
- package/dist/tools/bio/gene-preclinical-profile.d.ts +11 -11
- package/dist/tools/bio/keys.d.ts +2 -2
- package/dist/tools/bio/keys.js +3 -3
- package/dist/tools/bio/lookup-annotation.d.ts +5 -5
- package/dist/tools/bio/lookup-annotation.js +3 -0
- package/dist/tools/bio/opentargets.d.ts +1 -1
- package/dist/tools/bio/opentargets.js +6 -0
- package/dist/tools/bio/pubchem.d.ts +2 -2
- package/dist/tools/bio/pubchem.js +6 -0
- package/dist/tools/bio/pubmed.d.ts +26 -16
- package/dist/tools/bio/pubmed.js +9 -3
- package/dist/tools/bio/search-clinical-trials.d.ts +4 -4
- package/dist/tools/bio/search-clinical-trials.js +5 -1
- package/dist/tools/bio/search-faers.d.ts +2 -2
- package/dist/tools/bio/search-faers.js +1 -1
- package/dist/tools/bio/search-gene.d.ts +2 -2
- package/dist/tools/bio/search-gene.js +1 -0
- package/dist/tools/bio/search-geo-datasets.d.ts +4 -4
- package/dist/tools/bio/search-geo-datasets.js +5 -5
- package/dist/tools/bio/search-interactions.d.ts +1 -1
- package/dist/tools/bio/search-patents.d.ts +28 -22
- package/dist/tools/bio/search-patents.js +20 -17
- package/dist/tools/bio/search-protein.d.ts +2 -2
- package/dist/tools/bio/search-protein.js +1 -1
- package/dist/tools/bio/search-regulatory-approvals.d.ts +64 -18
- package/dist/tools/bio/search-regulatory-approvals.js +21 -16
- package/dist/tools/bio/target-safety.d.ts +8 -8
- package/dist/tools/bio/target-safety.js +11 -6
- package/dist/tools/capability-data.d.ts +9 -5
- package/dist/tools/capability-data.js +2 -1
- package/dist/tools/define-tool.d.ts +55 -46
- package/dist/tools/define-tool.js +39 -27
- package/dist/tools/display/normalize-echart-spec.d.ts +2 -2
- package/dist/tools/display/normalize-echart-spec.js +51 -27
- package/dist/tools/display/show-user.d.ts +2 -2
- package/dist/tools/display/show-user.js +1 -1
- package/dist/tools/execute-analysis.d.ts +19 -10
- package/dist/tools/execute-analysis.js +83 -62
- package/dist/tools/knowledge/check.d.ts +166 -44
- package/dist/tools/knowledge/check.js +5 -3
- package/dist/tools/knowledge/client.d.ts +31 -62
- package/dist/tools/knowledge/client.js +44 -27
- package/dist/tools/knowledge/environment.d.ts +6 -6
- package/dist/tools/knowledge/environment.js +18 -7
- package/dist/tools/knowledge/index.d.ts +2 -2
- package/dist/tools/knowledge/index.js +9 -9
- package/dist/tools/knowledge/local-slots.d.ts +4 -4
- package/dist/tools/knowledge/local-slots.js +11 -4
- package/dist/tools/knowledge/pin.d.ts +2 -2
- package/dist/tools/knowledge/recommend.d.ts +20 -45
- package/dist/tools/knowledge/recommend.js +27 -19
- package/dist/tools/knowledge/situation.d.ts +40 -40
- package/dist/tools/knowledge/situation.js +2 -9
- package/dist/tools/knowledge/skeleton.d.ts +4 -4
- package/dist/tools/knowledge/skeleton.js +10 -11
- package/dist/tools/knowledge/template.d.ts +20 -18
- package/dist/tools/knowledge/template.js +38 -32
- package/dist/tools/lib/alphafold-client.js +2 -1
- package/dist/tools/lib/amass-client.d.ts +28 -28
- package/dist/tools/lib/amass-client.js +20 -10
- package/dist/tools/lib/api-utils.d.ts +13 -3
- package/dist/tools/lib/api-utils.js +17 -3
- package/dist/tools/lib/bgee-client.d.ts +6 -6
- package/dist/tools/lib/bgee-client.js +16 -10
- package/dist/tools/lib/cbioportal-client.d.ts +4 -4
- package/dist/tools/lib/cbioportal-client.js +9 -8
- package/dist/tools/lib/chembl-client.d.ts +14 -14
- package/dist/tools/lib/chembl-client.js +11 -4
- package/dist/tools/lib/clinical-benchmarks-client.d.ts +4 -4
- package/dist/tools/lib/clinical-benchmarks-client.js +4 -7
- package/dist/tools/lib/clinical-trials-client.d.ts +18 -18
- package/dist/tools/lib/clinical-trials-client.js +10 -10
- package/dist/tools/lib/clinvar-client.d.ts +2 -2
- package/dist/tools/lib/clinvar-client.js +6 -6
- package/dist/tools/lib/ctx-ops.d.ts +23 -23
- package/dist/tools/lib/ctx-ops.js +13 -10
- package/dist/tools/lib/dgidb-client.d.ts +6 -6
- package/dist/tools/lib/dgidb-client.js +10 -12
- package/dist/tools/lib/disgenet-client.d.ts +4 -4
- package/dist/tools/lib/ema-client.d.ts +2 -2
- package/dist/tools/lib/ensembl-client.d.ts +4 -4
- package/dist/tools/lib/ensembl-client.js +5 -4
- package/dist/tools/lib/gwas-catalog-client.d.ts +4 -4
- package/dist/tools/lib/gwas-catalog-client.js +17 -17
- package/dist/tools/lib/html-text.d.ts +6 -0
- package/dist/tools/lib/html-text.js +9 -0
- package/dist/tools/lib/identifier-resolver.d.ts +4 -4
- package/dist/tools/lib/identifier-resolver.js +7 -3
- package/dist/tools/lib/impc-client.d.ts +8 -8
- package/dist/tools/lib/impc-client.js +46 -35
- package/dist/tools/lib/iuphar-client.d.ts +2 -2
- package/dist/tools/lib/iuphar-client.js +7 -16
- package/dist/tools/lib/monarch-client.d.ts +4 -4
- package/dist/tools/lib/openfda-client.d.ts +22 -22
- package/dist/tools/lib/openfda-client.js +23 -22
- package/dist/tools/lib/opentargets-client.d.ts +12 -12
- package/dist/tools/lib/pathway-client.d.ts +4 -4
- package/dist/tools/lib/pathway-client.js +15 -19
- package/dist/tools/lib/pharmgkb-client.d.ts +2 -2
- package/dist/tools/lib/pharmgkb-client.js +1 -1
- package/dist/tools/lib/protein-family-modality.d.ts +2 -2
- package/dist/tools/lib/protein-family-modality.js +0 -2
- package/dist/tools/lib/protein-family-normalize.js +7 -0
- package/dist/tools/lib/pubchem-client.d.ts +2 -2
- package/dist/tools/lib/pubchem-client.js +1 -0
- package/dist/tools/lib/pubchem-ops.d.ts +4 -4
- package/dist/tools/lib/pubchem-ops.js +8 -0
- package/dist/tools/lib/pubmed-client.d.ts +9 -9
- package/dist/tools/lib/pubmed-client.js +1 -1
- package/dist/tools/lib/string-client.d.ts +6 -6
- package/dist/tools/lib/uniprot-client.d.ts +8 -8
- package/dist/tools/lib/uniprot-client.js +5 -1
- package/dist/tools/memory/update-working-memory.d.ts +16 -13
- package/dist/tools/memory/update-working-memory.js +21 -3
- package/dist/tools/read-tool-output.js +8 -2
- package/dist/tools/registry.d.ts +2 -2
- package/dist/tools/report-authoring/authoring-tools.d.ts +54 -23
- package/dist/tools/report-authoring/authoring-tools.js +128 -62
- package/dist/tools/report-session/derive-table.d.ts +19 -59
- package/dist/tools/report-session/derive-table.js +120 -122
- package/dist/tools/report-session/examine-page.d.ts +6 -6
- package/dist/tools/report-session/examine-page.js +14 -12
- package/dist/tools/report-session/list-artifacts.d.ts +6 -6
- package/dist/tools/report-session/list-artifacts.js +5 -5
- package/dist/tools/report-session/page-faults.d.ts +6 -6
- package/dist/tools/report-session/page-faults.js +3 -1
- package/dist/tools/report-session/preview-report.d.ts +4 -3
- package/dist/tools/report-session/preview-report.js +26 -7
- package/dist/tools/report-session/record-version.d.ts +9 -4
- package/dist/tools/report-session/record-version.js +16 -9
- package/dist/tools/report-session/session-page-publisher.d.ts +6 -6
- package/dist/tools/research/generate-analogy-report.d.ts +14 -7
- package/dist/tools/research/generate-analogy-report.js +80 -76
- package/dist/tools/research/generate-plan.d.ts +16 -16
- package/dist/tools/research/generate-plan.js +410 -374
- package/dist/tools/research/guarded-address.js +3 -2
- package/dist/tools/research/inspect-data-profile.d.ts +27 -20
- package/dist/tools/research/inspect-data-profile.js +26 -25
- package/dist/tools/research/inspect-run.d.ts +54 -27
- package/dist/tools/research/inspect-run.js +50 -40
- package/dist/tools/research/literature-reviewer.d.ts +8 -7
- package/dist/tools/research/literature-reviewer.js +29 -28
- package/dist/tools/research/search-arxiv.d.ts +1 -1
- package/dist/tools/research/search-arxiv.js +1 -1
- package/dist/tools/research/search-github-repos.d.ts +10 -7
- package/dist/tools/research/search-github-repos.js +25 -22
- package/dist/tools/research/search-semantic-scholar.js +1 -1
- package/dist/tools/research/searxng-engine.d.ts +2 -2
- package/dist/tools/research/searxng-engine.js +6 -4
- package/dist/tools/research/web-fetch.d.ts +24 -21
- package/dist/tools/research/web-fetch.js +65 -74
- package/dist/tools/research/web-search.d.ts +26 -17
- package/dist/tools/research/web-search.js +26 -21
- package/dist/tools/sandbox/link-packages.d.ts +11 -7
- package/dist/tools/sandbox/link-packages.js +11 -8
- package/dist/tools/sandbox/list-available-packages.d.ts +17 -8
- package/dist/tools/sandbox/list-available-packages.js +31 -25
- package/dist/tools/sandbox/list-available-refs.d.ts +17 -14
- package/dist/tools/sandbox/list-available-refs.js +61 -36
- package/dist/tools/sandbox/report-blocker.d.ts +30 -37
- package/dist/tools/sandbox/report-blocker.js +23 -73
- package/dist/tools/sandbox/skills.d.ts +16 -12
- package/dist/tools/sandbox/skills.js +16 -12
- package/dist/tools/sandbox/submit-file-metadata.d.ts +12 -9
- package/dist/tools/sandbox/submit-file-metadata.js +18 -21
- package/dist/tools/start-report-session.d.ts +13 -5
- package/dist/tools/start-report-session.js +35 -8
- package/dist/tools/terminal-text.d.ts +5 -2
- package/dist/tools/terminal-text.js +35 -3
- package/dist/tools/workspace/decision-record.d.ts +4 -4
- package/dist/tools/workspace/decision-record.js +23 -13
- package/dist/tools/workspace/edit-file.d.ts +59 -20
- package/dist/tools/workspace/edit-file.js +81 -16
- package/dist/tools/workspace/execute-command.d.ts +15 -13
- package/dist/tools/workspace/execute-command.js +11 -9
- package/dist/tools/workspace/file-stat.d.ts +6 -3
- package/dist/tools/workspace/grep.d.ts +10 -7
- package/dist/tools/workspace/grep.js +9 -3
- package/dist/tools/workspace/list-files.d.ts +6 -3
- package/dist/tools/workspace/mutator.d.ts +28 -15
- package/dist/tools/workspace/mutator.js +107 -53
- package/dist/tools/workspace/read-file.d.ts +8 -5
- package/dist/tools/workspace/result-bounds.d.ts +5 -5
- package/dist/tools/workspace/result-bounds.js +4 -2
- package/dist/tools/workspace/run-exec.d.ts +2 -2
- package/dist/tools/workspace/run-exec.js +3 -3
- package/dist/tools/workspace/scan-inputs.d.ts +8 -5
- package/dist/tools/workspace/scan-inputs.js +17 -5
- package/dist/tools/workspace/show-file.d.ts +1 -1
- package/dist/tools/workspace/show-file.js +2 -1
- package/dist/tools/workspace/show-plan.d.ts +8 -5
- package/dist/tools/workspace/show-plan.js +9 -8
- package/dist/tools/workspace/workspace-search.d.ts +41 -13
- package/dist/tools/workspace/workspace-search.js +27 -14
- package/dist/tools/workspace/write-file.d.ts +9 -7
- package/dist/workflows/execute-analysis-scheduler.d.ts +9 -9
- package/dist/workflows/execute-analysis-scheduler.js +6 -3
- package/dist/workflows/execute-analysis.d.ts +46 -62
- package/dist/workflows/execute-analysis.js +137 -219
- package/dist/workflows/pause.d.ts +71 -0
- package/dist/workflows/pause.js +173 -0
- package/dist/workflows/sandbox-step.d.ts +38 -61
- package/dist/workflows/sandbox-step.js +99 -106
- package/dist/workflows/test/sql-writes.d.ts +21 -0
- package/dist/workflows/test/sql-writes.js +36 -0
- package/dist/workspace/filesystem.d.ts +6 -6
- package/dist/workspace/filesystem.js +10 -8
- package/dist/workspace/paths.d.ts +1 -1
- package/dist/workspace/paths.js +15 -4
- package/dist/workspace/search-config.d.ts +2 -2
- package/dist/workspace/search-config.js +1 -1
- package/package.json +21 -22
- package/dist/loop/call-guard.d.ts +0 -50
- package/dist/loop/call-guard.js +0 -90
- package/dist/loop/continue-agent.d.ts +0 -40
- package/dist/loop/continue-agent.js +0 -38
- package/dist/loop/genai-spans.d.ts +0 -47
- package/dist/loop/genai-spans.js +0 -134
- package/dist/loop/run-agent.d.ts +0 -245
- package/dist/loop/run-agent.js +0 -1124
- package/dist/loop/run-step.d.ts +0 -29
- package/dist/loop/run-step.js +0 -34
- package/dist/loop/run-to-terminal.d.ts +0 -66
- package/dist/loop/run-to-terminal.js +0 -93
- package/dist/loop/tool-mask.d.ts +0 -23
- package/dist/loop/tool-mask.js +0 -46
- package/dist/providers/streaming-chat.d.ts +0 -32
- package/dist/providers/streaming-chat.js +0 -91
- package/dist/tasks/derive-table-exec.d.ts +0 -54
- package/dist/tasks/derive-table-exec.js +0 -86
- package/dist/workflows/suspension.d.ts +0 -32
- package/dist/workflows/suspension.js +0 -38
|
@@ -1,26 +1,20 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* The extraction
|
|
2
|
+
* The extraction pass on the profile rails, and the `ExtractionArm` realization over it.
|
|
3
3
|
*
|
|
4
4
|
* The report resolver falls through to this arm for an over-cap file or a host parse fault. The arm runs one
|
|
5
5
|
* fixed extraction script in an ephemeral sandbox, and it gives back the rows that the script read. No agent
|
|
6
6
|
* loop runs anywhere in this path. A file whose extension names no tabular format never arrives here,
|
|
7
7
|
* because the host decides the format and it refuses the file before the fall-through.
|
|
8
8
|
*
|
|
9
|
-
* The
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
* standing machine exists.
|
|
9
|
+
* The pass runs inside the step of the tool call that resolves the report (`sandbox/step-sandbox.ts`), under
|
|
10
|
+
* the auth of that call, and it mints no mandate. One call can run more than one pass, thus the exec of each
|
|
11
|
+
* pass takes the key of the step and a hash of its requests. The container is ephemeral, and it goes away
|
|
12
|
+
* with the work, thus no standing machine exists.
|
|
13
13
|
*/
|
|
14
|
-
import {
|
|
15
|
-
import { err, ok } from "neverthrow";
|
|
16
|
-
import { randomUUID } from "node:crypto";
|
|
17
|
-
import { forStep } from "../auth/types.js";
|
|
14
|
+
import { createHash } from "node:crypto";
|
|
18
15
|
import { createNoopLogger } from "../lib/console-logger.js";
|
|
19
|
-
import {
|
|
20
|
-
import {
|
|
21
|
-
import { mintSandboxIdentity } from "../sandbox/identity.js";
|
|
22
|
-
import { keepSuspendingRefusal } from "../sandbox/sandbox-error.js";
|
|
23
|
-
import { suspensionOfRefusal, suspensionOfSpawnRefusal } from "../workflows/suspension.js";
|
|
16
|
+
import { safeParseJsonAs } from "../lib/parse-json.js";
|
|
17
|
+
import { passSpawnSession, withStepSandbox } from "../sandbox/step-sandbox.js";
|
|
24
18
|
import { EXTRACTION_INPUT_ENV, EXTRACTION_SCRIPT, ExtractValuesResultSchema } from "./extract-values-script.js";
|
|
25
19
|
/** The synthetic run id and step id of the extraction pass. Both are constants shared by every analysis. */
|
|
26
20
|
const EXTRACT_VALUES_RUN_LITERAL = "extract-values";
|
|
@@ -35,8 +29,6 @@ const EXTRACTION_DEADLINE_MS = 300_000;
|
|
|
35
29
|
* carries no file size. A later change can size it from the batch.
|
|
36
30
|
*/
|
|
37
31
|
const EXTRACTION_RESOURCES = { cpu: 2, memoryGb: 8 };
|
|
38
|
-
/** The exec progress callback. The extraction pass reports no live activity, thus the callback drops each event. */
|
|
39
|
-
const noopEmit = () => { };
|
|
40
32
|
/**
|
|
41
33
|
* Build the sandbox exec for one extraction pass. The command runs the fixed script through `python3 -c`.
|
|
42
34
|
* The working directory is the analysis mount, thus a relative request path reads the correct file. The
|
|
@@ -51,20 +43,29 @@ const noopEmit = () => { };
|
|
|
51
43
|
* The function is pure, thus a test asserts the command shape without a sandbox.
|
|
52
44
|
*/
|
|
53
45
|
export function buildExtractionExec(analysisId, requests) {
|
|
54
|
-
const scriptRequests = requests.map((request) => ({ path: request.path, format: request.format, hash: request.hash }));
|
|
55
46
|
return {
|
|
56
47
|
command: ["python3", "-c", EXTRACTION_SCRIPT],
|
|
57
48
|
cwd: `/${analysisId}`,
|
|
58
|
-
env: { [EXTRACTION_INPUT_ENV]: JSON.stringify(scriptRequests) },
|
|
49
|
+
env: { [EXTRACTION_INPUT_ENV]: JSON.stringify(scriptRequests(requests)) },
|
|
59
50
|
timeoutSeconds: Math.floor(EXTRACTION_DEADLINE_MS / 1000),
|
|
60
51
|
};
|
|
61
52
|
}
|
|
53
|
+
function scriptRequests(requests) {
|
|
54
|
+
return requests.map((request) => ({ path: request.path, format: request.format, hash: request.hash }));
|
|
55
|
+
}
|
|
56
|
+
/** The key of one pass inside its step: the same requests give the same exec, and other requests a new one. */
|
|
57
|
+
function requestKey(requests) {
|
|
58
|
+
return createHash("sha256")
|
|
59
|
+
.update(JSON.stringify(scriptRequests(requests)), "utf8")
|
|
60
|
+
.digest("hex")
|
|
61
|
+
.slice(0, 16);
|
|
62
|
+
}
|
|
62
63
|
/**
|
|
63
64
|
* Parse the script output from the exec result. A synthetic failure, a timeout, and a non-zero exit each
|
|
64
65
|
* throw, because each means the script did not emit its map. A stdout that is not the map shape throws too.
|
|
65
66
|
*
|
|
66
|
-
* The function is pure, thus a test asserts the parse without a sandbox. The
|
|
67
|
-
*
|
|
67
|
+
* The function is pure, thus a test asserts the parse without a sandbox. The arm turns the throw into a
|
|
68
|
+
* rejected promise.
|
|
68
69
|
*/
|
|
69
70
|
export function parseExtractionOutput(result) {
|
|
70
71
|
if (result.syntheticFailure !== undefined) {
|
|
@@ -78,104 +79,42 @@ export function parseExtractionOutput(result) {
|
|
|
78
79
|
}
|
|
79
80
|
let parsed;
|
|
80
81
|
try {
|
|
81
|
-
parsed =
|
|
82
|
+
parsed = safeParseJsonAs(result.stdout, ExtractValuesResultSchema);
|
|
82
83
|
}
|
|
83
84
|
catch {
|
|
84
85
|
throw new Error("the extraction script did not emit valid JSON");
|
|
85
86
|
}
|
|
86
|
-
|
|
87
|
+
if (!parsed.success)
|
|
88
|
+
throw parsed.error;
|
|
89
|
+
return parsed.data;
|
|
87
90
|
}
|
|
88
91
|
/**
|
|
89
|
-
*
|
|
90
|
-
* container, submits one exec, awaits the result durably, and gives the value map back. It revokes the run
|
|
91
|
-
* authorization on every terminal path, and it tears the container down on both paths.
|
|
92
|
+
* Run one extraction pass: make the container, run the script on every request, and remove the container.
|
|
92
93
|
*
|
|
93
|
-
* A
|
|
94
|
-
* cancel (workflow-suspension spec). The body does not mark the analysis: the caller reports the suspension.
|
|
94
|
+
* A suspending refusal of the spawn is the `err`, and the caller reports it. Each other fault throws.
|
|
95
95
|
*/
|
|
96
|
-
export async function
|
|
97
|
-
const logger = (deps.logger ?? createNoopLogger()).named("extract-values").with({ analysisId:
|
|
98
|
-
const { analysisId, runSession, requests, ownsMandate = true } = input; // oss-core-managed-ok
|
|
99
|
-
const authorization = { runSession, ownsMandate }; // oss-core-managed-ok
|
|
100
|
-
const revoke = (reason) => deliverNotice(logger, "RunAuthorizer.revoke", deps.runAuthorizer.revoke(authorization, reason));
|
|
96
|
+
export async function runExtraction(deps, caller, requests) {
|
|
97
|
+
const logger = (deps.logger ?? createNoopLogger()).named("extract-values").with({ analysisId: caller.analysisId });
|
|
101
98
|
try {
|
|
102
|
-
const
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
const deadlineAbs = (await DBOS.now()) + EXTRACTION_DEADLINE_MS;
|
|
117
|
-
const result = await deps.sandboxClient.exec(sandbox, buildExtractionExec(analysisId, requests), noopEmit, deadlineAbs);
|
|
118
|
-
const map = parseExtractionOutput(result);
|
|
119
|
-
await revoke("extract-values-completed");
|
|
120
|
-
return ok(map);
|
|
121
|
-
}
|
|
122
|
-
finally {
|
|
123
|
-
try {
|
|
124
|
-
await deps.sandboxClient.teardown(sandbox);
|
|
125
|
-
}
|
|
126
|
-
catch (teardownErr) {
|
|
127
|
-
logger.warn("teardown failed (non-fatal)", { executionId, ...logger.errorFields(teardownErr) });
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
catch (err) {
|
|
132
|
-
logger.error("extraction failed", logger.errorFields(err));
|
|
133
|
-
await revoke("extract-values-failed");
|
|
134
|
-
throw err;
|
|
99
|
+
const ran = await withStepSandbox(deps.sandboxClient, {
|
|
100
|
+
session: passSpawnSession(caller, {
|
|
101
|
+
analysisId: caller.analysisId,
|
|
102
|
+
runId: EXTRACT_VALUES_RUN_LITERAL,
|
|
103
|
+
stepId: EXTRACT_VALUES_STEP_LITERAL,
|
|
104
|
+
agentId: EXTRACT_VALUES_AGENT_ID,
|
|
105
|
+
}),
|
|
106
|
+
// The pass only reads, thus the container mounts the analysis tree read-only.
|
|
107
|
+
spec: { resources: EXTRACTION_RESOURCES, readOnly: true },
|
|
108
|
+
execKey: requestKey(requests),
|
|
109
|
+
}, logger, async (exec) => parseExtractionOutput(await exec(buildExtractionExec(caller.analysisId, requests), EXTRACTION_DEADLINE_MS)));
|
|
110
|
+
if (ran.isErr())
|
|
111
|
+
logger.warn("the host refused the sandbox of the extraction", { reason: ran.error.reason });
|
|
112
|
+
return ran;
|
|
135
113
|
}
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
* dispatches with `DBOS.startWorkflow`.
|
|
140
|
-
*/
|
|
141
|
-
export function registerExtractValuesWorkflow(deps) {
|
|
142
|
-
return DBOS.registerWorkflow((input) => runExtractValuesBody(input, deps), { name: "extract-values" });
|
|
143
|
-
}
|
|
144
|
-
/** The per-attempt workflow id. A fresh nonce keeps each pass under a distinct id. */
|
|
145
|
-
export function extractValuesWorkflowId(analysisId, nonce) {
|
|
146
|
-
return `extract-values:${analysisId}:${nonce}`;
|
|
147
|
-
}
|
|
148
|
-
/**
|
|
149
|
-
* The async edge. It authorizes through the `RunAuthorizer`, starts the workflow, and awaits the outcome.
|
|
150
|
-
* The body owns the revoke, thus the trigger holds no lifecycle. A workflow fault and a refused
|
|
151
|
-
* authorization reject the returned promise. A suspension is the `err` of the result: of the workflow, or of
|
|
152
|
-
* an authorization that the host refused with the suspend flag.
|
|
153
|
-
*/
|
|
154
|
-
export async function triggerExtractValues(deps, params) {
|
|
155
|
-
const { auth, analysisId, requests } = params;
|
|
156
|
-
const authorized = await passGate("RunAuthorizer.authorize", deps.runAuthorizer.authorize({
|
|
157
|
-
auth,
|
|
158
|
-
scope: { kind: "analysis", analysisId },
|
|
159
|
-
provenance: { agentId: EXTRACT_VALUES_AGENT_ID, callPath: [EXTRACT_VALUES_AGENT_ID] },
|
|
160
|
-
frame: { runId: EXTRACT_VALUES_RUN_LITERAL, stepId: EXTRACT_VALUES_STEP_LITERAL },
|
|
161
|
-
}));
|
|
162
|
-
if (authorized.isErr()) {
|
|
163
|
-
const suspension = suspensionOfRefusal(authorized.error);
|
|
164
|
-
if (suspension !== undefined)
|
|
165
|
-
return err(suspension);
|
|
166
|
-
throw new Error(`the extraction was not authorized: ${authorized.error.reason}`);
|
|
114
|
+
catch (cause) {
|
|
115
|
+
logger.error("extraction failed", logger.errorFields(cause));
|
|
116
|
+
throw cause;
|
|
167
117
|
}
|
|
168
|
-
const { runSession, ownsMandate } = authorized.value; // oss-core-managed-ok
|
|
169
|
-
const handle = (await DBOS.startWorkflow(deps.workflow, {
|
|
170
|
-
workflowID: extractValuesWorkflowId(analysisId, randomUUID()),
|
|
171
|
-
})({ analysisId, runSession, requests: [...requests], ownsMandate })); // oss-core-managed-ok
|
|
172
|
-
return handle.getResult();
|
|
173
|
-
}
|
|
174
|
-
/**
|
|
175
|
-
* Bind the trigger to one analysis and one auth context. The result runs one pass with every request in it.
|
|
176
|
-
*/
|
|
177
|
-
export function bindExtractionTrigger(deps, binding) {
|
|
178
|
-
return (requests) => triggerExtractValues(deps, { auth: binding.auth, analysisId: binding.analysisId, requests });
|
|
179
118
|
}
|
|
180
119
|
/**
|
|
181
120
|
* Turn the raw script output into the arm result. A path with rows enters the map. A path with an error
|
|
@@ -195,7 +134,8 @@ export function extractionArtifactsFromResult(result) {
|
|
|
195
134
|
/**
|
|
196
135
|
* Make the extraction arm over a runner. One `extract` call makes one run with every request in it, and it
|
|
197
136
|
* gives the value map. A run fault rejects the promise, and the resolver turns the rejection into a failed
|
|
198
|
-
* reference. A
|
|
137
|
+
* reference. A refusal of the sandbox with the suspend flag is the `err`, and the resolver reports its reason on each
|
|
138
|
+
* reference.
|
|
199
139
|
*/
|
|
200
140
|
export function createExtractionArm(run) {
|
|
201
141
|
return {
|
|
@@ -12,11 +12,11 @@
|
|
|
12
12
|
import type { Pool } from "pg";
|
|
13
13
|
export type RegulatoryCorpusSource = "FDA-CDER" | "FDA-CBER" | "ICH";
|
|
14
14
|
export declare const REGULATORY_CORPUS_SOURCES: RegulatoryCorpusSource[];
|
|
15
|
-
export
|
|
15
|
+
export type RefreshResult = {
|
|
16
16
|
ok: number;
|
|
17
17
|
fail: number;
|
|
18
|
-
}
|
|
19
|
-
export
|
|
18
|
+
};
|
|
19
|
+
export type RefreshOptions = {
|
|
20
20
|
pool: Pool;
|
|
21
21
|
sources?: RegulatoryCorpusSource[];
|
|
22
22
|
/**
|
|
@@ -30,23 +30,7 @@ export interface RefreshOptions {
|
|
|
30
30
|
embedder: (text: string) => Promise<number[]>;
|
|
31
31
|
/** Logger used for per-doc progress. Defaults to `console`. */
|
|
32
32
|
log?: Pick<Console, "log" | "error">;
|
|
33
|
-
}
|
|
34
|
-
/**
|
|
35
|
-
* Build an embedder that talks directly to api.openai.com using the given
|
|
36
|
-
* `apiKey`, bypassing the billing gateway.
|
|
37
|
-
*
|
|
38
|
-
* Returns `null` when `apiKey` is missing — callers MUST treat that as
|
|
39
|
-
* "auto-refresh disabled" rather than falling back to the workspace
|
|
40
|
-
* embedder (`workspace/search-config.ts`), which routes through the billing gateway
|
|
41
|
-
* via `OPENAI_BASE_URL` and would generate unbilled calls outside an ALS
|
|
42
|
-
* billing scope.
|
|
43
|
-
*
|
|
44
|
-
* The model id mirrors the workspace embedder default
|
|
45
|
-
* (`text-embedding-3-small`, 1536 dim) so chunks remain comparable to the
|
|
46
|
-
* default `cortex_regulatory_chunks.embedding` shape. Pass the existing
|
|
47
|
-
* `OPENAI_API_KEY` (a real OpenAI key, NOT a billing-gateway virtual key — direct
|
|
48
|
-
* calls to api.openai.com would 401 against a `sk-billing-*` value).
|
|
49
|
-
*/
|
|
33
|
+
};
|
|
50
34
|
export declare function buildMaintenanceEmbedder(opts: {
|
|
51
35
|
apiKey?: string;
|
|
52
36
|
embeddingModel?: string;
|
|
@@ -9,10 +9,14 @@
|
|
|
9
9
|
* - `scripts/index-regulatory-corpus.ts` — operator-run CLI
|
|
10
10
|
* - `regulatory-corpus-boot-refresh.ts` — automatic 90-day-stale boot trigger
|
|
11
11
|
*/
|
|
12
|
+
import { errorMessageOf } from "../lib/thrown.js";
|
|
13
|
+
import { textOf } from "../lib/unknown-text.js";
|
|
12
14
|
import { unwrapOrThrow } from "../lib/result.js";
|
|
15
|
+
import { presentAt } from "../lib/present.js";
|
|
13
16
|
import { fetchFdaGuidanceListing, fetchAndExtractFdaDoc } from "../lib/regulatory-corpus/fetch-fda-guidance.js";
|
|
14
17
|
import { fetchIchListing, fetchAndExtractIchDoc } from "../lib/regulatory-corpus/fetch-ich.js";
|
|
15
18
|
import { chunkText, upsertChunks } from "../lib/regulatory-corpus.js";
|
|
19
|
+
import { z } from "zod";
|
|
16
20
|
export const REGULATORY_CORPUS_SOURCES = ["FDA-CDER", "FDA-CBER", "ICH"];
|
|
17
21
|
// A large guidance doc can chunk into 200-500+ pieces. Firing them all at
|
|
18
22
|
// once trips embedding-API rate limits and silently truncates the upserted
|
|
@@ -34,6 +38,7 @@ const EMBED_CONCURRENCY = 20;
|
|
|
34
38
|
* `OPENAI_API_KEY` (a real OpenAI key, NOT a billing-gateway virtual key — direct
|
|
35
39
|
* calls to api.openai.com would 401 against a `sk-billing-*` value).
|
|
36
40
|
*/
|
|
41
|
+
const EmbeddingResponseSchema = z.object({ data: z.array(z.object({ embedding: z.array(z.number()) })) });
|
|
37
42
|
export function buildMaintenanceEmbedder(opts) {
|
|
38
43
|
const { apiKey } = opts;
|
|
39
44
|
if (!apiKey)
|
|
@@ -56,9 +61,9 @@ export function buildMaintenanceEmbedder(opts) {
|
|
|
56
61
|
const body = await res.text();
|
|
57
62
|
throw new Error(`buildMaintenanceEmbedder: openai /embeddings ${res.status}: ${body}`);
|
|
58
63
|
}
|
|
59
|
-
const data = (await res.json());
|
|
60
|
-
const embedding = data.data
|
|
61
|
-
if (!embedding)
|
|
64
|
+
const data = EmbeddingResponseSchema.parse(await res.json());
|
|
65
|
+
const embedding = data.data[0]?.embedding;
|
|
66
|
+
if (!embedding || embedding.length === 0)
|
|
62
67
|
throw new Error("buildMaintenanceEmbedder: empty response");
|
|
63
68
|
return embedding;
|
|
64
69
|
};
|
|
@@ -79,10 +84,9 @@ async function listForSource(source) {
|
|
|
79
84
|
return await fetchIchListing();
|
|
80
85
|
}
|
|
81
86
|
}
|
|
87
|
+
// Each source's listing carries only its own stub kind, thus the stub's own shape picks the fetcher.
|
|
82
88
|
async function fetchOne(source, stub) {
|
|
83
|
-
|
|
84
|
-
return await fetchAndExtractIchDoc(stub);
|
|
85
|
-
return await fetchAndExtractFdaDoc(stub);
|
|
89
|
+
return "center" in stub ? await fetchAndExtractFdaDoc(stub) : await fetchAndExtractIchDoc(stub);
|
|
86
90
|
}
|
|
87
91
|
async function indexSource(pool, source, embedder, log) {
|
|
88
92
|
log.log(`\n=== ${source} ===`);
|
|
@@ -104,7 +108,7 @@ async function indexSource(pool, source, embedder, log) {
|
|
|
104
108
|
const batchResults = await Promise.all(batch.map((c) => embedder(c.text)));
|
|
105
109
|
embeddings.push(...batchResults);
|
|
106
110
|
}
|
|
107
|
-
const chunks = rawChunks.map((c, i) => ({ ...c, embedding: embeddings
|
|
111
|
+
const chunks = rawChunks.map((c, i) => ({ ...c, embedding: presentAt(embeddings, i, "the embedding of the chunk") }));
|
|
108
112
|
const row = {
|
|
109
113
|
source,
|
|
110
114
|
doc_id: doc.doc_id,
|
|
@@ -119,7 +123,7 @@ async function indexSource(pool, source, embedder, log) {
|
|
|
119
123
|
}
|
|
120
124
|
catch (err) {
|
|
121
125
|
fail++;
|
|
122
|
-
const msg = err
|
|
126
|
+
const msg = errorMessageOf(err) ?? textOf(err);
|
|
123
127
|
log.error(` FAIL ${stub.doc_id}: ${msg}`);
|
|
124
128
|
}
|
|
125
129
|
}
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
import type { Pool } from "pg";
|
|
18
18
|
import { refreshRegulatoryCorpus, type RefreshOptions } from "./refresh-regulatory-corpus.js";
|
|
19
19
|
export declare const REFRESH_INTERVAL_DAYS = 90;
|
|
20
|
-
export
|
|
20
|
+
export type BootRefreshDeps = {
|
|
21
21
|
/** Shared `pg.Pool`. */
|
|
22
22
|
pool: Pool;
|
|
23
23
|
/** Forwarded to `refreshRegulatoryCorpus()` when the refresh fires. */
|
|
@@ -39,7 +39,7 @@ export interface BootRefreshDeps {
|
|
|
39
39
|
embeddingModel?: string;
|
|
40
40
|
/** Direct OpenAI key for the maintenance embedder (NOT a billing-gateway VK). */
|
|
41
41
|
openaiApiKey?: string;
|
|
42
|
-
}
|
|
42
|
+
};
|
|
43
43
|
/**
|
|
44
44
|
* Check the corpus freshness and, if stale, kick off an asynchronous
|
|
45
45
|
* refresh. Resolves quickly — does NOT wait for the refresh to finish.
|
|
@@ -14,16 +14,18 @@
|
|
|
14
14
|
* but the cost of a redundant check is one round-trip; the actual scrape
|
|
15
15
|
* is what we serialize.
|
|
16
16
|
*/
|
|
17
|
+
import { errorMessageOf } from "../lib/thrown.js";
|
|
17
18
|
import { buildMaintenanceEmbedder, refreshRegulatoryCorpus } from "./refresh-regulatory-corpus.js";
|
|
18
19
|
export const REFRESH_INTERVAL_DAYS = 90;
|
|
19
20
|
const ADVISORY_LOCK_KEY = "cortex_regulatory_corpus_refresh";
|
|
20
21
|
async function checkFreshness(pool, intervalDays) {
|
|
22
|
+
// EXTRACT gives numeric, which node-pg returns as a string, thus the float8 cast makes `age_days` a number.
|
|
21
23
|
const { rows } = await pool.query(`SELECT MAX(indexed_at) AS last_indexed_at,
|
|
22
|
-
EXTRACT(EPOCH FROM (NOW() - MAX(indexed_at))) / 86400 AS age_days
|
|
24
|
+
(EXTRACT(EPOCH FROM (NOW() - MAX(indexed_at))) / 86400)::float8 AS age_days
|
|
23
25
|
FROM cortex_regulatory_chunks`);
|
|
24
26
|
const row = rows[0];
|
|
25
27
|
const lastIndexedAt = row?.last_indexed_at ?? null;
|
|
26
|
-
const ageDays = row?.age_days != null ?
|
|
28
|
+
const ageDays = row?.age_days != null ? row.age_days : null;
|
|
27
29
|
const stale = lastIndexedAt === null || (ageDays ?? Infinity) >= intervalDays;
|
|
28
30
|
return { stale, lastIndexedAt, ageDays };
|
|
29
31
|
}
|
|
@@ -71,11 +73,11 @@ export async function maybeKickOffRegulatoryCorpusRefresh(deps) {
|
|
|
71
73
|
freshness = await checkFreshness(pool, intervalDays);
|
|
72
74
|
}
|
|
73
75
|
catch (err) {
|
|
74
|
-
log.warn("[boot] Regulatory corpus freshness check failed; skipping auto-refresh:", err
|
|
76
|
+
log.warn("[boot] Regulatory corpus freshness check failed; skipping auto-refresh:", errorMessageOf(err) ?? err);
|
|
75
77
|
return "error";
|
|
76
78
|
}
|
|
77
79
|
if (!freshness.stale) {
|
|
78
|
-
log.log(`[boot] Regulatory corpus is fresh (age ${freshness.ageDays?.toFixed(1)}d < ${intervalDays}d); skipping refresh`);
|
|
80
|
+
log.log(`[boot] Regulatory corpus is fresh (age ${String(freshness.ageDays?.toFixed(1))}d < ${intervalDays}d); skipping refresh`);
|
|
79
81
|
return "skipped-fresh";
|
|
80
82
|
}
|
|
81
83
|
// Corpus is stale — resolve the maintenance embedder. System-scoped
|
|
@@ -92,12 +94,12 @@ export async function maybeKickOffRegulatoryCorpusRefresh(deps) {
|
|
|
92
94
|
});
|
|
93
95
|
}
|
|
94
96
|
catch (err) {
|
|
95
|
-
log.warn("[boot] Could not load env for regulatory corpus refresh; skipping:", err
|
|
97
|
+
log.warn("[boot] Could not load env for regulatory corpus refresh; skipping:", errorMessageOf(err) ?? err);
|
|
96
98
|
return "skipped-unconfigured";
|
|
97
99
|
}
|
|
98
100
|
}
|
|
99
101
|
if (!embedder) {
|
|
100
|
-
const ageStr = freshness.lastIndexedAt === null ? "empty" : `age ${freshness.ageDays?.toFixed(1)}d`;
|
|
102
|
+
const ageStr = freshness.lastIndexedAt === null ? "empty" : `age ${String(freshness.ageDays?.toFixed(1))}d`;
|
|
101
103
|
log.warn(`[boot] Regulatory corpus is stale (${ageStr}) but ` +
|
|
102
104
|
"REGULATORY_CORPUS_OPENAI_API_KEY is unset; skipping auto-refresh. " +
|
|
103
105
|
"Set it (a real OpenAI key, NOT a billing-gateway virtual key — the " +
|
|
@@ -116,7 +118,7 @@ export async function maybeKickOffRegulatoryCorpusRefresh(deps) {
|
|
|
116
118
|
}
|
|
117
119
|
catch (err) {
|
|
118
120
|
client.release();
|
|
119
|
-
log.warn("[boot] Regulatory corpus advisory-lock attempt failed; skipping auto-refresh:", err
|
|
121
|
+
log.warn("[boot] Regulatory corpus advisory-lock attempt failed; skipping auto-refresh:", errorMessageOf(err) ?? err);
|
|
120
122
|
return "error";
|
|
121
123
|
}
|
|
122
124
|
if (!acquired) {
|
|
@@ -124,21 +126,21 @@ export async function maybeKickOffRegulatoryCorpusRefresh(deps) {
|
|
|
124
126
|
log.log("[boot] Regulatory corpus refresh already in progress on another replica; skipping");
|
|
125
127
|
return "skipped-locked";
|
|
126
128
|
}
|
|
127
|
-
const ageStr = freshness.lastIndexedAt === null ? "empty" : `age ${freshness.ageDays?.toFixed(1)}d`;
|
|
129
|
+
const ageStr = freshness.lastIndexedAt === null ? "empty" : `age ${String(freshness.ageDays?.toFixed(1))}d`;
|
|
128
130
|
log.log(`[boot] Regulatory corpus is stale (${ageStr}); starting async refresh in background`);
|
|
129
131
|
// Detached promise — startup must not wait for this to finish.
|
|
130
132
|
const dispatchEmbedder = embedder;
|
|
131
133
|
void (async () => {
|
|
132
134
|
try {
|
|
133
135
|
const result = await refresh({
|
|
134
|
-
...
|
|
136
|
+
...deps.refreshOptions,
|
|
135
137
|
pool,
|
|
136
138
|
embedder: dispatchEmbedder,
|
|
137
139
|
});
|
|
138
140
|
log.log(`[boot] Regulatory corpus refresh complete: ok=${result.ok} fail=${result.fail}`);
|
|
139
141
|
}
|
|
140
142
|
catch (err) {
|
|
141
|
-
log.error("[boot] Regulatory corpus refresh threw:", err
|
|
143
|
+
log.error("[boot] Regulatory corpus refresh threw:", errorMessageOf(err) ?? err);
|
|
142
144
|
}
|
|
143
145
|
finally {
|
|
144
146
|
await releaseLock(client);
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The test kit of the harness: a scripted model for a test of an agent, a chat
|
|
3
|
+
* turn, or a tool that runs a sub-agent. It is a `ChatProvider` over the mock
|
|
4
|
+
* model of the AI SDK. Each request takes the next entry of the script, and the
|
|
5
|
+
* kit records each request that the model got. `inProcessChatTurns` gives the
|
|
6
|
+
* chat turns of a runtime with no DBOS engine, over the turn in process. An
|
|
7
|
+
* embedder imports it from `@inflexa-ai/harness/testing`.
|
|
8
|
+
*/
|
|
9
|
+
import type { LanguageModelV4CallOptions, SharedV4ProviderMetadata } from "@ai-sdk/provider";
|
|
10
|
+
import type { ResolveRequestHeaders } from "./providers/request-headers.js";
|
|
11
|
+
export { inProcessChatTurns } from "./app/in-process-turn.js";
|
|
12
|
+
import type { ChatProvider, ChatUsage, ProviderCapabilities } from "./providers/types.js";
|
|
13
|
+
export type ScriptedPart = {
|
|
14
|
+
readonly type: "text";
|
|
15
|
+
readonly text: string;
|
|
16
|
+
} | {
|
|
17
|
+
readonly type: "reasoning";
|
|
18
|
+
readonly text: string;
|
|
19
|
+
readonly signature?: string;
|
|
20
|
+
} | {
|
|
21
|
+
readonly type: "tool-call";
|
|
22
|
+
readonly toolCallId: string;
|
|
23
|
+
readonly toolName: string;
|
|
24
|
+
readonly input: unknown;
|
|
25
|
+
};
|
|
26
|
+
export type ScriptedReply = {
|
|
27
|
+
readonly content: readonly ScriptedPart[];
|
|
28
|
+
readonly finishReason: "stop" | "tool-calls" | "length" | "content-filter" | "other" | "error";
|
|
29
|
+
readonly rawFinishReason?: string;
|
|
30
|
+
readonly usage?: ChatUsage;
|
|
31
|
+
readonly providerMetadata?: SharedV4ProviderMetadata;
|
|
32
|
+
readonly responseId?: string;
|
|
33
|
+
readonly modelId?: string;
|
|
34
|
+
};
|
|
35
|
+
/** A request that fails: the model throws the value when it opens its stream. */
|
|
36
|
+
export type ScriptedFailure = {
|
|
37
|
+
readonly fail: unknown;
|
|
38
|
+
};
|
|
39
|
+
/** A reply that streams its first parts, and then fails with an error part. */
|
|
40
|
+
export type ScriptedBreak = {
|
|
41
|
+
readonly breakAfter: readonly ScriptedPart[];
|
|
42
|
+
readonly error: unknown;
|
|
43
|
+
};
|
|
44
|
+
export type ScriptEntry = ScriptedReply | ScriptedFailure | ScriptedBreak;
|
|
45
|
+
export type ScriptStep = ScriptEntry | ((call: LanguageModelV4CallOptions) => ScriptEntry | Promise<ScriptEntry>);
|
|
46
|
+
export type ScriptedModel = {
|
|
47
|
+
readonly provider: ChatProvider;
|
|
48
|
+
/** Each request that the model got, in order. */
|
|
49
|
+
readonly calls: LanguageModelV4CallOptions[];
|
|
50
|
+
};
|
|
51
|
+
export declare function text(value: string): ScriptedPart;
|
|
52
|
+
export declare function reasoning(value: string, signature?: string): ScriptedPart;
|
|
53
|
+
export declare function toolCall(toolCallId: string, toolName: string, input: unknown): ScriptedPart;
|
|
54
|
+
export declare function reply(content: readonly ScriptedPart[], finishReason?: ScriptedReply["finishReason"], usage?: ChatUsage): ScriptedReply;
|
|
55
|
+
/** The reply of a round of tool calls. */
|
|
56
|
+
export declare function callTools(...calls: readonly ScriptedPart[]): ScriptedReply;
|
|
57
|
+
/** Build a provider over a scripted model. A request past the end of the script fails the test that made it. */
|
|
58
|
+
export declare function scriptedModel(script: readonly ScriptStep[], options?: {
|
|
59
|
+
readonly capabilities?: Partial<ProviderCapabilities>;
|
|
60
|
+
readonly maxRetries?: number;
|
|
61
|
+
readonly resolveRequestHeaders?: ResolveRequestHeaders;
|
|
62
|
+
}): ScriptedModel;
|
package/dist/testing.js
ADDED
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The test kit of the harness: a scripted model for a test of an agent, a chat
|
|
3
|
+
* turn, or a tool that runs a sub-agent. It is a `ChatProvider` over the mock
|
|
4
|
+
* model of the AI SDK. Each request takes the next entry of the script, and the
|
|
5
|
+
* kit records each request that the model got. `inProcessChatTurns` gives the
|
|
6
|
+
* chat turns of a runtime with no DBOS engine, over the turn in process. An
|
|
7
|
+
* embedder imports it from `@inflexa-ai/harness/testing`.
|
|
8
|
+
*/
|
|
9
|
+
import { convertArrayToReadableStream, MockLanguageModelV4 } from "ai/test";
|
|
10
|
+
import { createAiSdkProvider } from "./providers/ai-sdk.js";
|
|
11
|
+
export { inProcessChatTurns } from "./app/in-process-turn.js";
|
|
12
|
+
export function text(value) {
|
|
13
|
+
return { type: "text", text: value };
|
|
14
|
+
}
|
|
15
|
+
export function reasoning(value, signature) {
|
|
16
|
+
return signature === undefined ? { type: "reasoning", text: value } : { type: "reasoning", text: value, signature };
|
|
17
|
+
}
|
|
18
|
+
export function toolCall(toolCallId, toolName, input) {
|
|
19
|
+
return { type: "tool-call", toolCallId, toolName, input };
|
|
20
|
+
}
|
|
21
|
+
export function reply(content, finishReason = "stop", usage) {
|
|
22
|
+
return usage === undefined ? { content, finishReason } : { content, finishReason, usage };
|
|
23
|
+
}
|
|
24
|
+
/** The reply of a round of tool calls. */
|
|
25
|
+
export function callTools(...calls) {
|
|
26
|
+
return { content: calls, finishReason: "tool-calls" };
|
|
27
|
+
}
|
|
28
|
+
function v4Usage(usage) {
|
|
29
|
+
return {
|
|
30
|
+
inputTokens: { total: usage?.inputTokens, noCache: undefined, cacheRead: usage?.cacheReadInputTokens, cacheWrite: usage?.cacheCreationInputTokens },
|
|
31
|
+
outputTokens: { total: usage?.outputTokens, text: undefined, reasoning: usage?.reasoningTokens },
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
function contentParts(content) {
|
|
35
|
+
const parts = [];
|
|
36
|
+
for (const [index, part] of content.entries()) {
|
|
37
|
+
const id = `p${index}`;
|
|
38
|
+
switch (part.type) {
|
|
39
|
+
case "text":
|
|
40
|
+
parts.push({ type: "text-start", id }, { type: "text-delta", id, delta: part.text }, { type: "text-end", id });
|
|
41
|
+
break;
|
|
42
|
+
case "reasoning": {
|
|
43
|
+
const providerMetadata = part.signature === undefined ? undefined : { anthropic: { signature: part.signature } };
|
|
44
|
+
parts.push({ type: "reasoning-start", id }, { type: "reasoning-delta", id, delta: part.text }, { type: "reasoning-end", id, providerMetadata });
|
|
45
|
+
break;
|
|
46
|
+
}
|
|
47
|
+
case "tool-call":
|
|
48
|
+
parts.push({ type: "tool-call", toolCallId: part.toolCallId, toolName: part.toolName, input: JSON.stringify(part.input) });
|
|
49
|
+
break;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
return parts;
|
|
53
|
+
}
|
|
54
|
+
function streamOf(entry, index) {
|
|
55
|
+
return [
|
|
56
|
+
{ type: "stream-start", warnings: [] },
|
|
57
|
+
{ type: "response-metadata", id: entry.responseId ?? `response-${index}`, modelId: entry.modelId ?? "scripted-model", timestamp: new Date(0) },
|
|
58
|
+
...contentParts(entry.content),
|
|
59
|
+
{
|
|
60
|
+
type: "finish",
|
|
61
|
+
finishReason: { unified: entry.finishReason, raw: entry.rawFinishReason ?? entry.finishReason },
|
|
62
|
+
usage: v4Usage(entry.usage),
|
|
63
|
+
providerMetadata: entry.providerMetadata,
|
|
64
|
+
},
|
|
65
|
+
];
|
|
66
|
+
}
|
|
67
|
+
/** Build a provider over a scripted model. A request past the end of the script fails the test that made it. */
|
|
68
|
+
export function scriptedModel(script, options = {}) {
|
|
69
|
+
const calls = [];
|
|
70
|
+
const model = new MockLanguageModelV4({
|
|
71
|
+
provider: "scripted",
|
|
72
|
+
modelId: "scripted-model",
|
|
73
|
+
doStream: async (call) => {
|
|
74
|
+
const index = calls.length;
|
|
75
|
+
calls.push(call);
|
|
76
|
+
const step = script[index];
|
|
77
|
+
if (step === undefined)
|
|
78
|
+
throw new Error(`the script has no reply ${index}`);
|
|
79
|
+
const entry = typeof step === "function" ? await step(call) : step;
|
|
80
|
+
if ("fail" in entry)
|
|
81
|
+
throw entry.fail;
|
|
82
|
+
if ("breakAfter" in entry) {
|
|
83
|
+
return {
|
|
84
|
+
stream: convertArrayToReadableStream([
|
|
85
|
+
{ type: "stream-start", warnings: [] },
|
|
86
|
+
...contentParts(entry.breakAfter),
|
|
87
|
+
{ type: "error", error: entry.error },
|
|
88
|
+
]),
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
return { stream: convertArrayToReadableStream(streamOf(entry, index)) };
|
|
92
|
+
},
|
|
93
|
+
});
|
|
94
|
+
const provider = createAiSdkProvider({
|
|
95
|
+
model,
|
|
96
|
+
capabilities: options.capabilities,
|
|
97
|
+
maxRetries: options.maxRetries ?? 0,
|
|
98
|
+
resolveRequestHeaders: options.resolveRequestHeaders,
|
|
99
|
+
});
|
|
100
|
+
return { provider, calls };
|
|
101
|
+
}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { Querier } from "../state/db.js";
|
|
2
2
|
import { type AgentSession } from "../auth/types.js";
|
|
3
3
|
import type { UsageRecorder } from "../billing/usage-recorder.js";
|
|
4
4
|
import type { ResourcePolicy, ResourceSpec } from "../config/resource-limits.js";
|
|
5
5
|
import type { Logger } from "../lib/logger.js";
|
|
6
|
-
import {
|
|
6
|
+
import type { AgentRunUsage } from "../loop/metrics.js";
|
|
7
7
|
import { type ChatProvider } from "../providers/types.js";
|
|
8
8
|
import type { CheckedPackage } from "./sandbox/list-available-packages.js";
|
|
9
9
|
export declare const AD_HOC_ROUTER_AGENT_ID = "adhoc-router";
|
|
@@ -16,11 +16,11 @@ export declare const AD_HOC_FALLBACK_AGENT_ID = "scientific-executor";
|
|
|
16
16
|
* - `absent` — the bound resolution answered that the pool holds no such
|
|
17
17
|
* package, and it offered no other spelling.
|
|
18
18
|
*/
|
|
19
|
-
export
|
|
19
|
+
export type DroppedPackage = {
|
|
20
20
|
readonly entry: string;
|
|
21
21
|
readonly reason: "unparsable" | "absent";
|
|
22
|
-
}
|
|
23
|
-
export
|
|
22
|
+
};
|
|
23
|
+
export type AdHocRoute = {
|
|
24
24
|
readonly agentId: string;
|
|
25
25
|
readonly resources: ResourceSpec;
|
|
26
26
|
readonly rationale: string;
|
|
@@ -31,11 +31,11 @@ export interface AdHocRoute {
|
|
|
31
31
|
/** Every entry that the validation removed, with the reason for the caveat. */
|
|
32
32
|
readonly droppedPackages: readonly DroppedPackage[];
|
|
33
33
|
readonly fallbackClass?: "timeout" | "provider_error" | "malformed" | "no_match" | "invalid_agent" | "invalid_resources";
|
|
34
|
-
}
|
|
35
|
-
export
|
|
34
|
+
};
|
|
35
|
+
export type AdHocRouterDeps = {
|
|
36
36
|
readonly provider: ChatProvider;
|
|
37
37
|
readonly model: string;
|
|
38
|
-
readonly pool:
|
|
38
|
+
readonly pool: Querier;
|
|
39
39
|
readonly resourcePolicy?: ResourcePolicy;
|
|
40
40
|
readonly logger?: Logger;
|
|
41
41
|
/**
|
|
@@ -54,7 +54,7 @@ export interface AdHocRouterDeps {
|
|
|
54
54
|
readonly resolvePackages?: (names: readonly string[]) => Promise<readonly CheckedPackage[] | null>;
|
|
55
55
|
/** Falls back to the no-op recorder when omitted. */
|
|
56
56
|
readonly usageRecorder?: UsageRecorder;
|
|
57
|
-
}
|
|
57
|
+
};
|
|
58
58
|
export declare function defaultAdHocResources(policy?: ResourcePolicy): ResourceSpec;
|
|
59
59
|
export declare function validAdHocResources(value: unknown, policy?: ResourcePolicy): ResourceSpec | null;
|
|
60
60
|
export declare function routeAdHocRequest(deps: AdHocRouterDeps, input: {
|