@openrig/cli 0.6.4 → 0.6.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +384 -0
- package/daemon/assets/onboarding/02-self-and-competent-action.md +5 -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/scripts/refocus.cjs +100 -20
- package/daemon/assets/plugins/openrig-core/skills/claude-compaction-restore/SKILL.md +201 -132
- package/daemon/assets/plugins/openrig-core/skills/claude-compaction-restore/reference/SKILL-v1.md +143 -0
- package/daemon/assets/plugins/openrig-core/skills/forming-an-openrig-mental-model/SKILL.md +11 -11
- package/daemon/assets/plugins/openrig-core/skills/loading-addressable-markdown/scripts/resolve-markdown.mjs +2 -1
- package/daemon/assets/plugins/openrig-core/skills/messaging-the-human/SKILL.md +24 -0
- package/daemon/assets/plugins/openrig-core/skills/mission-slice-sop/SKILL.md +2 -2
- package/daemon/assets/plugins/openrig-core/skills/openrig-operating-model/SKILL.md +17 -0
- package/daemon/assets/plugins/openrig-core/skills/openrig-operating-model/scripts/compose.py +2 -2
- package/daemon/assets/plugins/openrig-core/skills/openrig-skills/SKILL.md +6 -0
- package/daemon/assets/plugins/openrig-core/skills/openrig-user/SKILL.md +45 -19
- package/daemon/assets/plugins/openrig-core/skills/orienting-to-an-inherited-seat/SKILL.md +5 -7
- package/daemon/assets/plugins/openrig-core/skills/queue-handoff/SKILL.md +1 -19
- package/daemon/assets/plugins/openrig-core/skills/refocusing/SKILL.md +3 -0
- package/daemon/assets/plugins/openrig-core/skills/refocusing/scripts/trace-to-root.py +56 -4
- package/daemon/assets/plugins/openrig-core/skills/seat-continuity-and-handover/SKILL.md +0 -5
- package/daemon/assets/plugins/openrig-core/skills/session-compaction-and-restore/SKILL.md +5 -6
- package/daemon/context-packs/help/help.md +9 -4
- package/daemon/context-packs/help/manifest.yaml +1 -1
- package/daemon/context-packs/onboarding-width/manifest.yaml +1 -1
- package/daemon/context-packs/onboarding-width/public-what-you-can-do.md +25 -12
- package/daemon/context-packs/reference/getting-started.md +7 -2
- package/daemon/context-packs/reference/instance-layout.md +11 -0
- package/daemon/context-packs/reference/manifest.yaml +1 -1
- package/daemon/context-packs/reference/rig-spec.md +32 -5
- package/daemon/context-packs/skills/agent-operated-software/manifest.yaml +1 -1
- package/daemon/context-packs/skills/agent-operated-workflows/manifest.yaml +1 -1
- package/daemon/context-packs/skills/applying-a-permission-policy/manifest.yaml +1 -1
- package/daemon/context-packs/skills/claude-compaction-restore/SKILL.md +201 -132
- package/daemon/context-packs/skills/claude-compaction-restore/manifest.yaml +5 -3
- package/daemon/context-packs/skills/claude-compaction-restore/reference/SKILL-v1.md +143 -0
- package/daemon/context-packs/skills/core/agent-starters/manifest.yaml +1 -1
- package/daemon/context-packs/skills/core/agent-startup-and-context-ingestion/manifest.yaml +1 -1
- package/daemon/context-packs/skills/core/cross-host-rig-commands/manifest.yaml +1 -1
- package/daemon/context-packs/skills/core/human-in-the-loop/manifest.yaml +1 -1
- package/daemon/context-packs/skills/core/messaging-the-human/SKILL.md +24 -0
- package/daemon/context-packs/skills/core/messaging-the-human/manifest.yaml +1 -1
- package/daemon/context-packs/skills/core/openrig-architect/manifest.yaml +1 -1
- package/daemon/context-packs/skills/core/openrig-cmux/manifest.yaml +1 -1
- package/daemon/context-packs/skills/core/openrig-herdr/manifest.yaml +1 -1
- package/daemon/context-packs/skills/core/openrig-skills/SKILL.md +6 -0
- package/daemon/context-packs/skills/core/openrig-skills/manifest.yaml +1 -1
- package/daemon/context-packs/skills/core/openrig-software-factory/manifest.yaml +1 -1
- package/daemon/context-packs/skills/core/openrig-upgrade/manifest.yaml +1 -1
- package/daemon/context-packs/skills/core/rig-bundles-and-shareable-artifacts/manifest.yaml +1 -1
- package/daemon/context-packs/skills/core/rig-lifecycle/manifest.yaml +1 -1
- package/daemon/context-packs/skills/core/session-source-fork/manifest.yaml +1 -1
- package/daemon/context-packs/skills/core/specification-system/manifest.yaml +1 -1
- package/daemon/context-packs/skills/core/topology-mutation-and-seat-management/SKILL.md +24 -3
- package/daemon/context-packs/skills/core/topology-mutation-and-seat-management/manifest.yaml +3 -3
- 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 +11 -11
- 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/loading-addressable-markdown/scripts/resolve-markdown.mjs +2 -1
- package/daemon/context-packs/skills/mission-slice-sop/SKILL.md +2 -2
- package/daemon/context-packs/skills/mission-slice-sop/manifest.yaml +1 -1
- package/daemon/context-packs/skills/openrig-operating-model/SKILL.md +17 -0
- package/daemon/context-packs/skills/openrig-operating-model/manifest.yaml +1 -1
- package/daemon/context-packs/skills/openrig-operating-model/scripts/compose.py +2 -2
- package/daemon/context-packs/skills/openrig-user/SKILL.md +45 -19
- package/daemon/context-packs/skills/openrig-user/manifest.yaml +1 -1
- package/daemon/context-packs/skills/orienting-to-an-inherited-seat/SKILL.md +5 -7
- 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/SKILL.md +1 -19
- package/daemon/context-packs/skills/queue-handoff/manifest.yaml +1 -1
- package/daemon/context-packs/skills/refocusing/SKILL.md +3 -0
- package/daemon/context-packs/skills/refocusing/manifest.yaml +1 -1
- package/daemon/context-packs/skills/refocusing/scripts/trace-to-root.py +56 -4
- package/daemon/context-packs/skills/retiring-and-inheriting-a-seat/manifest.yaml +1 -1
- package/daemon/context-packs/skills/seat-continuity-and-handover/SKILL.md +0 -5
- package/daemon/context-packs/skills/seat-continuity-and-handover/manifest.yaml +1 -1
- package/daemon/context-packs/skills/session-compaction-and-restore/SKILL.md +5 -6
- 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 +17 -3
- package/daemon/dist/adapters/claude-code-adapter.d.ts.map +1 -1
- package/daemon/dist/adapters/claude-code-adapter.js +157 -53
- package/daemon/dist/adapters/claude-code-adapter.js.map +1 -1
- package/daemon/dist/adapters/claude-resume.d.ts +7 -1
- package/daemon/dist/adapters/claude-resume.d.ts.map +1 -1
- package/daemon/dist/adapters/claude-resume.js +39 -8
- package/daemon/dist/adapters/claude-resume.js.map +1 -1
- package/daemon/dist/adapters/codex-resume.d.ts +7 -1
- package/daemon/dist/adapters/codex-resume.d.ts.map +1 -1
- package/daemon/dist/adapters/codex-resume.js +14 -6
- package/daemon/dist/adapters/codex-resume.js.map +1 -1
- package/daemon/dist/adapters/codex-runtime-adapter.d.ts +8 -0
- package/daemon/dist/adapters/codex-runtime-adapter.d.ts.map +1 -1
- package/daemon/dist/adapters/codex-runtime-adapter.js +34 -12
- package/daemon/dist/adapters/codex-runtime-adapter.js.map +1 -1
- package/daemon/dist/adapters/compose-services-adapter.d.ts +2 -1
- package/daemon/dist/adapters/compose-services-adapter.d.ts.map +1 -1
- package/daemon/dist/adapters/compose-services-adapter.js +5 -2
- package/daemon/dist/adapters/compose-services-adapter.js.map +1 -1
- package/daemon/dist/adapters/daemon-url.d.ts +7 -0
- package/daemon/dist/adapters/daemon-url.d.ts.map +1 -0
- package/daemon/dist/adapters/daemon-url.js +12 -0
- package/daemon/dist/adapters/daemon-url.js.map +1 -0
- package/daemon/dist/adapters/omp-resume.d.ts +6 -0
- package/daemon/dist/adapters/omp-resume.d.ts.map +1 -0
- package/daemon/dist/adapters/omp-resume.js +6 -0
- package/daemon/dist/adapters/omp-resume.js.map +1 -0
- package/daemon/dist/adapters/omp-runtime-adapter.d.ts +10 -0
- package/daemon/dist/adapters/omp-runtime-adapter.d.ts.map +1 -0
- package/daemon/dist/adapters/omp-runtime-adapter.js +16 -0
- package/daemon/dist/adapters/omp-runtime-adapter.js.map +1 -0
- package/daemon/dist/adapters/pi-resume.d.ts +4 -0
- package/daemon/dist/adapters/pi-resume.d.ts.map +1 -1
- package/daemon/dist/adapters/pi-resume.js +20 -18
- package/daemon/dist/adapters/pi-resume.js.map +1 -1
- package/daemon/dist/adapters/pi-runner-protocol.d.ts +14 -2
- package/daemon/dist/adapters/pi-runner-protocol.d.ts.map +1 -1
- package/daemon/dist/adapters/pi-runner-protocol.js +62 -5
- package/daemon/dist/adapters/pi-runner-protocol.js.map +1 -1
- package/daemon/dist/adapters/pi-runner.d.ts +49 -5
- package/daemon/dist/adapters/pi-runner.d.ts.map +1 -1
- package/daemon/dist/adapters/pi-runner.js +362 -67
- package/daemon/dist/adapters/pi-runner.js.map +1 -1
- package/daemon/dist/adapters/pi-runtime-adapter.d.ts +3 -2
- package/daemon/dist/adapters/pi-runtime-adapter.d.ts.map +1 -1
- package/daemon/dist/adapters/pi-runtime-adapter.js +49 -32
- package/daemon/dist/adapters/pi-runtime-adapter.js.map +1 -1
- package/daemon/dist/adapters/preflight-exec.d.ts +11 -0
- package/daemon/dist/adapters/preflight-exec.d.ts.map +1 -0
- package/daemon/dist/adapters/preflight-exec.js +52 -0
- package/daemon/dist/adapters/preflight-exec.js.map +1 -0
- package/daemon/dist/adapters/stub-runner.d.ts.map +1 -1
- package/daemon/dist/adapters/stub-runner.js +3 -1
- package/daemon/dist/adapters/stub-runner.js.map +1 -1
- package/daemon/dist/adapters/stub-runtime-adapter.js +1 -1
- package/daemon/dist/adapters/stub-runtime-adapter.js.map +1 -1
- package/daemon/dist/adapters/tmux.d.ts +47 -5
- package/daemon/dist/adapters/tmux.d.ts.map +1 -1
- package/daemon/dist/adapters/tmux.js +305 -54
- package/daemon/dist/adapters/tmux.js.map +1 -1
- package/daemon/dist/build-info.js +3 -3
- package/daemon/dist/daemon-shutdown.d.ts +19 -0
- package/daemon/dist/daemon-shutdown.d.ts.map +1 -1
- package/daemon/dist/daemon-shutdown.js +81 -0
- package/daemon/dist/daemon-shutdown.js.map +1 -1
- package/daemon/dist/db/all-migrations.d.ts +1 -1
- package/daemon/dist/db/all-migrations.d.ts.map +1 -1
- package/daemon/dist/db/all-migrations.js +10 -2
- package/daemon/dist/db/all-migrations.js.map +1 -1
- package/daemon/dist/db/migrations/090_human_reply_to.d.ts +3 -0
- package/daemon/dist/db/migrations/090_human_reply_to.d.ts.map +1 -0
- package/daemon/dist/db/migrations/090_human_reply_to.js +7 -0
- package/daemon/dist/db/migrations/090_human_reply_to.js.map +1 -0
- package/daemon/dist/db/migrations/091_human_questions.d.ts +3 -0
- package/daemon/dist/db/migrations/091_human_questions.d.ts.map +1 -0
- package/daemon/dist/db/migrations/091_human_questions.js +9 -0
- package/daemon/dist/db/migrations/091_human_questions.js.map +1 -0
- package/daemon/dist/db/migrations/092_node_effort.d.ts +3 -0
- package/daemon/dist/db/migrations/092_node_effort.d.ts.map +1 -0
- package/daemon/dist/db/migrations/092_node_effort.js +8 -0
- package/daemon/dist/db/migrations/092_node_effort.js.map +1 -0
- package/daemon/dist/db/migrations/094_usage_samples_latest_indexes.d.ts +3 -0
- package/daemon/dist/db/migrations/094_usage_samples_latest_indexes.d.ts.map +1 -0
- package/daemon/dist/db/migrations/094_usage_samples_latest_indexes.js +12 -0
- package/daemon/dist/db/migrations/094_usage_samples_latest_indexes.js.map +1 -0
- package/daemon/dist/domain/activity-endpoint.d.ts.map +1 -1
- package/daemon/dist/domain/activity-endpoint.js +3 -1
- package/daemon/dist/domain/activity-endpoint.js.map +1 -1
- package/daemon/dist/domain/agent-activity-store.d.ts +3 -1
- package/daemon/dist/domain/agent-activity-store.d.ts.map +1 -1
- package/daemon/dist/domain/agent-activity-store.js +13 -3
- package/daemon/dist/domain/agent-activity-store.js.map +1 -1
- package/daemon/dist/domain/agent-images/agent-image-library-service.d.ts.map +1 -1
- package/daemon/dist/domain/agent-images/agent-image-library-service.js +76 -56
- package/daemon/dist/domain/agent-images/agent-image-library-service.js.map +1 -1
- package/daemon/dist/domain/agent-manifest.d.ts.map +1 -1
- package/daemon/dist/domain/agent-manifest.js +24 -3
- package/daemon/dist/domain/agent-manifest.js.map +1 -1
- package/daemon/dist/domain/bootstrap-orchestrator.d.ts.map +1 -1
- package/daemon/dist/domain/bootstrap-orchestrator.js +3 -2
- package/daemon/dist/domain/bootstrap-orchestrator.js.map +1 -1
- package/daemon/dist/domain/bundle-archive.d.ts.map +1 -1
- package/daemon/dist/domain/bundle-archive.js +25 -5
- package/daemon/dist/domain/bundle-archive.js.map +1 -1
- package/daemon/dist/domain/chat-repository.d.ts.map +1 -1
- package/daemon/dist/domain/chat-repository.js +3 -1
- package/daemon/dist/domain/chat-repository.js.map +1 -1
- package/daemon/dist/domain/checkpoint-store.d.ts.map +1 -1
- package/daemon/dist/domain/checkpoint-store.js +2 -2
- package/daemon/dist/domain/checkpoint-store.js.map +1 -1
- package/daemon/dist/domain/claim-service.d.ts +7 -0
- package/daemon/dist/domain/claim-service.d.ts.map +1 -1
- package/daemon/dist/domain/claim-service.js +6 -2
- package/daemon/dist/domain/claim-service.js.map +1 -1
- package/daemon/dist/domain/claude-compaction-enforcer.d.ts +35 -12
- package/daemon/dist/domain/claude-compaction-enforcer.d.ts.map +1 -1
- package/daemon/dist/domain/claude-compaction-enforcer.js +256 -128
- package/daemon/dist/domain/claude-compaction-enforcer.js.map +1 -1
- package/daemon/dist/domain/claude-managed-launch.d.ts +13 -0
- package/daemon/dist/domain/claude-managed-launch.d.ts.map +1 -1
- package/daemon/dist/domain/claude-managed-launch.js +31 -4
- package/daemon/dist/domain/claude-managed-launch.js.map +1 -1
- package/daemon/dist/domain/codex-daemon-support.d.ts +1 -1
- package/daemon/dist/domain/codex-daemon-support.d.ts.map +1 -1
- package/daemon/dist/domain/codex-daemon-support.js +2 -2
- package/daemon/dist/domain/codex-daemon-support.js.map +1 -1
- package/daemon/dist/domain/codex-network-default.d.ts +42 -0
- package/daemon/dist/domain/codex-network-default.d.ts.map +1 -0
- package/daemon/dist/domain/codex-network-default.js +230 -0
- package/daemon/dist/domain/codex-network-default.js.map +1 -0
- package/daemon/dist/domain/codex-profile-preflight.d.ts +1 -1
- package/daemon/dist/domain/codex-profile-preflight.d.ts.map +1 -1
- package/daemon/dist/domain/codex-profile-preflight.js +3 -3
- package/daemon/dist/domain/codex-profile-preflight.js.map +1 -1
- package/daemon/dist/domain/codex-thread-id.d.ts +4 -2
- package/daemon/dist/domain/codex-thread-id.d.ts.map +1 -1
- package/daemon/dist/domain/codex-thread-id.js +10 -6
- package/daemon/dist/domain/codex-thread-id.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/context-packs/context-pack-library-service.d.ts.map +1 -1
- package/daemon/dist/domain/context-packs/context-pack-library-service.js +13 -2
- package/daemon/dist/domain/context-packs/context-pack-library-service.js.map +1 -1
- package/daemon/dist/domain/context-packs/profile-composer.d.ts +5 -0
- package/daemon/dist/domain/context-packs/profile-composer.d.ts.map +1 -1
- package/daemon/dist/domain/context-packs/profile-composer.js +30 -15
- package/daemon/dist/domain/context-packs/profile-composer.js.map +1 -1
- package/daemon/dist/domain/context-packs/profile-source-resolver.d.ts +10 -0
- package/daemon/dist/domain/context-packs/profile-source-resolver.d.ts.map +1 -1
- package/daemon/dist/domain/context-packs/profile-source-resolver.js +43 -8
- package/daemon/dist/domain/context-packs/profile-source-resolver.js.map +1 -1
- package/daemon/dist/domain/context-packs/seat-recap-store.d.ts.map +1 -1
- package/daemon/dist/domain/context-packs/seat-recap-store.js +73 -16
- package/daemon/dist/domain/context-packs/seat-recap-store.js.map +1 -1
- package/daemon/dist/domain/context-usage-store.d.ts +3 -0
- package/daemon/dist/domain/context-usage-store.d.ts.map +1 -1
- package/daemon/dist/domain/context-usage-store.js +4 -2
- package/daemon/dist/domain/context-usage-store.js.map +1 -1
- package/daemon/dist/domain/crash-cart-detect.d.ts.map +1 -1
- package/daemon/dist/domain/crash-cart-detect.js +2 -1
- package/daemon/dist/domain/crash-cart-detect.js.map +1 -1
- package/daemon/dist/domain/crash-cart-discovery.d.ts.map +1 -1
- package/daemon/dist/domain/crash-cart-discovery.js +4 -2
- package/daemon/dist/domain/crash-cart-discovery.js.map +1 -1
- package/daemon/dist/domain/current-work.d.ts +17 -0
- package/daemon/dist/domain/current-work.d.ts.map +1 -1
- package/daemon/dist/domain/current-work.js +46 -0
- package/daemon/dist/domain/current-work.js.map +1 -1
- package/daemon/dist/domain/cwd-resolution.js +1 -1
- package/daemon/dist/domain/cwd-resolution.js.map +1 -1
- package/daemon/dist/domain/daemon-url.d.ts +7 -0
- package/daemon/dist/domain/daemon-url.d.ts.map +1 -0
- package/daemon/dist/domain/daemon-url.js +12 -0
- package/daemon/dist/domain/daemon-url.js.map +1 -0
- package/daemon/dist/domain/discovery-types.d.ts +1 -1
- package/daemon/dist/domain/discovery-types.d.ts.map +1 -1
- package/daemon/dist/domain/event-bus.d.ts +1 -0
- package/daemon/dist/domain/event-bus.d.ts.map +1 -1
- package/daemon/dist/domain/event-bus.js +18 -7
- package/daemon/dist/domain/event-bus.js.map +1 -1
- package/daemon/dist/domain/execution-view.d.ts +3 -3
- package/daemon/dist/domain/execution-view.d.ts.map +1 -1
- package/daemon/dist/domain/execution-view.js +116 -93
- package/daemon/dist/domain/execution-view.js.map +1 -1
- package/daemon/dist/domain/gateway/operator-delivery-engine.d.ts +9 -7
- package/daemon/dist/domain/gateway/operator-delivery-engine.d.ts.map +1 -1
- package/daemon/dist/domain/gateway/operator-delivery-engine.js +38 -16
- package/daemon/dist/domain/gateway/operator-delivery-engine.js.map +1 -1
- package/daemon/dist/domain/gateway/slack/inbound.d.ts +71 -3
- package/daemon/dist/domain/gateway/slack/inbound.d.ts.map +1 -1
- package/daemon/dist/domain/gateway/slack/inbound.js +145 -11
- package/daemon/dist/domain/gateway/slack/inbound.js.map +1 -1
- package/daemon/dist/domain/gateway/slack/manifest.js +1 -1
- package/daemon/dist/domain/gateway/slack/manifest.js.map +1 -1
- package/daemon/dist/domain/gateway/slack/message.d.ts +17 -0
- package/daemon/dist/domain/gateway/slack/message.d.ts.map +1 -1
- package/daemon/dist/domain/gateway/slack/message.js +77 -3
- package/daemon/dist/domain/gateway/slack/message.js.map +1 -1
- package/daemon/dist/domain/gateway/slack/outbound-driver.d.ts +3 -0
- package/daemon/dist/domain/gateway/slack/outbound-driver.d.ts.map +1 -1
- package/daemon/dist/domain/gateway/slack/outbound-driver.js +2 -0
- package/daemon/dist/domain/gateway/slack/outbound-driver.js.map +1 -1
- package/daemon/dist/domain/gateway/slack/queue-access.d.ts +3 -0
- package/daemon/dist/domain/gateway/slack/queue-access.d.ts.map +1 -1
- package/daemon/dist/domain/gateway/slack/queue-access.js +15 -5
- package/daemon/dist/domain/gateway/slack/queue-access.js.map +1 -1
- package/daemon/dist/domain/gateway/slack/secrets.d.ts.map +1 -1
- package/daemon/dist/domain/gateway/slack/secrets.js +5 -4
- package/daemon/dist/domain/gateway/slack/secrets.js.map +1 -1
- package/daemon/dist/domain/gateway/slack/slack-api.d.ts +16 -10
- package/daemon/dist/domain/gateway/slack/slack-api.d.ts.map +1 -1
- package/daemon/dist/domain/gateway/slack/slack-api.js +91 -23
- package/daemon/dist/domain/gateway/slack/slack-api.js.map +1 -1
- package/daemon/dist/domain/gateway/slack/slack-delivery.d.ts +33 -10
- package/daemon/dist/domain/gateway/slack/slack-delivery.d.ts.map +1 -1
- package/daemon/dist/domain/gateway/slack/slack-delivery.js +107 -26
- package/daemon/dist/domain/gateway/slack/slack-delivery.js.map +1 -1
- package/daemon/dist/domain/gateway/slack/slack-subsystem.d.ts +1 -1
- package/daemon/dist/domain/gateway/slack/slack-subsystem.d.ts.map +1 -1
- package/daemon/dist/domain/gateway/slack/slack-subsystem.js +114 -27
- package/daemon/dist/domain/gateway/slack/slack-subsystem.js.map +1 -1
- package/daemon/dist/domain/gateway/slack/socket-inbound.d.ts.map +1 -1
- package/daemon/dist/domain/gateway/slack/socket-inbound.js +3 -0
- package/daemon/dist/domain/gateway/slack/socket-inbound.js.map +1 -1
- package/daemon/dist/domain/gateway/slack/state-store.d.ts +3 -0
- package/daemon/dist/domain/gateway/slack/state-store.d.ts.map +1 -1
- package/daemon/dist/domain/gateway/slack/state-store.js +18 -0
- package/daemon/dist/domain/gateway/slack/state-store.js.map +1 -1
- package/daemon/dist/domain/gateway/slack/thread-routing.d.ts.map +1 -1
- package/daemon/dist/domain/gateway/slack/thread-routing.js +7 -2
- package/daemon/dist/domain/gateway/slack/thread-routing.js.map +1 -1
- package/daemon/dist/domain/gateway/slack/thread-seat-map.d.ts +3 -0
- package/daemon/dist/domain/gateway/slack/thread-seat-map.d.ts.map +1 -1
- package/daemon/dist/domain/gateway/slack/thread-seat-map.js +14 -2
- package/daemon/dist/domain/gateway/slack/thread-seat-map.js.map +1 -1
- package/daemon/dist/domain/graph-projection.d.ts.map +1 -1
- package/daemon/dist/domain/graph-projection.js +1 -0
- package/daemon/dist/domain/graph-projection.js.map +1 -1
- package/daemon/dist/domain/health-checkpoints.d.ts +2 -0
- package/daemon/dist/domain/health-checkpoints.d.ts.map +1 -1
- package/daemon/dist/domain/health-checkpoints.js +2 -0
- package/daemon/dist/domain/health-checkpoints.js.map +1 -1
- package/daemon/dist/domain/health-detectors.d.ts +32 -1
- package/daemon/dist/domain/health-detectors.d.ts.map +1 -1
- package/daemon/dist/domain/health-detectors.js +40 -9
- package/daemon/dist/domain/health-detectors.js.map +1 -1
- package/daemon/dist/domain/health-diagnosis.d.ts +3 -1
- package/daemon/dist/domain/health-diagnosis.d.ts.map +1 -1
- package/daemon/dist/domain/health-diagnosis.js +6 -3
- package/daemon/dist/domain/health-diagnosis.js.map +1 -1
- package/daemon/dist/domain/health-passive-ceremony.d.ts +5 -1
- package/daemon/dist/domain/health-passive-ceremony.d.ts.map +1 -1
- package/daemon/dist/domain/health-passive-ceremony.js +20 -4
- package/daemon/dist/domain/health-passive-ceremony.js.map +1 -1
- package/daemon/dist/domain/hosts/remote-daemon-http.d.ts +3 -1
- package/daemon/dist/domain/hosts/remote-daemon-http.d.ts.map +1 -1
- package/daemon/dist/domain/hosts/remote-daemon-http.js +10 -3
- package/daemon/dist/domain/hosts/remote-daemon-http.js.map +1 -1
- package/daemon/dist/domain/human-questions.d.ts +41 -0
- package/daemon/dist/domain/human-questions.d.ts.map +1 -0
- package/daemon/dist/domain/human-questions.js +81 -0
- package/daemon/dist/domain/human-questions.js.map +1 -0
- package/daemon/dist/domain/markdown-address.js +1 -1
- package/daemon/dist/domain/markdown-address.js.map +1 -1
- package/daemon/dist/domain/mission-control/audit-browse.d.ts +5 -0
- package/daemon/dist/domain/mission-control/audit-browse.d.ts.map +1 -1
- package/daemon/dist/domain/mission-control/audit-browse.js +11 -1
- package/daemon/dist/domain/mission-control/audit-browse.js.map +1 -1
- package/daemon/dist/domain/mission-control/mission-control-fleet-cli-capability.d.ts +25 -63
- package/daemon/dist/domain/mission-control/mission-control-fleet-cli-capability.d.ts.map +1 -1
- package/daemon/dist/domain/mission-control/mission-control-fleet-cli-capability.js +34 -100
- package/daemon/dist/domain/mission-control/mission-control-fleet-cli-capability.js.map +1 -1
- package/daemon/dist/domain/mission-control/mission-control-read-layer.d.ts +1 -0
- package/daemon/dist/domain/mission-control/mission-control-read-layer.d.ts.map +1 -1
- package/daemon/dist/domain/mission-control/mission-control-read-layer.js +6 -3
- package/daemon/dist/domain/mission-control/mission-control-read-layer.js.map +1 -1
- package/daemon/dist/domain/mission-control/notification-adapter-ntfy.d.ts +5 -0
- package/daemon/dist/domain/mission-control/notification-adapter-ntfy.d.ts.map +1 -1
- package/daemon/dist/domain/mission-control/notification-adapter-ntfy.js +33 -2
- package/daemon/dist/domain/mission-control/notification-adapter-ntfy.js.map +1 -1
- package/daemon/dist/domain/mission-control/notification-adapter-types.d.ts +2 -0
- package/daemon/dist/domain/mission-control/notification-adapter-types.d.ts.map +1 -1
- package/daemon/dist/domain/mission-control/notification-adapter-webhook.d.ts +4 -0
- package/daemon/dist/domain/mission-control/notification-adapter-webhook.d.ts.map +1 -1
- package/daemon/dist/domain/mission-control/notification-adapter-webhook.js +33 -2
- package/daemon/dist/domain/mission-control/notification-adapter-webhook.js.map +1 -1
- package/daemon/dist/domain/mission-control/outbound-url-validator.d.ts +27 -0
- package/daemon/dist/domain/mission-control/outbound-url-validator.d.ts.map +1 -0
- package/daemon/dist/domain/mission-control/outbound-url-validator.js +60 -0
- package/daemon/dist/domain/mission-control/outbound-url-validator.js.map +1 -0
- package/daemon/dist/domain/native-process-lineage.d.ts +9 -2
- package/daemon/dist/domain/native-process-lineage.d.ts.map +1 -1
- package/daemon/dist/domain/native-process-lineage.js +104 -11
- package/daemon/dist/domain/native-process-lineage.js.map +1 -1
- package/daemon/dist/domain/native-resume-probe.d.ts +5 -1
- package/daemon/dist/domain/native-resume-probe.d.ts.map +1 -1
- package/daemon/dist/domain/native-resume-probe.js +17 -4
- package/daemon/dist/domain/native-resume-probe.js.map +1 -1
- package/daemon/dist/domain/node-inventory.d.ts.map +1 -1
- package/daemon/dist/domain/node-inventory.js +91 -44
- package/daemon/dist/domain/node-inventory.js.map +1 -1
- package/daemon/dist/domain/node-launcher.d.ts +4 -0
- package/daemon/dist/domain/node-launcher.d.ts.map +1 -1
- package/daemon/dist/domain/node-launcher.js +4 -1
- package/daemon/dist/domain/node-launcher.js.map +1 -1
- package/daemon/dist/domain/periodic-snapshot-scheduler.d.ts +1 -0
- package/daemon/dist/domain/periodic-snapshot-scheduler.d.ts.map +1 -1
- package/daemon/dist/domain/periodic-snapshot-scheduler.js +25 -0
- package/daemon/dist/domain/periodic-snapshot-scheduler.js.map +1 -1
- package/daemon/dist/domain/permission-drift.d.ts +1 -0
- package/daemon/dist/domain/permission-drift.d.ts.map +1 -1
- package/daemon/dist/domain/permission-drift.js +13 -1
- package/daemon/dist/domain/permission-drift.js.map +1 -1
- package/daemon/dist/domain/plugin-discovery-service.d.ts +5 -6
- package/daemon/dist/domain/plugin-discovery-service.d.ts.map +1 -1
- package/daemon/dist/domain/plugin-discovery-service.js +14 -8
- package/daemon/dist/domain/plugin-discovery-service.js.map +1 -1
- package/daemon/dist/domain/pod-bundle-assembler.d.ts +6 -2
- package/daemon/dist/domain/pod-bundle-assembler.d.ts.map +1 -1
- package/daemon/dist/domain/pod-bundle-assembler.js +58 -15
- package/daemon/dist/domain/pod-bundle-assembler.js.map +1 -1
- package/daemon/dist/domain/policies/parked-owner-consumer.d.ts +6 -0
- package/daemon/dist/domain/policies/parked-owner-consumer.d.ts.map +1 -1
- package/daemon/dist/domain/policies/parked-owner-consumer.js +11 -0
- package/daemon/dist/domain/policies/parked-owner-consumer.js.map +1 -1
- package/daemon/dist/domain/profile-resolver.d.ts +1 -0
- package/daemon/dist/domain/profile-resolver.d.ts.map +1 -1
- package/daemon/dist/domain/profile-resolver.js +7 -0
- package/daemon/dist/domain/profile-resolver.js.map +1 -1
- package/daemon/dist/domain/project-lifecycle-compiler.d.ts.map +1 -1
- package/daemon/dist/domain/project-lifecycle-compiler.js +10 -2
- package/daemon/dist/domain/project-lifecycle-compiler.js.map +1 -1
- package/daemon/dist/domain/projection-planner.d.ts.map +1 -1
- package/daemon/dist/domain/projection-planner.js +14 -5
- package/daemon/dist/domain/projection-planner.js.map +1 -1
- package/daemon/dist/domain/proof/judgments.d.ts +3 -0
- package/daemon/dist/domain/proof/judgments.d.ts.map +1 -1
- package/daemon/dist/domain/proof/judgments.js +13 -8
- package/daemon/dist/domain/proof/judgments.js.map +1 -1
- package/daemon/dist/domain/proof/source-watch.d.ts.map +1 -1
- package/daemon/dist/domain/proof/source-watch.js +45 -27
- package/daemon/dist/domain/proof/source-watch.js.map +1 -1
- package/daemon/dist/domain/provider/host-usage-rollup.js +9 -5
- package/daemon/dist/domain/provider/host-usage-rollup.js.map +1 -1
- package/daemon/dist/domain/ps-projection.d.ts +22 -3
- package/daemon/dist/domain/ps-projection.d.ts.map +1 -1
- package/daemon/dist/domain/ps-projection.js +50 -11
- package/daemon/dist/domain/ps-projection.js.map +1 -1
- package/daemon/dist/domain/queue-recovery.d.ts.map +1 -1
- package/daemon/dist/domain/queue-recovery.js +7 -1
- package/daemon/dist/domain/queue-recovery.js.map +1 -1
- package/daemon/dist/domain/queue-repository.d.ts +98 -6
- package/daemon/dist/domain/queue-repository.d.ts.map +1 -1
- package/daemon/dist/domain/queue-repository.js +301 -33
- package/daemon/dist/domain/queue-repository.js.map +1 -1
- package/daemon/dist/domain/queue-stuck-sweep.d.ts +3 -0
- package/daemon/dist/domain/queue-stuck-sweep.d.ts.map +1 -1
- package/daemon/dist/domain/queue-stuck-sweep.js +111 -26
- package/daemon/dist/domain/queue-stuck-sweep.js.map +1 -1
- package/daemon/dist/domain/queue-wake-ladder.d.ts +8 -7
- package/daemon/dist/domain/queue-wake-ladder.d.ts.map +1 -1
- package/daemon/dist/domain/queue-wake-ladder.js +278 -19
- package/daemon/dist/domain/queue-wake-ladder.js.map +1 -1
- package/daemon/dist/domain/queue-wake-repository.d.ts +10 -9
- package/daemon/dist/domain/queue-wake-repository.d.ts.map +1 -1
- package/daemon/dist/domain/queue-wake-repository.js +31 -11
- package/daemon/dist/domain/queue-wake-repository.js.map +1 -1
- package/daemon/dist/domain/reply-to-choice.d.ts +26 -0
- package/daemon/dist/domain/reply-to-choice.d.ts.map +1 -0
- package/daemon/dist/domain/reply-to-choice.js +45 -0
- package/daemon/dist/domain/reply-to-choice.js.map +1 -0
- package/daemon/dist/domain/restore-check-service.d.ts +27 -8
- package/daemon/dist/domain/restore-check-service.d.ts.map +1 -1
- package/daemon/dist/domain/restore-check-service.js +202 -126
- package/daemon/dist/domain/restore-check-service.js.map +1 -1
- package/daemon/dist/domain/restore-orchestrator.d.ts +3 -2
- package/daemon/dist/domain/restore-orchestrator.d.ts.map +1 -1
- package/daemon/dist/domain/restore-orchestrator.js +65 -208
- package/daemon/dist/domain/restore-orchestrator.js.map +1 -1
- package/daemon/dist/domain/restore-plan-preview.d.ts.map +1 -1
- package/daemon/dist/domain/restore-plan-preview.js +2 -6
- package/daemon/dist/domain/restore-plan-preview.js.map +1 -1
- package/daemon/dist/domain/restore-preconditions.d.ts +12 -0
- package/daemon/dist/domain/restore-preconditions.d.ts.map +1 -0
- package/daemon/dist/domain/restore-preconditions.js +202 -0
- package/daemon/dist/domain/restore-preconditions.js.map +1 -0
- package/daemon/dist/domain/resume-metadata-refresher.d.ts +20 -4
- package/daemon/dist/domain/resume-metadata-refresher.d.ts.map +1 -1
- package/daemon/dist/domain/resume-metadata-refresher.js +70 -8
- package/daemon/dist/domain/resume-metadata-refresher.js.map +1 -1
- package/daemon/dist/domain/resume-token-capture.d.ts +22 -1
- package/daemon/dist/domain/resume-token-capture.d.ts.map +1 -1
- package/daemon/dist/domain/resume-token-capture.js +32 -4
- package/daemon/dist/domain/resume-token-capture.js.map +1 -1
- package/daemon/dist/domain/resume-token-validation.d.ts +1 -1
- package/daemon/dist/domain/resume-token-validation.d.ts.map +1 -1
- package/daemon/dist/domain/resume-token-validation.js +24 -24
- package/daemon/dist/domain/resume-token-validation.js.map +1 -1
- package/daemon/dist/domain/rig-repository.d.ts +3 -0
- package/daemon/dist/domain/rig-repository.d.ts.map +1 -1
- package/daemon/dist/domain/rig-repository.js +21 -0
- package/daemon/dist/domain/rig-repository.js.map +1 -1
- package/daemon/dist/domain/rig-teardown.d.ts +3 -0
- package/daemon/dist/domain/rig-teardown.d.ts.map +1 -1
- package/daemon/dist/domain/rig-teardown.js +96 -19
- 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 +6 -0
- package/daemon/dist/domain/rigspec-codec.js.map +1 -1
- package/daemon/dist/domain/rigspec-exporter.d.ts.map +1 -1
- package/daemon/dist/domain/rigspec-exporter.js +4 -0
- package/daemon/dist/domain/rigspec-exporter.js.map +1 -1
- package/daemon/dist/domain/rigspec-instantiator.d.ts.map +1 -1
- package/daemon/dist/domain/rigspec-instantiator.js +37 -8
- package/daemon/dist/domain/rigspec-instantiator.js.map +1 -1
- package/daemon/dist/domain/rigspec-preflight.d.ts +2 -0
- package/daemon/dist/domain/rigspec-preflight.d.ts.map +1 -1
- package/daemon/dist/domain/rigspec-preflight.js +20 -5
- package/daemon/dist/domain/rigspec-preflight.js.map +1 -1
- package/daemon/dist/domain/rigspec-schema.d.ts.map +1 -1
- package/daemon/dist/domain/rigspec-schema.js +14 -2
- package/daemon/dist/domain/rigspec-schema.js.map +1 -1
- package/daemon/dist/domain/runtime-adapter.d.ts +7 -0
- package/daemon/dist/domain/runtime-adapter.d.ts.map +1 -1
- package/daemon/dist/domain/runtime-adapter.js.map +1 -1
- package/daemon/dist/domain/runtime-verifier.d.ts +3 -1
- package/daemon/dist/domain/runtime-verifier.d.ts.map +1 -1
- package/daemon/dist/domain/runtime-verifier.js +10 -1
- package/daemon/dist/domain/runtime-verifier.js.map +1 -1
- package/daemon/dist/domain/scope/scaffold-placeholder.d.ts +4 -4
- package/daemon/dist/domain/scope/scaffold-placeholder.d.ts.map +1 -1
- package/daemon/dist/domain/scope/scaffold-placeholder.js +4 -4
- package/daemon/dist/domain/scope/scaffold-placeholder.js.map +1 -1
- package/daemon/dist/domain/seat-activity-service.d.ts +9 -4
- package/daemon/dist/domain/seat-activity-service.d.ts.map +1 -1
- package/daemon/dist/domain/seat-activity-service.js +73 -22
- package/daemon/dist/domain/seat-activity-service.js.map +1 -1
- package/daemon/dist/domain/seat-attention-reconciler.d.ts +1 -0
- package/daemon/dist/domain/seat-attention-reconciler.d.ts.map +1 -1
- package/daemon/dist/domain/seat-attention-reconciler.js +32 -9
- package/daemon/dist/domain/seat-attention-reconciler.js.map +1 -1
- package/daemon/dist/domain/seat-handover-service.d.ts +6 -0
- package/daemon/dist/domain/seat-handover-service.d.ts.map +1 -1
- package/daemon/dist/domain/seat-handover-service.js +8 -5
- package/daemon/dist/domain/seat-handover-service.js.map +1 -1
- package/daemon/dist/domain/seat-identity-reconciler.d.ts +1 -1
- package/daemon/dist/domain/seat-identity-reconciler.d.ts.map +1 -1
- package/daemon/dist/domain/seat-identity-reconciler.js +99 -18
- package/daemon/dist/domain/seat-identity-reconciler.js.map +1 -1
- package/daemon/dist/domain/seat-launch-environment.d.ts +26 -0
- package/daemon/dist/domain/seat-launch-environment.d.ts.map +1 -0
- package/daemon/dist/domain/seat-launch-environment.js +178 -0
- package/daemon/dist/domain/seat-launch-environment.js.map +1 -0
- package/daemon/dist/domain/seat-lifecycle-service.d.ts +7 -0
- package/daemon/dist/domain/seat-lifecycle-service.d.ts.map +1 -1
- package/daemon/dist/domain/seat-lifecycle-service.js +37 -2
- package/daemon/dist/domain/seat-lifecycle-service.js.map +1 -1
- package/daemon/dist/domain/seat-status-service.d.ts.map +1 -1
- package/daemon/dist/domain/seat-status-service.js +4 -2
- package/daemon/dist/domain/seat-status-service.js.map +1 -1
- package/daemon/dist/domain/seat-structural-activity-service.d.ts +5 -4
- package/daemon/dist/domain/seat-structural-activity-service.d.ts.map +1 -1
- package/daemon/dist/domain/seat-structural-activity-service.js +23 -9
- package/daemon/dist/domain/seat-structural-activity-service.js.map +1 -1
- package/daemon/dist/domain/seat-switch-client-service.d.ts.map +1 -1
- package/daemon/dist/domain/seat-switch-client-service.js +3 -2
- package/daemon/dist/domain/seat-switch-client-service.js.map +1 -1
- package/daemon/dist/domain/services-readiness.d.ts.map +1 -1
- package/daemon/dist/domain/services-readiness.js +6 -2
- package/daemon/dist/domain/services-readiness.js.map +1 -1
- package/daemon/dist/domain/session-fingerprinter.d.ts.map +1 -1
- package/daemon/dist/domain/session-fingerprinter.js +16 -1
- package/daemon/dist/domain/session-fingerprinter.js.map +1 -1
- package/daemon/dist/domain/session-name.d.ts.map +1 -1
- package/daemon/dist/domain/session-name.js +6 -0
- package/daemon/dist/domain/session-name.js.map +1 -1
- package/daemon/dist/domain/session-registry.d.ts +3 -0
- package/daemon/dist/domain/session-registry.d.ts.map +1 -1
- package/daemon/dist/domain/session-registry.js +7 -0
- package/daemon/dist/domain/session-registry.js.map +1 -1
- package/daemon/dist/domain/session-transport.d.ts +30 -1
- package/daemon/dist/domain/session-transport.d.ts.map +1 -1
- package/daemon/dist/domain/session-transport.js +290 -145
- package/daemon/dist/domain/session-transport.js.map +1 -1
- package/daemon/dist/domain/snapshot-repository.d.ts +2 -1
- package/daemon/dist/domain/snapshot-repository.d.ts.map +1 -1
- package/daemon/dist/domain/snapshot-repository.js +39 -15
- package/daemon/dist/domain/snapshot-repository.js.map +1 -1
- package/daemon/dist/domain/spec-library-workflow-scanner.d.ts +1 -1
- package/daemon/dist/domain/spec-library-workflow-scanner.d.ts.map +1 -1
- package/daemon/dist/domain/spec-library-workflow-scanner.js +70 -11
- package/daemon/dist/domain/spec-library-workflow-scanner.js.map +1 -1
- package/daemon/dist/domain/spec-validation-service.d.ts +6 -0
- package/daemon/dist/domain/spec-validation-service.d.ts.map +1 -1
- package/daemon/dist/domain/spec-validation-service.js +16 -1
- package/daemon/dist/domain/spec-validation-service.js.map +1 -1
- package/daemon/dist/domain/startup-orchestrator.d.ts +8 -0
- package/daemon/dist/domain/startup-orchestrator.d.ts.map +1 -1
- package/daemon/dist/domain/startup-orchestrator.js +148 -37
- package/daemon/dist/domain/startup-orchestrator.js.map +1 -1
- package/daemon/dist/domain/startup-submission-evidence.d.ts +41 -0
- package/daemon/dist/domain/startup-submission-evidence.d.ts.map +1 -0
- package/daemon/dist/domain/startup-submission-evidence.js +67 -0
- package/daemon/dist/domain/startup-submission-evidence.js.map +1 -0
- package/daemon/dist/domain/startup-validation.d.ts.map +1 -1
- package/daemon/dist/domain/startup-validation.js +4 -0
- package/daemon/dist/domain/startup-validation.js.map +1 -1
- package/daemon/dist/domain/successor-session-launcher.d.ts +5 -0
- package/daemon/dist/domain/successor-session-launcher.d.ts.map +1 -1
- package/daemon/dist/domain/successor-session-launcher.js +8 -6
- package/daemon/dist/domain/successor-session-launcher.js.map +1 -1
- package/daemon/dist/domain/terminal/view-composer.d.ts.map +1 -1
- package/daemon/dist/domain/terminal/view-composer.js +2 -1
- package/daemon/dist/domain/terminal/view-composer.js.map +1 -1
- package/daemon/dist/domain/tmux-discovery-scanner.d.ts.map +1 -1
- package/daemon/dist/domain/tmux-discovery-scanner.js +7 -2
- package/daemon/dist/domain/tmux-discovery-scanner.js.map +1 -1
- package/daemon/dist/domain/tmux-option-defaults.d.ts.map +1 -1
- package/daemon/dist/domain/tmux-option-defaults.js +5 -0
- package/daemon/dist/domain/tmux-option-defaults.js.map +1 -1
- package/daemon/dist/domain/transcript-capture.d.ts.map +1 -1
- package/daemon/dist/domain/transcript-capture.js +1 -1
- package/daemon/dist/domain/transcript-capture.js.map +1 -1
- package/daemon/dist/domain/transcript-rotation.d.ts +26 -5
- package/daemon/dist/domain/transcript-rotation.d.ts.map +1 -1
- package/daemon/dist/domain/transcript-rotation.js +176 -25
- package/daemon/dist/domain/transcript-rotation.js.map +1 -1
- package/daemon/dist/domain/transcript-store.d.ts +1 -1
- package/daemon/dist/domain/transcript-store.d.ts.map +1 -1
- package/daemon/dist/domain/transcript-store.js +11 -4
- package/daemon/dist/domain/transcript-store.js.map +1 -1
- package/daemon/dist/domain/types.d.ts +18 -5
- package/daemon/dist/domain/types.d.ts.map +1 -1
- package/daemon/dist/domain/types.js.map +1 -1
- package/daemon/dist/domain/usage-series.d.ts.map +1 -1
- package/daemon/dist/domain/usage-series.js +11 -6
- package/daemon/dist/domain/usage-series.js.map +1 -1
- package/daemon/dist/domain/user-settings/settings-store.d.ts +2 -0
- package/daemon/dist/domain/user-settings/settings-store.d.ts.map +1 -1
- package/daemon/dist/domain/user-settings/settings-store.js +88 -6
- package/daemon/dist/domain/user-settings/settings-store.js.map +1 -1
- package/daemon/dist/domain/view-projector.d.ts +11 -6
- package/daemon/dist/domain/view-projector.d.ts.map +1 -1
- package/daemon/dist/domain/view-projector.js +2 -6
- package/daemon/dist/domain/view-projector.js.map +1 -1
- package/daemon/dist/domain/workflow-spec-cache.d.ts +29 -7
- package/daemon/dist/domain/workflow-spec-cache.d.ts.map +1 -1
- package/daemon/dist/domain/workflow-spec-cache.js +103 -14
- package/daemon/dist/domain/workflow-spec-cache.js.map +1 -1
- package/daemon/dist/domain/workspace/workspace-doctor.js +1 -1
- package/daemon/dist/domain/workspace/workspace-doctor.js.map +1 -1
- package/daemon/dist/domain/workspace/workspace-resolver.js +1 -1
- package/daemon/dist/domain/workspace/workspace-resolver.js.map +1 -1
- package/daemon/dist/health-detectors-surface.d.ts +1 -1
- package/daemon/dist/health-detectors-surface.d.ts.map +1 -1
- package/daemon/dist/health-detectors-surface.js.map +1 -1
- package/daemon/dist/index.d.ts +4 -4
- package/daemon/dist/index.d.ts.map +1 -1
- package/daemon/dist/index.js +11 -7
- package/daemon/dist/index.js.map +1 -1
- package/daemon/dist/middleware/json-body-error.d.ts +17 -0
- package/daemon/dist/middleware/json-body-error.d.ts.map +1 -0
- package/daemon/dist/middleware/json-body-error.js +42 -0
- package/daemon/dist/middleware/json-body-error.js.map +1 -0
- package/daemon/dist/routes/activity.d.ts.map +1 -1
- package/daemon/dist/routes/activity.js +85 -6
- package/daemon/dist/routes/activity.js.map +1 -1
- package/daemon/dist/routes/attention.d.ts.map +1 -1
- package/daemon/dist/routes/attention.js +7 -1
- package/daemon/dist/routes/attention.js.map +1 -1
- package/daemon/dist/routes/bundles.js +32 -3
- 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 +30 -2
- package/daemon/dist/routes/compaction.js.map +1 -1
- package/daemon/dist/routes/context-packs.d.ts.map +1 -1
- package/daemon/dist/routes/context-packs.js +10 -2
- package/daemon/dist/routes/context-packs.js.map +1 -1
- package/daemon/dist/routes/files.js +2 -2
- package/daemon/dist/routes/files.js.map +1 -1
- package/daemon/dist/routes/gateway.d.ts.map +1 -1
- package/daemon/dist/routes/gateway.js +6 -1
- package/daemon/dist/routes/gateway.js.map +1 -1
- package/daemon/dist/routes/hosts.d.ts.map +1 -1
- package/daemon/dist/routes/hosts.js +51 -12
- 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 +6 -2
- package/daemon/dist/routes/mission-control.js.map +1 -1
- package/daemon/dist/routes/missions.d.ts.map +1 -1
- package/daemon/dist/routes/missions.js +17 -5
- package/daemon/dist/routes/missions.js.map +1 -1
- package/daemon/dist/routes/plugins.d.ts.map +1 -1
- package/daemon/dist/routes/plugins.js +5 -1
- package/daemon/dist/routes/plugins.js.map +1 -1
- package/daemon/dist/routes/proof.d.ts.map +1 -1
- package/daemon/dist/routes/proof.js +9 -2
- package/daemon/dist/routes/proof.js.map +1 -1
- package/daemon/dist/routes/ps.d.ts.map +1 -1
- package/daemon/dist/routes/ps.js +18 -0
- package/daemon/dist/routes/ps.js.map +1 -1
- package/daemon/dist/routes/queue.d.ts.map +1 -1
- package/daemon/dist/routes/queue.js +150 -67
- package/daemon/dist/routes/queue.js.map +1 -1
- package/daemon/dist/routes/restore-check.d.ts.map +1 -1
- package/daemon/dist/routes/restore-check.js +40 -1
- package/daemon/dist/routes/restore-check.js.map +1 -1
- package/daemon/dist/routes/rigs.js +1 -1
- 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 +7 -10
- package/daemon/dist/routes/rigspec.js.map +1 -1
- package/daemon/dist/routes/seat.d.ts.map +1 -1
- package/daemon/dist/routes/seat.js +11 -0
- package/daemon/dist/routes/seat.js.map +1 -1
- package/daemon/dist/routes/sessions.js +1 -1
- package/daemon/dist/routes/sessions.js.map +1 -1
- package/daemon/dist/routes/telemetry.d.ts.map +1 -1
- package/daemon/dist/routes/telemetry.js +6 -1
- package/daemon/dist/routes/telemetry.js.map +1 -1
- package/daemon/dist/routes/terminal-ws.d.ts +1 -2
- package/daemon/dist/routes/terminal-ws.d.ts.map +1 -1
- package/daemon/dist/routes/terminal-ws.js +1 -2
- package/daemon/dist/routes/terminal-ws.js.map +1 -1
- package/daemon/dist/routes/up.js +2 -1
- package/daemon/dist/routes/up.js.map +1 -1
- package/daemon/dist/routes/views.js +2 -2
- package/daemon/dist/routes/views.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 +7 -2
- package/daemon/dist/server.js.map +1 -1
- package/daemon/dist/spec-validation-surface.d.ts +2 -0
- package/daemon/dist/spec-validation-surface.d.ts.map +1 -0
- package/daemon/dist/spec-validation-surface.js +2 -0
- package/daemon/dist/spec-validation-surface.js.map +1 -0
- package/daemon/dist/startup.d.ts +1 -1
- package/daemon/dist/startup.d.ts.map +1 -1
- package/daemon/dist/startup.js +137 -50
- package/daemon/dist/startup.js.map +1 -1
- package/daemon/dist/terminal/TerminalSessionBroker.d.ts +1 -0
- package/daemon/dist/terminal/TerminalSessionBroker.d.ts.map +1 -1
- package/daemon/dist/terminal/TerminalSessionBroker.js +8 -1
- package/daemon/dist/terminal/TerminalSessionBroker.js.map +1 -1
- package/daemon/docs/reference/agent-spec.md +36 -1
- package/daemon/docs/reference/agent-startup-guide.md +81 -2
- package/daemon/docs/reference/browser-access.md +4 -1
- package/daemon/docs/reference/developing.md +17 -9
- package/daemon/docs/reference/getting-started.md +7 -2
- package/daemon/docs/reference/health-diagnosis.md +10 -3
- package/daemon/docs/reference/help.md +9 -4
- package/daemon/docs/reference/host-resources.md +60 -0
- package/daemon/docs/reference/instance-layout.md +11 -0
- package/daemon/docs/reference/rig-spec.md +32 -5
- package/daemon/docs/reference/sdlc-conventions.md +6 -3
- package/daemon/docs/reference/slack-app-setup.md +6 -0
- package/daemon/specs/agents/shared/agent.yaml +1 -1
- package/daemon/specs/agents/shared/skills/core/messaging-the-human/SKILL.md +24 -0
- package/daemon/specs/agents/shared/skills/core/openrig-skills/SKILL.md +6 -0
- package/daemon/specs/agents/shared/skills/core/topology-mutation-and-seat-management/SKILL.md +24 -3
- package/daemon/specs/rigs/launch/kernel/agents/advisor/lead/agent.yaml +2 -8
- package/daemon/specs/rigs/launch/kernel/agents/operator/agent/agent.yaml +2 -8
- package/daemon/specs/rigs/launch/kernel/agents/queue/worker/agent.yaml +2 -8
- package/daemon/specs/rigs/preview/product-team/topology/rig/ORCHESTRATION-CRAFT.md +1 -1
- package/dist/atomic-text-write.d.ts +3 -0
- package/dist/atomic-text-write.d.ts.map +1 -0
- package/dist/atomic-text-write.js +79 -0
- package/dist/atomic-text-write.js.map +1 -0
- package/dist/build-info.js +3 -3
- package/dist/cli-error.d.ts.map +1 -1
- package/dist/cli-error.js +15 -2
- package/dist/cli-error.js.map +1 -1
- package/dist/client.d.ts +14 -1
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +29 -4
- package/dist/client.js.map +1 -1
- package/dist/commands/agent-image.d.ts.map +1 -1
- package/dist/commands/agent-image.js +2 -0
- package/dist/commands/agent-image.js.map +1 -1
- package/dist/commands/ask.d.ts.map +1 -1
- package/dist/commands/ask.js +10 -1
- package/dist/commands/ask.js.map +1 -1
- package/dist/commands/bootstrap.d.ts.map +1 -1
- package/dist/commands/bootstrap.js +4 -6
- package/dist/commands/bootstrap.js.map +1 -1
- package/dist/commands/broadcast.js +1 -1
- package/dist/commands/broadcast.js.map +1 -1
- package/dist/commands/chatroom.d.ts.map +1 -1
- package/dist/commands/chatroom.js +22 -1
- package/dist/commands/chatroom.js.map +1 -1
- package/dist/commands/compact-plan.d.ts.map +1 -1
- package/dist/commands/compact-plan.js +34 -5
- package/dist/commands/compact-plan.js.map +1 -1
- package/dist/commands/compact.d.ts.map +1 -1
- package/dist/commands/compact.js +24 -4
- package/dist/commands/compact.js.map +1 -1
- package/dist/commands/config.d.ts.map +1 -1
- package/dist/commands/config.js +2 -4
- package/dist/commands/config.js.map +1 -1
- package/dist/commands/context.d.ts.map +1 -1
- package/dist/commands/context.js +19 -14
- package/dist/commands/context.js.map +1 -1
- package/dist/commands/crash-cart.d.ts.map +1 -1
- package/dist/commands/crash-cart.js +2 -1
- package/dist/commands/crash-cart.js.map +1 -1
- package/dist/commands/daemon.d.ts +13 -1
- package/dist/commands/daemon.d.ts.map +1 -1
- package/dist/commands/daemon.js +35 -17
- package/dist/commands/daemon.js.map +1 -1
- package/dist/commands/destroy.d.ts.map +1 -1
- package/dist/commands/destroy.js +3 -2
- package/dist/commands/destroy.js.map +1 -1
- package/dist/commands/discover.d.ts.map +1 -1
- package/dist/commands/discover.js +2 -4
- package/dist/commands/discover.js.map +1 -1
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +3 -2
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/env.d.ts.map +1 -1
- package/dist/commands/env.js +8 -0
- package/dist/commands/env.js.map +1 -1
- package/dist/commands/export.js +2 -2
- package/dist/commands/export.js.map +1 -1
- package/dist/commands/gateway.d.ts.map +1 -1
- package/dist/commands/gateway.js +23 -3
- package/dist/commands/gateway.js.map +1 -1
- package/dist/commands/health.d.ts.map +1 -1
- package/dist/commands/health.js +9 -0
- package/dist/commands/health.js.map +1 -1
- package/dist/commands/host.d.ts.map +1 -1
- package/dist/commands/host.js +13 -3
- package/dist/commands/host.js.map +1 -1
- package/dist/commands/plugin.d.ts.map +1 -1
- package/dist/commands/plugin.js +12 -2
- package/dist/commands/plugin.js.map +1 -1
- package/dist/commands/ps.d.ts +1 -0
- package/dist/commands/ps.d.ts.map +1 -1
- package/dist/commands/ps.js +97 -35
- package/dist/commands/ps.js.map +1 -1
- package/dist/commands/queue.d.ts +2 -0
- package/dist/commands/queue.d.ts.map +1 -1
- package/dist/commands/queue.js +129 -17
- package/dist/commands/queue.js.map +1 -1
- package/dist/commands/requirements.d.ts.map +1 -1
- package/dist/commands/requirements.js +6 -3
- package/dist/commands/requirements.js.map +1 -1
- package/dist/commands/rig-mode.d.ts.map +1 -1
- package/dist/commands/rig-mode.js +6 -1
- package/dist/commands/rig-mode.js.map +1 -1
- package/dist/commands/rig.d.ts.map +1 -1
- package/dist/commands/rig.js +20 -20
- package/dist/commands/rig.js.map +1 -1
- package/dist/commands/scope.d.ts.map +1 -1
- package/dist/commands/scope.js +22 -0
- package/dist/commands/scope.js.map +1 -1
- package/dist/commands/seat.d.ts.map +1 -1
- package/dist/commands/seat.js +39 -9
- package/dist/commands/seat.js.map +1 -1
- package/dist/commands/setup.d.ts.map +1 -1
- package/dist/commands/setup.js +6 -5
- package/dist/commands/setup.js.map +1 -1
- package/dist/commands/slack.d.ts.map +1 -1
- package/dist/commands/slack.js +8 -1
- package/dist/commands/slack.js.map +1 -1
- package/dist/commands/specs.d.ts.map +1 -1
- package/dist/commands/specs.js +2 -0
- package/dist/commands/specs.js.map +1 -1
- package/dist/commands/start.js +6 -5
- package/dist/commands/start.js.map +1 -1
- package/dist/commands/startup-proof.d.ts.map +1 -1
- package/dist/commands/startup-proof.js +2 -1
- package/dist/commands/startup-proof.js.map +1 -1
- package/dist/commands/status.d.ts.map +1 -1
- package/dist/commands/status.js +7 -0
- package/dist/commands/status.js.map +1 -1
- package/dist/commands/terminal.d.ts.map +1 -1
- package/dist/commands/terminal.js +4 -0
- package/dist/commands/terminal.js.map +1 -1
- package/dist/commands/transcript.js +5 -3
- package/dist/commands/transcript.js.map +1 -1
- package/dist/commands/up.d.ts +8 -0
- package/dist/commands/up.d.ts.map +1 -1
- package/dist/commands/up.js +78 -4
- package/dist/commands/up.js.map +1 -1
- package/dist/commands/walk.d.ts.map +1 -1
- package/dist/commands/walk.js +3 -0
- package/dist/commands/walk.js.map +1 -1
- package/dist/commands/workflow-follow.d.ts +2 -0
- package/dist/commands/workflow-follow.d.ts.map +1 -1
- package/dist/commands/workflow-follow.js +6 -4
- package/dist/commands/workflow-follow.js.map +1 -1
- package/dist/commands/workflow.d.ts.map +1 -1
- package/dist/commands/workflow.js +2 -4
- package/dist/commands/workflow.js.map +1 -1
- package/dist/commands/workspace.d.ts.map +1 -1
- package/dist/commands/workspace.js +2 -4
- package/dist/commands/workspace.js.map +1 -1
- package/dist/config-store.d.ts +2 -0
- package/dist/config-store.d.ts.map +1 -1
- package/dist/config-store.js +24 -6
- package/dist/config-store.js.map +1 -1
- package/dist/daemon-lifecycle.d.ts +9 -0
- package/dist/daemon-lifecycle.d.ts.map +1 -1
- package/dist/daemon-lifecycle.js +61 -19
- package/dist/daemon-lifecycle.js.map +1 -1
- package/dist/daemon-reachability.d.ts +18 -0
- package/dist/daemon-reachability.d.ts.map +1 -0
- package/dist/daemon-reachability.js +48 -0
- package/dist/daemon-reachability.js.map +1 -0
- package/dist/lib/file-transfer.d.ts +1 -1
- package/dist/lib/file-transfer.d.ts.map +1 -1
- package/dist/lib/file-transfer.js +17 -5
- package/dist/lib/file-transfer.js.map +1 -1
- package/dist/lib/scope/mission-composition.d.ts.map +1 -1
- package/dist/lib/scope/mission-composition.js +11 -0
- package/dist/lib/scope/mission-composition.js.map +1 -1
- package/dist/lib/scope/scaffold-placeholder.d.ts +4 -4
- package/dist/lib/scope/scaffold-placeholder.d.ts.map +1 -1
- package/dist/lib/scope/scaffold-placeholder.js +4 -4
- package/dist/lib/scope/scaffold-placeholder.js.map +1 -1
- package/dist/lib/scope/scope-fs.d.ts.map +1 -1
- package/dist/lib/scope/scope-fs.js +10 -16
- package/dist/lib/scope/scope-fs.js.map +1 -1
- package/dist/lib/scope-templates/slice-progress.md +11 -7
- package/dist/restore-packet/claude-transcript-parser.d.ts.map +1 -1
- package/dist/restore-packet/claude-transcript-parser.js +2 -0
- package/dist/restore-packet/claude-transcript-parser.js.map +1 -1
- package/dist/restore-packet/codex-jsonl-parser.d.ts.map +1 -1
- package/dist/restore-packet/codex-jsonl-parser.js +2 -0
- package/dist/restore-packet/codex-jsonl-parser.js.map +1 -1
- package/dist/restore-packet/runtime-detect.d.ts.map +1 -1
- package/dist/restore-packet/runtime-detect.js +2 -0
- package/dist/restore-packet/runtime-detect.js.map +1 -1
- package/package.json +4 -3
- package/tui/dist/attention/source-continuity.d.ts.map +1 -1
- package/tui/dist/attention/source-continuity.js +5 -3
- package/tui/dist/attention/source-continuity.js.map +1 -1
- package/tui/dist/daemon-client.d.ts +2 -1
- package/tui/dist/daemon-client.d.ts.map +1 -1
- package/tui/dist/daemon-client.js +13 -4
- package/tui/dist/daemon-client.js.map +1 -1
- package/tui/dist/execution/execution-model.d.ts.map +1 -1
- package/tui/dist/execution/execution-model.js +19 -7
- package/tui/dist/execution/execution-model.js.map +1 -1
- package/tui/dist/grammar.d.ts.map +1 -1
- package/tui/dist/grammar.js +3 -2
- package/tui/dist/grammar.js.map +1 -1
- package/tui/dist/health/health-model.d.ts.map +1 -1
- package/tui/dist/health/health-model.js +17 -5
- package/tui/dist/health/health-model.js.map +1 -1
- package/tui/dist/hydrate.d.ts.map +1 -1
- package/tui/dist/hydrate.js +1 -0
- package/tui/dist/hydrate.js.map +1 -1
- package/tui/dist/input.d.ts.map +1 -1
- package/tui/dist/input.js +5 -0
- package/tui/dist/input.js.map +1 -1
- package/tui/dist/live-events.d.ts +2 -2
- package/tui/dist/live-events.d.ts.map +1 -1
- package/tui/dist/live-events.js +65 -27
- package/tui/dist/live-events.js.map +1 -1
- package/tui/dist/local-reading.d.ts.map +1 -1
- package/tui/dist/local-reading.js +2 -0
- package/tui/dist/local-reading.js.map +1 -1
- package/tui/dist/main.js +16 -3
- package/tui/dist/main.js.map +1 -1
- package/tui/dist/page-read.d.ts.map +1 -1
- package/tui/dist/page-read.js +4 -1
- package/tui/dist/page-read.js.map +1 -1
- package/tui/dist/render.d.ts +2 -0
- package/tui/dist/render.d.ts.map +1 -1
- package/tui/dist/render.js +15 -4
- package/tui/dist/render.js.map +1 -1
- package/tui/dist/scopes/scopes-model.d.ts.map +1 -1
- package/tui/dist/scopes/scopes-model.js +36 -31
- package/tui/dist/scopes/scopes-model.js.map +1 -1
- package/tui/dist/socket-server.d.ts +6 -2
- package/tui/dist/socket-server.d.ts.map +1 -1
- package/tui/dist/socket-server.js +159 -14
- package/tui/dist/socket-server.js.map +1 -1
- package/tui/dist/types.d.ts +18 -0
- package/tui/dist/types.d.ts.map +1 -1
- package/ui/dist/assets/{index-N-SdPj-I.css → index-DNU3XZr_.css} +1 -1
- package/ui/dist/assets/{index-BVW54ItO.js → index-HHSvwF97.js} +75 -75
- package/ui/dist/index.html +2 -2
|
@@ -104,11 +104,25 @@ function classifyWriteError(err) {
|
|
|
104
104
|
}
|
|
105
105
|
return { ok: false, code: "unknown", message: err.message };
|
|
106
106
|
}
|
|
107
|
-
/**
|
|
107
|
+
/** The most sessions one batched capture chains (#308). Not a byte bound: a chunk whose output overflows exec's buffer
|
|
108
|
+
* fails and is split in half. */
|
|
109
|
+
const CAPTURE_BATCH = 24;
|
|
108
110
|
function shellQuote(s) {
|
|
109
111
|
// Replace each ' with '"'"' (end quote, double-quote the apostrophe, resume quote)
|
|
110
112
|
return "'" + s.replace(/'/g, "'\"'\"'") + "'";
|
|
111
113
|
}
|
|
114
|
+
/**
|
|
115
|
+
* An exact tmux target for a session name. tmux resolves a bare name by prefix when no session has that exact name,
|
|
116
|
+
* so a read or pipe for a session that just ended would act on another (`dev-impl@my-rig` on `dev-impl@my-rig2`).
|
|
117
|
+
* Pane, window and session ids (`%3`, `@1`, `$2`) and `session:window.pane` targets pass through unchanged (tmux
|
|
118
|
+
* turns `:` in a session name into `_`, so a `:` always means an explicit target). A pane or window command gets
|
|
119
|
+
* `=name:` (as the batched capture uses); a session command gets `=name`.
|
|
120
|
+
*/
|
|
121
|
+
function exactTarget(target, kind) {
|
|
122
|
+
if (/^[%@$]\d+$/.test(target) || target.includes(":"))
|
|
123
|
+
return target;
|
|
124
|
+
return kind === "session" ? `=${target}` : `=${target}:`;
|
|
125
|
+
}
|
|
112
126
|
/** Elements safe to leave bare in a POSIX shell word list. */
|
|
113
127
|
const SHELL_SAFE = /^[A-Za-z0-9_@%+=:,./-]+$/;
|
|
114
128
|
/** Join argv for a POSIX shell — the legacy string form. Only used when
|
|
@@ -168,17 +182,17 @@ function parsePaneLine(line) {
|
|
|
168
182
|
if (parts.length < 6)
|
|
169
183
|
return null;
|
|
170
184
|
const index = parseInt(parts[1], 10);
|
|
171
|
-
const width = parseInt(parts
|
|
172
|
-
const height = parseInt(parts
|
|
185
|
+
const width = parseInt(parts.at(-3), 10);
|
|
186
|
+
const height = parseInt(parts.at(-2), 10);
|
|
173
187
|
if (isNaN(index) || isNaN(width) || isNaN(height))
|
|
174
188
|
return null;
|
|
175
189
|
return {
|
|
176
190
|
id: parts[0],
|
|
177
191
|
index,
|
|
178
|
-
cwd: parts
|
|
192
|
+
cwd: parts.slice(2, -3).join(TMUX_FIELD_SEPARATOR),
|
|
179
193
|
width,
|
|
180
194
|
height,
|
|
181
|
-
active: parts
|
|
195
|
+
active: parts.at(-1) === "1",
|
|
182
196
|
};
|
|
183
197
|
}
|
|
184
198
|
function parseLines(output, parser) {
|
|
@@ -280,9 +294,20 @@ export class TmuxAdapter {
|
|
|
280
294
|
const result = classifyWriteError(error);
|
|
281
295
|
// Only termination consumes positive absence. Unknown probe failures
|
|
282
296
|
// still refuse, and guard-on never reaches this observation.
|
|
283
|
-
if (allowAbsent && !result.ok
|
|
284
|
-
&& !/permission denied|operation not permitted|EACCES|EPERM/i.test(result.message))
|
|
285
|
-
|
|
297
|
+
if (allowAbsent && !result.ok
|
|
298
|
+
&& !/permission denied|operation not permitted|EACCES|EPERM/i.test(result.message)) {
|
|
299
|
+
if (result.code === "session_not_found")
|
|
300
|
+
return result;
|
|
301
|
+
// list-panes reports a missing session as "can't find window" on
|
|
302
|
+
// native tmux. Do not broaden write-error classification: only
|
|
303
|
+
// termination may confirm the bound session's positive absence.
|
|
304
|
+
if (/can't find window/i.test(result.message)) {
|
|
305
|
+
const probe = await this.probeSession(bound.session);
|
|
306
|
+
guard.checkInput(identity);
|
|
307
|
+
if (probe.state === "absent")
|
|
308
|
+
return { ok: false, code: "session_not_found", message: result.message };
|
|
309
|
+
}
|
|
310
|
+
}
|
|
286
311
|
throw error;
|
|
287
312
|
}
|
|
288
313
|
const pane = fresh ? created.pane : bound.pane;
|
|
@@ -369,8 +394,15 @@ export class TmuxAdapter {
|
|
|
369
394
|
}
|
|
370
395
|
}
|
|
371
396
|
async listPanes(target) {
|
|
397
|
+
// Callers name a session (optionally with a window), or an immutable tmux
|
|
398
|
+
// id. Exact session matching prevents observing a prefix neighbor's pane.
|
|
399
|
+
// A bare leading '=' belongs to the literal session name. Only qualified
|
|
400
|
+
// targets already carry tmux's encoded exact-match syntax.
|
|
401
|
+
const namedTarget = target.includes(":") && target.startsWith("=") ? target : `=${target}`;
|
|
402
|
+
const exactTarget = /^[%$@]\d+$/.test(target) ? target
|
|
403
|
+
: namedTarget.includes(":") ? namedTarget : `${namedTarget}:`;
|
|
372
404
|
try {
|
|
373
|
-
const output = await this.run(["tmux", "list-panes", "-t",
|
|
405
|
+
const output = await this.run(["tmux", "list-panes", "-t", exactTarget, "-F", PANE_FORMAT], `tmux list-panes -t ${shellQuote(exactTarget)} -F "${PANE_FORMAT}"`);
|
|
374
406
|
return parseLines(output, parsePaneLine);
|
|
375
407
|
}
|
|
376
408
|
catch (err) {
|
|
@@ -394,7 +426,8 @@ export class TmuxAdapter {
|
|
|
394
426
|
// Use `tmux has-session` directly for reliable existence check — avoids
|
|
395
427
|
// parsing format-string output from `list-sessions` which can fail when
|
|
396
428
|
// tab delimiters are malformed across tmux versions.
|
|
397
|
-
|
|
429
|
+
const target = `=${name}`; // canonical session name, never a prefix lookup
|
|
430
|
+
await this.run(["tmux", "has-session", "-t", target], `tmux has-session -t ${shellQuote(target)}`);
|
|
398
431
|
return { state: "present" }; // exit 0 = session exists
|
|
399
432
|
}
|
|
400
433
|
catch (err) {
|
|
@@ -435,18 +468,25 @@ export class TmuxAdapter {
|
|
|
435
468
|
/** The committed binding now owns identity; this is not filesystem cleanup. */
|
|
436
469
|
finishLaunchBinding(session) { this.freshManaged.delete(session); }
|
|
437
470
|
async createSessionUnchecked(name, cwd, env) {
|
|
471
|
+
// These are the daemon's resolved capture settings, not seat overrides.
|
|
472
|
+
// An empty per-session value prevents the tmux server's inherited values
|
|
473
|
+
// from pinning an old policy over config.json inside a newly launched seat.
|
|
474
|
+
// Explicit seat settings remain authoritative.
|
|
475
|
+
const seatEnv = {
|
|
476
|
+
OPENRIG_TRANSCRIPTS_LINES: "",
|
|
477
|
+
OPENRIG_TRANSCRIPTS_POLL_INTERVAL_SECONDS: "",
|
|
478
|
+
...env,
|
|
479
|
+
};
|
|
438
480
|
const argv = ["tmux", "new-session", "-d", "-s", name];
|
|
439
481
|
if (cwd != null)
|
|
440
482
|
argv.push("-c", cwd);
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
argv.push("-e", `${k}=${v}`);
|
|
483
|
+
for (const [k, v] of Object.entries(seatEnv))
|
|
484
|
+
argv.push("-e", `${k}=${v}`);
|
|
444
485
|
const legacyParts = ["tmux", "new-session", "-d", "-s", shellQuote(name)];
|
|
445
486
|
if (cwd != null)
|
|
446
487
|
legacyParts.push("-c", shellQuote(cwd));
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
legacyParts.push("-e", shellQuote(`${k}=${v}`));
|
|
488
|
+
for (const [k, v] of Object.entries(seatEnv))
|
|
489
|
+
legacyParts.push("-e", shellQuote(`${k}=${v}`));
|
|
450
490
|
try {
|
|
451
491
|
await this.run(argv, legacyParts.join(" "));
|
|
452
492
|
return { ok: true };
|
|
@@ -461,24 +501,26 @@ export class TmuxAdapter {
|
|
|
461
501
|
* A file keeps payload bytes out of shell/tmux argv and its size limits.
|
|
462
502
|
* `-p` bracket the paste when the receiving application enables that mode.
|
|
463
503
|
* `-r` preserve raw LF. tmux's default paste-buffer replaces every LF with
|
|
464
|
-
* CR, and CR
|
|
504
|
+
* CR, and CR is SUBMIT in the Claude/Codex TUIs - a
|
|
465
505
|
* default paste of a multi-line pack would submit on every newline.
|
|
466
506
|
* `-d` drop the buffer after a successful paste.
|
|
467
|
-
* The single trailing submit stays the caller's separate `sendKeys(["
|
|
507
|
+
* The single trailing submit stays the caller's separate `sendKeys(["Enter"])`.
|
|
468
508
|
* Cleanup unlinks the temp file in `finally`; if the buffer was loaded but the
|
|
469
509
|
* paste failed (e.g. missing target), an explicit `delete-buffer` runs so no
|
|
470
510
|
* buffer leaks. Unique temp + buffer names per call keep parallel `rig up`
|
|
471
511
|
* seats from colliding.
|
|
472
512
|
*/
|
|
473
|
-
async sendText(target, text) {
|
|
474
|
-
return this.guardedInput(target, (pane, beforeWrite) => this.sendTextUnchecked(pane, text, beforeWrite));
|
|
513
|
+
async sendText(target, text, beforeInput) {
|
|
514
|
+
return this.guardedInput(target, (pane, beforeWrite) => this.sendTextUnchecked(pane, text, () => { beforeWrite(); beforeInput?.(); }));
|
|
475
515
|
}
|
|
476
516
|
async sendTextUnchecked(target, text, beforeWrite) {
|
|
477
517
|
const path = this.fileOps.tmpName();
|
|
478
518
|
const buffer = this.fileOps.bufferName();
|
|
479
519
|
let bufferLoaded = false;
|
|
520
|
+
let created = false;
|
|
480
521
|
try {
|
|
481
|
-
await this.fileOps.writeFile(path, text);
|
|
522
|
+
await this.fileOps.writeFile(path, text, { mode: 0o600, flag: "wx" });
|
|
523
|
+
created = true;
|
|
482
524
|
await this.run(["tmux", "load-buffer", "-b", buffer, path], `tmux load-buffer -b ${shellQuote(buffer)} ${shellQuote(path)}`);
|
|
483
525
|
bufferLoaded = true;
|
|
484
526
|
beforeWrite();
|
|
@@ -497,10 +539,12 @@ export class TmuxAdapter {
|
|
|
497
539
|
return classifyWriteError(err);
|
|
498
540
|
}
|
|
499
541
|
finally {
|
|
500
|
-
|
|
501
|
-
|
|
542
|
+
if (created) {
|
|
543
|
+
try {
|
|
544
|
+
await this.fileOps.unlink(path);
|
|
545
|
+
}
|
|
546
|
+
catch { /* best-effort cleanup */ }
|
|
502
547
|
}
|
|
503
|
-
catch { /* best-effort cleanup */ }
|
|
504
548
|
}
|
|
505
549
|
}
|
|
506
550
|
/**
|
|
@@ -511,23 +555,50 @@ export class TmuxAdapter {
|
|
|
511
555
|
* The shell removes its private script when consumed (not when pasted).
|
|
512
556
|
* A shell that never consumes the invocation leaves the file for diagnosis.
|
|
513
557
|
*/
|
|
514
|
-
async sendShellCommand(target, command, beforeInput) {
|
|
558
|
+
async sendShellCommand(target, command, beforeInput, options = {}) {
|
|
515
559
|
// Keep the managed selector for nested paste/Enter checks. A resolved pane
|
|
516
560
|
// ID can also occur in detached bindings after a tmux restart; resolving it
|
|
517
561
|
// again would lose the unambiguous session/node and its existing lease.
|
|
518
562
|
// Each nested write still validates the lease and targets its observed pane.
|
|
519
|
-
return this.guardedInput(target, () => this.sendShellCommandUnchecked(target, command, beforeInput));
|
|
563
|
+
return this.guardedInput(target, () => this.sendShellCommandUnchecked(target, command, beforeInput, options));
|
|
520
564
|
}
|
|
521
|
-
async sendShellCommandUnchecked(target, command, beforeInput) {
|
|
522
|
-
const
|
|
523
|
-
|
|
565
|
+
async sendShellCommandUnchecked(target, command, beforeInput, options) {
|
|
566
|
+
const commandBytes = Buffer.byteLength(command, "utf8");
|
|
567
|
+
// POSIX shells retain subshell isolation; unknown/unreadable panes use sh.
|
|
568
|
+
const paneShell = options.sourceInPane ? (await this.getPaneCommand(target) ?? "").replace(/^-/, "") : "";
|
|
569
|
+
const sourceInPane = ["bash", "zsh", "sh", "dash", "ksh"].includes(paneShell);
|
|
570
|
+
let path = options.stageIfLong && commandBytes <= 512 ? undefined : this.fileOps.tmpName();
|
|
571
|
+
let invocation = path ? sourceInPane ? `( . ${shellQuote(path)} )` : `/bin/sh ${shellQuote(path)}` : command;
|
|
572
|
+
if (path && paneShell === "fish") {
|
|
573
|
+
const quotedPath = shellQuote(path);
|
|
574
|
+
invocation = `/bin/sh ${quotedPath}`;
|
|
575
|
+
// Fish single quotes reinterpret POSIX backslashes. Keep those payloads
|
|
576
|
+
// (and paths) on sh, preserving existing executable launches byte-for-byte.
|
|
577
|
+
if (!command.includes("\\") && !path.includes("\\")) {
|
|
578
|
+
// Probe fixed syntax in the pane before sourcing, not the launch's exit
|
|
579
|
+
// status: even failed cleanup must not turn a later exit into a retry.
|
|
580
|
+
const sourced = `if eval 'OPENRIG_FISH_ASSIGNMENT_PROBE=1 /bin/sh -c :'; source ${quotedPath}; else; /bin/sh ${quotedPath}; end`;
|
|
581
|
+
// Repeating the path must not add a refusal for previously valid TMPDIRs.
|
|
582
|
+
if (Buffer.byteLength(sourced, "utf8") <= 512)
|
|
583
|
+
invocation = sourced;
|
|
584
|
+
}
|
|
585
|
+
}
|
|
524
586
|
if (Buffer.byteLength(invocation, "utf8") > 512) {
|
|
525
|
-
|
|
587
|
+
// Pi commands below the canonical tty limit still fit when staging cannot.
|
|
588
|
+
if (options.stageIfLong && commandBytes < 1024) {
|
|
589
|
+
path = undefined;
|
|
590
|
+
invocation = command;
|
|
591
|
+
}
|
|
592
|
+
else {
|
|
593
|
+
return { ok: false, code: "launch_path_too_long", message: "Temporary launch-script path exceeds the safe terminal input bound" };
|
|
594
|
+
}
|
|
526
595
|
}
|
|
527
596
|
let created = false;
|
|
528
597
|
try {
|
|
529
|
-
|
|
530
|
-
|
|
598
|
+
if (path) {
|
|
599
|
+
await this.fileOps.writeFile(path, `/bin/rm -f -- ${shellQuote(path)}\n${options.execInScript ? "exec " : ""}${command}\n`, { mode: 0o600, flag: "wx" });
|
|
600
|
+
created = true;
|
|
601
|
+
}
|
|
531
602
|
const text = beforeInput ? await this.guardedInput(target, (pane, check) => this.sendTextUnchecked(pane, invocation, () => { check(); beforeInput(); }))
|
|
532
603
|
: await this.sendText(target, invocation);
|
|
533
604
|
if (!text.ok)
|
|
@@ -546,7 +617,7 @@ export class TmuxAdapter {
|
|
|
546
617
|
return classifyWriteError(err);
|
|
547
618
|
}
|
|
548
619
|
finally {
|
|
549
|
-
if (created) {
|
|
620
|
+
if (created && path) {
|
|
550
621
|
try {
|
|
551
622
|
await this.fileOps.unlink(path);
|
|
552
623
|
}
|
|
@@ -554,8 +625,8 @@ export class TmuxAdapter {
|
|
|
554
625
|
}
|
|
555
626
|
}
|
|
556
627
|
}
|
|
557
|
-
async sendKeys(target, keys) {
|
|
558
|
-
return this.guardedInput(target, pane => this.sendKeysUnchecked(pane, keys));
|
|
628
|
+
async sendKeys(target, keys, beforeInput) {
|
|
629
|
+
return this.guardedInput(target, (pane, beforeWrite) => { beforeWrite(); beforeInput?.(); return this.sendKeysUnchecked(pane, keys); });
|
|
559
630
|
}
|
|
560
631
|
async sendKeysUnchecked(target, keys) {
|
|
561
632
|
try {
|
|
@@ -567,8 +638,9 @@ export class TmuxAdapter {
|
|
|
567
638
|
}
|
|
568
639
|
}
|
|
569
640
|
async setWindowOption(target, option, value) {
|
|
641
|
+
const window = exactTarget(target, "window");
|
|
570
642
|
try {
|
|
571
|
-
await this.run(["tmux", "set-option", "-w", "-t",
|
|
643
|
+
await this.run(["tmux", "set-option", "-w", "-t", window, option, value], `tmux set-option -w -t ${shellQuote(window)} ${shellQuote(option)} ${shellQuote(value)}`);
|
|
572
644
|
return { ok: true };
|
|
573
645
|
}
|
|
574
646
|
catch (err) {
|
|
@@ -583,7 +655,7 @@ export class TmuxAdapter {
|
|
|
583
655
|
return { ok: false, code: "validation_error", message: `resizeWindow: rows must be a positive integer, got ${rows}` };
|
|
584
656
|
}
|
|
585
657
|
try {
|
|
586
|
-
await this.run(["tmux", "resize-window", "-t", target, "-x", String(cols), "-y", String(rows)]);
|
|
658
|
+
await this.run(["tmux", "resize-window", "-t", exactTarget(target, "window"), "-x", String(cols), "-y", String(rows)]);
|
|
587
659
|
return { ok: true };
|
|
588
660
|
}
|
|
589
661
|
catch (err) {
|
|
@@ -614,8 +686,20 @@ export class TmuxAdapter {
|
|
|
614
686
|
return this.killSessionUnchecked(name);
|
|
615
687
|
}
|
|
616
688
|
async killSessionUnchecked(name) {
|
|
689
|
+
// The guarded path passes the immutable `$N` id, which stays as it is; a bare name is made exact.
|
|
690
|
+
const session = exactTarget(name, "session");
|
|
691
|
+
// Detach first so `detach-on-destroy off` cannot switch views onto another session.
|
|
692
|
+
try {
|
|
693
|
+
await this.run(["tmux", "detach-client", "-s", session], `tmux detach-client -s ${shellQuote(session)}`);
|
|
694
|
+
}
|
|
695
|
+
catch (err) {
|
|
696
|
+
// tmux 3.7 says "no current client" when nothing is attached (and for a missing session, which the kill classifies).
|
|
697
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
698
|
+
if (!message.toLowerCase().includes("no current client"))
|
|
699
|
+
return classifyWriteError(err);
|
|
700
|
+
}
|
|
617
701
|
try {
|
|
618
|
-
await this.run(["tmux", "kill-session", "-t",
|
|
702
|
+
await this.run(["tmux", "kill-session", "-t", session], `tmux kill-session -t ${shellQuote(session)}`);
|
|
619
703
|
const pane = this.freshProbes.get(name);
|
|
620
704
|
this.freshProbes.delete(name);
|
|
621
705
|
if (pane)
|
|
@@ -648,7 +732,8 @@ export class TmuxAdapter {
|
|
|
648
732
|
return this.guardedInput(paneTarget, pane => this.respawnPaneUnchecked(pane, command, opts));
|
|
649
733
|
}
|
|
650
734
|
async respawnPaneUnchecked(paneTarget, command, opts) {
|
|
651
|
-
const
|
|
735
|
+
const exact = exactTarget(paneTarget, "pane");
|
|
736
|
+
const argv = ["tmux", "respawn-pane", "-t", exact];
|
|
652
737
|
if (opts?.cwd != null)
|
|
653
738
|
argv.push("-c", opts.cwd);
|
|
654
739
|
if (opts?.env)
|
|
@@ -657,7 +742,7 @@ export class TmuxAdapter {
|
|
|
657
742
|
// The respawn command is ONE argv unit: tmux runs it via the shell.
|
|
658
743
|
if (command != null && command.length > 0)
|
|
659
744
|
argv.push(command);
|
|
660
|
-
const legacyRespawn = ["tmux", "respawn-pane", "-t", shellQuote(
|
|
745
|
+
const legacyRespawn = ["tmux", "respawn-pane", "-t", shellQuote(exact)];
|
|
661
746
|
if (opts?.cwd != null)
|
|
662
747
|
legacyRespawn.push("-c", shellQuote(opts.cwd));
|
|
663
748
|
if (opts?.env)
|
|
@@ -678,8 +763,9 @@ export class TmuxAdapter {
|
|
|
678
763
|
* Set to `on` BEFORE the retiree is signalled to exit (else the pane is destroyed on exit and there
|
|
679
764
|
* is nothing to respawn into). */
|
|
680
765
|
async setRemainOnExit(paneTarget, on) {
|
|
766
|
+
const exact = exactTarget(paneTarget, "pane");
|
|
681
767
|
try {
|
|
682
|
-
await this.run(["tmux", "set-option", "-p", "-t",
|
|
768
|
+
await this.run(["tmux", "set-option", "-p", "-t", exact, "remain-on-exit", on ? "on" : "off"], `tmux set-option -p -t ${shellQuote(exact)} remain-on-exit ${on ? "on" : "off"}`);
|
|
683
769
|
return { ok: true };
|
|
684
770
|
}
|
|
685
771
|
catch (err) {
|
|
@@ -689,8 +775,9 @@ export class TmuxAdapter {
|
|
|
689
775
|
/** Seat-handover cutover: is the pane's process dead (the retiree exited; the pane held by
|
|
690
776
|
* remain-on-exit)? A known-missing pane also proves physical cutover; unknown probe errors stay false. */
|
|
691
777
|
async isPaneDead(paneId) {
|
|
778
|
+
const exact = exactTarget(paneId, "pane");
|
|
692
779
|
try {
|
|
693
|
-
const output = await this.run(["tmux", "display-message", "-p", "-t",
|
|
780
|
+
const output = await this.run(["tmux", "display-message", "-p", "-t", exact, "#{pane_dead}"], `tmux display-message -p -t ${shellQuote(exact)} "#{pane_dead}"`);
|
|
694
781
|
return output.trim() === "1";
|
|
695
782
|
}
|
|
696
783
|
catch (error) {
|
|
@@ -721,8 +808,9 @@ export class TmuxAdapter {
|
|
|
721
808
|
}
|
|
722
809
|
/** Get the PID of the foreground process in a pane. Returns null if unavailable. */
|
|
723
810
|
async getPanePid(paneId) {
|
|
811
|
+
const target = exactTarget(paneId, "pane");
|
|
724
812
|
try {
|
|
725
|
-
const output = await this.run(["tmux", "display-message", "-p", "-t",
|
|
813
|
+
const output = await this.run(["tmux", "display-message", "-p", "-t", target, "#{pane_pid}"], `tmux display-message -p -t ${shellQuote(target)} "#{pane_pid}"`);
|
|
726
814
|
const trimmed = output.trim();
|
|
727
815
|
const parsed = parseInt(trimmed, 10);
|
|
728
816
|
return Number.isFinite(parsed) && parsed > 0 ? parsed : null;
|
|
@@ -746,8 +834,9 @@ export class TmuxAdapter {
|
|
|
746
834
|
}
|
|
747
835
|
/** Get the current foreground command in a pane. Returns null if unavailable. */
|
|
748
836
|
async getPaneCommand(paneId) {
|
|
837
|
+
const target = exactTarget(paneId, "pane");
|
|
749
838
|
try {
|
|
750
|
-
const output = await this.run(["tmux", "display-message", "-p", "-t",
|
|
839
|
+
const output = await this.run(["tmux", "display-message", "-p", "-t", target, "#{pane_current_command}"], `tmux display-message -p -t ${shellQuote(target)} "#{pane_current_command}"`);
|
|
751
840
|
const trimmed = output.trim();
|
|
752
841
|
return trimmed || null;
|
|
753
842
|
}
|
|
@@ -755,14 +844,33 @@ export class TmuxAdapter {
|
|
|
755
844
|
return null;
|
|
756
845
|
}
|
|
757
846
|
}
|
|
847
|
+
/** A launch metadata read. Callers must never put credential values in terminal input. */
|
|
848
|
+
async getSessionEnv(session, key) {
|
|
849
|
+
if (!/^[A-Z_][A-Z0-9_]*$/.test(key))
|
|
850
|
+
throw new Error("Invalid session environment key.");
|
|
851
|
+
try {
|
|
852
|
+
const output = await this.run(["tmux", "show-environment", "-t", session, key], `tmux show-environment -t ${shellQuote(session)} ${shellQuote(key)}`);
|
|
853
|
+
if (output.trim() === `-${key}`)
|
|
854
|
+
return undefined;
|
|
855
|
+
if (!output.startsWith(`${key}=`))
|
|
856
|
+
throw new Error("Unexpected session environment response.");
|
|
857
|
+
return output.slice(key.length + 1).replace(/\r?\n$/, "");
|
|
858
|
+
}
|
|
859
|
+
catch (error) {
|
|
860
|
+
if (error instanceof Error && error.message.includes(`unknown variable: ${key}`))
|
|
861
|
+
return undefined;
|
|
862
|
+
throw new Error("Cannot read the session's launch environment.");
|
|
863
|
+
}
|
|
864
|
+
}
|
|
758
865
|
/** OPR.0.4.3.28 Part C — usable-presence check for a session-env variable.
|
|
759
866
|
* Returns whether the var has a nonblank value, NEVER that value, and null
|
|
760
867
|
* when the session environment cannot be inspected. Listing the environment
|
|
761
868
|
* distinguishes a genuinely absent var from `tmux show-environment <var>`'s
|
|
762
869
|
* nonzero lookup exit. */
|
|
763
870
|
async hasSessionEnv(sessionName, varName) {
|
|
871
|
+
const target = exactTarget(sessionName, "session");
|
|
764
872
|
try {
|
|
765
|
-
const output = await this.run(["tmux", "show-environment", "-t",
|
|
873
|
+
const output = await this.run(["tmux", "show-environment", "-t", target], `tmux show-environment -t ${shellQuote(target)}`);
|
|
766
874
|
const prefix = `${varName}=`;
|
|
767
875
|
return output.split(/\r?\n/).some((line) => line.startsWith(prefix) && line.slice(prefix.length).trim().length > 0);
|
|
768
876
|
}
|
|
@@ -779,8 +887,9 @@ export class TmuxAdapter {
|
|
|
779
887
|
// shell, so its inner quoting stays POSIX here (psmux documents the same
|
|
780
888
|
// `cat >` server-side form for its own path).
|
|
781
889
|
const sink = "cat >> " + shellQuote(outputPath);
|
|
890
|
+
const target = exactTarget(sessionName, "pane");
|
|
782
891
|
try {
|
|
783
|
-
await this.run(["tmux", "pipe-pane", "-t",
|
|
892
|
+
await this.run(["tmux", "pipe-pane", "-t", target, sink], `tmux pipe-pane -t ${shellQuote(target)} ${shellQuote(sink)}`);
|
|
784
893
|
return { ok: true };
|
|
785
894
|
}
|
|
786
895
|
catch (err) {
|
|
@@ -789,8 +898,9 @@ export class TmuxAdapter {
|
|
|
789
898
|
}
|
|
790
899
|
/** Stop pipe-pane on a session. */
|
|
791
900
|
async stopPipePane(sessionName) {
|
|
901
|
+
const target = exactTarget(sessionName, "pane");
|
|
792
902
|
try {
|
|
793
|
-
await this.run(["tmux", "pipe-pane", "-t",
|
|
903
|
+
await this.run(["tmux", "pipe-pane", "-t", target], `tmux pipe-pane -t ${shellQuote(target)}`);
|
|
794
904
|
return { ok: true };
|
|
795
905
|
}
|
|
796
906
|
catch (err) {
|
|
@@ -798,9 +908,93 @@ export class TmuxAdapter {
|
|
|
798
908
|
}
|
|
799
909
|
}
|
|
800
910
|
/** Capture pane content (last N lines). Returns null if unavailable. */
|
|
911
|
+
/**
|
|
912
|
+
* Capture many sessions' panes with a few tmux calls instead of one per session (#308). One `list-sessions` says
|
|
913
|
+
* which targets exist: a missing one maps to null (as a failed per-target capture) without a fork. The live ones
|
|
914
|
+
* are captured in chunks of CAPTURE_BATCH chained commands (a `display-message` marker, then `capture-pane`), each
|
|
915
|
+
* pane's output delimited by a marker unique to the call, so the text equals what `capturePaneContent` returns.
|
|
916
|
+
* Targets are exact (`=<name>:`): no prefix match, and a name with a "." still resolves. tmux stops a chain at its
|
|
917
|
+
* first failing command, so a chunk that fails is split in half and retried (an oversized output, or a session gone
|
|
918
|
+
* since the listing); a single session that still fails is left OUT of the map, and the caller reads it per target.
|
|
919
|
+
* Null when tmux can't be listed at all. Each entry carries the time its own chunk was read (`capturedAt`), so a
|
|
920
|
+
* slow later chunk can't make an earlier capture look fresh.
|
|
921
|
+
*/
|
|
922
|
+
async capturePanesContent(targets, lines = 20, now = () => new Date()) {
|
|
923
|
+
let live;
|
|
924
|
+
try {
|
|
925
|
+
const listing = await this.run(["tmux", "list-sessions", "-F", "#{session_name}"], "tmux list-sessions -F '#{session_name}'");
|
|
926
|
+
live = new Set(listing.split("\n").map((s) => s.trim()).filter(Boolean));
|
|
927
|
+
}
|
|
928
|
+
catch {
|
|
929
|
+
return null;
|
|
930
|
+
}
|
|
931
|
+
const out = new Map();
|
|
932
|
+
const listedAt = now();
|
|
933
|
+
const present = [];
|
|
934
|
+
for (const t of new Set(targets)) {
|
|
935
|
+
if (live.has(t))
|
|
936
|
+
present.push(t);
|
|
937
|
+
else
|
|
938
|
+
out.set(t, { text: null, capturedAt: listedAt });
|
|
939
|
+
}
|
|
940
|
+
// A chunk that fails is split in half and retried, down to one session: its output overflowed exec's buffer (wide,
|
|
941
|
+
// colour-dense panes: each capture is the visible pane plus the requested history) or a session vanished since
|
|
942
|
+
// the listing. A single session that still fails is left out: the caller reads it per target.
|
|
943
|
+
/** Capture one chunk with a single chained tmux call into `out`; on failure, split it in half and retry each half. */
|
|
944
|
+
const captureChunk = async (chunk) => {
|
|
945
|
+
const nonce = randomUUID().replace(/-/g, "");
|
|
946
|
+
const mark = (k) => `__openrig_capture_${nonce}_${k}__`;
|
|
947
|
+
const argv = ["tmux", ...chunk.flatMap((t, k) => [
|
|
948
|
+
...(k > 0 ? [";"] : []),
|
|
949
|
+
"display-message", "-p", "-t", `=${t}:`, mark(k), ";", "capture-pane", "-p", "-t", `=${t}:`, "-S", `-${lines}`,
|
|
950
|
+
])];
|
|
951
|
+
const legacy = "tmux " + chunk.map((t, k) => `display-message -p -t ${shellQuote(`=${t}:`)} ${shellQuote(mark(k))} \\; capture-pane -p -t ${shellQuote(`=${t}:`)} -S -${lines}`).join(" \\; ");
|
|
952
|
+
let output;
|
|
953
|
+
let capturedAt;
|
|
954
|
+
try {
|
|
955
|
+
output = await this.run(argv, legacy);
|
|
956
|
+
capturedAt = now(); // when THIS chunk's panes were read, not when the sweep ends
|
|
957
|
+
}
|
|
958
|
+
catch {
|
|
959
|
+
if (chunk.length > 1) {
|
|
960
|
+
const half = Math.ceil(chunk.length / 2);
|
|
961
|
+
await captureChunk(chunk.slice(0, half));
|
|
962
|
+
await captureChunk(chunk.slice(half));
|
|
963
|
+
}
|
|
964
|
+
return; // a single session that failed: read per target by the caller
|
|
965
|
+
}
|
|
966
|
+
const segments = chunk.map(() => null);
|
|
967
|
+
let cur = -1;
|
|
968
|
+
const outLines = output.split("\n");
|
|
969
|
+
if (outLines.length && outLines[outLines.length - 1] === "")
|
|
970
|
+
outLines.pop(); // the final newline, not a line
|
|
971
|
+
for (const line of outLines) {
|
|
972
|
+
const m = line.startsWith(`__openrig_capture_${nonce}_`) ? /_(\d+)__$/.exec(line) : null;
|
|
973
|
+
if (m && line === mark(Number(m[1]))) {
|
|
974
|
+
cur = Number(m[1]);
|
|
975
|
+
segments[cur] = [];
|
|
976
|
+
}
|
|
977
|
+
else if (cur >= 0) {
|
|
978
|
+
segments[cur].push(line);
|
|
979
|
+
}
|
|
980
|
+
}
|
|
981
|
+
chunk.forEach((t, k) => {
|
|
982
|
+
const seg = segments[k];
|
|
983
|
+
if (seg == null)
|
|
984
|
+
return; // its marker never printed: read per target
|
|
985
|
+
// capture-pane prints its lines newline-terminated, as the per-target read returns them
|
|
986
|
+
const text = seg.length ? seg.join("\n") + "\n" : "";
|
|
987
|
+
out.set(t, { text: text === "" ? null : text, capturedAt });
|
|
988
|
+
});
|
|
989
|
+
};
|
|
990
|
+
for (let i = 0; i < present.length; i += CAPTURE_BATCH)
|
|
991
|
+
await captureChunk(present.slice(i, i + CAPTURE_BATCH));
|
|
992
|
+
return out;
|
|
993
|
+
}
|
|
801
994
|
async capturePaneContent(paneId, lines = 20) {
|
|
995
|
+
const target = exactTarget(paneId, "pane");
|
|
802
996
|
try {
|
|
803
|
-
const output = await this.run(["tmux", "capture-pane", "-p", "-t",
|
|
997
|
+
const output = await this.run(["tmux", "capture-pane", "-p", "-t", target, "-S", `-${lines}`], `tmux capture-pane -p -t ${shellQuote(target)} -S -${lines}`);
|
|
804
998
|
return output || null;
|
|
805
999
|
}
|
|
806
1000
|
catch {
|
|
@@ -814,8 +1008,9 @@ export class TmuxAdapter {
|
|
|
814
1008
|
* the absolute-paint seed exists to eliminate.
|
|
815
1009
|
*/
|
|
816
1010
|
async capturePaneScreen(paneId) {
|
|
1011
|
+
const target = exactTarget(paneId, "pane");
|
|
817
1012
|
try {
|
|
818
|
-
const output = await this.run(["tmux", "capture-pane", "-p", "-t",
|
|
1013
|
+
const output = await this.run(["tmux", "capture-pane", "-p", "-t", target], `tmux capture-pane -p -t ${shellQuote(target)}`);
|
|
819
1014
|
return output || null;
|
|
820
1015
|
}
|
|
821
1016
|
catch {
|
|
@@ -829,8 +1024,9 @@ export class TmuxAdapter {
|
|
|
829
1024
|
* produces a garbage seed.
|
|
830
1025
|
*/
|
|
831
1026
|
async getPaneCursorPosition(paneId) {
|
|
1027
|
+
const exact = exactTarget(paneId, "pane");
|
|
832
1028
|
try {
|
|
833
|
-
const output = await this.run(["tmux", "display-message", "-p", "-t",
|
|
1029
|
+
const output = await this.run(["tmux", "display-message", "-p", "-t", exact, CURSOR_FORMAT], `tmux display-message -p -t ${shellQuote(exact)} "${CURSOR_FORMAT}"`);
|
|
834
1030
|
const [xRaw, yRaw, widthRaw, heightRaw] = output.trim().split(TMUX_FIELD_SEPARATOR);
|
|
835
1031
|
const x = Number.parseInt(xRaw ?? "", 10);
|
|
836
1032
|
const y = Number.parseInt(yRaw ?? "", 10);
|
|
@@ -855,8 +1051,10 @@ export class TmuxAdapter {
|
|
|
855
1051
|
* scopes are never crossed (guard b2).
|
|
856
1052
|
*/
|
|
857
1053
|
async setSessionOption(sessionName, key, value) {
|
|
1054
|
+
// set/show-option take a target-pane even when the option is session-scoped.
|
|
1055
|
+
const exact = exactTarget(sessionName, "pane");
|
|
858
1056
|
try {
|
|
859
|
-
await this.run(["tmux", "set-option", "-t",
|
|
1057
|
+
await this.run(["tmux", "set-option", "-t", exact, key, value], `tmux set-option -t ${shellQuote(exact)} ${shellQuote(key)} ${shellQuote(value)}`);
|
|
860
1058
|
return { ok: true };
|
|
861
1059
|
}
|
|
862
1060
|
catch (err) {
|
|
@@ -896,8 +1094,10 @@ export class TmuxAdapter {
|
|
|
896
1094
|
}
|
|
897
1095
|
/** Get a session-scoped user option value. Returns null if not set or error. */
|
|
898
1096
|
async getSessionOption(sessionName, key) {
|
|
1097
|
+
// set/show-option take a target-pane even when the option is session-scoped.
|
|
1098
|
+
const exact = exactTarget(sessionName, "pane");
|
|
899
1099
|
try {
|
|
900
|
-
const output = await this.run(["tmux", "show-option", "-v", "-t",
|
|
1100
|
+
const output = await this.run(["tmux", "show-option", "-v", "-t", exact, key], `tmux show-option -v -t ${shellQuote(exact)} ${shellQuote(key)}`);
|
|
901
1101
|
return output.trim() || null;
|
|
902
1102
|
}
|
|
903
1103
|
catch {
|
|
@@ -925,9 +1125,59 @@ export class TmuxAdapter {
|
|
|
925
1125
|
* - `null` when the target is missing OR the value is unparseable
|
|
926
1126
|
* (consumers treat null as "no signal", distinct from "idle").
|
|
927
1127
|
*/
|
|
1128
|
+
/** Every session's current-window `#{window_activity}` in ONE tmux call, keyed by session name: the same value
|
|
1129
|
+
* `readPaneLastActivity(<session name>)` reads (display-message -t <session> resolves to the session's current
|
|
1130
|
+
* window). Only well-formed timestamps are included, so a missing key means "read it the per-target way". Null when
|
|
1131
|
+
* tmux can't be read at all. The session name is the LAST field, so a separator inside it stays intact. */
|
|
1132
|
+
async readAllSessionWindowActivity() {
|
|
1133
|
+
try {
|
|
1134
|
+
const format = ["#{window_active}", "#{window_activity}", "#{session_name}"].join(TMUX_FIELD_SEPARATOR);
|
|
1135
|
+
const output = await this.run(["tmux", "list-windows", "-a", "-F", format], `tmux list-windows -a -F '${format}'`);
|
|
1136
|
+
const out = new Map();
|
|
1137
|
+
for (const line of output.split("\n")) {
|
|
1138
|
+
const first = line.indexOf(TMUX_FIELD_SEPARATOR), second = line.indexOf(TMUX_FIELD_SEPARATOR, first + 1);
|
|
1139
|
+
if (first < 0 || second < 0)
|
|
1140
|
+
continue;
|
|
1141
|
+
const active = line.slice(0, first), activity = line.slice(first + 1, second).trim(), session = line.slice(second + 1);
|
|
1142
|
+
if (!session || active !== "1" || !/^\d+$/.test(activity))
|
|
1143
|
+
continue;
|
|
1144
|
+
const n = Number(activity);
|
|
1145
|
+
if (Number.isFinite(n) && n > 0)
|
|
1146
|
+
out.set(session, n);
|
|
1147
|
+
}
|
|
1148
|
+
return out;
|
|
1149
|
+
}
|
|
1150
|
+
catch {
|
|
1151
|
+
return null;
|
|
1152
|
+
}
|
|
1153
|
+
}
|
|
1154
|
+
/** Every pane's pid and current command in ONE tmux call, keyed by pane id (%N): the values `getPanePid` /
|
|
1155
|
+
* `getPaneCommand` read per pane. Panes without a valid pid are left out (read those per pane). Null when tmux can't
|
|
1156
|
+
* be read at all. The command is the LAST field, so a separator inside it stays intact. */
|
|
1157
|
+
async readAllPaneProcesses() {
|
|
1158
|
+
try {
|
|
1159
|
+
const format = ["#{pane_id}", "#{pane_pid}", "#{pane_current_command}"].join(TMUX_FIELD_SEPARATOR);
|
|
1160
|
+
const output = await this.run(["tmux", "list-panes", "-a", "-F", format], `tmux list-panes -a -F '${format}'`);
|
|
1161
|
+
const out = new Map();
|
|
1162
|
+
for (const line of output.split("\n")) {
|
|
1163
|
+
const first = line.indexOf(TMUX_FIELD_SEPARATOR), second = line.indexOf(TMUX_FIELD_SEPARATOR, first + 1);
|
|
1164
|
+
if (first <= 0 || second < 0)
|
|
1165
|
+
continue;
|
|
1166
|
+
const id = line.slice(0, first), pid = parseInt(line.slice(first + 1, second).trim(), 10);
|
|
1167
|
+
if (!Number.isFinite(pid) || pid <= 0)
|
|
1168
|
+
continue;
|
|
1169
|
+
out.set(id, { pid, command: line.slice(second + 1).trim() || null });
|
|
1170
|
+
}
|
|
1171
|
+
return out;
|
|
1172
|
+
}
|
|
1173
|
+
catch {
|
|
1174
|
+
return null;
|
|
1175
|
+
}
|
|
1176
|
+
}
|
|
928
1177
|
async readPaneLastActivity(paneId) {
|
|
1178
|
+
const exact = exactTarget(paneId, "pane");
|
|
929
1179
|
try {
|
|
930
|
-
const output = await this.run(["tmux", "display-message", "-p", "-t",
|
|
1180
|
+
const output = await this.run(["tmux", "display-message", "-p", "-t", exact, "#{window_activity}"], `tmux display-message -p -t ${shellQuote(exact)} '#{window_activity}'`);
|
|
931
1181
|
const trimmed = output.trim();
|
|
932
1182
|
if (!/^\d+$/.test(trimmed))
|
|
933
1183
|
return null;
|
|
@@ -966,8 +1216,9 @@ export class TmuxAdapter {
|
|
|
966
1216
|
* kills, or rebinds a session and never touches OpenRig routing/identity.
|
|
967
1217
|
*/
|
|
968
1218
|
async switchClient(client, target) {
|
|
1219
|
+
const exact = exactTarget(target, "session");
|
|
969
1220
|
try {
|
|
970
|
-
await this.run(["tmux", "switch-client", "-c", client, "-t",
|
|
1221
|
+
await this.run(["tmux", "switch-client", "-c", client, "-t", exact], `tmux switch-client -c ${shellQuote(client)} -t ${shellQuote(exact)}`);
|
|
971
1222
|
return { ok: true };
|
|
972
1223
|
}
|
|
973
1224
|
catch (err) {
|