cuelo 0.10.83 → 0.10.85

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 (368) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/app-path-routes-manifest.json +31 -29
  3. package/.next/build-manifest.json +2 -2
  4. package/.next/prerender-manifest.json +3 -3
  5. package/.next/required-server-files.js +1 -1
  6. package/.next/required-server-files.json +1 -1
  7. package/.next/routes-manifest.json +14 -0
  8. package/.next/server/app/_global-error/page.js +3 -3
  9. package/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  10. package/.next/server/app/_global-error.html +1 -1
  11. package/.next/server/app/_global-error.rsc +1 -1
  12. package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  13. package/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  14. package/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  15. package/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  16. package/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  17. package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  18. package/.next/server/app/_not-found/page.js +2 -2
  19. package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  20. package/.next/server/app/_not-found.html +1 -1
  21. package/.next/server/app/_not-found.rsc +2 -2
  22. package/.next/server/app/_not-found.segments/_full.segment.rsc +2 -2
  23. package/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  24. package/.next/server/app/_not-found.segments/_index.segment.rsc +2 -2
  25. package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  26. package/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  27. package/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  28. package/.next/server/app/api/agent/[id]/account/route.js +1 -1
  29. package/.next/server/app/api/agent/[id]/bash-output/route.js +1 -1
  30. package/.next/server/app/api/agent/[id]/events/route.js +2 -2
  31. package/.next/server/app/api/agent/[id]/route.js +1 -1
  32. package/.next/server/app/api/agent/new/route.js +1 -1
  33. package/.next/server/app/api/agent/running/route.js +1 -1
  34. package/.next/server/app/api/attachment-settings/route.js +1 -1
  35. package/.next/server/app/api/attachments/[id]/transcription/route.js +2 -2
  36. package/.next/server/app/api/attachments/draft/route.js +1 -1
  37. package/.next/server/app/api/attachments/route.js +2 -2
  38. package/.next/server/app/api/auth/all-providers/route.js +1 -1
  39. package/.next/server/app/api/auth/api-key/[provider]/route.js +1 -1
  40. package/.next/server/app/api/auth/login/[provider]/route.js +2 -2
  41. package/.next/server/app/api/auth/logout/[provider]/route.js +1 -1
  42. package/.next/server/app/api/auth/providers/route.js +1 -1
  43. package/.next/server/app/api/character-mode/route.js +2 -0
  44. package/.next/server/app/api/character-mode/route.js.nft.json +1 -0
  45. package/.next/server/app/api/character-mode/route_client-reference-manifest.js +1 -0
  46. package/.next/server/app/api/cwd/browse/route.js +1 -1
  47. package/.next/server/app/api/cwd/validate/route.js +1 -1
  48. package/.next/server/app/api/default-cwd/route.js +1 -1
  49. package/.next/server/app/api/display-settings/route.js +1 -1
  50. package/.next/server/app/api/document-text/route.js +2 -2
  51. package/.next/server/app/api/experiments/route.js +1 -1
  52. package/.next/server/app/api/file-index/route.js +1 -1
  53. package/.next/server/app/api/files/[...path]/route.js +1 -1
  54. package/.next/server/app/api/git/diff/route.js +2 -2
  55. package/.next/server/app/api/git/status/route.js +2 -2
  56. package/.next/server/app/api/github/projects/route.js +1 -1
  57. package/.next/server/app/api/gpt6/handles/route.js +1 -1
  58. package/.next/server/app/api/gpt6/reply/route.js +1 -1
  59. package/.next/server/app/api/gpt6/token/route.js +1 -1
  60. package/.next/server/app/api/gpt6/web6-session/route.js +1 -1
  61. package/.next/server/app/api/home/route.js +1 -1
  62. package/.next/server/app/api/live/call/[callId]/route.js +1 -1
  63. package/.next/server/app/api/live/call/[callId]/route.js.nft.json +1 -1
  64. package/.next/server/app/api/live/events/route.js +2 -2
  65. package/.next/server/app/api/live/events/route.js.nft.json +1 -1
  66. package/.next/server/app/api/live/interpret/cloud/events/route.js +2 -2
  67. package/.next/server/app/api/live/interpret/cloud/events/route.js.nft.json +1 -1
  68. package/.next/server/app/api/live/interpret/cloud/input/route.js +1 -1
  69. package/.next/server/app/api/live/interpret/cloud/input/route.js.nft.json +1 -1
  70. package/.next/server/app/api/live/interpret/cloud/route.js +1 -1
  71. package/.next/server/app/api/live/interpret/cloud/route.js.nft.json +1 -1
  72. package/.next/server/app/api/live/interpret/route.js +1 -1
  73. package/.next/server/app/api/live/interpret/route.js.nft.json +1 -1
  74. package/.next/server/app/api/live/offer/route.js +1 -1
  75. package/.next/server/app/api/live/offer/route.js.nft.json +1 -1
  76. package/.next/server/app/api/live/voices/route.js +1 -1
  77. package/.next/server/app/api/live/voices/route.js.nft.json +1 -1
  78. package/.next/server/app/api/mcp/route.js +2 -2
  79. package/.next/server/app/api/model-roles/route.js +1 -1
  80. package/.next/server/app/api/models/route.js +1 -1
  81. package/.next/server/app/api/models-config/catalog/route.js +1 -1
  82. package/.next/server/app/api/models-config/discover/route.js +1 -1
  83. package/.next/server/app/api/models-config/route.js +2 -2
  84. package/.next/server/app/api/models-config/test/route.js +1 -1
  85. package/.next/server/app/api/office-characters/[...path]/route.js +2 -0
  86. package/.next/server/app/api/office-characters/[...path]/route.js.nft.json +1 -0
  87. package/.next/server/app/api/office-characters/[...path]/route_client-reference-manifest.js +1 -0
  88. package/.next/server/app/api/plugins/route.js +1 -1
  89. package/.next/server/app/api/project-docs/route.js +1 -1
  90. package/.next/server/app/api/project-trust/route.js +1 -1
  91. package/.next/server/app/api/projects/route.js +1 -1
  92. package/.next/server/app/api/runs/[runId]/prelude/route.js +1 -1
  93. package/.next/server/app/api/runs/[runId]/route.js +1 -1
  94. package/.next/server/app/api/runs/[runId]/turns/route.js +1 -1
  95. package/.next/server/app/api/runs/route.js +1 -1
  96. package/.next/server/app/api/sessions/[id]/auto-name/route.js +1 -1
  97. package/.next/server/app/api/sessions/[id]/context/route.js +1 -1
  98. package/.next/server/app/api/sessions/[id]/entries/[entryId]/thinking/route.js +1 -1
  99. package/.next/server/app/api/sessions/[id]/export/route.js +1 -1
  100. package/.next/server/app/api/sessions/[id]/route.js +1 -1
  101. package/.next/server/app/api/sessions/[id]/state/route.js +1 -1
  102. package/.next/server/app/api/sessions/route.js +1 -1
  103. package/.next/server/app/api/sessions/search/route.js +1 -1
  104. package/.next/server/app/api/settings/route.js +1 -1
  105. package/.next/server/app/api/sidecars/[service]/[...path]/route.js +1 -1
  106. package/.next/server/app/api/skills/check/route.js +1 -1
  107. package/.next/server/app/api/skills/install/route.js +2 -2
  108. package/.next/server/app/api/skills/route.js +2 -2
  109. package/.next/server/app/api/skills/search/route.js +1 -1
  110. package/.next/server/app/api/skills/update/route.js +1 -1
  111. package/.next/server/app/api/subagents/eta/route.js +1 -1
  112. package/.next/server/app/api/theme/route.js +1 -1
  113. package/.next/server/app/api/tool-image/route.js +1 -1
  114. package/.next/server/app/api/update-maintenance/route.js +2 -2
  115. package/.next/server/app/api/updates/route.js +1 -1
  116. package/.next/server/app/api/web-access/recovery/route.js +1 -1
  117. package/.next/server/app/api/web-access/route.js +1 -1
  118. package/.next/server/app/api/web6/consults/route.js +1 -1
  119. package/.next/server/app/api/worktrees/route.js +1 -1
  120. package/.next/server/app/favicon.ico/route.js +1 -1
  121. package/.next/server/app/index.html +1 -1
  122. package/.next/server/app/index.rsc +4 -4
  123. package/.next/server/app/index.segments/__PAGE__.segment.rsc +3 -3
  124. package/.next/server/app/index.segments/_full.segment.rsc +4 -4
  125. package/.next/server/app/index.segments/_head.segment.rsc +1 -1
  126. package/.next/server/app/index.segments/_index.segment.rsc +2 -2
  127. package/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  128. package/.next/server/app/manifest.webmanifest/route.js +2 -2
  129. package/.next/server/app/page.js +21 -21
  130. package/.next/server/app/page_client-reference-manifest.js +1 -1
  131. package/.next/server/app/recover/page.js +2 -2
  132. package/.next/server/app/recover/page_client-reference-manifest.js +1 -1
  133. package/.next/server/app/recover.html +1 -1
  134. package/.next/server/app/recover.rsc +2 -2
  135. package/.next/server/app/recover.segments/_full.segment.rsc +2 -2
  136. package/.next/server/app/recover.segments/_head.segment.rsc +1 -1
  137. package/.next/server/app/recover.segments/_index.segment.rsc +2 -2
  138. package/.next/server/app/recover.segments/_tree.segment.rsc +1 -1
  139. package/.next/server/app/recover.segments/recover/__PAGE__.segment.rsc +1 -1
  140. package/.next/server/app/recover.segments/recover.segment.rsc +1 -1
  141. package/.next/server/app-paths-manifest.json +31 -29
  142. package/.next/server/chunks/{6775.js → 205.js} +2 -2
  143. package/.next/server/chunks/3379.js +1 -1
  144. package/.next/server/chunks/7738.js +1 -0
  145. package/.next/server/functions-config-manifest.json +2 -0
  146. package/.next/server/middleware-build-manifest.js +1 -1
  147. package/.next/server/pages/404.html +1 -1
  148. package/.next/server/pages/500.html +1 -1
  149. package/.next/server/server-reference-manifest.json +1 -1
  150. package/.next/static/chunks/app/_global-error/page-436da0332762a8e3.js +1 -0
  151. package/.next/static/chunks/app/api/agent/[id]/account/route-436da0332762a8e3.js +1 -0
  152. package/.next/static/chunks/app/api/agent/[id]/bash-output/route-436da0332762a8e3.js +1 -0
  153. package/.next/static/chunks/app/api/agent/[id]/events/route-436da0332762a8e3.js +1 -0
  154. package/.next/static/chunks/app/api/agent/[id]/route-436da0332762a8e3.js +1 -0
  155. package/.next/static/chunks/app/api/agent/new/route-436da0332762a8e3.js +1 -0
  156. package/.next/static/chunks/app/api/agent/running/route-436da0332762a8e3.js +1 -0
  157. package/.next/static/chunks/app/api/attachment-settings/route-436da0332762a8e3.js +1 -0
  158. package/.next/static/chunks/app/api/attachments/[id]/transcription/route-436da0332762a8e3.js +1 -0
  159. package/.next/static/chunks/app/api/attachments/draft/route-436da0332762a8e3.js +1 -0
  160. package/.next/static/chunks/app/api/attachments/route-436da0332762a8e3.js +1 -0
  161. package/.next/static/chunks/app/api/auth/all-providers/route-436da0332762a8e3.js +1 -0
  162. package/.next/static/chunks/app/api/auth/api-key/[provider]/route-436da0332762a8e3.js +1 -0
  163. package/.next/static/chunks/app/api/auth/login/[provider]/route-436da0332762a8e3.js +1 -0
  164. package/.next/static/chunks/app/api/auth/logout/[provider]/route-436da0332762a8e3.js +1 -0
  165. package/.next/static/chunks/app/api/auth/providers/route-436da0332762a8e3.js +1 -0
  166. package/.next/static/chunks/app/api/character-mode/route-436da0332762a8e3.js +1 -0
  167. package/.next/static/chunks/app/api/cwd/browse/route-436da0332762a8e3.js +1 -0
  168. package/.next/static/chunks/app/api/cwd/validate/route-436da0332762a8e3.js +1 -0
  169. package/.next/static/chunks/app/api/default-cwd/route-436da0332762a8e3.js +1 -0
  170. package/.next/static/chunks/app/api/display-settings/route-436da0332762a8e3.js +1 -0
  171. package/.next/static/chunks/app/api/document-text/route-436da0332762a8e3.js +1 -0
  172. package/.next/static/chunks/app/api/experiments/route-436da0332762a8e3.js +1 -0
  173. package/.next/static/chunks/app/api/file-index/route-436da0332762a8e3.js +1 -0
  174. package/.next/static/chunks/app/api/files/[...path]/route-436da0332762a8e3.js +1 -0
  175. package/.next/static/chunks/app/api/git/diff/route-436da0332762a8e3.js +1 -0
  176. package/.next/static/chunks/app/api/git/status/route-436da0332762a8e3.js +1 -0
  177. package/.next/static/chunks/app/api/github/projects/route-436da0332762a8e3.js +1 -0
  178. package/.next/static/chunks/app/api/gpt6/handles/route-436da0332762a8e3.js +1 -0
  179. package/.next/static/chunks/app/api/gpt6/reply/route-436da0332762a8e3.js +1 -0
  180. package/.next/static/chunks/app/api/gpt6/token/route-436da0332762a8e3.js +1 -0
  181. package/.next/static/chunks/app/api/gpt6/web6-session/route-436da0332762a8e3.js +1 -0
  182. package/.next/static/chunks/app/api/home/route-436da0332762a8e3.js +1 -0
  183. package/.next/static/chunks/app/api/live/call/[callId]/route-436da0332762a8e3.js +1 -0
  184. package/.next/static/chunks/app/api/live/events/route-436da0332762a8e3.js +1 -0
  185. package/.next/static/chunks/app/api/live/interpret/cloud/events/route-436da0332762a8e3.js +1 -0
  186. package/.next/static/chunks/app/api/live/interpret/cloud/input/route-436da0332762a8e3.js +1 -0
  187. package/.next/static/chunks/app/api/live/interpret/cloud/route-436da0332762a8e3.js +1 -0
  188. package/.next/static/chunks/app/api/live/interpret/route-436da0332762a8e3.js +1 -0
  189. package/.next/static/chunks/app/api/live/offer/route-436da0332762a8e3.js +1 -0
  190. package/.next/static/chunks/app/api/live/voices/route-436da0332762a8e3.js +1 -0
  191. package/.next/static/chunks/app/api/mcp/route-436da0332762a8e3.js +1 -0
  192. package/.next/static/chunks/app/api/model-roles/route-436da0332762a8e3.js +1 -0
  193. package/.next/static/chunks/app/api/models/route-436da0332762a8e3.js +1 -0
  194. package/.next/static/chunks/app/api/models-config/catalog/route-436da0332762a8e3.js +1 -0
  195. package/.next/static/chunks/app/api/models-config/discover/route-436da0332762a8e3.js +1 -0
  196. package/.next/static/chunks/app/api/models-config/route-436da0332762a8e3.js +1 -0
  197. package/.next/static/chunks/app/api/models-config/test/route-436da0332762a8e3.js +1 -0
  198. package/.next/static/chunks/app/api/office-characters/[...path]/route-436da0332762a8e3.js +1 -0
  199. package/.next/static/chunks/app/api/plugins/route-436da0332762a8e3.js +1 -0
  200. package/.next/static/chunks/app/api/project-docs/route-436da0332762a8e3.js +1 -0
  201. package/.next/static/chunks/app/api/project-trust/route-436da0332762a8e3.js +1 -0
  202. package/.next/static/chunks/app/api/projects/route-436da0332762a8e3.js +1 -0
  203. package/.next/static/chunks/app/api/runs/[runId]/prelude/route-436da0332762a8e3.js +1 -0
  204. package/.next/static/chunks/app/api/runs/[runId]/route-436da0332762a8e3.js +1 -0
  205. package/.next/static/chunks/app/api/runs/[runId]/turns/route-436da0332762a8e3.js +1 -0
  206. package/.next/static/chunks/app/api/runs/route-436da0332762a8e3.js +1 -0
  207. package/.next/static/chunks/app/api/sessions/[id]/auto-name/route-436da0332762a8e3.js +1 -0
  208. package/.next/static/chunks/app/api/sessions/[id]/context/route-436da0332762a8e3.js +1 -0
  209. package/.next/static/chunks/app/api/sessions/[id]/entries/[entryId]/thinking/route-436da0332762a8e3.js +1 -0
  210. package/.next/static/chunks/app/api/sessions/[id]/export/route-436da0332762a8e3.js +1 -0
  211. package/.next/static/chunks/app/api/sessions/[id]/route-436da0332762a8e3.js +1 -0
  212. package/.next/static/chunks/app/api/sessions/[id]/state/route-436da0332762a8e3.js +1 -0
  213. package/.next/static/chunks/app/api/sessions/route-436da0332762a8e3.js +1 -0
  214. package/.next/static/chunks/app/api/sessions/search/route-436da0332762a8e3.js +1 -0
  215. package/.next/static/chunks/app/api/settings/route-436da0332762a8e3.js +1 -0
  216. package/.next/static/chunks/app/api/sidecars/[service]/[...path]/route-436da0332762a8e3.js +1 -0
  217. package/.next/static/chunks/app/api/skills/check/route-436da0332762a8e3.js +1 -0
  218. package/.next/static/chunks/app/api/skills/install/route-436da0332762a8e3.js +1 -0
  219. package/.next/static/chunks/app/api/skills/route-436da0332762a8e3.js +1 -0
  220. package/.next/static/chunks/app/api/skills/search/route-436da0332762a8e3.js +1 -0
  221. package/.next/static/chunks/app/api/skills/update/route-436da0332762a8e3.js +1 -0
  222. package/.next/static/chunks/app/api/subagents/eta/route-436da0332762a8e3.js +1 -0
  223. package/.next/static/chunks/app/api/theme/route-436da0332762a8e3.js +1 -0
  224. package/.next/static/chunks/app/api/tool-image/route-436da0332762a8e3.js +1 -0
  225. package/.next/static/chunks/app/api/update-maintenance/route-436da0332762a8e3.js +1 -0
  226. package/.next/static/chunks/app/api/updates/route-436da0332762a8e3.js +1 -0
  227. package/.next/static/chunks/app/api/web-access/recovery/route-436da0332762a8e3.js +1 -0
  228. package/.next/static/chunks/app/api/web-access/route-436da0332762a8e3.js +1 -0
  229. package/.next/static/chunks/app/api/web6/consults/route-436da0332762a8e3.js +1 -0
  230. package/.next/static/chunks/app/api/worktrees/route-436da0332762a8e3.js +1 -0
  231. package/.next/static/chunks/app/{layout-4e22adaca20b3c57.js → layout-9732ddae4dc9638c.js} +1 -1
  232. package/.next/static/chunks/app/manifest.webmanifest/route-436da0332762a8e3.js +1 -0
  233. package/.next/static/chunks/app/page-8e9c8449e2f53ae8.js +75 -0
  234. package/.next/static/chunks/next/dist/client/components/builtin/app-error-436da0332762a8e3.js +1 -0
  235. package/.next/static/chunks/next/dist/client/components/builtin/forbidden-436da0332762a8e3.js +1 -0
  236. package/.next/static/chunks/next/dist/client/components/builtin/not-found-436da0332762a8e3.js +1 -0
  237. package/.next/static/chunks/next/dist/client/components/builtin/unauthorized-436da0332762a8e3.js +1 -0
  238. package/.next/static/y4k_8nU4FYWcP7nTP4oCU/_buildManifest.js +1 -0
  239. package/.next/trace +108 -108
  240. package/.next/trace-build +1 -1
  241. package/.next/types/app/api/character-mode/route.ts +351 -0
  242. package/.next/types/app/api/office-characters/[...path]/route.ts +351 -0
  243. package/.next/types/routes.d.ts +3 -1
  244. package/.next/types/validator.ts +18 -0
  245. package/README.md +1 -1
  246. package/Tools/CUELO_Setup/files/native-runtime-patch.js +1 -1
  247. package/Tools/OMP_Global_Config/agent/extensions/character-voice.ts +217 -22
  248. package/Tools/OMP_Global_Config/agent/extensions/slop-gate/review.ts +1 -1
  249. package/Tools/OMP_Global_Config/agent/rules/harness-policy.json +2 -1
  250. package/Tools/OMP_Global_Config/agent/skills/humanizer/LICENSE.txt +21 -0
  251. package/Tools/OMP_Global_Config/agent/skills/humanizer/SKILL.md +357 -0
  252. package/Tools/OMP_Global_Config/agent/skills/humanizer/UPSTREAM.json +37 -0
  253. package/Tools/OMP_Global_Config/agent/skills/humanizer/examples/after-1.md +17 -0
  254. package/Tools/OMP_Global_Config/agent/skills/humanizer/examples/after-2.md +27 -0
  255. package/Tools/OMP_Global_Config/agent/skills/humanizer/examples/after-3.md +60 -0
  256. package/Tools/OMP_Global_Config/agent/skills/humanizer/examples/after-4.md +50 -0
  257. package/Tools/OMP_Global_Config/agent/skills/humanizer/examples/before-1.md +15 -0
  258. package/Tools/OMP_Global_Config/agent/skills/humanizer/examples/before-2.md +27 -0
  259. package/Tools/OMP_Global_Config/agent/skills/humanizer/examples/before-3.md +29 -0
  260. package/Tools/OMP_Global_Config/agent/skills/humanizer/examples/before-4.md +23 -0
  261. package/Tools/OMP_Global_Config/agent/skills/humanizer/references/pos-patterns.md +132 -0
  262. package/Tools/OMP_Global_Config/agent/skills/humanizer/references/punctuation-patterns.md +353 -0
  263. package/Tools/OMP_Global_Config/agent/skills/humanizer/references/spacing-patterns.md +132 -0
  264. package/Tools/OMP_Global_Config/agent/skills/humanizer/references/structure-patterns.md +186 -0
  265. package/Tools/OMP_Global_Config/agent/skills/humanizer/references/translation-ese-patterns.md +641 -0
  266. package/Tools/OMP_Global_Config/agent/skills/humanizer/references/vocabulary-patterns.md +511 -0
  267. package/Tools/OMP_Global_Config/agent/skills/kill-ai-slop/LICENSE +202 -0
  268. package/Tools/OMP_Global_Config/agent/skills/kill-ai-slop/README.md +113 -0
  269. package/Tools/OMP_Global_Config/agent/skills/kill-ai-slop/SKILL.md +121 -0
  270. package/Tools/OMP_Global_Config/agent/skills/kill-ai-slop/references/detection.md +411 -0
  271. package/Tools/OMP_Global_Config/agent/skills/kill-ai-slop/references/fixes.md +368 -0
  272. package/Tools/OMP_Global_Config/agent/skills/kill-ai-slop/references/taxonomy.md +343 -0
  273. package/Tools/OMP_Global_Config/agent/skills/kill-ai-slop/scripts/rules.ru.mjs +23 -0
  274. package/Tools/OMP_Global_Config/agent/skills/kill-ai-slop/scripts/scan.mjs +508 -0
  275. package/Tools/OMP_Global_Config/agent/skills/stop-slop/LICENSE +21 -0
  276. package/Tools/OMP_Global_Config/agent/skills/stop-slop/README.md +62 -0
  277. package/Tools/OMP_Global_Config/agent/skills/stop-slop/SKILL.md +68 -0
  278. package/Tools/OMP_Global_Config/agent/skills/stop-slop/references/examples.md +59 -0
  279. package/Tools/OMP_Global_Config/agent/skills/stop-slop/references/phrases.md +128 -0
  280. package/Tools/OMP_Global_Config/agent/skills/stop-slop/references/structures.md +134 -0
  281. package/package.json +4 -1
  282. package/.next/static/chunks/app/_global-error/page-60d4ba1619c3b27a.js +0 -1
  283. package/.next/static/chunks/app/api/agent/[id]/account/route-60d4ba1619c3b27a.js +0 -1
  284. package/.next/static/chunks/app/api/agent/[id]/bash-output/route-60d4ba1619c3b27a.js +0 -1
  285. package/.next/static/chunks/app/api/agent/[id]/events/route-60d4ba1619c3b27a.js +0 -1
  286. package/.next/static/chunks/app/api/agent/[id]/route-60d4ba1619c3b27a.js +0 -1
  287. package/.next/static/chunks/app/api/agent/new/route-60d4ba1619c3b27a.js +0 -1
  288. package/.next/static/chunks/app/api/agent/running/route-60d4ba1619c3b27a.js +0 -1
  289. package/.next/static/chunks/app/api/attachment-settings/route-60d4ba1619c3b27a.js +0 -1
  290. package/.next/static/chunks/app/api/attachments/[id]/transcription/route-60d4ba1619c3b27a.js +0 -1
  291. package/.next/static/chunks/app/api/attachments/draft/route-60d4ba1619c3b27a.js +0 -1
  292. package/.next/static/chunks/app/api/attachments/route-60d4ba1619c3b27a.js +0 -1
  293. package/.next/static/chunks/app/api/auth/all-providers/route-60d4ba1619c3b27a.js +0 -1
  294. package/.next/static/chunks/app/api/auth/api-key/[provider]/route-60d4ba1619c3b27a.js +0 -1
  295. package/.next/static/chunks/app/api/auth/login/[provider]/route-60d4ba1619c3b27a.js +0 -1
  296. package/.next/static/chunks/app/api/auth/logout/[provider]/route-60d4ba1619c3b27a.js +0 -1
  297. package/.next/static/chunks/app/api/auth/providers/route-60d4ba1619c3b27a.js +0 -1
  298. package/.next/static/chunks/app/api/cwd/browse/route-60d4ba1619c3b27a.js +0 -1
  299. package/.next/static/chunks/app/api/cwd/validate/route-60d4ba1619c3b27a.js +0 -1
  300. package/.next/static/chunks/app/api/default-cwd/route-60d4ba1619c3b27a.js +0 -1
  301. package/.next/static/chunks/app/api/display-settings/route-60d4ba1619c3b27a.js +0 -1
  302. package/.next/static/chunks/app/api/document-text/route-60d4ba1619c3b27a.js +0 -1
  303. package/.next/static/chunks/app/api/experiments/route-60d4ba1619c3b27a.js +0 -1
  304. package/.next/static/chunks/app/api/file-index/route-60d4ba1619c3b27a.js +0 -1
  305. package/.next/static/chunks/app/api/files/[...path]/route-60d4ba1619c3b27a.js +0 -1
  306. package/.next/static/chunks/app/api/git/diff/route-60d4ba1619c3b27a.js +0 -1
  307. package/.next/static/chunks/app/api/git/status/route-60d4ba1619c3b27a.js +0 -1
  308. package/.next/static/chunks/app/api/github/projects/route-60d4ba1619c3b27a.js +0 -1
  309. package/.next/static/chunks/app/api/gpt6/handles/route-60d4ba1619c3b27a.js +0 -1
  310. package/.next/static/chunks/app/api/gpt6/reply/route-60d4ba1619c3b27a.js +0 -1
  311. package/.next/static/chunks/app/api/gpt6/token/route-60d4ba1619c3b27a.js +0 -1
  312. package/.next/static/chunks/app/api/gpt6/web6-session/route-60d4ba1619c3b27a.js +0 -1
  313. package/.next/static/chunks/app/api/home/route-60d4ba1619c3b27a.js +0 -1
  314. package/.next/static/chunks/app/api/live/call/[callId]/route-60d4ba1619c3b27a.js +0 -1
  315. package/.next/static/chunks/app/api/live/events/route-60d4ba1619c3b27a.js +0 -1
  316. package/.next/static/chunks/app/api/live/interpret/cloud/events/route-60d4ba1619c3b27a.js +0 -1
  317. package/.next/static/chunks/app/api/live/interpret/cloud/input/route-60d4ba1619c3b27a.js +0 -1
  318. package/.next/static/chunks/app/api/live/interpret/cloud/route-60d4ba1619c3b27a.js +0 -1
  319. package/.next/static/chunks/app/api/live/interpret/route-60d4ba1619c3b27a.js +0 -1
  320. package/.next/static/chunks/app/api/live/offer/route-60d4ba1619c3b27a.js +0 -1
  321. package/.next/static/chunks/app/api/live/voices/route-60d4ba1619c3b27a.js +0 -1
  322. package/.next/static/chunks/app/api/mcp/route-60d4ba1619c3b27a.js +0 -1
  323. package/.next/static/chunks/app/api/model-roles/route-60d4ba1619c3b27a.js +0 -1
  324. package/.next/static/chunks/app/api/models/route-60d4ba1619c3b27a.js +0 -1
  325. package/.next/static/chunks/app/api/models-config/catalog/route-60d4ba1619c3b27a.js +0 -1
  326. package/.next/static/chunks/app/api/models-config/discover/route-60d4ba1619c3b27a.js +0 -1
  327. package/.next/static/chunks/app/api/models-config/route-60d4ba1619c3b27a.js +0 -1
  328. package/.next/static/chunks/app/api/models-config/test/route-60d4ba1619c3b27a.js +0 -1
  329. package/.next/static/chunks/app/api/plugins/route-60d4ba1619c3b27a.js +0 -1
  330. package/.next/static/chunks/app/api/project-docs/route-60d4ba1619c3b27a.js +0 -1
  331. package/.next/static/chunks/app/api/project-trust/route-60d4ba1619c3b27a.js +0 -1
  332. package/.next/static/chunks/app/api/projects/route-60d4ba1619c3b27a.js +0 -1
  333. package/.next/static/chunks/app/api/runs/[runId]/prelude/route-60d4ba1619c3b27a.js +0 -1
  334. package/.next/static/chunks/app/api/runs/[runId]/route-60d4ba1619c3b27a.js +0 -1
  335. package/.next/static/chunks/app/api/runs/[runId]/turns/route-60d4ba1619c3b27a.js +0 -1
  336. package/.next/static/chunks/app/api/runs/route-60d4ba1619c3b27a.js +0 -1
  337. package/.next/static/chunks/app/api/sessions/[id]/auto-name/route-60d4ba1619c3b27a.js +0 -1
  338. package/.next/static/chunks/app/api/sessions/[id]/context/route-60d4ba1619c3b27a.js +0 -1
  339. package/.next/static/chunks/app/api/sessions/[id]/entries/[entryId]/thinking/route-60d4ba1619c3b27a.js +0 -1
  340. package/.next/static/chunks/app/api/sessions/[id]/export/route-60d4ba1619c3b27a.js +0 -1
  341. package/.next/static/chunks/app/api/sessions/[id]/route-60d4ba1619c3b27a.js +0 -1
  342. package/.next/static/chunks/app/api/sessions/[id]/state/route-60d4ba1619c3b27a.js +0 -1
  343. package/.next/static/chunks/app/api/sessions/route-60d4ba1619c3b27a.js +0 -1
  344. package/.next/static/chunks/app/api/sessions/search/route-60d4ba1619c3b27a.js +0 -1
  345. package/.next/static/chunks/app/api/settings/route-60d4ba1619c3b27a.js +0 -1
  346. package/.next/static/chunks/app/api/sidecars/[service]/[...path]/route-60d4ba1619c3b27a.js +0 -1
  347. package/.next/static/chunks/app/api/skills/check/route-60d4ba1619c3b27a.js +0 -1
  348. package/.next/static/chunks/app/api/skills/install/route-60d4ba1619c3b27a.js +0 -1
  349. package/.next/static/chunks/app/api/skills/route-60d4ba1619c3b27a.js +0 -1
  350. package/.next/static/chunks/app/api/skills/search/route-60d4ba1619c3b27a.js +0 -1
  351. package/.next/static/chunks/app/api/skills/update/route-60d4ba1619c3b27a.js +0 -1
  352. package/.next/static/chunks/app/api/subagents/eta/route-60d4ba1619c3b27a.js +0 -1
  353. package/.next/static/chunks/app/api/theme/route-60d4ba1619c3b27a.js +0 -1
  354. package/.next/static/chunks/app/api/tool-image/route-60d4ba1619c3b27a.js +0 -1
  355. package/.next/static/chunks/app/api/update-maintenance/route-60d4ba1619c3b27a.js +0 -1
  356. package/.next/static/chunks/app/api/updates/route-60d4ba1619c3b27a.js +0 -1
  357. package/.next/static/chunks/app/api/web-access/recovery/route-60d4ba1619c3b27a.js +0 -1
  358. package/.next/static/chunks/app/api/web-access/route-60d4ba1619c3b27a.js +0 -1
  359. package/.next/static/chunks/app/api/web6/consults/route-60d4ba1619c3b27a.js +0 -1
  360. package/.next/static/chunks/app/api/worktrees/route-60d4ba1619c3b27a.js +0 -1
  361. package/.next/static/chunks/app/manifest.webmanifest/route-60d4ba1619c3b27a.js +0 -1
  362. package/.next/static/chunks/app/page-b61cdb3a88126c55.js +0 -75
  363. package/.next/static/chunks/next/dist/client/components/builtin/app-error-60d4ba1619c3b27a.js +0 -1
  364. package/.next/static/chunks/next/dist/client/components/builtin/forbidden-60d4ba1619c3b27a.js +0 -1
  365. package/.next/static/chunks/next/dist/client/components/builtin/not-found-60d4ba1619c3b27a.js +0 -1
  366. package/.next/static/chunks/next/dist/client/components/builtin/unauthorized-60d4ba1619c3b27a.js +0 -1
  367. package/.next/static/vdQU0PJ0EqoAWyaBUHRpd/_buildManifest.js +0 -1
  368. /package/.next/static/{vdQU0PJ0EqoAWyaBUHRpd → y4k_8nU4FYWcP7nTP4oCU}/_ssgManifest.js +0 -0
