oh-my-opencode 5.1.29 → 5.1.32

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 (146) hide show
  1. package/README.ja.md +2 -0
  2. package/README.ko.md +2 -0
  3. package/README.md +2 -0
  4. package/README.ru.md +2 -0
  5. package/README.zh-cn.md +2 -0
  6. package/dist/cli/cli-program.d.ts +1 -20
  7. package/dist/cli/index.js +950 -51
  8. package/dist/cli/install-command-options.d.ts +20 -0
  9. package/dist/cli/service-auth/browser.d.ts +3 -0
  10. package/dist/cli/service-auth/cli-keystore.fixture.d.ts +7 -0
  11. package/dist/cli/service-auth/commands.d.ts +19 -0
  12. package/dist/cli/service-auth/device-flow.d.ts +15 -0
  13. package/dist/cli/service-auth/device-keys.d.ts +10 -0
  14. package/dist/cli/service-auth/device-name.d.ts +3 -0
  15. package/dist/cli/service-auth/keystore.d.ts +20 -0
  16. package/dist/cli/service-auth/loopback.d.ts +11 -0
  17. package/dist/cli/service-auth/protocol.d.ts +86 -0
  18. package/dist/cli/service-auth/refresh-child.fixture.d.ts +1 -0
  19. package/dist/cli/service-auth/session.d.ts +17 -0
  20. package/dist/cli/service-auth/terminal-text.d.ts +1 -0
  21. package/dist/cli/service-auth/test-support.d.ts +43 -0
  22. package/dist/cli/service-auth/tls-test-certificate.d.ts +4 -0
  23. package/dist/cli-node/index.js +950 -51
  24. package/dist/features/background-agent/task-poller.d.ts +3 -0
  25. package/dist/features/opencode-skill-loader/opencode-shell-skill-content.d.ts +8 -0
  26. package/dist/features/opencode-skill-loader/skill-content.d.ts +1 -0
  27. package/dist/features/team-mode/tools/lifecycle-inline-spec.d.ts +1 -0
  28. package/dist/hooks/keyword-detector/constants.d.ts +1 -0
  29. package/dist/hooks/non-interactive-env/non-interactive-env-hook.d.ts +5 -1
  30. package/dist/index.js +40791 -40412
  31. package/dist/shared/disabled-agents.d.ts +1 -0
  32. package/dist/shared/opencode-shell.d.ts +27 -0
  33. package/dist/skills/browser/SKILL.md +1 -1
  34. package/dist/skills/browser/runtime/omowright/manifest.json +1 -1
  35. package/dist/skills/ultimate-browsing/SKILL.md +14 -16
  36. package/dist/skills/ulw-execute/SKILL.md +2 -2
  37. package/dist/skills/ulw-research/SKILL.md +17 -18
  38. package/dist/skills/ulw-research/scripts/cli-support.test.ts +5 -3
  39. package/dist/skills/ulw-research/scripts/outcome.test.ts +10 -4
  40. package/dist/skills/ulw-research/scripts/report-tools.test.ts +3 -2
  41. package/dist/skills/visual-qa/scripts/cli.test.ts +5 -3
  42. package/dist/tools/delegate-task/executor-types.d.ts +1 -0
  43. package/dist/tools/delegate-task/sync-session-creator.d.ts +1 -0
  44. package/dist/tools/delegate-task/types.d.ts +2 -0
  45. package/dist/tools/session-manager/sdk-storage.d.ts +15 -2
  46. package/dist/tools/session-manager/session-error.d.ts +7 -0
  47. package/dist/tools/session-manager/storage.d.ts +4 -2
  48. package/dist/tui.js +89 -21
  49. package/package.json +15 -14
  50. package/packages/git-bash-mcp/dist/cli.js +1 -1
  51. package/packages/lsp-core/src/lsp/client-diagnostics-freshness.integration.test.ts +90 -0
  52. package/packages/lsp-core/src/lsp/client.ts +3 -1
  53. package/packages/lsp-core/src/lsp/workspace-apply-edit-test-support.ts +5 -2
  54. package/packages/lsp-daemon/dist/cli.js +1 -1
  55. package/packages/lsp-daemon/dist/client.js +1 -1
  56. package/packages/lsp-daemon/dist/index.js +1 -1
  57. package/packages/lsp-tools-mcp/dist/cli.js +1 -1
  58. package/packages/lsp-tools-mcp/dist/lsp/manager.js +1 -1
  59. package/packages/lsp-tools-mcp/dist/mcp.js +1 -1
  60. package/packages/lsp-tools-mcp/dist/tools.js +1 -1
  61. package/packages/omo-codex/plugin/.codex-plugin/plugin.json +1 -1
  62. package/packages/omo-codex/plugin/components/bootstrap/dist/cli.js +7 -4
  63. package/packages/omo-codex/plugin/components/bootstrap/hooks/hooks.json +1 -1
  64. package/packages/omo-codex/plugin/components/bootstrap/package.json +1 -1
  65. package/packages/omo-codex/plugin/components/comment-checker/hooks/hooks.json +1 -1
  66. package/packages/omo-codex/plugin/components/comment-checker/package.json +1 -1
  67. package/packages/omo-codex/plugin/components/git-bash/hooks/hooks.json +2 -2
  68. package/packages/omo-codex/plugin/components/git-bash/package.json +1 -1
  69. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/hooks/hooks.json +1 -1
  70. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/package.json +1 -1
  71. package/packages/omo-codex/plugin/components/lcx/skills/lcx-contribute-bug-fix/SKILL.md +7 -4
  72. package/packages/omo-codex/plugin/components/lsp/dist/.omo-runtime-manifest.json +3 -3
  73. package/packages/omo-codex/plugin/components/lsp/dist/cli.js +1 -1
  74. package/packages/omo-codex/plugin/components/lsp/hooks/hooks.json +2 -2
  75. package/packages/omo-codex/plugin/components/lsp/package.json +1 -1
  76. package/packages/omo-codex/plugin/components/rules/hooks/hooks.json +4 -4
  77. package/packages/omo-codex/plugin/components/rules/package.json +1 -1
  78. package/packages/omo-codex/plugin/components/teammode/hooks/hooks.json +1 -1
  79. package/packages/omo-codex/plugin/components/teammode/package.json +1 -1
  80. package/packages/omo-codex/plugin/components/teammode/skills/teammode/SKILL.md +3 -3
  81. package/packages/omo-codex/plugin/components/telemetry/hooks/hooks.json +1 -1
  82. package/packages/omo-codex/plugin/components/telemetry/package.json +1 -1
  83. package/packages/omo-codex/plugin/components/ultrawork/dist/cli.js +18 -15
  84. package/packages/omo-codex/plugin/components/ultrawork/hooks/hooks.json +1 -1
  85. package/packages/omo-codex/plugin/components/ultrawork/package.json +1 -1
  86. package/packages/omo-codex/plugin/components/ultrawork/src/directive-content.ts +1 -1
  87. package/packages/omo-codex/plugin/components/ulw-execute-continuation/hooks/hooks.json +1 -1
  88. package/packages/omo-codex/plugin/components/ulw-execute-continuation/package.json +1 -1
  89. package/packages/omo-codex/plugin/components/ulw-loop/directive.md +18 -15
  90. package/packages/omo-codex/plugin/components/ulw-loop/hooks/hooks.json +5 -5
  91. package/packages/omo-codex/plugin/components/ulw-loop/package.json +1 -1
  92. package/packages/omo-codex/plugin/components/ulw-loop/skills/ulw-loop/SKILL.md +2 -2
  93. package/packages/omo-codex/plugin/components/ulw-loop/skills/ulw-loop/references/full-workflow.md +2 -2
  94. package/packages/omo-codex/plugin/hooks/post-compact-resetting-git-bash-mcp-reminder.json +1 -1
  95. package/packages/omo-codex/plugin/hooks/post-compact-resetting-lsp-diagnostics-cache.json +1 -1
  96. package/packages/omo-codex/plugin/hooks/post-compact-resetting-project-rule-cache.json +1 -1
  97. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-comments.json +1 -1
  98. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-lsp-diagnostics.json +1 -1
  99. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-thread-title-hygiene.json +1 -1
  100. package/packages/omo-codex/plugin/hooks/post-tool-use-matching-project-rules.json +1 -1
  101. package/packages/omo-codex/plugin/hooks/post-tool-use-recording-spawn-admission.json +1 -1
  102. package/packages/omo-codex/plugin/hooks/pre-tool-use-enforcing-unlimited-goal-budget.json +1 -1
  103. package/packages/omo-codex/plugin/hooks/pre-tool-use-guarding-ulw-loop-spawns.json +1 -1
  104. package/packages/omo-codex/plugin/hooks/pre-tool-use-recommending-git-bash-mcp.json +1 -1
  105. package/packages/omo-codex/plugin/hooks/session-start-checking-auto-update.json +1 -1
  106. package/packages/omo-codex/plugin/hooks/session-start-checking-bootstrap-provisioning.json +1 -1
  107. package/packages/omo-codex/plugin/hooks/session-start-loading-project-rules.json +1 -1
  108. package/packages/omo-codex/plugin/hooks/session-start-recording-session-telemetry.json +1 -1
  109. package/packages/omo-codex/plugin/hooks/stop-checking-ulw-execute-continuation.json +1 -1
  110. package/packages/omo-codex/plugin/hooks/stop-checking-ulw-loop-resume.json +1 -1
  111. package/packages/omo-codex/plugin/hooks/subagent-stop-verifying-lazycodex-executor-evidence.json +1 -1
  112. package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ultrawork-trigger.json +1 -1
  113. package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ulw-loop-steering.json +1 -1
  114. package/packages/omo-codex/plugin/hooks/user-prompt-submit-loading-project-rules.json +1 -1
  115. package/packages/omo-codex/plugin/package-lock.json +12 -12
  116. package/packages/omo-codex/plugin/package.json +1 -1
  117. package/packages/omo-codex/plugin/scripts/auto-update-plan.mjs +2 -0
  118. package/packages/omo-codex/plugin/scripts/auto-update.mjs +2 -0
  119. package/packages/omo-codex/plugin/scripts/build-bundled-mcp-runtimes.mjs +2 -0
  120. package/packages/omo-codex/plugin/scripts/build-components.mjs +1 -0
  121. package/packages/omo-codex/plugin/scripts/materialize-shared-upstreams.mjs +42 -10
  122. package/packages/omo-codex/plugin/scripts/sync-skills.mjs +2 -2
  123. package/packages/omo-codex/plugin/skills/browser/SKILL.md +1 -1
  124. package/packages/omo-codex/plugin/skills/browser/runtime/omowright/manifest.json +1 -1
  125. package/packages/omo-codex/plugin/skills/lcx-contribute-bug-fix/SKILL.md +7 -4
  126. package/packages/omo-codex/plugin/skills/teammode/SKILL.md +3 -3
  127. package/packages/omo-codex/plugin/skills/ultimate-browsing/SKILL.md +14 -16
  128. package/packages/omo-codex/plugin/skills/ultrawork/SKILL.md +18 -15
  129. package/packages/omo-codex/plugin/skills/ulw-execute/SKILL.md +2 -2
  130. package/packages/omo-codex/plugin/skills/ulw-loop/SKILL.md +2 -2
  131. package/packages/omo-codex/plugin/skills/ulw-loop/references/full-workflow.md +2 -2
  132. package/packages/omo-codex/plugin/skills/ulw-research/SKILL.md +17 -18
  133. package/packages/omo-codex/plugin/test/materialize-shared-upstreams.test.mjs +179 -0
  134. package/packages/omo-codex/plugin/test/sync-skills-test-support.mjs +2 -2
  135. package/packages/omo-codex/plugin/test/windows-console-hide.test.mjs +150 -0
  136. package/packages/omo-codex/scripts/install-dist/install-local.mjs +11 -6
  137. package/packages/prompts-core/prompts/ultrawork/codex.md +18 -15
  138. package/packages/shared-skills/skills/browser/SKILL.md +1 -1
  139. package/packages/shared-skills/skills/browser/runtime/omowright/manifest.json +1 -1
  140. package/packages/shared-skills/skills/ultimate-browsing/SKILL.md +14 -16
  141. package/packages/shared-skills/skills/ulw-execute/SKILL.md +2 -2
  142. package/packages/shared-skills/skills/ulw-research/SKILL.md +17 -18
  143. package/packages/shared-skills/skills/ulw-research/scripts/cli-support.test.ts +5 -3
  144. package/packages/shared-skills/skills/ulw-research/scripts/outcome.test.ts +10 -4
  145. package/packages/shared-skills/skills/ulw-research/scripts/report-tools.test.ts +3 -2
  146. package/packages/shared-skills/skills/visual-qa/scripts/cli.test.ts +5 -3
