cuelo 0.10.52 → 0.10.53

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 (484) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/app-path-routes-manifest.json +35 -35
  3. package/.next/build-manifest.json +4 -4
  4. package/.next/next-server.js.nft.json +1 -1
  5. package/.next/prerender-manifest.json +3 -3
  6. package/.next/react-loadable-manifest.json +549 -561
  7. package/.next/required-server-files.js +25 -25
  8. package/.next/required-server-files.json +25 -25
  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 +2 -2
  23. package/.next/server/app/_not-found.segments/_full.segment.rsc +2 -2
  24. package/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  25. package/.next/server/app/_not-found.segments/_index.segment.rsc +2 -2
  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 +1 -1
  29. package/.next/server/app/api/agent/[id]/account/route.js +1 -1
  30. package/.next/server/app/api/agent/[id]/account/route_client-reference-manifest.js +1 -1
  31. package/.next/server/app/api/agent/[id]/bash-output/route.js +1 -1
  32. package/.next/server/app/api/agent/[id]/bash-output/route_client-reference-manifest.js +1 -1
  33. package/.next/server/app/api/agent/[id]/events/route.js +2 -2
  34. package/.next/server/app/api/agent/[id]/events/route_client-reference-manifest.js +1 -1
  35. package/.next/server/app/api/agent/[id]/route.js +1 -1
  36. package/.next/server/app/api/agent/[id]/route_client-reference-manifest.js +1 -1
  37. package/.next/server/app/api/agent/new/route.js +1 -1
  38. package/.next/server/app/api/agent/new/route_client-reference-manifest.js +1 -1
  39. package/.next/server/app/api/agent/running/route.js +1 -1
  40. package/.next/server/app/api/agent/running/route_client-reference-manifest.js +1 -1
  41. package/.next/server/app/api/attachment-settings/route.js +1 -1
  42. package/.next/server/app/api/attachment-settings/route_client-reference-manifest.js +1 -1
  43. package/.next/server/app/api/attachments/[id]/transcription/route.js +2 -2
  44. package/.next/server/app/api/attachments/[id]/transcription/route_client-reference-manifest.js +1 -1
  45. package/.next/server/app/api/attachments/draft/route.js +1 -1
  46. package/.next/server/app/api/attachments/draft/route_client-reference-manifest.js +1 -1
  47. package/.next/server/app/api/attachments/route.js +2 -2
  48. package/.next/server/app/api/attachments/route_client-reference-manifest.js +1 -1
  49. package/.next/server/app/api/auth/all-providers/route.js +1 -1
  50. package/.next/server/app/api/auth/all-providers/route_client-reference-manifest.js +1 -1
  51. package/.next/server/app/api/auth/api-key/[provider]/route.js +1 -1
  52. package/.next/server/app/api/auth/api-key/[provider]/route_client-reference-manifest.js +1 -1
  53. package/.next/server/app/api/auth/login/[provider]/route.js +1 -1
  54. package/.next/server/app/api/auth/login/[provider]/route_client-reference-manifest.js +1 -1
  55. package/.next/server/app/api/auth/logout/[provider]/route.js +1 -1
  56. package/.next/server/app/api/auth/logout/[provider]/route_client-reference-manifest.js +1 -1
  57. package/.next/server/app/api/auth/providers/route.js +1 -1
  58. package/.next/server/app/api/auth/providers/route_client-reference-manifest.js +1 -1
  59. package/.next/server/app/api/character-mode/route.js +1 -2
  60. package/.next/server/app/api/character-mode/route.js.nft.json +1 -1
  61. package/.next/server/app/api/character-mode/route_client-reference-manifest.js +1 -1
  62. package/.next/server/app/api/cwd/browse/route.js +1 -1
  63. package/.next/server/app/api/cwd/browse/route_client-reference-manifest.js +1 -1
  64. package/.next/server/app/api/cwd/validate/route.js +1 -1
  65. package/.next/server/app/api/cwd/validate/route_client-reference-manifest.js +1 -1
  66. package/.next/server/app/api/default-cwd/route.js +1 -1
  67. package/.next/server/app/api/default-cwd/route_client-reference-manifest.js +1 -1
  68. package/.next/server/app/api/display-settings/route.js +1 -1
  69. package/.next/server/app/api/display-settings/route_client-reference-manifest.js +1 -1
  70. package/.next/server/app/api/document-text/route.js +2 -2
  71. package/.next/server/app/api/document-text/route_client-reference-manifest.js +1 -1
  72. package/.next/server/app/api/experiments/route.js +1 -1
  73. package/.next/server/app/api/experiments/route_client-reference-manifest.js +1 -1
  74. package/.next/server/app/api/file-index/route.js +1 -1
  75. package/.next/server/app/api/file-index/route_client-reference-manifest.js +1 -1
  76. package/.next/server/app/api/files/[...path]/route.js +1 -1
  77. package/.next/server/app/api/files/[...path]/route_client-reference-manifest.js +1 -1
  78. package/.next/server/app/api/git/diff/route.js +1 -1
  79. package/.next/server/app/api/git/diff/route_client-reference-manifest.js +1 -1
  80. package/.next/server/app/api/git/status/route.js +2 -2
  81. package/.next/server/app/api/git/status/route_client-reference-manifest.js +1 -1
  82. package/.next/server/app/api/github/projects/route.js +1 -1
  83. package/.next/server/app/api/github/projects/route_client-reference-manifest.js +1 -1
  84. package/.next/server/app/api/gpt6/handles/route.js +1 -1
  85. package/.next/server/app/api/gpt6/handles/route_client-reference-manifest.js +1 -1
  86. package/.next/server/app/api/gpt6/reply/route.js +1 -1
  87. package/.next/server/app/api/gpt6/reply/route_client-reference-manifest.js +1 -1
  88. package/.next/server/app/api/gpt6/token/route.js +1 -1
  89. package/.next/server/app/api/gpt6/token/route_client-reference-manifest.js +1 -1
  90. package/.next/server/app/api/gpt6/web6-session/route.js +1 -1
  91. package/.next/server/app/api/gpt6/web6-session/route_client-reference-manifest.js +1 -1
  92. package/.next/server/app/api/home/route.js +1 -1
  93. package/.next/server/app/api/home/route_client-reference-manifest.js +1 -1
  94. package/.next/server/app/api/live/call/[callId]/route.js +2 -2
  95. package/.next/server/app/api/live/call/[callId]/route.js.nft.json +1 -1
  96. package/.next/server/app/api/live/call/[callId]/route_client-reference-manifest.js +1 -1
  97. package/.next/server/app/api/live/events/route.js +2 -2
  98. package/.next/server/app/api/live/events/route.js.nft.json +1 -1
  99. package/.next/server/app/api/live/events/route_client-reference-manifest.js +1 -1
  100. package/.next/server/app/api/live/interpret/route.js +2 -2
  101. package/.next/server/app/api/live/interpret/route.js.nft.json +1 -1
  102. package/.next/server/app/api/live/interpret/route_client-reference-manifest.js +1 -1
  103. package/.next/server/app/api/live/offer/route.js +1 -1
  104. package/.next/server/app/api/live/offer/route.js.nft.json +1 -1
  105. package/.next/server/app/api/live/offer/route_client-reference-manifest.js +1 -1
  106. package/.next/server/app/api/live/voices/route.js +1 -1
  107. package/.next/server/app/api/live/voices/route.js.nft.json +1 -1
  108. package/.next/server/app/api/live/voices/route_client-reference-manifest.js +1 -1
  109. package/.next/server/app/api/mcp/route.js +2 -2
  110. package/.next/server/app/api/mcp/route_client-reference-manifest.js +1 -1
  111. package/.next/server/app/api/model-roles/route.js +1 -1
  112. package/.next/server/app/api/model-roles/route_client-reference-manifest.js +1 -1
  113. package/.next/server/app/api/models/route.js +1 -1
  114. package/.next/server/app/api/models/route_client-reference-manifest.js +1 -1
  115. package/.next/server/app/api/models-config/catalog/route.js +1 -1
  116. package/.next/server/app/api/models-config/catalog/route_client-reference-manifest.js +1 -1
  117. package/.next/server/app/api/models-config/discover/route.js +1 -1
  118. package/.next/server/app/api/models-config/discover/route_client-reference-manifest.js +1 -1
  119. package/.next/server/app/api/models-config/route.js +3 -3
  120. package/.next/server/app/api/models-config/route_client-reference-manifest.js +1 -1
  121. package/.next/server/app/api/models-config/test/route.js +1 -1
  122. package/.next/server/app/api/models-config/test/route_client-reference-manifest.js +1 -1
  123. package/.next/server/app/api/office-characters/[...path]/route.js +1 -2
  124. package/.next/server/app/api/office-characters/[...path]/route.js.nft.json +1 -1
  125. package/.next/server/app/api/office-characters/[...path]/route_client-reference-manifest.js +1 -1
  126. package/.next/server/app/api/plugins/route.js +1 -1
  127. package/.next/server/app/api/plugins/route_client-reference-manifest.js +1 -1
  128. package/.next/server/app/api/project-docs/route.js +1 -1
  129. package/.next/server/app/api/project-docs/route_client-reference-manifest.js +1 -1
  130. package/.next/server/app/api/project-trust/route.js +1 -1
  131. package/.next/server/app/api/project-trust/route_client-reference-manifest.js +1 -1
  132. package/.next/server/app/api/projects/route.js +2 -2
  133. package/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
  134. package/.next/server/app/api/runs/[runId]/prelude/route.js +1 -1
  135. package/.next/server/app/api/runs/[runId]/prelude/route_client-reference-manifest.js +1 -1
  136. package/.next/server/app/api/runs/[runId]/route.js +1 -1
  137. package/.next/server/app/api/runs/[runId]/route_client-reference-manifest.js +1 -1
  138. package/.next/server/app/api/runs/[runId]/turns/route.js +1 -1
  139. package/.next/server/app/api/runs/[runId]/turns/route_client-reference-manifest.js +1 -1
  140. package/.next/server/app/api/runs/route.js +1 -1
  141. package/.next/server/app/api/runs/route_client-reference-manifest.js +1 -1
  142. package/.next/server/app/api/sessions/[id]/auto-name/route.js +1 -1
  143. package/.next/server/app/api/sessions/[id]/auto-name/route_client-reference-manifest.js +1 -1
  144. package/.next/server/app/api/sessions/[id]/context/route.js +1 -1
  145. package/.next/server/app/api/sessions/[id]/context/route_client-reference-manifest.js +1 -1
  146. package/.next/server/app/api/sessions/[id]/entries/[entryId]/thinking/route.js +1 -1
  147. package/.next/server/app/api/sessions/[id]/entries/[entryId]/thinking/route_client-reference-manifest.js +1 -1
  148. package/.next/server/app/api/sessions/[id]/export/route.js +1 -1
  149. package/.next/server/app/api/sessions/[id]/export/route_client-reference-manifest.js +1 -1
  150. package/.next/server/app/api/sessions/[id]/route.js +1 -1
  151. package/.next/server/app/api/sessions/[id]/route_client-reference-manifest.js +1 -1
  152. package/.next/server/app/api/sessions/[id]/state/route.js +1 -1
  153. package/.next/server/app/api/sessions/[id]/state/route_client-reference-manifest.js +1 -1
  154. package/.next/server/app/api/sessions/route.js +1 -1
  155. package/.next/server/app/api/sessions/route_client-reference-manifest.js +1 -1
  156. package/.next/server/app/api/sessions/search/route.js +1 -1
  157. package/.next/server/app/api/sessions/search/route_client-reference-manifest.js +1 -1
  158. package/.next/server/app/api/settings/route.js +1 -1
  159. package/.next/server/app/api/settings/route_client-reference-manifest.js +1 -1
  160. package/.next/server/app/api/sidecars/[service]/[...path]/route.js +1 -1
  161. package/.next/server/app/api/sidecars/[service]/[...path]/route_client-reference-manifest.js +1 -1
  162. package/.next/server/app/api/skills/check/route.js +1 -1
  163. package/.next/server/app/api/skills/check/route_client-reference-manifest.js +1 -1
  164. package/.next/server/app/api/skills/install/route.js +2 -2
  165. package/.next/server/app/api/skills/install/route_client-reference-manifest.js +1 -1
  166. package/.next/server/app/api/skills/route.js +1 -1
  167. package/.next/server/app/api/skills/route_client-reference-manifest.js +1 -1
  168. package/.next/server/app/api/skills/search/route.js +1 -1
  169. package/.next/server/app/api/skills/search/route_client-reference-manifest.js +1 -1
  170. package/.next/server/app/api/skills/update/route.js +1 -1
  171. package/.next/server/app/api/skills/update/route_client-reference-manifest.js +1 -1
  172. package/.next/server/app/api/subagents/eta/route.js +1 -1
  173. package/.next/server/app/api/subagents/eta/route_client-reference-manifest.js +1 -1
  174. package/.next/server/app/api/theme/route.js +1 -1
  175. package/.next/server/app/api/theme/route_client-reference-manifest.js +1 -1
  176. package/.next/server/app/api/tool-image/route.js +1 -1
  177. package/.next/server/app/api/tool-image/route_client-reference-manifest.js +1 -1
  178. package/.next/server/app/api/update-maintenance/route.js +2 -2
  179. package/.next/server/app/api/update-maintenance/route_client-reference-manifest.js +1 -1
  180. package/.next/server/app/api/updates/route.js +1 -1
  181. package/.next/server/app/api/updates/route_client-reference-manifest.js +1 -1
  182. package/.next/server/app/api/web-access/recovery/route.js +1 -1
  183. package/.next/server/app/api/web-access/recovery/route_client-reference-manifest.js +1 -1
  184. package/.next/server/app/api/web-access/route.js +1 -1
  185. package/.next/server/app/api/web-access/route_client-reference-manifest.js +1 -1
  186. package/.next/server/app/api/web6/consults/route.js +1 -1
  187. package/.next/server/app/api/web6/consults/route_client-reference-manifest.js +1 -1
  188. package/.next/server/app/api/worktrees/route.js +1 -1
  189. package/.next/server/app/api/worktrees/route_client-reference-manifest.js +1 -1
  190. package/.next/server/app/favicon.ico/route.js +1 -1
  191. package/.next/server/app/index.html +1 -1
  192. package/.next/server/app/index.rsc +4 -4
  193. package/.next/server/app/index.segments/__PAGE__.segment.rsc +3 -3
  194. package/.next/server/app/index.segments/_full.segment.rsc +4 -4
  195. package/.next/server/app/index.segments/_head.segment.rsc +1 -1
  196. package/.next/server/app/index.segments/_index.segment.rsc +2 -2
  197. package/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  198. package/.next/server/app/manifest.webmanifest/route.js +2 -2
  199. package/.next/server/app/manifest.webmanifest/route_client-reference-manifest.js +1 -1
  200. package/.next/server/app/page.js +5 -5
  201. package/.next/server/app/page_client-reference-manifest.js +1 -1
  202. package/.next/server/app/recover/page.js +2 -2
  203. package/.next/server/app/recover/page_client-reference-manifest.js +1 -1
  204. package/.next/server/app/recover.html +1 -1
  205. package/.next/server/app/recover.rsc +3 -3
  206. package/.next/server/app/recover.segments/_full.segment.rsc +3 -3
  207. package/.next/server/app/recover.segments/_head.segment.rsc +1 -1
  208. package/.next/server/app/recover.segments/_index.segment.rsc +2 -2
  209. package/.next/server/app/recover.segments/_tree.segment.rsc +1 -1
  210. package/.next/server/app/recover.segments/recover/__PAGE__.segment.rsc +2 -2
  211. package/.next/server/app/recover.segments/recover.segment.rsc +1 -1
  212. package/.next/server/app-paths-manifest.json +35 -35
  213. package/.next/server/chunks/1008.js +2 -2
  214. package/.next/server/chunks/1966.js +2 -0
  215. package/.next/server/chunks/319.js +3 -3
  216. package/.next/server/chunks/6429.js +2 -2
  217. package/.next/server/chunks/6775.js +7 -0
  218. package/.next/server/middleware-build-manifest.js +1 -1
  219. package/.next/server/middleware-react-loadable-manifest.js +1 -1
  220. package/.next/server/middleware.js +9 -9
  221. package/.next/server/pages/404.html +1 -1
  222. package/.next/server/pages/500.html +1 -1
  223. package/.next/server/server-reference-manifest.json +1 -1
  224. package/.next/static/chunks/app/_not-found/page-041b64675adcdf82.js +1 -0
  225. package/.next/static/chunks/app/layout-3b1f8b74c7fc5e77.js +1 -0
  226. package/.next/static/chunks/app/{page-3640086c732eb87d.js → page-efae4fdcf84b7a14.js} +4 -4
  227. package/.next/static/chunks/app/recover/{page-c0c40b3c215078a4.js → page-2bcd6a351f3eda3d.js} +1 -1
  228. package/.next/static/chunks/{main-app-fbc4aa3c15d48613.js → main-app-ca46ab75db2b4e4b.js} +1 -1
  229. package/.next/static/chunks/main-dd4c9daba44bef88.js +5 -0
  230. package/.next/static/chunks/next/dist/client/components/builtin/global-error-dac2a58a3b9eb28e.js +1 -0
  231. package/.next/static/chunks/webpack-546c8221d1906945.js +1 -0
  232. package/.next/trace +107 -107
  233. package/.next/trace-build +1 -1
  234. package/.next/types/app/api/agent/[id]/account/route.ts +1 -1
  235. package/.next/types/app/api/agent/[id]/bash-output/route.ts +1 -1
  236. package/.next/types/app/api/agent/[id]/events/route.ts +1 -1
  237. package/.next/types/app/api/agent/[id]/route.ts +1 -1
  238. package/.next/types/app/api/agent/new/route.ts +1 -1
  239. package/.next/types/app/api/agent/running/route.ts +1 -1
  240. package/.next/types/app/api/attachment-settings/route.ts +1 -1
  241. package/.next/types/app/api/attachments/[id]/transcription/route.ts +1 -1
  242. package/.next/types/app/api/attachments/draft/route.ts +1 -1
  243. package/.next/types/app/api/attachments/route.ts +1 -1
  244. package/.next/types/app/api/auth/all-providers/route.ts +1 -1
  245. package/.next/types/app/api/auth/api-key/[provider]/route.ts +1 -1
  246. package/.next/types/app/api/auth/login/[provider]/route.ts +1 -1
  247. package/.next/types/app/api/auth/logout/[provider]/route.ts +1 -1
  248. package/.next/types/app/api/auth/providers/route.ts +1 -1
  249. package/.next/types/app/api/character-mode/route.ts +1 -1
  250. package/.next/types/app/api/cwd/browse/route.ts +1 -1
  251. package/.next/types/app/api/cwd/validate/route.ts +1 -1
  252. package/.next/types/app/api/default-cwd/route.ts +1 -1
  253. package/.next/types/app/api/display-settings/route.ts +1 -1
  254. package/.next/types/app/api/document-text/route.ts +1 -1
  255. package/.next/types/app/api/experiments/route.ts +1 -1
  256. package/.next/types/app/api/file-index/route.ts +1 -1
  257. package/.next/types/app/api/files/[...path]/route.ts +1 -1
  258. package/.next/types/app/api/git/diff/route.ts +1 -1
  259. package/.next/types/app/api/git/status/route.ts +1 -1
  260. package/.next/types/app/api/github/projects/route.ts +1 -1
  261. package/.next/types/app/api/gpt6/handles/route.ts +1 -1
  262. package/.next/types/app/api/gpt6/reply/route.ts +1 -1
  263. package/.next/types/app/api/gpt6/token/route.ts +1 -1
  264. package/.next/types/app/api/gpt6/web6-session/route.ts +1 -1
  265. package/.next/types/app/api/home/route.ts +1 -1
  266. package/.next/types/app/api/live/call/[callId]/route.ts +1 -1
  267. package/.next/types/app/api/live/events/route.ts +1 -1
  268. package/.next/types/app/api/live/interpret/route.ts +1 -1
  269. package/.next/types/app/api/live/offer/route.ts +1 -1
  270. package/.next/types/app/api/live/voices/route.ts +1 -1
  271. package/.next/types/app/api/mcp/route.ts +1 -1
  272. package/.next/types/app/api/model-roles/route.ts +1 -1
  273. package/.next/types/app/api/models/route.ts +1 -1
  274. package/.next/types/app/api/models-config/catalog/route.ts +1 -1
  275. package/.next/types/app/api/models-config/discover/route.ts +1 -1
  276. package/.next/types/app/api/models-config/route.ts +1 -1
  277. package/.next/types/app/api/models-config/test/route.ts +1 -1
  278. package/.next/types/app/api/office-characters/[...path]/route.ts +1 -1
  279. package/.next/types/app/api/plugins/route.ts +1 -1
  280. package/.next/types/app/api/project-docs/route.ts +1 -1
  281. package/.next/types/app/api/project-trust/route.ts +1 -1
  282. package/.next/types/app/api/projects/route.ts +1 -1
  283. package/.next/types/app/api/runs/[runId]/prelude/route.ts +1 -1
  284. package/.next/types/app/api/runs/[runId]/route.ts +1 -1
  285. package/.next/types/app/api/runs/[runId]/turns/route.ts +1 -1
  286. package/.next/types/app/api/runs/route.ts +1 -1
  287. package/.next/types/app/api/sessions/[id]/auto-name/route.ts +1 -1
  288. package/.next/types/app/api/sessions/[id]/context/route.ts +1 -1
  289. package/.next/types/app/api/sessions/[id]/entries/[entryId]/thinking/route.ts +1 -1
  290. package/.next/types/app/api/sessions/[id]/export/route.ts +1 -1
  291. package/.next/types/app/api/sessions/[id]/route.ts +1 -1
  292. package/.next/types/app/api/sessions/[id]/state/route.ts +1 -1
  293. package/.next/types/app/api/sessions/route.ts +1 -1
  294. package/.next/types/app/api/sessions/search/route.ts +1 -1
  295. package/.next/types/app/api/settings/route.ts +1 -1
  296. package/.next/types/app/api/sidecars/[service]/[...path]/route.ts +1 -1
  297. package/.next/types/app/api/skills/check/route.ts +1 -1
  298. package/.next/types/app/api/skills/install/route.ts +1 -1
  299. package/.next/types/app/api/skills/route.ts +1 -1
  300. package/.next/types/app/api/skills/search/route.ts +1 -1
  301. package/.next/types/app/api/skills/update/route.ts +1 -1
  302. package/.next/types/app/api/subagents/eta/route.ts +1 -1
  303. package/.next/types/app/api/theme/route.ts +1 -1
  304. package/.next/types/app/api/tool-image/route.ts +1 -1
  305. package/.next/types/app/api/update-maintenance/route.ts +1 -1
  306. package/.next/types/app/api/updates/route.ts +1 -1
  307. package/.next/types/app/api/web-access/recovery/route.ts +1 -1
  308. package/.next/types/app/api/web-access/route.ts +1 -1
  309. package/.next/types/app/api/web6/consults/route.ts +1 -1
  310. package/.next/types/app/api/worktrees/route.ts +1 -1
  311. package/.next/types/app/layout.ts +1 -1
  312. package/.next/types/app/page.ts +1 -1
  313. package/.next/types/app/recover/page.ts +1 -1
  314. package/LICENSE +22 -22
  315. package/README.md +273 -271
  316. package/Tools/CUELO_Setup/files/btw-server.js +346 -346
  317. package/Tools/CUELO_Setup/files/native-runtime-patch.js +238 -238
  318. package/Tools/CUELO_Setup/files/subagent-server.js +587 -587
  319. package/Tools/CUELO_Setup/files/usage-server.js +1057 -1057
  320. package/Tools/OMP_Global_Config/agent/AGENTS.md +144 -144
  321. package/Tools/OMP_Global_Config/agent/RULES.md +140 -140
  322. package/Tools/OMP_Global_Config/agent/TITLE_SYSTEM.md +17 -17
  323. package/Tools/OMP_Global_Config/agent/WATCHDOG.md +55 -55
  324. package/Tools/OMP_Global_Config/agent/agents/maker.md +413 -413
  325. package/Tools/OMP_Global_Config/agent/extensions/character-voice.ts +1035 -1035
  326. package/Tools/OMP_Global_Config/agent/extensions/command-guard/index.ts +1110 -1110
  327. package/Tools/OMP_Global_Config/agent/extensions/command-guard/interop-hint.ts +133 -133
  328. package/Tools/OMP_Global_Config/agent/extensions/command-guard/matcher.ts +2258 -2258
  329. package/Tools/OMP_Global_Config/agent/extensions/command-guard/powershell-syntax.ts +210 -210
  330. package/Tools/OMP_Global_Config/agent/extensions/command-guard/task-guard.ts +1137 -1121
  331. package/Tools/OMP_Global_Config/agent/extensions/cross-review.ts +132 -132
  332. package/Tools/OMP_Global_Config/agent/extensions/docmap-route.ts +133 -133
  333. package/Tools/OMP_Global_Config/agent/extensions/draft/markdown.ts +226 -226
  334. package/Tools/OMP_Global_Config/agent/extensions/draft/ooxml.ts +222 -222
  335. package/Tools/OMP_Global_Config/agent/extensions/draft/pdf.ts +63 -63
  336. package/Tools/OMP_Global_Config/agent/extensions/draft/zip.ts +73 -73
  337. package/Tools/OMP_Global_Config/agent/extensions/draft.ts +204 -204
  338. package/Tools/OMP_Global_Config/agent/extensions/edit-lessons.ts +159 -159
  339. package/Tools/OMP_Global_Config/agent/extensions/external-advice-check.ts +36 -36
  340. package/Tools/OMP_Global_Config/agent/extensions/gitnexus-autosync.ts +406 -406
  341. package/Tools/OMP_Global_Config/agent/extensions/image-question-router.ts +55 -55
  342. package/Tools/OMP_Global_Config/agent/extensions/jev-runtime.ts +2700 -2700
  343. package/Tools/OMP_Global_Config/agent/extensions/korean-reply-guard.ts +190 -190
  344. package/Tools/OMP_Global_Config/agent/extensions/lib/cross-review.ts +1208 -1208
  345. package/Tools/OMP_Global_Config/agent/extensions/lib/docmap-search.ts +612 -612
  346. package/Tools/OMP_Global_Config/agent/extensions/lib/job-observation.ts +182 -182
  347. package/Tools/OMP_Global_Config/agent/extensions/lib/maker-routing.ts +1332 -1332
  348. package/Tools/OMP_Global_Config/agent/extensions/lib/mcp-selection.ts +361 -361
  349. package/Tools/OMP_Global_Config/agent/extensions/lib/memory-excerpt.ts +5 -5
  350. package/Tools/OMP_Global_Config/agent/extensions/lib/native-judge.ts +113 -113
  351. package/Tools/OMP_Global_Config/agent/extensions/lib/prepared-task.ts +211 -211
  352. package/Tools/OMP_Global_Config/agent/extensions/lib/routing-ledger.ts +538 -538
  353. package/Tools/OMP_Global_Config/agent/extensions/lib/session-identity.ts +34 -34
  354. package/Tools/OMP_Global_Config/agent/extensions/lib/task-progress.ts +492 -492
  355. package/Tools/OMP_Global_Config/agent/extensions/mcp-selection.ts +301 -301
  356. package/Tools/OMP_Global_Config/agent/extensions/prompt-compact.ts +67 -67
  357. package/Tools/OMP_Global_Config/agent/extensions/report-chart-guard.ts +102 -102
  358. package/Tools/OMP_Global_Config/agent/extensions/skim.ts +332 -332
  359. package/Tools/OMP_Global_Config/agent/extensions/steering-reply-gate.ts +207 -207
  360. package/Tools/OMP_Global_Config/agent/extensions/todo-nudge.ts +80 -80
  361. package/Tools/OMP_Global_Config/agent/extensions/turn-end-guard.ts +421 -421
  362. package/Tools/OMP_Global_Config/agent/prompt-copies/AGENTS.en.md +147 -147
  363. package/Tools/OMP_Global_Config/agent/prompt-copies/RULES.en.md +49 -49
  364. package/Tools/OMP_Global_Config/agent/rules/docs-handoff.md +39 -39
  365. package/Tools/OMP_Global_Config/agent/rules/frontend.md +74 -74
  366. package/Tools/OMP_Global_Config/agent/rules/harness-policy.json +1224 -1224
  367. package/Tools/OMP_Global_Config/agent/rules/legacy-encoding.md +21 -21
  368. package/Tools/OMP_Global_Config/agent/rules/meta-harness.md +45 -45
  369. package/Tools/OMP_Global_Config/agent/rules/omp-harness.md +151 -151
  370. package/Tools/OMP_Global_Config/agent/rules/subagent.md +750 -750
  371. package/Tools/OMP_Global_Config/agent/rules/task-guard.md +62 -62
  372. package/Tools/OMP_Global_Config/agent/rules/verdict.md +210 -210
  373. package/Tools/OMP_Global_Config/agent/rules/web6-consult.md +83 -83
  374. package/Tools/OMP_Global_Config/agent/sop/_common.md +136 -136
  375. package/Tools/OMP_Global_Config/agent/sop/_writer.md +259 -259
  376. package/Tools/OMP_Global_Config/agent/sop/maker.md +9 -9
  377. package/Tools/OMP_Global_Config/agent/tools/git-finalizer/finalizer.ps1 +409 -409
  378. package/Tools/OMP_Global_Config/agent/tools/git-finalizer/index.ts +303 -303
  379. package/Tools/OMP_Global_Config/agent/tools/git-finalizer/sync-checkout.ts +184 -184
  380. package/Tools/OMP_Global_Config/agent/tools/git-finalizer/wsl-git.ts +96 -96
  381. package/Tools/OMP_Global_Config/agent/tools/windows-build/index.ts +387 -387
  382. package/Tools/OMP_Global_Config/agent/tools/windows-control/control.ps1 +200 -200
  383. package/Tools/OMP_Global_Config/agent/tools/windows-control/index.ts +255 -255
  384. package/Tools/OMP_Global_Config/notices/orchestrate.md +26 -26
  385. package/Tools/OMP_Global_Config/notices/ultrathink.md +9 -9
  386. package/Tools/OMP_Global_Config/notices/workflow.md +16 -16
  387. package/Tools/OMP_Global_Config/patches/apply-core-patch.mjs +18339 -18304
  388. package/Tools/OMP_Global_Config/patches/apply-notices.mjs +135 -135
  389. package/bin/cuelo-options.js +38 -38
  390. package/bin/cuelo.js +273 -273
  391. package/bin/docker-entrypoint.mjs +19 -19
  392. package/bin/password-prompt.js +100 -100
  393. package/bin/prepare-runtime.js +112 -112
  394. package/bin/runtime.js +134 -134
  395. package/bin/web-auth-store.d.ts +104 -104
  396. package/bin/web-auth-store.js +593 -593
  397. package/install.mjs +427 -427
  398. package/next.config.ts +104 -104
  399. package/package.json +141 -141
  400. package/public/audio/completion/voices.json +1393 -1393
  401. package/public/fonts/cuelo-display/NOTICE.txt +15 -15
  402. package/public/fonts/fonts.css +288 -288
  403. package/public/fonts/jetbrains-mono/OFL.txt +93 -93
  404. package/public/fonts/wanted-sans/OFL.txt +93 -93
  405. package/public/icons/catppuccin/LICENSE +22 -22
  406. package/public/icons/catppuccin/README.md +8 -8
  407. package/public/icons/catppuccin/latte/_file.svg +3 -3
  408. package/public/icons/catppuccin/latte/_folder.svg +3 -3
  409. package/public/icons/catppuccin/latte/_folder_open.svg +3 -3
  410. package/public/icons/catppuccin/latte/bash.svg +7 -7
  411. package/public/icons/catppuccin/latte/bun-lock.svg +8 -8
  412. package/public/icons/catppuccin/latte/config.svg +3 -3
  413. package/public/icons/catppuccin/latte/css.svg +6 -6
  414. package/public/icons/catppuccin/latte/database.svg +3 -3
  415. package/public/icons/catppuccin/latte/docker.svg +3 -3
  416. package/public/icons/catppuccin/latte/env.svg +3 -3
  417. package/public/icons/catppuccin/latte/eslint.svg +6 -6
  418. package/public/icons/catppuccin/latte/git.svg +6 -6
  419. package/public/icons/catppuccin/latte/go.svg +3 -3
  420. package/public/icons/catppuccin/latte/graphql.svg +3 -3
  421. package/public/icons/catppuccin/latte/html.svg +6 -6
  422. package/public/icons/catppuccin/latte/javascript-react.svg +8 -8
  423. package/public/icons/catppuccin/latte/javascript.svg +6 -6
  424. package/public/icons/catppuccin/latte/json.svg +3 -3
  425. package/public/icons/catppuccin/latte/lock.svg +3 -3
  426. package/public/icons/catppuccin/latte/markdown.svg +3 -3
  427. package/public/icons/catppuccin/latte/ms-word.svg +6 -6
  428. package/public/icons/catppuccin/latte/next.svg +6 -6
  429. package/public/icons/catppuccin/latte/npm-lock.svg +7 -7
  430. package/public/icons/catppuccin/latte/pdf.svg +3 -3
  431. package/public/icons/catppuccin/latte/python.svg +8 -8
  432. package/public/icons/catppuccin/latte/rust.svg +6 -6
  433. package/public/icons/catppuccin/latte/sass.svg +3 -3
  434. package/public/icons/catppuccin/latte/terraform.svg +3 -3
  435. package/public/icons/catppuccin/latte/toml.svg +3 -3
  436. package/public/icons/catppuccin/latte/typescript-react.svg +8 -8
  437. package/public/icons/catppuccin/latte/typescript.svg +6 -6
  438. package/public/icons/catppuccin/latte/yaml.svg +3 -3
  439. package/public/icons/catppuccin/mocha/_file.svg +3 -3
  440. package/public/icons/catppuccin/mocha/_folder.svg +3 -3
  441. package/public/icons/catppuccin/mocha/_folder_open.svg +3 -3
  442. package/public/icons/catppuccin/mocha/bash.svg +7 -7
  443. package/public/icons/catppuccin/mocha/bun-lock.svg +8 -8
  444. package/public/icons/catppuccin/mocha/config.svg +3 -3
  445. package/public/icons/catppuccin/mocha/css.svg +6 -6
  446. package/public/icons/catppuccin/mocha/database.svg +3 -3
  447. package/public/icons/catppuccin/mocha/docker.svg +3 -3
  448. package/public/icons/catppuccin/mocha/env.svg +3 -3
  449. package/public/icons/catppuccin/mocha/eslint.svg +6 -6
  450. package/public/icons/catppuccin/mocha/git.svg +6 -6
  451. package/public/icons/catppuccin/mocha/go.svg +3 -3
  452. package/public/icons/catppuccin/mocha/graphql.svg +3 -3
  453. package/public/icons/catppuccin/mocha/html.svg +6 -6
  454. package/public/icons/catppuccin/mocha/javascript-react.svg +8 -8
  455. package/public/icons/catppuccin/mocha/javascript.svg +6 -6
  456. package/public/icons/catppuccin/mocha/json.svg +3 -3
  457. package/public/icons/catppuccin/mocha/lock.svg +3 -3
  458. package/public/icons/catppuccin/mocha/markdown.svg +3 -3
  459. package/public/icons/catppuccin/mocha/ms-word.svg +6 -6
  460. package/public/icons/catppuccin/mocha/next.svg +6 -6
  461. package/public/icons/catppuccin/mocha/npm-lock.svg +7 -7
  462. package/public/icons/catppuccin/mocha/pdf.svg +3 -3
  463. package/public/icons/catppuccin/mocha/python.svg +8 -8
  464. package/public/icons/catppuccin/mocha/rust.svg +6 -6
  465. package/public/icons/catppuccin/mocha/sass.svg +3 -3
  466. package/public/icons/catppuccin/mocha/terraform.svg +3 -3
  467. package/public/icons/catppuccin/mocha/toml.svg +3 -3
  468. package/public/icons/catppuccin/mocha/typescript-react.svg +8 -8
  469. package/public/icons/catppuccin/mocha/typescript.svg +6 -6
  470. package/public/icons/catppuccin/mocha/yaml.svg +3 -3
  471. package/public/icons/cuelo-icon.svg +8 -8
  472. package/public/offline.html +145 -145
  473. package/public/sw.js +135 -135
  474. package/.next/server/chunks/205.js +0 -7
  475. package/.next/server/chunks/7738.js +0 -1
  476. package/.next/static/chunks/1966.b8f83f7ba376c962.js +0 -1
  477. package/.next/static/chunks/3899.3f761f7e3a944e8c.js +0 -1
  478. package/.next/static/chunks/app/_not-found/page-9e5295df095e2e41.js +0 -1
  479. package/.next/static/chunks/app/layout-8b29ba206a96135e.js +0 -1
  480. package/.next/static/chunks/main-1ddb405481ce21f6.js +0 -5
  481. package/.next/static/chunks/next/dist/client/components/builtin/global-error-50782c8c9c06c8b5.js +0 -1
  482. package/.next/static/chunks/webpack-7b514b9855bd748c.js +0 -1
  483. /package/.next/static/{dQA--5NX6NZt_A6pLZUde → -mDQEyWQ8VQsAfLpiACIP}/_buildManifest.js +0 -0
  484. /package/.next/static/{dQA--5NX6NZt_A6pLZUde → -mDQEyWQ8VQsAfLpiACIP}/_ssgManifest.js +0 -0
