cuelo 0.5.9 → 0.6.1

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 (296) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/app-path-routes-manifest.json +6 -7
  3. package/.next/build-manifest.json +2 -2
  4. package/.next/prerender-manifest.json +3 -3
  5. package/.next/required-server-files.js +2 -2
  6. package/.next/required-server-files.json +2 -2
  7. package/.next/routes-manifest.json +0 -6
  8. package/.next/server/app/_global-error/page.js +3 -3
  9. package/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  10. package/.next/server/app/_global-error.html +1 -1
  11. package/.next/server/app/_global-error.rsc +1 -1
  12. package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  13. package/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  14. package/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  15. package/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  16. package/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  17. package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  18. package/.next/server/app/_not-found/page.js +2 -2
  19. package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  20. package/.next/server/app/_not-found.html +1 -1
  21. package/.next/server/app/_not-found.rsc +2 -2
  22. package/.next/server/app/_not-found.segments/_full.segment.rsc +2 -2
  23. package/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  24. package/.next/server/app/_not-found.segments/_index.segment.rsc +2 -2
  25. package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  26. package/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  27. package/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  28. package/.next/server/app/api/agent/[id]/account/route.js +1 -1
  29. package/.next/server/app/api/agent/[id]/bash-output/route.js +1 -1
  30. package/.next/server/app/api/agent/[id]/events/route.js +2 -2
  31. package/.next/server/app/api/agent/[id]/route.js +1 -1
  32. package/.next/server/app/api/agent/new/route.js +1 -1
  33. package/.next/server/app/api/agent/running/route.js +1 -1
  34. package/.next/server/app/api/attachments/route.js +2 -2
  35. package/.next/server/app/api/auth/all-providers/route.js +1 -1
  36. package/.next/server/app/api/auth/api-key/[provider]/route.js +1 -1
  37. package/.next/server/app/api/auth/login/[provider]/route.js +2 -2
  38. package/.next/server/app/api/auth/logout/[provider]/route.js +1 -1
  39. package/.next/server/app/api/auth/providers/route.js +1 -1
  40. package/.next/server/app/api/cwd/browse/route.js +1 -1
  41. package/.next/server/app/api/cwd/validate/route.js +1 -1
  42. package/.next/server/app/api/default-cwd/route.js +1 -1
  43. package/.next/server/app/api/display-settings/route.js +1 -1
  44. package/.next/server/app/api/document-text/route.js +2 -2
  45. package/.next/server/app/api/experiments/route.js +1 -1
  46. package/.next/server/app/api/file-index/route.js +1 -1
  47. package/.next/server/app/api/files/[...path]/route.js +1 -1
  48. package/.next/server/app/api/git/diff/route.js +1 -1
  49. package/.next/server/app/api/git/status/route.js +2 -2
  50. package/.next/server/app/api/gpt6/handles/route.js +1 -1
  51. package/.next/server/app/api/gpt6/reply/route.js +1 -1
  52. package/.next/server/app/api/gpt6/token/route.js +1 -1
  53. package/.next/server/app/api/gpt6/web6-session/route.js +1 -1
  54. package/.next/server/app/api/home/route.js +1 -1
  55. package/.next/server/app/api/live/call/[callId]/route.js +1 -1
  56. package/.next/server/app/api/live/events/route.js +2 -2
  57. package/.next/server/app/api/live/offer/route.js +1 -1
  58. package/.next/server/app/api/live/voices/route.js +1 -1
  59. package/.next/server/app/api/mcp/route.js +2 -2
  60. package/.next/server/app/api/model-roles/route.js +1 -1
  61. package/.next/server/app/api/models/route.js +1 -1
  62. package/.next/server/app/api/models-config/catalog/route.js +1 -1
  63. package/.next/server/app/api/models-config/discover/route.js +1 -1
  64. package/.next/server/app/api/models-config/route.js +2 -2
  65. package/.next/server/app/api/models-config/test/route.js +1 -1
  66. package/.next/server/app/api/plugins/route.js +1 -1
  67. package/.next/server/app/api/project-trust/route.js +1 -1
  68. package/.next/server/app/api/projects/route.js +1 -1
  69. package/.next/server/app/api/runs/[runId]/route.js +1 -1
  70. package/.next/server/app/api/runs/route.js +1 -1
  71. package/.next/server/app/api/sessions/[id]/auto-name/route.js +1 -1
  72. package/.next/server/app/api/sessions/[id]/context/route.js +1 -1
  73. package/.next/server/app/api/sessions/[id]/entries/[entryId]/thinking/route.js +1 -1
  74. package/.next/server/app/api/sessions/[id]/export/route.js +1 -1
  75. package/.next/server/app/api/sessions/[id]/route.js +1 -1
  76. package/.next/server/app/api/sessions/[id]/state/route.js +1 -1
  77. package/.next/server/app/api/sessions/route.js +1 -1
  78. package/.next/server/app/api/settings/route.js +1 -1
  79. package/.next/server/app/api/sidecars/[service]/[...path]/route.js +1 -1
  80. package/.next/server/app/api/skills/check/route.js +1 -1
  81. package/.next/server/app/api/skills/install/route.js +2 -2
  82. package/.next/server/app/api/skills/route.js +2 -2
  83. package/.next/server/app/api/skills/search/route.js +1 -1
  84. package/.next/server/app/api/skills/update/route.js +1 -1
  85. package/.next/server/app/api/theme/route.js +1 -1
  86. package/.next/server/app/api/tool-image/route.js +1 -1
  87. package/.next/server/app/api/update-maintenance/route.js +2 -2
  88. package/.next/server/app/api/updates/route.js +1 -1
  89. package/.next/server/app/api/web-access/recovery/route.js +1 -1
  90. package/.next/server/app/api/web-access/route.js +1 -1
  91. package/.next/server/app/api/web6/consults/route.js +1 -1
  92. package/.next/server/app/api/worktrees/route.js +1 -1
  93. package/.next/server/app/favicon.ico/route.js +1 -1
  94. package/.next/server/app/index.html +1 -1
  95. package/.next/server/app/index.rsc +4 -4
  96. package/.next/server/app/index.segments/__PAGE__.segment.rsc +3 -3
  97. package/.next/server/app/index.segments/_full.segment.rsc +4 -4
  98. package/.next/server/app/index.segments/_head.segment.rsc +1 -1
  99. package/.next/server/app/index.segments/_index.segment.rsc +2 -2
  100. package/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  101. package/.next/server/app/manifest.webmanifest/route.js +2 -2
  102. package/.next/server/app/page.js +15 -15
  103. package/.next/server/app/page_client-reference-manifest.js +1 -1
  104. package/.next/server/app/recover/page.js +2 -2
  105. package/.next/server/app/recover/page_client-reference-manifest.js +1 -1
  106. package/.next/server/app/recover.html +1 -1
  107. package/.next/server/app/recover.rsc +2 -2
  108. package/.next/server/app/recover.segments/_full.segment.rsc +2 -2
  109. package/.next/server/app/recover.segments/_head.segment.rsc +1 -1
  110. package/.next/server/app/recover.segments/_index.segment.rsc +2 -2
  111. package/.next/server/app/recover.segments/_tree.segment.rsc +1 -1
  112. package/.next/server/app/recover.segments/recover/__PAGE__.segment.rsc +1 -1
  113. package/.next/server/app/recover.segments/recover.segment.rsc +1 -1
  114. package/.next/server/app-paths-manifest.json +6 -7
  115. package/.next/server/chunks/3379.js +1 -1
  116. package/.next/server/chunks/5582.js +3 -9
  117. package/.next/server/middleware-build-manifest.js +1 -1
  118. package/.next/server/pages/404.html +1 -1
  119. package/.next/server/pages/500.html +1 -1
  120. package/.next/server/server-reference-manifest.json +1 -1
  121. package/.next/static/9IHPWkHderLIQA0fYAPmt/_buildManifest.js +1 -0
  122. package/.next/static/chunks/app/_global-error/page-0c0ee2cbde2b8cfd.js +1 -0
  123. package/.next/static/chunks/app/api/agent/[id]/account/route-0c0ee2cbde2b8cfd.js +1 -0
  124. package/.next/static/chunks/app/api/agent/[id]/bash-output/route-0c0ee2cbde2b8cfd.js +1 -0
  125. package/.next/static/chunks/app/api/agent/[id]/events/route-0c0ee2cbde2b8cfd.js +1 -0
  126. package/.next/static/chunks/app/api/agent/[id]/route-0c0ee2cbde2b8cfd.js +1 -0
  127. package/.next/static/chunks/app/api/agent/new/route-0c0ee2cbde2b8cfd.js +1 -0
  128. package/.next/static/chunks/app/api/agent/running/route-0c0ee2cbde2b8cfd.js +1 -0
  129. package/.next/static/chunks/app/api/attachments/route-0c0ee2cbde2b8cfd.js +1 -0
  130. package/.next/static/chunks/app/api/auth/all-providers/route-0c0ee2cbde2b8cfd.js +1 -0
  131. package/.next/static/chunks/app/api/auth/api-key/[provider]/route-0c0ee2cbde2b8cfd.js +1 -0
  132. package/.next/static/chunks/app/api/auth/login/[provider]/route-0c0ee2cbde2b8cfd.js +1 -0
  133. package/.next/static/chunks/app/api/auth/logout/[provider]/route-0c0ee2cbde2b8cfd.js +1 -0
  134. package/.next/static/chunks/app/api/auth/providers/route-0c0ee2cbde2b8cfd.js +1 -0
  135. package/.next/static/chunks/app/api/cwd/browse/route-0c0ee2cbde2b8cfd.js +1 -0
  136. package/.next/static/chunks/app/api/cwd/validate/route-0c0ee2cbde2b8cfd.js +1 -0
  137. package/.next/static/chunks/app/api/default-cwd/route-0c0ee2cbde2b8cfd.js +1 -0
  138. package/.next/static/chunks/app/api/display-settings/route-0c0ee2cbde2b8cfd.js +1 -0
  139. package/.next/static/chunks/app/api/document-text/route-0c0ee2cbde2b8cfd.js +1 -0
  140. package/.next/static/chunks/app/api/experiments/route-0c0ee2cbde2b8cfd.js +1 -0
  141. package/.next/static/chunks/app/api/file-index/route-0c0ee2cbde2b8cfd.js +1 -0
  142. package/.next/static/chunks/app/api/files/[...path]/route-0c0ee2cbde2b8cfd.js +1 -0
  143. package/.next/static/chunks/app/api/git/diff/route-0c0ee2cbde2b8cfd.js +1 -0
  144. package/.next/static/chunks/app/api/git/status/route-0c0ee2cbde2b8cfd.js +1 -0
  145. package/.next/static/chunks/app/api/gpt6/handles/route-0c0ee2cbde2b8cfd.js +1 -0
  146. package/.next/static/chunks/app/api/gpt6/reply/route-0c0ee2cbde2b8cfd.js +1 -0
  147. package/.next/static/chunks/app/api/gpt6/token/route-0c0ee2cbde2b8cfd.js +1 -0
  148. package/.next/static/chunks/app/api/gpt6/web6-session/route-0c0ee2cbde2b8cfd.js +1 -0
  149. package/.next/static/chunks/app/api/home/route-0c0ee2cbde2b8cfd.js +1 -0
  150. package/.next/static/chunks/app/api/live/call/[callId]/route-0c0ee2cbde2b8cfd.js +1 -0
  151. package/.next/static/chunks/app/api/live/events/route-0c0ee2cbde2b8cfd.js +1 -0
  152. package/.next/static/chunks/app/api/live/offer/route-0c0ee2cbde2b8cfd.js +1 -0
  153. package/.next/static/chunks/app/api/live/voices/route-0c0ee2cbde2b8cfd.js +1 -0
  154. package/.next/static/chunks/app/api/mcp/route-0c0ee2cbde2b8cfd.js +1 -0
  155. package/.next/static/chunks/app/api/model-roles/route-0c0ee2cbde2b8cfd.js +1 -0
  156. package/.next/static/chunks/app/api/models/route-0c0ee2cbde2b8cfd.js +1 -0
  157. package/.next/static/chunks/app/api/models-config/catalog/route-0c0ee2cbde2b8cfd.js +1 -0
  158. package/.next/static/chunks/app/api/models-config/discover/route-0c0ee2cbde2b8cfd.js +1 -0
  159. package/.next/static/chunks/app/api/models-config/route-0c0ee2cbde2b8cfd.js +1 -0
  160. package/.next/static/chunks/app/api/models-config/test/route-0c0ee2cbde2b8cfd.js +1 -0
  161. package/.next/static/chunks/app/api/plugins/route-0c0ee2cbde2b8cfd.js +1 -0
  162. package/.next/static/chunks/app/api/project-trust/route-0c0ee2cbde2b8cfd.js +1 -0
  163. package/.next/static/chunks/app/api/projects/route-0c0ee2cbde2b8cfd.js +1 -0
  164. package/.next/static/chunks/app/api/runs/[runId]/route-0c0ee2cbde2b8cfd.js +1 -0
  165. package/.next/static/chunks/app/api/runs/route-0c0ee2cbde2b8cfd.js +1 -0
  166. package/.next/static/chunks/app/api/sessions/[id]/auto-name/route-0c0ee2cbde2b8cfd.js +1 -0
  167. package/.next/static/chunks/app/api/sessions/[id]/context/route-0c0ee2cbde2b8cfd.js +1 -0
  168. package/.next/static/chunks/app/api/sessions/[id]/entries/[entryId]/thinking/route-0c0ee2cbde2b8cfd.js +1 -0
  169. package/.next/static/chunks/app/api/sessions/[id]/export/route-0c0ee2cbde2b8cfd.js +1 -0
  170. package/.next/static/chunks/app/api/sessions/[id]/route-0c0ee2cbde2b8cfd.js +1 -0
  171. package/.next/static/chunks/app/api/sessions/[id]/state/route-0c0ee2cbde2b8cfd.js +1 -0
  172. package/.next/static/chunks/app/api/sessions/route-0c0ee2cbde2b8cfd.js +1 -0
  173. package/.next/static/chunks/app/api/settings/route-0c0ee2cbde2b8cfd.js +1 -0
  174. package/.next/static/chunks/app/api/sidecars/[service]/[...path]/route-0c0ee2cbde2b8cfd.js +1 -0
  175. package/.next/static/chunks/app/api/skills/check/route-0c0ee2cbde2b8cfd.js +1 -0
  176. package/.next/static/chunks/app/api/skills/install/route-0c0ee2cbde2b8cfd.js +1 -0
  177. package/.next/static/chunks/app/api/skills/route-0c0ee2cbde2b8cfd.js +1 -0
  178. package/.next/static/chunks/app/api/skills/search/route-0c0ee2cbde2b8cfd.js +1 -0
  179. package/.next/static/chunks/app/api/skills/update/route-0c0ee2cbde2b8cfd.js +1 -0
  180. package/.next/static/chunks/app/api/theme/route-0c0ee2cbde2b8cfd.js +1 -0
  181. package/.next/static/chunks/app/api/tool-image/route-0c0ee2cbde2b8cfd.js +1 -0
  182. package/.next/static/chunks/app/api/update-maintenance/route-0c0ee2cbde2b8cfd.js +1 -0
  183. package/.next/static/chunks/app/api/updates/route-0c0ee2cbde2b8cfd.js +1 -0
  184. package/.next/static/chunks/app/api/web-access/recovery/route-0c0ee2cbde2b8cfd.js +1 -0
  185. package/.next/static/chunks/app/api/web-access/route-0c0ee2cbde2b8cfd.js +1 -0
  186. package/.next/static/chunks/app/api/web6/consults/route-0c0ee2cbde2b8cfd.js +1 -0
  187. package/.next/static/chunks/app/api/worktrees/route-0c0ee2cbde2b8cfd.js +1 -0
  188. package/.next/static/chunks/app/{layout-40ba82e77e62ae9d.js → layout-43a56002b0fb773b.js} +1 -1
  189. package/.next/static/chunks/app/manifest.webmanifest/route-0c0ee2cbde2b8cfd.js +1 -0
  190. package/.next/static/chunks/app/{page-282a18bb2d229455.js → page-952f237df95e7ee4.js} +10 -10
  191. package/.next/static/chunks/next/dist/client/components/builtin/app-error-0c0ee2cbde2b8cfd.js +1 -0
  192. package/.next/static/chunks/next/dist/client/components/builtin/forbidden-0c0ee2cbde2b8cfd.js +1 -0
  193. package/.next/static/chunks/next/dist/client/components/builtin/not-found-0c0ee2cbde2b8cfd.js +1 -0
  194. package/.next/static/chunks/next/dist/client/components/builtin/unauthorized-0c0ee2cbde2b8cfd.js +1 -0
  195. package/.next/trace +104 -104
  196. package/.next/trace-build +1 -1
  197. package/.next/types/routes.d.ts +1 -2
  198. package/.next/types/validator.ts +0 -9
  199. package/README.md +5 -2
  200. package/Tools/CUELO_Setup/files/native-runtime-patch.js +5 -5
  201. package/Tools/OMP_Global_Config/agent/AGENTS.md +2 -1
  202. package/Tools/OMP_Global_Config/agent/RULES.md +2 -0
  203. package/Tools/OMP_Global_Config/agent/agents/maker.md +3 -3
  204. package/Tools/OMP_Global_Config/agent/extensions/character-voice.ts +83 -14
  205. package/Tools/OMP_Global_Config/agent/extensions/command-guard/index.ts +10 -0
  206. package/Tools/OMP_Global_Config/agent/extensions/lib/maker-routing.ts +4 -4
  207. package/Tools/OMP_Global_Config/agent/extensions/lib/mcp-selection.ts +359 -0
  208. package/Tools/OMP_Global_Config/agent/extensions/mcp-selection.ts +302 -0
  209. package/Tools/OMP_Global_Config/agent/prompt-copies/AGENTS.en.md +3 -2
  210. package/Tools/OMP_Global_Config/agent/prompt-copies/RULES.en.md +3 -1
  211. package/Tools/OMP_Global_Config/agent/rules/harness-policy.json +8 -8
  212. package/Tools/OMP_Global_Config/agent/rules/meta-harness.md +1 -1
  213. package/Tools/OMP_Global_Config/agent/rules/subagent.md +4 -4
  214. package/Tools/OMP_Global_Config/agent/rules/web6-consult.md +7 -8
  215. package/Tools/OMP_Global_Config/agent/sop/maker.md +2 -2
  216. package/Tools/OMP_Global_Config/patches/apply-core-patch.mjs +1118 -57
  217. package/install.mjs +2 -2
  218. package/package.json +7 -7
  219. package/.next/server/app/api/gpt6/mcp/route.js +0 -2
  220. package/.next/server/app/api/gpt6/mcp/route.js.nft.json +0 -1
  221. package/.next/server/app/api/gpt6/mcp/route_client-reference-manifest.js +0 -1
  222. package/.next/static/A4Y1uTUKhMRX6746EPf7m/_buildManifest.js +0 -1
  223. package/.next/static/chunks/app/_global-error/page-44cd4075b01d7a06.js +0 -1
  224. package/.next/static/chunks/app/api/agent/[id]/account/route-44cd4075b01d7a06.js +0 -1
  225. package/.next/static/chunks/app/api/agent/[id]/bash-output/route-44cd4075b01d7a06.js +0 -1
  226. package/.next/static/chunks/app/api/agent/[id]/events/route-44cd4075b01d7a06.js +0 -1
  227. package/.next/static/chunks/app/api/agent/[id]/route-44cd4075b01d7a06.js +0 -1
  228. package/.next/static/chunks/app/api/agent/new/route-44cd4075b01d7a06.js +0 -1
  229. package/.next/static/chunks/app/api/agent/running/route-44cd4075b01d7a06.js +0 -1
  230. package/.next/static/chunks/app/api/attachments/route-44cd4075b01d7a06.js +0 -1
  231. package/.next/static/chunks/app/api/auth/all-providers/route-44cd4075b01d7a06.js +0 -1
  232. package/.next/static/chunks/app/api/auth/api-key/[provider]/route-44cd4075b01d7a06.js +0 -1
  233. package/.next/static/chunks/app/api/auth/login/[provider]/route-44cd4075b01d7a06.js +0 -1
  234. package/.next/static/chunks/app/api/auth/logout/[provider]/route-44cd4075b01d7a06.js +0 -1
  235. package/.next/static/chunks/app/api/auth/providers/route-44cd4075b01d7a06.js +0 -1
  236. package/.next/static/chunks/app/api/cwd/browse/route-44cd4075b01d7a06.js +0 -1
  237. package/.next/static/chunks/app/api/cwd/validate/route-44cd4075b01d7a06.js +0 -1
  238. package/.next/static/chunks/app/api/default-cwd/route-44cd4075b01d7a06.js +0 -1
  239. package/.next/static/chunks/app/api/display-settings/route-44cd4075b01d7a06.js +0 -1
  240. package/.next/static/chunks/app/api/document-text/route-44cd4075b01d7a06.js +0 -1
  241. package/.next/static/chunks/app/api/experiments/route-44cd4075b01d7a06.js +0 -1
  242. package/.next/static/chunks/app/api/file-index/route-44cd4075b01d7a06.js +0 -1
  243. package/.next/static/chunks/app/api/files/[...path]/route-44cd4075b01d7a06.js +0 -1
  244. package/.next/static/chunks/app/api/git/diff/route-44cd4075b01d7a06.js +0 -1
  245. package/.next/static/chunks/app/api/git/status/route-44cd4075b01d7a06.js +0 -1
  246. package/.next/static/chunks/app/api/gpt6/handles/route-44cd4075b01d7a06.js +0 -1
  247. package/.next/static/chunks/app/api/gpt6/mcp/route-44cd4075b01d7a06.js +0 -1
  248. package/.next/static/chunks/app/api/gpt6/reply/route-44cd4075b01d7a06.js +0 -1
  249. package/.next/static/chunks/app/api/gpt6/token/route-44cd4075b01d7a06.js +0 -1
  250. package/.next/static/chunks/app/api/gpt6/web6-session/route-44cd4075b01d7a06.js +0 -1
  251. package/.next/static/chunks/app/api/home/route-44cd4075b01d7a06.js +0 -1
  252. package/.next/static/chunks/app/api/live/call/[callId]/route-44cd4075b01d7a06.js +0 -1
  253. package/.next/static/chunks/app/api/live/events/route-44cd4075b01d7a06.js +0 -1
  254. package/.next/static/chunks/app/api/live/offer/route-44cd4075b01d7a06.js +0 -1
  255. package/.next/static/chunks/app/api/live/voices/route-44cd4075b01d7a06.js +0 -1
  256. package/.next/static/chunks/app/api/mcp/route-44cd4075b01d7a06.js +0 -1
  257. package/.next/static/chunks/app/api/model-roles/route-44cd4075b01d7a06.js +0 -1
  258. package/.next/static/chunks/app/api/models/route-44cd4075b01d7a06.js +0 -1
  259. package/.next/static/chunks/app/api/models-config/catalog/route-44cd4075b01d7a06.js +0 -1
  260. package/.next/static/chunks/app/api/models-config/discover/route-44cd4075b01d7a06.js +0 -1
  261. package/.next/static/chunks/app/api/models-config/route-44cd4075b01d7a06.js +0 -1
  262. package/.next/static/chunks/app/api/models-config/test/route-44cd4075b01d7a06.js +0 -1
  263. package/.next/static/chunks/app/api/plugins/route-44cd4075b01d7a06.js +0 -1
  264. package/.next/static/chunks/app/api/project-trust/route-44cd4075b01d7a06.js +0 -1
  265. package/.next/static/chunks/app/api/projects/route-44cd4075b01d7a06.js +0 -1
  266. package/.next/static/chunks/app/api/runs/[runId]/route-44cd4075b01d7a06.js +0 -1
  267. package/.next/static/chunks/app/api/runs/route-44cd4075b01d7a06.js +0 -1
  268. package/.next/static/chunks/app/api/sessions/[id]/auto-name/route-44cd4075b01d7a06.js +0 -1
  269. package/.next/static/chunks/app/api/sessions/[id]/context/route-44cd4075b01d7a06.js +0 -1
  270. package/.next/static/chunks/app/api/sessions/[id]/entries/[entryId]/thinking/route-44cd4075b01d7a06.js +0 -1
  271. package/.next/static/chunks/app/api/sessions/[id]/export/route-44cd4075b01d7a06.js +0 -1
  272. package/.next/static/chunks/app/api/sessions/[id]/route-44cd4075b01d7a06.js +0 -1
  273. package/.next/static/chunks/app/api/sessions/[id]/state/route-44cd4075b01d7a06.js +0 -1
  274. package/.next/static/chunks/app/api/sessions/route-44cd4075b01d7a06.js +0 -1
  275. package/.next/static/chunks/app/api/settings/route-44cd4075b01d7a06.js +0 -1
  276. package/.next/static/chunks/app/api/sidecars/[service]/[...path]/route-44cd4075b01d7a06.js +0 -1
  277. package/.next/static/chunks/app/api/skills/check/route-44cd4075b01d7a06.js +0 -1
  278. package/.next/static/chunks/app/api/skills/install/route-44cd4075b01d7a06.js +0 -1
  279. package/.next/static/chunks/app/api/skills/route-44cd4075b01d7a06.js +0 -1
  280. package/.next/static/chunks/app/api/skills/search/route-44cd4075b01d7a06.js +0 -1
  281. package/.next/static/chunks/app/api/skills/update/route-44cd4075b01d7a06.js +0 -1
  282. package/.next/static/chunks/app/api/theme/route-44cd4075b01d7a06.js +0 -1
  283. package/.next/static/chunks/app/api/tool-image/route-44cd4075b01d7a06.js +0 -1
  284. package/.next/static/chunks/app/api/update-maintenance/route-44cd4075b01d7a06.js +0 -1
  285. package/.next/static/chunks/app/api/updates/route-44cd4075b01d7a06.js +0 -1
  286. package/.next/static/chunks/app/api/web-access/recovery/route-44cd4075b01d7a06.js +0 -1
  287. package/.next/static/chunks/app/api/web-access/route-44cd4075b01d7a06.js +0 -1
  288. package/.next/static/chunks/app/api/web6/consults/route-44cd4075b01d7a06.js +0 -1
  289. package/.next/static/chunks/app/api/worktrees/route-44cd4075b01d7a06.js +0 -1
  290. package/.next/static/chunks/app/manifest.webmanifest/route-44cd4075b01d7a06.js +0 -1
  291. package/.next/static/chunks/next/dist/client/components/builtin/app-error-44cd4075b01d7a06.js +0 -1
  292. package/.next/static/chunks/next/dist/client/components/builtin/forbidden-44cd4075b01d7a06.js +0 -1
  293. package/.next/static/chunks/next/dist/client/components/builtin/not-found-44cd4075b01d7a06.js +0 -1
  294. package/.next/static/chunks/next/dist/client/components/builtin/unauthorized-44cd4075b01d7a06.js +0 -1
  295. package/.next/types/app/api/gpt6/mcp/route.ts +0 -351
  296. /package/.next/static/{A4Y1uTUKhMRX6746EPf7m → 9IHPWkHderLIQA0fYAPmt}/_ssgManifest.js +0 -0
