@openrig/cli 0.5.4 → 0.5.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/daemon/assets/guidance/openrig-start.md +7 -0
- package/daemon/assets/onboarding/01-world-and-purpose.md +52 -0
- package/daemon/assets/onboarding/02-self-and-competent-action.md +57 -0
- package/daemon/assets/plugins/openrig-core/README.md +5 -2
- package/daemon/assets/plugins/openrig-core/hooks/claude.json +3 -12
- package/daemon/assets/plugins/openrig-core/hooks/codex.json +5 -12
- package/daemon/assets/plugins/openrig-core/hooks/scripts/refocus.cjs +194 -124
- package/daemon/assets/plugins/openrig-core/skills/mission-slice-sop/SKILL.md +18 -23
- package/daemon/assets/plugins/openrig-core/skills/openrig-operating-model/CHANGELOG.md +92 -0
- package/daemon/assets/plugins/openrig-core/skills/openrig-operating-model/REVISION-GUIDE.md +34 -0
- package/daemon/assets/plugins/openrig-core/skills/openrig-operating-model/ROADMAP.md +23 -0
- package/daemon/assets/plugins/openrig-core/skills/openrig-operating-model/ROLLOUT.md +234 -0
- package/daemon/assets/plugins/openrig-core/skills/openrig-operating-model/SKILL.md +404 -0
- package/daemon/assets/plugins/openrig-core/skills/openrig-operating-model/scripts/compose.py +653 -0
- package/daemon/assets/plugins/openrig-core/skills/openrig-operating-model/scripts/scaffold.sh +34 -0
- package/daemon/assets/plugins/openrig-core/skills/openrig-operating-model/scripts/trace-due.sh +32 -0
- package/daemon/assets/plugins/openrig-core/skills/openrig-operating-model/scripts/trace-stamp.sh +5 -0
- package/daemon/assets/plugins/openrig-core/skills/openrig-operating-model/scripts/trunk-diff.sh +18 -0
- package/daemon/assets/plugins/openrig-core/skills/openrig-operating-model/templates/LEARNED.md +40 -0
- package/daemon/assets/plugins/openrig-core/skills/openrig-operating-model/templates/NOTES.md +9 -0
- package/daemon/assets/plugins/openrig-core/skills/openrig-operating-model/templates/PLAYBOOK.md +5 -0
- package/daemon/assets/plugins/openrig-core/skills/openrig-operating-model/templates/SOP.md +24 -0
- package/daemon/assets/plugins/openrig-core/skills/openrig-operating-model/templates/SPEC.md +54 -0
- package/daemon/assets/plugins/openrig-core/skills/openrig-skills/SKILL.md +2 -0
- package/daemon/assets/plugins/openrig-core/skills/refocusing/SKILL.md +31 -0
- package/daemon/assets/plugins/openrig-core/skills/refocusing/references/refocus.md +22 -0
- package/daemon/assets/plugins/openrig-core/skills/refocusing/scripts/trace-to-root.py +221 -0
- package/daemon/assets/plugins/openrig-core/skills/retiring-and-inheriting-a-seat/SKILL.md +3 -3
- package/daemon/context-packs/onboarding-width/manifest.yaml +11 -0
- package/daemon/context-packs/{world/install/reference-material.md → onboarding-width/public-reference-material.md} +4 -26
- package/daemon/context-packs/{world/install/what-you-can-do.md → onboarding-width/public-what-you-can-do.md} +13 -9
- package/daemon/context-packs/skills/core/agent-starters/manifest.yaml +1 -1
- package/daemon/context-packs/skills/core/agent-startup-and-context-ingestion/SKILL.md +1 -1
- package/daemon/context-packs/skills/core/agent-startup-and-context-ingestion/manifest.yaml +1 -1
- package/daemon/context-packs/skills/core/attention-queue/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/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-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/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/SKILL.md +21 -15
- package/daemon/context-packs/skills/pm/requirements-writer/manifest.yaml +3 -3
- 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/brainstorming/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/executing-plans/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/using-superpowers/manifest.yaml +1 -1
- package/daemon/context-packs/skills/process/verification-before-completion/manifest.yaml +1 -1
- package/daemon/context-packs/skills/process/writing-plans/manifest.yaml +1 -1
- package/daemon/context-packs/world-example/manifest.yaml +8 -0
- package/daemon/context-packs/world-example/your-world.md +37 -0
- package/daemon/dist/adapters/claude-code-adapter.d.ts +15 -0
- package/daemon/dist/adapters/claude-code-adapter.d.ts.map +1 -1
- package/daemon/dist/adapters/claude-code-adapter.js +57 -0
- package/daemon/dist/adapters/claude-code-adapter.js.map +1 -1
- package/daemon/dist/build-info.js +3 -3
- package/daemon/dist/db/all-migrations.d.ts.map +1 -1
- package/daemon/dist/db/all-migrations.js +4 -0
- package/daemon/dist/db/all-migrations.js.map +1 -1
- package/daemon/dist/db/migrations/072_thread_seat_map.d.ts +3 -0
- package/daemon/dist/db/migrations/072_thread_seat_map.d.ts.map +1 -0
- package/daemon/dist/db/migrations/072_thread_seat_map.js +22 -0
- package/daemon/dist/db/migrations/072_thread_seat_map.js.map +1 -0
- package/daemon/dist/db/migrations/073_queue_transition_wakes.d.ts +3 -0
- package/daemon/dist/db/migrations/073_queue_transition_wakes.d.ts.map +1 -0
- package/daemon/dist/db/migrations/073_queue_transition_wakes.js +21 -0
- package/daemon/dist/db/migrations/073_queue_transition_wakes.js.map +1 -0
- package/daemon/dist/domain/activity-taxonomy.d.ts +112 -0
- package/daemon/dist/domain/activity-taxonomy.d.ts.map +1 -0
- package/daemon/dist/domain/activity-taxonomy.js +99 -0
- package/daemon/dist/domain/activity-taxonomy.js.map +1 -0
- package/daemon/dist/domain/bind-plan.d.ts +19 -0
- package/daemon/dist/domain/bind-plan.d.ts.map +1 -0
- package/daemon/dist/domain/bind-plan.js +25 -0
- package/daemon/dist/domain/bind-plan.js.map +1 -0
- package/daemon/dist/domain/event-bus.d.ts +6 -0
- package/daemon/dist/domain/event-bus.d.ts.map +1 -1
- package/daemon/dist/domain/event-bus.js +15 -5
- package/daemon/dist/domain/event-bus.js.map +1 -1
- package/daemon/dist/domain/gateway/gateway-process-main.d.ts.map +1 -1
- package/daemon/dist/domain/gateway/gateway-process-main.js +9 -0
- package/daemon/dist/domain/gateway/gateway-process-main.js.map +1 -1
- package/daemon/dist/domain/gateway/gateway-process.d.ts.map +1 -1
- package/daemon/dist/domain/gateway/gateway-process.js +9 -0
- package/daemon/dist/domain/gateway/gateway-process.js.map +1 -1
- package/daemon/dist/domain/gateway/gateway-subsystem.d.ts +80 -0
- package/daemon/dist/domain/gateway/gateway-subsystem.d.ts.map +1 -0
- package/daemon/dist/domain/gateway/gateway-subsystem.js +149 -0
- package/daemon/dist/domain/gateway/gateway-subsystem.js.map +1 -0
- package/daemon/dist/domain/gateway/human-registry.d.ts +109 -0
- package/daemon/dist/domain/gateway/human-registry.d.ts.map +1 -1
- package/daemon/dist/domain/gateway/human-registry.js +250 -0
- package/daemon/dist/domain/gateway/human-registry.js.map +1 -1
- package/{dist → daemon/dist/domain/gateway}/slack/config.d.ts +8 -5
- package/daemon/dist/domain/gateway/slack/config.d.ts.map +1 -0
- package/{dist → daemon/dist/domain/gateway}/slack/config.js +8 -6
- package/daemon/dist/domain/gateway/slack/config.js.map +1 -0
- package/{dist → daemon/dist/domain/gateway}/slack/inbound-admission.d.ts +1 -1
- package/daemon/dist/domain/gateway/slack/inbound-admission.d.ts.map +1 -0
- package/daemon/dist/domain/gateway/slack/inbound-admission.js.map +1 -0
- package/{dist → daemon/dist/domain/gateway}/slack/inbound.d.ts +14 -3
- package/daemon/dist/domain/gateway/slack/inbound.d.ts.map +1 -0
- package/{dist → daemon/dist/domain/gateway}/slack/inbound.js +6 -5
- package/daemon/dist/domain/gateway/slack/inbound.js.map +1 -0
- package/daemon/dist/domain/gateway/slack/message.d.ts +80 -0
- package/daemon/dist/domain/gateway/slack/message.d.ts.map +1 -0
- package/daemon/dist/domain/gateway/slack/message.js +164 -0
- package/daemon/dist/domain/gateway/slack/message.js.map +1 -0
- package/daemon/dist/domain/gateway/slack/outbound-driver.d.ts +54 -0
- package/daemon/dist/domain/gateway/slack/outbound-driver.d.ts.map +1 -0
- package/daemon/dist/domain/gateway/slack/outbound-driver.js +96 -0
- package/daemon/dist/domain/gateway/slack/outbound-driver.js.map +1 -0
- package/daemon/dist/domain/gateway/slack/queue-access.d.ts +53 -0
- package/daemon/dist/domain/gateway/slack/queue-access.d.ts.map +1 -0
- package/daemon/dist/domain/gateway/slack/queue-access.js +72 -0
- package/daemon/dist/domain/gateway/slack/queue-access.js.map +1 -0
- package/daemon/dist/domain/gateway/slack/secrets.d.ts.map +1 -0
- package/daemon/dist/domain/gateway/slack/secrets.js.map +1 -0
- package/daemon/dist/domain/gateway/slack/slack-api.d.ts +106 -0
- package/daemon/dist/domain/gateway/slack/slack-api.d.ts.map +1 -0
- package/daemon/dist/domain/gateway/slack/slack-api.js +198 -0
- package/daemon/dist/domain/gateway/slack/slack-api.js.map +1 -0
- package/daemon/dist/domain/gateway/slack/slack-delivery.d.ts +47 -0
- package/daemon/dist/domain/gateway/slack/slack-delivery.d.ts.map +1 -0
- package/daemon/dist/domain/gateway/slack/slack-delivery.js +147 -0
- package/daemon/dist/domain/gateway/slack/slack-delivery.js.map +1 -0
- package/daemon/dist/domain/gateway/slack/slack-subsystem.d.ts +21 -0
- package/daemon/dist/domain/gateway/slack/slack-subsystem.d.ts.map +1 -0
- package/daemon/dist/domain/gateway/slack/slack-subsystem.js +198 -0
- package/daemon/dist/domain/gateway/slack/slack-subsystem.js.map +1 -0
- package/daemon/dist/domain/gateway/slack/socket-inbound.d.ts +30 -0
- package/daemon/dist/domain/gateway/slack/socket-inbound.d.ts.map +1 -0
- package/daemon/dist/domain/gateway/slack/socket-inbound.js +99 -0
- package/daemon/dist/domain/gateway/slack/socket-inbound.js.map +1 -0
- package/daemon/dist/domain/gateway/slack/state-store.d.ts.map +1 -0
- package/daemon/dist/domain/gateway/slack/state-store.js.map +1 -0
- package/daemon/dist/domain/gateway/slack/thread-routing.d.ts +17 -0
- package/daemon/dist/domain/gateway/slack/thread-routing.d.ts.map +1 -0
- package/daemon/dist/domain/gateway/slack/thread-routing.js +35 -0
- package/daemon/dist/domain/gateway/slack/thread-routing.js.map +1 -0
- package/daemon/dist/domain/gateway/slack/thread-seat-map.d.ts +56 -0
- package/daemon/dist/domain/gateway/slack/thread-seat-map.d.ts.map +1 -0
- package/daemon/dist/domain/gateway/slack/thread-seat-map.js +103 -0
- package/daemon/dist/domain/gateway/slack/thread-seat-map.js.map +1 -0
- package/daemon/dist/domain/gateway/spawn-gateway.d.ts.map +1 -1
- package/daemon/dist/domain/gateway/spawn-gateway.js +9 -0
- package/daemon/dist/domain/gateway/spawn-gateway.js.map +1 -1
- package/daemon/dist/domain/gateway/transport.d.ts.map +1 -1
- package/daemon/dist/domain/gateway/transport.js +9 -0
- package/daemon/dist/domain/gateway/transport.js.map +1 -1
- package/daemon/dist/domain/node-inventory.d.ts.map +1 -1
- package/daemon/dist/domain/node-inventory.js +20 -0
- package/daemon/dist/domain/node-inventory.js.map +1 -1
- package/daemon/dist/domain/parked-query.d.ts +81 -0
- package/daemon/dist/domain/parked-query.d.ts.map +1 -0
- package/daemon/dist/domain/parked-query.js +126 -0
- package/daemon/dist/domain/parked-query.js.map +1 -0
- package/daemon/dist/domain/queue-pickup.d.ts +38 -0
- package/daemon/dist/domain/queue-pickup.d.ts.map +1 -0
- package/daemon/dist/domain/queue-pickup.js +67 -0
- package/daemon/dist/domain/queue-pickup.js.map +1 -0
- package/daemon/dist/domain/queue-repository.d.ts +38 -10
- package/daemon/dist/domain/queue-repository.d.ts.map +1 -1
- package/daemon/dist/domain/queue-repository.js +267 -35
- package/daemon/dist/domain/queue-repository.js.map +1 -1
- package/daemon/dist/domain/queue-stuck-sweep.d.ts +77 -0
- package/daemon/dist/domain/queue-stuck-sweep.d.ts.map +1 -0
- package/daemon/dist/domain/queue-stuck-sweep.js +348 -0
- package/daemon/dist/domain/queue-stuck-sweep.js.map +1 -0
- package/daemon/dist/domain/queue-wake-ladder.d.ts +96 -0
- package/daemon/dist/domain/queue-wake-ladder.d.ts.map +1 -0
- package/daemon/dist/domain/queue-wake-ladder.js +533 -0
- package/daemon/dist/domain/queue-wake-ladder.js.map +1 -0
- package/daemon/dist/domain/queue-wake-repository.d.ts +37 -0
- package/daemon/dist/domain/queue-wake-repository.d.ts.map +1 -0
- package/daemon/dist/domain/queue-wake-repository.js +80 -0
- package/daemon/dist/domain/queue-wake-repository.js.map +1 -0
- package/daemon/dist/domain/rebuild-priming-chain.d.ts +28 -0
- package/daemon/dist/domain/rebuild-priming-chain.d.ts.map +1 -0
- package/daemon/dist/domain/rebuild-priming-chain.js +71 -0
- package/daemon/dist/domain/rebuild-priming-chain.js.map +1 -0
- package/daemon/dist/domain/review/compose.d.ts +3 -1
- package/daemon/dist/domain/review/compose.d.ts.map +1 -1
- package/daemon/dist/domain/review/compose.js +14 -8
- package/daemon/dist/domain/review/compose.js.map +1 -1
- package/daemon/dist/domain/review/gather.d.ts.map +1 -1
- package/daemon/dist/domain/review/gather.js +3 -1
- package/daemon/dist/domain/review/gather.js.map +1 -1
- package/daemon/dist/domain/rigspec-instantiator.d.ts +3 -0
- package/daemon/dist/domain/rigspec-instantiator.d.ts.map +1 -1
- package/daemon/dist/domain/rigspec-instantiator.js +18 -0
- package/daemon/dist/domain/rigspec-instantiator.js.map +1 -1
- package/daemon/dist/domain/scope/plan-lock-artifacts.d.ts +6 -5
- package/daemon/dist/domain/scope/plan-lock-artifacts.d.ts.map +1 -1
- package/daemon/dist/domain/scope/plan-lock-artifacts.js +23 -20
- package/daemon/dist/domain/scope/plan-lock-artifacts.js.map +1 -1
- package/daemon/dist/domain/scope/scaffold-placeholder.d.ts +4 -5
- package/daemon/dist/domain/scope/scaffold-placeholder.d.ts.map +1 -1
- package/daemon/dist/domain/scope/scaffold-placeholder.js +6 -7
- package/daemon/dist/domain/scope/scaffold-placeholder.js.map +1 -1
- package/daemon/dist/domain/scope/scope-approve.d.ts +1 -1
- package/daemon/dist/domain/scope/scope-approve.d.ts.map +1 -1
- package/daemon/dist/domain/scope/scope-approve.js +5 -4
- package/daemon/dist/domain/scope/scope-approve.js.map +1 -1
- package/daemon/dist/domain/scope/scope-audit.d.ts +42 -3
- package/daemon/dist/domain/scope/scope-audit.d.ts.map +1 -1
- package/daemon/dist/domain/scope/scope-audit.js +78 -93
- package/daemon/dist/domain/scope/scope-audit.js.map +1 -1
- package/daemon/dist/domain/scope/scope-view-projection.d.ts.map +1 -1
- package/daemon/dist/domain/scope/scope-view-projection.js +7 -2
- package/daemon/dist/domain/scope/scope-view-projection.js.map +1 -1
- package/daemon/dist/domain/seat-activity-service.d.ts +91 -0
- package/daemon/dist/domain/seat-activity-service.d.ts.map +1 -1
- package/daemon/dist/domain/seat-activity-service.js +416 -1
- package/daemon/dist/domain/seat-activity-service.js.map +1 -1
- package/daemon/dist/domain/seat-handover-planner.d.ts +14 -0
- package/daemon/dist/domain/seat-handover-planner.d.ts.map +1 -1
- package/daemon/dist/domain/seat-handover-planner.js +14 -1
- package/daemon/dist/domain/seat-handover-planner.js.map +1 -1
- package/daemon/dist/domain/seat-handover-service.d.ts +54 -1
- package/daemon/dist/domain/seat-handover-service.d.ts.map +1 -1
- package/daemon/dist/domain/seat-handover-service.js +162 -19
- package/daemon/dist/domain/seat-handover-service.js.map +1 -1
- package/daemon/dist/domain/session-transport.js +1 -2
- package/daemon/dist/domain/session-transport.js.map +1 -1
- package/daemon/dist/domain/successor-session-launcher.d.ts +6 -1
- package/daemon/dist/domain/successor-session-launcher.d.ts.map +1 -1
- package/daemon/dist/domain/successor-session-launcher.js +3 -3
- package/daemon/dist/domain/successor-session-launcher.js.map +1 -1
- package/daemon/dist/domain/types.d.ts +33 -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 +48 -0
- package/daemon/dist/domain/user-settings/settings-store.js.map +1 -1
- package/daemon/dist/domain/view-projector.d.ts +1 -1
- package/daemon/dist/domain/view-projector.d.ts.map +1 -1
- package/daemon/dist/domain/view-projector.js +41 -2
- package/daemon/dist/domain/view-projector.js.map +1 -1
- package/daemon/dist/domain/watchdog-policy-engine.d.ts +7 -0
- package/daemon/dist/domain/watchdog-policy-engine.d.ts.map +1 -1
- package/daemon/dist/domain/watchdog-policy-engine.js +3 -0
- package/daemon/dist/domain/watchdog-policy-engine.js.map +1 -1
- package/daemon/dist/domain/workspace/default-workspace-scaffold.d.ts +4 -3
- package/daemon/dist/domain/workspace/default-workspace-scaffold.d.ts.map +1 -1
- package/daemon/dist/domain/workspace/default-workspace-scaffold.js +56 -196
- package/daemon/dist/domain/workspace/default-workspace-scaffold.js.map +1 -1
- package/daemon/dist/domain/workspace/getting-started-narrative.js +1 -1
- package/daemon/dist/domain/workspace/getting-started-narrative.js.map +1 -1
- package/daemon/dist/domain/workspace/workspace-doctor.d.ts +8 -11
- package/daemon/dist/domain/workspace/workspace-doctor.d.ts.map +1 -1
- package/daemon/dist/domain/workspace/workspace-doctor.js +23 -25
- package/daemon/dist/domain/workspace/workspace-doctor.js.map +1 -1
- package/daemon/dist/gateway-slack-surface.d.ts +4 -0
- package/daemon/dist/gateway-slack-surface.d.ts.map +1 -0
- package/daemon/dist/gateway-slack-surface.js +8 -0
- package/daemon/dist/gateway-slack-surface.js.map +1 -0
- package/daemon/dist/index.d.ts +29 -0
- package/daemon/dist/index.d.ts.map +1 -1
- package/daemon/dist/index.js +99 -4
- package/daemon/dist/index.js.map +1 -1
- package/daemon/dist/lib/pane-envelope.d.ts +1 -1
- package/daemon/dist/lib/pane-envelope.d.ts.map +1 -1
- package/daemon/dist/lib/pane-envelope.js +8 -14
- package/daemon/dist/lib/pane-envelope.js.map +1 -1
- package/daemon/dist/routes/activity.d.ts +13 -0
- package/daemon/dist/routes/activity.d.ts.map +1 -1
- package/daemon/dist/routes/activity.js +186 -0
- package/daemon/dist/routes/activity.js.map +1 -1
- package/daemon/dist/routes/config.js +2 -2
- package/daemon/dist/routes/config.js.map +1 -1
- package/daemon/dist/routes/gateway.d.ts +3 -0
- package/daemon/dist/routes/gateway.d.ts.map +1 -0
- package/daemon/dist/routes/gateway.js +46 -0
- package/daemon/dist/routes/gateway.js.map +1 -0
- package/daemon/dist/routes/health-summary.d.ts.map +1 -1
- package/daemon/dist/routes/health-summary.js +8 -0
- package/daemon/dist/routes/health-summary.js.map +1 -1
- package/daemon/dist/routes/queue.d.ts.map +1 -1
- package/daemon/dist/routes/queue.js +3 -1
- package/daemon/dist/routes/queue.js.map +1 -1
- package/daemon/dist/routes/scope-audit.d.ts.map +1 -1
- package/daemon/dist/routes/scope-audit.js +72 -13
- package/daemon/dist/routes/scope-audit.js.map +1 -1
- package/daemon/dist/routes/seat.d.ts.map +1 -1
- package/daemon/dist/routes/seat.js +15 -0
- package/daemon/dist/routes/seat.js.map +1 -1
- package/daemon/dist/server.d.ts +17 -0
- package/daemon/dist/server.d.ts.map +1 -1
- package/daemon/dist/server.js +25 -4
- package/daemon/dist/server.js.map +1 -1
- package/daemon/dist/startup.d.ts +4 -0
- package/daemon/dist/startup.d.ts.map +1 -1
- package/daemon/dist/startup.js +33 -0
- package/daemon/dist/startup.js.map +1 -1
- package/daemon/docs/reference/agent-state-taxonomy.md +106 -0
- package/daemon/docs/reference/project-workspace.md +22 -14
- package/daemon/docs/reference/refocus-channel.md +27 -14
- package/daemon/docs/reference/sdlc-conventions.md +24 -13
- package/daemon/specs/agents/shared/skills/core/agent-startup-and-context-ingestion/SKILL.md +1 -1
- package/daemon/specs/agents/shared/skills/pm/requirements-writer/SKILL.md +21 -15
- package/daemon/specs/rigs/launch/kernel/agents/advisor/lead/guidance/role.md +1 -1
- package/dist/build-info.js +3 -3
- package/dist/commands/config-init-workspace.d.ts.map +1 -1
- package/dist/commands/config-init-workspace.js +32 -57
- package/dist/commands/config-init-workspace.js.map +1 -1
- package/dist/commands/config.d.ts.map +1 -1
- package/dist/commands/config.js +5 -0
- package/dist/commands/config.js.map +1 -1
- package/dist/commands/daemon.d.ts.map +1 -1
- package/dist/commands/daemon.js +14 -4
- package/dist/commands/daemon.js.map +1 -1
- package/dist/commands/gateway.d.ts +19 -1
- package/dist/commands/gateway.d.ts.map +1 -1
- package/dist/commands/gateway.js +157 -33
- package/dist/commands/gateway.js.map +1 -1
- package/dist/commands/parked.d.ts +3 -0
- package/dist/commands/parked.d.ts.map +1 -0
- package/dist/commands/parked.js +83 -0
- package/dist/commands/parked.js.map +1 -0
- package/dist/commands/proof.d.ts +2 -1
- package/dist/commands/proof.d.ts.map +1 -1
- package/dist/commands/proof.js +8 -8
- package/dist/commands/proof.js.map +1 -1
- package/dist/commands/ps.d.ts +10 -0
- package/dist/commands/ps.d.ts.map +1 -1
- package/dist/commands/ps.js +14 -3
- package/dist/commands/ps.js.map +1 -1
- package/dist/commands/queue.d.ts.map +1 -1
- package/dist/commands/queue.js +31 -3
- package/dist/commands/queue.js.map +1 -1
- package/dist/commands/scope.d.ts.map +1 -1
- package/dist/commands/scope.js +255 -136
- package/dist/commands/scope.js.map +1 -1
- package/dist/commands/seat.d.ts.map +1 -1
- package/dist/commands/seat.js +40 -10
- package/dist/commands/seat.js.map +1 -1
- package/dist/commands/send.d.ts +1 -1
- package/dist/commands/send.d.ts.map +1 -1
- package/dist/commands/send.js +13 -14
- package/dist/commands/send.js.map +1 -1
- package/dist/commands/slack.d.ts +14 -28
- package/dist/commands/slack.d.ts.map +1 -1
- package/dist/commands/slack.js +73 -187
- package/dist/commands/slack.js.map +1 -1
- package/dist/commands/start.d.ts +3 -0
- package/dist/commands/start.d.ts.map +1 -1
- package/dist/commands/start.js +12 -5
- package/dist/commands/start.js.map +1 -1
- package/dist/commands/up.d.ts.map +1 -1
- package/dist/commands/up.js +11 -4
- package/dist/commands/up.js.map +1 -1
- package/dist/commands/view.d.ts +4 -2
- package/dist/commands/view.d.ts.map +1 -1
- package/dist/commands/view.js +1 -1
- package/dist/commands/view.js.map +1 -1
- package/dist/commands/watchdog.d.ts.map +1 -1
- package/dist/commands/watchdog.js +2 -1
- package/dist/commands/watchdog.js.map +1 -1
- package/dist/commands/workspace.js +1 -1
- package/dist/config-store.d.ts +15 -1
- package/dist/config-store.d.ts.map +1 -1
- package/dist/config-store.js +60 -0
- package/dist/config-store.js.map +1 -1
- package/dist/cross-host-target.d.ts.map +1 -1
- package/dist/cross-host-target.js +5 -4
- package/dist/cross-host-target.js.map +1 -1
- package/dist/daemon-lifecycle.d.ts +45 -3
- package/dist/daemon-lifecycle.d.ts.map +1 -1
- package/dist/daemon-lifecycle.js +126 -0
- package/dist/daemon-lifecycle.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/lib/scope/capability-delta.d.ts +9 -0
- package/dist/lib/scope/capability-delta.d.ts.map +1 -0
- package/dist/lib/scope/capability-delta.js +73 -0
- package/dist/lib/scope/capability-delta.js.map +1 -0
- package/dist/lib/scope/scaffold-placeholder.d.ts +4 -5
- package/dist/lib/scope/scaffold-placeholder.d.ts.map +1 -1
- package/dist/lib/scope/scaffold-placeholder.js +6 -7
- package/dist/lib/scope/scaffold-placeholder.js.map +1 -1
- package/dist/lib/scope/scope-audit.d.ts +42 -3
- package/dist/lib/scope/scope-audit.d.ts.map +1 -1
- package/dist/lib/scope/scope-audit.js +78 -93
- package/dist/lib/scope/scope-audit.js.map +1 -1
- package/dist/lib/scope/scope-fs.d.ts +18 -14
- package/dist/lib/scope/scope-fs.d.ts.map +1 -1
- package/dist/lib/scope/scope-fs.js +60 -29
- package/dist/lib/scope/scope-fs.js.map +1 -1
- package/dist/lib/scope/templates.d.ts +17 -17
- package/dist/lib/scope/templates.d.ts.map +1 -1
- package/dist/lib/scope/templates.js +35 -39
- package/dist/lib/scope/templates.js.map +1 -1
- package/dist/lib/scope-templates/backlog-deprecation.md +3 -1
- package/dist/lib/scope-templates/backlog-tech-debt.md +3 -1
- package/dist/lib/scope-templates/bug-fix.md +3 -1
- package/dist/lib/scope-templates/capability-delta.md +60 -0
- package/dist/lib/scope-templates/mission-placeholder.md +9 -40
- package/dist/lib/scope-templates/mission-progress.md +5 -6
- package/dist/lib/scope-templates/mission-release.md +9 -40
- package/dist/lib/scope-templates/notes.md +14 -0
- package/dist/lib/scope-templates/placeholder.md +3 -1
- package/dist/lib/scope-templates/proof.md +1 -1
- package/dist/lib/scope-templates/release-feature.md +3 -1
- package/dist/lib/scope-templates/research.md +3 -1
- package/dist/lib/scope-templates/slice-progress.md +4 -5
- package/node_modules/@openrig/daemon/dist/adapters/claude-code-adapter.d.ts +15 -0
- package/node_modules/@openrig/daemon/dist/adapters/claude-code-adapter.d.ts.map +1 -1
- package/node_modules/@openrig/daemon/dist/adapters/claude-code-adapter.js +57 -0
- package/node_modules/@openrig/daemon/dist/adapters/claude-code-adapter.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/build-info.js +3 -3
- package/node_modules/@openrig/daemon/dist/db/all-migrations.d.ts.map +1 -1
- package/node_modules/@openrig/daemon/dist/db/all-migrations.js +4 -0
- package/node_modules/@openrig/daemon/dist/db/all-migrations.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/db/migrations/072_thread_seat_map.d.ts +3 -0
- package/node_modules/@openrig/daemon/dist/db/migrations/072_thread_seat_map.d.ts.map +1 -0
- package/node_modules/@openrig/daemon/dist/db/migrations/072_thread_seat_map.js +22 -0
- package/node_modules/@openrig/daemon/dist/db/migrations/072_thread_seat_map.js.map +1 -0
- package/node_modules/@openrig/daemon/dist/db/migrations/073_queue_transition_wakes.d.ts +3 -0
- package/node_modules/@openrig/daemon/dist/db/migrations/073_queue_transition_wakes.d.ts.map +1 -0
- package/node_modules/@openrig/daemon/dist/db/migrations/073_queue_transition_wakes.js +21 -0
- package/node_modules/@openrig/daemon/dist/db/migrations/073_queue_transition_wakes.js.map +1 -0
- package/node_modules/@openrig/daemon/dist/domain/activity-taxonomy.d.ts +112 -0
- package/node_modules/@openrig/daemon/dist/domain/activity-taxonomy.d.ts.map +1 -0
- package/node_modules/@openrig/daemon/dist/domain/activity-taxonomy.js +99 -0
- package/node_modules/@openrig/daemon/dist/domain/activity-taxonomy.js.map +1 -0
- package/node_modules/@openrig/daemon/dist/domain/bind-plan.d.ts +19 -0
- package/node_modules/@openrig/daemon/dist/domain/bind-plan.d.ts.map +1 -0
- package/node_modules/@openrig/daemon/dist/domain/bind-plan.js +25 -0
- package/node_modules/@openrig/daemon/dist/domain/bind-plan.js.map +1 -0
- package/node_modules/@openrig/daemon/dist/domain/event-bus.d.ts +6 -0
- package/node_modules/@openrig/daemon/dist/domain/event-bus.d.ts.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/event-bus.js +15 -5
- package/node_modules/@openrig/daemon/dist/domain/event-bus.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/gateway/gateway-process-main.d.ts.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/gateway/gateway-process-main.js +9 -0
- package/node_modules/@openrig/daemon/dist/domain/gateway/gateway-process-main.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/gateway/gateway-process.d.ts.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/gateway/gateway-process.js +9 -0
- package/node_modules/@openrig/daemon/dist/domain/gateway/gateway-process.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/gateway/gateway-subsystem.d.ts +80 -0
- package/node_modules/@openrig/daemon/dist/domain/gateway/gateway-subsystem.d.ts.map +1 -0
- package/node_modules/@openrig/daemon/dist/domain/gateway/gateway-subsystem.js +149 -0
- package/node_modules/@openrig/daemon/dist/domain/gateway/gateway-subsystem.js.map +1 -0
- package/node_modules/@openrig/daemon/dist/domain/gateway/human-registry.d.ts +109 -0
- package/node_modules/@openrig/daemon/dist/domain/gateway/human-registry.d.ts.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/gateway/human-registry.js +250 -0
- package/node_modules/@openrig/daemon/dist/domain/gateway/human-registry.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/gateway/slack/config.d.ts +44 -0
- package/node_modules/@openrig/daemon/dist/domain/gateway/slack/config.d.ts.map +1 -0
- package/node_modules/@openrig/daemon/dist/domain/gateway/slack/config.js +62 -0
- package/node_modules/@openrig/daemon/dist/domain/gateway/slack/config.js.map +1 -0
- package/node_modules/@openrig/daemon/dist/domain/gateway/slack/inbound-admission.d.ts +8 -0
- package/node_modules/@openrig/daemon/dist/domain/gateway/slack/inbound-admission.d.ts.map +1 -0
- package/node_modules/@openrig/daemon/dist/domain/gateway/slack/inbound-admission.js +20 -0
- package/node_modules/@openrig/daemon/dist/domain/gateway/slack/inbound-admission.js.map +1 -0
- package/node_modules/@openrig/daemon/dist/domain/gateway/slack/inbound.d.ts +113 -0
- package/node_modules/@openrig/daemon/dist/domain/gateway/slack/inbound.d.ts.map +1 -0
- package/node_modules/@openrig/daemon/dist/domain/gateway/slack/inbound.js +146 -0
- package/node_modules/@openrig/daemon/dist/domain/gateway/slack/inbound.js.map +1 -0
- package/node_modules/@openrig/daemon/dist/domain/gateway/slack/message.d.ts +80 -0
- package/node_modules/@openrig/daemon/dist/domain/gateway/slack/message.d.ts.map +1 -0
- package/node_modules/@openrig/daemon/dist/domain/gateway/slack/message.js +164 -0
- package/node_modules/@openrig/daemon/dist/domain/gateway/slack/message.js.map +1 -0
- package/node_modules/@openrig/daemon/dist/domain/gateway/slack/outbound-driver.d.ts +54 -0
- package/node_modules/@openrig/daemon/dist/domain/gateway/slack/outbound-driver.d.ts.map +1 -0
- package/node_modules/@openrig/daemon/dist/domain/gateway/slack/outbound-driver.js +96 -0
- package/node_modules/@openrig/daemon/dist/domain/gateway/slack/outbound-driver.js.map +1 -0
- package/node_modules/@openrig/daemon/dist/domain/gateway/slack/queue-access.d.ts +53 -0
- package/node_modules/@openrig/daemon/dist/domain/gateway/slack/queue-access.d.ts.map +1 -0
- package/node_modules/@openrig/daemon/dist/domain/gateway/slack/queue-access.js +72 -0
- package/node_modules/@openrig/daemon/dist/domain/gateway/slack/queue-access.js.map +1 -0
- package/node_modules/@openrig/daemon/dist/domain/gateway/slack/secrets.d.ts +21 -0
- package/node_modules/@openrig/daemon/dist/domain/gateway/slack/secrets.d.ts.map +1 -0
- package/node_modules/@openrig/daemon/dist/domain/gateway/slack/secrets.js +73 -0
- package/node_modules/@openrig/daemon/dist/domain/gateway/slack/secrets.js.map +1 -0
- package/node_modules/@openrig/daemon/dist/domain/gateway/slack/slack-api.d.ts +106 -0
- package/node_modules/@openrig/daemon/dist/domain/gateway/slack/slack-api.d.ts.map +1 -0
- package/node_modules/@openrig/daemon/dist/domain/gateway/slack/slack-api.js +198 -0
- package/node_modules/@openrig/daemon/dist/domain/gateway/slack/slack-api.js.map +1 -0
- package/node_modules/@openrig/daemon/dist/domain/gateway/slack/slack-delivery.d.ts +47 -0
- package/node_modules/@openrig/daemon/dist/domain/gateway/slack/slack-delivery.d.ts.map +1 -0
- package/node_modules/@openrig/daemon/dist/domain/gateway/slack/slack-delivery.js +147 -0
- package/node_modules/@openrig/daemon/dist/domain/gateway/slack/slack-delivery.js.map +1 -0
- package/node_modules/@openrig/daemon/dist/domain/gateway/slack/slack-subsystem.d.ts +21 -0
- package/node_modules/@openrig/daemon/dist/domain/gateway/slack/slack-subsystem.d.ts.map +1 -0
- package/node_modules/@openrig/daemon/dist/domain/gateway/slack/slack-subsystem.js +198 -0
- package/node_modules/@openrig/daemon/dist/domain/gateway/slack/slack-subsystem.js.map +1 -0
- package/node_modules/@openrig/daemon/dist/domain/gateway/slack/socket-inbound.d.ts +30 -0
- package/node_modules/@openrig/daemon/dist/domain/gateway/slack/socket-inbound.d.ts.map +1 -0
- package/node_modules/@openrig/daemon/dist/domain/gateway/slack/socket-inbound.js +99 -0
- package/node_modules/@openrig/daemon/dist/domain/gateway/slack/socket-inbound.js.map +1 -0
- package/node_modules/@openrig/daemon/dist/domain/gateway/slack/state-store.d.ts +62 -0
- package/node_modules/@openrig/daemon/dist/domain/gateway/slack/state-store.d.ts.map +1 -0
- package/node_modules/@openrig/daemon/dist/domain/gateway/slack/state-store.js +132 -0
- package/node_modules/@openrig/daemon/dist/domain/gateway/slack/state-store.js.map +1 -0
- package/node_modules/@openrig/daemon/dist/domain/gateway/slack/thread-routing.d.ts +17 -0
- package/node_modules/@openrig/daemon/dist/domain/gateway/slack/thread-routing.d.ts.map +1 -0
- package/node_modules/@openrig/daemon/dist/domain/gateway/slack/thread-routing.js +35 -0
- package/node_modules/@openrig/daemon/dist/domain/gateway/slack/thread-routing.js.map +1 -0
- package/node_modules/@openrig/daemon/dist/domain/gateway/slack/thread-seat-map.d.ts +56 -0
- package/node_modules/@openrig/daemon/dist/domain/gateway/slack/thread-seat-map.d.ts.map +1 -0
- package/node_modules/@openrig/daemon/dist/domain/gateway/slack/thread-seat-map.js +103 -0
- package/node_modules/@openrig/daemon/dist/domain/gateway/slack/thread-seat-map.js.map +1 -0
- package/node_modules/@openrig/daemon/dist/domain/gateway/spawn-gateway.d.ts.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/gateway/spawn-gateway.js +9 -0
- package/node_modules/@openrig/daemon/dist/domain/gateway/spawn-gateway.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/gateway/transport.d.ts.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/gateway/transport.js +9 -0
- package/node_modules/@openrig/daemon/dist/domain/gateway/transport.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/node-inventory.d.ts.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/node-inventory.js +20 -0
- package/node_modules/@openrig/daemon/dist/domain/node-inventory.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/parked-query.d.ts +81 -0
- package/node_modules/@openrig/daemon/dist/domain/parked-query.d.ts.map +1 -0
- package/node_modules/@openrig/daemon/dist/domain/parked-query.js +126 -0
- package/node_modules/@openrig/daemon/dist/domain/parked-query.js.map +1 -0
- package/node_modules/@openrig/daemon/dist/domain/queue-pickup.d.ts +38 -0
- package/node_modules/@openrig/daemon/dist/domain/queue-pickup.d.ts.map +1 -0
- package/node_modules/@openrig/daemon/dist/domain/queue-pickup.js +67 -0
- package/node_modules/@openrig/daemon/dist/domain/queue-pickup.js.map +1 -0
- package/node_modules/@openrig/daemon/dist/domain/queue-repository.d.ts +38 -10
- package/node_modules/@openrig/daemon/dist/domain/queue-repository.d.ts.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/queue-repository.js +267 -35
- package/node_modules/@openrig/daemon/dist/domain/queue-repository.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/queue-stuck-sweep.d.ts +77 -0
- package/node_modules/@openrig/daemon/dist/domain/queue-stuck-sweep.d.ts.map +1 -0
- package/node_modules/@openrig/daemon/dist/domain/queue-stuck-sweep.js +348 -0
- package/node_modules/@openrig/daemon/dist/domain/queue-stuck-sweep.js.map +1 -0
- package/node_modules/@openrig/daemon/dist/domain/queue-wake-ladder.d.ts +96 -0
- package/node_modules/@openrig/daemon/dist/domain/queue-wake-ladder.d.ts.map +1 -0
- package/node_modules/@openrig/daemon/dist/domain/queue-wake-ladder.js +533 -0
- package/node_modules/@openrig/daemon/dist/domain/queue-wake-ladder.js.map +1 -0
- package/node_modules/@openrig/daemon/dist/domain/queue-wake-repository.d.ts +37 -0
- package/node_modules/@openrig/daemon/dist/domain/queue-wake-repository.d.ts.map +1 -0
- package/node_modules/@openrig/daemon/dist/domain/queue-wake-repository.js +80 -0
- package/node_modules/@openrig/daemon/dist/domain/queue-wake-repository.js.map +1 -0
- package/node_modules/@openrig/daemon/dist/domain/rebuild-priming-chain.d.ts +28 -0
- package/node_modules/@openrig/daemon/dist/domain/rebuild-priming-chain.d.ts.map +1 -0
- package/node_modules/@openrig/daemon/dist/domain/rebuild-priming-chain.js +71 -0
- package/node_modules/@openrig/daemon/dist/domain/rebuild-priming-chain.js.map +1 -0
- package/node_modules/@openrig/daemon/dist/domain/review/compose.d.ts +3 -1
- package/node_modules/@openrig/daemon/dist/domain/review/compose.d.ts.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/review/compose.js +14 -8
- package/node_modules/@openrig/daemon/dist/domain/review/compose.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/review/gather.d.ts.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/review/gather.js +3 -1
- package/node_modules/@openrig/daemon/dist/domain/review/gather.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/rigspec-instantiator.d.ts +3 -0
- package/node_modules/@openrig/daemon/dist/domain/rigspec-instantiator.d.ts.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/rigspec-instantiator.js +18 -0
- package/node_modules/@openrig/daemon/dist/domain/rigspec-instantiator.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/scope/plan-lock-artifacts.d.ts +6 -5
- package/node_modules/@openrig/daemon/dist/domain/scope/plan-lock-artifacts.d.ts.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/scope/plan-lock-artifacts.js +23 -20
- package/node_modules/@openrig/daemon/dist/domain/scope/plan-lock-artifacts.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/scope/scaffold-placeholder.d.ts +4 -5
- package/node_modules/@openrig/daemon/dist/domain/scope/scaffold-placeholder.d.ts.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/scope/scaffold-placeholder.js +6 -7
- package/node_modules/@openrig/daemon/dist/domain/scope/scaffold-placeholder.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/scope/scope-approve.d.ts +1 -1
- package/node_modules/@openrig/daemon/dist/domain/scope/scope-approve.d.ts.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/scope/scope-approve.js +5 -4
- package/node_modules/@openrig/daemon/dist/domain/scope/scope-approve.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/scope/scope-audit.d.ts +42 -3
- package/node_modules/@openrig/daemon/dist/domain/scope/scope-audit.d.ts.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/scope/scope-audit.js +78 -93
- package/node_modules/@openrig/daemon/dist/domain/scope/scope-audit.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/scope/scope-view-projection.d.ts.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/scope/scope-view-projection.js +7 -2
- package/node_modules/@openrig/daemon/dist/domain/scope/scope-view-projection.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/seat-activity-service.d.ts +91 -0
- package/node_modules/@openrig/daemon/dist/domain/seat-activity-service.d.ts.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/seat-activity-service.js +416 -1
- package/node_modules/@openrig/daemon/dist/domain/seat-activity-service.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/seat-handover-planner.d.ts +14 -0
- package/node_modules/@openrig/daemon/dist/domain/seat-handover-planner.d.ts.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/seat-handover-planner.js +14 -1
- package/node_modules/@openrig/daemon/dist/domain/seat-handover-planner.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/seat-handover-service.d.ts +54 -1
- package/node_modules/@openrig/daemon/dist/domain/seat-handover-service.d.ts.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/seat-handover-service.js +162 -19
- package/node_modules/@openrig/daemon/dist/domain/seat-handover-service.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/session-transport.js +1 -2
- package/node_modules/@openrig/daemon/dist/domain/session-transport.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/successor-session-launcher.d.ts +6 -1
- package/node_modules/@openrig/daemon/dist/domain/successor-session-launcher.d.ts.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/successor-session-launcher.js +3 -3
- package/node_modules/@openrig/daemon/dist/domain/successor-session-launcher.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/types.d.ts +33 -0
- package/node_modules/@openrig/daemon/dist/domain/types.d.ts.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/types.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/user-settings/settings-store.d.ts +1 -1
- package/node_modules/@openrig/daemon/dist/domain/user-settings/settings-store.d.ts.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/user-settings/settings-store.js +48 -0
- package/node_modules/@openrig/daemon/dist/domain/user-settings/settings-store.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/view-projector.d.ts +1 -1
- package/node_modules/@openrig/daemon/dist/domain/view-projector.d.ts.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/view-projector.js +41 -2
- package/node_modules/@openrig/daemon/dist/domain/view-projector.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/watchdog-policy-engine.d.ts +7 -0
- package/node_modules/@openrig/daemon/dist/domain/watchdog-policy-engine.d.ts.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/watchdog-policy-engine.js +3 -0
- package/node_modules/@openrig/daemon/dist/domain/watchdog-policy-engine.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/workspace/default-workspace-scaffold.d.ts +4 -3
- package/node_modules/@openrig/daemon/dist/domain/workspace/default-workspace-scaffold.d.ts.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/workspace/default-workspace-scaffold.js +56 -196
- package/node_modules/@openrig/daemon/dist/domain/workspace/default-workspace-scaffold.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/workspace/getting-started-narrative.js +1 -1
- package/node_modules/@openrig/daemon/dist/domain/workspace/getting-started-narrative.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/workspace/workspace-doctor.d.ts +8 -11
- package/node_modules/@openrig/daemon/dist/domain/workspace/workspace-doctor.d.ts.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/workspace/workspace-doctor.js +23 -25
- package/node_modules/@openrig/daemon/dist/domain/workspace/workspace-doctor.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/gateway-slack-surface.d.ts +4 -0
- package/node_modules/@openrig/daemon/dist/gateway-slack-surface.d.ts.map +1 -0
- package/node_modules/@openrig/daemon/dist/gateway-slack-surface.js +8 -0
- package/node_modules/@openrig/daemon/dist/gateway-slack-surface.js.map +1 -0
- package/node_modules/@openrig/daemon/dist/index.d.ts +29 -0
- package/node_modules/@openrig/daemon/dist/index.d.ts.map +1 -1
- package/node_modules/@openrig/daemon/dist/index.js +99 -4
- package/node_modules/@openrig/daemon/dist/index.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/lib/pane-envelope.d.ts +1 -1
- package/node_modules/@openrig/daemon/dist/lib/pane-envelope.d.ts.map +1 -1
- package/node_modules/@openrig/daemon/dist/lib/pane-envelope.js +8 -14
- package/node_modules/@openrig/daemon/dist/lib/pane-envelope.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/routes/activity.d.ts +13 -0
- package/node_modules/@openrig/daemon/dist/routes/activity.d.ts.map +1 -1
- package/node_modules/@openrig/daemon/dist/routes/activity.js +186 -0
- package/node_modules/@openrig/daemon/dist/routes/activity.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/routes/config.js +2 -2
- package/node_modules/@openrig/daemon/dist/routes/config.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/routes/gateway.d.ts +3 -0
- package/node_modules/@openrig/daemon/dist/routes/gateway.d.ts.map +1 -0
- package/node_modules/@openrig/daemon/dist/routes/gateway.js +46 -0
- package/node_modules/@openrig/daemon/dist/routes/gateway.js.map +1 -0
- package/node_modules/@openrig/daemon/dist/routes/health-summary.d.ts.map +1 -1
- package/node_modules/@openrig/daemon/dist/routes/health-summary.js +8 -0
- package/node_modules/@openrig/daemon/dist/routes/health-summary.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/routes/queue.d.ts.map +1 -1
- package/node_modules/@openrig/daemon/dist/routes/queue.js +3 -1
- package/node_modules/@openrig/daemon/dist/routes/queue.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/routes/scope-audit.d.ts.map +1 -1
- package/node_modules/@openrig/daemon/dist/routes/scope-audit.js +72 -13
- package/node_modules/@openrig/daemon/dist/routes/scope-audit.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/routes/seat.d.ts.map +1 -1
- package/node_modules/@openrig/daemon/dist/routes/seat.js +15 -0
- package/node_modules/@openrig/daemon/dist/routes/seat.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/server.d.ts +17 -0
- package/node_modules/@openrig/daemon/dist/server.d.ts.map +1 -1
- package/node_modules/@openrig/daemon/dist/server.js +25 -4
- package/node_modules/@openrig/daemon/dist/server.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/startup.d.ts +4 -0
- package/node_modules/@openrig/daemon/dist/startup.d.ts.map +1 -1
- package/node_modules/@openrig/daemon/dist/startup.js +33 -0
- package/node_modules/@openrig/daemon/dist/startup.js.map +1 -1
- package/node_modules/@openrig/daemon/package.json +5 -1
- package/package.json +1 -1
- package/tui/dist/daemon-client.d.ts +5 -0
- package/tui/dist/daemon-client.d.ts.map +1 -1
- package/tui/dist/daemon-client.js +17 -0
- package/tui/dist/daemon-client.js.map +1 -1
- package/tui/dist/hydrate.d.ts.map +1 -1
- package/tui/dist/hydrate.js +12 -4
- package/tui/dist/hydrate.js.map +1 -1
- package/tui/dist/live-events.d.ts +21 -0
- package/tui/dist/live-events.d.ts.map +1 -0
- package/tui/dist/live-events.js +88 -0
- package/tui/dist/live-events.js.map +1 -0
- package/tui/dist/live.js +1 -1
- package/tui/dist/main.js +27 -8
- package/tui/dist/main.js.map +1 -1
- package/tui/dist/refresh.d.ts +10 -1
- package/tui/dist/refresh.d.ts.map +1 -1
- package/tui/dist/refresh.js +22 -2
- package/tui/dist/refresh.js.map +1 -1
- package/daemon/context-packs/world/install/01-world-from-primitives.md +0 -97
- package/daemon/context-packs/world/install/02-permission-self-sleep.md +0 -141
- package/daemon/context-packs/world/install/03-what-this-is-for.md +0 -86
- package/daemon/context-packs/world/install/04-ontology.md +0 -790
- package/daemon/context-packs/world/install/05-harness-power-use.md +0 -355
- package/daemon/context-packs/world/install/06-a-competent-turn.md +0 -225
- package/daemon/context-packs/world/install/manifest.yaml +0 -125
- package/dist/lib/scope-templates/mission-brief.md +0 -20
- package/dist/lib/scope-templates/mission-notes.md +0 -102
- package/dist/slack/config.d.ts.map +0 -1
- package/dist/slack/config.js.map +0 -1
- package/dist/slack/connector-server.d.ts +0 -31
- package/dist/slack/connector-server.d.ts.map +0 -1
- package/dist/slack/connector-server.js +0 -108
- package/dist/slack/connector-server.js.map +0 -1
- package/dist/slack/inbound-admission.d.ts.map +0 -1
- package/dist/slack/inbound-admission.js.map +0 -1
- package/dist/slack/inbound.d.ts.map +0 -1
- package/dist/slack/inbound.js.map +0 -1
- package/dist/slack/message.d.ts +0 -39
- package/dist/slack/message.d.ts.map +0 -1
- package/dist/slack/message.js +0 -88
- package/dist/slack/message.js.map +0 -1
- package/dist/slack/outbound.d.ts +0 -39
- package/dist/slack/outbound.d.ts.map +0 -1
- package/dist/slack/outbound.js +0 -63
- package/dist/slack/outbound.js.map +0 -1
- package/dist/slack/queue-bridge.d.ts +0 -61
- package/dist/slack/queue-bridge.d.ts.map +0 -1
- package/dist/slack/queue-bridge.js +0 -114
- package/dist/slack/queue-bridge.js.map +0 -1
- package/dist/slack/secrets.d.ts.map +0 -1
- package/dist/slack/secrets.js.map +0 -1
- package/dist/slack/slack-api.d.ts +0 -49
- package/dist/slack/slack-api.d.ts.map +0 -1
- package/dist/slack/slack-api.js +0 -110
- package/dist/slack/slack-api.js.map +0 -1
- package/dist/slack/slack-delivery.d.ts +0 -14
- package/dist/slack/slack-delivery.d.ts.map +0 -1
- package/dist/slack/slack-delivery.js +0 -28
- package/dist/slack/slack-delivery.js.map +0 -1
- package/dist/slack/state-store.d.ts.map +0 -1
- package/dist/slack/state-store.js.map +0 -1
- /package/{dist → daemon/dist/domain/gateway}/slack/inbound-admission.js +0 -0
- /package/{dist → daemon/dist/domain/gateway}/slack/secrets.d.ts +0 -0
- /package/{dist → daemon/dist/domain/gateway}/slack/secrets.js +0 -0
- /package/{dist → daemon/dist/domain/gateway}/slack/state-store.d.ts +0 -0
- /package/{dist → daemon/dist/domain/gateway}/slack/state-store.js +0 -0
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { GatewayDispatcher, type DispatchResult } from "./dispatcher.js";
|
|
2
|
+
import type { OutboundDecision } from "./protocol.js";
|
|
3
|
+
/** The in-process delivery outcome (mirrors the retired connector's DeliveryOutcome shape so
|
|
4
|
+
* the slice-11 delivery semantics carry over verbatim at cutover). */
|
|
5
|
+
export type SubsystemDeliveryOutcome = {
|
|
6
|
+
ok: true;
|
|
7
|
+
} | {
|
|
8
|
+
ok: false;
|
|
9
|
+
class: string;
|
|
10
|
+
detail?: string;
|
|
11
|
+
};
|
|
12
|
+
export type SubsystemDeliverFn = (decision: OutboundDecision) => Promise<SubsystemDeliveryOutcome>;
|
|
13
|
+
/** What a wiring step yields: the live dispatcher, its teardown, and (optionally) the
|
|
14
|
+
* NETWORK-TOUCHING services (replay, outbound poll, socket inbound). Services start only via
|
|
15
|
+
* startServices() — invoked POST-BIND from index.ts (the contextMonitor pattern), so a
|
|
16
|
+
* test-built daemon (createDaemon without serve) composes the wire but never dials out. */
|
|
17
|
+
export interface GatewayWire {
|
|
18
|
+
dispatcher: GatewayDispatcher;
|
|
19
|
+
stop(): void;
|
|
20
|
+
startServices?(): void;
|
|
21
|
+
}
|
|
22
|
+
export interface InProcessWireOpts {
|
|
23
|
+
home: string;
|
|
24
|
+
/** The platform delivery seam. Until the relay cutover wires Slack, startup passes an
|
|
25
|
+
* honest unwired refusal — dispatches are retained durably, never silently dropped. */
|
|
26
|
+
deliver: SubsystemDeliverFn;
|
|
27
|
+
/** Ops the delivery layer advertises. The shipped proof-9 rail holds in-process: an
|
|
28
|
+
* unadvertised op is refused, never attempted. Empty = nothing dispatchable yet. */
|
|
29
|
+
ops?: string[];
|
|
30
|
+
connectorId?: string;
|
|
31
|
+
platform?: string;
|
|
32
|
+
log?: (msg: string) => void;
|
|
33
|
+
}
|
|
34
|
+
/** Compose the SHIPPED dispatcher + durable buffer in-process. The capability handshake
|
|
35
|
+
* becomes a local declaration by the delivery layer (same closed contract, no socket);
|
|
36
|
+
* ack-after-delivery becomes deliver() resolving ok. replayPending() at build time is the
|
|
37
|
+
* restart no-loss leg: un-Acked decisions from a prior run re-enter delivery. */
|
|
38
|
+
export declare function buildInProcessWire(opts: InProcessWireOpts): GatewayWire;
|
|
39
|
+
export type GatewaySubsystemState = "inactive" | "active" | "failed" | "stopped";
|
|
40
|
+
export interface GatewaySubsystemStatus {
|
|
41
|
+
state: GatewaySubsystemState;
|
|
42
|
+
/** Present iff state=failed: the named cause (honest failure, never a silent dead gateway). */
|
|
43
|
+
reason?: string;
|
|
44
|
+
activatedAt?: string;
|
|
45
|
+
/** Durable un-delivered decisions awaiting delivery/replay (undefined until first start). */
|
|
46
|
+
pendingDispatches?: number;
|
|
47
|
+
}
|
|
48
|
+
export interface GatewaySubsystemDeps {
|
|
49
|
+
home: string;
|
|
50
|
+
/** The wiring step. Production: () => buildInProcessWire({...}). Injectable so tests can
|
|
51
|
+
* induce a wiring failure and pin the honest-failure contract. */
|
|
52
|
+
wire: () => GatewayWire;
|
|
53
|
+
log?: (msg: string) => void;
|
|
54
|
+
now?: () => Date;
|
|
55
|
+
}
|
|
56
|
+
export declare class GatewaySubsystem {
|
|
57
|
+
private readonly deps;
|
|
58
|
+
private state;
|
|
59
|
+
private reason;
|
|
60
|
+
private activatedAt;
|
|
61
|
+
private wireHandle;
|
|
62
|
+
private servicesStarted;
|
|
63
|
+
constructor(deps: GatewaySubsystemDeps);
|
|
64
|
+
/** Activate in-process. NEVER throws: a wiring failure records state=failed with the cause
|
|
65
|
+
* and returns — daemon boot proceeds and the health surface tells the truth. */
|
|
66
|
+
start(): void;
|
|
67
|
+
/** Start the wire's network services (replay, pollers, sockets). Post-bind only — the
|
|
68
|
+
* index.ts supervision tree calls this beside contextMonitor.start(); test-built daemons
|
|
69
|
+
* never do, so composing a daemon never dials out. Idempotence is the wire's concern. */
|
|
70
|
+
startServices(): void;
|
|
71
|
+
/** Dispatch through the live wire (refused honestly when not active). */
|
|
72
|
+
dispatch(op: string, entityBindingRef: string, payload: unknown): DispatchResult;
|
|
73
|
+
status(): GatewaySubsystemStatus;
|
|
74
|
+
/** Recovery half of recovers-or-reports: tear down and re-run the wiring. If services were
|
|
75
|
+
* live (post-bind), the rebuilt wire's services start too — a config flip (enable/disable)
|
|
76
|
+
* lands without a daemon restart. */
|
|
77
|
+
restart(): void;
|
|
78
|
+
stop(): void;
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=gateway-subsystem.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gateway-subsystem.d.ts","sourceRoot":"","sources":["../../../src/domain/gateway/gateway-subsystem.ts"],"names":[],"mappings":"AAiBA,OAAO,EAAE,iBAAiB,EAAE,KAAK,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACzE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAEtD;uEACuE;AACvE,MAAM,MAAM,wBAAwB,GAAG;IAAE,EAAE,EAAE,IAAI,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AACpG,MAAM,MAAM,kBAAkB,GAAG,CAAC,QAAQ,EAAE,gBAAgB,KAAK,OAAO,CAAC,wBAAwB,CAAC,CAAC;AAEnG;;;4FAG4F;AAC5F,MAAM,WAAW,WAAW;IAC1B,UAAU,EAAE,iBAAiB,CAAC;IAC9B,IAAI,IAAI,IAAI,CAAC;IACb,aAAa,CAAC,IAAI,IAAI,CAAC;CACxB;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb;4FACwF;IACxF,OAAO,EAAE,kBAAkB,CAAC;IAC5B;yFACqF;IACrF,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;CAC7B;AAED;;;kFAGkF;AAClF,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,iBAAiB,GAAG,WAAW,CAkCvE;AAED,MAAM,MAAM,qBAAqB,GAAG,UAAU,GAAG,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAC;AAEjF,MAAM,WAAW,sBAAsB;IACrC,KAAK,EAAE,qBAAqB,CAAC;IAC7B,+FAA+F;IAC/F,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,6FAA6F;IAC7F,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb;uEACmE;IACnE,IAAI,EAAE,MAAM,WAAW,CAAC;IACxB,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5B,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;CAClB;AAED,qBAAa,gBAAgB;IAOf,OAAO,CAAC,QAAQ,CAAC,IAAI;IANjC,OAAO,CAAC,KAAK,CAAqC;IAClD,OAAO,CAAC,MAAM,CAAqB;IACnC,OAAO,CAAC,WAAW,CAAqB;IACxC,OAAO,CAAC,UAAU,CAA0B;IAC5C,OAAO,CAAC,eAAe,CAAS;gBAEH,IAAI,EAAE,oBAAoB;IAEvD;qFACiF;IACjF,KAAK,IAAI,IAAI;IAgBb;;8FAE0F;IAC1F,aAAa,IAAI,IAAI;IAarB,yEAAyE;IACzE,QAAQ,CAAC,EAAE,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,cAAc;IAOhF,MAAM,IAAI,sBAAsB;IAYhC;;0CAEsC;IACtC,OAAO,IAAI,IAAI;IAQf,IAAI,IAAI,IAAI;CAOb"}
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
// S10 (OPR.0.5.5.10) — the gateway as an IN-DAEMON SUBSYSTEM. M1 §3 as amended 2026-08-26
|
|
2
|
+
// (desk head-amendment under founder R2): the gateway runs in-process at daemon boot — the
|
|
3
|
+
// shipped components (GatewayDispatcher + DispatchBuffer) reused verbatim, NO child process,
|
|
4
|
+
// NO gateway↔connector socket wire. spawn-gateway.ts / gateway-process*.ts / transport.ts are
|
|
5
|
+
// the retired process-split shape and must not gain callers (second-deployable ABSENCE is a
|
|
6
|
+
// proof-contract red).
|
|
7
|
+
//
|
|
8
|
+
// Durability is the shipped contract, unchanged by the re-homing: a decision is persisted to
|
|
9
|
+
// the durable buffer BEFORE delivery is attempted (dispatcher enqueues first), drained ONLY
|
|
10
|
+
// after the delivery layer reports success (the in-process ack), and un-Acked decisions replay
|
|
11
|
+
// on every subsystem (re)start — a delivery failure is retained, never dropped.
|
|
12
|
+
//
|
|
13
|
+
// Failure honesty (mini-req 1): a wiring failure at start() surfaces as state=failed with the
|
|
14
|
+
// cause named, visible on the health surface — it never throws into daemon boot (a broken
|
|
15
|
+
// gateway must not take the daemon down) and never reads as silently active.
|
|
16
|
+
import { DispatchBuffer } from "./dispatch-buffer.js";
|
|
17
|
+
import { GatewayDispatcher } from "./dispatcher.js";
|
|
18
|
+
/** Compose the SHIPPED dispatcher + durable buffer in-process. The capability handshake
|
|
19
|
+
* becomes a local declaration by the delivery layer (same closed contract, no socket);
|
|
20
|
+
* ack-after-delivery becomes deliver() resolving ok. replayPending() at build time is the
|
|
21
|
+
* restart no-loss leg: un-Acked decisions from a prior run re-enter delivery. */
|
|
22
|
+
export function buildInProcessWire(opts) {
|
|
23
|
+
const log = opts.log ?? (() => { });
|
|
24
|
+
const buffer = new DispatchBuffer(opts.home);
|
|
25
|
+
const deliverAndAck = async (decision) => {
|
|
26
|
+
let outcome;
|
|
27
|
+
try {
|
|
28
|
+
outcome = await opts.deliver(decision);
|
|
29
|
+
}
|
|
30
|
+
catch (e) {
|
|
31
|
+
outcome = { ok: false, class: "delivery-threw", detail: e.message };
|
|
32
|
+
}
|
|
33
|
+
if (outcome.ok) {
|
|
34
|
+
dispatcher.onAck(decision.decisionId); // drain only after delivered
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
log(`delivery failed ${decision.decisionId} (${outcome.class}${outcome.detail ? ": " + outcome.detail : ""}) — retained for replay`);
|
|
38
|
+
}
|
|
39
|
+
};
|
|
40
|
+
const dispatcher = new GatewayDispatcher({
|
|
41
|
+
buffer,
|
|
42
|
+
send: (decision) => { void deliverAndAck(decision); },
|
|
43
|
+
});
|
|
44
|
+
dispatcher.onCapability({
|
|
45
|
+
kind: "capability",
|
|
46
|
+
connectorId: opts.connectorId ?? "slack-subsystem",
|
|
47
|
+
platform: opts.platform ?? "slack",
|
|
48
|
+
protocolVersion: 1,
|
|
49
|
+
ops: opts.ops ?? [],
|
|
50
|
+
});
|
|
51
|
+
return {
|
|
52
|
+
dispatcher,
|
|
53
|
+
stop: () => { },
|
|
54
|
+
// Restart no-loss: un-Acked decisions re-enter delivery — a NETWORK action, so it rides
|
|
55
|
+
// startServices() (post-bind), never wire composition.
|
|
56
|
+
startServices: () => dispatcher.replayPending(),
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
export class GatewaySubsystem {
|
|
60
|
+
deps;
|
|
61
|
+
state = "inactive";
|
|
62
|
+
reason;
|
|
63
|
+
activatedAt;
|
|
64
|
+
wireHandle;
|
|
65
|
+
servicesStarted = false;
|
|
66
|
+
constructor(deps) {
|
|
67
|
+
this.deps = deps;
|
|
68
|
+
}
|
|
69
|
+
/** Activate in-process. NEVER throws: a wiring failure records state=failed with the cause
|
|
70
|
+
* and returns — daemon boot proceeds and the health surface tells the truth. */
|
|
71
|
+
start() {
|
|
72
|
+
if (this.state === "active")
|
|
73
|
+
return;
|
|
74
|
+
try {
|
|
75
|
+
this.wireHandle = this.deps.wire();
|
|
76
|
+
this.state = "active";
|
|
77
|
+
this.reason = undefined;
|
|
78
|
+
this.activatedAt = (this.deps.now?.() ?? new Date()).toISOString();
|
|
79
|
+
this.deps.log?.("gateway subsystem active (in-process)");
|
|
80
|
+
}
|
|
81
|
+
catch (e) {
|
|
82
|
+
this.state = "failed";
|
|
83
|
+
this.reason = e.message;
|
|
84
|
+
this.wireHandle = undefined;
|
|
85
|
+
this.deps.log?.(`gateway subsystem FAILED to activate: ${this.reason}`);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
/** Start the wire's network services (replay, pollers, sockets). Post-bind only — the
|
|
89
|
+
* index.ts supervision tree calls this beside contextMonitor.start(); test-built daemons
|
|
90
|
+
* never do, so composing a daemon never dials out. Idempotence is the wire's concern. */
|
|
91
|
+
startServices() {
|
|
92
|
+
if (this.state !== "active")
|
|
93
|
+
return;
|
|
94
|
+
try {
|
|
95
|
+
this.wireHandle?.startServices?.();
|
|
96
|
+
this.servicesStarted = true;
|
|
97
|
+
}
|
|
98
|
+
catch (e) {
|
|
99
|
+
// Service startup failure is honest but NOT fatal to the composed wire: dispatches
|
|
100
|
+
// still persist durably; the health surface names the degradation.
|
|
101
|
+
this.reason = `services failed to start: ${e.message}`;
|
|
102
|
+
this.deps.log?.(`gateway subsystem services FAILED to start: ${e.message}`);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
/** Dispatch through the live wire (refused honestly when not active). */
|
|
106
|
+
dispatch(op, entityBindingRef, payload) {
|
|
107
|
+
if (this.state !== "active" || !this.wireHandle) {
|
|
108
|
+
return { ok: false, error: `dispatch refused: gateway subsystem is ${this.state}${this.reason ? ` (${this.reason})` : ""}` };
|
|
109
|
+
}
|
|
110
|
+
return this.wireHandle.dispatcher.dispatch(op, entityBindingRef, payload);
|
|
111
|
+
}
|
|
112
|
+
status() {
|
|
113
|
+
const s = { state: this.state };
|
|
114
|
+
if (this.reason !== undefined)
|
|
115
|
+
s.reason = this.reason;
|
|
116
|
+
if (this.activatedAt !== undefined)
|
|
117
|
+
s.activatedAt = this.activatedAt;
|
|
118
|
+
if (this.state === "active" || this.state === "failed") {
|
|
119
|
+
try {
|
|
120
|
+
s.pendingDispatches = new DispatchBuffer(this.deps.home).pending().length;
|
|
121
|
+
}
|
|
122
|
+
catch { /* buffer unreadable — omit rather than lie */ }
|
|
123
|
+
}
|
|
124
|
+
return s;
|
|
125
|
+
}
|
|
126
|
+
/** Recovery half of recovers-or-reports: tear down and re-run the wiring. If services were
|
|
127
|
+
* live (post-bind), the rebuilt wire's services start too — a config flip (enable/disable)
|
|
128
|
+
* lands without a daemon restart. */
|
|
129
|
+
restart() {
|
|
130
|
+
const resumeServices = this.servicesStarted;
|
|
131
|
+
this.stop();
|
|
132
|
+
this.state = "inactive";
|
|
133
|
+
this.start();
|
|
134
|
+
if (resumeServices)
|
|
135
|
+
this.startServices();
|
|
136
|
+
}
|
|
137
|
+
stop() {
|
|
138
|
+
try {
|
|
139
|
+
this.wireHandle?.stop();
|
|
140
|
+
}
|
|
141
|
+
catch { /* best-effort */ }
|
|
142
|
+
this.wireHandle = undefined;
|
|
143
|
+
this.servicesStarted = false;
|
|
144
|
+
if (this.state !== "failed")
|
|
145
|
+
this.state = "stopped";
|
|
146
|
+
this.deps.log?.("gateway subsystem stopped");
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
//# sourceMappingURL=gateway-subsystem.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gateway-subsystem.js","sourceRoot":"","sources":["../../../src/domain/gateway/gateway-subsystem.ts"],"names":[],"mappings":"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"}
|
|
@@ -110,6 +110,115 @@ export type AddHumanResult = {
|
|
|
110
110
|
export declare function addHumanFragment(raw: unknown, home?: string, opts?: {
|
|
111
111
|
replace?: boolean;
|
|
112
112
|
}): AddHumanResult;
|
|
113
|
+
/** One in-flight item standing between a human and a clean remove. The registry does not
|
|
114
|
+
* own the sources (queue rows live behind the daemon; conversations in the dispatch
|
|
115
|
+
* buffer) — callers assemble the list; `pendingConversationsFor` covers the buffer half. */
|
|
116
|
+
export interface InflightItem {
|
|
117
|
+
kind: "open-conversation" | "queue-row";
|
|
118
|
+
id: string;
|
|
119
|
+
detail: string;
|
|
120
|
+
}
|
|
121
|
+
export interface HumanBindingsSummary {
|
|
122
|
+
count: number;
|
|
123
|
+
primary: {
|
|
124
|
+
kind: string;
|
|
125
|
+
connectorRef: string;
|
|
126
|
+
};
|
|
127
|
+
/** true iff any binding carries a handle (outbound-only otherwise). */
|
|
128
|
+
inboundResolvable: boolean;
|
|
129
|
+
}
|
|
130
|
+
export interface HumanSummary {
|
|
131
|
+
entityId: string;
|
|
132
|
+
displayName: string;
|
|
133
|
+
address: string;
|
|
134
|
+
deliveryClass: HumanPrefs["deliveryClass"];
|
|
135
|
+
/** EFFECTIVE availability preset (default false when unauthored). */
|
|
136
|
+
away: boolean;
|
|
137
|
+
bindings: HumanBindingsSummary;
|
|
138
|
+
fragmentPath: string;
|
|
139
|
+
}
|
|
140
|
+
export type ListHumansResult = {
|
|
141
|
+
ok: true;
|
|
142
|
+
humans: HumanSummary[];
|
|
143
|
+
advisory?: string;
|
|
144
|
+
} | {
|
|
145
|
+
ok: false;
|
|
146
|
+
error: string;
|
|
147
|
+
};
|
|
148
|
+
/** Amendment A1 (founder R5): the 0.5.5 surface is SINGLE-HUMAN. Several fragments render
|
|
149
|
+
* honestly, but enumeration is display, never management — the advisory names the boundary. */
|
|
150
|
+
export declare const MULTI_HUMAN_ADVISORY = "several human fragments exist; this release's surface is single-human \u2014 multi-human management is 0.5.7 scope (fragments are displayed honestly; no plural management verbs exist)";
|
|
151
|
+
/** A field value with its provenance: authored in the fragment, or filled by a default. */
|
|
152
|
+
export interface ProvenancedValue<T> {
|
|
153
|
+
value: T;
|
|
154
|
+
source: "authored" | "default";
|
|
155
|
+
}
|
|
156
|
+
export interface EffectiveHumanRecord {
|
|
157
|
+
entityId: string;
|
|
158
|
+
address: string;
|
|
159
|
+
displayName: string;
|
|
160
|
+
fragmentPath: string;
|
|
161
|
+
prefs: {
|
|
162
|
+
deliveryClass: ProvenancedValue<HumanPrefs["deliveryClass"]>;
|
|
163
|
+
away: ProvenancedValue<boolean>;
|
|
164
|
+
};
|
|
165
|
+
connectorBindings: Array<HumanConnectorBinding & {
|
|
166
|
+
inboundResolvable: boolean;
|
|
167
|
+
}>;
|
|
168
|
+
}
|
|
169
|
+
export type ShowHumanResult = {
|
|
170
|
+
ok: true;
|
|
171
|
+
record: EffectiveHumanRecord;
|
|
172
|
+
} | {
|
|
173
|
+
ok: false;
|
|
174
|
+
error: string;
|
|
175
|
+
};
|
|
176
|
+
export type SetHumanFieldResult = {
|
|
177
|
+
ok: true;
|
|
178
|
+
path: string;
|
|
179
|
+
fragment: HumanFragment;
|
|
180
|
+
} | {
|
|
181
|
+
ok: false;
|
|
182
|
+
error: string;
|
|
183
|
+
};
|
|
184
|
+
export type RemoveHumanResult = {
|
|
185
|
+
ok: true;
|
|
186
|
+
removed: string;
|
|
187
|
+
archivedPath: string;
|
|
188
|
+
orphanRecordPath?: string;
|
|
189
|
+
} | {
|
|
190
|
+
ok: false;
|
|
191
|
+
error: string;
|
|
192
|
+
inflight?: InflightItem[];
|
|
193
|
+
};
|
|
194
|
+
/** --binding / set-binding spec: kind:connectorRef:secretsRef:role[:handle=<id>]. secretsRef is
|
|
195
|
+
* a vault POINTER and may itself contain ':', so kind/connectorRef are the first two fields,
|
|
196
|
+
* role is the LAST positional, secretsRef is everything between. An optional handle= token may
|
|
197
|
+
* appear anywhere. ONE source for add (CLI) and set (here) — the same parse both paths. */
|
|
198
|
+
export declare function parseBindingSpec(spec: string): {
|
|
199
|
+
ok: true;
|
|
200
|
+
binding: {
|
|
201
|
+
kind: string;
|
|
202
|
+
connectorRef: string;
|
|
203
|
+
secretsRef: string;
|
|
204
|
+
role: string;
|
|
205
|
+
handle?: string;
|
|
206
|
+
};
|
|
207
|
+
} | {
|
|
208
|
+
ok: false;
|
|
209
|
+
error: string;
|
|
210
|
+
};
|
|
211
|
+
export declare function listHumans(home?: string): ListHumansResult;
|
|
212
|
+
export declare function showHuman(entityId: string, home?: string): ShowHumanResult;
|
|
213
|
+
export declare function setHumanField(entityId: string, field: string, value: string, home?: string): SetHumanFieldResult;
|
|
214
|
+
export declare function removeHumanFragment(entityId: string, opts: {
|
|
215
|
+
force?: boolean;
|
|
216
|
+
inflight: InflightItem[];
|
|
217
|
+
}, home?: string): RemoveHumanResult;
|
|
218
|
+
/** The dispatch-buffer half of the remove guard: un-Acked outbound decisions bound to this
|
|
219
|
+
* entity are open conversations. Match rule (documented, not guessed): entityBindingRef equal
|
|
220
|
+
* to the entityId, equal to its registered address, or prefixed "<entityId>:". */
|
|
221
|
+
export declare function pendingConversationsFor(entityId: string, home?: string): InflightItem[];
|
|
113
222
|
export type LoadResult = {
|
|
114
223
|
ok: true;
|
|
115
224
|
entities: HumanFragment[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"human-registry.d.ts","sourceRoot":"","sources":["../../../src/domain/gateway/human-registry.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"human-registry.d.ts","sourceRoot":"","sources":["../../../src/domain/gateway/human-registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -17,6 +17,7 @@ import { existsSync, readFileSync, writeFileSync, renameSync, mkdirSync, readdir
|
|
|
17
17
|
import { join, dirname } from "node:path";
|
|
18
18
|
import { parse as parseYaml, stringify as stringifyYaml } from "yaml";
|
|
19
19
|
import { getOpenRigHome } from "../../openrig-compat.js";
|
|
20
|
+
import { DispatchBuffer } from "./dispatch-buffer.js";
|
|
20
21
|
// ── Schema (closed enums; extend only additively behind the contract) ──
|
|
21
22
|
export const HUMAN_ENTITY_CLASSES = new Set(["human"]); // M1's only class
|
|
22
23
|
export const HUMAN_CONNECTOR_KINDS = new Set(["slack"]); // M1's only kind
|
|
@@ -300,6 +301,255 @@ export function addHumanFragment(raw, home = getOpenRigHome(), opts = {}) {
|
|
|
300
301
|
return { ok: false, error: `fragment written but re-projection failed: ${proj.error}` };
|
|
301
302
|
return { ok: true, path: file, fragment: v.fragment };
|
|
302
303
|
}
|
|
304
|
+
/** Amendment A1 (founder R5): the 0.5.5 surface is SINGLE-HUMAN. Several fragments render
|
|
305
|
+
* honestly, but enumeration is display, never management — the advisory names the boundary. */
|
|
306
|
+
export const MULTI_HUMAN_ADVISORY = "several human fragments exist; this release's surface is single-human — multi-human management is 0.5.7 scope (fragments are displayed honestly; no plural management verbs exist)";
|
|
307
|
+
/** --binding / set-binding spec: kind:connectorRef:secretsRef:role[:handle=<id>]. secretsRef is
|
|
308
|
+
* a vault POINTER and may itself contain ':', so kind/connectorRef are the first two fields,
|
|
309
|
+
* role is the LAST positional, secretsRef is everything between. An optional handle= token may
|
|
310
|
+
* appear anywhere. ONE source for add (CLI) and set (here) — the same parse both paths. */
|
|
311
|
+
export function parseBindingSpec(spec) {
|
|
312
|
+
const all = spec.split(":");
|
|
313
|
+
const handleTokens = all.filter((p) => p.startsWith("handle="));
|
|
314
|
+
if (handleTokens.length > 1)
|
|
315
|
+
return { ok: false, error: `binding spec must carry at most one handle= token (got "${spec}")` };
|
|
316
|
+
const handle = handleTokens.length === 1 ? handleTokens[0].slice("handle=".length) : undefined;
|
|
317
|
+
if (handle !== undefined && handle.length === 0)
|
|
318
|
+
return { ok: false, error: `binding handle= must be non-empty (got "${spec}")` };
|
|
319
|
+
const parts = all.filter((p) => !p.startsWith("handle="));
|
|
320
|
+
if (parts.length < 4)
|
|
321
|
+
return { ok: false, error: `binding spec must be kind:connectorRef:secretsRef:role[:handle=<id>] (got "${spec}")` };
|
|
322
|
+
const kind = parts[0];
|
|
323
|
+
const connectorRef = parts[1];
|
|
324
|
+
const role = parts[parts.length - 1];
|
|
325
|
+
const secretsRef = parts.slice(2, -1).join(":");
|
|
326
|
+
if (!kind || !connectorRef || !secretsRef || !role) {
|
|
327
|
+
return { ok: false, error: `binding spec fields must be non-empty: kind:connectorRef:secretsRef:role[:handle=<id>] (got "${spec}")` };
|
|
328
|
+
}
|
|
329
|
+
return { ok: true, binding: handle !== undefined ? { kind, connectorRef, secretsRef, role, handle } : { kind, connectorRef, secretsRef, role } };
|
|
330
|
+
}
|
|
331
|
+
function fragmentPathFor(entityId, home) {
|
|
332
|
+
return join(humansDir(home), `${entityId}.yaml`);
|
|
333
|
+
}
|
|
334
|
+
function knownEntityIds(home) {
|
|
335
|
+
const dir = humansDir(home);
|
|
336
|
+
if (!existsSync(dir))
|
|
337
|
+
return [];
|
|
338
|
+
return readdirSync(dir)
|
|
339
|
+
.filter((f) => f.endsWith(".yaml") && !f.startsWith("."))
|
|
340
|
+
.map((f) => f.slice(0, -".yaml".length))
|
|
341
|
+
.sort();
|
|
342
|
+
}
|
|
343
|
+
function unknownHumanError(entityId, home) {
|
|
344
|
+
const known = knownEntityIds(home);
|
|
345
|
+
return `no human "${entityId}" is registered — known humans: ${known.length ? known.join(", ") : "(none)"}`;
|
|
346
|
+
}
|
|
347
|
+
export function listHumans(home = getOpenRigHome()) {
|
|
348
|
+
const proj = projectHumans(home);
|
|
349
|
+
if (!proj.ok)
|
|
350
|
+
return { ok: false, error: proj.error };
|
|
351
|
+
const humans = proj.entities.map((e) => {
|
|
352
|
+
const primary = e.connectorBindings.find((b) => b.role === "primary");
|
|
353
|
+
return {
|
|
354
|
+
entityId: e.entityId,
|
|
355
|
+
displayName: e.displayName,
|
|
356
|
+
address: e.address,
|
|
357
|
+
deliveryClass: e.prefs.deliveryClass,
|
|
358
|
+
away: e.prefs.away === true,
|
|
359
|
+
bindings: {
|
|
360
|
+
count: e.connectorBindings.length,
|
|
361
|
+
primary: { kind: primary.kind, connectorRef: primary.connectorRef },
|
|
362
|
+
inboundResolvable: e.connectorBindings.some((b) => b.handle !== undefined),
|
|
363
|
+
},
|
|
364
|
+
fragmentPath: fragmentPathFor(e.entityId, home),
|
|
365
|
+
};
|
|
366
|
+
});
|
|
367
|
+
return humans.length > 1 ? { ok: true, humans, advisory: MULTI_HUMAN_ADVISORY } : { ok: true, humans };
|
|
368
|
+
}
|
|
369
|
+
/** Read one fragment RAW (for authored-vs-default provenance) + validated. */
|
|
370
|
+
function readFragment(entityId, home) {
|
|
371
|
+
const path = fragmentPathFor(entityId, home);
|
|
372
|
+
if (!existsSync(path))
|
|
373
|
+
return { ok: false, error: unknownHumanError(entityId, home) };
|
|
374
|
+
let raw;
|
|
375
|
+
try {
|
|
376
|
+
raw = parseYaml(readFileSync(path, "utf8"));
|
|
377
|
+
}
|
|
378
|
+
catch (err) {
|
|
379
|
+
return { ok: false, error: `failed to parse human fragment ${entityId}.yaml: ${err.message}` };
|
|
380
|
+
}
|
|
381
|
+
const v = validateHumanFragment(raw);
|
|
382
|
+
if (!v.ok)
|
|
383
|
+
return { ok: false, error: `invalid human fragment ${entityId}.yaml: ${v.error}` };
|
|
384
|
+
return { ok: true, raw: raw, fragment: v.fragment, path };
|
|
385
|
+
}
|
|
386
|
+
export function showHuman(entityId, home = getOpenRigHome()) {
|
|
387
|
+
const f = readFragment(entityId, home);
|
|
388
|
+
if (!f.ok)
|
|
389
|
+
return f;
|
|
390
|
+
const rawPrefs = isObj(f.raw.prefs) ? f.raw.prefs : {};
|
|
391
|
+
return {
|
|
392
|
+
ok: true,
|
|
393
|
+
record: {
|
|
394
|
+
entityId: f.fragment.entityId,
|
|
395
|
+
address: f.fragment.address,
|
|
396
|
+
displayName: f.fragment.displayName,
|
|
397
|
+
fragmentPath: f.path,
|
|
398
|
+
prefs: {
|
|
399
|
+
deliveryClass: { value: f.fragment.prefs.deliveryClass, source: "authored" },
|
|
400
|
+
away: {
|
|
401
|
+
value: f.fragment.prefs.away === true,
|
|
402
|
+
source: rawPrefs.away !== undefined ? "authored" : "default",
|
|
403
|
+
},
|
|
404
|
+
},
|
|
405
|
+
connectorBindings: f.fragment.connectorBindings.map((b) => ({ ...b, inboundResolvable: b.handle !== undefined })),
|
|
406
|
+
},
|
|
407
|
+
};
|
|
408
|
+
}
|
|
409
|
+
const SETTABLE_FIELDS_TEACHING = "settable fields: display-name, delivery-class, away, binding.<n> (binding.<n> takes a full kind:connectorRef:secretsRef:role[:handle=<id>] spec)";
|
|
410
|
+
/** Cross-fragment handle-uniqueness: the same pre-write check add runs (one platform id =
|
|
411
|
+
* one human), extracted so set enforces it identically. */
|
|
412
|
+
function handleConflict(fragment, home) {
|
|
413
|
+
const existing = projectHumans(home);
|
|
414
|
+
if (!existing.ok)
|
|
415
|
+
return `cannot validate handle uniqueness — existing registry is invalid: ${existing.error}`;
|
|
416
|
+
const claimed = new Map();
|
|
417
|
+
for (const e of existing.entities) {
|
|
418
|
+
if (e.entityId === fragment.entityId)
|
|
419
|
+
continue;
|
|
420
|
+
for (const b of e.connectorBindings)
|
|
421
|
+
if (b.handle !== undefined)
|
|
422
|
+
claimed.set(`${b.kind}:${b.handle}`, e.entityId);
|
|
423
|
+
}
|
|
424
|
+
for (const b of fragment.connectorBindings) {
|
|
425
|
+
if (b.handle === undefined)
|
|
426
|
+
continue;
|
|
427
|
+
const owner = claimed.get(`${b.kind}:${b.handle}`);
|
|
428
|
+
if (owner !== undefined) {
|
|
429
|
+
return `${b.kind} handle "${b.handle}" is already registered to human "${owner}" — a handle maps to exactly one human (registration conflict)`;
|
|
430
|
+
}
|
|
431
|
+
}
|
|
432
|
+
return undefined;
|
|
433
|
+
}
|
|
434
|
+
export function setHumanField(entityId, field, value, home = getOpenRigHome()) {
|
|
435
|
+
const f = readFragment(entityId, home);
|
|
436
|
+
if (!f.ok)
|
|
437
|
+
return f;
|
|
438
|
+
// Edit the RAW mapping (not the normalized fragment) so an unauthored optional field
|
|
439
|
+
// stays unauthored — show's provenance depends on the authored shape surviving edits.
|
|
440
|
+
const raw = f.raw;
|
|
441
|
+
const rawPrefs = isObj(raw.prefs) ? raw.prefs : {};
|
|
442
|
+
if (field === "display-name") {
|
|
443
|
+
if (value.length === 0)
|
|
444
|
+
return { ok: false, error: "display-name must be a non-empty string" };
|
|
445
|
+
raw.displayName = value;
|
|
446
|
+
}
|
|
447
|
+
else if (field === "delivery-class") {
|
|
448
|
+
rawPrefs.deliveryClass = value; // enum validated below by the SAME add-time validator
|
|
449
|
+
raw.prefs = rawPrefs;
|
|
450
|
+
}
|
|
451
|
+
else if (field === "away") {
|
|
452
|
+
if (value !== "true" && value !== "false") {
|
|
453
|
+
return { ok: false, error: `away must be true|false (got "${value}")` };
|
|
454
|
+
}
|
|
455
|
+
rawPrefs.away = value === "true";
|
|
456
|
+
raw.prefs = rawPrefs;
|
|
457
|
+
}
|
|
458
|
+
else if (field.startsWith("binding.")) {
|
|
459
|
+
const idxRaw = field.slice("binding.".length);
|
|
460
|
+
const idx = /^\d+$/.test(idxRaw) ? Number.parseInt(idxRaw, 10) : NaN;
|
|
461
|
+
const bindings = Array.isArray(raw.connectorBindings) ? raw.connectorBindings : [];
|
|
462
|
+
if (!Number.isInteger(idx) || idx < 0 || idx >= bindings.length) {
|
|
463
|
+
const valid = bindings.map((_, i) => `binding.${i}`).join(", ");
|
|
464
|
+
return { ok: false, error: `"${field}" is out of range — this human has ${bindings.length} binding(s): ${valid || "(none)"}` };
|
|
465
|
+
}
|
|
466
|
+
const parsed = parseBindingSpec(value);
|
|
467
|
+
if (!parsed.ok)
|
|
468
|
+
return parsed;
|
|
469
|
+
bindings[idx] = parsed.binding;
|
|
470
|
+
raw.connectorBindings = bindings;
|
|
471
|
+
}
|
|
472
|
+
else {
|
|
473
|
+
return { ok: false, error: `unknown field "${field}" — ${SETTABLE_FIELDS_TEACHING}` };
|
|
474
|
+
}
|
|
475
|
+
// Full add-time parity: structural + closed enums + cross-field invariants...
|
|
476
|
+
const v = validateHumanFragment(raw);
|
|
477
|
+
if (!v.ok)
|
|
478
|
+
return { ok: false, error: v.error };
|
|
479
|
+
if (v.fragment.entityId !== entityId) {
|
|
480
|
+
return { ok: false, error: `set must not change entityId (fragment key)` };
|
|
481
|
+
}
|
|
482
|
+
// ...plus the cross-fragment handle-uniqueness pre-write check add runs.
|
|
483
|
+
const conflict = handleConflict(v.fragment, home);
|
|
484
|
+
if (conflict)
|
|
485
|
+
return { ok: false, error: conflict };
|
|
486
|
+
const w = atomicWrite(f.path, stringifyYaml(raw));
|
|
487
|
+
if (!w.ok)
|
|
488
|
+
return { ok: false, error: w.error };
|
|
489
|
+
const proj = writeProjection(home);
|
|
490
|
+
if (!proj.ok)
|
|
491
|
+
return { ok: false, error: `fragment written but re-projection failed: ${proj.error}` };
|
|
492
|
+
return { ok: true, path: f.path, fragment: v.fragment };
|
|
493
|
+
}
|
|
494
|
+
export function removeHumanFragment(entityId, opts, home = getOpenRigHome()) {
|
|
495
|
+
const path = fragmentPathFor(entityId, home);
|
|
496
|
+
if (!existsSync(path))
|
|
497
|
+
return { ok: false, error: unknownHumanError(entityId, home) };
|
|
498
|
+
if (!opts.force && opts.inflight.length > 0) {
|
|
499
|
+
const lines = opts.inflight.map((i) => ` - ${i.kind} ${i.id} — ${i.detail}`).join("\n");
|
|
500
|
+
return {
|
|
501
|
+
ok: false,
|
|
502
|
+
inflight: opts.inflight,
|
|
503
|
+
error: `refusing to remove "${entityId}" — ${opts.inflight.length} in-flight item(s) would be orphaned:\n${lines}\n` +
|
|
504
|
+
`Resolve them first, or pass --force to archive anyway (every in-flight item above will be recorded as orphaned, never silently dropped).`,
|
|
505
|
+
};
|
|
506
|
+
}
|
|
507
|
+
// Archive, never delete bytes. Collision-safe name (ms timestamp + counter fallback).
|
|
508
|
+
const archiveDir = join(humansDir(home), ".archive");
|
|
509
|
+
try {
|
|
510
|
+
mkdirSync(archiveDir, { recursive: true });
|
|
511
|
+
}
|
|
512
|
+
catch (err) {
|
|
513
|
+
return { ok: false, error: `failed to create archive dir ${archiveDir}: ${err.message}` };
|
|
514
|
+
}
|
|
515
|
+
const stamp = new Date().toISOString().replace(/[:.]/g, "-");
|
|
516
|
+
let archivedPath = join(archiveDir, `${entityId}.${stamp}.yaml`);
|
|
517
|
+
for (let n = 1; existsSync(archivedPath); n++)
|
|
518
|
+
archivedPath = join(archiveDir, `${entityId}.${stamp}-${n}.yaml`);
|
|
519
|
+
try {
|
|
520
|
+
renameSync(path, archivedPath);
|
|
521
|
+
}
|
|
522
|
+
catch (err) {
|
|
523
|
+
return { ok: false, error: `failed to archive ${path}: ${err.message}` };
|
|
524
|
+
}
|
|
525
|
+
let orphanRecordPath;
|
|
526
|
+
if (opts.inflight.length > 0) {
|
|
527
|
+
orphanRecordPath = archivedPath.replace(/\.yaml$/, ".orphans.json");
|
|
528
|
+
const record = { entityId, archivedFragment: archivedPath, orphaned: opts.inflight };
|
|
529
|
+
const w = atomicWrite(orphanRecordPath, JSON.stringify(record, null, 2));
|
|
530
|
+
if (!w.ok)
|
|
531
|
+
return { ok: false, error: `fragment archived to ${archivedPath} but the orphan record failed: ${w.error}` };
|
|
532
|
+
}
|
|
533
|
+
const proj = writeProjection(home);
|
|
534
|
+
if (!proj.ok)
|
|
535
|
+
return { ok: false, error: `fragment archived to ${archivedPath} but re-projection failed: ${proj.error}` };
|
|
536
|
+
const base = { ok: true, removed: entityId, archivedPath };
|
|
537
|
+
return orphanRecordPath !== undefined ? { ...base, orphanRecordPath } : base;
|
|
538
|
+
}
|
|
539
|
+
/** The dispatch-buffer half of the remove guard: un-Acked outbound decisions bound to this
|
|
540
|
+
* entity are open conversations. Match rule (documented, not guessed): entityBindingRef equal
|
|
541
|
+
* to the entityId, equal to its registered address, or prefixed "<entityId>:". */
|
|
542
|
+
export function pendingConversationsFor(entityId, home = getOpenRigHome()) {
|
|
543
|
+
const address = `${entityId}@${ADDRESS_DOMAIN}`;
|
|
544
|
+
return new DispatchBuffer(home)
|
|
545
|
+
.pending()
|
|
546
|
+
.filter((d) => d.entityBindingRef === entityId || d.entityBindingRef === address || d.entityBindingRef.startsWith(`${entityId}:`))
|
|
547
|
+
.map((d) => ({
|
|
548
|
+
kind: "open-conversation",
|
|
549
|
+
id: d.decisionId,
|
|
550
|
+
detail: `undelivered outbound decision ${d.decisionId} (op ${d.op}, binding ${d.entityBindingRef})`,
|
|
551
|
+
}));
|
|
552
|
+
}
|
|
303
553
|
/** Load the registry via the projection, but REFUSE a hand-edited/drifted projection:
|
|
304
554
|
* the fragments are truth, so the on-disk projection must byte-match a fresh one.
|
|
305
555
|
* This is the drift pin's runtime half (the vitest parity pin is the CI half). */
|