oh-my-codex 0.18.13 → 0.18.15

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 (360) hide show
  1. package/Cargo.lock +6 -6
  2. package/Cargo.toml +1 -1
  3. package/README.md +41 -18
  4. package/dist/agents/__tests__/native-config.test.js +62 -0
  5. package/dist/agents/__tests__/native-config.test.js.map +1 -1
  6. package/dist/agents/native-config.d.ts.map +1 -1
  7. package/dist/agents/native-config.js +15 -2
  8. package/dist/agents/native-config.js.map +1 -1
  9. package/dist/autopilot/__tests__/fsm.test.js +7 -0
  10. package/dist/autopilot/__tests__/fsm.test.js.map +1 -1
  11. package/dist/autopilot/__tests__/planner-routing.test.d.ts +2 -0
  12. package/dist/autopilot/__tests__/planner-routing.test.d.ts.map +1 -0
  13. package/dist/autopilot/__tests__/planner-routing.test.js +74 -0
  14. package/dist/autopilot/__tests__/planner-routing.test.js.map +1 -0
  15. package/dist/autopilot/__tests__/ralplan-gate.test.js +315 -0
  16. package/dist/autopilot/__tests__/ralplan-gate.test.js.map +1 -1
  17. package/dist/autopilot/completion-gate.js +1 -1
  18. package/dist/autopilot/completion-gate.js.map +1 -1
  19. package/dist/autopilot/fsm.d.ts +2 -2
  20. package/dist/autopilot/fsm.d.ts.map +1 -1
  21. package/dist/autopilot/fsm.js +3 -0
  22. package/dist/autopilot/fsm.js.map +1 -1
  23. package/dist/autopilot/planner-routing.d.ts +21 -0
  24. package/dist/autopilot/planner-routing.d.ts.map +1 -0
  25. package/dist/autopilot/planner-routing.js +59 -0
  26. package/dist/autopilot/planner-routing.js.map +1 -0
  27. package/dist/autopilot/ralplan-gate.d.ts.map +1 -1
  28. package/dist/autopilot/ralplan-gate.js +30 -0
  29. package/dist/autopilot/ralplan-gate.js.map +1 -1
  30. package/dist/autoresearch/goal.d.ts.map +1 -1
  31. package/dist/autoresearch/goal.js +10 -1
  32. package/dist/autoresearch/goal.js.map +1 -1
  33. package/dist/cli/__tests__/autoresearch-goal.test.js +33 -0
  34. package/dist/cli/__tests__/autoresearch-goal.test.js.map +1 -1
  35. package/dist/cli/__tests__/autoresearch-guided.test.js +3 -0
  36. package/dist/cli/__tests__/autoresearch-guided.test.js.map +1 -1
  37. package/dist/cli/__tests__/codex-plugin-layout.test.js +30 -0
  38. package/dist/cli/__tests__/codex-plugin-layout.test.js.map +1 -1
  39. package/dist/cli/__tests__/doctor-artifact-ownership.test.d.ts +2 -0
  40. package/dist/cli/__tests__/doctor-artifact-ownership.test.d.ts.map +1 -0
  41. package/dist/cli/__tests__/doctor-artifact-ownership.test.js +158 -0
  42. package/dist/cli/__tests__/doctor-artifact-ownership.test.js.map +1 -0
  43. package/dist/cli/__tests__/doctor-explore-deprecated.test.d.ts +2 -0
  44. package/dist/cli/__tests__/doctor-explore-deprecated.test.d.ts.map +1 -0
  45. package/dist/cli/__tests__/doctor-explore-deprecated.test.js +33 -0
  46. package/dist/cli/__tests__/doctor-explore-deprecated.test.js.map +1 -0
  47. package/dist/cli/__tests__/doctor-spark-routing.test.js +13 -0
  48. package/dist/cli/__tests__/doctor-spark-routing.test.js.map +1 -1
  49. package/dist/cli/__tests__/doctor-warning-copy.test.js +132 -2
  50. package/dist/cli/__tests__/doctor-warning-copy.test.js.map +1 -1
  51. package/dist/cli/__tests__/index.test.js +5 -0
  52. package/dist/cli/__tests__/index.test.js.map +1 -1
  53. package/dist/cli/__tests__/mcp-parity.test.js +40 -0
  54. package/dist/cli/__tests__/mcp-parity.test.js.map +1 -1
  55. package/dist/cli/__tests__/nested-help-routing.test.js +4 -0
  56. package/dist/cli/__tests__/nested-help-routing.test.js.map +1 -1
  57. package/dist/cli/__tests__/package-bin-contract.test.js +7 -1
  58. package/dist/cli/__tests__/package-bin-contract.test.js.map +1 -1
  59. package/dist/cli/__tests__/performance-goal.test.js +22 -0
  60. package/dist/cli/__tests__/performance-goal.test.js.map +1 -1
  61. package/dist/cli/__tests__/plugin-marketplace-idempotent.test.d.ts +2 -0
  62. package/dist/cli/__tests__/plugin-marketplace-idempotent.test.d.ts.map +1 -0
  63. package/dist/cli/__tests__/plugin-marketplace-idempotent.test.js +64 -0
  64. package/dist/cli/__tests__/plugin-marketplace-idempotent.test.js.map +1 -0
  65. package/dist/cli/__tests__/resume.test.js +96 -0
  66. package/dist/cli/__tests__/resume.test.js.map +1 -1
  67. package/dist/cli/__tests__/session-scoped-runtime.test.js +162 -0
  68. package/dist/cli/__tests__/session-scoped-runtime.test.js.map +1 -1
  69. package/dist/cli/__tests__/session-search.test.js +36 -0
  70. package/dist/cli/__tests__/session-search.test.js.map +1 -1
  71. package/dist/cli/__tests__/setup-agents-overwrite.test.js +70 -1
  72. package/dist/cli/__tests__/setup-agents-overwrite.test.js.map +1 -1
  73. package/dist/cli/__tests__/setup-install-mode.test.js +33 -0
  74. package/dist/cli/__tests__/setup-install-mode.test.js.map +1 -1
  75. package/dist/cli/__tests__/team.test.js +17 -3
  76. package/dist/cli/__tests__/team.test.js.map +1 -1
  77. package/dist/cli/__tests__/ultragoal.test.js +37 -0
  78. package/dist/cli/__tests__/ultragoal.test.js.map +1 -1
  79. package/dist/cli/__tests__/update.test.js +81 -2
  80. package/dist/cli/__tests__/update.test.js.map +1 -1
  81. package/dist/cli/__tests__/url.test.d.ts +2 -0
  82. package/dist/cli/__tests__/url.test.d.ts.map +1 -0
  83. package/dist/cli/__tests__/url.test.js +82 -0
  84. package/dist/cli/__tests__/url.test.js.map +1 -0
  85. package/dist/cli/autoresearch-goal.d.ts.map +1 -1
  86. package/dist/cli/autoresearch-goal.js +2 -1
  87. package/dist/cli/autoresearch-goal.js.map +1 -1
  88. package/dist/cli/autoresearch-intake.d.ts.map +1 -1
  89. package/dist/cli/autoresearch-intake.js +2 -0
  90. package/dist/cli/autoresearch-intake.js.map +1 -1
  91. package/dist/cli/doctor.d.ts +39 -1
  92. package/dist/cli/doctor.d.ts.map +1 -1
  93. package/dist/cli/doctor.js +460 -40
  94. package/dist/cli/doctor.js.map +1 -1
  95. package/dist/cli/index.d.ts +2 -2
  96. package/dist/cli/index.d.ts.map +1 -1
  97. package/dist/cli/index.js +71 -4
  98. package/dist/cli/index.js.map +1 -1
  99. package/dist/cli/performance-goal.d.ts.map +1 -1
  100. package/dist/cli/performance-goal.js +4 -2
  101. package/dist/cli/performance-goal.js.map +1 -1
  102. package/dist/cli/plugin-marketplace.d.ts +1 -0
  103. package/dist/cli/plugin-marketplace.d.ts.map +1 -1
  104. package/dist/cli/plugin-marketplace.js +88 -67
  105. package/dist/cli/plugin-marketplace.js.map +1 -1
  106. package/dist/cli/project-runtime-codex-homes.d.ts +2 -0
  107. package/dist/cli/project-runtime-codex-homes.d.ts.map +1 -1
  108. package/dist/cli/project-runtime-codex-homes.js +112 -5
  109. package/dist/cli/project-runtime-codex-homes.js.map +1 -1
  110. package/dist/cli/setup.d.ts.map +1 -1
  111. package/dist/cli/setup.js +15 -6
  112. package/dist/cli/setup.js.map +1 -1
  113. package/dist/cli/ultragoal.d.ts.map +1 -1
  114. package/dist/cli/ultragoal.js +5 -1
  115. package/dist/cli/ultragoal.js.map +1 -1
  116. package/dist/cli/update.d.ts.map +1 -1
  117. package/dist/cli/update.js +23 -4
  118. package/dist/cli/update.js.map +1 -1
  119. package/dist/cli/url.d.ts +8 -0
  120. package/dist/cli/url.d.ts.map +1 -0
  121. package/dist/cli/url.js +69 -0
  122. package/dist/cli/url.js.map +1 -0
  123. package/dist/config/__tests__/codex-hooks.test.js +20 -4
  124. package/dist/config/__tests__/codex-hooks.test.js.map +1 -1
  125. package/dist/config/__tests__/models.test.js +21 -1
  126. package/dist/config/__tests__/models.test.js.map +1 -1
  127. package/dist/config/codex-hooks.d.ts.map +1 -1
  128. package/dist/config/codex-hooks.js +1 -4
  129. package/dist/config/codex-hooks.js.map +1 -1
  130. package/dist/config/models.d.ts +5 -0
  131. package/dist/config/models.d.ts.map +1 -1
  132. package/dist/config/models.js +23 -0
  133. package/dist/config/models.js.map +1 -1
  134. package/dist/goal-workflows/codex-goal-snapshot.d.ts +2 -0
  135. package/dist/goal-workflows/codex-goal-snapshot.d.ts.map +1 -1
  136. package/dist/goal-workflows/codex-goal-snapshot.js +10 -0
  137. package/dist/goal-workflows/codex-goal-snapshot.js.map +1 -1
  138. package/dist/hooks/__tests__/autopilot-skill-contract.test.js +7 -0
  139. package/dist/hooks/__tests__/autopilot-skill-contract.test.js.map +1 -1
  140. package/dist/hooks/__tests__/keyword-detector.test.js +46 -0
  141. package/dist/hooks/__tests__/keyword-detector.test.js.map +1 -1
  142. package/dist/hooks/__tests__/notify-fallback-watcher.test.js +100 -0
  143. package/dist/hooks/__tests__/notify-fallback-watcher.test.js.map +1 -1
  144. package/dist/hooks/__tests__/notify-hook-all-workers-idle.test.js +75 -0
  145. package/dist/hooks/__tests__/notify-hook-all-workers-idle.test.js.map +1 -1
  146. package/dist/hooks/__tests__/notify-hook-auto-nudge.test.js +225 -0
  147. package/dist/hooks/__tests__/notify-hook-auto-nudge.test.js.map +1 -1
  148. package/dist/hooks/__tests__/notify-hook-team-dispatch.test.js +75 -0
  149. package/dist/hooks/__tests__/notify-hook-team-dispatch.test.js.map +1 -1
  150. package/dist/hooks/__tests__/notify-hook-team-leader-nudge.test.js +563 -0
  151. package/dist/hooks/__tests__/notify-hook-team-leader-nudge.test.js.map +1 -1
  152. package/dist/hooks/__tests__/notify-hook-team-tmux-guard.test.js +187 -12
  153. package/dist/hooks/__tests__/notify-hook-team-tmux-guard.test.js.map +1 -1
  154. package/dist/hooks/__tests__/notify-hook-tmux-heal.test.js +225 -0
  155. package/dist/hooks/__tests__/notify-hook-tmux-heal.test.js.map +1 -1
  156. package/dist/hooks/__tests__/notify-hook-tmux-scrollback.test.js +0 -0
  157. package/dist/hooks/__tests__/notify-hook-tmux-scrollback.test.js.map +1 -1
  158. package/dist/hooks/__tests__/notify-hook-worker-idle.test.js +75 -0
  159. package/dist/hooks/__tests__/notify-hook-worker-idle.test.js.map +1 -1
  160. package/dist/hooks/keyword-detector.d.ts.map +1 -1
  161. package/dist/hooks/keyword-detector.js +4 -0
  162. package/dist/hooks/keyword-detector.js.map +1 -1
  163. package/dist/hud/__tests__/reconcile.test.js +137 -2
  164. package/dist/hud/__tests__/reconcile.test.js.map +1 -1
  165. package/dist/hud/__tests__/state.test.js +107 -0
  166. package/dist/hud/__tests__/state.test.js.map +1 -1
  167. package/dist/hud/__tests__/tmux.test.js +17 -0
  168. package/dist/hud/__tests__/tmux.test.js.map +1 -1
  169. package/dist/hud/reconcile.d.ts.map +1 -1
  170. package/dist/hud/reconcile.js +21 -7
  171. package/dist/hud/reconcile.js.map +1 -1
  172. package/dist/hud/render.d.ts.map +1 -1
  173. package/dist/hud/render.js +9 -0
  174. package/dist/hud/render.js.map +1 -1
  175. package/dist/hud/state.d.ts.map +1 -1
  176. package/dist/hud/state.js +43 -5
  177. package/dist/hud/state.js.map +1 -1
  178. package/dist/hud/types.d.ts +6 -0
  179. package/dist/hud/types.d.ts.map +1 -1
  180. package/dist/hud/types.js.map +1 -1
  181. package/dist/index.d.ts +1 -0
  182. package/dist/index.d.ts.map +1 -1
  183. package/dist/index.js +1 -0
  184. package/dist/index.js.map +1 -1
  185. package/dist/mcp/__tests__/bootstrap.test.js +24 -1
  186. package/dist/mcp/__tests__/bootstrap.test.js.map +1 -1
  187. package/dist/mcp/__tests__/state-paths.test.js +53 -0
  188. package/dist/mcp/__tests__/state-paths.test.js.map +1 -1
  189. package/dist/mcp/bootstrap.d.ts +2 -0
  190. package/dist/mcp/bootstrap.d.ts.map +1 -1
  191. package/dist/mcp/bootstrap.js +32 -6
  192. package/dist/mcp/bootstrap.js.map +1 -1
  193. package/dist/mcp/state-paths.d.ts.map +1 -1
  194. package/dist/mcp/state-paths.js +11 -5
  195. package/dist/mcp/state-paths.js.map +1 -1
  196. package/dist/modes/__tests__/base-autopilot-gates.test.js +48 -0
  197. package/dist/modes/__tests__/base-autopilot-gates.test.js.map +1 -1
  198. package/dist/modes/base.d.ts.map +1 -1
  199. package/dist/modes/base.js +1 -0
  200. package/dist/modes/base.js.map +1 -1
  201. package/dist/notifications/__tests__/http-client.test.js +9 -0
  202. package/dist/notifications/__tests__/http-client.test.js.map +1 -1
  203. package/dist/notifications/http-client.js +1 -1
  204. package/dist/notifications/http-client.js.map +1 -1
  205. package/dist/performance-goal/artifacts.d.ts.map +1 -1
  206. package/dist/performance-goal/artifacts.js +10 -1
  207. package/dist/performance-goal/artifacts.js.map +1 -1
  208. package/dist/ralplan/__tests__/consensus-gate.test.js +112 -0
  209. package/dist/ralplan/__tests__/consensus-gate.test.js.map +1 -1
  210. package/dist/ralplan/consensus-gate.d.ts +23 -0
  211. package/dist/ralplan/consensus-gate.d.ts.map +1 -1
  212. package/dist/ralplan/consensus-gate.js +133 -21
  213. package/dist/ralplan/consensus-gate.js.map +1 -1
  214. package/dist/scripts/__tests__/codex-native-hook.test.js +1251 -13
  215. package/dist/scripts/__tests__/codex-native-hook.test.js.map +1 -1
  216. package/dist/scripts/codex-native-hook.d.ts.map +1 -1
  217. package/dist/scripts/codex-native-hook.js +601 -24
  218. package/dist/scripts/codex-native-hook.js.map +1 -1
  219. package/dist/scripts/notify-hook/team-leader-nudge.d.ts +1 -0
  220. package/dist/scripts/notify-hook/team-leader-nudge.d.ts.map +1 -1
  221. package/dist/scripts/notify-hook/team-leader-nudge.js +279 -86
  222. package/dist/scripts/notify-hook/team-leader-nudge.js.map +1 -1
  223. package/dist/scripts/notify-hook/team-tmux-guard.d.ts.map +1 -1
  224. package/dist/scripts/notify-hook/team-tmux-guard.js +87 -8
  225. package/dist/scripts/notify-hook/team-tmux-guard.js.map +1 -1
  226. package/dist/scripts/notify-hook/tmux-injection.js +1 -1
  227. package/dist/scripts/notify-hook/tmux-injection.js.map +1 -1
  228. package/dist/scripts/run-compiled-ci.d.ts +2 -0
  229. package/dist/scripts/run-compiled-ci.d.ts.map +1 -0
  230. package/dist/scripts/run-compiled-ci.js +77 -0
  231. package/dist/scripts/run-compiled-ci.js.map +1 -0
  232. package/dist/scripts/sync-plugin-mirror.d.ts.map +1 -1
  233. package/dist/scripts/sync-plugin-mirror.js +1 -0
  234. package/dist/scripts/sync-plugin-mirror.js.map +1 -1
  235. package/dist/session-history/search.d.ts.map +1 -1
  236. package/dist/session-history/search.js +24 -9
  237. package/dist/session-history/search.js.map +1 -1
  238. package/dist/sidecar/__tests__/args.test.d.ts +2 -0
  239. package/dist/sidecar/__tests__/args.test.d.ts.map +1 -0
  240. package/dist/sidecar/__tests__/args.test.js +18 -0
  241. package/dist/sidecar/__tests__/args.test.js.map +1 -0
  242. package/dist/sidecar/index.d.ts.map +1 -1
  243. package/dist/sidecar/index.js +12 -4
  244. package/dist/sidecar/index.js.map +1 -1
  245. package/dist/state/__tests__/operations.test.js +107 -3
  246. package/dist/state/__tests__/operations.test.js.map +1 -1
  247. package/dist/state/operations.d.ts.map +1 -1
  248. package/dist/state/operations.js +57 -2
  249. package/dist/state/operations.js.map +1 -1
  250. package/dist/team/__tests__/delivery-e2e-smoke.test.js +22 -1
  251. package/dist/team/__tests__/delivery-e2e-smoke.test.js.map +1 -1
  252. package/dist/team/__tests__/model-contract.test.js +57 -1
  253. package/dist/team/__tests__/model-contract.test.js.map +1 -1
  254. package/dist/team/__tests__/runtime.test.js +1468 -110
  255. package/dist/team/__tests__/runtime.test.js.map +1 -1
  256. package/dist/team/__tests__/scaling.test.js +63 -0
  257. package/dist/team/__tests__/scaling.test.js.map +1 -1
  258. package/dist/team/__tests__/state.test.js +24 -1
  259. package/dist/team/__tests__/state.test.js.map +1 -1
  260. package/dist/team/__tests__/tmux-session.test.js +512 -0
  261. package/dist/team/__tests__/tmux-session.test.js.map +1 -1
  262. package/dist/team/__tests__/worker-bootstrap.test.js +42 -9
  263. package/dist/team/__tests__/worker-bootstrap.test.js.map +1 -1
  264. package/dist/team/model-contract.d.ts +16 -0
  265. package/dist/team/model-contract.d.ts.map +1 -1
  266. package/dist/team/model-contract.js +41 -1
  267. package/dist/team/model-contract.js.map +1 -1
  268. package/dist/team/runtime.d.ts.map +1 -1
  269. package/dist/team/runtime.js +116 -30
  270. package/dist/team/runtime.js.map +1 -1
  271. package/dist/team/scaling.d.ts.map +1 -1
  272. package/dist/team/scaling.js +9 -1
  273. package/dist/team/scaling.js.map +1 -1
  274. package/dist/team/state/types.d.ts +2 -0
  275. package/dist/team/state/types.d.ts.map +1 -1
  276. package/dist/team/state/types.js.map +1 -1
  277. package/dist/team/state.d.ts +3 -0
  278. package/dist/team/state.d.ts.map +1 -1
  279. package/dist/team/state.js +20 -0
  280. package/dist/team/state.js.map +1 -1
  281. package/dist/team/tmux-session.d.ts +38 -3
  282. package/dist/team/tmux-session.d.ts.map +1 -1
  283. package/dist/team/tmux-session.js +275 -36
  284. package/dist/team/tmux-session.js.map +1 -1
  285. package/dist/team/worker-bootstrap.d.ts.map +1 -1
  286. package/dist/team/worker-bootstrap.js +26 -1
  287. package/dist/team/worker-bootstrap.js.map +1 -1
  288. package/dist/ultragoal/__tests__/artifacts.test.js +388 -0
  289. package/dist/ultragoal/__tests__/artifacts.test.js.map +1 -1
  290. package/dist/ultragoal/__tests__/docs-contract.test.js +3 -0
  291. package/dist/ultragoal/__tests__/docs-contract.test.js.map +1 -1
  292. package/dist/ultragoal/artifacts.d.ts +23 -0
  293. package/dist/ultragoal/artifacts.d.ts.map +1 -1
  294. package/dist/ultragoal/artifacts.js +275 -12
  295. package/dist/ultragoal/artifacts.js.map +1 -1
  296. package/dist/url-reader/__tests__/url-reader.test.d.ts +2 -0
  297. package/dist/url-reader/__tests__/url-reader.test.d.ts.map +1 -0
  298. package/dist/url-reader/__tests__/url-reader.test.js +433 -0
  299. package/dist/url-reader/__tests__/url-reader.test.js.map +1 -0
  300. package/dist/url-reader/index.d.ts +4 -0
  301. package/dist/url-reader/index.d.ts.map +1 -0
  302. package/dist/url-reader/index.js +522 -0
  303. package/dist/url-reader/index.js.map +1 -0
  304. package/dist/url-reader/types.d.ts +41 -0
  305. package/dist/url-reader/types.d.ts.map +1 -0
  306. package/dist/url-reader/types.js +2 -0
  307. package/dist/url-reader/types.js.map +1 -0
  308. package/dist/utils/__tests__/agents-md.test.js +39 -1
  309. package/dist/utils/__tests__/agents-md.test.js.map +1 -1
  310. package/dist/utils/__tests__/agents-model-table.test.js +28 -0
  311. package/dist/utils/__tests__/agents-model-table.test.js.map +1 -1
  312. package/dist/utils/agents-md.d.ts +4 -0
  313. package/dist/utils/agents-md.d.ts.map +1 -1
  314. package/dist/utils/agents-md.js +28 -0
  315. package/dist/utils/agents-md.js.map +1 -1
  316. package/dist/utils/agents-model-table.d.ts +7 -3
  317. package/dist/utils/agents-model-table.d.ts.map +1 -1
  318. package/dist/utils/agents-model-table.js +16 -8
  319. package/dist/utils/agents-model-table.js.map +1 -1
  320. package/dist/utils/platform-command.d.ts +7 -1
  321. package/dist/utils/platform-command.d.ts.map +1 -1
  322. package/dist/utils/platform-command.js +12 -1
  323. package/dist/utils/platform-command.js.map +1 -1
  324. package/dist/verification/__tests__/ci-rust-gates.test.js +4 -0
  325. package/dist/verification/__tests__/ci-rust-gates.test.js.map +1 -1
  326. package/dist/vscode/__tests__/index.test.d.ts +2 -0
  327. package/dist/vscode/__tests__/index.test.d.ts.map +1 -0
  328. package/dist/vscode/__tests__/index.test.js +236 -0
  329. package/dist/vscode/__tests__/index.test.js.map +1 -0
  330. package/dist/vscode/index.d.ts +76 -0
  331. package/dist/vscode/index.d.ts.map +1 -0
  332. package/dist/vscode/index.js +196 -0
  333. package/dist/vscode/index.js.map +1 -0
  334. package/package.json +3 -3
  335. package/plugins/oh-my-codex/.codex-plugin/plugin.json +1 -1
  336. package/plugins/oh-my-codex/hooks/codex-native-hook.mjs +59 -8
  337. package/plugins/oh-my-codex/skills/autopilot/SKILL.md +9 -5
  338. package/plugins/oh-my-codex/skills/autoresearch-goal/SKILL.md +3 -0
  339. package/plugins/oh-my-codex/skills/performance-goal/SKILL.md +3 -0
  340. package/plugins/oh-my-codex/skills/ralplan/SKILL.md +1 -1
  341. package/plugins/oh-my-codex/skills/ultragoal/SKILL.md +22 -4
  342. package/plugins/oh-my-codex/skills/ultrawork/SKILL.md +2 -2
  343. package/plugins/oh-my-codex/skills/ultrawork/references/agent-tiers.md +61 -0
  344. package/skills/autopilot/SKILL.md +9 -5
  345. package/skills/autoresearch-goal/SKILL.md +3 -0
  346. package/skills/ecomode/SKILL.md +1 -1
  347. package/skills/ecomode/references/agent-tiers.md +61 -0
  348. package/skills/performance-goal/SKILL.md +3 -0
  349. package/skills/ralplan/SKILL.md +1 -1
  350. package/skills/ultragoal/SKILL.md +22 -4
  351. package/skills/ultrawork/SKILL.md +2 -2
  352. package/skills/ultrawork/references/agent-tiers.md +61 -0
  353. package/src/scripts/__tests__/codex-native-hook.test.ts +1560 -181
  354. package/src/scripts/codex-native-hook.ts +663 -24
  355. package/src/scripts/notify-hook/team-leader-nudge.ts +298 -91
  356. package/src/scripts/notify-hook/team-tmux-guard.ts +92 -8
  357. package/src/scripts/notify-hook/tmux-injection.ts +1 -1
  358. package/src/scripts/run-compiled-ci.ts +85 -0
  359. package/src/scripts/sync-plugin-mirror.ts +1 -0
  360. package/templates/AGENTS.md +6 -0
