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.
Files changed (417) hide show
  1. package/README.md +19 -9
  2. package/bin/omx.js +3 -5
  3. package/dist/agents/__tests__/definitions.test.d.ts +2 -0
  4. package/dist/agents/__tests__/definitions.test.d.ts.map +1 -0
  5. package/dist/agents/__tests__/definitions.test.js +35 -0
  6. package/dist/agents/__tests__/definitions.test.js.map +1 -0
  7. package/dist/agents/__tests__/native-config.test.d.ts +2 -0
  8. package/dist/agents/__tests__/native-config.test.d.ts.map +1 -0
  9. package/dist/agents/__tests__/native-config.test.js +48 -0
  10. package/dist/agents/__tests__/native-config.test.js.map +1 -0
  11. package/dist/catalog/__tests__/schema.test.js +15 -0
  12. package/dist/catalog/__tests__/schema.test.js.map +1 -1
  13. package/dist/catalog/schema.d.ts.map +1 -1
  14. package/dist/catalog/schema.js +6 -0
  15. package/dist/catalog/schema.js.map +1 -1
  16. package/dist/cli/__tests__/catalog-contract.test.d.ts +2 -0
  17. package/dist/cli/__tests__/catalog-contract.test.d.ts.map +1 -0
  18. package/dist/cli/__tests__/catalog-contract.test.js +18 -0
  19. package/dist/cli/__tests__/catalog-contract.test.js.map +1 -0
  20. package/dist/cli/__tests__/doctor-team.test.js +3 -2
  21. package/dist/cli/__tests__/doctor-team.test.js.map +1 -1
  22. package/dist/cli/__tests__/error-handling-warnings.test.d.ts +2 -0
  23. package/dist/cli/__tests__/error-handling-warnings.test.d.ts.map +1 -0
  24. package/dist/cli/__tests__/error-handling-warnings.test.js +35 -0
  25. package/dist/cli/__tests__/error-handling-warnings.test.js.map +1 -0
  26. package/dist/cli/__tests__/index.test.js +81 -8
  27. package/dist/cli/__tests__/index.test.js.map +1 -1
  28. package/dist/cli/__tests__/setup-agents-overwrite.test.d.ts +2 -0
  29. package/dist/cli/__tests__/setup-agents-overwrite.test.d.ts.map +1 -0
  30. package/dist/cli/__tests__/setup-agents-overwrite.test.js +124 -0
  31. package/dist/cli/__tests__/setup-agents-overwrite.test.js.map +1 -0
  32. package/dist/cli/__tests__/setup-scope.test.js +79 -21
  33. package/dist/cli/__tests__/setup-scope.test.js.map +1 -1
  34. package/dist/cli/__tests__/setup-skills-overwrite.test.d.ts +2 -0
  35. package/dist/cli/__tests__/setup-skills-overwrite.test.d.ts.map +1 -0
  36. package/dist/cli/__tests__/setup-skills-overwrite.test.js +32 -0
  37. package/dist/cli/__tests__/setup-skills-overwrite.test.js.map +1 -0
  38. package/dist/cli/__tests__/star-prompt.test.js +74 -0
  39. package/dist/cli/__tests__/star-prompt.test.js.map +1 -1
  40. package/dist/cli/__tests__/team.test.js +8 -0
  41. package/dist/cli/__tests__/team.test.js.map +1 -1
  42. package/dist/cli/doctor.d.ts.map +1 -1
  43. package/dist/cli/doctor.js +75 -18
  44. package/dist/cli/doctor.js.map +1 -1
  45. package/dist/cli/index.d.ts +10 -1
  46. package/dist/cli/index.d.ts.map +1 -1
  47. package/dist/cli/index.js +153 -45
  48. package/dist/cli/index.js.map +1 -1
  49. package/dist/cli/setup.d.ts +2 -1
  50. package/dist/cli/setup.d.ts.map +1 -1
  51. package/dist/cli/setup.js +104 -60
  52. package/dist/cli/setup.js.map +1 -1
  53. package/dist/cli/star-prompt.d.ts +21 -1
  54. package/dist/cli/star-prompt.d.ts.map +1 -1
  55. package/dist/cli/star-prompt.js +34 -13
  56. package/dist/cli/star-prompt.js.map +1 -1
  57. package/dist/cli/team.d.ts.map +1 -1
  58. package/dist/cli/team.js +10 -3
  59. package/dist/cli/team.js.map +1 -1
  60. package/dist/cli/update.d.ts.map +1 -1
  61. package/dist/cli/update.js.map +1 -1
  62. package/dist/config/__tests__/generator-notify.test.js +16 -0
  63. package/dist/config/__tests__/generator-notify.test.js.map +1 -1
  64. package/dist/config/__tests__/models.test.js +9 -1
  65. package/dist/config/__tests__/models.test.js.map +1 -1
  66. package/dist/config/generator.js +9 -10
  67. package/dist/config/generator.js.map +1 -1
  68. package/dist/config/models.d.ts +8 -1
  69. package/dist/config/models.d.ts.map +1 -1
  70. package/dist/config/models.js +27 -5
  71. package/dist/config/models.js.map +1 -1
  72. package/dist/hooks/__tests__/agents-overlay.test.js +24 -0
  73. package/dist/hooks/__tests__/agents-overlay.test.js.map +1 -1
  74. package/dist/hooks/__tests__/consensus-execution-handoff.test.d.ts +18 -0
  75. package/dist/hooks/__tests__/consensus-execution-handoff.test.d.ts.map +1 -0
  76. package/dist/hooks/__tests__/consensus-execution-handoff.test.js +204 -0
  77. package/dist/hooks/__tests__/consensus-execution-handoff.test.js.map +1 -0
  78. package/dist/hooks/__tests__/emulator.test.d.ts +2 -0
  79. package/dist/hooks/__tests__/emulator.test.d.ts.map +1 -0
  80. package/dist/hooks/__tests__/emulator.test.js +47 -0
  81. package/dist/hooks/__tests__/emulator.test.js.map +1 -0
  82. package/dist/hooks/__tests__/keyword-detector.test.js +330 -4
  83. package/dist/hooks/__tests__/keyword-detector.test.js.map +1 -1
  84. package/dist/hooks/__tests__/notify-hook-auto-nudge.test.js +101 -0
  85. package/dist/hooks/__tests__/notify-hook-auto-nudge.test.js.map +1 -1
  86. package/dist/hooks/__tests__/notify-hook-cross-worktree-heartbeat.test.js +13 -7
  87. package/dist/hooks/__tests__/notify-hook-cross-worktree-heartbeat.test.js.map +1 -1
  88. package/dist/hooks/__tests__/notify-hook-modules.test.js +61 -0
  89. package/dist/hooks/__tests__/notify-hook-modules.test.js.map +1 -1
  90. package/dist/hooks/__tests__/notify-hook-session-scope.test.js +47 -0
  91. package/dist/hooks/__tests__/notify-hook-session-scope.test.js.map +1 -1
  92. package/dist/hooks/__tests__/notify-hook-worker-idle.test.d.ts +2 -0
  93. package/dist/hooks/__tests__/notify-hook-worker-idle.test.d.ts.map +1 -0
  94. package/dist/hooks/__tests__/notify-hook-worker-idle.test.js +560 -0
  95. package/dist/hooks/__tests__/notify-hook-worker-idle.test.js.map +1 -0
  96. package/dist/hooks/__tests__/session.test.d.ts +2 -0
  97. package/dist/hooks/__tests__/session.test.d.ts.map +1 -0
  98. package/dist/hooks/__tests__/session.test.js +161 -0
  99. package/dist/hooks/__tests__/session.test.js.map +1 -0
  100. package/dist/hooks/__tests__/task-size-detector.test.d.ts +2 -0
  101. package/dist/hooks/__tests__/task-size-detector.test.d.ts.map +1 -0
  102. package/dist/hooks/__tests__/task-size-detector.test.js +336 -0
  103. package/dist/hooks/__tests__/task-size-detector.test.js.map +1 -0
  104. package/dist/hooks/__tests__/tmux-hook-engine-types-sync.test.d.ts +2 -0
  105. package/dist/hooks/__tests__/tmux-hook-engine-types-sync.test.d.ts.map +1 -0
  106. package/dist/hooks/__tests__/tmux-hook-engine-types-sync.test.js +24 -0
  107. package/dist/hooks/__tests__/tmux-hook-engine-types-sync.test.js.map +1 -0
  108. package/dist/hooks/agents-overlay.d.ts.map +1 -1
  109. package/dist/hooks/agents-overlay.js +46 -2
  110. package/dist/hooks/agents-overlay.js.map +1 -1
  111. package/dist/hooks/code-simplifier/__tests__/index.test.js +67 -15
  112. package/dist/hooks/code-simplifier/__tests__/index.test.js.map +1 -1
  113. package/dist/hooks/code-simplifier/index.d.ts +10 -4
  114. package/dist/hooks/code-simplifier/index.d.ts.map +1 -1
  115. package/dist/hooks/code-simplifier/index.js +38 -12
  116. package/dist/hooks/code-simplifier/index.js.map +1 -1
  117. package/dist/hooks/codebase-map.d.ts.map +1 -1
  118. package/dist/hooks/codebase-map.js +5 -32
  119. package/dist/hooks/codebase-map.js.map +1 -1
  120. package/dist/hooks/emulator.d.ts.map +1 -1
  121. package/dist/hooks/emulator.js +11 -18
  122. package/dist/hooks/emulator.js.map +1 -1
  123. package/dist/hooks/extensibility/__tests__/dispatcher.test.js +59 -1
  124. package/dist/hooks/extensibility/__tests__/dispatcher.test.js.map +1 -1
  125. package/dist/hooks/extensibility/__tests__/loader.test.js +19 -0
  126. package/dist/hooks/extensibility/__tests__/loader.test.js.map +1 -1
  127. package/dist/hooks/extensibility/dispatcher.d.ts.map +1 -1
  128. package/dist/hooks/extensibility/dispatcher.js +51 -39
  129. package/dist/hooks/extensibility/dispatcher.js.map +1 -1
  130. package/dist/hooks/extensibility/loader.d.ts.map +1 -1
  131. package/dist/hooks/extensibility/loader.js +25 -13
  132. package/dist/hooks/extensibility/loader.js.map +1 -1
  133. package/dist/hooks/extensibility/logging.d.ts.map +1 -1
  134. package/dist/hooks/extensibility/logging.js +6 -1
  135. package/dist/hooks/extensibility/logging.js.map +1 -1
  136. package/dist/hooks/extensibility/sdk.js.map +1 -1
  137. package/dist/hooks/keyword-detector.d.ts +87 -0
  138. package/dist/hooks/keyword-detector.d.ts.map +1 -1
  139. package/dist/hooks/keyword-detector.js +235 -23
  140. package/dist/hooks/keyword-detector.js.map +1 -1
  141. package/dist/hooks/keyword-registry.d.ts +15 -0
  142. package/dist/hooks/keyword-registry.d.ts.map +1 -0
  143. package/dist/hooks/keyword-registry.js +41 -0
  144. package/dist/hooks/keyword-registry.js.map +1 -0
  145. package/dist/hooks/session.d.ts +18 -2
  146. package/dist/hooks/session.d.ts.map +1 -1
  147. package/dist/hooks/session.js +84 -11
  148. package/dist/hooks/session.js.map +1 -1
  149. package/dist/hooks/task-size-detector.d.ts +72 -0
  150. package/dist/hooks/task-size-detector.d.ts.map +1 -0
  151. package/dist/hooks/task-size-detector.js +204 -0
  152. package/dist/hooks/task-size-detector.js.map +1 -0
  153. package/dist/hud/__tests__/colors.test.js +1 -103
  154. package/dist/hud/__tests__/colors.test.js.map +1 -1
  155. package/dist/hud/__tests__/index.test.d.ts +2 -0
  156. package/dist/hud/__tests__/index.test.d.ts.map +1 -0
  157. package/dist/hud/__tests__/index.test.js +131 -0
  158. package/dist/hud/__tests__/index.test.js.map +1 -0
  159. package/dist/hud/__tests__/render.test.js +53 -0
  160. package/dist/hud/__tests__/render.test.js.map +1 -1
  161. package/dist/hud/__tests__/watch.test.d.ts +2 -0
  162. package/dist/hud/__tests__/watch.test.d.ts.map +1 -0
  163. package/dist/hud/__tests__/watch.test.js +63 -0
  164. package/dist/hud/__tests__/watch.test.js.map +1 -0
  165. package/dist/hud/colors.d.ts +2 -9
  166. package/dist/hud/colors.d.ts.map +1 -1
  167. package/dist/hud/colors.js +19 -34
  168. package/dist/hud/colors.js.map +1 -1
  169. package/dist/hud/constants.d.ts +1 -0
  170. package/dist/hud/constants.d.ts.map +1 -1
  171. package/dist/hud/constants.js +1 -0
  172. package/dist/hud/constants.js.map +1 -1
  173. package/dist/hud/index.d.ts +27 -0
  174. package/dist/hud/index.d.ts.map +1 -1
  175. package/dist/hud/index.js +149 -9
  176. package/dist/hud/index.js.map +1 -1
  177. package/dist/hud/render.d.ts.map +1 -1
  178. package/dist/hud/render.js +20 -7
  179. package/dist/hud/render.js.map +1 -1
  180. package/dist/mcp/__tests__/bootstrap.test.d.ts +2 -0
  181. package/dist/mcp/__tests__/bootstrap.test.d.ts.map +1 -0
  182. package/dist/mcp/__tests__/bootstrap.test.js +25 -0
  183. package/dist/mcp/__tests__/bootstrap.test.js.map +1 -0
  184. package/dist/mcp/__tests__/code-intel-server.test.d.ts +2 -0
  185. package/dist/mcp/__tests__/code-intel-server.test.d.ts.map +1 -0
  186. package/dist/mcp/__tests__/code-intel-server.test.js +43 -0
  187. package/dist/mcp/__tests__/code-intel-server.test.js.map +1 -0
  188. package/dist/mcp/__tests__/memory-server.test.d.ts +2 -0
  189. package/dist/mcp/__tests__/memory-server.test.d.ts.map +1 -0
  190. package/dist/mcp/__tests__/memory-server.test.js +34 -0
  191. package/dist/mcp/__tests__/memory-server.test.js.map +1 -0
  192. package/dist/mcp/__tests__/memory-validation.test.d.ts +2 -0
  193. package/dist/mcp/__tests__/memory-validation.test.d.ts.map +1 -0
  194. package/dist/mcp/__tests__/memory-validation.test.js +29 -0
  195. package/dist/mcp/__tests__/memory-validation.test.js.map +1 -0
  196. package/dist/mcp/__tests__/path-traversal.test.js +55 -0
  197. package/dist/mcp/__tests__/path-traversal.test.js.map +1 -1
  198. package/dist/mcp/__tests__/state-paths.test.js +43 -6
  199. package/dist/mcp/__tests__/state-paths.test.js.map +1 -1
  200. package/dist/mcp/__tests__/state-server-ralph-phase.test.js +50 -0
  201. package/dist/mcp/__tests__/state-server-ralph-phase.test.js.map +1 -1
  202. package/dist/mcp/__tests__/state-server-schema.test.js +3 -7
  203. package/dist/mcp/__tests__/state-server-schema.test.js.map +1 -1
  204. package/dist/mcp/__tests__/state-server.test.js +30 -1
  205. package/dist/mcp/__tests__/state-server.test.js.map +1 -1
  206. package/dist/mcp/__tests__/trace-server.test.js +58 -0
  207. package/dist/mcp/__tests__/trace-server.test.js.map +1 -1
  208. package/dist/mcp/bootstrap.d.ts +3 -0
  209. package/dist/mcp/bootstrap.d.ts.map +1 -0
  210. package/dist/mcp/bootstrap.js +13 -0
  211. package/dist/mcp/bootstrap.js.map +1 -0
  212. package/dist/mcp/code-intel-server.d.ts +8 -0
  213. package/dist/mcp/code-intel-server.d.ts.map +1 -1
  214. package/dist/mcp/code-intel-server.js +50 -24
  215. package/dist/mcp/code-intel-server.js.map +1 -1
  216. package/dist/mcp/memory-server.js +34 -13
  217. package/dist/mcp/memory-server.js.map +1 -1
  218. package/dist/mcp/memory-validation.d.ts +9 -0
  219. package/dist/mcp/memory-validation.d.ts.map +1 -0
  220. package/dist/mcp/memory-validation.js +11 -0
  221. package/dist/mcp/memory-validation.js.map +1 -0
  222. package/dist/mcp/state-paths.d.ts +2 -0
  223. package/dist/mcp/state-paths.d.ts.map +1 -1
  224. package/dist/mcp/state-paths.js +83 -12
  225. package/dist/mcp/state-paths.js.map +1 -1
  226. package/dist/mcp/state-server.d.ts.map +1 -1
  227. package/dist/mcp/state-server.js +85 -47
  228. package/dist/mcp/state-server.js.map +1 -1
  229. package/dist/mcp/trace-server.d.ts +16 -0
  230. package/dist/mcp/trace-server.d.ts.map +1 -1
  231. package/dist/mcp/trace-server.js +84 -24
  232. package/dist/mcp/trace-server.js.map +1 -1
  233. package/dist/modes/__tests__/base-ralph-contract.test.d.ts +2 -0
  234. package/dist/modes/__tests__/base-ralph-contract.test.d.ts.map +1 -0
  235. package/dist/modes/__tests__/base-ralph-contract.test.js +49 -0
  236. package/dist/modes/__tests__/base-ralph-contract.test.js.map +1 -0
  237. package/dist/modes/__tests__/base-tmux-pane.test.js +13 -1
  238. package/dist/modes/__tests__/base-tmux-pane.test.js.map +1 -1
  239. package/dist/modes/base.d.ts +0 -4
  240. package/dist/modes/base.d.ts.map +1 -1
  241. package/dist/modes/base.js +31 -11
  242. package/dist/modes/base.js.map +1 -1
  243. package/dist/notifications/__tests__/config.test.js +47 -1
  244. package/dist/notifications/__tests__/config.test.js.map +1 -1
  245. package/dist/notifications/__tests__/formatter.test.js +54 -2
  246. package/dist/notifications/__tests__/formatter.test.js.map +1 -1
  247. package/dist/notifications/__tests__/hook-config.test.d.ts +5 -0
  248. package/dist/notifications/__tests__/hook-config.test.d.ts.map +1 -0
  249. package/dist/notifications/__tests__/hook-config.test.js +139 -0
  250. package/dist/notifications/__tests__/hook-config.test.js.map +1 -0
  251. package/dist/notifications/__tests__/idle-cooldown.test.d.ts +5 -0
  252. package/dist/notifications/__tests__/idle-cooldown.test.d.ts.map +1 -0
  253. package/dist/notifications/__tests__/idle-cooldown.test.js +100 -0
  254. package/dist/notifications/__tests__/idle-cooldown.test.js.map +1 -0
  255. package/dist/notifications/__tests__/notifier.test.js +89 -1
  256. package/dist/notifications/__tests__/notifier.test.js.map +1 -1
  257. package/dist/notifications/__tests__/reply-config.test.d.ts +2 -0
  258. package/dist/notifications/__tests__/reply-config.test.d.ts.map +1 -0
  259. package/dist/notifications/__tests__/reply-config.test.js +79 -0
  260. package/dist/notifications/__tests__/reply-config.test.js.map +1 -0
  261. package/dist/notifications/__tests__/reply-listener.test.js +35 -1
  262. package/dist/notifications/__tests__/reply-listener.test.js.map +1 -1
  263. package/dist/notifications/__tests__/session-registry.test.js +40 -0
  264. package/dist/notifications/__tests__/session-registry.test.js.map +1 -1
  265. package/dist/notifications/__tests__/template-engine.test.d.ts +5 -0
  266. package/dist/notifications/__tests__/template-engine.test.d.ts.map +1 -0
  267. package/dist/notifications/__tests__/template-engine.test.js +147 -0
  268. package/dist/notifications/__tests__/template-engine.test.js.map +1 -0
  269. package/dist/notifications/config.d.ts +8 -0
  270. package/dist/notifications/config.d.ts.map +1 -1
  271. package/dist/notifications/config.js +110 -19
  272. package/dist/notifications/config.js.map +1 -1
  273. package/dist/notifications/formatter.d.ts +5 -0
  274. package/dist/notifications/formatter.d.ts.map +1 -1
  275. package/dist/notifications/formatter.js +45 -10
  276. package/dist/notifications/formatter.js.map +1 -1
  277. package/dist/notifications/hook-config-types.d.ts +43 -0
  278. package/dist/notifications/hook-config-types.d.ts.map +1 -0
  279. package/dist/notifications/hook-config-types.js +8 -0
  280. package/dist/notifications/hook-config-types.js.map +1 -0
  281. package/dist/notifications/hook-config.d.ts +40 -0
  282. package/dist/notifications/hook-config.d.ts.map +1 -0
  283. package/dist/notifications/hook-config.js +127 -0
  284. package/dist/notifications/hook-config.js.map +1 -0
  285. package/dist/notifications/idle-cooldown.d.ts +35 -0
  286. package/dist/notifications/idle-cooldown.d.ts.map +1 -0
  287. package/dist/notifications/idle-cooldown.js +108 -0
  288. package/dist/notifications/idle-cooldown.js.map +1 -0
  289. package/dist/notifications/index.d.ts +3 -0
  290. package/dist/notifications/index.d.ts.map +1 -1
  291. package/dist/notifications/index.js +43 -1
  292. package/dist/notifications/index.js.map +1 -1
  293. package/dist/notifications/notifier.d.ts +9 -0
  294. package/dist/notifications/notifier.d.ts.map +1 -1
  295. package/dist/notifications/notifier.js +36 -30
  296. package/dist/notifications/notifier.js.map +1 -1
  297. package/dist/notifications/reply-listener.d.ts +3 -0
  298. package/dist/notifications/reply-listener.d.ts.map +1 -1
  299. package/dist/notifications/reply-listener.js +61 -7
  300. package/dist/notifications/reply-listener.js.map +1 -1
  301. package/dist/notifications/session-registry.d.ts +1 -1
  302. package/dist/notifications/session-registry.d.ts.map +1 -1
  303. package/dist/notifications/session-registry.js +18 -6
  304. package/dist/notifications/session-registry.js.map +1 -1
  305. package/dist/notifications/template-engine.d.ts +34 -0
  306. package/dist/notifications/template-engine.d.ts.map +1 -0
  307. package/dist/notifications/template-engine.js +246 -0
  308. package/dist/notifications/template-engine.js.map +1 -0
  309. package/dist/notifications/types.d.ts +6 -0
  310. package/dist/notifications/types.d.ts.map +1 -1
  311. package/dist/openclaw/__tests__/config.test.d.ts +6 -0
  312. package/dist/openclaw/__tests__/config.test.d.ts.map +1 -0
  313. package/dist/openclaw/__tests__/config.test.js +174 -0
  314. package/dist/openclaw/__tests__/config.test.js.map +1 -0
  315. package/dist/openclaw/__tests__/dispatcher.test.d.ts +5 -0
  316. package/dist/openclaw/__tests__/dispatcher.test.d.ts.map +1 -0
  317. package/dist/openclaw/__tests__/dispatcher.test.js +104 -0
  318. package/dist/openclaw/__tests__/dispatcher.test.js.map +1 -0
  319. package/dist/openclaw/__tests__/index.test.d.ts +6 -0
  320. package/dist/openclaw/__tests__/index.test.d.ts.map +1 -0
  321. package/dist/openclaw/__tests__/index.test.js +131 -0
  322. package/dist/openclaw/__tests__/index.test.js.map +1 -0
  323. package/dist/openclaw/config.d.ts +37 -0
  324. package/dist/openclaw/config.d.ts.map +1 -0
  325. package/dist/openclaw/config.js +106 -0
  326. package/dist/openclaw/config.js.map +1 -0
  327. package/dist/openclaw/dispatcher.d.ts +63 -0
  328. package/dist/openclaw/dispatcher.d.ts.map +1 -0
  329. package/dist/openclaw/dispatcher.js +223 -0
  330. package/dist/openclaw/dispatcher.js.map +1 -0
  331. package/dist/openclaw/index.d.ts +27 -0
  332. package/dist/openclaw/index.d.ts.map +1 -0
  333. package/dist/openclaw/index.js +130 -0
  334. package/dist/openclaw/index.js.map +1 -0
  335. package/dist/openclaw/types.d.ts +105 -0
  336. package/dist/openclaw/types.d.ts.map +1 -0
  337. package/dist/openclaw/types.js +12 -0
  338. package/dist/openclaw/types.js.map +1 -0
  339. package/dist/ralph/contract.d.ts.map +1 -1
  340. package/dist/ralph/contract.js +13 -4
  341. package/dist/ralph/contract.js.map +1 -1
  342. package/dist/team/__tests__/phase-controller.test.js +14 -0
  343. package/dist/team/__tests__/phase-controller.test.js.map +1 -1
  344. package/dist/team/__tests__/runtime.test.js +328 -1
  345. package/dist/team/__tests__/runtime.test.js.map +1 -1
  346. package/dist/team/__tests__/scaling.test.d.ts +2 -0
  347. package/dist/team/__tests__/scaling.test.d.ts.map +1 -0
  348. package/dist/team/__tests__/scaling.test.js +295 -0
  349. package/dist/team/__tests__/scaling.test.js.map +1 -0
  350. package/dist/team/__tests__/state.test.js +62 -1
  351. package/dist/team/__tests__/state.test.js.map +1 -1
  352. package/dist/team/__tests__/tmux-session.test.js +219 -14
  353. package/dist/team/__tests__/tmux-session.test.js.map +1 -1
  354. package/dist/team/__tests__/worker-bootstrap.test.js +4 -0
  355. package/dist/team/__tests__/worker-bootstrap.test.js.map +1 -1
  356. package/dist/team/contracts.d.ts +14 -0
  357. package/dist/team/contracts.d.ts.map +1 -0
  358. package/dist/team/contracts.js +30 -0
  359. package/dist/team/contracts.js.map +1 -0
  360. package/dist/team/model-contract.d.ts +1 -0
  361. package/dist/team/model-contract.d.ts.map +1 -1
  362. package/dist/team/model-contract.js +5 -1
  363. package/dist/team/model-contract.js.map +1 -1
  364. package/dist/team/phase-controller.d.ts +2 -0
  365. package/dist/team/phase-controller.d.ts.map +1 -1
  366. package/dist/team/phase-controller.js +16 -2
  367. package/dist/team/phase-controller.js.map +1 -1
  368. package/dist/team/runtime.d.ts.map +1 -1
  369. package/dist/team/runtime.js +356 -65
  370. package/dist/team/runtime.js.map +1 -1
  371. package/dist/team/scaling.d.ts +58 -0
  372. package/dist/team/scaling.d.ts.map +1 -0
  373. package/dist/team/scaling.js +319 -0
  374. package/dist/team/scaling.js.map +1 -0
  375. package/dist/team/state.d.ts +11 -2
  376. package/dist/team/state.d.ts.map +1 -1
  377. package/dist/team/state.js +97 -27
  378. package/dist/team/state.js.map +1 -1
  379. package/dist/team/team-ops.d.ts +2 -0
  380. package/dist/team/team-ops.d.ts.map +1 -1
  381. package/dist/team/team-ops.js +4 -0
  382. package/dist/team/team-ops.js.map +1 -1
  383. package/dist/team/tmux-session.d.ts +34 -5
  384. package/dist/team/tmux-session.d.ts.map +1 -1
  385. package/dist/team/tmux-session.js +177 -49
  386. package/dist/team/tmux-session.js.map +1 -1
  387. package/dist/team/worker-bootstrap.d.ts.map +1 -1
  388. package/dist/team/worker-bootstrap.js +20 -0
  389. package/dist/team/worker-bootstrap.js.map +1 -1
  390. package/dist/utils/__tests__/paths.test.js +8 -1
  391. package/dist/utils/__tests__/paths.test.js.map +1 -1
  392. package/dist/utils/paths.d.ts.map +1 -1
  393. package/dist/utils/paths.js +14 -6
  394. package/dist/utils/paths.js.map +1 -1
  395. package/dist/verification/__tests__/verifier.test.js +20 -1
  396. package/dist/verification/__tests__/verifier.test.js.map +1 -1
  397. package/dist/verification/verifier.d.ts +5 -0
  398. package/dist/verification/verifier.d.ts.map +1 -1
  399. package/dist/verification/verifier.js +19 -0
  400. package/dist/verification/verifier.js.map +1 -1
  401. package/package.json +2 -1
  402. package/prompts/architect.md +11 -0
  403. package/prompts/critic.md +14 -1
  404. package/prompts/planner.md +21 -0
  405. package/scripts/notify-hook/auto-nudge.js +80 -1
  406. package/scripts/notify-hook/payload-parser.js +21 -0
  407. package/scripts/notify-hook/team-worker.js +142 -0
  408. package/scripts/notify-hook/tmux-injection.js +3 -3
  409. package/scripts/notify-hook.js +55 -4
  410. package/skills/configure-notifications/SKILL.md +278 -0
  411. package/skills/configure-openclaw/SKILL.md +267 -0
  412. package/skills/configure-slack/SKILL.md +226 -0
  413. package/skills/omx-setup/SKILL.md +14 -19
  414. package/skills/plan/SKILL.md +57 -33
  415. package/skills/ralplan/SKILL.md +107 -21
  416. package/skills/team/SKILL.md +10 -1
  417. 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":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAC9C,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAG9C,qFAAqF;AACrF,IAAI,aAAa,GAAsC,IAAI,CAAC;AAE5D;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,iBAAiB;IAC/B,mDAAmD;IACnD,IAAI,OAAO,CAAC,GAAG,CAAC,YAAY,KAAK,GAAG,EAAE,CAAC;QACrC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,uBAAuB;IACvB,IAAI,aAAa,KAAK,IAAI,EAAE,CAAC;QAC3B,OAAO,aAAa,IAAI,IAAI,CAAC;IAC/B,CAAC;IAED,IAAI,CAAC;QACH,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC;QAEpD,IAAI,WAAW,EAAE,CAAC;YAChB,uDAAuD;YACvD,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;gBAC7B,aAAa,GAAG,SAAS,CAAC;gBAC1B,OAAO,IAAI,CAAC;YACd,CAAC;YACD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAmB,CAAC;YAC7E,IAAI,CAAC,GAAG,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC,QAAQ,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC;gBAChD,aAAa,GAAG,SAAS,CAAC;gBAC1B,OAAO,IAAI,CAAC;YACd,CAAC;YACD,aAAa,GAAG,GAAG,CAAC;YACpB,OAAO,GAAG,CAAC;QACb,CAAC;aAAM,CAAC;YACN,oEAAoE;YACpE,MAAM,aAAa,GAAG,IAAI,CAAC,SAAS,EAAE,EAAE,kBAAkB,CAAC,CAAC;YAC5D,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;gBAC/B,aAAa,GAAG,SAAS,CAAC;gBAC1B,OAAO,IAAI,CAAC;YACd,CAAC;YACD,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,aAAa,EAAE,OAAO,CAAC,CAA4B,CAAC;YAC/F,MAAM,UAAU,GAAG,UAAU,CAAC,aAAoD,CAAC;YACnF,MAAM,GAAG,GAAG,UAAU,EAAE,QAAsC,CAAC;YAC/D,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC,QAAQ,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC;gBACxD,aAAa,GAAG,SAAS,CAAC;gBAC1B,OAAO,IAAI,CAAC;YACd,CAAC;YACD,aAAa,GAAG,GAAG,CAAC;YACpB,OAAO,GAAG,CAAC;QACb,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,aAAa,GAAG,SAAS,CAAC;QAC1B,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAC5B,MAAsB,EACtB,KAAwB;IAExB,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACpC,IAAI,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;QACjC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IACjD,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,IAAI,CAAC;IACd,CAAC;IAED,iCAAiC;IACjC,IAAK,OAAwC,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QACjE,IAAI,CAAE,OAAwC,CAAC,OAAO;YAAE,OAAO,IAAI,CAAC;IACtE,CAAC;SAAM,CAAC;QACN,uDAAuD;QACvD,IAAI,CAAC,CAAC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG;YAAE,OAAO,IAAI,CAAC;IACvD,CAAC;IAED,OAAO,EAAE,WAAW,EAAE,OAAO,CAAC,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,CAAC,WAAW,EAAE,CAAC;AACrF,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,wBAAwB;IACtC,aAAa,GAAG,IAAI,CAAC;AACvB,CAAC"}
@@ -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"}