oh-my-codex 0.6.3 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +19 -9
- package/bin/omx.js +3 -5
- package/dist/agents/__tests__/definitions.test.d.ts +2 -0
- package/dist/agents/__tests__/definitions.test.d.ts.map +1 -0
- package/dist/agents/__tests__/definitions.test.js +35 -0
- package/dist/agents/__tests__/definitions.test.js.map +1 -0
- package/dist/agents/__tests__/native-config.test.d.ts +2 -0
- package/dist/agents/__tests__/native-config.test.d.ts.map +1 -0
- package/dist/agents/__tests__/native-config.test.js +48 -0
- package/dist/agents/__tests__/native-config.test.js.map +1 -0
- package/dist/catalog/__tests__/schema.test.js +15 -0
- package/dist/catalog/__tests__/schema.test.js.map +1 -1
- package/dist/catalog/schema.d.ts.map +1 -1
- package/dist/catalog/schema.js +6 -0
- package/dist/catalog/schema.js.map +1 -1
- package/dist/cli/__tests__/catalog-contract.test.d.ts +2 -0
- package/dist/cli/__tests__/catalog-contract.test.d.ts.map +1 -0
- package/dist/cli/__tests__/catalog-contract.test.js +18 -0
- package/dist/cli/__tests__/catalog-contract.test.js.map +1 -0
- package/dist/cli/__tests__/doctor-team.test.js +3 -2
- package/dist/cli/__tests__/doctor-team.test.js.map +1 -1
- package/dist/cli/__tests__/error-handling-warnings.test.d.ts +2 -0
- package/dist/cli/__tests__/error-handling-warnings.test.d.ts.map +1 -0
- package/dist/cli/__tests__/error-handling-warnings.test.js +35 -0
- package/dist/cli/__tests__/error-handling-warnings.test.js.map +1 -0
- package/dist/cli/__tests__/index.test.js +81 -8
- package/dist/cli/__tests__/index.test.js.map +1 -1
- package/dist/cli/__tests__/setup-agents-overwrite.test.d.ts +2 -0
- package/dist/cli/__tests__/setup-agents-overwrite.test.d.ts.map +1 -0
- package/dist/cli/__tests__/setup-agents-overwrite.test.js +124 -0
- package/dist/cli/__tests__/setup-agents-overwrite.test.js.map +1 -0
- package/dist/cli/__tests__/setup-scope.test.js +79 -21
- package/dist/cli/__tests__/setup-scope.test.js.map +1 -1
- package/dist/cli/__tests__/setup-skills-overwrite.test.d.ts +2 -0
- package/dist/cli/__tests__/setup-skills-overwrite.test.d.ts.map +1 -0
- package/dist/cli/__tests__/setup-skills-overwrite.test.js +32 -0
- package/dist/cli/__tests__/setup-skills-overwrite.test.js.map +1 -0
- package/dist/cli/__tests__/star-prompt.test.js +74 -0
- package/dist/cli/__tests__/star-prompt.test.js.map +1 -1
- package/dist/cli/__tests__/team.test.js +8 -0
- package/dist/cli/__tests__/team.test.js.map +1 -1
- package/dist/cli/doctor.d.ts.map +1 -1
- package/dist/cli/doctor.js +75 -18
- package/dist/cli/doctor.js.map +1 -1
- package/dist/cli/index.d.ts +10 -1
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +153 -45
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/setup.d.ts +2 -1
- package/dist/cli/setup.d.ts.map +1 -1
- package/dist/cli/setup.js +104 -60
- package/dist/cli/setup.js.map +1 -1
- package/dist/cli/star-prompt.d.ts +21 -1
- package/dist/cli/star-prompt.d.ts.map +1 -1
- package/dist/cli/star-prompt.js +34 -13
- package/dist/cli/star-prompt.js.map +1 -1
- package/dist/cli/team.d.ts.map +1 -1
- package/dist/cli/team.js +10 -3
- package/dist/cli/team.js.map +1 -1
- package/dist/cli/update.d.ts.map +1 -1
- package/dist/cli/update.js.map +1 -1
- package/dist/config/__tests__/generator-notify.test.js +16 -0
- package/dist/config/__tests__/generator-notify.test.js.map +1 -1
- package/dist/config/__tests__/models.test.js +9 -1
- package/dist/config/__tests__/models.test.js.map +1 -1
- package/dist/config/generator.js +9 -10
- package/dist/config/generator.js.map +1 -1
- package/dist/config/models.d.ts +8 -1
- package/dist/config/models.d.ts.map +1 -1
- package/dist/config/models.js +27 -5
- package/dist/config/models.js.map +1 -1
- package/dist/hooks/__tests__/agents-overlay.test.js +24 -0
- package/dist/hooks/__tests__/agents-overlay.test.js.map +1 -1
- package/dist/hooks/__tests__/consensus-execution-handoff.test.d.ts +18 -0
- package/dist/hooks/__tests__/consensus-execution-handoff.test.d.ts.map +1 -0
- package/dist/hooks/__tests__/consensus-execution-handoff.test.js +204 -0
- package/dist/hooks/__tests__/consensus-execution-handoff.test.js.map +1 -0
- package/dist/hooks/__tests__/emulator.test.d.ts +2 -0
- package/dist/hooks/__tests__/emulator.test.d.ts.map +1 -0
- package/dist/hooks/__tests__/emulator.test.js +47 -0
- package/dist/hooks/__tests__/emulator.test.js.map +1 -0
- package/dist/hooks/__tests__/keyword-detector.test.js +330 -4
- package/dist/hooks/__tests__/keyword-detector.test.js.map +1 -1
- package/dist/hooks/__tests__/notify-hook-auto-nudge.test.js +101 -0
- package/dist/hooks/__tests__/notify-hook-auto-nudge.test.js.map +1 -1
- package/dist/hooks/__tests__/notify-hook-cross-worktree-heartbeat.test.js +13 -7
- package/dist/hooks/__tests__/notify-hook-cross-worktree-heartbeat.test.js.map +1 -1
- package/dist/hooks/__tests__/notify-hook-modules.test.js +61 -0
- package/dist/hooks/__tests__/notify-hook-modules.test.js.map +1 -1
- package/dist/hooks/__tests__/notify-hook-session-scope.test.js +47 -0
- package/dist/hooks/__tests__/notify-hook-session-scope.test.js.map +1 -1
- package/dist/hooks/__tests__/notify-hook-worker-idle.test.d.ts +2 -0
- package/dist/hooks/__tests__/notify-hook-worker-idle.test.d.ts.map +1 -0
- package/dist/hooks/__tests__/notify-hook-worker-idle.test.js +560 -0
- package/dist/hooks/__tests__/notify-hook-worker-idle.test.js.map +1 -0
- package/dist/hooks/__tests__/session.test.d.ts +2 -0
- package/dist/hooks/__tests__/session.test.d.ts.map +1 -0
- package/dist/hooks/__tests__/session.test.js +161 -0
- package/dist/hooks/__tests__/session.test.js.map +1 -0
- package/dist/hooks/__tests__/task-size-detector.test.d.ts +2 -0
- package/dist/hooks/__tests__/task-size-detector.test.d.ts.map +1 -0
- package/dist/hooks/__tests__/task-size-detector.test.js +336 -0
- package/dist/hooks/__tests__/task-size-detector.test.js.map +1 -0
- package/dist/hooks/__tests__/tmux-hook-engine-types-sync.test.d.ts +2 -0
- package/dist/hooks/__tests__/tmux-hook-engine-types-sync.test.d.ts.map +1 -0
- package/dist/hooks/__tests__/tmux-hook-engine-types-sync.test.js +24 -0
- package/dist/hooks/__tests__/tmux-hook-engine-types-sync.test.js.map +1 -0
- package/dist/hooks/agents-overlay.d.ts.map +1 -1
- package/dist/hooks/agents-overlay.js +46 -2
- package/dist/hooks/agents-overlay.js.map +1 -1
- package/dist/hooks/code-simplifier/__tests__/index.test.js +67 -15
- package/dist/hooks/code-simplifier/__tests__/index.test.js.map +1 -1
- package/dist/hooks/code-simplifier/index.d.ts +10 -4
- package/dist/hooks/code-simplifier/index.d.ts.map +1 -1
- package/dist/hooks/code-simplifier/index.js +38 -12
- package/dist/hooks/code-simplifier/index.js.map +1 -1
- package/dist/hooks/codebase-map.d.ts.map +1 -1
- package/dist/hooks/codebase-map.js +5 -32
- package/dist/hooks/codebase-map.js.map +1 -1
- package/dist/hooks/emulator.d.ts.map +1 -1
- package/dist/hooks/emulator.js +11 -18
- package/dist/hooks/emulator.js.map +1 -1
- package/dist/hooks/extensibility/__tests__/dispatcher.test.js +59 -1
- package/dist/hooks/extensibility/__tests__/dispatcher.test.js.map +1 -1
- package/dist/hooks/extensibility/__tests__/loader.test.js +19 -0
- package/dist/hooks/extensibility/__tests__/loader.test.js.map +1 -1
- package/dist/hooks/extensibility/dispatcher.d.ts.map +1 -1
- package/dist/hooks/extensibility/dispatcher.js +51 -39
- package/dist/hooks/extensibility/dispatcher.js.map +1 -1
- package/dist/hooks/extensibility/loader.d.ts.map +1 -1
- package/dist/hooks/extensibility/loader.js +25 -13
- package/dist/hooks/extensibility/loader.js.map +1 -1
- package/dist/hooks/extensibility/logging.d.ts.map +1 -1
- package/dist/hooks/extensibility/logging.js +6 -1
- package/dist/hooks/extensibility/logging.js.map +1 -1
- package/dist/hooks/extensibility/sdk.js.map +1 -1
- package/dist/hooks/keyword-detector.d.ts +87 -0
- package/dist/hooks/keyword-detector.d.ts.map +1 -1
- package/dist/hooks/keyword-detector.js +235 -23
- package/dist/hooks/keyword-detector.js.map +1 -1
- package/dist/hooks/keyword-registry.d.ts +15 -0
- package/dist/hooks/keyword-registry.d.ts.map +1 -0
- package/dist/hooks/keyword-registry.js +41 -0
- package/dist/hooks/keyword-registry.js.map +1 -0
- package/dist/hooks/session.d.ts +18 -2
- package/dist/hooks/session.d.ts.map +1 -1
- package/dist/hooks/session.js +84 -11
- package/dist/hooks/session.js.map +1 -1
- package/dist/hooks/task-size-detector.d.ts +72 -0
- package/dist/hooks/task-size-detector.d.ts.map +1 -0
- package/dist/hooks/task-size-detector.js +204 -0
- package/dist/hooks/task-size-detector.js.map +1 -0
- package/dist/hud/__tests__/colors.test.js +1 -103
- package/dist/hud/__tests__/colors.test.js.map +1 -1
- package/dist/hud/__tests__/index.test.d.ts +2 -0
- package/dist/hud/__tests__/index.test.d.ts.map +1 -0
- package/dist/hud/__tests__/index.test.js +131 -0
- package/dist/hud/__tests__/index.test.js.map +1 -0
- package/dist/hud/__tests__/render.test.js +53 -0
- package/dist/hud/__tests__/render.test.js.map +1 -1
- package/dist/hud/__tests__/watch.test.d.ts +2 -0
- package/dist/hud/__tests__/watch.test.d.ts.map +1 -0
- package/dist/hud/__tests__/watch.test.js +63 -0
- package/dist/hud/__tests__/watch.test.js.map +1 -0
- package/dist/hud/colors.d.ts +2 -9
- package/dist/hud/colors.d.ts.map +1 -1
- package/dist/hud/colors.js +19 -34
- package/dist/hud/colors.js.map +1 -1
- package/dist/hud/constants.d.ts +1 -0
- package/dist/hud/constants.d.ts.map +1 -1
- package/dist/hud/constants.js +1 -0
- package/dist/hud/constants.js.map +1 -1
- package/dist/hud/index.d.ts +27 -0
- package/dist/hud/index.d.ts.map +1 -1
- package/dist/hud/index.js +149 -9
- package/dist/hud/index.js.map +1 -1
- package/dist/hud/render.d.ts.map +1 -1
- package/dist/hud/render.js +20 -7
- package/dist/hud/render.js.map +1 -1
- package/dist/mcp/__tests__/bootstrap.test.d.ts +2 -0
- package/dist/mcp/__tests__/bootstrap.test.d.ts.map +1 -0
- package/dist/mcp/__tests__/bootstrap.test.js +25 -0
- package/dist/mcp/__tests__/bootstrap.test.js.map +1 -0
- package/dist/mcp/__tests__/code-intel-server.test.d.ts +2 -0
- package/dist/mcp/__tests__/code-intel-server.test.d.ts.map +1 -0
- package/dist/mcp/__tests__/code-intel-server.test.js +43 -0
- package/dist/mcp/__tests__/code-intel-server.test.js.map +1 -0
- package/dist/mcp/__tests__/memory-server.test.d.ts +2 -0
- package/dist/mcp/__tests__/memory-server.test.d.ts.map +1 -0
- package/dist/mcp/__tests__/memory-server.test.js +34 -0
- package/dist/mcp/__tests__/memory-server.test.js.map +1 -0
- package/dist/mcp/__tests__/memory-validation.test.d.ts +2 -0
- package/dist/mcp/__tests__/memory-validation.test.d.ts.map +1 -0
- package/dist/mcp/__tests__/memory-validation.test.js +29 -0
- package/dist/mcp/__tests__/memory-validation.test.js.map +1 -0
- package/dist/mcp/__tests__/path-traversal.test.js +55 -0
- package/dist/mcp/__tests__/path-traversal.test.js.map +1 -1
- package/dist/mcp/__tests__/state-paths.test.js +43 -6
- package/dist/mcp/__tests__/state-paths.test.js.map +1 -1
- package/dist/mcp/__tests__/state-server-ralph-phase.test.js +50 -0
- package/dist/mcp/__tests__/state-server-ralph-phase.test.js.map +1 -1
- package/dist/mcp/__tests__/state-server-schema.test.js +3 -7
- package/dist/mcp/__tests__/state-server-schema.test.js.map +1 -1
- package/dist/mcp/__tests__/state-server.test.js +30 -1
- package/dist/mcp/__tests__/state-server.test.js.map +1 -1
- package/dist/mcp/__tests__/trace-server.test.js +58 -0
- package/dist/mcp/__tests__/trace-server.test.js.map +1 -1
- package/dist/mcp/bootstrap.d.ts +3 -0
- package/dist/mcp/bootstrap.d.ts.map +1 -0
- package/dist/mcp/bootstrap.js +13 -0
- package/dist/mcp/bootstrap.js.map +1 -0
- package/dist/mcp/code-intel-server.d.ts +8 -0
- package/dist/mcp/code-intel-server.d.ts.map +1 -1
- package/dist/mcp/code-intel-server.js +50 -24
- package/dist/mcp/code-intel-server.js.map +1 -1
- package/dist/mcp/memory-server.js +34 -13
- package/dist/mcp/memory-server.js.map +1 -1
- package/dist/mcp/memory-validation.d.ts +9 -0
- package/dist/mcp/memory-validation.d.ts.map +1 -0
- package/dist/mcp/memory-validation.js +11 -0
- package/dist/mcp/memory-validation.js.map +1 -0
- package/dist/mcp/state-paths.d.ts +2 -0
- package/dist/mcp/state-paths.d.ts.map +1 -1
- package/dist/mcp/state-paths.js +83 -12
- package/dist/mcp/state-paths.js.map +1 -1
- package/dist/mcp/state-server.d.ts.map +1 -1
- package/dist/mcp/state-server.js +85 -47
- package/dist/mcp/state-server.js.map +1 -1
- package/dist/mcp/trace-server.d.ts +16 -0
- package/dist/mcp/trace-server.d.ts.map +1 -1
- package/dist/mcp/trace-server.js +84 -24
- package/dist/mcp/trace-server.js.map +1 -1
- package/dist/modes/__tests__/base-ralph-contract.test.d.ts +2 -0
- package/dist/modes/__tests__/base-ralph-contract.test.d.ts.map +1 -0
- package/dist/modes/__tests__/base-ralph-contract.test.js +49 -0
- package/dist/modes/__tests__/base-ralph-contract.test.js.map +1 -0
- package/dist/modes/__tests__/base-tmux-pane.test.js +13 -1
- package/dist/modes/__tests__/base-tmux-pane.test.js.map +1 -1
- package/dist/modes/base.d.ts +0 -4
- package/dist/modes/base.d.ts.map +1 -1
- package/dist/modes/base.js +31 -11
- package/dist/modes/base.js.map +1 -1
- package/dist/notifications/__tests__/config.test.js +47 -1
- package/dist/notifications/__tests__/config.test.js.map +1 -1
- package/dist/notifications/__tests__/formatter.test.js +54 -2
- package/dist/notifications/__tests__/formatter.test.js.map +1 -1
- package/dist/notifications/__tests__/hook-config.test.d.ts +5 -0
- package/dist/notifications/__tests__/hook-config.test.d.ts.map +1 -0
- package/dist/notifications/__tests__/hook-config.test.js +139 -0
- package/dist/notifications/__tests__/hook-config.test.js.map +1 -0
- package/dist/notifications/__tests__/idle-cooldown.test.d.ts +5 -0
- package/dist/notifications/__tests__/idle-cooldown.test.d.ts.map +1 -0
- package/dist/notifications/__tests__/idle-cooldown.test.js +100 -0
- package/dist/notifications/__tests__/idle-cooldown.test.js.map +1 -0
- package/dist/notifications/__tests__/notifier.test.js +89 -1
- package/dist/notifications/__tests__/notifier.test.js.map +1 -1
- package/dist/notifications/__tests__/reply-config.test.d.ts +2 -0
- package/dist/notifications/__tests__/reply-config.test.d.ts.map +1 -0
- package/dist/notifications/__tests__/reply-config.test.js +79 -0
- package/dist/notifications/__tests__/reply-config.test.js.map +1 -0
- package/dist/notifications/__tests__/reply-listener.test.js +35 -1
- package/dist/notifications/__tests__/reply-listener.test.js.map +1 -1
- package/dist/notifications/__tests__/session-registry.test.js +40 -0
- package/dist/notifications/__tests__/session-registry.test.js.map +1 -1
- package/dist/notifications/__tests__/template-engine.test.d.ts +5 -0
- package/dist/notifications/__tests__/template-engine.test.d.ts.map +1 -0
- package/dist/notifications/__tests__/template-engine.test.js +147 -0
- package/dist/notifications/__tests__/template-engine.test.js.map +1 -0
- package/dist/notifications/config.d.ts +8 -0
- package/dist/notifications/config.d.ts.map +1 -1
- package/dist/notifications/config.js +110 -19
- package/dist/notifications/config.js.map +1 -1
- package/dist/notifications/formatter.d.ts +5 -0
- package/dist/notifications/formatter.d.ts.map +1 -1
- package/dist/notifications/formatter.js +45 -10
- package/dist/notifications/formatter.js.map +1 -1
- package/dist/notifications/hook-config-types.d.ts +43 -0
- package/dist/notifications/hook-config-types.d.ts.map +1 -0
- package/dist/notifications/hook-config-types.js +8 -0
- package/dist/notifications/hook-config-types.js.map +1 -0
- package/dist/notifications/hook-config.d.ts +40 -0
- package/dist/notifications/hook-config.d.ts.map +1 -0
- package/dist/notifications/hook-config.js +127 -0
- package/dist/notifications/hook-config.js.map +1 -0
- package/dist/notifications/idle-cooldown.d.ts +35 -0
- package/dist/notifications/idle-cooldown.d.ts.map +1 -0
- package/dist/notifications/idle-cooldown.js +108 -0
- package/dist/notifications/idle-cooldown.js.map +1 -0
- package/dist/notifications/index.d.ts +3 -0
- package/dist/notifications/index.d.ts.map +1 -1
- package/dist/notifications/index.js +43 -1
- package/dist/notifications/index.js.map +1 -1
- package/dist/notifications/notifier.d.ts +9 -0
- package/dist/notifications/notifier.d.ts.map +1 -1
- package/dist/notifications/notifier.js +36 -30
- package/dist/notifications/notifier.js.map +1 -1
- package/dist/notifications/reply-listener.d.ts +3 -0
- package/dist/notifications/reply-listener.d.ts.map +1 -1
- package/dist/notifications/reply-listener.js +61 -7
- package/dist/notifications/reply-listener.js.map +1 -1
- package/dist/notifications/session-registry.d.ts +1 -1
- package/dist/notifications/session-registry.d.ts.map +1 -1
- package/dist/notifications/session-registry.js +18 -6
- package/dist/notifications/session-registry.js.map +1 -1
- package/dist/notifications/template-engine.d.ts +34 -0
- package/dist/notifications/template-engine.d.ts.map +1 -0
- package/dist/notifications/template-engine.js +246 -0
- package/dist/notifications/template-engine.js.map +1 -0
- package/dist/notifications/types.d.ts +6 -0
- package/dist/notifications/types.d.ts.map +1 -1
- package/dist/openclaw/__tests__/config.test.d.ts +6 -0
- package/dist/openclaw/__tests__/config.test.d.ts.map +1 -0
- package/dist/openclaw/__tests__/config.test.js +174 -0
- package/dist/openclaw/__tests__/config.test.js.map +1 -0
- package/dist/openclaw/__tests__/dispatcher.test.d.ts +5 -0
- package/dist/openclaw/__tests__/dispatcher.test.d.ts.map +1 -0
- package/dist/openclaw/__tests__/dispatcher.test.js +104 -0
- package/dist/openclaw/__tests__/dispatcher.test.js.map +1 -0
- package/dist/openclaw/__tests__/index.test.d.ts +6 -0
- package/dist/openclaw/__tests__/index.test.d.ts.map +1 -0
- package/dist/openclaw/__tests__/index.test.js +131 -0
- package/dist/openclaw/__tests__/index.test.js.map +1 -0
- package/dist/openclaw/config.d.ts +37 -0
- package/dist/openclaw/config.d.ts.map +1 -0
- package/dist/openclaw/config.js +106 -0
- package/dist/openclaw/config.js.map +1 -0
- package/dist/openclaw/dispatcher.d.ts +63 -0
- package/dist/openclaw/dispatcher.d.ts.map +1 -0
- package/dist/openclaw/dispatcher.js +223 -0
- package/dist/openclaw/dispatcher.js.map +1 -0
- package/dist/openclaw/index.d.ts +27 -0
- package/dist/openclaw/index.d.ts.map +1 -0
- package/dist/openclaw/index.js +130 -0
- package/dist/openclaw/index.js.map +1 -0
- package/dist/openclaw/types.d.ts +105 -0
- package/dist/openclaw/types.d.ts.map +1 -0
- package/dist/openclaw/types.js +12 -0
- package/dist/openclaw/types.js.map +1 -0
- package/dist/ralph/contract.d.ts.map +1 -1
- package/dist/ralph/contract.js +13 -4
- package/dist/ralph/contract.js.map +1 -1
- package/dist/team/__tests__/phase-controller.test.js +14 -0
- package/dist/team/__tests__/phase-controller.test.js.map +1 -1
- package/dist/team/__tests__/runtime.test.js +328 -1
- package/dist/team/__tests__/runtime.test.js.map +1 -1
- package/dist/team/__tests__/scaling.test.d.ts +2 -0
- package/dist/team/__tests__/scaling.test.d.ts.map +1 -0
- package/dist/team/__tests__/scaling.test.js +295 -0
- package/dist/team/__tests__/scaling.test.js.map +1 -0
- package/dist/team/__tests__/state.test.js +62 -1
- package/dist/team/__tests__/state.test.js.map +1 -1
- package/dist/team/__tests__/tmux-session.test.js +219 -14
- package/dist/team/__tests__/tmux-session.test.js.map +1 -1
- package/dist/team/__tests__/worker-bootstrap.test.js +4 -0
- package/dist/team/__tests__/worker-bootstrap.test.js.map +1 -1
- package/dist/team/contracts.d.ts +14 -0
- package/dist/team/contracts.d.ts.map +1 -0
- package/dist/team/contracts.js +30 -0
- package/dist/team/contracts.js.map +1 -0
- package/dist/team/model-contract.d.ts +1 -0
- package/dist/team/model-contract.d.ts.map +1 -1
- package/dist/team/model-contract.js +5 -1
- package/dist/team/model-contract.js.map +1 -1
- package/dist/team/phase-controller.d.ts +2 -0
- package/dist/team/phase-controller.d.ts.map +1 -1
- package/dist/team/phase-controller.js +16 -2
- package/dist/team/phase-controller.js.map +1 -1
- package/dist/team/runtime.d.ts.map +1 -1
- package/dist/team/runtime.js +356 -65
- package/dist/team/runtime.js.map +1 -1
- package/dist/team/scaling.d.ts +58 -0
- package/dist/team/scaling.d.ts.map +1 -0
- package/dist/team/scaling.js +319 -0
- package/dist/team/scaling.js.map +1 -0
- package/dist/team/state.d.ts +11 -2
- package/dist/team/state.d.ts.map +1 -1
- package/dist/team/state.js +97 -27
- package/dist/team/state.js.map +1 -1
- package/dist/team/team-ops.d.ts +2 -0
- package/dist/team/team-ops.d.ts.map +1 -1
- package/dist/team/team-ops.js +4 -0
- package/dist/team/team-ops.js.map +1 -1
- package/dist/team/tmux-session.d.ts +34 -5
- package/dist/team/tmux-session.d.ts.map +1 -1
- package/dist/team/tmux-session.js +177 -49
- package/dist/team/tmux-session.js.map +1 -1
- package/dist/team/worker-bootstrap.d.ts.map +1 -1
- package/dist/team/worker-bootstrap.js +20 -0
- package/dist/team/worker-bootstrap.js.map +1 -1
- package/dist/utils/__tests__/paths.test.js +8 -1
- package/dist/utils/__tests__/paths.test.js.map +1 -1
- package/dist/utils/paths.d.ts.map +1 -1
- package/dist/utils/paths.js +14 -6
- package/dist/utils/paths.js.map +1 -1
- package/dist/verification/__tests__/verifier.test.js +20 -1
- package/dist/verification/__tests__/verifier.test.js.map +1 -1
- package/dist/verification/verifier.d.ts +5 -0
- package/dist/verification/verifier.d.ts.map +1 -1
- package/dist/verification/verifier.js +19 -0
- package/dist/verification/verifier.js.map +1 -1
- package/package.json +2 -1
- package/prompts/architect.md +11 -0
- package/prompts/critic.md +14 -1
- package/prompts/planner.md +21 -0
- package/scripts/notify-hook/auto-nudge.js +80 -1
- package/scripts/notify-hook/payload-parser.js +21 -0
- package/scripts/notify-hook/team-worker.js +142 -0
- package/scripts/notify-hook/tmux-injection.js +3 -3
- package/scripts/notify-hook.js +55 -4
- package/skills/configure-notifications/SKILL.md +278 -0
- package/skills/configure-openclaw/SKILL.md +267 -0
- package/skills/configure-slack/SKILL.md +226 -0
- package/skills/omx-setup/SKILL.md +14 -19
- package/skills/plan/SKILL.md +57 -33
- package/skills/ralplan/SKILL.md +107 -21
- package/skills/team/SKILL.md +10 -1
- package/templates/AGENTS.md +11 -3
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests for OpenClaw public API (wakeOpenClaw)
|
|
3
|
+
* Uses node:test and node:assert/strict
|
|
4
|
+
*/
|
|
5
|
+
import { describe, it, beforeEach, afterEach } from "node:test";
|
|
6
|
+
import assert from "node:assert/strict";
|
|
7
|
+
import { writeFileSync, mkdirSync, rmSync } from "fs";
|
|
8
|
+
import { join } from "path";
|
|
9
|
+
import { tmpdir } from "os";
|
|
10
|
+
describe("wakeOpenClaw", () => {
|
|
11
|
+
let tmpDir;
|
|
12
|
+
let originalEnv;
|
|
13
|
+
beforeEach(() => {
|
|
14
|
+
originalEnv = { ...process.env };
|
|
15
|
+
tmpDir = join(tmpdir(), `omx-openclaw-index-test-${Date.now()}`);
|
|
16
|
+
mkdirSync(tmpDir, { recursive: true });
|
|
17
|
+
});
|
|
18
|
+
afterEach(() => {
|
|
19
|
+
for (const key of Object.keys(process.env)) {
|
|
20
|
+
if (!(key in originalEnv))
|
|
21
|
+
delete process.env[key];
|
|
22
|
+
}
|
|
23
|
+
for (const [key, val] of Object.entries(originalEnv)) {
|
|
24
|
+
process.env[key] = val;
|
|
25
|
+
}
|
|
26
|
+
try {
|
|
27
|
+
rmSync(tmpDir, { recursive: true });
|
|
28
|
+
}
|
|
29
|
+
catch { /* ignore */ }
|
|
30
|
+
});
|
|
31
|
+
it("returns null when OMX_OPENCLAW is not set", async () => {
|
|
32
|
+
delete process.env.OMX_OPENCLAW;
|
|
33
|
+
const { wakeOpenClaw } = await import("../index.js");
|
|
34
|
+
const { resetOpenClawConfigCache } = await import("../config.js");
|
|
35
|
+
resetOpenClawConfigCache();
|
|
36
|
+
const result = await wakeOpenClaw("session-start", {});
|
|
37
|
+
assert.equal(result, null);
|
|
38
|
+
});
|
|
39
|
+
it("returns null when config is not found", async () => {
|
|
40
|
+
process.env.OMX_OPENCLAW = "1";
|
|
41
|
+
process.env.OMX_OPENCLAW_CONFIG = join(tmpDir, "nonexistent.json");
|
|
42
|
+
const { wakeOpenClaw } = await import("../index.js");
|
|
43
|
+
const { resetOpenClawConfigCache } = await import("../config.js");
|
|
44
|
+
resetOpenClawConfigCache();
|
|
45
|
+
const result = await wakeOpenClaw("session-start", {});
|
|
46
|
+
assert.equal(result, null);
|
|
47
|
+
});
|
|
48
|
+
it("returns null when event is not mapped", async () => {
|
|
49
|
+
process.env.OMX_OPENCLAW = "1";
|
|
50
|
+
const configPath = join(tmpDir, "openclaw.json");
|
|
51
|
+
writeFileSync(configPath, JSON.stringify({
|
|
52
|
+
enabled: true,
|
|
53
|
+
gateways: { gw: { type: "http", url: "https://example.com/hook" } },
|
|
54
|
+
hooks: {
|
|
55
|
+
// session-start not mapped
|
|
56
|
+
},
|
|
57
|
+
}));
|
|
58
|
+
process.env.OMX_OPENCLAW_CONFIG = configPath;
|
|
59
|
+
const { wakeOpenClaw } = await import("../index.js");
|
|
60
|
+
const { resetOpenClawConfigCache } = await import("../config.js");
|
|
61
|
+
resetOpenClawConfigCache();
|
|
62
|
+
const result = await wakeOpenClaw("session-start", {});
|
|
63
|
+
assert.equal(result, null);
|
|
64
|
+
});
|
|
65
|
+
it("returns null and does not throw on invalid HTTP URL", async () => {
|
|
66
|
+
process.env.OMX_OPENCLAW = "1";
|
|
67
|
+
const configPath = join(tmpDir, "openclaw.json");
|
|
68
|
+
writeFileSync(configPath, JSON.stringify({
|
|
69
|
+
enabled: true,
|
|
70
|
+
gateways: { gw: { type: "http", url: "http://bad-remote.example.com/hook" } },
|
|
71
|
+
hooks: {
|
|
72
|
+
"session-start": { gateway: "gw", instruction: "hello", enabled: true },
|
|
73
|
+
},
|
|
74
|
+
}));
|
|
75
|
+
process.env.OMX_OPENCLAW_CONFIG = configPath;
|
|
76
|
+
const { wakeOpenClaw } = await import("../index.js");
|
|
77
|
+
const { resetOpenClawConfigCache } = await import("../config.js");
|
|
78
|
+
resetOpenClawConfigCache();
|
|
79
|
+
// Should return a result (with success: false) rather than null, or null
|
|
80
|
+
// Either way, it must not throw
|
|
81
|
+
let threw = false;
|
|
82
|
+
try {
|
|
83
|
+
await wakeOpenClaw("session-start", { sessionId: "test-123" });
|
|
84
|
+
}
|
|
85
|
+
catch {
|
|
86
|
+
threw = true;
|
|
87
|
+
}
|
|
88
|
+
assert.equal(threw, false);
|
|
89
|
+
});
|
|
90
|
+
it("returns result with success:false for disabled command gateway", async () => {
|
|
91
|
+
process.env.OMX_OPENCLAW = "1";
|
|
92
|
+
delete process.env.OMX_OPENCLAW_COMMAND;
|
|
93
|
+
const configPath = join(tmpDir, "openclaw.json");
|
|
94
|
+
writeFileSync(configPath, JSON.stringify({
|
|
95
|
+
enabled: true,
|
|
96
|
+
gateways: { cmd: { type: "command", command: "echo hello" } },
|
|
97
|
+
hooks: {
|
|
98
|
+
"stop": { gateway: "cmd", instruction: "Stopped", enabled: true },
|
|
99
|
+
},
|
|
100
|
+
}));
|
|
101
|
+
process.env.OMX_OPENCLAW_CONFIG = configPath;
|
|
102
|
+
const { wakeOpenClaw } = await import("../index.js");
|
|
103
|
+
const { resetOpenClawConfigCache } = await import("../config.js");
|
|
104
|
+
resetOpenClawConfigCache();
|
|
105
|
+
const result = await wakeOpenClaw("stop", { projectPath: "/some/project" });
|
|
106
|
+
// Should return a result, not null (gateway was found but command gate blocked)
|
|
107
|
+
assert.ok(result !== null);
|
|
108
|
+
assert.equal(result.success, false);
|
|
109
|
+
assert.ok(result.error?.includes("OMX_OPENCLAW_COMMAND"));
|
|
110
|
+
});
|
|
111
|
+
it("succeeds with command gateway when both env vars set", async () => {
|
|
112
|
+
process.env.OMX_OPENCLAW = "1";
|
|
113
|
+
process.env.OMX_OPENCLAW_COMMAND = "1";
|
|
114
|
+
const configPath = join(tmpDir, "openclaw.json");
|
|
115
|
+
writeFileSync(configPath, JSON.stringify({
|
|
116
|
+
enabled: true,
|
|
117
|
+
gateways: { cmd: { type: "command", command: "true" } },
|
|
118
|
+
hooks: {
|
|
119
|
+
"session-end": { gateway: "cmd", instruction: "Ended", enabled: true },
|
|
120
|
+
},
|
|
121
|
+
}));
|
|
122
|
+
process.env.OMX_OPENCLAW_CONFIG = configPath;
|
|
123
|
+
const { wakeOpenClaw } = await import("../index.js");
|
|
124
|
+
const { resetOpenClawConfigCache } = await import("../config.js");
|
|
125
|
+
resetOpenClawConfigCache();
|
|
126
|
+
const result = await wakeOpenClaw("session-end", { projectPath: "/some/project" });
|
|
127
|
+
assert.ok(result !== null);
|
|
128
|
+
assert.equal(result.success, true);
|
|
129
|
+
});
|
|
130
|
+
});
|
|
131
|
+
//# sourceMappingURL=index.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.test.js","sourceRoot":"","sources":["../../../src/openclaw/__tests__/index.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenClaw Configuration Reader
|
|
3
|
+
*
|
|
4
|
+
* Reads OpenClaw config from the notifications.openclaw key in ~/.codex/.omx-config.json.
|
|
5
|
+
* Config is cached after first read (env vars don't change during process lifetime).
|
|
6
|
+
* Config file path can be overridden via OMX_OPENCLAW_CONFIG env var (points to a separate file).
|
|
7
|
+
*/
|
|
8
|
+
import type { OpenClawConfig, OpenClawHookEvent, OpenClawGatewayConfig } from "./types.js";
|
|
9
|
+
/**
|
|
10
|
+
* Read and cache the OpenClaw configuration.
|
|
11
|
+
*
|
|
12
|
+
* Returns null when:
|
|
13
|
+
* - OMX_OPENCLAW env var is not "1"
|
|
14
|
+
* - Config file does not exist
|
|
15
|
+
* - Config file is invalid JSON
|
|
16
|
+
* - Config has enabled: false
|
|
17
|
+
*
|
|
18
|
+
* Config is read from:
|
|
19
|
+
* 1. OMX_OPENCLAW_CONFIG env var path (separate file), if set
|
|
20
|
+
* 2. notifications.openclaw key in ~/.codex/.omx-config.json
|
|
21
|
+
*/
|
|
22
|
+
export declare function getOpenClawConfig(): OpenClawConfig | null;
|
|
23
|
+
/**
|
|
24
|
+
* Resolve gateway config for a specific hook event.
|
|
25
|
+
* Returns null if the event is not mapped or disabled.
|
|
26
|
+
* Returns the gateway name alongside config to avoid O(n) reverse lookup.
|
|
27
|
+
*/
|
|
28
|
+
export declare function resolveGateway(config: OpenClawConfig, event: OpenClawHookEvent): {
|
|
29
|
+
gatewayName: string;
|
|
30
|
+
gateway: OpenClawGatewayConfig;
|
|
31
|
+
instruction: string;
|
|
32
|
+
} | null;
|
|
33
|
+
/**
|
|
34
|
+
* Reset the config cache (for testing only).
|
|
35
|
+
*/
|
|
36
|
+
export declare function resetOpenClawConfigCache(): void;
|
|
37
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/openclaw/config.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH,OAAO,KAAK,EAAE,cAAc,EAAE,iBAAiB,EAAE,qBAAqB,EAAgC,MAAM,YAAY,CAAC;AAKzH;;;;;;;;;;;;GAYG;AACH,wBAAgB,iBAAiB,IAAI,cAAc,GAAG,IAAI,CAgDzD;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAC5B,MAAM,EAAE,cAAc,EACtB,KAAK,EAAE,iBAAiB,GACvB;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,qBAAqB,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAoBrF;AAED;;GAEG;AACH,wBAAgB,wBAAwB,IAAI,IAAI,CAE/C"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenClaw Configuration Reader
|
|
3
|
+
*
|
|
4
|
+
* Reads OpenClaw config from the notifications.openclaw key in ~/.codex/.omx-config.json.
|
|
5
|
+
* Config is cached after first read (env vars don't change during process lifetime).
|
|
6
|
+
* Config file path can be overridden via OMX_OPENCLAW_CONFIG env var (points to a separate file).
|
|
7
|
+
*/
|
|
8
|
+
import { readFileSync, existsSync } from "fs";
|
|
9
|
+
import { join } from "path";
|
|
10
|
+
import { codexHome } from "../utils/paths.js";
|
|
11
|
+
/** Cached config (null = not yet read, undefined = read but file missing/invalid) */
|
|
12
|
+
let _cachedConfig = null;
|
|
13
|
+
/**
|
|
14
|
+
* Read and cache the OpenClaw configuration.
|
|
15
|
+
*
|
|
16
|
+
* Returns null when:
|
|
17
|
+
* - OMX_OPENCLAW env var is not "1"
|
|
18
|
+
* - Config file does not exist
|
|
19
|
+
* - Config file is invalid JSON
|
|
20
|
+
* - Config has enabled: false
|
|
21
|
+
*
|
|
22
|
+
* Config is read from:
|
|
23
|
+
* 1. OMX_OPENCLAW_CONFIG env var path (separate file), if set
|
|
24
|
+
* 2. notifications.openclaw key in ~/.codex/.omx-config.json
|
|
25
|
+
*/
|
|
26
|
+
export function getOpenClawConfig() {
|
|
27
|
+
// Activation gate: only active when OMX_OPENCLAW=1
|
|
28
|
+
if (process.env.OMX_OPENCLAW !== "1") {
|
|
29
|
+
return null;
|
|
30
|
+
}
|
|
31
|
+
// Return cached result
|
|
32
|
+
if (_cachedConfig !== null) {
|
|
33
|
+
return _cachedConfig ?? null;
|
|
34
|
+
}
|
|
35
|
+
try {
|
|
36
|
+
const envOverride = process.env.OMX_OPENCLAW_CONFIG;
|
|
37
|
+
if (envOverride) {
|
|
38
|
+
// OMX_OPENCLAW_CONFIG points to a separate config file
|
|
39
|
+
if (!existsSync(envOverride)) {
|
|
40
|
+
_cachedConfig = undefined;
|
|
41
|
+
return null;
|
|
42
|
+
}
|
|
43
|
+
const raw = JSON.parse(readFileSync(envOverride, "utf-8"));
|
|
44
|
+
if (!raw.enabled || !raw.gateways || !raw.hooks) {
|
|
45
|
+
_cachedConfig = undefined;
|
|
46
|
+
return null;
|
|
47
|
+
}
|
|
48
|
+
_cachedConfig = raw;
|
|
49
|
+
return raw;
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
// Primary: read from notifications.openclaw key in .omx-config.json
|
|
53
|
+
const omxConfigPath = join(codexHome(), ".omx-config.json");
|
|
54
|
+
if (!existsSync(omxConfigPath)) {
|
|
55
|
+
_cachedConfig = undefined;
|
|
56
|
+
return null;
|
|
57
|
+
}
|
|
58
|
+
const fullConfig = JSON.parse(readFileSync(omxConfigPath, "utf-8"));
|
|
59
|
+
const notifBlock = fullConfig.notifications;
|
|
60
|
+
const raw = notifBlock?.openclaw;
|
|
61
|
+
if (!raw || !raw.enabled || !raw.gateways || !raw.hooks) {
|
|
62
|
+
_cachedConfig = undefined;
|
|
63
|
+
return null;
|
|
64
|
+
}
|
|
65
|
+
_cachedConfig = raw;
|
|
66
|
+
return raw;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
catch {
|
|
70
|
+
_cachedConfig = undefined;
|
|
71
|
+
return null;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Resolve gateway config for a specific hook event.
|
|
76
|
+
* Returns null if the event is not mapped or disabled.
|
|
77
|
+
* Returns the gateway name alongside config to avoid O(n) reverse lookup.
|
|
78
|
+
*/
|
|
79
|
+
export function resolveGateway(config, event) {
|
|
80
|
+
const mapping = config.hooks[event];
|
|
81
|
+
if (!mapping || !mapping.enabled) {
|
|
82
|
+
return null;
|
|
83
|
+
}
|
|
84
|
+
const gateway = config.gateways[mapping.gateway];
|
|
85
|
+
if (!gateway) {
|
|
86
|
+
return null;
|
|
87
|
+
}
|
|
88
|
+
// Validate based on gateway type
|
|
89
|
+
if (gateway.type === "command") {
|
|
90
|
+
if (!gateway.command)
|
|
91
|
+
return null;
|
|
92
|
+
}
|
|
93
|
+
else {
|
|
94
|
+
// HTTP gateway (default when type is absent or "http")
|
|
95
|
+
if (!("url" in gateway) || !gateway.url)
|
|
96
|
+
return null;
|
|
97
|
+
}
|
|
98
|
+
return { gatewayName: mapping.gateway, gateway, instruction: mapping.instruction };
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Reset the config cache (for testing only).
|
|
102
|
+
*/
|
|
103
|
+
export function resetOpenClawConfigCache() {
|
|
104
|
+
_cachedConfig = null;
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/openclaw/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenClaw Gateway Dispatcher
|
|
3
|
+
*
|
|
4
|
+
* Sends instruction payloads to OpenClaw gateways via HTTP or CLI command.
|
|
5
|
+
* All calls are non-blocking with timeouts. Failures are swallowed
|
|
6
|
+
* to avoid blocking hooks.
|
|
7
|
+
*
|
|
8
|
+
* SECURITY: Command gateway requires OMX_OPENCLAW_COMMAND=1 opt-in.
|
|
9
|
+
* Hard 5-second timeout (non-configurable). Prefers execFile for
|
|
10
|
+
* simple commands; falls back to sh -c only for shell metacharacters.
|
|
11
|
+
*/
|
|
12
|
+
import type { OpenClawCommandGatewayConfig, OpenClawGatewayConfig, OpenClawHttpGatewayConfig, OpenClawPayload, OpenClawResult } from "./types.js";
|
|
13
|
+
/**
|
|
14
|
+
* Validate gateway URL. Must be HTTPS, except localhost/127.0.0.1/::1
|
|
15
|
+
* which allows HTTP for local development.
|
|
16
|
+
*/
|
|
17
|
+
export declare function validateGatewayUrl(url: string): boolean;
|
|
18
|
+
/**
|
|
19
|
+
* Interpolate template variables in an instruction string.
|
|
20
|
+
*
|
|
21
|
+
* Supported variables (from hook context):
|
|
22
|
+
* - {{projectName}} - basename of project directory
|
|
23
|
+
* - {{projectPath}} - full project directory path
|
|
24
|
+
* - {{sessionId}} - session identifier
|
|
25
|
+
* - {{prompt}} - prompt text
|
|
26
|
+
* - {{contextSummary}} - context summary (session-end event)
|
|
27
|
+
* - {{question}} - question text (ask-user-question event)
|
|
28
|
+
* - {{timestamp}} - ISO timestamp
|
|
29
|
+
* - {{event}} - hook event name
|
|
30
|
+
* - {{instruction}} - interpolated instruction (for command gateway)
|
|
31
|
+
*
|
|
32
|
+
* Unresolved variables are left as-is (not replaced with empty string).
|
|
33
|
+
*/
|
|
34
|
+
export declare function interpolateInstruction(template: string, variables: Record<string, string | undefined>): string;
|
|
35
|
+
/**
|
|
36
|
+
* Type guard: is this gateway config a command gateway?
|
|
37
|
+
*/
|
|
38
|
+
export declare function isCommandGateway(config: OpenClawGatewayConfig): config is OpenClawCommandGatewayConfig;
|
|
39
|
+
/**
|
|
40
|
+
* Shell-escape a string for safe embedding in a shell command.
|
|
41
|
+
* Uses single-quote wrapping with internal quote escaping.
|
|
42
|
+
*/
|
|
43
|
+
export declare function shellEscapeArg(value: string): string;
|
|
44
|
+
/**
|
|
45
|
+
* Wake an HTTP-type OpenClaw gateway with the given payload.
|
|
46
|
+
*/
|
|
47
|
+
export declare function wakeGateway(gatewayName: string, gatewayConfig: OpenClawHttpGatewayConfig, payload: OpenClawPayload): Promise<OpenClawResult>;
|
|
48
|
+
/**
|
|
49
|
+
* Wake a command-type OpenClaw gateway by executing a shell command.
|
|
50
|
+
*
|
|
51
|
+
* SECURITY REQUIREMENTS:
|
|
52
|
+
* - Requires OMX_OPENCLAW_COMMAND=1 opt-in (separate gate from OMX_OPENCLAW)
|
|
53
|
+
* - Hard 5-second timeout (non-configurable)
|
|
54
|
+
* - Prefers execFile for simple commands (no metacharacters)
|
|
55
|
+
* - Falls back to sh -c only when metacharacters detected
|
|
56
|
+
* - detached: false to prevent orphan processes
|
|
57
|
+
* - SIGTERM cleanup handler kills child on parent SIGTERM, 1s grace then SIGKILL
|
|
58
|
+
*
|
|
59
|
+
* The command template supports {{variable}} placeholders. All variable
|
|
60
|
+
* values are shell-escaped before interpolation to prevent injection.
|
|
61
|
+
*/
|
|
62
|
+
export declare function wakeCommandGateway(gatewayName: string, gatewayConfig: OpenClawCommandGatewayConfig, variables: Record<string, string | undefined>): Promise<OpenClawResult>;
|
|
63
|
+
//# sourceMappingURL=dispatcher.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dispatcher.d.ts","sourceRoot":"","sources":["../../src/openclaw/dispatcher.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EACV,4BAA4B,EAC5B,qBAAqB,EACrB,yBAAyB,EACzB,eAAe,EACf,cAAc,EACf,MAAM,YAAY,CAAC;AAWpB;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAiBvD;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,GAC5C,MAAM,CAIR;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,qBAAqB,GAC5B,MAAM,IAAI,4BAA4B,CAExC;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEpD;AAED;;GAEG;AACH,wBAAsB,WAAW,CAC/B,WAAW,EAAE,MAAM,EACnB,aAAa,EAAE,yBAAyB,EACxC,OAAO,EAAE,eAAe,GACvB,OAAO,CAAC,cAAc,CAAC,CAyCzB;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAsB,kBAAkB,CACtC,WAAW,EAAE,MAAM,EACnB,aAAa,EAAE,4BAA4B,EAC3C,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,GAC5C,OAAO,CAAC,cAAc,CAAC,CAmGzB"}
|
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenClaw Gateway Dispatcher
|
|
3
|
+
*
|
|
4
|
+
* Sends instruction payloads to OpenClaw gateways via HTTP or CLI command.
|
|
5
|
+
* All calls are non-blocking with timeouts. Failures are swallowed
|
|
6
|
+
* to avoid blocking hooks.
|
|
7
|
+
*
|
|
8
|
+
* SECURITY: Command gateway requires OMX_OPENCLAW_COMMAND=1 opt-in.
|
|
9
|
+
* Hard 5-second timeout (non-configurable). Prefers execFile for
|
|
10
|
+
* simple commands; falls back to sh -c only for shell metacharacters.
|
|
11
|
+
*/
|
|
12
|
+
/** Default per-request timeout for HTTP gateways */
|
|
13
|
+
const DEFAULT_HTTP_TIMEOUT_MS = 10_000;
|
|
14
|
+
/** Hard non-configurable timeout for command gateways */
|
|
15
|
+
const COMMAND_TIMEOUT_MS = 5_000;
|
|
16
|
+
/** Shell metacharacters that require sh -c instead of execFile */
|
|
17
|
+
const SHELL_METACHAR_RE = /[|&;><`$()]/;
|
|
18
|
+
/**
|
|
19
|
+
* Validate gateway URL. Must be HTTPS, except localhost/127.0.0.1/::1
|
|
20
|
+
* which allows HTTP for local development.
|
|
21
|
+
*/
|
|
22
|
+
export function validateGatewayUrl(url) {
|
|
23
|
+
try {
|
|
24
|
+
const parsed = new URL(url);
|
|
25
|
+
if (parsed.protocol === "https:")
|
|
26
|
+
return true;
|
|
27
|
+
if (parsed.protocol === "http:" &&
|
|
28
|
+
(parsed.hostname === "localhost" ||
|
|
29
|
+
parsed.hostname === "127.0.0.1" ||
|
|
30
|
+
parsed.hostname === "::1" ||
|
|
31
|
+
parsed.hostname === "[::1]")) {
|
|
32
|
+
return true;
|
|
33
|
+
}
|
|
34
|
+
return false;
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
return false;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Interpolate template variables in an instruction string.
|
|
42
|
+
*
|
|
43
|
+
* Supported variables (from hook context):
|
|
44
|
+
* - {{projectName}} - basename of project directory
|
|
45
|
+
* - {{projectPath}} - full project directory path
|
|
46
|
+
* - {{sessionId}} - session identifier
|
|
47
|
+
* - {{prompt}} - prompt text
|
|
48
|
+
* - {{contextSummary}} - context summary (session-end event)
|
|
49
|
+
* - {{question}} - question text (ask-user-question event)
|
|
50
|
+
* - {{timestamp}} - ISO timestamp
|
|
51
|
+
* - {{event}} - hook event name
|
|
52
|
+
* - {{instruction}} - interpolated instruction (for command gateway)
|
|
53
|
+
*
|
|
54
|
+
* Unresolved variables are left as-is (not replaced with empty string).
|
|
55
|
+
*/
|
|
56
|
+
export function interpolateInstruction(template, variables) {
|
|
57
|
+
return template.replace(/\{\{(\w+)\}\}/g, (match, key) => {
|
|
58
|
+
return variables[key] ?? match;
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Type guard: is this gateway config a command gateway?
|
|
63
|
+
*/
|
|
64
|
+
export function isCommandGateway(config) {
|
|
65
|
+
return config.type === "command";
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Shell-escape a string for safe embedding in a shell command.
|
|
69
|
+
* Uses single-quote wrapping with internal quote escaping.
|
|
70
|
+
*/
|
|
71
|
+
export function shellEscapeArg(value) {
|
|
72
|
+
return "'" + value.replace(/'/g, "'\\''") + "'";
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Wake an HTTP-type OpenClaw gateway with the given payload.
|
|
76
|
+
*/
|
|
77
|
+
export async function wakeGateway(gatewayName, gatewayConfig, payload) {
|
|
78
|
+
if (!validateGatewayUrl(gatewayConfig.url)) {
|
|
79
|
+
return {
|
|
80
|
+
gateway: gatewayName,
|
|
81
|
+
success: false,
|
|
82
|
+
error: "Invalid URL (HTTPS required)",
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
try {
|
|
86
|
+
const headers = {
|
|
87
|
+
"Content-Type": "application/json",
|
|
88
|
+
...gatewayConfig.headers,
|
|
89
|
+
};
|
|
90
|
+
const timeout = gatewayConfig.timeout ?? DEFAULT_HTTP_TIMEOUT_MS;
|
|
91
|
+
const response = await fetch(gatewayConfig.url, {
|
|
92
|
+
method: gatewayConfig.method || "POST",
|
|
93
|
+
headers,
|
|
94
|
+
body: JSON.stringify(payload),
|
|
95
|
+
signal: AbortSignal.timeout(timeout),
|
|
96
|
+
});
|
|
97
|
+
if (!response.ok) {
|
|
98
|
+
return {
|
|
99
|
+
gateway: gatewayName,
|
|
100
|
+
success: false,
|
|
101
|
+
error: `HTTP ${response.status}`,
|
|
102
|
+
statusCode: response.status,
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
return { gateway: gatewayName, success: true, statusCode: response.status };
|
|
106
|
+
}
|
|
107
|
+
catch (error) {
|
|
108
|
+
return {
|
|
109
|
+
gateway: gatewayName,
|
|
110
|
+
success: false,
|
|
111
|
+
error: error instanceof Error ? error.message : "Unknown error",
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Wake a command-type OpenClaw gateway by executing a shell command.
|
|
117
|
+
*
|
|
118
|
+
* SECURITY REQUIREMENTS:
|
|
119
|
+
* - Requires OMX_OPENCLAW_COMMAND=1 opt-in (separate gate from OMX_OPENCLAW)
|
|
120
|
+
* - Hard 5-second timeout (non-configurable)
|
|
121
|
+
* - Prefers execFile for simple commands (no metacharacters)
|
|
122
|
+
* - Falls back to sh -c only when metacharacters detected
|
|
123
|
+
* - detached: false to prevent orphan processes
|
|
124
|
+
* - SIGTERM cleanup handler kills child on parent SIGTERM, 1s grace then SIGKILL
|
|
125
|
+
*
|
|
126
|
+
* The command template supports {{variable}} placeholders. All variable
|
|
127
|
+
* values are shell-escaped before interpolation to prevent injection.
|
|
128
|
+
*/
|
|
129
|
+
export async function wakeCommandGateway(gatewayName, gatewayConfig, variables) {
|
|
130
|
+
// Separate command gateway opt-in gate
|
|
131
|
+
if (process.env.OMX_OPENCLAW_COMMAND !== "1") {
|
|
132
|
+
return {
|
|
133
|
+
gateway: gatewayName,
|
|
134
|
+
success: false,
|
|
135
|
+
error: "Command gateway disabled (set OMX_OPENCLAW_COMMAND=1 to enable)",
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
let child = null;
|
|
139
|
+
let sigtermHandler = null;
|
|
140
|
+
try {
|
|
141
|
+
const { execFile, exec } = await import("child_process");
|
|
142
|
+
// Interpolate variables with shell escaping
|
|
143
|
+
const interpolated = gatewayConfig.command.replace(/\{\{(\w+)\}\}/g, (match, key) => {
|
|
144
|
+
const value = variables[key];
|
|
145
|
+
if (value === undefined)
|
|
146
|
+
return match;
|
|
147
|
+
return shellEscapeArg(value);
|
|
148
|
+
});
|
|
149
|
+
// Detect whether the interpolated command contains shell metacharacters
|
|
150
|
+
const hasMetachars = SHELL_METACHAR_RE.test(interpolated);
|
|
151
|
+
await new Promise((resolve, reject) => {
|
|
152
|
+
const cleanup = (signal) => {
|
|
153
|
+
if (child) {
|
|
154
|
+
child.kill(signal);
|
|
155
|
+
// 1s grace period then SIGKILL
|
|
156
|
+
setTimeout(() => {
|
|
157
|
+
try {
|
|
158
|
+
child?.kill("SIGKILL");
|
|
159
|
+
}
|
|
160
|
+
catch { /* already dead */ }
|
|
161
|
+
}, 1000);
|
|
162
|
+
}
|
|
163
|
+
};
|
|
164
|
+
sigtermHandler = () => cleanup("SIGTERM");
|
|
165
|
+
process.once("SIGTERM", sigtermHandler);
|
|
166
|
+
const onExit = (code, signal) => {
|
|
167
|
+
if (sigtermHandler) {
|
|
168
|
+
process.removeListener("SIGTERM", sigtermHandler);
|
|
169
|
+
sigtermHandler = null;
|
|
170
|
+
}
|
|
171
|
+
if (signal) {
|
|
172
|
+
reject(new Error(`Command killed by signal ${signal}`));
|
|
173
|
+
}
|
|
174
|
+
else if (code !== 0) {
|
|
175
|
+
reject(new Error(`Command exited with code ${code}`));
|
|
176
|
+
}
|
|
177
|
+
else {
|
|
178
|
+
resolve();
|
|
179
|
+
}
|
|
180
|
+
};
|
|
181
|
+
const onError = (err) => {
|
|
182
|
+
if (sigtermHandler) {
|
|
183
|
+
process.removeListener("SIGTERM", sigtermHandler);
|
|
184
|
+
sigtermHandler = null;
|
|
185
|
+
}
|
|
186
|
+
reject(err);
|
|
187
|
+
};
|
|
188
|
+
if (hasMetachars) {
|
|
189
|
+
// Fall back to sh -c for complex commands with metacharacters
|
|
190
|
+
child = exec(interpolated, {
|
|
191
|
+
timeout: COMMAND_TIMEOUT_MS,
|
|
192
|
+
env: { ...process.env },
|
|
193
|
+
});
|
|
194
|
+
}
|
|
195
|
+
else {
|
|
196
|
+
// Parse simple command: split on whitespace, use execFile
|
|
197
|
+
const parts = interpolated.split(/\s+/).filter(Boolean);
|
|
198
|
+
const cmd = parts[0];
|
|
199
|
+
const args = parts.slice(1);
|
|
200
|
+
child = execFile(cmd, args, {
|
|
201
|
+
timeout: COMMAND_TIMEOUT_MS,
|
|
202
|
+
env: { ...process.env },
|
|
203
|
+
});
|
|
204
|
+
}
|
|
205
|
+
// Ensure detached is false (default, but explicit via options above)
|
|
206
|
+
child.on("exit", onExit);
|
|
207
|
+
child.on("error", onError);
|
|
208
|
+
});
|
|
209
|
+
return { gateway: gatewayName, success: true };
|
|
210
|
+
}
|
|
211
|
+
catch (error) {
|
|
212
|
+
// Ensure SIGTERM handler is cleaned up on error
|
|
213
|
+
if (sigtermHandler) {
|
|
214
|
+
process.removeListener("SIGTERM", sigtermHandler);
|
|
215
|
+
}
|
|
216
|
+
return {
|
|
217
|
+
gateway: gatewayName,
|
|
218
|
+
success: false,
|
|
219
|
+
error: error instanceof Error ? error.message : "Unknown error",
|
|
220
|
+
};
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
//# sourceMappingURL=dispatcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dispatcher.js","sourceRoot":"","sources":["../../src/openclaw/dispatcher.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenClaw Integration - Public API
|
|
3
|
+
*
|
|
4
|
+
* Wakes OpenClaw gateways on hook events. Non-blocking, fire-and-forget.
|
|
5
|
+
*
|
|
6
|
+
* Usage (from notify hook via wakeOpenClaw):
|
|
7
|
+
* wakeOpenClaw("session-start", { sessionId, projectPath: directory });
|
|
8
|
+
*
|
|
9
|
+
* Activation requires OMX_OPENCLAW=1 env var and config in .omx-config.json.
|
|
10
|
+
*/
|
|
11
|
+
export type { OpenClawCommandGatewayConfig, OpenClawConfig, OpenClawContext, OpenClawGatewayConfig, OpenClawHookEvent, OpenClawHookMapping, OpenClawHttpGatewayConfig, OpenClawPayload, OpenClawResult, } from "./types.js";
|
|
12
|
+
export { getOpenClawConfig, resolveGateway, resetOpenClawConfigCache } from "./config.js";
|
|
13
|
+
export { wakeGateway, wakeCommandGateway, interpolateInstruction, isCommandGateway, shellEscapeArg, validateGatewayUrl, } from "./dispatcher.js";
|
|
14
|
+
import type { OpenClawHookEvent, OpenClawContext, OpenClawResult } from "./types.js";
|
|
15
|
+
/**
|
|
16
|
+
* Wake the OpenClaw gateway mapped to a hook event.
|
|
17
|
+
*
|
|
18
|
+
* This is the main entry point called from the notify hook.
|
|
19
|
+
* Non-blocking, swallows all errors. Returns null if OpenClaw
|
|
20
|
+
* is not configured or the event is not mapped.
|
|
21
|
+
*
|
|
22
|
+
* @param event - The hook event type
|
|
23
|
+
* @param context - Context data for template variable interpolation
|
|
24
|
+
* @returns OpenClawResult or null if not configured/mapped
|
|
25
|
+
*/
|
|
26
|
+
export declare function wakeOpenClaw(event: OpenClawHookEvent, context: OpenClawContext): Promise<OpenClawResult | null>;
|
|
27
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/openclaw/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,YAAY,EACV,4BAA4B,EAC5B,cAAc,EACd,eAAe,EACf,qBAAqB,EACrB,iBAAiB,EACjB,mBAAmB,EACnB,yBAAyB,EACzB,eAAe,EACf,cAAc,GACf,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC;AAC1F,OAAO,EACL,WAAW,EACX,kBAAkB,EAClB,sBAAsB,EACtB,gBAAgB,EAChB,cAAc,EACd,kBAAkB,GACnB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,KAAK,EAAE,iBAAiB,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AA0BrF;;;;;;;;;;GAUG;AACH,wBAAsB,YAAY,CAChC,KAAK,EAAE,iBAAiB,EACxB,OAAO,EAAE,eAAe,GACvB,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAiFhC"}
|