oh-my-codex 0.12.4 → 0.12.6
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 +5 -5
- package/Cargo.toml +1 -1
- package/README.md +27 -3
- package/dist/cli/__tests__/ask.test.js +26 -0
- package/dist/cli/__tests__/ask.test.js.map +1 -1
- package/dist/cli/__tests__/doctor-warning-copy.test.js +28 -0
- package/dist/cli/__tests__/doctor-warning-copy.test.js.map +1 -1
- package/dist/cli/__tests__/explore.test.js +95 -8
- package/dist/cli/__tests__/explore.test.js.map +1 -1
- package/dist/cli/__tests__/index.test.js +102 -4
- package/dist/cli/__tests__/index.test.js.map +1 -1
- package/dist/cli/__tests__/launch-fallback.test.js +169 -0
- package/dist/cli/__tests__/launch-fallback.test.js.map +1 -1
- package/dist/cli/__tests__/mcp-parity.test.js +31 -0
- package/dist/cli/__tests__/mcp-parity.test.js.map +1 -1
- package/dist/cli/__tests__/setup-agents-overwrite.test.js +66 -2
- package/dist/cli/__tests__/setup-agents-overwrite.test.js.map +1 -1
- package/dist/cli/__tests__/setup-refresh.test.js +51 -1
- package/dist/cli/__tests__/setup-refresh.test.js.map +1 -1
- package/dist/cli/__tests__/team.test.js +148 -3
- package/dist/cli/__tests__/team.test.js.map +1 -1
- package/dist/cli/__tests__/uninstall.test.js +14 -1
- package/dist/cli/__tests__/uninstall.test.js.map +1 -1
- package/dist/cli/cleanup.js +1 -1
- package/dist/cli/cleanup.js.map +1 -1
- package/dist/cli/constants.d.ts +1 -0
- package/dist/cli/constants.d.ts.map +1 -1
- package/dist/cli/constants.js +1 -0
- package/dist/cli/constants.js.map +1 -1
- package/dist/cli/doctor.d.ts.map +1 -1
- package/dist/cli/doctor.js +15 -0
- package/dist/cli/doctor.js.map +1 -1
- package/dist/cli/explore.d.ts +1 -0
- package/dist/cli/explore.d.ts.map +1 -1
- package/dist/cli/explore.js +49 -1
- package/dist/cli/explore.js.map +1 -1
- package/dist/cli/index.d.ts +2 -1
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +127 -14
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/mcp-parity.d.ts +1 -1
- package/dist/cli/mcp-parity.d.ts.map +1 -1
- package/dist/cli/mcp-parity.js +24 -0
- package/dist/cli/mcp-parity.js.map +1 -1
- package/dist/cli/setup.d.ts.map +1 -1
- package/dist/cli/setup.js +17 -5
- package/dist/cli/setup.js.map +1 -1
- package/dist/cli/team.d.ts.map +1 -1
- package/dist/cli/team.js +80 -6
- package/dist/cli/team.js.map +1 -1
- package/dist/cli/uninstall.d.ts.map +1 -1
- package/dist/cli/uninstall.js +1 -0
- package/dist/cli/uninstall.js.map +1 -1
- package/dist/config/__tests__/generator-idempotent.test.js +60 -0
- package/dist/config/__tests__/generator-idempotent.test.js.map +1 -1
- package/dist/config/__tests__/mcp-registry.test.js +61 -0
- package/dist/config/__tests__/mcp-registry.test.js.map +1 -1
- package/dist/config/__tests__/wiki-config-contract.test.d.ts +2 -0
- package/dist/config/__tests__/wiki-config-contract.test.d.ts.map +1 -0
- package/dist/config/__tests__/wiki-config-contract.test.js +19 -0
- package/dist/config/__tests__/wiki-config-contract.test.js.map +1 -0
- package/dist/config/generator.d.ts +1 -0
- package/dist/config/generator.d.ts.map +1 -1
- package/dist/config/generator.js +88 -3
- package/dist/config/generator.js.map +1 -1
- package/dist/config/mcp-registry.d.ts +2 -0
- package/dist/config/mcp-registry.d.ts.map +1 -1
- package/dist/config/mcp-registry.js +12 -0
- package/dist/config/mcp-registry.js.map +1 -1
- package/dist/hooks/__tests__/agents-overlay.test.js +39 -0
- package/dist/hooks/__tests__/agents-overlay.test.js.map +1 -1
- package/dist/hooks/__tests__/keyword-detector.test.js +297 -4
- package/dist/hooks/__tests__/keyword-detector.test.js.map +1 -1
- package/dist/hooks/__tests__/notify-fallback-watcher.test.js +392 -22
- package/dist/hooks/__tests__/notify-fallback-watcher.test.js.map +1 -1
- package/dist/hooks/__tests__/notify-hook-auto-nudge.test.js +166 -67
- package/dist/hooks/__tests__/notify-hook-auto-nudge.test.js.map +1 -1
- package/dist/hooks/__tests__/notify-hook-managed-tmux.test.js +112 -2
- package/dist/hooks/__tests__/notify-hook-managed-tmux.test.js.map +1 -1
- package/dist/hooks/__tests__/notify-hook-modules.test.js +52 -12
- package/dist/hooks/__tests__/notify-hook-modules.test.js.map +1 -1
- package/dist/hooks/__tests__/notify-hook-regression-205.test.d.ts +2 -3
- package/dist/hooks/__tests__/notify-hook-regression-205.test.d.ts.map +1 -1
- package/dist/hooks/__tests__/notify-hook-regression-205.test.js +18 -23
- package/dist/hooks/__tests__/notify-hook-regression-205.test.js.map +1 -1
- package/dist/hooks/__tests__/notify-hook-session-scope.test.js +33 -0
- package/dist/hooks/__tests__/notify-hook-session-scope.test.js.map +1 -1
- package/dist/hooks/__tests__/notify-hook-team-dispatch.test.js +176 -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 +355 -7
- package/dist/hooks/__tests__/notify-hook-team-leader-nudge.test.js.map +1 -1
- package/dist/hooks/__tests__/notify-hook-tmux-heal.test.js +90 -2
- package/dist/hooks/__tests__/notify-hook-tmux-heal.test.js.map +1 -1
- package/dist/hooks/__tests__/session.test.js +142 -2
- package/dist/hooks/__tests__/session.test.js.map +1 -1
- package/dist/hooks/__tests__/wiki-docs-contract.test.d.ts +2 -0
- package/dist/hooks/__tests__/wiki-docs-contract.test.d.ts.map +1 -0
- package/dist/hooks/__tests__/wiki-docs-contract.test.js +34 -0
- package/dist/hooks/__tests__/wiki-docs-contract.test.js.map +1 -0
- package/dist/hooks/agents-overlay.d.ts.map +1 -1
- package/dist/hooks/agents-overlay.js +0 -1
- package/dist/hooks/agents-overlay.js.map +1 -1
- package/dist/hooks/extensibility/__tests__/dispatcher.test.js +32 -0
- package/dist/hooks/extensibility/__tests__/dispatcher.test.js.map +1 -1
- package/dist/hooks/extensibility/__tests__/runtime.test.js +31 -0
- package/dist/hooks/extensibility/__tests__/runtime.test.js.map +1 -1
- package/dist/hooks/extensibility/__tests__/sdk.test.js +33 -3
- package/dist/hooks/extensibility/__tests__/sdk.test.js.map +1 -1
- package/dist/hooks/extensibility/dispatcher.d.ts.map +1 -1
- package/dist/hooks/extensibility/dispatcher.js +41 -0
- package/dist/hooks/extensibility/dispatcher.js.map +1 -1
- package/dist/hooks/extensibility/sdk/runtime-state.d.ts.map +1 -1
- package/dist/hooks/extensibility/sdk/runtime-state.js +7 -1
- package/dist/hooks/extensibility/sdk/runtime-state.js.map +1 -1
- package/dist/hooks/extensibility/types.d.ts +1 -0
- package/dist/hooks/extensibility/types.d.ts.map +1 -1
- package/dist/hooks/keyword-detector.d.ts +6 -1
- package/dist/hooks/keyword-detector.d.ts.map +1 -1
- package/dist/hooks/keyword-detector.js +207 -10
- package/dist/hooks/keyword-detector.js.map +1 -1
- package/dist/hooks/keyword-registry.d.ts.map +1 -1
- package/dist/hooks/keyword-registry.js +3 -0
- package/dist/hooks/keyword-registry.js.map +1 -1
- package/dist/hooks/session.d.ts +14 -2
- package/dist/hooks/session.d.ts.map +1 -1
- package/dist/hooks/session.js +120 -16
- package/dist/hooks/session.js.map +1 -1
- package/dist/hud/__tests__/state.test.js +111 -2
- package/dist/hud/__tests__/state.test.js.map +1 -1
- package/dist/hud/state.d.ts.map +1 -1
- package/dist/hud/state.js +18 -21
- package/dist/hud/state.js.map +1 -1
- package/dist/mcp/__tests__/bootstrap.test.js +88 -1
- package/dist/mcp/__tests__/bootstrap.test.js.map +1 -1
- package/dist/mcp/__tests__/server-lifecycle.test.js +3 -0
- package/dist/mcp/__tests__/server-lifecycle.test.js.map +1 -1
- package/dist/mcp/__tests__/state-paths.test.js +30 -2
- package/dist/mcp/__tests__/state-paths.test.js.map +1 -1
- package/dist/mcp/__tests__/state-server.test.js +415 -0
- package/dist/mcp/__tests__/state-server.test.js.map +1 -1
- package/dist/mcp/__tests__/wiki-server.test.d.ts +2 -0
- package/dist/mcp/__tests__/wiki-server.test.d.ts.map +1 -0
- package/dist/mcp/__tests__/wiki-server.test.js +30 -0
- package/dist/mcp/__tests__/wiki-server.test.js.map +1 -0
- package/dist/mcp/bootstrap.d.ts +19 -1
- package/dist/mcp/bootstrap.d.ts.map +1 -1
- package/dist/mcp/bootstrap.js +185 -0
- package/dist/mcp/bootstrap.js.map +1 -1
- package/dist/mcp/state-paths.d.ts +5 -0
- package/dist/mcp/state-paths.d.ts.map +1 -1
- package/dist/mcp/state-paths.js +41 -11
- package/dist/mcp/state-paths.js.map +1 -1
- package/dist/mcp/state-server.d.ts +4 -4
- package/dist/mcp/state-server.d.ts.map +1 -1
- package/dist/mcp/state-server.js +49 -2
- package/dist/mcp/state-server.js.map +1 -1
- package/dist/mcp/wiki-server.d.ts +181 -0
- package/dist/mcp/wiki-server.d.ts.map +1 -0
- package/dist/mcp/wiki-server.js +235 -0
- package/dist/mcp/wiki-server.js.map +1 -0
- package/dist/modes/__tests__/base-autoresearch-contract.test.js +74 -2
- package/dist/modes/__tests__/base-autoresearch-contract.test.js.map +1 -1
- package/dist/modes/__tests__/base-multi-state-compat.test.d.ts +2 -0
- package/dist/modes/__tests__/base-multi-state-compat.test.d.ts.map +1 -0
- package/dist/modes/__tests__/base-multi-state-compat.test.js +38 -0
- package/dist/modes/__tests__/base-multi-state-compat.test.js.map +1 -0
- package/dist/modes/__tests__/base-tmux-pane.test.js +1 -1
- package/dist/modes/__tests__/base-tmux-pane.test.js.map +1 -1
- package/dist/modes/base.d.ts +2 -1
- package/dist/modes/base.d.ts.map +1 -1
- package/dist/modes/base.js +55 -31
- package/dist/modes/base.js.map +1 -1
- package/dist/notifications/__tests__/formatter.test.js +11 -0
- package/dist/notifications/__tests__/formatter.test.js.map +1 -1
- package/dist/notifications/__tests__/idle-cooldown.test.js +32 -1
- package/dist/notifications/__tests__/idle-cooldown.test.js.map +1 -1
- package/dist/notifications/__tests__/index.test.d.ts +2 -0
- package/dist/notifications/__tests__/index.test.d.ts.map +1 -0
- package/dist/notifications/__tests__/index.test.js +113 -0
- package/dist/notifications/__tests__/index.test.js.map +1 -0
- package/dist/notifications/__tests__/lifecycle-dedupe.test.d.ts +2 -0
- package/dist/notifications/__tests__/lifecycle-dedupe.test.d.ts.map +1 -0
- package/dist/notifications/__tests__/lifecycle-dedupe.test.js +86 -0
- package/dist/notifications/__tests__/lifecycle-dedupe.test.js.map +1 -0
- package/dist/notifications/__tests__/reply-listener.test.js +174 -0
- package/dist/notifications/__tests__/reply-listener.test.js.map +1 -1
- package/dist/notifications/__tests__/session-idle-tail-dedupe.test.d.ts +2 -0
- package/dist/notifications/__tests__/session-idle-tail-dedupe.test.d.ts.map +1 -0
- package/dist/notifications/__tests__/session-idle-tail-dedupe.test.js +93 -0
- package/dist/notifications/__tests__/session-idle-tail-dedupe.test.js.map +1 -0
- package/dist/notifications/__tests__/session-registry.test.js +48 -1
- package/dist/notifications/__tests__/session-registry.test.js.map +1 -1
- package/dist/notifications/__tests__/session-status.test.d.ts +2 -0
- package/dist/notifications/__tests__/session-status.test.d.ts.map +1 -0
- package/dist/notifications/__tests__/session-status.test.js +159 -0
- package/dist/notifications/__tests__/session-status.test.js.map +1 -0
- package/dist/notifications/__tests__/tmux.test.js +58 -1
- package/dist/notifications/__tests__/tmux.test.js.map +1 -1
- package/dist/notifications/idle-cooldown.d.ts +11 -0
- package/dist/notifications/idle-cooldown.d.ts.map +1 -1
- package/dist/notifications/idle-cooldown.js +42 -8
- package/dist/notifications/idle-cooldown.js.map +1 -1
- package/dist/notifications/index.d.ts +1 -1
- package/dist/notifications/index.d.ts.map +1 -1
- package/dist/notifications/index.js +41 -8
- package/dist/notifications/index.js.map +1 -1
- package/dist/notifications/lifecycle-dedupe.d.ts +8 -0
- package/dist/notifications/lifecycle-dedupe.d.ts.map +1 -0
- package/dist/notifications/lifecycle-dedupe.js +112 -0
- package/dist/notifications/lifecycle-dedupe.js.map +1 -0
- package/dist/notifications/reply-listener.d.ts +10 -1
- package/dist/notifications/reply-listener.d.ts.map +1 -1
- package/dist/notifications/reply-listener.js +49 -11
- package/dist/notifications/reply-listener.js.map +1 -1
- package/dist/notifications/session-registry.d.ts.map +1 -1
- package/dist/notifications/session-registry.js +7 -1
- package/dist/notifications/session-registry.js.map +1 -1
- package/dist/notifications/session-status.d.ts +23 -0
- package/dist/notifications/session-status.d.ts.map +1 -0
- package/dist/notifications/session-status.js +187 -0
- package/dist/notifications/session-status.js.map +1 -0
- package/dist/notifications/tmux.d.ts +10 -0
- package/dist/notifications/tmux.d.ts.map +1 -1
- package/dist/notifications/tmux.js +59 -5
- package/dist/notifications/tmux.js.map +1 -1
- package/dist/notifications/types.d.ts +2 -0
- package/dist/notifications/types.d.ts.map +1 -1
- package/dist/openclaw/__tests__/index.test.js +84 -0
- package/dist/openclaw/__tests__/index.test.js.map +1 -1
- package/dist/openclaw/index.d.ts.map +1 -1
- package/dist/openclaw/index.js +7 -14
- package/dist/openclaw/index.js.map +1 -1
- package/dist/openclaw/types.d.ts +2 -2
- package/dist/openclaw/types.d.ts.map +1 -1
- package/dist/scripts/__tests__/codex-native-hook.test.js +692 -40
- package/dist/scripts/__tests__/codex-native-hook.test.js.map +1 -1
- package/dist/scripts/__tests__/hook-derived-watcher.test.d.ts +2 -0
- package/dist/scripts/__tests__/hook-derived-watcher.test.d.ts.map +1 -0
- package/dist/scripts/__tests__/hook-derived-watcher.test.js +87 -0
- package/dist/scripts/__tests__/hook-derived-watcher.test.js.map +1 -0
- package/dist/scripts/codex-native-hook.d.ts.map +1 -1
- package/dist/scripts/codex-native-hook.js +309 -77
- package/dist/scripts/codex-native-hook.js.map +1 -1
- package/dist/scripts/hook-derived-watcher.js +43 -1
- package/dist/scripts/hook-derived-watcher.js.map +1 -1
- package/dist/scripts/notify-fallback-watcher.js +95 -21
- package/dist/scripts/notify-fallback-watcher.js.map +1 -1
- package/dist/scripts/notify-hook/active-team.d.ts +9 -0
- package/dist/scripts/notify-hook/active-team.d.ts.map +1 -0
- package/dist/scripts/notify-hook/active-team.js +44 -0
- package/dist/scripts/notify-hook/active-team.js.map +1 -0
- package/dist/scripts/notify-hook/auto-nudge.d.ts +5 -3
- package/dist/scripts/notify-hook/auto-nudge.d.ts.map +1 -1
- package/dist/scripts/notify-hook/auto-nudge.js +121 -78
- package/dist/scripts/notify-hook/auto-nudge.js.map +1 -1
- package/dist/scripts/notify-hook/managed-tmux.d.ts.map +1 -1
- package/dist/scripts/notify-hook/managed-tmux.js +18 -4
- package/dist/scripts/notify-hook/managed-tmux.js.map +1 -1
- package/dist/scripts/notify-hook/operational-events.d.ts.map +1 -1
- package/dist/scripts/notify-hook/operational-events.js +21 -0
- package/dist/scripts/notify-hook/operational-events.js.map +1 -1
- package/dist/scripts/notify-hook/ralph-session-resume.d.ts.map +1 -1
- package/dist/scripts/notify-hook/ralph-session-resume.js +3 -2
- package/dist/scripts/notify-hook/ralph-session-resume.js.map +1 -1
- package/dist/scripts/notify-hook/state-io.d.ts +10 -1
- package/dist/scripts/notify-hook/state-io.d.ts.map +1 -1
- package/dist/scripts/notify-hook/state-io.js +56 -12
- package/dist/scripts/notify-hook/state-io.js.map +1 -1
- package/dist/scripts/notify-hook/team-dispatch.d.ts.map +1 -1
- package/dist/scripts/notify-hook/team-dispatch.js +305 -167
- package/dist/scripts/notify-hook/team-dispatch.js.map +1 -1
- package/dist/scripts/notify-hook/team-leader-nudge.d.ts.map +1 -1
- package/dist/scripts/notify-hook/team-leader-nudge.js +87 -15
- package/dist/scripts/notify-hook/team-leader-nudge.js.map +1 -1
- package/dist/scripts/notify-hook/tmux-injection.d.ts.map +1 -1
- package/dist/scripts/notify-hook/tmux-injection.js +11 -2
- package/dist/scripts/notify-hook/tmux-injection.js.map +1 -1
- package/dist/scripts/notify-hook.js +26 -16
- package/dist/scripts/notify-hook.js.map +1 -1
- package/dist/scripts/run-provider-advisor.js +20 -2
- package/dist/scripts/run-provider-advisor.js.map +1 -1
- package/dist/scripts/smoke-packed-install.d.ts +1 -8
- package/dist/scripts/smoke-packed-install.d.ts.map +1 -1
- package/dist/scripts/smoke-packed-install.js +12 -68
- package/dist/scripts/smoke-packed-install.js.map +1 -1
- package/dist/state/__tests__/operations.test.js +113 -0
- package/dist/state/__tests__/operations.test.js.map +1 -1
- package/dist/state/__tests__/skill-active.test.js +35 -0
- package/dist/state/__tests__/skill-active.test.js.map +1 -1
- package/dist/state/__tests__/workflow-transition.test.d.ts +2 -0
- package/dist/state/__tests__/workflow-transition.test.d.ts.map +1 -0
- package/dist/state/__tests__/workflow-transition.test.js +56 -0
- package/dist/state/__tests__/workflow-transition.test.js.map +1 -0
- package/dist/state/operations.d.ts +1 -1
- package/dist/state/operations.d.ts.map +1 -1
- package/dist/state/operations.js +88 -2
- package/dist/state/operations.js.map +1 -1
- package/dist/state/skill-active.d.ts +2 -2
- package/dist/state/skill-active.d.ts.map +1 -1
- package/dist/state/skill-active.js +119 -33
- package/dist/state/skill-active.js.map +1 -1
- package/dist/state/workflow-transition-reconcile.d.ts +15 -0
- package/dist/state/workflow-transition-reconcile.d.ts.map +1 -0
- package/dist/state/workflow-transition-reconcile.js +100 -0
- package/dist/state/workflow-transition-reconcile.js.map +1 -0
- package/dist/state/workflow-transition.d.ts +22 -0
- package/dist/state/workflow-transition.d.ts.map +1 -0
- package/dist/state/workflow-transition.js +188 -0
- package/dist/state/workflow-transition.js.map +1 -0
- package/dist/team/__tests__/api-interop.test.js +90 -0
- package/dist/team/__tests__/api-interop.test.js.map +1 -1
- package/dist/team/__tests__/current-task-baseline.test.d.ts +2 -0
- package/dist/team/__tests__/current-task-baseline.test.d.ts.map +1 -0
- package/dist/team/__tests__/current-task-baseline.test.js +87 -0
- package/dist/team/__tests__/current-task-baseline.test.js.map +1 -0
- package/dist/team/__tests__/hardening-e2e.test.js +17 -0
- package/dist/team/__tests__/hardening-e2e.test.js.map +1 -1
- package/dist/team/__tests__/runtime.test.js +673 -65
- package/dist/team/__tests__/runtime.test.js.map +1 -1
- package/dist/team/__tests__/shutdown-fallback.test.js +11 -1
- package/dist/team/__tests__/shutdown-fallback.test.js.map +1 -1
- package/dist/team/__tests__/tmux-session.test.js +447 -4
- package/dist/team/__tests__/tmux-session.test.js.map +1 -1
- package/dist/team/api-interop.d.ts.map +1 -1
- package/dist/team/api-interop.js +10 -1
- package/dist/team/api-interop.js.map +1 -1
- package/dist/team/current-task-baseline.d.ts +32 -0
- package/dist/team/current-task-baseline.d.ts.map +1 -0
- package/dist/team/current-task-baseline.js +85 -0
- package/dist/team/current-task-baseline.js.map +1 -0
- package/dist/team/delivery-log.d.ts +1 -1
- package/dist/team/delivery-log.d.ts.map +1 -1
- package/dist/team/delivery-log.js.map +1 -1
- package/dist/team/leader-activity.d.ts +1 -0
- package/dist/team/leader-activity.d.ts.map +1 -1
- package/dist/team/leader-activity.js +4 -2
- package/dist/team/leader-activity.js.map +1 -1
- package/dist/team/progress-evidence.d.ts +2 -0
- package/dist/team/progress-evidence.d.ts.map +1 -0
- package/dist/team/progress-evidence.js +77 -0
- package/dist/team/progress-evidence.js.map +1 -0
- package/dist/team/runtime.d.ts.map +1 -1
- package/dist/team/runtime.js +269 -64
- package/dist/team/runtime.js.map +1 -1
- package/dist/team/scaling.d.ts.map +1 -1
- package/dist/team/scaling.js +1 -1
- package/dist/team/scaling.js.map +1 -1
- package/dist/team/state.d.ts.map +1 -1
- package/dist/team/state.js +2 -13
- package/dist/team/state.js.map +1 -1
- package/dist/team/tmux-session.d.ts +12 -3
- package/dist/team/tmux-session.d.ts.map +1 -1
- package/dist/team/tmux-session.js +174 -20
- package/dist/team/tmux-session.js.map +1 -1
- package/dist/team/worktree.d.ts +6 -1
- package/dist/team/worktree.d.ts.map +1 -1
- package/dist/team/worktree.js +28 -4
- package/dist/team/worktree.js.map +1 -1
- package/dist/utils/__tests__/agents-md.test.js +21 -1
- package/dist/utils/__tests__/agents-md.test.js.map +1 -1
- package/dist/utils/__tests__/repo-deps.test.d.ts +2 -0
- package/dist/utils/__tests__/repo-deps.test.d.ts.map +1 -0
- package/dist/utils/__tests__/repo-deps.test.js +71 -0
- package/dist/utils/__tests__/repo-deps.test.js.map +1 -0
- package/dist/utils/agents-md.d.ts +1 -0
- package/dist/utils/agents-md.d.ts.map +1 -1
- package/dist/utils/agents-md.js +7 -3
- package/dist/utils/agents-md.js.map +1 -1
- package/dist/utils/paths.d.ts +4 -0
- package/dist/utils/paths.d.ts.map +1 -1
- package/dist/utils/paths.js +20 -0
- package/dist/utils/paths.js.map +1 -1
- package/dist/utils/repo-deps.d.ts +20 -0
- package/dist/utils/repo-deps.d.ts.map +1 -0
- package/dist/utils/repo-deps.js +78 -0
- package/dist/utils/repo-deps.js.map +1 -0
- package/dist/verification/__tests__/dev-merge-issue-close-workflow.test.d.ts +2 -0
- package/dist/verification/__tests__/dev-merge-issue-close-workflow.test.d.ts.map +1 -0
- package/dist/verification/__tests__/dev-merge-issue-close-workflow.test.js +54 -0
- package/dist/verification/__tests__/dev-merge-issue-close-workflow.test.js.map +1 -0
- package/dist/wiki/__tests__/cjk-tokenize.test.d.ts +12 -0
- package/dist/wiki/__tests__/cjk-tokenize.test.d.ts.map +1 -0
- package/dist/wiki/__tests__/cjk-tokenize.test.js +139 -0
- package/dist/wiki/__tests__/cjk-tokenize.test.js.map +1 -0
- package/dist/wiki/__tests__/crlf-parse.test.d.ts +2 -0
- package/dist/wiki/__tests__/crlf-parse.test.d.ts.map +1 -0
- package/dist/wiki/__tests__/crlf-parse.test.js +24 -0
- package/dist/wiki/__tests__/crlf-parse.test.js.map +1 -0
- package/dist/wiki/__tests__/escape-newline.test.d.ts +2 -0
- package/dist/wiki/__tests__/escape-newline.test.d.ts.map +1 -0
- package/dist/wiki/__tests__/escape-newline.test.js +45 -0
- package/dist/wiki/__tests__/escape-newline.test.js.map +1 -0
- package/dist/wiki/__tests__/ingest.test.d.ts +5 -0
- package/dist/wiki/__tests__/ingest.test.d.ts.map +1 -0
- package/dist/wiki/__tests__/ingest.test.js +181 -0
- package/dist/wiki/__tests__/ingest.test.js.map +1 -0
- package/dist/wiki/__tests__/lint.test.d.ts +5 -0
- package/dist/wiki/__tests__/lint.test.d.ts.map +1 -0
- package/dist/wiki/__tests__/lint.test.js +163 -0
- package/dist/wiki/__tests__/lint.test.js.map +1 -0
- package/dist/wiki/__tests__/query.test.d.ts +5 -0
- package/dist/wiki/__tests__/query.test.d.ts.map +1 -0
- package/dist/wiki/__tests__/query.test.js +141 -0
- package/dist/wiki/__tests__/query.test.js.map +1 -0
- package/dist/wiki/__tests__/reserved-file-guard.test.d.ts +2 -0
- package/dist/wiki/__tests__/reserved-file-guard.test.d.ts.map +1 -0
- package/dist/wiki/__tests__/reserved-file-guard.test.js +44 -0
- package/dist/wiki/__tests__/reserved-file-guard.test.js.map +1 -0
- package/dist/wiki/__tests__/session-hooks.test.d.ts +5 -0
- package/dist/wiki/__tests__/session-hooks.test.d.ts.map +1 -0
- package/dist/wiki/__tests__/session-hooks.test.js +36 -0
- package/dist/wiki/__tests__/session-hooks.test.js.map +1 -0
- package/dist/wiki/__tests__/slug-nonascii.test.d.ts +2 -0
- package/dist/wiki/__tests__/slug-nonascii.test.d.ts.map +1 -0
- package/dist/wiki/__tests__/slug-nonascii.test.js +24 -0
- package/dist/wiki/__tests__/slug-nonascii.test.js.map +1 -0
- package/dist/wiki/__tests__/storage.test.d.ts +5 -0
- package/dist/wiki/__tests__/storage.test.d.ts.map +1 -0
- package/dist/wiki/__tests__/storage.test.js +278 -0
- package/dist/wiki/__tests__/storage.test.js.map +1 -0
- package/dist/wiki/__tests__/test-helpers.d.ts +31 -0
- package/dist/wiki/__tests__/test-helpers.d.ts.map +1 -0
- package/dist/wiki/__tests__/test-helpers.js +108 -0
- package/dist/wiki/__tests__/test-helpers.js.map +1 -0
- package/dist/wiki/index.d.ts +14 -0
- package/dist/wiki/index.d.ts.map +1 -0
- package/dist/wiki/index.js +17 -0
- package/dist/wiki/index.js.map +1 -0
- package/dist/wiki/ingest.d.ts +20 -0
- package/dist/wiki/ingest.d.ts.map +1 -0
- package/dist/wiki/ingest.js +115 -0
- package/dist/wiki/ingest.js.map +1 -0
- package/dist/wiki/lifecycle.d.ts +20 -0
- package/dist/wiki/lifecycle.d.ts.map +1 -0
- package/dist/wiki/lifecycle.js +212 -0
- package/dist/wiki/lifecycle.js.map +1 -0
- package/dist/wiki/lint.d.ts +25 -0
- package/dist/wiki/lint.d.ts.map +1 -0
- package/dist/wiki/lint.js +166 -0
- package/dist/wiki/lint.js.map +1 -0
- package/dist/wiki/query.d.ts +36 -0
- package/dist/wiki/query.d.ts.map +1 -0
- package/dist/wiki/query.js +138 -0
- package/dist/wiki/query.js.map +1 -0
- package/dist/wiki/storage.d.ts +33 -0
- package/dist/wiki/storage.d.ts.map +1 -0
- package/dist/wiki/storage.js +321 -0
- package/dist/wiki/storage.js.map +1 -0
- package/dist/wiki/types.d.ts +83 -0
- package/dist/wiki/types.d.ts.map +1 -0
- package/dist/wiki/types.js +15 -0
- package/dist/wiki/types.js.map +1 -0
- package/package.json +3 -1
- package/skills/configure-notifications/SKILL.md +1 -0
- package/skills/doctor/SKILL.md +11 -0
- package/skills/omx-setup/SKILL.md +1 -1
- package/skills/wiki/SKILL.md +57 -0
- package/src/scripts/__tests__/codex-native-hook.test.ts +920 -56
- package/src/scripts/__tests__/hook-derived-watcher.test.ts +111 -0
- package/src/scripts/codex-native-hook.ts +377 -83
- package/src/scripts/hook-derived-watcher.ts +43 -1
- package/src/scripts/notify-fallback-watcher.ts +99 -20
- package/src/scripts/notify-hook/active-team.ts +54 -0
- package/src/scripts/notify-hook/auto-nudge.ts +132 -79
- package/src/scripts/notify-hook/managed-tmux.ts +22 -4
- package/src/scripts/notify-hook/operational-events.ts +21 -0
- package/src/scripts/notify-hook/ralph-session-resume.ts +3 -2
- package/src/scripts/notify-hook/state-io.ts +89 -12
- package/src/scripts/notify-hook/team-dispatch.ts +326 -168
- package/src/scripts/notify-hook/team-leader-nudge.ts +91 -14
- package/src/scripts/notify-hook/tmux-injection.ts +11 -2
- package/src/scripts/notify-hook.ts +36 -22
- package/src/scripts/run-provider-advisor.ts +20 -2
- package/src/scripts/smoke-packed-install.ts +16 -83
- package/templates/AGENTS.md +3 -4
|
@@ -62,6 +62,48 @@ function safeString(value: unknown): string {
|
|
|
62
62
|
return typeof value === 'string' ? value : '';
|
|
63
63
|
}
|
|
64
64
|
|
|
65
|
+
function collectMessageTextFragments(value: unknown, fragments: string[]): void {
|
|
66
|
+
if (typeof value === 'string') {
|
|
67
|
+
if (value.trim() !== '') fragments.push(value);
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
if (Array.isArray(value)) {
|
|
72
|
+
for (const item of value) collectMessageTextFragments(item, fragments);
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
if (!value || typeof value !== 'object') return;
|
|
77
|
+
|
|
78
|
+
const record = value as Record<string, unknown>;
|
|
79
|
+
let usedPreferredField = false;
|
|
80
|
+
for (const key of ['text', 'message', 'content']) {
|
|
81
|
+
if (!(key in record)) continue;
|
|
82
|
+
usedPreferredField = true;
|
|
83
|
+
collectMessageTextFragments(record[key], fragments);
|
|
84
|
+
}
|
|
85
|
+
if (usedPreferredField) return;
|
|
86
|
+
|
|
87
|
+
for (const child of Object.values(record)) {
|
|
88
|
+
collectMessageTextFragments(child, fragments);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
function extractMessageText(payload: Record<string, unknown>): string {
|
|
93
|
+
for (const candidate of [payload.text, payload.message, payload.content]) {
|
|
94
|
+
if (typeof candidate === 'string') {
|
|
95
|
+
if (candidate.trim() !== '') return candidate;
|
|
96
|
+
continue;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
const fragments: string[] = [];
|
|
100
|
+
collectMessageTextFragments(candidate, fragments);
|
|
101
|
+
const text = fragments.join('\n').trim();
|
|
102
|
+
if (text) return text;
|
|
103
|
+
}
|
|
104
|
+
return '';
|
|
105
|
+
}
|
|
106
|
+
|
|
65
107
|
function derivedLog(entry: Record<string, unknown>): Promise<void> {
|
|
66
108
|
return appendFile(logPath, `${JSON.stringify({ timestamp: new Date().toISOString(), ...entry })}\n`).catch(() => {});
|
|
67
109
|
}
|
|
@@ -185,7 +227,7 @@ function inferDerivedEvent(parsed: Record<string, unknown> | null, meta: FileMet
|
|
|
185
227
|
}
|
|
186
228
|
|
|
187
229
|
if (payloadType === 'assistant_message') {
|
|
188
|
-
const message =
|
|
230
|
+
const message = extractMessageText(payload);
|
|
189
231
|
const looksLikeQuestion = /\?|\b(can you|could you|please provide|need input|what should)/i.test(message);
|
|
190
232
|
if (looksLikeQuestion) {
|
|
191
233
|
return {
|
|
@@ -15,6 +15,9 @@ import {
|
|
|
15
15
|
normalizeAutoNudgeSignatureText,
|
|
16
16
|
resolveAutoNudgeSignature,
|
|
17
17
|
} from './notify-hook/auto-nudge.js';
|
|
18
|
+
import {
|
|
19
|
+
readScopedJsonIfExists,
|
|
20
|
+
} from './notify-hook/state-io.js';
|
|
18
21
|
import { checkPaneReadyForTeamSendKeys } from './notify-hook/team-tmux-guard.js';
|
|
19
22
|
import {
|
|
20
23
|
checkWorkerPanesAlive,
|
|
@@ -24,11 +27,13 @@ import {
|
|
|
24
27
|
} from './notify-hook/team-leader-nudge.js';
|
|
25
28
|
import { DEFAULT_MARKER } from './tmux-hook-engine.js';
|
|
26
29
|
import { isTerminalPhase } from './notify-hook/utils.js';
|
|
27
|
-
import { isSessionStale, readSessionState } from '../hooks/session.js';
|
|
30
|
+
import { isSessionStale, isSessionStateAuthoritativeForCwd, readSessionState } from '../hooks/session.js';
|
|
28
31
|
import {
|
|
29
32
|
DEFAULT_SUBAGENT_ACTIVE_WINDOW_MS,
|
|
30
33
|
readSubagentSessionSummary,
|
|
31
34
|
} from '../subagents/tracker.js';
|
|
35
|
+
import { listNotifyCanonicalActiveTeams } from './notify-hook/active-team.js';
|
|
36
|
+
import { sameFilePath } from '../utils/paths.js';
|
|
32
37
|
|
|
33
38
|
function argValue(name: string, fallback = ''): string {
|
|
34
39
|
const idx = process.argv.indexOf(name);
|
|
@@ -124,6 +129,7 @@ const RALPH_CONTINUE_TEXT = 'Ralph loop active continue';
|
|
|
124
129
|
const RALPH_CONTINUE_CADENCE_MS = 60_000;
|
|
125
130
|
const RALPH_STEER_LOCK_STALE_MS = 30_000;
|
|
126
131
|
const RALPH_TERMINAL_PHASES = new Set(['complete', 'failed', 'cancelled']);
|
|
132
|
+
const RALPH_STARTING_PHASE_TIMEOUT_MS = RALPH_CONTINUE_CADENCE_MS * 2;
|
|
127
133
|
const QUIET_ONCE_EVENT_TYPES = new Set(['watcher_start', 'watcher_once_complete']);
|
|
128
134
|
|
|
129
135
|
interface WatcherFileMeta {
|
|
@@ -453,10 +459,19 @@ function hasRalphTerminalState(raw: Record<string, unknown> | null | undefined):
|
|
|
453
459
|
if (raw.active !== true) return true;
|
|
454
460
|
const phase = safeString(raw.current_phase).trim().toLowerCase();
|
|
455
461
|
if (phase && RALPH_TERMINAL_PHASES.has(phase)) return true;
|
|
462
|
+
if (isStaleRalphStartingPhase(raw)) return true;
|
|
456
463
|
if (safeString(raw.completed_at).trim()) return true;
|
|
457
464
|
return false;
|
|
458
465
|
}
|
|
459
466
|
|
|
467
|
+
function isStaleRalphStartingPhase(raw: Record<string, unknown>): boolean {
|
|
468
|
+
const phase = safeString(raw.current_phase).trim().toLowerCase();
|
|
469
|
+
if (phase !== 'starting') return false;
|
|
470
|
+
const reference = parseIsoMillis(safeString(raw.last_turn_at)) ?? parseIsoMillis(safeString(raw.started_at));
|
|
471
|
+
if (reference === null) return false;
|
|
472
|
+
return Date.now() - reference > RALPH_STARTING_PHASE_TIMEOUT_MS;
|
|
473
|
+
}
|
|
474
|
+
|
|
460
475
|
async function loadPersistedWatcherState(): Promise<void> {
|
|
461
476
|
const persisted = await readFile(statePath, 'utf-8')
|
|
462
477
|
.then((content) => JSON.parse(content) as Record<string, unknown>)
|
|
@@ -507,8 +522,10 @@ async function resolveActiveModeState(mode: string): Promise<ActiveModeResult> {
|
|
|
507
522
|
let currentSessionIsLive = false;
|
|
508
523
|
const session = await readSessionState(cwd);
|
|
509
524
|
if (session?.session_id) {
|
|
510
|
-
|
|
511
|
-
|
|
525
|
+
if (isSessionStateAuthoritativeForCwd(session, cwd)) {
|
|
526
|
+
currentSessionId = safeString(session.session_id).trim();
|
|
527
|
+
currentSessionIsLive = !isSessionStale(session);
|
|
528
|
+
}
|
|
512
529
|
if (currentSessionId && currentSessionIsLive) {
|
|
513
530
|
candidateDirs.push(join(stateDir, 'sessions', currentSessionId));
|
|
514
531
|
}
|
|
@@ -531,6 +548,14 @@ async function resolveActiveModeState(mode: string): Promise<ActiveModeResult> {
|
|
|
531
548
|
.then((content) => JSON.parse(content) as Record<string, unknown>)
|
|
532
549
|
.catch(() => null);
|
|
533
550
|
if (!parsed || typeof parsed !== 'object') continue;
|
|
551
|
+
if (mode === 'ralph' && dir !== stateDir && isStaleRalphStartingPhase(parsed)) {
|
|
552
|
+
return {
|
|
553
|
+
active: false,
|
|
554
|
+
reason: 'starting_stale',
|
|
555
|
+
path,
|
|
556
|
+
state: parsed,
|
|
557
|
+
};
|
|
558
|
+
}
|
|
534
559
|
if (hasRalphTerminalState(parsed)) {
|
|
535
560
|
return {
|
|
536
561
|
active: false,
|
|
@@ -561,19 +586,23 @@ async function resolveActiveRalphState(): Promise<ActiveModeResult> {
|
|
|
561
586
|
|
|
562
587
|
async function resolveActiveTeamState(): Promise<ActiveTeamResult> {
|
|
563
588
|
const candidateDirs: string[] = [];
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
589
|
+
let currentSessionId = '';
|
|
590
|
+
let currentSessionIsLive = false;
|
|
591
|
+
const session = await readSessionState(cwd);
|
|
592
|
+
if (session?.session_id) {
|
|
593
|
+
currentSessionId = safeString(session.session_id).trim();
|
|
594
|
+
currentSessionIsLive = !isSessionStale(session);
|
|
595
|
+
if (currentSessionId && currentSessionIsLive) {
|
|
596
|
+
candidateDirs.push(join(stateDir, 'sessions', currentSessionId));
|
|
570
597
|
}
|
|
571
|
-
} catch {
|
|
572
|
-
// No active session file; fall back to root state only.
|
|
573
598
|
}
|
|
574
599
|
if (!candidateDirs.includes(stateDir)) candidateDirs.push(stateDir);
|
|
575
600
|
|
|
576
601
|
for (const dir of candidateDirs) {
|
|
602
|
+
if (dir === stateDir && currentSessionId) {
|
|
603
|
+
continue;
|
|
604
|
+
}
|
|
605
|
+
|
|
577
606
|
const path = join(dir, 'team-state.json');
|
|
578
607
|
if (!existsSync(path)) continue;
|
|
579
608
|
const parsed = await readFile(path, 'utf-8')
|
|
@@ -622,6 +651,52 @@ async function resolveActiveTeamState(): Promise<ActiveTeamResult> {
|
|
|
622
651
|
};
|
|
623
652
|
}
|
|
624
653
|
|
|
654
|
+
const canonicalFallbackTeams = await listNotifyCanonicalActiveTeams(cwd, currentSessionId).catch(() => []);
|
|
655
|
+
for (const team of canonicalFallbackTeams) {
|
|
656
|
+
const teamConfigDir = join(stateDir, 'team', team.teamName);
|
|
657
|
+
const manifestPath = join(teamConfigDir, 'manifest.v2.json');
|
|
658
|
+
const configPath = join(teamConfigDir, 'config.json');
|
|
659
|
+
const teamConfigPath = existsSync(manifestPath) ? manifestPath : configPath;
|
|
660
|
+
const teamConfig = existsSync(teamConfigPath)
|
|
661
|
+
? await readFile(teamConfigPath, 'utf-8')
|
|
662
|
+
.then((content) => JSON.parse(content) as Record<string, unknown>)
|
|
663
|
+
.catch(() => null)
|
|
664
|
+
: null;
|
|
665
|
+
const tmuxSession = safeString(teamConfig?.tmux_session).trim();
|
|
666
|
+
if (!tmuxSession) continue;
|
|
667
|
+
|
|
668
|
+
const workers = Array.isArray(teamConfig?.workers) ? teamConfig.workers as Array<Record<string, unknown>> : [];
|
|
669
|
+
const workerPaneIds: string[] = workers
|
|
670
|
+
.map((worker) => safeString(worker?.pane_id).trim())
|
|
671
|
+
.filter(Boolean);
|
|
672
|
+
const paneStatus = await checkWorkerPanesAlive(tmuxSession, workerPaneIds as any);
|
|
673
|
+
if (!paneStatus.alive) continue;
|
|
674
|
+
|
|
675
|
+
return {
|
|
676
|
+
active: true,
|
|
677
|
+
reason: team.source,
|
|
678
|
+
path: team.path,
|
|
679
|
+
state: {
|
|
680
|
+
active: true,
|
|
681
|
+
team_name: team.teamName,
|
|
682
|
+
current_phase: team.phase,
|
|
683
|
+
},
|
|
684
|
+
team_name: team.teamName,
|
|
685
|
+
pane_count: paneStatus.paneCount,
|
|
686
|
+
};
|
|
687
|
+
}
|
|
688
|
+
|
|
689
|
+
if (currentSessionId) {
|
|
690
|
+
return {
|
|
691
|
+
active: false,
|
|
692
|
+
reason: currentSessionIsLive ? 'blocked_by_current_session' : 'stale_current_session',
|
|
693
|
+
path: '',
|
|
694
|
+
state: null,
|
|
695
|
+
team_name: '',
|
|
696
|
+
pane_count: 0,
|
|
697
|
+
};
|
|
698
|
+
}
|
|
699
|
+
|
|
625
700
|
return {
|
|
626
701
|
active: false,
|
|
627
702
|
reason: 'cleared',
|
|
@@ -750,7 +825,7 @@ async function readRalphProgressGate(
|
|
|
750
825
|
}
|
|
751
826
|
}
|
|
752
827
|
|
|
753
|
-
const hudState = await
|
|
828
|
+
const hudState = await readScopedJsonIfExists(stateDir, 'hud-state.json', undefined, null);
|
|
754
829
|
if (!hudState || typeof hudState !== 'object') {
|
|
755
830
|
return { allow: false, reason: 'progress_missing', progress_at: '', subagent_session_id: subagentSessionId };
|
|
756
831
|
}
|
|
@@ -853,7 +928,7 @@ async function resolveAuthorityPrimaryWatcherHealth(now = Date.now()): Promise<A
|
|
|
853
928
|
|
|
854
929
|
const existingRecord = await readPidFileRecord(pidFilePath).catch(() => null);
|
|
855
930
|
if (!existingRecord) return createAuthorityBackoffState('pid_missing');
|
|
856
|
-
if (existingRecord.cwd &&
|
|
931
|
+
if (existingRecord.cwd && !sameFilePath(existingRecord.cwd, cwd)) return createAuthorityBackoffState('cwd_mismatch');
|
|
857
932
|
if (!isPidAlive(existingRecord.pid)) {
|
|
858
933
|
return createAuthorityBackoffState('pid_stale', {
|
|
859
934
|
primary_pid: existingRecord.pid,
|
|
@@ -948,7 +1023,12 @@ async function runRalphContinueSteerTick(): Promise<void> {
|
|
|
948
1023
|
singleton_lock_path: ralphSteerLockPath,
|
|
949
1024
|
};
|
|
950
1025
|
|
|
951
|
-
if (!activeRalph.active)
|
|
1026
|
+
if (!activeRalph.active) {
|
|
1027
|
+
if (activeRalph.reason === 'starting_stale') {
|
|
1028
|
+
lastRalphContinueSteer.last_reason = 'starting_stale';
|
|
1029
|
+
}
|
|
1030
|
+
return;
|
|
1031
|
+
}
|
|
952
1032
|
|
|
953
1033
|
if (parseIsoMillis(lastRalphContinueSteer.last_sent_at) === null && parseIsoMillis(lastRalphContinueSteer.cooldown_anchor_at) === null) {
|
|
954
1034
|
lastRalphContinueSteer.cooldown_anchor_at = startupIso;
|
|
@@ -1160,19 +1240,18 @@ async function readJsonObject(path: string): Promise<Record<string, unknown> | n
|
|
|
1160
1240
|
}
|
|
1161
1241
|
|
|
1162
1242
|
async function readAutoNudgeCount(): Promise<number> {
|
|
1163
|
-
const parsed = await
|
|
1243
|
+
const parsed = await readScopedJsonIfExists(stateDir, 'auto-nudge-state.json', undefined, null);
|
|
1164
1244
|
return Math.max(0, Math.trunc(asNumber(parsed?.nudgeCount as string | number | undefined, 0)));
|
|
1165
1245
|
}
|
|
1166
1246
|
|
|
1167
1247
|
async function readAutoNudgeState(): Promise<Record<string, unknown> | null> {
|
|
1168
|
-
return
|
|
1248
|
+
return readScopedJsonIfExists(stateDir, 'auto-nudge-state.json', undefined, null);
|
|
1169
1249
|
}
|
|
1170
1250
|
|
|
1171
1251
|
async function runFallbackAutoNudgeTick(): Promise<void> {
|
|
1172
1252
|
const now = Date.now();
|
|
1173
1253
|
const nowIso = new Date(now).toISOString();
|
|
1174
|
-
const
|
|
1175
|
-
const hudState = await readJsonObject(hudStatePath);
|
|
1254
|
+
const hudState = await readScopedJsonIfExists(stateDir, 'hud-state.json', undefined, null);
|
|
1176
1255
|
|
|
1177
1256
|
lastFallbackAutoNudge = {
|
|
1178
1257
|
...lastFallbackAutoNudge,
|
|
@@ -1641,8 +1720,8 @@ async function runDispatchDrainTick(): Promise<boolean> {
|
|
|
1641
1720
|
|
|
1642
1721
|
async function shouldSuppressInteractiveFallbackTicks(): Promise<boolean> {
|
|
1643
1722
|
const [deepInterviewStateActive, deepInterviewInputLockActive] = await Promise.all([
|
|
1644
|
-
isDeepInterviewStateActive(stateDir),
|
|
1645
|
-
isDeepInterviewInputLockActive(stateDir),
|
|
1723
|
+
isDeepInterviewStateActive(stateDir, undefined),
|
|
1724
|
+
isDeepInterviewInputLockActive(stateDir, undefined),
|
|
1646
1725
|
]);
|
|
1647
1726
|
return deepInterviewStateActive || deepInterviewInputLockActive;
|
|
1648
1727
|
}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { existsSync } from 'fs';
|
|
2
|
+
import { readdir } from 'fs/promises';
|
|
3
|
+
import { join } from 'path';
|
|
4
|
+
import { readTeamManifestV2, readTeamPhase } from '../../team/state.js';
|
|
5
|
+
import { resolveCanonicalTeamStateRoot } from '../../team/state-root.js';
|
|
6
|
+
import { isTerminalPhase, safeString } from './utils.js';
|
|
7
|
+
|
|
8
|
+
export interface NotifyCanonicalActiveTeam {
|
|
9
|
+
teamName: string;
|
|
10
|
+
phase: string;
|
|
11
|
+
ownerSessionId: string;
|
|
12
|
+
path: string;
|
|
13
|
+
source: 'canonical_fallback';
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export async function listNotifyCanonicalActiveTeams(
|
|
17
|
+
cwd: string,
|
|
18
|
+
currentSessionId: string,
|
|
19
|
+
): Promise<NotifyCanonicalActiveTeam[]> {
|
|
20
|
+
const sessionId = safeString(currentSessionId).trim();
|
|
21
|
+
if (!sessionId) return [];
|
|
22
|
+
|
|
23
|
+
const teamsRoot = join(resolveCanonicalTeamStateRoot(cwd), 'team');
|
|
24
|
+
if (!existsSync(teamsRoot)) return [];
|
|
25
|
+
|
|
26
|
+
const entries = await readdir(teamsRoot, { withFileTypes: true }).catch(() => []);
|
|
27
|
+
const teams: NotifyCanonicalActiveTeam[] = [];
|
|
28
|
+
for (const entry of entries) {
|
|
29
|
+
if (!entry.isDirectory()) continue;
|
|
30
|
+
const teamName = entry.name.trim();
|
|
31
|
+
if (!teamName) continue;
|
|
32
|
+
|
|
33
|
+
const [manifest, phaseState] = await Promise.all([
|
|
34
|
+
readTeamManifestV2(teamName, cwd),
|
|
35
|
+
readTeamPhase(teamName, cwd),
|
|
36
|
+
]);
|
|
37
|
+
if (!manifest || !phaseState) continue;
|
|
38
|
+
|
|
39
|
+
const ownerSessionId = safeString(manifest.leader?.session_id).trim();
|
|
40
|
+
if (!ownerSessionId || ownerSessionId !== sessionId) continue;
|
|
41
|
+
|
|
42
|
+
const phase = safeString(phaseState.current_phase).trim();
|
|
43
|
+
if (!phase || isTerminalPhase(phase)) continue;
|
|
44
|
+
|
|
45
|
+
teams.push({
|
|
46
|
+
teamName,
|
|
47
|
+
phase,
|
|
48
|
+
ownerSessionId,
|
|
49
|
+
path: join(teamsRoot, teamName, 'phase.json'),
|
|
50
|
+
source: 'canonical_fallback',
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
return teams;
|
|
54
|
+
}
|