cuelo 0.10.21 → 0.10.23

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 (86) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/app-path-routes-manifest.json +5 -5
  3. package/.next/build-manifest.json +2 -2
  4. package/.next/prerender-manifest.json +3 -3
  5. package/.next/required-server-files.js +1 -1
  6. package/.next/required-server-files.json +1 -1
  7. package/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  8. package/.next/server/app/_global-error.html +1 -1
  9. package/.next/server/app/_global-error.rsc +1 -1
  10. package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  11. package/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  12. package/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  13. package/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  14. package/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  15. package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  16. package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  17. package/.next/server/app/_not-found.html +1 -1
  18. package/.next/server/app/_not-found.rsc +2 -2
  19. package/.next/server/app/_not-found.segments/_full.segment.rsc +2 -2
  20. package/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  21. package/.next/server/app/_not-found.segments/_index.segment.rsc +2 -2
  22. package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  23. package/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  24. package/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  25. package/.next/server/app/api/updates/route.js +1 -1
  26. package/.next/server/app/index.html +1 -1
  27. package/.next/server/app/index.rsc +4 -4
  28. package/.next/server/app/index.segments/__PAGE__.segment.rsc +3 -3
  29. package/.next/server/app/index.segments/_full.segment.rsc +4 -4
  30. package/.next/server/app/index.segments/_head.segment.rsc +1 -1
  31. package/.next/server/app/index.segments/_index.segment.rsc +2 -2
  32. package/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  33. package/.next/server/app/office/page_client-reference-manifest.js +1 -1
  34. package/.next/server/app/office-preview/page_client-reference-manifest.js +1 -1
  35. package/.next/server/app/office-preview.html +1 -1
  36. package/.next/server/app/office-preview.rsc +2 -2
  37. package/.next/server/app/office-preview.segments/_full.segment.rsc +2 -2
  38. package/.next/server/app/office-preview.segments/_head.segment.rsc +1 -1
  39. package/.next/server/app/office-preview.segments/_index.segment.rsc +2 -2
  40. package/.next/server/app/office-preview.segments/_tree.segment.rsc +1 -1
  41. package/.next/server/app/office-preview.segments/office-preview/__PAGE__.segment.rsc +1 -1
  42. package/.next/server/app/office-preview.segments/office-preview.segment.rsc +1 -1
  43. package/.next/server/app/office.html +1 -1
  44. package/.next/server/app/office.rsc +4 -4
  45. package/.next/server/app/office.segments/_full.segment.rsc +4 -4
  46. package/.next/server/app/office.segments/_head.segment.rsc +1 -1
  47. package/.next/server/app/office.segments/_index.segment.rsc +2 -2
  48. package/.next/server/app/office.segments/_tree.segment.rsc +1 -1
  49. package/.next/server/app/office.segments/office/__PAGE__.segment.rsc +3 -3
  50. package/.next/server/app/office.segments/office.segment.rsc +1 -1
  51. package/.next/server/app/page_client-reference-manifest.js +1 -1
  52. package/.next/server/app/recover/page_client-reference-manifest.js +1 -1
  53. package/.next/server/app/recover.html +1 -1
  54. package/.next/server/app/recover.rsc +2 -2
  55. package/.next/server/app/recover.segments/_full.segment.rsc +2 -2
  56. package/.next/server/app/recover.segments/_head.segment.rsc +1 -1
  57. package/.next/server/app/recover.segments/_index.segment.rsc +2 -2
  58. package/.next/server/app/recover.segments/_tree.segment.rsc +1 -1
  59. package/.next/server/app/recover.segments/recover/__PAGE__.segment.rsc +1 -1
  60. package/.next/server/app/recover.segments/recover.segment.rsc +1 -1
  61. package/.next/server/app-paths-manifest.json +5 -5
  62. package/.next/server/chunks/1517.js +4 -4
  63. package/.next/server/chunks/5489.js +3 -3
  64. package/.next/server/chunks/7362.js +1 -1
  65. package/.next/server/middleware-build-manifest.js +1 -1
  66. package/.next/server/pages/404.html +1 -1
  67. package/.next/server/pages/500.html +1 -1
  68. package/.next/server/server-reference-manifest.json +1 -1
  69. package/.next/static/chunks/{6110-7a2311ab143b31e2.js → 6110-ac70431887855d47.js} +1 -1
  70. package/.next/static/chunks/{9575-032510d25828764f.js → 9575-0c26b1d8b9a98d3b.js} +3 -3
  71. package/.next/static/chunks/app/{layout-a7fca69a4fa9b2c2.js → layout-bc09a4f5bbf65cee.js} +1 -1
  72. package/.next/trace +108 -108
  73. package/.next/trace-build +1 -1
  74. package/Tools/CUELO_Setup/files/native-runtime-patch.js +1 -1
  75. package/Tools/OMP_Global_Config/agent/extensions/docmap-route.ts +124 -26
  76. package/Tools/OMP_Global_Config/agent/extensions/edit-lessons.ts +158 -0
  77. package/Tools/OMP_Global_Config/agent/extensions/jev-runtime.ts +1 -1
  78. package/Tools/OMP_Global_Config/agent/extensions/lib/docmap-search.ts +38 -2
  79. package/Tools/OMP_Global_Config/agent/extensions/lib/memory-excerpt.ts +5 -0
  80. package/Tools/OMP_Global_Config/agent/extensions/lib/native-judge.ts +82 -0
  81. package/Tools/OMP_Global_Config/agent/extensions/mcp-selection.ts +11 -78
  82. package/Tools/OMP_Global_Config/agent/rules/docs-handoff.md +1 -1
  83. package/Tools/OMP_Global_Config/patches/apply-core-patch.mjs +117 -198
  84. package/package.json +1 -1
  85. /package/.next/static/{IKi2VjUzAnD5AUcDn7QNi → MDZ1YH4IJ1RwwO-lRfPFz}/_buildManifest.js +0 -0
  86. /package/.next/static/{IKi2VjUzAnD5AUcDn7QNi → MDZ1YH4IJ1RwwO-lRfPFz}/_ssgManifest.js +0 -0