package/dist/tui.js CHANGED
@@ -2460,6 +2460,56 @@ var init_internal_initiator_marker = __esm(() => {
2460
2460
  INTERNAL_NOREPLY_MARKER_DETECT_PATTERN = /<!--\s*OMO_INTERNAL_NOREPLY\s*-->/;
2461
2461
  });
2462
2462
 
2463
+ // packages/utils/src/migration/agent-names.ts
2464
+ var AGENT_NAME_MAP, BUILTIN_AGENT_NAMES;
2465
+ var init_agent_names = __esm(() => {
2466
+ AGENT_NAME_MAP = {
2467
+ omo: "sisyphus",
2468
+ OmO: "sisyphus",
2469
+ Sisyphus: "sisyphus",
2470
+ "Sisyphus (Ultraworker)": "sisyphus",
2471
+ sisyphus: "sisyphus",
2472
+ "Hephaestus (Deep Agent)": "hephaestus",
2473
+ "OmO-Plan": "prometheus",
2474
+ "omo-plan": "prometheus",
2475
+ "Planner-Sisyphus": "prometheus",
2476
+ "planner-sisyphus": "prometheus",
2477
+ "Prometheus - Plan Builder": "prometheus",
2478
+ "Prometheus (Plan Builder)": "prometheus",
2479
+ prometheus: "prometheus",
2480
+ "orchestrator-sisyphus": "atlas",
2481
+ Atlas: "atlas",
2482
+ "Atlas (Plan Executor)": "atlas",
2483
+ atlas: "atlas",
2484
+ "plan-consultant": "metis",
2485
+ "Metis - Plan Consultant": "metis",
2486
+ "Metis (Plan Consultant)": "metis",
2487
+ metis: "metis",
2488
+ "Momus - Plan Critic": "momus",
2489
+ "Momus (Plan Critic)": "momus",
2490
+ momus: "momus",
2491
+ "Sisyphus-Junior": "sisyphus-junior",
2492
+ "sisyphus-junior": "sisyphus-junior",
2493
+ build: "build",
2494
+ oracle: "oracle",
2495
+ librarian: "librarian",
2496
+ explore: "explore",
2497
+ "multimodal-looker": "multimodal-looker"
2498
+ };
2499
+ BUILTIN_AGENT_NAMES = new Set([
2500
+ "sisyphus",
2501
+ "oracle",
2502
+ "librarian",
2503
+ "explore",
2504
+ "multimodal-looker",
2505
+ "metis",
2506
+ "momus",
2507
+ "prometheus",
2508
+ "atlas",
2509
+ "build"
2510
+ ]);
2511
+ });
2512
+
2463
2513
  // packages/utils/src/migration/agent-category.ts
