oh-my-opencode 4.8.1 → 4.9.1

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 (509) hide show
  1. package/dist/agents/prometheus/system-prompt.d.ts +1 -1
  2. package/dist/agents/sisyphus/claude-fable-5.d.ts +19 -0
  3. package/dist/agents/sisyphus/claude-opus-4-7.d.ts +3 -1
  4. package/dist/agents/sisyphus/claude-opus-4-8.d.ts +19 -0
  5. package/dist/agents/sisyphus/index.d.ts +4 -0
  6. package/dist/agents/types.d.ts +2 -2
  7. package/dist/cli/doctor/checks/codex.d.ts +1 -0
  8. package/dist/cli/doctor/checks/dependencies.d.ts +2 -2
  9. package/dist/cli/doctor/checks/tools-gh.d.ts +8 -1
  10. package/dist/cli/doctor/index.d.ts +1 -0
  11. package/dist/cli/doctor/types.d.ts +2 -0
  12. package/dist/cli/index.js +1908 -787
  13. package/dist/cli/install-codex/codex-config-permissions.d.ts +1 -1
  14. package/dist/cli/install-codex/codex-config-plugins.d.ts +1 -0
  15. package/dist/cli/install-codex/codex-config-toml.d.ts +1 -0
  16. package/dist/cli/install-codex/codex-installer-bin-dir.d.ts +8 -0
  17. package/dist/cli/install-codex/install-codex.d.ts +1 -8
  18. package/dist/cli/install-codex/lsp-daemon-reaper.d.ts +5 -0
  19. package/dist/cli/sparkshell-condense.d.ts +10 -0
  20. package/dist/cli/sparkshell-parse.d.ts +3 -0
  21. package/dist/cli/sparkshell-session-context.d.ts +20 -0
  22. package/dist/cli/sparkshell-spark.d.ts +23 -0
  23. package/dist/cli/sparkshell.d.ts +8 -1
  24. package/dist/cli-node/index.js +92564 -0
  25. package/dist/config/schema/agent-names.d.ts +2 -0
  26. package/dist/config/schema/hooks.d.ts +0 -2
  27. package/dist/config/schema/keyword-detector.d.ts +0 -6
  28. package/dist/config/schema/oh-my-opencode-config.d.ts +2 -4
  29. package/dist/create-hooks.d.ts +0 -2
  30. package/dist/features/background-agent/parent-wake-dedupe.d.ts +2 -0
  31. package/dist/features/background-agent/parent-wake-flush-runner.d.ts +2 -0
  32. package/dist/features/background-agent/parent-wake-prompt-dispatch.d.ts +1 -0
  33. package/dist/features/background-agent/parent-wake-session-history.d.ts +4 -0
  34. package/dist/features/background-agent/parent-wake-session-inspector.d.ts +1 -0
  35. package/dist/features/builtin-commands/templates/handoff.d.ts +1 -1
  36. package/dist/features/builtin-skills/index.d.ts +1 -1
  37. package/dist/features/builtin-skills/skills.d.ts +4 -0
  38. package/dist/features/opencode-runtime-skills/source-server.d.ts +16 -1
  39. package/dist/features/opencode-skill-loader/skill-definition-record.d.ts +2 -0
  40. package/dist/features/team-mode/tools/lifecycle-test-fixture.d.ts +2 -0
  41. package/dist/features/team-mode/types.d.ts +1 -0
  42. package/dist/features/tmux-subagent/failed-readiness-cache.d.ts +28 -0
  43. package/dist/features/tmux-subagent/manager.d.ts +1 -9
  44. package/dist/features/tmux-subagent/resolve-server-url.d.ts +3 -0
  45. package/dist/hooks/anthropic-context-window-limit-recovery/executor.d.ts +1 -1
  46. package/dist/hooks/index.d.ts +0 -1
  47. package/dist/hooks/keyword-detector/constants.d.ts +0 -4
  48. package/dist/hooks/keyword-detector/ultrawork/source-detector.d.ts +1 -1
  49. package/dist/index.js +9001 -1795
  50. package/dist/oh-my-opencode.schema.json +2 -4
  51. package/dist/plugin/chat-params.d.ts +1 -8
  52. package/dist/plugin/hooks/create-core-hooks.d.ts +0 -2
  53. package/dist/plugin/hooks/create-session-hooks.d.ts +0 -2
  54. package/dist/plugin/hooks/create-transform-hooks.d.ts +1 -2
  55. package/dist/plugin/messages-transform.d.ts +0 -1
  56. package/dist/shared/model-availability.d.ts +10 -2
  57. package/dist/shared/module-resolution-failure.d.ts +7 -0
  58. package/package.json +25 -18
  59. package/packages/ast-grep-mcp/dist/cli.js +2 -10
  60. package/packages/git-bash-mcp/dist/cli.js +11 -4
  61. package/packages/lsp-daemon/dist/cli.d.ts +2 -0
  62. package/packages/lsp-daemon/dist/cli.js +3711 -0
  63. package/packages/lsp-daemon/dist/daemon-client.d.ts +19 -0
  64. package/packages/lsp-daemon/dist/daemon-client.js +114 -0
  65. package/packages/lsp-daemon/dist/daemon-server.d.ts +12 -0
  66. package/packages/lsp-daemon/dist/daemon-server.js +106 -0
  67. package/packages/lsp-daemon/dist/ensure-daemon.d.ts +21 -0
  68. package/packages/lsp-daemon/dist/ensure-daemon.js +97 -0
  69. package/packages/lsp-daemon/dist/index.d.ts +5 -0
  70. package/packages/lsp-daemon/dist/index.js +3573 -0
  71. package/packages/lsp-daemon/dist/lock.d.ts +7 -0
  72. package/packages/lsp-daemon/dist/lock.js +61 -0
  73. package/packages/lsp-daemon/dist/package.json +6 -0
  74. package/packages/lsp-daemon/dist/paths.d.ts +11 -0
  75. package/packages/lsp-daemon/dist/paths.js +49 -0
  76. package/packages/lsp-daemon/dist/proxy.d.ts +10 -0
  77. package/packages/lsp-daemon/dist/proxy.js +61 -0
  78. package/packages/lsp-daemon/dist/request-routing.d.ts +9 -0
  79. package/packages/lsp-daemon/dist/request-routing.js +44 -0
  80. package/packages/lsp-daemon/dist/run-daemon.d.ts +1 -0
  81. package/packages/lsp-daemon/dist/run-daemon.js +11 -0
  82. package/packages/lsp-daemon/dist/socket-jsonrpc.d.ts +5 -0
  83. package/packages/lsp-daemon/dist/socket-jsonrpc.js +25 -0
  84. package/packages/lsp-daemon/package.json +38 -0
  85. package/packages/lsp-tools-mcp/dist/cli.js +0 -0
  86. package/packages/lsp-tools-mcp/dist/lsp/client-wrapper.js +40 -17
  87. package/packages/lsp-tools-mcp/dist/lsp/client.js +11 -9
  88. package/packages/lsp-tools-mcp/dist/lsp/config-loader.js +5 -5
  89. package/packages/lsp-tools-mcp/dist/lsp/directory-diagnostics.js +5 -3
  90. package/packages/lsp-tools-mcp/dist/lsp/effective-extension.d.ts +1 -0
  91. package/packages/lsp-tools-mcp/dist/lsp/effective-extension.js +8 -0
  92. package/packages/lsp-tools-mcp/dist/lsp/infer-extension.js +3 -2
  93. package/packages/lsp-tools-mcp/dist/lsp/language-mappings.js +1 -0
  94. package/packages/lsp-tools-mcp/dist/lsp/server-definitions.js +12 -0
  95. package/packages/lsp-tools-mcp/dist/lsp/server-install-state.d.ts +12 -0
  96. package/packages/lsp-tools-mcp/dist/lsp/server-install-state.js +51 -0
  97. package/packages/lsp-tools-mcp/dist/lsp/workspace-edit.js +2 -1
  98. package/packages/lsp-tools-mcp/dist/request-context.d.ts +7 -0
  99. package/packages/lsp-tools-mcp/dist/request-context.js +14 -0
  100. package/packages/lsp-tools-mcp/dist/tools.js +44 -1
  101. package/packages/omo-codex/plugin/.codex-plugin/plugin.json +46 -33
  102. package/packages/omo-codex/plugin/.mcp.json +1 -1
  103. package/packages/omo-codex/plugin/components/comment-checker/dist/apply-patch.d.ts +7 -0
  104. package/packages/omo-codex/plugin/components/comment-checker/dist/apply-patch.js +173 -0
  105. package/packages/omo-codex/plugin/components/comment-checker/dist/cli.d.ts +2 -0
  106. package/packages/omo-codex/plugin/components/comment-checker/dist/cli.js +10 -0
  107. package/packages/omo-codex/plugin/components/comment-checker/dist/codex-hook.d.ts +22 -0
  108. package/packages/omo-codex/plugin/components/comment-checker/dist/codex-hook.js +165 -0
  109. package/packages/omo-codex/plugin/components/comment-checker/dist/core-values.d.ts +1 -0
  110. package/packages/omo-codex/plugin/components/comment-checker/dist/core-values.js +1 -0
  111. package/packages/omo-codex/plugin/components/comment-checker/dist/core.d.ts +5 -0
  112. package/packages/omo-codex/plugin/components/comment-checker/dist/core.js +4 -0
  113. package/packages/omo-codex/plugin/components/comment-checker/dist/hook-input.d.ts +6 -0
  114. package/packages/omo-codex/plugin/components/comment-checker/dist/hook-input.js +10 -0
  115. package/packages/omo-codex/plugin/components/comment-checker/dist/record.d.ts +2 -0
  116. package/packages/omo-codex/plugin/components/comment-checker/dist/record.js +11 -0
  117. package/packages/omo-codex/plugin/components/comment-checker/dist/request-extractor.d.ts +3 -0
  118. package/packages/omo-codex/plugin/components/comment-checker/dist/request-extractor.js +104 -0
  119. package/packages/omo-codex/plugin/components/comment-checker/dist/runner.d.ts +26 -0
  120. package/packages/omo-codex/plugin/components/comment-checker/dist/runner.js +144 -0
  121. package/packages/omo-codex/plugin/components/comment-checker/dist/types.d.ts +43 -0
  122. package/packages/omo-codex/plugin/components/comment-checker/dist/types.js +1 -0
  123. package/packages/omo-codex/plugin/components/comment-checker/hooks/hooks.json +1 -1
  124. package/packages/omo-codex/plugin/components/comment-checker/package.json +1 -1
  125. package/packages/omo-codex/plugin/components/git-bash/dist/cli.d.ts +2 -0
  126. package/packages/omo-codex/plugin/components/git-bash/dist/cli.js +29 -0
  127. package/packages/omo-codex/plugin/components/git-bash/dist/codex-hook.d.ts +28 -0
  128. package/packages/omo-codex/plugin/components/git-bash/dist/codex-hook.js +137 -0
  129. package/packages/omo-codex/plugin/components/git-bash/dist/index.d.ts +1 -0
  130. package/packages/omo-codex/plugin/components/git-bash/dist/index.js +1 -0
  131. package/packages/omo-codex/plugin/components/git-bash/hooks/hooks.json +2 -2
  132. package/packages/omo-codex/plugin/components/git-bash/package.json +5 -2
  133. package/packages/omo-codex/plugin/components/lsp/.mcp.json +1 -1
  134. package/packages/omo-codex/plugin/components/lsp/dist/cli.d.ts +2 -0
  135. package/packages/omo-codex/plugin/components/lsp/dist/cli.js +42 -0
  136. package/packages/omo-codex/plugin/components/lsp/dist/codex-hook-cli.d.ts +2 -0
  137. package/packages/omo-codex/plugin/components/lsp/dist/codex-hook-cli.js +40 -0
  138. package/packages/omo-codex/plugin/components/lsp/dist/codex-hook.d.ts +16 -0
  139. package/packages/omo-codex/plugin/components/lsp/dist/codex-hook.js +180 -0
  140. package/packages/omo-codex/plugin/components/lsp/dist/lsp-session-state.d.ts +12 -0
  141. package/packages/omo-codex/plugin/components/lsp/dist/lsp-session-state.js +95 -0
  142. package/packages/omo-codex/plugin/components/lsp/dist/mutated-file-paths.d.ts +6 -0
  143. package/packages/omo-codex/plugin/components/lsp/dist/mutated-file-paths.js +79 -0
  144. package/packages/omo-codex/plugin/components/lsp/hooks/hooks.json +2 -2
  145. package/packages/omo-codex/plugin/components/lsp/package.json +7 -7
  146. package/packages/omo-codex/plugin/components/lsp/scripts/build-lsp-daemon.mjs +68 -0
  147. package/packages/omo-codex/plugin/components/lsp/scripts/build-lsp-tools.mjs +45 -22
  148. package/packages/omo-codex/plugin/components/lsp/src/cli.ts +1 -1
  149. package/packages/omo-codex/plugin/components/lsp/src/codex-hook-cli.ts +1 -1
  150. package/packages/omo-codex/plugin/components/lsp/src/codex-hook.ts +6 -2
  151. package/packages/omo-codex/plugin/components/lsp/src/lsp-session-state.ts +4 -0
  152. package/packages/omo-codex/plugin/components/lsp/test/codex-hook-unavailable.test.ts +68 -0
  153. package/packages/omo-codex/plugin/components/lsp/test/package-smoke.test.ts +8 -20
  154. package/packages/omo-codex/plugin/components/rules/bundled-rules/hephaestus.md +69 -96
  155. package/packages/omo-codex/plugin/components/rules/dist/cli.d.ts +2 -0
  156. package/packages/omo-codex/plugin/components/rules/dist/cli.js +118 -0
  157. package/packages/omo-codex/plugin/components/rules/dist/codex-hook-options.d.ts +5 -0
  158. package/packages/omo-codex/plugin/components/rules/dist/codex-hook-options.js +1 -0
  159. package/packages/omo-codex/plugin/components/rules/dist/codex-hook.d.ts +47 -0
  160. package/packages/omo-codex/plugin/components/rules/dist/codex-hook.js +127 -0
  161. package/packages/omo-codex/plugin/components/rules/dist/config.d.ts +2 -0
  162. package/packages/omo-codex/plugin/components/rules/dist/config.js +100 -0
  163. package/packages/omo-codex/plugin/components/rules/dist/context-pressure.d.ts +2 -0
  164. package/packages/omo-codex/plugin/components/rules/dist/context-pressure.js +26 -0
  165. package/packages/omo-codex/plugin/components/rules/dist/debug-log.d.ts +8 -0
  166. package/packages/omo-codex/plugin/components/rules/dist/debug-log.js +36 -0
  167. package/packages/omo-codex/plugin/components/rules/dist/dynamic-target-fingerprints.d.ts +7 -0
  168. package/packages/omo-codex/plugin/components/rules/dist/dynamic-target-fingerprints.js +65 -0
  169. package/packages/omo-codex/plugin/components/rules/dist/event-budget.d.ts +3 -0
  170. package/packages/omo-codex/plugin/components/rules/dist/event-budget.js +14 -0
  171. package/packages/omo-codex/plugin/components/rules/dist/hook-output.d.ts +2 -0
  172. package/packages/omo-codex/plugin/components/rules/dist/hook-output.js +24 -0
  173. package/packages/omo-codex/plugin/components/rules/dist/path-utils.d.ts +4 -0
  174. package/packages/omo-codex/plugin/components/rules/dist/path-utils.js +24 -0
  175. package/packages/omo-codex/plugin/components/rules/dist/persistent-cache.d.ts +13 -0
  176. package/packages/omo-codex/plugin/components/rules/dist/persistent-cache.js +172 -0
  177. package/packages/omo-codex/plugin/components/rules/dist/post-compact-budget.d.ts +6 -0
  178. package/packages/omo-codex/plugin/components/rules/dist/post-compact-budget.js +74 -0
  179. package/packages/omo-codex/plugin/components/rules/dist/post-compact-claim.d.ts +4 -0
  180. package/packages/omo-codex/plugin/components/rules/dist/post-compact-claim.js +6 -0
  181. package/packages/omo-codex/plugin/components/rules/dist/post-compact-directive.d.ts +1 -0
  182. package/packages/omo-codex/plugin/components/rules/dist/post-compact-directive.js +32 -0
  183. package/packages/omo-codex/plugin/components/rules/dist/post-compact-state.d.ts +13 -0
  184. package/packages/omo-codex/plugin/components/rules/dist/post-compact-state.js +29 -0
  185. package/packages/omo-codex/plugin/components/rules/dist/rules/cache.d.ts +9 -0
  186. package/packages/omo-codex/plugin/components/rules/dist/rules/cache.js +51 -0
  187. package/packages/omo-codex/plugin/components/rules/dist/rules/constants.d.ts +70 -0
  188. package/packages/omo-codex/plugin/components/rules/dist/rules/constants.js +101 -0
  189. package/packages/omo-codex/plugin/components/rules/dist/rules/engine-dynamic-cache.d.ts +5 -0
  190. package/packages/omo-codex/plugin/components/rules/dist/rules/engine-dynamic-cache.js +60 -0
  191. package/packages/omo-codex/plugin/components/rules/dist/rules/engine-dynamic-loader.d.ts +6 -0
  192. package/packages/omo-codex/plugin/components/rules/dist/rules/engine-dynamic-loader.js +61 -0
  193. package/packages/omo-codex/plugin/components/rules/dist/rules/engine-loader.d.ts +7 -0
  194. package/packages/omo-codex/plugin/components/rules/dist/rules/engine-loader.js +60 -0
  195. package/packages/omo-codex/plugin/components/rules/dist/rules/engine-paths.d.ts +11 -0
  196. package/packages/omo-codex/plugin/components/rules/dist/rules/engine-paths.js +75 -0
  197. package/packages/omo-codex/plugin/components/rules/dist/rules/engine-static-loader.d.ts +6 -0
  198. package/packages/omo-codex/plugin/components/rules/dist/rules/engine-static-loader.js +29 -0
  199. package/packages/omo-codex/plugin/components/rules/dist/rules/engine-types.d.ts +44 -0
  200. package/packages/omo-codex/plugin/components/rules/dist/rules/engine-types.js +1 -0
  201. package/packages/omo-codex/plugin/components/rules/dist/rules/engine.d.ts +5 -0
  202. package/packages/omo-codex/plugin/components/rules/dist/rules/engine.js +85 -0
  203. package/packages/omo-codex/plugin/components/rules/dist/rules/errors.d.ts +6 -0
  204. package/packages/omo-codex/plugin/components/rules/dist/rules/errors.js +12 -0
  205. package/packages/omo-codex/plugin/components/rules/dist/rules/finder-cache.d.ts +14 -0
  206. package/packages/omo-codex/plugin/components/rules/dist/rules/finder-cache.js +51 -0
  207. package/packages/omo-codex/plugin/components/rules/dist/rules/finder-paths.d.ts +6 -0
  208. package/packages/omo-codex/plugin/components/rules/dist/rules/finder-paths.js +33 -0
  209. package/packages/omo-codex/plugin/components/rules/dist/rules/finder-sources.d.ts +5 -0
  210. package/packages/omo-codex/plugin/components/rules/dist/rules/finder-sources.js +40 -0
  211. package/packages/omo-codex/plugin/components/rules/dist/rules/finder.d.ts +28 -0
  212. package/packages/omo-codex/plugin/components/rules/dist/rules/finder.js +146 -0
  213. package/packages/omo-codex/plugin/components/rules/dist/rules/formatter.d.ts +7 -0
  214. package/packages/omo-codex/plugin/components/rules/dist/rules/formatter.js +112 -0
  215. package/packages/omo-codex/plugin/components/rules/dist/rules/matcher.d.ts +18 -0
  216. package/packages/omo-codex/plugin/components/rules/dist/rules/matcher.js +93 -0
  217. package/packages/omo-codex/plugin/components/rules/dist/rules/ordering.d.ts +3 -0
  218. package/packages/omo-codex/plugin/components/rules/dist/rules/ordering.js +27 -0
  219. package/packages/omo-codex/plugin/components/rules/dist/rules/parser-frontmatter.d.ts +7 -0
  220. package/packages/omo-codex/plugin/components/rules/dist/rules/parser-frontmatter.js +30 -0
  221. package/packages/omo-codex/plugin/components/rules/dist/rules/parser-yaml.d.ts +2 -0
  222. package/packages/omo-codex/plugin/components/rules/dist/rules/parser-yaml.js +237 -0
  223. package/packages/omo-codex/plugin/components/rules/dist/rules/parser.d.ts +3 -0
  224. package/packages/omo-codex/plugin/components/rules/dist/rules/parser.js +31 -0
  225. package/packages/omo-codex/plugin/components/rules/dist/rules/plugin-root.d.ts +1 -0
  226. package/packages/omo-codex/plugin/components/rules/dist/rules/plugin-root.js +48 -0
  227. package/packages/omo-codex/plugin/components/rules/dist/rules/project-root.d.ts +1 -0
  228. package/packages/omo-codex/plugin/components/rules/dist/rules/project-root.js +23 -0
  229. package/packages/omo-codex/plugin/components/rules/dist/rules/scanner.d.ts +14 -0
  230. package/packages/omo-codex/plugin/components/rules/dist/rules/scanner.js +111 -0
  231. package/packages/omo-codex/plugin/components/rules/dist/rules/sources.d.ts +3 -0
  232. package/packages/omo-codex/plugin/components/rules/dist/rules/sources.js +9 -0
  233. package/packages/omo-codex/plugin/components/rules/dist/rules/truncator.d.ts +18 -0
  234. package/packages/omo-codex/plugin/components/rules/dist/rules/truncator.js +59 -0
  235. package/packages/omo-codex/plugin/components/rules/dist/rules/types.d.ts +126 -0
  236. package/packages/omo-codex/plugin/components/rules/dist/rules/types.js +8 -0
  237. package/packages/omo-codex/plugin/components/rules/dist/rules-engine-factory.d.ts +6 -0
  238. package/packages/omo-codex/plugin/components/rules/dist/rules-engine-factory.js +20 -0
  239. package/packages/omo-codex/plugin/components/rules/dist/session-state-lock.d.ts +3 -0
  240. package/packages/omo-codex/plugin/components/rules/dist/session-state-lock.js +41 -0
  241. package/packages/omo-codex/plugin/components/rules/dist/sparkshell-awareness.d.ts +10 -0
  242. package/packages/omo-codex/plugin/components/rules/dist/sparkshell-awareness.js +90 -0
  243. package/packages/omo-codex/plugin/components/rules/dist/static-injection.d.ts +3 -0
  244. package/packages/omo-codex/plugin/components/rules/dist/static-injection.js +128 -0
  245. package/packages/omo-codex/plugin/components/rules/dist/tool-paths.d.ts +6 -0
  246. package/packages/omo-codex/plugin/components/rules/dist/tool-paths.js +168 -0
  247. package/packages/omo-codex/plugin/components/rules/dist/transcript-rule-filter.d.ts +4 -0
  248. package/packages/omo-codex/plugin/components/rules/dist/transcript-rule-filter.js +49 -0
  249. package/packages/omo-codex/plugin/components/rules/dist/transcript-search.d.ts +4 -0
  250. package/packages/omo-codex/plugin/components/rules/dist/transcript-search.js +91 -0
  251. package/packages/omo-codex/plugin/components/rules/hooks/hooks.json +4 -4
  252. package/packages/omo-codex/plugin/components/rules/package.json +1 -1
  253. package/packages/omo-codex/plugin/components/rules/src/codex-hook.ts +4 -2
  254. package/packages/omo-codex/plugin/components/rules/src/config.ts +13 -0
  255. package/packages/omo-codex/plugin/components/rules/src/event-budget.ts +17 -0
  256. package/packages/omo-codex/plugin/components/rules/src/persistent-cache.ts +4 -1
  257. package/packages/omo-codex/plugin/components/rules/src/post-compact-directive.ts +39 -0
  258. package/packages/omo-codex/plugin/components/rules/src/rules/constants.ts +16 -0
  259. package/packages/omo-codex/plugin/components/rules/src/rules/engine.ts +8 -0
  260. package/packages/omo-codex/plugin/components/rules/src/rules/types.ts +4 -0
  261. package/packages/omo-codex/plugin/components/rules/src/sparkshell-awareness.ts +53 -4
  262. package/packages/omo-codex/plugin/components/rules/src/static-injection.ts +127 -7
  263. package/packages/omo-codex/plugin/components/rules/src/transcript-rule-filter.ts +9 -1
  264. package/packages/omo-codex/plugin/components/rules/test/bundled-rules.test.ts +4 -2
  265. package/packages/omo-codex/plugin/components/rules/test/codex-hook-post-compact-budget.test.ts +7 -2
  266. package/packages/omo-codex/plugin/components/rules/test/codex-hook-post-compact-context.test.ts +9 -9
  267. package/packages/omo-codex/plugin/components/rules/test/codex-hook-post-compact-dedup.test.ts +10 -4
  268. package/packages/omo-codex/plugin/components/rules/test/codex-hook-post-compact-directive.test.ts +241 -0
  269. package/packages/omo-codex/plugin/components/rules/test/event-budget.test.ts +168 -0
  270. package/packages/omo-codex/plugin/components/rules/test/post-compact-budget.test.ts +4 -0
  271. package/packages/omo-codex/plugin/components/rules/test/sparkshell-awareness.test.ts +86 -3
  272. package/packages/omo-codex/plugin/components/start-work-continuation/directive.md +15 -15
  273. package/packages/omo-codex/plugin/components/start-work-continuation/dist/boulder-reader.d.ts +16 -0
  274. package/packages/omo-codex/plugin/components/start-work-continuation/dist/boulder-reader.js +146 -0
  275. package/packages/omo-codex/plugin/components/start-work-continuation/dist/cli.d.ts +2 -0
  276. package/packages/omo-codex/plugin/components/start-work-continuation/dist/cli.js +49 -0
  277. package/packages/omo-codex/plugin/components/start-work-continuation/dist/codex-hook.d.ts +2 -0
  278. package/packages/omo-codex/plugin/components/start-work-continuation/dist/codex-hook.js +80 -0
  279. package/packages/omo-codex/plugin/components/start-work-continuation/dist/directive.d.ts +1 -0
  280. package/packages/omo-codex/plugin/components/start-work-continuation/dist/directive.js +2 -0
  281. package/packages/omo-codex/plugin/components/start-work-continuation/dist/index.d.ts +5 -0
  282. package/packages/omo-codex/plugin/components/start-work-continuation/dist/index.js +3 -0
  283. package/packages/omo-codex/plugin/components/start-work-continuation/dist/types.d.ts +20 -0
  284. package/packages/omo-codex/plugin/components/start-work-continuation/dist/types.js +1 -0
  285. package/packages/omo-codex/plugin/components/start-work-continuation/hooks/hooks.json +2 -2
  286. package/packages/omo-codex/plugin/components/start-work-continuation/package.json +1 -1
  287. package/packages/omo-codex/plugin/components/start-work-continuation/test/codex-hook.test.ts +24 -2
  288. package/packages/omo-codex/plugin/components/telemetry/dist/atomic-write.d.ts +1 -0
  289. package/packages/omo-codex/plugin/components/telemetry/dist/atomic-write.js +18 -0
  290. package/packages/omo-codex/plugin/components/telemetry/dist/cli.d.ts +2 -0
  291. package/packages/omo-codex/plugin/components/telemetry/dist/cli.js +62 -0
  292. package/packages/omo-codex/plugin/components/telemetry/dist/codex-hook.d.ts +15 -0
  293. package/packages/omo-codex/plugin/components/telemetry/dist/codex-hook.js +42 -0
  294. package/packages/omo-codex/plugin/components/telemetry/dist/data-path.d.ts +10 -0
  295. package/packages/omo-codex/plugin/components/telemetry/dist/data-path.js +35 -0
  296. package/packages/omo-codex/plugin/components/telemetry/dist/diagnostics.d.ts +12 -0
  297. package/packages/omo-codex/plugin/components/telemetry/dist/diagnostics.js +108 -0
  298. package/packages/omo-codex/plugin/components/telemetry/dist/env-flags.d.ts +4 -0
  299. package/packages/omo-codex/plugin/components/telemetry/dist/env-flags.js +31 -0
  300. package/packages/omo-codex/plugin/components/telemetry/dist/posthog-activity-state.d.ts +8 -0
  301. package/packages/omo-codex/plugin/components/telemetry/dist/posthog-activity-state.js +68 -0
  302. package/packages/omo-codex/plugin/components/telemetry/dist/posthog.d.ts +21 -0
  303. package/packages/omo-codex/plugin/components/telemetry/dist/posthog.js +133 -0
  304. package/packages/omo-codex/plugin/components/telemetry/dist/product-identity.d.ts +8 -0
  305. package/packages/omo-codex/plugin/components/telemetry/dist/product-identity.js +29 -0
  306. package/packages/omo-codex/plugin/components/telemetry/hooks/hooks.json +1 -1
  307. package/packages/omo-codex/plugin/components/telemetry/package.json +1 -1
  308. package/packages/omo-codex/plugin/components/ultrawork/agents/explorer.toml +5 -13
  309. package/packages/omo-codex/plugin/components/ultrawork/agents/librarian.toml +61 -185
  310. package/packages/omo-codex/plugin/components/ultrawork/agents/plan.toml +1 -1
  311. package/packages/omo-codex/plugin/components/ultrawork/directive.md +122 -117
  312. package/packages/omo-codex/plugin/components/ultrawork/dist/cli.d.ts +2 -0
  313. package/packages/omo-codex/plugin/components/ultrawork/dist/cli.js +48 -0
  314. package/packages/omo-codex/plugin/components/ultrawork/dist/codex-hook.d.ts +7 -0
  315. package/packages/omo-codex/plugin/components/ultrawork/dist/codex-hook.js +122 -0
  316. package/packages/omo-codex/plugin/components/ultrawork/dist/directive.d.ts +1 -0
  317. package/packages/omo-codex/plugin/components/ultrawork/dist/directive.js +2 -0
  318. package/packages/omo-codex/plugin/components/ultrawork/hooks/hooks.json +1 -1
  319. package/packages/omo-codex/plugin/components/ultrawork/package.json +1 -1
  320. package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/SKILL.md +20 -11
  321. package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/references/full-workflow.md +17 -11
  322. package/packages/omo-codex/plugin/components/ultrawork/test/codex-hook.test.ts +2 -5
  323. package/packages/omo-codex/plugin/components/ultrawork/test/package-smoke.test.ts +0 -71
  324. package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint.d.ts +16 -0
  325. package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint.js +200 -0
  326. package/packages/omo-codex/plugin/components/ulw-loop/dist/cli-arg-parser.d.ts +17 -0
  327. package/packages/omo-codex/plugin/components/ulw-loop/dist/cli-arg-parser.js +97 -0
  328. package/packages/omo-codex/plugin/components/ulw-loop/dist/cli-commands.d.ts +4 -0
  329. package/packages/omo-codex/plugin/components/ulw-loop/dist/cli-commands.js +183 -0
  330. package/packages/omo-codex/plugin/components/ulw-loop/dist/cli-output.d.ts +6 -0
  331. package/packages/omo-codex/plugin/components/ulw-loop/dist/cli-output.js +55 -0
  332. package/packages/omo-codex/plugin/components/ulw-loop/dist/cli-steering.d.ts +12 -0
  333. package/packages/omo-codex/plugin/components/ulw-loop/dist/cli-steering.js +145 -0
  334. package/packages/omo-codex/plugin/components/ulw-loop/dist/cli.d.ts +2 -0
  335. package/packages/omo-codex/plugin/components/ulw-loop/dist/cli.js +39 -0
  336. package/packages/omo-codex/plugin/components/ulw-loop/dist/codex-goal-instruction.d.ts +13 -0
  337. package/packages/omo-codex/plugin/components/ulw-loop/dist/codex-goal-instruction.js +100 -0
  338. package/packages/omo-codex/plugin/components/ulw-loop/dist/codex-goal-snapshot.d.ts +26 -0
  339. package/packages/omo-codex/plugin/components/ulw-loop/dist/codex-goal-snapshot.js +97 -0
  340. package/packages/omo-codex/plugin/components/ulw-loop/dist/codex-hook.d.ts +28 -0
  341. package/packages/omo-codex/plugin/components/ulw-loop/dist/codex-hook.js +145 -0
  342. package/packages/omo-codex/plugin/components/ulw-loop/dist/command-types.d.ts +34 -0
  343. package/packages/omo-codex/plugin/components/ulw-loop/dist/command-types.js +1 -0
  344. package/packages/omo-codex/plugin/components/ulw-loop/dist/constants.d.ts +16 -0
  345. package/packages/omo-codex/plugin/components/ulw-loop/dist/constants.js +41 -0
  346. package/packages/omo-codex/plugin/components/ulw-loop/dist/domain-types.d.ts +95 -0
  347. package/packages/omo-codex/plugin/components/ulw-loop/dist/domain-types.js +1 -0
  348. package/packages/omo-codex/plugin/components/ulw-loop/dist/evidence.d.ts +31 -0
  349. package/packages/omo-codex/plugin/components/ulw-loop/dist/evidence.js +119 -0
  350. package/packages/omo-codex/plugin/components/ulw-loop/dist/goal-status.d.ts +12 -0
  351. package/packages/omo-codex/plugin/components/ulw-loop/dist/goal-status.js +69 -0
  352. package/packages/omo-codex/plugin/components/ulw-loop/dist/paths.d.ts +16 -0
  353. package/packages/omo-codex/plugin/components/ulw-loop/dist/paths.js +59 -0
  354. package/packages/omo-codex/plugin/components/ulw-loop/dist/plan-crud.d.ts +48 -0
  355. package/packages/omo-codex/plugin/components/ulw-loop/dist/plan-crud.js +119 -0
  356. package/packages/omo-codex/plugin/components/ulw-loop/dist/plan-io.d.ts +8 -0
  357. package/packages/omo-codex/plugin/components/ulw-loop/dist/plan-io.js +89 -0
  358. package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate.d.ts +6 -0
  359. package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate.js +123 -0
  360. package/packages/omo-codex/plugin/components/ulw-loop/dist/review-blockers.d.ts +16 -0
  361. package/packages/omo-codex/plugin/components/ulw-loop/dist/review-blockers.js +70 -0
  362. package/packages/omo-codex/plugin/components/ulw-loop/dist/runtime.d.ts +10 -0
  363. package/packages/omo-codex/plugin/components/ulw-loop/dist/runtime.js +13 -0
  364. package/packages/omo-codex/plugin/components/ulw-loop/dist/steering-types.d.ts +63 -0
  365. package/packages/omo-codex/plugin/components/ulw-loop/dist/steering-types.js +1 -0
  366. package/packages/omo-codex/plugin/components/ulw-loop/dist/steering.d.ts +6 -0
  367. package/packages/omo-codex/plugin/components/ulw-loop/dist/steering.js +292 -0
  368. package/packages/omo-codex/plugin/components/ulw-loop/dist/types.d.ts +5 -0
  369. package/packages/omo-codex/plugin/components/ulw-loop/dist/types.js +5 -0
  370. package/packages/omo-codex/plugin/components/ulw-loop/hooks/hooks.json +2 -2
  371. package/packages/omo-codex/plugin/components/ulw-loop/package.json +1 -1
  372. package/packages/omo-codex/plugin/components/ulw-loop/skills/ulw-loop/SKILL.md +14 -14
  373. package/packages/omo-codex/plugin/components/ulw-loop/skills/ulw-loop/references/full-workflow.md +24 -25
  374. package/packages/omo-codex/plugin/components/ulw-loop/src/cli-commands.ts +17 -3
  375. package/packages/omo-codex/plugin/components/ulw-loop/src/cli.ts +2 -1
  376. package/packages/omo-codex/plugin/components/ulw-loop/src/codex-goal-instruction.ts +1 -1
  377. package/packages/omo-codex/plugin/components/ulw-loop/test/cli-entrypoint.test.ts +95 -0
  378. package/packages/omo-codex/plugin/components/ulw-loop/test/package-smoke.test.ts +0 -96
  379. package/packages/omo-codex/plugin/components/ulw-loop/test/quality-gate.test.ts +23 -0
  380. package/packages/omo-codex/plugin/components/ulw-loop/test/skill-contract.test.ts +46 -0
  381. package/packages/omo-codex/plugin/hooks/hooks.json +16 -16
  382. package/packages/omo-codex/plugin/package-lock.json +10 -9
  383. package/packages/omo-codex/plugin/package.json +27 -26
  384. package/packages/omo-codex/plugin/scripts/auto-update.mjs +64 -15
  385. package/packages/omo-codex/plugin/scripts/build-bundled-mcp-runtimes.mjs +16 -0
  386. package/packages/omo-codex/plugin/scripts/migrate-codex-config/multi-agent-v2-guard.mjs +82 -18
  387. package/packages/omo-codex/plugin/scripts/migrate-codex-config.mjs +2 -2
  388. package/packages/omo-codex/plugin/scripts/sync-skills.mjs +23 -11
  389. package/packages/omo-codex/plugin/scripts/sync-version.mjs +94 -0
  390. package/packages/omo-codex/plugin/skills/init-deep/SKILL.md +9 -9
  391. package/packages/omo-codex/plugin/skills/lcx-contribute-bug-fix/SKILL.md +16 -1
  392. package/packages/omo-codex/plugin/skills/lcx-doctor/SKILL.md +93 -0
  393. package/packages/omo-codex/plugin/skills/lcx-doctor/agents/openai.yaml +11 -0
  394. package/packages/omo-codex/plugin/skills/lcx-report-bug/SKILL.md +17 -13
  395. package/packages/omo-codex/plugin/skills/lsp-setup/SKILL.md +139 -0
  396. package/packages/omo-codex/plugin/skills/lsp-setup/references/bash/README.md +60 -0
  397. package/packages/omo-codex/plugin/skills/lsp-setup/references/c-cpp/README.md +61 -0
  398. package/packages/omo-codex/plugin/skills/lsp-setup/references/csharp/README.md +71 -0
  399. package/packages/omo-codex/plugin/skills/lsp-setup/references/dart/README.md +48 -0
  400. package/packages/omo-codex/plugin/skills/lsp-setup/references/elixir/README.md +51 -0
  401. package/packages/omo-codex/plugin/skills/lsp-setup/references/go/README.md +57 -0
  402. package/packages/omo-codex/plugin/skills/lsp-setup/references/haskell/README.md +57 -0
  403. package/packages/omo-codex/plugin/skills/lsp-setup/references/java/README.md +57 -0
  404. package/packages/omo-codex/plugin/skills/lsp-setup/references/julia/README.md +60 -0
  405. package/packages/omo-codex/plugin/skills/lsp-setup/references/kotlin/README.md +59 -0
  406. package/packages/omo-codex/plugin/skills/lsp-setup/references/lua/README.md +66 -0
  407. package/packages/omo-codex/plugin/skills/lsp-setup/references/php/README.md +62 -0
  408. package/packages/omo-codex/plugin/skills/lsp-setup/references/python/README.md +71 -0
  409. package/packages/omo-codex/plugin/skills/lsp-setup/references/ruby/README.md +53 -0
  410. package/packages/omo-codex/plugin/skills/lsp-setup/references/rust/README.md +59 -0
  411. package/packages/omo-codex/plugin/skills/lsp-setup/references/swift/README.md +51 -0
  412. package/packages/omo-codex/plugin/skills/lsp-setup/references/terraform/README.md +62 -0
  413. package/packages/omo-codex/plugin/skills/lsp-setup/references/typescript/README.md +77 -0
  414. package/packages/omo-codex/plugin/skills/lsp-setup/references/yaml/README.md +70 -0
  415. package/packages/omo-codex/plugin/skills/lsp-setup/references/zig/README.md +49 -0
  416. package/packages/omo-codex/plugin/skills/lsp-setup/scripts/detect-lsp.ts +210 -0
  417. package/packages/omo-codex/plugin/skills/lsp-setup/scripts/lsp-server-table.ts +177 -0
  418. package/packages/omo-codex/plugin/skills/lsp-setup/scripts/tsconfig.json +17 -0
  419. package/packages/omo-codex/plugin/skills/lsp-setup/scripts/verify-lsp.ts +147 -0
  420. package/packages/omo-codex/plugin/skills/refactor/SKILL.md +9 -9
  421. package/packages/omo-codex/plugin/skills/remove-ai-slops/SKILL.md +10 -10
  422. package/packages/omo-codex/plugin/skills/review-work/SKILL.md +20 -22
  423. package/packages/omo-codex/plugin/skills/start-work/SKILL.md +38 -61
  424. package/packages/omo-codex/plugin/skills/ultraresearch/SKILL.md +135 -677
  425. package/packages/omo-codex/plugin/skills/ulw-loop/SKILL.md +14 -14
  426. package/packages/omo-codex/plugin/skills/ulw-loop/references/full-workflow.md +24 -25
  427. package/packages/omo-codex/plugin/skills/ulw-plan/SKILL.md +20 -11
  428. package/packages/omo-codex/plugin/skills/ulw-plan/references/full-workflow.md +17 -11
  429. package/packages/omo-codex/plugin/skills/visual-qa/SKILL.md +9 -9
  430. package/packages/omo-codex/plugin/test/aggregate-build.test.mjs +2 -1
  431. package/packages/omo-codex/plugin/test/aggregate-mcp.test.mjs +1 -1
  432. package/packages/omo-codex/plugin/test/aggregate-plugin-fixture.mjs +5 -5
  433. package/packages/omo-codex/plugin/test/aggregate-skills.test.mjs +6 -6
  434. package/packages/omo-codex/plugin/test/auto-update-restart-notice.test.mjs +194 -0
  435. package/packages/omo-codex/plugin/test/auto-update.test.mjs +17 -0
  436. package/packages/omo-codex/plugin/test/lcx-bug-skills.test.mjs +15 -44
  437. package/packages/omo-codex/plugin/test/lsp-prebuild-layouts.test.mjs +140 -0
  438. package/packages/omo-codex/plugin/test/migrate-codex-config.test.mjs +189 -7
  439. package/packages/omo-codex/plugin/test/start-work-skill.test.mjs +9 -31
  440. package/packages/omo-codex/plugin/test/sync-skills-orchestration.test.mjs +68 -4
  441. package/packages/omo-codex/plugin/test/sync-skills-test-support.mjs +119 -0
  442. package/packages/omo-codex/plugin/test/sync-skills.test.mjs +11 -112
  443. package/packages/omo-codex/plugin/test/sync-version.test.mjs +68 -0
  444. package/packages/omo-codex/plugin/test/ultraresearch-skill-contract.test.mjs +126 -0
  445. package/packages/omo-codex/plugin/test/ulw-plan-skill.test.mjs +2 -2
  446. package/packages/omo-codex/scripts/install/bin-dir.mjs +20 -0
  447. package/packages/omo-codex/scripts/install/bin-links.mjs +43 -6
  448. package/packages/omo-codex/scripts/install/cache.mjs +4 -0
  449. package/packages/omo-codex/scripts/install/config.mjs +4 -4
  450. package/packages/omo-codex/scripts/install/delegated-command.mjs +5 -1
  451. package/packages/omo-codex/scripts/install/git-bash-mcp-env.mjs +28 -0
  452. package/packages/omo-codex/scripts/install/git-bash.mjs +12 -4
  453. package/packages/omo-codex/scripts/install/git-bash.test.mjs +39 -4
  454. package/packages/omo-codex/scripts/install/hook-targets.mjs +46 -0
  455. package/packages/omo-codex/scripts/install/multi-agent-v2-config.mjs +12 -2
  456. package/packages/omo-codex/scripts/install/process.mjs +1 -0
  457. package/packages/omo-codex/scripts/install-bin-links.test.mjs +131 -3
  458. package/packages/omo-codex/scripts/install-config-git-bash.test.mjs +91 -0
  459. package/packages/omo-codex/scripts/install-config.test.mjs +50 -44
  460. package/packages/omo-codex/scripts/install-delegated-command.test.mjs +78 -0
  461. package/packages/omo-codex/scripts/install-git-bash-mcp-env.test.mjs +93 -0
  462. package/packages/omo-codex/scripts/install-hook-targets.test.mjs +100 -0
  463. package/packages/omo-codex/scripts/install-lazycodex-version-stamp.test.mjs +3 -1
  464. package/packages/omo-codex/scripts/install-local.mjs +7 -18
  465. package/packages/omo-codex/scripts/install-local.test.mjs +34 -1
  466. package/packages/shared-skills/skills/lcx-contribute-bug-fix/SKILL.md +16 -1
  467. package/packages/shared-skills/skills/lcx-doctor/SKILL.md +93 -0
  468. package/packages/shared-skills/skills/lcx-doctor/agents/openai.yaml +11 -0
  469. package/packages/shared-skills/skills/lcx-report-bug/SKILL.md +17 -13
  470. package/packages/shared-skills/skills/lsp-setup/SKILL.md +139 -0
  471. package/packages/shared-skills/skills/lsp-setup/references/bash/README.md +60 -0
  472. package/packages/shared-skills/skills/lsp-setup/references/c-cpp/README.md +61 -0
  473. package/packages/shared-skills/skills/lsp-setup/references/csharp/README.md +71 -0
  474. package/packages/shared-skills/skills/lsp-setup/references/dart/README.md +48 -0
  475. package/packages/shared-skills/skills/lsp-setup/references/elixir/README.md +51 -0
  476. package/packages/shared-skills/skills/lsp-setup/references/go/README.md +57 -0
  477. package/packages/shared-skills/skills/lsp-setup/references/haskell/README.md +57 -0
  478. package/packages/shared-skills/skills/lsp-setup/references/java/README.md +57 -0
  479. package/packages/shared-skills/skills/lsp-setup/references/julia/README.md +60 -0
  480. package/packages/shared-skills/skills/lsp-setup/references/kotlin/README.md +59 -0
  481. package/packages/shared-skills/skills/lsp-setup/references/lua/README.md +66 -0
  482. package/packages/shared-skills/skills/lsp-setup/references/php/README.md +62 -0
  483. package/packages/shared-skills/skills/lsp-setup/references/python/README.md +71 -0
  484. package/packages/shared-skills/skills/lsp-setup/references/ruby/README.md +53 -0
  485. package/packages/shared-skills/skills/lsp-setup/references/rust/README.md +59 -0
  486. package/packages/shared-skills/skills/lsp-setup/references/swift/README.md +51 -0
  487. package/packages/shared-skills/skills/lsp-setup/references/terraform/README.md +62 -0
  488. package/packages/shared-skills/skills/lsp-setup/references/typescript/README.md +77 -0
  489. package/packages/shared-skills/skills/lsp-setup/references/yaml/README.md +70 -0
  490. package/packages/shared-skills/skills/lsp-setup/references/zig/README.md +49 -0
  491. package/packages/shared-skills/skills/lsp-setup/scripts/detect-lsp.ts +210 -0
  492. package/packages/shared-skills/skills/lsp-setup/scripts/lsp-server-table.ts +177 -0
  493. package/packages/shared-skills/skills/lsp-setup/scripts/tsconfig.json +17 -0
  494. package/packages/shared-skills/skills/lsp-setup/scripts/verify-lsp.ts +147 -0
  495. package/packages/shared-skills/skills/remove-ai-slops/SKILL.md +1 -1
  496. package/packages/shared-skills/skills/review-work/SKILL.md +10 -14
  497. package/packages/shared-skills/skills/start-work/SKILL.md +30 -59
  498. package/packages/shared-skills/skills/ultraresearch/SKILL.md +126 -667
  499. package/dist/hooks/anthropic-effort/hook.d.ts +0 -26
  500. package/dist/hooks/anthropic-effort/index.d.ts +0 -1
  501. package/dist/hooks/keyword-detector/analyze/default.d.ts +0 -12
  502. package/dist/hooks/keyword-detector/analyze/index.d.ts +0 -1
  503. package/dist/hooks/keyword-detector/search/default.d.ts +0 -12
  504. package/dist/hooks/keyword-detector/search/index.d.ts +0 -1
  505. package/dist/hooks/thinking-block-validator/hook.d.ts +0 -12
  506. package/dist/hooks/thinking-block-validator/index.d.ts +0 -1
  507. package/packages/omo-codex/plugin/components/ultrawork/test/directive-contract.test.ts +0 -18
  508. package/packages/omo-codex/plugin/test/global-review-debug-gate.test.mjs +0 -29
  509. package/packages/omo-codex/plugin/test/subagent-guidance.test.mjs +0 -151
