lazycodex-ai 5.0.1 → 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 (79) hide show
  1. package/README.ja.md +2 -1
  2. package/README.ko.md +2 -1
  3. package/README.md +2 -1
  4. package/README.ru.md +2 -1
  5. package/README.zh-cn.md +2 -1
  6. package/dist/cli/index.js +241 -144
  7. package/dist/cli-node/index.js +241 -144
  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/scripts/install-dist/install-local.mjs +37 -14
  71. package/packages/shared-skills/skills/browser/runtime/omowright/manifest.json +1 -1
  72. package/packages/shared-skills/skills/coding-agent-sessions/SKILL.md +1 -1
  73. package/packages/shared-skills/skills/coding-agent-sessions/scripts/agent_sessions/aside_scanner.py +3 -0
  74. package/packages/shared-skills/skills/coding-agent-sessions/scripts/agent_sessions/cli.py +4 -0
  75. package/packages/shared-skills/skills/coding-agent-sessions/scripts/agent_sessions/file_scanners.py +6 -2
  76. package/packages/shared-skills/skills/coding-agent-sessions/scripts/agent_sessions/scanners.py +7 -1
  77. package/packages/shared-skills/skills/coding-agent-sessions/scripts/agent_sessions/transcript.py +3 -1
  78. package/packages/shared-skills/skills/coding-agent-sessions/scripts/agent_sessions/types.py +3 -1
  79. 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.1",
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.27",
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.1",
293
- "oh-my-opencode-darwin-x64": "5.0.1",
294
- "oh-my-opencode-darwin-x64-baseline": "5.0.1",
295
- "oh-my-opencode-linux-arm64": "5.0.1",
296
- "oh-my-opencode-linux-arm64-musl": "5.0.1",
297
- "oh-my-opencode-linux-x64": "5.0.1",
298
- "oh-my-opencode-linux-x64-baseline": "5.0.1",
299
- "oh-my-opencode-linux-x64-musl": "5.0.1",
300
- "oh-my-opencode-linux-x64-musl-baseline": "5.0.1",
301
- "oh-my-opencode-windows-arm64": "5.0.1",
302
- "oh-my-opencode-windows-x64": "5.0.1",
303
- "oh-my-opencode-windows-x64-baseline": "5.0.1"
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)) {
@@ -8041,8 +8055,17 @@ var init_model_resolver = () => {};
8041
8055
  // packages/model-core/src/fallback-chain-from-models.ts
8042
8056
  var init_fallback_chain_from_models = () => {};
8043
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
+
8044
8067
  // packages/model-core/src/model-error-classifier.ts
8045
- var RETRYABLE_ERROR_NAMES, STOP_ERROR_NAMES, NON_RETRYABLE_ERROR_NAMES;
8068
+ var RETRYABLE_ERROR_NAMES, NON_RETRYABLE_ERROR_NAMES;
8046
8069
  var init_model_error_classifier = __esm(() => {
8047
8070
  RETRYABLE_ERROR_NAMES = new Set([
8048
8071
  "providermodelnotfounderror",
@@ -8051,11 +8074,6 @@ var init_model_error_classifier = __esm(() => {
8051
8074
  "providerconnectionerror",
8052
8075
  "authenticationerror"
8053
8076
  ]);
8054
- STOP_ERROR_NAMES = new Set([
8055
- "quotaexceedederror",
8056
- "insufficientcreditserror",
8057
- "freeusagelimiterror"
8058
- ]);
8059
8077
  NON_RETRYABLE_ERROR_NAMES = new Set([
8060
8078
  "messageabortederror",
8061
8079
  "permissiondeniederror",
@@ -8067,15 +8085,6 @@ var init_model_error_classifier = __esm(() => {
8067
8085
  ]);
8068
8086
  });
8069
8087
 
8070
- // packages/model-core/src/runtime-fallback-auto-retry-signal.ts
8071
- var init_runtime_fallback_auto_retry_signal = () => {};
8072
-
8073
- // packages/model-core/src/runtime-fallback-error-shape.ts
8074
- var init_runtime_fallback_error_shape = () => {};
8075
-
8076
- // packages/model-core/src/runtime-fallback-error-classifier.ts
8077
- var init_runtime_fallback_error_classifier = () => {};
8078
-
8079
8088
  // packages/model-core/src/provider-exhaustion-fallback-policy.ts
8080
8089
  var init_provider_exhaustion_fallback_policy = () => {};
8081
8090
 
@@ -74415,6 +74424,29 @@ var init_category = __esm(() => {
74415
74424
  OmoCategoriesConfigSchema = record(string2(), OmoCategoryConfigSchema);
74416
74425
  });
74417
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
+
74418
74450
  // packages/omo-config-core/src/schema/git-master.ts
74419
74451
  var OmoGitMasterSettingsShape, OmoGitMasterSettingsLayerSchema, OmoGitMasterSettingsSchema;
74420
74452
  var init_git_master = __esm(() => {
@@ -74687,11 +74719,11 @@ function resolveOmoTaskSettings(input, resolveParallelism = availableParallelism
74687
74719
  const record2 = record(string2(), unknown()).parse(input);
74688
74720
  return OmoTaskSettingsSchema.parse({
74689
74721
  ...record2,
74690
- 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,
74691
74723
  global_concurrency: record2["global_concurrency"] ?? Math.max(8, resolveParallelism() * 2)
74692
74724
  });
74693
74725
  }
74694
- 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;
74695
74727
  var init_task = __esm(() => {
74696
74728
  init_zod();
74697
74729
  ResidencyMaxChildrenInputSchema = union([number2().int().nonnegative(), literal("unlimited")]);
@@ -74754,7 +74786,7 @@ var init_task = __esm(() => {
74754
74786
  provider_concurrency: record(string2(), number2().int().nonnegative()).optional(),
74755
74787
  model_concurrency: record(string2(), number2().int().nonnegative()).optional(),
74756
74788
  max_depth: number2().int().nonnegative().default(1),
74757
- residency_max_children: ResidencyMaxChildrenInputSchema.default(8),
74789
+ residency_max_children: ResidencyMaxChildrenInputSchema.default(DEFAULT_RESIDENCY_MAX_CHILDREN),
74758
74790
  resident_idle_timeout_ms: number2().int().positive().max(Number.MAX_SAFE_INTEGER).default(900000),
74759
74791
  ttl_ms: number2().int().positive().default(86400000),
74760
74792
  state_dir: string2().optional(),
@@ -74905,6 +74937,7 @@ var init_config = __esm(() => {
74905
74937
  init_zod();
74906
74938
  init_agent();
74907
74939
  init_category();
74940
+ init_computer();
74908
74941
  init_git_master();
74909
74942
  init_memory();
74910
74943
  init_model_catalog();
@@ -74927,6 +74960,7 @@ var init_config = __esm(() => {
74927
74960
  model_profile: string2().optional(),
74928
74961
  memory: OmoMemorySettingsLayerSchema.optional(),
74929
74962
  telemetry: OmoTelemetrySettingsLayerSchema.optional(),
74963
+ computer: OmoComputerSettingsLayerSchema.optional(),
74930
74964
  disabled_skills: OmoDisabledSkillsSchema.optional()
74931
74965
  }).strict();
74932
74966
  OmoConfigProfileSchema = object({
@@ -74941,6 +74975,7 @@ var init_config = __esm(() => {
74941
74975
  model_profile: string2().optional(),
74942
74976
  memory: OmoMemorySettingsLayerSchema.optional(),
74943
74977
  telemetry: OmoTelemetrySettingsLayerSchema.optional(),
74978
+ computer: OmoComputerSettingsLayerSchema.optional(),
74944
74979
  disabled_skills: OmoDisabledSkillsSchema.optional(),
74945
74980
  "[opencode]": OmoOpenCodeHarnessConfigSchema.optional(),
74946
74981
  "[native]": OmoTypedHarnessConfigSchema.optional(),
@@ -74960,6 +74995,7 @@ var init_config = __esm(() => {
74960
74995
  model_profile: string2().optional(),
74961
74996
  memory: OmoMemorySettingsSchema.optional(),
74962
74997
  telemetry: OmoTelemetrySettingsSchema.optional(),
74998
+ computer: OmoComputerSettingsSchema.optional(),
74963
74999
  disabled_skills: OmoDisabledSkillsSchema.optional(),
74964
75000
  "[opencode]": OmoOpenCodeHarnessConfigSchema.optional(),
74965
75001
  "[native]": OmoTypedHarnessConfigSchema.optional(),
@@ -74982,6 +75018,7 @@ var init_config = __esm(() => {
74982
75018
  model_profile: string2().optional(),
74983
75019
  memory: OmoMemorySettingsLayerSchema.optional(),
74984
75020
  telemetry: OmoTelemetrySettingsLayerSchema.optional(),
75021
+ computer: OmoComputerSettingsLayerSchema.optional(),
74985
75022
  disabled_skills: OmoDisabledSkillsSchema.optional(),
74986
75023
  "[opencode]": OmoOpenCodeHarnessConfigSchema.optional(),
74987
75024
  "[native]": OmoTypedHarnessConfigSchema.optional(),
@@ -75127,6 +75164,7 @@ var init_schema = __esm(() => {
75127
75164
  init_task();
75128
75165
  init_team();
75129
75166
  init_telemetry();
75167
+ init_computer();
75130
75168
  });
75131
75169
 
75132
75170
  // packages/omo-config-core/src/loader/disabled-skills.ts
@@ -85438,7 +85476,7 @@ class SyncSpanContextManager {
85438
85476
  var init_context = () => {};
85439
85477
 
85440
85478
  // node_modules/.bun/@posthog+core@1.55.0/node_modules/@posthog/core/dist/traces/config.mjs
85441
- function positiveInteger(value, fallback) {
85479
+ function positiveInteger2(value, fallback) {
85442
85480
  return typeof value == "number" && Number.isInteger(value) && value >= 1 ? value : fallback;
85443
85481
  }
85444
85482
  function withUsableIdentityKeys(attributes) {
@@ -85473,22 +85511,22 @@ function resolveTracesConfig(config, hostResourceAttributes, logger) {
85473
85511
  const resourceAttributes = assignUserAttributes({
85474
85512
  ...hostResourceAttributes
85475
85513
  }, withUsableIdentityKeys(config?.resourceAttributes));
85476
- const maxExportBatchSize = positiveInteger(config?.maxExportBatchSize, DEFAULT_MAX_EXPORT_BATCH_SIZE);
85514
+ const maxExportBatchSize = positiveInteger2(config?.maxExportBatchSize, DEFAULT_MAX_EXPORT_BATCH_SIZE);
85477
85515
  return {
85478
85516
  serviceName: resourceAttributes?.["service.name"] ?? config?.serviceName,
85479
85517
  serviceVersion: resourceAttributes?.["service.version"] ?? config?.serviceVersion,
85480
85518
  environment: resourceAttributes?.["deployment.environment"] ?? config?.environment,
85481
85519
  resourceAttributes,
85482
85520
  beforeSpanSend: resolveBeforeSpanSend(config?.beforeSpanSend, logger),
85483
- maxAttributesPerSpan: positiveInteger(config?.maxAttributesPerSpan, DEFAULT_MAX_ATTRIBUTES_PER_SPAN),
85484
- 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),
85485
85523
  maxAttributesPerEvent: DEFAULT_MAX_ATTRIBUTES_PER_EVENT,
85486
- maxAttributeValueLength: positiveInteger(config?.maxAttributeValueLength, DEFAULT_MAX_ATTRIBUTE_VALUE_LENGTH),
85487
- 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),
85488
85526
  maxExportBatchSize,
85489
- maxQueueSize: Math.max(positiveInteger(config?.maxQueueSize, DEFAULT_MAX_QUEUE_SIZE), maxExportBatchSize),
85490
- maxLiveSpans: positiveInteger(config?.maxLiveSpans, DEFAULT_MAX_LIVE_SPANS),
85491
- 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)
85492
85530
  };
85493
85531
  }
85494
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;
@@ -89028,7 +89066,7 @@ var package_default2;
89028
89066
  var init_package2 = __esm(() => {
89029
89067
  package_default2 = {
89030
89068
  name: "@oh-my-opencode/omo-codex",
89031
- version: "5.0.1",
89069
+ version: "5.1.0",
89032
89070
  type: "module",
89033
89071
  private: true,
89034
89072
  description: "Codex harness adapter for oh-my-openagent. Vendored Codex plugin namespace (omo) + TypeScript installer + telemetry.",
@@ -98178,6 +98216,8 @@ function isErrno(error, code) {
98178
98216
  var REQUIRED_PLUGIN_ARTIFACTS = [
98179
98217
  join62("extensions", "omo.js"),
98180
98218
  join62("extensions", "omo-task.js"),
98219
+ join62("extensions", "omo-computer-use.js"),
98220
+ join62("extensions", "assets.generated.json"),
98181
98221
  join62("extensions", "omo-member.js"),
98182
98222
  join62("extensions", "memory-run-supervisor.mjs"),
98183
98223
  ...PERSONA_ASSET_FILES.map((filename) => join62("extensions", filename)),
@@ -98369,7 +98409,7 @@ async function runNativeDevInstaller(options) {
98369
98409
  return runSenpiInstaller(options);
98370
98410
  }
98371
98411
  // packages/omo-opencode/src/cli/install-native/legacy-omo-bin.ts
98372
- 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";
98373
98413
  import { dirname as dirname26, isAbsolute as isAbsolute12, join as join64, posix as posix9, win32 as win325 } from "node:path";
98374
98414
  var NATIVE_OMO_PACKAGE = "omo-ai";
98375
98415
  var LEGACY_OMO_BIN_PACKAGES = ["oh-my-openagent", "oh-my-opencode", "lazycodex"];
@@ -98451,12 +98491,11 @@ function resolveOwner(binPath) {
98451
98491
  if (fromLink !== null)
98452
98492
  return fromLink;
98453
98493
  const shim = readShimText(binPath);
98454
- if (shim === null)
98455
- return null;
98456
- const lightWrapper = codexLightWrapperOwner(shim);
98494
+ const lightWrapper = shim === null ? null : codexLightWrapperOwner(shim);
98457
98495
  if (lightWrapper !== null)
98458
98496
  return lightWrapper;
98459
- 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) {
98460
98499
  if (!isInsideNodeModules(entry) || !pathExists(entry))
98461
98500
  continue;
98462
98501
  const owner = ownerOfFile(entry);
@@ -98477,6 +98516,23 @@ function shimEntryPaths(shim, shimDirectory) {
98477
98516
  }
98478
98517
  return paths;
98479
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
+ }
98480
98536
  function codexLightWrapperOwner(shim) {
98481
98537
  if (!shim.includes(CODEX_LIGHT_WRAPPER_MARKER))
98482
98538
  return null;
@@ -103406,20 +103462,41 @@ var BOULDER_FILE = "boulder.json";
103406
103462
  var BOULDER_STATE_PATH = `${BOULDER_DIR}/${BOULDER_FILE}`;
103407
103463
  var NOTEPAD_DIR = "notepads";
103408
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
+
103409
103482
  // packages/boulder-state/src/plan-checklist.ts
103410
- var SIMPLE_CHECKBOX_PATTERN = /^[-*][ \t]*\[[ \t]*([xX]?)[ \t]*\][ \t]+(.+)$/;
103483
+ var SIMPLE_CHECKBOX_PATTERN = /^[-*][ \t]*\[[ \t]*([xX~]?)[ \t]*\][ \t]+(.+)$/;
103411
103484
  var TODO_HEADING_PATTERN = /^##[ \t]+TODOs(?:[ \t]+#+)?[ \t]*$/i;
103412
103485
  var FINAL_VERIFICATION_HEADING_PATTERN = /^##[ \t]+Final Verification Wave(?:[ \t]+#+)?[ \t]*$/i;
103413
103486
  var SECTION_BOUNDARY_HEADING_PATTERN = /^#{1,2}(?:[ \t]+|$)/;
103414
- var FENCE_PATTERN = /^[ \t]{0,3}(`{3,}|~{3,})(.*)$/;
103415
- var TODO_CHECKBOX_PATTERN = /^- \[([ xX])\] ([1-9]\d*\. .+)$/;
103416
- 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;
103417
103490
  function parsePlanChecklist(markdown) {
103418
103491
  const lines = markdown.split(/\r?\n/);
103419
103492
  if (!hasStructuredSection(lines)) {
103420
103493
  return parseSimpleChecklist(lines);
103421
103494
  }
103422
- 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;
103423
103500
  }
103424
103501
  function parseCurrentTopLevelTask(markdown) {
103425
103502
  const lines = markdown.split(/\r?\n/);
@@ -103429,10 +103506,12 @@ function parseCurrentTopLevelTask(markdown) {
103429
103506
  return parseStructuredPlan(lines).nextTask;
103430
103507
  }
103431
103508
  function parseStructuredPlan(lines) {
103509
+ let completed = 0;
103432
103510
  let remaining = 0;
103433
103511
  let total = 0;
103434
103512
  let nextTaskLabel = null;
103435
103513
  let nextTask = null;
103514
+ let hasUntrackedTopLevelCheckbox = false;
103436
103515
  let section = "other";
103437
103516
  let fence = null;
103438
103517
  for (const line of lines) {
@@ -103452,6 +103531,9 @@ function parseStructuredPlan(lines) {
103452
103531
  continue;
103453
103532
  }
103454
103533
  if (section === "other") {
103534
+ if (parseSimpleTopLevelCheckbox(line) !== null) {
103535
+ hasUntrackedTopLevelCheckbox = true;
103536
+ }
103455
103537
  continue;
103456
103538
  }
103457
103539
  const checkbox = parseStructuredTopLevelCheckbox(line, section);
@@ -103459,7 +103541,11 @@ function parseStructuredPlan(lines) {
103459
103541
  continue;
103460
103542
  }
103461
103543
  total += 1;
103462
- if (checkbox.checked) {
103544
+ if (checkbox.status === "done") {
103545
+ completed += 1;
103546
+ continue;
103547
+ }
103548
+ if (checkbox.status === "in-progress") {
103463
103549
  continue;
103464
103550
  }
103465
103551
  remaining += 1;
@@ -103470,15 +103556,17 @@ function parseStructuredPlan(lines) {
103470
103556
  }
103471
103557
  return {
103472
103558
  checklist: {
103473
- completed: total - remaining,
103559
+ completed,
103474
103560
  remaining,
103475
103561
  total,
103476
103562
  nextTaskLabel
103477
103563
  },
103478
- nextTask
103564
+ nextTask,
103565
+ hasUntrackedTopLevelCheckbox
103479
103566
  };
103480
103567
  }
103481
103568
  function parseSimpleChecklist(lines) {
103569
+ let completed = 0;
103482
103570
  let remaining = 0;
103483
103571
  let total = 0;
103484
103572
  let nextTaskLabel = null;
@@ -103500,7 +103588,11 @@ function parseSimpleChecklist(lines) {
103500
103588
  continue;
103501
103589
  }
103502
103590
  total += 1;
103503
- if (checkbox.checked) {
103591
+ if (checkbox.status === "done") {
103592
+ completed += 1;
103593
+ continue;
103594
+ }
103595
+ if (checkbox.status === "in-progress") {
103504
103596
  continue;
103505
103597
  }
103506
103598
  remaining += 1;
@@ -103508,7 +103600,7 @@ function parseSimpleChecklist(lines) {
103508
103600
  nextTaskLabel = checkbox.label;
103509
103601
  }
103510
103602
  }
103511
- return { completed: total - remaining, remaining, total, nextTaskLabel };
103603
+ return { completed, remaining, total, nextTaskLabel };
103512
103604
  }
103513
103605
  function parseSimpleTopLevelCheckbox(line) {
103514
103606
  const match = line.match(SIMPLE_CHECKBOX_PATTERN);
@@ -103517,7 +103609,13 @@ function parseSimpleTopLevelCheckbox(line) {
103517
103609
  if (marker === undefined || label === undefined) {
103518
103610
  return null;
103519
103611
  }
103520
- 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";
103521
103619
  }
103522
103620
  function hasStructuredSection(lines) {
103523
103621
  let fence = null;
@@ -103549,8 +103647,7 @@ function parseStructuredSectionHeading(line) {
103549
103647
  return "other";
103550
103648
  }
103551
103649
  function parseStructuredTopLevelCheckbox(line, section) {
103552
- const pattern = section === "todo" ? TODO_CHECKBOX_PATTERN : FINAL_WAVE_CHECKBOX_PATTERN;
103553
- const match = line.match(pattern);
103650
+ const match = line.match(STRUCTURED_CHECKBOX_PATTERN);
103554
103651
  const marker = match?.[1];
103555
103652
  const label = match?.[2];
103556
103653
  if (marker === undefined || label === undefined) {
@@ -103560,10 +103657,10 @@ function parseStructuredTopLevelCheckbox(line, section) {
103560
103657
  if (task === null) {
103561
103658
  return null;
103562
103659
  }
103563
- return { checked: marker.toLowerCase() === "x", label, task };
103660
+ return { status: parseCheckboxStatus(marker), label, task };
103564
103661
  }
103565
103662
  function buildTaskRef(section, label) {
103566
- 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;
103567
103664
  const match = label.match(pattern);
103568
103665
  const rawLabel = match?.[1];
103569
103666
  const title = match?.[2];
@@ -103577,20 +103674,6 @@ function buildTaskRef(section, label) {
103577
103674
  title
103578
103675
  };
103579
103676
  }
103580
- function parseOpeningFence(line) {
103581
- const match = line.match(FENCE_PATTERN);
103582
- const run = match?.[1];
103583
- const info = match?.[2];
103584
- const marker = run?.charAt(0);
103585
- if (run === undefined || info === undefined || marker !== "`" && marker !== "~" || marker === "`" && info.includes("`")) {
103586
- return null;
103587
- }
103588
- return { marker, length: run.length };
103589
- }
103590
- function isClosingFence(line, fence) {
103591
- const run = line.match(/^[ \t]{0,3}(`{3,}|~{3,})[ \t]*$/)?.[1];
103592
- return run?.charAt(0) === fence.marker && run.length >= fence.length;
103593
- }
103594
103677
  // packages/boulder-state/src/top-level-task.ts
103595
103678
  import { existsSync as existsSync36, readFileSync as readFileSync19 } from "node:fs";
103596
103679
  function readCurrentTopLevelTask(planPath) {
@@ -103632,7 +103715,7 @@ function resolveBoulderPlanPathForWork(directory, work) {
103632
103715
  return resolveBoulderPlanPath(directory, work);
103633
103716
  }
103634
103717
  // packages/boulder-state/src/storage/plan-progress.ts
103635
- 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";
103636
103719
  function getPlanProgress(planPath) {
103637
103720
  if (!existsSync38(planPath)) {
103638
103721
  return { total: 0, completed: 0, isComplete: false };
@@ -104051,7 +104134,7 @@ async function hasActiveBoulderContinuation(directory, sessionID, client) {
104051
104134
  if (!boulder || !boulder.active_plan)
104052
104135
  return false;
104053
104136
  const progress = getPlanProgress(resolveBoulderPlanPath(directory, boulder));
104054
- if (progress.isComplete)
104137
+ if (progress.isComplete || progress.total === 0)
104055
104138
  return false;
104056
104139
  if (!client)
104057
104140
  return false;
@@ -106249,13 +106332,14 @@ init_src();
106249
106332
  import { existsSync as existsSync55 } from "node:fs";
106250
106333
  import { createRequire as createRequire3 } from "node:module";
106251
106334
  import { homedir as homedir20 } from "node:os";
106252
- import { dirname as dirname33, join as join86 } from "node:path";
106335
+ import { dirname as dirname33, join as join87 } from "node:path";
106253
106336
 
106254
106337
  // packages/omo-opencode/src/hooks/comment-checker/downloader.ts
106255
- import { join as join85 } from "path";
106338
+ import { join as join86 } from "path";
106256
106339
  import { homedir as homedir19, tmpdir as tmpdir4 } from "os";
106257
106340
  // packages/comment-checker-core/src/release.ts
106258
106341
  import { join as join84 } from "node:path";
106342
+ var COMMENT_CHECKER_RELEASE_VERSION = "0.8.0";
106259
106343
  function commentCheckerBinaryName(platform) {
106260
106344
  return platform === "win32" ? "comment-checker.exe" : "comment-checker";
106261
106345
  }
@@ -106268,12 +106352,23 @@ function commentCheckerCacheDir(input) {
106268
106352
  const base = input.env.XDG_CACHE_HOME || join84(input.homedir, ".cache");
106269
106353
  return join84(base, input.cacheDirName, "bin");
106270
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
+ }
106271
106366
  // packages/omo-opencode/src/hooks/comment-checker/downloader.ts
106272
106367
  init_binary_downloader();
106273
106368
  init_logger2();
106274
106369
  init_plugin_identity();
106275
106370
  var DEBUG = process.env.COMMENT_CHECKER_DEBUG === "1";
106276
- var DEBUG_FILE = join85(tmpdir4(), "comment-checker-debug.log");
106371
+ var DEBUG_FILE = join86(tmpdir4(), "comment-checker-debug.log");
106277
106372
  function getCacheDir2() {
106278
106373
  return commentCheckerCacheDir({
106279
106374
  platform: process.platform,
@@ -106286,7 +106381,9 @@ function getBinaryName() {
106286
106381
  return commentCheckerBinaryName(process.platform);
106287
106382
  }
106288
106383
  function getCachedBinaryPath2() {
106289
- return getCachedBinaryPath(getCacheDir2(), getBinaryName());
106384
+ const cacheDir = getCacheDir2();
106385
+ const cached = getCachedBinaryPath(cacheDir, getBinaryName());
106386
+ return cached !== null && isCachedCommentCheckerCurrent(cacheDir) ? cached : null;
106290
106387
  }
106291
106388
 
106292
106389
  // packages/omo-opencode/src/cli/doctor/checks/dependencies.ts
@@ -106330,7 +106427,7 @@ async function getBinaryVersion(binary) {
106330
106427
  }
106331
106428
  }
106332
106429
  async function checkAstGrepCli() {
106333
- const runtimeDir = astGrepRuntimeDir(join86(homedir20(), ".omo"));
106430
+ const runtimeDir = astGrepRuntimeDir(join87(homedir20(), ".omo"));
106334
106431
  const sgPath = findSgBinarySync({ runtimeDir });
106335
106432
  if (sgPath === null) {
106336
106433
  return {
@@ -106360,10 +106457,10 @@ function findCommentCheckerPackageBinary(baseDirOverride, resolvePackageJsonPath
106360
106457
  const platformKey = `${process.platform}-${process.arch === "x64" ? "x64" : process.arch}`;
106361
106458
  try {
106362
106459
  const packageDir = baseDirOverride ?? dirname33(resolvePackageJsonPath());
106363
- const vendorPath = join86(packageDir, "vendor", platformKey, binaryName);
106460
+ const vendorPath = join87(packageDir, "vendor", platformKey, binaryName);
106364
106461
  if (existsSync55(vendorPath))
106365
106462
  return vendorPath;
106366
- const binPath = join86(packageDir, "bin", binaryName);
106463
+ const binPath = join87(packageDir, "bin", binaryName);
106367
106464
  if (existsSync55(binPath))
106368
106465
  return binPath;
106369
106466
  } catch (error) {
@@ -106510,7 +106607,7 @@ async function getGhCliInfo(dependencies = {}) {
106510
106607
  // packages/omo-opencode/src/mcp/lsp.ts
106511
106608
  init_zod();
106512
106609
  init_opencode_config_dir();
106513
- import { existsSync as existsSync56, readFileSync as readFileSync37 } from "node:fs";
106610
+ import { existsSync as existsSync56, readFileSync as readFileSync38 } from "node:fs";
106514
106611
  import { delimiter as delimiter3, dirname as dirname34, resolve as resolve23 } from "node:path";
106515
106612
  import { fileURLToPath as fileURLToPath7 } from "node:url";
106516
106613
 
@@ -106654,7 +106751,7 @@ function findBootstrapRoot(candidates, pathExists) {
106654
106751
  }
106655
106752
  function readDaemonPackageVersion(root) {
106656
106753
  try {
106657
- 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"));
106658
106755
  return DaemonPackageSchema.parse(packageJson).version;
106659
106756
  } catch (error) {
106660
106757
  if (!(error instanceof Error))
@@ -106737,15 +106834,15 @@ function getInstalledLspServers(options = {}) {
106737
106834
 
106738
106835
  // packages/omo-opencode/src/cli/doctor/checks/tools-mcp.ts
106739
106836
  init_shared();
106740
- import { existsSync as existsSync57, readFileSync as readFileSync38 } from "node:fs";
106837
+ import { existsSync as existsSync57, readFileSync as readFileSync39 } from "node:fs";
106741
106838
  import { homedir as homedir21 } from "node:os";
106742
- import { join as join87 } from "node:path";
106839
+ import { join as join88 } from "node:path";
106743
106840
  var BUILTIN_MCP_SERVERS = ["websearch", "context7", "grep_app", "lsp"];
106744
106841
  function getMcpConfigPaths() {
106745
106842
  return [
106746
- join87(homedir21(), ".claude", ".mcp.json"),
106747
- join87(process.cwd(), ".mcp.json"),
106748
- 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")
106749
106846
  ];
106750
106847
  }
106751
106848
  function loadUserMcpConfig() {
@@ -106754,7 +106851,7 @@ function loadUserMcpConfig() {
106754
106851
  if (!existsSync57(configPath))
106755
106852
  continue;
106756
106853
  try {
106757
- const content = readFileSync38(configPath, "utf-8");
106854
+ const content = readFileSync39(configPath, "utf-8");
106758
106855
  const config = parseJsonc(content);
106759
106856
  if (config.mcpServers) {
106760
106857
  Object.assign(servers, config.mcpServers);
@@ -106889,7 +106986,7 @@ async function checkTools() {
106889
106986
 
106890
106987
  // packages/omo-opencode/src/cli/doctor/checks/telemetry.ts
106891
106988
  init_src5();
106892
- import { existsSync as existsSync58, readFileSync as readFileSync39 } from "node:fs";
106989
+ import { existsSync as existsSync58, readFileSync as readFileSync40 } from "node:fs";
106893
106990
  function isTelemetryState(value) {
106894
106991
  return value !== null && typeof value === "object" && !Array.isArray(value);
106895
106992
  }
@@ -106899,7 +106996,7 @@ function readLastActiveDay(stateFilePath) {
106899
106996
  }
106900
106997
  let parsed;
106901
106998
  try {
106902
- parsed = JSON.parse(readFileSync39(stateFilePath, "utf-8"));
106999
+ parsed = JSON.parse(readFileSync40(stateFilePath, "utf-8"));
106903
107000
  } catch (error) {
106904
107001
  if (error instanceof Error) {
106905
107002
  return "unreadable";
@@ -107027,7 +107124,7 @@ init_src();
107027
107124
  import { existsSync as existsSync59 } from "node:fs";
107028
107125
  import { lstat as lstat16, readdir as readdir14, readFile as readFile28 } from "node:fs/promises";
107029
107126
  import { homedir as homedir23 } from "node:os";
107030
- 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";
107031
107128
  // packages/omo-opencode/package.json
107032
107129
  var package_default3 = {
107033
107130
  name: "@oh-my-opencode/omo-opencode",
@@ -107097,13 +107194,13 @@ var CODEX_BIN_NAMES = [
107097
107194
  "omo-git-bash-hook"
107098
107195
  ];
107099
107196
  async function gatherCodexSummary(deps = {}) {
107100
- 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"));
107101
107198
  const binDir = resolveCodexInstallerBinDir({ binDir: deps.binDir, codexHome, env: process.env });
107102
107199
  const detection = await (deps.detectCodexInstallation ?? detectCodexInstallation)();
107103
107200
  const pluginRoot = await resolveInstalledPluginRoot(codexHome);
107104
- const manifest = pluginRoot === null ? null : await readJson(join88(pluginRoot, ".codex-plugin", "plugin.json"));
107105
- const installSnapshot = pluginRoot === null ? null : await readJson(join88(pluginRoot, "lazycodex-install.json"));
107106
- 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");
107107
107204
  const pluginVersion = stringField(manifest, "version");
107108
107205
  return {
107109
107206
  codexPath: detection.found && "path" in detection ? detection.path : null,
@@ -107160,7 +107257,7 @@ function buildCodexIssues(summary) {
107160
107257
  if (summary.pluginRoot === null) {
107161
107258
  issues.push({
107162
107259
  title: "OMO Codex plugin is not installed",
107163
- 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.`,
107164
107261
  fix: "Run: npx lazycodex-ai install",
107165
107262
  severity: "error",
107166
107263
  affects: ["plugin loading"]
@@ -107225,12 +107322,12 @@ function buildCodexIssues(summary) {
107225
107322
  return issues;
107226
107323
  }
107227
107324
  async function resolveInstalledPluginRoot(codexHome) {
107228
- const pluginRoot = join88(codexHome, "plugins", "cache", MARKETPLACE_NAME, PLUGIN_NAME2);
107325
+ const pluginRoot = join89(codexHome, "plugins", "cache", MARKETPLACE_NAME, PLUGIN_NAME2);
107229
107326
  if (!existsSync59(pluginRoot))
107230
107327
  return null;
107231
107328
  const versions = await readdir14(pluginRoot, { withFileTypes: true });
107232
107329
  const candidates = versions.filter((entry) => entry.isDirectory()).map((entry) => entry.name).sort(compareVersionsDescending);
107233
- 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);
107234
107331
  }
107235
107332
  async function readCodexConfigSummary(configPath) {
107236
107333
  if (!existsSync59(configPath)) {
@@ -107258,13 +107355,13 @@ async function readCodexConfigSummary(configPath) {
107258
107355
  async function readLinkedBins(binDir) {
107259
107356
  const linked = [];
107260
107357
  for (const name of CODEX_BIN_NAMES) {
107261
- if (await pathExists3(join88(binDir, process.platform === "win32" ? `${name}.cmd` : name)))
107358
+ if (await pathExists3(join89(binDir, process.platform === "win32" ? `${name}.cmd` : name)))
107262
107359
  linked.push(name);
107263
107360
  }
107264
107361
  return linked;
107265
107362
  }
107266
107363
  async function readLinkedAgents(codexHome) {
107267
- const agentsDir = join88(codexHome, "agents");
107364
+ const agentsDir = join89(codexHome, "agents");
107268
107365
  if (!existsSync59(agentsDir))
107269
107366
  return [];
107270
107367
  const entries = await readdir14(agentsDir, { withFileTypes: true });
@@ -107398,7 +107495,7 @@ function resolveLatestVersion(input) {
107398
107495
  init_src();
107399
107496
  import { readdir as readdir15, readFile as readFile29, stat as stat7 } from "node:fs/promises";
107400
107497
  import { homedir as homedir24 } from "node:os";
107401
- 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";
107402
107499
  var CODEX_COMPONENTS_CHECK_ID = "codex-components";
107403
107500
  var CODEX_COMPONENTS_CHECK_NAME = "codex-components";
107404
107501
  var PLUGIN_DATA_DIR_NAME = "omo-sisyphuslabs";
@@ -107408,7 +107505,7 @@ async function checkCodexComponents(deps = {}) {
107408
107505
  const env = deps.env ?? process.env;
107409
107506
  const platform = deps.platform ?? process.platform;
107410
107507
  const arch = deps.arch ?? process.arch;
107411
- const codexHome = resolve25(deps.codexHome ?? env["CODEX_HOME"] ?? join89(homedir24(), ".codex"));
107508
+ const codexHome = resolve25(deps.codexHome ?? env["CODEX_HOME"] ?? join90(homedir24(), ".codex"));
107412
107509
  const summary = await gatherCodexSummary({ ...deps, codexHome });
107413
107510
  if (summary.pluginRoot === null) {
107414
107511
  return {
@@ -107433,7 +107530,7 @@ async function checkCodexComponents(deps = {}) {
107433
107530
  });
107434
107531
  }
107435
107532
  const runtimeSgDir = runtimeSgDirectory(codexHome, platform, arch);
107436
- const runtimeSgPath = join89(runtimeSgDir, sgBinaryName(platform));
107533
+ const runtimeSgPath = join90(runtimeSgDir, sgBinaryName(platform));
107437
107534
  const sg = findSgBinarySync({
107438
107535
  arch,
107439
107536
  env,
@@ -107545,7 +107642,7 @@ async function findManifestPaths(root, manifestName) {
107545
107642
  for (const entry of entries) {
107546
107643
  if (entry.name === "node_modules" || entry.name === ".git")
107547
107644
  continue;
107548
- const entryPath = join89(root, entry.name);
107645
+ const entryPath = join90(root, entry.name);
107549
107646
  if (entry.isDirectory()) {
107550
107647
  paths.push(...await findManifestPaths(entryPath, manifestName));
107551
107648
  continue;
@@ -107589,18 +107686,18 @@ function isPluginRuntimePathArg(arg) {
107589
107686
  return normalized.endsWith(".js") && normalized.includes("/dist/") && (normalized.startsWith("./") || normalized.startsWith("../") || normalized.startsWith("components/") || normalized.startsWith("/") || isAbsolute14(arg));
107590
107687
  }
107591
107688
  function runtimeSgDirectory(codexHome, platform, arch) {
107592
- return join89(codexHome, "runtime", "ast-grep", runtimeSlug(platform, arch));
107689
+ return join90(codexHome, "runtime", "ast-grep", runtimeSlug(platform, arch));
107593
107690
  }
107594
107691
  function describeSgSource(sgPath, env, runtimeSgDir, platform) {
107595
107692
  const override = env[SG_PATH_ENV_KEY]?.trim();
107596
107693
  if (override !== undefined && override.length > 0 && sgPath === override)
107597
107694
  return `env override ${SG_PATH_ENV_KEY}`;
107598
- if (sgPath === join89(runtimeSgDir, sgBinaryName(platform)))
107695
+ if (sgPath === join90(runtimeSgDir, sgBinaryName(platform)))
107599
107696
  return "runtime dir";
107600
107697
  return "PATH";
107601
107698
  }
107602
107699
  async function readBootstrapStateSummary(codexHome) {
107603
- 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");
107604
107701
  const raw = await readJson2(statePath);
107605
107702
  if (raw === null)
107606
107703
  return null;
@@ -107679,16 +107776,16 @@ function isRecord18(value) {
107679
107776
  import { existsSync as existsSync60 } from "node:fs";
107680
107777
  import { readFile as readFile30 } from "node:fs/promises";
107681
107778
  import { homedir as homedir25 } from "node:os";
107682
- import { join as join90, resolve as resolve26 } from "node:path";
107779
+ import { join as join91, resolve as resolve26 } from "node:path";
107683
107780
  var RUNTIME_WRAPPER_MARKER2 = "OMO_GENERATED_RUNTIME_WRAPPER";
107684
107781
  var CHECK_NAME = "codex-runtime-wrapper";
107685
107782
  var REINSTALL_COMMAND = "npx --yes lazycodex-ai@latest install --no-tui";
107686
107783
  async function checkCodexRuntimeWrapper(deps = {}) {
107687
- 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"));
107688
107785
  const binDir = resolveCodexInstallerBinDir({ binDir: deps.binDir, codexHome, env: process.env });
107689
107786
  const platform = deps.platform ?? process.platform;
107690
- const wrapperPath = join90(binDir, platform === "win32" ? "omo-agent-toolkit.cmd" : "omo-agent-toolkit");
107691
- 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");
107692
107789
  const [wrapper, legacyWrapper] = await Promise.all([readRuntimeWrapper(wrapperPath), readRuntimeWrapper(legacyWrapperPath)]);
107693
107790
  const issues = [];
107694
107791
  if (wrapper?.includes(RUNTIME_WRAPPER_MARKER2) === true) {
@@ -108219,17 +108316,17 @@ import {
108219
108316
  existsSync as existsSync63,
108220
108317
  mkdirSync as mkdirSync17,
108221
108318
  readdirSync as readdirSync13,
108222
- readFileSync as readFileSync41,
108319
+ readFileSync as readFileSync42,
108223
108320
  renameSync as renameSync8,
108224
108321
  unlinkSync as unlinkSync9,
108225
- writeFileSync as writeFileSync13
108322
+ writeFileSync as writeFileSync14
108226
108323
  } from "node:fs";
108227
- 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";
108228
108325
 
108229
108326
  // packages/mcp-client-core/src/config-dir.ts
108230
108327
  import { existsSync as existsSync61, realpathSync as realpathSync10 } from "node:fs";
108231
108328
  import { homedir as homedir26 } from "node:os";
108232
- import { join as join91, resolve as resolve27 } from "node:path";
108329
+ import { join as join92, resolve as resolve27 } from "node:path";
108233
108330
  function resolveConfigPath2(pathValue) {
108234
108331
  const resolvedPath = resolve27(pathValue);
108235
108332
  if (!existsSync61(resolvedPath))
@@ -108247,13 +108344,13 @@ function getOpenCodeCliConfigDir(env = process.env) {
108247
108344
  if (customConfigDir) {
108248
108345
  return resolveConfigPath2(customConfigDir);
108249
108346
  }
108250
- const xdgConfigDir = env["XDG_CONFIG_HOME"]?.trim() || join91(homedir26(), ".config");
108251
- return resolveConfigPath2(join91(xdgConfigDir, "opencode"));
108347
+ const xdgConfigDir = env["XDG_CONFIG_HOME"]?.trim() || join92(homedir26(), ".config");
108348
+ return resolveConfigPath2(join92(xdgConfigDir, "opencode"));
108252
108349
  }
108253
108350
 
108254
108351
  // packages/mcp-client-core/src/mcp-oauth/storage-index.ts
108255
- import { chmodSync as chmodSync4, existsSync as existsSync62, readFileSync as readFileSync40, renameSync as renameSync7, writeFileSync as writeFileSync12 } from "node:fs";
108256
- 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";
108257
108354
  var INDEX_FILE_NAME = "index.json";
108258
108355
  function isTokenIndex(value) {
108259
108356
  if (typeof value !== "object" || value === null || Array.isArray(value))
@@ -108261,14 +108358,14 @@ function isTokenIndex(value) {
108261
108358
  return Object.values(value).every((entry) => typeof entry === "string");
108262
108359
  }
108263
108360
  function getIndexPath(storageDir) {
108264
- return join92(storageDir, INDEX_FILE_NAME);
108361
+ return join93(storageDir, INDEX_FILE_NAME);
108265
108362
  }
108266
108363
  function readTokenIndex(storageDir) {
108267
108364
  const indexPath = getIndexPath(storageDir);
108268
108365
  if (!existsSync62(indexPath))
108269
108366
  return {};
108270
108367
  try {
108271
- const parsed = JSON.parse(readFileSync40(indexPath, "utf-8"));
108368
+ const parsed = JSON.parse(readFileSync41(indexPath, "utf-8"));
108272
108369
  return isTokenIndex(parsed) ? parsed : {};
108273
108370
  } catch (readError) {
108274
108371
  if (!(readError instanceof Error))
@@ -108280,7 +108377,7 @@ function writeTokenIndex(storageDir, index) {
108280
108377
  try {
108281
108378
  const indexPath = getIndexPath(storageDir);
108282
108379
  const tempPath = `${indexPath}.tmp.${Date.now()}`;
108283
- 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 });
108284
108381
  chmodSync4(tempPath, 384);
108285
108382
  renameSync7(tempPath, indexPath);
108286
108383
  return true;
@@ -108305,16 +108402,16 @@ function deleteTokenIndexEntry(storageDir, hash) {
108305
108402
  var STORAGE_DIR_NAME = "mcp-oauth";
108306
108403
  var LEGACY_STORAGE_FILE_NAME = "mcp-oauth.json";
108307
108404
  function getMcpOauthStorageDir() {
108308
- return join93(getOpenCodeCliConfigDir(), STORAGE_DIR_NAME);
108405
+ return join94(getOpenCodeCliConfigDir(), STORAGE_DIR_NAME);
108309
108406
  }
108310
108407
  function getMcpOauthServerHash(serverHost, resource) {
108311
108408
  return createHash7("sha256").update(buildKey(serverHost, resource)).digest("hex").slice(0, 32);
108312
108409
  }
108313
108410
  function getMcpOauthStoragePath(serverHost, resource) {
108314
- return join93(getMcpOauthStorageDir(), `${getMcpOauthServerHash(serverHost, resource)}.json`);
108411
+ return join94(getMcpOauthStorageDir(), `${getMcpOauthServerHash(serverHost, resource)}.json`);
108315
108412
  }
108316
108413
  function getLegacyStoragePath() {
108317
- return join93(getOpenCodeCliConfigDir(), LEGACY_STORAGE_FILE_NAME);
108414
+ return join94(getOpenCodeCliConfigDir(), LEGACY_STORAGE_FILE_NAME);
108318
108415
  }
108319
108416
  function normalizeHost2(serverHost) {
108320
108417
  let host = serverHost.trim();
@@ -108378,7 +108475,7 @@ function readTokenFile(filePath) {
108378
108475
  if (!existsSync63(filePath))
108379
108476
  return null;
108380
108477
  try {
108381
- const parsed = JSON.parse(readFileSync41(filePath, "utf-8"));
108478
+ const parsed = JSON.parse(readFileSync42(filePath, "utf-8"));
108382
108479
  return isOAuthTokenData(parsed) ? parsed : null;
108383
108480
  } catch (readError) {
108384
108481
  if (!(readError instanceof Error))
@@ -108391,7 +108488,7 @@ function readLegacyStore() {
108391
108488
  if (!existsSync63(filePath))
108392
108489
  return null;
108393
108490
  try {
108394
- const parsed = JSON.parse(readFileSync41(filePath, "utf-8"));
108491
+ const parsed = JSON.parse(readFileSync42(filePath, "utf-8"));
108395
108492
  if (typeof parsed !== "object" || parsed === null || Array.isArray(parsed))
108396
108493
  return null;
108397
108494
  const result = {};
@@ -108413,7 +108510,7 @@ function writeTokenFile(filePath, token) {
108413
108510
  mkdirSync17(dir, { recursive: true });
108414
108511
  }
108415
108512
  const tempPath = `${filePath}.tmp.${Date.now()}`;
108416
- 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 });
108417
108514
  chmodSync5(tempPath, 384);
108418
108515
  renameSync8(tempPath, filePath);
108419
108516
  return true;
@@ -108469,7 +108566,7 @@ function deleteLegacyToken(serverHost, resource) {
108469
108566
  function writeLegacyStore(store) {
108470
108567
  try {
108471
108568
  const filePath = getLegacyStoragePath();
108472
- 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 });
108473
108570
  chmodSync5(filePath, 384);
108474
108571
  return true;
108475
108572
  } catch (writeError) {
@@ -108493,7 +108590,7 @@ function listTokensByHost(serverHost) {
108493
108590
  for (const [hash, indexedKey] of Object.entries(index)) {
108494
108591
  if (!indexedKey.startsWith(prefix))
108495
108592
  continue;
108496
- const indexedToken = readTokenFile(join93(getMcpOauthStorageDir(), `${hash}.json`));
108593
+ const indexedToken = readTokenFile(join94(getMcpOauthStorageDir(), `${hash}.json`));
108497
108594
  if (indexedToken)
108498
108595
  result[indexedKey] = indexedToken;
108499
108596
  }
@@ -108508,7 +108605,7 @@ function listAllTokens() {
108508
108605
  for (const entry of readdirSync13(dir, { withFileTypes: true })) {
108509
108606
  if (!entry.isFile() || !entry.name.endsWith(".json") || entry.name === "index.json")
108510
108607
  continue;
108511
- const token = readTokenFile(join93(dir, entry.name));
108608
+ const token = readTokenFile(join94(dir, entry.name));
108512
108609
  const hash = basename13(entry.name, ".json");
108513
108610
  if (token)
108514
108611
  result[index[hash] ?? hash] = token;
@@ -109232,7 +109329,7 @@ async function boulder(options) {
109232
109329
  }
109233
109330
  // packages/omo-opencode/src/cli/codex-ulw-loop.ts
109234
109331
  import { spawn as spawn5 } from "node:child_process";
109235
- 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";
109236
109333
  import { homedir as homedir27 } from "node:os";
109237
109334
  var ULW_LOOP_DELEGATION_SENTINEL = "OMO_ULW_LOOP_DELEGATED";
109238
109335
  function resolveCodexUlwLoopCommand(input = {}) {
@@ -109282,7 +109379,7 @@ function resolveLegacyLocalOmoBin(env, homeDir, currentExecutablePaths) {
109282
109379
  }
109283
109380
  function isGeneratedRuntimeWrapper(candidate) {
109284
109381
  try {
109285
- return readFileSync42(candidate, "utf8").includes(RUNTIME_WRAPPER_MARKER);
109382
+ return readFileSync43(candidate, "utf8").includes(RUNTIME_WRAPPER_MARKER);
109286
109383
  } catch (error) {
109287
109384
  if (error instanceof Error)
109288
109385
  return false;