cuelo 0.8.2 → 0.9.0

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 (361) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/app-path-routes-manifest.json +11 -8
  3. package/.next/build-manifest.json +3 -3
  4. package/.next/prerender-manifest.json +27 -3
  5. package/.next/react-loadable-manifest.json +3 -2
  6. package/.next/required-server-files.js +2 -2
  7. package/.next/required-server-files.json +2 -2
  8. package/.next/routes-manifest.json +20 -0
  9. package/.next/server/app/_global-error/page.js +3 -3
  10. package/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  11. package/.next/server/app/_global-error.html +1 -1
  12. package/.next/server/app/_global-error.rsc +1 -1
  13. package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  14. package/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  15. package/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  16. package/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  17. package/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  18. package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  19. package/.next/server/app/_not-found/page.js +2 -2
  20. package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  21. package/.next/server/app/_not-found.html +1 -1
  22. package/.next/server/app/_not-found.rsc +3 -3
  23. package/.next/server/app/_not-found.segments/_full.segment.rsc +3 -3
  24. package/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  25. package/.next/server/app/_not-found.segments/_index.segment.rsc +3 -3
  26. package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  27. package/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  28. package/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  29. package/.next/server/app/api/agent/[id]/account/route.js +1 -1
  30. package/.next/server/app/api/agent/[id]/bash-output/route.js +1 -1
  31. package/.next/server/app/api/agent/[id]/events/route.js +2 -2
  32. package/.next/server/app/api/agent/[id]/route.js +1 -1
  33. package/.next/server/app/api/agent/new/route.js +1 -1
  34. package/.next/server/app/api/agent/running/route.js +1 -1
  35. package/.next/server/app/api/attachments/route.js +3 -3
  36. package/.next/server/app/api/auth/all-providers/route.js +1 -1
  37. package/.next/server/app/api/auth/api-key/[provider]/route.js +1 -1
  38. package/.next/server/app/api/auth/login/[provider]/route.js +1 -1
  39. package/.next/server/app/api/auth/logout/[provider]/route.js +1 -1
  40. package/.next/server/app/api/auth/providers/route.js +1 -1
  41. package/.next/server/app/api/cwd/browse/route.js +1 -1
  42. package/.next/server/app/api/cwd/validate/route.js +1 -1
  43. package/.next/server/app/api/default-cwd/route.js +1 -1
  44. package/.next/server/app/api/display-settings/route.js +1 -1
  45. package/.next/server/app/api/document-text/route.js +2 -2
  46. package/.next/server/app/api/experiments/route.js +1 -1
  47. package/.next/server/app/api/file-index/route.js +1 -1
  48. package/.next/server/app/api/files/[...path]/route.js +1 -1
  49. package/.next/server/app/api/git/diff/route.js +1 -1
  50. package/.next/server/app/api/git/status/route.js +2 -2
  51. package/.next/server/app/api/gpt6/handles/route.js +1 -1
  52. package/.next/server/app/api/gpt6/reply/route.js +1 -1
  53. package/.next/server/app/api/gpt6/token/route.js +1 -1
  54. package/.next/server/app/api/gpt6/web6-session/route.js +1 -1
  55. package/.next/server/app/api/home/route.js +1 -1
  56. package/.next/server/app/api/live/call/[callId]/route.js +1 -1
  57. package/.next/server/app/api/live/character-voice/route.js +1 -1
  58. package/.next/server/app/api/live/events/route.js +2 -2
  59. package/.next/server/app/api/live/offer/route.js +1 -1
  60. package/.next/server/app/api/live/voices/route.js +1 -1
  61. package/.next/server/app/api/lounge/events/route.js +2 -2
  62. package/.next/server/app/api/lounge/route.js +1 -1
  63. package/.next/server/app/api/mcp/route.js +2 -2
  64. package/.next/server/app/api/model-roles/route.js +1 -1
  65. package/.next/server/app/api/models/route.js +1 -1
  66. package/.next/server/app/api/models-config/catalog/route.js +1 -1
  67. package/.next/server/app/api/models-config/discover/route.js +1 -1
  68. package/.next/server/app/api/models-config/route.js +2 -2
  69. package/.next/server/app/api/models-config/test/route.js +1 -1
  70. package/.next/server/app/api/office-avatars/[id]/route.js +1 -0
  71. package/.next/server/app/api/office-avatars/[id]/route.js.nft.json +1 -0
  72. package/.next/server/app/api/office-avatars/[id]/route_client-reference-manifest.js +1 -0
  73. package/.next/server/app/api/office-avatars/route.js +1 -0
  74. package/.next/server/app/api/office-avatars/route.js.nft.json +1 -0
  75. package/.next/server/app/api/office-avatars/route_client-reference-manifest.js +1 -0
  76. package/.next/server/app/api/plugins/route.js +1 -1
  77. package/.next/server/app/api/project-trust/route.js +1 -1
  78. package/.next/server/app/api/projects/route.js +2 -2
  79. package/.next/server/app/api/runs/[runId]/route.js +1 -1
  80. package/.next/server/app/api/runs/route.js +1 -1
  81. package/.next/server/app/api/sessions/[id]/auto-name/route.js +1 -1
  82. package/.next/server/app/api/sessions/[id]/context/route.js +1 -1
  83. package/.next/server/app/api/sessions/[id]/entries/[entryId]/thinking/route.js +1 -1
  84. package/.next/server/app/api/sessions/[id]/export/route.js +1 -1
  85. package/.next/server/app/api/sessions/[id]/route.js +1 -1
  86. package/.next/server/app/api/sessions/[id]/state/route.js +1 -1
  87. package/.next/server/app/api/sessions/route.js +1 -1
  88. package/.next/server/app/api/sessions/search/route.js +1 -1
  89. package/.next/server/app/api/settings/route.js +1 -1
  90. package/.next/server/app/api/sidecars/[service]/[...path]/route.js +1 -1
  91. package/.next/server/app/api/skills/check/route.js +1 -1
  92. package/.next/server/app/api/skills/install/route.js +2 -2
  93. package/.next/server/app/api/skills/route.js +2 -2
  94. package/.next/server/app/api/skills/search/route.js +1 -1
  95. package/.next/server/app/api/skills/update/route.js +1 -1
  96. package/.next/server/app/api/theme/route.js +1 -1
  97. package/.next/server/app/api/tool-image/route.js +1 -1
  98. package/.next/server/app/api/update-maintenance/route.js +2 -2
  99. package/.next/server/app/api/updates/route.js +1 -1
  100. package/.next/server/app/api/web-access/recovery/route.js +1 -1
  101. package/.next/server/app/api/web-access/route.js +1 -1
  102. package/.next/server/app/api/web6/consults/route.js +1 -1
  103. package/.next/server/app/api/worktrees/route.js +1 -1
  104. package/.next/server/app/favicon.ico/route.js +1 -1
  105. package/.next/server/app/index.html +1 -1
  106. package/.next/server/app/index.rsc +7 -7
  107. package/.next/server/app/index.segments/__PAGE__.segment.rsc +5 -5
  108. package/.next/server/app/index.segments/_full.segment.rsc +7 -7
  109. package/.next/server/app/index.segments/_head.segment.rsc +1 -1
  110. package/.next/server/app/index.segments/_index.segment.rsc +3 -3
  111. package/.next/server/app/index.segments/_tree.segment.rsc +4 -4
  112. package/.next/server/app/manifest.webmanifest/route.js +2 -2
  113. package/.next/server/app/office/page.js +2 -0
  114. package/.next/server/app/office/page.js.nft.json +1 -0
  115. package/.next/server/app/office/page_client-reference-manifest.js +1 -0
  116. package/.next/server/app/office-preview/page.js +2 -2
  117. package/.next/server/app/office-preview/page.js.nft.json +1 -1
  118. package/.next/server/app/office-preview/page_client-reference-manifest.js +1 -1
  119. package/.next/server/app/office-preview.html +1 -1
  120. package/.next/server/app/office-preview.rsc +4 -4
  121. package/.next/server/app/office-preview.segments/_full.segment.rsc +4 -4
  122. package/.next/server/app/office-preview.segments/_head.segment.rsc +1 -1
  123. package/.next/server/app/office-preview.segments/_index.segment.rsc +3 -3
  124. package/.next/server/app/office-preview.segments/_tree.segment.rsc +3 -3
  125. package/.next/server/app/office-preview.segments/office-preview/__PAGE__.segment.rsc +2 -2
  126. package/.next/server/app/office-preview.segments/office-preview.segment.rsc +1 -1
  127. package/.next/server/app/office.html +1 -0
  128. package/.next/server/app/office.meta +15 -0
  129. package/.next/server/app/office.rsc +23 -0
  130. package/.next/server/app/office.segments/_full.segment.rsc +23 -0
  131. package/.next/server/app/office.segments/_head.segment.rsc +6 -0
  132. package/.next/server/app/office.segments/_index.segment.rsc +7 -0
  133. package/.next/server/app/office.segments/_tree.segment.rsc +6 -0
  134. package/.next/server/app/office.segments/office/__PAGE__.segment.rsc +10 -0
  135. package/.next/server/app/office.segments/office.segment.rsc +5 -0
  136. package/.next/server/app/page.js +2 -28
  137. package/.next/server/app/page.js.nft.json +1 -1
  138. package/.next/server/app/page_client-reference-manifest.js +1 -1
  139. package/.next/server/app/recover/page.js +2 -2
  140. package/.next/server/app/recover/page_client-reference-manifest.js +1 -1
  141. package/.next/server/app/recover.html +1 -1
  142. package/.next/server/app/recover.rsc +3 -3
  143. package/.next/server/app/recover.segments/_full.segment.rsc +3 -3
  144. package/.next/server/app/recover.segments/_head.segment.rsc +1 -1
  145. package/.next/server/app/recover.segments/_index.segment.rsc +3 -3
  146. package/.next/server/app/recover.segments/_tree.segment.rsc +2 -2
  147. package/.next/server/app/recover.segments/recover/__PAGE__.segment.rsc +1 -1
  148. package/.next/server/app/recover.segments/recover.segment.rsc +1 -1
  149. package/.next/server/app-paths-manifest.json +11 -8
  150. package/.next/server/chunks/205.js +2 -2
  151. package/.next/server/chunks/5431.js +7 -0
  152. package/.next/server/chunks/5489.js +21 -0
  153. package/.next/server/chunks/6432.js +353 -0
  154. package/.next/server/chunks/7362.js +1 -0
  155. package/.next/server/functions-config-manifest.json +4 -0
  156. package/.next/server/middleware-build-manifest.js +1 -1
  157. package/.next/server/middleware-react-loadable-manifest.js +1 -1
  158. package/.next/server/middleware.js +4 -4
  159. package/.next/server/pages/404.html +1 -1
  160. package/.next/server/pages/500.html +1 -1
  161. package/.next/server/server-reference-manifest.json +1 -1
  162. package/.next/static/chunks/6110-dffa6a7b1ada31e6.js +1 -0
  163. package/.next/static/chunks/726.66a45469e1fb0093.js +1 -0
  164. package/.next/static/chunks/9575-09e3873e0ee5ecfc.js +22 -0
  165. package/.next/static/chunks/app/_global-error/page-b73c548944bb1320.js +1 -0
  166. package/.next/static/chunks/app/api/agent/[id]/account/route-b73c548944bb1320.js +1 -0
  167. package/.next/static/chunks/app/api/agent/[id]/bash-output/route-b73c548944bb1320.js +1 -0
  168. package/.next/static/chunks/app/api/agent/[id]/events/route-b73c548944bb1320.js +1 -0
  169. package/.next/static/chunks/app/api/agent/[id]/route-b73c548944bb1320.js +1 -0
  170. package/.next/static/chunks/app/api/agent/new/route-b73c548944bb1320.js +1 -0
  171. package/.next/static/chunks/app/api/agent/running/route-b73c548944bb1320.js +1 -0
  172. package/.next/static/chunks/app/api/attachments/route-b73c548944bb1320.js +1 -0
  173. package/.next/static/chunks/app/api/auth/all-providers/route-b73c548944bb1320.js +1 -0
  174. package/.next/static/chunks/app/api/auth/api-key/[provider]/route-b73c548944bb1320.js +1 -0
  175. package/.next/static/chunks/app/api/auth/login/[provider]/route-b73c548944bb1320.js +1 -0
  176. package/.next/static/chunks/app/api/auth/logout/[provider]/route-b73c548944bb1320.js +1 -0
  177. package/.next/static/chunks/app/api/auth/providers/route-b73c548944bb1320.js +1 -0
  178. package/.next/static/chunks/app/api/cwd/browse/route-b73c548944bb1320.js +1 -0
  179. package/.next/static/chunks/app/api/cwd/validate/route-b73c548944bb1320.js +1 -0
  180. package/.next/static/chunks/app/api/default-cwd/route-b73c548944bb1320.js +1 -0
  181. package/.next/static/chunks/app/api/display-settings/route-b73c548944bb1320.js +1 -0
  182. package/.next/static/chunks/app/api/document-text/route-b73c548944bb1320.js +1 -0
  183. package/.next/static/chunks/app/api/experiments/route-b73c548944bb1320.js +1 -0
  184. package/.next/static/chunks/app/api/file-index/route-b73c548944bb1320.js +1 -0
  185. package/.next/static/chunks/app/api/files/[...path]/route-b73c548944bb1320.js +1 -0
  186. package/.next/static/chunks/app/api/git/diff/route-b73c548944bb1320.js +1 -0
  187. package/.next/static/chunks/app/api/git/status/route-b73c548944bb1320.js +1 -0
  188. package/.next/static/chunks/app/api/gpt6/handles/route-b73c548944bb1320.js +1 -0
  189. package/.next/static/chunks/app/api/gpt6/reply/route-b73c548944bb1320.js +1 -0
  190. package/.next/static/chunks/app/api/gpt6/token/route-b73c548944bb1320.js +1 -0
  191. package/.next/static/chunks/app/api/gpt6/web6-session/route-b73c548944bb1320.js +1 -0
  192. package/.next/static/chunks/app/api/home/route-b73c548944bb1320.js +1 -0
  193. package/.next/static/chunks/app/api/live/call/[callId]/route-b73c548944bb1320.js +1 -0
  194. package/.next/static/chunks/app/api/live/character-voice/route-b73c548944bb1320.js +1 -0
  195. package/.next/static/chunks/app/api/live/events/route-b73c548944bb1320.js +1 -0
  196. package/.next/static/chunks/app/api/live/offer/route-b73c548944bb1320.js +1 -0
  197. package/.next/static/chunks/app/api/live/voices/route-b73c548944bb1320.js +1 -0
  198. package/.next/static/chunks/app/api/lounge/events/route-b73c548944bb1320.js +1 -0
  199. package/.next/static/chunks/app/api/lounge/route-b73c548944bb1320.js +1 -0
  200. package/.next/static/chunks/app/api/mcp/route-b73c548944bb1320.js +1 -0
  201. package/.next/static/chunks/app/api/model-roles/route-b73c548944bb1320.js +1 -0
  202. package/.next/static/chunks/app/api/models/route-b73c548944bb1320.js +1 -0
  203. package/.next/static/chunks/app/api/models-config/catalog/route-b73c548944bb1320.js +1 -0
  204. package/.next/static/chunks/app/api/models-config/discover/route-b73c548944bb1320.js +1 -0
  205. package/.next/static/chunks/app/api/models-config/route-b73c548944bb1320.js +1 -0
  206. package/.next/static/chunks/app/api/models-config/test/route-b73c548944bb1320.js +1 -0
  207. package/.next/static/chunks/app/api/office-avatars/[id]/route-b73c548944bb1320.js +1 -0
  208. package/.next/static/chunks/app/api/office-avatars/route-b73c548944bb1320.js +1 -0
  209. package/.next/static/chunks/app/api/plugins/route-b73c548944bb1320.js +1 -0
  210. package/.next/static/chunks/app/api/project-trust/route-b73c548944bb1320.js +1 -0
  211. package/.next/static/chunks/app/api/projects/route-b73c548944bb1320.js +1 -0
  212. package/.next/static/chunks/app/api/runs/[runId]/route-b73c548944bb1320.js +1 -0
  213. package/.next/static/chunks/app/api/runs/route-b73c548944bb1320.js +1 -0
  214. package/.next/static/chunks/app/api/sessions/[id]/auto-name/route-b73c548944bb1320.js +1 -0
  215. package/.next/static/chunks/app/api/sessions/[id]/context/route-b73c548944bb1320.js +1 -0
  216. package/.next/static/chunks/app/api/sessions/[id]/entries/[entryId]/thinking/route-b73c548944bb1320.js +1 -0
  217. package/.next/static/chunks/app/api/sessions/[id]/export/route-b73c548944bb1320.js +1 -0
  218. package/.next/static/chunks/app/api/sessions/[id]/route-b73c548944bb1320.js +1 -0
  219. package/.next/static/chunks/app/api/sessions/[id]/state/route-b73c548944bb1320.js +1 -0
  220. package/.next/static/chunks/app/api/sessions/route-b73c548944bb1320.js +1 -0
  221. package/.next/static/chunks/app/api/sessions/search/route-b73c548944bb1320.js +1 -0
  222. package/.next/static/chunks/app/api/settings/route-b73c548944bb1320.js +1 -0
  223. package/.next/static/chunks/app/api/sidecars/[service]/[...path]/route-b73c548944bb1320.js +1 -0
  224. package/.next/static/chunks/app/api/skills/check/route-b73c548944bb1320.js +1 -0
  225. package/.next/static/chunks/app/api/skills/install/route-b73c548944bb1320.js +1 -0
  226. package/.next/static/chunks/app/api/skills/route-b73c548944bb1320.js +1 -0
  227. package/.next/static/chunks/app/api/skills/search/route-b73c548944bb1320.js +1 -0
  228. package/.next/static/chunks/app/api/skills/update/route-b73c548944bb1320.js +1 -0
  229. package/.next/static/chunks/app/api/theme/route-b73c548944bb1320.js +1 -0
  230. package/.next/static/chunks/app/api/tool-image/route-b73c548944bb1320.js +1 -0
  231. package/.next/static/chunks/app/api/update-maintenance/route-b73c548944bb1320.js +1 -0
  232. package/.next/static/chunks/app/api/updates/route-b73c548944bb1320.js +1 -0
  233. package/.next/static/chunks/app/api/web-access/recovery/route-b73c548944bb1320.js +1 -0
  234. package/.next/static/chunks/app/api/web-access/route-b73c548944bb1320.js +1 -0
  235. package/.next/static/chunks/app/api/web6/consults/route-b73c548944bb1320.js +1 -0
  236. package/.next/static/chunks/app/api/worktrees/route-b73c548944bb1320.js +1 -0
  237. package/.next/static/chunks/app/{layout-78440a2c8d3cd1c7.js → layout-3adbfd44301cba82.js} +1 -1
  238. package/.next/static/chunks/app/manifest.webmanifest/route-b73c548944bb1320.js +1 -0
  239. package/.next/static/chunks/app/office/page-424e244f1c7fcdc6.js +1 -0
  240. package/.next/static/chunks/app/office-preview/page-8a0f779f534c409f.js +1 -0
  241. package/.next/static/chunks/app/page-b43b2b8679ed66e2.js +1 -0
  242. package/.next/static/chunks/c9cb82ce.18c8cafa64d76bc3.js +1 -0
  243. package/.next/static/chunks/{main-50999e6ee5708e08.js → main-2603b128da53b28c.js} +1 -1
  244. package/.next/static/chunks/next/dist/client/components/builtin/app-error-b73c548944bb1320.js +1 -0
  245. package/.next/static/chunks/next/dist/client/components/builtin/forbidden-b73c548944bb1320.js +1 -0
  246. package/.next/static/chunks/next/dist/client/components/builtin/not-found-b73c548944bb1320.js +1 -0
  247. package/.next/static/chunks/next/dist/client/components/builtin/unauthorized-b73c548944bb1320.js +1 -0
  248. package/.next/static/chunks/webpack-fe8f1f81562a2b61.js +1 -0
  249. package/.next/static/css/{67b6e19482963224.css → 1a4cea7126dfb757.css} +1 -1
  250. package/.next/static/css/1ffe2d5d654f7eea.css +1 -0
  251. package/.next/static/css/8cdfcac889e08fd3.css +1 -0
  252. package/.next/static/do0UuZKXEeG2rQnEL-f1I/_buildManifest.js +1 -0
  253. package/.next/trace +107 -107
  254. package/.next/trace-build +1 -1
  255. package/.next/types/app/api/office-avatars/[id]/route.ts +351 -0
  256. package/.next/types/app/api/office-avatars/route.ts +351 -0
  257. package/.next/types/app/office/page.ts +87 -0
  258. package/.next/types/routes.d.ts +5 -2
  259. package/.next/types/validator.ts +27 -0
  260. package/README.md +10 -5
  261. package/Tools/CUELO_Setup/files/native-runtime-patch.js +3 -3
  262. package/Tools/CUELO_Setup/files/usage-server.js +56 -3
  263. package/Tools/OMP_Global_Config/agent/AGENTS.md +2 -0
  264. package/Tools/OMP_Global_Config/agent/RULES.md +2 -2
  265. package/Tools/OMP_Global_Config/agent/agents/maker.md +3 -1
  266. package/Tools/OMP_Global_Config/agent/extensions/lib/maker-routing.ts +5 -2
  267. package/Tools/OMP_Global_Config/agent/extensions/skim.ts +2 -2
  268. package/Tools/OMP_Global_Config/agent/prompt-copies/AGENTS.en.md +3 -1
  269. package/Tools/OMP_Global_Config/agent/prompt-copies/RULES.en.md +3 -3
  270. package/Tools/OMP_Global_Config/agent/rules/harness-policy.json +12 -8
  271. package/Tools/OMP_Global_Config/agent/rules/omp-harness.md +5 -0
  272. package/Tools/OMP_Global_Config/agent/rules/subagent.md +28 -4
  273. package/Tools/OMP_Global_Config/agent/sop/_writer.md +2 -0
  274. package/Tools/OMP_Global_Config/patches/apply-core-patch.mjs +576 -1
  275. package/package.json +8 -7
  276. package/.next/server/chunks/1933.js +0 -353
  277. package/.next/server/chunks/2607.js +0 -1
  278. package/.next/static/3xAqEONTnox8I-4Te8HCx/_buildManifest.js +0 -1
  279. package/.next/static/chunks/8637.5c189b15878e878b.js +0 -1
  280. package/.next/static/chunks/9889-4e472951b0a45120.js +0 -1
  281. package/.next/static/chunks/app/_global-error/page-2bfa6c2cae0dc17e.js +0 -1
  282. package/.next/static/chunks/app/api/agent/[id]/account/route-2bfa6c2cae0dc17e.js +0 -1
  283. package/.next/static/chunks/app/api/agent/[id]/bash-output/route-2bfa6c2cae0dc17e.js +0 -1
  284. package/.next/static/chunks/app/api/agent/[id]/events/route-2bfa6c2cae0dc17e.js +0 -1
  285. package/.next/static/chunks/app/api/agent/[id]/route-2bfa6c2cae0dc17e.js +0 -1
  286. package/.next/static/chunks/app/api/agent/new/route-2bfa6c2cae0dc17e.js +0 -1
  287. package/.next/static/chunks/app/api/agent/running/route-2bfa6c2cae0dc17e.js +0 -1
  288. package/.next/static/chunks/app/api/attachments/route-2bfa6c2cae0dc17e.js +0 -1
  289. package/.next/static/chunks/app/api/auth/all-providers/route-2bfa6c2cae0dc17e.js +0 -1
  290. package/.next/static/chunks/app/api/auth/api-key/[provider]/route-2bfa6c2cae0dc17e.js +0 -1
  291. package/.next/static/chunks/app/api/auth/login/[provider]/route-2bfa6c2cae0dc17e.js +0 -1
  292. package/.next/static/chunks/app/api/auth/logout/[provider]/route-2bfa6c2cae0dc17e.js +0 -1
  293. package/.next/static/chunks/app/api/auth/providers/route-2bfa6c2cae0dc17e.js +0 -1
  294. package/.next/static/chunks/app/api/cwd/browse/route-2bfa6c2cae0dc17e.js +0 -1
  295. package/.next/static/chunks/app/api/cwd/validate/route-2bfa6c2cae0dc17e.js +0 -1
  296. package/.next/static/chunks/app/api/default-cwd/route-2bfa6c2cae0dc17e.js +0 -1
  297. package/.next/static/chunks/app/api/display-settings/route-2bfa6c2cae0dc17e.js +0 -1
  298. package/.next/static/chunks/app/api/document-text/route-2bfa6c2cae0dc17e.js +0 -1
  299. package/.next/static/chunks/app/api/experiments/route-2bfa6c2cae0dc17e.js +0 -1
  300. package/.next/static/chunks/app/api/file-index/route-2bfa6c2cae0dc17e.js +0 -1
  301. package/.next/static/chunks/app/api/files/[...path]/route-2bfa6c2cae0dc17e.js +0 -1
  302. package/.next/static/chunks/app/api/git/diff/route-2bfa6c2cae0dc17e.js +0 -1
  303. package/.next/static/chunks/app/api/git/status/route-2bfa6c2cae0dc17e.js +0 -1
  304. package/.next/static/chunks/app/api/gpt6/handles/route-2bfa6c2cae0dc17e.js +0 -1
  305. package/.next/static/chunks/app/api/gpt6/reply/route-2bfa6c2cae0dc17e.js +0 -1
  306. package/.next/static/chunks/app/api/gpt6/token/route-2bfa6c2cae0dc17e.js +0 -1
  307. package/.next/static/chunks/app/api/gpt6/web6-session/route-2bfa6c2cae0dc17e.js +0 -1
  308. package/.next/static/chunks/app/api/home/route-2bfa6c2cae0dc17e.js +0 -1
  309. package/.next/static/chunks/app/api/live/call/[callId]/route-2bfa6c2cae0dc17e.js +0 -1
  310. package/.next/static/chunks/app/api/live/character-voice/route-2bfa6c2cae0dc17e.js +0 -1
  311. package/.next/static/chunks/app/api/live/events/route-2bfa6c2cae0dc17e.js +0 -1
  312. package/.next/static/chunks/app/api/live/offer/route-2bfa6c2cae0dc17e.js +0 -1
  313. package/.next/static/chunks/app/api/live/voices/route-2bfa6c2cae0dc17e.js +0 -1
  314. package/.next/static/chunks/app/api/lounge/events/route-2bfa6c2cae0dc17e.js +0 -1
  315. package/.next/static/chunks/app/api/lounge/route-2bfa6c2cae0dc17e.js +0 -1
  316. package/.next/static/chunks/app/api/mcp/route-2bfa6c2cae0dc17e.js +0 -1
  317. package/.next/static/chunks/app/api/model-roles/route-2bfa6c2cae0dc17e.js +0 -1
  318. package/.next/static/chunks/app/api/models/route-2bfa6c2cae0dc17e.js +0 -1
  319. package/.next/static/chunks/app/api/models-config/catalog/route-2bfa6c2cae0dc17e.js +0 -1
  320. package/.next/static/chunks/app/api/models-config/discover/route-2bfa6c2cae0dc17e.js +0 -1
  321. package/.next/static/chunks/app/api/models-config/route-2bfa6c2cae0dc17e.js +0 -1
  322. package/.next/static/chunks/app/api/models-config/test/route-2bfa6c2cae0dc17e.js +0 -1
  323. package/.next/static/chunks/app/api/plugins/route-2bfa6c2cae0dc17e.js +0 -1
  324. package/.next/static/chunks/app/api/project-trust/route-2bfa6c2cae0dc17e.js +0 -1
  325. package/.next/static/chunks/app/api/projects/route-2bfa6c2cae0dc17e.js +0 -1
  326. package/.next/static/chunks/app/api/runs/[runId]/route-2bfa6c2cae0dc17e.js +0 -1
  327. package/.next/static/chunks/app/api/runs/route-2bfa6c2cae0dc17e.js +0 -1
  328. package/.next/static/chunks/app/api/sessions/[id]/auto-name/route-2bfa6c2cae0dc17e.js +0 -1
  329. package/.next/static/chunks/app/api/sessions/[id]/context/route-2bfa6c2cae0dc17e.js +0 -1
  330. package/.next/static/chunks/app/api/sessions/[id]/entries/[entryId]/thinking/route-2bfa6c2cae0dc17e.js +0 -1
  331. package/.next/static/chunks/app/api/sessions/[id]/export/route-2bfa6c2cae0dc17e.js +0 -1
  332. package/.next/static/chunks/app/api/sessions/[id]/route-2bfa6c2cae0dc17e.js +0 -1
  333. package/.next/static/chunks/app/api/sessions/[id]/state/route-2bfa6c2cae0dc17e.js +0 -1
  334. package/.next/static/chunks/app/api/sessions/route-2bfa6c2cae0dc17e.js +0 -1
  335. package/.next/static/chunks/app/api/sessions/search/route-2bfa6c2cae0dc17e.js +0 -1
  336. package/.next/static/chunks/app/api/settings/route-2bfa6c2cae0dc17e.js +0 -1
  337. package/.next/static/chunks/app/api/sidecars/[service]/[...path]/route-2bfa6c2cae0dc17e.js +0 -1
  338. package/.next/static/chunks/app/api/skills/check/route-2bfa6c2cae0dc17e.js +0 -1
  339. package/.next/static/chunks/app/api/skills/install/route-2bfa6c2cae0dc17e.js +0 -1
  340. package/.next/static/chunks/app/api/skills/route-2bfa6c2cae0dc17e.js +0 -1
  341. package/.next/static/chunks/app/api/skills/search/route-2bfa6c2cae0dc17e.js +0 -1
  342. package/.next/static/chunks/app/api/skills/update/route-2bfa6c2cae0dc17e.js +0 -1
  343. package/.next/static/chunks/app/api/theme/route-2bfa6c2cae0dc17e.js +0 -1
  344. package/.next/static/chunks/app/api/tool-image/route-2bfa6c2cae0dc17e.js +0 -1
  345. package/.next/static/chunks/app/api/update-maintenance/route-2bfa6c2cae0dc17e.js +0 -1
  346. package/.next/static/chunks/app/api/updates/route-2bfa6c2cae0dc17e.js +0 -1
  347. package/.next/static/chunks/app/api/web-access/recovery/route-2bfa6c2cae0dc17e.js +0 -1
  348. package/.next/static/chunks/app/api/web-access/route-2bfa6c2cae0dc17e.js +0 -1
  349. package/.next/static/chunks/app/api/web6/consults/route-2bfa6c2cae0dc17e.js +0 -1
  350. package/.next/static/chunks/app/api/worktrees/route-2bfa6c2cae0dc17e.js +0 -1
  351. package/.next/static/chunks/app/manifest.webmanifest/route-2bfa6c2cae0dc17e.js +0 -1
  352. package/.next/static/chunks/app/office-preview/page-68828399eb58177b.js +0 -1
  353. package/.next/static/chunks/app/page-a4c4acecc034872f.js +0 -22
  354. package/.next/static/chunks/next/dist/client/components/builtin/app-error-2bfa6c2cae0dc17e.js +0 -1
  355. package/.next/static/chunks/next/dist/client/components/builtin/forbidden-2bfa6c2cae0dc17e.js +0 -1
  356. package/.next/static/chunks/next/dist/client/components/builtin/not-found-2bfa6c2cae0dc17e.js +0 -1
  357. package/.next/static/chunks/next/dist/client/components/builtin/unauthorized-2bfa6c2cae0dc17e.js +0 -1
  358. package/.next/static/chunks/webpack-aba44445f0ef2ed9.js +0 -1
  359. package/.next/static/css/aab5fc8ab1b53780.css +0 -1
  360. package/.next/static/css/d6462eb5a4d2cb8c.css +0 -1
  361. /package/.next/static/{3xAqEONTnox8I-4Te8HCx → do0UuZKXEeG2rQnEL-f1I}/_ssgManifest.js +0 -0
