oh-my-codex 0.20.1 → 0.20.2
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 +6 -6
- package/Cargo.toml +1 -1
- package/README.md +10 -1
- package/dist/adapt/__tests__/hermes.test.js.map +1 -1
- package/dist/adapt/contracts.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.map +1 -1
- package/dist/auth/hotswap.js +17 -4
- 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 +4 -4
- 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.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.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 +650 -15
- package/dist/cli/__tests__/doctor-warning-copy.test.js.map +1 -1
- 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 +216 -11
- package/dist/cli/__tests__/index.test.js.map +1 -1
- package/dist/cli/__tests__/launch-fallback.test.js +49 -3
- package/dist/cli/__tests__/launch-fallback.test.js.map +1 -1
- package/dist/cli/__tests__/mcp-parity.test.js +84 -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 +128 -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 +187 -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 +129 -0
- package/dist/cli/__tests__/ralplan.test.js.map +1 -0
- package/dist/cli/__tests__/resume.test.js +6 -1
- 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.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 +2261 -14
- 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.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 +1771 -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.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 +18 -0
- package/dist/cli/doctor.d.ts.map +1 -1
- package/dist/cli/doctor.js +594 -130
- package/dist/cli/doctor.js.map +1 -1
- package/dist/cli/explore.js.map +1 -1
- package/dist/cli/index.d.ts +11 -3
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +108 -20
- package/dist/cli/index.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 +18 -0
- package/dist/cli/native-hook-claim-journal.d.ts.map +1 -0
- package/dist/cli/native-hook-claim-journal.js +239 -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 +14 -0
- package/dist/cli/ralplan.d.ts.map +1 -0
- package/dist/cli/ralplan.js +203 -0
- package/dist/cli/ralplan.js.map +1 -0
- 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 +53 -0
- package/dist/cli/setup.d.ts.map +1 -1
- package/dist/cli/setup.js +1401 -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 +8 -0
- package/dist/cli/uninstall.d.ts.map +1 -1
- package/dist/cli/uninstall.js +944 -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.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 +850 -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/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 +21 -16
- package/dist/config/generator.d.ts.map +1 -1
- package/dist/config/generator.js +991 -137
- package/dist/config/generator.js.map +1 -1
- package/dist/config/mcp-registry.js.map +1 -1
- package/dist/config/models.d.ts +2 -2
- package/dist/config/models.d.ts.map +1 -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 +1372 -2
- package/dist/hooks/__tests__/keyword-detector.test.js.map +1 -1
- package/dist/hooks/__tests__/notify-fallback-watcher.test.js +14 -0
- package/dist/hooks/__tests__/notify-fallback-watcher.test.js.map +1 -1
- package/dist/hooks/__tests__/notify-hook-all-workers-idle.test.js.map +1 -1
- package/dist/hooks/__tests__/notify-hook-auto-nudge.test.js +669 -1
- 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.map +1 -1
- package/dist/hooks/__tests__/notify-hook-team-leader-nudge.test.js +8 -1
- 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.map +1 -1
- package/dist/hooks/__tests__/notify-hook-tmux-heal.test.js.map +1 -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.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 +532 -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 +139 -34
- package/dist/hooks/session.d.ts.map +1 -1
- package/dist/hooks/session.js +1239 -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 +103 -1
- package/dist/leader/__tests__/contract.test.js.map +1 -1
- package/dist/leader/contract.d.ts +26 -5
- package/dist/leader/contract.d.ts.map +1 -1
- package/dist/leader/contract.js +109 -3
- package/dist/leader/contract.js.map +1 -1
- package/dist/mcp/__tests__/bootstrap.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/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.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 +23 -23
- package/dist/mcp/wiki-server.d.ts.map +1 -1
- 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/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.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.map +1 -1
- package/dist/pipeline/__tests__/stages.test.js +8 -5
- 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 +403 -8
- package/dist/ralplan/__tests__/consensus-gate.test.js.map +1 -1
- package/dist/ralplan/__tests__/runtime.test.js +112 -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 +155 -60
- package/dist/ralplan/consensus-gate.js.map +1 -1
- package/dist/ralplan/runtime.d.ts +2 -2
- package/dist/ralplan/runtime.d.ts.map +1 -1
- package/dist/ralplan/runtime.js +1 -2
- package/dist/ralplan/runtime.js.map +1 -1
- package/dist/runtime/bridge.d.ts.map +1 -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 +4121 -592
- 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__/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 +205 -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 +175 -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 +848 -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.map +1 -1
- package/dist/scripts/codex-native-hook.js +689 -156
- 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 +136 -30
- 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 +39 -13
- 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 +1 -1
- 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-tmux-guard.d.ts +4 -4
- 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.d.ts +2 -2
- 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 +25 -16
- 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 +266 -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 +879 -2
- package/dist/scripts/smoke-packed-install.d.ts.map +1 -1
- package/dist/scripts/smoke-packed-install.js +1528 -7
- 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__/operations.test.js +64 -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.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__/adapted-role-binding.test.d.ts +2 -0
- package/dist/subagents/__tests__/adapted-role-binding.test.d.ts.map +1 -0
- package/dist/subagents/__tests__/adapted-role-binding.test.js +988 -0
- package/dist/subagents/__tests__/adapted-role-binding.test.js.map +1 -0
- 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 +273 -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/adapted-role-binding.d.ts +17 -0
- package/dist/subagents/adapted-role-binding.d.ts.map +1 -0
- package/dist/subagents/adapted-role-binding.js +75 -0
- package/dist/subagents/adapted-role-binding.js.map +1 -0
- 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 +172 -0
- package/dist/subagents/tracker.d.ts.map +1 -1
- package/dist/subagents/tracker.js +1077 -61
- package/dist/subagents/tracker.js.map +1 -1
- package/dist/team/__tests__/approved-execution.test.js.map +1 -1
- package/dist/team/__tests__/delivery-e2e-smoke.test.js.map +1 -1
- package/dist/team/__tests__/model-contract.test.js +231 -1
- 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.test.js +401 -1
- package/dist/team/__tests__/runtime.test.js.map +1 -1
- package/dist/team/__tests__/scaling.test.js +181 -0
- 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__/tmux-session.test.js +434 -4
- 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/api-interop.d.ts +2 -2
- package/dist/team/api-interop.d.ts.map +1 -1
- 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/followup-planner.js.map +1 -1
- package/dist/team/goal-workflow.js.map +1 -1
- package/dist/team/idle-nudge.d.ts.map +1 -1
- package/dist/team/model-contract.d.ts +20 -1
- package/dist/team/model-contract.d.ts.map +1 -1
- package/dist/team/model-contract.js +267 -30
- 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.map +1 -1
- package/dist/team/runtime.js +83 -52
- package/dist/team/runtime.js.map +1 -1
- package/dist/team/scaling.d.ts +9 -7
- package/dist/team/scaling.d.ts.map +1 -1
- package/dist/team/scaling.js +69 -28
- package/dist/team/scaling.js.map +1 -1
- package/dist/team/state/dispatch-lock.js.map +1 -1
- package/dist/team/state/dispatch.js.map +1 -1
- package/dist/team/state/events.js.map +1 -1
- package/dist/team/state/tasks.js.map +1 -1
- package/dist/team/state-root.js.map +1 -1
- 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/tmux-session.d.ts +2 -0
- package/dist/team/tmux-session.d.ts.map +1 -1
- package/dist/team/tmux-session.js +90 -42
- package/dist/team/tmux-session.js.map +1 -1
- package/dist/team/worker-bootstrap.js.map +1 -1
- 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/agents-model-table.js.map +1 -1
- 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.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.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/skills/omx-setup/SKILL.md +10 -5
- package/plugins/oh-my-codex/skills/ralph/SKILL.md +4 -2
- package/plugins/oh-my-codex/skills/ralplan/SKILL.md +5 -2
- package/skills/omx-setup/SKILL.md +10 -5
- package/skills/ralph/SKILL.md +4 -2
- package/skills/ralplan/SKILL.md +5 -2
- package/src/scripts/__tests__/codex-native-hook.test.ts +17522 -10630
- 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__/role-intent-bootstrap-e2e-3181.test.ts +215 -0
- package/src/scripts/__tests__/role-intent-durable-recovery-3181.test.ts +193 -0
- package/src/scripts/__tests__/smoke-packed-install.test.ts +991 -4
- package/src/scripts/codex-native-hook.ts +779 -159
- package/src/scripts/notify-fallback-delivery.ts +416 -0
- package/src/scripts/notify-fallback-watcher.ts +132 -40
- package/src/scripts/notify-hook/auto-nudge.ts +43 -12
- 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/tmux-injection.ts +38 -21
- package/src/scripts/notify-hook/visual-verdict.ts +22 -12
- package/src/scripts/notify-hook.ts +335 -90
- package/src/scripts/smoke-packed-install.ts +1829 -6
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"issue-3138-installed-smoke.d.ts","sourceRoot":"","sources":["../../../../src/scripts/__tests__/fixtures/issue-3138-installed-smoke.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,634 @@
|
|
|
1
|
+
import { spawnSync } from 'node:child_process';
|
|
2
|
+
import { chmod, mkdir, mkdtemp, readFile, rm, writeFile } from 'node:fs/promises';
|
|
3
|
+
import { existsSync } from 'node:fs';
|
|
4
|
+
import { tmpdir } from 'node:os';
|
|
5
|
+
import { isAbsolute, join } from 'node:path';
|
|
6
|
+
import { pathToFileURL } from 'node:url';
|
|
7
|
+
const SCHEMA = 'omx.issue3138.installed-smoke.v5';
|
|
8
|
+
const MANDATORY_SCENARIOS = [
|
|
9
|
+
'missing-owner-alias-activation',
|
|
10
|
+
'unmatched-write',
|
|
11
|
+
'ordinary-clear',
|
|
12
|
+
'cancel',
|
|
13
|
+
'cancel-force',
|
|
14
|
+
'owner-terminal-native-stop',
|
|
15
|
+
'all-sessions-clear',
|
|
16
|
+
'managed-unmatched-idle-delivery-no-receipts',
|
|
17
|
+
'rejected-root-no-launch',
|
|
18
|
+
'managed-unmatched-lifecycle-delivery-no-receipts',
|
|
19
|
+
'explicit-payload-session-isolation',
|
|
20
|
+
'notify-existing-fork-preserves-payload-owner',
|
|
21
|
+
];
|
|
22
|
+
function fail(message) {
|
|
23
|
+
throw new Error(message);
|
|
24
|
+
}
|
|
25
|
+
function assert(condition, message) {
|
|
26
|
+
if (!condition)
|
|
27
|
+
fail(message);
|
|
28
|
+
}
|
|
29
|
+
function parseArgs(argv) {
|
|
30
|
+
let packageRoot = '';
|
|
31
|
+
let testedSha = '';
|
|
32
|
+
let tarballSha256 = '';
|
|
33
|
+
for (let index = 0; index < argv.length; index += 1) {
|
|
34
|
+
const arg = argv[index];
|
|
35
|
+
const value = argv[index + 1];
|
|
36
|
+
if (arg === '--package-root') {
|
|
37
|
+
packageRoot = value || '';
|
|
38
|
+
index += 1;
|
|
39
|
+
continue;
|
|
40
|
+
}
|
|
41
|
+
if (arg === '--tested-sha') {
|
|
42
|
+
testedSha = value || '';
|
|
43
|
+
index += 1;
|
|
44
|
+
continue;
|
|
45
|
+
}
|
|
46
|
+
if (arg === '--tarball-sha256') {
|
|
47
|
+
tarballSha256 = value || '';
|
|
48
|
+
index += 1;
|
|
49
|
+
continue;
|
|
50
|
+
}
|
|
51
|
+
fail(`unknown installed smoke argument: ${arg}`);
|
|
52
|
+
}
|
|
53
|
+
assert(isAbsolute(packageRoot), '--package-root must be an absolute installed package path');
|
|
54
|
+
assert(/(?:^|[\\/])node_modules[\\/]oh-my-codex$/.test(packageRoot), '--package-root must name the installed oh-my-codex package');
|
|
55
|
+
assert(/^[0-9a-f]{40}$/i.test(testedSha), '--tested-sha must be a 40-character SHA');
|
|
56
|
+
assert(/^[0-9a-f]{64}$/i.test(tarballSha256), '--tarball-sha256 must be a SHA-256 digest');
|
|
57
|
+
assert(existsSync(join(packageRoot, 'package.json')), 'installed package.json is missing');
|
|
58
|
+
assert(existsSync(join(packageRoot, 'dist', 'cli', 'omx.js')), 'installed CLI is missing');
|
|
59
|
+
return { packageRoot, testedSha, tarballSha256 };
|
|
60
|
+
}
|
|
61
|
+
async function importInstalled(packageRoot, relativeModulePath) {
|
|
62
|
+
const modulePath = join(packageRoot, relativeModulePath);
|
|
63
|
+
assert(existsSync(modulePath), `installed module is missing: ${modulePath}`);
|
|
64
|
+
return await import(pathToFileURL(modulePath).href);
|
|
65
|
+
}
|
|
66
|
+
async function readJson(path) {
|
|
67
|
+
return JSON.parse(await readFile(path, 'utf-8'));
|
|
68
|
+
}
|
|
69
|
+
async function withEnvironment(updates, run) {
|
|
70
|
+
const previous = new Map();
|
|
71
|
+
for (const key of Object.keys(updates))
|
|
72
|
+
previous.set(key, process.env[key]);
|
|
73
|
+
try {
|
|
74
|
+
for (const [key, value] of Object.entries(updates)) {
|
|
75
|
+
if (value === undefined)
|
|
76
|
+
delete process.env[key];
|
|
77
|
+
else
|
|
78
|
+
process.env[key] = value;
|
|
79
|
+
}
|
|
80
|
+
return await run();
|
|
81
|
+
}
|
|
82
|
+
finally {
|
|
83
|
+
for (const [key, value] of previous) {
|
|
84
|
+
if (value === undefined)
|
|
85
|
+
delete process.env[key];
|
|
86
|
+
else
|
|
87
|
+
process.env[key] = value;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
async function withWorkspace(name, run) {
|
|
92
|
+
const root = await mkdtemp(join(tmpdir(), `omx-issue-3138-${name}-`));
|
|
93
|
+
const cwd = join(root, 'project');
|
|
94
|
+
const home = join(root, 'home');
|
|
95
|
+
await mkdir(cwd, { recursive: true });
|
|
96
|
+
await mkdir(home, { recursive: true });
|
|
97
|
+
await mkdir(join(cwd, '.omx', 'state'), { recursive: true });
|
|
98
|
+
await writeFile(join(cwd, '.omx', 'managed'), 'issue #3138 installed smoke fixture');
|
|
99
|
+
try {
|
|
100
|
+
return await run(cwd, home);
|
|
101
|
+
}
|
|
102
|
+
finally {
|
|
103
|
+
await rm(root, { recursive: true, force: true });
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
async function writeFakeTmux(binDir, instanceId) {
|
|
107
|
+
await mkdir(binDir, { recursive: true });
|
|
108
|
+
const path = join(binDir, 'tmux');
|
|
109
|
+
await writeFile(path, `#!/usr/bin/env bash
|
|
110
|
+
set -eu
|
|
111
|
+
case "$*" in
|
|
112
|
+
*"@omx_pane_instance_id"*) printf '${instanceId}\\n' ;;
|
|
113
|
+
*"@omx_instance_id"*) printf '${instanceId}\\n' ;;
|
|
114
|
+
*"display-message"*) printf 'issue-3138-smoke\\n' ;;
|
|
115
|
+
*"list-sessions"*) printf 'issue-3138-smoke\\t${instanceId}\\n' ;;
|
|
116
|
+
*) exit 0 ;;
|
|
117
|
+
esac
|
|
118
|
+
`);
|
|
119
|
+
await chmod(path, 0o755);
|
|
120
|
+
}
|
|
121
|
+
function installedCliPath(packageRoot) {
|
|
122
|
+
return join(packageRoot, 'dist', 'cli', 'omx.js');
|
|
123
|
+
}
|
|
124
|
+
function runInstalledCli(packageRoot, cwd, args, env = process.env) {
|
|
125
|
+
return spawnSync(process.execPath, [installedCliPath(packageRoot), ...args], {
|
|
126
|
+
cwd,
|
|
127
|
+
encoding: 'utf-8',
|
|
128
|
+
env,
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
function runInstalledScript(packageRoot, cwd, relativeScriptPath, args, env = process.env) {
|
|
132
|
+
const scriptPath = join(packageRoot, relativeScriptPath);
|
|
133
|
+
assert(existsSync(scriptPath), `installed script is missing: ${scriptPath}`);
|
|
134
|
+
return spawnSync(process.execPath, [scriptPath, ...args], {
|
|
135
|
+
cwd,
|
|
136
|
+
encoding: 'utf-8',
|
|
137
|
+
env,
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
function statePath(cwd, sessionId, mode) {
|
|
141
|
+
return join(cwd, '.omx', 'state', 'sessions', sessionId, `${mode}-state.json`);
|
|
142
|
+
}
|
|
143
|
+
async function writeCanonicalPointer(packageRoot, cwd, home, canonicalSessionId, nativeSessionId, ownerSessionId) {
|
|
144
|
+
const session = await importInstalled(packageRoot, 'dist/hooks/session.js');
|
|
145
|
+
await withEnvironment(cleanEnv(home, cwd), async () => {
|
|
146
|
+
await session.writeSessionStart(cwd, canonicalSessionId, {
|
|
147
|
+
nativeSessionId,
|
|
148
|
+
...(ownerSessionId ? { ownerOmxSessionId: ownerSessionId } : {}),
|
|
149
|
+
});
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
async function writeModeState(cwd, sessionId, mode, values) {
|
|
153
|
+
const path = statePath(cwd, sessionId, mode);
|
|
154
|
+
await mkdir(join(cwd, '.omx', 'state', 'sessions', sessionId), { recursive: true });
|
|
155
|
+
await writeFile(path, JSON.stringify({
|
|
156
|
+
mode,
|
|
157
|
+
session_id: sessionId,
|
|
158
|
+
active: true,
|
|
159
|
+
current_phase: 'executing',
|
|
160
|
+
...values,
|
|
161
|
+
}, null, 2));
|
|
162
|
+
}
|
|
163
|
+
async function writeRalplanConsensusEvidence(cwd, sessionId) {
|
|
164
|
+
const now = '2026-07-14T00:00:00.000Z';
|
|
165
|
+
await writeFile(join(cwd, '.omx', 'state', 'subagent-tracking.json'), JSON.stringify({
|
|
166
|
+
schemaVersion: 1,
|
|
167
|
+
sessions: {
|
|
168
|
+
[sessionId]: {
|
|
169
|
+
session_id: sessionId,
|
|
170
|
+
leader_thread_id: 'thread-leader',
|
|
171
|
+
updated_at: now,
|
|
172
|
+
threads: {
|
|
173
|
+
'thread-leader': { thread_id: 'thread-leader', kind: 'leader', first_seen_at: now, last_seen_at: now, turn_count: 1 },
|
|
174
|
+
'thread-architect': { thread_id: 'thread-architect', kind: 'subagent', first_seen_at: now, last_seen_at: now, completed_at: now, turn_count: 1 },
|
|
175
|
+
'thread-critic': { thread_id: 'thread-critic', kind: 'subagent', first_seen_at: now, last_seen_at: now, completed_at: now, turn_count: 1 },
|
|
176
|
+
},
|
|
177
|
+
},
|
|
178
|
+
},
|
|
179
|
+
}, null, 2));
|
|
180
|
+
return {
|
|
181
|
+
required: true,
|
|
182
|
+
complete: true,
|
|
183
|
+
sequence: ['architect-review', 'critic-review'],
|
|
184
|
+
planning_artifacts_are_not_consensus: true,
|
|
185
|
+
required_review_roles: ['architect', 'critic'],
|
|
186
|
+
ralplan_architect_review: {
|
|
187
|
+
agent_role: 'architect', verdict: 'approve', provenance_kind: 'native_subagent', session_id: sessionId,
|
|
188
|
+
thread_id: 'thread-architect', artifact_path: '.omx/artifacts/architect.md', tracker_path: '.omx/state/subagent-tracking.json',
|
|
189
|
+
},
|
|
190
|
+
ralplan_critic_review: {
|
|
191
|
+
agent_role: 'critic', verdict: 'approve', provenance_kind: 'native_subagent', session_id: sessionId,
|
|
192
|
+
thread_id: 'thread-critic', artifact_path: '.omx/artifacts/critic.md', tracker_path: '.omx/state/subagent-tracking.json',
|
|
193
|
+
},
|
|
194
|
+
};
|
|
195
|
+
}
|
|
196
|
+
function cleanEnv(home, cwd, extra = {}) {
|
|
197
|
+
return {
|
|
198
|
+
...process.env,
|
|
199
|
+
HOME: home,
|
|
200
|
+
CODEX_HOME: join(home, '.codex'),
|
|
201
|
+
OMX_ROOT: cwd,
|
|
202
|
+
OMX_STATE_ROOT: undefined,
|
|
203
|
+
OMX_TEAM_STATE_ROOT: undefined,
|
|
204
|
+
OMX_MCP_WORKDIR_ROOTS: undefined,
|
|
205
|
+
OMX_SESSION_ID: undefined,
|
|
206
|
+
CODEX_SESSION_ID: undefined,
|
|
207
|
+
SESSION_ID: undefined,
|
|
208
|
+
OMX_TEAM_WORKER: '',
|
|
209
|
+
OMX_TEAM_INTERNAL_WORKER: '',
|
|
210
|
+
OMX_OPENCLAW: '',
|
|
211
|
+
OMX_NOTIFY_TEMP: '',
|
|
212
|
+
OMX_NOTIFY_TEMP_CONTRACT: '',
|
|
213
|
+
TMUX: '',
|
|
214
|
+
TMUX_PANE: '',
|
|
215
|
+
...extra,
|
|
216
|
+
};
|
|
217
|
+
}
|
|
218
|
+
async function scenarioMissingOwnerAliasActivation(packageRoot) {
|
|
219
|
+
await withWorkspace('missing-owner-alias', async (cwd, home) => {
|
|
220
|
+
const ownerSessionId = 'omx-owner-alias';
|
|
221
|
+
const nativeSessionId = 'native-owner-alias';
|
|
222
|
+
const binDir = join(cwd, 'bin');
|
|
223
|
+
await writeFakeTmux(binDir, ownerSessionId);
|
|
224
|
+
await withEnvironment(cleanEnv(home, cwd, {
|
|
225
|
+
OMX_SESSION_ID: ownerSessionId,
|
|
226
|
+
TMUX: '/tmp/tmux-1000/default,1,0',
|
|
227
|
+
TMUX_PANE: '%issue3138-owner-pane',
|
|
228
|
+
PATH: `${binDir}:${process.env.PATH || ''}`,
|
|
229
|
+
}), async () => {
|
|
230
|
+
const native = await importInstalled(packageRoot, 'dist/scripts/codex-native-hook.js');
|
|
231
|
+
const start = await native.dispatchCodexNativeHook({
|
|
232
|
+
hook_event_name: 'SessionStart',
|
|
233
|
+
session_id: nativeSessionId,
|
|
234
|
+
cwd,
|
|
235
|
+
}, { cwd, sessionOwnerPid: process.pid });
|
|
236
|
+
const pointer = await readJson(join(cwd, '.omx', 'state', 'session.json'));
|
|
237
|
+
const canonicalSessionId = String(pointer.session_id || '');
|
|
238
|
+
assert(canonicalSessionId.length > 0, 'native SessionStart did not establish a canonical pointer');
|
|
239
|
+
assert(pointer.owner_omx_session_id === ownerSessionId, 'native SessionStart did not bind the verified owner alias');
|
|
240
|
+
assert(start.outputJson?.decision !== 'block', 'native SessionStart unexpectedly blocked alias activation');
|
|
241
|
+
const prompt = await native.dispatchCodexNativeHook({
|
|
242
|
+
hook_event_name: 'UserPromptSubmit',
|
|
243
|
+
session_id: nativeSessionId,
|
|
244
|
+
thread_id: 'issue3138-owner-thread',
|
|
245
|
+
turn_id: 'issue3138-owner-turn',
|
|
246
|
+
cwd,
|
|
247
|
+
prompt: '$ralph continue verification',
|
|
248
|
+
}, { cwd });
|
|
249
|
+
assert(prompt.outputJson?.decision !== 'block', 'owner alias prompt activation unexpectedly blocked');
|
|
250
|
+
assert(existsSync(statePath(cwd, canonicalSessionId, 'ralph')), 'owner alias activation did not write canonical Ralph state');
|
|
251
|
+
assert(!existsSync(join(cwd, '.omx', 'state', 'sessions', ownerSessionId)), 'owner alias activation created a split owner scope');
|
|
252
|
+
});
|
|
253
|
+
});
|
|
254
|
+
}
|
|
255
|
+
async function scenarioUnmatchedWrite(packageRoot) {
|
|
256
|
+
await withWorkspace('unmatched-write', async (cwd, home) => {
|
|
257
|
+
const canonicalSessionId = 'omx-canonical-write';
|
|
258
|
+
const ownerSessionId = 'omx-unmatched-write';
|
|
259
|
+
await writeCanonicalPointer(packageRoot, cwd, home, canonicalSessionId, 'native-unmatched-write');
|
|
260
|
+
const result = runInstalledCli(packageRoot, cwd, [
|
|
261
|
+
'state', 'write', '--input', JSON.stringify({
|
|
262
|
+
mode: 'ralph', active: true, current_phase: 'executing',
|
|
263
|
+
}), '--json',
|
|
264
|
+
], cleanEnv(home, cwd, { OMX_SESSION_ID: ownerSessionId, TMUX: '', TMUX_PANE: '' }));
|
|
265
|
+
assert(result.status !== 0, 'unmatched owner state write unexpectedly succeeded');
|
|
266
|
+
assert(!existsSync(statePath(cwd, canonicalSessionId, 'ralph')), 'unmatched owner state write mutated canonical state');
|
|
267
|
+
assert(!existsSync(join(cwd, '.omx', 'state', 'sessions', ownerSessionId)), 'unmatched owner state write created an owner scope');
|
|
268
|
+
});
|
|
269
|
+
}
|
|
270
|
+
async function scenarioOrdinaryClear(packageRoot) {
|
|
271
|
+
await withWorkspace('ordinary-clear', async (cwd, home) => {
|
|
272
|
+
const canonicalSessionId = 'omx-canonical-clear';
|
|
273
|
+
const ownerSessionId = 'omx-unmatched-clear';
|
|
274
|
+
await writeCanonicalPointer(packageRoot, cwd, home, canonicalSessionId, 'native-unmatched-clear');
|
|
275
|
+
await writeModeState(cwd, canonicalSessionId, 'ralph', { current_phase: 'executing' });
|
|
276
|
+
const before = await readFile(statePath(cwd, canonicalSessionId, 'ralph'), 'utf-8');
|
|
277
|
+
const result = runInstalledCli(packageRoot, cwd, [
|
|
278
|
+
'state', 'clear', '--mode', 'ralph', '--json',
|
|
279
|
+
], cleanEnv(home, cwd, { OMX_SESSION_ID: ownerSessionId, TMUX: '', TMUX_PANE: '' }));
|
|
280
|
+
assert(result.status !== 0, 'unmatched owner ordinary clear unexpectedly succeeded');
|
|
281
|
+
assert(await readFile(statePath(cwd, canonicalSessionId, 'ralph'), 'utf-8') === before, 'unmatched owner ordinary clear mutated canonical state');
|
|
282
|
+
assert(!existsSync(join(cwd, '.omx', 'state', 'sessions', ownerSessionId)), 'ordinary clear created an owner scope');
|
|
283
|
+
});
|
|
284
|
+
}
|
|
285
|
+
async function scenarioCancel(packageRoot) {
|
|
286
|
+
await withWorkspace('cancel', async (cwd, home) => {
|
|
287
|
+
const canonicalSessionId = 'omx-canonical-cancel';
|
|
288
|
+
const ownerSessionId = 'omx-unmatched-cancel';
|
|
289
|
+
await writeCanonicalPointer(packageRoot, cwd, home, canonicalSessionId, 'native-unmatched-cancel');
|
|
290
|
+
await writeModeState(cwd, canonicalSessionId, 'ralph', { current_phase: 'executing' });
|
|
291
|
+
const before = await readFile(statePath(cwd, canonicalSessionId, 'ralph'), 'utf-8');
|
|
292
|
+
const result = runInstalledCli(packageRoot, cwd, ['cancel'], cleanEnv(home, cwd, {
|
|
293
|
+
OMX_SESSION_ID: ownerSessionId,
|
|
294
|
+
TMUX: '',
|
|
295
|
+
TMUX_PANE: '',
|
|
296
|
+
}));
|
|
297
|
+
assert(result.status !== null, 'unmatched owner cancel did not exit');
|
|
298
|
+
assert(await readFile(statePath(cwd, canonicalSessionId, 'ralph'), 'utf-8') === before, 'unmatched owner cancel mutated canonical state');
|
|
299
|
+
assert(!existsSync(join(cwd, '.omx', 'state', 'sessions', ownerSessionId)), 'cancel created an owner scope');
|
|
300
|
+
});
|
|
301
|
+
}
|
|
302
|
+
async function scenarioCancelForce(packageRoot) {
|
|
303
|
+
await withWorkspace('cancel-force', async (cwd, home) => {
|
|
304
|
+
const canonicalSessionId = 'omx-canonical-cancel-force';
|
|
305
|
+
const ownerSessionId = 'omx-unmatched-cancel-force';
|
|
306
|
+
await writeCanonicalPointer(packageRoot, cwd, home, canonicalSessionId, 'native-unmatched-cancel-force');
|
|
307
|
+
await writeModeState(cwd, canonicalSessionId, 'ralph', { current_phase: 'executing' });
|
|
308
|
+
const before = await readFile(statePath(cwd, canonicalSessionId, 'ralph'), 'utf-8');
|
|
309
|
+
const result = runInstalledCli(packageRoot, cwd, ['cancel', '--force'], cleanEnv(home, cwd, {
|
|
310
|
+
OMX_SESSION_ID: ownerSessionId,
|
|
311
|
+
TMUX: '',
|
|
312
|
+
TMUX_PANE: '',
|
|
313
|
+
}));
|
|
314
|
+
assert(result.status !== null, 'unmatched owner force cancel did not exit');
|
|
315
|
+
assert(await readFile(statePath(cwd, canonicalSessionId, 'ralph'), 'utf-8') === before, 'unmatched owner force cancel mutated canonical state');
|
|
316
|
+
assert(!existsSync(join(cwd, '.omx', 'state', 'sessions', ownerSessionId)), 'force cancel created an owner scope');
|
|
317
|
+
});
|
|
318
|
+
}
|
|
319
|
+
async function scenarioOwnerTerminalNativeStop(packageRoot) {
|
|
320
|
+
await withWorkspace('owner-terminal-stop', async (cwd, home) => {
|
|
321
|
+
const canonicalSessionId = 'omx-canonical-terminal';
|
|
322
|
+
const ownerSessionId = 'omx-owner-terminal';
|
|
323
|
+
const nativeSessionId = 'native-owner-terminal';
|
|
324
|
+
const binDir = join(cwd, 'bin');
|
|
325
|
+
await writeFakeTmux(binDir, ownerSessionId);
|
|
326
|
+
await writeCanonicalPointer(packageRoot, cwd, home, canonicalSessionId, nativeSessionId);
|
|
327
|
+
const env = cleanEnv(home, cwd, {
|
|
328
|
+
OMX_SESSION_ID: ownerSessionId,
|
|
329
|
+
TMUX: '/tmp/tmux-1000/default,1,0',
|
|
330
|
+
TMUX_PANE: '%issue3138-terminal-pane',
|
|
331
|
+
PATH: `${binDir}:${process.env.PATH || ''}`,
|
|
332
|
+
});
|
|
333
|
+
const consensusGate = await writeRalplanConsensusEvidence(cwd, canonicalSessionId);
|
|
334
|
+
await withEnvironment(env, async () => {
|
|
335
|
+
const native = await importInstalled(packageRoot, 'dist/scripts/codex-native-hook.js');
|
|
336
|
+
await native.dispatchCodexNativeHook({
|
|
337
|
+
hook_event_name: 'SessionStart',
|
|
338
|
+
session_id: nativeSessionId,
|
|
339
|
+
cwd,
|
|
340
|
+
}, { cwd, sessionOwnerPid: process.pid });
|
|
341
|
+
});
|
|
342
|
+
const terminal = runInstalledCli(packageRoot, cwd, [
|
|
343
|
+
'state', 'write', '--input', JSON.stringify({
|
|
344
|
+
mode: 'ralplan', active: false, current_phase: 'complete', completed_at: new Date().toISOString(),
|
|
345
|
+
ralplan_consensus_gate: consensusGate,
|
|
346
|
+
}), '--json',
|
|
347
|
+
], env);
|
|
348
|
+
assert(terminal.status === 0, terminal.stderr || terminal.stdout || 'owner terminal state write failed');
|
|
349
|
+
const terminalState = await readJson(statePath(cwd, canonicalSessionId, 'ralplan'));
|
|
350
|
+
assert(terminalState.active === false && terminalState.current_phase === 'complete', 'owner terminal write did not update canonical state');
|
|
351
|
+
assert(!existsSync(join(cwd, '.omx', 'state', 'sessions', ownerSessionId)), 'owner terminal write created a split owner scope');
|
|
352
|
+
await withEnvironment(env, async () => {
|
|
353
|
+
const native = await importInstalled(packageRoot, 'dist/scripts/codex-native-hook.js');
|
|
354
|
+
const stop = await native.dispatchCodexNativeHook({
|
|
355
|
+
hook_event_name: 'Stop',
|
|
356
|
+
session_id: nativeSessionId,
|
|
357
|
+
cwd,
|
|
358
|
+
}, { cwd });
|
|
359
|
+
assert(stop.outputJson?.decision !== 'block', 'native Stop continued a terminal canonical Ralph plan');
|
|
360
|
+
assert(!String(stop.outputJson?.stopReason || '').startsWith('skill_ralplan_'), 'native Stop reported a stale Ralph-plan continuation');
|
|
361
|
+
assert(!String(stop.outputJson?.reason || '').includes('continue_from_artifact'), 'native Stop reported an artifact continuation');
|
|
362
|
+
});
|
|
363
|
+
});
|
|
364
|
+
}
|
|
365
|
+
async function scenarioAllSessionsClear(packageRoot) {
|
|
366
|
+
await withWorkspace('all-sessions-clear', async (cwd, home) => {
|
|
367
|
+
const canonicalSessionId = 'omx-canonical-all-clear';
|
|
368
|
+
const otherSessionId = 'omx-existing-other';
|
|
369
|
+
const ownerSessionId = 'omx-unmatched-all-clear';
|
|
370
|
+
await writeCanonicalPointer(packageRoot, cwd, home, canonicalSessionId, 'native-all-clear');
|
|
371
|
+
await writeModeState(cwd, canonicalSessionId, 'ralph', { current_phase: 'executing' });
|
|
372
|
+
await writeModeState(cwd, otherSessionId, 'ralph', { current_phase: 'executing' });
|
|
373
|
+
const result = runInstalledCli(packageRoot, cwd, [
|
|
374
|
+
'state', 'clear', '--input', JSON.stringify({ mode: 'ralph', all_sessions: true }), '--json',
|
|
375
|
+
], cleanEnv(home, cwd, { OMX_SESSION_ID: ownerSessionId, TMUX: '', TMUX_PANE: '' }));
|
|
376
|
+
assert(result.status === 0, result.stderr || result.stdout || 'all-sessions clear failed');
|
|
377
|
+
assert(!existsSync(statePath(cwd, canonicalSessionId, 'ralph')), 'all-sessions clear left canonical Ralph state');
|
|
378
|
+
assert(!existsSync(statePath(cwd, otherSessionId, 'ralph')), 'all-sessions clear left existing secondary Ralph state');
|
|
379
|
+
assert(!existsSync(join(cwd, '.omx', 'state', 'sessions', ownerSessionId)), 'all-sessions clear initialized an owner scope');
|
|
380
|
+
});
|
|
381
|
+
}
|
|
382
|
+
async function writeNotificationConfig(home) {
|
|
383
|
+
const codexHome = join(home, '.codex');
|
|
384
|
+
await mkdir(codexHome, { recursive: true });
|
|
385
|
+
await writeFile(join(codexHome, '.omx-config.json'), JSON.stringify({
|
|
386
|
+
notifications: {
|
|
387
|
+
enabled: true,
|
|
388
|
+
telegram: {
|
|
389
|
+
enabled: true,
|
|
390
|
+
botToken: '123456:issue3138-smoke-token',
|
|
391
|
+
chatId: 'issue3138-smoke-chat',
|
|
392
|
+
},
|
|
393
|
+
},
|
|
394
|
+
}, null, 2));
|
|
395
|
+
}
|
|
396
|
+
async function withMockedTelegramDelivery(run) {
|
|
397
|
+
const previousFetch = globalThis.fetch;
|
|
398
|
+
const deliveries = [];
|
|
399
|
+
globalThis.fetch = (async (_url, init) => {
|
|
400
|
+
deliveries.push(JSON.parse(String(init?.body || '{}')));
|
|
401
|
+
return new Response(JSON.stringify({ ok: true, result: { message_id: `issue3138-${deliveries.length}` } }), {
|
|
402
|
+
status: 200,
|
|
403
|
+
headers: { 'content-type': 'application/json' },
|
|
404
|
+
});
|
|
405
|
+
});
|
|
406
|
+
try {
|
|
407
|
+
return await run(deliveries);
|
|
408
|
+
}
|
|
409
|
+
finally {
|
|
410
|
+
globalThis.fetch = previousFetch;
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
|
+
async function scenarioManagedUnmatchedIdleDeliveryNoReceipts(packageRoot) {
|
|
414
|
+
await withWorkspace('managed-unmatched-idle', async (cwd, home) => {
|
|
415
|
+
const ownerSessionId = 'omx-unmatched-idle';
|
|
416
|
+
await writeNotificationConfig(home);
|
|
417
|
+
await withEnvironment(cleanEnv(home, cwd, { OMX_SESSION_ID: ownerSessionId, TMUX_PANE: '%issue3138-idle-pane' }), async () => {
|
|
418
|
+
const notifications = await importInstalled(packageRoot, 'dist/notifications/index.js');
|
|
419
|
+
await withMockedTelegramDelivery(async (deliveries) => {
|
|
420
|
+
const result = await notifications.notifyLifecycle('session-idle', {
|
|
421
|
+
sessionId: ownerSessionId,
|
|
422
|
+
projectPath: cwd,
|
|
423
|
+
tmuxPaneId: '%issue3138-idle-pane',
|
|
424
|
+
tmuxSession: 'issue3138-smoke',
|
|
425
|
+
tmuxTail: 'fresh idle tail',
|
|
426
|
+
}, undefined, { persistScopedReceipts: false });
|
|
427
|
+
assert(result?.anySuccess === true, 'managed unmatched idle delivery did not succeed');
|
|
428
|
+
assert(result.results.some((entry) => entry.messageId === 'issue3138-1'), 'managed unmatched idle delivery omitted the provider message ID');
|
|
429
|
+
assert(deliveries.length === 1, 'managed unmatched idle delivery did not reach the provider');
|
|
430
|
+
});
|
|
431
|
+
});
|
|
432
|
+
assert(!existsSync(join(cwd, '.omx', 'state', 'sessions', ownerSessionId, 'idle-notif-cooldown.json')), 'managed unmatched idle wrote an idle receipt');
|
|
433
|
+
assert(!existsSync(join(cwd, '.omx', 'state', 'sessions', ownerSessionId, 'lifecycle-notif-state.json')), 'managed unmatched idle wrote a lifecycle receipt');
|
|
434
|
+
assert(!existsSync(join(home, '.omx', 'state', 'reply-session-registry.jsonl')), 'managed unmatched idle wrote a reply mapping');
|
|
435
|
+
assert(!existsSync(join(home, '.omx', 'state', 'reply-session-registry.lock')), 'managed unmatched idle left a reply registry lock');
|
|
436
|
+
});
|
|
437
|
+
}
|
|
438
|
+
async function scenarioRejectedRootNoLaunch(packageRoot) {
|
|
439
|
+
await withWorkspace('rejected-root', async (cwd, home) => {
|
|
440
|
+
const outsideRoot = await mkdtemp(join(tmpdir(), 'omx-issue-3138-rejected-root-'));
|
|
441
|
+
const binDir = join(cwd, 'bin');
|
|
442
|
+
const invocationLog = join(cwd, 'unexpected-launch.log');
|
|
443
|
+
try {
|
|
444
|
+
await mkdir(binDir, { recursive: true });
|
|
445
|
+
for (const command of ['codex', 'tmux']) {
|
|
446
|
+
const path = join(binDir, command);
|
|
447
|
+
await writeFile(path, `#!/usr/bin/env bash\nprintf '${command} %s\\n' "$*" >> ${JSON.stringify(invocationLog)}\nexit 0\n`);
|
|
448
|
+
await chmod(path, 0o755);
|
|
449
|
+
}
|
|
450
|
+
const result = runInstalledCli(packageRoot, cwd, ['--dangerously-bypass-approvals-and-sandbox'], cleanEnv(home, cwd, {
|
|
451
|
+
OMX_ROOT: outsideRoot,
|
|
452
|
+
OMX_MCP_WORKDIR_ROOTS: cwd,
|
|
453
|
+
OMX_LAUNCH_POLICY: 'direct',
|
|
454
|
+
PATH: `${binDir}:${process.env.PATH || ''}`,
|
|
455
|
+
}));
|
|
456
|
+
assert(result.status !== 0, 'rejected root direct launch unexpectedly succeeded');
|
|
457
|
+
assert(/session_pointer_context_failure|outside allowed roots/i.test(`${result.stdout}\n${result.stderr}`), 'rejected root did not report a typed context abort');
|
|
458
|
+
const invocationText = existsSync(invocationLog) ? await readFile(invocationLog, 'utf-8') : '';
|
|
459
|
+
assert(!/^codex\b/m.test(invocationText), 'rejected root launched Codex');
|
|
460
|
+
assert(!/^tmux (?:new-session|set-option|split-window|send-keys)\b/m.test(invocationText), 'rejected root mutated tmux state');
|
|
461
|
+
assert(!existsSync(join(cwd, '.omx', 'state', 'session.json')), 'rejected root committed a session pointer');
|
|
462
|
+
assert(!existsSync(join(cwd, '.omx', 'runtime')), 'rejected root created post-launch runtime artifacts');
|
|
463
|
+
}
|
|
464
|
+
finally {
|
|
465
|
+
await rm(outsideRoot, { recursive: true, force: true });
|
|
466
|
+
}
|
|
467
|
+
});
|
|
468
|
+
}
|
|
469
|
+
async function scenarioManagedUnmatchedLifecycleDeliveryNoReceipts(packageRoot) {
|
|
470
|
+
await withWorkspace('managed-unmatched-lifecycle', async (cwd, home) => {
|
|
471
|
+
const ownerSessionId = 'omx-unmatched-lifecycle';
|
|
472
|
+
await writeNotificationConfig(home);
|
|
473
|
+
await withEnvironment(cleanEnv(home, cwd, { OMX_SESSION_ID: ownerSessionId }), async () => {
|
|
474
|
+
const notifications = await importInstalled(packageRoot, 'dist/notifications/index.js');
|
|
475
|
+
await withMockedTelegramDelivery(async (deliveries) => {
|
|
476
|
+
const first = await notifications.notifyLifecycle('session-start', {
|
|
477
|
+
sessionId: ownerSessionId,
|
|
478
|
+
projectPath: cwd,
|
|
479
|
+
}, undefined, { persistScopedReceipts: false });
|
|
480
|
+
const second = await notifications.notifyLifecycle('session-start', {
|
|
481
|
+
sessionId: ownerSessionId,
|
|
482
|
+
projectPath: cwd,
|
|
483
|
+
}, undefined, { persistScopedReceipts: false });
|
|
484
|
+
assert(first?.anySuccess === true && second?.anySuccess === true, 'managed unmatched lifecycle delivery did not succeed');
|
|
485
|
+
assert(deliveries.length === 2, 'managed unmatched lifecycle delivery was unexpectedly deduped');
|
|
486
|
+
});
|
|
487
|
+
});
|
|
488
|
+
assert(!existsSync(join(cwd, '.omx', 'state', 'sessions', ownerSessionId, 'lifecycle-notif-state.json')), 'managed unmatched lifecycle wrote a lifecycle receipt');
|
|
489
|
+
});
|
|
490
|
+
}
|
|
491
|
+
async function scenarioExplicitPayloadSessionIsolation(packageRoot) {
|
|
492
|
+
await withWorkspace('explicit-payload-isolation', async (cwd, home) => {
|
|
493
|
+
const firstSessionId = 'codex-payload-first';
|
|
494
|
+
const secondSessionId = 'codex-payload-second';
|
|
495
|
+
await writeCanonicalPointer(packageRoot, cwd, home, firstSessionId, firstSessionId);
|
|
496
|
+
await writeModeState(cwd, firstSessionId, 'ralph', { marker: 'first-before', owner_codex_session_id: firstSessionId });
|
|
497
|
+
await writeModeState(cwd, secondSessionId, 'ralph', { marker: 'second-before', owner_codex_session_id: secondSessionId });
|
|
498
|
+
const pointerPath = join(cwd, '.omx', 'state', 'session.json');
|
|
499
|
+
const pointerBefore = await readFile(pointerPath, 'utf8');
|
|
500
|
+
await withEnvironment(cleanEnv(home, cwd), async () => {
|
|
501
|
+
const native = await importInstalled(packageRoot, 'dist/scripts/codex-native-hook.js');
|
|
502
|
+
const secondBeforeFirst = await readFile(statePath(cwd, secondSessionId, 'ralph'), 'utf-8');
|
|
503
|
+
const first = await native.dispatchCodexNativeHook({
|
|
504
|
+
hook_event_name: 'UserPromptSubmit', session_id: firstSessionId, thread_id: 'explicit-first', turn_id: 'explicit-first-turn', cwd,
|
|
505
|
+
prompt: '$ralph continue first payload session',
|
|
506
|
+
}, { cwd });
|
|
507
|
+
assert(first.outputJson?.decision !== 'block', 'first explicit payload prompt was blocked');
|
|
508
|
+
assert(await readFile(statePath(cwd, secondSessionId, 'ralph'), 'utf-8') === secondBeforeFirst, 'first explicit payload mutated second scoped state');
|
|
509
|
+
const firstBeforeSecond = await readFile(statePath(cwd, firstSessionId, 'ralph'), 'utf-8');
|
|
510
|
+
const second = await native.dispatchCodexNativeHook({
|
|
511
|
+
hook_event_name: 'UserPromptSubmit', session_id: secondSessionId, thread_id: 'explicit-second', turn_id: 'explicit-second-turn', cwd,
|
|
512
|
+
prompt: '$ralph continue second payload session',
|
|
513
|
+
}, { cwd });
|
|
514
|
+
assert(second.outputJson?.decision !== 'block', 'second explicit payload prompt was blocked');
|
|
515
|
+
assert(await readFile(statePath(cwd, firstSessionId, 'ralph'), 'utf-8') === firstBeforeSecond, 'second explicit payload mutated first scoped state');
|
|
516
|
+
});
|
|
517
|
+
assert(await readFile(pointerPath, 'utf8') === pointerBefore, 'explicit payload prompts rewrote the selected pointer');
|
|
518
|
+
});
|
|
519
|
+
}
|
|
520
|
+
async function scenarioNotifyExistingForkPreservesPayloadOwner(packageRoot) {
|
|
521
|
+
await withWorkspace('notify-existing-fork-owner', async (cwd, home) => {
|
|
522
|
+
const canonicalSessionId = 'omx-notify-canonical';
|
|
523
|
+
const payloadSessionId = 'codex-notify-owner';
|
|
524
|
+
const forkSessionId = 'omx-notify-existing-fork';
|
|
525
|
+
const canonicalHudPath = join(cwd, '.omx', 'state', 'sessions', canonicalSessionId, 'hud-state.json');
|
|
526
|
+
await writeCanonicalPointer(packageRoot, cwd, home, canonicalSessionId, payloadSessionId);
|
|
527
|
+
await mkdir(join(cwd, '.omx', 'state', 'sessions', forkSessionId), { recursive: true });
|
|
528
|
+
await mkdir(join(cwd, '.omx', 'state', 'sessions', canonicalSessionId), { recursive: true });
|
|
529
|
+
await writeFile(canonicalHudPath, JSON.stringify({ turn_count: 7, marker: 'canonical-source' }, null, 2));
|
|
530
|
+
const canonicalHudBefore = await readFile(canonicalHudPath, 'utf-8');
|
|
531
|
+
const pointerPath = join(cwd, '.omx', 'state', 'session.json');
|
|
532
|
+
const pointerBefore = await readFile(pointerPath, 'utf-8');
|
|
533
|
+
const pointer = await readJson(pointerPath);
|
|
534
|
+
assert(pointer.native_session_id === payloadSessionId, 'notify fork setup did not bind payload owner P');
|
|
535
|
+
const result = runInstalledScript(packageRoot, cwd, 'dist/scripts/notify-hook.js', [JSON.stringify({
|
|
536
|
+
cwd, session_id: payloadSessionId, type: 'agent-turn-complete', thread_id: 'notify-fork-thread', turn_id: 'notify-fork-turn',
|
|
537
|
+
input_messages: ['$ralph continue'], last_assistant_message: 'fork storage receipt',
|
|
538
|
+
})], cleanEnv(home, cwd, { OMX_SESSION_ID: forkSessionId }));
|
|
539
|
+
assert(result.status === 0, result.stderr || result.stdout || 'installed notify fork route failed');
|
|
540
|
+
const forkDir = join(cwd, '.omx', 'state', 'sessions', forkSessionId);
|
|
541
|
+
const skillState = await readJson(join(forkDir, 'skill-active-state.json'));
|
|
542
|
+
const ralphState = await readJson(join(forkDir, 'ralph-state.json'));
|
|
543
|
+
assert(skillState.owner_codex_session_id === payloadSessionId, 'notify fork skill state did not retain payload owner P');
|
|
544
|
+
assert(ralphState.owner_codex_session_id === payloadSessionId, 'notify fork Ralph seed did not retain payload owner P');
|
|
545
|
+
const second = runInstalledScript(packageRoot, cwd, 'dist/scripts/notify-hook.js', [JSON.stringify({
|
|
546
|
+
cwd, session_id: payloadSessionId, type: 'agent-turn-complete', thread_id: 'notify-fork-thread', turn_id: 'notify-fork-turn-2',
|
|
547
|
+
input_messages: [], last_assistant_message: 'fork lifecycle continuation',
|
|
548
|
+
})], cleanEnv(home, cwd, { OMX_SESSION_ID: forkSessionId }));
|
|
549
|
+
assert(second.status === 0, second.stderr || second.stdout || 'installed notify fork continuation failed');
|
|
550
|
+
const ralphAfterSecond = await readJson(join(forkDir, 'ralph-state.json'));
|
|
551
|
+
assert(ralphAfterSecond.owner_codex_session_id === payloadSessionId, 'notify fork lifecycle sync lost payload owner P');
|
|
552
|
+
assert(existsSync(join(cwd, '.omx', 'state', 'sessions', forkSessionId, 'hud-state.json')), 'notify fork route did not mutate existing fork storage');
|
|
553
|
+
assert(existsSync(join(cwd, '.omx', 'state', 'sessions', forkSessionId, 'notify-hook-state.json')), 'notify fork route did not persist its fork receipt');
|
|
554
|
+
assert(await readFile(canonicalHudPath, 'utf-8') === canonicalHudBefore, 'notify fork route mutated canonical source storage');
|
|
555
|
+
assert(!existsSync(join(cwd, '.omx', 'state', 'sessions', canonicalSessionId, 'notify-hook-state.json')), 'notify fork route created a canonical receipt');
|
|
556
|
+
assert(!existsSync(join(cwd, '.omx', 'state', 'sessions', payloadSessionId)), 'notify fork route created payload owner storage');
|
|
557
|
+
assert(await readFile(pointerPath, 'utf-8') === pointerBefore, 'notify fork route mutated the payload owner pointer');
|
|
558
|
+
});
|
|
559
|
+
}
|
|
560
|
+
async function runScenario(name, packageRoot) {
|
|
561
|
+
switch (name) {
|
|
562
|
+
case 'missing-owner-alias-activation':
|
|
563
|
+
await scenarioMissingOwnerAliasActivation(packageRoot);
|
|
564
|
+
return;
|
|
565
|
+
case 'unmatched-write':
|
|
566
|
+
await scenarioUnmatchedWrite(packageRoot);
|
|
567
|
+
return;
|
|
568
|
+
case 'ordinary-clear':
|
|
569
|
+
await scenarioOrdinaryClear(packageRoot);
|
|
570
|
+
return;
|
|
571
|
+
case 'cancel':
|
|
572
|
+
await scenarioCancel(packageRoot);
|
|
573
|
+
return;
|
|
574
|
+
case 'cancel-force':
|
|
575
|
+
await scenarioCancelForce(packageRoot);
|
|
576
|
+
return;
|
|
577
|
+
case 'owner-terminal-native-stop':
|
|
578
|
+
await scenarioOwnerTerminalNativeStop(packageRoot);
|
|
579
|
+
return;
|
|
580
|
+
case 'all-sessions-clear':
|
|
581
|
+
await scenarioAllSessionsClear(packageRoot);
|
|
582
|
+
return;
|
|
583
|
+
case 'managed-unmatched-idle-delivery-no-receipts':
|
|
584
|
+
await scenarioManagedUnmatchedIdleDeliveryNoReceipts(packageRoot);
|
|
585
|
+
return;
|
|
586
|
+
case 'rejected-root-no-launch':
|
|
587
|
+
await scenarioRejectedRootNoLaunch(packageRoot);
|
|
588
|
+
return;
|
|
589
|
+
case 'managed-unmatched-lifecycle-delivery-no-receipts':
|
|
590
|
+
await scenarioManagedUnmatchedLifecycleDeliveryNoReceipts(packageRoot);
|
|
591
|
+
return;
|
|
592
|
+
case 'explicit-payload-session-isolation':
|
|
593
|
+
await scenarioExplicitPayloadSessionIsolation(packageRoot);
|
|
594
|
+
return;
|
|
595
|
+
case 'notify-existing-fork-preserves-payload-owner':
|
|
596
|
+
await scenarioNotifyExistingForkPreservesPayloadOwner(packageRoot);
|
|
597
|
+
return;
|
|
598
|
+
}
|
|
599
|
+
}
|
|
600
|
+
async function main() {
|
|
601
|
+
const args = parseArgs(process.argv.slice(2));
|
|
602
|
+
const packageJson = await readJson(join(args.packageRoot, 'package.json'));
|
|
603
|
+
assert(typeof packageJson.version === 'string' && packageJson.version.length > 0, 'installed package version is missing');
|
|
604
|
+
const scenarios = [];
|
|
605
|
+
const failures = [];
|
|
606
|
+
for (const name of MANDATORY_SCENARIOS) {
|
|
607
|
+
try {
|
|
608
|
+
await runScenario(name, args.packageRoot);
|
|
609
|
+
scenarios.push({ name, pass: true });
|
|
610
|
+
}
|
|
611
|
+
catch (error) {
|
|
612
|
+
scenarios.push({ name, pass: false });
|
|
613
|
+
failures.push(`${name}: ${error instanceof Error ? error.message : String(error)}`);
|
|
614
|
+
}
|
|
615
|
+
}
|
|
616
|
+
assert(scenarios.length === MANDATORY_SCENARIOS.length, 'installed smoke omitted a mandatory scenario');
|
|
617
|
+
assert(new Set(scenarios.map((scenario) => scenario.name)).size === MANDATORY_SCENARIOS.length, 'installed smoke duplicated a mandatory scenario');
|
|
618
|
+
const report = {
|
|
619
|
+
schema: SCHEMA,
|
|
620
|
+
tested_sha: args.testedSha,
|
|
621
|
+
tarball_sha256: args.tarballSha256,
|
|
622
|
+
installed_version: packageJson.version,
|
|
623
|
+
scenarios,
|
|
624
|
+
...(failures.length > 0 ? { error: failures.join('\n') } : {}),
|
|
625
|
+
};
|
|
626
|
+
process.stdout.write(`${JSON.stringify(report)}\n`);
|
|
627
|
+
if (failures.length > 0)
|
|
628
|
+
process.exitCode = 1;
|
|
629
|
+
}
|
|
630
|
+
main().catch((error) => {
|
|
631
|
+
process.stderr.write(`${error instanceof Error ? error.stack || error.message : String(error)}\n`);
|
|
632
|
+
process.exit(1);
|
|
633
|
+
});
|
|
634
|
+
//# sourceMappingURL=issue-3138-installed-smoke.js.map
|