oh-my-openagent 4.18.1 → 4.18.2

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 (116) hide show
  1. package/.agents/skills/codex-qa/scripts/lsp-e2e.sh +39 -16
  2. package/.agents/skills/opencode-qa/scripts/lsp-e2e.sh +111 -28
  3. package/bin/AGENTS.md +33 -0
  4. package/dist/cli/index.js +57 -18
  5. package/dist/cli-node/index.js +57 -18
  6. package/dist/hooks/anthropic-context-window-limit-recovery/empty-content-recovery-sdk.d.ts +6 -0
  7. package/dist/hooks/category-skill-reminder/hook.d.ts +9 -1
  8. package/dist/hooks/comment-checker/hook.d.ts +8 -1
  9. package/dist/hooks/todo-continuation-enforcer/types.d.ts +3 -0
  10. package/dist/index.js +560 -333
  11. package/dist/plugin/messages-transform.d.ts +1 -0
  12. package/dist/plugin-handlers/prometheus-agent-config-builder.d.ts +2 -0
  13. package/dist/tui.js +43 -4
  14. package/package.json +13 -13
  15. package/packages/git-bash-mcp/dist/cli.js +81 -19
  16. package/packages/lsp-core/src/lsp/client-diagnostics-freshness.integration.test.ts +4 -4
  17. package/packages/lsp-core/src/lsp/directory-diagnostics.test.ts +118 -1
  18. package/packages/lsp-core/src/lsp/directory-diagnostics.ts +1 -1
  19. package/packages/lsp-daemon/dist/cli.js +262 -63
  20. package/packages/lsp-daemon/dist/client.js +194 -50
  21. package/packages/lsp-daemon/dist/daemon-client.d.ts +2 -2
  22. package/packages/lsp-daemon/dist/daemon-client.js +26 -2
  23. package/packages/lsp-daemon/dist/ensure-daemon.d.ts +5 -4
  24. package/packages/lsp-daemon/dist/ensure-daemon.js +79 -18
  25. package/packages/lsp-daemon/dist/index.js +262 -63
  26. package/packages/lsp-daemon/dist/proxy.d.ts +2 -0
  27. package/packages/lsp-daemon/dist/proxy.js +79 -23
  28. package/packages/lsp-tools-mcp/dist/cli.js +82 -20
  29. package/packages/lsp-tools-mcp/dist/mcp.js +82 -20
  30. package/packages/lsp-tools-mcp/dist/tools.js +1 -1
  31. package/packages/omo-codex/plugin/.codex-plugin/plugin.json +1 -1
  32. package/packages/omo-codex/plugin/.mcp.json +2 -1
  33. package/packages/omo-codex/plugin/components/bootstrap/hooks/hooks.json +1 -1
  34. package/packages/omo-codex/plugin/components/bootstrap/package.json +1 -1
  35. package/packages/omo-codex/plugin/components/codegraph/dist/cli.js +100 -28
  36. package/packages/omo-codex/plugin/components/codegraph/dist/serve.js +100 -28
  37. package/packages/omo-codex/plugin/components/codegraph/package.json +1 -1
  38. package/packages/omo-codex/plugin/components/codegraph/src/mcp-bridge.ts +21 -9
  39. package/packages/omo-codex/plugin/components/codegraph/test/mcp-bridge-fixtures.ts +35 -0
  40. package/packages/omo-codex/plugin/components/codegraph/test/serve-mcp-bridge-lifecycle.test.ts +69 -0
  41. package/packages/omo-codex/plugin/components/codegraph/test/serve-mcp-bridge.test.ts +57 -1
  42. package/packages/omo-codex/plugin/components/comment-checker/hooks/hooks.json +1 -1
  43. package/packages/omo-codex/plugin/components/comment-checker/package.json +1 -1
  44. package/packages/omo-codex/plugin/components/git-bash/hooks/hooks.json +2 -2
  45. package/packages/omo-codex/plugin/components/git-bash/package.json +1 -1
  46. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/hooks/hooks.json +1 -1
  47. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/package.json +1 -1
  48. package/packages/omo-codex/plugin/components/lsp/.mcp.json +2 -1
  49. package/packages/omo-codex/plugin/components/lsp/dist/.omo-runtime-manifest.json +3 -3
  50. package/packages/omo-codex/plugin/components/lsp/dist/cli.js +113 -31
  51. package/packages/omo-codex/plugin/components/lsp/hooks/hooks.json +2 -2
  52. package/packages/omo-codex/plugin/components/lsp/package.json +1 -1
  53. package/packages/omo-codex/plugin/components/lsp/test/package-smoke.test.ts +1 -0
  54. package/packages/omo-codex/plugin/components/rules/bundled-rules/hephaestus/gpt-5.5.md +1 -1
  55. package/packages/omo-codex/plugin/components/rules/bundled-rules/hephaestus/gpt-5.6.md +5 -3
  56. package/packages/omo-codex/plugin/components/rules/hooks/hooks.json +4 -4
  57. package/packages/omo-codex/plugin/components/rules/package.json +1 -1
  58. package/packages/omo-codex/plugin/components/start-work-continuation/README.md +2 -2
  59. package/packages/omo-codex/plugin/components/start-work-continuation/directive.md +3 -3
  60. package/packages/omo-codex/plugin/components/start-work-continuation/dist/cli.js +2 -2
  61. package/packages/omo-codex/plugin/components/start-work-continuation/hooks/hooks.json +2 -2
  62. package/packages/omo-codex/plugin/components/start-work-continuation/package.json +1 -1
  63. package/packages/omo-codex/plugin/components/start-work-continuation/src/boulder-reader.ts +1 -1
  64. package/packages/omo-codex/plugin/components/start-work-continuation/src/codex-hook.ts +1 -1
  65. package/packages/omo-codex/plugin/components/start-work-continuation/test/boulder-reader.test.ts +15 -1
  66. package/packages/omo-codex/plugin/components/start-work-continuation/test/codex-hook.test.ts +20 -0
  67. package/packages/omo-codex/plugin/components/teammode/hooks/hooks.json +1 -1
  68. package/packages/omo-codex/plugin/components/teammode/package.json +1 -1
  69. package/packages/omo-codex/plugin/components/telemetry/hooks/hooks.json +1 -1
  70. package/packages/omo-codex/plugin/components/telemetry/package.json +1 -1
  71. package/packages/omo-codex/plugin/components/ultrawork/directive.md +50 -33
  72. package/packages/omo-codex/plugin/components/ultrawork/hooks/hooks.json +1 -1
  73. package/packages/omo-codex/plugin/components/ultrawork/package.json +1 -1
  74. package/packages/omo-codex/plugin/components/ultrawork/skills/ultrawork/SKILL.md +50 -33
  75. package/packages/omo-codex/plugin/components/ulw-loop/directive.md +50 -33
  76. package/packages/omo-codex/plugin/components/ulw-loop/dist/cli.js +3 -3
  77. package/packages/omo-codex/plugin/components/ulw-loop/dist/stop-resume-hook.js +5 -6
  78. package/packages/omo-codex/plugin/components/ulw-loop/hooks/hooks.json +4 -4
  79. package/packages/omo-codex/plugin/components/ulw-loop/package.json +1 -1
  80. package/packages/omo-codex/plugin/components/ulw-loop/skills/ulw-loop/references/full-workflow.md +1 -1
  81. package/packages/omo-codex/plugin/components/ulw-loop/src/stop-resume-hook.ts +5 -6
  82. package/packages/omo-codex/plugin/components/ulw-loop/test/stop-resume-hook.test.ts +2 -2
  83. package/packages/omo-codex/plugin/hooks/post-compact-resetting-git-bash-mcp-reminder.json +1 -1
  84. package/packages/omo-codex/plugin/hooks/post-compact-resetting-lsp-diagnostics-cache.json +1 -1
  85. package/packages/omo-codex/plugin/hooks/post-compact-resetting-project-rule-cache.json +1 -1
  86. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-codegraph-init-guidance.json +1 -1
  87. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-comments.json +1 -1
  88. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-lsp-diagnostics.json +1 -1
  89. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-thread-title-hygiene.json +1 -1
  90. package/packages/omo-codex/plugin/hooks/post-tool-use-matching-project-rules.json +1 -1
  91. package/packages/omo-codex/plugin/hooks/pre-tool-use-enforcing-unlimited-goal-budget.json +1 -1
  92. package/packages/omo-codex/plugin/hooks/pre-tool-use-guarding-ulw-loop-spawns.json +1 -1
  93. package/packages/omo-codex/plugin/hooks/pre-tool-use-recommending-git-bash-mcp.json +1 -1
  94. package/packages/omo-codex/plugin/hooks/session-start-checking-auto-update.json +1 -1
  95. package/packages/omo-codex/plugin/hooks/session-start-checking-bootstrap-provisioning.json +1 -1
  96. package/packages/omo-codex/plugin/hooks/session-start-checking-codegraph-bootstrap.json +1 -1
  97. package/packages/omo-codex/plugin/hooks/session-start-loading-project-rules.json +1 -1
  98. package/packages/omo-codex/plugin/hooks/session-start-recording-session-telemetry.json +1 -1
  99. package/packages/omo-codex/plugin/hooks/stop-checking-start-work-continuation.json +1 -1
  100. package/packages/omo-codex/plugin/hooks/stop-checking-ulw-loop-resume.json +1 -1
  101. package/packages/omo-codex/plugin/hooks/subagent-stop-checking-start-work-continuation.json +1 -1
  102. package/packages/omo-codex/plugin/hooks/subagent-stop-verifying-lazycodex-executor-evidence.json +1 -1
  103. package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ultrawork-trigger.json +1 -1
  104. package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ulw-loop-steering.json +1 -1
  105. package/packages/omo-codex/plugin/hooks/user-prompt-submit-loading-project-rules.json +1 -1
  106. package/packages/omo-codex/plugin/package-lock.json +13 -13
  107. package/packages/omo-codex/plugin/package.json +1 -1
  108. package/packages/omo-codex/plugin/scripts/sync-skills.mjs +10 -2
  109. package/packages/omo-codex/plugin/skills/review-work/SKILL.md +7 -0
  110. package/packages/omo-codex/plugin/skills/start-work/SKILL.md +3 -2
  111. package/packages/omo-codex/plugin/skills/ultrawork/SKILL.md +50 -33
  112. package/packages/omo-codex/plugin/skills/ulw-loop/references/full-workflow.md +1 -1
  113. package/packages/omo-codex/plugin/test/mcp-research-servers.test.mjs +1 -0
  114. package/packages/omo-codex/plugin/test/sync-skills-orchestration.test.mjs +7 -0
  115. package/packages/omo-codex/plugin/test/sync-skills-test-support.mjs +35 -4
  116. package/packages/omo-codex/scripts/install-dist/install-local.mjs +1 -1