@@ -0,0 +1,87 @@
1
+ // File: D:\a\CUELO\CUELO\app\office\page.tsx
2
+ import * as entry from '../../../../app/office/page.js'
3
+ import type { ResolvingMetadata, ResolvingViewport } from 'next/dist/lib/metadata/types/metadata-interface.js'
4
+
5
+ import type { InstantConfigForTypeCheckInternal } from 'next/dist/build/segment-config/app/app-segment-config.js'
6
+
7
+ type TEntry = typeof import('../../../../app/office/page.js')
8
+
9
+ type SegmentParams<T extends Object = any> = T extends Record<string, any>
10
+ ? { [K in keyof T]: T[K] extends string ? string | string[] | undefined : never }
11
+ : T
12
+
13
+ // Check that the entry is a valid entry
14
+ checkFields<Diff<{
15
+ default: Function
16
+ config?: {}
17
+ generateStaticParams?: Function
18
+ unstable_instant?: InstantConfigForTypeCheckInternal
19
+ unstable_dynamicStaleTime?: number
20
+ revalidate?: RevalidateRange<TEntry> | false
21
+ dynamic?: 'auto' | 'force-dynamic' | 'error' | 'force-static'
22
+ dynamicParams?: boolean
23
+ fetchCache?: 'auto' | 'force-no-store' | 'only-no-store' | 'default-no-store' | 'default-cache' | 'only-cache' | 'force-cache'
24
+ preferredRegion?: 'auto' | 'global' | 'home' | string | string[]
25
+ runtime?: 'nodejs' | 'experimental-edge' | 'edge'
26
+ maxDuration?: number
27
+
28
+ metadata?: any
29
+ generateMetadata?: Function
30
+ viewport?: any
31
+ generateViewport?: Function
32
+
33
+ }, TEntry, ''>>()
34
+
35
+
36
+ // Check the prop type of the entry function
37
+ checkFields<Diff<PageProps, FirstArg<TEntry['default']>, 'default'>>()
38
+
39
+ // Check the arguments and return type of the generateMetadata function
40
+ if ('generateMetadata' in entry) {
41
+ checkFields<Diff<PageProps, FirstArg<MaybeField<TEntry, 'generateMetadata'>>, 'generateMetadata'>>()
42
+ checkFields<Diff<ResolvingMetadata, SecondArg<MaybeField<TEntry, 'generateMetadata'>>, 'generateMetadata'>>()
43
+ }
44
+
45
+ // Check the arguments and return type of the generateViewport function
46
+ if ('generateViewport' in entry) {
47
+ checkFields<Diff<PageProps, FirstArg<MaybeField<TEntry, 'generateViewport'>>, 'generateViewport'>>()
48
+ checkFields<Diff<ResolvingViewport, SecondArg<MaybeField<TEntry, 'generateViewport'>>, 'generateViewport'>>()
49
+ }
50
+
51
+ // Check the arguments and return type of the generateStaticParams function
52
+ if ('generateStaticParams' in entry) {
53
+ checkFields<Diff<{ params: SegmentParams }, FirstArg<MaybeField<TEntry, 'generateStaticParams'>>, 'generateStaticParams'>>()
54
+ checkFields<Diff<{ __tag__: 'generateStaticParams', __return_type__: any[] | Promise<any[]> }, { __tag__: 'generateStaticParams', __return_type__: ReturnType<MaybeField<TEntry, 'generateStaticParams'>> }>>()
55
+ }
56
+
57
+ export interface PageProps {
58
+ params?: Promise<SegmentParams>
59
+ searchParams?: Promise<any>
60
+ }
61
+ export interface LayoutProps {
62
+ children?: React.ReactNode
63
+
64
+ params?: Promise<SegmentParams>
65
+ }
66
+
67
+ // =============
68
+ // Utility types
69
+ type RevalidateRange<T> = T extends { revalidate: any } ? NonNegative<T['revalidate']> : never
70
+
71
+ // If T is unknown or any, it will be an empty {} type. Otherwise, it will be the same as Omit<T, keyof Base>.
72
+ type OmitWithTag<T, K extends keyof any, _M> = Omit<T, K>
73
+ type Diff<Base, T extends Base, Message extends string = ''> = 0 extends (1 & T) ? {} : OmitWithTag<T, keyof Base, Message>
74
+
75
+ type FirstArg<T extends Function> = T extends (...args: [infer T, any]) => any ? unknown extends T ? any : T : never
76
+ type SecondArg<T extends Function> = T extends (...args: [any, infer T]) => any ? unknown extends T ? any : T : never
77
+ type MaybeField<T, K extends string> = T extends { [k in K]: infer G } ? G extends Function ? G : never : never
78
+
79
+
80
+
81
+ function checkFields<_ extends { [k in keyof any]: never }>() {}
82
+
83
+ // https://github.com/sindresorhus/type-fest
84
+ type Numeric = number | bigint
85
+ type Zero = 0 | 0n
86
+ type Negative<T extends Numeric> = T extends Zero ? never : `${T}` extends `-${string}` ? T : never
87
+ type NonNegative<T extends Numeric> = T extends Zero ? T : Negative<T> extends never ? T : '__invalid_negative_number__'
@@ -1,8 +1,8 @@
1
1
  // This file is generated automatically by Next.js