@@ -0,0 +1,137 @@
1
+ import { existsSync, mkdirSync, rmSync, writeFileSync } from "node:fs";
2
+ import { homedir } from "node:os";
3
+ import { dirname, join } from "node:path";
4
+ const BASH_TOOL_NAME = "Bash";
5
+ const REMINDER = "On Windows, prefer the OMO git_bash MCP for shell commands before using built-in exec_command. Use exec_command only when git_bash is unavailable or for non-shell operations.";
6
+ export function parsePreToolUsePayload(raw) {
7
+ if (raw.trim().length === 0)
8
+ return null;
9
+ try {
10
+ const parsed = JSON.parse(raw);
11
+ return isPreToolUsePayload(parsed) ? parsed : null;
12
+ }
13
+ catch (error) {
14
+ if (error instanceof SyntaxError)
15
+ return null;
16
+ return null;
17
+ }
18
+ }
19
+ export function parsePostCompactPayload(raw) {
20
+ if (raw.trim().length === 0)
21
+ return null;
22
+ try {
23
+ const parsed = JSON.parse(raw);
24
+ return isPostCompactPayload(parsed) ? parsed : null;
25
+ }
26
+ catch (error) {
27
+ if (error instanceof SyntaxError)
28
+ return null;
29
+ return null;
30
+ }
31
+ }
32
+ export function applyGitBashPreToolUseReminder(payload, options = {}) {
33
+ if (payload.hook_event_name !== "PreToolUse")
34
+ return "";
35
+ if (payload.tool_name !== BASH_TOOL_NAME)
36
+ return "";
37
+ if (!isWindowsHost(options))
38
+ return "";
39
+ const markerPath = reminderMarkerPath(payload.session_id, options.pluginDataRoot);
40
+ if (hasReminderMarker(markerPath))
41
+ return "";
42
+ mkdirSync(dirname(markerPath), { recursive: true });
43
+ writeFileSync(markerPath, `${new Date().toISOString()}\n`);
44
+ const output = {
45
+ hookSpecificOutput: {
46
+ hookEventName: "PreToolUse",
47
+ additionalContext: REMINDER,
48
+ },
49
+ };
50
+ return `${JSON.stringify(output)}\n`;
51
+ }
52
+ export function applyGitBashPostCompactReset(payload, options = {}) {
53
+ if (payload.hook_event_name !== "PostCompact")
54
+ return "";
55
+ rmSync(reminderMarkerPath(payload.session_id, options.pluginDataRoot), { force: true });
56
+ return "";
57
+ }
58
+ export async function runGitBashHookCli(stdin, stdout, eventName = "pre-tool-use", options = {}) {
59
+ try {
60
+ const raw = await readAll(stdin);
61
+ const output = eventName === "post-compact" ? postCompactOutput(raw, options) : preToolUseOutput(raw, options);
62
+ if (output.length > 0)
63
+ stdout.write(output);
64
+ }
65
+ catch (error) {
66
+ if (error instanceof Error)
67
+ return;
68
+ return;
69
+ }
70
+ }
71
+ function preToolUseOutput(raw, options) {
72
+ const payload = parsePreToolUsePayload(raw);
73
+ if (payload === null)
74
+ return "";
75
+ return applyGitBashPreToolUseReminder(payload, options);
76
+ }
77
+ function postCompactOutput(raw, options) {
78
+ const payload = parsePostCompactPayload(raw);
79
+ if (payload === null)
80
+ return "";
81
+ return applyGitBashPostCompactReset(payload, options);
82
+ }
83
+ function isWindowsHost(options) {
84
+ const platform = options.platform ?? process.platform;
85
+ if (platform === "win32")
86
+ return true;
87
+ const env = options.env ?? process.env;
88
+ return env["OS"] === "Windows_NT" || env["ComSpec"] !== undefined || env["SystemRoot"] !== undefined;
89
+ }
90
+ function hasReminderMarker(path) {
91
+ return existsSync(path);
92
+ }
93
+ function reminderMarkerPath(sessionId, pluginDataRoot) {
94
+ const root = pluginDataRoot ?? process.env["PLUGIN_DATA"] ?? join(homedir(), ".codex", "omo-git-bash");
95
+ return join(root, "git-bash-reminder", `${safePathSegment(sessionId)}.seen`);
96
+ }
97
+ function safePathSegment(value) {
98
+ return value.replace(/[^A-Za-z0-9._-]/g, "_");
99
+ }
100
+ function isPreToolUsePayload(value) {
101
+ if (!isRecord(value))
102
+ return false;
103
+ return (value["hook_event_name"] === "PreToolUse" &&
104
+ typeof value["cwd"] === "string" &&
105
+ typeof value["model"] === "string" &&
106
+ typeof value["permission_mode"] === "string" &&
107
+ typeof value["session_id"] === "string" &&
108
+ typeof value["tool_name"] === "string" &&
109
+ typeof value["tool_use_id"] === "string" &&
110
+ (value["transcript_path"] === null || typeof value["transcript_path"] === "string") &&
111
+ typeof value["turn_id"] === "string" &&
112
+ Object.hasOwn(value, "tool_input"));
113
+ }
114
+ function isPostCompactPayload(value) {
115
+ if (!isRecord(value))
116
+ return false;
117
+ return (value["hook_event_name"] === "PostCompact" &&
118
+ typeof value["session_id"] === "string" &&
119
+ (value["transcript_path"] === undefined ||
120
+ value["transcript_path"] === null ||
121
+ typeof value["transcript_path"] === "string") &&
122
+ (value["trigger"] === undefined || typeof value["trigger"] === "string"));
123
+ }
124
+ function isRecord(value) {
125
+ return typeof value === "object" && value !== null && !Array.isArray(value);
126
+ }
127
+ function readAll(stdin) {
128
+ return new Promise((resolve, reject) => {
129
+ let data = "";
130
+ stdin.setEncoding("utf8");
131
+ stdin.on("data", (chunk) => {
132
+ data += chunk instanceof Buffer ? chunk.toString() : String(chunk);
133
+ });
134
+ stdin.once("error", reject);
135
+ stdin.once("end", () => resolve(data));
136
+ });
137
+ }
@@ -0,0 +1 @@
1
+ export { applyGitBashPostCompactReset, applyGitBashPreToolUseReminder, parsePostCompactPayload, parsePreToolUsePayload, runGitBashHookCli, type GitBashHookOptions, type PostCompactPayload, type PreToolUsePayload, } from "./codex-hook.js";
@@ -0,0 +1 @@
1
+ export { applyGitBashPostCompactReset, applyGitBashPreToolUseReminder, parsePostCompactPayload, parsePreToolUsePayload, runGitBashHookCli, } from "./codex-hook.js";
@@ -8,7 +8,7 @@
8
8
  "type": "command",