@@ -0,0 +1,522 @@
1
+ import { lookup as dnsLookup } from "node:dns/promises";
2
+ import { isIP } from "node:net";
3
+ const DEFAULT_TIMEOUT_MS = 15_000;
4
+ const DEFAULT_MAX_BYTES = 256 * 1024;
5
+ const DEFAULT_MAX_REDIRECTS = 10;
6
+ const USER_AGENT = "oh-my-codex-url-reader/0";
7
+ const DEFAULT_HTTP_PORT = "80";
8
+ const DEFAULT_HTTPS_PORT = "443";
9
+ const BLOCKED_STATUS_CODES = new Set([401, 403, 407, 423, 429, 451, 503]);
10
+ const REDIRECT_STATUS_CODES = new Set([301, 302, 303, 307, 308]);
11
+ const LOCALHOST_NAMES = new Set(["localhost", "localhost.localdomain"]);
12
+ const TEXT_CONTENT_TYPES = [
13
+ "text/",
14
+ "application/json",
15
+ "application/xml",
16
+ "application/xhtml+xml",
17
+ "application/rss+xml",
18
+ "application/atom+xml",
19
+ "application/ld+json",
20
+ ];
21
+ const CHALLENGE_MARKERS = [
22
+ [/captcha/i, "captcha-marker"],
23
+ [/cloudflare|cf-chl|cf_clearance/i, "cloudflare-marker"],
24
+ [/access denied/i, "access-denied-marker"],
25
+ [/just a moment/i, "just-a-moment-marker"],
26
+ [/verify\s+you\s+are\s+human/i, "human-verification-marker"],
27
+ [/bot\s+detection|automated\s+traffic/i, "bot-detection-marker"],
28
+ [/\bblocked\b/i, "blocked-marker"],
29
+ [/\bchallenge\b/i, "challenge-marker"],
30
+ ];
31
+ export async function readUrl(inputUrl, options = {}) {
32
+ const normalizedInput = inputUrl.trim();
33
+ const fetchImpl = options.fetch ?? globalThis.fetch;
34
+ const timeoutMs = normalizePositiveInteger(options.timeoutMs, DEFAULT_TIMEOUT_MS);
35
+ const maxBytes = normalizePositiveInteger(options.maxBytes, DEFAULT_MAX_BYTES);
36
+ const maxRedirects = normalizePositiveInteger(options.maxRedirects, DEFAULT_MAX_REDIRECTS);
37
+ let parsed;
38
+ try {
39
+ parsed = new URL(normalizedInput);
40
+ }
41
+ catch (error) {
42
+ return errorResult(normalizedInput, normalizeError(error));
43
+ }
44
+ if (!fetchImpl) {
45
+ return errorResult(normalizedInput, {
46
+ name: "FetchUnavailableError",
47
+ message: "No fetch implementation is available in this runtime.",
48
+ });
49
+ }
50
+ try {
51
+ const response = await fetchWithSafeRedirects(parsed, fetchImpl, options, timeoutMs, maxRedirects);
52
+ if ("blocked" in response)
53
+ return response.blocked;
54
+ return await resultFromResponse(normalizedInput, response.response, maxBytes, response.redirected);
55
+ }
56
+ catch (error) {
57
+ return errorResult(normalizedInput, normalizeError(error));
58
+ }
59
+ }
60
+ async function fetchWithSafeRedirects(initialUrl, fetchImpl, options, timeoutMs, maxRedirects) {
61
+ let currentUrl = initialUrl;
62
+ let redirected = false;
63
+ for (let redirectCount = 0; redirectCount <= maxRedirects; redirectCount += 1) {
64
+ const safeTarget = await prepareSafeFetchTarget(currentUrl, options, redirected, initialUrl.toString());
65
+ if ("blocked" in safeTarget)
66
+ return { blocked: safeTarget.blocked };
67
+ const response = await fetchImpl(safeTarget.fetchUrl.toString(), {
68
+ method: "GET",
69
+ redirect: "manual",
70
+ signal: AbortSignal.timeout(timeoutMs),
71
+ headers: safeTarget.headers,
72
+ });
73
+ if (!REDIRECT_STATUS_CODES.has(response.status)) {
74
+ return { response, redirected: redirected || response.redirected };
75
+ }
76
+ const location = response.headers.get("location");
77
+ if (!location)
78
+ return { response, redirected };
79
+ let nextUrl;
80
+ try {
81
+ nextUrl = new URL(location, currentUrl);
82
+ }
83
+ catch {
84
+ return {
85
+ blocked: blockedResult(currentUrl.toString(), "unsafe-redirect-url", {
86
+ name: "UnsafeUrlError",
87
+ message: "Blocked URL redirect because the target URL is invalid.",
88
+ }),
89
+ };
90
+ }
91
+ const unsafeRedirect = await prepareSafeFetchTarget(nextUrl, options, true, initialUrl.toString());
92
+ if ("blocked" in unsafeRedirect)
93
+ return { blocked: unsafeRedirect.blocked };
94
+ currentUrl = nextUrl;
95
+ redirected = true;
96
+ }
97
+ return {
98
+ blocked: blockedResult(initialUrl.toString(), "too-many-redirects", {
99
+ name: "TooManyRedirectsError",
100
+ message: "Blocked URL read after too many redirects.",
101
+ }),
102
+ };
103
+ }
104
+ async function prepareSafeFetchTarget(url, options, redirect = false, inputUrl = url.toString()) {
105
+ const validation = await validateAndResolveSafeUrl(url, options, redirect, inputUrl);
106
+ if ("blocked" in validation)
107
+ return validation;
108
+ const hostname = normalizeHostname(url.hostname);
109
+ const ipVersion = isIP(hostname);
110
+ const headers = defaultFetchHeaders();
111
+ if (ipVersion !== 0) {
112
+ return { fetchUrl: url, headers };
113
+ }
114
+ if (url.protocol === "https:") {
115
+ return {
116
+ blocked: blockedResult(inputUrl, "https-hostname-not-pinned", {
117
+ name: "UnsafeUrlError",
118
+ message: redirect
119
+ ? "Blocked URL redirect because HTTPS hostname targets cannot be connection-pinned safely in this runtime."
120
+ : "Blocked URL read because HTTPS hostname targets cannot be connection-pinned safely in this runtime.",
121
+ }),
122
+ };
123
+ }
124
+ const fetchUrl = new URL(url.toString());
125
+ fetchUrl.hostname = formatHostnameForUrl(validation.address);
126
+ headers.host = originalHttpHostHeader(url);
127
+ return { fetchUrl, headers };
128
+ }
129
+ async function validateAndResolveSafeUrl(url, options, redirect = false, inputUrl = url.toString()) {
130
+ if (url.protocol !== "http:" && url.protocol !== "https:") {
131
+ return {
132
+ blocked: blockedResult(inputUrl, "unsupported-protocol", {
133
+ name: "UnsupportedProtocolError",
134
+ message: `Blocked URL read because protocol ${url.protocol} is not supported.`,
135
+ }),
136
+ };
137
+ }
138
+ const hostname = normalizeHostname(url.hostname);
139
+ if (isLocalhostName(hostname)) {
140
+ return {
141
+ blocked: blockedResult(inputUrl, "localhost-name", {
142
+ name: "UnsafeUrlError",
143
+ message: redirect
144
+ ? "Blocked URL redirect to a local hostname."
145
+ : "Blocked URL read for a local hostname.",
146
+ }),
147
+ };
148
+ }
149
+ let addresses;
150
+ try {
151
+ addresses = await resolveHostname(hostname, options);
152
+ }
153
+ catch {
154
+ return {
155
+ blocked: blockedResult(inputUrl, "dns-resolution-failed", {
156
+ name: "DnsResolutionError",
157
+ message: "Blocked URL read because the hostname could not be resolved safely.",
158
+ }),
159
+ };
160
+ }
161
+ if (addresses.length === 0) {
162
+ return {
163
+ blocked: blockedResult(inputUrl, "dns-resolution-empty", {
164
+ name: "DnsResolutionError",
165
+ message: "Blocked URL read because the hostname did not resolve to an address.",
166
+ }),
167
+ };
168
+ }
169
+ if (addresses.some((address) => !isSafeIpAddress(address))) {
170
+ return {
171
+ blocked: blockedResult(inputUrl, "unsafe-address", {
172
+ name: "UnsafeUrlError",
173
+ message: redirect
174
+ ? "Blocked URL redirect because the target resolves to an unsafe network address."
175
+ : "Blocked URL read because the target resolves to an unsafe network address.",
176
+ }),
177
+ };
178
+ }
179
+ return { address: addresses[0] };
180
+ }
181
+ function defaultFetchHeaders() {
182
+ return {
183
+ "user-agent": USER_AGENT,
184
+ accept: "text/html,application/xhtml+xml,application/xml;q=0.9,application/json;q=0.8,text/plain;q=0.7,*/*;q=0.1",
185
+ };
186
+ }
187
+ function originalHttpHostHeader(url) {
188
+ const hostname = normalizeHostname(url.hostname);
189
+ const defaultPort = url.protocol === "https:" ? DEFAULT_HTTPS_PORT : DEFAULT_HTTP_PORT;
190
+ const bracketedHostname = isIP(hostname) === 6 ? `[${hostname}]` : hostname;
191
+ return url.port && url.port !== defaultPort ? `${bracketedHostname}:${url.port}` : bracketedHostname;
192
+ }
193
+ function formatHostnameForUrl(address) {
194
+ return isIP(address) === 6 ? `[${address}]` : address;
195
+ }
196
+ function normalizeHostname(hostname) {
197
+ return hostname.toLowerCase().replace(/^\[(.*)\]$/, "$1").replace(/\.$/, "");
198
+ }
199
+ function isLocalhostName(hostname) {
200
+ return LOCALHOST_NAMES.has(hostname) || hostname.endsWith(".localhost");
201
+ }
202
+ async function resolveHostname(hostname, options) {
203
+ if (isIP(hostname) !== 0)
204
+ return [hostname];
205
+ if (options.resolveHostname)
206
+ return options.resolveHostname(hostname);
207
+ const records = await dnsLookup(hostname, { all: true, verbatim: true });
208
+ return records.map((record) => record.address);
209
+ }
210
+ function isSafeIpAddress(address) {
211
+ const normalized = normalizeHostname(address);
212
+ const version = isIP(normalized);
213
+ if (version === 4)
214
+ return isSafeIpv4(normalized);
215
+ if (version === 6)
216
+ return isSafeIpv6(normalized);
217
+ return false;
218
+ }
219
+ function isSafeIpv4(address) {
220
+ const parts = address.split(".").map((part) => Number.parseInt(part, 10));
221
+ if (parts.length !== 4 || parts.some((part) => !Number.isInteger(part) || part < 0 || part > 255))
222
+ return false;
223
+ const [a, b, c] = parts;
224
+ if (a === 0 || a === 10 || a === 127 || a >= 224)
225
+ return false;
226
+ if (a === 100 && b >= 64 && b <= 127)
227
+ return false;
228
+ if (a === 169 && b === 254)
229
+ return false;
230
+ if (a === 172 && b >= 16 && b <= 31)
231
+ return false;
232
+ if (a === 192 && b === 168)
233
+ return false;
234
+ if (a === 192 && b === 0)
235
+ return false;
236
+ if (a === 192 && b === 88 && c === 99)
237
+ return false;
238
+ if (a === 198 && (b === 18 || b === 19))
239
+ return false;
240
+ if (a === 198 && b === 51 && c === 100)
241
+ return false;
242
+ if (a === 203 && b === 0 && c === 113)
243
+ return false;
244
+ return true;
245
+ }
246
+ function isSafeIpv6(address) {
247
+ const value = ipv6ToBigInt(address);
248
+ if (value === null)
249
+ return false;
250
+ const ipv4Mapped = ipv4FromIpv6Mapped(value);
251
+ if (ipv4Mapped)
252
+ return isSafeIpv4(ipv4Mapped);
253
+ if (value === 0n || value === 1n)
254
+ return false;
255
+ if (inIpv6Range(value, ipv6Prefix("64:ff9b:1::"), 48))
256
+ return false; // local-use IPv4/IPv6 translation
257
+ if (inIpv6Range(value, ipv6Prefix("100::"), 64))
258
+ return false; // discard-only
259
+ if (inIpv6Range(value, ipv6Prefix("100:0:0:1::"), 64))
260
+ return false; // dummy prefix
261
+ if (inIpv6Range(value, ipv6Prefix("2001::"), 23))
262
+ return false; // IETF protocol assignments
263
+ if (inIpv6Range(value, ipv6Prefix("2001:db8::"), 32))
264
+ return false; // documentation/reserved
265
+ if (inIpv6Range(value, ipv6Prefix("2002::"), 16))
266
+ return false; // 6to4 transition addresses
267
+ if (inIpv6Range(value, ipv6Prefix("3fff::"), 20))
268
+ return false; // documentation/reserved
269
+ if (inIpv6Range(value, ipv6Prefix("5f00::"), 16))
270
+ return false; // segment routing SIDs
271
+ if (inIpv6Range(value, ipv6Prefix("fc00::"), 7))
272
+ return false; // unique local
273
+ if (inIpv6Range(value, ipv6Prefix("fe80::"), 10))
274
+ return false; // link local
275
+ if (inIpv6Range(value, ipv6Prefix("ff00::"), 8))
276
+ return false; // multicast
277
+ return true;
278
+ }
279
+ function ipv4FromIpv6Mapped(value) {
280
+ if (!inIpv6Range(value, 0xffffn << 32n, 96))
281
+ return null;
282
+ return bigIntToIpv4(value & 0xffffffffn);
283
+ }
284
+ function ipv6Prefix(address) {
285
+ const value = ipv6ToBigInt(address);
286
+ if (value === null)
287
+ throw new Error(`Invalid IPv6 prefix: ${address}`);
288
+ return value;
289
+ }
290
+ function inIpv6Range(value, prefixValue, prefixBits) {
291
+ const shift = BigInt(128 - prefixBits);
292
+ return value >> shift === prefixValue >> shift;
293
+ }
294
+ function bigIntToIpv4(value) {
295
+ return [24n, 16n, 8n, 0n]
296
+ .map((shift) => Number((value >> shift) & 0xffn))
297
+ .join(".");
298
+ }
299
+ function ipv6ToBigInt(address) {
300
+ let normalized = address.toLowerCase();
301
+ const zoneIndex = normalized.indexOf("%");
302
+ if (zoneIndex >= 0)
303
+ normalized = normalized.slice(0, zoneIndex);
304
+ const ipv4Tail = /(.*:)(\d+\.\d+\.\d+\.\d+)$/.exec(normalized);
305
+ if (ipv4Tail) {
306
+ const ipv4 = ipv4Tail[2].split(".").map((part) => Number.parseInt(part, 10));
307
+ if (ipv4.length !== 4 || ipv4.some((part) => !Number.isInteger(part) || part < 0 || part > 255))
308
+ return null;
309
+ normalized = `${ipv4Tail[1]}${((ipv4[0] << 8) | ipv4[1]).toString(16)}:${((ipv4[2] << 8) | ipv4[3]).toString(16)}`;
310
+ }
311
+ const halves = normalized.split("::");
312
+ if (halves.length > 2)
313
+ return null;
314
+ const left = halves[0] ? halves[0].split(":") : [];
315
+ const right = halves.length === 2 && halves[1] ? halves[1].split(":") : [];
316
+ const missing = 8 - left.length - right.length;
317
+ if (missing < 0 || (halves.length === 1 && missing !== 0))
318
+ return null;
319
+ const groups = [...left, ...Array(missing).fill("0"), ...right];
320
+ if (groups.length !== 8)
321
+ return null;
322
+ let value = 0n;
323
+ for (const group of groups) {
324
+ if (!/^[0-9a-f]{1,4}$/.test(group))
325
+ return null;
326
+ value = (value << 16n) + BigInt(Number.parseInt(group, 16));
327
+ }
328
+ return value;
329
+ }
330
+ async function resultFromResponse(inputUrl, response, maxBytes, safeRedirected = false) {
331
+ const contentType = response.headers.get("content-type");
332
+ const read = await readBoundedBody(response, maxBytes);
333
+ const text = decodeBody(read.bytes, contentType);
334
+ const signals = classifySignals(response, text);
335
+ const redirected = safeRedirected || response.redirected || urlsDiffer(inputUrl, response.url);
336
+ const verdict = signals.length > 0 ? "blocked" : redirected ? "redirect" : "ok";
337
+ const textLike = isTextLike(contentType);
338
+ return {
339
+ input_url: inputUrl,
340
+ final_url: response.url || inputUrl,
341
+ verdict,
342
+ status: response.status,
343
+ status_text: response.statusText || null,
344
+ content_type: contentType,
345
+ redirected,
346
+ title: textLike ? extractTitle(text) : null,
347
+ snippet: textLike ? buildSnippet(text) : null,
348
+ signals,
349
+ truncated: read.truncated,
350
+ bytes_read: read.bytesRead,
351
+ error: null,
352
+ };
353
+ }
354
+ async function readBoundedBody(response, maxBytes) {
355
+ if (!response.body) {
356
+ return { bytes: new Uint8Array(), bytesRead: 0, truncated: false };
357
+ }
358
+ const reader = response.body.getReader();
359
+ const chunks = [];
360
+ let bytesRead = 0;
361
+ let truncated = false;
362
+ try {
363
+ while (bytesRead < maxBytes) {
364
+ const { done, value } = await reader.read();
365
+ if (done)
366
+ break;
367
+ if (!value || value.byteLength === 0)
368
+ continue;
369
+ const remaining = maxBytes - bytesRead;
370
+ if (value.byteLength > remaining) {
371
+ chunks.push(value.slice(0, remaining));
372
+ bytesRead += remaining;
373
+ truncated = true;
374
+ break;
375
+ }
376
+ chunks.push(value);
377
+ bytesRead += value.byteLength;
378
+ }
379
+ if (bytesRead >= maxBytes)
380
+ truncated = true;
381
+ }
382
+ finally {
383
+ if (truncated) {
384
+ await reader.cancel().catch(() => undefined);
385
+ }
386
+ else {
387
+ reader.releaseLock();
388
+ }
389
+ }
390
+ const bytes = new Uint8Array(bytesRead);
391
+ let offset = 0;
392
+ for (const chunk of chunks) {
393
+ bytes.set(chunk, offset);
394
+ offset += chunk.byteLength;
395
+ }
396
+ return { bytes, bytesRead, truncated };
397
+ }
398
+ function classifySignals(response, text) {
399
+ const signals = new Set();
400
+ if (BLOCKED_STATUS_CODES.has(response.status)) {
401
+ signals.add(`status-${response.status}`);
402
+ }
403
+ for (const [pattern, signal] of CHALLENGE_MARKERS) {
404
+ if (pattern.test(text))
405
+ signals.add(signal);
406
+ }
407
+ return [...signals];
408
+ }
409
+ function decodeBody(bytes, contentType) {
410
+ if (bytes.byteLength === 0)
411
+ return "";
412
+ const charset = /charset=([^;]+)/i.exec(contentType ?? "")?.[1]?.trim();
413
+ try {
414
+ return new TextDecoder(charset || "utf-8", { fatal: false }).decode(bytes);
415
+ }
416
+ catch {
417
+ return new TextDecoder("utf-8", { fatal: false }).decode(bytes);
418
+ }
419
+ }
420
+ function extractTitle(text) {
421
+ const match = /<title[^>]*>([\s\S]*?)<\/title>/i.exec(text);
422
+ if (!match)
423
+ return null;
424
+ const title = decodeHtmlEntities(stripTags(match[1]))
425
+ .replace(/\s+/g, " ")
426
+ .trim();
427
+ return title === "" ? null : title.slice(0, 200);
428
+ }
429
+ function buildSnippet(text) {
430
+ const withoutScripts = text
431
+ .replace(/<script\b[^>]*>[\s\S]*?<\/script>/gi, " ")
432
+ .replace(/<style\b[^>]*>[\s\S]*?<\/style>/gi, " ");
433
+ const normalized = decodeHtmlEntities(stripTags(withoutScripts))
434
+ .replace(/\s+/g, " ")
435
+ .trim();
436
+ if (normalized === "")
437
+ return null;
438
+ return normalized.slice(0, 500);
439
+ }
440
+ function stripTags(text) {
441
+ return text.replace(/<[^>]+>/g, " ");
442
+ }
443
+ function decodeHtmlEntities(text) {
444
+ return text
445
+ .replace(/&nbsp;/gi, " ")
446
+ .replace(/&amp;/gi, "&")
447
+ .replace(/&lt;/gi, "<")
448
+ .replace(/&gt;/gi, ">")
449
+ .replace(/&quot;/gi, '"')
450
+ .replace(/&#39;/g, "'");
451
+ }
452
+ function isTextLike(contentType) {
453
+ if (!contentType)
454
+ return true;
455
+ const normalized = contentType.toLowerCase();
456
+ return TEXT_CONTENT_TYPES.some((prefix) => normalized.startsWith(prefix) || normalized.includes(prefix));
457
+ }
458
+ function urlsDiffer(inputUrl, finalUrl) {
459
+ if (!finalUrl)
460
+ return false;
461
+ try {
462
+ return new URL(inputUrl).toString() !== new URL(finalUrl).toString();
463
+ }
464
+ catch {
465
+ return inputUrl !== finalUrl;
466
+ }
467
+ }
468
+ function normalizePositiveInteger(value, fallback) {
469
+ return typeof value === "number" && Number.isInteger(value) && value > 0
470
+ ? value
471
+ : fallback;
472
+ }
473
+ function normalizeError(error) {
474
+ if (error instanceof Error) {
475
+ const errorWithCode = error;
476
+ const code = typeof errorWithCode.code === "string" ? errorWithCode.code : undefined;
477
+ return {
478
+ name: error.name || "Error",
479
+ message: error.message || "URL read failed.",
480
+ ...(code ? { code } : {}),
481
+ };
482
+ }
483
+ return {
484
+ name: "Error",
485
+ message: typeof error === "string" ? error : "URL read failed.",
486
+ };
487
+ }
488
+ function blockedResult(inputUrl, signal, error) {
489
+ return {
490
+ input_url: inputUrl,
491
+ final_url: null,
492
+ verdict: "blocked",
493
+ status: null,
494
+ status_text: null,
495
+ content_type: null,
496
+ redirected: false,
497
+ title: null,
498
+ snippet: null,
499
+ signals: [signal],
500
+ truncated: false,
501
+ bytes_read: 0,
502
+ error,
503
+ };
504
+ }
505
+ function errorResult(inputUrl, error) {
506
+ return {
507
+ input_url: inputUrl,
508
+ final_url: null,
509
+ verdict: "error",
510
+ status: null,
511
+ status_text: null,
512
+ content_type: null,
513
+ redirected: false,
514
+ title: null,
515
+ snippet: null,
516
+ signals: [],
517
+ truncated: false,
518
+ bytes_read: 0,
519
+ error,
520
+ };
521
+ }
522
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/url-reader/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ export type UrlReadVerdict = "ok" | "blocked" | "error" | "redirect";
2
+ export interface UrlReadError {
3
+ name: string;
4
+ message: string;
5
+ code?: string;
6
+ }
7
+ export interface UrlReadResult {
8
+ input_url: string;
9
+ final_url: string | null;
10
+ verdict: UrlReadVerdict;
11
+ status: number | null;
12
+ status_text: string | null;
13
+ content_type: string | null;
14
+ redirected: boolean;
15
+ title: string | null;
16
+ snippet: string | null;
17
+ signals: string[];
18
+ truncated: boolean;
19
+ bytes_read: number;
20
+ error: UrlReadError | null;
21
+ }
22
+ export interface FetchLikeResponse {
23
+ readonly status: number;
24
+ readonly statusText: string;
25
+ readonly url: string;
26
+ readonly redirected: boolean;
27
+ readonly body: ReadableStream<Uint8Array> | null;
28
+ readonly headers: {
29
+ get(name: string): string | null;
30
+ };
31
+ }
32
+ export type FetchLike = (input: string, init?: RequestInit) => Promise<FetchLikeResponse>;
33
+ export type ResolveHostname = (hostname: string) => Promise<string[]>;
34
+ export interface UrlReaderOptions {
35
+ fetch?: FetchLike;
36
+ resolveHostname?: ResolveHostname;
37
+ timeoutMs?: number;
38
+ maxBytes?: number;
39
+ maxRedirects?: number;
40
+ }
41
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/url-reader/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,cAAc,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,GAAG,UAAU,CAAC;AAErE,MAAM,WAAW,YAAY;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,aAAa;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,OAAO,EAAE,cAAc,CAAC;IACxB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,UAAU,EAAE,OAAO,CAAC;IACpB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,YAAY,GAAG,IAAI,CAAC;CAC3B;AAED,MAAM,WAAW,iBAAiB;IACjC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;IAC7B,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC,UAAU,CAAC,GAAG,IAAI,CAAC;IACjD,QAAQ,CAAC,OAAO,EAAE;QACjB,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;KACjC,CAAC;CACF;AAED,MAAM,MAAM,SAAS,GAAG,CACvB,KAAK,EAAE,MAAM,EACb,IAAI,CAAC,EAAE,WAAW,KACd,OAAO,CAAC,iBAAiB,CAAC,CAAC;AAEhC,MAAM,MAAM,eAAe,GAAG,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;AAEtE,MAAM,WAAW,gBAAgB;IAChC,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,eAAe,CAAC,EAAE,eAAe,CAAC;IAClC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;CACtB"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/url-reader/types.ts"],"names":[],"mappings":""}
@@ -1,6 +1,6 @@
1
1
  import { describe, it } from 'node:test';
