lazycodex-ai 5.1.44 → 5.1.46

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 (412) hide show
  1. package/README.de.md +0 -5
  2. package/README.es.md +0 -5
  3. package/README.fr.md +0 -5
  4. package/README.it.md +0 -5
  5. package/README.ja.md +0 -5
  6. package/README.ko.md +0 -5
  7. package/README.md +4 -5
  8. package/README.pt-br.md +0 -5
  9. package/README.ru.md +0 -6
  10. package/README.zh-cn.md +0 -5
  11. package/dist/cli/index.js +865 -413
  12. package/dist/cli/service-auth/keystore.d.ts +4 -2
  13. package/dist/cli-node/index.js +865 -413
  14. package/docs/reference/web-terminal-visual-qa.md +8 -0
  15. package/package.json +1 -1
  16. package/packages/lsp-daemon/dist/cli.js +7 -7
  17. package/packages/lsp-daemon/dist/client.js +7 -7
  18. package/packages/lsp-daemon/dist/index.js +7 -7
  19. package/packages/lsp-daemon/package.json +3 -3
  20. package/packages/lsp-tools-mcp/dist/cli.js +7 -7
  21. package/packages/lsp-tools-mcp/dist/mcp.js +7 -7
  22. package/packages/lsp-tools-mcp/dist/tools.js +4 -4
  23. package/packages/lsp-tools-mcp/package.json +3 -3
  24. package/packages/omo-codex/plugin/.codex-plugin/plugin.json +1 -1
  25. package/packages/omo-codex/plugin/components/bootstrap/dist/cli.js +77 -26
  26. package/packages/omo-codex/plugin/components/bootstrap/hooks/hooks.json +1 -1
  27. package/packages/omo-codex/plugin/components/bootstrap/package.json +1 -1
  28. package/packages/omo-codex/plugin/components/bootstrap/src/hook.ts +1 -1
  29. package/packages/omo-codex/plugin/components/comment-checker/biome.json +1 -21
  30. package/packages/omo-codex/plugin/components/comment-checker/hooks/hooks.json +1 -1
  31. package/packages/omo-codex/plugin/components/comment-checker/package.json +4 -4
  32. package/packages/omo-codex/plugin/components/git-bash/hooks/hooks.json +2 -2
  33. package/packages/omo-codex/plugin/components/git-bash/package.json +1 -1
  34. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/biome.json +1 -21
  35. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/hooks/hooks.json +1 -1
  36. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/package.json +4 -4
  37. package/packages/omo-codex/plugin/components/lsp/biome.json +1 -21
  38. package/packages/omo-codex/plugin/components/lsp/dist/.omo-runtime-manifest.json +3 -3
  39. package/packages/omo-codex/plugin/components/lsp/dist/cli.js +4 -4
  40. package/packages/omo-codex/plugin/components/lsp/hooks/hooks.json +2 -2
  41. package/packages/omo-codex/plugin/components/lsp/package.json +4 -4
  42. package/packages/omo-codex/plugin/components/lsp/scripts/build-runtime.mjs +0 -1
  43. package/packages/omo-codex/plugin/components/lsp/test/codex-hook-not-installed.test.ts +1 -1
  44. package/packages/omo-codex/plugin/components/rules/biome.json +1 -21
  45. package/packages/omo-codex/plugin/components/rules/hooks/hooks.json +4 -4
  46. package/packages/omo-codex/plugin/components/rules/package.json +4 -4
  47. package/packages/omo-codex/plugin/components/teammode/hooks/hooks.json +1 -1
  48. package/packages/omo-codex/plugin/components/teammode/package.json +1 -1
  49. package/packages/omo-codex/plugin/components/telemetry/biome.json +1 -21
  50. package/packages/omo-codex/plugin/components/telemetry/dist/cli.js +90 -1
  51. package/packages/omo-codex/plugin/components/telemetry/dist/posthog.js +91 -1
  52. package/packages/omo-codex/plugin/components/telemetry/hooks/hooks.json +1 -1
  53. package/packages/omo-codex/plugin/components/telemetry/package.json +4 -4
  54. package/packages/omo-codex/plugin/components/ultrawork/agents/lazycodex-gate-reviewer.toml +2 -2
  55. package/packages/omo-codex/plugin/components/ultrawork/biome.json +1 -21
  56. package/packages/omo-codex/plugin/components/ultrawork/hooks/hooks.json +1 -1
  57. package/packages/omo-codex/plugin/components/ultrawork/package.json +4 -4
  58. package/packages/omo-codex/plugin/components/ulw-execute-continuation/biome.json +1 -21
  59. package/packages/omo-codex/plugin/components/ulw-execute-continuation/directive.md +1 -1
  60. package/packages/omo-codex/plugin/components/ulw-execute-continuation/hooks/hooks.json +1 -1
  61. package/packages/omo-codex/plugin/components/ulw-execute-continuation/package.json +4 -4
  62. package/packages/omo-codex/plugin/components/ulw-loop/biome.json +1 -21
  63. package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint.js +1 -1
  64. package/packages/omo-codex/plugin/components/ulw-loop/dist/cli.js +7 -7
  65. package/packages/omo-codex/plugin/components/ulw-loop/dist/codex-goal-instruction.js +5 -5
  66. package/packages/omo-codex/plugin/components/ulw-loop/dist/stop-resume-hook.js +1 -1
  67. package/packages/omo-codex/plugin/components/ulw-loop/hooks/hooks.json +5 -5
  68. package/packages/omo-codex/plugin/components/ulw-loop/package.json +4 -4
  69. package/packages/omo-codex/plugin/components/ulw-loop/src/checkpoint.ts +1 -1
  70. package/packages/omo-codex/plugin/components/ulw-loop/src/codex-goal-instruction.ts +5 -5
  71. package/packages/omo-codex/plugin/components/ulw-loop/src/stop-resume-hook.ts +1 -1
  72. package/packages/omo-codex/plugin/components/ulw-loop/test/fixtures/commit-mutations.mjs +2 -0
  73. package/packages/omo-codex/plugin/hooks/post-compact-resetting-git-bash-mcp-reminder.json +1 -1
  74. package/packages/omo-codex/plugin/hooks/post-compact-resetting-lsp-diagnostics-cache.json +1 -1
  75. package/packages/omo-codex/plugin/hooks/post-compact-resetting-project-rule-cache.json +1 -1
  76. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-comments.json +1 -1
  77. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-lsp-diagnostics.json +1 -1
  78. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-thread-title-hygiene.json +1 -1
  79. package/packages/omo-codex/plugin/hooks/post-tool-use-matching-project-rules.json +1 -1
  80. package/packages/omo-codex/plugin/hooks/post-tool-use-recording-spawn-admission.json +1 -1
  81. package/packages/omo-codex/plugin/hooks/pre-tool-use-enforcing-unlimited-goal-budget.json +1 -1
  82. package/packages/omo-codex/plugin/hooks/pre-tool-use-guarding-ulw-loop-spawns.json +1 -1
  83. package/packages/omo-codex/plugin/hooks/pre-tool-use-recommending-git-bash-mcp.json +1 -1
  84. package/packages/omo-codex/plugin/hooks/session-start-checking-auto-update.json +1 -1
  85. package/packages/omo-codex/plugin/hooks/session-start-checking-bootstrap-provisioning.json +1 -1
  86. package/packages/omo-codex/plugin/hooks/session-start-loading-project-rules.json +1 -1
  87. package/packages/omo-codex/plugin/hooks/session-start-recording-session-telemetry.json +1 -1
  88. package/packages/omo-codex/plugin/hooks/stop-checking-ulw-execute-continuation.json +1 -1
  89. package/packages/omo-codex/plugin/hooks/stop-checking-ulw-loop-resume.json +1 -1
  90. package/packages/omo-codex/plugin/hooks/subagent-stop-verifying-lazycodex-executor-evidence.json +1 -1
  91. package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ultrawork-trigger.json +1 -1
  92. package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ulw-loop-steering.json +1 -1
  93. package/packages/omo-codex/plugin/hooks/user-prompt-submit-loading-project-rules.json +1 -1
  94. package/packages/omo-codex/plugin/package-lock.json +12 -12
  95. package/packages/omo-codex/plugin/package.json +1 -1
  96. package/packages/omo-codex/plugin/scripts/sync-skills.mjs +14 -9
  97. package/packages/omo-codex/plugin/skills/ast-grep/AGENTS.md +1 -1
  98. package/packages/omo-codex/plugin/skills/browser/SKILL.md +21 -22
  99. package/packages/omo-codex/plugin/skills/browser/references/commands.md +2 -9
  100. package/packages/omo-codex/plugin/skills/browser/references/install.md +1 -2
  101. package/packages/omo-codex/plugin/skills/browser/runtime/omowright/manifest.json +1 -1
  102. package/packages/omo-codex/plugin/skills/browser/scripts/browser-doctor.mjs +2 -2
  103. package/packages/omo-codex/plugin/skills/browser/scripts/browser-engine-guard.mjs +63 -487
  104. package/packages/omo-codex/plugin/skills/browser/scripts/browser-install.mjs +1 -1
  105. package/packages/omo-codex/plugin/skills/browser/scripts/omowright.mjs +1 -10
  106. package/packages/omo-codex/plugin/skills/frontend/ATTRIBUTION.md +2 -2
  107. package/packages/omo-codex/plugin/skills/frontend/SKILL.md +79 -118
  108. package/packages/omo-codex/plugin/skills/frontend/references/design/README.md +75 -224
  109. package/packages/omo-codex/plugin/skills/frontend/references/design/stylegallery.md +32 -27
  110. package/packages/omo-codex/plugin/skills/frontend/references/perfection/README.md +2 -2
  111. package/packages/omo-codex/plugin/skills/frontend/scripts/perfection/check-accent-stripes.ts +8 -24
  112. package/packages/omo-codex/plugin/skills/frontend/scripts/perfection/check-draft-guard.ts +40 -0
  113. package/packages/omo-codex/plugin/skills/frontend/scripts/perfection/collect-files.ts +53 -0
  114. package/packages/omo-codex/plugin/skills/frontend/scripts/perfection/draft-guard/findings.ts +16 -0
  115. package/packages/omo-codex/plugin/skills/frontend/scripts/perfection/draft-guard/lint.ts +38 -0
  116. package/packages/omo-codex/plugin/skills/frontend/scripts/perfection/draft-guard/rules.ts +69 -0
  117. package/packages/omo-codex/plugin/skills/frontend/scripts/perfection/draft-guard/text-nodes.ts +121 -0
  118. package/packages/omo-codex/plugin/skills/frontend/scripts/perfection/fixtures/draft-guard/negative/attr-lookalikes.tsx +10 -0
  119. package/packages/omo-codex/plugin/skills/frontend/scripts/perfection/fixtures/draft-guard/negative/bound-values.tsx +12 -0
  120. package/packages/omo-codex/plugin/skills/frontend/scripts/perfection/fixtures/draft-guard/negative/const-generics.tsx +3 -0
  121. package/packages/omo-codex/plugin/skills/frontend/scripts/perfection/fixtures/draft-guard/negative/generics.tsx +7 -0
  122. package/packages/omo-codex/plugin/skills/frontend/scripts/perfection/fixtures/draft-guard/negative/measured-stats.html +6 -0
  123. package/packages/omo-codex/plugin/skills/frontend/scripts/perfection/fixtures/draft-guard/negative/plain-copy.html +9 -0
  124. package/packages/omo-codex/plugin/skills/frontend/scripts/perfection/fixtures/draft-guard/negative/state-copy.html +11 -0
  125. package/packages/omo-codex/plugin/skills/frontend/scripts/perfection/fixtures/draft-guard/positive/attribute-edges.html +7 -0
  126. package/packages/omo-codex/plugin/skills/frontend/scripts/perfection/fixtures/draft-guard/positive/components.tsx +16 -0
  127. package/packages/omo-codex/plugin/skills/frontend/scripts/perfection/fixtures/draft-guard/positive/decorative-badge.vue +7 -0
  128. package/packages/omo-codex/plugin/skills/frontend/scripts/perfection/fixtures/draft-guard/positive/emoji-icons.tsx +9 -0
  129. package/packages/omo-codex/plugin/skills/frontend/scripts/perfection/fixtures/draft-guard/positive/jsx-edges.tsx +1 -0
  130. package/packages/omo-codex/plugin/skills/frontend/scripts/perfection/fixtures/draft-guard/positive/promo-copy.html +6 -0
  131. package/packages/omo-codex/plugin/skills/frontend/scripts/perfection/fixtures/draft-guard/positive/promo-copy.tsx +8 -0
  132. package/packages/omo-codex/plugin/skills/frontend/scripts/perfection/fixtures/draft-guard/positive/vanity-stats.html +5 -0
  133. package/packages/omo-codex/plugin/skills/init-deep/SKILL.md +1 -1
  134. package/packages/omo-codex/plugin/skills/programming/SKILL.md +10 -7
  135. package/packages/omo-codex/plugin/skills/programming/references/typescript/README.md +10 -7
  136. package/packages/omo-codex/plugin/skills/programming/references/typescript/bootstrap.md +9 -23
  137. package/packages/omo-codex/plugin/skills/programming/references/typescript/oxc-lint.md +130 -0
  138. package/packages/omo-codex/plugin/skills/programming/references/typescript/tsconfig-strict.md +6 -62
  139. package/packages/omo-codex/plugin/skills/programming/scripts/typescript/check-no-excuse-rules.ts +12 -12
  140. package/packages/omo-codex/plugin/skills/programming/scripts/typescript/new-project.ts +20 -81
  141. package/packages/omo-codex/plugin/skills/programming/scripts/typescript/oxc/.oxfmtrc.json +9 -0
  142. package/packages/omo-codex/plugin/skills/programming/scripts/typescript/oxc/.oxlintrc.json +46 -0
  143. package/packages/omo-codex/plugin/skills/programming/scripts/typescript/oxc/lint/oxlint-plugin/LICENSE +21 -0
  144. package/packages/omo-codex/plugin/skills/programming/scripts/typescript/oxc/lint/oxlint-plugin/index.js +10 -0
  145. package/packages/omo-codex/plugin/skills/programming/scripts/typescript/oxc/lint/oxlint-plugin/no-em-dash-copy.js +28 -0
  146. package/packages/omo-codex/plugin/skills/programming/scripts/typescript/oxc/lint/oxlint-plugin/require-suppression-reason.js +62 -0
  147. package/packages/omo-codex/plugin/skills/programming/scripts/typescript/oxc/tsconfig.json +29 -0
  148. package/packages/omo-codex/plugin/skills/refactor/SKILL.md +14 -14
  149. package/packages/omo-codex/plugin/skills/remove-ai-slops/SKILL.md +1 -1
  150. package/packages/omo-codex/plugin/skills/review-work/SKILL.md +2 -2
  151. package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/AGENTS.md +1 -1
  152. package/packages/omo-codex/plugin/skills/ulw-execute/SKILL.md +2 -2
  153. package/packages/omo-codex/plugin/skills/ulw-loop/SKILL.md +1 -1
  154. package/packages/omo-codex/plugin/skills/ulw-research/AGENTS.md +21 -3
  155. package/packages/omo-codex/plugin/skills/ulw-research/SKILL.md +37 -12
  156. package/packages/omo-codex/plugin/skills/ulw-research/references/deliverable-phase.md +77 -16
  157. package/packages/omo-codex/plugin/skills/ulw-research/references/fact-ledger-grammar.md +134 -0
  158. package/packages/omo-codex/plugin/skills/ulw-research/references/fact-ledger.md +95 -0
  159. package/packages/omo-codex/plugin/skills/ulw-research/references/fidelity-claim-kinds.md +19 -0
  160. package/packages/omo-codex/plugin/skills/ulw-research/references/report-gates.md +68 -3
  161. package/packages/omo-codex/plugin/skills/ulw-research/references/report-visualization.md +2 -0
  162. package/packages/omo-codex/plugin/skills/ulw-research/references/unit-rules.md +157 -0
  163. package/packages/omo-codex/plugin/skills/ulw-research/scripts/claim-kinds.mjs +116 -0
  164. package/packages/omo-codex/plugin/skills/ulw-research/scripts/claims-index.mjs +125 -0
  165. package/packages/omo-codex/plugin/skills/ulw-research/scripts/cli-support.mjs +19 -5
  166. package/packages/omo-codex/plugin/skills/ulw-research/scripts/contracts.mjs +89 -3
  167. package/packages/omo-codex/plugin/skills/ulw-research/scripts/fact-commands-meaning.mjs +191 -0
  168. package/packages/omo-codex/plugin/skills/ulw-research/scripts/fact-commands-verify.mjs +164 -0
  169. package/packages/omo-codex/plugin/skills/ulw-research/scripts/fact-commands.mjs +239 -0
  170. package/packages/omo-codex/plugin/skills/ulw-research/scripts/fact-derive.mjs +66 -0
  171. package/packages/omo-codex/plugin/skills/ulw-research/scripts/fact-expr.mjs +108 -0
  172. package/packages/omo-codex/plugin/skills/ulw-research/scripts/fact-fill.mjs +194 -0
  173. package/packages/omo-codex/plugin/skills/ulw-research/scripts/fact-ledger-kinds.mjs +250 -0
  174. package/packages/omo-codex/plugin/skills/ulw-research/scripts/fact-ledger-schema.mjs +221 -0
  175. package/packages/omo-codex/plugin/skills/ulw-research/scripts/fact-ledger.mjs +123 -0
  176. package/packages/omo-codex/plugin/skills/ulw-research/scripts/fact-locate.mjs +231 -0
  177. package/packages/omo-codex/plugin/skills/ulw-research/scripts/fact-pairs.mjs +187 -0
  178. package/packages/omo-codex/plugin/skills/ulw-research/scripts/fact-recompute.mjs +89 -0
  179. package/packages/omo-codex/plugin/skills/ulw-research/scripts/fidelity-binding.mjs +130 -0
  180. package/packages/omo-codex/plugin/skills/ulw-research/scripts/fidelity-brief.mjs +150 -0
  181. package/packages/omo-codex/plugin/skills/ulw-research/scripts/fidelity-claims.mjs +89 -0
  182. package/packages/omo-codex/plugin/skills/ulw-research/scripts/fidelity-lexicon.mjs +145 -0
  183. package/packages/omo-codex/plugin/skills/ulw-research/scripts/fidelity-records.mjs +163 -0
  184. package/packages/omo-codex/plugin/skills/ulw-research/scripts/fidelity-state.mjs +64 -0
  185. package/packages/omo-codex/plugin/skills/ulw-research/scripts/fidelity-trace.mjs +85 -0
  186. package/packages/omo-codex/plugin/skills/ulw-research/scripts/fidelity-values.mjs +229 -0
  187. package/packages/omo-codex/plugin/skills/ulw-research/scripts/gates-fidelity.mjs +113 -0
  188. package/packages/omo-codex/plugin/skills/ulw-research/scripts/gates-static.mjs +29 -9
  189. package/packages/omo-codex/plugin/skills/ulw-research/scripts/gates-structure.mjs +1 -1
  190. package/packages/omo-codex/plugin/skills/ulw-research/scripts/gates-text.mjs +1 -27
  191. package/packages/omo-codex/plugin/skills/ulw-research/scripts/html-lite.mjs +2 -2
  192. package/packages/omo-codex/plugin/skills/ulw-research/scripts/html-markup.mjs +182 -0
  193. package/packages/omo-codex/plugin/skills/ulw-research/scripts/lexicon.mjs +47 -0
  194. package/packages/omo-codex/plugin/skills/ulw-research/scripts/md-lite.mjs +193 -0
  195. package/packages/omo-codex/plugin/skills/ulw-research/scripts/meaning-check.mjs +196 -0
  196. package/packages/omo-codex/plugin/skills/ulw-research/scripts/numerals.mjs +226 -0
  197. package/packages/omo-codex/plugin/skills/ulw-research/scripts/outcome.mjs +8 -8
  198. package/packages/omo-codex/plugin/skills/ulw-research/scripts/particles-ko.mjs +108 -0
  199. package/packages/omo-codex/plugin/skills/ulw-research/scripts/placeholder.mjs +184 -0
  200. package/packages/omo-codex/plugin/skills/ulw-research/scripts/polish-apply.mjs +115 -0
  201. package/packages/omo-codex/plugin/skills/ulw-research/scripts/polish-diff.mjs +31 -0
  202. package/packages/omo-codex/plugin/skills/ulw-research/scripts/polish-project.mjs +125 -0
  203. package/packages/omo-codex/plugin/skills/ulw-research/scripts/polish-rules.mjs +170 -0
  204. package/packages/omo-codex/plugin/skills/ulw-research/scripts/rational.mjs +139 -0
  205. package/packages/omo-codex/plugin/skills/ulw-research/scripts/report-tools-commands.mjs +21 -10
  206. package/packages/omo-codex/plugin/skills/ulw-research/scripts/report-tools.mjs +15 -0
  207. package/packages/omo-codex/plugin/skills/ulw-research/scripts/sentence-split.mjs +77 -0
  208. package/packages/omo-codex/plugin/skills/ulw-research/scripts/source-commands.mjs +140 -0
  209. package/packages/omo-codex/plugin/skills/ulw-research/scripts/source-snapshot.mjs +176 -0
  210. package/packages/omo-codex/plugin/skills/ulw-research/scripts/text-normalize.mjs +82 -0
  211. package/packages/omo-codex/plugin/skills/ulw-research/scripts/text-similarity.mjs +28 -0
  212. package/packages/omo-codex/plugin/skills/ulw-research/scripts/unit-algebra.mjs +101 -0
  213. package/packages/omo-codex/plugin/skills/ulw-research/scripts/unit-errors.mjs +23 -0
  214. package/packages/omo-codex/plugin/skills/ulw-research/scripts/unit-metadata.mjs +31 -0
  215. package/packages/omo-codex/plugin/skills/ulw-research/scripts/unit-pairs.mjs +72 -0
  216. package/packages/omo-codex/plugin/skills/ulw-research/scripts/unit-precision.mjs +44 -0
  217. package/packages/omo-codex/plugin/skills/ulw-research/scripts/unit-rules-shapes.mjs +64 -0
  218. package/packages/omo-codex/plugin/skills/ulw-research/scripts/unit-rules.mjs +173 -0
  219. package/packages/omo-codex/plugin/skills/ulw-research/scripts/units.mjs +105 -0
  220. package/packages/omo-codex/plugin/skills/visual-qa/SKILL.md +71 -64
  221. package/packages/omo-codex/plugin/test/component-bundled-cli.test.mjs +4 -1
  222. package/packages/omo-codex/plugin/test/sync-skills-codex-compatibility.test.mjs +19 -0
  223. package/packages/omo-codex/plugin/test/sync-skills-test-support.mjs +12 -8
  224. package/packages/omo-codex/scripts/install-dist/install-local.mjs +169 -30
  225. package/packages/shared-skills/skills/ast-grep/AGENTS.md +1 -1
  226. package/packages/shared-skills/skills/browser/SKILL.md +21 -22
  227. package/packages/shared-skills/skills/browser/references/commands.md +2 -9
  228. package/packages/shared-skills/skills/browser/references/install.md +1 -2
  229. package/packages/shared-skills/skills/browser/runtime/omowright/manifest.json +1 -1
  230. package/packages/shared-skills/skills/browser/scripts/browser-doctor.mjs +2 -2
  231. package/packages/shared-skills/skills/browser/scripts/browser-engine-guard.mjs +63 -487
  232. package/packages/shared-skills/skills/browser/scripts/browser-install.mjs +1 -1
  233. package/packages/shared-skills/skills/browser/scripts/omowright.mjs +1 -10
  234. package/packages/shared-skills/skills/frontend/ATTRIBUTION.md +2 -2
  235. package/packages/shared-skills/skills/frontend/SKILL.md +79 -118
  236. package/packages/shared-skills/skills/frontend/references/design/README.md +75 -224
  237. package/packages/shared-skills/skills/frontend/references/design/stylegallery.md +32 -27
  238. package/packages/shared-skills/skills/frontend/references/perfection/README.md +2 -2
  239. package/packages/shared-skills/skills/frontend/scripts/perfection/check-accent-stripes.ts +8 -24
  240. package/packages/shared-skills/skills/frontend/scripts/perfection/check-draft-guard.test.ts +101 -0
  241. package/packages/shared-skills/skills/frontend/scripts/perfection/check-draft-guard.ts +40 -0
  242. package/packages/shared-skills/skills/frontend/scripts/perfection/collect-files.test.ts +50 -0
  243. package/packages/shared-skills/skills/frontend/scripts/perfection/collect-files.ts +53 -0
  244. package/packages/shared-skills/skills/frontend/scripts/perfection/draft-guard/findings.ts +16 -0
  245. package/packages/shared-skills/skills/frontend/scripts/perfection/draft-guard/lint.ts +38 -0
  246. package/packages/shared-skills/skills/frontend/scripts/perfection/draft-guard/rules.ts +69 -0
  247. package/packages/shared-skills/skills/frontend/scripts/perfection/draft-guard/text-nodes.ts +121 -0
  248. package/packages/shared-skills/skills/frontend/scripts/perfection/fixtures/draft-guard/negative/attr-lookalikes.tsx +10 -0
  249. package/packages/shared-skills/skills/frontend/scripts/perfection/fixtures/draft-guard/negative/bound-values.tsx +12 -0
  250. package/packages/shared-skills/skills/frontend/scripts/perfection/fixtures/draft-guard/negative/const-generics.tsx +3 -0
  251. package/packages/shared-skills/skills/frontend/scripts/perfection/fixtures/draft-guard/negative/generics.tsx +7 -0
  252. package/packages/shared-skills/skills/frontend/scripts/perfection/fixtures/draft-guard/negative/measured-stats.html +6 -0
  253. package/packages/shared-skills/skills/frontend/scripts/perfection/fixtures/draft-guard/negative/plain-copy.html +9 -0
  254. package/packages/shared-skills/skills/frontend/scripts/perfection/fixtures/draft-guard/negative/state-copy.html +11 -0
  255. package/packages/shared-skills/skills/frontend/scripts/perfection/fixtures/draft-guard/positive/attribute-edges.html +7 -0
  256. package/packages/shared-skills/skills/frontend/scripts/perfection/fixtures/draft-guard/positive/components.tsx +16 -0
  257. package/packages/shared-skills/skills/frontend/scripts/perfection/fixtures/draft-guard/positive/decorative-badge.vue +7 -0
  258. package/packages/shared-skills/skills/frontend/scripts/perfection/fixtures/draft-guard/positive/emoji-icons.tsx +9 -0
  259. package/packages/shared-skills/skills/frontend/scripts/perfection/fixtures/draft-guard/positive/jsx-edges.tsx +1 -0
  260. package/packages/shared-skills/skills/frontend/scripts/perfection/fixtures/draft-guard/positive/promo-copy.html +6 -0
  261. package/packages/shared-skills/skills/frontend/scripts/perfection/fixtures/draft-guard/positive/promo-copy.tsx +8 -0
  262. package/packages/shared-skills/skills/frontend/scripts/perfection/fixtures/draft-guard/positive/vanity-stats.html +5 -0
  263. package/packages/shared-skills/skills/programming/SKILL.md +10 -7
  264. package/packages/shared-skills/skills/programming/references/typescript/README.md +10 -7
  265. package/packages/shared-skills/skills/programming/references/typescript/bootstrap.md +9 -23
  266. package/packages/shared-skills/skills/programming/references/typescript/oxc-lint.md +130 -0
  267. package/packages/shared-skills/skills/programming/references/typescript/tsconfig-strict.md +6 -62
  268. package/packages/shared-skills/skills/programming/scripts/typescript/check-no-excuse-rules.ts +12 -12
  269. package/packages/shared-skills/skills/programming/scripts/typescript/new-project.test.ts +162 -0
  270. package/packages/shared-skills/skills/programming/scripts/typescript/new-project.ts +20 -81
  271. package/packages/shared-skills/skills/programming/scripts/typescript/oxc/.oxfmtrc.json +9 -0
  272. package/packages/shared-skills/skills/programming/scripts/typescript/oxc/.oxlintrc.json +46 -0
  273. package/packages/shared-skills/skills/programming/scripts/typescript/oxc/lint/oxlint-plugin/LICENSE +21 -0
  274. package/packages/shared-skills/skills/programming/scripts/typescript/oxc/lint/oxlint-plugin/index.js +10 -0
  275. package/packages/shared-skills/skills/programming/scripts/typescript/oxc/lint/oxlint-plugin/no-em-dash-copy.js +28 -0
  276. package/packages/shared-skills/skills/programming/scripts/typescript/oxc/lint/oxlint-plugin/require-suppression-reason.js +62 -0
  277. package/packages/shared-skills/skills/programming/scripts/typescript/oxc/tsconfig.json +29 -0
  278. package/packages/shared-skills/skills/refactor/SKILL.md +13 -13
  279. package/packages/shared-skills/skills/ultimate-browsing/engine/AGENTS.md +1 -1
  280. package/packages/shared-skills/skills/ulw-execute/SKILL.md +1 -1
  281. package/packages/shared-skills/skills/ulw-research/AGENTS.md +21 -3
  282. package/packages/shared-skills/skills/ulw-research/SKILL.md +37 -12
  283. package/packages/shared-skills/skills/ulw-research/references/deliverable-phase.md +77 -16
  284. package/packages/shared-skills/skills/ulw-research/references/fact-ledger-grammar.md +134 -0
  285. package/packages/shared-skills/skills/ulw-research/references/fact-ledger.md +95 -0
  286. package/packages/shared-skills/skills/ulw-research/references/fidelity-claim-kinds.md +19 -0
  287. package/packages/shared-skills/skills/ulw-research/references/report-gates.md +68 -3
  288. package/packages/shared-skills/skills/ulw-research/references/report-visualization.md +2 -0
  289. package/packages/shared-skills/skills/ulw-research/references/unit-rules.md +157 -0
  290. package/packages/shared-skills/skills/ulw-research/scripts/claim-kinds.mjs +116 -0
  291. package/packages/shared-skills/skills/ulw-research/scripts/claim-kinds.test.ts +193 -0
  292. package/packages/shared-skills/skills/ulw-research/scripts/claims-index.mjs +125 -0
  293. package/packages/shared-skills/skills/ulw-research/scripts/claims-index.test.ts +149 -0
  294. package/packages/shared-skills/skills/ulw-research/scripts/cli-support.mjs +19 -5
  295. package/packages/shared-skills/skills/ulw-research/scripts/cli-support.test.ts +13 -2
  296. package/packages/shared-skills/skills/ulw-research/scripts/contracts.mjs +89 -3
  297. package/packages/shared-skills/skills/ulw-research/scripts/contracts.test.ts +100 -12
  298. package/packages/shared-skills/skills/ulw-research/scripts/copy-returns.test.ts +183 -0
  299. package/packages/shared-skills/skills/ulw-research/scripts/delivery-barrier.test.ts +245 -0
  300. package/packages/shared-skills/skills/ulw-research/scripts/fact-commands-meaning.mjs +191 -0
  301. package/packages/shared-skills/skills/ulw-research/scripts/fact-commands-verify.mjs +164 -0
  302. package/packages/shared-skills/skills/ulw-research/scripts/fact-commands.mjs +239 -0
  303. package/packages/shared-skills/skills/ulw-research/scripts/fact-derive.mjs +66 -0
  304. package/packages/shared-skills/skills/ulw-research/scripts/fact-derive.test.ts +375 -0
  305. package/packages/shared-skills/skills/ulw-research/scripts/fact-expr.mjs +108 -0
  306. package/packages/shared-skills/skills/ulw-research/scripts/fact-fill.mjs +194 -0
  307. package/packages/shared-skills/skills/ulw-research/scripts/fact-fill.test.ts +221 -0
  308. package/packages/shared-skills/skills/ulw-research/scripts/fact-ledger-grammar.test.ts +197 -0
  309. package/packages/shared-skills/skills/ulw-research/scripts/fact-ledger-kinds.mjs +250 -0
  310. package/packages/shared-skills/skills/ulw-research/scripts/fact-ledger-kinds.test.ts +156 -0
  311. package/packages/shared-skills/skills/ulw-research/scripts/fact-ledger-legacy.test.ts +160 -0
  312. package/packages/shared-skills/skills/ulw-research/scripts/fact-ledger-schema.mjs +221 -0
  313. package/packages/shared-skills/skills/ulw-research/scripts/fact-ledger-schema.test.ts +43 -0
  314. package/packages/shared-skills/skills/ulw-research/scripts/fact-ledger.mjs +123 -0
  315. package/packages/shared-skills/skills/ulw-research/scripts/fact-ledger.test.ts +254 -0
  316. package/packages/shared-skills/skills/ulw-research/scripts/fact-locate.mjs +231 -0
  317. package/packages/shared-skills/skills/ulw-research/scripts/fact-locate.test.ts +118 -0
  318. package/packages/shared-skills/skills/ulw-research/scripts/fact-pairs.mjs +187 -0
  319. package/packages/shared-skills/skills/ulw-research/scripts/fact-pairs.test.ts +167 -0
  320. package/packages/shared-skills/skills/ulw-research/scripts/fact-recompute.mjs +89 -0
  321. package/packages/shared-skills/skills/ulw-research/scripts/fact-unit-dimensions.test.ts +409 -0
  322. package/packages/shared-skills/skills/ulw-research/scripts/fact-unit-rules.test.ts +388 -0
  323. package/packages/shared-skills/skills/ulw-research/scripts/fidelity-binding.mjs +130 -0
  324. package/packages/shared-skills/skills/ulw-research/scripts/fidelity-binding.test.ts +81 -0
  325. package/packages/shared-skills/skills/ulw-research/scripts/fidelity-brief.mjs +150 -0
  326. package/packages/shared-skills/skills/ulw-research/scripts/fidelity-brief.test.ts +179 -0
  327. package/packages/shared-skills/skills/ulw-research/scripts/fidelity-claims.mjs +89 -0
  328. package/packages/shared-skills/skills/ulw-research/scripts/fidelity-lexicon.mjs +145 -0
  329. package/packages/shared-skills/skills/ulw-research/scripts/fidelity-lexicon.test.ts +117 -0
  330. package/packages/shared-skills/skills/ulw-research/scripts/fidelity-records.mjs +163 -0
  331. package/packages/shared-skills/skills/ulw-research/scripts/fidelity-state.mjs +64 -0
  332. package/packages/shared-skills/skills/ulw-research/scripts/fidelity-state.test.ts +46 -0
  333. package/packages/shared-skills/skills/ulw-research/scripts/fidelity-trace.mjs +85 -0
  334. package/packages/shared-skills/skills/ulw-research/scripts/fidelity-trace.test.ts +58 -0
  335. package/packages/shared-skills/skills/ulw-research/scripts/fidelity-values.mjs +229 -0
  336. package/packages/shared-skills/skills/ulw-research/scripts/fidelity-values.test.ts +270 -0
  337. package/packages/shared-skills/skills/ulw-research/scripts/gates-context.test.ts +64 -0
  338. package/packages/shared-skills/skills/ulw-research/scripts/gates-fidelity.mjs +113 -0
  339. package/packages/shared-skills/skills/ulw-research/scripts/gates-fidelity.test.ts +73 -0
  340. package/packages/shared-skills/skills/ulw-research/scripts/gates-static.mjs +29 -9
  341. package/packages/shared-skills/skills/ulw-research/scripts/gates-structure.mjs +1 -1
  342. package/packages/shared-skills/skills/ulw-research/scripts/gates-text.mjs +1 -27
  343. package/packages/shared-skills/skills/ulw-research/scripts/html-lite.mjs +2 -2
  344. package/packages/shared-skills/skills/ulw-research/scripts/html-markup.mjs +182 -0
  345. package/packages/shared-skills/skills/ulw-research/scripts/lexicon.mjs +47 -0
  346. package/packages/shared-skills/skills/ulw-research/scripts/lexicon.test.ts +57 -0
  347. package/packages/shared-skills/skills/ulw-research/scripts/md-lite.mjs +193 -0
  348. package/packages/shared-skills/skills/ulw-research/scripts/md-lite.test.ts +271 -0
  349. package/packages/shared-skills/skills/ulw-research/scripts/meaning-check.mjs +196 -0
  350. package/packages/shared-skills/skills/ulw-research/scripts/meaning-check.test.ts +228 -0
  351. package/packages/shared-skills/skills/ulw-research/scripts/numerals.mjs +226 -0
  352. package/packages/shared-skills/skills/ulw-research/scripts/numerals.test.ts +120 -0
  353. package/packages/shared-skills/skills/ulw-research/scripts/outcome.mjs +8 -8
  354. package/packages/shared-skills/skills/ulw-research/scripts/outcome.test.ts +29 -0
  355. package/packages/shared-skills/skills/ulw-research/scripts/particles-ko.mjs +108 -0
  356. package/packages/shared-skills/skills/ulw-research/scripts/particles-ko.test.ts +86 -0
  357. package/packages/shared-skills/skills/ulw-research/scripts/placeholder.mjs +184 -0
  358. package/packages/shared-skills/skills/ulw-research/scripts/placeholder.test.ts +77 -0
  359. package/packages/shared-skills/skills/ulw-research/scripts/polish-apply.mjs +115 -0
  360. package/packages/shared-skills/skills/ulw-research/scripts/polish-apply.test.ts +363 -0
  361. package/packages/shared-skills/skills/ulw-research/scripts/polish-diff.mjs +31 -0
  362. package/packages/shared-skills/skills/ulw-research/scripts/polish-diff.test.ts +168 -0
  363. package/packages/shared-skills/skills/ulw-research/scripts/polish-markup.test.ts +187 -0
  364. package/packages/shared-skills/skills/ulw-research/scripts/polish-project.mjs +125 -0
  365. package/packages/shared-skills/skills/ulw-research/scripts/polish-rules.mjs +170 -0
  366. package/packages/shared-skills/skills/ulw-research/scripts/rational.mjs +139 -0
  367. package/packages/shared-skills/skills/ulw-research/scripts/rational.test.ts +46 -0
  368. package/packages/shared-skills/skills/ulw-research/scripts/report-tools-commands.mjs +21 -10
  369. package/packages/shared-skills/skills/ulw-research/scripts/report-tools.mjs +15 -0
  370. package/packages/shared-skills/skills/ulw-research/scripts/report-tools.test.ts +458 -2
  371. package/packages/shared-skills/skills/ulw-research/scripts/sentence-split.mjs +77 -0
  372. package/packages/shared-skills/skills/ulw-research/scripts/sentence-split.test.ts +109 -0
  373. package/packages/shared-skills/skills/ulw-research/scripts/source-commands.mjs +140 -0
  374. package/packages/shared-skills/skills/ulw-research/scripts/source-snapshot.mjs +176 -0
  375. package/packages/shared-skills/skills/ulw-research/scripts/source-snapshot.test.ts +113 -0
  376. package/packages/shared-skills/skills/ulw-research/scripts/tests/fixtures/fidelity/assets/share.csv +3 -0
  377. package/packages/shared-skills/skills/ulw-research/scripts/tests/fixtures/fidelity/claim-graph.md +13 -0
  378. package/packages/shared-skills/skills/ulw-research/scripts/tests/fixtures/fidelity/gen-legacy-dev.mjs +89 -0
  379. package/packages/shared-skills/skills/ulw-research/scripts/tests/fixtures/fidelity/ledger-basic.json +223 -0
  380. package/packages/shared-skills/skills/ulw-research/scripts/tests/fixtures/fidelity/ledger-legacy-dev.json +859 -0
  381. package/packages/shared-skills/skills/ulw-research/scripts/tests/fixtures/fidelity/ledger-verify.json +420 -0
  382. package/packages/shared-skills/skills/ulw-research/scripts/tests/fixtures/fidelity/report-bad.html +19 -0
  383. package/packages/shared-skills/skills/ulw-research/scripts/tests/fixtures/fidelity/report-good.html +39 -0
  384. package/packages/shared-skills/skills/ulw-research/scripts/tests/fixtures/fidelity/sources/S4/acronyms.json +3 -0
  385. package/packages/shared-skills/skills/ulw-research/scripts/tests/fixtures/fidelity/sources/S4/meta.json +9 -0
  386. package/packages/shared-skills/skills/ulw-research/scripts/tests/fixtures/fidelity/sources/S4/sentences.jsonl +7 -0
  387. package/packages/shared-skills/skills/ulw-research/scripts/tests/fixtures/fidelity/sources/S4/text.txt +7 -0
  388. package/packages/shared-skills/skills/ulw-research/scripts/tests/fixtures/fidelity/sources/S4.html +19 -0
  389. package/packages/shared-skills/skills/ulw-research/scripts/tests/fixtures/fidelity/sources/S5/acronyms.json +1 -0
  390. package/packages/shared-skills/skills/ulw-research/scripts/tests/fixtures/fidelity/sources/S5/meta.json +9 -0
  391. package/packages/shared-skills/skills/ulw-research/scripts/tests/fixtures/fidelity/sources/S5/sentences.jsonl +1 -0
  392. package/packages/shared-skills/skills/ulw-research/scripts/tests/fixtures/fidelity/sources/S5/text.txt +1 -0
  393. package/packages/shared-skills/skills/ulw-research/scripts/tests/fixtures/fidelity/sources/S9.txt +1 -0
  394. package/packages/shared-skills/skills/ulw-research/scripts/tests/fixtures/fidelity-brief-locked.md +17 -0
  395. package/packages/shared-skills/skills/ulw-research/scripts/tests/fixtures/fidelity-brief-pending.md +17 -0
  396. package/packages/shared-skills/skills/ulw-research/scripts/text-normalize.mjs +82 -0
  397. package/packages/shared-skills/skills/ulw-research/scripts/text-normalize.test.ts +73 -0
  398. package/packages/shared-skills/skills/ulw-research/scripts/text-similarity.mjs +28 -0
  399. package/packages/shared-skills/skills/ulw-research/scripts/text-similarity.test.ts +38 -0
  400. package/packages/shared-skills/skills/ulw-research/scripts/unit-algebra.mjs +101 -0
  401. package/packages/shared-skills/skills/ulw-research/scripts/unit-errors.mjs +23 -0
  402. package/packages/shared-skills/skills/ulw-research/scripts/unit-metadata.mjs +31 -0
  403. package/packages/shared-skills/skills/ulw-research/scripts/unit-pairs.mjs +72 -0
  404. package/packages/shared-skills/skills/ulw-research/scripts/unit-precision.mjs +44 -0
  405. package/packages/shared-skills/skills/ulw-research/scripts/unit-rules-shapes.mjs +64 -0
  406. package/packages/shared-skills/skills/ulw-research/scripts/unit-rules.mjs +173 -0
  407. package/packages/shared-skills/skills/ulw-research/scripts/units.mjs +105 -0
  408. package/packages/shared-skills/skills/ulw-research/scripts/units.test.ts +83 -0
  409. package/packages/shared-skills/skills/visual-qa/SKILL.md +70 -63
  410. package/packages/shared-skills/skills/visual-qa/scripts/skill-doc-fields.test.ts +34 -0
  411. package/script/qa/web-terminal-visual-qa.mjs +6 -2
  412. package/script/qa/xterm-live-terminal.mjs +26 -3
