@openrig/cli 0.5.4 → 0.5.6
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/daemon/assets/continuity/apprentice-cutover.md +19 -0
- package/daemon/assets/continuity/apprentice-prepare.md +17 -0
- package/daemon/assets/guidance/openrig-start.md +7 -0
- package/daemon/assets/onboarding/01-world-and-purpose.md +52 -0
- package/daemon/assets/onboarding/02-self-and-competent-action.md +57 -0
- package/daemon/assets/plugins/openrig-core/README.md +5 -2
- package/daemon/assets/plugins/openrig-core/hooks/claude.json +3 -12
- package/daemon/assets/plugins/openrig-core/hooks/codex.json +5 -12
- package/daemon/assets/plugins/openrig-core/hooks/scripts/refocus.cjs +271 -124
- package/daemon/assets/plugins/openrig-core/skills/applying-a-permission-policy/SKILL.md +3 -3
- package/daemon/assets/plugins/openrig-core/skills/claude-compaction-restore/scripts/precompact-hook.mjs +0 -0
- package/daemon/assets/plugins/openrig-core/skills/claude-compaction-restore/scripts/restore-from-jsonl.mjs +0 -0
- package/daemon/assets/plugins/openrig-core/skills/forming-an-openrig-mental-model/SKILL.md +4 -9
- package/daemon/assets/plugins/openrig-core/skills/messaging-the-human/SKILL.md +82 -118
- package/daemon/assets/plugins/openrig-core/skills/mission-slice-sop/SKILL.md +20 -26
- package/daemon/assets/plugins/openrig-core/skills/openrig-operating-model/SKILL.md +397 -0
- package/daemon/assets/plugins/openrig-core/skills/openrig-operating-model/scripts/compose.py +572 -0
- package/daemon/assets/plugins/openrig-core/skills/openrig-operating-model/scripts/scaffold.sh +34 -0
- package/daemon/assets/plugins/openrig-core/skills/openrig-operating-model/scripts/trace-due.sh +32 -0
- package/daemon/assets/plugins/openrig-core/skills/openrig-operating-model/scripts/trace-stamp.sh +5 -0
- package/daemon/assets/plugins/openrig-core/skills/openrig-operating-model/scripts/trunk-diff.sh +18 -0
- package/daemon/assets/plugins/openrig-core/skills/openrig-operating-model/templates/LEARNED.md +40 -0
- package/daemon/assets/plugins/openrig-core/skills/openrig-operating-model/templates/NOTES.md +9 -0
- package/daemon/assets/plugins/openrig-core/skills/openrig-operating-model/templates/PLAYBOOK.md +5 -0
- package/daemon/assets/plugins/openrig-core/skills/openrig-operating-model/templates/SOP.md +24 -0
- package/daemon/assets/plugins/openrig-core/skills/openrig-operating-model/templates/SPEC.md +54 -0
- package/daemon/assets/plugins/openrig-core/skills/openrig-skills/SKILL.md +11 -6
- package/daemon/assets/plugins/openrig-core/skills/openrig-user/SKILL.md +1 -12
- package/daemon/assets/plugins/openrig-core/skills/orienting-to-an-inherited-seat/CHANGELOG.md +1 -1
- package/daemon/assets/plugins/openrig-core/skills/orienting-to-an-inherited-seat/SKILL.md +15 -0
- package/daemon/assets/plugins/openrig-core/skills/queue-handoff/SKILL.md +4 -16
- package/daemon/assets/plugins/openrig-core/skills/refocusing/SKILL.md +31 -0
- package/daemon/assets/plugins/openrig-core/skills/refocusing/references/refocus.md +22 -0
- package/daemon/assets/plugins/openrig-core/skills/refocusing/scripts/trace-to-root.py +264 -0
- package/daemon/assets/plugins/openrig-core/skills/retiring-and-inheriting-a-seat/SKILL.md +26 -6
- package/daemon/assets/plugins/openrig-core/skills/seat-continuity-and-handover/SKILL.md +3 -0
- package/daemon/assets/plugins/openrig-core/skills/seat-continuity-and-handover/references/apprentice-evidence-toolkit.md +32 -0
- package/daemon/assets/plugins/openrig-core/skills/seat-continuity-and-handover/references/apprentice-successor-seat-cutover.md +256 -0
- package/daemon/assets/plugins/openrig-core/skills/seat-continuity-and-handover/references/orchestrator-role.md +40 -0
- package/daemon/assets/plugins/openrig-core/skills/software-for-agents/SKILL.md +9 -4
- package/daemon/assets/vm-preview-fixtures/README.md +16 -38
- package/daemon/assets/vm-preview-fixtures/workflows/sample-basic-loop.yaml +4 -5
- package/daemon/context-packs/onboarding-width/manifest.yaml +14 -0
- package/daemon/context-packs/{world/install/reference-material.md → onboarding-width/public-reference-material.md} +5 -27
- package/daemon/context-packs/{world/install/what-you-can-do.md → onboarding-width/public-what-you-can-do.md} +13 -9
- package/daemon/context-packs/skills/core/agent-starters/manifest.yaml +2 -1
- package/daemon/context-packs/skills/core/agent-startup-and-context-ingestion/manifest.yaml +2 -1
- package/daemon/context-packs/skills/core/cross-host-rig-commands/SKILL.md +6 -13
- package/daemon/context-packs/skills/core/cross-host-rig-commands/manifest.yaml +2 -1
- package/daemon/context-packs/skills/core/human-in-the-loop/manifest.yaml +2 -1
- package/daemon/context-packs/skills/core/messaging-the-human/SKILL.md +98 -0
- package/daemon/context-packs/skills/core/messaging-the-human/manifest.yaml +10 -0
- package/daemon/context-packs/skills/core/openrig-architect/manifest.yaml +2 -1
- package/daemon/context-packs/skills/core/openrig-cmux/manifest.yaml +2 -1
- package/daemon/context-packs/skills/core/openrig-herdr/manifest.yaml +2 -1
- package/daemon/context-packs/skills/core/openrig-skills/SKILL.md +118 -0
- package/daemon/context-packs/skills/core/openrig-skills/manifest.yaml +10 -0
- package/daemon/context-packs/skills/core/openrig-upgrade/SKILL.md +19 -75
- package/daemon/context-packs/skills/core/openrig-upgrade/manifest.yaml +2 -1
- package/daemon/context-packs/skills/core/rig-bundles-and-shareable-artifacts/manifest.yaml +2 -1
- package/daemon/context-packs/skills/core/rig-lifecycle/manifest.yaml +2 -1
- package/daemon/context-packs/skills/core/session-source-fork/manifest.yaml +2 -1
- package/daemon/context-packs/skills/core/specification-system/manifest.yaml +2 -1
- package/daemon/context-packs/skills/core/topology-mutation-and-seat-management/manifest.yaml +2 -1
- package/daemon/context-packs/skills/core/watchdog/SKILL.md +4 -10
- package/daemon/context-packs/skills/core/watchdog/manifest.yaml +2 -1
- package/daemon/context-packs/skills/pm/backlog-capture/manifest.yaml +2 -1
- package/daemon/context-packs/skills/pm/context-builder/manifest.yaml +2 -1
- package/daemon/context-packs/skills/pm/exec-summary/manifest.yaml +2 -1
- package/daemon/context-packs/skills/pm/office-hours/manifest.yaml +2 -1
- package/daemon/context-packs/skills/pm/plan-review/manifest.yaml +2 -1
- package/daemon/context-packs/skills/pm/requirements-writer/manifest.yaml +2 -1
- package/daemon/context-packs/skills/pm/ui-mockup/manifest.yaml +2 -1
- package/daemon/context-packs/skills/pods/development-team/manifest.yaml +2 -1
- package/daemon/context-packs/skills/pods/orchestration-team/manifest.yaml +2 -1
- package/daemon/context-packs/skills/pods/oversight-team/manifest.yaml +2 -1
- package/daemon/context-packs/skills/pods/review-team/manifest.yaml +2 -1
- package/daemon/context-packs/skills/process/agent-browser/manifest.yaml +2 -1
- package/daemon/context-packs/skills/process/brainstorming/manifest.yaml +2 -1
- package/daemon/context-packs/skills/process/context-engineering/manifest.yaml +2 -1
- package/daemon/context-packs/skills/process/dogfood/manifest.yaml +2 -1
- package/daemon/context-packs/skills/process/executing-plans/manifest.yaml +2 -1
- package/daemon/context-packs/skills/process/frontend-design/manifest.yaml +2 -1
- package/daemon/context-packs/skills/process/systematic-debugging/find-polluter.sh +0 -0
- package/daemon/context-packs/skills/process/systematic-debugging/manifest.yaml +2 -1
- package/daemon/context-packs/skills/process/test-driven-development/manifest.yaml +2 -1
- package/daemon/context-packs/skills/process/using-superpowers/manifest.yaml +2 -1
- package/daemon/context-packs/skills/process/verification-before-completion/manifest.yaml +2 -1
- package/daemon/context-packs/skills/process/writing-plans/manifest.yaml +2 -1
- package/daemon/context-packs/world-example/manifest.yaml +21 -0
- package/daemon/context-packs/world-example/your-world.md +54 -0
- package/daemon/context-packs/world-public/boundaries.md +33 -0
- package/daemon/context-packs/world-public/build-your-world.md +84 -0
- package/daemon/context-packs/world-public/claims.yaml +205 -0
- package/daemon/context-packs/world-public/manifest.yaml +59 -0
- package/daemon/context-packs/world-public/start-here.md +51 -0
- package/daemon/context-packs/world-public/verify-world.sh +522 -0
- package/daemon/dist/adapters/claude-code-adapter.d.ts +15 -0
- package/daemon/dist/adapters/claude-code-adapter.d.ts.map +1 -1
- package/daemon/dist/adapters/claude-code-adapter.js +57 -0
- package/daemon/dist/adapters/claude-code-adapter.js.map +1 -1
- package/daemon/dist/build-info.js +3 -3
- package/daemon/dist/context-pack-taxonomy-surface.d.ts +2 -0
- package/daemon/dist/context-pack-taxonomy-surface.d.ts.map +1 -0
- package/daemon/dist/context-pack-taxonomy-surface.js +6 -0
- package/daemon/dist/context-pack-taxonomy-surface.js.map +1 -0
- package/daemon/dist/db/all-migrations.d.ts +1 -1
- package/daemon/dist/db/all-migrations.d.ts.map +1 -1
- package/daemon/dist/db/all-migrations.js +12 -2
- package/daemon/dist/db/all-migrations.js.map +1 -1
- package/daemon/dist/db/migrations/072_thread_seat_map.d.ts +3 -0
- package/daemon/dist/db/migrations/072_thread_seat_map.d.ts.map +1 -0
- package/daemon/dist/db/migrations/072_thread_seat_map.js +22 -0
- package/daemon/dist/db/migrations/072_thread_seat_map.js.map +1 -0
- package/daemon/dist/db/migrations/073_queue_transition_wakes.d.ts +3 -0
- package/daemon/dist/db/migrations/073_queue_transition_wakes.d.ts.map +1 -0
- package/daemon/dist/db/migrations/073_queue_transition_wakes.js +21 -0
- package/daemon/dist/db/migrations/073_queue_transition_wakes.js.map +1 -0
- package/daemon/dist/db/migrations/074_context_usage_watchdog.d.ts +4 -0
- package/daemon/dist/db/migrations/074_context_usage_watchdog.d.ts.map +1 -0
- package/daemon/dist/db/migrations/074_context_usage_watchdog.js +11 -0
- package/daemon/dist/db/migrations/074_context_usage_watchdog.js.map +1 -0
- package/daemon/dist/db/migrations/075_context_usage_watchdog_generation.d.ts +4 -0
- package/daemon/dist/db/migrations/075_context_usage_watchdog_generation.d.ts.map +1 -0
- package/daemon/dist/db/migrations/075_context_usage_watchdog_generation.js +8 -0
- package/daemon/dist/db/migrations/075_context_usage_watchdog_generation.js.map +1 -0
- package/daemon/dist/db/migrations/076_owner_notification_levels.d.ts +8 -0
- package/daemon/dist/db/migrations/076_owner_notification_levels.d.ts.map +1 -0
- package/daemon/dist/db/migrations/076_owner_notification_levels.js +15 -0
- package/daemon/dist/db/migrations/076_owner_notification_levels.js.map +1 -0
- package/daemon/dist/domain/active-occupant.d.ts +44 -0
- package/daemon/dist/domain/active-occupant.d.ts.map +1 -0
- package/daemon/dist/domain/active-occupant.js +72 -0
- package/daemon/dist/domain/active-occupant.js.map +1 -0
- package/daemon/dist/domain/activity-taxonomy.d.ts +112 -0
- package/daemon/dist/domain/activity-taxonomy.d.ts.map +1 -0
- package/daemon/dist/domain/activity-taxonomy.js +99 -0
- package/daemon/dist/domain/activity-taxonomy.js.map +1 -0
- package/daemon/dist/domain/agent-manifest.d.ts +6 -0
- package/daemon/dist/domain/agent-manifest.d.ts.map +1 -1
- package/daemon/dist/domain/agent-manifest.js +77 -15
- package/daemon/dist/domain/agent-manifest.js.map +1 -1
- package/daemon/dist/domain/agent-resolver.d.ts +11 -0
- package/daemon/dist/domain/agent-resolver.d.ts.map +1 -1
- package/daemon/dist/domain/agent-resolver.js +55 -0
- package/daemon/dist/domain/agent-resolver.js.map +1 -1
- package/daemon/dist/domain/bind-plan.d.ts +19 -0
- package/daemon/dist/domain/bind-plan.d.ts.map +1 -0
- package/daemon/dist/domain/bind-plan.js +25 -0
- package/daemon/dist/domain/bind-plan.js.map +1 -0
- package/daemon/dist/domain/bundle-context-packs-router.d.ts +9 -2
- package/daemon/dist/domain/bundle-context-packs-router.d.ts.map +1 -1
- package/daemon/dist/domain/bundle-context-packs-router.js +18 -0
- package/daemon/dist/domain/bundle-context-packs-router.js.map +1 -1
- package/daemon/dist/domain/claude-compaction-enforcer.d.ts +7 -0
- package/daemon/dist/domain/claude-compaction-enforcer.d.ts.map +1 -1
- package/daemon/dist/domain/claude-compaction-enforcer.js +10 -0
- package/daemon/dist/domain/claude-compaction-enforcer.js.map +1 -1
- package/daemon/dist/domain/context-packs/context-pack-library-service.d.ts.map +1 -1
- package/daemon/dist/domain/context-packs/context-pack-library-service.js +7 -0
- package/daemon/dist/domain/context-packs/context-pack-library-service.js.map +1 -1
- package/daemon/dist/domain/context-packs/context-pack-types.d.ts +11 -0
- package/daemon/dist/domain/context-packs/context-pack-types.d.ts.map +1 -1
- package/daemon/dist/domain/context-packs/context-pack-types.js +11 -0
- package/daemon/dist/domain/context-packs/context-pack-types.js.map +1 -1
- package/daemon/dist/domain/context-packs/manifest-parser.d.ts.map +1 -1
- package/daemon/dist/domain/context-packs/manifest-parser.js +13 -1
- package/daemon/dist/domain/context-packs/manifest-parser.js.map +1 -1
- package/daemon/dist/domain/continuity-policy-materializer.d.ts +88 -0
- package/daemon/dist/domain/continuity-policy-materializer.d.ts.map +1 -0
- package/daemon/dist/domain/continuity-policy-materializer.js +290 -0
- package/daemon/dist/domain/continuity-policy-materializer.js.map +1 -0
- package/daemon/dist/domain/continuity-stack-packets.d.ts +65 -0
- package/daemon/dist/domain/continuity-stack-packets.d.ts.map +1 -0
- package/daemon/dist/domain/continuity-stack-packets.js +99 -0
- package/daemon/dist/domain/continuity-stack-packets.js.map +1 -0
- package/daemon/dist/domain/event-bus.d.ts +6 -0
- package/daemon/dist/domain/event-bus.d.ts.map +1 -1
- package/daemon/dist/domain/event-bus.js +15 -5
- package/daemon/dist/domain/event-bus.js.map +1 -1
- package/daemon/dist/domain/execution-view.d.ts +39 -0
- package/daemon/dist/domain/execution-view.d.ts.map +1 -0
- package/daemon/dist/domain/execution-view.js +707 -0
- package/daemon/dist/domain/execution-view.js.map +1 -0
- package/daemon/dist/domain/gateway/delivery-rules-engine.d.ts +60 -0
- package/daemon/dist/domain/gateway/delivery-rules-engine.d.ts.map +1 -0
- package/daemon/dist/domain/gateway/delivery-rules-engine.js +144 -0
- package/daemon/dist/domain/gateway/delivery-rules-engine.js.map +1 -0
- package/daemon/dist/domain/gateway/destination-resolver.d.ts +20 -0
- package/daemon/dist/domain/gateway/destination-resolver.d.ts.map +1 -0
- package/daemon/dist/domain/gateway/destination-resolver.js +52 -0
- package/daemon/dist/domain/gateway/destination-resolver.js.map +1 -0
- package/daemon/dist/domain/gateway/dispatcher.d.ts +3 -1
- package/daemon/dist/domain/gateway/dispatcher.d.ts.map +1 -1
- package/daemon/dist/domain/gateway/dispatcher.js +9 -2
- package/daemon/dist/domain/gateway/dispatcher.js.map +1 -1
- package/daemon/dist/domain/gateway/gateway-process-main.d.ts.map +1 -1
- package/daemon/dist/domain/gateway/gateway-process-main.js +9 -0
- package/daemon/dist/domain/gateway/gateway-process-main.js.map +1 -1
- package/daemon/dist/domain/gateway/gateway-process.d.ts.map +1 -1
- package/daemon/dist/domain/gateway/gateway-process.js +9 -0
- package/daemon/dist/domain/gateway/gateway-process.js.map +1 -1
- package/daemon/dist/domain/gateway/gateway-subsystem.d.ts +84 -0
- package/daemon/dist/domain/gateway/gateway-subsystem.d.ts.map +1 -0
- package/daemon/dist/domain/gateway/gateway-subsystem.js +151 -0
- package/daemon/dist/domain/gateway/gateway-subsystem.js.map +1 -0
- package/daemon/dist/domain/gateway/human-registry.d.ts +118 -1
- package/daemon/dist/domain/gateway/human-registry.d.ts.map +1 -1
- package/daemon/dist/domain/gateway/human-registry.js +282 -1
- package/daemon/dist/domain/gateway/human-registry.js.map +1 -1
- package/daemon/dist/domain/gateway/operator-delivery-engine.d.ts +32 -0
- package/daemon/dist/domain/gateway/operator-delivery-engine.d.ts.map +1 -0
- package/daemon/dist/domain/gateway/operator-delivery-engine.js +86 -0
- package/daemon/dist/domain/gateway/operator-delivery-engine.js.map +1 -0
- package/{dist → daemon/dist/domain/gateway}/slack/config.d.ts +11 -7
- package/daemon/dist/domain/gateway/slack/config.d.ts.map +1 -0
- package/{dist → daemon/dist/domain/gateway}/slack/config.js +28 -10
- package/daemon/dist/domain/gateway/slack/config.js.map +1 -0
- package/{dist → daemon/dist/domain/gateway}/slack/inbound-admission.d.ts +1 -1
- package/daemon/dist/domain/gateway/slack/inbound-admission.d.ts.map +1 -0
- package/daemon/dist/domain/gateway/slack/inbound-admission.js.map +1 -0
- package/{dist → daemon/dist/domain/gateway}/slack/inbound.d.ts +48 -9
- package/daemon/dist/domain/gateway/slack/inbound.d.ts.map +1 -0
- package/{dist → daemon/dist/domain/gateway}/slack/inbound.js +66 -14
- package/daemon/dist/domain/gateway/slack/inbound.js.map +1 -0
- package/daemon/dist/domain/gateway/slack/message.d.ts +80 -0
- package/daemon/dist/domain/gateway/slack/message.d.ts.map +1 -0
- package/daemon/dist/domain/gateway/slack/message.js +164 -0
- package/daemon/dist/domain/gateway/slack/message.js.map +1 -0
- package/daemon/dist/domain/gateway/slack/outbound-driver.d.ts +57 -0
- package/daemon/dist/domain/gateway/slack/outbound-driver.d.ts.map +1 -0
- package/daemon/dist/domain/gateway/slack/outbound-driver.js +103 -0
- package/daemon/dist/domain/gateway/slack/outbound-driver.js.map +1 -0
- package/daemon/dist/domain/gateway/slack/queue-access.d.ts +58 -0
- package/daemon/dist/domain/gateway/slack/queue-access.d.ts.map +1 -0
- package/daemon/dist/domain/gateway/slack/queue-access.js +99 -0
- package/daemon/dist/domain/gateway/slack/queue-access.js.map +1 -0
- package/daemon/dist/domain/gateway/slack/secrets.d.ts.map +1 -0
- package/daemon/dist/domain/gateway/slack/secrets.js.map +1 -0
- package/daemon/dist/domain/gateway/slack/slack-api.d.ts +129 -0
- package/daemon/dist/domain/gateway/slack/slack-api.d.ts.map +1 -0
- package/daemon/dist/domain/gateway/slack/slack-api.js +236 -0
- package/daemon/dist/domain/gateway/slack/slack-api.js.map +1 -0
- package/daemon/dist/domain/gateway/slack/slack-delivery.d.ts +53 -0
- package/daemon/dist/domain/gateway/slack/slack-delivery.d.ts.map +1 -0
- package/daemon/dist/domain/gateway/slack/slack-delivery.js +267 -0
- package/daemon/dist/domain/gateway/slack/slack-delivery.js.map +1 -0
- package/daemon/dist/domain/gateway/slack/slack-subsystem.d.ts +31 -0
- package/daemon/dist/domain/gateway/slack/slack-subsystem.d.ts.map +1 -0
- package/daemon/dist/domain/gateway/slack/slack-subsystem.js +473 -0
- package/daemon/dist/domain/gateway/slack/slack-subsystem.js.map +1 -0
- package/daemon/dist/domain/gateway/slack/socket-inbound.d.ts +30 -0
- package/daemon/dist/domain/gateway/slack/socket-inbound.d.ts.map +1 -0
- package/daemon/dist/domain/gateway/slack/socket-inbound.js +99 -0
- package/daemon/dist/domain/gateway/slack/socket-inbound.js.map +1 -0
- package/daemon/dist/domain/gateway/slack/state-store.d.ts.map +1 -0
- package/daemon/dist/domain/gateway/slack/state-store.js.map +1 -0
- package/daemon/dist/domain/gateway/slack/thread-routing.d.ts +17 -0
- package/daemon/dist/domain/gateway/slack/thread-routing.d.ts.map +1 -0
- package/daemon/dist/domain/gateway/slack/thread-routing.js +35 -0
- package/daemon/dist/domain/gateway/slack/thread-routing.js.map +1 -0
- package/daemon/dist/domain/gateway/slack/thread-seat-map.d.ts +56 -0
- package/daemon/dist/domain/gateway/slack/thread-seat-map.d.ts.map +1 -0
- package/daemon/dist/domain/gateway/slack/thread-seat-map.js +103 -0
- package/daemon/dist/domain/gateway/slack/thread-seat-map.js.map +1 -0
- package/daemon/dist/domain/gateway/spawn-gateway.d.ts.map +1 -1
- package/daemon/dist/domain/gateway/spawn-gateway.js +9 -0
- package/daemon/dist/domain/gateway/spawn-gateway.js.map +1 -1
- package/daemon/dist/domain/gateway/transport.d.ts.map +1 -1
- package/daemon/dist/domain/gateway/transport.js +9 -0
- package/daemon/dist/domain/gateway/transport.js.map +1 -1
- package/daemon/dist/domain/graph-projection.d.ts +6 -0
- package/daemon/dist/domain/graph-projection.d.ts.map +1 -1
- package/daemon/dist/domain/graph-projection.js +6 -0
- package/daemon/dist/domain/graph-projection.js.map +1 -1
- package/daemon/dist/domain/mission-control/mission-control-write-contract.d.ts.map +1 -1
- package/daemon/dist/domain/mission-control/mission-control-write-contract.js +1 -0
- package/daemon/dist/domain/mission-control/mission-control-write-contract.js.map +1 -1
- package/daemon/dist/domain/node-inventory.d.ts +41 -3
- package/daemon/dist/domain/node-inventory.d.ts.map +1 -1
- package/daemon/dist/domain/node-inventory.js +65 -48
- package/daemon/dist/domain/node-inventory.js.map +1 -1
- package/daemon/dist/domain/parked-query.d.ts +82 -0
- package/daemon/dist/domain/parked-query.d.ts.map +1 -0
- package/daemon/dist/domain/parked-query.js +127 -0
- package/daemon/dist/domain/parked-query.js.map +1 -0
- package/daemon/dist/domain/pod-bundle-assembler.d.ts.map +1 -1
- package/daemon/dist/domain/pod-bundle-assembler.js +12 -5
- package/daemon/dist/domain/pod-bundle-assembler.js.map +1 -1
- package/daemon/dist/domain/policies/context-usage-threshold.d.ts +7 -0
- package/daemon/dist/domain/policies/context-usage-threshold.d.ts.map +1 -0
- package/daemon/dist/domain/policies/context-usage-threshold.js +99 -0
- package/daemon/dist/domain/policies/context-usage-threshold.js.map +1 -0
- package/daemon/dist/domain/policies/delivery-deferral.d.ts +54 -0
- package/daemon/dist/domain/policies/delivery-deferral.d.ts.map +1 -0
- package/daemon/dist/domain/policies/delivery-deferral.js +153 -0
- package/daemon/dist/domain/policies/delivery-deferral.js.map +1 -0
- package/daemon/dist/domain/policies/delivery-digest-flush.d.ts +45 -0
- package/daemon/dist/domain/policies/delivery-digest-flush.d.ts.map +1 -0
- package/daemon/dist/domain/policies/delivery-digest-flush.js +94 -0
- package/daemon/dist/domain/policies/delivery-digest-flush.js.map +1 -0
- package/daemon/dist/domain/policies/parked-owner-consumer.d.ts +65 -0
- package/daemon/dist/domain/policies/parked-owner-consumer.d.ts.map +1 -0
- package/daemon/dist/domain/policies/parked-owner-consumer.js +244 -0
- package/daemon/dist/domain/policies/parked-owner-consumer.js.map +1 -0
- package/daemon/dist/domain/policies/types.d.ts +8 -0
- package/daemon/dist/domain/policies/types.d.ts.map +1 -1
- package/daemon/dist/domain/profile-resolver.d.ts +4 -0
- package/daemon/dist/domain/profile-resolver.d.ts.map +1 -1
- package/daemon/dist/domain/profile-resolver.js +58 -0
- package/daemon/dist/domain/profile-resolver.js.map +1 -1
- package/daemon/dist/domain/provider/provider-signals.d.ts +20 -1
- package/daemon/dist/domain/provider/provider-signals.d.ts.map +1 -1
- package/daemon/dist/domain/provider/provider-signals.js +64 -0
- package/daemon/dist/domain/provider/provider-signals.js.map +1 -1
- package/daemon/dist/domain/ps-projection.d.ts +7 -5
- package/daemon/dist/domain/ps-projection.d.ts.map +1 -1
- package/daemon/dist/domain/ps-projection.js +19 -32
- package/daemon/dist/domain/ps-projection.js.map +1 -1
- package/daemon/dist/domain/queue-pickup.d.ts +38 -0
- package/daemon/dist/domain/queue-pickup.d.ts.map +1 -0
- package/daemon/dist/domain/queue-pickup.js +72 -0
- package/daemon/dist/domain/queue-pickup.js.map +1 -0
- package/daemon/dist/domain/queue-repository.d.ts +93 -28
- package/daemon/dist/domain/queue-repository.d.ts.map +1 -1
- package/daemon/dist/domain/queue-repository.js +626 -90
- package/daemon/dist/domain/queue-repository.js.map +1 -1
- package/daemon/dist/domain/queue-retention.d.ts.map +1 -1
- package/daemon/dist/domain/queue-retention.js +8 -2
- package/daemon/dist/domain/queue-retention.js.map +1 -1
- package/daemon/dist/domain/queue-stuck-sweep.d.ts +100 -0
- package/daemon/dist/domain/queue-stuck-sweep.d.ts.map +1 -0
- package/daemon/dist/domain/queue-stuck-sweep.js +485 -0
- package/daemon/dist/domain/queue-stuck-sweep.js.map +1 -0
- package/daemon/dist/domain/queue-transition-log.d.ts +10 -0
- package/daemon/dist/domain/queue-transition-log.d.ts.map +1 -1
- package/daemon/dist/domain/queue-transition-log.js +49 -11
- package/daemon/dist/domain/queue-transition-log.js.map +1 -1
- package/daemon/dist/domain/queue-wake-ladder.d.ts +114 -0
- package/daemon/dist/domain/queue-wake-ladder.d.ts.map +1 -0
- package/daemon/dist/domain/queue-wake-ladder.js +705 -0
- package/daemon/dist/domain/queue-wake-ladder.js.map +1 -0
- package/daemon/dist/domain/queue-wake-repository.d.ts +53 -0
- package/daemon/dist/domain/queue-wake-repository.d.ts.map +1 -0
- package/daemon/dist/domain/queue-wake-repository.js +129 -0
- package/daemon/dist/domain/queue-wake-repository.js.map +1 -0
- package/daemon/dist/domain/rebuild-priming-chain.d.ts +28 -0
- package/daemon/dist/domain/rebuild-priming-chain.d.ts.map +1 -0
- package/daemon/dist/domain/rebuild-priming-chain.js +71 -0
- package/daemon/dist/domain/rebuild-priming-chain.js.map +1 -0
- package/daemon/dist/domain/restore-check-service.js +1 -1
- package/daemon/dist/domain/restore-check-service.js.map +1 -1
- package/daemon/dist/domain/restore-orchestrator.d.ts +2 -1
- package/daemon/dist/domain/restore-orchestrator.d.ts.map +1 -1
- package/daemon/dist/domain/restore-orchestrator.js +88 -15
- package/daemon/dist/domain/restore-orchestrator.js.map +1 -1
- package/daemon/dist/domain/restore-plan-preview.d.ts +6 -2
- package/daemon/dist/domain/restore-plan-preview.d.ts.map +1 -1
- package/daemon/dist/domain/restore-plan-preview.js +37 -19
- package/daemon/dist/domain/restore-plan-preview.js.map +1 -1
- package/daemon/dist/domain/review/compose.d.ts +3 -1
- package/daemon/dist/domain/review/compose.d.ts.map +1 -1
- package/daemon/dist/domain/review/compose.js +14 -8
- package/daemon/dist/domain/review/compose.js.map +1 -1
- package/daemon/dist/domain/review/gather.d.ts.map +1 -1
- package/daemon/dist/domain/review/gather.js +3 -1
- package/daemon/dist/domain/review/gather.js.map +1 -1
- package/daemon/dist/domain/rig-expansion-service.d.ts.map +1 -1
- package/daemon/dist/domain/rig-expansion-service.js +10 -9
- package/daemon/dist/domain/rig-expansion-service.js.map +1 -1
- package/daemon/dist/domain/rig-repository.d.ts +4 -0
- package/daemon/dist/domain/rig-repository.d.ts.map +1 -1
- package/daemon/dist/domain/rig-repository.js +21 -3
- package/daemon/dist/domain/rig-repository.js.map +1 -1
- package/daemon/dist/domain/rigspec-codec.d.ts.map +1 -1
- package/daemon/dist/domain/rigspec-codec.js +74 -4
- package/daemon/dist/domain/rigspec-codec.js.map +1 -1
- package/daemon/dist/domain/rigspec-instantiator.d.ts +7 -0
- package/daemon/dist/domain/rigspec-instantiator.d.ts.map +1 -1
- package/daemon/dist/domain/rigspec-instantiator.js +32 -0
- package/daemon/dist/domain/rigspec-instantiator.js.map +1 -1
- package/daemon/dist/domain/rigspec-schema.d.ts.map +1 -1
- package/daemon/dist/domain/rigspec-schema.js +32 -4
- package/daemon/dist/domain/rigspec-schema.js.map +1 -1
- package/daemon/dist/domain/scope/node-file.d.ts +8 -0
- package/daemon/dist/domain/scope/node-file.d.ts.map +1 -1
- package/daemon/dist/domain/scope/node-file.js +18 -0
- package/daemon/dist/domain/scope/node-file.js.map +1 -1
- package/daemon/dist/domain/scope/plan-lock-artifacts.d.ts +6 -5
- package/daemon/dist/domain/scope/plan-lock-artifacts.d.ts.map +1 -1
- package/daemon/dist/domain/scope/plan-lock-artifacts.js +23 -20
- package/daemon/dist/domain/scope/plan-lock-artifacts.js.map +1 -1
- package/daemon/dist/domain/scope/scaffold-placeholder.d.ts +4 -5
- package/daemon/dist/domain/scope/scaffold-placeholder.d.ts.map +1 -1
- package/daemon/dist/domain/scope/scaffold-placeholder.js +6 -7
- package/daemon/dist/domain/scope/scaffold-placeholder.js.map +1 -1
- package/daemon/dist/domain/scope/scope-approve.d.ts +1 -1
- package/daemon/dist/domain/scope/scope-approve.d.ts.map +1 -1
- package/daemon/dist/domain/scope/scope-approve.js +5 -4
- package/daemon/dist/domain/scope/scope-approve.js.map +1 -1
- package/daemon/dist/domain/scope/scope-audit.d.ts +46 -4
- package/daemon/dist/domain/scope/scope-audit.d.ts.map +1 -1
- package/daemon/dist/domain/scope/scope-audit.js +79 -94
- package/daemon/dist/domain/scope/scope-audit.js.map +1 -1
- package/daemon/dist/domain/scope/scope-view-projection.d.ts.map +1 -1
- package/daemon/dist/domain/scope/scope-view-projection.js +7 -2
- package/daemon/dist/domain/scope/scope-view-projection.js.map +1 -1
- package/daemon/dist/domain/seat-activity-service.d.ts +91 -0
- package/daemon/dist/domain/seat-activity-service.d.ts.map +1 -1
- package/daemon/dist/domain/seat-activity-service.js +416 -1
- package/daemon/dist/domain/seat-activity-service.js.map +1 -1
- package/daemon/dist/domain/seat-handover-planner.d.ts +14 -0
- package/daemon/dist/domain/seat-handover-planner.d.ts.map +1 -1
- package/daemon/dist/domain/seat-handover-planner.js +14 -1
- package/daemon/dist/domain/seat-handover-planner.js.map +1 -1
- package/daemon/dist/domain/seat-handover-service.d.ts +54 -1
- package/daemon/dist/domain/seat-handover-service.d.ts.map +1 -1
- package/daemon/dist/domain/seat-handover-service.js +162 -19
- package/daemon/dist/domain/seat-handover-service.js.map +1 -1
- package/daemon/dist/domain/session-transport.js +1 -2
- package/daemon/dist/domain/session-transport.js.map +1 -1
- package/daemon/dist/domain/snapshot-capture.d.ts.map +1 -1
- package/daemon/dist/domain/snapshot-capture.js +6 -0
- package/daemon/dist/domain/snapshot-capture.js.map +1 -1
- package/daemon/dist/domain/successor-session-launcher.d.ts +6 -1
- package/daemon/dist/domain/successor-session-launcher.d.ts.map +1 -1
- package/daemon/dist/domain/successor-session-launcher.js +3 -3
- package/daemon/dist/domain/successor-session-launcher.js.map +1 -1
- package/daemon/dist/domain/types.d.ts +59 -4
- package/daemon/dist/domain/types.d.ts.map +1 -1
- package/daemon/dist/domain/types.js.map +1 -1
- package/daemon/dist/domain/user-settings/settings-store.d.ts +1 -1
- package/daemon/dist/domain/user-settings/settings-store.d.ts.map +1 -1
- package/daemon/dist/domain/user-settings/settings-store.js +48 -0
- package/daemon/dist/domain/user-settings/settings-store.js.map +1 -1
- package/daemon/dist/domain/view-projector.d.ts +5 -1
- package/daemon/dist/domain/view-projector.d.ts.map +1 -1
- package/daemon/dist/domain/view-projector.js +65 -2
- package/daemon/dist/domain/view-projector.js.map +1 -1
- package/daemon/dist/domain/watchdog-jobs-repository.d.ts +25 -6
- package/daemon/dist/domain/watchdog-jobs-repository.d.ts.map +1 -1
- package/daemon/dist/domain/watchdog-jobs-repository.js +115 -32
- package/daemon/dist/domain/watchdog-jobs-repository.js.map +1 -1
- package/daemon/dist/domain/watchdog-policy-engine.d.ts +47 -1
- package/daemon/dist/domain/watchdog-policy-engine.d.ts.map +1 -1
- package/daemon/dist/domain/watchdog-policy-engine.js +115 -6
- package/daemon/dist/domain/watchdog-policy-engine.js.map +1 -1
- package/daemon/dist/domain/watchdog-scheduler.d.ts.map +1 -1
- package/daemon/dist/domain/watchdog-scheduler.js +3 -2
- package/daemon/dist/domain/watchdog-scheduler.js.map +1 -1
- package/daemon/dist/domain/workspace/default-workspace-scaffold.d.ts +4 -3
- package/daemon/dist/domain/workspace/default-workspace-scaffold.d.ts.map +1 -1
- package/daemon/dist/domain/workspace/default-workspace-scaffold.js +56 -196
- package/daemon/dist/domain/workspace/default-workspace-scaffold.js.map +1 -1
- package/daemon/dist/domain/workspace/getting-started-narrative.js +1 -1
- package/daemon/dist/domain/workspace/getting-started-narrative.js.map +1 -1
- package/daemon/dist/domain/workspace/workspace-doctor.d.ts +8 -11
- package/daemon/dist/domain/workspace/workspace-doctor.d.ts.map +1 -1
- package/daemon/dist/domain/workspace/workspace-doctor.js +22 -26
- package/daemon/dist/domain/workspace/workspace-doctor.js.map +1 -1
- package/daemon/dist/gateway-slack-surface.d.ts +4 -0
- package/daemon/dist/gateway-slack-surface.d.ts.map +1 -0
- package/daemon/dist/gateway-slack-surface.js +8 -0
- package/daemon/dist/gateway-slack-surface.js.map +1 -0
- package/daemon/dist/index.d.ts +38 -0
- package/daemon/dist/index.d.ts.map +1 -1
- package/daemon/dist/index.js +122 -4
- package/daemon/dist/index.js.map +1 -1
- package/daemon/dist/lib/pane-envelope.d.ts +1 -1
- package/daemon/dist/lib/pane-envelope.d.ts.map +1 -1
- package/daemon/dist/lib/pane-envelope.js +8 -14
- package/daemon/dist/lib/pane-envelope.js.map +1 -1
- package/daemon/dist/routes/activity.d.ts +13 -0
- package/daemon/dist/routes/activity.d.ts.map +1 -1
- package/daemon/dist/routes/activity.js +186 -0
- package/daemon/dist/routes/activity.js.map +1 -1
- package/daemon/dist/routes/agent-images.d.ts.map +1 -1
- package/daemon/dist/routes/agent-images.js +9 -0
- package/daemon/dist/routes/agent-images.js.map +1 -1
- package/daemon/dist/routes/bundles.d.ts.map +1 -1
- package/daemon/dist/routes/bundles.js +61 -1
- package/daemon/dist/routes/bundles.js.map +1 -1
- package/daemon/dist/routes/config.js +2 -2
- package/daemon/dist/routes/config.js.map +1 -1
- package/daemon/dist/routes/gateway.d.ts +3 -0
- package/daemon/dist/routes/gateway.d.ts.map +1 -0
- package/daemon/dist/routes/gateway.js +46 -0
- package/daemon/dist/routes/gateway.js.map +1 -0
- package/daemon/dist/routes/health-summary.d.ts.map +1 -1
- package/daemon/dist/routes/health-summary.js +8 -0
- package/daemon/dist/routes/health-summary.js.map +1 -1
- package/daemon/dist/routes/queue.d.ts.map +1 -1
- package/daemon/dist/routes/queue.js +25 -12
- package/daemon/dist/routes/queue.js.map +1 -1
- package/daemon/dist/routes/rigs.js +38 -2
- package/daemon/dist/routes/rigs.js.map +1 -1
- package/daemon/dist/routes/scope-audit.d.ts.map +1 -1
- package/daemon/dist/routes/scope-audit.js +73 -14
- package/daemon/dist/routes/scope-audit.js.map +1 -1
- package/daemon/dist/routes/seat.d.ts.map +1 -1
- package/daemon/dist/routes/seat.js +15 -0
- package/daemon/dist/routes/seat.js.map +1 -1
- package/daemon/dist/routes/views.d.ts.map +1 -1
- package/daemon/dist/routes/views.js +4 -1
- package/daemon/dist/routes/views.js.map +1 -1
- package/daemon/dist/routes/watchdog.d.ts.map +1 -1
- package/daemon/dist/routes/watchdog.js +40 -3
- package/daemon/dist/routes/watchdog.js.map +1 -1
- package/daemon/dist/server.d.ts +17 -0
- package/daemon/dist/server.d.ts.map +1 -1
- package/daemon/dist/server.js +30 -4
- package/daemon/dist/server.js.map +1 -1
- package/daemon/dist/startup.d.ts +4 -0
- package/daemon/dist/startup.d.ts.map +1 -1
- package/daemon/dist/startup.js +227 -5
- package/daemon/dist/startup.js.map +1 -1
- package/daemon/docs/reference/agent-spec.md +4 -4
- package/daemon/docs/reference/agent-state-taxonomy.md +101 -0
- package/daemon/docs/reference/chain-file-convention.md +2 -2
- package/daemon/docs/reference/knowledge-maturity.md +123 -0
- package/daemon/docs/reference/lore-routing.md +173 -0
- package/daemon/docs/reference/mission-install.md +194 -0
- package/daemon/docs/reference/planning-dial.md +55 -0
- package/daemon/docs/reference/product-management-pass.md +139 -0
- package/daemon/docs/reference/project-workspace.md +22 -14
- package/daemon/docs/reference/refocus-channel.md +27 -14
- package/daemon/docs/reference/release-boundary.md +88 -0
- package/daemon/docs/reference/sdlc-conventions.md +66 -82
- package/daemon/docs/reference/wave-sdlc.md +113 -0
- package/daemon/policies/builtin/standard.policy.md +3 -3
- package/daemon/policies/builtin/yolo.policy.md +7 -2
- package/daemon/specs/agents/shared/skills/core/cross-host-rig-commands/SKILL.md +6 -13
- package/daemon/specs/agents/shared/skills/core/messaging-the-human/SKILL.md +98 -0
- package/daemon/specs/agents/shared/skills/core/openrig-skills/SKILL.md +118 -0
- package/daemon/specs/agents/shared/skills/core/openrig-upgrade/SKILL.md +19 -75
- package/daemon/specs/agents/shared/skills/core/watchdog/SKILL.md +4 -10
- package/daemon/specs/agents/shared/skills/process/systematic-debugging/find-polluter.sh +0 -0
- package/daemon/specs/rigs/launch/kernel/agents/advisor/lead/guidance/role.md +3 -3
- package/daemon/specs/rigs/launch/kernel/agents/advisor/lead/startup/context.md +3 -3
- package/daemon/specs/rigs/launch/kernel/agents/operator/agent/guidance/role.md +3 -3
- package/daemon/specs/rigs/launch/kernel/agents/queue/worker/guidance/role.md +1 -1
- package/daemon/specs/rigs/launch/kernel/agents/queue/worker/startup/context.md +1 -1
- package/daemon/substance-surfaces.json +8 -0
- package/dist/build-info.js +3 -3
- package/dist/commands/broadcast.d.ts.map +1 -1
- package/dist/commands/broadcast.js +6 -1
- package/dist/commands/broadcast.js.map +1 -1
- package/dist/commands/capture.js +1 -1
- package/dist/commands/config-init-workspace.d.ts.map +1 -1
- package/dist/commands/config-init-workspace.js +32 -57
- package/dist/commands/config-init-workspace.js.map +1 -1
- package/dist/commands/config.d.ts.map +1 -1
- package/dist/commands/config.js +5 -0
- package/dist/commands/config.js.map +1 -1
- package/dist/commands/context.d.ts.map +1 -1
- package/dist/commands/context.js +12 -1
- package/dist/commands/context.js.map +1 -1
- package/dist/commands/daemon.d.ts.map +1 -1
- package/dist/commands/daemon.js +14 -4
- package/dist/commands/daemon.js.map +1 -1
- package/dist/commands/expand.d.ts.map +1 -1
- package/dist/commands/expand.js +9 -13
- package/dist/commands/expand.js.map +1 -1
- package/dist/commands/gateway.d.ts +19 -1
- package/dist/commands/gateway.d.ts.map +1 -1
- package/dist/commands/gateway.js +157 -33
- package/dist/commands/gateway.js.map +1 -1
- package/dist/commands/parked.d.ts +3 -0
- package/dist/commands/parked.d.ts.map +1 -0
- package/dist/commands/parked.js +83 -0
- package/dist/commands/parked.js.map +1 -0
- package/dist/commands/proof.d.ts +2 -1
- package/dist/commands/proof.d.ts.map +1 -1
- package/dist/commands/proof.js +8 -8
- package/dist/commands/proof.js.map +1 -1
- package/dist/commands/ps.d.ts +14 -0
- package/dist/commands/ps.d.ts.map +1 -1
- package/dist/commands/ps.js +27 -8
- package/dist/commands/ps.js.map +1 -1
- package/dist/commands/queue.d.ts.map +1 -1
- package/dist/commands/queue.js +31 -3
- package/dist/commands/queue.js.map +1 -1
- package/dist/commands/scope.d.ts.map +1 -1
- package/dist/commands/scope.js +284 -136
- package/dist/commands/scope.js.map +1 -1
- package/dist/commands/seat.d.ts.map +1 -1
- package/dist/commands/seat.js +40 -10
- package/dist/commands/seat.js.map +1 -1
- package/dist/commands/send.d.ts +3 -1
- package/dist/commands/send.d.ts.map +1 -1
- package/dist/commands/send.js +37 -16
- package/dist/commands/send.js.map +1 -1
- package/dist/commands/slack.d.ts +14 -28
- package/dist/commands/slack.d.ts.map +1 -1
- package/dist/commands/slack.js +77 -189
- package/dist/commands/slack.js.map +1 -1
- package/dist/commands/start.d.ts +3 -0
- package/dist/commands/start.d.ts.map +1 -1
- package/dist/commands/start.js +12 -5
- package/dist/commands/start.js.map +1 -1
- package/dist/commands/up.d.ts.map +1 -1
- package/dist/commands/up.js +11 -4
- package/dist/commands/up.js.map +1 -1
- package/dist/commands/view.d.ts +4 -2
- package/dist/commands/view.d.ts.map +1 -1
- package/dist/commands/view.js +4 -1
- package/dist/commands/view.js.map +1 -1
- package/dist/commands/watchdog.d.ts.map +1 -1
- package/dist/commands/watchdog.js +64 -8
- package/dist/commands/watchdog.js.map +1 -1
- package/dist/commands/workspace.js +1 -1
- package/dist/config-store.d.ts +15 -1
- package/dist/config-store.d.ts.map +1 -1
- package/dist/config-store.js +60 -0
- package/dist/config-store.js.map +1 -1
- package/dist/cross-host-target.d.ts.map +1 -1
- package/dist/cross-host-target.js +6 -5
- package/dist/cross-host-target.js.map +1 -1
- package/dist/daemon-lifecycle.d.ts +45 -3
- package/dist/daemon-lifecycle.d.ts.map +1 -1
- package/dist/daemon-lifecycle.js +126 -0
- package/dist/daemon-lifecycle.js.map +1 -1
- package/dist/host-registry.d.ts +2 -2
- package/dist/host-registry.js +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/lib/scope/capability-delta.d.ts +9 -0
- package/dist/lib/scope/capability-delta.d.ts.map +1 -0
- package/dist/lib/scope/capability-delta.js +73 -0
- package/dist/lib/scope/capability-delta.js.map +1 -0
- package/dist/lib/scope/scaffold-placeholder.d.ts +4 -5
- package/dist/lib/scope/scaffold-placeholder.d.ts.map +1 -1
- package/dist/lib/scope/scaffold-placeholder.js +6 -7
- package/dist/lib/scope/scaffold-placeholder.js.map +1 -1
- package/dist/lib/scope/scope-audit.d.ts +46 -4
- package/dist/lib/scope/scope-audit.d.ts.map +1 -1
- package/dist/lib/scope/scope-audit.js +79 -94
- package/dist/lib/scope/scope-audit.js.map +1 -1
- package/dist/lib/scope/scope-fs.d.ts +26 -14
- package/dist/lib/scope/scope-fs.d.ts.map +1 -1
- package/dist/lib/scope/scope-fs.js +78 -29
- package/dist/lib/scope/scope-fs.js.map +1 -1
- package/dist/lib/scope/templates.d.ts +17 -17
- package/dist/lib/scope/templates.d.ts.map +1 -1
- package/dist/lib/scope/templates.js +35 -39
- package/dist/lib/scope/templates.js.map +1 -1
- package/dist/lib/scope-templates/backlog-deprecation.md +4 -2
- package/dist/lib/scope-templates/backlog-tech-debt.md +4 -2
- package/dist/lib/scope-templates/bug-fix.md +4 -2
- package/dist/lib/scope-templates/capability-delta.md +61 -0
- package/dist/lib/scope-templates/mission-placeholder.md +9 -40
- package/dist/lib/scope-templates/mission-progress.md +5 -6
- package/dist/lib/scope-templates/mission-release.md +9 -40
- package/dist/lib/scope-templates/notes.md +14 -0
- package/dist/lib/scope-templates/placeholder.md +4 -2
- package/dist/lib/scope-templates/proof.md +1 -1
- package/dist/lib/scope-templates/release-feature.md +4 -2
- package/dist/lib/scope-templates/research.md +4 -2
- package/dist/lib/scope-templates/slice-progress.md +4 -5
- package/node_modules/@openrig/daemon/dist/adapters/claude-code-adapter.d.ts +15 -0
- package/node_modules/@openrig/daemon/dist/adapters/claude-code-adapter.d.ts.map +1 -1
- package/node_modules/@openrig/daemon/dist/adapters/claude-code-adapter.js +57 -0
- package/node_modules/@openrig/daemon/dist/adapters/claude-code-adapter.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/build-info.js +3 -3
- package/node_modules/@openrig/daemon/dist/context-pack-taxonomy-surface.d.ts +2 -0
- package/node_modules/@openrig/daemon/dist/context-pack-taxonomy-surface.d.ts.map +1 -0
- package/node_modules/@openrig/daemon/dist/context-pack-taxonomy-surface.js +6 -0
- package/node_modules/@openrig/daemon/dist/context-pack-taxonomy-surface.js.map +1 -0
- package/node_modules/@openrig/daemon/dist/db/all-migrations.d.ts +1 -1
- package/node_modules/@openrig/daemon/dist/db/all-migrations.d.ts.map +1 -1
- package/node_modules/@openrig/daemon/dist/db/all-migrations.js +12 -2
- package/node_modules/@openrig/daemon/dist/db/all-migrations.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/db/migrations/072_thread_seat_map.d.ts +3 -0
- package/node_modules/@openrig/daemon/dist/db/migrations/072_thread_seat_map.d.ts.map +1 -0
- package/node_modules/@openrig/daemon/dist/db/migrations/072_thread_seat_map.js +22 -0
- package/node_modules/@openrig/daemon/dist/db/migrations/072_thread_seat_map.js.map +1 -0
- package/node_modules/@openrig/daemon/dist/db/migrations/073_queue_transition_wakes.d.ts +3 -0
- package/node_modules/@openrig/daemon/dist/db/migrations/073_queue_transition_wakes.d.ts.map +1 -0
- package/node_modules/@openrig/daemon/dist/db/migrations/073_queue_transition_wakes.js +21 -0
- package/node_modules/@openrig/daemon/dist/db/migrations/073_queue_transition_wakes.js.map +1 -0
- package/node_modules/@openrig/daemon/dist/db/migrations/074_context_usage_watchdog.d.ts +4 -0
- package/node_modules/@openrig/daemon/dist/db/migrations/074_context_usage_watchdog.d.ts.map +1 -0
- package/node_modules/@openrig/daemon/dist/db/migrations/074_context_usage_watchdog.js +11 -0
- package/node_modules/@openrig/daemon/dist/db/migrations/074_context_usage_watchdog.js.map +1 -0
- package/node_modules/@openrig/daemon/dist/db/migrations/075_context_usage_watchdog_generation.d.ts +4 -0
- package/node_modules/@openrig/daemon/dist/db/migrations/075_context_usage_watchdog_generation.d.ts.map +1 -0
- package/node_modules/@openrig/daemon/dist/db/migrations/075_context_usage_watchdog_generation.js +8 -0
- package/node_modules/@openrig/daemon/dist/db/migrations/075_context_usage_watchdog_generation.js.map +1 -0
- package/node_modules/@openrig/daemon/dist/db/migrations/076_owner_notification_levels.d.ts +8 -0
- package/node_modules/@openrig/daemon/dist/db/migrations/076_owner_notification_levels.d.ts.map +1 -0
- package/node_modules/@openrig/daemon/dist/db/migrations/076_owner_notification_levels.js +15 -0
- package/node_modules/@openrig/daemon/dist/db/migrations/076_owner_notification_levels.js.map +1 -0
- package/node_modules/@openrig/daemon/dist/domain/active-occupant.d.ts +44 -0
- package/node_modules/@openrig/daemon/dist/domain/active-occupant.d.ts.map +1 -0
- package/node_modules/@openrig/daemon/dist/domain/active-occupant.js +72 -0
- package/node_modules/@openrig/daemon/dist/domain/active-occupant.js.map +1 -0
- package/node_modules/@openrig/daemon/dist/domain/activity-taxonomy.d.ts +112 -0
- package/node_modules/@openrig/daemon/dist/domain/activity-taxonomy.d.ts.map +1 -0
- package/node_modules/@openrig/daemon/dist/domain/activity-taxonomy.js +99 -0
- package/node_modules/@openrig/daemon/dist/domain/activity-taxonomy.js.map +1 -0
- package/node_modules/@openrig/daemon/dist/domain/agent-manifest.d.ts +6 -0
- package/node_modules/@openrig/daemon/dist/domain/agent-manifest.d.ts.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/agent-manifest.js +77 -15
- package/node_modules/@openrig/daemon/dist/domain/agent-manifest.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/agent-resolver.d.ts +11 -0
- package/node_modules/@openrig/daemon/dist/domain/agent-resolver.d.ts.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/agent-resolver.js +55 -0
- package/node_modules/@openrig/daemon/dist/domain/agent-resolver.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/bind-plan.d.ts +19 -0
- package/node_modules/@openrig/daemon/dist/domain/bind-plan.d.ts.map +1 -0
- package/node_modules/@openrig/daemon/dist/domain/bind-plan.js +25 -0
- package/node_modules/@openrig/daemon/dist/domain/bind-plan.js.map +1 -0
- package/node_modules/@openrig/daemon/dist/domain/bundle-context-packs-router.d.ts +9 -2
- package/node_modules/@openrig/daemon/dist/domain/bundle-context-packs-router.d.ts.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/bundle-context-packs-router.js +18 -0
- package/node_modules/@openrig/daemon/dist/domain/bundle-context-packs-router.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/claude-compaction-enforcer.d.ts +7 -0
- package/node_modules/@openrig/daemon/dist/domain/claude-compaction-enforcer.d.ts.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/claude-compaction-enforcer.js +10 -0
- package/node_modules/@openrig/daemon/dist/domain/claude-compaction-enforcer.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/context-packs/context-pack-library-service.d.ts.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/context-packs/context-pack-library-service.js +7 -0
- package/node_modules/@openrig/daemon/dist/domain/context-packs/context-pack-library-service.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/context-packs/context-pack-types.d.ts +11 -0
- package/node_modules/@openrig/daemon/dist/domain/context-packs/context-pack-types.d.ts.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/context-packs/context-pack-types.js +11 -0
- package/node_modules/@openrig/daemon/dist/domain/context-packs/context-pack-types.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/context-packs/manifest-parser.d.ts.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/context-packs/manifest-parser.js +13 -1
- package/node_modules/@openrig/daemon/dist/domain/context-packs/manifest-parser.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/continuity-policy-materializer.d.ts +88 -0
- package/node_modules/@openrig/daemon/dist/domain/continuity-policy-materializer.d.ts.map +1 -0
- package/node_modules/@openrig/daemon/dist/domain/continuity-policy-materializer.js +290 -0
- package/node_modules/@openrig/daemon/dist/domain/continuity-policy-materializer.js.map +1 -0
- package/node_modules/@openrig/daemon/dist/domain/continuity-stack-packets.d.ts +65 -0
- package/node_modules/@openrig/daemon/dist/domain/continuity-stack-packets.d.ts.map +1 -0
- package/node_modules/@openrig/daemon/dist/domain/continuity-stack-packets.js +99 -0
- package/node_modules/@openrig/daemon/dist/domain/continuity-stack-packets.js.map +1 -0
- package/node_modules/@openrig/daemon/dist/domain/event-bus.d.ts +6 -0
- package/node_modules/@openrig/daemon/dist/domain/event-bus.d.ts.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/event-bus.js +15 -5
- package/node_modules/@openrig/daemon/dist/domain/event-bus.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/execution-view.d.ts +39 -0
- package/node_modules/@openrig/daemon/dist/domain/execution-view.d.ts.map +1 -0
- package/node_modules/@openrig/daemon/dist/domain/execution-view.js +707 -0
- package/node_modules/@openrig/daemon/dist/domain/execution-view.js.map +1 -0
- package/node_modules/@openrig/daemon/dist/domain/gateway/delivery-rules-engine.d.ts +60 -0
- package/node_modules/@openrig/daemon/dist/domain/gateway/delivery-rules-engine.d.ts.map +1 -0
- package/node_modules/@openrig/daemon/dist/domain/gateway/delivery-rules-engine.js +144 -0
- package/node_modules/@openrig/daemon/dist/domain/gateway/delivery-rules-engine.js.map +1 -0
- package/node_modules/@openrig/daemon/dist/domain/gateway/destination-resolver.d.ts +20 -0
- package/node_modules/@openrig/daemon/dist/domain/gateway/destination-resolver.d.ts.map +1 -0
- package/node_modules/@openrig/daemon/dist/domain/gateway/destination-resolver.js +52 -0
- package/node_modules/@openrig/daemon/dist/domain/gateway/destination-resolver.js.map +1 -0
- package/node_modules/@openrig/daemon/dist/domain/gateway/dispatcher.d.ts +3 -1
- package/node_modules/@openrig/daemon/dist/domain/gateway/dispatcher.d.ts.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/gateway/dispatcher.js +9 -2
- package/node_modules/@openrig/daemon/dist/domain/gateway/dispatcher.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/gateway/gateway-process-main.d.ts.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/gateway/gateway-process-main.js +9 -0
- package/node_modules/@openrig/daemon/dist/domain/gateway/gateway-process-main.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/gateway/gateway-process.d.ts.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/gateway/gateway-process.js +9 -0
- package/node_modules/@openrig/daemon/dist/domain/gateway/gateway-process.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/gateway/gateway-subsystem.d.ts +84 -0
- package/node_modules/@openrig/daemon/dist/domain/gateway/gateway-subsystem.d.ts.map +1 -0
- package/node_modules/@openrig/daemon/dist/domain/gateway/gateway-subsystem.js +151 -0
- package/node_modules/@openrig/daemon/dist/domain/gateway/gateway-subsystem.js.map +1 -0
- package/node_modules/@openrig/daemon/dist/domain/gateway/human-registry.d.ts +118 -1
- package/node_modules/@openrig/daemon/dist/domain/gateway/human-registry.d.ts.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/gateway/human-registry.js +282 -1
- package/node_modules/@openrig/daemon/dist/domain/gateway/human-registry.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/gateway/operator-delivery-engine.d.ts +32 -0
- package/node_modules/@openrig/daemon/dist/domain/gateway/operator-delivery-engine.d.ts.map +1 -0
- package/node_modules/@openrig/daemon/dist/domain/gateway/operator-delivery-engine.js +86 -0
- package/node_modules/@openrig/daemon/dist/domain/gateway/operator-delivery-engine.js.map +1 -0
- package/node_modules/@openrig/daemon/dist/domain/gateway/slack/config.d.ts +45 -0
- package/node_modules/@openrig/daemon/dist/domain/gateway/slack/config.d.ts.map +1 -0
- package/node_modules/@openrig/daemon/dist/domain/gateway/slack/config.js +78 -0
- package/node_modules/@openrig/daemon/dist/domain/gateway/slack/config.js.map +1 -0
- package/node_modules/@openrig/daemon/dist/domain/gateway/slack/inbound-admission.d.ts +8 -0
- package/node_modules/@openrig/daemon/dist/domain/gateway/slack/inbound-admission.d.ts.map +1 -0
- package/node_modules/@openrig/daemon/dist/domain/gateway/slack/inbound-admission.js +20 -0
- package/node_modules/@openrig/daemon/dist/domain/gateway/slack/inbound-admission.js.map +1 -0
- package/node_modules/@openrig/daemon/dist/domain/gateway/slack/inbound.d.ts +141 -0
- package/node_modules/@openrig/daemon/dist/domain/gateway/slack/inbound.d.ts.map +1 -0
- package/node_modules/@openrig/daemon/dist/domain/gateway/slack/inbound.js +197 -0
- package/node_modules/@openrig/daemon/dist/domain/gateway/slack/inbound.js.map +1 -0
- package/node_modules/@openrig/daemon/dist/domain/gateway/slack/message.d.ts +80 -0
- package/node_modules/@openrig/daemon/dist/domain/gateway/slack/message.d.ts.map +1 -0
- package/node_modules/@openrig/daemon/dist/domain/gateway/slack/message.js +164 -0
- package/node_modules/@openrig/daemon/dist/domain/gateway/slack/message.js.map +1 -0
- package/node_modules/@openrig/daemon/dist/domain/gateway/slack/outbound-driver.d.ts +57 -0
- package/node_modules/@openrig/daemon/dist/domain/gateway/slack/outbound-driver.d.ts.map +1 -0
- package/node_modules/@openrig/daemon/dist/domain/gateway/slack/outbound-driver.js +103 -0
- package/node_modules/@openrig/daemon/dist/domain/gateway/slack/outbound-driver.js.map +1 -0
- package/node_modules/@openrig/daemon/dist/domain/gateway/slack/queue-access.d.ts +58 -0
- package/node_modules/@openrig/daemon/dist/domain/gateway/slack/queue-access.d.ts.map +1 -0
- package/node_modules/@openrig/daemon/dist/domain/gateway/slack/queue-access.js +99 -0
- package/node_modules/@openrig/daemon/dist/domain/gateway/slack/queue-access.js.map +1 -0
- package/node_modules/@openrig/daemon/dist/domain/gateway/slack/secrets.d.ts +21 -0
- package/node_modules/@openrig/daemon/dist/domain/gateway/slack/secrets.d.ts.map +1 -0
- package/node_modules/@openrig/daemon/dist/domain/gateway/slack/secrets.js +73 -0
- package/node_modules/@openrig/daemon/dist/domain/gateway/slack/secrets.js.map +1 -0
- package/node_modules/@openrig/daemon/dist/domain/gateway/slack/slack-api.d.ts +129 -0
- package/node_modules/@openrig/daemon/dist/domain/gateway/slack/slack-api.d.ts.map +1 -0
- package/node_modules/@openrig/daemon/dist/domain/gateway/slack/slack-api.js +236 -0
- package/node_modules/@openrig/daemon/dist/domain/gateway/slack/slack-api.js.map +1 -0
- package/node_modules/@openrig/daemon/dist/domain/gateway/slack/slack-delivery.d.ts +53 -0
- package/node_modules/@openrig/daemon/dist/domain/gateway/slack/slack-delivery.d.ts.map +1 -0
- package/node_modules/@openrig/daemon/dist/domain/gateway/slack/slack-delivery.js +267 -0
- package/node_modules/@openrig/daemon/dist/domain/gateway/slack/slack-delivery.js.map +1 -0
- package/node_modules/@openrig/daemon/dist/domain/gateway/slack/slack-subsystem.d.ts +31 -0
- package/node_modules/@openrig/daemon/dist/domain/gateway/slack/slack-subsystem.d.ts.map +1 -0
- package/node_modules/@openrig/daemon/dist/domain/gateway/slack/slack-subsystem.js +473 -0
- package/node_modules/@openrig/daemon/dist/domain/gateway/slack/slack-subsystem.js.map +1 -0
- package/node_modules/@openrig/daemon/dist/domain/gateway/slack/socket-inbound.d.ts +30 -0
- package/node_modules/@openrig/daemon/dist/domain/gateway/slack/socket-inbound.d.ts.map +1 -0
- package/node_modules/@openrig/daemon/dist/domain/gateway/slack/socket-inbound.js +99 -0
- package/node_modules/@openrig/daemon/dist/domain/gateway/slack/socket-inbound.js.map +1 -0
- package/node_modules/@openrig/daemon/dist/domain/gateway/slack/state-store.d.ts +62 -0
- package/node_modules/@openrig/daemon/dist/domain/gateway/slack/state-store.d.ts.map +1 -0
- package/node_modules/@openrig/daemon/dist/domain/gateway/slack/state-store.js +132 -0
- package/node_modules/@openrig/daemon/dist/domain/gateway/slack/state-store.js.map +1 -0
- package/node_modules/@openrig/daemon/dist/domain/gateway/slack/thread-routing.d.ts +17 -0
- package/node_modules/@openrig/daemon/dist/domain/gateway/slack/thread-routing.d.ts.map +1 -0
- package/node_modules/@openrig/daemon/dist/domain/gateway/slack/thread-routing.js +35 -0
- package/node_modules/@openrig/daemon/dist/domain/gateway/slack/thread-routing.js.map +1 -0
- package/node_modules/@openrig/daemon/dist/domain/gateway/slack/thread-seat-map.d.ts +56 -0
- package/node_modules/@openrig/daemon/dist/domain/gateway/slack/thread-seat-map.d.ts.map +1 -0
- package/node_modules/@openrig/daemon/dist/domain/gateway/slack/thread-seat-map.js +103 -0
- package/node_modules/@openrig/daemon/dist/domain/gateway/slack/thread-seat-map.js.map +1 -0
- package/node_modules/@openrig/daemon/dist/domain/gateway/spawn-gateway.d.ts.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/gateway/spawn-gateway.js +9 -0
- package/node_modules/@openrig/daemon/dist/domain/gateway/spawn-gateway.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/gateway/transport.d.ts.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/gateway/transport.js +9 -0
- package/node_modules/@openrig/daemon/dist/domain/gateway/transport.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/graph-projection.d.ts +6 -0
- package/node_modules/@openrig/daemon/dist/domain/graph-projection.d.ts.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/graph-projection.js +6 -0
- package/node_modules/@openrig/daemon/dist/domain/graph-projection.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/mission-control/mission-control-write-contract.d.ts.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/mission-control/mission-control-write-contract.js +1 -0
- package/node_modules/@openrig/daemon/dist/domain/mission-control/mission-control-write-contract.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/node-inventory.d.ts +41 -3
- package/node_modules/@openrig/daemon/dist/domain/node-inventory.d.ts.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/node-inventory.js +65 -48
- package/node_modules/@openrig/daemon/dist/domain/node-inventory.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/parked-query.d.ts +82 -0
- package/node_modules/@openrig/daemon/dist/domain/parked-query.d.ts.map +1 -0
- package/node_modules/@openrig/daemon/dist/domain/parked-query.js +127 -0
- package/node_modules/@openrig/daemon/dist/domain/parked-query.js.map +1 -0
- package/node_modules/@openrig/daemon/dist/domain/pod-bundle-assembler.d.ts.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/pod-bundle-assembler.js +12 -5
- package/node_modules/@openrig/daemon/dist/domain/pod-bundle-assembler.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/policies/context-usage-threshold.d.ts +7 -0
- package/node_modules/@openrig/daemon/dist/domain/policies/context-usage-threshold.d.ts.map +1 -0
- package/node_modules/@openrig/daemon/dist/domain/policies/context-usage-threshold.js +99 -0
- package/node_modules/@openrig/daemon/dist/domain/policies/context-usage-threshold.js.map +1 -0
- package/node_modules/@openrig/daemon/dist/domain/policies/delivery-deferral.d.ts +54 -0
- package/node_modules/@openrig/daemon/dist/domain/policies/delivery-deferral.d.ts.map +1 -0
- package/node_modules/@openrig/daemon/dist/domain/policies/delivery-deferral.js +153 -0
- package/node_modules/@openrig/daemon/dist/domain/policies/delivery-deferral.js.map +1 -0
- package/node_modules/@openrig/daemon/dist/domain/policies/delivery-digest-flush.d.ts +45 -0
- package/node_modules/@openrig/daemon/dist/domain/policies/delivery-digest-flush.d.ts.map +1 -0
- package/node_modules/@openrig/daemon/dist/domain/policies/delivery-digest-flush.js +94 -0
- package/node_modules/@openrig/daemon/dist/domain/policies/delivery-digest-flush.js.map +1 -0
- package/node_modules/@openrig/daemon/dist/domain/policies/parked-owner-consumer.d.ts +65 -0
- package/node_modules/@openrig/daemon/dist/domain/policies/parked-owner-consumer.d.ts.map +1 -0
- package/node_modules/@openrig/daemon/dist/domain/policies/parked-owner-consumer.js +244 -0
- package/node_modules/@openrig/daemon/dist/domain/policies/parked-owner-consumer.js.map +1 -0
- package/node_modules/@openrig/daemon/dist/domain/policies/types.d.ts +8 -0
- package/node_modules/@openrig/daemon/dist/domain/policies/types.d.ts.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/profile-resolver.d.ts +4 -0
- package/node_modules/@openrig/daemon/dist/domain/profile-resolver.d.ts.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/profile-resolver.js +58 -0
- package/node_modules/@openrig/daemon/dist/domain/profile-resolver.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/provider/provider-signals.d.ts +20 -1
- package/node_modules/@openrig/daemon/dist/domain/provider/provider-signals.d.ts.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/provider/provider-signals.js +64 -0
- package/node_modules/@openrig/daemon/dist/domain/provider/provider-signals.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/ps-projection.d.ts +7 -5
- package/node_modules/@openrig/daemon/dist/domain/ps-projection.d.ts.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/ps-projection.js +19 -32
- package/node_modules/@openrig/daemon/dist/domain/ps-projection.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/queue-pickup.d.ts +38 -0
- package/node_modules/@openrig/daemon/dist/domain/queue-pickup.d.ts.map +1 -0
- package/node_modules/@openrig/daemon/dist/domain/queue-pickup.js +72 -0
- package/node_modules/@openrig/daemon/dist/domain/queue-pickup.js.map +1 -0
- package/node_modules/@openrig/daemon/dist/domain/queue-repository.d.ts +93 -28
- package/node_modules/@openrig/daemon/dist/domain/queue-repository.d.ts.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/queue-repository.js +626 -90
- package/node_modules/@openrig/daemon/dist/domain/queue-repository.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/queue-retention.d.ts.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/queue-retention.js +8 -2
- package/node_modules/@openrig/daemon/dist/domain/queue-retention.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/queue-stuck-sweep.d.ts +100 -0
- package/node_modules/@openrig/daemon/dist/domain/queue-stuck-sweep.d.ts.map +1 -0
- package/node_modules/@openrig/daemon/dist/domain/queue-stuck-sweep.js +485 -0
- package/node_modules/@openrig/daemon/dist/domain/queue-stuck-sweep.js.map +1 -0
- package/node_modules/@openrig/daemon/dist/domain/queue-transition-log.d.ts +10 -0
- package/node_modules/@openrig/daemon/dist/domain/queue-transition-log.d.ts.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/queue-transition-log.js +49 -11
- package/node_modules/@openrig/daemon/dist/domain/queue-transition-log.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/queue-wake-ladder.d.ts +114 -0
- package/node_modules/@openrig/daemon/dist/domain/queue-wake-ladder.d.ts.map +1 -0
- package/node_modules/@openrig/daemon/dist/domain/queue-wake-ladder.js +705 -0
- package/node_modules/@openrig/daemon/dist/domain/queue-wake-ladder.js.map +1 -0
- package/node_modules/@openrig/daemon/dist/domain/queue-wake-repository.d.ts +53 -0
- package/node_modules/@openrig/daemon/dist/domain/queue-wake-repository.d.ts.map +1 -0
- package/node_modules/@openrig/daemon/dist/domain/queue-wake-repository.js +129 -0
- package/node_modules/@openrig/daemon/dist/domain/queue-wake-repository.js.map +1 -0
- package/node_modules/@openrig/daemon/dist/domain/rebuild-priming-chain.d.ts +28 -0
- package/node_modules/@openrig/daemon/dist/domain/rebuild-priming-chain.d.ts.map +1 -0
- package/node_modules/@openrig/daemon/dist/domain/rebuild-priming-chain.js +71 -0
- package/node_modules/@openrig/daemon/dist/domain/rebuild-priming-chain.js.map +1 -0
- package/node_modules/@openrig/daemon/dist/domain/restore-check-service.js +1 -1
- package/node_modules/@openrig/daemon/dist/domain/restore-check-service.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/restore-orchestrator.d.ts +2 -1
- package/node_modules/@openrig/daemon/dist/domain/restore-orchestrator.d.ts.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/restore-orchestrator.js +88 -15
- package/node_modules/@openrig/daemon/dist/domain/restore-orchestrator.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/restore-plan-preview.d.ts +6 -2
- package/node_modules/@openrig/daemon/dist/domain/restore-plan-preview.d.ts.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/restore-plan-preview.js +37 -19
- package/node_modules/@openrig/daemon/dist/domain/restore-plan-preview.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/review/compose.d.ts +3 -1
- package/node_modules/@openrig/daemon/dist/domain/review/compose.d.ts.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/review/compose.js +14 -8
- package/node_modules/@openrig/daemon/dist/domain/review/compose.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/review/gather.d.ts.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/review/gather.js +3 -1
- package/node_modules/@openrig/daemon/dist/domain/review/gather.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/rig-expansion-service.d.ts.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/rig-expansion-service.js +10 -9
- package/node_modules/@openrig/daemon/dist/domain/rig-expansion-service.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/rig-repository.d.ts +4 -0
- package/node_modules/@openrig/daemon/dist/domain/rig-repository.d.ts.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/rig-repository.js +21 -3
- package/node_modules/@openrig/daemon/dist/domain/rig-repository.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/rigspec-codec.d.ts.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/rigspec-codec.js +74 -4
- package/node_modules/@openrig/daemon/dist/domain/rigspec-codec.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/rigspec-instantiator.d.ts +7 -0
- package/node_modules/@openrig/daemon/dist/domain/rigspec-instantiator.d.ts.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/rigspec-instantiator.js +32 -0
- package/node_modules/@openrig/daemon/dist/domain/rigspec-instantiator.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/rigspec-schema.d.ts.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/rigspec-schema.js +32 -4
- package/node_modules/@openrig/daemon/dist/domain/rigspec-schema.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/scope/node-file.d.ts +8 -0
- package/node_modules/@openrig/daemon/dist/domain/scope/node-file.d.ts.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/scope/node-file.js +18 -0
- package/node_modules/@openrig/daemon/dist/domain/scope/node-file.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/scope/plan-lock-artifacts.d.ts +6 -5
- package/node_modules/@openrig/daemon/dist/domain/scope/plan-lock-artifacts.d.ts.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/scope/plan-lock-artifacts.js +23 -20
- package/node_modules/@openrig/daemon/dist/domain/scope/plan-lock-artifacts.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/scope/scaffold-placeholder.d.ts +4 -5
- package/node_modules/@openrig/daemon/dist/domain/scope/scaffold-placeholder.d.ts.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/scope/scaffold-placeholder.js +6 -7
- package/node_modules/@openrig/daemon/dist/domain/scope/scaffold-placeholder.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/scope/scope-approve.d.ts +1 -1
- package/node_modules/@openrig/daemon/dist/domain/scope/scope-approve.d.ts.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/scope/scope-approve.js +5 -4
- package/node_modules/@openrig/daemon/dist/domain/scope/scope-approve.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/scope/scope-audit.d.ts +46 -4
- package/node_modules/@openrig/daemon/dist/domain/scope/scope-audit.d.ts.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/scope/scope-audit.js +79 -94
- package/node_modules/@openrig/daemon/dist/domain/scope/scope-audit.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/scope/scope-view-projection.d.ts.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/scope/scope-view-projection.js +7 -2
- package/node_modules/@openrig/daemon/dist/domain/scope/scope-view-projection.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/seat-activity-service.d.ts +91 -0
- package/node_modules/@openrig/daemon/dist/domain/seat-activity-service.d.ts.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/seat-activity-service.js +416 -1
- package/node_modules/@openrig/daemon/dist/domain/seat-activity-service.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/seat-handover-planner.d.ts +14 -0
- package/node_modules/@openrig/daemon/dist/domain/seat-handover-planner.d.ts.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/seat-handover-planner.js +14 -1
- package/node_modules/@openrig/daemon/dist/domain/seat-handover-planner.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/seat-handover-service.d.ts +54 -1
- package/node_modules/@openrig/daemon/dist/domain/seat-handover-service.d.ts.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/seat-handover-service.js +162 -19
- package/node_modules/@openrig/daemon/dist/domain/seat-handover-service.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/session-transport.js +1 -2
- package/node_modules/@openrig/daemon/dist/domain/session-transport.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/snapshot-capture.d.ts.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/snapshot-capture.js +6 -0
- package/node_modules/@openrig/daemon/dist/domain/snapshot-capture.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/successor-session-launcher.d.ts +6 -1
- package/node_modules/@openrig/daemon/dist/domain/successor-session-launcher.d.ts.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/successor-session-launcher.js +3 -3
- package/node_modules/@openrig/daemon/dist/domain/successor-session-launcher.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/types.d.ts +59 -4
- package/node_modules/@openrig/daemon/dist/domain/types.d.ts.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/types.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/user-settings/settings-store.d.ts +1 -1
- package/node_modules/@openrig/daemon/dist/domain/user-settings/settings-store.d.ts.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/user-settings/settings-store.js +48 -0
- package/node_modules/@openrig/daemon/dist/domain/user-settings/settings-store.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/view-projector.d.ts +5 -1
- package/node_modules/@openrig/daemon/dist/domain/view-projector.d.ts.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/view-projector.js +65 -2
- package/node_modules/@openrig/daemon/dist/domain/view-projector.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/watchdog-jobs-repository.d.ts +25 -6
- package/node_modules/@openrig/daemon/dist/domain/watchdog-jobs-repository.d.ts.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/watchdog-jobs-repository.js +115 -32
- package/node_modules/@openrig/daemon/dist/domain/watchdog-jobs-repository.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/watchdog-policy-engine.d.ts +47 -1
- package/node_modules/@openrig/daemon/dist/domain/watchdog-policy-engine.d.ts.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/watchdog-policy-engine.js +115 -6
- package/node_modules/@openrig/daemon/dist/domain/watchdog-policy-engine.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/watchdog-scheduler.d.ts.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/watchdog-scheduler.js +3 -2
- package/node_modules/@openrig/daemon/dist/domain/watchdog-scheduler.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/workspace/default-workspace-scaffold.d.ts +4 -3
- package/node_modules/@openrig/daemon/dist/domain/workspace/default-workspace-scaffold.d.ts.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/workspace/default-workspace-scaffold.js +56 -196
- package/node_modules/@openrig/daemon/dist/domain/workspace/default-workspace-scaffold.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/workspace/getting-started-narrative.js +1 -1
- package/node_modules/@openrig/daemon/dist/domain/workspace/getting-started-narrative.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/workspace/workspace-doctor.d.ts +8 -11
- package/node_modules/@openrig/daemon/dist/domain/workspace/workspace-doctor.d.ts.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/workspace/workspace-doctor.js +22 -26
- package/node_modules/@openrig/daemon/dist/domain/workspace/workspace-doctor.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/gateway-slack-surface.d.ts +4 -0
- package/node_modules/@openrig/daemon/dist/gateway-slack-surface.d.ts.map +1 -0
- package/node_modules/@openrig/daemon/dist/gateway-slack-surface.js +8 -0
- package/node_modules/@openrig/daemon/dist/gateway-slack-surface.js.map +1 -0
- package/node_modules/@openrig/daemon/dist/index.d.ts +38 -0
- package/node_modules/@openrig/daemon/dist/index.d.ts.map +1 -1
- package/node_modules/@openrig/daemon/dist/index.js +122 -4
- package/node_modules/@openrig/daemon/dist/index.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/lib/pane-envelope.d.ts +1 -1
- package/node_modules/@openrig/daemon/dist/lib/pane-envelope.d.ts.map +1 -1
- package/node_modules/@openrig/daemon/dist/lib/pane-envelope.js +8 -14
- package/node_modules/@openrig/daemon/dist/lib/pane-envelope.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/routes/activity.d.ts +13 -0
- package/node_modules/@openrig/daemon/dist/routes/activity.d.ts.map +1 -1
- package/node_modules/@openrig/daemon/dist/routes/activity.js +186 -0
- package/node_modules/@openrig/daemon/dist/routes/activity.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/routes/agent-images.d.ts.map +1 -1
- package/node_modules/@openrig/daemon/dist/routes/agent-images.js +9 -0
- package/node_modules/@openrig/daemon/dist/routes/agent-images.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/routes/bundles.d.ts.map +1 -1
- package/node_modules/@openrig/daemon/dist/routes/bundles.js +61 -1
- package/node_modules/@openrig/daemon/dist/routes/bundles.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/routes/config.js +2 -2
- package/node_modules/@openrig/daemon/dist/routes/config.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/routes/gateway.d.ts +3 -0
- package/node_modules/@openrig/daemon/dist/routes/gateway.d.ts.map +1 -0
- package/node_modules/@openrig/daemon/dist/routes/gateway.js +46 -0
- package/node_modules/@openrig/daemon/dist/routes/gateway.js.map +1 -0
- package/node_modules/@openrig/daemon/dist/routes/health-summary.d.ts.map +1 -1
- package/node_modules/@openrig/daemon/dist/routes/health-summary.js +8 -0
- package/node_modules/@openrig/daemon/dist/routes/health-summary.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/routes/queue.d.ts.map +1 -1
- package/node_modules/@openrig/daemon/dist/routes/queue.js +25 -12
- package/node_modules/@openrig/daemon/dist/routes/queue.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/routes/rigs.js +38 -2
- package/node_modules/@openrig/daemon/dist/routes/rigs.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/routes/scope-audit.d.ts.map +1 -1
- package/node_modules/@openrig/daemon/dist/routes/scope-audit.js +73 -14
- package/node_modules/@openrig/daemon/dist/routes/scope-audit.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/routes/seat.d.ts.map +1 -1
- package/node_modules/@openrig/daemon/dist/routes/seat.js +15 -0
- package/node_modules/@openrig/daemon/dist/routes/seat.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/routes/views.d.ts.map +1 -1
- package/node_modules/@openrig/daemon/dist/routes/views.js +4 -1
- package/node_modules/@openrig/daemon/dist/routes/views.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/routes/watchdog.d.ts.map +1 -1
- package/node_modules/@openrig/daemon/dist/routes/watchdog.js +40 -3
- package/node_modules/@openrig/daemon/dist/routes/watchdog.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/server.d.ts +17 -0
- package/node_modules/@openrig/daemon/dist/server.d.ts.map +1 -1
- package/node_modules/@openrig/daemon/dist/server.js +30 -4
- package/node_modules/@openrig/daemon/dist/server.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/startup.d.ts +4 -0
- package/node_modules/@openrig/daemon/dist/startup.d.ts.map +1 -1
- package/node_modules/@openrig/daemon/dist/startup.js +227 -5
- package/node_modules/@openrig/daemon/dist/startup.js.map +1 -1
- package/node_modules/@openrig/daemon/package.json +9 -1
- package/package.json +1 -1
- package/tui/dist/daemon-client.d.ts +5 -0
- package/tui/dist/daemon-client.d.ts.map +1 -1
- package/tui/dist/daemon-client.js +17 -0
- package/tui/dist/daemon-client.js.map +1 -1
- package/tui/dist/demo-data.js +2 -2
- package/tui/dist/demo-data.js.map +1 -1
- package/tui/dist/hydrate.d.ts.map +1 -1
- package/tui/dist/hydrate.js +12 -4
- package/tui/dist/hydrate.js.map +1 -1
- package/tui/dist/live-events.d.ts +21 -0
- package/tui/dist/live-events.d.ts.map +1 -0
- package/tui/dist/live-events.js +88 -0
- package/tui/dist/live-events.js.map +1 -0
- package/tui/dist/live.js +1 -1
- package/tui/dist/main.js +27 -8
- package/tui/dist/main.js.map +1 -1
- package/tui/dist/refresh.d.ts +10 -1
- package/tui/dist/refresh.d.ts.map +1 -1
- package/tui/dist/refresh.js +22 -2
- package/tui/dist/refresh.js.map +1 -1
- package/daemon/context-packs/skills/core/attention-queue/SKILL.md +0 -264
- package/daemon/context-packs/skills/core/attention-queue/manifest.yaml +0 -9
- package/daemon/context-packs/world/install/01-world-from-primitives.md +0 -97
- package/daemon/context-packs/world/install/02-permission-self-sleep.md +0 -141
- package/daemon/context-packs/world/install/03-what-this-is-for.md +0 -86
- package/daemon/context-packs/world/install/04-ontology.md +0 -790
- package/daemon/context-packs/world/install/05-harness-power-use.md +0 -355
- package/daemon/context-packs/world/install/06-a-competent-turn.md +0 -225
- package/daemon/context-packs/world/install/manifest.yaml +0 -125
- package/daemon/specs/agents/shared/skills/core/attention-queue/SKILL.md +0 -264
- package/dist/lib/scope-templates/mission-brief.md +0 -20
- package/dist/lib/scope-templates/mission-notes.md +0 -102
- package/dist/slack/config.d.ts.map +0 -1
- package/dist/slack/config.js.map +0 -1
- package/dist/slack/connector-server.d.ts +0 -31
- package/dist/slack/connector-server.d.ts.map +0 -1
- package/dist/slack/connector-server.js +0 -108
- package/dist/slack/connector-server.js.map +0 -1
- package/dist/slack/inbound-admission.d.ts.map +0 -1
- package/dist/slack/inbound-admission.js.map +0 -1
- package/dist/slack/inbound.d.ts.map +0 -1
- package/dist/slack/inbound.js.map +0 -1
- package/dist/slack/message.d.ts +0 -39
- package/dist/slack/message.d.ts.map +0 -1
- package/dist/slack/message.js +0 -88
- package/dist/slack/message.js.map +0 -1
- package/dist/slack/outbound.d.ts +0 -39
- package/dist/slack/outbound.d.ts.map +0 -1
- package/dist/slack/outbound.js +0 -63
- package/dist/slack/outbound.js.map +0 -1
- package/dist/slack/queue-bridge.d.ts +0 -61
- package/dist/slack/queue-bridge.d.ts.map +0 -1
- package/dist/slack/queue-bridge.js +0 -114
- package/dist/slack/queue-bridge.js.map +0 -1
- package/dist/slack/secrets.d.ts.map +0 -1
- package/dist/slack/secrets.js.map +0 -1
- package/dist/slack/slack-api.d.ts +0 -49
- package/dist/slack/slack-api.d.ts.map +0 -1
- package/dist/slack/slack-api.js +0 -110
- package/dist/slack/slack-api.js.map +0 -1
- package/dist/slack/slack-delivery.d.ts +0 -14
- package/dist/slack/slack-delivery.d.ts.map +0 -1
- package/dist/slack/slack-delivery.js +0 -28
- package/dist/slack/slack-delivery.js.map +0 -1
- package/dist/slack/state-store.d.ts.map +0 -1
- package/dist/slack/state-store.js.map +0 -1
- /package/{dist → daemon/dist/domain/gateway}/slack/inbound-admission.js +0 -0
- /package/{dist → daemon/dist/domain/gateway}/slack/secrets.d.ts +0 -0
- /package/{dist → daemon/dist/domain/gateway}/slack/secrets.js +0 -0
- /package/{dist → daemon/dist/domain/gateway}/slack/state-store.d.ts +0 -0
- /package/{dist → daemon/dist/domain/gateway}/slack/state-store.js +0 -0
|
@@ -1,13 +1,17 @@
|
|
|
1
1
|
import { createHash } from "node:crypto";
|
|
2
|
-
import { loadHumanRegistry } from "./gateway/human-registry.js";
|
|
2
|
+
import { loadHumanRegistry, resolveRegisteredHumanAddress } from "./gateway/human-registry.js";
|
|
3
3
|
import { resolveExternal } from "./gateway/external-admission.js";
|
|
4
4
|
import { QueueTransitionLog } from "./queue-transition-log.js";
|
|
5
5
|
import { WAKE_INTENT_PREFIX } from "./outbox-handler.js";
|
|
6
|
+
import { derivePickup } from "./queue-pickup.js";
|
|
6
7
|
import { wrapPaneEnvelope } from "../lib/pane-envelope.js";
|
|
7
8
|
import { getSelfHostId } from "./hosts/fanout-contract.js";
|
|
8
9
|
import { parseSessionName } from "./session-name.js";
|
|
10
|
+
import { classifyDestination } from "./gateway/destination-resolver.js";
|
|
9
11
|
import { computeClosureRequiredAt, validateClosure, } from "./hot-potato-enforcer.js";
|
|
10
12
|
import { isHumanSeatSession, validateHumanPark, validateHumanRoute } from "./human-route-enforcer.js";
|
|
13
|
+
import { QueueWakeRepository, USAGE_LIMIT_BLOCKER_TAG, } from "./queue-wake-repository.js";
|
|
14
|
+
import { WatchdogJobsRepository } from "./watchdog-jobs-repository.js";
|
|
11
15
|
export const QUEUE_STATES = [
|
|
12
16
|
"pending",
|
|
13
17
|
"in-progress",
|
|
@@ -37,6 +41,8 @@ export const ACTIVE_QUEUE_STATES = ["pending", "in-progress", "blocked"];
|
|
|
37
41
|
export function isBlockerLive(state) {
|
|
38
42
|
return ACTIVE_QUEUE_STATES.includes(state);
|
|
39
43
|
}
|
|
44
|
+
const AUTO_UNPARK_WAKE_TAG = "queue:auto-unpark:blocker";
|
|
45
|
+
const AUTO_UNPARK_BLOCKER_TAG_PREFIX = "queue:auto-unpark:blocker-ref:";
|
|
40
46
|
/** 0.5.1-53 Atom 1a — typed non-qitem gate blocker prefixes. A park may be gated on a fold / auth /
|
|
41
47
|
* external condition that is NOT a qitem and NOT a human seat; these prefixes make such a gate a
|
|
42
48
|
* first-class, compact-visible, downstream-classifiable blocker (the ruling detail rides a transition). */
|
|
@@ -159,6 +165,14 @@ function detectQueueColumn(db, columnName) {
|
|
|
159
165
|
return false;
|
|
160
166
|
}
|
|
161
167
|
}
|
|
168
|
+
function detectTable(db, tableName) {
|
|
169
|
+
try {
|
|
170
|
+
return !!db.prepare("SELECT 1 FROM sqlite_master WHERE type = 'table' AND name = ?").get(tableName);
|
|
171
|
+
}
|
|
172
|
+
catch {
|
|
173
|
+
return false;
|
|
174
|
+
}
|
|
175
|
+
}
|
|
162
176
|
/**
|
|
163
177
|
* L3 — Queue repository. Owns CRUD over `queue_items` plus the wired-in
|
|
164
178
|
* append-only transition log and hot-potato strict-rejection contract.
|
|
@@ -267,6 +281,8 @@ export class QueueRepository {
|
|
|
267
281
|
* fallback real code rather than a promise in a comment). */
|
|
268
282
|
outbox;
|
|
269
283
|
resolveOccupantGeneration;
|
|
284
|
+
wakeRepo;
|
|
285
|
+
watchdogJobsRepo;
|
|
270
286
|
/** PL-007 Workspace Primitive — true when migration 038 has applied the
|
|
271
287
|
* queue_items.target_repo column. Older test fixtures that bypass the
|
|
272
288
|
* canonical migration list don't have the column; INSERTs degrade to
|
|
@@ -277,6 +293,9 @@ export class QueueRepository {
|
|
|
277
293
|
hasEvidenceRefColumn;
|
|
278
294
|
hasMintingGenColumn;
|
|
279
295
|
hasClaimedGenColumn;
|
|
296
|
+
hasQueueTransitionsTable;
|
|
297
|
+
hasOwnerNotificationColumns;
|
|
298
|
+
loadHumanRegistryFn;
|
|
280
299
|
/** OPR.0.4.6.WF3 FR-6 — injected by startup (never imported): the
|
|
281
300
|
* workflow domain's is-live-frontier-packet predicate. */
|
|
282
301
|
workflowFrontierPredicate;
|
|
@@ -284,13 +303,21 @@ export class QueueRepository {
|
|
|
284
303
|
this.db = db;
|
|
285
304
|
this.eventBus = eventBus;
|
|
286
305
|
this.transitionLog = new QueueTransitionLog(db);
|
|
306
|
+
this.wakeRepo = new QueueWakeRepository(db);
|
|
287
307
|
this.validateRig = opts?.validateRig ?? (() => true);
|
|
288
308
|
this.transport = opts?.transport;
|
|
289
309
|
this.workflowFrontierPredicate = opts?.workflowFrontierPredicate;
|
|
290
310
|
this.resolveOccupantGeneration = opts?.resolveOccupantGeneration;
|
|
311
|
+
this.loadHumanRegistryFn = opts?.loadHumanRegistry ?? (() => loadHumanRegistry());
|
|
291
312
|
this.hasTargetRepoColumn = detectQueueColumn(db, "target_repo");
|
|
292
313
|
this.hasSummaryColumn = detectQueueColumn(db, "summary");
|
|
293
314
|
this.hasEvidenceRefColumn = detectQueueColumn(db, "evidence_ref");
|
|
315
|
+
this.hasQueueTransitionsTable = detectTable(db, "queue_transitions");
|
|
316
|
+
const transitionColumns = this.hasQueueTransitionsTable
|
|
317
|
+
? new Set(db.prepare("PRAGMA table_info(queue_transitions)").all().map((column) => column.name))
|
|
318
|
+
: new Set();
|
|
319
|
+
this.hasOwnerNotificationColumns = transitionColumns.has("owner_notification_kind")
|
|
320
|
+
&& transitionColumns.has("owner_notification_level");
|
|
294
321
|
// GHOST-STAGE (e/Class-B): generation stamps (migration 063). Defensive detect so a pre-063
|
|
295
322
|
// harness degrades (writers skip the columns; the release predicate never matches unstamped rows).
|
|
296
323
|
this.hasMintingGenColumn = detectQueueColumn(db, "minting_generation_uuid");
|
|
@@ -308,6 +335,11 @@ export class QueueRepository {
|
|
|
308
335
|
// checks cannot drift.
|
|
309
336
|
db.function("is_human_seat_session", { deterministic: true }, (value) => isHumanSeatSession(value) ? 1 : 0);
|
|
310
337
|
}
|
|
338
|
+
/** Startup attaches the generation-aware shared repository. Isolated domain
|
|
339
|
+
* fixtures fall back to a repository on this same SQLite connection. */
|
|
340
|
+
attachWatchdogJobsRepository(repo) {
|
|
341
|
+
this.watchdogJobsRepo = repo;
|
|
342
|
+
}
|
|
311
343
|
/**
|
|
312
344
|
* Attach the wake-path transport AFTER construction. Used by daemon
|
|
313
345
|
* startup, where SessionTransport is constructed later in the dep graph
|
|
@@ -334,6 +366,26 @@ export class QueueRepository {
|
|
|
334
366
|
}
|
|
335
367
|
this.outbox = outbox;
|
|
336
368
|
}
|
|
369
|
+
/** The one transition-write classifier. It consumes structured state/action facts only. */
|
|
370
|
+
classifyOwnerNotification(input) {
|
|
371
|
+
if (input.explicitKind === "human-decision-resolved") {
|
|
372
|
+
return { kind: input.explicitKind, level: "NOTICE" };
|
|
373
|
+
}
|
|
374
|
+
const registry = this.loadHumanRegistryFn();
|
|
375
|
+
if (!registry.ok)
|
|
376
|
+
return null;
|
|
377
|
+
const blockedHuman = resolveRegisteredHumanAddress(input.nextBlockedOn, registry.entities);
|
|
378
|
+
const previousBlockedHuman = resolveRegisteredHumanAddress(input.previousBlockedOn, registry.entities);
|
|
379
|
+
const enteredHumanPark = input.nextState === "blocked" && blockedHuman !== null &&
|
|
380
|
+
(input.previousState !== "blocked" || previousBlockedHuman !== blockedHuman);
|
|
381
|
+
if (enteredHumanPark)
|
|
382
|
+
return { kind: "human-required", level: "ALERT" };
|
|
383
|
+
const destinationHuman = resolveRegisteredHumanAddress(input.destinationSession, registry.entities);
|
|
384
|
+
if (input.action === "create" && destinationHuman !== null) {
|
|
385
|
+
return { kind: "human-required", level: "ALERT" };
|
|
386
|
+
}
|
|
387
|
+
return null;
|
|
388
|
+
}
|
|
337
389
|
/**
|
|
338
390
|
* W1 (transactional closure) — the PUBLIC composable primitive (stage half).
|
|
339
391
|
* Stage the durable WAKE INTENT for a successor qitem from INSIDE a terminal
|
|
@@ -358,24 +410,50 @@ export class QueueRepository {
|
|
|
358
410
|
// defect only when a wake WAS intended.
|
|
359
411
|
if (nudge === false)
|
|
360
412
|
return;
|
|
413
|
+
this.recordWakeIntent({
|
|
414
|
+
outboxId: `${WAKE_INTENT_PREFIX}${successorQitemId}`,
|
|
415
|
+
auditPointer: successorQitemId,
|
|
416
|
+
fromSession,
|
|
417
|
+
toSession,
|
|
418
|
+
identityProvenance,
|
|
419
|
+
bareBody: `Queue handoff: ${successorQitemId} - check your queue.`,
|
|
420
|
+
});
|
|
421
|
+
}
|
|
422
|
+
recordWakeIntent(input) {
|
|
361
423
|
if (!this.outbox)
|
|
362
|
-
return;
|
|
363
|
-
// MF4:
|
|
364
|
-
//
|
|
365
|
-
// intent body. Delivery (immediate or crash-recovery) replays this exact text,
|
|
366
|
-
// so a recovery after a tenure swap can never relabel the wake with the CURRENT
|
|
367
|
-
// occupant's generation — it carries the generation that actually emitted it.
|
|
368
|
-
const bareBody = `Queue handoff: ${successorQitemId} - check your queue.`;
|
|
424
|
+
return null;
|
|
425
|
+
// MF4: freeze the emitting envelope at stage time. Delivery and crash
|
|
426
|
+
// recovery replay these exact bytes without re-resolving the occupant.
|
|
369
427
|
const stampISO = new Date().toISOString();
|
|
370
|
-
const genUuid = this.resolveOccupantGeneration?.(fromSession) ?? undefined;
|
|
371
|
-
const frozenEnvelope = wrapPaneEnvelope(fromSession, toSession, bareBody,
|
|
428
|
+
const genUuid = this.resolveOccupantGeneration?.(input.fromSession) ?? undefined;
|
|
429
|
+
const frozenEnvelope = wrapPaneEnvelope(input.fromSession, input.toSession, input.bareBody, { stampISO, genUuid });
|
|
372
430
|
this.outbox.record({
|
|
373
|
-
outboxId:
|
|
374
|
-
senderSession: fromSession,
|
|
375
|
-
destinationSession: toSession,
|
|
431
|
+
outboxId: input.outboxId,
|
|
432
|
+
senderSession: input.fromSession,
|
|
433
|
+
destinationSession: input.toSession,
|
|
376
434
|
body: frozenEnvelope,
|
|
377
|
-
|
|
378
|
-
|
|
435
|
+
tags: input.tags,
|
|
436
|
+
auditPointer: input.auditPointer,
|
|
437
|
+
identityProvenance: input.identityProvenance,
|
|
438
|
+
});
|
|
439
|
+
return input.outboxId;
|
|
440
|
+
}
|
|
441
|
+
stageAutoUnparkWakeIntent(input) {
|
|
442
|
+
return this.recordWakeIntent({
|
|
443
|
+
outboxId: `${WAKE_INTENT_PREFIX}blocker-${input.resumeTransitionId}`,
|
|
444
|
+
auditPointer: input.qitemId,
|
|
445
|
+
fromSession: input.fromSession,
|
|
446
|
+
toSession: input.destinationSession,
|
|
447
|
+
identityProvenance: input.identityProvenance,
|
|
448
|
+
bareBody: `Blocker ${input.blockerQitemId} resolved; parked qitem ${input.qitemId} is pending. Resume the recorded continuation and update the row.`,
|
|
449
|
+
tags: [AUTO_UNPARK_WAKE_TAG, `${AUTO_UNPARK_BLOCKER_TAG_PREFIX}${input.blockerQitemId}`],
|
|
450
|
+
});
|
|
451
|
+
}
|
|
452
|
+
deliverWakeIntentAfterCommit(outboxId) {
|
|
453
|
+
queueMicrotask(() => {
|
|
454
|
+
void this.deliverWakeIntent(outboxId).catch((err) => {
|
|
455
|
+
console.error(`Auto-unpark wake delivery failed for ${outboxId}:`, err);
|
|
456
|
+
});
|
|
379
457
|
});
|
|
380
458
|
}
|
|
381
459
|
/**
|
|
@@ -448,9 +526,45 @@ export class QueueRepository {
|
|
|
448
526
|
const qitemId = intent.auditPointer ?? outboxId;
|
|
449
527
|
// MF4: send the FROZEN envelope stored on the intent verbatim (no re-resolution).
|
|
450
528
|
const outcome = await this.performWakeSend(qitemId, intent.destinationSession, intent.senderSession, undefined, intent.body);
|
|
451
|
-
this.recordNudgeAttempt(qitemId, outcome.nudgeResult);
|
|
452
529
|
const finalState = outcome.classified === "verified" ? "delivered" : outcome.classified;
|
|
453
|
-
|
|
530
|
+
const blockerRef = intent.tags?.includes(AUTO_UNPARK_WAKE_TAG)
|
|
531
|
+
? intent.tags
|
|
532
|
+
.find((tag) => tag.startsWith(AUTO_UNPARK_BLOCKER_TAG_PREFIX))
|
|
533
|
+
?.slice(AUTO_UNPARK_BLOCKER_TAG_PREFIX.length)
|
|
534
|
+
: undefined;
|
|
535
|
+
const wakeEvent = this.db.transaction(() => {
|
|
536
|
+
this.recordNudgeAttempt(qitemId, outcome.nudgeResult);
|
|
537
|
+
this.outbox.finalizeDelivery(outboxId, finalState);
|
|
538
|
+
if (!blockerRef)
|
|
539
|
+
return null;
|
|
540
|
+
const item = this.getByIdOrThrow(qitemId);
|
|
541
|
+
const transition = this.transitionLog.append({
|
|
542
|
+
qitemId,
|
|
543
|
+
state: item.state,
|
|
544
|
+
actorSession: "queue@system",
|
|
545
|
+
transitionNote: `blocker ${blockerRef} wake attempted; delivery=${outcome.nudgeResult}`,
|
|
546
|
+
});
|
|
547
|
+
this.wakeRepo.record({
|
|
548
|
+
transitionId: transition.transitionId,
|
|
549
|
+
qitemId,
|
|
550
|
+
phase: "fired",
|
|
551
|
+
kind: "blocker",
|
|
552
|
+
ref: blockerRef,
|
|
553
|
+
deliveryStatus: outcome.nudgeResult,
|
|
554
|
+
});
|
|
555
|
+
return this.eventBus.persistWithinTransaction({
|
|
556
|
+
type: "queue.updated",
|
|
557
|
+
qitemId,
|
|
558
|
+
fromState: item.state,
|
|
559
|
+
toState: item.state,
|
|
560
|
+
closureReason: null,
|
|
561
|
+
closureTarget: null,
|
|
562
|
+
actorSession: "queue@system",
|
|
563
|
+
summary: item.summary ?? null,
|
|
564
|
+
});
|
|
565
|
+
})();
|
|
566
|
+
if (wakeEvent)
|
|
567
|
+
this.eventBus.notifySubscribers(wakeEvent);
|
|
454
568
|
return finalState;
|
|
455
569
|
}
|
|
456
570
|
/**
|
|
@@ -597,6 +711,41 @@ export class QueueRepository {
|
|
|
597
711
|
* delivered nor demoted to failed.
|
|
598
712
|
*/
|
|
599
713
|
async performWakeSend(qitemId, destinationSession, sourceSession, bodyOverride, prebuiltText) {
|
|
714
|
+
// DEFECT FIX qitem-20260827065907-b9ae334c (S1-class, 3 live specimens): a virtual
|
|
715
|
+
// @external destination has NO pane — the queue row ITSELF is the gateway
|
|
716
|
+
// subsystem's input (the Slack connector polls human-destined rows and its own
|
|
717
|
+
// ledger is the delivery record). Falling through to tmux here recorded
|
|
718
|
+
// "failed: … tmux reports no session" while the founder verifiably received the
|
|
719
|
+
// message, and that failed: literal poisoned the undelivered surface.
|
|
720
|
+
// OPR.0.5.6.14 — the inline @external branch became THE ONE RESOLVER SEAM
|
|
721
|
+
// (gateway/destination-resolver.ts): pane-bound keeps terminal transport;
|
|
722
|
+
// gateway-routable (@external AND registry-resolved aliases like the
|
|
723
|
+
// paneless human-*@kernel virtual identities — the live 4-row specimen
|
|
724
|
+
// class) is GATEWAY-OWNED (tmux never consulted; the connector's row-poll
|
|
725
|
+
// is the dispatch and its ledger the delivery record); neither is an
|
|
726
|
+
// honest structured teaching refusal (tmux is not consulted for an
|
|
727
|
+
// address it can never hold). Classified indeterminate for gateway
|
|
728
|
+
// (landed with the owning subsystem; render unconfirmable here) — never
|
|
729
|
+
// verified, never failed.
|
|
730
|
+
const destClass = classifyDestination(destinationSession, {
|
|
731
|
+
entities: (() => {
|
|
732
|
+
const loaded = this.loadHumanRegistryFn();
|
|
733
|
+
return loaded.ok ? loaded.entities : null;
|
|
734
|
+
})(),
|
|
735
|
+
hasTerminalTransport: (dest) => this.hasTerminalTransport(dest),
|
|
736
|
+
});
|
|
737
|
+
if (destClass.class === "gateway-routable") {
|
|
738
|
+
const resolvedNote = destClass.via === "registry-alias" && destClass.resolvedHuman
|
|
739
|
+
? ` — the human registry resolves it to registered human '${destClass.resolvedHuman}'`
|
|
740
|
+
: "";
|
|
741
|
+
return {
|
|
742
|
+
classified: "indeterminate",
|
|
743
|
+
nudgeResult: `gateway-owned: '${destinationSession}' is a virtual ${destClass.via === "registry-alias" ? "paneless human" : "@external"} destination${resolvedNote} — delivery rides the gateway subsystem (Slack connector), whose own ledger is the delivery record; tmux was not consulted (it can never hold this address class)`,
|
|
744
|
+
};
|
|
745
|
+
}
|
|
746
|
+
if (destClass.class === "unroutable") {
|
|
747
|
+
return { classified: "failed", nudgeResult: destClass.teaching };
|
|
748
|
+
}
|
|
600
749
|
const stampISO = new Date().toISOString();
|
|
601
750
|
let text;
|
|
602
751
|
if (prebuiltText !== undefined) {
|
|
@@ -617,7 +766,7 @@ export class QueueRepository {
|
|
|
617
766
|
const genUuid = sourceSession
|
|
618
767
|
? (this.resolveOccupantGeneration?.(sourceSession) ?? undefined)
|
|
619
768
|
: undefined;
|
|
620
|
-
text = wrapPaneEnvelope(sourceSession, destinationSession, bareBody,
|
|
769
|
+
text = wrapPaneEnvelope(sourceSession, destinationSession, bareBody, { stampISO, genUuid });
|
|
621
770
|
}
|
|
622
771
|
try {
|
|
623
772
|
const res = await this.transport.send(destinationSession, text, { verify: true, stampISO });
|
|
@@ -653,10 +802,11 @@ export class QueueRepository {
|
|
|
653
802
|
}
|
|
654
803
|
}
|
|
655
804
|
async create(input) {
|
|
656
|
-
// 51-09 incr 4
|
|
657
|
-
//
|
|
658
|
-
//
|
|
659
|
-
|
|
805
|
+
// FOUNDER ROOT INVARIANT (2026-08-27, supersedes 51-09 incr 4 / ruling cb19867f Q2):
|
|
806
|
+
// a LOCAL write stores the bare transport identity — no self-host suffix inside one
|
|
807
|
+
// instance. Host identity is added only at the cross-host forwarding boundary
|
|
808
|
+
// (routes/queue.ts stamp-at-FORWARD), and a genuine origin triple arriving from a
|
|
809
|
+
// forward is stored verbatim (never re-stamped, never stripped).
|
|
660
810
|
if (!this.validateRig(input.destinationSession)) {
|
|
661
811
|
throw new QueueRepositoryError("unknown_destination_rig", `destination_session ${input.destinationSession} references an unknown rig`, destinationRefusalTeaching(input.destinationSession));
|
|
662
812
|
}
|
|
@@ -780,12 +930,19 @@ export class QueueRepository {
|
|
|
780
930
|
this.persistSummary(id, input.summary ?? null);
|
|
781
931
|
this.persistEvidenceRef(id, input.evidenceRef ?? null);
|
|
782
932
|
this.persistMintingGeneration(id, input.sourceSession);
|
|
933
|
+
const notification = this.classifyOwnerNotification({
|
|
934
|
+
action: "create",
|
|
935
|
+
destinationSession: input.destinationSession,
|
|
936
|
+
nextState: "pending",
|
|
937
|
+
});
|
|
783
938
|
this.transitionLog.append({
|
|
784
939
|
qitemId: id,
|
|
785
940
|
state: "pending",
|
|
786
941
|
actorSession: input.sourceSession,
|
|
787
942
|
transitionNote: "created",
|
|
788
943
|
identityProvenance: input.identityProvenance ?? null, // P21 §4 era-stamp
|
|
944
|
+
ownerNotificationKind: notification?.kind,
|
|
945
|
+
ownerNotificationLevel: notification?.level,
|
|
789
946
|
});
|
|
790
947
|
const persistedEvent = this.eventBus.persistWithinTransaction({
|
|
791
948
|
type: "queue.created",
|
|
@@ -875,12 +1032,19 @@ export class QueueRepository {
|
|
|
875
1032
|
this.persistSummary(newId, input.summary ?? null);
|
|
876
1033
|
this.persistEvidenceRef(newId, input.evidenceRef ?? null);
|
|
877
1034
|
this.persistMintingGeneration(newId, input.fromSession);
|
|
1035
|
+
const successorNotification = this.classifyOwnerNotification({
|
|
1036
|
+
action: "create",
|
|
1037
|
+
destinationSession: input.toSession,
|
|
1038
|
+
nextState: "pending",
|
|
1039
|
+
});
|
|
878
1040
|
this.transitionLog.append({
|
|
879
1041
|
qitemId: newId,
|
|
880
1042
|
state: "pending",
|
|
881
1043
|
actorSession: input.fromSession,
|
|
882
1044
|
transitionNote: `handoff from ${source.qitemId}`,
|
|
883
1045
|
identityProvenance: input.identityProvenance ?? null, // P21 §4 era-stamp
|
|
1046
|
+
ownerNotificationKind: successorNotification?.kind,
|
|
1047
|
+
ownerNotificationLevel: successorNotification?.level,
|
|
884
1048
|
});
|
|
885
1049
|
// W1-a: the durable wake intent joins the SAME transaction as the close +
|
|
886
1050
|
// successor create. If this (or anything above) throws, the whole act rolls
|
|
@@ -895,6 +1059,17 @@ export class QueueRepository {
|
|
|
895
1059
|
summary: source.summary ?? null,
|
|
896
1060
|
});
|
|
897
1061
|
events.push({ name: "queue.handed_off", payload: handoffEvent });
|
|
1062
|
+
// OPR.0.5.6.26 — a handed-off blocker actuates its attached rows through the one
|
|
1063
|
+
// propagation site, with the update path's exact effect set.
|
|
1064
|
+
for (const dependentEvent of this.propagateBlockerCompletion({
|
|
1065
|
+
qitemId: source.qitemId,
|
|
1066
|
+
terminalState: "handed-off",
|
|
1067
|
+
actorSession: input.fromSession,
|
|
1068
|
+
identityProvenance: input.identityProvenance ?? null,
|
|
1069
|
+
ts,
|
|
1070
|
+
})) {
|
|
1071
|
+
events.push({ name: "queue.updated", payload: dependentEvent });
|
|
1072
|
+
}
|
|
898
1073
|
const createdEvent = this.eventBus.persistWithinTransaction({
|
|
899
1074
|
type: "queue.created",
|
|
900
1075
|
qitemId: newId,
|
|
@@ -999,11 +1174,18 @@ export class QueueRepository {
|
|
|
999
1174
|
this.persistSummary(newId, input.summary ?? null);
|
|
1000
1175
|
this.persistEvidenceRef(newId, input.evidenceRef ?? null);
|
|
1001
1176
|
this.persistMintingGeneration(newId, input.fromSession);
|
|
1177
|
+
const successorNotification = this.classifyOwnerNotification({
|
|
1178
|
+
action: "create",
|
|
1179
|
+
destinationSession: input.toSession,
|
|
1180
|
+
nextState: "pending",
|
|
1181
|
+
});
|
|
1002
1182
|
this.transitionLog.append({
|
|
1003
1183
|
qitemId: newId,
|
|
1004
1184
|
state: "pending",
|
|
1005
1185
|
actorSession: input.fromSession,
|
|
1006
1186
|
transitionNote: `handoff-and-complete from ${source.qitemId}`,
|
|
1187
|
+
ownerNotificationKind: successorNotification?.kind,
|
|
1188
|
+
ownerNotificationLevel: successorNotification?.level,
|
|
1007
1189
|
});
|
|
1008
1190
|
// W1-a: the durable wake intent joins the SAME transaction as the close +
|
|
1009
1191
|
// successor create — one act or none (symmetric with handoff()).
|
|
@@ -1017,6 +1199,17 @@ export class QueueRepository {
|
|
|
1017
1199
|
summary: source.summary ?? null,
|
|
1018
1200
|
});
|
|
1019
1201
|
events.push({ name: "queue.handed_off", payload: handoffEvent });
|
|
1202
|
+
// OPR.0.5.6.26 — a done-via-handoff-and-complete blocker actuates its attached rows through the one
|
|
1203
|
+
// propagation site, with the update path's exact effect set (the confirmed R-2 prediction).
|
|
1204
|
+
for (const dependentEvent of this.propagateBlockerCompletion({
|
|
1205
|
+
qitemId: source.qitemId,
|
|
1206
|
+
terminalState: "done",
|
|
1207
|
+
actorSession: input.fromSession,
|
|
1208
|
+
identityProvenance: input.identityProvenance ?? null,
|
|
1209
|
+
ts,
|
|
1210
|
+
})) {
|
|
1211
|
+
events.push({ name: "queue.updated", payload: dependentEvent });
|
|
1212
|
+
}
|
|
1020
1213
|
const createdEvent = this.eventBus.persistWithinTransaction({
|
|
1021
1214
|
type: "queue.created",
|
|
1022
1215
|
qitemId: newId,
|
|
@@ -1062,9 +1255,9 @@ export class QueueRepository {
|
|
|
1062
1255
|
* `cross_host_close_conflict` (someone else closed it meanwhile —
|
|
1063
1256
|
* surface, never overwrite).
|
|
1064
1257
|
* - otherwise → close exactly like the local handoff's close leg:
|
|
1065
|
-
* `closure_reason=handed_off_to`; `closure_target` carries the
|
|
1066
|
-
*
|
|
1067
|
-
*
|
|
1258
|
+
* `closure_reason=handed_off_to`; `closure_target` carries the
|
|
1259
|
+
* host-qualified successor key `<qitem-id>@<host>` (custody metadata,
|
|
1260
|
+
* never a local lookup key); `handed_off_to`
|
|
1068
1261
|
* stays the two-part `member@rig` (BR-1 — session-string carriers
|
|
1069
1262
|
* never gain `@host`).
|
|
1070
1263
|
*/
|
|
@@ -1100,7 +1293,7 @@ export class QueueRepository {
|
|
|
1100
1293
|
state: input.terminalState,
|
|
1101
1294
|
actorSession: input.fromSession,
|
|
1102
1295
|
// BR-1: the minted note carries the TWO-PART toSession only — the
|
|
1103
|
-
// host-qualified
|
|
1296
|
+
// host-qualified successor key is allowed in closure_target and nowhere
|
|
1104
1297
|
// else, and transition_note is a durable carrier.
|
|
1105
1298
|
transitionNote: input.transitionNote ?? `cross-host handoff to ${input.toSession}`,
|
|
1106
1299
|
closureReason: "handed_off_to",
|
|
@@ -1116,6 +1309,19 @@ export class QueueRepository {
|
|
|
1116
1309
|
summary: source.summary ?? null,
|
|
1117
1310
|
});
|
|
1118
1311
|
events.push(handoffEvent);
|
|
1312
|
+
// OPR.0.5.6.26 (R2 B-1) — the cross-host terminal close is the third
|
|
1313
|
+
// handoff-family caller of the one propagation site: attached rows actuate
|
|
1314
|
+
// with the update path's exact effect set, at this close's actual terminal
|
|
1315
|
+
// state. Absorbed redrives return above this transaction and never re-run it.
|
|
1316
|
+
for (const dependentEvent of this.propagateBlockerCompletion({
|
|
1317
|
+
qitemId: input.qitemId,
|
|
1318
|
+
terminalState: input.terminalState,
|
|
1319
|
+
actorSession: input.fromSession,
|
|
1320
|
+
identityProvenance: null,
|
|
1321
|
+
ts,
|
|
1322
|
+
})) {
|
|
1323
|
+
events.push(dependentEvent);
|
|
1324
|
+
}
|
|
1119
1325
|
});
|
|
1120
1326
|
txn();
|
|
1121
1327
|
for (const e of events) {
|
|
@@ -1273,8 +1479,9 @@ export class QueueRepository {
|
|
|
1273
1479
|
*/
|
|
1274
1480
|
update(input) {
|
|
1275
1481
|
const txn = this.db.transaction(() => this.updateInTransactionalContext(input));
|
|
1276
|
-
const
|
|
1277
|
-
|
|
1482
|
+
const result = txn();
|
|
1483
|
+
for (const event of result.persistedEvents)
|
|
1484
|
+
this.eventBus.notifySubscribers(event);
|
|
1278
1485
|
return this.getByIdOrThrow(input.qitemId);
|
|
1279
1486
|
}
|
|
1280
1487
|
/**
|
|
@@ -1298,8 +1505,8 @@ export class QueueRepository {
|
|
|
1298
1505
|
* therefore applies to workflow projection unchanged.
|
|
1299
1506
|
*/
|
|
1300
1507
|
updateWithinTransaction(input) {
|
|
1301
|
-
const
|
|
1302
|
-
return { qitemId: input.qitemId,
|
|
1508
|
+
const result = this.updateInTransactionalContext(input);
|
|
1509
|
+
return { qitemId: input.qitemId, ...result };
|
|
1303
1510
|
}
|
|
1304
1511
|
/**
|
|
1305
1512
|
* Internal: closure validation + UPDATE + transition log + emit
|
|
@@ -1324,6 +1531,8 @@ export class QueueRepository {
|
|
|
1324
1531
|
|| input.closureTarget != null
|
|
1325
1532
|
|| input.handedOffTo != null
|
|
1326
1533
|
|| input.blockedOn != null
|
|
1534
|
+
|| input.wakeWatchdogId != null
|
|
1535
|
+
|| input.wakeAfterSeconds != null
|
|
1327
1536
|
|| input.summary != null
|
|
1328
1537
|
|| input.evidenceRef != null;
|
|
1329
1538
|
if (disallowed) {
|
|
@@ -1336,7 +1545,7 @@ export class QueueRepository {
|
|
|
1336
1545
|
transitionNote: input.transitionNote,
|
|
1337
1546
|
identityProvenance: input.identityProvenance ?? null,
|
|
1338
1547
|
});
|
|
1339
|
-
|
|
1548
|
+
const persistedEvent = this.eventBus.persistWithinTransaction({
|
|
1340
1549
|
type: "queue.updated",
|
|
1341
1550
|
qitemId: input.qitemId,
|
|
1342
1551
|
fromState: qitem.state,
|
|
@@ -1346,10 +1555,20 @@ export class QueueRepository {
|
|
|
1346
1555
|
actorSession: input.actorSession,
|
|
1347
1556
|
summary: qitem.summary ?? null,
|
|
1348
1557
|
});
|
|
1558
|
+
return { persistedEvent, persistedEvents: [persistedEvent] };
|
|
1349
1559
|
}
|
|
1350
1560
|
if (!isQueueState(input.state)) {
|
|
1351
1561
|
throw new QueueRepositoryError("invalid_state", `state=${input.state} not valid; valid: ${QUEUE_STATES.join(", ")}`);
|
|
1352
1562
|
}
|
|
1563
|
+
if ((input.wakeWatchdogId != null || input.wakeAfterSeconds != null) && input.state !== "blocked") {
|
|
1564
|
+
throw new QueueRepositoryError("wake_not_admitted", "a park wake persists only with state=blocked; park the row or drop the wake option");
|
|
1565
|
+
}
|
|
1566
|
+
if (input.wakeWatchdogId != null && input.wakeAfterSeconds != null) {
|
|
1567
|
+
throw new QueueRepositoryError("wake_ambiguous", "choose one explicit park wake: an existing watchdog id or an atomic timer");
|
|
1568
|
+
}
|
|
1569
|
+
if (input.wakeAfterSeconds != null && (!Number.isInteger(input.wakeAfterSeconds) || input.wakeAfterSeconds <= 0)) {
|
|
1570
|
+
throw new QueueRepositoryError("wake_after_invalid", `wakeAfterSeconds must be a positive integer (got ${input.wakeAfterSeconds})`);
|
|
1571
|
+
}
|
|
1353
1572
|
const isReopen = isGuardedTerminal && input.state !== qitem.state;
|
|
1354
1573
|
if (isReopen && !input.reopen) {
|
|
1355
1574
|
throw new QueueRepositoryError("terminal_reopen_requires_ack", `qitem ${input.qitemId} is currently '${qitem.state}'; state='${input.state}' would reopen a terminal row. Re-run deliberately with --reopen --note <reason>.`, { currentState: qitem.state, requestedState: input.state });
|
|
@@ -1451,16 +1670,19 @@ export class QueueRepository {
|
|
|
1451
1670
|
if (effectiveBlockedOn.startsWith("qitem-")) {
|
|
1452
1671
|
const blocker = this.getById(effectiveBlockedOn);
|
|
1453
1672
|
if (!blocker) {
|
|
1454
|
-
throw new QueueRepositoryError("blocker_not_found", `blocked_on names a qitem that does not exist: ${effectiveBlockedOn}. A park must name a real, live blocker — a nonexistent blocker can never complete, so the row could never unpark.`,
|
|
1673
|
+
throw new QueueRepositoryError("blocker_not_found", `blocked_on names a qitem that does not exist: ${effectiveBlockedOn}. A park must name a real, live blocker — a nonexistent blocker can never complete, so the row could never unpark.`,
|
|
1674
|
+
// F1 (error-honesty): the rejected value is named rejectedBlocker — an error payload
|
|
1675
|
+
// never carries the success-shaped blockedOn field (the field-filtered-misread class).
|
|
1676
|
+
{ rejectedBlocker: effectiveBlockedOn });
|
|
1455
1677
|
}
|
|
1456
1678
|
if (!isBlockerLive(blocker.state)) {
|
|
1457
|
-
throw new QueueRepositoryError("blocker_not_live", `blocked_on names a resolved qitem: ${effectiveBlockedOn} is '${blocker.state}'. A park must name a LIVE blocker — parking on a completed/closed row is a dead-blocker park that never self-clears.`, {
|
|
1679
|
+
throw new QueueRepositoryError("blocker_not_live", `blocked_on names a resolved qitem: ${effectiveBlockedOn} is '${blocker.state}'. A park must name a LIVE blocker — parking on a completed/closed row is a dead-blocker park that never self-clears.`, { rejectedBlocker: effectiveBlockedOn, blockerState: blocker.state });
|
|
1458
1680
|
}
|
|
1459
1681
|
}
|
|
1460
1682
|
else {
|
|
1461
1683
|
const typedPrefix = typedGateBlockerPrefix(effectiveBlockedOn);
|
|
1462
1684
|
if (typedPrefix && !isTypedGateBlocker(effectiveBlockedOn)) {
|
|
1463
|
-
throw new QueueRepositoryError("blocker_malformed", `blocked_on '${effectiveBlockedOn}' is a bare '${typedPrefix}' prefix with no gate body. A typed gate blocker must name its gate (e.g. fold:one-home+attestation).`, {
|
|
1685
|
+
throw new QueueRepositoryError("blocker_malformed", `blocked_on '${effectiveBlockedOn}' is a bare '${typedPrefix}' prefix with no gate body. A typed gate blocker must name its gate (e.g. fold:one-home+attestation).`, { rejectedBlocker: effectiveBlockedOn });
|
|
1464
1686
|
}
|
|
1465
1687
|
}
|
|
1466
1688
|
}
|
|
@@ -1480,6 +1702,43 @@ export class QueueRepository {
|
|
|
1480
1702
|
});
|
|
1481
1703
|
}
|
|
1482
1704
|
}
|
|
1705
|
+
let parkWake = null;
|
|
1706
|
+
const jobsRepo = this.watchdogJobsRepo ?? new WatchdogJobsRepository(this.db);
|
|
1707
|
+
if (input.wakeWatchdogId != null) {
|
|
1708
|
+
const job = jobsRepo.getById(input.wakeWatchdogId);
|
|
1709
|
+
if (!job || job.state !== "active") {
|
|
1710
|
+
throw new QueueRepositoryError("wake_watchdog_not_live", `watchdog ${input.wakeWatchdogId} is not an active job; attach a live watchdog or arm an atomic timer`, { wakeWatchdogId: input.wakeWatchdogId });
|
|
1711
|
+
}
|
|
1712
|
+
if (job.targetSession !== qitem.destinationSession) {
|
|
1713
|
+
throw new QueueRepositoryError("wake_watchdog_target_mismatch", `watchdog ${job.jobId} targets ${job.targetSession}, not parked owner ${qitem.destinationSession}`, { wakeWatchdogId: job.jobId, targetSession: job.targetSession, destinationSession: qitem.destinationSession });
|
|
1714
|
+
}
|
|
1715
|
+
parkWake = { kind: "watchdog", ref: job.jobId };
|
|
1716
|
+
}
|
|
1717
|
+
else if (input.wakeAfterSeconds != null) {
|
|
1718
|
+
const job = jobsRepo.register({
|
|
1719
|
+
policy: "periodic-reminder",
|
|
1720
|
+
specYaml: [
|
|
1721
|
+
"policy: periodic-reminder",
|
|
1722
|
+
"target:",
|
|
1723
|
+
` session: ${JSON.stringify(qitem.destinationSession)}`,
|
|
1724
|
+
`message: ${JSON.stringify(`Wake timer fired for parked qitem ${qitem.qitemId}. Resume the recorded continuation and update the row.`)}`,
|
|
1725
|
+
"",
|
|
1726
|
+
].join("\n"),
|
|
1727
|
+
targetSession: qitem.destinationSession,
|
|
1728
|
+
intervalSeconds: input.wakeAfterSeconds,
|
|
1729
|
+
registeredBySession: input.actorSession,
|
|
1730
|
+
});
|
|
1731
|
+
// S16 only: ordinary periodic reminders intentionally evaluate immediately.
|
|
1732
|
+
// A provider-limit timer instead starts its interval at registration so the
|
|
1733
|
+
// existing scheduler's due boundary is registeredAt + intervalSeconds.
|
|
1734
|
+
if (qitem.tags?.includes(USAGE_LIMIT_BLOCKER_TAG)) {
|
|
1735
|
+
jobsRepo.recordEvaluation(job.jobId, job.registeredAt, false);
|
|
1736
|
+
}
|
|
1737
|
+
parkWake = { kind: "timer", ref: job.jobId };
|
|
1738
|
+
}
|
|
1739
|
+
else if (input.state === "blocked" && effectiveBlockedOn?.startsWith("qitem-")) {
|
|
1740
|
+
parkWake = { kind: "blocker", ref: effectiveBlockedOn };
|
|
1741
|
+
}
|
|
1483
1742
|
const ts = new Date().toISOString();
|
|
1484
1743
|
const fromState = qitem.state;
|
|
1485
1744
|
// 0.5.1-53 Atom 1b(i) — clear-on-exit. blocked_on is set EXPLICITLY, not COALESCE'd:
|
|
@@ -1488,6 +1747,15 @@ export class QueueRepository {
|
|
|
1488
1747
|
// NULL. The prior `COALESCE(?, blocked_on)` preserved the blocker on every non-blocked
|
|
1489
1748
|
// transition, leaving dead blockers that nothing audits (the root-cause strand).
|
|
1490
1749
|
const nextBlockedOn = input.state === "blocked" ? effectiveBlockedOn : null;
|
|
1750
|
+
const notification = this.classifyOwnerNotification({
|
|
1751
|
+
action: "update",
|
|
1752
|
+
destinationSession: qitem.destinationSession,
|
|
1753
|
+
previousState: qitem.state,
|
|
1754
|
+
previousBlockedOn: qitem.blockedOn,
|
|
1755
|
+
nextState: input.state,
|
|
1756
|
+
nextBlockedOn,
|
|
1757
|
+
explicitKind: input.ownerNotificationKind,
|
|
1758
|
+
});
|
|
1491
1759
|
this.db
|
|
1492
1760
|
.prepare(`UPDATE queue_items
|
|
1493
1761
|
SET state = ?,
|
|
@@ -1505,7 +1773,7 @@ export class QueueRepository {
|
|
|
1505
1773
|
this.persistSummary(input.qitemId, input.summary ?? null);
|
|
1506
1774
|
this.persistEvidenceRef(input.qitemId, input.evidenceRef ?? null);
|
|
1507
1775
|
}
|
|
1508
|
-
this.transitionLog.append({
|
|
1776
|
+
const transition = this.transitionLog.append({
|
|
1509
1777
|
qitemId: input.qitemId,
|
|
1510
1778
|
state: input.state,
|
|
1511
1779
|
actorSession: input.actorSession,
|
|
@@ -1513,39 +1781,34 @@ export class QueueRepository {
|
|
|
1513
1781
|
closureReason: validation.closureReason ?? undefined,
|
|
1514
1782
|
closureTarget: validation.closureTarget ?? undefined,
|
|
1515
1783
|
identityProvenance: input.identityProvenance ?? null, // P21 §4 era-stamp
|
|
1784
|
+
ownerNotificationKind: notification?.kind,
|
|
1785
|
+
ownerNotificationLevel: notification?.level,
|
|
1516
1786
|
});
|
|
1787
|
+
if (parkWake) {
|
|
1788
|
+
this.wakeRepo.record({
|
|
1789
|
+
transitionId: transition.transitionId,
|
|
1790
|
+
qitemId: input.qitemId,
|
|
1791
|
+
phase: "armed",
|
|
1792
|
+
kind: parkWake.kind,
|
|
1793
|
+
ref: parkWake.ref,
|
|
1794
|
+
deliveryStatus: null,
|
|
1795
|
+
});
|
|
1796
|
+
}
|
|
1517
1797
|
// 0.5.1-53 Atom 1b(iii) — propagate-completion. blocked_on PROMISES "A waits until B completes";
|
|
1518
1798
|
// that promise never fired on this runtime (rows sat blocked on done/canceled blockers for days).
|
|
1519
1799
|
// When THIS qitem reaches a terminal state, auto-unpark every row parked on it (blocked_on = this,
|
|
1520
1800
|
// state='blocked') to pending, clear its (now-resolved) blocker, log the transition, and emit an
|
|
1521
1801
|
// event so watchers/sweeps see the unblock without a fetch.
|
|
1522
|
-
|
|
1523
|
-
|
|
1524
|
-
.
|
|
1525
|
-
|
|
1526
|
-
|
|
1527
|
-
|
|
1528
|
-
|
|
1529
|
-
|
|
1530
|
-
|
|
1531
|
-
|
|
1532
|
-
state: "pending",
|
|
1533
|
-
actorSession: input.actorSession,
|
|
1534
|
-
transitionNote: `auto-unparked: blocker ${input.qitemId} reached terminal state '${input.state}'`,
|
|
1535
|
-
});
|
|
1536
|
-
this.eventBus.persistWithinTransaction({
|
|
1537
|
-
type: "queue.updated",
|
|
1538
|
-
qitemId: r.qitem_id,
|
|
1539
|
-
fromState: "blocked",
|
|
1540
|
-
toState: "pending",
|
|
1541
|
-
closureReason: null,
|
|
1542
|
-
closureTarget: null,
|
|
1543
|
-
actorSession: input.actorSession,
|
|
1544
|
-
summary: null,
|
|
1545
|
-
});
|
|
1546
|
-
}
|
|
1547
|
-
}
|
|
1548
|
-
return this.eventBus.persistWithinTransaction({
|
|
1802
|
+
const dependentEvents = !isBlockerLive(input.state)
|
|
1803
|
+
? this.propagateBlockerCompletion({
|
|
1804
|
+
qitemId: input.qitemId,
|
|
1805
|
+
terminalState: input.state,
|
|
1806
|
+
actorSession: input.actorSession,
|
|
1807
|
+
identityProvenance: input.identityProvenance ?? null,
|
|
1808
|
+
ts,
|
|
1809
|
+
})
|
|
1810
|
+
: [];
|
|
1811
|
+
const persistedEvent = this.eventBus.persistWithinTransaction({
|
|
1549
1812
|
type: "queue.updated",
|
|
1550
1813
|
qitemId: input.qitemId,
|
|
1551
1814
|
fromState,
|
|
@@ -1557,12 +1820,125 @@ export class QueueRepository {
|
|
|
1557
1820
|
// (park-time summary included) so surfaces refresh without a fetch.
|
|
1558
1821
|
summary: effectiveSummary ?? null,
|
|
1559
1822
|
});
|
|
1823
|
+
return { persistedEvent, persistedEvents: [...dependentEvents, persistedEvent] };
|
|
1824
|
+
}
|
|
1825
|
+
/** OPR.0.5.6.26 — THE ONE PROPAGATION SITE. blocked_on promises "A waits until B
|
|
1826
|
+
* completes"; every terminal closure of a blocker actuates the attached rows'
|
|
1827
|
+
* auto-unpark through THIS helper — the update path and the handoff family both
|
|
1828
|
+
* call it inside their own transactions. The class this unifies away was
|
|
1829
|
+
* per-code-path: the handoff verbs wrote terminal states via direct SQL and the
|
|
1830
|
+
* promise never fired for them. Never a second copy of this logic. */
|
|
1831
|
+
propagateBlockerCompletion(input) {
|
|
1832
|
+
const dependentEvents = [];
|
|
1833
|
+
const blockedRows = this.db
|
|
1834
|
+
.prepare("SELECT qitem_id, destination_session FROM queue_items WHERE blocked_on = ? AND state = 'blocked'")
|
|
1835
|
+
.all(input.qitemId);
|
|
1836
|
+
for (const r of blockedRows) {
|
|
1837
|
+
this.db
|
|
1838
|
+
.prepare("UPDATE queue_items SET state = 'pending', blocked_on = NULL, ts_updated = ? WHERE qitem_id = ?")
|
|
1839
|
+
.run(input.ts, r.qitem_id);
|
|
1840
|
+
const resumeTransition = this.transitionLog.append({
|
|
1841
|
+
qitemId: r.qitem_id,
|
|
1842
|
+
state: "pending",
|
|
1843
|
+
actorSession: input.actorSession,
|
|
1844
|
+
transitionNote: `auto-unparked: blocker ${input.qitemId} reached terminal state '${input.terminalState}'`,
|
|
1845
|
+
});
|
|
1846
|
+
const wakeIntentId = this.stageAutoUnparkWakeIntent({
|
|
1847
|
+
qitemId: r.qitem_id,
|
|
1848
|
+
destinationSession: r.destination_session,
|
|
1849
|
+
fromSession: input.actorSession,
|
|
1850
|
+
identityProvenance: input.identityProvenance,
|
|
1851
|
+
blockerQitemId: input.qitemId,
|
|
1852
|
+
resumeTransitionId: resumeTransition.transitionId,
|
|
1853
|
+
});
|
|
1854
|
+
if (wakeIntentId)
|
|
1855
|
+
this.deliverWakeIntentAfterCommit(wakeIntentId);
|
|
1856
|
+
const dependentEvent = this.eventBus.persistWithinTransaction({
|
|
1857
|
+
type: "queue.updated",
|
|
1858
|
+
qitemId: r.qitem_id,
|
|
1859
|
+
fromState: "blocked",
|
|
1860
|
+
toState: "pending",
|
|
1861
|
+
closureReason: null,
|
|
1862
|
+
closureTarget: null,
|
|
1863
|
+
actorSession: input.actorSession,
|
|
1864
|
+
summary: this.getById(r.qitem_id)?.summary ?? null,
|
|
1865
|
+
});
|
|
1866
|
+
this.eventBus.registerPersistedWithinActiveEnvelope(dependentEvent);
|
|
1867
|
+
dependentEvents.push(dependentEvent);
|
|
1868
|
+
}
|
|
1869
|
+
return dependentEvents;
|
|
1870
|
+
}
|
|
1871
|
+
getParkWakeStatus(qitemId) {
|
|
1872
|
+
return this.wakeRepo.getStatus(qitemId);
|
|
1873
|
+
}
|
|
1874
|
+
listTransitions(qitemId) {
|
|
1875
|
+
return this.transitionLog.listForQitem(qitemId).map((transition) => {
|
|
1876
|
+
const wake = this.wakeRepo.getForTransition(transition.transitionId);
|
|
1877
|
+
return wake ? { ...transition, wake } : transition;
|
|
1878
|
+
});
|
|
1879
|
+
}
|
|
1880
|
+
/** Called by the watchdog engine after the delivery attempt is durably
|
|
1881
|
+
* audited. The queue transition records that attempt independently of
|
|
1882
|
+
* whether the HELD row's owner consumed it. */
|
|
1883
|
+
recordWatchdogWakeAttempt(jobId, deliveryStatus) {
|
|
1884
|
+
const targets = this.wakeRepo.findBlockedQitemsByWatchdog(jobId);
|
|
1885
|
+
if (targets.length === 0)
|
|
1886
|
+
return;
|
|
1887
|
+
const recordFired = ({ qitemId, kind }) => {
|
|
1888
|
+
const transition = this.transitionLog.append({
|
|
1889
|
+
qitemId,
|
|
1890
|
+
state: "blocked",
|
|
1891
|
+
actorSession: "watchdog@system",
|
|
1892
|
+
transitionNote: `park wake fired: watchdog ${jobId}; delivery=${deliveryStatus}; awaiting owner consumption`,
|
|
1893
|
+
});
|
|
1894
|
+
this.wakeRepo.record({
|
|
1895
|
+
transitionId: transition.transitionId,
|
|
1896
|
+
qitemId,
|
|
1897
|
+
phase: "fired",
|
|
1898
|
+
kind,
|
|
1899
|
+
ref: jobId,
|
|
1900
|
+
deliveryStatus,
|
|
1901
|
+
});
|
|
1902
|
+
return this.eventBus.persistWithinTransaction({
|
|
1903
|
+
type: "queue.updated",
|
|
1904
|
+
qitemId,
|
|
1905
|
+
fromState: "blocked",
|
|
1906
|
+
toState: "blocked",
|
|
1907
|
+
closureReason: null,
|
|
1908
|
+
closureTarget: null,
|
|
1909
|
+
actorSession: "watchdog@system",
|
|
1910
|
+
summary: this.getById(qitemId)?.summary ?? null,
|
|
1911
|
+
});
|
|
1912
|
+
};
|
|
1913
|
+
const usageLimitBlockers = targets.filter(({ qitemId }) => this.getById(qitemId)?.tags?.includes(USAGE_LIMIT_BLOCKER_TAG));
|
|
1914
|
+
const events = this.db.transaction(() => {
|
|
1915
|
+
const firedEvents = targets.map(recordFired);
|
|
1916
|
+
if (usageLimitBlockers.length === 0)
|
|
1917
|
+
return firedEvents;
|
|
1918
|
+
(this.watchdogJobsRepo ?? new WatchdogJobsRepository(this.db)).markTerminal(jobId, "usage_limit_expiry_fired");
|
|
1919
|
+
const resolutionEvents = usageLimitBlockers.flatMap(({ qitemId }) => this.updateInTransactionalContext({
|
|
1920
|
+
qitemId,
|
|
1921
|
+
actorSession: "watchdog@system",
|
|
1922
|
+
state: "done",
|
|
1923
|
+
closureReason: "no-follow-on",
|
|
1924
|
+
transitionNote: `provider-limit timer ${jobId} reached its expiry; resolving the shared blocker once`,
|
|
1925
|
+
}).persistedEvents);
|
|
1926
|
+
return [...firedEvents, ...resolutionEvents];
|
|
1927
|
+
})();
|
|
1928
|
+
for (const event of events)
|
|
1929
|
+
this.eventBus.notifySubscribers(event);
|
|
1560
1930
|
}
|
|
1561
1931
|
getById(qitemId) {
|
|
1562
1932
|
const row = this.db
|
|
1563
1933
|
.prepare("SELECT * FROM queue_items WHERE qitem_id = ?")
|
|
1564
1934
|
.get(qitemId);
|
|
1565
|
-
|
|
1935
|
+
if (!row)
|
|
1936
|
+
return null;
|
|
1937
|
+
const item = this.rowToItem(row);
|
|
1938
|
+
// OPR.0.5.6.14 — the row FACE answers "did it reach them" in one read for
|
|
1939
|
+
// gateway-routed rows; null for pane-bound (absence-governed, no key lies).
|
|
1940
|
+
const ledger = this.deliveryOutcomeFor(item.qitemId);
|
|
1941
|
+
return { ...item, deliveryOutcome: ledger?.outcome ?? null };
|
|
1566
1942
|
}
|
|
1567
1943
|
list(opts) {
|
|
1568
1944
|
const limit = opts?.limit ?? 100;
|
|
@@ -1608,7 +1984,11 @@ export class QueueRepository {
|
|
|
1608
1984
|
const rows = this.db
|
|
1609
1985
|
.prepare(`SELECT ${columns} FROM queue_items ${where} ORDER BY ${orderBy} LIMIT ?`)
|
|
1610
1986
|
.all(...params);
|
|
1611
|
-
const items = rows.map((r) =>
|
|
1987
|
+
const items = rows.map((r) => {
|
|
1988
|
+
const item = this.rowToItem(r);
|
|
1989
|
+
const ledger = this.deliveryOutcomeFor(item.qitemId);
|
|
1990
|
+
return { ...item, deliveryOutcome: ledger?.outcome ?? null };
|
|
1991
|
+
});
|
|
1612
1992
|
return opts?.compact
|
|
1613
1993
|
? items.map((item) => ({
|
|
1614
1994
|
...item,
|
|
@@ -1726,22 +2106,34 @@ export class QueueRepository {
|
|
|
1726
2106
|
return rows.map((r) => this.rowToItem(r));
|
|
1727
2107
|
}
|
|
1728
2108
|
/**
|
|
1729
|
-
*
|
|
1730
|
-
*
|
|
1731
|
-
*
|
|
1732
|
-
*
|
|
1733
|
-
*
|
|
1734
|
-
*
|
|
1735
|
-
* V1-ONLY predicate, NO false-positive mode: `state='pending' AND last_nudge_result LIKE 'failed:%'`.
|
|
1736
|
-
* - A delivered row (`verified` / `delivered-ack-pending`) is excluded — it was woken.
|
|
1737
|
-
* - A NEVER-ATTEMPTED row (`last_nudge_result IS NULL` — a deliberate cold-park or a no-transport create)
|
|
1738
|
-
* is excluded. That class is FP-dominated (a legitimate cold-park is indistinguishable from a real
|
|
1739
|
-
* never-reached strand at the row) and stays DEFERRED behind a forward create-time intent bit; surfacing
|
|
1740
|
-
* it here would train the reader to ignore the signal. The reason it is excluded lives in this comment
|
|
1741
|
-
* AND the PRD, not in chat — it must outlive the excluder.
|
|
2109
|
+
* Surface two evidence-backed undelivered classes: the original pending
|
|
2110
|
+
* create-path nudge failures, and active human-notification episodes whose
|
|
2111
|
+
* gateway ledger says transport-failed or receiptless past the post window.
|
|
2112
|
+
* A generic null nudge is still excluded; only a structured OWNER episode
|
|
2113
|
+
* makes that absence meaningful. READ only — no retry or unwind.
|
|
1742
2114
|
*/
|
|
1743
2115
|
findUndelivered(opts) {
|
|
1744
|
-
|
|
2116
|
+
// OPR.0.5.6.14 — delivery truth belongs to the CURRENT human-notification
|
|
2117
|
+
// episode, not to the row's whole history. Pull every active row that can
|
|
2118
|
+
// carry a current episode or a legacy nudge/receipt, then derive/filter in
|
|
2119
|
+
// JS. LIMIT is applied after that filtering so historical POSTED episodes
|
|
2120
|
+
// cannot consume the window and hide a later failure.
|
|
2121
|
+
const ownerEpisodeCandidate = this.hasOwnerNotificationColumns
|
|
2122
|
+
? `EXISTS (SELECT 1 FROM queue_transitions owner_episode
|
|
2123
|
+
WHERE owner_episode.qitem_id = queue_items.qitem_id
|
|
2124
|
+
AND owner_episode.owner_notification_level IS NOT NULL)`
|
|
2125
|
+
: "0";
|
|
2126
|
+
const conditions = [
|
|
2127
|
+
"state IN ('pending', 'in-progress', 'blocked')",
|
|
2128
|
+
`((state = 'pending' AND (last_nudge_result LIKE 'failed:%'
|
|
2129
|
+
OR last_nudge_result LIKE 'unroutable:%'
|
|
2130
|
+
OR last_nudge_result LIKE 'gateway-owned%'))
|
|
2131
|
+
OR ${ownerEpisodeCandidate}
|
|
2132
|
+
OR EXISTS (SELECT 1 FROM queue_transitions receipt
|
|
2133
|
+
WHERE receipt.qitem_id = queue_items.qitem_id
|
|
2134
|
+
AND (receipt.transition_note LIKE 'slack-owner-notification-posted %'
|
|
2135
|
+
OR receipt.transition_note LIKE 'slack-owner-notification-transport-failed %')))`,
|
|
2136
|
+
];
|
|
1745
2137
|
const params = [];
|
|
1746
2138
|
if (opts?.rig) {
|
|
1747
2139
|
const escaped = opts.rig.replace(/%/g, "\\%").replace(/_/g, "\\_");
|
|
@@ -1749,14 +2141,141 @@ export class QueueRepository {
|
|
|
1749
2141
|
params.push(`%@${escaped}`, `%@${escaped}`);
|
|
1750
2142
|
}
|
|
1751
2143
|
const columns = opts?.compact ? COMPACT_QUEUE_COLUMNS : "*";
|
|
1752
|
-
|
|
1753
|
-
if (opts?.limit !== undefined) {
|
|
1754
|
-
sql += " LIMIT ?";
|
|
1755
|
-
params.push(opts.limit);
|
|
1756
|
-
}
|
|
2144
|
+
const sql = `SELECT ${columns} FROM queue_items WHERE ${conditions.join(" AND ")} ORDER BY ts_created ASC`;
|
|
1757
2145
|
const rows = this.db.prepare(sql).all(...params);
|
|
1758
|
-
|
|
2146
|
+
const out = [];
|
|
2147
|
+
for (const r of rows) {
|
|
2148
|
+
const item = this.rowToItem(r);
|
|
2149
|
+
const ledger = this.deliveryOutcomeFor(item.qitemId);
|
|
2150
|
+
if (ledger?.outcome === "posted")
|
|
2151
|
+
continue; // the receipt wins, always
|
|
2152
|
+
if (ledger?.outcome === "transport-failed") {
|
|
2153
|
+
out.push({
|
|
2154
|
+
...item,
|
|
2155
|
+
deliveryOutcome: "transport-failed",
|
|
2156
|
+
deliveryFailureClass: "transport-failed",
|
|
2157
|
+
deliveryFailureDetail: ledger.detail,
|
|
2158
|
+
});
|
|
2159
|
+
}
|
|
2160
|
+
else if (ledger?.outcome === "never-posted") {
|
|
2161
|
+
out.push({
|
|
2162
|
+
...item,
|
|
2163
|
+
deliveryOutcome: "never-posted",
|
|
2164
|
+
deliveryFailureClass: "never-posted",
|
|
2165
|
+
deliveryFailureDetail: ledger.detail,
|
|
2166
|
+
});
|
|
2167
|
+
}
|
|
2168
|
+
else {
|
|
2169
|
+
// No ledger verdict: only the legacy pending failed/unroutable class is
|
|
2170
|
+
// undelivered. An active non-human row can still have an old OWNER
|
|
2171
|
+
// transition; that historical episode is not a current obligation.
|
|
2172
|
+
const lastNudge = item.lastNudgeResult ?? "";
|
|
2173
|
+
if (item.state === "pending" && (lastNudge.startsWith("failed:") || lastNudge.startsWith("unroutable:"))) {
|
|
2174
|
+
out.push(item);
|
|
2175
|
+
}
|
|
2176
|
+
}
|
|
2177
|
+
if (opts?.limit !== undefined && out.length >= opts.limit)
|
|
2178
|
+
break;
|
|
2179
|
+
}
|
|
2180
|
+
return out;
|
|
1759
2181
|
}
|
|
2182
|
+
/** OPR.0.5.6.14 — terminal transport is a CAPABILITY, not topology presence.
|
|
2183
|
+
* An exact session or composed canonical seat is pane-bound only when its
|
|
2184
|
+
* node carries an explicit tmux binding. external_cli is paneless and must
|
|
2185
|
+
* continue to the human-registry/gateway leg. FAIL-OPEN only where the DB
|
|
2186
|
+
* cannot carry classification evidence (empty/partial bootstrap schemas). */
|
|
2187
|
+
hasTerminalTransport(dest) {
|
|
2188
|
+
try {
|
|
2189
|
+
const anyTopology = this.db.prepare("SELECT 1 FROM sessions LIMIT 1").get()
|
|
2190
|
+
?? this.db.prepare("SELECT 1 FROM nodes LIMIT 1").get();
|
|
2191
|
+
if (!anyTopology)
|
|
2192
|
+
return true;
|
|
2193
|
+
if (this.db.prepare(`SELECT 1 FROM sessions s JOIN bindings b ON b.node_id = s.node_id
|
|
2194
|
+
WHERE s.session_name = ?
|
|
2195
|
+
AND COALESCE(b.attachment_type, 'tmux') = 'tmux'
|
|
2196
|
+
AND b.tmux_session IS NOT NULL LIMIT 1`).get(dest))
|
|
2197
|
+
return true;
|
|
2198
|
+
const at = dest.lastIndexOf("@");
|
|
2199
|
+
if (at <= 0)
|
|
2200
|
+
return true; // non-canonical shapes stay on the legacy path
|
|
2201
|
+
const seat = dest.slice(0, at);
|
|
2202
|
+
const rig = dest.slice(at + 1);
|
|
2203
|
+
const composed = this.db.prepare(`SELECT 1 FROM nodes n
|
|
2204
|
+
JOIN rigs r ON r.id = n.rig_id
|
|
2205
|
+
JOIN bindings b ON b.node_id = n.id
|
|
2206
|
+
WHERE r.name = ? AND REPLACE(n.logical_id, '.', '-') = ?
|
|
2207
|
+
AND COALESCE(b.attachment_type, 'tmux') = 'tmux'
|
|
2208
|
+
AND b.tmux_session IS NOT NULL LIMIT 1`).get(rig, seat);
|
|
2209
|
+
return !!composed;
|
|
2210
|
+
}
|
|
2211
|
+
catch {
|
|
2212
|
+
return true; // schema-partial fixture DB: never discriminate without evidence
|
|
2213
|
+
}
|
|
2214
|
+
}
|
|
2215
|
+
/** Null means legacy/no OWNER history; inactive means OWNER history exists
|
|
2216
|
+
* but the row no longer projects a current human-notification episode. */
|
|
2217
|
+
currentDeliveryEpisode(item) {
|
|
2218
|
+
const transition = this.transitionLog.latestOwnerNotificationForQitem(item.qitemId);
|
|
2219
|
+
if (!transition)
|
|
2220
|
+
return null;
|
|
2221
|
+
const registry = this.loadHumanRegistryFn();
|
|
2222
|
+
if (!registry.ok)
|
|
2223
|
+
return "inactive";
|
|
2224
|
+
const humanAddress = transition.ownerNotificationKind === "human-decision-resolved"
|
|
2225
|
+
? resolveRegisteredHumanAddress(transition.actorSession, registry.entities)
|
|
2226
|
+
: item.state === "blocked"
|
|
2227
|
+
? resolveRegisteredHumanAddress(item.blockedOn, registry.entities)
|
|
2228
|
+
: resolveRegisteredHumanAddress(item.destinationSession, registry.entities);
|
|
2229
|
+
return humanAddress
|
|
2230
|
+
? { notificationKey: `${item.qitemId}:${transition.transitionId}`, startedAt: transition.ts }
|
|
2231
|
+
: "inactive";
|
|
2232
|
+
}
|
|
2233
|
+
/** OPR.0.5.6.14 — derive the current episode's delivery ledger. Receipt
|
|
2234
|
+
* transitions are same-row but keyed by qitemId:OWNER-transitionId; an old
|
|
2235
|
+
* posted receipt cannot mask a later human park. Legacy pre-OWNER or literal
|
|
2236
|
+
* external rows retain their row-scoped fallback. */
|
|
2237
|
+
deliveryOutcomeFor(qitemId) {
|
|
2238
|
+
// Some repository-only fixtures intentionally model the pre-transition
|
|
2239
|
+
// schema. Delivery projection is additive there: absence means no verdict,
|
|
2240
|
+
// never a list failure.
|
|
2241
|
+
if (!this.hasQueueTransitionsTable)
|
|
2242
|
+
return null;
|
|
2243
|
+
const row = this.db.prepare("SELECT * FROM queue_items WHERE qitem_id = ?")
|
|
2244
|
+
.get(qitemId);
|
|
2245
|
+
if (!row)
|
|
2246
|
+
return null;
|
|
2247
|
+
const item = this.rowToItem(row);
|
|
2248
|
+
const episodeState = this.currentDeliveryEpisode(item);
|
|
2249
|
+
if (episodeState === "inactive")
|
|
2250
|
+
return null;
|
|
2251
|
+
const episode = episodeState;
|
|
2252
|
+
const notes = this.db.prepare(`SELECT transition_note FROM queue_transitions
|
|
2253
|
+
WHERE qitem_id = ? AND (transition_note LIKE 'slack-owner-notification-posted %'
|
|
2254
|
+
OR transition_note LIKE 'slack-owner-notification-transport-failed %')
|
|
2255
|
+
ORDER BY transition_id DESC`).all(qitemId);
|
|
2256
|
+
const currentNotes = episode
|
|
2257
|
+
? notes.filter((note) => note.transition_note.split(/\s+/).includes(`notification_key=${episode.notificationKey}`))
|
|
2258
|
+
: notes;
|
|
2259
|
+
const posted = currentNotes.find((note) => note.transition_note.startsWith("slack-owner-notification-posted "));
|
|
2260
|
+
if (posted)
|
|
2261
|
+
return { outcome: "posted", detail: posted.transition_note };
|
|
2262
|
+
const failed = currentNotes.find((note) => note.transition_note.startsWith("slack-owner-notification-transport-failed "));
|
|
2263
|
+
if (failed)
|
|
2264
|
+
return { outcome: "transport-failed", detail: failed.transition_note };
|
|
2265
|
+
const startedAt = episode?.startedAt ?? item.tsCreated;
|
|
2266
|
+
const gatewayRouted = episode !== null || item.lastNudgeResult?.startsWith("gateway-owned") === true;
|
|
2267
|
+
if (gatewayRouted) {
|
|
2268
|
+
const ageMs = Date.now() - new Date(startedAt.includes("T") ? startedAt : startedAt + "Z").getTime();
|
|
2269
|
+
if (ageMs > QueueRepository.NEVER_POSTED_WINDOW_MS) {
|
|
2270
|
+
const key = episode ? ` for notification_key=${episode.notificationKey}` : "";
|
|
2271
|
+
return { outcome: "never-posted", detail: `gateway-routed row with no delivery receipt${key} past the post window` };
|
|
2272
|
+
}
|
|
2273
|
+
}
|
|
2274
|
+
return null;
|
|
2275
|
+
}
|
|
2276
|
+
/** The grace window before a receiptless gateway-routed row honestly reads
|
|
2277
|
+
* never-posted (the connector sweep cadence bounds normal posting latency). */
|
|
2278
|
+
static NEVER_POSTED_WINDOW_MS = 120_000;
|
|
1760
2279
|
recordNudgeAttempt(qitemId, result) {
|
|
1761
2280
|
const ts = new Date().toISOString();
|
|
1762
2281
|
this.db
|
|
@@ -1765,12 +2284,6 @@ export class QueueRepository {
|
|
|
1765
2284
|
WHERE qitem_id = ?`)
|
|
1766
2285
|
.run(ts, result, qitemId);
|
|
1767
2286
|
}
|
|
1768
|
-
recordHeartbeat(qitemId) {
|
|
1769
|
-
const ts = new Date().toISOString();
|
|
1770
|
-
this.db
|
|
1771
|
-
.prepare(`UPDATE queue_items SET last_heartbeat = ? WHERE qitem_id = ?`)
|
|
1772
|
-
.run(ts, qitemId);
|
|
1773
|
-
}
|
|
1774
2287
|
/**
|
|
1775
2288
|
* Pod-fallback: redirect qitem to a fallback destination (e.g., when a seat
|
|
1776
2289
|
* is unreachable). Emits qitem.fallback_routed; preserves chain_of_record.
|
|
@@ -1881,8 +2394,31 @@ export class QueueRepository {
|
|
|
1881
2394
|
txn();
|
|
1882
2395
|
return rows.length;
|
|
1883
2396
|
}
|
|
2397
|
+
/** S04 — substantive post-claim motion: transitions strictly after the claim, excluding the
|
|
2398
|
+
* claim's own 'claimed' transition. Lazily prepared; indexed on qitem_id. */
|
|
2399
|
+
postClaimMotionStmt;
|
|
2400
|
+
postClaimMotionCount(qitemId, claimedAt) {
|
|
2401
|
+
this.postClaimMotionStmt ??= this.db.prepare("SELECT COUNT(*) AS n FROM queue_transitions WHERE qitem_id = ? AND ts > ? AND transition_note IS NOT 'claimed'");
|
|
2402
|
+
try {
|
|
2403
|
+
return this.postClaimMotionStmt.get(qitemId, claimedAt).n;
|
|
2404
|
+
}
|
|
2405
|
+
catch {
|
|
2406
|
+
return 0; // minimal fixture DBs without the transitions table: degrade, never throw
|
|
2407
|
+
}
|
|
2408
|
+
}
|
|
1884
2409
|
rowToItem(row) {
|
|
2410
|
+
// S04 — derive the pickup receipt at the ONE shared projection point (list/show/overdue
|
|
2411
|
+
// all flow through here), so the park-vs-strand question is answered by the row face.
|
|
2412
|
+
const pickup = derivePickup({
|
|
2413
|
+
state: row.state,
|
|
2414
|
+
claimedAt: row.claimed_at,
|
|
2415
|
+
lastHeartbeat: row.last_heartbeat,
|
|
2416
|
+
postClaimMotionCount: row.claimed_at && row.state !== "blocked"
|
|
2417
|
+
? this.postClaimMotionCount(row.qitem_id, row.claimed_at)
|
|
2418
|
+
: 0,
|
|
2419
|
+
});
|
|
1885
2420
|
return {
|
|
2421
|
+
pickup,
|
|
1886
2422
|
qitemId: row.qitem_id,
|
|
1887
2423
|
tsCreated: row.ts_created,
|
|
1888
2424
|
tsUpdated: row.ts_updated,
|