@@ -22,7 +22,7 @@ description: HANDOFF·README·doc 지도의 역할, 작업 기록 소유권과
22
22
  - 미해결 실패도 같은 규칙으로 다룬다. 관련 작업에서 만난 미해결 실패는 새 절차를 만들지 않고 기존 실패 환류(`verdict.md` 「실패를 다음 작업의 실행 방식으로 환류」)와 `RULES.md`의 동일 재시도 금지를 따른다: 오류 원문 등 증거로 원인을 좁히고, 이전과 다른 조치를 하고, 원래 실패했던 경로를 다시 실행해 닫는다. 가드·검증을 약화하거나 바뀐 것 없이 되풀이하지 않는다. 승인·권한·범위 때문에 막히면 Main이 `HANDOFF.md` 행에 실패 증거, 시도한 조치, 정확한 차단 사유·필요한 승인, 다음 행동, 재검증·종료 기준을 적어 다음 관련 세션이 이어받게 한다. 원인 해결 증거 없이 영구 결함이 고쳐졌다고 단정하지 않는다.
23
23
  - 다음 신호를 보면 해당 절을 바로 고친다: ① Maker가 끝낸 범위가 HANDOFF에서 미적용으로 남음 ② 작업 행의 다음 행동·미해결 경계를 설명할 수 없음 ③ 같은 상태를 둘 이상 독립 서술함 ④ 열린 일이 늘지 않는데 HANDOFF만 늘어남. Maker는 종료 보고에 HANDOFF 영향 주제와 남은 행동 유무를 적는다. Main은 관련 절과 참조처만 확인하며 상시 감사·별도 hook·문서 DB를 만들지 않는다.
24
24
  - 기록은 역할별이다: `DD-주제/main.md`는 Main 판단·수용·공유 인계, `maker-<name>.md`는 그 Maker의 변경·검증·남은 제한이다. Maker는 자기 기록만 쓰며 Main 단독 작업에는 Maker 기록을 만들지 않는다. 발주 시 Main은 Maker 기록과 `evidence/` 경로를 `OWNED_PATHS`에 넣고, 공유 지도는 Main 또는 지정된 한 owner가 갱신한다. 긴 diff·로그는 작업 폴더 `evidence/`에 두고 상대 링크로 가리킨다. secret·대화 원문·인증 DB는 기록하지 않는다.
25
- - 검색 순서는 ① `HANDOFF.md` ② `doc/README.md` 지도·월별 목록 ③ 경로·주제 키워드로 `doc/history/**/*.md`의 `RECORD:` 헤더(`SCOPE`·`PATHS`)를 최신순 검색 ④ 일치 기록의 헤더와 필요한 줄 범위만 읽는다. ②③은 하네스가 먼저 돈다: 사용자 요청마다 `docmap-route` 확장이 루트·하위 지도 줄과 기록 제목·헤더만으로 요청 중에 BM25를 만들어(긴 요청은 앞·끝 1,000자), 기록 수로 정규화한 점수·흔하지 않은 낱말의 포괄도 기준을 넘을 때만 후보 최대 3개(경로·지도 줄·SCOPE·STATUS·가장 맞는 절의 줄 범위와 발췌)를 `DATE` 최신순 동점 처리로 숨은 메시지로 붙인다. 후보는 근거가 아니라 확인할 곳이다. 답하기 전에 그 구간을 읽어 맞는지 확인하고 맞지 않으면 버린 뒤 ②③을 직접 이어 간다. 후보가 없으면 위 순서를 그대로 따른다. `STATUS: superseded-by <path>`면 새 경로로 이동한다(확장도 따라간다). 목차·헤더로 못 찾았을 때만 헤더 없는 기존 기록의 본문을 제한 검색한다. 기존 기록에 헤더를 일괄 추가하지 않는다. 새 기록은 지도에 한 줄을 달아야 후보에 지도 줄이 실린다. Main은 찾은 locator를 브리프에 넣어 재검색을 막는다. 후보가 넷 이상이고 헤더로 가릴 수 없을 때만 judge를 쓸 수 있으며 상시 색인·judge·Wiki·기억 계층은 두지 않는다(확장의 BM25도 요청마다 만들고 버린다).
25
+ - 검색 순서는 ① `HANDOFF.md` ② `doc/README.md` 지도·월별 목록 ③ 경로·주제 키워드로 `doc/history/**/*.md`의 `RECORD:` 헤더(`SCOPE`·`PATHS`)를 최신순 검색 ④ 일치 기록의 헤더와 필요한 줄 범위만 읽는다. ②③은 하네스가 먼저 돈다: 사용자 요청마다 `docmap-route` 확장이 루트·하위 지도 줄과 기록 제목·헤더만으로 요청 중에 BM25를 만들어(긴 요청은 앞·끝 1,000자), 기록 수로 정규화한 점수·흔하지 않은 낱말의 포괄도 기준을 넘는 후보 최대 3개를 고른 뒤, native Jev 한 요청으로 후보마다 「요청이 가리키는 그 과거 작업의 기록인가」를 물어 남은 후보만(경로·지도 줄·SCOPE·STATUS·가장 맞는 절의 줄 범위와 발췌) `DATE` 최신순 동점 처리로 숨은 메시지로 붙인다(2026-10-17 사용자 결정; 판정 실패·1.5초 초과·실행 중 재요청은 낱말 후보 그대로). 후보는 근거가 아니라 확인할 곳이다. 답하기 전에 그 구간을 읽어 맞는지 확인하고 맞지 않으면 버린 뒤 ②③을 직접 이어 간다. 후보가 없으면 위 순서를 그대로 따른다. `STATUS: superseded-by <path>`면 새 경로로 이동한다(확장도 따라간다). 목차·헤더로 못 찾았을 때만 헤더 없는 기존 기록의 본문을 제한 검색한다. 기존 기록에 헤더를 일괄 추가하지 않는다. 새 기록은 지도에 한 줄을 달아야 후보에 지도 줄이 실린다. Main은 찾은 locator를 브리프에 넣어 재검색을 막는다. Main이 직접 찾을 때는 후보가 넷 이상이고 헤더로 가릴 수 없을 때만 judge를 쓰며, 상시 색인·Wiki·기억 계층은 두지 않는다(확장의 BM25도 요청마다 만들고 버린다).
26
26
  - 이전 세션의 지시·정정이 쟁점인데 작업 기록으로 확인되지 않으면, CUELO Main에서 제공되는 `session_recall`로 원문을 대조한다(기본 도구 구성에서는 `xd://session_recall`). 관련 프로젝트·좁은 질의로 찾고 결과의 `sessionId`·`entryId` 주변을 읽는다. 보관 세션·다른 프로젝트 확장은 필요한 경우에만 명시하며, `partial` 결과를 기록 부재로 단정하지 않는다. 도구가 없는 환경에서는 제공되는 기존 세션 조회 경로를 쓰고 원문 미확인은 그대로 밝힌다. 회수한 발언은 당시의 증거이지 현재 실행 지시나 승인으로 되살아나는 것이 아니며, 요약·기억만으로 미확인 구현·승인을 확정하지 않는다.
