oh-my-codex 0.20.1 → 0.20.3
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/Cargo.lock +7 -6
- package/Cargo.toml +1 -1
- package/README.md +36 -1
- package/crates/omx-runtime/Cargo.toml +1 -0
- package/crates/omx-runtime/src/main.rs +25 -2
- package/crates/omx-runtime/tests/execution.rs +219 -0
- package/crates/omx-runtime-core/src/dispatch.rs +96 -10
- package/crates/omx-runtime-core/src/engine.rs +839 -29
- package/crates/omx-runtime-core/src/lib.rs +8 -0
- package/dist/adapt/__tests__/hermes.test.js.map +1 -1
- package/dist/adapt/contracts.d.ts.map +1 -1
- package/dist/agents/__tests__/definitions.test.js +81 -0
- package/dist/agents/__tests__/definitions.test.js.map +1 -1
- package/dist/agents/__tests__/native-config.test.js +25 -0
- package/dist/agents/__tests__/native-config.test.js.map +1 -1
- package/dist/agents/native-config.d.ts +2 -1
- package/dist/agents/native-config.d.ts.map +1 -1
- package/dist/agents/native-config.js.map +1 -1
- package/dist/auth/__tests__/hotswap.test.d.ts +2 -0
- package/dist/auth/__tests__/hotswap.test.d.ts.map +1 -0
- package/dist/auth/__tests__/hotswap.test.js +183 -0
- package/dist/auth/__tests__/hotswap.test.js.map +1 -0
- package/dist/auth/hotswap.d.ts +6 -0
- package/dist/auth/hotswap.d.ts.map +1 -1
- package/dist/auth/hotswap.js +102 -19
- package/dist/auth/hotswap.js.map +1 -1
- package/dist/auth/paths.js.map +1 -1
- package/dist/auth/storage.js.map +1 -1
- package/dist/autopilot/__tests__/ralplan-gate.test.js +5 -5
- package/dist/autopilot/__tests__/ralplan-gate.test.js.map +1 -1
- package/dist/autopilot/completion-gate.js.map +1 -1
- package/dist/autopilot/fsm.d.ts +1 -1
- package/dist/autopilot/fsm.d.ts.map +1 -1
- package/dist/autoresearch/goal.js.map +1 -1
- package/dist/autoresearch/runtime.js.map +1 -1
- package/dist/capabilities/lockfile.js.map +1 -1
- package/dist/catalog/reader.js.map +1 -1
- package/dist/catalog/skill-mirror.js.map +1 -1
- package/dist/cli/__tests__/adapt-help.test.js.map +1 -1
- package/dist/cli/__tests__/agents-init.test.js.map +1 -1
- package/dist/cli/__tests__/agents.test.js.map +1 -1
- package/dist/cli/__tests__/api.test.js.map +1 -1
- package/dist/cli/__tests__/ask.test.js.map +1 -1
- package/dist/cli/__tests__/auth.test.js +60 -6
- package/dist/cli/__tests__/auth.test.js.map +1 -1
- package/dist/cli/__tests__/autoresearch-guided.test.js.map +1 -1
- package/dist/cli/__tests__/autoresearch.test.js.map +1 -1
- package/dist/cli/__tests__/capabilities.test.js.map +1 -1
- package/dist/cli/__tests__/codex-plugin-layout.test.js +80 -0
- package/dist/cli/__tests__/codex-plugin-layout.test.js.map +1 -1
- package/dist/cli/__tests__/doctor-context-window-warning.test.js.map +1 -1
- package/dist/cli/__tests__/doctor-invalid-config.test.js +47 -4
- package/dist/cli/__tests__/doctor-invalid-config.test.js.map +1 -1
- package/dist/cli/__tests__/doctor-team.test.js.map +1 -1
- package/dist/cli/__tests__/doctor-warning-copy.test.js +752 -15
- package/dist/cli/__tests__/doctor-warning-copy.test.js.map +1 -1
- package/dist/cli/__tests__/exec.test.js +136 -0
- package/dist/cli/__tests__/exec.test.js.map +1 -1
- package/dist/cli/__tests__/imagegen-continuation.test.js.map +1 -1
- package/dist/cli/__tests__/index.test.js +473 -14
- package/dist/cli/__tests__/index.test.js.map +1 -1
- package/dist/cli/__tests__/launch-fallback.test.js +336 -4
- package/dist/cli/__tests__/launch-fallback.test.js.map +1 -1
- package/dist/cli/__tests__/mcp-parity.test.js +87 -12
- package/dist/cli/__tests__/mcp-parity.test.js.map +1 -1
- package/dist/cli/__tests__/native-hook-claim-journal.test.d.ts +2 -0
- package/dist/cli/__tests__/native-hook-claim-journal.test.d.ts.map +1 -0
- package/dist/cli/__tests__/native-hook-claim-journal.test.js +206 -0
- package/dist/cli/__tests__/native-hook-claim-journal.test.js.map +1 -0
- package/dist/cli/__tests__/nested-help-routing.test.js.map +1 -1
- package/dist/cli/__tests__/question.test.js.map +1 -1
- package/dist/cli/__tests__/ralph-deslop-contract.test.js.map +1 -1
- package/dist/cli/__tests__/ralph-goal-mode-contract.test.js +6 -0
- package/dist/cli/__tests__/ralph-goal-mode-contract.test.js.map +1 -1
- package/dist/cli/__tests__/ralph-prd-deep-interview.test.js.map +1 -1
- package/dist/cli/__tests__/ralph-prd-smoke.test.js.map +1 -1
- package/dist/cli/__tests__/ralph.test.js +8 -3
- package/dist/cli/__tests__/ralph.test.js.map +1 -1
- package/dist/cli/__tests__/ralplan-bootstrap-3181.test.d.ts +2 -0
- package/dist/cli/__tests__/ralplan-bootstrap-3181.test.d.ts.map +1 -0
- package/dist/cli/__tests__/ralplan-bootstrap-3181.test.js +72 -0
- package/dist/cli/__tests__/ralplan-bootstrap-3181.test.js.map +1 -0
- package/dist/cli/__tests__/ralplan.test.d.ts +2 -0
- package/dist/cli/__tests__/ralplan.test.d.ts.map +1 -0
- package/dist/cli/__tests__/ralplan.test.js +55 -0
- package/dist/cli/__tests__/ralplan.test.js.map +1 -0
- package/dist/cli/__tests__/resume.test.js +17 -11
- package/dist/cli/__tests__/resume.test.js.map +1 -1
- package/dist/cli/__tests__/session-scoped-runtime.test.js +25 -0
- package/dist/cli/__tests__/session-scoped-runtime.test.js.map +1 -1
- package/dist/cli/__tests__/session-search-help.test.js +25 -1
- package/dist/cli/__tests__/session-search-help.test.js.map +1 -1
- package/dist/cli/__tests__/session-search.test.js.map +1 -1
- package/dist/cli/__tests__/setup-agents-overwrite.test.js +79 -0
- package/dist/cli/__tests__/setup-agents-overwrite.test.js.map +1 -1
- package/dist/cli/__tests__/setup-gh-star.test.js.map +1 -1
- package/dist/cli/__tests__/setup-hooks-shared-ownership.test.js +77 -3
- package/dist/cli/__tests__/setup-hooks-shared-ownership.test.js.map +1 -1
- package/dist/cli/__tests__/setup-hooks-trust-e2e.test.d.ts +2 -0
- package/dist/cli/__tests__/setup-hooks-trust-e2e.test.d.ts.map +1 -0
- package/dist/cli/__tests__/setup-hooks-trust-e2e.test.js +285 -0
- package/dist/cli/__tests__/setup-hooks-trust-e2e.test.js.map +1 -0
- package/dist/cli/__tests__/setup-install-mode.test.js +2579 -294
- package/dist/cli/__tests__/setup-install-mode.test.js.map +1 -1
- package/dist/cli/__tests__/setup-preferences.test.d.ts +2 -0
- package/dist/cli/__tests__/setup-preferences.test.d.ts.map +1 -0
- package/dist/cli/__tests__/setup-preferences.test.js +79 -0
- package/dist/cli/__tests__/setup-preferences.test.js.map +1 -0
- package/dist/cli/__tests__/setup-refresh.test.js +33 -2
- package/dist/cli/__tests__/setup-refresh.test.js.map +1 -1
- package/dist/cli/__tests__/setup-scope.test.js +46 -3
- package/dist/cli/__tests__/setup-scope.test.js.map +1 -1
- package/dist/cli/__tests__/sparkshell-cli.test.js.map +1 -1
- package/dist/cli/__tests__/state.test.js +37 -0
- package/dist/cli/__tests__/state.test.js.map +1 -1
- package/dist/cli/__tests__/team.test.js +105 -7
- package/dist/cli/__tests__/team.test.js.map +1 -1
- package/dist/cli/__tests__/ultragoal.test.js +61 -1
- package/dist/cli/__tests__/ultragoal.test.js.map +1 -1
- package/dist/cli/__tests__/uninstall.test.js +1817 -24
- package/dist/cli/__tests__/uninstall.test.js.map +1 -1
- package/dist/cli/__tests__/update.test.js +58 -0
- package/dist/cli/__tests__/update.test.js.map +1 -1
- package/dist/cli/__tests__/url.test.js.map +1 -1
- package/dist/cli/__tests__/windows-popup-loop-contract.test.js +2 -1
- package/dist/cli/__tests__/windows-popup-loop-contract.test.js.map +1 -1
- package/dist/cli/adapt.js.map +1 -1
- package/dist/cli/agents-init.js.map +1 -1
- package/dist/cli/agents.js.map +1 -1
- package/dist/cli/api.js.map +1 -1
- package/dist/cli/ask.d.ts +1 -1
- package/dist/cli/ask.d.ts.map +1 -1
- package/dist/cli/ask.js.map +1 -1
- package/dist/cli/auth.js.map +1 -1
- package/dist/cli/autoresearch-guided.js.map +1 -1
- package/dist/cli/autoresearch-intake.js.map +1 -1
- package/dist/cli/capabilities.js.map +1 -1
- package/dist/cli/cleanup.js.map +1 -1
- package/dist/cli/codex-feature-probe.js.map +1 -1
- package/dist/cli/codex-home.js.map +1 -1
- package/dist/cli/doctor.d.ts +21 -0
- package/dist/cli/doctor.d.ts.map +1 -1
- package/dist/cli/doctor.js +607 -130
- package/dist/cli/doctor.js.map +1 -1
- package/dist/cli/explore.js.map +1 -1
- package/dist/cli/index.d.ts +14 -3
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +245 -57
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/mcp-parity.js +2 -2
- package/dist/cli/mcp-parity.js.map +1 -1
- package/dist/cli/mcp-serve.js.map +1 -1
- package/dist/cli/mission.js.map +1 -1
- package/dist/cli/native-assets.js.map +1 -1
- package/dist/cli/native-hook-claim-journal.d.ts +29 -0
- package/dist/cli/native-hook-claim-journal.d.ts.map +1 -0
- package/dist/cli/native-hook-claim-journal.js +252 -0
- package/dist/cli/native-hook-claim-journal.js.map +1 -0
- package/dist/cli/omx.js.map +1 -1
- package/dist/cli/plugin-marketplace.js.map +1 -1
- package/dist/cli/project-runtime-codex-homes.js.map +1 -1
- package/dist/cli/question.js.map +1 -1
- package/dist/cli/ralph.d.ts.map +1 -1
- package/dist/cli/ralph.js +3 -2
- package/dist/cli/ralph.js.map +1 -1
- package/dist/cli/ralplan.d.ts +10 -0
- package/dist/cli/ralplan.d.ts.map +1 -0
- package/dist/cli/ralplan.js +110 -0
- package/dist/cli/ralplan.js.map +1 -0
- package/dist/cli/session-search.d.ts +5 -0
- package/dist/cli/session-search.d.ts.map +1 -1
- package/dist/cli/session-search.js +87 -0
- package/dist/cli/session-search.js.map +1 -1
- package/dist/cli/setup-preferences.d.ts +11 -0
- package/dist/cli/setup-preferences.d.ts.map +1 -1
- package/dist/cli/setup-preferences.js +32 -0
- package/dist/cli/setup-preferences.js.map +1 -1
- package/dist/cli/setup.d.ts +58 -0
- package/dist/cli/setup.d.ts.map +1 -1
- package/dist/cli/setup.js +1450 -398
- package/dist/cli/setup.js.map +1 -1
- package/dist/cli/sparkshell.js.map +1 -1
- package/dist/cli/star-prompt.js.map +1 -1
- package/dist/cli/state.d.ts.map +1 -1
- package/dist/cli/state.js +2 -1
- package/dist/cli/state.js.map +1 -1
- package/dist/cli/team.js.map +1 -1
- package/dist/cli/ultragoal.d.ts +5 -1
- package/dist/cli/ultragoal.d.ts.map +1 -1
- package/dist/cli/ultragoal.js +34 -2
- package/dist/cli/ultragoal.js.map +1 -1
- package/dist/cli/uninstall.d.ts +17 -0
- package/dist/cli/uninstall.d.ts.map +1 -1
- package/dist/cli/uninstall.js +986 -95
- package/dist/cli/uninstall.js.map +1 -1
- package/dist/cli/update.d.ts.map +1 -1
- package/dist/cli/update.js +8 -1
- package/dist/cli/update.js.map +1 -1
- package/dist/cli/url.js.map +1 -1
- package/dist/compat/__tests__/doctor-contract.test.js +5 -1
- package/dist/compat/__tests__/doctor-contract.test.js.map +1 -1
- package/dist/compat/__tests__/rust-runtime-compat.test.js +1 -1
- package/dist/compat/__tests__/rust-runtime-compat.test.js.map +1 -1
- package/dist/config/__tests__/codex-hooks.test.js +1287 -11
- package/dist/config/__tests__/codex-hooks.test.js.map +1 -1
- package/dist/config/__tests__/generator-idempotent.test.js +1179 -32
- package/dist/config/__tests__/generator-idempotent.test.js.map +1 -1
- package/dist/config/__tests__/generator-notify.test.js +6 -1
- package/dist/config/__tests__/generator-notify.test.js.map +1 -1
- package/dist/config/__tests__/models.test.js +67 -3
- package/dist/config/__tests__/models.test.js.map +1 -1
- package/dist/config/codex-feature-flags.d.ts.map +1 -1
- package/dist/config/codex-feature-flags.js.map +1 -1
- package/dist/config/codex-hooks.d.ts +124 -1
- package/dist/config/codex-hooks.d.ts.map +1 -1
- package/dist/config/codex-hooks.js +2142 -265
- package/dist/config/codex-hooks.js.map +1 -1
- package/dist/config/commit-lore-guard.js.map +1 -1
- package/dist/config/generator.d.ts +23 -34
- package/dist/config/generator.d.ts.map +1 -1
- package/dist/config/generator.js +1480 -246
- package/dist/config/generator.js.map +1 -1
- package/dist/config/mcp-registry.js.map +1 -1
- package/dist/config/models.d.ts +14 -4
- package/dist/config/models.d.ts.map +1 -1
- package/dist/config/models.js +15 -1
- package/dist/config/models.js.map +1 -1
- package/dist/config/omx-first-party-mcp.js.map +1 -1
- package/dist/config/team-mode.d.ts.map +1 -1
- package/dist/document-refresh/__tests__/enforcer.test.js.map +1 -1
- package/dist/document-refresh/enforcer.js.map +1 -1
- package/dist/exec/followup.js.map +1 -1
- package/dist/goal-workflows/artifacts.js.map +1 -1
- package/dist/hooks/__tests__/agents-overlay.test.js +7 -4
- package/dist/hooks/__tests__/agents-overlay.test.js.map +1 -1
- package/dist/hooks/__tests__/analyze-routing-contract.test.js.map +1 -1
- package/dist/hooks/__tests__/analyze-skill-contract.test.js.map +1 -1
- package/dist/hooks/__tests__/anti-slop-workflow.test.js.map +1 -1
- package/dist/hooks/__tests__/autopilot-skill-contract.test.js +9 -3
- package/dist/hooks/__tests__/autopilot-skill-contract.test.js.map +1 -1
- package/dist/hooks/__tests__/code-review-skill-contract.test.js.map +1 -1
- package/dist/hooks/__tests__/consensus-execution-handoff.test.js.map +1 -1
- package/dist/hooks/__tests__/deep-interview-contract.test.js.map +1 -1
- package/dist/hooks/__tests__/design-skill.test.js.map +1 -1
- package/dist/hooks/__tests__/keyword-detector.test.js +1376 -6
- package/dist/hooks/__tests__/keyword-detector.test.js.map +1 -1
- package/dist/hooks/__tests__/notify-fallback-watcher.test.js +252 -543
- package/dist/hooks/__tests__/notify-fallback-watcher.test.js.map +1 -1
- package/dist/hooks/__tests__/notify-hook-all-workers-idle.test.js +38 -4
- package/dist/hooks/__tests__/notify-hook-all-workers-idle.test.js.map +1 -1
- package/dist/hooks/__tests__/notify-hook-auto-nudge.test.js +765 -10
- package/dist/hooks/__tests__/notify-hook-auto-nudge.test.js.map +1 -1
- package/dist/hooks/__tests__/notify-hook-cross-worktree-heartbeat.test.js +2 -0
- package/dist/hooks/__tests__/notify-hook-cross-worktree-heartbeat.test.js.map +1 -1
- package/dist/hooks/__tests__/notify-hook-managed-tmux.test.js +142 -1
- package/dist/hooks/__tests__/notify-hook-managed-tmux.test.js.map +1 -1
- package/dist/hooks/__tests__/notify-hook-modules.test.js.map +1 -1
- package/dist/hooks/__tests__/notify-hook-non-omx-guard.test.js +48 -2
- package/dist/hooks/__tests__/notify-hook-non-omx-guard.test.js.map +1 -1
- package/dist/hooks/__tests__/notify-hook-ralph-resume.test.js +61 -44
- package/dist/hooks/__tests__/notify-hook-ralph-resume.test.js.map +1 -1
- package/dist/hooks/__tests__/notify-hook-regression-205.test.js.map +1 -1
- package/dist/hooks/__tests__/notify-hook-session-idle-dedupe.test.js +3 -2
- package/dist/hooks/__tests__/notify-hook-session-idle-dedupe.test.js.map +1 -1
- package/dist/hooks/__tests__/notify-hook-session-scope.test.js +243 -4
- package/dist/hooks/__tests__/notify-hook-session-scope.test.js.map +1 -1
- package/dist/hooks/__tests__/notify-hook-team-dispatch.test.js +531 -12
- package/dist/hooks/__tests__/notify-hook-team-dispatch.test.js.map +1 -1
- package/dist/hooks/__tests__/notify-hook-team-leader-nudge.test.js +163 -24
- package/dist/hooks/__tests__/notify-hook-team-leader-nudge.test.js.map +1 -1
- package/dist/hooks/__tests__/notify-hook-team-tmux-guard.test.js +482 -32
- package/dist/hooks/__tests__/notify-hook-team-tmux-guard.test.js.map +1 -1
- package/dist/hooks/__tests__/notify-hook-tmux-heal.test.js +68 -1
- package/dist/hooks/__tests__/notify-hook-tmux-heal.test.js.map +1 -1
- package/dist/hooks/__tests__/notify-hook-tmux-scrollback.test.js +7 -1
- package/dist/hooks/__tests__/notify-hook-tmux-scrollback.test.js.map +1 -1
- package/dist/hooks/__tests__/notify-hook-visual-verdict.test.js.map +1 -1
- package/dist/hooks/__tests__/notify-hook-worker-idle.test.js +43 -4
- package/dist/hooks/__tests__/notify-hook-worker-idle.test.js.map +1 -1
- package/dist/hooks/__tests__/openclaw-setup-contract.test.js.map +1 -1
- package/dist/hooks/__tests__/pre-context-gate-skills.test.js.map +1 -1
- package/dist/hooks/__tests__/prometheus-strict-contract.test.js.map +1 -1
- package/dist/hooks/__tests__/prompt-guidance-fragments.test.js.map +1 -1
- package/dist/hooks/__tests__/prompt-guidance-test-helpers.js.map +1 -1
- package/dist/hooks/__tests__/prompt-session-provenance.test.d.ts +2 -0
- package/dist/hooks/__tests__/prompt-session-provenance.test.d.ts.map +1 -0
- package/dist/hooks/__tests__/prompt-session-provenance.test.js +82 -0
- package/dist/hooks/__tests__/prompt-session-provenance.test.js.map +1 -0
- package/dist/hooks/__tests__/session.test.js +878 -11
- package/dist/hooks/__tests__/session.test.js.map +1 -1
- package/dist/hooks/__tests__/skill-catalog-hygiene.test.js.map +1 -1
- package/dist/hooks/__tests__/team-runtime-gating-docs-contract.test.js.map +1 -1
- package/dist/hooks/__tests__/visual-ralph-skill.test.js.map +1 -1
- package/dist/hooks/__tests__/visual-verdict-loop.test.js.map +1 -1
- package/dist/hooks/agents-overlay.js +5 -5
- package/dist/hooks/agents-overlay.js.map +1 -1
- package/dist/hooks/code-simplifier/index.js.map +1 -1
- package/dist/hooks/explore-routing.js.map +1 -1
- package/dist/hooks/extensibility/dispatcher.js.map +1 -1
- package/dist/hooks/extensibility/events.js.map +1 -1
- package/dist/hooks/extensibility/loader.js.map +1 -1
- package/dist/hooks/extensibility/plugin-runner-stdin.js.map +1 -1
- package/dist/hooks/extensibility/sdk/logging.js.map +1 -1
- package/dist/hooks/keyword-detector.d.ts +33 -7
- package/dist/hooks/keyword-detector.d.ts.map +1 -1
- package/dist/hooks/keyword-detector.js +2228 -119
- package/dist/hooks/keyword-detector.js.map +1 -1
- package/dist/hooks/keyword-registry.d.ts +12 -0
- package/dist/hooks/keyword-registry.d.ts.map +1 -1
- package/dist/hooks/keyword-registry.js +41 -0
- package/dist/hooks/keyword-registry.js.map +1 -1
- package/dist/hooks/prompt-session-provenance.d.ts +87 -0
- package/dist/hooks/prompt-session-provenance.d.ts.map +1 -0
- package/dist/hooks/prompt-session-provenance.js +180 -0
- package/dist/hooks/prompt-session-provenance.js.map +1 -0
- package/dist/hooks/session.d.ts +163 -34
- package/dist/hooks/session.d.ts.map +1 -1
- package/dist/hooks/session.js +1395 -317
- package/dist/hooks/session.js.map +1 -1
- package/dist/hooks/task-size-detector.js.map +1 -1
- package/dist/hud/__tests__/state.test.js.map +1 -1
- package/dist/hud/authority.js.map +1 -1
- package/dist/hud/constants.js.map +1 -1
- package/dist/hud/index.js.map +1 -1
- package/dist/hud/reconcile.js.map +1 -1
- package/dist/hud/render.js.map +1 -1
- package/dist/hud/state.js.map +1 -1
- package/dist/hud/tmux.js.map +1 -1
- package/dist/leader/__tests__/contract.test.js +153 -1
- package/dist/leader/__tests__/contract.test.js.map +1 -1
- package/dist/leader/contract.d.ts +42 -5
- package/dist/leader/contract.d.ts.map +1 -1
- package/dist/leader/contract.js +184 -3
- package/dist/leader/contract.js.map +1 -1
- package/dist/mcp/__tests__/bootstrap.test.js.map +1 -1
- package/dist/mcp/__tests__/code-intel-server.test.js +31 -3
- package/dist/mcp/__tests__/code-intel-server.test.js.map +1 -1
- package/dist/mcp/__tests__/server-lifecycle.test.js +15 -2
- package/dist/mcp/__tests__/server-lifecycle.test.js.map +1 -1
- package/dist/mcp/__tests__/state-paths.test.js +98 -1
- package/dist/mcp/__tests__/state-paths.test.js.map +1 -1
- package/dist/mcp/__tests__/wiki-server.test.js +18 -0
- package/dist/mcp/__tests__/wiki-server.test.js.map +1 -1
- package/dist/mcp/bootstrap.js.map +1 -1
- package/dist/mcp/code-intel-server.d.ts +58 -58
- package/dist/mcp/code-intel-server.d.ts.map +1 -1
- package/dist/mcp/code-intel-server.js +13 -3
- package/dist/mcp/code-intel-server.js.map +1 -1
- package/dist/mcp/hermes-bridge.js.map +1 -1
- package/dist/mcp/hermes-server.d.ts +70 -70
- package/dist/mcp/hermes-server.d.ts.map +1 -1
- package/dist/mcp/lifecycle-telemetry.js.map +1 -1
- package/dist/mcp/memory-server.d.ts +34 -34
- package/dist/mcp/memory-server.d.ts.map +1 -1
- package/dist/mcp/memory-server.js.map +1 -1
- package/dist/mcp/state-paths.d.ts +14 -0
- package/dist/mcp/state-paths.d.ts.map +1 -1
- package/dist/mcp/state-paths.js +96 -20
- package/dist/mcp/state-paths.js.map +1 -1
- package/dist/mcp/state-server.d.ts +47 -47
- package/dist/mcp/state-server.d.ts.map +1 -1
- package/dist/mcp/trace-server.d.ts +4 -4
- package/dist/mcp/trace-server.d.ts.map +1 -1
- package/dist/mcp/trace-server.js.map +1 -1
- package/dist/mcp/wiki-server.d.ts +34 -23
- package/dist/mcp/wiki-server.d.ts.map +1 -1
- package/dist/mcp/wiki-server.js +9 -2
- package/dist/mcp/wiki-server.js.map +1 -1
- package/dist/modes/__tests__/base-session-scope.test.js +53 -1
- package/dist/modes/__tests__/base-session-scope.test.js.map +1 -1
- package/dist/modes/__tests__/base-tmux-pane.test.js +4 -4
- package/dist/modes/__tests__/base-tmux-pane.test.js.map +1 -1
- package/dist/modes/base.d.ts.map +1 -1
- package/dist/modes/base.js +5 -5
- package/dist/modes/base.js.map +1 -1
- package/dist/notifications/__tests__/lifecycle-dedupe.test.js.map +1 -1
- package/dist/notifications/__tests__/reply-listener.test.js.map +1 -1
- package/dist/notifications/__tests__/session-idle-tail-dedupe.test.js +177 -85
- package/dist/notifications/__tests__/session-idle-tail-dedupe.test.js.map +1 -1
- package/dist/notifications/__tests__/session-registry.test.js.map +1 -1
- package/dist/notifications/__tests__/template-engine.test.js.map +1 -1
- package/dist/notifications/__tests__/verbosity.test.js.map +1 -1
- package/dist/notifications/http-client.js.map +1 -1
- package/dist/notifications/index.d.ts +4 -1
- package/dist/notifications/index.d.ts.map +1 -1
- package/dist/notifications/index.js +3 -9
- package/dist/notifications/index.js.map +1 -1
- package/dist/notifications/lifecycle-dedupe.js.map +1 -1
- package/dist/notifications/reply-listener.d.ts.map +1 -1
- package/dist/notifications/reply-listener.js.map +1 -1
- package/dist/notifications/session-registry.js.map +1 -1
- package/dist/notifications/session-status.js.map +1 -1
- package/dist/notifications/temp-contract.d.ts.map +1 -1
- package/dist/notifications/temp-contract.js +4 -0
- package/dist/notifications/temp-contract.js.map +1 -1
- package/dist/notifications/tmux-detector.js.map +1 -1
- package/dist/notifications/tmux.js.map +1 -1
- package/dist/openclaw/config.js.map +1 -1
- package/dist/openclaw/dispatcher.js.map +1 -1
- package/dist/pipeline/__tests__/orchestrator.test.js +4 -4
- package/dist/pipeline/__tests__/orchestrator.test.js.map +1 -1
- package/dist/pipeline/__tests__/stages.test.js +16 -13
- package/dist/pipeline/__tests__/stages.test.js.map +1 -1
- package/dist/pipeline/stages/code-review.js.map +1 -1
- package/dist/pipeline/stages/ralph-verify.js.map +1 -1
- package/dist/pipeline/stages/ralplan.js.map +1 -1
- package/dist/pipeline/stages/team-exec.js.map +1 -1
- package/dist/pipeline/stages/ultragoal.js.map +1 -1
- package/dist/pipeline/stages/ultraqa.js.map +1 -1
- package/dist/planning/__tests__/approved-execution-lifecycle-matrix.test.js.map +1 -1
- package/dist/planning/artifact-names.js.map +1 -1
- package/dist/planning/artifacts.js.map +1 -1
- package/dist/question/__tests__/state.test.js.map +1 -1
- package/dist/question/__tests__/ui.test.js.map +1 -1
- package/dist/question/autopilot-wait.js.map +1 -1
- package/dist/question/client.d.ts.map +1 -1
- package/dist/question/client.js.map +1 -1
- package/dist/question/deep-interview.js.map +1 -1
- package/dist/question/events.js.map +1 -1
- package/dist/question/renderer.js.map +1 -1
- package/dist/question/state.d.ts.map +1 -1
- package/dist/question/state.js.map +1 -1
- package/dist/question/ui.js.map +1 -1
- package/dist/ralph/contract.d.ts +1 -1
- package/dist/ralph/contract.d.ts.map +1 -1
- package/dist/ralplan/__tests__/consensus-gate.test.js +527 -8
- package/dist/ralplan/__tests__/consensus-gate.test.js.map +1 -1
- package/dist/ralplan/__tests__/documented-leader-preflight.test.d.ts +2 -0
- package/dist/ralplan/__tests__/documented-leader-preflight.test.d.ts.map +1 -0
- package/dist/ralplan/__tests__/documented-leader-preflight.test.js +46 -0
- package/dist/ralplan/__tests__/documented-leader-preflight.test.js.map +1 -0
- package/dist/ralplan/__tests__/runtime.test.js +116 -14
- package/dist/ralplan/__tests__/runtime.test.js.map +1 -1
- package/dist/ralplan/consensus-gate.d.ts +3 -3
- package/dist/ralplan/consensus-gate.d.ts.map +1 -1
- package/dist/ralplan/consensus-gate.js +173 -70
- package/dist/ralplan/consensus-gate.js.map +1 -1
- package/dist/ralplan/documented-leader-preflight.d.ts +34 -0
- package/dist/ralplan/documented-leader-preflight.d.ts.map +1 -0
- package/dist/ralplan/documented-leader-preflight.js +58 -0
- package/dist/ralplan/documented-leader-preflight.js.map +1 -0
- package/dist/ralplan/runtime.d.ts +3 -2
- package/dist/ralplan/runtime.d.ts.map +1 -1
- package/dist/ralplan/runtime.js +12 -9
- package/dist/ralplan/runtime.js.map +1 -1
- package/dist/runtime/__tests__/bridge.test.js +42 -1
- package/dist/runtime/__tests__/bridge.test.js.map +1 -1
- package/dist/runtime/bridge.d.ts +12 -0
- package/dist/runtime/bridge.d.ts.map +1 -1
- package/dist/runtime/bridge.js +52 -1
- package/dist/runtime/bridge.js.map +1 -1
- package/dist/runtime/process-tree.js.map +1 -1
- package/dist/runtime/run-loop.js.map +1 -1
- package/dist/runtime/run-outcome.d.ts +3 -3
- package/dist/runtime/run-outcome.d.ts.map +1 -1
- package/dist/runtime/run-outcome.js.map +1 -1
- package/dist/runtime/run-state.js.map +1 -1
- package/dist/scripts/__tests__/codex-native-hook.test.js +6657 -995
- package/dist/scripts/__tests__/codex-native-hook.test.js.map +1 -1
- package/dist/scripts/__tests__/fixtures/issue-3138-installed-smoke.d.ts +2 -0
- package/dist/scripts/__tests__/fixtures/issue-3138-installed-smoke.d.ts.map +1 -0
- package/dist/scripts/__tests__/fixtures/issue-3138-installed-smoke.js +634 -0
- package/dist/scripts/__tests__/fixtures/issue-3138-installed-smoke.js.map +1 -0
- package/dist/scripts/__tests__/generate-release-body.test.js.map +1 -1
- package/dist/scripts/__tests__/hook-derived-watcher.test.js.map +1 -1
- package/dist/scripts/__tests__/notify-dispatcher.test.js.map +1 -1
- package/dist/scripts/__tests__/notify-fallback-delivery.test.d.ts +2 -0
- package/dist/scripts/__tests__/notify-fallback-delivery.test.d.ts.map +1 -0
- package/dist/scripts/__tests__/notify-fallback-delivery.test.js +174 -0
- package/dist/scripts/__tests__/notify-fallback-delivery.test.js.map +1 -0
- package/dist/scripts/__tests__/notify-state-io.test.js +57 -1
- package/dist/scripts/__tests__/notify-state-io.test.js.map +1 -1
- package/dist/scripts/__tests__/reasoning-artifact-contract.test.d.ts +2 -0
- package/dist/scripts/__tests__/reasoning-artifact-contract.test.d.ts.map +1 -0
- package/dist/scripts/__tests__/reasoning-artifact-contract.test.js +108 -0
- package/dist/scripts/__tests__/reasoning-artifact-contract.test.js.map +1 -0
- package/dist/scripts/__tests__/role-intent-bootstrap-e2e-3181.test.d.ts +2 -0
- package/dist/scripts/__tests__/role-intent-bootstrap-e2e-3181.test.d.ts.map +1 -0
- package/dist/scripts/__tests__/role-intent-bootstrap-e2e-3181.test.js +78 -0
- package/dist/scripts/__tests__/role-intent-bootstrap-e2e-3181.test.js.map +1 -0
- package/dist/scripts/__tests__/role-intent-durable-recovery-3181.test.d.ts +2 -0
- package/dist/scripts/__tests__/role-intent-durable-recovery-3181.test.d.ts.map +1 -0
- package/dist/scripts/__tests__/role-intent-durable-recovery-3181.test.js +55 -0
- package/dist/scripts/__tests__/role-intent-durable-recovery-3181.test.js.map +1 -0
- package/dist/scripts/__tests__/run-test-files.test.js.map +1 -1
- package/dist/scripts/__tests__/smoke-packed-install.test.js +1100 -4
- package/dist/scripts/__tests__/smoke-packed-install.test.js.map +1 -1
- package/dist/scripts/__tests__/test-reply-listener-live.test.js.map +1 -1
- package/dist/scripts/build-api.js.map +1 -1
- package/dist/scripts/build-explore-harness.js.map +1 -1
- package/dist/scripts/build-sparkshell.js.map +1 -1
- package/dist/scripts/cleanup-explore-harness.js.map +1 -1
- package/dist/scripts/codex-execution-surface.js.map +1 -1
- package/dist/scripts/codex-native-hook.d.ts +4 -1
- package/dist/scripts/codex-native-hook.d.ts.map +1 -1
- package/dist/scripts/codex-native-hook.js +11577 -1184
- package/dist/scripts/codex-native-hook.js.map +1 -1
- package/dist/scripts/generate-native-release-manifest.js.map +1 -1
- package/dist/scripts/generate-release-body.js.map +1 -1
- package/dist/scripts/hook-payload-guard.d.ts.map +1 -1
- package/dist/scripts/hook-payload-guard.js.map +1 -1
- package/dist/scripts/notify-fallback-delivery.d.ts +48 -0
- package/dist/scripts/notify-fallback-delivery.d.ts.map +1 -0
- package/dist/scripts/notify-fallback-delivery.js +419 -0
- package/dist/scripts/notify-fallback-delivery.js.map +1 -0
- package/dist/scripts/notify-fallback-watcher.js +218 -138
- package/dist/scripts/notify-fallback-watcher.js.map +1 -1
- package/dist/scripts/notify-hook/auto-nudge.d.ts +18 -9
- package/dist/scripts/notify-hook/auto-nudge.d.ts.map +1 -1
- package/dist/scripts/notify-hook/auto-nudge.js +112 -15
- package/dist/scripts/notify-hook/auto-nudge.js.map +1 -1
- package/dist/scripts/notify-hook/managed-tmux.d.ts +23 -0
- package/dist/scripts/notify-hook/managed-tmux.d.ts.map +1 -1
- package/dist/scripts/notify-hook/managed-tmux.js +122 -12
- package/dist/scripts/notify-hook/managed-tmux.js.map +1 -1
- package/dist/scripts/notify-hook/orchestration-intent.d.ts +7 -7
- package/dist/scripts/notify-hook/orchestration-intent.d.ts.map +1 -1
- package/dist/scripts/notify-hook/ralph-session-resume.d.ts +5 -2
- package/dist/scripts/notify-hook/ralph-session-resume.d.ts.map +1 -1
- package/dist/scripts/notify-hook/ralph-session-resume.js +33 -37
- package/dist/scripts/notify-hook/ralph-session-resume.js.map +1 -1
- package/dist/scripts/notify-hook/state-io.d.ts +17 -0
- package/dist/scripts/notify-hook/state-io.d.ts.map +1 -1
- package/dist/scripts/notify-hook/state-io.js +73 -11
- package/dist/scripts/notify-hook/state-io.js.map +1 -1
- package/dist/scripts/notify-hook/team-dispatch.d.ts +10 -1
- package/dist/scripts/notify-hook/team-dispatch.d.ts.map +1 -1
- package/dist/scripts/notify-hook/team-dispatch.js +234 -79
- package/dist/scripts/notify-hook/team-dispatch.js.map +1 -1
- package/dist/scripts/notify-hook/team-leader-nudge.d.ts +2 -2
- package/dist/scripts/notify-hook/team-leader-nudge.d.ts.map +1 -1
- package/dist/scripts/notify-hook/team-leader-nudge.js +39 -13
- package/dist/scripts/notify-hook/team-leader-nudge.js.map +1 -1
- package/dist/scripts/notify-hook/team-tmux-guard.d.ts +16 -8
- package/dist/scripts/notify-hook/team-tmux-guard.d.ts.map +1 -1
- package/dist/scripts/notify-hook/team-tmux-guard.js +365 -44
- package/dist/scripts/notify-hook/team-tmux-guard.js.map +1 -1
- package/dist/scripts/notify-hook/team-worker-posttooluse.js.map +1 -1
- package/dist/scripts/notify-hook/team-worker-stop.d.ts +1 -1
- package/dist/scripts/notify-hook/team-worker-stop.d.ts.map +1 -1
- package/dist/scripts/notify-hook/team-worker-stop.js +19 -18
- package/dist/scripts/notify-hook/team-worker-stop.js.map +1 -1
- package/dist/scripts/notify-hook/team-worker.d.ts +5 -2
- package/dist/scripts/notify-hook/team-worker.d.ts.map +1 -1
- package/dist/scripts/notify-hook/team-worker.js +37 -28
- package/dist/scripts/notify-hook/team-worker.js.map +1 -1
- package/dist/scripts/notify-hook/tmux-injection.d.ts +8 -1
- package/dist/scripts/notify-hook/tmux-injection.d.ts.map +1 -1
- package/dist/scripts/notify-hook/tmux-injection.js +53 -18
- package/dist/scripts/notify-hook/tmux-injection.js.map +1 -1
- package/dist/scripts/notify-hook/visual-verdict.d.ts +1 -1
- package/dist/scripts/notify-hook/visual-verdict.d.ts.map +1 -1
- package/dist/scripts/notify-hook/visual-verdict.js +15 -13
- package/dist/scripts/notify-hook/visual-verdict.js.map +1 -1
- package/dist/scripts/notify-hook.d.ts +24 -1
- package/dist/scripts/notify-hook.d.ts.map +1 -1
- package/dist/scripts/notify-hook.js +267 -90
- package/dist/scripts/notify-hook.js.map +1 -1
- package/dist/scripts/postinstall.js.map +1 -1
- package/dist/scripts/prompt-inventory.js.map +1 -1
- package/dist/scripts/smoke-packed-install.d.ts +927 -5
- package/dist/scripts/smoke-packed-install.d.ts.map +1 -1
- package/dist/scripts/smoke-packed-install.js +4317 -13
- package/dist/scripts/smoke-packed-install.js.map +1 -1
- package/dist/scripts/sync-plugin-mirror.js.map +1 -1
- package/dist/scripts/test-reply-listener-live.js.map +1 -1
- package/dist/scripts/test-sparkshell.js.map +1 -1
- package/dist/scripts/verify-native-agents.js.map +1 -1
- package/dist/session-history/friction.js.map +1 -1
- package/dist/session-history/search.js.map +1 -1
- package/dist/sidecar/__tests__/boundary.test.js.map +1 -1
- package/dist/sidecar/collector.js.map +1 -1
- package/dist/sidecar/index.js.map +1 -1
- package/dist/sidecar/render.js.map +1 -1
- package/dist/sidecar/tmux.js.map +1 -1
- package/dist/state/__tests__/mode-state-context.test.js +54 -0
- package/dist/state/__tests__/mode-state-context.test.js.map +1 -1
- package/dist/state/__tests__/operations.test.js +66 -15
- package/dist/state/__tests__/operations.test.js.map +1 -1
- package/dist/state/__tests__/skill-active.test.js +19 -1
- package/dist/state/__tests__/skill-active.test.js.map +1 -1
- package/dist/state/__tests__/workflow-transition.test.js +61 -0
- package/dist/state/__tests__/workflow-transition.test.js.map +1 -1
- package/dist/state/mode-state-context.d.ts +5 -0
- package/dist/state/mode-state-context.d.ts.map +1 -1
- package/dist/state/mode-state-context.js +59 -0
- package/dist/state/mode-state-context.js.map +1 -1
- package/dist/state/operations.d.ts +1 -1
- package/dist/state/operations.d.ts.map +1 -1
- package/dist/state/operations.js +49 -55
- package/dist/state/operations.js.map +1 -1
- package/dist/state/paths.d.ts +1 -1
- package/dist/state/paths.d.ts.map +1 -1
- package/dist/state/paths.js +1 -1
- package/dist/state/paths.js.map +1 -1
- package/dist/state/skill-active.d.ts +13 -1
- package/dist/state/skill-active.d.ts.map +1 -1
- package/dist/state/skill-active.js +43 -4
- package/dist/state/skill-active.js.map +1 -1
- package/dist/state/terminal-normalization.js.map +1 -1
- package/dist/state/workflow-transition-reconcile.d.ts.map +1 -1
- package/dist/state/workflow-transition-reconcile.js +20 -4
- package/dist/state/workflow-transition-reconcile.js.map +1 -1
- package/dist/state/workflow-transition.d.ts +1 -1
- package/dist/state/workflow-transition.d.ts.map +1 -1
- package/dist/state/workflow-transition.js.map +1 -1
- package/dist/subagents/__tests__/leader-bootstrap-3181.test.d.ts +2 -0
- package/dist/subagents/__tests__/leader-bootstrap-3181.test.d.ts.map +1 -0
- package/dist/subagents/__tests__/leader-bootstrap-3181.test.js +52 -0
- package/dist/subagents/__tests__/leader-bootstrap-3181.test.js.map +1 -0
- package/dist/subagents/__tests__/tracker.test.js +1550 -10
- package/dist/subagents/__tests__/tracker.test.js.map +1 -1
- package/dist/subagents/role-routing-marker.d.ts +10 -0
- package/dist/subagents/role-routing-marker.d.ts.map +1 -0
- package/dist/subagents/role-routing-marker.js +136 -0
- package/dist/subagents/role-routing-marker.js.map +1 -0
- package/dist/subagents/tracker.d.ts +91 -0
- package/dist/subagents/tracker.d.ts.map +1 -1
- package/dist/subagents/tracker.js +806 -62
- package/dist/subagents/tracker.js.map +1 -1
- package/dist/team/__tests__/api-interop.test.js +91 -1
- package/dist/team/__tests__/api-interop.test.js.map +1 -1
- package/dist/team/__tests__/approved-execution.test.js.map +1 -1
- package/dist/team/__tests__/delivery-e2e-smoke.test.js +52 -10
- package/dist/team/__tests__/delivery-e2e-smoke.test.js.map +1 -1
- package/dist/team/__tests__/idle-nudge.test.js +45 -15
- package/dist/team/__tests__/idle-nudge.test.js.map +1 -1
- package/dist/team/__tests__/mcp-comm.test.js +93 -27
- package/dist/team/__tests__/mcp-comm.test.js.map +1 -1
- package/dist/team/__tests__/model-contract.test.js +341 -4
- package/dist/team/__tests__/model-contract.test.js.map +1 -1
- package/dist/team/__tests__/role-router.test.js.map +1 -1
- package/dist/team/__tests__/runtime-cli.test.js +9 -0
- package/dist/team/__tests__/runtime-cli.test.js.map +1 -1
- package/dist/team/__tests__/runtime.test.js +3624 -355
- package/dist/team/__tests__/runtime.test.js.map +1 -1
- package/dist/team/__tests__/scaling.test.js +2516 -118
- package/dist/team/__tests__/scaling.test.js.map +1 -1
- package/dist/team/__tests__/state-root.test.js.map +1 -1
- package/dist/team/__tests__/state.test.js +804 -36
- package/dist/team/__tests__/state.test.js.map +1 -1
- package/dist/team/__tests__/team-ops-contract.test.js +6 -0
- package/dist/team/__tests__/team-ops-contract.test.js.map +1 -1
- package/dist/team/__tests__/tmux-session.test.js +3664 -969
- package/dist/team/__tests__/tmux-session.test.js.map +1 -1
- package/dist/team/__tests__/tmux-test-fixture.js.map +1 -1
- package/dist/team/__tests__/worker-runtime-identity.test.js +38 -2
- package/dist/team/__tests__/worker-runtime-identity.test.js.map +1 -1
- package/dist/team/__tests__/worktree.test.js +6 -0
- package/dist/team/__tests__/worktree.test.js.map +1 -1
- package/dist/team/api-interop.d.ts +2 -2
- package/dist/team/api-interop.d.ts.map +1 -1
- package/dist/team/api-interop.js +15 -9
- package/dist/team/api-interop.js.map +1 -1
- package/dist/team/commit-hygiene.js.map +1 -1
- package/dist/team/contracts.d.ts +5 -5
- package/dist/team/contracts.d.ts.map +1 -1
- package/dist/team/delivery-log.js.map +1 -1
- package/dist/team/exact-pane.d.ts +23 -0
- package/dist/team/exact-pane.d.ts.map +1 -0
- package/dist/team/exact-pane.js +133 -0
- package/dist/team/exact-pane.js.map +1 -0
- package/dist/team/followup-planner.js.map +1 -1
- package/dist/team/goal-workflow.js.map +1 -1
- package/dist/team/idle-nudge.d.ts +12 -1
- package/dist/team/idle-nudge.d.ts.map +1 -1
- package/dist/team/idle-nudge.js +41 -14
- package/dist/team/idle-nudge.js.map +1 -1
- package/dist/team/model-contract.d.ts +18 -2
- package/dist/team/model-contract.d.ts.map +1 -1
- package/dist/team/model-contract.js +314 -35
- package/dist/team/model-contract.js.map +1 -1
- package/dist/team/orchestrator.js.map +1 -1
- package/dist/team/pane-status.js.map +1 -1
- package/dist/team/phase-controller.js.map +1 -1
- package/dist/team/reminder-intents.d.ts +1 -1
- package/dist/team/reminder-intents.d.ts.map +1 -1
- package/dist/team/reminder-intents.js.map +1 -1
- package/dist/team/runtime-cli.js.map +1 -1
- package/dist/team/runtime.d.ts +1 -0
- package/dist/team/runtime.d.ts.map +1 -1
- package/dist/team/runtime.js +1326 -231
- package/dist/team/runtime.js.map +1 -1
- package/dist/team/scaling.d.ts +22 -8
- package/dist/team/scaling.d.ts.map +1 -1
- package/dist/team/scaling.js +1463 -376
- package/dist/team/scaling.js.map +1 -1
- package/dist/team/state/dispatch-lock.js.map +1 -1
- package/dist/team/state/dispatch.d.ts.map +1 -1
- package/dist/team/state/dispatch.js +26 -8
- package/dist/team/state/dispatch.js.map +1 -1
- package/dist/team/state/events.js.map +1 -1
- package/dist/team/state/locks.d.ts.map +1 -1
- package/dist/team/state/locks.js +61 -13
- package/dist/team/state/locks.js.map +1 -1
- package/dist/team/state/tasks.d.ts.map +1 -1
- package/dist/team/state/tasks.js +4 -3
- package/dist/team/state/tasks.js.map +1 -1
- package/dist/team/state-root.js.map +1 -1
- package/dist/team/state.d.ts +67 -1
- package/dist/team/state.d.ts.map +1 -1
- package/dist/team/state.js +636 -129
- package/dist/team/state.js.map +1 -1
- package/dist/team/team-identity.d.ts.map +1 -1
- package/dist/team/team-identity.js.map +1 -1
- package/dist/team/team-ops.d.ts +5 -0
- package/dist/team/team-ops.d.ts.map +1 -1
- package/dist/team/team-ops.js +4 -0
- package/dist/team/team-ops.js.map +1 -1
- package/dist/team/tmux-session.d.ts +125 -23
- package/dist/team/tmux-session.d.ts.map +1 -1
- package/dist/team/tmux-session.js +1340 -333
- package/dist/team/tmux-session.js.map +1 -1
- package/dist/team/worker-bootstrap.js.map +1 -1
- package/dist/team/worktree.d.ts.map +1 -1
- package/dist/team/worktree.js +4 -0
- package/dist/team/worktree.js.map +1 -1
- package/dist/ultragoal/__tests__/artifacts.test.js.map +1 -1
- package/dist/ultragoal/__tests__/docs-contract.test.js.map +1 -1
- package/dist/ultragoal/artifacts.d.ts.map +1 -1
- package/dist/ultragoal/artifacts.js +4 -1
- package/dist/ultragoal/artifacts.js.map +1 -1
- package/dist/url-reader/index.js.map +1 -1
- package/dist/utils/__tests__/file-durability.test.d.ts +2 -0
- package/dist/utils/__tests__/file-durability.test.d.ts.map +1 -0
- package/dist/utils/__tests__/file-durability.test.js +57 -0
- package/dist/utils/__tests__/file-durability.test.js.map +1 -0
- package/dist/utils/agents-model-table.js.map +1 -1
- package/dist/utils/file-durability.d.ts +15 -0
- package/dist/utils/file-durability.d.ts.map +1 -0
- package/dist/utils/file-durability.js +37 -0
- package/dist/utils/file-durability.js.map +1 -0
- package/dist/utils/package.js.map +1 -1
- package/dist/utils/paths.js.map +1 -1
- package/dist/utils/platform-command.js.map +1 -1
- package/dist/utils/repo-deps.js.map +1 -1
- package/dist/utils/version.js.map +1 -1
- package/dist/verification/__tests__/ci-rust-gates.test.js +1 -1
- package/dist/verification/__tests__/dev-merge-issue-close-workflow.test.js +3 -0
- package/dist/verification/__tests__/dev-merge-issue-close-workflow.test.js.map +1 -1
- package/dist/verification/verifier.js.map +1 -1
- package/dist/visual/constants.d.ts +1 -1
- package/dist/visual/constants.d.ts.map +1 -1
- package/dist/vscode/__tests__/index.test.js.map +1 -1
- package/dist/vscode/index.js.map +1 -1
- package/dist/wiki/__tests__/cjk-tokenize.test.js.map +1 -1
- package/dist/wiki/__tests__/lint.test.js.map +1 -1
- package/dist/wiki/__tests__/query.test.js.map +1 -1
- package/dist/wiki/__tests__/storage.test.js.map +1 -1
- package/dist/wiki/__tests__/test-helpers.d.ts.map +1 -1
- package/dist/wiki/lint.d.ts +4 -1
- package/dist/wiki/lint.d.ts.map +1 -1
- package/dist/wiki/lint.js +3 -2
- package/dist/wiki/lint.js.map +1 -1
- package/dist/wiki/query.js.map +1 -1
- package/dist/wiki/storage.js.map +1 -1
- package/package.json +2 -2
- package/plugins/oh-my-codex/.codex-plugin/plugin.json +1 -1
- package/plugins/oh-my-codex/hooks/codex-native-hook.mjs +24 -0
- package/plugins/oh-my-codex/skills/omx-setup/SKILL.md +10 -5
- package/plugins/oh-my-codex/skills/ralph/SKILL.md +6 -2
- package/plugins/oh-my-codex/skills/ralplan/SKILL.md +6 -2
- package/plugins/oh-my-codex/skills/team/SKILL.md +13 -9
- package/skills/omx-setup/SKILL.md +10 -5
- package/skills/ralph/SKILL.md +6 -2
- package/skills/ralplan/SKILL.md +6 -2
- package/skills/team/SKILL.md +13 -9
- package/src/scripts/__tests__/codex-native-hook.test.ts +20048 -10827
- package/src/scripts/__tests__/fixtures/issue-3138-installed-smoke.ts +734 -0
- package/src/scripts/__tests__/notify-fallback-delivery.test.ts +177 -0
- package/src/scripts/__tests__/notify-state-io.test.ts +73 -0
- package/src/scripts/__tests__/reasoning-artifact-contract.test.ts +129 -0
- package/src/scripts/__tests__/role-intent-bootstrap-e2e-3181.test.ts +78 -0
- package/src/scripts/__tests__/role-intent-durable-recovery-3181.test.ts +60 -0
- package/src/scripts/__tests__/smoke-packed-install.test.ts +1309 -4
- package/src/scripts/codex-native-hook.ts +11429 -1163
- package/src/scripts/notify-fallback-delivery.ts +416 -0
- package/src/scripts/notify-fallback-watcher.ts +216 -155
- package/src/scripts/notify-hook/auto-nudge.ts +113 -14
- package/src/scripts/notify-hook/managed-tmux.ts +149 -12
- package/src/scripts/notify-hook/ralph-session-resume.ts +37 -36
- package/src/scripts/notify-hook/state-io.ts +100 -13
- package/src/scripts/notify-hook/team-dispatch.ts +242 -75
- package/src/scripts/notify-hook/team-leader-nudge.ts +40 -18
- package/src/scripts/notify-hook/team-tmux-guard.ts +366 -39
- package/src/scripts/notify-hook/team-worker-stop.ts +20 -16
- package/src/scripts/notify-hook/team-worker.ts +39 -26
- package/src/scripts/notify-hook/tmux-injection.ts +66 -23
- package/src/scripts/notify-hook/visual-verdict.ts +22 -12
- package/src/scripts/notify-hook.ts +336 -90
- package/src/scripts/smoke-packed-install.ts +5154 -149
|
@@ -25,12 +25,17 @@ import { readAutoresearchCompletionStatus } from '../../autoresearch/skill-valid
|
|
|
25
25
|
import { persistDeepInterviewModeState } from '../../hooks/keyword-detector.js';
|
|
26
26
|
import {
|
|
27
27
|
isManagedOmxSession,
|
|
28
|
+
isManagedOmxSessionAtPromptContext,
|
|
28
29
|
resolveManagedCurrentPane,
|
|
30
|
+
resolveManagedCurrentPaneAtPromptContext,
|
|
29
31
|
resolveManagedPaneFromAnchor,
|
|
32
|
+
resolveManagedPaneFromAnchorAtPromptContext,
|
|
30
33
|
resolveManagedSessionPane,
|
|
34
|
+
resolveManagedSessionPaneAtPromptContext,
|
|
31
35
|
resolveInvocationSessionId,
|
|
32
36
|
verifyManagedPaneTarget,
|
|
33
37
|
} from './managed-tmux.js';
|
|
38
|
+
import type { PromptMutationAuthorization, ResolvedPromptTurnContext } from '../../hooks/prompt-session-provenance.js';
|
|
34
39
|
|
|
35
40
|
export const SKILL_ACTIVE_STATE_FILE = 'skill-active-state.json';
|
|
36
41
|
export const DEEP_INTERVIEW_BLOCKED_APPROVAL_INPUTS = ['yes', 'y', 'proceed', 'continue', 'ok', 'sure', 'go ahead', 'next i should'];
|
|
@@ -161,6 +166,7 @@ export function normalizeSkillActiveState(raw) {
|
|
|
161
166
|
activated_at: safeString(raw.activated_at),
|
|
162
167
|
updated_at: safeString(raw.updated_at),
|
|
163
168
|
source: safeString(raw.source),
|
|
169
|
+
owner_codex_session_id: safeString(raw.owner_codex_session_id),
|
|
164
170
|
input_lock: normalizeInputLock(raw.input_lock),
|
|
165
171
|
};
|
|
166
172
|
}
|
|
@@ -210,16 +216,28 @@ function cloneSkillActiveState(state) {
|
|
|
210
216
|
};
|
|
211
217
|
}
|
|
212
218
|
|
|
213
|
-
export async function syncSkillStateFromTurn(stateDir, payload) {
|
|
219
|
+
export async function syncSkillStateFromTurn(stateDir, payload, invocationSessionIdOverride = '', authorization: PromptMutationAuthorization | null = null) {
|
|
214
220
|
const lastMessage = safeString(payload['last-assistant-message'] || payload.last_assistant_message || '');
|
|
215
221
|
const latestUserInput = latestUserInputFromPayload(payload);
|
|
216
|
-
const invocationSessionId = resolveInvocationSessionId(payload);
|
|
222
|
+
const invocationSessionId = invocationSessionIdOverride || resolveInvocationSessionId(payload);
|
|
217
223
|
let skillState = await loadSkillActiveState(stateDir, invocationSessionId);
|
|
218
224
|
let releaseReason = null;
|
|
219
225
|
|
|
220
226
|
if (!skillState) {
|
|
221
227
|
return { invocationSessionId, skillState: null, releaseReason };
|
|
222
228
|
}
|
|
229
|
+
if (authorization) {
|
|
230
|
+
const allowedOwners = Array.isArray(authorization.allowedOwnerCodexSessionIds)
|
|
231
|
+
? authorization.allowedOwnerCodexSessionIds
|
|
232
|
+
: [];
|
|
233
|
+
const existingOwner = safeString(skillState.owner_codex_session_id).trim();
|
|
234
|
+
if (existingOwner && !allowedOwners.includes(existingOwner)) {
|
|
235
|
+
return { invocationSessionId, skillState: null, releaseReason: 'owner_conflict' };
|
|
236
|
+
}
|
|
237
|
+
if (authorization.ownerCodexSessionId) {
|
|
238
|
+
skillState.owner_codex_session_id = authorization.ownerCodexSessionId;
|
|
239
|
+
}
|
|
240
|
+
}
|
|
223
241
|
|
|
224
242
|
const previousSkillState = cloneSkillActiveState(skillState);
|
|
225
243
|
const previousPhase = normalizeSkillPhase(skillState.phase);
|
|
@@ -541,12 +559,50 @@ export async function capturePane(paneId, lines = 10) {
|
|
|
541
559
|
}
|
|
542
560
|
}
|
|
543
561
|
|
|
544
|
-
|
|
562
|
+
async function resolveTeamWorkerNudgeBinding(stateDir: string): Promise<{
|
|
563
|
+
paneId: string;
|
|
564
|
+
panePid: number;
|
|
565
|
+
paneOwnerId: string;
|
|
566
|
+
hudPaneId: string;
|
|
567
|
+
} | null> {
|
|
568
|
+
const workerContext = safeString(process.env.OMX_TEAM_WORKER || '').trim();
|
|
569
|
+
if (!workerContext) return null;
|
|
570
|
+
const match = /^([A-Za-z0-9][A-Za-z0-9_-]*)\/(worker-[1-9]\d*)$/.exec(workerContext);
|
|
571
|
+
if (!match) return null;
|
|
572
|
+
const [, teamName, workerName] = match;
|
|
573
|
+
const teamDir = join(stateDir, 'team', teamName);
|
|
574
|
+
try {
|
|
575
|
+
const manifestPath = join(teamDir, 'manifest.v2.json');
|
|
576
|
+
const configPath = join(teamDir, 'config.json');
|
|
577
|
+
let raw: any;
|
|
578
|
+
try {
|
|
579
|
+
raw = JSON.parse(await readFile(manifestPath, 'utf-8'));
|
|
580
|
+
} catch {
|
|
581
|
+
raw = JSON.parse(await readFile(configPath, 'utf-8'));
|
|
582
|
+
}
|
|
583
|
+
if (safeString(raw?.name).trim() !== teamName || !Array.isArray(raw?.workers)) return null;
|
|
584
|
+
const worker = raw.workers.find((entry: any) => safeString(entry?.name).trim() === workerName);
|
|
585
|
+
const paneId = safeString(worker?.pane_id).trim();
|
|
586
|
+
const panePid = asNumber(worker?.pid);
|
|
587
|
+
const hudPaneId = safeString(raw?.hud_pane_id).trim();
|
|
588
|
+
const paneOwnerId = typeof raw?.tmux_pane_owner_id === 'string' ? raw.tmux_pane_owner_id.trim() : '';
|
|
589
|
+
if (!/^%\d+$/.test(paneId) || !Number.isInteger(panePid) || panePid <= 0 || !paneOwnerId || paneId === hudPaneId) return null;
|
|
590
|
+
return { paneId, panePid, paneOwnerId, hudPaneId };
|
|
591
|
+
} catch {
|
|
592
|
+
return null;
|
|
593
|
+
}
|
|
594
|
+
}
|
|
595
|
+
|
|
596
|
+
export async function resolveNudgePaneTarget(stateDir: any, cwd = '', payload: any = undefined, context: ResolvedPromptTurnContext | null = null) {
|
|
545
597
|
const allowTeamWorker = safeString(process.env.OMX_TEAM_WORKER || '').trim() !== '';
|
|
546
|
-
const managedCurrentPane =
|
|
598
|
+
const managedCurrentPane = context
|
|
599
|
+
? await resolveManagedCurrentPaneAtPromptContext(cwd, context)
|
|
600
|
+
: await resolveManagedCurrentPane(cwd, payload, { allowTeamWorker });
|
|
547
601
|
if (managedCurrentPane) return managedCurrentPane;
|
|
548
602
|
|
|
549
|
-
const invocationSessionId =
|
|
603
|
+
const invocationSessionId = context?.status === 'authorized'
|
|
604
|
+
? context.authorization.targetSessionId
|
|
605
|
+
: resolveInvocationSessionId(payload);
|
|
550
606
|
const scopedDirs = await getScopedStateDirsForCurrentSession(stateDir, invocationSessionId).catch(() => []);
|
|
551
607
|
for (const dir of scopedDirs) {
|
|
552
608
|
const files = await readdir(dir).catch(() => []);
|
|
@@ -558,9 +614,11 @@ export async function resolveNudgePaneTarget(stateDir: any, cwd = '', payload: a
|
|
|
558
614
|
if (!state || !state.active || !state.tmux_pane_id) continue;
|
|
559
615
|
const anchoredPane = safeString(state.tmux_pane_id).trim();
|
|
560
616
|
if (!anchoredPane) continue;
|
|
561
|
-
const managedPane =
|
|
617
|
+
const managedPane = context
|
|
618
|
+
? await resolveManagedPaneFromAnchorAtPromptContext(anchoredPane, cwd, context)
|
|
619
|
+
: await resolveManagedPaneFromAnchor(anchoredPane, cwd, payload, { allowTeamWorker });
|
|
562
620
|
if (managedPane) return managedPane;
|
|
563
|
-
if (allowTeamWorker) {
|
|
621
|
+
if (allowTeamWorker && !context) {
|
|
564
622
|
const verdict = await verifyManagedPaneTarget(anchoredPane, cwd, payload, { allowTeamWorker });
|
|
565
623
|
if (verdict.ok) return anchoredPane;
|
|
566
624
|
}
|
|
@@ -570,10 +628,12 @@ export async function resolveNudgePaneTarget(stateDir: any, cwd = '', payload: a
|
|
|
570
628
|
}
|
|
571
629
|
}
|
|
572
630
|
|
|
573
|
-
return
|
|
631
|
+
return context
|
|
632
|
+
? await resolveManagedSessionPaneAtPromptContext(cwd, context)
|
|
633
|
+
: await resolveManagedSessionPane(cwd, payload);
|
|
574
634
|
}
|
|
575
635
|
|
|
576
|
-
export async function maybeAutoNudge({ cwd, stateDir, logsDir, payload }) {
|
|
636
|
+
export async function maybeAutoNudge({ cwd, stateDir, logsDir, payload, context = null, syncResult = null }: { cwd: string; stateDir: string; logsDir: string; payload: any; context?: ResolvedPromptTurnContext | null; syncResult?: any }) {
|
|
577
637
|
const config = await loadAutoNudgeConfig();
|
|
578
638
|
const effectiveResponse = resolveEffectiveAutoNudgeResponse(config.response);
|
|
579
639
|
if (!config.enabled) return;
|
|
@@ -587,7 +647,9 @@ export async function maybeAutoNudge({ cwd, stateDir, logsDir, payload }) {
|
|
|
587
647
|
}
|
|
588
648
|
|
|
589
649
|
const sourceName = safeString(payload?.source || '');
|
|
590
|
-
const managedSession =
|
|
650
|
+
const managedSession = context
|
|
651
|
+
? await isManagedOmxSessionAtPromptContext(cwd, context, { allowTeamWorker: false })
|
|
652
|
+
: await isManagedOmxSession(cwd, payload, { allowTeamWorker: true });
|
|
591
653
|
if (!managedSession) {
|
|
592
654
|
if (sourceName === 'notify-fallback-watcher-stall') return;
|
|
593
655
|
await logTmuxHookEvent(logsDir, {
|
|
@@ -599,7 +661,10 @@ export async function maybeAutoNudge({ cwd, stateDir, logsDir, payload }) {
|
|
|
599
661
|
}
|
|
600
662
|
|
|
601
663
|
const lastMessage = safeString(payload['last-assistant-message'] || payload.last_assistant_message || '');
|
|
602
|
-
const { invocationSessionId, skillState, releaseReason } =
|
|
664
|
+
const { invocationSessionId, skillState, releaseReason } = syncResult
|
|
665
|
+
|| (context?.status === 'authorized'
|
|
666
|
+
? { invocationSessionId: context.authorization.targetSessionId, skillState: null, releaseReason: null }
|
|
667
|
+
: await syncSkillStateFromTurn(stateDir, payload));
|
|
603
668
|
|
|
604
669
|
try {
|
|
605
670
|
const nudgeStatePath = await getScopedStatePath(stateDir, 'auto-nudge-state.json', invocationSessionId);
|
|
@@ -607,14 +672,34 @@ export async function maybeAutoNudge({ cwd, stateDir, logsDir, payload }) {
|
|
|
607
672
|
if (!nudgeState || typeof nudgeState !== 'object') {
|
|
608
673
|
nudgeState = { nudgeCount: 0, lastNudgeAt: '', lastSignature: '', lastSemanticSignature: '' };
|
|
609
674
|
}
|
|
610
|
-
const
|
|
675
|
+
const teamWorkerBinding = await resolveTeamWorkerNudgeBinding(stateDir);
|
|
676
|
+
if (safeString(process.env.OMX_TEAM_WORKER || '').trim() && !teamWorkerBinding) return;
|
|
677
|
+
const paneId = teamWorkerBinding?.paneId
|
|
678
|
+
?? await resolveNudgePaneTarget(stateDir, cwd, payload, context);
|
|
679
|
+
const teamPaneOptions = teamWorkerBinding
|
|
680
|
+
? {
|
|
681
|
+
exactPaneId: teamWorkerBinding.paneId,
|
|
682
|
+
expectedPanePid: teamWorkerBinding.panePid,
|
|
683
|
+
expectedPaneOwnerId: teamWorkerBinding.paneOwnerId,
|
|
684
|
+
expectedHudPaneId: teamWorkerBinding.hudPaneId,
|
|
685
|
+
}
|
|
686
|
+
: { exactPaneId: paneId };
|
|
611
687
|
|
|
612
688
|
let detected = detectStallPattern(lastMessage, config.patterns, skillState?.phase);
|
|
613
689
|
let source = 'payload';
|
|
614
690
|
let captured = '';
|
|
615
691
|
|
|
616
692
|
if (!detected && paneId) {
|
|
617
|
-
|
|
693
|
+
if (teamWorkerBinding) {
|
|
694
|
+
const captureGuard = await evaluatePaneInjectionReadiness(paneId, {
|
|
695
|
+
skipIfScrolling: true,
|
|
696
|
+
...teamPaneOptions,
|
|
697
|
+
});
|
|
698
|
+
if (!captureGuard.ok) return;
|
|
699
|
+
captured = captureGuard.paneCapture;
|
|
700
|
+
} else {
|
|
701
|
+
captured = await capturePane(paneId);
|
|
702
|
+
}
|
|
618
703
|
detected = detectStallPattern(filterCapturedTestLines(captured), config.patterns, skillState?.phase);
|
|
619
704
|
source = 'capture-pane';
|
|
620
705
|
}
|
|
@@ -675,7 +760,7 @@ export async function maybeAutoNudge({ cwd, stateDir, logsDir, payload }) {
|
|
|
675
760
|
return;
|
|
676
761
|
}
|
|
677
762
|
|
|
678
|
-
const paneGuard = await evaluatePaneInjectionReadiness(paneId, { skipIfScrolling: true });
|
|
763
|
+
const paneGuard = await evaluatePaneInjectionReadiness(paneId, { skipIfScrolling: true, ...teamPaneOptions });
|
|
679
764
|
if (!paneGuard.ok) {
|
|
680
765
|
await logTmuxHookEvent(logsDir, {
|
|
681
766
|
timestamp: new Date().toISOString(),
|
|
@@ -688,6 +773,18 @@ export async function maybeAutoNudge({ cwd, stateDir, logsDir, payload }) {
|
|
|
688
773
|
}).catch(() => {});
|
|
689
774
|
return;
|
|
690
775
|
}
|
|
776
|
+
const readinessPanePid = asNumber(paneGuard.exactPaneProof?.pid);
|
|
777
|
+
if (!Number.isInteger(readinessPanePid) || readinessPanePid <= 0) {
|
|
778
|
+
await logTmuxHookEvent(logsDir, {
|
|
779
|
+
timestamp: new Date().toISOString(),
|
|
780
|
+
type: 'auto_nudge_skipped',
|
|
781
|
+
pane_id: paneId,
|
|
782
|
+
reason: 'pane_readiness_unverified',
|
|
783
|
+
source,
|
|
784
|
+
}).catch(() => {});
|
|
785
|
+
return;
|
|
786
|
+
}
|
|
787
|
+
const pinnedPaneOptions = { ...teamPaneOptions, expectedPanePid: readinessPanePid };
|
|
691
788
|
|
|
692
789
|
const blockedAutoApproval = isDeepInterviewAutoApprovalLocked(skillState)
|
|
693
790
|
&& !releaseReason
|
|
@@ -716,6 +813,8 @@ export async function maybeAutoNudge({ cwd, stateDir, logsDir, payload }) {
|
|
|
716
813
|
try {
|
|
717
814
|
const sendResult = await sendPaneInput({
|
|
718
815
|
paneTarget: paneId,
|
|
816
|
+
exactPaneId: paneId,
|
|
817
|
+
...pinnedPaneOptions,
|
|
719
818
|
prompt: `${effectiveResponse} ${DEFAULT_MARKER}`,
|
|
720
819
|
submitKeyPresses: 2,
|
|
721
820
|
submitDelayMs: 100,
|
|
@@ -5,6 +5,8 @@ import { readSessionState, isSessionStale } from '../../hooks/session.js';
|
|
|
5
5
|
import { runProcess } from './process-runner.js';
|
|
6
6
|
import { safeString } from './utils.js';
|
|
7
7
|
import { sameFilePath } from '../../utils/paths.js';
|
|
8
|
+
import type { ResolvedPromptTurnContext } from '../../hooks/prompt-session-provenance.js';
|
|
9
|
+
|
|
8
10
|
|
|
9
11
|
const OMX_INSTANCE_OPTION = '@omx_instance_id';
|
|
10
12
|
const OMX_PANE_INSTANCE_OPTION = '@omx_pane_instance_id';
|
|
@@ -82,20 +84,30 @@ function readCurrentTmuxSessionName(): string {
|
|
|
82
84
|
}
|
|
83
85
|
}
|
|
84
86
|
|
|
85
|
-
|
|
87
|
+
interface TmuxOptionProbe {
|
|
88
|
+
status: 'present' | 'absent' | 'error';
|
|
89
|
+
value: string;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
async function probeTmuxOption(targetValue: string, optionName: string, { pane = false } = {}): Promise<TmuxOptionProbe> {
|
|
86
93
|
const target = safeString(targetValue).trim();
|
|
87
|
-
if (!target) return '';
|
|
94
|
+
if (!target) return { status: 'absent', value: '' };
|
|
88
95
|
const args = ['show-option', '-qv'];
|
|
89
96
|
if (pane) args.push('-p');
|
|
90
97
|
args.push('-t', target, optionName);
|
|
91
98
|
try {
|
|
92
99
|
const result = await runProcess('tmux', args, 2000);
|
|
93
|
-
|
|
100
|
+
const value = safeString(result.stdout).trim();
|
|
101
|
+
return { status: value ? 'present' : 'absent', value };
|
|
94
102
|
} catch {
|
|
95
|
-
return '';
|
|
103
|
+
return { status: 'error', value: '' };
|
|
96
104
|
}
|
|
97
105
|
}
|
|
98
106
|
|
|
107
|
+
async function readTmuxOption(targetValue: string, optionName: string, { pane = false } = {}): Promise<string> {
|
|
108
|
+
return (await probeTmuxOption(targetValue, optionName, { pane })).value;
|
|
109
|
+
}
|
|
110
|
+
|
|
99
111
|
async function readTmuxSessionInstanceId(sessionTarget: string): Promise<string> {
|
|
100
112
|
return readTmuxOption(sessionTarget, OMX_INSTANCE_OPTION);
|
|
101
113
|
}
|
|
@@ -104,6 +116,86 @@ async function readTmuxPaneInstanceId(paneTarget: string): Promise<string> {
|
|
|
104
116
|
return readTmuxOption(paneTarget, OMX_PANE_INSTANCE_OPTION, { pane: true });
|
|
105
117
|
}
|
|
106
118
|
|
|
119
|
+
export interface ActualTmuxInstanceEvidence {
|
|
120
|
+
paneTarget: string;
|
|
121
|
+
sessionName: string;
|
|
122
|
+
paneInstanceId: string;
|
|
123
|
+
sessionInstanceId: string;
|
|
124
|
+
instanceId: string;
|
|
125
|
+
source: 'none' | 'pane' | 'session';
|
|
126
|
+
paneTagStatus: 'not-requested' | 'present' | 'absent' | 'error';
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
export async function probeActualTmuxInstanceEvidence(paneTarget?: string): Promise<ActualTmuxInstanceEvidence> {
|
|
130
|
+
const resolvedPaneTarget = safeString(paneTarget ?? process.env.TMUX_PANE ?? '').trim();
|
|
131
|
+
let sessionName = '';
|
|
132
|
+
if (resolvedPaneTarget) {
|
|
133
|
+
try {
|
|
134
|
+
const result = await runProcess('tmux', ['display-message', '-p', '-t', resolvedPaneTarget, '#S'], 2000);
|
|
135
|
+
sessionName = safeString(result.stdout).trim();
|
|
136
|
+
} catch {
|
|
137
|
+
// A pane target without a session cannot provide session-tag evidence.
|
|
138
|
+
}
|
|
139
|
+
} else {
|
|
140
|
+
sessionName = readCurrentTmuxSessionName();
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
const paneProbe = resolvedPaneTarget
|
|
144
|
+
? await probeTmuxOption(resolvedPaneTarget, OMX_PANE_INSTANCE_OPTION, { pane: true })
|
|
145
|
+
: { status: 'absent' as const, value: '' };
|
|
146
|
+
const paneTagStatus = resolvedPaneTarget ? paneProbe.status : 'not-requested';
|
|
147
|
+
if (paneProbe.status === 'present') {
|
|
148
|
+
return {
|
|
149
|
+
paneTarget: resolvedPaneTarget,
|
|
150
|
+
sessionName,
|
|
151
|
+
paneInstanceId: paneProbe.value,
|
|
152
|
+
sessionInstanceId: '',
|
|
153
|
+
instanceId: paneProbe.value,
|
|
154
|
+
source: 'pane',
|
|
155
|
+
paneTagStatus,
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
if (paneProbe.status === 'error') {
|
|
159
|
+
return {
|
|
160
|
+
paneTarget: resolvedPaneTarget,
|
|
161
|
+
sessionName,
|
|
162
|
+
paneInstanceId: '',
|
|
163
|
+
sessionInstanceId: '',
|
|
164
|
+
instanceId: '',
|
|
165
|
+
source: 'none',
|
|
166
|
+
paneTagStatus,
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
const sessionInstanceId = sessionName
|
|
171
|
+
? await readTmuxSessionInstanceId(sessionName)
|
|
172
|
+
: '';
|
|
173
|
+
return {
|
|
174
|
+
paneTarget: resolvedPaneTarget,
|
|
175
|
+
sessionName,
|
|
176
|
+
paneInstanceId: '',
|
|
177
|
+
sessionInstanceId,
|
|
178
|
+
instanceId: sessionInstanceId,
|
|
179
|
+
source: sessionInstanceId ? 'session' : 'none',
|
|
180
|
+
paneTagStatus,
|
|
181
|
+
};
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
export function tmuxEvidenceBindsCandidate(
|
|
185
|
+
evidence: ActualTmuxInstanceEvidence,
|
|
186
|
+
candidateSessionId: string,
|
|
187
|
+
): boolean {
|
|
188
|
+
const candidate = safeString(candidateSessionId).trim();
|
|
189
|
+
if (!candidate) return false;
|
|
190
|
+
if (evidence.paneTagStatus === 'present') {
|
|
191
|
+
return evidence.source === 'pane' && evidence.paneInstanceId === candidate;
|
|
192
|
+
}
|
|
193
|
+
return evidence.paneTagStatus === 'absent'
|
|
194
|
+
&& evidence.source === 'session'
|
|
195
|
+
&& evidence.sessionInstanceId === candidate;
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
|
|
107
199
|
function warnPaneInstanceFallback(paneTarget: string): void {
|
|
108
200
|
// Notify hooks run inside Codex foreground hook surfaces. Keep this
|
|
109
201
|
// compatibility fallback silent; downstream tmux-hook events still record
|
|
@@ -218,9 +310,10 @@ export async function resolveManagedSessionContext(
|
|
|
218
310
|
authoritativeSessionCwd,
|
|
219
311
|
canonicalSessionId || invocationSessionId,
|
|
220
312
|
);
|
|
221
|
-
const
|
|
222
|
-
const
|
|
223
|
-
const
|
|
313
|
+
const evidence = await probeActualTmuxInstanceEvidence(paneTarget);
|
|
314
|
+
const currentTmuxSessionName = evidence.sessionName || readCurrentTmuxSessionName();
|
|
315
|
+
const currentTmuxPaneTarget = evidence.paneTarget;
|
|
316
|
+
const currentTmuxPaneInstanceId = evidence.paneInstanceId;
|
|
224
317
|
if (currentTmuxPaneInstanceId && currentTmuxPaneInstanceId !== invocationSessionId) {
|
|
225
318
|
return {
|
|
226
319
|
managed: false,
|
|
@@ -248,7 +341,11 @@ export async function resolveManagedSessionContext(
|
|
|
248
341
|
};
|
|
249
342
|
}
|
|
250
343
|
|
|
251
|
-
const currentTmuxInstanceId =
|
|
344
|
+
const currentTmuxInstanceId = evidence.sessionName === currentTmuxSessionName
|
|
345
|
+
? evidence.sessionInstanceId
|
|
346
|
+
: currentTmuxSessionName
|
|
347
|
+
? await readTmuxSessionInstanceId(currentTmuxSessionName)
|
|
348
|
+
: '';
|
|
252
349
|
if (currentTmuxInstanceId && currentTmuxInstanceId !== invocationSessionId) {
|
|
253
350
|
return {
|
|
254
351
|
managed: false,
|
|
@@ -359,6 +456,39 @@ export async function isManagedOmxSession(cwd: string, payload: any, options: {
|
|
|
359
456
|
return context.managed === true;
|
|
360
457
|
}
|
|
361
458
|
|
|
459
|
+
/**
|
|
460
|
+
* Leader-only adapter: tmux ownership is derived from the immutable provenance
|
|
461
|
+
* owner instead of re-reading payload or environment session identity.
|
|
462
|
+
*/
|
|
463
|
+
export async function isManagedOmxSessionAtPromptContext(
|
|
464
|
+
cwd: string,
|
|
465
|
+
context: ResolvedPromptTurnContext,
|
|
466
|
+
options: { allowTeamWorker?: boolean } = {},
|
|
467
|
+
): Promise<boolean> {
|
|
468
|
+
if (context.status !== 'authorized') return false;
|
|
469
|
+
return isManagedOmxSession(cwd, { session_id: context.authorization.ownerCodexSessionId }, options);
|
|
470
|
+
}
|
|
471
|
+
|
|
472
|
+
export async function verifyManagedPaneTargetAtPromptContext(paneId: string, cwd: string, context: ResolvedPromptTurnContext): Promise<any> {
|
|
473
|
+
if (context.status !== 'authorized') return { ok: false, reason: 'prompt_context_unauthorized', paneTarget: safeString(paneId).trim() };
|
|
474
|
+
return verifyManagedPaneTarget(paneId, cwd, { session_id: context.authorization.ownerCodexSessionId }, { allowTeamWorker: false });
|
|
475
|
+
}
|
|
476
|
+
|
|
477
|
+
export async function resolveManagedCurrentPaneAtPromptContext(cwd: string, context: ResolvedPromptTurnContext): Promise<string> {
|
|
478
|
+
if (context.status !== 'authorized') return '';
|
|
479
|
+
return resolveManagedCurrentPane(cwd, { session_id: context.authorization.ownerCodexSessionId }, { allowTeamWorker: false });
|
|
480
|
+
}
|
|
481
|
+
|
|
482
|
+
export async function resolveManagedSessionPaneAtPromptContext(cwd: string, context: ResolvedPromptTurnContext): Promise<string> {
|
|
483
|
+
if (context.status !== 'authorized') return '';
|
|
484
|
+
return resolveManagedSessionPane(cwd, { session_id: context.authorization.ownerCodexSessionId });
|
|
485
|
+
}
|
|
486
|
+
|
|
487
|
+
export async function resolveManagedPaneFromAnchorAtPromptContext(anchorPane: string, cwd: string, context: ResolvedPromptTurnContext): Promise<string> {
|
|
488
|
+
if (context.status !== 'authorized') return '';
|
|
489
|
+
return resolveManagedPaneFromAnchor(anchorPane, cwd, { session_id: context.authorization.ownerCodexSessionId }, { allowTeamWorker: false });
|
|
490
|
+
}
|
|
491
|
+
|
|
362
492
|
export async function verifyManagedPaneTarget(paneId: string, cwd: string, payload: any, { allowTeamWorker = true } = {}): Promise<any> {
|
|
363
493
|
const paneTarget = safeString(paneId).trim();
|
|
364
494
|
if (!paneTarget) {
|
|
@@ -380,13 +510,20 @@ export async function verifyManagedPaneTarget(paneId: string, cwd: string, paylo
|
|
|
380
510
|
}
|
|
381
511
|
|
|
382
512
|
try {
|
|
383
|
-
|
|
384
|
-
|
|
513
|
+
let paneSessionName = safeString(managedContext.currentTmuxSessionName).trim();
|
|
514
|
+
if (!paneSessionName) {
|
|
515
|
+
const sessionResult = await runProcess('tmux', ['display-message', '-p', '-t', paneTarget, '#S'], 2000);
|
|
516
|
+
paneSessionName = safeString(sessionResult.stdout).trim();
|
|
517
|
+
}
|
|
385
518
|
if (!paneSessionName) {
|
|
386
519
|
return { ok: false, reason: 'pane_session_missing', paneTarget, managedContext };
|
|
387
520
|
}
|
|
388
|
-
const paneInstanceId =
|
|
389
|
-
|
|
521
|
+
const paneInstanceId = safeString(managedContext.currentTmuxPaneInstanceId).trim()
|
|
522
|
+
|| await readTmuxPaneInstanceId(paneTarget);
|
|
523
|
+
const sessionInstanceId = paneInstanceId
|
|
524
|
+
? ''
|
|
525
|
+
: safeString(managedContext.currentTmuxInstanceId).trim()
|
|
526
|
+
|| await readTmuxSessionInstanceId(paneSessionName);
|
|
390
527
|
if (paneInstanceId && paneInstanceId !== managedContext.invocationSessionId) {
|
|
391
528
|
return { ok: false, reason: 'pane_instance_mismatch', paneTarget, paneSessionName, paneInstanceId, managedContext };
|
|
392
529
|
}
|
|
@@ -4,6 +4,7 @@ import { dirname, join } from 'path';
|
|
|
4
4
|
import { captureTmuxPaneFromEnv } from '../../state/mode-state-context.js';
|
|
5
5
|
import { resolveCodexPane } from '../tmux-hook-engine.js';
|
|
6
6
|
import { safeString } from './utils.js';
|
|
7
|
+
import type { PromptMutationAuthorization } from '../../hooks/prompt-session-provenance.js';
|
|
7
8
|
|
|
8
9
|
const SESSION_ID_PATTERN = /^[A-Za-z0-9_-]{1,64}$/;
|
|
9
10
|
const RALPH_TERMINAL_PHASES = new Set(['blocked_on_user', 'complete', 'failed', 'cancelled', 'interrupted']);
|
|
@@ -19,7 +20,9 @@ interface RalphSessionResumeHooks {
|
|
|
19
20
|
|
|
20
21
|
interface RalphSessionResumeParams {
|
|
21
22
|
stateDir: string;
|
|
22
|
-
|
|
23
|
+
authorization?: PromptMutationAuthorization;
|
|
24
|
+
/** Worker-only legacy identity; leader resume requires authorization. */
|
|
25
|
+
payloadSessionId?: string;
|
|
23
26
|
payloadThreadId?: string;
|
|
24
27
|
env?: NodeJS.ProcessEnv;
|
|
25
28
|
hooks?: RalphSessionResumeHooks;
|
|
@@ -210,25 +213,6 @@ async function markRalphStateAbandoned(
|
|
|
210
213
|
});
|
|
211
214
|
}
|
|
212
215
|
|
|
213
|
-
function readSessionIdFromEnvironment(env: NodeJS.ProcessEnv = process.env): string {
|
|
214
|
-
const candidates = [env.OMX_SESSION_ID, env.CODEX_SESSION_ID, env.SESSION_ID];
|
|
215
|
-
for (const candidate of candidates) {
|
|
216
|
-
const sessionId = safeString(candidate).trim();
|
|
217
|
-
if (SESSION_ID_PATTERN.test(sessionId)) return sessionId;
|
|
218
|
-
}
|
|
219
|
-
return '';
|
|
220
|
-
}
|
|
221
|
-
|
|
222
|
-
async function readCurrentOmxSessionId(stateDir: string, env: NodeJS.ProcessEnv = process.env): Promise<string> {
|
|
223
|
-
const envSessionId = readSessionIdFromEnvironment(env);
|
|
224
|
-
if (envSessionId) return envSessionId;
|
|
225
|
-
|
|
226
|
-
const session = await readJson(join(stateDir, 'session.json'));
|
|
227
|
-
if (!session || typeof session !== 'object') return '';
|
|
228
|
-
const sessionId = safeString(session?.session_id).trim();
|
|
229
|
-
return SESSION_ID_PATTERN.test(sessionId) ? sessionId : '';
|
|
230
|
-
}
|
|
231
|
-
|
|
232
216
|
function resolveResumePane(env: NodeJS.ProcessEnv = process.env): string {
|
|
233
217
|
const injectedPane = captureTmuxPaneFromEnv(env);
|
|
234
218
|
if (env !== process.env && injectedPane) return injectedPane;
|
|
@@ -249,8 +233,9 @@ function bindCurrentPane(state: Record<string, unknown>, nowIso: string, env: No
|
|
|
249
233
|
async function scanMatchingRalphCandidates(
|
|
250
234
|
stateDir: string,
|
|
251
235
|
currentOmxSessionId: string,
|
|
252
|
-
|
|
236
|
+
ownerCodexSessionId: string,
|
|
253
237
|
payloadThreadId: string,
|
|
238
|
+
allowedStorageSessionIds: readonly string[],
|
|
254
239
|
env: NodeJS.ProcessEnv = process.env,
|
|
255
240
|
): Promise<{ candidates: RalphStateCandidate[]; abandonedCount: number }> {
|
|
256
241
|
const sessionsRoot = join(stateDir, 'sessions');
|
|
@@ -260,18 +245,15 @@ async function scanMatchingRalphCandidates(
|
|
|
260
245
|
const matches: RalphStateCandidate[] = [];
|
|
261
246
|
let abandonedCount = 0;
|
|
262
247
|
for (const entry of entries) {
|
|
263
|
-
if (!entry.isDirectory() || !SESSION_ID_PATTERN.test(entry.name) || entry.name === currentOmxSessionId) continue;
|
|
248
|
+
if (!entry.isDirectory() || !SESSION_ID_PATTERN.test(entry.name) || entry.name === currentOmxSessionId || !allowedStorageSessionIds.includes(entry.name)) continue;
|
|
264
249
|
const path = join(sessionsRoot, entry.name, 'ralph-state.json');
|
|
265
250
|
if (!existsSync(path)) continue;
|
|
266
251
|
const state = await readJson(path);
|
|
267
252
|
if (!isActiveRalphCandidate(state)) continue;
|
|
268
253
|
const ownerSessionId = safeString(state.owner_codex_session_id).trim();
|
|
269
254
|
const ownerThreadId = safeString(state.owner_codex_thread_id).trim();
|
|
270
|
-
if (ownerSessionId)
|
|
271
|
-
|
|
272
|
-
} else if (!payloadThreadId || !ownerThreadId || ownerThreadId !== payloadThreadId) {
|
|
273
|
-
continue;
|
|
274
|
-
}
|
|
255
|
+
if (ownerSessionId !== ownerCodexSessionId) continue;
|
|
256
|
+
if (ownerThreadId && payloadThreadId && ownerThreadId !== payloadThreadId) continue;
|
|
275
257
|
const freshness = await readRalphStateFreshness(path, state, env);
|
|
276
258
|
if (freshness.stale) {
|
|
277
259
|
await markRalphStateAbandoned(path, state, freshness);
|
|
@@ -289,21 +271,29 @@ async function scanMatchingRalphCandidates(
|
|
|
289
271
|
|
|
290
272
|
export async function reconcileRalphSessionResume({
|
|
291
273
|
stateDir,
|
|
292
|
-
|
|
274
|
+
authorization,
|
|
293
275
|
payloadThreadId = '',
|
|
294
276
|
env = process.env,
|
|
295
277
|
hooks,
|
|
296
278
|
}: RalphSessionResumeParams): Promise<RalphSessionResumeResult> {
|
|
279
|
+
if (!authorization) {
|
|
280
|
+
return {
|
|
281
|
+
currentOmxSessionId: '',
|
|
282
|
+
resumed: false,
|
|
283
|
+
updatedCurrentOwner: false,
|
|
284
|
+
reason: 'authorization_missing',
|
|
285
|
+
};
|
|
286
|
+
}
|
|
297
287
|
const lockedResult = await withRalphResumeLock(stateDir, async () => {
|
|
298
288
|
await hooks?.afterLockAcquired?.();
|
|
299
289
|
|
|
300
|
-
const currentOmxSessionId =
|
|
301
|
-
if (!currentOmxSessionId) {
|
|
290
|
+
const currentOmxSessionId = authorization.targetSessionId;
|
|
291
|
+
if (!SESSION_ID_PATTERN.test(currentOmxSessionId) || !authorization.allowedStorageSessionIds.includes(currentOmxSessionId)) {
|
|
302
292
|
return {
|
|
303
293
|
currentOmxSessionId: '',
|
|
304
294
|
resumed: false,
|
|
305
295
|
updatedCurrentOwner: false,
|
|
306
|
-
reason: '
|
|
296
|
+
reason: 'current_omx_session_unauthorized',
|
|
307
297
|
};
|
|
308
298
|
}
|
|
309
299
|
|
|
@@ -315,6 +305,16 @@ export async function reconcileRalphSessionResume({
|
|
|
315
305
|
: null;
|
|
316
306
|
const nowIso = new Date().toISOString();
|
|
317
307
|
|
|
308
|
+
const currentOwnerCodexSessionId = safeString(currentRalphState?.owner_codex_session_id).trim();
|
|
309
|
+
if (currentRalphState && currentOwnerCodexSessionId && currentOwnerCodexSessionId !== authorization.ownerCodexSessionId) {
|
|
310
|
+
return {
|
|
311
|
+
currentOmxSessionId,
|
|
312
|
+
resumed: false,
|
|
313
|
+
updatedCurrentOwner: false,
|
|
314
|
+
reason: 'current_ralph_owner_unauthorized',
|
|
315
|
+
targetPath: currentRalphPath,
|
|
316
|
+
};
|
|
317
|
+
}
|
|
318
318
|
if (currentRalphState && currentRalphState.active === true) {
|
|
319
319
|
const freshness = await readRalphStateFreshness(currentRalphPath, currentRalphState, env);
|
|
320
320
|
if (freshness.stale) {
|
|
@@ -335,8 +335,8 @@ export async function reconcileRalphSessionResume({
|
|
|
335
335
|
updated.owner_omx_session_id = currentOmxSessionId;
|
|
336
336
|
changed = true;
|
|
337
337
|
}
|
|
338
|
-
if (
|
|
339
|
-
updated.owner_codex_session_id =
|
|
338
|
+
if (!safeString(updated.owner_codex_session_id).trim()) {
|
|
339
|
+
updated.owner_codex_session_id = authorization.ownerCodexSessionId;
|
|
340
340
|
changed = true;
|
|
341
341
|
}
|
|
342
342
|
if (
|
|
@@ -382,14 +382,14 @@ export async function reconcileRalphSessionResume({
|
|
|
382
382
|
};
|
|
383
383
|
}
|
|
384
384
|
|
|
385
|
-
const normalizedPayloadSessionId =
|
|
385
|
+
const normalizedPayloadSessionId = authorization.ownerCodexSessionId;
|
|
386
386
|
const normalizedPayloadThreadId = safeString(payloadThreadId).trim();
|
|
387
|
-
if (!normalizedPayloadSessionId
|
|
387
|
+
if (!normalizedPayloadSessionId) {
|
|
388
388
|
return {
|
|
389
389
|
currentOmxSessionId,
|
|
390
390
|
resumed: false,
|
|
391
391
|
updatedCurrentOwner: false,
|
|
392
|
-
reason: '
|
|
392
|
+
reason: 'authorized_owner_missing',
|
|
393
393
|
};
|
|
394
394
|
}
|
|
395
395
|
|
|
@@ -398,6 +398,7 @@ export async function reconcileRalphSessionResume({
|
|
|
398
398
|
currentOmxSessionId,
|
|
399
399
|
normalizedPayloadSessionId,
|
|
400
400
|
normalizedPayloadThreadId,
|
|
401
|
+
authorization.allowedStorageSessionIds,
|
|
401
402
|
env,
|
|
402
403
|
);
|
|
403
404
|
if (candidates.length !== 1) {
|