2
2
  import assert from 'node:assert/strict';
3
- import { addGeneratedAgentsMarker, hasOmxAgentsContract, hasOmxManagedAgentsSections, isOmxGeneratedAgentsMd, OMX_GENERATED_AGENTS_MARKER, OMX_MANAGED_AGENTS_END_MARKER, OMX_MANAGED_AGENTS_START_MARKER, } from '../agents-md.js';
3
+ import { addGeneratedAgentsMarker, hasOmxAgentsContract, hasOmxManagedAgentsSections, isOmxGeneratedAgentsMd, OMX_GENERATED_AGENTS_MARKER, extractUserOmxPolicyBlocks, OMX_MANAGED_AGENTS_END_MARKER, OMX_MANAGED_AGENTS_START_MARKER, OMX_USER_POLICY_END_MARKER, OMX_USER_POLICY_START_MARKER, preserveUserOmxPolicyBlocks, } from '../agents-md.js';
4
4
  describe('agents-md helpers', () => {
5
5
  it('inserts the generated marker after the autonomy directive block', () => {
6
6
  const content = [
@@ -92,5 +92,43 @@ describe('agents-md helpers', () => {
92
92
  ].join('\n');
93
93
  assert.equal(hasOmxAgentsContract(content), false);
94
94
  });
95
+ it('extracts complete user-owned OMX policy blocks', () => {
96
+ const content = [
97
+ '# Local policy',
98
+ OMX_USER_POLICY_START_MARKER,
99
+ 'Keep durable operator guidance.',
100
+ OMX_USER_POLICY_END_MARKER,
101
+ 'after',
102
+ ].join('\n');
103
+ assert.deepEqual(extractUserOmxPolicyBlocks(content), [
104
+ [
105
+ OMX_USER_POLICY_START_MARKER,
106
+ 'Keep durable operator guidance.',
107
+ OMX_USER_POLICY_END_MARKER,
108
+ ].join('\n'),
109
+ ]);
110
+ });
111
+ it('appends missing user-owned OMX policy blocks to regenerated content', () => {
112
+ const existing = [
113
+ '# Local policy',
114
+ OMX_USER_POLICY_START_MARKER,
115
+ 'Keep durable operator guidance.',
116
+ OMX_USER_POLICY_END_MARKER,
117
+ '',
118
+ ].join('\n');
119
+ const regenerated = `${OMX_GENERATED_AGENTS_MARKER}\n# New defaults\n`;
120
+ const result = preserveUserOmxPolicyBlocks(existing, regenerated);
121
+ assert.match(result, /# New defaults\n\n<!-- USER:OMX:POLICY:START -->\nKeep durable operator guidance\.\n<!-- USER:OMX:POLICY:END -->\n$/);
122
+ });
123
+ it('does not duplicate a user-owned OMX policy block already present', () => {
124
+ const policyBlock = [
125
+ OMX_USER_POLICY_START_MARKER,
126
+ 'Keep durable operator guidance.',
127
+ OMX_USER_POLICY_END_MARKER,
128
+ ].join('\n');
129
+ const existing = `# Local policy\n${policyBlock}\n`;
130
+ const regenerated = `${OMX_GENERATED_AGENTS_MARKER}\n${policyBlock}\n`;
131
+ assert.equal(preserveUserOmxPolicyBlocks(existing, regenerated), regenerated);
132
+ });
95
133
  });
96
134
  //# sourceMappingURL=agents-md.test.js.map