@openrig/cli 0.6.12 → 0.6.14
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +69 -14
- package/daemon/assets/plugins/openrig-core/.claude-plugin/plugin.json +1 -1
- package/daemon/assets/plugins/openrig-core/.codex-plugin/plugin.json +1 -1
- package/daemon/assets/plugins/openrig-core/README.md +9 -2
- package/daemon/assets/plugins/openrig-core/hooks/scripts/activity-relay.cjs +25 -9
- package/daemon/assets/plugins/openrig-core/hooks/scripts/refocus.cjs +7 -4
- package/daemon/assets/plugins/openrig-core/skills/mission-slice-sop/SKILL.md +5 -0
- package/daemon/assets/plugins/openrig-core/skills/openrig-user/SKILL.md +11 -3
- package/daemon/assets/plugins/openrig-core/skills/refocusing/scripts/trace-to-root.py +73 -48
- package/daemon/assets/skills/rigs/SKILL.md +8 -4
- package/daemon/context-packs/help/manifest.yaml +1 -1
- package/daemon/context-packs/onboarding-width/manifest.yaml +1 -1
- package/daemon/context-packs/onboarding-width/public-what-you-can-do.md +76 -16
- package/daemon/context-packs/reference/getting-started.md +135 -28
- package/daemon/context-packs/reference/manifest.yaml +1 -1
- package/daemon/context-packs/reference/rig-spec.md +5 -5
- package/daemon/context-packs/reference/whats-new.md +65 -167
- package/daemon/context-packs/skills/agent-operated-software/manifest.yaml +1 -1
- package/daemon/context-packs/skills/agent-operated-workflows/manifest.yaml +1 -1
- package/daemon/context-packs/skills/applying-a-permission-policy/manifest.yaml +1 -1
- package/daemon/context-packs/skills/claude-compaction-restore/manifest.yaml +1 -1
- package/daemon/context-packs/skills/core/agent-starters/manifest.yaml +1 -1
- package/daemon/context-packs/skills/core/agent-startup-and-context-ingestion/manifest.yaml +1 -1
- package/daemon/context-packs/skills/core/cross-host-rig-commands/manifest.yaml +1 -1
- package/daemon/context-packs/skills/core/human-in-the-loop/manifest.yaml +1 -1
- package/daemon/context-packs/skills/core/messaging-the-human/manifest.yaml +1 -1
- package/daemon/context-packs/skills/core/openrig-architect/manifest.yaml +1 -1
- package/daemon/context-packs/skills/core/openrig-cmux/manifest.yaml +1 -1
- package/daemon/context-packs/skills/core/openrig-herdr/manifest.yaml +1 -1
- package/daemon/context-packs/skills/core/openrig-skills/manifest.yaml +1 -1
- package/daemon/context-packs/skills/core/openrig-software-factory/manifest.yaml +1 -1
- package/daemon/context-packs/skills/core/openrig-upgrade/manifest.yaml +1 -1
- package/daemon/context-packs/skills/core/rig-bundles-and-shareable-artifacts/manifest.yaml +1 -1
- package/daemon/context-packs/skills/core/rig-lifecycle/manifest.yaml +1 -1
- package/daemon/context-packs/skills/core/session-source-fork/manifest.yaml +1 -1
- package/daemon/context-packs/skills/core/specification-system/manifest.yaml +1 -1
- package/daemon/context-packs/skills/core/topology-mutation-and-seat-management/manifest.yaml +1 -1
- package/daemon/context-packs/skills/core/watchdog/manifest.yaml +1 -1
- package/daemon/context-packs/skills/delegating-work/manifest.yaml +1 -1
- package/daemon/context-packs/skills/forming-an-openrig-mental-model/manifest.yaml +1 -1
- package/daemon/context-packs/skills/loading-addressable-markdown/manifest.yaml +1 -1
- package/daemon/context-packs/skills/mission-slice-sop/SKILL.md +5 -0
- package/daemon/context-packs/skills/mission-slice-sop/manifest.yaml +1 -1
- package/daemon/context-packs/skills/openrig-operating-model/manifest.yaml +1 -1
- package/daemon/context-packs/skills/openrig-user/SKILL.md +11 -3
- package/daemon/context-packs/skills/openrig-user/manifest.yaml +1 -1
- package/daemon/context-packs/skills/orienting-to-an-inherited-seat/manifest.yaml +1 -1
- package/daemon/context-packs/skills/pm/backlog-capture/manifest.yaml +1 -1
- package/daemon/context-packs/skills/pm/context-builder/manifest.yaml +1 -1
- package/daemon/context-packs/skills/pm/exec-summary/manifest.yaml +1 -1
- package/daemon/context-packs/skills/pm/office-hours/manifest.yaml +1 -1
- package/daemon/context-packs/skills/pm/plan-review/manifest.yaml +1 -1
- package/daemon/context-packs/skills/pm/requirements-writer/manifest.yaml +1 -1
- package/daemon/context-packs/skills/pm/ui-mockup/manifest.yaml +1 -1
- package/daemon/context-packs/skills/pods/development-team/manifest.yaml +1 -1
- package/daemon/context-packs/skills/pods/orchestration-team/manifest.yaml +1 -1
- package/daemon/context-packs/skills/pods/oversight-team/manifest.yaml +1 -1
- package/daemon/context-packs/skills/pods/review-team/manifest.yaml +1 -1
- package/daemon/context-packs/skills/process/agent-browser/manifest.yaml +1 -1
- package/daemon/context-packs/skills/process/context-engineering/manifest.yaml +1 -1
- package/daemon/context-packs/skills/process/dogfood/manifest.yaml +1 -1
- package/daemon/context-packs/skills/process/frontend-design/manifest.yaml +1 -1
- package/daemon/context-packs/skills/process/systematic-debugging/manifest.yaml +1 -1
- package/daemon/context-packs/skills/process/test-driven-development/manifest.yaml +1 -1
- package/daemon/context-packs/skills/process/verification-before-completion/manifest.yaml +1 -1
- package/daemon/context-packs/skills/queue-handoff/manifest.yaml +1 -1
- package/daemon/context-packs/skills/refocusing/manifest.yaml +1 -1
- package/daemon/context-packs/skills/refocusing/scripts/trace-to-root.py +73 -48
- package/daemon/context-packs/skills/retiring-and-inheriting-a-seat/manifest.yaml +1 -1
- package/daemon/context-packs/skills/seat-continuity-and-handover/manifest.yaml +1 -1
- package/daemon/context-packs/skills/session-compaction-and-restore/manifest.yaml +1 -1
- package/daemon/context-packs/skills/software-for-agents/manifest.yaml +1 -1
- package/daemon/context-packs/world-example/manifest.yaml +1 -1
- package/daemon/context-packs/world-public/manifest.yaml +1 -1
- package/daemon/dist/adapters/claude-code-adapter.d.ts +9 -1
- package/daemon/dist/adapters/claude-code-adapter.d.ts.map +1 -1
- package/daemon/dist/adapters/claude-code-adapter.js +110 -52
- package/daemon/dist/adapters/claude-code-adapter.js.map +1 -1
- package/daemon/dist/adapters/codex-runtime-adapter.d.ts.map +1 -1
- package/daemon/dist/adapters/codex-runtime-adapter.js +47 -6
- package/daemon/dist/adapters/codex-runtime-adapter.js.map +1 -1
- package/daemon/dist/adapters/pi-resume.d.ts +1 -1
- package/daemon/dist/adapters/pi-resume.d.ts.map +1 -1
- package/daemon/dist/adapters/pi-resume.js +4 -1
- package/daemon/dist/adapters/pi-resume.js.map +1 -1
- package/daemon/dist/adapters/pi-runner-protocol.d.ts +9 -0
- package/daemon/dist/adapters/pi-runner-protocol.d.ts.map +1 -1
- package/daemon/dist/adapters/pi-runner-protocol.js +16 -0
- package/daemon/dist/adapters/pi-runner-protocol.js.map +1 -1
- package/daemon/dist/adapters/pi-runner.d.ts +5 -2
- package/daemon/dist/adapters/pi-runner.d.ts.map +1 -1
- package/daemon/dist/adapters/pi-runner.js +72 -15
- package/daemon/dist/adapters/pi-runner.js.map +1 -1
- package/daemon/dist/adapters/pi-runtime-adapter.d.ts.map +1 -1
- package/daemon/dist/adapters/pi-runtime-adapter.js +2 -0
- package/daemon/dist/adapters/pi-runtime-adapter.js.map +1 -1
- package/daemon/dist/adapters/stub-compaction.d.ts +1 -0
- package/daemon/dist/adapters/stub-compaction.d.ts.map +1 -1
- package/daemon/dist/adapters/stub-compaction.js +2 -0
- package/daemon/dist/adapters/stub-compaction.js.map +1 -1
- package/daemon/dist/adapters/stub-refocus.d.ts +6 -0
- package/daemon/dist/adapters/stub-refocus.d.ts.map +1 -0
- package/daemon/dist/adapters/stub-refocus.js +22 -0
- package/daemon/dist/adapters/stub-refocus.js.map +1 -0
- package/daemon/dist/adapters/stub-runner.d.ts +6 -0
- package/daemon/dist/adapters/stub-runner.d.ts.map +1 -1
- package/daemon/dist/adapters/stub-runner.js +18 -1
- package/daemon/dist/adapters/stub-runner.js.map +1 -1
- package/daemon/dist/adapters/stub-script.d.ts +2 -2
- package/daemon/dist/adapters/stub-script.d.ts.map +1 -1
- package/daemon/dist/adapters/stub-script.js +2 -2
- package/daemon/dist/adapters/stub-script.js.map +1 -1
- package/daemon/dist/adapters/tmux.js +1 -1
- package/daemon/dist/adapters/tmux.js.map +1 -1
- package/daemon/dist/build-info.js +3 -3
- package/daemon/dist/db/all-migrations.d.ts.map +1 -1
- package/daemon/dist/db/all-migrations.js +2 -0
- package/daemon/dist/db/all-migrations.js.map +1 -1
- package/daemon/dist/db/migrations/117_provider_account_readings.d.ts +3 -0
- package/daemon/dist/db/migrations/117_provider_account_readings.d.ts.map +1 -0
- package/daemon/dist/db/migrations/117_provider_account_readings.js +32 -0
- package/daemon/dist/db/migrations/117_provider_account_readings.js.map +1 -0
- package/daemon/dist/domain/claim-service.d.ts +9 -18
- package/daemon/dist/domain/claim-service.d.ts.map +1 -1
- package/daemon/dist/domain/claim-service.js +83 -0
- package/daemon/dist/domain/claim-service.js.map +1 -1
- package/daemon/dist/domain/claude-activity-hooks.d.ts +6 -0
- package/daemon/dist/domain/claude-activity-hooks.d.ts.map +1 -1
- package/daemon/dist/domain/claude-activity-hooks.js +19 -1
- package/daemon/dist/domain/claude-activity-hooks.js.map +1 -1
- package/daemon/dist/domain/claude-compaction-enforcer.d.ts +2 -2
- package/daemon/dist/domain/claude-compaction-enforcer.d.ts.map +1 -1
- package/daemon/dist/domain/claude-compaction-enforcer.js +20 -14
- package/daemon/dist/domain/claude-compaction-enforcer.js.map +1 -1
- package/daemon/dist/domain/claude-core-plugin-env.d.ts +2 -0
- package/daemon/dist/domain/claude-core-plugin-env.d.ts.map +1 -1
- package/daemon/dist/domain/claude-core-plugin-env.js +6 -2
- package/daemon/dist/domain/claude-core-plugin-env.js.map +1 -1
- package/daemon/dist/domain/claude-managed-launch.d.ts +5 -0
- package/daemon/dist/domain/claude-managed-launch.d.ts.map +1 -1
- package/daemon/dist/domain/claude-managed-launch.js +48 -7
- package/daemon/dist/domain/claude-managed-launch.js.map +1 -1
- package/daemon/dist/domain/claude-mcp-menu.d.ts +5 -0
- package/daemon/dist/domain/claude-mcp-menu.d.ts.map +1 -0
- package/daemon/dist/domain/claude-mcp-menu.js +25 -0
- package/daemon/dist/domain/claude-mcp-menu.js.map +1 -0
- package/daemon/dist/domain/fresh-occupant-relation.d.ts +7 -0
- package/daemon/dist/domain/fresh-occupant-relation.d.ts.map +1 -1
- package/daemon/dist/domain/fresh-occupant-relation.js +45 -0
- package/daemon/dist/domain/fresh-occupant-relation.js.map +1 -1
- package/daemon/dist/domain/gateway/slack/channel-recovery.d.ts +14 -2
- package/daemon/dist/domain/gateway/slack/channel-recovery.d.ts.map +1 -1
- package/daemon/dist/domain/gateway/slack/channel-recovery.js +128 -89
- package/daemon/dist/domain/gateway/slack/channel-recovery.js.map +1 -1
- package/daemon/dist/domain/gateway/slack/inbound.d.ts +4 -0
- package/daemon/dist/domain/gateway/slack/inbound.d.ts.map +1 -1
- package/daemon/dist/domain/gateway/slack/inbound.js +5 -3
- package/daemon/dist/domain/gateway/slack/inbound.js.map +1 -1
- package/daemon/dist/domain/gateway/slack/recovery-budget.d.ts +24 -0
- package/daemon/dist/domain/gateway/slack/recovery-budget.d.ts.map +1 -0
- package/daemon/dist/domain/gateway/slack/recovery-budget.js +18 -0
- package/daemon/dist/domain/gateway/slack/recovery-budget.js.map +1 -0
- package/daemon/dist/domain/gateway/slack/slack-recovery.d.ts +104 -0
- package/daemon/dist/domain/gateway/slack/slack-recovery.d.ts.map +1 -0
- package/daemon/dist/domain/gateway/slack/slack-recovery.js +236 -0
- package/daemon/dist/domain/gateway/slack/slack-recovery.js.map +1 -0
- package/daemon/dist/domain/gateway/slack/slack-subsystem.d.ts.map +1 -1
- package/daemon/dist/domain/gateway/slack/slack-subsystem.js +29 -6
- package/daemon/dist/domain/gateway/slack/slack-subsystem.js.map +1 -1
- package/daemon/dist/domain/gateway/slack/state-store.d.ts +34 -0
- package/daemon/dist/domain/gateway/slack/state-store.d.ts.map +1 -1
- package/daemon/dist/domain/gateway/slack/state-store.js +67 -0
- package/daemon/dist/domain/gateway/slack/state-store.js.map +1 -1
- package/daemon/dist/domain/gateway/slack/thread-recovery.d.ts +37 -0
- package/daemon/dist/domain/gateway/slack/thread-recovery.d.ts.map +1 -0
- package/daemon/dist/domain/gateway/slack/thread-recovery.js +173 -0
- package/daemon/dist/domain/gateway/slack/thread-recovery.js.map +1 -0
- package/daemon/dist/domain/gateway/slack/thread-seat-map.d.ts +8 -0
- package/daemon/dist/domain/gateway/slack/thread-seat-map.d.ts.map +1 -1
- package/daemon/dist/domain/gateway/slack/thread-seat-map.js +11 -0
- package/daemon/dist/domain/gateway/slack/thread-seat-map.js.map +1 -1
- package/daemon/dist/domain/model-divergence/current-generation-record.d.ts +6 -1
- package/daemon/dist/domain/model-divergence/current-generation-record.d.ts.map +1 -1
- package/daemon/dist/domain/model-divergence/current-generation-record.js +4 -1
- package/daemon/dist/domain/model-divergence/current-generation-record.js.map +1 -1
- package/daemon/dist/domain/model-divergence/current-model-reader.d.ts +74 -0
- package/daemon/dist/domain/model-divergence/current-model-reader.d.ts.map +1 -0
- package/daemon/dist/domain/model-divergence/current-model-reader.js +246 -0
- package/daemon/dist/domain/model-divergence/current-model-reader.js.map +1 -0
- package/daemon/dist/domain/model-divergence/effective-model-readers.d.ts +18 -0
- package/daemon/dist/domain/model-divergence/effective-model-readers.d.ts.map +1 -1
- package/daemon/dist/domain/model-divergence/effective-model-readers.js +24 -8
- package/daemon/dist/domain/model-divergence/effective-model-readers.js.map +1 -1
- package/daemon/dist/domain/native-process-lineage.d.ts +8 -1
- package/daemon/dist/domain/native-process-lineage.d.ts.map +1 -1
- package/daemon/dist/domain/native-process-lineage.js +40 -26
- package/daemon/dist/domain/native-process-lineage.js.map +1 -1
- package/daemon/dist/domain/native-resume-probe.d.ts.map +1 -1
- package/daemon/dist/domain/native-resume-probe.js +34 -8
- package/daemon/dist/domain/native-resume-probe.js.map +1 -1
- package/daemon/dist/domain/node-inventory.d.ts +1 -1
- package/daemon/dist/domain/node-inventory.d.ts.map +1 -1
- package/daemon/dist/domain/node-inventory.js +84 -18
- package/daemon/dist/domain/node-inventory.js.map +1 -1
- package/daemon/dist/domain/process-census.d.ts +1 -1
- package/daemon/dist/domain/process-census.d.ts.map +1 -1
- package/daemon/dist/domain/process-table.d.ts +26 -0
- package/daemon/dist/domain/process-table.d.ts.map +1 -0
- package/daemon/dist/domain/process-table.js +185 -0
- package/daemon/dist/domain/process-table.js.map +1 -0
- package/daemon/dist/domain/profile-resolver.d.ts +8 -0
- package/daemon/dist/domain/profile-resolver.d.ts.map +1 -1
- package/daemon/dist/domain/profile-resolver.js +11 -0
- package/daemon/dist/domain/profile-resolver.js.map +1 -1
- package/daemon/dist/domain/projection-planner.js +1 -1
- package/daemon/dist/domain/projection-planner.js.map +1 -1
- package/daemon/dist/domain/provider/claude-usage-windows.d.ts +3 -1
- package/daemon/dist/domain/provider/claude-usage-windows.d.ts.map +1 -1
- package/daemon/dist/domain/provider/claude-usage-windows.js +48 -3
- package/daemon/dist/domain/provider/claude-usage-windows.js.map +1 -1
- package/daemon/dist/domain/provider/codex-usage-reader.d.ts +4 -1
- package/daemon/dist/domain/provider/codex-usage-reader.d.ts.map +1 -1
- package/daemon/dist/domain/provider/codex-usage-reader.js +3 -0
- package/daemon/dist/domain/provider/codex-usage-reader.js.map +1 -1
- package/daemon/dist/domain/provider/codex-usage-windows.d.ts +3 -1
- package/daemon/dist/domain/provider/codex-usage-windows.d.ts.map +1 -1
- package/daemon/dist/domain/provider/codex-usage-windows.js +1 -0
- package/daemon/dist/domain/provider/codex-usage-windows.js.map +1 -1
- package/daemon/dist/domain/provider/provider-account-readings.d.ts +42 -0
- package/daemon/dist/domain/provider/provider-account-readings.d.ts.map +1 -0
- package/daemon/dist/domain/provider/provider-account-readings.js +132 -0
- package/daemon/dist/domain/provider/provider-account-readings.js.map +1 -0
- package/daemon/dist/domain/provider/provider-types.d.ts +29 -0
- package/daemon/dist/domain/provider/provider-types.d.ts.map +1 -1
- package/daemon/dist/domain/provider/usage-across-hosts.d.ts.map +1 -1
- package/daemon/dist/domain/provider/usage-across-hosts.js +6 -0
- package/daemon/dist/domain/provider/usage-across-hosts.js.map +1 -1
- package/daemon/dist/domain/provider/usage-windows.d.ts +25 -0
- package/daemon/dist/domain/provider/usage-windows.d.ts.map +1 -1
- package/daemon/dist/domain/provider/usage-windows.js +100 -4
- package/daemon/dist/domain/provider/usage-windows.js.map +1 -1
- package/daemon/dist/domain/queue-repository.d.ts +23 -0
- package/daemon/dist/domain/queue-repository.d.ts.map +1 -1
- package/daemon/dist/domain/queue-repository.js +59 -1
- package/daemon/dist/domain/queue-repository.js.map +1 -1
- package/daemon/dist/domain/queue-stuck-sweep.d.ts.map +1 -1
- package/daemon/dist/domain/queue-stuck-sweep.js +47 -4
- package/daemon/dist/domain/queue-stuck-sweep.js.map +1 -1
- package/daemon/dist/domain/restore-check-service.d.ts +10 -0
- package/daemon/dist/domain/restore-check-service.d.ts.map +1 -1
- package/daemon/dist/domain/restore-check-service.js +73 -10
- package/daemon/dist/domain/restore-check-service.js.map +1 -1
- package/daemon/dist/domain/restore-guidance.d.ts +6 -0
- package/daemon/dist/domain/restore-guidance.d.ts.map +1 -1
- package/daemon/dist/domain/restore-guidance.js +21 -5
- package/daemon/dist/domain/restore-guidance.js.map +1 -1
- package/daemon/dist/domain/restore-orchestrator.js +1 -1
- package/daemon/dist/domain/restore-orchestrator.js.map +1 -1
- package/daemon/dist/domain/resume-metadata-refresher.d.ts.map +1 -1
- package/daemon/dist/domain/resume-metadata-refresher.js +6 -29
- package/daemon/dist/domain/resume-metadata-refresher.js.map +1 -1
- package/daemon/dist/domain/rig-repository.d.ts +3 -0
- package/daemon/dist/domain/rig-repository.d.ts.map +1 -1
- package/daemon/dist/domain/rig-repository.js +6 -0
- package/daemon/dist/domain/rig-repository.js.map +1 -1
- package/daemon/dist/domain/rigspec-instantiator.d.ts.map +1 -1
- package/daemon/dist/domain/rigspec-instantiator.js +4 -2
- package/daemon/dist/domain/rigspec-instantiator.js.map +1 -1
- package/daemon/dist/domain/rigspec-preflight.d.ts +4 -0
- package/daemon/dist/domain/rigspec-preflight.d.ts.map +1 -1
- package/daemon/dist/domain/rigspec-preflight.js +12 -2
- package/daemon/dist/domain/rigspec-preflight.js.map +1 -1
- package/daemon/dist/domain/rigspec-schema.d.ts.map +1 -1
- package/daemon/dist/domain/rigspec-schema.js +11 -0
- package/daemon/dist/domain/rigspec-schema.js.map +1 -1
- package/daemon/dist/domain/runtime-adapter.d.ts +13 -0
- package/daemon/dist/domain/runtime-adapter.d.ts.map +1 -1
- package/daemon/dist/domain/runtime-adapter.js.map +1 -1
- package/daemon/dist/domain/seat-attention-reconciler.d.ts.map +1 -1
- package/daemon/dist/domain/seat-attention-reconciler.js +15 -1
- package/daemon/dist/domain/seat-attention-reconciler.js.map +1 -1
- package/daemon/dist/domain/seat-cwd-preparation.d.ts +22 -0
- package/daemon/dist/domain/seat-cwd-preparation.d.ts.map +1 -0
- package/daemon/dist/domain/seat-cwd-preparation.js +107 -0
- package/daemon/dist/domain/seat-cwd-preparation.js.map +1 -0
- package/daemon/dist/domain/seat-effort.d.ts +4 -3
- package/daemon/dist/domain/seat-effort.d.ts.map +1 -1
- package/daemon/dist/domain/seat-effort.js +21 -3
- package/daemon/dist/domain/seat-effort.js.map +1 -1
- package/daemon/dist/domain/seat-lifecycle-service.d.ts +36 -2
- package/daemon/dist/domain/seat-lifecycle-service.d.ts.map +1 -1
- package/daemon/dist/domain/seat-lifecycle-service.js +206 -15
- package/daemon/dist/domain/seat-lifecycle-service.js.map +1 -1
- package/daemon/dist/domain/seat-restart-in-place.d.ts +14 -0
- package/daemon/dist/domain/seat-restart-in-place.d.ts.map +1 -1
- package/daemon/dist/domain/seat-restart-in-place.js +59 -3
- package/daemon/dist/domain/seat-restart-in-place.js.map +1 -1
- package/daemon/dist/domain/seat-status-service.d.ts +2 -0
- package/daemon/dist/domain/seat-status-service.d.ts.map +1 -1
- package/daemon/dist/domain/seat-status-service.js +1 -0
- package/daemon/dist/domain/seat-status-service.js.map +1 -1
- package/daemon/dist/domain/seat-structural-activity-service.d.ts +7 -1
- package/daemon/dist/domain/seat-structural-activity-service.d.ts.map +1 -1
- package/daemon/dist/domain/seat-structural-activity-service.js +9 -3
- package/daemon/dist/domain/seat-structural-activity-service.js.map +1 -1
- package/daemon/dist/domain/session-name.d.ts +8 -0
- package/daemon/dist/domain/session-name.d.ts.map +1 -1
- package/daemon/dist/domain/session-name.js +12 -0
- package/daemon/dist/domain/session-name.js.map +1 -1
- package/daemon/dist/domain/session-transport.d.ts +78 -3
- package/daemon/dist/domain/session-transport.d.ts.map +1 -1
- package/daemon/dist/domain/session-transport.js +306 -15
- package/daemon/dist/domain/session-transport.js.map +1 -1
- package/daemon/dist/domain/successor-session-launcher.js +1 -1
- package/daemon/dist/domain/successor-session-launcher.js.map +1 -1
- package/daemon/dist/domain/topology-converge.d.ts +1 -0
- package/daemon/dist/domain/topology-converge.d.ts.map +1 -1
- package/daemon/dist/domain/topology-converge.js +1 -0
- package/daemon/dist/domain/topology-converge.js.map +1 -1
- package/daemon/dist/domain/types.d.ts +14 -0
- package/daemon/dist/domain/types.d.ts.map +1 -1
- package/daemon/dist/domain/types.js.map +1 -1
- package/daemon/dist/domain/user-settings/settings-store.d.ts +1 -1
- package/daemon/dist/domain/user-settings/settings-store.d.ts.map +1 -1
- package/daemon/dist/domain/user-settings/settings-store.js +4 -0
- package/daemon/dist/domain/user-settings/settings-store.js.map +1 -1
- package/daemon/dist/domain/wake-resolve-service.d.ts +1 -0
- package/daemon/dist/domain/wake-resolve-service.d.ts.map +1 -1
- package/daemon/dist/domain/wake-resolve-service.js +10 -0
- package/daemon/dist/domain/wake-resolve-service.js.map +1 -1
- package/daemon/dist/domain/wake-resolver.d.ts.map +1 -1
- package/daemon/dist/domain/wake-resolver.js +7 -0
- package/daemon/dist/domain/wake-resolver.js.map +1 -1
- package/daemon/dist/domain/watchdog-delivery.d.ts +29 -0
- package/daemon/dist/domain/watchdog-delivery.d.ts.map +1 -0
- package/daemon/dist/domain/watchdog-delivery.js +113 -0
- package/daemon/dist/domain/watchdog-delivery.js.map +1 -0
- package/daemon/dist/domain/watchdog-policy-engine.d.ts +60 -1
- package/daemon/dist/domain/watchdog-policy-engine.d.ts.map +1 -1
- package/daemon/dist/domain/watchdog-policy-engine.js +154 -28
- package/daemon/dist/domain/watchdog-policy-engine.js.map +1 -1
- package/daemon/dist/domain/watchdog-scheduler.d.ts.map +1 -1
- package/daemon/dist/domain/watchdog-scheduler.js +6 -1
- package/daemon/dist/domain/watchdog-scheduler.js.map +1 -1
- package/daemon/dist/domain/workflow-instance-store.d.ts.map +1 -1
- package/daemon/dist/domain/workflow-instance-store.js +6 -2
- package/daemon/dist/domain/workflow-instance-store.js.map +1 -1
- package/daemon/dist/routes/attention.d.ts.map +1 -1
- package/daemon/dist/routes/attention.js +41 -1
- package/daemon/dist/routes/attention.js.map +1 -1
- package/daemon/dist/routes/compaction.js +1 -1
- package/daemon/dist/routes/compaction.js.map +1 -1
- package/daemon/dist/routes/queue.d.ts.map +1 -1
- package/daemon/dist/routes/queue.js +3 -1
- package/daemon/dist/routes/queue.js.map +1 -1
- package/daemon/dist/routes/restore-check.d.ts.map +1 -1
- package/daemon/dist/routes/restore-check.js +19 -1
- package/daemon/dist/routes/restore-check.js.map +1 -1
- package/daemon/dist/routes/seat.d.ts.map +1 -1
- package/daemon/dist/routes/seat.js +15 -2
- package/daemon/dist/routes/seat.js.map +1 -1
- package/daemon/dist/routes/sessions.d.ts.map +1 -1
- package/daemon/dist/routes/sessions.js +42 -1
- package/daemon/dist/routes/sessions.js.map +1 -1
- package/daemon/dist/routes/transport.d.ts.map +1 -1
- package/daemon/dist/routes/transport.js +13 -2
- package/daemon/dist/routes/transport.js.map +1 -1
- package/daemon/dist/server.d.ts +1 -0
- package/daemon/dist/server.d.ts.map +1 -1
- package/daemon/dist/server.js +7 -4
- package/daemon/dist/server.js.map +1 -1
- package/daemon/dist/startup.d.ts.map +1 -1
- package/daemon/dist/startup.js +41 -118
- package/daemon/dist/startup.js.map +1 -1
- package/daemon/docs/reference/agent-spec.md +1 -1
- package/daemon/docs/reference/agent-startup-guide.md +84 -0
- package/daemon/docs/reference/getting-started.md +135 -28
- package/daemon/docs/reference/publishing-a-rig-bundle.md +5 -2
- package/daemon/docs/reference/quickstart.md +187 -0
- package/daemon/docs/reference/refocus-channel.md +11 -1
- package/daemon/docs/reference/rig-spec.md +5 -5
- package/daemon/docs/reference/rosters.md +29 -2
- package/daemon/docs/reference/slack-app-setup.md +47 -17
- package/daemon/docs/reference/whats-new.md +65 -167
- package/daemon/specs/agents/apps/vault-specialist/agent.yaml +1 -0
- package/daemon/specs/agents/conveyor/builder/agent.yaml +1 -0
- package/daemon/specs/agents/conveyor/lead/agent.yaml +1 -0
- package/daemon/specs/agents/conveyor/planner/agent.yaml +1 -0
- package/daemon/specs/agents/conveyor/reviewer/agent.yaml +1 -0
- package/daemon/specs/agents/design/product-designer/agent.yaml +1 -0
- package/daemon/specs/agents/development/implementer/agent.yaml +1 -0
- package/daemon/specs/agents/development/qa/agent.yaml +1 -0
- package/daemon/specs/agents/factory-rsi/dogfood/agent.yaml +1 -0
- package/daemon/specs/agents/factory-rsi/release-manager/agent.yaml +1 -0
- package/daemon/specs/agents/orchestration/orchestrator/agent.yaml +1 -0
- package/daemon/specs/agents/product-management/pm/agent.yaml +1 -0
- package/daemon/specs/agents/research/analyst/agent.yaml +1 -0
- package/daemon/specs/agents/research/synthesizer/agent.yaml +1 -0
- package/daemon/specs/agents/review/independent-reviewer/agent.yaml +1 -0
- package/dist/build-info.js +3 -3
- package/dist/client.d.ts +7 -1
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +28 -0
- package/dist/client.js.map +1 -1
- package/dist/commands/ask.d.ts.map +1 -1
- package/dist/commands/ask.js +13 -3
- package/dist/commands/ask.js.map +1 -1
- package/dist/commands/capture.d.ts.map +1 -1
- package/dist/commands/capture.js +14 -0
- package/dist/commands/capture.js.map +1 -1
- package/dist/commands/chatroom.d.ts.map +1 -1
- package/dist/commands/chatroom.js +1 -0
- package/dist/commands/chatroom.js.map +1 -1
- package/dist/commands/compact.d.ts.map +1 -1
- package/dist/commands/compact.js +5 -4
- package/dist/commands/compact.js.map +1 -1
- package/dist/commands/config.d.ts.map +1 -1
- package/dist/commands/config.js +4 -2
- package/dist/commands/config.js.map +1 -1
- package/dist/commands/doctor.d.ts +3 -0
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +47 -23
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/grow.d.ts.map +1 -1
- package/dist/commands/grow.js +24 -7
- package/dist/commands/grow.js.map +1 -1
- package/dist/commands/provider.d.ts.map +1 -1
- package/dist/commands/provider.js +43 -7
- package/dist/commands/provider.js.map +1 -1
- package/dist/commands/ps.d.ts +2 -0
- package/dist/commands/ps.d.ts.map +1 -1
- package/dist/commands/ps.js +12 -1
- package/dist/commands/ps.js.map +1 -1
- package/dist/commands/reconcile-session.d.ts.map +1 -1
- package/dist/commands/reconcile-session.js +25 -4
- package/dist/commands/reconcile-session.js.map +1 -1
- package/dist/commands/remove.d.ts.map +1 -1
- package/dist/commands/remove.js +20 -1
- package/dist/commands/remove.js.map +1 -1
- package/dist/commands/roster.d.ts +2 -1
- package/dist/commands/roster.d.ts.map +1 -1
- package/dist/commands/roster.js +10 -5
- package/dist/commands/roster.js.map +1 -1
- package/dist/commands/scope.js +1 -1
- package/dist/commands/scope.js.map +1 -1
- package/dist/commands/seat.d.ts.map +1 -1
- package/dist/commands/seat.js +75 -8
- package/dist/commands/seat.js.map +1 -1
- package/dist/commands/slack.d.ts.map +1 -1
- package/dist/commands/slack.js +14 -1
- package/dist/commands/slack.js.map +1 -1
- package/dist/commands/ui.d.ts.map +1 -1
- package/dist/commands/ui.js +8 -1
- package/dist/commands/ui.js.map +1 -1
- package/dist/commands/usage.d.ts.map +1 -1
- package/dist/commands/usage.js +4 -3
- package/dist/commands/usage.js.map +1 -1
- package/dist/config-store.d.ts +2 -1
- package/dist/config-store.d.ts.map +1 -1
- package/dist/config-store.js +5 -0
- package/dist/config-store.js.map +1 -1
- package/dist/daemon-lifecycle.d.ts.map +1 -1
- package/dist/daemon-lifecycle.js +11 -3
- package/dist/daemon-lifecycle.js.map +1 -1
- package/dist/front-door.d.ts.map +1 -1
- package/dist/front-door.js +3 -1
- package/dist/front-door.js.map +1 -1
- package/dist/lib/model-observation.d.ts +13 -0
- package/dist/lib/model-observation.d.ts.map +1 -0
- package/dist/lib/model-observation.js +25 -0
- package/dist/lib/model-observation.js.map +1 -0
- package/dist/local-daemon-owner.d.ts +28 -0
- package/dist/local-daemon-owner.d.ts.map +1 -0
- package/dist/local-daemon-owner.js +98 -0
- package/dist/local-daemon-owner.js.map +1 -0
- package/dist/mcp-server.d.ts.map +1 -1
- package/dist/mcp-server.js +1 -0
- package/dist/mcp-server.js.map +1 -1
- package/package.json +1 -1
- package/tui/dist/attention/attention-model.js +6 -5
- package/tui/dist/attention/attention-model.js.map +1 -1
- package/tui/dist/attention/source-continuity.d.ts.map +1 -1
- package/tui/dist/attention/source-continuity.js +2 -0
- package/tui/dist/attention/source-continuity.js.map +1 -1
- package/tui/dist/terminals/open-window.d.ts +11 -1
- package/tui/dist/terminals/open-window.d.ts.map +1 -1
- package/tui/dist/terminals/open-window.js +47 -2
- package/tui/dist/terminals/open-window.js.map +1 -1
- package/tui/dist/usage/usage-model.d.ts +2 -0
- package/tui/dist/usage/usage-model.d.ts.map +1 -1
- package/tui/dist/usage/usage-model.js +38 -3
- package/tui/dist/usage/usage-model.js.map +1 -1
- package/ui/dist/assets/{index-Cfbtfd9G.js → index-CVgod3Pm.js} +1 -1
- package/ui/dist/index.html +1 -1
package/README.md
CHANGED
|
@@ -8,28 +8,74 @@ OpenRig is open-source software for building and running your own network of age
|
|
|
8
8
|
|
|
9
9
|
It's the open-source system behind my AI civilization experiments.
|
|
10
10
|
|
|
11
|
-
**Guide:** [Getting started](docs/reference/
|
|
11
|
+
**Guide:** [Getting started](docs/reference/quickstart.md) · **Stuck?** [Help](docs/reference/help.md) · **Questions:** [Q&A](https://github.com/mvschwarz/openrig/discussions/92) · **Updates and demos:** [@_feralmachine on X](https://x.com/_feralmachine)
|
|
12
12
|
|
|
13
13
|
## See it running
|
|
14
14
|
|
|
15
15
|

|
|
16
16
|
|
|
17
|
-
**Start here:** [the guided first-use path](docs/reference/
|
|
17
|
+
**Start here:** [the guided first-use path](docs/reference/quickstart.md): install, talk to the kernel operator, then choose a team for your first useful change.
|
|
18
18
|
|
|
19
19
|
Not setting this up today? Get the next walkthrough and occasional OpenRig updates → https://openrig.dev/follow
|
|
20
20
|
|
|
21
21
|
## Install and first run
|
|
22
22
|
|
|
23
|
-
|
|
23
|
+
**Let your coding agent set it up.** First check that `node --version` shows 22 or 24: the command below needs
|
|
24
|
+
Node.js and the `npx` that comes with it. Then, in your project folder, add OpenRig's `rigs` skill to the agent you
|
|
25
|
+
use:
|
|
24
26
|
|
|
25
|
-
|
|
27
|
+
```sh
|
|
28
|
+
# Claude Code
|
|
29
|
+
npx skills add https://github.com/mvschwarz/openrig/tree/v0.6.14/skills/rigs --skill rigs --agent claude-code
|
|
30
|
+
# Codex
|
|
31
|
+
npx skills add https://github.com/mvschwarz/openrig/tree/v0.6.14/skills/rigs --skill rigs --agent codex
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
Then type `/rigs` in Claude Code, or `$rigs` in Codex, and say what you want built. The skill has your agent tell
|
|
35
|
+
you what it will run and change before it does, install OpenRig, open the OpenRig view and pass your goal to
|
|
36
|
+
OpenRig's operator.
|
|
37
|
+
|
|
38
|
+
You need Node.js 22 or 24 (22 on Apple silicon), tmux, macOS or Linux (WSL2 on Windows), and Claude Code or Codex
|
|
39
|
+
signed in. One provider is enough to start.
|
|
40
|
+
|
|
41
|
+
Already have OpenRig? Use the tag that matches `rig --version`, or upgrade first.
|
|
42
|
+
|
|
43
|
+
Prefer to type the commands yourself? [Install it yourself ↓](#install-it-yourself)
|
|
44
|
+
|
|
45
|
+
Requires Node.js 22 or 24 and tmux, on macOS or Linux, and one working Claude Code or Codex account: one is enough, since the kernel operator adapts the shipped `starter` team to whichever you have. On Linux, the distribution's own Node.js can be older (Ubuntu 24.04's is 18); install a supported version with [nvm](https://github.com/nvm-sh/nvm) (`nvm install 22`) or NodeSource. On a Mac with Apple silicon, use Node.js 22 ([compatibility history](docs/releases/v0.5.15.md#known-compatibility-limitation)). On a Mac where you aren't an administrator, or where Homebrew belongs to another account (its `brew install` is refused), install Node.js in your own home folder with [nvm](https://github.com/nvm-sh/nvm): run `touch ~/.zshrc` (a new Mac account has none, and nvm's installer only adds itself to a profile file that already exists), then the install command on nvm's page, open a new terminal, and run `nvm install 22`. That needs no administrator password, and `npm install -g` then installs into your nvm folder. On Windows, use WSL2, the Windows route OpenRig supports; native Windows isn't supported. OpenRig's automated tests don't run on WSL2 yet; see [one user's working setup](docs/reference/getting-started.md#wsl2-a-reported-working-setup).
|
|
46
|
+
|
|
47
|
+
> **What OpenRig changes on your machine**
|
|
48
|
+
> - **Install:** `@openrig/cli` goes in globally with npm.
|
|
49
|
+
> - **Setup:** `rig setup` adds an OpenRig block to `~/.tmux.conf`. It can install tmux (with Homebrew on macOS), and
|
|
50
|
+
> Herdr unless you pass `--no-herdr`. Plain `rig setup`, which is what the one-command install runs, checks both
|
|
51
|
+
> Claude Code and Codex and may install a missing one; `rig setup --providers claude` (or `codex`) limits it to
|
|
52
|
+
> yours.
|
|
53
|
+
> - **Starting OpenRig, for the coding agent you use** (paths are the usual defaults):
|
|
54
|
+
> - Codex: hooks and trust in `~/.codex/config.toml`.
|
|
55
|
+
> - Claude Code: workspace trust in `~/.claude.json`, and activity hooks in the project's
|
|
56
|
+
> `.claude/settings.local.json`, plus a status line unless you already have your own.
|
|
57
|
+
> - Discovery skills go in `~/.claude/skills` and `~/.agents/skills`.
|
|
58
|
+
> - **Starting a team in your project:** adds managed guidance to `AGENTS.md` or `CLAUDE.md`, plus the team's skills
|
|
59
|
+
> and plugins.
|
|
60
|
+
> - **Permissions:** by default, OpenRig's own kernel gets broader permissions than a project team gets by default.
|
|
61
|
+
> On Codex that's full access with no approval prompts (`-s danger-full-access -a never`). On Claude Code, its file
|
|
62
|
+
> tools, web fetches and operational commands, including reads under your home folder, run without asking. A
|
|
63
|
+
> permission policy, per-agent choice or Codex profile changes that. What your team can do depends on the team you
|
|
64
|
+
> choose and your settings; `workshop`, for example, ships with broad access.
|
|
65
|
+
> - **Backups:** OpenRig doesn't guarantee it can preserve or roll back these files, so back them up first.
|
|
66
|
+
>
|
|
67
|
+
> [Everything OpenRig writes, and why →](https://github.com/mvschwarz/openrig#what-openrig-changes-on-your-machine)
|
|
68
|
+
|
|
69
|
+
### Install it yourself
|
|
70
|
+
|
|
71
|
+
This runs OpenRig's install script from the `v0.6.14` release. It checks Node.js and npm, installs the latest published `@openrig/cli` with `npm install -g`, runs the Node.js and SQLite check, then runs `rig setup --dry-run` and `rig setup`. The first line prints that plan and changes nothing:
|
|
26
72
|
|
|
27
73
|
```bash
|
|
28
|
-
curl -fsSL https://raw.githubusercontent.com/mvschwarz/openrig/v0.6.
|
|
29
|
-
curl -fsSL https://raw.githubusercontent.com/mvschwarz/openrig/v0.6.
|
|
74
|
+
curl -fsSL https://raw.githubusercontent.com/mvschwarz/openrig/v0.6.14/scripts/install.sh | sh -s -- --dry-run
|
|
75
|
+
curl -fsSL https://raw.githubusercontent.com/mvschwarz/openrig/v0.6.14/scripts/install.sh | sh
|
|
30
76
|
```
|
|
31
77
|
|
|
32
|
-
If a provider isn't signed in yet, the
|
|
78
|
+
If `rig setup` doesn't finish ready, for example because a provider isn't signed in yet, the script ends with `INSTALLED, SETUP NOT COMPLETE`: the CLI is installed, and `rig setup` lists what's left under "Some steps need attention". If the only items left are provider sign-ins, sign in to each selected provider as below and continue; run `rig setup` again rather than reinstalling the CLI.
|
|
33
79
|
|
|
34
80
|
**Or step by step:**
|
|
35
81
|
|
|
@@ -161,7 +207,7 @@ using a published package, since repository guidance can be ahead of npm.
|
|
|
161
207
|
| --- | --- |
|
|
162
208
|
| **npm installation** | Installs the CLI (`rig` and `openrig-tui`), bundled components and dependencies under your npm prefix (with Bun, under Bun's global directory). OpenRig's postinstall checks the Node.js version and that the SQLite module loads; Bun may block this script. It does not run daemon or provider setup. |
|
|
163
209
|
| **`rig setup`** | Attempts missing tools and writes an OpenRig block in `~/.tmux.conf` for mouse support and scrollback. Installs herdr by default on macOS and Linux unless declined with `--no-herdr`; an unavailable herdr install is a warning. On macOS the installing agent offers Ghostty, and `--ghostty` attempts it after acceptance. Existing cmux settings are left unchanged. `--full` adds workstation tools. `--dry-run` shows setup's plan without applying it. |
|
|
164
|
-
| **Daemon startup** | Creates/updates instance state under `OPENRIG_HOME` (normally `~/.openrig`), including its database and managed plugin resources. Seeds the `openrig-skills` discovery skill, the `refocusing` skill and the person-facing `rigs` skill in `~/.claude/skills` and `~/.agents/skills`, subject to existing version ownership.
|
|
210
|
+
| **Daemon startup** | Creates/updates instance state under `OPENRIG_HOME` (normally `~/.openrig`), including its database and managed plugin resources. Seeds the `openrig-skills` discovery skill, the `refocusing` skill and the person-facing `rigs` skill in `~/.claude/skills` and `~/.agents/skills`, subject to existing version ownership. When a Codex seat is already recorded and `runtime.codex.hooks_enabled` is enabled (the default), ensures its hook configuration and trust records as described below. With no recorded Codex seat, enabled hooks wait for its first launch; disabled hooks still remove a stale OpenRig-managed hook block, if present. |
|
|
165
211
|
| **Rig/seat launch and attachment** | Creates tmux sessions, supplies seat identity and daemon connection environment, and projects selected guidance, skills, plugins and runtime resources into the workspace. Managed startup pre-trusts the workspace. Claude context collection can also be provisioned for attached sessions and refreshed during monitoring. In a Git repository, newly created files under `.codex/plugins/shared:openrig-core/` (or the unqualified `.codex/plugins/openrig-core/`) are added to the repository's Git `info/exclude` inside an `# BEGIN OpenRig generated files` block; new `AGENTS.md`, `CLAUDE.md` and `CLAUDE.local.md` files stay visible with a warning. |
|
|
166
212
|
| **Bundle install** (`rig bundle install`, or `rig up` with a `.rigbundle` or GitHub link) | Writes the bundle's files into the install target: `--target`, or the current directory for `rig up` and for a GitHub link. `rig bundle install` with a local archive needs `--target`. Routes its declared skills, plugins and context packs into your libraries. A GitHub link's archive is kept under `OPENRIG_HOME/bundle-imports/`, and installs are recorded in `OPENRIG_HOME/bundle-audit.jsonl`. A bundle that carries a project creates it under `workspace.projects_root` and records it, with the rig's association, in the workspace catalog. |
|
|
167
213
|
| **Explicit permission configuration** | The built-in bootstrap does **not** add `rig` command allow rules to your settings files; a team seat with no permission policy, per-seat choice or (for Codex) named profile gets the per-launch [team default](docs/reference/rig-spec.md#team-launch-defaults) instead. Agent-guided setup recommends keeping it and requires your actual answer before the agent [adds remembered rules at your chosen scope](docs/reference/getting-started.md#have-your-agent-configure-permissions). No/no answer keeps the team default and preserves settings; existing choices and stricter rules remain relevant. Broader access is separate. |
|
|
@@ -175,7 +221,9 @@ user's home; changing `OPENRIG_HOME` alone does not isolate provider configurati
|
|
|
175
221
|
writes `HOME/.claude.json`, and also `<CLAUDE_CONFIG_DIR>/.claude.json` when the
|
|
176
222
|
daemon has that variable set. In the workspace, `.claude/settings.local.json` receives
|
|
177
223
|
the context collector's `statusLine` command and selected activity hooks;
|
|
178
|
-
|
|
224
|
+
a user's own status-line command is preserved, so it can prevent collector
|
|
225
|
+
installation. Selected settings resources can still replace overlapping keys.
|
|
226
|
+
The collector script lives under `.openrig/`, and the activity-hook relay under
|
|
179
227
|
the instance's `state/claude-activity-hooks/`. Selected settings/MCP resources can also
|
|
180
228
|
change that settings file and `.mcp.json`. The shared settings resource sets
|
|
181
229
|
`permissions.defaultMode` to `acceptEdits` and enables Exa/Context7 MCP entries;
|
|
@@ -185,8 +233,10 @@ user's home; changing `OPENRIG_HOME` alone does not isolate provider configurati
|
|
|
185
233
|
To keep your own status line alongside the collector, see
|
|
186
234
|
[Custom Claude status line](docs/reference/claude-status-line.md).
|
|
187
235
|
- **Codex:** writes the daemon's `CODEX_HOME/config.toml` (normally
|
|
188
|
-
`~/.codex/config.toml`).
|
|
189
|
-
commands and
|
|
236
|
+
`~/.codex/config.toml`). With hooks enabled, daemon startup ensures the OpenRig
|
|
237
|
+
activity relay commands and their trust hashes when a Codex seat is already
|
|
238
|
+
recorded; otherwise the first Codex launch does so. With hooks disabled, startup
|
|
239
|
+
can remove a stale OpenRig-managed hook block even without a Codex seat. Seat startup adds
|
|
190
240
|
`trust_level = "trusted"` for the workspace; selected config resources can
|
|
191
241
|
add MCP settings. Managed launches pass `-c check_for_update_on_startup=false`,
|
|
192
242
|
which writes no config; a recognized update notice that still appears can be
|
|
@@ -252,9 +302,12 @@ separates the desired selection from the last launch arguments; neither proves
|
|
|
252
302
|
native enforcement. See the [permission guide](docs/reference/getting-started.md#per-seat-permission-mode).
|
|
253
303
|
|
|
254
304
|
Managed hook blocks target OpenRig's entries and retain unrelated hooks, but
|
|
255
|
-
trust entries
|
|
256
|
-
|
|
257
|
-
this is not a
|
|
305
|
+
trust entries and selected resource keys can be replaced. Claude's collector,
|
|
306
|
+
activity-hook and JSON resource writers leave unreadable or malformed settings
|
|
307
|
+
untouched; this is not a product-wide preservation guarantee. Codex's workspace
|
|
308
|
+
trust writer can treat an unreadable `config.toml` as empty and write a new trust
|
|
309
|
+
configuration. Read-modify-write operations can also race other writers; there
|
|
310
|
+
is no complete preservation or rollback guarantee. Back up relevant
|
|
258
311
|
files before first use. Daemon/bootstrap writes are automatic and do not each
|
|
259
312
|
have an interactive preview; `rig setup --dry-run` does not preview every later
|
|
260
313
|
startup effect.
|
|
@@ -335,6 +388,8 @@ For cmux, use `--provider cmux`. In the TUI, a rig's detail view has an `Open te
|
|
|
335
388
|
|
|
336
389
|
## Key Concepts
|
|
337
390
|
|
|
391
|
+
The first words you meet, in plain language: [What these words mean](docs/reference/quickstart.md#what-these-words-mean).
|
|
392
|
+
|
|
338
393
|
- **RigSpec**: Declarative multi-agent harness definition in YAML. Pods, members, edges, continuity policies, culture file.
|
|
339
394
|
- **AgentSpec**: Reusable agent blueprint with skills, guidance, hooks, profiles, and startup contracts.
|
|
340
395
|
- **Seat**: A stable role and address in a rig, such as `dev-build@starter`. The conversation occupying it can change while its identity and authored context remain.
|
|
@@ -26,8 +26,9 @@ This plugin ships dual-manifest packaging — both `.claude-plugin/` and `.codex
|
|
|
26
26
|
A seat that has OpenRig's activity relay in its own `settings.local.json` (the `claude-activity-hooks` runtime resource)
|
|
27
27
|
already reports activity from there, so the plugin's `activity-relay.cjs` (which the manifest starts with `--from-plugin`)
|
|
28
28
|
exits for an event the seat's settings register it for. It does so only when the entry is exactly the one OpenRig writes
|
|
29
|
-
(`node`
|
|
30
|
-
|
|
29
|
+
(legacy `node` or a quoted absolute Node executable, then one quoted path to
|
|
30
|
+
`state/claude-activity-hooks/activity-relay.cjs`), the interpreter is executable, and the script at that path is this same
|
|
31
|
+
script. A missing interpreter/script, a different script, or a wrapper around it never silences the plugin. A seat without
|
|
31
32
|
that resource, and a plugin installed outside OpenRig, report through the plugin's relay, so each event is reported once.
|
|
32
33
|
A relay entry written by an older install (a different path or quoting) doesn't match, so until the seat is relaunched and
|
|
33
34
|
its entry refreshed, both relays report and its events come twice. The plugin is not a Claude marketplace entry, so
|
|
@@ -43,6 +44,12 @@ This plugin ships dual-manifest packaging — both `.claude-plugin/` and `.codex
|
|
|
43
44
|
- **Codex CLI** — Codex has no directory option for plugins, so it does not load this plugin. A Codex seat gets only the hooks
|
|
44
45
|
the daemon writes into Codex's `config.toml` (the activity relay); `hooks/codex.json` is not read.
|
|
45
46
|
|
|
47
|
+
Generated Claude settings commands for the activity relay and context collector use the daemon's absolute Node
|
|
48
|
+
executable when its name is recognized (`node` or `node.exe`); other names keep the legacy bare `node` command and
|
|
49
|
+
its PATH requirement. Pinned commands do not require Node on the Claude process's inherited PATH. The executable must
|
|
50
|
+
remain installed; removing or moving it requires normal command refresh from a healthy runtime. This does not change the static plugin
|
|
51
|
+
manifest commands, which still use `node`, or prove that an already-running Claude reloaded changed settings.
|
|
52
|
+
|
|
46
53
|
One skill targets Claude Code's compaction behavior specifically:
|
|
47
54
|
- `claude-compaction-restore` — used to rebuild a Claude Code agent's working mental model after `/compact`, from JSONL transcripts and touched files
|
|
48
55
|
|
|
@@ -214,15 +214,30 @@ function uid() {
|
|
|
214
214
|
// each event once either way. Anything unreadable, missing or different counts as "not registered": a seat is never silent.
|
|
215
215
|
const SETTINGS_RELAY_TAIL = "state/claude-activity-hooks/activity-relay.cjs";
|
|
216
216
|
|
|
217
|
-
//
|
|
218
|
-
//
|
|
217
|
+
// Keep this finite generated-command grammar in parity with parseManagedClaudeNodeCommand.
|
|
218
|
+
// Bare-node legacy commands and a canonical quoted absolute Node path are recognised;
|
|
219
|
+
// extra arguments and user wrappers are not the settings relay.
|
|
219
220
|
function settingsRelayPath(command) {
|
|
220
|
-
|
|
221
|
-
const
|
|
222
|
-
if (!
|
|
223
|
-
const
|
|
224
|
-
|
|
225
|
-
|
|
221
|
+
if (/[\r\n]/.test(command)) return null;
|
|
222
|
+
const m = /^(node|'(?:[^']|'"'"')*')[ \t]+('(?:[^']|'"'"')*')$/.exec(command.trim());
|
|
223
|
+
if (!m) return null;
|
|
224
|
+
const decode = token => token.slice(1, -1).split(`'"'"'`).join("'");
|
|
225
|
+
const quote = value => "'" + value.replace(/'/g, `'"'"'`) + "'";
|
|
226
|
+
const executable = m[1] === "node" ? "node" : decode(m[1]);
|
|
227
|
+
const relay = decode(m[2]);
|
|
228
|
+
if (quote(relay) !== m[2] || !path.isAbsolute(relay) || !relay.endsWith(`/${SETTINGS_RELAY_TAIL}`)) return null;
|
|
229
|
+
if (m[1] !== "node" && (quote(executable) !== m[1] || !path.isAbsolute(executable) || !/^node(?:\.exe)?$/i.test(path.basename(executable)))) return null;
|
|
230
|
+
return { executable, relay };
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
function interpreterAvailable(executable, env) {
|
|
234
|
+
const candidates = executable === "node"
|
|
235
|
+
? typeof env.PATH === "string" ? env.PATH.split(path.delimiter).map(dir => path.resolve(dir || ".", "node")) : []
|
|
236
|
+
: [executable];
|
|
237
|
+
return candidates.some(candidate => {
|
|
238
|
+
try { fs.accessSync(candidate, fs.constants.X_OK); return fs.statSync(candidate).isFile(); }
|
|
239
|
+
catch { return false; }
|
|
240
|
+
});
|
|
226
241
|
}
|
|
227
242
|
|
|
228
243
|
// A settings entry only silences this run if it would really report: the file it names is there and is this very script.
|
|
@@ -243,7 +258,7 @@ function settingsRelayReports(hookEvent, providerPayload, env = process.env) {
|
|
|
243
258
|
return Array.isArray(groups) && groups.some((group) => group && unrestricted(group) && Array.isArray(group.hooks)
|
|
244
259
|
&& group.hooks.some((hook) => {
|
|
245
260
|
const relay = hook && typeof hook.command === "string" ? settingsRelayPath(hook.command) : null;
|
|
246
|
-
return relay !== null && isThisScript(relay);
|
|
261
|
+
return relay !== null && interpreterAvailable(relay.executable, env) && isThisScript(relay.relay);
|
|
247
262
|
}));
|
|
248
263
|
} catch {
|
|
249
264
|
return false;
|
|
@@ -306,4 +321,5 @@ module.exports = {
|
|
|
306
321
|
resolveEndpoint,
|
|
307
322
|
pluginRunIsRedundant,
|
|
308
323
|
settingsRelayReports,
|
|
324
|
+
settingsRelayPath,
|
|
309
325
|
};
|
|
@@ -125,11 +125,14 @@ function readConfiguredContent(home) {
|
|
|
125
125
|
// current work, its basis travels to the trace script, which alone decides how to render it;
|
|
126
126
|
// a failed or unreadable answer is passed as UNKNOWN. Never guess a work node here: a guess
|
|
127
127
|
// would silently re-point the whole trace.
|
|
128
|
-
// OPR.0.7.0.12 — the work packet
|
|
129
|
-
//
|
|
130
|
-
//
|
|
128
|
+
// OPR.0.7.0.12 — the work packet: the trace receives the daemon's labelled work candidates and
|
|
129
|
+
// carries duties and notes as text. OPENRIG_REFOCUS_WORK_PACKET=1 turns it on and =0 off; unset, each
|
|
130
|
+
// runtime's default below applies. A runtime defaults on only once a native run has shown the packet
|
|
131
|
+
// reaching the agent and leading to the right next action; neither has yet. With it off, every path
|
|
132
|
+
// below is unchanged.
|
|
133
|
+
const WORK_PACKET_DEFAULT = { claude: false, codex: false };
|
|
131
134
|
function workPacketEnabled() {
|
|
132
|
-
return enabled(process.env.OPENRIG_REFOCUS_WORK_PACKET,
|
|
135
|
+
return enabled(process.env.OPENRIG_REFOCUS_WORK_PACKET, WORK_PACKET_DEFAULT[runtime()] === true);
|
|
133
136
|
}
|
|
134
137
|
|
|
135
138
|
function readQueueWhoami(timeout = lookupTimeout()) {
|
|
@@ -109,6 +109,11 @@ When you `rig capture` a pane, **greyed / ghost autocomplete suggestions are NOT
|
|
|
109
109
|
|
|
110
110
|
**Rule:** ignore ghost/autosuggest text entirely. Only *committed/rendered* pane output is real. When it matters, verify at source (git, the queue, the actual event) — never off a capture's ghost line.
|
|
111
111
|
|
|
112
|
+
A plain capture loses the grey, so `rig capture` reads it for you. For a Claude Code or Codex seat, a
|
|
113
|
+
`[rig capture: <seat>: input box: ...]` note on stderr (and `inputBox` in `--json`) says whether the input box's text
|
|
114
|
+
is likely a harness suggestion or typed, from where the cursor is and whether the text is drawn faint. Don't act on
|
|
115
|
+
`likely-suggestion` text as anyone's intent, and treat `unknown` as unknown: verify at source.
|
|
116
|
+
|
|
112
117
|
## Moment-of-truth checklist
|
|
113
118
|
|
|
114
119
|
- **Starting a slice?** → do you know what it's for and what done looks like? mockups attached (UI slices)? **Are you on the light path?** (You are, unless the mission owner assigned the overlay.)
|
|
@@ -384,11 +384,19 @@ rig reconcile-session <session>
|
|
|
384
384
|
rig reconcile-session <session> --rig <rigId> --node <logicalId>
|
|
385
385
|
rig reconcile-session <session> --no-launch
|
|
386
386
|
rig reconcile-session <session> --json
|
|
387
|
+
rig reconcile-session <session> --repair-missing-pane --no-launch
|
|
387
388
|
```
|
|
388
389
|
|
|
389
|
-
This is a no-launch, no-input adopt
|
|
390
|
-
|
|
391
|
-
|
|
390
|
+
This is a no-launch, no-input adopt: it records a new claimed session row for
|
|
391
|
+
the seat (any running row is superseded); it re-captures the resume token if
|
|
392
|
+
it can, and conversation continuity stays unverified. `--rig`/`--node`
|
|
393
|
+
disambiguate when the canonical session name does not uniquely resolve.
|
|
394
|
+
`--no-launch` is accepted for explicitness.
|
|
395
|
+
|
|
396
|
+
`--repair-missing-pane --no-launch` is different: for a running launched seat
|
|
397
|
+
whose tmux pane was never recorded, it fills in the pane and keeps the
|
|
398
|
+
session, resume token and generation. It never adopts. Both forms refuse
|
|
399
|
+
while the seat's typing protection is on.
|
|
392
400
|
|
|
393
401
|
### Five-term restore status vocabulary
|
|
394
402
|
|
|
@@ -75,39 +75,19 @@ def read(path):
|
|
|
75
75
|
return None
|
|
76
76
|
|
|
77
77
|
|
|
78
|
+
# Contract twin of CLI scope-fs.ts and daemon scope/node-file.ts; parity is tested.
|
|
79
|
+
NOTES_FILE_PRECEDENCE = ("NOTES.md", "MISSION_NOTES.md")
|
|
80
|
+
|
|
81
|
+
|
|
78
82
|
def resolve_notes(node):
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
except subprocess.TimeoutExpired:
|
|
88
|
-
return None, "resolver command timed out"
|
|
89
|
-
except OSError as error:
|
|
90
|
-
return None, f"resolver command could not start: {error}"
|
|
91
|
-
if result.returncode != 0:
|
|
92
|
-
detail = (result.stderr or result.stdout or "").strip().splitlines()
|
|
93
|
-
suffix = f": {detail[0]}" if detail else ""
|
|
94
|
-
return None, f"resolver command exited {result.returncode}{suffix}"
|
|
95
|
-
try:
|
|
96
|
-
payload = json.loads(result.stdout)
|
|
97
|
-
except (json.JSONDecodeError, TypeError):
|
|
98
|
-
return None, "resolver command returned malformed JSON"
|
|
99
|
-
if not isinstance(payload, dict) or payload.get("ok") is not True or "resolution" not in payload:
|
|
100
|
-
return None, "resolver command returned an invalid success shape"
|
|
101
|
-
resolution = payload["resolution"]
|
|
102
|
-
if resolution is None:
|
|
103
|
-
return None, None
|
|
104
|
-
if not isinstance(resolution, dict):
|
|
105
|
-
return None, "resolver command returned an invalid resolution shape"
|
|
106
|
-
resolved_path = resolution.get("path")
|
|
107
|
-
resolved_name = resolution.get("name")
|
|
108
|
-
if not isinstance(resolved_path, str) or not isinstance(resolved_name, str):
|
|
109
|
-
return None, "resolver command returned an invalid resolution shape"
|
|
110
|
-
return (Path(resolved_path), resolved_name), None
|
|
83
|
+
for name in NOTES_FILE_PRECEDENCE:
|
|
84
|
+
candidate = node / name
|
|
85
|
+
try:
|
|
86
|
+
if candidate.is_file() and os.access(candidate, os.R_OK):
|
|
87
|
+
return (candidate, name), None
|
|
88
|
+
except OSError:
|
|
89
|
+
pass
|
|
90
|
+
return None, None
|
|
111
91
|
|
|
112
92
|
|
|
113
93
|
def intent(text):
|
|
@@ -157,6 +137,27 @@ DUTY_HEADINGS = ("my job here", "standing duties")
|
|
|
157
137
|
NOTES_STATE_HEADINGS = ("current state",)
|
|
158
138
|
HEADING = re.compile(r"^(#{1,6})\s+(.*?)\s*#*\s*$")
|
|
159
139
|
DEFAULT_NOTES_MAX_AGE_DAYS = 14
|
|
140
|
+
# Each packet field is bounded on its own; there is no total cap. A row's summary and continuation are one line each,
|
|
141
|
+
# the held and next lists show their newest rows with the full count, and a matched section's body is cut at a line.
|
|
142
|
+
FIELD_CHARS = 160
|
|
143
|
+
HELD_SHOWN = 20
|
|
144
|
+
NEXT_SHOWN = 10
|
|
145
|
+
SECTION_CHARS = 1500
|
|
146
|
+
|
|
147
|
+
|
|
148
|
+
def one_line(text):
|
|
149
|
+
"""(text as one line, cut to FIELD_CHARS, whether it was shortened)."""
|
|
150
|
+
flat = " ".join(str(text).split())
|
|
151
|
+
if len(flat) <= FIELD_CHARS:
|
|
152
|
+
return flat, flat != str(text).strip()
|
|
153
|
+
return flat[:FIELD_CHARS - 1].rstrip() + "…", True
|
|
154
|
+
|
|
155
|
+
|
|
156
|
+
def bounded_section(body):
|
|
157
|
+
if len(body) <= SECTION_CHARS:
|
|
158
|
+
return body
|
|
159
|
+
boundary = body.rfind("\n", 0, SECTION_CHARS)
|
|
160
|
+
return body[:boundary if boundary > 0 else SECTION_CHARS].rstrip() + "\n[… use --depth full for the rest]"
|
|
160
161
|
|
|
161
162
|
|
|
162
163
|
def heading_sections(text, wanted):
|
|
@@ -180,7 +181,7 @@ def heading_sections(text, wanted):
|
|
|
180
181
|
|
|
181
182
|
def by_section(text, wanted, path):
|
|
182
183
|
found = heading_sections(text, wanted)
|
|
183
|
-
shown = "\n\n".join(f"{title}\n{body}" if body else title for title, body in found)
|
|
184
|
+
shown = "\n\n".join(f"{title}\n{bounded_section(body)}" if body else title for title, body in found)
|
|
184
185
|
missing = [phrase for phrase in wanted if not any(title.lower().startswith(phrase) for title, _ in found)]
|
|
185
186
|
if not missing:
|
|
186
187
|
return shown
|
|
@@ -335,28 +336,51 @@ def candidate_line(candidate):
|
|
|
335
336
|
return line
|
|
336
337
|
|
|
337
338
|
|
|
339
|
+
def row_fields(row, *fields):
|
|
340
|
+
"""Each named field as one bounded line, and a pointer to the whole row when any was shortened."""
|
|
341
|
+
values, cut = [], False
|
|
342
|
+
for field, missing in fields:
|
|
343
|
+
value, shortened = one_line(row.get(field) or missing)
|
|
344
|
+
values.append(value)
|
|
345
|
+
cut = cut or shortened
|
|
346
|
+
pointer = f" — full row: rig queue show {row['qitemId']}" if cut and row.get("qitemId") else ""
|
|
347
|
+
return values, pointer
|
|
348
|
+
|
|
349
|
+
|
|
350
|
+
def cut_notice(name, state, rows, shown, daemon_cut):
|
|
351
|
+
"""The list's notice when it was cut here or by the daemon: how many are shown, of how many."""
|
|
352
|
+
if not daemon_cut and len(rows) <= shown:
|
|
353
|
+
return None
|
|
354
|
+
total = f"more than {len(rows)}" if daemon_cut else str(len(rows))
|
|
355
|
+
return (f"(the {name} list was cut: {min(len(rows), shown)} of {total} shown; "
|
|
356
|
+
f"`rig queue list --owned --state {state}` has the rest)")
|
|
357
|
+
|
|
358
|
+
|
|
338
359
|
def render_held_and_next(evidence):
|
|
339
360
|
output = []
|
|
361
|
+
per_list = "heldTruncated" in evidence or "nextTruncated" in evidence
|
|
340
362
|
held = evidence.get("held") or []
|
|
341
363
|
if held:
|
|
342
364
|
output.append("HELD WORK (blocked; this is not next):")
|
|
343
|
-
for row in held:
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
365
|
+
for row in held[:HELD_SHOWN]:
|
|
366
|
+
(summary, blocked_on, continuation), pointer = row_fields(
|
|
367
|
+
row, ("summary", "no summary"), ("blockedOn", "unknown"), ("continuation", "none recorded"))
|
|
368
|
+
output.append(f"- {row.get('qitemId') or 'a row'} — {summary} — blocked on {blocked_on} — "
|
|
369
|
+
f"continuation: {continuation}{pointer}")
|
|
347
370
|
following = evidence.get("next") or []
|
|
348
371
|
if following:
|
|
349
372
|
output.append("POSSIBLE NEXT WORK (pending; no order implied):")
|
|
350
|
-
for row in following:
|
|
373
|
+
for row in following[:NEXT_SHOWN]:
|
|
351
374
|
missions = ", ".join(row.get("missions") or [])
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
375
|
+
(summary,), pointer = row_fields(row, ("summary", "no summary"))
|
|
376
|
+
output.append(f"- {row.get('qitemId') or 'a row'} — {summary}"
|
|
377
|
+
+ (f" [mission: {missions}]" if missions else "") + pointer)
|
|
378
|
+
notices = [
|
|
379
|
+
cut_notice("held", "blocked", held, HELD_SHOWN, per_list and bool(evidence.get("heldTruncated"))),
|
|
380
|
+
cut_notice("next", "pending", following, NEXT_SHOWN, per_list and bool(evidence.get("nextTruncated"))),
|
|
381
|
+
]
|
|
382
|
+
output.extend(notice for notice in notices if notice)
|
|
383
|
+
if not per_list and evidence.get("heldAndNextTruncated"):
|
|
360
384
|
output.append("(held and next lists were cut; `rig queue list` has the rest)")
|
|
361
385
|
return "\n".join(output)
|
|
362
386
|
|
|
@@ -390,8 +414,9 @@ def render_candidates(evidence, root, depth, failures):
|
|
|
390
414
|
output.extend(candidate_line(candidate) for candidate in candidates)
|
|
391
415
|
if unknown:
|
|
392
416
|
output.append("In-progress rows the queue cannot place:")
|
|
393
|
-
|
|
394
|
-
|
|
417
|
+
for row in unknown:
|
|
418
|
+
(summary,), pointer = row_fields(row, ("summary", "no summary"))
|
|
419
|
+
output.append(f"- {row.get('qitemId') or 'a row'} — {summary}: {row.get('reason')}{pointer}")
|
|
395
420
|
if not candidates:
|
|
396
421
|
names = evidence.get("missionsOnHost") or []
|
|
397
422
|
if names:
|
|
@@ -15,9 +15,13 @@ building it yourself.
|
|
|
15
15
|
|
|
16
16
|
Tell the person what you're about to run and why before you run it. Don't install system packages or change their
|
|
17
17
|
machine without a yes. Starting OpenRig and a team writes files: Codex hooks and settings in
|
|
18
|
-
`~/.codex/config.toml`,
|
|
19
|
-
guidance in `AGENTS.md` or `CLAUDE.md
|
|
20
|
-
|
|
18
|
+
`~/.codex/config.toml`, Claude Code workspace trust in `~/.claude.json`, discovery skills in `~/.claude/skills` and
|
|
19
|
+
`~/.agents/skills`, and, in the repository, managed guidance in `AGENTS.md` or `CLAUDE.md`, activity hooks in
|
|
20
|
+
`.claude/settings.local.json` and a status line there unless the project already has its own, plus the team's skills
|
|
21
|
+
and plugins. Unless a permission policy, a per-seat choice or (for Codex) a named profile applies, the kernel's own
|
|
22
|
+
seats run with an operational default: Codex with `-s danger-full-access -a never`, and Claude Code with its file
|
|
23
|
+
tools, web fetches and operational commands, including reads under the home folder, allowed without asking. Say so
|
|
24
|
+
before you start OpenRig ([the full list](https://github.com/mvschwarz/openrig#what-openrig-changes-on-your-machine)).
|
|
21
25
|
|
|
22
26
|
## 1. Install OpenRig, if it isn't installed
|
|
23
27
|
|
|
@@ -178,4 +182,4 @@ offer, so the person sees the real file, not a placeholder:
|
|
|
178
182
|
- **Everything in the library:** `rig context list`.
|
|
179
183
|
- **Exact syntax:** `rig <command> --help` is always current for the installed version.
|
|
180
184
|
|
|
181
|
-
|
|
185
|
+
When something here and `rig <command> --help` disagree, `--help` wins.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Agent help: the single troubleshooting and escalation guide (docs/reference/help.md).
|
|
2
2
|
name: help
|
|
3
|
-
version: "0.6.
|
|
3
|
+
version: "0.6.14"
|
|
4
4
|
taxonomy: world
|
|
5
5
|
purpose: "What an agent does when its user says OpenRig isn't working: diagnose, fix within permissions, verify, and escalate to OpenRig support."
|
|
6
6
|
files:
|