2464
2514
  function configureMigrationCategoryDefaults(defaults) {
2465
2515
  categoryDefaults = defaults ?? {};
@@ -3570,10 +3620,11 @@ var init_category_model_requirements = __esm(() => {
3570
3620
  },
3571
3621
  { providers: ["xiaomi", "opencode-go"], model: "mimo-v2.6-pro", variant: "max" },
3572
3622
  { providers: ["xai", "github-copilot", "opencode-go"], model: "grok-4.7", variant: "xhigh" },
3623
+ { providers: ["openai", "chatgpt-subscription"], model: "gpt-6.1-sol", variant: "medium" },
3573
3624
  {
3574
3625
  providers: ["openai", "chatgpt-subscription", "github-copilot", "opencode"],
3575
- model: "gpt-5.6-terra",
3576
- variant: "high"
3626
+ model: "gpt-5.6-sol",
3627
+ variant: "medium"
3577
3628
  },
3578
3629
  {
3579
3630
  providers: ["anthropic", "anthropic-api", "github-copilot", "opencode"],
@@ -5386,6 +5437,7 @@ var init_constants = __esm(() => {
5386
5437
  var init_migration2 = __esm(() => {
5387
5438
  init_agent_category();
5388
5439
  init_constants();
5440
+ init_agent_names();
5389
5441
  configureMigrationCategoryDefaults(DEFAULT_CATEGORIES);
5390
5442
  });
5391
5443
 
@@ -70061,7 +70113,8 @@ var init_memory = __esm(() => {
70061
70113
  }).strict();
70062
70114
  OmoMemoryFactsSchema = object({
70063
70115
  enabled: boolean2().default(true),
70064
- debounce_settles: number2().int().min(1).default(4)
70116
+ debounce_settles: number2().int().min(1).default(4),
70117
+ model: string2().min(1).optional()
70065
70118
  }).strict();
70066
70119
  OmoMemoryDreamSchema = object({
70067
70120
  enabled: boolean2().default(true),
@@ -70123,7 +70176,8 @@ var init_memory = __esm(() => {
70123
70176
  }).strict();
70124
70177
  OmoMemoryFactsLayerSchema = object({
70125
70178
  enabled: boolean2().optional(),
70126
- debounce_settles: number2().int().min(1).optional()
70179
+ debounce_settles: number2().int().min(1).optional(),
70180
+ model: string2().min(1).optional()
70127
70181
  }).strict();
70128
70182
  OmoMemoryDreamLayerSchema = object({
70129
70183
  enabled: boolean2().optional(),
@@ -72166,7 +72220,7 @@ function findUnknownKeyPaths(schema, value) {
72166
72220
 
72167
72221
  // packages/omo-opencode/src/config/schema/agent-names.ts
72168
72222
  var BuiltinAgentNameSchema, BuiltinSkillNameSchema, OverridableAgentNameSchema;
72169
- var init_agent_names = __esm(() => {
72223
+ var init_agent_names2 = __esm(() => {
72170
72224
  init_zod();
72171
72225
  BuiltinAgentNameSchema = _enum([
72172
72226
  "sisyphus",
@@ -72990,7 +73044,7 @@ var init_oh_my_opencode_config = __esm(() => {
72990
73044
  // packages/omo-opencode/src/config/schema.ts
72991
73045
  var init_schema2 = __esm(() => {
72992
73046
  init_types6();
72993
- init_agent_names();
73047
+ init_agent_names2();
72994
73048
  init_agent_overrides();
72995
73049
  init_babysitting();
72996
73050
  init_background_task();
@@ -73418,6 +73472,14 @@ var init_model_resolution = __esm(() => {
73418
73472
  init_model_resolution_details();
73419
73473
  });
73420
73474
 
73475
+ // packages/omo-opencode/src/shared/disabled-agents.ts
73476
+ function migrateDisabledAgents(disabledAgents) {
73477
+ return (disabledAgents ?? []).map((agent) => AGENT_NAME_MAP[agent.toLowerCase()] ?? AGENT_NAME_MAP[agent] ?? agent);
73478
+ }
73479
+ var init_disabled_agents = __esm(() => {
73480
+ init_migration2();
73481
+ });
73482
+
73421
73483
  // packages/omo-opencode/src/features/tui-sidebar/roster-resolver.ts
73422
73484
  function formatModelLabel(model) {
73423
73485
  const slashIndex = model.lastIndexOf("/");
@@ -73466,8 +73528,12 @@ function toModelResolutionConfig(config) {
73466
73528
  function resolveRoster(directory) {
73467
73529
  try {
73468
73530
  const config = validatePluginConfig(directory).config;
73531
+ const disabledAgents = new Set(migrateDisabledAgents(config.disabled_agents).map((agent) => agent.toLowerCase()));
73469
73532
  const resolution = getModelResolutionInfoWithOverrides(toModelResolutionConfig(config));
73470
- return [...resolution.agents, ...resolution.categories].map(toRosterRow).sort((left, right) => left.label.localeCompare(right.label));
73533
+ return [
73534
+ ...resolution.agents.filter((entry) => !disabledAgents.has(entry.name.toLowerCase())),
73535
+ ...resolution.categories
73536
+ ].map(toRosterRow).sort((left, right) => left.label.localeCompare(right.label));
73471
73537
  } catch (error) {
73472
73538
  if (error instanceof Error) {
73473
73539
  return [];
@@ -73478,6 +73544,7 @@ function resolveRoster(directory) {
73478
73544
  var init_roster_resolver = __esm(() => {
73479
73545
  init_model_resolution();
73480
73546
  init_validate();
73547
+ init_disabled_agents();
73481
73548
  });
73482
73549
 
73483
73550
  // packages/omo-opencode/src/features/btw-side/context-injector.ts
@@ -74909,7 +74976,7 @@ init_shared();
74909
74976
  // package.json
74910
74977
  var package_default = {
74911
74978
  name: "oh-my-opencode",
74912
- version: "5.1.29",
74979
+ version: "5.1.32",
74913
74980
  description: "The Best AI Agent Harness - Batteries-Included OpenCode Plugin with Multi-Model Orchestration, Parallel Background Agents, and Crafted LSP/AST Tools",
74914
74981
  main: "./dist/index.js",
74915
74982
  types: "dist/index.d.ts",
@@ -75086,7 +75153,7 @@ var package_default = {
75086
75153
  },
75087
75154
  devDependencies: {
75088
75155
  "@clack/prompts": "^1.8.1",
75089
- "@code-yeongyu/senpi": "2026.10.10-11",
75156
+ "@code-yeongyu/senpi": "2026.10.12",
75090
75157
  "@modelcontextprotocol/sdk": "^1.30.0",
75091
75158
  "@oh-my-opencode/agents-md-core": "workspace:*",
75092
75159
  "@oh-my-opencode/ast-grep-mcp": "workspace:*",
@@ -75128,6 +75195,7 @@ var package_default = {
75128
75195
  "@types/js-yaml": "^4.0.9",
75129
75196
  "@types/picomatch": "^4.0.3",
75130
75197
  "@typescript/native-preview": "7.0.0-dev.20260707.2",
75198
+ "@typescript/typescript6": "6.0.2",
75131
75199
  "@xterm/addon-unicode11": "^0.9.0",
75132
75200
  "@xterm/xterm": "^6.0.0",
75133
75201
  "bun-types": "1.4.2",
@@ -75144,18 +75212,18 @@ var package_default = {
75144
75212
  typescript: "^7.0.2"
75145
75213
  },
75146
75214
  optionalDependencies: {
75147
- "oh-my-opencode-darwin-arm64": "5.1.29",
75148
- "oh-my-opencode-darwin-x64": "5.1.29",
75149
- "oh-my-opencode-darwin-x64-baseline": "5.1.29",
75150
- "oh-my-opencode-linux-arm64": "5.1.29",
75151
- "oh-my-opencode-linux-arm64-musl": "5.1.29",
75152
- "oh-my-opencode-linux-x64": "5.1.29",
75153
- "oh-my-opencode-linux-x64-baseline": "5.1.29",
75154
- "oh-my-opencode-linux-x64-musl": "5.1.29",
75155
- "oh-my-opencode-linux-x64-musl-baseline": "5.1.29",
75156
- "oh-my-opencode-windows-arm64": "5.1.29",
75157
- "oh-my-opencode-windows-x64": "5.1.29",
75158
- "oh-my-opencode-windows-x64-baseline": "5.1.29"
75215
+ "oh-my-opencode-darwin-arm64": "5.1.32",
75216
+ "oh-my-opencode-darwin-x64": "5.1.32",
75217
+ "oh-my-opencode-darwin-x64-baseline": "5.1.32",
75218
+ "oh-my-opencode-linux-arm64": "5.1.32",
75219
+ "oh-my-opencode-linux-arm64-musl": "5.1.32",
75220
+ "oh-my-opencode-linux-x64": "5.1.32",
75221
+ "oh-my-opencode-linux-x64-baseline": "5.1.32",
75222
+ "oh-my-opencode-linux-x64-musl": "5.1.32",
75223
+ "oh-my-opencode-linux-x64-musl-baseline": "5.1.32",
75224
+ "oh-my-opencode-windows-arm64": "5.1.32",
75225
+ "oh-my-opencode-windows-x64": "5.1.32",
75226
+ "oh-my-opencode-windows-x64-baseline": "5.1.32"
75159
75227
  },
75160
75228
  overrides: {
75161
75229
  hono: "^4.13.8",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "oh-my-opencode",
3
- "version": "5.1.29",
3
+ "version": "5.1.32",
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",
@@ -177,7 +177,7 @@
177
177
  },
178
178
  "devDependencies": {
179
179
  "@clack/prompts": "^1.8.1",
180
- "@code-yeongyu/senpi": "2026.10.10-11",
180
+ "@code-yeongyu/senpi": "2026.10.12",
181
181
  "@modelcontextprotocol/sdk": "^1.30.0",
182
182
  "@oh-my-opencode/agents-md-core": "workspace:*",
183
183
  "@oh-my-opencode/ast-grep-mcp": "workspace:*",
@@ -219,6 +219,7 @@
219
219
  "@types/js-yaml": "^4.0.9",
220
220
  "@types/picomatch": "^4.0.3",
221
221
  "@typescript/native-preview": "7.0.0-dev.20260707.2",
222
+ "@typescript/typescript6": "6.0.2",
222
223
  "@xterm/addon-unicode11": "^0.9.0",
223
224
  "@xterm/xterm": "^6.0.0",
224
225
  "bun-types": "1.4.2",
@@ -235,18 +236,18 @@
235
236
  "typescript": "^7.0.2"
236
237
  },
237
238
  "optionalDependencies": {
238
- "oh-my-opencode-darwin-arm64": "5.1.29",
239
- "oh-my-opencode-darwin-x64": "5.1.29",
240
- "oh-my-opencode-darwin-x64-baseline": "5.1.29",
241
- "oh-my-opencode-linux-arm64": "5.1.29",
242
- "oh-my-opencode-linux-arm64-musl": "5.1.29",
243
- "oh-my-opencode-linux-x64": "5.1.29",
244
- "oh-my-opencode-linux-x64-baseline": "5.1.29",
245
- "oh-my-opencode-linux-x64-musl": "5.1.29",
246
- "oh-my-opencode-linux-x64-musl-baseline": "5.1.29",
247
- "oh-my-opencode-windows-arm64": "5.1.29",
248
- "oh-my-opencode-windows-x64": "5.1.29",
249
- "oh-my-opencode-windows-x64-baseline": "5.1.29"
239
+ "oh-my-opencode-darwin-arm64": "5.1.32",
240
+ "oh-my-opencode-darwin-x64": "5.1.32",
241
+ "oh-my-opencode-darwin-x64-baseline": "5.1.32",
242
+ "oh-my-opencode-linux-arm64": "5.1.32",
243
+ "oh-my-opencode-linux-arm64-musl": "5.1.32",
244
+ "oh-my-opencode-linux-x64": "5.1.32",
245
+ "oh-my-opencode-linux-x64-baseline": "5.1.32",
246
+ "oh-my-opencode-linux-x64-musl": "5.1.32",
247
+ "oh-my-opencode-linux-x64-musl-baseline": "5.1.32",
248
+ "oh-my-opencode-windows-arm64": "5.1.32",
249
+ "oh-my-opencode-windows-x64": "5.1.32",
250
+ "oh-my-opencode-windows-x64-baseline": "5.1.32"
250
251
  },
251
252
  "overrides": {
252
253
  "hono": "^4.13.8",
@@ -390,7 +390,7 @@ function isKnownNonGitBashLauncher(path) {
390
390
  }
391
391
  function whereCommand(command) {
392
392
  try {
393
- return execFileSync("where", [command], { encoding: "utf8" }).split(/\r?\n/).map((line) => line.trim()).filter((line) => line.length > 0);
393
+ return execFileSync("where", [command], { encoding: "utf8", windowsHide: true }).split(/\r?\n/).map((line) => line.trim()).filter((line) => line.length > 0);
394
394
  } catch (error) {
395
395
  if (error instanceof Error)
396
396
  return [];
@@ -378,4 +378,94 @@ describe("LspClient diagnostics freshness", () => {
378
378
  expect(second.items).toEqual([diagnostic("cached-full")]);
379
379
  });
380
380
 
381
+ // #9476: the server delays whichever message must come second, so the arrival order at the client
382
+ // is fixed by the fake server instead of scheduler luck. The controlled clock keeps the freshness
383
+ // window from firing: only the matching push publish may resolve the call.
384
+ it("#given the unsupported-pull error response arrives before the matching push publish #when diagnostics run #then the client resolves to that publish", async () => {
385
+ const clock = new ControlledClock();
386
+ const context = await harness.makeClient(
387
+ {
388
+ capabilities: { diagnosticProvider: { interFileDependencies: false, workspaceDiagnostics: false } },
389
+ publishDiagnostics: [
390
+ {
391
+ trigger: "diagnosticRequest",
392
+ version: 1,
393
+ delayMs: 150,
394
+ diagnostics: [diagnostic("error-first")],
395
+ awaitClientDelivery: true,
396
+ },
397
+ ],
398
+ diagnosticResponses: [{ error: { code: -32601, message: "Method not found" } }],
399
+ },
400
+ { diagnosticsFreshnessTimeoutMs: 500, versionlessPublishQuiescenceMs: 5, timerProvider: clock },
401
+ );
402
+
403
+ const result = await context.client.diagnostics(context.source);
404
+
405
+ expect(result.items).toEqual([diagnostic("error-first")]);
406
+ expect(result.transientError).toBeUndefined();
407
+ });
408
+
409
+ it("#given the matching push publish arrives before the unsupported-pull error response #when diagnostics run #then the client resolves to that publish", async () => {
410
+ const clock = new ControlledClock();
411
+ const context = await harness.makeClient(
412
+ {
413
+ capabilities: { diagnosticProvider: { interFileDependencies: false, workspaceDiagnostics: false } },
414
+ publishDiagnostics: [
415
+ {
416
+ trigger: "diagnosticRequest",
417
+ version: 1,
418
+ diagnostics: [diagnostic("publish-first")],
419
+ awaitClientDelivery: true,
420
+ },
421
+ ],
422
+ diagnosticResponses: [{ delayMs: 150, error: { code: -32601, message: "Method not found" } }],
423
+ },
424
+ { diagnosticsFreshnessTimeoutMs: 500, versionlessPublishQuiescenceMs: 5, timerProvider: clock },
425
+ );
426
+
427
+ const result = await context.client.diagnostics(context.source);
428
+
429
+ expect(result.items).toEqual([diagnostic("publish-first")]);
430
+ expect(result.transientError).toBeUndefined();
431
+ });
432
+
433
+ it("#given the matching push publish arrived while the pull was in flight and the freshness window elapsed before the unsupported-pull error response #when diagnostics run #then the client resolves to that publish instead of clean", async () => {
434
+ const clock = new ControlledClock();
435
+ let skewMs = 0;
436
+ const skewedClock = {
437
+ now: () => clock.now() + skewMs,
438
+ setTimeout: clock.setTimeout,
439
+ clearTimeout: clock.clearTimeout,
440
+ };
441
+ const context = await harness.makeClient(
442
+ {
443
+ capabilities: { diagnosticProvider: { interFileDependencies: false, workspaceDiagnostics: false } },
444
+ publishDiagnostics: [
445
+ {
446
+ trigger: "diagnosticRequest",
447
+ version: 1,
448
+ diagnostics: [diagnostic("publish-before-deadline")],
449
+ awaitClientDelivery: true,
450
+ },
451
+ ],
452
+ diagnosticResponses: [{ delayMs: 150, error: { code: -32601, message: "Method not found" } }],
453
+ },
454
+ { diagnosticsFreshnessTimeoutMs: 500, versionlessPublishQuiescenceMs: 5, timerProvider: skewedClock },
455
+ );
456
+
457
+ const pending = context.client.diagnostics(context.source);
458
+ await waitForEventCountBySubscription(
459
+ context.events,
460
+ (event) => event.type === "clientResponse" && event.method === "workspace/configuration",
461
+ 1,
462
+ );
463
+ // The publish is recorded; the freshness window now elapses before the error response lands.
464
+ skewMs = 500;
465
+ const result = await pending;
466
+
467
+ expect(result.items).toEqual([diagnostic("publish-before-deadline")]);
468
+ expect(result.transientError).toBeUndefined();
469
+ });
470
+
381
471
  });
@@ -253,7 +253,9 @@ export class LspClient extends LspClientConnection {
253
253
  } catch (error) {
254
254
  if (this.isUnsupportedDiagnosticPullError(error)) {
255
255
  this.setDiagnosticPullSupported(false);
256
- pushFallbackOnly = true;
256
+ // A publish may have landed while the pull was in flight. Re-capture the
257
+ // snapshot and re-resolve push state instead of deciding on the stale ones.
258
+ continue;
257
259
  } else if (error instanceof LspRequestTimeoutError) {
258
260
  pushFallbackOnly = true;
259
261
  } else {
@@ -1,4 +1,4 @@
1
- import { mkdtempSync, readFileSync, rmSync, watch, writeFileSync } from "node:fs";
1
+ import { mkdtempSync, readFileSync, realpathSync, rmSync, watch, writeFileSync } from "node:fs";
2
2
  import { tmpdir } from "node:os";
3
3
  import { dirname, join } from "node:path";
4
4
  import { fileURLToPath, pathToFileURL } from "node:url";
@@ -71,7 +71,10 @@ export function createWorkspaceEditTestHarness() {
71
71
  }
72
72
 
73
73
  function createFixture(scenario: Record<string, unknown>, tempDirectories: string[]) {
74
- const workspace = mkdtempSync(join(tmpdir(), "lsp-apply-edit-"));
74
+ // The fixture server echoes URIs built from the canonical temp path, so the client root must be
75
+ // canonical too. On macOS tmpdir() is a /var -> /private/var symlink; without realpath the
76
+ // publishes target a document the client never opened (#9476).
77
+ const workspace = mkdtempSync(join(realpathSync(tmpdir()), "lsp-apply-edit-"));
75
78
  tempDirectories.push(workspace);
76
79
  const source = join(workspace, "source.ts");
77
80
  const destination = join(workspace, "destination.ts");
@@ -3579,7 +3579,7 @@ class LspClient extends LspClientConnection {
3579
3579
  } catch (error) {
3580
3580
  if (this.isUnsupportedDiagnosticPullError(error)) {
3581
3581
  this.setDiagnosticPullSupported(false);
3582
- pushFallbackOnly = true;
3582
+ continue;
3583
3583
  } else if (error instanceof LspRequestTimeoutError) {
3584
3584
  pushFallbackOnly = true;
3585
3585
  } else {
@@ -3815,7 +3815,7 @@ class LspClient extends LspClientConnection {
3815
3815
  } catch (error) {
3816
3816
  if (this.isUnsupportedDiagnosticPullError(error)) {
3817
3817
  this.setDiagnosticPullSupported(false);
3818
- pushFallbackOnly = true;
3818
+ continue;
3819
3819
  } else if (error instanceof LspRequestTimeoutError) {
3820
3820
  pushFallbackOnly = true;
3821
3821
  } else {
@@ -2650,7 +2650,7 @@ class LspClient extends LspClientConnection {
2650
2650
  } catch (error) {
2651
2651
  if (this.isUnsupportedDiagnosticPullError(error)) {
2652
2652
  this.setDiagnosticPullSupported(false);
2653
- pushFallbackOnly = true;
2653
+ continue;
2654
2654
  } else if (error instanceof LspRequestTimeoutError) {
2655
2655
  pushFallbackOnly = true;
2656
2656
  } else {
@@ -2655,7 +2655,7 @@ class LspClient extends LspClientConnection {
2655
2655
  } catch (error) {
2656
2656
  if (this.isUnsupportedDiagnosticPullError(error)) {
2657
2657
  this.setDiagnosticPullSupported(false);
2658
- pushFallbackOnly = true;
2658
+ continue;
2659
2659
  } else if (error instanceof LspRequestTimeoutError) {
2660
2660
  pushFallbackOnly = true;
2661
2661
  } else {
@@ -2650,7 +2650,7 @@ class LspClient extends LspClientConnection {
2650
2650
  } catch (error) {
2651
2651
  if (this.isUnsupportedDiagnosticPullError(error)) {
2652
2652
  this.setDiagnosticPullSupported(false);
2653
- pushFallbackOnly = true;
2653
+ continue;
2654
2654
  } else if (error instanceof LspRequestTimeoutError) {
2655
2655
  pushFallbackOnly = true;
2656
2656
  } else {
@@ -3144,7 +3144,7 @@ class LspClient extends LspClientConnection {
3144
3144
  } catch (error) {
3145
3145
  if (this.isUnsupportedDiagnosticPullError(error)) {
3146
3146
  this.setDiagnosticPullSupported(false);
3147
- pushFallbackOnly = true;
3147
+ continue;
3148
3148
  } else if (error instanceof LspRequestTimeoutError) {
3149
3149
  pushFallbackOnly = true;
3150
3150
  } else {
@@ -2832,7 +2832,7 @@ class LspClient extends LspClientConnection {
2832
2832
  } catch (error) {
2833
2833
  if (this.isUnsupportedDiagnosticPullError(error)) {
2834
2834
  this.setDiagnosticPullSupported(false);
2835
- pushFallbackOnly = true;
2835
+ continue;
2836
2836
  } else if (error instanceof LspRequestTimeoutError) {
2837
2837
  pushFallbackOnly = true;
2838
2838
  } else {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "omo",
3
- "version": "5.1.29",
3
+ "version": "5.1.32",
4
4
  "description": "One Codex plugin namespace for Yeongyu's local Codex components.",
5
5
  "author": {
6
6
  "name": "Yeongyu Kim",
@@ -846,7 +846,8 @@ function defaultVersionProbe(binaryPath) {
846
846
  return String(execFileSync(binaryPath, ["--version"], {
847
847
  encoding: "utf8",
848
848
  stdio: ["ignore", "pipe", "ignore"],
849
- timeout: SG_VERSION_PROBE_TIMEOUT_MS
849
+ timeout: SG_VERSION_PROBE_TIMEOUT_MS,
850
+ windowsHide: true
850
851
  }));
851
852
  }
852
853
  function probePasses(binaryPath, deps) {
@@ -7157,7 +7158,8 @@ var OmoMemoryNudgeSchema = object({
7157
7158
  }).strict();
7158
7159
  var OmoMemoryFactsSchema = object({
7159
7160
  enabled: boolean2().default(true),
7160
- debounce_settles: number2().int().min(1).default(4)
7161
+ debounce_settles: number2().int().min(1).default(4),
7162
+ model: string2().min(1).optional()
7161
7163
  }).strict();
7162
7164
  var OmoMemoryDreamSchema = object({
7163
7165
  enabled: boolean2().default(true),
@@ -7219,7 +7221,8 @@ var OmoMemoryNudgeLayerSchema = object({
7219
7221
  }).strict();
7220
7222
  var OmoMemoryFactsLayerSchema = object({
7221
7223
  enabled: boolean2().optional(),
7222
- debounce_settles: number2().int().min(1).optional()
7224
+ debounce_settles: number2().int().min(1).optional(),
7225
+ model: string2().min(1).optional()
7223
7226
  }).strict();
7224
7227
  var OmoMemoryDreamLayerSchema = object({
7225
7228
  enabled: boolean2().optional(),
@@ -12164,7 +12167,7 @@ function isKnownNonGitBashLauncher(path) {
12164
12167
  }
12165
12168
  function whereCommand(command) {
12166
12169
  try {
12167
- return execFileSync2("where", [command], { encoding: "utf8" }).split(/\r?\n/).map((line) => line.trim()).filter((line) => line.length > 0);
12170
+ return execFileSync2("where", [command], { encoding: "utf8", windowsHide: true }).split(/\r?\n/).map((line) => line.trim()).filter((line) => line.length > 0);
12168
12171
  } catch (error) {
12169
12172
  if (error instanceof Error)
12170
12173
  return [];
@@ -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.1.29) Checking Bootstrap Provisioning"
11
+ "statusMessage": "(OmO 5.1.32) Checking Bootstrap Provisioning"
12
12
  }
13
13
  ]
14
14
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sisyphuslabs/codex-bootstrap",
3
- "version": "5.1.29",
3
+ "version": "5.1.32",
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.1.29) Checking Comments"
11
+ "statusMessage": "(OmO 5.1.32) 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.1.29",
3
+ "version": "5.1.32",
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.1.29) Recommending Git Bash MCP"
11
+ "statusMessage": "(OmO 5.1.32) 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.1.29) Resetting Git Bash MCP Reminder"
23
+ "statusMessage": "(OmO 5.1.32) 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.1.29",
3
+ "version": "5.1.32",
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.1.29) Verifying LazyCodex Executor Evidence"
11
+ "statusMessage": "(OmO 5.1.32) 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.1.29",
3
+ "version": "5.1.32",
4
4
  "description": "Codex SubagentStop evidence verifier for LazyCodex executor completions.",
5
5
  "type": "module",
6
6
  "packageManager": "npm@11.12.1",
@@ -37,11 +37,12 @@ For `code-yeongyu/lazycodex`, create an issue (never a PR) that includes:
37
37
 
38
38
  ## Required Workflow
39
39
 
40
- 1. Read the user's bug report and identify the affected surface.
40
+ 1. Read the user's bug report and identify the affected surface. Before commands, apply the bundled ultrawork directive’s Task resources and todo rules; read those sections if absent from context.
41
41
  2. Invoke `$omo:debugging` for the investigation. If only unqualified skill names are exposed, invoke `$debugging` and state that it is the OMO debugging skill.
42
42
  3. Materialize the latest sources under `LAZYCODEX_SOURCE_ROOT="${LAZYCODEX_SOURCE_ROOT:-${TMPDIR:-/tmp}/lazycodex-sources}"`, then decide the target repository. Sync both checkouts on every run and compare them before choosing. Validate cached checkouts before reuse so an incomplete `.git` directory cannot route the fix to the wrong repo:
43
43
 
44
44
  ```bash
45
+ # The default checkout cache is per-task under TMPDIR=$RUN_TMP.
45
46
  LAZYCODEX_SOURCE_ROOT="${LAZYCODEX_SOURCE_ROOT:-${TMPDIR:-/tmp}/lazycodex-sources}"
46
47
  mkdir -p "$LAZYCODEX_SOURCE_ROOT"
47
48
 
@@ -86,11 +87,11 @@ sync_latest_source() {
86
87
  sync_latest_source code-yeongyu/lazycodex "$LAZYCODEX_SOURCE_ROOT/lazycodex-source"
87
88
  sync_latest_source openai/codex "$LAZYCODEX_SOURCE_ROOT/chatgpt-subscription-source"
88
89
  ```
89
- 4. Create a fresh temporary clone and branch under `${TMPDIR:-/tmp}`. Do not modify the user's current repository for the target fix unless the current repository is itself the requested target and the user explicitly asked for local edits.
90
+ 4. Create a fresh temporary clone and branch under `${TMPDIR:-/tmp}`. Do not modify the user's current repository for the target fix unless the current repository is itself the requested target and the user explicitly asked for local edits. Apply those resource rules at clone/worktree creation.
90
91
 
91
92
  ```bash
92
93
  TARGET_REPO="code-yeongyu/lazycodex" # or openai/codex
93
- WORK_ROOT="$(mktemp -d "${TMPDIR:-/tmp}/lazycodex-fix-XXXXXX")"
94
+ WORK_ROOT="${RUN_TMP:?apply ultrawork Task resources first}"
94
95
  gh repo clone "$TARGET_REPO" "$WORK_ROOT/repo" -- --depth=1
95
96
  cd "$WORK_ROOT/repo"
96
97
  BASE_BRANCH="$(git remote show origin | sed -n '/HEAD branch/s/.*: //p')"
@@ -152,13 +153,15 @@ git push -u fork "$BRANCH_NAME"
152
153
  gh pr create --repo openai/codex --base "$BASE_BRANCH" --head "$GH_USER:$BRANCH_NAME" --title "<short fix title>" "${LABEL_ARGS[@]}" --body-file "$PR_BODY"
153
154
  ```
154
155
 
155
- 13. Clean up:
156
+ 13. Finish cleanup per Task resources. Run this only when that rule permits removing the worktree and run root; otherwise retain them and report the outstanding cleanup todo:
156
157
 
157
158
  ```bash
158
159
  cd /
159
160
  git -C "$WORK_ROOT/repo" worktree remove "$WORK_ROOT/worktree"
161
+ unset TMPDIR NODE_COMPILE_CACHE BUN_RUNTIME_TRANSPILER_CACHE_PATH
160
162
  find "$WORK_ROOT" -mindepth 1 -maxdepth 1 -exec rm -r -- {} +
161
163
  rmdir "$WORK_ROOT"
164
+ test ! -e "$WORK_ROOT" && printf 'cleanup: worktree and caches REMOVED\n'
162
165
  ```
163
166
 
164
167
  Return the PR or issue URL, the reproduction command, the verification command, and the cleanup receipt.