@openrig/cli 0.7.0 → 0.7.1
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 +9 -8
- package/daemon/assets/claude-statusline-context.cjs +13 -3
- package/daemon/assets/guidance/openrig-seat-skills.md +1 -0
- 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/hooks/claude.json +11 -11
- package/daemon/assets/plugins/openrig-core/hooks/scripts/activity-relay.cjs +9 -8
- package/daemon/assets/plugins/openrig-core/hooks/scripts/refocus-health.cjs +2 -2
- package/daemon/assets/plugins/openrig-core/hooks/scripts/refocus.cjs +9 -6
- package/daemon/assets/plugins/openrig-core/skills/claude-compaction-restore/scripts/precompact-hook.mjs +1 -1
- package/daemon/assets/plugins/openrig-core/skills/forming-an-openrig-mental-model/SKILL.md +13 -8
- package/daemon/assets/plugins/openrig-core/skills/messaging-the-human/SKILL.md +19 -4
- package/daemon/assets/plugins/openrig-core/skills/openrig-user/SKILL.md +167 -46
- package/daemon/assets/skills/rigs/SKILL.md +2 -1
- 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 +206 -28
- package/daemon/context-packs/reference/getting-started.md +65 -6
- package/daemon/context-packs/reference/manifest.yaml +1 -1
- package/daemon/context-packs/reference/rig-spec.md +82 -2
- package/daemon/context-packs/reference/whats-new.md +162 -113
- 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/claude-compaction-restore/scripts/precompact-hook.mjs +1 -1
- package/daemon/context-packs/skills/core/agent-starters/manifest.yaml +1 -1
- package/daemon/context-packs/skills/core/agent-startup-and-context-ingestion/manifest.yaml +1 -1
- package/daemon/context-packs/skills/core/cross-host-rig-commands/manifest.yaml +1 -1
- package/daemon/context-packs/skills/core/human-in-the-loop/manifest.yaml +1 -1
- package/daemon/context-packs/skills/core/messaging-the-human/SKILL.md +19 -4
- 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/SKILL.md +3 -0
- 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-software-factory/references/worked-example.md +2 -2
- package/daemon/context-packs/skills/core/openrig-upgrade/manifest.yaml +1 -1
- package/daemon/context-packs/skills/core/rig-bundles-and-shareable-artifacts/manifest.yaml +1 -1
- package/daemon/context-packs/skills/core/rig-lifecycle/manifest.yaml +1 -1
- package/daemon/context-packs/skills/core/session-source-fork/manifest.yaml +1 -1
- package/daemon/context-packs/skills/core/specification-system/manifest.yaml +1 -1
- package/daemon/context-packs/skills/core/topology-mutation-and-seat-management/manifest.yaml +1 -1
- package/daemon/context-packs/skills/core/watchdog/manifest.yaml +1 -1
- package/daemon/context-packs/skills/delegating-work/manifest.yaml +1 -1
- package/daemon/context-packs/skills/forming-an-openrig-mental-model/SKILL.md +13 -8
- package/daemon/context-packs/skills/forming-an-openrig-mental-model/manifest.yaml +1 -1
- package/daemon/context-packs/skills/loading-addressable-markdown/manifest.yaml +1 -1
- package/daemon/context-packs/skills/mission-slice-sop/manifest.yaml +1 -1
- package/daemon/context-packs/skills/openrig-operating-model/manifest.yaml +1 -1
- package/daemon/context-packs/skills/openrig-user/SKILL.md +167 -46
- 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/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.map +1 -1
- package/daemon/dist/adapters/claude-code-adapter.js +94 -26
- package/daemon/dist/adapters/claude-code-adapter.js.map +1 -1
- package/daemon/dist/adapters/claude-resume.d.ts +2 -1
- package/daemon/dist/adapters/claude-resume.d.ts.map +1 -1
- package/daemon/dist/adapters/claude-resume.js +10 -3
- package/daemon/dist/adapters/claude-resume.js.map +1 -1
- package/daemon/dist/adapters/codex-runtime-adapter.d.ts +10 -4
- package/daemon/dist/adapters/codex-runtime-adapter.d.ts.map +1 -1
- package/daemon/dist/adapters/codex-runtime-adapter.js +231 -41
- package/daemon/dist/adapters/codex-runtime-adapter.js.map +1 -1
- package/daemon/dist/adapters/community-harness-runtime-adapter.d.ts +21 -2
- package/daemon/dist/adapters/community-harness-runtime-adapter.d.ts.map +1 -1
- package/daemon/dist/adapters/community-harness-runtime-adapter.js +90 -8
- package/daemon/dist/adapters/community-harness-runtime-adapter.js.map +1 -1
- package/daemon/dist/adapters/pi-runner.d.ts +11 -0
- package/daemon/dist/adapters/pi-runner.d.ts.map +1 -1
- package/daemon/dist/adapters/pi-runner.js +59 -16
- 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 +9 -6
- package/daemon/dist/adapters/pi-runtime-adapter.js.map +1 -1
- package/daemon/dist/adapters/stub-runtime-adapter.d.ts.map +1 -1
- package/daemon/dist/adapters/stub-runtime-adapter.js +9 -5
- package/daemon/dist/adapters/stub-runtime-adapter.js.map +1 -1
- package/daemon/dist/adapters/tmux.d.ts +15 -4
- package/daemon/dist/adapters/tmux.d.ts.map +1 -1
- package/daemon/dist/adapters/tmux.js +68 -26
- package/daemon/dist/adapters/tmux.js.map +1 -1
- package/daemon/dist/attention-surface.d.ts +14 -0
- package/daemon/dist/attention-surface.d.ts.map +1 -1
- package/daemon/dist/attention-surface.js.map +1 -1
- package/daemon/dist/build-info.js +3 -3
- package/daemon/dist/daemon-db-path.d.ts +6 -0
- package/daemon/dist/daemon-db-path.d.ts.map +1 -1
- package/daemon/dist/daemon-db-path.js +65 -1
- package/daemon/dist/daemon-db-path.js.map +1 -1
- package/daemon/dist/daemon-shutdown.d.ts.map +1 -1
- package/daemon/dist/daemon-shutdown.js +4 -2
- package/daemon/dist/daemon-shutdown.js.map +1 -1
- package/daemon/dist/db/all-migrations.d.ts.map +1 -1
- package/daemon/dist/db/all-migrations.js +16 -0
- package/daemon/dist/db/all-migrations.js.map +1 -1
- package/daemon/dist/db/migrations/124_context_usage_watchdog_units.d.ts +4 -0
- package/daemon/dist/db/migrations/124_context_usage_watchdog_units.d.ts.map +1 -0
- package/daemon/dist/db/migrations/124_context_usage_watchdog_units.js +9 -0
- package/daemon/dist/db/migrations/124_context_usage_watchdog_units.js.map +1 -0
- package/daemon/dist/db/migrations/125_node_advisor.d.ts +3 -0
- package/daemon/dist/db/migrations/125_node_advisor.d.ts.map +1 -0
- package/daemon/dist/db/migrations/125_node_advisor.js +8 -0
- package/daemon/dist/db/migrations/125_node_advisor.js.map +1 -0
- package/daemon/dist/db/migrations/127_operation_correlation.d.ts +3 -0
- package/daemon/dist/db/migrations/127_operation_correlation.d.ts.map +1 -0
- package/daemon/dist/db/migrations/127_operation_correlation.js +10 -0
- package/daemon/dist/db/migrations/127_operation_correlation.js.map +1 -0
- package/daemon/dist/db/migrations/128_terminal_policy.d.ts +3 -0
- package/daemon/dist/db/migrations/128_terminal_policy.d.ts.map +1 -0
- package/daemon/dist/db/migrations/128_terminal_policy.js +37 -0
- package/daemon/dist/db/migrations/128_terminal_policy.js.map +1 -0
- package/daemon/dist/db/migrations/129_stream_dispositions.d.ts +10 -0
- package/daemon/dist/db/migrations/129_stream_dispositions.d.ts.map +1 -0
- package/daemon/dist/db/migrations/129_stream_dispositions.js +35 -0
- package/daemon/dist/db/migrations/129_stream_dispositions.js.map +1 -0
- package/daemon/dist/db/migrations/130_stream_subscriptions.d.ts +11 -0
- package/daemon/dist/db/migrations/130_stream_subscriptions.d.ts.map +1 -0
- package/daemon/dist/db/migrations/130_stream_subscriptions.js +33 -0
- package/daemon/dist/db/migrations/130_stream_subscriptions.js.map +1 -0
- package/daemon/dist/db/migrations/131_stream_retention_floor.d.ts +8 -0
- package/daemon/dist/db/migrations/131_stream_retention_floor.d.ts.map +1 -0
- package/daemon/dist/db/migrations/131_stream_retention_floor.js +20 -0
- package/daemon/dist/db/migrations/131_stream_retention_floor.js.map +1 -0
- package/daemon/dist/db/migrations/135_seat_identity_process_evidence.d.ts +3 -0
- package/daemon/dist/db/migrations/135_seat_identity_process_evidence.d.ts.map +1 -0
- package/daemon/dist/db/migrations/135_seat_identity_process_evidence.js +16 -0
- package/daemon/dist/db/migrations/135_seat_identity_process_evidence.js.map +1 -0
- package/daemon/dist/domain/active-occupant.d.ts +3 -0
- package/daemon/dist/domain/active-occupant.d.ts.map +1 -1
- package/daemon/dist/domain/active-occupant.js +6 -2
- package/daemon/dist/domain/active-occupant.js.map +1 -1
- package/daemon/dist/domain/activity-taxonomy.d.ts +3 -0
- package/daemon/dist/domain/activity-taxonomy.d.ts.map +1 -1
- package/daemon/dist/domain/activity-taxonomy.js.map +1 -1
- package/daemon/dist/domain/agent-activity-store.d.ts +6 -2
- package/daemon/dist/domain/agent-activity-store.d.ts.map +1 -1
- package/daemon/dist/domain/agent-activity-store.js +13 -4
- package/daemon/dist/domain/agent-activity-store.js.map +1 -1
- package/daemon/dist/domain/agent-manifest.d.ts.map +1 -1
- package/daemon/dist/domain/agent-manifest.js +14 -2
- package/daemon/dist/domain/agent-manifest.js.map +1 -1
- package/daemon/dist/domain/bootstrap-orchestrator.d.ts +3 -0
- package/daemon/dist/domain/bootstrap-orchestrator.d.ts.map +1 -1
- package/daemon/dist/domain/bootstrap-orchestrator.js +20 -6
- package/daemon/dist/domain/bootstrap-orchestrator.js.map +1 -1
- package/daemon/dist/domain/builtin-startup-files.d.ts.map +1 -1
- package/daemon/dist/domain/builtin-startup-files.js +2 -0
- package/daemon/dist/domain/builtin-startup-files.js.map +1 -1
- package/daemon/dist/domain/bundle-behaviour.d.ts.map +1 -1
- package/daemon/dist/domain/bundle-behaviour.js +28 -1
- package/daemon/dist/domain/bundle-behaviour.js.map +1 -1
- package/daemon/dist/domain/claim-service.d.ts +19 -1
- package/daemon/dist/domain/claim-service.d.ts.map +1 -1
- package/daemon/dist/domain/claim-service.js +67 -19
- package/daemon/dist/domain/claim-service.js.map +1 -1
- package/daemon/dist/domain/classification-attempts.d.ts +4 -1
- package/daemon/dist/domain/classification-attempts.d.ts.map +1 -1
- package/daemon/dist/domain/classification-attempts.js +10 -1
- package/daemon/dist/domain/classification-attempts.js.map +1 -1
- package/daemon/dist/domain/classification-sources.d.ts +38 -0
- package/daemon/dist/domain/classification-sources.d.ts.map +1 -1
- package/daemon/dist/domain/classification-sources.js +24 -1
- package/daemon/dist/domain/classification-sources.js.map +1 -1
- package/daemon/dist/domain/claude-activity-hooks.d.ts +2 -2
- package/daemon/dist/domain/claude-activity-hooks.d.ts.map +1 -1
- package/daemon/dist/domain/claude-activity-hooks.js +8 -7
- package/daemon/dist/domain/claude-activity-hooks.js.map +1 -1
- package/daemon/dist/domain/claude-compaction-enforcer.d.ts +109 -7
- package/daemon/dist/domain/claude-compaction-enforcer.d.ts.map +1 -1
- package/daemon/dist/domain/claude-compaction-enforcer.js +447 -52
- package/daemon/dist/domain/claude-compaction-enforcer.js.map +1 -1
- package/daemon/dist/domain/claude-core-plugin-env.d.ts +4 -1
- package/daemon/dist/domain/claude-core-plugin-env.d.ts.map +1 -1
- package/daemon/dist/domain/claude-core-plugin-env.js +23 -12
- package/daemon/dist/domain/claude-core-plugin-env.js.map +1 -1
- package/daemon/dist/domain/claude-managed-launch.d.ts +1 -1
- package/daemon/dist/domain/claude-managed-launch.d.ts.map +1 -1
- package/daemon/dist/domain/claude-managed-launch.js +33 -15
- package/daemon/dist/domain/claude-managed-launch.js.map +1 -1
- package/daemon/dist/domain/codex-owned-plugin-trust.d.ts +26 -0
- package/daemon/dist/domain/codex-owned-plugin-trust.d.ts.map +1 -0
- package/daemon/dist/domain/codex-owned-plugin-trust.js +187 -0
- package/daemon/dist/domain/codex-owned-plugin-trust.js.map +1 -0
- package/daemon/dist/domain/codex-rebuild-permissions.d.ts +54 -0
- package/daemon/dist/domain/codex-rebuild-permissions.d.ts.map +1 -0
- package/daemon/dist/domain/codex-rebuild-permissions.js +134 -0
- package/daemon/dist/domain/codex-rebuild-permissions.js.map +1 -0
- package/daemon/dist/domain/community-harness-launch-result.d.ts +33 -0
- package/daemon/dist/domain/community-harness-launch-result.d.ts.map +1 -0
- package/daemon/dist/domain/community-harness-launch-result.js +93 -0
- package/daemon/dist/domain/community-harness-launch-result.js.map +1 -0
- package/daemon/dist/domain/community-harness-presets.d.ts +27 -2
- package/daemon/dist/domain/community-harness-presets.d.ts.map +1 -1
- package/daemon/dist/domain/community-harness-presets.js +49 -5
- package/daemon/dist/domain/community-harness-presets.js.map +1 -1
- package/daemon/dist/domain/composer-prompts.d.ts +5 -2
- package/daemon/dist/domain/composer-prompts.d.ts.map +1 -1
- package/daemon/dist/domain/composer-prompts.js +2 -2
- package/daemon/dist/domain/composer-prompts.js.map +1 -1
- package/daemon/dist/domain/context-monitor.d.ts.map +1 -1
- package/daemon/dist/domain/context-monitor.js +2 -1
- package/daemon/dist/domain/context-monitor.js.map +1 -1
- package/daemon/dist/domain/continuity-policy-materializer.d.ts +1 -0
- package/daemon/dist/domain/continuity-policy-materializer.d.ts.map +1 -1
- package/daemon/dist/domain/continuity-policy-materializer.js +2 -0
- package/daemon/dist/domain/continuity-policy-materializer.js.map +1 -1
- package/daemon/dist/domain/draft-aware-delivery.d.ts.map +1 -1
- package/daemon/dist/domain/draft-aware-delivery.js +1 -1
- package/daemon/dist/domain/draft-aware-delivery.js.map +1 -1
- package/daemon/dist/domain/execution-view.d.ts.map +1 -1
- package/daemon/dist/domain/execution-view.js +7 -6
- package/daemon/dist/domain/execution-view.js.map +1 -1
- package/daemon/dist/domain/footprint-choice.d.ts +41 -0
- package/daemon/dist/domain/footprint-choice.d.ts.map +1 -0
- package/daemon/dist/domain/footprint-choice.js +42 -0
- package/daemon/dist/domain/footprint-choice.js.map +1 -0
- package/daemon/dist/domain/gateway/delivery-rules-engine.d.ts +3 -0
- package/daemon/dist/domain/gateway/delivery-rules-engine.d.ts.map +1 -1
- package/daemon/dist/domain/gateway/delivery-rules-engine.js +1 -1
- package/daemon/dist/domain/gateway/delivery-rules-engine.js.map +1 -1
- package/daemon/dist/domain/gateway/human-registry.d.ts +32 -0
- package/daemon/dist/domain/gateway/human-registry.d.ts.map +1 -1
- package/daemon/dist/domain/gateway/human-registry.js +71 -4
- package/daemon/dist/domain/gateway/human-registry.js.map +1 -1
- package/daemon/dist/domain/gateway/slack/inbound.d.ts.map +1 -1
- package/daemon/dist/domain/gateway/slack/inbound.js +52 -4
- package/daemon/dist/domain/gateway/slack/inbound.js.map +1 -1
- package/daemon/dist/domain/gateway/slack/message.d.ts +3 -0
- package/daemon/dist/domain/gateway/slack/message.d.ts.map +1 -1
- package/daemon/dist/domain/gateway/slack/message.js +9 -2
- package/daemon/dist/domain/gateway/slack/message.js.map +1 -1
- package/daemon/dist/domain/gateway/slack/queue-access.d.ts +7 -0
- package/daemon/dist/domain/gateway/slack/queue-access.d.ts.map +1 -1
- package/daemon/dist/domain/gateway/slack/queue-access.js +14 -2
- package/daemon/dist/domain/gateway/slack/queue-access.js.map +1 -1
- package/daemon/dist/domain/gateway/slack/slack-delivery.d.ts +1 -3
- package/daemon/dist/domain/gateway/slack/slack-delivery.d.ts.map +1 -1
- package/daemon/dist/domain/gateway/slack/slack-delivery.js +22 -22
- package/daemon/dist/domain/gateway/slack/slack-delivery.js.map +1 -1
- package/daemon/dist/domain/gateway/slack/slack-subsystem.d.ts.map +1 -1
- package/daemon/dist/domain/gateway/slack/slack-subsystem.js +4 -7
- package/daemon/dist/domain/gateway/slack/slack-subsystem.js.map +1 -1
- package/daemon/dist/domain/generated-file-hygiene.js +1 -1
- package/daemon/dist/domain/generated-file-hygiene.js.map +1 -1
- package/daemon/dist/domain/graph-projection.d.ts +3 -0
- package/daemon/dist/domain/graph-projection.d.ts.map +1 -1
- package/daemon/dist/domain/graph-projection.js +2 -0
- package/daemon/dist/domain/graph-projection.js.map +1 -1
- package/daemon/dist/domain/health-diagnosis.d.ts.map +1 -1
- package/daemon/dist/domain/health-diagnosis.js +14 -6
- package/daemon/dist/domain/health-diagnosis.js.map +1 -1
- package/daemon/dist/domain/hot-potato-enforcer.d.ts +1 -1
- package/daemon/dist/domain/human-questions.d.ts +2 -0
- package/daemon/dist/domain/human-questions.d.ts.map +1 -1
- package/daemon/dist/domain/human-questions.js +5 -0
- package/daemon/dist/domain/human-questions.js.map +1 -1
- package/daemon/dist/domain/kernel-boot.d.ts +5 -1
- package/daemon/dist/domain/kernel-boot.d.ts.map +1 -1
- package/daemon/dist/domain/kernel-boot.js +34 -4
- package/daemon/dist/domain/kernel-boot.js.map +1 -1
- package/daemon/dist/domain/managed-blocks.d.ts +32 -1
- package/daemon/dist/domain/managed-blocks.d.ts.map +1 -1
- package/daemon/dist/domain/managed-blocks.js +109 -11
- package/daemon/dist/domain/managed-blocks.js.map +1 -1
- package/daemon/dist/domain/mission-control/mission-control-action-log.d.ts +1 -1
- package/daemon/dist/domain/mission-control/mission-control-action-log.d.ts.map +1 -1
- package/daemon/dist/domain/mission-control/mission-control-action-log.js +3 -0
- package/daemon/dist/domain/mission-control/mission-control-action-log.js.map +1 -1
- package/daemon/dist/domain/mission-control/mission-control-write-contract.d.ts +21 -0
- package/daemon/dist/domain/mission-control/mission-control-write-contract.d.ts.map +1 -1
- package/daemon/dist/domain/mission-control/mission-control-write-contract.js +110 -0
- package/daemon/dist/domain/mission-control/mission-control-write-contract.js.map +1 -1
- package/daemon/dist/domain/model-divergence/current-model-reader.d.ts +2 -0
- package/daemon/dist/domain/model-divergence/current-model-reader.d.ts.map +1 -1
- package/daemon/dist/domain/model-divergence/current-model-reader.js +7 -0
- package/daemon/dist/domain/model-divergence/current-model-reader.js.map +1 -1
- package/daemon/dist/domain/model-divergence/model-divergence-monitor.d.ts +10 -1
- package/daemon/dist/domain/model-divergence/model-divergence-monitor.d.ts.map +1 -1
- package/daemon/dist/domain/model-divergence/model-divergence-monitor.js +24 -5
- package/daemon/dist/domain/model-divergence/model-divergence-monitor.js.map +1 -1
- package/daemon/dist/domain/native-process-lineage.d.ts +3 -0
- package/daemon/dist/domain/native-process-lineage.d.ts.map +1 -1
- package/daemon/dist/domain/native-process-lineage.js +60 -2
- package/daemon/dist/domain/native-process-lineage.js.map +1 -1
- package/daemon/dist/domain/native-resume-probe-evidence.d.ts +19 -0
- package/daemon/dist/domain/native-resume-probe-evidence.d.ts.map +1 -0
- package/daemon/dist/domain/native-resume-probe-evidence.js +37 -0
- package/daemon/dist/domain/native-resume-probe-evidence.js.map +1 -0
- package/daemon/dist/domain/native-resume-probe.d.ts +7 -0
- package/daemon/dist/domain/native-resume-probe.d.ts.map +1 -1
- package/daemon/dist/domain/native-resume-probe.js +12 -9
- package/daemon/dist/domain/native-resume-probe.js.map +1 -1
- package/daemon/dist/domain/node-inventory.d.ts +49 -1
- package/daemon/dist/domain/node-inventory.d.ts.map +1 -1
- package/daemon/dist/domain/node-inventory.js +119 -45
- package/daemon/dist/domain/node-inventory.js.map +1 -1
- package/daemon/dist/domain/node-launcher.d.ts.map +1 -1
- package/daemon/dist/domain/node-launcher.js +9 -3
- package/daemon/dist/domain/node-launcher.js.map +1 -1
- package/daemon/dist/domain/occupant-invalidator.d.ts +16 -4
- package/daemon/dist/domain/occupant-invalidator.d.ts.map +1 -1
- package/daemon/dist/domain/occupant-invalidator.js +25 -5
- package/daemon/dist/domain/occupant-invalidator.js.map +1 -1
- package/daemon/dist/domain/operation-correlation.d.ts +78 -0
- package/daemon/dist/domain/operation-correlation.d.ts.map +1 -0
- package/daemon/dist/domain/operation-correlation.js +54 -0
- package/daemon/dist/domain/operation-correlation.js.map +1 -0
- package/daemon/dist/domain/permission-account.d.ts +28 -0
- package/daemon/dist/domain/permission-account.d.ts.map +1 -0
- package/daemon/dist/domain/permission-account.js +102 -0
- package/daemon/dist/domain/permission-account.js.map +1 -0
- package/daemon/dist/domain/permission-drift.d.ts.map +1 -1
- package/daemon/dist/domain/permission-drift.js +11 -7
- package/daemon/dist/domain/permission-drift.js.map +1 -1
- package/daemon/dist/domain/pod-bundle-assembler.d.ts +1 -0
- package/daemon/dist/domain/pod-bundle-assembler.d.ts.map +1 -1
- package/daemon/dist/domain/pod-bundle-assembler.js +25 -0
- package/daemon/dist/domain/pod-bundle-assembler.js.map +1 -1
- package/daemon/dist/domain/policies/artifact-pool-helpers.d.ts +7 -0
- package/daemon/dist/domain/policies/artifact-pool-helpers.d.ts.map +1 -1
- package/daemon/dist/domain/policies/artifact-pool-helpers.js +8 -4
- package/daemon/dist/domain/policies/artifact-pool-helpers.js.map +1 -1
- package/daemon/dist/domain/policies/context-usage-threshold.d.ts.map +1 -1
- package/daemon/dist/domain/policies/context-usage-threshold.js +109 -21
- package/daemon/dist/domain/policies/context-usage-threshold.js.map +1 -1
- package/daemon/dist/domain/policies/edge-artifact-required.d.ts +6 -1
- package/daemon/dist/domain/policies/edge-artifact-required.d.ts.map +1 -1
- package/daemon/dist/domain/policies/edge-artifact-required.js +18 -13
- package/daemon/dist/domain/policies/edge-artifact-required.js.map +1 -1
- package/daemon/dist/domain/policies/mode-scheduled-end.d.ts +2 -0
- package/daemon/dist/domain/policies/mode-scheduled-end.d.ts.map +1 -1
- package/daemon/dist/domain/policies/mode-scheduled-end.js +5 -1
- package/daemon/dist/domain/policies/mode-scheduled-end.js.map +1 -1
- package/daemon/dist/domain/policies/periodic-reminder.d.ts +10 -0
- package/daemon/dist/domain/policies/periodic-reminder.d.ts.map +1 -1
- package/daemon/dist/domain/policies/periodic-reminder.js +11 -6
- package/daemon/dist/domain/policies/periodic-reminder.js.map +1 -1
- package/daemon/dist/domain/policies/types.d.ts +25 -0
- package/daemon/dist/domain/policies/types.d.ts.map +1 -1
- package/daemon/dist/domain/policies/workflow-keepalive.d.ts +6 -1
- package/daemon/dist/domain/policies/workflow-keepalive.d.ts.map +1 -1
- package/daemon/dist/domain/policies/workflow-keepalive.js +11 -5
- package/daemon/dist/domain/policies/workflow-keepalive.js.map +1 -1
- package/daemon/dist/domain/profile-resolution-worker.d.ts +7 -0
- package/daemon/dist/domain/profile-resolution-worker.d.ts.map +1 -0
- package/daemon/dist/domain/profile-resolution-worker.js +83 -0
- package/daemon/dist/domain/profile-resolution-worker.js.map +1 -0
- package/daemon/dist/domain/profile-resolver.d.ts +6 -0
- package/daemon/dist/domain/profile-resolver.d.ts.map +1 -1
- package/daemon/dist/domain/profile-resolver.js +14 -2
- package/daemon/dist/domain/profile-resolver.js.map +1 -1
- package/daemon/dist/domain/project-classifier.d.ts +7 -0
- package/daemon/dist/domain/project-classifier.d.ts.map +1 -1
- package/daemon/dist/domain/project-classifier.js +26 -0
- package/daemon/dist/domain/project-classifier.js.map +1 -1
- package/daemon/dist/domain/provider/subscription-move-report.d.ts +86 -0
- package/daemon/dist/domain/provider/subscription-move-report.d.ts.map +1 -0
- package/daemon/dist/domain/provider/subscription-move-report.js +227 -0
- package/daemon/dist/domain/provider/subscription-move-report.js.map +1 -0
- package/daemon/dist/domain/ps-projection.d.ts +6 -35
- package/daemon/dist/domain/ps-projection.d.ts.map +1 -1
- package/daemon/dist/domain/ps-projection.js +14 -55
- package/daemon/dist/domain/ps-projection.js.map +1 -1
- package/daemon/dist/domain/queue-owner.d.ts +6 -3
- package/daemon/dist/domain/queue-owner.d.ts.map +1 -1
- package/daemon/dist/domain/queue-owner.js +10 -5
- package/daemon/dist/domain/queue-owner.js.map +1 -1
- package/daemon/dist/domain/queue-pickup.d.ts +5 -2
- package/daemon/dist/domain/queue-pickup.d.ts.map +1 -1
- package/daemon/dist/domain/queue-pickup.js +19 -2
- package/daemon/dist/domain/queue-pickup.js.map +1 -1
- package/daemon/dist/domain/queue-repository.d.ts +54 -21
- package/daemon/dist/domain/queue-repository.d.ts.map +1 -1
- package/daemon/dist/domain/queue-repository.js +257 -97
- package/daemon/dist/domain/queue-repository.js.map +1 -1
- package/daemon/dist/domain/queue-retention.d.ts +18 -0
- package/daemon/dist/domain/queue-retention.d.ts.map +1 -1
- package/daemon/dist/domain/queue-retention.js +74 -0
- package/daemon/dist/domain/queue-retention.js.map +1 -1
- package/daemon/dist/domain/queue-stuck-sweep.d.ts +2 -0
- package/daemon/dist/domain/queue-stuck-sweep.d.ts.map +1 -1
- package/daemon/dist/domain/queue-stuck-sweep.js +37 -3
- package/daemon/dist/domain/queue-stuck-sweep.js.map +1 -1
- package/daemon/dist/domain/queue-wait-backoff.d.ts +3 -0
- package/daemon/dist/domain/queue-wait-backoff.d.ts.map +1 -1
- package/daemon/dist/domain/queue-wait-backoff.js +9 -0
- package/daemon/dist/domain/queue-wait-backoff.js.map +1 -1
- package/daemon/dist/domain/queue-waiting.d.ts +2 -0
- package/daemon/dist/domain/queue-waiting.d.ts.map +1 -1
- package/daemon/dist/domain/queue-waiting.js.map +1 -1
- package/daemon/dist/domain/queue-wake-ladder.d.ts.map +1 -1
- package/daemon/dist/domain/queue-wake-ladder.js +18 -6
- package/daemon/dist/domain/queue-wake-ladder.js.map +1 -1
- package/daemon/dist/domain/reconciler.d.ts +23 -0
- package/daemon/dist/domain/reconciler.d.ts.map +1 -1
- package/daemon/dist/domain/reconciler.js +44 -1
- package/daemon/dist/domain/reconciler.js.map +1 -1
- package/daemon/dist/domain/rehydrate-eligibility.d.ts.map +1 -1
- package/daemon/dist/domain/rehydrate-eligibility.js +2 -3
- package/daemon/dist/domain/rehydrate-eligibility.js.map +1 -1
- package/daemon/dist/domain/restore-guidance.d.ts +7 -0
- package/daemon/dist/domain/restore-guidance.d.ts.map +1 -1
- package/daemon/dist/domain/restore-guidance.js +20 -8
- package/daemon/dist/domain/restore-guidance.js.map +1 -1
- package/daemon/dist/domain/restore-orchestrator.d.ts +13 -1
- package/daemon/dist/domain/restore-orchestrator.d.ts.map +1 -1
- package/daemon/dist/domain/restore-orchestrator.js +151 -26
- package/daemon/dist/domain/restore-orchestrator.js.map +1 -1
- package/daemon/dist/domain/restore-plan-preview.d.ts +7 -2
- package/daemon/dist/domain/restore-plan-preview.d.ts.map +1 -1
- package/daemon/dist/domain/restore-plan-preview.js +28 -7
- package/daemon/dist/domain/restore-plan-preview.js.map +1 -1
- package/daemon/dist/domain/restore-policy.d.ts +4 -0
- package/daemon/dist/domain/restore-policy.d.ts.map +1 -1
- package/daemon/dist/domain/restore-policy.js +11 -0
- package/daemon/dist/domain/restore-policy.js.map +1 -1
- package/daemon/dist/domain/rig-edge-ops.d.ts +58 -0
- package/daemon/dist/domain/rig-edge-ops.d.ts.map +1 -0
- package/daemon/dist/domain/rig-edge-ops.js +113 -0
- package/daemon/dist/domain/rig-edge-ops.js.map +1 -0
- package/daemon/dist/domain/rig-name-override.d.ts +14 -0
- package/daemon/dist/domain/rig-name-override.d.ts.map +1 -0
- package/daemon/dist/domain/rig-name-override.js +38 -0
- package/daemon/dist/domain/rig-name-override.js.map +1 -0
- package/daemon/dist/domain/rig-repository.d.ts +10 -2
- package/daemon/dist/domain/rig-repository.d.ts.map +1 -1
- package/daemon/dist/domain/rig-repository.js +14 -0
- package/daemon/dist/domain/rig-repository.js.map +1 -1
- package/daemon/dist/domain/rig-status-compose.d.ts +1 -1
- package/daemon/dist/domain/rig-status-compose.d.ts.map +1 -1
- package/daemon/dist/domain/rig-status-compose.js +3 -1
- package/daemon/dist/domain/rig-status-compose.js.map +1 -1
- package/daemon/dist/domain/rig-teardown.d.ts +19 -0
- package/daemon/dist/domain/rig-teardown.d.ts.map +1 -1
- package/daemon/dist/domain/rig-teardown.js +78 -8
- package/daemon/dist/domain/rig-teardown.js.map +1 -1
- package/daemon/dist/domain/rigspec-codec.d.ts.map +1 -1
- package/daemon/dist/domain/rigspec-codec.js +10 -0
- package/daemon/dist/domain/rigspec-codec.js.map +1 -1
- package/daemon/dist/domain/rigspec-exporter.d.ts +3 -0
- package/daemon/dist/domain/rigspec-exporter.d.ts.map +1 -1
- package/daemon/dist/domain/rigspec-exporter.js +22 -0
- package/daemon/dist/domain/rigspec-exporter.js.map +1 -1
- package/daemon/dist/domain/rigspec-instantiator.d.ts +30 -2
- package/daemon/dist/domain/rigspec-instantiator.d.ts.map +1 -1
- package/daemon/dist/domain/rigspec-instantiator.js +262 -47
- package/daemon/dist/domain/rigspec-instantiator.js.map +1 -1
- package/daemon/dist/domain/rigspec-preflight.d.ts.map +1 -1
- package/daemon/dist/domain/rigspec-preflight.js +15 -2
- package/daemon/dist/domain/rigspec-preflight.js.map +1 -1
- package/daemon/dist/domain/rigspec-schema.d.ts +3 -0
- package/daemon/dist/domain/rigspec-schema.d.ts.map +1 -1
- package/daemon/dist/domain/rigspec-schema.js +67 -3
- package/daemon/dist/domain/rigspec-schema.js.map +1 -1
- package/daemon/dist/domain/runtime-adapter.d.ts +20 -1
- package/daemon/dist/domain/runtime-adapter.d.ts.map +1 -1
- package/daemon/dist/domain/runtime-adapter.js +5 -1
- package/daemon/dist/domain/runtime-adapter.js.map +1 -1
- package/daemon/dist/domain/scope/scope-view-projection.d.ts +6 -0
- package/daemon/dist/domain/scope/scope-view-projection.d.ts.map +1 -1
- package/daemon/dist/domain/scope/scope-view-projection.js +26 -10
- package/daemon/dist/domain/scope/scope-view-projection.js.map +1 -1
- package/daemon/dist/domain/seat-activity-service.d.ts +4 -2
- package/daemon/dist/domain/seat-activity-service.d.ts.map +1 -1
- package/daemon/dist/domain/seat-activity-service.js +13 -5
- package/daemon/dist/domain/seat-activity-service.js.map +1 -1
- package/daemon/dist/domain/seat-attention-reconciler.d.ts +19 -0
- package/daemon/dist/domain/seat-attention-reconciler.d.ts.map +1 -1
- package/daemon/dist/domain/seat-attention-reconciler.js +60 -6
- package/daemon/dist/domain/seat-attention-reconciler.js.map +1 -1
- package/daemon/dist/domain/seat-delivery-guard.d.ts +20 -1
- package/daemon/dist/domain/seat-delivery-guard.d.ts.map +1 -1
- package/daemon/dist/domain/seat-delivery-guard.js +66 -11
- package/daemon/dist/domain/seat-delivery-guard.js.map +1 -1
- package/daemon/dist/domain/seat-handover-service.d.ts +8 -0
- package/daemon/dist/domain/seat-handover-service.d.ts.map +1 -1
- package/daemon/dist/domain/seat-handover-service.js +74 -4
- package/daemon/dist/domain/seat-handover-service.js.map +1 -1
- package/daemon/dist/domain/seat-identity-store.d.ts +11 -1
- package/daemon/dist/domain/seat-identity-store.d.ts.map +1 -1
- package/daemon/dist/domain/seat-identity-store.js +29 -4
- package/daemon/dist/domain/seat-identity-store.js.map +1 -1
- package/daemon/dist/domain/seat-launch-additions.d.ts +115 -0
- package/daemon/dist/domain/seat-launch-additions.d.ts.map +1 -0
- package/daemon/dist/domain/seat-launch-additions.js +439 -0
- package/daemon/dist/domain/seat-launch-additions.js.map +1 -0
- package/daemon/dist/domain/seat-launch-environment.d.ts +1 -1
- package/daemon/dist/domain/seat-launch-environment.d.ts.map +1 -1
- package/daemon/dist/domain/seat-launch-environment.js +1 -1
- package/daemon/dist/domain/seat-launch-environment.js.map +1 -1
- package/daemon/dist/domain/seat-lifecycle-service.d.ts +79 -4
- package/daemon/dist/domain/seat-lifecycle-service.d.ts.map +1 -1
- package/daemon/dist/domain/seat-lifecycle-service.js +202 -12
- package/daemon/dist/domain/seat-lifecycle-service.js.map +1 -1
- package/daemon/dist/domain/seat-skill-apply.d.ts +139 -0
- package/daemon/dist/domain/seat-skill-apply.d.ts.map +1 -0
- package/daemon/dist/domain/seat-skill-apply.js +221 -0
- package/daemon/dist/domain/seat-skill-apply.js.map +1 -0
- package/daemon/dist/domain/seat-skill-storage.d.ts +295 -0
- package/daemon/dist/domain/seat-skill-storage.d.ts.map +1 -0
- package/daemon/dist/domain/seat-skill-storage.js +850 -0
- package/daemon/dist/domain/seat-skill-storage.js.map +1 -0
- package/daemon/dist/domain/seat-status-service.d.ts +9 -0
- package/daemon/dist/domain/seat-status-service.d.ts.map +1 -1
- package/daemon/dist/domain/seat-status-service.js +15 -3
- package/daemon/dist/domain/seat-status-service.js.map +1 -1
- package/daemon/dist/domain/session-registry.d.ts +4 -0
- package/daemon/dist/domain/session-registry.d.ts.map +1 -1
- package/daemon/dist/domain/session-registry.js +13 -0
- package/daemon/dist/domain/session-registry.js.map +1 -1
- package/daemon/dist/domain/session-transport.d.ts +52 -21
- package/daemon/dist/domain/session-transport.d.ts.map +1 -1
- package/daemon/dist/domain/session-transport.js +150 -47
- package/daemon/dist/domain/session-transport.js.map +1 -1
- package/daemon/dist/domain/skill-catalog.d.ts +16 -0
- package/daemon/dist/domain/skill-catalog.d.ts.map +1 -1
- package/daemon/dist/domain/skill-catalog.js +15 -6
- package/daemon/dist/domain/skill-catalog.js.map +1 -1
- package/daemon/dist/domain/skill-discovery.d.ts +17 -2
- package/daemon/dist/domain/skill-discovery.d.ts.map +1 -1
- package/daemon/dist/domain/skill-discovery.js +44 -5
- package/daemon/dist/domain/skill-discovery.js.map +1 -1
- package/daemon/dist/domain/startup-orchestrator.d.ts +26 -2
- package/daemon/dist/domain/startup-orchestrator.d.ts.map +1 -1
- package/daemon/dist/domain/startup-orchestrator.js +226 -14
- package/daemon/dist/domain/startup-orchestrator.js.map +1 -1
- package/daemon/dist/domain/stream-dispositions.d.ts +51 -0
- package/daemon/dist/domain/stream-dispositions.d.ts.map +1 -0
- package/daemon/dist/domain/stream-dispositions.js +112 -0
- package/daemon/dist/domain/stream-dispositions.js.map +1 -0
- package/daemon/dist/domain/stream-store.d.ts +22 -0
- package/daemon/dist/domain/stream-store.d.ts.map +1 -1
- package/daemon/dist/domain/stream-store.js +49 -6
- package/daemon/dist/domain/stream-store.js.map +1 -1
- package/daemon/dist/domain/stream-subscriptions.d.ts +94 -0
- package/daemon/dist/domain/stream-subscriptions.d.ts.map +1 -0
- package/daemon/dist/domain/stream-subscriptions.js +160 -0
- package/daemon/dist/domain/stream-subscriptions.js.map +1 -0
- package/daemon/dist/domain/successor-session-launcher.d.ts +6 -0
- package/daemon/dist/domain/successor-session-launcher.d.ts.map +1 -1
- package/daemon/dist/domain/successor-session-launcher.js +5 -2
- package/daemon/dist/domain/successor-session-launcher.js.map +1 -1
- package/daemon/dist/domain/terminal/herdr-adapter.d.ts +2 -0
- package/daemon/dist/domain/terminal/herdr-adapter.d.ts.map +1 -1
- package/daemon/dist/domain/terminal/herdr-adapter.js +104 -1
- package/daemon/dist/domain/terminal/herdr-adapter.js.map +1 -1
- package/daemon/dist/domain/terminal/herdr-sessions.d.ts +9 -0
- package/daemon/dist/domain/terminal/herdr-sessions.d.ts.map +1 -0
- package/daemon/dist/domain/terminal/herdr-sessions.js +23 -0
- package/daemon/dist/domain/terminal/herdr-sessions.js.map +1 -0
- package/daemon/dist/domain/terminal/terminal-provider.d.ts +4 -0
- package/daemon/dist/domain/terminal/terminal-provider.d.ts.map +1 -1
- package/daemon/dist/domain/terminal/terminal-service.d.ts +12 -3
- package/daemon/dist/domain/terminal/terminal-service.d.ts.map +1 -1
- package/daemon/dist/domain/terminal/terminal-service.js +42 -17
- package/daemon/dist/domain/terminal/terminal-service.js.map +1 -1
- package/daemon/dist/domain/terminal/view-composer.d.ts.map +1 -1
- package/daemon/dist/domain/terminal/view-composer.js +1 -0
- package/daemon/dist/domain/terminal/view-composer.js.map +1 -1
- package/daemon/dist/domain/terminal-policy.d.ts +80 -0
- package/daemon/dist/domain/terminal-policy.d.ts.map +1 -0
- package/daemon/dist/domain/terminal-policy.js +117 -0
- package/daemon/dist/domain/terminal-policy.js.map +1 -0
- package/daemon/dist/domain/terminal-seat.d.ts +9 -0
- package/daemon/dist/domain/terminal-seat.d.ts.map +1 -0
- package/daemon/dist/domain/terminal-seat.js +37 -0
- package/daemon/dist/domain/terminal-seat.js.map +1 -0
- package/daemon/dist/domain/topology-converge.d.ts +25 -2
- package/daemon/dist/domain/topology-converge.d.ts.map +1 -1
- package/daemon/dist/domain/topology-converge.js +14 -1
- package/daemon/dist/domain/topology-converge.js.map +1 -1
- package/daemon/dist/domain/types.d.ts +58 -2
- package/daemon/dist/domain/types.d.ts.map +1 -1
- package/daemon/dist/domain/types.js.map +1 -1
- package/daemon/dist/domain/urgent-line.d.ts +4 -0
- package/daemon/dist/domain/urgent-line.d.ts.map +1 -0
- package/daemon/dist/domain/urgent-line.js +7 -0
- package/daemon/dist/domain/urgent-line.js.map +1 -0
- package/daemon/dist/domain/usage-series.d.ts.map +1 -1
- package/daemon/dist/domain/usage-series.js +6 -2
- package/daemon/dist/domain/usage-series.js.map +1 -1
- package/daemon/dist/domain/user-settings/settings-browser.js +2 -2
- package/daemon/dist/domain/user-settings/settings-browser.js.map +1 -1
- package/daemon/dist/domain/user-settings/settings-store.d.ts +3 -1
- package/daemon/dist/domain/user-settings/settings-store.d.ts.map +1 -1
- package/daemon/dist/domain/user-settings/settings-store.js +73 -1
- package/daemon/dist/domain/user-settings/settings-store.js.map +1 -1
- package/daemon/dist/domain/view-projector.d.ts.map +1 -1
- package/daemon/dist/domain/view-projector.js +2 -1
- package/daemon/dist/domain/view-projector.js.map +1 -1
- package/daemon/dist/domain/watchdog-delivery.js +1 -1
- package/daemon/dist/domain/watchdog-delivery.js.map +1 -1
- package/daemon/dist/domain/watchdog-job-update.d.ts +21 -0
- package/daemon/dist/domain/watchdog-job-update.d.ts.map +1 -0
- package/daemon/dist/domain/watchdog-job-update.js +143 -0
- package/daemon/dist/domain/watchdog-job-update.js.map +1 -0
- package/daemon/dist/domain/watchdog-jobs-repository.d.ts +63 -7
- package/daemon/dist/domain/watchdog-jobs-repository.d.ts.map +1 -1
- package/daemon/dist/domain/watchdog-jobs-repository.js +190 -21
- package/daemon/dist/domain/watchdog-jobs-repository.js.map +1 -1
- package/daemon/dist/domain/watchdog-policy-engine.d.ts +23 -0
- package/daemon/dist/domain/watchdog-policy-engine.d.ts.map +1 -1
- package/daemon/dist/domain/watchdog-policy-engine.js +46 -13
- package/daemon/dist/domain/watchdog-policy-engine.js.map +1 -1
- package/daemon/dist/domain/workflow-exception-escalation.d.ts.map +1 -1
- package/daemon/dist/domain/workflow-exception-escalation.js +7 -3
- package/daemon/dist/domain/workflow-exception-escalation.js.map +1 -1
- package/daemon/dist/domain/workflow-projector.d.ts +5 -2
- package/daemon/dist/domain/workflow-projector.d.ts.map +1 -1
- package/daemon/dist/domain/workflow-projector.js +16 -7
- package/daemon/dist/domain/workflow-projector.js.map +1 -1
- package/daemon/dist/domain/workflow-runtime.d.ts +8 -2
- package/daemon/dist/domain/workflow-runtime.d.ts.map +1 -1
- package/daemon/dist/domain/workflow-runtime.js +30 -7
- package/daemon/dist/domain/workflow-runtime.js.map +1 -1
- package/daemon/dist/domain/workspace/project-read.d.ts +2 -0
- package/daemon/dist/domain/workspace/project-read.d.ts.map +1 -1
- package/daemon/dist/domain/workspace/project-read.js +10 -1
- package/daemon/dist/domain/workspace/project-read.js.map +1 -1
- package/daemon/dist/index.d.ts.map +1 -1
- package/daemon/dist/index.js +2 -0
- package/daemon/dist/index.js.map +1 -1
- package/daemon/dist/router-line-surface.d.ts +2 -0
- package/daemon/dist/router-line-surface.d.ts.map +1 -0
- package/daemon/dist/router-line-surface.js +3 -0
- package/daemon/dist/router-line-surface.js.map +1 -0
- package/daemon/dist/routes/activity.d.ts.map +1 -1
- package/daemon/dist/routes/activity.js +3 -0
- package/daemon/dist/routes/activity.js.map +1 -1
- package/daemon/dist/routes/agent-images.d.ts.map +1 -1
- package/daemon/dist/routes/agent-images.js +10 -2
- package/daemon/dist/routes/agent-images.js.map +1 -1
- package/daemon/dist/routes/attention.d.ts.map +1 -1
- package/daemon/dist/routes/attention.js +30 -3
- package/daemon/dist/routes/attention.js.map +1 -1
- package/daemon/dist/routes/bootstrap-failure-response.js +2 -2
- package/daemon/dist/routes/bootstrap-failure-response.js.map +1 -1
- package/daemon/dist/routes/bundles.js +1 -1
- package/daemon/dist/routes/bundles.js.map +1 -1
- package/daemon/dist/routes/compaction.d.ts.map +1 -1
- package/daemon/dist/routes/compaction.js +31 -10
- package/daemon/dist/routes/compaction.js.map +1 -1
- package/daemon/dist/routes/hosts.d.ts.map +1 -1
- package/daemon/dist/routes/hosts.js +2 -0
- package/daemon/dist/routes/hosts.js.map +1 -1
- package/daemon/dist/routes/mission-control.d.ts.map +1 -1
- package/daemon/dist/routes/mission-control.js +5 -1
- package/daemon/dist/routes/mission-control.js.map +1 -1
- package/daemon/dist/routes/projects.d.ts.map +1 -1
- package/daemon/dist/routes/projects.js +59 -12
- package/daemon/dist/routes/projects.js.map +1 -1
- package/daemon/dist/routes/proof.js +2 -2
- package/daemon/dist/routes/proof.js.map +1 -1
- package/daemon/dist/routes/provider.d.ts.map +1 -1
- package/daemon/dist/routes/provider.js +87 -0
- package/daemon/dist/routes/provider.js.map +1 -1
- package/daemon/dist/routes/queue.d.ts.map +1 -1
- package/daemon/dist/routes/queue.js +52 -3
- package/daemon/dist/routes/queue.js.map +1 -1
- package/daemon/dist/routes/rigs.d.ts.map +1 -1
- package/daemon/dist/routes/rigs.js +75 -10
- package/daemon/dist/routes/rigs.js.map +1 -1
- package/daemon/dist/routes/rigspec.d.ts.map +1 -1
- package/daemon/dist/routes/rigspec.js +38 -12
- package/daemon/dist/routes/rigspec.js.map +1 -1
- package/daemon/dist/routes/scopes.d.ts.map +1 -1
- package/daemon/dist/routes/scopes.js +30 -7
- package/daemon/dist/routes/scopes.js.map +1 -1
- package/daemon/dist/routes/seat.d.ts.map +1 -1
- package/daemon/dist/routes/seat.js +19 -3
- package/daemon/dist/routes/seat.js.map +1 -1
- package/daemon/dist/routes/sessions.js +5 -0
- package/daemon/dist/routes/sessions.js.map +1 -1
- package/daemon/dist/routes/skills.d.ts.map +1 -1
- package/daemon/dist/routes/skills.js +54 -1
- package/daemon/dist/routes/skills.js.map +1 -1
- package/daemon/dist/routes/stream.d.ts.map +1 -1
- package/daemon/dist/routes/stream.js +62 -13
- package/daemon/dist/routes/stream.js.map +1 -1
- package/daemon/dist/routes/terminal.d.ts.map +1 -1
- package/daemon/dist/routes/terminal.js +20 -11
- package/daemon/dist/routes/terminal.js.map +1 -1
- package/daemon/dist/routes/transport.d.ts.map +1 -1
- package/daemon/dist/routes/transport.js +24 -2
- package/daemon/dist/routes/transport.js.map +1 -1
- package/daemon/dist/routes/up.js +5 -0
- package/daemon/dist/routes/up.js.map +1 -1
- package/daemon/dist/routes/watchdog.d.ts +1 -0
- package/daemon/dist/routes/watchdog.d.ts.map +1 -1
- package/daemon/dist/routes/watchdog.js +52 -3
- package/daemon/dist/routes/watchdog.js.map +1 -1
- package/daemon/dist/routes/workflow.d.ts.map +1 -1
- package/daemon/dist/routes/workflow.js +24 -13
- package/daemon/dist/routes/workflow.js.map +1 -1
- package/daemon/dist/server.d.ts +2 -0
- package/daemon/dist/server.d.ts.map +1 -1
- package/daemon/dist/server.js +4 -1
- package/daemon/dist/server.js.map +1 -1
- package/daemon/dist/skill-loadout-surface.d.ts +2 -0
- package/daemon/dist/skill-loadout-surface.d.ts.map +1 -1
- package/daemon/dist/skill-loadout-surface.js +2 -0
- package/daemon/dist/skill-loadout-surface.js.map +1 -1
- package/daemon/dist/startup.d.ts.map +1 -1
- package/daemon/dist/startup.js +54 -21
- package/daemon/dist/startup.js.map +1 -1
- package/daemon/dist/terminal/TerminalSessionBroker.d.ts.map +1 -1
- package/daemon/dist/terminal/TerminalSessionBroker.js +9 -2
- package/daemon/dist/terminal/TerminalSessionBroker.js.map +1 -1
- package/daemon/docs/reference/a2a-agents.md +343 -0
- package/daemon/docs/reference/acp-agents.md +77 -0
- package/daemon/docs/reference/agent-spec.md +7 -5
- package/daemon/docs/reference/agent-startup-guide.md +46 -0
- package/daemon/docs/reference/agent-state-taxonomy.md +27 -2
- package/daemon/docs/reference/checked-seat-stop.md +11 -0
- package/daemon/docs/reference/community-harness-examples/cursor/cursor.yaml +13 -0
- package/daemon/docs/reference/community-harness-examples/cursor/openrig-cursor-launch +61 -0
- package/daemon/docs/reference/community-harness-examples/hermes/config.yaml.example +18 -0
- package/daemon/docs/reference/community-harness-examples/hermes/hermes.yaml +12 -0
- package/daemon/docs/reference/community-harness-examples/hermes/openrig-hermes-launch +34 -0
- package/daemon/docs/reference/community-harness-examples/openclaw/openclaw.yaml +13 -0
- package/daemon/docs/reference/community-harness-examples/openclaw/openrig-openclaw-launch +38 -0
- package/daemon/docs/reference/community-harness-presets.md +179 -0
- package/daemon/docs/reference/getting-started.md +65 -6
- package/daemon/docs/reference/operation-correlation.md +9 -0
- package/daemon/docs/reference/project-workspace.md +6 -0
- package/daemon/docs/reference/quickstart.md +1 -1
- package/daemon/docs/reference/refocus-channel.md +6 -4
- package/daemon/docs/reference/rig-spec.md +82 -2
- package/daemon/docs/reference/seat-delivery.md +73 -2
- package/daemon/docs/reference/slack-app-setup.md +3 -1
- package/daemon/docs/reference/stream-classifier-worker.md +28 -0
- package/daemon/docs/reference/telemetry.md +3 -0
- package/daemon/docs/reference/terminal-sessions.md +90 -0
- package/daemon/docs/reference/topology-naming.md +1 -1
- package/daemon/docs/reference/whats-new.md +162 -113
- package/daemon/specs/agents/shared/runtime/claude-settings.fragment.json +0 -3
- package/daemon/specs/agents/shared/skills/core/messaging-the-human/SKILL.md +19 -4
- package/daemon/specs/agents/shared/skills/core/openrig-herdr/SKILL.md +3 -0
- package/daemon/specs/agents/shared/skills/core/openrig-software-factory/references/worked-example.md +2 -2
- package/daemon/specs/rigs/launch/kernel/agents/operator/agent/guidance/role.md +36 -10
- package/daemon/specs/rigs/launch/kernel/agents/queue/worker/guidance/role.md +11 -0
- package/daemon/specs/rigs/launch/kernel/agents/queue/worker/startup/context.md +3 -1
- package/daemon/specs/rigs/launch/secrets-manager/secrets-manager.compose.yaml +1 -1
- package/dist/acp/connector.d.ts +72 -0
- package/dist/acp/connector.d.ts.map +1 -0
- package/dist/acp/connector.js +218 -0
- package/dist/acp/connector.js.map +1 -0
- package/dist/acp/json-rpc-stdio.d.ts +53 -0
- package/dist/acp/json-rpc-stdio.d.ts.map +1 -0
- package/dist/acp/json-rpc-stdio.js +141 -0
- package/dist/acp/json-rpc-stdio.js.map +1 -0
- package/dist/acp/run-processes.d.ts +10 -0
- package/dist/acp/run-processes.d.ts.map +1 -0
- package/dist/acp/run-processes.js +33 -0
- package/dist/acp/run-processes.js.map +1 -0
- package/dist/build-info.js +3 -3
- package/dist/client.d.ts +7 -2
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +14 -7
- package/dist/client.js.map +1 -1
- package/dist/commands/acp.d.ts +11 -0
- package/dist/commands/acp.d.ts.map +1 -0
- package/dist/commands/acp.js +198 -0
- package/dist/commands/acp.js.map +1 -0
- package/dist/commands/attach.js +1 -1
- package/dist/commands/attach.js.map +1 -1
- package/dist/commands/auth.d.ts +3 -0
- package/dist/commands/auth.d.ts.map +1 -1
- package/dist/commands/auth.js +39 -10
- package/dist/commands/auth.js.map +1 -1
- package/dist/commands/compact-plan.d.ts +2 -0
- package/dist/commands/compact-plan.d.ts.map +1 -1
- package/dist/commands/compact-plan.js +38 -3
- package/dist/commands/compact-plan.js.map +1 -1
- package/dist/commands/compact.js +1 -1
- package/dist/commands/compact.js.map +1 -1
- package/dist/commands/config.d.ts.map +1 -1
- package/dist/commands/config.js +7 -1
- package/dist/commands/config.js.map +1 -1
- package/dist/commands/create.js +2 -2
- package/dist/commands/create.js.map +1 -1
- package/dist/commands/daemon.d.ts.map +1 -1
- package/dist/commands/daemon.js +2 -0
- package/dist/commands/daemon.js.map +1 -1
- package/dist/commands/down.d.ts +5 -1
- package/dist/commands/down.d.ts.map +1 -1
- package/dist/commands/down.js +87 -3
- package/dist/commands/down.js.map +1 -1
- package/dist/commands/edge.d.ts +4 -0
- package/dist/commands/edge.d.ts.map +1 -0
- package/dist/commands/edge.js +135 -0
- package/dist/commands/edge.js.map +1 -0
- package/dist/commands/export.d.ts +1 -0
- package/dist/commands/export.d.ts.map +1 -1
- package/dist/commands/export.js +51 -0
- package/dist/commands/export.js.map +1 -1
- package/dist/commands/fork.d.ts.map +1 -1
- package/dist/commands/fork.js +19 -2
- package/dist/commands/fork.js.map +1 -1
- package/dist/commands/gateway.d.ts.map +1 -1
- package/dist/commands/gateway.js +2 -1
- package/dist/commands/gateway.js.map +1 -1
- package/dist/commands/grow.js +2 -2
- package/dist/commands/grow.js.map +1 -1
- package/dist/commands/launch.js +1 -1
- package/dist/commands/launch.js.map +1 -1
- package/dist/commands/mcp.d.ts.map +1 -1
- package/dist/commands/mcp.js +113 -1
- package/dist/commands/mcp.js.map +1 -1
- package/dist/commands/project-worker.d.ts +25 -1
- package/dist/commands/project-worker.d.ts.map +1 -1
- package/dist/commands/project-worker.js +9 -7
- package/dist/commands/project-worker.js.map +1 -1
- package/dist/commands/project.d.ts +2 -0
- package/dist/commands/project.d.ts.map +1 -1
- package/dist/commands/project.js +64 -1
- package/dist/commands/project.js.map +1 -1
- package/dist/commands/provider.d.ts.map +1 -1
- package/dist/commands/provider.js +101 -0
- package/dist/commands/provider.js.map +1 -1
- package/dist/commands/ps.d.ts +12 -1
- package/dist/commands/ps.d.ts.map +1 -1
- package/dist/commands/ps.js +50 -47
- package/dist/commands/ps.js.map +1 -1
- package/dist/commands/queue.d.ts +4 -2
- package/dist/commands/queue.d.ts.map +1 -1
- package/dist/commands/queue.js +24 -15
- package/dist/commands/queue.js.map +1 -1
- package/dist/commands/reconcile-session.d.ts.map +1 -1
- package/dist/commands/reconcile-session.js +6 -0
- package/dist/commands/reconcile-session.js.map +1 -1
- package/dist/commands/seat.d.ts +2 -0
- package/dist/commands/seat.d.ts.map +1 -1
- package/dist/commands/seat.js +124 -6
- package/dist/commands/seat.js.map +1 -1
- package/dist/commands/send.d.ts.map +1 -1
- package/dist/commands/send.js +62 -55
- package/dist/commands/send.js.map +1 -1
- package/dist/commands/setup.d.ts +24 -0
- package/dist/commands/setup.d.ts.map +1 -1
- package/dist/commands/setup.js +160 -7
- package/dist/commands/setup.js.map +1 -1
- package/dist/commands/skill.d.ts.map +1 -1
- package/dist/commands/skill.js +116 -3
- package/dist/commands/skill.js.map +1 -1
- package/dist/commands/start.d.ts.map +1 -1
- package/dist/commands/start.js +18 -25
- package/dist/commands/start.js.map +1 -1
- package/dist/commands/status.d.ts.map +1 -1
- package/dist/commands/status.js +4 -1
- package/dist/commands/status.js.map +1 -1
- package/dist/commands/stream-outcome.d.ts +157 -0
- package/dist/commands/stream-outcome.d.ts.map +1 -0
- package/dist/commands/stream-outcome.js +81 -0
- package/dist/commands/stream-outcome.js.map +1 -0
- package/dist/commands/stream.d.ts.map +1 -1
- package/dist/commands/stream.js +64 -2
- package/dist/commands/stream.js.map +1 -1
- package/dist/commands/terminal.d.ts +1 -0
- package/dist/commands/terminal.d.ts.map +1 -1
- package/dist/commands/terminal.js +35 -6
- package/dist/commands/terminal.js.map +1 -1
- package/dist/commands/topology-default-agent.d.ts +2 -2
- package/dist/commands/topology-default-agent.d.ts.map +1 -1
- package/dist/commands/topology-default-agent.js +5 -3
- package/dist/commands/topology-default-agent.js.map +1 -1
- package/dist/commands/up.d.ts.map +1 -1
- package/dist/commands/up.js +75 -30
- package/dist/commands/up.js.map +1 -1
- package/dist/commands/watchdog.d.ts.map +1 -1
- package/dist/commands/watchdog.js +80 -5
- package/dist/commands/watchdog.js.map +1 -1
- package/dist/commands/workflow-errors.js +1 -1
- package/dist/commands/workflow-errors.js.map +1 -1
- package/dist/commands/workflow-render.js +4 -4
- package/dist/commands/workflow-render.js.map +1 -1
- package/dist/commands/workflow.d.ts.map +1 -1
- package/dist/commands/workflow.js +34 -15
- package/dist/commands/workflow.js.map +1 -1
- package/dist/config-store.d.ts +15 -1
- package/dist/config-store.d.ts.map +1 -1
- package/dist/config-store.js +86 -4
- package/dist/config-store.js.map +1 -1
- package/dist/daemon-lifecycle.d.ts +4 -0
- package/dist/daemon-lifecycle.d.ts.map +1 -1
- package/dist/daemon-lifecycle.js +73 -21
- package/dist/daemon-lifecycle.js.map +1 -1
- package/dist/decisions/decisions.d.ts +203 -0
- package/dist/decisions/decisions.d.ts.map +1 -0
- package/dist/decisions/decisions.js +374 -0
- package/dist/decisions/decisions.js.map +1 -0
- package/dist/decisions/stream-consumer.d.ts +255 -0
- package/dist/decisions/stream-consumer.d.ts.map +1 -0
- package/dist/decisions/stream-consumer.js +282 -0
- package/dist/decisions/stream-consumer.js.map +1 -0
- package/dist/decisions/templates.d.ts +8 -0
- package/dist/decisions/templates.d.ts.map +1 -0
- package/dist/decisions/templates.js +34 -0
- package/dist/decisions/templates.js.map +1 -0
- package/dist/fresh-seat-command.d.ts +18 -0
- package/dist/fresh-seat-command.d.ts.map +1 -0
- package/dist/fresh-seat-command.js +36 -0
- package/dist/fresh-seat-command.js.map +1 -0
- package/dist/front-door.d.ts +4 -0
- package/dist/front-door.d.ts.map +1 -1
- package/dist/front-door.js +8 -4
- package/dist/front-door.js.map +1 -1
- package/dist/host-bindings.d.ts.map +1 -1
- package/dist/host-bindings.js +16 -9
- package/dist/host-bindings.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/lazy-program.d.ts.map +1 -1
- package/dist/lazy-program.js +2 -0
- package/dist/lazy-program.js.map +1 -1
- package/dist/lib/run-on-host.d.ts +29 -0
- package/dist/lib/run-on-host.d.ts.map +1 -0
- package/dist/lib/run-on-host.js +69 -0
- package/dist/lib/run-on-host.js.map +1 -0
- package/dist/lib/seat-activity.d.ts +17 -0
- package/dist/lib/seat-activity.d.ts.map +1 -0
- package/dist/lib/seat-activity.js +29 -0
- package/dist/lib/seat-activity.js.map +1 -0
- package/dist/local-daemon-owner.d.ts +4 -0
- package/dist/local-daemon-owner.d.ts.map +1 -1
- package/dist/local-daemon-owner.js +1 -1
- package/dist/local-daemon-owner.js.map +1 -1
- package/dist/mcp-http.d.ts +42 -0
- package/dist/mcp-http.d.ts.map +1 -0
- package/dist/mcp-http.js +232 -0
- package/dist/mcp-http.js.map +1 -0
- package/dist/mcp-server.d.ts +30 -2
- package/dist/mcp-server.d.ts.map +1 -1
- package/dist/mcp-server.js +1112 -436
- package/dist/mcp-server.js.map +1 -1
- package/dist/seat-launch-additions-lines.d.ts +11 -0
- package/dist/seat-launch-additions-lines.d.ts.map +1 -0
- package/dist/seat-launch-additions-lines.js +14 -0
- package/dist/seat-launch-additions-lines.js.map +1 -0
- package/dist/terminal-window.d.ts +1 -1
- package/dist/terminal-window.d.ts.map +1 -1
- package/dist/terminal-window.js +50 -22
- package/dist/terminal-window.js.map +1 -1
- package/package.json +1 -1
- package/tui/dist/attention/attention-model.d.ts +3 -1
- package/tui/dist/attention/attention-model.d.ts.map +1 -1
- package/tui/dist/attention/attention-model.js +68 -1
- package/tui/dist/attention/attention-model.js.map +1 -1
- package/tui/dist/commands/registry.d.ts.map +1 -1
- package/tui/dist/commands/registry.js +2 -0
- package/tui/dist/commands/registry.js.map +1 -1
- package/tui/dist/config/config-model.d.ts.map +1 -1
- package/tui/dist/config/config-model.js +2 -0
- package/tui/dist/config/config-model.js.map +1 -1
- package/tui/dist/daemon-client.d.ts +18 -0
- package/tui/dist/daemon-client.d.ts.map +1 -1
- package/tui/dist/daemon-client.js +4 -0
- package/tui/dist/daemon-client.js.map +1 -1
- package/tui/dist/hydrate.d.ts.map +1 -1
- package/tui/dist/hydrate.js +9 -6
- package/tui/dist/hydrate.js.map +1 -1
- package/tui/dist/main.js +15 -1
- package/tui/dist/main.js.map +1 -1
- package/tui/dist/render.d.ts.map +1 -1
- package/tui/dist/render.js +10 -3
- package/tui/dist/render.js.map +1 -1
- package/tui/dist/topology/fixture.js +1 -1
- package/tui/dist/topology/fixture.js.map +1 -1
- package/tui/dist/topology/glyphs.js +1 -1
- package/tui/dist/topology/glyphs.js.map +1 -1
- package/tui/dist/topology/graph-types.d.ts +1 -0
- package/tui/dist/topology/graph-types.d.ts.map +1 -1
- package/tui/dist/types.d.ts +25 -0
- package/tui/dist/types.d.ts.map +1 -1
- package/ui/dist/assets/{index-CVgod3Pm.js → index-Blg-p32B.js} +92 -92
- package/ui/dist/index.html +1 -1
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { TerminalPolicyRefusal } from "./terminal-policy.js";
|
|
1
2
|
import { DeliveryGuardError } from "./seat-delivery-guard.js";
|
|
2
3
|
import * as fs from "node:fs";
|
|
3
4
|
import { randomUUID } from "node:crypto";
|
|
@@ -23,10 +24,19 @@ import * as path from "node:path";
|
|
|
23
24
|
* session must drop below threshold before another auto-compact can
|
|
24
25
|
* fire. The dedup window still blocks immediate flaps; the threshold
|
|
25
26
|
* crossing rule prevents one high-usage session from receiving
|
|
26
|
-
* /compact every 60s.
|
|
27
|
-
* restart resets
|
|
28
|
-
*
|
|
29
|
-
*
|
|
27
|
+
* /compact every 60s. This window is intentionally NOT persisted; daemon
|
|
28
|
+
* restart resets it, which is the safer-failure direction (might
|
|
29
|
+
* re-compact once on restart in rare cases, won't lock out forever).
|
|
30
|
+
* - Restart: each attempt's record (COMPACTION-STATE.json, beside its map)
|
|
31
|
+
* says what the daemon last did for it, so a restarted daemon resumes an
|
|
32
|
+
* owed restore and waits on an open preparation instead of starting a
|
|
33
|
+
* second one (`recoverAfterRestart`). A prompt or /compact is marked in
|
|
34
|
+
* flight at its write, so a restart never sends it again. A restart between
|
|
35
|
+
* a post-compact stage's send and its record can send that one stage again.
|
|
36
|
+
* - A /compact whose outcome is unknown owes its restore steps, with or
|
|
37
|
+
* without a restart. Its text may wait unsubmitted in the input box, where
|
|
38
|
+
* any Enter would submit it, so each step goes only into an empty box and
|
|
39
|
+
* is held, visibly, while the box holds text or can't be read.
|
|
30
40
|
* - Definite pre-write prep failures retry at most three times. Uncertain
|
|
31
41
|
* delivery never replays. Unfinished preparation stops visibly until an
|
|
32
42
|
* explicit retry; it cannot arm a delayed compact after its deadline.
|
|
@@ -235,7 +245,8 @@ export function buildPostCompactRestorePrompt(input) {
|
|
|
235
245
|
// refused at the source. Tell the seat NOT to seek it out (it is not its state).
|
|
236
246
|
pieces.push("A post-compaction instruction file declaring a DIFFERENT seat was present and has been IGNORED — it is not yours; do NOT read or follow it. Rely on the per-seat marker and the JSONL transcript for restore.");
|
|
237
247
|
}
|
|
238
|
-
|
|
248
|
+
const restoreMap = input.attemptMapPath ? "this preparation attempt's restore map" : "your newest restore map";
|
|
249
|
+
pieces.push(`Load/read the claude-compaction-restore skill, follow the marker's restoreInstruction and postCompactInstruction when present, read ${restoreMap} and use the restore packet as a lookup, then reply with: restored from packet at <path>; resumed at step <X>.`);
|
|
239
250
|
pieces.push(`During this restore, read ${path.join(input.openrigHome, "plugins", "openrig-core", "skills", "refocusing", "SKILL.md")} and consume the current topology and work traces delivered with this restore request, if present; do not rerun Python just to duplicate a delivered trace. Missing trace delivery is a named gap. Read required notes and full sources with the native file-read tool; a pointer, compact summary or truncated extract is not a full source read. Name any missing source, the current user outcome, and your next action from the files you actually read, not from the compact summary.`);
|
|
240
251
|
return pieces.join(" ");
|
|
241
252
|
}
|
|
@@ -257,6 +268,43 @@ export function buildPostCompactTurnBoundaryPrompt() {
|
|
|
257
268
|
"Do not restore yet; the next normal user message will contain the restore instructions.",
|
|
258
269
|
].join(" ");
|
|
259
270
|
}
|
|
271
|
+
/** The file, beside an attempt's restore map, where the daemon records what it last did for that attempt. The agent
|
|
272
|
+
* never writes it. A restarted daemon reads it to pick the attempt up again. */
|
|
273
|
+
export const COMPACTION_RECORD_FILE = "COMPACTION-STATE.json";
|
|
274
|
+
/** How old a record may be for a restarted daemon to resume it. An older open record isn't resumed: it reads as
|
|
275
|
+
* stranded, so whoever reaches the seat is told its restore may still be owed. Operational, not measured. */
|
|
276
|
+
export const RESTART_RECOVERY_WINDOW_MS_DEFAULT = 6 * 60 * 60_000;
|
|
277
|
+
/** This daemon process. A record this process wrote is its own state, never something to recover. */
|
|
278
|
+
const DAEMON_PROCESS_ID = randomUUID();
|
|
279
|
+
const RECORD_PHASES = new Set(["preparing", "turn_boundary", "restore_prompt", "compliance_prompt", "compact_uncertain", "done", "ended"]);
|
|
280
|
+
const RECORD_DELIVERIES = new Set(["pending", "not_sent", "delivered", "uncertain"]);
|
|
281
|
+
/** A record only in the shape this daemon writes. Any other (a newer daemon's after a rollback, a damaged file) is ignored,
|
|
282
|
+
* so it can't hold up a seat's compaction. */
|
|
283
|
+
function readCompactionRecord(file) {
|
|
284
|
+
try {
|
|
285
|
+
const r = JSON.parse(fs.readFileSync(file, "utf8"));
|
|
286
|
+
const text = (v) => typeof v === "string";
|
|
287
|
+
const textOrNull = (v) => v === null || typeof v === "string";
|
|
288
|
+
const carry = r.restoreCarry;
|
|
289
|
+
const valid = text(r.daemon) && text(r.attemptId) && text(r.session) && textOrNull(r.occupantGeneration)
|
|
290
|
+
&& (r.mode === "automatic" || r.mode === "manual") && RECORD_PHASES.has(r.phase) && RECORD_DELIVERIES.has(r.delivery)
|
|
291
|
+
&& (r.deadlineAt === null || Number.isFinite(r.deadlineAt)) && Number.isInteger(r.sends) && r.sends >= 0 && r.sends <= PREP_SEND_ATTEMPTS_MAX
|
|
292
|
+
&& text(r.mapPath) && text(r.marker) && text(r.compactInstruction) && textOrNull(r.preparationRoot) && Number.isFinite(r.updatedAt)
|
|
293
|
+
&& (r.operatorInitiated === undefined || typeof r.operatorInitiated === "boolean") && (r.compactSending === undefined || r.compactSending === true)
|
|
294
|
+
&& (r.uncertainCompact === undefined || r.uncertainCompact === true)
|
|
295
|
+
&& (carry === undefined || (typeof carry === "object" && carry !== null && textOrNull(carry.mapPath) && textOrNull(carry.compactInstruction)
|
|
296
|
+
&& (carry.skipMap === undefined || (text(carry.skipMap?.mapPath) && text(carry.skipMap?.marker)))));
|
|
297
|
+
return valid ? r : null;
|
|
298
|
+
}
|
|
299
|
+
catch {
|
|
300
|
+
return null;
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
/** Input-box readings that hold nothing typed: an owed step after an uncertain /compact may go in. A harness suggestion isn't input. */
|
|
304
|
+
const INPUT_BOX_CLEAR = new Set(["empty", "likely-suggestion"]);
|
|
305
|
+
function strandedSummary(record) {
|
|
306
|
+
return { attemptId: record.attemptId, mapPath: record.mapPath, phase: record.phase, recordedAt: new Date(record.updatedAt).toISOString() };
|
|
307
|
+
}
|
|
260
308
|
export class ClaudeCompactionEnforcer {
|
|
261
309
|
settingsStore;
|
|
262
310
|
sessionTransport;
|
|
@@ -285,9 +333,24 @@ export class ClaudeCompactionEnforcer {
|
|
|
285
333
|
// unknown). At drain we compare it to the LIVE generation; a mismatch = a successor inheriting a
|
|
286
334
|
// retired-generation stage → refuse. Injected resolver (atom-B's currentOccupantTenure by session).
|
|
287
335
|
pendingStageGeneration = new Map();
|
|
336
|
+
/** Each seat's current attempt record, as last written beside its map. */
|
|
337
|
+
records = new Map();
|
|
338
|
+
/** Seats whose records this daemon has already looked for after starting. */
|
|
339
|
+
recovered = new Set();
|
|
340
|
+
/** Open records too old to resume: the seat's restore may still be owed. */
|
|
341
|
+
stranded = new Map();
|
|
342
|
+
/** Seats whose owed restore steps follow a /compact whose outcome is unknown: its text may wait unsubmitted in the input
|
|
343
|
+
* box, where any Enter would submit it, so each step goes only into an empty box. */
|
|
344
|
+
afterUncertainCompact = new Set();
|
|
345
|
+
/** What the input box last read for such a seat, before an owed step (absent until the first check). */
|
|
346
|
+
lastInputBox = new Map();
|
|
347
|
+
restartRecoveryWindowMs;
|
|
348
|
+
daemonInstance;
|
|
288
349
|
resolveOccupantGeneration;
|
|
289
350
|
onPostRestoreComplete;
|
|
351
|
+
terminalPolicies;
|
|
290
352
|
constructor(settingsStore, sessionTransport, opts) {
|
|
353
|
+
this.terminalPolicies = opts?.terminalPolicies;
|
|
291
354
|
this.settingsStore = settingsStore;
|
|
292
355
|
this.sessionTransport = sessionTransport;
|
|
293
356
|
this.dedupWindowMs = opts?.dedupWindowMs ?? DEDUP_WINDOW_MS_DEFAULT;
|
|
@@ -299,6 +362,8 @@ export class ClaudeCompactionEnforcer {
|
|
|
299
362
|
this.sleep = opts?.sleep ?? (ms => new Promise(resolve => setTimeout(resolve, ms)));
|
|
300
363
|
this.postCompactSendWaitMs = opts?.postCompactSendWaitMs ?? POST_COMPACT_SEND_WAIT_MS_DEFAULT;
|
|
301
364
|
this.compactSendIdleWaitMs = opts?.compactSendIdleWaitMs ?? 1000;
|
|
365
|
+
this.restartRecoveryWindowMs = opts?.restartRecoveryWindowMs ?? RESTART_RECOVERY_WINDOW_MS_DEFAULT;
|
|
366
|
+
this.daemonInstance = opts?.daemonInstance ?? DAEMON_PROCESS_ID;
|
|
302
367
|
this.resolveOccupantGeneration = opts?.resolveOccupantGeneration;
|
|
303
368
|
this.onPostRestoreComplete = opts?.onPostRestoreComplete;
|
|
304
369
|
}
|
|
@@ -318,23 +383,71 @@ export class ClaudeCompactionEnforcer {
|
|
|
318
383
|
*/
|
|
319
384
|
observedCompaction(sessionName) {
|
|
320
385
|
const owed = this.pendingPostCompactRestore.get(sessionName);
|
|
386
|
+
const held = this.getOwedRestore(sessionName);
|
|
387
|
+
if (held?.held)
|
|
388
|
+
return { stage: owed === "compliance_prompt" ? "restoring" : owed === "restore_prompt" ? "compacted" : "compacting", detail: held.detail };
|
|
321
389
|
if (owed === "compliance_prompt")
|
|
322
390
|
return { stage: "restoring", detail: "mid-restore: the restore request was sent and the post-restore audit is still owed" };
|
|
323
391
|
if (owed === "restore_prompt")
|
|
324
392
|
return { stage: "compacted", detail: "compacted, with its restore not yet requested" };
|
|
325
|
-
if (owed === "turn_boundary")
|
|
326
|
-
return { stage: "compacting", detail: "being compacted: /compact was submitted and the post-compaction steps haven't started" };
|
|
327
393
|
const attempt = this.pendingPreCompactPrep.get(sessionName);
|
|
328
|
-
if (
|
|
329
|
-
return { stage: "
|
|
394
|
+
if (owed === "turn_boundary") {
|
|
395
|
+
return { stage: "compacting", detail: attempt?.compact === "uncertain"
|
|
396
|
+
? "possibly being compacted: /compact may have been submitted (its result was lost) and the post-compaction steps haven't started"
|
|
397
|
+
: "being compacted: /compact was submitted and the post-compaction steps haven't started" };
|
|
398
|
+
}
|
|
399
|
+
if (attempt?.status === "sending" || attempt?.status === "waiting") {
|
|
400
|
+
return { stage: "preparing", detail: `preparing for a managed compaction: /compact hasn't been sent yet${attempt.supersedes
|
|
401
|
+
? `; it replaces a compaction from before an OpenRig restart whose restore steps may still have been owed (map ${attempt.supersedes.mapPath})` : ""}` };
|
|
402
|
+
}
|
|
330
403
|
if (attempt?.status === "compact-sent")
|
|
331
404
|
return { stage: "compacting", detail: "being compacted: /compact was submitted and the post-compaction steps haven't started" };
|
|
405
|
+
if (this.stranded.has(sessionName)) {
|
|
406
|
+
return { stage: "compacted", detail: "compacted before an OpenRig restart, with its restore steps possibly still owed: the record is too old for OpenRig to resume them" };
|
|
407
|
+
}
|
|
332
408
|
return null;
|
|
333
409
|
}
|
|
334
|
-
/** True while a post-compact stage (turn boundary, restore or audit) is still owed to this seat.
|
|
335
|
-
|
|
410
|
+
/** True while a post-compact stage (turn boundary, restore or audit) is still owed to this seat. Given the seat, a
|
|
411
|
+
* restarted daemon first picks up a stage its predecessor recorded (`recoverAfterRestart`). */
|
|
412
|
+
hasPendingPostCompactStage(sessionName, seat) {
|
|
413
|
+
if (seat)
|
|
414
|
+
this.recoverSeat({ sessionName, ...seat });
|
|
336
415
|
return this.pendingPostCompactRestore.has(sessionName);
|
|
337
416
|
}
|
|
417
|
+
/** The first time this daemon reaches a seat (a poll, a manual request, a state read): pick up its record from before a
|
|
418
|
+
* restart, with the policy's preparation root (`recoverAfterRestart`). */
|
|
419
|
+
recoverSeat(seat) {
|
|
420
|
+
if (seat.runtime !== "claude-code" || this.recovered.has(seat.sessionName))
|
|
421
|
+
return;
|
|
422
|
+
let preparationRoot = null;
|
|
423
|
+
try {
|
|
424
|
+
preparationRoot = this.settingsStore.resolveClaudeCompactionPolicy().preparationRoot || null;
|
|
425
|
+
}
|
|
426
|
+
catch { /* default roots */ }
|
|
427
|
+
this.recoverAfterRestart(seat, preparationRoot);
|
|
428
|
+
}
|
|
429
|
+
/** The restore step OpenRig owes this seat next, or null. After a /compact whose outcome is unknown (see
|
|
430
|
+
* `afterUncertainCompact`) it also gives what the input box last read (`not_checked` before the first check) and
|
|
431
|
+
* whether the step is held for it. */
|
|
432
|
+
getOwedRestore(sessionName) {
|
|
433
|
+
const stage = this.pendingPostCompactRestore.get(sessionName);
|
|
434
|
+
if (!stage)
|
|
435
|
+
return null;
|
|
436
|
+
const step = { turn_boundary: "post-compaction turn boundary", restore_prompt: "restore request", compliance_prompt: "post-restore audit" }[stage];
|
|
437
|
+
if (!this.afterUncertainCompact.has(sessionName)) {
|
|
438
|
+
return { stage, held: false, detail: `OpenRig owes this seat its ${step} next, sent on a poll once the pane is idle.` };
|
|
439
|
+
}
|
|
440
|
+
const inputBox = this.lastInputBox.get(sessionName) ?? "not_checked";
|
|
441
|
+
const held = inputBox !== "not_checked" && !INPUT_BOX_CLEAR.has(inputBox);
|
|
442
|
+
return { stage, held, inputBox, detail: held
|
|
443
|
+
? `held: OpenRig owes this seat its restore steps after a /compact whose result was lost, and waits while its input box isn't empty (it reads ${inputBox}). The seat may have /compact text waiting, which any Enter would submit, so check the pane. A seat whose own status line keeps the box unreadable stays held.`
|
|
444
|
+
: `OpenRig owes this seat its ${step} next, after a /compact whose result was lost. Each step goes only into an empty input box, sent on a poll once the pane is idle (the box last read ${inputBox}).` };
|
|
445
|
+
}
|
|
446
|
+
/** An open record from before a restart that was too old to resume, while no later attempt has replaced it. */
|
|
447
|
+
getStrandedCompaction(sessionName) {
|
|
448
|
+
const record = this.stranded.get(sessionName);
|
|
449
|
+
return record ? strandedSummary(record) : null;
|
|
450
|
+
}
|
|
338
451
|
/**
|
|
339
452
|
* Drain a post-compact stage that is already pending, without a usage sample. ContextMonitor
|
|
340
453
|
* calls this when the latest sample is stale or unknown. Such a sample never starts a
|
|
@@ -360,6 +473,23 @@ export class ClaudeCompactionEnforcer {
|
|
|
360
473
|
return (await this.drainPendingStage(unsampled, policy)) ?? { triggered: false, reason: "no_pending_stage" };
|
|
361
474
|
});
|
|
362
475
|
}
|
|
476
|
+
terminalPolicyReason(input, actor) {
|
|
477
|
+
const nodeId = input.nodeId ?? this.sessionTransport.deliveryGuard?.maybeTarget(input.sessionName)?.nodeId;
|
|
478
|
+
if (!this.terminalPolicies || !nodeId)
|
|
479
|
+
return null;
|
|
480
|
+
try {
|
|
481
|
+
this.terminalPolicies.check(nodeId, "compaction", actor);
|
|
482
|
+
return null;
|
|
483
|
+
}
|
|
484
|
+
catch (error) {
|
|
485
|
+
return error instanceof TerminalPolicyRefusal ? "terminal_policy_refused" : actor.source === "openrig" ? null : "terminal_policy_unavailable";
|
|
486
|
+
}
|
|
487
|
+
}
|
|
488
|
+
checkAttemptPolicy(input, attempt) {
|
|
489
|
+
const reason = this.terminalPolicyReason(input, attempt.policyActor ?? { source: "openrig" });
|
|
490
|
+
if (reason)
|
|
491
|
+
throw new DeliveryGuardError(reason, "This seat's terminal policy does not allow this managed compaction. Read rig seat status <seat> to see or change the explicit choice; the existing override path is unchanged.");
|
|
492
|
+
}
|
|
363
493
|
async withDeliveryGuard(input, run) {
|
|
364
494
|
const runIfCurrent = () => input.isObservationCurrent && !input.isObservationCurrent()
|
|
365
495
|
? Promise.resolve({ triggered: false, reason: "stale_observation" }) : run();
|
|
@@ -388,6 +518,7 @@ export class ClaudeCompactionEnforcer {
|
|
|
388
518
|
const isCurrent = () => this.pendingPostCompactRestore.get(input.sessionName) === pendingStage
|
|
389
519
|
&& this.pendingPreCompactPrep.get(input.sessionName) === attempt;
|
|
390
520
|
const sendOpts = {
|
|
521
|
+
openrigNotice: true,
|
|
391
522
|
beforeWrite: () => {
|
|
392
523
|
if (!isCurrent())
|
|
393
524
|
throw new DeliveryGuardError("compaction_cancelled", "Managed compaction was cancelled or replaced; no further input is authorized.");
|
|
@@ -422,6 +553,17 @@ export class ClaudeCompactionEnforcer {
|
|
|
422
553
|
return { triggered: false, reason: "stale_generation" };
|
|
423
554
|
}
|
|
424
555
|
}
|
|
556
|
+
// After a /compact whose outcome is unknown, its text may still wait unsubmitted in the input box, and this step's Enter
|
|
557
|
+
// would submit it. So each step goes only into a box holding nothing typed (a harness suggestion isn't input); while it
|
|
558
|
+
// holds text or can't be read, the step waits for the next poll, and the notice and --state say why.
|
|
559
|
+
if (this.afterUncertainCompact.has(input.sessionName)) {
|
|
560
|
+
const box = await this.inputBoxStatus(input.sessionName);
|
|
561
|
+
if (!isCurrent())
|
|
562
|
+
return { triggered: false, reason: "preparation_stopped" };
|
|
563
|
+
this.lastInputBox.set(input.sessionName, box);
|
|
564
|
+
if (!INPUT_BOX_CLEAR.has(box))
|
|
565
|
+
return { triggered: false, reason: "input_box_not_empty" };
|
|
566
|
+
}
|
|
425
567
|
if (pendingStage === "turn_boundary") {
|
|
426
568
|
const boundary = await this.sessionTransport.send(input.sessionName, buildPostCompactTurnBoundaryPrompt(), sendOpts);
|
|
427
569
|
if (!isCurrent())
|
|
@@ -431,6 +573,7 @@ export class ClaudeCompactionEnforcer {
|
|
|
431
573
|
return { triggered: false, reason: "send_failed" };
|
|
432
574
|
}
|
|
433
575
|
this.pendingPostCompactRestore.set(input.sessionName, "restore_prompt");
|
|
576
|
+
this.persistStage(input.sessionName, "restore_prompt");
|
|
434
577
|
return { triggered: true };
|
|
435
578
|
}
|
|
436
579
|
if (pendingStage === "restore_prompt") {
|
|
@@ -457,6 +600,7 @@ export class ClaudeCompactionEnforcer {
|
|
|
457
600
|
return { triggered: false, reason: "send_failed" };
|
|
458
601
|
}
|
|
459
602
|
this.pendingPostCompactRestore.set(input.sessionName, "compliance_prompt");
|
|
603
|
+
this.persistStage(input.sessionName, "compliance_prompt");
|
|
460
604
|
this.restoreCarry.delete(input.sessionName);
|
|
461
605
|
// OPR.0.4.3.14 — surface manual-trigger progress (no-op for auto seats).
|
|
462
606
|
this.advanceManualStage(input.sessionName, "compact-sent", "restore-sent");
|
|
@@ -486,8 +630,14 @@ export class ClaudeCompactionEnforcer {
|
|
|
486
630
|
if (!isCurrent())
|
|
487
631
|
return { triggered: false, reason: "preparation_stopped" };
|
|
488
632
|
this.pendingPostCompactRestore.delete(input.sessionName);
|
|
633
|
+
this.persistStage(input.sessionName, "done");
|
|
634
|
+
this.records.delete(input.sessionName);
|
|
635
|
+
this.afterUncertainCompact.delete(input.sessionName);
|
|
636
|
+
this.lastInputBox.delete(input.sessionName);
|
|
489
637
|
this.restoreCarry.delete(input.sessionName);
|
|
490
|
-
|
|
638
|
+
// The attempt is finished, including one stopped after a lost /compact result whose restore this was.
|
|
639
|
+
const finished = this.pendingPreCompactPrep.get(input.sessionName);
|
|
640
|
+
if (finished?.status === "compact-sent" || finished?.compact === "uncertain")
|
|
491
641
|
this.pendingPreCompactPrep.delete(input.sessionName);
|
|
492
642
|
this.pendingStageGeneration.delete(input.sessionName); // GHOST-STAGE (b): stage completed → drop its gen
|
|
493
643
|
this.postCompactRestoreCooldownUntil.set(input.sessionName, Date.now() + this.postCompactRestoreCooldownMs);
|
|
@@ -519,6 +669,7 @@ export class ClaudeCompactionEnforcer {
|
|
|
519
669
|
if (!isValidThresholdPercent(policy.thresholdPercent)) {
|
|
520
670
|
return { triggered: false, reason: "invalid_policy" };
|
|
521
671
|
}
|
|
672
|
+
this.recoverAfterRestart(input, policy.preparationRoot || null);
|
|
522
673
|
// A trigger sample must not block work already owed to this occupant. Restore reads can
|
|
523
674
|
// themselves exceed a low threshold; keep the same stage, authorization and idle gates.
|
|
524
675
|
const drained = await this.drainPendingStage(input, policy);
|
|
@@ -553,6 +704,13 @@ export class ClaudeCompactionEnforcer {
|
|
|
553
704
|
if (this.triggeredAboveThreshold.has(input.sessionName)) {
|
|
554
705
|
return { triggered: false, reason: "already_triggered_above_threshold" };
|
|
555
706
|
}
|
|
707
|
+
const policyRefusal = this.terminalPolicyReason(input, { source: "openrig" });
|
|
708
|
+
if (policyRefusal) {
|
|
709
|
+
const existing = this.pendingPreCompactPrep.get(input.sessionName);
|
|
710
|
+
if (existing?.mode === "automatic" && existing.compact === "not_sent")
|
|
711
|
+
this.stopPreparation(input.sessionName, policyRefusal, existing);
|
|
712
|
+
return { triggered: false, reason: policyRefusal };
|
|
713
|
+
}
|
|
556
714
|
// Before any preparation prompt or /compact copy: a protected seat with no recorded pane cannot take input.
|
|
557
715
|
// An attempt already under way stops as not sent; none is begun.
|
|
558
716
|
if (this.paneUnknownProtected(input.sessionName)) {
|
|
@@ -577,7 +735,7 @@ export class ClaudeCompactionEnforcer {
|
|
|
577
735
|
if (!attempt) {
|
|
578
736
|
attempt = this.beginPreparation(input, "automatic");
|
|
579
737
|
if (attempt.status === "stopped")
|
|
580
|
-
return { triggered: false, reason: "occupant_generation_unavailable" };
|
|
738
|
+
return { triggered: false, reason: attempt.reason === "preparation_directory_unavailable" ? attempt.reason : "occupant_generation_unavailable" };
|
|
581
739
|
}
|
|
582
740
|
if (attempt.status === "sending") {
|
|
583
741
|
await this.deliverPreparation(input, attempt);
|
|
@@ -616,6 +774,10 @@ export class ClaudeCompactionEnforcer {
|
|
|
616
774
|
return this.triggerManualCompactUnchecked(input, opts);
|
|
617
775
|
}
|
|
618
776
|
async triggerManualCompactUnchecked(input, opts) {
|
|
777
|
+
// The manual budget starts with the request. A request reaching a seat before the monitor's first poll after a restart
|
|
778
|
+
// finds its owed restore or open preparation first, so it neither prepares twice nor replaces the owed restore.
|
|
779
|
+
const requestedAt = this.now();
|
|
780
|
+
this.recoverSeat(input);
|
|
619
781
|
this.reconcilePreparations();
|
|
620
782
|
const active = this.pendingPreCompactPrep.get(input.sessionName);
|
|
621
783
|
const stage = this.manualCompactionState.get(input.sessionName)?.stage;
|
|
@@ -631,9 +793,13 @@ export class ClaudeCompactionEnforcer {
|
|
|
631
793
|
// The preparation prompt cannot be written to such a seat either, so the whole attempt is refused up front.
|
|
632
794
|
if (this.paneUnknownProtected(input.sessionName))
|
|
633
795
|
return this.recordManualFailure(input.sessionName, "pane_unknown_protected");
|
|
634
|
-
const
|
|
796
|
+
const actor = opts.actor ?? { source: "caller", session: null };
|
|
797
|
+
const policyRefusal = this.terminalPolicyReason(input, actor);
|
|
798
|
+
if (policyRefusal)
|
|
799
|
+
return this.recordManualFailure(input.sessionName, policyRefusal);
|
|
800
|
+
const attempt = this.beginPreparation(input, "manual", opts.skipMap === true, actor, requestedAt);
|
|
635
801
|
if (attempt.status === "stopped")
|
|
636
|
-
return this.recordManualFailure(input.sessionName, "occupant_generation_unavailable");
|
|
802
|
+
return this.recordManualFailure(input.sessionName, attempt.reason ?? "occupant_generation_unavailable");
|
|
637
803
|
const failed = (reason) => {
|
|
638
804
|
// A cancelled request may settle after an explicit retry. Its receipt must
|
|
639
805
|
// not stop or overwrite the successor attempt's state.
|
|
@@ -679,34 +845,51 @@ export class ClaudeCompactionEnforcer {
|
|
|
679
845
|
}
|
|
680
846
|
const compact = await this.sendPreparedCompact(input, attempt, opts.skipMap === true);
|
|
681
847
|
if (!compact.ok) {
|
|
682
|
-
|
|
848
|
+
const outcome = failed(compact.reason ?? "send_failed");
|
|
849
|
+
// A /compact whose result was lost still owes its restore steps, and this request authorizes them.
|
|
850
|
+
if (!this.pendingPostCompactRestore.has(input.sessionName) || this.pendingPreCompactPrep.get(input.sessionName) !== attempt)
|
|
851
|
+
return outcome;
|
|
852
|
+
this.setManualStage(input.sessionName, "compact-sent", outcome.reason, opts.operatorInitiated === true);
|
|
853
|
+
return { ...outcome, restoreOwed: true };
|
|
683
854
|
}
|
|
684
855
|
this.setManualStage(input.sessionName, "compact-sent", undefined, opts.operatorInitiated === true);
|
|
685
856
|
return { triggered: true, stage: "compact-sent" };
|
|
686
857
|
}
|
|
687
|
-
beginPreparation(input, mode, skipMap = false) {
|
|
858
|
+
beginPreparation(input, mode, skipMap = false, policyActor = { source: "openrig" }, startedAt = this.now()) {
|
|
688
859
|
const attemptId = randomUUID();
|
|
860
|
+
const policy = this.settingsStore.resolveClaudeCompactionPolicy();
|
|
861
|
+
const preparationRoot = policy.preparationRoot || null;
|
|
689
862
|
const fallbackMapPath = path.join(this.openrigHome, "compaction", "preparation", sanitizeSessionKey(input.sessionName), attemptId, "RESTORE-MAP.md");
|
|
690
863
|
const occupantGeneration = this.resolveOccupantGeneration?.(input.sessionName)
|
|
691
864
|
?? this.sessionTransport.deliveryGuard?.maybeTarget(input.sessionName)?.occupant ?? null;
|
|
692
865
|
const attempt = {
|
|
693
|
-
attemptId, occupantGeneration, mode, status: "sending", delivery: "pending", compact: "not_sent", sends: 0,
|
|
694
|
-
deadlineAt: mode === "manual" ?
|
|
695
|
-
mapPath: fallbackMapPath,
|
|
866
|
+
policyActor, attemptId, occupantGeneration, mode, status: "sending", delivery: "pending", compact: "not_sent", sends: 0,
|
|
867
|
+
deadlineAt: mode === "manual" ? startedAt + this.manualPrepWaitMs : null,
|
|
868
|
+
mapPath: preparationRoot ? path.join(preparationRoot, sanitizeSessionKey(input.sessionName), attemptId, "RESTORE-MAP.md") : fallbackMapPath,
|
|
696
869
|
marker: `<!-- openrig-compaction-complete ${JSON.stringify({ attemptId, session: input.sessionName, occupantGeneration })} -->`,
|
|
697
|
-
policyWasEnabled:
|
|
870
|
+
policyWasEnabled: policy.enabled,
|
|
871
|
+
preparationRoot,
|
|
698
872
|
controller: new AbortController(),
|
|
699
|
-
compactInstruction:
|
|
873
|
+
compactInstruction: policy.compactInstruction ?? "",
|
|
700
874
|
};
|
|
875
|
+
// A stranded record this attempt replaces stays visible on the attempt, not dropped quietly.
|
|
876
|
+
const stranded = this.stranded.get(input.sessionName);
|
|
877
|
+
if (stranded)
|
|
878
|
+
attempt.supersedes = strandedSummary(stranded);
|
|
701
879
|
this.pendingPreCompactPrep.set(input.sessionName, attempt);
|
|
880
|
+
this.stranded.delete(input.sessionName);
|
|
702
881
|
// A map cannot satisfy an unknown occupant. Keep the failed attempt visible and
|
|
703
882
|
// disarmed; explicit skip-map still bypasses only the artifact prerequisite.
|
|
704
883
|
if (occupantGeneration === null && !skipMap)
|
|
705
884
|
this.stopPreparation(input.sessionName, "occupant_generation_unavailable");
|
|
706
|
-
if (
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
|
|
885
|
+
if (skipMap && preparationRoot) {
|
|
886
|
+
this.startRecord(input.sessionName, attempt);
|
|
887
|
+
return attempt;
|
|
888
|
+
}
|
|
889
|
+
if (attempt.status !== "stopped" && (preparationRoot || (input.cwd && path.isAbsolute(input.cwd)))) {
|
|
890
|
+
// An explicit root can be outside a workspace denied by Claude file permissions.
|
|
891
|
+
// The daemon cannot prove those permissions; the operator grants access to this root.
|
|
892
|
+
const root = preparationRoot ?? path.join(input.cwd, ".openrig", "compaction");
|
|
710
893
|
try {
|
|
711
894
|
fs.mkdirSync(root, { recursive: true });
|
|
712
895
|
const ignorePath = path.join(root, ".gitignore");
|
|
@@ -730,12 +913,17 @@ export class ClaudeCompactionEnforcer {
|
|
|
730
913
|
fs.closeSync(fd);
|
|
731
914
|
}
|
|
732
915
|
}
|
|
733
|
-
const parent = path.join(root, "preparation", sanitizeSessionKey(input.sessionName), attemptId);
|
|
916
|
+
const parent = path.join(preparationRoot ?? path.join(root, "preparation"), sanitizeSessionKey(input.sessionName), attemptId);
|
|
734
917
|
fs.mkdirSync(parent, { recursive: true });
|
|
735
918
|
fs.accessSync(parent, fs.constants.W_OK | fs.constants.X_OK);
|
|
736
919
|
attempt.mapPath = path.join(parent, "RESTORE-MAP.md");
|
|
737
920
|
}
|
|
738
|
-
catch {
|
|
921
|
+
catch {
|
|
922
|
+
// An explicit location is a permission choice: never silently move it back into
|
|
923
|
+
// the denied workspace or instance home. Keep the selected path visible in --state.
|
|
924
|
+
if (preparationRoot)
|
|
925
|
+
this.stopPreparation(input.sessionName, "preparation_directory_unavailable");
|
|
926
|
+
}
|
|
739
927
|
}
|
|
740
928
|
if (attempt.status !== "stopped" && attempt.mapPath === fallbackMapPath) {
|
|
741
929
|
// The cwd path already creates its parent. Prepare the legacy fallback too;
|
|
@@ -745,6 +933,8 @@ export class ClaudeCompactionEnforcer {
|
|
|
745
933
|
}
|
|
746
934
|
catch { /* Retain the existing path and deadline if the directory cannot be prepared. */ }
|
|
747
935
|
}
|
|
936
|
+
if (attempt.status !== "stopped")
|
|
937
|
+
this.startRecord(input.sessionName, attempt);
|
|
748
938
|
return attempt;
|
|
749
939
|
}
|
|
750
940
|
mapReady(attempt, publish = false) {
|
|
@@ -786,23 +976,44 @@ export class ClaudeCompactionEnforcer {
|
|
|
786
976
|
attempt.status = "waiting";
|
|
787
977
|
const policy = this.settingsStore.resolveClaudeCompactionPolicy();
|
|
788
978
|
let prep;
|
|
979
|
+
let marked = false;
|
|
789
980
|
try {
|
|
790
981
|
const composed = composeManagedCompactCommand({ compactInstruction: attempt.compactInstruction, mapPath: attempt.mapPath });
|
|
791
982
|
prep = await this.sessionTransport.send(input.sessionName, buildPreCompactPrepPrompt({
|
|
792
983
|
overflowCompactInstruction: composed.instructionInCommand ? null : attempt.compactInstruction,
|
|
793
984
|
usedPercentage: input.usedPercentage, thresholdPercent: policy.thresholdPercent,
|
|
794
985
|
preCompactInstruction: policy.preCompactInstruction, preparation: attempt, constructedAt: this.now(),
|
|
795
|
-
}))
|
|
986
|
+
}), { openrigNotice: true, beforeWrite: () => {
|
|
987
|
+
this.reconcilePreparations();
|
|
988
|
+
if (this.pendingPreCompactPrep.get(input.sessionName) !== attempt || attempt.controller.signal.aborted || attempt.status === "stopped")
|
|
989
|
+
throw new DeliveryGuardError("preparation_stopped", "This compaction attempt ended before preparation input.");
|
|
990
|
+
this.checkAttemptPolicy(input, attempt);
|
|
991
|
+
// At the write, a retry included: from here a restart reads this prompt as possibly delivered and never resends it.
|
|
992
|
+
if (!marked) {
|
|
993
|
+
marked = true;
|
|
994
|
+
this.persist(input.sessionName, attempt.attemptId, { delivery: "pending", sends: attempt.sends });
|
|
995
|
+
}
|
|
996
|
+
} });
|
|
796
997
|
}
|
|
797
|
-
catch {
|
|
798
|
-
|
|
998
|
+
catch (error) {
|
|
999
|
+
if (error instanceof DeliveryGuardError) {
|
|
1000
|
+
const written = error.inputWritten === true;
|
|
1001
|
+
const attempted = error.inputAttempted === true;
|
|
1002
|
+
prep = { ok: false, sent: written, reason: error.code,
|
|
1003
|
+
inputPhase: written ? "written" : attempted ? "attempted" : "not_reached" };
|
|
1004
|
+
}
|
|
1005
|
+
else
|
|
1006
|
+
prep = null;
|
|
799
1007
|
}
|
|
800
|
-
const
|
|
801
|
-
|
|
802
|
-
|
|
1008
|
+
const writeAttempted = prep?.inputPhase === "attempted" || prep?.inputPhase === "written" || prep?.sent === true;
|
|
1009
|
+
// `not_reached` is a positive pre-input result: a guard refusal before any write, such as a draft hold.
|
|
1010
|
+
const notSent = !writeAttempted && (prep?.outcome === "retained" || prep?.inputPhase === "not_reached"
|
|
1011
|
+
|| ["preparation_stopped", "terminal_policy_refused", "terminal_policy_unavailable", "target_needs_input", "session_missing", "typing_guard_enabled", "mid_work", "tmux_unavailable"].includes(prep?.reason ?? "")
|
|
1012
|
+
|| (prep?.sent === false && ["target_runtime_not_running", "target_runtime_unverified", "target_runtime_conflict", "transport_unavailable"].includes(prep.reason ?? "")));
|
|
803
1013
|
// Record this attempt's effect even if cancellation/retry happened during the await.
|
|
804
1014
|
// Neither a failed response nor its loss proves no paste/Enter. Never replay uncertainty.
|
|
805
1015
|
attempt.delivery = prep?.ok && prep.outcome !== "retained" ? "delivered" : notSent ? "not_sent" : "uncertain";
|
|
1016
|
+
this.persist(input.sessionName, attempt.attemptId, { delivery: attempt.delivery, sends: attempt.sends });
|
|
806
1017
|
if (this.pendingPreCompactPrep.get(input.sessionName) !== attempt || attempt.controller.signal.aborted)
|
|
807
1018
|
return;
|
|
808
1019
|
if (notSent) {
|
|
@@ -813,23 +1024,43 @@ export class ClaudeCompactionEnforcer {
|
|
|
813
1024
|
}
|
|
814
1025
|
if (attempt.mode === "automatic")
|
|
815
1026
|
attempt.deadlineAt = this.now() + AUTO_PREP_WAIT_MS_DEFAULT;
|
|
1027
|
+
this.persist(input.sessionName, attempt.attemptId, { deadlineAt: attempt.deadlineAt });
|
|
816
1028
|
this.reconcilePreparations();
|
|
817
1029
|
}
|
|
818
1030
|
async sendPreparedCompact(input, attempt, skipMap) {
|
|
819
1031
|
const check = () => {
|
|
820
1032
|
this.reconcilePreparations();
|
|
1033
|
+
this.checkAttemptPolicy(input, attempt);
|
|
821
1034
|
if (this.pendingPreCompactPrep.get(input.sessionName) !== attempt || attempt.status !== "waiting" || attempt.controller.signal.aborted)
|
|
822
1035
|
throw new DeliveryGuardError(attempt.reason ?? "preparation_stopped", "Compaction preparation ended; no further input is authorized.");
|
|
823
1036
|
if (!skipMap && !this.mapReady(attempt, true))
|
|
824
1037
|
throw new DeliveryGuardError("preparation_incomplete", "This attempt's restore map is incomplete; /compact was not submitted.");
|
|
825
1038
|
};
|
|
826
1039
|
const composed = composeManagedCompactCommand({ compactInstruction: attempt.compactInstruction, mapPath: skipMap ? null : attempt.mapPath });
|
|
1040
|
+
// Whatever the command could not carry, the restore request carries instead. An explicitly
|
|
1041
|
+
// selected preparation root also keeps its exact map in that request, even when the command fit it.
|
|
1042
|
+
const carry = skipMap || attempt.preparationRoot !== null || !composed.mapPathInCommand || !composed.instructionInCommand ? {
|
|
1043
|
+
mapPath: !skipMap && (attempt.preparationRoot !== null || !composed.mapPathInCommand) ? attempt.mapPath : null,
|
|
1044
|
+
compactInstruction: composed.instructionInCommand ? null : attempt.compactInstruction,
|
|
1045
|
+
...(skipMap ? { skipMap: { mapPath: attempt.mapPath, marker: attempt.marker } } : {}),
|
|
1046
|
+
} : undefined;
|
|
1047
|
+
const operatorInitiated = this.manualCompactionState.get(input.sessionName)?.operatorInitiated;
|
|
1048
|
+
let marked = false;
|
|
1049
|
+
// At the write, after the final checks: from here a restart treats /compact as possibly sent, and keeps what its
|
|
1050
|
+
// restore request needs (the carried map and instruction, and a manual request's authority).
|
|
1051
|
+
const beforeWrite = () => {
|
|
1052
|
+
check();
|
|
1053
|
+
if (!marked) {
|
|
1054
|
+
marked = true;
|
|
1055
|
+
this.persist(input.sessionName, attempt.attemptId, { compactSending: true, restoreCarry: carry, operatorInitiated });
|
|
1056
|
+
}
|
|
1057
|
+
};
|
|
827
1058
|
const send = async () => {
|
|
828
1059
|
check();
|
|
829
1060
|
// Both paths send only to an idle seat, with the same idle wait, bounded by the attempt's existing
|
|
830
1061
|
// deadline. (The automatic path used to send into a seat still finishing its preparation turn.)
|
|
831
1062
|
// Idle comes from a live pane read: the newest hook can predate the rest of the preparation turn.
|
|
832
|
-
return this.sessionTransport.send(input.sessionName, composed.command, {
|
|
1063
|
+
return this.sessionTransport.send(input.sessionName, composed.command, { openrigNotice: true, beforeWrite, ...(attempt.deadlineAt !== null ? { waitForIdleMs: Math.max(1, Math.min(this.compactSendIdleWaitMs, attempt.deadlineAt - this.now())), readinessFromPaneOnly: true } : {}) });
|
|
833
1064
|
};
|
|
834
1065
|
let result;
|
|
835
1066
|
let guardRefused = false;
|
|
@@ -852,13 +1083,25 @@ export class ClaudeCompactionEnforcer {
|
|
|
852
1083
|
// Nothing sent: a guard refusal before input, a retained send, or the transport's explicit sent:false
|
|
853
1084
|
// for a send that never reached its write.
|
|
854
1085
|
const notSent = !writeAttempted && (guardRefused || result.outcome === "retained" || result.sent === false);
|
|
1086
|
+
if (notSent && marked)
|
|
1087
|
+
this.persist(input.sessionName, attempt.attemptId, { compactSending: undefined });
|
|
855
1088
|
// Only a known pre-input idle deferral keeps the automatic attempt armed for a later poll; the transport
|
|
856
1089
|
// marks those `not_reached`. reconcilePreparations still ends it at the deadline or on an occupant change.
|
|
857
|
-
|
|
1090
|
+
// A typing-guard draft hold (`draft_*`) is `not_reached` too, but it is a refusal, not an idle wait: it stops
|
|
1091
|
+
// as not sent, and a fresh attempt may begin after the retry cooldown.
|
|
1092
|
+
const draftHold = typeof result.reason === "string" && result.reason.startsWith("draft_");
|
|
1093
|
+
if (attempt.mode === "automatic" && notSent && phase === "not_reached" && !draftHold) {
|
|
858
1094
|
return { ok: false, reason: "waiting_for_idle" };
|
|
859
1095
|
}
|
|
860
1096
|
// A compact may have been sent despite a lost result. Never replay automatically.
|
|
861
1097
|
attempt.compact = notSent ? "not_sent" : "uncertain";
|
|
1098
|
+
// It may have run, so its restore steps are owed, as after a submitted /compact; the restore request tells a seat that
|
|
1099
|
+
// didn't compact to say so and skip. Not when the attempt was cancelled, stopped or replaced during the send.
|
|
1100
|
+
if (!notSent && !attempt.controller.signal.aborted && this.pendingPreCompactPrep.get(input.sessionName) === attempt) {
|
|
1101
|
+
this.owePostCompactRestore(input.sessionName, attempt, carry);
|
|
1102
|
+
this.afterUncertainCompact.add(input.sessionName);
|
|
1103
|
+
this.persist(input.sessionName, attempt.attemptId, { restoreCarry: carry, operatorInitiated, uncertainCompact: true });
|
|
1104
|
+
}
|
|
862
1105
|
const reason = attempt.reason ?? result.reason ?? "delivery_uncertain";
|
|
863
1106
|
this.stopPreparation(input.sessionName, reason, attempt);
|
|
864
1107
|
return { ok: false, reason };
|
|
@@ -866,23 +1109,34 @@ export class ClaudeCompactionEnforcer {
|
|
|
866
1109
|
attempt.compact = "submitted_unconfirmed";
|
|
867
1110
|
if (attempt.controller.signal.aborted)
|
|
868
1111
|
return { ok: false, reason: attempt.reason };
|
|
869
|
-
// Whatever the command could not carry, the restore request carries instead.
|
|
870
|
-
if (skipMap || !composed.mapPathInCommand || !composed.instructionInCommand) {
|
|
871
|
-
this.restoreCarry.set(input.sessionName, {
|
|
872
|
-
mapPath: !skipMap && !composed.mapPathInCommand ? attempt.mapPath : null,
|
|
873
|
-
compactInstruction: composed.instructionInCommand ? null : attempt.compactInstruction,
|
|
874
|
-
...(skipMap ? { skipMap: { mapPath: attempt.mapPath, marker: attempt.marker } } : {}),
|
|
875
|
-
});
|
|
876
|
-
}
|
|
877
|
-
else
|
|
878
|
-
this.restoreCarry.delete(input.sessionName);
|
|
879
1112
|
attempt.status = "compact-sent";
|
|
880
|
-
this.
|
|
881
|
-
this.
|
|
882
|
-
this.pendingPostCompactRestore.set(input.sessionName, "turn_boundary");
|
|
883
|
-
this.pendingStageGeneration.set(input.sessionName, attempt.occupantGeneration);
|
|
1113
|
+
this.owePostCompactRestore(input.sessionName, attempt, carry);
|
|
1114
|
+
this.persist(input.sessionName, attempt.attemptId, { phase: "turn_boundary", restoreCarry: carry, operatorInitiated });
|
|
884
1115
|
return { ok: true };
|
|
885
1116
|
}
|
|
1117
|
+
/** What the seat's input box holds now, as `rig capture --json` reads it (`empty`, `likely-suggestion`, `typed`, ...), or
|
|
1118
|
+
* why it couldn't be read. Never throws. */
|
|
1119
|
+
async inputBoxStatus(sessionName) {
|
|
1120
|
+
try {
|
|
1121
|
+
const capture = await this.sessionTransport.capture(sessionName, { inputBox: true });
|
|
1122
|
+
return capture.inputBox?.status ?? capture.reason ?? "unknown";
|
|
1123
|
+
}
|
|
1124
|
+
catch {
|
|
1125
|
+
return "unknown";
|
|
1126
|
+
}
|
|
1127
|
+
}
|
|
1128
|
+
/** /compact was submitted, or may have been: its restore steps are owed next, and no new automatic compaction starts
|
|
1129
|
+
* until they finish. */
|
|
1130
|
+
owePostCompactRestore(sessionName, attempt, carry) {
|
|
1131
|
+
if (carry)
|
|
1132
|
+
this.restoreCarry.set(sessionName, carry);
|
|
1133
|
+
else
|
|
1134
|
+
this.restoreCarry.delete(sessionName);
|
|
1135
|
+
this.lastAutoCompactAt.set(sessionName, this.now());
|
|
1136
|
+
this.triggeredAboveThreshold.add(sessionName);
|
|
1137
|
+
this.pendingPostCompactRestore.set(sessionName, "turn_boundary");
|
|
1138
|
+
this.pendingStageGeneration.set(sessionName, attempt.occupantGeneration);
|
|
1139
|
+
}
|
|
886
1140
|
/** The map the restore request names. With --skip-map: a map the seat completed at the attempt path
|
|
887
1141
|
* anyway, or a plain statement that none was required. Nothing publishes the .tmp under --skip-map, so
|
|
888
1142
|
* the final path is checked first, then the .tmp, and whichever ends with the marker is named. */
|
|
@@ -921,6 +1175,134 @@ export class ClaudeCompactionEnforcer {
|
|
|
921
1175
|
attempt.policyWasEnabled = true;
|
|
922
1176
|
}
|
|
923
1177
|
}
|
|
1178
|
+
/** Start the record for a new attempt, beside its map. */
|
|
1179
|
+
startRecord(sessionName, attempt) {
|
|
1180
|
+
this.records.set(sessionName, { file: path.join(path.dirname(attempt.mapPath), COMPACTION_RECORD_FILE), record: {
|
|
1181
|
+
daemon: this.daemonInstance, attemptId: attempt.attemptId, session: sessionName, occupantGeneration: attempt.occupantGeneration, mode: attempt.mode,
|
|
1182
|
+
phase: "preparing", delivery: attempt.delivery, deadlineAt: attempt.deadlineAt, sends: attempt.sends,
|
|
1183
|
+
mapPath: attempt.mapPath, marker: attempt.marker, compactInstruction: attempt.compactInstruction,
|
|
1184
|
+
preparationRoot: attempt.preparationRoot, updatedAt: this.now(),
|
|
1185
|
+
} });
|
|
1186
|
+
this.persist(sessionName, attempt.attemptId, {});
|
|
1187
|
+
}
|
|
1188
|
+
/** Record what this daemon just did for the seat's current attempt. Best-effort: a record that can't be written
|
|
1189
|
+
* leaves the attempt as it was before records existed, not picked up after a restart. */
|
|
1190
|
+
persist(sessionName, attemptId, patch) {
|
|
1191
|
+
const current = this.records.get(sessionName);
|
|
1192
|
+
if (!current || current.record.attemptId !== attemptId)
|
|
1193
|
+
return;
|
|
1194
|
+
current.record = { ...current.record, ...patch, daemon: this.daemonInstance, updatedAt: this.now() };
|
|
1195
|
+
const temporary = `${current.file}.${process.pid}.tmp`;
|
|
1196
|
+
try {
|
|
1197
|
+
fs.writeFileSync(temporary, `${JSON.stringify(current.record)}\n`, { mode: 0o600 });
|
|
1198
|
+
fs.renameSync(temporary, current.file);
|
|
1199
|
+
}
|
|
1200
|
+
catch {
|
|
1201
|
+
try {
|
|
1202
|
+
fs.rmSync(temporary, { force: true });
|
|
1203
|
+
}
|
|
1204
|
+
catch { /* nothing to clean */ }
|
|
1205
|
+
}
|
|
1206
|
+
}
|
|
1207
|
+
persistStage(sessionName, phase) {
|
|
1208
|
+
const current = this.records.get(sessionName);
|
|
1209
|
+
if (current)
|
|
1210
|
+
this.persist(sessionName, current.record.attemptId, { phase });
|
|
1211
|
+
}
|
|
1212
|
+
/**
|
|
1213
|
+
* After a daemon restart, pick up the seat's managed compaction from the record beside its newest attempt, when an
|
|
1214
|
+
* earlier daemon process wrote it. This runs once per seat, and only when this daemon holds nothing for that seat.
|
|
1215
|
+
* - An owed post-compact stage (turn boundary, restore, audit) is resumed, and so is the restore after a /compact that
|
|
1216
|
+
* was being sent or whose outcome was lost.
|
|
1217
|
+
* - An automatic preparation is waited on rather than begun again. A prompt whose delivery wasn't recorded may have
|
|
1218
|
+
* reached the seat, so it is never sent again.
|
|
1219
|
+
* - A manual preparation stops, because its caller is gone.
|
|
1220
|
+
* A record of another occupant, or in any other shape (see `readCompactionRecord`), is left alone. An open post-compact
|
|
1221
|
+
* record older than the recovery window isn't resumed; it reads as stranded, at the stage it owes.
|
|
1222
|
+
*/
|
|
1223
|
+
recoverAfterRestart(input, preparationRoot) {
|
|
1224
|
+
const session = input.sessionName;
|
|
1225
|
+
if (input.runtime !== "claude-code" || this.recovered.has(session))
|
|
1226
|
+
return;
|
|
1227
|
+
this.recovered.add(session);
|
|
1228
|
+
if (this.pendingPreCompactPrep.has(session) || this.pendingPostCompactRestore.has(session))
|
|
1229
|
+
return;
|
|
1230
|
+
const key = sanitizeSessionKey(session);
|
|
1231
|
+
// The places beginPreparation puts an attempt: an explicit root, the seat's workspace, or the instance home.
|
|
1232
|
+
const dirs = new Set([
|
|
1233
|
+
...(preparationRoot ? [path.join(preparationRoot, key)] : []),
|
|
1234
|
+
...(input.cwd && path.isAbsolute(input.cwd) ? [path.join(input.cwd, ".openrig", "compaction", "preparation", key)] : []),
|
|
1235
|
+
path.join(this.openrigHome, "compaction", "preparation", key),
|
|
1236
|
+
]);
|
|
1237
|
+
let newest = null;
|
|
1238
|
+
for (const dir of dirs) {
|
|
1239
|
+
let entries;
|
|
1240
|
+
try {
|
|
1241
|
+
entries = fs.readdirSync(dir);
|
|
1242
|
+
}
|
|
1243
|
+
catch {
|
|
1244
|
+
continue;
|
|
1245
|
+
}
|
|
1246
|
+
for (const entry of entries) {
|
|
1247
|
+
const file = path.join(dir, entry, COMPACTION_RECORD_FILE);
|
|
1248
|
+
const record = readCompactionRecord(file);
|
|
1249
|
+
if (record && record.session === session && record.attemptId === entry && (!newest || record.updatedAt > newest.record.updatedAt)) {
|
|
1250
|
+
newest = { file, record };
|
|
1251
|
+
}
|
|
1252
|
+
}
|
|
1253
|
+
}
|
|
1254
|
+
if (!newest)
|
|
1255
|
+
return;
|
|
1256
|
+
const { record } = newest;
|
|
1257
|
+
// This process's own record (another enforcer in it) is live state, not a predecessor's.
|
|
1258
|
+
if (record.daemon === this.daemonInstance || record.phase === "done" || record.phase === "ended")
|
|
1259
|
+
return;
|
|
1260
|
+
const live = this.resolveOccupantGeneration?.(session) ?? this.sessionTransport.deliveryGuard?.maybeTarget(session)?.occupant ?? null;
|
|
1261
|
+
if (record.occupantGeneration !== null && live !== null && live !== record.occupantGeneration)
|
|
1262
|
+
return;
|
|
1263
|
+
const stale = this.now() - record.updatedAt > this.restartRecoveryWindowMs;
|
|
1264
|
+
// A /compact whose send had begun, or whose outcome was lost, is never sent again; its restore steps are owed in case it
|
|
1265
|
+
// ran, each only into an empty input box. The restore request tells a seat that didn't compact to say so and skip.
|
|
1266
|
+
const phase = (record.phase === "preparing" && record.compactSending) || record.phase === "compact_uncertain" ? "turn_boundary" : record.phase;
|
|
1267
|
+
const inFlight = phase !== record.phase;
|
|
1268
|
+
if (phase === "preparing") {
|
|
1269
|
+
if (stale)
|
|
1270
|
+
return; // Its preparation deadline passed long ago; a fresh attempt may begin.
|
|
1271
|
+
this.records.set(session, newest);
|
|
1272
|
+
this.pendingPreCompactPrep.set(session, {
|
|
1273
|
+
policyActor: { source: "openrig" }, attemptId: record.attemptId, occupantGeneration: record.occupantGeneration,
|
|
1274
|
+
mapPath: record.mapPath, marker: record.marker, mode: record.mode,
|
|
1275
|
+
status: record.delivery === "not_sent" ? "sending" : "waiting",
|
|
1276
|
+
delivery: record.delivery === "pending" ? "uncertain" : record.delivery,
|
|
1277
|
+
compact: "not_sent", sends: record.sends,
|
|
1278
|
+
deadlineAt: record.deadlineAt ?? (record.delivery === "not_sent" ? null : record.updatedAt + AUTO_PREP_WAIT_MS_DEFAULT),
|
|
1279
|
+
policyWasEnabled: true, preparationRoot: record.preparationRoot, controller: new AbortController(),
|
|
1280
|
+
compactInstruction: record.compactInstruction,
|
|
1281
|
+
});
|
|
1282
|
+
if (record.mode === "manual")
|
|
1283
|
+
this.stopPreparation(session, "daemon_restarted");
|
|
1284
|
+
return;
|
|
1285
|
+
}
|
|
1286
|
+
if (stale) {
|
|
1287
|
+
this.stranded.set(session, { ...record, phase });
|
|
1288
|
+
return;
|
|
1289
|
+
}
|
|
1290
|
+
this.records.set(session, newest);
|
|
1291
|
+
this.pendingPostCompactRestore.set(session, phase);
|
|
1292
|
+
this.pendingStageGeneration.set(session, record.occupantGeneration);
|
|
1293
|
+
if (inFlight || record.uncertainCompact) {
|
|
1294
|
+
this.afterUncertainCompact.add(session);
|
|
1295
|
+
this.persist(session, record.attemptId, { uncertainCompact: true });
|
|
1296
|
+
}
|
|
1297
|
+
if (record.restoreCarry)
|
|
1298
|
+
this.restoreCarry.set(session, record.restoreCarry);
|
|
1299
|
+
// As after a /compact this daemon sent: no new automatic compaction until the owed stages finish.
|
|
1300
|
+
this.lastAutoCompactAt.set(session, this.now());
|
|
1301
|
+
this.triggeredAboveThreshold.add(session);
|
|
1302
|
+
if (record.mode === "manual") {
|
|
1303
|
+
this.setManualStage(session, phase === "compliance_prompt" ? "restore-sent" : "compact-sent", undefined, record.operatorInitiated);
|
|
1304
|
+
}
|
|
1305
|
+
}
|
|
924
1306
|
stopPreparation(session, reason, expected) {
|
|
925
1307
|
const attempt = this.pendingPreCompactPrep.get(session);
|
|
926
1308
|
if ((expected && expected !== attempt) || !attempt || attempt.status === "stopped" || attempt.status === "compact-sent")
|
|
@@ -929,6 +1311,7 @@ export class ClaudeCompactionEnforcer {
|
|
|
929
1311
|
attempt.reason = reason;
|
|
930
1312
|
attempt.stoppedAt = this.now();
|
|
931
1313
|
attempt.controller.abort();
|
|
1314
|
+
this.persist(session, attempt.attemptId, { phase: attempt.compact === "uncertain" ? "compact_uncertain" : "ended" });
|
|
932
1315
|
if (attempt.mode === "manual")
|
|
933
1316
|
this.setManualStage(session, "skipped-or-failed", reason);
|
|
934
1317
|
}
|
|
@@ -945,13 +1328,20 @@ export class ClaudeCompactionEnforcer {
|
|
|
945
1328
|
attempt.reason = "compaction_cancelled";
|
|
946
1329
|
attempt.controller.abort();
|
|
947
1330
|
}
|
|
1331
|
+
this.persistStage(session, "ended");
|
|
948
1332
|
this.pendingPostCompactRestore.delete(session);
|
|
949
1333
|
this.pendingStageGeneration.delete(session);
|
|
950
1334
|
this.restoreCarry.delete(session);
|
|
1335
|
+
this.afterUncertainCompact.delete(session);
|
|
1336
|
+
this.lastInputBox.delete(session);
|
|
951
1337
|
this.setManualStage(session, "cancelled", "compaction_cancelled");
|
|
952
1338
|
}
|
|
953
|
-
else
|
|
1339
|
+
else {
|
|
954
1340
|
this.stopPreparation(session, "preparation_cancelled");
|
|
1341
|
+
// A cancel also ends an uncertain /compact's owed restore, so a restart doesn't resume it.
|
|
1342
|
+
if (attempt?.compact === "uncertain")
|
|
1343
|
+
this.persistStage(session, "ended");
|
|
1344
|
+
}
|
|
955
1345
|
return this.getPreparationState(session);
|
|
956
1346
|
}
|
|
957
1347
|
getPreparationState(session) {
|
|
@@ -959,7 +1349,7 @@ export class ClaudeCompactionEnforcer {
|
|
|
959
1349
|
const attempt = this.pendingPreCompactPrep.get(session);
|
|
960
1350
|
if (!attempt)
|
|
961
1351
|
return null;
|
|
962
|
-
const { controller: _controller, sends: _sends, policyWasEnabled: _enabled, compactInstruction: _instruction, stoppedAt: _stoppedAt, cancelled: _cancelled, ...state } = attempt;
|
|
1352
|
+
const { controller: _controller, sends: _sends, policyWasEnabled: _enabled, preparationRoot: _preparationRoot, compactInstruction: _instruction, stoppedAt: _stoppedAt, cancelled: _cancelled, ...state } = attempt;
|
|
963
1353
|
return state;
|
|
964
1354
|
}
|
|
965
1355
|
/** OPR.0.4.3.14 — read the surfaced manual-trigger state for a seat (AC-3). */
|
|
@@ -976,6 +1366,11 @@ export class ClaudeCompactionEnforcer {
|
|
|
976
1366
|
*/
|
|
977
1367
|
invalidateOccupant(sessionName) {
|
|
978
1368
|
this.stopPreparation(sessionName, "stale_generation");
|
|
1369
|
+
this.persistStage(sessionName, "ended");
|
|
1370
|
+
this.records.delete(sessionName);
|
|
1371
|
+
this.stranded.delete(sessionName);
|
|
1372
|
+
this.afterUncertainCompact.delete(sessionName);
|
|
1373
|
+
this.lastInputBox.delete(sessionName);
|
|
979
1374
|
this.lastAutoCompactAt.delete(sessionName);
|
|
980
1375
|
this.postCompactRestoreCooldownUntil.delete(sessionName);
|
|
981
1376
|
this.triggeredAboveThreshold.delete(sessionName);
|