@openrig/cli 0.5.5 → 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/plugins/openrig-core/hooks/scripts/refocus.cjs +81 -4
- 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 +24 -25
- package/daemon/assets/plugins/openrig-core/skills/openrig-operating-model/SKILL.md +5 -12
- package/daemon/assets/plugins/openrig-core/skills/openrig-operating-model/scripts/compose.py +36 -117
- package/daemon/assets/plugins/openrig-core/skills/openrig-skills/SKILL.md +9 -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/scripts/trace-to-root.py +50 -7
- package/daemon/assets/plugins/openrig-core/skills/retiring-and-inheriting-a-seat/SKILL.md +29 -9
- 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 +4 -1
- package/daemon/context-packs/onboarding-width/public-reference-material.md +1 -1
- package/daemon/context-packs/skills/core/agent-starters/manifest.yaml +2 -1
- package/daemon/context-packs/skills/core/agent-startup-and-context-ingestion/SKILL.md +1 -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/SKILL.md +15 -21
- package/daemon/context-packs/skills/pm/requirements-writer/manifest.yaml +4 -3
- 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 +15 -2
- package/daemon/context-packs/world-example/your-world.md +19 -2
- 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/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 +8 -2
- package/daemon/dist/db/all-migrations.js.map +1 -1
- 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/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/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/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-subsystem.d.ts +6 -2
- package/daemon/dist/domain/gateway/gateway-subsystem.d.ts.map +1 -1
- package/daemon/dist/domain/gateway/gateway-subsystem.js +5 -3
- package/daemon/dist/domain/gateway/gateway-subsystem.js.map +1 -1
- package/daemon/dist/domain/gateway/human-registry.d.ts +9 -1
- package/daemon/dist/domain/gateway/human-registry.d.ts.map +1 -1
- package/daemon/dist/domain/gateway/human-registry.js +32 -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/daemon/dist/domain/gateway/slack/config.d.ts +3 -2
- package/daemon/dist/domain/gateway/slack/config.d.ts.map +1 -1
- package/daemon/dist/domain/gateway/slack/config.js +20 -4
- package/daemon/dist/domain/gateway/slack/config.js.map +1 -1
- package/daemon/dist/domain/gateway/slack/inbound.d.ts +34 -6
- package/daemon/dist/domain/gateway/slack/inbound.d.ts.map +1 -1
- package/daemon/dist/domain/gateway/slack/inbound.js +60 -9
- package/daemon/dist/domain/gateway/slack/inbound.js.map +1 -1
- package/daemon/dist/domain/gateway/slack/outbound-driver.d.ts +3 -0
- package/daemon/dist/domain/gateway/slack/outbound-driver.d.ts.map +1 -1
- package/daemon/dist/domain/gateway/slack/outbound-driver.js +12 -5
- package/daemon/dist/domain/gateway/slack/outbound-driver.js.map +1 -1
- package/daemon/dist/domain/gateway/slack/queue-access.d.ts +10 -5
- package/daemon/dist/domain/gateway/slack/queue-access.d.ts.map +1 -1
- package/daemon/dist/domain/gateway/slack/queue-access.js +46 -19
- package/daemon/dist/domain/gateway/slack/queue-access.js.map +1 -1
- package/daemon/dist/domain/gateway/slack/slack-api.d.ts +29 -6
- package/daemon/dist/domain/gateway/slack/slack-api.d.ts.map +1 -1
- package/daemon/dist/domain/gateway/slack/slack-api.js +41 -3
- package/daemon/dist/domain/gateway/slack/slack-api.js.map +1 -1
- package/daemon/dist/domain/gateway/slack/slack-delivery.d.ts +9 -3
- package/daemon/dist/domain/gateway/slack/slack-delivery.d.ts.map +1 -1
- package/daemon/dist/domain/gateway/slack/slack-delivery.js +132 -12
- package/daemon/dist/domain/gateway/slack/slack-delivery.js.map +1 -1
- package/daemon/dist/domain/gateway/slack/slack-subsystem.d.ts +10 -0
- package/daemon/dist/domain/gateway/slack/slack-subsystem.d.ts.map +1 -1
- package/daemon/dist/domain/gateway/slack/slack-subsystem.js +286 -11
- package/daemon/dist/domain/gateway/slack/slack-subsystem.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 +45 -48
- package/daemon/dist/domain/node-inventory.js.map +1 -1
- package/daemon/dist/domain/parked-query.d.ts +1 -0
- package/daemon/dist/domain/parked-query.d.ts.map +1 -1
- package/daemon/dist/domain/parked-query.js +1 -0
- package/daemon/dist/domain/parked-query.js.map +1 -1
- 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.map +1 -1
- package/daemon/dist/domain/queue-pickup.js +5 -0
- package/daemon/dist/domain/queue-pickup.js.map +1 -1
- package/daemon/dist/domain/queue-repository.d.ts +55 -18
- package/daemon/dist/domain/queue-repository.d.ts.map +1 -1
- package/daemon/dist/domain/queue-repository.js +387 -83
- 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 +24 -1
- package/daemon/dist/domain/queue-stuck-sweep.d.ts.map +1 -1
- package/daemon/dist/domain/queue-stuck-sweep.js +161 -24
- package/daemon/dist/domain/queue-stuck-sweep.js.map +1 -1
- 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 +20 -2
- package/daemon/dist/domain/queue-wake-ladder.d.ts.map +1 -1
- package/daemon/dist/domain/queue-wake-ladder.js +187 -15
- package/daemon/dist/domain/queue-wake-ladder.js.map +1 -1
- package/daemon/dist/domain/queue-wake-repository.d.ts +16 -0
- package/daemon/dist/domain/queue-wake-repository.d.ts.map +1 -1
- package/daemon/dist/domain/queue-wake-repository.js +52 -3
- package/daemon/dist/domain/queue-wake-repository.js.map +1 -1
- 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/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 +4 -0
- package/daemon/dist/domain/rigspec-instantiator.d.ts.map +1 -1
- package/daemon/dist/domain/rigspec-instantiator.js +14 -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/scope-audit.d.ts +5 -2
- package/daemon/dist/domain/scope/scope-audit.d.ts.map +1 -1
- package/daemon/dist/domain/scope/scope-audit.js +3 -3
- package/daemon/dist/domain/scope/scope-audit.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/types.d.ts +26 -4
- package/daemon/dist/domain/types.d.ts.map +1 -1
- package/daemon/dist/domain/types.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 +24 -0
- 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 +40 -1
- package/daemon/dist/domain/watchdog-policy-engine.d.ts.map +1 -1
- package/daemon/dist/domain/watchdog-policy-engine.js +112 -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/workspace-doctor.d.ts.map +1 -1
- package/daemon/dist/domain/workspace/workspace-doctor.js +2 -4
- package/daemon/dist/domain/workspace/workspace-doctor.js.map +1 -1
- package/daemon/dist/index.d.ts +9 -0
- package/daemon/dist/index.d.ts.map +1 -1
- package/daemon/dist/index.js +24 -1
- package/daemon/dist/index.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/gateway.js +1 -1
- package/daemon/dist/routes/gateway.js.map +1 -1
- package/daemon/dist/routes/queue.d.ts.map +1 -1
- package/daemon/dist/routes/queue.js +22 -11
- 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.js +6 -6
- package/daemon/dist/routes/scope-audit.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.map +1 -1
- package/daemon/dist/server.js +5 -0
- package/daemon/dist/server.js.map +1 -1
- package/daemon/dist/startup.d.ts.map +1 -1
- package/daemon/dist/startup.js +194 -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 +8 -13
- 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/release-boundary.md +88 -0
- package/daemon/docs/reference/sdlc-conventions.md +42 -69
- 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/agent-startup-and-context-ingestion/SKILL.md +1 -1
- 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/pm/requirements-writer/SKILL.md +15 -21
- 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 +2 -2
- 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/context.d.ts.map +1 -1
- package/dist/commands/context.js +12 -1
- package/dist/commands/context.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/ps.d.ts +4 -0
- package/dist/commands/ps.d.ts.map +1 -1
- package/dist/commands/ps.js +15 -7
- package/dist/commands/ps.js.map +1 -1
- package/dist/commands/scope.d.ts.map +1 -1
- package/dist/commands/scope.js +40 -11
- package/dist/commands/scope.js.map +1 -1
- package/dist/commands/send.d.ts +2 -0
- package/dist/commands/send.d.ts.map +1 -1
- package/dist/commands/send.js +24 -2
- package/dist/commands/send.js.map +1 -1
- package/dist/commands/slack.d.ts.map +1 -1
- package/dist/commands/slack.js +4 -2
- package/dist/commands/slack.js.map +1 -1
- package/dist/commands/view.d.ts.map +1 -1
- package/dist/commands/view.js +3 -0
- package/dist/commands/view.js.map +1 -1
- package/dist/commands/watchdog.d.ts.map +1 -1
- package/dist/commands/watchdog.js +64 -9
- package/dist/commands/watchdog.js.map +1 -1
- package/dist/cross-host-target.js +1 -1
- package/dist/cross-host-target.js.map +1 -1
- package/dist/host-registry.d.ts +2 -2
- package/dist/host-registry.js +2 -2
- package/dist/lib/scope/scope-audit.d.ts +4 -1
- package/dist/lib/scope/scope-audit.d.ts.map +1 -1
- package/dist/lib/scope/scope-audit.js +3 -3
- package/dist/lib/scope/scope-audit.js.map +1 -1
- package/dist/lib/scope/scope-fs.d.ts +8 -0
- package/dist/lib/scope/scope-fs.d.ts.map +1 -1
- package/dist/lib/scope/scope-fs.js +18 -0
- package/dist/lib/scope/scope-fs.js.map +1 -1
- package/dist/lib/scope-templates/backlog-deprecation.md +1 -1
- package/dist/lib/scope-templates/backlog-tech-debt.md +1 -1
- package/dist/lib/scope-templates/bug-fix.md +1 -1
- package/dist/lib/scope-templates/capability-delta.md +1 -0
- package/dist/lib/scope-templates/placeholder.md +1 -1
- package/dist/lib/scope-templates/release-feature.md +1 -1
- package/dist/lib/scope-templates/research.md +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 +8 -2
- package/node_modules/@openrig/daemon/dist/db/all-migrations.js.map +1 -1
- 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/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/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/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-subsystem.d.ts +6 -2
- package/node_modules/@openrig/daemon/dist/domain/gateway/gateway-subsystem.d.ts.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/gateway/gateway-subsystem.js +5 -3
- package/node_modules/@openrig/daemon/dist/domain/gateway/gateway-subsystem.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/gateway/human-registry.d.ts +9 -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 +32 -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 +3 -2
- package/node_modules/@openrig/daemon/dist/domain/gateway/slack/config.d.ts.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/gateway/slack/config.js +20 -4
- package/node_modules/@openrig/daemon/dist/domain/gateway/slack/config.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/gateway/slack/inbound.d.ts +34 -6
- package/node_modules/@openrig/daemon/dist/domain/gateway/slack/inbound.d.ts.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/gateway/slack/inbound.js +60 -9
- package/node_modules/@openrig/daemon/dist/domain/gateway/slack/inbound.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/gateway/slack/outbound-driver.d.ts +3 -0
- package/node_modules/@openrig/daemon/dist/domain/gateway/slack/outbound-driver.d.ts.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/gateway/slack/outbound-driver.js +12 -5
- package/node_modules/@openrig/daemon/dist/domain/gateway/slack/outbound-driver.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/gateway/slack/queue-access.d.ts +10 -5
- package/node_modules/@openrig/daemon/dist/domain/gateway/slack/queue-access.d.ts.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/gateway/slack/queue-access.js +46 -19
- package/node_modules/@openrig/daemon/dist/domain/gateway/slack/queue-access.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/gateway/slack/slack-api.d.ts +29 -6
- package/node_modules/@openrig/daemon/dist/domain/gateway/slack/slack-api.d.ts.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/gateway/slack/slack-api.js +41 -3
- package/node_modules/@openrig/daemon/dist/domain/gateway/slack/slack-api.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/gateway/slack/slack-delivery.d.ts +9 -3
- package/node_modules/@openrig/daemon/dist/domain/gateway/slack/slack-delivery.d.ts.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/gateway/slack/slack-delivery.js +132 -12
- package/node_modules/@openrig/daemon/dist/domain/gateway/slack/slack-delivery.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/gateway/slack/slack-subsystem.d.ts +10 -0
- package/node_modules/@openrig/daemon/dist/domain/gateway/slack/slack-subsystem.d.ts.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/gateway/slack/slack-subsystem.js +286 -11
- package/node_modules/@openrig/daemon/dist/domain/gateway/slack/slack-subsystem.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 +45 -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 +1 -0
- package/node_modules/@openrig/daemon/dist/domain/parked-query.d.ts.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/parked-query.js +1 -0
- package/node_modules/@openrig/daemon/dist/domain/parked-query.js.map +1 -1
- 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.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/queue-pickup.js +5 -0
- package/node_modules/@openrig/daemon/dist/domain/queue-pickup.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/queue-repository.d.ts +55 -18
- package/node_modules/@openrig/daemon/dist/domain/queue-repository.d.ts.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/queue-repository.js +387 -83
- 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 +24 -1
- package/node_modules/@openrig/daemon/dist/domain/queue-stuck-sweep.d.ts.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/queue-stuck-sweep.js +161 -24
- package/node_modules/@openrig/daemon/dist/domain/queue-stuck-sweep.js.map +1 -1
- 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 +20 -2
- package/node_modules/@openrig/daemon/dist/domain/queue-wake-ladder.d.ts.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/queue-wake-ladder.js +187 -15
- package/node_modules/@openrig/daemon/dist/domain/queue-wake-ladder.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/queue-wake-repository.d.ts +16 -0
- package/node_modules/@openrig/daemon/dist/domain/queue-wake-repository.d.ts.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/queue-wake-repository.js +52 -3
- package/node_modules/@openrig/daemon/dist/domain/queue-wake-repository.js.map +1 -1
- 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/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 +4 -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 +14 -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/scope-audit.d.ts +5 -2
- 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 +3 -3
- package/node_modules/@openrig/daemon/dist/domain/scope/scope-audit.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/types.d.ts +26 -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/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 +24 -0
- 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 +40 -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 +112 -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/workspace-doctor.d.ts.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/workspace/workspace-doctor.js +2 -4
- package/node_modules/@openrig/daemon/dist/domain/workspace/workspace-doctor.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/index.d.ts +9 -0
- package/node_modules/@openrig/daemon/dist/index.d.ts.map +1 -1
- package/node_modules/@openrig/daemon/dist/index.js +24 -1
- package/node_modules/@openrig/daemon/dist/index.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/gateway.js +1 -1
- package/node_modules/@openrig/daemon/dist/routes/gateway.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 +22 -11
- 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.js +6 -6
- package/node_modules/@openrig/daemon/dist/routes/scope-audit.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.map +1 -1
- package/node_modules/@openrig/daemon/dist/server.js +5 -0
- package/node_modules/@openrig/daemon/dist/server.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/startup.d.ts.map +1 -1
- package/node_modules/@openrig/daemon/dist/startup.js +194 -5
- package/node_modules/@openrig/daemon/dist/startup.js.map +1 -1
- package/node_modules/@openrig/daemon/package.json +5 -1
- package/package.json +1 -1
- package/tui/dist/demo-data.js +2 -2
- package/tui/dist/demo-data.js.map +1 -1
- package/daemon/assets/plugins/openrig-core/skills/openrig-operating-model/CHANGELOG.md +0 -92
- package/daemon/assets/plugins/openrig-core/skills/openrig-operating-model/REVISION-GUIDE.md +0 -34
- package/daemon/assets/plugins/openrig-core/skills/openrig-operating-model/ROADMAP.md +0 -23
- package/daemon/assets/plugins/openrig-core/skills/openrig-operating-model/ROLLOUT.md +0 -234
- 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/specs/agents/shared/skills/core/attention-queue/SKILL.md +0 -264
|
@@ -1,5 +1,5 @@
|
|
|
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";
|
|
@@ -7,9 +7,10 @@ import { derivePickup } from "./queue-pickup.js";
|
|
|
7
7
|
import { wrapPaneEnvelope } from "../lib/pane-envelope.js";
|
|
8
8
|
import { getSelfHostId } from "./hosts/fanout-contract.js";
|
|
9
9
|
import { parseSessionName } from "./session-name.js";
|
|
10
|
+
import { classifyDestination } from "./gateway/destination-resolver.js";
|
|
10
11
|
import { computeClosureRequiredAt, validateClosure, } from "./hot-potato-enforcer.js";
|
|
11
12
|
import { isHumanSeatSession, validateHumanPark, validateHumanRoute } from "./human-route-enforcer.js";
|
|
12
|
-
import { QueueWakeRepository } from "./queue-wake-repository.js";
|
|
13
|
+
import { QueueWakeRepository, USAGE_LIMIT_BLOCKER_TAG, } from "./queue-wake-repository.js";
|
|
13
14
|
import { WatchdogJobsRepository } from "./watchdog-jobs-repository.js";
|
|
14
15
|
export const QUEUE_STATES = [
|
|
15
16
|
"pending",
|
|
@@ -164,6 +165,14 @@ function detectQueueColumn(db, columnName) {
|
|
|
164
165
|
return false;
|
|
165
166
|
}
|
|
166
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
|
+
}
|
|
167
176
|
/**
|
|
168
177
|
* L3 — Queue repository. Owns CRUD over `queue_items` plus the wired-in
|
|
169
178
|
* append-only transition log and hot-potato strict-rejection contract.
|
|
@@ -284,6 +293,9 @@ export class QueueRepository {
|
|
|
284
293
|
hasEvidenceRefColumn;
|
|
285
294
|
hasMintingGenColumn;
|
|
286
295
|
hasClaimedGenColumn;
|
|
296
|
+
hasQueueTransitionsTable;
|
|
297
|
+
hasOwnerNotificationColumns;
|
|
298
|
+
loadHumanRegistryFn;
|
|
287
299
|
/** OPR.0.4.6.WF3 FR-6 — injected by startup (never imported): the
|
|
288
300
|
* workflow domain's is-live-frontier-packet predicate. */
|
|
289
301
|
workflowFrontierPredicate;
|
|
@@ -296,9 +308,16 @@ export class QueueRepository {
|
|
|
296
308
|
this.transport = opts?.transport;
|
|
297
309
|
this.workflowFrontierPredicate = opts?.workflowFrontierPredicate;
|
|
298
310
|
this.resolveOccupantGeneration = opts?.resolveOccupantGeneration;
|
|
311
|
+
this.loadHumanRegistryFn = opts?.loadHumanRegistry ?? (() => loadHumanRegistry());
|
|
299
312
|
this.hasTargetRepoColumn = detectQueueColumn(db, "target_repo");
|
|
300
313
|
this.hasSummaryColumn = detectQueueColumn(db, "summary");
|
|
301
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");
|
|
302
321
|
// GHOST-STAGE (e/Class-B): generation stamps (migration 063). Defensive detect so a pre-063
|
|
303
322
|
// harness degrades (writers skip the columns; the release predicate never matches unstamped rows).
|
|
304
323
|
this.hasMintingGenColumn = detectQueueColumn(db, "minting_generation_uuid");
|
|
@@ -347,6 +366,26 @@ export class QueueRepository {
|
|
|
347
366
|
}
|
|
348
367
|
this.outbox = outbox;
|
|
349
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
|
+
}
|
|
350
389
|
/**
|
|
351
390
|
* W1 (transactional closure) — the PUBLIC composable primitive (stage half).
|
|
352
391
|
* Stage the durable WAKE INTENT for a successor qitem from INSIDE a terminal
|
|
@@ -677,18 +716,36 @@ export class QueueRepository {
|
|
|
677
716
|
// subsystem's input (the Slack connector polls human-destined rows and its own
|
|
678
717
|
// ledger is the delivery record). Falling through to tmux here recorded
|
|
679
718
|
// "failed: … tmux reports no session" while the founder verifiably received the
|
|
680
|
-
// message, and that failed: literal poisoned the undelivered surface.
|
|
681
|
-
//
|
|
682
|
-
//
|
|
683
|
-
//
|
|
684
|
-
//
|
|
685
|
-
//
|
|
686
|
-
|
|
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
|
+
: "";
|
|
687
741
|
return {
|
|
688
742
|
classified: "indeterminate",
|
|
689
|
-
nudgeResult: `gateway-owned: '${destinationSession}' is a virtual @external destination — 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)`,
|
|
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)`,
|
|
690
744
|
};
|
|
691
745
|
}
|
|
746
|
+
if (destClass.class === "unroutable") {
|
|
747
|
+
return { classified: "failed", nudgeResult: destClass.teaching };
|
|
748
|
+
}
|
|
692
749
|
const stampISO = new Date().toISOString();
|
|
693
750
|
let text;
|
|
694
751
|
if (prebuiltText !== undefined) {
|
|
@@ -873,12 +930,19 @@ export class QueueRepository {
|
|
|
873
930
|
this.persistSummary(id, input.summary ?? null);
|
|
874
931
|
this.persistEvidenceRef(id, input.evidenceRef ?? null);
|
|
875
932
|
this.persistMintingGeneration(id, input.sourceSession);
|
|
933
|
+
const notification = this.classifyOwnerNotification({
|
|
934
|
+
action: "create",
|
|
935
|
+
destinationSession: input.destinationSession,
|
|
936
|
+
nextState: "pending",
|
|
937
|
+
});
|
|
876
938
|
this.transitionLog.append({
|
|
877
939
|
qitemId: id,
|
|
878
940
|
state: "pending",
|
|
879
941
|
actorSession: input.sourceSession,
|
|
880
942
|
transitionNote: "created",
|
|
881
943
|
identityProvenance: input.identityProvenance ?? null, // P21 §4 era-stamp
|
|
944
|
+
ownerNotificationKind: notification?.kind,
|
|
945
|
+
ownerNotificationLevel: notification?.level,
|
|
882
946
|
});
|
|
883
947
|
const persistedEvent = this.eventBus.persistWithinTransaction({
|
|
884
948
|
type: "queue.created",
|
|
@@ -968,12 +1032,19 @@ export class QueueRepository {
|
|
|
968
1032
|
this.persistSummary(newId, input.summary ?? null);
|
|
969
1033
|
this.persistEvidenceRef(newId, input.evidenceRef ?? null);
|
|
970
1034
|
this.persistMintingGeneration(newId, input.fromSession);
|
|
1035
|
+
const successorNotification = this.classifyOwnerNotification({
|
|
1036
|
+
action: "create",
|
|
1037
|
+
destinationSession: input.toSession,
|
|
1038
|
+
nextState: "pending",
|
|
1039
|
+
});
|
|
971
1040
|
this.transitionLog.append({
|
|
972
1041
|
qitemId: newId,
|
|
973
1042
|
state: "pending",
|
|
974
1043
|
actorSession: input.fromSession,
|
|
975
1044
|
transitionNote: `handoff from ${source.qitemId}`,
|
|
976
1045
|
identityProvenance: input.identityProvenance ?? null, // P21 §4 era-stamp
|
|
1046
|
+
ownerNotificationKind: successorNotification?.kind,
|
|
1047
|
+
ownerNotificationLevel: successorNotification?.level,
|
|
977
1048
|
});
|
|
978
1049
|
// W1-a: the durable wake intent joins the SAME transaction as the close +
|
|
979
1050
|
// successor create. If this (or anything above) throws, the whole act rolls
|
|
@@ -988,6 +1059,17 @@ export class QueueRepository {
|
|
|
988
1059
|
summary: source.summary ?? null,
|
|
989
1060
|
});
|
|
990
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
|
+
}
|
|
991
1073
|
const createdEvent = this.eventBus.persistWithinTransaction({
|
|
992
1074
|
type: "queue.created",
|
|
993
1075
|
qitemId: newId,
|
|
@@ -1092,11 +1174,18 @@ export class QueueRepository {
|
|
|
1092
1174
|
this.persistSummary(newId, input.summary ?? null);
|
|
1093
1175
|
this.persistEvidenceRef(newId, input.evidenceRef ?? null);
|
|
1094
1176
|
this.persistMintingGeneration(newId, input.fromSession);
|
|
1177
|
+
const successorNotification = this.classifyOwnerNotification({
|
|
1178
|
+
action: "create",
|
|
1179
|
+
destinationSession: input.toSession,
|
|
1180
|
+
nextState: "pending",
|
|
1181
|
+
});
|
|
1095
1182
|
this.transitionLog.append({
|
|
1096
1183
|
qitemId: newId,
|
|
1097
1184
|
state: "pending",
|
|
1098
1185
|
actorSession: input.fromSession,
|
|
1099
1186
|
transitionNote: `handoff-and-complete from ${source.qitemId}`,
|
|
1187
|
+
ownerNotificationKind: successorNotification?.kind,
|
|
1188
|
+
ownerNotificationLevel: successorNotification?.level,
|
|
1100
1189
|
});
|
|
1101
1190
|
// W1-a: the durable wake intent joins the SAME transaction as the close +
|
|
1102
1191
|
// successor create — one act or none (symmetric with handoff()).
|
|
@@ -1110,6 +1199,17 @@ export class QueueRepository {
|
|
|
1110
1199
|
summary: source.summary ?? null,
|
|
1111
1200
|
});
|
|
1112
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
|
+
}
|
|
1113
1213
|
const createdEvent = this.eventBus.persistWithinTransaction({
|
|
1114
1214
|
type: "queue.created",
|
|
1115
1215
|
qitemId: newId,
|
|
@@ -1155,9 +1255,9 @@ export class QueueRepository {
|
|
|
1155
1255
|
* `cross_host_close_conflict` (someone else closed it meanwhile —
|
|
1156
1256
|
* surface, never overwrite).
|
|
1157
1257
|
* - otherwise → close exactly like the local handoff's close leg:
|
|
1158
|
-
* `closure_reason=handed_off_to`; `closure_target` carries the
|
|
1159
|
-
*
|
|
1160
|
-
*
|
|
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`
|
|
1161
1261
|
* stays the two-part `member@rig` (BR-1 — session-string carriers
|
|
1162
1262
|
* never gain `@host`).
|
|
1163
1263
|
*/
|
|
@@ -1193,7 +1293,7 @@ export class QueueRepository {
|
|
|
1193
1293
|
state: input.terminalState,
|
|
1194
1294
|
actorSession: input.fromSession,
|
|
1195
1295
|
// BR-1: the minted note carries the TWO-PART toSession only — the
|
|
1196
|
-
// host-qualified
|
|
1296
|
+
// host-qualified successor key is allowed in closure_target and nowhere
|
|
1197
1297
|
// else, and transition_note is a durable carrier.
|
|
1198
1298
|
transitionNote: input.transitionNote ?? `cross-host handoff to ${input.toSession}`,
|
|
1199
1299
|
closureReason: "handed_off_to",
|
|
@@ -1209,6 +1309,19 @@ export class QueueRepository {
|
|
|
1209
1309
|
summary: source.summary ?? null,
|
|
1210
1310
|
});
|
|
1211
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
|
+
}
|
|
1212
1325
|
});
|
|
1213
1326
|
txn();
|
|
1214
1327
|
for (const e of events) {
|
|
@@ -1615,6 +1728,12 @@ export class QueueRepository {
|
|
|
1615
1728
|
intervalSeconds: input.wakeAfterSeconds,
|
|
1616
1729
|
registeredBySession: input.actorSession,
|
|
1617
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
|
+
}
|
|
1618
1737
|
parkWake = { kind: "timer", ref: job.jobId };
|
|
1619
1738
|
}
|
|
1620
1739
|
else if (input.state === "blocked" && effectiveBlockedOn?.startsWith("qitem-")) {
|
|
@@ -1628,6 +1747,15 @@ export class QueueRepository {
|
|
|
1628
1747
|
// NULL. The prior `COALESCE(?, blocked_on)` preserved the blocker on every non-blocked
|
|
1629
1748
|
// transition, leaving dead blockers that nothing audits (the root-cause strand).
|
|
1630
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
|
+
});
|
|
1631
1759
|
this.db
|
|
1632
1760
|
.prepare(`UPDATE queue_items
|
|
1633
1761
|
SET state = ?,
|
|
@@ -1653,6 +1781,8 @@ export class QueueRepository {
|
|
|
1653
1781
|
closureReason: validation.closureReason ?? undefined,
|
|
1654
1782
|
closureTarget: validation.closureTarget ?? undefined,
|
|
1655
1783
|
identityProvenance: input.identityProvenance ?? null, // P21 §4 era-stamp
|
|
1784
|
+
ownerNotificationKind: notification?.kind,
|
|
1785
|
+
ownerNotificationLevel: notification?.level,
|
|
1656
1786
|
});
|
|
1657
1787
|
if (parkWake) {
|
|
1658
1788
|
this.wakeRepo.record({
|
|
@@ -1669,45 +1799,15 @@ export class QueueRepository {
|
|
|
1669
1799
|
// When THIS qitem reaches a terminal state, auto-unpark every row parked on it (blocked_on = this,
|
|
1670
1800
|
// state='blocked') to pending, clear its (now-resolved) blocker, log the transition, and emit an
|
|
1671
1801
|
// event so watchers/sweeps see the unblock without a fetch.
|
|
1672
|
-
const dependentEvents =
|
|
1673
|
-
|
|
1674
|
-
|
|
1675
|
-
.
|
|
1676
|
-
|
|
1677
|
-
|
|
1678
|
-
|
|
1679
|
-
|
|
1680
|
-
|
|
1681
|
-
const resumeTransition = this.transitionLog.append({
|
|
1682
|
-
qitemId: r.qitem_id,
|
|
1683
|
-
state: "pending",
|
|
1684
|
-
actorSession: input.actorSession,
|
|
1685
|
-
transitionNote: `auto-unparked: blocker ${input.qitemId} reached terminal state '${input.state}'`,
|
|
1686
|
-
});
|
|
1687
|
-
const wakeIntentId = this.stageAutoUnparkWakeIntent({
|
|
1688
|
-
qitemId: r.qitem_id,
|
|
1689
|
-
destinationSession: r.destination_session,
|
|
1690
|
-
fromSession: input.actorSession,
|
|
1691
|
-
identityProvenance: input.identityProvenance ?? null,
|
|
1692
|
-
blockerQitemId: input.qitemId,
|
|
1693
|
-
resumeTransitionId: resumeTransition.transitionId,
|
|
1694
|
-
});
|
|
1695
|
-
if (wakeIntentId)
|
|
1696
|
-
this.deliverWakeIntentAfterCommit(wakeIntentId);
|
|
1697
|
-
const dependentEvent = this.eventBus.persistWithinTransaction({
|
|
1698
|
-
type: "queue.updated",
|
|
1699
|
-
qitemId: r.qitem_id,
|
|
1700
|
-
fromState: "blocked",
|
|
1701
|
-
toState: "pending",
|
|
1702
|
-
closureReason: null,
|
|
1703
|
-
closureTarget: null,
|
|
1704
|
-
actorSession: input.actorSession,
|
|
1705
|
-
summary: this.getById(r.qitem_id)?.summary ?? null,
|
|
1706
|
-
});
|
|
1707
|
-
this.eventBus.registerPersistedWithinActiveEnvelope(dependentEvent);
|
|
1708
|
-
dependentEvents.push(dependentEvent);
|
|
1709
|
-
}
|
|
1710
|
-
}
|
|
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
|
+
: [];
|
|
1711
1811
|
const persistedEvent = this.eventBus.persistWithinTransaction({
|
|
1712
1812
|
type: "queue.updated",
|
|
1713
1813
|
qitemId: input.qitemId,
|
|
@@ -1722,6 +1822,52 @@ export class QueueRepository {
|
|
|
1722
1822
|
});
|
|
1723
1823
|
return { persistedEvent, persistedEvents: [...dependentEvents, persistedEvent] };
|
|
1724
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
|
+
}
|
|
1725
1871
|
getParkWakeStatus(qitemId) {
|
|
1726
1872
|
return this.wakeRepo.getStatus(qitemId);
|
|
1727
1873
|
}
|
|
@@ -1738,7 +1884,7 @@ export class QueueRepository {
|
|
|
1738
1884
|
const targets = this.wakeRepo.findBlockedQitemsByWatchdog(jobId);
|
|
1739
1885
|
if (targets.length === 0)
|
|
1740
1886
|
return;
|
|
1741
|
-
const
|
|
1887
|
+
const recordFired = ({ qitemId, kind }) => {
|
|
1742
1888
|
const transition = this.transitionLog.append({
|
|
1743
1889
|
qitemId,
|
|
1744
1890
|
state: "blocked",
|
|
@@ -1763,7 +1909,22 @@ export class QueueRepository {
|
|
|
1763
1909
|
actorSession: "watchdog@system",
|
|
1764
1910
|
summary: this.getById(qitemId)?.summary ?? null,
|
|
1765
1911
|
});
|
|
1766
|
-
}
|
|
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
|
+
})();
|
|
1767
1928
|
for (const event of events)
|
|
1768
1929
|
this.eventBus.notifySubscribers(event);
|
|
1769
1930
|
}
|
|
@@ -1771,7 +1932,13 @@ export class QueueRepository {
|
|
|
1771
1932
|
const row = this.db
|
|
1772
1933
|
.prepare("SELECT * FROM queue_items WHERE qitem_id = ?")
|
|
1773
1934
|
.get(qitemId);
|
|
1774
|
-
|
|
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 };
|
|
1775
1942
|
}
|
|
1776
1943
|
list(opts) {
|
|
1777
1944
|
const limit = opts?.limit ?? 100;
|
|
@@ -1817,7 +1984,11 @@ export class QueueRepository {
|
|
|
1817
1984
|
const rows = this.db
|
|
1818
1985
|
.prepare(`SELECT ${columns} FROM queue_items ${where} ORDER BY ${orderBy} LIMIT ?`)
|
|
1819
1986
|
.all(...params);
|
|
1820
|
-
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
|
+
});
|
|
1821
1992
|
return opts?.compact
|
|
1822
1993
|
? items.map((item) => ({
|
|
1823
1994
|
...item,
|
|
@@ -1935,22 +2106,34 @@ export class QueueRepository {
|
|
|
1935
2106
|
return rows.map((r) => this.rowToItem(r));
|
|
1936
2107
|
}
|
|
1937
2108
|
/**
|
|
1938
|
-
*
|
|
1939
|
-
*
|
|
1940
|
-
*
|
|
1941
|
-
*
|
|
1942
|
-
*
|
|
1943
|
-
*
|
|
1944
|
-
* V1-ONLY predicate, NO false-positive mode: `state='pending' AND last_nudge_result LIKE 'failed:%'`.
|
|
1945
|
-
* - A delivered row (`verified` / `delivered-ack-pending`) is excluded — it was woken.
|
|
1946
|
-
* - A NEVER-ATTEMPTED row (`last_nudge_result IS NULL` — a deliberate cold-park or a no-transport create)
|
|
1947
|
-
* is excluded. That class is FP-dominated (a legitimate cold-park is indistinguishable from a real
|
|
1948
|
-
* never-reached strand at the row) and stays DEFERRED behind a forward create-time intent bit; surfacing
|
|
1949
|
-
* it here would train the reader to ignore the signal. The reason it is excluded lives in this comment
|
|
1950
|
-
* 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.
|
|
1951
2114
|
*/
|
|
1952
2115
|
findUndelivered(opts) {
|
|
1953
|
-
|
|
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
|
+
];
|
|
1954
2137
|
const params = [];
|
|
1955
2138
|
if (opts?.rig) {
|
|
1956
2139
|
const escaped = opts.rig.replace(/%/g, "\\%").replace(/_/g, "\\_");
|
|
@@ -1958,14 +2141,141 @@ export class QueueRepository {
|
|
|
1958
2141
|
params.push(`%@${escaped}`, `%@${escaped}`);
|
|
1959
2142
|
}
|
|
1960
2143
|
const columns = opts?.compact ? COMPACT_QUEUE_COLUMNS : "*";
|
|
1961
|
-
|
|
1962
|
-
if (opts?.limit !== undefined) {
|
|
1963
|
-
sql += " LIMIT ?";
|
|
1964
|
-
params.push(opts.limit);
|
|
1965
|
-
}
|
|
2144
|
+
const sql = `SELECT ${columns} FROM queue_items WHERE ${conditions.join(" AND ")} ORDER BY ts_created ASC`;
|
|
1966
2145
|
const rows = this.db.prepare(sql).all(...params);
|
|
1967
|
-
|
|
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;
|
|
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;
|
|
1968
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;
|
|
1969
2279
|
recordNudgeAttempt(qitemId, result) {
|
|
1970
2280
|
const ts = new Date().toISOString();
|
|
1971
2281
|
this.db
|
|
@@ -1974,12 +2284,6 @@ export class QueueRepository {
|
|
|
1974
2284
|
WHERE qitem_id = ?`)
|
|
1975
2285
|
.run(ts, result, qitemId);
|
|
1976
2286
|
}
|
|
1977
|
-
recordHeartbeat(qitemId) {
|
|
1978
|
-
const ts = new Date().toISOString();
|
|
1979
|
-
this.db
|
|
1980
|
-
.prepare(`UPDATE queue_items SET last_heartbeat = ? WHERE qitem_id = ?`)
|
|
1981
|
-
.run(ts, qitemId);
|
|
1982
|
-
}
|
|
1983
2287
|
/**
|
|
1984
2288
|
* Pod-fallback: redirect qitem to a fallback destination (e.g., when a seat
|
|
1985
2289
|
* is unreachable). Emits qitem.fallback_routed; preserves chain_of_record.
|