oh-my-opencode 5.1.3 → 5.1.4

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 (73) hide show
  1. package/dist/cli/index.js +149 -19
  2. package/dist/cli-node/index.js +149 -19
  3. package/dist/index.js +148 -18
  4. package/dist/skills/browser/runtime/omowright/manifest.json +1 -1
  5. package/dist/tui.js +148 -18
  6. package/package.json +14 -14
  7. package/packages/lsp-core/src/lsp/outside-context-workspace.ts +1 -1
  8. package/packages/lsp-core/src/missing-dependency-result.test.ts +32 -2
  9. package/packages/lsp-core/src/missing-dependency-result.ts +3 -0
  10. package/packages/lsp-core/src/post-edit/file-location.ts +50 -0
  11. package/packages/lsp-core/src/post-edit/index.ts +2 -0
  12. package/packages/lsp-core/src/post-edit/not-installed-guidance.ts +36 -0
  13. package/packages/lsp-core/src/post-edit/not-installed.test.ts +199 -0
  14. package/packages/lsp-core/src/post-edit/orchestration.ts +26 -5
  15. package/packages/lsp-daemon/dist/cli.js +2 -1
  16. package/packages/lsp-daemon/dist/client.js +2 -1
  17. package/packages/lsp-daemon/dist/index.js +2 -1
  18. package/packages/lsp-tools-mcp/dist/cli.js +2 -1
  19. package/packages/lsp-tools-mcp/dist/mcp.js +2 -1
  20. package/packages/lsp-tools-mcp/dist/tools.js +2 -1
  21. package/packages/omo-codex/plugin/.codex-plugin/plugin.json +1 -1
  22. package/packages/omo-codex/plugin/components/bootstrap/hooks/hooks.json +1 -1
  23. package/packages/omo-codex/plugin/components/bootstrap/package.json +1 -1
  24. package/packages/omo-codex/plugin/components/comment-checker/hooks/hooks.json +1 -1
  25. package/packages/omo-codex/plugin/components/comment-checker/package.json +1 -1
  26. package/packages/omo-codex/plugin/components/git-bash/hooks/hooks.json +2 -2
  27. package/packages/omo-codex/plugin/components/git-bash/package.json +1 -1
  28. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/hooks/hooks.json +1 -1
  29. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/package.json +1 -1
  30. package/packages/omo-codex/plugin/components/lsp/dist/.omo-runtime-manifest.json +4 -4
  31. package/packages/omo-codex/plugin/components/lsp/dist/cli.js +141 -107
  32. package/packages/omo-codex/plugin/components/lsp/dist/lsp-session-state.js +2 -2
  33. package/packages/omo-codex/plugin/components/lsp/hooks/hooks.json +2 -2
  34. package/packages/omo-codex/plugin/components/lsp/package.json +1 -1
  35. package/packages/omo-codex/plugin/components/lsp/src/lsp-session-state.ts +2 -2
  36. package/packages/omo-codex/plugin/components/rules/hooks/hooks.json +4 -4
  37. package/packages/omo-codex/plugin/components/rules/package.json +1 -1
  38. package/packages/omo-codex/plugin/components/teammode/hooks/hooks.json +1 -1
  39. package/packages/omo-codex/plugin/components/teammode/package.json +1 -1
  40. package/packages/omo-codex/plugin/components/telemetry/hooks/hooks.json +1 -1
  41. package/packages/omo-codex/plugin/components/telemetry/package.json +1 -1
  42. package/packages/omo-codex/plugin/components/ultrawork/hooks/hooks.json +1 -1
  43. package/packages/omo-codex/plugin/components/ultrawork/package.json +1 -1
  44. package/packages/omo-codex/plugin/components/ulw-execute-continuation/hooks/hooks.json +1 -1
  45. package/packages/omo-codex/plugin/components/ulw-execute-continuation/package.json +1 -1
  46. package/packages/omo-codex/plugin/components/ulw-loop/hooks/hooks.json +5 -5
  47. package/packages/omo-codex/plugin/components/ulw-loop/package.json +1 -1
  48. package/packages/omo-codex/plugin/hooks/post-compact-resetting-git-bash-mcp-reminder.json +1 -1
  49. package/packages/omo-codex/plugin/hooks/post-compact-resetting-lsp-diagnostics-cache.json +1 -1
  50. package/packages/omo-codex/plugin/hooks/post-compact-resetting-project-rule-cache.json +1 -1
  51. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-comments.json +1 -1
  52. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-lsp-diagnostics.json +1 -1
  53. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-thread-title-hygiene.json +1 -1
  54. package/packages/omo-codex/plugin/hooks/post-tool-use-matching-project-rules.json +1 -1
  55. package/packages/omo-codex/plugin/hooks/post-tool-use-recording-spawn-admission.json +1 -1
  56. package/packages/omo-codex/plugin/hooks/pre-tool-use-enforcing-unlimited-goal-budget.json +1 -1
  57. package/packages/omo-codex/plugin/hooks/pre-tool-use-guarding-ulw-loop-spawns.json +1 -1
  58. package/packages/omo-codex/plugin/hooks/pre-tool-use-recommending-git-bash-mcp.json +1 -1
  59. package/packages/omo-codex/plugin/hooks/session-start-checking-auto-update.json +1 -1
  60. package/packages/omo-codex/plugin/hooks/session-start-checking-bootstrap-provisioning.json +1 -1
  61. package/packages/omo-codex/plugin/hooks/session-start-loading-project-rules.json +1 -1
  62. package/packages/omo-codex/plugin/hooks/session-start-recording-session-telemetry.json +1 -1
  63. package/packages/omo-codex/plugin/hooks/stop-checking-ulw-execute-continuation.json +1 -1
  64. package/packages/omo-codex/plugin/hooks/stop-checking-ulw-loop-resume.json +1 -1
  65. package/packages/omo-codex/plugin/hooks/subagent-stop-verifying-lazycodex-executor-evidence.json +1 -1
  66. package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ultrawork-trigger.json +1 -1
  67. package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ulw-loop-steering.json +1 -1
  68. package/packages/omo-codex/plugin/hooks/user-prompt-submit-loading-project-rules.json +1 -1
  69. package/packages/omo-codex/plugin/package-lock.json +12 -12
  70. package/packages/omo-codex/plugin/package.json +1 -1
  71. package/packages/omo-codex/plugin/skills/browser/runtime/omowright/manifest.json +1 -1
  72. package/packages/omo-codex/scripts/install-dist/install-local.mjs +2 -2
  73. package/packages/shared-skills/skills/browser/runtime/omowright/manifest.json +1 -1