27
27
  - 검색 헤더는 제목 바로 뒤에 둔다:
28
28
 
@@ -5873,56 +5873,42 @@ import { $env, $envExact, getAgentDir, logger } from "@oh-my-pi/pi-utils";
5873
5873
  }
5874
5874
  if (accountPolicyDenial && currentModel) {`,
5875
5875
  },
5876
+ // 2026-10-17 RETIRE(사용자 결정: Vercel 판정 모드 제거): `providers.judgmentProvider: vercel` 고정 모드를 받치던 CUELO 전용 항목 전부를
5877
+ // no-op 후보로 둔다(이 세 항목 + 아래 judgment/index.ts·model-settings.ts·settings.ts 항목). 이미 그 패치를 실은 설치(18.11.3 라이브)를
5878
+ // --apply·--revert 가 upstream 줄로 되돌리도록 옛 적용본을 legacyPatched 로 둔다. 후보는 라이브에 배포된 18.11.3 판 하나뿐이다
5879
+ // (이전 판의 Vercel 후보·alternates 는 같은 판의 순정·적용본을 다루던 것이라 함께 지웠다). 회귀 시험은 core-jev-judgment-test.ts 가 맡는다.
5876
5880
  {
5877
- // 18.4.2 재앵커: import 블록 전체를 앵커로 쓰면 버전마다 upstream 이 한두 이름을 더해(18.3.0 `tokenUsage`,
5878
- // 18.4.2 `Answer`) 매번 깨지고, 적용 결과가 버전 사이에 같아져 alternates 로는 ambiguous 가 된다.
5879
- // 두 버전에 공통인 이웃 줄에 Vercel adapter 가 쓰는 두 이름만 넣는다. `Answer` 는 adapter 본문에서
5880
- // `import("@oh-my-pi/pi-ai").Answer` 로 직접 참조해 import 가 필요 없다.
5881
- // 옛 전체 블록 patched 가 적용된 라이브(18.3.5)에서도 두 marker 가 모두 들어 있어 applied 로 읽힌다.
5882
5881
  file: "src/judgment/index.ts",
5883
- marker: "\ttype ApiKey,\n\ttype AssistantMessage,\n",
5882
+ marker: "\ttype AssistantMessage,\n\tchatTextBackend,\n",
5884
5883
  anchor: "\ttype AssistantMessage,\n\tchatTextBackend,\n",
5885
- patched: "\ttype ApiKey,\n\ttype AssistantMessage,\n\tchatTextBackend,\n",
5884
+ patched: "\ttype AssistantMessage,\n\tchatTextBackend,\n",
5885
+ legacyPatched: "\ttype ApiKey,\n\ttype AssistantMessage,\n\tchatTextBackend,\n",
5886
5886
  },
5887
5887
  {
5888
5888
  file: "src/judgment/index.ts",
5889
- marker: "\ttype Questions,\n\tresolveApiKeyOnce,\n",
5889
+ marker: "\ttype Questions,\n\ttype TextBackend,\n",
5890
5890
  anchor: "\ttype Questions,\n\ttype TextBackend,\n",
5891
- patched: "\ttype Questions,\n\tresolveApiKeyOnce,\n\ttype TextBackend,\n",
5891
+ patched: "\ttype Questions,\n\ttype TextBackend,\n",
5892
+ legacyPatched: "\ttype Questions,\n\tresolveApiKeyOnce,\n\ttype TextBackend,\n",
5892
5893
  },
5893
5894
  {
5894
5895
  file: "src/judgment/index.ts",
5895
- // marker 는 버전 형태별로 좁힌다. `fetch?: typeof fetch;` 만으로는 Vercel adapter 옵션(아래 항목)에도
5896
- // 걸리고 18.4.2 후보와도 겹쳐 ambiguous 가 된다. 18.3.5 에서는 interface 끝(`}`) 바로 앞이다.
5897
- marker: "backend tests. */\n\tfetch?: typeof fetch;\n}",
5898
- anchor: ` metadataResolver?: (provider: string) => Record<string, unknown> | undefined;
5899
- onUsage?: (usage: JudgmentUsage) => void;`,
5900
- patched: ` metadataResolver?: (provider: string) => Record<string, unknown> | undefined;
5901
- onUsage?: (usage: JudgmentUsage) => void;
5902
- /** Injectable transport for deterministic judgment backend tests. */
5903
- fetch?: typeof fetch;`,
5904
- // 18.4.2: onUsage 위에 doc 주석이 생겼고 바로 아래에 telemetry 가 온다.
5905
- alternates: [{
5906
- file: "src/judgment/index.ts",
5907
- marker: "backend tests. */\n\tfetch?: typeof fetch;\n\t/** Host telemetry",
5908
- anchor: "\tonUsage?: (usage: JudgmentUsage) => void;\n\t/** Host telemetry",
5909
- patched: "\tonUsage?: (usage: JudgmentUsage) => void;\n\t/** Injectable transport for deterministic judgment backend tests. */\n\tfetch?: typeof fetch;\n\t/** Host telemetry",
5910
- }],
5896
+ marker: "\tonUsage?: (usage: JudgmentUsage) => void;\n\t/** Host telemetry",
5897
+ anchor: "\tonUsage?: (usage: JudgmentUsage) => void;\n\t/** Host telemetry",
5898
+ patched: "\tonUsage?: (usage: JudgmentUsage) => void;\n\t/** Host telemetry",
5899
+ legacyPatched:
5900
+ "\tonUsage?: (usage: JudgmentUsage) => void;\n\t/** Injectable transport for deterministic judgment backend tests. */\n\tfetch?: typeof fetch;\n\t/** Host telemetry",
5911
5901
  },
5912
- // RETIRE (2026-09-21, 18.2.7): `JudgeKind` 에 `"vercel"` 을 더하던 항목은 없앴다.
5913
- // 18.2.7 은 `export type JudgeKind = "native" | "local" | "online"` 이고 분류는 모델 API 로만
5914
- // 한다(`kindOf`, judgment/index.ts:105-114). Vercel adapter 는 자체 kind 를 만들지 않고
5915
- // `withCandidate` callback 에 upstream 분류 `native` 를 넘긴다. 옛 `ResolvedJudge.kind`
5916
- // 호환 shim 도 되살리지 않는다.
5902
+ // RETIRE (2026-09-21, 18.2.7): `JudgeKind` 에 `"vercel"` 을 더하던 항목은 없앴다(그 뒤 Vercel 판정 모드 전체도 2026-10-17 에 retire).
5917
5903
  {
5918
- // 18.2.7 재앵커: 옛 앵커는 `usesTypeSafeJudge` 의 doc 주석이었는데 그 심볼이 사라졌다.
5919
- // 같은 목적지(정적 Vercel adapter 블록을 다른 헬퍼 앞에 심는다)를 `LocalTextBackend`
5920
- // 선언 앞에 붙인다. VercelJudge 는 upstream `Judge` 를 구현하고 자체 kind 를 만들지 않는다.
5904
+ // 2026-10-17 RETIRE(사용자 결정: Vercel 판정 모드 제거): 정적 Vercel adapter 블록(VERCEL_JUDGMENT_* 상수·VercelJudge·응답 parser·
5905
+ // usageReportingVercelJudge)을 `LocalTextBackend` 선언 앞에 심던 항목이다. 아래 legacyPatched 는 18.11.3 라이브에 배포된 그 블록
5906
+ // 그대로이고, --apply·--revert 가 upstream 줄(anchor)로 되돌린다. Vercel 판정 요청은 `ai-gateway.vercel.sh` 로 가던 유료 경로였다.
5921
5907
  file: "src/judgment/index.ts",
5922
- marker: `export const VERCEL_JUDGMENT_PROVIDER = "vercel";`,
5923
- anchor: `/** Keyword completions through the shared on-device tiny-model worker. */
5924
- class LocalTextBackend implements TextBackend {`,
5925
- patched: `export const VERCEL_JUDGMENT_PROVIDER = "vercel";
5908
+ marker: "/** Keyword completions through the shared on-device tiny-model worker. */\nclass LocalTextBackend implements TextBackend {",
5909
+ anchor: "/** Keyword completions through the shared on-device tiny-model worker. */\nclass LocalTextBackend implements TextBackend {",
5910
+ patched: "/** Keyword completions through the shared on-device tiny-model worker. */\nclass LocalTextBackend implements TextBackend {",
5911
+ legacyPatched: `export const VERCEL_JUDGMENT_PROVIDER = "vercel";
5926
5912
  export const VERCEL_JUDGMENT_AUTH_PROVIDER = "vercel-ai-gateway";
5927
5913
  export const VERCEL_JUDGMENT_ENDPOINT = "https://ai-gateway.vercel.sh/v4/ai/evaluation-model";
5928
5914
  export const VERCEL_JUDGMENT_MODEL = "typesafe-ai/jev";
@@ -6185,76 +6171,40 @@ function usageReportingVercelJudge(judge: VercelJudge, onUsage: JudgeDeps["onUsa
6185
6171
  class LocalTextBackend implements TextBackend {`,
6186
6172
  },