@@ -1,255 +1,255 @@
1
- import type { CustomToolFactory } from "@oh-my-pi/pi-coding-agent";
2
- import { posix } from "node:path";
3
-
4
- // 2026-10-21 사무실 실측(doc/history/2026/10/21-computer-background): WinForms에서 computer의 UIA press·setValue는
5
- // 효과는 있지만 사용자 전면 창을 가져가고, 게시된 win.click은 오류 없이 무시됐다. 같은 컨트롤 HWND에
6
- // SendMessage WM_SETTEXT·BM_CLICK을 보내면 전면 창을 지키며 25~45ms에 동작했다. 이 도구가 그 경로다.
7
-
8
- export type ControlAction = "list" | "read" | "setText" | "click";
9
-
10
- export interface WindowsControlParams {
11
- window: string | number;
12
- action: ControlAction;
13
- text?: string;
14
- className?: string;
15
- index?: number;
16
- value?: string;
17
- timeoutMs?: number;
18
- }
19
-
20
- export interface ExecResult { code: number; stdout: string; stderr?: string }
21
- export type Exec = (command: string, args: string[], options: { cwd: string; timeout?: number }) => Promise<ExecResult>;
22
-
23
- export interface ControlDeps {
24
- exec: Exec;
25
- cwd: string;
26
- /** WSL이면 스크립트 경로를 wslpath -w로 바꾼다. */
27
- wsl: boolean;
28
- scriptPath: string;
29
- }
30
-
31
- export interface ChildControl {
32
- Hwnd: number;
33
- ClassName: string;
34
- Text: string | null;
35
- ControlId: number;
36
- Visible: boolean;
37
- Enabled: boolean;
38
- /** -1: 상태를 읽을 수 없음(일반 버튼, WinForms처럼 직접 그리는 체크박스), 0: 해제, 1: 체크, 2: 불확정 */
39
- Check: number;
40
- }
41
-
42
- export interface ControlChange {
43
- hwnd: number;
44
- className: string;
45
- added?: boolean;
46
- removed?: boolean;
47
- text?: string | null;
48
- textBefore?: string | null;
49
- textAfter?: string | null;
50
- checkBefore?: number;
51
- checkAfter?: number;
52
- enabledAfter?: boolean;
53
- visibleAfter?: boolean;
54
- }
55
-
56
- export interface ControlResult {
57
- ok: boolean;
58
- error?: string;
59
- message?: string;
60
- action?: ControlAction;
61
- window?: number;
62
- windowClosed?: boolean;
63
- target?: ChildControl;
64
- targetAfter?: ChildControl | null;
65
- win32Error?: number;
66
- elapsedMs?: number;
67
- foregroundUnchanged?: boolean;
68
- changes?: ControlChange[] | ControlChange | null;
69
- controls?: ChildControl[] | ChildControl | null;
70
- matches?: ChildControl[] | ChildControl | null;
71
- shell?: string;
72
- }
73
-
74
- const DEFAULT_CLICK_TIMEOUT_MS = 2000;
75
- const MAX_LISTED = 40;
76
- const WIN32_TIMEOUT = 1460;
77
- const WIN32_ACCESS_DENIED = 5;
78
-
79
- /** 요청을 검증해 스크립트로 넘길 JSON으로 만든다. 잘못된 요청은 Windows를 부르기 전에 거절한다. */
80
- export function buildRequest(params: WindowsControlParams): Record<string, unknown> {
81
- const window = Number(params.window);
82
- if (!Number.isSafeInteger(window) || window <= 0) {
83
- throw new Error(`windows_control: window는 computer.window()의 id(양의 정수 HWND)여야 한다: ${String(params.window)}`);
84
- }
85
- const needsTarget = params.action !== "list";
86
- if (needsTarget && params.text === undefined && params.className === undefined) {
87
- throw new Error("windows_control: list 말고는 text 또는 className으로 대상 컨트롤을 지정해야 한다");
88
- }
89
- if (params.action === "setText" && params.value === undefined) {
90
- throw new Error("windows_control: setText에는 value가 필요하다");
91
- }
92
- if (params.index !== undefined && (!Number.isInteger(params.index) || params.index < 0)) {
93
- throw new Error(`windows_control: index는 0 이상의 정수여야 한다: ${params.index}`);
94
- }
95
- const timeoutMs = Math.max(100, Math.min(30_000, Math.trunc(params.timeoutMs ?? DEFAULT_CLICK_TIMEOUT_MS)));
96
- return {
97
- window,
98
- action: params.action,
99
- ...(params.text !== undefined ? { text: params.text } : {}),
100
- ...(params.className !== undefined ? { className: params.className } : {}),
101
- ...(params.index !== undefined ? { index: params.index } : {}),
102
- ...(params.value !== undefined ? { value: params.value } : {}),
103
- timeoutMs,
104
- };
105
- }
106
-
107
- export async function runWindowsControl(params: WindowsControlParams, deps: ControlDeps): Promise<ControlResult> {
108
- const request = buildRequest(params);
109
- let script = deps.scriptPath;
110
- if (deps.wsl) {
111
- const converted = await deps.exec("wslpath", ["-w", deps.scriptPath], { cwd: deps.cwd });
112
- script = converted.stdout.trim();
113
- if (converted.code !== 0 || !script) throw new Error(`windows_control: wslpath 변환 실패: ${converted.stderr ?? ""}`.trim());
114
- }
115
- const encoded = Buffer.from(JSON.stringify(request), "utf8").toString("base64");
116
- const args = ["-NoProfile", "-NonInteractive", "-ExecutionPolicy", "Bypass", "-File", script, "-Request", encoded];
117
- // 사용자 결정(10-09): Windows PowerShell 7(pwsh)을 먼저 쓰고, 없을 때만 5.1로 간다.
118
- // "없음"은 pi.exec가 실행 파일을 찾지 못해 code ENOENT로 throw한 경우뿐이다. pwsh가 실행돼서 실패한 경우
119
- // (어떤 종료 코드든)는 같은 요청을 다른 셸로 다시 보내지 않는다. 버튼을 두 번 누를 수 있어서다.
120
- let shell = "pwsh.exe";
121
- let result: ExecResult;
122
- try {
123
- result = await deps.exec(shell, args, { cwd: deps.cwd, timeout: 60_000 });
124
- } catch (error) {
125
- if ((error as NodeJS.ErrnoException | undefined)?.code !== "ENOENT") throw error;
126
- shell = "powershell.exe";
127
- result = await deps.exec(shell, args, { cwd: deps.cwd, timeout: 60_000 });
128
- }
129
- const line = result.stdout.split(/\r?\n/).map((text) => text.trim()).filter((text) => text.startsWith("{")).pop();
130
- if (!line) {
131
- const detail = [result.stderr, result.stdout].filter(Boolean).join("\n").trim().slice(0, 600);
132
- throw new Error(`windows_control: ${shell} exit ${result.code}, 결과 JSON 없음${detail ? `: ${detail}` : ""}`);
133
- }
134
- return { ...(JSON.parse(line) as ControlResult), shell };
135
- }
136
-
137
- /** ConvertTo-Json은 원소가 하나인 배열을 객체로 내보낸다. */
138
- function asList<T>(value: T[] | T | null | undefined): T[] {
139
- if (value === null || value === undefined) return [];
140
- return Array.isArray(value) ? value : [value];
141
- }
142
-
143
- function quote(text: string | null | undefined): string {
144
- if (text === null || text === undefined) return "(읽기 실패)";
145
- const flat = text.replace(/\r?\n/g, "⏎");
146
- return JSON.stringify(flat.length > 80 ? `${flat.slice(0, 80)}…` : flat);
147
- }
148
-
149
- function describe(child: ChildControl): string {
150
- const flags = [child.Visible ? "" : "숨김", child.Enabled ? "" : "비활성", child.Check >= 0 ? `check=${child.Check}` : ""].filter(Boolean);
151
- return `${child.ClassName} ${quote(child.Text)} hwnd=${child.Hwnd}${child.ControlId ? ` id=${child.ControlId}` : ""}${flags.length ? ` (${flags.join(", ")})` : ""}`;
152
- }
153
-
154
- function describeChange(change: ControlChange): string {
155
- if (change.added) return ` + ${change.className} hwnd=${change.hwnd} 새로 생김 ${quote(change.text)}`;
156
- if (change.removed) return ` - ${change.className} hwnd=${change.hwnd} 사라짐 ${quote(change.text)}`;
157
- const parts: string[] = [];
158
- if (change.textBefore !== change.textAfter) parts.push(`${quote(change.textBefore)} → ${quote(change.textAfter)}`);
159
- if (change.checkBefore !== change.checkAfter) parts.push(`check ${change.checkBefore} → ${change.checkAfter}`);
160
- if (parts.length === 0) parts.push(`enabled=${change.enabledAfter} visible=${change.visibleAfter}`);
161
- return ` ${change.className} hwnd=${change.hwnd}: ${parts.join(", ")}`;
162
- }
163
-
164
- function listBlock(title: string, children: ChildControl[]): string[] {
165
- const shown = children.slice(0, MAX_LISTED).map((child) => ` ${describe(child)}`);
166
- const more = children.length > MAX_LISTED ? [` … ${children.length - MAX_LISTED}개 더`] : [];
167
- return [`${title} (${children.length}개):`, ...shown, ...more];
168
- }
169
-
170
- export function formatControlResult(result: ControlResult): string {
171
- const lines: string[] = [];
172
- if (!result.ok && result.error) {
173
- switch (result.error) {
174
- case "window-not-found":
175
- return `windows_control: 창 hwnd=${result.window}가 없다. computer.window()로 id를 다시 확인한다.`;
176
- case "control-not-found":
177
- return [`windows_control: 조건에 맞는 컨트롤이 없다. 아무것도 보내지 않았다.`, ...listBlock("창의 컨트롤", asList(result.controls))].join("\n");
178
- case "ambiguous":
179
- return [`windows_control: 조건에 맞는 컨트롤이 여러 개다. index로 하나를 고른다. 아무것도 보내지 않았다.`, ...listBlock("후보(index 순서)", asList(result.matches))].join("\n");
180
- case "index-out-of-range":
181
- return [`windows_control: index가 후보 수를 넘는다. 아무것도 보내지 않았다.`, ...listBlock("후보(index 순서)", asList(result.matches))].join("\n");
182
- case "control-disabled":
183
- return `windows_control: 대상이 비활성이라 아무것도 보내지 않았다: ${result.target ? describe(result.target) : ""}`;
184
- case "script-error":
185
- return `windows_control: Windows 스크립트 오류: ${result.message ?? ""}`;
186
- }
187
- }
188
- const foreground = result.foregroundUnchanged
189
- ? "전면 창 유지."
190
- : "주의: 호출 사이 전면 창이 바뀌었다(이 호출 때문인지 사용자 조작인지 이 결과로는 구분할 수 없다).";
191
- if (result.action === "list") {
192
- lines.push(...listBlock(`창 hwnd=${result.window}의 자식 컨트롤`, asList(result.controls)), foreground);
193
- return lines.join("\n");
194
- }
195
- const target = result.target ? describe(result.target) : "(대상 미상)";
196
- const verb = result.action === "click" ? "BM_CLICK" : result.action === "setText" ? "WM_SETTEXT" : "읽기";
197
- if (result.ok) {
198
- lines.push(`${verb} ${result.action === "read" ? "완료" : "전달"}: ${target}${result.elapsedMs !== undefined && result.action !== "read" ? ` (${result.elapsedMs}ms)` : ""}`);
199
- } else if (result.win32Error === WIN32_TIMEOUT) {
200
- lines.push(`${verb} 전달됐지만 처리기가 ${result.action === "click" ? "timeoutMs" : "2초"} 안에 끝나지 않았다(모달 창이 열렸을 수 있다): ${target}`);
201
- } else if (result.win32Error === WIN32_ACCESS_DENIED) {
202
- lines.push(`${verb} 거부됨(Win32 5): 대상 프로그램이 관리자 권한으로 실행 중이다. 아무 효과도 없다고 본다: ${target}`);
203
- } else {
204
- lines.push(`${verb} 실패(Win32 ${result.win32Error}): ${target}`);
205
- }
206
- if (result.action !== "read" && !result.windowClosed) {
207
- lines.push(result.targetAfter ? `대상 지금: ${describe(result.targetAfter)}` : "대상 컨트롤이 사라졌다.");
208
- }
209
- if (result.windowClosed) lines.push("창이 닫혔다.");
210
- const changes = asList(result.changes);
211
- if (result.action !== "read" && !result.windowClosed) {
212
- if (changes.length > 0) lines.push("창 안 컨트롤 변화:", ...changes.map(describeChange));
213
- else lines.push("창 안 컨트롤의 텍스트·체크·활성 변화 없음. 효과는 AX나 화면으로 확인한다(새 창이 열렸으면 computer.windows()).");
214
- }
215
- lines.push(foreground);
216
- return lines.join("\n");
217
- }
218
-
219
- const factory: CustomToolFactory = (pi) => ({
220
- name: "windows_control",
221
- label: "Windows Control",
222
- loadMode: "essential",
223
- description:
224
- "Drive classic Win32 controls (WinForms, VB6, MFC: buttons, check boxes, text boxes) in a Windows window WITHOUT taking the user's foreground or focus. "
225
- + "Sends `WM_SETTEXT` / `BM_CLICK` with SendMessageTimeout to the control's own child window, then reads every child control again and reports what changed (text, check state, enabled) and whether the foreground window stayed the same. "
226
- + "Use it instead of computer `el.press()`/`el.setValue()` (which bring the window to the front on Windows) or `win.click` (silently ignored by WinForms buttons). "
227
- + "`window` is the id from `computer.window()` (the top-level HWND). `list` shows the child controls; other actions pick one control by exact `text` and/or `className` substring, with `index` when several match (ambiguous picks are refused, nothing sent). "
228
- + "Not for WPF, WinUI, UWP, web/Chromium or custom-drawn controls (they have no child window per control). "
229
- + "Same authorization as computer input: only windows the user asked you to operate; confirm before consequential buttons (save, delete, send, start a machine).",
230
- parameters: pi.zod.object({
231
- window: pi.zod.union([pi.zod.string(), pi.zod.number()]).describe("Top-level window id from computer.window() (HWND)"),
232
- action: pi.zod.enum(["list", "read", "setText", "click"]).describe("list child controls, read one, set its text, or click it"),
233
- text: pi.zod.string().optional().describe("Exact current text/caption of the control, e.g. a button label"),
234
- className: pi.zod.string().optional().describe("Case-insensitive substring of the Win32 class, e.g. EDIT, BUTTON, STATIC"),
235
- index: pi.zod.number().optional().describe("0-based pick among several matches, in list order"),
236
- value: pi.zod.string().optional().describe("New text for setText"),
237
- timeoutMs: pi.zod.number().optional().describe("How long click waits for the button handler (default 2000; a modal dialog keeps it running)"),
238
- }),
239
-
240
- async execute(_toolCallId, params, _onUpdate, _ctx, signal) {
241
- const exec: Exec = (command, args, options) => pi.exec(command, args, { ...options, signal });
242
- const result = await runWindowsControl(params as WindowsControlParams, {
243
- exec,
244
- cwd: pi.cwd,
245
- wsl: process.platform === "linux" && Boolean(process.env.WSL_DISTRO_NAME),
246
- scriptPath: posix.join(import.meta.dir, "control.ps1"),
247
- });
248
- return {
249
- content: [{ type: "text", text: formatControlResult(result) }],
250
- details: result,
251
- };
252
- },
253
- });
254
-
255
- export default factory;
1
+ import type { CustomToolFactory } from "@oh-my-pi/pi-coding-agent";
2
+ import { posix } from "node:path";
3
+
4
+ // 2026-10-21 사무실 실측(doc/history/2026/10/21-computer-background): WinForms에서 computer의 UIA press·setValue는
5
+ // 효과는 있지만 사용자 전면 창을 가져가고, 게시된 win.click은 오류 없이 무시됐다. 같은 컨트롤 HWND에
6
+ // SendMessage WM_SETTEXT·BM_CLICK을 보내면 전면 창을 지키며 25~45ms에 동작했다. 이 도구가 그 경로다.
7
+
8
+ export type ControlAction = "list" | "read" | "setText" | "click";
9
+
10
+ export interface WindowsControlParams {
11
+ window: string | number;
12
+ action: ControlAction;
13
+ text?: string;
14
+ className?: string;
15
+ index?: number;
16
+ value?: string;
17
+ timeoutMs?: number;
18
+ }
19
+
20
+ export interface ExecResult { code: number; stdout: string; stderr?: string }
21
+ export type Exec = (command: string, args: string[], options: { cwd: string; timeout?: number }) => Promise<ExecResult>;
22
+
23
+ export interface ControlDeps {
24
+ exec: Exec;
25
+ cwd: string;
26
+ /** WSL이면 스크립트 경로를 wslpath -w로 바꾼다. */
27
+ wsl: boolean;
28
+ scriptPath: string;
29
+ }
30
+
31
+ export interface ChildControl {
32
+ Hwnd: number;
33
+ ClassName: string;
34
+ Text: string | null;
35
+ ControlId: number;
36
+ Visible: boolean;
37
+ Enabled: boolean;
38
+ /** -1: 상태를 읽을 수 없음(일반 버튼, WinForms처럼 직접 그리는 체크박스), 0: 해제, 1: 체크, 2: 불확정 */
39
+ Check: number;
40
+ }
41
+
42
+ export interface ControlChange {
43
+ hwnd: number;
44
+ className: string;
45
+ added?: boolean;
46
+ removed?: boolean;
47
+ text?: string | null;
48
+ textBefore?: string | null;
49
+ textAfter?: string | null;
50
+ checkBefore?: number;
51
+ checkAfter?: number;
52
+ enabledAfter?: boolean;
53
+ visibleAfter?: boolean;
54
+ }
55
+
56
+ export interface ControlResult {
57
+ ok: boolean;
58
+ error?: string;
59
+ message?: string;
60
+ action?: ControlAction;
61
+ window?: number;
62
+ windowClosed?: boolean;
63
+ target?: ChildControl;
64
+ targetAfter?: ChildControl | null;
65
+ win32Error?: number;
66
+ elapsedMs?: number;
67
+ foregroundUnchanged?: boolean;
68
+ changes?: ControlChange[] | ControlChange | null;
69
+ controls?: ChildControl[] | ChildControl | null;
70
+ matches?: ChildControl[] | ChildControl | null;
71
+ shell?: string;
72
+ }
73
+
74
+ const DEFAULT_CLICK_TIMEOUT_MS = 2000;
75
+ const MAX_LISTED = 40;
76
+ const WIN32_TIMEOUT = 1460;
77
+ const WIN32_ACCESS_DENIED = 5;
78
+
79
+ /** 요청을 검증해 스크립트로 넘길 JSON으로 만든다. 잘못된 요청은 Windows를 부르기 전에 거절한다. */
80
+ export function buildRequest(params: WindowsControlParams): Record<string, unknown> {
81
+ const window = Number(params.window);
82
+ if (!Number.isSafeInteger(window) || window <= 0) {
83
+ throw new Error(`windows_control: window는 computer.window()의 id(양의 정수 HWND)여야 한다: ${String(params.window)}`);
84
+ }
85
+ const needsTarget = params.action !== "list";
86
+ if (needsTarget && params.text === undefined && params.className === undefined) {
87
+ throw new Error("windows_control: list 말고는 text 또는 className으로 대상 컨트롤을 지정해야 한다");
88
+ }
89
+ if (params.action === "setText" && params.value === undefined) {
90
+ throw new Error("windows_control: setText에는 value가 필요하다");
91
+ }
92
+ if (params.index !== undefined && (!Number.isInteger(params.index) || params.index < 0)) {
93
+ throw new Error(`windows_control: index는 0 이상의 정수여야 한다: ${params.index}`);
94
+ }
95
+ const timeoutMs = Math.max(100, Math.min(30_000, Math.trunc(params.timeoutMs ?? DEFAULT_CLICK_TIMEOUT_MS)));
96
+ return {
97
+ window,
98
+ action: params.action,
99
+ ...(params.text !== undefined ? { text: params.text } : {}),
100
+ ...(params.className !== undefined ? { className: params.className } : {}),
101
+ ...(params.index !== undefined ? { index: params.index } : {}),
102
+ ...(params.value !== undefined ? { value: params.value } : {}),
103
+ timeoutMs,
104
+ };
105
+ }
106
+
107
+ export async function runWindowsControl(params: WindowsControlParams, deps: ControlDeps): Promise<ControlResult> {
108
+ const request = buildRequest(params);
109
+ let script = deps.scriptPath;
110
+ if (deps.wsl) {
111
+ const converted = await deps.exec("wslpath", ["-w", deps.scriptPath], { cwd: deps.cwd });
112
+ script = converted.stdout.trim();
113
+ if (converted.code !== 0 || !script) throw new Error(`windows_control: wslpath 변환 실패: ${converted.stderr ?? ""}`.trim());
114
+ }
115
+ const encoded = Buffer.from(JSON.stringify(request), "utf8").toString("base64");
116
+ const args = ["-NoProfile", "-NonInteractive", "-ExecutionPolicy", "Bypass", "-File", script, "-Request", encoded];
117
+ // 사용자 결정(10-09): Windows PowerShell 7(pwsh)을 먼저 쓰고, 없을 때만 5.1로 간다.
118
+ // "없음"은 pi.exec가 실행 파일을 찾지 못해 code ENOENT로 throw한 경우뿐이다. pwsh가 실행돼서 실패한 경우
119
+ // (어떤 종료 코드든)는 같은 요청을 다른 셸로 다시 보내지 않는다. 버튼을 두 번 누를 수 있어서다.
120
+ let shell = "pwsh.exe";
121
+ let result: ExecResult;
122
+ try {
123
+ result = await deps.exec(shell, args, { cwd: deps.cwd, timeout: 60_000 });
124
+ } catch (error) {
125
+ if ((error as NodeJS.ErrnoException | undefined)?.code !== "ENOENT") throw error;
126
+ shell = "powershell.exe";
127
+ result = await deps.exec(shell, args, { cwd: deps.cwd, timeout: 60_000 });
128
+ }
129
+ const line = result.stdout.split(/\r?\n/).map((text) => text.trim()).filter((text) => text.startsWith("{")).pop();
130
+ if (!line) {
131
+ const detail = [result.stderr, result.stdout].filter(Boolean).join("\n").trim().slice(0, 600);
132
+ throw new Error(`windows_control: ${shell} exit ${result.code}, 결과 JSON 없음${detail ? `: ${detail}` : ""}`);
133
+ }
134
+ return { ...(JSON.parse(line) as ControlResult), shell };
135
+ }
136
+
137
+ /** ConvertTo-Json은 원소가 하나인 배열을 객체로 내보낸다. */
138
+ function asList<T>(value: T[] | T | null | undefined): T[] {
139
+ if (value === null || value === undefined) return [];
140
+ return Array.isArray(value) ? value : [value];
141
+ }
142
+
143
+ function quote(text: string | null | undefined): string {
144
+ if (text === null || text === undefined) return "(읽기 실패)";
145
+ const flat = text.replace(/\r?\n/g, "⏎");
146
+ return JSON.stringify(flat.length > 80 ? `${flat.slice(0, 80)}…` : flat);
147
+ }
148
+
149
+ function describe(child: ChildControl): string {
150
+ const flags = [child.Visible ? "" : "숨김", child.Enabled ? "" : "비활성", child.Check >= 0 ? `check=${child.Check}` : ""].filter(Boolean);
151
+ return `${child.ClassName} ${quote(child.Text)} hwnd=${child.Hwnd}${child.ControlId ? ` id=${child.ControlId}` : ""}${flags.length ? ` (${flags.join(", ")})` : ""}`;
152
+ }
153
+
154
+ function describeChange(change: ControlChange): string {
155
+ if (change.added) return ` + ${change.className} hwnd=${change.hwnd} 새로 생김 ${quote(change.text)}`;
156
+ if (change.removed) return ` - ${change.className} hwnd=${change.hwnd} 사라짐 ${quote(change.text)}`;
157
+ const parts: string[] = [];
158
+ if (change.textBefore !== change.textAfter) parts.push(`${quote(change.textBefore)} → ${quote(change.textAfter)}`);
159
+ if (change.checkBefore !== change.checkAfter) parts.push(`check ${change.checkBefore} → ${change.checkAfter}`);
160
+ if (parts.length === 0) parts.push(`enabled=${change.enabledAfter} visible=${change.visibleAfter}`);
161
+ return ` ${change.className} hwnd=${change.hwnd}: ${parts.join(", ")}`;
162
+ }
163
+
164
+ function listBlock(title: string, children: ChildControl[]): string[] {
165
+ const shown = children.slice(0, MAX_LISTED).map((child) => ` ${describe(child)}`);
166
+ const more = children.length > MAX_LISTED ? [` … ${children.length - MAX_LISTED}개 더`] : [];
167
+ return [`${title} (${children.length}개):`, ...shown, ...more];
168
+ }
169
+
170
+ export function formatControlResult(result: ControlResult): string {
171
+ const lines: string[] = [];
172
+ if (!result.ok && result.error) {
173
+ switch (result.error) {
174
+ case "window-not-found":
175
+ return `windows_control: 창 hwnd=${result.window}가 없다. computer.window()로 id를 다시 확인한다.`;
176
+ case "control-not-found":
177
+ return [`windows_control: 조건에 맞는 컨트롤이 없다. 아무것도 보내지 않았다.`, ...listBlock("창의 컨트롤", asList(result.controls))].join("\n");
178
+ case "ambiguous":
179
+ return [`windows_control: 조건에 맞는 컨트롤이 여러 개다. index로 하나를 고른다. 아무것도 보내지 않았다.`, ...listBlock("후보(index 순서)", asList(result.matches))].join("\n");
180
+ case "index-out-of-range":
181
+ return [`windows_control: index가 후보 수를 넘는다. 아무것도 보내지 않았다.`, ...listBlock("후보(index 순서)", asList(result.matches))].join("\n");
182
+ case "control-disabled":
183
+ return `windows_control: 대상이 비활성이라 아무것도 보내지 않았다: ${result.target ? describe(result.target) : ""}`;
184
+ case "script-error":
185
+ return `windows_control: Windows 스크립트 오류: ${result.message ?? ""}`;
186
+ }
187
+ }
188
+ const foreground = result.foregroundUnchanged
189
+ ? "전면 창 유지."
190
+ : "주의: 호출 사이 전면 창이 바뀌었다(이 호출 때문인지 사용자 조작인지 이 결과로는 구분할 수 없다).";
191
+ if (result.action === "list") {
192
+ lines.push(...listBlock(`창 hwnd=${result.window}의 자식 컨트롤`, asList(result.controls)), foreground);
193
+ return lines.join("\n");
194
+ }
195
+ const target = result.target ? describe(result.target) : "(대상 미상)";
196
+ const verb = result.action === "click" ? "BM_CLICK" : result.action === "setText" ? "WM_SETTEXT" : "읽기";
197
+ if (result.ok) {
198
+ lines.push(`${verb} ${result.action === "read" ? "완료" : "전달"}: ${target}${result.elapsedMs !== undefined && result.action !== "read" ? ` (${result.elapsedMs}ms)` : ""}`);
199
+ } else if (result.win32Error === WIN32_TIMEOUT) {
200
+ lines.push(`${verb} 전달됐지만 처리기가 ${result.action === "click" ? "timeoutMs" : "2초"} 안에 끝나지 않았다(모달 창이 열렸을 수 있다): ${target}`);
201
+ } else if (result.win32Error === WIN32_ACCESS_DENIED) {
202
+ lines.push(`${verb} 거부됨(Win32 5): 대상 프로그램이 관리자 권한으로 실행 중이다. 아무 효과도 없다고 본다: ${target}`);
203
+ } else {
204
+ lines.push(`${verb} 실패(Win32 ${result.win32Error}): ${target}`);
205
+ }
206
+ if (result.action !== "read" && !result.windowClosed) {
207
+ lines.push(result.targetAfter ? `대상 지금: ${describe(result.targetAfter)}` : "대상 컨트롤이 사라졌다.");
208
+ }
209
+ if (result.windowClosed) lines.push("창이 닫혔다.");
210
+ const changes = asList(result.changes);
211
+ if (result.action !== "read" && !result.windowClosed) {
212
+ if (changes.length > 0) lines.push("창 안 컨트롤 변화:", ...changes.map(describeChange));
213
+ else lines.push("창 안 컨트롤의 텍스트·체크·활성 변화 없음. 효과는 AX나 화면으로 확인한다(새 창이 열렸으면 computer.windows()).");
214
+ }
215
+ lines.push(foreground);
216
+ return lines.join("\n");
217
+ }
218
+
219
+ const factory: CustomToolFactory = (pi) => ({
220
+ name: "windows_control",
221
+ label: "Windows Control",
222
+ loadMode: "essential",
223
+ description:
224
+ "Drive classic Win32 controls (WinForms, VB6, MFC: buttons, check boxes, text boxes) in a Windows window WITHOUT taking the user's foreground or focus. "
225
+ + "Sends `WM_SETTEXT` / `BM_CLICK` with SendMessageTimeout to the control's own child window, then reads every child control again and reports what changed (text, check state, enabled) and whether the foreground window stayed the same. "
226
+ + "Use it instead of computer `el.press()`/`el.setValue()` (which bring the window to the front on Windows) or `win.click` (silently ignored by WinForms buttons). "
227
+ + "`window` is the id from `computer.window()` (the top-level HWND). `list` shows the child controls; other actions pick one control by exact `text` and/or `className` substring, with `index` when several match (ambiguous picks are refused, nothing sent). "
228
+ + "Not for WPF, WinUI, UWP, web/Chromium or custom-drawn controls (they have no child window per control). "
229
+ + "Same authorization as computer input: only windows the user asked you to operate; confirm before consequential buttons (save, delete, send, start a machine).",
230
+ parameters: pi.zod.object({
231
+ window: pi.zod.union([pi.zod.string(), pi.zod.number()]).describe("Top-level window id from computer.window() (HWND)"),
232
+ action: pi.zod.enum(["list", "read", "setText", "click"]).describe("list child controls, read one, set its text, or click it"),
233
+ text: pi.zod.string().optional().describe("Exact current text/caption of the control, e.g. a button label"),
234
+ className: pi.zod.string().optional().describe("Case-insensitive substring of the Win32 class, e.g. EDIT, BUTTON, STATIC"),
235
+ index: pi.zod.number().optional().describe("0-based pick among several matches, in list order"),
236
+ value: pi.zod.string().optional().describe("New text for setText"),
237
+ timeoutMs: pi.zod.number().optional().describe("How long click waits for the button handler (default 2000; a modal dialog keeps it running)"),
238
+ }),
239
+
240
+ async execute(_toolCallId, params, _onUpdate, _ctx, signal) {
241
+ const exec: Exec = (command, args, options) => pi.exec(command, args, { ...options, signal });
242
+ const result = await runWindowsControl(params as WindowsControlParams, {
243
+ exec,
244
+ cwd: pi.cwd,
245
+ wsl: process.platform === "linux" && Boolean(process.env.WSL_DISTRO_NAME),
246
+ scriptPath: posix.join(import.meta.dir, "control.ps1"),
247
+ });
248
+ return {
249
+ content: [{ type: "text", text: formatControlResult(result) }],
250
+ details: result,
251
+ };
252
+ },
253
+ });
254
+
255
+ export default factory;
@@ -1,26 +1,26 @@
1
- <!--
2
- `orchestrate` 가 발동한 턴에만 주입되는 내 규칙. 이 파일만 고치면 문구가 바뀐다.
3
- 빈 파일이나 주석만 있으면 아무것도 주입하지 않는다. 모델이 읽는 지시문이라 영어로 쓴다.
4
- 적용: node patches/apply-notices.mjs (setup.ps1 이 자동 실행)
5
- -->
6
-
7
- House additions:
8
- - There are exactly two role types: Main and `maker` (`maker-escalate` is the same contract on the escalated model slot). No other agent role is dispatched, and having two types never means spawning two agents.
9
- - Subagent brief prose, follow-up steering, progress, and final user-visible prose are Korean. Keep structural keys/headings, model IDs, code, commands, paths, APIs, and original errors verbatim; do not add an English or bilingual fallback.
10
- - Ordinary conversation, progress utterances, and inline child speech use natural Korean with the selected character temperament, which overrides generic report formatting. Never force report headings or a Problem/Decision/Check/Next template there; reserve structured evidence prose for completion reports, incident analyses, and explicit report requests.
11
- - Legacy sources (`.vb`, `.frm`, `.bas`, `.cfg`, `.csv`, `.resx`): determine encoding from BOM, reader/project convention, and strict decode/re-encode evidence before editing. No BOM alone does not mean CP949. Preserve established encoding, BOM, and line endings.
12
- - Main owns dialogue, approvals, requirements, routing, barriers, evidence adjudication, final verdict, supported profile installation/restart, and Git finalization. Main also implements and validates whatever it did not delegate; inside a delegated slice it never implements or runs that slice's commands. Preserve approval and material-risk boundaries.
13
- - Finalize only the exact files this task changed through Main's `git_finalize`; raw `git add`, `git commit`, `git push`, `git commit-tree`, and `git update-ref` are prohibited.
14
-
15
- Throughput and validation:
16
- - Dispatch ready independent slices without waiting for unrelated work. Dependency and synthesis barriers are allowed only when a downstream artifact or combined result genuinely requires them; `tasks[]` is a feed, so refill settled slots while real independent work remains. Never pad the queue to fill slots, and group small independent edits under one owner.
17
- - A delegated `maker` owns investigation, implementation, rework, and every check its slice needs, including build/test/lint/type-check and actual-surface smoke. There is no separate validator role. When several slices converge on one execution path or touch the same build output, cache, DB, or profile, Main names one of those owners to run the merged check once after convergence.
18
- - Verify web surfaces in a separate background Chrome/Chromium launched with a temporary profile: real rendering, clicks, input, screenshots, console errors. Never touch the user's existing tabs, cookies, or logins; use the OMP Relay only for explicitly approved work on the user's own browser. Add no new browser framework or persistent helper.
19
- - Main reviews a delegated slice's confirmed delta mid-flight: when a dispatch assumption conflicts with the actual code, when the slice's confirmed delta has landed, or when an owner check failed or a new risk appeared. Main inspects that delta and its evidence only; it never edits a path a live child owns, never repeats the owner's check, and never closes a revision whose required checks still run. Mid-flight review is a direction call, not the final acceptance.
20
- - An `integration-risk` task is reviewed by Main: Main may start reading the frozen diff in parallel with the owner's validation, but accepts only after actually consuming the current revision's raw evidence. `independent-only` work gets no such review. High-risk keeps the serial safety order: all relevant owners converge and finish their required checks, then Main reviews serially. Main never repeats an owner's check and never edits a path a live child owns.
21
- - Review only against immutable evidence: the reviewed revision is a raw diff locator or verbatim tool output plus the exact before/after hunk for every reviewed target and valid impact-bearing caller locators. Hand-transcribed diffs, prose reconstruction, and late errata never substitute for that evidence.
22
- - Never repeat an experiment that did not narrow uncertainty, and reuse evidence whose inputs did not change.
23
- - A routine task is owned end to end by Main with no child of any role. Reclassify to `large`/`high-risk` before any dispatch; ownership never overlaps and a path in progress is never handed off mid-way.
24
- - All async roles use automatic result delivery. Never timer/status poll or repeat finite-timeout hub wait. At a required dependency/synthesis barrier use timeoutMs:0 wait exactly once; re-waiting on an unchanged state is polling. User steering may skip the call; handle it then resume the still-required barrier once.
25
- - Child routine started/milestone/job progress stays inside its own session; MUST NOT DM or wake Main. Only a real blocker, approval need, contract/scope change, terminal task result, or a Main-requested revision/evidence relay notifies the parent; review status chatter stays out. Keep long-job launch/progress evidence for the final report and never send a duplicate completion DM.
26
- - Rework invalidates only the evidence whose inputs changed: the owning Maker repairs its own finding and refreshes the affected command evidence, Main re-reviews that delta only, and unaffected evidence is reused rather than rerun.
1
+ <!--
2
+ `orchestrate` 가 발동한 턴에만 주입되는 내 규칙. 이 파일만 고치면 문구가 바뀐다.
3
+ 빈 파일이나 주석만 있으면 아무것도 주입하지 않는다. 모델이 읽는 지시문이라 영어로 쓴다.
4
+ 적용: node patches/apply-notices.mjs (setup.ps1 이 자동 실행)
5
+ -->
6
+
7
+ House additions:
8
+ - There are exactly two role types: Main and `maker` (`maker-escalate` is the same contract on the escalated model slot). No other agent role is dispatched, and having two types never means spawning two agents.
9
+ - Subagent brief prose, follow-up steering, progress, and final user-visible prose are Korean. Keep structural keys/headings, model IDs, code, commands, paths, APIs, and original errors verbatim; do not add an English or bilingual fallback.
10
+ - Ordinary conversation, progress utterances, and inline child speech use natural Korean with the selected character temperament, which overrides generic report formatting. Never force report headings or a Problem/Decision/Check/Next template there; reserve structured evidence prose for completion reports, incident analyses, and explicit report requests.
11
+ - Legacy sources (`.vb`, `.frm`, `.bas`, `.cfg`, `.csv`, `.resx`): determine encoding from BOM, reader/project convention, and strict decode/re-encode evidence before editing. No BOM alone does not mean CP949. Preserve established encoding, BOM, and line endings.
12
+ - Main owns dialogue, approvals, requirements, routing, barriers, evidence adjudication, final verdict, supported profile installation/restart, and Git finalization. Main also implements and validates whatever it did not delegate; inside a delegated slice it never implements or runs that slice's commands. Preserve approval and material-risk boundaries.
13
+ - Finalize only the exact files this task changed through Main's `git_finalize`; raw `git add`, `git commit`, `git push`, `git commit-tree`, and `git update-ref` are prohibited.
14
+
15
+ Throughput and validation:
16
+ - Dispatch ready independent slices without waiting for unrelated work. Dependency and synthesis barriers are allowed only when a downstream artifact or combined result genuinely requires them; `tasks[]` is a feed, so refill settled slots while real independent work remains. Never pad the queue to fill slots, and group small independent edits under one owner.
17
+ - A delegated `maker` owns investigation, implementation, rework, and every check its slice needs, including build/test/lint/type-check and actual-surface smoke. There is no separate validator role. When several slices converge on one execution path or touch the same build output, cache, DB, or profile, Main names one of those owners to run the merged check once after convergence.
18
+ - Verify web surfaces in a separate background Chrome/Chromium launched with a temporary profile: real rendering, clicks, input, screenshots, console errors. Never touch the user's existing tabs, cookies, or logins; use the OMP Relay only for explicitly approved work on the user's own browser. Add no new browser framework or persistent helper.
19
+ - Main reviews a delegated slice's confirmed delta mid-flight: when a dispatch assumption conflicts with the actual code, when the slice's confirmed delta has landed, or when an owner check failed or a new risk appeared. Main inspects that delta and its evidence only; it never edits a path a live child owns, never repeats the owner's check, and never closes a revision whose required checks still run. Mid-flight review is a direction call, not the final acceptance.
20
+ - An `integration-risk` task is reviewed by Main: Main may start reading the frozen diff in parallel with the owner's validation, but accepts only after actually consuming the current revision's raw evidence. `independent-only` work gets no such review. High-risk keeps the serial safety order: all relevant owners converge and finish their required checks, then Main reviews serially. Main never repeats an owner's check and never edits a path a live child owns.
21
+ - Review only against immutable evidence: the reviewed revision is a raw diff locator or verbatim tool output plus the exact before/after hunk for every reviewed target and valid impact-bearing caller locators. Hand-transcribed diffs, prose reconstruction, and late errata never substitute for that evidence.
22
+ - Never repeat an experiment that did not narrow uncertainty, and reuse evidence whose inputs did not change.
23
+ - A routine task is owned end to end by Main with no child of any role. Reclassify to `large`/`high-risk` before any dispatch; ownership never overlaps and a path in progress is never handed off mid-way.
24
+ - All async roles use automatic result delivery. Never timer/status poll or repeat finite-timeout hub wait. At a required dependency/synthesis barrier use timeoutMs:0 wait exactly once; re-waiting on an unchanged state is polling. User steering may skip the call; handle it then resume the still-required barrier once.
25
+ - Child routine started/milestone/job progress stays inside its own session; MUST NOT DM or wake Main. Only a real blocker, approval need, contract/scope change, terminal task result, or a Main-requested revision/evidence relay notifies the parent; review status chatter stays out. Keep long-job launch/progress evidence for the final report and never send a duplicate completion DM.
26
+ - Rework invalidates only the evidence whose inputs changed: the owning Maker repairs its own finding and refreshes the affected command evidence, Main re-reviews that delta only, and unaffected evidence is reused rather than rerun.
@@ -1,9 +1,9 @@
1
- <!--
2
- `ultrathink` 가 발동한 턴에만 주입되는 내 규칙. 이 파일만 고치면 문구가 바뀐다.
3
- 빈 파일이나 주석만 있으면 아무것도 주입하지 않는다. 모델이 읽는 지시문이라 영어로 쓴다.
4
- 적용: node patches/apply-notices.mjs (setup.ps1 이 자동 실행)
5
- -->
6
-
7
- House additions:
8
- - Enumerate the plausible failure modes first, then rule each out with a fact you observed this turn (file content, command output, log line). Unobserved claims are marked `[INFERENCE]`.
9
- - Prefer reading the actual source over reconstructing behavior from memory of similar systems.
1
+ <!--
2
+ `ultrathink` 가 발동한 턴에만 주입되는 내 규칙. 이 파일만 고치면 문구가 바뀐다.
3
+ 빈 파일이나 주석만 있으면 아무것도 주입하지 않는다. 모델이 읽는 지시문이라 영어로 쓴다.
4
+ 적용: node patches/apply-notices.mjs (setup.ps1 이 자동 실행)
5
+ -->
6
+
7
+ House additions:
8
+ - Enumerate the plausible failure modes first, then rule each out with a fact you observed this turn (file content, command output, log line). Unobserved claims are marked `[INFERENCE]`.
9
+ - Prefer reading the actual source over reconstructing behavior from memory of similar systems.