@@ -36,6 +36,8 @@ DAEMON_DIST_BACKUP=""
36
36
  DAEMON_DIST_WAS_PRESENT=0
37
37
  DAEMON_DIST_PREPARED=0
38
38
  BUILD_LOCK_DIR=""
39
+ CANCELLATION_SMOKE_RELATIVE="packages/lsp-daemon/scripts/qa/cancellation-smoke.mjs"
40
+ COMMIT_BARRIER_SMOKE_RELATIVE="packages/lsp-daemon/scripts/qa/commit-barrier-smoke.mjs"
39
41
 
40
42
  log() { printf '[codex-lsp-e2e] %s\n' "$*" >&2; }
41
43
  fail() { log "FAIL: $*"; return 1; }
@@ -110,6 +112,21 @@ require_bins() {
110
112
  [ "$missing" -eq 0 ]
111
113
  }
112
114
 
115
+ verify_tracked_cancellation_probes() {
116
+ local dependency ignored_evidence_root=".omo""/evidence"
117
+ if grep -Fq "$ignored_evidence_root" "${BASH_SOURCE[0]}"; then
118
+ fail "LSP QA driver references ignored evidence state"
119
+ return 1
120
+ fi
121
+ for dependency in "$CANCELLATION_SMOKE_RELATIVE" "$COMMIT_BARRIER_SMOKE_RELATIVE"; do
122
+ [ -f "$REPO_ROOT/$dependency" ] || { fail "missing cancellation QA dependency: $dependency"; return 1; }
123
+ git -C "$REPO_ROOT" ls-files --error-unmatch -- "$dependency" >/dev/null 2>&1 || {
124
+ fail "cancellation QA dependency is not tracked: $dependency"
125
+ return 1
126
+ }
127
+ done
128
+ }
129
+
113
130
  hash_path() {
114
131
  node --input-type=module - "$1" <<'NODE'
115
132
  import { createHash } from "node:crypto";
@@ -970,24 +987,21 @@ NODE
970
987
  }
971
988
 