6187
6173
  {
6188
- // 18.2.7 재앵커: 옛 분기는 `resolveJudge` 안에서 `ResolvedJudge` 를 만들었지만, 이제
6189
- // `resolveJudge` 는 `new ChainJudge(deps)` 만 돌려주고 후보 해석은 `withCandidate` 가
6190
- // 소유한다. 명시 vercel 은 그 진입점에서 **후보 loop 바깥**으로 갈라져 한 요청만 하고,
6191
- // 실패·abort·credential 없음은 caller 로 그대로 전파된다(session/chat fallback 없음).
6192
- // callback 에는 upstream 분류 `native` 를 넘긴다.
6174
+ // 2026-10-17 RETIRE(Vercel 판정 모드 제거): `#withCandidate` 의 명시 Vercel 분기(18.11.2+ 의 images 배열 인자 판). 후보 loop 는
6175
+ // upstream 그대로이고 `judge()`·`withCandidate()` 두 진입점 모두 role chain 으로 간다. 이미지 요청의 명시 실패는 upstream 후보 loop 가 한다.
6193
6176
  file: "src/judgment/index.ts",
6194
- marker: "VERCEL_JUDGMENT_PROVIDER) {\n\t\t\tconst vercel = new VercelJudge(",
6195
- excludes: "\tasync #withCandidate<T>(",
6196
- anchor: ` async withCandidate<T>(run: (judge: Judge, kind: JudgeKind) => Promise<T>, options: JudgeOptions = {}): Promise<T> {
6197
- const signal = options.signal;`,
6198
- patched: ` async withCandidate<T>(run: (judge: Judge, kind: JudgeKind) => Promise<T>, options: JudgeOptions = {}): Promise<T> {
6199
- // Explicit Vercel mode: one fixed evaluation request, resolved before the candidate
6200
- // chain so a failure, abort, or missing credential reaches the caller instead of
6201
- // falling back to a chat or local model. Every other value keeps the upstream chain.
6202
- if (cfgJudgmentProvider.get(this.#deps.settings) === VERCEL_JUDGMENT_PROVIDER) {
6203
- const vercel = new VercelJudge({
6204
- apiKey: this.#deps.registry.authStorage.keys.resolver(VERCEL_JUDGMENT_AUTH_PROVIDER, {
6205
- sessionId: this.#deps.sessionId,
6206
- }),
6207
- fetch: this.#deps.fetch,
6208
- });
6209
- return run(usageReportingVercelJudge(vercel, this.#deps.onUsage), "native");
6210
- }
6211
- const signal = options.signal;`,
6212
- // 2026-10-16 18.11.1 ADAPT: upstream 이 후보 loop 를 private `#withCandidate(run, options, requiresImages)` 로 옮기고 공개
6213
- // `withCandidate` 는 그 위의 얇은 wrapper 로 만들었다(이미지 판정, #15471). `judge()` 도 이제 `withCandidate` 가 아니라
6214
- // `#withCandidate` 를 직접 부르므로 분기는 반드시 `#withCandidate` 안에 있어야 두 진입점을 모두 덮는다(wrapper 에 두면 judge()
6215
- // 가 명시 vercel 을 우회해 후보 chain 으로 간다). 이미지 요청은 upstream 계약대로 명시 실패한다 — VercelJudge 는 state·questions
6216
- // 만 보내므로 이미지를 조용히 버리면 안 된다. run 의 세 번째 인자(model)는 `online` 이미지 정규화에만 쓰이고 native 는 읽지
6217
- // 않아 형만 맞춘다. 판 구분은 18.11.1 에만 있는 `#withCandidate` 선언이고, 본 후보는 `excludes`, 이 후보는 `requires` 다.
6218
- alternates: [{
6219
- file: "src/judgment/index.ts",
6220
- requires: "\tasync #withCandidate<T>(",
6221
- marker: "VERCEL_JUDGMENT_PROVIDER) {\n\t\t\t// The fixed evaluation request carries no images;",
6222
- anchor: ` async #withCandidate<T>(
6223
- run: (judge: Judge, kind: JudgeKind, model: Model) => Promise<T>,
6224
- options: JudgeOptions,
6225
- requiresImages: boolean,
6226
- ): Promise<T> {
6227
- const signal = options.signal;`,
6228
- patched: ` async #withCandidate<T>(
6229
- run: (judge: Judge, kind: JudgeKind, model: Model) => Promise<T>,
6230
- options: JudgeOptions,
6231
- requiresImages: boolean,
6232
- ): Promise<T> {
6233
- // Explicit Vercel mode: one fixed evaluation request, resolved before the candidate
6234
- // chain so a failure, abort, or missing credential reaches the caller instead of
6235
- // falling back to a chat or local model. Every other value keeps the upstream chain.
6236
- if (cfgJudgmentProvider.get(this.#deps.settings) === VERCEL_JUDGMENT_PROVIDER) {
6237
- // The fixed evaluation request carries no images; fail like every image-incapable candidate rather than drop them.
6238
- if (requiresImages) throw new Error("judgment: no compatible judge candidate supports images");
6239
- const vercel = new VercelJudge({
6240
- apiKey: this.#deps.registry.authStorage.keys.resolver(VERCEL_JUDGMENT_AUTH_PROVIDER, {
6241
- sessionId: this.#deps.sessionId,
6242
- }),
6243
- fetch: this.#deps.fetch,
6244
- });
6245
- // "native" never reads \`model\` (only the "online" image path does), so the session model stands in for its type.
6246
- return run(usageReportingVercelJudge(vercel, this.#deps.onUsage), "native", this.#deps.sessionModel as Model);
6247
- }
6248
- const signal = options.signal;`,
6249
- }],
6177
+ marker: "\t\tconst requiresImages = images.length > 0;\n\t\tconst signal = options.signal;\n",
6178
+ anchor: "\t\tconst requiresImages = images.length > 0;\n\t\tconst signal = options.signal;\n",
6179
+ patched: "\t\tconst requiresImages = images.length > 0;\n\t\tconst signal = options.signal;\n",
6180
+ legacyPatched: [
6181
+ "\t\tconst requiresImages = images.length > 0;",
6182
+ "\t\t// Explicit Vercel mode: one fixed evaluation request, resolved before the candidate",
6183
+ "\t\t// chain so a failure, abort, or missing credential reaches the caller instead of",
6184
+ "\t\t// falling back to a chat or local model. Every other value keeps the upstream chain.",
6185
+ "\t\tif (cfgJudgmentProvider.get(this.#deps.settings) === VERCEL_JUDGMENT_PROVIDER) {",
6186
+ "\t\t\t// The fixed evaluation request carries no images; fail like every image-incapable candidate rather than drop them.",
6187
+ '\t\t\tif (requiresImages) throw new Error("judgment: no compatible judge candidate supports images");',
6188
+ "\t\t\tconst vercel = new VercelJudge({",
6189
+ "\t\t\t\tapiKey: this.#deps.registry.authStorage.keys.resolver(VERCEL_JUDGMENT_AUTH_PROVIDER, {",
6190
+ "\t\t\t\t\tsessionId: this.#deps.sessionId,",
6191
+ "\t\t\t\t}),",
6192
+ "\t\t\t\tfetch: this.#deps.fetch,",
6193
+ "\t\t\t});",
6194
+ '\t\t\t// "native" never reads `model` (only the "online" image path does), so the session model stands in for its type.',
6195
+ '\t\t\treturn run(usageReportingVercelJudge(vercel, this.#deps.onUsage), "native", this.#deps.sessionModel as Model);',
6196
+ "\t\t}",
6197
+ "\t\tconst signal = options.signal;",
6198
+ "",
6199
+ ].join("\n"),
6250
6200
  },
