@openrig/cli 0.6.14 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +10 -9
- package/daemon/assets/plugins/openrig-core/.claude-plugin/plugin.json +1 -1
- package/daemon/assets/plugins/openrig-core/.codex-plugin/plugin.json +1 -1
- package/daemon/assets/plugins/openrig-core/README.md +11 -4
- package/daemon/assets/plugins/openrig-core/hooks/codex.json +6 -6
- package/daemon/assets/plugins/openrig-core/hooks/scripts/activity-relay.cjs +13 -1
- package/daemon/assets/plugins/openrig-core/hooks/scripts/codex-hook-trust.cjs +49 -0
- package/daemon/assets/plugins/openrig-core/hooks/scripts/refocus.cjs +26 -5
- package/daemon/assets/plugins/openrig-core/skills/claude-compaction-restore/SKILL.md +9 -2
- package/daemon/assets/plugins/openrig-core/skills/forming-an-openrig-mental-model/SKILL.md +3 -2
- package/daemon/assets/plugins/openrig-core/skills/messaging-the-human/SKILL.md +24 -0
- package/daemon/assets/plugins/openrig-core/skills/openrig-skills/SKILL.md +2 -2
- package/daemon/assets/plugins/openrig-core/skills/openrig-user/SKILL.md +28 -18
- package/daemon/assets/plugins/openrig-core/skills/queue-handoff/SKILL.md +10 -4
- package/daemon/assets/skills/rigs/SKILL.md +24 -5
- package/daemon/context-packs/help/manifest.yaml +1 -1
- package/daemon/context-packs/onboarding-width/manifest.yaml +1 -1
- package/daemon/context-packs/onboarding-width/public-what-you-can-do.md +4 -6
- package/daemon/context-packs/reference/getting-started.md +87 -21
- package/daemon/context-packs/reference/manifest.yaml +1 -1
- package/daemon/context-packs/reference/rig-spec.md +1 -1
- package/daemon/context-packs/reference/whats-new.md +123 -68
- package/daemon/context-packs/skills/agent-operated-software/manifest.yaml +1 -1
- package/daemon/context-packs/skills/agent-operated-workflows/manifest.yaml +1 -1
- package/daemon/context-packs/skills/applying-a-permission-policy/manifest.yaml +1 -1
- package/daemon/context-packs/skills/claude-compaction-restore/SKILL.md +9 -2
- package/daemon/context-packs/skills/claude-compaction-restore/manifest.yaml +1 -1
- package/daemon/context-packs/skills/core/agent-starters/manifest.yaml +1 -1
- package/daemon/context-packs/skills/core/agent-startup-and-context-ingestion/manifest.yaml +1 -1
- package/daemon/context-packs/skills/core/cross-host-rig-commands/manifest.yaml +1 -1
- package/daemon/context-packs/skills/core/human-in-the-loop/manifest.yaml +1 -1
- package/daemon/context-packs/skills/core/messaging-the-human/SKILL.md +24 -0
- package/daemon/context-packs/skills/core/messaging-the-human/manifest.yaml +1 -1
- package/daemon/context-packs/skills/core/openrig-architect/manifest.yaml +1 -1
- package/daemon/context-packs/skills/core/openrig-cmux/manifest.yaml +1 -1
- package/daemon/context-packs/skills/core/openrig-herdr/manifest.yaml +1 -1
- package/daemon/context-packs/skills/core/openrig-skills/SKILL.md +2 -2
- package/daemon/context-packs/skills/core/openrig-skills/manifest.yaml +1 -1
- package/daemon/context-packs/skills/core/openrig-software-factory/manifest.yaml +1 -1
- package/daemon/context-packs/skills/core/openrig-upgrade/SKILL.md +11 -5
- package/daemon/context-packs/skills/core/openrig-upgrade/manifest.yaml +1 -1
- package/daemon/context-packs/skills/core/rig-bundles-and-shareable-artifacts/manifest.yaml +1 -1
- package/daemon/context-packs/skills/core/rig-lifecycle/manifest.yaml +1 -1
- package/daemon/context-packs/skills/core/session-source-fork/manifest.yaml +1 -1
- package/daemon/context-packs/skills/core/specification-system/manifest.yaml +1 -1
- package/daemon/context-packs/skills/core/topology-mutation-and-seat-management/manifest.yaml +1 -1
- package/daemon/context-packs/skills/core/watchdog/manifest.yaml +1 -1
- package/daemon/context-packs/skills/delegating-work/manifest.yaml +1 -1
- package/daemon/context-packs/skills/forming-an-openrig-mental-model/SKILL.md +3 -2
- package/daemon/context-packs/skills/forming-an-openrig-mental-model/manifest.yaml +1 -1
- package/daemon/context-packs/skills/loading-addressable-markdown/manifest.yaml +1 -1
- package/daemon/context-packs/skills/mission-slice-sop/manifest.yaml +1 -1
- package/daemon/context-packs/skills/openrig-operating-model/manifest.yaml +1 -1
- package/daemon/context-packs/skills/openrig-user/SKILL.md +28 -18
- package/daemon/context-packs/skills/openrig-user/manifest.yaml +1 -1
- package/daemon/context-packs/skills/orienting-to-an-inherited-seat/manifest.yaml +1 -1
- package/daemon/context-packs/skills/pm/backlog-capture/manifest.yaml +1 -1
- package/daemon/context-packs/skills/pm/context-builder/manifest.yaml +1 -1
- package/daemon/context-packs/skills/pm/exec-summary/manifest.yaml +1 -1
- package/daemon/context-packs/skills/pm/office-hours/manifest.yaml +1 -1
- package/daemon/context-packs/skills/pm/plan-review/manifest.yaml +1 -1
- package/daemon/context-packs/skills/pm/requirements-writer/manifest.yaml +1 -1
- package/daemon/context-packs/skills/pm/ui-mockup/manifest.yaml +1 -1
- package/daemon/context-packs/skills/pods/development-team/SKILL.md +2 -0
- package/daemon/context-packs/skills/pods/development-team/manifest.yaml +3 -1
- package/daemon/context-packs/skills/pods/development-team/references/refactoring.md +11 -0
- package/daemon/context-packs/skills/pods/orchestration-team/manifest.yaml +1 -1
- package/daemon/context-packs/skills/pods/oversight-team/manifest.yaml +1 -1
- package/daemon/context-packs/skills/pods/review-team/SKILL.md +46 -96
- package/daemon/context-packs/skills/pods/review-team/manifest.yaml +1 -1
- package/daemon/context-packs/skills/process/agent-browser/manifest.yaml +1 -1
- package/daemon/context-packs/skills/process/context-engineering/manifest.yaml +1 -1
- package/daemon/context-packs/skills/process/dogfood/manifest.yaml +1 -1
- package/daemon/context-packs/skills/process/frontend-design/manifest.yaml +1 -1
- package/daemon/context-packs/skills/process/systematic-debugging/manifest.yaml +1 -1
- package/daemon/context-packs/skills/process/test-driven-development/manifest.yaml +1 -1
- package/daemon/context-packs/skills/process/verification-before-completion/SKILL.md +17 -80
- package/daemon/context-packs/skills/process/verification-before-completion/manifest.yaml +5 -3
- package/daemon/context-packs/skills/process/verification-before-completion/references/performance-claims.md +12 -0
- package/daemon/context-packs/skills/queue-handoff/SKILL.md +10 -4
- package/daemon/context-packs/skills/queue-handoff/manifest.yaml +1 -1
- package/daemon/context-packs/skills/refocusing/manifest.yaml +1 -1
- package/daemon/context-packs/skills/retiring-and-inheriting-a-seat/manifest.yaml +1 -1
- package/daemon/context-packs/skills/seat-continuity-and-handover/manifest.yaml +1 -1
- package/daemon/context-packs/skills/session-compaction-and-restore/manifest.yaml +1 -1
- package/daemon/context-packs/skills/software-for-agents/manifest.yaml +1 -1
- package/daemon/context-packs/world-example/manifest.yaml +1 -1
- package/daemon/context-packs/world-public/manifest.yaml +1 -1
- package/daemon/dist/adapters/claude-code-adapter.d.ts +6 -2
- package/daemon/dist/adapters/claude-code-adapter.d.ts.map +1 -1
- package/daemon/dist/adapters/claude-code-adapter.js +33 -6
- package/daemon/dist/adapters/claude-code-adapter.js.map +1 -1
- package/daemon/dist/adapters/codex-resume.d.ts.map +1 -1
- package/daemon/dist/adapters/codex-resume.js +2 -7
- package/daemon/dist/adapters/codex-resume.js.map +1 -1
- package/daemon/dist/adapters/codex-runtime-adapter.d.ts +68 -2
- package/daemon/dist/adapters/codex-runtime-adapter.d.ts.map +1 -1
- package/daemon/dist/adapters/codex-runtime-adapter.js +371 -60
- package/daemon/dist/adapters/codex-runtime-adapter.js.map +1 -1
- package/daemon/dist/adapters/compose-services-adapter.d.ts +16 -0
- package/daemon/dist/adapters/compose-services-adapter.d.ts.map +1 -1
- package/daemon/dist/adapters/compose-services-adapter.js +52 -9
- package/daemon/dist/adapters/compose-services-adapter.js.map +1 -1
- package/daemon/dist/adapters/kernel-authority.d.ts.map +1 -1
- package/daemon/dist/adapters/kernel-authority.js +9 -5
- package/daemon/dist/adapters/kernel-authority.js.map +1 -1
- package/daemon/dist/adapters/pi-runner.d.ts +2 -0
- package/daemon/dist/adapters/pi-runner.d.ts.map +1 -1
- package/daemon/dist/adapters/pi-runner.js +5 -0
- package/daemon/dist/adapters/pi-runner.js.map +1 -1
- package/daemon/dist/adapters/runtime-probe-exec.d.ts +11 -0
- package/daemon/dist/adapters/runtime-probe-exec.d.ts.map +1 -0
- package/daemon/dist/adapters/runtime-probe-exec.js +25 -0
- package/daemon/dist/adapters/runtime-probe-exec.js.map +1 -0
- package/daemon/dist/adapters/stub-runner.d.ts.map +1 -1
- package/daemon/dist/adapters/stub-runner.js +2 -0
- package/daemon/dist/adapters/stub-runner.js.map +1 -1
- package/daemon/dist/adapters/tmux.d.ts +21 -1
- package/daemon/dist/adapters/tmux.d.ts.map +1 -1
- package/daemon/dist/adapters/tmux.js +100 -13
- package/daemon/dist/adapters/tmux.js.map +1 -1
- package/daemon/dist/build-info.js +3 -3
- package/daemon/dist/db/all-migrations.d.ts.map +1 -1
- package/daemon/dist/db/all-migrations.js +12 -0
- package/daemon/dist/db/all-migrations.js.map +1 -1
- package/daemon/dist/db/migrations/116_queue_item_wake_input_box.d.ts +3 -0
- package/daemon/dist/db/migrations/116_queue_item_wake_input_box.d.ts.map +1 -0
- package/daemon/dist/db/migrations/116_queue_item_wake_input_box.js +8 -0
- package/daemon/dist/db/migrations/116_queue_item_wake_input_box.js.map +1 -0
- package/daemon/dist/db/migrations/118_human_quiet_windows.d.ts +3 -0
- package/daemon/dist/db/migrations/118_human_quiet_windows.d.ts.map +1 -0
- package/daemon/dist/db/migrations/118_human_quiet_windows.js +30 -0
- package/daemon/dist/db/migrations/118_human_quiet_windows.js.map +1 -0
- package/daemon/dist/db/migrations/119_seat_identity_pane_pid.d.ts +3 -0
- package/daemon/dist/db/migrations/119_seat_identity_pane_pid.d.ts.map +1 -0
- package/daemon/dist/db/migrations/119_seat_identity_pane_pid.js +7 -0
- package/daemon/dist/db/migrations/119_seat_identity_pane_pid.js.map +1 -0
- package/daemon/dist/db/migrations/121_rig_startup_layers.d.ts +13 -0
- package/daemon/dist/db/migrations/121_rig_startup_layers.d.ts.map +1 -0
- package/daemon/dist/db/migrations/121_rig_startup_layers.js +17 -0
- package/daemon/dist/db/migrations/121_rig_startup_layers.js.map +1 -0
- package/daemon/dist/db/migrations/122_human_operating_modes.d.ts +3 -0
- package/daemon/dist/db/migrations/122_human_operating_modes.d.ts.map +1 -0
- package/daemon/dist/db/migrations/122_human_operating_modes.js +55 -0
- package/daemon/dist/db/migrations/122_human_operating_modes.js.map +1 -0
- package/daemon/dist/db/migrations/123_queue_delegated_decision.d.ts +3 -0
- package/daemon/dist/db/migrations/123_queue_delegated_decision.d.ts.map +1 -0
- package/daemon/dist/db/migrations/123_queue_delegated_decision.js +10 -0
- package/daemon/dist/db/migrations/123_queue_delegated_decision.js.map +1 -0
- package/daemon/dist/domain/active-occupant.d.ts +5 -3
- package/daemon/dist/domain/active-occupant.d.ts.map +1 -1
- package/daemon/dist/domain/active-occupant.js +2 -2
- package/daemon/dist/domain/active-occupant.js.map +1 -1
- package/daemon/dist/domain/activity-taxonomy.d.ts +16 -1
- package/daemon/dist/domain/activity-taxonomy.d.ts.map +1 -1
- package/daemon/dist/domain/activity-taxonomy.js +21 -0
- package/daemon/dist/domain/activity-taxonomy.js.map +1 -1
- package/daemon/dist/domain/agent-activity-store.d.ts +20 -0
- package/daemon/dist/domain/agent-activity-store.d.ts.map +1 -1
- package/daemon/dist/domain/agent-activity-store.js +41 -5
- package/daemon/dist/domain/agent-activity-store.js.map +1 -1
- package/daemon/dist/domain/agent-images/evidence-guard.js +3 -3
- package/daemon/dist/domain/agent-images/evidence-guard.js.map +1 -1
- package/daemon/dist/domain/agent-images/resume-token-discovery.d.ts.map +1 -1
- package/daemon/dist/domain/agent-images/resume-token-discovery.js +2 -10
- package/daemon/dist/domain/agent-images/resume-token-discovery.js.map +1 -1
- package/daemon/dist/domain/ask-service.d.ts +1 -0
- package/daemon/dist/domain/ask-service.d.ts.map +1 -1
- package/daemon/dist/domain/ask-service.js +7 -1
- package/daemon/dist/domain/ask-service.js.map +1 -1
- package/daemon/dist/domain/bootstrap-orchestrator.d.ts +2 -0
- package/daemon/dist/domain/bootstrap-orchestrator.d.ts.map +1 -1
- package/daemon/dist/domain/bootstrap-orchestrator.js +5 -6
- package/daemon/dist/domain/bootstrap-orchestrator.js.map +1 -1
- package/daemon/dist/domain/claim-service.d.ts +1 -1
- package/daemon/dist/domain/claim-service.d.ts.map +1 -1
- package/daemon/dist/domain/claim-service.js +7 -0
- package/daemon/dist/domain/claim-service.js.map +1 -1
- package/daemon/dist/domain/classification-sources.d.ts.map +1 -1
- package/daemon/dist/domain/classification-sources.js +2 -0
- package/daemon/dist/domain/classification-sources.js.map +1 -1
- package/daemon/dist/domain/claude-compaction-enforcer.d.ts +17 -4
- package/daemon/dist/domain/claude-compaction-enforcer.d.ts.map +1 -1
- package/daemon/dist/domain/claude-compaction-enforcer.js +88 -24
- package/daemon/dist/domain/claude-compaction-enforcer.js.map +1 -1
- package/daemon/dist/domain/claude-core-plugin-env.d.ts +11 -0
- package/daemon/dist/domain/claude-core-plugin-env.d.ts.map +1 -1
- package/daemon/dist/domain/claude-core-plugin-env.js +15 -0
- package/daemon/dist/domain/claude-core-plugin-env.js.map +1 -1
- package/daemon/dist/domain/codex-core-plugin-install.d.ts +41 -0
- package/daemon/dist/domain/codex-core-plugin-install.d.ts.map +1 -0
- package/daemon/dist/domain/codex-core-plugin-install.js +126 -0
- package/daemon/dist/domain/codex-core-plugin-install.js.map +1 -0
- package/daemon/dist/domain/codex-thread-id.d.ts +23 -1
- package/daemon/dist/domain/codex-thread-id.d.ts.map +1 -1
- package/daemon/dist/domain/codex-thread-id.js +58 -17
- package/daemon/dist/domain/codex-thread-id.js.map +1 -1
- package/daemon/dist/domain/context-monitor.d.ts +13 -5
- package/daemon/dist/domain/context-monitor.d.ts.map +1 -1
- package/daemon/dist/domain/context-monitor.js +47 -13
- package/daemon/dist/domain/context-monitor.js.map +1 -1
- package/daemon/dist/domain/context-usage-store.d.ts.map +1 -1
- package/daemon/dist/domain/context-usage-store.js +3 -0
- package/daemon/dist/domain/context-usage-store.js.map +1 -1
- package/daemon/dist/domain/current-work.d.ts +18 -0
- package/daemon/dist/domain/current-work.d.ts.map +1 -1
- package/daemon/dist/domain/current-work.js +17 -3
- package/daemon/dist/domain/current-work.js.map +1 -1
- package/daemon/dist/domain/draft-aware-delivery.d.ts +7 -7
- package/daemon/dist/domain/draft-aware-delivery.d.ts.map +1 -1
- package/daemon/dist/domain/draft-aware-delivery.js +61 -82
- package/daemon/dist/domain/draft-aware-delivery.js.map +1 -1
- package/daemon/dist/domain/execution-view.d.ts.map +1 -1
- package/daemon/dist/domain/execution-view.js +2 -1
- package/daemon/dist/domain/execution-view.js.map +1 -1
- package/daemon/dist/domain/existing-rig-restore.d.ts +110 -0
- package/daemon/dist/domain/existing-rig-restore.d.ts.map +1 -0
- package/daemon/dist/domain/existing-rig-restore.js +254 -0
- package/daemon/dist/domain/existing-rig-restore.js.map +1 -0
- package/daemon/dist/domain/fresh-occupant-relation.d.ts.map +1 -1
- package/daemon/dist/domain/fresh-occupant-relation.js +9 -2
- package/daemon/dist/domain/fresh-occupant-relation.js.map +1 -1
- package/daemon/dist/domain/gateway/channel-operations.d.ts +3 -4
- package/daemon/dist/domain/gateway/channel-operations.d.ts.map +1 -1
- package/daemon/dist/domain/gateway/channel-operations.js.map +1 -1
- package/daemon/dist/domain/gateway/connections-projection.d.ts +0 -5
- package/daemon/dist/domain/gateway/connections-projection.d.ts.map +1 -1
- package/daemon/dist/domain/gateway/connections-projection.js +3 -46
- package/daemon/dist/domain/gateway/connections-projection.js.map +1 -1
- package/daemon/dist/domain/gateway/delivery-rules-engine.d.ts +11 -1
- package/daemon/dist/domain/gateway/delivery-rules-engine.d.ts.map +1 -1
- package/daemon/dist/domain/gateway/delivery-rules-engine.js +12 -2
- package/daemon/dist/domain/gateway/delivery-rules-engine.js.map +1 -1
- package/daemon/dist/domain/gateway/dispatch-buffer.d.ts +4 -0
- package/daemon/dist/domain/gateway/dispatch-buffer.d.ts.map +1 -1
- package/daemon/dist/domain/gateway/dispatch-buffer.js +18 -0
- package/daemon/dist/domain/gateway/dispatch-buffer.js.map +1 -1
- package/daemon/dist/domain/gateway/human-mode-account.d.ts +61 -0
- package/daemon/dist/domain/gateway/human-mode-account.d.ts.map +1 -0
- package/daemon/dist/domain/gateway/human-mode-account.js +112 -0
- package/daemon/dist/domain/gateway/human-mode-account.js.map +1 -0
- package/daemon/dist/domain/gateway/human-operating-modes.d.ts +171 -0
- package/daemon/dist/domain/gateway/human-operating-modes.d.ts.map +1 -0
- package/daemon/dist/domain/gateway/human-operating-modes.js +422 -0
- package/daemon/dist/domain/gateway/human-operating-modes.js.map +1 -0
- package/daemon/dist/domain/gateway/human-quiet-windows.d.ts +121 -0
- package/daemon/dist/domain/gateway/human-quiet-windows.d.ts.map +1 -0
- package/daemon/dist/domain/gateway/human-quiet-windows.js +217 -0
- package/daemon/dist/domain/gateway/human-quiet-windows.js.map +1 -0
- package/daemon/dist/domain/gateway/human-registry.d.ts +23 -2
- package/daemon/dist/domain/gateway/human-registry.d.ts.map +1 -1
- package/daemon/dist/domain/gateway/human-registry.js +67 -5
- package/daemon/dist/domain/gateway/human-registry.js.map +1 -1
- package/daemon/dist/domain/gateway/operator-delivery-engine.d.ts.map +1 -1
- package/daemon/dist/domain/gateway/operator-delivery-engine.js +9 -0
- package/daemon/dist/domain/gateway/operator-delivery-engine.js.map +1 -1
- package/daemon/dist/domain/gateway/slack/inbound.d.ts +10 -2
- package/daemon/dist/domain/gateway/slack/inbound.d.ts.map +1 -1
- package/daemon/dist/domain/gateway/slack/inbound.js +24 -2
- package/daemon/dist/domain/gateway/slack/inbound.js.map +1 -1
- package/daemon/dist/domain/gateway/slack/message.d.ts +1 -0
- package/daemon/dist/domain/gateway/slack/message.d.ts.map +1 -1
- package/daemon/dist/domain/gateway/slack/message.js +5 -1
- package/daemon/dist/domain/gateway/slack/message.js.map +1 -1
- package/daemon/dist/domain/gateway/slack/outbound-driver.d.ts +9 -3
- package/daemon/dist/domain/gateway/slack/outbound-driver.d.ts.map +1 -1
- package/daemon/dist/domain/gateway/slack/outbound-driver.js +40 -6
- package/daemon/dist/domain/gateway/slack/outbound-driver.js.map +1 -1
- package/daemon/dist/domain/gateway/slack/slack-delivery.d.ts +19 -1
- package/daemon/dist/domain/gateway/slack/slack-delivery.d.ts.map +1 -1
- package/daemon/dist/domain/gateway/slack/slack-delivery.js +128 -41
- package/daemon/dist/domain/gateway/slack/slack-delivery.js.map +1 -1
- package/daemon/dist/domain/gateway/slack/slack-subsystem.d.ts +3 -2
- package/daemon/dist/domain/gateway/slack/slack-subsystem.d.ts.map +1 -1
- package/daemon/dist/domain/gateway/slack/slack-subsystem.js +268 -50
- package/daemon/dist/domain/gateway/slack/slack-subsystem.js.map +1 -1
- package/daemon/dist/domain/health-passive-ceremony.d.ts +4 -0
- package/daemon/dist/domain/health-passive-ceremony.d.ts.map +1 -1
- package/daemon/dist/domain/health-passive-ceremony.js +34 -4
- package/daemon/dist/domain/health-passive-ceremony.js.map +1 -1
- package/daemon/dist/domain/hosts/hosts-registry-reader.d.ts +3 -1
- package/daemon/dist/domain/hosts/hosts-registry-reader.d.ts.map +1 -1
- package/daemon/dist/domain/hosts/hosts-registry-reader.js +9 -9
- package/daemon/dist/domain/hosts/hosts-registry-reader.js.map +1 -1
- package/daemon/dist/domain/hosts/learned-host-bindings.d.ts +28 -0
- package/daemon/dist/domain/hosts/learned-host-bindings.d.ts.map +1 -0
- package/daemon/dist/domain/hosts/learned-host-bindings.js +77 -0
- package/daemon/dist/domain/hosts/learned-host-bindings.js.map +1 -0
- package/daemon/dist/domain/hot-potato-enforcer.d.ts +7 -5
- package/daemon/dist/domain/hot-potato-enforcer.d.ts.map +1 -1
- package/daemon/dist/domain/hot-potato-enforcer.js +19 -10
- package/daemon/dist/domain/hot-potato-enforcer.js.map +1 -1
- package/daemon/dist/domain/human-questions.d.ts +8 -1
- package/daemon/dist/domain/human-questions.d.ts.map +1 -1
- package/daemon/dist/domain/human-questions.js.map +1 -1
- package/daemon/dist/domain/kernel-boot-tracker.d.ts +17 -1
- package/daemon/dist/domain/kernel-boot-tracker.d.ts.map +1 -1
- package/daemon/dist/domain/kernel-boot-tracker.js +44 -3
- package/daemon/dist/domain/kernel-boot-tracker.js.map +1 -1
- package/daemon/dist/domain/kernel-boot.d.ts +21 -0
- package/daemon/dist/domain/kernel-boot.d.ts.map +1 -1
- package/daemon/dist/domain/kernel-boot.js +57 -2
- package/daemon/dist/domain/kernel-boot.js.map +1 -1
- package/daemon/dist/domain/model-divergence/current-generation-record.d.ts +2 -1
- package/daemon/dist/domain/model-divergence/current-generation-record.d.ts.map +1 -1
- package/daemon/dist/domain/model-divergence/current-generation-record.js +8 -3
- package/daemon/dist/domain/model-divergence/current-generation-record.js.map +1 -1
- package/daemon/dist/domain/native-process-lineage.d.ts.map +1 -1
- package/daemon/dist/domain/native-process-lineage.js +43 -15
- package/daemon/dist/domain/native-process-lineage.js.map +1 -1
- package/daemon/dist/domain/node-inventory.d.ts.map +1 -1
- package/daemon/dist/domain/node-inventory.js +26 -12
- package/daemon/dist/domain/node-inventory.js.map +1 -1
- package/daemon/dist/domain/node-launcher.d.ts +5 -3
- package/daemon/dist/domain/node-launcher.d.ts.map +1 -1
- package/daemon/dist/domain/node-launcher.js +29 -25
- package/daemon/dist/domain/node-launcher.js.map +1 -1
- package/daemon/dist/domain/outbox-handler.d.ts +3 -5
- package/daemon/dist/domain/outbox-handler.d.ts.map +1 -1
- package/daemon/dist/domain/outbox-handler.js +9 -19
- package/daemon/dist/domain/outbox-handler.js.map +1 -1
- package/daemon/dist/domain/park-wake-text.d.ts +11 -0
- package/daemon/dist/domain/park-wake-text.d.ts.map +1 -0
- package/daemon/dist/domain/park-wake-text.js +26 -0
- package/daemon/dist/domain/park-wake-text.js.map +1 -0
- package/daemon/dist/domain/plugin-vendor-service.d.ts +4 -0
- package/daemon/dist/domain/plugin-vendor-service.d.ts.map +1 -1
- package/daemon/dist/domain/plugin-vendor-service.js +29 -6
- package/daemon/dist/domain/plugin-vendor-service.js.map +1 -1
- package/daemon/dist/domain/policies/delivery-digest-flush.d.ts +1 -0
- package/daemon/dist/domain/policies/delivery-digest-flush.d.ts.map +1 -1
- package/daemon/dist/domain/policies/delivery-digest-flush.js +25 -4
- package/daemon/dist/domain/policies/delivery-digest-flush.js.map +1 -1
- package/daemon/dist/domain/policies/mode-scheduled-end.d.ts +37 -0
- package/daemon/dist/domain/policies/mode-scheduled-end.d.ts.map +1 -0
- package/daemon/dist/domain/policies/mode-scheduled-end.js +161 -0
- package/daemon/dist/domain/policies/mode-scheduled-end.js.map +1 -0
- package/daemon/dist/domain/policies/parked-owner-consumer.d.ts +11 -7
- package/daemon/dist/domain/policies/parked-owner-consumer.d.ts.map +1 -1
- package/daemon/dist/domain/policies/parked-owner-consumer.js +82 -113
- package/daemon/dist/domain/policies/parked-owner-consumer.js.map +1 -1
- package/daemon/dist/domain/policies/quiet-release.d.ts +109 -0
- package/daemon/dist/domain/policies/quiet-release.d.ts.map +1 -0
- package/daemon/dist/domain/policies/quiet-release.js +213 -0
- package/daemon/dist/domain/policies/quiet-release.js.map +1 -0
- package/daemon/dist/domain/profile-resolver.d.ts.map +1 -1
- package/daemon/dist/domain/profile-resolver.js +8 -3
- package/daemon/dist/domain/profile-resolver.js.map +1 -1
- package/daemon/dist/domain/proof/source-watch.js +2 -2
- package/daemon/dist/domain/proof/source-watch.js.map +1 -1
- package/daemon/dist/domain/queue-destination-check.d.ts +6 -0
- package/daemon/dist/domain/queue-destination-check.d.ts.map +1 -0
- package/daemon/dist/domain/queue-destination-check.js +35 -0
- package/daemon/dist/domain/queue-destination-check.js.map +1 -0
- package/daemon/dist/domain/queue-owner.d.ts.map +1 -1
- package/daemon/dist/domain/queue-owner.js +2 -1
- package/daemon/dist/domain/queue-owner.js.map +1 -1
- package/daemon/dist/domain/queue-recovery.d.ts +1 -1
- package/daemon/dist/domain/queue-recovery.d.ts.map +1 -1
- package/daemon/dist/domain/queue-recovery.js +3 -2
- package/daemon/dist/domain/queue-recovery.js.map +1 -1
- package/daemon/dist/domain/queue-repository.d.ts +108 -67
- package/daemon/dist/domain/queue-repository.d.ts.map +1 -1
- package/daemon/dist/domain/queue-repository.js +316 -140
- package/daemon/dist/domain/queue-repository.js.map +1 -1
- package/daemon/dist/domain/queue-stuck-sweep.d.ts +13 -1
- package/daemon/dist/domain/queue-stuck-sweep.d.ts.map +1 -1
- package/daemon/dist/domain/queue-stuck-sweep.js +95 -13
- package/daemon/dist/domain/queue-stuck-sweep.js.map +1 -1
- package/daemon/dist/domain/queue-transition-log.d.ts +5 -0
- package/daemon/dist/domain/queue-transition-log.d.ts.map +1 -1
- package/daemon/dist/domain/queue-transition-log.js +25 -8
- package/daemon/dist/domain/queue-transition-log.js.map +1 -1
- package/daemon/dist/domain/queue-wake-ladder.d.ts +2 -0
- package/daemon/dist/domain/queue-wake-ladder.d.ts.map +1 -1
- package/daemon/dist/domain/queue-wake-ladder.js +94 -11
- package/daemon/dist/domain/queue-wake-ladder.js.map +1 -1
- package/daemon/dist/domain/quiet-hold-custody.d.ts +24 -0
- package/daemon/dist/domain/quiet-hold-custody.d.ts.map +1 -0
- package/daemon/dist/domain/quiet-hold-custody.js +85 -0
- package/daemon/dist/domain/quiet-hold-custody.js.map +1 -0
- package/daemon/dist/domain/rehydrate-eligibility.d.ts +12 -1
- package/daemon/dist/domain/rehydrate-eligibility.d.ts.map +1 -1
- package/daemon/dist/domain/rehydrate-eligibility.js +47 -9
- package/daemon/dist/domain/rehydrate-eligibility.js.map +1 -1
- package/daemon/dist/domain/restore-orchestrator.d.ts +11 -0
- package/daemon/dist/domain/restore-orchestrator.d.ts.map +1 -1
- package/daemon/dist/domain/restore-orchestrator.js +144 -15
- package/daemon/dist/domain/restore-orchestrator.js.map +1 -1
- package/daemon/dist/domain/restore-plan-preview.d.ts +3 -1
- package/daemon/dist/domain/restore-plan-preview.d.ts.map +1 -1
- package/daemon/dist/domain/restore-plan-preview.js +30 -13
- package/daemon/dist/domain/restore-plan-preview.js.map +1 -1
- package/daemon/dist/domain/review/gather.d.ts.map +1 -1
- package/daemon/dist/domain/review/gather.js +8 -5
- package/daemon/dist/domain/review/gather.js.map +1 -1
- package/daemon/dist/domain/rig-mode/operating-posture.d.ts.map +1 -1
- package/daemon/dist/domain/rig-mode/operating-posture.js +3 -1
- package/daemon/dist/domain/rig-mode/operating-posture.js.map +1 -1
- package/daemon/dist/domain/rig-repository.d.ts +11 -1
- package/daemon/dist/domain/rig-repository.d.ts.map +1 -1
- package/daemon/dist/domain/rig-repository.js +27 -3
- package/daemon/dist/domain/rig-repository.js.map +1 -1
- package/daemon/dist/domain/rig-teardown.d.ts.map +1 -1
- package/daemon/dist/domain/rig-teardown.js +31 -4
- package/daemon/dist/domain/rig-teardown.js.map +1 -1
- package/daemon/dist/domain/rigspec-instantiator.d.ts +9 -0
- package/daemon/dist/domain/rigspec-instantiator.d.ts.map +1 -1
- package/daemon/dist/domain/rigspec-instantiator.js +59 -28
- package/daemon/dist/domain/rigspec-instantiator.js.map +1 -1
- package/daemon/dist/domain/rigspec-schema.d.ts +5 -0
- package/daemon/dist/domain/rigspec-schema.d.ts.map +1 -1
- package/daemon/dist/domain/rigspec-schema.js +30 -0
- package/daemon/dist/domain/rigspec-schema.js.map +1 -1
- package/daemon/dist/domain/runtime-adapter.d.ts +27 -2
- package/daemon/dist/domain/runtime-adapter.d.ts.map +1 -1
- package/daemon/dist/domain/runtime-adapter.js.map +1 -1
- package/daemon/dist/domain/seat-activity-service.d.ts +18 -3
- package/daemon/dist/domain/seat-activity-service.d.ts.map +1 -1
- package/daemon/dist/domain/seat-activity-service.js +124 -57
- package/daemon/dist/domain/seat-activity-service.js.map +1 -1
- package/daemon/dist/domain/seat-attention-reconciler.d.ts +8 -1
- package/daemon/dist/domain/seat-attention-reconciler.d.ts.map +1 -1
- package/daemon/dist/domain/seat-attention-reconciler.js +3 -1
- package/daemon/dist/domain/seat-attention-reconciler.js.map +1 -1
- package/daemon/dist/domain/seat-delivery-guard.d.ts.map +1 -1
- package/daemon/dist/domain/seat-delivery-guard.js +21 -5
- package/daemon/dist/domain/seat-delivery-guard.js.map +1 -1
- package/daemon/dist/domain/seat-handover-service.d.ts +2 -2
- package/daemon/dist/domain/seat-handover-service.d.ts.map +1 -1
- package/daemon/dist/domain/seat-handover-service.js +28 -2
- package/daemon/dist/domain/seat-handover-service.js.map +1 -1
- package/daemon/dist/domain/seat-identity-reconciler.js +1 -1
- package/daemon/dist/domain/seat-identity-reconciler.js.map +1 -1
- package/daemon/dist/domain/seat-identity-store.d.ts.map +1 -1
- package/daemon/dist/domain/seat-identity-store.js +5 -2
- package/daemon/dist/domain/seat-identity-store.js.map +1 -1
- package/daemon/dist/domain/seat-launch-environment.d.ts.map +1 -1
- package/daemon/dist/domain/seat-launch-environment.js +17 -1
- package/daemon/dist/domain/seat-launch-environment.js.map +1 -1
- package/daemon/dist/domain/seat-lifecycle-service.d.ts +4 -0
- package/daemon/dist/domain/seat-lifecycle-service.d.ts.map +1 -1
- package/daemon/dist/domain/seat-restart-in-place.d.ts +33 -14
- package/daemon/dist/domain/seat-restart-in-place.d.ts.map +1 -1
- package/daemon/dist/domain/seat-restart-in-place.js +102 -30
- package/daemon/dist/domain/seat-restart-in-place.js.map +1 -1
- package/daemon/dist/domain/self-attach-service.d.ts +3 -2
- package/daemon/dist/domain/self-attach-service.d.ts.map +1 -1
- package/daemon/dist/domain/self-attach-service.js +18 -1
- package/daemon/dist/domain/self-attach-service.js.map +1 -1
- package/daemon/dist/domain/services-readiness.d.ts.map +1 -1
- package/daemon/dist/domain/services-readiness.js +14 -3
- package/daemon/dist/domain/services-readiness.js.map +1 -1
- package/daemon/dist/domain/session-registry.d.ts +45 -0
- package/daemon/dist/domain/session-registry.d.ts.map +1 -1
- package/daemon/dist/domain/session-registry.js +124 -0
- package/daemon/dist/domain/session-registry.js.map +1 -1
- package/daemon/dist/domain/session-transport.d.ts +24 -6
- package/daemon/dist/domain/session-transport.d.ts.map +1 -1
- package/daemon/dist/domain/session-transport.js +58 -41
- package/daemon/dist/domain/session-transport.js.map +1 -1
- package/daemon/dist/domain/skill-discovery.d.ts +7 -1
- package/daemon/dist/domain/skill-discovery.d.ts.map +1 -1
- package/daemon/dist/domain/skill-discovery.js +41 -7
- package/daemon/dist/domain/skill-discovery.js.map +1 -1
- package/daemon/dist/domain/snapshot-repository.d.ts +1 -0
- package/daemon/dist/domain/snapshot-repository.d.ts.map +1 -1
- package/daemon/dist/domain/snapshot-repository.js +23 -10
- package/daemon/dist/domain/snapshot-repository.js.map +1 -1
- package/daemon/dist/domain/startup-orchestrator.d.ts +21 -3
- package/daemon/dist/domain/startup-orchestrator.d.ts.map +1 -1
- package/daemon/dist/domain/startup-orchestrator.js +66 -16
- package/daemon/dist/domain/startup-orchestrator.js.map +1 -1
- package/daemon/dist/domain/startup-submission-evidence.d.ts +4 -11
- package/daemon/dist/domain/startup-submission-evidence.d.ts.map +1 -1
- package/daemon/dist/domain/startup-submission-evidence.js +11 -17
- package/daemon/dist/domain/startup-submission-evidence.js.map +1 -1
- package/daemon/dist/domain/successor-session-launcher.d.ts +2 -1
- package/daemon/dist/domain/successor-session-launcher.d.ts.map +1 -1
- package/daemon/dist/domain/successor-session-launcher.js +3 -1
- package/daemon/dist/domain/successor-session-launcher.js.map +1 -1
- package/daemon/dist/domain/terminal/herdr-adapter.d.ts +1 -1
- package/daemon/dist/domain/terminal/herdr-adapter.d.ts.map +1 -1
- package/daemon/dist/domain/terminal/herdr-adapter.js +22 -4
- package/daemon/dist/domain/terminal/herdr-adapter.js.map +1 -1
- package/daemon/dist/domain/types.d.ts +15 -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-browser.d.ts.map +1 -1
- package/daemon/dist/domain/user-settings/settings-browser.js +2 -0
- package/daemon/dist/domain/user-settings/settings-browser.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 +33 -7
- package/daemon/dist/domain/user-settings/settings-store.js.map +1 -1
- package/daemon/dist/domain/watchdog-delivery.d.ts +3 -23
- package/daemon/dist/domain/watchdog-delivery.d.ts.map +1 -1
- package/daemon/dist/domain/watchdog-delivery.js +12 -89
- package/daemon/dist/domain/watchdog-delivery.js.map +1 -1
- package/daemon/dist/domain/watchdog-history-log.d.ts +5 -2
- package/daemon/dist/domain/watchdog-history-log.d.ts.map +1 -1
- package/daemon/dist/domain/watchdog-history-log.js.map +1 -1
- package/daemon/dist/domain/watchdog-jobs-repository.d.ts +2 -2
- package/daemon/dist/domain/watchdog-jobs-repository.d.ts.map +1 -1
- package/daemon/dist/domain/watchdog-jobs-repository.js +4 -0
- package/daemon/dist/domain/watchdog-jobs-repository.js.map +1 -1
- package/daemon/dist/domain/watchdog-policy-engine.d.ts +16 -24
- package/daemon/dist/domain/watchdog-policy-engine.d.ts.map +1 -1
- package/daemon/dist/domain/watchdog-policy-engine.js +44 -43
- package/daemon/dist/domain/watchdog-policy-engine.js.map +1 -1
- package/daemon/dist/domain/whoami-service.d.ts +2 -0
- package/daemon/dist/domain/whoami-service.d.ts.map +1 -1
- package/daemon/dist/domain/whoami-service.js +23 -6
- package/daemon/dist/domain/whoami-service.js.map +1 -1
- package/daemon/dist/domain/workflow-boot-sweep.d.ts +2 -1
- package/daemon/dist/domain/workflow-boot-sweep.d.ts.map +1 -1
- package/daemon/dist/domain/workflow-boot-sweep.js +11 -5
- package/daemon/dist/domain/workflow-boot-sweep.js.map +1 -1
- package/daemon/dist/domain/workflow-exception-escalation.d.ts.map +1 -1
- package/daemon/dist/domain/workflow-exception-escalation.js +2 -1
- package/daemon/dist/domain/workflow-exception-escalation.js.map +1 -1
- package/daemon/dist/domain/workflow-projector.d.ts.map +1 -1
- package/daemon/dist/domain/workflow-projector.js +5 -2
- package/daemon/dist/domain/workflow-projector.js.map +1 -1
- package/daemon/dist/domain/workflow-role-context.js +2 -2
- package/daemon/dist/domain/workflow-role-context.js.map +1 -1
- package/daemon/dist/domain/workflow-runtime.d.ts +1 -1
- package/daemon/dist/domain/workflow-runtime.d.ts.map +1 -1
- package/daemon/dist/domain/workflow-runtime.js +2 -0
- package/daemon/dist/domain/workflow-runtime.js.map +1 -1
- package/daemon/dist/routes/activity.d.ts +13 -1
- package/daemon/dist/routes/activity.d.ts.map +1 -1
- package/daemon/dist/routes/activity.js +67 -2
- 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 +2 -0
- package/daemon/dist/routes/agent-images.js.map +1 -1
- package/daemon/dist/routes/compaction.d.ts.map +1 -1
- package/daemon/dist/routes/compaction.js +7 -2
- package/daemon/dist/routes/compaction.js.map +1 -1
- package/daemon/dist/routes/discovery.js +3 -0
- package/daemon/dist/routes/discovery.js.map +1 -1
- package/daemon/dist/routes/down.js +9 -1
- package/daemon/dist/routes/down.js.map +1 -1
- package/daemon/dist/routes/gateway.d.ts +2 -0
- package/daemon/dist/routes/gateway.d.ts.map +1 -1
- package/daemon/dist/routes/gateway.js +181 -1
- package/daemon/dist/routes/gateway.js.map +1 -1
- package/daemon/dist/routes/kernel-status.js +6 -1
- package/daemon/dist/routes/kernel-status.js.map +1 -1
- package/daemon/dist/routes/provider.d.ts.map +1 -1
- package/daemon/dist/routes/provider.js +0 -73
- package/daemon/dist/routes/provider.js.map +1 -1
- package/daemon/dist/routes/queue.d.ts.map +1 -1
- package/daemon/dist/routes/queue.js +73 -13
- package/daemon/dist/routes/queue.js.map +1 -1
- package/daemon/dist/routes/rigs.d.ts.map +1 -1
- package/daemon/dist/routes/rigs.js +29 -10
- package/daemon/dist/routes/rigs.js.map +1 -1
- package/daemon/dist/routes/rigspec.js +2 -3
- package/daemon/dist/routes/rigspec.js.map +1 -1
- package/daemon/dist/routes/seat.js +2 -2
- package/daemon/dist/routes/seat.js.map +1 -1
- package/daemon/dist/routes/skills.js +2 -2
- package/daemon/dist/routes/skills.js.map +1 -1
- package/daemon/dist/routes/transcripts.d.ts.map +1 -1
- package/daemon/dist/routes/transcripts.js +7 -3
- package/daemon/dist/routes/transcripts.js.map +1 -1
- package/daemon/dist/routes/transport.js +1 -1
- package/daemon/dist/routes/transport.js.map +1 -1
- package/daemon/dist/routes/up.js +36 -52
- package/daemon/dist/routes/up.js.map +1 -1
- package/daemon/dist/startup.d.ts.map +1 -1
- package/daemon/dist/startup.js +102 -60
- package/daemon/dist/startup.js.map +1 -1
- package/daemon/docs/reference/agent-state-taxonomy.md +17 -2
- package/daemon/docs/reference/getting-started.md +87 -21
- package/daemon/docs/reference/quickstart.md +33 -20
- package/daemon/docs/reference/refocus-channel.md +9 -3
- package/daemon/docs/reference/rig-spec.md +1 -1
- package/daemon/docs/reference/seat-delivery.md +57 -18
- package/daemon/docs/reference/slack-app-setup.md +49 -2
- package/daemon/docs/reference/whats-new.md +123 -68
- package/daemon/specs/agents/shared/skills/core/messaging-the-human/SKILL.md +24 -0
- package/daemon/specs/agents/shared/skills/core/openrig-skills/SKILL.md +2 -2
- package/daemon/specs/agents/shared/skills/core/openrig-upgrade/SKILL.md +11 -5
- package/daemon/specs/agents/shared/skills/pods/development-team/SKILL.md +2 -0
- package/daemon/specs/agents/shared/skills/pods/development-team/references/refactoring.md +11 -0
- package/daemon/specs/agents/shared/skills/pods/review-team/SKILL.md +46 -96
- package/daemon/specs/agents/shared/skills/process/verification-before-completion/SKILL.md +17 -80
- package/daemon/specs/agents/shared/skills/process/verification-before-completion/references/performance-claims.md +12 -0
- package/daemon/specs/rigs/launch/kernel/agents/operator/agent/guidance/role.md +93 -14
- package/dist/build-info.js +3 -3
- package/dist/cli-error.d.ts +4 -0
- package/dist/cli-error.d.ts.map +1 -1
- package/dist/cli-error.js +6 -0
- package/dist/cli-error.js.map +1 -1
- package/dist/commands/agent-image.d.ts.map +1 -1
- package/dist/commands/agent-image.js +15 -7
- package/dist/commands/agent-image.js.map +1 -1
- package/dist/commands/archive.d.ts.map +1 -1
- package/dist/commands/archive.js +17 -3
- package/dist/commands/archive.js.map +1 -1
- package/dist/commands/attach.d.ts.map +1 -1
- package/dist/commands/attach.js +6 -4
- package/dist/commands/attach.js.map +1 -1
- package/dist/commands/broadcast.js +2 -0
- package/dist/commands/broadcast.js.map +1 -1
- package/dist/commands/community-harness.d.ts.map +1 -1
- package/dist/commands/community-harness.js +2 -1
- package/dist/commands/community-harness.js.map +1 -1
- package/dist/commands/compact-plan.d.ts.map +1 -1
- package/dist/commands/compact-plan.js +2 -1
- package/dist/commands/compact-plan.js.map +1 -1
- package/dist/commands/compact.d.ts.map +1 -1
- package/dist/commands/compact.js +10 -3
- package/dist/commands/compact.js.map +1 -1
- package/dist/commands/config.d.ts.map +1 -1
- package/dist/commands/config.js +10 -2
- package/dist/commands/config.js.map +1 -1
- package/dist/commands/context.d.ts.map +1 -1
- package/dist/commands/context.js +16 -9
- package/dist/commands/context.js.map +1 -1
- package/dist/commands/expand.d.ts.map +1 -1
- package/dist/commands/expand.js +16 -2
- package/dist/commands/expand.js.map +1 -1
- package/dist/commands/export.d.ts.map +1 -1
- package/dist/commands/export.js +9 -2
- package/dist/commands/export.js.map +1 -1
- package/dist/commands/fork.d.ts.map +1 -1
- package/dist/commands/fork.js +3 -1
- package/dist/commands/fork.js.map +1 -1
- package/dist/commands/gateway.d.ts +39 -0
- package/dist/commands/gateway.d.ts.map +1 -1
- package/dist/commands/gateway.js +310 -3
- package/dist/commands/gateway.js.map +1 -1
- package/dist/commands/health.js +3 -2
- package/dist/commands/health.js.map +1 -1
- package/dist/commands/host.d.ts +1 -1
- package/dist/commands/host.d.ts.map +1 -1
- package/dist/commands/host.js +2 -2
- package/dist/commands/host.js.map +1 -1
- package/dist/commands/launch.d.ts.map +1 -1
- package/dist/commands/launch.js +9 -2
- package/dist/commands/launch.js.map +1 -1
- package/dist/commands/plugin.d.ts.map +1 -1
- package/dist/commands/plugin.js +2 -1
- package/dist/commands/plugin.js.map +1 -1
- package/dist/commands/provider.d.ts.map +1 -1
- package/dist/commands/provider.js +0 -73
- package/dist/commands/provider.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 +95 -5
- package/dist/commands/ps.js.map +1 -1
- package/dist/commands/queue.d.ts +4 -0
- package/dist/commands/queue.d.ts.map +1 -1
- package/dist/commands/queue.js +78 -3
- package/dist/commands/queue.js.map +1 -1
- package/dist/commands/release.d.ts.map +1 -1
- package/dist/commands/release.js +16 -2
- package/dist/commands/release.js.map +1 -1
- package/dist/commands/restore-check.d.ts.map +1 -1
- package/dist/commands/restore-check.js +2 -1
- package/dist/commands/restore-check.js.map +1 -1
- package/dist/commands/restore-packet.d.ts.map +1 -1
- package/dist/commands/restore-packet.js +2 -1
- package/dist/commands/restore-packet.js.map +1 -1
- package/dist/commands/restore.d.ts.map +1 -1
- package/dist/commands/restore.js +23 -6
- package/dist/commands/restore.js.map +1 -1
- package/dist/commands/scope.d.ts.map +1 -1
- package/dist/commands/scope.js +5 -2
- package/dist/commands/scope.js.map +1 -1
- package/dist/commands/seat.js +0 -4
- package/dist/commands/seat.js.map +1 -1
- package/dist/commands/send.d.ts.map +1 -1
- package/dist/commands/send.js +27 -3
- package/dist/commands/send.js.map +1 -1
- package/dist/commands/setup.d.ts +3 -0
- package/dist/commands/setup.d.ts.map +1 -1
- package/dist/commands/setup.js +29 -9
- package/dist/commands/setup.js.map +1 -1
- package/dist/commands/shrink.d.ts.map +1 -1
- package/dist/commands/shrink.js +16 -2
- package/dist/commands/shrink.js.map +1 -1
- package/dist/commands/slack.d.ts.map +1 -1
- package/dist/commands/slack.js +11 -24
- package/dist/commands/slack.js.map +1 -1
- package/dist/commands/snapshot.d.ts.map +1 -1
- package/dist/commands/snapshot.js +36 -10
- package/dist/commands/snapshot.js.map +1 -1
- package/dist/commands/specs.d.ts.map +1 -1
- package/dist/commands/specs.js +11 -5
- package/dist/commands/specs.js.map +1 -1
- package/dist/commands/start.d.ts.map +1 -1
- package/dist/commands/start.js +36 -10
- package/dist/commands/start.js.map +1 -1
- package/dist/commands/status.d.ts.map +1 -1
- package/dist/commands/status.js +4 -1
- package/dist/commands/status.js.map +1 -1
- package/dist/commands/transcript.d.ts.map +1 -1
- package/dist/commands/transcript.js +12 -7
- package/dist/commands/transcript.js.map +1 -1
- package/dist/commands/unarchive.d.ts.map +1 -1
- package/dist/commands/unarchive.js +16 -2
- package/dist/commands/unarchive.js.map +1 -1
- package/dist/commands/up.d.ts.map +1 -1
- package/dist/commands/up.js +33 -7
- package/dist/commands/up.js.map +1 -1
- package/dist/commands/walk.d.ts.map +1 -1
- package/dist/commands/walk.js +2 -1
- package/dist/commands/walk.js.map +1 -1
- package/dist/commands/whoami.d.ts.map +1 -1
- package/dist/commands/whoami.js +3 -0
- package/dist/commands/whoami.js.map +1 -1
- package/dist/config-store.d.ts +4 -2
- package/dist/config-store.d.ts.map +1 -1
- package/dist/config-store.js +34 -7
- package/dist/config-store.js.map +1 -1
- package/dist/daemon-lifecycle.d.ts +9 -4
- package/dist/daemon-lifecycle.d.ts.map +1 -1
- package/dist/daemon-lifecycle.js +27 -9
- package/dist/daemon-lifecycle.js.map +1 -1
- package/dist/daemon-reachability.d.ts +13 -0
- package/dist/daemon-reachability.d.ts.map +1 -1
- package/dist/daemon-reachability.js +28 -0
- package/dist/daemon-reachability.js.map +1 -1
- package/dist/fetch-with-timeout.d.ts.map +1 -1
- package/dist/fetch-with-timeout.js +19 -16
- package/dist/fetch-with-timeout.js.map +1 -1
- package/dist/host-bindings.d.ts +6 -0
- package/dist/host-bindings.d.ts.map +1 -1
- package/dist/host-bindings.js +7 -4
- package/dist/host-bindings.js.map +1 -1
- package/dist/lib/bundle-check.d.ts.map +1 -1
- package/dist/lib/bundle-check.js +13 -5
- package/dist/lib/bundle-check.js.map +1 -1
- package/dist/mcp-server.d.ts.map +1 -1
- package/dist/mcp-server.js +57 -14
- package/dist/mcp-server.js.map +1 -1
- package/dist/rig-handle.d.ts +18 -1
- package/dist/rig-handle.d.ts.map +1 -1
- package/dist/rig-handle.js +19 -2
- package/dist/rig-handle.js.map +1 -1
- package/package.json +1 -1
- package/tui/dist/config/config-model.js +1 -1
- package/tui/dist/config/config-model.js.map +1 -1
- package/tui/dist/connections/connections-model.d.ts +0 -5
- package/tui/dist/connections/connections-model.d.ts.map +1 -1
- package/tui/dist/connections/connections-model.js +1 -1
- package/tui/dist/connections/connections-model.js.map +1 -1
- package/tui/dist/daemon-client.d.ts +2 -0
- package/tui/dist/daemon-client.d.ts.map +1 -1
- package/tui/dist/daemon-client.js +23 -0
- package/tui/dist/daemon-client.js.map +1 -1
- package/tui/dist/hydrate.d.ts.map +1 -1
- package/tui/dist/hydrate.js +13 -1
- package/tui/dist/hydrate.js.map +1 -1
- package/tui/dist/live.d.ts +10 -1
- package/tui/dist/live.d.ts.map +1 -1
- package/tui/dist/live.js +56 -7
- package/tui/dist/live.js.map +1 -1
- package/tui/dist/main.js +35 -2
- package/tui/dist/main.js.map +1 -1
- package/tui/dist/render.d.ts.map +1 -1
- package/tui/dist/render.js +111 -7
- package/tui/dist/render.js.map +1 -1
- package/tui/dist/types.d.ts +53 -0
- package/tui/dist/types.d.ts.map +1 -1
- package/tui/dist/version-skew.d.ts +24 -0
- package/tui/dist/version-skew.d.ts.map +1 -0
- package/tui/dist/version-skew.js +37 -0
- package/tui/dist/version-skew.js.map +1 -0
- package/daemon/dist/domain/provider/subscription-moves.d.ts +0 -77
- package/daemon/dist/domain/provider/subscription-moves.d.ts.map +0 -1
- package/daemon/dist/domain/provider/subscription-moves.js +0 -140
- package/daemon/dist/domain/provider/subscription-moves.js.map +0 -1
|
@@ -22,7 +22,7 @@ import { downloadPrivateFile, isSlackHost, lookupBotApp, postChatMessage } from
|
|
|
22
22
|
import { botInboxProblems } from "./bot-inbox.js";
|
|
23
23
|
import { loadConfig } from "./config.js";
|
|
24
24
|
import { resolveSecret } from "./secrets.js";
|
|
25
|
-
import { SeenStore, DeadLetterStore, InboundReceiptStore } from "./state-store.js";
|
|
25
|
+
import { SeenStore, DeadLetterStore, InboundReceiptStore, slackMicros } from "./state-store.js";
|
|
26
26
|
import { makeQueuePorts } from "./queue-access.js";
|
|
27
27
|
import { SlackOutboundDriver, OUTBOUND_OP } from "./outbound-driver.js";
|
|
28
28
|
import { abortableSleep, subsystemSlackDeliver } from "./slack-delivery.js";
|
|
@@ -32,12 +32,14 @@ import { ThreadSeatMap, formatPostedStamp } from "./thread-seat-map.js";
|
|
|
32
32
|
import { makeThreadRouteResolver } from "./thread-routing.js";
|
|
33
33
|
import { resolveInboundChannelDestination, resolveOutboundChannel, unsupportedChannelMapFields } from "./channel-map.js";
|
|
34
34
|
import { resolveRigRepresentative } from "../../queue-owner.js";
|
|
35
|
+
import { recoveryTag } from "../../queue-recovery.js";
|
|
35
36
|
import { getSelfHostId } from "../../hosts/fanout-contract.js";
|
|
36
37
|
import { envelopeChannel, forwardChannelProblems, makeEnvelopeForwarder } from "./forwarding.js";
|
|
37
38
|
import { startSocketInbound } from "./socket-inbound.js";
|
|
38
39
|
import { loadHumanRegistry, resolveSlackHandle } from "../human-registry.js";
|
|
39
40
|
import { hasLiveHumanGate, isBlockerLive } from "../../queue-repository.js";
|
|
40
41
|
import { formatReplyToChoice, REPLY_TO_CHOICE_ACTOR, REPLY_TO_CHAIN_LIMIT } from "../../reply-to-choice.js";
|
|
42
|
+
import { isHumanSeatSession } from "../../human-route-enforcer.js";
|
|
41
43
|
import { ownerNotificationLevelAtLeast } from "../../queue-transition-log.js";
|
|
42
44
|
// OPR.0.5.6.1 — the delivery rules engine: ONE decision per message replaces
|
|
43
45
|
// the two dial-reads (the S14 default-decision stub). The legacy dial path
|
|
@@ -45,21 +47,50 @@ import { ownerNotificationLevelAtLeast } from "../../queue-transition-log.js";
|
|
|
45
47
|
// registered human (no prefs -> no engine input).
|
|
46
48
|
import { decideDelivery, resolveAvailability, isEscalationClass, formatDeliveryTermination, DELIVERY_TERMINATION_PREFIX, } from "../delivery-rules-engine.js";
|
|
47
49
|
import { armDeliveryDeferral } from "../../policies/delivery-deferral.js";
|
|
50
|
+
import { confirmReleaseAtPost, holdForQuiet } from "../../policies/quiet-release.js";
|
|
51
|
+
import { quietHoldFor } from "../human-quiet-windows.js";
|
|
48
52
|
import { WatchdogJobsRepository } from "../../watchdog-jobs-repository.js";
|
|
49
53
|
const SECRET_BOT = "SLACK_BOT_TOKEN";
|
|
50
54
|
const SECRET_APP = "SLACK_APP_TOKEN";
|
|
51
55
|
/** Compose an inbound reply with Mission Control's existing human-park resolver.
|
|
52
56
|
* A replay after the durable resolve but before inbound seen-mark is absorbed by
|
|
53
57
|
* the typed transition, so the waiting owner is resumed exactly once. */
|
|
54
|
-
export function makeHumanReplyResolver(queueRepo, contract) {
|
|
58
|
+
export function makeHumanReplyResolver(queueRepo, contract, home) {
|
|
55
59
|
return async (input) => {
|
|
56
|
-
|
|
60
|
+
const source = queueRepo.getById(input.qitemId);
|
|
61
|
+
if (source?.humanIntent === "update")
|
|
57
62
|
return "not-applicable";
|
|
58
63
|
if (!contract)
|
|
59
64
|
return "not-applicable";
|
|
65
|
+
const uncertainDecision = `${input.decision}\n\n---\nOpenRig timing context (Slack reply ${JSON.stringify([input.actorSession, input.messageTs ?? null])}): This reply resumed the question, but its ordering against the posted question could not be confirmed. Resuming is not approval; read the person's words in context.`;
|
|
66
|
+
// An acknowledgement retry must not resolve again. Match this reply's durable
|
|
67
|
+
// context, not an older episode's generic resolved marker.
|
|
68
|
+
if (slackMicros(input.messageTs) !== null && queueRepo.transitionLog.listForQitem(input.qitemId)
|
|
69
|
+
.some((transition) => transition.ownerNotificationKind === "human-decision-resolved" && transition.transitionNote === uncertainDecision)) {
|
|
70
|
+
return "resolved-uncertain";
|
|
71
|
+
}
|
|
72
|
+
let uncertain = false;
|
|
73
|
+
if (source?.state === "blocked" && isHumanSeatSession(source.blockedOn)) {
|
|
74
|
+
const episode = queueRepo.transitionLog.listForQitem(input.qitemId)
|
|
75
|
+
.filter((transition) => transition.ownerNotificationKind === "human-required").at(-1);
|
|
76
|
+
if (!episode)
|
|
77
|
+
return "not-applicable";
|
|
78
|
+
const key = `${input.qitemId}:${episode.transitionId}`;
|
|
79
|
+
const receipt = queueRepo.transitionLog.getOwnerNotificationReceipt(input.qitemId, key);
|
|
80
|
+
// A final receipt attests delivery even when reconciliation lost its timestamp.
|
|
81
|
+
// Without one, ONLY a unique exact current-episode primary proves anything.
|
|
82
|
+
const primary = !receipt && home ? pendingPrimaryReceipt(home, input.qitemId, key) : null;
|
|
83
|
+
if (!receipt && !primary)
|
|
84
|
+
return "not-applicable";
|
|
85
|
+
const posted = slackMicros(receipt?.messageTs ?? primary?.messageTs);
|
|
86
|
+
const replied = slackMicros(input.messageTs);
|
|
87
|
+
if (posted !== null && replied !== null && replied <= posted)
|
|
88
|
+
return "not-applicable";
|
|
89
|
+
uncertain = Boolean(receipt?.digest) || posted === null || replied === null;
|
|
90
|
+
}
|
|
60
91
|
try {
|
|
61
|
-
await contract.act({ verb: "resolve", ...input });
|
|
62
|
-
return "resolved";
|
|
92
|
+
await contract.act({ verb: "resolve", ...input, decision: uncertain ? uncertainDecision : input.decision });
|
|
93
|
+
return uncertain ? "resolved-uncertain" : "resolved";
|
|
63
94
|
}
|
|
64
95
|
catch (error) {
|
|
65
96
|
if (error.code !== "qitem_not_leg1_parked")
|
|
@@ -77,6 +108,28 @@ export function makeHumanReplyResolver(queueRepo, contract) {
|
|
|
77
108
|
}
|
|
78
109
|
};
|
|
79
110
|
}
|
|
111
|
+
/** Read positive multipart evidence without changing final receipt/ack ownership. */
|
|
112
|
+
function pendingPrimaryReceipt(home, qitemId, notificationKey) {
|
|
113
|
+
const pending = new DispatchBuffer(home).pending().filter((decision) => {
|
|
114
|
+
const p = decision.payload;
|
|
115
|
+
return decision.op === OUTBOUND_OP && p?.qitemId === qitemId
|
|
116
|
+
&& p.notificationKey === notificationKey && p.ownerNotificationKind === "human-required";
|
|
117
|
+
});
|
|
118
|
+
if (pending.length !== 1)
|
|
119
|
+
return null;
|
|
120
|
+
const prefix = `${pending[0].decisionId}::primary-receipt::`;
|
|
121
|
+
const records = [...new SeenStore(path.join(stateDir(home), "slack-attempted-decisions.jsonl")).load()]
|
|
122
|
+
.filter((id) => id.startsWith(prefix));
|
|
123
|
+
if (records.length !== 1)
|
|
124
|
+
return null;
|
|
125
|
+
try {
|
|
126
|
+
const receipt = JSON.parse(Buffer.from(records[0].slice(prefix.length), "base64url").toString("utf8"));
|
|
127
|
+
return slackMicros(receipt?.messageTs) !== null ? { messageTs: receipt.messageTs } : null;
|
|
128
|
+
}
|
|
129
|
+
catch {
|
|
130
|
+
return null;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
80
133
|
/**
|
|
81
134
|
* OPR.0.5.6.2 — the inbound file port: Slack `url_private` → authenticated
|
|
82
135
|
* download → workspace-local media file → LOCAL path for the reply row.
|
|
@@ -144,19 +197,17 @@ function stateDir(home) {
|
|
|
144
197
|
return path.join(home, "state");
|
|
145
198
|
}
|
|
146
199
|
/** The status fields for the retry pass's durable custody. Counts RECORDS across the
|
|
147
|
-
* inbound-event and
|
|
200
|
+
* inbound-event, click and relay dead-letter files — the event file also carries reactions,
|
|
148
201
|
* and a message that left more than one record is counted once per record, so the
|
|
149
202
|
* retry pass owns exactly these records. When any file cannot be read the count is
|
|
150
203
|
* `null`, not 0: a number (or a zero) beside an unknown state still reads as "nothing
|
|
151
204
|
* stuck" to a consumer that only looks at the count, so the state and the reason tell
|
|
152
|
-
* the truth and the number says it does not know.
|
|
153
|
-
*
|
|
205
|
+
* the truth and the number says it does not know. An inert connector reports the same
|
|
206
|
+
* retained records without starting retries. */
|
|
154
207
|
function deadLetterBacklogFields(dead, deadActions, deadForwards) {
|
|
155
|
-
if (!dead || !deadActions)
|
|
156
|
-
return {};
|
|
157
208
|
let records = 0;
|
|
158
209
|
let reason;
|
|
159
|
-
for (const store of [dead, deadActions,
|
|
210
|
+
for (const store of [dead, deadActions, deadForwards]) {
|
|
160
211
|
const result = store.readResult();
|
|
161
212
|
if (result.ok)
|
|
162
213
|
records += result.entries.length;
|
|
@@ -180,6 +231,11 @@ export function buildSlackGatewayWire(opts) {
|
|
|
180
231
|
const app = resolveSecret(SECRET_APP, { envFile });
|
|
181
232
|
const outboundReady = cfg.enabled && bot !== null && cfg.channel !== null;
|
|
182
233
|
const inboundReady = cfg.enabled && app !== null;
|
|
234
|
+
const inboundRouting = { fallback: "local", destination: cfg.inboundDestination };
|
|
235
|
+
const dead = new DeadLetterStore(path.join(stateDir(opts.home), "slack-inbound-deadletter.jsonl"));
|
|
236
|
+
const deadActions = new DeadLetterStore(path.join(stateDir(opts.home), "slack-inbound-action-deadletter.jsonl"));
|
|
237
|
+
// Retained relays belong to their original host, even after forwarding configuration changes.
|
|
238
|
+
const deadForwards = new DeadLetterStore(path.join(stateDir(opts.home), "slack-inbound-forward-deadletter.jsonl"));
|
|
183
239
|
if (!outboundReady && !inboundReady) {
|
|
184
240
|
const missing = !cfg.enabled ? "connector disabled (rig slack enable)" : !bot ? "SLACK_BOT_TOKEN unresolved" : "channel unconfigured";
|
|
185
241
|
log(`slack delivery not configured (${missing}) — wire is inert; dispatches would be refused honestly`);
|
|
@@ -189,7 +245,7 @@ export function buildSlackGatewayWire(opts) {
|
|
|
189
245
|
deliver: async () => ({ ok: false, class: "slack-not-configured", detail: missing }),
|
|
190
246
|
log,
|
|
191
247
|
});
|
|
192
|
-
return { ...inert, status: () => ({ platform: "slack", configurationDigest: channelStateDigest(cfg), outboundReady: false, inboundReady: false, recovery: { state: "unavailable", reason: "inbound-not-configured" }, inbound: { state: "not-configured" } }) };
|
|
248
|
+
return { ...inert, status: () => ({ platform: "slack", configurationDigest: channelStateDigest(cfg), outboundReady: false, inboundReady: false, inboundRouting, recovery: { state: "unavailable", reason: "inbound-not-configured" }, inbound: { state: "not-configured" }, ...deadLetterBacklogFields(dead, deadActions, deadForwards) }) };
|
|
193
249
|
}
|
|
194
250
|
const registrySurface = opts.registry ?? { loadHumanRegistry, resolveSlackHandle };
|
|
195
251
|
const ports = makeQueuePorts(opts.queueRepo, {
|
|
@@ -220,6 +276,7 @@ export function buildSlackGatewayWire(opts) {
|
|
|
220
276
|
minimumLevelThatPosts: cfg.minimumLevelThatPosts,
|
|
221
277
|
minimumLevelThatInterrupts: cfg.minimumLevelThatInterrupts,
|
|
222
278
|
},
|
|
279
|
+
quiet: quietHoldFor(opts.queueRepo.db, human.entityId, new Date()),
|
|
223
280
|
});
|
|
224
281
|
};
|
|
225
282
|
const outboundSeen = new SeenStore(path.join(stateDir(opts.home), "slack-outbound-seen.jsonl"));
|
|
@@ -239,13 +296,17 @@ export function buildSlackGatewayWire(opts) {
|
|
|
239
296
|
// sees it. Tell the seat that asked, once: the notice's id derives from the ask's, so a replay
|
|
240
297
|
// returns the same row instead of a second one.
|
|
241
298
|
// A retry that can't post the rest of an ask some of which may already be in Slack says so.
|
|
242
|
-
const notifySourceUndeliverable = (p, detail, partlyPosted = false) => {
|
|
299
|
+
const notifySourceUndeliverable = (p, detail, partlyPosted = false, invalidBlocks = false) => {
|
|
243
300
|
const seat = p.sourceSession;
|
|
244
301
|
if (!p.qitemId || !seat)
|
|
245
302
|
return;
|
|
246
303
|
const human = p.destinationSession ?? "the person";
|
|
304
|
+
// A prior episode's notice must not hide this explicit Slack rejection.
|
|
305
|
+
const noticeId = invalidBlocks
|
|
306
|
+
? `${p.notificationKey ?? p.qitemId}-invalid-blocks-undeliverable`
|
|
307
|
+
: `${p.qitemId}-undeliverable`;
|
|
247
308
|
opts.queueRepo.create({
|
|
248
|
-
qitemId:
|
|
309
|
+
qitemId: noticeId,
|
|
249
310
|
sourceSession: seat,
|
|
250
311
|
destinationSession: seat,
|
|
251
312
|
summary: `Not delivered to ${human}: ${p.summary ?? p.qitemId}`,
|
|
@@ -256,22 +317,29 @@ export function buildSlackGatewayWire(opts) {
|
|
|
256
317
|
"",
|
|
257
318
|
`Reason: ${detail}`,
|
|
258
319
|
"",
|
|
259
|
-
|
|
260
|
-
? "
|
|
261
|
-
:
|
|
320
|
+
invalidBlocks
|
|
321
|
+
? "Slack rejected the message blocks. OpenRig will not retry this payload. Check its evidence links and message content, then send a corrected ask as a new queue item. The original row remains undelivered; close it when you have handled it."
|
|
322
|
+
: partlyPosted
|
|
323
|
+
? "Check the thread in Slack and send what's missing as a new ask. The original row stays open until you close it."
|
|
324
|
+
: "Shorten it and send it as a new ask. The original row stays open until you close it.",
|
|
262
325
|
].join("\n"),
|
|
263
326
|
evidenceRef: `rig queue show ${p.qitemId}`,
|
|
264
|
-
tags: ["slack-undeliverable"],
|
|
327
|
+
tags: ["slack-undeliverable", recoveryTag(p.qitemId)],
|
|
265
328
|
}).catch((e) => log(`undeliverable notice FAILED for ${p.qitemId}: ${e.message}`));
|
|
266
329
|
};
|
|
267
330
|
const recordTransportFailed = (p, failureClass, detail, partlyPosted) => {
|
|
268
331
|
if (!p.qitemId)
|
|
269
332
|
return;
|
|
270
|
-
if (failureClass === "human-message-unrenderable")
|
|
271
|
-
notifySourceUndeliverable(p, detail, partlyPosted);
|
|
333
|
+
if (failureClass === "human-message-unrenderable" || failureClass === "slack-invalid-blocks") {
|
|
334
|
+
notifySourceUndeliverable(p, detail, partlyPosted, failureClass === "slack-invalid-blocks");
|
|
335
|
+
}
|
|
272
336
|
const key = p.notificationKey ?? p.qitemId;
|
|
273
|
-
const
|
|
274
|
-
&& transition.transitionNote.split(/\s+/).includes(`notification_key=${key}`));
|
|
337
|
+
const previousFailure = opts.queueRepo.transitionLog.listForQitem(p.qitemId).filter((transition) => transition.transitionNote?.startsWith("slack-owner-notification-transport-failed ")
|
|
338
|
+
&& transition.transitionNote.split(/\s+/).includes(`notification_key=${key}`)).at(-1);
|
|
339
|
+
// A corrected attempt can fail transiently after a permanent rejection, and a
|
|
340
|
+
// transient failure can be followed by a definite rejection. Preserve both changes.
|
|
341
|
+
const alreadyRecorded = previousFailure &&
|
|
342
|
+
previousFailure.transitionNote.includes("class=slack-invalid-blocks ") === (failureClass === "slack-invalid-blocks");
|
|
275
343
|
if (alreadyRecorded)
|
|
276
344
|
return;
|
|
277
345
|
opts.queueRepo.update({
|
|
@@ -372,6 +440,8 @@ export function buildSlackGatewayWire(opts) {
|
|
|
372
440
|
const runCtl = new AbortController();
|
|
373
441
|
// Late-bound so deliver can release the driver's in-flight guard (built after the wire).
|
|
374
442
|
let releaseRef = () => { };
|
|
443
|
+
// The wire's own dispatcher, bound once the wire exists: a delivery step that must mint a new durable decision.
|
|
444
|
+
let selfDispatch = () => ({ ok: false, error: "wire not built" });
|
|
375
445
|
const deliver = outboundReady
|
|
376
446
|
? subsystemSlackDeliver({
|
|
377
447
|
botToken: bot,
|
|
@@ -436,8 +506,17 @@ export function buildSlackGatewayWire(opts) {
|
|
|
436
506
|
// registered humans; the dial pair remains only for the null degrade.
|
|
437
507
|
if (p.deliveryDigestPost)
|
|
438
508
|
return undefined; // notify-class aggregate, never a mention
|
|
509
|
+
if (p.quietRelease)
|
|
510
|
+
return undefined; // releasing a quiet hold: posted, never a mention
|
|
439
511
|
const fire = p.deliveryDeferralFire === true;
|
|
440
|
-
|
|
512
|
+
// At post time the decision was just made; if it can't be re-read now (quiet hours unreadable), no mention.
|
|
513
|
+
let decision;
|
|
514
|
+
try {
|
|
515
|
+
decision = fire ? null : decideForPayload(p);
|
|
516
|
+
}
|
|
517
|
+
catch {
|
|
518
|
+
return undefined;
|
|
519
|
+
}
|
|
441
520
|
const eligible = fire
|
|
442
521
|
? true // the deferred interrupt mentions at fire time — that IS the deferral's promise
|
|
443
522
|
: decision
|
|
@@ -588,6 +667,85 @@ export function buildSlackGatewayWire(opts) {
|
|
|
588
667
|
outboundSeen.mark(key, "dropped-row-not-active");
|
|
589
668
|
releaseRef(key);
|
|
590
669
|
};
|
|
670
|
+
// An earlier attempt of this exact decision may be in Slack with its response lost. A gate that would hold, trim, defer
|
|
671
|
+
// or ack it (instead of handing it to delivery) resolves that first, through the reconciler. Found goes to delivery
|
|
672
|
+
// unchanged, which records receipts for what was posted and never posts it again in another form. A post confirmed
|
|
673
|
+
// partly in Slack (its first part found, the post not complete) also goes to delivery: only its own remaining parts
|
|
674
|
+
// post, under its own part ids and in its own thread and channel, even during quiet hours. A scan that can't be read
|
|
675
|
+
// retains the decision. Never-attempted and absent attempts, and a scan that couldn't finish, haven't started: they
|
|
676
|
+
// go on through the gate like any other post. Where the gate posts,
|
|
677
|
+
// delivery reconciles (keeping its at-least-once post for an unfinished scan); where it holds, the release posts it
|
|
678
|
+
// after quiet. A decision that goes straight to delivery skips this.
|
|
679
|
+
const resolveEarlierAttempt = async (decision) => {
|
|
680
|
+
const landing = "landing" in deliver ? await deliver.landing(decision) : "unattempted";
|
|
681
|
+
if (landing === "found" || landing === "partial")
|
|
682
|
+
return deliver(decision);
|
|
683
|
+
if (typeof landing === "object" && landing !== null) {
|
|
684
|
+
return { ok: false, class: "reconcile-unreadable", detail: landing.unreadable };
|
|
685
|
+
}
|
|
686
|
+
return null;
|
|
687
|
+
};
|
|
688
|
+
// A digest post was decided before it was posted. By the time it is delivered (a buffered post replayed after a
|
|
689
|
+
// restart, say), some members may already be owned elsewhere: posted (a receipt), or held for quiet hours (a hold
|
|
690
|
+
// note, so the window's release job posts it). And if the recipient's quiet hours began in between, its routine
|
|
691
|
+
// members are held now rather than posted into them; a member that has since become an escalation still posts.
|
|
692
|
+
// The original decision only ever carries its original payload: if what's left differs, it goes out as a new
|
|
693
|
+
// decision with its own id and receipts (enqueued before the original is acked), so a post under one id never has two
|
|
694
|
+
// contents, and receipts bind to exactly the members posted under it. An earlier attempt of the original that may
|
|
695
|
+
// have landed is resolved by the reconciler first. If the quiet state can't be read, nothing posts (see the catch).
|
|
696
|
+
const deliverDigestPost = async (decision, p) => {
|
|
697
|
+
const settled = await resolveEarlierAttempt(decision);
|
|
698
|
+
if (settled)
|
|
699
|
+
return settled;
|
|
700
|
+
const recipient = (p.destinationSession ?? "").split("@")[0] ?? "";
|
|
701
|
+
let quiet;
|
|
702
|
+
try {
|
|
703
|
+
quiet = recipient ? quietHoldFor(opts.queueRepo.db, recipient, new Date()) : null;
|
|
704
|
+
}
|
|
705
|
+
catch (error) {
|
|
706
|
+
// An attempted digest (it may be in Slack) is retained: acked, the next flush would mint the ask again from the
|
|
707
|
+
// row as it is now. A never-attempted one is acked: its members keep their digest notes, so the next flush
|
|
708
|
+
// selects them again. A store check only: no Slack read on a failure path.
|
|
709
|
+
if ("attempted" in deliver && deliver.attempted(decision)) {
|
|
710
|
+
log(`digest post ${decision.decisionId} retained: quiet hours couldn't be read: ${error.message}`);
|
|
711
|
+
return { ok: false, class: "quiet-unreadable", detail: error.message };
|
|
712
|
+
}
|
|
713
|
+
log(`digest post ${decision.decisionId} not posted: quiet hours couldn't be read: ${error.message}`);
|
|
714
|
+
return { ok: true };
|
|
715
|
+
}
|
|
716
|
+
const aggregate = p.memberReceipts;
|
|
717
|
+
const members = aggregate ?? (p.qitemId ? [{ qitemId: p.qitemId, notificationKey: p.notificationKey ?? p.qitemId }] : []);
|
|
718
|
+
const owned = (m) => opts.queueRepo.transitionLog.hasOwnerNotificationReceipt(m.qitemId, m.notificationKey)
|
|
719
|
+
|| opts.queueRepo.listTransitions(m.qitemId).some((t) => (t.transitionNote ?? "").startsWith("delivery-decision: quiet-hold ")
|
|
720
|
+
&& (t.transitionNote ?? "").split(/\s+/).includes(`notification_key=${m.notificationKey}`));
|
|
721
|
+
const jobsRepo = new WatchdogJobsRepository(opts.queueRepo.db);
|
|
722
|
+
const escalation = (m) => {
|
|
723
|
+
const row = opts.queueRepo.getById(m.qitemId);
|
|
724
|
+
return !!row && row.humanIntent !== "update" && isEscalationClass(row.tags);
|
|
725
|
+
};
|
|
726
|
+
const kept = members.filter((m) => {
|
|
727
|
+
if (owned(m))
|
|
728
|
+
return false;
|
|
729
|
+
if (!quiet)
|
|
730
|
+
return true;
|
|
731
|
+
if (escalation(m))
|
|
732
|
+
return true;
|
|
733
|
+
holdForQuiet({ queueRepo: opts.queueRepo, jobsRepo, qitemId: m.qitemId, entityId: recipient, hold: { ...quiet, notificationKey: m.notificationKey } });
|
|
734
|
+
return false;
|
|
735
|
+
});
|
|
736
|
+
if (kept.length === members.length)
|
|
737
|
+
return deliver(decision); // unchanged: the original, as it is
|
|
738
|
+
if (kept.length === 0 || !aggregate)
|
|
739
|
+
return { ok: true }; // nothing left to post under it
|
|
740
|
+
const keptIds = new Set(kept.map((m) => m.qitemId));
|
|
741
|
+
const body = String(p.body ?? "").split("\n").filter((line) => [...keptIds].some((id) => line.endsWith(`[${id}]`))).join("\n");
|
|
742
|
+
const summary = String(p.summary ?? "").replace(/— \d+ item\(s\)/, `— ${kept.length} item(s)`);
|
|
743
|
+
const keptId = `${decision.decisionId}:kept:${createHash("sha256").update(kept.map((m) => m.notificationKey).sort().join(",")).digest("hex").slice(0, 16)}`;
|
|
744
|
+
// Durable first: the new decision is in the buffer before the original is acked (returning ok). A crash between the
|
|
745
|
+
// two replays the original, which computes the same kept set and id; the dispatcher accepts the pending id once.
|
|
746
|
+
const res = selfDispatch(keptId, { ...p, memberReceipts: kept, body, summary });
|
|
747
|
+
return res.ok ? { ok: true } : { ok: false, class: "kept-dispatch-refused", detail: res.error };
|
|
748
|
+
};
|
|
591
749
|
const engineDeliver = async (decision) => {
|
|
592
750
|
const p = (decision.payload ?? {});
|
|
593
751
|
// The decision-resolved notice is written at closure, so a closed row is its normal case.
|
|
@@ -606,7 +764,36 @@ export function buildSlackGatewayWire(opts) {
|
|
|
606
764
|
// A digest post is an already-decided aggregate — never re-consulted
|
|
607
765
|
// (member decisions were recorded at containment; receipts land in onPosted).
|
|
608
766
|
if (p.deliveryDigestPost)
|
|
609
|
-
return
|
|
767
|
+
return deliverDigestPost(decision, p);
|
|
768
|
+
// Releasing an ask held for quiet hours: it posts as itself, never re-consulted (that would digest C and D again). A
|
|
769
|
+
// receipt means it already did. A release can wait in the buffer (and be replayed after a restart), so it is
|
|
770
|
+
// re-checked here, at post time, against the recipient's quiet, the row and the posting threshold as they are now.
|
|
771
|
+
if (p.quietRelease) {
|
|
772
|
+
const key = p.notificationKey ?? p.qitemId;
|
|
773
|
+
if (p.qitemId && opts.queueRepo.transitionLog.hasOwnerNotificationReceipt(p.qitemId, key)) {
|
|
774
|
+
releaseRef(p.qitemId);
|
|
775
|
+
return { ok: true };
|
|
776
|
+
}
|
|
777
|
+
const settled = await resolveEarlierAttempt(decision);
|
|
778
|
+
if (settled)
|
|
779
|
+
return settled;
|
|
780
|
+
const verdict = !p.qitemId ? "post" : await confirmReleaseAtPost({
|
|
781
|
+
queueRepo: opts.queueRepo,
|
|
782
|
+
jobsRepo: new WatchdogJobsRepository(opts.queueRepo.db),
|
|
783
|
+
home: opts.home,
|
|
784
|
+
registry: { loadHumanRegistry: () => registrySurface.loadHumanRegistry(opts.home) },
|
|
785
|
+
entityId: (p.destinationSession ?? "").split("@")[0] ?? "",
|
|
786
|
+
qitemId: p.qitemId,
|
|
787
|
+
notificationKey: key,
|
|
788
|
+
});
|
|
789
|
+
if (verdict === "post")
|
|
790
|
+
return deliver(decision);
|
|
791
|
+
// Declined (the row says why) or couldn't be checked (nothing written): either way nothing posts now. Acking is
|
|
792
|
+
// safe because the window's release job owns redelivery until the ask has a receipt or a disposition; keeping it
|
|
793
|
+
// buffered would wait for a restart and block the job's own re-dispatch of the same decision id.
|
|
794
|
+
releaseRef(p.qitemId);
|
|
795
|
+
return { ok: true };
|
|
796
|
+
}
|
|
610
797
|
if (p.deliveryDeferralFire) {
|
|
611
798
|
const fireKey = p.notificationKey ?? p.qitemId;
|
|
612
799
|
if (p.qitemId && opts.queueRepo.transitionLog.hasOwnerNotificationReceipt(p.qitemId, fireKey)) {
|
|
@@ -615,7 +802,40 @@ export function buildSlackGatewayWire(opts) {
|
|
|
615
802
|
}
|
|
616
803
|
return deliver(decision);
|
|
617
804
|
}
|
|
618
|
-
|
|
805
|
+
// A post confirmed partly in Slack finishes without consulting quiet hours, so it is resolved before the decision
|
|
806
|
+
// (which reads them). Only a started multipart post is checked here, from the stores first, so an ordinary
|
|
807
|
+
// retry isn't scanned twice; any other attempted decision is resolved at the gate below.
|
|
808
|
+
const started = "unfinished" in deliver && deliver.unfinished(decision);
|
|
809
|
+
if (started) {
|
|
810
|
+
const settled = await resolveEarlierAttempt(decision);
|
|
811
|
+
if (settled)
|
|
812
|
+
return settled;
|
|
813
|
+
}
|
|
814
|
+
let ruled;
|
|
815
|
+
try {
|
|
816
|
+
ruled = p.qitemId ? decideForPayload(p) : null;
|
|
817
|
+
}
|
|
818
|
+
catch (error) {
|
|
819
|
+
// An attempted decision (it may be partly or wholly in Slack) is retained and nothing posts: acking it would drop
|
|
820
|
+
// the post's missing parts and let the sweep offer the ask again under a new id, posting it from the start. Its
|
|
821
|
+
// replay decides again once the quiet state reads. A store check only: no Slack read on a failure path.
|
|
822
|
+
if ("attempted" in deliver && deliver.attempted(decision)) {
|
|
823
|
+
log(`delivery decision for attempted ${decision.decisionId} couldn't be made; retained: ${error.message}`);
|
|
824
|
+
return { ok: false, class: "quiet-unreadable", detail: error.message };
|
|
825
|
+
}
|
|
826
|
+
// The decision couldn't be made (for example the person's quiet hours couldn't be read): post nothing and record
|
|
827
|
+
// nothing. Releasing the in-flight guard lets the outbound sweep offer this still-unseen ask again and decide afresh.
|
|
828
|
+
log(`delivery decision for ${p.qitemId} deferred: ${error.message}`);
|
|
829
|
+
// Released by notification key, the guard's own key: nothing marks this ask seen, so the next sweep must see it.
|
|
830
|
+
releaseRef(p.notificationKey ?? p.qitemId);
|
|
831
|
+
return { ok: true };
|
|
832
|
+
}
|
|
833
|
+
if (!started && ruled && (ruled.outcome === "log" || (ruled.outcome === "hold" && ruled.quietHold)
|
|
834
|
+
|| ruled.outcome === "digest" || ruled.deferMinutes !== undefined)) {
|
|
835
|
+
const settled = await resolveEarlierAttempt(decision);
|
|
836
|
+
if (settled)
|
|
837
|
+
return settled;
|
|
838
|
+
}
|
|
619
839
|
if (ruled) {
|
|
620
840
|
recordTerminationOnce(p, ruled);
|
|
621
841
|
const episodeKey = p.notificationKey ?? p.qitemId;
|
|
@@ -624,6 +844,19 @@ export function buildSlackGatewayWire(opts) {
|
|
|
624
844
|
releaseRef(p.qitemId);
|
|
625
845
|
return { ok: true };
|
|
626
846
|
}
|
|
847
|
+
if (ruled.outcome === "hold" && ruled.quietHold) {
|
|
848
|
+
// Quiet hours: recorded on the row with its window, occurrence and revision; the release job posts it later.
|
|
849
|
+
holdForQuiet({
|
|
850
|
+
queueRepo: opts.queueRepo,
|
|
851
|
+
jobsRepo: new WatchdogJobsRepository(opts.queueRepo.db),
|
|
852
|
+
qitemId: p.qitemId,
|
|
853
|
+
entityId: (p.destinationSession ?? "").split("@")[0] ?? "unknown",
|
|
854
|
+
hold: { ...ruled.quietHold, notificationKey: episodeKey },
|
|
855
|
+
});
|
|
856
|
+
outboundSeen.mark(episodeKey, "quiet-held");
|
|
857
|
+
releaseRef(p.qitemId);
|
|
858
|
+
return { ok: true };
|
|
859
|
+
}
|
|
627
860
|
if (ruled.outcome === "digest") {
|
|
628
861
|
// R1 B-4: the MESSAGE-TIME decision is recorded on the row (with the
|
|
629
862
|
// live dials already applied by the consult above); the flush consumes
|
|
@@ -669,6 +902,7 @@ export function buildSlackGatewayWire(opts) {
|
|
|
669
902
|
deliver: outboundReady ? engineDeliver : deliver,
|
|
670
903
|
log,
|
|
671
904
|
});
|
|
905
|
+
selfDispatch = (decisionId, payload) => wire.dispatcher.dispatch(OUTBOUND_OP, String(payload.destinationSession ?? ""), payload, { decisionId });
|
|
672
906
|
// Services are CONSTRUCTED here but started only via startServices() (post-bind, index.ts):
|
|
673
907
|
// composing a daemon must never dial Slack or start pollers — the createDaemon-in-tests
|
|
674
908
|
// hermeticity rule, same as every monitor in the supervision tree.
|
|
@@ -704,16 +938,6 @@ export function buildSlackGatewayWire(opts) {
|
|
|
704
938
|
});
|
|
705
939
|
stops.push(() => driver.stop());
|
|
706
940
|
}
|
|
707
|
-
// Hoisted out of the inbound block so status() can report the durable backlog.
|
|
708
|
-
// Both files are the retry pass's custody: the event dead-letter
|
|
709
|
-
// (`slack-inbound-deadletter.jsonl`) and the click dead-letter
|
|
710
|
-
// (`slack-inbound-action-deadletter.jsonl`), which retryActionDeadLetters owns.
|
|
711
|
-
// An inert wire omits the fields rather than inventing a count for a connector
|
|
712
|
-
// that is not running.
|
|
713
|
-
let dead;
|
|
714
|
-
let deadActions;
|
|
715
|
-
// The hub's relays that failed, kept with their host (forwarding.ts).
|
|
716
|
-
let deadForwards;
|
|
717
941
|
// A machine of a shared app receives its channels' events from the hub (routes/gateway.ts).
|
|
718
942
|
let acceptForwarded;
|
|
719
943
|
let relayedReceived = 0; // envelopes a hub relayed here since this wire was built
|
|
@@ -727,7 +951,6 @@ export function buildSlackGatewayWire(opts) {
|
|
|
727
951
|
let router;
|
|
728
952
|
if (inboundReady || outboundReady) {
|
|
729
953
|
const inboundSeen = new SeenStore(path.join(stateDir(opts.home), "slack-inbound-seen.jsonl"));
|
|
730
|
-
dead = new DeadLetterStore(path.join(stateDir(opts.home), "slack-inbound-deadletter.jsonl"));
|
|
731
954
|
const registry = registrySurface;
|
|
732
955
|
const built = (router = new InboundRouter({
|
|
733
956
|
queue: ports,
|
|
@@ -764,7 +987,7 @@ export function buildSlackGatewayWire(opts) {
|
|
|
764
987
|
// a failed hand-back is retried with the event dead-letters, and each click is confirmed
|
|
765
988
|
// in the decision's thread (a bot post, so inbound never ingests it).
|
|
766
989
|
recordHumanAnswer: (input) => opts.queueRepo.recordHumanAnswer(input),
|
|
767
|
-
actionDeadLetter:
|
|
990
|
+
actionDeadLetter: deadActions,
|
|
768
991
|
...(bot ? {
|
|
769
992
|
// A stopped run posts nothing, and its rate-limit wait ends with the run: after a restart the click's
|
|
770
993
|
// redelivery belongs to the new router, which must not race a stale retry from this one.
|
|
@@ -799,13 +1022,11 @@ export function buildSlackGatewayWire(opts) {
|
|
|
799
1022
|
lookupBot: (botId) => lookupBotApp(bot, botId, opts.fetchImpl),
|
|
800
1023
|
},
|
|
801
1024
|
} : {}),
|
|
802
|
-
|
|
803
|
-
|
|
804
|
-
|
|
805
|
-
|
|
806
|
-
|
|
807
|
-
forwardDeadLetter: (deadForwards = new DeadLetterStore(path.join(stateDir(opts.home), "slack-inbound-forward-deadletter.jsonl"))),
|
|
808
|
-
} : {}),
|
|
1025
|
+
forward: {
|
|
1026
|
+
hostFor: (channel) => forwarding ? cfg.forwardChannels.find((f) => f.channel === channel)?.host ?? null : null,
|
|
1027
|
+
send: makeEnvelopeForwarder({ fetchImpl: opts.fetchImpl, loadRegistry: opts.loadHostRegistry }),
|
|
1028
|
+
},
|
|
1029
|
+
forwardDeadLetter: deadForwards,
|
|
809
1030
|
log,
|
|
810
1031
|
}));
|
|
811
1032
|
if (cfg.botInbox && (!bot || botInboxProblems(cfg).length > 0)) {
|
|
@@ -886,14 +1107,11 @@ export function buildSlackGatewayWire(opts) {
|
|
|
886
1107
|
platform: "slack", configurationDigest: channelStateDigest(cfg),
|
|
887
1108
|
outboundReady,
|
|
888
1109
|
inboundReady,
|
|
1110
|
+
inboundRouting,
|
|
889
1111
|
recovery: recovery?.status() ?? { state: "unavailable", reason: "inbound-not-configured" },
|
|
890
1112
|
inbound: inboundHandle?.status() ?? { state: inboundReady ? "not-started" : "not-configured", generation: 0, reconnects: 0 },
|
|
891
|
-
//
|
|
892
|
-
//
|
|
893
|
-
// message that left more than one record is counted once per record, which
|
|
894
|
-
// is why the field is named for records. Present iff inbound is configured;
|
|
895
|
-
// an unreadable file reports state "unknown" with a reason instead of a
|
|
896
|
-
// false zero.
|
|
1113
|
+
// Durable inbound custody across event, click and relay files, even when inert.
|
|
1114
|
+
// Count records, not distinct messages; unreadable storage is null/unknown.
|
|
897
1115
|
...deadLetterBacklogFields(dead, deadActions, deadForwards),
|
|
898
1116
|
// A machine with no connection of its own can take events a hub relays here; whether a hub does is
|
|
899
1117
|
// the hub's configuration, so this says only that it can, and how many have arrived.
|