lazycodex-ai 5.0.0 → 5.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (80) hide show
  1. package/README.ja.md +41 -376
  2. package/README.ko.md +45 -376
  3. package/README.md +39 -376
  4. package/README.ru.md +50 -368
  5. package/README.zh-cn.md +50 -371
  6. package/dist/cli/index.js +242 -150
  7. package/dist/cli-node/index.js +242 -150
  8. package/package.json +6 -1
  9. package/packages/omo-codex/plugin/.codex-plugin/plugin.json +1 -1
  10. package/packages/omo-codex/plugin/components/bootstrap/dist/cli.js +26 -3
  11. package/packages/omo-codex/plugin/components/bootstrap/hooks/hooks.json +1 -1
  12. package/packages/omo-codex/plugin/components/bootstrap/package.json +1 -1
  13. package/packages/omo-codex/plugin/components/comment-checker/hooks/hooks.json +1 -1
  14. package/packages/omo-codex/plugin/components/comment-checker/package.json +1 -1
  15. package/packages/omo-codex/plugin/components/git-bash/hooks/hooks.json +2 -2
  16. package/packages/omo-codex/plugin/components/git-bash/package.json +1 -1
  17. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/hooks/hooks.json +1 -1
  18. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/package.json +1 -1
  19. package/packages/omo-codex/plugin/components/lsp/dist/.omo-runtime-manifest.json +2 -2
  20. package/packages/omo-codex/plugin/components/lsp/hooks/hooks.json +2 -2
  21. package/packages/omo-codex/plugin/components/lsp/package.json +1 -1
  22. package/packages/omo-codex/plugin/components/rules/hooks/hooks.json +4 -4
  23. package/packages/omo-codex/plugin/components/rules/package.json +1 -1
  24. package/packages/omo-codex/plugin/components/teammode/hooks/hooks.json +1 -1
  25. package/packages/omo-codex/plugin/components/teammode/package.json +1 -1
  26. package/packages/omo-codex/plugin/components/telemetry/hooks/hooks.json +1 -1
  27. package/packages/omo-codex/plugin/components/telemetry/package.json +1 -1
  28. package/packages/omo-codex/plugin/components/ultrawork/hooks/hooks.json +1 -1
  29. package/packages/omo-codex/plugin/components/ultrawork/package.json +1 -1
  30. package/packages/omo-codex/plugin/components/ulw-execute-continuation/AGENTS.md +1 -1
  31. package/packages/omo-codex/plugin/components/ulw-execute-continuation/dist/cli.js +42 -32
  32. package/packages/omo-codex/plugin/components/ulw-execute-continuation/hooks/hooks.json +1 -1
  33. package/packages/omo-codex/plugin/components/ulw-execute-continuation/package.json +1 -1
  34. package/packages/omo-codex/plugin/components/ulw-execute-continuation/src/plan-checklist.ts +55 -29
  35. package/packages/omo-codex/plugin/components/ulw-execute-continuation/test/boulder-reader.test.ts +51 -0
  36. package/packages/omo-codex/plugin/components/ulw-loop/hooks/hooks.json +5 -5
  37. package/packages/omo-codex/plugin/components/ulw-loop/package.json +1 -1
  38. package/packages/omo-codex/plugin/hooks/post-compact-resetting-git-bash-mcp-reminder.json +1 -1
  39. package/packages/omo-codex/plugin/hooks/post-compact-resetting-lsp-diagnostics-cache.json +1 -1
  40. package/packages/omo-codex/plugin/hooks/post-compact-resetting-project-rule-cache.json +1 -1
  41. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-comments.json +1 -1
  42. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-lsp-diagnostics.json +1 -1
  43. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-thread-title-hygiene.json +1 -1
  44. package/packages/omo-codex/plugin/hooks/post-tool-use-matching-project-rules.json +1 -1
  45. package/packages/omo-codex/plugin/hooks/post-tool-use-recording-spawn-admission.json +1 -1
  46. package/packages/omo-codex/plugin/hooks/pre-tool-use-enforcing-unlimited-goal-budget.json +1 -1
  47. package/packages/omo-codex/plugin/hooks/pre-tool-use-guarding-ulw-loop-spawns.json +1 -1
  48. package/packages/omo-codex/plugin/hooks/pre-tool-use-recommending-git-bash-mcp.json +1 -1
  49. package/packages/omo-codex/plugin/hooks/session-start-checking-auto-update.json +1 -1
  50. package/packages/omo-codex/plugin/hooks/session-start-checking-bootstrap-provisioning.json +1 -1
  51. package/packages/omo-codex/plugin/hooks/session-start-loading-project-rules.json +1 -1
  52. package/packages/omo-codex/plugin/hooks/session-start-recording-session-telemetry.json +1 -1
  53. package/packages/omo-codex/plugin/hooks/stop-checking-ulw-execute-continuation.json +1 -1
  54. package/packages/omo-codex/plugin/hooks/stop-checking-ulw-loop-resume.json +1 -1
  55. package/packages/omo-codex/plugin/hooks/subagent-stop-verifying-lazycodex-executor-evidence.json +1 -1
  56. package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ultrawork-trigger.json +1 -1
  57. package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ulw-loop-steering.json +1 -1
  58. package/packages/omo-codex/plugin/hooks/user-prompt-submit-loading-project-rules.json +1 -1
  59. package/packages/omo-codex/plugin/package-lock.json +12 -12
  60. package/packages/omo-codex/plugin/package.json +1 -1
  61. package/packages/omo-codex/plugin/skills/browser/runtime/omowright/manifest.json +1 -1
  62. package/packages/omo-codex/plugin/skills/coding-agent-sessions/SKILL.md +1 -1
  63. package/packages/omo-codex/plugin/skills/coding-agent-sessions/scripts/agent_sessions/aside_scanner.py +3 -0
  64. package/packages/omo-codex/plugin/skills/coding-agent-sessions/scripts/agent_sessions/cli.py +4 -0
  65. package/packages/omo-codex/plugin/skills/coding-agent-sessions/scripts/agent_sessions/file_scanners.py +6 -2
  66. package/packages/omo-codex/plugin/skills/coding-agent-sessions/scripts/agent_sessions/scanners.py +7 -1
  67. package/packages/omo-codex/plugin/skills/coding-agent-sessions/scripts/agent_sessions/transcript.py +3 -1
  68. package/packages/omo-codex/plugin/skills/coding-agent-sessions/scripts/agent_sessions/types.py +3 -1
  69. package/packages/omo-codex/plugin/skills/coding-agent-sessions/scripts/find-agent-sessions.py +4 -0
  70. package/packages/omo-codex/plugin/test/node-install-surface.test.mjs +0 -1
  71. package/packages/omo-codex/scripts/install-dist/install-local.mjs +37 -14
  72. package/packages/shared-skills/skills/browser/runtime/omowright/manifest.json +1 -1
  73. package/packages/shared-skills/skills/coding-agent-sessions/SKILL.md +1 -1
  74. package/packages/shared-skills/skills/coding-agent-sessions/scripts/agent_sessions/aside_scanner.py +3 -0
  75. package/packages/shared-skills/skills/coding-agent-sessions/scripts/agent_sessions/cli.py +4 -0
  76. package/packages/shared-skills/skills/coding-agent-sessions/scripts/agent_sessions/file_scanners.py +6 -2
  77. package/packages/shared-skills/skills/coding-agent-sessions/scripts/agent_sessions/scanners.py +7 -1
  78. package/packages/shared-skills/skills/coding-agent-sessions/scripts/agent_sessions/transcript.py +3 -1
  79. package/packages/shared-skills/skills/coding-agent-sessions/scripts/agent_sessions/types.py +3 -1
  80. package/packages/shared-skills/skills/coding-agent-sessions/scripts/find-agent-sessions.py +4 -0