package/dist/index.js CHANGED
@@ -20292,6 +20292,8 @@ var CATEGORY_MODEL_REQUIREMENTS = {
20292
20292
  },
20293
20293
  "deep-low": {
20294
20294
  fallbackChain: [
20295
+ { providers: ["openai", "chatgpt-subscription"], model: "gpt-6.1-sol", variant: "medium" },
20296
+ { providers: ["openai", "chatgpt-subscription"], model: "gpt-6.1-sol-fast", variant: "medium" },
20295
20297
  {
20296
20298
  providers: ["openai", "chatgpt-subscription", "github-copilot", "opencode"],
20297
20299
  model: "gpt-5.6-sol",
@@ -20344,7 +20346,9 @@ var CATEGORY_MODEL_REQUIREMENTS = {
20344
20346
  providers: ["anthropic", "anthropic-api", "github-copilot"],
20345
20347
  model: "claude-haiku-4-5",
20346
20348
  variant: "off"
20347
- }
20349
+ },
20350
+ { providers: ["zai-coding-plan"], model: "glm-5.3-flash", variant: "low" },
20351
+ { providers: ["xiaomi"], model: "mimo-v2.6-flash", variant: "low" }
20348
20352
  ]
20349
20353
  },
20350
20354
  "unspecified-low": {
@@ -20543,7 +20547,7 @@ var PATTERN_ALIAS_RULES = [
20543
20547
  description: "Normalizes OpenCode's OpenAI GPT fast service-tier IDs to canonical snapshot IDs.",
20544
20548
  providerIDs: ["openai"],
20545
20549
  allowedSubproviderHosts: ["vercel"],
20546
- match: (normalizedModelID) => /^(?:gpt-5\.6-(?:sol|terra|luna)|gpt-6-(?:astra|sol|luna))-fast$/.test(normalizedModelID),
20550
+ match: (normalizedModelID) => /^(?:gpt-5\.6-(?:sol|terra|luna)|gpt-6-(?:astra|sol|luna)|gpt-6\.1-sol)-fast$/.test(normalizedModelID),
20547
20551
  canonicalize: (normalizedModelID) => normalizedModelID.slice(0, -"-fast".length)
20548
20552
  },
20549
20553
  {
@@ -20757,6 +20761,14 @@ var HEURISTIC_MODEL_FAMILY_REGISTRY = [
20757
20761
  reasoningEffortAliases: { none: "low", minimal: "low" },
20758
20762
  supportsTemperature: false
20759
20763
  },
20764
+ {
20765
+ family: "gpt-6.1-sol",
20766
+ pattern: /gpt-6-1-sol/,
20767
+ variants: ["low", "medium", "high", "xhigh", "max"],
20768
+ reasoningEfforts: ["low", "medium", "high", "xhigh", "max"],
20769
+ reasoningEffortAliases: { none: "low", minimal: "low" },
20770
+ supportsTemperature: false
20771
+ },
20760
20772
  {
20761
20773
  family: "gpt-6",
20762
20774
  includes: ["gpt-6"],
@@ -21978,6 +21990,36 @@ var SUPPLEMENTAL_MODEL_CAPABILITIES = {
21978
21990
  output: 128000
21979
21991
  }
21980
21992
  },
21993
+ "gpt-6.1-sol": {
21994
+ id: "gpt-6.1-sol",
21995
+ family: "gpt",
21996
+ reasoning: true,
21997
+ temperature: false,
21998
+ toolCall: true,
21999
+ modalities: {
22000
+ input: ["text", "image"],
22001
+ output: ["text"]
22002
+ },
22003
+ limit: {
22004
+ context: 400000,
22005
+ output: 128000
22006
+ }
22007
+ },
22008
+ "gpt-6.1-sol-fast": {
22009
+ id: "gpt-6.1-sol-fast",
22010
+ family: "gpt",
22011
+ reasoning: true,
22012
+ temperature: false,
22013
+ toolCall: true,
22014
+ modalities: {
22015
+ input: ["text", "image"],
22016
+ output: ["text"]
22017
+ },
22018
+ limit: {
22019
+ context: 400000,
22020
+ output: 128000
22021
+ }
22022
+ },
21981
22023
  "gpt-6-luna": {
21982
22024
  id: "gpt-6-luna",
21983
22025
  family: "gpt-nano",
@@ -27477,7 +27519,7 @@ You are working on tasks that don't fit specific categories but require substant
27477
27519
  var UNSPECIFIED_HIGH_CATEGORY_CALLER_GUIDANCE = `<Selection_Gate>Use only when no specialist category fits and substantial effort spans systems/modules with broad impact. Use unspecified-low for contained moderate work.</Selection_Gate>`;
27478
27520
  var DEEP_LOW_CATEGORY_CALLER_GUIDANCE = `<Selection_Gate>Route here when one subsystem plus its callers holds the mechanism and the evidence, once read, leaves one right answer. Wide but mechanical work belongs here or in a quick batch. When unsure, choose deep-low: a misrouted child returns \`ESCALATE: deep-high\` after one cheap attempt; re-spawn the same brief as deep-high with its findings.</Selection_Gate>`;
27479
27521
  var DEEP_HIGH_CATEGORY_CALLER_GUIDANCE = `<Selection_Gate>Route here only when you can name the decision evidence cannot settle: a trade-off with no single right answer, a contract change crossing a package or process boundary, a mechanism with no in-repo pattern to copy, or correctness argued from invariants rather than observed in a test. Wide scope with easy decisions is deep-low or unspecified-high; reasoning as the deliverable is ultrabrain.</Selection_Gate>`;
27480
- var DEEP_LOW_GATE_MODELS = ["gpt-5.6-sol-fast", "gpt-5.6-sol"];
27522
+ var DEEP_LOW_GATE_MODELS = ["gpt-6.1-sol", "gpt-6.1-sol-fast", "gpt-5.6-sol-fast", "gpt-5.6-sol"];
27481
27523
  var DEEP_HIGH_GATE_MODEL = "gpt-6-astra";
27482
27524
  var OPENAI_CATEGORIES = [
27483
27525
  {
@@ -27489,7 +27531,7 @@ var OPENAI_CATEGORIES = [
27489
27531
  },
27490
27532
  {
27491
27533
  name: "deep-low",
27492
- config: { model: "openai/gpt-5.6-sol", variant: "medium" },
27534
+ config: { model: "openai/gpt-6.1-sol", variant: "medium" },
27493
27535
  description: "Default deep lane: one goal, one deliverable, decisions the child can settle from what it reads. **3D graphics, computer/browser use, CAPTCHA, multimodal, backend, logic, and algorithm work is routed here.** Multiple goals fan out as parallel calls.",
27494
27536
  callerGuidance: DEEP_LOW_CATEGORY_CALLER_GUIDANCE,
27495
27537
  promptAppend: DEEP_LOW_CATEGORY_PROMPT_APPEND,
@@ -83222,6 +83264,94 @@ var model_capabilities_generated_default = {
83222
83264
  context: 1e6,
83223
83265
  output: 128000
83224
83266
  }
83267
+ },
83268
+ "glm-5.3-flash": {
83269
+ id: "glm-5.3-flash",
83270
+ family: "glm-flash",
83271
+ reasoning: true,
83272
+ temperature: true,
83273
+ toolCall: true,
83274
+ modalities: {
83275
+ input: [
83276
+ "text",
83277
+ "image",
83278
+ "video"
83279
+ ],
83280
+ output: [
83281
+ "text"
83282
+ ]
83283
+ },
83284
+ limit: {
83285
+ context: 1048576,
83286
+ output: 1048576
83287
+ }
83288
+ },
83289
+ "zai/glm-5.3-flash": {
83290
+ id: "zai/glm-5.3-flash",
83291
+ family: "glm-flash",
83292
+ reasoning: true,
83293
+ temperature: true,
83294
+ toolCall: true,
83295
+ modalities: {
83296
+ input: [
83297
+ "text",
83298
+ "image",
83299
+ "video",
83300
+ "pdf"
83301
+ ],
83302
+ output: [
83303
+ "text"
83304
+ ]
83305
+ },
83306
+ limit: {
83307
+ context: 1e6,
83308
+ output: 131072
83309
+ }
83310
+ },
83311
+ "mimo-v2.6-flash": {
83312
+ id: "mimo-v2.6-flash",
83313
+ family: "mimo",
83314
+ reasoning: true,
83315
+ temperature: true,
83316
+ toolCall: true,
83317
+ modalities: {
83318
+ input: [
83319
+ "text",
83320
+ "image",
83321
+ "audio",
83322
+ "video"
83323
+ ],
83324
+ output: [
83325
+ "text"
83326
+ ]
83327
+ },
83328
+ limit: {
83329
+ context: 1048576,
83330
+ output: 131072
83331
+ }
83332
+ },
83333
+ "xiaomi/mimo-v2.6-flash": {
83334
+ id: "xiaomi/mimo-v2.6-flash",
83335
+ family: "mimo",
83336
+ reasoning: true,
83337
+ temperature: true,
83338
+ toolCall: true,
83339
+ modalities: {
83340
+ input: [
83341
+ "text",
83342
+ "image",
83343
+ "audio",
83344
+ "video"
83345
+ ],
83346
+ output: [
83347
+ "text"
83348
+ ]
83349
+ },
83350
+ limit: {
83351
+ context: 1048576,
83352
+ input: 1048576,
83353
+ output: 131072
83354
+ }
83225
83355
  }
83226
83356
  }
83227
83357
  };
@@ -98202,7 +98332,7 @@ function getCachedVersion(options = {}) {
98202
98332
  // package.json
98203
98333
  var package_default = {
98204
98334
  name: "oh-my-opencode",
98205
- version: "5.1.3",
98335
+ version: "5.1.4",
98206
98336
  description: "The Best AI Agent Harness - Batteries-Included OpenCode Plugin with Multi-Model Orchestration, Parallel Background Agents, and Crafted LSP/AST Tools",
98207
98337
  main: "./dist/index.js",
98208
98338
  types: "dist/index.d.ts",
@@ -98379,7 +98509,7 @@ var package_default = {
98379
98509
  },
98380
98510
  devDependencies: {
98381
98511
  "@clack/prompts": "^1.8.1",
98382
- "@code-yeongyu/senpi": "2026.9.29-4",
98512
+ "@code-yeongyu/senpi": "2026.9.29-5",
98383
98513
  "@modelcontextprotocol/sdk": "^1.30.0",
98384
98514
  "@oh-my-opencode/agents-md-core": "workspace:*",
98385
98515
  "@oh-my-opencode/ast-grep-mcp": "workspace:*",
@@ -98437,18 +98567,18 @@ var package_default = {
98437
98567
  typescript: "^7.0.2"
98438
98568
  },
98439
98569
  optionalDependencies: {
98440
- "oh-my-opencode-darwin-arm64": "5.1.3",
98441
- "oh-my-opencode-darwin-x64": "5.1.3",
98442
- "oh-my-opencode-darwin-x64-baseline": "5.1.3",
98443
- "oh-my-opencode-linux-arm64": "5.1.3",
98444
- "oh-my-opencode-linux-arm64-musl": "5.1.3",
98445
- "oh-my-opencode-linux-x64": "5.1.3",
98446
- "oh-my-opencode-linux-x64-baseline": "5.1.3",
98447
- "oh-my-opencode-linux-x64-musl": "5.1.3",
98448
- "oh-my-opencode-linux-x64-musl-baseline": "5.1.3",
98449
- "oh-my-opencode-windows-arm64": "5.1.3",
98450
- "oh-my-opencode-windows-x64": "5.1.3",
98451
- "oh-my-opencode-windows-x64-baseline": "5.1.3"
98570
+ "oh-my-opencode-darwin-arm64": "5.1.4",
98571
+ "oh-my-opencode-darwin-x64": "5.1.4",
98572
+ "oh-my-opencode-darwin-x64-baseline": "5.1.4",
98573
+ "oh-my-opencode-linux-arm64": "5.1.4",
98574
+ "oh-my-opencode-linux-arm64-musl": "5.1.4",
98575
+ "oh-my-opencode-linux-x64": "5.1.4",
98576
+ "oh-my-opencode-linux-x64-baseline": "5.1.4",
98577
+ "oh-my-opencode-linux-x64-musl": "5.1.4",
98578
+ "oh-my-opencode-linux-x64-musl-baseline": "5.1.4",
98579
+ "oh-my-opencode-windows-arm64": "5.1.4",
98580
+ "oh-my-opencode-windows-x64": "5.1.4",
98581
+ "oh-my-opencode-windows-x64-baseline": "5.1.4"
98452
98582
  },
98453
98583
  overrides: {
98454
98584
  hono: "^4.13.8",
@@ -5,5 +5,5 @@
5
5
  "index.js": "b6b064fab277031c6c51f5a58b84b31040f9960bf767bf646adc0540c1d25c1b",
6
6
  "page-bundle.js": "bfd51e8383cf47200d57387bbbed258bce5a3a3d00c38fc108034d2888e23f0c"
7
7
  },
8
- "stagedAtUtc": "2026-09-29T19:36:29.416Z"
8
+ "stagedAtUtc": "2026-09-29T22:24:49.560Z"
9
9
  }
package/dist/tui.js CHANGED
@@ -3502,6 +3502,8 @@ var init_category_model_requirements = __esm(() => {
3502
3502
  },
3503
3503
  "deep-low": {
3504
3504
  fallbackChain: [
3505
+ { providers: ["openai", "chatgpt-subscription"], model: "gpt-6.1-sol", variant: "medium" },
3506
+ { providers: ["openai", "chatgpt-subscription"], model: "gpt-6.1-sol-fast", variant: "medium" },
3505
3507
  {
3506
3508
  providers: ["openai", "chatgpt-subscription", "github-copilot", "opencode"],
3507
3509
  model: "gpt-5.6-sol",
@@ -3554,7 +3556,9 @@ var init_category_model_requirements = __esm(() => {
3554
3556
  providers: ["anthropic", "anthropic-api", "github-copilot"],
3555
3557
  model: "claude-haiku-4-5",
3556
3558
  variant: "off"
3557
- }
3559
+ },
3560
+ { providers: ["zai-coding-plan"], model: "glm-5.3-flash", variant: "low" },
3561
+ { providers: ["xiaomi"], model: "mimo-v2.6-flash", variant: "low" }
3558
3562
  ]
3559
3563
  },
3560
3564
  "unspecified-low": {
@@ -3700,7 +3704,7 @@ var init_model_capability_aliases = __esm(() => {
3700
3704
  description: "Normalizes OpenCode's OpenAI GPT fast service-tier IDs to canonical snapshot IDs.",
3701
3705
  providerIDs: ["openai"],
3702
3706
  allowedSubproviderHosts: ["vercel"],
3703
- match: (normalizedModelID) => /^(?:gpt-5\.6-(?:sol|terra|luna)|gpt-6-(?:astra|sol|luna))-fast$/.test(normalizedModelID),
3707
+ match: (normalizedModelID) => /^(?:gpt-5\.6-(?:sol|terra|luna)|gpt-6-(?:astra|sol|luna)|gpt-6\.1-sol)-fast$/.test(normalizedModelID),
3704
3708
  canonicalize: (normalizedModelID) => normalizedModelID.slice(0, -"-fast".length)
3705
3709
  },
3706
3710
  {
@@ -3836,6 +3840,14 @@ var init_model_capability_heuristics = __esm(() => {
3836
3840
  reasoningEffortAliases: { none: "low", minimal: "low" },
3837
3841
  supportsTemperature: false
3838
3842
  },
3843
+ {
3844
+ family: "gpt-6.1-sol",
3845
+ pattern: /gpt-6-1-sol/,
3846
+ variants: ["low", "medium", "high", "xhigh", "max"],
3847
+ reasoningEfforts: ["low", "medium", "high", "xhigh", "max"],
3848
+ reasoningEffortAliases: { none: "low", minimal: "low" },
3849
+ supportsTemperature: false
3850
+ },
3839
3851
  {
3840
3852
  family: "gpt-6",
3841
3853
  includes: ["gpt-6"],
@@ -4076,6 +4088,36 @@ var init_supplemental_entries = __esm(() => {
4076
4088
  output: 128000
4077
4089
  }
4078
4090
  },
4091
+ "gpt-6.1-sol": {
4092
+ id: "gpt-6.1-sol",
4093
+ family: "gpt",
4094
+ reasoning: true,
4095
+ temperature: false,
4096
+ toolCall: true,
4097
+ modalities: {
4098
+ input: ["text", "image"],
4099
+ output: ["text"]
4100
+ },
4101
+ limit: {
4102
+ context: 400000,
4103
+ output: 128000
4104
+ }
4105
+ },
4106
+ "gpt-6.1-sol-fast": {
4107
+ id: "gpt-6.1-sol-fast",
4108
+ family: "gpt",
4109
+ reasoning: true,
4110
+ temperature: false,
4111
+ toolCall: true,
4112
+ modalities: {
4113
+ input: ["text", "image"],
4114
+ output: ["text"]
4115
+ },
4116
+ limit: {
4117
+ context: 400000,
4118
+ output: 128000
4119
+ }
4120
+ },
4079
4121
  "gpt-6-luna": {
4080
4122
  id: "gpt-6-luna",
4081
4123
  family: "gpt-nano",
@@ -5257,7 +5299,7 @@ You are working on tasks that don't fit specific categories but require substant
5257
5299
  </Category_Context>`, UNSPECIFIED_HIGH_CATEGORY_CALLER_GUIDANCE = `<Selection_Gate>Use only when no specialist category fits and substantial effort spans systems/modules with broad impact. Use unspecified-low for contained moderate work.</Selection_Gate>`, DEEP_LOW_CATEGORY_CALLER_GUIDANCE = `<Selection_Gate>Route here when one subsystem plus its callers holds the mechanism and the evidence, once read, leaves one right answer. Wide but mechanical work belongs here or in a quick batch. When unsure, choose deep-low: a misrouted child returns \`ESCALATE: deep-high\` after one cheap attempt; re-spawn the same brief as deep-high with its findings.</Selection_Gate>`, DEEP_HIGH_CATEGORY_CALLER_GUIDANCE = `<Selection_Gate>Route here only when you can name the decision evidence cannot settle: a trade-off with no single right answer, a contract change crossing a package or process boundary, a mechanism with no in-repo pattern to copy, or correctness argued from invariants rather than observed in a test. Wide scope with easy decisions is deep-low or unspecified-high; reasoning as the deliverable is ultrabrain.</Selection_Gate>`, DEEP_LOW_GATE_MODELS, DEEP_HIGH_GATE_MODEL = "gpt-6-astra", OPENAI_CATEGORIES;
5258
5300
  var init_openai_categories = __esm(() => {
5259
5301
  init_types();
5260
- DEEP_LOW_GATE_MODELS = ["gpt-5.6-sol-fast", "gpt-5.6-sol"];
5302
+ DEEP_LOW_GATE_MODELS = ["gpt-6.1-sol", "gpt-6.1-sol-fast", "gpt-5.6-sol-fast", "gpt-5.6-sol"];
5261
5303
  OPENAI_CATEGORIES = [
5262
5304
  {
5263
5305
  name: "ultrabrain",
@@ -5268,7 +5310,7 @@ var init_openai_categories = __esm(() => {
5268
5310
  },
5269
5311
  {
5270
5312
  name: "deep-low",
5271
- config: { model: "openai/gpt-5.6-sol", variant: "medium" },
5313
+ config: { model: "openai/gpt-6.1-sol", variant: "medium" },
5272
5314
  description: "Default deep lane: one goal, one deliverable, decisions the child can settle from what it reads. **3D graphics, computer/browser use, CAPTCHA, multimodal, backend, logic, and algorithm work is routed here.** Multiple goals fan out as parallel calls.",
5273
5315
  callerGuidance: DEEP_LOW_CATEGORY_CALLER_GUIDANCE,
5274
5316
  promptAppend: DEEP_LOW_CATEGORY_PROMPT_APPEND,
@@ -60328,6 +60370,94 @@ var init_model_capabilities_generated = __esm(() => {
60328
60370
  context: 1e6,
60329
60371
  output: 128000
60330
60372
  }
60373
+ },
60374
+ "glm-5.3-flash": {
60375
+ id: "glm-5.3-flash",
60376
+ family: "glm-flash",
60377
+ reasoning: true,
60378
+ temperature: true,
60379
+ toolCall: true,
60380
+ modalities: {
60381
+ input: [
60382
+ "text",
60383
+ "image",
60384
+ "video"
60385
+ ],
60386
+ output: [
60387
+ "text"
60388
+ ]
60389
+ },
60390
+ limit: {
60391
+ context: 1048576,
60392
+ output: 1048576
60393
+ }
60394
+ },
60395
+ "zai/glm-5.3-flash": {
60396
+ id: "zai/glm-5.3-flash",
60397
+ family: "glm-flash",
60398
+ reasoning: true,
60399
+ temperature: true,
60400
+ toolCall: true,
60401
+ modalities: {
60402
+ input: [
60403
+ "text",
60404
+ "image",
60405
+ "video",
60406
+ "pdf"
60407
+ ],
60408
+ output: [
60409
+ "text"
60410
+ ]
60411
+ },
60412
+ limit: {
60413
+ context: 1e6,
60414
+ output: 131072
60415
+ }
60416
+ },
60417
+ "mimo-v2.6-flash": {
60418
+ id: "mimo-v2.6-flash",
60419
+ family: "mimo",
60420
+ reasoning: true,
60421
+ temperature: true,
60422
+ toolCall: true,
60423
+ modalities: {
60424
+ input: [
60425
+ "text",
60426
+ "image",
60427
+ "audio",
60428
+ "video"
60429
+ ],
60430
+ output: [
60431
+ "text"
60432
+ ]
60433
+ },
60434
+ limit: {
60435
+ context: 1048576,
60436
+ output: 131072
60437
+ }
60438
+ },
60439
+ "xiaomi/mimo-v2.6-flash": {
60440
+ id: "xiaomi/mimo-v2.6-flash",
60441
+ family: "mimo",
60442
+ reasoning: true,
60443
+ temperature: true,
60444
+ toolCall: true,
60445
+ modalities: {
60446
+ input: [
60447
+ "text",
60448
+ "image",
60449
+ "audio",
60450
+ "video"
60451
+ ],
60452
+ output: [
60453
+ "text"
60454
+ ]
60455
+ },
60456
+ limit: {
60457
+ context: 1048576,
60458
+ input: 1048576,
60459
+ output: 131072
60460
+ }
60331
60461
  }
60332
60462
  }
60333
60463
  };
@@ -74214,7 +74344,7 @@ init_shared();
74214
74344
  // package.json
74215
74345
  var package_default = {
74216
74346
  name: "oh-my-opencode",
74217
- version: "5.1.3",
74347
+ version: "5.1.4",
74218
74348
  description: "The Best AI Agent Harness - Batteries-Included OpenCode Plugin with Multi-Model Orchestration, Parallel Background Agents, and Crafted LSP/AST Tools",
74219
74349
  main: "./dist/index.js",
74220
74350
  types: "dist/index.d.ts",
@@ -74391,7 +74521,7 @@ var package_default = {
74391
74521
  },
74392
74522
  devDependencies: {
74393
74523
  "@clack/prompts": "^1.8.1",
74394
- "@code-yeongyu/senpi": "2026.9.29-4",
74524
+ "@code-yeongyu/senpi": "2026.9.29-5",
74395
74525
  "@modelcontextprotocol/sdk": "^1.30.0",
74396
74526
  "@oh-my-opencode/agents-md-core": "workspace:*",
74397
74527
  "@oh-my-opencode/ast-grep-mcp": "workspace:*",
@@ -74449,18 +74579,18 @@ var package_default = {
74449
74579
  typescript: "^7.0.2"
74450
74580
  },
74451
74581
  optionalDependencies: {
74452
- "oh-my-opencode-darwin-arm64": "5.1.3",
74453
- "oh-my-opencode-darwin-x64": "5.1.3",
74454
- "oh-my-opencode-darwin-x64-baseline": "5.1.3",
74455
- "oh-my-opencode-linux-arm64": "5.1.3",
74456
- "oh-my-opencode-linux-arm64-musl": "5.1.3",
74457
- "oh-my-opencode-linux-x64": "5.1.3",
74458
- "oh-my-opencode-linux-x64-baseline": "5.1.3",
74459
- "oh-my-opencode-linux-x64-musl": "5.1.3",
74460
- "oh-my-opencode-linux-x64-musl-baseline": "5.1.3",
74461
- "oh-my-opencode-windows-arm64": "5.1.3",
74462
- "oh-my-opencode-windows-x64": "5.1.3",
74463
- "oh-my-opencode-windows-x64-baseline": "5.1.3"
74582
+ "oh-my-opencode-darwin-arm64": "5.1.4",
74583
+ "oh-my-opencode-darwin-x64": "5.1.4",
74584
+ "oh-my-opencode-darwin-x64-baseline": "5.1.4",
74585
+ "oh-my-opencode-linux-arm64": "5.1.4",
74586
+ "oh-my-opencode-linux-arm64-musl": "5.1.4",
74587
+ "oh-my-opencode-linux-x64": "5.1.4",
74588
+ "oh-my-opencode-linux-x64-baseline": "5.1.4",
74589
+ "oh-my-opencode-linux-x64-musl": "5.1.4",
74590
+ "oh-my-opencode-linux-x64-musl-baseline": "5.1.4",
74591
+ "oh-my-opencode-windows-arm64": "5.1.4",
74592
+ "oh-my-opencode-windows-x64": "5.1.4",
74593
+ "oh-my-opencode-windows-x64-baseline": "5.1.4"
74464
74594
  },
74465
74595
  overrides: {
74466
74596
  hono: "^4.13.8",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "oh-my-opencode",
3
- "version": "5.1.3",
3
+ "version": "5.1.4",
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.9.29-4",
180
+ "@code-yeongyu/senpi": "2026.9.29-5",
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:*",
@@ -235,18 +235,18 @@
235
235
  "typescript": "^7.0.2"
236
236
  },
237
237
  "optionalDependencies": {
238
- "oh-my-opencode-darwin-arm64": "5.1.3",
239
- "oh-my-opencode-darwin-x64": "5.1.3",
240
- "oh-my-opencode-darwin-x64-baseline": "5.1.3",
241
- "oh-my-opencode-linux-arm64": "5.1.3",
242
- "oh-my-opencode-linux-arm64-musl": "5.1.3",
243
- "oh-my-opencode-linux-x64": "5.1.3",
244
- "oh-my-opencode-linux-x64-baseline": "5.1.3",
245
- "oh-my-opencode-linux-x64-musl": "5.1.3",
246
- "oh-my-opencode-linux-x64-musl-baseline": "5.1.3",
247
- "oh-my-opencode-windows-arm64": "5.1.3",
248
- "oh-my-opencode-windows-x64": "5.1.3",
249
- "oh-my-opencode-windows-x64-baseline": "5.1.3"
238
+ "oh-my-opencode-darwin-arm64": "5.1.4",
239
+ "oh-my-opencode-darwin-x64": "5.1.4",
240
+ "oh-my-opencode-darwin-x64-baseline": "5.1.4",
241
+ "oh-my-opencode-linux-arm64": "5.1.4",
242
+ "oh-my-opencode-linux-arm64-musl": "5.1.4",
243
+ "oh-my-opencode-linux-x64": "5.1.4",
244
+ "oh-my-opencode-linux-x64-baseline": "5.1.4",
245
+ "oh-my-opencode-linux-x64-musl": "5.1.4",
246
+ "oh-my-opencode-linux-x64-musl-baseline": "5.1.4",
247
+ "oh-my-opencode-windows-arm64": "5.1.4",
248
+ "oh-my-opencode-windows-x64": "5.1.4",
249
+ "oh-my-opencode-windows-x64-baseline": "5.1.4"
250
250
  },
251
251
  "overrides": {
252
252
  "hono": "^4.13.8",
@@ -10,7 +10,7 @@ export function findWorkspaceRootOutsideContext(directory: string): string {
10
10
  return realpathSync(nearestExistingAncestor(directory));
11
11
  }
12
12
 
13
- function nearestMarkedAncestor(directory: string): string | undefined {
13
+ export function nearestMarkedAncestor(directory: string): string | undefined {
14
14
  let current = directory;
15
15
  for (;;) {
16
16
  if (existsSync(current) && WORKSPACE_MARKERS.some((marker) => existsSync(join(current, marker)))) {
@@ -1,4 +1,4 @@
1
- import { mkdtempSync, rmSync } from "node:fs";
1
+ import { mkdtempSync, rmSync, writeFileSync } from "node:fs";
2
2
  import { homedir } from "node:os";
3
3
  import { join } from "node:path";
4
4
  import { afterEach, describe, expect, it } from "bun:test";
@@ -63,7 +63,7 @@ describe("missingDependencyResult", () => {
63
63
 
64
64
  it("#given not installed lookup #when converted #then includes install decision availability", () => {
65
65
  const root = tempRoot();
66
- const installDecisionsPath = join(homedir(), ".codex", "lsp-install-decisions.json");
66
+ const installDecisionsPath = join(root, "lsp-install-decisions.json");
67
67
  const context = parseLspRequestContext({
68
68
  cwd: root,
69
69
  projectConfigPaths: [join(root, ".codex", "lsp-client.json")],
@@ -99,7 +99,37 @@ describe("missingDependencyResult", () => {
99
99
  installHint: "npm install -g typescript-language-server typescript",
100
100
  installDecisionTool: true,
101
101
  installDecisionsPath,
102
+ decision: null,
102
103
  },
103
104
  });
104
105
  });
106
+
107
+ it("#given a recorded decision #when a not installed lookup is converted #then availability carries it", () => {
108
+ const root = tempRoot();
109
+ const installDecisionsPath = join(root, "lsp-install-decisions.json");
110
+ writeFileSync(
111
+ installDecisionsPath,
112
+ JSON.stringify({ biome: { decision: "declined", decidedAt: "2026-09-29T00:00:00.000Z" } }),
113
+ );
114
+ const context = parseLspRequestContext({
115
+ cwd: root,
116
+ projectConfigPaths: [join(root, ".codex", "lsp-client.json")],
117
+ userConfigPath: join(root, "lsp-client.json"),
118
+ installDecisionsPath,
119
+ capabilities: { installDecisionTool: false },
120
+ });
121
+
122
+ const result = runWithRequestContext(context, () =>
123
+ missingDependencyResult(
124
+ new LspServerLookupError("LSP server 'biome' is NOT INSTALLED.", {
125
+ status: "not_installed",
126
+ server: { id: "biome", command: ["biome", "lsp-proxy"], extensions: [".json"] },
127
+ installHint: "npm install -g @biomejs/biome",
128
+ }),
129
+ { filePath: "a.json" },
130
+ ),
131
+ );
132
+
133
+ expect(result?.details).toMatchObject({ availability: { kind: "not_installed", decision: "declined" } });
134
+ });
105
135
  });
@@ -1,4 +1,5 @@
1
1
  import { LspServerLookupError } from "./lsp/errors.js";
2
+ import { type InstallDecision, loadInstallDecision } from "./lsp/server-install-state.js";
2
3
  import { handleMissingDependencyError } from "./lsp/startup-failure.js";
3
4
  import { lspRequestContext } from "./request-context.js";
4
5
  import type { ToolExecutionResult } from "./tools.js";
@@ -20,6 +21,7 @@ export type MissingDependencyAvailability =
20
21
  readonly installHint: string;
21
22
  readonly installDecisionTool: boolean;
22
23
  readonly installDecisionsPath: string;
24
+ readonly decision: InstallDecision | null;
23
25
  };
24
26
 
25
27
  export function missingDependencyResult<TDetails extends object>(
@@ -67,6 +69,7 @@ function missingDependencyAvailability(error: unknown): MissingDependencyAvailab
67
69
  installHint: error.lookup.installHint,
68
70
  installDecisionTool: context.capabilities.installDecisionTool,
69
71
  installDecisionsPath: context.installDecisionsPath,
72
+ decision: loadInstallDecision(error.lookup.server.id)?.decision ?? null,
70
73
  };
71
74
  default: {
72
75
  const exhaustive: never = error.lookup;
@@ -0,0 +1,50 @@
1
+ import { tmpdir } from "node:os";
2
+ import { dirname, resolve } from "node:path";
3
+
4
+ import { nearestMarkedAncestor } from "../lsp/outside-context-workspace.js";
5
+ import { canonicalizeExistingOrNearestAncestor, isPathInside } from "../request-context.js";
6
+
7
+ export type PostEditFileLocation = "project" | "outside_project" | "agent_config" | "temp";
8
+
9
+ export interface PostEditFileLocationOptions {
10
+ readonly cwd: string;
11
+ readonly agentDirs: readonly string[];
12
+ /** Temp roots; defaults to the canonical OS temp dir (plus `/tmp` off Windows). */
13
+ readonly tempDirs?: readonly string[];
14
+ }
15
+
16
+ /**
17
+ * Classifies an edited file for install guidance.
18
+ *
19
+ * A project root is the nearest ancestor carrying one of lsp-core's `WORKSPACE_MARKERS` (the marker set the
20
+ * out-of-cwd workspace resolver uses). Inside a temp dir, only a marked root strictly below the temp root
21
+ * counts, so a stray `package.json` left in the temp root does not turn every scratch file into a project.
22
+ * Paths are canonicalized first because macOS `/tmp` and `/var` are symlinks.
23
+ */
24
+ export function classifyPostEditFileLocation(
25
+ filePath: string,
26
+ options: PostEditFileLocationOptions,
27
+ ): PostEditFileLocation {
28
+ const file = canonicalizeExistingOrNearestAncestor(resolve(options.cwd, filePath));
29
+ if (canonicalDirectories(options.agentDirs).some((directory) => isPathInside(directory, file))) {
30
+ return "agent_config";
31
+ }
32
+
33
+ const projectRoot = nearestMarkedAncestor(dirname(file));
34
+ const tempRoot = canonicalDirectories(options.tempDirs ?? defaultTempDirectories()).find((directory) =>
35
+ isPathInside(directory, file),
36
+ );
37
+ if (tempRoot !== undefined) {
38
+ const ownProject = projectRoot !== undefined && projectRoot !== tempRoot && isPathInside(tempRoot, projectRoot);
39
+ return ownProject ? "project" : "temp";
40
+ }
41
+ return projectRoot === undefined ? "outside_project" : "project";
42
+ }
43
+
44
+ function defaultTempDirectories(): readonly string[] {
45
+ return process.platform === "win32" ? [tmpdir()] : [tmpdir(), "/tmp"];
46
+ }
47
+
48
+ function canonicalDirectories(directories: readonly string[]): readonly string[] {
49
+ return directories.map((directory) => canonicalizeExistingOrNearestAncestor(directory));
50
+ }