@@ -2,7 +2,7 @@
2
2
  // Do not edit this file manually
3
3
 
4
4
  type AppRoutes = "/" | "/recover"
5
- type AppRouteHandlerRoutes = "/api/agent/[id]" | "/api/agent/[id]/account" | "/api/agent/[id]/bash-output" | "/api/agent/[id]/events" | "/api/agent/new" | "/api/agent/running" | "/api/attachment-settings" | "/api/attachments" | "/api/attachments/[id]/transcription" | "/api/attachments/draft" | "/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/github/projects" | "/api/gpt6/handles" | "/api/gpt6/reply" | "/api/gpt6/token" | "/api/gpt6/web6-session" | "/api/home" | "/api/live/call/[callId]" | "/api/live/events" | "/api/live/interpret" | "/api/live/interpret/cloud" | "/api/live/interpret/cloud/events" | "/api/live/interpret/cloud/input" | "/api/live/offer" | "/api/live/voices" | "/api/mcp" | "/api/model-roles" | "/api/models" | "/api/models-config" | "/api/models-config/catalog" | "/api/models-config/discover" | "/api/models-config/test" | "/api/plugins" | "/api/project-docs" | "/api/project-trust" | "/api/projects" | "/api/runs" | "/api/runs/[runId]" | "/api/runs/[runId]/prelude" | "/api/runs/[runId]/turns" | "/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/subagents/eta" | "/api/theme" | "/api/tool-image" | "/api/update-maintenance" | "/api/updates" | "/api/web-access" | "/api/web-access/recovery" | "/api/web6/consults" | "/api/worktrees"
5
+ type AppRouteHandlerRoutes = "/api/agent/[id]" | "/api/agent/[id]/account" | "/api/agent/[id]/bash-output" | "/api/agent/[id]/events" | "/api/agent/new" | "/api/agent/running" | "/api/attachment-settings" | "/api/attachments" | "/api/attachments/[id]/transcription" | "/api/attachments/draft" | "/api/auth/all-providers" | "/api/auth/api-key/[provider]" | "/api/auth/login/[provider]" | "/api/auth/logout/[provider]" | "/api/auth/providers" | "/api/character-mode" | "/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/github/projects" | "/api/gpt6/handles" | "/api/gpt6/reply" | "/api/gpt6/token" | "/api/gpt6/web6-session" | "/api/home" | "/api/live/call/[callId]" | "/api/live/events" | "/api/live/interpret" | "/api/live/interpret/cloud" | "/api/live/interpret/cloud/events" | "/api/live/interpret/cloud/input" | "/api/live/offer" | "/api/live/voices" | "/api/mcp" | "/api/model-roles" | "/api/models" | "/api/models-config" | "/api/models-config/catalog" | "/api/models-config/discover" | "/api/models-config/test" | "/api/office-characters/[...path]" | "/api/plugins" | "/api/project-docs" | "/api/project-trust" | "/api/projects" | "/api/runs" | "/api/runs/[runId]" | "/api/runs/[runId]/prelude" | "/api/runs/[runId]/turns" | "/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/subagents/eta" | "/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
@@ -27,6 +27,7 @@ interface ParamMap {
27
27
  "/api/auth/login/[provider]": { "provider": string; }
28
28
  "/api/auth/logout/[provider]": { "provider": string; }
29
29
  "/api/auth/providers": {}
30
+ "/api/character-mode": {}
30
31
  "/api/cwd/browse": {}
31
32
  "/api/cwd/validate": {}
32
33
  "/api/default-cwd": {}
@@ -58,6 +59,7 @@ interface ParamMap {
58
59
  "/api/models-config/catalog": {}
59
60
  "/api/models-config/discover": {}
60
61
  "/api/models-config/test": {}
62
+ "/api/office-characters/[...path]": { "path": string[]; }
61
63
  "/api/plugins": {}
62
64
  "/api/project-docs": {}
63
65
  "/api/project-trust": {}
@@ -200,6 +200,15 @@ type RouteHandlerConfig<Route extends AppRouteHandlerRoutes = AppRouteHandlerRou
200
200
  type __Unused = __Check
201
201
  }
202
202
 
203
+ // Validate ../../app/api/character-mode/route.ts
204
+ {
205
+ type __IsExpected<Specific extends RouteHandlerConfig<"/api/character-mode">> = Specific
206
+ const handler = {} as typeof import("../../app/api/character-mode/route.js")
207
+ type __Check = __IsExpected<typeof handler>
208
+ // @ts-ignore
209
+ type __Unused = __Check
210
+ }
211
+
203
212
  // Validate ../../app/api/cwd/browse/route.ts
204
213
  {
205
214
  type __IsExpected<Specific extends RouteHandlerConfig<"/api/cwd/browse">> = Specific
@@ -479,6 +488,15 @@ type RouteHandlerConfig<Route extends AppRouteHandlerRoutes = AppRouteHandlerRou
479
488
  type __Unused = __Check
480
489
  }
481
490
 
491
+ // Validate ../../app/api/office-characters/[...path]/route.ts
492
+ {
493
+ type __IsExpected<Specific extends RouteHandlerConfig<"/api/office-characters/[...path]">> = Specific
494
+ const handler = {} as typeof import("../../app/api/office-characters/[...path]/route.js")
495
+ type __Check = __IsExpected<typeof handler>
496
+ // @ts-ignore
497
+ type __Unused = __Check
498
+ }
499
+
482
500
  // Validate ../../app/api/plugins/route.ts
483
501
  {
484
502
  type __IsExpected<Specific extends RouteHandlerConfig<"/api/plugins">> = Specific
package/README.md CHANGED
@@ -51,7 +51,7 @@ Requires Node.js 22.19+ and Bun 1.4.2+. Open http://127.0.0.1:30141 and sign in
51
51
  | 앱·런타임 설치 뒤 동작 | 세션 탐색·실시간 대화·분기/fork, 모델 역할, provider·플러그인·스킬 관리, 파일 미리보기, 비밀번호 잠금, 캐릭터 알림 등. 대화에는 별도 제공자 인증이 필요합니다 |
52
52
  | 사용자가 준비할 것 | Node.js·Bun과 자신의 모델 제공자 계정·모델 선택. 소스 checkout/전체 Git 기능에는 Git(Windows는 Git for Windows)도 필요합니다. 인증정보·세션·설정은 사용자의 로컬 `~/.omp/agent`에 저장합니다 |
53
53
  | 로컬 사이드카 (공개) | 계정 사용량 카드, 사이드 챗(`/btw`), SubAgent 아카이브의 실행 소스도 포함합니다. `start`가 앱과 함께 실행합니다. usage의 CLI fallback·`stats`에는 별도 `omp` CLI가 필요합니다 |
54
- | OMP 하네스 (공개) | Main/Maker 역할 분담, 발주·검수 계약, task guard, 판단 라우팅(Jev), 캐릭터 말투, 명령 가드의 규칙·SOP·확장과 앱 SDK core 패치입니다. `setup`으로 설치합니다. [하네스 안내](./docs/harness.md)에 Jev의 외부 자격 경계가 있습니다 |
54
+ | OMP 하네스 (공개) | Main/Maker 역할 분담, 발주·검수 계약, task guard, 판단 라우팅(Jev), 캐릭터 말투, 명령 가드의 규칙·SOP·확장과 앱 SDK core 패치입니다. `setup`으로 설치합니다. npm 배포본에는 문서·화면 문구 점검용 공개 스킬과 참조 자료·라이선스도 포함하며, 개인 스킬은 제외합니다. [하네스 안내](./docs/harness.md)에 Jev의 외부 자격 경계가 있습니다 |
55
55
  | 포함하지 않는 것 | 개발자의 로그인 정보·API 키·개인 계정 및 모델 설정·개인 skill·대화와 작업 기록·PC별 운영 자료. 공개 설치는 필요한 비개인 운영 기본값만 제공하고 모델은 사용자가 고릅니다 |
56
56
 
57
57
  ## CUELO에서 할 수 있는 것
@@ -9,7 +9,7 @@ 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.10.83',
12
+ version: '0.10.85',
13
13
  distribution: 'cuelo',
14
14
  coreVersion: '18.12.6',
15
15
  };
@@ -1,3 +1,6 @@
1
+ import { lstatSync, readFileSync, realpathSync, statSync } from "node:fs";
2
+ import { homedir } from "node:os";
3
+ import { isAbsolute, join, relative, sep } from "node:path";
1
4
  import type { ExtensionAPI, ExtensionContext } from "@oh-my-pi/pi-coding-agent";
2
5
 
3
6
  export type BuiltinCharacterAlias =
@@ -9,7 +12,8 @@ export type BuiltinCharacterAlias =
9
12
  | "SHION(시온)"
10
13
  | "HIKARI(히카리)";
11
14
 
12
- export type CharacterAlias = BuiltinCharacterAlias;
15
+ /** 내장 7개 + 사무실 모드가 PC 프로필(roster)에서 자리마다 들여오는 동적 alias. */
16
+ export type CharacterAlias = BuiltinCharacterAlias | (string & {});
13
17
 
14
18
  interface OAuthAccountLike {
15
19
  position?: number;
@@ -175,20 +179,203 @@ function buildNameRegexes(pattern: string): { nameInCommand: RegExp; switchComma
175
179
  const QUOTED_SPAN = /```[\s\S]*?```|`[^`\n]*`|'[^'\n]*'|"[^"\n]*"|‘[^’\n]*’|“[^”\n]*”|「[^」\n]*」|『[^』\n]*』|^[ \t]*>.*$/gmu;
176
180
  const SUMMON_MARKER_PREFIX = /\[character-summon\s/u;
177
181
 
178
- const NAME_REGEXES = buildNameRegexes(CHARACTER_NAME_PATTERN);
182
+ // ── 사무실 모드 ───────────────────────────────────────────────────────────────
183
+ // 서버 전체 「기본 / 사무실 모드」. 사무실 모드에서는 roster에 항목이 있는 자리의 캐릭터만 PC 프로필의 것으로
184
+ // 바뀐다(자리의 모델·oauth 위치·toolCapable은 그대로). 모드 파일 `<agentDir>/cuelo-character-mode.json`
185
+ // {"mode":"default"|"office"}과 `<agentDir>/characters-office/roster.json`을 요청마다 mtime 캐시로 읽고,
186
+ // 없거나 깨졌으면 그 자리는 기본이다. 실존 인물에서 온 이름·자산은 저장소가 아니라 프로필에만 둔다.
187
+ interface OfficeSeat {
188
+ seat: BuiltinCharacterAlias;
189
+ alias: string;
190
+ voice: CharacterVoice;
191
+ }
192
+
193
+ interface OfficeState {
194
+ byAlias: ReadonlyMap<string, OfficeSeat>;
195
+ bySeat: ReadonlyMap<BuiltinCharacterAlias, OfficeSeat>;
196
+ /** roster `names`(소문자) → 사무실 alias. 자리의 기본 이름은 NAME_TO_ALIAS가 같은 자리로 푼다. */
197
+ extraNames: ReadonlyMap<string, string>;
198
+ /** 채택한 face 파일과 그 stamp. 파일이 바뀌거나 지워지면 캐시를 다시 만든다. */
199
+ watched: ReadonlyArray<readonly [string, string]>;
200
+ nameInCommand: RegExp;
201
+ switchCommand: RegExp;
202
+ }
203
+
204
+ const DEFAULT_OFFICE_STATE: OfficeState = {
205
+ watched: [],
206
+ byAlias: new Map(),
207
+ bySeat: new Map(),
208
+ extraNames: new Map(),
209
+ ...buildNameRegexes(CHARACTER_NAME_PATTERN),
210
+ };
211
+ const OFFICE_MODE_FILE = "cuelo-character-mode.json";
212
+ const OFFICE_ROSTER_FILE = join("characters-office", "roster.json");
213
+ // alias는 `alias="…"` 속성과 summon marker의 `[^"]+`에 그대로 들어가므로 따옴표(앱 lib/character-mode.ts와 같은 집합)·꺾쇠·줄바꿈을 막는다.
214
+ const OFFICE_ALIAS_UNSAFE = /["'`\u201C\u201D\u2018\u2019<>[\]\r\n]/u;
215
+ const OFFICE_ID = /^[a-z0-9][a-z0-9-]{0,31}$/u;
216
+ /**
217
+ * 사무실 모드가 바꿀 수 있는 자리(MITSU 제외). roster의 다른 자리 항목은 무시한다. 이 순서가 자리 사이 충돌을
218
+ * 가리는 우선순위이며 앱(`lib/character-mode.ts` `OFFICE_SEAT_ALIASES`)과 같아야 한다.
219
+ */
220
+ const OFFICE_SEATS: readonly BuiltinCharacterAlias[] = ["YUKI(유키)", "ISANA(이사나)", "MIO(미오)", "RIN(린)", "SHION(시온)", "HIKARI(히카리)"];
221
+ let officeCache: { key: string; state: OfficeState } | undefined;
222
+
223
+ function officeAgentDir(): string {
224
+ return process.env.PI_CODING_AGENT_DIR || join(homedir(), ".omp", "agent");
225
+ }
226
+
227
+ // 시각·크기만으로는 링크를 같은 크기의 일반 파일로 바꾼 것을 놓친다(Windows 파일 시각은 시스템 tick 단위라 같게 나올 수 있다).
228
+ // 그래서 경로 자체가 링크인지와 대상 inode도 함께 본다.
229
+ function fileStamp(path: string): string {
230
+ try {
231
+ const stat = statSync(path);
232
+ return `${lstatSync(path).isSymbolicLink() ? "l" : "f"}:${stat.ino}:${stat.mtimeMs}:${stat.size}`;
233
+ } catch {
234
+ return "-";
235
+ }
236
+ }
237
+
238
+ function readJsonFile(path: string): unknown {
239
+ try {
240
+ return JSON.parse(readFileSync(path, "utf8").replace(/^\uFEFF/u, ""));
241
+ } catch {
242
+ return undefined;
243
+ }
244
+ }
245
+
246
+ function voiceText(value: unknown): string | undefined {
247
+ if (typeof value !== "string") return undefined;
248
+ const text = value.trim();
249
+ // voice block 경계 태그가 들어 있으면 block을 깨므로 항목째 버린다.
250
+ return text && !/<\/?character-voice/iu.test(text) ? text : undefined;
251
+ }
179
252
 
180
253
  function hasOwn(record: object, key: string): boolean {
181
254
  return Object.prototype.hasOwnProperty.call(record, key);
182
255
  }
183
256
 
184
- /** 내장 alias만 인정한다. 모르는 alias는 undefined. */
185
- function canonicalAlias(alias: string): CharacterAlias | undefined {
186
- return hasOwn(CHARACTER_TARGETS, alias) ? (alias as CharacterAlias) : undefined;
257
+ /** face는 characters-office 안의 실재하는 일반 파일이어야 한다. 안전하면 realpath, 아니면 undefined. */
258
+ function officeFile(dir: string, face: unknown): string | undefined {
259
+ if (typeof face !== "string" || !face.trim() || isAbsolute(face) || /^[A-Za-z]:/u.test(face)) return undefined;
260
+ if (face.split(/[\\/]/u).includes("..")) return undefined;
261
+ try {
262
+ const root = realpathSync(join(dir, "characters-office"));
263
+ const real = realpathSync(join(root, face));
264
+ const inside = relative(root, real);
265
+ if (!inside || inside.startsWith("..") || isAbsolute(inside) || inside.split(sep).includes("..")) return undefined;
266
+ return statSync(real).isFile() ? real : undefined;
267
+ } catch {
268
+ return undefined;
269
+ }
270
+ }
271
+
272
+ function buildOfficeState(dir: string, roster: unknown): OfficeState {
273
+ const seats = roster && typeof roster === "object" ? (roster as { seats?: unknown }).seats : undefined;
274
+ if (!seats || typeof seats !== "object" || Array.isArray(seats)) return DEFAULT_OFFICE_STATE;
275
+ const byAlias = new Map<string, OfficeSeat>();
276
+ const bySeat = new Map<BuiltinCharacterAlias, OfficeSeat>();
277
+ const extraNames = new Map<string, string>();
278
+ const watched: Array<readonly [string, string]> = [];
279
+ const builtinAliases = new Map(Object.keys(CHARACTER_TARGETS).map((builtin) => [builtin.toLocaleLowerCase("en-US"), builtin]));
280
+ // 별칭과 호출 이름은 한 이름 공간(소문자), id는 따로다. 이미 채택된 자리와 하나라도 겹치면 뒤 자리 항목 전체가 무효다.
281
+ const claimedTokens = new Set<string>();
282
+ const claimedIds = new Set<string>();
283
+ for (const seat of OFFICE_SEATS) {
284
+ const entry = hasOwn(seats, seat) ? (seats as Record<string, unknown>)[seat] : undefined;
285
+ if (!entry || typeof entry !== "object") continue;
286
+ const raw = entry as {
287
+ id?: unknown;
288
+ alias?: unknown;
289
+ names?: unknown;
290
+ face?: unknown;
291
+ voice?: { temperament?: unknown; expression?: unknown };
292
+ };
293
+ const alias = typeof raw.alias === "string" ? raw.alias.trim() : "";
294
+ const temperament = voiceText(raw.voice?.temperament);
295
+ const expression = voiceText(raw.voice?.expression);
296
+ const face = officeFile(dir, raw.face);
297
+ // 아직 없거나 무효인 face도 나중에 생기면 항목이 유효해질 수 있어 후보 경로의 stamp를 감시한다.
298
+ if (typeof raw.face === "string" && raw.face.trim() && !isAbsolute(raw.face) && !raw.face.split(/[\\/]/u).includes("..")) {
299
+ const candidate = join(dir, "characters-office", raw.face);
300
+ watched.push([candidate, fileStamp(candidate)]);
301
+ }
302
+ if (
303
+ typeof raw.id !== "string" || !OFFICE_ID.test(raw.id.trim()) ||
304
+ !alias || alias.length > 64 || OFFICE_ALIAS_UNSAFE.test(alias) || hasOwn(CHARACTER_TARGETS, alias) ||
305
+ !temperament || !expression || !face ||
306
+ !Array.isArray(raw.names) || raw.names.length === 0
307
+ ) {
308
+ continue;
309
+ }
310
+ // names: 전부 비지 않은 문자열이어야 하고 다른 자리의 내장 alias·호출 이름이면 항목 전체가 무효다.
311
+ const names: string[] = [];
312
+ let namesValid = true;
313
+ for (const name of raw.names) {
314
+ const lower = typeof name === "string" ? name.trim().toLocaleLowerCase("en-US") : "";
315
+ if (!lower || (builtinAliases.has(lower) && builtinAliases.get(lower) !== seat) || (hasOwn(NAME_TO_ALIAS, lower) && NAME_TO_ALIAS[lower] !== seat)) {
316
+ namesValid = false;
317
+ break;
318
+ }
319
+ names.push(lower);
320
+ }
321
+ if (!namesValid) continue;
322
+ const id = raw.id.trim();
323
+ const tokens = [alias.toLocaleLowerCase("en-US"), ...names];
324
+ if (claimedIds.has(id) || tokens.some((token) => claimedTokens.has(token))) continue;
325
+ claimedIds.add(id);
326
+ for (const token of tokens) claimedTokens.add(token);
327
+ const office: OfficeSeat = { seat, alias, voice: { temperament, expression } };
328
+ byAlias.set(alias, office);
329
+ bySeat.set(seat, office);
330
+ // face 후보 stamp는 위에서 이미 감시 목록에 넣었다.
331
+ // 자리의 기본 이름은 NAME_TO_ALIAS가 이미 같은 자리로 푼다. 사무실 이름은 위에서 자리 사이 유일함이 확인됐다.
332
+ for (const lower of names) if (!hasOwn(NAME_TO_ALIAS, lower)) extraNames.set(lower, alias);
333
+ }
334
+ if (byAlias.size === 0) return { ...DEFAULT_OFFICE_STATE, watched };
335
+ const escaped = [...extraNames.keys()]
336
+ .sort((left, right) => right.length - left.length)
337
+ .map((name) => name.replace(/[.*+?^${}()|[\]\\]/gu, "\\$&"));
338
+ const pattern = escaped.length > 0 ? `(${escaped.join("|")}|${CHARACTER_NAME_PATTERN.slice(1)}` : CHARACTER_NAME_PATTERN;
339
+ return { byAlias, bySeat, extraNames, watched, ...buildNameRegexes(pattern) };
340
+ }
341
+
342
+ function officeState(): OfficeState {
343
+ try {
344
+ const dir = officeAgentDir();
345
+ const modePath = join(dir, OFFICE_MODE_FILE);
346
+ const rosterPath = join(dir, OFFICE_ROSTER_FILE);
347
+ const key = `${dir}\0${fileStamp(modePath)}\0${fileStamp(rosterPath)}`;
348
+ // face 파일이 지워지거나 바뀌면 같은 roster여도 항목이 무효가 될 수 있어 그 stamp도 확인한다.
349
+ if (officeCache?.key === key && officeCache.state.watched.every(([path, stamp]) => fileStamp(path) === stamp)) {
350
+ return officeCache.state;
351
+ }
352
+ const mode = readJsonFile(modePath);
353
+ const office = !!mode && typeof mode === "object" && (mode as { mode?: unknown }).mode === "office";
354
+ // roster도 face와 같이 characters-office 안의 실재 파일일 때만 읽는다(symlink로 밖을 가리키면 사무실 상태 없음).
355
+ const rosterReal = office ? officeFile(dir, "roster.json") : undefined;
356
+ const state = rosterReal ? buildOfficeState(dir, readJsonFile(rosterReal)) : DEFAULT_OFFICE_STATE;
357
+ officeCache = { key, state };
358
+ return state;
359
+ } catch {
360
+ return DEFAULT_OFFICE_STATE;
361
+ }
362
+ }
363
+
364
+ function seatOf(alias: string, state: OfficeState): BuiltinCharacterAlias | undefined {
365
+ const office = state.byAlias.get(alias);
366
+ if (office) return office.seat;
367
+ return hasOwn(CHARACTER_TARGETS, alias) ? (alias as BuiltinCharacterAlias) : undefined;
368
+ }
369
+
370
+ /** 자리(내장 alias)나 사무실 alias를 지금 모드의 화면용 alias로 정규화한다. 모르는 alias는 undefined. */
371
+ function canonicalAlias(alias: string, state: OfficeState): CharacterAlias | undefined {
372
+ const seat = seatOf(alias, state);
373
+ return seat === undefined ? undefined : (state.bySeat.get(seat)?.alias ?? seat);
187
374
  }
188
375
 
189
- /** alias가 가리키는 자리의 모델·oauth 위치·toolCapable. */
376
+ /** alias가 가리키는 자리의 모델·oauth 위치·toolCapable. 사무실 alias도 자리의 target을 쓴다. */
190
377
  export function characterTarget(alias: string): CharacterTarget | undefined {
191
- const seat = canonicalAlias(alias);
378
+ const seat = seatOf(alias, officeState());
192
379
  return seat === undefined ? undefined : CHARACTER_TARGETS[seat];
193
380
  }
194
381
 
@@ -199,18 +386,22 @@ function requireTarget(alias: string): CharacterTarget {
199
386
  }
200
387
 
201
388
  function voiceFor(alias: string): CharacterVoice | undefined {
202
- return hasOwn(CHARACTER_VOICES, alias) ? CHARACTER_VOICES[alias as CharacterAlias] : undefined;
389
+ const state = officeState();
390
+ const office = state.byAlias.get(alias);
391
+ if (office) return office.voice;
392
+ return hasOwn(CHARACTER_VOICES, alias) ? CHARACTER_VOICES[alias as BuiltinCharacterAlias] : undefined;
203
393
  }
204
394
 
205
- function aliasFromName(name: string): CharacterAlias | undefined {
206
- const base = NAME_TO_ALIAS[name.toLocaleLowerCase("en-US")];
207
- return base ? canonicalAlias(base) : undefined;
395
+ function aliasFromName(name: string, state: OfficeState): CharacterAlias | undefined {
396
+ const lower = name.toLocaleLowerCase("en-US");
397
+ const base = state.extraNames.get(lower) ?? NAME_TO_ALIAS[lower];
398
+ return base ? canonicalAlias(base, state) : undefined;
208
399
  }
209
400
 
210
- function aliasesFromCommand(text: string): CharacterAlias[] {
401
+ function aliasesFromCommand(text: string, state: OfficeState): CharacterAlias[] {
211
402
  const aliases = new Set<CharacterAlias>();
212
- for (const match of text.matchAll(NAME_REGEXES.nameInCommand)) {
213
- const alias = aliasFromName(match[1]!);
403
+ for (const match of text.matchAll(state.nameInCommand)) {
404
+ const alias = aliasFromName(match[1]!, state);
214
405
  if (alias) aliases.add(alias);
215
406
  }
216
407
  return [...aliases];
@@ -289,7 +480,7 @@ function injectVoiceIntoSystemBlocks(parts: readonly unknown[], block: string):
289
480
  }
290
481
 
291
482
  function characterAliasForContext(ctx: ExtensionContext, selectedAlias: CharacterAlias | undefined): CharacterAlias | undefined {
292
- const canonical = selectedAlias ? canonicalAlias(selectedAlias) : undefined;
483
+ const canonical = selectedAlias ? canonicalAlias(selectedAlias, officeState()) : undefined;
293
484
  const target = canonical ? characterTarget(canonical) : undefined;
294
485
  if (canonical && target && modelMatches(ctx.model, target.model)) {
295
486
  if (target.oauthPosition === undefined) return canonical;
@@ -386,13 +577,14 @@ async function switchCharacterForSession(
386
577
  }
387
578
 
388
579
  export function parseCharacterIntent(text: string): CharacterIntent | undefined {
389
- const aliases = aliasesFromCommand(text);
580
+ const state = officeState();
581
+ const aliases = aliasesFromCommand(text, state);
390
582
  if (aliases.length === 0) return undefined;
391
583
  if (text.includes("교체")) {
392
584
  // alias도 인용 밖에서만 뽑아 인용 속 이름과 인용 밖 명령어가 결합되지 않게 한다.
393
585
  const command = text.replace(QUOTED_SPAN, " ");
394
- const switchAliases = aliasesFromCommand(command);
395
- if (!NAME_REGEXES.switchCommand.test(command) || switchAliases.length !== 1) return undefined;
586
+ const switchAliases = aliasesFromCommand(command, state);
587
+ if (!state.switchCommand.test(command) || switchAliases.length !== 1) return undefined;
396
588
  return { kind: "switch", alias: switchAliases[0]! };
397
589
  }
398
590
  return SUMMON_ACTION.test(text) ? { kind: "summon", aliases } : undefined;
@@ -400,9 +592,10 @@ export function parseCharacterIntent(text: string): CharacterIntent | undefined
400
592
 
401
593
  /** 다른 input handler가 자연어 summon을 routing prompt로 바꾼 뒤에도 순서와 무관하게 복구한다. */
402
594
  export function parseCharacterSummonDirectives(text: string): CharacterAlias[] {
595
+ const state = officeState();
403
596
  const aliases = new Set<CharacterAlias>();
404
597
  for (const match of text.matchAll(SUMMON_DIRECTIVE)) {
405
- const alias = canonicalAlias(match[1]!);
598
+ const alias = canonicalAlias(match[1]!, state);
406
599
  if (alias) aliases.add(alias);
407
600
  }
408
601
  return [...aliases];
@@ -415,7 +608,7 @@ export function anthropicCharacterForAccounts(
415
608
  const account = accounts[index]!;
416
609
  if (!account.active) continue;
417
610
  const seat = ANTHROPIC_POSITION_CHARACTER[accountPosition(account, index)];
418
- return seat && canonicalAlias(seat);
611
+ return seat && canonicalAlias(seat, officeState());
419
612
  }
420
613
  return undefined;
421
614
  }
@@ -427,7 +620,7 @@ export function characterForProvider(
427
620
  ): CharacterAlias | undefined {
428
621
  if (provider === "anthropic") return anthropicCharacterForAccounts(accounts);
429
622
  const seat = (modelId === undefined ? undefined : MODEL_CHARACTER[`${provider}/${modelId}`]) ?? PROVIDER_CHARACTER[provider];
430
- return seat && canonicalAlias(seat);
623
+ return seat && canonicalAlias(seat, officeState());
431
624
  }
432
625
 
433
626
  export function renderCharacterVoice(alias: CharacterAlias): string {
@@ -622,7 +815,7 @@ export function buildCharacterSummonBrief(brief: string, alias: CharacterAlias):
622
815
 
623
816
  export function parseCharacterSummonMarker(prompt: string): CharacterAlias | undefined {
624
817
  const match = SUMMON_MARKER.exec(prompt);
625
- const alias = match ? canonicalAlias(match[1]!) : undefined;
818
+ const alias = match ? canonicalAlias(match[1]!, officeState()) : undefined;
626
819
  const target = alias === undefined ? undefined : characterTarget(alias);
627
820
  if (!match || alias === undefined || !target || target.model !== match[2]) return undefined;
628
821
  const position = match[3] === undefined ? undefined : Number(match[3]);
@@ -635,8 +828,10 @@ export function parseCharacterSummonMarker(prompt: string): CharacterAlias | und
635
828
  */
636
829
  export function malformedSummonMarkerReason(task: string): string | undefined {
637
830
  if (!SUMMON_MARKER_PREFIX.test(task) || parseCharacterSummonMarker(task) !== undefined) return undefined;
831
+ const state = officeState();
638
832
  const expected = (Object.keys(CHARACTER_TARGETS) as BuiltinCharacterAlias[])
639
833
  .filter((seat) => CHARACTER_TARGETS[seat].toolCapable)
834
+ .map((seat) => state.bySeat.get(seat)?.alias ?? seat)
640
835
  .map((alias) => `- ${alias}: \`${summonMarkerFor(alias)}\``);
641
836
  return [
642
837
  "[CharacterSummonGuard] task의 character-summon marker가 exact target과 맞지 않습니다. " +
@@ -61,7 +61,7 @@ export interface ReviewOutcome { /** "main"을 푼 저자 selector. reviewer 계
61
61
  // ── 기준(스킬 본문) ──────────────────────────────────────────────────────────
62
62
 
63
63
  const RUBRIC_FILES: Record<string, string[]> = {
64
- humanizer: ["humanizer/SKILL.md"],
64
+ humanizer: ["humanizer/SKILL.md", "humanizer/references/punctuation-patterns.md", "humanizer/references/spacing-patterns.md", "humanizer/references/pos-patterns.md", "humanizer/references/vocabulary-patterns.md", "humanizer/references/structure-patterns.md", "humanizer/references/translation-ese-patterns.md"],
65
65
  "stop-slop": ["stop-slop/SKILL.md", "stop-slop/references/phrases.md", "stop-slop/references/structures.md"],
66
66
  "kill-ai-slop": ["kill-ai-slop/SKILL.md", "kill-ai-slop/references/taxonomy.md"],
67
67
  };
@@ -116,7 +116,8 @@
116
116
  "anthropicAccountMapping": "stable-oauth-storage-position-zero-rin-position-one-mio-with-exact-session-affinity-for-a-validated-session-switch-command-or-character-summon-marker",
117
117
  "failure": "exact-switch-or-summon-account-block-or-usage-limit-ends-with-the-selected-alias-and-never-emits-sibling-credential-or-model-text-ordinary-sessions-retain-native-fallback",
118
118
  "conversationalPrecedence": "natural-korean-selected-character-is-authoritative-across-first-response-post-tool-explanation-validation-failure-risk-and-unknown-reporting-human-interjection-progress-final-answer-and-inline-child-speech-internal-evidence-todo-and-child-status-contracts-govern-information-not-user-facing-format-system-prompt-headings-tables-and-lists-are-policy-organization-not-response-templates-required-user-parser-final-owner-formats-are-the-only-exception",
119
- "voiceEnforcement": "at-the-final-provider-wire-boundary-for-main-and-task-children-remove-every-prior-character-voice-and-legacy-report-style-block-and-install-exactly-one-selected-character-block-called-character-terminal-speech-is-already-user-visible-canonical-so-main-never-requotes-or-reaggregates-it"
119
+ "voiceEnforcement": "at-the-final-provider-wire-boundary-for-main-and-task-children-remove-every-prior-character-voice-and-legacy-report-style-block-and-install-exactly-one-selected-character-block-called-character-terminal-speech-is-already-user-visible-canonical-so-main-never-requotes-or-reaggregates-it",
120
+ "officeMode": "server-wide-default-or-office-mode-file-in-the-agent-dir-office-replaces-valid-pc-profile-entries-in-fixed-order-yuki-isana-mio-rin-shion-hikari-mitsu-unchanged-first-accepted-alias-call-name-or-id-wins-later-conflicting-entry-stays-default-the-roster-is-an-untrusted-local-file-validated-by-the-same-rule-as-the-app-allowed-seat-id-pattern-safe-alias-not-a-built-in-alias-names-not-another-seat-name-non-empty-voice-without-character-voice-tags-face-realpath-inside-characters-office-and-roster-read-only-through-realpath-containment-seat-model-oauth-position-and-tool-capability-unchanged-shion-remains-consult-only-roster-names-and-the-seat-default-name-both-resolve-to-the-seat-a-pending-office-summon-fails-closed-if-the-mode-changes-missing-or-invalid-mode-or-roster-means-default-and-never-an-error-character-data-and-assets-live-only-in-the-pc-profile-never-in-the-repository-or-public-mirror"
120
121
  },
121
122
  "longRunningWork": {
122
123
  "finiteValidation": "owned-by-the-owner-of-the-changed-scope-always-explicit-async-background-not-eval-or-blocking-foreground",
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Dale Seo
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.