oh-my-opencode 5.0.0-beta.45 → 5.0.0-beta.47

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 (102) hide show
  1. package/dist/cli/index.js +43 -27
  2. package/dist/cli-node/index.js +43 -27
  3. package/dist/features/background-agent/error-classifier.d.ts +1 -0
  4. package/dist/index.js +117 -54
  5. package/package.json +14 -14
  6. package/packages/omo-codex/plugin/.codex-plugin/plugin.json +1 -1
  7. package/packages/omo-codex/plugin/components/bootstrap/hooks/hooks.json +1 -1
  8. package/packages/omo-codex/plugin/components/bootstrap/package.json +1 -1
  9. package/packages/omo-codex/plugin/components/comment-checker/hooks/hooks.json +1 -1
  10. package/packages/omo-codex/plugin/components/comment-checker/package.json +1 -1
  11. package/packages/omo-codex/plugin/components/git-bash/hooks/hooks.json +2 -2
  12. package/packages/omo-codex/plugin/components/git-bash/package.json +1 -1
  13. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/hooks/hooks.json +1 -1
  14. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/package.json +1 -1
  15. package/packages/omo-codex/plugin/components/lsp/dist/.omo-runtime-manifest.json +2 -2
  16. package/packages/omo-codex/plugin/components/lsp/hooks/hooks.json +2 -2
  17. package/packages/omo-codex/plugin/components/lsp/package.json +1 -1
  18. package/packages/omo-codex/plugin/components/rules/hooks/hooks.json +4 -4
  19. package/packages/omo-codex/plugin/components/rules/package.json +1 -1
  20. package/packages/omo-codex/plugin/components/teammode/hooks/hooks.json +1 -1
  21. package/packages/omo-codex/plugin/components/teammode/package.json +1 -1
  22. package/packages/omo-codex/plugin/components/telemetry/hooks/hooks.json +1 -1
  23. package/packages/omo-codex/plugin/components/telemetry/package.json +1 -1
  24. package/packages/omo-codex/plugin/components/ultrawork/hooks/hooks.json +1 -1
  25. package/packages/omo-codex/plugin/components/ultrawork/package.json +1 -1
  26. package/packages/omo-codex/plugin/components/ulw-execute-continuation/hooks/hooks.json +2 -2
  27. package/packages/omo-codex/plugin/components/ulw-execute-continuation/package.json +1 -1
  28. package/packages/omo-codex/plugin/components/ulw-loop/dist/cli-commands.js +15 -7
  29. package/packages/omo-codex/plugin/components/ulw-loop/dist/cli-output.d.ts +1 -1
  30. package/packages/omo-codex/plugin/components/ulw-loop/dist/cli-output.js +1 -1
  31. package/packages/omo-codex/plugin/components/ulw-loop/dist/cli.js +294 -96
  32. package/packages/omo-codex/plugin/components/ulw-loop/dist/constants.d.ts +1 -0
  33. package/packages/omo-codex/plugin/components/ulw-loop/dist/constants.js +1 -0
  34. package/packages/omo-codex/plugin/components/ulw-loop/dist/paths.d.ts +1 -0
  35. package/packages/omo-codex/plugin/components/ulw-loop/dist/paths.js +12 -3
  36. package/packages/omo-codex/plugin/components/ulw-loop/dist/plan-io.d.ts +1 -0
  37. package/packages/omo-codex/plugin/components/ulw-loop/dist/plan-io.js +21 -6
  38. package/packages/omo-codex/plugin/components/ulw-loop/dist/plan-missing-recovery.d.ts +1 -0
  39. package/packages/omo-codex/plugin/components/ulw-loop/dist/plan-missing-recovery.js +10 -0
  40. package/packages/omo-codex/plugin/components/ulw-loop/dist/spawn-guard.d.ts +4 -1
  41. package/packages/omo-codex/plugin/components/ulw-loop/dist/spawn-guard.js +25 -57
  42. package/packages/omo-codex/plugin/components/ulw-loop/dist/state-lock.d.ts +9 -0
  43. package/packages/omo-codex/plugin/components/ulw-loop/dist/state-lock.js +227 -0
  44. package/packages/omo-codex/plugin/components/ulw-loop/dist/stop-resume-hook.js +17 -3
  45. package/packages/omo-codex/plugin/components/ulw-loop/hooks/hooks.json +4 -4
  46. package/packages/omo-codex/plugin/components/ulw-loop/package.json +1 -1
  47. package/packages/omo-codex/plugin/components/ulw-loop/skills/ulw-loop/SKILL.md +2 -1
  48. package/packages/omo-codex/plugin/components/ulw-loop/skills/ulw-loop/references/full-workflow.md +10 -7
  49. package/packages/omo-codex/plugin/components/ulw-loop/src/cli-commands.ts +18 -7
  50. package/packages/omo-codex/plugin/components/ulw-loop/src/cli-output.ts +1 -1
  51. package/packages/omo-codex/plugin/components/ulw-loop/src/constants.ts +1 -0
  52. package/packages/omo-codex/plugin/components/ulw-loop/src/paths.ts +24 -3
  53. package/packages/omo-codex/plugin/components/ulw-loop/src/plan-io.ts +25 -5
  54. package/packages/omo-codex/plugin/components/ulw-loop/src/plan-missing-recovery.ts +11 -0
  55. package/packages/omo-codex/plugin/components/ulw-loop/src/spawn-guard.ts +34 -64
  56. package/packages/omo-codex/plugin/components/ulw-loop/src/state-lock.ts +239 -0
  57. package/packages/omo-codex/plugin/components/ulw-loop/src/stop-resume-hook.ts +16 -3
  58. package/packages/omo-codex/plugin/components/ulw-loop/test/checkpoint-template.test.ts +14 -4
  59. package/packages/omo-codex/plugin/components/ulw-loop/test/cli-checkpoint-continuation.test.ts +4 -2
  60. package/packages/omo-codex/plugin/components/ulw-loop/test/cli-checkpoint.test.ts +4 -2
  61. package/packages/omo-codex/plugin/components/ulw-loop/test/cli-commands.test.ts +2 -0
  62. package/packages/omo-codex/plugin/components/ulw-loop/test/cli-complete-goals.test.ts +3 -1
  63. package/packages/omo-codex/plugin/components/ulw-loop/test/cli-create-goals.test.ts +10 -8
  64. package/packages/omo-codex/plugin/components/ulw-loop/test/cli-entrypoint.test.ts +12 -2
  65. package/packages/omo-codex/plugin/components/ulw-loop/test/cli-json-errors.test.ts +2 -0
  66. package/packages/omo-codex/plugin/components/ulw-loop/test/cli-scope-required.test.ts +144 -0
  67. package/packages/omo-codex/plugin/components/ulw-loop/test/cli-status-next-actions.test.ts +7 -5
  68. package/packages/omo-codex/plugin/components/ulw-loop/test/cli-steering-batch.test.ts +8 -3
  69. package/packages/omo-codex/plugin/components/ulw-loop/test/cli-validation-batch.test.ts +6 -0
  70. package/packages/omo-codex/plugin/components/ulw-loop/test/fixtures/cli-session.ts +4 -0
  71. package/packages/omo-codex/plugin/components/ulw-loop/test/fixtures/quality-gate-builder.ts +2 -1
  72. package/packages/omo-codex/plugin/components/ulw-loop/test/plan-io-cross-process.test.ts +106 -0
  73. package/packages/omo-codex/plugin/components/ulw-loop/test/plan-io.test.ts +36 -2
  74. package/packages/omo-codex/plugin/components/ulw-loop/test/spawn-guard.test.ts +37 -0
  75. package/packages/omo-codex/plugin/components/ulw-loop/test/state-lock.test.ts +218 -0
  76. package/packages/omo-codex/plugin/hooks/post-compact-resetting-git-bash-mcp-reminder.json +1 -1
  77. package/packages/omo-codex/plugin/hooks/post-compact-resetting-lsp-diagnostics-cache.json +1 -1
  78. package/packages/omo-codex/plugin/hooks/post-compact-resetting-project-rule-cache.json +1 -1
  79. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-comments.json +1 -1
  80. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-lsp-diagnostics.json +1 -1
  81. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-thread-title-hygiene.json +1 -1
  82. package/packages/omo-codex/plugin/hooks/post-tool-use-matching-project-rules.json +1 -1
  83. package/packages/omo-codex/plugin/hooks/pre-tool-use-enforcing-unlimited-goal-budget.json +1 -1
  84. package/packages/omo-codex/plugin/hooks/pre-tool-use-guarding-ulw-loop-spawns.json +1 -1
  85. package/packages/omo-codex/plugin/hooks/pre-tool-use-recommending-git-bash-mcp.json +1 -1
  86. package/packages/omo-codex/plugin/hooks/session-start-checking-auto-update.json +1 -1
  87. package/packages/omo-codex/plugin/hooks/session-start-checking-bootstrap-provisioning.json +1 -1
  88. package/packages/omo-codex/plugin/hooks/session-start-loading-project-rules.json +1 -1
  89. package/packages/omo-codex/plugin/hooks/session-start-recording-session-telemetry.json +1 -1
  90. package/packages/omo-codex/plugin/hooks/stop-checking-ulw-execute-continuation.json +1 -1
  91. package/packages/omo-codex/plugin/hooks/stop-checking-ulw-loop-resume.json +1 -1
  92. package/packages/omo-codex/plugin/hooks/subagent-stop-checking-ulw-execute-continuation.json +1 -1
  93. package/packages/omo-codex/plugin/hooks/subagent-stop-verifying-lazycodex-executor-evidence.json +1 -1
  94. package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ultrawork-trigger.json +1 -1
  95. package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ulw-loop-steering.json +1 -1
  96. package/packages/omo-codex/plugin/hooks/user-prompt-submit-loading-project-rules.json +1 -1
  97. package/packages/omo-codex/plugin/package-lock.json +12 -12
  98. package/packages/omo-codex/plugin/package.json +1 -1
  99. package/packages/omo-codex/plugin/skills/ulw-loop/SKILL.md +2 -1
  100. package/packages/omo-codex/plugin/skills/ulw-loop/references/full-workflow.md +10 -7
  101. package/packages/omo-codex/scripts/install-dist/install-local.mjs +2 -2
  102. package/postinstall.mjs +2 -0