2
2
  // Do not edit this file manually
3
3
 
4
- type AppRoutes = "/" | "/office-preview" | "/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/reply" | "/api/gpt6/token" | "/api/gpt6/web6-session" | "/api/home" | "/api/live/call/[callId]" | "/api/live/character-voice" | "/api/live/events" | "/api/live/offer" | "/api/live/voices" | "/api/lounge" | "/api/lounge/events" | "/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/sessions/search" | "/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"
4
+ type AppRoutes = "/" | "/office" | "/office-preview" | "/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/reply" | "/api/gpt6/token" | "/api/gpt6/web6-session" | "/api/home" | "/api/live/call/[callId]" | "/api/live/character-voice" | "/api/live/events" | "/api/live/offer" | "/api/live/voices" | "/api/lounge" | "/api/lounge/events" | "/api/mcp" | "/api/model-roles" | "/api/models" | "/api/models-config" | "/api/models-config/catalog" | "/api/models-config/discover" | "/api/models-config/test" | "/api/office-avatars" | "/api/office-avatars/[id]" | "/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/sessions/search" | "/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
@@ -53,6 +53,8 @@ interface ParamMap {
53
53
  "/api/models-config/catalog": {}
54
54
  "/api/models-config/discover": {}
55
55
  "/api/models-config/test": {}
56
+ "/api/office-avatars": {}
57
+ "/api/office-avatars/[id]": { "id": string; }
56
58
  "/api/plugins": {}
57
59
  "/api/project-trust": {}
58
60
  "/api/projects": {}
@@ -81,6 +83,7 @@ interface ParamMap {
81
83
  "/api/web-access/recovery": {}
82
84
  "/api/web6/consults": {}
83
85
  "/api/worktrees": {}
86
+ "/office": {}
84
87
  "/office-preview": {}
85
88
  "/recover": {}
86
89
  }
@@ -56,6 +56,15 @@ type RouteHandlerConfig<Route extends AppRouteHandlerRoutes = AppRouteHandlerRou
56
56
  type __Unused = __Check
57
57
  }
