pi-daddy 0.28.0 → 0.32.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +99 -124
- package/README.md +18 -896
- package/THIRD_PARTY_NOTICES.md +1 -1
- package/contracts/ledger-record/v1/README.md +44 -0
- package/contracts/ledger-record/v1/fixtures/child-lifecycle.json +45 -0
- package/contracts/ledger-record/v1/fixtures/ledger-record.jsonl +3 -0
- package/contracts/ledger-record/v1/governance-event.schema.json +747 -0
- package/contracts/ledger-record/v1/record.schema.json +91 -0
- package/dist/cli.d.ts +6 -4
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +108 -103
- package/dist/cli.js.map +1 -1
- package/dist/executors/activity-session.d.ts +12 -0
- package/dist/executors/activity-session.d.ts.map +1 -0
- package/dist/executors/activity-session.js +43 -0
- package/dist/executors/activity-session.js.map +1 -0
- package/dist/executors/executor.d.ts +39 -0
- package/dist/executors/executor.d.ts.map +1 -0
- package/dist/executors/executor.js +95 -0
- package/dist/executors/executor.js.map +1 -0
- package/dist/executors/herdr-cli.d.ts +78 -0
- package/dist/executors/herdr-cli.d.ts.map +1 -0
- package/dist/executors/herdr-cli.js +114 -0
- package/dist/executors/herdr-cli.js.map +1 -0
- package/dist/executors/herdr-name.d.ts.map +1 -0
- package/dist/executors/herdr-name.js.map +1 -0
- package/dist/executors/herdr-pi-lifecycle.d.ts.map +1 -0
- package/dist/executors/herdr-pi-lifecycle.js +22 -0
- package/dist/executors/herdr-pi-lifecycle.js.map +1 -0
- package/dist/executors/herdr-poll.d.ts +140 -0
- package/dist/executors/herdr-poll.d.ts.map +1 -0
- package/dist/executors/herdr-poll.js +252 -0
- package/dist/executors/herdr-poll.js.map +1 -0
- package/dist/executors/herdr-stage.d.ts +40 -0
- package/dist/executors/herdr-stage.d.ts.map +1 -0
- package/dist/executors/herdr-stage.js +54 -0
- package/dist/executors/herdr-stage.js.map +1 -0
- package/dist/executors/herdr-start.d.ts.map +1 -0
- package/dist/executors/herdr-start.js.map +1 -0
- package/dist/executors/native-session-target.d.ts +9 -0
- package/dist/executors/native-session-target.d.ts.map +1 -0
- package/dist/executors/native-session-target.js +30 -0
- package/dist/executors/native-session-target.js.map +1 -0
- package/dist/executors/pane-reaper.d.ts +111 -0
- package/dist/executors/pane-reaper.d.ts.map +1 -0
- package/dist/executors/pane-reaper.js +242 -0
- package/dist/executors/pane-reaper.js.map +1 -0
- package/dist/executors/process-activity.d.ts +3 -0
- package/dist/executors/process-activity.d.ts.map +1 -0
- package/dist/executors/process-activity.js +59 -0
- package/dist/executors/process-activity.js.map +1 -0
- package/dist/executors/run-herdr.d.ts +122 -0
- package/dist/executors/run-herdr.d.ts.map +1 -0
- package/dist/executors/run-herdr.js +341 -0
- package/dist/executors/run-herdr.js.map +1 -0
- package/dist/executors/vendor/herdr-pi-lifecycle.d.ts.map +1 -0
- package/dist/executors/vendor/herdr-pi-lifecycle.js.map +1 -0
- package/dist/governance/approval-prompt.d.ts +119 -0
- package/dist/governance/approval-prompt.d.ts.map +1 -0
- package/dist/governance/approval-prompt.js +133 -0
- package/dist/governance/approval-prompt.js.map +1 -0
- package/dist/governance/approval-store.d.ts +149 -0
- package/dist/governance/approval-store.d.ts.map +1 -0
- package/dist/governance/approval-store.js +309 -0
- package/dist/governance/approval-store.js.map +1 -0
- package/dist/governance/execution-retention.d.ts +90 -0
- package/dist/governance/execution-retention.d.ts.map +1 -0
- package/dist/governance/execution-retention.js +317 -0
- package/dist/governance/execution-retention.js.map +1 -0
- package/dist/governance/file-lock.d.ts.map +1 -0
- package/dist/governance/file-lock.js +205 -0
- package/dist/governance/file-lock.js.map +1 -0
- package/dist/governance/finalization.d.ts.map +1 -0
- package/dist/governance/finalization.js.map +1 -0
- package/dist/governance/grant-store.d.ts +96 -0
- package/dist/governance/grant-store.d.ts.map +1 -0
- package/dist/governance/grant-store.js +186 -0
- package/dist/governance/grant-store.js.map +1 -0
- package/dist/governance/init.d.ts +129 -0
- package/dist/governance/init.d.ts.map +1 -0
- package/dist/governance/init.js +360 -0
- package/dist/governance/init.js.map +1 -0
- package/dist/governance/lease-helper.d.ts.map +1 -0
- package/dist/governance/lease-helper.js +121 -0
- package/dist/governance/lease-helper.js.map +1 -0
- package/dist/governance/lease-record.d.ts +90 -0
- package/dist/governance/lease-record.d.ts.map +1 -0
- package/dist/governance/lease-record.js.map +1 -0
- package/dist/governance/ledger-events.d.ts +111 -0
- package/dist/governance/ledger-events.d.ts.map +1 -0
- package/dist/governance/ledger-events.js +129 -0
- package/dist/governance/ledger-events.js.map +1 -0
- package/dist/governance/ledger-report.d.ts +134 -0
- package/dist/governance/ledger-report.d.ts.map +1 -0
- package/dist/governance/ledger-report.js +294 -0
- package/dist/governance/ledger-report.js.map +1 -0
- package/dist/governance/ledger-v3-validation.d.ts +21 -0
- package/dist/governance/ledger-v3-validation.d.ts.map +1 -0
- package/dist/governance/ledger-v3-validation.js +353 -0
- package/dist/governance/ledger-v3-validation.js.map +1 -0
- package/dist/governance/ledger.d.ts +258 -0
- package/dist/governance/ledger.d.ts.map +1 -0
- package/dist/governance/ledger.js +201 -0
- package/dist/governance/ledger.js.map +1 -0
- package/dist/governance/native-session.d.ts +59 -0
- package/dist/governance/native-session.d.ts.map +1 -0
- package/dist/governance/native-session.js +208 -0
- package/dist/governance/native-session.js.map +1 -0
- package/dist/governance/record.d.ts +65 -0
- package/dist/governance/record.d.ts.map +1 -0
- package/dist/governance/record.js +259 -0
- package/dist/governance/record.js.map +1 -0
- package/dist/governance/retention-contract.d.ts.map +1 -0
- package/dist/governance/retention-contract.js +187 -0
- package/dist/governance/retention-contract.js.map +1 -0
- package/dist/governance/retention-json.d.ts.map +1 -0
- package/dist/governance/retention-json.js.map +1 -0
- package/dist/governance/workspace-lease.d.ts +40 -0
- package/dist/governance/workspace-lease.d.ts.map +1 -0
- package/dist/governance/workspace-lease.js +357 -0
- package/dist/governance/workspace-lease.js.map +1 -0
- package/dist/index.d.ts +59 -42
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +61 -42
- package/dist/index.js.map +1 -1
- package/dist/kernel/approval.d.ts +241 -0
- package/dist/kernel/approval.d.ts.map +1 -0
- package/dist/kernel/approval.js +270 -0
- package/dist/kernel/approval.js.map +1 -0
- package/dist/kernel/capabilities.d.ts +136 -0
- package/dist/kernel/capabilities.d.ts.map +1 -0
- package/dist/kernel/capabilities.js +199 -0
- package/dist/kernel/capabilities.js.map +1 -0
- package/dist/kernel/catalog.d.ts +98 -0
- package/dist/kernel/catalog.d.ts.map +1 -0
- package/dist/kernel/catalog.js +280 -0
- package/dist/kernel/catalog.js.map +1 -0
- package/dist/kernel/chain.d.ts.map +1 -0
- package/dist/kernel/chain.js.map +1 -0
- package/dist/kernel/correlation.d.ts.map +1 -0
- package/dist/kernel/correlation.js +267 -0
- package/dist/kernel/correlation.js.map +1 -0
- package/dist/kernel/definitions.d.ts.map +1 -0
- package/dist/kernel/definitions.js +164 -0
- package/dist/kernel/definitions.js.map +1 -0
- package/dist/kernel/delegate-types.d.ts +160 -0
- package/dist/kernel/delegate-types.d.ts.map +1 -0
- package/dist/kernel/delegate-types.js +9 -0
- package/dist/kernel/delegate-types.js.map +1 -0
- package/dist/kernel/delegate.d.ts.map +1 -0
- package/dist/kernel/delegate.js +314 -0
- package/dist/kernel/delegate.js.map +1 -0
- package/dist/kernel/delegation-approval.d.ts.map +1 -0
- package/dist/kernel/delegation-approval.js +93 -0
- package/dist/kernel/delegation-approval.js.map +1 -0
- package/dist/kernel/env-names.d.ts +51 -0
- package/dist/kernel/env-names.d.ts.map +1 -0
- package/dist/kernel/env-names.js +112 -0
- package/dist/kernel/env-names.js.map +1 -0
- package/dist/kernel/execution-id.d.ts.map +1 -0
- package/dist/kernel/execution-id.js.map +1 -0
- package/dist/kernel/fanout.d.ts.map +1 -0
- package/dist/kernel/fanout.js +93 -0
- package/dist/kernel/fanout.js.map +1 -0
- package/dist/kernel/grant-env.d.ts +118 -0
- package/dist/kernel/grant-env.d.ts.map +1 -0
- package/dist/kernel/grant-env.js +104 -0
- package/dist/kernel/grant-env.js.map +1 -0
- package/dist/kernel/ledger-identifiers.d.ts.map +1 -0
- package/dist/kernel/ledger-identifiers.js.map +1 -0
- package/dist/kernel/model-preflight.d.ts +13 -0
- package/dist/kernel/model-preflight.d.ts.map +1 -0
- package/dist/kernel/model-preflight.js +30 -0
- package/dist/kernel/model-preflight.js.map +1 -0
- package/dist/kernel/pi-tools.d.ts.map +1 -0
- package/dist/kernel/pi-tools.js +29 -0
- package/dist/kernel/pi-tools.js.map +1 -0
- package/dist/kernel/progress.d.ts.map +1 -0
- package/dist/kernel/progress.js.map +1 -0
- package/dist/kernel/project-paths.d.ts +43 -0
- package/dist/kernel/project-paths.d.ts.map +1 -0
- package/dist/kernel/project-paths.js +81 -0
- package/dist/kernel/project-paths.js.map +1 -0
- package/dist/kernel/propagation.d.ts +195 -0
- package/dist/kernel/propagation.d.ts.map +1 -0
- package/dist/kernel/propagation.js +275 -0
- package/dist/kernel/propagation.js.map +1 -0
- package/dist/kernel/refusals.d.ts +16 -0
- package/dist/kernel/refusals.d.ts.map +1 -0
- package/dist/kernel/refusals.js +53 -0
- package/dist/kernel/refusals.js.map +1 -0
- package/dist/kernel/resolve.d.ts.map +1 -0
- package/dist/kernel/resolve.js +201 -0
- package/dist/kernel/resolve.js.map +1 -0
- package/dist/kernel/routing-authority.d.ts.map +1 -0
- package/dist/kernel/routing-authority.js.map +1 -0
- package/dist/kernel/run-child.d.ts +111 -0
- package/dist/kernel/run-child.d.ts.map +1 -0
- package/dist/kernel/run-child.js +324 -0
- package/dist/kernel/run-child.js.map +1 -0
- package/dist/kernel/skill-packages.d.ts +116 -0
- package/dist/kernel/skill-packages.d.ts.map +1 -0
- package/dist/kernel/skill-packages.js +300 -0
- package/dist/kernel/skill-packages.js.map +1 -0
- package/dist/kernel/skill-resources.d.ts.map +1 -0
- package/dist/kernel/skill-resources.js +56 -0
- package/dist/kernel/skill-resources.js.map +1 -0
- package/dist/kernel/spawn.d.ts.map +1 -0
- package/dist/kernel/spawn.js.map +1 -0
- package/dist/kernel/workspace.d.ts +51 -0
- package/dist/kernel/workspace.d.ts.map +1 -0
- package/dist/kernel/workspace.js +223 -0
- package/dist/kernel/workspace.js.map +1 -0
- package/dist/products/activity-timeline.d.ts +126 -0
- package/dist/products/activity-timeline.d.ts.map +1 -0
- package/dist/products/activity-timeline.js +542 -0
- package/dist/products/activity-timeline.js.map +1 -0
- package/dist/products/dashboard-cli.d.ts +26 -0
- package/dist/products/dashboard-cli.d.ts.map +1 -0
- package/dist/products/dashboard-cli.js +224 -0
- package/dist/products/dashboard-cli.js.map +1 -0
- package/dist/products/dashboard-display-controls.d.ts +17 -0
- package/dist/products/dashboard-display-controls.d.ts.map +1 -0
- package/dist/products/dashboard-display-controls.js +38 -0
- package/dist/products/dashboard-display-controls.js.map +1 -0
- package/dist/products/dashboard-handshake.d.ts +42 -0
- package/dist/products/dashboard-handshake.d.ts.map +1 -0
- package/dist/products/dashboard-handshake.js +158 -0
- package/dist/products/dashboard-handshake.js.map +1 -0
- package/dist/products/dashboard-herdr.d.ts +55 -0
- package/dist/products/dashboard-herdr.d.ts.map +1 -0
- package/dist/products/dashboard-herdr.js +324 -0
- package/dist/products/dashboard-herdr.js.map +1 -0
- package/dist/products/dashboard-projection.d.ts +62 -0
- package/dist/products/dashboard-projection.d.ts.map +1 -0
- package/dist/products/dashboard-projection.js +305 -0
- package/dist/products/dashboard-projection.js.map +1 -0
- package/dist/products/dashboard-render.d.ts.map +1 -0
- package/dist/products/dashboard-render.js +208 -0
- package/dist/products/dashboard-render.js.map +1 -0
- package/extensions/activity-timeline.ts +134 -28
- package/extensions/approval-banking.ts +3 -3
- package/extensions/approvals.ts +18 -12
- package/extensions/chain-approval-facts.ts +9 -6
- package/extensions/chain-ledger.ts +4 -4
- package/extensions/chain-plan.ts +6 -6
- package/extensions/correlation-shape.ts +42 -33
- package/extensions/delegate-chain.ts +93 -45
- package/extensions/delegation-authority.ts +7 -3
- package/extensions/delegation-ledger.ts +2 -2
- package/extensions/delegation-native.ts +24 -7
- package/extensions/delegation.ts +91 -80
- package/extensions/execute-child.ts +440 -293
- package/extensions/execution-occurrence.ts +2 -2
- package/extensions/executor-session.ts +5 -5
- package/extensions/fanout-outcome.ts +8 -6
- package/extensions/grant-store-refusal.ts +24 -12
- package/extensions/grants-command.ts +41 -33
- package/extensions/grants-connected-command.ts +29 -15
- package/extensions/grants.ts +73 -73
- package/extensions/init-command.ts +18 -12
- package/extensions/reload-environment.ts +12 -5
- package/extensions/run-delegation.ts +29 -19
- package/extensions/session-environment.ts +25 -11
- package/extensions/session-report.ts +60 -11
- package/extensions/session.ts +58 -34
- package/extensions/spawn-summary.ts +5 -5
- package/extensions/stored-grant-session.ts +5 -5
- package/extensions/tripwire.ts +1 -1
- package/extensions/workspace-runtime.ts +26 -24
- package/herdr-plugin/herdr-plugin.toml +1 -1
- package/package.json +4 -211
- package/src/cli.ts +136 -89
- package/src/executors/activity-session.ts +54 -0
- package/src/executors/executor.ts +123 -0
- package/src/executors/herdr-cli.ts +132 -0
- package/src/executors/herdr-pi-lifecycle.ts +21 -0
- package/src/executors/herdr-poll.ts +305 -0
- package/src/executors/herdr-stage.ts +55 -0
- package/src/executors/native-session-target.ts +31 -0
- package/src/executors/pane-reaper.ts +270 -0
- package/src/executors/process-activity.ts +54 -0
- package/src/executors/run-herdr.ts +426 -0
- package/src/governance/approval-prompt.ts +225 -0
- package/src/governance/approval-store.ts +385 -0
- package/src/governance/execution-retention.ts +372 -0
- package/src/governance/file-lock.ts +210 -0
- package/src/governance/finalization.ts +82 -0
- package/src/governance/grant-store.ts +235 -0
- package/src/governance/init.ts +447 -0
- package/src/governance/lease-helper.ts +124 -0
- package/src/governance/lease-record.ts +131 -0
- package/src/governance/ledger-events.ts +222 -0
- package/src/governance/ledger-report.ts +396 -0
- package/src/governance/ledger-v3-validation.ts +384 -0
- package/src/governance/ledger.ts +419 -0
- package/src/governance/native-session.ts +264 -0
- package/src/governance/record.ts +294 -0
- package/src/governance/retention-contract.ts +201 -0
- package/src/governance/retention-json.ts +24 -0
- package/src/governance/workspace-lease.ts +429 -0
- package/src/index.ts +82 -92
- package/src/kernel/approval.ts +406 -0
- package/src/kernel/capabilities.ts +216 -0
- package/src/kernel/catalog.ts +313 -0
- package/src/kernel/correlation.ts +351 -0
- package/src/kernel/definitions.ts +215 -0
- package/src/kernel/delegate-types.ts +162 -0
- package/src/kernel/delegate.ts +370 -0
- package/src/kernel/delegation-approval.ts +126 -0
- package/src/kernel/env-names.ts +119 -0
- package/src/kernel/fanout.ts +106 -0
- package/src/kernel/grant-env.ts +174 -0
- package/src/kernel/model-preflight.ts +44 -0
- package/src/kernel/pi-tools.ts +32 -0
- package/src/kernel/project-paths.ts +97 -0
- package/src/kernel/propagation.ts +341 -0
- package/src/kernel/refusals.ts +64 -0
- package/src/kernel/resolve.ts +258 -0
- package/src/kernel/run-child.ts +418 -0
- package/src/kernel/skill-packages.ts +329 -0
- package/src/kernel/skill-resources.ts +64 -0
- package/src/kernel/workspace.ts +336 -0
- package/src/products/activity-timeline.ts +679 -0
- package/src/products/dashboard-cli.ts +250 -0
- package/src/products/dashboard-display-controls.ts +44 -0
- package/src/products/dashboard-handshake.ts +222 -0
- package/src/products/dashboard-herdr.ts +427 -0
- package/src/products/dashboard-projection.ts +389 -0
- package/src/products/dashboard-render.ts +260 -0
- package/PRODUCT-GUIDE.md +0 -155
- package/REQUIREMENTS.md +0 -41
- package/contracts/daily-view/v1/README.md +0 -114
- package/contracts/daily-view/v1/fixtures/view.json +0 -525
- package/contracts/daily-view/v1/fixtures/view.txt +0 -75
- package/contracts/daily-view/v1/fixtures/work.jsonl +0 -17
- package/contracts/daily-view/v1/p03/README.md +0 -26
- package/contracts/daily-view/v1/p03/fixtures/retained-executions.json +0 -241
- package/contracts/daily-view/v1/p03/projection.schema.json +0 -194
- package/contracts/daily-view/v1/p03/provenance.json +0 -21
- package/contracts/dashboard-host/v1/README.md +0 -176
- package/contracts/debrief/v1/README.md +0 -146
- package/contracts/debrief/v1/intervention/README.md +0 -32
- package/contracts/debrief/v1/intervention/fixtures/artifact-3ee11136beb864f518252e5024dae9197421fbf97b6e981d3243c782b5c44bd0.txt +0 -1
- package/contracts/debrief/v1/intervention/fixtures/artifact-58905d872dd3c54a9705f67b05fa82edbad7af6476ae8993faf1a7b9fadfb905.txt +0 -1
- package/contracts/debrief/v1/intervention/fixtures/assessment.json +0 -29
- package/contracts/debrief/v1/intervention/fixtures/blind-view.json +0 -20
- package/contracts/debrief/v1/intervention/fixtures/choice.json +0 -7
- package/contracts/debrief/v1/intervention/fixtures/manifest.json +0 -57
- package/contracts/debrief/v1/intervention/fixtures/reveal.json +0 -39
- package/contracts/debrief/v1/provenance.json +0 -89
- package/contracts/debrief/v1/work-capture/README.md +0 -38
- package/contracts/debrief/v1/work-capture/fixtures/batch.json +0 -17
- package/contracts/debrief/v1/work-capture/fixtures/cases.json +0 -184
- package/contracts/debrief/v1/work-capture/fixtures/review.json +0 -184
- package/contracts/debrief/v1/work-capture/review-request.schema.json +0 -41
- package/contracts/debrief/v1/work-capture/work-case.schema.json +0 -190
- package/contracts/debrief/v2/README.md +0 -71
- package/contracts/debrief/v2/input-pin.json +0 -66
- package/contracts/debrief/v2/intervention-upstream.md +0 -40
- package/contracts/debrief/v2/work-signals-upstream.md +0 -22
- package/contracts/dispatch-control/v1/README.md +0 -109
- package/contracts/dispatch-control/v1/request.schema.json +0 -19
- package/contracts/effect-profile/v1/README.md +0 -124
- package/contracts/execution-retention/v1/README.md +0 -109
- package/contracts/execution-retention/v2/README.md +0 -148
- package/contracts/execution-retention/v2/fixtures/interrupted-native-bytes.json +0 -91
- package/contracts/execution-retention/v2/fixtures/missing-native-session.json +0 -91
- package/contracts/execution-retention/v2/fixtures/native-file-unknown-branch.json +0 -91
- package/contracts/execution-retention/v2/fixtures/native-id-without-bytes.json +0 -91
- package/contracts/execution-retention/v2/fixtures/native-live-branch.json +0 -90
- package/contracts/execution-retention/v2/fixtures/replaced-native-session.json +0 -92
- package/contracts/execution-retention/v2/fixtures/result-82c620cdfeb8ca6b858cf653d7f5e2eedca5315d6244216d60e8b36f03223d6a.bin +0 -1
- package/contracts/execution-retention/v2/fixtures/session-2ec1f134bc739984434f7fca689e1c3d1c39fce2dcadae709e9b6faedfcc4ac7.bin +0 -3
- package/contracts/execution-retention/v2/fixtures/session-9bdb4bd16a901da31580acf056bda525225259e15ec409e0410480109011772f.bin +0 -3
- package/contracts/execution-retention/v2/manifest.schema.json +0 -858
- package/contracts/experiment/v1/README.md +0 -164
- package/contracts/factory-order/v1/README.md +0 -151
- package/contracts/factory-order/v1/adoption-pin.json +0 -8
- package/contracts/intent-control/v1/README.md +0 -135
- package/contracts/intent-control/v1/request.schema.json +0 -1096
- package/contracts/intent-control/v2/README.md +0 -34
- package/contracts/intent-control/v2/request.schema.json +0 -1070
- package/contracts/ledger/v2/README.md +0 -59
- package/contracts/ledger/v2/fixtures/capability-decision.json +0 -95
- package/contracts/ledger/v2/fixtures/check-receipt.json +0 -40
- package/contracts/ledger/v2/fixtures/child-lifecycle.json +0 -42
- package/contracts/ledger/v2/fixtures/workspace-lease.json +0 -41
- package/contracts/ledger/v2/ledger-event.schema.json +0 -633
- package/contracts/ledger/v3/README.md +0 -36
- package/contracts/ledger/v3/fixtures/check-receipt.json +0 -41
- package/contracts/ledger/v3/fixtures/child-lifecycle.json +0 -44
- package/contracts/ledger/v3/fixtures/workflow-fact.json +0 -40
- package/contracts/ledger/v3/ledger-event.schema.json +0 -955
- package/contracts/ledger/v4/README.md +0 -241
- package/contracts/ledger/v4/fixtures/layout-options.json +0 -428
- package/contracts/ledger/v4/fixtures/work-acceptance.json +0 -57
- package/contracts/ledger/v4/fixtures/work-occurrence.json +0 -44
- package/contracts/ledger/v4/fixtures/work-revision.json +0 -26
- package/contracts/ledger/v4/fixtures/work-snapshot.json +0 -73
- package/contracts/ledger/v4/ledger-event.schema.json +0 -162
- package/contracts/ordinary-control/v1/README.md +0 -59
- package/contracts/producer-ipc/v1/README.md +0 -137
- package/dist/activity-timeline.d.ts +0 -109
- package/dist/activity-timeline.d.ts.map +0 -1
- package/dist/activity-timeline.js +0 -208
- package/dist/activity-timeline.js.map +0 -1
- package/dist/approval-prompt.d.ts +0 -119
- package/dist/approval-prompt.d.ts.map +0 -1
- package/dist/approval-prompt.js +0 -133
- package/dist/approval-prompt.js.map +0 -1
- package/dist/approval-store.d.ts +0 -149
- package/dist/approval-store.d.ts.map +0 -1
- package/dist/approval-store.js +0 -314
- package/dist/approval-store.js.map +0 -1
- package/dist/approval.d.ts +0 -241
- package/dist/approval.d.ts.map +0 -1
- package/dist/approval.js +0 -268
- package/dist/approval.js.map +0 -1
- package/dist/capabilities.d.ts +0 -136
- package/dist/capabilities.d.ts.map +0 -1
- package/dist/capabilities.js +0 -203
- package/dist/capabilities.js.map +0 -1
- package/dist/catalog.d.ts +0 -98
- package/dist/catalog.d.ts.map +0 -1
- package/dist/catalog.js +0 -273
- package/dist/catalog.js.map +0 -1
- package/dist/chain.d.ts.map +0 -1
- package/dist/chain.js.map +0 -1
- package/dist/check-runner.d.ts +0 -66
- package/dist/check-runner.d.ts.map +0 -1
- package/dist/check-runner.js +0 -275
- package/dist/check-runner.js.map +0 -1
- package/dist/control-journal.d.ts +0 -20
- package/dist/control-journal.d.ts.map +0 -1
- package/dist/control-journal.js +0 -73
- package/dist/control-journal.js.map +0 -1
- package/dist/correlation.d.ts.map +0 -1
- package/dist/correlation.js +0 -231
- package/dist/correlation.js.map +0 -1
- package/dist/daily-dashboard-host.d.ts +0 -136
- package/dist/daily-dashboard-host.d.ts.map +0 -1
- package/dist/daily-dashboard-host.js +0 -164
- package/dist/daily-dashboard-host.js.map +0 -1
- package/dist/daily-panel.d.ts +0 -36
- package/dist/daily-panel.d.ts.map +0 -1
- package/dist/daily-panel.js +0 -84
- package/dist/daily-panel.js.map +0 -1
- package/dist/daily-view-input.d.ts +0 -44
- package/dist/daily-view-input.d.ts.map +0 -1
- package/dist/daily-view-input.js +0 -68
- package/dist/daily-view-input.js.map +0 -1
- package/dist/daily-view-render.d.ts +0 -5
- package/dist/daily-view-render.d.ts.map +0 -1
- package/dist/daily-view-render.js +0 -42
- package/dist/daily-view-render.js.map +0 -1
- package/dist/daily-view.d.ts +0 -77
- package/dist/daily-view.d.ts.map +0 -1
- package/dist/daily-view.js +0 -176
- package/dist/daily-view.js.map +0 -1
- package/dist/dashboard-cli.d.ts +0 -54
- package/dist/dashboard-cli.d.ts.map +0 -1
- package/dist/dashboard-cli.js +0 -367
- package/dist/dashboard-cli.js.map +0 -1
- package/dist/dashboard-display-controls.d.ts +0 -15
- package/dist/dashboard-display-controls.d.ts.map +0 -1
- package/dist/dashboard-display-controls.js +0 -34
- package/dist/dashboard-display-controls.js.map +0 -1
- package/dist/dashboard-handshake.d.ts +0 -42
- package/dist/dashboard-handshake.d.ts.map +0 -1
- package/dist/dashboard-handshake.js +0 -147
- package/dist/dashboard-handshake.js.map +0 -1
- package/dist/dashboard-harness.d.ts +0 -22
- package/dist/dashboard-harness.d.ts.map +0 -1
- package/dist/dashboard-harness.js +0 -89
- package/dist/dashboard-harness.js.map +0 -1
- package/dist/dashboard-herdr.d.ts +0 -55
- package/dist/dashboard-herdr.d.ts.map +0 -1
- package/dist/dashboard-herdr.js +0 -293
- package/dist/dashboard-herdr.js.map +0 -1
- package/dist/dashboard-host-contract.d.ts +0 -127
- package/dist/dashboard-host-contract.d.ts.map +0 -1
- package/dist/dashboard-host-contract.js +0 -14
- package/dist/dashboard-host-contract.js.map +0 -1
- package/dist/dashboard-host-transport.d.ts +0 -16
- package/dist/dashboard-host-transport.d.ts.map +0 -1
- package/dist/dashboard-host-transport.js +0 -127
- package/dist/dashboard-host-transport.js.map +0 -1
- package/dist/dashboard-host.d.ts +0 -239
- package/dist/dashboard-host.d.ts.map +0 -1
- package/dist/dashboard-host.js +0 -474
- package/dist/dashboard-host.js.map +0 -1
- package/dist/dashboard-menu.d.ts +0 -16
- package/dist/dashboard-menu.d.ts.map +0 -1
- package/dist/dashboard-menu.js +0 -33
- package/dist/dashboard-menu.js.map +0 -1
- package/dist/dashboard-observation.d.ts +0 -28
- package/dist/dashboard-observation.d.ts.map +0 -1
- package/dist/dashboard-observation.js +0 -87
- package/dist/dashboard-observation.js.map +0 -1
- package/dist/dashboard-projection.d.ts +0 -73
- package/dist/dashboard-projection.d.ts.map +0 -1
- package/dist/dashboard-projection.js +0 -294
- package/dist/dashboard-projection.js.map +0 -1
- package/dist/dashboard-render.d.ts.map +0 -1
- package/dist/dashboard-render.js +0 -212
- package/dist/dashboard-render.js.map +0 -1
- package/dist/debrief-contract.d.ts +0 -65
- package/dist/debrief-contract.d.ts.map +0 -1
- package/dist/debrief-contract.js +0 -151
- package/dist/debrief-contract.js.map +0 -1
- package/dist/debrief-fixture.d.ts +0 -16
- package/dist/debrief-fixture.d.ts.map +0 -1
- package/dist/debrief-fixture.js +0 -41
- package/dist/debrief-fixture.js.map +0 -1
- package/dist/debrief-host.d.ts +0 -59
- package/dist/debrief-host.d.ts.map +0 -1
- package/dist/debrief-host.js +0 -49
- package/dist/debrief-host.js.map +0 -1
- package/dist/debrief-render.d.ts +0 -5
- package/dist/debrief-render.d.ts.map +0 -1
- package/dist/debrief-render.js +0 -65
- package/dist/debrief-render.js.map +0 -1
- package/dist/debrief.d.ts +0 -90
- package/dist/debrief.d.ts.map +0 -1
- package/dist/debrief.js +0 -263
- package/dist/debrief.js.map +0 -1
- package/dist/definitions.d.ts.map +0 -1
- package/dist/definitions.js +0 -164
- package/dist/definitions.js.map +0 -1
- package/dist/delegate-types.d.ts +0 -154
- package/dist/delegate-types.d.ts.map +0 -1
- package/dist/delegate-types.js +0 -8
- package/dist/delegate-types.js.map +0 -1
- package/dist/delegate.d.ts.map +0 -1
- package/dist/delegate.js +0 -313
- package/dist/delegate.js.map +0 -1
- package/dist/delegation-approval.d.ts.map +0 -1
- package/dist/delegation-approval.js +0 -94
- package/dist/delegation-approval.js.map +0 -1
- package/dist/dispatch-control.d.ts +0 -45
- package/dist/dispatch-control.d.ts.map +0 -1
- package/dist/dispatch-control.js +0 -76
- package/dist/dispatch-control.js.map +0 -1
- package/dist/effect-profile-runtime.d.ts +0 -40
- package/dist/effect-profile-runtime.d.ts.map +0 -1
- package/dist/effect-profile-runtime.js +0 -51
- package/dist/effect-profile-runtime.js.map +0 -1
- package/dist/effect-profile.d.ts +0 -40
- package/dist/effect-profile.d.ts.map +0 -1
- package/dist/effect-profile.js +0 -152
- package/dist/effect-profile.js.map +0 -1
- package/dist/execution-id.d.ts.map +0 -1
- package/dist/execution-id.js.map +0 -1
- package/dist/execution-retention.d.ts +0 -90
- package/dist/execution-retention.d.ts.map +0 -1
- package/dist/execution-retention.js +0 -247
- package/dist/execution-retention.js.map +0 -1
- package/dist/executor.d.ts +0 -39
- package/dist/executor.d.ts.map +0 -1
- package/dist/executor.js +0 -94
- package/dist/executor.js.map +0 -1
- package/dist/experiment-contract.d.ts +0 -56
- package/dist/experiment-contract.d.ts.map +0 -1
- package/dist/experiment-contract.js +0 -80
- package/dist/experiment-contract.js.map +0 -1
- package/dist/experiment-state.d.ts +0 -22
- package/dist/experiment-state.d.ts.map +0 -1
- package/dist/experiment-state.js +0 -79
- package/dist/experiment-state.js.map +0 -1
- package/dist/experiment-store.d.ts +0 -30
- package/dist/experiment-store.d.ts.map +0 -1
- package/dist/experiment-store.js +0 -147
- package/dist/experiment-store.js.map +0 -1
- package/dist/experiment.d.ts +0 -65
- package/dist/experiment.d.ts.map +0 -1
- package/dist/experiment.js +0 -362
- package/dist/experiment.js.map +0 -1
- package/dist/factory-contract.d.ts +0 -79
- package/dist/factory-contract.d.ts.map +0 -1
- package/dist/factory-contract.js +0 -89
- package/dist/factory-contract.js.map +0 -1
- package/dist/factory-migration.d.ts +0 -20
- package/dist/factory-migration.d.ts.map +0 -1
- package/dist/factory-migration.js +0 -55
- package/dist/factory-migration.js.map +0 -1
- package/dist/factory-order.d.ts +0 -848
- package/dist/factory-order.d.ts.map +0 -1
- package/dist/factory-order.js +0 -83
- package/dist/factory-order.js.map +0 -1
- package/dist/factory-registry.d.ts +0 -121
- package/dist/factory-registry.d.ts.map +0 -1
- package/dist/factory-registry.js +0 -133
- package/dist/factory-registry.js.map +0 -1
- package/dist/fanout.d.ts.map +0 -1
- package/dist/fanout.js +0 -93
- package/dist/fanout.js.map +0 -1
- package/dist/file-lock.d.ts.map +0 -1
- package/dist/file-lock.js +0 -201
- package/dist/file-lock.js.map +0 -1
- package/dist/finalization.d.ts.map +0 -1
- package/dist/finalization.js.map +0 -1
- package/dist/git-identity.d.ts +0 -13
- package/dist/git-identity.d.ts.map +0 -1
- package/dist/git-identity.js +0 -47
- package/dist/git-identity.js.map +0 -1
- package/dist/grant-env.d.ts +0 -75
- package/dist/grant-env.d.ts.map +0 -1
- package/dist/grant-env.js +0 -154
- package/dist/grant-env.js.map +0 -1
- package/dist/grant-store.d.ts +0 -96
- package/dist/grant-store.d.ts.map +0 -1
- package/dist/grant-store.js +0 -188
- package/dist/grant-store.js.map +0 -1
- package/dist/herdr-cli.d.ts +0 -78
- package/dist/herdr-cli.d.ts.map +0 -1
- package/dist/herdr-cli.js +0 -113
- package/dist/herdr-cli.js.map +0 -1
- package/dist/herdr-name.d.ts.map +0 -1
- package/dist/herdr-name.js.map +0 -1
- package/dist/herdr-pi-lifecycle.d.ts.map +0 -1
- package/dist/herdr-pi-lifecycle.js +0 -22
- package/dist/herdr-pi-lifecycle.js.map +0 -1
- package/dist/herdr-poll.d.ts +0 -133
- package/dist/herdr-poll.d.ts.map +0 -1
- package/dist/herdr-poll.js +0 -222
- package/dist/herdr-poll.js.map +0 -1
- package/dist/herdr-stage.d.ts +0 -40
- package/dist/herdr-stage.d.ts.map +0 -1
- package/dist/herdr-stage.js +0 -54
- package/dist/herdr-stage.js.map +0 -1
- package/dist/herdr-start.d.ts.map +0 -1
- package/dist/herdr-start.js.map +0 -1
- package/dist/init.d.ts +0 -117
- package/dist/init.d.ts.map +0 -1
- package/dist/init.js +0 -323
- package/dist/init.js.map +0 -1
- package/dist/intent-application.d.ts +0 -17
- package/dist/intent-application.d.ts.map +0 -1
- package/dist/intent-application.js +0 -114
- package/dist/intent-application.js.map +0 -1
- package/dist/intent-control.d.ts +0 -201
- package/dist/intent-control.d.ts.map +0 -1
- package/dist/intent-control.js +0 -110
- package/dist/intent-control.js.map +0 -1
- package/dist/intent-scheduling.d.ts +0 -9
- package/dist/intent-scheduling.d.ts.map +0 -1
- package/dist/intent-scheduling.js +0 -15
- package/dist/intent-scheduling.js.map +0 -1
- package/dist/learning-connection.d.ts +0 -127
- package/dist/learning-connection.d.ts.map +0 -1
- package/dist/learning-connection.js +0 -54
- package/dist/learning-connection.js.map +0 -1
- package/dist/lease-helper.d.ts.map +0 -1
- package/dist/lease-helper.js +0 -94
- package/dist/lease-helper.js.map +0 -1
- package/dist/lease-record.d.ts +0 -90
- package/dist/lease-record.d.ts.map +0 -1
- package/dist/lease-record.js.map +0 -1
- package/dist/ledger-append.d.ts +0 -15
- package/dist/ledger-append.d.ts.map +0 -1
- package/dist/ledger-append.js +0 -94
- package/dist/ledger-append.js.map +0 -1
- package/dist/ledger-events.d.ts +0 -131
- package/dist/ledger-events.d.ts.map +0 -1
- package/dist/ledger-events.js +0 -107
- package/dist/ledger-events.js.map +0 -1
- package/dist/ledger-identifiers.d.ts.map +0 -1
- package/dist/ledger-identifiers.js.map +0 -1
- package/dist/ledger-report.d.ts +0 -134
- package/dist/ledger-report.d.ts.map +0 -1
- package/dist/ledger-report.js +0 -271
- package/dist/ledger-report.js.map +0 -1
- package/dist/ledger-v3-validation.d.ts +0 -11
- package/dist/ledger-v3-validation.d.ts.map +0 -1
- package/dist/ledger-v3-validation.js +0 -265
- package/dist/ledger-v3-validation.js.map +0 -1
- package/dist/ledger.d.ts +0 -242
- package/dist/ledger.d.ts.map +0 -1
- package/dist/ledger.js +0 -142
- package/dist/ledger.js.map +0 -1
- package/dist/measured-order.d.ts +0 -249
- package/dist/measured-order.d.ts.map +0 -1
- package/dist/measured-order.js +0 -309
- package/dist/measured-order.js.map +0 -1
- package/dist/measured-session.d.ts +0 -97
- package/dist/measured-session.d.ts.map +0 -1
- package/dist/measured-session.js +0 -134
- package/dist/measured-session.js.map +0 -1
- package/dist/model-preflight.d.ts +0 -13
- package/dist/model-preflight.d.ts.map +0 -1
- package/dist/model-preflight.js +0 -29
- package/dist/model-preflight.js.map +0 -1
- package/dist/native-session-target.d.ts +0 -9
- package/dist/native-session-target.d.ts.map +0 -1
- package/dist/native-session-target.js +0 -29
- package/dist/native-session-target.js.map +0 -1
- package/dist/native-session.d.ts +0 -59
- package/dist/native-session.d.ts.map +0 -1
- package/dist/native-session.js +0 -154
- package/dist/native-session.js.map +0 -1
- package/dist/order-schedule.d.ts +0 -37
- package/dist/order-schedule.d.ts.map +0 -1
- package/dist/order-schedule.js +0 -81
- package/dist/order-schedule.js.map +0 -1
- package/dist/ordinary-children.d.ts +0 -52
- package/dist/ordinary-children.d.ts.map +0 -1
- package/dist/ordinary-children.js +0 -93
- package/dist/ordinary-children.js.map +0 -1
- package/dist/pane-reaper.d.ts +0 -111
- package/dist/pane-reaper.d.ts.map +0 -1
- package/dist/pane-reaper.js +0 -242
- package/dist/pane-reaper.js.map +0 -1
- package/dist/pi-tools.d.ts.map +0 -1
- package/dist/pi-tools.js +0 -21
- package/dist/pi-tools.js.map +0 -1
- package/dist/producer-ipc-contract.d.ts +0 -29
- package/dist/producer-ipc-contract.d.ts.map +0 -1
- package/dist/producer-ipc-contract.js +0 -29
- package/dist/producer-ipc-contract.js.map +0 -1
- package/dist/producer-ipc.d.ts +0 -55
- package/dist/producer-ipc.d.ts.map +0 -1
- package/dist/producer-ipc.js +0 -143
- package/dist/producer-ipc.js.map +0 -1
- package/dist/product-files.d.ts +0 -6
- package/dist/product-files.d.ts.map +0 -1
- package/dist/product-files.js +0 -55
- package/dist/product-files.js.map +0 -1
- package/dist/progress.d.ts.map +0 -1
- package/dist/progress.js.map +0 -1
- package/dist/propagation.d.ts +0 -203
- package/dist/propagation.d.ts.map +0 -1
- package/dist/propagation.js +0 -279
- package/dist/propagation.js.map +0 -1
- package/dist/refusals.d.ts +0 -16
- package/dist/refusals.d.ts.map +0 -1
- package/dist/refusals.js +0 -55
- package/dist/refusals.js.map +0 -1
- package/dist/resolve.d.ts.map +0 -1
- package/dist/resolve.js +0 -211
- package/dist/resolve.js.map +0 -1
- package/dist/resource-budget.d.ts +0 -334
- package/dist/resource-budget.d.ts.map +0 -1
- package/dist/resource-budget.js +0 -415
- package/dist/resource-budget.js.map +0 -1
- package/dist/retention-contract.d.ts.map +0 -1
- package/dist/retention-contract.js +0 -104
- package/dist/retention-contract.js.map +0 -1
- package/dist/retention-json.d.ts.map +0 -1
- package/dist/retention-json.js.map +0 -1
- package/dist/routing-authority.d.ts.map +0 -1
- package/dist/routing-authority.js.map +0 -1
- package/dist/run-child.d.ts +0 -87
- package/dist/run-child.d.ts.map +0 -1
- package/dist/run-child.js +0 -248
- package/dist/run-child.js.map +0 -1
- package/dist/run-herdr.d.ts +0 -119
- package/dist/run-herdr.d.ts.map +0 -1
- package/dist/run-herdr.js +0 -335
- package/dist/run-herdr.js.map +0 -1
- package/dist/skill-packages.d.ts +0 -116
- package/dist/skill-packages.d.ts.map +0 -1
- package/dist/skill-packages.js +0 -295
- package/dist/skill-packages.js.map +0 -1
- package/dist/skill-resources.d.ts.map +0 -1
- package/dist/skill-resources.js +0 -52
- package/dist/skill-resources.js.map +0 -1
- package/dist/spawn.d.ts.map +0 -1
- package/dist/spawn.js.map +0 -1
- package/dist/vendor/adoption.d.ts +0 -129
- package/dist/vendor/adoption.d.ts.map +0 -1
- package/dist/vendor/adoption.js +0 -102
- package/dist/vendor/adoption.js.map +0 -1
- package/dist/vendor/herdr-pi-lifecycle.d.ts.map +0 -1
- package/dist/vendor/herdr-pi-lifecycle.js.map +0 -1
- package/dist/work-command.d.ts +0 -32
- package/dist/work-command.d.ts.map +0 -1
- package/dist/work-command.js +0 -179
- package/dist/work-command.js.map +0 -1
- package/dist/work-ledger-destination.d.ts +0 -20
- package/dist/work-ledger-destination.d.ts.map +0 -1
- package/dist/work-ledger-destination.js +0 -131
- package/dist/work-ledger-destination.js.map +0 -1
- package/dist/work-ledger-json.d.ts +0 -25
- package/dist/work-ledger-json.d.ts.map +0 -1
- package/dist/work-ledger-json.js +0 -267
- package/dist/work-ledger-json.js.map +0 -1
- package/dist/work-ledger-occurrences.d.ts +0 -227
- package/dist/work-ledger-occurrences.d.ts.map +0 -1
- package/dist/work-ledger-occurrences.js +0 -115
- package/dist/work-ledger-occurrences.js.map +0 -1
- package/dist/work-ledger-projection.d.ts +0 -295
- package/dist/work-ledger-projection.d.ts.map +0 -1
- package/dist/work-ledger-projection.js +0 -237
- package/dist/work-ledger-projection.js.map +0 -1
- package/dist/work-ledger-snapshot.d.ts +0 -29
- package/dist/work-ledger-snapshot.d.ts.map +0 -1
- package/dist/work-ledger-snapshot.js +0 -267
- package/dist/work-ledger-snapshot.js.map +0 -1
- package/dist/work-ledger-types.d.ts +0 -261
- package/dist/work-ledger-types.d.ts.map +0 -1
- package/dist/work-ledger-types.js +0 -13
- package/dist/work-ledger-types.js.map +0 -1
- package/dist/work-ledger-validation.d.ts +0 -14
- package/dist/work-ledger-validation.d.ts.map +0 -1
- package/dist/work-ledger-validation.js +0 -226
- package/dist/work-ledger-validation.js.map +0 -1
- package/dist/work-ledger.d.ts +0 -43
- package/dist/work-ledger.d.ts.map +0 -1
- package/dist/work-ledger.js +0 -225
- package/dist/work-ledger.js.map +0 -1
- package/dist/work-policy-registry.d.ts +0 -133
- package/dist/work-policy-registry.d.ts.map +0 -1
- package/dist/work-policy-registry.js +0 -128
- package/dist/work-policy-registry.js.map +0 -1
- package/dist/work-run.d.ts +0 -56
- package/dist/work-run.d.ts.map +0 -1
- package/dist/work-run.js +0 -102
- package/dist/work-run.js.map +0 -1
- package/dist/work-setup.d.ts +0 -40
- package/dist/work-setup.d.ts.map +0 -1
- package/dist/work-setup.js +0 -174
- package/dist/work-setup.js.map +0 -1
- package/dist/workflow-fact-id.d.ts +0 -4
- package/dist/workflow-fact-id.d.ts.map +0 -1
- package/dist/workflow-fact-id.js +0 -14
- package/dist/workflow-fact-id.js.map +0 -1
- package/dist/workflow-facts.d.ts +0 -34
- package/dist/workflow-facts.d.ts.map +0 -1
- package/dist/workflow-facts.js +0 -43
- package/dist/workflow-facts.js.map +0 -1
- package/dist/workspace-lease.d.ts +0 -40
- package/dist/workspace-lease.d.ts.map +0 -1
- package/dist/workspace-lease.js +0 -333
- package/dist/workspace-lease.js.map +0 -1
- package/dist/workspace.d.ts +0 -57
- package/dist/workspace.d.ts.map +0 -1
- package/dist/workspace.js +0 -216
- package/dist/workspace.js.map +0 -1
- package/extensions/daily-dashboard-session.ts +0 -48
- package/extensions/daily-work-session.ts +0 -20
- package/extensions/learning-outcome-session.ts +0 -38
- package/extensions/learning-session.ts +0 -59
- package/extensions/ordinary-runtime.ts +0 -14
- package/extensions/primary-shadow.ts +0 -11
- package/extensions/work-policy-session.ts +0 -139
- package/extensions/work-run-session.ts +0 -75
- package/extensions/work-runtime.ts +0 -44
- package/extensions/work-session.ts +0 -132
- package/src/activity-timeline.ts +0 -133
- package/src/approval-prompt.ts +0 -225
- package/src/approval-store.ts +0 -386
- package/src/approval.ts +0 -399
- package/src/capabilities.ts +0 -220
- package/src/catalog.ts +0 -306
- package/src/check-runner.ts +0 -387
- package/src/control-journal.ts +0 -26
- package/src/correlation.ts +0 -320
- package/src/daily-dashboard-host.ts +0 -105
- package/src/daily-panel.ts +0 -80
- package/src/daily-view-input.ts +0 -59
- package/src/daily-view-render.ts +0 -45
- package/src/daily-view.ts +0 -160
- package/src/dashboard-cli.ts +0 -340
- package/src/dashboard-display-controls.ts +0 -21
- package/src/dashboard-handshake.ts +0 -199
- package/src/dashboard-harness.ts +0 -37
- package/src/dashboard-herdr.ts +0 -363
- package/src/dashboard-host-contract.ts +0 -50
- package/src/dashboard-host-transport.ts +0 -43
- package/src/dashboard-host.ts +0 -244
- package/src/dashboard-menu.ts +0 -28
- package/src/dashboard-observation.ts +0 -46
- package/src/dashboard-projection.ts +0 -390
- package/src/dashboard-render.ts +0 -259
- package/src/debrief-contract.ts +0 -127
- package/src/debrief-fixture.ts +0 -29
- package/src/debrief-host.ts +0 -53
- package/src/debrief-render.ts +0 -49
- package/src/debrief.ts +0 -198
- package/src/definitions.ts +0 -211
- package/src/delegate-types.ts +0 -154
- package/src/delegate.ts +0 -348
- package/src/delegation-approval.ts +0 -126
- package/src/dispatch-control.ts +0 -81
- package/src/effect-profile-runtime.ts +0 -46
- package/src/effect-profile.ts +0 -129
- package/src/execution-retention.ts +0 -230
- package/src/executor.ts +0 -123
- package/src/experiment-contract.ts +0 -66
- package/src/experiment-state.ts +0 -44
- package/src/experiment-store.ts +0 -98
- package/src/experiment.ts +0 -236
- package/src/factory-contract.ts +0 -47
- package/src/factory-migration.ts +0 -29
- package/src/factory-order.ts +0 -56
- package/src/factory-registry.ts +0 -60
- package/src/fanout.ts +0 -106
- package/src/file-lock.ts +0 -178
- package/src/finalization.ts +0 -79
- package/src/git-identity.ts +0 -56
- package/src/grant-env.ts +0 -221
- package/src/grant-store.ts +0 -235
- package/src/herdr-cli.ts +0 -125
- package/src/herdr-pi-lifecycle.ts +0 -21
- package/src/herdr-poll.ts +0 -253
- package/src/herdr-stage.ts +0 -55
- package/src/init.ts +0 -389
- package/src/intent-application.ts +0 -91
- package/src/intent-control.ts +0 -107
- package/src/intent-scheduling.ts +0 -14
- package/src/learning-connection.ts +0 -70
- package/src/lease-helper.ts +0 -97
- package/src/lease-record.ts +0 -131
- package/src/ledger-append.ts +0 -72
- package/src/ledger-events.ts +0 -226
- package/src/ledger-report.ts +0 -357
- package/src/ledger-v3-validation.ts +0 -266
- package/src/ledger.ts +0 -369
- package/src/measured-order.ts +0 -72
- package/src/measured-session.ts +0 -70
- package/src/model-preflight.ts +0 -41
- package/src/native-session-target.ts +0 -23
- package/src/native-session.ts +0 -139
- package/src/order-schedule.ts +0 -42
- package/src/ordinary-children.ts +0 -59
- package/src/pane-reaper.ts +0 -270
- package/src/pi-tools.ts +0 -25
- package/src/producer-ipc-contract.ts +0 -26
- package/src/producer-ipc.ts +0 -107
- package/src/product-files.ts +0 -34
- package/src/propagation.ts +0 -333
- package/src/refusals.ts +0 -70
- package/src/resolve.ts +0 -267
- package/src/resource-budget.ts +0 -349
- package/src/retention-contract.ts +0 -84
- package/src/retention-json.ts +0 -20
- package/src/run-child.ts +0 -303
- package/src/run-herdr.ts +0 -386
- package/src/skill-packages.ts +0 -314
- package/src/skill-resources.ts +0 -48
- package/src/vendor/adoption.ts +0 -109
- package/src/work-command.ts +0 -197
- package/src/work-ledger-destination.ts +0 -113
- package/src/work-ledger-json.ts +0 -228
- package/src/work-ledger-occurrences.ts +0 -99
- package/src/work-ledger-projection.ts +0 -262
- package/src/work-ledger-snapshot.ts +0 -246
- package/src/work-ledger-types.ts +0 -229
- package/src/work-ledger-validation.ts +0 -174
- package/src/work-ledger.ts +0 -186
- package/src/work-policy-registry.ts +0 -81
- package/src/work-run.ts +0 -79
- package/src/work-setup.ts +0 -141
- package/src/workflow-fact-id.ts +0 -16
- package/src/workflow-facts.ts +0 -65
- package/src/workspace-lease.ts +0 -363
- package/src/workspace.ts +0 -308
- /package/contracts/{ledger/v3 → ledger-record/v1}/fixtures/capability-decision.json +0 -0
- /package/contracts/{ledger/v3 → ledger-record/v1}/fixtures/workspace-lease.json +0 -0
- /package/dist/{herdr-name.d.ts → executors/herdr-name.d.ts} +0 -0
- /package/dist/{herdr-name.js → executors/herdr-name.js} +0 -0
- /package/dist/{herdr-pi-lifecycle.d.ts → executors/herdr-pi-lifecycle.d.ts} +0 -0
- /package/dist/{herdr-start.d.ts → executors/herdr-start.d.ts} +0 -0
- /package/dist/{herdr-start.js → executors/herdr-start.js} +0 -0
- /package/dist/{vendor → executors/vendor}/herdr-pi-lifecycle.d.ts +0 -0
- /package/dist/{vendor → executors/vendor}/herdr-pi-lifecycle.js +0 -0
- /package/dist/{file-lock.d.ts → governance/file-lock.d.ts} +0 -0
- /package/dist/{finalization.d.ts → governance/finalization.d.ts} +0 -0
- /package/dist/{finalization.js → governance/finalization.js} +0 -0
- /package/dist/{lease-helper.d.ts → governance/lease-helper.d.ts} +0 -0
- /package/dist/{lease-record.js → governance/lease-record.js} +0 -0
- /package/dist/{retention-contract.d.ts → governance/retention-contract.d.ts} +0 -0
- /package/dist/{retention-json.d.ts → governance/retention-json.d.ts} +0 -0
- /package/dist/{retention-json.js → governance/retention-json.js} +0 -0
- /package/dist/{chain.d.ts → kernel/chain.d.ts} +0 -0
- /package/dist/{chain.js → kernel/chain.js} +0 -0
- /package/dist/{correlation.d.ts → kernel/correlation.d.ts} +0 -0
- /package/dist/{definitions.d.ts → kernel/definitions.d.ts} +0 -0
- /package/dist/{delegate.d.ts → kernel/delegate.d.ts} +0 -0
- /package/dist/{delegation-approval.d.ts → kernel/delegation-approval.d.ts} +0 -0
- /package/dist/{execution-id.d.ts → kernel/execution-id.d.ts} +0 -0
- /package/dist/{execution-id.js → kernel/execution-id.js} +0 -0
- /package/dist/{fanout.d.ts → kernel/fanout.d.ts} +0 -0
- /package/dist/{ledger-identifiers.d.ts → kernel/ledger-identifiers.d.ts} +0 -0
- /package/dist/{ledger-identifiers.js → kernel/ledger-identifiers.js} +0 -0
- /package/dist/{pi-tools.d.ts → kernel/pi-tools.d.ts} +0 -0
- /package/dist/{progress.d.ts → kernel/progress.d.ts} +0 -0
- /package/dist/{progress.js → kernel/progress.js} +0 -0
- /package/dist/{resolve.d.ts → kernel/resolve.d.ts} +0 -0
- /package/dist/{routing-authority.d.ts → kernel/routing-authority.d.ts} +0 -0
- /package/dist/{routing-authority.js → kernel/routing-authority.js} +0 -0
- /package/dist/{skill-resources.d.ts → kernel/skill-resources.d.ts} +0 -0
- /package/dist/{spawn.d.ts → kernel/spawn.d.ts} +0 -0
- /package/dist/{spawn.js → kernel/spawn.js} +0 -0
- /package/dist/{dashboard-render.d.ts → products/dashboard-render.d.ts} +0 -0
- /package/src/{herdr-name.ts → executors/herdr-name.ts} +0 -0
- /package/src/{herdr-start.ts → executors/herdr-start.ts} +0 -0
- /package/src/{vendor → executors/vendor}/herdr-pi-lifecycle.ts +0 -0
- /package/src/{chain.ts → kernel/chain.ts} +0 -0
- /package/src/{execution-id.ts → kernel/execution-id.ts} +0 -0
- /package/src/{ledger-identifiers.ts → kernel/ledger-identifiers.ts} +0 -0
- /package/src/{progress.ts → kernel/progress.ts} +0 -0
- /package/src/{routing-authority.ts → kernel/routing-authority.ts} +0 -0
- /package/src/{spawn.ts → kernel/spawn.ts} +0 -0
package/src/resolve.ts
DELETED
|
@@ -1,267 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Grant resolution — the entire security surface of capability governance, as a pure function.
|
|
3
|
-
*
|
|
4
|
-
* The invariant (ADR-0008): a capability set may only ever SHRINK as it passes down a delegation
|
|
5
|
-
* tree. Escalation is impossible by construction rather than by policy, because a parent can never
|
|
6
|
-
* confer what it does not itself hold.
|
|
7
|
-
*
|
|
8
|
-
* effective = ( requested ∩ parentGrant ∩ ceiling ) \ (gated \ approved)
|
|
9
|
-
*
|
|
10
|
-
* Being pure — no I/O, no model, no network — this is exhaustively testable, which matters because it
|
|
11
|
-
* is the only place an escalation could be introduced.
|
|
12
|
-
*/
|
|
13
|
-
|
|
14
|
-
/** `tool:read` · `ext:pi-web-access/web_search` · `skill:review` · `agent:researcher` */
|
|
15
|
-
export type Capability = string;
|
|
16
|
-
|
|
17
|
-
/**
|
|
18
|
-
* Capabilities that transitively confer everything else. Granting one is equivalent to granting the
|
|
19
|
-
* whole catalog, so they can never be a *narrowing* grant.
|
|
20
|
-
*
|
|
21
|
-
* `ext:pi-fabric/fabric_exec` is here on measured evidence, not suspicion: a child granted
|
|
22
|
-
* `tools: []` (nothing at all) plus `recursive: true` still reached `pi.write` and `pi.bash` and
|
|
23
|
-
* spawned a grandchild that wrote to disk. See docs/probes/pi-fabric-eval (probes 2, 4, 7, 8).
|
|
24
|
-
*/
|
|
25
|
-
export const UNIVERSAL_CAPABILITIES: readonly Capability[] = [
|
|
26
|
-
"ext:pi-fabric/fabric_exec",
|
|
27
|
-
"tool:fabric_exec",
|
|
28
|
-
];
|
|
29
|
-
|
|
30
|
-
/**
|
|
31
|
-
* Capabilities that functionally contain others.
|
|
32
|
-
*
|
|
33
|
-
* `bash` can run `grep`, `find`, `ls`, `cat`, and `sed` — so a session holding it can already do
|
|
34
|
-
* everything the file and search tools do, whatever the tool list says. Modelling this explicitly serves
|
|
35
|
-
* two purposes:
|
|
36
|
-
*
|
|
37
|
-
* 1. It removes false escalation reports. pi's *default* surface is only `read`, `bash`, `edit`, `write`
|
|
38
|
-
* (measured, not assumed), so an agent type declaring `tools: read, grep, find, ls` would otherwise
|
|
39
|
-
* look like an escalation from any normal parent — despite being strictly weaker.
|
|
40
|
-
* 2. It makes the uncomfortable truth visible rather than implied: **a grant containing `bash` is not a
|
|
41
|
-
* narrow grant.** `subsumedBy` in the result says so, so a reviewer can see what the grant really means.
|
|
42
|
-
*/
|
|
43
|
-
export const SUBSUMPTION: Readonly<Record<Capability, readonly Capability[]>> = {
|
|
44
|
-
"tool:bash": [
|
|
45
|
-
"tool:grep",
|
|
46
|
-
"tool:find",
|
|
47
|
-
"tool:ls",
|
|
48
|
-
"tool:read",
|
|
49
|
-
"tool:write",
|
|
50
|
-
"tool:edit",
|
|
51
|
-
"tool:edit-diff",
|
|
52
|
-
],
|
|
53
|
-
};
|
|
54
|
-
|
|
55
|
-
/** Expand a grant to everything it functionally confers. */
|
|
56
|
-
export function expandSubsumed(grant: Capability[]): Capability[] {
|
|
57
|
-
const expanded = new Set(grant);
|
|
58
|
-
for (const held of grant) {
|
|
59
|
-
for (const implied of SUBSUMPTION[held] ?? []) expanded.add(implied);
|
|
60
|
-
}
|
|
61
|
-
return [...expanded].sort();
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
import { WILDCARD } from "./pi-tools.ts";
|
|
65
|
-
import { isWellFormedCapability } from "./capabilities.ts";
|
|
66
|
-
|
|
67
|
-
/**
|
|
68
|
-
* "Any definition" — ADR-0023, and one of two wildcards this module understands.
|
|
69
|
-
*
|
|
70
|
-
* Declared here rather than beside `WILDCARD` because `pi-tools.ts` imports `Capability` from this module.
|
|
71
|
-
* That import is `import type`, so it is erased and the runtime dependency runs one way only — which is
|
|
72
|
-
* what makes importing `WILDCARD` back safe.
|
|
73
|
-
*
|
|
74
|
-
* Deliberately weaker than `tool:*`: it confers **no tool authority**, so `agent:*,tool:read` may spawn
|
|
75
|
-
* every definition on disk and hand each of them nothing but `read`. It exists because the alternative was
|
|
76
|
-
* `tool:*` — authority to grant every tool — which made the safe configuration the laborious one.
|
|
77
|
-
*/
|
|
78
|
-
export const AGENT_WILDCARD: Capability = "agent:*";
|
|
79
|
-
/**
|
|
80
|
-
* `workspace:*` covers any `workspace:<id>` — ADR-0035, and the second namespace wildcard.
|
|
81
|
-
*
|
|
82
|
-
* Added as a deliberate edit, which is what the comment in `resolve()` below asks for: there is no
|
|
83
|
-
* generalised `<ns>:*` rule, so a namespace does not acquire a wildcard by existing. Unlike `agent:*` this
|
|
84
|
-
* one is **not inheritable** (`childEnv` strips it) — R-26's rule, because a root that handed
|
|
85
|
-
* `workspace:*` down would make routing attenuation meaningless below the root, which is the exact defect
|
|
86
|
-
* R-131 records.
|
|
87
|
-
*/
|
|
88
|
-
export const WORKSPACE_WILDCARD: Capability = "workspace:*";
|
|
89
|
-
|
|
90
|
-
export interface ResolveInput {
|
|
91
|
-
/** What the delegating agent asked to give the child. */
|
|
92
|
-
requested: Capability[];
|
|
93
|
-
/** What the delegating agent itself holds. The root's grant is configured, never defaulted to all. */
|
|
94
|
-
parentGrant: Capability[];
|
|
95
|
-
/** Declarative maximum for the child's agent type (its frontmatter). Omit for no ceiling. */
|
|
96
|
-
ceiling?: Capability[];
|
|
97
|
-
/** Destructive capabilities that may never enter a grant without explicit human approval. */
|
|
98
|
-
gated?: Capability[];
|
|
99
|
-
/** Gated capabilities a human has approved for this specific spawn. */
|
|
100
|
-
approved?: Capability[];
|
|
101
|
-
/**
|
|
102
|
-
* Honour functional subsumption when deciding what the parent covers (default true).
|
|
103
|
-
* Set false for a strict name-equality check.
|
|
104
|
-
*/
|
|
105
|
-
subsumption?: boolean;
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
export interface ResolveResult {
|
|
109
|
-
/** The capability set the child may hold. */
|
|
110
|
-
effective: Capability[];
|
|
111
|
-
/** Requested but NOT held by the parent — the escalation-attempt signal. Log every one. */
|
|
112
|
-
denied: Capability[];
|
|
113
|
-
/** Held by the parent but outside the child type's declared ceiling. */
|
|
114
|
-
clipped: Capability[];
|
|
115
|
-
/** Allowed by the tree but gated and unapproved. */
|
|
116
|
-
gatedBlocked: Capability[];
|
|
117
|
-
/** Universal capabilities that survived resolution — see `assertNarrowing`. */
|
|
118
|
-
universal: Capability[];
|
|
119
|
-
/**
|
|
120
|
-
* Capabilities the parent covers only through subsumption, not by holding them directly — e.g. `grep`
|
|
121
|
-
* covered because the parent holds `bash`. Non-empty means the grant is broader than its list suggests.
|
|
122
|
-
*/
|
|
123
|
-
subsumedBy: Capability[];
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
const unique = (xs: Capability[]): Capability[] => [...new Set(xs)].sort();
|
|
127
|
-
|
|
128
|
-
/**
|
|
129
|
-
* Resolve a child's grant. Total and side-effect free; every rejected capability is reported rather
|
|
130
|
-
* than silently dropped, because a grant nobody can audit proves nothing.
|
|
131
|
-
*/
|
|
132
|
-
export function resolve(input: ResolveInput): ResolveResult {
|
|
133
|
-
const requested = unique(input.requested);
|
|
134
|
-
const held = new Set(input.parentGrant);
|
|
135
|
-
const parent =
|
|
136
|
-
input.subsumption === false ? held : new Set(expandSubsumed(input.parentGrant));
|
|
137
|
-
/**
|
|
138
|
-
* `agent:*` covers any `agent:<name>` — ADR-0023. It was the only wildcard rule in this function when
|
|
139
|
-
* that was written; ADR-0035 added a third, so `covered()` now has `tool:*`, `agent:*` and `workspace:*`.
|
|
140
|
-
* There is still no GENERALISED `<ns>:*` rule: each is a deliberate edit, which is the property worth
|
|
141
|
-
* keeping. Corrected because the sentence sat eighty lines above "all THREE wildcards are excluded".
|
|
142
|
-
*
|
|
143
|
-
* `resolve` is otherwise exact-match plus subsumption, deliberately: `tool:*` works not because anything
|
|
144
|
-
* here understands it, but because `deriveOwnGrant` *enumerates* a session's observed tool names beside
|
|
145
|
-
* it. Definitions are not tools, so nothing enumerates them — which is why `maySpawnDefinition` had to
|
|
146
|
-
* special-case the wildcard, and why this needs stating rather than falling out.
|
|
147
|
-
*
|
|
148
|
-
* Scoped to one namespace on purpose. There is no generalised `<ns>:*` rule, so a namespace added later
|
|
149
|
-
* does not silently acquire a wildcard; adding one is a deliberate edit and another decision.
|
|
150
|
-
*/
|
|
151
|
-
const anyDefinition = held.has(AGENT_WILDCARD);
|
|
152
|
-
/**
|
|
153
|
-
* `tool:*` satisfies **any** capability, including `skill:` and `agent:` ids.
|
|
154
|
-
*
|
|
155
|
-
* Missing until 0.11.2, and the omission broke the one rule this package must never break by accident:
|
|
156
|
-
* *governance is opt-in*. An ungoverned session holds `[tool:*, …observed tools]` and nothing else, so
|
|
157
|
-
* spawning a definition whose `allowed-tools` names `agent:worker` or `skill:review` — the composition
|
|
158
|
-
* ADR-0017 created and ADR-0023's own example uses — was refused with **"capability escalation
|
|
159
|
-
* blocked"**, and recorded as an escalation attempt, in a session that had opted out.
|
|
160
|
-
*
|
|
161
|
-
* `maySpawnDefinition` had always honoured `tool:*` for definition ids and `docs/SPEC.md` had always
|
|
162
|
-
* claimed it "satisfies any capability". This function disagreed with both, which is R-28's shape: two
|
|
163
|
-
* spellings of one rule, and the enforcing one was wrong.
|
|
164
|
-
*/
|
|
165
|
-
const anyCapability = held.has(WILDCARD);
|
|
166
|
-
const anyWorkspace = held.has(WORKSPACE_WILDCARD);
|
|
167
|
-
// A malformed id is never covered — not by an exact hold, and above all not by a wildcard's PREFIX rule,
|
|
168
|
-
// which is how `agent:x,tool:bash` got admitted and then split into two capabilities in the child.
|
|
169
|
-
// Landing in `denied` is the right outcome rather than a throw: it fails closed AND records an
|
|
170
|
-
// escalation attempt, so the ledger shows the attempt instead of a clean line.
|
|
171
|
-
const covered = (c: Capability): boolean =>
|
|
172
|
-
isWellFormedCapability(c)
|
|
173
|
-
&& (parent.has(c) || anyCapability
|
|
174
|
-
|| (anyDefinition && c.startsWith("agent:"))
|
|
175
|
-
|| (anyWorkspace && c.startsWith("workspace:")));
|
|
176
|
-
|
|
177
|
-
const ceiling = input.ceiling === undefined ? null : new Set(input.ceiling);
|
|
178
|
-
const gated = new Set(input.gated ?? []);
|
|
179
|
-
const approved = new Set(input.approved ?? []);
|
|
180
|
-
|
|
181
|
-
// Order is irrelevant to the outcome (set intersection is commutative), so each rejection reason is
|
|
182
|
-
// reported independently rather than being masked by whichever filter happened to run first.
|
|
183
|
-
const denied = requested.filter((c) => !covered(c));
|
|
184
|
-
const clipped = requested.filter((c) => covered(c) && ceiling !== null && !ceiling.has(c));
|
|
185
|
-
/**
|
|
186
|
-
* Is this capability gated, directly or by subsuming something gated?
|
|
187
|
-
*
|
|
188
|
-
* ADR-0012. Exact-name gating was defeatable by handing down a broader capability: the package's own
|
|
189
|
-
* `SUBSUMPTION` table says `bash` confers `write`, so gating `write` produced **no prompt** when `bash`
|
|
190
|
-
* was granted instead. The gate read as satisfied because the string never appeared.
|
|
191
|
-
*
|
|
192
|
-
* The direction is load-bearing and easy to invert. A capability is gated when it **subsumes**
|
|
193
|
-
* something gated — never when it **is subsumed by** something gated. Gating `bash` must not quietly
|
|
194
|
-
* gate a plain `write` grant, which would make gating a broad capability restrict the narrow ones and
|
|
195
|
-
* invert least privilege.
|
|
196
|
-
*/
|
|
197
|
-
const isGated = (c: Capability): boolean => {
|
|
198
|
-
if (gated.has(c)) return true;
|
|
199
|
-
if (input.subsumption === false) return false;
|
|
200
|
-
return (SUBSUMPTION[c] ?? []).some((implied) => gated.has(implied));
|
|
201
|
-
};
|
|
202
|
-
|
|
203
|
-
const gatedBlocked = requested.filter(
|
|
204
|
-
(c) => covered(c) && (ceiling === null || ceiling.has(c)) && isGated(c) && !approved.has(c),
|
|
205
|
-
);
|
|
206
|
-
|
|
207
|
-
const rejected = new Set([...denied, ...clipped, ...gatedBlocked]);
|
|
208
|
-
const effective = requested.filter((c) => !rejected.has(c));
|
|
209
|
-
|
|
210
|
-
return {
|
|
211
|
-
effective,
|
|
212
|
-
denied,
|
|
213
|
-
clipped,
|
|
214
|
-
gatedBlocked,
|
|
215
|
-
universal: effective.filter((c) => UNIVERSAL_CAPABILITIES.includes(c)),
|
|
216
|
-
// F9: capabilities covered by a WILDCARD are not "subsumed" — this field means "the grant is broader
|
|
217
|
-
// than its list suggests", which is the `bash`-covers-`grep` warning. A wildcard holder already knows
|
|
218
|
-
// its grant is broad; listing every id under it would bury the signal the field exists to carry.
|
|
219
|
-
//
|
|
220
|
-
// All THREE wildcards are excluded. `anyWorkspace` was missing, so a caller holding `workspace:*` saw
|
|
221
|
-
// its own `workspace:prod` reported as subsumed while the `agent:*` holder correctly saw nothing — the
|
|
222
|
-
// field contradicting its own rule, and a false "broader than it looks" flag in the ledger and in
|
|
223
|
-
// `/grants`. Every wildcard added to `covered()` above needs a line here; that is now three for three.
|
|
224
|
-
subsumedBy: effective.filter((c) =>
|
|
225
|
-
!held.has(c)
|
|
226
|
-
&& !anyCapability
|
|
227
|
-
&& !(anyDefinition && c.startsWith("agent:"))
|
|
228
|
-
&& !(anyWorkspace && c.startsWith("workspace:"))),
|
|
229
|
-
};
|
|
230
|
-
}
|
|
231
|
-
|
|
232
|
-
/**
|
|
233
|
-
* Fail closed on a grant that cannot actually narrow anything.
|
|
234
|
-
*
|
|
235
|
-
* A universal capability in an "attenuated" grant is not a narrow grant with one extra item — it is
|
|
236
|
-
* full authority wearing a narrow grant's clothing. Callers must opt in explicitly rather than
|
|
237
|
-
* discover this at runtime.
|
|
238
|
-
*/
|
|
239
|
-
export function assertNarrowing(result: ResolveResult, allowUniversal = false): void {
|
|
240
|
-
if (!allowUniversal && result.universal.length > 0) {
|
|
241
|
-
throw new Error(
|
|
242
|
-
`refusing to issue a grant containing universal capabilities: ${result.universal.join(", ")}. ` +
|
|
243
|
-
`These transitively confer the whole catalog, so the grant would not narrow anything. ` +
|
|
244
|
-
`Pass allowUniversal to override deliberately.`,
|
|
245
|
-
);
|
|
246
|
-
}
|
|
247
|
-
}
|
|
248
|
-
|
|
249
|
-
/**
|
|
250
|
-
* Project an effective grant onto pi's `--tools` allowlist.
|
|
251
|
-
*
|
|
252
|
-
* pi core is the enforcement point — verified: `--tools` and `--no-tools` both hard-block extension
|
|
253
|
-
* tools, and an explicitly `-e`-loaded extension cannot re-add its tool past them
|
|
254
|
-
* (docs/probes/pi-fabric-eval probes 9–11). That is why enforcement needs no in-descendant runtime.
|
|
255
|
-
*
|
|
256
|
-
* Returns `null` when the grant contains no callable tools, meaning the caller should pass
|
|
257
|
-
* `--no-tools` rather than an empty `--tools` (an empty list is not a valid allowlist).
|
|
258
|
-
*/
|
|
259
|
-
export function toPiToolsAllowlist(effective: Capability[]): string[] | null {
|
|
260
|
-
const names = effective
|
|
261
|
-
.filter((c) => c.startsWith("tool:") || c.startsWith("ext:"))
|
|
262
|
-
// `tool:read` -> `read`; `ext:pkg/web_search` -> `web_search` (pi matches on bare tool name)
|
|
263
|
-
.map((c) => (c.startsWith("tool:") ? c.slice(5) : c.slice(c.lastIndexOf("/") + 1)))
|
|
264
|
-
.filter((n) => n.length > 0);
|
|
265
|
-
const deduped = [...new Set(names)].sort();
|
|
266
|
-
return deduped.length > 0 ? deduped : null;
|
|
267
|
-
}
|
package/src/resource-budget.ts
DELETED
|
@@ -1,349 +0,0 @@
|
|
|
1
|
-
import { constants } from "node:fs";
|
|
2
|
-
import { lstat, mkdir, open, realpath } from "node:fs/promises";
|
|
3
|
-
import { dirname, isAbsolute, join, resolve } from "node:path";
|
|
4
|
-
import { createHash, randomUUID } from "node:crypto";
|
|
5
|
-
import { withFileLock } from "./file-lock.ts";
|
|
6
|
-
import { parseWorkJson, freezeWork } from "./work-ledger-json.ts";
|
|
7
|
-
import { runWithFinalizers } from "./finalization.ts";
|
|
8
|
-
import { workIntentBinding, readIntentWork, resolveIntent, validateIntentApplication, applyIntentApplication } from "./intent-application.ts";
|
|
9
|
-
import { intentKey, intentRequest, intentRequestDigest, intentReceipt, matchesIntentReceipt, intentDecision, replayIntent, intentSnapshot,
|
|
10
|
-
type WorkIntentBinding, type IntentState, type IntentRequest, type IntentAdmission } from "./intent-control.ts";
|
|
11
|
-
import { intentAdmission, nextIntent } from "./intent-scheduling.ts";
|
|
12
|
-
import { dispatchAuthority, dispatchRequest, dispatchRequestDigest, dispatchDecision, replayDispatch, freezeDispatch,
|
|
13
|
-
type DispatchAuthority, type DispatchRequest, type DispatchState } from "./dispatch-control.ts";
|
|
14
|
-
|
|
15
|
-
export interface ResourceLimits { maxAttempts: number; maxInputBytes: number; maxConcurrent: number }
|
|
16
|
-
export interface BudgetBinding<V extends "1.0" | "2.0" | "3.0" | "4.0" = "1.0"> {
|
|
17
|
-
version: V; directory: string; device: string; inode: string;
|
|
18
|
-
journalDevice: string; journalInode: string; authorityDigest: string; limits: ResourceLimits; intent?: V extends "3.0" ? WorkIntentBinding : never;
|
|
19
|
-
}
|
|
20
|
-
export type DispatchBudgetBinding = BudgetBinding<"2.0">;
|
|
21
|
-
export type ExperimentBudgetBinding = BudgetBinding<"4.0">;
|
|
22
|
-
export type GovernedBudgetBinding = BudgetBinding<"1.0" | "2.0" | "3.0" | "4.0">;
|
|
23
|
-
export type IntentBudgetBinding = BudgetBinding<"3.0"> & { intent: WorkIntentBinding };
|
|
24
|
-
export interface AttemptDemand {
|
|
25
|
-
attemptId: string; orderId: string; experimentId: string;
|
|
26
|
-
kind: "primary" | "retry" | "shadow" | "descendant";
|
|
27
|
-
parentAttemptId: string | null; inputBytes: number; inputDigest: string;
|
|
28
|
-
}
|
|
29
|
-
interface Reservation extends AttemptDemand { intent?: IntentAdmission; owner: string; state: "reserved" | "settled"; outcome: string | null }
|
|
30
|
-
export interface BudgetSnapshot { attempts: number; inputBytes: number; active: number; reservations: readonly Readonly<Reservation>[] }
|
|
31
|
-
export interface ResourcePermit { readonly attemptId: string; settle(outcome: "completed" | "failed" | "cancelled"): Promise<void> }
|
|
32
|
-
interface PermitControl { owner:object; bindingDigest:string; version:string; demand:AttemptDemand; claimed:boolean; settling:number; settled:boolean; verify():Promise<void>; finish:ResourcePermit["settle"] }
|
|
33
|
-
const originalPermits = new WeakMap<ResourcePermit,PermitControl>();
|
|
34
|
-
/** Exclusive original-permit handoff for the separate opt-in IPC route. No mint/recovery API. */
|
|
35
|
-
export function claimResourcePermit(owner:object, permit:ResourcePermit, bindingDigest:string, expected:AttemptDemand) {
|
|
36
|
-
const d=demand(expected), c=originalPermits.get(permit);
|
|
37
|
-
if(!c || c.owner!==owner || c.version!=="4.0" || c.bindingDigest!==bindingDigest || JSON.stringify(c.demand)!==JSON.stringify(d) || c.claimed || c.settling || c.settled) fail("OWNERSHIP_LOST","original unclaimed experiment permit required");
|
|
38
|
-
c.claimed=true;
|
|
39
|
-
// Admission failure is consumed by the original recipient, which must still settle the charged attempt.
|
|
40
|
-
return Object.freeze({admission:c.verify(),settle:c.finish});
|
|
41
|
-
}
|
|
42
|
-
export class ResourceAdmissionError extends Error {
|
|
43
|
-
readonly code: "INVALID" | "AUTHORITY_CHANGED" | "DUPLICATE" | "EXHAUSTED" | "OWNERSHIP_LOST" | "DISPATCH_BLOCKED";
|
|
44
|
-
constructor(code: ResourceAdmissionError["code"], message: string) {
|
|
45
|
-
super(message); this.name = "ResourceAdmissionError"; this.code = code;
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
function fail(code: ResourceAdmissionError["code"], text: string): never { throw new ResourceAdmissionError(code, text); }
|
|
49
|
-
const hash = (text: string) => createHash("sha256").update(text).digest("hex");
|
|
50
|
-
const digest = (x: unknown): x is string => typeof x === "string" && /^[a-f0-9]{64}$/.test(x);
|
|
51
|
-
const id = (x: unknown): x is string => typeof x === "string" && /^[a-zA-Z0-9:_-]{1,128}$/.test(x);
|
|
52
|
-
const integer = (x: unknown, max: number): x is number => Number.isSafeInteger(x) && Number(x) >= 0 && Number(x) <= max;
|
|
53
|
-
function shape(x: unknown, keys: string[]): asserts x is Record<string, unknown> {
|
|
54
|
-
if (!x || typeof x !== "object" || ![Object.prototype, null].includes(Object.getPrototypeOf(x)) ||
|
|
55
|
-
Reflect.ownKeys(x).length !== keys.length || keys.some(k => { const d = Object.getOwnPropertyDescriptor(x, k); return !d || !d.enumerable || !Object.hasOwn(d, "value"); })) fail("INVALID", "closed data object required");
|
|
56
|
-
}
|
|
57
|
-
function limits(x: ResourceLimits): ResourceLimits {
|
|
58
|
-
shape(x, ["maxAttempts", "maxInputBytes", "maxConcurrent"]);
|
|
59
|
-
if (!integer(x.maxAttempts, 1024) || x.maxAttempts < 1 || !integer(x.maxInputBytes, 16 * 1024 * 1024) ||
|
|
60
|
-
!integer(x.maxConcurrent, 32) || x.maxConcurrent < 1 || x.maxConcurrent > x.maxAttempts) fail("INVALID", "unsupported resource limits");
|
|
61
|
-
return Object.freeze({ maxAttempts: x.maxAttempts, maxInputBytes: x.maxInputBytes, maxConcurrent: x.maxConcurrent });
|
|
62
|
-
}
|
|
63
|
-
function binding<T extends GovernedBudgetBinding>(x: T): Readonly<T> {
|
|
64
|
-
shape(x, ["version", "directory", "device", "inode", "journalDevice", "journalInode", "authorityDigest", "limits", ...(Object.getOwnPropertyDescriptor(x ?? {}, "version")?.value === "3.0" ? ["intent"] : [])]);
|
|
65
|
-
if (!["1.0", "2.0", "3.0", "4.0"].includes(x.version) || typeof x.directory !== "string" || !isAbsolute(x.directory) || resolve(x.directory) !== x.directory ||
|
|
66
|
-
x.directory.length > 1024 || x.directory.split("/").includes(".pi") || ![x.device, x.inode, x.journalDevice, x.journalInode].every(v => typeof v === "string" && /^\d+$/.test(v)) || !digest(x.authorityDigest)) fail("INVALID", "invalid independent budget binding");
|
|
67
|
-
return Object.freeze({ version: x.version, directory: x.directory, device: x.device, inode: x.inode, journalDevice: x.journalDevice, journalInode: x.journalInode, authorityDigest: x.authorityDigest, limits: limits(x.limits), ...(x.version === "3.0" ? { intent: freezeWork(workIntentBinding(x.intent!)) } : {}) }) as Readonly<T>;
|
|
68
|
-
}
|
|
69
|
-
function demand(x: AttemptDemand): AttemptDemand {
|
|
70
|
-
shape(x, ["attemptId", "orderId", "experimentId", "kind", "parentAttemptId", "inputBytes", "inputDigest"]);
|
|
71
|
-
if (![x.attemptId, x.orderId, x.experimentId].every(id) || !["primary", "retry", "shadow", "descendant"].includes(x.kind) ||
|
|
72
|
-
!(x.parentAttemptId === null || id(x.parentAttemptId)) || (x.kind !== "primary" && x.parentAttemptId === null) ||
|
|
73
|
-
!integer(x.inputBytes, 16384) || !digest(x.inputDigest)) fail("INVALID", "invalid attempt demand");
|
|
74
|
-
return { attemptId: x.attemptId, orderId: x.orderId, experimentId: x.experimentId, kind: x.kind,
|
|
75
|
-
parentAttemptId: x.parentAttemptId, inputBytes: x.inputBytes, inputDigest: x.inputDigest };
|
|
76
|
-
}
|
|
77
|
-
async function privateDirectory(path: string) {
|
|
78
|
-
const st = await lstat(path, { bigint: true });
|
|
79
|
-
if (!st.isDirectory() || st.isSymbolicLink() || (st.mode & 0o077n) !== 0n || st.uid !== BigInt(process.getuid!()) || await realpath(path) !== path) fail("INVALID", "a canonical owner-private directory is required");
|
|
80
|
-
return st;
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
/** Explicit one-time creation, never implicit reset/recovery. Keep this binding outside the mutable journal. */
|
|
84
|
-
type BudgetCreation = { directory: string; authorityDigest: string; limits: ResourceLimits };
|
|
85
|
-
export function createResourceBudget(input: BudgetCreation): Promise<Readonly<BudgetBinding>> { return createBudget(input, "1.0"); }
|
|
86
|
-
/** Explicit opt-in v2 journal; old readers refuse rather than ignore control events. */
|
|
87
|
-
export function createDispatchBudget(input: BudgetCreation): Promise<Readonly<DispatchBudgetBinding>> { return createBudget(input, "2.0"); }
|
|
88
|
-
export async function createIntentBudget(input: BudgetCreation, intent: Parameters<typeof readIntentWork>[0]): Promise<Readonly<IntentBudgetBinding>> {
|
|
89
|
-
return createBudget(input, "3.0", JSON.parse(intentKey(intent)));
|
|
90
|
-
}
|
|
91
|
-
/** Explicit batch semantics. All queued slots remain conservatively active until original settlement. */
|
|
92
|
-
export function createExperimentBudget(input: BudgetCreation): Promise<Readonly<ExperimentBudgetBinding>> { return createBudget(input, "4.0"); }
|
|
93
|
-
function createBudget(input: BudgetCreation, version: "4.0"): Promise<Readonly<ExperimentBudgetBinding>>;
|
|
94
|
-
function createBudget(input: BudgetCreation, version: "1.0"): Promise<Readonly<BudgetBinding>>;
|
|
95
|
-
function createBudget(input: BudgetCreation, version: "2.0"): Promise<Readonly<DispatchBudgetBinding>>;
|
|
96
|
-
function createBudget(input: BudgetCreation, version: "3.0", intent: WorkIntentBinding): Promise<Readonly<IntentBudgetBinding>>;
|
|
97
|
-
async function createBudget(input: BudgetCreation, version: GovernedBudgetBinding["version"], intent?: WorkIntentBinding): Promise<Readonly<GovernedBudgetBinding>> {
|
|
98
|
-
const initialIntent = version === "3.0" ? workIntentBinding(intent!) : undefined;
|
|
99
|
-
shape(input, ["directory", "authorityDigest", "limits"]);
|
|
100
|
-
const policy = limits(input.limits), directoryPath = input.directory, authorityDigest = input.authorityDigest;
|
|
101
|
-
if (typeof directoryPath !== "string" || !isAbsolute(directoryPath) || resolve(directoryPath) !== directoryPath ||
|
|
102
|
-
directoryPath.split("/").includes(".pi") || !digest(authorityDigest)) fail("INVALID", "invalid budget creation");
|
|
103
|
-
if (initialIntent) resolveIntent(await readIntentWork(initialIntent), initialIntent.selection, initialIntent.priorities);
|
|
104
|
-
await privateDirectory(dirname(directoryPath));
|
|
105
|
-
await mkdir(directoryPath, { mode: 0o700 }); // EEXIST refuses even if its journal was deleted.
|
|
106
|
-
const st = await privateDirectory(directoryPath);
|
|
107
|
-
const file = await open(join(directoryPath, "budget.jsonl"), "wx", 0o600);
|
|
108
|
-
const b = await runWithFinalizers(async () => {
|
|
109
|
-
const journal = await file.stat({ bigint: true });
|
|
110
|
-
const result = binding({ version, directory: directoryPath, device: String(st.dev), inode: String(st.ino),
|
|
111
|
-
journalDevice: String(journal.dev), journalInode: String(journal.ino), authorityDigest, limits: policy, ...(initialIntent ? { intent: initialIntent } : {}) });
|
|
112
|
-
await file.writeFile(JSON.stringify(result) + "\n"); await file.sync(); return result;
|
|
113
|
-
}, [{ label: "budget creation close failed", run: () => file.close() }]);
|
|
114
|
-
const directory = await open(b.directory, constants.O_RDONLY | constants.O_DIRECTORY);
|
|
115
|
-
await runWithFinalizers(() => directory.sync(), [{ label: "budget directory close failed", run: () => directory.close() }]);
|
|
116
|
-
return b;
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
/** Host-side arithmetic for this exact independently retained binding. Not a money/CPU/memory cap. */
|
|
120
|
-
export function openResourceBudget<T extends GovernedBudgetBinding>(input: T) {
|
|
121
|
-
const b = binding(input), path = join(b.directory, "budget.jsonl"), owner = randomUUID();
|
|
122
|
-
let pinnedFile: string | undefined;
|
|
123
|
-
async function transaction<T>(work: (records: Reservation[], append: (event: unknown) => Promise<void>, control: DispatchState, intent: IntentState | null) => Promise<T>, readOnly = false): Promise<T> {
|
|
124
|
-
const checkRoot = async () => {
|
|
125
|
-
const st = await privateDirectory(b.directory);
|
|
126
|
-
if (String(st.dev) !== b.device || String(st.ino) !== b.inode) fail("AUTHORITY_CHANGED", "budget root identity changed");
|
|
127
|
-
};
|
|
128
|
-
await checkRoot();
|
|
129
|
-
const execute = async () => {
|
|
130
|
-
await checkRoot();
|
|
131
|
-
const file = await open(path, (readOnly ? constants.O_RDONLY : constants.O_RDWR | constants.O_APPEND) | constants.O_NOFOLLOW | constants.O_NONBLOCK);
|
|
132
|
-
return runWithFinalizers(async () => {
|
|
133
|
-
const st = await file.stat({ bigint: true }), key = `${st.dev}:${st.ino}`;
|
|
134
|
-
if (!st.isFile() || st.nlink !== 1n || st.uid !== BigInt(process.getuid!()) || (st.mode & 0o077n) !== 0n || st.size > 2n * 1024n * 1024n) fail("INVALID", "unsafe or oversized budget journal");
|
|
135
|
-
if (key !== `${b.journalDevice}:${b.journalInode}` || (pinnedFile && pinnedFile !== key)) fail("AUTHORITY_CHANGED", "budget journal replaced");
|
|
136
|
-
pinnedFile = key;
|
|
137
|
-
const buffer = Buffer.alloc(Number(st.size));
|
|
138
|
-
let offset = 0;
|
|
139
|
-
while (offset < buffer.length) { const n = (await file.read(buffer, offset, buffer.length - offset, offset)).bytesRead; if (!n) fail("INVALID", "short budget read"); offset += n; }
|
|
140
|
-
const text = new TextDecoder("utf-8", { fatal: true }).decode(buffer);
|
|
141
|
-
if (!text.endsWith("\n")) fail("INVALID", "incomplete budget journal; no automatic recovery");
|
|
142
|
-
const lines = text.slice(0, -1).split("\n");
|
|
143
|
-
if (lines.length > (b.version === "3.0" ? 2369 : b.version !== "1.0" ? 2305 : 2049) || JSON.stringify(binding(parseWorkJson(lines[0]) as unknown as GovernedBudgetBinding)) !== JSON.stringify(b)) fail("AUTHORITY_CHANGED", "budget header does not match independent authority");
|
|
144
|
-
const records: Reservation[] = [], control: DispatchState = { revision: 0, paused: false, records: [] };
|
|
145
|
-
const intent: IntentState | null = b.intent ? { revision: 0, selection: b.intent.selection, priorities: b.intent.priorities, records: [] } : null;
|
|
146
|
-
for (const line of lines.slice(1)) {
|
|
147
|
-
const event = parseWorkJson(line) as Record<string, unknown>;
|
|
148
|
-
if (event.type === "intent-request" || event.type === "intent-apply") {
|
|
149
|
-
if (!intent) fail("INVALID", "intent controls require explicit v3 binding");
|
|
150
|
-
replayIntent(intent, event, records.filter(r => r.state === "reserved").length, control.records.some(r => r.application === "pending"));
|
|
151
|
-
} else if (event.type === "control-request" || event.type === "control-apply") {
|
|
152
|
-
if (b.version === "1.0") fail("INVALID", "controls require explicit v2/v3 binding");
|
|
153
|
-
replayDispatch(control, event, resourceBindingDigest(b), records.filter(r => r.state === "reserved").length, Boolean(intent?.records.some(r => r.application === "pending-or-unknown")));
|
|
154
|
-
} else if (event.type === "reserve-batch") {
|
|
155
|
-
if (b.version !== "4.0") fail("INVALID", "batch requires explicit v4 budget");
|
|
156
|
-
shape(event, ["type", "owner", "demands"]);
|
|
157
|
-
if (!id(event.owner) || !Array.isArray(event.demands) || !event.demands.length || event.demands.length > 32 || control.paused || control.records.some(r => r.application === "pending")) fail("INVALID", "invalid batch");
|
|
158
|
-
for (const value of event.demands) {
|
|
159
|
-
const d = demand(value as AttemptDemand);
|
|
160
|
-
if (records.some(r => r.attemptId === d.attemptId) || d.parentAttemptId !== null && !records.some(r => r.attemptId === d.parentAttemptId)) fail("INVALID", "invalid batch sequence");
|
|
161
|
-
records.push({ ...d, owner: event.owner, state: "reserved", outcome: null });
|
|
162
|
-
}
|
|
163
|
-
} else if (event.type === "reserve") {
|
|
164
|
-
if (control.paused || control.records.some(r => r.application === "pending") || intent?.records.some(r => r.application === "pending-or-unknown")) fail("INVALID", "reservation crossed dispatch barrier");
|
|
165
|
-
shape(event, ["type", "owner", "demand", ...(intent ? ["intent"] : [])]);
|
|
166
|
-
const d = demand(event.demand as AttemptDemand);
|
|
167
|
-
if (!id(event.owner) || records.some(r => r.attemptId === d.attemptId) || (d.parentAttemptId !== null && !records.some(r => r.attemptId === d.parentAttemptId))) fail("INVALID", "invalid reservation sequence");
|
|
168
|
-
if (intent && (d.kind !== "primary" || d.parentAttemptId !== null)) fail("INVALID", "v3 schedules primary dispatch only");
|
|
169
|
-
const assigned = intent ? intentAdmission(intent, records, event.intent as IntentAdmission) : undefined;
|
|
170
|
-
records.push({ ...d, ...(assigned ? { intent: assigned } : {}), owner: event.owner, state: "reserved", outcome: null });
|
|
171
|
-
} else {
|
|
172
|
-
shape(event, ["type", "owner", "attemptId", "outcome"]);
|
|
173
|
-
const r = records.find(r => r.attemptId === event.attemptId);
|
|
174
|
-
if (event.type !== "settle" || !r || r.state !== "reserved" || event.owner !== r.owner || !["completed", "failed", "cancelled"].includes(String(event.outcome))) fail("INVALID", "invalid settlement sequence");
|
|
175
|
-
r.state = "settled"; r.outcome = String(event.outcome);
|
|
176
|
-
}
|
|
177
|
-
if (records.length > b.limits.maxAttempts || records.reduce((n, r) => n + r.inputBytes, 0) > b.limits.maxInputBytes || records.filter(r => r.state === "reserved").length > b.limits.maxConcurrent) fail("INVALID", "journal exceeds independently fixed limits");
|
|
178
|
-
}
|
|
179
|
-
let expectedSize = st.size;
|
|
180
|
-
const unchanged = async () => {
|
|
181
|
-
await checkRoot(); const current = await lstat(path, { bigint: true });
|
|
182
|
-
if (`${current.dev}:${current.ino}` !== key || current.size !== expectedSize || (await file.stat({ bigint: true })).size !== expectedSize ||
|
|
183
|
-
current.nlink !== 1n || (current.mode & 0o077n) !== 0n) fail("AUTHORITY_CHANGED", "budget journal changed under lock");
|
|
184
|
-
};
|
|
185
|
-
await unchanged();
|
|
186
|
-
return await work(records, async event => {
|
|
187
|
-
if (readOnly) fail("INVALID", "inspection cannot write");
|
|
188
|
-
const line = JSON.stringify(event) + "\n";
|
|
189
|
-
if (expectedSize + BigInt(Buffer.byteLength(line)) > 2n * 1024n * 1024n) fail("EXHAUSTED", "journal capacity reached");
|
|
190
|
-
await unchanged(); await file.writeFile(line); expectedSize += BigInt(Buffer.byteLength(line)); await file.sync(); await unchanged();
|
|
191
|
-
}, control, intent);
|
|
192
|
-
}, [{ label: "budget journal close failed", run: () => file.close() }]);
|
|
193
|
-
};
|
|
194
|
-
return readOnly ? execute() : withFileLock(path, "resource budget", execute, { staleRecovery: "disabled" });
|
|
195
|
-
}
|
|
196
|
-
const permit = (d:AttemptDemand): Readonly<ResourcePermit> => {
|
|
197
|
-
const attemptId=d.attemptId;
|
|
198
|
-
const c:PermitControl={owner:api,bindingDigest:resourceBindingDigest(b),version:b.version,demand:d,claimed:false,settling:0,settled:false,
|
|
199
|
-
verify:()=>transaction(async(records,_append,control,intent)=>{
|
|
200
|
-
const r=records.find(r=>r.attemptId===attemptId);
|
|
201
|
-
if(!r || r.owner!==owner || r.state!=="reserved" || Object.keys(d).some(k=>r[k as keyof AttemptDemand]!==d[k as keyof AttemptDemand])) fail("OWNERSHIP_LOST","original reservation is not held");
|
|
202
|
-
if(control.paused || control.records.some(r=>r.application==="pending") || intent?.records.some(r=>r.application==="pending-or-unknown")) fail("DISPATCH_BLOCKED","dispatch barrier");
|
|
203
|
-
}),
|
|
204
|
-
async finish(outcome) {
|
|
205
|
-
if(!["completed","failed","cancelled"].includes(outcome)) fail("INVALID","invalid outcome");
|
|
206
|
-
c.settling++;
|
|
207
|
-
try {
|
|
208
|
-
await transaction(async(records,append)=>{
|
|
209
|
-
const r=records.find(r=>r.attemptId===attemptId);
|
|
210
|
-
if(!r || r.owner!==owner) fail("OWNERSHIP_LOST","only original live host may settle");
|
|
211
|
-
if(r.state==="settled"){if(r.outcome!==outcome)fail("INVALID","contradictory settlement");return;}
|
|
212
|
-
await append({type:"settle",owner,attemptId,outcome});
|
|
213
|
-
}); c.settled=true;
|
|
214
|
-
} finally {c.settling--;}
|
|
215
|
-
}};
|
|
216
|
-
const result=Object.freeze({attemptId,async settle(outcome:Parameters<ResourcePermit["settle"]>[0]) {
|
|
217
|
-
if(c.claimed) fail("OWNERSHIP_LOST","original permit handed to IPC lifetime");
|
|
218
|
-
return c.finish(outcome);
|
|
219
|
-
}}); originalPermits.set(result,c); return result;
|
|
220
|
-
};
|
|
221
|
-
const api = Object.freeze({
|
|
222
|
-
binding: b,
|
|
223
|
-
async reserveBatch(inputs: readonly AttemptDemand[]): Promise<readonly Readonly<ResourcePermit>[]> {
|
|
224
|
-
if (b.version !== "4.0" || !Array.isArray(inputs) || !inputs.length || inputs.length > 32 || Reflect.ownKeys(inputs).length !== inputs.length + 1 || Array.from({ length: inputs.length }, (_, i) => Object.getOwnPropertyDescriptor(inputs, String(i))).some(d => !d?.enumerable || !Object.hasOwn(d, "value"))) fail("INVALID", "explicit v4 dense bounded batch required");
|
|
225
|
-
const demands = Array.from(inputs, demand);
|
|
226
|
-
await transaction(async (records, append, control) => {
|
|
227
|
-
if (control.paused || control.records.some(r => r.application === "pending")) fail("DISPATCH_BLOCKED", "dispatch barrier");
|
|
228
|
-
const ids = new Set(records.map(r => r.attemptId));
|
|
229
|
-
for (const d of demands) {
|
|
230
|
-
if (ids.has(d.attemptId)) fail("DUPLICATE", "batch identity already charged");
|
|
231
|
-
if (d.parentAttemptId !== null && !ids.has(d.parentAttemptId)) fail("INVALID", "batch parent missing");
|
|
232
|
-
ids.add(d.attemptId);
|
|
233
|
-
}
|
|
234
|
-
if (records.length + demands.length > b.limits.maxAttempts || records.reduce((n,r) => n+r.inputBytes,0) + demands.reduce((n,d) => n+d.inputBytes,0) > b.limits.maxInputBytes || records.filter(r => r.state === "reserved").length + demands.length > b.limits.maxConcurrent) fail("EXHAUSTED", "whole experiment exceeds aggregate allowance");
|
|
235
|
-
await append({ type: "reserve-batch", owner, demands });
|
|
236
|
-
});
|
|
237
|
-
return Object.freeze(demands.map(d => permit(d)));
|
|
238
|
-
},
|
|
239
|
-
intentControls(input: DispatchAuthority | null) {
|
|
240
|
-
if (!b.intent) fail("INVALID", "intent controls require explicit v3 budget creation");
|
|
241
|
-
const work = b.intent, authority = dispatchAuthority(input), scope = resourceBindingDigest(b);
|
|
242
|
-
const authorized = (digest: string) => authority?.authorityDigest === b.authorityDigest && authority.requestDigests.includes(digest);
|
|
243
|
-
const apply = async (request: ReturnType<typeof intentRequest>, records: Reservation[], append: (event: unknown) => Promise<void>, control: DispatchState, state: IntentState) => {
|
|
244
|
-
const pending = state.records.find(r => r.requestId === request.requestId);
|
|
245
|
-
if (!pending || pending.digest !== intentRequestDigest(request)) fail("DUPLICATE", "exact original intent request required");
|
|
246
|
-
if (!matchesIntentReceipt(pending, request)) fail("INVALID", "intent receipt projection does not match original request");
|
|
247
|
-
if (pending.application !== "pending-or-unknown" || !authorized(pending.digest) || records.some(r => r.state === "reserved") || control.records.some(r => r.application === "pending")) return;
|
|
248
|
-
await applyIntentApplication(work, state, request);
|
|
249
|
-
const event = { type: "intent-apply", requestId: request.requestId };
|
|
250
|
-
await append(event); replayIntent(state, event, 0, false);
|
|
251
|
-
};
|
|
252
|
-
return Object.freeze({
|
|
253
|
-
inspect: () => transaction(async (records, _append, control, state) => {
|
|
254
|
-
resolveIntent(await readIntentWork(work), state!.selection, state!.priorities);
|
|
255
|
-
const blocked = control.paused || control.records.some(r => r.application === "pending") || state!.records.some(r => r.application === "pending-or-unknown");
|
|
256
|
-
return freezeWork({ ...intentSnapshot(state!, scope), dispatchPaused: control.paused, nextObligation: blocked ? null : nextIntent(state!, records) });
|
|
257
|
-
}, true),
|
|
258
|
-
async request(input: IntentRequest) {
|
|
259
|
-
const request = intentRequest(input), digest = intentRequestDigest(request);
|
|
260
|
-
if (request.bindingDigest !== scope) fail("AUTHORITY_CHANGED", "intent request is for another binding");
|
|
261
|
-
return transaction(async (records, append, control, state) => {
|
|
262
|
-
const prior = state!.records.find(r => r.requestId === request.requestId);
|
|
263
|
-
if (prior) {
|
|
264
|
-
if (prior.digest !== digest) fail("DUPLICATE", "immutable intent request identity");
|
|
265
|
-
if (!matchesIntentReceipt(prior, request)) fail("INVALID", "intent receipt projection does not match original request");
|
|
266
|
-
return intentSnapshot(state!, scope);
|
|
267
|
-
}
|
|
268
|
-
if (state!.records.length >= 32) fail("EXHAUSTED", "intent request capacity reached");
|
|
269
|
-
const decision = intentDecision(state!, request, Boolean(authorized(digest)), control.records.some(r => r.application === "pending"));
|
|
270
|
-
if (decision === "approved") await validateIntentApplication(work, state!, request);
|
|
271
|
-
const event = { type: "intent-request", receipt: intentReceipt(request, decision) };
|
|
272
|
-
await append(event); replayIntent(state!, event, records.filter(r => r.state === "reserved").length, control.records.some(r => r.application === "pending"));
|
|
273
|
-
if (decision === "approved") await apply(request, records, append, control, state!);
|
|
274
|
-
return intentSnapshot(state!, scope);
|
|
275
|
-
});
|
|
276
|
-
},
|
|
277
|
-
async reconcile(input: IntentRequest) {
|
|
278
|
-
const request = intentRequest(input);
|
|
279
|
-
if (request.bindingDigest !== scope) fail("AUTHORITY_CHANGED", "intent request is for another binding");
|
|
280
|
-
return transaction(async (records, append, control, state) => { await apply(request, records, append, control, state!); return intentSnapshot(state!, scope); });
|
|
281
|
-
},
|
|
282
|
-
});
|
|
283
|
-
},
|
|
284
|
-
controls(input: DispatchAuthority | null) {
|
|
285
|
-
if (b.version === "1.0") fail("INVALID", "controls require explicit v2/v3 budget creation");
|
|
286
|
-
const authority = dispatchAuthority(input), scope = resourceBindingDigest(b);
|
|
287
|
-
const authorized = (digest: string) => authority?.authorityDigest === b.authorityDigest && authority.requestDigests.includes(digest);
|
|
288
|
-
const apply = async (requestId: string, records: Reservation[], append: (event: unknown) => Promise<void>, control: DispatchState) => {
|
|
289
|
-
const pending = control.records.find(r => r.request.requestId === requestId && r.application === "pending");
|
|
290
|
-
if (!pending || !authorized(pending.digest) || records.some(r => r.state === "reserved")) return;
|
|
291
|
-
const event = { type: "control-apply", requestId: pending.request.requestId };
|
|
292
|
-
await append(event); replayDispatch(control, event, scope, 0);
|
|
293
|
-
};
|
|
294
|
-
return Object.freeze({
|
|
295
|
-
inspect: () => transaction(async (_records, _append, control, intent) => freezeDispatch(control, scope, Boolean(intent?.records.some(r => r.application === "pending-or-unknown"))), true),
|
|
296
|
-
async reconcile(requestId: string) {
|
|
297
|
-
if (typeof requestId !== "string" || !/^[a-zA-Z0-9:_-]{1,128}$/.test(requestId)) fail("INVALID", "exact request ID required for reconciliation");
|
|
298
|
-
return transaction(async (records, append, control, intent) => { await apply(requestId, records, append, control); return freezeDispatch(control, scope, Boolean(intent?.records.some(r => r.application === "pending-or-unknown"))); });
|
|
299
|
-
},
|
|
300
|
-
async request(input: DispatchRequest) {
|
|
301
|
-
const request = dispatchRequest(input), digest = dispatchRequestDigest(request);
|
|
302
|
-
if (request.bindingDigest !== scope) fail("AUTHORITY_CHANGED", "request is for another binding");
|
|
303
|
-
return transaction(async (records, append, control, intent) => {
|
|
304
|
-
const previous = control.records.find(r => r.request.requestId === request.requestId);
|
|
305
|
-
if (previous) {
|
|
306
|
-
if (previous.digest !== digest) fail("DUPLICATE", "request ID cannot name another decision");
|
|
307
|
-
// Redelivery is readback only, never a second effect or implicit reconciliation.
|
|
308
|
-
return freezeDispatch(control, scope, Boolean(intent?.records.some(r => r.application === "pending-or-unknown")));
|
|
309
|
-
}
|
|
310
|
-
if (control.records.length >= 128) fail("EXHAUSTED", "control request capacity reached");
|
|
311
|
-
const event = { type: "control-request", request, decision: dispatchDecision(control, request, Boolean(authorized(digest)), Boolean(intent?.records.some(r => r.application === "pending-or-unknown"))) };
|
|
312
|
-
await append(event); replayDispatch(control, event, scope, records.filter(r => r.state === "reserved").length, Boolean(intent?.records.some(r => r.application === "pending-or-unknown")));
|
|
313
|
-
if (event.decision === "approved") await apply(request.requestId, records, append, control);
|
|
314
|
-
return freezeDispatch(control, scope, Boolean(intent?.records.some(r => r.application === "pending-or-unknown")));
|
|
315
|
-
});
|
|
316
|
-
},
|
|
317
|
-
});
|
|
318
|
-
},
|
|
319
|
-
/** Explicit control-path synchronization; unlike inspect, this takes the existing journal lock. */
|
|
320
|
-
async controlSnapshot(): Promise<Readonly<BudgetSnapshot>> {
|
|
321
|
-
return transaction(async records => Object.freeze({ attempts: records.length, inputBytes: records.reduce((n,r)=>n+r.inputBytes,0), active: records.filter(r=>r.state==="reserved").length, reservations:Object.freeze(records.map(r=>freezeWork({...r}))) }));
|
|
322
|
-
},
|
|
323
|
-
async inspect(): Promise<Readonly<BudgetSnapshot>> {
|
|
324
|
-
return transaction(async records => Object.freeze({ attempts: records.length, inputBytes: records.reduce((n, r) => n + r.inputBytes, 0),
|
|
325
|
-
active: records.filter(r => r.state === "reserved").length, reservations: Object.freeze(records.map(r => freezeWork({ ...r }))) }), true);
|
|
326
|
-
},
|
|
327
|
-
async reserve(input: AttemptDemand, selection?: IntentAdmission): Promise<Readonly<ResourcePermit>> {
|
|
328
|
-
const d = demand(input), selected: IntentAdmission | null = selection === undefined ? null : JSON.parse(intentKey(selection));
|
|
329
|
-
if (Boolean(b.intent) !== Boolean(selected)) fail("INVALID", "v3 reservations require an exact scheduled intent; older bindings do not accept it");
|
|
330
|
-
await transaction(async (records, append, control, intent) => {
|
|
331
|
-
if (control.paused || control.records.some(r => r.application === "pending") || intent?.records.some(r => r.application === "pending-or-unknown")) fail("DISPATCH_BLOCKED", "dispatch paused or awaiting verified boundary");
|
|
332
|
-
if (records.some(r => r.attemptId === d.attemptId)) fail("DUPLICATE", "attempt identity already charged; never launch a redelivery");
|
|
333
|
-
if (d.parentAttemptId !== null && !records.some(r => r.attemptId === d.parentAttemptId)) fail("INVALID", "parent attempt is not in this budget");
|
|
334
|
-
if (records.length >= b.limits.maxAttempts || records.reduce((n, r) => n + r.inputBytes, 0) + d.inputBytes > b.limits.maxInputBytes ||
|
|
335
|
-
records.filter(r => r.state === "reserved").length >= b.limits.maxConcurrent) fail("EXHAUSTED", "aggregate allowance exhausted");
|
|
336
|
-
if (intent) {
|
|
337
|
-
if (d.kind !== "primary" || d.parentAttemptId !== null) fail("INVALID", "v3 schedules primary dispatch only");
|
|
338
|
-
resolveIntent(await readIntentWork(b.intent!), intent.selection, intent.priorities);
|
|
339
|
-
const assigned = intentAdmission(intent, records, selected!);
|
|
340
|
-
await append({ type: "reserve", owner, demand: d, intent: assigned });
|
|
341
|
-
} else await append({ type: "reserve", owner, demand: d });
|
|
342
|
-
});
|
|
343
|
-
return permit(d);
|
|
344
|
-
},
|
|
345
|
-
});
|
|
346
|
-
return api;
|
|
347
|
-
}
|
|
348
|
-
|
|
349
|
-
export function resourceBindingDigest(b: GovernedBudgetBinding): string { return hash(JSON.stringify(binding(b))); }
|