@@ -65,7 +65,7 @@ var package_default;
65
65
  var init_package = __esm(() => {
66
66
  package_default = {
67
67
  name: "oh-my-opencode",
68
- version: "5.0.0",
68
+ version: "5.1.0",
69
69
  description: "The Best AI Agent Harness - Batteries-Included OpenCode Plugin with Multi-Model Orchestration, Parallel Background Agents, and Crafted LSP/AST Tools",
70
70
  main: "./dist/index.js",
71
71
  types: "dist/index.d.ts",
@@ -98,6 +98,11 @@ var init_package = __esm(() => {
98
98
  "packages/omo-codex",
99
99
  "packages/omo-senpi",
100
100
  "packages/senpi-task",
101
+ "packages/senpi-desktop-protocol",
102
+ "packages/senpi-desktop-engine",
103
+ "packages/senpi-desktop-prelude",
104
+ "packages/senpi-desktop-service",
105
+ "packages/senpi-desktop-tool",
101
106
  "packages/omo-opencode",
102
107
  "packages/omo-native"
103
108
  ],
@@ -199,7 +204,7 @@ var init_package = __esm(() => {
199
204
  prepublishOnly: "bun run clean && bun run build:lsp-tools-mcp && bun run build:lsp-daemon && bun run build",
200
205
  "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",
201
206
  typecheck: "tsgo --noEmit && bun run typecheck:script && bun run typecheck:packages",
202
- "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",
207
+ "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",
203
208
  "typecheck:script": "tsgo --noEmit -p script/tsconfig.json",
204
209
  test: "bun test --timeout 20000",
205
210
  "changelog:section": "bun script/changelog-section.ts",
@@ -208,7 +213,8 @@ var init_package = __esm(() => {
208
213
  "test:senpi": "bun run build:senpi-plugin && tsgo --noEmit -p packages/omo-senpi/tsconfig.json && bun test --timeout 20000 packages/omo-senpi && bun test ./.agents/skills/senpi-qa/scripts/resolve-evidence-dir.test.mjs",
209
214
  "test:windows-codex": "bun run test:codex",
210
215
  "build:git-bash-mcp": "bun run --cwd packages/git-bash-mcp build",
211
- "build:ast-grep-mcp": "bun run --cwd packages/ast-grep-mcp build"
216
+ "build:ast-grep-mcp": "bun run --cwd packages/ast-grep-mcp build",
217
+ "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"
212
218
  },
213
219
  keywords: [
214
220
  "opencode",
@@ -248,7 +254,7 @@ var init_package = __esm(() => {
248
254
  zod: "^4.6.5"
249
255
  },
250
256
  devDependencies: {
251
- "@code-yeongyu/senpi": "2026.9.26",
257
+ "@code-yeongyu/senpi": "2026.9.28-7",
252
258
  "@oh-my-opencode/agents-md-core": "workspace:*",
253
259
  "@oh-my-opencode/ast-grep-mcp": "workspace:*",
254
260
  "@oh-my-opencode/boulder-state": "workspace:*",
@@ -257,11 +263,11 @@ var init_package = __esm(() => {
257
263
  "@oh-my-opencode/delegate-core": "workspace:*",
258
264
  "@oh-my-opencode/git-bash-mcp": "workspace:*",
259
265
  "@oh-my-opencode/hashline-core": "workspace:*",
260
- "@oh-my-opencode/lsp-core": "workspace:*",
261
266
  "@oh-my-opencode/isolation-core": "workspace:*",
262
- "@oh-my-opencode/memory-core": "workspace:*",
267
+ "@oh-my-opencode/lsp-core": "workspace:*",
263
268
  "@oh-my-opencode/mcp-client-core": "workspace:*",
264
269
  "@oh-my-opencode/mcp-stdio-core": "workspace:*",
270
+ "@oh-my-opencode/memory-core": "workspace:*",
265
271
  "@oh-my-opencode/model-core": "workspace:*",
266
272
  "@oh-my-opencode/omo-codex": "workspace:*",
267
273
  "@oh-my-opencode/omo-config-core": "workspace:*",
@@ -270,6 +276,11 @@ var init_package = __esm(() => {
270
276
  "@oh-my-opencode/openclaw-core": "workspace:*",
271
277
  "@oh-my-opencode/prompts-core": "workspace:*",
272
278
  "@oh-my-opencode/rules-engine": "workspace:*",
279
+ "@oh-my-opencode/senpi-desktop-engine": "workspace:*",
280
+ "@oh-my-opencode/senpi-desktop-prelude": "workspace:*",
281
+ "@oh-my-opencode/senpi-desktop-protocol": "workspace:*",
282
+ "@oh-my-opencode/senpi-desktop-service": "workspace:*",
283
+ "@oh-my-opencode/senpi-desktop-tool": "workspace:*",
273
284
  "@oh-my-opencode/senpi-task": "workspace:*",
274
285
  "@oh-my-opencode/shared-skills": "workspace:*",
275
286
  "@oh-my-opencode/skills-loader-core": "workspace:*",
@@ -289,18 +300,18 @@ var init_package = __esm(() => {
289
300
  typescript: "^7.0.2"
290
301
  },
291
302
  optionalDependencies: {
292
- "oh-my-opencode-darwin-arm64": "5.0.0",
293
- "oh-my-opencode-darwin-x64": "5.0.0",
294
- "oh-my-opencode-darwin-x64-baseline": "5.0.0",
295
- "oh-my-opencode-linux-arm64": "5.0.0",
296
- "oh-my-opencode-linux-arm64-musl": "5.0.0",
297
- "oh-my-opencode-linux-x64": "5.0.0",
298
- "oh-my-opencode-linux-x64-baseline": "5.0.0",
299
- "oh-my-opencode-linux-x64-musl": "5.0.0",
300
- "oh-my-opencode-linux-x64-musl-baseline": "5.0.0",
301
- "oh-my-opencode-windows-arm64": "5.0.0",
302
- "oh-my-opencode-windows-x64": "5.0.0",
303
- "oh-my-opencode-windows-x64-baseline": "5.0.0"
303
+ "oh-my-opencode-darwin-arm64": "5.1.0",
304
+ "oh-my-opencode-darwin-x64": "5.1.0",
305
+ "oh-my-opencode-darwin-x64-baseline": "5.1.0",
306
+ "oh-my-opencode-linux-arm64": "5.1.0",
307
+ "oh-my-opencode-linux-arm64-musl": "5.1.0",
308
+ "oh-my-opencode-linux-x64": "5.1.0",
309
+ "oh-my-opencode-linux-x64-baseline": "5.1.0",
310
+ "oh-my-opencode-linux-x64-musl": "5.1.0",
311
+ "oh-my-opencode-linux-x64-musl-baseline": "5.1.0",
312
+ "oh-my-opencode-windows-arm64": "5.1.0",
313
+ "oh-my-opencode-windows-x64": "5.1.0",
314
+ "oh-my-opencode-windows-x64-baseline": "5.1.0"
304
315
  },
305
316
  overrides: {
306
317
  "@earendil-works/pi-agent-core": "0.84.2",
@@ -6397,6 +6408,9 @@ function getActiveReservation(sessionID) {
6397
6408
  pruneExpiredReservations();
6398
6409
  return promptAsyncReservations.get(sessionID);
6399
6410
  }
6411
+ function reservedDispatchResult(reservation) {
6412
+ return reservation.expiresAt === undefined ? { status: "reserved", reservedBy: reservation.source } : { status: "reserved", reservedBy: reservation.source, expiresAt: reservation.expiresAt };
6413
+ }
6400
6414
  function setPromptReservation(sessionID, reservation) {
6401
6415
  promptAsyncReservations.set(sessionID, reservation);
6402
6416
  }
@@ -6446,7 +6460,7 @@ async function dispatchAfterSessionIdle(args) {
6446
6460
  reservedBy: existing.source,
6447
6461
  reservedAgeMs: Date.now() - existing.reservedAt
6448
6462
  });
6449
- return { status: "reserved", reservedBy: existing.source };
6463
+ return reservedDispatchResult(existing);
6450
6464
  }
6451
6465
  const reservation = {
6452
6466
  source,
@@ -6984,7 +6998,7 @@ async function dispatchInternalPrompt(args) {
6984
6998
  if (queueBehavior === "defer") {
6985
6999
  const activeReservation = getActiveReservation(sessionID);
6986
7000
  if (activeReservation) {
6987
- return { status: "reserved", reservedBy: activeReservation.source };
7001
+ return reservedDispatchResult(activeReservation);
6988
7002
  }
6989
7003
  const queuedBy = getQueuedPromptBlocker(sessionID);
6990
7004
  if (queuedBy !== undefined || isPromptQueueDraining(sessionID)) {
@@ -7479,11 +7493,6 @@ var init_category_model_requirements = __esm(() => {
7479
7493
  writing: {
7480
7494
  requiresAnyModel: true,
7481
7495
  fallbackChain: [
7482
- {
7483
- providers: ["anthropic", "anthropic-api", "github-copilot", "opencode"],
7484
- model: "claude-fable-5-1",
7485
- variant: "low"
7486
- },
7487
7496
  {
7488
7497
  providers: ["anthropic", "anthropic-api", "github-copilot", "opencode"],
7489
7498
  model: "claude-opus-5-5",
@@ -8046,8 +8055,17 @@ var init_model_resolver = () => {};
8046
8055
  // packages/model-core/src/fallback-chain-from-models.ts
8047
8056
  var init_fallback_chain_from_models = () => {};
8048
8057
 
8058
+ // packages/model-core/src/runtime-fallback-auto-retry-signal.ts
8059
+ var init_runtime_fallback_auto_retry_signal = () => {};
8060
+
8061
+ // packages/model-core/src/runtime-fallback-error-shape.ts
8062
+ var init_runtime_fallback_error_shape = () => {};
8063
+
8064
+ // packages/model-core/src/runtime-fallback-error-classifier.ts
8065
+ var init_runtime_fallback_error_classifier = () => {};
8066
+
8049
8067
  // packages/model-core/src/model-error-classifier.ts
8050
- var RETRYABLE_ERROR_NAMES, STOP_ERROR_NAMES, NON_RETRYABLE_ERROR_NAMES;
8068
+ var RETRYABLE_ERROR_NAMES, NON_RETRYABLE_ERROR_NAMES;
8051
8069
  var init_model_error_classifier = __esm(() => {
8052
8070
  RETRYABLE_ERROR_NAMES = new Set([
8053
8071
  "providermodelnotfounderror",
@@ -8056,11 +8074,6 @@ var init_model_error_classifier = __esm(() => {
8056
8074
  "providerconnectionerror",
8057
8075
  "authenticationerror"
8058
8076
  ]);
8059
- STOP_ERROR_NAMES = new Set([
8060
- "quotaexceedederror",
8061
- "insufficientcreditserror",
8062
- "freeusagelimiterror"
8063
- ]);
8064
8077
  NON_RETRYABLE_ERROR_NAMES = new Set([
8065
8078
  "messageabortederror",
8066
8079
  "permissiondeniederror",
@@ -8072,15 +8085,6 @@ var init_model_error_classifier = __esm(() => {
8072
8085
  ]);
8073
8086
  });
8074
8087
 
8075
- // packages/model-core/src/runtime-fallback-auto-retry-signal.ts
8076
- var init_runtime_fallback_auto_retry_signal = () => {};
8077
-
8078
- // packages/model-core/src/runtime-fallback-error-shape.ts
8079
- var init_runtime_fallback_error_shape = () => {};
8080
-
8081
- // packages/model-core/src/runtime-fallback-error-classifier.ts
8082
- var init_runtime_fallback_error_classifier = () => {};
8083
-
8084
8088
  // packages/model-core/src/provider-exhaustion-fallback-policy.ts
8085
8089
  var init_provider_exhaustion_fallback_policy = () => {};
8086
8090
 
@@ -9282,7 +9286,7 @@ var init_kimi_categories = __esm(() => {
9282
9286
  KIMI_CATEGORIES = [
9283
9287
  {
9284
9288
  name: "writing",
9285
- config: { model: "anthropic/claude-fable-5-1", variant: "low" },
9289
+ config: { model: "anthropic/claude-opus-5-5", variant: "low" },
9286
9290
  description: "Documentation, prose, technical writing",
9287
9291
  promptAppend: WRITING_CATEGORY_PROMPT_APPEND
9288
9292
  }
@@ -74420,6 +74424,29 @@ var init_category = __esm(() => {
74420
74424
  OmoCategoriesConfigSchema = record(string2(), OmoCategoryConfigSchema);
74421
74425
  });
74422
74426
 
74427
+ // packages/omo-config-core/src/schema/computer.ts
74428
+ var positiveInteger, nonNegativeInteger, OmoComputerSettingsLayerSchema, OmoComputerSettingsSchema;
74429
+ var init_computer = __esm(() => {
74430
+ init_zod();
74431
+ positiveInteger = number2().int().positive();
74432
+ nonNegativeInteger = number2().int().nonnegative();
74433
+ OmoComputerSettingsLayerSchema = object({
74434
+ enabled: boolean2().describe("Experimental: register the computer tool in OmO Native sessions (default: on where the host is supported; false leaves it unregistered)"),
74435
+ display: string2().min(1),
74436
+ max_width: positiveInteger,
74437
+ max_height: positiveInteger,
74438
+ screenshot_max_bytes: positiveInteger,
74439
+ stop_hotkey: string2().min(1),
74440
+ allow_host_relay_only_stop: boolean2(),
74441
+ macos_canary: _enum(["session", "off"]),
74442
+ audit_log: object({ enabled: boolean2() }).partial().strict(),
74443
+ screenshot_gc: object({ enabled: boolean2(), stale_ms: nonNegativeInteger, scan_interval_ms: nonNegativeInteger }).partial().strict(),
74444
+ engine_path: string2().min(1),
74445
+ cua_adapter: boolean2()
74446
+ }).partial().strict().describe("Experimental computer use in OmO Native: screenshots, windows, accessibility trees and native mouse and keyboard input. Every key is optional; defaults depend on the host.");
74447
+ OmoComputerSettingsSchema = OmoComputerSettingsLayerSchema;
74448
+ });
74449
+
74423
74450
  // packages/omo-config-core/src/schema/git-master.ts
74424
74451
  var OmoGitMasterSettingsShape, OmoGitMasterSettingsLayerSchema, OmoGitMasterSettingsSchema;
74425
74452
  var init_git_master = __esm(() => {
@@ -74692,11 +74719,11 @@ function resolveOmoTaskSettings(input, resolveParallelism = availableParallelism
74692
74719
  const record2 = record(string2(), unknown()).parse(input);
74693
74720
  return OmoTaskSettingsSchema.parse({
74694
74721
  ...record2,
74695
- residency_max_children: record2["residency_max_children"] ?? Math.min(DEFAULT_RESIDENCY_MAX_CHILDREN, Math.max(8, resolveParallelism() * 2)),
74722
+ residency_max_children: record2["residency_max_children"] ?? DEFAULT_RESIDENCY_MAX_CHILDREN,
74696
74723
  global_concurrency: record2["global_concurrency"] ?? Math.max(8, resolveParallelism() * 2)
74697
74724
  });
74698
74725
  }
74699
- var DEFAULT_RESIDENCY_MAX_CHILDREN = 16, ResidencyMaxChildrenInputSchema, OmoTaskWaitSchema, OmoTaskTeamSettingsSchema, OmoTaskWarningsSchema, IsolationBackendKindSchema, OmoTaskIsolationSchema, isolationDefaults, OmoTaskIsolationLayerSchema, OmoTaskDagSettingsSchema, OmoTaskSettingsSchema, OmoTaskDagSettingsLayerSchema, OmoTaskWaitLayerSchema, OmoTaskTeamSettingsLayerSchema, OmoTaskWarningsLayerSchema, OmoTaskSettingsLayerSchema;
74726
+ var DEFAULT_RESIDENCY_MAX_CHILDREN = "unlimited", ResidencyMaxChildrenInputSchema, OmoTaskWaitSchema, OmoTaskTeamSettingsSchema, OmoTaskWarningsSchema, IsolationBackendKindSchema, OmoTaskIsolationSchema, isolationDefaults, OmoTaskIsolationLayerSchema, OmoTaskDagSettingsSchema, OmoTaskSettingsSchema, OmoTaskDagSettingsLayerSchema, OmoTaskWaitLayerSchema, OmoTaskTeamSettingsLayerSchema, OmoTaskWarningsLayerSchema, OmoTaskSettingsLayerSchema;
74700
74727
  var init_task = __esm(() => {
74701
74728
  init_zod();
74702
74729
  ResidencyMaxChildrenInputSchema = union([number2().int().nonnegative(), literal("unlimited")]);
@@ -74759,7 +74786,7 @@ var init_task = __esm(() => {
74759
74786
  provider_concurrency: record(string2(), number2().int().nonnegative()).optional(),
74760
74787
  model_concurrency: record(string2(), number2().int().nonnegative()).optional(),
74761
74788
  max_depth: number2().int().nonnegative().default(1),
74762
- residency_max_children: ResidencyMaxChildrenInputSchema.default(8),
74789
+ residency_max_children: ResidencyMaxChildrenInputSchema.default(DEFAULT_RESIDENCY_MAX_CHILDREN),
74763
74790
  resident_idle_timeout_ms: number2().int().positive().max(Number.MAX_SAFE_INTEGER).default(900000),
74764
74791
  ttl_ms: number2().int().positive().default(86400000),
74765
74792
  state_dir: string2().optional(),
@@ -74910,6 +74937,7 @@ var init_config = __esm(() => {
74910
74937
  init_zod();
74911
74938
  init_agent();
74912
74939
  init_category();
74940
+ init_computer();
74913
74941
  init_git_master();
74914
74942
  init_memory();
74915
74943
  init_model_catalog();
@@ -74932,6 +74960,7 @@ var init_config = __esm(() => {
74932
74960
  model_profile: string2().optional(),
74933
74961
  memory: OmoMemorySettingsLayerSchema.optional(),
74934
74962
  telemetry: OmoTelemetrySettingsLayerSchema.optional(),
74963
+ computer: OmoComputerSettingsLayerSchema.optional(),
74935
74964
  disabled_skills: OmoDisabledSkillsSchema.optional()
74936
74965
  }).strict();
74937
74966
  OmoConfigProfileSchema = object({
@@ -74946,6 +74975,7 @@ var init_config = __esm(() => {
74946
74975
  model_profile: string2().optional(),
74947
74976
  memory: OmoMemorySettingsLayerSchema.optional(),
74948
74977
  telemetry: OmoTelemetrySettingsLayerSchema.optional(),
74978
+ computer: OmoComputerSettingsLayerSchema.optional(),
74949
74979
  disabled_skills: OmoDisabledSkillsSchema.optional(),
74950
74980
  "[opencode]": OmoOpenCodeHarnessConfigSchema.optional(),
74951
74981
  "[native]": OmoTypedHarnessConfigSchema.optional(),
@@ -74965,6 +74995,7 @@ var init_config = __esm(() => {
74965
74995
  model_profile: string2().optional(),
74966
74996
  memory: OmoMemorySettingsSchema.optional(),
74967
74997
  telemetry: OmoTelemetrySettingsSchema.optional(),
74998
+ computer: OmoComputerSettingsSchema.optional(),
74968
74999
  disabled_skills: OmoDisabledSkillsSchema.optional(),
74969
75000
  "[opencode]": OmoOpenCodeHarnessConfigSchema.optional(),
74970
75001
  "[native]": OmoTypedHarnessConfigSchema.optional(),
@@ -74987,6 +75018,7 @@ var init_config = __esm(() => {
74987
75018
  model_profile: string2().optional(),
74988
75019
  memory: OmoMemorySettingsLayerSchema.optional(),
74989
75020
  telemetry: OmoTelemetrySettingsLayerSchema.optional(),
75021
+ computer: OmoComputerSettingsLayerSchema.optional(),
74990
75022
  disabled_skills: OmoDisabledSkillsSchema.optional(),
74991
75023
  "[opencode]": OmoOpenCodeHarnessConfigSchema.optional(),
74992
75024
  "[native]": OmoTypedHarnessConfigSchema.optional(),
@@ -75132,6 +75164,7 @@ var init_schema = __esm(() => {
75132
75164
  init_task();
75133
75165
  init_team();
75134
75166
  init_telemetry();
75167
+ init_computer();
75135
75168
  });
75136
75169
 
75137
75170
  // packages/omo-config-core/src/loader/disabled-skills.ts
@@ -85443,7 +85476,7 @@ class SyncSpanContextManager {
85443
85476
  var init_context = () => {};
85444
85477
 
85445
85478
  // node_modules/.bun/@posthog+core@1.55.0/node_modules/@posthog/core/dist/traces/config.mjs
85446
- function positiveInteger(value, fallback) {
85479
+ function positiveInteger2(value, fallback) {
85447
85480
  return typeof value == "number" && Number.isInteger(value) && value >= 1 ? value : fallback;
85448
85481
  }
85449
85482
  function withUsableIdentityKeys(attributes) {
@@ -85478,22 +85511,22 @@ function resolveTracesConfig(config, hostResourceAttributes, logger) {
85478
85511
  const resourceAttributes = assignUserAttributes({
85479
85512
  ...hostResourceAttributes
85480
85513
  }, withUsableIdentityKeys(config?.resourceAttributes));
85481
- const maxExportBatchSize = positiveInteger(config?.maxExportBatchSize, DEFAULT_MAX_EXPORT_BATCH_SIZE);
85514
+ const maxExportBatchSize = positiveInteger2(config?.maxExportBatchSize, DEFAULT_MAX_EXPORT_BATCH_SIZE);
85482
85515
  return {
85483
85516
  serviceName: resourceAttributes?.["service.name"] ?? config?.serviceName,
85484
85517
  serviceVersion: resourceAttributes?.["service.version"] ?? config?.serviceVersion,
85485
85518
  environment: resourceAttributes?.["deployment.environment"] ?? config?.environment,
85486
85519
  resourceAttributes,
85487
85520
  beforeSpanSend: resolveBeforeSpanSend(config?.beforeSpanSend, logger),
85488
- maxAttributesPerSpan: positiveInteger(config?.maxAttributesPerSpan, DEFAULT_MAX_ATTRIBUTES_PER_SPAN),
85489
- maxEventsPerSpan: positiveInteger(config?.maxEventsPerSpan, DEFAULT_MAX_EVENTS_PER_SPAN),
85521
+ maxAttributesPerSpan: positiveInteger2(config?.maxAttributesPerSpan, DEFAULT_MAX_ATTRIBUTES_PER_SPAN),
85522
+ maxEventsPerSpan: positiveInteger2(config?.maxEventsPerSpan, DEFAULT_MAX_EVENTS_PER_SPAN),
85490
85523
  maxAttributesPerEvent: DEFAULT_MAX_ATTRIBUTES_PER_EVENT,
85491
- maxAttributeValueLength: positiveInteger(config?.maxAttributeValueLength, DEFAULT_MAX_ATTRIBUTE_VALUE_LENGTH),
85492
- flushIntervalMs: positiveInteger(config?.flushIntervalMs, DEFAULT_FLUSH_INTERVAL_MS2),
85524
+ maxAttributeValueLength: positiveInteger2(config?.maxAttributeValueLength, DEFAULT_MAX_ATTRIBUTE_VALUE_LENGTH),
85525
+ flushIntervalMs: positiveInteger2(config?.flushIntervalMs, DEFAULT_FLUSH_INTERVAL_MS2),
85493
85526
  maxExportBatchSize,
85494
- maxQueueSize: Math.max(positiveInteger(config?.maxQueueSize, DEFAULT_MAX_QUEUE_SIZE), maxExportBatchSize),
85495
- maxLiveSpans: positiveInteger(config?.maxLiveSpans, DEFAULT_MAX_LIVE_SPANS),
85496
- maxSpanAgeMs: positiveInteger(config?.maxSpanAgeMs, DEFAULT_MAX_SPAN_AGE_MS)
85527
+ maxQueueSize: Math.max(positiveInteger2(config?.maxQueueSize, DEFAULT_MAX_QUEUE_SIZE), maxExportBatchSize),
85528
+ maxLiveSpans: positiveInteger2(config?.maxLiveSpans, DEFAULT_MAX_LIVE_SPANS),
85529
+ maxSpanAgeMs: positiveInteger2(config?.maxSpanAgeMs, DEFAULT_MAX_SPAN_AGE_MS)
85497
85530
  };
85498
85531
  }
85499
85532
  var DEFAULT_FLUSH_INTERVAL_MS2 = 5000, DEFAULT_MAX_EXPORT_BATCH_SIZE = 512, DEFAULT_MAX_QUEUE_SIZE = 2048, DEFAULT_MAX_ATTRIBUTES_PER_SPAN = 128, DEFAULT_MAX_EVENTS_PER_SPAN = 128, DEFAULT_MAX_ATTRIBUTES_PER_EVENT = 128, DEFAULT_MAX_ATTRIBUTE_VALUE_LENGTH = 8192, DEFAULT_MAX_LIVE_SPANS = 1e4, DEFAULT_MAX_SPAN_AGE_MS = 3600000, IDENTITY_KEYS;
@@ -89033,7 +89066,7 @@ var package_default2;
89033
89066
  var init_package2 = __esm(() => {
89034
89067
  package_default2 = {
89035
89068
  name: "@oh-my-opencode/omo-codex",
89036
- version: "5.0.0",
89069
+ version: "5.1.0",
89037
89070
  type: "module",
89038
89071
  private: true,
89039
89072
  description: "Codex harness adapter for oh-my-openagent. Vendored Codex plugin namespace (omo) + TypeScript installer + telemetry.",
@@ -98183,6 +98216,8 @@ function isErrno(error, code) {
98183
98216
  var REQUIRED_PLUGIN_ARTIFACTS = [
98184
98217
  join62("extensions", "omo.js"),
98185
98218
  join62("extensions", "omo-task.js"),
98219
+ join62("extensions", "omo-computer-use.js"),
98220
+ join62("extensions", "assets.generated.json"),
98186
98221
  join62("extensions", "omo-member.js"),
98187
98222
  join62("extensions", "memory-run-supervisor.mjs"),
98188
98223
  ...PERSONA_ASSET_FILES.map((filename) => join62("extensions", filename)),
@@ -98374,7 +98409,7 @@ async function runNativeDevInstaller(options) {
98374
98409
  return runSenpiInstaller(options);
98375
98410
  }
98376
98411
  // packages/omo-opencode/src/cli/install-native/legacy-omo-bin.ts
98377
- import { lstatSync as lstatSync4, readFileSync as readFileSync15, realpathSync as realpathSync8 } from "node:fs";
98412
+ import { lstatSync as lstatSync4, readFileSync as readFileSync15, realpathSync as realpathSync8, statSync as statSync4 } from "node:fs";
98378
98413
  import { dirname as dirname26, isAbsolute as isAbsolute12, join as join64, posix as posix9, win32 as win325 } from "node:path";
98379
98414
  var NATIVE_OMO_PACKAGE = "omo-ai";
98380
98415
  var LEGACY_OMO_BIN_PACKAGES = ["oh-my-openagent", "oh-my-opencode", "lazycodex"];
@@ -98456,12 +98491,11 @@ function resolveOwner(binPath) {
98456
98491
  if (fromLink !== null)
98457
98492
  return fromLink;
98458
98493
  const shim = readShimText(binPath);
98459
- if (shim === null)
98460
- return null;
98461
- const lightWrapper = codexLightWrapperOwner(shim);
98494
+ const lightWrapper = shim === null ? null : codexLightWrapperOwner(shim);
98462
98495
  if (lightWrapper !== null)
98463
98496
  return lightWrapper;
98464
- for (const entry of shimEntryPaths(shim, dirname26(binPath))) {
98497
+ const entries = [...shim === null ? [] : shimEntryPaths(shim, dirname26(binPath)), ...bunxEntryPaths(binPath)];
98498
+ for (const entry of entries) {
98465
98499
  if (!isInsideNodeModules(entry) || !pathExists(entry))
98466
98500
  continue;
98467
98501
  const owner = ownerOfFile(entry);
@@ -98482,6 +98516,23 @@ function shimEntryPaths(shim, shimDirectory) {
98482
98516
  }
98483
98517
  return paths;
98484
98518
  }
98519
+ function bunxEntryPaths(binPath) {
98520
+ if (!/\.exe$/i.test(binPath))
98521
+ return [];
98522
+ const sidecar = `${binPath.slice(0, -4)}.bunx`;
98523
+ let contents;
98524
+ try {
98525
+ if (!statSync4(sidecar).isFile())
98526
+ return [];
98527
+ contents = readFileSync15(sidecar).toString("utf16le");
98528
+ } catch {
98529
+ return [];
98530
+ }
98531
+ const end = contents.indexOf('"\x00');
98532
+ if (end <= 0)
98533
+ return [];
98534
+ return [join64(dirname26(dirname26(binPath)), contents.slice(0, end).replace(/\\/g, "/"))];
98535
+ }
98485
98536
  function codexLightWrapperOwner(shim) {
98486
98537
  if (!shim.includes(CODEX_LIGHT_WRAPPER_MARKER))
98487
98538
  return null;
@@ -103411,20 +103462,41 @@ var BOULDER_FILE = "boulder.json";
103411
103462
  var BOULDER_STATE_PATH = `${BOULDER_DIR}/${BOULDER_FILE}`;
103412
103463
  var NOTEPAD_DIR = "notepads";
103413
103464
  var NOTEPAD_BASE_PATH = `${BOULDER_DIR}/${NOTEPAD_DIR}`;
103465
+ // packages/boulder-state/src/markdown-fence.ts
103466
+ var FENCE_PATTERN = /^[ \t]{0,3}(`{3,}|~{3,})(.*)$/;
103467
+ function parseOpeningFence(line) {
103468
+ const match = line.match(FENCE_PATTERN);
103469
+ const run = match?.[1];
103470
+ const info = match?.[2];
103471
+ const marker = run?.charAt(0);
103472
+ if (run === undefined || info === undefined || marker !== "`" && marker !== "~" || marker === "`" && info.includes("`")) {
103473
+ return null;
103474
+ }
103475
+ return { marker, length: run.length };
103476
+ }
103477
+ function isClosingFence(line, fence) {
103478
+ const run = line.match(/^[ \t]{0,3}(`{3,}|~{3,})[ \t]*$/)?.[1];
103479
+ return run?.charAt(0) === fence.marker && run.length >= fence.length;
103480
+ }
103481
+
103414
103482
  // packages/boulder-state/src/plan-checklist.ts
103415
- var SIMPLE_CHECKBOX_PATTERN = /^[-*][ \t]*\[[ \t]*([xX]?)[ \t]*\][ \t]+(.+)$/;
103483
+ var SIMPLE_CHECKBOX_PATTERN = /^[-*][ \t]*\[[ \t]*([xX~]?)[ \t]*\][ \t]+(.+)$/;
103416
103484
  var TODO_HEADING_PATTERN = /^##[ \t]+TODOs(?:[ \t]+#+)?[ \t]*$/i;
103417
103485
  var FINAL_VERIFICATION_HEADING_PATTERN = /^##[ \t]+Final Verification Wave(?:[ \t]+#+)?[ \t]*$/i;
103418
103486
  var SECTION_BOUNDARY_HEADING_PATTERN = /^#{1,2}(?:[ \t]+|$)/;
103419
- var FENCE_PATTERN = /^[ \t]{0,3}(`{3,}|~{3,})(.*)$/;
103420
- var TODO_CHECKBOX_PATTERN = /^- \[([ xX])\] ([1-9]\d*\. .+)$/;
103421
- var FINAL_WAVE_CHECKBOX_PATTERN = /^- \[([ xX])\] (F[1-9]\d*\. .+)$/i;
103487
+ var STRUCTURED_CHECKBOX_PATTERN = /^- \[([ xX~])\] (.+)$/;
103488
+ var TODO_TASK_LABEL_PATTERN = /^([1-9]\d*|T[1-9]\d*(?:\.[1-9]\d*[a-z]?)?)(?:\.[ \t]+|[ \t]+(?:[-\u2014][ \t]+)?)(.+)$/i;
103489
+ var FINAL_WAVE_TASK_LABEL_PATTERN = /^([FH][1-9]\d*(?:\.[1-9]\d*[a-z]?)?)(?:\.[ \t]+|[ \t]+(?:[-\u2014][ \t]+)?)(.+)$/i;
103422
103490
  function parsePlanChecklist(markdown) {
103423
103491
  const lines = markdown.split(/\r?\n/);
103424
103492
  if (!hasStructuredSection(lines)) {
103425
103493
  return parseSimpleChecklist(lines);
103426
103494
  }
103427
- return parseStructuredPlan(lines).checklist;
103495
+ const structuredPlan = parseStructuredPlan(lines);
103496
+ if (structuredPlan.checklist.total === 0 && structuredPlan.hasUntrackedTopLevelCheckbox) {
103497
+ return parseSimpleChecklist(lines);
103498
+ }
103499
+ return structuredPlan.checklist;
103428
103500
  }
103429
103501
  function parseCurrentTopLevelTask(markdown) {
103430
103502
  const lines = markdown.split(/\r?\n/);
@@ -103434,10 +103506,12 @@ function parseCurrentTopLevelTask(markdown) {
103434
103506
  return parseStructuredPlan(lines).nextTask;
103435
103507
  }
103436
103508
  function parseStructuredPlan(lines) {
103509
+ let completed = 0;
103437
103510
  let remaining = 0;
103438
103511
  let total = 0;
103439
103512
  let nextTaskLabel = null;
103440
103513
  let nextTask = null;
103514
+ let hasUntrackedTopLevelCheckbox = false;
103441
103515
  let section = "other";
103442
103516
  let fence = null;
103443
103517
  for (const line of lines) {
@@ -103457,6 +103531,9 @@ function parseStructuredPlan(lines) {
103457
103531
  continue;
103458
103532
  }
103459
103533
  if (section === "other") {
103534
+ if (parseSimpleTopLevelCheckbox(line) !== null) {
103535
+ hasUntrackedTopLevelCheckbox = true;
103536
+ }
103460
103537
  continue;
103461
103538
  }
103462
103539
  const checkbox = parseStructuredTopLevelCheckbox(line, section);
@@ -103464,7 +103541,11 @@ function parseStructuredPlan(lines) {
103464
103541
  continue;
103465
103542
  }
103466
103543
  total += 1;
103467
- if (checkbox.checked) {
103544
+ if (checkbox.status === "done") {
103545
+ completed += 1;
103546
+ continue;
103547
+ }
103548
+ if (checkbox.status === "in-progress") {
103468
103549
  continue;
103469
103550
  }
103470
103551
  remaining += 1;
@@ -103475,15 +103556,17 @@ function parseStructuredPlan(lines) {
103475
103556
  }
103476
103557
  return {
103477
103558
  checklist: {
103478
- completed: total - remaining,
103559
+ completed,
103479
103560
  remaining,
103480
103561
  total,
103481
103562
  nextTaskLabel
103482
103563
  },
103483
- nextTask
103564
+ nextTask,
103565
+ hasUntrackedTopLevelCheckbox
103484
103566
  };
103485
103567
  }
103486
103568
  function parseSimpleChecklist(lines) {
103569
+ let completed = 0;
103487
103570
  let remaining = 0;
103488
103571
  let total = 0;
103489
103572
  let nextTaskLabel = null;
@@ -103505,7 +103588,11 @@ function parseSimpleChecklist(lines) {
103505
103588
  continue;
103506
103589
  }
103507
103590
  total += 1;
103508
- if (checkbox.checked) {
103591
+ if (checkbox.status === "done") {
103592
+ completed += 1;
103593
+ continue;
103594
+ }
103595
+ if (checkbox.status === "in-progress") {
103509
103596
  continue;
103510
103597
  }
103511
103598
  remaining += 1;
@@ -103513,7 +103600,7 @@ function parseSimpleChecklist(lines) {
103513
103600
  nextTaskLabel = checkbox.label;
103514
103601
  }
103515
103602
  }
103516
- return { completed: total - remaining, remaining, total, nextTaskLabel };
103603
+ return { completed, remaining, total, nextTaskLabel };
103517
103604
  }
103518
103605
  function parseSimpleTopLevelCheckbox(line) {
103519
103606
  const match = line.match(SIMPLE_CHECKBOX_PATTERN);
@@ -103522,7 +103609,13 @@ function parseSimpleTopLevelCheckbox(line) {
103522
103609
  if (marker === undefined || label === undefined) {
103523
103610
  return null;
103524
103611
  }
103525
- return { checked: marker.toLowerCase() === "x", label };
103612
+ return { status: parseCheckboxStatus(marker), label };
103613
+ }
103614
+ function parseCheckboxStatus(marker) {
103615
+ if (marker.toLowerCase() === "x") {
103616
+ return "done";
103617
+ }
103618
+ return marker === "~" ? "in-progress" : "open";
103526
103619
  }
103527
103620
  function hasStructuredSection(lines) {
103528
103621
  let fence = null;
@@ -103554,8 +103647,7 @@ function parseStructuredSectionHeading(line) {
103554
103647
  return "other";
103555
103648
  }
103556
103649
  function parseStructuredTopLevelCheckbox(line, section) {
103557
- const pattern = section === "todo" ? TODO_CHECKBOX_PATTERN : FINAL_WAVE_CHECKBOX_PATTERN;
103558
- const match = line.match(pattern);
103650
+ const match = line.match(STRUCTURED_CHECKBOX_PATTERN);
103559
103651
  const marker = match?.[1];
103560
103652
  const label = match?.[2];
103561
103653
  if (marker === undefined || label === undefined) {
@@ -103565,10 +103657,10 @@ function parseStructuredTopLevelCheckbox(line, section) {
103565
103657
  if (task === null) {
103566
103658
  return null;
103567
103659
  }
103568
- return { checked: marker.toLowerCase() === "x", label, task };
103660
+ return { status: parseCheckboxStatus(marker), label, task };
103569
103661
  }
103570
103662
  function buildTaskRef(section, label) {
103571
- const pattern = section === "todo" ? /^([1-9]\d*)\. (.+)$/ : /^(F[1-9]\d*)\. (.+)$/i;
103663
+ const pattern = section === "todo" ? TODO_TASK_LABEL_PATTERN : FINAL_WAVE_TASK_LABEL_PATTERN;
103572
103664
  const match = label.match(pattern);
103573
103665
  const rawLabel = match?.[1];
103574
103666
  const title = match?.[2];
@@ -103582,20 +103674,6 @@ function buildTaskRef(section, label) {
103582
103674
  title
103583
103675
  };
103584
103676
  }
103585
- function parseOpeningFence(line) {
103586
- const match = line.match(FENCE_PATTERN);
103587
- const run = match?.[1];
103588
- const info = match?.[2];
103589
- const marker = run?.charAt(0);
103590
- if (run === undefined || info === undefined || marker !== "`" && marker !== "~" || marker === "`" && info.includes("`")) {
103591
- return null;
103592
- }
103593
- return { marker, length: run.length };
103594
- }
103595
- function isClosingFence(line, fence) {
103596
- const run = line.match(/^[ \t]{0,3}(`{3,}|~{3,})[ \t]*$/)?.[1];
103597
- return run?.charAt(0) === fence.marker && run.length >= fence.length;
103598
- }
103599
103677
  // packages/boulder-state/src/top-level-task.ts
103600
103678
  import { existsSync as existsSync36, readFileSync as readFileSync19 } from "node:fs";
103601
103679
  function readCurrentTopLevelTask(planPath) {
@@ -103637,7 +103715,7 @@ function resolveBoulderPlanPathForWork(directory, work) {
103637
103715
  return resolveBoulderPlanPath(directory, work);
103638
103716
  }
103639
103717
  // packages/boulder-state/src/storage/plan-progress.ts
103640
- import { existsSync as existsSync38, readFileSync as readFileSync20, readdirSync as readdirSync9, statSync as statSync4 } from "node:fs";
103718
+ import { existsSync as existsSync38, readFileSync as readFileSync20, readdirSync as readdirSync9, statSync as statSync5 } from "node:fs";
103641
103719
  function getPlanProgress(planPath) {
103642
103720
  if (!existsSync38(planPath)) {
103643
103721
  return { total: 0, completed: 0, isComplete: false };
@@ -104056,7 +104134,7 @@ async function hasActiveBoulderContinuation(directory, sessionID, client) {
104056
104134
  if (!boulder || !boulder.active_plan)
104057
104135
  return false;
104058
104136
  const progress = getPlanProgress(resolveBoulderPlanPath(directory, boulder));
104059
- if (progress.isComplete)
104137
+ if (progress.isComplete || progress.total === 0)
104060
104138
  return false;
104061
104139
  if (!client)
104062
104140
  return false;
@@ -106254,13 +106332,14 @@ init_src();
106254
106332
  import { existsSync as existsSync55 } from "node:fs";
106255
106333
  import { createRequire as createRequire3 } from "node:module";
106256
106334
  import { homedir as homedir20 } from "node:os";
106257
- import { dirname as dirname33, join as join86 } from "node:path";
106335
+ import { dirname as dirname33, join as join87 } from "node:path";
106258
106336
 
106259
106337
  // packages/omo-opencode/src/hooks/comment-checker/downloader.ts
106260
- import { join as join85 } from "path";
106338
+ import { join as join86 } from "path";
106261
106339
  import { homedir as homedir19, tmpdir as tmpdir4 } from "os";
106262
106340
  // packages/comment-checker-core/src/release.ts
106263
106341
  import { join as join84 } from "node:path";
106342
+ var COMMENT_CHECKER_RELEASE_VERSION = "0.8.0";
106264
106343
  function commentCheckerBinaryName(platform) {
106265
106344
  return platform === "win32" ? "comment-checker.exe" : "comment-checker";
106266
106345
  }
@@ -106273,12 +106352,23 @@ function commentCheckerCacheDir(input) {
106273
106352
  const base = input.env.XDG_CACHE_HOME || join84(input.homedir, ".cache");
106274
106353
  return join84(base, input.cacheDirName, "bin");
106275
106354
  }
106355
+ // packages/comment-checker-core/src/cached-release.ts
106356
+ import { readFileSync as readFileSync37, writeFileSync as writeFileSync12 } from "node:fs";
106357
+ import { join as join85 } from "node:path";
106358
+ var COMMENT_CHECKER_VERSION_MARKER = "comment-checker.version";
106359
+ function isCachedCommentCheckerCurrent(cacheDir, readFile = (path) => readFileSync37(path, "utf-8")) {
106360
+ try {
106361
+ return readFile(join85(cacheDir, COMMENT_CHECKER_VERSION_MARKER)).trim() === COMMENT_CHECKER_RELEASE_VERSION;
106362
+ } catch {
106363
+ return false;
106364
+ }
106365
+ }
106276
106366
  // packages/omo-opencode/src/hooks/comment-checker/downloader.ts
106277
106367
  init_binary_downloader();
106278
106368
  init_logger2();
106279
106369
  init_plugin_identity();
106280
106370
  var DEBUG = process.env.COMMENT_CHECKER_DEBUG === "1";
106281
- var DEBUG_FILE = join85(tmpdir4(), "comment-checker-debug.log");
106371
+ var DEBUG_FILE = join86(tmpdir4(), "comment-checker-debug.log");
106282
106372
  function getCacheDir2() {
106283
106373
  return commentCheckerCacheDir({
106284
106374
  platform: process.platform,
@@ -106291,7 +106381,9 @@ function getBinaryName() {
106291
106381
  return commentCheckerBinaryName(process.platform);
106292
106382
  }
106293
106383
  function getCachedBinaryPath2() {
106294
- return getCachedBinaryPath(getCacheDir2(), getBinaryName());
106384
+ const cacheDir = getCacheDir2();
106385
+ const cached = getCachedBinaryPath(cacheDir, getBinaryName());
106386
+ return cached !== null && isCachedCommentCheckerCurrent(cacheDir) ? cached : null;
106295
106387
  }
106296
106388
 
106297
106389
  // packages/omo-opencode/src/cli/doctor/checks/dependencies.ts
@@ -106335,7 +106427,7 @@ async function getBinaryVersion(binary) {
106335
106427
  }
106336
106428
  }
106337
106429
  async function checkAstGrepCli() {
106338
- const runtimeDir = astGrepRuntimeDir(join86(homedir20(), ".omo"));
106430
+ const runtimeDir = astGrepRuntimeDir(join87(homedir20(), ".omo"));
106339
106431
  const sgPath = findSgBinarySync({ runtimeDir });
106340
106432
  if (sgPath === null) {
106341
106433
  return {
@@ -106365,10 +106457,10 @@ function findCommentCheckerPackageBinary(baseDirOverride, resolvePackageJsonPath
106365
106457
  const platformKey = `${process.platform}-${process.arch === "x64" ? "x64" : process.arch}`;
106366
106458
  try {
106367
106459
  const packageDir = baseDirOverride ?? dirname33(resolvePackageJsonPath());
106368
- const vendorPath = join86(packageDir, "vendor", platformKey, binaryName);
106460
+ const vendorPath = join87(packageDir, "vendor", platformKey, binaryName);
106369
106461
  if (existsSync55(vendorPath))
106370
106462
  return vendorPath;
106371
- const binPath = join86(packageDir, "bin", binaryName);
106463
+ const binPath = join87(packageDir, "bin", binaryName);
106372
106464
  if (existsSync55(binPath))
106373
106465
  return binPath;
106374
106466
  } catch (error) {
@@ -106515,7 +106607,7 @@ async function getGhCliInfo(dependencies = {}) {
106515
106607
  // packages/omo-opencode/src/mcp/lsp.ts
106516
106608
  init_zod();
106517
106609
  init_opencode_config_dir();
106518
- import { existsSync as existsSync56, readFileSync as readFileSync37 } from "node:fs";
106610
+ import { existsSync as existsSync56, readFileSync as readFileSync38 } from "node:fs";
106519
106611
  import { delimiter as delimiter3, dirname as dirname34, resolve as resolve23 } from "node:path";
106520
106612
  import { fileURLToPath as fileURLToPath7 } from "node:url";
106521
106613
 
@@ -106659,7 +106751,7 @@ function findBootstrapRoot(candidates, pathExists) {
106659
106751
  }
106660
106752
  function readDaemonPackageVersion(root) {
106661
106753
  try {
106662
- const packageJson = JSON.parse(readFileSync37(resolve23(root, PACKAGE_REL, "package.json"), "utf-8"));
106754
+ const packageJson = JSON.parse(readFileSync38(resolve23(root, PACKAGE_REL, "package.json"), "utf-8"));
106663
106755
  return DaemonPackageSchema.parse(packageJson).version;
106664
106756
  } catch (error) {
106665
106757
  if (!(error instanceof Error))
@@ -106742,15 +106834,15 @@ function getInstalledLspServers(options = {}) {
106742
106834
 
106743
106835
  // packages/omo-opencode/src/cli/doctor/checks/tools-mcp.ts
106744
106836
  init_shared();
106745
- import { existsSync as existsSync57, readFileSync as readFileSync38 } from "node:fs";
106837
+ import { existsSync as existsSync57, readFileSync as readFileSync39 } from "node:fs";
106746
106838
  import { homedir as homedir21 } from "node:os";
106747
- import { join as join87 } from "node:path";
106839
+ import { join as join88 } from "node:path";
106748
106840
  var BUILTIN_MCP_SERVERS = ["websearch", "context7", "grep_app", "lsp"];
106749
106841
  function getMcpConfigPaths() {
106750
106842
  return [
106751
- join87(homedir21(), ".claude", ".mcp.json"),
106752
- join87(process.cwd(), ".mcp.json"),
106753
- join87(process.cwd(), ".claude", ".mcp.json")
106843
+ join88(homedir21(), ".claude", ".mcp.json"),
106844
+ join88(process.cwd(), ".mcp.json"),
106845
+ join88(process.cwd(), ".claude", ".mcp.json")
106754
106846
  ];
106755
106847
  }
106756
106848
  function loadUserMcpConfig() {
@@ -106759,7 +106851,7 @@ function loadUserMcpConfig() {
106759
106851
  if (!existsSync57(configPath))
106760
106852
  continue;
106761
106853
  try {
106762
- const content = readFileSync38(configPath, "utf-8");
106854
+ const content = readFileSync39(configPath, "utf-8");
106763
106855
  const config = parseJsonc(content);
106764
106856
  if (config.mcpServers) {
106765
106857
  Object.assign(servers, config.mcpServers);
@@ -106894,7 +106986,7 @@ async function checkTools() {
106894
106986
 
106895
106987
  // packages/omo-opencode/src/cli/doctor/checks/telemetry.ts
106896
106988
  init_src5();
106897
- import { existsSync as existsSync58, readFileSync as readFileSync39 } from "node:fs";
106989
+ import { existsSync as existsSync58, readFileSync as readFileSync40 } from "node:fs";
106898
106990
  function isTelemetryState(value) {
106899
106991
  return value !== null && typeof value === "object" && !Array.isArray(value);
106900
106992
  }
@@ -106904,7 +106996,7 @@ function readLastActiveDay(stateFilePath) {
106904
106996
  }
106905
106997
  let parsed;
106906
106998
  try {
106907
- parsed = JSON.parse(readFileSync39(stateFilePath, "utf-8"));
106999
+ parsed = JSON.parse(readFileSync40(stateFilePath, "utf-8"));
106908
107000
  } catch (error) {
106909
107001
  if (error instanceof Error) {
106910
107002
  return "unreadable";
@@ -107032,7 +107124,7 @@ init_src();
107032
107124
  import { existsSync as existsSync59 } from "node:fs";
107033
107125
  import { lstat as lstat16, readdir as readdir14, readFile as readFile28 } from "node:fs/promises";
107034
107126
  import { homedir as homedir23 } from "node:os";
107035
- import { basename as basename12, join as join88, resolve as resolve24 } from "node:path";
107127
+ import { basename as basename12, join as join89, resolve as resolve24 } from "node:path";
107036
107128
  // packages/omo-opencode/package.json
107037
107129
  var package_default3 = {
107038
107130
  name: "@oh-my-opencode/omo-opencode",
@@ -107102,13 +107194,13 @@ var CODEX_BIN_NAMES = [
107102
107194
  "omo-git-bash-hook"
107103
107195
  ];
107104
107196
  async function gatherCodexSummary(deps = {}) {
107105
- const codexHome = resolve24(deps.codexHome ?? process.env.CODEX_HOME ?? join88(homedir23(), ".codex"));
107197
+ const codexHome = resolve24(deps.codexHome ?? process.env.CODEX_HOME ?? join89(homedir23(), ".codex"));
107106
107198
  const binDir = resolveCodexInstallerBinDir({ binDir: deps.binDir, codexHome, env: process.env });
107107
107199
  const detection = await (deps.detectCodexInstallation ?? detectCodexInstallation)();
107108
107200
  const pluginRoot = await resolveInstalledPluginRoot(codexHome);
107109
- const manifest = pluginRoot === null ? null : await readJson(join88(pluginRoot, ".codex-plugin", "plugin.json"));
107110
- const installSnapshot = pluginRoot === null ? null : await readJson(join88(pluginRoot, "lazycodex-install.json"));
107111
- const configPath = join88(codexHome, "config.toml");
107201
+ const manifest = pluginRoot === null ? null : await readJson(join89(pluginRoot, ".codex-plugin", "plugin.json"));
107202
+ const installSnapshot = pluginRoot === null ? null : await readJson(join89(pluginRoot, "lazycodex-install.json"));
107203
+ const configPath = join89(codexHome, "config.toml");
107112
107204
  const pluginVersion = stringField(manifest, "version");
107113
107205
  return {
107114
107206
  codexPath: detection.found && "path" in detection ? detection.path : null,
@@ -107165,7 +107257,7 @@ function buildCodexIssues(summary) {
107165
107257
  if (summary.pluginRoot === null) {
107166
107258
  issues.push({
107167
107259
  title: "OMO Codex plugin is not installed",
107168
- description: `Expected cached plugin at ${join88("plugins", "cache", MARKETPLACE_NAME, PLUGIN_NAME2, DEFAULT_PLUGIN_VERSION)} under CODEX_HOME.`,
107260
+ description: `Expected cached plugin at ${join89("plugins", "cache", MARKETPLACE_NAME, PLUGIN_NAME2, DEFAULT_PLUGIN_VERSION)} under CODEX_HOME.`,
107169
107261
  fix: "Run: npx lazycodex-ai install",
107170
107262
  severity: "error",
107171
107263
  affects: ["plugin loading"]
@@ -107230,12 +107322,12 @@ function buildCodexIssues(summary) {
107230
107322
  return issues;
107231
107323
  }
107232
107324
  async function resolveInstalledPluginRoot(codexHome) {
107233
- const pluginRoot = join88(codexHome, "plugins", "cache", MARKETPLACE_NAME, PLUGIN_NAME2);
107325
+ const pluginRoot = join89(codexHome, "plugins", "cache", MARKETPLACE_NAME, PLUGIN_NAME2);
107234
107326
  if (!existsSync59(pluginRoot))
107235
107327
  return null;
107236
107328
  const versions = await readdir14(pluginRoot, { withFileTypes: true });
107237
107329
  const candidates = versions.filter((entry) => entry.isDirectory()).map((entry) => entry.name).sort(compareVersionsDescending);
107238
- return candidates.length === 0 ? null : join88(pluginRoot, candidates[0] ?? DEFAULT_PLUGIN_VERSION);
107330
+ return candidates.length === 0 ? null : join89(pluginRoot, candidates[0] ?? DEFAULT_PLUGIN_VERSION);
107239
107331
  }
107240
107332
  async function readCodexConfigSummary(configPath) {
107241
107333
  if (!existsSync59(configPath)) {
@@ -107263,13 +107355,13 @@ async function readCodexConfigSummary(configPath) {
107263
107355
  async function readLinkedBins(binDir) {
107264
107356
  const linked = [];
107265
107357
  for (const name of CODEX_BIN_NAMES) {
107266
- if (await pathExists3(join88(binDir, process.platform === "win32" ? `${name}.cmd` : name)))
107358
+ if (await pathExists3(join89(binDir, process.platform === "win32" ? `${name}.cmd` : name)))
107267
107359
  linked.push(name);
107268
107360
  }
107269
107361
  return linked;
107270
107362
  }
107271
107363
  async function readLinkedAgents(codexHome) {
107272
- const agentsDir = join88(codexHome, "agents");
107364
+ const agentsDir = join89(codexHome, "agents");
107273
107365
  if (!existsSync59(agentsDir))
107274
107366
  return [];
107275
107367
  const entries = await readdir14(agentsDir, { withFileTypes: true });
@@ -107403,7 +107495,7 @@ function resolveLatestVersion(input) {
107403
107495
  init_src();
107404
107496
  import { readdir as readdir15, readFile as readFile29, stat as stat7 } from "node:fs/promises";
107405
107497
  import { homedir as homedir24 } from "node:os";
107406
- import { dirname as dirname35, isAbsolute as isAbsolute14, join as join89, relative as relative9, resolve as resolve25, sep as sep9 } from "node:path";
107498
+ import { dirname as dirname35, isAbsolute as isAbsolute14, join as join90, relative as relative9, resolve as resolve25, sep as sep9 } from "node:path";
107407
107499
  var CODEX_COMPONENTS_CHECK_ID = "codex-components";
107408
107500
  var CODEX_COMPONENTS_CHECK_NAME = "codex-components";
107409
107501
  var PLUGIN_DATA_DIR_NAME = "omo-sisyphuslabs";
@@ -107413,7 +107505,7 @@ async function checkCodexComponents(deps = {}) {
107413
107505
  const env = deps.env ?? process.env;
107414
107506
  const platform = deps.platform ?? process.platform;
107415
107507
  const arch = deps.arch ?? process.arch;
107416
- const codexHome = resolve25(deps.codexHome ?? env["CODEX_HOME"] ?? join89(homedir24(), ".codex"));
107508
+ const codexHome = resolve25(deps.codexHome ?? env["CODEX_HOME"] ?? join90(homedir24(), ".codex"));
107417
107509
  const summary = await gatherCodexSummary({ ...deps, codexHome });
107418
107510
  if (summary.pluginRoot === null) {
107419
107511
  return {
@@ -107438,7 +107530,7 @@ async function checkCodexComponents(deps = {}) {
107438
107530
  });
107439
107531
  }
107440
107532
  const runtimeSgDir = runtimeSgDirectory(codexHome, platform, arch);
107441
- const runtimeSgPath = join89(runtimeSgDir, sgBinaryName(platform));
107533
+ const runtimeSgPath = join90(runtimeSgDir, sgBinaryName(platform));
107442
107534
  const sg = findSgBinarySync({
107443
107535
  arch,
107444
107536
  env,
@@ -107550,7 +107642,7 @@ async function findManifestPaths(root, manifestName) {
107550
107642
  for (const entry of entries) {
107551
107643
  if (entry.name === "node_modules" || entry.name === ".git")
107552
107644
  continue;
107553
- const entryPath = join89(root, entry.name);
107645
+ const entryPath = join90(root, entry.name);
107554
107646
  if (entry.isDirectory()) {
107555
107647
  paths.push(...await findManifestPaths(entryPath, manifestName));
107556
107648
  continue;
@@ -107594,18 +107686,18 @@ function isPluginRuntimePathArg(arg) {
107594
107686
  return normalized.endsWith(".js") && normalized.includes("/dist/") && (normalized.startsWith("./") || normalized.startsWith("../") || normalized.startsWith("components/") || normalized.startsWith("/") || isAbsolute14(arg));
107595
107687
  }
107596
107688
  function runtimeSgDirectory(codexHome, platform, arch) {
107597
- return join89(codexHome, "runtime", "ast-grep", runtimeSlug(platform, arch));
107689
+ return join90(codexHome, "runtime", "ast-grep", runtimeSlug(platform, arch));
107598
107690
  }
107599
107691
  function describeSgSource(sgPath, env, runtimeSgDir, platform) {
107600
107692
  const override = env[SG_PATH_ENV_KEY]?.trim();
107601
107693
  if (override !== undefined && override.length > 0 && sgPath === override)
107602
107694
  return `env override ${SG_PATH_ENV_KEY}`;
107603
- if (sgPath === join89(runtimeSgDir, sgBinaryName(platform)))
107695
+ if (sgPath === join90(runtimeSgDir, sgBinaryName(platform)))
107604
107696
  return "runtime dir";
107605
107697
  return "PATH";
107606
107698
  }
107607
107699
  async function readBootstrapStateSummary(codexHome) {
107608
- const statePath = join89(codexHome, "plugins", "data", PLUGIN_DATA_DIR_NAME, "bootstrap", "state.json");
107700
+ const statePath = join90(codexHome, "plugins", "data", PLUGIN_DATA_DIR_NAME, "bootstrap", "state.json");
107609
107701
  const raw = await readJson2(statePath);
107610
107702
  if (raw === null)
107611
107703
  return null;
@@ -107684,16 +107776,16 @@ function isRecord18(value) {
107684
107776
  import { existsSync as existsSync60 } from "node:fs";
107685
107777
  import { readFile as readFile30 } from "node:fs/promises";
107686
107778
  import { homedir as homedir25 } from "node:os";
107687
- import { join as join90, resolve as resolve26 } from "node:path";
107779
+ import { join as join91, resolve as resolve26 } from "node:path";
107688
107780
  var RUNTIME_WRAPPER_MARKER2 = "OMO_GENERATED_RUNTIME_WRAPPER";
107689
107781
  var CHECK_NAME = "codex-runtime-wrapper";
107690
107782
  var REINSTALL_COMMAND = "npx --yes lazycodex-ai@latest install --no-tui";
107691
107783
  async function checkCodexRuntimeWrapper(deps = {}) {
107692
- const codexHome = resolve26(deps.codexHome ?? process.env.CODEX_HOME ?? join90(homedir25(), ".codex"));
107784
+ const codexHome = resolve26(deps.codexHome ?? process.env.CODEX_HOME ?? join91(homedir25(), ".codex"));
107693
107785
  const binDir = resolveCodexInstallerBinDir({ binDir: deps.binDir, codexHome, env: process.env });
107694
107786
  const platform = deps.platform ?? process.platform;
107695
- const wrapperPath = join90(binDir, platform === "win32" ? "omo-agent-toolkit.cmd" : "omo-agent-toolkit");
107696
- const legacyWrapperPath = join90(binDir, platform === "win32" ? "omo.cmd" : "omo");
107787
+ const wrapperPath = join91(binDir, platform === "win32" ? "omo-agent-toolkit.cmd" : "omo-agent-toolkit");
107788
+ const legacyWrapperPath = join91(binDir, platform === "win32" ? "omo.cmd" : "omo");
107697
107789
  const [wrapper, legacyWrapper] = await Promise.all([readRuntimeWrapper(wrapperPath), readRuntimeWrapper(legacyWrapperPath)]);
107698
107790
  const issues = [];
107699
107791
  if (wrapper?.includes(RUNTIME_WRAPPER_MARKER2) === true) {
@@ -108224,17 +108316,17 @@ import {
108224
108316
  existsSync as existsSync63,
108225
108317
  mkdirSync as mkdirSync17,
108226
108318
  readdirSync as readdirSync13,
108227
- readFileSync as readFileSync41,
108319
+ readFileSync as readFileSync42,
108228
108320
  renameSync as renameSync8,
108229
108321
  unlinkSync as unlinkSync9,
108230
- writeFileSync as writeFileSync13
108322
+ writeFileSync as writeFileSync14
108231
108323
  } from "node:fs";
108232
- import { basename as basename13, dirname as dirname36, join as join93 } from "node:path";
108324
+ import { basename as basename13, dirname as dirname36, join as join94 } from "node:path";
108233
108325
 
108234
108326
  // packages/mcp-client-core/src/config-dir.ts
108235
108327
  import { existsSync as existsSync61, realpathSync as realpathSync10 } from "node:fs";
108236
108328
  import { homedir as homedir26 } from "node:os";
108237
- import { join as join91, resolve as resolve27 } from "node:path";
108329
+ import { join as join92, resolve as resolve27 } from "node:path";
108238
108330
  function resolveConfigPath2(pathValue) {
108239
108331
  const resolvedPath = resolve27(pathValue);
108240
108332
  if (!existsSync61(resolvedPath))
@@ -108252,13 +108344,13 @@ function getOpenCodeCliConfigDir(env = process.env) {
108252
108344
  if (customConfigDir) {
108253
108345
  return resolveConfigPath2(customConfigDir);
108254
108346
  }
108255
- const xdgConfigDir = env["XDG_CONFIG_HOME"]?.trim() || join91(homedir26(), ".config");
108256
- return resolveConfigPath2(join91(xdgConfigDir, "opencode"));
108347
+ const xdgConfigDir = env["XDG_CONFIG_HOME"]?.trim() || join92(homedir26(), ".config");
108348
+ return resolveConfigPath2(join92(xdgConfigDir, "opencode"));
108257
108349
  }
108258
108350
 
108259
108351
  // packages/mcp-client-core/src/mcp-oauth/storage-index.ts
108260
- import { chmodSync as chmodSync4, existsSync as existsSync62, readFileSync as readFileSync40, renameSync as renameSync7, writeFileSync as writeFileSync12 } from "node:fs";
108261
- import { join as join92 } from "node:path";
108352
+ import { chmodSync as chmodSync4, existsSync as existsSync62, readFileSync as readFileSync41, renameSync as renameSync7, writeFileSync as writeFileSync13 } from "node:fs";
108353
+ import { join as join93 } from "node:path";
108262
108354
  var INDEX_FILE_NAME = "index.json";
108263
108355
  function isTokenIndex(value) {
108264
108356
  if (typeof value !== "object" || value === null || Array.isArray(value))
@@ -108266,14 +108358,14 @@ function isTokenIndex(value) {
108266
108358
  return Object.values(value).every((entry) => typeof entry === "string");
108267
108359
  }
108268
108360
  function getIndexPath(storageDir) {
108269
- return join92(storageDir, INDEX_FILE_NAME);
108361
+ return join93(storageDir, INDEX_FILE_NAME);
108270
108362
  }
108271
108363
  function readTokenIndex(storageDir) {
108272
108364
  const indexPath = getIndexPath(storageDir);
108273
108365
  if (!existsSync62(indexPath))
108274
108366
  return {};
108275
108367
  try {
108276
- const parsed = JSON.parse(readFileSync40(indexPath, "utf-8"));
108368
+ const parsed = JSON.parse(readFileSync41(indexPath, "utf-8"));
108277
108369
  return isTokenIndex(parsed) ? parsed : {};
108278
108370
  } catch (readError) {
108279
108371
  if (!(readError instanceof Error))
@@ -108285,7 +108377,7 @@ function writeTokenIndex(storageDir, index) {
108285
108377
  try {
108286
108378
  const indexPath = getIndexPath(storageDir);
108287
108379
  const tempPath = `${indexPath}.tmp.${Date.now()}`;
108288
- writeFileSync12(tempPath, JSON.stringify(index, null, 2), { encoding: "utf-8", mode: 384 });
108380
+ writeFileSync13(tempPath, JSON.stringify(index, null, 2), { encoding: "utf-8", mode: 384 });
108289
108381
  chmodSync4(tempPath, 384);
108290
108382
  renameSync7(tempPath, indexPath);
108291
108383
  return true;
@@ -108310,16 +108402,16 @@ function deleteTokenIndexEntry(storageDir, hash) {
108310
108402
  var STORAGE_DIR_NAME = "mcp-oauth";
108311
108403
  var LEGACY_STORAGE_FILE_NAME = "mcp-oauth.json";
108312
108404
  function getMcpOauthStorageDir() {
108313
- return join93(getOpenCodeCliConfigDir(), STORAGE_DIR_NAME);
108405
+ return join94(getOpenCodeCliConfigDir(), STORAGE_DIR_NAME);
108314
108406
  }
108315
108407
  function getMcpOauthServerHash(serverHost, resource) {
108316
108408
  return createHash7("sha256").update(buildKey(serverHost, resource)).digest("hex").slice(0, 32);
108317
108409
  }
108318
108410
  function getMcpOauthStoragePath(serverHost, resource) {
108319
- return join93(getMcpOauthStorageDir(), `${getMcpOauthServerHash(serverHost, resource)}.json`);
108411
+ return join94(getMcpOauthStorageDir(), `${getMcpOauthServerHash(serverHost, resource)}.json`);
108320
108412
  }
108321
108413
  function getLegacyStoragePath() {
108322
- return join93(getOpenCodeCliConfigDir(), LEGACY_STORAGE_FILE_NAME);
108414
+ return join94(getOpenCodeCliConfigDir(), LEGACY_STORAGE_FILE_NAME);
108323
108415
  }
108324
108416
  function normalizeHost2(serverHost) {
108325
108417
  let host = serverHost.trim();
@@ -108383,7 +108475,7 @@ function readTokenFile(filePath) {
108383
108475
  if (!existsSync63(filePath))
108384
108476
  return null;
108385
108477
  try {
108386
- const parsed = JSON.parse(readFileSync41(filePath, "utf-8"));
108478
+ const parsed = JSON.parse(readFileSync42(filePath, "utf-8"));
108387
108479
  return isOAuthTokenData(parsed) ? parsed : null;
108388
108480
  } catch (readError) {
108389
108481
  if (!(readError instanceof Error))
@@ -108396,7 +108488,7 @@ function readLegacyStore() {
108396
108488
  if (!existsSync63(filePath))
108397
108489
  return null;
108398
108490
  try {
108399
- const parsed = JSON.parse(readFileSync41(filePath, "utf-8"));
108491
+ const parsed = JSON.parse(readFileSync42(filePath, "utf-8"));
108400
108492
  if (typeof parsed !== "object" || parsed === null || Array.isArray(parsed))
108401
108493
  return null;
108402
108494
  const result = {};
@@ -108418,7 +108510,7 @@ function writeTokenFile(filePath, token) {
108418
108510
  mkdirSync17(dir, { recursive: true });
108419
108511
  }
108420
108512
  const tempPath = `${filePath}.tmp.${Date.now()}`;
108421
- writeFileSync13(tempPath, JSON.stringify(token, null, 2), { encoding: "utf-8", mode: 384 });
108513
+ writeFileSync14(tempPath, JSON.stringify(token, null, 2), { encoding: "utf-8", mode: 384 });
108422
108514
  chmodSync5(tempPath, 384);
108423
108515
  renameSync8(tempPath, filePath);
108424
108516
  return true;
@@ -108474,7 +108566,7 @@ function deleteLegacyToken(serverHost, resource) {
108474
108566
  function writeLegacyStore(store) {
108475
108567
  try {
108476
108568
  const filePath = getLegacyStoragePath();
108477
- writeFileSync13(filePath, JSON.stringify(store, null, 2), { encoding: "utf-8", mode: 384 });
108569
+ writeFileSync14(filePath, JSON.stringify(store, null, 2), { encoding: "utf-8", mode: 384 });
108478
108570
  chmodSync5(filePath, 384);
108479
108571
  return true;
108480
108572
  } catch (writeError) {
@@ -108498,7 +108590,7 @@ function listTokensByHost(serverHost) {
108498
108590
  for (const [hash, indexedKey] of Object.entries(index)) {
108499
108591
  if (!indexedKey.startsWith(prefix))
108500
108592
  continue;
108501
- const indexedToken = readTokenFile(join93(getMcpOauthStorageDir(), `${hash}.json`));
108593
+ const indexedToken = readTokenFile(join94(getMcpOauthStorageDir(), `${hash}.json`));
108502
108594
  if (indexedToken)
108503
108595
  result[indexedKey] = indexedToken;
108504
108596
  }
@@ -108513,7 +108605,7 @@ function listAllTokens() {
108513
108605
  for (const entry of readdirSync13(dir, { withFileTypes: true })) {
108514
108606
  if (!entry.isFile() || !entry.name.endsWith(".json") || entry.name === "index.json")
108515
108607
  continue;
108516
- const token = readTokenFile(join93(dir, entry.name));
108608
+ const token = readTokenFile(join94(dir, entry.name));
108517
108609
  const hash = basename13(entry.name, ".json");
108518
108610
  if (token)
108519
108611
  result[index[hash] ?? hash] = token;
@@ -109237,7 +109329,7 @@ async function boulder(options) {
109237
109329
  }
109238
109330
  // packages/omo-opencode/src/cli/codex-ulw-loop.ts
109239
109331
  import { spawn as spawn5 } from "node:child_process";
109240
- import { existsSync as existsSync65, readFileSync as readFileSync42, realpathSync as realpathSync11 } from "node:fs";
109332
+ import { existsSync as existsSync65, readFileSync as readFileSync43, realpathSync as realpathSync11 } from "node:fs";
109241
109333
  import { homedir as homedir27 } from "node:os";
109242
109334
  var ULW_LOOP_DELEGATION_SENTINEL = "OMO_ULW_LOOP_DELEGATED";
109243
109335
  function resolveCodexUlwLoopCommand(input = {}) {
@@ -109287,7 +109379,7 @@ function resolveLegacyLocalOmoBin(env, homeDir, currentExecutablePaths) {
109287
109379
  }
109288
109380
  function isGeneratedRuntimeWrapper(candidate) {
109289
109381
  try {
109290
- return readFileSync42(candidate, "utf8").includes(RUNTIME_WRAPPER_MARKER);
109382
+ return readFileSync43(candidate, "utf8").includes(RUNTIME_WRAPPER_MARKER);
109291
109383
  } catch (error) {
109292
109384
  if (error instanceof Error)
109293
109385
  return false;