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
package/dist/cli/index.js CHANGED
@@ -2132,7 +2132,7 @@ var package_default;
2132
2132
  var init_package = __esm(() => {
2133
2133
  package_default = {
2134
2134
  name: "oh-my-opencode",
2135
- version: "5.1.44",
2135
+ version: "5.1.46",
2136
2136
  description: "The Best AI Agent Harness - Batteries-Included OpenCode Plugin with Multi-Model Orchestration, Parallel Background Agents, and Crafted LSP/AST Tools",
2137
2137
  main: "./dist/index.js",
2138
2138
  types: "dist/index.d.ts",
@@ -2252,6 +2252,8 @@ var init_package = __esm(() => {
2252
2252
  "build:senpi-plugin": "bun run build:lsp-daemon && bun run build:ast-grep-mcp && bun run build:senpi-plugin:stage",
2253
2253
  "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",
2254
2254
  "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",
2255
+ "bundle-inputs": "node packages/omo-senpi/plugin/scripts/bundle-inputs.mjs",
2256
+ "bundle-inputs:check": "node packages/omo-senpi/plugin/scripts/bundle-inputs.mjs --check",
2255
2257
  "build:materialize-frontend": "node packages/omo-codex/plugin/scripts/materialize-shared-upstreams.mjs --strict",
2256
2258
  "build:shared-skills-assets": "bun run build:materialize-frontend && rm -rf dist/skills && cp -R packages/shared-skills/skills dist/skills",
2257
2259
  "build:lsp-tools-mcp": "npm --prefix packages/lsp-tools-mcp ci && npm --prefix packages/lsp-tools-mcp run build",
@@ -2270,7 +2272,8 @@ var init_package = __esm(() => {
2270
2272
  postinstall: "node postinstall.mjs",
2271
2273
  prepublishOnly: "bun run clean && bun run build:lsp-tools-mcp && bun run build:lsp-daemon && bun run build",
2272
2274
  "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",
2273
- typecheck: "tsgo --noEmit && bun run typecheck:script && bun run typecheck:packages",
2275
+ "check:copy": "bun script/check-copy.ts",
2276
+ typecheck: "bun run check:copy && tsgo --noEmit && bun run typecheck:script && bun run typecheck:packages",
2274
2277
  "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",
2275
2278
  "typecheck:script": "tsgo --noEmit -p script/tsconfig.json",
2276
2279
  test: "bun test --timeout 20000",
@@ -2281,7 +2284,10 @@ var init_package = __esm(() => {
2281
2284
  "test:windows-codex": "bun run test:codex",
2282
2285
  "build:git-bash-mcp": "bun run --cwd packages/git-bash-mcp build",
2283
2286
  "build:ast-grep-mcp": "bun run --cwd packages/ast-grep-mcp build",
2284
- "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"
2287
+ "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
+ "lint:ratchet": "bun script/lint-ratchet.ts",
2289
+ "lint:ratchet:update": "bun script/lint-ratchet.ts --update",
2290
+ 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"
2285
2291
  },
2286
2292
  keywords: [
2287
2293
  "opencode",
@@ -2309,7 +2315,7 @@ var init_package = __esm(() => {
2309
2315
  },
2310
2316
  devDependencies: {
2311
2317
  "@clack/prompts": "^1.8.1",
2312
- "@code-yeongyu/senpi": "2026.10.21-3",
2318
+ "@code-yeongyu/senpi": "2026.10.23-1",
2313
2319
  "@modelcontextprotocol/sdk": "^1.30.0",
2314
2320
  "@oh-my-opencode/agents-md-core": "workspace:*",
2315
2321
  "@oh-my-opencode/ast-grep-mcp": "workspace:*",
@@ -2363,6 +2369,8 @@ var init_package = __esm(() => {
2363
2369
  "jsonc-parser": "^3.3.1",
2364
2370
  "node-pty": "^1.1.0",
2365
2371
  omowright: "github:code-yeongyu/omowright#f87ef4d63fe7b56fe117dbab246c8ad88dd8a780",
2372
+ "oxc-parser": "0.148.0",
2373
+ oxlint: "1.89.0",
2366
2374
  picocolors: "^1.1.1",
2367
2375
  picomatch: "^4.0.7",
2368
2376
  "posthog-node": "^5.52.4",
@@ -2370,18 +2378,18 @@ var init_package = __esm(() => {
2370
2378
  typescript: "^7.0.2"
2371
2379
  },
2372
2380
  optionalDependencies: {
2373
- "oh-my-opencode-darwin-arm64": "5.1.44",
2374
- "oh-my-opencode-darwin-x64": "5.1.44",
2375
- "oh-my-opencode-darwin-x64-baseline": "5.1.44",
2376
- "oh-my-opencode-linux-arm64": "5.1.44",
2377
- "oh-my-opencode-linux-arm64-musl": "5.1.44",
2378
- "oh-my-opencode-linux-x64": "5.1.44",
2379
- "oh-my-opencode-linux-x64-baseline": "5.1.44",
2380
- "oh-my-opencode-linux-x64-musl": "5.1.44",
2381
- "oh-my-opencode-linux-x64-musl-baseline": "5.1.44",
2382
- "oh-my-opencode-windows-arm64": "5.1.44",
2383
- "oh-my-opencode-windows-x64": "5.1.44",
2384
- "oh-my-opencode-windows-x64-baseline": "5.1.44"
2381
+ "oh-my-opencode-darwin-arm64": "5.1.46",
2382
+ "oh-my-opencode-darwin-x64": "5.1.46",
2383
+ "oh-my-opencode-darwin-x64-baseline": "5.1.46",
2384
+ "oh-my-opencode-linux-arm64": "5.1.46",
2385
+ "oh-my-opencode-linux-arm64-musl": "5.1.46",
2386
+ "oh-my-opencode-linux-x64": "5.1.46",
2387
+ "oh-my-opencode-linux-x64-baseline": "5.1.46",
2388
+ "oh-my-opencode-linux-x64-musl": "5.1.46",
2389
+ "oh-my-opencode-linux-x64-musl-baseline": "5.1.46",
2390
+ "oh-my-opencode-windows-arm64": "5.1.46",
2391
+ "oh-my-opencode-windows-x64": "5.1.46",
2392
+ "oh-my-opencode-windows-x64-baseline": "5.1.46"
2385
2393
  },
2386
2394
  overrides: {
2387
2395
  hono: "^4.13.8",
@@ -7543,6 +7551,20 @@ var init_logger = __esm(() => {
7543
7551
  DEFAULT_MAX_LOG_FILE_SIZE_BYTES = 50 * 1024 * 1024;
7544
7552
  });
7545
7553
 
7554
+ // packages/utils/src/logging/product-identity.ts
7555
+ function createProductIdentity(input) {
7556
+ return {
7557
+ pluginName: input.pluginName,
7558
+ legacyPluginName: input.legacyPluginName,
7559
+ publishedPackageName: input.publishedPackageName,
7560
+ acceptedPackageNames: input.acceptedPackageNames ?? [input.publishedPackageName, input.pluginName],
7561
+ configBasename: input.configBasename,
7562
+ legacyConfigBasename: input.legacyConfigBasename,
7563
+ logFileName: input.logFileName,
7564
+ cacheDirName: input.cacheDirName
7565
+ };
7566
+ }
7567
+
7546
7568
  // packages/utils/src/logging/index.ts
7547
7569
  var init_logging = __esm(() => {
7548
7570
  init_logger();
@@ -7963,8 +7985,17 @@ function classifyPathEnvironment(absolutePath) {
7963
7985
  }
7964
7986
  var init_classify_path_environment = () => {};
7965
7987
 
7988
+ // packages/utils/src/command-executor/home-directory.ts
7989
+ import { homedir as homedir3 } from "os";
7990
+ function getHomeDirectory() {
7991
+ return process.env.HOME || process.env.USERPROFILE || homedir3();
7992
+ }
7993
+ var init_home_directory = () => {};
7994
+
7966
7995
  // packages/utils/src/command-executor.ts
7967
- var init_command_executor = () => {};
7996
+ var init_command_executor = __esm(() => {
7997
+ init_home_directory();
7998
+ });
7968
7999
 
7969
8000
  // packages/utils/src/git-worktree/index.ts
7970
8001
  var init_git_worktree = () => {};
@@ -8007,6 +8038,25 @@ var init_internal_initiator_marker = __esm(() => {
8007
8038
  INTERNAL_NOREPLY_MARKER_DETECT_PATTERN = /<!--\s*OMO_INTERNAL_NOREPLY\s*-->/;
8008
8039
  });
8009
8040
 
8041
+ // packages/model-core/src/latest-models.ts
8042
+ var LATEST_MODEL_BY_FAMILY;
8043
+ var init_latest_models = __esm(() => {
8044
+ LATEST_MODEL_BY_FAMILY = {
8045
+ claudeOpus: "claude-opus-5-5",
8046
+ claudeSonnet: "claude-sonnet-5-5",
8047
+ claudeHaiku: "claude-haiku-5-5",
8048
+ claudeFable: "claude-fable-5-1",
8049
+ gptAstra: "gpt-6-astra",
8050
+ gptSol: "gpt-6.1-sol",
8051
+ gptSolFast: "gpt-6.1-sol-fast",
8052
+ gptLunaFast: "gpt-6-luna-fast",
8053
+ glm: "glm-5.3",
8054
+ glmFlash: "glm-5.3-flash",
8055
+ kimi: "kimi-k3",
8056
+ geminiPro: "gemini-4-argon"
8057
+ };
8058
+ });
8059
+
8010
8060
  // packages/utils/src/migration/agent-category.ts
8011
8061
  function configureMigrationCategoryDefaults(defaults) {
8012
8062
  categoryDefaults = defaults ?? {};
@@ -9263,17 +9313,18 @@ var init_file_reference_resolver = __esm(() => {
9263
9313
  // packages/model-core/src/agent-model-requirements.ts
9264
9314
  var AGENT_MODEL_REQUIREMENTS;
9265
9315
  var init_agent_model_requirements = __esm(() => {
9316
+ init_latest_models();
9266
9317
  AGENT_MODEL_REQUIREMENTS = {
9267
9318
  sisyphus: {
9268
9319
  fallbackChain: [
9269
9320
  {
9270
9321
  providers: ["anthropic", "github-copilot", "opencode"],
9271
- model: "claude-opus-5-5",
9322
+ model: LATEST_MODEL_BY_FAMILY.claudeOpus,
9272
9323
  variant: "max"
9273
9324
  },
9274
9325
  {
9275
9326
  providers: ["opencode-go", "kimi-for-coding", "moonshotai", "opencode", "bailian-coding-plan", "moonshotai-cn", "firmware", "ollama-cloud", "aihubmix"],
9276
- model: "kimi-k3"
9327
+ model: LATEST_MODEL_BY_FAMILY.kimi
9277
9328
  },
9278
9329
  {
9279
9330
  providers: ["openai", "chatgpt-subscription", "github-copilot", "opencode"],
@@ -9307,7 +9358,7 @@ var init_agent_model_requirements = __esm(() => {
9307
9358
  { providers: ["github-copilot"], model: "gpt-5.6-sol", variant: "high" },
9308
9359
  {
9309
9360
  providers: ["google", "google-vertex", "opencode"],
9310
- model: "gemini-4-argon",
9361
+ model: LATEST_MODEL_BY_FAMILY.geminiPro,
9311
9362
  variant: "high"
9312
9363
  },
9313
9364
  {
@@ -9317,7 +9368,7 @@ var init_agent_model_requirements = __esm(() => {
9317
9368
  },
9318
9369
  {
9319
9370
  providers: ["anthropic", "github-copilot", "opencode"],
9320
- model: "claude-opus-5-5",
9371
+ model: LATEST_MODEL_BY_FAMILY.claudeOpus,
9321
9372
  variant: "max"
9322
9373
  },
9323
9374
  { providers: ["opencode-go"], model: "glm-5.2" }
@@ -9326,8 +9377,8 @@ var init_agent_model_requirements = __esm(() => {
9326
9377
  librarian: {
9327
9378
  fallbackChain: [
9328
9379
  { providers: ["kimi-for-coding"], model: "kimi-for-coding-highspeed", variant: "off" },
9329
- { providers: ["openai", "chatgpt-subscription"], model: "gpt-6-luna-fast", variant: "low" },
9330
- { providers: ["anthropic", "github-copilot"], model: "claude-haiku-5-5", variant: "medium" },
9380
+ { providers: ["openai", "chatgpt-subscription"], model: LATEST_MODEL_BY_FAMILY.gptLunaFast, variant: "low" },
9381
+ { providers: ["anthropic", "github-copilot"], model: LATEST_MODEL_BY_FAMILY.claudeHaiku, variant: "medium" },
9331
9382
  { providers: ["deepseek"], model: "deepseek-flash", variant: "max" },
9332
9383
  { providers: ["opencode-go", "bailian-coding-plan"], model: "qwen3.7-plus" },
9333
9384
  { providers: ["opencode-go"], model: "minimax-m2.7" }
@@ -9336,8 +9387,8 @@ var init_agent_model_requirements = __esm(() => {
9336
9387
  explore: {
9337
9388
  fallbackChain: [
9338
9389
  { providers: ["kimi-for-coding"], model: "kimi-for-coding-highspeed", variant: "off" },
9339
- { providers: ["openai", "chatgpt-subscription"], model: "gpt-6-luna-fast", variant: "low" },
9340
- { providers: ["anthropic", "github-copilot"], model: "claude-haiku-5-5", variant: "medium" },
9390
+ { providers: ["openai", "chatgpt-subscription"], model: LATEST_MODEL_BY_FAMILY.gptLunaFast, variant: "low" },
9391
+ { providers: ["anthropic", "github-copilot"], model: LATEST_MODEL_BY_FAMILY.claudeHaiku, variant: "medium" },
9341
9392
  { providers: ["deepseek"], model: "deepseek-flash", variant: "max" },
9342
9393
  { providers: ["opencode-go", "bailian-coding-plan"], model: "qwen3.7-plus" },
9343
9394
  { providers: ["opencode-go"], model: "minimax-m2.7" }
@@ -9346,7 +9397,7 @@ var init_agent_model_requirements = __esm(() => {
9346
9397
  "multimodal-looker": {
9347
9398
  fallbackChain: [
9348
9399
  { providers: ["openai", "chatgpt-subscription", "opencode"], model: "gpt-5.6-sol", variant: "low" },
9349
- { providers: ["opencode-go"], model: "kimi-k3" },
9400
+ { providers: ["opencode-go"], model: LATEST_MODEL_BY_FAMILY.kimi },
9350
9401
  { providers: ["zai-coding-plan"], model: "glm-4.6v" },
9351
9402
  { providers: ["openai", "chatgpt-subscription", "github-copilot", "opencode"], model: "gpt-5-nano" }
9352
9403
  ]
@@ -9355,17 +9406,17 @@ var init_agent_model_requirements = __esm(() => {
9355
9406
  fallbackChain: [
9356
9407
  {
9357
9408
  providers: ["anthropic", "github-copilot", "opencode"],
9358
- model: "claude-fable-5-1",
9409
+ model: LATEST_MODEL_BY_FAMILY.claudeFable,
9359
9410
  variant: "xhigh"
9360
9411
  },
9361
9412
  {
9362
9413
  providers: ["anthropic", "github-copilot", "opencode"],
9363
- model: "claude-opus-5-5",
9414
+ model: LATEST_MODEL_BY_FAMILY.claudeOpus,
9364
9415
  variant: "max"
9365
9416
  },
9366
9417
  {
9367
9418
  providers: ["opencode-go", "kimi-for-coding", "moonshotai", "opencode"],
9368
- model: "kimi-k3",
9419
+ model: LATEST_MODEL_BY_FAMILY.kimi,
9369
9420
  variant: "max"
9370
9421
  }
9371
9422
  ]
@@ -9374,34 +9425,34 @@ var init_agent_model_requirements = __esm(() => {
9374
9425
  fallbackChain: [
9375
9426
  {
9376
9427
  providers: ["anthropic", "github-copilot", "opencode"],
9377
- model: "claude-fable-5-1",
9428
+ model: LATEST_MODEL_BY_FAMILY.claudeFable,
9378
9429
  variant: "max"
9379
9430
  },
9380
9431
  {
9381
9432
  providers: ["anthropic", "github-copilot", "opencode"],
9382
- model: "claude-opus-5-5",
9433
+ model: LATEST_MODEL_BY_FAMILY.claudeOpus,
9383
9434
  variant: "max"
9384
9435
  },
9385
9436
  {
9386
9437
  providers: ["opencode-go", "kimi-for-coding", "moonshotai", "opencode"],
9387
- model: "kimi-k3",
9438
+ model: LATEST_MODEL_BY_FAMILY.kimi,
9388
9439
  variant: "max"
9389
9440
  }
9390
9441
  ]
9391
9442
  },
9392
9443
  momus: {
9393
9444
  fallbackChain: [
9394
- { providers: ["openai", "chatgpt-subscription"], model: "gpt-6-astra", variant: "xhigh" },
9395
- { providers: ["github-copilot"], model: "gpt-6-astra", variant: "high" },
9396
- { providers: ["openai", "chatgpt-subscription", "opencode"], model: "gpt-6-astra", variant: "high" },
9445
+ { providers: ["openai", "chatgpt-subscription"], model: LATEST_MODEL_BY_FAMILY.gptAstra, variant: "xhigh" },
9446
+ { providers: ["github-copilot"], model: LATEST_MODEL_BY_FAMILY.gptAstra, variant: "high" },
9447
+ { providers: ["openai", "chatgpt-subscription", "opencode"], model: LATEST_MODEL_BY_FAMILY.gptAstra, variant: "high" },
9397
9448
  {
9398
9449
  providers: ["anthropic", "github-copilot", "opencode"],
9399
- model: "claude-opus-5-5",
9450
+ model: LATEST_MODEL_BY_FAMILY.claudeOpus,
9400
9451
  variant: "max"
9401
9452
  },
9402
9453
  {
9403
9454
  providers: ["google", "google-vertex", "opencode"],
9404
- model: "gemini-4-argon",
9455
+ model: LATEST_MODEL_BY_FAMILY.geminiPro,
9405
9456
  variant: "high"
9406
9457
  },
9407
9458
  {
@@ -9415,7 +9466,7 @@ var init_agent_model_requirements = __esm(() => {
9415
9466
  atlas: {
9416
9467
  fallbackChain: [
9417
9468
  { providers: ["anthropic", "github-copilot", "opencode"], model: "claude-sonnet-5" },
9418
- { providers: ["opencode-go"], model: "kimi-k3" },
9469
+ { providers: ["opencode-go"], model: LATEST_MODEL_BY_FAMILY.kimi },
9419
9470
  {
9420
9471
  providers: ["openai", "chatgpt-subscription", "github-copilot", "opencode"],
9421
9472
  model: "gpt-5.6-sol",
@@ -9429,7 +9480,7 @@ var init_agent_model_requirements = __esm(() => {
9429
9480
  "sisyphus-junior": {
9430
9481
  fallbackChain: [
9431
9482
  { providers: ["anthropic", "github-copilot", "opencode"], model: "claude-sonnet-5" },
9432
- { providers: ["opencode-go"], model: "kimi-k3" },
9483
+ { providers: ["opencode-go"], model: LATEST_MODEL_BY_FAMILY.kimi },
9433
9484
  {
9434
9485
  providers: ["openai", "chatgpt-subscription", "github-copilot", "opencode"],
9435
9486
  model: "gpt-5.6-sol",
@@ -9447,32 +9498,33 @@ var init_agent_model_requirements = __esm(() => {
9447
9498
  // packages/model-core/src/category-model-requirements.ts
9448
9499
  var CATEGORY_MODEL_REQUIREMENTS;
9449
9500
  var init_category_model_requirements = __esm(() => {
9501
+ init_latest_models();
9450
9502
  CATEGORY_MODEL_REQUIREMENTS = {
9451
9503
  "visual-engineering": {
9452
9504
  fallbackChain: [
9453
- { providers: ["google", "google-vertex", "opencode"], model: "gemini-4-argon", variant: "low" },
9505
+ { providers: ["google", "google-vertex", "opencode"], model: LATEST_MODEL_BY_FAMILY.geminiPro, variant: "low" },
9454
9506
  {
9455
9507
  providers: ["anthropic", "anthropic-api", "github-copilot", "opencode"],
9456
- model: "claude-fable-5-1",
9508
+ model: LATEST_MODEL_BY_FAMILY.claudeFable,
9457
9509
  variant: "max"
9458
9510
  },
9459
9511
  {
9460
9512
  providers: ["anthropic", "anthropic-api", "github-copilot", "opencode"],
9461
- model: "claude-opus-5-5",
9513
+ model: LATEST_MODEL_BY_FAMILY.claudeOpus,
9462
9514
  variant: "max"
9463
9515
  },
9464
9516
  {
9465
9517
  providers: ["kimi-for-coding", "moonshotai", "opencode-go", "opencode"],
9466
- model: "kimi-k3",
9518
+ model: LATEST_MODEL_BY_FAMILY.kimi,
9467
9519
  variant: "max"
9468
9520
  }
9469
9521
  ]
9470
9522
  },
9471
9523
  ultrabrain: {
9472
9524
  fallbackChain: [
9473
- { providers: ["openai", "chatgpt-subscription"], model: "gpt-6-astra", variant: "max" },
9474
- { providers: ["github-copilot"], model: "gpt-6-astra", variant: "max" },
9475
- { providers: ["openai", "chatgpt-subscription", "opencode"], model: "gpt-6-astra", variant: "max" },
9525
+ { providers: ["openai", "chatgpt-subscription"], model: LATEST_MODEL_BY_FAMILY.gptAstra, variant: "max" },
9526
+ { providers: ["github-copilot"], model: LATEST_MODEL_BY_FAMILY.gptAstra, variant: "max" },
9527
+ { providers: ["openai", "chatgpt-subscription", "opencode"], model: LATEST_MODEL_BY_FAMILY.gptAstra, variant: "max" },
9476
9528
  { providers: ["openai", "chatgpt-subscription"], model: "gpt-5.6-sol", variant: "max" },
9477
9529
  { providers: ["github-copilot"], model: "gpt-5.6-sol", variant: "max" },
9478
9530
  { providers: ["openai", "chatgpt-subscription", "opencode"], model: "gpt-5.6-sol", variant: "max" }
@@ -9480,8 +9532,8 @@ var init_category_model_requirements = __esm(() => {
9480
9532
  },
9481
9533
  "deep-low": {
9482
9534
  fallbackChain: [
9483
- { providers: ["openai", "chatgpt-subscription"], model: "gpt-6.1-sol", variant: "medium" },
9484
- { providers: ["openai", "chatgpt-subscription"], model: "gpt-6.1-sol-fast", variant: "medium" },
9535
+ { providers: ["openai", "chatgpt-subscription"], model: LATEST_MODEL_BY_FAMILY.gptSol, variant: "medium" },
9536
+ { providers: ["openai", "chatgpt-subscription"], model: LATEST_MODEL_BY_FAMILY.gptSolFast, variant: "medium" },
9485
9537
  {
9486
9538
  providers: ["openai", "chatgpt-subscription", "github-copilot", "opencode"],
9487
9539
  model: "gpt-5.6-sol",
@@ -9494,7 +9546,7 @@ var init_category_model_requirements = __esm(() => {
9494
9546
  fallbackChain: [
9495
9547
  {
9496
9548
  providers: ["openai", "chatgpt-subscription", "github-copilot", "opencode"],
9497
- model: "gpt-6-astra",
9549
+ model: LATEST_MODEL_BY_FAMILY.gptAstra,
9498
9550
  variant: "high"
9499
9551
  }
9500
9552
  ]
@@ -9503,27 +9555,27 @@ var init_category_model_requirements = __esm(() => {
9503
9555
  fallbackChain: [
9504
9556
  {
9505
9557
  providers: ["anthropic", "anthropic-api", "github-copilot", "opencode"],
9506
- model: "claude-fable-5-1",
9558
+ model: LATEST_MODEL_BY_FAMILY.claudeFable,
9507
9559
  variant: "max"
9508
9560
  },
9509
9561
  {
9510
9562
  providers: ["anthropic", "anthropic-api", "github-copilot", "opencode"],
9511
- model: "claude-opus-5-5",
9563
+ model: LATEST_MODEL_BY_FAMILY.claudeOpus,
9512
9564
  variant: "max"
9513
9565
  },
9514
9566
  {
9515
9567
  providers: ["kimi-for-coding", "moonshotai", "opencode-go", "opencode"],
9516
- model: "kimi-k3",
9568
+ model: LATEST_MODEL_BY_FAMILY.kimi,
9517
9569
  variant: "max"
9518
9570
  }
9519
9571
  ]
9520
9572
  },
9521
9573
  quick: {
9522
9574
  fallbackChain: [
9523
- { providers: ["openai", "chatgpt-subscription"], model: "gpt-6-luna-fast", variant: "low" },
9575
+ { providers: ["openai", "chatgpt-subscription"], model: LATEST_MODEL_BY_FAMILY.gptLunaFast, variant: "low" },
9524
9576
  {
9525
9577
  providers: ["anthropic", "anthropic-api", "github-copilot"],
9526
- model: "claude-haiku-5-5",
9578
+ model: LATEST_MODEL_BY_FAMILY.claudeHaiku,
9527
9579
  variant: "medium"
9528
9580
  },
9529
9581
  { providers: ["deepseek"], model: "deepseek-flash", variant: "off" },
@@ -9535,7 +9587,7 @@ var init_category_model_requirements = __esm(() => {
9535
9587
  { providers: ["opencode-go"], model: "minimax-m3", variant: "max" },
9536
9588
  { providers: ["opencode-go"], model: "minimax-m2.7", variant: "max" },
9537
9589
  { providers: ["xai"], model: "grok-4.20-0309-non-reasoning" },
9538
- { providers: ["zai-coding-plan"], model: "glm-5.3-flash", variant: "low" },
9590
+ { providers: ["zai-coding-plan"], model: LATEST_MODEL_BY_FAMILY.glmFlash, variant: "low" },
9539
9591
  { providers: ["xiaomi"], model: "mimo-v2.6-flash", variant: "low" }
9540
9592
  ]
9541
9593
  },
@@ -9543,13 +9595,13 @@ var init_category_model_requirements = __esm(() => {
9543
9595
  fallbackChain: [
9544
9596
  {
9545
9597
  providers: ["anthropic", "anthropic-api", "github-copilot", "opencode"],
9546
- model: "claude-sonnet-5-5",
9598
+ model: LATEST_MODEL_BY_FAMILY.claudeSonnet,
9547
9599
  variant: "medium"
9548
9600
  },
9549
9601
  { providers: ["xiaomi", "opencode-go"], model: "mimo-v2.6-pro", variant: "max" },
9550
9602
  { providers: ["xai", "github-copilot", "opencode-go"], model: "grok-4.7", variant: "xhigh" },
9551
- { providers: ["zai-coding-plan", "opencode-go"], model: "glm-5.3", variant: "high" },
9552
- { providers: ["openai", "chatgpt-subscription"], model: "gpt-6.1-sol", variant: "medium" },
9603
+ { providers: ["zai-coding-plan", "opencode-go"], model: LATEST_MODEL_BY_FAMILY.glm, variant: "high" },
9604
+ { providers: ["openai", "chatgpt-subscription"], model: LATEST_MODEL_BY_FAMILY.gptSol, variant: "medium" },
9553
9605
  {
9554
9606
  providers: ["openai", "chatgpt-subscription", "github-copilot", "opencode"],
9555
9607
  model: "gpt-5.6-sol",
@@ -9573,13 +9625,13 @@ var init_category_model_requirements = __esm(() => {
9573
9625
  fallbackChain: [
9574
9626
  {
9575
9627
  providers: ["anthropic", "anthropic-api", "github-copilot", "opencode"],
9576
- model: "claude-opus-5-5",
9628
+ model: LATEST_MODEL_BY_FAMILY.claudeOpus,
9577
9629
  variant: "medium"
9578
9630
  },
9579
- { providers: ["zai-coding-plan", "opencode-go"], model: "glm-5.3", variant: "max" },
9631
+ { providers: ["zai-coding-plan", "opencode-go"], model: LATEST_MODEL_BY_FAMILY.glm, variant: "max" },
9580
9632
  {
9581
9633
  providers: ["kimi-for-coding", "moonshotai", "opencode-go", "opencode"],
9582
- model: "kimi-k3",
9634
+ model: LATEST_MODEL_BY_FAMILY.kimi,
9583
9635
  variant: "max"
9584
9636
  }
9585
9637
  ]
@@ -9587,10 +9639,10 @@ var init_category_model_requirements = __esm(() => {
9587
9639
  writing: {
9588
9640
  requiresAnyModel: true,
9589
9641
  fallbackChain: [
9590
- { providers: ["google", "google-vertex", "opencode"], model: "gemini-4-argon", variant: "low" },
9642
+ { providers: ["google", "google-vertex", "opencode"], model: LATEST_MODEL_BY_FAMILY.geminiPro, variant: "low" },
9591
9643
  {
9592
9644
  providers: ["anthropic", "anthropic-api", "github-copilot", "opencode"],
9593
- model: "claude-opus-5-5",
9645
+ model: LATEST_MODEL_BY_FAMILY.claudeOpus,
9594
9646
  variant: "low"
9595
9647
  },
9596
9648
  {
@@ -11082,6 +11134,7 @@ var init_src2 = __esm(() => {
11082
11134
  init_model_resolver();
11083
11135
  init_provider_model_id_transform();
11084
11136
  init_model_requirements();
11137
+ init_latest_models();
11085
11138
  init_model_family_detectors();
11086
11139
  init_model_capability_aliases();
11087
11140
  init_model_capability_heuristics();
@@ -11403,16 +11456,17 @@ Approach:
11403
11456
  - This is for tasks requiring exceptional creativity
11404
11457
  </Category_Context>`, GOOGLE_CATEGORIES;
11405
11458
  var init_google_categories = __esm(() => {
11459
+ init_latest_models();
11406
11460
  GOOGLE_CATEGORIES = [
11407
11461
  {
11408
11462
  name: "visual-engineering",
11409
- config: { model: "google/gemini-4-argon", variant: "low" },
11463
+ config: { model: `google/${LATEST_MODEL_BY_FAMILY.geminiPro}`, variant: "low" },
11410
11464
  description: "Visual design, UI/UX, frontend, styling, animation, and design systems",
11411
11465
  promptAppend: VISUAL_CATEGORY_PROMPT_APPEND
11412
11466
  },
11413
11467
  {
11414
11468
  name: "artistry",
11415
- config: { model: "anthropic/claude-fable-5-1", variant: "max" },
11469
+ config: { model: `anthropic/${LATEST_MODEL_BY_FAMILY.claudeFable}`, variant: "max" },
11416
11470
  description: "Complex problem-solving with unconventional, creative approaches - beyond standard patterns",
11417
11471
  promptAppend: ARTISTRY_CATEGORY_PROMPT_APPEND
11418
11472
  }
@@ -11446,10 +11500,11 @@ ANTI-AI-SLOP RULES (NON-NEGOTIABLE):
11446
11500
  - Write like a human, not a corporate template.
11447
11501
  </Category_Context>`, KIMI_CATEGORIES;
11448
11502
  var init_kimi_categories = __esm(() => {
11503
+ init_latest_models();
11449
11504
  KIMI_CATEGORIES = [
11450
11505
  {
11451
11506
  name: "writing",
11452
- config: { model: "google/gemini-4-argon", variant: "low" },
11507
+ config: { model: `google/${LATEST_MODEL_BY_FAMILY.geminiPro}`, variant: "low" },
11453
11508
  description: "Documentation, prose, technical writing",
11454
11509
  promptAppend: WRITING_CATEGORY_PROMPT_APPEND
11455
11510
  }
@@ -11584,21 +11639,23 @@ You are working on tasks that don't fit specific categories but require moderate
11584
11639
  </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>
11585
11640
  <Caller_Warning>Provide explicit must-do steps, forbidden scope, and concrete success criteria.</Caller_Warning>`, UNSPECIFIED_HIGH_CATEGORY_PROMPT_APPEND = `<Category_Context>
11586
11641
  You are working on tasks that don't fit specific categories but require substantial effort.
11587
- </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;
11642
+ </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;
11588
11643
  var init_openai_categories = __esm(() => {
11589
11644
  init_types();
11590
- DEEP_LOW_GATE_MODELS = ["gpt-6.1-sol", "gpt-6.1-sol-fast", "gpt-5.6-sol-fast", "gpt-5.6-sol"];
11645
+ init_latest_models();
11646
+ DEEP_LOW_GATE_MODELS = [LATEST_MODEL_BY_FAMILY.gptSol, LATEST_MODEL_BY_FAMILY.gptSolFast, "gpt-5.6-sol-fast", "gpt-5.6-sol"];
11647
+ DEEP_HIGH_GATE_MODEL = LATEST_MODEL_BY_FAMILY.gptAstra;
11591
11648
  OPENAI_CATEGORIES = [
11592
11649
  {
11593
11650
  name: "ultrabrain",
11594
- config: { model: "openai/gpt-6-astra", variant: "max" },
11651
+ config: { model: `openai/${LATEST_MODEL_BY_FAMILY.gptAstra}`, variant: "max" },
11595
11652
  description: "Use ONLY for genuinely hard, logic-heavy tasks. Give clear goals only, not step-by-step instructions.",
11596
11653
  promptAppend: ULTRABRAIN_CATEGORY_PROMPT_APPEND,
11597
11654
  resolvePromptAppend: resolveUltrabrainCategoryPromptAppend
11598
11655
  },
11599
11656
  {
11600
11657
  name: "deep-low",
11601
- config: { model: "openai/gpt-6.1-sol", variant: "medium" },
11658
+ config: { model: `openai/${LATEST_MODEL_BY_FAMILY.gptSol}`, variant: "medium" },
11602
11659
  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.",
11603
11660
  callerGuidance: DEEP_LOW_CATEGORY_CALLER_GUIDANCE,
11604
11661
  promptAppend: DEEP_LOW_CATEGORY_PROMPT_APPEND,
@@ -11607,7 +11664,7 @@ var init_openai_categories = __esm(() => {
11607
11664
  },
11608
11665
  {
11609
11666
  name: "deep-high",
11610
- config: { model: "openai/gpt-6-astra", variant: "high" },
11667
+ config: { model: `openai/${LATEST_MODEL_BY_FAMILY.gptAstra}`, variant: "high" },
11611
11668
  description: "Escalation deep lane: a goal whose central decision cannot be settled from evidence alone. Same one-goal, one-deliverable contract as deep-low.",
11612
11669
  callerGuidance: DEEP_HIGH_CATEGORY_CALLER_GUIDANCE,
11613
11670
  promptAppend: DEEP_HIGH_CATEGORY_PROMPT_APPEND,
@@ -11616,21 +11673,21 @@ var init_openai_categories = __esm(() => {
11616
11673
  },
11617
11674
  {
11618
11675
  name: "quick",
11619
- config: { model: "openai/gpt-6-luna-fast", variant: "low" },
11676
+ config: { model: `openai/${LATEST_MODEL_BY_FAMILY.gptLunaFast}`, variant: "low" },
11620
11677
  description: "Trivial tasks - single file changes, typo fixes, simple modifications",
11621
11678
  callerGuidance: QUICK_CATEGORY_CALLER_GUIDANCE,
11622
11679
  promptAppend: QUICK_CATEGORY_PROMPT_APPEND
11623
11680
  },
11624
11681
  {
11625
11682
  name: "unspecified-low",
11626
- config: { model: "anthropic/claude-sonnet-5-5", variant: "medium" },
11683
+ config: { model: `anthropic/${LATEST_MODEL_BY_FAMILY.claudeSonnet}`, variant: "medium" },
11627
11684
  description: "Tasks that don't fit other categories, low effort required",
11628
11685
  callerGuidance: UNSPECIFIED_LOW_CATEGORY_CALLER_GUIDANCE,
11629
11686
  promptAppend: UNSPECIFIED_LOW_CATEGORY_PROMPT_APPEND
11630
11687
  },
11631
11688
  {
11632
11689
  name: "unspecified-high",
11633
- config: { model: "anthropic/claude-opus-5-5", variant: "medium" },
11690
+ config: { model: `anthropic/${LATEST_MODEL_BY_FAMILY.claudeOpus}`, variant: "medium" },
11634
11691
  description: "Tasks that don't fit other categories, high effort required",
11635
11692
  callerGuidance: UNSPECIFIED_HIGH_CATEGORY_CALLER_GUIDANCE,
11636
11693
  promptAppend: UNSPECIFIED_HIGH_CATEGORY_PROMPT_APPEND,
@@ -11679,7 +11736,7 @@ var init_migration2 = __esm(() => {
11679
11736
 
11680
11737
  // packages/omo-opencode/src/shared/opencode-config-dir.ts
11681
11738
  import { existsSync as existsSync5, realpathSync as realpathSync2 } from "fs";
11682
- import { homedir as homedir4 } from "os";
11739
+ import { homedir as homedir5 } from "os";
11683
11740
  import { join as join6, posix, resolve, win32 } from "path";
11684
11741
  function isDevBuild(version) {
11685
11742
  if (!version)
@@ -11690,14 +11747,14 @@ function getTauriConfigDir(identifier) {
11690
11747
  const platform = process.platform;
11691
11748
  switch (platform) {
11692
11749
  case "darwin":
11693
- return join6(homedir4(), "Library", "Application Support", identifier);
11750
+ return join6(homedir5(), "Library", "Application Support", identifier);
11694
11751
  case "win32": {
11695
- const appData = process.env.APPDATA || join6(homedir4(), "AppData", "Roaming");
11752
+ const appData = process.env.APPDATA || join6(homedir5(), "AppData", "Roaming");
11696
11753
  return win32.join(appData, identifier);
11697
11754
  }
11698
11755
  case "linux":
11699
11756
  default: {
11700
- const xdgConfig = process.env.XDG_CONFIG_HOME || join6(homedir4(), ".config");
11757
+ const xdgConfig = process.env.XDG_CONFIG_HOME || join6(homedir5(), ".config");
11701
11758
  return join6(xdgConfig, identifier);
11702
11759
  }
11703
11760
  }
@@ -11741,7 +11798,7 @@ function getWslLinuxHomeDir(windowsConfigRoot) {
11741
11798
  function getCliDefaultConfigDir() {
11742
11799
  const envXdgConfig = process.env.XDG_CONFIG_HOME?.trim();
11743
11800
  const shouldIgnoreWindowsXdg = envXdgConfig !== undefined && envXdgConfig.length > 0 && isWslEnvironment() && isWindowsUserConfigRoot(envXdgConfig);
11744
- const xdgConfig = shouldIgnoreWindowsXdg ? posix.join(getWslLinuxHomeDir(envXdgConfig) ?? "/home", ".config") : envXdgConfig || join6(homedir4(), ".config");
11801
+ const xdgConfig = shouldIgnoreWindowsXdg ? posix.join(getWslLinuxHomeDir(envXdgConfig) ?? "/home", ".config") : envXdgConfig || join6(homedir5(), ".config");
11745
11802
  const configDir = isWslEnvironment() ? posix.join(xdgConfig, "opencode") : join6(xdgConfig, "opencode");
11746
11803
  return resolveConfigPath(configDir);
11747
11804
  }
@@ -70388,10 +70445,11 @@ var ANTHROPIC_PREFIX = "anthropic/", CLAUDE_CODE_ALIAS_MAP;
70388
70445
  var init_claude_model_mapper = __esm(() => {
70389
70446
  init_model_format_normalizer();
70390
70447
  init_model_normalization2();
70448
+ init_latest_models();
70391
70449
  CLAUDE_CODE_ALIAS_MAP = new Map([
70392
- ["sonnet", `${ANTHROPIC_PREFIX}claude-sonnet-4-6`],
70393
- ["opus", `${ANTHROPIC_PREFIX}claude-opus-5-5`],
70394
- ["haiku", `${ANTHROPIC_PREFIX}claude-haiku-5-5`]
70450
+ ["sonnet", `${ANTHROPIC_PREFIX}${LATEST_MODEL_BY_FAMILY.claudeSonnet}`],
70451
+ ["opus", `${ANTHROPIC_PREFIX}${LATEST_MODEL_BY_FAMILY.claudeOpus}`],
70452
+ ["haiku", `${ANTHROPIC_PREFIX}${LATEST_MODEL_BY_FAMILY.claudeHaiku}`]
70395
70453
  ]);
70396
70454
  });
70397
70455
 
@@ -76796,7 +76854,7 @@ var init_git_master = __esm(() => {
76796
76854
  OmoGitMasterSettingsLayerSchema = object(OmoGitMasterSettingsShape).partial().strict();
76797
76855
  OmoGitMasterSettingsSchema = OmoGitMasterSettingsLayerSchema.extend({
76798
76856
  commit_footer: union([boolean2(), string2()]).default(false),
76799
- include_co_authored_by: boolean2().default(false),
76857
+ include_co_authored_by: boolean2().default(true),
76800
76858
  git_env_prefix: GitEnvPrefixSchema.default("GIT_MASTER=1")
76801
76859
  }).strict();
76802
76860
  });
@@ -76830,7 +76888,7 @@ var init_memory_agreements = __esm(() => {
76830
76888
  });
76831
76889
 
76832
76890
  // packages/omo-config-core/src/schema/memory.ts
76833
- 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;
76891
+ 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;
76834
76892
  var init_memory = __esm(() => {
76835
76893
  init_zod();
76836
76894
  init_memory_agreements();
@@ -76845,6 +76903,7 @@ var init_memory = __esm(() => {
76845
76903
  merge: _enum(["auto", "integration"]).default("auto"),
76846
76904
  category: string2().min(1).default("quick"),
76847
76905
  timeout_minutes: number2().int().positive().default(15),
76906
+ max_concurrent_runs: number2().int().positive().default(1),
76848
76907
  sandbox: _enum(["auto", "required", "off"]).default("auto")
76849
76908
  }).strict();
76850
76909
  OmoMemorySyncSchema = object({
@@ -76870,6 +76929,14 @@ var init_memory = __esm(() => {
76870
76929
  tool_budget: number2().int().positive().default(8),
76871
76930
  query_expansion: boolean2().default(false)
76872
76931
  }).strict();
76932
+ OmoMemoryProjectScopeSchema = object({
76933
+ nudge: boolean2().default(true),
76934
+ recall: boolean2().default(true)
76935
+ }).strict();
76936
+ OmoMemoryProjectScopeLayerSchema = object({
76937
+ nudge: boolean2().optional(),
76938
+ recall: boolean2().optional()
76939
+ }).strict();
76873
76940
  OmoMemoryNudgeSchema = object({
76874
76941
  enabled: boolean2().default(true),
76875
76942
  every_user_turns: number2().int().min(1).default(10)
@@ -76908,6 +76975,7 @@ var init_memory = __esm(() => {
76908
76975
  merge: _enum(["auto", "integration"]).optional(),
76909
76976
  category: string2().min(1).optional(),
76910
76977
  timeout_minutes: number2().int().positive().optional(),
76978
+ max_concurrent_runs: number2().int().positive().optional(),
76911
76979
  sandbox: _enum(["auto", "required", "off"]).optional()
76912
76980
  }).strict();
76913
76981
  OmoMemorySyncLayerSchema = object({
@@ -76972,7 +77040,7 @@ var init_memory = __esm(() => {
76972
77040
  OmoMemoryAgentOverridesSchema = object({
76973
77041
  enabled: boolean2().optional(),
76974
77042
  agent: string2().min(1).optional(),
76975
- reflection: OmoMemoryReflectionLayerSchema.optional(),
77043
+ reflection: OmoMemoryReflectionLayerSchema.omit({ max_concurrent_runs: true }).optional(),
76976
77044
  nudge: OmoMemoryNudgeLayerSchema.optional(),
76977
77045
  facts: OmoMemoryFactsLayerSchema.optional(),
76978
77046
  dream: OmoMemoryDreamLayerSchema.optional(),
@@ -76997,6 +77065,7 @@ var init_memory = __esm(() => {
76997
77065
  merge: "auto",
76998
77066
  category: "quick",
76999
77067
  timeout_minutes: 15,
77068
+ max_concurrent_runs: 1,
77000
77069
  sandbox: "auto"
77001
77070
  }),
77002
77071
  nudge: OmoMemoryNudgeSchema.default({ enabled: true, every_user_turns: 10 }),
@@ -77025,6 +77094,7 @@ var init_memory = __esm(() => {
77025
77094
  tool_budget: 8,
77026
77095
  query_expansion: false
77027
77096
  }),
77097
+ project_scope: OmoMemoryProjectScopeSchema.default({ nudge: true, recall: true }),
77028
77098
  projection: OmoMemoryProjectionSchema.default({ max_entries_per_directory: 40, max_bytes: 24576 }),
77029
77099
  compile_warn_tokens: number2().int().positive().default(30000),
77030
77100
  agents: record(string2(), OmoMemoryAgentOverridesSchema).default({})
@@ -77044,6 +77114,7 @@ var init_memory = __esm(() => {
77044
77114
  sync: OmoMemorySyncLayerSchema.optional(),
77045
77115
  search: OmoMemorySearchLayerSchema.optional(),
77046
77116
  recall: OmoMemoryRecallLayerSchema.optional(),
77117
+ project_scope: OmoMemoryProjectScopeLayerSchema.optional(),
77047
77118
  projection: OmoMemoryProjectionLayerSchema.optional(),
77048
77119
  compile_warn_tokens: number2().int().positive().optional(),
77049
77120
  agents: record(string2(), OmoMemoryAgentOverridesSchema).optional()
@@ -77341,7 +77412,8 @@ var OmoTelemetrySettingsShape, OmoTelemetrySettingsLayerSchema, OmoTelemetrySett
77341
77412
  var init_telemetry = __esm(() => {
77342
77413
  init_zod();
77343
77414
  OmoTelemetrySettingsShape = {
77344
- enabled: boolean2()
77415
+ enabled: boolean2(),
77416
+ rawTurnSampleRate: number2().min(0).max(1)
77345
77417
  };
77346
77418
  OmoTelemetrySettingsLayerSchema = object(OmoTelemetrySettingsShape).partial().strict();
77347
77419
  OmoTelemetrySettingsSchema = OmoTelemetrySettingsLayerSchema.extend({
@@ -77368,11 +77440,17 @@ var init_format_on_mutation = __esm(() => {
77368
77440
  }).strict();
77369
77441
  });
77370
77442
 
77371
- // packages/omo-config-core/src/schema/gateway.ts
77372
- var OmoGatewaySectionSchema;
77373
- var init_gateway = __esm(() => {
77443
+ // packages/omo-config-core/src/schema/provenance.ts
77444
+ var OmoProvenanceSettingsSchema;
77445
+ var init_provenance = __esm(() => {
77374
77446
  init_zod();
77375
- 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.");
77447
+ OmoProvenanceSettingsSchema = object({
77448
+ workspaces: array(object({
77449
+ name: string2().trim().min(1).regex(/\S/),
77450
+ git_owners: array(string2().trim().min(1).regex(/\S/)).optional(),
77451
+ paths: array(string2().trim().min(1).regex(/\S/)).optional()
77452
+ }).strict()).optional()
77453
+ }).strict();
77376
77454
  });
77377
77455
 
77378
77456
  // packages/omo-config-core/src/schema/config.ts
@@ -77391,13 +77469,13 @@ var init_config = __esm(() => {
77391
77469
  init_team();
77392
77470
  init_telemetry();
77393
77471
  init_format_on_mutation();
77394
- init_gateway();
77472
+ init_provenance();
77395
77473
  OmoOpenCodeHarnessConfigSchema = record(string2(), unknown());
77396
77474
  OmoDisabledSkillsSchema = array(string2());
77397
77475
  OmoExcludedModelsSchema = array(string2());
77398
77476
  OmoTypedHarnessConfigSchema = object({
77477
+ provenance: OmoProvenanceSettingsSchema.optional(),
77399
77478
  formatOnMutation: OmoFormatOnMutationLayerSchema.optional(),
77400
- gateway: OmoGatewaySectionSchema.optional(),
77401
77479
  categories: OmoCategoriesConfigSchema.optional(),
77402
77480
  agents: OmoAgentsConfigSchema.optional(),
77403
77481
  git_master: OmoGitMasterSettingsLayerSchema.optional(),
@@ -77414,6 +77492,7 @@ var init_config = __esm(() => {
77414
77492
  exclude_models: OmoExcludedModelsSchema.optional()
77415
77493
  }).strict();
77416
77494
  OmoConfigProfileSchema = object({
77495
+ provenance: OmoProvenanceSettingsSchema.optional(),
77417
77496
  formatOnMutation: OmoFormatOnMutationLayerSchema.optional(),
77418
77497
  categories: OmoCategoriesConfigSchema.optional(),
77419
77498
  agents: OmoAgentsConfigSchema.optional(),
@@ -77435,8 +77514,8 @@ var init_config = __esm(() => {
77435
77514
  "[codex]": OmoTypedHarnessConfigSchema.optional()
77436
77515
  }).strict();
77437
77516
  OmoConfigSchema = object({
77517
+ provenance: OmoProvenanceSettingsSchema.optional(),
77438
77518
  formatOnMutation: OmoFormatOnMutationSchema.optional(),
77439
- gateway: OmoGatewaySectionSchema.optional(),
77440
77519
  $schema: string2().optional(),
77441
77520
  categories: OmoCategoriesConfigSchema.optional(),
77442
77521
  agents: OmoAgentsConfigSchema.optional(),
@@ -77461,8 +77540,8 @@ var init_config = __esm(() => {
77461
77540
  legacy_migrations: record(string2(), unknown()).optional()
77462
77541
  }).strict();
77463
77542
  OmoConfigLayerSchema = object({
77543
+ provenance: OmoProvenanceSettingsSchema.optional(),
77464
77544
  formatOnMutation: OmoFormatOnMutationLayerSchema.optional(),
77465
- gateway: OmoGatewaySectionSchema.optional(),
77466
77545
  $schema: string2().optional(),
77467
77546
  categories: OmoCategoriesConfigSchema.optional(),
77468
77547
  agents: OmoAgentsConfigSchema.optional(),
@@ -77611,7 +77690,6 @@ var init_schema = __esm(() => {
77611
77690
  init_config();
77612
77691
  init_fallback_models();
77613
77692
  init_format_on_mutation();
77614
- init_gateway();
77615
77693
  init_git_master();
77616
77694
  init_harness();
77617
77695
  init_legacy_category_names();
@@ -77620,6 +77698,7 @@ var init_schema = __esm(() => {
77620
77698
  init_model_catalog();
77621
77699
  init_model_profile();
77622
77700
  init_model_ref();
77701
+ init_provenance();
77623
77702
  init_side_panel();
77624
77703
  init_task();
77625
77704
  init_team();
@@ -77885,6 +77964,7 @@ function pruneInvalidConfigPaths(config, issues, validate, maxPasses = MAX_PRUNE
77885
77964
  var MAX_PRUNE_PASSES = 32;
77886
77965
 
77887
77966
  // packages/omo-config-core/src/loader/layer-validation.ts
77967
+ import { createHash as createHash2 } from "crypto";
77888
77968
  function validationDiagnostic(path, issues) {
77889
77969
  const issuePaths = issues.map((issue) => issue.path.map((segment) => String(segment)).join("."));
77890
77970
  return {
@@ -77908,6 +77988,9 @@ function unrecognizedKeyIssues(issues) {
77908
77988
  function isRecord11(value) {
77909
77989
  return typeof value === "object" && value !== null && !Array.isArray(value);
77910
77990
  }
77991
+ function isRetiredSection(key) {
77992
+ return RETIRED_SECTION_DIGESTS.has(createHash2("sha256").update(key.toLowerCase()).digest("hex"));
77993
+ }
77911
77994
  function sanitizeUnsafeKeys(value, path = []) {
77912
77995
  if (Array.isArray(value)) {
77913
77996
  const issues = [];
@@ -77926,6 +78009,9 @@ function sanitizeUnsafeKeys(value, path = []) {
77926
78009
  }
77927
78010
  const sanitized = {};
77928
78011
  for (const [key, entry] of Object.entries(value)) {
78012
+ 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] ?? "");
78013
+ if (isConfigContainer && isRetiredSection(key))
78014
+ continue;
77929
78015
  if (isUnsafeObjectKey2(key)) {
77930
78016
  issues.push({ keys: [key], path });
77931
78017
  continue;
@@ -78012,13 +78098,18 @@ function validateConfigLayer(path, data) {
78012
78098
  return rejected;
78013
78099
  return { loaded: true, diagnostics: [...diagnostics, ...invalidValueDiagnostics(path, pruned.dropped)], value: pruned.config };
78014
78100
  }
78015
- var validateLayerRecord = (record) => {
78101
+ var RETIRED_SECTION_DIGESTS, HARNESS_BLOCKS, validateLayerRecord = (record) => {
78016
78102
  const parsed = OmoConfigLayerSchema.safeParse(record);
78017
78103
  return parsed.success ? { success: true } : { success: false, issues: parsed.error.issues };
78018
78104
  };
78019
78105
  var init_layer_validation = __esm(() => {
78020
78106
  init_schema();
78021
78107
  init_merge();
78108
+ RETIRED_SECTION_DIGESTS = new Set([
78109
+ "447f75a8ebdbdb79a57f0b8cebbfba183820cf54a8119ac01449b30499e5ef0e",
78110
+ "4ea5ee68fea05586106890ded5733820bb77d919cda27bc4b8139b7cd33b8889"
78111
+ ]);
78112
+ HARNESS_BLOCKS = new Set(["[opencode]", "[native]", "[senpi]", "[codex]"]);
78022
78113
  });
78023
78114
 
78024
78115
  // packages/omo-config-core/src/internal/posix-path.ts
@@ -80419,13 +80510,14 @@ function applyOpenAiOnlyModelCatalog(config) {
80419
80510
  }
80420
80511
  var OPENAI_ONLY_AGENT_OVERRIDES, OPENAI_ONLY_CATEGORY_OVERRIDES;
80421
80512
  var init_openai_only_model_catalog = __esm(() => {
80513
+ init_latest_models();
80422
80514
  OPENAI_ONLY_AGENT_OVERRIDES = {
80423
- explore: { model: "openai/gpt-6-luna-fast", variant: "low" },
80424
- librarian: { model: "openai/gpt-6-luna-fast", variant: "low" }
80515
+ explore: { model: `openai/${LATEST_MODEL_BY_FAMILY.gptLunaFast}`, variant: "low" },
80516
+ librarian: { model: `openai/${LATEST_MODEL_BY_FAMILY.gptLunaFast}`, variant: "low" }
80425
80517
  };
80426
80518
  OPENAI_ONLY_CATEGORY_OVERRIDES = {
80427
80519
  artistry: { model: "openai/gpt-5.6-sol", variant: "xhigh" },
80428
- quick: { model: "openai/gpt-6-luna-fast" },
80520
+ quick: { model: `openai/${LATEST_MODEL_BY_FAMILY.gptLunaFast}` },
80429
80521
  "visual-engineering": { model: "openai/gpt-5.6-sol", variant: "high" }
80430
80522
  };
80431
80523
  });
@@ -80634,9 +80726,9 @@ function generateModelConfig(config) {
80634
80726
  if (role === "explore") {
80635
80727
  let agentConfig;
80636
80728
  if (avail.native.openai) {
80637
- agentConfig = { model: "openai/gpt-6-luna-fast", variant: "low" };
80729
+ agentConfig = { model: `openai/${LATEST_MODEL_BY_FAMILY.gptLunaFast}`, variant: "low" };
80638
80730
  } else if (avail.native.claude) {
80639
- agentConfig = { model: "anthropic/claude-haiku-5-5", variant: "medium" };
80731
+ agentConfig = { model: `anthropic/${LATEST_MODEL_BY_FAMILY.claudeHaiku}`, variant: "medium" };
80640
80732
  } else if (avail.opencodeZen) {
80641
80733
  agentConfig = { model: "opencode/gpt-5-nano" };
80642
80734
  } else if (avail.opencodeGo) {
@@ -80719,6 +80811,7 @@ var init_model_fallback = __esm(() => {
80719
80811
  init_fallback_chain_resolution();
80720
80812
  init_provider_model_id_transform2();
80721
80813
  init_fallback_lane_policy();
80814
+ init_latest_models();
80722
80815
  });
80723
80816
 
80724
80817
  // packages/omo-opencode/src/cli/config-manager/generate-omo-config.ts
@@ -82617,13 +82710,13 @@ var init_event_id = __esm(() => {
82617
82710
  });
82618
82711
 
82619
82712
  // packages/telemetry-core/src/machine-id.ts
82620
- import { createHash as createHash5 } from "crypto";
82713
+ import { createHash as createHash6 } from "crypto";
82621
82714
  import os4 from "os";
82622
82715
  function getDefaultTelemetryOsProvider() {
82623
82716
  return os4;
82624
82717
  }
82625
82718
  function getTelemetryDistinctId(machineIdPrefix, osProvider = getDefaultTelemetryOsProvider()) {
82626
- return createHash5("sha256").update(`${machineIdPrefix}${osProvider.hostname()}`).digest("hex");
82719
+ return createHash6("sha256").update(`${machineIdPrefix}${osProvider.hostname()}`).digest("hex");
82627
82720
  }
82628
82721
  var init_machine_id = () => {};
82629
82722
 
@@ -92146,20 +92239,98 @@ var init_index_node = __esm(() => {
92146
92239
  };
92147
92240
  });
92148
92241
 
92242
+ // packages/telemetry-core/src/telemetry-delivery-error.ts
92243
+ var PERMANENT_STATUSES, TelemetryDeliveryError;
92244
+ var init_telemetry_delivery_error = __esm(() => {
92245
+ PERMANENT_STATUSES = new Set([400, 413]);
92246
+ TelemetryDeliveryError = class TelemetryDeliveryError extends Error {
92247
+ permanent;
92248
+ status;
92249
+ constructor(status, cause) {
92250
+ super(status === undefined ? "telemetry event was not delivered (no response)" : `telemetry event was rejected with HTTP ${status}`, { cause });
92251
+ this.name = "TelemetryDeliveryError";
92252
+ this.status = status;
92253
+ this.permanent = status !== undefined && PERMANENT_STATUSES.has(status);
92254
+ }
92255
+ };
92256
+ });
92257
+
92258
+ // packages/telemetry-core/src/posthog-immediate-send.ts
92259
+ function createImmediateSender(apiKey, options, PostHogClient) {
92260
+ const baseFetch = options.fetch ?? ((url, init) => fetch(url, init));
92261
+ let current;
92262
+ const trackedFetch = async (url, init) => {
92263
+ const attempt = current;
92264
+ try {
92265
+ const response = await baseFetch(url, init);
92266
+ if (attempt !== undefined)
92267
+ attempt.status = response.status;
92268
+ return response;
92269
+ } catch (error) {
92270
+ if (attempt !== undefined)
92271
+ attempt.error = error;
92272
+ throw error;
92273
+ }
92274
+ };
92275
+ const client = new PostHogClient(apiKey, { ...options, fetch: trackedFetch, fetchRetryCount: 0 });
92276
+ let queue = Promise.resolve();
92277
+ const sendOne = async (message) => {
92278
+ const attempt = {};
92279
+ current = attempt;
92280
+ try {
92281
+ await client.captureImmediate(message);
92282
+ } finally {
92283
+ current = undefined;
92284
+ }
92285
+ const { status } = attempt;
92286
+ if (status === undefined || status < 200 || status >= 300)
92287
+ throw new TelemetryDeliveryError(status, attempt.error);
92288
+ };
92289
+ return {
92290
+ send(message) {
92291
+ const result = queue.then(() => sendOne(message));
92292
+ queue = result.catch(() => {
92293
+ return;
92294
+ });
92295
+ return result;
92296
+ },
92297
+ async shutdown() {
92298
+ await client.shutdown();
92299
+ }
92300
+ };
92301
+ }
92302
+ var init_posthog_immediate_send = __esm(() => {
92303
+ init_telemetry_delivery_error();
92304
+ });
92305
+
92149
92306
  // packages/telemetry-core/src/posthog-transport.ts
92150
92307
  class PostHogTelemetryTransport {
92151
92308
  #client;
92309
+ #apiKey;
92310
+ #options;
92311
+ #immediate;
92152
92312
  constructor(apiKey, options) {
92153
92313
  this.#client = new PostHog(apiKey, options);
92314
+ this.#apiKey = apiKey;
92315
+ this.#options = options;
92154
92316
  }
92155
92317
  capture(message) {
92156
92318
  this.#client.capture(message);
92157
92319
  }
92320
+ captureImmediate(message) {
92321
+ this.#immediate ??= Promise.resolve().then(() => (init_posthog_immediate_send(), {})).then(({}) => createImmediateSender(this.#apiKey, this.#options, PostHog)).catch((error) => {
92322
+ this.#immediate = undefined;
92323
+ throw error;
92324
+ });
92325
+ return this.#immediate.then((sender) => sender.send(message));
92326
+ }
92158
92327
  async flush() {
92159
92328
  await this.#client.flush();
92160
92329
  }
92161
92330
  async shutdown() {
92162
- await this.#client.shutdown();
92331
+ await Promise.all([this.#client.shutdown(), this.#immediate?.then((sender) => sender.shutdown(), () => {
92332
+ return;
92333
+ })]);
92163
92334
  }
92164
92335
  }
92165
92336
  function createDefaultPostHogTransport(apiKey, options) {
@@ -92185,6 +92356,12 @@ var init_posthog_client = __esm(() => {
92185
92356
  // packages/telemetry-core/src/record-daily-active.ts
92186
92357
  var init_record_daily_active = () => {};
92187
92358
 
92359
+ // packages/telemetry-core/src/turn-trace-bridge.ts
92360
+ var REGISTRY;
92361
+ var init_turn_trace_bridge = __esm(() => {
92362
+ REGISTRY = Symbol.for("omo.telemetry.turn-traceparent.v1");
92363
+ });
92364
+
92188
92365
  // packages/telemetry-core/src/index.ts
92189
92366
  var init_src5 = __esm(() => {
92190
92367
  init_activity_state();
@@ -92196,6 +92373,7 @@ var init_src5 = __esm(() => {
92196
92373
  init_machine_id();
92197
92374
  init_posthog_client();
92198
92375
  init_record_daily_active();
92376
+ init_turn_trace_bridge();
92199
92377
  });
92200
92378
 
92201
92379
  // packages/omo-codex/package.json
@@ -92203,7 +92381,7 @@ var package_default2;
92203
92381
  var init_package2 = __esm(() => {
92204
92382
  package_default2 = {
92205
92383
  name: "@oh-my-opencode/omo-codex",
92206
- version: "5.1.44",
92384
+ version: "5.1.46",
92207
92385
  type: "module",
92208
92386
  private: true,
92209
92387
  description: "Codex harness adapter for oh-my-openagent. Vendored Codex plugin namespace (omo) + TypeScript installer + telemetry.",
@@ -92234,6 +92412,7 @@ var init_package2 = __esm(() => {
92234
92412
  "sync:skills": "node plugin/scripts/sync-skills.mjs"
92235
92413
  },
92236
92414
  dependencies: {
92415
+ "@oh-my-opencode/model-core": "workspace:*",
92237
92416
  "@oh-my-opencode/shared-skills": "workspace:*",
92238
92417
  "@oh-my-opencode/utils": "workspace:*"
92239
92418
  },
@@ -93174,20 +93353,20 @@ var init_update_toasts = __esm(() => {
93174
93353
  });
93175
93354
 
93176
93355
  // packages/omo-opencode/src/hooks/auto-update-checker/hook/background-update-check.ts
93177
- import { existsSync as existsSync48 } from "fs";
93178
- import { dirname as dirname32, join as join79 } from "path";
93356
+ import { existsSync as existsSync50 } from "fs";
93357
+ import { dirname as dirname35, join as join84 } from "path";
93179
93358
  import { fileURLToPath as fileURLToPath5 } from "url";
93180
93359
  function defaultGetModuleHostingWorkspace() {
93181
93360
  try {
93182
- const currentDir = dirname32(fileURLToPath5(import.meta.url));
93361
+ const currentDir = dirname35(fileURLToPath5(import.meta.url));
93183
93362
  const pkgJsonPath = findPackageJsonUp(currentDir);
93184
93363
  if (!pkgJsonPath)
93185
93364
  return null;
93186
- const pkgDir = dirname32(pkgJsonPath);
93187
- const nodeModulesDir = dirname32(pkgDir);
93365
+ const pkgDir = dirname35(pkgJsonPath);
93366
+ const nodeModulesDir = dirname35(pkgDir);
93188
93367
  if (nodeModulesDir.split(/[\\/]/).pop() !== "node_modules")
93189
93368
  return null;
93190
- return dirname32(nodeModulesDir);
93369
+ return dirname35(nodeModulesDir);
93191
93370
  } catch (error) {
93192
93371
  if (error instanceof Error) {
93193
93372
  return null;
@@ -93334,8 +93513,8 @@ var init_background_update_check = __esm(() => {
93334
93513
  init_semver_compare();
93335
93514
  init_update_toasts();
93336
93515
  defaultDeps4 = {
93337
- existsSync: existsSync48,
93338
- join: join79,
93516
+ existsSync: existsSync50,
93517
+ join: join84,
93339
93518
  runBunInstallWithDetails,
93340
93519
  log: log2,
93341
93520
  getOpenCodeCacheDir,
@@ -93752,7 +93931,7 @@ function getUnsupportedOpenCodeVersionMessage(openCodeVersion) {
93752
93931
  // packages/omo-codex/src/install/install-codex.ts
93753
93932
  import { join as join56, resolve as resolve13 } from "path";
93754
93933
  import { existsSync as existsSync27 } from "fs";
93755
- import { homedir as homedir6 } from "os";
93934
+ import { homedir as homedir7 } from "os";
93756
93935
 
93757
93936
  // packages/omo-codex/src/install/codex-cache-bins.ts
93758
93937
  import { chmod, lstat as lstat4, mkdir, readFile as readFile3, readdir as readdir2, readlink as readlink3, rm as rm3, stat as stat2, symlink, writeFile } from "fs/promises";
@@ -96211,11 +96390,12 @@ function isRootSetting(line, key) {
96211
96390
  }
96212
96391
 
96213
96392
  // packages/omo-codex/src/install/codex-model-catalog.ts
96393
+ init_latest_models();
96214
96394
  import { readFile as readFile10 } from "fs/promises";
96215
96395
  import { join as join36 } from "path";
96216
96396
  var FALLBACK_CODEX_MODEL_CATALOG = {
96217
96397
  current: {
96218
- model: "gpt-6-astra",
96398
+ model: LATEST_MODEL_BY_FAMILY.gptAstra,
96219
96399
  modelContextWindow: 600000,
96220
96400
  modelReasoningEffort: "high",
96221
96401
  planModeReasoningEffort: "xhigh"
@@ -96517,7 +96697,7 @@ function isMissingFileError(error) {
96517
96697
  }
96518
96698
 
96519
96699
  // packages/omo-codex/src/install/codex-hook-trust.ts
96520
- import { createHash as createHash2 } from "crypto";
96700
+ import { createHash as createHash3 } from "crypto";
96521
96701
  import { readFile as readFile12 } from "fs/promises";
96522
96702
  import { join as join38 } from "path";
96523
96703
  var EVENT_LABELS = new Map([
@@ -96609,7 +96789,7 @@ function commandHookHash(eventName, matcher, handler, command) {
96609
96789
  if (typeof matcher === "string")
96610
96790
  identity.matcher = matcher;
96611
96791
  const canonical = JSON.stringify(canonicalJson(identity));
96612
- return `sha256:${createHash2("sha256").update(canonical).digest("hex")}`;
96792
+ return `sha256:${createHash3("sha256").update(canonical).digest("hex")}`;
96613
96793
  }
96614
96794
  function canonicalJson(value) {
96615
96795
  if (Array.isArray(value))
@@ -96788,6 +96968,7 @@ import { lstat as lstat7, readFile as readFile13, readdir as readdir6, writeFile
96788
96968
  import { join as join40 } from "path";
96789
96969
 
96790
96970
  // packages/omo-codex/src/install/managed-agent-reasoning-defaults.ts
96971
+ init_latest_models();
96791
96972
  var MANAGED_REASONING_DEFAULT_UPGRADES = new Map([
96792
96973
  [
96793
96974
  "explorer",
@@ -96802,7 +96983,7 @@ var MANAGED_REASONING_DEFAULT_UPGRADES = new Map([
96802
96983
  },
96803
96984
  {
96804
96985
  previous: { model: "gpt-5.6-luna", effort: "low" },
96805
- current: { model: "gpt-6-astra", effort: "low" }
96986
+ current: { model: LATEST_MODEL_BY_FAMILY.gptAstra, effort: "low" }
96806
96987
  }
96807
96988
  ]
96808
96989
  ],
@@ -96819,7 +97000,7 @@ var MANAGED_REASONING_DEFAULT_UPGRADES = new Map([
96819
97000
  },
96820
97001
  {
96821
97002
  previous: { model: "gpt-5.6-luna", effort: "low" },
96822
- current: { model: "gpt-6-astra", effort: "low" }
97003
+ current: { model: LATEST_MODEL_BY_FAMILY.gptAstra, effort: "low" }
96823
97004
  }
96824
97005
  ]
96825
97006
  ],
@@ -96828,7 +97009,7 @@ var MANAGED_REASONING_DEFAULT_UPGRADES = new Map([
96828
97009
  [
96829
97010
  {
96830
97011
  previous: { model: "gpt-5.6-sol", effort: "high" },
96831
- current: { model: "gpt-6-astra", effort: "high" }
97012
+ current: { model: LATEST_MODEL_BY_FAMILY.gptAstra, effort: "high" }
96832
97013
  }
96833
97014
  ]
96834
97015
  ],
@@ -96837,7 +97018,7 @@ var MANAGED_REASONING_DEFAULT_UPGRADES = new Map([
96837
97018
  [
96838
97019
  {
96839
97020
  previous: { model: "gpt-5.6-luna", effort: "high" },
96840
- current: { model: "gpt-6-astra", effort: "high" }
97021
+ current: { model: LATEST_MODEL_BY_FAMILY.gptAstra, effort: "high" }
96841
97022
  }
96842
97023
  ]
96843
97024
  ],
@@ -96854,7 +97035,7 @@ var MANAGED_REASONING_DEFAULT_UPGRADES = new Map([
96854
97035
  },
96855
97036
  {
96856
97037
  previous: { model: "gpt-5.6-terra", effort: "high" },
96857
- current: { model: "gpt-6-astra", effort: "high" }
97038
+ current: { model: LATEST_MODEL_BY_FAMILY.gptAstra, effort: "high" }
96858
97039
  }
96859
97040
  ]
96860
97041
  ],
@@ -96871,7 +97052,7 @@ var MANAGED_REASONING_DEFAULT_UPGRADES = new Map([
96871
97052
  },
96872
97053
  {
96873
97054
  previous: { model: "gpt-5.6-sol", effort: "high" },
96874
- current: { model: "gpt-6-astra", effort: "high" }
97055
+ current: { model: LATEST_MODEL_BY_FAMILY.gptAstra, effort: "high" }
96875
97056
  }
96876
97057
  ]
96877
97058
  ],
@@ -96888,7 +97069,7 @@ var MANAGED_REASONING_DEFAULT_UPGRADES = new Map([
96888
97069
  },
96889
97070
  {
96890
97071
  previous: { model: "gpt-5.6-terra", effort: "high" },
96891
- current: { model: "gpt-6-astra", effort: "high" }
97072
+ current: { model: LATEST_MODEL_BY_FAMILY.gptAstra, effort: "high" }
96892
97073
  }
96893
97074
  ]
96894
97075
  ],
@@ -96901,7 +97082,7 @@ var MANAGED_REASONING_DEFAULT_UPGRADES = new Map([
96901
97082
  },
96902
97083
  {
96903
97084
  previous: { model: "gpt-5.6-sol", effort: "medium" },
96904
- current: { model: "gpt-6-astra", effort: "medium" }
97085
+ current: { model: LATEST_MODEL_BY_FAMILY.gptAstra, effort: "medium" }
96905
97086
  }
96906
97087
  ]
96907
97088
  ],
@@ -96914,7 +97095,7 @@ var MANAGED_REASONING_DEFAULT_UPGRADES = new Map([
96914
97095
  },
96915
97096
  {
96916
97097
  previous: { model: "gpt-5.6-terra", effort: "medium" },
96917
- current: { model: "gpt-6-astra", effort: "medium" }
97098
+ current: { model: LATEST_MODEL_BY_FAMILY.gptAstra, effort: "medium" }
96918
97099
  }
96919
97100
  ]
96920
97101
  ],
@@ -96927,7 +97108,7 @@ var MANAGED_REASONING_DEFAULT_UPGRADES = new Map([
96927
97108
  },
96928
97109
  {
96929
97110
  previous: { model: "gpt-5.6-terra", effort: "high" },
96930
- current: { model: "gpt-6-astra", effort: "high" }
97111
+ current: { model: LATEST_MODEL_BY_FAMILY.gptAstra, effort: "high" }
96931
97112
  }
96932
97113
  ]
96933
97114
  ],
@@ -96940,7 +97121,7 @@ var MANAGED_REASONING_DEFAULT_UPGRADES = new Map([
96940
97121
  },
96941
97122
  {
96942
97123
  previous: { model: "gpt-5.6-luna", effort: "high" },
96943
- current: { model: "gpt-6-astra", effort: "high" }
97124
+ current: { model: LATEST_MODEL_BY_FAMILY.gptAstra, effort: "high" }
96944
97125
  }
96945
97126
  ]
96946
97127
  ],
@@ -96957,7 +97138,7 @@ var MANAGED_REASONING_DEFAULT_UPGRADES = new Map([
96957
97138
  },
96958
97139
  {
96959
97140
  previous: { model: "gpt-5.6-sol", effort: "low" },
96960
- current: { model: "gpt-6-astra", effort: "low" }
97141
+ current: { model: LATEST_MODEL_BY_FAMILY.gptAstra, effort: "low" }
96961
97142
  }
96962
97143
  ]
96963
97144
  ]
@@ -97287,7 +97468,7 @@ function nodeErrorCode2(error) {
97287
97468
  }
97288
97469
 
97289
97470
  // packages/omo-codex/src/install/default-agent-role.ts
97290
- import { createHash as createHash3 } from "crypto";
97471
+ import { createHash as createHash4 } from "crypto";
97291
97472
  import { lstat as lstat9, readFile as readFile16, rm as rm10 } from "fs/promises";
97292
97473
  import { join as join43 } from "path";
97293
97474
  var REGISTRATION = { name: "default", configFile: "./agents/default.toml" };
@@ -97343,7 +97524,7 @@ async function readIfPresent(path) {
97343
97524
  }
97344
97525
  }
97345
97526
  function hash(content) {
97346
- return createHash3("sha256").update(content).digest("hex");
97527
+ return createHash4("sha256").update(content).digest("hex");
97347
97528
  }
97348
97529
 
97349
97530
  // packages/omo-codex/src/install/link-cached-plugin-agents.ts
@@ -98008,7 +98189,7 @@ function formatUnknownError(error) {
98008
98189
  }
98009
98190
 
98010
98191
  // packages/omo-codex/src/install/lsp-daemon-reaper.ts
98011
- import { createHash as createHash4 } from "crypto";
98192
+ import { createHash as createHash5 } from "crypto";
98012
98193
  import { lstat as lstat12, readFile as readFile22, readdir as readdir10, rm as rm12 } from "fs/promises";
98013
98194
  import { tmpdir as tmpdir3 } from "os";
98014
98195
  import { join as join48, posix as posix6 } from "path";
@@ -98286,7 +98467,7 @@ async function readRegularTrimmedFile(path) {
98286
98467
  return content.length > 0 ? content : null;
98287
98468
  }
98288
98469
  function shortDigest(value) {
98289
- return createHash4("sha256").update(value).digest("hex").slice(0, 16);
98470
+ return createHash5("sha256").update(value).digest("hex").slice(0, 16);
98290
98471
  }
98291
98472
  async function removeVersionDir(path) {
98292
98473
  await rm12(path, { recursive: true, force: true });
@@ -98328,13 +98509,13 @@ function processIsRunning(pid) {
98328
98509
  }
98329
98510
 
98330
98511
  // packages/omo-codex/src/install/codex-installer-bin-dir.ts
98331
- import { homedir as homedir5 } from "os";
98512
+ import { homedir as homedir6 } from "os";
98332
98513
  import { join as join49, resolve as resolve12 } from "path";
98333
98514
  function resolveCodexInstallerBinDir(input) {
98334
98515
  const explicitBinDir = input.binDir ?? input.env?.CODEX_LOCAL_BIN_DIR;
98335
98516
  if (explicitBinDir !== undefined && explicitBinDir.trim().length > 0)
98336
98517
  return resolve12(explicitBinDir.trim());
98337
- const homeDir = input.homeDir ?? homedir5();
98518
+ const homeDir = input.homeDir ?? homedir6();
98338
98519
  const defaultCodexHome = resolve12(homeDir, ".codex");
98339
98520
  const resolvedCodexHome = resolve12(input.codexHome);
98340
98521
  if (resolvedCodexHome !== defaultCodexHome)
@@ -98460,7 +98641,7 @@ async function runCodexInstaller(options = {}) {
98460
98641
  const env = options.env ?? process.env;
98461
98642
  const platform = options.platform ?? process.platform;
98462
98643
  const repoRoot = resolve13(options.repoRoot ?? findRepoRoot({ importerDir: import.meta.dir, env }));
98463
- const codexHome = resolve13(options.codexHome ?? env.CODEX_HOME ?? join56(homedir6(), ".codex"));
98644
+ const codexHome = resolve13(options.codexHome ?? env.CODEX_HOME ?? join56(homedir7(), ".codex"));
98464
98645
  const projectDirectory = resolve13(options.projectDirectory ?? env.OMO_CODEX_PROJECT ?? process.cwd());
98465
98646
  const binDir = resolveCodexInstallerBinDir({ binDir: options.binDir, codexHome, env });
98466
98647
  const runCommand = options.runCommand ?? defaultRunCommand;
@@ -98652,7 +98833,7 @@ function codexMarketplaceSource(marketplaceRoot) {
98652
98833
  init_bun_which_shim();
98653
98834
  import { execFile as execFile2 } from "child_process";
98654
98835
  import { existsSync as existsSync28 } from "fs";
98655
- import { homedir as homedir7 } from "os";
98836
+ import { homedir as homedir8 } from "os";
98656
98837
  import { posix as posix8, win32 as win324 } from "path";
98657
98838
  var CODEX_PATH_CHECK_LABEL = "codex (PATH)";
98658
98839
  var WINDOWS_START_APPS_ARGS = [
@@ -98663,7 +98844,7 @@ var WINDOWS_START_APPS_ARGS = [
98663
98844
  async function detectCodexInstallation(input = {}) {
98664
98845
  const platform = input.platform ?? process.platform;
98665
98846
  const env = input.env ?? process.env;
98666
- const homeDir = input.homeDir ?? homedir7();
98847
+ const homeDir = input.homeDir ?? homedir8();
98667
98848
  const exists = input.exists ?? existsSync28;
98668
98849
  const which = input.which ?? bunWhich;
98669
98850
  const checkedPaths = [CODEX_PATH_CHECK_LABEL];
@@ -98779,7 +98960,7 @@ function defaultRunCommand2(command, args) {
98779
98960
  }
98780
98961
  // packages/omo-codex/src/install/codex-cleanup.ts
98781
98962
  import { lstat as lstat15, readFile as readFile27, readdir as readdir13, rm as rm14, rmdir } from "fs/promises";
98782
- import { homedir as homedir8 } from "os";
98963
+ import { homedir as homedir9 } from "os";
98783
98964
  import { isAbsolute as isAbsolute11, join as join59, relative as relative6, resolve as resolve16 } from "path";
98784
98965
 
98785
98966
  // packages/omo-codex/src/install/codex-cleanup-bins.ts
@@ -99018,7 +99199,7 @@ function skipped(path, reason) {
99018
99199
  var INSTALLED_AGENTS_MANIFEST = ".installed-agents.json";
99019
99200
  async function cleanupCodexLight(input = {}) {
99020
99201
  const env = input.env ?? process.env;
99021
- const codexHome = resolve16(input.codexHome ?? env.CODEX_HOME ?? join59(homedir8(), ".codex"));
99202
+ const codexHome = resolve16(input.codexHome ?? env.CODEX_HOME ?? join59(homedir9(), ".codex"));
99022
99203
  const configPath = join59(codexHome, "config.toml");
99023
99204
  const installedBinDir = await readInstalledCodexBinDir(codexHome);
99024
99205
  const agentPaths = await collectInstalledAgentPaths(codexHome, configPath);
@@ -99230,14 +99411,14 @@ function nodeErrorCode6(error) {
99230
99411
  // packages/omo-senpi/src/install/install-senpi.ts
99231
99412
  import { execFile as execFile3 } from "child_process";
99232
99413
  import { existsSync as existsSync31 } from "fs";
99233
- import { homedir as homedir11 } from "os";
99414
+ import { homedir as homedir12 } from "os";
99234
99415
  import { dirname as dirname25, join as join64, resolve as resolve20 } from "path";
99235
99416
  import { fileURLToPath } from "url";
99236
99417
  import { promisify as promisify2 } from "util";
99237
99418
 
99238
- // packages/omo-senpi/src/components/agent-home/resolve-agent-home.ts
99419
+ // packages/senpi-task/src/agent-home.ts
99239
99420
  import { existsSync as existsSync29 } from "fs";
99240
- import { homedir as homedir9 } from "os";
99421
+ import { homedir as homedir10 } from "os";
99241
99422
  import { join as join60, resolve as resolve17 } from "path";
99242
99423
  var AGENT_DIR_ENV_NAMES = [
99243
99424
  "OMO_CODING_AGENT_DIR",
@@ -99246,7 +99427,7 @@ var AGENT_DIR_ENV_NAMES = [
99246
99427
  ];
99247
99428
  var AGENT_HOME_SENTINEL = "settings.json";
99248
99429
  function resolveAgentHome(options) {
99249
- const { env, homeDir = homedir9(), exists = existsSync29 } = options;
99430
+ const { env, homeDir = homedir10(), exists = existsSync29 } = options;
99250
99431
  for (const name of AGENT_DIR_ENV_NAMES) {
99251
99432
  const configured = env[name]?.trim();
99252
99433
  if (configured)
@@ -99260,16 +99441,15 @@ function resolveAgentHome(options) {
99260
99441
  return brandedHome;
99261
99442
  return join60(homeDir, ".senpi", "agent");
99262
99443
  }
99263
-
99264
99444
  // packages/omo-senpi/src/install/local-launcher.ts
99265
99445
  import { chmodSync as chmodSync3, existsSync as existsSync30, mkdirSync as mkdirSync12, readFileSync as readFileSync14, rmSync as rmSync4, writeFileSync as writeFileSync7 } from "fs";
99266
- import { homedir as homedir10 } from "os";
99446
+ import { homedir as homedir11 } from "os";
99267
99447
  import { dirname as dirname22, join as join61, resolve as resolve18 } from "path";
99268
99448
  var MARKER = "omo-local-launcher";
99269
- function localLauncherPath(homeDir = homedir10()) {
99449
+ function localLauncherPath(homeDir = homedir11()) {
99270
99450
  return join61(homeDir, ".local", "bin", "omo");
99271
99451
  }
99272
- function localLauncherCmdPath(homeDir = homedir10()) {
99452
+ function localLauncherCmdPath(homeDir = homedir11()) {
99273
99453
  return join61(homeDir, ".local", "bin", "omo.cmd");
99274
99454
  }
99275
99455
  function releaseChannel(version) {
@@ -99358,7 +99538,7 @@ node "%~dp0omo" %*\r
99358
99538
  }
99359
99539
 
99360
99540
  // packages/omo-senpi/src/install/plugin-artifacts.ts
99361
- import { createHash as createHash6 } from "crypto";
99541
+ import { createHash as createHash7 } from "crypto";
99362
99542
  import { constants as constants9 } from "fs";
99363
99543
  import { access as access2, readFile as readFile29, stat as stat6 } from "fs/promises";
99364
99544
  import { dirname as dirname24, join as join63 } from "path";
@@ -99502,6 +99682,8 @@ var REQUIRED_PLUGIN_ARTIFACTS = [
99502
99682
  join63("extensions", "omo-memory-doctor.js"),
99503
99683
  join63("extensions", "omo-memory-memfs.js"),
99504
99684
  join63("extensions", "omo-memory-palace.js"),
99685
+ join63("extensions", "omo-device-account.js"),
99686
+ join63("extensions", "omo-memory-commands.js"),
99505
99687
  join63("extensions", "omo-session-history.js"),
99506
99688
  join63("extensions", "omo-recall-store.js"),
99507
99689
  join63("extensions", "omo-telemetry-posthog.js"),
@@ -99509,6 +99691,7 @@ var REQUIRED_PLUGIN_ARTIFACTS = [
99509
99691
  join63("extensions", "loro_wasm_bg.wasm"),
99510
99692
  join63("extensions", "CaseFolding.txt"),
99511
99693
  join63("extensions", "omo-thread-client.js"),
99694
+ join63("extensions", "omo-telemetry-recovery.js"),
99512
99695
  join63("extensions", "omo-feedback.js"),
99513
99696
  join63("extensions", "omo-claim-receipt.js"),
99514
99697
  join63("extensions", "assets.generated.json"),
@@ -99599,7 +99782,7 @@ async function verifyAstGrepRuntimeIntegrity(pluginPath, platform) {
99599
99782
  }
99600
99783
  let actualSha256;
99601
99784
  try {
99602
- actualSha256 = createHash6("sha256").update(await readFile29(runtimeEntry)).digest("hex");
99785
+ actualSha256 = createHash7("sha256").update(await readFile29(runtimeEntry)).digest("hex");
99603
99786
  } catch (error) {
99604
99787
  throw astGrepIntegrityError(runtimeEntry, `runtime hash could not be computed: ${messageOf(error)}`);
99605
99788
  }
@@ -99668,7 +99851,7 @@ function resolveInstallContext(options) {
99668
99851
  const env = options.env ?? process.env;
99669
99852
  const allowBuild = options.pluginPath === undefined;
99670
99853
  const repoRoot = resolve20(options.repoRoot ?? (allowBuild ? findRepoRoot2(dirname25(fileURLToPath(import.meta.url))) : dirname25(resolve20(options.pluginPath))));
99671
- const homeDir = options.homeDir ?? env.HOME ?? homedir11();
99854
+ const homeDir = options.homeDir ?? env.HOME ?? homedir12();
99672
99855
  const agentDir = resolve20(options.agentDir ?? resolveAgentHome({ env, homeDir }));
99673
99856
  const pluginPath = resolve20(options.pluginPath ?? join64(repoRoot, "packages", "omo-senpi", "plugin"));
99674
99857
  return {
@@ -99964,7 +100147,7 @@ function shadowWarning(resolved, native, isWindows) {
99964
100147
  // packages/omo-opencode/src/cli/install-native/run-native-install.ts
99965
100148
  init_bun_which_shim();
99966
100149
  init_spawn_with_windows_hide();
99967
- import { homedir as homedir12 } from "os";
100150
+ import { homedir as homedir13 } from "os";
99968
100151
  function describeExit(plan, result) {
99969
100152
  const stderr = result.stderr?.trim();
99970
100153
  const head = `${plan.packageManager} exited with code ${result.exitCode}`;
@@ -100028,7 +100211,7 @@ function nativeInstallFailureLines(failure) {
100028
100211
  function defaultNativeInstallDependencies() {
100029
100212
  return {
100030
100213
  isBunAvailable: () => bunWhich("bun") !== null,
100031
- environment: resolveOmoBinEnvironment({ env: process.env, platform: process.platform, homeDir: homedir12() }),
100214
+ environment: resolveOmoBinEnvironment({ env: process.env, platform: process.platform, homeDir: homedir13() }),
100032
100215
  spawn: async (command, args) => {
100033
100216
  const proc = spawnWithWindowsHide([command, ...args], {
100034
100217
  env: process.env,
@@ -100430,7 +100613,7 @@ async function checkTuiPluginConfig() {
100430
100613
  if (!server.registered && tui.registered) {
100431
100614
  issues.push({
100432
100615
  title: "Server plugin entry missing from opencode.json",
100433
- 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 \u2014 the server side " + "handles tool dispatch, hook execution, and SDK integration.",
100616
+ 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.",
100434
100617
  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"}.`,
100435
100618
  affects: ["tool dispatch", "hook execution", "SDK integration"],
100436
100619
  severity: "warning"
@@ -100599,7 +100782,7 @@ function refreshOpenCodePluginSandboxes(options = {}) {
100599
100782
  }
100600
100783
 
100601
100784
  // packages/omo-opencode/src/cli/install-ast-grep-sg.ts
100602
- import { homedir as homedir13 } from "os";
100785
+ import { homedir as homedir14 } from "os";
100603
100786
  import { join as join69 } from "path";
100604
100787
 
100605
100788
  // packages/shared-skills/index.mjs
@@ -100622,7 +100805,7 @@ function describeResult2(result) {
100622
100805
  }
100623
100806
  async function installAstGrepForOpenCode(options = {}) {
100624
100807
  const platform = options.platform ?? process.platform;
100625
- const baseDir = join69(options.homeDir ?? homedir13(), ".omo");
100808
+ const baseDir = join69(options.homeDir ?? homedir14(), ".omo");
100626
100809
  const targetDir = astGrepRuntimeDir(baseDir, platform, options.arch ?? process.arch);
100627
100810
  const skillDir = join69(options.sharedSkillsRoot ?? sharedSkillsRootPath(), "ast-grep");
100628
100811
  const installer = options.installer ?? runAstGrepSkillInstall;
@@ -103196,9 +103379,250 @@ async function processEvents(ctx, stream, state) {
103196
103379
  }
103197
103380
  }
103198
103381
  }
103382
+ // packages/omo-opencode/src/config/validate.ts
103383
+ import { dirname as dirname29, isAbsolute as isAbsolute13, join as join74, relative as relative7 } from "path";
103384
+
103385
+ // packages/skills-loader-core/src/shared/skill-path-resolver.ts
103386
+ init_skill_path_resolver();
103387
+
103388
+ // packages/skills-loader-core/src/features/opencode-skill-loader/skill-mcp-config.ts
103389
+ init_js_yaml();
103390
+
103391
+ // packages/skills-loader-core/src/features/opencode-skill-loader/skill-provenance.ts
103392
+ import { basename as basename11, dirname as dirname28, join as join73, resolve as resolve23, sep as sep9 } from "path";
103393
+ import { homedir as homedir16 } from "os";
103394
+
103395
+ // packages/skills-loader-core/src/shared/claude-config-dir.ts
103396
+ init_src();
103397
+ import { join as join70 } from "path";
103398
+ function getClaudeConfigDir() {
103399
+ const envConfigDir = process.env.CLAUDE_CONFIG_DIR;
103400
+ if (envConfigDir) {
103401
+ return envConfigDir;
103402
+ }
103403
+ return join70(getHomeDirectory(), ".claude");
103404
+ }
103405
+ // packages/skills-loader-core/src/shared/opencode-config-dir.ts
103406
+ import { existsSync as existsSync36, realpathSync as realpathSync9 } from "fs";
103407
+ import { homedir as homedir15 } from "os";
103408
+ import { join as join71, posix as posix10, resolve as resolve21, win32 as win326 } from "path";
103409
+
103410
+ // packages/skills-loader-core/src/shared/plugin-identity.ts
103411
+ init_src();
103412
+ var PRODUCT_IDENTITY = createProductIdentity({
103413
+ pluginName: "oh-my-openagent",
103414
+ legacyPluginName: "oh-my-opencode",
103415
+ publishedPackageName: "oh-my-opencode",
103416
+ configBasename: "oh-my-openagent",
103417
+ legacyConfigBasename: "oh-my-opencode",
103418
+ logFileName: "oh-my-opencode.log",
103419
+ cacheDirName: "oh-my-opencode"
103420
+ });
103421
+ var PLUGIN_NAME2 = PRODUCT_IDENTITY.pluginName;
103422
+ var LEGACY_PLUGIN_NAME2 = PRODUCT_IDENTITY.legacyPluginName;
103423
+ var PUBLISHED_PACKAGE_NAME2 = PRODUCT_IDENTITY.publishedPackageName;
103424
+ var CONFIG_BASENAME = PRODUCT_IDENTITY.configBasename;
103425
+ var LEGACY_CONFIG_BASENAME = PRODUCT_IDENTITY.legacyConfigBasename;
103426
+ var LOG_FILENAME3 = PRODUCT_IDENTITY.logFileName;
103427
+ var CACHE_DIR_NAME3 = PRODUCT_IDENTITY.cacheDirName;
103428
+
103429
+ // packages/skills-loader-core/src/shared/opencode-config-dir.ts
103430
+ var TAURI_APP_IDENTIFIER2 = "ai.opencode.desktop";
103431
+ var TAURI_APP_IDENTIFIER_DEV2 = "ai.opencode.desktop.dev";
103432
+ function isDevBuild2(version) {
103433
+ if (!version)
103434
+ return false;
103435
+ return version.includes("-dev") || version.includes(".dev");
103436
+ }
103437
+ function getTauriConfigDir2(identifier) {
103438
+ const platform = process.platform;
103439
+ switch (platform) {
103440
+ case "darwin":
103441
+ return join71(homedir15(), "Library", "Application Support", identifier);
103442
+ case "win32": {
103443
+ const appData = process.env.APPDATA || join71(homedir15(), "AppData", "Roaming");
103444
+ return win326.join(appData, identifier);
103445
+ }
103446
+ case "linux":
103447
+ default: {
103448
+ const xdgConfig = process.env.XDG_CONFIG_HOME || join71(homedir15(), ".config");
103449
+ return join71(xdgConfig, identifier);
103450
+ }
103451
+ }
103452
+ }
103453
+ function resolveConfigPath2(pathValue) {
103454
+ if (isWslEnvironment2() && pathValue.startsWith("/")) {
103455
+ return posix10.normalize(pathValue);
103456
+ }
103457
+ const resolvedPath = resolve21(pathValue);
103458
+ if (!existsSync36(resolvedPath))
103459
+ return resolvedPath;
103460
+ try {
103461
+ return realpathSync9(resolvedPath);
103462
+ } catch (error) {
103463
+ if (error instanceof Error) {
103464
+ return resolvedPath;
103465
+ }
103466
+ return resolvedPath;
103467
+ }
103468
+ }
103469
+ function isWslEnvironment2() {
103470
+ return process.platform === "linux" && (Boolean(process.env.WSL_DISTRO_NAME?.trim()) || Boolean(process.env.WSL_INTEROP?.trim()));
103471
+ }
103472
+ function isWindowsUserConfigRoot2(pathValue) {
103473
+ const normalizedPath = pathValue.replaceAll("\\", "/").toLowerCase();
103474
+ return /^[a-z]:\/users\//.test(normalizedPath) || /^\/mnt\/[a-z]\/users\//.test(normalizedPath);
103475
+ }
103476
+ function getWindowsUserFromConfigRoot2(pathValue) {
103477
+ const normalizedPath = pathValue.replaceAll("\\", "/");
103478
+ const match = /^(?:[a-z]:|\/mnt\/[a-z])\/Users\/([^/]+)/i.exec(normalizedPath);
103479
+ return match?.[1] ?? null;
103480
+ }
103481
+ function getWslLinuxHomeDir2(windowsConfigRoot) {
103482
+ const envHome = process.env.HOME?.trim();
103483
+ if (envHome && envHome.startsWith("/") && !isWindowsUserConfigRoot2(envHome)) {
103484
+ return envHome;
103485
+ }
103486
+ const user = process.env.USER?.trim() || process.env.LOGNAME?.trim() || process.env.SUDO_USER?.trim() || (windowsConfigRoot ? getWindowsUserFromConfigRoot2(windowsConfigRoot) : undefined);
103487
+ return user ? posix10.join("/home", user) : null;
103488
+ }
103489
+ function getCliDefaultConfigDir2() {
103490
+ const envXdgConfig = process.env.XDG_CONFIG_HOME?.trim();
103491
+ const shouldIgnoreWindowsXdg = envXdgConfig !== undefined && envXdgConfig.length > 0 && isWslEnvironment2() && isWindowsUserConfigRoot2(envXdgConfig);
103492
+ const xdgConfig = shouldIgnoreWindowsXdg ? posix10.join(getWslLinuxHomeDir2(envXdgConfig) ?? "/home", ".config") : envXdgConfig || join71(homedir15(), ".config");
103493
+ const configDir = isWslEnvironment2() ? posix10.join(xdgConfig, "opencode") : join71(xdgConfig, "opencode");
103494
+ return resolveConfigPath2(configDir);
103495
+ }
103496
+ function getCliCustomConfigDir2() {
103497
+ const envConfigDir = process.env.OPENCODE_CONFIG_DIR?.trim();
103498
+ if (!envConfigDir) {
103499
+ return null;
103500
+ }
103501
+ return resolveConfigPath2(envConfigDir);
103502
+ }
103503
+ function getCliConfigDir2() {
103504
+ return getCliCustomConfigDir2() ?? getCliDefaultConfigDir2();
103505
+ }
103506
+ function getOpenCodeConfigDirs2(options) {
103507
+ if (options.binary !== "opencode") {
103508
+ return [getOpenCodeConfigDir2(options)];
103509
+ }
103510
+ const customConfigDir = getCliCustomConfigDir2();
103511
+ return Array.from(new Set([
103512
+ ...customConfigDir ? [customConfigDir] : [],
103513
+ getCliDefaultConfigDir2()
103514
+ ]));
103515
+ }
103516
+ function getOpenCodeConfigDir2(options) {
103517
+ const { binary, version, checkExisting = true } = options;
103518
+ if (binary === "opencode") {
103519
+ return getCliConfigDir2();
103520
+ }
103521
+ const identifier = isDevBuild2(version) ? TAURI_APP_IDENTIFIER_DEV2 : TAURI_APP_IDENTIFIER2;
103522
+ const tauriDirBase = getTauriConfigDir2(identifier);
103523
+ const tauriDir = process.platform === "win32" ? win326.isAbsolute(tauriDirBase) ? win326.normalize(tauriDirBase) : win326.resolve(tauriDirBase) : resolveConfigPath2(tauriDirBase);
103524
+ if (checkExisting) {
103525
+ const legacyDir = getCliConfigDir2();
103526
+ const legacyConfig = join71(legacyDir, "opencode.json");
103527
+ const legacyConfigC = join71(legacyDir, "opencode.jsonc");
103528
+ if (existsSync36(legacyConfig) || existsSync36(legacyConfigC)) {
103529
+ return legacyDir;
103530
+ }
103531
+ }
103532
+ return tauriDir;
103533
+ }
103534
+ // packages/skills-loader-core/src/shared/project-discovery-dirs.ts
103535
+ import { execFileSync as execFileSync3 } from "child_process";
103536
+ import { existsSync as existsSync37, realpathSync as realpathSync10 } from "fs";
103537
+ import { dirname as dirname27, join as join72, resolve as resolve22, win32 as win327 } from "path";
103538
+ var worktreePathCache2 = new Map;
103539
+ function normalizePath(path) {
103540
+ const resolvedPath = process.platform !== "win32" && win327.isAbsolute(path) ? path : resolve22(path);
103541
+ if (!existsSync37(resolvedPath)) {
103542
+ return resolvedPath;
103543
+ }
103544
+ try {
103545
+ return realpathSync10.native(resolvedPath);
103546
+ } catch (error) {
103547
+ if (!(error instanceof Error)) {
103548
+ throw error;
103549
+ }
103550
+ try {
103551
+ return realpathSync10(resolvedPath);
103552
+ } catch (fallbackError) {
103553
+ if (!(fallbackError instanceof Error)) {
103554
+ throw fallbackError;
103555
+ }
103556
+ return resolvedPath;
103557
+ }
103558
+ }
103559
+ }
103560
+ function pathKey2(path) {
103561
+ const normalized = path.replace(/\\/g, "/");
103562
+ return process.platform === "win32" ? normalized.toLowerCase() : normalized;
103563
+ }
103564
+ function detectWorktreePath(directory) {
103565
+ const resolvedDirectory = resolve22(directory);
103566
+ const cacheKey = pathKey2(normalizePath(resolvedDirectory));
103567
+ if (worktreePathCache2.has(cacheKey)) {
103568
+ return worktreePathCache2.get(cacheKey);
103569
+ }
103570
+ let ancestor = normalizePath(resolvedDirectory);
103571
+ while (true) {
103572
+ if (existsSync37(join72(ancestor, ".git"))) {
103573
+ worktreePathCache2.set(cacheKey, ancestor);
103574
+ return ancestor;
103575
+ }
103576
+ const parent = dirname27(ancestor);
103577
+ if (parent === ancestor)
103578
+ break;
103579
+ ancestor = parent;
103580
+ }
103581
+ try {
103582
+ const worktreePath = execFileSync3("git", ["rev-parse", "--show-toplevel"], {
103583
+ cwd: resolvedDirectory,
103584
+ encoding: "utf-8",
103585
+ timeout: 5000,
103586
+ stdio: ["pipe", "pipe", "pipe"]
103587
+ }).trim();
103588
+ const normalizedWorktreePath = normalizePath(worktreePath);
103589
+ worktreePathCache2.set(cacheKey, normalizedWorktreePath);
103590
+ return normalizedWorktreePath;
103591
+ } catch (error) {
103592
+ if (!(error instanceof Error)) {
103593
+ throw error;
103594
+ }
103595
+ worktreePathCache2.set(cacheKey, undefined);
103596
+ return;
103597
+ }
103598
+ }
103599
+ // packages/skills-loader-core/src/shared/internal-initiator-marker.ts
103600
+ init_internal_initiator_marker();
103601
+ // packages/skills-loader-core/src/features/opencode-skill-loader/skill-provenance.ts
103602
+ var observers = new Set;
103603
+ function knownUserSkillRoots() {
103604
+ const home = homedir16();
103605
+ return [
103606
+ join73(getClaudeConfigDir(), "skills"),
103607
+ join73(home, ".agents", "skills"),
103608
+ join73(home, ".omo", "agent", "skills"),
103609
+ join73(home, ".senpi", "agent", "skills"),
103610
+ sharedSkillsRootPath(),
103611
+ ...getOpenCodeConfigDirs2({ binary: "opencode" }).flatMap((dir) => [
103612
+ join73(dir, "skills"),
103613
+ join73(dir, "skill")
103614
+ ])
103615
+ ];
103616
+ }
103617
+
103618
+ // packages/skills-loader-core/src/features/opencode-skill-loader/config-source-discovery.ts
103619
+ var sourceOrigins = new WeakMap;
103620
+ function setSkillSourceProvenance(config, provenance) {
103621
+ sourceOrigins.set(config, provenance);
103622
+ }
103623
+
103199
103624
  // packages/omo-opencode/src/config/validate.ts
103200
103625
  init_src4();
103201
- import { relative as relative7 } from "path";
103202
103626
 
103203
103627
  // packages/omo-opencode/src/shared/disabled-providers.ts
103204
103628
  init_config_errors();
@@ -103322,7 +103746,7 @@ function appendViews(views, layers, select, keyPrefix) {
103322
103746
  for (const layer of layers) {
103323
103747
  const config = select(layer.config);
103324
103748
  if (Object.keys(config).length > 0)
103325
- views.push({ config, keyPrefix, path: layer.source.path });
103749
+ views.push({ config, keyPrefix, path: layer.source.path, scope: layer.source.scope });
103326
103750
  }
103327
103751
  }
103328
103752
  function recordFields(value, fields) {
@@ -103852,7 +104276,7 @@ var GitEnvPrefixSchema2 = string2().refine(isValidGitEnvPrefix, { message: GIT_E
103852
104276
  init_zod();
103853
104277
  var GitMasterConfigSchema = object({
103854
104278
  commit_footer: union([boolean2(), string2()]).default(false),
103855
- include_co_authored_by: boolean2().default(false),
104279
+ include_co_authored_by: boolean2().default(true),
103856
104280
  git_env_prefix: GitEnvPrefixSchema2
103857
104281
  });
103858
104282
  // packages/omo-opencode/src/config/schema/hooks.ts
@@ -104161,7 +104585,7 @@ var OhMyOpenCodeConfigSchema = object({
104161
104585
  babysitting: BabysittingConfigSchema.optional(),
104162
104586
  git_master: GitMasterConfigSchema.default({
104163
104587
  commit_footer: false,
104164
- include_co_authored_by: false,
104588
+ include_co_authored_by: true,
104165
104589
  git_env_prefix: "GIT_MASTER=1"
104166
104590
  }),
104167
104591
  browser_automation_engine: BrowserAutomationConfigSchema.optional(),
@@ -104332,6 +104756,28 @@ function validatePluginConfig(directory, environment = process.env) {
104332
104756
  const userConfig = parseConfig(prunePluginView({ config: chain.protectedUserView, homeDir, keyPrefix: "", path: "" }).config);
104333
104757
  const config = applyDisabledProviders(materializeAgentModelChains(protectUserFields(mergeViews(views), userConfig)));
104334
104758
  warnLegacyUlwExecuteKey(chain.views);
104759
+ if (config.skills) {
104760
+ const owner = chain.views.findLast((view) => Object.hasOwn(view.config, "skills"));
104761
+ const userRoots = [...knownUserSkillRoots()];
104762
+ for (const view of chain.views.filter((candidate) => candidate.scope === "user")) {
104763
+ const settings = OhMyOpenCodeConfigSchema.safeParse({ skills: view.config.skills });
104764
+ const skills = settings.success ? settings.data.skills : undefined;
104765
+ if (!skills || Array.isArray(skills))
104766
+ continue;
104767
+ for (const source of skills.sources ?? []) {
104768
+ const path = typeof source === "string" ? source : source.path;
104769
+ if (/^https?:\/\//.test(path))
104770
+ continue;
104771
+ userRoots.push(path.startsWith("~/") ? join74(homeDir ?? "", path.slice(2)) : isAbsolute13(path) ? path : join74(dirname29(view.path), path));
104772
+ }
104773
+ }
104774
+ setSkillSourceProvenance(config.skills, {
104775
+ kind: owner?.scope === "user" ? "user" : "project-auto",
104776
+ selectedRoot: owner ? dirname29(owner.path) : directory,
104777
+ projectRoot: detectWorktreePath(directory) ?? directory,
104778
+ userRoots
104779
+ });
104780
+ }
104335
104781
  return {
104336
104782
  valid: messages.length === 0,
104337
104783
  messages,
@@ -104355,7 +104801,7 @@ var import_picocolors11 = __toESM(require_picocolors(), 1);
104355
104801
  // packages/omo-opencode/src/cli/run/opencode-binary-resolver.ts
104356
104802
  init_bun_which_shim();
104357
104803
  init_spawn_with_windows_hide();
104358
- import { delimiter as delimiter2, dirname as dirname27, posix as posix10, win32 as win326 } from "path";
104804
+ import { delimiter as delimiter2, dirname as dirname30, posix as posix11, win32 as win328 } from "path";
104359
104805
  var OPENCODE_COMMANDS = ["opencode", "opencode-desktop"];
104360
104806
  var WINDOWS_SUFFIXES = ["", ".exe", ".cmd", ".bat", ".ps1"];
104361
104807
  function getCommandCandidates(platform) {
@@ -104365,8 +104811,8 @@ function getCommandCandidates(platform) {
104365
104811
  }
104366
104812
  function getPathTools(platform) {
104367
104813
  if (platform === "win32")
104368
- return win326;
104369
- return posix10;
104814
+ return win328;
104815
+ return posix11;
104370
104816
  }
104371
104817
  function collectCandidateBinaryPaths(pathEnv, which = bunWhich, platform = process.platform) {
104372
104818
  const seen = new Set;
@@ -104413,7 +104859,7 @@ async function findWorkingOpencodeBinary(pathEnv = process.env.PATH, probe = can
104413
104859
  return null;
104414
104860
  }
104415
104861
  function buildPathWithBinaryFirst(pathEnv, binaryPath) {
104416
- const preferredDir = dirname27(binaryPath);
104862
+ const preferredDir = dirname30(binaryPath);
104417
104863
  const existing = (pathEnv ?? "").split(delimiter2).filter((entry) => entry.length > 0 && entry !== preferredDir);
104418
104864
  return [preferredDir, ...existing].join(delimiter2);
104419
104865
  }
@@ -105020,9 +105466,9 @@ function buildTaskRef(section, label) {
105020
105466
  };
105021
105467
  }
105022
105468
  // packages/boulder-state/src/top-level-task.ts
105023
- import { existsSync as existsSync36, readFileSync as readFileSync19 } from "fs";
105469
+ import { existsSync as existsSync38, readFileSync as readFileSync19 } from "fs";
105024
105470
  function readCurrentTopLevelTask(planPath) {
105025
- if (!existsSync36(planPath)) {
105471
+ if (!existsSync38(planPath)) {
105026
105472
  return null;
105027
105473
  }
105028
105474
  try {
@@ -105033,13 +105479,13 @@ function readCurrentTopLevelTask(planPath) {
105033
105479
  }
105034
105480
  }
105035
105481
  // packages/boulder-state/src/storage/path.ts
105036
- import { existsSync as existsSync37 } from "fs";
105037
- import { isAbsolute as isAbsolute13, join as join70, relative as relative8, resolve as resolve21 } from "path";
105482
+ import { existsSync as existsSync39 } from "fs";
105483
+ import { isAbsolute as isAbsolute14, join as join75, relative as relative8, resolve as resolve24 } from "path";
105038
105484
  function getBoulderFilePath(directory) {
105039
- return join70(directory, BOULDER_DIR, BOULDER_FILE);
105485
+ return join75(directory, BOULDER_DIR, BOULDER_FILE);
105040
105486
  }
105041
105487
  function resolveTrackedPath(baseDirectory, trackedPath) {
105042
- return isAbsolute13(trackedPath) ? resolve21(trackedPath) : resolve21(baseDirectory, trackedPath);
105488
+ return isAbsolute14(trackedPath) ? resolve24(trackedPath) : resolve24(baseDirectory, trackedPath);
105043
105489
  }
105044
105490
  function resolveBoulderPlanPath(directory, state) {
105045
105491
  const absolutePlanPath = resolveTrackedPath(directory, state.active_plan);
@@ -105047,22 +105493,22 @@ function resolveBoulderPlanPath(directory, state) {
105047
105493
  if (!worktreePath) {
105048
105494
  return absolutePlanPath;
105049
105495
  }
105050
- const absoluteDirectory = resolve21(directory);
105496
+ const absoluteDirectory = resolve24(directory);
105051
105497
  const relativePlanPath = relative8(absoluteDirectory, absolutePlanPath);
105052
- if (relativePlanPath.length === 0 || relativePlanPath.startsWith("..") || isAbsolute13(relativePlanPath)) {
105498
+ if (relativePlanPath.length === 0 || relativePlanPath.startsWith("..") || isAbsolute14(relativePlanPath)) {
105053
105499
  return absolutePlanPath;
105054
105500
  }
105055
105501
  const absoluteWorktreePath = resolveTrackedPath(directory, worktreePath);
105056
- const worktreePlanPath = resolve21(absoluteWorktreePath, relativePlanPath);
105057
- return existsSync37(worktreePlanPath) ? worktreePlanPath : absolutePlanPath;
105502
+ const worktreePlanPath = resolve24(absoluteWorktreePath, relativePlanPath);
105503
+ return existsSync39(worktreePlanPath) ? worktreePlanPath : absolutePlanPath;
105058
105504
  }
105059
105505
  function resolveBoulderPlanPathForWork(directory, work) {
105060
105506
  return resolveBoulderPlanPath(directory, work);
105061
105507
  }
105062
105508
  // packages/boulder-state/src/storage/plan-progress.ts
105063
- import { existsSync as existsSync38, readFileSync as readFileSync20, readdirSync as readdirSync9, statSync as statSync5 } from "fs";
105509
+ import { existsSync as existsSync40, readFileSync as readFileSync20, readdirSync as readdirSync9, statSync as statSync5 } from "fs";
105064
105510
  function getPlanProgress(planPath) {
105065
- if (!existsSync38(planPath)) {
105511
+ if (!existsSync40(planPath)) {
105066
105512
  return { total: 0, completed: 0, isComplete: false };
105067
105513
  }
105068
105514
  try {
@@ -105145,10 +105591,10 @@ function selectMirrorWork(state) {
105145
105591
  return sorted[0] ?? null;
105146
105592
  }
105147
105593
  // packages/boulder-state/src/storage/read-state.ts
105148
- import { existsSync as existsSync39, readFileSync as readFileSync21 } from "fs";
105594
+ import { existsSync as existsSync41, readFileSync as readFileSync21 } from "fs";
105149
105595
  function readBoulderState(directory) {
105150
105596
  const filePath = getBoulderFilePath(directory);
105151
- if (!existsSync39(filePath)) {
105597
+ if (!existsSync41(filePath)) {
105152
105598
  return null;
105153
105599
  }
105154
105600
  try {
@@ -105220,14 +105666,14 @@ init_state();
105220
105666
  // packages/omo-opencode/src/features/run-continuation-state/constants.ts
105221
105667
  var CONTINUATION_MARKER_DIR = ".omo/run-continuation";
105222
105668
  // packages/omo-opencode/src/features/run-continuation-state/storage.ts
105223
- import { existsSync as existsSync40, mkdirSync as mkdirSync14, readFileSync as readFileSync22, rmSync as rmSync6, writeFileSync as writeFileSync8 } from "fs";
105224
- import { join as join71 } from "path";
105669
+ import { existsSync as existsSync42, mkdirSync as mkdirSync14, readFileSync as readFileSync22, rmSync as rmSync6, writeFileSync as writeFileSync8 } from "fs";
105670
+ import { join as join76 } from "path";
105225
105671
  function getMarkerPath(directory, sessionID) {
105226
- return join71(directory, CONTINUATION_MARKER_DIR, `${sessionID}.json`);
105672
+ return join76(directory, CONTINUATION_MARKER_DIR, `${sessionID}.json`);
105227
105673
  }
105228
105674
  function readContinuationMarker(directory, sessionID) {
105229
105675
  const markerPath = getMarkerPath(directory, sessionID);
105230
- if (!existsSync40(markerPath))
105676
+ if (!existsSync42(markerPath))
105231
105677
  return null;
105232
105678
  try {
105233
105679
  const raw = readFileSync22(markerPath, "utf-8");
@@ -105296,7 +105742,7 @@ async function isSessionInBoulderLineage(input) {
105296
105742
  init_shared();
105297
105743
  init_compaction_marker();
105298
105744
  import { readFileSync as readFileSync23, readdirSync as readdirSync10 } from "fs";
105299
- import { join as join72 } from "path";
105745
+ import { join as join77 } from "path";
105300
105746
  var defaultSessionLastAgentDeps = {
105301
105747
  getMessageDir,
105302
105748
  isSqliteBackend,
@@ -105356,7 +105802,7 @@ async function getLastAgentFromSession(sessionID, client, deps = {}) {
105356
105802
  try {
105357
105803
  const messages = readdirSync10(messageDir).filter((fileName) => fileName.endsWith(".json")).map((fileName) => {
105358
105804
  try {
105359
- const content = readFileSync23(join72(messageDir, fileName), "utf-8");
105805
+ const content = readFileSync23(join77(messageDir, fileName), "utf-8");
105360
105806
  const parsed = JSON.parse(content);
105361
105807
  return {
105362
105808
  fileName,
@@ -105399,8 +105845,8 @@ init_agent_display_names();
105399
105845
 
105400
105846
  // packages/omo-opencode/src/hooks/ralph-loop/storage.ts
105401
105847
  init_frontmatter2();
105402
- import { existsSync as existsSync41, readFileSync as readFileSync24, writeFileSync as writeFileSync9, unlinkSync as unlinkSync6, mkdirSync as mkdirSync15 } from "fs";
105403
- import { dirname as dirname28, join as join73 } from "path";
105848
+ import { existsSync as existsSync43, readFileSync as readFileSync24, writeFileSync as writeFileSync9, unlinkSync as unlinkSync6, mkdirSync as mkdirSync15 } from "fs";
105849
+ import { dirname as dirname31, join as join78 } from "path";
105404
105850
 
105405
105851
  // packages/omo-opencode/src/hooks/ralph-loop/constants.ts
105406
105852
  var DEFAULT_STATE_FILE = ".omo/ralph-loop.local.md";
@@ -105409,11 +105855,11 @@ var DEFAULT_COMPLETION_PROMISE = "DONE";
105409
105855
 
105410
105856
  // packages/omo-opencode/src/hooks/ralph-loop/storage.ts
105411
105857
  function getStateFilePath(directory, customPath) {
105412
- return customPath ? join73(directory, customPath) : join73(directory, DEFAULT_STATE_FILE);
105858
+ return customPath ? join78(directory, customPath) : join78(directory, DEFAULT_STATE_FILE);
105413
105859
  }
105414
105860
  function readState(directory, customPath) {
105415
105861
  const filePath = getStateFilePath(directory, customPath);
105416
- if (!existsSync41(filePath)) {
105862
+ if (!existsSync43(filePath)) {
105417
105863
  return null;
105418
105864
  }
105419
105865
  try {
@@ -106551,14 +106997,14 @@ async function getLocalVersion(options = {}) {
106551
106997
  }
106552
106998
  }
106553
106999
  // packages/omo-opencode/src/cli/doctor/checks/system.ts
106554
- import { existsSync as existsSync52, readFileSync as readFileSync34 } from "fs";
107000
+ import { existsSync as existsSync54, readFileSync as readFileSync34 } from "fs";
106555
107001
 
106556
107002
  // packages/omo-opencode/src/cli/doctor/checks/system-binary.ts
106557
107003
  init_extract_semver();
106558
107004
  init_bun_which_shim();
106559
- import { existsSync as existsSync49, accessSync as accessSync4, constants as constants12 } from "fs";
106560
- import { homedir as homedir16 } from "os";
106561
- import { join as join80 } from "path";
107005
+ import { existsSync as existsSync51, accessSync as accessSync4, constants as constants12 } from "fs";
107006
+ import { homedir as homedir19 } from "os";
107007
+ import { join as join85 } from "path";
106562
107008
 
106563
107009
  // packages/omo-opencode/src/cli/doctor/framework/spawn-with-timeout.ts
106564
107010
  init_spawn_with_windows_hide();
@@ -106645,22 +107091,22 @@ function isExecutable2(path) {
106645
107091
  }
106646
107092
  }
106647
107093
  function getDesktopAppPaths(platform) {
106648
- const home = homedir16();
107094
+ const home = homedir19();
106649
107095
  switch (platform) {
106650
107096
  case "darwin":
106651
107097
  return [
106652
107098
  "/Applications/OpenCode.app/Contents/MacOS/OpenCode",
106653
- join80(home, "Applications", "OpenCode.app", "Contents", "MacOS", "OpenCode")
107099
+ join85(home, "Applications", "OpenCode.app", "Contents", "MacOS", "OpenCode")
106654
107100
  ];
106655
107101
  case "win32": {
106656
107102
  const programFiles = process.env.ProgramFiles;
106657
107103
  const localAppData = process.env.LOCALAPPDATA;
106658
107104
  const paths = [];
106659
107105
  if (programFiles) {
106660
- paths.push(join80(programFiles, "OpenCode", "OpenCode.exe"));
107106
+ paths.push(join85(programFiles, "OpenCode", "OpenCode.exe"));
106661
107107
  }
106662
107108
  if (localAppData) {
106663
- paths.push(join80(localAppData, "OpenCode", "OpenCode.exe"));
107109
+ paths.push(join85(localAppData, "OpenCode", "OpenCode.exe"));
106664
107110
  }
106665
107111
  return paths;
106666
107112
  }
@@ -106668,8 +107114,8 @@ function getDesktopAppPaths(platform) {
106668
107114
  return [
106669
107115
  "/usr/bin/opencode",
106670
107116
  "/usr/lib/opencode/opencode",
106671
- join80(home, "Applications", "opencode-desktop-linux-x86_64.AppImage"),
106672
- join80(home, "Applications", "opencode-desktop-linux-aarch64.AppImage")
107117
+ join85(home, "Applications", "opencode-desktop-linux-x86_64.AppImage"),
107118
+ join85(home, "Applications", "opencode-desktop-linux-aarch64.AppImage")
106673
107119
  ];
106674
107120
  default:
106675
107121
  return [];
@@ -106681,7 +107127,7 @@ function buildVersionCommand(binaryPath, platform) {
106681
107127
  }
106682
107128
  return [binaryPath, "--version"];
106683
107129
  }
106684
- function findDesktopBinary(platform = process.platform, checkExists = existsSync49) {
107130
+ function findDesktopBinary(platform = process.platform, checkExists = existsSync51) {
106685
107131
  for (const desktopPath of getDesktopAppPaths(platform)) {
106686
107132
  if (checkExists(desktopPath)) {
106687
107133
  return { binary: "opencode", path: desktopPath };
@@ -106689,7 +107135,7 @@ function findDesktopBinary(platform = process.platform, checkExists = existsSync
106689
107135
  }
106690
107136
  return null;
106691
107137
  }
106692
- async function findOpenCodeBinary(platform = process.platform, checkExists = existsSync49) {
107138
+ async function findOpenCodeBinary(platform = process.platform, checkExists = existsSync51) {
106693
107139
  for (const binary of OPENCODE_BINARIES2) {
106694
107140
  const path = bunWhich(binary);
106695
107141
  if (path && checkExists(path)) {
@@ -106701,7 +107147,7 @@ async function findOpenCodeBinary(platform = process.platform, checkExists = exi
106701
107147
  const candidates = getCommandCandidates2(platform);
106702
107148
  for (const entry of pathEnv.split(delimiter).filter(Boolean)) {
106703
107149
  for (const command of candidates) {
106704
- const fullPath = join80(entry, command);
107150
+ const fullPath = join85(entry, command);
106705
107151
  if (checkExists(fullPath) && isExecutable2(fullPath)) {
106706
107152
  return { binary: command, path: fullPath };
106707
107153
  }
@@ -106747,12 +107193,12 @@ function compareVersions3(current, minimum) {
106747
107193
 
106748
107194
  // packages/omo-opencode/src/cli/doctor/checks/system-plugin.ts
106749
107195
  init_shared();
106750
- import { existsSync as existsSync50, readFileSync as readFileSync32 } from "fs";
107196
+ import { existsSync as existsSync52, readFileSync as readFileSync32 } from "fs";
106751
107197
  function detectConfigPath() {
106752
107198
  const paths = getOpenCodeConfigPaths({ binary: "opencode", version: null });
106753
- if (existsSync50(paths.configJsonc))
107199
+ if (existsSync52(paths.configJsonc))
106754
107200
  return paths.configJsonc;
106755
- if (existsSync50(paths.configJson))
107201
+ if (existsSync52(paths.configJson))
106756
107202
  return paths.configJson;
106757
107203
  return null;
106758
107204
  }
@@ -106842,36 +107288,36 @@ init_file_utils2();
106842
107288
  init_checker();
106843
107289
  init_auto_update_checker();
106844
107290
  init_package_json_locator();
106845
- import { existsSync as existsSync51, readFileSync as readFileSync33, readdirSync as readdirSync12 } from "fs";
107291
+ import { existsSync as existsSync53, readFileSync as readFileSync33, readdirSync as readdirSync12 } from "fs";
106846
107292
  import { createRequire } from "module";
106847
- import { homedir as homedir17 } from "os";
106848
- import { join as join81 } from "path";
107293
+ import { homedir as homedir20 } from "os";
107294
+ import { join as join86 } from "path";
106849
107295
  import { fileURLToPath as fileURLToPath6 } from "url";
106850
107296
  init_shared();
106851
107297
  function getPlatformDefaultCacheDir(platform = process.platform) {
106852
107298
  if (platform === "darwin")
106853
- return join81(homedir17(), "Library", "Caches");
107299
+ return join86(homedir20(), "Library", "Caches");
106854
107300
  if (platform === "win32")
106855
- return process.env.LOCALAPPDATA ?? join81(homedir17(), "AppData", "Local");
106856
- return join81(homedir17(), ".cache");
107301
+ return process.env.LOCALAPPDATA ?? join86(homedir20(), "AppData", "Local");
107302
+ return join86(homedir20(), ".cache");
106857
107303
  }
106858
107304
  function resolveOpenCodeCacheDir() {
106859
107305
  const xdgCacheHome = process.env.XDG_CACHE_HOME;
106860
107306
  if (xdgCacheHome)
106861
- return join81(xdgCacheHome, "opencode");
107307
+ return join86(xdgCacheHome, "opencode");
106862
107308
  const fromShared = getOpenCodeCacheDir();
106863
- const platformDefault = join81(getPlatformDefaultCacheDir(), "opencode");
106864
- if (existsSync51(fromShared) || !existsSync51(platformDefault))
107309
+ const platformDefault = join86(getPlatformDefaultCacheDir(), "opencode");
107310
+ if (existsSync53(fromShared) || !existsSync53(platformDefault))
106865
107311
  return fromShared;
106866
107312
  return platformDefault;
106867
107313
  }
106868
107314
  function resolveExistingDir(dirPath) {
106869
- if (!existsSync51(dirPath))
107315
+ if (!existsSync53(dirPath))
106870
107316
  return dirPath;
106871
107317
  return resolveSymlink(dirPath);
106872
107318
  }
106873
107319
  function readPackageJson(filePath) {
106874
- if (!existsSync51(filePath))
107320
+ if (!existsSync53(filePath))
106875
107321
  return null;
106876
107322
  try {
106877
107323
  const content = readFileSync33(filePath, "utf-8");
@@ -106892,26 +107338,26 @@ function normalizeVersion(value) {
106892
107338
  function createPackageCandidates(rootDir) {
106893
107339
  return ACCEPTED_PACKAGE_NAMES.map((packageName) => ({
106894
107340
  packageName,
106895
- installedPackagePath: join81(rootDir, "node_modules", packageName, "package.json")
107341
+ installedPackagePath: join86(rootDir, "node_modules", packageName, "package.json")
106896
107342
  }));
106897
107343
  }
106898
107344
  function createTaggedInstallCandidates(rootDir) {
106899
- const packagesDir = join81(rootDir, "packages");
106900
- if (!existsSync51(packagesDir))
107345
+ const packagesDir = join86(rootDir, "packages");
107346
+ if (!existsSync53(packagesDir))
106901
107347
  return [];
106902
107348
  const candidates = [];
106903
107349
  for (const entryName of readdirSync12(packagesDir).sort()) {
106904
107350
  const packageName = ACCEPTED_PACKAGE_NAMES.find((name) => entryName.startsWith(`${name}@`));
106905
107351
  if (packageName === undefined)
106906
107352
  continue;
106907
- const installDir = join81(packagesDir, entryName);
107353
+ const installDir = join86(packagesDir, entryName);
106908
107354
  candidates.push({
106909
107355
  cacheDir: installDir,
106910
- cachePackagePath: join81(installDir, "package.json"),
107356
+ cachePackagePath: join86(installDir, "package.json"),
106911
107357
  packageCandidates: [
106912
107358
  {
106913
107359
  packageName,
106914
- installedPackagePath: join81(installDir, "node_modules", packageName, "package.json")
107360
+ installedPackagePath: join86(installDir, "node_modules", packageName, "package.json")
106915
107361
  }
106916
107362
  ]
106917
107363
  });
@@ -106919,7 +107365,7 @@ function createTaggedInstallCandidates(rootDir) {
106919
107365
  return candidates;
106920
107366
  }
106921
107367
  function selectInstalledPackage(candidate) {
106922
- return candidate.packageCandidates.find((packageCandidate) => existsSync51(packageCandidate.installedPackagePath)) ?? candidate.packageCandidates[0];
107368
+ return candidate.packageCandidates.find((packageCandidate) => existsSync53(packageCandidate.installedPackagePath)) ?? candidate.packageCandidates[0];
106923
107369
  }
106924
107370
  function getExpectedVersion(cachePackage, packageName) {
106925
107371
  return normalizeVersion(cachePackage?.dependencies?.[packageName]) ?? normalizeVersion(cachePackage?.dependencies?.[PACKAGE_NAME]);
@@ -106930,7 +107376,7 @@ function resolveInstalledPackageJsonPath() {
106930
107376
  for (const packageName of ACCEPTED_PACKAGE_NAMES) {
106931
107377
  try {
106932
107378
  const packageJsonPath = require2.resolve(`${packageName}/package.json`);
106933
- if (existsSync51(packageJsonPath)) {
107379
+ if (existsSync53(packageJsonPath)) {
106934
107380
  return { packageName, packageJsonPath };
106935
107381
  }
106936
107382
  } catch {
@@ -106956,22 +107402,22 @@ function getLoadedPluginVersion() {
106956
107402
  const candidates = [
106957
107403
  {
106958
107404
  cacheDir: configDir,
106959
- cachePackagePath: join81(configDir, "package.json"),
107405
+ cachePackagePath: join86(configDir, "package.json"),
106960
107406
  packageCandidates: createPackageCandidates(configDir)
106961
107407
  },
106962
107408
  ...createTaggedInstallCandidates(configDir),
106963
107409
  {
106964
107410
  cacheDir,
106965
- cachePackagePath: join81(cacheDir, "package.json"),
107411
+ cachePackagePath: join86(cacheDir, "package.json"),
106966
107412
  packageCandidates: createPackageCandidates(cacheDir)
106967
107413
  },
106968
107414
  ...createTaggedInstallCandidates(cacheDir)
106969
107415
  ];
106970
- const selectedCandidate = candidates.find((candidate) => candidate.packageCandidates.some((packageCandidate) => existsSync51(packageCandidate.installedPackagePath))) ?? candidates[0];
107416
+ const selectedCandidate = candidates.find((candidate) => candidate.packageCandidates.some((packageCandidate) => existsSync53(packageCandidate.installedPackagePath))) ?? candidates[0];
106971
107417
  const { cacheDir: selectedDir, cachePackagePath } = selectedCandidate;
106972
107418
  const selectedPackage = selectInstalledPackage(selectedCandidate);
106973
107419
  const candidateInstalledPath = selectedPackage.installedPackagePath;
106974
- const candidateExists = existsSync51(candidateInstalledPath);
107420
+ const candidateExists = existsSync53(candidateInstalledPath);
106975
107421
  const resolvedFallback = candidateExists ? null : resolveInstalledPackageJsonPath();
106976
107422
  const installedPackagePath = resolvedFallback?.packageJsonPath ?? candidateInstalledPath;
106977
107423
  const resolvedPackageName = resolvedFallback?.packageName ?? selectedPackage.packageName;
@@ -107007,7 +107453,7 @@ var defaultDeps5 = {
107007
107453
  getLoadedPluginVersion,
107008
107454
  getLatestPluginVersion,
107009
107455
  getSuggestedInstallTag,
107010
- configExists: existsSync52,
107456
+ configExists: existsSync54,
107011
107457
  readConfigFile: (path) => readFileSync34(path, "utf-8"),
107012
107458
  parseConfigContent: (content) => parseJsonc(content)
107013
107459
  };
@@ -107153,23 +107599,23 @@ async function checkSystem(deps = defaultDeps5) {
107153
107599
 
107154
107600
  // packages/omo-opencode/src/cli/doctor/checks/model-resolution-cache.ts
107155
107601
  init_shared();
107156
- import { existsSync as existsSync53, readFileSync as readFileSync35 } from "fs";
107157
- import { homedir as homedir18 } from "os";
107158
- import { join as join82 } from "path";
107602
+ import { existsSync as existsSync55, readFileSync as readFileSync35 } from "fs";
107603
+ import { homedir as homedir21 } from "os";
107604
+ import { join as join87 } from "path";
107159
107605
  function getUserConfigDir2() {
107160
107606
  const xdgConfig = process.env.XDG_CONFIG_HOME;
107161
107607
  if (xdgConfig)
107162
- return join82(xdgConfig, "opencode");
107163
- return join82(homedir18(), ".config", "opencode");
107608
+ return join87(xdgConfig, "opencode");
107609
+ return join87(homedir21(), ".config", "opencode");
107164
107610
  }
107165
107611
  function loadCustomProviderNames() {
107166
107612
  const configDir = getUserConfigDir2();
107167
107613
  const candidatePaths = [
107168
- join82(configDir, "opencode.json"),
107169
- join82(configDir, "opencode.jsonc")
107614
+ join87(configDir, "opencode.json"),
107615
+ join87(configDir, "opencode.jsonc")
107170
107616
  ];
107171
107617
  for (const configPath of candidatePaths) {
107172
- if (!existsSync53(configPath))
107618
+ if (!existsSync55(configPath))
107173
107619
  continue;
107174
107620
  try {
107175
107621
  const content = readFileSync35(configPath, "utf-8");
@@ -107187,9 +107633,9 @@ function loadCustomProviderNames() {
107187
107633
  return [];
107188
107634
  }
107189
107635
  function loadAvailableModelsFromCache() {
107190
- const cacheFile = join82(getOpenCodeCacheDir(), "models.json");
107636
+ const cacheFile = join87(getOpenCodeCacheDir(), "models.json");
107191
107637
  const customProviders = loadCustomProviderNames();
107192
- if (!existsSync53(cacheFile)) {
107638
+ if (!existsSync55(cacheFile)) {
107193
107639
  if (customProviders.length > 0) {
107194
107640
  return { providers: customProviders, modelCount: 0, cacheExists: true };
107195
107641
  }
@@ -107249,7 +107695,7 @@ function loadOmoConfig2() {
107249
107695
 
107250
107696
  // packages/omo-opencode/src/cli/doctor/checks/model-resolution-details.ts
107251
107697
  init_shared();
107252
- import { join as join83 } from "path";
107698
+ import { join as join88 } from "path";
107253
107699
 
107254
107700
  // packages/omo-opencode/src/cli/doctor/checks/model-resolution-variant.ts
107255
107701
  function formatModelWithVariant(model, variant) {
@@ -107291,7 +107737,7 @@ function formatCapabilityResolutionLabel(mode) {
107291
107737
  }
107292
107738
  function buildModelResolutionDetails(options) {
107293
107739
  const details = [];
107294
- const cacheFile = join83(getOpenCodeCacheDir(), "models.json");
107740
+ const cacheFile = join88(getOpenCodeCacheDir(), "models.json");
107295
107741
  details.push("\u2550\u2550\u2550 Available Models (from cache) \u2550\u2550\u2550");
107296
107742
  details.push("");
107297
107743
  if (options.available.cacheExists) {
@@ -107447,9 +107893,9 @@ async function checkModels() {
107447
107893
 
107448
107894
  // packages/omo-opencode/src/cli/doctor/checks/legacy-config-leftovers.ts
107449
107895
  init_config_migration();
107450
- import { posix as posix11, win32 as win327 } from "path";
107896
+ import { posix as posix12, win32 as win329 } from "path";
107451
107897
  function findLegacyConfigLeftovers(options) {
107452
- const pathOperations = options.pathOperations ?? (process.platform === "win32" ? win327 : posix11);
107898
+ const pathOperations = options.pathOperations ?? (process.platform === "win32" ? win329 : posix12);
107453
107899
  const paths = createLegacyConfigMigrationPlans({
107454
107900
  cwd: options.cwd,
107455
107901
  environment: options.environment ?? process.env,
@@ -107638,8 +108084,8 @@ async function checkBrowserProvider() {
107638
108084
  init_src4();
107639
108085
  init_main();
107640
108086
  init_config_migration();
107641
- import { existsSync as existsSync54, readFileSync as readFileSync36 } from "fs";
107642
- import { join as join84 } from "path";
108087
+ import { existsSync as existsSync56, readFileSync as readFileSync36 } from "fs";
108088
+ import { join as join89 } from "path";
107643
108089
  var CANONICAL_REPLACEMENT = new Map([
107644
108090
  ["variant", "reasoning"],
107645
108091
  ["reasoningEffort", "reasoning"],
@@ -107700,13 +108146,13 @@ function userConfigPaths() {
107700
108146
  const home = process.env.HOME ?? process.env.USERPROFILE;
107701
108147
  if (home === undefined || home.length === 0)
107702
108148
  return [];
107703
- return [join84(home, ".omo", "omo.jsonc"), join84(home, ".omo", "omo.json")];
108149
+ return [join89(home, ".omo", "omo.jsonc"), join89(home, ".omo", "omo.json")];
107704
108150
  }
107705
108151
  async function checkDeprecatedReasoningKeys() {
107706
108152
  const issues = [];
107707
108153
  const scanned = [];
107708
108154
  for (const configPath of userConfigPaths()) {
107709
- if (!existsSync54(configPath))
108155
+ if (!existsSync56(configPath))
107710
108156
  continue;
107711
108157
  scanned.push(configPath);
107712
108158
  const parsed = parse2(readFileSync36(configPath, "utf-8"));
@@ -107722,12 +108168,12 @@ async function checkDeprecatedReasoningKeys() {
107722
108168
  }
107723
108169
 
107724
108170
  // packages/omo-opencode/src/cli/doctor/checks/dependencies.ts
107725
- import { existsSync as existsSync55 } from "fs";
108171
+ import { existsSync as existsSync57 } from "fs";
107726
108172
  import { createRequire as createRequire3 } from "module";
107727
- import { homedir as homedir20 } from "os";
107728
- import { join as join89 } from "path";
108173
+ import { homedir as homedir23 } from "os";
108174
+ import { join as join94 } from "path";
107729
108175
  // packages/comment-checker-core/src/release.ts
107730
- import { join as join85 } from "path";
108176
+ import { join as join90 } from "path";
107731
108177
  var COMMENT_CHECKER_RELEASE_VERSION = "0.8.0";
107732
108178
  function commentCheckerBinaryName(platform) {
107733
108179
  return platform === "win32" ? "comment-checker.exe" : "comment-checker";
@@ -107735,26 +108181,26 @@ function commentCheckerBinaryName(platform) {
107735
108181
  function commentCheckerCacheDir(input) {
107736
108182
  if (input.platform === "win32") {
107737
108183
  const localAppData = input.env.LOCALAPPDATA || input.env.APPDATA;
107738
- const base = localAppData || join85(input.homedir, "AppData", "Local");
107739
- return join85(base, input.cacheDirName, "bin");
108184
+ const base = localAppData || join90(input.homedir, "AppData", "Local");
108185
+ return join90(base, input.cacheDirName, "bin");
107740
108186
  }
107741
- const base = input.env.XDG_CACHE_HOME || join85(input.homedir, ".cache");
107742
- return join85(base, input.cacheDirName, "bin");
108187
+ const base = input.env.XDG_CACHE_HOME || join90(input.homedir, ".cache");
108188
+ return join90(base, input.cacheDirName, "bin");
107743
108189
  }
107744
108190
  // packages/comment-checker-core/src/cached-release.ts
107745
108191
  import { readFileSync as readFileSync37, writeFileSync as writeFileSync12 } from "fs";
107746
- import { join as join86 } from "path";
108192
+ import { join as join91 } from "path";
107747
108193
  var COMMENT_CHECKER_VERSION_MARKER = "comment-checker.version";
107748
108194
  function isCachedCommentCheckerCurrent(cacheDir, readFile = (path) => readFileSync37(path, "utf-8")) {
107749
108195
  try {
107750
- return readFile(join86(cacheDir, COMMENT_CHECKER_VERSION_MARKER)).trim() === COMMENT_CHECKER_RELEASE_VERSION;
108196
+ return readFile(join91(cacheDir, COMMENT_CHECKER_VERSION_MARKER)).trim() === COMMENT_CHECKER_RELEASE_VERSION;
107751
108197
  } catch {
107752
108198
  return false;
107753
108199
  }
107754
108200
  }
107755
108201
  // packages/comment-checker-core/src/package-binary.ts
107756
108202
  import { createRequire as createRequire2 } from "module";
107757
- import { dirname as dirname33, join as join87 } from "path";
108203
+ import { dirname as dirname36, join as join92 } from "path";
107758
108204
  var COMMENT_CHECKER_PACKAGE_NAME = "@code-yeongyu/comment-checker";
107759
108205
  function isModuleResolutionMiss(error) {
107760
108206
  return error instanceof Error || typeof error === "object" && error !== null && "name" in error && error.name === "ResolveMessage";
@@ -107762,18 +108208,18 @@ function isModuleResolutionMiss(error) {
107762
108208
  function findCommentCheckerPackageBinary(input) {
107763
108209
  const packageName = input.packageName ?? COMMENT_CHECKER_PACKAGE_NAME;
107764
108210
  const platformKey = `${input.platform ?? process.platform}-${input.arch ?? process.arch}`;
107765
- const packageDir = dirname33(input.packageJsonPath);
108211
+ const packageDir = dirname36(input.packageJsonPath);
107766
108212
  const candidates = [
107767
108213
  resolvePlatformPackageBinary(input.packageJsonPath, `${packageName}-${platformKey}`, input.binaryName),
107768
- join87(packageDir, "vendor", platformKey, input.binaryName),
107769
- join87(packageDir, "bin", input.binaryName)
108214
+ join92(packageDir, "vendor", platformKey, input.binaryName),
108215
+ join92(packageDir, "bin", input.binaryName)
107770
108216
  ];
107771
108217
  return candidates.find((candidate) => candidate !== null && input.existsSync(candidate)) ?? null;
107772
108218
  }
107773
108219
  function resolvePlatformPackageBinary(packageJsonPath, platformPackageName, binaryName) {
107774
108220
  try {
107775
108221
  const manifestPath = createRequire2(packageJsonPath).resolve(`${platformPackageName}/package.json`);
107776
- return join87(dirname33(manifestPath), "bin", binaryName);
108222
+ return join92(dirname36(manifestPath), "bin", binaryName);
107777
108223
  } catch (error) {
107778
108224
  if (isModuleResolutionMiss(error))
107779
108225
  return null;
@@ -107784,18 +108230,18 @@ function resolvePlatformPackageBinary(packageJsonPath, platformPackageName, bina
107784
108230
  init_src();
107785
108231
 
107786
108232
  // packages/omo-opencode/src/hooks/comment-checker/downloader.ts
107787
- import { join as join88 } from "path";
107788
- import { homedir as homedir19, tmpdir as tmpdir4 } from "os";
108233
+ import { join as join93 } from "path";
108234
+ import { homedir as homedir22, tmpdir as tmpdir4 } from "os";
107789
108235
  init_binary_downloader();
107790
108236
  init_logger2();
107791
108237
  init_plugin_identity();
107792
108238
  var DEBUG = process.env.COMMENT_CHECKER_DEBUG === "1";
107793
- var DEBUG_FILE = join88(tmpdir4(), "comment-checker-debug.log");
108239
+ var DEBUG_FILE = join93(tmpdir4(), "comment-checker-debug.log");
107794
108240
  function getCacheDir2() {
107795
108241
  return commentCheckerCacheDir({
107796
108242
  platform: process.platform,
107797
108243
  env: process.env,
107798
- homedir: homedir19(),
108244
+ homedir: homedir22(),
107799
108245
  cacheDirName: CACHE_DIR_NAME
107800
108246
  });
107801
108247
  }
@@ -107849,7 +108295,7 @@ async function getBinaryVersion(binary) {
107849
108295
  }
107850
108296
  }
107851
108297
  async function checkAstGrepCli() {
107852
- const runtimeDir = astGrepRuntimeDir(join89(homedir20(), ".omo"));
108298
+ const runtimeDir = astGrepRuntimeDir(join94(homedir23(), ".omo"));
107853
108299
  const sgPath = findSgBinarySync({ runtimeDir });
107854
108300
  if (sgPath === null) {
107855
108301
  return {
@@ -107877,8 +108323,8 @@ function resolveCommentCheckerPackageJson() {
107877
108323
  function findCommentCheckerPackageBinary2(baseDirOverride, resolvePackageJsonPath = resolveCommentCheckerPackageJson) {
107878
108324
  const binaryName = process.platform === "win32" ? "comment-checker.exe" : "comment-checker";
107879
108325
  try {
107880
- const packageJsonPath = baseDirOverride === undefined ? resolvePackageJsonPath() : join89(baseDirOverride, "package.json");
107881
- return findCommentCheckerPackageBinary({ packageJsonPath, binaryName, existsSync: existsSync55 });
108326
+ const packageJsonPath = baseDirOverride === undefined ? resolvePackageJsonPath() : join94(baseDirOverride, "package.json");
108327
+ return findCommentCheckerPackageBinary({ packageJsonPath, binaryName, existsSync: existsSync57 });
107882
108328
  } catch (error) {
107883
108329
  if (!(error instanceof Error) && !isModuleResolutionFailure(error))
107884
108330
  throw error;
@@ -108023,8 +108469,8 @@ async function getGhCliInfo(dependencies = {}) {
108023
108469
  // packages/omo-opencode/src/mcp/lsp.ts
108024
108470
  init_zod();
108025
108471
  init_opencode_config_dir();
108026
- import { existsSync as existsSync56, readFileSync as readFileSync38 } from "fs";
108027
- import { delimiter as delimiter3, dirname as dirname35, resolve as resolve23 } from "path";
108472
+ import { existsSync as existsSync58, readFileSync as readFileSync38 } from "fs";
108473
+ import { delimiter as delimiter3, dirname as dirname38, resolve as resolve26 } from "path";
108028
108474
  import { fileURLToPath as fileURLToPath7 } from "url";
108029
108475
 
108030
108476
  // packages/omo-opencode/src/mcp/cli-suffix.ts
@@ -108037,7 +108483,7 @@ function hasCliSuffix(candidatePath, suffix) {
108037
108483
 
108038
108484
  // packages/omo-opencode/src/mcp/runtime-executable.ts
108039
108485
  init_bun_which_shim();
108040
- import { basename as basename11 } from "path";
108486
+ import { basename as basename12 } from "path";
108041
108487
  var NODE_EXECUTABLE_NAMES = new Set(["node", "node.exe"]);
108042
108488
  function isUnsafeCommandName2(commandName) {
108043
108489
  if (commandName.length === 0)
@@ -108053,7 +108499,7 @@ function isUnsafeCommandName2(commandName) {
108053
108499
  return false;
108054
108500
  }
108055
108501
  function isNodeExecPath(execPath) {
108056
- return NODE_EXECUTABLE_NAMES.has(basename11(execPath).toLowerCase());
108502
+ return NODE_EXECUTABLE_NAMES.has(basename12(execPath).toLowerCase());
108057
108503
  }
108058
108504
  function resolveRuntimeExecutable(commandName, options = {}) {
108059
108505
  if (isUnsafeCommandName2(commandName)) {
@@ -108071,7 +108517,7 @@ function resolveRuntimeExecutable(commandName, options = {}) {
108071
108517
  }
108072
108518
 
108073
108519
  // packages/omo-opencode/src/mcp/shared/ancestor-cli-resolver.ts
108074
- import { resolve as resolve22 } from "path";
108520
+ import { resolve as resolve25 } from "path";
108075
108521
  function resolveJavaScriptRuntime(resolveExecutable) {
108076
108522
  const node = resolveExecutable("node");
108077
108523
  return node.available ? node : resolveExecutable("bun");
@@ -108079,9 +108525,9 @@ function resolveJavaScriptRuntime(resolveExecutable) {
108079
108525
  function createAncestorCliCandidates(options) {
108080
108526
  const candidates = [];
108081
108527
  const seenPaths = new Set;
108082
- let currentDirectory = resolve22(options.startDirectory);
108528
+ let currentDirectory = resolve25(options.startDirectory);
108083
108529
  while (true) {
108084
- const distCliPath = resolve22(currentDirectory, options.packageRel, options.distCliRel);
108530
+ const distCliPath = resolve25(currentDirectory, options.packageRel, options.distCliRel);
108085
108531
  if (!seenPaths.has(distCliPath)) {
108086
108532
  const runtime = resolveJavaScriptRuntime(options.resolveExecutable);
108087
108533
  seenPaths.add(distCliPath);
@@ -108093,7 +108539,7 @@ function createAncestorCliCandidates(options) {
108093
108539
  runtimeAvailable: runtime.available
108094
108540
  });
108095
108541
  }
108096
- const sourceCliPath = resolve22(currentDirectory, options.packageRel, options.sourceCliRel);
108542
+ const sourceCliPath = resolve25(currentDirectory, options.packageRel, options.sourceCliRel);
108097
108543
  if (!seenPaths.has(sourceCliPath)) {
108098
108544
  const runtime = options.resolveExecutable("bun");
108099
108545
  const sourceCandidateAvailable = options.isSourceCandidateAvailable?.({
@@ -108110,7 +108556,7 @@ function createAncestorCliCandidates(options) {
108110
108556
  runtimeAvailable: runtime.available
108111
108557
  });
108112
108558
  }
108113
- const parentDirectory = resolve22(currentDirectory, "..");
108559
+ const parentDirectory = resolve25(currentDirectory, "..");
108114
108560
  if (parentDirectory === currentDirectory)
108115
108561
  return candidates;
108116
108562
  currentDirectory = parentDirectory;
@@ -108155,7 +108601,7 @@ var LSP_BOOTSTRAP_SCRIPT = [
108155
108601
  ].join(";");
108156
108602
  function getModuleDirectory(moduleUrl) {
108157
108603
  try {
108158
- return dirname35(fileURLToPath7(moduleUrl));
108604
+ return dirname38(fileURLToPath7(moduleUrl));
108159
108605
  } catch (error) {
108160
108606
  if (!(error instanceof Error))
108161
108607
  throw error;
@@ -108163,11 +108609,11 @@ function getModuleDirectory(moduleUrl) {
108163
108609
  }
108164
108610
  }
108165
108611
  function findBootstrapRoot(candidates, pathExists) {
108166
- return candidates.find((candidate) => pathExists(resolve23(candidate.root, "package.json")))?.root ?? process.cwd();
108612
+ return candidates.find((candidate) => pathExists(resolve26(candidate.root, "package.json")))?.root ?? process.cwd();
108167
108613
  }
108168
108614
  function readDaemonPackageVersion(root) {
108169
108615
  try {
108170
- const packageJson = JSON.parse(readFileSync38(resolve23(root, PACKAGE_REL, "package.json"), "utf-8"));
108616
+ const packageJson = JSON.parse(readFileSync38(resolve26(root, PACKAGE_REL, "package.json"), "utf-8"));
108171
108617
  return DaemonPackageSchema.parse(packageJson).version;
108172
108618
  } catch (error) {
108173
108619
  if (!(error instanceof Error))
@@ -108179,17 +108625,17 @@ function createBootstrapCandidate(root, pathExists, resolveExecutable) {
108179
108625
  const runtime = resolveJavaScriptRuntime(resolveExecutable);
108180
108626
  const bun = resolveExecutable("bun");
108181
108627
  const npm = resolveExecutable("npm");
108182
- const packageManifestPath = resolve23(root, PACKAGE_REL, "package.json");
108628
+ const packageManifestPath = resolve26(root, PACKAGE_REL, "package.json");
108183
108629
  return {
108184
108630
  command: [runtime.command, "-e", LSP_BOOTSTRAP_SCRIPT, root, npm.command, bun.command],
108185
108631
  root,
108186
- path: resolve23(root, PACKAGE_REL, DIST_CLI_REL),
108632
+ path: resolve26(root, PACKAGE_REL, DIST_CLI_REL),
108187
108633
  exists: runtime.available && npm.available && pathExists(packageManifestPath),
108188
108634
  runtimeAvailable: runtime.available
108189
108635
  };
108190
108636
  }
108191
108637
  function resolveLspCommand(options = {}) {
108192
- const pathExists = options.exists ?? existsSync56;
108638
+ const pathExists = options.exists ?? existsSync58;
108193
108639
  const resolveExecutable = options.resolveExecutable ?? resolveRuntimeExecutable;
108194
108640
  const moduleDirectory = getModuleDirectory(options.moduleUrl ?? import.meta.url);
108195
108641
  const candidates = moduleDirectory ? createAncestorCliCandidates({
@@ -108199,7 +108645,7 @@ function resolveLspCommand(options = {}) {
108199
108645
  sourceCliRel: SOURCE_CLI_REL,
108200
108646
  pathExists,
108201
108647
  resolveExecutable,
108202
- isSourceCandidateAvailable: ({ root }) => pathExists(resolve23(root, LSP_TOOLS_PACKAGE_REL, DIST_CLI_REL)) && readDaemonPackageVersion(root) !== null
108648
+ isSourceCandidateAvailable: ({ root }) => pathExists(resolve26(root, LSP_TOOLS_PACKAGE_REL, DIST_CLI_REL)) && readDaemonPackageVersion(root) !== null
108203
108649
  }) : [];
108204
108650
  const distCandidate = candidates.find((candidate) => hasCliSuffix(candidate.path, DIST_CLI_REL) && candidate.exists);
108205
108651
  if (distCandidate) {
@@ -108213,7 +108659,7 @@ function resolveLspCommand(options = {}) {
108213
108659
  }
108214
108660
  function createLspMcpConfig(options = {}) {
108215
108661
  const resolvedCommand = resolveLspCommand(options);
108216
- const cwd = resolve23(options.cwd ?? process.cwd());
108662
+ const cwd = resolve26(options.cwd ?? process.cwd());
108217
108663
  const configDir = getOpenCodeConfigDir({ binary: "opencode" });
108218
108664
  const sourceVersion = hasCliSuffix(resolvedCommand.path, SOURCE_CLI_REL) ? readDaemonPackageVersion(resolvedCommand.root) : null;
108219
108665
  return {
@@ -108223,9 +108669,9 @@ function createLspMcpConfig(options = {}) {
108223
108669
  cwd,
108224
108670
  environment: {
108225
108671
  LSP_TOOLS_MCP_CWD: cwd,
108226
- LSP_TOOLS_MCP_PROJECT_CONFIG: PROJECT_LSP_CONFIGS.map((configPath) => resolve23(cwd, configPath)).join(delimiter3),
108227
- LSP_TOOLS_MCP_USER_CONFIG: resolve23(configDir, "lsp.json"),
108228
- LSP_TOOLS_MCP_INSTALL_DECISIONS: resolve23(configDir, "lsp-install-decisions.json"),
108672
+ LSP_TOOLS_MCP_PROJECT_CONFIG: PROJECT_LSP_CONFIGS.map((configPath) => resolve26(cwd, configPath)).join(delimiter3),
108673
+ LSP_TOOLS_MCP_USER_CONFIG: resolve26(configDir, "lsp.json"),
108674
+ LSP_TOOLS_MCP_INSTALL_DECISIONS: resolve26(configDir, "lsp-install-decisions.json"),
108229
108675
  ...sourceVersion ? {
108230
108676
  [OMO_LSP_DAEMON_CLI]: resolvedCommand.path,
108231
108677
  [OMO_LSP_DAEMON_VERSION]: sourceVersion
@@ -108250,21 +108696,21 @@ function getInstalledLspServers(options = {}) {
108250
108696
 
108251
108697
  // packages/omo-opencode/src/cli/doctor/checks/tools-mcp.ts
108252
108698
  init_shared();
108253
- import { existsSync as existsSync57, readFileSync as readFileSync39 } from "fs";
108254
- import { homedir as homedir21 } from "os";
108255
- import { join as join90 } from "path";
108699
+ import { existsSync as existsSync59, readFileSync as readFileSync39 } from "fs";
108700
+ import { homedir as homedir24 } from "os";
108701
+ import { join as join95 } from "path";
108256
108702
  var BUILTIN_MCP_SERVERS = ["websearch", "context7", "grep_app", "lsp"];
108257
108703
  function getMcpConfigPaths() {
108258
108704
  return [
108259
- join90(homedir21(), ".claude", ".mcp.json"),
108260
- join90(process.cwd(), ".mcp.json"),
108261
- join90(process.cwd(), ".claude", ".mcp.json")
108705
+ join95(homedir24(), ".claude", ".mcp.json"),
108706
+ join95(process.cwd(), ".mcp.json"),
108707
+ join95(process.cwd(), ".claude", ".mcp.json")
108262
108708
  ];
108263
108709
  }
108264
108710
  function loadUserMcpConfig() {
108265
108711
  const servers = {};
108266
108712
  for (const configPath of getMcpConfigPaths()) {
108267
- if (!existsSync57(configPath))
108713
+ if (!existsSync59(configPath))
108268
108714
  continue;
108269
108715
  try {
108270
108716
  const content = readFileSync39(configPath, "utf-8");
@@ -108402,12 +108848,12 @@ async function checkTools() {
108402
108848
 
108403
108849
  // packages/omo-opencode/src/cli/doctor/checks/telemetry.ts
108404
108850
  init_src5();
108405
- import { existsSync as existsSync58, readFileSync as readFileSync40 } from "fs";
108851
+ import { existsSync as existsSync60, readFileSync as readFileSync40 } from "fs";
108406
108852
  function isTelemetryState(value) {
108407
108853
  return value !== null && typeof value === "object" && !Array.isArray(value);
108408
108854
  }
108409
108855
  function readLastActiveDay(stateFilePath) {
108410
- if (!existsSync58(stateFilePath)) {
108856
+ if (!existsSync60(stateFilePath)) {
108411
108857
  return "never";
108412
108858
  }
108413
108859
  let parsed;
@@ -108470,17 +108916,17 @@ async function probeBinary(cmd, args, spawnImpl) {
108470
108916
  }
108471
108917
 
108472
108918
  // packages/team-core/src/team-registry/paths.ts
108473
- import { homedir as homedir22 } from "os";
108919
+ import { homedir as homedir25 } from "os";
108474
108920
  import path13 from "path";
108475
108921
  function resolveBaseDir(config) {
108476
- return expandHomeDirectory(config.base_dir ?? path13.join(homedir22(), ".omo"));
108922
+ return expandHomeDirectory(config.base_dir ?? path13.join(homedir25(), ".omo"));
108477
108923
  }
108478
108924
  function expandHomeDirectory(directoryPath) {
108479
108925
  if (directoryPath === "~") {
108480
- return homedir22();
108926
+ return homedir25();
108481
108927
  }
108482
108928
  if (directoryPath.startsWith("~/") || directoryPath.startsWith("~\\")) {
108483
- return path13.join(homedir22(), directoryPath.slice(2));
108929
+ return path13.join(homedir25(), directoryPath.slice(2));
108484
108930
  }
108485
108931
  return directoryPath;
108486
108932
  }
@@ -108537,10 +108983,10 @@ async function pathExists2(dir) {
108537
108983
 
108538
108984
  // packages/omo-opencode/src/cli/doctor/checks/codex.ts
108539
108985
  init_src();
108540
- import { existsSync as existsSync59 } from "fs";
108986
+ import { existsSync as existsSync61 } from "fs";
108541
108987
  import { lstat as lstat16, readdir as readdir14, readFile as readFile30 } from "fs/promises";
108542
- import { homedir as homedir23 } from "os";
108543
- import { basename as basename12, join as join91, resolve as resolve24 } from "path";
108988
+ import { homedir as homedir26 } from "os";
108989
+ import { basename as basename13, join as join96, resolve as resolve27 } from "path";
108544
108990
  // packages/omo-opencode/package.json
108545
108991
  var package_default3 = {
108546
108992
  name: "@oh-my-opencode/omo-opencode",
@@ -108599,7 +109045,7 @@ var package_default3 = {
108599
109045
 
108600
109046
  // packages/omo-opencode/src/cli/doctor/checks/codex.ts
108601
109047
  var MARKETPLACE_NAME = "sisyphuslabs";
108602
- var PLUGIN_NAME2 = "omo";
109048
+ var PLUGIN_NAME3 = "omo";
108603
109049
  var COMPANION_PLUGIN_KEY = "codex@openai-codex";
108604
109050
  var DEFAULT_PLUGIN_VERSION = "0.1.0";
108605
109051
  var COMPANION_LIFECYCLE_EVENTS = new Set(["session_start", "stop"]);
@@ -108614,20 +109060,20 @@ var CODEX_BIN_NAMES = [
108614
109060
  "omo-git-bash-hook"
108615
109061
  ];
108616
109062
  async function gatherCodexSummary(deps = {}) {
108617
- const codexHome = resolve24(deps.codexHome ?? process.env.CODEX_HOME ?? join91(homedir23(), ".codex"));
109063
+ const codexHome = resolve27(deps.codexHome ?? process.env.CODEX_HOME ?? join96(homedir26(), ".codex"));
108618
109064
  const binDir = resolveCodexInstallerBinDir({ binDir: deps.binDir, codexHome, env: process.env });
108619
109065
  const detection = await (deps.detectCodexInstallation ?? detectCodexInstallation)();
108620
109066
  const pluginRoot = await resolveInstalledPluginRoot(codexHome);
108621
- const manifest = pluginRoot === null ? null : await readJson(join91(pluginRoot, ".codex-plugin", "plugin.json"));
108622
- const installSnapshot = pluginRoot === null ? null : await readJson(join91(pluginRoot, "lazycodex-install.json"));
108623
- const configPath = join91(codexHome, "config.toml");
109067
+ const manifest = pluginRoot === null ? null : await readJson(join96(pluginRoot, ".codex-plugin", "plugin.json"));
109068
+ const installSnapshot = pluginRoot === null ? null : await readJson(join96(pluginRoot, "lazycodex-install.json"));
109069
+ const configPath = join96(codexHome, "config.toml");
108624
109070
  const pluginVersion = stringField(manifest, "version");
108625
109071
  return {
108626
109072
  codexPath: detection.found && "path" in detection ? detection.path : null,
108627
109073
  codexSource: detection.found ? detection.source : null,
108628
109074
  codexAppId: detection.found && "appId" in detection ? detection.appId : null,
108629
109075
  marketplaceName: MARKETPLACE_NAME,
108630
- pluginName: PLUGIN_NAME2,
109076
+ pluginName: PLUGIN_NAME3,
108631
109077
  pluginVersion,
108632
109078
  pluginVersionStamped: pluginVersion !== null && pluginVersion !== DEFAULT_PLUGIN_VERSION,
108633
109079
  installerVersion: deps.installerVersion ?? package_default3.version,
@@ -108677,7 +109123,7 @@ function buildCodexIssues(summary) {
108677
109123
  if (summary.pluginRoot === null) {
108678
109124
  issues.push({
108679
109125
  title: "OMO Codex plugin is not installed",
108680
- description: `Expected cached plugin at ${join91("plugins", "cache", MARKETPLACE_NAME, PLUGIN_NAME2, DEFAULT_PLUGIN_VERSION)} under CODEX_HOME.`,
109126
+ description: `Expected cached plugin at ${join96("plugins", "cache", MARKETPLACE_NAME, PLUGIN_NAME3, DEFAULT_PLUGIN_VERSION)} under CODEX_HOME.`,
108681
109127
  fix: "Run: npx lazycodex-ai install",
108682
109128
  severity: "error",
108683
109129
  affects: ["plugin loading"]
@@ -108742,15 +109188,15 @@ function buildCodexIssues(summary) {
108742
109188
  return issues;
108743
109189
  }
108744
109190
  async function resolveInstalledPluginRoot(codexHome) {
108745
- const pluginRoot = join91(codexHome, "plugins", "cache", MARKETPLACE_NAME, PLUGIN_NAME2);
108746
- if (!existsSync59(pluginRoot))
109191
+ const pluginRoot = join96(codexHome, "plugins", "cache", MARKETPLACE_NAME, PLUGIN_NAME3);
109192
+ if (!existsSync61(pluginRoot))
108747
109193
  return null;
108748
109194
  const versions = await readdir14(pluginRoot, { withFileTypes: true });
108749
109195
  const candidates = versions.filter((entry) => entry.isDirectory()).map((entry) => entry.name).sort(compareVersionsDescending);
108750
- return candidates.length === 0 ? null : join91(pluginRoot, candidates[0] ?? DEFAULT_PLUGIN_VERSION);
109196
+ return candidates.length === 0 ? null : join96(pluginRoot, candidates[0] ?? DEFAULT_PLUGIN_VERSION);
108751
109197
  }
108752
109198
  async function readCodexConfigSummary(configPath) {
108753
- if (!existsSync59(configPath)) {
109199
+ if (!existsSync61(configPath)) {
108754
109200
  return {
108755
109201
  exists: false,
108756
109202
  marketplaceConfigured: false,
@@ -108775,17 +109221,17 @@ async function readCodexConfigSummary(configPath) {
108775
109221
  async function readLinkedBins(binDir) {
108776
109222
  const linked = [];
108777
109223
  for (const name of CODEX_BIN_NAMES) {
108778
- if (await pathExists3(join91(binDir, process.platform === "win32" ? `${name}.cmd` : name)))
109224
+ if (await pathExists3(join96(binDir, process.platform === "win32" ? `${name}.cmd` : name)))
108779
109225
  linked.push(name);
108780
109226
  }
108781
109227
  return linked;
108782
109228
  }
108783
109229
  async function readLinkedAgents(codexHome) {
108784
- const agentsDir = join91(codexHome, "agents");
108785
- if (!existsSync59(agentsDir))
109230
+ const agentsDir = join96(codexHome, "agents");
109231
+ if (!existsSync61(agentsDir))
108786
109232
  return [];
108787
109233
  const entries = await readdir14(agentsDir, { withFileTypes: true });
108788
- return entries.filter((entry) => entry.isFile() || entry.isSymbolicLink()).map((entry) => basename12(entry.name, ".toml")).sort();
109234
+ return entries.filter((entry) => entry.isFile() || entry.isSymbolicLink()).map((entry) => basename13(entry.name, ".toml")).sort();
108789
109235
  }
108790
109236
  async function readJson(path) {
108791
109237
  try {
@@ -108914,24 +109360,24 @@ function resolveLatestVersion(input) {
108914
109360
  // packages/omo-opencode/src/cli/doctor/checks/codex-components.ts
108915
109361
  init_src();
108916
109362
  import { readdir as readdir15, readFile as readFile31, stat as stat7 } from "fs/promises";
108917
- import { homedir as homedir24 } from "os";
108918
- import { dirname as dirname36, isAbsolute as isAbsolute14, join as join92, relative as relative9, resolve as resolve25, sep as sep9 } from "path";
109363
+ import { homedir as homedir27 } from "os";
109364
+ import { dirname as dirname39, isAbsolute as isAbsolute15, join as join97, relative as relative9, resolve as resolve28, sep as sep10 } from "path";
108919
109365
  var CODEX_COMPONENTS_CHECK_ID = "codex-components";
108920
109366
  var CODEX_COMPONENTS_CHECK_NAME = "codex-components";
108921
109367
  var PLUGIN_DATA_DIR_NAME = "omo-sisyphuslabs";
108922
- var BOOTSTRAP_PENDING_MESSAGE = "bootstrap pending \u2014 start a Codex session";
109368
+ var BOOTSTRAP_PENDING_MESSAGE = "bootstrap pending: start a Codex session";
108923
109369
  var REINSTALL_FIX = "Reinstall: npx lazycodex-ai install (or upgrade: codex plugin marketplace upgrade sisyphuslabs)";
108924
109370
  async function checkCodexComponents(deps = {}) {
108925
109371
  const env = deps.env ?? process.env;
108926
109372
  const platform = deps.platform ?? process.platform;
108927
109373
  const arch = deps.arch ?? process.arch;
108928
- const codexHome = resolve25(deps.codexHome ?? env["CODEX_HOME"] ?? join92(homedir24(), ".codex"));
109374
+ const codexHome = resolve28(deps.codexHome ?? env["CODEX_HOME"] ?? join97(homedir27(), ".codex"));
108929
109375
  const summary = await gatherCodexSummary({ ...deps, codexHome });
108930
109376
  if (summary.pluginRoot === null) {
108931
109377
  return {
108932
109378
  name: CODEX_COMPONENTS_CHECK_NAME,
108933
109379
  status: "skip",
108934
- message: "OMO Codex plugin is not installed \u2014 skipping component checks",
109380
+ message: "OMO Codex plugin is not installed: skipping component checks",
108935
109381
  details: [`plugin root: not installed under ${codexHome}`],
108936
109382
  issues: []
108937
109383
  };
@@ -108950,7 +109396,7 @@ async function checkCodexComponents(deps = {}) {
108950
109396
  });
108951
109397
  }
108952
109398
  const runtimeSgDir = runtimeSgDirectory(codexHome, platform, arch);
108953
- const runtimeSgPath = join92(runtimeSgDir, sgBinaryName(platform));
109399
+ const runtimeSgPath = join97(runtimeSgDir, sgBinaryName(platform));
108954
109400
  const sg = findSgBinarySync({
108955
109401
  arch,
108956
109402
  env,
@@ -108989,8 +109435,8 @@ async function auditBundleTargets(pluginRoot) {
108989
109435
  const manifest = await readJson2(manifestPath);
108990
109436
  if (manifest === null || !isRecord18(manifest["mcpServers"]))
108991
109437
  continue;
108992
- const manifestRoot = dirname36(manifestPath);
108993
- const isRootManifest = resolve25(manifestRoot) === resolve25(pluginRoot);
109438
+ const manifestRoot = dirname39(manifestPath);
109439
+ const isRootManifest = resolve28(manifestRoot) === resolve28(pluginRoot);
108994
109440
  for (const server of Object.values(manifest["mcpServers"])) {
108995
109441
  if (!isRecord18(server) || !Array.isArray(server["args"]))
108996
109442
  continue;
@@ -109010,7 +109456,7 @@ async function auditBundleTargets(pluginRoot) {
109010
109456
  continue;
109011
109457
  const commands = [];
109012
109458
  collectHookCommands(manifest, commands);
109013
- const hookPluginRoot = dirname36(dirname36(hookManifestPath));
109459
+ const hookPluginRoot = dirname39(dirname39(hookManifestPath));
109014
109460
  for (const command of commands) {
109015
109461
  for (const relativePath of extractPluginRootPaths(command)) {
109016
109462
  referencedCount += 1;
@@ -109032,9 +109478,9 @@ function recordBrokenTarget(broken, classified, origin) {
109032
109478
  broken.push(entry);
109033
109479
  }
109034
109480
  async function classifyBundleTarget(bundleRoot, baseRoot, relativePath, allowEscape) {
109035
- const targetPath = resolve25(baseRoot, relativePath);
109036
- const bundleRootPath = resolve25(bundleRoot);
109037
- const bundleRootPrefix = bundleRootPath.endsWith(sep9) ? bundleRootPath : `${bundleRootPath}${sep9}`;
109481
+ const targetPath = resolve28(baseRoot, relativePath);
109482
+ const bundleRootPath = resolve28(bundleRoot);
109483
+ const bundleRootPrefix = bundleRootPath.endsWith(sep10) ? bundleRootPath : `${bundleRootPath}${sep10}`;
109038
109484
  if (targetPath !== bundleRootPath && !targetPath.startsWith(bundleRootPrefix)) {
109039
109485
  if (allowEscape)
109040
109486
  return null;
@@ -109049,7 +109495,7 @@ async function classifyBundleTarget(bundleRoot, baseRoot, relativePath, allowEsc
109049
109495
  }
109050
109496
  async function findHookManifestPaths(root) {
109051
109497
  const paths = await findManifestPaths(root, "hooks.json");
109052
- return paths.filter((path) => dirname36(path).endsWith(`${sep9}hooks`));
109498
+ return paths.filter((path) => dirname39(path).endsWith(`${sep10}hooks`));
109053
109499
  }
109054
109500
  async function findManifestPaths(root, manifestName) {
109055
109501
  let entries;
@@ -109062,7 +109508,7 @@ async function findManifestPaths(root, manifestName) {
109062
109508
  for (const entry of entries) {
109063
109509
  if (entry.name === "node_modules" || entry.name === ".git")
109064
109510
  continue;
109065
- const entryPath = join92(root, entry.name);
109511
+ const entryPath = join97(root, entry.name);
109066
109512
  if (entry.isDirectory()) {
109067
109513
  paths.push(...await findManifestPaths(entryPath, manifestName));
109068
109514
  continue;
@@ -109103,21 +109549,21 @@ function extractPluginRootPaths(command) {
109103
109549
  }
109104
109550
  function isPluginRuntimePathArg(arg) {
109105
109551
  const normalized = normalizePathSeparators(arg);
109106
- return normalized.endsWith(".js") && normalized.includes("/dist/") && (normalized.startsWith("./") || normalized.startsWith("../") || normalized.startsWith("components/") || normalized.startsWith("/") || isAbsolute14(arg));
109552
+ return normalized.endsWith(".js") && normalized.includes("/dist/") && (normalized.startsWith("./") || normalized.startsWith("../") || normalized.startsWith("components/") || normalized.startsWith("/") || isAbsolute15(arg));
109107
109553
  }
109108
109554
  function runtimeSgDirectory(codexHome, platform, arch) {
109109
- return join92(codexHome, "runtime", "ast-grep", runtimeSlug(platform, arch));
109555
+ return join97(codexHome, "runtime", "ast-grep", runtimeSlug(platform, arch));
109110
109556
  }
109111
109557
  function describeSgSource(sgPath, env, runtimeSgDir, platform) {
109112
109558
  const override = env[SG_PATH_ENV_KEY]?.trim();
109113
109559
  if (override !== undefined && override.length > 0 && sgPath === override)
109114
109560
  return `env override ${SG_PATH_ENV_KEY}`;
109115
- if (sgPath === join92(runtimeSgDir, sgBinaryName(platform)))
109561
+ if (sgPath === join97(runtimeSgDir, sgBinaryName(platform)))
109116
109562
  return "runtime dir";
109117
109563
  return "PATH";
109118
109564
  }
109119
109565
  async function readBootstrapStateSummary(codexHome) {
109120
- const statePath = join92(codexHome, "plugins", "data", PLUGIN_DATA_DIR_NAME, "bootstrap", "state.json");
109566
+ const statePath = join97(codexHome, "plugins", "data", PLUGIN_DATA_DIR_NAME, "bootstrap", "state.json");
109121
109567
  const raw = await readJson2(statePath);
109122
109568
  if (raw === null)
109123
109569
  return null;
@@ -109193,24 +109639,24 @@ function isRecord18(value) {
109193
109639
  }
109194
109640
 
109195
109641
  // packages/omo-opencode/src/cli/doctor/checks/codex-runtime-wrapper.ts
109196
- import { existsSync as existsSync60 } from "fs";
109642
+ import { existsSync as existsSync62 } from "fs";
109197
109643
  import { readFile as readFile32 } from "fs/promises";
109198
- import { homedir as homedir25 } from "os";
109199
- import { join as join93, resolve as resolve26 } from "path";
109644
+ import { homedir as homedir28 } from "os";
109645
+ import { join as join98, resolve as resolve29 } from "path";
109200
109646
  var RUNTIME_WRAPPER_MARKER2 = "OMO_GENERATED_RUNTIME_WRAPPER";
109201
109647
  var CHECK_NAME = "codex-runtime-wrapper";
109202
109648
  var REINSTALL_COMMAND = "npx --yes lazycodex-ai@latest install --no-tui";
109203
109649
  async function checkCodexRuntimeWrapper(deps = {}) {
109204
- const codexHome = resolve26(deps.codexHome ?? process.env.CODEX_HOME ?? join93(homedir25(), ".codex"));
109650
+ const codexHome = resolve29(deps.codexHome ?? process.env.CODEX_HOME ?? join98(homedir28(), ".codex"));
109205
109651
  const binDir = resolveCodexInstallerBinDir({ binDir: deps.binDir, codexHome, env: process.env });
109206
109652
  const platform = deps.platform ?? process.platform;
109207
- const wrapperPath = join93(binDir, platform === "win32" ? "omo-agent-toolkit.cmd" : "omo-agent-toolkit");
109208
- const legacyWrapperPath = join93(binDir, platform === "win32" ? "omo.cmd" : "omo");
109653
+ const wrapperPath = join98(binDir, platform === "win32" ? "omo-agent-toolkit.cmd" : "omo-agent-toolkit");
109654
+ const legacyWrapperPath = join98(binDir, platform === "win32" ? "omo.cmd" : "omo");
109209
109655
  const [wrapper, legacyWrapper] = await Promise.all([readRuntimeWrapper(wrapperPath), readRuntimeWrapper(legacyWrapperPath)]);
109210
109656
  const issues = [];
109211
109657
  if (wrapper?.includes(RUNTIME_WRAPPER_MARKER2) === true) {
109212
109658
  const targetPath = parseRuntimeTargetPath(wrapper);
109213
- if (targetPath !== null && !existsSync60(targetPath)) {
109659
+ if (targetPath !== null && !existsSync62(targetPath)) {
109214
109660
  issues.push({
109215
109661
  title: "omo-agent-toolkit runtime wrapper target is missing",
109216
109662
  description: `Generated omo-agent-toolkit runtime wrapper at ${wrapperPath} points to missing target ${targetPath}.`,
@@ -109733,10 +110179,10 @@ Doctor failed unexpectedly: ${message}`];
109733
110179
  init_commander();
109734
110180
 
109735
110181
  // packages/mcp-client-core/src/mcp-oauth/storage.ts
109736
- import { createHash as createHash7 } from "crypto";
110182
+ import { createHash as createHash8 } from "crypto";
109737
110183
  import {
109738
110184
  chmodSync as chmodSync5,
109739
- existsSync as existsSync63,
110185
+ existsSync as existsSync65,
109740
110186
  mkdirSync as mkdirSync17,
109741
110187
  readdirSync as readdirSync13,
109742
110188
  readFileSync as readFileSync42,
@@ -109744,18 +110190,18 @@ import {
109744
110190
  unlinkSync as unlinkSync9,
109745
110191
  writeFileSync as writeFileSync14
109746
110192
  } from "fs";
109747
- import { basename as basename13, dirname as dirname37, join as join96 } from "path";
110193
+ import { basename as basename14, dirname as dirname40, join as join101 } from "path";
109748
110194
 
109749
110195
  // packages/mcp-client-core/src/config-dir.ts
109750
- import { existsSync as existsSync61, realpathSync as realpathSync10 } from "fs";
109751
- import { homedir as homedir26 } from "os";
109752
- import { join as join94, resolve as resolve27 } from "path";
109753
- function resolveConfigPath2(pathValue) {
109754
- const resolvedPath = resolve27(pathValue);
109755
- if (!existsSync61(resolvedPath))
110196
+ import { existsSync as existsSync63, realpathSync as realpathSync12 } from "fs";
110197
+ import { homedir as homedir29 } from "os";
110198
+ import { join as join99, resolve as resolve30 } from "path";
110199
+ function resolveConfigPath3(pathValue) {
110200
+ const resolvedPath = resolve30(pathValue);
110201
+ if (!existsSync63(resolvedPath))
109756
110202
  return resolvedPath;
109757
110203
  try {
109758
- return realpathSync10(resolvedPath);
110204
+ return realpathSync12(resolvedPath);
109759
110205
  } catch (error) {
109760
110206
  if (!(error instanceof Error))
109761
110207
  throw error;
@@ -109765,15 +110211,15 @@ function resolveConfigPath2(pathValue) {
109765
110211
  function getOpenCodeCliConfigDir(env = process.env) {
109766
110212
  const customConfigDir = env["OPENCODE_CONFIG_DIR"]?.trim();
109767
110213
  if (customConfigDir) {
109768
- return resolveConfigPath2(customConfigDir);
110214
+ return resolveConfigPath3(customConfigDir);
109769
110215
  }
109770
- const xdgConfigDir = env["XDG_CONFIG_HOME"]?.trim() || join94(homedir26(), ".config");
109771
- return resolveConfigPath2(join94(xdgConfigDir, "opencode"));
110216
+ const xdgConfigDir = env["XDG_CONFIG_HOME"]?.trim() || join99(homedir29(), ".config");
110217
+ return resolveConfigPath3(join99(xdgConfigDir, "opencode"));
109772
110218
  }
109773
110219
 
109774
110220
  // packages/mcp-client-core/src/mcp-oauth/storage-index.ts
109775
- import { chmodSync as chmodSync4, existsSync as existsSync62, readFileSync as readFileSync41, renameSync as renameSync7, writeFileSync as writeFileSync13 } from "fs";
109776
- import { join as join95 } from "path";
110221
+ import { chmodSync as chmodSync4, existsSync as existsSync64, readFileSync as readFileSync41, renameSync as renameSync7, writeFileSync as writeFileSync13 } from "fs";
110222
+ import { join as join100 } from "path";
109777
110223
  var INDEX_FILE_NAME = "index.json";
109778
110224
  function isTokenIndex(value) {
109779
110225
  if (typeof value !== "object" || value === null || Array.isArray(value))
@@ -109781,11 +110227,11 @@ function isTokenIndex(value) {
109781
110227
  return Object.values(value).every((entry) => typeof entry === "string");
109782
110228
  }
109783
110229
  function getIndexPath(storageDir) {
109784
- return join95(storageDir, INDEX_FILE_NAME);
110230
+ return join100(storageDir, INDEX_FILE_NAME);
109785
110231
  }
109786
110232
  function readTokenIndex(storageDir) {
109787
110233
  const indexPath = getIndexPath(storageDir);
109788
- if (!existsSync62(indexPath))
110234
+ if (!existsSync64(indexPath))
109789
110235
  return {};
109790
110236
  try {
109791
110237
  const parsed = JSON.parse(readFileSync41(indexPath, "utf-8"));
@@ -109825,16 +110271,16 @@ function deleteTokenIndexEntry(storageDir, hash) {
109825
110271
  var STORAGE_DIR_NAME = "mcp-oauth";
109826
110272
  var LEGACY_STORAGE_FILE_NAME = "mcp-oauth.json";
109827
110273
  function getMcpOauthStorageDir() {
109828
- return join96(getOpenCodeCliConfigDir(), STORAGE_DIR_NAME);
110274
+ return join101(getOpenCodeCliConfigDir(), STORAGE_DIR_NAME);
109829
110275
  }
109830
110276
  function getMcpOauthServerHash(serverHost, resource) {
109831
- return createHash7("sha256").update(buildKey(serverHost, resource)).digest("hex").slice(0, 32);
110277
+ return createHash8("sha256").update(buildKey(serverHost, resource)).digest("hex").slice(0, 32);
109832
110278
  }
109833
110279
  function getMcpOauthStoragePath(serverHost, resource) {
109834
- return join96(getMcpOauthStorageDir(), `${getMcpOauthServerHash(serverHost, resource)}.json`);
110280
+ return join101(getMcpOauthStorageDir(), `${getMcpOauthServerHash(serverHost, resource)}.json`);
109835
110281
  }
109836
110282
  function getLegacyStoragePath() {
109837
- return join96(getOpenCodeCliConfigDir(), LEGACY_STORAGE_FILE_NAME);
110283
+ return join101(getOpenCodeCliConfigDir(), LEGACY_STORAGE_FILE_NAME);
109838
110284
  }
109839
110285
  function normalizeHost2(serverHost) {
109840
110286
  let host = serverHost.trim();
@@ -109895,7 +110341,7 @@ function isOAuthTokenData(value) {
109895
110341
  return clientSecret === undefined || typeof clientSecret === "string";
109896
110342
  }
109897
110343
  function readTokenFile(filePath) {
109898
- if (!existsSync63(filePath))
110344
+ if (!existsSync65(filePath))
109899
110345
  return null;
109900
110346
  try {
109901
110347
  const parsed = JSON.parse(readFileSync42(filePath, "utf-8"));
@@ -109908,7 +110354,7 @@ function readTokenFile(filePath) {
109908
110354
  }
109909
110355
  function readLegacyStore() {
109910
110356
  const filePath = getLegacyStoragePath();
109911
- if (!existsSync63(filePath))
110357
+ if (!existsSync65(filePath))
109912
110358
  return null;
109913
110359
  try {
109914
110360
  const parsed = JSON.parse(readFileSync42(filePath, "utf-8"));
@@ -109928,8 +110374,8 @@ function readLegacyStore() {
109928
110374
  }
109929
110375
  function writeTokenFile(filePath, token) {
109930
110376
  try {
109931
- const dir = dirname37(filePath);
109932
- if (!existsSync63(dir)) {
110377
+ const dir = dirname40(filePath);
110378
+ if (!existsSync65(dir)) {
109933
110379
  mkdirSync17(dir, { recursive: true });
109934
110380
  }
109935
110381
  const tempPath = `${filePath}.tmp.${Date.now()}`;
@@ -109953,7 +110399,7 @@ function saveToken(serverHost, resource, token) {
109953
110399
  }
109954
110400
  function deleteToken(serverHost, resource) {
109955
110401
  const filePath = getMcpOauthStoragePath(serverHost, resource);
109956
- if (!existsSync63(filePath))
110402
+ if (!existsSync65(filePath))
109957
110403
  return deleteLegacyToken(serverHost, resource);
109958
110404
  try {
109959
110405
  unlinkSync9(filePath);
@@ -109975,7 +110421,7 @@ function deleteLegacyToken(serverHost, resource) {
109975
110421
  if (Object.keys(store).length === 0) {
109976
110422
  try {
109977
110423
  const filePath = getLegacyStoragePath();
109978
- if (existsSync63(filePath))
110424
+ if (existsSync65(filePath))
109979
110425
  unlinkSync9(filePath);
109980
110426
  return true;
109981
110427
  } catch (deleteError) {
@@ -110013,7 +110459,7 @@ function listTokensByHost(serverHost) {
110013
110459
  for (const [hash, indexedKey] of Object.entries(index)) {
110014
110460
  if (!indexedKey.startsWith(prefix))
110015
110461
  continue;
110016
- const indexedToken = readTokenFile(join96(getMcpOauthStorageDir(), `${hash}.json`));
110462
+ const indexedToken = readTokenFile(join101(getMcpOauthStorageDir(), `${hash}.json`));
110017
110463
  if (indexedToken)
110018
110464
  result[indexedKey] = indexedToken;
110019
110465
  }
@@ -110022,14 +110468,14 @@ function listTokensByHost(serverHost) {
110022
110468
  function listAllTokens() {
110023
110469
  const result = { ...readLegacyStore() ?? {} };
110024
110470
  const dir = getMcpOauthStorageDir();
110025
- if (!existsSync63(dir))
110471
+ if (!existsSync65(dir))
110026
110472
  return result;
110027
110473
  const index = readTokenIndex(dir);
110028
110474
  for (const entry of readdirSync13(dir, { withFileTypes: true })) {
110029
110475
  if (!entry.isFile() || !entry.name.endsWith(".json") || entry.name === "index.json")
110030
110476
  continue;
110031
- const token = readTokenFile(join96(dir, entry.name));
110032
- const hash = basename13(entry.name, ".json");
110477
+ const token = readTokenFile(join101(dir, entry.name));
110478
+ const hash = basename14(entry.name, ".json");
110033
110479
  if (token)
110034
110480
  result[index[hash] ?? hash] = token;
110035
110481
  }
@@ -110037,7 +110483,7 @@ function listAllTokens() {
110037
110483
  }
110038
110484
 
110039
110485
  // packages/mcp-client-core/src/plugin-identity.ts
110040
- var PLUGIN_NAME3 = "oh-my-openagent";
110486
+ var PLUGIN_NAME4 = "oh-my-openagent";
110041
110487
 
110042
110488
  // packages/mcp-client-core/src/mcp-oauth/discovery.ts
110043
110489
  var discoveryCache = new Map;
@@ -110202,13 +110648,13 @@ async function findAvailablePort2(startPort = DEFAULT_PORT) {
110202
110648
 
110203
110649
  // packages/mcp-client-core/src/mcp-oauth/oauth-authorization-flow.ts
110204
110650
  import { spawn as spawn4 } from "child_process";
110205
- import { createHash as createHash8, randomBytes as randomBytes2 } from "crypto";
110651
+ import { createHash as createHash9, randomBytes as randomBytes2 } from "crypto";
110206
110652
  import { createServer as createServer2 } from "http";
110207
110653
  function generateCodeVerifier() {
110208
110654
  return randomBytes2(32).toString("base64url");
110209
110655
  }
110210
110656
  function generateCodeChallenge(verifier) {
110211
- return createHash8("sha256").update(verifier).digest("base64url");
110657
+ return createHash9("sha256").update(verifier).digest("base64url");
110212
110658
  }
110213
110659
  function buildAuthorizationUrl(authorizationEndpoint, options) {
110214
110660
  const url = new URL(authorizationEndpoint);
@@ -110414,7 +110860,7 @@ class McpOAuthProvider {
110414
110860
  const clientInfo = await getOrRegisterClient({
110415
110861
  ...metadata.registrationEndpoint ? { registrationEndpoint: metadata.registrationEndpoint } : {},
110416
110862
  serverIdentifier: this.serverUrl,
110417
- clientName: PLUGIN_NAME3,
110863
+ clientName: PLUGIN_NAME4,
110418
110864
  redirectUris: [this.redirectUrl()],
110419
110865
  tokenEndpointAuthMethod: "none",
110420
110866
  ...this.configClientId ? { clientId: this.configClientId } : {},
@@ -111100,8 +111546,8 @@ async function loadDeviceKeyring(store) {
111100
111546
 
111101
111547
  // packages/omo-opencode/src/cli/account-keys/keystore.ts
111102
111548
  import { execFile as execFile5 } from "child_process";
111103
- import { homedir as homedir27 } from "os";
111104
- import { join as join97 } from "path";
111549
+ import { homedir as homedir30 } from "os";
111550
+ import { join as join102 } from "path";
111105
111551
  var DEFAULT_SERVICE = "omo-cli";
111106
111552
  function defaultRun(argv, input) {
111107
111553
  const [file, ...args] = argv;
@@ -111209,8 +111655,8 @@ function createLibsecretKeyStore(name, run) {
111209
111655
  }
111210
111656
  function createDpapiKeyStore(name, run) {
111211
111657
  const safeName = name.replace(/[^A-Za-z0-9._-]/g, "-");
111212
- const directory = join97(process.env.LOCALAPPDATA ?? join97(homedir27(), "AppData", "Local"), "omo");
111213
- const file = join97(directory, `device-keys-${safeName}.bin`);
111658
+ const directory = join102(process.env.LOCALAPPDATA ?? join102(homedir30(), "AppData", "Local"), "omo");
111659
+ const file = join102(directory, `device-keys-${safeName}.bin`);
111214
111660
  const ps = (literal) => `'${literal.replace(/'/g, "''")}'`;
111215
111661
  const prelude = "Add-Type -AssemblyName System.Security; ";
111216
111662
  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).");
@@ -111374,6 +111820,7 @@ class ApiRefusal extends SignInError {
111374
111820
  "account_deleted",
111375
111821
  "reauth_required",
111376
111822
  "invalid_grant",
111823
+ "device_revoked",
111377
111824
  "entitlement_required",
111378
111825
  "authorization_pending",
111379
111826
  "slow_down",
@@ -111569,7 +112016,7 @@ async function loginDevice(session, options) {
111569
112016
  }
111570
112017
 
111571
112018
  // packages/omo-opencode/src/cli/service-auth/keystore.ts
111572
- import { createHash as createHash9 } from "crypto";
112019
+ import { createHash as createHash10 } from "crypto";
111573
112020
 
111574
112021
  // packages/omo-opencode/src/cli/service-auth/secret-service-lock.ts
111575
112022
  import { spawn as spawn5 } from "child_process";
@@ -111613,7 +112060,10 @@ var probeSecretServiceLock = () => new Promise((resolve) => {
111613
112060
  });
111614
112061
 
111615
112062
  // packages/omo-opencode/src/cli/service-auth/keystore.ts
111616
- class KeychainLockedError extends SignInError {
112063
+ class CredentialStoreError extends SignInError {
112064
+ }
112065
+
112066
+ class KeychainLockedError extends CredentialStoreError {
111617
112067
  }
111618
112068
  var LOCKED = /-25308|errSecInteractionNotAllowed|interaction is not allowed|locked collection/i;
111619
112069
  var UNLOCKED_REUSE_MS = 30000;
@@ -111627,7 +112077,7 @@ var stderrNoticeOncePerProcess = (message) => {
111627
112077
  };
111628
112078
  var isLocked = (error) => error instanceof Error && (LOCKED.test(error.message) || LOCKED.test(String(error.code ?? "")));
111629
112079
  function credentialId(api) {
111630
- return createHash9("sha256").update(serviceOrigin(api)).digest("hex");
112080
+ return createHash10("sha256").update(serviceOrigin(api)).digest("hex");
111631
112081
  }
111632
112082
  function createCredentialStore(api, secrets = typeof Bun === "undefined" ? null : Bun.secrets, platform = process.platform, lockProbe = probeSecretServiceLock, notice = stderrNoticeOncePerProcess) {
111633
112083
  if (!secrets)
@@ -111636,7 +112086,7 @@ function createCredentialStore(api, secrets = typeof Bun === "undefined" ? null
111636
112086
  if (platformName === null)
111637
112087
  throw new SignInError("This platform has no supported OS credential store.");
111638
112088
  const key = { service: "omo-cli", name: credentialId(api) };
111639
- 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.`);
112089
+ 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.`);
111640
112090
  let unlockedUntil = 0;
111641
112091
  let noticed = false;
111642
112092
  const assertUsable = async () => {
@@ -111691,7 +112141,7 @@ function createCredentialStore(api, secrets = typeof Bun === "undefined" ? null
111691
112141
  }
111692
112142
 
111693
112143
  // packages/omo-opencode/src/cli/service-auth/loopback.ts
111694
- import { createHash as createHash10, randomBytes as randomBytes3, timingSafeEqual } from "crypto";
112144
+ import { createHash as createHash11, randomBytes as randomBytes3, timingSafeEqual } from "crypto";
111695
112145
  import { createServer as createServer3 } from "http";
111696
112146
  class BrowserUnavailable extends SignInError {
111697
112147
  }
@@ -111737,7 +112187,7 @@ async function authorize(options) {
111737
112187
  const url = new URL(serviceOrigin(options.accounts));
111738
112188
  url.search = new URLSearchParams({
111739
112189
  redirect_uri: `${origin}/callback`,
111740
- code_challenge: createHash10("sha256").update(verifier).digest("base64url"),
112190
+ code_challenge: createHash11("sha256").update(verifier).digest("base64url"),
111741
112191
  code_challenge_method: "S256",
111742
112192
  state
111743
112193
  }).toString();
@@ -111791,12 +112241,12 @@ async function loginLoopback(session, options) {
111791
112241
 
111792
112242
  // packages/omo-opencode/src/cli/service-auth/session.ts
111793
112243
  import { mkdir as mkdir10 } from "fs/promises";
111794
- import { homedir as homedir28 } from "os";
111795
- import { join as join98 } from "path";
112244
+ import { homedir as homedir31 } from "os";
112245
+ import { join as join103 } from "path";
111796
112246
 
111797
112247
  // packages/team-core/src/team-state-store/lock-publish.ts
111798
112248
  import { access as access3, open as open2, unlink as unlink2 } from "fs/promises";
111799
- import { dirname as dirname38 } from "path";
112249
+ import { dirname as dirname41 } from "path";
111800
112250
 
111801
112251
  // packages/team-core/src/team-state-store/lock-record.ts
111802
112252
  import { randomUUID as randomUUID5 } from "crypto";
@@ -111896,7 +112346,7 @@ async function assertRetryableLockOpenError(lockPath, error, deps) {
111896
112346
  if (code === "EPERM") {
111897
112347
  if (await pathMayExist(lockPath, deps))
111898
112348
  return;
111899
- if ((deps?.platform ?? process.platform) === "win32" && await pathMayExist(dirname38(lockPath), deps))
112349
+ if ((deps?.platform ?? process.platform) === "win32" && await pathMayExist(dirname41(lockPath), deps))
111900
112350
  return;
111901
112351
  }
111902
112352
  throw error;
@@ -111926,7 +112376,7 @@ async function publishLockRecord(lockPath, record) {
111926
112376
  }
111927
112377
 
111928
112378
  // packages/team-core/src/team-state-store/lock-reclaim.ts
111929
- import { createHash as createHash11 } from "crypto";
112379
+ import { createHash as createHash12 } from "crypto";
111930
112380
  import { unlink as unlink3 } from "fs/promises";
111931
112381
  var RECLAIM_UNLINK_ATTEMPTS = 3;
111932
112382
  var RECLAIM_UNLINK_RETRY_MS = 25;
@@ -111936,7 +112386,7 @@ function delay2(ms) {
111936
112386
  });
111937
112387
  }
111938
112388
  function reclaimGuardPath(lockPath, record) {
111939
- return `${lockPath}.reclaim-${createHash11("sha256").update(record).digest("hex").slice(0, 16)}`;
112389
+ return `${lockPath}.reclaim-${createHash12("sha256").update(record).digest("hex").slice(0, 16)}`;
111940
112390
  }
111941
112391
  async function unlinkWithRetry(path, deps) {
111942
112392
  const wait = deps.delay ?? delay2;
@@ -112035,12 +112485,12 @@ class SessionEnded extends SignInError {
112035
112485
  this.code = code;
112036
112486
  }
112037
112487
  }
112038
- var DEVICE_REVOKING_REFUSALS = new Set(["account_deleted", "reauth_required"]);
112488
+ var DEVICE_REVOKING_REFUSALS = new Set(["account_deleted", "reauth_required", "device_revoked"]);
112039
112489
  function createSession(options) {
112040
112490
  const api = serviceOrigin(options.api);
112041
112491
  const { store, signal } = options;
112042
- const directory = join98(options.home ?? homedir28(), ".omo", "session-locks");
112043
- const lockPath = join98(directory, `${credentialId(api)}.lock`);
112492
+ const directory = join103(options.home ?? homedir31(), ".omo", "session-locks");
112493
+ const lockPath = join103(directory, `${credentialId(api)}.lock`);
112044
112494
  async function locked(action) {
112045
112495
  await mkdir10(directory, { recursive: true, mode: 448 });
112046
112496
  signal?.throwIfAborted();
@@ -112062,7 +112512,9 @@ function createSession(options) {
112062
112512
  await store.write({ ...current, ...tokens });
112063
112513
  return tokens.accessToken;
112064
112514
  } catch (error) {
112065
- if (error instanceof ApiRefusal && error.status < 500 && ["unauthorized", "account_deleted", "reauth_required", "invalid_grant"].includes(error.code)) {
112515
+ if (error instanceof CredentialStoreError)
112516
+ throw error;
112517
+ if (error instanceof ApiRefusal && error.status < 500 && ["unauthorized", "account_deleted", "reauth_required", "invalid_grant", "device_revoked"].includes(error.code)) {
112066
112518
  await store.clear();
112067
112519
  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);
112068
112520
  }
@@ -112291,7 +112743,7 @@ function resolveInstallArgs(options, invocationName = process.env.OMO_INVOCATION
112291
112743
  init_commander();
112292
112744
 
112293
112745
  // packages/omo-opencode/src/cli/boulder/boulder.ts
112294
- import { existsSync as existsSync64 } from "fs";
112746
+ import { existsSync as existsSync66 } from "fs";
112295
112747
 
112296
112748
  // packages/omo-opencode/src/cli/boulder/formatter.ts
112297
112749
  var import_picocolors22 = __toESM(require_picocolors(), 1);
@@ -112428,10 +112880,10 @@ async function boulder(options) {
112428
112880
  const boulderFilePath = getBoulderFilePath(directory);
112429
112881
  const state = readBoulderState(directory);
112430
112882
  if (!state) {
112431
- const message = existsSync64(boulderFilePath) ? formatReadErrorMessage(options.json) : formatNoBoulderMessage(options.json);
112883
+ const message = existsSync66(boulderFilePath) ? formatReadErrorMessage(options.json) : formatNoBoulderMessage(options.json);
112432
112884
  process.stderr.write(`${message}
112433
112885
  `);
112434
- return existsSync64(boulderFilePath) ? 2 : 1;
112886
+ return existsSync66(boulderFilePath) ? 2 : 1;
112435
112887
  }
112436
112888
  const works = getBoulderWorks(state);
112437
112889
  const filteredWorks = options.workId ? works.filter((work) => work.work_id === options.workId) : works;
@@ -112449,12 +112901,12 @@ async function boulder(options) {
112449
112901
  }
112450
112902
  // packages/omo-opencode/src/cli/codex-ulw-loop.ts
112451
112903
  import { spawn as spawn6 } from "child_process";
112452
- import { existsSync as existsSync65, readFileSync as readFileSync43, realpathSync as realpathSync11 } from "fs";
112453
- import { homedir as homedir29 } from "os";
112904
+ import { existsSync as existsSync67, readFileSync as readFileSync43, realpathSync as realpathSync13 } from "fs";
112905
+ import { homedir as homedir32 } from "os";
112454
112906
  var ULW_LOOP_DELEGATION_SENTINEL = "OMO_ULW_LOOP_DELEGATED";
112455
112907
  function resolveCodexUlwLoopCommand(input = {}) {
112456
112908
  const env = input.env ?? process.env;
112457
- const homeDir = input.homeDir ?? homedir29();
112909
+ const homeDir = input.homeDir ?? homedir32();
112458
112910
  const localComponentBin = resolveLocalUlwLoopBin(env, homeDir);
112459
112911
  if (localComponentBin !== null)
112460
112912
  return { executable: localComponentBin, argsPrefix: [] };
@@ -112491,11 +112943,11 @@ async function codexUlwLoop(args) {
112491
112943
  }
112492
112944
  function resolveLocalUlwLoopBin(env, homeDir) {
112493
112945
  const candidates = resolveCodexComponentBinCandidates({ executableName: "omo-ulw-loop", env, homeDir });
112494
- return candidates.find((candidate) => existsSync65(candidate)) ?? null;
112946
+ return candidates.find((candidate) => existsSync67(candidate)) ?? null;
112495
112947
  }
112496
112948
  function resolveLegacyLocalOmoBin(env, homeDir, currentExecutablePaths) {
112497
112949
  const candidates = resolveCodexComponentBinCandidates({ executableName: "omo", env, homeDir });
112498
- return candidates.find((candidate) => existsSync65(candidate) && !isCurrentExecutable(candidate, currentExecutablePaths) && !isGeneratedRuntimeWrapper(candidate)) ?? null;
112950
+ return candidates.find((candidate) => existsSync67(candidate) && !isCurrentExecutable(candidate, currentExecutablePaths) && !isGeneratedRuntimeWrapper(candidate)) ?? null;
112499
112951
  }
112500
112952
  function isGeneratedRuntimeWrapper(candidate) {
112501
112953
  try {
@@ -112512,7 +112964,7 @@ function isCurrentExecutable(candidate, currentExecutablePaths) {
112512
112964
  }
112513
112965
  function realpathOrSelf2(path) {
112514
112966
  try {
112515
- return realpathSync11(path);
112967
+ return realpathSync13(path);
112516
112968
  } catch (error) {
112517
112969
  if (error instanceof Error)
112518
112970
  return path;
@@ -112696,7 +113148,7 @@ function linkedWorktrees(records) {
112696
113148
  return records.slice(1);
112697
113149
  }
112698
113150
  // packages/omo-opencode/src/cli/worktree-sweep/sweep.ts
112699
- import { existsSync as existsSync66 } from "fs";
113151
+ import { existsSync as existsSync68 } from "fs";
112700
113152
  import { stat as stat9 } from "fs/promises";
112701
113153
  import os7 from "os";
112702
113154
  import { normalize as normalize2 } from "path";
@@ -112787,7 +113239,7 @@ async function isOlderThan(worktreePath, days, now) {
112787
113239
  }
112788
113240
  }
112789
113241
  async function classifyRecord(repo, record, defaultBranch, options) {
112790
- const pathExists = existsSync66(record.path);
113242
+ const pathExists = existsSync68(record.path);
112791
113243
  const external = isExcludedPath(record.path, options.excludePrefixes, options.home);
112792
113244
  const current = options.currentWorktree !== undefined && record.path === options.currentWorktree;
112793
113245
  if (record.locked || !pathExists || external || current) {
@@ -112816,7 +113268,7 @@ async function sweepRepo(repo, options) {
112816
113268
  const records = linkedWorktrees(allRecords);
112817
113269
  const startedInLinked = records.some((record) => record.path === toplevel);
112818
113270
  const mainWorktree = allRecords[0]?.path;
112819
- const root = startedInLinked && mainWorktree !== undefined && existsSync66(mainWorktree) ? mainWorktree : toplevel;
113271
+ const root = startedInLinked && mainWorktree !== undefined && existsSync68(mainWorktree) ? mainWorktree : toplevel;
112820
113272
  const currentWorktree = startedInLinked ? toplevel : undefined;
112821
113273
  const classifications = [];
112822
113274
  for (const record of records) {
@@ -112945,7 +113397,7 @@ prunes.
112945
113397
 
112946
113398
  // packages/omo-opencode/src/cli/config-migrate.ts
112947
113399
  init_startup_migration();
112948
- import { posix as posix12 } from "path";
113400
+ import { posix as posix13 } from "path";
112949
113401
  function reports(result) {
112950
113402
  return result.results.map((entry) => ({
112951
113403
  diagnostics: entry.diagnostics,
@@ -112979,7 +113431,7 @@ function runConfigMigrate(options = {}) {
112979
113431
  dryRun: options.dryRun ?? false,
112980
113432
  environment,
112981
113433
  ...homeDir === undefined ? {} : { env: { HOME: homeDir }, homeDir },
112982
- pathOperations: posix12
113434
+ pathOperations: posix13
112983
113435
  });
112984
113436
  const report = reports(result);
112985
113437
  const response = {