@aiwg/cli 2026.10.1 → 2026.10.4
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 +2 -2
- package/agentic/code/providers/capability-matrix.yaml +270 -0
- package/agentic/code/providers/model-capabilities.v1.json +3183 -24
- package/bin/aiwg.mjs +135 -47
- package/dist/src/a2a/codecs.js +9 -0
- package/dist/src/agents/grounding/knowledge-base.js +54 -6
- package/dist/src/artifacts/browser-export.js +6 -0
- package/dist/src/artifacts/checksum-manifest.js +1 -0
- package/dist/src/artifacts/citation-parser.js +173 -92
- package/dist/src/artifacts/citation-table-schema.js +59 -0
- package/dist/src/artifacts/cli.js +57 -18
- package/dist/src/artifacts/corpus-tools/snapshot.js +1 -1
- package/dist/src/artifacts/corpus-tools/vision-extract.js +107 -15
- package/dist/src/artifacts/corpus-views/ref-parser.js +3 -1
- package/dist/src/artifacts/corpus-views/renderers.js +3 -3
- package/dist/src/artifacts/discovery-eval.js +6 -4
- package/dist/src/artifacts/fortemi-core-query-adapter.js +36 -3
- package/dist/src/artifacts/fortemi-core-sync.js +166 -40
- package/dist/src/artifacts/framework-capabilities.js +171 -0
- package/dist/src/artifacts/framework-index-paths.js +73 -0
- package/dist/src/artifacts/framework-source-digest.js +75 -0
- package/dist/src/artifacts/index-builder.js +285 -131
- package/dist/src/artifacts/index-files.js +132 -18
- package/dist/src/artifacts/index-preparation.js +65 -0
- package/dist/src/artifacts/index-refresh.js +576 -0
- package/dist/src/artifacts/index-worker.mjs +9 -0
- package/dist/src/artifacts/prebuilt-build-lock.js +47 -4
- package/dist/src/artifacts/prebuilt-deployment.js +46 -0
- package/dist/src/artifacts/prebuilt-relations.js +80 -0
- package/dist/src/artifacts/query-engine.js +410 -88
- package/dist/src/artifacts/relations-builder.js +168 -0
- package/dist/src/artifacts/relations.js +148 -0
- package/dist/src/artifacts/repair.js +9 -4
- package/dist/src/artifacts/stats.js +5 -2
- package/dist/src/artifacts/types.js +30 -10
- package/dist/src/artifacts/watcher.js +1 -1
- package/dist/src/auth/credential-store.js +2 -1
- package/dist/src/catalog/cli.d.mts +5 -0
- package/dist/src/channel/manager.d.mts +20 -0
- package/dist/src/channel/manager.mjs +78 -12
- package/dist/src/cli/child-process-result.js +40 -0
- package/dist/src/cli/command-log.js +2 -3
- package/dist/src/cli/env.js +38 -16
- package/dist/src/cli/flag-parsing.js +236 -0
- package/dist/src/cli/handlers/artifacts.js +3 -0
- package/dist/src/cli/handlers/auth.js +3 -0
- package/dist/src/cli/handlers/decision.js +218 -5
- package/dist/src/cli/handlers/diagnose.js +13 -5
- package/dist/src/cli/handlers/effect.js +4 -2
- package/dist/src/cli/handlers/evidence.js +3 -0
- package/dist/src/cli/handlers/feedback.js +14 -5
- package/dist/src/cli/handlers/help.js +1 -0
- package/dist/src/cli/handlers/index.js +3 -1
- package/dist/src/cli/handlers/init.js +248 -30
- package/dist/src/cli/handlers/lint.js +5 -0
- package/dist/src/cli/handlers/mc.js +23 -0
- package/dist/src/cli/handlers/models.js +169 -10
- package/dist/src/cli/handlers/ralph-launcher.js +2 -0
- package/dist/src/cli/handlers/ralph.js +3 -0
- package/dist/src/cli/handlers/refresh.js +28 -0
- package/dist/src/cli/handlers/regenerate.js +14 -0
- package/dist/src/cli/handlers/resource-versions.js +3 -0
- package/dist/src/cli/handlers/rules.js +195 -0
- package/dist/src/cli/handlers/run.js +4 -0
- package/dist/src/cli/handlers/runtime-info.js +25 -11
- package/dist/src/cli/handlers/script-runner.js +19 -8
- package/dist/src/cli/handlers/session.js +406 -62
- package/dist/src/cli/handlers/sessions.js +243 -76
- package/dist/src/cli/handlers/setup-manifest.js +474 -79
- package/dist/src/cli/handlers/setup.js +180 -39
- package/dist/src/cli/handlers/steward.js +11 -0
- package/dist/src/cli/handlers/subcommands.js +60 -3
- package/dist/src/cli/handlers/team.js +18 -8
- package/dist/src/cli/handlers/uhp.js +3 -0
- package/dist/src/cli/handlers/use.js +307 -55
- package/dist/src/cli/handlers/utilities.js +125 -26
- package/dist/src/cli/handlers/version.js +8 -0
- package/dist/src/cli/prompt-utils.js +72 -0
- package/dist/src/cli/provider-resolution.js +11 -0
- package/dist/src/cli/router.js +15 -1
- package/dist/src/cli/services/deployment-verification.js +19 -9
- package/dist/src/cli/services/provider-prepare-coordinator.js +24 -0
- package/dist/src/cli/skill-usage.js +2 -3
- package/dist/src/config/aiwg-config.js +349 -35
- package/dist/src/config/cli.js +256 -23
- package/dist/src/config/decision-config.js +106 -0
- package/dist/src/config/dispatch-thresholds-runtime.d.mts +8 -0
- package/dist/src/config/dispatch-thresholds-runtime.mjs +38 -0
- package/dist/src/config/gitignore.js +50 -0
- package/dist/src/config/index-graph-overrides.js +36 -0
- package/dist/src/config/project-artifacts-health.d.mts +37 -0
- package/dist/src/config/project-artifacts-health.mjs +14 -3
- package/dist/src/config/project-artifacts-runtime.d.mts +16 -0
- package/dist/src/config/user-config-dir.d.mts +9 -0
- package/dist/src/config/user-config.js +38 -11
- package/dist/src/config/user-registry.js +23 -15
- package/dist/src/config/user-state.js +7 -0
- package/dist/src/decision/adapters/jev.js +75 -27
- package/dist/src/decision/ask.js +203 -43
- package/dist/src/decision/context-live-qualification.js +2 -2
- package/dist/src/decision/driver.js +14 -7
- package/dist/src/decision/ensemble/aggregate.js +23 -10
- package/dist/src/decision/ensemble-study/multifact-study.js +6 -2
- package/dist/src/decision/entry.js +25 -6
- package/dist/src/decision/graph-live-qualification.js +1 -1
- package/dist/src/decision/graph-run.js +9 -0
- package/dist/src/decision/heldout/collector.js +15 -14
- package/dist/src/decision/heldout/contract.js +30 -7
- package/dist/src/decision/index.js +1 -0
- package/dist/src/decision/interop.js +60 -8
- package/dist/src/decision/jev-credentials.js +15 -1
- package/dist/src/decision/ledger.js +942 -0
- package/dist/src/decision/offload-activation.js +137 -0
- package/dist/src/decision/offload.js +550 -0
- package/dist/src/decision/qualification/load.js +4 -6
- package/dist/src/decision/savings.js +28 -0
- package/dist/src/decision/validate.js +6 -3
- package/dist/src/effects/dispatch-verifier.js +252 -0
- package/dist/src/effects/index.js +1 -0
- package/dist/src/effects/types.js +5 -1
- package/dist/src/effects/verifiers/git.js +2 -1
- package/dist/src/effects/verifiers/tracker.js +26 -14
- package/dist/src/extensions/commands/definitions.js +19 -0
- package/dist/src/extensions/project-local-remove.js +36 -1
- package/dist/src/features/installer.js +2 -2
- package/dist/src/flow/graph-metadata.js +5 -0
- package/dist/src/gates/providers/loader.js +64 -18
- package/dist/src/installation/manager-command.d.mts +18 -0
- package/dist/src/installation/manager-command.mjs +15 -3
- package/dist/src/installation/manager.d.mts +49 -0
- package/dist/src/installation/manager.mjs +95 -5
- package/dist/src/issues/cli.js +4 -4
- package/dist/src/issues/local.js +24 -5
- package/dist/src/jobs/runner.js +1 -1
- package/dist/src/lint/cli.js +27 -1
- package/dist/src/lint/loader.js +2 -1
- package/dist/src/lint/reporters.js +25 -1
- package/dist/src/lint/rule-activation.js +43 -0
- package/dist/src/lint/runner.js +137 -62
- package/dist/src/mcp/adapters/codex-runtime.js +366 -56
- package/dist/src/mcp/claude-install.d.mts +4 -0
- package/dist/src/mcp/claude-install.mjs +41 -0
- package/dist/src/mcp/cli.d.mts +1 -0
- package/dist/src/mcp/cli.mjs +620 -85
- package/dist/src/mcp/config-file.d.mts +28 -0
- package/dist/src/mcp/config-file.mjs +279 -0
- package/dist/src/mcp/config-layers.d.mts +36 -0
- package/dist/src/mcp/config-layers.mjs +348 -0
- package/dist/src/mcp/credentials.d.mts +51 -0
- package/dist/src/mcp/credentials.mjs +484 -0
- package/dist/src/mcp/grok-build-config.d.mts +6 -0
- package/dist/src/mcp/grok-build-config.mjs +17 -27
- package/dist/src/mcp/helpers.mjs +109 -4
- package/dist/src/mcp/muse-native-config.d.mts +13 -0
- package/dist/src/mcp/muse-native-config.mjs +1 -0
- package/dist/src/mcp/omp-config.d.mts +4 -0
- package/dist/src/mcp/omp-config.mjs +50 -29
- package/dist/src/mcp/profiles.js +97 -23
- package/dist/src/mcp/profiles.mjs +99 -27
- package/dist/src/mcp/registry.js +248 -131
- package/dist/src/mcp/registry.mjs +169 -100
- package/dist/src/mcp/server-config.d.mts +3 -0
- package/dist/src/mcp/server-config.mjs +89 -0
- package/dist/src/mcp/server.mjs +127 -82
- package/dist/src/mcp/test-simple.mjs +2 -1
- package/dist/src/mcp/toml-editor.d.mts +4 -0
- package/dist/src/mcp/toml-string.d.mts +1 -0
- package/dist/src/mcp/toml-string.mjs +9 -0
- package/dist/src/mcp/toml-strip-mcp.d.mts +1 -0
- package/dist/src/mcp/toml-strip-mcp.mjs +135 -0
- package/dist/src/mcp/tool-filters.d.mts +46 -0
- package/dist/src/mcp/tool-filters.mjs +357 -0
- package/dist/src/mcp/tools/agentic-sandbox.mjs +3 -1
- package/dist/src/mcp/tools/decision.mjs +22 -3
- package/dist/src/mcp/tools/discovery.mjs +62 -55
- package/dist/src/mcp/tools/orchestration.mjs +50 -2
- package/dist/src/mcp/tools/subsystems.mjs +39 -8
- package/dist/src/mcp/tools/worker-invoke.mjs +2856 -0
- package/dist/src/mcp/tools/worker-shell-control.mjs +289 -0
- package/dist/src/mcp/tools/worker-stdin-runtime.mjs +79 -0
- package/dist/src/memory/project-registry.js +2 -2
- package/dist/src/mission-protocol/codecs.js +647 -1
- package/dist/src/mission-protocol/types.js +110 -0
- package/dist/src/mission-protocol/worker-status.js +2 -0
- package/dist/src/models/config-loader.js +76 -14
- package/dist/src/models/grok-build-models.js +93 -41
- package/dist/src/models/model-capabilities.v1.json +3183 -24
- package/dist/src/models/model-discovery.js +931 -67
- package/dist/src/models/provider-policy.js +719 -11
- package/dist/src/models/qualification-digest.d.mts +2 -0
- package/dist/src/models/qualification-digest.mjs +17 -0
- package/dist/src/models/resolver.js +261 -0
- package/dist/src/models/worker-direct-readiness.js +550 -0
- package/dist/src/models/worker-dispatch-offer.js +169 -0
- package/dist/src/models/worker-health-readiness.js +144 -0
- package/dist/src/models/worker-installation.d.mts +39 -0
- package/dist/src/models/worker-installation.mjs +986 -0
- package/dist/src/models/wrapper-route.js +18 -0
- package/dist/src/ops/registry.js +9 -14
- package/dist/src/plugins/standalone-packager.js +4 -3
- package/dist/src/process/bounded-child-process.d.mts +84 -0
- package/dist/src/process/bounded-child-process.mjs +430 -0
- package/dist/src/process/cli-command.d.mts +16 -0
- package/dist/src/process/cli-command.mjs +75 -0
- package/dist/src/process/signal-child.d.mts +6 -0
- package/dist/src/process/signal-child.mjs +7 -0
- package/dist/src/providers/capability-matrix.js +8 -0
- package/dist/src/providers/capability-matrix.yaml +270 -0
- package/dist/src/providers/deployed-skill-roots.js +20 -0
- package/dist/src/providers/grok-build-acp.js +3 -2
- package/dist/src/providers/grok-build-headless.js +53 -23
- package/dist/src/providers/grok-build-inspect.js +1 -0
- package/dist/src/providers/omp-agent.d.mts +8 -0
- package/dist/src/providers/omp-diagnostics.d.mts +1 -0
- package/dist/src/providers/omp-paths.d.mts +13 -0
- package/dist/src/providers/provider-definitions.js +9 -1
- package/dist/src/providers/provider-definitions.mjs +9 -2
- package/dist/src/providers/skill-ownership.d.mts +9 -0
- package/dist/src/providers/skill-ownership.mjs +88 -0
- package/dist/src/rules/activation.d.mts +21 -0
- package/dist/src/rules/activation.mjs +62 -0
- package/dist/src/rules/inline-budget.d.mts +26 -0
- package/dist/src/rules/inline-budget.mjs +66 -0
- package/dist/src/rules/inventory.js +129 -0
- package/dist/src/rules/pin-state.js +73 -0
- package/dist/src/rules/pins.d.mts +14 -0
- package/dist/src/rules/pins.mjs +112 -0
- package/dist/src/rules/rule-frontmatter.schema.json +197 -0
- package/dist/src/serve/executor-registry.js +16 -24
- package/dist/src/serve/fleet-mission-conductor.js +9 -0
- package/dist/src/serve/mission-conductor.js +47 -12
- package/dist/src/serve/shared-host-scheduler.js +2 -0
- package/dist/src/serve/worker-invocation.js +558 -0
- package/dist/src/serve/worker-stdin-frame.d.mts +10 -0
- package/dist/src/serve/worker-stdin-frame.mjs +107 -0
- package/dist/src/sessions/adapter-registry.js +49 -0
- package/dist/src/sessions/adapters/claude.js +39 -54
- package/dist/src/sessions/adapters/codex.js +82 -67
- package/dist/src/sessions/adapters/copilot.js +4 -4
- package/dist/src/sessions/adapters/cursor.js +40 -57
- package/dist/src/sessions/adapters/deepseek-harness.js +15 -12
- package/dist/src/sessions/adapters/factory.js +31 -27
- package/dist/src/sessions/adapters/generic.js +43 -9
- package/dist/src/sessions/adapters/grok-build.js +11 -11
- package/dist/src/sessions/adapters/grokbot-locator.js +111 -0
- package/dist/src/sessions/adapters/grokbot.js +434 -24
- package/dist/src/sessions/adapters/hermes.js +27 -29
- package/dist/src/sessions/adapters/muse-workspace-scan.js +128 -0
- package/dist/src/sessions/adapters/muse.js +200 -104
- package/dist/src/sessions/adapters/omp.js +28 -14
- package/dist/src/sessions/adapters/openclaw.js +89 -79
- package/dist/src/sessions/adapters/opencode.js +27 -24
- package/dist/src/sessions/adapters/openhuman.js +18 -60
- package/dist/src/sessions/adapters/pi.js +30 -14
- package/dist/src/sessions/adapters/warp.js +3 -3
- package/dist/src/sessions/adapters/windsurf.js +19 -48
- package/dist/src/sessions/batch-contracts.js +25 -5
- package/dist/src/sessions/batch-import.js +72 -51
- package/dist/src/sessions/candidates.js +47 -11
- package/dist/src/sessions/contracts.js +75 -2
- package/dist/src/sessions/coverage-preflight.js +134 -0
- package/dist/src/sessions/discovery.js +3 -0
- package/dist/src/sessions/export-plan.js +4 -3
- package/dist/src/sessions/grok-build-cli.js +67 -5
- package/dist/src/sessions/import-exclusions.js +72 -0
- package/dist/src/sessions/import-lease.js +34 -18
- package/dist/src/sessions/import-limits.js +37 -0
- package/dist/src/sessions/importer.js +84 -46
- package/dist/src/sessions/index.js +2 -0
- package/dist/src/sessions/lifecycle.js +45 -0
- package/dist/src/sessions/policy.js +133 -25
- package/dist/src/sessions/readers.js +106 -53
- package/dist/src/sessions/refresh.js +106 -0
- package/dist/src/sessions/repository.js +199 -63
- package/dist/src/sessions/workspace-discovery.js +315 -88
- package/dist/src/sessions/workspace-matching.js +107 -0
- package/dist/src/skills/adapters/clawhub.js +10 -8
- package/dist/src/skills/adapters/openclaw.js +10 -7
- package/dist/src/skills/importer.js +1 -0
- package/dist/src/smiths/context-pipeline/aiwg-md.js +11 -0
- package/dist/src/smiths/context-pipeline/claude-hook.js +3 -26
- package/dist/src/smiths/context-pipeline/finalization.js +6 -5
- package/dist/src/smiths/context-pipeline/generator.js +21 -4
- package/dist/src/smiths/context-pipeline/parallelism-section.js +195 -14
- package/dist/src/smiths/context-pipeline/workspace-context.js +116 -9
- package/dist/src/smiths/hook-bridge/codex-translator.js +6 -5
- package/dist/src/smiths/mcpsmith/example.js +1 -1
- package/dist/src/smiths/mcpsmith/generator.js +1 -1
- package/dist/src/smiths/toolsmith/runtime-discovery.d.mts +10 -0
- package/dist/src/smiths/toolsmith/runtime-discovery.mjs +85 -31
- package/dist/src/storage/backends/fs.js +18 -76
- package/dist/src/storage/backends/logseq.js +68 -7
- package/dist/src/storage/backends/obsidian.js +1 -0
- package/dist/src/storage/fortemi-qualification-receipt.js +2 -2
- package/dist/src/testing/generators/test-code-generator.js +57 -30
- package/dist/src/tracker/forge-http.js +2 -1
- package/dist/src/uhp/client.js +11 -1
- package/dist/src/uhp/mission.js +5 -0
- package/dist/src/update/checker.d.mts +2 -0
- package/dist/src/update/checker.mjs +5 -5
- package/dist/src/update/notifier.mjs +54 -2
- package/dist/src/update/service.d.mts +22 -0
- package/dist/src/utils/contained-filesystem.d.mts +37 -0
- package/dist/src/utils/contained-filesystem.mjs +683 -0
- package/dist/src/utils/temporary-directory.js +36 -0
- package/dist/src/writing/example-generator.js +1 -1
- package/dist/src/writing/fidelity.js +18 -1
- package/package.json +32 -2
- package/schemas/mission-v1.schema.json +2429 -0
- package/schemas/models/model-catalog.v1.schema.json +301 -0
- package/schemas/models/model-config-compatibility.v1.schema.json +281 -0
- package/schemas/models/model-policy.v1.schema.json +14 -0
- package/schemas/models/provider-model-capabilities.v1.schema.json +1072 -0
- package/tools/_resolve-impl.mjs +39 -2
- package/tools/agents/deploy-agents.mjs +64 -23
- package/tools/agents/providers/base.mjs +153 -166
- package/tools/agents/providers/claude.mjs +8 -24
- package/tools/agents/providers/codex.mjs +18 -11
- package/tools/agents/providers/cursor.mjs +19 -18
- package/tools/agents/providers/grok-build.mjs +3 -1
- package/tools/agents/providers/grokbot.mjs +11 -12
- package/tools/agents/providers/hermes.mjs +62 -49
- package/tools/agents/providers/omp.mjs +5 -2
- package/tools/agents/providers/openclaw-translator.mjs +19 -5
- package/tools/agents/providers/openclaw.mjs +9 -4
- package/tools/agents/providers/pi.mjs +5 -0
- package/tools/agents/providers/provider-prepare-channel.mjs +5 -0
- package/tools/agents/providers/provider-prepare-coordinator.mjs +247 -0
- package/tools/agents/providers/provider-prepare-worker.mjs +84 -0
- package/tools/agents/providers/rule-delivery.mjs +1270 -0
- package/tools/agents/providers/warp.mjs +20 -26
- package/tools/cli/decision-offload-report.mjs +40 -0
- package/tools/cli/workspace-status.mjs +862 -0
- package/tools/plugin/package-plugins.mjs +186 -8
- package/tools/plugin/plugin-links.mjs +114 -0
- package/tools/providers/antigravity-transport.mjs +3 -1
- package/tools/providers/deepseek-harness-transport.mjs +360 -0
- package/tools/providers/omp-transport.mjs +194 -0
- package/tools/ralph-external/lib/claude-adapter.mjs +389 -0
- package/tools/ralph-external/lib/codex-adapter.mjs +432 -0
- package/tools/ralph-external/lib/consecutive-failure-circuit-breaker.mjs +1748 -0
- package/tools/ralph-external/lib/deepseek-harness-adapter.mjs +397 -0
- package/tools/ralph-external/lib/factory-adapter.mjs +503 -0
- package/tools/ralph-external/lib/launcher-recovery-evidence.mjs +55 -0
- package/tools/ralph-external/lib/muse-adapter.mjs +364 -0
- package/tools/ralph-external/lib/omp-adapter.mjs +315 -0
- package/tools/ralph-external/lib/opencode-adapter.mjs +575 -0
- package/tools/ralph-external/lib/openhuman-adapter.mjs +75 -0
- package/tools/ralph-external/lib/pi-adapter.mjs +329 -0
- package/tools/ralph-external/lib/provider-adapter.mjs +748 -0
- package/tools/ralph-external/lib/recovery-probe.mjs +72 -0
- package/tools/ralph-external/lib/session-environment.mjs +28 -0
- package/tools/ralph-external/lib/systemd-client.mjs +49 -0
- package/tools/ralph-external/lib/worker-health.mjs +439 -0
- package/tools/ralph-external/lib/worker-isolation.mjs +717 -0
- package/tools/ralph-external/lib/worker-overflow.mjs +50 -0
- package/tools/ralph-external/process-monitor.mjs +1017 -0
- package/tools/ralph-external/session-launcher.mjs +5057 -0
- package/tools/scripts/resource-preflight.mjs +541 -0
- package/tools/skills/deploy-skills-codex.mjs +2 -1
- package/vscode-extension/schemas/aiwg.config.v1.json +2916 -0
|
@@ -10,7 +10,7 @@ import { QUALIFICATION_PRIVACY_SURFACES, scanQualificationPrivacy } from '../qua
|
|
|
10
10
|
import { executeQualificationPlan, verifyQualificationArtifacts, writeQualificationEvidenceManifest } from '../qualification/runner.js';
|
|
11
11
|
import { qualificationIntegrityAllowlistProblems } from '../qualification/release.js';
|
|
12
12
|
import { redactText } from '../../governance/redaction.js';
|
|
13
|
-
import { heldoutDigest, heldoutRequest, heldoutReservationMicros, heldoutReservationTokens, HeldoutError, HELDOUT_ENV_GATE, heldoutRowsInScope, planHeldoutCollection, validateHeldoutBundle } from './contract.js';
|
|
13
|
+
import { heldoutDigest, heldoutRequest, heldoutReservationMicros, heldoutReservationTokens, HeldoutError, HELDOUT_ENV_GATE, heldoutRowsInScope, heldoutResumeAttempts, heldoutPendingRequests, planHeldoutCollection, validateHeldoutBundle } from './contract.js';
|
|
14
14
|
import { appendHeldoutSpend, appendHeldoutEvent, heldoutDirectory, heldoutEvidenceDigest, heldoutRunsRoot, readHeldoutFile, readHeldoutJournal, reconcileHeldoutBaseline, scanHeldoutSpend, writeHeldoutFile, validateHeldoutJournal, heldoutCollectionAllowance } from './journal.js';
|
|
15
15
|
import { readHeldoutFrozen, sealHeldoutCalibrationPhase, validateHeldoutPhaseAccess } from './calibration.js';
|
|
16
16
|
import { D17_MULTIFACT_CALIBRATION_NOT_AFTER, usesD17MultifactGenerator } from './study-generators.js';
|
|
@@ -70,13 +70,7 @@ export async function collectHeldoutStudy(options) {
|
|
|
70
70
|
throw new HeldoutError('prior-stop');
|
|
71
71
|
if (!offline && prior.runs.some(run => run.corpusDigest === a.corpusDigest && run.source === 'injected-transport'))
|
|
72
72
|
throw new HeldoutError('injected-prior');
|
|
73
|
-
const old = prior.attempts
|
|
74
|
-
if (old.some(attempt => attempt.preregistrationDigest !== a.preregistrationDigest))
|
|
75
|
-
throw new HeldoutError('changed-preregistration');
|
|
76
|
-
const latest = new Map();
|
|
77
|
-
for (const attempt of old)
|
|
78
|
-
if (attempt.ordinal >= (latest.get(key(attempt))?.ordinal ?? 0))
|
|
79
|
-
latest.set(key(attempt), attempt);
|
|
73
|
+
const { old, latest } = heldoutResumeAttempts(bundle, prior.attempts);
|
|
80
74
|
const now = options.now ?? Date.now, sleep = options.sleep ?? delay, started = now();
|
|
81
75
|
// D17-MF (#2850) is scored only through the registered D17 member calibrator: a session whose whole dispatch window
|
|
82
76
|
// (start plus the preregistered session limit) does not end before the calibrator expires never starts. A seed
|
|
@@ -127,20 +121,18 @@ export async function collectHeldoutStudy(options) {
|
|
|
127
121
|
}
|
|
128
122
|
if (failed.has(row.id) || overSlice(row.slice, row.split))
|
|
129
123
|
continue;
|
|
130
|
-
const remaining = row
|
|
124
|
+
const remaining = heldoutPendingRequests(row, plan, latest);
|
|
131
125
|
if (!remaining.length)
|
|
132
126
|
continue;
|
|
133
127
|
// Checkpoint before a subject/paired arms: enough time for every bounded attempt and interval.
|
|
134
|
-
const pairBound = remaining.
|
|
128
|
+
const pairBound = remaining.reduce((n, request) => n + request.attempts, 0) * (plan.requestTimeoutMs + plan.minDispatchIntervalMs);
|
|
135
129
|
if (now() - started + pairBound > plan.sessionLimitMs * 0.8) {
|
|
136
130
|
checkpoint = true;
|
|
137
131
|
break;
|
|
138
132
|
}
|
|
139
|
-
for (const request of remaining) {
|
|
133
|
+
for (const { request, first } of remaining) {
|
|
140
134
|
if (reason || failed.has(row.id))
|
|
141
135
|
break;
|
|
142
|
-
const previous = latest.get(`${row.id}/${request.id}`);
|
|
143
|
-
const first = previous ? previous.ordinal + 1 : 1;
|
|
144
136
|
for (let ordinal = first; ordinal <= 1 + plan.providerFailurePolicy.maxRetries; ordinal++) {
|
|
145
137
|
if (options.signal?.aborted) {
|
|
146
138
|
reason = 'cancelled';
|
|
@@ -250,6 +242,12 @@ export async function collectHeldoutStudy(options) {
|
|
|
250
242
|
// No raw provider exceptions, model IDs or request IDs cross this boundary when a secret matches.
|
|
251
243
|
const raw = observation;
|
|
252
244
|
const metadata = wireMetadata;
|
|
245
|
+
// `metadata` is `jev.ts`'s observer, reading model/usage off the exact same single parse that
|
|
246
|
+
// produced `raw` (never a second, independent parse of the same bytes -- see jev.ts `observeParsed`).
|
|
247
|
+
// The two can therefore no longer disagree on a successful response; preferring `metadata` here
|
|
248
|
+
// only matters when `raw` is a failure (e.g. an otherwise-parseable but invalid answer), so the
|
|
249
|
+
// model/usage bound checks below still see the wire-observed values jev.ts's `failure()` does not
|
|
250
|
+
// carry.
|
|
253
251
|
const observed = raw && metadata ? { ...raw, actualModel: metadata.actualModel, usage: metadata.usage } : raw;
|
|
254
252
|
const completed = receipt;
|
|
255
253
|
const captures = QUALIFICATION_PRIVACY_SURFACES.map(surface => ({ surface,
|
|
@@ -275,7 +273,10 @@ export async function collectHeldoutStudy(options) {
|
|
|
275
273
|
else if (observed?.usage.costUsd !== null && observed?.usage.costUsd !== undefined && observed.usage.costUsd * 1_000_000 > reserveMicros)
|
|
276
274
|
outcome = 'price-bound';
|
|
277
275
|
else if (observed?.status === 'success') {
|
|
278
|
-
|
|
276
|
+
// A null model is unknown, not a mismatch: it must complete neither as 'ok' nor as 'served-model'.
|
|
277
|
+
if (observed.actualModel === null)
|
|
278
|
+
outcome = 'model-unknown';
|
|
279
|
+
else if (observed.actualModel !== a.servedModel)
|
|
279
280
|
outcome = 'served-model';
|
|
280
281
|
else if (observed.usage.inputTokens === null || observed.usage.outputTokens === null)
|
|
281
282
|
outcome = 'usage-unknown';
|
|
@@ -260,26 +260,49 @@ export async function assertHeldoutRequestBounds(corpus, plan, approval) {
|
|
|
260
260
|
}
|
|
261
261
|
}
|
|
262
262
|
}
|
|
263
|
-
|
|
263
|
+
/** Prior observations are reusable only within the same study, corpus and preregistration. */
|
|
264
|
+
export function heldoutResumeAttempts(bundle, prior) {
|
|
265
|
+
const a = bundle.approval;
|
|
266
|
+
const old = prior.filter(attempt => attempt.study === a.study && attempt.corpusDigest === a.corpusDigest);
|
|
267
|
+
if (old.some(attempt => attempt.preregistrationDigest !== a.preregistrationDigest))
|
|
268
|
+
throw new HeldoutError('changed-preregistration');
|
|
269
|
+
const latest = new Map();
|
|
270
|
+
for (const attempt of old) {
|
|
271
|
+
const key = `${attempt.rowId}/${attempt.requestId}`, previous = latest.get(key);
|
|
272
|
+
if (previous?.result?.disposition !== 'success' && (attempt.result?.disposition === 'success'
|
|
273
|
+
|| attempt.ordinal >= (previous?.ordinal ?? 0)))
|
|
274
|
+
latest.set(key, attempt);
|
|
275
|
+
}
|
|
276
|
+
return { old, latest };
|
|
277
|
+
}
|
|
278
|
+
/** The collector and dry-run reserve only unfinished requests, with their unspent retry allowance. */
|
|
279
|
+
export function heldoutPendingRequests(row, plan, latest) {
|
|
280
|
+
return row.requests.flatMap(request => {
|
|
281
|
+
const previous = latest.get(`${row.id}/${request.id}`);
|
|
282
|
+
const first = (previous?.ordinal ?? 0) + 1, attempts = 2 + plan.providerFailurePolicy.maxRetries - first;
|
|
283
|
+
return previous?.result?.disposition === 'success' || attempts <= 0 ? [] : [{ request, first, attempts }];
|
|
284
|
+
});
|
|
285
|
+
}
|
|
286
|
+
export async function planHeldoutCollection(bundle, digest, prior = []) {
|
|
264
287
|
validateHeldoutBundle(bundle, digest);
|
|
265
288
|
await assertHeldoutRequestBounds(bundle.corpus, bundle.preregistration, bundle.approval);
|
|
266
|
-
|
|
289
|
+
const { latest } = heldoutResumeAttempts(bundle, prior);
|
|
290
|
+
let maximumRequestEstimateTokens = 0, tokens = 0, usdMicros = 0, maximumAttempts = 0;
|
|
267
291
|
const rows = heldoutRowsInScope(bundle);
|
|
268
292
|
for (const row of rows)
|
|
269
|
-
for (const request of row.
|
|
293
|
+
for (const { request, attempts } of heldoutPendingRequests(row, bundle.preregistration, latest)) {
|
|
270
294
|
const planned = await heldoutRequest(bundle.corpus, bundle.preregistration, bundle.approval, row, request);
|
|
271
295
|
maximumRequestEstimateTokens = Math.max(maximumRequestEstimateTokens, planned.estimatedTokens);
|
|
272
296
|
const reservation = heldoutReservationMicros(bundle.approval, planned.estimatedTokens);
|
|
273
297
|
if (reservation > Math.floor(bundle.approval.budget.usd * 1_000_000))
|
|
274
298
|
throw new HeldoutError('approval-call-budget');
|
|
275
|
-
|
|
299
|
+
maximumAttempts += attempts;
|
|
276
300
|
tokens += attempts * heldoutReservationTokens(bundle.preregistration, planned.estimatedTokens);
|
|
277
301
|
usdMicros += attempts * reservation;
|
|
278
302
|
}
|
|
279
|
-
const attempts = rows.reduce((n, r) => n + r.requests.length, 0) * (1 + bundle.preregistration.providerFailurePolicy.maxRetries);
|
|
280
303
|
const a = bundle.approval;
|
|
281
|
-
return { calibration: structuredClone(a.calibration), rowsInScope: rows.map(row => row.id), providerCalls: 0, maximumAttempts
|
|
282
|
-
fitsBeforeStop:
|
|
304
|
+
return { calibration: structuredClone(a.calibration), rowsInScope: rows.map(row => row.id), providerCalls: 0, maximumAttempts, maximumRequestEstimateTokens, reservedTokens: tokens, reservedUsdMicros: usdMicros,
|
|
305
|
+
fitsBeforeStop: maximumAttempts <= Math.floor(a.budget.calls * 0.8) && tokens <= Math.floor(a.budget.tokens * 0.8)
|
|
283
306
|
&& usdMicros <= Math.floor(Math.min(a.budget.usd, HELDOUT_CAP_USD[a.study] - a.priorStudySpendUsd, HELDOUT_PORTFOLIO_CAP_USD - a.priorPortfolioSpendUsd) * 800_000) };
|
|
284
307
|
}
|
|
285
308
|
/** An intentionally unapproved, unpriced form. Unknown attestations stay null, never fixture approvals. */
|
|
@@ -54,6 +54,7 @@ export * from './issue-triage/index.js';
|
|
|
54
54
|
export * from './routing/index.js';
|
|
55
55
|
export * from './interop.js';
|
|
56
56
|
export * from './ask.js';
|
|
57
|
+
export * from './ledger.js';
|
|
57
58
|
export * from './jev-credentials.js';
|
|
58
59
|
export { collectHeldoutStudy, scoreHeldoutStudy } from './heldout/collector.js';
|
|
59
60
|
export { heldoutDigest, heldoutExecutionDigest, planHeldoutCollection, validateHeldoutBundle, heldoutRowsInScope } from './heldout/contract.js';
|
|
@@ -38,7 +38,8 @@ const FORBIDDEN_CONTROL_FIELDS = new Set([
|
|
|
38
38
|
'calibration', 'executor', 'backend', 'acceptance', 'artifactPin', 'actionAuthorization',
|
|
39
39
|
]);
|
|
40
40
|
const SENSITIVE_LOG_KEY = /(?:raw|body|secret|token|credential|private|locator|state|authorization|password|key)/iu;
|
|
41
|
-
const SENSITIVE_LOG_VALUE = /(?:bearer\s+\S+|secret|token|file:\/\/|\/home\/|private
|
|
41
|
+
const SENSITIVE_LOG_VALUE = /(?:bearer\s+\S+|secret|token|file:\/\/|\/home\/|private)/iu;
|
|
42
|
+
const MAX_LOG_VALUE_LENGTH = 65_536;
|
|
42
43
|
const SUPPORTED_DMN_ELEMENTS = new Set(['definitions', 'decision', 'informationRequirement', 'requiredDecision', 'decisionTable', 'input', 'inputExpression', 'output', 'rule', 'inputEntry', 'outputEntry', 'text']);
|
|
43
44
|
export function decisionInteropDefaultBounds(overrides = {}) {
|
|
44
45
|
return { ...DEFAULT_BOUNDS, ...overrides };
|
|
@@ -580,7 +581,11 @@ function sanitizeJson(value, path, redaction) {
|
|
|
580
581
|
redaction.removed.push(`${path}.${key}`);
|
|
581
582
|
continue;
|
|
582
583
|
}
|
|
583
|
-
|
|
584
|
+
// Keep ordinary objects while preserving __proto__ as an own JSON data key.
|
|
585
|
+
Object.defineProperty(result, key, {
|
|
586
|
+
value: sanitizeJson(child, `${path}.${key}`, redaction),
|
|
587
|
+
enumerable: true, writable: true, configurable: true,
|
|
588
|
+
});
|
|
584
589
|
}
|
|
585
590
|
return result;
|
|
586
591
|
}
|
|
@@ -595,10 +600,16 @@ function projectOpaInput(input, allowlist, redaction) {
|
|
|
595
600
|
for (const pointer of allowlist) {
|
|
596
601
|
if (!pointer.startsWith('/'))
|
|
597
602
|
throw new DecisionInteropError('opa-input-projection', 'OPA input projection allowlist entries must be JSON Pointers');
|
|
603
|
+
const path = pointer.slice(1).split('/').map(part => part.replace(/~1/gu, '/').replace(/~0/gu, '~'));
|
|
604
|
+
// Only __proto__ is forbidden in pointers; constructor/prototype are valid data keys.
|
|
605
|
+
// Own-property traversal and data-property writes keep ordinary projection objects safe.
|
|
606
|
+
if (path.some(segment => segment === '__proto__')) {
|
|
607
|
+
throw new DecisionInteropError('opa-input-projection', 'OPA input projection cannot contain __proto__ segments');
|
|
608
|
+
}
|
|
598
609
|
const resolved = resolveJsonPointer(input, pointer);
|
|
599
610
|
if (!resolved.found)
|
|
600
611
|
continue;
|
|
601
|
-
setProjectedValue(output,
|
|
612
|
+
setProjectedValue(output, path, sanitizeJson(resolved.value, `$.input${pointer}`, redaction));
|
|
602
613
|
}
|
|
603
614
|
return output;
|
|
604
615
|
}
|
|
@@ -606,17 +617,58 @@ function setProjectedValue(target, path, value) {
|
|
|
606
617
|
let cursor = target;
|
|
607
618
|
path.forEach((segment, index) => {
|
|
608
619
|
if (index === path.length - 1) {
|
|
609
|
-
cursor
|
|
620
|
+
Object.defineProperty(cursor, segment, {
|
|
621
|
+
value, enumerable: true, writable: true, configurable: true,
|
|
622
|
+
});
|
|
610
623
|
return;
|
|
611
624
|
}
|
|
612
|
-
const existing = cursor[segment];
|
|
613
|
-
if (!existing || typeof existing !== 'object' || Array.isArray(existing))
|
|
614
|
-
cursor
|
|
625
|
+
const existing = Object.hasOwn(cursor, segment) ? cursor[segment] : undefined;
|
|
626
|
+
if (!existing || typeof existing !== 'object' || Array.isArray(existing)) {
|
|
627
|
+
Object.defineProperty(cursor, segment, {
|
|
628
|
+
value: {}, enumerable: true, writable: true, configurable: true,
|
|
629
|
+
});
|
|
630
|
+
}
|
|
615
631
|
cursor = cursor[segment];
|
|
616
632
|
});
|
|
617
633
|
}
|
|
618
634
|
function isSensitiveValue(value) {
|
|
619
|
-
|
|
635
|
+
if (typeof value !== 'string')
|
|
636
|
+
return false;
|
|
637
|
+
// Redact oversized values in full so a sensitive suffix cannot escape inspection.
|
|
638
|
+
if (value.length > MAX_LOG_VALUE_LENGTH)
|
|
639
|
+
return true;
|
|
640
|
+
if (SENSITIVE_LOG_VALUE.test(value))
|
|
641
|
+
return true;
|
|
642
|
+
let localLength = 0;
|
|
643
|
+
let domainLength = -1;
|
|
644
|
+
let suffixLength = -1;
|
|
645
|
+
for (const character of value) {
|
|
646
|
+
const letter = /[A-Z]/iu.test(character);
|
|
647
|
+
if (character === '@') {
|
|
648
|
+
domainLength = localLength > 0 ? 0 : -1;
|
|
649
|
+
suffixLength = -1;
|
|
650
|
+
}
|
|
651
|
+
else if (domainLength >= 0) {
|
|
652
|
+
if (/[A-Z0-9.-]/iu.test(character)) {
|
|
653
|
+
if (character === '.')
|
|
654
|
+
suffixLength = domainLength > 0 ? 0 : -1;
|
|
655
|
+
else if (letter && suffixLength >= 0) {
|
|
656
|
+
suffixLength++;
|
|
657
|
+
if (suffixLength >= 2)
|
|
658
|
+
return true;
|
|
659
|
+
}
|
|
660
|
+
else
|
|
661
|
+
suffixLength = -1;
|
|
662
|
+
domainLength++;
|
|
663
|
+
}
|
|
664
|
+
else {
|
|
665
|
+
domainLength = -1;
|
|
666
|
+
suffixLength = -1;
|
|
667
|
+
}
|
|
668
|
+
}
|
|
669
|
+
localLength = /[A-Z0-9._%+-]/iu.test(character) ? localLength + 1 : 0;
|
|
670
|
+
}
|
|
671
|
+
return false;
|
|
620
672
|
}
|
|
621
673
|
function assertUnique(values, label) {
|
|
622
674
|
const seen = new Set();
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { resolveDecisionEnablement } from '../config/decision-config.js';
|
|
1
2
|
import { constants } from 'node:fs';
|
|
2
3
|
import { access, chmod, mkdir, readFile, rename, rm, stat, writeFile } from 'node:fs/promises';
|
|
3
4
|
import os from 'node:os';
|
|
@@ -64,7 +65,8 @@ export async function lookupJevCredential(options = {}) {
|
|
|
64
65
|
const forced = environment.AIWG_DECISION_ENABLED;
|
|
65
66
|
const envToken = environment.JEV_API_KEY?.trim() || environment.AIWG_DECISION_JEV_API_KEY?.trim();
|
|
66
67
|
const fileRecord = envToken && (forced === '0' || forced === '1') ? null : await readCredentialFile(options);
|
|
67
|
-
const
|
|
68
|
+
const enablement = resolveDecisionEnablement(options);
|
|
69
|
+
const enabled = enablement.source === 'default' ? fileRecord?.enabled === true : enablement.enabled;
|
|
68
70
|
if (envToken)
|
|
69
71
|
return {
|
|
70
72
|
source: 'env',
|
|
@@ -78,6 +80,18 @@ export async function lookupJevCredential(options = {}) {
|
|
|
78
80
|
return null;
|
|
79
81
|
return { source: 'file', token: fileRecord.token, region: fileRecord.region, ...(fileRecord.endpoint ? { endpoint: fileRecord.endpoint } : {}), enabled };
|
|
80
82
|
}
|
|
83
|
+
/** Offline metadata-only inspection. Never probes Jev and never returns credential bytes. */
|
|
84
|
+
export async function inspectJevCredential(options = {}) {
|
|
85
|
+
try {
|
|
86
|
+
const credential = await lookupJevCredential(options);
|
|
87
|
+
if (!credential)
|
|
88
|
+
return { configured: false, enabled: false, source: 'none' };
|
|
89
|
+
return { configured: true, enabled: credential.enabled, source: credential.source };
|
|
90
|
+
}
|
|
91
|
+
catch {
|
|
92
|
+
return { configured: null, enabled: null, source: 'unknown' };
|
|
93
|
+
}
|
|
94
|
+
}
|
|
81
95
|
export async function resolveJevCredentialBytes(logicalRef, options = {}) {
|
|
82
96
|
if (logicalRef !== JEV_CREDENTIAL_REF)
|
|
83
97
|
throw new JevCredentialError('configuration');
|