58
58
 
59
+ // Validate ../../app/office/page.tsx
60
+ {
61
+ type __IsExpected<Specific extends AppPageConfig<"/office">> = Specific
62
+ const handler = {} as typeof import("../../app/office/page.js")
63
+ type __Check = __IsExpected<typeof handler>
64
+ // @ts-ignore
65
+ type __Unused = __Check
66
+ }
67
+
59
68
  // Validate ../../app/page.tsx
60
69
  {
61
70
  type __IsExpected<Specific extends AppPageConfig<"/">> = Specific
@@ -443,6 +452,24 @@ type RouteHandlerConfig<Route extends AppRouteHandlerRoutes = AppRouteHandlerRou
443
452
  type __Unused = __Check
444
453
  }
445
454
 
455
+ // Validate ../../app/api/office-avatars/[id]/route.ts
456
+ {
457
+ type __IsExpected<Specific extends RouteHandlerConfig<"/api/office-avatars/[id]">> = Specific
458
+ const handler = {} as typeof import("../../app/api/office-avatars/[id]/route.js")
459
+ type __Check = __IsExpected<typeof handler>
460
+ // @ts-ignore
461
+ type __Unused = __Check
462
+ }
463
+
464
+ // Validate ../../app/api/office-avatars/route.ts
465
+ {
466
+ type __IsExpected<Specific extends RouteHandlerConfig<"/api/office-avatars">> = Specific
467
+ const handler = {} as typeof import("../../app/api/office-avatars/route.js")
468
+ type __Check = __IsExpected<typeof handler>
469
+ // @ts-ignore
470
+ type __Unused = __Check
471
+ }
472
+
446
473
  // Validate ../../app/api/plugins/route.ts
447
474
  {
448
475
  type __IsExpected<Specific extends RouteHandlerConfig<"/api/plugins">> = Specific
package/README.md CHANGED
@@ -16,7 +16,7 @@ Use the same `~/.omp/agent` sessions, credentials and model configuration from t
16
16
 
17
17
  **한국어:** CUELO는 omp(oh-my-pi)를 위한 오픈소스 AI 코딩 에이전트 작업 공간이자 하네스입니다. 웹 앱은 omp SDK를 서버 안에서 실행하고, `omp` CLI와 같은 `~/.omp/agent` 디렉터리를 씁니다. 터미널에서 하던 세션을 브라우저에서 이어 가고, 다시 터미널로 돌아가도 기록·계정·모델 설정을 공유합니다.
18
18
 
19
- 내장 OMP 코어는 **18.4.12**입니다. 추론 강도를 바꾸거나 서브에이전트를 다시 이어도 예비 모델 설정을 유지하며, 별도로 설치한 `omp` CLI의 버전은 웹 업데이트와 독립적입니다.
19
+ 내장 OMP 코어는 **18.6.0**입니다. 추론 강도를 바꾸거나 서브에이전트를 다시 이어도 예비 모델 설정을 유지하며, 별도로 설치한 `omp` CLI의 버전은 웹 업데이트와 독립적입니다.
20
20
 
21
21
  CUELO의 목적은 작업 중 확인한 실패와 막힘을 기억·작업 규칙·실행 절차에 반영해, 사람이 같은 문제를 다시 지적하지 않아도 다음 작업에서 실수를 줄이는 것입니다. 원인을 확인하고 필요한 부분만 바꾸며, 다음 작업에서 적용과 효과를 확인하는 것까지를 지향합니다. 기록을 저장했다는 이유만으로 자동 개선이 끝났다고 보지는 않습니다.
22
22
 
@@ -47,13 +47,15 @@ CUELO의 목적은 작업 중 확인한 실패와 막힘을 기억·작업 규
47
47
  - Ctrl+K 팔레트로 대화 내용을 검색해 해당 메시지로 이동합니다. 압축으로 사라진 과거 메시지는 제외하고, 현재 볼 수 있는 메시지를 세션당 최대 3건 보여 줍니다. 긴 대화 안에서는 Ctrl+F로 찾고, 오른쪽 질문 레일로 내가 한 질문 사이를 오갑니다.
48
48
  - 서버나 PC가 꺼져 실행이 끊긴 대화를 열면 중단 알림을 보여 줍니다. 컨텍스트 압축 중에는 경과 시간을 표시합니다.
49
49
  - 모델 선택기 맨 위에 자주 고른 모델이 나오고, 팔레트에서 넓은 대화 폭을 켤 수 있습니다.
50
- - 입력창 아래 줄은 Main 프리셋 → 그 제공자의 모델 → 추론 강도 순서입니다. "자동, 최대 high"처럼 상한을 고를 수 있고, Auto가 실제로 적용한 값은 「현재 추론 강도」로 따로 표시합니다. 새 대화는 선택한 상한 적용을 마친 뒤 첫 메시지를 보내며, 적용에 실패하면 재전송 때 다시 시도합니다.
50
+ - 입력창 아래 줄은 Main 프리셋 → 그 제공자의 모델 → 추론 강도 순서입니다. "자동, 최대 high"처럼 상한을 고를 수 있고, Auto가 실제로 적용한 값은 「현재 추론 강도」로 따로 표시합니다. 실행 중에 지시를 덧붙이면 Auto가 다시 판단해 강도를 올릴 수 있고, 같은 답변 안에서는 내리지 않습니다. 새 대화는 선택한 상한 적용을 마친 뒤 첫 메시지를 보내며, 적용에 실패하면 재전송 때 다시 시도합니다.
51
51
  - 도구 옆 시간에는 모델 응답 생성 시간을 포함하지 않습니다. 실행 전에 취소된 도구나 완료 시각을 확인할 수 없는 옛 기록에는 시간을 추정해 붙이지 않습니다.
52
52
 
53
53
  **계정과 자원**
54
54
 
55
55
  - 계정별 사용량 카드: 한도 창, 이번 구간 실측, 리셋 권장을 한 화면에 보여 줍니다. 기록이 없으면 숫자를 지어내지 않고 「기록 부족」으로 표시합니다.
56
56
  - 계정은 이메일 대신 캐릭터 얼굴과 별칭으로 구별합니다. 주소를 상시 노출하지 않기 위해서입니다.
57
+ - 사이드바 아래 사용량에서 「순서 편집」을 누르면 계정마다 위로·아래로 버튼이 생깁니다. 한 계정의 한도는 함께 움직이고, 고른 순서는 이 브라우저에 저장돼 새로고침해도 유지됩니다. 순서는 화면 표시에만 적용되며, 처음 보는 계정은 맨 뒤에 붙습니다.
58
+ - 로그인이 만료되거나 쓸 수 없게 된 계정도 사용량에서 사라지지 않고 이유와 함께 남습니다. 다시 로그인해야 풀리는 계정에만 「재로그인」 버튼이 붙으며, 누르면 Models의 해당 제공자 로그인 화면이 대상 계정(얼굴·별칭·가린 주소)과 함께 열립니다. 로그인은 그 화면에서 직접 시작하고, 끝나면 사용량을 다시 읽어 같은 계정이 돌아왔을 때만 복구됐다고 알립니다. 다른 계정으로 로그인하면 원래 계정의 오류는 그대로 남습니다. 직접 꺼 둔 계정은 지금처럼 목록에 나오지 않습니다.
57
59
  - 효율 패널(Run X-Ray · Experiment Lab): `~/.omp/stats.db`와 세션 기록에 이미 쌓인 값만 읽어 실행별 병목과 구성 비교를 보여 줍니다.
58
60
 
59
61
  **여러 에이전트와 함께 일하기**
@@ -61,10 +63,13 @@ CUELO의 목적은 작업 중 확인한 실패와 막힘을 기억·작업 규
61
63
  - SubAgent 아카이브: 진행 중·완료된 자식 에이전트의 기록을 열어 봅니다.
62
64
  - 서브에이전트를 발주한 답변 안에 접힌 카드가 붙어, 맡긴 일마다 실행 상태와 Main의 검수 판정을 한 줄로 보여 줍니다. 펼치면 현재 단계·모델·판정 사유와 상세 패널 링크가 나옵니다. 실행이 끝났어도 Main이 판정을 남기지 않았으면 「검수 미기록」으로 표시하며, 끝난 것을 통과로 치지 않습니다. 서브에이전트가 실행 중이거나 판정을 기다리는 동안에는 입력창 위에 한 줄 요약이 고정되고, 누르면 그 카드로 스크롤해 강조합니다.
63
65
  - 끝난 턴의 마지막 답변 아래에 변경 파일·검사·실패·미확인 개수를 한 줄로 요약하고, 펼치면 파일과 검사 명령·결과를 봅니다.
64
- - 실행 중에 보낸 입력은 「지금 지시」와 「완료 후 요청」으로 나뉘어, 접수·전달 대기·대화에 들어감 단계를 따로 보여 줍니다. 전달을 확인하지 못하면 그렇다고 표시합니다.
65
- - 오피스 보기: 대화 보기와 전환하는 3D 사무실 화면입니다. Main과 참여한 Maker가 각자 캐릭터로 자리에 앉아 실제 실행 상태대로 일하거나 책상 곁에서 기다리고, 실행이 끝나면 쉬는 자리로 돌아갑니다. 실행 완료는 Main의 수용으로 표시하지 않습니다. 이 세션에 참여하지 않은 캐릭터는 휴게 구역에서 쉬며, 가리키면 「참여 안 함」이 보입니다. 참여자 캐릭터나 머리 위 말풍선, 아래 참여자 줄을 누르면 오른쪽에 그 대상의 대화나 작업 기록·파일이 열립니다. Maker 기록은 조회 전용이고 입력은 늘 Main에게 갑니다. 고르기만 해서는 모델·계정이 바뀌거나 메시지가 다른 대상으로 가지 않으며, 대화 보기로 돌아가도 작성 중인 초안이 그대로 남습니다. WebGL을 쓸 수 없거나 장면을 받지 못하면 자리 카드로 보여 주고 다시 시도할 수 있습니다. 캐릭터는 코드로 그리고, 방의 가구는 KayKit·Kenney의 CC0 모델을 오피스를 열 때만 받습니다. 가구를 받지 못하면 코드로 그린 방을 보여 줍니다([`public/office3d/ASSETS.md`](./public/office3d/ASSETS.md)).
66
+ - 실행 중에 보낸 입력은 「지금 지시」와 「완료 후 요청」으로 나뉘어, 접수·전달 대기·대화에 들어감 단계를 따로 보여 줍니다. 전달을 확인하지 못하면 그렇다고 표시합니다. 스크린샷만 보낸 입력도 「이미지 N개」로 표시합니다. 기본 목록에는 최근 4개만 보이고, 「이전 N개 더 보기」로 나머지를 펼칠 수 있습니다. 실제 대기 중인 입력은 목록에서 숨겨져도 유지되며, 펼친 목록에서 거둘 수 있습니다.
67
+ - 오피스 화면: 대화 화면의 「오피스」를 누르면 3D 사무실 전용 화면(`/office`)이 새 탭에서 열립니다. 원래 탭의 주소·선택한 세션·작성 중인 초안·진행 중인 응답은 그대로 남고, 오피스 탭도 같은 세션 주소(`?session=`)를 쓰므로 직접 열거나 새로고침해도 같은 세션이 열립니다. 사무실이 화면 폭을 다 쓰고, Main과 참여한 Maker가 각자 캐릭터로 자리에 앉아 실제 실행 상태대로 일하거나 책상 곁에서 기다리며, 실행이 끝나면 쉬는 자리로 돌아갑니다. 실행 완료는 Main의 수용으로 표시하지 않습니다. 이 세션에 참여하지 않은 캐릭터는 휴게 구역에서 쉬며, 가리키면 「참여 안 함」이 보입니다. 오른쪽 위 버튼으로 확대·축소·전체 보기를 하고, 확대한 뒤에는 장면을 끌거나 화살표 버튼으로 둘러봅니다. 참여자 캐릭터나 머리 위 말풍선, 아래 참여자 줄을 누르면 사무실 대신 그 대상의 대화나 작업 기록·파일이 화면을 다 쓰고, 참여자 줄의 「사무실」로 돌아옵니다. 창이 낮으면 줄여 맞추지 않고 세로로 스크롤합니다. Maker 기록은 조회 전용이고 입력은 늘 Main에게 갑니다. 고르기만 해서는 모델·계정이 바뀌거나 메시지가 다른 대상으로 가지 않습니다. 오피스 탭의 「대화 화면」은 같은 세션의 대화 화면으로 돌아갑니다. 두 탭이 같은 세션을 열어 두면 완료 알림·소리가 탭마다 날 수 있습니다. WebGL을 쓸 수 없거나 장면을 받지 못하면 자리 카드로 보여 주고 다시 시도할 수 있습니다. 캐릭터는 기본적으로 코드로 그리고, 방의 가구는 KayKit·Kenney의 CC0 모델을 오피스를 열 때만 받습니다. 가구를 받지 못하면 코드로 그린 방을 보여 줍니다([`public/office3d/ASSETS.md`](./public/office3d/ASSETS.md)).
68
+ - 개인 캐릭터 모델(선택): agent 데이터 디렉터리(기본 `~/.omp/agent`) 아래 `office-avatars/`에 `rin.vrm`·`mio.vrm`·`nova.vrm`·`yuki.vrm`·`isana.vrm`·`shion.vrm`·`hikari.vrm`을 두면 그 캐릭터를 VRM 모델로 그립니다. 파일 이름은 이 일곱 개만 쓰며, 서버는 이 고정 이름의 파일만 기존 접속 보호(호스트 확인·비밀번호 잠금)를 거친 `/api/office-avatars/<이름>`으로 내주고 다른 경로는 받지 않습니다. 모델은 저장소·npm 패키지·`public/`에 들어 있지 않습니다. 파일이 없는 캐릭터와 캐릭터를 특정하지 못한 참여자는 코드로 그린 캐릭터 그대로이고, 파일이 있는데 받거나 읽지 못하면 오류를 숨기지 않고 자리 카드와 「다시 시도」로 넘어갑니다. 파일을 넣거나 바꾼 뒤에는 오피스를 다시 열면 됩니다.
69
+ - 한 캐릭터는 작업이 몇 개든 사무실에 한 명만 섭니다. Main과 같은 캐릭터의 Maker, 같은 계정의 Maker 여럿은 한 몸에 모이고, 머리 위 말풍선에 작업마다 한 줄(이름·상태)이 보여 실패·대기 작업도 가려지지 않습니다. 그 캐릭터를 누르면 작업이 하나일 때는 바로 열리고, 여럿일 때는 말풍선의 첫 줄로 초점이 가서 줄마다 골라 엽니다. 몸의 자리와 동작은 일하는 작업 → 기다리는 작업 → 사람을 부르거나 실패한 작업 → 쉬거나 끝난 작업 순으로 고른 대표 작업을 따릅니다. 하단 참여자 줄과 자리 카드는 계속 작업마다 따로 보입니다. Maker의 캐릭터는 오피스를 열면 각 Maker 기록의 마지막 답에 남은 계정으로 바로 정해지고, 계정 근거가 없는 참여자는 다른 캐릭터에 합치지 않고 회색 「이름 없는 참여자」로 따로 섭니다.
66
70
  - 자식 에이전트의 발화가 해당 턴 아래 대화 흐름에 끼어들어 누가 무슨 말을 했는지 이어서 읽힙니다.
67
71
  - 공개 하네스는 시작을 기다리거나 재작업 중인 에이전트에게 같은 파일을 중복 배정하지 않도록 확인합니다. 완료 결과와 Main이 검수한 결과의 출처를 구분하고, 재작업 이력과 최종 수용을 따로 남깁니다. 적용 경계는 [하네스 안내](./docs/harness.md#발주와-검수-계약)를 따릅니다.
72
+ - 메이커의 기본 추론 강도와 허용 범위는 별개입니다. 작업별 허용 범위 안에서도 선택한 모델이 실제로 지원하는 강도만 사용하며, 상한을 높여도 기본 강도를 자동으로 최대로 바꾸지 않습니다.
68
73
  - 필요한 MCP 서버만 요청별로 연결하는 선택 모드를 지원합니다. 설치·인증·권한 변경은 먼저 승인을 받고 에이전트가 지원합니다. 설정과 적용 범위는 [요청별 MCP 선택 연결](./docs/harness.md#요청별-mcp-선택-연결)을 확인하세요.
69
74
  - 사이드 챗(`/btw`): 본 대화를 끊지 않고 옆 패널에서 따로 묻습니다. 답변은 본 대화와 같은 캐릭터 얼굴·스티커·마크다운으로 보이고, 세션마다 초안이 따로 보관됩니다. 사이드 챗 문답은 본 대화에 남지 않으며, 답변의 「메인에 보내기」를 누를 때만 문답과 추가 지시가 본 대화로 전달됩니다(본 대화가 실행 중이면 steer, 아니면 새 요청).
70
75
  - ChatGPT 상담(SHION): 로컬 shim이 전용 ChatGPT 탭에서 받은 답을 현재 omp 세션에 투영하고, 상담 기록과 실패 기록이 대화창에 표시됩니다.
@@ -196,7 +201,7 @@ bun run test:coverage # 앱·설치기 테스트 + 커버리지 표
196
201
 
197
202
  의존성을 다시 설치하거나 갱신한 뒤에는 `bun run prepare:source`를 다시 실행하세요. 이미 설치된 작업 사본에서도 `bun install`은 패치된 SDK 패키지를 원본으로 다시 깔기 때문에, 준비 단계를 빼면 호환 패치가 빠진 채로 실행됩니다. 이 준비 단계는 작업 사본의 SDK만 다루며 사용자 프로필이나 실행 중인 설치본을 변경하지 않습니다.
198
203
 
199
- 3D 오피스 장면만 고칠 때는 `bun run dev:verify`로 띄운 뒤 `http://127.0.0.1:30163/office-preview`를 여세요. 실제 장면 코드에 고정된 상태(대기·작업·주의·여러 참여자 등)와 화면 폭을 골라 넣는 개발 전용 화면이며, 세션이나 계정을 만들지 않습니다. production 빌드에서는 이 경로가 열리지 않습니다. 실제 상태 연결과 대화 전환·초안 보존은 전체 앱에서 확인하세요.
204
+ 3D 오피스 장면만 고칠 때는 `bun run dev:verify`로 띄운 뒤 `http://127.0.0.1:30163/office-preview`를 여세요. 실제 장면 코드에 고정된 상태(대기·작업·주의·여러 참여자 등)와 화면 폭을 골라 넣는 개발 전용 화면이며, 세션이나 계정을 만들지 않습니다. production 빌드에서는 이 경로가 열리지 않습니다. 실제 상태 연결과 대화 화면·오피스 탭 사이의 세션·초안 보존은 전체 앱(`/`와 `/office`)에서 확인하세요.
200
205
 
201
206
  참고 문서: [OMP 하네스](./docs/harness.md) · [인증](./docs/authentication.md) · [프로젝트 신뢰](./docs/project-trust.md) · [worktree](./docs/worktrees.md) · [다국어](./docs/i18n.md) · [Docker](./docs/docker.md)
202
207
 
@@ -9,9 +9,9 @@ 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.8.2',
12
+ version: '0.9.0',
13
13
  distribution: 'cuelo',
14
- coreVersion: '18.5.0',
14
+ coreVersion: '18.6.0',
15
15
  };
16
16
 
17
17
  // OMP core 18.4.12 `src/sdk.ts`: session-scoped AsyncJobManager for a process
@@ -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.5.0');
180
+ throw new Error('native cueloBuild metadata does not match cuelo / core 18.6.0');
181
181
  }
182
182
  return packageJson;
183
183
  }