package/.next/trace-build CHANGED
@@ -1 +1 @@
1
- [{"name":"run-webpack","duration":107189157,"timestamp":901981,"id":14,"parentId":1,"tags":{},"startTime":1790606230378,"traceId":"74291074c43d56b4"},{"name":"run-typescript","duration":16934231,"timestamp":108429167,"id":10665,"parentId":1,"tags":{},"startTime":1790606337906,"traceId":"74291074c43d56b4"},{"name":"static-check","duration":3793829,"timestamp":125470323,"id":10668,"parentId":1,"tags":{},"startTime":1790606354947,"traceId":"74291074c43d56b4"},{"name":"static-generation","duration":12074339,"timestamp":129356292,"id":10818,"parentId":1,"tags":{},"startTime":1790606358833,"traceId":"74291074c43d56b4"},{"name":"collect-build-traces","duration":21651557,"timestamp":129328816,"id":10815,"parentId":1,"tags":{},"startTime":1790606358806,"traceId":"74291074c43d56b4"},{"name":"telemetry-flush","duration":80,"timestamp":150984879,"id":10827,"parentId":1,"tags":{},"startTime":1790606380462,"traceId":"74291074c43d56b4"},{"name":"next-build","duration":150269734,"timestamp":715249,"id":1,"tags":{"buildMode":"default","version":"16.2.12","bundler":"webpack","has-custom-webpack-config":"true","use-build-worker":"false"},"startTime":1790606230191,"traceId":"74291074c43d56b4"}]
1
+ [{"name":"run-webpack","duration":112659218,"timestamp":1523617,"id":14,"parentId":1,"tags":{},"startTime":1790663252437,"traceId":"77a3b221ab262a20"},{"name":"run-typescript","duration":18223387,"timestamp":114510306,"id":10654,"parentId":1,"tags":{},"startTime":1790663365423,"traceId":"77a3b221ab262a20"},{"name":"static-check","duration":4660226,"timestamp":132827360,"id":10657,"parentId":1,"tags":{},"startTime":1790663383740,"traceId":"77a3b221ab262a20"},{"name":"static-generation","duration":11719246,"timestamp":137596287,"id":10805,"parentId":1,"tags":{},"startTime":1790663388509,"traceId":"77a3b221ab262a20"},{"name":"collect-build-traces","duration":21618905,"timestamp":137556220,"id":10802,"parentId":1,"tags":{},"startTime":1790663388469,"traceId":"77a3b221ab262a20"},{"name":"telemetry-flush","duration":86,"timestamp":159180650,"id":10814,"parentId":1,"tags":{},"startTime":1790663410093,"traceId":"77a3b221ab262a20"},{"name":"next-build","duration":157906518,"timestamp":1274245,"id":1,"tags":{"buildMode":"default","version":"16.2.12","bundler":"webpack","has-custom-webpack-config":"true","use-build-worker":"false"},"startTime":1790663252188,"traceId":"77a3b221ab262a20"}]
@@ -2,7 +2,7 @@
2
2
  // Do not edit this file manually
