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/herdr-stage.ts
DELETED
|
@@ -1,55 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Staging a definition's instructions to a file, because herdr cannot carry them in argv.
|
|
3
|
-
*
|
|
4
|
-
* Split out of `src/run-herdr.ts` at the 400-line ceiling. A real seam rather than an arbitrary cut: this is
|
|
5
|
-
* the one place that works around a **herdr encoding limit**, and it is the only part of the herdr path that
|
|
6
|
-
* touches the filesystem. `run-herdr.ts` starts and reaps agents; this prepares one argument.
|
|
7
|
-
*/
|
|
8
|
-
|
|
9
|
-
import { mkdtemp, writeFile } from "node:fs/promises";
|
|
10
|
-
import { tmpdir } from "node:os";
|
|
11
|
-
import { join } from "node:path";
|
|
12
|
-
|
|
13
|
-
/**
|
|
14
|
-
* Move a multi-line `--append-system-prompt` out of argv, because herdr cannot encode it.
|
|
15
|
-
*
|
|
16
|
-
* **Measured.** `herdr agent start` types the argv into the pane's shell, so a value containing newlines
|
|
17
|
-
* is rejected outright: `invalid_agent_argument — agent arguments cannot be encoded safely for the target
|
|
18
|
-
* shell`. A definition's `SKILL.md` body is always multi-line, so every `delegate({agent})` spawn would
|
|
19
|
-
* fail on this path.
|
|
20
|
-
*
|
|
21
|
-
* pi accepts a **file path** there as readily as literal text (`resolvePromptInput` + `existsSync` in
|
|
22
|
-
* `dist/core/resource-loader.js`), so the fix is to write the body to a temp file and pass its path — one
|
|
23
|
-
* short, shell-safe argument.
|
|
24
|
-
*
|
|
25
|
-
* The split lives here rather than in `planSpawn` because the constraint is **herdr's**, not pi's: the
|
|
26
|
-
* direct executor passes the same text inline with no trouble, and a plan builder that pre-emptively wrote
|
|
27
|
-
* temp files for everybody would be paying one executor's tax on both paths.
|
|
28
|
-
*/
|
|
29
|
-
export function splitSystemPrompt(args: string[]): { args: string[]; systemPrompt?: string } {
|
|
30
|
-
const at = args.indexOf("--append-system-prompt");
|
|
31
|
-
if (at === -1 || at + 1 >= args.length) return { args };
|
|
32
|
-
return { args: [...args.slice(0, at), ...args.slice(at + 2)], systemPrompt: args[at + 1] };
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
/**
|
|
36
|
-
* Move a multi-line system prompt into a temp file and return argv pointing at it.
|
|
37
|
-
*
|
|
38
|
-
* Returns the directory so the caller can remove it — and **every** early return on the herdr path must, because
|
|
39
|
-
* nothing else can: a reviewer measured a permanent `/tmp/grants-herdr-*` per failed `tab create`, unreachable by
|
|
40
|
-
* either pane sweep because the pane it belonged to never existed.
|
|
41
|
-
*/
|
|
42
|
-
export async function stageSystemPrompt(
|
|
43
|
-
args: string[],
|
|
44
|
-
): Promise<{ args: string[]; promptDir?: string; error?: string }> {
|
|
45
|
-
const split = splitSystemPrompt(args);
|
|
46
|
-
if (split.systemPrompt === undefined) return { args: split.args };
|
|
47
|
-
try {
|
|
48
|
-
const promptDir = await mkdtemp(join(tmpdir(), "grants-herdr-"));
|
|
49
|
-
const file = join(promptDir, "system-prompt.md");
|
|
50
|
-
await writeFile(file, split.systemPrompt, "utf8");
|
|
51
|
-
return { args: [...split.args, "--append-system-prompt", file], promptDir };
|
|
52
|
-
} catch (error) {
|
|
53
|
-
return { args: split.args, error: `could not stage the system prompt for herdr: ${String(error)}` };
|
|
54
|
-
}
|
|
55
|
-
}
|
package/src/init.ts
DELETED
|
@@ -1,389 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* `pi-daddy init` — scaffold a governed project from the skill packages already installed (B2, P3).
|
|
3
|
-
*
|
|
4
|
-
* Legacy unregistered npm packages can be scaffolded per skill: create a directory, copy the
|
|
5
|
-
* body and declaration copies plus a starting `PI_GRANTS_GRANT`. Configured enabled Pi resources
|
|
6
|
-
* are referenced where installed instead (ADR-0074); no competing .pi/skills copy is created.
|
|
7
|
-
*
|
|
8
|
-
* **The line it does not cross, and the reason this module exists at all:** `init` writes files an operator
|
|
9
|
-
* then **reviews, edits and commits**. It never chooses a ceiling. A skill that declares `allowed-tools` is
|
|
10
|
-
* copied *verbatim* — the author's declaration is the ceiling, and re-deriving it here would put a second
|
|
11
|
-
* opinion between the file and the enforcer. A skill that declares none is copied with a **commented**
|
|
12
|
-
* placeholder and stays unspawnable until a human fills it in.
|
|
13
|
-
*
|
|
14
|
-
* **What it DOES choose is the starting grant, which is a stronger act** — ADR-0029, added after a reviewer
|
|
15
|
-
* pointed out that ADR-0028 drew its boundary around the wrong object. The handoff's reason a third party
|
|
16
|
-
* may safely author `allowed-tools` is that *"the operator's `PI_GRANTS_GRANT` still bounds it"*; a
|
|
17
|
-
* generated union gives the bound and the bounded one author, and it is not the operator. So capabilities
|
|
18
|
-
* that can change a machine are emitted **commented** (`./grant-env.ts`).
|
|
19
|
-
*
|
|
20
|
-
* The placeholder is deliberately not a working example. Uncommenting it unedited yields capability ids
|
|
21
|
-
* like `tool:<list` which the catalog refuses as unknown — a loud failure, in the direction rule 8 asks
|
|
22
|
-
* for, rather than a grant nobody decided.
|
|
23
|
-
*/
|
|
24
|
-
|
|
25
|
-
import { lstat, mkdir, open, rm, writeFile } from "node:fs/promises";
|
|
26
|
-
import { join } from "node:path";
|
|
27
|
-
import { agentCapability, workspaceCapability } from "./capabilities.ts";
|
|
28
|
-
import { ceilingForDefinition } from "./definitions.ts";
|
|
29
|
-
import { runWithFinalizers } from "./finalization.ts";
|
|
30
|
-
import { ALWAYS_LIVE, assertGrantIsWritable, isLiveByDefault, renderGrantEnv, type GrantEnvSkill } from "./grant-env.ts";
|
|
31
|
-
import { PI_BUILTIN_TOOLS } from "./pi-tools.ts";
|
|
32
|
-
import type { Capability } from "./resolve.ts";
|
|
33
|
-
import type { SkillPackage } from "./skill-packages.ts";
|
|
34
|
-
|
|
35
|
-
/**
|
|
36
|
-
* Count declarations, not authorizations (R-73). Both pattern and needs-withheld mean the skill
|
|
37
|
-
* declared a ceiling; only undeclared means it did not. The CLI must report the same distinction.
|
|
38
|
-
*/
|
|
39
|
-
export function countDeclaring(skills: PlannedSkill[], from: string): number {
|
|
40
|
-
return skills.filter((s) => s.from === from && s.withheld !== "undeclared").length;
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
export type WithholdReason = "undeclared" | "pattern" | "needs-withheld";
|
|
44
|
-
|
|
45
|
-
export interface PlannedSkill {
|
|
46
|
-
name: string;
|
|
47
|
-
/** Which package it came from, as `name@version`. */
|
|
48
|
-
from: string;
|
|
49
|
-
sourcePath: string;
|
|
50
|
-
targetPath: string;
|
|
51
|
-
/** Configured skills stay at their installed/local source, including when --force is used. */
|
|
52
|
-
referenced?: boolean;
|
|
53
|
-
/** Exactly what would be written — the file verbatim, or the file plus a commented note. */
|
|
54
|
-
content: string;
|
|
55
|
-
/** The declared ceiling, empty when the declaration is absent or unusable. */
|
|
56
|
-
ceiling: Capability[];
|
|
57
|
-
withheld: WithholdReason | null;
|
|
58
|
-
/** e.g. a sub-tool pattern pi's `--tools` cannot express. Reported, never reinterpreted. */
|
|
59
|
-
notes: string[];
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
export interface InitPlan {
|
|
63
|
-
skills: PlannedSkill[];
|
|
64
|
-
/** Definitions two packages both declare. First wins; the loser is named rather than silently dropped. */
|
|
65
|
-
collisions: string[];
|
|
66
|
-
/** The live grant — what `source .pi/grants.env` actually sets. */
|
|
67
|
-
grant: Capability[];
|
|
68
|
-
/** Withheld capability → the definitions that declared it (ADR-0029). Emitted commented. */
|
|
69
|
-
withheldCapabilities: Map<Capability, string[]>;
|
|
70
|
-
/** `workspace:<id>` this project could route to (ADR-0035). Always commented — `init` does not choose. */
|
|
71
|
-
routableWorkspaces: Capability[];
|
|
72
|
-
grantEnvPath: string;
|
|
73
|
-
grantEnvContent: string;
|
|
74
|
-
/** Capabilities a declared ceiling names that pi 0.84.1 has no tool for — a caution, not a verdict. */
|
|
75
|
-
cautions: string[];
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
const PLACEHOLDER = [
|
|
79
|
-
"# pi-daddy: this skill declares no `allowed-tools`, so it CANNOT be spawned as a governed sub-agent —",
|
|
80
|
-
"# an undeclared capability set is treated as NONE, never as everything. Decide what it needs, then",
|
|
81
|
-
"# uncomment and complete the line below. pi-daddy does not choose this for you: the capability set is",
|
|
82
|
-
"# the thing you are meant to review and commit.",
|
|
83
|
-
"# pi 0.84.1's tools: " + PI_BUILTIN_TOOLS.join(", ") + ".",
|
|
84
|
-
"# allowed-tools: <list the tools this skill needs, e.g. Read, Grep>",
|
|
85
|
-
];
|
|
86
|
-
|
|
87
|
-
/**
|
|
88
|
-
* A copied file that is unspawnable for a reason an operator cannot see by reading it.
|
|
89
|
-
*
|
|
90
|
-
* The undeclared case got four explanatory lines from the start; a pattern-carrying one got nothing, so
|
|
91
|
-
* opening `.pi/skills/git-ops/SKILL.md` to find out why it will not spawn showed a perfectly ordinary file.
|
|
92
|
-
* Same argument, opposite treatment — now the same treatment.
|
|
93
|
-
*/
|
|
94
|
-
const patternNote = (patterns: string[]) => [
|
|
95
|
-
"# pi-daddy: this skill CANNOT be spawned as a governed sub-agent. Its `allowed-tools` restricts a tool",
|
|
96
|
-
`# with a pattern (${patterns.join(", ")}), and pi's --tools matches whole tool names only — granting the`,
|
|
97
|
-
"# bare tool would widen the declaration and dropping it would silently narrow, so neither is done.",
|
|
98
|
-
"# Replace the pattern with whole tool names to make it spawnable.",
|
|
99
|
-
];
|
|
100
|
-
|
|
101
|
-
/**
|
|
102
|
-
* The file to write for one skill: verbatim when it declares a usable ceiling, plus a commented note when
|
|
103
|
-
* it does not.
|
|
104
|
-
*
|
|
105
|
-
* Inserted at the END of the frontmatter block, so the rest of the file — including its own key order and
|
|
106
|
-
* its body — is byte-identical to the package's. A `#` line is a YAML comment and this package's
|
|
107
|
-
* frontmatter reader skips it, so an undeclared copy is still *undeclared*: not spawnable until a human
|
|
108
|
-
* edits it, which is the whole point.
|
|
109
|
-
*/
|
|
110
|
-
export function withPlaceholder(text: string, declared: boolean, note: string[] = PLACEHOLDER): string {
|
|
111
|
-
if (declared) return text;
|
|
112
|
-
const match = /^(---\r?\n)([\s\S]*?)(\r?\n---(?:\r?\n|$))/.exec(text);
|
|
113
|
-
// No frontmatter at all means `parseSkillDefinition` returned null and this skill was never discovered;
|
|
114
|
-
// inventing one here would invent a file shape. Left exactly as it is.
|
|
115
|
-
if (!match) return text;
|
|
116
|
-
const [full, opening, body, close] = match;
|
|
117
|
-
const eol = close.startsWith("\r\n") ? "\r\n" : "\n";
|
|
118
|
-
return opening + body + eol + note.join(eol) + close + text.slice(full.length);
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
/** `tool:` ids pi 0.84.1 has no tool for. `delegate` is this package's own, hence the exemption. */
|
|
122
|
-
function unknownToolIds(capabilities: Capability[]): Capability[] {
|
|
123
|
-
const builtins = new Set<string>(PI_BUILTIN_TOOLS);
|
|
124
|
-
return capabilities.filter(
|
|
125
|
-
(c) => c.startsWith("tool:") && c !== ALWAYS_LIVE && !builtins.has(c.slice("tool:".length)),
|
|
126
|
-
);
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
/**
|
|
130
|
-
* Decide what `init` would write. Pure: no filesystem, no npm, no decisions taken on the operator's behalf.
|
|
131
|
-
*
|
|
132
|
-
* The grant is **the read-only part** of what the copied skills declare, plus one `agent:` id per definition
|
|
133
|
-
* that can actually run within it, plus `tool:delegate` — without which the session registers no delegation
|
|
134
|
-
* tools at all and the whole file is inert. Everything else is emitted commented, named, and one uncomment
|
|
135
|
-
* away (ADR-0029).
|
|
136
|
-
*/
|
|
137
|
-
export function planInit(
|
|
138
|
-
packages: SkillPackage[],
|
|
139
|
-
cwd: string,
|
|
140
|
-
/**
|
|
141
|
-
* Ids from the operator's workspace registry, when one is configured — read by the CALLER, because
|
|
142
|
-
* `planInit` is pure and stays that way.
|
|
143
|
-
*
|
|
144
|
-
* ADR-0035 made routing a capability and said `init` "scaffolds the registered ids so the common path is a
|
|
145
|
-
* one-line grant edit". It did not: `init` had never heard of the registry, so the ADR's own stated
|
|
146
|
-
* migration path for a breaking change did not exist. These are emitted **commented**, never live —
|
|
147
|
-
* offering the ids while refusing to choose among them is exactly ADR-0028's position.
|
|
148
|
-
*/
|
|
149
|
-
registeredWorkspaceIds: readonly string[] = [],
|
|
150
|
-
): InitPlan {
|
|
151
|
-
const skills: PlannedSkill[] = [];
|
|
152
|
-
const collisions: string[] = [];
|
|
153
|
-
const seen = new Set<string>();
|
|
154
|
-
|
|
155
|
-
for (const pkg of packages) {
|
|
156
|
-
for (const skill of pkg.skills) {
|
|
157
|
-
const name = skill.definition.name;
|
|
158
|
-
if (seen.has(name)) {
|
|
159
|
-
collisions.push(`${name} (also in ${pkg.name}@${pkg.version}, not written)`);
|
|
160
|
-
continue;
|
|
161
|
-
}
|
|
162
|
-
seen.add(name);
|
|
163
|
-
|
|
164
|
-
const ceiling = ceilingForDefinition(skill.definition);
|
|
165
|
-
const notes: string[] = [];
|
|
166
|
-
let withheld: WithholdReason | null = null;
|
|
167
|
-
let note = PLACEHOLDER;
|
|
168
|
-
if (ceiling.undeclared) withheld = "undeclared";
|
|
169
|
-
else if (ceiling.patterns.length > 0) {
|
|
170
|
-
withheld = "pattern";
|
|
171
|
-
note = patternNote(ceiling.patterns);
|
|
172
|
-
notes.push(
|
|
173
|
-
`declares ${ceiling.patterns.join(", ")} — pi's --tools matches whole tool names only, so a ` +
|
|
174
|
-
`sub-tool pattern is refused rather than reinterpreted (granting the bare tool would widen it)`,
|
|
175
|
-
);
|
|
176
|
-
}
|
|
177
|
-
|
|
178
|
-
skills.push({
|
|
179
|
-
name,
|
|
180
|
-
from: `${pkg.name}@${pkg.version}`,
|
|
181
|
-
sourcePath: skill.path,
|
|
182
|
-
targetPath: skill.referenced ? skill.path : join(cwd, ".pi", "skills", name, "SKILL.md"),
|
|
183
|
-
referenced: skill.referenced,
|
|
184
|
-
content: withPlaceholder(skill.text, withheld === null, note),
|
|
185
|
-
ceiling: ceiling.capabilities,
|
|
186
|
-
withheld,
|
|
187
|
-
notes,
|
|
188
|
-
});
|
|
189
|
-
}
|
|
190
|
-
}
|
|
191
|
-
|
|
192
|
-
// ADR-0029: split what the declared ceilings ask for into what `init` grants live and what it comments.
|
|
193
|
-
const declared = skills.filter((s) => s.withheld === null);
|
|
194
|
-
const withheldCapabilities = new Map<Capability, string[]>();
|
|
195
|
-
for (const skill of declared) {
|
|
196
|
-
for (const capability of skill.ceiling) {
|
|
197
|
-
if (isLiveByDefault(capability)) continue;
|
|
198
|
-
// A routing destination is withheld but does NOT belong in this map, and the difference is not
|
|
199
|
-
// cosmetic. This map drives two things: the "WITHHELD BY DEFAULT — these can change your machine"
|
|
200
|
-
// block, and `/grants init`'s dialog. Review found a `workspace:` id reaching both — described to the
|
|
201
|
-
// operator with `tool:bash`'s rationale (routing does not change your machine, and unlike `bash` it
|
|
202
|
-
// *is* gateable), and then granted **live and persisted** on one "Yes", off a third-party package's
|
|
203
|
-
// declaration. That is the rule `grant-env.ts` states — "does not become live because a package asked
|
|
204
|
-
// for it" — honoured by the rendered file and broken by the dialog beside it: two surfaces of one
|
|
205
|
-
// command disagreeing, which is R-28's shape inside the fix for R-28.
|
|
206
|
-
//
|
|
207
|
-
// Which worktree a child starts in is not derivable from a declaration (ADR-0028), so `init` lists
|
|
208
|
-
// routing and never grants it. `routableWorkspaces` below is where these go; the definition that
|
|
209
|
-
// declared one still loses its live `agent:` id via the `needs-withheld` pass, so nothing becomes
|
|
210
|
-
// spawnable behind the operator's back either.
|
|
211
|
-
if (capability.startsWith("workspace:")) continue;
|
|
212
|
-
withheldCapabilities.set(capability, [...(withheldCapabilities.get(capability) ?? []), skill.name]);
|
|
213
|
-
}
|
|
214
|
-
}
|
|
215
|
-
|
|
216
|
-
// A definition needing a withheld capability does not get a live `agent:` id either: authorising it to run
|
|
217
|
-
// and then refusing it at spawn time is a worse answer than not authorising it, and it would put an
|
|
218
|
-
// `agent:` id in the grant whose definition cannot work — the shape ADR-0028 rule 3 already refuses.
|
|
219
|
-
for (const skill of declared) {
|
|
220
|
-
if (skill.ceiling.some((c) => !isLiveByDefault(c))) skill.withheld = "needs-withheld";
|
|
221
|
-
}
|
|
222
|
-
|
|
223
|
-
const authorised = skills.filter((s) => s.withheld === null);
|
|
224
|
-
const written = new Set(authorised.map((s) => s.name));
|
|
225
|
-
// `agent:<other>` in a ceiling is legitimate — it is how a delegator learns which definitions IT may
|
|
226
|
-
// spawn — but a name `init` did not write here would authorise a file from another skill root that the
|
|
227
|
-
// operator is not reviewing, including `~/.pi/agent/skills`, which other tools install into. Reported,
|
|
228
|
-
// never granted: the same objection ADR-0028 rule 3 makes to authorising an undeclared skill.
|
|
229
|
-
const crossReferences: { from: string; capability: Capability }[] = [];
|
|
230
|
-
const live = new Set<Capability>([ALWAYS_LIVE]);
|
|
231
|
-
for (const skill of authorised) {
|
|
232
|
-
live.add(agentCapability(skill.name));
|
|
233
|
-
for (const capability of skill.ceiling) {
|
|
234
|
-
if (capability.startsWith("agent:") && !written.has(capability.slice("agent:".length))) {
|
|
235
|
-
crossReferences.push({ from: skill.name, capability });
|
|
236
|
-
continue;
|
|
237
|
-
}
|
|
238
|
-
live.add(capability);
|
|
239
|
-
}
|
|
240
|
-
}
|
|
241
|
-
const grant = [...live].sort();
|
|
242
|
-
|
|
243
|
-
const cautions = authorised.flatMap((s) =>
|
|
244
|
-
unknownToolIds(s.ceiling).map(
|
|
245
|
-
(c) =>
|
|
246
|
-
`${s.name} declares ${c}, which pi 0.84.1 has no tool for — unless an extension provides it, ` +
|
|
247
|
-
`spawning ${s.name} is refused as an unknown capability`,
|
|
248
|
-
),
|
|
249
|
-
);
|
|
250
|
-
|
|
251
|
-
// R-78's structural backstop. Throws rather than rendering something a shell could read as more than a
|
|
252
|
-
// value, so a gap in the per-entry whitelist costs a refusal instead of an injection.
|
|
253
|
-
assertGrantIsWritable(grant);
|
|
254
|
-
|
|
255
|
-
const describe: Record<WithholdReason, (s: PlannedSkill) => string> = {
|
|
256
|
-
undeclared: (s) => "declares no `allowed-tools` — fill it in, then add `agent:" + s.name + "` below",
|
|
257
|
-
pattern: (s) => s.notes.join("; "),
|
|
258
|
-
"needs-withheld": (s) =>
|
|
259
|
-
`needs ${s.ceiling.filter((c) => !isLiveByDefault(c)).join(", ")}, withheld by default — see below`,
|
|
260
|
-
};
|
|
261
|
-
|
|
262
|
-
const grantEnvSkills: GrantEnvSkill[] = skills.map((s) => ({
|
|
263
|
-
name: s.name,
|
|
264
|
-
ceiling: s.ceiling,
|
|
265
|
-
...(s.withheld ? { unspawnable: describe[s.withheld](s) } : {}),
|
|
266
|
-
}));
|
|
267
|
-
|
|
268
|
-
// Registry ids the operator could route to, plus any a copied definition actually declares — a package
|
|
269
|
-
// naming `workspace:prod` is evidence that id matters here, and it must still be uncommented by hand.
|
|
270
|
-
const declaredWorkspaces = skills.flatMap((s) => s.ceiling.filter((c) => c.startsWith("workspace:")));
|
|
271
|
-
const routableWorkspaces = [
|
|
272
|
-
...new Set([...registeredWorkspaceIds.map(workspaceCapability), ...declaredWorkspaces]),
|
|
273
|
-
].sort();
|
|
274
|
-
|
|
275
|
-
return {
|
|
276
|
-
skills,
|
|
277
|
-
collisions,
|
|
278
|
-
grant,
|
|
279
|
-
withheldCapabilities,
|
|
280
|
-
routableWorkspaces,
|
|
281
|
-
grantEnvPath: join(cwd, ".pi", "grants.env"),
|
|
282
|
-
grantEnvContent: renderGrantEnv({
|
|
283
|
-
skills: grantEnvSkills,
|
|
284
|
-
live: grant,
|
|
285
|
-
withheld: withheldCapabilities,
|
|
286
|
-
withheldDefinitions: skills.filter((s) => s.withheld === "needs-withheld").map((s) => s.name),
|
|
287
|
-
crossReferences,
|
|
288
|
-
cautions,
|
|
289
|
-
routableWorkspaces,
|
|
290
|
-
}),
|
|
291
|
-
cautions,
|
|
292
|
-
};
|
|
293
|
-
}
|
|
294
|
-
|
|
295
|
-
export interface InitOutcome {
|
|
296
|
-
written: string[];
|
|
297
|
-
/** Present already, so left alone. `init` never silently overwrites an edited ceiling. */
|
|
298
|
-
kept: string[];
|
|
299
|
-
failed: { path: string; error: string }[];
|
|
300
|
-
}
|
|
301
|
-
|
|
302
|
-
/**
|
|
303
|
-
* Create a file only if nothing is there, and **never through a symlink**.
|
|
304
|
-
*
|
|
305
|
-
* Both properties come from `O_CREAT|O_EXCL` (`flag: "wx"`), and both were defects in the first version
|
|
306
|
-
* (R-79). It probed for existence with `readFile` and then called `writeFile`:
|
|
307
|
-
*
|
|
308
|
-
* - `readFile` conflates *unreadable* with *absent*, so an operator's `SKILL.md` with restrictive
|
|
309
|
-
* permissions was reported `wrote` and their narrowed `allowed-tools: Read` was replaced by the
|
|
310
|
-
* package's wider one — **without `--force`**, falsifying this package's own documented "Kept" rule.
|
|
311
|
-
* A FIFO at the target path hung the probe forever, with no timeout anywhere in the path.
|
|
312
|
-
* - `writeFile` follows symlinks, so a dangling symlink at a target path created the file at the link's
|
|
313
|
-
* destination, outside the project, while reporting an in-project path. That is **B-I6**, which
|
|
314
|
-
* `approval-store.ts` already fixed for the approval store under ADR-0014 — a new writer in the same
|
|
315
|
-
* package reintroducing a defect the package documents as closed, and whose comment says in so many
|
|
316
|
-
* words *"never through a symlink"*.
|
|
317
|
-
*
|
|
318
|
-
* `wx` fails with `EEXIST` on anything at the path, including a dangling symlink, so there is no probe, no
|
|
319
|
-
* race between the probe and the write, and no way to write through a link.
|
|
320
|
-
*/
|
|
321
|
-
async function createUnlessPresent(path: string, content: string, outcome: InitOutcome): Promise<void> {
|
|
322
|
-
try {
|
|
323
|
-
await mkdir(join(path, ".."), { recursive: true });
|
|
324
|
-
const handle = await open(path, "wx");
|
|
325
|
-
await runWithFinalizers(
|
|
326
|
-
() => handle.writeFile(content, "utf8"),
|
|
327
|
-
[{ label: "new-file handle cleanup failed", run: () => handle.close() }],
|
|
328
|
-
);
|
|
329
|
-
outcome.written.push(path);
|
|
330
|
-
} catch (error) {
|
|
331
|
-
if ((error as { code?: string }).code === "EEXIST") outcome.kept.push(path);
|
|
332
|
-
else outcome.failed.push({ path, error: error instanceof Error ? error.message : String(error) });
|
|
333
|
-
}
|
|
334
|
-
}
|
|
335
|
-
|
|
336
|
-
/** Replace a file, unlinking first so a symlink is REPLACED rather than written through. */
|
|
337
|
-
async function replace(path: string, content: string, outcome: InitOutcome): Promise<void> {
|
|
338
|
-
try {
|
|
339
|
-
await mkdir(join(path, ".."), { recursive: true });
|
|
340
|
-
// `rm` unlinks the LINK, never its target — which is exactly the semantics `--force` should have.
|
|
341
|
-
await rm(path, { force: true });
|
|
342
|
-
await writeFile(path, content, { encoding: "utf8", flag: "wx" });
|
|
343
|
-
outcome.written.push(path);
|
|
344
|
-
} catch (error) {
|
|
345
|
-
outcome.failed.push({ path, error: error instanceof Error ? error.message : String(error) });
|
|
346
|
-
}
|
|
347
|
-
}
|
|
348
|
-
|
|
349
|
-
/**
|
|
350
|
-
* Apply a plan.
|
|
351
|
-
*
|
|
352
|
-
* **Existing files are kept, not overwritten**, and that default is load-bearing rather than polite: the
|
|
353
|
-
* edit an operator makes to one of these files IS the capability decision, and the second run of a
|
|
354
|
-
* scaffolding command is exactly when it would be destroyed.
|
|
355
|
-
*
|
|
356
|
-
* **`--force` never regenerates `.pi/grants.env`** (R-79). It rewrites the definition copies, which is the
|
|
357
|
-
* documented re-sync path for R-74 — but the grant file is the *reviewed artifact*, and an operator who had
|
|
358
|
-
* deleted `agent:build` and added a ledger path would have had both silently restored to generated defaults
|
|
359
|
-
* by a command whose usage text mentions only `allowed-tools`. Deleting the file is how to regenerate it,
|
|
360
|
-
* and that is not something anyone does by accident.
|
|
361
|
-
*/
|
|
362
|
-
export async function applyInit(plan: InitPlan, options: { force?: boolean } = {}): Promise<InitOutcome> {
|
|
363
|
-
const outcome: InitOutcome = { written: [], kept: [], failed: [] };
|
|
364
|
-
const projectPi = join(plan.grantEnvPath, "..");
|
|
365
|
-
try {
|
|
366
|
-
// A new project gets a private control directory. Existing operator/Pi state is never chmodded or reused.
|
|
367
|
-
await mkdir(projectPi, { mode: 0o700 });
|
|
368
|
-
const created = await lstat(projectPi);
|
|
369
|
-
if (!created.isDirectory() || created.isSymbolicLink()) throw Error("private .pi directory creation failed");
|
|
370
|
-
} catch (error) {
|
|
371
|
-
if ((error as { code?: string }).code !== "EEXIST") {
|
|
372
|
-
outcome.failed.push({ path: projectPi, error: error instanceof Error ? error.message : String(error) });
|
|
373
|
-
return outcome;
|
|
374
|
-
}
|
|
375
|
-
const existing = await lstat(projectPi);
|
|
376
|
-
if (existing.isSymbolicLink() || !existing.isDirectory()) {
|
|
377
|
-
outcome.failed.push({ path: projectPi, error: "existing .pi state is not a directory; it was not followed or changed" });
|
|
378
|
-
return outcome;
|
|
379
|
-
}
|
|
380
|
-
}
|
|
381
|
-
const force = options.force === true;
|
|
382
|
-
for (const skill of plan.skills) {
|
|
383
|
-
if (skill.referenced) continue;
|
|
384
|
-
if (force) await replace(skill.targetPath, skill.content, outcome);
|
|
385
|
-
else await createUnlessPresent(skill.targetPath, skill.content, outcome);
|
|
386
|
-
}
|
|
387
|
-
await createUnlessPresent(plan.grantEnvPath, plan.grantEnvContent, outcome);
|
|
388
|
-
return outcome;
|
|
389
|
-
}
|
|
@@ -1,91 +0,0 @@
|
|
|
1
|
-
import { lstat, realpath } from "node:fs/promises";
|
|
2
|
-
import { dirname, isAbsolute, resolve } from "node:path";
|
|
3
|
-
import { readDailySnapshot } from "./daily-view-input.ts";
|
|
4
|
-
import { workDestination } from "./work-ledger-destination.ts";
|
|
5
|
-
import { appendWorkLedgerEventOnce, buildWorkRevisionEvent, buildWorkSnapshotEvent, parseWorkLedgerText, type WorkFrozen, type WorkRevision } from "./work-ledger.ts";
|
|
6
|
-
import { resolveWorkSnapshotText } from "./work-ledger-snapshot.ts";
|
|
7
|
-
import { controlShape } from "./dispatch-control.ts";
|
|
8
|
-
import { freezeWork } from "./work-ledger-json.ts";
|
|
9
|
-
import { intentKey, intentSelection, intentPriorities, type WorkIntentBinding, type IntentRequest, type IntentState, type IntentSelection, type IntentPriority } from "./intent-control.ts";
|
|
10
|
-
const ref = (r: WorkFrozen<WorkRevision>) => ({ kind: r.kind, id: r.id, revision: r.revision, digest: r.digest });
|
|
11
|
-
const entity = (r: { kind: string; id: string } | null) => r ? `${r.kind}:${r.id}` : null;
|
|
12
|
-
const allowedIntentPath=(path:string)=>!path.split("/").includes(".pi")||path.endsWith("/.pi/work.jsonl");
|
|
13
|
-
export function workIntentBinding(input: WorkIntentBinding): WorkIntentBinding {
|
|
14
|
-
controlShape(input, ["version", "path", "device", "inode", "grantLedgerPath", "selection", "priorities"]);
|
|
15
|
-
if (input.version !== "1.0" || typeof input.path !== "string" || input.path.length > 1024 || !isAbsolute(input.path) || resolve(input.path) !== input.path || !allowedIntentPath(input.path) ||
|
|
16
|
-
![input.device, input.inode].every(x => typeof x === "string" && /^\d+$/.test(x)) || !(input.grantLedgerPath === null || typeof input.grantLedgerPath === "string" && input.grantLedgerPath.length <= 1024 && isAbsolute(input.grantLedgerPath))) throw new TypeError("invalid pinned work binding");
|
|
17
|
-
return JSON.parse(intentKey({ ...input, selection: intentSelection(input.selection), priorities: intentPriorities(input.priorities) }));
|
|
18
|
-
}
|
|
19
|
-
export async function readIntentWork(input: WorkFrozen<WorkIntentBinding>): Promise<string> {
|
|
20
|
-
const check = async () => {
|
|
21
|
-
const st = await lstat(input.path, { bigint: true });
|
|
22
|
-
if (!st.isFile() || st.nlink !== 1n || st.uid !== BigInt(process.getuid!()) || (st.mode & 0o077n) || String(st.dev) !== input.device || String(st.ino) !== input.inode || await realpath(input.path) !== input.path) throw new Error("work binding changed");
|
|
23
|
-
};
|
|
24
|
-
await check(); const bytes = await readDailySnapshot(input.path, 16 * 1024 * 1024); await check();
|
|
25
|
-
if (bytes.status !== "read") throw new Error("required work snapshot unavailable");
|
|
26
|
-
const text = new TextDecoder("utf-8", { fatal: true }).decode(bytes.bytes);
|
|
27
|
-
if (!text.endsWith("\n") || !parseWorkLedgerText(text).complete) throw new Error("incomplete work ledger; no repair");
|
|
28
|
-
return text;
|
|
29
|
-
}
|
|
30
|
-
export function resolveIntent(text: string, selection: WorkFrozen<IntentSelection>, priorities: WorkFrozen<IntentPriority[]>): ReturnType<typeof resolveWorkSnapshotText> {
|
|
31
|
-
const result = resolveWorkSnapshotText(text, selection);
|
|
32
|
-
if (result.scopeState !== "valid" || !result.scope || !result.snapshot || result.revisions.length > 64) throw new Error("unresolved authoritative work selection");
|
|
33
|
-
const wanted = result.snapshot.bindings.map(b => intentKey(b.obligation)).sort();
|
|
34
|
-
if (intentKey(wanted) !== intentKey(priorities.map(p => intentKey(p.obligation)).sort())) throw new Error("priority policy must name exactly the selected obligations");
|
|
35
|
-
return result;
|
|
36
|
-
}
|
|
37
|
-
/** Actual owned bytes establish the physical binding; caller supplies the exact initial selection. */
|
|
38
|
-
export async function bindWorkIntent(input: { path: string; grantLedgerPath: string | null; selection: IntentSelection; priorities: IntentPriority[] }): Promise<WorkFrozen<WorkIntentBinding>> {
|
|
39
|
-
controlShape(input, ["path", "grantLedgerPath", "selection", "priorities"]);
|
|
40
|
-
const selection = intentSelection(input.selection), priorities = intentPriorities(input.priorities), path = input.path, grantLedgerPath = input.grantLedgerPath;
|
|
41
|
-
if (typeof path !== "string" || !isAbsolute(path) || !allowedIntentPath(path)) throw new TypeError("explicit work path required");
|
|
42
|
-
await workDestination(path, grantLedgerPath);
|
|
43
|
-
const parent = await lstat(dirname(path), { bigint: true });
|
|
44
|
-
if (!parent.isDirectory() || (parent.mode & 0o077n) || parent.uid !== BigInt(process.getuid!())) throw new Error("owner-private work parent required");
|
|
45
|
-
const st = await lstat(path, { bigint: true });
|
|
46
|
-
const binding = workIntentBinding({ version: "1.0", path, grantLedgerPath, device: String(st.dev), inode: String(st.ino), selection, priorities });
|
|
47
|
-
resolveIntent(await readIntentWork(binding), selection, priorities); return freezeWork(binding);
|
|
48
|
-
}
|
|
49
|
-
/** No authority callback: validate concrete P01 effects and prevent permission/owner/policy expansion. */
|
|
50
|
-
export async function validateIntentApplication(binding: WorkFrozen<WorkIntentBinding>, state: IntentState, request: WorkFrozen<IntentRequest>): Promise<void> {
|
|
51
|
-
const text = await readIntentWork(binding), current = resolveIntent(text, state.selection, state.priorities);
|
|
52
|
-
const existing = parseWorkLedgerText(text).events;
|
|
53
|
-
const missing = request.events.filter(e => {
|
|
54
|
-
const sameId = existing.filter(old => old.eventId === e.eventId);
|
|
55
|
-
if (sameId.some(old => old.digest !== e.digest)) throw new Error("proposed event identity conflicts with retained work");
|
|
56
|
-
return sameId.length === 0;
|
|
57
|
-
});
|
|
58
|
-
const candidate = text + missing.map(e => intentKey(e) + "\n").join("");
|
|
59
|
-
const next = resolveIntent(candidate, request.selection, request.priorities);
|
|
60
|
-
if (request.action === "reprioritize" && intentKey(request.selection) !== intentKey(state.selection)) throw new Error("priority is not scope selection");
|
|
61
|
-
if (request.action !== "reprioritize" && intentKey(request.selection) === intentKey(state.selection)) throw new Error("a different exact recorded selection is required");
|
|
62
|
-
const old = [current.scope!, ...current.revisions], after = [next.scope!, ...next.revisions];
|
|
63
|
-
if (intentKey(old.map(entity).sort()) !== intentKey(after.map(entity).sort())) throw new Error("entity expansion/removal is outside this bounded adapter");
|
|
64
|
-
for (const r of after) {
|
|
65
|
-
const prior = old.find(p => entity(p) === entity(r))!;
|
|
66
|
-
if (r.ownerId !== prior.ownerId || r.scopeId !== prior.scopeId || r.permittedEffects.some(e => !prior.permittedEffects.includes(e)) || intentKey(r.policy) !== intentKey(prior.policy) ||
|
|
67
|
-
entity(r.parent) !== entity(prior.parent) || intentKey(r.dependencies.map(entity).sort()) !== intentKey(prior.dependencies.map(entity).sort()) ||
|
|
68
|
-
r.kind === "policy" && r.digest !== prior.digest) throw new Error("owner, policy, topology or permission expansion refused");
|
|
69
|
-
if (["revise-scope", "revise-selection"].includes(request.action) && r.digest !== prior.digest && (r.revision !== prior.revision + 1 || intentKey(r.predecessor) !== intentKey(ref(prior)))) throw new Error("exact successor required");
|
|
70
|
-
}
|
|
71
|
-
if (request.action === "revise-selection" && !after.some(r => r.digest !== old.find(p => entity(p) === entity(r))!.digest)) throw new Error("at least one exact successor revision required");
|
|
72
|
-
if (request.action === "revise-scope" && (next.scope!.revision !== current.scope!.revision + 1 || intentKey(next.scope!.predecessor) !== intentKey(ref(current.scope!)))) throw new Error("scope revision is not dispatch revision");
|
|
73
|
-
for (const e of request.events) {
|
|
74
|
-
// Rebuild through the actual P01 builders, not an alternate event/hash encoder.
|
|
75
|
-
if (e.event === "work_revision") {
|
|
76
|
-
const { digest: _digest, ...revision } = e.payload.revision;
|
|
77
|
-
if (!after.some(r => intentKey(ref(r)) === intentKey(ref(e.payload.revision))) || intentKey(buildWorkRevisionEvent({ eventId: e.eventId, now: new Date(e.ts), revision: JSON.parse(intentKey(revision)) })) !== intentKey(e)) throw new Error("unselected or noncanonical revision proposal");
|
|
78
|
-
} else if (e.event === "work_snapshot") {
|
|
79
|
-
const { digest: _digest, ...snapshot } = e.payload.snapshot;
|
|
80
|
-
if (e.eventId !== request.selection.event.eventId || e.digest !== request.selection.event.digest || intentKey(buildWorkSnapshotEvent({ eventId: e.eventId, now: new Date(e.ts), snapshot: JSON.parse(intentKey(snapshot)) })) !== intentKey(e)) throw new Error("unselected snapshot proposal");
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
export async function applyIntentApplication(binding: WorkFrozen<WorkIntentBinding>, state: IntentState, request: WorkFrozen<IntentRequest>): Promise<void> {
|
|
85
|
-
await validateIntentApplication(binding, state, request);
|
|
86
|
-
for (const event of request.events) {
|
|
87
|
-
await readIntentWork(binding);
|
|
88
|
-
await appendWorkLedgerEventOnce({ path: binding.path, grantLedgerPath: binding.grantLedgerPath }, event);
|
|
89
|
-
}
|
|
90
|
-
resolveIntent(await readIntentWork(binding), request.selection, request.priorities);
|
|
91
|
-
}
|
package/src/intent-control.ts
DELETED
|
@@ -1,107 +0,0 @@
|
|
|
1
|
-
import { createHash } from "node:crypto";
|
|
2
|
-
import { canonicalWorkJson, copyWorkJson, freezeWork, parseWorkJson } from "./work-ledger-json.ts";
|
|
3
|
-
import { parseWorkLedgerText, type WorkFrozen, type WorkProjectionContext, type RevisionRef, type WorkRevisionEvent, type WorkSnapshotEvent } from "./work-ledger.ts";
|
|
4
|
-
import { validateWorkSelection } from "./work-ledger-validation.ts";
|
|
5
|
-
import { controlShape } from "./dispatch-control.ts";
|
|
6
|
-
export type IntentSelection = NonNullable<WorkProjectionContext["selectedSnapshot"]>;
|
|
7
|
-
export interface IntentPriority { obligation: RevisionRef; rank: number }
|
|
8
|
-
export interface WorkIntentBinding {
|
|
9
|
-
version: "1.0"; path: string; device: string; inode: string; grantLedgerPath: string | null;
|
|
10
|
-
selection: IntentSelection; priorities: IntentPriority[];
|
|
11
|
-
}
|
|
12
|
-
export interface IntentRequest {
|
|
13
|
-
version: "intent-request-v1" | "intent-request-v2"; requestId: string; bindingDigest: string; expectedRevision: number;
|
|
14
|
-
expectedSelection: IntentSelection; action: "revise-scope" | "reprioritize" | "select-alternative" | "revise-selection";
|
|
15
|
-
events: (WorkRevisionEvent | WorkSnapshotEvent)[]; selection: IntentSelection; priorities: IntentPriority[];
|
|
16
|
-
}
|
|
17
|
-
export interface IntentReceipt {
|
|
18
|
-
requestId: string; digest: string; expectedRevision: number; expectedSelection: IntentSelection;
|
|
19
|
-
action: IntentRequest["action"]; selection: IntentSelection; priorities: IntentPriority[];
|
|
20
|
-
events: { eventId: string; digest: string }[];
|
|
21
|
-
decision: "approved" | "authority-unavailable" | "stale" | "busy";
|
|
22
|
-
application: "pending-or-unknown" | "applied" | "not-applied";
|
|
23
|
-
outcome: "pending-or-unknown" | "selection-applied" | "priority-applied" | "refused";
|
|
24
|
-
resultSelection: IntentSelection | null;
|
|
25
|
-
}
|
|
26
|
-
export interface IntentState { revision: number; selection: IntentSelection; priorities: IntentPriority[]; records: IntentReceipt[] }
|
|
27
|
-
export interface IntentAdmission { selection: IntentSelection; revision: number; obligation: RevisionRef }
|
|
28
|
-
export type IntentSnapshot = WorkFrozen<IntentState & { version: "intent-controller-snapshot-v1"; bindingDigest: string;
|
|
29
|
-
admission: "blocked-pending" | "intent-ready"; acceptance: "not-assessed"; freshness: "snapshot-unknown" }>;
|
|
30
|
-
export const intentKey = (value: unknown) => canonicalWorkJson(copyWorkJson(value));
|
|
31
|
-
const hash = (value: unknown) => createHash("sha256").update(intentKey(value)).digest("hex");
|
|
32
|
-
const id = (x: unknown) => typeof x === "string" && /^[a-zA-Z0-9:_-]{1,128}$/.test(x);
|
|
33
|
-
const hex = (x: unknown) => typeof x === "string" && /^[a-f0-9]{64}$/.test(x);
|
|
34
|
-
export function intentPriorities(input: unknown): IntentPriority[] {
|
|
35
|
-
const result = copyWorkJson(input) as unknown as IntentPriority[];
|
|
36
|
-
if (!Array.isArray(result) || result.length > 32) throw new TypeError("bounded explicit priorities required");
|
|
37
|
-
for (const p of result) {
|
|
38
|
-
controlShape(p, ["obligation", "rank"]); controlShape(p.obligation, ["kind", "id", "revision", "digest"]);
|
|
39
|
-
if (p.obligation.kind !== "obligation" || !id(p.obligation.id) || !hex(p.obligation.digest) || !Number.isSafeInteger(p.obligation.revision) || p.obligation.revision < 1 ||
|
|
40
|
-
!Number.isSafeInteger(p.rank) || p.rank < 0 || p.rank > 127) throw new TypeError("invalid priority");
|
|
41
|
-
}
|
|
42
|
-
if (new Set(result.map(p => intentKey(p.obligation))).size !== result.length) throw new TypeError("duplicate priority obligation");
|
|
43
|
-
return result.sort((a, b) => a.rank - b.rank || (intentKey(a.obligation) < intentKey(b.obligation) ? -1 : 1));
|
|
44
|
-
}
|
|
45
|
-
export function intentSelection(value: unknown): IntentSelection {
|
|
46
|
-
const copied = copyWorkJson(value); validateWorkSelection(copied);
|
|
47
|
-
if (copied === null) throw new TypeError("exact intent selection required");
|
|
48
|
-
return copied as unknown as IntentSelection;
|
|
49
|
-
}
|
|
50
|
-
export function intentRequest(input: IntentRequest): WorkFrozen<IntentRequest> {
|
|
51
|
-
const r = copyWorkJson(input) as unknown as IntentRequest;
|
|
52
|
-
controlShape(r, ["version", "requestId", "bindingDigest", "expectedRevision", "expectedSelection", "action", "events", "selection", "priorities"]);
|
|
53
|
-
if ((r.action === "revise-selection" ? r.version !== "intent-request-v2" : r.version !== "intent-request-v1") || !id(r.requestId) || !hex(r.bindingDigest) || !Number.isSafeInteger(r.expectedRevision) || r.expectedRevision < 0 || r.expectedRevision > 32 ||
|
|
54
|
-
!["revise-scope", "reprioritize", "select-alternative", "revise-selection"].includes(r.action) || !Array.isArray(r.events) || r.events.length > 16 || Buffer.byteLength(intentKey(r)) > 48 * 1024) throw new TypeError("invalid bounded intent request");
|
|
55
|
-
const parsed = parseWorkLedgerText(r.events.map(e => intentKey(e)).join("\n"));
|
|
56
|
-
if (!parsed.complete || parsed.events.some(e => !id(e.eventId) || !["work_revision", "work_snapshot"].includes(e.event)) || new Set(parsed.events.map(e => e.eventId)).size !== parsed.events.length ||
|
|
57
|
-
(!["revise-scope", "revise-selection"].includes(r.action) && r.events.length)) throw new TypeError("only strict revision/snapshot proposals may be appended");
|
|
58
|
-
return freezeWork({ ...r, expectedSelection: intentSelection(r.expectedSelection), selection: intentSelection(r.selection), priorities: intentPriorities(r.priorities) });
|
|
59
|
-
}
|
|
60
|
-
export const parseIntentRequest = (text: string) => intentRequest(parseWorkJson(text) as unknown as IntentRequest);
|
|
61
|
-
export const intentRequestDigest = (input: WorkFrozen<IntentRequest>) => hash(intentRequest(input as IntentRequest));
|
|
62
|
-
export function intentReceipt(input: WorkFrozen<IntentRequest>, decision: IntentReceipt["decision"]): IntentReceipt {
|
|
63
|
-
return JSON.parse(intentKey({ requestId: input.requestId, digest: intentRequestDigest(input), expectedRevision: input.expectedRevision,
|
|
64
|
-
expectedSelection: input.expectedSelection, action: input.action, selection: input.selection, priorities: input.priorities,
|
|
65
|
-
events: input.events.map(e => ({ eventId: e.eventId, digest: e.digest })), decision,
|
|
66
|
-
application: decision === "approved" ? "pending-or-unknown" : "not-applied",
|
|
67
|
-
outcome: decision === "approved" ? "pending-or-unknown" : "refused", resultSelection: null }));
|
|
68
|
-
}
|
|
69
|
-
export function matchesIntentReceipt(receipt: IntentReceipt, request: WorkFrozen<IntentRequest>): boolean {
|
|
70
|
-
const expected = intentReceipt(request, receipt.decision);
|
|
71
|
-
if (receipt.application === "applied") {
|
|
72
|
-
expected.application = "applied"; expected.resultSelection = JSON.parse(intentKey(request.selection));
|
|
73
|
-
expected.outcome = request.action === "reprioritize" ? "priority-applied" : "selection-applied";
|
|
74
|
-
}
|
|
75
|
-
return intentKey(receipt) === intentKey(expected);
|
|
76
|
-
}
|
|
77
|
-
export function intentDecision(state: IntentState, request: Pick<IntentRequest, "expectedRevision" | "expectedSelection">, authorized: boolean, dispatchBusy: boolean): IntentReceipt["decision"] {
|
|
78
|
-
if (!authorized) return "authority-unavailable";
|
|
79
|
-
if (request.expectedRevision !== state.revision || intentKey(request.expectedSelection) !== intentKey(state.selection)) return "stale";
|
|
80
|
-
if (dispatchBusy || state.records.some(r => r.application === "pending-or-unknown")) return "busy";
|
|
81
|
-
return "approved";
|
|
82
|
-
}
|
|
83
|
-
export function replayIntent(state: IntentState, event: Record<string, unknown>, active: number, dispatchBusy: boolean): void {
|
|
84
|
-
if (event.type === "intent-request") {
|
|
85
|
-
controlShape(event, ["type", "receipt"]);
|
|
86
|
-
const r = event.receipt as IntentReceipt;
|
|
87
|
-
controlShape(r, ["requestId", "digest", "expectedRevision", "expectedSelection", "action", "selection", "priorities", "events", "decision", "application", "outcome", "resultSelection"]);
|
|
88
|
-
intentSelection(r.expectedSelection); intentSelection(r.selection); intentPriorities(r.priorities);
|
|
89
|
-
if (!id(r.requestId) || !hex(r.digest) || !Number.isSafeInteger(r.expectedRevision) || r.expectedRevision < 0 || !["revise-scope", "reprioritize", "select-alternative", "revise-selection"].includes(r.action) ||
|
|
90
|
-
!Array.isArray(r.events) || r.events.length > 16 || state.records.length >= 32 || state.records.some(p => p.requestId === r.requestId) ||
|
|
91
|
-
intentDecision(state, r, r.decision !== "authority-unavailable", dispatchBusy) !== r.decision || r.application !== (r.decision === "approved" ? "pending-or-unknown" : "not-applied") ||
|
|
92
|
-
r.outcome !== (r.decision === "approved" ? "pending-or-unknown" : "refused") || r.resultSelection !== null) throw new Error("invalid intent decision sequence");
|
|
93
|
-
for (const ref of r.events) { controlShape(ref, ["eventId", "digest"]); if (!id(ref.eventId) || !hex(ref.digest)) throw new Error("invalid event reference"); }
|
|
94
|
-
state.records.push(r); if (r.decision === "approved") state.revision++;
|
|
95
|
-
} else {
|
|
96
|
-
controlShape(event, ["type", "requestId"]);
|
|
97
|
-
const r = state.records.find(r => r.requestId === event.requestId);
|
|
98
|
-
if (event.type !== "intent-apply" || !r || r.application !== "pending-or-unknown" || active || dispatchBusy) throw new Error("invalid intent application boundary");
|
|
99
|
-
state.selection = r.selection; state.priorities = r.priorities; r.application = "applied";
|
|
100
|
-
r.outcome = r.action === "reprioritize" ? "priority-applied" : "selection-applied"; r.resultSelection = r.selection;
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
export function intentSnapshot(state: IntentState, bindingDigest: string): IntentSnapshot {
|
|
104
|
-
return freezeWork({ version: "intent-controller-snapshot-v1", bindingDigest, ...state,
|
|
105
|
-
admission: state.records.some(r => r.application === "pending-or-unknown") ? "blocked-pending" : "intent-ready",
|
|
106
|
-
acceptance: "not-assessed", freshness: "snapshot-unknown" });
|
|
107
|
-
}
|