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.
- package/.agents/skills/codex-qa/scripts/lsp-e2e.sh +39 -16
- package/.agents/skills/opencode-qa/scripts/lsp-e2e.sh +111 -28
- package/bin/AGENTS.md +33 -0
- package/dist/cli/index.js +57 -18
- package/dist/cli-node/index.js +57 -18
- package/dist/hooks/anthropic-context-window-limit-recovery/empty-content-recovery-sdk.d.ts +6 -0
- package/dist/hooks/category-skill-reminder/hook.d.ts +9 -1
- package/dist/hooks/comment-checker/hook.d.ts +8 -1
- package/dist/hooks/todo-continuation-enforcer/types.d.ts +3 -0
- package/dist/index.js +560 -333
- package/dist/plugin/messages-transform.d.ts +1 -0
- package/dist/plugin-handlers/prometheus-agent-config-builder.d.ts +2 -0
- package/dist/tui.js +43 -4
- package/package.json +13 -13
- package/packages/git-bash-mcp/dist/cli.js +81 -19
- package/packages/lsp-core/src/lsp/client-diagnostics-freshness.integration.test.ts +4 -4
- package/packages/lsp-core/src/lsp/directory-diagnostics.test.ts +118 -1
- package/packages/lsp-core/src/lsp/directory-diagnostics.ts +1 -1
- package/packages/lsp-daemon/dist/cli.js +262 -63
- package/packages/lsp-daemon/dist/client.js +194 -50
- package/packages/lsp-daemon/dist/daemon-client.d.ts +2 -2
- package/packages/lsp-daemon/dist/daemon-client.js +26 -2
- package/packages/lsp-daemon/dist/ensure-daemon.d.ts +5 -4
- package/packages/lsp-daemon/dist/ensure-daemon.js +79 -18
- package/packages/lsp-daemon/dist/index.js +262 -63
- package/packages/lsp-daemon/dist/proxy.d.ts +2 -0
- package/packages/lsp-daemon/dist/proxy.js +79 -23
- package/packages/lsp-tools-mcp/dist/cli.js +82 -20
- package/packages/lsp-tools-mcp/dist/mcp.js +82 -20
- package/packages/lsp-tools-mcp/dist/tools.js +1 -1
- package/packages/omo-codex/plugin/.codex-plugin/plugin.json +1 -1
- package/packages/omo-codex/plugin/.mcp.json +2 -1
- package/packages/omo-codex/plugin/components/bootstrap/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/bootstrap/package.json +1 -1
- package/packages/omo-codex/plugin/components/codegraph/dist/cli.js +100 -28
- package/packages/omo-codex/plugin/components/codegraph/dist/serve.js +100 -28
- package/packages/omo-codex/plugin/components/codegraph/package.json +1 -1
- package/packages/omo-codex/plugin/components/codegraph/src/mcp-bridge.ts +21 -9
- package/packages/omo-codex/plugin/components/codegraph/test/mcp-bridge-fixtures.ts +35 -0
- package/packages/omo-codex/plugin/components/codegraph/test/serve-mcp-bridge-lifecycle.test.ts +69 -0
- package/packages/omo-codex/plugin/components/codegraph/test/serve-mcp-bridge.test.ts +57 -1
- package/packages/omo-codex/plugin/components/comment-checker/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/comment-checker/package.json +1 -1
- package/packages/omo-codex/plugin/components/git-bash/hooks/hooks.json +2 -2
- package/packages/omo-codex/plugin/components/git-bash/package.json +1 -1
- package/packages/omo-codex/plugin/components/lazycodex-executor-verify/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/lazycodex-executor-verify/package.json +1 -1
- package/packages/omo-codex/plugin/components/lsp/.mcp.json +2 -1
- package/packages/omo-codex/plugin/components/lsp/dist/.omo-runtime-manifest.json +3 -3
- package/packages/omo-codex/plugin/components/lsp/dist/cli.js +113 -31
- package/packages/omo-codex/plugin/components/lsp/hooks/hooks.json +2 -2
- package/packages/omo-codex/plugin/components/lsp/package.json +1 -1
- package/packages/omo-codex/plugin/components/lsp/test/package-smoke.test.ts +1 -0
- package/packages/omo-codex/plugin/components/rules/bundled-rules/hephaestus/gpt-5.5.md +1 -1
- package/packages/omo-codex/plugin/components/rules/bundled-rules/hephaestus/gpt-5.6.md +5 -3
- package/packages/omo-codex/plugin/components/rules/hooks/hooks.json +4 -4
- package/packages/omo-codex/plugin/components/rules/package.json +1 -1
- package/packages/omo-codex/plugin/components/start-work-continuation/README.md +2 -2
- package/packages/omo-codex/plugin/components/start-work-continuation/directive.md +3 -3
- package/packages/omo-codex/plugin/components/start-work-continuation/dist/cli.js +2 -2
- package/packages/omo-codex/plugin/components/start-work-continuation/hooks/hooks.json +2 -2
- package/packages/omo-codex/plugin/components/start-work-continuation/package.json +1 -1
- package/packages/omo-codex/plugin/components/start-work-continuation/src/boulder-reader.ts +1 -1
- package/packages/omo-codex/plugin/components/start-work-continuation/src/codex-hook.ts +1 -1
- package/packages/omo-codex/plugin/components/start-work-continuation/test/boulder-reader.test.ts +15 -1
- package/packages/omo-codex/plugin/components/start-work-continuation/test/codex-hook.test.ts +20 -0
- package/packages/omo-codex/plugin/components/teammode/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/teammode/package.json +1 -1
- package/packages/omo-codex/plugin/components/telemetry/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/telemetry/package.json +1 -1
- package/packages/omo-codex/plugin/components/ultrawork/directive.md +50 -33
- package/packages/omo-codex/plugin/components/ultrawork/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/ultrawork/package.json +1 -1
- package/packages/omo-codex/plugin/components/ultrawork/skills/ultrawork/SKILL.md +50 -33
- package/packages/omo-codex/plugin/components/ulw-loop/directive.md +50 -33
- package/packages/omo-codex/plugin/components/ulw-loop/dist/cli.js +3 -3
- package/packages/omo-codex/plugin/components/ulw-loop/dist/stop-resume-hook.js +5 -6
- package/packages/omo-codex/plugin/components/ulw-loop/hooks/hooks.json +4 -4
- package/packages/omo-codex/plugin/components/ulw-loop/package.json +1 -1
- package/packages/omo-codex/plugin/components/ulw-loop/skills/ulw-loop/references/full-workflow.md +1 -1
- package/packages/omo-codex/plugin/components/ulw-loop/src/stop-resume-hook.ts +5 -6
- package/packages/omo-codex/plugin/components/ulw-loop/test/stop-resume-hook.test.ts +2 -2
- package/packages/omo-codex/plugin/hooks/post-compact-resetting-git-bash-mcp-reminder.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-compact-resetting-lsp-diagnostics-cache.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-compact-resetting-project-rule-cache.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-tool-use-checking-codegraph-init-guidance.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-tool-use-checking-comments.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-tool-use-checking-lsp-diagnostics.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-tool-use-checking-thread-title-hygiene.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-tool-use-matching-project-rules.json +1 -1
- package/packages/omo-codex/plugin/hooks/pre-tool-use-enforcing-unlimited-goal-budget.json +1 -1
- package/packages/omo-codex/plugin/hooks/pre-tool-use-guarding-ulw-loop-spawns.json +1 -1
- package/packages/omo-codex/plugin/hooks/pre-tool-use-recommending-git-bash-mcp.json +1 -1
- package/packages/omo-codex/plugin/hooks/session-start-checking-auto-update.json +1 -1
- package/packages/omo-codex/plugin/hooks/session-start-checking-bootstrap-provisioning.json +1 -1
- package/packages/omo-codex/plugin/hooks/session-start-checking-codegraph-bootstrap.json +1 -1
- package/packages/omo-codex/plugin/hooks/session-start-loading-project-rules.json +1 -1
- package/packages/omo-codex/plugin/hooks/session-start-recording-session-telemetry.json +1 -1
- package/packages/omo-codex/plugin/hooks/stop-checking-start-work-continuation.json +1 -1
- package/packages/omo-codex/plugin/hooks/stop-checking-ulw-loop-resume.json +1 -1
- package/packages/omo-codex/plugin/hooks/subagent-stop-checking-start-work-continuation.json +1 -1
- package/packages/omo-codex/plugin/hooks/subagent-stop-verifying-lazycodex-executor-evidence.json +1 -1
- package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ultrawork-trigger.json +1 -1
- package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ulw-loop-steering.json +1 -1
- package/packages/omo-codex/plugin/hooks/user-prompt-submit-loading-project-rules.json +1 -1
- package/packages/omo-codex/plugin/package-lock.json +13 -13
- package/packages/omo-codex/plugin/package.json +1 -1
- package/packages/omo-codex/plugin/scripts/sync-skills.mjs +10 -2
- package/packages/omo-codex/plugin/skills/review-work/SKILL.md +7 -0
- package/packages/omo-codex/plugin/skills/start-work/SKILL.md +3 -2
- package/packages/omo-codex/plugin/skills/ultrawork/SKILL.md +50 -33
- package/packages/omo-codex/plugin/skills/ulw-loop/references/full-workflow.md +1 -1
- package/packages/omo-codex/plugin/test/mcp-research-servers.test.mjs +1 -0
- package/packages/omo-codex/plugin/test/sync-skills-orchestration.test.mjs +7 -0
- package/packages/omo-codex/plugin/test/sync-skills-test-support.mjs +35 -4
- 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
|
|
974
|
-
local commit_smoke="$REPO_ROOT
|
|
975
|
-
|
|
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,
|
|
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: "
|
|
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: "
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
|
924
|
-
local commit_smoke="$REPO_ROOT
|
|
925
|
-
|
|
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,
|
|
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: "
|
|
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: "
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
1768
|
-
|
|
1769
|
-
|
|
1770
|
-
|
|
1771
|
-
|
|
1772
|
-
|
|
1773
|
-
|
|
1774
|
-
|
|
1775
|
-
|
|
1776
|
-
|
|
1777
|
-
|
|
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.
|
|
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.
|
|
2361
|
-
"oh-my-opencode-darwin-x64": "4.18.
|
|
2362
|
-
"oh-my-opencode-darwin-x64-baseline": "4.18.
|
|
2363
|
-
"oh-my-opencode-linux-arm64": "4.18.
|
|
2364
|
-
"oh-my-opencode-linux-arm64-musl": "4.18.
|
|
2365
|
-
"oh-my-opencode-linux-x64": "4.18.
|
|
2366
|
-
"oh-my-opencode-linux-x64-baseline": "4.18.
|
|
2367
|
-
"oh-my-opencode-linux-x64-musl": "4.18.
|
|
2368
|
-
"oh-my-opencode-linux-x64-musl-baseline": "4.18.
|
|
2369
|
-
"oh-my-opencode-windows-arm64": "4.18.
|
|
2370
|
-
"oh-my-opencode-windows-x64": "4.18.
|
|
2371
|
-
"oh-my-opencode-windows-x64-baseline": "4.18.
|
|
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: ["
|
|
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.
|
|
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.",
|