@openrig/cli 0.6.12 → 0.6.14
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 +69 -14
- 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 +9 -2
- package/daemon/assets/plugins/openrig-core/hooks/scripts/activity-relay.cjs +25 -9
- package/daemon/assets/plugins/openrig-core/hooks/scripts/refocus.cjs +7 -4
- package/daemon/assets/plugins/openrig-core/skills/mission-slice-sop/SKILL.md +5 -0
- package/daemon/assets/plugins/openrig-core/skills/openrig-user/SKILL.md +11 -3
- package/daemon/assets/plugins/openrig-core/skills/refocusing/scripts/trace-to-root.py +73 -48
- package/daemon/assets/skills/rigs/SKILL.md +8 -4
- 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 +76 -16
- package/daemon/context-packs/reference/getting-started.md +135 -28
- package/daemon/context-packs/reference/manifest.yaml +1 -1
- package/daemon/context-packs/reference/rig-spec.md +5 -5
- package/daemon/context-packs/reference/whats-new.md +65 -167
- 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/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/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/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/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/manifest.yaml +1 -1
- package/daemon/context-packs/skills/loading-addressable-markdown/manifest.yaml +1 -1
- package/daemon/context-packs/skills/mission-slice-sop/SKILL.md +5 -0
- 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 +11 -3
- 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/manifest.yaml +1 -1
- 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/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/manifest.yaml +1 -1
- 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/refocusing/scripts/trace-to-root.py +73 -48
- 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 +9 -1
- package/daemon/dist/adapters/claude-code-adapter.d.ts.map +1 -1
- package/daemon/dist/adapters/claude-code-adapter.js +110 -52
- package/daemon/dist/adapters/claude-code-adapter.js.map +1 -1
- package/daemon/dist/adapters/codex-runtime-adapter.d.ts.map +1 -1
- package/daemon/dist/adapters/codex-runtime-adapter.js +47 -6
- package/daemon/dist/adapters/codex-runtime-adapter.js.map +1 -1
- package/daemon/dist/adapters/pi-resume.d.ts +1 -1
- package/daemon/dist/adapters/pi-resume.d.ts.map +1 -1
- package/daemon/dist/adapters/pi-resume.js +4 -1
- package/daemon/dist/adapters/pi-resume.js.map +1 -1
- package/daemon/dist/adapters/pi-runner-protocol.d.ts +9 -0
- package/daemon/dist/adapters/pi-runner-protocol.d.ts.map +1 -1
- package/daemon/dist/adapters/pi-runner-protocol.js +16 -0
- package/daemon/dist/adapters/pi-runner-protocol.js.map +1 -1
- package/daemon/dist/adapters/pi-runner.d.ts +5 -2
- package/daemon/dist/adapters/pi-runner.d.ts.map +1 -1
- package/daemon/dist/adapters/pi-runner.js +72 -15
- package/daemon/dist/adapters/pi-runner.js.map +1 -1
- package/daemon/dist/adapters/pi-runtime-adapter.d.ts.map +1 -1
- package/daemon/dist/adapters/pi-runtime-adapter.js +2 -0
- package/daemon/dist/adapters/pi-runtime-adapter.js.map +1 -1
- package/daemon/dist/adapters/stub-compaction.d.ts +1 -0
- package/daemon/dist/adapters/stub-compaction.d.ts.map +1 -1
- package/daemon/dist/adapters/stub-compaction.js +2 -0
- package/daemon/dist/adapters/stub-compaction.js.map +1 -1
- package/daemon/dist/adapters/stub-refocus.d.ts +6 -0
- package/daemon/dist/adapters/stub-refocus.d.ts.map +1 -0
- package/daemon/dist/adapters/stub-refocus.js +22 -0
- package/daemon/dist/adapters/stub-refocus.js.map +1 -0
- package/daemon/dist/adapters/stub-runner.d.ts +6 -0
- package/daemon/dist/adapters/stub-runner.d.ts.map +1 -1
- package/daemon/dist/adapters/stub-runner.js +18 -1
- package/daemon/dist/adapters/stub-runner.js.map +1 -1
- package/daemon/dist/adapters/stub-script.d.ts +2 -2
- package/daemon/dist/adapters/stub-script.d.ts.map +1 -1
- package/daemon/dist/adapters/stub-script.js +2 -2
- package/daemon/dist/adapters/stub-script.js.map +1 -1
- package/daemon/dist/adapters/tmux.js +1 -1
- 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 +2 -0
- package/daemon/dist/db/all-migrations.js.map +1 -1
- package/daemon/dist/db/migrations/117_provider_account_readings.d.ts +3 -0
- package/daemon/dist/db/migrations/117_provider_account_readings.d.ts.map +1 -0
- package/daemon/dist/db/migrations/117_provider_account_readings.js +32 -0
- package/daemon/dist/db/migrations/117_provider_account_readings.js.map +1 -0
- package/daemon/dist/domain/claim-service.d.ts +9 -18
- package/daemon/dist/domain/claim-service.d.ts.map +1 -1
- package/daemon/dist/domain/claim-service.js +83 -0
- package/daemon/dist/domain/claim-service.js.map +1 -1
- package/daemon/dist/domain/claude-activity-hooks.d.ts +6 -0
- package/daemon/dist/domain/claude-activity-hooks.d.ts.map +1 -1
- package/daemon/dist/domain/claude-activity-hooks.js +19 -1
- package/daemon/dist/domain/claude-activity-hooks.js.map +1 -1
- package/daemon/dist/domain/claude-compaction-enforcer.d.ts +2 -2
- package/daemon/dist/domain/claude-compaction-enforcer.d.ts.map +1 -1
- package/daemon/dist/domain/claude-compaction-enforcer.js +20 -14
- package/daemon/dist/domain/claude-compaction-enforcer.js.map +1 -1
- package/daemon/dist/domain/claude-core-plugin-env.d.ts +2 -0
- package/daemon/dist/domain/claude-core-plugin-env.d.ts.map +1 -1
- package/daemon/dist/domain/claude-core-plugin-env.js +6 -2
- package/daemon/dist/domain/claude-core-plugin-env.js.map +1 -1
- package/daemon/dist/domain/claude-managed-launch.d.ts +5 -0
- package/daemon/dist/domain/claude-managed-launch.d.ts.map +1 -1
- package/daemon/dist/domain/claude-managed-launch.js +48 -7
- package/daemon/dist/domain/claude-managed-launch.js.map +1 -1
- package/daemon/dist/domain/claude-mcp-menu.d.ts +5 -0
- package/daemon/dist/domain/claude-mcp-menu.d.ts.map +1 -0
- package/daemon/dist/domain/claude-mcp-menu.js +25 -0
- package/daemon/dist/domain/claude-mcp-menu.js.map +1 -0
- package/daemon/dist/domain/fresh-occupant-relation.d.ts +7 -0
- package/daemon/dist/domain/fresh-occupant-relation.d.ts.map +1 -1
- package/daemon/dist/domain/fresh-occupant-relation.js +45 -0
- package/daemon/dist/domain/fresh-occupant-relation.js.map +1 -1
- package/daemon/dist/domain/gateway/slack/channel-recovery.d.ts +14 -2
- package/daemon/dist/domain/gateway/slack/channel-recovery.d.ts.map +1 -1
- package/daemon/dist/domain/gateway/slack/channel-recovery.js +128 -89
- package/daemon/dist/domain/gateway/slack/channel-recovery.js.map +1 -1
- package/daemon/dist/domain/gateway/slack/inbound.d.ts +4 -0
- package/daemon/dist/domain/gateway/slack/inbound.d.ts.map +1 -1
- package/daemon/dist/domain/gateway/slack/inbound.js +5 -3
- package/daemon/dist/domain/gateway/slack/inbound.js.map +1 -1
- package/daemon/dist/domain/gateway/slack/recovery-budget.d.ts +24 -0
- package/daemon/dist/domain/gateway/slack/recovery-budget.d.ts.map +1 -0
- package/daemon/dist/domain/gateway/slack/recovery-budget.js +18 -0
- package/daemon/dist/domain/gateway/slack/recovery-budget.js.map +1 -0
- package/daemon/dist/domain/gateway/slack/slack-recovery.d.ts +104 -0
- package/daemon/dist/domain/gateway/slack/slack-recovery.d.ts.map +1 -0
- package/daemon/dist/domain/gateway/slack/slack-recovery.js +236 -0
- package/daemon/dist/domain/gateway/slack/slack-recovery.js.map +1 -0
- package/daemon/dist/domain/gateway/slack/slack-subsystem.d.ts.map +1 -1
- package/daemon/dist/domain/gateway/slack/slack-subsystem.js +29 -6
- package/daemon/dist/domain/gateway/slack/slack-subsystem.js.map +1 -1
- package/daemon/dist/domain/gateway/slack/state-store.d.ts +34 -0
- package/daemon/dist/domain/gateway/slack/state-store.d.ts.map +1 -1
- package/daemon/dist/domain/gateway/slack/state-store.js +67 -0
- package/daemon/dist/domain/gateway/slack/state-store.js.map +1 -1
- package/daemon/dist/domain/gateway/slack/thread-recovery.d.ts +37 -0
- package/daemon/dist/domain/gateway/slack/thread-recovery.d.ts.map +1 -0
- package/daemon/dist/domain/gateway/slack/thread-recovery.js +173 -0
- package/daemon/dist/domain/gateway/slack/thread-recovery.js.map +1 -0
- package/daemon/dist/domain/gateway/slack/thread-seat-map.d.ts +8 -0
- package/daemon/dist/domain/gateway/slack/thread-seat-map.d.ts.map +1 -1
- package/daemon/dist/domain/gateway/slack/thread-seat-map.js +11 -0
- package/daemon/dist/domain/gateway/slack/thread-seat-map.js.map +1 -1
- package/daemon/dist/domain/model-divergence/current-generation-record.d.ts +6 -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 +4 -1
- package/daemon/dist/domain/model-divergence/current-generation-record.js.map +1 -1
- package/daemon/dist/domain/model-divergence/current-model-reader.d.ts +74 -0
- package/daemon/dist/domain/model-divergence/current-model-reader.d.ts.map +1 -0
- package/daemon/dist/domain/model-divergence/current-model-reader.js +246 -0
- package/daemon/dist/domain/model-divergence/current-model-reader.js.map +1 -0
- package/daemon/dist/domain/model-divergence/effective-model-readers.d.ts +18 -0
- package/daemon/dist/domain/model-divergence/effective-model-readers.d.ts.map +1 -1
- package/daemon/dist/domain/model-divergence/effective-model-readers.js +24 -8
- package/daemon/dist/domain/model-divergence/effective-model-readers.js.map +1 -1
- package/daemon/dist/domain/native-process-lineage.d.ts +8 -1
- package/daemon/dist/domain/native-process-lineage.d.ts.map +1 -1
- package/daemon/dist/domain/native-process-lineage.js +40 -26
- package/daemon/dist/domain/native-process-lineage.js.map +1 -1
- package/daemon/dist/domain/native-resume-probe.d.ts.map +1 -1
- package/daemon/dist/domain/native-resume-probe.js +34 -8
- package/daemon/dist/domain/native-resume-probe.js.map +1 -1
- package/daemon/dist/domain/node-inventory.d.ts +1 -1
- package/daemon/dist/domain/node-inventory.d.ts.map +1 -1
- package/daemon/dist/domain/node-inventory.js +84 -18
- package/daemon/dist/domain/node-inventory.js.map +1 -1
- package/daemon/dist/domain/process-census.d.ts +1 -1
- package/daemon/dist/domain/process-census.d.ts.map +1 -1
- package/daemon/dist/domain/process-table.d.ts +26 -0
- package/daemon/dist/domain/process-table.d.ts.map +1 -0
- package/daemon/dist/domain/process-table.js +185 -0
- package/daemon/dist/domain/process-table.js.map +1 -0
- package/daemon/dist/domain/profile-resolver.d.ts +8 -0
- package/daemon/dist/domain/profile-resolver.d.ts.map +1 -1
- package/daemon/dist/domain/profile-resolver.js +11 -0
- package/daemon/dist/domain/profile-resolver.js.map +1 -1
- package/daemon/dist/domain/projection-planner.js +1 -1
- package/daemon/dist/domain/projection-planner.js.map +1 -1
- package/daemon/dist/domain/provider/claude-usage-windows.d.ts +3 -1
- package/daemon/dist/domain/provider/claude-usage-windows.d.ts.map +1 -1
- package/daemon/dist/domain/provider/claude-usage-windows.js +48 -3
- package/daemon/dist/domain/provider/claude-usage-windows.js.map +1 -1
- package/daemon/dist/domain/provider/codex-usage-reader.d.ts +4 -1
- package/daemon/dist/domain/provider/codex-usage-reader.d.ts.map +1 -1
- package/daemon/dist/domain/provider/codex-usage-reader.js +3 -0
- package/daemon/dist/domain/provider/codex-usage-reader.js.map +1 -1
- package/daemon/dist/domain/provider/codex-usage-windows.d.ts +3 -1
- package/daemon/dist/domain/provider/codex-usage-windows.d.ts.map +1 -1
- package/daemon/dist/domain/provider/codex-usage-windows.js +1 -0
- package/daemon/dist/domain/provider/codex-usage-windows.js.map +1 -1
- package/daemon/dist/domain/provider/provider-account-readings.d.ts +42 -0
- package/daemon/dist/domain/provider/provider-account-readings.d.ts.map +1 -0
- package/daemon/dist/domain/provider/provider-account-readings.js +132 -0
- package/daemon/dist/domain/provider/provider-account-readings.js.map +1 -0
- package/daemon/dist/domain/provider/provider-types.d.ts +29 -0
- package/daemon/dist/domain/provider/provider-types.d.ts.map +1 -1
- package/daemon/dist/domain/provider/usage-across-hosts.d.ts.map +1 -1
- package/daemon/dist/domain/provider/usage-across-hosts.js +6 -0
- package/daemon/dist/domain/provider/usage-across-hosts.js.map +1 -1
- package/daemon/dist/domain/provider/usage-windows.d.ts +25 -0
- package/daemon/dist/domain/provider/usage-windows.d.ts.map +1 -1
- package/daemon/dist/domain/provider/usage-windows.js +100 -4
- package/daemon/dist/domain/provider/usage-windows.js.map +1 -1
- package/daemon/dist/domain/queue-repository.d.ts +23 -0
- package/daemon/dist/domain/queue-repository.d.ts.map +1 -1
- package/daemon/dist/domain/queue-repository.js +59 -1
- package/daemon/dist/domain/queue-repository.js.map +1 -1
- package/daemon/dist/domain/queue-stuck-sweep.d.ts.map +1 -1
- package/daemon/dist/domain/queue-stuck-sweep.js +47 -4
- package/daemon/dist/domain/queue-stuck-sweep.js.map +1 -1
- package/daemon/dist/domain/restore-check-service.d.ts +10 -0
- package/daemon/dist/domain/restore-check-service.d.ts.map +1 -1
- package/daemon/dist/domain/restore-check-service.js +73 -10
- package/daemon/dist/domain/restore-check-service.js.map +1 -1
- package/daemon/dist/domain/restore-guidance.d.ts +6 -0
- package/daemon/dist/domain/restore-guidance.d.ts.map +1 -1
- package/daemon/dist/domain/restore-guidance.js +21 -5
- package/daemon/dist/domain/restore-guidance.js.map +1 -1
- package/daemon/dist/domain/restore-orchestrator.js +1 -1
- package/daemon/dist/domain/restore-orchestrator.js.map +1 -1
- package/daemon/dist/domain/resume-metadata-refresher.d.ts.map +1 -1
- package/daemon/dist/domain/resume-metadata-refresher.js +6 -29
- package/daemon/dist/domain/resume-metadata-refresher.js.map +1 -1
- package/daemon/dist/domain/rig-repository.d.ts +3 -0
- package/daemon/dist/domain/rig-repository.d.ts.map +1 -1
- package/daemon/dist/domain/rig-repository.js +6 -0
- package/daemon/dist/domain/rig-repository.js.map +1 -1
- package/daemon/dist/domain/rigspec-instantiator.d.ts.map +1 -1
- package/daemon/dist/domain/rigspec-instantiator.js +4 -2
- package/daemon/dist/domain/rigspec-instantiator.js.map +1 -1
- package/daemon/dist/domain/rigspec-preflight.d.ts +4 -0
- package/daemon/dist/domain/rigspec-preflight.d.ts.map +1 -1
- package/daemon/dist/domain/rigspec-preflight.js +12 -2
- package/daemon/dist/domain/rigspec-preflight.js.map +1 -1
- package/daemon/dist/domain/rigspec-schema.d.ts.map +1 -1
- package/daemon/dist/domain/rigspec-schema.js +11 -0
- package/daemon/dist/domain/rigspec-schema.js.map +1 -1
- package/daemon/dist/domain/runtime-adapter.d.ts +13 -0
- 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-attention-reconciler.d.ts.map +1 -1
- package/daemon/dist/domain/seat-attention-reconciler.js +15 -1
- package/daemon/dist/domain/seat-attention-reconciler.js.map +1 -1
- package/daemon/dist/domain/seat-cwd-preparation.d.ts +22 -0
- package/daemon/dist/domain/seat-cwd-preparation.d.ts.map +1 -0
- package/daemon/dist/domain/seat-cwd-preparation.js +107 -0
- package/daemon/dist/domain/seat-cwd-preparation.js.map +1 -0
- package/daemon/dist/domain/seat-effort.d.ts +4 -3
- package/daemon/dist/domain/seat-effort.d.ts.map +1 -1
- package/daemon/dist/domain/seat-effort.js +21 -3
- package/daemon/dist/domain/seat-effort.js.map +1 -1
- package/daemon/dist/domain/seat-lifecycle-service.d.ts +36 -2
- package/daemon/dist/domain/seat-lifecycle-service.d.ts.map +1 -1
- package/daemon/dist/domain/seat-lifecycle-service.js +206 -15
- package/daemon/dist/domain/seat-lifecycle-service.js.map +1 -1
- package/daemon/dist/domain/seat-restart-in-place.d.ts +14 -0
- package/daemon/dist/domain/seat-restart-in-place.d.ts.map +1 -1
- package/daemon/dist/domain/seat-restart-in-place.js +59 -3
- package/daemon/dist/domain/seat-restart-in-place.js.map +1 -1
- package/daemon/dist/domain/seat-status-service.d.ts +2 -0
- package/daemon/dist/domain/seat-status-service.d.ts.map +1 -1
- package/daemon/dist/domain/seat-status-service.js +1 -0
- package/daemon/dist/domain/seat-status-service.js.map +1 -1
- package/daemon/dist/domain/seat-structural-activity-service.d.ts +7 -1
- package/daemon/dist/domain/seat-structural-activity-service.d.ts.map +1 -1
- package/daemon/dist/domain/seat-structural-activity-service.js +9 -3
- package/daemon/dist/domain/seat-structural-activity-service.js.map +1 -1
- package/daemon/dist/domain/session-name.d.ts +8 -0
- package/daemon/dist/domain/session-name.d.ts.map +1 -1
- package/daemon/dist/domain/session-name.js +12 -0
- package/daemon/dist/domain/session-name.js.map +1 -1
- package/daemon/dist/domain/session-transport.d.ts +78 -3
- package/daemon/dist/domain/session-transport.d.ts.map +1 -1
- package/daemon/dist/domain/session-transport.js +306 -15
- package/daemon/dist/domain/session-transport.js.map +1 -1
- package/daemon/dist/domain/successor-session-launcher.js +1 -1
- package/daemon/dist/domain/successor-session-launcher.js.map +1 -1
- package/daemon/dist/domain/topology-converge.d.ts +1 -0
- package/daemon/dist/domain/topology-converge.d.ts.map +1 -1
- package/daemon/dist/domain/topology-converge.js +1 -0
- package/daemon/dist/domain/topology-converge.js.map +1 -1
- package/daemon/dist/domain/types.d.ts +14 -0
- package/daemon/dist/domain/types.d.ts.map +1 -1
- package/daemon/dist/domain/types.js.map +1 -1
- package/daemon/dist/domain/user-settings/settings-store.d.ts +1 -1
- package/daemon/dist/domain/user-settings/settings-store.d.ts.map +1 -1
- package/daemon/dist/domain/user-settings/settings-store.js +4 -0
- package/daemon/dist/domain/user-settings/settings-store.js.map +1 -1
- package/daemon/dist/domain/wake-resolve-service.d.ts +1 -0
- package/daemon/dist/domain/wake-resolve-service.d.ts.map +1 -1
- package/daemon/dist/domain/wake-resolve-service.js +10 -0
- package/daemon/dist/domain/wake-resolve-service.js.map +1 -1
- package/daemon/dist/domain/wake-resolver.d.ts.map +1 -1
- package/daemon/dist/domain/wake-resolver.js +7 -0
- package/daemon/dist/domain/wake-resolver.js.map +1 -1
- package/daemon/dist/domain/watchdog-delivery.d.ts +29 -0
- package/daemon/dist/domain/watchdog-delivery.d.ts.map +1 -0
- package/daemon/dist/domain/watchdog-delivery.js +113 -0
- package/daemon/dist/domain/watchdog-delivery.js.map +1 -0
- package/daemon/dist/domain/watchdog-policy-engine.d.ts +60 -1
- package/daemon/dist/domain/watchdog-policy-engine.d.ts.map +1 -1
- package/daemon/dist/domain/watchdog-policy-engine.js +154 -28
- 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 +6 -1
- package/daemon/dist/domain/watchdog-scheduler.js.map +1 -1
- package/daemon/dist/domain/workflow-instance-store.d.ts.map +1 -1
- package/daemon/dist/domain/workflow-instance-store.js +6 -2
- package/daemon/dist/domain/workflow-instance-store.js.map +1 -1
- package/daemon/dist/routes/attention.d.ts.map +1 -1
- package/daemon/dist/routes/attention.js +41 -1
- package/daemon/dist/routes/attention.js.map +1 -1
- package/daemon/dist/routes/compaction.js +1 -1
- package/daemon/dist/routes/compaction.js.map +1 -1
- package/daemon/dist/routes/queue.d.ts.map +1 -1
- package/daemon/dist/routes/queue.js +3 -1
- package/daemon/dist/routes/queue.js.map +1 -1
- package/daemon/dist/routes/restore-check.d.ts.map +1 -1
- package/daemon/dist/routes/restore-check.js +19 -1
- package/daemon/dist/routes/restore-check.js.map +1 -1
- package/daemon/dist/routes/seat.d.ts.map +1 -1
- package/daemon/dist/routes/seat.js +15 -2
- package/daemon/dist/routes/seat.js.map +1 -1
- package/daemon/dist/routes/sessions.d.ts.map +1 -1
- package/daemon/dist/routes/sessions.js +42 -1
- package/daemon/dist/routes/sessions.js.map +1 -1
- package/daemon/dist/routes/transport.d.ts.map +1 -1
- package/daemon/dist/routes/transport.js +13 -2
- package/daemon/dist/routes/transport.js.map +1 -1
- package/daemon/dist/server.d.ts +1 -0
- package/daemon/dist/server.d.ts.map +1 -1
- package/daemon/dist/server.js +7 -4
- package/daemon/dist/server.js.map +1 -1
- package/daemon/dist/startup.d.ts.map +1 -1
- package/daemon/dist/startup.js +41 -118
- package/daemon/dist/startup.js.map +1 -1
- package/daemon/docs/reference/agent-spec.md +1 -1
- package/daemon/docs/reference/agent-startup-guide.md +84 -0
- package/daemon/docs/reference/getting-started.md +135 -28
- package/daemon/docs/reference/publishing-a-rig-bundle.md +5 -2
- package/daemon/docs/reference/quickstart.md +187 -0
- package/daemon/docs/reference/refocus-channel.md +11 -1
- package/daemon/docs/reference/rig-spec.md +5 -5
- package/daemon/docs/reference/rosters.md +29 -2
- package/daemon/docs/reference/slack-app-setup.md +47 -17
- package/daemon/docs/reference/whats-new.md +65 -167
- package/daemon/specs/agents/apps/vault-specialist/agent.yaml +1 -0
- package/daemon/specs/agents/conveyor/builder/agent.yaml +1 -0
- package/daemon/specs/agents/conveyor/lead/agent.yaml +1 -0
- package/daemon/specs/agents/conveyor/planner/agent.yaml +1 -0
- package/daemon/specs/agents/conveyor/reviewer/agent.yaml +1 -0
- package/daemon/specs/agents/design/product-designer/agent.yaml +1 -0
- package/daemon/specs/agents/development/implementer/agent.yaml +1 -0
- package/daemon/specs/agents/development/qa/agent.yaml +1 -0
- package/daemon/specs/agents/factory-rsi/dogfood/agent.yaml +1 -0
- package/daemon/specs/agents/factory-rsi/release-manager/agent.yaml +1 -0
- package/daemon/specs/agents/orchestration/orchestrator/agent.yaml +1 -0
- package/daemon/specs/agents/product-management/pm/agent.yaml +1 -0
- package/daemon/specs/agents/research/analyst/agent.yaml +1 -0
- package/daemon/specs/agents/research/synthesizer/agent.yaml +1 -0
- package/daemon/specs/agents/review/independent-reviewer/agent.yaml +1 -0
- package/dist/build-info.js +3 -3
- package/dist/client.d.ts +7 -1
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +28 -0
- package/dist/client.js.map +1 -1
- package/dist/commands/ask.d.ts.map +1 -1
- package/dist/commands/ask.js +13 -3
- package/dist/commands/ask.js.map +1 -1
- package/dist/commands/capture.d.ts.map +1 -1
- package/dist/commands/capture.js +14 -0
- package/dist/commands/capture.js.map +1 -1
- package/dist/commands/chatroom.d.ts.map +1 -1
- package/dist/commands/chatroom.js +1 -0
- package/dist/commands/chatroom.js.map +1 -1
- package/dist/commands/compact.d.ts.map +1 -1
- package/dist/commands/compact.js +5 -4
- package/dist/commands/compact.js.map +1 -1
- package/dist/commands/config.d.ts.map +1 -1
- package/dist/commands/config.js +4 -2
- package/dist/commands/config.js.map +1 -1
- package/dist/commands/doctor.d.ts +3 -0
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +47 -23
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/grow.d.ts.map +1 -1
- package/dist/commands/grow.js +24 -7
- package/dist/commands/grow.js.map +1 -1
- package/dist/commands/provider.d.ts.map +1 -1
- package/dist/commands/provider.js +43 -7
- package/dist/commands/provider.js.map +1 -1
- package/dist/commands/ps.d.ts +2 -0
- package/dist/commands/ps.d.ts.map +1 -1
- package/dist/commands/ps.js +12 -1
- package/dist/commands/ps.js.map +1 -1
- package/dist/commands/reconcile-session.d.ts.map +1 -1
- package/dist/commands/reconcile-session.js +25 -4
- package/dist/commands/reconcile-session.js.map +1 -1
- package/dist/commands/remove.d.ts.map +1 -1
- package/dist/commands/remove.js +20 -1
- package/dist/commands/remove.js.map +1 -1
- package/dist/commands/roster.d.ts +2 -1
- package/dist/commands/roster.d.ts.map +1 -1
- package/dist/commands/roster.js +10 -5
- package/dist/commands/roster.js.map +1 -1
- package/dist/commands/scope.js +1 -1
- package/dist/commands/scope.js.map +1 -1
- package/dist/commands/seat.d.ts.map +1 -1
- package/dist/commands/seat.js +75 -8
- package/dist/commands/seat.js.map +1 -1
- package/dist/commands/slack.d.ts.map +1 -1
- package/dist/commands/slack.js +14 -1
- package/dist/commands/slack.js.map +1 -1
- package/dist/commands/ui.d.ts.map +1 -1
- package/dist/commands/ui.js +8 -1
- package/dist/commands/ui.js.map +1 -1
- package/dist/commands/usage.d.ts.map +1 -1
- package/dist/commands/usage.js +4 -3
- package/dist/commands/usage.js.map +1 -1
- package/dist/config-store.d.ts +2 -1
- package/dist/config-store.d.ts.map +1 -1
- package/dist/config-store.js +5 -0
- package/dist/config-store.js.map +1 -1
- package/dist/daemon-lifecycle.d.ts.map +1 -1
- package/dist/daemon-lifecycle.js +11 -3
- package/dist/daemon-lifecycle.js.map +1 -1
- package/dist/front-door.d.ts.map +1 -1
- package/dist/front-door.js +3 -1
- package/dist/front-door.js.map +1 -1
- package/dist/lib/model-observation.d.ts +13 -0
- package/dist/lib/model-observation.d.ts.map +1 -0
- package/dist/lib/model-observation.js +25 -0
- package/dist/lib/model-observation.js.map +1 -0
- package/dist/local-daemon-owner.d.ts +28 -0
- package/dist/local-daemon-owner.d.ts.map +1 -0
- package/dist/local-daemon-owner.js +98 -0
- package/dist/local-daemon-owner.js.map +1 -0
- package/dist/mcp-server.d.ts.map +1 -1
- package/dist/mcp-server.js +1 -0
- package/dist/mcp-server.js.map +1 -1
- package/package.json +1 -1
- package/tui/dist/attention/attention-model.js +6 -5
- package/tui/dist/attention/attention-model.js.map +1 -1
- package/tui/dist/attention/source-continuity.d.ts.map +1 -1
- package/tui/dist/attention/source-continuity.js +2 -0
- package/tui/dist/attention/source-continuity.js.map +1 -1
- package/tui/dist/terminals/open-window.d.ts +11 -1
- package/tui/dist/terminals/open-window.d.ts.map +1 -1
- package/tui/dist/terminals/open-window.js +47 -2
- package/tui/dist/terminals/open-window.js.map +1 -1
- package/tui/dist/usage/usage-model.d.ts +2 -0
- package/tui/dist/usage/usage-model.d.ts.map +1 -1
- package/tui/dist/usage/usage-model.js +38 -3
- package/tui/dist/usage/usage-model.js.map +1 -1
- package/ui/dist/assets/{index-Cfbtfd9G.js → index-CVgod3Pm.js} +1 -1
- package/ui/dist/index.html +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recovery-budget.d.ts","sourceRoot":"","sources":["../../../../src/domain/gateway/slack/recovery-budget.ts"],"names":[],"mappings":"AAEA,yEAAyE;AACzE,eAAO,MAAM,OAAO,0BAA0B,CAAC;AAC/C,eAAO,MAAM,OAAO,0BAA0B,CAAC;AAE/C,MAAM,WAAW,cAAc;IAAG,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE;AAEpF,8FAA8F;AAC9F,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,cAAc,CAE7D;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,cAAc,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAEvE;AAED,sGAAsG;AACtG,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA6B;IACnD,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO;IAC7C,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,IAAI;CACvC;AAED,uDAAuD;AACvD,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,wEAAwE;IACxE,IAAI,CAAC,MAAM,EAAE,cAAc,EAAE,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC;CAChF"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
// One recovery pass's work, shared in turn by every channel and thread it reaches.
|
|
2
|
+
/** The two Slack methods recovery calls; each has its own rate limit. */
|
|
3
|
+
export const HISTORY = "conversations.history";
|
|
4
|
+
export const REPLIES = "conversations.replies";
|
|
5
|
+
/** Four history calls, 100 entries and 15 seconds per pass, however many sources share it. */
|
|
6
|
+
export function newRecoveryBudget(now) {
|
|
7
|
+
return { deadline: now + 15_000, calls: 0, entries: 0 };
|
|
8
|
+
}
|
|
9
|
+
export function budgetLeft(budget, now) {
|
|
10
|
+
return budget.calls < 4 && budget.entries < 100 && now < budget.deadline;
|
|
11
|
+
}
|
|
12
|
+
/** Slack rate-limits each Web API method on its own, so a Retry-After holds back only that method. */
|
|
13
|
+
export class MethodBackoff {
|
|
14
|
+
until = new Map();
|
|
15
|
+
blocked(method, now) { return (this.until.get(method) ?? 0) > now; }
|
|
16
|
+
hold(method, at) { this.until.set(method, Math.max(at, this.until.get(method) ?? 0)); }
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=recovery-budget.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recovery-budget.js","sourceRoot":"","sources":["../../../../src/domain/gateway/slack/recovery-budget.ts"],"names":[],"mappings":"AAAA,mFAAmF;AAEnF,yEAAyE;AACzE,MAAM,CAAC,MAAM,OAAO,GAAG,uBAAuB,CAAC;AAC/C,MAAM,CAAC,MAAM,OAAO,GAAG,uBAAuB,CAAC;AAI/C,8FAA8F;AAC9F,MAAM,UAAU,iBAAiB,CAAC,GAAW;IAC3C,OAAO,EAAE,QAAQ,EAAE,GAAG,GAAG,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;AAC1D,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,MAAsB,EAAE,GAAW;IAC5D,OAAO,MAAM,CAAC,KAAK,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,GAAG,GAAG,IAAI,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAC;AAC3E,CAAC;AAED,sGAAsG;AACtG,MAAM,OAAO,aAAa;IACP,KAAK,GAAG,IAAI,GAAG,EAAkB,CAAC;IACnD,OAAO,CAAC,MAAc,EAAE,GAAW,IAAa,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;IAC7F,IAAI,CAAC,MAAc,EAAE,EAAU,IAAU,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;CAC9G"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import type { FetchImpl } from "./slack-api.js";
|
|
2
|
+
import type { InboundRouter } from "./inbound.js";
|
|
3
|
+
import { ChannelCoverageStore, ThreadCoverageStore } from "./state-store.js";
|
|
4
|
+
/** A thread is tracked while its root was posted, or it closed, within this window. */
|
|
5
|
+
export declare const THREAD_WINDOW_MS: number;
|
|
6
|
+
export interface TrackedThread {
|
|
7
|
+
channel: string;
|
|
8
|
+
threadTs: string;
|
|
9
|
+
state?: string;
|
|
10
|
+
closedAt?: string | null;
|
|
11
|
+
}
|
|
12
|
+
/** The channels this machine recovers: its default channel and its channel map's, except a channel
|
|
13
|
+
* its configuration relays to the machine that owns it (that machine recovers it). */
|
|
14
|
+
export declare function ownedRecoveryChannels(cfg: {
|
|
15
|
+
channel: string | null;
|
|
16
|
+
channelMap?: Array<{
|
|
17
|
+
channel: string;
|
|
18
|
+
}>;
|
|
19
|
+
forwardChannels?: unknown;
|
|
20
|
+
}): string[];
|
|
21
|
+
interface SlackRecoveryOptions {
|
|
22
|
+
/** The machine's default channel first. "adoption" for a channel recovery newly covers. */
|
|
23
|
+
channels: Array<{
|
|
24
|
+
channel: string;
|
|
25
|
+
seed?: "adoption";
|
|
26
|
+
}>;
|
|
27
|
+
token: string | null;
|
|
28
|
+
stateDir: string;
|
|
29
|
+
router: InboundRouter;
|
|
30
|
+
/** Tracked thread roots in these channels posted, or closed, at or after `since` (ISO). */
|
|
31
|
+
trackedThreads?: (channels: string[], since: string) => TrackedThread[];
|
|
32
|
+
fetchImpl?: FetchImpl;
|
|
33
|
+
now?: () => number;
|
|
34
|
+
channelStore?: ChannelCoverageStore;
|
|
35
|
+
threadStore?: ThreadCoverageStore;
|
|
36
|
+
/** This machine has no connection of its own; the hub relays its channels' events. A configured channel is recovered
|
|
37
|
+
* only once the hub has relayed it here (adoptRelayed), from that moment, and across restarts. A machine nothing is
|
|
38
|
+
* relayed to never reads history. */
|
|
39
|
+
relayed?: boolean;
|
|
40
|
+
}
|
|
41
|
+
export declare class SlackRecovery {
|
|
42
|
+
private readonly opts;
|
|
43
|
+
private readonly channels;
|
|
44
|
+
private readonly channelStore;
|
|
45
|
+
private readonly threadStore;
|
|
46
|
+
private threads;
|
|
47
|
+
private readonly backoff;
|
|
48
|
+
private readonly now;
|
|
49
|
+
private pass?;
|
|
50
|
+
private stopped;
|
|
51
|
+
private lastChannel;
|
|
52
|
+
private lastThread;
|
|
53
|
+
private threadsUnavailable;
|
|
54
|
+
private initialized;
|
|
55
|
+
private readonly adoptedHere;
|
|
56
|
+
private readonly threadTotals;
|
|
57
|
+
constructor(opts: SlackRecoveryOptions);
|
|
58
|
+
initialize(): void;
|
|
59
|
+
/** The hub relayed an event for `channel` here, received at `atMs`. A configured channel is adopted the first time, with
|
|
60
|
+
* its coverage starting at that receipt; a channel this machine isn't configured for is never adopted. */
|
|
61
|
+
adoptRelayed(channel: string | undefined, atMs: number): void;
|
|
62
|
+
stop(): void;
|
|
63
|
+
run(): Promise<void>;
|
|
64
|
+
/** On a relayed machine, the configured channels the hub has relayed here (saved, so a restart keeps them). */
|
|
65
|
+
private relayAdopted;
|
|
66
|
+
private activeChannels;
|
|
67
|
+
/** Slack's rate limit holds a method for the whole workspace. Before any source is admitted, restore each method's hold
|
|
68
|
+
* from every saved rate-limit deadline, including one on a thread no longer tracked. A deadline saved without the
|
|
69
|
+
* marker, as an older daemon saved every backoff, may be a rate limit, so it holds the method too. */
|
|
70
|
+
private restoreMethodHolds;
|
|
71
|
+
private scan;
|
|
72
|
+
private trackedThreadSources;
|
|
73
|
+
status(): {
|
|
74
|
+
acceptedThisProcess: number;
|
|
75
|
+
deadLetteredThisProcess: number;
|
|
76
|
+
limits: string[];
|
|
77
|
+
channels: {
|
|
78
|
+
state: string;
|
|
79
|
+
reason: string | undefined;
|
|
80
|
+
channel: string | null;
|
|
81
|
+
lastScanAt: string | undefined;
|
|
82
|
+
coverage: import("./state-store.js").ChannelCoverage | null;
|
|
83
|
+
acceptedThisProcess: number;
|
|
84
|
+
deadLetteredThisProcess: number;
|
|
85
|
+
}[];
|
|
86
|
+
threads: {
|
|
87
|
+
tracked: number;
|
|
88
|
+
scanned: number;
|
|
89
|
+
pending: number;
|
|
90
|
+
oldestPendingSeconds: number | null;
|
|
91
|
+
backoff: Record<string, number>;
|
|
92
|
+
incomplete: Record<string, number>;
|
|
93
|
+
reason?: string | undefined;
|
|
94
|
+
state: string;
|
|
95
|
+
};
|
|
96
|
+
state: string;
|
|
97
|
+
reason: string | undefined;
|
|
98
|
+
channel: string | null;
|
|
99
|
+
lastScanAt: string | undefined;
|
|
100
|
+
coverage: import("./state-store.js").ChannelCoverage | null;
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
export {};
|
|
104
|
+
//# sourceMappingURL=slack-recovery.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slack-recovery.d.ts","sourceRoot":"","sources":["../../../../src/domain/gateway/slack/slack-recovery.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAGlD,OAAO,EAAE,oBAAoB,EAAE,mBAAmB,EAAoD,MAAM,kBAAkB,CAAC;AAG/H,uFAAuF;AACvF,eAAO,MAAM,gBAAgB,QAA0B,CAAC;AAExD,MAAM,WAAW,aAAa;IAAG,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE;AAE9G;uFACuF;AACvF,wBAAgB,qBAAqB,CAAC,GAAG,EAAE;IAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,UAAU,CAAC,EAAE,KAAK,CAAC;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAAC,eAAe,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,MAAM,EAAE,CASnJ;AAED,UAAU,oBAAoB;IAC5B,2FAA2F;IAC3F,QAAQ,EAAE,KAAK,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,UAAU,CAAA;KAAE,CAAC,CAAC;IACxD,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,aAAa,CAAC;IACtB,2FAA2F;IAC3F,cAAc,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,KAAK,aAAa,EAAE,CAAC;IACxE,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,oBAAoB,CAAC;IACpC,WAAW,CAAC,EAAE,mBAAmB,CAAC;IAClC;;0CAEsC;IACtC,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAID,qBAAa,aAAa;IAiBZ,OAAO,CAAC,QAAQ,CAAC,IAAI;IAhBjC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAoB;IAC7C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAuB;IACpD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAsB;IAClD,OAAO,CAAC,OAAO,CAAoC;IACnD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAuB;IAC/C,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAe;IACnC,OAAO,CAAC,IAAI,CAAC,CAAgB;IAC7B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,WAAW,CAAqB;IACxC,OAAO,CAAC,UAAU,CAAqB;IACvC,OAAO,CAAC,kBAAkB,CAAqB;IAC/C,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAqB;IAEjD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAoC;gBAEpC,IAAI,EAAE,oBAAoB;IASvD,UAAU,IAAI,IAAI;IAQlB;+GAC2G;IAC3G,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAW7D,IAAI,IAAI,IAAI;IAKZ,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;IAUpB,+GAA+G;IAC/G,OAAO,CAAC,YAAY;IASpB,OAAO,CAAC,cAAc;IAKtB;;2GAEuG;IACvG,OAAO,CAAC,kBAAkB;YAcZ,IAAI;IAyBlB,OAAO,CAAC,oBAAoB;IA4B5B,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8CP"}
|
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
// Missed-message recovery for the channels this machine owns and the threads it tracks in them.
|
|
2
|
+
// A pass shares one budget, taken alternately by channels and threads (each kind in rotation), so
|
|
3
|
+
// neither kind starves the other.
|
|
4
|
+
import path from "node:path";
|
|
5
|
+
import { ChannelRecovery } from "./channel-recovery.js";
|
|
6
|
+
import { ThreadRecovery, threadKey } from "./thread-recovery.js";
|
|
7
|
+
import { ChannelCoverageStore, ThreadCoverageStore, slackMicros, slackTimestamp } from "./state-store.js";
|
|
8
|
+
import { budgetLeft, HISTORY, MethodBackoff, newRecoveryBudget, REPLIES } from "./recovery-budget.js";
|
|
9
|
+
/** A thread is tracked while its root was posted, or it closed, within this window. */
|
|
10
|
+
export const THREAD_WINDOW_MS = 7 * 24 * 60 * 60 * 1000;
|
|
11
|
+
/** The channels this machine recovers: its default channel and its channel map's, except a channel
|
|
12
|
+
* its configuration relays to the machine that owns it (that machine recovers it). */
|
|
13
|
+
export function ownedRecoveryChannels(cfg) {
|
|
14
|
+
const relayed = new Set(Array.isArray(cfg.forwardChannels)
|
|
15
|
+
? cfg.forwardChannels.flatMap((f) => (f && typeof f.channel === "string" ? [f.channel] : []))
|
|
16
|
+
: []);
|
|
17
|
+
const out = [];
|
|
18
|
+
for (const channel of [cfg.channel, ...(cfg.channelMap ?? []).map((e) => e.channel)]) {
|
|
19
|
+
if (channel && !relayed.has(channel) && !out.includes(channel))
|
|
20
|
+
out.push(channel);
|
|
21
|
+
}
|
|
22
|
+
return out;
|
|
23
|
+
}
|
|
24
|
+
export class SlackRecovery {
|
|
25
|
+
opts;
|
|
26
|
+
channels;
|
|
27
|
+
channelStore;
|
|
28
|
+
threadStore;
|
|
29
|
+
threads = new Map();
|
|
30
|
+
backoff = new MethodBackoff();
|
|
31
|
+
now;
|
|
32
|
+
pass;
|
|
33
|
+
stopped = false;
|
|
34
|
+
lastChannel;
|
|
35
|
+
lastThread;
|
|
36
|
+
threadsUnavailable;
|
|
37
|
+
initialized = false;
|
|
38
|
+
adoptedHere = new Set();
|
|
39
|
+
// Thread recoveries since the connector started, kept when a thread leaves the window.
|
|
40
|
+
threadTotals = { accepted: 0, deadLettered: 0 };
|
|
41
|
+
constructor(opts) {
|
|
42
|
+
this.opts = opts;
|
|
43
|
+
this.now = opts.now ?? Date.now;
|
|
44
|
+
this.channelStore = opts.channelStore ?? new ChannelCoverageStore(path.join(opts.stateDir, "slack-channel-coverage.json"));
|
|
45
|
+
const channels = opts.channels.length ? opts.channels : [{ channel: null }];
|
|
46
|
+
this.channels = channels.map((c) => new ChannelRecovery({ channel: c.channel, token: opts.token, stateDir: opts.stateDir,
|
|
47
|
+
router: opts.router, fetchImpl: opts.fetchImpl, store: this.channelStore, now: this.now, ...(c.seed ? { seed: c.seed } : {}) }));
|
|
48
|
+
this.threadStore = opts.threadStore ?? new ThreadCoverageStore(path.join(opts.stateDir, "slack-thread-coverage.json"));
|
|
49
|
+
}
|
|
50
|
+
initialize() {
|
|
51
|
+
this.initialized = true;
|
|
52
|
+
for (const channel of this.activeChannels()) {
|
|
53
|
+
channel.initialize();
|
|
54
|
+
if (channel.channel)
|
|
55
|
+
this.adoptedHere.add(channel.channel);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
/** The hub relayed an event for `channel` here, received at `atMs`. A configured channel is adopted the first time, with
|
|
59
|
+
* its coverage starting at that receipt; a channel this machine isn't configured for is never adopted. */
|
|
60
|
+
adoptRelayed(channel, atMs) {
|
|
61
|
+
if (!this.opts.relayed || !channel || this.stopped || this.adoptedHere.has(channel))
|
|
62
|
+
return;
|
|
63
|
+
const source = this.channels.find((c) => c.channel === channel);
|
|
64
|
+
if (!source)
|
|
65
|
+
return;
|
|
66
|
+
try {
|
|
67
|
+
this.channelStore.adoptRelayed(channel, slackTimestamp(BigInt(atMs) * 1000n));
|
|
68
|
+
source.initialize();
|
|
69
|
+
this.adoptedHere.add(channel);
|
|
70
|
+
}
|
|
71
|
+
catch { /* an unreadable checkpoint file is never replaced; the channel keeps waiting */ }
|
|
72
|
+
}
|
|
73
|
+
stop() {
|
|
74
|
+
this.stopped = true;
|
|
75
|
+
for (const channel of this.channels)
|
|
76
|
+
channel.stop();
|
|
77
|
+
}
|
|
78
|
+
run() {
|
|
79
|
+
if (this.pass)
|
|
80
|
+
return this.pass;
|
|
81
|
+
if (this.stopped || !this.opts.token)
|
|
82
|
+
return Promise.resolve();
|
|
83
|
+
if (!this.initialized)
|
|
84
|
+
this.initialize();
|
|
85
|
+
const pass = this.scan();
|
|
86
|
+
this.pass = pass;
|
|
87
|
+
void pass.finally(() => { if (this.pass === pass)
|
|
88
|
+
this.pass = undefined; });
|
|
89
|
+
return pass;
|
|
90
|
+
}
|
|
91
|
+
/** On a relayed machine, the configured channels the hub has relayed here (saved, so a restart keeps them). */
|
|
92
|
+
relayAdopted() {
|
|
93
|
+
if (!this.opts.relayed)
|
|
94
|
+
return null;
|
|
95
|
+
try {
|
|
96
|
+
return new Set(Object.entries(this.channelStore.all()).flatMap(([channel, c]) => (c.relayAdoptedAt ? [channel] : [])));
|
|
97
|
+
}
|
|
98
|
+
catch {
|
|
99
|
+
return new Set();
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
activeChannels() {
|
|
103
|
+
const adopted = this.relayAdopted();
|
|
104
|
+
return adopted ? this.channels.filter((c) => c.channel !== null && adopted.has(c.channel)) : this.channels;
|
|
105
|
+
}
|
|
106
|
+
/** Slack's rate limit holds a method for the whole workspace. Before any source is admitted, restore each method's hold
|
|
107
|
+
* from every saved rate-limit deadline, including one on a thread no longer tracked. A deadline saved without the
|
|
108
|
+
* marker, as an older daemon saved every backoff, may be a rate limit, so it holds the method too. */
|
|
109
|
+
restoreMethodHolds() {
|
|
110
|
+
const now = this.now();
|
|
111
|
+
try {
|
|
112
|
+
for (const c of Object.values(this.channelStore.all())) {
|
|
113
|
+
if (c.rateLimited !== false && c.nextRetryAt && c.nextRetryAt > now)
|
|
114
|
+
this.backoff.hold(HISTORY, c.nextRetryAt);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
catch { /* an unreadable channel file leaves its channels unavailable */ }
|
|
118
|
+
try {
|
|
119
|
+
for (const t of Object.values(this.threadStore.read())) {
|
|
120
|
+
if (t.rateLimited !== false && t.nextRetryAt && t.nextRetryAt > now)
|
|
121
|
+
this.backoff.hold(REPLIES, t.nextRetryAt);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
catch { /* reported when threads are listed */ }
|
|
125
|
+
}
|
|
126
|
+
async scan() {
|
|
127
|
+
this.restoreMethodHolds();
|
|
128
|
+
// Channels and threads take turns one step at a time, each kind in its own rotation. A source with
|
|
129
|
+
// more to scan rejoins the back of its kind's queue; a kind with nothing left gives its turns away.
|
|
130
|
+
const queues = [rotate(this.activeChannels(), this.lastChannel), rotate(this.trackedThreadSources(), this.lastThread)];
|
|
131
|
+
const budget = newRecoveryBudget(this.now());
|
|
132
|
+
let kind = 0;
|
|
133
|
+
while (!this.stopped && budgetLeft(budget, this.now()) && (queues[0].length || queues[1].length)) {
|
|
134
|
+
if (!queues[kind].length)
|
|
135
|
+
kind = 1 - kind;
|
|
136
|
+
const source = queues[kind].shift();
|
|
137
|
+
if (source instanceof ThreadRecovery) {
|
|
138
|
+
this.lastThread = source.key;
|
|
139
|
+
const before = { accepted: source.accepted, deadLettered: source.deadLettered };
|
|
140
|
+
const more = await source.step(budget, this.backoff);
|
|
141
|
+
this.threadTotals.accepted += source.accepted - before.accepted;
|
|
142
|
+
this.threadTotals.deadLettered += source.deadLettered - before.deadLettered;
|
|
143
|
+
if (more === "more")
|
|
144
|
+
queues[kind].push(source);
|
|
145
|
+
}
|
|
146
|
+
else {
|
|
147
|
+
this.lastChannel = source.key;
|
|
148
|
+
if (await source.step(budget, this.backoff) === "more")
|
|
149
|
+
queues[kind].push(source);
|
|
150
|
+
}
|
|
151
|
+
kind = 1 - kind;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
trackedThreadSources() {
|
|
155
|
+
if (!this.opts.trackedThreads || !this.opts.token)
|
|
156
|
+
return [];
|
|
157
|
+
let stored;
|
|
158
|
+
try {
|
|
159
|
+
stored = this.threadStore.read();
|
|
160
|
+
this.threadsUnavailable = undefined;
|
|
161
|
+
}
|
|
162
|
+
catch {
|
|
163
|
+
// Never replace an unreadable checkpoint file with fresh floors.
|
|
164
|
+
this.threadsUnavailable = "checkpoint-unreadable-or-unwritable";
|
|
165
|
+
return [];
|
|
166
|
+
}
|
|
167
|
+
const owned = this.activeChannels().flatMap((c) => (c.channel ? [c.channel] : []));
|
|
168
|
+
const since = new Date(this.now() - THREAD_WINDOW_MS).toISOString();
|
|
169
|
+
const next = new Map();
|
|
170
|
+
for (const t of this.opts.trackedThreads(owned, since)) {
|
|
171
|
+
if (!owned.includes(t.channel) || slackMicros(t.threadTs) === null)
|
|
172
|
+
continue;
|
|
173
|
+
const key = threadKey(t.channel, t.threadTs);
|
|
174
|
+
const mapping = `${t.state ?? ""}|${t.closedAt ?? ""}`;
|
|
175
|
+
const prior = this.threads.get(key);
|
|
176
|
+
// A changed mapping gets a fresh source (so a thread Slack couldn't find is asked again); saved coverage carries over.
|
|
177
|
+
next.set(key, prior && prior.mapping === mapping ? prior : { mapping, source: new ThreadRecovery({ channel: t.channel,
|
|
178
|
+
threadTs: t.threadTs, token: this.opts.token, store: this.threadStore, stored: stored[key], router: this.opts.router,
|
|
179
|
+
fetchImpl: this.opts.fetchImpl, now: this.now, stopped: () => this.stopped }) });
|
|
180
|
+
}
|
|
181
|
+
this.threads = next;
|
|
182
|
+
return [...next.values()].map((t) => t.source).sort((a, b) => (a.key < b.key ? -1 : 1));
|
|
183
|
+
}
|
|
184
|
+
status() {
|
|
185
|
+
const adopted = this.relayAdopted();
|
|
186
|
+
const channels = this.channels.map((c) => {
|
|
187
|
+
const s = c.status();
|
|
188
|
+
return adopted && c.channel && !adopted.has(c.channel) ? { ...s, state: "waiting", reason: "no-relayed-event-yet" } : s;
|
|
189
|
+
});
|
|
190
|
+
const [primary, ...others] = channels;
|
|
191
|
+
const threads = [...this.threads.values()].map((t) => t.source);
|
|
192
|
+
const count = (state) => threads.filter((t) => t.state === state).length;
|
|
193
|
+
const byReason = (states) => threads.reduce((acc, t) => {
|
|
194
|
+
if (states.includes(t.state))
|
|
195
|
+
acc[t.reason ?? "unknown"] = (acc[t.reason ?? "unknown"] ?? 0) + 1;
|
|
196
|
+
return acc;
|
|
197
|
+
}, {});
|
|
198
|
+
const now = this.now();
|
|
199
|
+
const behind = (t) => Math.max(0, Math.floor(now / 1000 - Number(slackMicros(t.coveredThrough) / 1000000n)));
|
|
200
|
+
const pending = threads.filter((t) => t.state === "pending");
|
|
201
|
+
const sum = (values) => values.reduce((n, v) => n + v, 0);
|
|
202
|
+
return {
|
|
203
|
+
...primary,
|
|
204
|
+
// Every channel and thread recovered since the connector started, the default channel's included.
|
|
205
|
+
acceptedThisProcess: sum(channels.map((c) => c.acceptedThisProcess)) + this.threadTotals.accepted,
|
|
206
|
+
deadLetteredThisProcess: sum(channels.map((c) => c.deadLetteredThisProcess)) + this.threadTotals.deadLettered,
|
|
207
|
+
limits: [
|
|
208
|
+
"older history unknown",
|
|
209
|
+
"counts reset on connector rewire/restart",
|
|
210
|
+
"history of the channels this machine owns, including broadcast replies, and replies in tracked threads whose root was posted or which closed within seven days",
|
|
211
|
+
"missed replies in older open threads aren't recovered; live delivery is unchanged",
|
|
212
|
+
"a recovered thread reply, or a broadcast reply recovered in a newly covered channel, lands as a late reply row and never answers a decision",
|
|
213
|
+
...(channels.some((c) => c.coverage?.historyLimited) ? ["Slack plan limit excludes older history; only available messages were scanned"] : []),
|
|
214
|
+
"coverage means scanned available history; dead letters are custody, not delivery",
|
|
215
|
+
"five-second settle margin; larger clock skew or history visibility lag remains unverified",
|
|
216
|
+
"four calls / 100 entries / 15 seconds per pass, taken in turn by channels and threads; no global chronological ordering",
|
|
217
|
+
],
|
|
218
|
+
channels: others.map(({ limits: _limits, ...rest }) => rest),
|
|
219
|
+
threads: {
|
|
220
|
+
state: !this.opts.trackedThreads ? "not-configured" : this.threadsUnavailable ? "unavailable" : "available",
|
|
221
|
+
...(this.threadsUnavailable ? { reason: this.threadsUnavailable } : {}),
|
|
222
|
+
tracked: threads.length,
|
|
223
|
+
scanned: count("scanned"),
|
|
224
|
+
pending: pending.length,
|
|
225
|
+
oldestPendingSeconds: pending.length ? Math.max(...pending.map(behind)) : null,
|
|
226
|
+
backoff: byReason(["backoff"]),
|
|
227
|
+
incomplete: byReason(["incomplete"]),
|
|
228
|
+
},
|
|
229
|
+
};
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
function rotate(sources, last) {
|
|
233
|
+
const start = last === undefined ? 0 : sources.findIndex((s) => s.key === last) + 1;
|
|
234
|
+
return [...sources.slice(start), ...sources.slice(0, start)];
|
|
235
|
+
}
|
|
236
|
+
//# sourceMappingURL=slack-recovery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slack-recovery.js","sourceRoot":"","sources":["../../../../src/domain/gateway/slack/slack-recovery.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"slack-subsystem.d.ts","sourceRoot":"","sources":["../../../../src/domain/gateway/slack/slack-subsystem.ts"],"names":[],"mappings":"AAmBA,OAAO,EAAsB,KAAK,WAAW,EAA2B,MAAM,yBAAyB,CAAC;AAUxG,OAAO,EAAsH,KAAK,eAAe,EAA0E,MAAM,cAAc,CAAC;AAChP,OAAO,EAA6B,KAAK,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAOzF,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,sCAAsC,CAAC;AACnF,OAAO,EAAgD,KAAK,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAEhG,OAAO,EAAmC,KAAK,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAGlG,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAoBhD,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,eAAe,CAAC;IAC3B,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5B,2FAA2F;IAC3F,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,SAAS,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,CAAC;IACpC,6EAA6E;IAC7E,gBAAgB,CAAC,EAAE,MAAM,sBAAsB,CAAC;IAChD,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,EAAE,eAAe,CAAC;IAC3B,iBAAiB,CAAC,EAAE,CAAC,KAAK,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,KAAK,OAAO,CAAC,UAAU,GAAG,kBAAkB,GAAG,gBAAgB,CAAC,CAAC;CACzJ;AAED,UAAU,oBAAoB;IAC5B,GAAG,CAAC,KAAK,EAAE;QAAE,IAAI,EAAE,SAAS,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAC5G;AAED;;yEAEyE;AACzE,wBAAgB,sBAAsB,CACpC,SAAS,EAAE,eAAe,EAC1B,QAAQ,EAAE,oBAAoB,GAAG,SAAS,GACzC,WAAW,CAAC,aAAa,CAAC,mBAAmB,CAAC,CAAC,CAqBjD;AAED;;;;;;;;;;;;GAYG;AACH;;;kCAGkC;AAClC,wBAAgB,mBAAmB,CAAC,IAAI,EAAE;IACxC,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/B,SAAS,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,KAAK,IAAI,CAAC;IACnD,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5B,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,GAAG,eAAe,CA4ClB;AA+BD;wEACwE;AACxE,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,aAAa,GAAG,WAAW,
|
|
1
|
+
{"version":3,"file":"slack-subsystem.d.ts","sourceRoot":"","sources":["../../../../src/domain/gateway/slack/slack-subsystem.ts"],"names":[],"mappings":"AAmBA,OAAO,EAAsB,KAAK,WAAW,EAA2B,MAAM,yBAAyB,CAAC;AAUxG,OAAO,EAAsH,KAAK,eAAe,EAA0E,MAAM,cAAc,CAAC;AAChP,OAAO,EAA6B,KAAK,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAOzF,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,sCAAsC,CAAC;AACnF,OAAO,EAAgD,KAAK,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAEhG,OAAO,EAAmC,KAAK,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAGlG,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAoBhD,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,eAAe,CAAC;IAC3B,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5B,2FAA2F;IAC3F,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,SAAS,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,CAAC;IACpC,6EAA6E;IAC7E,gBAAgB,CAAC,EAAE,MAAM,sBAAsB,CAAC;IAChD,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,EAAE,eAAe,CAAC;IAC3B,iBAAiB,CAAC,EAAE,CAAC,KAAK,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,KAAK,OAAO,CAAC,UAAU,GAAG,kBAAkB,GAAG,gBAAgB,CAAC,CAAC;CACzJ;AAED,UAAU,oBAAoB;IAC5B,GAAG,CAAC,KAAK,EAAE;QAAE,IAAI,EAAE,SAAS,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAC5G;AAED;;yEAEyE;AACzE,wBAAgB,sBAAsB,CACpC,SAAS,EAAE,eAAe,EAC1B,QAAQ,EAAE,oBAAoB,GAAG,SAAS,GACzC,WAAW,CAAC,aAAa,CAAC,mBAAmB,CAAC,CAAC,CAqBjD;AAED;;;;;;;;;;;;GAYG;AACH;;;kCAGkC;AAClC,wBAAgB,mBAAmB,CAAC,IAAI,EAAE;IACxC,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/B,SAAS,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,KAAK,IAAI,CAAC;IACnD,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5B,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,GAAG,eAAe,CA4ClB;AA+BD;wEACwE;AACxE,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,aAAa,GAAG,WAAW,CAqsBtE"}
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
// (slack-outbound-seen.jsonl, slack-inbound-seen.jsonl, slack-inbound-deadletter.jsonl), so
|
|
12
12
|
// the relay's history IS the subsystem's history — enabling the subsystem replays nothing the
|
|
13
13
|
// relay already delivered (the enable-time backlog rule survives the cutover by construction).
|
|
14
|
-
import {
|
|
14
|
+
import { SlackRecovery, ownedRecoveryChannels } from "./slack-recovery.js";
|
|
15
15
|
import { channelStateDigest } from "../channel-operations.js";
|
|
16
16
|
import path from "node:path";
|
|
17
17
|
import { createHash } from "node:crypto";
|
|
@@ -33,7 +33,7 @@ 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
35
|
import { getSelfHostId } from "../../hosts/fanout-contract.js";
|
|
36
|
-
import { forwardChannelProblems, makeEnvelopeForwarder } from "./forwarding.js";
|
|
36
|
+
import { envelopeChannel, forwardChannelProblems, makeEnvelopeForwarder } from "./forwarding.js";
|
|
37
37
|
import { startSocketInbound } from "./socket-inbound.js";
|
|
38
38
|
import { loadHumanRegistry, resolveSlackHandle } from "../human-registry.js";
|
|
39
39
|
import { hasLiveHumanGate, isBlockerLive } from "../../queue-repository.js";
|
|
@@ -676,6 +676,17 @@ export function buildSlackGatewayWire(opts) {
|
|
|
676
676
|
const starts = [];
|
|
677
677
|
let inboundHandle;
|
|
678
678
|
let recovery;
|
|
679
|
+
// Recovery covers the channels this machine owns and the threads tracked in them. The configured
|
|
680
|
+
// default channel keeps its established seed; a channel newly recovered starts at adoption.
|
|
681
|
+
const buildRecovery = (router, seedDefault, relayed = false) => new SlackRecovery({
|
|
682
|
+
channels: ownedRecoveryChannels(cfg).map((channel) => (seedDefault && channel === cfg.channel ? { channel } : { channel, seed: "adoption" })),
|
|
683
|
+
token: bot,
|
|
684
|
+
stateDir: stateDir(opts.home),
|
|
685
|
+
router,
|
|
686
|
+
trackedThreads: (channels, closedSince) => threadMap.trackedForRecovery(channels, closedSince),
|
|
687
|
+
fetchImpl: opts.fetchImpl,
|
|
688
|
+
...(relayed ? { relayed: true } : {}),
|
|
689
|
+
});
|
|
679
690
|
if (outboundReady) {
|
|
680
691
|
const driver = new SlackOutboundDriver({
|
|
681
692
|
home: opts.home,
|
|
@@ -801,25 +812,37 @@ export function buildSlackGatewayWire(opts) {
|
|
|
801
812
|
log(`slack bot inbox OFF: ${!bot ? "SLACK_BOT_TOKEN unresolved (bots.info needs it)" : botInboxProblems(cfg).join("; ")}`);
|
|
802
813
|
}
|
|
803
814
|
// An envelope the hub relayed is handled here and never relayed again.
|
|
804
|
-
acceptForwarded = (env) => {
|
|
815
|
+
acceptForwarded = (env) => {
|
|
816
|
+
relayedReceived++;
|
|
817
|
+
// A relayed event adopts its channel for recovery, from this local receipt time (only a channel configured here).
|
|
818
|
+
if (!inboundReady)
|
|
819
|
+
recovery?.adoptRelayed(envelopeChannel(env), Date.now());
|
|
820
|
+
return handleEnvelope(env, () => { }, built, log, undefined, { relayed: true });
|
|
821
|
+
};
|
|
805
822
|
if (!inboundReady) {
|
|
806
823
|
// No socket here, so no socket-driven retry: drain this machine's own retained events on the
|
|
807
|
-
// same five-minute cadence the socket uses, once services start.
|
|
824
|
+
// same five-minute cadence the socket uses, once services start. The hub relays this machine's
|
|
825
|
+
// channels' live events; each configured channel the hub has relayed here is also recovered,
|
|
826
|
+
// from its first relayed event, so this machine, which owns it, gets what nobody received.
|
|
827
|
+
const relayedRecovery = (recovery = buildRecovery(built, false, true));
|
|
828
|
+
const recover = () => { void relayedRecovery.run().catch(() => log("channel recovery failed; checkpoint retained")); };
|
|
808
829
|
let retryTimer;
|
|
809
830
|
starts.push(() => {
|
|
831
|
+
relayedRecovery.initialize(); // channels adopted before a restart resume from their saved coverage
|
|
810
832
|
retryTimer = setInterval(() => {
|
|
833
|
+
recover();
|
|
811
834
|
void built.retryDeadLetters().catch((e) => log(`slack dead-letter retry failed: ${e.message}`));
|
|
812
835
|
}, opts.inboundRetryIntervalMs ?? 5 * 60 * 1000);
|
|
813
836
|
retryTimer.unref?.();
|
|
814
837
|
});
|
|
815
|
-
stops.push(() => { if (retryTimer)
|
|
838
|
+
stops.push(() => { relayedRecovery.stop(); if (retryTimer)
|
|
816
839
|
clearInterval(retryTimer); });
|
|
817
840
|
}
|
|
818
841
|
}
|
|
819
842
|
if (inboundReady && router) {
|
|
820
843
|
const socketRouter = router;
|
|
821
844
|
const receipts = new InboundReceiptStore(path.join(stateDir(opts.home), "slack-inbound-receipts.jsonl"));
|
|
822
|
-
recovery =
|
|
845
|
+
recovery = buildRecovery(socketRouter, true);
|
|
823
846
|
starts.push(() => {
|
|
824
847
|
recovery.initialize(); // persist the once-only floor before any live events
|
|
825
848
|
inboundHandle = startSocketInbound(app, socketRouter, {
|