@openrig/cli 0.6.6 → 0.6.8
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 +97 -28
- package/daemon/assets/claude-team-permissions.cjs +262 -0
- package/daemon/assets/onboarding/02-self-and-competent-action.md +20 -13
- 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-health.cjs +41 -0
- package/daemon/assets/plugins/openrig-core/hooks/scripts/refocus.cjs +69 -12
- package/daemon/assets/plugins/openrig-core/skills/claude-compaction-restore/SKILL.md +13 -2
- package/daemon/assets/plugins/openrig-core/skills/claude-compaction-restore/scripts/precompact-hook.mjs +4 -0
- package/daemon/assets/plugins/openrig-core/skills/messaging-the-human/SKILL.md +6 -0
- package/daemon/assets/plugins/openrig-core/skills/openrig-skills/SKILL.md +1 -1
- package/daemon/assets/plugins/openrig-core/skills/refocusing/SKILL.md +31 -4
- package/daemon/assets/plugins/openrig-core/skills/refocusing/scripts/trace-to-root.py +24 -13
- package/daemon/assets/plugins/openrig-core/skills/retiring-and-inheriting-a-seat/SKILL.md +3 -0
- package/daemon/assets/plugins/openrig-core/skills/seat-continuity-and-handover/SKILL.md +42 -0
- package/daemon/assets/plugins/openrig-core/skills/session-compaction-and-restore/SKILL.md +6 -0
- package/daemon/assets/skills/rigs/SKILL.md +133 -0
- package/daemon/context-packs/help/help.md +48 -19
- 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 +239 -43
- package/daemon/context-packs/reference/getting-started.md +356 -212
- package/daemon/context-packs/reference/instance-layout.md +5 -0
- package/daemon/context-packs/reference/manifest.yaml +4 -1
- package/daemon/context-packs/reference/rig-spec.md +48 -20
- package/daemon/context-packs/reference/whats-new.md +96 -0
- 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 +13 -2
- package/daemon/context-packs/skills/claude-compaction-restore/manifest.yaml +1 -1
- package/daemon/context-packs/skills/claude-compaction-restore/scripts/precompact-hook.mjs +4 -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 +6 -0
- package/daemon/context-packs/skills/core/messaging-the-human/manifest.yaml +1 -1
- package/daemon/context-packs/skills/core/openrig-architect/SKILL.md +3 -0
- 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 +1 -1
- package/daemon/context-packs/skills/core/openrig-skills/manifest.yaml +1 -1
- package/daemon/context-packs/skills/core/openrig-software-factory/SKILL.md +19 -12
- package/daemon/context-packs/skills/core/openrig-software-factory/manifest.yaml +1 -1
- package/daemon/context-packs/skills/core/openrig-software-factory/references/worked-example.md +17 -16
- package/daemon/context-packs/skills/core/openrig-upgrade/SKILL.md +2 -0
- package/daemon/context-packs/skills/core/openrig-upgrade/manifest.yaml +1 -1
- package/daemon/context-packs/skills/core/rig-bundles-and-shareable-artifacts/manifest.yaml +1 -1
- package/daemon/context-packs/skills/core/rig-lifecycle/manifest.yaml +1 -1
- package/daemon/context-packs/skills/core/session-source-fork/manifest.yaml +1 -1
- package/daemon/context-packs/skills/core/specification-system/manifest.yaml +1 -1
- package/daemon/context-packs/skills/core/topology-mutation-and-seat-management/manifest.yaml +1 -1
- package/daemon/context-packs/skills/core/watchdog/manifest.yaml +1 -1
- package/daemon/context-packs/skills/delegating-work/manifest.yaml +1 -1
- package/daemon/context-packs/skills/forming-an-openrig-mental-model/manifest.yaml +1 -1
- package/daemon/context-packs/skills/loading-addressable-markdown/manifest.yaml +1 -1
- package/daemon/context-packs/skills/mission-slice-sop/manifest.yaml +1 -1
- package/daemon/context-packs/skills/openrig-operating-model/manifest.yaml +1 -1
- package/daemon/context-packs/skills/openrig-user/manifest.yaml +1 -1
- package/daemon/context-packs/skills/orienting-to-an-inherited-seat/manifest.yaml +1 -1
- package/daemon/context-packs/skills/pm/backlog-capture/manifest.yaml +1 -1
- package/daemon/context-packs/skills/pm/context-builder/manifest.yaml +1 -1
- package/daemon/context-packs/skills/pm/exec-summary/manifest.yaml +1 -1
- package/daemon/context-packs/skills/pm/office-hours/manifest.yaml +1 -1
- package/daemon/context-packs/skills/pm/plan-review/manifest.yaml +1 -1
- package/daemon/context-packs/skills/pm/requirements-writer/manifest.yaml +1 -1
- package/daemon/context-packs/skills/pm/ui-mockup/manifest.yaml +1 -1
- package/daemon/context-packs/skills/pods/development-team/manifest.yaml +1 -1
- package/daemon/context-packs/skills/pods/orchestration-team/manifest.yaml +1 -1
- package/daemon/context-packs/skills/pods/oversight-team/manifest.yaml +1 -1
- package/daemon/context-packs/skills/pods/review-team/manifest.yaml +1 -1
- package/daemon/context-packs/skills/process/agent-browser/manifest.yaml +1 -1
- package/daemon/context-packs/skills/process/context-engineering/manifest.yaml +1 -1
- package/daemon/context-packs/skills/process/dogfood/manifest.yaml +1 -1
- package/daemon/context-packs/skills/process/frontend-design/manifest.yaml +1 -1
- package/daemon/context-packs/skills/process/systematic-debugging/manifest.yaml +1 -1
- package/daemon/context-packs/skills/process/test-driven-development/manifest.yaml +1 -1
- package/daemon/context-packs/skills/process/verification-before-completion/manifest.yaml +1 -1
- package/daemon/context-packs/skills/queue-handoff/manifest.yaml +1 -1
- package/daemon/context-packs/skills/refocusing/SKILL.md +31 -4
- package/daemon/context-packs/skills/refocusing/manifest.yaml +1 -1
- package/daemon/context-packs/skills/refocusing/scripts/trace-to-root.py +24 -13
- package/daemon/context-packs/skills/retiring-and-inheriting-a-seat/SKILL.md +3 -0
- 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 +42 -0
- package/daemon/context-packs/skills/seat-continuity-and-handover/manifest.yaml +1 -1
- package/daemon/context-packs/skills/session-compaction-and-restore/SKILL.md +6 -0
- 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 +1 -1
- package/daemon/dist/adapters/claude-code-adapter.d.ts.map +1 -1
- package/daemon/dist/adapters/claude-code-adapter.js +23 -13
- package/daemon/dist/adapters/claude-code-adapter.js.map +1 -1
- package/daemon/dist/adapters/codex-resume.d.ts.map +1 -1
- package/daemon/dist/adapters/codex-resume.js +17 -0
- package/daemon/dist/adapters/codex-resume.js.map +1 -1
- package/daemon/dist/adapters/codex-runtime-adapter.js +2 -2
- package/daemon/dist/adapters/codex-runtime-adapter.js.map +1 -1
- package/daemon/dist/adapters/kernel-authority.d.ts.map +1 -1
- package/daemon/dist/adapters/kernel-authority.js +29 -11
- package/daemon/dist/adapters/kernel-authority.js.map +1 -1
- package/daemon/dist/adapters/pi-readiness.d.ts +15 -0
- package/daemon/dist/adapters/pi-readiness.d.ts.map +1 -0
- package/daemon/dist/adapters/pi-readiness.js +90 -0
- package/daemon/dist/adapters/pi-readiness.js.map +1 -0
- package/daemon/dist/adapters/pi-runner-protocol.d.ts.map +1 -1
- package/daemon/dist/adapters/pi-runner-protocol.js +1 -0
- package/daemon/dist/adapters/pi-runner-protocol.js.map +1 -1
- package/daemon/dist/adapters/pi-runner.d.ts.map +1 -1
- package/daemon/dist/adapters/pi-runner.js +13 -2
- package/daemon/dist/adapters/pi-runner.js.map +1 -1
- package/daemon/dist/adapters/tmux.d.ts.map +1 -1
- package/daemon/dist/adapters/tmux.js +9 -6
- package/daemon/dist/adapters/tmux.js.map +1 -1
- package/daemon/dist/build-info.js +3 -3
- package/daemon/dist/db/all-migrations.d.ts.map +1 -1
- package/daemon/dist/db/all-migrations.js +4 -0
- package/daemon/dist/db/all-migrations.js.map +1 -1
- package/daemon/dist/db/migrations/096_rig_install_root.d.ts +3 -0
- package/daemon/dist/db/migrations/096_rig_install_root.d.ts.map +1 -0
- package/daemon/dist/db/migrations/096_rig_install_root.js +5 -0
- package/daemon/dist/db/migrations/096_rig_install_root.js.map +1 -0
- package/daemon/dist/db/migrations/097_thread_part_map.d.ts +3 -0
- package/daemon/dist/db/migrations/097_thread_part_map.d.ts.map +1 -0
- package/daemon/dist/db/migrations/097_thread_part_map.js +20 -0
- package/daemon/dist/db/migrations/097_thread_part_map.js.map +1 -0
- package/daemon/dist/domain/activity-taxonomy.d.ts +7 -0
- package/daemon/dist/domain/activity-taxonomy.d.ts.map +1 -1
- package/daemon/dist/domain/activity-taxonomy.js.map +1 -1
- package/daemon/dist/domain/agent-activity-store.d.ts +12 -0
- package/daemon/dist/domain/agent-activity-store.d.ts.map +1 -1
- package/daemon/dist/domain/agent-activity-store.js +55 -30
- package/daemon/dist/domain/agent-activity-store.js.map +1 -1
- package/daemon/dist/domain/agent-images/agent-image-types.d.ts +1 -1
- package/daemon/dist/domain/agent-images/agent-image-types.d.ts.map +1 -1
- package/daemon/dist/domain/bootstrap-orchestrator.d.ts.map +1 -1
- package/daemon/dist/domain/bootstrap-orchestrator.js +6 -4
- package/daemon/dist/domain/bootstrap-orchestrator.js.map +1 -1
- package/daemon/dist/domain/bundle-install-context.d.ts +2 -2
- package/daemon/dist/domain/bundle-install-context.d.ts.map +1 -1
- package/daemon/dist/domain/bundle-install-context.js +16 -3
- package/daemon/dist/domain/bundle-install-context.js.map +1 -1
- package/daemon/dist/domain/bundle-types.d.ts +1 -1
- package/daemon/dist/domain/bundle-types.d.ts.map +1 -1
- package/daemon/dist/domain/chat-repository.d.ts +5 -0
- package/daemon/dist/domain/chat-repository.d.ts.map +1 -1
- package/daemon/dist/domain/chat-repository.js +8 -0
- package/daemon/dist/domain/chat-repository.js.map +1 -1
- package/daemon/dist/domain/claim-service.d.ts.map +1 -1
- package/daemon/dist/domain/claim-service.js +5 -4
- package/daemon/dist/domain/claim-service.js.map +1 -1
- package/daemon/dist/domain/claude-activity-hooks.d.ts +3 -0
- package/daemon/dist/domain/claude-activity-hooks.d.ts.map +1 -1
- package/daemon/dist/domain/claude-activity-hooks.js +8 -1
- package/daemon/dist/domain/claude-activity-hooks.js.map +1 -1
- package/daemon/dist/domain/claude-compaction-enforcer.d.ts +34 -2
- package/daemon/dist/domain/claude-compaction-enforcer.d.ts.map +1 -1
- package/daemon/dist/domain/claude-compaction-enforcer.js +195 -107
- package/daemon/dist/domain/claude-compaction-enforcer.js.map +1 -1
- package/daemon/dist/domain/codex-thread-id.d.ts.map +1 -1
- package/daemon/dist/domain/codex-thread-id.js +4 -2
- package/daemon/dist/domain/codex-thread-id.js.map +1 -1
- package/daemon/dist/domain/context-monitor.d.ts +5 -0
- package/daemon/dist/domain/context-monitor.d.ts.map +1 -1
- package/daemon/dist/domain/context-monitor.js +23 -6
- package/daemon/dist/domain/context-monitor.js.map +1 -1
- package/daemon/dist/domain/execution-view.d.ts.map +1 -1
- package/daemon/dist/domain/execution-view.js +57 -11
- package/daemon/dist/domain/execution-view.js.map +1 -1
- package/daemon/dist/domain/gateway/connections-projection.d.ts +4 -0
- package/daemon/dist/domain/gateway/connections-projection.d.ts.map +1 -1
- package/daemon/dist/domain/gateway/connections-projection.js +2 -0
- package/daemon/dist/domain/gateway/connections-projection.js.map +1 -1
- package/daemon/dist/domain/gateway/destination-resolver.d.ts.map +1 -1
- package/daemon/dist/domain/gateway/destination-resolver.js +7 -4
- package/daemon/dist/domain/gateway/destination-resolver.js.map +1 -1
- package/daemon/dist/domain/gateway/human-readiness.d.ts.map +1 -1
- package/daemon/dist/domain/gateway/human-readiness.js +23 -6
- package/daemon/dist/domain/gateway/human-readiness.js.map +1 -1
- package/daemon/dist/domain/gateway/human-registry.d.ts +2 -2
- package/daemon/dist/domain/gateway/human-registry.d.ts.map +1 -1
- package/daemon/dist/domain/gateway/human-registry.js +2 -2
- package/daemon/dist/domain/gateway/human-registry.js.map +1 -1
- package/daemon/dist/domain/gateway/slack/capabilities.d.ts.map +1 -1
- package/daemon/dist/domain/gateway/slack/capabilities.js +3 -1
- package/daemon/dist/domain/gateway/slack/capabilities.js.map +1 -1
- package/daemon/dist/domain/gateway/slack/channel-map.d.ts +39 -0
- package/daemon/dist/domain/gateway/slack/channel-map.d.ts.map +1 -0
- package/daemon/dist/domain/gateway/slack/channel-map.js +114 -0
- package/daemon/dist/domain/gateway/slack/channel-map.js.map +1 -0
- package/daemon/dist/domain/gateway/slack/config.d.ts +7 -0
- package/daemon/dist/domain/gateway/slack/config.d.ts.map +1 -1
- package/daemon/dist/domain/gateway/slack/config.js +19 -2
- package/daemon/dist/domain/gateway/slack/config.js.map +1 -1
- package/daemon/dist/domain/gateway/slack/inbound.d.ts +24 -1
- package/daemon/dist/domain/gateway/slack/inbound.d.ts.map +1 -1
- package/daemon/dist/domain/gateway/slack/inbound.js +105 -3
- package/daemon/dist/domain/gateway/slack/inbound.js.map +1 -1
- package/daemon/dist/domain/gateway/slack/message.d.ts +7 -0
- package/daemon/dist/domain/gateway/slack/message.d.ts.map +1 -1
- package/daemon/dist/domain/gateway/slack/message.js +36 -0
- package/daemon/dist/domain/gateway/slack/message.js.map +1 -1
- package/daemon/dist/domain/gateway/slack/queue-access.d.ts +2 -0
- package/daemon/dist/domain/gateway/slack/queue-access.d.ts.map +1 -1
- package/daemon/dist/domain/gateway/slack/queue-access.js +1 -0
- package/daemon/dist/domain/gateway/slack/queue-access.js.map +1 -1
- package/daemon/dist/domain/gateway/slack/slack-api.d.ts +7 -2
- package/daemon/dist/domain/gateway/slack/slack-api.d.ts.map +1 -1
- package/daemon/dist/domain/gateway/slack/slack-api.js +35 -3
- package/daemon/dist/domain/gateway/slack/slack-api.js.map +1 -1
- package/daemon/dist/domain/gateway/slack/slack-delivery.d.ts +34 -7
- package/daemon/dist/domain/gateway/slack/slack-delivery.d.ts.map +1 -1
- package/daemon/dist/domain/gateway/slack/slack-delivery.js +268 -51
- package/daemon/dist/domain/gateway/slack/slack-delivery.js.map +1 -1
- package/daemon/dist/domain/gateway/slack/slack-subsystem.d.ts +17 -0
- package/daemon/dist/domain/gateway/slack/slack-subsystem.d.ts.map +1 -1
- package/daemon/dist/domain/gateway/slack/slack-subsystem.js +107 -24
- package/daemon/dist/domain/gateway/slack/slack-subsystem.js.map +1 -1
- package/daemon/dist/domain/gateway/slack/socket-inbound.d.ts +2 -0
- package/daemon/dist/domain/gateway/slack/socket-inbound.d.ts.map +1 -1
- package/daemon/dist/domain/gateway/slack/socket-inbound.js +40 -0
- package/daemon/dist/domain/gateway/slack/socket-inbound.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 +22 -2
- package/daemon/dist/domain/gateway/slack/thread-routing.js.map +1 -1
- package/daemon/dist/domain/gateway/slack/thread-seat-map.d.ts +14 -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 +27 -0
- package/daemon/dist/domain/gateway/slack/thread-seat-map.js.map +1 -1
- package/daemon/dist/domain/generated-file-hygiene.d.ts.map +1 -1
- package/daemon/dist/domain/generated-file-hygiene.js +7 -4
- package/daemon/dist/domain/generated-file-hygiene.js.map +1 -1
- package/daemon/dist/domain/managed-blocks.d.ts.map +1 -1
- package/daemon/dist/domain/managed-blocks.js +5 -2
- package/daemon/dist/domain/managed-blocks.js.map +1 -1
- package/daemon/dist/domain/markdown-address.d.ts.map +1 -1
- package/daemon/dist/domain/markdown-address.js +23 -6
- package/daemon/dist/domain/markdown-address.js.map +1 -1
- package/daemon/dist/domain/native-process-lineage.d.ts.map +1 -1
- package/daemon/dist/domain/native-process-lineage.js +50 -3
- package/daemon/dist/domain/native-process-lineage.js.map +1 -1
- package/daemon/dist/domain/node-inventory.d.ts +2 -2
- package/daemon/dist/domain/node-inventory.d.ts.map +1 -1
- package/daemon/dist/domain/node-inventory.js +30 -4
- package/daemon/dist/domain/node-inventory.js.map +1 -1
- package/daemon/dist/domain/node-launcher.d.ts.map +1 -1
- package/daemon/dist/domain/node-launcher.js +1 -0
- package/daemon/dist/domain/node-launcher.js.map +1 -1
- package/daemon/dist/domain/pane-binding-observation.d.ts +1 -0
- package/daemon/dist/domain/pane-binding-observation.d.ts.map +1 -1
- package/daemon/dist/domain/pane-binding-observation.js +3 -1
- package/daemon/dist/domain/pane-binding-observation.js.map +1 -1
- package/daemon/dist/domain/plugin-vendor-service.d.ts +6 -0
- package/daemon/dist/domain/plugin-vendor-service.d.ts.map +1 -1
- package/daemon/dist/domain/plugin-vendor-service.js +12 -0
- package/daemon/dist/domain/plugin-vendor-service.js.map +1 -1
- package/daemon/dist/domain/profile-resolver.d.ts.map +1 -1
- package/daemon/dist/domain/profile-resolver.js +54 -15
- package/daemon/dist/domain/profile-resolver.js.map +1 -1
- package/daemon/dist/domain/ps-projection.d.ts +11 -9
- package/daemon/dist/domain/ps-projection.d.ts.map +1 -1
- package/daemon/dist/domain/ps-projection.js +15 -12
- package/daemon/dist/domain/ps-projection.js.map +1 -1
- package/daemon/dist/domain/queue-nudge-text.d.ts +4 -0
- package/daemon/dist/domain/queue-nudge-text.d.ts.map +1 -0
- package/daemon/dist/domain/queue-nudge-text.js +35 -0
- package/daemon/dist/domain/queue-nudge-text.js.map +1 -0
- package/daemon/dist/domain/queue-repository.d.ts +7 -0
- package/daemon/dist/domain/queue-repository.d.ts.map +1 -1
- package/daemon/dist/domain/queue-repository.js +50 -20
- package/daemon/dist/domain/queue-repository.js.map +1 -1
- package/daemon/dist/domain/queue-retention.d.ts +2 -2
- package/daemon/dist/domain/queue-retention.js +4 -4
- package/daemon/dist/domain/queue-wait-backoff.d.ts.map +1 -1
- package/daemon/dist/domain/queue-wait-backoff.js +6 -2
- package/daemon/dist/domain/queue-wait-backoff.js.map +1 -1
- package/daemon/dist/domain/queue-waiting.d.ts.map +1 -1
- package/daemon/dist/domain/queue-waiting.js +7 -2
- package/daemon/dist/domain/queue-waiting.js.map +1 -1
- package/daemon/dist/domain/queue-wake-ladder.d.ts +15 -2
- package/daemon/dist/domain/queue-wake-ladder.d.ts.map +1 -1
- package/daemon/dist/domain/queue-wake-ladder.js +29 -6
- package/daemon/dist/domain/queue-wake-ladder.js.map +1 -1
- package/daemon/dist/domain/rehydrate-eligibility.d.ts.map +1 -1
- package/daemon/dist/domain/rehydrate-eligibility.js +5 -2
- package/daemon/dist/domain/rehydrate-eligibility.js.map +1 -1
- package/daemon/dist/domain/reply-to-choice.d.ts +6 -2
- package/daemon/dist/domain/reply-to-choice.d.ts.map +1 -1
- package/daemon/dist/domain/reply-to-choice.js +9 -6
- package/daemon/dist/domain/reply-to-choice.js.map +1 -1
- package/daemon/dist/domain/restore-check-service.d.ts +5 -1
- package/daemon/dist/domain/restore-check-service.d.ts.map +1 -1
- package/daemon/dist/domain/restore-check-service.js +17 -3
- package/daemon/dist/domain/restore-check-service.js.map +1 -1
- package/daemon/dist/domain/restore-orchestrator.d.ts +1 -0
- package/daemon/dist/domain/restore-orchestrator.d.ts.map +1 -1
- package/daemon/dist/domain/restore-orchestrator.js +17 -11
- package/daemon/dist/domain/restore-orchestrator.js.map +1 -1
- package/daemon/dist/domain/rig-repository.d.ts +3 -1
- package/daemon/dist/domain/rig-repository.d.ts.map +1 -1
- package/daemon/dist/domain/rig-repository.js +13 -4
- package/daemon/dist/domain/rig-repository.js.map +1 -1
- package/daemon/dist/domain/rig-teardown.d.ts.map +1 -1
- package/daemon/dist/domain/rig-teardown.js +6 -0
- package/daemon/dist/domain/rig-teardown.js.map +1 -1
- package/daemon/dist/domain/rigspec-instantiator.d.ts +1 -0
- package/daemon/dist/domain/rigspec-instantiator.d.ts.map +1 -1
- package/daemon/dist/domain/rigspec-instantiator.js +1 -1
- package/daemon/dist/domain/rigspec-instantiator.js.map +1 -1
- package/daemon/dist/domain/rigspec-preflight.d.ts +1 -1
- package/daemon/dist/domain/rigspec-preflight.d.ts.map +1 -1
- package/daemon/dist/domain/rigspec-preflight.js +8 -4
- 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 +19 -4
- package/daemon/dist/domain/rigspec-schema.js.map +1 -1
- package/daemon/dist/domain/seat-activity-service.d.ts.map +1 -1
- package/daemon/dist/domain/seat-activity-service.js +16 -6
- package/daemon/dist/domain/seat-activity-service.js.map +1 -1
- package/daemon/dist/domain/seat-handover-service.d.ts.map +1 -1
- package/daemon/dist/domain/seat-handover-service.js +9 -1
- package/daemon/dist/domain/seat-handover-service.js.map +1 -1
- package/daemon/dist/domain/session-jsonl.d.ts.map +1 -1
- package/daemon/dist/domain/session-jsonl.js +10 -4
- package/daemon/dist/domain/session-jsonl.js.map +1 -1
- package/daemon/dist/domain/session-transport.d.ts +16 -21
- package/daemon/dist/domain/session-transport.d.ts.map +1 -1
- package/daemon/dist/domain/session-transport.js +70 -37
- package/daemon/dist/domain/session-transport.js.map +1 -1
- package/daemon/dist/domain/skill-audit.d.ts +19 -0
- package/daemon/dist/domain/skill-audit.d.ts.map +1 -1
- package/daemon/dist/domain/skill-audit.js +97 -5
- package/daemon/dist/domain/skill-audit.js.map +1 -1
- package/daemon/dist/domain/skill-catalog.d.ts +11 -0
- package/daemon/dist/domain/skill-catalog.d.ts.map +1 -1
- package/daemon/dist/domain/skill-catalog.js +145 -12
- package/daemon/dist/domain/skill-catalog.js.map +1 -1
- package/daemon/dist/domain/skill-mirror-drift.d.ts +6 -1
- package/daemon/dist/domain/skill-mirror-drift.d.ts.map +1 -1
- package/daemon/dist/domain/skill-mirror-drift.js +23 -12
- package/daemon/dist/domain/skill-mirror-drift.js.map +1 -1
- package/daemon/dist/domain/snapshot-repository.d.ts.map +1 -1
- package/daemon/dist/domain/snapshot-repository.js +12 -32
- package/daemon/dist/domain/snapshot-repository.js.map +1 -1
- package/daemon/dist/domain/terminal/herdr-adapter.d.ts +4 -1
- package/daemon/dist/domain/terminal/herdr-adapter.d.ts.map +1 -1
- package/daemon/dist/domain/terminal/herdr-adapter.js +14 -7
- package/daemon/dist/domain/terminal/herdr-adapter.js.map +1 -1
- package/daemon/dist/domain/terminal/terminal-provider.d.ts +9 -0
- package/daemon/dist/domain/terminal/terminal-provider.d.ts.map +1 -1
- package/daemon/dist/domain/terminal/terminal-service.d.ts +4 -0
- package/daemon/dist/domain/terminal/terminal-service.d.ts.map +1 -1
- package/daemon/dist/domain/terminal/terminal-service.js +23 -11
- package/daemon/dist/domain/terminal/terminal-service.js.map +1 -1
- package/daemon/dist/domain/transcript-store.d.ts.map +1 -1
- package/daemon/dist/domain/transcript-store.js +21 -9
- package/daemon/dist/domain/transcript-store.js.map +1 -1
- package/daemon/dist/domain/types.d.ts +2 -0
- package/daemon/dist/domain/types.d.ts.map +1 -1
- package/daemon/dist/domain/types.js.map +1 -1
- package/daemon/dist/domain/usage-samples-store.js +2 -2
- package/daemon/dist/domain/usage-samples-store.js.map +1 -1
- package/daemon/dist/domain/usage-series.d.ts.map +1 -1
- package/daemon/dist/domain/usage-series.js +42 -10
- package/daemon/dist/domain/usage-series.js.map +1 -1
- package/daemon/dist/domain/user-settings/settings-browser.d.ts.map +1 -1
- package/daemon/dist/domain/user-settings/settings-browser.js +2 -0
- package/daemon/dist/domain/user-settings/settings-browser.js.map +1 -1
- package/daemon/dist/domain/user-settings/settings-store.js +1 -1
- package/daemon/dist/domain/user-settings/settings-store.js.map +1 -1
- package/daemon/dist/domain/watchdog-due.d.ts +17 -0
- package/daemon/dist/domain/watchdog-due.d.ts.map +1 -0
- package/daemon/dist/domain/watchdog-due.js +45 -0
- package/daemon/dist/domain/watchdog-due.js.map +1 -0
- package/daemon/dist/domain/watchdog-scheduler.d.ts.map +1 -1
- package/daemon/dist/domain/watchdog-scheduler.js +3 -7
- package/daemon/dist/domain/watchdog-scheduler.js.map +1 -1
- package/daemon/dist/domain/workflow-projector.d.ts.map +1 -1
- package/daemon/dist/domain/workflow-projector.js +15 -5
- package/daemon/dist/domain/workflow-projector.js.map +1 -1
- package/daemon/dist/domain/workflow-runtime.js +1 -1
- package/daemon/dist/domain/workflow-runtime.js.map +1 -1
- package/daemon/dist/domain/workflow-step-trail-log.d.ts +6 -0
- package/daemon/dist/domain/workflow-step-trail-log.d.ts.map +1 -1
- package/daemon/dist/domain/workflow-step-trail-log.js +11 -0
- package/daemon/dist/domain/workflow-step-trail-log.js.map +1 -1
- package/daemon/dist/domain/workflow-validator.d.ts.map +1 -1
- package/daemon/dist/domain/workflow-validator.js +22 -1
- package/daemon/dist/domain/workflow-validator.js.map +1 -1
- package/daemon/dist/domain/workspace/project-catalog.js +1 -1
- package/daemon/dist/domain/workspace/project-catalog.js.map +1 -1
- package/daemon/dist/gateway-slack-surface.d.ts +1 -0
- package/daemon/dist/gateway-slack-surface.d.ts.map +1 -1
- package/daemon/dist/gateway-slack-surface.js +2 -1
- package/daemon/dist/gateway-slack-surface.js.map +1 -1
- package/daemon/dist/index.d.ts +1 -0
- package/daemon/dist/index.d.ts.map +1 -1
- package/daemon/dist/index.js +7 -7
- package/daemon/dist/index.js.map +1 -1
- package/daemon/dist/routes/agent-images.js +5 -5
- package/daemon/dist/routes/agent-images.js.map +1 -1
- package/daemon/dist/routes/bootstrap-failure-response.d.ts +13 -0
- package/daemon/dist/routes/bootstrap-failure-response.d.ts.map +1 -0
- package/daemon/dist/routes/bootstrap-failure-response.js +52 -0
- package/daemon/dist/routes/bootstrap-failure-response.js.map +1 -0
- package/daemon/dist/routes/bundles.d.ts.map +1 -1
- package/daemon/dist/routes/bundles.js +23 -36
- package/daemon/dist/routes/bundles.js.map +1 -1
- package/daemon/dist/routes/chat.d.ts.map +1 -1
- package/daemon/dist/routes/chat.js +16 -1
- package/daemon/dist/routes/chat.js.map +1 -1
- package/daemon/dist/routes/restore-check.d.ts.map +1 -1
- package/daemon/dist/routes/restore-check.js +2 -0
- package/daemon/dist/routes/restore-check.js.map +1 -1
- package/daemon/dist/routes/rigs.js +2 -2
- package/daemon/dist/routes/rigs.js.map +1 -1
- package/daemon/dist/routes/seat.js +13 -13
- package/daemon/dist/routes/seat.js.map +1 -1
- package/daemon/dist/routes/sessions.js +11 -11
- package/daemon/dist/routes/sessions.js.map +1 -1
- package/daemon/dist/routes/skills.d.ts.map +1 -1
- package/daemon/dist/routes/skills.js +15 -7
- package/daemon/dist/routes/skills.js.map +1 -1
- package/daemon/dist/routes/terminal-ws.js +15 -2
- package/daemon/dist/routes/terminal-ws.js.map +1 -1
- package/daemon/dist/routes/terminal.d.ts.map +1 -1
- package/daemon/dist/routes/terminal.js +6 -4
- package/daemon/dist/routes/terminal.js.map +1 -1
- package/daemon/dist/routes/up.d.ts.map +1 -1
- package/daemon/dist/routes/up.js +5 -56
- package/daemon/dist/routes/up.js.map +1 -1
- package/daemon/dist/startup.d.ts.map +1 -1
- package/daemon/dist/startup.js +32 -7
- package/daemon/dist/startup.js.map +1 -1
- package/daemon/dist/terminal/TerminalSessionBroker.d.ts.map +1 -1
- package/daemon/dist/terminal/TerminalSessionBroker.js +9 -1
- package/daemon/dist/terminal/TerminalSessionBroker.js.map +1 -1
- package/daemon/docs/reference/agent-spec.md +10 -10
- package/daemon/docs/reference/agent-startup-guide.md +7 -2
- package/daemon/docs/reference/bundle-formats.md +6 -4
- package/daemon/docs/reference/chain-file-convention.md +2 -2
- package/daemon/docs/reference/developing.md +1 -1
- package/daemon/docs/reference/edge-types.md +1 -1
- package/daemon/docs/reference/getting-started.md +356 -212
- package/daemon/docs/reference/help.md +48 -19
- package/daemon/docs/reference/instance-layout.md +5 -0
- package/daemon/docs/reference/non-interruptive-mode.md +7 -4
- package/daemon/docs/reference/project-workspace.md +2 -2
- package/daemon/docs/reference/publishing-a-rig-bundle.md +15 -10
- package/daemon/docs/reference/refocus-channel.md +14 -2
- package/daemon/docs/reference/rig-bundle.md +39 -19
- package/daemon/docs/reference/rig-spec.md +48 -20
- package/daemon/docs/reference/rosters.md +2 -1
- package/daemon/docs/reference/schemas/registry-entry.v1.schema.json +1 -1
- package/daemon/docs/reference/sdlc-conventions.md +4 -2
- package/daemon/docs/reference/slack-app-setup.md +69 -9
- package/daemon/docs/reference/topology-naming.md +74 -0
- package/daemon/docs/reference/whats-new.md +96 -0
- package/daemon/specs/agents/shared/skills/core/messaging-the-human/SKILL.md +6 -0
- package/daemon/specs/agents/shared/skills/core/openrig-architect/SKILL.md +3 -0
- package/daemon/specs/agents/shared/skills/core/openrig-skills/SKILL.md +1 -1
- package/daemon/specs/agents/shared/skills/core/openrig-software-factory/SKILL.md +19 -12
- package/daemon/specs/agents/shared/skills/core/openrig-software-factory/references/worked-example.md +17 -16
- package/daemon/specs/agents/shared/skills/core/openrig-upgrade/SKILL.md +2 -0
- package/daemon/specs/rigs/launch/factory/guidance/lead-first-move.md +60 -0
- package/daemon/specs/rigs/launch/kernel/agents/operator/agent/guidance/role.md +105 -19
- package/daemon/specs/rigs/launch/kernel/culture/CULTURE.md +5 -2
- package/daemon/specs/rigs/launch/starter/guidance/lead-first-move.md +44 -0
- package/dist/build-info.js +3 -3
- package/dist/cli-error.d.ts.map +1 -1
- package/dist/cli-error.js +11 -3
- package/dist/cli-error.js.map +1 -1
- package/dist/client.d.ts +2 -0
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +2 -0
- package/dist/client.js.map +1 -1
- package/dist/commands/agent-image.js +2 -2
- package/dist/commands/agent-image.js.map +1 -1
- package/dist/commands/bundle.d.ts.map +1 -1
- package/dist/commands/bundle.js +5 -4
- package/dist/commands/bundle.js.map +1 -1
- package/dist/commands/chatroom.d.ts.map +1 -1
- package/dist/commands/chatroom.js +21 -1
- package/dist/commands/chatroom.js.map +1 -1
- package/dist/commands/context.d.ts.map +1 -1
- package/dist/commands/context.js +12 -2
- package/dist/commands/context.js.map +1 -1
- package/dist/commands/doctor.d.ts +3 -1
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +14 -7
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/down.d.ts.map +1 -1
- package/dist/commands/down.js +42 -0
- package/dist/commands/down.js.map +1 -1
- package/dist/commands/gateway.d.ts.map +1 -1
- package/dist/commands/gateway.js +4 -3
- package/dist/commands/gateway.js.map +1 -1
- package/dist/commands/launch.d.ts.map +1 -1
- package/dist/commands/launch.js +114 -8
- package/dist/commands/launch.js.map +1 -1
- package/dist/commands/package.d.ts.map +1 -1
- package/dist/commands/package.js +6 -3
- package/dist/commands/package.js.map +1 -1
- package/dist/commands/policy.d.ts.map +1 -1
- package/dist/commands/policy.js +6 -5
- package/dist/commands/policy.js.map +1 -1
- package/dist/commands/proof.js +1 -1
- package/dist/commands/proof.js.map +1 -1
- package/dist/commands/queue.d.ts.map +1 -1
- package/dist/commands/queue.js +6 -3
- package/dist/commands/queue.js.map +1 -1
- package/dist/commands/restore-packet.d.ts.map +1 -1
- package/dist/commands/restore-packet.js +6 -4
- package/dist/commands/restore-packet.js.map +1 -1
- package/dist/commands/scope.js +6 -6
- package/dist/commands/scope.js.map +1 -1
- package/dist/commands/setup.d.ts +6 -15
- package/dist/commands/setup.d.ts.map +1 -1
- package/dist/commands/setup.js +121 -332
- package/dist/commands/setup.js.map +1 -1
- package/dist/commands/skill.d.ts.map +1 -1
- package/dist/commands/skill.js +12 -1
- package/dist/commands/skill.js.map +1 -1
- package/dist/commands/slack.d.ts +5 -1
- package/dist/commands/slack.d.ts.map +1 -1
- package/dist/commands/slack.js +143 -6
- package/dist/commands/slack.js.map +1 -1
- package/dist/commands/stream.js +1 -1
- package/dist/commands/stream.js.map +1 -1
- package/dist/commands/terminal.d.ts +33 -0
- package/dist/commands/terminal.d.ts.map +1 -1
- package/dist/commands/terminal.js +30 -12
- package/dist/commands/terminal.js.map +1 -1
- package/dist/commands/tui.js +4 -4
- package/dist/commands/tui.js.map +1 -1
- package/dist/commands/workflow-follow.d.ts +1 -1
- package/dist/commands/workflow-follow.d.ts.map +1 -1
- package/dist/commands/workflow-follow.js +4 -3
- package/dist/commands/workflow-follow.js.map +1 -1
- package/dist/commands/workflow.d.ts.map +1 -1
- package/dist/commands/workflow.js +30 -18
- package/dist/commands/workflow.js.map +1 -1
- package/dist/config-store.js +1 -1
- package/dist/config-store.js.map +1 -1
- package/dist/front-door.d.ts.map +1 -1
- package/dist/front-door.js +4 -2
- package/dist/front-door.js.map +1 -1
- package/dist/herdr-launch-config.d.ts +3 -0
- package/dist/herdr-launch-config.d.ts.map +1 -0
- package/dist/herdr-launch-config.js +37 -0
- package/dist/herdr-launch-config.js.map +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/launch-plan-guard.d.ts +27 -0
- package/dist/launch-plan-guard.d.ts.map +1 -0
- package/dist/launch-plan-guard.js +73 -0
- package/dist/launch-plan-guard.js.map +1 -0
- package/dist/lib/bundle-source.d.ts +2 -0
- package/dist/lib/bundle-source.d.ts.map +1 -1
- package/dist/lib/bundle-source.js +12 -1
- package/dist/lib/bundle-source.js.map +1 -1
- package/dist/lib/context-git.d.ts +2 -0
- package/dist/lib/context-git.d.ts.map +1 -1
- package/dist/lib/context-git.js +55 -5
- package/dist/lib/context-git.js.map +1 -1
- package/dist/lib/scope/scope-fs.d.ts +3 -2
- package/dist/lib/scope/scope-fs.d.ts.map +1 -1
- package/dist/lib/scope/scope-fs.js +97 -9
- package/dist/lib/scope/scope-fs.js.map +1 -1
- package/dist/lib/scope/templates.d.ts.map +1 -1
- package/dist/lib/scope/templates.js +28 -24
- package/dist/lib/scope/templates.js.map +1 -1
- package/dist/provider-auth.d.ts +32 -0
- package/dist/provider-auth.d.ts.map +1 -0
- package/dist/provider-auth.js +128 -0
- package/dist/provider-auth.js.map +1 -0
- package/dist/terminal-window.d.ts +19 -0
- package/dist/terminal-window.d.ts.map +1 -0
- package/dist/terminal-window.js +513 -0
- package/dist/terminal-window.js.map +1 -0
- package/package.json +2 -2
- package/tui/dist/commands/registry.js +2 -2
- package/tui/dist/commands/registry.js.map +1 -1
- package/tui/dist/config/config-model.d.ts.map +1 -1
- package/tui/dist/config/config-model.js +1 -0
- package/tui/dist/config/config-model.js.map +1 -1
- package/tui/dist/connections/connections-model.d.ts +5 -0
- package/tui/dist/connections/connections-model.d.ts.map +1 -1
- package/tui/dist/connections/connections-model.js +1 -1
- package/tui/dist/connections/connections-model.js.map +1 -1
- package/tui/dist/daemon-client.d.ts +5 -0
- package/tui/dist/daemon-client.d.ts.map +1 -1
- package/tui/dist/daemon-client.js.map +1 -1
- package/tui/dist/execution/workflow-model.d.ts.map +1 -1
- package/tui/dist/execution/workflow-model.js +3 -1
- package/tui/dist/execution/workflow-model.js.map +1 -1
- package/tui/dist/hydrate.d.ts +1 -1
- package/tui/dist/hydrate.d.ts.map +1 -1
- package/tui/dist/hydrate.js +3 -1
- package/tui/dist/hydrate.js.map +1 -1
- package/tui/dist/main.js +39 -15
- package/tui/dist/main.js.map +1 -1
- package/tui/dist/page-read.js +1 -1
- package/tui/dist/page-read.js.map +1 -1
- package/tui/dist/pending-address.d.ts +7 -0
- package/tui/dist/pending-address.d.ts.map +1 -0
- package/tui/dist/pending-address.js +11 -0
- package/tui/dist/pending-address.js.map +1 -0
- package/tui/dist/render.d.ts.map +1 -1
- package/tui/dist/render.js +10 -6
- package/tui/dist/render.js.map +1 -1
- package/tui/dist/scopes/scopes-model.js +4 -4
- package/tui/dist/socket-server.d.ts +3 -1
- package/tui/dist/socket-server.d.ts.map +1 -1
- package/tui/dist/socket-server.js +6 -0
- package/tui/dist/socket-server.js.map +1 -1
- package/tui/dist/state.d.ts.map +1 -1
- package/tui/dist/state.js +40 -13
- package/tui/dist/state.js.map +1 -1
- package/tui/dist/stylize.js +1 -1
- package/tui/dist/stylize.js.map +1 -1
- package/tui/dist/terminals/open-window.d.ts +5 -0
- package/tui/dist/terminals/open-window.d.ts.map +1 -0
- package/tui/dist/terminals/open-window.js +55 -0
- package/tui/dist/terminals/open-window.js.map +1 -0
- package/tui/dist/terminals/terminal-model.d.ts.map +1 -1
- package/tui/dist/terminals/terminal-model.js +16 -17
- package/tui/dist/terminals/terminal-model.js.map +1 -1
- package/tui/dist/types.d.ts +16 -1
- package/tui/dist/types.d.ts.map +1 -1
- package/ui/dist/assets/{index-HHSvwF97.js → index-D5n8EwkG.js} +1 -1
- package/ui/dist/index.html +1 -1
|
@@ -0,0 +1,513 @@
|
|
|
1
|
+
import { execFile, spawn } from "node:child_process";
|
|
2
|
+
import { existsSync } from "node:fs";
|
|
3
|
+
import { homedir, hostname, networkInterfaces } from "node:os";
|
|
4
|
+
import path from "node:path";
|
|
5
|
+
import { randomUUID } from "node:crypto";
|
|
6
|
+
import { promisify } from "node:util";
|
|
7
|
+
import { shellQuote } from "./cross-host-executor.js";
|
|
8
|
+
import { prepareHerdrLaunchConfig } from "./herdr-launch-config.js";
|
|
9
|
+
export function defaultWindowDeps() {
|
|
10
|
+
const env = { ...process.env };
|
|
11
|
+
delete env["TMUX"];
|
|
12
|
+
const run = promisify(execFile);
|
|
13
|
+
return {
|
|
14
|
+
platform: process.platform, env, exists: existsSync,
|
|
15
|
+
exec: async (file, args, timeoutMs = 10_000) => (await run(file, args, { env, encoding: "utf8", timeout: timeoutMs })).stdout,
|
|
16
|
+
launch: (file, args) => new Promise((resolve, reject) => {
|
|
17
|
+
const child = spawn(file, args, { env, detached: true, stdio: "ignore" });
|
|
18
|
+
child.once("error", reject);
|
|
19
|
+
child.once("spawn", () => { child.unref(); resolve(); });
|
|
20
|
+
}),
|
|
21
|
+
sleep: ms => new Promise(resolve => setTimeout(resolve, ms)),
|
|
22
|
+
id: () => randomUUID().slice(0, 12),
|
|
23
|
+
notice: message => process.stderr.write(`${message}\n`),
|
|
24
|
+
herdrConfig: (socketPath, columns) => prepareHerdrLaunchConfig(env, socketPath, columns),
|
|
25
|
+
columns: async () => {
|
|
26
|
+
if (process.stdout.isTTY && process.stdout.columns > 0)
|
|
27
|
+
return process.stdout.columns;
|
|
28
|
+
try {
|
|
29
|
+
const size = await run("/bin/sh", ["-c", "stty size < /dev/tty"], { encoding: "utf8", timeout: 1000 });
|
|
30
|
+
const width = Number(size.stdout.trim().split(/\s+/)[1]);
|
|
31
|
+
if (Number.isSafeInteger(width) && width > 0)
|
|
32
|
+
return width;
|
|
33
|
+
}
|
|
34
|
+
catch { /* A detached shell tool may still name its hosting tmux pane. */ }
|
|
35
|
+
if (process.env["TMUX"] && process.env["TMUX_PANE"]) {
|
|
36
|
+
try {
|
|
37
|
+
const size = await run("tmux", ["display-message", "-p", "-t", process.env["TMUX_PANE"], "#{window_width}"], { encoding: "utf8", timeout: 1000 });
|
|
38
|
+
const width = Number(size.stdout.trim());
|
|
39
|
+
if (Number.isSafeInteger(width) && width > 0)
|
|
40
|
+
return width;
|
|
41
|
+
}
|
|
42
|
+
catch { /* An ancestor may still own the person's terminal. */ }
|
|
43
|
+
}
|
|
44
|
+
// An agent's shell tool has no terminal, but the agent process above it runs in the person's
|
|
45
|
+
// terminal (a Ghostty or Terminal tab, or a Herdr pane). Read the nearest ancestor's terminal size.
|
|
46
|
+
try {
|
|
47
|
+
let pid = process.ppid;
|
|
48
|
+
for (let depth = 0; depth < 8 && pid > 1; depth++) {
|
|
49
|
+
const [parent, tty] = (await run("ps", ["-o", "ppid=,tty=", "-p", String(pid)], { encoding: "utf8", timeout: 1000 })).stdout.trim().split(/\s+/);
|
|
50
|
+
if (tty && /^[A-Za-z0-9/]+$/.test(tty) && tty !== "??" && tty !== "?") {
|
|
51
|
+
const size = await run("/bin/sh", ["-c", `stty size < /dev/${tty}`], { encoding: "utf8", timeout: 1000 });
|
|
52
|
+
const width = Number(size.stdout.trim().split(/\s+/)[1]);
|
|
53
|
+
return Number.isSafeInteger(width) && width > 0 ? width : undefined;
|
|
54
|
+
}
|
|
55
|
+
pid = Number(parent);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
catch { /* Unknown is a narrow layout, never an invented wide measurement. */ }
|
|
59
|
+
return undefined;
|
|
60
|
+
},
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
function localDaemon(url) {
|
|
64
|
+
const host = new URL(url).hostname.replace(/^\[|\]$/g, "");
|
|
65
|
+
return ["localhost", "::1", "::", "0.0.0.0", hostname()].includes(host)
|
|
66
|
+
|| /^127\./.test(host)
|
|
67
|
+
|| Object.values(networkInterfaces()).flat().some(iface => iface?.address === host);
|
|
68
|
+
}
|
|
69
|
+
async function herdrBinary(deps) {
|
|
70
|
+
const dir = deps.env["HERDR_INSTALL_DIR"] ?? path.join(deps.env["HOME"] ?? homedir(), ".local", "bin");
|
|
71
|
+
for (const candidate of ["herdr", path.join(dir, "herdr")]) {
|
|
72
|
+
try {
|
|
73
|
+
await deps.exec(candidate, ["--version"]);
|
|
74
|
+
const binary = candidate === "herdr" ? (await deps.exec("/bin/sh", ["-c", "command -v herdr"])).trim() : candidate;
|
|
75
|
+
if (path.isAbsolute(binary))
|
|
76
|
+
return binary;
|
|
77
|
+
}
|
|
78
|
+
catch { /* The installer path also works when it is absent from PATH. */ }
|
|
79
|
+
}
|
|
80
|
+
return null;
|
|
81
|
+
}
|
|
82
|
+
/** New surfaces only. No System Events keystrokes or existing-terminal input. */
|
|
83
|
+
async function windowLauncher(deps, notes) {
|
|
84
|
+
// Shell tools can pipe stdio while still running inside the person's terminal.
|
|
85
|
+
const program = deps.env["TERM_PROGRAM"];
|
|
86
|
+
const linuxHost = deps.platform !== "linux" ? undefined
|
|
87
|
+
: deps.env["GNOME_TERMINAL_SERVICE"] ? "gnome-terminal"
|
|
88
|
+
: deps.env["KONSOLE_VERSION"] ? "konsole" : deps.env["XTERM_VERSION"] ? "xterm" : undefined;
|
|
89
|
+
const host = !program || program === "tmux" ? deps.env["__CFBundleIdentifier"] ?? linuxHost : program;
|
|
90
|
+
if (deps.env["CI"] && !["0", "false"].includes(deps.env["CI"]))
|
|
91
|
+
return "This is a CI run.";
|
|
92
|
+
if (deps.env["SSH_CONNECTION"] || deps.env["SSH_CLIENT"] || deps.env["SSH_TTY"])
|
|
93
|
+
return "This is an SSH session; no desktop window is opened over SSH.";
|
|
94
|
+
if (host === "herdr")
|
|
95
|
+
return { currentHerdr: true };
|
|
96
|
+
if (deps.platform === "darwin") {
|
|
97
|
+
const inGhostty = host === "ghostty" || host === "com.mitchellh.ghostty";
|
|
98
|
+
const inTerminal = host === "Apple_Terminal" || host === "com.apple.Terminal";
|
|
99
|
+
const newApp = !inGhostty && !inTerminal;
|
|
100
|
+
// Desktop shell tools need no stdin TTY, but a background job must not summon an app.
|
|
101
|
+
if (newApp && (await deps.exec("/bin/launchctl", ["managername"]).catch(() => "")).trim() !== "Aqua") {
|
|
102
|
+
return "No local macOS desktop session could be confirmed.";
|
|
103
|
+
}
|
|
104
|
+
const app = !inTerminal ? ["/Applications/Ghostty.app", path.join(deps.env["HOME"] ?? homedir(), "Applications/Ghostty.app")].find(deps.exists) : undefined;
|
|
105
|
+
let ghostty = false;
|
|
106
|
+
if (app) {
|
|
107
|
+
try {
|
|
108
|
+
const version = await deps.exec("/usr/libexec/PlistBuddy", ["-c", "Print :CFBundleShortVersionString", path.join(app, "Contents/Info.plist")]);
|
|
109
|
+
const [major, minor] = version.trim().split(".").map(Number);
|
|
110
|
+
ghostty = major > 1 || (major === 1 && minor >= 3);
|
|
111
|
+
}
|
|
112
|
+
catch { /* No other app is a substitute for the hosting terminal. */ }
|
|
113
|
+
}
|
|
114
|
+
if (inGhostty && !ghostty)
|
|
115
|
+
return "The installed Ghostty does not provide a supported scripting interface (1.3 or newer required).";
|
|
116
|
+
if (app && !ghostty)
|
|
117
|
+
notes.push("The installed Ghostty could not be confirmed to support scripting (1.3 or newer required); using Terminal for this desktop caller.");
|
|
118
|
+
const permissionNotice = `It is fine to click Allow if macOS asks to control ${ghostty ? "Ghostty" : "Terminal"}; this lets OpenRig open the view they asked for.`;
|
|
119
|
+
if (newApp)
|
|
120
|
+
notes.push(`Tell the person: ${permissionNotice} The app uses its own new-window size because this caller has no scriptable terminal window to copy.`);
|
|
121
|
+
// A tab group shares bounds: copying its current bounds also leaves the original unchanged.
|
|
122
|
+
const script = ghostty ? `on run argv
|
|
123
|
+
tell application "Ghostty"
|
|
124
|
+
set cfg to new surface configuration
|
|
125
|
+
set command of cfg to item 1 of argv
|
|
126
|
+
if ${newApp ? "false" : "(count of windows) > 0"} then
|
|
127
|
+
set newTab to new tab in front window with configuration cfg
|
|
128
|
+
select tab newTab
|
|
129
|
+
focus (focused terminal of newTab)
|
|
130
|
+
activate window front window
|
|
131
|
+
return "tab"
|
|
132
|
+
else
|
|
133
|
+
set newWindow to new window with configuration cfg
|
|
134
|
+
activate window newWindow
|
|
135
|
+
return "window"
|
|
136
|
+
end if
|
|
137
|
+
end tell
|
|
138
|
+
end run` : `on run argv
|
|
139
|
+
tell application "Terminal"
|
|
140
|
+
set personBounds to missing value
|
|
141
|
+
${newApp ? "-- No hosting Terminal window: keep the new-window profile defaults." : "if (count of windows) > 0 then set personBounds to bounds of front window"}
|
|
142
|
+
set viewTab to do script ""
|
|
143
|
+
set viewWindow to front window
|
|
144
|
+
if personBounds is not missing value then set bounds of viewWindow to personBounds
|
|
145
|
+
do script (item 1 of argv) in viewTab
|
|
146
|
+
activate
|
|
147
|
+
return "window:" & (number of columns of viewTab)
|
|
148
|
+
end tell
|
|
149
|
+
end run`;
|
|
150
|
+
// A denied/uncertain Automation request is returned once, never replayed in another app.
|
|
151
|
+
return async (command) => {
|
|
152
|
+
if (newApp)
|
|
153
|
+
deps.notice?.(permissionNotice);
|
|
154
|
+
const reported = (await deps.exec("/usr/bin/osascript", ["-e", script, command], 120_000)).trim();
|
|
155
|
+
const columns = Number(reported.split(":")[1]);
|
|
156
|
+
notes.push(newApp
|
|
157
|
+
? `${ghostty ? "Ghostty" : "Terminal"} opened a new window using its own profile settings; no existing window was resized.`
|
|
158
|
+
: ghostty
|
|
159
|
+
? "Ghostty keeps the person's window size; layout uses the hosting terminal's measured width when available."
|
|
160
|
+
: "The new Terminal view copies the person's front-window bounds when available; existing window settings were kept.");
|
|
161
|
+
return { app: ghostty ? "Ghostty" : "Terminal", surface: ghostty ? reported : "window", ...(Number.isSafeInteger(columns) && columns > 0 ? { columns } : newApp ? { columns: undefined } : {}) };
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
if (deps.platform !== "linux")
|
|
165
|
+
return `No supported desktop launcher on ${deps.platform}.`;
|
|
166
|
+
if (!deps.env["DISPLAY"] && !deps.env["WAYLAND_DISPLAY"])
|
|
167
|
+
return "No desktop display is available.";
|
|
168
|
+
for (const app of ["ghostty", "gnome-terminal", "konsole", "xterm"].filter(app => app === host)) {
|
|
169
|
+
try {
|
|
170
|
+
await deps.exec("/bin/sh", ["-c", `command -v ${app}`]);
|
|
171
|
+
}
|
|
172
|
+
catch {
|
|
173
|
+
continue;
|
|
174
|
+
}
|
|
175
|
+
return async (command) => {
|
|
176
|
+
const prefix = app === "ghostty" ? ["--window-width=140", "--window-height=40", "-e"]
|
|
177
|
+
: app === "gnome-terminal" ? ["--window", "--geometry=140x40", "--"]
|
|
178
|
+
: app === "konsole" ? ["-p", "TerminalColumns=140", "-p", "TerminalRows=40", "-e"]
|
|
179
|
+
: app === "xterm" ? ["-geometry", "140x40", "-e"]
|
|
180
|
+
: ["-e"];
|
|
181
|
+
const args = [...prefix, "/bin/sh", "-c", command];
|
|
182
|
+
await deps.launch(app, args);
|
|
183
|
+
notes.push("Requested 140 columns by 40 rows for the new window. The desktop may adjust that size; enlarge it manually if needed.");
|
|
184
|
+
return { app, surface: "window-requested" };
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
return `Unrecognised or unavailable hosting terminal: ${JSON.stringify(host ?? "unknown")}.`;
|
|
188
|
+
}
|
|
189
|
+
function failure(provider, error) {
|
|
190
|
+
return { provider, ok: false, opened: [], absent: [], degraded: [], pages: 0, error, code: "terminal_window_failed" };
|
|
191
|
+
}
|
|
192
|
+
/** Saved Herdr labels survive reboot; only current clients prove a local attachment. */
|
|
193
|
+
async function hasLiveAttachments(existing, tabs, pages, pageLabel, herdrArgs, deps) {
|
|
194
|
+
try {
|
|
195
|
+
const tmux = (await deps.exec("/bin/sh", ["-c", "command -v tmux"])).trim();
|
|
196
|
+
if (!path.isAbsolute(tmux))
|
|
197
|
+
return false;
|
|
198
|
+
const listed = JSON.parse(await deps.exec("/usr/bin/env", [...herdrArgs, "pane", "list", "--workspace", existing.workspace_id]));
|
|
199
|
+
const panes = listed?.result?.panes;
|
|
200
|
+
if (!Array.isArray(panes) || !panes.every(pane => pane && pane.workspace_id === existing.workspace_id && typeof pane.tab_id === "string" && typeof pane.pane_id === "string" && pane.pane_id))
|
|
201
|
+
return false;
|
|
202
|
+
const clients = new Map();
|
|
203
|
+
// Match view-composer's serialization (these strings are compared, never executed).
|
|
204
|
+
const quote = (value) => "'" + value.replace(/'/g, "'\"'\"'") + "'";
|
|
205
|
+
const inventory = await deps.exec(tmux, ["list-clients", "-F", "#{client_pid}\t#{session_name}\t#{client_readonly}"]);
|
|
206
|
+
for (const line of inventory.trim().split("\n")) {
|
|
207
|
+
const [pid, session, readOnly] = line.split("\t");
|
|
208
|
+
if (!pid || !/^\d+$/.test(pid) || !session || !["0", "1"].includes(readOnly ?? ""))
|
|
209
|
+
continue;
|
|
210
|
+
// Compare the composer's exact command, including session aliases and read-only mode.
|
|
211
|
+
// SSH/custom commands cannot be confirmed from this local client inventory.
|
|
212
|
+
clients.set(pid, ["tmux", quote(tmux)].map(binary => `${binary} attach ${readOnly === "1" ? "-r " : ""}-t ${quote(session)}`));
|
|
213
|
+
}
|
|
214
|
+
const used = new Set();
|
|
215
|
+
for (const [index, page] of pages.entries()) {
|
|
216
|
+
const label = pageLabel(index);
|
|
217
|
+
const matches = tabs.filter(tab => tab.workspace_id === existing.workspace_id && tab.label === label);
|
|
218
|
+
if (matches.length !== 1)
|
|
219
|
+
return false;
|
|
220
|
+
const remaining = page.map(pane => pane.paneCommand);
|
|
221
|
+
for (const pane of panes.filter(pane => pane.tab_id === matches[0].tab_id)) {
|
|
222
|
+
if (remaining.length === 0)
|
|
223
|
+
break;
|
|
224
|
+
const result = JSON.parse(await deps.exec("/usr/bin/env", [...herdrArgs, "pane", "process-info", "--pane", pane.pane_id]));
|
|
225
|
+
const info = result?.result?.process_info;
|
|
226
|
+
if (info?.pane_id !== pane.pane_id || (info.foreground_processes !== undefined && !Array.isArray(info.foreground_processes)))
|
|
227
|
+
return false;
|
|
228
|
+
for (const process of info.foreground_processes ?? []) {
|
|
229
|
+
const pid = String(process?.pid);
|
|
230
|
+
if (used.has(pid))
|
|
231
|
+
continue;
|
|
232
|
+
const found = remaining.findIndex(command => clients.get(pid)?.includes(command));
|
|
233
|
+
if (found < 0)
|
|
234
|
+
continue;
|
|
235
|
+
remaining.splice(found, 1);
|
|
236
|
+
used.add(pid);
|
|
237
|
+
break; // One Herdr pane can satisfy only one expected tile.
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
if (remaining.length)
|
|
241
|
+
return false;
|
|
242
|
+
}
|
|
243
|
+
return pages.length > 0;
|
|
244
|
+
}
|
|
245
|
+
catch {
|
|
246
|
+
// Read failures prevent reuse, not opening. Never type into or close an unverified pane.
|
|
247
|
+
return false;
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
/** Render the daemon's existing composition; never rediscover/relaunch kernel seats here. */
|
|
251
|
+
export async function openTerminalWindow(client, view, requestedProvider, deps = defaultWindowDeps(), expectedPlan) {
|
|
252
|
+
let provider = requestedProvider ?? "herdr";
|
|
253
|
+
let window;
|
|
254
|
+
let viewer;
|
|
255
|
+
let windowAttempted = false;
|
|
256
|
+
let manualCommand;
|
|
257
|
+
let currentHerdr = false;
|
|
258
|
+
const recovery = `rig terminal open ${shellQuote(view)} --window${requestedProvider && ["herdr", "tmux"].includes(requestedProvider) ? ` --provider ${shellQuote(requestedProvider)}` : ""}`;
|
|
259
|
+
const failed = (reason) => ({ ...failure(provider, currentHerdr ? `The current Herdr view outcome could not be confirmed. ${reason} Inspect the selected space before retrying: ${recovery}`
|
|
260
|
+
: window ? `A terminal window was requested, but the view outcome could not be confirmed. ${reason} Inspect the terminal before retrying: ${recovery}`
|
|
261
|
+
: windowAttempted ? `Terminal window status is unknown. ${reason} Inspect the desktop before retrying: ${recovery}`
|
|
262
|
+
: `No terminal window was opened. ${reason} On the daemon's desktop, run: ${recovery}`), windowAttempted });
|
|
263
|
+
const windowNotes = [];
|
|
264
|
+
try {
|
|
265
|
+
if (!localDaemon(client.baseUrl))
|
|
266
|
+
throw new Error("The window launcher must run on the daemon's own desktop; the configured daemon is remote.");
|
|
267
|
+
if (requestedProvider && !["herdr", "tmux"].includes(requestedProvider))
|
|
268
|
+
throw new Error("--window supports herdr or tmux. Use cmux without --window.");
|
|
269
|
+
const launchWindow = await windowLauncher(deps, windowNotes);
|
|
270
|
+
const measured = typeof launchWindow !== "string" ? await deps.columns?.().catch(() => undefined) : undefined;
|
|
271
|
+
let viewportColumns = Number.isSafeInteger(measured) && measured > 0 ? measured : undefined;
|
|
272
|
+
const herdr = requestedProvider === "tmux" ? null : await herdrBinary(deps);
|
|
273
|
+
if (!herdr && requestedProvider === "herdr")
|
|
274
|
+
throw new Error("Herdr is not installed. Run rig setup, or use --provider tmux --window.");
|
|
275
|
+
provider = herdr ? "herdr" : "tmux";
|
|
276
|
+
// Preview is provider-neutral composition, including saved-view membership, absences and quoting.
|
|
277
|
+
const previewUrl = () => `/api/terminal/preview?view=${encodeURIComponent(view)}&provider=herdr${viewportColumns === undefined ? "" : `&viewportColumns=${viewportColumns}`}`;
|
|
278
|
+
const preview = await client.get(previewUrl());
|
|
279
|
+
if (preview.status >= 400 || !("composed" in preview.data)) {
|
|
280
|
+
return failed(preview.data.error ?? "Could not compose the requested view.");
|
|
281
|
+
}
|
|
282
|
+
let { composed, planId } = preview.data;
|
|
283
|
+
if (expectedPlan !== undefined && expectedPlan !== planId) {
|
|
284
|
+
return failure(provider, "The terminal view changed since preview. Refresh the preview before opening.");
|
|
285
|
+
}
|
|
286
|
+
if (!composed.opened.length)
|
|
287
|
+
return { ...failed("No conversations are attachable."), absent: composed.absent, degraded: composed.degraded };
|
|
288
|
+
const measureWindow = async () => {
|
|
289
|
+
if (window && "columns" in window && window.columns !== viewportColumns && composed.kernelLayout) {
|
|
290
|
+
viewportColumns = window.columns;
|
|
291
|
+
const next = await client.get(previewUrl());
|
|
292
|
+
if (next.status >= 400 || !("composed" in next.data))
|
|
293
|
+
throw new Error("Could not compose the measured terminal view.");
|
|
294
|
+
if (expectedPlan !== undefined && expectedPlan !== next.data.planId)
|
|
295
|
+
throw new Error("The measured terminal layout differs from the expected preview; refresh the preview before opening.");
|
|
296
|
+
({ composed, planId } = next.data);
|
|
297
|
+
if (!composed.opened.length)
|
|
298
|
+
throw new Error("No conversations are attachable after opening the terminal.");
|
|
299
|
+
}
|
|
300
|
+
if (composed.kernelLayout)
|
|
301
|
+
windowNotes.push(viewportColumns === undefined
|
|
302
|
+
? "Terminal width could not be measured; the OpenRig view uses the operator-only first page."
|
|
303
|
+
: `OpenRig view layout measured at ${viewportColumns} columns: ${viewportColumns >= 120 ? "dashboard and operator side by side; advisor on a separate page" : "operator first; dashboard and advisor on separate pages"}.`);
|
|
304
|
+
};
|
|
305
|
+
const socket = preview.data.status.launch?.socketPath;
|
|
306
|
+
if (typeof launchWindow === "object") {
|
|
307
|
+
provider = "herdr";
|
|
308
|
+
if (requestedProvider === "tmux")
|
|
309
|
+
return failed("The current Herdr view requires provider herdr; no extra window was opened.");
|
|
310
|
+
const base = path.join(deps.env["HOME"] ?? homedir(), ".config", "herdr");
|
|
311
|
+
const callerSocket = deps.env["HERDR_SOCKET_PATH"] ?? (deps.env["HERDR_SESSION"]
|
|
312
|
+
? path.join(base, "sessions", deps.env["HERDR_SESSION"], "herdr.sock") : path.join(base, "herdr.sock"));
|
|
313
|
+
if (!socket || path.resolve(socket) !== path.resolve(callerSocket))
|
|
314
|
+
return failed("The current Herdr endpoint differs from the daemon's endpoint; no space was opened in another session.");
|
|
315
|
+
if (!herdr)
|
|
316
|
+
return failed("The Herdr executable is unavailable; no space was opened.");
|
|
317
|
+
// Set only once a space may open, so the refusals above read as "nothing was opened".
|
|
318
|
+
currentHerdr = true;
|
|
319
|
+
windowNotes.push("Using the current Herdr session; no terminal window or personal config was changed.");
|
|
320
|
+
}
|
|
321
|
+
let configEnv = "";
|
|
322
|
+
let configPrefix = "";
|
|
323
|
+
if (herdr && socket && !currentHerdr) {
|
|
324
|
+
try {
|
|
325
|
+
const narrow = deps.herdrConfig(socket);
|
|
326
|
+
const wide = typeof launchWindow === "function" ? deps.herdrConfig(socket, 160) : narrow;
|
|
327
|
+
if (narrow === wide)
|
|
328
|
+
configEnv = ` HERDR_CONFIG_PATH=${shellQuote(narrow)}`;
|
|
329
|
+
else
|
|
330
|
+
configPrefix = `set -- $(stty size 2>/dev/null); if [ "${'${2:-0}'}" -ge 160 ]; then export HERDR_CONFIG_PATH=${shellQuote(wide)}; else export HERDR_CONFIG_PATH=${shellQuote(narrow)}; fi; exec `;
|
|
331
|
+
windowNotes.push("Your Herdr config is kept when present; otherwise the sidebar starts open at 160 columns and collapsed below.");
|
|
332
|
+
}
|
|
333
|
+
catch (error) {
|
|
334
|
+
windowNotes.push(`Could not prepare OpenRig's private Herdr settings (${error instanceof Error ? error.message : String(error)}); Herdr starts with its usual sidebar.`);
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
const directCommand = herdr && socket
|
|
338
|
+
? `${configPrefix}env -u TMUX -u HERDR_SESSION -u HERDR_SOCKET_PATH HERDR_SOCKET_PATH=${shellQuote(socket)}${configEnv} ${shellQuote(herdr)}`
|
|
339
|
+
: `env -u TMUX ${composed.opened[0].paneCommand.replace(/^ssh /, "ssh -t ")}`;
|
|
340
|
+
manualCommand = directCommand;
|
|
341
|
+
if (typeof launchWindow === "string") {
|
|
342
|
+
const headless = deps.env["SSH_CONNECTION"] || deps.env["SSH_CLIENT"] || deps.env["SSH_TTY"]
|
|
343
|
+
|| (deps.platform === "linux" && !deps.env["DISPLAY"] && !deps.env["WAYLAND_DISPLAY"]);
|
|
344
|
+
const where = headless ? "Open a new SSH session to the daemon's host" : "Open a new terminal window on the daemon's host";
|
|
345
|
+
const notes = herdr && socket
|
|
346
|
+
? [`After the person starts Herdr, have the agent place this view by running: rig terminal open ${shellQuote(view)} --provider herdr`] : [];
|
|
347
|
+
return { ...failure(provider, `No terminal window was opened. ${launchWindow} ${where} and run: ${manualCommand}`), windowAttempted: false, absent: composed.absent, degraded: composed.degraded, notes: [...notes, ...windowNotes] };
|
|
348
|
+
}
|
|
349
|
+
if (herdr) {
|
|
350
|
+
const endpoint = preview.data.status.launch;
|
|
351
|
+
if (!endpoint?.socketPath)
|
|
352
|
+
throw new Error("The daemon does not report its herdr endpoint. Update the daemon, or use --provider tmux --window.");
|
|
353
|
+
// A CLI session would override the daemon's resolved socket in Herdr.
|
|
354
|
+
if (typeof launchWindow === "function") {
|
|
355
|
+
windowAttempted = true;
|
|
356
|
+
window = await launchWindow(configPrefix ? `/bin/sh -c ${shellQuote(manualCommand)}` : manualCommand);
|
|
357
|
+
}
|
|
358
|
+
await measureWindow();
|
|
359
|
+
let alive = false;
|
|
360
|
+
for (let attempt = 0; attempt < 20; attempt++) {
|
|
361
|
+
const status = await client.get("/api/terminal/status?provider=herdr");
|
|
362
|
+
if (status.data.providers?.[0]?.liveness.alive) {
|
|
363
|
+
alive = true;
|
|
364
|
+
break;
|
|
365
|
+
}
|
|
366
|
+
await deps.sleep(250);
|
|
367
|
+
}
|
|
368
|
+
if (!alive)
|
|
369
|
+
throw new Error("The terminal was requested, but herdr's control socket did not become ready. Inspect the new terminal before retrying.");
|
|
370
|
+
// Inventory is read-only: a failed read must not prevent the first open.
|
|
371
|
+
// Scope each tab list to its workspace, on the daemon's exact endpoint.
|
|
372
|
+
const herdrArgs = ["-u", "TMUX", "-u", "HERDR_SESSION", "-u", "HERDR_SOCKET_PATH", `HERDR_SOCKET_PATH=${endpoint.socketPath}`, herdr];
|
|
373
|
+
let tabs = [];
|
|
374
|
+
const spaceLabels = new Map();
|
|
375
|
+
try {
|
|
376
|
+
const listed = JSON.parse(await deps.exec("/usr/bin/env", [...herdrArgs, "workspace", "list"]));
|
|
377
|
+
const workspaces = listed?.result?.workspaces;
|
|
378
|
+
if (!Array.isArray(workspaces) || !workspaces.every(ws => ws && typeof ws.workspace_id === "string" && ws.workspace_id)) {
|
|
379
|
+
throw new Error("Herdr returned no usable workspace inventory.");
|
|
380
|
+
}
|
|
381
|
+
for (const workspace of workspaces) {
|
|
382
|
+
if (typeof workspace.label === "string")
|
|
383
|
+
spaceLabels.set(workspace.workspace_id, workspace.label);
|
|
384
|
+
const listedTabs = JSON.parse(await deps.exec("/usr/bin/env", [...herdrArgs, "tab", "list", "--workspace", workspace.workspace_id]));
|
|
385
|
+
const scoped = listedTabs?.result?.tabs;
|
|
386
|
+
if (!Array.isArray(scoped) || !scoped.every(tab => tab && typeof tab.label === "string" && typeof tab.tab_id === "string" && tab.tab_id && tab.workspace_id === workspace.workspace_id)) {
|
|
387
|
+
throw new Error(`Herdr returned no usable tab inventory for workspace ${workspace.workspace_id}.`);
|
|
388
|
+
}
|
|
389
|
+
tabs.push(...scoped);
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
catch (err) {
|
|
393
|
+
tabs = [];
|
|
394
|
+
windowNotes.push(`Could not check existing Herdr workspaces: ${err.message} Creating a fresh workspace; existing workspaces are kept.`);
|
|
395
|
+
}
|
|
396
|
+
// In the person's own Herdr, its focused space is what they are looking at.
|
|
397
|
+
const shownNote = async (workspaceId) => {
|
|
398
|
+
if (currentHerdr)
|
|
399
|
+
try {
|
|
400
|
+
const listed = JSON.parse(await deps.exec("/usr/bin/env", [...herdrArgs, "workspace", "list"]));
|
|
401
|
+
const focused = listed?.result?.workspaces?.find(ws => ws?.focused);
|
|
402
|
+
if (focused && (workspaceId ? focused.workspace_id === workspaceId : !!composed.spaceLabel && focused.label === composed.spaceLabel)) {
|
|
403
|
+
return `Herdr shows the ${focused.label ?? "view's"} space in the person's current session.`;
|
|
404
|
+
}
|
|
405
|
+
}
|
|
406
|
+
catch { /* Unconfirmed: say so below. */ }
|
|
407
|
+
return currentHerdr ? "Herdr did not confirm the view's space is focused; ask the person whether they see it." : "Check the new terminal shows the intended view; window creation alone is not visual confirmation.";
|
|
408
|
+
};
|
|
409
|
+
const viewMarker = `openrig:${composed.id}`;
|
|
410
|
+
const planMarker = `${viewMarker}#${planId.slice(0, 16)}`;
|
|
411
|
+
const marker = (label) => label.includes("#") ? label.slice(0, label.lastIndexOf("#")) : "";
|
|
412
|
+
// A named view's tabs carry its panes' names; the attachment check below decides reuse.
|
|
413
|
+
const named = composed.spaceLabel ? composed.pages.map(page => page.map(pane => pane.label).join(" · ")) : undefined;
|
|
414
|
+
const pageLabel = (existing) => (index) => named ? named[index]
|
|
415
|
+
: composed.pages.length > 1 ? `${existing.label.slice(0, -2)}/${index + 1}` : existing.label;
|
|
416
|
+
const candidates = named
|
|
417
|
+
? tabs.filter(tab => tab.label === named[0] && spaceLabels.get(tab.workspace_id)?.replace(/ \(\d+\)$/, "") === composed.spaceLabel && named.every(label => tabs.filter(other => other.workspace_id === tab.workspace_id && other.label === label).length === 1))
|
|
418
|
+
: tabs.filter(tab => marker(tab.label) === planMarker && (composed.pages.length <= 1 || tab.label.endsWith("/1")));
|
|
419
|
+
const stale = tabs.filter(tab => {
|
|
420
|
+
const value = marker(tab.label);
|
|
421
|
+
return value !== planMarker && (value === viewMarker ||
|
|
422
|
+
(value.startsWith(`${viewMarker}#`) && /^[a-f0-9]{16}$/.test(value.slice(viewMarker.length + 1))));
|
|
423
|
+
});
|
|
424
|
+
for (const id of new Set(stale.map(tab => tab.workspace_id))) {
|
|
425
|
+
windowNotes.push(`Workspace ${id} has an older or different plan for this view and was kept. After inspecting it, close it if no longer needed: herdr workspace close ${shellQuote(id)}`);
|
|
426
|
+
}
|
|
427
|
+
let existing;
|
|
428
|
+
for (const candidate of candidates) {
|
|
429
|
+
if (await hasLiveAttachments(candidate, tabs, composed.pages, pageLabel(candidate), herdrArgs, deps)) {
|
|
430
|
+
existing = candidate;
|
|
431
|
+
break;
|
|
432
|
+
}
|
|
433
|
+
windowNotes.push(`Could not confirm live attachments in workspace ${candidate.workspace_id}. Its contents were kept. After inspecting it, close it if no longer needed: herdr workspace close ${shellQuote(candidate.workspace_id)}`);
|
|
434
|
+
}
|
|
435
|
+
if (existing) {
|
|
436
|
+
const focused = JSON.parse(await deps.exec("/usr/bin/env", [...herdrArgs, "tab", "focus", existing.tab_id]));
|
|
437
|
+
if (focused?.result?.tab?.tab_id !== existing.tab_id || focused.result.tab.workspace_id !== existing.workspace_id) {
|
|
438
|
+
throw new Error("Herdr did not confirm the existing view selection; no replacement space was created.");
|
|
439
|
+
}
|
|
440
|
+
return {
|
|
441
|
+
provider, ok: true, opened: [], absent: composed.absent, degraded: composed.degraded, pages: 0, window,
|
|
442
|
+
reusedWorkspace: { id: existing.workspace_id, tabId: existing.tab_id, view: composed.id },
|
|
443
|
+
notes: [...windowNotes, "Existing local tmux attachments were confirmed and workspace contents were kept; no layout refresh or new tiles were requested.", await shownNote(existing.workspace_id)],
|
|
444
|
+
};
|
|
445
|
+
}
|
|
446
|
+
const result = await client.post("/api/terminal/open", { view, provider: "herdr", expectedPlan: planId, ...(viewportColumns !== undefined ? { viewportColumns } : {}) }, { timeoutMs: 45_000 });
|
|
447
|
+
if (result.status >= 400)
|
|
448
|
+
return { ...failed(result.data.error ?? `The daemon refused the view (HTTP ${result.status}).`), window, notes: windowNotes, absent: composed.absent, degraded: composed.degraded };
|
|
449
|
+
if (!Array.isArray(result.data?.opened))
|
|
450
|
+
throw new Error("The terminal opened, but the daemon returned no view result. Inspect it before retrying.");
|
|
451
|
+
return { ...result.data, window, notes: [...(result.data.notes ?? []), ...windowNotes, await shownNote()] };
|
|
452
|
+
}
|
|
453
|
+
if (typeof launchWindow !== "function")
|
|
454
|
+
throw new Error("No terminal window launcher is available.");
|
|
455
|
+
const tmux = (await deps.exec("/bin/sh", ["-c", "command -v tmux"]).catch(() => "")).trim();
|
|
456
|
+
if (!tmux)
|
|
457
|
+
throw new Error("tmux is unavailable; run rig setup first.");
|
|
458
|
+
viewer = `openrig-view-${deps.id()}`;
|
|
459
|
+
let placeholder;
|
|
460
|
+
if (composed.kernelLayout) {
|
|
461
|
+
// This is our fresh, empty viewer, never a source seat. Attach it first so Terminal can
|
|
462
|
+
// report the real new window width before we select the OpenRig view layout.
|
|
463
|
+
placeholder = (await deps.exec(tmux, ["new-session", "-d", "-s", viewer, "-n", "view-1", "-P", "-F", "#{pane_id}"])).trim();
|
|
464
|
+
windowAttempted = true;
|
|
465
|
+
window = await launchWindow(`env -u TMUX ${shellQuote(tmux)} attach-session -t ${shellQuote(`=${viewer}`)}`);
|
|
466
|
+
await measureWindow();
|
|
467
|
+
}
|
|
468
|
+
for (const [pageIndex, page] of composed.pages.entries()) {
|
|
469
|
+
if (!page.length)
|
|
470
|
+
continue;
|
|
471
|
+
const name = `view-${pageIndex + 1}`;
|
|
472
|
+
const first = page[0];
|
|
473
|
+
const args = pageIndex === 0 ? ["new-session", "-d", "-s", viewer, "-n", name] : ["new-window", "-d", "-t", `${viewer}:`, "-n", name];
|
|
474
|
+
let pane;
|
|
475
|
+
if (pageIndex === 0 && placeholder) {
|
|
476
|
+
await deps.exec(tmux, ["respawn-pane", "-k", "-t", placeholder, `env -u TMUX ${first.paneCommand}`]);
|
|
477
|
+
pane = placeholder;
|
|
478
|
+
}
|
|
479
|
+
else
|
|
480
|
+
pane = (await deps.exec(tmux, [...args, "-P", "-F", "#{pane_id}", `env -u TMUX ${first.paneCommand}`])).trim();
|
|
481
|
+
// Nested source clients on this server can make a new window too narrow to split.
|
|
482
|
+
// Use the viewer's configured detached size, then restore normal client resizing.
|
|
483
|
+
const [width, height] = (await deps.exec(tmux, ["show-options", "-Av", "-t", viewer, "default-size"])).trim().split("x");
|
|
484
|
+
const sizing = (await deps.exec(tmux, ["show-options", "-Awv", "-t", pane, "window-size"])).trim();
|
|
485
|
+
await deps.exec(tmux, ["resize-window", "-t", pane, "-x", width, "-y", height]);
|
|
486
|
+
await deps.exec(tmux, ["select-pane", "-t", pane, "-T", first.label]);
|
|
487
|
+
for (const item of page.slice(1)) {
|
|
488
|
+
pane = (await deps.exec(tmux, ["split-window", "-d", "-h", "-t", pane, "-P", "-F", "#{pane_id}", `env -u TMUX ${item.paneCommand}`])).trim();
|
|
489
|
+
await deps.exec(tmux, ["select-pane", "-t", pane, "-T", item.label]);
|
|
490
|
+
await deps.exec(tmux, ["select-layout", "-t", `${viewer}:${name}`, "even-horizontal"]);
|
|
491
|
+
}
|
|
492
|
+
await deps.exec(tmux, ["select-layout", "-t", `${viewer}:${name}`, composed.columns === page.length ? "even-horizontal" : "tiled"]);
|
|
493
|
+
await deps.exec(tmux, ["set-option", "-w", "-t", `${viewer}:${name}`, "window-size", sizing]);
|
|
494
|
+
}
|
|
495
|
+
await deps.exec(tmux, ["select-window", "-t", `${viewer}:view-1`]);
|
|
496
|
+
if (!window) {
|
|
497
|
+
windowAttempted = true;
|
|
498
|
+
window = await launchWindow(`env -u TMUX ${shellQuote(tmux)} attach-session -t ${shellQuote(`=${viewer}`)}`);
|
|
499
|
+
}
|
|
500
|
+
return { provider, ok: true, opened: composed.opened.map(pane => pane.seat), absent: composed.absent, degraded: composed.degraded, pages: composed.pages.length, window, notes: [`Viewing session: ${viewer}. Existing conversations were preserved.`, ...windowNotes, "Check the new terminal shows the intended view; window creation alone is not visual confirmation."] };
|
|
501
|
+
}
|
|
502
|
+
catch (err) {
|
|
503
|
+
if (windowAttempted && /-1743\b/.test(`${err.message} ${err.stderr ?? ""}`)) {
|
|
504
|
+
windowNotes.push("macOS denied Automation access. In System Settings > Privacy & Security > Automation, allow the calling app to control the terminal app before trying again.");
|
|
505
|
+
if (manualCommand)
|
|
506
|
+
windowNotes.push(`To continue without Automation, open a terminal yourself and run: ${manualCommand}`);
|
|
507
|
+
if (provider === "herdr")
|
|
508
|
+
windowNotes.push(`After Herdr starts, have the agent place the view: rig terminal open ${shellQuote(view)} --provider herdr`);
|
|
509
|
+
}
|
|
510
|
+
return { ...failed(err.message), ...(window ? { window } : {}), ...(windowNotes.length || viewer ? { notes: [...windowNotes, ...(viewer ? [`Viewing session ${viewer} may exist. Inspect it before retrying; no existing conversation was replaced.`] : [])] } : {}) };
|
|
511
|
+
}
|
|
512
|
+
}
|
|
513
|
+
//# sourceMappingURL=terminal-window.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"terminal-window.js","sourceRoot":"","sources":["../src/terminal-window.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@openrig/cli",
|
|
3
|
-
"version": "0.6.
|
|
3
|
+
"version": "0.6.8",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Build your own network of agents from Claude Code, Codex and Pi: persistent teams with roles, shared context and owned work.",
|
|
6
6
|
"keywords": [
|
|
@@ -38,7 +38,7 @@
|
|
|
38
38
|
"scripts"
|
|
39
39
|
],
|
|
40
40
|
"scripts": {
|
|
41
|
-
"build": "tsc &&
|
|
41
|
+
"build": "tsc && node ../../scripts/prepare-workspace-build.mjs cli",
|
|
42
42
|
"postinstall": "node scripts/check-abi.mjs",
|
|
43
43
|
"prepublishOnly": "bash ../../scripts/build-package.sh",
|
|
44
44
|
"test": "vitest run",
|
|
@@ -57,7 +57,7 @@ export const COMMAND_REGISTRY = [
|
|
|
57
57
|
{ name: "launch-host", aliases: [], args: "<host|local>", description: "choose a launch host; no argument restores rig up's selected host", context: "standard", sample: "launch-host local", build: host => ({ type: "launch-host", host }) },
|
|
58
58
|
{ name: "terminals", aliases: [], args: "", description: "browse Saved and Derived terminal views; preview before explicit Open", context: "standard", sample: "terminals", build: () => ({ type: "jump", section: "terminals" }) },
|
|
59
59
|
{ name: "terminal-preview", aliases: [], args: "<view>", description: "passively preview a saved:id or rig:name terminal view", context: "standard", sample: "terminal-preview rig:example", build: view => view ? ({ type: "terminal-preview", view }) : ({ type: "error", message: "terminal-preview needs a view" }) },
|
|
60
|
-
{ name: "terminal", aliases: [], args: "<view>", description: "open a rig:name, pod:rig/pod, mission:id, slice:id or saved:id view
|
|
60
|
+
{ name: "terminal", aliases: [], args: "<view>", description: "open a rig:name, pod:rig/pod, mission:id, slice:id or saved:id view in a new terminal (Herdr or plain tmux)", context: "standard", sample: "terminal rig:example",
|
|
61
61
|
complete: ({ snapshot }) => snapshot.hosts.flatMap((h) => h.rigs.map((r) => `rig:${r.name}`)),
|
|
62
62
|
build: view => view ? ({ type: "act", act: "open-terminal", view }) : ({ type: "error", message: "terminal needs a view, for example rig:<name>" }) },
|
|
63
63
|
{ name: "attention", aliases: ["needs", "feed"], args: "", description: "inspect human requests and outcome/health updates", context: "standard", sample: "attention", build: () => ({ type: "jump", section: "needs" }) },
|
|
@@ -224,7 +224,7 @@ export const COMMAND_REGISTRY = [
|
|
|
224
224
|
build: () => ({ type: "palette-open" }),
|
|
225
225
|
},
|
|
226
226
|
{
|
|
227
|
-
// SCOPES view (d64d2f5c): the
|
|
227
|
+
// SCOPES view (d64d2f5c): the M-key accelerator's command form.
|
|
228
228
|
name: "reqs",
|
|
229
229
|
aliases: [],
|
|
230
230
|
args: "",
|