package/dist/index.js CHANGED
@@ -96714,7 +96714,7 @@ function getCachedVersion(options = {}) {
96714
96714
  // package.json
96715
96715
  var package_default = {
96716
96716
  name: "oh-my-opencode",
96717
- version: "5.0.0-beta.45",
96717
+ version: "5.0.0-beta.47",
96718
96718
  description: "The Best AI Agent Harness - Batteries-Included OpenCode Plugin with Multi-Model Orchestration, Parallel Background Agents, and Crafted LSP/AST Tools",
96719
96719
  main: "./dist/index.js",
96720
96720
  types: "dist/index.d.ts",
@@ -96898,7 +96898,7 @@ var package_default = {
96898
96898
  zod: "^4.4.3"
96899
96899
  },
96900
96900
  devDependencies: {
96901
- "@code-yeongyu/senpi": "2026.9.6",
96901
+ "@code-yeongyu/senpi": "2026.9.7",
96902
96902
  "@oh-my-opencode/agents-md-core": "workspace:*",
96903
96903
  "@oh-my-opencode/ast-grep-mcp": "workspace:*",
96904
96904
  "@oh-my-opencode/boulder-state": "workspace:*",
@@ -96939,18 +96939,18 @@ var package_default = {
96939
96939
  typescript: "^7.0.2"
96940
96940
  },
96941
96941
  optionalDependencies: {
96942
- "oh-my-opencode-darwin-arm64": "5.0.0-beta.45",
96943
- "oh-my-opencode-darwin-x64": "5.0.0-beta.45",
96944
- "oh-my-opencode-darwin-x64-baseline": "5.0.0-beta.45",
96945
- "oh-my-opencode-linux-arm64": "5.0.0-beta.45",
96946
- "oh-my-opencode-linux-arm64-musl": "5.0.0-beta.45",
96947
- "oh-my-opencode-linux-x64": "5.0.0-beta.45",
96948
- "oh-my-opencode-linux-x64-baseline": "5.0.0-beta.45",
96949
- "oh-my-opencode-linux-x64-musl": "5.0.0-beta.45",
96950
- "oh-my-opencode-linux-x64-musl-baseline": "5.0.0-beta.45",
96951
- "oh-my-opencode-windows-arm64": "5.0.0-beta.45",
96952
- "oh-my-opencode-windows-x64": "5.0.0-beta.45",
96953
- "oh-my-opencode-windows-x64-baseline": "5.0.0-beta.45"
96942
+ "oh-my-opencode-darwin-arm64": "5.0.0-beta.47",
96943
+ "oh-my-opencode-darwin-x64": "5.0.0-beta.47",
96944
+ "oh-my-opencode-darwin-x64-baseline": "5.0.0-beta.47",
96945
+ "oh-my-opencode-linux-arm64": "5.0.0-beta.47",
96946
+ "oh-my-opencode-linux-arm64-musl": "5.0.0-beta.47",
96947
+ "oh-my-opencode-linux-x64": "5.0.0-beta.47",
96948
+ "oh-my-opencode-linux-x64-baseline": "5.0.0-beta.47",
96949
+ "oh-my-opencode-linux-x64-musl": "5.0.0-beta.47",
96950
+ "oh-my-opencode-linux-x64-musl-baseline": "5.0.0-beta.47",
96951
+ "oh-my-opencode-windows-arm64": "5.0.0-beta.47",
96952
+ "oh-my-opencode-windows-x64": "5.0.0-beta.47",
96953
+ "oh-my-opencode-windows-x64-baseline": "5.0.0-beta.47"
96954
96954
  },
96955
96955
  overrides: {
96956
96956
  "@earendil-works/pi-agent-core": "0.84.2",
@@ -125828,6 +125828,23 @@ function isAbortedSessionError(error) {
125828
125828
  const message = getErrorText(error);
125829
125829
  return message.toLowerCase().includes("aborted");
125830
125830
  }
125831
+ var TRANSPORT_UNREACHABLE_PATTERNS = [
125832
+ /unable to connect/i,
125833
+ /econnrefused/i,
125834
+ /econnreset/i,
125835
+ /enotfound/i,
125836
+ /socket hang up/i,
125837
+ /fetch failed/i,
125838
+ /network(?:\s|_)?error/i,
125839
+ /not connected/i,
125840
+ /connection (?:closed|refused|reset)/i
125841
+ ];
125842
+ function isTransportUnreachableError(error) {
125843
+ const text = extractErrorMessage(error) ?? getErrorText(error);
125844
+ if (!text)
125845
+ return false;
125846
+ return TRANSPORT_UNREACHABLE_PATTERNS.some((pattern) => pattern.test(text));
125847
+ }
125831
125848
  function getErrorText(error) {
125832
125849
  if (!error)
125833
125850
  return "";
@@ -136643,10 +136660,14 @@ async function checkSessionExistence(client3, sessionID, directory) {
136643
136660
  ...directory ? { query: { directory } } : {}
136644
136661
  });
136645
136662
  if (response.error !== undefined && response.error !== null) {
136663
+ if (isTransportUnreachableError(response.error))
136664
+ return "missing";
136646
136665
  return isSessionNotFoundError(response.error) ? "missing" : "unknown";
136647
136666
  }
136648
136667
  return response.data != null ? "exists" : "missing";
136649
136668
  } catch (error) {
136669
+ if (isTransportUnreachableError(error))
136670
+ return "missing";
136650
136671
  return isSessionNotFoundError(error) ? "missing" : "unknown";
136651
136672
  }
136652
136673
  }
@@ -137137,12 +137158,23 @@ async function getSessionActivityFromClient(client3, sessionID, directory) {
137137
137158
  ...directory ? { query: { directory } } : {}
137138
137159
  });
137139
137160
  if (isRecord(response) && response.error !== undefined && response.error !== null) {
137161
+ if (isTransportUnreachableError(response.error)) {
137162
+ log2("[background-agent] Session server is unreachable while reading activity:", { sessionID, error: response.error });
137163
+ return { type: "missing" };
137164
+ }
137140
137165
  log2("[background-agent] Failed to read session activity:", { sessionID, error: response.error });
137141
137166
  return { type: "unavailable" };
137142
137167
  }
137143
137168
  const sessionInfo = isRecord(response) && "data" in response ? response.data : response;
137144
137169
  return sessionActivityLookupFromInfo(sessionInfo);
137145
137170
  } catch (error) {
137171
+ if (isTransportUnreachableError(error)) {
137172
+ log2("[background-agent] Session server is unreachable while reading activity:", {
137173
+ sessionID,
137174
+ error: error instanceof Error ? error.message : error
137175
+ });
137176
+ return { type: "missing" };
137177
+ }
137146
137178
  if (error instanceof Error) {
137147
137179
  log2("[background-agent] Failed to read session activity:", { sessionID, error: error.message });
137148
137180
  return { type: "unavailable" };
@@ -137257,6 +137289,7 @@ async function interruptStaleTask(args) {
137257
137289
  const {
137258
137290
  task,
137259
137291
  client: client3,
137292
+ directory,
137260
137293
  concurrencyManager,
137261
137294
  notifyParentSession,
137262
137295
  onTaskInterrupted,
@@ -137269,12 +137302,20 @@ async function interruptStaleTask(args) {
137269
137302
  } = args;
137270
137303
  const aborted = await abortWithTimeout(client3, sessionID);
137271
137304
  if (!aborted) {
137272
- log2("[background-agent] Task stale interruption skipped because session abort failed:", {
137305
+ const existence = await checkSessionExistence(client3, sessionID, directory);
137306
+ if (existence !== "missing") {
137307
+ log2("[background-agent] Task stale interruption skipped because session abort failed:", {
137308
+ taskId: task.id,
137309
+ sessionID,
137310
+ reason
137311
+ });
137312
+ return;
137313
+ }
137314
+ log2("[background-agent] Session is gone and cannot be aborted; finalizing the stale task:", {
137273
137315
  taskId: task.id,
137274
137316
  sessionID,
137275
137317
  reason
137276
137318
  });
137277
- return;
137278
137319
  }
137279
137320
  if (task.status !== "running" || task.sessionId !== sessionID)
137280
137321
  return;
@@ -137357,6 +137398,7 @@ async function checkAndInterruptStaleTasks(args) {
137357
137398
  staleInterruptions.push(interruptStaleTask({
137358
137399
  task,
137359
137400
  client: client3,
137401
+ directory,
137360
137402
  concurrencyManager,
137361
137403
  notifyParentSession,
137362
137404
  onTaskInterrupted,
@@ -137404,6 +137446,7 @@ async function checkAndInterruptStaleTasks(args) {
137404
137446
  staleInterruptions.push(interruptStaleTask({
137405
137447
  task,
137406
137448
  client: client3,
137449
+ directory,
137407
137450
  concurrencyManager,
137408
137451
  notifyParentSession,
137409
137452
  onTaskInterrupted,
@@ -150287,7 +150330,7 @@ function getReplyListenerRuntimeSignature(config2) {
150287
150330
  // packages/openclaw-core/src/reply-listener-poll-loop.ts
150288
150331
  var PRUNE_INTERVAL_MS = 60 * 60 * 1000;
150289
150332
  // packages/openclaw-core/src/reply-listener-start.ts
150290
- import { dirname as dirname46, join as join127 } from "path";
150333
+ import { dirname as dirname46, join as join128 } from "path";
150291
150334
  import { fileURLToPath as fileURLToPath7 } from "url";
150292
150335
 
150293
150336
  // packages/openclaw-core/src/reply-listener-spawn.ts
@@ -150296,6 +150339,7 @@ init_runtime();
150296
150339
  // packages/openclaw-core/src/reply-listener-process.ts
150297
150340
  init_runtime();
150298
150341
  import { readFileSync as readFileSync71 } from "fs";
150342
+ import { join as join127 } from "path";
150299
150343
  var REPLY_LISTENER_DAEMON_IDENTITY_MARKER = "--openclaw-reply-listener-daemon";
150300
150344
  var REPLY_LISTENER_DAEMON_ENV_ALLOWLIST = [
150301
150345
  "PATH",
@@ -150329,6 +150373,22 @@ var REPLY_LISTENER_DAEMON_ENV_ALLOWLIST = [
150329
150373
  "windir",
150330
150374
  "COMSPEC"
150331
150375
  ];
150376
+ async function windowsProcessCommandLineHasMarker(pid, deps) {
150377
+ const systemRoot = process.env.SystemRoot ?? process.env.SYSTEMROOT ?? "C:\\Windows";
150378
+ const powershell = join127(systemRoot, "System32", "WindowsPowerShell", "v1.0", "powershell.exe");
150379
+ const processInfo = deps.spawn([
150380
+ powershell,
150381
+ "-NoProfile",
150382
+ "-NonInteractive",
150383
+ "-Command",
150384
+ `Get-CimInstance Win32_Process -Filter "ProcessId=${pid}" | Select-Object -ExpandProperty CommandLine`
150385
+ ], { stdout: "pipe", stderr: "ignore" });
150386
+ const stdout = await new Response(processInfo.stdout).text();
150387
+ await processInfo.exited;
150388
+ if (processInfo.exitCode !== 0)
150389
+ return false;
150390
+ return stdout.includes(REPLY_LISTENER_DAEMON_IDENTITY_MARKER);
150391
+ }
150332
150392
  function ignoreReplyListenerProcessProbeError(error) {
150333
150393
  if (error instanceof Error)
150334
150394
  return;
@@ -150364,6 +150424,9 @@ async function isReplyListenerDaemonProcessWithDeps(pid, deps) {
150364
150424
  const cmdline = readProcCmdline(pid);
150365
150425
  return cmdline.includes(REPLY_LISTENER_DAEMON_IDENTITY_MARKER);
150366
150426
  }
150427
+ if (platform2 === "win32") {
150428
+ return await windowsProcessCommandLineHasMarker(pid, deps);
150429
+ }
150367
150430
  const processInfo = deps.spawn(["ps", "-p", String(pid), "-o", "args="], {
150368
150431
  stdout: "pipe",
150369
150432
  stderr: "ignore"
@@ -150529,7 +150592,7 @@ function createStartFailureResult(message, state3) {
150529
150592
  }
150530
150593
  function resolveReplyListenerDaemonScript(currentFileUrl) {
150531
150594
  const currentFilePath = fileURLToPath7(currentFileUrl);
150532
- return currentFilePath.endsWith(".ts") ? join127(dirname46(currentFilePath), "daemon.ts") : join127(dirname46(currentFilePath), "daemon.js");
150595
+ return currentFilePath.endsWith(".ts") ? join128(dirname46(currentFilePath), "daemon.ts") : join128(dirname46(currentFilePath), "daemon.js");
150533
150596
  }
150534
150597
  async function startReplyListener(config2) {
150535
150598
  const normalizedConfig = getNormalizedReplyListenerConfig(config2);
@@ -150953,12 +151016,12 @@ async function createRuntimeSkillSourceServer(options, runtimeEnv = runtime6) {
150953
151016
  }
150954
151017
  // packages/claude-code-compat-core/src/features/claude-code-mcp-loader/loader.ts
150955
151018
  import { existsSync as existsSync104, readFileSync as readFileSync72 } from "fs";
150956
- import { join as join128 } from "path";
151019
+ import { join as join129 } from "path";
150957
151020
  import { homedir as homedir26 } from "os";
150958
151021
  function resolveMcpLoaderContext(options = {}) {
150959
151022
  const cwd = options.cwd ?? process.cwd();
150960
151023
  const homeDir = options.homeDir ?? getHomeDir();
150961
- const claudeConfigDir = options.claudeConfigDir ?? (options.homeDir === undefined ? getClaudeConfigDir3() : join128(homeDir, ".claude"));
151024
+ const claudeConfigDir = options.claudeConfigDir ?? (options.homeDir === undefined ? getClaudeConfigDir3() : join129(homeDir, ".claude"));
150962
151025
  return { cwd, homeDir, claudeConfigDir };
150963
151026
  }
150964
151027
  var mcpLoaderInternals = {
@@ -150967,10 +151030,10 @@ var mcpLoaderInternals = {
150967
151030
  function getMcpConfigPaths(context) {
150968
151031
  const { claudeConfigDir, homeDir, cwd } = context;
150969
151032
  return [
150970
- { path: join128(homeDir, ".claude.json"), scope: "user" },
150971
- { path: join128(claudeConfigDir, ".mcp.json"), scope: "user" },
150972
- { path: join128(cwd, ".mcp.json"), scope: "project" },
150973
- { path: join128(cwd, ".claude", ".mcp.json"), scope: "local" }
151033
+ { path: join129(homeDir, ".claude.json"), scope: "user" },
151034
+ { path: join129(claudeConfigDir, ".mcp.json"), scope: "user" },
151035
+ { path: join129(cwd, ".mcp.json"), scope: "project" },
151036
+ { path: join129(cwd, ".claude", ".mcp.json"), scope: "local" }
150974
151037
  ];
150975
151038
  }
150976
151039
  function getHomeDir() {
@@ -160489,13 +160552,13 @@ createHephaestusAgent.mode = MODE9;
160489
160552
  // packages/omo-opencode/src/agents/builtin-agents/resolve-file-uri.ts
160490
160553
  import { existsSync as existsSync105, readFileSync as readFileSync73 } from "fs";
160491
160554
  import { homedir as homedir27 } from "os";
160492
- import { isAbsolute as isAbsolute18, join as join129, resolve as resolve33 } from "path";
160555
+ import { isAbsolute as isAbsolute18, join as join130, resolve as resolve33 } from "path";
160493
160556
  init_logger2();
160494
160557
  var ALLOWED_HOME_SUBDIRS = [
160495
- join129(homedir27(), ".config", "opencode"),
160496
- join129(homedir27(), ".config", "oh-my-openagent"),
160497
- join129(homedir27(), ".omo"),
160498
- join129(homedir27(), ".opencode")
160558
+ join130(homedir27(), ".config", "opencode"),
160559
+ join130(homedir27(), ".config", "oh-my-openagent"),
160560
+ join130(homedir27(), ".omo"),
160561
+ join130(homedir27(), ".opencode")
160499
160562
  ];
160500
160563
  function isWithinAllowedPaths(filePath, projectRoot) {
160501
160564
  if (isWithinProject(filePath, projectRoot))
@@ -163253,7 +163316,7 @@ async function applyAgentConfig(params) {
163253
163316
  }
163254
163317
  // packages/claude-code-compat-core/src/features/claude-code-command-loader/loader.ts
163255
163318
  import { promises as fs21 } from "fs";
163256
- import { join as join130, basename as basename21 } from "path";
163319
+ import { join as join131, basename as basename21 } from "path";
163257
163320
 
163258
163321
  // packages/claude-code-compat-core/src/features/claude-code-command-loader/loader-cache.ts
163259
163322
  var commandLoaderCache = new Map;
@@ -163301,7 +163364,7 @@ async function loadCommandsFromDir(commandsDir, scope, visited = new Set, prefix
163301
163364
  continue;
163302
163365
  if (entry.name.startsWith("."))
163303
163366
  continue;
163304
- const subDirPath = join130(commandsDir, entry.name);
163367
+ const subDirPath = join131(commandsDir, entry.name);
163305
163368
  const subPrefix = prefix ? `${prefix}/${entry.name}` : entry.name;
163306
163369
  const subCommands = await loadCommandsFromDir(subDirPath, scope, visited, subPrefix);
163307
163370
  commands2.push(...subCommands);
@@ -163309,7 +163372,7 @@ async function loadCommandsFromDir(commandsDir, scope, visited = new Set, prefix
163309
163372
  }
163310
163373
  if (!isMarkdownFile(entry))
163311
163374
  continue;
163312
- const commandPath = join130(commandsDir, entry.name);
163375
+ const commandPath = join131(commandsDir, entry.name);
163313
163376
  const baseCommandName = basename21(entry.name, ".md");
163314
163377
  const commandName = prefix ? `${prefix}/${baseCommandName}` : baseCommandName;
163315
163378
  try {
@@ -163372,12 +163435,12 @@ function commandsToRecord(commands2) {
163372
163435
  return result;
163373
163436
  }
163374
163437
  async function loadUserCommands() {
163375
- const userCommandsDir = join130(getClaudeConfigDir3(), "commands");
163438
+ const userCommandsDir = join131(getClaudeConfigDir3(), "commands");
163376
163439
  const commands2 = await loadCommandsFromDir(userCommandsDir, "user");
163377
163440
  return commandsToRecord(commands2);
163378
163441
  }
163379
163442
  async function loadProjectCommands(directory) {
163380
- const projectCommandsDir = join130(directory ?? process.cwd(), ".claude", "commands");
163443
+ const projectCommandsDir = join131(directory ?? process.cwd(), ".claude", "commands");
163381
163444
  const commands2 = await loadCommandsFromDir(projectCommandsDir, "project");
163382
163445
  return commandsToRecord(commands2);
163383
163446
  }
@@ -171318,7 +171381,7 @@ function createChatHeadersHandler(args) {
171318
171381
  }
171319
171382
 
171320
171383
  // packages/omo-opencode/src/plugin/ultrawork-db-model-override.ts
171321
- import { join as join131 } from "path";
171384
+ import { join as join132 } from "path";
171322
171385
  import { existsSync as existsSync107 } from "fs";
171323
171386
  async function importBunSqlite() {
171324
171387
  if (typeof globalThis.Bun === "undefined") {
@@ -171335,7 +171398,7 @@ async function importBunSqlite() {
171335
171398
  }
171336
171399
  }
171337
171400
  function getDbPath() {
171338
- return join131(getDataDir(), "opencode", "opencode.db");
171401
+ return join132(getDataDir(), "opencode", "opencode.db");
171339
171402
  }
171340
171403
  var MAX_MICROTASK_RETRIES = 10;
171341
171404
  function logCaughtDbError(message, metadata, error) {
@@ -174027,7 +174090,7 @@ init_logger2();
174027
174090
  // packages/omo-opencode/src/shared/omo-process-sweep.ts
174028
174091
  import { fileURLToPath as fileURLToPath9 } from "url";
174029
174092
  // packages/utils/src/process-sweep/sweeper.ts
174030
- import { join as join134 } from "path";
174093
+ import { join as join135 } from "path";
174031
174094
 
174032
174095
  // packages/utils/src/process-sweep/family-sweeper.ts
174033
174096
  import { existsSync as existsSync108, mkdirSync as mkdirSync25, statSync as statSync16, utimesSync, writeFileSync as writeFileSync27 } from "fs";
@@ -174281,7 +174344,7 @@ function delay6(ms) {
174281
174344
  // packages/utils/src/process-sweep/lsp-daemon-family.ts
174282
174345
  import { readFileSync as readFileSync75, readdirSync as readdirSync30 } from "fs";
174283
174346
  import { homedir as homedir28 } from "os";
174284
- import { basename as basename23, join as join132, resolve as resolve36 } from "path";
174347
+ import { basename as basename23, join as join133, resolve as resolve36 } from "path";
174285
174348
 
174286
174349
  // packages/utils/src/process-sweep/lsp-daemon-owner-attestation.ts
174287
174350
  import { readFile as readFile13 } from "fs/promises";
@@ -174398,7 +174461,7 @@ function resolveLspDaemonBaseDir(options = {}) {
174398
174461
  if (override !== undefined && override.trim().length > 0)
174399
174462
  return resolve36(override);
174400
174463
  const homeDir = options.homeDir ?? env["HOME"] ?? env["USERPROFILE"] ?? homedir28();
174401
- return join132(homeDir, ".omo", "lsp-daemon");
174464
+ return join133(homeDir, ".omo", "lsp-daemon");
174402
174465
  }
174403
174466
  var VERSION_ENTRY_PATTERN = /^v([A-Za-z0-9][A-Za-z0-9._+-]{0,127})$/;
174404
174467
  function listLspDaemonVersionDirs(baseDir) {
@@ -174417,12 +174480,12 @@ function listLspDaemonVersionDirs(baseDir) {
174417
174480
  const version = VERSION_ENTRY_PATTERN.exec(entry.name)?.[1];
174418
174481
  if (version === undefined)
174419
174482
  continue;
174420
- versions.push({ dir: join132(baseDir, entry.name), version });
174483
+ versions.push({ dir: join133(baseDir, entry.name), version });
174421
174484
  }
174422
174485
  return versions.sort((left, right) => left.version.localeCompare(right.version));
174423
174486
  }
174424
174487
  function readLspDaemonOwnerTarget(versionDir) {
174425
- const ownerPath = join132(versionDir, "daemon.owner");
174488
+ const ownerPath = join133(versionDir, "daemon.owner");
174426
174489
  let raw;
174427
174490
  try {
174428
174491
  raw = requireOwnerText(ownerPath);
@@ -174433,7 +174496,7 @@ function readLspDaemonOwnerTarget(versionDir) {
174433
174496
  const owner = parseLspDaemonOwner(JSON.parse(raw));
174434
174497
  if (owner === null)
174435
174498
  return null;
174436
- return { authPath: join132(versionDir, "daemon.auth"), owner, ownerPath, pid: owner.pid };
174499
+ return { authPath: join133(versionDir, "daemon.auth"), owner, ownerPath, pid: owner.pid };
174437
174500
  } catch {
174438
174501
  return null;
174439
174502
  }
@@ -174605,33 +174668,33 @@ function matchLspDaemonProxyCommand(command, roots, platform2) {
174605
174668
  // packages/utils/src/process-sweep/roots.ts
174606
174669
  import { existsSync as existsSync109, readdirSync as readdirSync31, realpathSync as realpathSync20 } from "fs";
174607
174670
  import { homedir as homedir29 } from "os";
174608
- import { join as join133, resolve as resolve37 } from "path";
174671
+ import { join as join134, resolve as resolve37 } from "path";
174609
174672
  function discoverOmoOwnedRoots(options = {}) {
174610
174673
  const env = options.env ?? process.env;
174611
174674
  const homeDir = options.homeDir ?? env["HOME"] ?? env["USERPROFILE"] ?? homedir29();
174612
174675
  const roots = new Set;
174613
- addRoot(roots, join133(homeDir, ".claude", "omo"));
174676
+ addRoot(roots, join134(homeDir, ".claude", "omo"));
174614
174677
  addRoot(roots, options.pluginRoot);
174615
174678
  for (const root of options.extraRoots ?? [])
174616
174679
  addRoot(roots, root);
174617
- for (const root of readCodexPluginCacheRoots(options.codexHome ?? env["CODEX_HOME"] ?? join133(homeDir, ".codex"))) {
174680
+ for (const root of readCodexPluginCacheRoots(options.codexHome ?? env["CODEX_HOME"] ?? join134(homeDir, ".codex"))) {
174618
174681
  addRoot(roots, root);
174619
174682
  }
174620
174683
  return [...roots];
174621
174684
  }
174622
174685
  function readCodexPluginCacheRoots(codexHome) {
174623
- const cacheRoot = join133(codexHome, "plugins", "cache");
174686
+ const cacheRoot = join134(codexHome, "plugins", "cache");
174624
174687
  if (!existsSync109(cacheRoot))
174625
174688
  return [];
174626
174689
  const roots = [];
174627
174690
  for (const publisher of safeReadDir(cacheRoot)) {
174628
174691
  if (!OMO_CODEX_PLUGIN_CACHE_PUBLISHERS.has(publisher))
174629
174692
  continue;
174630
- const omoRoot = join133(cacheRoot, publisher, "omo");
174693
+ const omoRoot = join134(cacheRoot, publisher, "omo");
174631
174694
  if (!existsSync109(omoRoot))
174632
174695
  continue;
174633
174696
  for (const version of safeReadDir(omoRoot))
174634
- roots.push(join133(omoRoot, version));
174697
+ roots.push(join134(omoRoot, version));
174635
174698
  }
174636
174699
  return roots;
174637
174700
  }
@@ -174671,7 +174734,7 @@ var OMO_CODEX_PLUGIN_CACHE_PUBLISHERS = new Set(["sisyphuslabs"]);
174671
174734
  // packages/utils/src/process-sweep/sweeper.ts
174672
174735
  var LSP_PROXY_SWEEP_STAMP_FILE = "lsp-proxy-sweep.stamp";
174673
174736
  async function sweepOrphanedLspDaemonProxies(options = {}) {
174674
- const stampFile = join134(resolveLspDaemonBaseDir(options), LSP_PROXY_SWEEP_STAMP_FILE);
174737
+ const stampFile = join135(resolveLspDaemonBaseDir(options), LSP_PROXY_SWEEP_STAMP_FILE);
174675
174738
  const ownedRoots = options.ownedRoots ?? discoverOmoOwnedRoots(options);
174676
174739
  const result = await runProcessFamilySweep({
174677
174740
  familyLabel: "lsp-daemon proxy sweep",
@@ -174690,7 +174753,7 @@ async function sweepOrphanedLspDaemonProxies(options = {}) {
174690
174753
  var LSP_DAEMON_SWEEP_STAMP_FILE = "lsp-daemon-sweep.stamp";
174691
174754
  async function sweepStaleLspDaemonVersions(options = {}) {
174692
174755
  const baseDir = resolveLspDaemonBaseDir(options);
174693
- const stampFile = join134(baseDir, LSP_DAEMON_SWEEP_STAMP_FILE);
174756
+ const stampFile = join135(baseDir, LSP_DAEMON_SWEEP_STAMP_FILE);
174694
174757
  const currentVersion = resolveCurrentLspDaemonVersion(options);
174695
174758
  const dryRun = options.dryRun === true;
174696
174759
  if (currentVersion === undefined) {
@@ -174763,21 +174826,21 @@ function defaultPluginRoot() {
174763
174826
  init_atomic_write();
174764
174827
  init_xdg_data_dir();
174765
174828
  import { existsSync as existsSync110, mkdirSync as mkdirSync26, readFileSync as readFileSync76 } from "fs";
174766
- import { basename as basename24, join as join135 } from "path";
174829
+ import { basename as basename24, join as join136 } from "path";
174767
174830
  var POSTHOG_ACTIVITY_STATE_FILE = "posthog-activity.json";
174768
174831
  function resolveTelemetryStateDir(product, options = {}) {
174769
174832
  const dataDir = resolveXdgDataDir(product.cacheDirName, {
174770
174833
  env: options.env,
174771
174834
  osProvider: options.osProvider
174772
174835
  });
174773
- const xdgStateDir = options.env?.XDG_DATA_HOME === undefined ? undefined : join135(options.env.XDG_DATA_HOME, product.cacheDirName);
174836
+ const xdgStateDir = options.env?.XDG_DATA_HOME === undefined ? undefined : join136(options.env.XDG_DATA_HOME, product.cacheDirName);
174774
174837
  if (dataDir === xdgStateDir || xdgStateDir === undefined && basename24(dataDir) === product.cacheDirName) {
174775
174838
  return dataDir;
174776
174839
  }
174777
- return join135(dataDir, product.cacheDirName);
174840
+ return join136(dataDir, product.cacheDirName);
174778
174841
  }
174779
174842
  function getTelemetryActivityStateFilePath(stateDir) {
174780
- return join135(stateDir, POSTHOG_ACTIVITY_STATE_FILE);
174843
+ return join136(stateDir, POSTHOG_ACTIVITY_STATE_FILE);
174781
174844
  }
174782
174845
  function getDailyActiveCaptureState(input) {
174783
174846
  const state3 = readPostHogActivityState(input.stateDir, input.diagnostics);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "oh-my-opencode",
3
- "version": "5.0.0-beta.45",
3
+ "version": "5.0.0-beta.47",
4
4
  "description": "The Best AI Agent Harness - Batteries-Included OpenCode Plugin with Multi-Model Orchestration, Parallel Background Agents, and Crafted LSP/AST Tools",
5
5
  "main": "./dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -184,7 +184,7 @@
184
184
  "zod": "^4.4.3"
185
185
  },
186
186
  "devDependencies": {
187
- "@code-yeongyu/senpi": "2026.9.6",
187
+ "@code-yeongyu/senpi": "2026.9.7",
188
188
  "@oh-my-opencode/agents-md-core": "workspace:*",
189
189
  "@oh-my-opencode/ast-grep-mcp": "workspace:*",
190
190
  "@oh-my-opencode/boulder-state": "workspace:*",
@@ -225,18 +225,18 @@
225
225
  "typescript": "^7.0.2"
226
226
  },
227
227
  "optionalDependencies": {
228
- "oh-my-opencode-darwin-arm64": "5.0.0-beta.45",
229
- "oh-my-opencode-darwin-x64": "5.0.0-beta.45",
230
- "oh-my-opencode-darwin-x64-baseline": "5.0.0-beta.45",
231
- "oh-my-opencode-linux-arm64": "5.0.0-beta.45",
232
- "oh-my-opencode-linux-arm64-musl": "5.0.0-beta.45",
233
- "oh-my-opencode-linux-x64": "5.0.0-beta.45",
234
- "oh-my-opencode-linux-x64-baseline": "5.0.0-beta.45",
235
- "oh-my-opencode-linux-x64-musl": "5.0.0-beta.45",
236
- "oh-my-opencode-linux-x64-musl-baseline": "5.0.0-beta.45",
237
- "oh-my-opencode-windows-arm64": "5.0.0-beta.45",
238
- "oh-my-opencode-windows-x64": "5.0.0-beta.45",
239
- "oh-my-opencode-windows-x64-baseline": "5.0.0-beta.45"
228
+ "oh-my-opencode-darwin-arm64": "5.0.0-beta.47",
229
+ "oh-my-opencode-darwin-x64": "5.0.0-beta.47",
230
+ "oh-my-opencode-darwin-x64-baseline": "5.0.0-beta.47",
231
+ "oh-my-opencode-linux-arm64": "5.0.0-beta.47",
232
+ "oh-my-opencode-linux-arm64-musl": "5.0.0-beta.47",
233
+ "oh-my-opencode-linux-x64": "5.0.0-beta.47",
234
+ "oh-my-opencode-linux-x64-baseline": "5.0.0-beta.47",
235
+ "oh-my-opencode-linux-x64-musl": "5.0.0-beta.47",
236
+ "oh-my-opencode-linux-x64-musl-baseline": "5.0.0-beta.47",
237
+ "oh-my-opencode-windows-arm64": "5.0.0-beta.47",
238
+ "oh-my-opencode-windows-x64": "5.0.0-beta.47",
239
+ "oh-my-opencode-windows-x64-baseline": "5.0.0-beta.47"
240
240
  },
241
241
  "overrides": {
242
242
  "@earendil-works/pi-agent-core": "0.84.2",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "omo",
3
- "version": "5.0.0-beta.45",
3
+ "version": "5.0.0-beta.47",
4
4
  "description": "One Codex plugin namespace for Yeongyu's local Codex components.",
5
5
  "author": {
6
6
  "name": "Yeongyu Kim",
@@ -8,7 +8,7 @@
8
8
  "command": "node \"${PLUGIN_ROOT}/components/bootstrap/dist/cli.js\" hook session-start",
9
9
  "commandWindows": "powershell -NoProfile -ExecutionPolicy Bypass -File \"${PLUGIN_ROOT}\\components\\bootstrap\\scripts\\bootstrap.ps1\"",
10
10
  "timeout": 30,
11
- "statusMessage": "(OmO 5.0.0-beta.45) Checking Bootstrap Provisioning"
11
+ "statusMessage": "(OmO 5.0.0-beta.47) Checking Bootstrap Provisioning"
12
12
  }
13
13
  ]
14
14
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sisyphuslabs/codex-bootstrap",
3
- "version": "5.0.0-beta.45",
3
+ "version": "5.0.0-beta.47",
4
4
  "description": "Codex SessionStart bootstrap component that provisions LazyCodex runtime dependencies from a detached worker.",
5
5
  "type": "module",
6
6
  "private": true,
@@ -8,7 +8,7 @@
8
8
  "type": "command",
9
9
  "command": "node \"${PLUGIN_ROOT}/dist/cli.js\" hook post-tool-use",
10
10
  "timeout": 30,
11
- "statusMessage": "(OmO 5.0.0-beta.45) Checking Comments"
11
+ "statusMessage": "(OmO 5.0.0-beta.47) Checking Comments"
12
12
  }
13
13
  ]
14
14
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@code-yeongyu/codex-comment-checker",
3
- "version": "5.0.0-beta.45",
3
+ "version": "5.0.0-beta.47",
4
4
  "description": "Codex plugin that runs comment-checker after edit-like PostToolUse hooks.",
5
5
  "type": "module",
6
6
  "packageManager": "npm@11.12.1",
@@ -8,7 +8,7 @@
8
8
  "type": "command",
9
9
  "command": "node \"${PLUGIN_ROOT}/dist/cli.js\" hook pre-tool-use",
10
10
  "timeout": 5,
11
- "statusMessage": "(OmO 5.0.0-beta.45) Recommending Git Bash MCP"
11
+ "statusMessage": "(OmO 5.0.0-beta.47) Recommending Git Bash MCP"
12
12
  }
13
13
  ]
14
14
  }
@@ -20,7 +20,7 @@
20
20
  "type": "command",
21
21
  "command": "node \"${PLUGIN_ROOT}/dist/cli.js\" hook post-compact",
22
22
  "timeout": 5,
23
- "statusMessage": "(OmO 5.0.0-beta.45) Resetting Git Bash MCP Reminder"
23
+ "statusMessage": "(OmO 5.0.0-beta.47) Resetting Git Bash MCP Reminder"
24
24
  }
25
25
  ]
26
26
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sisyphuslabs/codex-git-bash-hook",
3
- "version": "5.0.0-beta.45",
3
+ "version": "5.0.0-beta.47",
4
4
  "description": "Codex hook component that reminds Windows sessions to prefer the OMO git_bash MCP.",
5
5
  "type": "module",
6
6
  "private": true,
@@ -8,7 +8,7 @@
8
8
  "type": "command",
9
9
  "command": "node \"${PLUGIN_ROOT}/components/lazycodex-executor-verify/dist/cli.js\" hook subagent-stop",
10
10
  "timeout": 10,
11
- "statusMessage": "(OmO 5.0.0-beta.45) Verifying LazyCodex Executor Evidence"
11
+ "statusMessage": "(OmO 5.0.0-beta.47) Verifying LazyCodex Executor Evidence"
12
12
  }
13
13
  ]
14
14
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@code-yeongyu/codex-lazycodex-executor-verify",
3
- "version": "5.0.0-beta.45",
3
+ "version": "5.0.0-beta.47",
4
4
  "description": "Codex SubagentStop evidence verifier for LazyCodex executor completions.",
5
5
  "type": "module",
6
6
  "packageManager": "npm@11.12.1",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "schemaVersion": 1,
3
- "version": "5.0.0-beta.45",
4
- "inputDigest": "sha256:5f5d7dd99cabd56f4a089d529f755088533747163dfeb5b5ebf875db2d7fba53",
3
+ "version": "5.0.0-beta.47",
4
+ "inputDigest": "sha256:94520f713de8b6ee4d0cdfc7bf4d42221ae6f23e646b8cfed12bd55fa6f298b7",
5
5
  "outputs": [
6
6
  {
7
7
  "path": "cli.d.ts",
@@ -8,7 +8,7 @@
8
8
  "type": "command",
9
9
  "command": "node \"${PLUGIN_ROOT}/dist/cli.js\" hook post-tool-use",
10
10
  "timeout": 60,
11
- "statusMessage": "(OmO 5.0.0-beta.45) Checking LSP Diagnostics"
11
+ "statusMessage": "(OmO 5.0.0-beta.47) Checking LSP Diagnostics"
12
12
  }
13
13
  ]
14
14
  }
@@ -21,7 +21,7 @@
21
21
  "type": "command",
22
22
  "command": "node \"${PLUGIN_ROOT}/dist/cli.js\" hook post-compact",
23
23
  "timeout": 5,
24
- "statusMessage": "(OmO 5.0.0-beta.45) Resetting LSP Diagnostics Cache"
24
+ "statusMessage": "(OmO 5.0.0-beta.47) Resetting LSP Diagnostics Cache"
25
25
  }
26
26
  ]
27
27
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@code-yeongyu/codex-lsp",
3
- "version": "5.0.0-beta.45",
3
+ "version": "5.0.0-beta.47",
4
4
  "description": "Codex plugin that exposes Language Server Protocol tools and post-edit diagnostics.",
5
5
  "type": "module",
6
6
  "packageManager": "npm@11.12.1",