6251
6201
  {
6252
- // 18.3.1 에는 `Settings.get` 이 없다. 위 분기는 typed handle 로 읽으므로 그 import 를 넣는다.
6202
+ // 2026-10-17 RETIRE(Vercel 판정 모드 제거): 위 분기가 읽던 typed handle import.
6253
6203
  file: "src/judgment/index.ts",
6254
- marker: 'import type { Settings } from "../config/settings";\nimport { cfgJudgmentProvider } from "../config/model-settings";',
6204
+ marker: 'import type { Settings } from "../config/settings";',
6255
6205
  anchor: 'import type { Settings } from "../config/settings";',
6256
- patched: `import type { Settings } from "../config/settings";
6257
- import { cfgJudgmentProvider } from "../config/model-settings";`,
6206
+ patched: 'import type { Settings } from "../config/settings";',
6207
+ legacyPatched: 'import type { Settings } from "../config/settings";\nimport { cfgJudgmentProvider } from "../config/model-settings";',
6258
6208
  },
6259
6209
  // 2026-10-17 RETIRE(사용자 결정: Experiential 탈퇴): typesafe 경로를 Experiential Labs gateway 로 보내던 설정을 지웠으므로
6260
6210
  // 그 gateway decoder 의 32문항 한도(MAX_DECISION_QUESTIONS) 때문에 judge chain 이 typesafe 요청을 32개씩 나누던