3
3
 
4
4
  type AppRoutes = "/" | "/recover"
5
- type AppRouteHandlerRoutes = "/api/agent/[id]" | "/api/agent/[id]/account" | "/api/agent/[id]/bash-output" | "/api/agent/[id]/events" | "/api/agent/new" | "/api/agent/running" | "/api/attachments" | "/api/auth/all-providers" | "/api/auth/api-key/[provider]" | "/api/auth/login/[provider]" | "/api/auth/logout/[provider]" | "/api/auth/providers" | "/api/cwd/browse" | "/api/cwd/validate" | "/api/default-cwd" | "/api/display-settings" | "/api/document-text" | "/api/experiments" | "/api/file-index" | "/api/files/[...path]" | "/api/git/diff" | "/api/git/status" | "/api/gpt6/handles" | "/api/gpt6/mcp" | "/api/gpt6/reply" | "/api/gpt6/token" | "/api/gpt6/web6-session" | "/api/home" | "/api/live/call/[callId]" | "/api/live/events" | "/api/live/offer" | "/api/live/voices" | "/api/mcp" | "/api/model-roles" | "/api/models" | "/api/models-config" | "/api/models-config/catalog" | "/api/models-config/discover" | "/api/models-config/test" | "/api/plugins" | "/api/project-trust" | "/api/projects" | "/api/runs" | "/api/runs/[runId]" | "/api/sessions" | "/api/sessions/[id]" | "/api/sessions/[id]/auto-name" | "/api/sessions/[id]/context" | "/api/sessions/[id]/entries/[entryId]/thinking" | "/api/sessions/[id]/export" | "/api/sessions/[id]/state" | "/api/settings" | "/api/sidecars/[service]/[...path]" | "/api/skills" | "/api/skills/check" | "/api/skills/install" | "/api/skills/search" | "/api/skills/update" | "/api/theme" | "/api/tool-image" | "/api/update-maintenance" | "/api/updates" | "/api/web-access" | "/api/web-access/recovery" | "/api/web6/consults" | "/api/worktrees"
5
+ type AppRouteHandlerRoutes = "/api/agent/[id]" | "/api/agent/[id]/account" | "/api/agent/[id]/bash-output" | "/api/agent/[id]/events" | "/api/agent/new" | "/api/agent/running" | "/api/attachments" | "/api/auth/all-providers" | "/api/auth/api-key/[provider]" | "/api/auth/login/[provider]" | "/api/auth/logout/[provider]" | "/api/auth/providers" | "/api/cwd/browse" | "/api/cwd/validate" | "/api/default-cwd" | "/api/display-settings" | "/api/document-text" | "/api/experiments" | "/api/file-index" | "/api/files/[...path]" | "/api/git/diff" | "/api/git/status" | "/api/gpt6/handles" | "/api/gpt6/reply" | "/api/gpt6/token" | "/api/gpt6/web6-session" | "/api/home" | "/api/live/call/[callId]" | "/api/live/events" | "/api/live/offer" | "/api/live/voices" | "/api/mcp" | "/api/model-roles" | "/api/models" | "/api/models-config" | "/api/models-config/catalog" | "/api/models-config/discover" | "/api/models-config/test" | "/api/plugins" | "/api/project-trust" | "/api/projects" | "/api/runs" | "/api/runs/[runId]" | "/api/sessions" | "/api/sessions/[id]" | "/api/sessions/[id]/auto-name" | "/api/sessions/[id]/context" | "/api/sessions/[id]/entries/[entryId]/thinking" | "/api/sessions/[id]/export" | "/api/sessions/[id]/state" | "/api/settings" | "/api/sidecars/[service]/[...path]" | "/api/skills" | "/api/skills/check" | "/api/skills/install" | "/api/skills/search" | "/api/skills/update" | "/api/theme" | "/api/tool-image" | "/api/update-maintenance" | "/api/updates" | "/api/web-access" | "/api/web-access/recovery" | "/api/web6/consults" | "/api/worktrees"
6
6
  type PageRoutes = never