@@ -171,6 +171,19 @@ function controlError(status, code, outcomeUnknown = false) {
171
171
  return Object.assign(new Error(code), { status, code, outcomeUnknown });
172
172
  }
173
173
 
174
+ // 인증 실패 tombstone의 사유를 화면용 코드로 줄인다. core의 원문 사유(provider 응답 조각)는 내보내지 않는다.
175
+ // 자리를 지키는 tombstone은 모두 인증 실패이므로 다시 로그인해야 쓸 수 있다.
176
+ function authError(cause) {
177
+ const text = String(cause ?? '');
178
+ if (/invalid_grant|refresh token (?:expired|not found|invalid)/i.test(text)) {
179
+ return { code: 'refresh_expired', message: '로그인이 만료되었습니다. 다시 로그인하세요.', reloginRequired: true };
180
+ }
181
+ if (/invalidated|revoked|unauthorized|\b401\b/i.test(text)) {
182
+ return { code: 'token_revoked', message: '인증이 취소되었습니다. 다시 로그인하세요.', reloginRequired: true };
183
+ }
184
+ return { code: 'auth_failed', message: '인증에 실패해 이 계정을 쓸 수 없습니다. 다시 로그인하세요.', reloginRequired: true };
185
+ }
186
+
174
187
  // 동일 storage의 reload/cache도 함께 직렬화한다. 외부 CLI의 mutation까지 잠그지는 않는다.