9
9
  "command": "node \"${PLUGIN_ROOT}/dist/cli.js\" hook pre-tool-use",
10
10
  "timeout": 5,
11
- "statusMessage": "LazyCodex(0.1.0): Recommending Git Bash Mcp"
11
+ "statusMessage": "LazyCodex(4.9.1): Recommending Git Bash Mcp"
12
12
  }
13
13
  ]
14
14
  }
@@ -20,7 +20,7 @@
20
20
  "type": "command",
21
21
  "command": "node \"${PLUGIN_ROOT}/dist/cli.js\" hook post-compact",
22
22
  "timeout": 5,
23
- "statusMessage": "LazyCodex(0.1.0): Resetting Git Bash Mcp Reminder"
23
+ "statusMessage": "LazyCodex(4.9.1): Resetting Git Bash Mcp Reminder"
24
24
  }
25
25
  ]
26
26
  }
@@ -1,13 +1,16 @@
1
1
  {
2
2
  "name": "@sisyphuslabs/codex-git-bash-hook",
3
- "version": "0.1.0",
3
+ "version": "4.9.1",
4
4
  "description": "Codex hook component that reminds Windows sessions to prefer the OMO git_bash MCP.",
5
5
  "type": "module",
6
6
  "private": true,
7
7
  "bin": {
8
8
  "omo-git-bash-hook": "./dist/cli.js"
9
9
  },
10
- "files": ["dist", "hooks"],
10
+ "files": [
11
+ "dist",
12
+ "hooks"
13
+ ],
11
14
  "scripts": {
12
15
  "build": "tsc -p tsconfig.build.json",
13
16
  "test": "bun test test/*.test.ts",
@@ -2,7 +2,7 @@
2
2
  "mcpServers": {
3
3
  "lsp": {
4
4
  "command": "node",
5
- "args": ["../../../../lsp-tools-mcp/dist/cli.js", "mcp"],
5
+ "args": ["../../../../lsp-daemon/dist/cli.js", "mcp"],
6
6
  "cwd": "."
7
7
  }
8
8
  }
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
@@ -0,0 +1,42 @@
1
+ #!/usr/bin/env node
2
+ import { spawn } from "node:child_process";
3
+ import { createRequire } from "node:module";
4
+ import { argv, execPath, stderr } from "node:process";
5
+ import { runPostCompactHookCli, runPostToolUseHookCli } from "./codex-hook-cli.js";
6
+ const require = createRequire(import.meta.url);
7
+ const PACKAGE_LSP_MCP_CLI = "@code-yeongyu/lsp-daemon/dist/cli.js";
8
+ async function main() {
9
+ const [command = "mcp", subcommand = ""] = argv.slice(2);
10
+ if (command === "hook" && subcommand === "post-tool-use") {
11
+ await runPostToolUseHookCli();
12
+ return;
13
+ }
14
+ if (command === "hook" && subcommand === "post-compact") {
15
+ await runPostCompactHookCli();
16
+ return;
17
+ }
18
+ if (command === "mcp") {
19
+ await runPackageLspMcpCli();
20
+ return;
21
+ }
22
+ stderr.write("Usage: omo-lsp [mcp | hook post-tool-use | hook post-compact]\n");
23
+ process.exitCode = 2;
24
+ }
25
+ main().catch((error) => {
26
+ stderr.write(`${error instanceof Error ? (error.stack ?? error.message) : String(error)}\n`);
27
+ process.exitCode = 1;
28
+ });
29
+ async function runPackageLspMcpCli() {
30
+ const cliPath = require.resolve(PACKAGE_LSP_MCP_CLI);
31
+ const child = spawn(execPath, [cliPath, "mcp"], { stdio: "inherit" });
32
+ await new Promise((resolve, reject) => {
33
+ child.once("error", reject);
34
+ child.once("exit", (code, signal) => {
35
+ if (code !== null && code !== 0)
36
+ process.exitCode = code;
37
+ if (code === null && signal !== null)
38
+ process.exitCode = 1;
39
+ resolve();
40
+ });
41
+ });
42
+ }
@@ -0,0 +1,2 @@
1
+ export declare function runPostToolUseHookCli(stdin?: NodeJS.ReadStream): Promise<void>;
2
+ export declare function runPostCompactHookCli(stdin?: NodeJS.ReadStream): Promise<void>;
@@ -0,0 +1,40 @@
1
+ import { stdin as processStdin } from "node:process";
2
+ import { disposeDefaultLspManager } from "@code-yeongyu/lsp-daemon";
3
+ import { isRecord, runLspPostCompactHook, runLspPostToolUseHook } from "./codex-hook.js";
4
+ export async function runPostToolUseHookCli(stdin = processStdin) {
5
+ await runHookCli((input) => runLspPostToolUseHook(input), stdin);
6
+ }
7
+ export async function runPostCompactHookCli(stdin = processStdin) {
8
+ await runHookCli((input) => runLspPostCompactHook(input), stdin);
9
+ }
10
+ async function runHookCli(runHook, stdin) {
11
+ try {
12
+ const raw = await readStdin(stdin);
13
+ if (!raw.trim())
14
+ return;
15
+ let parsed;
16
+ try {
17
+ parsed = JSON.parse(raw);
18
+ }
19
+ catch (error) {
20
+ if (error instanceof SyntaxError)
21
+ return;
22
+ throw error;
23
+ }
24
+ const input = isRecord(parsed) ? parsed : {};
25
+ const output = await runHook(input);
26
+ if (output)
27
+ process.stdout.write(output);
28
+ }
29
+ finally {
30
+ await disposeDefaultLspManager();
31
+ }
32
+ }
33
+ async function readStdin(stdin) {
34
+ stdin.setEncoding("utf8");
35
+ let raw = "";
36
+ for await (const chunk of stdin) {
37
+ raw += chunk;
38
+ }
39
+ return raw;
40
+ }
@@ -0,0 +1,16 @@
1
+ export { extractMutatedFilePaths } from "./mutated-file-paths.js";
2
+ export type DiagnosticsRunner = (filePath: string) => Promise<string>;
3
+ export interface CodexPostToolUseInput {
4
+ session_id?: unknown;
5
+ tool_name?: unknown;
6
+ tool_input?: unknown;
7
+ tool_response?: unknown;
8
+ transcript_path?: unknown;
9
+ }
10
+ export interface CodexPostCompactInput {
11
+ session_id?: unknown;
12
+ }
13
+ export declare function runLspDiagnosticsText(filePath: string): Promise<string>;
14
+ export declare function runLspPostToolUseHook(input: CodexPostToolUseInput, runDiagnostics?: DiagnosticsRunner): Promise<string>;
15
+ export declare function runLspPostCompactHook(input: CodexPostCompactInput): Promise<string>;
16
+ export declare function isRecord(value: unknown): value is Record<string, unknown>;
@@ -0,0 +1,180 @@
1
+ import { readFileSync } from "node:fs";
2
+ import { callDiagnosticsViaDaemon, currentRequestContext } from "@code-yeongyu/lsp-daemon";
3
+ import { isLspDaemonUnreachableDiagnostics, isUnavailableLspDiagnostics, markLspSessionCompacted, recordLspDiagnosticsObservations, sessionIdFrom, shouldSkipUnavailableLspDiagnostics, } from "./lsp-session-state.js";
4
+ import { extractMutatedFilePaths } from "./mutated-file-paths.js";
5
+ export { extractMutatedFilePaths } from "./mutated-file-paths.js";
6
+ const CLEAN_DIAGNOSTICS_TEXT = "No diagnostics found";
7
+ const UNSUPPORTED_EXTENSION_TEXT = "No LSP server configured for extension:";
8
+ const DIAGNOSTIC_START_PATTERN = /(?:error|warning|information|hint)\[[^\]\r\n]+\] \(\d+\) at \d+:\d+:/g;
9
+ const DIAGNOSTIC_CHUNK_PATTERN = /^(?:error|warning|information|hint)\[[^\]\r\n]+\] \(\d+\) at \d+:\d+:/;
10
+ const DEFAULT_MAX_HOOK_FEEDBACK_CHARS = 8000;
11
+ const CONTEXT_PRESSURE_MAX_HOOK_FEEDBACK_CHARS = 1200;
12
+ const MAX_CONCURRENT_DIAGNOSTICS = 4;
13
+ const CONTEXT_PRESSURE_MARKERS = [
14
+ "context compacted",
15
+ "context_length_exceeded",
16
+ "skill descriptions were shortened",
17
+ "context_too_large",
18
+ "codex ran out of room in the model's context window",
19
+ "your input exceeds the context window",
20
+ "long threads and multiple compactions",
21
+ ];
22
+ export async function runLspDiagnosticsText(filePath) {
23
+ const result = await callDiagnosticsViaDaemon(filePath, { context: currentRequestContext() });
24
+ return result.content.map((block) => block.text).join("\n");
25
+ }
26
+ export async function runLspPostToolUseHook(input, runDiagnostics = runLspDiagnosticsText) {
27
+ const sessionId = sessionIdFrom(input);
28
+ const filePaths = extractMutatedFilePaths(input).filter((filePath) => !shouldSkipUnavailableLspDiagnostics(filePath, sessionId));
29
+ if (filePaths.length === 0)
30
+ return "";
31
+ const blocks = [];
32
+ const observations = [];
33
+ for (const { filePath, diagnostics } of await collectDiagnostics(filePaths, runDiagnostics)) {
34
+ // A daemon outage is transient (connect-or-spawn retries on the next request);
35
+ // recording it would silence this extension for the rest of the session.
36
+ if (isLspDaemonUnreachableDiagnostics(diagnostics))
37
+ continue;
38
+ const unavailable = isUnavailableLspDiagnostics(diagnostics);
39
+ observations.push({ filePath, unavailable });
40
+ if (isCleanDiagnostics(diagnostics))
41
+ continue;
42
+ if (unavailable)
43
+ continue;
44
+ blocks.push({ filePath, diagnostics });
45
+ }
46
+ recordLspDiagnosticsObservations(sessionId, observations);
47
+ if (blocks.length === 0)
48
+ return "";
49
+ const rawReason = blocks.map(formatDiagnosticBlock).join("\n\n");
50
+ const reason = limitHookText(rawReason, hookFeedbackLimit(input.transcript_path));
51
+ const output = {
52
+ decision: "block",
53
+ reason,
54
+ hookSpecificOutput: {
55
+ hookEventName: "PostToolUse",
56
+ additionalContext: reason,
57
+ },
58
+ };
59
+ return `${JSON.stringify(output)}\n`;
60
+ }
61
+ export async function runLspPostCompactHook(input) {
62
+ markLspSessionCompacted(sessionIdFrom(input));
63
+ return "";
64
+ }
65
+ async function collectDiagnostics(filePaths, runDiagnostics) {
66
+ const results = [];
67
+ let nextIndex = 0;
68
+ const workerCount = Math.min(MAX_CONCURRENT_DIAGNOSTICS, filePaths.length);
69
+ async function worker() {
70
+ for (;;) {
71
+ const index = nextIndex;
72
+ nextIndex += 1;
73
+ const filePath = filePaths[index];
74
+ if (filePath === undefined)
75
+ return;
76
+ results[index] = { filePath, diagnostics: await collectFileDiagnostics(filePath, runDiagnostics) };
77
+ }
78
+ }
79
+ await Promise.all(Array.from({ length: workerCount }, () => worker()));
80
+ return results;
81
+ }
82
+ async function collectFileDiagnostics(filePath, runDiagnostics) {
83
+ try {
84
+ return (await runDiagnostics(filePath)).trim();
85
+ }
86
+ catch (error) {
87
+ return formatDiagnosticsError(error);
88
+ }
89
+ }
90
+ function formatDiagnosticsError(error) {
91
+ if (error instanceof Error) {
92
+ const message = error.message.trim();
93
+ if (message.length > 0)
94
+ return message;
95
+ }
96
+ return String(error).trim();
97
+ }
98
+ function formatDiagnosticBlock({ filePath, diagnostics }) {
99
+ return `LSP diagnostics after editing ${filePath}:\n\n${formatDiagnosticsForDisplay(diagnostics)}`;
100
+ }
101
+ function formatDiagnosticsForDisplay(diagnostics) {
102
+ const chunks = splitDiagnosticChunks(diagnostics);
103
+ if (!chunks.some(isDiagnosticChunk))
104
+ return chunks.join("\n").trim();
105
+ return chunks.map(formatDiagnosticChunk).join("\n");
106
+ }
107
+ function splitDiagnosticChunks(diagnostics) {
108
+ const normalized = diagnostics.replace(/\r\n/g, "\n").replace(/\r/g, "\n").trim();
109
+ if (normalized.length === 0)
110
+ return [];
111
+ const matches = Array.from(normalized.matchAll(DIAGNOSTIC_START_PATTERN));
112
+ const firstMatch = matches[0];
113
+ if (firstMatch?.index === undefined)
114
+ return [normalized];
115
+ const chunks = [];
116
+ const leadingText = normalized.slice(0, firstMatch.index).trim();
117
+ if (leadingText.length > 0)
118
+ chunks.push(leadingText);
119
+ for (const [index, match] of matches.entries()) {
120
+ if (match.index === undefined)
121
+ continue;
122
+ const nextMatch = matches[index + 1];
123
+ const end = nextMatch?.index ?? normalized.length;
124
+ const chunk = normalized.slice(match.index, end).trim();
125
+ if (chunk.length > 0)
126
+ chunks.push(chunk);
127
+ }
128
+ return chunks;
129
+ }
130
+ function formatDiagnosticChunk(chunk) {
131
+ const lines = chunk.split("\n");
132
+ const firstLine = lines[0];
133
+ if (firstLine === undefined)
134
+ return "";
135
+ if (!isDiagnosticChunk(firstLine))
136
+ return chunk;
137
+ const followingLines = lines.slice(1).map((line) => ` ${line}`);
138
+ return [`- ${firstLine}`, ...followingLines].join("\n");
139
+ }
140
+ function isDiagnosticChunk(chunk) {
141
+ return DIAGNOSTIC_CHUNK_PATTERN.test(chunk);
142
+ }
143
+ function hookFeedbackLimit(transcriptPath) {
144
+ return isContextPressureTranscript(transcriptPath)
145
+ ? CONTEXT_PRESSURE_MAX_HOOK_FEEDBACK_CHARS
146
+ : DEFAULT_MAX_HOOK_FEEDBACK_CHARS;
147
+ }
148
+ function isContextPressureTranscript(transcriptPath) {
149
+ if (typeof transcriptPath !== "string")
150
+ return false;
151
+ try {
152
+ return hasContextPressureMarker(readFileSync(transcriptPath, "utf8"));
153
+ }
154
+ catch (error) {
155
+ if (error instanceof Error)
156
+ return false;
157
+ throw error;
158
+ }
159
+ }
160
+ function hasContextPressureMarker(text) {
161
+ const normalizedText = text.toLowerCase();
162
+ return CONTEXT_PRESSURE_MARKERS.some((marker) => normalizedText.includes(marker));
163
+ }
164
+ function limitHookText(text, maxChars) {
165
+ if (text.length <= maxChars)
166
+ return text;
167
+ const marker = `\n\n[Truncated hook output to ${maxChars} chars to avoid Codex context overflow.]`;
168
+ if (marker.length >= maxChars)
169
+ return marker.slice(0, maxChars);
170
+ const head = text.slice(0, maxChars - marker.length).replace(/[ \t\r\n]+$/, "");
171
+ return `${head}${marker}`;
172
+ }
173
+ function isCleanDiagnostics(diagnostics) {
174
+ return (diagnostics.length === 0 ||
175
+ diagnostics === CLEAN_DIAGNOSTICS_TEXT ||
176
+ diagnostics.startsWith(UNSUPPORTED_EXTENSION_TEXT));
177
+ }
178
+ export function isRecord(value) {
179
+ return typeof value === "object" && value !== null && !Array.isArray(value);
180
+ }
@@ -0,0 +1,12 @@
1
+ export interface DiagnosticsObservation {
2
+ readonly filePath: string;
3
+ readonly unavailable: boolean;
4
+ }
5
+ export declare function sessionIdFrom(input: {
6
+ readonly session_id?: unknown;
7
+ }): string | undefined;
8
+ export declare function shouldSkipUnavailableLspDiagnostics(filePath: string, sessionId: string | undefined): boolean;
9
+ export declare function recordLspDiagnosticsObservations(sessionId: string | undefined, observations: readonly DiagnosticsObservation[]): void;
10
+ export declare function markLspSessionCompacted(sessionId: string | undefined): void;
11
+ export declare function isUnavailableLspDiagnostics(diagnostics: string): boolean;
12
+ export declare function isLspDaemonUnreachableDiagnostics(diagnostics: string): boolean;
@@ -0,0 +1,95 @@
1
+ import { mkdirSync, readFileSync, writeFileSync } from "node:fs";
2
+ import { homedir } from "node:os";
3
+ import { dirname, extname, join } from "node:path";
4
+ export function sessionIdFrom(input) {
5
+ return typeof input.session_id === "string" && input.session_id.length > 0 ? input.session_id : undefined;
6
+ }
7
+ export function shouldSkipUnavailableLspDiagnostics(filePath, sessionId) {
8
+ if (sessionId === undefined)
9
+ return false;
10
+ const state = readSessionState(sessionStatePath(sessionId));
11
+ const extension = extensionKey(filePath);
12
+ return (extension !== undefined &&
13
+ state.postCompactProbePending !== true &&
14
+ state.unavailableExtensions.includes(extension));
15
+ }
16
+ export function recordLspDiagnosticsObservations(sessionId, observations) {
17
+ if (sessionId === undefined || observations.length === 0)
18
+ return;
19
+ const state = readSessionState(sessionStatePath(sessionId));
20
+ const unavailableExtensions = new Set(state.unavailableExtensions);
21
+ for (const observation of observations) {
22
+ const extension = extensionKey(observation.filePath);
23
+ if (extension === undefined)
24
+ continue;
25
+ if (observation.unavailable) {
26
+ unavailableExtensions.add(extension);
27
+ }
28
+ else {
29
+ unavailableExtensions.delete(extension);
30
+ }
31
+ }
32
+ writeSessionState(sessionStatePath(sessionId), { unavailableExtensions: [...unavailableExtensions].sort() });
33
+ }
34
+ export function markLspSessionCompacted(sessionId) {
35
+ if (sessionId === undefined)
36
+ return;
37
+ const state = readSessionState(sessionStatePath(sessionId));
38
+ if (state.unavailableExtensions.length === 0)
39
+ return;
40
+ writeSessionState(sessionStatePath(sessionId), {
41
+ unavailableExtensions: state.unavailableExtensions,
42
+ postCompactProbePending: true,
43
+ });
44
+ }
45
+ export function isUnavailableLspDiagnostics(diagnostics) {
46
+ const normalized = diagnostics.trim();
47
+ return (normalized.includes("LSP request timeout (method: initialize)") ||
48
+ normalized.includes("LSP server is still initializing") ||
49
+ normalized.includes("NOT INSTALLED") ||
50
+ normalized.includes("Command not found:"));
51
+ }
52
+ export function isLspDaemonUnreachableDiagnostics(diagnostics) {
53
+ return diagnostics.includes("LSP daemon unreachable");
54
+ }
55
+ function sessionStatePath(sessionId) {
56
+ const root = process.env["PLUGIN_DATA"] ?? join(homedir(), ".codex", "codex-lsp");
57
+ return join(root, "sessions", `${safePathSegment(sessionId)}.json`);
58
+ }
59
+ function readSessionState(path) {
60
+ try {
61
+ const parsed = JSON.parse(readFileSync(path, "utf8"));
62
+ if (isLspSessionState(parsed))
63
+ return parsed;
64
+ return emptyState();
65
+ }
66
+ catch (error) {
67
+ if (error instanceof SyntaxError || (isRecord(error) && error["code"] === "ENOENT"))
68
+ return emptyState();
69
+ throw error;
70
+ }
71
+ }
72
+ function writeSessionState(path, state) {
73
+ mkdirSync(dirname(path), { recursive: true });
74
+ writeFileSync(path, `${JSON.stringify(state)}\n`);
75
+ }
76
+ function emptyState() {
77
+ return { unavailableExtensions: [] };
78
+ }
79
+ function extensionKey(filePath) {
80
+ const extension = extname(filePath).toLowerCase();
81
+ return extension.length === 0 ? undefined : extension;
82
+ }
83
+ function safePathSegment(value) {
84
+ return value.replace(/[^A-Za-z0-9._-]/g, "_").slice(0, 120) || "unknown-session";
85
+ }
86
+ function isLspSessionState(value) {
87
+ if (!isRecord(value) || !Array.isArray(value["unavailableExtensions"]))
88
+ return false;
89
+ const postCompactProbePending = value["postCompactProbePending"];
90
+ return (value["unavailableExtensions"].every((item) => typeof item === "string") &&
91
+ (postCompactProbePending === undefined || typeof postCompactProbePending === "boolean"));
92
+ }
93
+ function isRecord(value) {
94
+ return typeof value === "object" && value !== null && !Array.isArray(value);
95
+ }
@@ -0,0 +1,6 @@
1
+ export interface MutatedFileInput {
2
+ readonly tool_name?: unknown;
3
+ readonly tool_input?: unknown;
4
+ readonly tool_response?: unknown;
5
+ }
6
+ export declare function extractMutatedFilePaths(input: MutatedFileInput): string[];
@@ -0,0 +1,79 @@
1
+ const MUTATION_TOOL_NAMES = new Set(["apply_patch", "write", "edit", "multiedit", "multi_edit"]);
2
+ export function extractMutatedFilePaths(input) {
3
+ if (!isMutationTool(input.tool_name))
4
+ return [];
5
+ if (isFailedToolResponse(input.tool_response))
6
+ return [];
7
+ const toolInput = isRecord(input.tool_input) ? input.tool_input : {};
8
+ const paths = new Set();
9
+ addStringValue(paths, toolInput["path"]);
10
+ addStringValue(paths, toolInput["filePath"]);
11
+ addStringValue(paths, toolInput["file_path"]);
12
+ addStringArray(paths, toolInput["paths"]);
13
+ addStringArray(paths, toolInput["filePaths"]);
14
+ addStringArray(paths, toolInput["file_paths"]);
15
+ addPatchPayloads(paths, toolInput);
16
+ addPatchFiles(paths, toolInput["files"]);
17
+ addPatchFiles(paths, toolInput["changes"]);
18
+ return [...paths];
19
+ }
20
+ function isMutationTool(value) {
21
+ if (typeof value !== "string")
22
+ return false;
23
+ return MUTATION_TOOL_NAMES.has(value.toLowerCase());
24
+ }
25
+ function isFailedToolResponse(value) {
26
+ if (!isRecord(value))
27
+ return false;
28
+ return (value["isError"] === true || value["is_error"] === true || value["error"] === true || value["status"] === "error");
29
+ }
30
+ function addStringValue(paths, value) {
31
+ if (typeof value === "string" && value.length > 0) {
32
+ paths.add(value);
33
+ }
34
+ }
35
+ function addStringArray(paths, value) {
36
+ if (!Array.isArray(value))
37
+ return;
38
+ for (const item of value) {
39
+ addStringValue(paths, item);
40
+ }
41
+ }
42
+ function addPatchPayloads(paths, input) {
43
+ addPatchInput(paths, input["input"]);
44
+ addPatchInput(paths, input["patch"]);
45
+ addPatchInput(paths, input["command"]);
46
+ }
47
+ function addPatchInput(paths, value) {
48
+ if (typeof value !== "string")
49
+ return;
50
+ for (const line of value.split("\n")) {
51
+ const path = extractPatchHeaderPath(line);
52
+ if (path !== undefined)
53
+ paths.add(path);
54
+ }
55
+ }
56
+ function extractPatchHeaderPath(line) {
57
+ const prefixes = ["*** Add File: ", "*** Update File: ", "*** Move to: "];
58
+ for (const prefix of prefixes) {
59
+ if (line.startsWith(prefix))
60
+ return line.slice(prefix.length).trim();
61
+ }
62
+ return undefined;
63
+ }
64
+ function addPatchFiles(paths, value) {
65
+ if (!Array.isArray(value))
66
+ return;
67
+ for (const item of value) {
68
+ if (!isRecord(item))
69
+ continue;
70
+ addStringValue(paths, item["path"]);
71
+ addStringValue(paths, item["filePath"]);
72
+ addStringValue(paths, item["file_path"]);
73
+ addStringValue(paths, item["movePath"]);
74
+ addStringValue(paths, item["move_path"]);
75
+ }
76
+ }
77
+ function isRecord(value) {
78
+ return typeof value === "object" && value !== null && !Array.isArray(value);
79
+ }