@@ -6299,92 +6249,71 @@ import { cfgJudgmentProvider } from "../config/model-settings";`,
6299
6249
  ].join("\n"),
6300
6250
  },
6301
6251
  {
6302
- // 18.2.7 에는 `providers.judgmentProvider` schema 항목 자체가 없다(legacy key 목록에만
6303
- // 남아 migration 이 소비한다). 이 빌드의 로컬 선택 설정으로 최소 enum 만 되살린다:
6304
- // auto=upstream judge role chain, vercel=one-shot no fallback. upstream 에서 제거된
6305
- // typesafe/llm selector 는 되살리지 않는다. `SETTING_PATH_SEGMENTS` 가 schema 키에서
6306
- // 파생되므로 이 항목이 있어야 `settings.get("providers.judgmentProvider")` 가 성립한다.
6307
- file: "src/config/settings-schema.ts",
6308
- marker: `"providers.judgmentProvider": {`,
6309
- anchor: ` "providers.autoThinkingMaxEffort": {`,
6310
- patched: ` "providers.judgmentProvider": {
6311
- type: "enum",
6312
- values: ["auto", "vercel"] as const,
6313
- default: "auto",
6314
- ui: {
6315
- tab: "providers",
6316
- group: "Judgment",
6317
- label: "Judgment Provider",
6318
- description:
6319
- "Backend for typed judgments (auto-thinking difficulty, Smart unexpected-stop detection, git AI staging, eval judge()). \`auto\` uses the judge model role chain (native judgment APIs, then chat/local candidates). \`vercel\` runs one fixed Vercel AI Gateway evaluation request and never falls back to a chat or local model.",
6320
- options: [
6321
- { value: "auto", label: "Auto", description: "Judge model role chain (default)" },
6322
- {
6323
- value: "vercel",
6324
- label: "Vercel Jev",
6325
- description: "One fixed evaluation request; failures never fall back",
6326
- },
6327
- ],
6328
- },
6329
- },
6330
- "providers.autoThinkingMaxEffort": {`,
6331
- alternates: [{
6332
- file: "src/config/model-settings.ts",
6333
- marker: 'id: "providers.judgmentProvider"',
6334
- anchor: 'export const cfgModelRoles = register({ id: "modelRoles", type: "record", default: EMPTY_STRING_RECORD });',
6335
- patched: `export const cfgModelRoles = register({ id: "modelRoles", type: "record", default: EMPTY_STRING_RECORD });
6336
-
6337
- export const cfgJudgmentProvider = register({
6338
- id: "providers.judgmentProvider",
6339
- type: "enum",
6340
- values: ["auto", "vercel"] as const,
6341
- default: "auto",
6342
- ui: {
6343
- tab: "providers",
6344
- group: "Judgment",
6345
- label: "Judgment Provider",
6346
- description:
6347
- "Backend for typed judgments (auto-thinking difficulty, Smart unexpected-stop detection, git AI staging, eval judge()). \`auto\` uses the judge model role chain (native judgment APIs, then chat/local candidates). \`vercel\` runs one fixed Vercel AI Gateway evaluation request and never falls back to a chat or local model.",
6348
- options: [
6349
- { value: "auto", label: "Auto", description: "Judge model role chain (default)" },
6350
- { value: "vercel", label: "Vercel Jev", description: "One fixed evaluation request; failures never fall back" },
6351
- ],
6352
- },
6353
- });`,
6354
- }],
6252
+ // 2026-10-17 RETIRE(Vercel 판정 모드 제거): model-settings.ts 의 `providers.judgmentProvider` enum(auto·vercel) 등록. 이 값은 이제
6253
+ // upstream 18.11.3 의 legacy 설정 키로만 남는다. `vercel` 을 남긴 사용자 설정은 upstream migration 이 받는다(core-jev-judgment-test.ts).
6254
+ file: "src/config/model-settings.ts",
6255
+ marker: 'export const cfgModelRoles = register({ id: "modelRoles", type: "record", default: EMPTY_STRING_RECORD });',
6256
+ anchor: 'export const cfgModelRoles = register({ id: "modelRoles", type: "record", default: EMPTY_STRING_RECORD });',
6257
+ patched: 'export const cfgModelRoles = register({ id: "modelRoles", type: "record", default: EMPTY_STRING_RECORD });',
6258
+ legacyPatched: [
6259
+ 'export const cfgModelRoles = register({ id: "modelRoles", type: "record", default: EMPTY_STRING_RECORD });',
6260
+ "",
6261
+ "export const cfgJudgmentProvider = register({",
6262
+ '\tid: "providers.judgmentProvider",',
6263
+ '\ttype: "enum",',
6264
+ '\tvalues: ["auto", "vercel"] as const,',
6265
+ '\tdefault: "auto",',
6266
+ "\tui: {",
6267
+ '\t\ttab: "providers",',
6268
+ '\t\tgroup: "Judgment",',
6269
+ '\t\tlabel: "Judgment Provider",',
6270
+ "\t\tdescription:",
6271
+ '\t\t\t"Backend for typed judgments (auto-thinking difficulty, Smart unexpected-stop detection, git AI staging, eval judge()). `auto` uses the judge model role chain (native judgment APIs, then chat/local candidates). `vercel` runs one fixed Vercel AI Gateway evaluation request and never falls back to a chat or local model.",',
6272
+ "\t\toptions: [",
6273
+ '\t\t\t{ value: "auto", label: "Auto", description: "Judge model role chain (default)" },',
6274
+ '\t\t\t{ value: "vercel", label: "Vercel Jev", description: "One fixed evaluation request; failures never fall back" },',
6275
+ "\t\t],",
6276
+ "\t},",
6277
+ "});",
6278
+ ].join("\n"),
6355
6279
  },
6356
6280
  {
6357
- // 18.2.7 은 `providers.judgmentProvider` 를 legacy selector 로 보고 값을 읽은 뒤 키를
6358
- // 지운다(config/settings.ts:2847,2887-2902). 값이 `vercel` 이면 그것은 이 빌드의 로컬
6359
- // one-shot adapter 선택이므로 키를 남기고 legacy judge role 주입도 건너뛴다. auto/typesafe/
6360
- // llm/undefined 는 upstream migration 그대로다.
6281
+ // 2026-10-17 RETIRE(Vercel 판정 모드 제거): legacy `judgmentProvider: vercel` 을 로컬 설정으로 살리던 migration 예외 셋(아래 세 항목).
6282
+ // 되돌리면 upstream 처럼 `vercel` 도 비-auto legacy 선택자로 읽혀 judge role chain 으로 옮겨지고 키는 지워진다.
6361
6283
  file: "src/config/settings.ts",
6362
- marker: `const localVercelJudgment = legacyJudgmentProvider === "vercel";`,
6363
- anchor: ` const legacyJudgmentProvider = legacy(providerSettings, "judgmentProvider", "providers.judgmentProvider");`,
6364
- patched: ` const legacyJudgmentProvider = legacy(providerSettings, "judgmentProvider", "providers.judgmentProvider");
6365
- // \`vercel\` selects this build's local one-shot Vercel judge adapter, not a retired
6366
- // provider selector: keep the key and skip the legacy judge role injection for it.
6367
- const localVercelJudgment = legacyJudgmentProvider === "vercel";`,
6284
+ marker: '\t\t\tconst legacyJudgmentProvider = legacy(providerSettings, "judgmentProvider", "providers.judgmentProvider");',
6285
+ anchor: '\t\t\tconst legacyJudgmentProvider = legacy(providerSettings, "judgmentProvider", "providers.judgmentProvider");',
6286
+ patched: '\t\t\tconst legacyJudgmentProvider = legacy(providerSettings, "judgmentProvider", "providers.judgmentProvider");',
6287
+ legacyPatched: [
6288
+ '\t\t\tconst legacyJudgmentProvider = legacy(providerSettings, "judgmentProvider", "providers.judgmentProvider");',
6289
+ "\t\t\t// `vercel` selects this build's local one-shot Vercel judge adapter, not a retired",
6290
+ "\t\t\t// provider selector: keep the key and skip the legacy judge role injection for it.",
6291
+ '\t\t\tconst localVercelJudgment = legacyJudgmentProvider === "vercel";',
6292
+ ].join("\n"),
6368
6293
  },
6369
6294
  {
6370
6295
  file: "src/config/settings.ts",
6371
- marker: `const nonDefaultJudge =
6372
- (!localVercelJudgment &&`,
6373
- anchor: ` const nonDefaultJudge =
6374
- (typeof legacyJudgmentProvider === "string" && legacyJudgmentProvider !== "auto") ||`,
6375
- patched: ` const nonDefaultJudge =
6376
- (!localVercelJudgment &&
6377
- typeof legacyJudgmentProvider === "string" &&
6378
- legacyJudgmentProvider !== "auto") ||`,
6296
+ marker: '\t\t\tconst nonDefaultJudge =\n\t\t\t\t(typeof legacyJudgmentProvider === "string" && legacyJudgmentProvider !== "auto") ||',
6297
+ anchor: '\t\t\tconst nonDefaultJudge =\n\t\t\t\t(typeof legacyJudgmentProvider === "string" && legacyJudgmentProvider !== "auto") ||',
6298
+ patched: '\t\t\tconst nonDefaultJudge =\n\t\t\t\t(typeof legacyJudgmentProvider === "string" && legacyJudgmentProvider !== "auto") ||',
6299
+ legacyPatched: [
6300
+ "\t\t\tconst nonDefaultJudge =",
6301
+ "\t\t\t\t(!localVercelJudgment &&",
6302
+ '\t\t\t\t\ttypeof legacyJudgmentProvider === "string" &&',
6303
+ '\t\t\t\t\tlegacyJudgmentProvider !== "auto") ||',
6304
+ ].join("\n"),
6379
6305
  },
6380
6306
  {
6381
6307
  file: "src/config/settings.ts",
6382
- marker: `if (key === "judgmentProvider" && localVercelJudgment) continue;`,
6383
- anchor: ` removeLegacy(providerSettings, key, \`providers.\${key}\`);`,
6384
- patched: ` // The local explicit mode is a live selection setting, not a retired
6385
- // selector; it must survive for the judge adapter to read.
6386
- if (key === "judgmentProvider" && localVercelJudgment) continue;
6387
- removeLegacy(providerSettings, key, \`providers.\${key}\`);`,
6308
+ marker: "\t\t\t\tremoveLegacy(providerSettings, key, `providers.${key}`);",
6309
+ anchor: "\t\t\t\tremoveLegacy(providerSettings, key, `providers.${key}`);",
6310
+ patched: "\t\t\t\tremoveLegacy(providerSettings, key, `providers.${key}`);",
6311
+ legacyPatched: [
6312
+ "\t\t\t\t// The local explicit mode is a live selection setting, not a retired",
6313
+ "\t\t\t\t// selector; it must survive for the judge adapter to read.",
6314
+ '\t\t\t\tif (key === "judgmentProvider" && localVercelJudgment) continue;',
6315
+ "\t\t\t\tremoveLegacy(providerSettings, key, `providers.${key}`);",
6316
+ ].join("\n"),
6388
6317
  },
6389
6318
  // --- usage 보고의 저장 행 귀속 (localCredentialId) ---
6390
6319
  // API 키 계정(opencode-go 등)의 usage 보고에는 email·accountId가 없어 localCredentialId가
@@ -14957,8 +14886,8 @@ interface ComputerElementRef
14957
14886
  // 2026-10-17 18.11.3 이식(공개 이슈 #31·#33 포함). 18.11.1 후보는 한 바이트도 바꾸지 않고, 18.11.3 순정에서 앵커를 잃은 항목마다
14958
14887
  // 그 판에만 성립하는 후보를 더한다. marker 를 공유하는 후보는 18.11.3 에만 있는 문자열로 requires(새 후보)·excludes(옛 후보)를
14959
14888
  // 짝지어 서로 배타적으로 둔다.
14960
- // - ADAPT: IRC steer bracket(in-flight epoch), wake-turn 판정·완료 기록(publishMessageResult·messageResult), Vercel judge
14961
- // (#31: #withCandidate 의 셋째 인자가 images 배열), task schema 의 seance 필드, recall 의 tool 가중(env 로 바뀜).
14889
+ // - ADAPT: IRC steer bracket(in-flight epoch), wake-turn 판정·완료 기록(publishMessageResult·messageResult),
14890
+ // task schema 의 seance 필드, recall 의 tool 가중(env 로 바뀜).
14962
14891
  // - RETIRE: upstream 이 seance 와 함께 넣은 task model 타입·전달 줄(같은 줄을 두 번 넣지 않는다. 특히 TaskItem·TaskParams 의
14963
14892
  // `model?: string` 은 upstream 의 `string | string[]` 과 겹쳐 TS2717 이 된다), 번들의 advisor transcript filter 새 이름.
14964
14893
  {
@@ -15073,23 +15002,6 @@ interface ComputerElementRef
15073
15002
  patched: swap(completion.patched, ...resultBranch),
15074
15003
  });
15075
15004
 
15076
- // #31 Vercel judge: 18.11.2 부터 #withCandidate 의 셋째 인자가 images 배열이고 첫 줄에서 requiresImages 를 계산하며 후보는
15077
- // #resolveCandidates(images) 로 고른다. upstream 세 줄은 그대로 두고 명시 Vercel 분기를 requiresImages 계산 바로 뒤에 둔다.
15078
- // 고정 평가 요청은 이미지를 싣지 않으므로 이미지 요청은 명시적으로 거절하고, 텍스트 요청은 한 번만 보내 usage 를 한 번 남기며
15079
- // chat/local 후보로 넘어가지 않는다(18.11.1 후보와 같은 본문).
15080
- const IMAGES_18112 = "const requiresImages = images.length > 0;";
15081
- const vercel = one(entry => entry.file === "src/judgment/index.ts" && entry.marker.startsWith("VERCEL_JUDGMENT_PROVIDER) {\n\t\t\tconst vercel = new VercelJudge("), "Vercel judge");
15082
- const vercelPrivate = vercel.alternates.find(candidate => candidate.requires === "\tasync #withCandidate<T>(");
15083
- const imagesArg = ["\t\trequiresImages: boolean,\n\t): Promise<T> {\n", `\t\timages: readonly ImageContent[],\n\t): Promise<T> {\n\t\t${IMAGES_18112}\n`];
15084
- vercelPrivate.excludes = IMAGES_18112;
15085
- vercel.alternates.push({
15086
- file: vercel.file,
15087
- requires: IMAGES_18112,
15088
- marker: vercelPrivate.marker,
15089
- anchor: swap(vercelPrivate.anchor, ...imagesArg),
15090
- patched: swap(vercelPrivate.patched, ...imagesArg),
15091
- });
15092
-
15093
15005
  // recall 가중: upstream 이 상수표를 env 로 읽는 resolveTrustWeights 로 바꿨다(MNEMOPI_TOOL_WEIGHT, 기본 0.5). learn/retain 의
15094
15006
  // 의도적 기록 가중 1.0 은 기본값으로만 지키고, 사용자가 env 로 정한 값은 그대로 따른다.
15095
15007
  const TRUST_18113 = "function resolveTrustWeights(";
@@ -15306,6 +15218,13 @@ function main() {
15306
15218
  // (tab-supervisor.ts) 앞 항목이 이미 디스크를 바꿔 놓았으므로, 스냅샷으로
15307
15219
  // 되돌리면 그 편집이 통째로 되살아난다. 항상 현재 내용을 읽어서 치환한다.
15308
15220
  const current = readFileSync(s.path, "utf8");
15221
+ // retire 항목(patched === anchor, no-op)은 옛 적용본(legacyPatched)이 anchor 를 부분 문자열로 품어 아래 patched 검사가 항상 먼저
15222
+ // 걸리고 아무것도 되돌리지 못한다. 옛 패치가 실린 상태면 그 본문을 먼저 anchor 로 되돌린다.
15223
+ if (s.status === "legacy" && s.patched === s.anchor && s.legacyPatched && current.includes(s.legacyPatched)) {
15224
+ writeFileSync(s.path, current.replace(s.legacyPatched, s.anchor), "utf8");
15225
+ console.log(` 복원 ${s.file} (옛 패치)`);
15226
+ continue;
15227
+ }
15309
15228
  if (current.includes(s.patched)) {
15310
15229
  writeFileSync(s.path, current.replace(s.patched, s.anchor), "utf8");
15311
15230
  console.log(` 복원 ${s.file}`);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "cuelo",
3
- "version": "0.10.21",
3
+ "version": "0.10.23",
4
4
  "description": "CUELO — open-source AI coding agent workspace and harness for omp (oh-my-pi)",
5
5
  "homepage": "https://github.com/gim47656-ship-it/CUELO#readme",
6
6
  "repository": {