@@ -2133,7 +2133,7 @@ var package_default;
2133
2133
  var init_package = __esm(() => {
2134
2134
  package_default = {
2135
2135
  name: "oh-my-opencode",
2136
- version: "5.1.44",
2136
+ version: "5.1.46",
2137
2137
  description: "The Best AI Agent Harness - Batteries-Included OpenCode Plugin with Multi-Model Orchestration, Parallel Background Agents, and Crafted LSP/AST Tools",
2138
2138
  main: "./dist/index.js",
2139
2139
  types: "dist/index.d.ts",
@@ -2253,6 +2253,8 @@ var init_package = __esm(() => {
2253
2253
  "build:senpi-plugin": "bun run build:lsp-daemon && bun run build:ast-grep-mcp && bun run build:senpi-plugin:stage",
2254
2254
  "build:senpi-plugin:native": "node packages/omo-senpi/plugin/scripts/stage-lsp-daemon-runtime.mjs && node packages/omo-senpi/plugin/scripts/stage-ast-grep-mcp-runtime.mjs && node packages/omo-senpi/plugin/scripts/stage-x-search-skill.mjs && node packages/omo-senpi/plugin/scripts/build-extension.mjs && node packages/omo-senpi/plugin/scripts/build-daemon-launch-spec.mjs && node packages/omo-senpi/plugin/scripts/sync-skills.mjs && node packages/omo-senpi/plugin/scripts/embed-directive.mjs --check && node packages/omo-senpi/plugin/scripts/build-install.mjs",
2255
2255
  "build:senpi-plugin:stage": "bun run build:materialize-frontend && node packages/omo-senpi/plugin/scripts/stage-lsp-daemon-runtime.mjs && node packages/omo-senpi/plugin/scripts/stage-ast-grep-mcp-runtime.mjs && node packages/omo-senpi/plugin/scripts/stage-x-search-skill.mjs && node packages/omo-senpi/plugin/scripts/build-extension.mjs && node packages/omo-senpi/plugin/scripts/build-daemon-launch-spec.mjs && node packages/omo-senpi/plugin/scripts/sync-skills.mjs && node packages/omo-senpi/plugin/scripts/embed-directive.mjs --check && node packages/omo-senpi/plugin/scripts/build-install.mjs",
2256
+ "bundle-inputs": "node packages/omo-senpi/plugin/scripts/bundle-inputs.mjs",
2257
+ "bundle-inputs:check": "node packages/omo-senpi/plugin/scripts/bundle-inputs.mjs --check",
2256
2258
  "build:materialize-frontend": "node packages/omo-codex/plugin/scripts/materialize-shared-upstreams.mjs --strict",
2257
2259
  "build:shared-skills-assets": "bun run build:materialize-frontend && rm -rf dist/skills && cp -R packages/shared-skills/skills dist/skills",
2258
2260
  "build:lsp-tools-mcp": "npm --prefix packages/lsp-tools-mcp ci && npm --prefix packages/lsp-tools-mcp run build",
@@ -2271,7 +2273,8 @@ var init_package = __esm(() => {
2271
2273
  postinstall: "node postinstall.mjs",
2272
2274
  prepublishOnly: "bun run clean && bun run build:lsp-tools-mcp && bun run build:lsp-daemon && bun run build",
2273
2275
  "test:model-capabilities": "bun test --timeout 20000 packages/model-core/src/model-capability-aliases.test.ts packages/model-core/src/model-capability-guardrails.test.ts packages/model-core/src/model-capabilities.test.ts packages/omo-opencode/src/cli/doctor/checks/model-resolution.test.ts --bail",
2274
- typecheck: "tsgo --noEmit && bun run typecheck:script && bun run typecheck:packages",
2276
+ "check:copy": "bun script/check-copy.ts",
2277
+ typecheck: "bun run check:copy && tsgo --noEmit && bun run typecheck:script && bun run typecheck:packages",
2275
2278
  "typecheck:packages": "tsgo --noEmit -p packages/rules-engine/tsconfig.json && tsgo --noEmit -p packages/delegate-core/tsconfig.json && tsgo --noEmit -p packages/mcp-stdio-core/tsconfig.json && tsgo --noEmit -p packages/mcp-client-core/tsconfig.json && tsgo --noEmit -p packages/git-bash-mcp/tsconfig.json && tsgo --noEmit -p packages/ast-grep-mcp/tsconfig.json && tsgo --noEmit -p packages/lsp-core/tsconfig.json && tsgo --noEmit -p packages/utils/tsconfig.json && tsgo --noEmit -p packages/model-core/tsconfig.json && tsgo --noEmit -p packages/omo-config-core/tsconfig.json && tsgo --noEmit -p packages/prompts-core/tsconfig.json && tsgo --noEmit -p packages/comment-checker-core/tsconfig.json && tsgo --noEmit -p packages/hashline-core/tsconfig.json && tsgo --noEmit -p packages/tmux-core/tsconfig.json && tsgo --noEmit -p packages/team-core/tsconfig.json && tsgo --noEmit -p packages/openclaw-core/tsconfig.json && tsgo --noEmit -p packages/boulder-state/tsconfig.json && tsgo --noEmit -p packages/isolation-core/tsconfig.json && tsgo --noEmit -p packages/memory-core/tsconfig.json && tsgo --noEmit -p packages/telemetry-core/tsconfig.json && tsgo --noEmit -p packages/claude-code-compat-core/tsconfig.json && tsgo --noEmit -p packages/skills-loader-core/tsconfig.json && tsgo --noEmit -p packages/agents-md-core/tsconfig.json && tsgo --noEmit -p packages/omo-codex/plugin/shared/tsconfig.json && tsgo --noEmit -p packages/omo-codex/tsconfig.json && tsgo --noEmit -p packages/omo-senpi/tsconfig.json && tsgo --noEmit -p packages/senpi-task/tsconfig.json && tsgo --noEmit -p packages/omo-opencode/tsconfig.json && tsgo --noEmit -p packages/omo-native/tsconfig.json && tsgo --noEmit -p packages/senpi-desktop-protocol/tsconfig.json && tsgo --noEmit -p packages/senpi-desktop-engine/tsconfig.json && tsgo --noEmit -p packages/senpi-desktop-prelude/tsconfig.json && tsgo --noEmit -p packages/senpi-desktop-service/tsconfig.json && tsgo --noEmit -p packages/senpi-desktop-tool/tsconfig.json",
2276
2279
  "typecheck:script": "tsgo --noEmit -p script/tsconfig.json",
2277
2280
  test: "bun test --timeout 20000",
@@ -2282,7 +2285,10 @@ var init_package = __esm(() => {
2282
2285
  "test:windows-codex": "bun run test:codex",
2283
2286
  "build:git-bash-mcp": "bun run --cwd packages/git-bash-mcp build",
2284
2287
  "build:ast-grep-mcp": "bun run --cwd packages/ast-grep-mcp build",
2285
- "test:desktop": "bun script/check-cargo-pinned-deps.mjs && bun run --cwd packages/senpi-desktop-protocol test && bun run --cwd packages/senpi-desktop-engine test && bun run --cwd packages/senpi-desktop-prelude test && bun run --cwd packages/senpi-desktop-service test && bun run --cwd packages/senpi-desktop-tool test"
2288
+ "test:desktop": "bun script/check-cargo-pinned-deps.mjs && bun run --cwd packages/senpi-desktop-protocol test && bun run --cwd packages/senpi-desktop-engine test && bun run --cwd packages/senpi-desktop-prelude test && bun run --cwd packages/senpi-desktop-service test && bun run --cwd packages/senpi-desktop-tool test",
2289
+ "lint:ratchet": "bun script/lint-ratchet.ts",
2290
+ "lint:ratchet:update": "bun script/lint-ratchet.ts --update",
2291
+ lint: "bun run check:copy && oxlint packages/lsp-tools-mcp packages/lsp-daemon packages/web packages/omo-codex/plugin/components/comment-checker packages/omo-codex/plugin/components/lazycodex-executor-verify packages/omo-codex/plugin/components/lsp packages/omo-codex/plugin/components/rules packages/omo-codex/plugin/components/telemetry packages/omo-codex/plugin/components/ultrawork packages/omo-codex/plugin/components/ulw-execute-continuation packages/omo-codex/plugin/components/ulw-loop"
2286
2292
  },
2287
2293
  keywords: [
2288
2294
  "opencode",
@@ -2310,7 +2316,7 @@ var init_package = __esm(() => {
2310
2316
  },
2311
2317
  devDependencies: {
2312
2318
  "@clack/prompts": "^1.8.1",
2313
- "@code-yeongyu/senpi": "2026.10.21-3",
2319
+ "@code-yeongyu/senpi": "2026.10.23-1",
2314
2320
  "@modelcontextprotocol/sdk": "^1.30.0",
2315
2321
  "@oh-my-opencode/agents-md-core": "workspace:*",
2316
2322
  "@oh-my-opencode/ast-grep-mcp": "workspace:*",
@@ -2364,6 +2370,8 @@ var init_package = __esm(() => {
2364
2370
  "jsonc-parser": "^3.3.1",
2365
2371
  "node-pty": "^1.1.0",
2366
2372
  omowright: "github:code-yeongyu/omowright#f87ef4d63fe7b56fe117dbab246c8ad88dd8a780",
2373
+ "oxc-parser": "0.148.0",
2374
+ oxlint: "1.89.0",
2367
2375
  picocolors: "^1.1.1",
2368
2376
  picomatch: "^4.0.7",
2369
2377
  "posthog-node": "^5.52.4",
@@ -2371,18 +2379,18 @@ var init_package = __esm(() => {
2371
2379
  typescript: "^7.0.2"
2372
2380
  },
2373
2381
  optionalDependencies: {
2374
- "oh-my-opencode-darwin-arm64": "5.1.44",
2375
- "oh-my-opencode-darwin-x64": "5.1.44",
2376
- "oh-my-opencode-darwin-x64-baseline": "5.1.44",
2377
- "oh-my-opencode-linux-arm64": "5.1.44",
2378
- "oh-my-opencode-linux-arm64-musl": "5.1.44",
2379
- "oh-my-opencode-linux-x64": "5.1.44",
2380
- "oh-my-opencode-linux-x64-baseline": "5.1.44",
2381
- "oh-my-opencode-linux-x64-musl": "5.1.44",
2382
- "oh-my-opencode-linux-x64-musl-baseline": "5.1.44",
2383
- "oh-my-opencode-windows-arm64": "5.1.44",
2384
- "oh-my-opencode-windows-x64": "5.1.44",
2385
- "oh-my-opencode-windows-x64-baseline": "5.1.44"
2382
+ "oh-my-opencode-darwin-arm64": "5.1.46",
2383
+ "oh-my-opencode-darwin-x64": "5.1.46",
2384
+ "oh-my-opencode-darwin-x64-baseline": "5.1.46",
2385
+ "oh-my-opencode-linux-arm64": "5.1.46",
2386
+ "oh-my-opencode-linux-arm64-musl": "5.1.46",
2387
+ "oh-my-opencode-linux-x64": "5.1.46",
2388
+ "oh-my-opencode-linux-x64-baseline": "5.1.46",
2389
+ "oh-my-opencode-linux-x64-musl": "5.1.46",
2390
+ "oh-my-opencode-linux-x64-musl-baseline": "5.1.46",
2391
+ "oh-my-opencode-windows-arm64": "5.1.46",
2392
+ "oh-my-opencode-windows-x64": "5.1.46",
2393
+ "oh-my-opencode-windows-x64-baseline": "5.1.46"
2386
2394
  },
2387
2395
  overrides: {
2388
2396
  hono: "^4.13.8",
@@ -7544,6 +7552,20 @@ var init_logger = __esm(() => {
7544
7552
  DEFAULT_MAX_LOG_FILE_SIZE_BYTES = 50 * 1024 * 1024;
7545
7553
  });
7546
7554
 
7555
+ // packages/utils/src/logging/product-identity.ts
7556
+ function createProductIdentity(input) {
7557
+ return {
7558
+ pluginName: input.pluginName,
7559
+ legacyPluginName: input.legacyPluginName,
7560
+ publishedPackageName: input.publishedPackageName,
7561
+ acceptedPackageNames: input.acceptedPackageNames ?? [input.publishedPackageName, input.pluginName],
7562
+ configBasename: input.configBasename,
7563
+ legacyConfigBasename: input.legacyConfigBasename,
7564
+ logFileName: input.logFileName,
7565
+ cacheDirName: input.cacheDirName
7566
+ };
7567
+ }
7568
+
7547
7569
  // packages/utils/src/logging/index.ts
7548
7570
  var init_logging = __esm(() => {
7549
7571
  init_logger();
@@ -7964,8 +7986,17 @@ function classifyPathEnvironment(absolutePath) {
7964
7986
  }
7965
7987
  var init_classify_path_environment = () => {};
7966
7988
 
7989
+ // packages/utils/src/command-executor/home-directory.ts
7990
+ import { homedir as homedir3 } from "node:os";
7991
+ function getHomeDirectory() {
7992
+ return process.env.HOME || process.env.USERPROFILE || homedir3();
7993
+ }
7994
+ var init_home_directory = () => {};
7995
+
7967
7996
  // packages/utils/src/command-executor.ts
7968
- var init_command_executor = () => {};
7997
+ var init_command_executor = __esm(() => {
7998
+ init_home_directory();
7999
+ });
7969
8000
 
7970
8001
  // packages/utils/src/git-worktree/index.ts
7971
8002
  var init_git_worktree = () => {};
@@ -8008,6 +8039,25 @@ var init_internal_initiator_marker = __esm(() => {
8008
8039
  INTERNAL_NOREPLY_MARKER_DETECT_PATTERN = /<!--\s*OMO_INTERNAL_NOREPLY\s*-->/;
8009
8040
  });
8010
8041
 
8042
+ // packages/model-core/src/latest-models.ts
8043
+ var LATEST_MODEL_BY_FAMILY;
8044
+ var init_latest_models = __esm(() => {
8045
+ LATEST_MODEL_BY_FAMILY = {
8046
+ claudeOpus: "claude-opus-5-5",
8047
+ claudeSonnet: "claude-sonnet-5-5",
8048
+ claudeHaiku: "claude-haiku-5-5",
8049
+ claudeFable: "claude-fable-5-1",
8050
+ gptAstra: "gpt-6-astra",
8051
+ gptSol: "gpt-6.1-sol",
8052
+ gptSolFast: "gpt-6.1-sol-fast",
8053
+ gptLunaFast: "gpt-6-luna-fast",
8054
+ glm: "glm-5.3",
8055
+ glmFlash: "glm-5.3-flash",
8056
+ kimi: "kimi-k3",
8057
+ geminiPro: "gemini-4-argon"
8058
+ };
8059
+ });
8060
+
8011
8061
  // packages/utils/src/migration/agent-category.ts
8012
8062
  function configureMigrationCategoryDefaults(defaults) {
8013
8063
  categoryDefaults = defaults ?? {};
@@ -9264,17 +9314,18 @@ var init_file_reference_resolver = __esm(() => {
9264
9314
  // packages/model-core/src/agent-model-requirements.ts
9265
9315
  var AGENT_MODEL_REQUIREMENTS;
9266
9316
  var init_agent_model_requirements = __esm(() => {
9317
+ init_latest_models();
9267
9318
  AGENT_MODEL_REQUIREMENTS = {
9268
9319
  sisyphus: {
9269
9320
  fallbackChain: [
9270
9321
  {
9271
9322
  providers: ["anthropic", "github-copilot", "opencode"],
9272
- model: "claude-opus-5-5",
9323
+ model: LATEST_MODEL_BY_FAMILY.claudeOpus,
9273
9324
  variant: "max"
9274
9325
  },
9275
9326
  {
9276
9327
  providers: ["opencode-go", "kimi-for-coding", "moonshotai", "opencode", "bailian-coding-plan", "moonshotai-cn", "firmware", "ollama-cloud", "aihubmix"],
9277
- model: "kimi-k3"
9328
+ model: LATEST_MODEL_BY_FAMILY.kimi
9278
9329
  },
9279
9330
  {
9280
9331
  providers: ["openai", "chatgpt-subscription", "github-copilot", "opencode"],
@@ -9308,7 +9359,7 @@ var init_agent_model_requirements = __esm(() => {
9308
9359
  { providers: ["github-copilot"], model: "gpt-5.6-sol", variant: "high" },
9309
9360
  {
9310
9361
  providers: ["google", "google-vertex", "opencode"],
9311
- model: "gemini-4-argon",
9362
+ model: LATEST_MODEL_BY_FAMILY.geminiPro,
9312
9363
  variant: "high"
9313
9364
  },
9314
9365
  {
@@ -9318,7 +9369,7 @@ var init_agent_model_requirements = __esm(() => {
9318
9369
  },
9319
9370
  {
9320
9371
  providers: ["anthropic", "github-copilot", "opencode"],
9321
- model: "claude-opus-5-5",
9372
+ model: LATEST_MODEL_BY_FAMILY.claudeOpus,
9322
9373
  variant: "max"
9323
9374
  },
9324
9375
  { providers: ["opencode-go"], model: "glm-5.2" }
@@ -9327,8 +9378,8 @@ var init_agent_model_requirements = __esm(() => {
9327
9378
  librarian: {
9328
9379
  fallbackChain: [
9329
9380
  { providers: ["kimi-for-coding"], model: "kimi-for-coding-highspeed", variant: "off" },
9330
- { providers: ["openai", "chatgpt-subscription"], model: "gpt-6-luna-fast", variant: "low" },
9331
- { providers: ["anthropic", "github-copilot"], model: "claude-haiku-5-5", variant: "medium" },
9381
+ { providers: ["openai", "chatgpt-subscription"], model: LATEST_MODEL_BY_FAMILY.gptLunaFast, variant: "low" },
9382
+ { providers: ["anthropic", "github-copilot"], model: LATEST_MODEL_BY_FAMILY.claudeHaiku, variant: "medium" },
9332
9383
  { providers: ["deepseek"], model: "deepseek-flash", variant: "max" },
9333
9384
  { providers: ["opencode-go", "bailian-coding-plan"], model: "qwen3.7-plus" },
9334
9385
  { providers: ["opencode-go"], model: "minimax-m2.7" }
@@ -9337,8 +9388,8 @@ var init_agent_model_requirements = __esm(() => {
9337
9388
  explore: {
9338
9389
  fallbackChain: [
9339
9390
  { providers: ["kimi-for-coding"], model: "kimi-for-coding-highspeed", variant: "off" },
9340
- { providers: ["openai", "chatgpt-subscription"], model: "gpt-6-luna-fast", variant: "low" },
9341
- { providers: ["anthropic", "github-copilot"], model: "claude-haiku-5-5", variant: "medium" },
9391
+ { providers: ["openai", "chatgpt-subscription"], model: LATEST_MODEL_BY_FAMILY.gptLunaFast, variant: "low" },
9392
+ { providers: ["anthropic", "github-copilot"], model: LATEST_MODEL_BY_FAMILY.claudeHaiku, variant: "medium" },
9342
9393
  { providers: ["deepseek"], model: "deepseek-flash", variant: "max" },
9343
9394
  { providers: ["opencode-go", "bailian-coding-plan"], model: "qwen3.7-plus" },
9344
9395
  { providers: ["opencode-go"], model: "minimax-m2.7" }
@@ -9347,7 +9398,7 @@ var init_agent_model_requirements = __esm(() => {
9347
9398
  "multimodal-looker": {
9348
9399
  fallbackChain: [
9349
9400
  { providers: ["openai", "chatgpt-subscription", "opencode"], model: "gpt-5.6-sol", variant: "low" },
9350
- { providers: ["opencode-go"], model: "kimi-k3" },
9401
+ { providers: ["opencode-go"], model: LATEST_MODEL_BY_FAMILY.kimi },
9351
9402
  { providers: ["zai-coding-plan"], model: "glm-4.6v" },
9352
9403
  { providers: ["openai", "chatgpt-subscription", "github-copilot", "opencode"], model: "gpt-5-nano" }
9353
9404
  ]
@@ -9356,17 +9407,17 @@ var init_agent_model_requirements = __esm(() => {
9356
9407
  fallbackChain: [
9357
9408
  {
9358
9409
  providers: ["anthropic", "github-copilot", "opencode"],
9359
- model: "claude-fable-5-1",
9410
+ model: LATEST_MODEL_BY_FAMILY.claudeFable,
9360
9411
  variant: "xhigh"
9361
9412
  },
9362
9413
  {
9363
9414
  providers: ["anthropic", "github-copilot", "opencode"],
9364
- model: "claude-opus-5-5",
9415
+ model: LATEST_MODEL_BY_FAMILY.claudeOpus,
9365
9416
  variant: "max"
9366
9417
  },
9367
9418
  {
9368
9419
  providers: ["opencode-go", "kimi-for-coding", "moonshotai", "opencode"],
9369
- model: "kimi-k3",
9420
+ model: LATEST_MODEL_BY_FAMILY.kimi,
9370
9421
  variant: "max"
9371
9422
  }
9372
9423
  ]
@@ -9375,34 +9426,34 @@ var init_agent_model_requirements = __esm(() => {
9375
9426
  fallbackChain: [
9376
9427
  {
9377
9428
  providers: ["anthropic", "github-copilot", "opencode"],
9378
- model: "claude-fable-5-1",
9429
+ model: LATEST_MODEL_BY_FAMILY.claudeFable,
9379
9430
  variant: "max"
9380
9431
  },
9381
9432
  {
9382
9433
  providers: ["anthropic", "github-copilot", "opencode"],
9383
- model: "claude-opus-5-5",
9434
+ model: LATEST_MODEL_BY_FAMILY.claudeOpus,
9384
9435
  variant: "max"
9385
9436
  },
9386
9437
  {
9387
9438
  providers: ["opencode-go", "kimi-for-coding", "moonshotai", "opencode"],
9388
- model: "kimi-k3",
9439
+ model: LATEST_MODEL_BY_FAMILY.kimi,
9389
9440
  variant: "max"
9390
9441
  }
9391
9442
  ]
9392
9443
  },
9393
9444
  momus: {
9394
9445
  fallbackChain: [
9395
- { providers: ["openai", "chatgpt-subscription"], model: "gpt-6-astra", variant: "xhigh" },
9396
- { providers: ["github-copilot"], model: "gpt-6-astra", variant: "high" },
9397
- { providers: ["openai", "chatgpt-subscription", "opencode"], model: "gpt-6-astra", variant: "high" },
9446
+ { providers: ["openai", "chatgpt-subscription"], model: LATEST_MODEL_BY_FAMILY.gptAstra, variant: "xhigh" },
9447
+ { providers: ["github-copilot"], model: LATEST_MODEL_BY_FAMILY.gptAstra, variant: "high" },
9448
+ { providers: ["openai", "chatgpt-subscription", "opencode"], model: LATEST_MODEL_BY_FAMILY.gptAstra, variant: "high" },
9398
9449
  {
9399
9450
  providers: ["anthropic", "github-copilot", "opencode"],
9400
- model: "claude-opus-5-5",
9451
+ model: LATEST_MODEL_BY_FAMILY.claudeOpus,
9401
9452
  variant: "max"
9402
9453
  },
9403
9454
  {
9404
9455
  providers: ["google", "google-vertex", "opencode"],
9405
- model: "gemini-4-argon",
9456
+ model: LATEST_MODEL_BY_FAMILY.geminiPro,
9406
9457
  variant: "high"
9407
9458
  },
9408
9459
  {
@@ -9416,7 +9467,7 @@ var init_agent_model_requirements = __esm(() => {
9416
9467
  atlas: {
9417
9468
  fallbackChain: [
9418
9469
  { providers: ["anthropic", "github-copilot", "opencode"], model: "claude-sonnet-5" },
9419
- { providers: ["opencode-go"], model: "kimi-k3" },
9470
+ { providers: ["opencode-go"], model: LATEST_MODEL_BY_FAMILY.kimi },
9420
9471
  {
9421
9472
  providers: ["openai", "chatgpt-subscription", "github-copilot", "opencode"],
9422
9473
  model: "gpt-5.6-sol",
@@ -9430,7 +9481,7 @@ var init_agent_model_requirements = __esm(() => {
9430
9481
  "sisyphus-junior": {
9431
9482
  fallbackChain: [
9432
9483
  { providers: ["anthropic", "github-copilot", "opencode"], model: "claude-sonnet-5" },
9433
- { providers: ["opencode-go"], model: "kimi-k3" },
9484
+ { providers: ["opencode-go"], model: LATEST_MODEL_BY_FAMILY.kimi },
9434
9485
  {
9435
9486
  providers: ["openai", "chatgpt-subscription", "github-copilot", "opencode"],
9436
9487
  model: "gpt-5.6-sol",
@@ -9448,32 +9499,33 @@ var init_agent_model_requirements = __esm(() => {
9448
9499
  // packages/model-core/src/category-model-requirements.ts
9449
9500
  var CATEGORY_MODEL_REQUIREMENTS;
9450
9501
  var init_category_model_requirements = __esm(() => {
9502
+ init_latest_models();
9451
9503
  CATEGORY_MODEL_REQUIREMENTS = {
9452
9504
  "visual-engineering": {
9453
9505
  fallbackChain: [
9454
- { providers: ["google", "google-vertex", "opencode"], model: "gemini-4-argon", variant: "low" },
9506
+ { providers: ["google", "google-vertex", "opencode"], model: LATEST_MODEL_BY_FAMILY.geminiPro, variant: "low" },
9455
9507
  {
9456
9508
  providers: ["anthropic", "anthropic-api", "github-copilot", "opencode"],
9457
- model: "claude-fable-5-1",
9509
+ model: LATEST_MODEL_BY_FAMILY.claudeFable,
9458
9510
  variant: "max"
9459
9511
  },
9460
9512
  {
9461
9513
  providers: ["anthropic", "anthropic-api", "github-copilot", "opencode"],
9462
- model: "claude-opus-5-5",
9514
+ model: LATEST_MODEL_BY_FAMILY.claudeOpus,
9463
9515
  variant: "max"
9464
9516
  },
9465
9517
  {
9466
9518
  providers: ["kimi-for-coding", "moonshotai", "opencode-go", "opencode"],
9467
- model: "kimi-k3",
9519
+ model: LATEST_MODEL_BY_FAMILY.kimi,
9468
9520
  variant: "max"
9469
9521
  }
9470
9522
  ]
9471
9523
  },
9472
9524
  ultrabrain: {
9473
9525
  fallbackChain: [
9474
- { providers: ["openai", "chatgpt-subscription"], model: "gpt-6-astra", variant: "max" },
9475
- { providers: ["github-copilot"], model: "gpt-6-astra", variant: "max" },
9476
- { providers: ["openai", "chatgpt-subscription", "opencode"], model: "gpt-6-astra", variant: "max" },
9526
+ { providers: ["openai", "chatgpt-subscription"], model: LATEST_MODEL_BY_FAMILY.gptAstra, variant: "max" },
9527
+ { providers: ["github-copilot"], model: LATEST_MODEL_BY_FAMILY.gptAstra, variant: "max" },
9528
+ { providers: ["openai", "chatgpt-subscription", "opencode"], model: LATEST_MODEL_BY_FAMILY.gptAstra, variant: "max" },
9477
9529
  { providers: ["openai", "chatgpt-subscription"], model: "gpt-5.6-sol", variant: "max" },
9478
9530
  { providers: ["github-copilot"], model: "gpt-5.6-sol", variant: "max" },
9479
9531
  { providers: ["openai", "chatgpt-subscription", "opencode"], model: "gpt-5.6-sol", variant: "max" }
@@ -9481,8 +9533,8 @@ var init_category_model_requirements = __esm(() => {
9481
9533
  },
9482
9534
  "deep-low": {
9483
9535
  fallbackChain: [
9484
- { providers: ["openai", "chatgpt-subscription"], model: "gpt-6.1-sol", variant: "medium" },
9485
- { providers: ["openai", "chatgpt-subscription"], model: "gpt-6.1-sol-fast", variant: "medium" },
9536
+ { providers: ["openai", "chatgpt-subscription"], model: LATEST_MODEL_BY_FAMILY.gptSol, variant: "medium" },
9537
+ { providers: ["openai", "chatgpt-subscription"], model: LATEST_MODEL_BY_FAMILY.gptSolFast, variant: "medium" },
9486
9538
  {
9487
9539
  providers: ["openai", "chatgpt-subscription", "github-copilot", "opencode"],
9488
9540
  model: "gpt-5.6-sol",
@@ -9495,7 +9547,7 @@ var init_category_model_requirements = __esm(() => {
9495
9547
  fallbackChain: [
9496
9548
  {
9497
9549
  providers: ["openai", "chatgpt-subscription", "github-copilot", "opencode"],
9498
- model: "gpt-6-astra",
9550
+ model: LATEST_MODEL_BY_FAMILY.gptAstra,
9499
9551
  variant: "high"
9500
9552
  }
9501
9553
  ]
@@ -9504,27 +9556,27 @@ var init_category_model_requirements = __esm(() => {
9504
9556
  fallbackChain: [
9505
9557
  {
9506
9558
  providers: ["anthropic", "anthropic-api", "github-copilot", "opencode"],
9507
- model: "claude-fable-5-1",
9559
+ model: LATEST_MODEL_BY_FAMILY.claudeFable,
9508
9560
  variant: "max"
9509
9561
  },
9510
9562
  {
9511
9563
  providers: ["anthropic", "anthropic-api", "github-copilot", "opencode"],
9512
- model: "claude-opus-5-5",
9564
+ model: LATEST_MODEL_BY_FAMILY.claudeOpus,
9513
9565
  variant: "max"
9514
9566
  },
9515
9567
  {
9516
9568
  providers: ["kimi-for-coding", "moonshotai", "opencode-go", "opencode"],
9517
- model: "kimi-k3",
9569
+ model: LATEST_MODEL_BY_FAMILY.kimi,
9518
9570
  variant: "max"
9519
9571
  }
9520
9572
  ]
9521
9573
  },
9522
9574
  quick: {
9523
9575
  fallbackChain: [
9524
- { providers: ["openai", "chatgpt-subscription"], model: "gpt-6-luna-fast", variant: "low" },
9576
+ { providers: ["openai", "chatgpt-subscription"], model: LATEST_MODEL_BY_FAMILY.gptLunaFast, variant: "low" },
9525
9577
  {
9526
9578
  providers: ["anthropic", "anthropic-api", "github-copilot"],
9527
- model: "claude-haiku-5-5",
9579
+ model: LATEST_MODEL_BY_FAMILY.claudeHaiku,
9528
9580
  variant: "medium"
9529
9581
  },
9530
9582
  { providers: ["deepseek"], model: "deepseek-flash", variant: "off" },
@@ -9536,7 +9588,7 @@ var init_category_model_requirements = __esm(() => {
9536
9588
  { providers: ["opencode-go"], model: "minimax-m3", variant: "max" },
9537
9589
  { providers: ["opencode-go"], model: "minimax-m2.7", variant: "max" },
9538
9590
  { providers: ["xai"], model: "grok-4.20-0309-non-reasoning" },
9539
- { providers: ["zai-coding-plan"], model: "glm-5.3-flash", variant: "low" },
9591
+ { providers: ["zai-coding-plan"], model: LATEST_MODEL_BY_FAMILY.glmFlash, variant: "low" },
9540
9592
  { providers: ["xiaomi"], model: "mimo-v2.6-flash", variant: "low" }
9541
9593
  ]
9542
9594
  },
@@ -9544,13 +9596,13 @@ var init_category_model_requirements = __esm(() => {
9544
9596
  fallbackChain: [
9545
9597
  {
9546
9598
  providers: ["anthropic", "anthropic-api", "github-copilot", "opencode"],
9547
- model: "claude-sonnet-5-5",
9599
+ model: LATEST_MODEL_BY_FAMILY.claudeSonnet,
9548
9600
  variant: "medium"
9549
9601
  },
9550
9602
  { providers: ["xiaomi", "opencode-go"], model: "mimo-v2.6-pro", variant: "max" },
9551
9603
  { providers: ["xai", "github-copilot", "opencode-go"], model: "grok-4.7", variant: "xhigh" },
9552
- { providers: ["zai-coding-plan", "opencode-go"], model: "glm-5.3", variant: "high" },
9553
- { providers: ["openai", "chatgpt-subscription"], model: "gpt-6.1-sol", variant: "medium" },
9604
+ { providers: ["zai-coding-plan", "opencode-go"], model: LATEST_MODEL_BY_FAMILY.glm, variant: "high" },
9605
+ { providers: ["openai", "chatgpt-subscription"], model: LATEST_MODEL_BY_FAMILY.gptSol, variant: "medium" },
9554
9606
  {
9555
9607
  providers: ["openai", "chatgpt-subscription", "github-copilot", "opencode"],
9556
9608
  model: "gpt-5.6-sol",
@@ -9574,13 +9626,13 @@ var init_category_model_requirements = __esm(() => {
9574
9626
  fallbackChain: [
9575
9627
  {
9576
9628
  providers: ["anthropic", "anthropic-api", "github-copilot", "opencode"],
9577
- model: "claude-opus-5-5",
9629
+ model: LATEST_MODEL_BY_FAMILY.claudeOpus,
9578
9630
  variant: "medium"
9579
9631
  },
9580
- { providers: ["zai-coding-plan", "opencode-go"], model: "glm-5.3", variant: "max" },
9632
+ { providers: ["zai-coding-plan", "opencode-go"], model: LATEST_MODEL_BY_FAMILY.glm, variant: "max" },
9581
9633
  {
9582
9634
  providers: ["kimi-for-coding", "moonshotai", "opencode-go", "opencode"],
9583
- model: "kimi-k3",
9635
+ model: LATEST_MODEL_BY_FAMILY.kimi,
9584
9636
  variant: "max"
9585
9637
  }
9586
9638
  ]
@@ -9588,10 +9640,10 @@ var init_category_model_requirements = __esm(() => {
9588
9640
  writing: {
9589
9641
  requiresAnyModel: true,
9590
9642
  fallbackChain: [
9591
- { providers: ["google", "google-vertex", "opencode"], model: "gemini-4-argon", variant: "low" },
9643
+ { providers: ["google", "google-vertex", "opencode"], model: LATEST_MODEL_BY_FAMILY.geminiPro, variant: "low" },
9592
9644
  {
9593
9645
  providers: ["anthropic", "anthropic-api", "github-copilot", "opencode"],
9594
- model: "claude-opus-5-5",
9646
+ model: LATEST_MODEL_BY_FAMILY.claudeOpus,
9595
9647
  variant: "low"
9596
9648
  },
9597
9649
  {
@@ -11083,6 +11135,7 @@ var init_src2 = __esm(() => {
11083
11135
  init_model_resolver();
11084
11136
  init_provider_model_id_transform();
11085
11137
  init_model_requirements();
11138
+ init_latest_models();
11086
11139
  init_model_family_detectors();
11087
11140
  init_model_capability_aliases();
11088
11141
  init_model_capability_heuristics();
@@ -11404,16 +11457,17 @@ Approach:
11404
11457
  - This is for tasks requiring exceptional creativity
11405
11458
  </Category_Context>`, GOOGLE_CATEGORIES;
11406
11459
  var init_google_categories = __esm(() => {
11460
+ init_latest_models();
11407
11461
  GOOGLE_CATEGORIES = [
11408
11462
  {
11409
11463
  name: "visual-engineering",
11410
- config: { model: "google/gemini-4-argon", variant: "low" },
11464
+ config: { model: `google/${LATEST_MODEL_BY_FAMILY.geminiPro}`, variant: "low" },
11411
11465
  description: "Visual design, UI/UX, frontend, styling, animation, and design systems",
11412
11466
  promptAppend: VISUAL_CATEGORY_PROMPT_APPEND
11413
11467
  },
11414
11468
  {
11415
11469
  name: "artistry",
11416
- config: { model: "anthropic/claude-fable-5-1", variant: "max" },
11470
+ config: { model: `anthropic/${LATEST_MODEL_BY_FAMILY.claudeFable}`, variant: "max" },
11417
11471
  description: "Complex problem-solving with unconventional, creative approaches - beyond standard patterns",
11418
11472
  promptAppend: ARTISTRY_CATEGORY_PROMPT_APPEND
11419
11473
  }
@@ -11447,10 +11501,11 @@ ANTI-AI-SLOP RULES (NON-NEGOTIABLE):
11447
11501
  - Write like a human, not a corporate template.
11448
11502
  </Category_Context>`, KIMI_CATEGORIES;
11449
11503
  var init_kimi_categories = __esm(() => {
11504
+ init_latest_models();
11450
11505
  KIMI_CATEGORIES = [
11451
11506
  {
11452
11507
  name: "writing",
11453
- config: { model: "google/gemini-4-argon", variant: "low" },
11508
+ config: { model: `google/${LATEST_MODEL_BY_FAMILY.geminiPro}`, variant: "low" },
11454
11509
  description: "Documentation, prose, technical writing",
11455
11510
  promptAppend: WRITING_CATEGORY_PROMPT_APPEND
11456
11511
  }
@@ -11585,21 +11640,23 @@ You are working on tasks that don't fit specific categories but require moderate
11585
11640
  </Category_Context>`, UNSPECIFIED_LOW_CATEGORY_CALLER_GUIDANCE = `<Selection_Gate>Use only when no specialist category fits, effort is moderate, and scope stays within a few files/modules. Prefer any matching specialist category.</Selection_Gate>
11586
11641
  <Caller_Warning>Provide explicit must-do steps, forbidden scope, and concrete success criteria.</Caller_Warning>`, UNSPECIFIED_HIGH_CATEGORY_PROMPT_APPEND = `<Category_Context>
11587
11642
  You are working on tasks that don't fit specific categories but require substantial effort.
11588
- </Category_Context>`, UNSPECIFIED_HIGH_CATEGORY_CALLER_GUIDANCE = `<Selection_Gate>Use only when no specialist category fits and substantial effort spans systems/modules with broad impact. Use unspecified-low for contained moderate work.</Selection_Gate>`, DEEP_LOW_CATEGORY_CALLER_GUIDANCE = `<Selection_Gate>Of the two deep lanes this is the default: the child settles its decisions from what it reads. When unsure, choose deep-low; a misrouted child returns \`ESCALATE: deep-high\` after one cheap attempt, and you re-spawn the same brief as deep-high with its findings.</Selection_Gate>`, DEEP_HIGH_CATEGORY_CALLER_GUIDANCE = `<Selection_Gate>Route here only when you can name the decision evidence cannot settle: a trade-off with no single right answer, a contract change crossing a package or process boundary, a mechanism with no in-repo pattern to copy, or correctness argued from invariants rather than observed in a test. Wide scope with easy decisions is deep-low or unspecified-high; reasoning as the deliverable is ultrabrain.</Selection_Gate>`, DEEP_LOW_GATE_MODELS, DEEP_HIGH_GATE_MODEL = "gpt-6-astra", OPENAI_CATEGORIES;
11643
+ </Category_Context>`, UNSPECIFIED_HIGH_CATEGORY_CALLER_GUIDANCE = `<Selection_Gate>Use only when no specialist category fits and substantial effort spans systems/modules with broad impact. Use unspecified-low for contained moderate work.</Selection_Gate>`, DEEP_LOW_CATEGORY_CALLER_GUIDANCE = `<Selection_Gate>Of the two deep lanes this is the default: the child settles its decisions from what it reads. When unsure, choose deep-low; a misrouted child returns \`ESCALATE: deep-high\` after one cheap attempt, and you re-spawn the same brief as deep-high with its findings.</Selection_Gate>`, DEEP_HIGH_CATEGORY_CALLER_GUIDANCE = `<Selection_Gate>Route here only when you can name the decision evidence cannot settle: a trade-off with no single right answer, a contract change crossing a package or process boundary, a mechanism with no in-repo pattern to copy, or correctness argued from invariants rather than observed in a test. Wide scope with easy decisions is deep-low or unspecified-high; reasoning as the deliverable is ultrabrain.</Selection_Gate>`, DEEP_LOW_GATE_MODELS, DEEP_HIGH_GATE_MODEL, OPENAI_CATEGORIES;
11589
11644
  var init_openai_categories = __esm(() => {
11590
11645
  init_types();
11591
- DEEP_LOW_GATE_MODELS = ["gpt-6.1-sol", "gpt-6.1-sol-fast", "gpt-5.6-sol-fast", "gpt-5.6-sol"];
11646
+ init_latest_models();
11647
+ DEEP_LOW_GATE_MODELS = [LATEST_MODEL_BY_FAMILY.gptSol, LATEST_MODEL_BY_FAMILY.gptSolFast, "gpt-5.6-sol-fast", "gpt-5.6-sol"];
11648
+ DEEP_HIGH_GATE_MODEL = LATEST_MODEL_BY_FAMILY.gptAstra;
11592
11649
  OPENAI_CATEGORIES = [
11593
11650
  {
11594
11651
  name: "ultrabrain",
11595
- config: { model: "openai/gpt-6-astra", variant: "max" },
11652
+ config: { model: `openai/${LATEST_MODEL_BY_FAMILY.gptAstra}`, variant: "max" },
11596
11653
  description: "Use ONLY for genuinely hard, logic-heavy tasks. Give clear goals only, not step-by-step instructions.",
11597
11654
  promptAppend: ULTRABRAIN_CATEGORY_PROMPT_APPEND,
11598
11655
  resolvePromptAppend: resolveUltrabrainCategoryPromptAppend
11599
11656
  },
11600
11657
  {
11601
11658
  name: "deep-low",
11602
- config: { model: "openai/gpt-6.1-sol", variant: "medium" },
11659
+ config: { model: `openai/${LATEST_MODEL_BY_FAMILY.gptSol}`, variant: "medium" },
11603
11660
  description: "Default deep lane: one goal, one deliverable, decisions the child can settle from what it reads; preferred over deep-high for 3D graphics, computer/browser use, CAPTCHA, multimodal, backend, logic, and algorithm work. Multiple goals fan out as parallel calls.",
11604
11661
  callerGuidance: DEEP_LOW_CATEGORY_CALLER_GUIDANCE,
11605
11662
  promptAppend: DEEP_LOW_CATEGORY_PROMPT_APPEND,
@@ -11608,7 +11665,7 @@ var init_openai_categories = __esm(() => {
11608
11665
  },
11609
11666
  {
11610
11667
  name: "deep-high",
11611
- config: { model: "openai/gpt-6-astra", variant: "high" },
11668
+ config: { model: `openai/${LATEST_MODEL_BY_FAMILY.gptAstra}`, variant: "high" },
11612
11669
  description: "Escalation deep lane: a goal whose central decision cannot be settled from evidence alone. Same one-goal, one-deliverable contract as deep-low.",
11613
11670
  callerGuidance: DEEP_HIGH_CATEGORY_CALLER_GUIDANCE,
11614
11671
  promptAppend: DEEP_HIGH_CATEGORY_PROMPT_APPEND,
@@ -11617,21 +11674,21 @@ var init_openai_categories = __esm(() => {
11617
11674
  },
11618
11675
  {
11619
11676
  name: "quick",
11620
- config: { model: "openai/gpt-6-luna-fast", variant: "low" },
11677
+ config: { model: `openai/${LATEST_MODEL_BY_FAMILY.gptLunaFast}`, variant: "low" },
11621
11678
  description: "Trivial tasks - single file changes, typo fixes, simple modifications",
11622
11679
  callerGuidance: QUICK_CATEGORY_CALLER_GUIDANCE,
11623
11680
  promptAppend: QUICK_CATEGORY_PROMPT_APPEND
11624
11681
  },
11625
11682
  {
11626
11683
  name: "unspecified-low",
11627
- config: { model: "anthropic/claude-sonnet-5-5", variant: "medium" },
11684
+ config: { model: `anthropic/${LATEST_MODEL_BY_FAMILY.claudeSonnet}`, variant: "medium" },
11628
11685
  description: "Tasks that don't fit other categories, low effort required",
11629
11686
  callerGuidance: UNSPECIFIED_LOW_CATEGORY_CALLER_GUIDANCE,
11630
11687
  promptAppend: UNSPECIFIED_LOW_CATEGORY_PROMPT_APPEND
11631
11688
  },
11632
11689
  {
11633
11690
  name: "unspecified-high",
11634
- config: { model: "anthropic/claude-opus-5-5", variant: "medium" },
11691
+ config: { model: `anthropic/${LATEST_MODEL_BY_FAMILY.claudeOpus}`, variant: "medium" },
11635
11692
  description: "Tasks that don't fit other categories, high effort required",
11636
11693
  callerGuidance: UNSPECIFIED_HIGH_CATEGORY_CALLER_GUIDANCE,
11637
11694
  promptAppend: UNSPECIFIED_HIGH_CATEGORY_PROMPT_APPEND,
@@ -11680,7 +11737,7 @@ var init_migration2 = __esm(() => {
11680
11737
 
11681
11738
  // packages/omo-opencode/src/shared/opencode-config-dir.ts
11682
11739
  import { existsSync as existsSync5, realpathSync as realpathSync2 } from "node:fs";
11683
- import { homedir as homedir4 } from "node:os";
11740
+ import { homedir as homedir5 } from "node:os";
11684
11741
  import { join as join6, posix, resolve, win32 } from "node:path";
11685
11742
  function isDevBuild(version) {
11686
11743
  if (!version)
@@ -11691,14 +11748,14 @@ function getTauriConfigDir(identifier) {
11691
11748
  const platform = process.platform;
11692
11749
  switch (platform) {
11693
11750
  case "darwin":
11694
- return join6(homedir4(), "Library", "Application Support", identifier);
11751
+ return join6(homedir5(), "Library", "Application Support", identifier);
11695
11752
  case "win32": {
11696
- const appData = process.env.APPDATA || join6(homedir4(), "AppData", "Roaming");
11753
+ const appData = process.env.APPDATA || join6(homedir5(), "AppData", "Roaming");
11697
11754
  return win32.join(appData, identifier);
11698
11755
  }
11699
11756
  case "linux":
11700
11757
  default: {
11701
- const xdgConfig = process.env.XDG_CONFIG_HOME || join6(homedir4(), ".config");
11758
+ const xdgConfig = process.env.XDG_CONFIG_HOME || join6(homedir5(), ".config");
11702
11759
  return join6(xdgConfig, identifier);
11703
11760
  }
11704
11761
  }
@@ -11742,7 +11799,7 @@ function getWslLinuxHomeDir(windowsConfigRoot) {
11742
11799
  function getCliDefaultConfigDir() {
11743
11800
  const envXdgConfig = process.env.XDG_CONFIG_HOME?.trim();
11744
11801
  const shouldIgnoreWindowsXdg = envXdgConfig !== undefined && envXdgConfig.length > 0 && isWslEnvironment() && isWindowsUserConfigRoot(envXdgConfig);
11745
- const xdgConfig = shouldIgnoreWindowsXdg ? posix.join(getWslLinuxHomeDir(envXdgConfig) ?? "/home", ".config") : envXdgConfig || join6(homedir4(), ".config");
11802
+ const xdgConfig = shouldIgnoreWindowsXdg ? posix.join(getWslLinuxHomeDir(envXdgConfig) ?? "/home", ".config") : envXdgConfig || join6(homedir5(), ".config");
11746
11803
  const configDir = isWslEnvironment() ? posix.join(xdgConfig, "opencode") : join6(xdgConfig, "opencode");
11747
11804
  return resolveConfigPath(configDir);
11748
11805
  }
@@ -70389,10 +70446,11 @@ var ANTHROPIC_PREFIX = "anthropic/", CLAUDE_CODE_ALIAS_MAP;
70389
70446
  var init_claude_model_mapper = __esm(() => {
70390
70447
  init_model_format_normalizer();
70391
70448
  init_model_normalization2();
70449
+ init_latest_models();
70392
70450
  CLAUDE_CODE_ALIAS_MAP = new Map([
70393
- ["sonnet", `${ANTHROPIC_PREFIX}claude-sonnet-4-6`],
70394
- ["opus", `${ANTHROPIC_PREFIX}claude-opus-5-5`],
70395
- ["haiku", `${ANTHROPIC_PREFIX}claude-haiku-5-5`]
70451
+ ["sonnet", `${ANTHROPIC_PREFIX}${LATEST_MODEL_BY_FAMILY.claudeSonnet}`],
70452
+ ["opus", `${ANTHROPIC_PREFIX}${LATEST_MODEL_BY_FAMILY.claudeOpus}`],
70453
+ ["haiku", `${ANTHROPIC_PREFIX}${LATEST_MODEL_BY_FAMILY.claudeHaiku}`]
70396
70454
  ]);
70397
70455
  });
70398
70456
 
@@ -76875,7 +76933,7 @@ var init_git_master = __esm(() => {
76875
76933
  OmoGitMasterSettingsLayerSchema = object(OmoGitMasterSettingsShape).partial().strict();
76876
76934
  OmoGitMasterSettingsSchema = OmoGitMasterSettingsLayerSchema.extend({
76877
76935
  commit_footer: union([boolean2(), string2()]).default(false),
76878
- include_co_authored_by: boolean2().default(false),
76936
+ include_co_authored_by: boolean2().default(true),
76879
76937
  git_env_prefix: GitEnvPrefixSchema.default("GIT_MASTER=1")
76880
76938
  }).strict();
76881
76939
  });
@@ -76909,7 +76967,7 @@ var init_memory_agreements = __esm(() => {
76909
76967
  });
76910
76968
 
76911
76969
  // packages/omo-config-core/src/schema/memory.ts
76912
- var OmoMemoryReflectionTriggerSchema, OmoMemoryReflectionSchema, OmoMemorySyncSchema, OmoMemorySearchSchema, OmoMemoryRecallEventCapsSchema, OmoMemoryRecallSchema, OmoMemoryNudgeSchema, OmoMemoryFactsSchema, OmoMemoryDreamSchema, OmoMemoryPeopleSchema, OmoMemorySoulSchema, OmoMemoryWriteNoticeSchema, OmoMemoryReflectionTriggerLayerSchema, OmoMemoryReflectionLayerSchema, OmoMemorySyncLayerSchema, OmoMemorySearchLayerSchema, OmoMemoryRecallEventCapsLayerSchema, OmoMemoryRecallLayerSchema, OmoMemoryNudgeLayerSchema, OmoMemoryFactsLayerSchema, OmoMemoryDreamLayerSchema, OmoMemoryPeopleLayerSchema, OmoMemorySoulLayerSchema, OmoMemoryWriteNoticeLayerSchema, OmoMemoryProjectionSchema, OmoMemoryProjectionLayerSchema, OmoMemoryAgentOverridesSchema, OmoMemoryAutoIdentitySchema, OmoMemorySettingsSchema, OmoMemorySettingsLayerSchema;
76970
+ var OmoMemoryReflectionTriggerSchema, OmoMemoryReflectionSchema, OmoMemorySyncSchema, OmoMemorySearchSchema, OmoMemoryRecallEventCapsSchema, OmoMemoryRecallSchema, OmoMemoryProjectScopeSchema, OmoMemoryProjectScopeLayerSchema, OmoMemoryNudgeSchema, OmoMemoryFactsSchema, OmoMemoryDreamSchema, OmoMemoryPeopleSchema, OmoMemorySoulSchema, OmoMemoryWriteNoticeSchema, OmoMemoryReflectionTriggerLayerSchema, OmoMemoryReflectionLayerSchema, OmoMemorySyncLayerSchema, OmoMemorySearchLayerSchema, OmoMemoryRecallEventCapsLayerSchema, OmoMemoryRecallLayerSchema, OmoMemoryNudgeLayerSchema, OmoMemoryFactsLayerSchema, OmoMemoryDreamLayerSchema, OmoMemoryPeopleLayerSchema, OmoMemorySoulLayerSchema, OmoMemoryWriteNoticeLayerSchema, OmoMemoryProjectionSchema, OmoMemoryProjectionLayerSchema, OmoMemoryAgentOverridesSchema, OmoMemoryAutoIdentitySchema, OmoMemorySettingsSchema, OmoMemorySettingsLayerSchema;
76913
76971
  var init_memory = __esm(() => {
76914
76972
  init_zod();
76915
76973
  init_memory_agreements();
@@ -76924,6 +76982,7 @@ var init_memory = __esm(() => {
76924
76982
  merge: _enum(["auto", "integration"]).default("auto"),
76925
76983
  category: string2().min(1).default("quick"),
76926
76984
  timeout_minutes: number2().int().positive().default(15),
76985
+ max_concurrent_runs: number2().int().positive().default(1),
76927
76986
  sandbox: _enum(["auto", "required", "off"]).default("auto")
76928
76987
  }).strict();
76929
76988
  OmoMemorySyncSchema = object({
@@ -76949,6 +77008,14 @@ var init_memory = __esm(() => {
76949
77008
  tool_budget: number2().int().positive().default(8),
76950
77009
  query_expansion: boolean2().default(false)
76951
77010
  }).strict();
77011
+ OmoMemoryProjectScopeSchema = object({
77012
+ nudge: boolean2().default(true),
77013
+ recall: boolean2().default(true)
77014
+ }).strict();
77015
+ OmoMemoryProjectScopeLayerSchema = object({
77016
+ nudge: boolean2().optional(),
77017
+ recall: boolean2().optional()
77018
+ }).strict();
76952
77019
  OmoMemoryNudgeSchema = object({
76953
77020
  enabled: boolean2().default(true),
76954
77021
  every_user_turns: number2().int().min(1).default(10)
@@ -76987,6 +77054,7 @@ var init_memory = __esm(() => {
76987
77054
  merge: _enum(["auto", "integration"]).optional(),
76988
77055
  category: string2().min(1).optional(),
76989
77056
  timeout_minutes: number2().int().positive().optional(),
77057
+ max_concurrent_runs: number2().int().positive().optional(),
76990
77058
  sandbox: _enum(["auto", "required", "off"]).optional()
76991
77059
  }).strict();
76992
77060
  OmoMemorySyncLayerSchema = object({
@@ -77051,7 +77119,7 @@ var init_memory = __esm(() => {
77051
77119
  OmoMemoryAgentOverridesSchema = object({
77052
77120
  enabled: boolean2().optional(),
77053
77121
  agent: string2().min(1).optional(),
77054
- reflection: OmoMemoryReflectionLayerSchema.optional(),
77122
+ reflection: OmoMemoryReflectionLayerSchema.omit({ max_concurrent_runs: true }).optional(),
77055
77123
  nudge: OmoMemoryNudgeLayerSchema.optional(),
77056
77124
  facts: OmoMemoryFactsLayerSchema.optional(),
77057
77125
  dream: OmoMemoryDreamLayerSchema.optional(),
@@ -77076,6 +77144,7 @@ var init_memory = __esm(() => {
77076
77144
  merge: "auto",
77077
77145
  category: "quick",
77078
77146
  timeout_minutes: 15,
77147
+ max_concurrent_runs: 1,
77079
77148
  sandbox: "auto"
77080
77149
  }),
77081
77150
  nudge: OmoMemoryNudgeSchema.default({ enabled: true, every_user_turns: 10 }),
@@ -77104,6 +77173,7 @@ var init_memory = __esm(() => {
77104
77173
  tool_budget: 8,
77105
77174
  query_expansion: false
77106
77175
  }),
77176
+ project_scope: OmoMemoryProjectScopeSchema.default({ nudge: true, recall: true }),
77107
77177
  projection: OmoMemoryProjectionSchema.default({ max_entries_per_directory: 40, max_bytes: 24576 }),
77108
77178
  compile_warn_tokens: number2().int().positive().default(30000),
77109
77179
  agents: record(string2(), OmoMemoryAgentOverridesSchema).default({})
@@ -77123,6 +77193,7 @@ var init_memory = __esm(() => {
77123
77193
  sync: OmoMemorySyncLayerSchema.optional(),
77124
77194
  search: OmoMemorySearchLayerSchema.optional(),
77125
77195
  recall: OmoMemoryRecallLayerSchema.optional(),
77196
+ project_scope: OmoMemoryProjectScopeLayerSchema.optional(),
77126
77197
  projection: OmoMemoryProjectionLayerSchema.optional(),
77127
77198
  compile_warn_tokens: number2().int().positive().optional(),
77128
77199
  agents: record(string2(), OmoMemoryAgentOverridesSchema).optional()
@@ -77420,7 +77491,8 @@ var OmoTelemetrySettingsShape, OmoTelemetrySettingsLayerSchema, OmoTelemetrySett
77420
77491
  var init_telemetry = __esm(() => {
77421
77492
  init_zod();
77422
77493
  OmoTelemetrySettingsShape = {
77423
- enabled: boolean2()
77494
+ enabled: boolean2(),
77495
+ rawTurnSampleRate: number2().min(0).max(1)
77424
77496
  };
77425
77497
  OmoTelemetrySettingsLayerSchema = object(OmoTelemetrySettingsShape).partial().strict();
77426
77498
  OmoTelemetrySettingsSchema = OmoTelemetrySettingsLayerSchema.extend({
@@ -77447,11 +77519,17 @@ var init_format_on_mutation = __esm(() => {
77447
77519
  }).strict();
77448
77520
  });
77449
77521
 
77450
- // packages/omo-config-core/src/schema/gateway.ts
77451
- var OmoGatewaySectionSchema;
77452
- var init_gateway = __esm(() => {
77522
+ // packages/omo-config-core/src/schema/provenance.ts
77523
+ var OmoProvenanceSettingsSchema;
77524
+ var init_provenance = __esm(() => {
77453
77525
  init_zod();
77454
- OmoGatewaySectionSchema = record(string2(), unknown()).describe("Chat-surface gateway settings, owned and validated by a separately installed gateway package. omo accepts the key and never reads it.");
77526
+ OmoProvenanceSettingsSchema = object({
77527
+ workspaces: array(object({
77528
+ name: string2().trim().min(1).regex(/\S/),
77529
+ git_owners: array(string2().trim().min(1).regex(/\S/)).optional(),
77530
+ paths: array(string2().trim().min(1).regex(/\S/)).optional()
77531
+ }).strict()).optional()
77532
+ }).strict();
77455
77533
  });
77456
77534
 
77457
77535
  // packages/omo-config-core/src/schema/config.ts
@@ -77470,13 +77548,13 @@ var init_config = __esm(() => {
77470
77548
  init_team();
77471
77549
  init_telemetry();
77472
77550
  init_format_on_mutation();
77473
- init_gateway();
77551
+ init_provenance();
77474
77552
  OmoOpenCodeHarnessConfigSchema = record(string2(), unknown());
77475
77553
  OmoDisabledSkillsSchema = array(string2());
77476
77554
  OmoExcludedModelsSchema = array(string2());
77477
77555
  OmoTypedHarnessConfigSchema = object({
77556
+ provenance: OmoProvenanceSettingsSchema.optional(),
77478
77557
  formatOnMutation: OmoFormatOnMutationLayerSchema.optional(),
77479
- gateway: OmoGatewaySectionSchema.optional(),
77480
77558
  categories: OmoCategoriesConfigSchema.optional(),
77481
77559
  agents: OmoAgentsConfigSchema.optional(),
77482
77560
  git_master: OmoGitMasterSettingsLayerSchema.optional(),
@@ -77493,6 +77571,7 @@ var init_config = __esm(() => {
77493
77571
  exclude_models: OmoExcludedModelsSchema.optional()
77494
77572
  }).strict();
77495
77573
  OmoConfigProfileSchema = object({
77574
+ provenance: OmoProvenanceSettingsSchema.optional(),
77496
77575
  formatOnMutation: OmoFormatOnMutationLayerSchema.optional(),
77497
77576
  categories: OmoCategoriesConfigSchema.optional(),
77498
77577
  agents: OmoAgentsConfigSchema.optional(),
@@ -77514,8 +77593,8 @@ var init_config = __esm(() => {
77514
77593
  "[codex]": OmoTypedHarnessConfigSchema.optional()
77515
77594
  }).strict();
77516
77595
  OmoConfigSchema = object({
77596
+ provenance: OmoProvenanceSettingsSchema.optional(),
77517
77597
  formatOnMutation: OmoFormatOnMutationSchema.optional(),
77518
- gateway: OmoGatewaySectionSchema.optional(),
77519
77598
  $schema: string2().optional(),
77520
77599
  categories: OmoCategoriesConfigSchema.optional(),
77521
77600
  agents: OmoAgentsConfigSchema.optional(),
@@ -77540,8 +77619,8 @@ var init_config = __esm(() => {
77540
77619
  legacy_migrations: record(string2(), unknown()).optional()
77541
77620
  }).strict();
77542
77621
  OmoConfigLayerSchema = object({
77622
+ provenance: OmoProvenanceSettingsSchema.optional(),
77543
77623
  formatOnMutation: OmoFormatOnMutationLayerSchema.optional(),
77544
- gateway: OmoGatewaySectionSchema.optional(),
77545
77624
  $schema: string2().optional(),
77546
77625
  categories: OmoCategoriesConfigSchema.optional(),
77547
77626
  agents: OmoAgentsConfigSchema.optional(),
@@ -77690,7 +77769,6 @@ var init_schema = __esm(() => {
77690
77769
  init_config();
77691
77770
  init_fallback_models();
77692
77771
  init_format_on_mutation();
77693
- init_gateway();
77694
77772
  init_git_master();
77695
77773
  init_harness();
77696
77774
  init_legacy_category_names();
@@ -77699,6 +77777,7 @@ var init_schema = __esm(() => {
77699
77777
  init_model_catalog();
77700
77778
  init_model_profile();
77701
77779
  init_model_ref();
77780
+ init_provenance();
77702
77781
  init_side_panel();
77703
77782
  init_task();
77704
77783
  init_team();
@@ -77964,6 +78043,7 @@ function pruneInvalidConfigPaths(config, issues, validate, maxPasses = MAX_PRUNE
77964
78043
  var MAX_PRUNE_PASSES = 32;
77965
78044
 
77966
78045
  // packages/omo-config-core/src/loader/layer-validation.ts
78046
+ import { createHash as createHash2 } from "node:crypto";
77967
78047
  function validationDiagnostic(path, issues) {
77968
78048
  const issuePaths = issues.map((issue) => issue.path.map((segment) => String(segment)).join("."));
77969
78049
  return {
@@ -77987,6 +78067,9 @@ function unrecognizedKeyIssues(issues) {
77987
78067
  function isRecord11(value) {
77988
78068
  return typeof value === "object" && value !== null && !Array.isArray(value);
77989
78069
  }
78070
+ function isRetiredSection(key) {
78071
+ return RETIRED_SECTION_DIGESTS.has(createHash2("sha256").update(key.toLowerCase()).digest("hex"));
78072
+ }
77990
78073
  function sanitizeUnsafeKeys(value, path = []) {
77991
78074
  if (Array.isArray(value)) {
77992
78075
  const issues = [];
@@ -78005,6 +78088,9 @@ function sanitizeUnsafeKeys(value, path = []) {
78005
78088
  }
78006
78089
  const sanitized = {};
78007
78090
  for (const [key, entry] of Object.entries(value)) {
78091
+ const isConfigContainer = path.length === 0 || path.length === 1 && HARNESS_BLOCKS.has(path[0] ?? "") || path.length === 2 && path[0] === "profiles" || path.length === 3 && path[0] === "profiles" && HARNESS_BLOCKS.has(path[2] ?? "");
78092
+ if (isConfigContainer && isRetiredSection(key))
78093
+ continue;
78008
78094
  if (isUnsafeObjectKey2(key)) {
78009
78095
  issues.push({ keys: [key], path });
78010
78096
  continue;
@@ -78091,13 +78177,18 @@ function validateConfigLayer(path, data) {
78091
78177
  return rejected;
78092
78178
  return { loaded: true, diagnostics: [...diagnostics, ...invalidValueDiagnostics(path, pruned.dropped)], value: pruned.config };
78093
78179
  }
78094
- var validateLayerRecord = (record) => {
78180
+ var RETIRED_SECTION_DIGESTS, HARNESS_BLOCKS, validateLayerRecord = (record) => {
78095
78181
  const parsed = OmoConfigLayerSchema.safeParse(record);
78096
78182
  return parsed.success ? { success: true } : { success: false, issues: parsed.error.issues };
78097
78183
  };
78098
78184
  var init_layer_validation = __esm(() => {
78099
78185
  init_schema();
78100
78186
  init_merge();
78187
+ RETIRED_SECTION_DIGESTS = new Set([
78188
+ "447f75a8ebdbdb79a57f0b8cebbfba183820cf54a8119ac01449b30499e5ef0e",
78189
+ "4ea5ee68fea05586106890ded5733820bb77d919cda27bc4b8139b7cd33b8889"
78190
+ ]);
78191
+ HARNESS_BLOCKS = new Set(["[opencode]", "[native]", "[senpi]", "[codex]"]);
78101
78192
  });
78102
78193
 
78103
78194
  // packages/omo-config-core/src/internal/posix-path.ts
@@ -80498,13 +80589,14 @@ function applyOpenAiOnlyModelCatalog(config) {
80498
80589
  }
80499
80590
  var OPENAI_ONLY_AGENT_OVERRIDES, OPENAI_ONLY_CATEGORY_OVERRIDES;
80500
80591
  var init_openai_only_model_catalog = __esm(() => {
80592
+ init_latest_models();
80501
80593
  OPENAI_ONLY_AGENT_OVERRIDES = {
80502
- explore: { model: "openai/gpt-6-luna-fast", variant: "low" },
80503
- librarian: { model: "openai/gpt-6-luna-fast", variant: "low" }
80594
+ explore: { model: `openai/${LATEST_MODEL_BY_FAMILY.gptLunaFast}`, variant: "low" },
80595
+ librarian: { model: `openai/${LATEST_MODEL_BY_FAMILY.gptLunaFast}`, variant: "low" }
80504
80596
  };
80505
80597
  OPENAI_ONLY_CATEGORY_OVERRIDES = {
80506
80598
  artistry: { model: "openai/gpt-5.6-sol", variant: "xhigh" },
80507
- quick: { model: "openai/gpt-6-luna-fast" },
80599
+ quick: { model: `openai/${LATEST_MODEL_BY_FAMILY.gptLunaFast}` },
80508
80600
  "visual-engineering": { model: "openai/gpt-5.6-sol", variant: "high" }
80509
80601
  };
80510
80602
  });
@@ -80713,9 +80805,9 @@ function generateModelConfig(config) {
80713
80805
  if (role === "explore") {
80714
80806
  let agentConfig;
80715
80807
  if (avail.native.openai) {
80716
- agentConfig = { model: "openai/gpt-6-luna-fast", variant: "low" };
80808
+ agentConfig = { model: `openai/${LATEST_MODEL_BY_FAMILY.gptLunaFast}`, variant: "low" };
80717
80809
  } else if (avail.native.claude) {
80718
- agentConfig = { model: "anthropic/claude-haiku-5-5", variant: "medium" };
80810
+ agentConfig = { model: `anthropic/${LATEST_MODEL_BY_FAMILY.claudeHaiku}`, variant: "medium" };
80719
80811
  } else if (avail.opencodeZen) {
80720
80812
  agentConfig = { model: "opencode/gpt-5-nano" };
80721
80813
  } else if (avail.opencodeGo) {
@@ -80798,6 +80890,7 @@ var init_model_fallback = __esm(() => {
80798
80890
  init_fallback_chain_resolution();
80799
80891
  init_provider_model_id_transform2();
80800
80892
  init_fallback_lane_policy();
80893
+ init_latest_models();
80801
80894
  });
80802
80895
 
80803
80896
  // packages/omo-opencode/src/cli/config-manager/generate-omo-config.ts
@@ -82696,13 +82789,13 @@ var init_event_id = __esm(() => {
82696
82789
  });
82697
82790
 
82698
82791
  // packages/telemetry-core/src/machine-id.ts
82699
- import { createHash as createHash5 } from "node:crypto";
82792
+ import { createHash as createHash6 } from "node:crypto";
82700
82793
  import os4 from "node:os";
82701
82794
  function getDefaultTelemetryOsProvider() {
82702
82795
  return os4;
82703
82796
  }
82704
82797
  function getTelemetryDistinctId(machineIdPrefix, osProvider = getDefaultTelemetryOsProvider()) {
82705
- return createHash5("sha256").update(`${machineIdPrefix}${osProvider.hostname()}`).digest("hex");
82798
+ return createHash6("sha256").update(`${machineIdPrefix}${osProvider.hostname()}`).digest("hex");
82706
82799
  }
82707
82800
  var init_machine_id = () => {};
82708
82801
 
@@ -92225,20 +92318,98 @@ var init_index_node = __esm(() => {
92225
92318
  };
92226
92319
  });
92227
92320
 
92321
+ // packages/telemetry-core/src/telemetry-delivery-error.ts
92322
+ var PERMANENT_STATUSES, TelemetryDeliveryError;
92323
+ var init_telemetry_delivery_error = __esm(() => {
92324
+ PERMANENT_STATUSES = new Set([400, 413]);
92325
+ TelemetryDeliveryError = class TelemetryDeliveryError extends Error {
92326
+ permanent;
92327
+ status;
92328
+ constructor(status, cause) {
92329
+ super(status === undefined ? "telemetry event was not delivered (no response)" : `telemetry event was rejected with HTTP ${status}`, { cause });
92330
+ this.name = "TelemetryDeliveryError";
92331
+ this.status = status;
92332
+ this.permanent = status !== undefined && PERMANENT_STATUSES.has(status);
92333
+ }
92334
+ };
92335
+ });
92336
+
92337
+ // packages/telemetry-core/src/posthog-immediate-send.ts
92338
+ function createImmediateSender(apiKey, options, PostHogClient) {
92339
+ const baseFetch = options.fetch ?? ((url, init) => fetch(url, init));
92340
+ let current;
92341
+ const trackedFetch = async (url, init) => {
92342
+ const attempt = current;
92343
+ try {
92344
+ const response = await baseFetch(url, init);
92345
+ if (attempt !== undefined)
92346
+ attempt.status = response.status;
92347
+ return response;
92348
+ } catch (error) {
92349
+ if (attempt !== undefined)
92350
+ attempt.error = error;
92351
+ throw error;
92352
+ }
92353
+ };
92354
+ const client = new PostHogClient(apiKey, { ...options, fetch: trackedFetch, fetchRetryCount: 0 });
92355
+ let queue = Promise.resolve();
92356
+ const sendOne = async (message) => {
92357
+ const attempt = {};
92358
+ current = attempt;
92359
+ try {
92360
+ await client.captureImmediate(message);
92361
+ } finally {
92362
+ current = undefined;
92363
+ }
92364
+ const { status } = attempt;
92365
+ if (status === undefined || status < 200 || status >= 300)
92366
+ throw new TelemetryDeliveryError(status, attempt.error);
92367
+ };
92368
+ return {
92369
+ send(message) {
92370
+ const result = queue.then(() => sendOne(message));
92371
+ queue = result.catch(() => {
92372
+ return;
92373
+ });
92374
+ return result;
92375
+ },
92376
+ async shutdown() {
92377
+ await client.shutdown();
92378
+ }
92379
+ };
92380
+ }
92381
+ var init_posthog_immediate_send = __esm(() => {
92382
+ init_telemetry_delivery_error();
92383
+ });
92384
+
92228
92385
  // packages/telemetry-core/src/posthog-transport.ts
92229
92386
  class PostHogTelemetryTransport {
92230
92387
  #client;
92388
+ #apiKey;
92389
+ #options;
92390
+ #immediate;
92231
92391
  constructor(apiKey, options) {
92232
92392
  this.#client = new PostHog(apiKey, options);
92393
+ this.#apiKey = apiKey;
92394
+ this.#options = options;
92233
92395
  }
92234
92396
  capture(message) {
92235
92397
  this.#client.capture(message);
92236
92398
  }
92399
+ captureImmediate(message) {
92400
+ this.#immediate ??= Promise.resolve().then(() => (init_posthog_immediate_send(), {})).then(({}) => createImmediateSender(this.#apiKey, this.#options, PostHog)).catch((error) => {
92401
+ this.#immediate = undefined;
92402
+ throw error;
92403
+ });
92404
+ return this.#immediate.then((sender) => sender.send(message));
92405
+ }
92237
92406
  async flush() {
92238
92407
  await this.#client.flush();
92239
92408
  }
92240
92409
  async shutdown() {
92241
- await this.#client.shutdown();
92410
+ await Promise.all([this.#client.shutdown(), this.#immediate?.then((sender) => sender.shutdown(), () => {
92411
+ return;
92412
+ })]);
92242
92413
  }
92243
92414
  }
92244
92415
  function createDefaultPostHogTransport(apiKey, options) {
@@ -92264,6 +92435,12 @@ var init_posthog_client = __esm(() => {
92264
92435
  // packages/telemetry-core/src/record-daily-active.ts
92265
92436
  var init_record_daily_active = () => {};
92266
92437
 
92438
+ // packages/telemetry-core/src/turn-trace-bridge.ts
92439
+ var REGISTRY;
92440
+ var init_turn_trace_bridge = __esm(() => {
92441
+ REGISTRY = Symbol.for("omo.telemetry.turn-traceparent.v1");
92442
+ });
92443
+
92267
92444
  // packages/telemetry-core/src/index.ts
92268
92445
  var init_src5 = __esm(() => {
92269
92446
  init_activity_state();
@@ -92275,6 +92452,7 @@ var init_src5 = __esm(() => {
92275
92452
  init_machine_id();
92276
92453
  init_posthog_client();
92277
92454
  init_record_daily_active();
92455
+ init_turn_trace_bridge();
92278
92456
  });
92279
92457
 
92280
92458
  // packages/omo-codex/package.json
@@ -92282,7 +92460,7 @@ var package_default2;
92282
92460
  var init_package2 = __esm(() => {
92283
92461
  package_default2 = {
92284
92462
  name: "@oh-my-opencode/omo-codex",
92285
- version: "5.1.44",
92463
+ version: "5.1.46",
92286
92464
  type: "module",
92287
92465
  private: true,
92288
92466
  description: "Codex harness adapter for oh-my-openagent. Vendored Codex plugin namespace (omo) + TypeScript installer + telemetry.",
@@ -92313,6 +92491,7 @@ var init_package2 = __esm(() => {
92313
92491
  "sync:skills": "node plugin/scripts/sync-skills.mjs"
92314
92492
  },
92315
92493
  dependencies: {
92494
+ "@oh-my-opencode/model-core": "workspace:*",
92316
92495
  "@oh-my-opencode/shared-skills": "workspace:*",
92317
92496
  "@oh-my-opencode/utils": "workspace:*"
92318
92497
  },
@@ -93253,20 +93432,20 @@ var init_update_toasts = __esm(() => {
93253
93432
  });
93254
93433
 
93255
93434
  // packages/omo-opencode/src/hooks/auto-update-checker/hook/background-update-check.ts
93256
- import { existsSync as existsSync48 } from "node:fs";
93257
- import { dirname as dirname32, join as join79 } from "node:path";
93435
+ import { existsSync as existsSync50 } from "node:fs";
93436
+ import { dirname as dirname35, join as join84 } from "node:path";
93258
93437
  import { fileURLToPath as fileURLToPath5 } from "node:url";
93259
93438
  function defaultGetModuleHostingWorkspace() {
93260
93439
  try {
93261
- const currentDir = dirname32(fileURLToPath5(import.meta.url));
93440
+ const currentDir = dirname35(fileURLToPath5(import.meta.url));
93262
93441
  const pkgJsonPath = findPackageJsonUp(currentDir);
93263
93442
  if (!pkgJsonPath)
93264
93443
  return null;
93265
- const pkgDir = dirname32(pkgJsonPath);
93266
- const nodeModulesDir = dirname32(pkgDir);
93444
+ const pkgDir = dirname35(pkgJsonPath);
93445
+ const nodeModulesDir = dirname35(pkgDir);
93267
93446
  if (nodeModulesDir.split(/[\\/]/).pop() !== "node_modules")
93268
93447
  return null;
93269
- return dirname32(nodeModulesDir);
93448
+ return dirname35(nodeModulesDir);
93270
93449
  } catch (error) {
93271
93450
  if (error instanceof Error) {
93272
93451
  return null;
@@ -93413,8 +93592,8 @@ var init_background_update_check = __esm(() => {
93413
93592
  init_semver_compare();
93414
93593
  init_update_toasts();
93415
93594
  defaultDeps4 = {
93416
- existsSync: existsSync48,
93417
- join: join79,
93595
+ existsSync: existsSync50,
93596
+ join: join84,
93418
93597
  runBunInstallWithDetails,
93419
93598
  log: log2,
93420
93599
  getOpenCodeCacheDir,
@@ -93831,7 +94010,7 @@ function getUnsupportedOpenCodeVersionMessage(openCodeVersion) {
93831
94010
  // packages/omo-codex/src/install/install-codex.ts
93832
94011
  import { join as join56, resolve as resolve13 } from "node:path";
93833
94012
  import { existsSync as existsSync27 } from "node:fs";
93834
- import { homedir as homedir6 } from "node:os";
94013
+ import { homedir as homedir7 } from "node:os";
93835
94014
 
93836
94015
  // packages/omo-codex/src/install/codex-cache-bins.ts
93837
94016
  import { chmod, lstat as lstat4, mkdir, readFile as readFile3, readdir as readdir2, readlink as readlink3, rm as rm3, stat as stat2, symlink, writeFile } from "node:fs/promises";
@@ -96290,11 +96469,12 @@ function isRootSetting(line, key) {
96290
96469
  }
96291
96470
 
96292
96471
  // packages/omo-codex/src/install/codex-model-catalog.ts
96472
+ init_latest_models();
96293
96473
  import { readFile as readFile10 } from "node:fs/promises";
96294
96474
  import { join as join36 } from "node:path";
96295
96475
  var FALLBACK_CODEX_MODEL_CATALOG = {
96296
96476
  current: {
96297
- model: "gpt-6-astra",
96477
+ model: LATEST_MODEL_BY_FAMILY.gptAstra,
96298
96478
  modelContextWindow: 600000,
96299
96479
  modelReasoningEffort: "high",
96300
96480
  planModeReasoningEffort: "xhigh"
@@ -96596,7 +96776,7 @@ function isMissingFileError(error) {
96596
96776
  }
96597
96777
 
96598
96778
  // packages/omo-codex/src/install/codex-hook-trust.ts
96599
- import { createHash as createHash2 } from "node:crypto";
96779
+ import { createHash as createHash3 } from "node:crypto";
96600
96780
  import { readFile as readFile12 } from "node:fs/promises";
96601
96781
  import { join as join38 } from "node:path";
96602
96782
  var EVENT_LABELS = new Map([
@@ -96688,7 +96868,7 @@ function commandHookHash(eventName, matcher, handler, command) {
96688
96868
  if (typeof matcher === "string")
96689
96869
  identity.matcher = matcher;
96690
96870
  const canonical = JSON.stringify(canonicalJson(identity));
96691
- return `sha256:${createHash2("sha256").update(canonical).digest("hex")}`;
96871
+ return `sha256:${createHash3("sha256").update(canonical).digest("hex")}`;
96692
96872
  }
96693
96873
  function canonicalJson(value) {
96694
96874
  if (Array.isArray(value))
@@ -96867,6 +97047,7 @@ import { lstat as lstat7, readFile as readFile13, readdir as readdir6, writeFile
96867
97047
  import { join as join40 } from "node:path";
96868
97048
 
96869
97049
  // packages/omo-codex/src/install/managed-agent-reasoning-defaults.ts
97050
+ init_latest_models();
96870
97051
  var MANAGED_REASONING_DEFAULT_UPGRADES = new Map([
96871
97052
  [
96872
97053
  "explorer",
@@ -96881,7 +97062,7 @@ var MANAGED_REASONING_DEFAULT_UPGRADES = new Map([
96881
97062
  },
96882
97063
  {
96883
97064
  previous: { model: "gpt-5.6-luna", effort: "low" },
96884
- current: { model: "gpt-6-astra", effort: "low" }
97065
+ current: { model: LATEST_MODEL_BY_FAMILY.gptAstra, effort: "low" }
96885
97066
  }
96886
97067
  ]
96887
97068
  ],
@@ -96898,7 +97079,7 @@ var MANAGED_REASONING_DEFAULT_UPGRADES = new Map([
96898
97079
  },
96899
97080
  {
96900
97081
  previous: { model: "gpt-5.6-luna", effort: "low" },
96901
- current: { model: "gpt-6-astra", effort: "low" }
97082
+ current: { model: LATEST_MODEL_BY_FAMILY.gptAstra, effort: "low" }
96902
97083
  }
96903
97084
  ]
96904
97085
  ],
@@ -96907,7 +97088,7 @@ var MANAGED_REASONING_DEFAULT_UPGRADES = new Map([
96907
97088
  [
96908
97089
  {
96909
97090
  previous: { model: "gpt-5.6-sol", effort: "high" },
96910
- current: { model: "gpt-6-astra", effort: "high" }
97091
+ current: { model: LATEST_MODEL_BY_FAMILY.gptAstra, effort: "high" }
96911
97092
  }
96912
97093
  ]
96913
97094
  ],
@@ -96916,7 +97097,7 @@ var MANAGED_REASONING_DEFAULT_UPGRADES = new Map([
96916
97097
  [
96917
97098
  {
96918
97099
  previous: { model: "gpt-5.6-luna", effort: "high" },
96919
- current: { model: "gpt-6-astra", effort: "high" }
97100
+ current: { model: LATEST_MODEL_BY_FAMILY.gptAstra, effort: "high" }
96920
97101
  }
96921
97102
  ]
96922
97103
  ],
@@ -96933,7 +97114,7 @@ var MANAGED_REASONING_DEFAULT_UPGRADES = new Map([
96933
97114
  },
96934
97115
  {
96935
97116
  previous: { model: "gpt-5.6-terra", effort: "high" },
96936
- current: { model: "gpt-6-astra", effort: "high" }
97117
+ current: { model: LATEST_MODEL_BY_FAMILY.gptAstra, effort: "high" }
96937
97118
  }
96938
97119
  ]
96939
97120
  ],
@@ -96950,7 +97131,7 @@ var MANAGED_REASONING_DEFAULT_UPGRADES = new Map([
96950
97131
  },
96951
97132
  {
96952
97133
  previous: { model: "gpt-5.6-sol", effort: "high" },
96953
- current: { model: "gpt-6-astra", effort: "high" }
97134
+ current: { model: LATEST_MODEL_BY_FAMILY.gptAstra, effort: "high" }
96954
97135
  }
96955
97136
  ]
96956
97137
  ],
@@ -96967,7 +97148,7 @@ var MANAGED_REASONING_DEFAULT_UPGRADES = new Map([
96967
97148
  },
96968
97149
  {
96969
97150
  previous: { model: "gpt-5.6-terra", effort: "high" },
96970
- current: { model: "gpt-6-astra", effort: "high" }
97151
+ current: { model: LATEST_MODEL_BY_FAMILY.gptAstra, effort: "high" }
96971
97152
  }
96972
97153
  ]
96973
97154
  ],
@@ -96980,7 +97161,7 @@ var MANAGED_REASONING_DEFAULT_UPGRADES = new Map([
96980
97161
  },
96981
97162
  {
96982
97163
  previous: { model: "gpt-5.6-sol", effort: "medium" },
96983
- current: { model: "gpt-6-astra", effort: "medium" }
97164
+ current: { model: LATEST_MODEL_BY_FAMILY.gptAstra, effort: "medium" }
96984
97165
  }
96985
97166
  ]
96986
97167
  ],
@@ -96993,7 +97174,7 @@ var MANAGED_REASONING_DEFAULT_UPGRADES = new Map([
96993
97174
  },
96994
97175
  {
96995
97176
  previous: { model: "gpt-5.6-terra", effort: "medium" },
96996
- current: { model: "gpt-6-astra", effort: "medium" }
97177
+ current: { model: LATEST_MODEL_BY_FAMILY.gptAstra, effort: "medium" }
96997
97178
  }
96998
97179
  ]
96999
97180
  ],
@@ -97006,7 +97187,7 @@ var MANAGED_REASONING_DEFAULT_UPGRADES = new Map([
97006
97187
  },
97007
97188
  {
97008
97189
  previous: { model: "gpt-5.6-terra", effort: "high" },
97009
- current: { model: "gpt-6-astra", effort: "high" }
97190
+ current: { model: LATEST_MODEL_BY_FAMILY.gptAstra, effort: "high" }
97010
97191
  }
97011
97192
  ]
97012
97193
  ],
@@ -97019,7 +97200,7 @@ var MANAGED_REASONING_DEFAULT_UPGRADES = new Map([
97019
97200
  },
97020
97201
  {
97021
97202
  previous: { model: "gpt-5.6-luna", effort: "high" },
97022
- current: { model: "gpt-6-astra", effort: "high" }
97203
+ current: { model: LATEST_MODEL_BY_FAMILY.gptAstra, effort: "high" }
97023
97204
  }
97024
97205
  ]
97025
97206
  ],
@@ -97036,7 +97217,7 @@ var MANAGED_REASONING_DEFAULT_UPGRADES = new Map([
97036
97217
  },
97037
97218
  {
97038
97219
  previous: { model: "gpt-5.6-sol", effort: "low" },
97039
- current: { model: "gpt-6-astra", effort: "low" }
97220
+ current: { model: LATEST_MODEL_BY_FAMILY.gptAstra, effort: "low" }
97040
97221
  }
97041
97222
  ]
97042
97223
  ]
@@ -97366,7 +97547,7 @@ function nodeErrorCode2(error) {
97366
97547
  }
97367
97548
 
97368
97549
  // packages/omo-codex/src/install/default-agent-role.ts
97369
- import { createHash as createHash3 } from "node:crypto";
97550
+ import { createHash as createHash4 } from "node:crypto";
97370
97551
  import { lstat as lstat9, readFile as readFile16, rm as rm10 } from "node:fs/promises";
97371
97552
  import { join as join43 } from "node:path";
97372
97553
  var REGISTRATION = { name: "default", configFile: "./agents/default.toml" };
@@ -97422,7 +97603,7 @@ async function readIfPresent(path) {
97422
97603
  }
97423
97604
  }
97424
97605
  function hash(content) {
97425
- return createHash3("sha256").update(content).digest("hex");
97606
+ return createHash4("sha256").update(content).digest("hex");
97426
97607
  }
97427
97608
 
97428
97609
  // packages/omo-codex/src/install/link-cached-plugin-agents.ts
@@ -98087,7 +98268,7 @@ function formatUnknownError(error) {
98087
98268
  }
98088
98269
 
98089
98270
  // packages/omo-codex/src/install/lsp-daemon-reaper.ts
98090
- import { createHash as createHash4 } from "node:crypto";
98271
+ import { createHash as createHash5 } from "node:crypto";
98091
98272
  import { lstat as lstat12, readFile as readFile22, readdir as readdir10, rm as rm12 } from "node:fs/promises";
98092
98273
  import { tmpdir as tmpdir3 } from "node:os";
98093
98274
  import { join as join48, posix as posix6 } from "node:path";
@@ -98365,7 +98546,7 @@ async function readRegularTrimmedFile(path) {
98365
98546
  return content.length > 0 ? content : null;
98366
98547
  }
98367
98548
  function shortDigest(value) {
98368
- return createHash4("sha256").update(value).digest("hex").slice(0, 16);
98549
+ return createHash5("sha256").update(value).digest("hex").slice(0, 16);
98369
98550
  }
98370
98551
  async function removeVersionDir(path) {
98371
98552
  await rm12(path, { recursive: true, force: true });
@@ -98407,13 +98588,13 @@ function processIsRunning(pid) {
98407
98588
  }
98408
98589
 
98409
98590
  // packages/omo-codex/src/install/codex-installer-bin-dir.ts
98410
- import { homedir as homedir5 } from "node:os";
98591
+ import { homedir as homedir6 } from "node:os";
98411
98592
  import { join as join49, resolve as resolve12 } from "node:path";
98412
98593
  function resolveCodexInstallerBinDir(input) {
98413
98594
  const explicitBinDir = input.binDir ?? input.env?.CODEX_LOCAL_BIN_DIR;
98414
98595
  if (explicitBinDir !== undefined && explicitBinDir.trim().length > 0)
98415
98596
  return resolve12(explicitBinDir.trim());
98416
- const homeDir = input.homeDir ?? homedir5();
98597
+ const homeDir = input.homeDir ?? homedir6();
98417
98598
  const defaultCodexHome = resolve12(homeDir, ".codex");
98418
98599
  const resolvedCodexHome = resolve12(input.codexHome);
98419
98600
  if (resolvedCodexHome !== defaultCodexHome)
@@ -98539,7 +98720,7 @@ async function runCodexInstaller(options = {}) {
98539
98720
  const env = options.env ?? process.env;
98540
98721
  const platform = options.platform ?? process.platform;
98541
98722
  const repoRoot = resolve13(options.repoRoot ?? findRepoRoot({ importerDir: import.meta.dir, env }));
98542
- const codexHome = resolve13(options.codexHome ?? env.CODEX_HOME ?? join56(homedir6(), ".codex"));
98723
+ const codexHome = resolve13(options.codexHome ?? env.CODEX_HOME ?? join56(homedir7(), ".codex"));
98543
98724
  const projectDirectory = resolve13(options.projectDirectory ?? env.OMO_CODEX_PROJECT ?? process.cwd());
98544
98725
  const binDir = resolveCodexInstallerBinDir({ binDir: options.binDir, codexHome, env });
98545
98726
  const runCommand = options.runCommand ?? defaultRunCommand;
@@ -98731,7 +98912,7 @@ function codexMarketplaceSource(marketplaceRoot) {
98731
98912
  init_bun_which_shim();
98732
98913
  import { execFile as execFile2 } from "node:child_process";
98733
98914
  import { existsSync as existsSync28 } from "node:fs";
98734
- import { homedir as homedir7 } from "node:os";
98915
+ import { homedir as homedir8 } from "node:os";
98735
98916
  import { posix as posix8, win32 as win324 } from "node:path";
98736
98917
  var CODEX_PATH_CHECK_LABEL = "codex (PATH)";
98737
98918
  var WINDOWS_START_APPS_ARGS = [
@@ -98742,7 +98923,7 @@ var WINDOWS_START_APPS_ARGS = [
98742
98923
  async function detectCodexInstallation(input = {}) {
98743
98924
  const platform = input.platform ?? process.platform;
98744
98925
  const env = input.env ?? process.env;
98745
- const homeDir = input.homeDir ?? homedir7();
98926
+ const homeDir = input.homeDir ?? homedir8();
98746
98927
  const exists = input.exists ?? existsSync28;
98747
98928
  const which = input.which ?? bunWhich;
98748
98929
  const checkedPaths = [CODEX_PATH_CHECK_LABEL];
@@ -98858,7 +99039,7 @@ function defaultRunCommand2(command, args) {
98858
99039
  }
98859
99040
  // packages/omo-codex/src/install/codex-cleanup.ts
98860
99041
  import { lstat as lstat15, readFile as readFile27, readdir as readdir13, rm as rm14, rmdir } from "node:fs/promises";
98861
- import { homedir as homedir8 } from "node:os";
99042
+ import { homedir as homedir9 } from "node:os";
98862
99043
  import { isAbsolute as isAbsolute11, join as join59, relative as relative6, resolve as resolve16 } from "node:path";
98863
99044
 
98864
99045
  // packages/omo-codex/src/install/codex-cleanup-bins.ts
@@ -99097,7 +99278,7 @@ function skipped(path, reason) {
99097
99278
  var INSTALLED_AGENTS_MANIFEST = ".installed-agents.json";
99098
99279
  async function cleanupCodexLight(input = {}) {
99099
99280
  const env = input.env ?? process.env;
99100
- const codexHome = resolve16(input.codexHome ?? env.CODEX_HOME ?? join59(homedir8(), ".codex"));
99281
+ const codexHome = resolve16(input.codexHome ?? env.CODEX_HOME ?? join59(homedir9(), ".codex"));
99101
99282
  const configPath = join59(codexHome, "config.toml");
99102
99283
  const installedBinDir = await readInstalledCodexBinDir(codexHome);
99103
99284
  const agentPaths = await collectInstalledAgentPaths(codexHome, configPath);
@@ -99309,14 +99490,14 @@ function nodeErrorCode6(error) {
99309
99490
  // packages/omo-senpi/src/install/install-senpi.ts
99310
99491
  import { execFile as execFile3 } from "node:child_process";
99311
99492
  import { existsSync as existsSync31 } from "node:fs";
99312
- import { homedir as homedir11 } from "node:os";
99493
+ import { homedir as homedir12 } from "node:os";
99313
99494
  import { dirname as dirname25, join as join64, resolve as resolve20 } from "node:path";
99314
99495
  import { fileURLToPath } from "node:url";
99315
99496
  import { promisify as promisify2 } from "node:util";
99316
99497
 
99317
- // packages/omo-senpi/src/components/agent-home/resolve-agent-home.ts
99498
+ // packages/senpi-task/src/agent-home.ts
99318
99499
  import { existsSync as existsSync29 } from "node:fs";
99319
- import { homedir as homedir9 } from "node:os";
99500
+ import { homedir as homedir10 } from "node:os";
99320
99501
  import { join as join60, resolve as resolve17 } from "node:path";
99321
99502
  var AGENT_DIR_ENV_NAMES = [
99322
99503
  "OMO_CODING_AGENT_DIR",
@@ -99325,7 +99506,7 @@ var AGENT_DIR_ENV_NAMES = [
99325
99506
  ];
99326
99507
  var AGENT_HOME_SENTINEL = "settings.json";
99327
99508
  function resolveAgentHome(options) {
99328
- const { env, homeDir = homedir9(), exists = existsSync29 } = options;
99509
+ const { env, homeDir = homedir10(), exists = existsSync29 } = options;
99329
99510
  for (const name of AGENT_DIR_ENV_NAMES) {
99330
99511
  const configured = env[name]?.trim();
99331
99512
  if (configured)
@@ -99339,16 +99520,15 @@ function resolveAgentHome(options) {
99339
99520
  return brandedHome;
99340
99521
  return join60(homeDir, ".senpi", "agent");
99341
99522
  }
99342
-
99343
99523
  // packages/omo-senpi/src/install/local-launcher.ts
99344
99524
  import { chmodSync as chmodSync3, existsSync as existsSync30, mkdirSync as mkdirSync12, readFileSync as readFileSync14, rmSync as rmSync4, writeFileSync as writeFileSync7 } from "node:fs";
99345
- import { homedir as homedir10 } from "node:os";
99525
+ import { homedir as homedir11 } from "node:os";
99346
99526
  import { dirname as dirname22, join as join61, resolve as resolve18 } from "node:path";
99347
99527
  var MARKER = "omo-local-launcher";
99348
- function localLauncherPath(homeDir = homedir10()) {
99528
+ function localLauncherPath(homeDir = homedir11()) {
99349
99529
  return join61(homeDir, ".local", "bin", "omo");
99350
99530
  }
99351
- function localLauncherCmdPath(homeDir = homedir10()) {
99531
+ function localLauncherCmdPath(homeDir = homedir11()) {
99352
99532
  return join61(homeDir, ".local", "bin", "omo.cmd");
99353
99533
  }
99354
99534
  function releaseChannel(version) {
@@ -99437,7 +99617,7 @@ node "%~dp0omo" %*\r
99437
99617
  }
99438
99618
 
99439
99619
  // packages/omo-senpi/src/install/plugin-artifacts.ts
99440
- import { createHash as createHash6 } from "node:crypto";
99620
+ import { createHash as createHash7 } from "node:crypto";
99441
99621
  import { constants as constants9 } from "node:fs";
99442
99622
  import { access as access2, readFile as readFile29, stat as stat6 } from "node:fs/promises";
99443
99623
  import { dirname as dirname24, join as join63 } from "node:path";
@@ -99581,6 +99761,8 @@ var REQUIRED_PLUGIN_ARTIFACTS = [
99581
99761
  join63("extensions", "omo-memory-doctor.js"),
99582
99762
  join63("extensions", "omo-memory-memfs.js"),
99583
99763
  join63("extensions", "omo-memory-palace.js"),
99764
+ join63("extensions", "omo-device-account.js"),
99765
+ join63("extensions", "omo-memory-commands.js"),
99584
99766
  join63("extensions", "omo-session-history.js"),
99585
99767
  join63("extensions", "omo-recall-store.js"),
99586
99768
  join63("extensions", "omo-telemetry-posthog.js"),
@@ -99588,6 +99770,7 @@ var REQUIRED_PLUGIN_ARTIFACTS = [
99588
99770
  join63("extensions", "loro_wasm_bg.wasm"),
99589
99771
  join63("extensions", "CaseFolding.txt"),
99590
99772
  join63("extensions", "omo-thread-client.js"),
99773
+ join63("extensions", "omo-telemetry-recovery.js"),
99591
99774
  join63("extensions", "omo-feedback.js"),
99592
99775
  join63("extensions", "omo-claim-receipt.js"),
99593
99776
  join63("extensions", "assets.generated.json"),
@@ -99678,7 +99861,7 @@ async function verifyAstGrepRuntimeIntegrity(pluginPath, platform) {
99678
99861
  }
99679
99862
  let actualSha256;
99680
99863
  try {
99681
- actualSha256 = createHash6("sha256").update(await readFile29(runtimeEntry)).digest("hex");
99864
+ actualSha256 = createHash7("sha256").update(await readFile29(runtimeEntry)).digest("hex");
99682
99865
  } catch (error) {
99683
99866
  throw astGrepIntegrityError(runtimeEntry, `runtime hash could not be computed: ${messageOf(error)}`);
99684
99867
  }
@@ -99747,7 +99930,7 @@ function resolveInstallContext(options) {
99747
99930
  const env = options.env ?? process.env;
99748
99931
  const allowBuild = options.pluginPath === undefined;
99749
99932
  const repoRoot = resolve20(options.repoRoot ?? (allowBuild ? findRepoRoot2(dirname25(fileURLToPath(import.meta.url))) : dirname25(resolve20(options.pluginPath))));
99750
- const homeDir = options.homeDir ?? env.HOME ?? homedir11();
99933
+ const homeDir = options.homeDir ?? env.HOME ?? homedir12();
99751
99934
  const agentDir = resolve20(options.agentDir ?? resolveAgentHome({ env, homeDir }));
99752
99935
  const pluginPath = resolve20(options.pluginPath ?? join64(repoRoot, "packages", "omo-senpi", "plugin"));
99753
99936
  return {
@@ -100043,7 +100226,7 @@ function shadowWarning(resolved, native, isWindows) {
100043
100226
  // packages/omo-opencode/src/cli/install-native/run-native-install.ts
100044
100227
  init_bun_which_shim();
100045
100228
  init_spawn_with_windows_hide();
100046
- import { homedir as homedir12 } from "node:os";
100229
+ import { homedir as homedir13 } from "node:os";
100047
100230
  function describeExit(plan, result) {
100048
100231
  const stderr = result.stderr?.trim();
100049
100232
  const head = `${plan.packageManager} exited with code ${result.exitCode}`;
@@ -100107,7 +100290,7 @@ function nativeInstallFailureLines(failure) {
100107
100290
  function defaultNativeInstallDependencies() {
100108
100291
  return {
100109
100292
  isBunAvailable: () => bunWhich("bun") !== null,
100110
- environment: resolveOmoBinEnvironment({ env: process.env, platform: process.platform, homeDir: homedir12() }),
100293
+ environment: resolveOmoBinEnvironment({ env: process.env, platform: process.platform, homeDir: homedir13() }),
100111
100294
  spawn: async (command, args) => {
100112
100295
  const proc = spawnWithWindowsHide([command, ...args], {
100113
100296
  env: process.env,
@@ -100509,7 +100692,7 @@ async function checkTuiPluginConfig() {
100509
100692
  if (!server.registered && tui.registered) {
100510
100693
  issues.push({
100511
100694
  title: "Server plugin entry missing from opencode.json",
100512
- description: `The TUI plugin entry ("${PLUGIN_NAME}") is registered in tui.json, ` + "but the server plugin (oh-my-openagent) is missing from opencode.json. " + "The plugin cannot function correctly without both halves — the server side " + "handles tool dispatch, hook execution, and SDK integration.",
100695
+ description: `The TUI plugin entry ("${PLUGIN_NAME}") is registered in tui.json, ` + "but the server plugin (oh-my-openagent) is missing from opencode.json. " + "The plugin cannot function correctly without both halves: the server side " + "handles tool dispatch, hook execution, and SDK integration.",
100513
100696
  fix: "Re-run the installer (`npx oh-my-openagent install`) to auto-write opencode.json, " + `or add "${PLUGIN_NAME}" to the "plugin" array in ${server.configPath ?? "opencode.json"}.`,
100514
100697
  affects: ["tool dispatch", "hook execution", "SDK integration"],
100515
100698
  severity: "warning"
@@ -100678,7 +100861,7 @@ function refreshOpenCodePluginSandboxes(options = {}) {
100678
100861
  }
100679
100862
 
100680
100863
  // packages/omo-opencode/src/cli/install-ast-grep-sg.ts
100681
- import { homedir as homedir13 } from "node:os";
100864
+ import { homedir as homedir14 } from "node:os";
100682
100865
  import { join as join69 } from "node:path";
100683
100866
 
100684
100867
  // packages/shared-skills/index.mjs
@@ -100701,7 +100884,7 @@ function describeResult2(result) {
100701
100884
  }
100702
100885
  async function installAstGrepForOpenCode(options = {}) {
100703
100886
  const platform = options.platform ?? process.platform;
100704
- const baseDir = join69(options.homeDir ?? homedir13(), ".omo");
100887
+ const baseDir = join69(options.homeDir ?? homedir14(), ".omo");
100705
100888
  const targetDir = astGrepRuntimeDir(baseDir, platform, options.arch ?? process.arch);
100706
100889
  const skillDir = join69(options.sharedSkillsRoot ?? sharedSkillsRootPath(), "ast-grep");
100707
100890
  const installer = options.installer ?? runAstGrepSkillInstall;
@@ -103275,9 +103458,250 @@ async function processEvents(ctx, stream, state) {
103275
103458
  }
103276
103459
  }
103277
103460
  }
103461
+ // packages/omo-opencode/src/config/validate.ts
103462
+ import { dirname as dirname29, isAbsolute as isAbsolute13, join as join74, relative as relative7 } from "node:path";
103463
+
103464
+ // packages/skills-loader-core/src/shared/skill-path-resolver.ts
103465
+ init_skill_path_resolver();
103466
+
103467
+ // packages/skills-loader-core/src/features/opencode-skill-loader/skill-mcp-config.ts
103468
+ init_js_yaml();
103469
+
103470
+ // packages/skills-loader-core/src/features/opencode-skill-loader/skill-provenance.ts
103471
+ import { basename as basename11, dirname as dirname28, join as join73, resolve as resolve23, sep as sep9 } from "node:path";
103472
+ import { homedir as homedir16 } from "node:os";
103473
+
103474
+ // packages/skills-loader-core/src/shared/claude-config-dir.ts
103475
+ init_src();
103476
+ import { join as join70 } from "node:path";
103477
+ function getClaudeConfigDir() {
103478
+ const envConfigDir = process.env.CLAUDE_CONFIG_DIR;
103479
+ if (envConfigDir) {
103480
+ return envConfigDir;
103481
+ }
103482
+ return join70(getHomeDirectory(), ".claude");
103483
+ }
103484
+ // packages/skills-loader-core/src/shared/opencode-config-dir.ts
103485
+ import { existsSync as existsSync36, realpathSync as realpathSync9 } from "node:fs";
103486
+ import { homedir as homedir15 } from "node:os";
103487
+ import { join as join71, posix as posix10, resolve as resolve21, win32 as win326 } from "node:path";
103488
+
103489
+ // packages/skills-loader-core/src/shared/plugin-identity.ts
103490
+ init_src();
103491
+ var PRODUCT_IDENTITY = createProductIdentity({
103492
+ pluginName: "oh-my-openagent",
103493
+ legacyPluginName: "oh-my-opencode",
103494
+ publishedPackageName: "oh-my-opencode",
103495
+ configBasename: "oh-my-openagent",
103496
+ legacyConfigBasename: "oh-my-opencode",
103497
+ logFileName: "oh-my-opencode.log",
103498
+ cacheDirName: "oh-my-opencode"
103499
+ });
103500
+ var PLUGIN_NAME2 = PRODUCT_IDENTITY.pluginName;
103501
+ var LEGACY_PLUGIN_NAME2 = PRODUCT_IDENTITY.legacyPluginName;
103502
+ var PUBLISHED_PACKAGE_NAME2 = PRODUCT_IDENTITY.publishedPackageName;
103503
+ var CONFIG_BASENAME = PRODUCT_IDENTITY.configBasename;
103504
+ var LEGACY_CONFIG_BASENAME = PRODUCT_IDENTITY.legacyConfigBasename;
103505
+ var LOG_FILENAME3 = PRODUCT_IDENTITY.logFileName;
103506
+ var CACHE_DIR_NAME3 = PRODUCT_IDENTITY.cacheDirName;
103507
+
103508
+ // packages/skills-loader-core/src/shared/opencode-config-dir.ts
103509
+ var TAURI_APP_IDENTIFIER2 = "ai.opencode.desktop";
103510
+ var TAURI_APP_IDENTIFIER_DEV2 = "ai.opencode.desktop.dev";
103511
+ function isDevBuild2(version) {
103512
+ if (!version)
103513
+ return false;
103514
+ return version.includes("-dev") || version.includes(".dev");
103515
+ }
103516
+ function getTauriConfigDir2(identifier) {
103517
+ const platform = process.platform;
103518
+ switch (platform) {
103519
+ case "darwin":
103520
+ return join71(homedir15(), "Library", "Application Support", identifier);
103521
+ case "win32": {
103522
+ const appData = process.env.APPDATA || join71(homedir15(), "AppData", "Roaming");
103523
+ return win326.join(appData, identifier);
103524
+ }
103525
+ case "linux":
103526
+ default: {
103527
+ const xdgConfig = process.env.XDG_CONFIG_HOME || join71(homedir15(), ".config");
103528
+ return join71(xdgConfig, identifier);
103529
+ }
103530
+ }
103531
+ }
103532
+ function resolveConfigPath2(pathValue) {
103533
+ if (isWslEnvironment2() && pathValue.startsWith("/")) {
103534
+ return posix10.normalize(pathValue);
103535
+ }
103536
+ const resolvedPath = resolve21(pathValue);
103537
+ if (!existsSync36(resolvedPath))
103538
+ return resolvedPath;
103539
+ try {
103540
+ return realpathSync9(resolvedPath);
103541
+ } catch (error) {
103542
+ if (error instanceof Error) {
103543
+ return resolvedPath;
103544
+ }
103545
+ return resolvedPath;
103546
+ }
103547
+ }
103548
+ function isWslEnvironment2() {
103549
+ return process.platform === "linux" && (Boolean(process.env.WSL_DISTRO_NAME?.trim()) || Boolean(process.env.WSL_INTEROP?.trim()));
103550
+ }
103551
+ function isWindowsUserConfigRoot2(pathValue) {
103552
+ const normalizedPath = pathValue.replaceAll("\\", "/").toLowerCase();
103553
+ return /^[a-z]:\/users\//.test(normalizedPath) || /^\/mnt\/[a-z]\/users\//.test(normalizedPath);
103554
+ }
103555
+ function getWindowsUserFromConfigRoot2(pathValue) {
103556
+ const normalizedPath = pathValue.replaceAll("\\", "/");
103557
+ const match = /^(?:[a-z]:|\/mnt\/[a-z])\/Users\/([^/]+)/i.exec(normalizedPath);
103558
+ return match?.[1] ?? null;
103559
+ }
103560
+ function getWslLinuxHomeDir2(windowsConfigRoot) {
103561
+ const envHome = process.env.HOME?.trim();
103562
+ if (envHome && envHome.startsWith("/") && !isWindowsUserConfigRoot2(envHome)) {
103563
+ return envHome;
103564
+ }
103565
+ const user = process.env.USER?.trim() || process.env.LOGNAME?.trim() || process.env.SUDO_USER?.trim() || (windowsConfigRoot ? getWindowsUserFromConfigRoot2(windowsConfigRoot) : undefined);
103566
+ return user ? posix10.join("/home", user) : null;
103567
+ }
103568
+ function getCliDefaultConfigDir2() {
103569
+ const envXdgConfig = process.env.XDG_CONFIG_HOME?.trim();
103570
+ const shouldIgnoreWindowsXdg = envXdgConfig !== undefined && envXdgConfig.length > 0 && isWslEnvironment2() && isWindowsUserConfigRoot2(envXdgConfig);
103571
+ const xdgConfig = shouldIgnoreWindowsXdg ? posix10.join(getWslLinuxHomeDir2(envXdgConfig) ?? "/home", ".config") : envXdgConfig || join71(homedir15(), ".config");
103572
+ const configDir = isWslEnvironment2() ? posix10.join(xdgConfig, "opencode") : join71(xdgConfig, "opencode");
103573
+ return resolveConfigPath2(configDir);
103574
+ }
103575
+ function getCliCustomConfigDir2() {
103576
+ const envConfigDir = process.env.OPENCODE_CONFIG_DIR?.trim();
103577
+ if (!envConfigDir) {
103578
+ return null;
103579
+ }
103580
+ return resolveConfigPath2(envConfigDir);
103581
+ }
103582
+ function getCliConfigDir2() {
103583
+ return getCliCustomConfigDir2() ?? getCliDefaultConfigDir2();
103584
+ }
103585
+ function getOpenCodeConfigDirs2(options) {
103586
+ if (options.binary !== "opencode") {
103587
+ return [getOpenCodeConfigDir2(options)];
103588
+ }
103589
+ const customConfigDir = getCliCustomConfigDir2();
103590
+ return Array.from(new Set([
103591
+ ...customConfigDir ? [customConfigDir] : [],
103592
+ getCliDefaultConfigDir2()
103593
+ ]));
103594
+ }
103595
+ function getOpenCodeConfigDir2(options) {
103596
+ const { binary, version, checkExisting = true } = options;
103597
+ if (binary === "opencode") {
103598
+ return getCliConfigDir2();
103599
+ }
103600
+ const identifier = isDevBuild2(version) ? TAURI_APP_IDENTIFIER_DEV2 : TAURI_APP_IDENTIFIER2;
103601
+ const tauriDirBase = getTauriConfigDir2(identifier);
103602
+ const tauriDir = process.platform === "win32" ? win326.isAbsolute(tauriDirBase) ? win326.normalize(tauriDirBase) : win326.resolve(tauriDirBase) : resolveConfigPath2(tauriDirBase);
103603
+ if (checkExisting) {
103604
+ const legacyDir = getCliConfigDir2();
103605
+ const legacyConfig = join71(legacyDir, "opencode.json");
103606
+ const legacyConfigC = join71(legacyDir, "opencode.jsonc");
103607
+ if (existsSync36(legacyConfig) || existsSync36(legacyConfigC)) {
103608
+ return legacyDir;
103609
+ }
103610
+ }
103611
+ return tauriDir;
103612
+ }
103613
+ // packages/skills-loader-core/src/shared/project-discovery-dirs.ts
103614
+ import { execFileSync as execFileSync3 } from "node:child_process";
103615
+ import { existsSync as existsSync37, realpathSync as realpathSync10 } from "node:fs";
103616
+ import { dirname as dirname27, join as join72, resolve as resolve22, win32 as win327 } from "node:path";
103617
+ var worktreePathCache2 = new Map;
103618
+ function normalizePath(path) {
103619
+ const resolvedPath = process.platform !== "win32" && win327.isAbsolute(path) ? path : resolve22(path);
103620
+ if (!existsSync37(resolvedPath)) {
103621
+ return resolvedPath;
103622
+ }
103623
+ try {
103624
+ return realpathSync10.native(resolvedPath);
103625
+ } catch (error) {
103626
+ if (!(error instanceof Error)) {
103627
+ throw error;
103628
+ }
103629
+ try {
103630
+ return realpathSync10(resolvedPath);
103631
+ } catch (fallbackError) {
103632
+ if (!(fallbackError instanceof Error)) {
103633
+ throw fallbackError;
103634
+ }
103635
+ return resolvedPath;
103636
+ }
103637
+ }
103638
+ }
103639
+ function pathKey2(path) {
103640
+ const normalized = path.replace(/\\/g, "/");
103641
+ return process.platform === "win32" ? normalized.toLowerCase() : normalized;
103642
+ }
103643
+ function detectWorktreePath(directory) {
103644
+ const resolvedDirectory = resolve22(directory);
103645
+ const cacheKey = pathKey2(normalizePath(resolvedDirectory));
103646
+ if (worktreePathCache2.has(cacheKey)) {
103647
+ return worktreePathCache2.get(cacheKey);
103648
+ }
103649
+ let ancestor = normalizePath(resolvedDirectory);
103650
+ while (true) {
103651
+ if (existsSync37(join72(ancestor, ".git"))) {
103652
+ worktreePathCache2.set(cacheKey, ancestor);
103653
+ return ancestor;
103654
+ }
103655
+ const parent = dirname27(ancestor);
103656
+ if (parent === ancestor)
103657
+ break;
103658
+ ancestor = parent;
103659
+ }
103660
+ try {
103661
+ const worktreePath = execFileSync3("git", ["rev-parse", "--show-toplevel"], {
103662
+ cwd: resolvedDirectory,
103663
+ encoding: "utf-8",
103664
+ timeout: 5000,
103665
+ stdio: ["pipe", "pipe", "pipe"]
103666
+ }).trim();
103667
+ const normalizedWorktreePath = normalizePath(worktreePath);
103668
+ worktreePathCache2.set(cacheKey, normalizedWorktreePath);
103669
+ return normalizedWorktreePath;
103670
+ } catch (error) {
103671
+ if (!(error instanceof Error)) {
103672
+ throw error;
103673
+ }
103674
+ worktreePathCache2.set(cacheKey, undefined);
103675
+ return;
103676
+ }
103677
+ }
103678
+ // packages/skills-loader-core/src/shared/internal-initiator-marker.ts
103679
+ init_internal_initiator_marker();
103680
+ // packages/skills-loader-core/src/features/opencode-skill-loader/skill-provenance.ts
103681
+ var observers = new Set;
103682
+ function knownUserSkillRoots() {
103683
+ const home = homedir16();
103684
+ return [
103685
+ join73(getClaudeConfigDir(), "skills"),
103686
+ join73(home, ".agents", "skills"),
103687
+ join73(home, ".omo", "agent", "skills"),
103688
+ join73(home, ".senpi", "agent", "skills"),
103689
+ sharedSkillsRootPath(),
103690
+ ...getOpenCodeConfigDirs2({ binary: "opencode" }).flatMap((dir) => [
103691
+ join73(dir, "skills"),
103692
+ join73(dir, "skill")
103693
+ ])
103694
+ ];
103695
+ }
103696
+
103697
+ // packages/skills-loader-core/src/features/opencode-skill-loader/config-source-discovery.ts
103698
+ var sourceOrigins = new WeakMap;
103699
+ function setSkillSourceProvenance(config, provenance) {
103700
+ sourceOrigins.set(config, provenance);
103701
+ }
103702
+
103278
103703
  // packages/omo-opencode/src/config/validate.ts
103279
103704
  init_src4();
103280
- import { relative as relative7 } from "node:path";
103281
103705
 
103282
103706
  // packages/omo-opencode/src/shared/disabled-providers.ts
103283
103707
  init_config_errors();
@@ -103401,7 +103825,7 @@ function appendViews(views, layers, select, keyPrefix) {
103401
103825
  for (const layer of layers) {
103402
103826
  const config = select(layer.config);
103403
103827
  if (Object.keys(config).length > 0)
103404
- views.push({ config, keyPrefix, path: layer.source.path });
103828
+ views.push({ config, keyPrefix, path: layer.source.path, scope: layer.source.scope });
103405
103829
  }
103406
103830
  }
103407
103831
  function recordFields(value, fields) {
@@ -103931,7 +104355,7 @@ var GitEnvPrefixSchema2 = string2().refine(isValidGitEnvPrefix, { message: GIT_E
103931
104355
  init_zod();
103932
104356
  var GitMasterConfigSchema = object({
103933
104357
  commit_footer: union([boolean2(), string2()]).default(false),
103934
- include_co_authored_by: boolean2().default(false),
104358
+ include_co_authored_by: boolean2().default(true),
103935
104359
  git_env_prefix: GitEnvPrefixSchema2
103936
104360
  });
103937
104361
  // packages/omo-opencode/src/config/schema/hooks.ts
@@ -104240,7 +104664,7 @@ var OhMyOpenCodeConfigSchema = object({
104240
104664
  babysitting: BabysittingConfigSchema.optional(),
104241
104665
  git_master: GitMasterConfigSchema.default({
104242
104666
  commit_footer: false,
104243
- include_co_authored_by: false,
104667
+ include_co_authored_by: true,
104244
104668
  git_env_prefix: "GIT_MASTER=1"
104245
104669
  }),
104246
104670
  browser_automation_engine: BrowserAutomationConfigSchema.optional(),
@@ -104411,6 +104835,28 @@ function validatePluginConfig(directory, environment = process.env) {
104411
104835
  const userConfig = parseConfig(prunePluginView({ config: chain.protectedUserView, homeDir, keyPrefix: "", path: "" }).config);
104412
104836
  const config = applyDisabledProviders(materializeAgentModelChains(protectUserFields(mergeViews(views), userConfig)));
104413
104837
  warnLegacyUlwExecuteKey(chain.views);
104838
+ if (config.skills) {
104839
+ const owner = chain.views.findLast((view) => Object.hasOwn(view.config, "skills"));
104840
+ const userRoots = [...knownUserSkillRoots()];
104841
+ for (const view of chain.views.filter((candidate) => candidate.scope === "user")) {
104842
+ const settings = OhMyOpenCodeConfigSchema.safeParse({ skills: view.config.skills });
104843
+ const skills = settings.success ? settings.data.skills : undefined;
104844
+ if (!skills || Array.isArray(skills))
104845
+ continue;
104846
+ for (const source of skills.sources ?? []) {
104847
+ const path = typeof source === "string" ? source : source.path;
104848
+ if (/^https?:\/\//.test(path))
104849
+ continue;
104850
+ userRoots.push(path.startsWith("~/") ? join74(homeDir ?? "", path.slice(2)) : isAbsolute13(path) ? path : join74(dirname29(view.path), path));
104851
+ }
104852
+ }
104853
+ setSkillSourceProvenance(config.skills, {
104854
+ kind: owner?.scope === "user" ? "user" : "project-auto",
104855
+ selectedRoot: owner ? dirname29(owner.path) : directory,
104856
+ projectRoot: detectWorktreePath(directory) ?? directory,
104857
+ userRoots
104858
+ });
104859
+ }
104414
104860
  return {
104415
104861
  valid: messages.length === 0,
104416
104862
  messages,
@@ -104434,7 +104880,7 @@ var import_picocolors11 = __toESM(require_picocolors(), 1);
104434
104880
  // packages/omo-opencode/src/cli/run/opencode-binary-resolver.ts
104435
104881
  init_bun_which_shim();
104436
104882
  init_spawn_with_windows_hide();
104437
- import { delimiter as delimiter2, dirname as dirname27, posix as posix10, win32 as win326 } from "node:path";
104883
+ import { delimiter as delimiter2, dirname as dirname30, posix as posix11, win32 as win328 } from "node:path";
104438
104884
  var OPENCODE_COMMANDS = ["opencode", "opencode-desktop"];
104439
104885
  var WINDOWS_SUFFIXES = ["", ".exe", ".cmd", ".bat", ".ps1"];
104440
104886
  function getCommandCandidates(platform) {
@@ -104444,8 +104890,8 @@ function getCommandCandidates(platform) {
104444
104890
  }
104445
104891
  function getPathTools(platform) {
104446
104892
  if (platform === "win32")
104447
- return win326;
104448
- return posix10;
104893
+ return win328;
104894
+ return posix11;
104449
104895
  }
104450
104896
  function collectCandidateBinaryPaths(pathEnv, which = bunWhich, platform = process.platform) {
104451
104897
  const seen = new Set;
@@ -104492,7 +104938,7 @@ async function findWorkingOpencodeBinary(pathEnv = process.env.PATH, probe = can
104492
104938
  return null;
104493
104939
  }
104494
104940
  function buildPathWithBinaryFirst(pathEnv, binaryPath) {
104495
- const preferredDir = dirname27(binaryPath);
104941
+ const preferredDir = dirname30(binaryPath);
104496
104942
  const existing = (pathEnv ?? "").split(delimiter2).filter((entry) => entry.length > 0 && entry !== preferredDir);
104497
104943
  return [preferredDir, ...existing].join(delimiter2);
104498
104944
  }
@@ -105099,9 +105545,9 @@ function buildTaskRef(section, label) {
105099
105545
  };
105100
105546
  }
105101
105547
  // packages/boulder-state/src/top-level-task.ts
105102
- import { existsSync as existsSync36, readFileSync as readFileSync19 } from "node:fs";
105548
+ import { existsSync as existsSync38, readFileSync as readFileSync19 } from "node:fs";
105103
105549
  function readCurrentTopLevelTask(planPath) {
105104
- if (!existsSync36(planPath)) {
105550
+ if (!existsSync38(planPath)) {
105105
105551
  return null;
105106
105552
  }
105107
105553
  try {
@@ -105112,13 +105558,13 @@ function readCurrentTopLevelTask(planPath) {
105112
105558
  }
105113
105559
  }
105114
105560
  // packages/boulder-state/src/storage/path.ts
105115
- import { existsSync as existsSync37 } from "node:fs";
105116
- import { isAbsolute as isAbsolute13, join as join70, relative as relative8, resolve as resolve21 } from "node:path";
105561
+ import { existsSync as existsSync39 } from "node:fs";
105562
+ import { isAbsolute as isAbsolute14, join as join75, relative as relative8, resolve as resolve24 } from "node:path";
105117
105563
  function getBoulderFilePath(directory) {
105118
- return join70(directory, BOULDER_DIR, BOULDER_FILE);
105564
+ return join75(directory, BOULDER_DIR, BOULDER_FILE);
105119
105565
  }
105120
105566
  function resolveTrackedPath(baseDirectory, trackedPath) {
105121
- return isAbsolute13(trackedPath) ? resolve21(trackedPath) : resolve21(baseDirectory, trackedPath);
105567
+ return isAbsolute14(trackedPath) ? resolve24(trackedPath) : resolve24(baseDirectory, trackedPath);
105122
105568
  }
105123
105569
  function resolveBoulderPlanPath(directory, state) {
105124
105570
  const absolutePlanPath = resolveTrackedPath(directory, state.active_plan);
@@ -105126,22 +105572,22 @@ function resolveBoulderPlanPath(directory, state) {
105126
105572
  if (!worktreePath) {
105127
105573
  return absolutePlanPath;
105128
105574
  }
105129
- const absoluteDirectory = resolve21(directory);
105575
+ const absoluteDirectory = resolve24(directory);
105130
105576
  const relativePlanPath = relative8(absoluteDirectory, absolutePlanPath);
105131
- if (relativePlanPath.length === 0 || relativePlanPath.startsWith("..") || isAbsolute13(relativePlanPath)) {
105577
+ if (relativePlanPath.length === 0 || relativePlanPath.startsWith("..") || isAbsolute14(relativePlanPath)) {
105132
105578
  return absolutePlanPath;
105133
105579
  }
105134
105580
  const absoluteWorktreePath = resolveTrackedPath(directory, worktreePath);
105135
- const worktreePlanPath = resolve21(absoluteWorktreePath, relativePlanPath);
105136
- return existsSync37(worktreePlanPath) ? worktreePlanPath : absolutePlanPath;
105581
+ const worktreePlanPath = resolve24(absoluteWorktreePath, relativePlanPath);
105582
+ return existsSync39(worktreePlanPath) ? worktreePlanPath : absolutePlanPath;
105137
105583
  }
105138
105584
  function resolveBoulderPlanPathForWork(directory, work) {
105139
105585
  return resolveBoulderPlanPath(directory, work);
105140
105586
  }
105141
105587
  // packages/boulder-state/src/storage/plan-progress.ts
105142
- import { existsSync as existsSync38, readFileSync as readFileSync20, readdirSync as readdirSync9, statSync as statSync5 } from "node:fs";
105588
+ import { existsSync as existsSync40, readFileSync as readFileSync20, readdirSync as readdirSync9, statSync as statSync5 } from "node:fs";
105143
105589
  function getPlanProgress(planPath) {
105144
- if (!existsSync38(planPath)) {
105590
+ if (!existsSync40(planPath)) {
105145
105591
  return { total: 0, completed: 0, isComplete: false };
105146
105592
  }
105147
105593
  try {
@@ -105224,10 +105670,10 @@ function selectMirrorWork(state) {
105224
105670
  return sorted[0] ?? null;
105225
105671
  }
105226
105672
  // packages/boulder-state/src/storage/read-state.ts
105227
- import { existsSync as existsSync39, readFileSync as readFileSync21 } from "node:fs";
105673
+ import { existsSync as existsSync41, readFileSync as readFileSync21 } from "node:fs";
105228
105674
  function readBoulderState(directory) {
105229
105675
  const filePath = getBoulderFilePath(directory);
105230
- if (!existsSync39(filePath)) {
105676
+ if (!existsSync41(filePath)) {
105231
105677
  return null;
105232
105678
  }
105233
105679
  try {
@@ -105299,14 +105745,14 @@ init_state();
105299
105745
  // packages/omo-opencode/src/features/run-continuation-state/constants.ts
105300
105746
  var CONTINUATION_MARKER_DIR = ".omo/run-continuation";
105301
105747
  // packages/omo-opencode/src/features/run-continuation-state/storage.ts
105302
- import { existsSync as existsSync40, mkdirSync as mkdirSync14, readFileSync as readFileSync22, rmSync as rmSync6, writeFileSync as writeFileSync8 } from "node:fs";
105303
- import { join as join71 } from "node:path";
105748
+ import { existsSync as existsSync42, mkdirSync as mkdirSync14, readFileSync as readFileSync22, rmSync as rmSync6, writeFileSync as writeFileSync8 } from "node:fs";
105749
+ import { join as join76 } from "node:path";
105304
105750
  function getMarkerPath(directory, sessionID) {
105305
- return join71(directory, CONTINUATION_MARKER_DIR, `${sessionID}.json`);
105751
+ return join76(directory, CONTINUATION_MARKER_DIR, `${sessionID}.json`);
105306
105752
  }
105307
105753
  function readContinuationMarker(directory, sessionID) {
105308
105754
  const markerPath = getMarkerPath(directory, sessionID);
105309
- if (!existsSync40(markerPath))
105755
+ if (!existsSync42(markerPath))
105310
105756
  return null;
105311
105757
  try {
105312
105758
  const raw = readFileSync22(markerPath, "utf-8");
@@ -105375,7 +105821,7 @@ async function isSessionInBoulderLineage(input) {
105375
105821
  init_shared();
105376
105822
  init_compaction_marker();
105377
105823
  import { readFileSync as readFileSync23, readdirSync as readdirSync10 } from "node:fs";
105378
- import { join as join72 } from "node:path";
105824
+ import { join as join77 } from "node:path";
105379
105825
  var defaultSessionLastAgentDeps = {
105380
105826
  getMessageDir,
105381
105827
  isSqliteBackend,
@@ -105435,7 +105881,7 @@ async function getLastAgentFromSession(sessionID, client, deps = {}) {
105435
105881
  try {
105436
105882
  const messages = readdirSync10(messageDir).filter((fileName) => fileName.endsWith(".json")).map((fileName) => {
105437
105883
  try {
105438
- const content = readFileSync23(join72(messageDir, fileName), "utf-8");
105884
+ const content = readFileSync23(join77(messageDir, fileName), "utf-8");
105439
105885
  const parsed = JSON.parse(content);
105440
105886
  return {
105441
105887
  fileName,
@@ -105478,8 +105924,8 @@ init_agent_display_names();
105478
105924
 
105479
105925
  // packages/omo-opencode/src/hooks/ralph-loop/storage.ts
105480
105926
  init_frontmatter2();
105481
- import { existsSync as existsSync41, readFileSync as readFileSync24, writeFileSync as writeFileSync9, unlinkSync as unlinkSync6, mkdirSync as mkdirSync15 } from "node:fs";
105482
- import { dirname as dirname28, join as join73 } from "node:path";
105927
+ import { existsSync as existsSync43, readFileSync as readFileSync24, writeFileSync as writeFileSync9, unlinkSync as unlinkSync6, mkdirSync as mkdirSync15 } from "node:fs";
105928
+ import { dirname as dirname31, join as join78 } from "node:path";
105483
105929
 
105484
105930
  // packages/omo-opencode/src/hooks/ralph-loop/constants.ts
105485
105931
  var DEFAULT_STATE_FILE = ".omo/ralph-loop.local.md";
@@ -105488,11 +105934,11 @@ var DEFAULT_COMPLETION_PROMISE = "DONE";
105488
105934
 
105489
105935
  // packages/omo-opencode/src/hooks/ralph-loop/storage.ts
105490
105936
  function getStateFilePath(directory, customPath) {
105491
- return customPath ? join73(directory, customPath) : join73(directory, DEFAULT_STATE_FILE);
105937
+ return customPath ? join78(directory, customPath) : join78(directory, DEFAULT_STATE_FILE);
105492
105938
  }
105493
105939
  function readState(directory, customPath) {
105494
105940
  const filePath = getStateFilePath(directory, customPath);
105495
- if (!existsSync41(filePath)) {
105941
+ if (!existsSync43(filePath)) {
105496
105942
  return null;
105497
105943
  }
105498
105944
  try {
@@ -106630,14 +107076,14 @@ async function getLocalVersion(options = {}) {
106630
107076
  }
106631
107077
  }
106632
107078
  // packages/omo-opencode/src/cli/doctor/checks/system.ts
106633
- import { existsSync as existsSync52, readFileSync as readFileSync34 } from "node:fs";
107079
+ import { existsSync as existsSync54, readFileSync as readFileSync34 } from "node:fs";
106634
107080
 
106635
107081
  // packages/omo-opencode/src/cli/doctor/checks/system-binary.ts
106636
107082
  init_extract_semver();
106637
107083
  init_bun_which_shim();
106638
- import { existsSync as existsSync49, accessSync as accessSync4, constants as constants12 } from "node:fs";
106639
- import { homedir as homedir16 } from "node:os";
106640
- import { join as join80 } from "node:path";
107084
+ import { existsSync as existsSync51, accessSync as accessSync4, constants as constants12 } from "node:fs";
107085
+ import { homedir as homedir19 } from "node:os";
107086
+ import { join as join85 } from "node:path";
106641
107087
 
106642
107088
  // packages/omo-opencode/src/cli/doctor/framework/spawn-with-timeout.ts
106643
107089
  init_spawn_with_windows_hide();
@@ -106724,22 +107170,22 @@ function isExecutable2(path) {
106724
107170
  }
106725
107171
  }
106726
107172
  function getDesktopAppPaths(platform) {
106727
- const home = homedir16();
107173
+ const home = homedir19();
106728
107174
  switch (platform) {
106729
107175
  case "darwin":
106730
107176
  return [
106731
107177
  "/Applications/OpenCode.app/Contents/MacOS/OpenCode",
106732
- join80(home, "Applications", "OpenCode.app", "Contents", "MacOS", "OpenCode")
107178
+ join85(home, "Applications", "OpenCode.app", "Contents", "MacOS", "OpenCode")
106733
107179
  ];
106734
107180
  case "win32": {
106735
107181
  const programFiles = process.env.ProgramFiles;
106736
107182
  const localAppData = process.env.LOCALAPPDATA;
106737
107183
  const paths = [];
106738
107184
  if (programFiles) {
106739
- paths.push(join80(programFiles, "OpenCode", "OpenCode.exe"));
107185
+ paths.push(join85(programFiles, "OpenCode", "OpenCode.exe"));
106740
107186
  }
106741
107187
  if (localAppData) {
106742
- paths.push(join80(localAppData, "OpenCode", "OpenCode.exe"));
107188
+ paths.push(join85(localAppData, "OpenCode", "OpenCode.exe"));
106743
107189
  }
106744
107190
  return paths;
106745
107191
  }
@@ -106747,8 +107193,8 @@ function getDesktopAppPaths(platform) {
106747
107193
  return [
106748
107194
  "/usr/bin/opencode",
106749
107195
  "/usr/lib/opencode/opencode",
106750
- join80(home, "Applications", "opencode-desktop-linux-x86_64.AppImage"),
106751
- join80(home, "Applications", "opencode-desktop-linux-aarch64.AppImage")
107196
+ join85(home, "Applications", "opencode-desktop-linux-x86_64.AppImage"),
107197
+ join85(home, "Applications", "opencode-desktop-linux-aarch64.AppImage")
106752
107198
  ];
106753
107199
  default:
106754
107200
  return [];
@@ -106760,7 +107206,7 @@ function buildVersionCommand(binaryPath, platform) {
106760
107206
  }
106761
107207
  return [binaryPath, "--version"];
106762
107208
  }
106763
- function findDesktopBinary(platform = process.platform, checkExists = existsSync49) {
107209
+ function findDesktopBinary(platform = process.platform, checkExists = existsSync51) {
106764
107210
  for (const desktopPath of getDesktopAppPaths(platform)) {
106765
107211
  if (checkExists(desktopPath)) {
106766
107212
  return { binary: "opencode", path: desktopPath };
@@ -106768,7 +107214,7 @@ function findDesktopBinary(platform = process.platform, checkExists = existsSync
106768
107214
  }
106769
107215
  return null;
106770
107216
  }
106771
- async function findOpenCodeBinary(platform = process.platform, checkExists = existsSync49) {
107217
+ async function findOpenCodeBinary(platform = process.platform, checkExists = existsSync51) {
106772
107218
  for (const binary of OPENCODE_BINARIES2) {
106773
107219
  const path = bunWhich(binary);
106774
107220
  if (path && checkExists(path)) {
@@ -106780,7 +107226,7 @@ async function findOpenCodeBinary(platform = process.platform, checkExists = exi
106780
107226
  const candidates = getCommandCandidates2(platform);
106781
107227
  for (const entry of pathEnv.split(delimiter).filter(Boolean)) {
106782
107228
  for (const command of candidates) {
106783
- const fullPath = join80(entry, command);
107229
+ const fullPath = join85(entry, command);
106784
107230
  if (checkExists(fullPath) && isExecutable2(fullPath)) {
106785
107231
  return { binary: command, path: fullPath };
106786
107232
  }
@@ -106826,12 +107272,12 @@ function compareVersions3(current, minimum) {
106826
107272
 
106827
107273
  // packages/omo-opencode/src/cli/doctor/checks/system-plugin.ts
106828
107274
  init_shared();
106829
- import { existsSync as existsSync50, readFileSync as readFileSync32 } from "node:fs";
107275
+ import { existsSync as existsSync52, readFileSync as readFileSync32 } from "node:fs";
106830
107276
  function detectConfigPath() {
106831
107277
  const paths = getOpenCodeConfigPaths({ binary: "opencode", version: null });
106832
- if (existsSync50(paths.configJsonc))
107278
+ if (existsSync52(paths.configJsonc))
106833
107279
  return paths.configJsonc;
106834
- if (existsSync50(paths.configJson))
107280
+ if (existsSync52(paths.configJson))
106835
107281
  return paths.configJson;
106836
107282
  return null;
106837
107283
  }
@@ -106921,36 +107367,36 @@ init_file_utils2();
106921
107367
  init_checker();
106922
107368
  init_auto_update_checker();
106923
107369
  init_package_json_locator();
106924
- import { existsSync as existsSync51, readFileSync as readFileSync33, readdirSync as readdirSync12 } from "node:fs";
107370
+ import { existsSync as existsSync53, readFileSync as readFileSync33, readdirSync as readdirSync12 } from "node:fs";
106925
107371
  import { createRequire as createRequire2 } from "node:module";
106926
- import { homedir as homedir17 } from "node:os";
106927
- import { join as join81 } from "node:path";
107372
+ import { homedir as homedir20 } from "node:os";
107373
+ import { join as join86 } from "node:path";
106928
107374
  import { fileURLToPath as fileURLToPath6 } from "node:url";
106929
107375
  init_shared();
106930
107376
  function getPlatformDefaultCacheDir(platform = process.platform) {
106931
107377
  if (platform === "darwin")
106932
- return join81(homedir17(), "Library", "Caches");
107378
+ return join86(homedir20(), "Library", "Caches");
106933
107379
  if (platform === "win32")
106934
- return process.env.LOCALAPPDATA ?? join81(homedir17(), "AppData", "Local");
106935
- return join81(homedir17(), ".cache");
107380
+ return process.env.LOCALAPPDATA ?? join86(homedir20(), "AppData", "Local");
107381
+ return join86(homedir20(), ".cache");
106936
107382
  }
106937
107383
  function resolveOpenCodeCacheDir() {
106938
107384
  const xdgCacheHome = process.env.XDG_CACHE_HOME;
106939
107385
  if (xdgCacheHome)
106940
- return join81(xdgCacheHome, "opencode");
107386
+ return join86(xdgCacheHome, "opencode");
106941
107387
  const fromShared = getOpenCodeCacheDir();
106942
- const platformDefault = join81(getPlatformDefaultCacheDir(), "opencode");
106943
- if (existsSync51(fromShared) || !existsSync51(platformDefault))
107388
+ const platformDefault = join86(getPlatformDefaultCacheDir(), "opencode");
107389
+ if (existsSync53(fromShared) || !existsSync53(platformDefault))
106944
107390
  return fromShared;
106945
107391
  return platformDefault;
106946
107392
  }
106947
107393
  function resolveExistingDir(dirPath) {
106948
- if (!existsSync51(dirPath))
107394
+ if (!existsSync53(dirPath))
106949
107395
  return dirPath;
106950
107396
  return resolveSymlink(dirPath);
106951
107397
  }
106952
107398
  function readPackageJson(filePath) {
106953
- if (!existsSync51(filePath))
107399
+ if (!existsSync53(filePath))
106954
107400
  return null;
106955
107401
  try {
106956
107402
  const content = readFileSync33(filePath, "utf-8");
@@ -106971,26 +107417,26 @@ function normalizeVersion(value) {
106971
107417
  function createPackageCandidates(rootDir) {
106972
107418
  return ACCEPTED_PACKAGE_NAMES.map((packageName) => ({
106973
107419
  packageName,
106974
- installedPackagePath: join81(rootDir, "node_modules", packageName, "package.json")
107420
+ installedPackagePath: join86(rootDir, "node_modules", packageName, "package.json")
106975
107421
  }));
106976
107422
  }
106977
107423
  function createTaggedInstallCandidates(rootDir) {
106978
- const packagesDir = join81(rootDir, "packages");
106979
- if (!existsSync51(packagesDir))
107424
+ const packagesDir = join86(rootDir, "packages");
107425
+ if (!existsSync53(packagesDir))
106980
107426
  return [];
106981
107427
  const candidates = [];
106982
107428
  for (const entryName of readdirSync12(packagesDir).sort()) {
106983
107429
  const packageName = ACCEPTED_PACKAGE_NAMES.find((name) => entryName.startsWith(`${name}@`));
106984
107430
  if (packageName === undefined)
106985
107431
  continue;
106986
- const installDir = join81(packagesDir, entryName);
107432
+ const installDir = join86(packagesDir, entryName);
106987
107433
  candidates.push({
106988
107434
  cacheDir: installDir,
106989
- cachePackagePath: join81(installDir, "package.json"),
107435
+ cachePackagePath: join86(installDir, "package.json"),
106990
107436
  packageCandidates: [
106991
107437
  {
106992
107438
  packageName,
106993
- installedPackagePath: join81(installDir, "node_modules", packageName, "package.json")
107439
+ installedPackagePath: join86(installDir, "node_modules", packageName, "package.json")
106994
107440
  }
106995
107441
  ]
106996
107442
  });
@@ -106998,7 +107444,7 @@ function createTaggedInstallCandidates(rootDir) {
106998
107444
  return candidates;
106999
107445
  }
107000
107446
  function selectInstalledPackage(candidate) {
107001
- return candidate.packageCandidates.find((packageCandidate) => existsSync51(packageCandidate.installedPackagePath)) ?? candidate.packageCandidates[0];
107447
+ return candidate.packageCandidates.find((packageCandidate) => existsSync53(packageCandidate.installedPackagePath)) ?? candidate.packageCandidates[0];
107002
107448
  }
107003
107449
  function getExpectedVersion(cachePackage, packageName) {
107004
107450
  return normalizeVersion(cachePackage?.dependencies?.[packageName]) ?? normalizeVersion(cachePackage?.dependencies?.[PACKAGE_NAME]);
@@ -107009,7 +107455,7 @@ function resolveInstalledPackageJsonPath() {
107009
107455
  for (const packageName of ACCEPTED_PACKAGE_NAMES) {
107010
107456
  try {
107011
107457
  const packageJsonPath = require2.resolve(`${packageName}/package.json`);
107012
- if (existsSync51(packageJsonPath)) {
107458
+ if (existsSync53(packageJsonPath)) {
107013
107459
  return { packageName, packageJsonPath };
107014
107460
  }
107015
107461
  } catch {
@@ -107035,22 +107481,22 @@ function getLoadedPluginVersion() {
107035
107481
  const candidates = [
107036
107482
  {
107037
107483
  cacheDir: configDir,
107038
- cachePackagePath: join81(configDir, "package.json"),
107484
+ cachePackagePath: join86(configDir, "package.json"),
107039
107485
  packageCandidates: createPackageCandidates(configDir)
107040
107486
  },
107041
107487
  ...createTaggedInstallCandidates(configDir),
107042
107488
  {
107043
107489
  cacheDir,
107044
- cachePackagePath: join81(cacheDir, "package.json"),
107490
+ cachePackagePath: join86(cacheDir, "package.json"),
107045
107491
  packageCandidates: createPackageCandidates(cacheDir)
107046
107492
  },
107047
107493
  ...createTaggedInstallCandidates(cacheDir)
107048
107494
  ];
107049
- const selectedCandidate = candidates.find((candidate) => candidate.packageCandidates.some((packageCandidate) => existsSync51(packageCandidate.installedPackagePath))) ?? candidates[0];
107495
+ const selectedCandidate = candidates.find((candidate) => candidate.packageCandidates.some((packageCandidate) => existsSync53(packageCandidate.installedPackagePath))) ?? candidates[0];
107050
107496
  const { cacheDir: selectedDir, cachePackagePath } = selectedCandidate;
107051
107497
  const selectedPackage = selectInstalledPackage(selectedCandidate);
107052
107498
  const candidateInstalledPath = selectedPackage.installedPackagePath;
107053
- const candidateExists = existsSync51(candidateInstalledPath);
107499
+ const candidateExists = existsSync53(candidateInstalledPath);
107054
107500
  const resolvedFallback = candidateExists ? null : resolveInstalledPackageJsonPath();
107055
107501
  const installedPackagePath = resolvedFallback?.packageJsonPath ?? candidateInstalledPath;
107056
107502
  const resolvedPackageName = resolvedFallback?.packageName ?? selectedPackage.packageName;
@@ -107086,7 +107532,7 @@ var defaultDeps5 = {
107086
107532
  getLoadedPluginVersion,
107087
107533
  getLatestPluginVersion,
107088
107534
  getSuggestedInstallTag,
107089
- configExists: existsSync52,
107535
+ configExists: existsSync54,
107090
107536
  readConfigFile: (path) => readFileSync34(path, "utf-8"),
107091
107537
  parseConfigContent: (content) => parseJsonc(content)
107092
107538
  };
@@ -107232,23 +107678,23 @@ async function checkSystem(deps = defaultDeps5) {
107232
107678
 
107233
107679
  // packages/omo-opencode/src/cli/doctor/checks/model-resolution-cache.ts
107234
107680
  init_shared();
107235
- import { existsSync as existsSync53, readFileSync as readFileSync35 } from "node:fs";
107236
- import { homedir as homedir18 } from "node:os";
107237
- import { join as join82 } from "node:path";
107681
+ import { existsSync as existsSync55, readFileSync as readFileSync35 } from "node:fs";
107682
+ import { homedir as homedir21 } from "node:os";
107683
+ import { join as join87 } from "node:path";
107238
107684
  function getUserConfigDir2() {
107239
107685
  const xdgConfig = process.env.XDG_CONFIG_HOME;
107240
107686
  if (xdgConfig)
107241
- return join82(xdgConfig, "opencode");
107242
- return join82(homedir18(), ".config", "opencode");
107687
+ return join87(xdgConfig, "opencode");
107688
+ return join87(homedir21(), ".config", "opencode");
107243
107689
  }
107244
107690
  function loadCustomProviderNames() {
107245
107691
  const configDir = getUserConfigDir2();
107246
107692
  const candidatePaths = [
107247
- join82(configDir, "opencode.json"),
107248
- join82(configDir, "opencode.jsonc")
107693
+ join87(configDir, "opencode.json"),
107694
+ join87(configDir, "opencode.jsonc")
107249
107695
  ];
107250
107696
  for (const configPath of candidatePaths) {
107251
- if (!existsSync53(configPath))
107697
+ if (!existsSync55(configPath))
107252
107698
  continue;
107253
107699
  try {
107254
107700
  const content = readFileSync35(configPath, "utf-8");
@@ -107266,9 +107712,9 @@ function loadCustomProviderNames() {
107266
107712
  return [];
107267
107713
  }
107268
107714
  function loadAvailableModelsFromCache() {
107269
- const cacheFile = join82(getOpenCodeCacheDir(), "models.json");
107715
+ const cacheFile = join87(getOpenCodeCacheDir(), "models.json");
107270
107716
  const customProviders = loadCustomProviderNames();
107271
- if (!existsSync53(cacheFile)) {
107717
+ if (!existsSync55(cacheFile)) {
107272
107718
  if (customProviders.length > 0) {
107273
107719
  return { providers: customProviders, modelCount: 0, cacheExists: true };
107274
107720
  }
@@ -107328,7 +107774,7 @@ function loadOmoConfig2() {
107328
107774
 
107329
107775
  // packages/omo-opencode/src/cli/doctor/checks/model-resolution-details.ts
107330
107776
  init_shared();
107331
- import { join as join83 } from "node:path";
107777
+ import { join as join88 } from "node:path";
107332
107778
 
107333
107779
  // packages/omo-opencode/src/cli/doctor/checks/model-resolution-variant.ts
107334
107780
  function formatModelWithVariant(model, variant) {
@@ -107370,7 +107816,7 @@ function formatCapabilityResolutionLabel(mode) {
107370
107816
  }
107371
107817
  function buildModelResolutionDetails(options) {
107372
107818
  const details = [];
107373
- const cacheFile = join83(getOpenCodeCacheDir(), "models.json");
107819
+ const cacheFile = join88(getOpenCodeCacheDir(), "models.json");
107374
107820
  details.push("═══ Available Models (from cache) ═══");
107375
107821
  details.push("");
107376
107822
  if (options.available.cacheExists) {
@@ -107526,9 +107972,9 @@ async function checkModels() {
107526
107972
 
107527
107973
  // packages/omo-opencode/src/cli/doctor/checks/legacy-config-leftovers.ts
107528
107974
  init_config_migration();
107529
- import { posix as posix11, win32 as win327 } from "node:path";
107975
+ import { posix as posix12, win32 as win329 } from "node:path";
107530
107976
  function findLegacyConfigLeftovers(options) {
107531
- const pathOperations = options.pathOperations ?? (process.platform === "win32" ? win327 : posix11);
107977
+ const pathOperations = options.pathOperations ?? (process.platform === "win32" ? win329 : posix12);
107532
107978
  const paths = createLegacyConfigMigrationPlans({
107533
107979
  cwd: options.cwd,
107534
107980
  environment: options.environment ?? process.env,
@@ -107717,8 +108163,8 @@ async function checkBrowserProvider() {
107717
108163
  init_src4();
107718
108164
  init_main();
107719
108165
  init_config_migration();
107720
- import { existsSync as existsSync54, readFileSync as readFileSync36 } from "node:fs";
107721
- import { join as join84 } from "node:path";
108166
+ import { existsSync as existsSync56, readFileSync as readFileSync36 } from "node:fs";
108167
+ import { join as join89 } from "node:path";
107722
108168
  var CANONICAL_REPLACEMENT = new Map([
107723
108169
  ["variant", "reasoning"],
107724
108170
  ["reasoningEffort", "reasoning"],
@@ -107779,13 +108225,13 @@ function userConfigPaths() {
107779
108225
  const home = process.env.HOME ?? process.env.USERPROFILE;
107780
108226
  if (home === undefined || home.length === 0)
107781
108227
  return [];
107782
- return [join84(home, ".omo", "omo.jsonc"), join84(home, ".omo", "omo.json")];
108228
+ return [join89(home, ".omo", "omo.jsonc"), join89(home, ".omo", "omo.json")];
107783
108229
  }
107784
108230
  async function checkDeprecatedReasoningKeys() {
107785
108231
  const issues = [];
107786
108232
  const scanned = [];
107787
108233
  for (const configPath of userConfigPaths()) {
107788
- if (!existsSync54(configPath))
108234
+ if (!existsSync56(configPath))
107789
108235
  continue;
107790
108236
  scanned.push(configPath);
107791
108237
  const parsed = parse2(readFileSync36(configPath, "utf-8"));
@@ -107801,12 +108247,12 @@ async function checkDeprecatedReasoningKeys() {
107801
108247
  }
107802
108248
 
107803
108249
  // packages/omo-opencode/src/cli/doctor/checks/dependencies.ts
107804
- import { existsSync as existsSync55 } from "node:fs";
108250
+ import { existsSync as existsSync57 } from "node:fs";
107805
108251
  import { createRequire as createRequire4 } from "node:module";
107806
- import { homedir as homedir20 } from "node:os";
107807
- import { join as join89 } from "node:path";
108252
+ import { homedir as homedir23 } from "node:os";
108253
+ import { join as join94 } from "node:path";
107808
108254
  // packages/comment-checker-core/src/release.ts
107809
- import { join as join85 } from "node:path";
108255
+ import { join as join90 } from "node:path";
107810
108256
  var COMMENT_CHECKER_RELEASE_VERSION = "0.8.0";
107811
108257
  function commentCheckerBinaryName(platform) {
107812
108258
  return platform === "win32" ? "comment-checker.exe" : "comment-checker";
@@ -107814,26 +108260,26 @@ function commentCheckerBinaryName(platform) {
107814
108260
  function commentCheckerCacheDir(input) {
107815
108261
  if (input.platform === "win32") {
107816
108262
  const localAppData = input.env.LOCALAPPDATA || input.env.APPDATA;
107817
- const base = localAppData || join85(input.homedir, "AppData", "Local");
107818
- return join85(base, input.cacheDirName, "bin");
108263
+ const base = localAppData || join90(input.homedir, "AppData", "Local");
108264
+ return join90(base, input.cacheDirName, "bin");
107819
108265
  }
107820
- const base = input.env.XDG_CACHE_HOME || join85(input.homedir, ".cache");
107821
- return join85(base, input.cacheDirName, "bin");
108266
+ const base = input.env.XDG_CACHE_HOME || join90(input.homedir, ".cache");
108267
+ return join90(base, input.cacheDirName, "bin");
107822
108268
  }
107823
108269
  // packages/comment-checker-core/src/cached-release.ts
107824
108270
  import { readFileSync as readFileSync37, writeFileSync as writeFileSync12 } from "node:fs";
107825
- import { join as join86 } from "node:path";
108271
+ import { join as join91 } from "node:path";
107826
108272
  var COMMENT_CHECKER_VERSION_MARKER = "comment-checker.version";
107827
108273
  function isCachedCommentCheckerCurrent(cacheDir, readFile = (path) => readFileSync37(path, "utf-8")) {
107828
108274
  try {
107829
- return readFile(join86(cacheDir, COMMENT_CHECKER_VERSION_MARKER)).trim() === COMMENT_CHECKER_RELEASE_VERSION;
108275
+ return readFile(join91(cacheDir, COMMENT_CHECKER_VERSION_MARKER)).trim() === COMMENT_CHECKER_RELEASE_VERSION;
107830
108276
  } catch {
107831
108277
  return false;
107832
108278
  }
107833
108279
  }
107834
108280
  // packages/comment-checker-core/src/package-binary.ts
107835
108281
  import { createRequire as createRequire3 } from "node:module";
107836
- import { dirname as dirname33, join as join87 } from "node:path";
108282
+ import { dirname as dirname36, join as join92 } from "node:path";
107837
108283
  var COMMENT_CHECKER_PACKAGE_NAME = "@code-yeongyu/comment-checker";
107838
108284
  function isModuleResolutionMiss(error) {
107839
108285
  return error instanceof Error || typeof error === "object" && error !== null && "name" in error && error.name === "ResolveMessage";
@@ -107841,18 +108287,18 @@ function isModuleResolutionMiss(error) {
107841
108287
  function findCommentCheckerPackageBinary(input) {
107842
108288
  const packageName = input.packageName ?? COMMENT_CHECKER_PACKAGE_NAME;
107843
108289
  const platformKey = `${input.platform ?? process.platform}-${input.arch ?? process.arch}`;
107844
- const packageDir = dirname33(input.packageJsonPath);
108290
+ const packageDir = dirname36(input.packageJsonPath);
107845
108291
  const candidates = [
107846
108292
  resolvePlatformPackageBinary(input.packageJsonPath, `${packageName}-${platformKey}`, input.binaryName),
107847
- join87(packageDir, "vendor", platformKey, input.binaryName),
107848
- join87(packageDir, "bin", input.binaryName)
108293
+ join92(packageDir, "vendor", platformKey, input.binaryName),
108294
+ join92(packageDir, "bin", input.binaryName)
107849
108295
  ];
107850
108296
  return candidates.find((candidate) => candidate !== null && input.existsSync(candidate)) ?? null;
107851
108297
  }
107852
108298
  function resolvePlatformPackageBinary(packageJsonPath, platformPackageName, binaryName) {
107853
108299
  try {
107854
108300
  const manifestPath = createRequire3(packageJsonPath).resolve(`${platformPackageName}/package.json`);
107855
- return join87(dirname33(manifestPath), "bin", binaryName);
108301
+ return join92(dirname36(manifestPath), "bin", binaryName);
107856
108302
  } catch (error) {
107857
108303
  if (isModuleResolutionMiss(error))
107858
108304
  return null;
@@ -107863,18 +108309,18 @@ function resolvePlatformPackageBinary(packageJsonPath, platformPackageName, bina
107863
108309
  init_src();
107864
108310
 
107865
108311
  // packages/omo-opencode/src/hooks/comment-checker/downloader.ts
107866
- import { join as join88 } from "path";
107867
- import { homedir as homedir19, tmpdir as tmpdir4 } from "os";
108312
+ import { join as join93 } from "path";
108313
+ import { homedir as homedir22, tmpdir as tmpdir4 } from "os";
107868
108314
  init_binary_downloader();
107869
108315
  init_logger2();
107870
108316
  init_plugin_identity();
107871
108317
  var DEBUG = process.env.COMMENT_CHECKER_DEBUG === "1";
107872
- var DEBUG_FILE = join88(tmpdir4(), "comment-checker-debug.log");
108318
+ var DEBUG_FILE = join93(tmpdir4(), "comment-checker-debug.log");
107873
108319
  function getCacheDir2() {
107874
108320
  return commentCheckerCacheDir({
107875
108321
  platform: process.platform,
107876
108322
  env: process.env,
107877
- homedir: homedir19(),
108323
+ homedir: homedir22(),
107878
108324
  cacheDirName: CACHE_DIR_NAME
107879
108325
  });
107880
108326
  }
@@ -107928,7 +108374,7 @@ async function getBinaryVersion(binary) {
107928
108374
  }
107929
108375
  }
107930
108376
  async function checkAstGrepCli() {
107931
- const runtimeDir = astGrepRuntimeDir(join89(homedir20(), ".omo"));
108377
+ const runtimeDir = astGrepRuntimeDir(join94(homedir23(), ".omo"));
107932
108378
  const sgPath = findSgBinarySync({ runtimeDir });
107933
108379
  if (sgPath === null) {
107934
108380
  return {
@@ -107956,8 +108402,8 @@ function resolveCommentCheckerPackageJson() {
107956
108402
  function findCommentCheckerPackageBinary2(baseDirOverride, resolvePackageJsonPath = resolveCommentCheckerPackageJson) {
107957
108403
  const binaryName = process.platform === "win32" ? "comment-checker.exe" : "comment-checker";
107958
108404
  try {
107959
- const packageJsonPath = baseDirOverride === undefined ? resolvePackageJsonPath() : join89(baseDirOverride, "package.json");
107960
- return findCommentCheckerPackageBinary({ packageJsonPath, binaryName, existsSync: existsSync55 });
108405
+ const packageJsonPath = baseDirOverride === undefined ? resolvePackageJsonPath() : join94(baseDirOverride, "package.json");
108406
+ return findCommentCheckerPackageBinary({ packageJsonPath, binaryName, existsSync: existsSync57 });
107961
108407
  } catch (error) {
107962
108408
  if (!(error instanceof Error) && !isModuleResolutionFailure(error))
107963
108409
  throw error;
@@ -108102,8 +108548,8 @@ async function getGhCliInfo(dependencies = {}) {
108102
108548
  // packages/omo-opencode/src/mcp/lsp.ts
108103
108549
  init_zod();
108104
108550
  init_opencode_config_dir();
108105
- import { existsSync as existsSync56, readFileSync as readFileSync38 } from "node:fs";
108106
- import { delimiter as delimiter3, dirname as dirname35, resolve as resolve23 } from "node:path";
108551
+ import { existsSync as existsSync58, readFileSync as readFileSync38 } from "node:fs";
108552
+ import { delimiter as delimiter3, dirname as dirname38, resolve as resolve26 } from "node:path";
108107
108553
  import { fileURLToPath as fileURLToPath7 } from "node:url";
108108
108554
 
108109
108555
  // packages/omo-opencode/src/mcp/cli-suffix.ts
@@ -108116,7 +108562,7 @@ function hasCliSuffix(candidatePath, suffix) {
108116
108562
 
108117
108563
  // packages/omo-opencode/src/mcp/runtime-executable.ts
108118
108564
  init_bun_which_shim();
108119
- import { basename as basename11 } from "node:path";
108565
+ import { basename as basename12 } from "node:path";
108120
108566
  var NODE_EXECUTABLE_NAMES = new Set(["node", "node.exe"]);
108121
108567
  function isUnsafeCommandName2(commandName) {
108122
108568
  if (commandName.length === 0)
@@ -108132,7 +108578,7 @@ function isUnsafeCommandName2(commandName) {
108132
108578
  return false;
108133
108579
  }
108134
108580
  function isNodeExecPath(execPath) {
108135
- return NODE_EXECUTABLE_NAMES.has(basename11(execPath).toLowerCase());
108581
+ return NODE_EXECUTABLE_NAMES.has(basename12(execPath).toLowerCase());
108136
108582
  }
108137
108583
  function resolveRuntimeExecutable(commandName, options = {}) {
108138
108584
  if (isUnsafeCommandName2(commandName)) {
@@ -108150,7 +108596,7 @@ function resolveRuntimeExecutable(commandName, options = {}) {
108150
108596
  }
108151
108597
 
108152
108598
  // packages/omo-opencode/src/mcp/shared/ancestor-cli-resolver.ts
108153
- import { resolve as resolve22 } from "node:path";
108599
+ import { resolve as resolve25 } from "node:path";
108154
108600
  function resolveJavaScriptRuntime(resolveExecutable) {
108155
108601
  const node = resolveExecutable("node");
108156
108602
  return node.available ? node : resolveExecutable("bun");
@@ -108158,9 +108604,9 @@ function resolveJavaScriptRuntime(resolveExecutable) {
108158
108604
  function createAncestorCliCandidates(options) {
108159
108605
  const candidates = [];
108160
108606
  const seenPaths = new Set;
108161
- let currentDirectory = resolve22(options.startDirectory);
108607
+ let currentDirectory = resolve25(options.startDirectory);
108162
108608
  while (true) {
108163
- const distCliPath = resolve22(currentDirectory, options.packageRel, options.distCliRel);
108609
+ const distCliPath = resolve25(currentDirectory, options.packageRel, options.distCliRel);
108164
108610
  if (!seenPaths.has(distCliPath)) {
108165
108611
  const runtime = resolveJavaScriptRuntime(options.resolveExecutable);
108166
108612
  seenPaths.add(distCliPath);
@@ -108172,7 +108618,7 @@ function createAncestorCliCandidates(options) {
108172
108618
  runtimeAvailable: runtime.available
108173
108619
  });
108174
108620
  }
108175
- const sourceCliPath = resolve22(currentDirectory, options.packageRel, options.sourceCliRel);
108621
+ const sourceCliPath = resolve25(currentDirectory, options.packageRel, options.sourceCliRel);
108176
108622
  if (!seenPaths.has(sourceCliPath)) {
108177
108623
  const runtime = options.resolveExecutable("bun");
108178
108624
  const sourceCandidateAvailable = options.isSourceCandidateAvailable?.({
@@ -108189,7 +108635,7 @@ function createAncestorCliCandidates(options) {
108189
108635
  runtimeAvailable: runtime.available
108190
108636
  });
108191
108637
  }
108192
- const parentDirectory = resolve22(currentDirectory, "..");
108638
+ const parentDirectory = resolve25(currentDirectory, "..");
108193
108639
  if (parentDirectory === currentDirectory)
108194
108640
  return candidates;
108195
108641
  currentDirectory = parentDirectory;
@@ -108234,7 +108680,7 @@ var LSP_BOOTSTRAP_SCRIPT = [
108234
108680
  ].join(";");
108235
108681
  function getModuleDirectory(moduleUrl) {
108236
108682
  try {
108237
- return dirname35(fileURLToPath7(moduleUrl));
108683
+ return dirname38(fileURLToPath7(moduleUrl));
108238
108684
  } catch (error) {
108239
108685
  if (!(error instanceof Error))
108240
108686
  throw error;
@@ -108242,11 +108688,11 @@ function getModuleDirectory(moduleUrl) {
108242
108688
  }
108243
108689
  }
108244
108690
  function findBootstrapRoot(candidates, pathExists) {
108245
- return candidates.find((candidate) => pathExists(resolve23(candidate.root, "package.json")))?.root ?? process.cwd();
108691
+ return candidates.find((candidate) => pathExists(resolve26(candidate.root, "package.json")))?.root ?? process.cwd();
108246
108692
  }
108247
108693
  function readDaemonPackageVersion(root) {
108248
108694
  try {
108249
- const packageJson = JSON.parse(readFileSync38(resolve23(root, PACKAGE_REL, "package.json"), "utf-8"));
108695
+ const packageJson = JSON.parse(readFileSync38(resolve26(root, PACKAGE_REL, "package.json"), "utf-8"));
108250
108696
  return DaemonPackageSchema.parse(packageJson).version;
108251
108697
  } catch (error) {
108252
108698
  if (!(error instanceof Error))
@@ -108258,17 +108704,17 @@ function createBootstrapCandidate(root, pathExists, resolveExecutable) {
108258
108704
  const runtime = resolveJavaScriptRuntime(resolveExecutable);
108259
108705
  const bun = resolveExecutable("bun");
108260
108706
  const npm = resolveExecutable("npm");
108261
- const packageManifestPath = resolve23(root, PACKAGE_REL, "package.json");
108707
+ const packageManifestPath = resolve26(root, PACKAGE_REL, "package.json");
108262
108708
  return {
108263
108709
  command: [runtime.command, "-e", LSP_BOOTSTRAP_SCRIPT, root, npm.command, bun.command],
108264
108710
  root,
108265
- path: resolve23(root, PACKAGE_REL, DIST_CLI_REL),
108711
+ path: resolve26(root, PACKAGE_REL, DIST_CLI_REL),
108266
108712
  exists: runtime.available && npm.available && pathExists(packageManifestPath),
108267
108713
  runtimeAvailable: runtime.available
108268
108714
  };
108269
108715
  }
108270
108716
  function resolveLspCommand(options = {}) {
108271
- const pathExists = options.exists ?? existsSync56;
108717
+ const pathExists = options.exists ?? existsSync58;
108272
108718
  const resolveExecutable = options.resolveExecutable ?? resolveRuntimeExecutable;
108273
108719
  const moduleDirectory = getModuleDirectory(options.moduleUrl ?? import.meta.url);
108274
108720
  const candidates = moduleDirectory ? createAncestorCliCandidates({
@@ -108278,7 +108724,7 @@ function resolveLspCommand(options = {}) {
108278
108724
  sourceCliRel: SOURCE_CLI_REL,
108279
108725
  pathExists,
108280
108726
  resolveExecutable,
108281
- isSourceCandidateAvailable: ({ root }) => pathExists(resolve23(root, LSP_TOOLS_PACKAGE_REL, DIST_CLI_REL)) && readDaemonPackageVersion(root) !== null
108727
+ isSourceCandidateAvailable: ({ root }) => pathExists(resolve26(root, LSP_TOOLS_PACKAGE_REL, DIST_CLI_REL)) && readDaemonPackageVersion(root) !== null
108282
108728
  }) : [];
108283
108729
  const distCandidate = candidates.find((candidate) => hasCliSuffix(candidate.path, DIST_CLI_REL) && candidate.exists);
108284
108730
  if (distCandidate) {
@@ -108292,7 +108738,7 @@ function resolveLspCommand(options = {}) {
108292
108738
  }
108293
108739
  function createLspMcpConfig(options = {}) {
108294
108740
  const resolvedCommand = resolveLspCommand(options);
108295
- const cwd = resolve23(options.cwd ?? process.cwd());
108741
+ const cwd = resolve26(options.cwd ?? process.cwd());
108296
108742
  const configDir = getOpenCodeConfigDir({ binary: "opencode" });
108297
108743
  const sourceVersion = hasCliSuffix(resolvedCommand.path, SOURCE_CLI_REL) ? readDaemonPackageVersion(resolvedCommand.root) : null;
108298
108744
  return {
@@ -108302,9 +108748,9 @@ function createLspMcpConfig(options = {}) {
108302
108748
  cwd,
108303
108749
  environment: {
108304
108750
  LSP_TOOLS_MCP_CWD: cwd,
108305
- LSP_TOOLS_MCP_PROJECT_CONFIG: PROJECT_LSP_CONFIGS.map((configPath) => resolve23(cwd, configPath)).join(delimiter3),
108306
- LSP_TOOLS_MCP_USER_CONFIG: resolve23(configDir, "lsp.json"),
108307
- LSP_TOOLS_MCP_INSTALL_DECISIONS: resolve23(configDir, "lsp-install-decisions.json"),
108751
+ LSP_TOOLS_MCP_PROJECT_CONFIG: PROJECT_LSP_CONFIGS.map((configPath) => resolve26(cwd, configPath)).join(delimiter3),
108752
+ LSP_TOOLS_MCP_USER_CONFIG: resolve26(configDir, "lsp.json"),
108753
+ LSP_TOOLS_MCP_INSTALL_DECISIONS: resolve26(configDir, "lsp-install-decisions.json"),
108308
108754
  ...sourceVersion ? {
108309
108755
  [OMO_LSP_DAEMON_CLI]: resolvedCommand.path,
108310
108756
  [OMO_LSP_DAEMON_VERSION]: sourceVersion
@@ -108329,21 +108775,21 @@ function getInstalledLspServers(options = {}) {
108329
108775
 
108330
108776
  // packages/omo-opencode/src/cli/doctor/checks/tools-mcp.ts
108331
108777
  init_shared();
108332
- import { existsSync as existsSync57, readFileSync as readFileSync39 } from "node:fs";
108333
- import { homedir as homedir21 } from "node:os";
108334
- import { join as join90 } from "node:path";
108778
+ import { existsSync as existsSync59, readFileSync as readFileSync39 } from "node:fs";
108779
+ import { homedir as homedir24 } from "node:os";
108780
+ import { join as join95 } from "node:path";
108335
108781
  var BUILTIN_MCP_SERVERS = ["websearch", "context7", "grep_app", "lsp"];
108336
108782
  function getMcpConfigPaths() {
108337
108783
  return [
108338
- join90(homedir21(), ".claude", ".mcp.json"),
108339
- join90(process.cwd(), ".mcp.json"),
108340
- join90(process.cwd(), ".claude", ".mcp.json")
108784
+ join95(homedir24(), ".claude", ".mcp.json"),
108785
+ join95(process.cwd(), ".mcp.json"),
108786
+ join95(process.cwd(), ".claude", ".mcp.json")
108341
108787
  ];
108342
108788
  }
108343
108789
  function loadUserMcpConfig() {
108344
108790
  const servers = {};
108345
108791
  for (const configPath of getMcpConfigPaths()) {
108346
- if (!existsSync57(configPath))
108792
+ if (!existsSync59(configPath))
108347
108793
  continue;
108348
108794
  try {
108349
108795
  const content = readFileSync39(configPath, "utf-8");
@@ -108481,12 +108927,12 @@ async function checkTools() {
108481
108927
 
108482
108928
  // packages/omo-opencode/src/cli/doctor/checks/telemetry.ts
108483
108929
  init_src5();
108484
- import { existsSync as existsSync58, readFileSync as readFileSync40 } from "node:fs";
108930
+ import { existsSync as existsSync60, readFileSync as readFileSync40 } from "node:fs";
108485
108931
  function isTelemetryState(value) {
108486
108932
  return value !== null && typeof value === "object" && !Array.isArray(value);
108487
108933
  }
108488
108934
  function readLastActiveDay(stateFilePath) {
108489
- if (!existsSync58(stateFilePath)) {
108935
+ if (!existsSync60(stateFilePath)) {
108490
108936
  return "never";
108491
108937
  }
108492
108938
  let parsed;
@@ -108549,17 +108995,17 @@ async function probeBinary(cmd, args, spawnImpl) {
108549
108995
  }
108550
108996
 
108551
108997
  // packages/team-core/src/team-registry/paths.ts
108552
- import { homedir as homedir22 } from "node:os";
108998
+ import { homedir as homedir25 } from "node:os";
108553
108999
  import path13 from "node:path";
108554
109000
  function resolveBaseDir(config) {
108555
- return expandHomeDirectory(config.base_dir ?? path13.join(homedir22(), ".omo"));
109001
+ return expandHomeDirectory(config.base_dir ?? path13.join(homedir25(), ".omo"));
108556
109002
  }
108557
109003
  function expandHomeDirectory(directoryPath) {
108558
109004
  if (directoryPath === "~") {
108559
- return homedir22();
109005
+ return homedir25();
108560
109006
  }
108561
109007
  if (directoryPath.startsWith("~/") || directoryPath.startsWith("~\\")) {
108562
- return path13.join(homedir22(), directoryPath.slice(2));
109008
+ return path13.join(homedir25(), directoryPath.slice(2));
108563
109009
  }
108564
109010
  return directoryPath;
108565
109011
  }
@@ -108616,10 +109062,10 @@ async function pathExists2(dir) {
108616
109062
 
108617
109063
  // packages/omo-opencode/src/cli/doctor/checks/codex.ts
108618
109064
  init_src();
108619
- import { existsSync as existsSync59 } from "node:fs";
109065
+ import { existsSync as existsSync61 } from "node:fs";
108620
109066
  import { lstat as lstat16, readdir as readdir14, readFile as readFile30 } from "node:fs/promises";
108621
- import { homedir as homedir23 } from "node:os";
108622
- import { basename as basename12, join as join91, resolve as resolve24 } from "node:path";
109067
+ import { homedir as homedir26 } from "node:os";
109068
+ import { basename as basename13, join as join96, resolve as resolve27 } from "node:path";
108623
109069
  // packages/omo-opencode/package.json
108624
109070
  var package_default3 = {
108625
109071
  name: "@oh-my-opencode/omo-opencode",
@@ -108678,7 +109124,7 @@ var package_default3 = {
108678
109124
 
108679
109125
  // packages/omo-opencode/src/cli/doctor/checks/codex.ts
108680
109126
  var MARKETPLACE_NAME = "sisyphuslabs";
108681
- var PLUGIN_NAME2 = "omo";
109127
+ var PLUGIN_NAME3 = "omo";
108682
109128
  var COMPANION_PLUGIN_KEY = "codex@openai-codex";
108683
109129
  var DEFAULT_PLUGIN_VERSION = "0.1.0";
108684
109130
  var COMPANION_LIFECYCLE_EVENTS = new Set(["session_start", "stop"]);
@@ -108693,20 +109139,20 @@ var CODEX_BIN_NAMES = [
108693
109139
  "omo-git-bash-hook"
108694
109140
  ];
108695
109141
  async function gatherCodexSummary(deps = {}) {
108696
- const codexHome = resolve24(deps.codexHome ?? process.env.CODEX_HOME ?? join91(homedir23(), ".codex"));
109142
+ const codexHome = resolve27(deps.codexHome ?? process.env.CODEX_HOME ?? join96(homedir26(), ".codex"));
108697
109143
  const binDir = resolveCodexInstallerBinDir({ binDir: deps.binDir, codexHome, env: process.env });
108698
109144
  const detection = await (deps.detectCodexInstallation ?? detectCodexInstallation)();
108699
109145
  const pluginRoot = await resolveInstalledPluginRoot(codexHome);
108700
- const manifest = pluginRoot === null ? null : await readJson(join91(pluginRoot, ".codex-plugin", "plugin.json"));
108701
- const installSnapshot = pluginRoot === null ? null : await readJson(join91(pluginRoot, "lazycodex-install.json"));
108702
- const configPath = join91(codexHome, "config.toml");
109146
+ const manifest = pluginRoot === null ? null : await readJson(join96(pluginRoot, ".codex-plugin", "plugin.json"));
109147
+ const installSnapshot = pluginRoot === null ? null : await readJson(join96(pluginRoot, "lazycodex-install.json"));
109148
+ const configPath = join96(codexHome, "config.toml");
108703
109149
  const pluginVersion = stringField(manifest, "version");
108704
109150
  return {
108705
109151
  codexPath: detection.found && "path" in detection ? detection.path : null,
108706
109152
  codexSource: detection.found ? detection.source : null,
108707
109153
  codexAppId: detection.found && "appId" in detection ? detection.appId : null,
108708
109154
  marketplaceName: MARKETPLACE_NAME,
108709
- pluginName: PLUGIN_NAME2,
109155
+ pluginName: PLUGIN_NAME3,
108710
109156
  pluginVersion,
108711
109157
  pluginVersionStamped: pluginVersion !== null && pluginVersion !== DEFAULT_PLUGIN_VERSION,
108712
109158
  installerVersion: deps.installerVersion ?? package_default3.version,
@@ -108756,7 +109202,7 @@ function buildCodexIssues(summary) {
108756
109202
  if (summary.pluginRoot === null) {
108757
109203
  issues.push({
108758
109204
  title: "OMO Codex plugin is not installed",
108759
- description: `Expected cached plugin at ${join91("plugins", "cache", MARKETPLACE_NAME, PLUGIN_NAME2, DEFAULT_PLUGIN_VERSION)} under CODEX_HOME.`,
109205
+ description: `Expected cached plugin at ${join96("plugins", "cache", MARKETPLACE_NAME, PLUGIN_NAME3, DEFAULT_PLUGIN_VERSION)} under CODEX_HOME.`,
108760
109206
  fix: "Run: npx lazycodex-ai install",
108761
109207
  severity: "error",
108762
109208
  affects: ["plugin loading"]
@@ -108821,15 +109267,15 @@ function buildCodexIssues(summary) {
108821
109267
  return issues;
108822
109268
  }
108823
109269
  async function resolveInstalledPluginRoot(codexHome) {
108824
- const pluginRoot = join91(codexHome, "plugins", "cache", MARKETPLACE_NAME, PLUGIN_NAME2);
108825
- if (!existsSync59(pluginRoot))
109270
+ const pluginRoot = join96(codexHome, "plugins", "cache", MARKETPLACE_NAME, PLUGIN_NAME3);
109271
+ if (!existsSync61(pluginRoot))
108826
109272
  return null;
108827
109273
  const versions = await readdir14(pluginRoot, { withFileTypes: true });
108828
109274
  const candidates = versions.filter((entry) => entry.isDirectory()).map((entry) => entry.name).sort(compareVersionsDescending);
108829
- return candidates.length === 0 ? null : join91(pluginRoot, candidates[0] ?? DEFAULT_PLUGIN_VERSION);
109275
+ return candidates.length === 0 ? null : join96(pluginRoot, candidates[0] ?? DEFAULT_PLUGIN_VERSION);
108830
109276
  }
108831
109277
  async function readCodexConfigSummary(configPath) {
108832
- if (!existsSync59(configPath)) {
109278
+ if (!existsSync61(configPath)) {
108833
109279
  return {
108834
109280
  exists: false,
108835
109281
  marketplaceConfigured: false,
@@ -108854,17 +109300,17 @@ async function readCodexConfigSummary(configPath) {
108854
109300
  async function readLinkedBins(binDir) {
108855
109301
  const linked = [];
108856
109302
  for (const name of CODEX_BIN_NAMES) {
108857
- if (await pathExists3(join91(binDir, process.platform === "win32" ? `${name}.cmd` : name)))
109303
+ if (await pathExists3(join96(binDir, process.platform === "win32" ? `${name}.cmd` : name)))
108858
109304
  linked.push(name);
108859
109305
  }
108860
109306
  return linked;
108861
109307
  }
108862
109308
  async function readLinkedAgents(codexHome) {
108863
- const agentsDir = join91(codexHome, "agents");
108864
- if (!existsSync59(agentsDir))
109309
+ const agentsDir = join96(codexHome, "agents");
109310
+ if (!existsSync61(agentsDir))
108865
109311
  return [];
108866
109312
  const entries = await readdir14(agentsDir, { withFileTypes: true });
108867
- return entries.filter((entry) => entry.isFile() || entry.isSymbolicLink()).map((entry) => basename12(entry.name, ".toml")).sort();
109313
+ return entries.filter((entry) => entry.isFile() || entry.isSymbolicLink()).map((entry) => basename13(entry.name, ".toml")).sort();
108868
109314
  }
108869
109315
  async function readJson(path) {
108870
109316
  try {
@@ -108993,24 +109439,24 @@ function resolveLatestVersion(input) {
108993
109439
  // packages/omo-opencode/src/cli/doctor/checks/codex-components.ts
108994
109440
  init_src();
108995
109441
  import { readdir as readdir15, readFile as readFile31, stat as stat7 } from "node:fs/promises";
108996
- import { homedir as homedir24 } from "node:os";
108997
- import { dirname as dirname36, isAbsolute as isAbsolute14, join as join92, relative as relative9, resolve as resolve25, sep as sep9 } from "node:path";
109442
+ import { homedir as homedir27 } from "node:os";
109443
+ import { dirname as dirname39, isAbsolute as isAbsolute15, join as join97, relative as relative9, resolve as resolve28, sep as sep10 } from "node:path";
108998
109444
  var CODEX_COMPONENTS_CHECK_ID = "codex-components";
108999
109445
  var CODEX_COMPONENTS_CHECK_NAME = "codex-components";
109000
109446
  var PLUGIN_DATA_DIR_NAME = "omo-sisyphuslabs";
109001
- var BOOTSTRAP_PENDING_MESSAGE = "bootstrap pending — start a Codex session";
109447
+ var BOOTSTRAP_PENDING_MESSAGE = "bootstrap pending: start a Codex session";
109002
109448
  var REINSTALL_FIX = "Reinstall: npx lazycodex-ai install (or upgrade: codex plugin marketplace upgrade sisyphuslabs)";
109003
109449
  async function checkCodexComponents(deps = {}) {
109004
109450
  const env = deps.env ?? process.env;
109005
109451
  const platform = deps.platform ?? process.platform;
109006
109452
  const arch = deps.arch ?? process.arch;
109007
- const codexHome = resolve25(deps.codexHome ?? env["CODEX_HOME"] ?? join92(homedir24(), ".codex"));
109453
+ const codexHome = resolve28(deps.codexHome ?? env["CODEX_HOME"] ?? join97(homedir27(), ".codex"));
109008
109454
  const summary = await gatherCodexSummary({ ...deps, codexHome });
109009
109455
  if (summary.pluginRoot === null) {
109010
109456
  return {
109011
109457
  name: CODEX_COMPONENTS_CHECK_NAME,
109012
109458
  status: "skip",
109013
- message: "OMO Codex plugin is not installed — skipping component checks",
109459
+ message: "OMO Codex plugin is not installed: skipping component checks",
109014
109460
  details: [`plugin root: not installed under ${codexHome}`],
109015
109461
  issues: []
109016
109462
  };
@@ -109029,7 +109475,7 @@ async function checkCodexComponents(deps = {}) {
109029
109475
  });
109030
109476
  }
109031
109477
  const runtimeSgDir = runtimeSgDirectory(codexHome, platform, arch);
109032
- const runtimeSgPath = join92(runtimeSgDir, sgBinaryName(platform));
109478
+ const runtimeSgPath = join97(runtimeSgDir, sgBinaryName(platform));
109033
109479
  const sg = findSgBinarySync({
109034
109480
  arch,
109035
109481
  env,
@@ -109068,8 +109514,8 @@ async function auditBundleTargets(pluginRoot) {
109068
109514
  const manifest = await readJson2(manifestPath);
109069
109515
  if (manifest === null || !isRecord18(manifest["mcpServers"]))
109070
109516
  continue;
109071
- const manifestRoot = dirname36(manifestPath);
109072
- const isRootManifest = resolve25(manifestRoot) === resolve25(pluginRoot);
109517
+ const manifestRoot = dirname39(manifestPath);
109518
+ const isRootManifest = resolve28(manifestRoot) === resolve28(pluginRoot);
109073
109519
  for (const server of Object.values(manifest["mcpServers"])) {
109074
109520
  if (!isRecord18(server) || !Array.isArray(server["args"]))
109075
109521
  continue;
@@ -109089,7 +109535,7 @@ async function auditBundleTargets(pluginRoot) {
109089
109535
  continue;
109090
109536
  const commands = [];
109091
109537
  collectHookCommands(manifest, commands);
109092
- const hookPluginRoot = dirname36(dirname36(hookManifestPath));
109538
+ const hookPluginRoot = dirname39(dirname39(hookManifestPath));
109093
109539
  for (const command of commands) {
109094
109540
  for (const relativePath of extractPluginRootPaths(command)) {
109095
109541
  referencedCount += 1;
@@ -109111,9 +109557,9 @@ function recordBrokenTarget(broken, classified, origin) {
109111
109557
  broken.push(entry);
109112
109558
  }
109113
109559
  async function classifyBundleTarget(bundleRoot, baseRoot, relativePath, allowEscape) {
109114
- const targetPath = resolve25(baseRoot, relativePath);
109115
- const bundleRootPath = resolve25(bundleRoot);
109116
- const bundleRootPrefix = bundleRootPath.endsWith(sep9) ? bundleRootPath : `${bundleRootPath}${sep9}`;
109560
+ const targetPath = resolve28(baseRoot, relativePath);
109561
+ const bundleRootPath = resolve28(bundleRoot);
109562
+ const bundleRootPrefix = bundleRootPath.endsWith(sep10) ? bundleRootPath : `${bundleRootPath}${sep10}`;
109117
109563
  if (targetPath !== bundleRootPath && !targetPath.startsWith(bundleRootPrefix)) {
109118
109564
  if (allowEscape)
109119
109565
  return null;
@@ -109128,7 +109574,7 @@ async function classifyBundleTarget(bundleRoot, baseRoot, relativePath, allowEsc
109128
109574
  }
109129
109575
  async function findHookManifestPaths(root) {
109130
109576
  const paths = await findManifestPaths(root, "hooks.json");
109131
- return paths.filter((path) => dirname36(path).endsWith(`${sep9}hooks`));
109577
+ return paths.filter((path) => dirname39(path).endsWith(`${sep10}hooks`));
109132
109578
  }
109133
109579
  async function findManifestPaths(root, manifestName) {
109134
109580
  let entries;
@@ -109141,7 +109587,7 @@ async function findManifestPaths(root, manifestName) {
109141
109587
  for (const entry of entries) {
109142
109588
  if (entry.name === "node_modules" || entry.name === ".git")
109143
109589
  continue;
109144
- const entryPath = join92(root, entry.name);
109590
+ const entryPath = join97(root, entry.name);
109145
109591
  if (entry.isDirectory()) {
109146
109592
  paths.push(...await findManifestPaths(entryPath, manifestName));
109147
109593
  continue;
@@ -109182,21 +109628,21 @@ function extractPluginRootPaths(command) {
109182
109628
  }
109183
109629
  function isPluginRuntimePathArg(arg) {
109184
109630
  const normalized = normalizePathSeparators(arg);
109185
- return normalized.endsWith(".js") && normalized.includes("/dist/") && (normalized.startsWith("./") || normalized.startsWith("../") || normalized.startsWith("components/") || normalized.startsWith("/") || isAbsolute14(arg));
109631
+ return normalized.endsWith(".js") && normalized.includes("/dist/") && (normalized.startsWith("./") || normalized.startsWith("../") || normalized.startsWith("components/") || normalized.startsWith("/") || isAbsolute15(arg));
109186
109632
  }
109187
109633
  function runtimeSgDirectory(codexHome, platform, arch) {
109188
- return join92(codexHome, "runtime", "ast-grep", runtimeSlug(platform, arch));
109634
+ return join97(codexHome, "runtime", "ast-grep", runtimeSlug(platform, arch));
109189
109635
  }
109190
109636
  function describeSgSource(sgPath, env, runtimeSgDir, platform) {
109191
109637
  const override = env[SG_PATH_ENV_KEY]?.trim();
109192
109638
  if (override !== undefined && override.length > 0 && sgPath === override)
109193
109639
  return `env override ${SG_PATH_ENV_KEY}`;
109194
- if (sgPath === join92(runtimeSgDir, sgBinaryName(platform)))
109640
+ if (sgPath === join97(runtimeSgDir, sgBinaryName(platform)))
109195
109641
  return "runtime dir";
109196
109642
  return "PATH";
109197
109643
  }
109198
109644
  async function readBootstrapStateSummary(codexHome) {
109199
- const statePath = join92(codexHome, "plugins", "data", PLUGIN_DATA_DIR_NAME, "bootstrap", "state.json");
109645
+ const statePath = join97(codexHome, "plugins", "data", PLUGIN_DATA_DIR_NAME, "bootstrap", "state.json");
109200
109646
  const raw = await readJson2(statePath);
109201
109647
  if (raw === null)
109202
109648
  return null;
@@ -109272,24 +109718,24 @@ function isRecord18(value) {
109272
109718
  }
109273
109719
 
109274
109720
  // packages/omo-opencode/src/cli/doctor/checks/codex-runtime-wrapper.ts
109275
- import { existsSync as existsSync60 } from "node:fs";
109721
+ import { existsSync as existsSync62 } from "node:fs";
109276
109722
  import { readFile as readFile32 } from "node:fs/promises";
109277
- import { homedir as homedir25 } from "node:os";
109278
- import { join as join93, resolve as resolve26 } from "node:path";
109723
+ import { homedir as homedir28 } from "node:os";
109724
+ import { join as join98, resolve as resolve29 } from "node:path";
109279
109725
  var RUNTIME_WRAPPER_MARKER2 = "OMO_GENERATED_RUNTIME_WRAPPER";
109280
109726
  var CHECK_NAME = "codex-runtime-wrapper";
109281
109727
  var REINSTALL_COMMAND = "npx --yes lazycodex-ai@latest install --no-tui";
109282
109728
  async function checkCodexRuntimeWrapper(deps = {}) {
109283
- const codexHome = resolve26(deps.codexHome ?? process.env.CODEX_HOME ?? join93(homedir25(), ".codex"));
109729
+ const codexHome = resolve29(deps.codexHome ?? process.env.CODEX_HOME ?? join98(homedir28(), ".codex"));
109284
109730
  const binDir = resolveCodexInstallerBinDir({ binDir: deps.binDir, codexHome, env: process.env });
109285
109731
  const platform = deps.platform ?? process.platform;
109286
- const wrapperPath = join93(binDir, platform === "win32" ? "omo-agent-toolkit.cmd" : "omo-agent-toolkit");
109287
- const legacyWrapperPath = join93(binDir, platform === "win32" ? "omo.cmd" : "omo");
109732
+ const wrapperPath = join98(binDir, platform === "win32" ? "omo-agent-toolkit.cmd" : "omo-agent-toolkit");
109733
+ const legacyWrapperPath = join98(binDir, platform === "win32" ? "omo.cmd" : "omo");
109288
109734
  const [wrapper, legacyWrapper] = await Promise.all([readRuntimeWrapper(wrapperPath), readRuntimeWrapper(legacyWrapperPath)]);
109289
109735
  const issues = [];
109290
109736
  if (wrapper?.includes(RUNTIME_WRAPPER_MARKER2) === true) {
109291
109737
  const targetPath = parseRuntimeTargetPath(wrapper);
109292
- if (targetPath !== null && !existsSync60(targetPath)) {
109738
+ if (targetPath !== null && !existsSync62(targetPath)) {
109293
109739
  issues.push({
109294
109740
  title: "omo-agent-toolkit runtime wrapper target is missing",
109295
109741
  description: `Generated omo-agent-toolkit runtime wrapper at ${wrapperPath} points to missing target ${targetPath}.`,
@@ -109812,10 +110258,10 @@ Doctor failed unexpectedly: ${message}`];
109812
110258
  init_commander();
109813
110259
 
109814
110260
  // packages/mcp-client-core/src/mcp-oauth/storage.ts
109815
- import { createHash as createHash7 } from "node:crypto";
110261
+ import { createHash as createHash8 } from "node:crypto";
109816
110262
  import {
109817
110263
  chmodSync as chmodSync5,
109818
- existsSync as existsSync63,
110264
+ existsSync as existsSync65,
109819
110265
  mkdirSync as mkdirSync17,
109820
110266
  readdirSync as readdirSync13,
109821
110267
  readFileSync as readFileSync42,
@@ -109823,18 +110269,18 @@ import {
109823
110269
  unlinkSync as unlinkSync9,
109824
110270
  writeFileSync as writeFileSync14
109825
110271
  } from "node:fs";
109826
- import { basename as basename13, dirname as dirname37, join as join96 } from "node:path";
110272
+ import { basename as basename14, dirname as dirname40, join as join101 } from "node:path";
109827
110273
 
109828
110274
  // packages/mcp-client-core/src/config-dir.ts
109829
- import { existsSync as existsSync61, realpathSync as realpathSync10 } from "node:fs";
109830
- import { homedir as homedir26 } from "node:os";
109831
- import { join as join94, resolve as resolve27 } from "node:path";
109832
- function resolveConfigPath2(pathValue) {
109833
- const resolvedPath = resolve27(pathValue);
109834
- if (!existsSync61(resolvedPath))
110275
+ import { existsSync as existsSync63, realpathSync as realpathSync12 } from "node:fs";
110276
+ import { homedir as homedir29 } from "node:os";
110277
+ import { join as join99, resolve as resolve30 } from "node:path";
110278
+ function resolveConfigPath3(pathValue) {
110279
+ const resolvedPath = resolve30(pathValue);
110280
+ if (!existsSync63(resolvedPath))
109835
110281
  return resolvedPath;
109836
110282
  try {
109837
- return realpathSync10(resolvedPath);
110283
+ return realpathSync12(resolvedPath);
109838
110284
  } catch (error) {
109839
110285
  if (!(error instanceof Error))
109840
110286
  throw error;
@@ -109844,15 +110290,15 @@ function resolveConfigPath2(pathValue) {
109844
110290
  function getOpenCodeCliConfigDir(env = process.env) {
109845
110291
  const customConfigDir = env["OPENCODE_CONFIG_DIR"]?.trim();
109846
110292
  if (customConfigDir) {
109847
- return resolveConfigPath2(customConfigDir);
110293
+ return resolveConfigPath3(customConfigDir);
109848
110294
  }
109849
- const xdgConfigDir = env["XDG_CONFIG_HOME"]?.trim() || join94(homedir26(), ".config");
109850
- return resolveConfigPath2(join94(xdgConfigDir, "opencode"));
110295
+ const xdgConfigDir = env["XDG_CONFIG_HOME"]?.trim() || join99(homedir29(), ".config");
110296
+ return resolveConfigPath3(join99(xdgConfigDir, "opencode"));
109851
110297
  }
109852
110298
 
109853
110299
  // packages/mcp-client-core/src/mcp-oauth/storage-index.ts
109854
- import { chmodSync as chmodSync4, existsSync as existsSync62, readFileSync as readFileSync41, renameSync as renameSync7, writeFileSync as writeFileSync13 } from "node:fs";
109855
- import { join as join95 } from "node:path";
110300
+ import { chmodSync as chmodSync4, existsSync as existsSync64, readFileSync as readFileSync41, renameSync as renameSync7, writeFileSync as writeFileSync13 } from "node:fs";
110301
+ import { join as join100 } from "node:path";
109856
110302
  var INDEX_FILE_NAME = "index.json";
109857
110303
  function isTokenIndex(value) {
109858
110304
  if (typeof value !== "object" || value === null || Array.isArray(value))
@@ -109860,11 +110306,11 @@ function isTokenIndex(value) {
109860
110306
  return Object.values(value).every((entry) => typeof entry === "string");
109861
110307
  }
109862
110308
  function getIndexPath(storageDir) {
109863
- return join95(storageDir, INDEX_FILE_NAME);
110309
+ return join100(storageDir, INDEX_FILE_NAME);
109864
110310
  }
109865
110311
  function readTokenIndex(storageDir) {
109866
110312
  const indexPath = getIndexPath(storageDir);
109867
- if (!existsSync62(indexPath))
110313
+ if (!existsSync64(indexPath))
109868
110314
  return {};
109869
110315
  try {
109870
110316
  const parsed = JSON.parse(readFileSync41(indexPath, "utf-8"));
@@ -109904,16 +110350,16 @@ function deleteTokenIndexEntry(storageDir, hash) {
109904
110350
  var STORAGE_DIR_NAME = "mcp-oauth";
109905
110351
  var LEGACY_STORAGE_FILE_NAME = "mcp-oauth.json";
109906
110352
  function getMcpOauthStorageDir() {
109907
- return join96(getOpenCodeCliConfigDir(), STORAGE_DIR_NAME);
110353
+ return join101(getOpenCodeCliConfigDir(), STORAGE_DIR_NAME);
109908
110354
  }
109909
110355
  function getMcpOauthServerHash(serverHost, resource) {
109910
- return createHash7("sha256").update(buildKey(serverHost, resource)).digest("hex").slice(0, 32);
110356
+ return createHash8("sha256").update(buildKey(serverHost, resource)).digest("hex").slice(0, 32);
109911
110357
  }
109912
110358
  function getMcpOauthStoragePath(serverHost, resource) {
109913
- return join96(getMcpOauthStorageDir(), `${getMcpOauthServerHash(serverHost, resource)}.json`);
110359
+ return join101(getMcpOauthStorageDir(), `${getMcpOauthServerHash(serverHost, resource)}.json`);
109914
110360
  }
109915
110361
  function getLegacyStoragePath() {
109916
- return join96(getOpenCodeCliConfigDir(), LEGACY_STORAGE_FILE_NAME);
110362
+ return join101(getOpenCodeCliConfigDir(), LEGACY_STORAGE_FILE_NAME);
109917
110363
  }
109918
110364
  function normalizeHost2(serverHost) {
109919
110365
  let host = serverHost.trim();
@@ -109974,7 +110420,7 @@ function isOAuthTokenData(value) {
109974
110420
  return clientSecret === undefined || typeof clientSecret === "string";
109975
110421
  }
109976
110422
  function readTokenFile(filePath) {
109977
- if (!existsSync63(filePath))
110423
+ if (!existsSync65(filePath))
109978
110424
  return null;
109979
110425
  try {
109980
110426
  const parsed = JSON.parse(readFileSync42(filePath, "utf-8"));
@@ -109987,7 +110433,7 @@ function readTokenFile(filePath) {
109987
110433
  }
109988
110434
  function readLegacyStore() {
109989
110435
  const filePath = getLegacyStoragePath();
109990
- if (!existsSync63(filePath))
110436
+ if (!existsSync65(filePath))
109991
110437
  return null;
109992
110438
  try {
109993
110439
  const parsed = JSON.parse(readFileSync42(filePath, "utf-8"));
@@ -110007,8 +110453,8 @@ function readLegacyStore() {
110007
110453
  }
110008
110454
  function writeTokenFile(filePath, token) {
110009
110455
  try {
110010
- const dir = dirname37(filePath);
110011
- if (!existsSync63(dir)) {
110456
+ const dir = dirname40(filePath);
110457
+ if (!existsSync65(dir)) {
110012
110458
  mkdirSync17(dir, { recursive: true });
110013
110459
  }
110014
110460
  const tempPath = `${filePath}.tmp.${Date.now()}`;
@@ -110032,7 +110478,7 @@ function saveToken(serverHost, resource, token) {
110032
110478
  }
110033
110479
  function deleteToken(serverHost, resource) {
110034
110480
  const filePath = getMcpOauthStoragePath(serverHost, resource);
110035
- if (!existsSync63(filePath))
110481
+ if (!existsSync65(filePath))
110036
110482
  return deleteLegacyToken(serverHost, resource);
110037
110483
  try {
110038
110484
  unlinkSync9(filePath);
@@ -110054,7 +110500,7 @@ function deleteLegacyToken(serverHost, resource) {
110054
110500
  if (Object.keys(store).length === 0) {
110055
110501
  try {
110056
110502
  const filePath = getLegacyStoragePath();
110057
- if (existsSync63(filePath))
110503
+ if (existsSync65(filePath))
110058
110504
  unlinkSync9(filePath);
110059
110505
  return true;
110060
110506
  } catch (deleteError) {
@@ -110092,7 +110538,7 @@ function listTokensByHost(serverHost) {
110092
110538
  for (const [hash, indexedKey] of Object.entries(index)) {
110093
110539
  if (!indexedKey.startsWith(prefix))
110094
110540
  continue;
110095
- const indexedToken = readTokenFile(join96(getMcpOauthStorageDir(), `${hash}.json`));
110541
+ const indexedToken = readTokenFile(join101(getMcpOauthStorageDir(), `${hash}.json`));
110096
110542
  if (indexedToken)
110097
110543
  result[indexedKey] = indexedToken;
110098
110544
  }
@@ -110101,14 +110547,14 @@ function listTokensByHost(serverHost) {
110101
110547
  function listAllTokens() {
110102
110548
  const result = { ...readLegacyStore() ?? {} };
110103
110549
  const dir = getMcpOauthStorageDir();
110104
- if (!existsSync63(dir))
110550
+ if (!existsSync65(dir))
110105
110551
  return result;
110106
110552
  const index = readTokenIndex(dir);
110107
110553
  for (const entry of readdirSync13(dir, { withFileTypes: true })) {
110108
110554
  if (!entry.isFile() || !entry.name.endsWith(".json") || entry.name === "index.json")
110109
110555
  continue;
110110
- const token = readTokenFile(join96(dir, entry.name));
110111
- const hash = basename13(entry.name, ".json");
110556
+ const token = readTokenFile(join101(dir, entry.name));
110557
+ const hash = basename14(entry.name, ".json");
110112
110558
  if (token)
110113
110559
  result[index[hash] ?? hash] = token;
110114
110560
  }
@@ -110116,7 +110562,7 @@ function listAllTokens() {
110116
110562
  }
110117
110563
 
110118
110564
  // packages/mcp-client-core/src/plugin-identity.ts
110119
- var PLUGIN_NAME3 = "oh-my-openagent";
110565
+ var PLUGIN_NAME4 = "oh-my-openagent";
110120
110566
 
110121
110567
  // packages/mcp-client-core/src/mcp-oauth/discovery.ts
110122
110568
  var discoveryCache = new Map;
@@ -110281,13 +110727,13 @@ async function findAvailablePort2(startPort = DEFAULT_PORT) {
110281
110727
 
110282
110728
  // packages/mcp-client-core/src/mcp-oauth/oauth-authorization-flow.ts
110283
110729
  import { spawn as spawn4 } from "node:child_process";
110284
- import { createHash as createHash8, randomBytes as randomBytes2 } from "node:crypto";
110730
+ import { createHash as createHash9, randomBytes as randomBytes2 } from "node:crypto";
110285
110731
  import { createServer as createServer2 } from "node:http";
110286
110732
  function generateCodeVerifier() {
110287
110733
  return randomBytes2(32).toString("base64url");
110288
110734
  }
110289
110735
  function generateCodeChallenge(verifier) {
110290
- return createHash8("sha256").update(verifier).digest("base64url");
110736
+ return createHash9("sha256").update(verifier).digest("base64url");
110291
110737
  }
110292
110738
  function buildAuthorizationUrl(authorizationEndpoint, options) {
110293
110739
  const url = new URL(authorizationEndpoint);
@@ -110493,7 +110939,7 @@ class McpOAuthProvider {
110493
110939
  const clientInfo = await getOrRegisterClient({
110494
110940
  ...metadata.registrationEndpoint ? { registrationEndpoint: metadata.registrationEndpoint } : {},
110495
110941
  serverIdentifier: this.serverUrl,
110496
- clientName: PLUGIN_NAME3,
110942
+ clientName: PLUGIN_NAME4,
110497
110943
  redirectUris: [this.redirectUrl()],
110498
110944
  tokenEndpointAuthMethod: "none",
110499
110945
  ...this.configClientId ? { clientId: this.configClientId } : {},
@@ -111179,8 +111625,8 @@ async function loadDeviceKeyring(store) {
111179
111625
 
111180
111626
  // packages/omo-opencode/src/cli/account-keys/keystore.ts
111181
111627
  import { execFile as execFile5 } from "node:child_process";
111182
- import { homedir as homedir27 } from "node:os";
111183
- import { join as join97 } from "node:path";
111628
+ import { homedir as homedir30 } from "node:os";
111629
+ import { join as join102 } from "node:path";
111184
111630
  var DEFAULT_SERVICE = "omo-cli";
111185
111631
  function defaultRun(argv, input) {
111186
111632
  const [file, ...args] = argv;
@@ -111288,8 +111734,8 @@ function createLibsecretKeyStore(name, run) {
111288
111734
  }
111289
111735
  function createDpapiKeyStore(name, run) {
111290
111736
  const safeName = name.replace(/[^A-Za-z0-9._-]/g, "-");
111291
- const directory = join97(process.env.LOCALAPPDATA ?? join97(homedir27(), "AppData", "Local"), "omo");
111292
- const file = join97(directory, `device-keys-${safeName}.bin`);
111737
+ const directory = join102(process.env.LOCALAPPDATA ?? join102(homedir30(), "AppData", "Local"), "omo");
111738
+ const file = join102(directory, `device-keys-${safeName}.bin`);
111293
111739
  const ps = (literal) => `'${literal.replace(/'/g, "''")}'`;
111294
111740
  const prelude = "Add-Type -AssemblyName System.Security; ";
111295
111741
  const fail = () => new Error("omo account keys: Windows DPAPI is unavailable. Sign in with your Windows account (DPAPI needs the account credential) and try again. " + "Private keys are only ever stored through DPAPI (a per-user encrypted blob).");
@@ -111453,6 +111899,7 @@ class ApiRefusal extends SignInError {
111453
111899
  "account_deleted",
111454
111900
  "reauth_required",
111455
111901
  "invalid_grant",
111902
+ "device_revoked",
111456
111903
  "entitlement_required",
111457
111904
  "authorization_pending",
111458
111905
  "slow_down",
@@ -111648,7 +112095,7 @@ async function loginDevice(session, options) {
111648
112095
  }
111649
112096
 
111650
112097
  // packages/omo-opencode/src/cli/service-auth/keystore.ts
111651
- import { createHash as createHash9 } from "node:crypto";
112098
+ import { createHash as createHash10 } from "node:crypto";
111652
112099
 
111653
112100
  // packages/omo-opencode/src/cli/service-auth/secret-service-lock.ts
111654
112101
  import { spawn as spawn5 } from "node:child_process";
@@ -111692,7 +112139,10 @@ var probeSecretServiceLock = () => new Promise((resolve) => {
111692
112139
  });
111693
112140
 
111694
112141
  // packages/omo-opencode/src/cli/service-auth/keystore.ts
111695
- class KeychainLockedError extends SignInError {
112142
+ class CredentialStoreError extends SignInError {
112143
+ }
112144
+
112145
+ class KeychainLockedError extends CredentialStoreError {
111696
112146
  }
111697
112147
  var LOCKED = /-25308|errSecInteractionNotAllowed|interaction is not allowed|locked collection/i;
111698
112148
  var UNLOCKED_REUSE_MS = 30000;
@@ -111706,7 +112156,7 @@ var stderrNoticeOncePerProcess = (message) => {
111706
112156
  };
111707
112157
  var isLocked = (error) => error instanceof Error && (LOCKED.test(error.message) || LOCKED.test(String(error.code ?? "")));
111708
112158
  function credentialId(api) {
111709
- return createHash9("sha256").update(serviceOrigin(api)).digest("hex");
112159
+ return createHash10("sha256").update(serviceOrigin(api)).digest("hex");
111710
112160
  }
111711
112161
  function createCredentialStore(api, secrets = typeof Bun === "undefined" ? null : Bun.secrets, platform = process.platform, lockProbe = probeSecretServiceLock, notice = stderrNoticeOncePerProcess) {
111712
112162
  if (!secrets)
@@ -111715,7 +112165,7 @@ function createCredentialStore(api, secrets = typeof Bun === "undefined" ? null
111715
112165
  if (platformName === null)
111716
112166
  throw new SignInError("This platform has no supported OS credential store.");
111717
112167
  const key = { service: "omo-cli", name: credentialId(api) };
111718
- const unavailable = (error) => isLocked(error) ? new KeychainLockedError(`${platformName} is locked. Unlock it, then try again. Credentials are never saved to a file.`) : new SignInError(`Cannot access ${platformName}. Unlock or enable the OS credential store and try again. Credentials are never saved to a file.`);
112168
+ const unavailable = (error) => isLocked(error) ? new KeychainLockedError(`${platformName} is locked. Unlock it, then try again. Credentials are never saved to a file.`) : new CredentialStoreError(`Cannot access ${platformName}. Unlock or enable the OS credential store and try again. Credentials are never saved to a file.`);
111719
112169
  let unlockedUntil = 0;
111720
112170
  let noticed = false;
111721
112171
  const assertUsable = async () => {
@@ -111770,7 +112220,7 @@ function createCredentialStore(api, secrets = typeof Bun === "undefined" ? null
111770
112220
  }
111771
112221
 
111772
112222
  // packages/omo-opencode/src/cli/service-auth/loopback.ts
111773
- import { createHash as createHash10, randomBytes as randomBytes3, timingSafeEqual } from "node:crypto";
112223
+ import { createHash as createHash11, randomBytes as randomBytes3, timingSafeEqual } from "node:crypto";
111774
112224
  import { createServer as createServer3 } from "node:http";
111775
112225
  class BrowserUnavailable extends SignInError {
111776
112226
  }
@@ -111816,7 +112266,7 @@ async function authorize(options) {
111816
112266
  const url = new URL(serviceOrigin(options.accounts));
111817
112267
  url.search = new URLSearchParams({
111818
112268
  redirect_uri: `${origin}/callback`,
111819
- code_challenge: createHash10("sha256").update(verifier).digest("base64url"),
112269
+ code_challenge: createHash11("sha256").update(verifier).digest("base64url"),
111820
112270
  code_challenge_method: "S256",
111821
112271
  state
111822
112272
  }).toString();
@@ -111870,12 +112320,12 @@ async function loginLoopback(session, options) {
111870
112320
 
111871
112321
  // packages/omo-opencode/src/cli/service-auth/session.ts
111872
112322
  import { mkdir as mkdir10 } from "node:fs/promises";
111873
- import { homedir as homedir28 } from "node:os";
111874
- import { join as join98 } from "node:path";
112323
+ import { homedir as homedir31 } from "node:os";
112324
+ import { join as join103 } from "node:path";
111875
112325
 
111876
112326
  // packages/team-core/src/team-state-store/lock-publish.ts
111877
112327
  import { access as access3, open as open2, unlink as unlink2 } from "node:fs/promises";
111878
- import { dirname as dirname38 } from "node:path";
112328
+ import { dirname as dirname41 } from "node:path";
111879
112329
 
111880
112330
  // packages/team-core/src/team-state-store/lock-record.ts
111881
112331
  import { randomUUID as randomUUID5 } from "node:crypto";
@@ -111975,7 +112425,7 @@ async function assertRetryableLockOpenError(lockPath, error, deps) {
111975
112425
  if (code === "EPERM") {
111976
112426
  if (await pathMayExist(lockPath, deps))
111977
112427
  return;
111978
- if ((deps?.platform ?? process.platform) === "win32" && await pathMayExist(dirname38(lockPath), deps))
112428
+ if ((deps?.platform ?? process.platform) === "win32" && await pathMayExist(dirname41(lockPath), deps))
111979
112429
  return;
111980
112430
  }
111981
112431
  throw error;
@@ -112005,7 +112455,7 @@ async function publishLockRecord(lockPath, record) {
112005
112455
  }
112006
112456
 
112007
112457
  // packages/team-core/src/team-state-store/lock-reclaim.ts
112008
- import { createHash as createHash11 } from "node:crypto";
112458
+ import { createHash as createHash12 } from "node:crypto";
112009
112459
  import { unlink as unlink3 } from "node:fs/promises";
112010
112460
  var RECLAIM_UNLINK_ATTEMPTS = 3;
112011
112461
  var RECLAIM_UNLINK_RETRY_MS = 25;
@@ -112015,7 +112465,7 @@ function delay2(ms) {
112015
112465
  });
112016
112466
  }
112017
112467
  function reclaimGuardPath(lockPath, record) {
112018
- return `${lockPath}.reclaim-${createHash11("sha256").update(record).digest("hex").slice(0, 16)}`;
112468
+ return `${lockPath}.reclaim-${createHash12("sha256").update(record).digest("hex").slice(0, 16)}`;
112019
112469
  }
112020
112470
  async function unlinkWithRetry(path, deps) {
112021
112471
  const wait = deps.delay ?? delay2;
@@ -112114,12 +112564,12 @@ class SessionEnded extends SignInError {
112114
112564
  this.code = code;
112115
112565
  }
112116
112566
  }
112117
- var DEVICE_REVOKING_REFUSALS = new Set(["account_deleted", "reauth_required"]);
112567
+ var DEVICE_REVOKING_REFUSALS = new Set(["account_deleted", "reauth_required", "device_revoked"]);
112118
112568
  function createSession(options) {
112119
112569
  const api = serviceOrigin(options.api);
112120
112570
  const { store, signal } = options;
112121
- const directory = join98(options.home ?? homedir28(), ".omo", "session-locks");
112122
- const lockPath = join98(directory, `${credentialId(api)}.lock`);
112571
+ const directory = join103(options.home ?? homedir31(), ".omo", "session-locks");
112572
+ const lockPath = join103(directory, `${credentialId(api)}.lock`);
112123
112573
  async function locked(action) {
112124
112574
  await mkdir10(directory, { recursive: true, mode: 448 });
112125
112575
  signal?.throwIfAborted();
@@ -112141,7 +112591,9 @@ function createSession(options) {
112141
112591
  await store.write({ ...current, ...tokens });
112142
112592
  return tokens.accessToken;
112143
112593
  } catch (error) {
112144
- if (error instanceof ApiRefusal && error.status < 500 && ["unauthorized", "account_deleted", "reauth_required", "invalid_grant"].includes(error.code)) {
112594
+ if (error instanceof CredentialStoreError)
112595
+ throw error;
112596
+ if (error instanceof ApiRefusal && error.status < 500 && ["unauthorized", "account_deleted", "reauth_required", "invalid_grant", "device_revoked"].includes(error.code)) {
112145
112597
  await store.clear();
112146
112598
  throw new SessionEnded(error.code === "reauth_required" ? "This session was ended because its refresh token was reused. Sign in again with omo login." : "Sign in again with omo login.", DEVICE_REVOKING_REFUSALS.has(error.code), error.code);
112147
112599
  }
@@ -112370,7 +112822,7 @@ function resolveInstallArgs(options, invocationName = process.env.OMO_INVOCATION
112370
112822
  init_commander();
112371
112823
 
112372
112824
  // packages/omo-opencode/src/cli/boulder/boulder.ts
112373
- import { existsSync as existsSync64 } from "node:fs";
112825
+ import { existsSync as existsSync66 } from "node:fs";
112374
112826
 
112375
112827
  // packages/omo-opencode/src/cli/boulder/formatter.ts
112376
112828
  var import_picocolors22 = __toESM(require_picocolors(), 1);
@@ -112507,10 +112959,10 @@ async function boulder(options) {
112507
112959
  const boulderFilePath = getBoulderFilePath(directory);
112508
112960
  const state = readBoulderState(directory);
112509
112961
  if (!state) {
112510
- const message = existsSync64(boulderFilePath) ? formatReadErrorMessage(options.json) : formatNoBoulderMessage(options.json);
112962
+ const message = existsSync66(boulderFilePath) ? formatReadErrorMessage(options.json) : formatNoBoulderMessage(options.json);
112511
112963
  process.stderr.write(`${message}
112512
112964
  `);
112513
- return existsSync64(boulderFilePath) ? 2 : 1;
112965
+ return existsSync66(boulderFilePath) ? 2 : 1;
112514
112966
  }
112515
112967
  const works = getBoulderWorks(state);
112516
112968
  const filteredWorks = options.workId ? works.filter((work) => work.work_id === options.workId) : works;
@@ -112528,12 +112980,12 @@ async function boulder(options) {
112528
112980
  }
112529
112981
  // packages/omo-opencode/src/cli/codex-ulw-loop.ts
112530
112982
  import { spawn as spawn6 } from "node:child_process";
112531
- import { existsSync as existsSync65, readFileSync as readFileSync43, realpathSync as realpathSync11 } from "node:fs";
112532
- import { homedir as homedir29 } from "node:os";
112983
+ import { existsSync as existsSync67, readFileSync as readFileSync43, realpathSync as realpathSync13 } from "node:fs";
112984
+ import { homedir as homedir32 } from "node:os";
112533
112985
  var ULW_LOOP_DELEGATION_SENTINEL = "OMO_ULW_LOOP_DELEGATED";
112534
112986
  function resolveCodexUlwLoopCommand(input = {}) {
112535
112987
  const env = input.env ?? process.env;
112536
- const homeDir = input.homeDir ?? homedir29();
112988
+ const homeDir = input.homeDir ?? homedir32();
112537
112989
  const localComponentBin = resolveLocalUlwLoopBin(env, homeDir);
112538
112990
  if (localComponentBin !== null)
112539
112991
  return { executable: localComponentBin, argsPrefix: [] };
@@ -112570,11 +113022,11 @@ async function codexUlwLoop(args) {
112570
113022
  }
112571
113023
  function resolveLocalUlwLoopBin(env, homeDir) {
112572
113024
  const candidates = resolveCodexComponentBinCandidates({ executableName: "omo-ulw-loop", env, homeDir });
112573
- return candidates.find((candidate) => existsSync65(candidate)) ?? null;
113025
+ return candidates.find((candidate) => existsSync67(candidate)) ?? null;
112574
113026
  }
112575
113027
  function resolveLegacyLocalOmoBin(env, homeDir, currentExecutablePaths) {
112576
113028
  const candidates = resolveCodexComponentBinCandidates({ executableName: "omo", env, homeDir });
112577
- return candidates.find((candidate) => existsSync65(candidate) && !isCurrentExecutable(candidate, currentExecutablePaths) && !isGeneratedRuntimeWrapper(candidate)) ?? null;
113029
+ return candidates.find((candidate) => existsSync67(candidate) && !isCurrentExecutable(candidate, currentExecutablePaths) && !isGeneratedRuntimeWrapper(candidate)) ?? null;
112578
113030
  }
112579
113031
  function isGeneratedRuntimeWrapper(candidate) {
112580
113032
  try {
@@ -112591,7 +113043,7 @@ function isCurrentExecutable(candidate, currentExecutablePaths) {
112591
113043
  }
112592
113044
  function realpathOrSelf2(path) {
112593
113045
  try {
112594
- return realpathSync11(path);
113046
+ return realpathSync13(path);
112595
113047
  } catch (error) {
112596
113048
  if (error instanceof Error)
112597
113049
  return path;
@@ -112775,7 +113227,7 @@ function linkedWorktrees(records) {
112775
113227
  return records.slice(1);
112776
113228
  }
112777
113229
  // packages/omo-opencode/src/cli/worktree-sweep/sweep.ts
112778
- import { existsSync as existsSync66 } from "node:fs";
113230
+ import { existsSync as existsSync68 } from "node:fs";
112779
113231
  import { stat as stat9 } from "node:fs/promises";
112780
113232
  import os7 from "node:os";
112781
113233
  import { normalize as normalize2 } from "node:path";
@@ -112866,7 +113318,7 @@ async function isOlderThan(worktreePath, days, now) {
112866
113318
  }
112867
113319
  }
112868
113320
  async function classifyRecord(repo, record, defaultBranch, options) {
112869
- const pathExists = existsSync66(record.path);
113321
+ const pathExists = existsSync68(record.path);
112870
113322
  const external = isExcludedPath(record.path, options.excludePrefixes, options.home);
112871
113323
  const current = options.currentWorktree !== undefined && record.path === options.currentWorktree;
112872
113324
  if (record.locked || !pathExists || external || current) {
@@ -112895,7 +113347,7 @@ async function sweepRepo(repo, options) {
112895
113347
  const records = linkedWorktrees(allRecords);
112896
113348
  const startedInLinked = records.some((record) => record.path === toplevel);
112897
113349
  const mainWorktree = allRecords[0]?.path;
112898
- const root = startedInLinked && mainWorktree !== undefined && existsSync66(mainWorktree) ? mainWorktree : toplevel;
113350
+ const root = startedInLinked && mainWorktree !== undefined && existsSync68(mainWorktree) ? mainWorktree : toplevel;
112899
113351
  const currentWorktree = startedInLinked ? toplevel : undefined;
112900
113352
  const classifications = [];
112901
113353
  for (const record of records) {
@@ -113024,7 +113476,7 @@ prunes.
113024
113476
 
113025
113477
  // packages/omo-opencode/src/cli/config-migrate.ts
113026
113478
  init_startup_migration();
113027
- import { posix as posix12 } from "node:path";
113479
+ import { posix as posix13 } from "node:path";
113028
113480
  function reports(result) {
113029
113481
  return result.results.map((entry) => ({
113030
113482
  diagnostics: entry.diagnostics,
@@ -113058,7 +113510,7 @@ function runConfigMigrate(options = {}) {
113058
113510
  dryRun: options.dryRun ?? false,
113059
113511
  environment,
113060
113512
  ...homeDir === undefined ? {} : { env: { HOME: homeDir }, homeDir },
113061
- pathOperations: posix12
113513
+ pathOperations: posix13
113062
113514
  });
113063
113515
  const report = reports(result);
113064
113516
  const response = {