175
188
  function createControlFacade(getControl, invalidate = invalidateUsage) {
176
189
  let tail = Promise.resolve();
@@ -204,6 +217,17 @@ function createControlFacade(getControl, invalidate = invalidateUsage) {
204
217
  await storage.reload();
205
218
  const entries = storage.credentials.snapshot().credentials;
206
219
  const blocks = storage.blocks.list(entries.map(entry => entry.id));
220
+ // 계정 자리(oauthPosition)는 core가 정한다. 인증 실패로 비활성화된 계정도 재로그인 전까지 자기 자리를
221
+ // 지키므로, 그 tombstone을 오류 행으로 함께 낸다. 자리 API가 없는 core에서는 자리·오류 행을 내지 않는다.
222
+ const hasSeats = typeof storage.credentials.oauthSeatIds === 'function';
223
+ const tombstones = hasSeats && typeof storage.credentials.listDisabled === 'function'
224
+ ? await storage.credentials.listDisabled() : [];
225
+ const seats = new Map();
226
+ const seatOf = (provider, id) => {
227
+ if (!seats.has(provider)) seats.set(provider, storage.credentials.oauthSeatIds(provider));
228
+ const position = seats.get(provider).indexOf(id);
229
+ return position >= 0 ? { oauthPosition: position } : {};
230
+ };
207
231
  const result = entries.map(entry => {
208
232
  const providerKey = `${entry.provider}:${entry.credential.type}`;
209
233
  const own = blocks.filter(block => block.credentialId === entry.id);
@@ -216,8 +240,19 @@ function createControlFacade(getControl, invalidate = invalidateUsage) {
216
240
  ...pick(entry.credential, IDENTITY_KEYS),
217
241
  disabled: !!manual,
218
242
  autoBlockedUntilMs: auto.length ? Math.max(...auto.map(block => block.blockedUntilMs)) : null,
243
+ ...(hasSeats && entry.credential.type === 'oauth' ? seatOf(entry.provider, entry.id) : {}),
219
244
  };
220
245
  });
246
+ for (const tombstone of tombstones) {
247
+ if (tombstone.type !== 'oauth') continue;
248
+ const seat = seatOf(tombstone.provider, tombstone.id);
249
+ // 자리가 없는 tombstone은 교체·로그아웃으로 자리를 반납한 행이다. 사용자에게 할 일이 없다.
250
+ if (seat.oauthPosition === undefined) continue;
251
+ result.push({
252
+ credentialId: tombstone.id, provider: tombstone.provider, credentialType: 'oauth',
253
+ ...pick(tombstone, IDENTITY_KEYS), ...seat, authError: authError(tombstone.cause),
254
+ });
255
+ }
221
256
  if (currentEpoch !== epoch) return credentials(true);
222
257
  snapshot = { at: Date.now(), credentials: result };
223
258
  return result;
@@ -283,14 +318,16 @@ function createControlFacade(getControl, invalidate = invalidateUsage) {
283
318
  }
284
319
  if (startEpoch !== epoch) return enrich(raw);
285
320
  const joined = new Set();
321
+ // 인증 실패 행은 사용량 보고서와 결합하지 않는다. 같은 identity의 활성 계정 보고서를 가져가면 안 된다.
322
+ const usable = all.filter(credential => !credential.authError);
286
323
  for (const report of usage.reports) {
287
- const credential = matchCredential(report, all);
324
+ const credential = matchCredential(report, usable);
288
325
  if (!credential) {
289
326
  report.accountRole = 'usage-only';
290
327
  if (RESET_PROVIDERS.includes(report.provider)) report.savedReset = savedReset(undefined, Date.now(), report.provider);
291
328
  continue;
292
329
  }
293
- Object.assign(report, pick(credential, ['credentialId', 'disabled', 'autoBlockedUntilMs']));
330
+ Object.assign(report, pick(credential, ['credentialId', 'disabled', 'autoBlockedUntilMs', 'oauthPosition']));
294
331
  joined.add(credential.credentialId);
295
332
  if (RESET_PROVIDERS.includes(report.provider)) {
296
333
  const credits = creditsByProvider.get(report.provider);
@@ -301,11 +338,21 @@ function createControlFacade(getControl, invalidate = invalidateUsage) {
301
338
  }
302
339
  for (const credential of all) {
303
340
  if (joined.has(credential.credentialId) || !control().storage.usage.providerFor(credential.provider)) continue;
341
+ if (credential.authError) {
342
+ // 수동 OFF·쿨다운 상태와 섞지 않는다. 그 id의 block은 재로그인 뒤 다시 보인다.
343
+ usage.reports.push({
344
+ provider: credential.provider, fetchedAt: 0, limits: [],
345
+ accountRole: 'auth-error',
346
+ metadata: pick(credential, IDENTITY_KEYS),
347
+ ...pick(credential, ['credentialId', 'oauthPosition', 'authError']),
348
+ });
349
+ continue;
350
+ }
304
351
  usage.reports.push({
305
352
  provider: credential.provider, fetchedAt: 0, limits: [],
306
353
  accountRole: 'control-only',
307
354
  metadata: pick(credential, IDENTITY_KEYS),
308
- ...pick(credential, ['credentialId', 'disabled', 'autoBlockedUntilMs']),
355
+ ...pick(credential, ['credentialId', 'disabled', 'autoBlockedUntilMs', 'oauthPosition']),
309
356
  ...(RESET_PROVIDERS.includes(credential.provider) ? { savedReset: savedReset(
310
357
  creditsByProvider.get(credential.provider)?.statuses.find(status => status.credentialId === credential.credentialId),
311
358
  creditsByProvider.get(credential.provider)?.at, credential.provider) } : {}),
@@ -318,9 +365,15 @@ function createControlFacade(getControl, invalidate = invalidateUsage) {
318
365
  delete report.credentialId;
319
366
  delete report.disabled;
320
367
  delete report.autoBlockedUntilMs;
368
+ delete report.oauthPosition;
321
369
  if (RESET_PROVIDERS.includes(report.provider)) report.savedReset = savedReset(undefined, Date.now(), report.provider);
322
370
  }
323
371
  }
372
+ // 화면이 순서를 기억할 안정 키. credential id(없으면 provider 계정 id)로 만들고 email은 쓰지 않는다.
373
+ for (const report of usage.reports) {
374
+ if (Number.isSafeInteger(report.credentialId) && report.credentialId > 0) report.accountKey = `${report.provider}:${report.credentialId}`;
375
+ else if (report.metadata?.accountId) report.accountKey = `${report.provider}:acct:${report.metadata.accountId}`;
376
+ }
324
377
  return usage;
325
378
  }
326
379
  function setDisabled(id, disabled) {
@@ -71,6 +71,8 @@ Main은 확정 delta와 그 증거를 누적 검수하며, 최종 수용은 수
71
71
 
72
72
  Main은 사용자 요구·수용 조건·보존 동작·승인·관측 경로를 먼저 확정한다. 위임 브리프와 첫 조사에서 요구를 대조하는 절차는 `rule://verdict`·`rule://subagent` 및 `harness-policy.json` `briefContextRelay`·`routing.dispatchAssumptionCheck`를 따른다. `task` 발주 시 `TASK_GUARD` 뒤의 공유 메타 `TASK_TITLE`·`TODO_TASKS`도 `rule://task-guard`에 따라 전달한다. Skill은 설치만으로 열지 않고 이번 작업에 필요하거나 사용자가 요청했을 때만 연다. UI 작업은 `rule://frontend`를 따른다. 사용자가 명시 요청하지 않으면 `goal` 도구에 `token_budget`을 임의 설정하지 않는다.
73
73
 
74
+ Main이 활용한 관련 Skill을 Maker에게 넘기고 적용 여부를 확인하는 절차는 `rule://subagent` 「Skill 인계」를 따른다. 사용자가 다시 요청해야 발동하는 절차가 아니다.
75
+
74
76
  `systematic-debugging`·`verification-before-completion`처럼 절차만 담은 Skill은 원인을 모르는 버그, 두 번째 실패, 완료 판정이 모호할 때만 연다. 위치와 수정 방향이 과제에 이미 나온 수정은 기본 검증 절차로 충분하므로 선독하지 않는다.
75
77
 
76
78
  요청 한 번마다 전체 컨텍스트를 다시 싣는다. 서로 의존하지 않는 읽기·검색은 한 턴에 묶고, 수정 전에는 고칠 구간과 그 호출부·테스트를 함께 읽어 한 번에 맞게 고친다. edit이 "본 적 없는 줄"로 거절되면 안내대로 같은 edit을 그대로 다시 보내고 재읽기를 하지 않는다.
@@ -29,7 +29,7 @@
29
29
  - 도구·저장소·현재 문맥으로 해결할 수 있는 작업은 확인을 요청하거나 중간 단계에서 멈추지 않고 끝까지 수행한다. 단, 삭제·배포·비용 발생·호환성 파괴는 실행 전에 사용자 승인을 받는다.
30
30
  - MCP 설치·등록·인증·권한 변경은 대상과 범위를 설명하고 먼저 사용자 승인을 받는다. 승인 뒤에는 에이전트가 가능한 설치·설정·연결·검증을 끝까지 실행한다. "사용자 승인 필요"를 "사용자가 직접 실행해야 함"으로 바꿔 해석하지 않는다. 사용자 본인 로그인·인증정보 입력·제공자 안전 확인·동의처럼 사람이 필요한 단계만 사용자에게 넘긴다. JEV 추천·필요성 판정은 사용자 승인을 대신하지 않는다.
31
31
  - 배포 확인(사용자, 2026-09-26·2026-09-29·2026-09-30): 집 PC(hostname `KYS`)와 사무실 PC(hostname은 비공개 배포 표에 있다)는 같은 절차를 따른다. 그 PC의 CUELO 세션이 소스 변경을 검증하고 커밋·push했으면, 그 커밋의 GitHub CI가 끝날 때까지 지켜본 뒤 결과를 보고하고 배포 여부를 묻는다. 사용자가 승인하면 같은 revision의 `Tools/CUELO_Setup/deploy-live.ps1`과 `Tools/OMP_Global_Config/verify.ps1 -StrictRuntime`을 실행한다(`Tools/CUELO_Setup/setup.ps1`은 앱 전체 설치기라 이 단계가 아니다). 배포 트랜잭션이 새 서버를 띄우기 전에 `Tools/OMP_Global_Config/setup.ps1 -ProfileOnly`로 미러 프로필을 반영하고, 새 서버 `/api/models`의 역할 selector가 미러 `config.yml` `modelRoles`와 같은지 확인해 receipt `profile`에 남기므로 배포 뒤 ProfileOnly·`CUELO-Restart`를 따로 돌리지 않는다. 역할이 다르거나 관측되지 않으면 deploy-live가 exit 3으로 끝나며 rollback하지 않으니, 안내대로 재시작한 뒤 `/api/models`를 다시 확인한다. 세션 안 배포는 deploy-live가 worker 접수 뒤 반환하므로 재개 뒤 transaction receipt의 `profile.modelRoles.matched`가 `true`인지 직접 확인한다. 배포 없이 프로필만 바꿨으면 ProfileOnly 뒤 서버를 재시작하고 같은 역할 확인을 한다. 라이브 서버는 Settings를 시작 때 한 번만 읽어 파일 변경·touch로는 반영되지 않는다. 실행 전 `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은 보고한 뒤 따로 지켜본다.
32
+ - CI 감시(사용자, 2026-09-28·2026-10-03): 커밋의 CI를 지켜볼 때는 기다릴 워크플로를 이름으로 지정하고(`gh run list --workflow <이름>` 등), 그 run이 끝나는 즉시 결과를 보고한다. 같은 SHA에 걸린 run 전체의 완료를 조건으로 삼지 않는다. CI 성공이 트리거하는 릴리스·배포 run(`workflow_run`)이 몇 초 뒤 같은 SHA로 생겨 CI 완료 보고를 붙잡기 때문이다. 이어 붙는 run은 보고한 뒤 따로 지켜본다. 감시는 `bash`의 `gh run watch <id> --exit-status`나 `gh run list` 직접 조회로 하고, `eval` 커널 안에서 `gh`를 subprocess로 부르는 폴링 루프로 짜지 않는다. 2026-10-03 그런 루프가 빈 출력을 "run 없음"으로 읽어, CI가 끝난 뒤에도 20분 넘게 보고하지 못했다. 직접 짠 폴링은 빈 출력·0이 아닌 exit를 즉시 오류로 끝낸다. 공개 미러 CI는 headSha가 원본 커밋과 다르므로 run 제목으로 찾는다.
33
33
  - 구현 방법의 불확실성은 명시 요구·승인된 계약, 실제 호출부와 데이터 흐름, 테스트·재현 결과,
34
34
  현재 동작과 문서로 좁힌다. 증거로 방향이 정해지면 근거를 남기고 진행하며 사소한 구현 선택마다
35
35
  확인을 요청하지 않는다. 테스트·문서·현재 동작 중 어느 하나도 자동으로 정답이 아니므로 요구와
@@ -55,7 +55,7 @@
55
55
  문서 조회는 익명으로 가능하며 인증은 rate limit 상향이 필요할 때만 선택한다. `ctx7 setup`이나
56
56
  MCP·Skill을 추가하지 않는다.
57
57
  - 여러 파일을 훑거나 문서·README·저장소 구조를 조사할 때는 먼저 `skim`에 질문한다. 허용 텍스트 파일
58
- 내용은 Google(Gemini), 그 호출이 실패해 한 번 대체되면 OpenCode Go(DeepSeek)로도 전송된다.
58
+ 내용은 Google(Gemini), 그 호출이 실패해 한 번 대체되면 B.AI(DeepSeek)로도 전송된다.
59
59
  비밀 자료를 대상으로 삼지 말고, 수정할 정확한 줄은 `read`로 확인한다.
60
60
  - **브라우저는 relay가 기본값이다.** `browser.open`에 `app: { relay: false }`를 빼면 관리형 headless가
61
61
  아니라 **사용자의 실제 브라우저**에 탭이 열린다. 닫을 때는 `browser.close({ name })`로 자기 탭만
@@ -6,7 +6,7 @@ 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=4e5719c2a636
9
+ <!-- omp-global-config:generated source-hash=816f54313240
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
@@ -76,6 +76,8 @@ is yours end to end.
76
76
  - Answer every finding that names your change with the fix you made and the raw output of the check
77
77
  that now covers it, keeping the same finding id — no separate messenger or new reporting stage.
78
78
  Never weaken an expectation, relax a fixture, or hide a failure to make validation pass.
79
+ - Follow `rule://subagent` 「Skill 인계」 for relevant skills handed over in the brief:
80
+ required direct reading before implementation, reuse of known locators, and reconsultation when unclear.
79
81
  - 관련 Skill을 먼저 읽고 이번 조치에 적용되는 주의사항만 이름·절/locator·위험 요약으로 추린다.
80
82
  pre-retry advisory를 보충하다가(Common Rules) 검증 약화나 Skill 충돌·적용 불가가 나오면 문제 된
81
83
  조치만 보류하고 기존 blocker/조향 DM으로 원문 오류 locator·Skill locator·제안 조치·보존할 수용
@@ -479,13 +479,16 @@ const HARD_FOCUS_PROFILES: Readonly<Record<string, string>> = {
479
479
  CODE_SYSTEM: "HARD_CODE_OPUS",
480
480
  };
481
481
 
482
+ /** NORMAL이지만 자동 추천·소진 대체 대상이 아니라 Main이 ROUTING_REASON으로만 고르는 후보. */
483
+ const EXPLICIT_ONLY_NORMAL_PROFILES: Readonly<Record<string, true>> = { NORMAL_OPUS: true, NORMAL_SOL: true };
484
+
482
485
  /**
483
486
  * 비-UI NORMAL은 primary(NORMAL_SONNET = modelRoles.implSonnet)를 우선한다.
484
487
  * 대안이 한도 여유가 더 크다는 이유로 primary를 밀지 않는다. 계정 사용 가능성은 core 신호
485
488
  * (disabled·limitReached·autoBlockedUntil)로만 보고, 미관측은 소진으로 간주하지 않는다.
486
489
  */
487
490
  function normalAllocation(policy: RoutingPolicy, candidates: readonly Candidate[], quota: QuotaSnapshot) {
488
- const normal = candidates.filter((candidate) => policy.modelSelection.profiles[candidate.profile]?.workClass === "NORMAL" && candidate.profile !== "NORMAL_OPUS");
491
+ const normal = candidates.filter((candidate) => policy.modelSelection.profiles[candidate.profile]?.workClass === "NORMAL" && !EXPLICIT_ONLY_NORMAL_PROFILES[candidate.profile]);
489
492
  const primary = normal.find((candidate) => candidate.profile === "NORMAL_SONNET");
490
493
  const unavailable = (reason: string) => ({ state: "unavailable" as const, profile: (primary ?? normal[0])?.profile ?? null, reason });
491
494
  if (quota.state !== "observed") return unavailable(quota.reason);
@@ -1149,7 +1152,7 @@ export function registerMakerRouting(pi: ExtensionAPI, deps: RoutingDeps) {
1149
1152
  const toolParameters = parameters as unknown as ToolDefinition["parameters"];
1150
1153
  pi.registerTool({
1151
1154
  name: "maker_route", label: "Maker Route", loadMode: "essential", approval: "read",
1152
- 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에 보내거나 동일 브리프를 중복 판단하지 않는다.",
1155
+ 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·HARD_CODE_ASTRA·NORMAL_SOL은 ROUTING_REASON이 필요한 명시적 대안이며 자동 추천하지 않는다. Opus 세 후보만 max까지 허용한다. 새 UI/UX 경계는 기존 비-Opus owner를 freeze해 이관하되 실행 중 모델을 바꾸지 않는다. 후보별 강도·소유권·warm/exact pin을 보존한다. Opus unavailable을 조용히 대체하지 않는다. 난이도를 Opus 선택 수단으로 부풀리지 않는다. history는 advisory이고 routing_verdict는 실제 spawn identity를 쓴다. task 원문을 Jev에 보내거나 동일 브리프를 중복 판단하지 않는다.",
1153
1156
  parameters: toolParameters,
1154
1157
  async execute(callId, params, signal, _onUpdate, ctx) {
1155
1158
  // core가 위 schema로 검증한 입력이며 SDK generic 경계에서 소실된 타입만 복원한다.
@@ -19,7 +19,7 @@ const SECRET_CONTENT = /-----BEGIN [A-Z ]*PRIVATE KEY-----|\b(?:sk-[A-Za-z0-9_-]
19
19
  const decoder = new TextDecoder("utf-8", { fatal: true });
20
20
  const GEMINI = "google-antigravity/gemini-3.8-flash";
21
21
  // 조사 도구 한정 대체. retry.fallbackChains의 Gemini 모델 키는 vision까지 바꾸므로 사용하지 않는다.
22
- const DEEPSEEK = "opencode-go/deepseek-v4.1-flash";
22
+ const DEEPSEEK = "b-ai/deepseek-v4.1-flash";
23
23
 
24
24
  export interface SkimInput { paths: string[]; question: string }
25
25
  export type SkimCompletion = (prompt: string, ctx: ExtensionContext, signal: AbortSignal, model: typeof GEMINI | typeof DEEPSEEK) => Promise<string>;
@@ -224,7 +224,7 @@ export default function skim(pi: ExtensionAPI): void {
224
224
  const z = pi.zod;
225
225
  pi.registerTool({
226
226
  name: "skim", label: "Skim", loadMode: "essential", approval: "read",
227
- description: "여러 텍스트 파일·디렉터리·glob을 Gemini Flash로 조사하고 실패 시 DeepSeek로 한 번 대체합니다. 허용 파일 내용은 Google 또는 OpenCode Go로 전송됩니다. 비밀·gitignore·바이너리·큰 파일은 제외/제한하고 실제 응답 모델·근거 경로·빠진 목록을 돌려줍니다. 수정할 정확한 줄은 read로 확인하세요.",
227
+ description: "여러 텍스트 파일·디렉터리·glob을 Gemini Flash로 조사하고 실패 시 DeepSeek로 한 번 대체합니다. 허용 파일 내용은 Google 또는 B.AI로 전송됩니다. 비밀·gitignore·바이너리·큰 파일은 제외/제한하고 실제 응답 모델·근거 경로·빠진 목록을 돌려줍니다. 수정할 정확한 줄은 read로 확인하세요.",
228
228
  parameters: z.object({ paths: z.array(z.string()), question: z.string() }) as never,
229
229
  async execute(_id, params, signal, _onUpdate, ctx) {
230
230
  const text = await skimQuestion(params as SkimInput, ctx, signal ?? new AbortController().signal);
@@ -1,4 +1,4 @@
1
- <!-- source-fingerprint: 94b703423427496b -->
1
+ <!-- source-fingerprint: a3671e216eec0e9 -->
2
2
  # Global Agent Instructions
3
3
 
4
4
  (Model-facing English copy of the Korean source `AGENTS.md`. All user-facing prose stays Korean.)
@@ -74,6 +74,8 @@ Use Main-only `wait` (subagents have none) only at real dependency/synthesis bar
74
74
 
75
75
  Main first fixes user requirements, acceptance criteria, behavior to preserve, approvals, and the observation path. Checking the requirements in the delegation brief and first investigation: `rule://verdict`·`rule://subagent` and `harness-policy.json` `briefContextRelay`·`routing.dispatchAssumptionCheck`. When dispatching `task`, also pass the shared metadata `TASK_TITLE`·`TODO_TASKS` after `TASK_GUARD` per `rule://task-guard`. Open a Skill only when this task needs it or the user asks, not because it is installed. UI work follows `rule://frontend`. Never set `token_budget` on the `goal` tool unless the user explicitly asks.
76
76
 
77
+ Follow `rule://subagent` 「Skill 인계」 to hand the relevant Skills Main used to the Maker and verify their application. This applies without another user reminder.
78
+
77
79
  Open procedure-only Skills such as `systematic-debugging`·`verification-before-completion` only for a bug of unknown cause, a second failure, or an ambiguous completion verdict. When the task already names the location and fix direction, the default verification procedure suffices; do not pre-read them.
78
80
 
79
81
  Every request resends the full context. Batch independent reads/searches in one turn; before editing, read the section to change together with its callers and tests so the edit lands in one pass. If an edit is rejected for touching lines "never displayed", resend the same edit as instructed without re-reading.
@@ -1,4 +1,4 @@
1
- <!-- source-fingerprint: 393de19755d97ad6 -->
1
+ <!-- source-fingerprint: 4b03f6f084feaf9d -->
2
2
  # Global Rules
3
3
 
4
4
  (Model-facing English copy of the Korean source `RULES.md`.)
@@ -14,7 +14,7 @@
14
14
  - Work solvable with tools, the repository, and the current context is carried to completion without asking for confirmation or stopping midway. Exception: get user approval before deletion, deployment, incurring cost, or breaking compatibility.
15
15
  - Before installing/registering MCP servers or changing their authentication/permissions, explain the target and scope and get user approval. After approval, the agent carries out the supported installation, configuration, connection, and verification. Do not reinterpret "user approval required" as "the user must execute it manually." Hand over only steps requiring the person, such as personal login, credential entry, or interactive provider safety checks/consent. JEV recommendations or relevance judgments never substitute for user approval.
16
16
  - Deploy confirmation (user, 2026-09-26, 2026-09-29 and 2026-09-30): the home PC (hostname `KYS`) and the office PC (its hostname is in the private deploy table) follow the same procedure. Once that PC's CUELO session has verified a source change and committed and pushed it, watch that commit's GitHub CI until it finishes, report the result, and ask whether to deploy. After the user approves, run `Tools/CUELO_Setup/deploy-live.ps1` and `Tools/OMP_Global_Config/verify.ps1 -StrictRuntime` for that same revision (`Tools/CUELO_Setup/setup.ps1` is the full app installer, not this step). The deploy transaction applies the mirror profile with `Tools/OMP_Global_Config/setup.ps1 -ProfileOnly` before starting the new server, then checks that the new server's `/api/models` role selectors match the mirror `config.yml` `modelRoles` and records it in the receipt `profile`, so do not run ProfileOnly or `CUELO-Restart` separately after a deploy. If the roles differ or could not be observed, deploy-live exits 3 without rolling back; restart as its guidance says and check `/api/models` again. An in-session deploy returns once the worker accepts, so after resuming check yourself that the transaction receipt's `profile.modelRoles.matched` is `true`. If only the profile changed without a deploy, restart the server after ProfileOnly and do the same role check. The live server reads Settings once at startup; file changes or a touch do not reload it. Check the PC with `hostname` first. Do not add automatic deployment such as a scheduled task. Deleting stages or rollbacks, deploying to any PC other than these two, updating the CLI, and anything that incurs cost still need separate approval.
17
- - CI watching (user, 2026-09-28): when watching a commit's CI, name the workflow you wait on (`gh run list --workflow <name>` or similar) and report the moment that run finishes. Never use "every run for this SHA is completed" as the condition: a release/deploy run triggered by CI success (`workflow_run`) appears seconds later on the same SHA and holds back the CI report. Watch such follow-on runs separately after reporting.
17
+ - CI watching (user, 2026-09-28 and 2026-10-03): when watching a commit's CI, name the workflow you wait on (`gh run list --workflow <name>` or similar) and report the moment that run finishes. Never use "every run for this SHA is completed" as the condition: a release/deploy run triggered by CI success (`workflow_run`) appears seconds later on the same SHA and holds back the CI report. Watch such follow-on runs separately after reporting. Watch with `gh run watch <id> --exit-status` or a direct `gh run list` in `bash`; never write a polling loop that calls `gh` as a subprocess inside the `eval` kernel. On 2026-10-03 such a loop read empty output as "no run yet" and missed a finished CI for over 20 minutes. Any hand-written poll must fail at once on empty output or a nonzero exit. Public-mirror CI runs carry a different headSha than the source commit, so find them by run title.
18
18
  - Narrow implementation uncertainty using explicit requirements and approved contracts, actual callers and data flow, test/reproduction results, and current behavior and docs. Once evidence settles the direction, proceed and record the basis; do not ask for confirmation on every minor implementation choice. Tests, docs, and current behavior are not automatically right; when they conflict with the requirements, check the actual behavior. Escalate to the user only items that change product meaning and cannot be settled by evidence, or that lack authority or external approval; keep doing independently allowed work even if that part is blocked.
19
19
  - When a normal implementation choice still needs the user and you ask it with `ask`, give it a valid `recommended` and `autoSelectRecommended: true` so it proceeds with the recommendation after 2 minutes without an answer. Never enable auto-selection for deletion, deployment, cost, account, permission, provider safety, or other high-impact confirmations; wait for the answer. A timed-out auto-selection is not user approval, so never use it as the basis for an action that needs approval.
20
20
  - Direct causes found within the approved goal, and regressions your change created, are fixed and verified without the user asking again. Outside the allowed boundary, other owners' files, and cleanup or features unrelated to the original completion criteria remain out of scope; being able to read something is not permission to modify it.
@@ -22,7 +22,7 @@
22
22
  - Explicit user instructions take precedence over Skill guidance, but apply within higher-priority system/developer rules and existing approval boundaries. If a Skill makes you ask for approval, stop, or go in a different direction than requested, name that Skill and the relevant guidance exactly and briefly explain why it applies. Do not repeat that explanation for routine Skill use.
23
23
  - When investigating, first use the affected symbols, the needed file sections, existing artifacts, and evidence of the actual effective runtime context. Without that evidence, do not add or change context-compression proxies, permanent gates, or setting thresholds.
24
24
  - Read known official documentation URLs directly. When you need to find library/version/API/migration docs, you may choose the existing Context7 CLI without asking the user, but do not call it for every task. Apply `CTX7_TELEMETRY_DISABLED=1` to every command; with a minimal question containing no secrets, credentials, or internal source, run `ctx7 library <name> "<question>"`, then use the exact returned ID (the version ID if a version is needed) in `ctx7 docs <id> "<question>"`. Doc lookups work anonymously; authenticate only when a higher rate limit is needed. Do not add `ctx7 setup`, MCP, or Skills.
25
- - For multi-file scans and documentation, README, or repository-structure research, ask `skim` first. Eligible text files are sent to Google (Gemini), or also to OpenCode Go (DeepSeek) when Gemini fails and the tool retries once. Never target secrets, and use `read` to inspect exact lines before editing.
25
+ - For multi-file scans and documentation, README, or repository-structure research, ask `skim` first. Eligible text files are sent to Google (Gemini), or also to B.AI (DeepSeek) when Gemini fails and the tool retries once. Never target secrets, and use `read` to inspect exact lines before editing.
26
26
  - **The browser defaults to relay.** Omitting `app: { relay: false }` in `browser.open` opens the tab in the **user's real browser**, not the managed headless one. Close only your own tab with `browser.close({ name })`; never use `all`·`kill`·`app.path` — they close the user's windows or attach to existing processes. Never show the user a screen with a broken build. Resolve image/document checks first with `read` `path?q=<question>`, and open a browser only when real DOM rendering is needed. Transcribing text, numbers, or tables, checking for a specific phrase or value, and judging layout, spacing, color, alignment, or clipping all go through `?q=` first. The first `read` of each image path without `?q=` is blocked and redirected to `?q=`; read the same path once more to look directly only when the vision answer cannot settle it.
27
27
  - **Verify screens in the order that saves model turns (Main and Maker).** Use `browser` for web, `computer` for native desktop windows (WinForms·WPF·VB6, etc.), and tests plus real runs for logic/APIs. Batch the act·wait·check steps into one `eval` cell and check with string matches on DOM text or the AX tree first. Only judgments a string cannot settle ("did an error dialog appear", "does this match the acceptance criteria") go to `judge()` (JEV) as text in the same cell; take a screenshot only when the look itself matters. A `judge()` result is an advisory signal, never the final acceptance basis. `computer` drives the user's real desktop: touch only windows you launched and never press irreversible buttons such as delete, send, or pay. Use the same order **when classifying many documents, records, or logs** and **when watching long jobs**: filter by headers and fixed phrases first; if four or more remain, split them in one `judge_batch` and read only the ambiguous ones yourself. For deploys, builds, and long tests, catch the end phrases by string match in an in-cell loop and ask `judge()` only about states a phrase cannot settle ("stuck or still progressing?"). A re-measurement compared against a baseline counts with the baseline's own method; JEV classification only assists with what that method cannot settle.
28
28
  - Write explanations, progress reports, and final answers in Korean. Keep code, commands, file names, API names, and raw error messages in their original form.
@@ -758,11 +758,13 @@
758
758
  "low": "implementation-is-settled-local-reasoning-suffices-and-few-alternatives-remain",
759
759
  "medium": "bounded-implementation-or-diagnosis-needs-several-related-decisions",
760
760
  "high": "remaining-alternatives-or-cross-boundary-invariants-need-sustained-reasoning",
761
- "xhigh": "competing-explanations-or-interacting-constraints-need-deep-comparison-beyond-high"
761
+ "xhigh": "competing-explanations-or-interacting-constraints-need-deep-comparison-beyond-high",
762
+ "max": "the-slice-needs-exhaustive-comparison-of-interacting-constraints-and-alternatives-beyond-xhigh-and-the-evidence-shows-lower-levels-would-miss-a-required-contract-never-chosen-by-default-or-for-risk-file-count-or-retry-count-alone"
762
763
  },
763
764
  "riskIsOrthogonal": "main-intervention-follows-code-nature-integration-risk-and-evidence-never-model-grade-or-effort",
764
765
  "failure": "judge-unavailable-main-uses-the-same-criteria-without-another-model-call",
765
766
  "retry": "failure-alone-never-triggers-respawn-or-higher-effort-new-evidence-and-a-changed-plan-are-required",
767
+ "reworkEscalation": "user-decision-2026-10-04-when-rework-is-dispatched-as-a-new-attempt-and-an-observed-signal-exists-same-check-fails-again-for-the-same-cause-after-a-fix-or-main-review-confirms-a-missed-cause-or-acceptance-criterion-or-main-added-scope-to-that-maker-while-it-ran-or-the-maker-itself-reported-being-stuck-or-unsure-main-raises-the-same-candidate-one-level-within-its-allowedEfforts-never-for-rework-count-elapsed-time-or-failure-count-alone-never-mid-run-at-the-ceiling-revisit-model-split-or-brief-instead-and-record-the-signal-in-the-rework-verdict-reason-and-routing-reason",
766
768
  "parallelism": "slice-count-follows-genuine-independence-never-split-to-fill-slots",
767
769
  "validationExecution": "the-change-owner-runs-checks-main-for-routine-maker-for-delegated-work"
768
770
  },
@@ -834,13 +836,15 @@
834
836
  "rationale": "grade-the-judgment-left-for-this-slice-not-project-size-file-count-risk-or-past-effort",
835
837
  "profiles": {
836
838
  "NORMAL_SONNET": { "modelConfigPath": "modelRoles.implSonnet", "workClass": "NORMAL", "allowedEfforts": ["medium", "high", "xhigh"] },
837
- "NORMAL_OPUS": { "modelConfigPath": "modelRoles.implOpus", "workClass": "NORMAL", "allowedEfforts": ["high"] },
838
- "HARD_UI_OPUS": { "modelConfigPath": "modelRoles.makerHardUiOpus", "workClass": "HARD", "allowedEfforts": ["high"] },
839
- "HARD_CODE_OPUS": { "modelConfigPath": "modelRoles.makerHardCodeOpus", "workClass": "HARD", "allowedEfforts": ["high"] },
839
+ "NORMAL_OPUS": { "modelConfigPath": "modelRoles.implOpus", "workClass": "NORMAL", "allowedEfforts": ["high", "xhigh", "max"] },
840
+ "HARD_UI_OPUS": { "modelConfigPath": "modelRoles.makerHardUiOpus", "workClass": "HARD", "allowedEfforts": ["high", "xhigh", "max"] },
841
+ "HARD_CODE_OPUS": { "modelConfigPath": "modelRoles.makerHardCodeOpus", "workClass": "HARD", "allowedEfforts": ["high", "xhigh", "max"] },
840
842
  "HARD_CODE_SONNET": { "modelConfigPath": "modelRoles.makerHardCodeSonnet", "workClass": "HARD", "allowedEfforts": ["medium", "high", "xhigh"] },
841
- "NORMAL_DEEPSEEK": { "modelConfigPath": "modelRoles.implDeepSeek", "workClass": "NORMAL", "allowedEfforts": ["high"] }
843
+ "NORMAL_DEEPSEEK": { "modelConfigPath": "modelRoles.implDeepSeek", "workClass": "NORMAL", "allowedEfforts": ["high"] },
844
+ "NORMAL_SOL": { "modelConfigPath": "modelRoles.implSol", "workClass": "NORMAL", "allowedEfforts": ["medium", "high", "xhigh"] },
845
+ "HARD_CODE_ASTRA": { "modelConfigPath": "modelRoles.makerHardCodeAstra", "workClass": "HARD", "allowedEfforts": ["high", "xhigh"] }
842
846
  },
843
- "effortBand": "each-candidate-offers-only-registry-supported-levels-inside-its-profile-allowedEfforts-the-task-hook-blocks-any-other-level-and-max-a-shared-model-is-checked-against-the-recommended-profile-then-a-profile-of-the-recommended-work-class-and-without-a-recommendation-against-a-profile-that-allows-the-level",
847
+ "effortBand": "each-candidate-offers-only-registry-supported-levels-inside-its-profile-allowedEfforts-the-task-hook-blocks-any-other-level-max-is-allowed-only-for-the-three-Opus-profiles-and-never-chosen-by-default-a-shared-model-is-checked-against-the-recommended-profile-then-a-profile-of-the-recommended-work-class-and-without-a-recommendation-against-a-profile-that-allows-the-level",
844
848
  "criteria": {
845
849
  "NORMAL": "goal-preserved-behavior-and-checks-are-clear-and-an-existing-specification-or-reusable-pattern-settles-the-approach-or-bounded-causal-diagnosis-or-implementation-choice-remains-within-existing-contracts-and-local-evidence-can-resolve-it-bounded-discovery-caller-lookup-implementation-validation-and-local-repair-are-allowed-without-main-pre-solving-every-line-a-slice-that-local-discovery-fix-and-verification-close-with-existing-solutions-is-NORMAL-and-unknown-cause-or-several-candidate-bugs-alone-is-normal",
846
850
  "HARD": "observed-evidence-identifies-an-unresolved-conflict-between-competing-explanations-or-coupled-state-concurrency-cross-module-invariants-or-user-flow-constraints-and-a-locally-plausible-fix-can-break-another-required-contract-name-the-conflict-and-the-affected-contract-a-conflict-does-not-have-to-be-reproduced-or-fully-specified-before-dispatch-and-the-slice-is-HARD-when-a-new-algorithm-protocol-state-rule-or-coupled-invariant-design-or-non-local-reasoning-that-must-satisfy-several-contracts-at-once-is-left-to-the-implementer-even-though-the-goal-tests-and-main-direction-are-set-main-direction-selection-is-not-a-settled-implementation-solution-not-hypothetical-complexity-file-count-risk-tool-calls-or-failure-rate-a-slice-that-authors-a-new-specification-its-reference-implementation-and-a-large-hidden-test-set-together-is-HARD-regardless-of-file-count"
@@ -858,13 +862,13 @@
858
862
  },
859
863
  "uiUxBoundaryCriteria": "remaining-UI-or-UX-judgment-in-layout-responsive-behavior-information-hierarchy-visual-design-accessibility-focus-touch-targets-or-user-interaction-including-mixed-code-and-design-work-even-when-code-is-dominant-not-file-extension-alone-or-copying-already-settled-wording",
860
864
  "normalAllocation": {
861
- "selection": "UI-UX-boundary-selects-NORMAL_OPUS-independently-of-difficulty-never-promote-to-HARD-to-use-Opus-otherwise-recommend-available-primary-NORMAL_SONNET-first-and-use-NORMAL_DEEPSEEK-only-when-primary-is-actually-unusable-or-observed-exhausted-headroom-differences-and-unobserved-quota-never-displace-primary",
865
+ "selection": "UI-UX-boundary-selects-NORMAL_OPUS-independently-of-difficulty-never-promote-to-HARD-to-use-Opus-otherwise-recommend-available-primary-NORMAL_SONNET-first-and-use-NORMAL_DEEPSEEK-only-when-primary-is-actually-unusable-or-observed-exhausted-headroom-differences-and-unobserved-quota-never-displace-primary-NORMAL_SOL-is-never-auto-recommended-and-is-an-explicit-alternative-only-for-well-specified-non-UI-code-when-cost-matters-more-than-latency-via-main-override-with-ROUTING_REASON-it-does-not-replace-the-NORMAL_SONNET-default",
862
866
  "missing": "UI-UX-Opus-unavailable-is-explicit-no-silent-model-substitution-otherwise-missing-quota-is-unknown-not-zero-keep-primary-NORMAL_SONNET-with-unavailable-reason",
863
867
  "scope": "new-dispatch-recommendation-preserves-credential-selection-warm-pin-rotation-cooldowns-and-resets-newly-observed-UI-UX-boundary-requires-main-to-check-existing-owner-model-freeze-unfinished-delta-and-evidence-and-transfer-non-Opus-ownership-never-change-a-running-model-in-place-or-repeat-completed-non-UI-work",
864
868
  "override": "main-may-override-the-prepared-recommendation-with-ROUTING_REASON-without-another-judge-call"
865
869
  },
866
870
  "hardSelection": {
867
- "selection": "expertise-first-hardFocus-UI_UX-selects-HARD_UI_OPUS-and-CODE_SYSTEM-selects-HARD_CODE_OPUS-regardless-of-main-model-family-HARD_CODE_SONNET-is-offered-only-as-an-alternative-and-requires-ROUTING_REASON",
871
+ "selection": "expertise-first-hardFocus-UI_UX-selects-HARD_UI_OPUS-and-CODE_SYSTEM-selects-HARD_CODE_OPUS-regardless-of-main-model-family-HARD_CODE_SONNET-and-HARD_CODE_ASTRA-are-offered-only-as-alternatives-and-require-ROUTING_REASON-HARD_CODE_ASTRA-is-for-complex-non-UI-code-or-system-reasoning-when-main-wants-that-model-family-existing-eval-evidence-is-small-n-and-older-main-benchmarks-and-never-proves-Astra-dominance",
868
872
  "unknown": "mixed-or-unknown-focus-requires-main-to-select-and-record-ROUTING_REASON",
869
873
  "independence": "cross-frontier-is-an-exception-only-when-a-concrete-independent-judgment-from-the-main-is-required-main-records-that-need-in-ROUTING_REASON-never-mix-an-implementation-maker-with-an-implicit-independent-review-role",
870
874
  "scope": "model-and-effort-selection-only-access-program-fields-are-omitted"