7
7
  type LayoutRoutes = "/"
8
8
  type RedirectRoutes = never
@@ -35,7 +35,6 @@ interface ParamMap {
35
35
  "/api/git/diff": {}
36
36
  "/api/git/status": {}
37
37
  "/api/gpt6/handles": {}
38
- "/api/gpt6/mcp": {}
39
38
  "/api/gpt6/reply": {}
40
39
  "/api/gpt6/token": {}
41
40
  "/api/gpt6/web6-session": {}
@@ -272,15 +272,6 @@ type RouteHandlerConfig<Route extends AppRouteHandlerRoutes = AppRouteHandlerRou
272
272
  type __Unused = __Check
273
273
  }
274
274
 
275
- // Validate ../../app/api/gpt6/mcp/route.ts
276
- {
277
- type __IsExpected<Specific extends RouteHandlerConfig<"/api/gpt6/mcp">> = Specific
278
- const handler = {} as typeof import("../../app/api/gpt6/mcp/route.js")
279
- type __Check = __IsExpected<typeof handler>
280
- // @ts-ignore
281
- type __Unused = __Check
282
- }
283
-
284
275
  // Validate ../../app/api/gpt6/reply/route.ts
285
276
  {
286
277
  type __IsExpected<Specific extends RouteHandlerConfig<"/api/gpt6/reply">> = Specific
package/README.md CHANGED
@@ -39,7 +39,7 @@ CUELO의 목적은 작업 중 확인한 실패와 막힘을 기억·작업 규
39
39
  - 작업 공간(프로젝트·worktree)을 바꾸면 그곳에서 마지막으로 열어 둔 세션으로 돌아갑니다.
40
40
  - goal 모드의 자동 이어 가기와 todo 진행 상황을 대화창 위에서 확인합니다.
41
41
  - 작업 로그 패널에서 이번 턴의 과정 항목과 턴마다 쓴 파일을 따로 봅니다.
42
- - 입력창에 이미지·문서 외에 음성(받아쓰기), 코드·설정 파일(본문 첨부), 그 밖의 파일(저장 후 경로 첨부)을 붙여넣기·드롭·선택으로 넣습니다. 음성 받아쓰기에는 Google Antigravity(Gemini) 계정이 필요합니다.
42
+ - 입력창에 이미지·문서 외에 음성(받아쓰기), 코드·설정 파일(본문 첨부), 그 밖의 파일(저장 후 경로 첨부)을 붙여넣기·드롭·선택으로 넣습니다. 음성 받아쓰기에는 Google Antigravity 계정이 필요합니다.
43
43
  - 에이전트가 생성하거나 확인한 이미지가 그 턴의 대화 흐름에 썸네일로 보이고, 누르면 크게 열립니다.
44
44
 
45
45
  **계정과 자원**
@@ -53,8 +53,9 @@ CUELO의 목적은 작업 중 확인한 실패와 막힘을 기억·작업 규
53
53
  - SubAgent 아카이브: 진행 중·완료된 자식 에이전트의 기록을 열어 봅니다.
54
54
  - 자식 에이전트의 발화가 해당 턴 아래 대화 흐름에 끼어들어 누가 무슨 말을 했는지 이어서 읽힙니다.
55
55
  - 공개 하네스는 완료된 Maker의 미기록 Main 판정을 후속 지시 때 안내하고, 재작업 이력과 최종 수용을 구분합니다. 모델별 허용 추론 강도와 적용 경계는 [하네스 안내](./docs/harness.md#발주와-검수-계약)를 따릅니다.
56
+ - 필요한 MCP 서버만 요청별로 연결하는 선택 모드를 지원합니다. 설치·인증·권한 변경은 먼저 승인을 받고 에이전트가 지원합니다. 설정과 적용 범위는 [요청별 MCP 선택 연결](./docs/harness.md#요청별-mcp-선택-연결)을 확인하세요.
56
57
  - 사이드 챗(`/btw`): 본 대화를 끊지 않고 옆 패널에서 따로 묻습니다. 답변은 본 대화와 같은 캐릭터 얼굴·스티커·마크다운으로 보이고, 세션마다 초안이 따로 보관됩니다. 사이드 챗 문답은 본 대화에 남지 않으며, 답변의 「메인에 보내기」를 누를 때만 문답과 추가 지시가 본 대화로 전달됩니다(본 대화가 실행 중이면 steer, 아니면 새 요청).
57
- - ChatGPT 6 Pro(SHION) 상담 브리지: 6 Pro가 MCP로 omp 세션에 붙어 상담하고, 상담 기록과 실패 기록이 대화창에 표시됩니다.
58
+ - ChatGPT 상담(SHION): 로컬 shim이 전용 ChatGPT 탭에서 받은 답을 현재 omp 세션에 투영하고, 상담 기록과 실패 기록이 대화창에 표시됩니다.
58
59
  - 실시간 음성: 브라우저 마이크로 Codex live 음성 세션을 엽니다. 자격 증명은 서버에만 두고 페이지에는 넘기지 않습니다.
59
60
 
60
61
  **알림과 표현**
@@ -126,6 +127,8 @@ bun bin/cuelo.js --reset-password # 비밀번호 재설정
126
127
 
127
128
  새 CUELO 릴리스가 나오면 사이드바 아래에 알림이 뜹니다. CUELO는 스스로 설치하지 않습니다. 소스에서 실행 중이면 서비스를 종료한 뒤 소스를 갱신하고 다시 설치·시작하세요. 실행 중인 개발 서버의 `.next/`에 빌드를 겹쳐 쓰지 마세요.
128
129
 
130
+ 기존 프로필의 하네스·역할 설정은 앱 업데이트만으로 자동 덮어쓰지 않습니다. `0.6.1`의 설정 전환은 [기존 하네스 갱신](./docs/installation.md#061로-기존-하네스-갱신)을 확인하고, 반영 후 CUELO와 `omp`를 다시 시작하세요.
131
+
129
132
  ```bash
130
133
  git pull --ff-only
131
134
  node install.mjs setup
@@ -9,12 +9,12 @@ const MEMORY_RE = /(const phase1Model = await resolveMemoryModel\(\{[^}]*?fallba
9
9
  const MEMORY_DONE = /const phase1Model = await resolveMemoryModel\(\{[^}]*?fallbackRole: "smol"/;
10
10
  const EXPECTED = {
11
11
  name: 'cuelo',
12
- version: '0.5.9',
12
+ version: '0.6.1',
13
13
  distribution: 'cuelo',
14
- coreVersion: '18.3.5',
14
+ coreVersion: '18.4.3',
15
15
  };
16
16
 
17
- // OMP core 18.3.5 `src/sdk.ts`: session-scoped AsyncJobManager for a process
17
+ // OMP core 18.4.3 `src/sdk.ts`: session-scoped AsyncJobManager for a process
18
18
  // that hosts several top-level sessions (CUELO opens one per browser session).
19
19
  // Upstream lets only the first top-level session construct a manager; every
20
20
  // later one got `asyncJobManager: undefined`, so its `task` calls logged
@@ -23,7 +23,7 @@ const EXPECTED = {
23
23
  // fix: it is disposed with its owning session (CUELO idle-shuts sessions
24
24
  // after 10 minutes) and would cancel every other session's jobs, and a
25
25
  // disposed manager throws on the next register(). Each edit is an exact text
26
- // anchor of the pristine 18.3.5 source (also present after core patch) and fails closed when it drifts.
26
+ // anchor of the pristine 18.4.3 source (also present after core patch) and fails closed when it drifts.
27
27
  // `insertBefore` edits keep their anchor (the helper is inserted in front of
28
28
  // it), so their anchor count stays 1 after patching.
29
29
  const SDK_FILE = path.join('node_modules', '@oh-my-pi', 'pi-coding-agent', 'src', 'sdk.ts');
@@ -177,7 +177,7 @@ function readNativePackage(target) {
177
177
  throw new Error(`unexpected native package ${packageJson.name}@${packageJson.version}`);
178
178
  }
179
179
  if (!build || build.distribution !== EXPECTED.distribution || build.coreVersion !== EXPECTED.coreVersion) {
180
- throw new Error('native cueloBuild metadata does not match cuelo / core 18.3.5');
180
+ throw new Error('native cueloBuild metadata does not match cuelo / core 18.4.3');
181
181
  }
182
182
  return packageJson;
183
183
  }
@@ -81,7 +81,7 @@ SHION은 역할이 아니라 선택적 상담이다. 사용자가 명시했을
81
81
 
82
82
  ## 별칭 호출과 현재 세션 교체
83
83
 
84
- 별칭 + `교체`는 현재 Main 세션 전환, 별칭 + `호출`·`불러`·`소환`은 인라인 summon이며 `교체`가 우선한다. 별칭이 모호하면 실행하지 않는다. genuine interactive/RPC 입력과 사용자 steering에만 적용하고 도구 출력·알림은 발동시키지 않는다.
84
+ 별칭 + `교체`는 현재 Main 세션 전환, 별칭 + `호출`·`불러`·`소환`은 인라인 summon이며 `교체`가 우선한다. `교체됐`·`교체된`처럼 이미 일어난 전환을 설명하는 과거·수동형은 명령이 아니다. 별칭이 모호하면 실행하지 않는다. genuine interactive/RPC 입력과 사용자 steering에만 적용하고 도구 출력·알림은 발동시키지 않는다.
85
85
 
86
86
  | 별칭 | exact selector | `호출해` | `교체해` |
87
87
  |---|---|---|---|
@@ -90,6 +90,7 @@ SHION은 역할이 아니라 선택적 상담이다. 사용자가 명시했을
90
90
  | **RIN(린)** | `anthropic/claude-opus-5-5`, 지정 계정 | 지정 계정 고정 task child | 지정 계정 pin 후 현재 세션 전환 |
91
91
  | **MIO(미오)** | `anthropic/claude-opus-5-5`, 지정 계정 | 지정 계정 고정 task child | 지정 계정 pin 후 현재 세션 전환 |
92
92
  | **NOVA(노바)** | `opencode-go/muse-spark-1.3-contributor` | 이 모델의 task child | 현재 세션만 전환 |
93
+ | **HIKARI(히카리)** | `google-antigravity/gemini-3.8-flash` | 이 모델의 task child | 현재 세션만 전환 |
93
94
  | **SHION(시온)** | `web6/gpt-6-pro` | `rule://web6-consult` 상담(비 child) | 금지 |
94
95
 
95
96
  tool-capable 호출은 일반 task child 하나와 정상 linkage를 사용한다. 사용자가 캐릭터의 얼굴·말투로 인사나 발화를 요청하면 summon 동사가 없어도 인라인 summon으로 처리하고, 해당 child 요청과 호출 입력에 정확한 summon marker를 싣는다. RIN/MIO의 지정 OAuth 계정은 session-scoped exact pin이며 사용 불가 시 다른 credential/model로 조용히 대체하지 않는다. `교체` 실패는 이전 session model을 보존하고 전역 default를 바꾸지 않는다. Main·child의 최종 provider 요청에서는 기존 character voice·legacy report-style을 제거하고 선택 voice block 하나만 적용한다. 사용자에게 그 턴에 child·다른 모델 호출의 역할·개수·이유를 알린다. child의 terminal 발화는 인라인 linkage가 확인될 때만 화면 완료로 본다. SHION은 기존 WEB6 상담 경로만 사용한다. 파서·selector 정본은 `harness-policy.json` `characterRouting`과 `extensions/character-voice.ts`다.
@@ -27,7 +27,9 @@
27
27
  않는다. 첫 실패에서 바꿀 조치도 안전한 진전 경로도 없으면 같은 실패를 두 번째로 확인하지 말고
28
28
  그 자리에서 멈춰 원인 근거·시도한 것·남은 막힘을 보고한다.
29
29
  - 도구·저장소·현재 문맥으로 해결할 수 있는 작업은 확인을 요청하거나 중간 단계에서 멈추지 않고 끝까지 수행한다. 단, 삭제·배포·비용 발생·호환성 파괴는 실행 전에 사용자 승인을 받는다.
30
+ - MCP 설치·등록·인증·권한 변경은 대상과 범위를 설명하고 먼저 사용자 승인을 받는다. 승인 뒤에는 에이전트가 가능한 설치·설정·연결·검증을 끝까지 실행한다. "사용자 승인 필요"를 "사용자가 직접 실행해야 함"으로 바꿔 해석하지 않는다. 사용자 본인 로그인·인증정보 입력·제공자 안전 확인·동의처럼 사람이 필요한 단계만 사용자에게 넘긴다. JEV 추천·필요성 판정은 사용자 승인을 대신하지 않는다.
30
31
  - 배포 확인(사용자, 2026-09-26): 집 PC(hostname `KYS`)의 CUELO 세션이 소스 변경을 검증하고 커밋·push했으면, 그 커밋의 GitHub CI가 끝날 때까지 지켜본 뒤 결과를 보고하고 배포 여부를 묻는다. 사용자가 승인하면 같은 revision의 `Tools/CUELO_Setup/deploy-live.ps1`, `Tools/OMP_Global_Config/setup.ps1 -ProfileOnly`, `Tools/OMP_Global_Config/verify.ps1 -StrictRuntime`을 실행한다(`Tools/CUELO_Setup/setup.ps1`은 앱 전체 설치기라 이 단계가 아니다). 실행 전 `hostname`으로 PC를 확인한다. 예약 작업 같은 자동 배포는 두지 않는다. stage·rollback 삭제, 사무실 PC 배포, CLI 업데이트, 비용이 드는 작업은 따로 승인받는다.
32
+ - CI 감시(사용자, 2026-09-28): 커밋의 CI를 지켜볼 때는 기다릴 워크플로를 이름으로 지정하고(`gh run list --workflow <이름>` 등), 그 run이 끝나는 즉시 결과를 보고한다. 같은 SHA에 걸린 run 전체의 완료를 조건으로 삼지 않는다. CI 성공이 트리거하는 릴리스·배포 run(`workflow_run`)이 몇 초 뒤 같은 SHA로 생겨 CI 완료 보고를 붙잡기 때문이다. 이어 붙는 run은 보고한 뒤 따로 지켜본다.
31
33
  - 구현 방법의 불확실성은 명시 요구·승인된 계약, 실제 호출부와 데이터 흐름, 테스트·재현 결과,
32
34
  현재 동작과 문서로 좁힌다. 증거로 방향이 정해지면 근거를 남기고 진행하며 사소한 구현 선택마다
33
35
  확인을 요청하지 않는다. 테스트·문서·현재 동작 중 어느 하나도 자동으로 정답이 아니므로 요구와
@@ -1,18 +1,18 @@
1
1
  ---
2
2
  name: maker
3
3
  description: Delegated end-to-end implementation agent that investigates, edits, repairs, validates its own slice, and verifies the actual surface it changed.
4
- model: "@implSol"
4
+ model: "@implSonnet"
5
5
  thinking-level: medium
6
6
  tools: [read, bash, edit, write, grep, glob, skim, lsp, eval, generate_image, ast_grep, ast_edit, debug, todo, web_search, checkpoint]
7
7
  ---
8
8
 
9
- <!-- omp-global-config:generated source-hash=99a91afed197
9
+ <!-- omp-global-config:generated source-hash=4d0cd3d73cbf
10
10
  이 파일은 patches/build-agents.mjs 가 만든 빌드 산출물이다. 직접 수정하지 마라.
11
11
  고칠 곳: agent/sop/maker.md · agent/sop/_writer.md · agent/sop/_common.md
12
12
  재생성: node patches/build-agents.mjs 검사: node patches/build-agents.mjs --check
13
13
  -->
14
14
 
15
- You are the delegated implementation Maker on the default `modelRoles.implSol` slot. A delegated slice
15
+ You are the delegated implementation Maker on the default `modelRoles.implSonnet` slot. A delegated slice
16
16
  is yours end to end.
17
17
 
18
18
  ## Maker Contract
@@ -100,8 +100,6 @@ export const CHARACTER_TARGETS: Readonly<Record<CharacterAlias, CharacterTarget>
100
100
  model: "web6/gpt-6-pro",
101
101
  toolCapable: false,
102
102
  },
103
- // 호출·교체 별칭은 없다(사용자가 요청하지 않음). 이 표가 전 alias를 요구하므로 실제 모델을 적어 두지만
104
- // CHARACTER_NAME_PATTERN·NAME_TO_ALIAS에는 넣지 않아 자연어로 부를 수 없다.
105
103
  "HIKARI(히카리)": {
106
104
  model: "google-antigravity/gemini-3.8-flash",
107
105
  toolCapable: true,
@@ -129,6 +127,8 @@ const NAME_TO_ALIAS: Readonly<Record<string, CharacterAlias>> = {
129
127
  노바: "NOVA(노바)",
130
128
  shion: "SHION(시온)",
131
129
  시온: "SHION(시온)",
130
+ hikari: "HIKARI(히카리)",
131
+ 히카리: "HIKARI(히카리)",
132
132
  };
133
133
 
134
134
  const ANTHROPIC_POSITION_CHARACTER: Readonly<Record<number, CharacterAlias>> = {
@@ -142,12 +142,24 @@ const REPORT_STYLE_BLOCK = /\n?<report-style\b[^>]*>[\s\S]*?<\/report-style>\n?/
142
142
  const SUMMON_MARKER = /\[character-summon\s+alias="([^"]+)"\s+model="([^"]+)"(?:\s+oauth-position="(\d+)")?\]/u;
143
143
  const SUMMON_MARKER_GLOBAL = /\n?\[character-summon\s+alias="[^"]+"\s+model="[^"]+"(?:\s+oauth-position="\d+")?\]\n?/gu;
144
144
  const SUMMON_DIRECTIVE = /^\[character-summon-intent alias="([^"]+)"\]/gmu;
145
- const CHARACTER_NAME_PATTERN = "(유키|yuki|이사나|isana|미오|mio|린|rin|노바|nova|시온|shion)";
145
+ const CHARACTER_NAME_PATTERN = "(유키|yuki|이사나|isana|미오|mio|린|rin|노바|nova|시온|shion|히카리|hikari)";
146
146
  const CHARACTER_NAME_IN_COMMAND = new RegExp(
147
147
  `(?<![가-힣A-Za-z0-9])${CHARACTER_NAME_PATTERN}(?=(?:으로|로|을|를|와|과|랑|이랑|하고|이|가|은|는|도)?(?:\\s|$|[.!?,]|교체|호출|불러|소환|${CHARACTER_NAME_PATTERN}))`,
148
148
  "giu",
149
149
  );
150
150
  const SUMMON_ACTION = /(?:호출|불러|소환)/u;
151
+ // 교체 명령은 명령·청유형 어미 뒤에서 절이 끝나는 직접 발화만 인정한다. 어미 뒤에는 문장 부호·줄 끝이나
152
+ // 대상·강조 단어("…교체해봐 미오로", "…교체해 메인을", "…교체해 지금")만 올 수 있다. 그래서
153
+ // "교체됐었어"(과거·수동), "안 교체해"·"못 교체해"·"교체하지 마"·"교체해 주지 마"(부정), "교체하는 방법"·
154
+ // "교체해 줘야 하는지 설명해줘"(설명), "교체해도 돼?"(허가 질문), "교체해 달라는 말"(인용)은 명령이 아니다.
155
+ const SWITCH_CLAUSE_END = `(?:\\s+(?:${CHARACTER_NAME_PATTERN}|메인|main|지금|바로|당장|좀|빨리|제발|[ㄱ-ㅎㅏ-ㅣ]+)(?:으로|로|을|를)?)*\\s*(?:[.!?~…,\\n]|$)`;
156
+ const SWITCH_COMMAND = new RegExp(
157
+ `(?<!(?:^|[^가-힣])(?:안|못)\\s*)(?:교체(?:를|\\s*좀)?\\s*(?:해(?:\\s*(?:주세요|줘요|줘|줄래|주라|봐요|봐|라|요))?|하자|하라|하세요|합시다|부탁(?:해요|해|합니다|드려요|드립니다)?)(?=${SWITCH_CLAUSE_END})|교체(?=\\s*(?:[.!]|$)))`,
158
+ "iu",
159
+ );
160
+ // 리뷰·설명이 인용한 문장(따옴표·백틱·코드 펜스·`>` 인용줄)은 교체 명령 판정에서 뺀다.
161
+ const QUOTED_SPAN = /```[\s\S]*?```|`[^`\n]*`|'[^'\n]*'|"[^"\n]*"|‘[^’\n]*’|“[^”\n]*”|「[^」\n]*」|『[^』\n]*』|^[ \t]*>.*$/gmu;
162
+ const SUMMON_MARKER_PREFIX = /\[character-summon\s/u;
151
163
 
152
164
  function aliasFromName(name: string): CharacterAlias | undefined {
153
165
  return NAME_TO_ALIAS[name.toLocaleLowerCase("en-US")];
@@ -191,9 +203,47 @@ function cleanPayloadTextContainer(value: unknown): unknown {
191
203
  return cleaned;
192
204
  }
193
205
 
194
- function installCharacterVoice(systemPrompt: readonly string[], alias: CharacterAlias): string[] {
206
+ // core(pi-ai anthropic.ts `stableSystemSuffixStart`)는 system 배열 맨 끝의 `<memories>` 블록만 변동 구간으로
207
+ // 보고 그 앞 안정 블록에 cache breakpoint를 건다. voice를 그 뒤에 붙이면 recall이 배열 중간에 끼어
208
+ // 세션마다 다른 기억 목록이 system prompt 전체의 캐시를 깬다(2026-09-29 실측: 첫 요청 4만 토큰 재기록).
209
+ const VOLATILE_SYSTEM_PREFIX = "<memories>";
210
+
211
+ function trailingVolatileStart(texts: readonly string[]): number {
212
+ let start = texts.length;
213
+ while (start > 0 && texts[start - 1]!.startsWith(VOLATILE_SYSTEM_PREFIX)) start--;
214
+ return start;
215
+ }
216
+
217
+ function installCharacterVoice(systemPrompt: readonly string[], alias: CharacterAlias, ...extra: string[]): string[] {
195
218
  const preserved = systemPrompt.map(stripPromptStyleBlocks).filter((block) => block.length > 0);
196
- return [...preserved, renderCharacterVoice(alias)];
219
+ const at = trailingVolatileStart(preserved);
220
+ return [...preserved.slice(0, at), renderCharacterVoice(alias), ...extra, ...preserved.slice(at)];
221
+ }
222
+
223
+ // Anthropic 배열 system: 순수 voice 블록은 제자리에서 텍스트만 바꿔 cache_control 등 필드를 보존한다.
224
+ // 없으면 맨 끝 `<memories>` 앞에 넣는다.
225
+ function injectVoiceIntoSystemBlocks(parts: readonly unknown[], block: string): unknown[] {
226
+ const next: unknown[] = [];
227
+ let placed = false;
228
+ for (const part of parts) {
229
+ if (!part || typeof part !== "object" || !("text" in part) || typeof part.text !== "string") {
230
+ next.push(part);
231
+ continue;
232
+ }
233
+ const text = stripPromptStyleBlocks(part.text);
234
+ if (text) {
235
+ next.push({ ...part, text });
236
+ } else if (!placed && part.text.includes(VOICE_OPEN)) {
237
+ next.push({ ...part, text: block });
238
+ placed = true;
239
+ }
240
+ }
241
+ if (placed) return next;
242
+ const texts = next.map((part) =>
243
+ part && typeof part === "object" && "text" in part && typeof part.text === "string" ? part.text : "",
244
+ );
245
+ const at = trailingVolatileStart(texts);
246
+ return [...next.slice(0, at), { type: "text", text: block }, ...next.slice(at)];
197
247
  }
198
248
 
199
249
  function characterAliasForContext(ctx: ExtensionContext, selectedAlias: CharacterAlias | undefined): CharacterAlias | undefined {
@@ -264,8 +314,8 @@ async function switchCharacterForSession(
264
314
  try {
265
315
  const switched = await pi.setModel(model);
266
316
  if (!switched) throw new Error(`${target.model} 인증을 사용할 수 없습니다.`);
267
- // 교체와 summon 모두 exact pin이다. 일반 explicit pin은 다음 요청의 계정 랭킹(RIN 우선·주간
268
- // 리셋 우선)이 다른 계정으로 되돌릴 수 있어 교체 완료 보고와 실제 계정이 어긋났다.
317
+ // 교체와 summon 모두 exact pin이다. 일반 explicit pin은 다음 요청의 계정 랭킹(RIN 우선·하루
318
+ // 구간 초과 시 MIO)이 다른 계정으로 되돌릴 수 있어 교체 완료 보고와 실제 계정이 어긋났다.
269
319
  // exact pin은 sessions.release로 풀 수 없으므로 뒤에 실패할 단계가 없도록 마지막에 건다.
270
320
  if (
271
321
  targetCredentialId !== undefined &&
@@ -297,8 +347,11 @@ export function parseCharacterIntent(text: string): CharacterIntent | undefined
297
347
  const aliases = aliasesFromCommand(text);
298
348
  if (aliases.length === 0) return undefined;
299
349
  if (text.includes("교체")) {
300
- if (aliases.length !== 1) return undefined;
301
- return { kind: "switch", alias: aliases[0]! };
350
+ // alias도 인용 밖에서만 뽑아 인용 속 이름과 인용 밖 명령어가 결합되지 않게 한다.
351
+ const command = text.replace(QUOTED_SPAN, " ");
352
+ const switchAliases = aliasesFromCommand(command);
353
+ if (!SWITCH_COMMAND.test(command) || switchAliases.length !== 1) return undefined;
354
+ return { kind: "switch", alias: switchAliases[0]! };
302
355
  }
303
356
  return SUMMON_ACTION.test(text) ? { kind: "summon", aliases } : undefined;
304
357
  }
@@ -360,8 +413,8 @@ export function renderCharacterSummonRouting(aliases: CharacterAlias | readonly
360
413
  `[character-summon-intent alias="${alias}"]`,
361
414
  `[CharacterSummon] 사용자가 ${alias}을(를) 인라인으로 호출했다.`,
362
415
  `먼저 사용자에게 자연스러운 한국어와 ${alias}의 성격·표현으로 WEB6 상담 경로를 호출한다고 짧고 자연스럽게 답한다.`,
363
- `그 다음 \`rule://web6-consult\` 계약에 따라 \`${target.model}\` 공급자를 호출한다. provider 요청이 현재 OMP sessionId를 자동 운반하고 새 handle 발급부터 OMP TOOL rich 멘션 선택·resume·publish까지 이어지므로, raw HTTP·clipboard·수동 붙여넣기·탭 이동을 요구하지 않는다.`,
364
- "task child를 만들거나 세션 Main 모델을 바꾸지 않는다. OMP TOOL exact 멘션/chip 또는 권한 안전 검증이 실패하면 실제 전송 전에 fail closed한다.",
416
+ `그 다음 \`rule://web6-consult\` 계약에 따라 \`${target.model}\` 공급자를 호출한다. provider 요청이 현재 OMP sessionId를 자동 운반하고 새 handle 발급부터 relay 답 수집·/api/gpt6/reply 투영까지 이어지므로, raw HTTP·clipboard·수동 붙여넣기·탭 이동을 요구하지 않는다.`,
417
+ "task child를 만들거나 세션 Main 모델을 바꾸지 않는다. 전용 탭의 6 Pro 모델 확인 또는 권한 안전 검증이 실패하면 실제 전송 전에 fail closed한다.",
365
418
  "WEB6 요청의 effective prompt 끝에는 아래 character voice block을 정확히 한 번 넣고, 이전 character voice block은 제거한다.",
366
419
  renderCharacterVoice(alias),
367
420
  "SHION의 terminal 발화는 이미 사용자 화면에 표시되는 정본이다. Main은 그 본문을 다시 인용·요약·재집계하지 않고, 상담이 실패하거나 미완료일 때만 자기 말로 그 상태를 알린다.",
@@ -532,6 +585,22 @@ export function parseCharacterSummonMarker(prompt: string): CharacterAlias | und
532
585
  return target.oauthPosition === position ? alias : undefined;
533
586
  }
534
587
 
588
+ /**
589
+ * marker처럼 보이지만 exact target과 맞지 않는 task를 찾는다. 틀린 marker는 캐릭터 모델로
590
+ * 전환되지 않고 maker 기본 모델로 조용히 실행되므로, summon 입력이 인식되지 않은 요청에서도 막는다.
591
+ */
592
+ export function malformedSummonMarkerReason(task: string): string | undefined {
593
+ if (!SUMMON_MARKER_PREFIX.test(task) || parseCharacterSummonMarker(task) !== undefined) return undefined;
594
+ const expected = (Object.keys(CHARACTER_TARGETS) as CharacterAlias[])
595
+ .filter((alias) => CHARACTER_TARGETS[alias].toolCapable)
596
+ .map((alias) => `- ${alias}: \`${summonMarkerFor(alias)}\``);
597
+ return [
598
+ "[CharacterSummonGuard] task의 character-summon marker가 exact target과 맞지 않습니다. " +
599
+ "틀린 marker는 캐릭터 모델로 전환되지 않고 maker 기본 모델로 실행됩니다. 아래 marker 중 하나를 그대로 쓰세요.",
600
+ ...expected,
601
+ ].join("\n");
602
+ }
603
+
535
604
  /** 최종 wire payload에서 이전 voice/report style을 걷어내고 선택된 voice를 정확히 한 번 설치한다. */
536
605
  export function injectCharacterVoice(payload: unknown, alias: CharacterAlias): unknown {
537
606
  if (!payload || typeof payload !== "object") return payload;
@@ -541,7 +610,7 @@ export function injectCharacterVoice(payload: unknown, alias: CharacterAlias): u
541
610
 
542
611
  const next: Record<string, unknown> = { ...record };
543
612
  if ("instructions" in next) next.instructions = cleanPayloadTextContainer(next.instructions);
544
- if ("system" in next) next.system = cleanPayloadTextContainer(next.system);
613
+ if ("system" in next && !Array.isArray(next.system)) next.system = cleanPayloadTextContainer(next.system);
545
614
  if (Array.isArray(next.messages)) {
546
615
  const messages: unknown[] = [];
547
616
  for (const message of next.messages) {
@@ -567,7 +636,7 @@ export function injectCharacterVoice(payload: unknown, alias: CharacterAlias): u
567
636
  return next;
568
637
  }
569
638
  if (Array.isArray(next.system)) {
570
- next.system = [...next.system, { type: "text", text: block }];
639
+ next.system = injectVoiceIntoSystemBlocks(next.system, block);
571
640
  return next;
572
641
  }
573
642
  if (typeof next.instructions === "string") {
@@ -690,7 +759,7 @@ export default function characterVoice(pi: ExtensionAPI): void {
690
759
  if (!switched.ok) {
691
760
  const failure = `[CharacterSummonRuntime] ${switched.reason} 이 실패를 사용자에게 한국어로 명확히 알리고 다른 캐릭터나 모델로 가장하지 않는다.`;
692
761
  return {
693
- systemPrompt: [...installCharacterVoice(event.systemPrompt, summonedAlias), failure],
762
+ systemPrompt: installCharacterVoice(event.systemPrompt, summonedAlias, failure),
694
763
  };
695
764
  }
696
765
  selectedAlias = summonedAlias;
@@ -4,6 +4,7 @@ import { resolve } from "node:path";
4
4
  import { isToolCallEventType, type ExtensionAPI } from "@oh-my-pi/pi-coding-agent";
5
5
  import {
6
6
  CHARACTER_TARGETS,
7
+ malformedSummonMarkerReason,
7
8
  parseCharacterIntent,
8
9
  parseCharacterSummonDirectives,
9
10
  rewriteTaskInputForCharacterSummon,
@@ -707,6 +708,15 @@ export default function commandGuard(pi: ExtensionAPI): void {
707
708
  };
708
709
  }
709
710
 
711
+ // summon 입력 인식 여부와 무관하게, marker를 쓴 task는 exact target이어야 한다.
712
+ const taskTexts = Array.isArray(canonicalInput.tasks)
713
+ ? canonicalInput.tasks.map((item) => (item && typeof item.task === "string" ? item.task : ""))
714
+ : [typeof canonicalInput.task === "string" ? canonicalInput.task : ""];
715
+ for (const text of taskTexts) {
716
+ const malformed = malformedSummonMarkerReason(text);
717
+ if (malformed) return { block: true, reason: malformed };
718
+ }
719
+
710
720
  let guardedInput = canonicalInput;
711
721
  const claimedAliases: CharacterAlias[] = [];
712
722
  if (pendingSummons.length > 0) {
@@ -438,13 +438,13 @@ const HARD_FOCUS_PROFILES: Readonly<Record<string, string>> = {
438
438
  };
439
439
 
440
440
  /**
441
- * 비-UI NORMAL은 primary(NORMAL_SOL = modelRoles.implSol)를 우선한다.
441
+ * 비-UI NORMAL은 primary(NORMAL_SONNET = modelRoles.implSonnet)를 우선한다.
442
442
  * 대안이 한도 여유가 더 크다는 이유로 primary를 밀지 않는다. 계정 사용 가능성은 core 신호
443
443
  * (disabled·limitReached·autoBlockedUntil)로만 보고, 미관측은 소진으로 간주하지 않는다.
444
444
  */
445
445
  function normalAllocation(policy: RoutingPolicy, candidates: readonly Candidate[], quota: QuotaSnapshot) {
446
446
  const normal = candidates.filter((candidate) => policy.modelSelection.profiles[candidate.profile]?.workClass === "NORMAL" && candidate.profile !== "NORMAL_OPUS");
447
- const primary = normal.find((candidate) => candidate.profile === "NORMAL_SOL");
447
+ const primary = normal.find((candidate) => candidate.profile === "NORMAL_SONNET");
448
448
  const unavailable = (reason: string) => ({ state: "unavailable" as const, profile: (primary ?? normal[0])?.profile ?? null, reason });
449
449
  if (quota.state !== "observed") return unavailable(quota.reason);
450
450
  /** 그 후보 provider의 관측된 계정이 모두 사용 불가할 때만 소진으로 본다. 계정을 관측하지 못하면 소진이 아니다. */
@@ -640,7 +640,7 @@ export function registerMakerRouting(pi: ExtensionAPI, deps: RoutingDeps) {
640
640
  }
641
641
  };
642
642
 
643
- const INSTRUCTION = "Main은 profile·recommendations.uiUxBoundary·placement·history를 보고 후보와 concrete effort를 지정합니다. 등급 NORMAL/HARD와 모델 이름을 구분합니다. NORMAL UI/UX 경계는 NORMAL_OPUS, 비-UI는 NORMAL_SOL 우선이며 실제 소진·사용 불가 때만 NORMAL_DEEPSEEK를 추천합니다. 한도 미관측은 소진이 아닙니다. 기존 NORMAL의 명시적 Opus 선택은 ROUTING_REASON으로 유지합니다. HARD는 UI_UX→HARD_UI_OPUS, CODE_SYSTEM→HARD_CODE_OPUS이며 HARD_CODE_SOL는 명시적 대안입니다. 후보별 허용·registry 지원 강도만 쓰고 max나 coarse effort는 쓰지 않습니다. 작업 중 UI/UX 경계가 드러나면 기존 owner의 실제 모델을 확인하고, 비-Opus의 미완 변경·증거를 freeze해 소유권을 넘깁니다. active writer와 겹치거나 실행 중 모델·effort를 바꾸지 않습니다. 같은 Opus owner와 완료된 비-UI 작업은 재사용합니다. Opus unavailable을 다른 후보로 숨기지 않습니다. 계정 warm/exact pin·전환·쿨다운·리셋은 유지합니다. 추천 변경·Jev 불가·기존 owner 대신 새 발주는 ROUTING_REASON을 남깁니다. history는 같은 등급 최근 attempt의 중립 건수이며 후보·규칙을 자동 변경하지 않습니다. routing_verdict에는 실제 spawn identity를 씁니다. context='PREPARED_CONTEXT', task='PREPARED_TASK: <preparedId>'로 원문을 재사용하며 같은 브리프에 judge를 중복 호출하지 않습니다.";
643
+ const INSTRUCTION = "Main은 profile·recommendations.uiUxBoundary·placement·history를 보고 후보와 concrete effort를 지정합니다. 등급 NORMAL/HARD와 모델 이름을 구분합니다. NORMAL UI/UX 경계는 NORMAL_OPUS, 비-UI는 NORMAL_SONNET 우선이며 실제 소진·사용 불가 때만 NORMAL_DEEPSEEK를 추천합니다. 한도 미관측은 소진이 아닙니다. 기존 NORMAL의 명시적 Opus 선택은 ROUTING_REASON으로 유지합니다. HARD는 UI_UX→HARD_UI_OPUS, CODE_SYSTEM→HARD_CODE_OPUS이며 HARD_CODE_SONNET는 명시적 대안입니다. 후보별 허용·registry 지원 강도만 쓰고 max나 coarse effort는 쓰지 않습니다. 작업 중 UI/UX 경계가 드러나면 기존 owner의 실제 모델을 확인하고, 비-Opus의 미완 변경·증거를 freeze해 소유권을 넘깁니다. active writer와 겹치거나 실행 중 모델·effort를 바꾸지 않습니다. 같은 Opus owner와 완료된 비-UI 작업은 재사용합니다. Opus unavailable을 다른 후보로 숨기지 않습니다. 계정 warm/exact pin·전환·쿨다운·리셋은 유지합니다. 추천 변경·Jev 불가·기존 owner 대신 새 발주는 ROUTING_REASON을 남깁니다. history는 같은 등급 최근 attempt의 중립 건수이며 후보·규칙을 자동 변경하지 않습니다. routing_verdict에는 실제 spawn identity를 씁니다. context='PREPARED_CONTEXT', task='PREPARED_TASK: <preparedId>'로 원문을 재사용하며 같은 브리프에 judge를 중복 호출하지 않습니다.";
644
644
  /** 배치 공통 정보(candidates·quota·instruction)는 한 번만, task별 route는 배열로 돌려준다. */
645
645
  async function prepareBatch(context: string, tasks: RouteTask[], ctx: ExtensionContext, signal?: AbortSignal, callId = "") {
646
646
  const current = policy();
@@ -1026,7 +1026,7 @@ export function registerMakerRouting(pi: ExtensionAPI, deps: RoutingDeps) {
1026
1026
  const toolParameters = parameters as unknown as ToolDefinition["parameters"];
1027
1027
  pi.registerTool({
1028
1028
  name: "maker_route", label: "Maker Route", loadMode: "essential", approval: "read",
1029
- description: "Main 전용 발주 준비. Jev가 위임 적합성·NORMAL/HARD 난이도·UI/UX 경계·HARD 지배 분야·후보별 effort·owner 중복을 한 배치에서 독립 판단한다. NORMAL UI/UX는 NORMAL_OPUS, 비-UI는 NORMAL_SOL 우선이며 실제 소진·사용 불가 때만 NORMAL_DEEPSEEK를 추천한다. HARD_UI_OPUS·HARD_CODE_OPUS는 분야에 따르고 HARD_CODE_SOL는 명시적 대안이다. 새 UI/UX 경계는 기존 비-Opus owner를 freeze해 이관하되 실행 중 모델을 바꾸지 않는다. 후보별 강도·소유권·warm/exact pin을 보존한다. Opus unavailable을 조용히 대체하지 않는다. 난이도를 Opus 선택 수단으로 부풀리지 않는다. history는 advisory이고 routing_verdict는 실제 spawn identity를 쓴다. task 원문을 Jev에 보내거나 동일 브리프를 중복 판단하지 않는다.",
1029
+ description: "Main 전용 발주 준비. Jev가 위임 적합성·NORMAL/HARD 난이도·UI/UX 경계·HARD 지배 분야·후보별 effort·owner 중복을 한 배치에서 독립 판단한다. NORMAL UI/UX는 NORMAL_OPUS, 비-UI는 NORMAL_SONNET 우선이며 실제 소진·사용 불가 때만 NORMAL_DEEPSEEK를 추천한다. HARD_UI_OPUS·HARD_CODE_OPUS는 분야에 따르고 HARD_CODE_SONNET는 명시적 대안이다. 새 UI/UX 경계는 기존 비-Opus owner를 freeze해 이관하되 실행 중 모델을 바꾸지 않는다. 후보별 강도·소유권·warm/exact pin을 보존한다. Opus unavailable을 조용히 대체하지 않는다. 난이도를 Opus 선택 수단으로 부풀리지 않는다. history는 advisory이고 routing_verdict는 실제 spawn identity를 쓴다. task 원문을 Jev에 보내거나 동일 브리프를 중복 판단하지 않는다.",
1030
1030
  parameters: toolParameters,
1031
1031
  async execute(callId, params, signal, _onUpdate, ctx) {
1032
1032
  // core가 위 schema로 검증한 입력이며 SDK generic 경계에서 소실된 타입만 복원한다.