972
989
  run_cancellation_contract_probe() {
973
- local cancellation_smoke="$REPO_ROOT/.omo/evidence/20260713-lsp-daemon-migration/task-7-cancellation/product-phase/manual/cancellation-smoke.mjs"
974
- local commit_smoke="$REPO_ROOT/.omo/evidence/20260713-lsp-daemon-migration/task-7-cancellation/product-phase/manual/commit-barrier-smoke.mjs"
975
- [ -f "$cancellation_smoke" ] || { fail "missing product cancellation smoke"; return 1; }
976
- [ -f "$commit_smoke" ] || { fail "missing product commit-barrier smoke"; return 1; }
990
+ local cancellation_smoke="$REPO_ROOT/$CANCELLATION_SMOKE_RELATIVE"
991
+ local commit_smoke="$REPO_ROOT/$COMMIT_BARRIER_SMOKE_RELATIVE"
992
+ verify_tracked_cancellation_probes || return 1
977
993
 
978
- run_bounded 90 "$EVIDENCE_DIR/cancellation-smoke-output.json" bun "$cancellation_smoke" || return 1
979
- run_bounded 90 "$EVIDENCE_DIR/commit-barrier-smoke-output.json" bun "$commit_smoke" || return 1
994
+ run_bounded 90 "$EVIDENCE_DIR/cancellation-smoke-output.json" bun "$cancellation_smoke" "$REPO_ROOT" || return 1
995
+ run_bounded 90 "$EVIDENCE_DIR/commit-barrier-smoke-output.json" bun "$commit_smoke" "$REPO_ROOT" || return 1
980
996
 
981
997
  node --input-type=module - \
982
998
  "$EVIDENCE_DIR/cancellation-smoke-output.json" \
983
999
  "$EVIDENCE_DIR/commit-barrier-smoke-output.json" \
984
- "$REPO_ROOT/.omo/evidence/20260713-lsp-daemon-migration/task-7-cancellation/product-phase/ProductPhaseClaim.json" \
985
1000
  "$EVIDENCE_DIR/cancellation-contract.json" "$SCENARIO" "codex" <<'NODE'
986
1001
  import { readFileSync, writeFileSync } from "node:fs";
987
- const [cancelPath, commitPath, claimPath, outputPath, scenario, harness] = process.argv.slice(2);
1002
+ const [cancelPath, commitPath, outputPath, scenario, harness] = process.argv.slice(2);
988
1003
  const cancel = JSON.parse(readFileSync(cancelPath, "utf8"));
989
1004
  const commit = JSON.parse(readFileSync(commitPath, "utf8"));
990
- const claim = JSON.parse(readFileSync(claimPath, "utf8"));
991
1005
  const result = {
992
1006
  result: "PASS",
993
1007
  scenario,
@@ -1006,12 +1020,12 @@ const result = {
1006
1020
  },
1007
1021
  daemonTimeout: {
1008
1022
  bounded: true,
1009
- provenBy: "product focused daemon timeout and LSP timeout tests in ProductPhaseClaim.greenEvidence",
1023
+ provenBy: "packages/lsp-daemon/test/daemon-client-retry.test.ts and packages/lsp-core/src/lsp/json-rpc-connection-cancellation.test.ts",
1010
1024
  },
1011
1025
  socketDisconnect: {
1012
1026
  abortsServerWork: true,
1013
1027
  activeDaemonControllersAfter: 0,
1014
- provenBy: "product focused request-routing socket-close test in ProductPhaseClaim.greenEvidence",
1028
+ provenBy: "packages/lsp-daemon/test/request-routing.test.ts",
1015
1029
  },
1016
1030
  pendingAndLateResponse: {
1017
1031
  lspPendingRequestsAfter: cancel.directPendingAfterLateResponse,
@@ -1019,7 +1033,7 @@ const result = {
1019
1033
  },
1020
1034
  directoryDiagnostics: {
1021
1035
  stoppedSchedulingBetweenFiles: true,
1022
- provenBy: "packages/lsp-core/src/lsp/directory-diagnostics.test.ts and ProductPhaseClaim.greenEvidence",
1036
+ provenBy: "packages/lsp-core/src/lsp/directory-diagnostics.test.ts",
1023
1037
  },
1024
1038
  delayedRenamePreCommitGate: {
1025
1039
  cancelTarget: commit.preGate.cancelTarget,
@@ -1041,7 +1055,7 @@ const result = {
1041
1055
  readOnlyPreWriteConnectionFailureRetry: {
1042
1056
  retryCount: 1,
1043
1057
  requestCount: 1,
1044
- provenBy: "packages/lsp-daemon/test/daemon-client-retry.test.ts and ProductPhaseClaim.greenEvidence",
1058
+ provenBy: "packages/lsp-daemon/test/daemon-client-retry.test.ts",
1045
1059
  },
1046
1060
  sequentialProxyIds: {
1047
1061
  distinct: true,
@@ -1056,7 +1070,6 @@ const result = {
1056
1070
  cwdCanonical: true,
1057
1071
  },
1058
1072
  dirtyWorktreePreservation: {
1059
- productPhasePreExistingDirtyScope: claim.scope?.preExistingDirtyScope,
1060
1073
  driverMustPreserveDirtyWorktree: true,
1061
1074
  },
1062
1075
  noLeftovers: {
@@ -1067,7 +1080,10 @@ const result = {
1067
1080
  artifacts: {
1068
1081
  cancellationSmoke: "cancellation-smoke-output.json",
1069
1082
  commitBarrierSmoke: "commit-barrier-smoke-output.json",
1070
- productClaim: ".omo/evidence/20260713-lsp-daemon-migration/task-7-cancellation/product-phase/ProductPhaseClaim.json",
1083
+ },
1084
+ sources: {
1085
+ cancellationSmoke: "packages/lsp-daemon/scripts/qa/cancellation-smoke.mjs",
1086
+ commitBarrierSmoke: "packages/lsp-daemon/scripts/qa/commit-barrier-smoke.mjs",
1071
1087
  },
1072
1088
  };
1073
1089
  const required = [
@@ -3166,6 +3182,7 @@ run_self_test() {
3166
3182
  require_bins bash node jq git || return 1
3167
3183
  local root before_omo after_omo before_codex after_codex before_status after_status failures=0 out rc start end
3168
3184
  local cancellation_result_fields=true client_package_result_fields=true installed_component_result_fields=true
3185
+ local qa_dependencies_portable=true
3169
3186
  local fixture_run child sandbox_path attempts
3170
3187
  local missing_dist_build_order='{"result":"NOT_RUN"}'
3171
3188
  root="$(mktemp -d -t cqa-lsp-e2e.XXXXXX)" || return 1
@@ -3180,6 +3197,11 @@ run_self_test() {
3180
3197
  if bash "${BASH_SOURCE[0]}" --scenario ../bad --evidence-dir "$root/bad" >>"$out" 2>&1; then failures=$((failures + 1)); fi
3181
3198
  if bash "${BASH_SOURCE[0]}" --scenario ok --evidence-dir relative >>"$out" 2>&1; then failures=$((failures + 1)); fi
3182
3199
 
3200
+ if ! verify_tracked_cancellation_probes >>"$out" 2>&1; then
3201
+ qa_dependencies_portable=false
3202
+ failures=$((failures + 1))
3203
+ fi
3204
+
3183
3205
  for fixture in fake-pass fake-skip; do
3184
3206
  local ev="$root/$fixture"
3185
3207
  mkdir -p "$ev"
@@ -3402,8 +3424,9 @@ NODE
3402
3424
  [ "$before_codex" = "$after_codex" ] || failures=$((failures + 1))
3403
3425
  [ "$before_status" = "$after_status" ] || failures=$((failures + 1))
3404
3426
 
3405
- printf '{"result":"%s","selfTest":true,"malformedArgsRejected":true,"fakePassRejected":true,"skipRejected":true,"hungCommandBounded":true,"partialStagingCleanedTwice":true,"interruptCleanupRepeated":true,"missingDaemonDistBuildOrderIndependent":true,"cancellationResultFieldsMandatory":%s,"clientPackageResultFieldsMandatory":%s,"installedComponentResultFieldsMandatory":%s,"missingDistBuildOrder":%s,"dirtyWorktreePreserved":%s,"realHomesUnchanged":%s}\n' \
3427
+ printf '{"result":"%s","selfTest":true,"malformedArgsRejected":true,"fakePassRejected":true,"skipRejected":true,"hungCommandBounded":true,"partialStagingCleanedTwice":true,"interruptCleanupRepeated":true,"missingDaemonDistBuildOrderIndependent":true,"qaDependenciesPortable":%s,"cancellationResultFieldsMandatory":%s,"clientPackageResultFieldsMandatory":%s,"installedComponentResultFieldsMandatory":%s,"missingDistBuildOrder":%s,"dirtyWorktreePreserved":%s,"realHomesUnchanged":%s}\n' \
3406
3428
  "$( [ "$failures" -eq 0 ] && echo PASS || echo FAIL )" \
3429
+ "$qa_dependencies_portable" \
3407
3430
  "$cancellation_result_fields" \
3408
3431
  "$client_package_result_fields" \
3409
3432
  "$installed_component_result_fields" \
@@ -41,6 +41,8 @@ SSE_ATTEMPT_SECONDS=2
41
41
  BUILD_LOCK_DIR=""
42
42
  SOURCE_PACKAGE_STAMP=""
43
43
  SOURCE_PACKAGE_STAMP_CREATED=0
44
+ CANCELLATION_SMOKE_RELATIVE="packages/lsp-daemon/scripts/qa/cancellation-smoke.mjs"
45
+ COMMIT_BARRIER_SMOKE_RELATIVE="packages/lsp-daemon/scripts/qa/commit-barrier-smoke.mjs"
44
46
 
45
47
  log() { printf '[opencode-lsp-e2e] %s\n' "$*" >&2; }
46
48
  fail() { log "FAIL: $*"; return 1; }
@@ -111,6 +113,21 @@ require_bins() {
111
113
  [ "$missing" -eq 0 ]
112
114
  }
113
115
 
116
+ verify_tracked_cancellation_probes() {
117
+ local dependency ignored_evidence_root=".omo""/evidence"
118
+ if grep -Fq "$ignored_evidence_root" "${BASH_SOURCE[0]}"; then
119
+ fail "LSP QA driver references ignored evidence state"
120
+ return 1
121
+ fi
122
+ for dependency in "$CANCELLATION_SMOKE_RELATIVE" "$COMMIT_BARRIER_SMOKE_RELATIVE"; do
123
+ [ -f "$REPO_ROOT/$dependency" ] || { fail "missing cancellation QA dependency: $dependency"; return 1; }
124
+ git -C "$REPO_ROOT" ls-files --error-unmatch -- "$dependency" >/dev/null 2>&1 || {
125
+ fail "cancellation QA dependency is not tracked: $dependency"
126
+ return 1
127
+ }
128
+ done
129
+ }
130
+
114
131
  hash_path() {
115
132
  node --input-type=module - "$1" <<'NODE'
116
133
  import { createHash } from "node:crypto";
@@ -920,24 +937,21 @@ NODE
920
937
  }
921
938
 
922
939
  run_cancellation_contract_probe() {
923
- local cancellation_smoke="$REPO_ROOT/.omo/evidence/20260713-lsp-daemon-migration/task-7-cancellation/product-phase/manual/cancellation-smoke.mjs"
924
- local commit_smoke="$REPO_ROOT/.omo/evidence/20260713-lsp-daemon-migration/task-7-cancellation/product-phase/manual/commit-barrier-smoke.mjs"
925
- [ -f "$cancellation_smoke" ] || { fail "missing product cancellation smoke"; return 1; }
926
- [ -f "$commit_smoke" ] || { fail "missing product commit-barrier smoke"; return 1; }
940
+ local cancellation_smoke="$REPO_ROOT/$CANCELLATION_SMOKE_RELATIVE"
941
+ local commit_smoke="$REPO_ROOT/$COMMIT_BARRIER_SMOKE_RELATIVE"
942
+ verify_tracked_cancellation_probes || return 1
927
943
 
928
- run_bounded 90 "$EVIDENCE_DIR/cancellation-smoke-output.json" bun "$cancellation_smoke" || return 1
929
- run_bounded 90 "$EVIDENCE_DIR/commit-barrier-smoke-output.json" bun "$commit_smoke" || return 1
944
+ run_bounded 90 "$EVIDENCE_DIR/cancellation-smoke-output.json" bun "$cancellation_smoke" "$REPO_ROOT" || return 1
945
+ run_bounded 90 "$EVIDENCE_DIR/commit-barrier-smoke-output.json" bun "$commit_smoke" "$REPO_ROOT" || return 1
930
946
 
931
947
  bun --input-type=module - \
932
948
  "$EVIDENCE_DIR/cancellation-smoke-output.json" \
933
949
  "$EVIDENCE_DIR/commit-barrier-smoke-output.json" \
934
- "$REPO_ROOT/.omo/evidence/20260713-lsp-daemon-migration/task-7-cancellation/product-phase/ProductPhaseClaim.json" \
935
950
  "$EVIDENCE_DIR/cancellation-contract.json" "$SCENARIO" "opencode" <<'NODE'
936
951
  import { readFileSync, writeFileSync } from "node:fs";
937
- const [cancelPath, commitPath, claimPath, outputPath, scenario, harness] = process.argv.slice(2);
952
+ const [cancelPath, commitPath, outputPath, scenario, harness] = process.argv.slice(2);
938
953
  const cancel = JSON.parse(readFileSync(cancelPath, "utf8"));
939
954
  const commit = JSON.parse(readFileSync(commitPath, "utf8"));
940
- const claim = JSON.parse(readFileSync(claimPath, "utf8"));
941
955
  const result = {
942
956
  result: "PASS",
943
957
  scenario,
@@ -956,12 +970,12 @@ const result = {
956
970
  },
957
971
  daemonTimeout: {
958
972
  bounded: true,
959
- provenBy: "product focused daemon timeout and LSP timeout tests in ProductPhaseClaim.greenEvidence",
973
+ provenBy: "packages/lsp-daemon/test/daemon-client-retry.test.ts and packages/lsp-core/src/lsp/json-rpc-connection-cancellation.test.ts",
960
974
  },
961
975
  socketDisconnect: {
962
976
  abortsServerWork: true,
963
977
  activeDaemonControllersAfter: 0,
964
- provenBy: "product focused request-routing socket-close test in ProductPhaseClaim.greenEvidence",
978
+ provenBy: "packages/lsp-daemon/test/request-routing.test.ts",
965
979
  },
966
980
  pendingAndLateResponse: {
967
981
  lspPendingRequestsAfter: cancel.directPendingAfterLateResponse,
@@ -969,7 +983,7 @@ const result = {
969
983
  },
970
984
  directoryDiagnostics: {
971
985
  stoppedSchedulingBetweenFiles: true,
972
- provenBy: "packages/lsp-core/src/lsp/directory-diagnostics.test.ts and ProductPhaseClaim.greenEvidence",
986
+ provenBy: "packages/lsp-core/src/lsp/directory-diagnostics.test.ts",
973
987
  },
974
988
  delayedRenamePreCommitGate: {
975
989
  cancelTarget: commit.preGate.cancelTarget,
@@ -991,7 +1005,7 @@ const result = {
991
1005
  readOnlyPreWriteConnectionFailureRetry: {
992
1006
  retryCount: 1,
993
1007
  requestCount: 1,
994
- provenBy: "packages/lsp-daemon/test/daemon-client-retry.test.ts and ProductPhaseClaim.greenEvidence",
1008
+ provenBy: "packages/lsp-daemon/test/daemon-client-retry.test.ts",
995
1009
  },
996
1010
  sequentialProxyIds: {
997
1011
  distinct: true,
@@ -1006,7 +1020,6 @@ const result = {
1006
1020
  cwdCanonical: true,
1007
1021
  },
1008
1022
  dirtyWorktreePreservation: {
1009
- productPhasePreExistingDirtyScope: claim.scope?.preExistingDirtyScope,
1010
1023
  driverMustPreserveDirtyWorktree: true,
1011
1024
  },
1012
1025
  noLeftovers: {
@@ -1017,7 +1030,10 @@ const result = {
1017
1030
  artifacts: {
1018
1031
  cancellationSmoke: "cancellation-smoke-output.json",
1019
1032
  commitBarrierSmoke: "commit-barrier-smoke-output.json",
1020
- productClaim: ".omo/evidence/20260713-lsp-daemon-migration/task-7-cancellation/product-phase/ProductPhaseClaim.json",
1033
+ },
1034
+ sources: {
1035
+ cancellationSmoke: "packages/lsp-daemon/scripts/qa/cancellation-smoke.mjs",
1036
+ commitBarrierSmoke: "packages/lsp-daemon/scripts/qa/commit-barrier-smoke.mjs",
1021
1037
  },
1022
1038
  };
1023
1039
  const required = [
@@ -1762,19 +1778,79 @@ NODE
1762
1778
  }
1763
1779
 
1764
1780
  run_mcp_status_call() {
1765
- local label="$1" output="$2"
1781
+ local label="$1" output="$2" stderr_output="$EVIDENCE_DIR/${1}.stderr.log"
1766
1782
  shift 2
1767
- printf '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"lsp_status","arguments":{}}}\n' |
1768
- env \
1769
- HOME="$HOME" \
1770
- XDG_CONFIG_HOME="$XDG_CONFIG_HOME" \
1771
- OMO_LSP_DAEMON_DIR="$OMO_LSP_DAEMON_DIR" \
1772
- ${OMO_LSP_DAEMON_CLI+OMO_LSP_DAEMON_CLI="$OMO_LSP_DAEMON_CLI"} \
1773
- ${OMO_LSP_DAEMON_VERSION+OMO_LSP_DAEMON_VERSION="$OMO_LSP_DAEMON_VERSION"} \
1774
- LSP_TOOLS_MCP_PROJECT_CONFIG="$SANDBOX_ROOT/project/.opencode/lsp.json:$SANDBOX_ROOT/project/.omo/lsp.json:$SANDBOX_ROOT/project/.omo/lsp-client.json" \
1775
- LSP_TOOLS_MCP_USER_CONFIG="$XDG_CONFIG_HOME/opencode/lsp.json" \
1776
- LSP_TOOLS_MCP_INSTALL_DECISIONS="$XDG_CONFIG_HOME/opencode/lsp-install-decisions.json" \
1777
- "$@" >"$output" 2>"$EVIDENCE_DIR/${label}.stderr.log"
1783
+ env \
1784
+ HOME="$HOME" \
1785
+ XDG_CONFIG_HOME="$XDG_CONFIG_HOME" \
1786
+ OMO_LSP_DAEMON_DIR="$OMO_LSP_DAEMON_DIR" \
1787
+ ${OMO_LSP_DAEMON_CLI+OMO_LSP_DAEMON_CLI="$OMO_LSP_DAEMON_CLI"} \
1788
+ ${OMO_LSP_DAEMON_VERSION+OMO_LSP_DAEMON_VERSION="$OMO_LSP_DAEMON_VERSION"} \
1789
+ LSP_TOOLS_MCP_PROJECT_CONFIG="$SANDBOX_ROOT/project/.opencode/lsp.json:$SANDBOX_ROOT/project/.omo/lsp.json:$SANDBOX_ROOT/project/.omo/lsp-client.json" \
1790
+ LSP_TOOLS_MCP_USER_CONFIG="$XDG_CONFIG_HOME/opencode/lsp.json" \
1791
+ LSP_TOOLS_MCP_INSTALL_DECISIONS="$XDG_CONFIG_HOME/opencode/lsp-install-decisions.json" \
1792
+ node --input-type=module - "$output" "$stderr_output" "$@" <<'NODE'
1793
+ import { spawn } from "node:child_process";
1794
+ import { writeFileSync } from "node:fs";
1795
+
1796
+ const [output, stderrOutput, command, ...args] = process.argv.slice(2);
1797
+ if (!command) process.exit(125);
1798
+
1799
+ const child = spawn(command, args, { env: process.env, stdio: ["pipe", "pipe", "pipe"] });
1800
+ let stdout = "";
1801
+ let stderr = "";
1802
+ let responseSeen = false;
1803
+ let forceTimer;
1804
+
1805
+ child.stdout.setEncoding("utf8");
1806
+ child.stderr.setEncoding("utf8");
1807
+ child.stdout.on("data", (chunk) => {
1808
+ stdout += chunk;
1809
+ if (!responseSeen && stdout.includes("\n")) {
1810
+ responseSeen = true;
1811
+ child.stdin.end();
1812
+ }
1813
+ });
1814
+ child.stderr.on("data", (chunk) => {
1815
+ stderr += chunk;
1816
+ });
1817
+ child.stdin.on("error", (error) => {
1818
+ stderr += `${error instanceof Error ? error.stack ?? error.message : String(error)}\n`;
1819
+ });
1820
+
1821
+ const request = { jsonrpc: "2.0", id: 1, method: "tools/call", params: { name: "lsp_status", arguments: {} } };
1822
+ child.stdin.write(`${JSON.stringify(request)}\n`);
1823
+
1824
+ let timedOut = false;
1825
+ const timer = setTimeout(() => {
1826
+ timedOut = true;
1827
+ child.kill("SIGTERM");
1828
+ forceTimer = setTimeout(() => child.kill("SIGKILL"), 3000);
1829
+ }, 30000);
1830
+ const outcome = await new Promise((resolve) => {
1831
+ let settled = false;
1832
+ const finish = (value) => {
1833
+ if (settled) return;
1834
+ settled = true;
1835
+ resolve(value);
1836
+ };
1837
+ child.once("error", (error) => finish({ error }));
1838
+ child.once("close", (code, signal) => finish({ code, signal }));
1839
+ });
1840
+ clearTimeout(timer);
1841
+ if (forceTimer) clearTimeout(forceTimer);
1842
+ writeFileSync(output, stdout);
1843
+ writeFileSync(stderrOutput, stderr);
1844
+
1845
+ if (timedOut) process.exit(124);
1846
+ if ("error" in outcome) {
1847
+ console.error(outcome.error);
1848
+ process.exit(126);
1849
+ }
1850
+ if (!responseSeen) process.exit(1);
1851
+ if (typeof outcome.code === "number") process.exit(outcome.code);
1852
+ process.exit(outcome.signal ? 128 : 1);
1853
+ NODE
1778
1854
  }
1779
1855
 
1780
1856
  capture_current_daemon_owner() {
@@ -2416,6 +2492,7 @@ run_self_test() {
2416
2492
  local fixture_run child sandbox_path attempts health_pid health_port accepted_count previous_opencode_pid
2417
2493
  local sse_pid sse_port previous_sse_ready previous_sse_attempt
2418
2494
  local terminal_pid terminal_port previous_scenario previous_evidence_dir terminal_killer
2495
+ local qa_dependencies_portable=true
2419
2496
  root="$(mktemp -d -t oqa-lsp-e2e.XXXXXX)" || return 1
2420
2497
  SANDBOX_ROOT="$root"
2421
2498
  before_omo="$(hash_path "$REAL_OMO_ROOT")"
@@ -2429,6 +2506,11 @@ run_self_test() {
2429
2506
  if bash "${BASH_SOURCE[0]}" --scenario ../bad --evidence-dir "$root/bad" >>"$out" 2>&1; then failures=$((failures + 1)); fi
2430
2507
  if bash "${BASH_SOURCE[0]}" --scenario ok --evidence-dir relative >>"$out" 2>&1; then failures=$((failures + 1)); fi
2431
2508
 
2509
+ if ! verify_tracked_cancellation_probes >>"$out" 2>&1; then
2510
+ qa_dependencies_portable=false
2511
+ failures=$((failures + 1))
2512
+ fi
2513
+
2432
2514
  for fixture in fake-pass fake-skip; do
2433
2515
  local ev="$root/$fixture"
2434
2516
  mkdir -p "$ev"
@@ -2763,8 +2845,9 @@ NODE
2763
2845
  [ "$before_db" = "$after_db" ] || failures=$((failures + 1))
2764
2846
  [ "$before_status" = "$after_status" ] || failures=$((failures + 1))
2765
2847
 
2766
- printf '{"result":"%s","selfTest":true,"malformedArgsRejected":true,"fakePassRejected":true,"skipRejected":true,"hungCommandBounded":true,"healthTimeoutReadinessBounded":true,"sseStartupRetryDeterministic":true,"partialStagingCleanedTwice":true,"interruptCleanupRepeated":true,"cancellationResultFieldsMandatory":true,"clientPackageResultFieldsMandatory":true,"dirtyWorktreePreserved":%s,"realHomesUnchanged":%s}\n' \
2848
+ printf '{"result":"%s","selfTest":true,"malformedArgsRejected":true,"fakePassRejected":true,"skipRejected":true,"hungCommandBounded":true,"healthTimeoutReadinessBounded":true,"sseStartupRetryDeterministic":true,"partialStagingCleanedTwice":true,"interruptCleanupRepeated":true,"qaDependenciesPortable":%s,"cancellationResultFieldsMandatory":true,"clientPackageResultFieldsMandatory":true,"dirtyWorktreePreserved":%s,"realHomesUnchanged":%s}\n' \
2767
2849
  "$( [ "$failures" -eq 0 ] && echo PASS || echo FAIL )" \
2850
+ "$qa_dependencies_portable" \
2768
2851
  "$( [ "$before_status" = "$after_status" ] && echo true || echo false )" \
2769
2852
  "$( [ "$before_omo" = "$after_omo" ] && [ "$before_db" = "$after_db" ] && echo true || echo false )"
2770
2853
  cleanup_all || failures=$((failures + 1))
package/bin/AGENTS.md ADDED
@@ -0,0 +1,33 @@
1
+ # bin/ - Published Launcher Shim
2
+
3
+ ## OVERVIEW
4
+
5
+ Node-side launch surface for every public CLI alias. The root shim resolves a platform package and spawns its generated `bin/oh-my-opencode.js` launcher payload; it is not the TypeScript CLI implementation.
6
+
7
+ ## WHERE TO LOOK
8
+
9
+ | Task | Location | Notes |
10
+ |------|----------|-------|
11
+ | Main launcher | `oh-my-opencode.js` | Entry for `oh-my-opencode`, `oh-my-openagent`, `omo`, `lazycodex`, and `lazycodex-ai` |
12
+ | Platform selection | `platform.js` | OS/arch/libc package candidates and baseline fallback |
13
+ | Platform types | `platform.d.ts` | Public declarations for the plain-JS selector |
14
+ | Version mismatch output | `version-mismatch.js` | User-facing installed-wrapper/platform-package mismatch diagnostics |
15
+ | Behavior tests | `*.test.ts` | Bun tests for invocation routing, platform selection, and diagnostics |
16
+
17
+ ## RUNTIME FLOW
18
+
19
+ `oh-my-opencode.js` derives the invocation name, optionally routes the LazyCodex Node installer, resolves an ordered list of `oh-my-opencode-*` or `oh-my-openagent-*` platform package candidates, then spawns the first installed package's generated `bin/oh-my-opencode.js` launcher. Each generated Node launcher runs root `dist/cli` with Bun and, when Bun is missing or exits with `SIGILL`, falls back to root `dist/cli-node` with Node. The root shim retains ordered package fallback compatibility, including x64 `-baseline` candidates, but current generated platform payloads are identical Node scripts, so a Bun `SIGILL` is normally handled inside the selected launcher rather than by switching to a baseline package.
20
+
21
+ ## CONVENTIONS
22
+
23
+ - Keep this surface Node-compatible; the root shim and generated launcher payloads are plain Node scripts.
24
+ - Preserve all five aliases. Alias-to-platform-family behavior is shared with `postinstall.mjs` and publish-time package rewrites.
25
+ - Keep error output actionable: report the detected platform and the ordered package candidates.
26
+ - Tests run from the root with `bun test bin` or as part of `bun test`.
27
+
28
+ ## ANTI-PATTERNS
29
+
30
+ - Do not import adapter source from `packages/omo-opencode/src/`; this shim must remain usable from the published package layout.
31
+ - Do not hard-code one npm package family. `oh-my-opencode` and `oh-my-openagent` wrappers share the launcher.
32
+ - Do not edit generated launcher payloads under `packages/oh-my-opencode-*/bin/`; regenerate them through `script/build-binaries.ts`.
33
+ - Do not remove baseline fallback without updating platform tests and publish-platform coverage.
package/dist/cli/index.js CHANGED
@@ -2145,7 +2145,7 @@ var package_default;
2145
2145
  var init_package = __esm(() => {
2146
2146
  package_default = {
2147
2147
  name: "oh-my-opencode",
2148
- version: "4.18.1",
2148
+ version: "4.18.2",
2149
2149
  description: "The Best AI Agent Harness - Batteries-Included OpenCode Plugin with Multi-Model Orchestration, Parallel Background Agents, and Crafted LSP/AST Tools",
2150
2150
  main: "./dist/index.js",
2151
2151
  types: "dist/index.d.ts",
@@ -2357,18 +2357,18 @@ var init_package = __esm(() => {
2357
2357
  typescript: "^6.0.3"
2358
2358
  },
2359
2359
  optionalDependencies: {
2360
- "oh-my-opencode-darwin-arm64": "4.18.1",
2361
- "oh-my-opencode-darwin-x64": "4.18.1",
2362
- "oh-my-opencode-darwin-x64-baseline": "4.18.1",
2363
- "oh-my-opencode-linux-arm64": "4.18.1",
2364
- "oh-my-opencode-linux-arm64-musl": "4.18.1",
2365
- "oh-my-opencode-linux-x64": "4.18.1",
2366
- "oh-my-opencode-linux-x64-baseline": "4.18.1",
2367
- "oh-my-opencode-linux-x64-musl": "4.18.1",
2368
- "oh-my-opencode-linux-x64-musl-baseline": "4.18.1",
2369
- "oh-my-opencode-windows-arm64": "4.18.1",
2370
- "oh-my-opencode-windows-x64": "4.18.1",
2371
- "oh-my-opencode-windows-x64-baseline": "4.18.1"
2360
+ "oh-my-opencode-darwin-arm64": "4.18.2",
2361
+ "oh-my-opencode-darwin-x64": "4.18.2",
2362
+ "oh-my-opencode-darwin-x64-baseline": "4.18.2",
2363
+ "oh-my-opencode-linux-arm64": "4.18.2",
2364
+ "oh-my-opencode-linux-arm64-musl": "4.18.2",
2365
+ "oh-my-opencode-linux-x64": "4.18.2",
2366
+ "oh-my-opencode-linux-x64-baseline": "4.18.2",
2367
+ "oh-my-opencode-linux-x64-musl": "4.18.2",
2368
+ "oh-my-opencode-linux-x64-musl-baseline": "4.18.2",
2369
+ "oh-my-opencode-windows-arm64": "4.18.2",
2370
+ "oh-my-opencode-windows-x64": "4.18.2",
2371
+ "oh-my-opencode-windows-x64-baseline": "4.18.2"
2372
2372
  },
2373
2373
  overrides: {
2374
2374
  "@earendil-works/pi-agent-core": "0.80.3",
@@ -9222,7 +9222,7 @@ var init_agent_model_requirements = __esm(() => {
9222
9222
  hephaestus: {
9223
9223
  fallbackChain: [
9224
9224
  {
9225
- providers: ["openai", "vercel"],
9225
+ providers: ["openai", "github-copilot", "vercel"],
9226
9226
  model: "gpt-5.6-sol",
9227
9227
  variant: "high"
9228
9228
  },
@@ -9333,6 +9333,11 @@ var init_agent_model_requirements = __esm(() => {
9333
9333
  model: "gpt-5.6-sol",
9334
9334
  variant: "xhigh"
9335
9335
  },
9336
+ {
9337
+ providers: ["github-copilot"],
9338
+ model: "gpt-5.6-sol",
9339
+ variant: "high"
9340
+ },
9336
9341
  {
9337
9342
  providers: ["openai", "github-copilot", "opencode", "vercel"],
9338
9343
  model: "gpt-5.5",
@@ -9411,6 +9416,11 @@ var init_category_model_requirements = __esm(() => {
9411
9416
  model: "gpt-5.6-sol",
9412
9417
  variant: "xhigh"
9413
9418
  },
9419
+ {
9420
+ providers: ["github-copilot"],
9421
+ model: "gpt-5.6-sol",
9422
+ variant: "high"
9423
+ },
9414
9424
  {
9415
9425
  providers: ["openai", "opencode", "vercel"],
9416
9426
  model: "gpt-5.5",
@@ -9437,7 +9447,12 @@ var init_category_model_requirements = __esm(() => {
9437
9447
  variant: "xhigh"
9438
9448
  },
9439
9449
  {
9440
- providers: ["openai", "vercel"],
9450
+ providers: ["github-copilot"],
9451
+ model: "gpt-5.6-terra",
9452
+ variant: "high"
9453
+ },
9454
+ {
9455
+ providers: ["openai", "github-copilot", "vercel"],
9441
9456
  model: "gpt-5.6-sol",
9442
9457
  variant: "high"
9443
9458
  },
@@ -9504,6 +9519,11 @@ var init_category_model_requirements = __esm(() => {
9504
9519
  model: "gpt-5.6-luna",
9505
9520
  variant: "xhigh"
9506
9521
  },
9522
+ {
9523
+ providers: ["github-copilot"],
9524
+ model: "gpt-5.6-luna",
9525
+ variant: "high"
9526
+ },
9507
9527
  {
9508
9528
  providers: ["anthropic", "github-copilot", "opencode", "vercel"],
9509
9529
  model: "claude-sonnet-4-6"
@@ -9593,9 +9613,12 @@ function stripProviderPrefixForAliasLookup(normalizedModelID) {
9593
9613
  }
9594
9614
  return normalizedModelID.slice(slashIndex + 1);
9595
9615
  }
9596
- function resolveModelIDAlias(modelID) {
9616
+ function resolveModelIDAlias(modelID, providerID) {
9597
9617
  const requestedModelID = normalizeLookupModelID(modelID);
9598
9618
  const aliasLookupModelID = stripProviderPrefixForAliasLookup(requestedModelID);
9619
+ const normalizedProviderID = providerID ? normalizeLookupModelID(providerID) : undefined;
9620
+ const providerPrefixEnd = requestedModelID.indexOf("/");
9621
+ const embeddedProviderID = providerPrefixEnd > 0 ? requestedModelID.slice(0, providerPrefixEnd) : undefined;
9599
9622
  const exactRule = EXACT_ALIAS_RULES_BY_MODEL.get(aliasLookupModelID);
9600
9623
  if (exactRule) {
9601
9624
  return {
@@ -9606,6 +9629,13 @@ function resolveModelIDAlias(modelID) {
9606
9629
  };
9607
9630
  }
9608
9631
  for (const rule of PATTERN_ALIAS_RULES) {
9632
+ if (rule.providerIDs) {
9633
+ const matchesProviderID = normalizedProviderID !== undefined && rule.providerIDs.includes(normalizedProviderID);
9634
+ const matchesEmbeddedProviderID = normalizedProviderID !== undefined && rule.allowedSubproviderHosts?.includes(normalizedProviderID) === true && embeddedProviderID !== undefined && rule.providerIDs.includes(embeddedProviderID);
9635
+ if (!matchesProviderID && !matchesEmbeddedProviderID) {
9636
+ continue;
9637
+ }
9638
+ }
9609
9639
  if (!rule.match(aliasLookupModelID)) {
9610
9640
  continue;
9611
9641
  }
@@ -9646,6 +9676,14 @@ var init_model_capability_aliases = __esm(() => {
9646
9676
  ];
9647
9677
  EXACT_ALIAS_RULES_BY_MODEL = new Map(EXACT_ALIAS_RULES.map((rule) => [rule.aliasModelID, rule]));
9648
9678
  PATTERN_ALIAS_RULES = [
9679
+ {
9680
+ ruleID: "openai-gpt-5.6-fast-service-tier-alias",
9681
+ description: "Normalizes OpenCode's OpenAI GPT-5.6 fast service-tier IDs to canonical snapshot IDs.",
9682
+ providerIDs: ["openai"],
9683
+ allowedSubproviderHosts: ["vercel"],
9684
+ match: (normalizedModelID) => /^gpt-5\.6-(?:sol|terra|luna)-fast$/.test(normalizedModelID),
9685
+ canonicalize: (normalizedModelID) => normalizedModelID.slice(0, -"-fast".length)
9686
+ },
9649
9687
  {
9650
9688
  ruleID: "claude-thinking-legacy-alias",
9651
9689
  description: "Normalizes the legacy claude-opus-4-7-thinking id to the canonical snapshot ID.",
@@ -10313,7 +10351,7 @@ function getProviderOverride(providerID, modelID) {
10313
10351
  return GITHUB_COPILOT_GPT5_MODEL.test(normalizeLookupModelID2(modelID)) ? GITHUB_COPILOT_GPT5_OVERRIDE : undefined;
10314
10352
  }
10315
10353
  function getModelCapabilities(input) {
10316
- const canonicalization = resolveModelIDAlias(input.modelID);
10354
+ const canonicalization = resolveModelIDAlias(input.modelID, input.providerID);
10317
10355
  const override = getOverride(input.modelID);
10318
10356
  const providerOverride = getProviderOverride(input.providerID, canonicalization.canonicalModelID);
10319
10357
  const runtimeModel = readRuntimeModel(input.runtimeModel ?? input.providerCache?.findProviderModelMetadata(input.providerID, input.modelID));
@@ -11418,6 +11456,7 @@ var init_opencode_storage_detection = __esm(() => {
11418
11456
  var opencodePluginsCache;
11419
11457
  var init_load_opencode_plugins = __esm(() => {
11420
11458
  init_jsonc_parser2();
11459
+ init_opencode_config_dir();
11421
11460
  opencodePluginsCache = new Map;
11422
11461
  });
11423
11462
 
@@ -72602,7 +72641,7 @@ var package_default2;
72602
72641
  var init_package2 = __esm(() => {
72603
72642
  package_default2 = {
72604
72643
  name: "@oh-my-opencode/omo-codex",
72605
- version: "4.18.1",
72644
+ version: "4.18.2",
72606
72645
  type: "module",
72607
72646
  private: true,
72608
72647
  description: "Codex harness adapter for oh-my-openagent. Vendored Codex plugin namespace (omo) + TypeScript installer + telemetry.",