elanous 0.2.9 → 0.2.11

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 (694) hide show
  1. package/apps/pwa/out/404/index.html +1 -1
  2. package/apps/pwa/out/404.html +1 -1
  3. package/apps/pwa/out/_next/static/Y4zKzL62sakG5momz3SoQ/_buildManifest.js +1 -0
  4. package/apps/pwa/out/_next/static/chunks/1159-0c5ef8bc21cb6afb.js +1 -0
  5. package/apps/pwa/out/_next/static/chunks/1394-556de6d71bbdb0fb.js +1 -0
  6. package/apps/pwa/out/_next/static/chunks/1452.93700483b9d4fc61.js +9 -0
  7. package/apps/pwa/out/_next/static/chunks/{6062-73e68343a9814f6a.js → 1829-b453a1b22d3999bb.js} +1 -1
  8. package/apps/pwa/out/_next/static/chunks/2176-c379e3ebce874151.js +1 -0
  9. package/apps/pwa/out/_next/static/chunks/2310-7a59f043f6db207e.js +1 -0
  10. package/apps/pwa/out/_next/static/chunks/2426.8c6ee0c668d53def.js +1 -0
  11. package/apps/pwa/out/_next/static/chunks/2548-6e316138d347cefe.js +1 -0
  12. package/apps/pwa/out/_next/static/chunks/3170-7ec60a56fa0e4728.js +1 -0
  13. package/apps/pwa/out/_next/static/chunks/3278-ae6ef084769f6195.js +1 -0
  14. package/apps/pwa/out/_next/static/chunks/3454-988a53dac60a1763.js +1 -0
  15. package/apps/pwa/out/_next/static/chunks/3638-aa80b4641ea439db.js +1 -0
  16. package/apps/pwa/out/_next/static/chunks/3735-fe3402553ac1c9c6.js +1 -0
  17. package/apps/pwa/out/_next/static/chunks/3869-a39d1d9921e10d43.js +1 -0
  18. package/apps/pwa/out/_next/static/chunks/390.c373e31b3b9d0c41.js +5 -0
  19. package/apps/pwa/out/_next/static/chunks/3992-2e522a8ac5f2afde.js +25 -0
  20. package/apps/pwa/out/_next/static/chunks/4215-c9d91dd644ec1719.js +1 -0
  21. package/apps/pwa/out/_next/static/chunks/4508-5d0161d1e724d735.js +1 -0
  22. package/apps/pwa/out/_next/static/chunks/4685-c3c1c625b71accd1.js +1 -0
  23. package/apps/pwa/out/_next/static/chunks/4733-623a79345b171e1c.js +1 -0
  24. package/apps/pwa/out/_next/static/chunks/4883.3bd969ea1d3aaaff.js +2 -0
  25. package/apps/pwa/out/_next/static/chunks/507-5acd98bd6dab2d8a.js +1 -0
  26. package/apps/pwa/out/_next/static/chunks/5445-745eb795c5963d79.js +1 -0
  27. package/apps/pwa/out/_next/static/chunks/5532.6899a12958a89b72.js +1 -0
  28. package/apps/pwa/out/_next/static/chunks/5845-e6c003ce8d5fd36a.js +1 -0
  29. package/apps/pwa/out/_next/static/chunks/5978-b27004c677119115.js +1 -0
  30. package/apps/pwa/out/_next/static/chunks/{8046cadf-211ca3c0e00f2b72.js → 5cd7e3a9-404fd6b8d0ecd44c.js} +1 -1
  31. package/apps/pwa/out/_next/static/chunks/6048-4c5c33579bc4ef78.js +1 -0
  32. package/apps/pwa/out/_next/static/chunks/6303-422dbf0f67c72aac.js +1 -0
  33. package/apps/pwa/out/_next/static/chunks/6751-bb3595948b2e311b.js +1 -0
  34. package/apps/pwa/out/_next/static/chunks/7274-19b7279f18b47ab3.js +1 -0
  35. package/apps/pwa/out/_next/static/chunks/{4323.c5dfb6f503304775.js → 7334.a6679d9168f37aa8.js} +1 -1
  36. package/apps/pwa/out/_next/static/chunks/7551-a0e0707b79164ddd.js +1 -0
  37. package/apps/pwa/out/_next/static/chunks/7777-79f845045aa1ed86.js +1 -0
  38. package/apps/pwa/out/_next/static/chunks/79f8be9e-957d68913b590b08.js +1 -0
  39. package/apps/pwa/out/_next/static/chunks/8025-cc24ee5d8f2fb6f8.js +1 -0
  40. package/apps/pwa/out/_next/static/chunks/8039-df92e08fede5de8f.js +1 -0
  41. package/apps/pwa/out/_next/static/chunks/8206-c6684dcde12be721.js +1 -0
  42. package/apps/pwa/out/_next/static/chunks/8421-1c4acfb1395a0edf.js +1 -0
  43. package/apps/pwa/out/_next/static/chunks/8605-ea5bee9dfae512c7.js +1 -0
  44. package/apps/pwa/out/_next/static/chunks/8725.bf46bb1395dd0fa2.js +1 -0
  45. package/apps/pwa/out/_next/static/chunks/8734-252d511cd276c0dc.js +1 -0
  46. package/apps/pwa/out/_next/static/chunks/8834-ca1cb09c1cb1a6bf.js +1 -0
  47. package/apps/pwa/out/_next/static/chunks/{2415.ed6428ff334c7ce2.js → 9269.d2a4795bc6812717.js} +1 -1
  48. package/apps/pwa/out/_next/static/chunks/9538-2816b90923606459.js +1 -0
  49. package/apps/pwa/out/_next/static/chunks/9656-c1540088f5859c80.js +1 -0
  50. package/apps/pwa/out/_next/static/chunks/9906-482c6619b3fdda20.js +1 -0
  51. package/apps/pwa/out/_next/static/chunks/app/_not-found/page-d16993889b125c42.js +1 -0
  52. package/apps/pwa/out/_next/static/chunks/app/approvals/page-1dcdc58fc2de2454.js +1 -0
  53. package/apps/pwa/out/_next/static/chunks/app/autopilot/page-6a061bd97f0b9398.js +1 -0
  54. package/apps/pwa/out/_next/static/chunks/app/board/page-cb95a7432c9ee744.js +1 -0
  55. package/apps/pwa/out/_next/static/chunks/app/botlab/{page-f972fc1c00a62e88.js → page-b12b6d2f8d2d1aea.js} +1 -1
  56. package/apps/pwa/out/_next/static/chunks/app/bots/page-b9efe868bfd36255.js +1 -0
  57. package/apps/pwa/out/_next/static/chunks/app/chat/page-7c97dcdfe2e37a60.js +1 -0
  58. package/apps/pwa/out/_next/static/chunks/app/consult/page-8fd36984f549270a.js +1 -0
  59. package/apps/pwa/out/_next/static/chunks/app/control/page-5721537ca8a3598c.js +1 -0
  60. package/apps/pwa/out/_next/static/chunks/app/design-check/page-b654240a572e4c48.js +1 -0
  61. package/apps/pwa/out/_next/static/chunks/app/editor/page-b9750abc897508c3.js +1 -0
  62. package/apps/pwa/out/_next/static/chunks/app/exec/page-4cd1de371f8ad048.js +1 -0
  63. package/apps/pwa/out/_next/static/chunks/app/field/page-d99f89657828421c.js +1 -0
  64. package/apps/pwa/out/_next/static/chunks/app/healthz/route-d16993889b125c42.js +1 -0
  65. package/apps/pwa/out/_next/static/chunks/app/inside/page-50cb2a0eb15e6c83.js +1 -0
  66. package/apps/pwa/out/_next/static/chunks/app/intake/page-c8b1ccda6ba7ae98.js +1 -0
  67. package/apps/pwa/out/_next/static/chunks/app/layout-d6b1d156fb95e74b.js +1 -0
  68. package/apps/pwa/out/_next/static/chunks/app/live/page-2a9932ddb62d76bd.js +1 -0
  69. package/apps/pwa/out/_next/static/chunks/app/market/page-9688f5b4f1ff950f.js +1 -0
  70. package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-6b15dd6456c5df09.js +1 -0
  71. package/apps/pwa/out/_next/static/chunks/app/morning/{page-adfbd2ba9598e59a.js → page-35414e0a007b4082.js} +1 -1
  72. package/apps/pwa/out/_next/static/chunks/app/not-found-e7a529e0507ac86c.js +1 -0
  73. package/apps/pwa/out/_next/static/chunks/app/observatory/page-e001823c35c9dd67.js +1 -0
  74. package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-371423d1a573d64b.js +1 -0
  75. package/apps/pwa/out/_next/static/chunks/app/ops/release/page-4b764b125339ac17.js +1 -0
  76. package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-cdf8e4b01067bcf1.js +1 -0
  77. package/apps/pwa/out/_next/static/chunks/app/outputs/page-3a24072b35470157.js +1 -0
  78. package/apps/pwa/out/_next/static/chunks/app/page-94c82eb0ae5abb32.js +1 -0
  79. package/apps/pwa/out/_next/static/chunks/app/reflection/page-0be8d4b2ced75ba0.js +1 -0
  80. package/apps/pwa/out/_next/static/chunks/app/scheduler/page-d37cb0d52f9b6bd5.js +1 -0
  81. package/apps/pwa/out/_next/static/chunks/app/sessions/page-686da0df9bf23e5c.js +1 -0
  82. package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-4dc614f3ce043e63.js +1 -0
  83. package/apps/pwa/out/_next/static/chunks/app/settings/page-53f80edc6b8dc07c.js +1 -0
  84. package/apps/pwa/out/_next/static/chunks/app/setup/done/page-d02c782fc792e2af.js +1 -0
  85. package/apps/pwa/out/_next/static/chunks/app/setup/layout-d16993889b125c42.js +1 -0
  86. package/apps/pwa/out/_next/static/chunks/app/setup/page-239c17b911b84e72.js +1 -0
  87. package/apps/pwa/out/_next/static/chunks/app/share/page-dc6a79fb003f746c.js +1 -0
  88. package/apps/pwa/out/_next/static/chunks/app/showroom/page-0fffb84cafdc9da6.js +1 -0
  89. package/apps/pwa/out/_next/static/chunks/app/tasks/page-1218753c82d585f6.js +1 -0
  90. package/apps/pwa/out/_next/static/chunks/app/term/page-4b5935e67531efb5.js +1 -0
  91. package/apps/pwa/out/_next/static/chunks/app/today/page-3285bc87caf1eaa5.js +1 -0
  92. package/apps/pwa/out/_next/static/chunks/app/trace/page-ad553b0e06505ecd.js +1 -0
  93. package/apps/pwa/out/_next/static/chunks/app/vault/page-fca096e3e860306f.js +1 -0
  94. package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-9ebfa78f0d9885c3.js +1 -0
  95. package/apps/pwa/out/_next/static/chunks/app/workflows/page-3dc5f21f7e39622d.js +1 -0
  96. package/apps/pwa/out/_next/static/chunks/app/workspace/page-c6da2b468454532d.js +1 -0
  97. package/apps/pwa/out/_next/static/chunks/app/worktrees/page-93bc70e36f595414.js +1 -0
  98. package/apps/pwa/out/_next/static/chunks/{2ea96958-e8c7e112de50b067.js → f48170cc-d05d28bf87a43bf4.js} +1 -1
  99. package/apps/pwa/out/_next/static/chunks/framework-172630e6aa5e2d7f.js +1 -0
  100. package/apps/pwa/out/_next/static/chunks/main-app-f0fe2d7477845181.js +1 -0
  101. package/apps/pwa/out/_next/static/chunks/main-fc98ac70b44eccb0.js +1 -0
  102. package/apps/pwa/out/_next/static/chunks/pages/_app-5bd7f10271f72413.js +1 -0
  103. package/apps/pwa/out/_next/static/chunks/pages/_error-97d0d85ea05fef9b.js +1 -0
  104. package/apps/pwa/out/_next/static/chunks/webpack-9e4d02d567b98240.js +1 -0
  105. package/apps/pwa/out/_next/static/css/543f56bcb1f79fca.css +1 -0
  106. package/apps/pwa/out/approvals/index.html +1 -1
  107. package/apps/pwa/out/approvals/index.txt +23 -23
  108. package/apps/pwa/out/autopilot/index.html +1 -1
  109. package/apps/pwa/out/autopilot/index.txt +23 -23
  110. package/apps/pwa/out/board/index.html +1 -1
  111. package/apps/pwa/out/board/index.txt +23 -23
  112. package/apps/pwa/out/botlab/index.html +1 -1
  113. package/apps/pwa/out/botlab/index.txt +22 -22
  114. package/apps/pwa/out/bots/index.html +1 -1
  115. package/apps/pwa/out/bots/index.txt +22 -22
  116. package/apps/pwa/out/chat/index.html +1 -1
  117. package/apps/pwa/out/chat/index.txt +22 -22
  118. package/apps/pwa/out/consult/index.html +1 -1
  119. package/apps/pwa/out/consult/index.txt +23 -23
  120. package/apps/pwa/out/control/index.html +1 -1
  121. package/apps/pwa/out/control/index.txt +23 -23
  122. package/apps/pwa/out/design-check/index.html +1 -1
  123. package/apps/pwa/out/design-check/index.txt +23 -23
  124. package/apps/pwa/out/editor/index.html +1 -1
  125. package/apps/pwa/out/editor/index.txt +23 -23
  126. package/apps/pwa/out/exec/index.html +1 -1
  127. package/apps/pwa/out/exec/index.txt +23 -23
  128. package/apps/pwa/out/field/index.html +1 -1
  129. package/apps/pwa/out/field/index.txt +23 -23
  130. package/apps/pwa/out/healthz +1 -1
  131. package/apps/pwa/out/index.html +1 -1
  132. package/apps/pwa/out/index.txt +22 -22
  133. package/apps/pwa/out/inside/index.html +1 -0
  134. package/apps/pwa/out/inside/index.txt +31 -0
  135. package/apps/pwa/out/intake/index.html +1 -1
  136. package/apps/pwa/out/intake/index.txt +23 -23
  137. package/apps/pwa/out/live/index.html +1 -1
  138. package/apps/pwa/out/live/index.txt +23 -23
  139. package/apps/pwa/out/market/index.html +1 -1
  140. package/apps/pwa/out/market/index.txt +22 -22
  141. package/apps/pwa/out/missions/placeholder/index.html +1 -1
  142. package/apps/pwa/out/missions/placeholder/index.txt +22 -22
  143. package/apps/pwa/out/morning/index.html +1 -1
  144. package/apps/pwa/out/morning/index.txt +23 -23
  145. package/apps/pwa/out/observatory/index.html +1 -1
  146. package/apps/pwa/out/observatory/index.txt +23 -23
  147. package/apps/pwa/out/ops/checklist/index.html +1 -1
  148. package/apps/pwa/out/ops/checklist/index.txt +22 -22
  149. package/apps/pwa/out/ops/release/index.html +1 -1
  150. package/apps/pwa/out/ops/release/index.txt +22 -22
  151. package/apps/pwa/out/ops/seats/index.html +1 -0
  152. package/apps/pwa/out/ops/seats/index.txt +30 -0
  153. package/apps/pwa/out/outputs/index.html +1 -0
  154. package/apps/pwa/out/outputs/index.txt +30 -0
  155. package/apps/pwa/out/reflection/index.html +1 -1
  156. package/apps/pwa/out/reflection/index.txt +23 -23
  157. package/apps/pwa/out/scheduler/index.html +1 -1
  158. package/apps/pwa/out/scheduler/index.txt +23 -23
  159. package/apps/pwa/out/sessions/index.html +1 -1
  160. package/apps/pwa/out/sessions/index.txt +22 -22
  161. package/apps/pwa/out/settings/devices/index.html +1 -1
  162. package/apps/pwa/out/settings/devices/index.txt +23 -23
  163. package/apps/pwa/out/settings/index.html +1 -1
  164. package/apps/pwa/out/settings/index.txt +23 -23
  165. package/apps/pwa/out/setup/done/index.html +1 -1
  166. package/apps/pwa/out/setup/done/index.txt +23 -23
  167. package/apps/pwa/out/setup/index.html +1 -1
  168. package/apps/pwa/out/setup/index.txt +23 -23
  169. package/apps/pwa/out/share/index.html +1 -1
  170. package/apps/pwa/out/share/index.txt +23 -23
  171. package/apps/pwa/out/showroom/index.html +1 -1
  172. package/apps/pwa/out/showroom/index.txt +22 -22
  173. package/apps/pwa/out/tasks/index.html +1 -1
  174. package/apps/pwa/out/tasks/index.txt +23 -23
  175. package/apps/pwa/out/term/index.html +1 -1
  176. package/apps/pwa/out/term/index.txt +23 -24
  177. package/apps/pwa/out/today/index.html +1 -0
  178. package/apps/pwa/out/today/index.txt +33 -0
  179. package/apps/pwa/out/trace/index.html +1 -1
  180. package/apps/pwa/out/trace/index.txt +23 -23
  181. package/apps/pwa/out/vault/index.html +1 -1
  182. package/apps/pwa/out/vault/index.txt +23 -23
  183. package/apps/pwa/out/workflows/chat-ui/index.html +1 -1
  184. package/apps/pwa/out/workflows/chat-ui/index.txt +23 -23
  185. package/apps/pwa/out/workflows/index.html +1 -1
  186. package/apps/pwa/out/workflows/index.txt +23 -23
  187. package/apps/pwa/out/workspace/index.html +1 -1
  188. package/apps/pwa/out/workspace/index.txt +23 -24
  189. package/apps/pwa/out/worktrees/index.html +1 -1
  190. package/apps/pwa/out/worktrees/index.txt +23 -23
  191. package/graphs/drafts/draft-cleanup.yaml +19 -0
  192. package/graphs/drafts/recipes.yaml +23 -0
  193. package/graphs/field/field-feed.yaml +2 -0
  194. package/graphs/implement-loop.yaml +1 -1
  195. package/graphs/intake/intake-daily.yaml +2 -1
  196. package/graphs/ops/recipes.yaml +3 -0
  197. package/graphs/ops/secret-exposure.yaml +24 -0
  198. package/graphs/release/recipes.yaml +3 -0
  199. package/graphs/release/release-loop.yaml +4 -1
  200. package/graphs/video/explainer-line.yaml +2 -2
  201. package/package.json +2 -1
  202. package/plugins/card-followup/graphs/run-step.ts +48 -13
  203. package/plugins/doc-draft/graphs/doc-draft.yaml +3 -3
  204. package/plugins/doc-draft/graphs/run-step.ts +13 -6
  205. package/plugins/elanous-hwp/README.md +25 -0
  206. package/plugins/elanous-hwp/cli.ts +22 -0
  207. package/plugins/elanous-hwp/converter.ts +237 -0
  208. package/plugins/elanous-hwp/fixtures/fixed-controls.hwpx +0 -0
  209. package/plugins/elanous-hwp/fixtures/fixed-table-controls.hwpx +0 -0
  210. package/plugins/elanous-hwp/fixtures/fixed.hwpx +0 -0
  211. package/plugins/elanous-hwp/plugin.json +16 -0
  212. package/plugins/elanous-hwp/plugin.ts +40 -0
  213. package/scripts/ci-public-export-leak-gate.ts +75 -14
  214. package/scripts/ci-public-leak-gate.ts +44 -9
  215. package/scripts/ci-pwa-build-gate.ts +160 -0
  216. package/scripts/context-hooks/claude-stop.sh +4 -0
  217. package/scripts/context-hooks/emit.ts +24 -0
  218. package/scripts/context-hooks/post-tool-use.sh +4 -0
  219. package/scripts/coord-channel-watch.sh +54 -8
  220. package/scripts/coord-digest.ts +199 -0
  221. package/scripts/coord-post.sh +60 -3
  222. package/scripts/coord-requests-bridge.ts +143 -0
  223. package/scripts/field-feed/lib.ts +4 -0
  224. package/scripts/fleet/node-setup.sh +20 -3
  225. package/scripts/homebrew-formula-bump.ts +69 -0
  226. package/scripts/install.ps1 +68 -9
  227. package/scripts/install.sh +39 -12
  228. package/scripts/lib/pwa-scenarios/scenarios.ts +20 -0
  229. package/scripts/lib/tui-regress-checks.ts +146 -0
  230. package/scripts/marketing/measure-site-numbers.ts +169 -0
  231. package/scripts/measure-gate-shards.ts +309 -0
  232. package/scripts/memory-lifecycle-cycle.ts +2 -2
  233. package/scripts/mission-request-judge.ts +31 -1
  234. package/scripts/morning-report.ts +2 -2
  235. package/scripts/opportunity-scan.ts +1 -1
  236. package/scripts/ops-now-probe.ts +327 -0
  237. package/scripts/publish-internal-dist.ts +11 -1
  238. package/scripts/release-loop/auto-approve-node.ts +21 -4
  239. package/scripts/release-loop/cut-branch.ts +84 -0
  240. package/scripts/release-loop/cutoff.ts +19 -8
  241. package/scripts/release-loop/gate-node.ts +14 -13
  242. package/scripts/release-loop/mac-smoke-node.ts +229 -0
  243. package/scripts/release-loop/node-verdict.ts +3 -3
  244. package/scripts/release-loop/ops-upgrade-node.ts +72 -16
  245. package/scripts/release-loop/release-readiness.ts +9 -0
  246. package/scripts/release-loop/tui-node-checks.ts +42 -0
  247. package/scripts/release-loop/tui-sim-node.ts +32 -8
  248. package/scripts/release-loop/unattended-release.ts +5 -3
  249. package/scripts/release-loop/version-node.ts +112 -13
  250. package/scripts/repo-watch-cycle.ts +1 -1
  251. package/scripts/retro-cycle.ts +2 -2
  252. package/scripts/schedule-health-report.ts +1 -1
  253. package/scripts/signal-digest-cycle.ts +2 -7
  254. package/scripts/signal-digest-photo.ts +11 -0
  255. package/scripts/storyboard/storyboard.ts +5 -161
  256. package/scripts/tech1-public-measure.ts +94 -0
  257. package/scripts/test-diet/lib.ts +30 -1
  258. package/scripts/test-diet/node.ts +83 -8
  259. package/scripts/test-timeout-audit.ts +114 -0
  260. package/scripts/tree-sync-alert.ts +1 -1
  261. package/scripts/tui-regress.ts +71 -0
  262. package/scripts/ux/demo-rehearsal.ts +243 -0
  263. package/scripts/ux/lib/rehearsal-verdict.ts +73 -0
  264. package/scripts/waitlist-daily-digest.ts +1 -1
  265. package/skills/diagram-master/SKILL.md +366 -0
  266. package/skills/diagram-master/references/engines/excalidraw/color-palette.md +67 -0
  267. package/skills/diagram-master/references/engines/excalidraw/element-templates.md +182 -0
  268. package/skills/diagram-master/references/engines/excalidraw/json-schema.md +71 -0
  269. package/skills/diagram-master/references/engines/excalidraw/render_excalidraw.py +189 -0
  270. package/skills/diagram-master/references/engines/excalidraw/render_template.html +57 -0
  271. package/skills/diagram-master/references/engines/matplotlib/matplotlib-patterns.md +235 -0
  272. package/skills/diagram-master/references/engines/matplotlib/render_matplotlib.py +184 -0
  273. package/skills/diagram-master/references/engines/mermaid/domain-templates.md +435 -0
  274. package/skills/diagram-master/references/engines/mermaid/render_mermaid.py +116 -0
  275. package/skills/diagram-master/references/engines/mermaid/syntax-reference.md +2247 -0
  276. package/skills/diagram-master/references/engines/nanobannana/render_nanobannana2.py +168 -0
  277. package/skills/diagram-master/references/engines/svg/color-palette.md +188 -0
  278. package/skills/diagram-master/references/engines/svg/html-base-template.html +332 -0
  279. package/skills/diagram-master/references/engines/svg/interactivity-patterns.md +435 -0
  280. package/skills/diagram-master/references/engines/svg/render_interactive_svg.py +212 -0
  281. package/skills/diagram-master/references/engines/svg/svg-element-templates.md +349 -0
  282. package/skills/diagram-master/references/examples/README.md +69 -0
  283. package/skills/diagram-master/references/examples/ref_grid_architecture.png +0 -0
  284. package/skills/diagram-master/references/examples/ref_layered_flow.png +0 -0
  285. package/skills/diagram-master/references/pyproject.toml +16 -0
  286. package/skills/diagram-master/references/quality-checklist.md +33 -0
  287. package/skills/diagram-master/references/routing-guide.md +164 -0
  288. package/skills/diagram-master/references/uv.lock +1356 -0
  289. package/skills/explainer-video/SKILL.md +4 -0
  290. package/skills/explainer-video/engine/reel.mjs +18 -13
  291. package/skills/explainer-video/engine/reel.sh +24 -5
  292. package/skills/explainer-video/engine/stitch.mjs +145 -0
  293. package/skills/google-workspace/SKILL.md +33 -0
  294. package/skills/google-workspace/scripts/gws-safe.sh +177 -0
  295. package/skills/grill-me/SKILL.md +1 -1
  296. package/skills/lecture-note-digitizer/SKILL.md +926 -0
  297. package/skills/lecture-note-digitizer/references/convert_to_pdf.py +30 -0
  298. package/skills/lecture-note-digitizer/references/extract_slide_diagram.py +73 -0
  299. package/skills/lecture-note-digitizer/references/html-template.md +167 -0
  300. package/skills/lecture-note-digitizer/references/katex-style-guide.md +165 -0
  301. package/skills/omni-crawl/SKILL.md +21 -11
  302. package/skills/omni-crawl/scripts/main.ts +6 -6
  303. package/skills/omni-crawl/src/router.ts +3 -3
  304. package/skills/omni-digest/SKILL.md +17 -9
  305. package/skills/omni-digest/digest.md +2 -2
  306. package/skills/omni-digest/src/fetch.ts +30 -3
  307. package/skills/pitch-deck/SKILL.md +36 -0
  308. package/skills/pitch-deck/template.html +80 -0
  309. package/skills/youtube-master/SKILL.md +163 -0
  310. package/skills/youtube-master/package-lock.json +558 -0
  311. package/skills/youtube-master/package.json +13 -0
  312. package/skills/youtube-master/references/study-note-template.md +124 -0
  313. package/skills/youtube-master/scripts/main.ts +435 -0
  314. package/skills/youtube-master/scripts/transcribe-local.ts +24 -0
  315. package/skills/youtube-master/src/audio.ts +63 -0
  316. package/skills/youtube-master/src/domain-staging.ts +50 -0
  317. package/skills/youtube-master/src/env.ts +36 -0
  318. package/skills/youtube-master/src/obsidian.ts +155 -0
  319. package/skills/youtube-master/src/router.ts +110 -0
  320. package/skills/youtube-master/src/stt.ts +199 -0
  321. package/skills/youtube-master/src/study-note.ts +175 -0
  322. package/skills/youtube-master/src/summarize.ts +358 -0
  323. package/skills/youtube-master/src/transcript.ts +76 -0
  324. package/skills/youtube-master/src/types.ts +91 -0
  325. package/skills/youtube-master/src/util.ts +93 -0
  326. package/skills/youtube-master/src/youtube.ts +70 -0
  327. package/skills/youtube-master/tsconfig.json +13 -0
  328. package/src/acp/codex-approval-adapter.ts +9 -3
  329. package/src/acp/core-turn-bridge.ts +117 -18
  330. package/src/acp/fact-question.ts +11 -0
  331. package/src/acp/server.ts +53 -9
  332. package/src/acp/tool-approval.ts +126 -0
  333. package/src/acp/turn-runner.ts +36 -0
  334. package/src/agent/monad-agent-turn.ts +8 -0
  335. package/src/agent-mission/driver.ts +80 -10
  336. package/src/agent-mission/pty-decision.ts +71 -0
  337. package/src/agent-mission/review-loop.ts +30 -0
  338. package/src/ask-user-question/pending-questions.ts +25 -10
  339. package/src/ask-user-question/types.ts +9 -0
  340. package/src/auth/setup-link-tokens.ts +16 -5
  341. package/src/autopilot/build/integrity-gate.ts +12 -0
  342. package/src/autopilot/build/llm-conflict-merge.ts +16 -3
  343. package/src/autopilot/tool-registry.ts +2 -0
  344. package/src/boot/daemon-prompt-turn.ts +8 -0
  345. package/src/boot/daemon-runtime.ts +9 -3
  346. package/src/boot/daemon-tools/index.ts +8 -0
  347. package/src/boot/daemon-tools/types.ts +2 -0
  348. package/src/boot/daemon-tools/web-search.ts +4 -0
  349. package/src/card-followup/core.ts +109 -0
  350. package/src/chat/ctrl-c-in-input.ts +14 -0
  351. package/src/chat/index.ts +53 -0
  352. package/src/chat/pickers/state.ts +6 -2
  353. package/src/cli/agent-cli.ts +7 -0
  354. package/src/cli/decisions-cli.ts +25 -3
  355. package/src/cli/doctor-bundle-upload.ts +68 -0
  356. package/src/cli/doctor-cli.ts +38 -4
  357. package/src/cli/drive-input-jail.ts +101 -0
  358. package/src/cli/hooks-cli.ts +17 -3
  359. package/src/cli/make-cli.ts +43 -0
  360. package/src/cli/ops-cli.ts +20 -0
  361. package/src/cli/persona-cli.ts +90 -4
  362. package/src/cli/plugin-cli.ts +31 -22
  363. package/src/cli/pod-cli.ts +61 -2
  364. package/src/cli/pr-cli.ts +82 -17
  365. package/src/cli/pty-drive-cli.ts +41 -7
  366. package/src/cli/pty-drive-verdict.ts +40 -0
  367. package/src/cli/pwa-stop.ts +163 -13
  368. package/src/cli/pwa-test.ts +3 -0
  369. package/src/cli/release-cli.ts +80 -24
  370. package/src/cli/self-update.ts +14 -0
  371. package/src/cli/setup-cli.ts +43 -1
  372. package/src/cli/skills-cli.ts +17 -1
  373. package/src/cli/storyboard-cli.ts +37 -0
  374. package/src/cli/test-state-dir-flag.ts +11 -4
  375. package/src/connectors/linear.ts +146 -0
  376. package/src/context-bus/claude-hooks-install.ts +10 -0
  377. package/src/context-bus/context-now-surfaces.ts +48 -0
  378. package/src/context-bus/context-now.ts +104 -0
  379. package/src/context-bus/coord-events.ts +115 -0
  380. package/src/context-bus/external-events.ts +52 -0
  381. package/src/context-bus/long-term-memory.ts +108 -0
  382. package/src/dashboard/dashboard-boot-fixture.ts +23 -0
  383. package/src/dashboard/index.ts +63 -21
  384. package/src/dashboard/slash-runtime/dashboard-handlers.ts +14 -1
  385. package/src/dashboard/slash-runtime/help-from-registry.ts +43 -28
  386. package/src/decisions/decision-cards.ts +58 -3
  387. package/src/decisions/decision-ledger.ts +85 -6
  388. package/src/decisions/decision-linear-projection.ts +157 -0
  389. package/src/decisions/web-push-decision-cards.ts +50 -0
  390. package/src/directive/interpretation-card.ts +36 -0
  391. package/src/discord/sprint21-runtime.ts +5 -1
  392. package/src/discord-self-message.ts +32 -0
  393. package/src/discord-slash-wire.ts +5 -1
  394. package/src/discord.ts +19 -2
  395. package/src/domains/coo-admin-tool.ts +62 -0
  396. package/src/domains/core-tools.ts +13 -4
  397. package/src/domains/elanous-card.ts +29 -0
  398. package/src/domains/ops-facts-tool.ts +76 -0
  399. package/src/domains/outbound-alert.ts +46 -13
  400. package/src/domains/release-tool.ts +168 -0
  401. package/src/domains/telegram-kind-route.ts +65 -9
  402. package/src/exec-requests/default-outputs.ts +25 -0
  403. package/src/exec-requests/planner.ts +106 -28
  404. package/src/exec-requests/runner.ts +123 -12
  405. package/src/exec-requests/store.ts +11 -2
  406. package/src/execution-loop/launch-gate.ts +100 -0
  407. package/src/field/field-media.ts +10 -7
  408. package/src/field/field-reel.ts +19 -5
  409. package/src/field-note/index.ts +201 -0
  410. package/src/field-note/transcribe.ts +248 -0
  411. package/src/git-fs/worktree.ts +45 -6
  412. package/src/graph-kinds/registry.ts +3 -3
  413. package/src/graph-runner/graph-approval-card.ts +113 -0
  414. package/src/graph-runner/graph-cli.ts +189 -4
  415. package/src/graph-runner/graph-grow-llm.ts +37 -0
  416. package/src/graph-runner/graph-grow.ts +47 -0
  417. package/src/graph-runner/graph-notify.ts +25 -3
  418. package/src/graph-runner/runner.ts +453 -35
  419. package/src/grok/agent-search.ts +8 -2
  420. package/src/guardian/secret-exposure-scan.ts +101 -0
  421. package/src/harness/browser-verify.ts +25 -2
  422. package/src/harness/harness-cli-command.ts +478 -42
  423. package/src/harness/harness-incidents-writer.fixture.ts +24 -0
  424. package/src/harness/harness-incidents.ts +129 -0
  425. package/src/harness/harness-pod-dispatch.ts +43 -23
  426. package/src/harness/harness-seams.ts +38 -4
  427. package/src/harness/harness-stop.ts +75 -6
  428. package/src/harness/launch-registry.ts +91 -0
  429. package/src/harness/process-garbage.ts +5 -3
  430. package/src/hitl/clarification-policy.ts +3 -1
  431. package/src/hooks/dispatch.ts +82 -0
  432. package/src/hooks/expose.ts +254 -0
  433. package/src/hooks/github-shadow.ts +108 -0
  434. package/src/hooks/providers.ts +71 -5
  435. package/src/hooks/queue.ts +1 -1
  436. package/src/hooks/receiver.ts +21 -20
  437. package/src/index.ts +206 -49
  438. package/src/intake-plane/author-goals.ts +37 -4
  439. package/src/intake-plane/categorize.ts +18 -46
  440. package/src/intake-plane/check.ts +3 -0
  441. package/src/intake-plane/discord-seat-work.ts +57 -2
  442. package/src/intake-plane/front-route-classifier.ts +33 -39
  443. package/src/intake-plane/persona-answer.ts +30 -0
  444. package/src/intake-plane/runtime-callables.ts +8 -1
  445. package/src/intake-plane/seat-doc-route.ts +170 -6
  446. package/src/intake-plane/telegram-seat-work.ts +80 -4
  447. package/src/intake-plane/telegram-work.ts +1 -0
  448. package/src/intake-plane/wish-folder.ts +67 -0
  449. package/src/intent-gate/gate.ts +30 -10
  450. package/src/live/detail-switch.ts +5 -0
  451. package/src/llm/difficulty.ts +57 -0
  452. package/src/llm/judge-layer.ts +101 -0
  453. package/src/llm/mission-router.ts +33 -19
  454. package/src/loops/contract/examples/cmo-seat.loop.yaml +51 -0
  455. package/src/loops/contract/examples/orchestrator.loop.yaml +57 -0
  456. package/src/loops/contract/examples/steward.loop.yaml +50 -0
  457. package/src/loops/contract/loop-agent.schema.json +138 -0
  458. package/src/loops/contract/validate.ts +64 -0
  459. package/src/loops/registry.ts +20 -6
  460. package/src/market/signed-index.ts +4 -0
  461. package/src/maturity/bot-command-maturity.ts +45 -0
  462. package/src/maturity/cli-maturity.ts +34 -0
  463. package/src/maturity/feature-maturity.ts +120 -1
  464. package/src/maturity/tui-slash-maturity.ts +31 -0
  465. package/src/memory.ts +32 -4
  466. package/src/model-tier/index.ts +2 -2
  467. package/src/model-tier/tier-resolver.ts +20 -20
  468. package/src/model-tier/types.ts +6 -6
  469. package/src/mss/logging/log-store.ts +15 -0
  470. package/src/nexus/api/config-model-tier.ts +5 -4
  471. package/src/nexus/api/exec-requests.ts +33 -3
  472. package/src/nexus/api/fabric-plans.ts +53 -0
  473. package/src/nexus/api/harness-api.ts +5 -1
  474. package/src/nexus/api/health.ts +2 -0
  475. package/src/nexus/api/http-server.ts +89 -1
  476. package/src/nexus/api/inside-events.ts +226 -0
  477. package/src/nexus/api/meta-api.ts +32 -8
  478. package/src/nexus/api/missions.ts +6 -1
  479. package/src/nexus/api/ops-api.ts +10 -1
  480. package/src/nexus/api/ops-seats-sources.ts +37 -7
  481. package/src/nexus/api/ops-seats.ts +49 -6
  482. package/src/nexus/api/outputs-route.ts +44 -0
  483. package/src/nexus/api/seat-requests.ts +132 -10
  484. package/src/nexus/api/sessions-store.ts +42 -0
  485. package/src/nexus/api/setup-codex-login.ts +160 -0
  486. package/src/nexus/api/sub-seat-charters.ts +34 -0
  487. package/src/nexus/api/tabs-mutations.ts +3 -1
  488. package/src/nexus/api/trace.ts +18 -6
  489. package/src/nexus/api/usage-api.ts +102 -0
  490. package/src/nexus/api/workflow-run-event-bridge.ts +1 -0
  491. package/src/nexus/api/workflows.ts +80 -6
  492. package/src/nexus/index.ts +47 -4
  493. package/src/nexus/kinds/webterm.ts +2 -1
  494. package/src/nexus/webterm/pty.ts +6 -2
  495. package/src/onboarding/cli-auth-status.ts +80 -0
  496. package/src/onboarding/first-run.ts +89 -0
  497. package/src/onboarding/lan-address.ts +45 -0
  498. package/src/onboarding/voice-ai.ts +3 -3
  499. package/src/onboarding/web-first.ts +119 -24
  500. package/src/onboarding.ts +4 -0
  501. package/src/ops-now/ops-now-refresh.ts +100 -0
  502. package/src/org/seat-budget.ts +48 -0
  503. package/src/org/stall-escalation.ts +63 -0
  504. package/src/outputs/ledger.ts +120 -0
  505. package/src/persona/persona-todo.ts +79 -0
  506. package/src/persona/presets.ts +116 -2
  507. package/src/persona/team-set.ts +155 -0
  508. package/src/plugins/install/plugin-install.ts +14 -0
  509. package/src/plugins/maker/market-bundle.ts +109 -0
  510. package/src/plugins/maker/plugin-maker.ts +254 -11
  511. package/src/plugins/maker/wizard-generate.ts +103 -0
  512. package/src/pod-lease/admission.ts +150 -0
  513. package/src/pod-lease/dependency-state.ts +85 -0
  514. package/src/pod-lease/host-lease.ts +127 -0
  515. package/src/project/project-store.ts +115 -0
  516. package/src/project/project-suggestion.ts +16 -0
  517. package/src/project/session-context.ts +24 -0
  518. package/src/release-loop/checklist.ts +79 -5
  519. package/src/release-loop/feature-store.ts +159 -24
  520. package/src/release-loop/next-md-merge.ts +58 -0
  521. package/src/release-loop/release-note.ts +59 -4
  522. package/src/release-loop/release-schedule.ts +53 -0
  523. package/src/repl/index.ts +7 -0
  524. package/src/seat-dispatch/ceo-commands.ts +41 -8
  525. package/src/seat-dispatch/ceo-intent.ts +38 -0
  526. package/src/seat-dispatch/seat-ask.ts +130 -0
  527. package/src/seat-dispatch/seat-questions.ts +100 -0
  528. package/src/seat-loop/seat-loop.ts +750 -0
  529. package/src/seat-loop/seat-report.ts +99 -0
  530. package/src/self-dev/decompose.ts +66 -11
  531. package/src/self-dev/dev-cli.ts +4 -1
  532. package/src/self-dev/dev-pipeline.ts +37 -1
  533. package/src/self-dev/draft-sweep.ts +38 -33
  534. package/src/self-dev/draft-triage-rules.ts +8 -5
  535. package/src/self-dev/fabric-plan-core.ts +297 -0
  536. package/src/self-dev/orchestrate.ts +36 -4
  537. package/src/self-dev/release-path-guard.ts +62 -0
  538. package/src/self-dev/run-store.ts +10 -1
  539. package/src/self-dev/shard-aggregate.ts +230 -0
  540. package/src/self-dev/shard-placement.ts +60 -0
  541. package/src/self-dev/shard-plan.ts +48 -0
  542. package/src/self-dev/shard-pod-run.ts +77 -0
  543. package/src/self-dev/shard-run.ts +105 -0
  544. package/src/self-implement/execution-clarification.ts +115 -0
  545. package/src/self-implement/gate-baseline.ts +1 -1
  546. package/src/self-implement/gate-cli.ts +46 -4
  547. package/src/self-implement/gate-scope.ts +37 -7
  548. package/src/self-implement/graph-variant.ts +171 -0
  549. package/src/self-implement/harness-policy-gates.ts +1 -1
  550. package/src/self-implement/headless-elanous-driver.ts +22 -3
  551. package/src/self-implement/host-regate.ts +22 -1
  552. package/src/self-implement/importer-test-index.ts +2 -1
  553. package/src/self-implement/l8-merge-queue.ts +130 -0
  554. package/src/self-implement/orchestrator.ts +279 -12
  555. package/src/self-implement/pipeline-shape.ts +1 -1
  556. package/src/self-implement/route-consumer-test-index.ts +122 -0
  557. package/src/self-implement/run-status-mapping.ts +5 -3
  558. package/src/self-implement/seams.ts +72 -11
  559. package/src/self-implement/test-seams.ts +1 -0
  560. package/src/self-implement/uncommitted-work.ts +59 -0
  561. package/src/session/chat.ts +2 -0
  562. package/src/session/index.ts +45 -13
  563. package/src/shell-env-bootstrap.ts +17 -0
  564. package/src/skills/gift-install.ts +215 -0
  565. package/src/skills/tools/web-search.ts +4 -1
  566. package/src/steward/directive.ts +51 -2
  567. package/src/steward/launch.ts +266 -0
  568. package/src/steward/outcome-notify.ts +115 -0
  569. package/src/steward/steward-cards.ts +25 -11
  570. package/src/steward/triage-plan.ts +32 -4
  571. package/src/steward/triage.ts +129 -13
  572. package/src/steward/working-backwards.ts +64 -0
  573. package/src/storyboard/storyboard.ts +141 -0
  574. package/src/task-cards/card-cli.ts +25 -1
  575. package/src/task-cards/card-store.ts +2 -2
  576. package/src/task-orchestrator/mission.ts +5 -0
  577. package/src/task-orchestrator/store.ts +12 -3
  578. package/src/task-orchestrator/surfaces/pod-command-job.ts +29 -7
  579. package/src/task-orchestrator/surfaces/pod-lease.ts +397 -0
  580. package/src/task-orchestrator/surfaces/pod-pool.ts +127 -26
  581. package/src/task-orchestrator/surfaces/self-implement-pod.ts +214 -40
  582. package/src/task-orchestrator/surfaces/self-implement.ts +15 -2
  583. package/src/task-orchestrator/types.ts +2 -0
  584. package/src/telegram-card-followup.ts +153 -0
  585. package/src/telegram-commands.ts +10 -1
  586. package/src/telegram-project-command.ts +71 -0
  587. package/src/telegram-report.ts +29 -19
  588. package/src/telegram-run.ts +7 -0
  589. package/src/telegram.ts +58 -11
  590. package/src/tool-runtime/self-cognition-runtimes.ts +13 -3
  591. package/src/tool-runtime/types.ts +4 -0
  592. package/src/tui-client/dashboard-session.ts +2 -0
  593. package/src/user-config.ts +216 -27
  594. package/src/version/packed-revision.json +1 -1
  595. package/src/web-push/notify-exec-request.ts +32 -0
  596. package/src/web-search/grok.ts +7 -1
  597. package/src/web-search/index.ts +28 -1
  598. package/src/web-search/provider.ts +4 -0
  599. package/src/web-search/x-intent.ts +5 -0
  600. package/src/workflow-runtime/executor.ts +277 -47
  601. package/src/workflow-runtime/index.ts +1 -0
  602. package/src/workflow-runtime/nodes/subworkflow.ts +60 -0
  603. package/src/workflow-runtime/plugin-kind-node.ts +1 -1
  604. package/src/workflow-runtime/schema.ts +79 -4
  605. package/src/workflow-runtime/types.ts +35 -4
  606. package/apps/pwa/out/_next/static/bFI5EEwg7T6aG88ibX4Zq/_buildManifest.js +0 -1
  607. package/apps/pwa/out/_next/static/chunks/1105-c473ed46272fba79.js +0 -1
  608. package/apps/pwa/out/_next/static/chunks/1201-09613bce624467c0.js +0 -1
  609. package/apps/pwa/out/_next/static/chunks/1377-1efeffbbac0963ff.js +0 -1
  610. package/apps/pwa/out/_next/static/chunks/1470.98a6ab61ccb4131c.js +0 -1
  611. package/apps/pwa/out/_next/static/chunks/216-5acd01cbde4acda7.js +0 -1
  612. package/apps/pwa/out/_next/static/chunks/2330-c2f07246c8788af1.js +0 -1
  613. package/apps/pwa/out/_next/static/chunks/2375-cb6debea56cce4fb.js +0 -1
  614. package/apps/pwa/out/_next/static/chunks/2929-617f1e66a55be184.js +0 -1
  615. package/apps/pwa/out/_next/static/chunks/2977-e38442e86289f1d3.js +0 -1
  616. package/apps/pwa/out/_next/static/chunks/2982-2a2df543be3d2e5a.js +0 -25
  617. package/apps/pwa/out/_next/static/chunks/3403.4bc97b4066945a94.js +0 -5
  618. package/apps/pwa/out/_next/static/chunks/3441-a1dd4acfeda14488.js +0 -1
  619. package/apps/pwa/out/_next/static/chunks/371-4ad6af55dad02ced.js +0 -1
  620. package/apps/pwa/out/_next/static/chunks/4114-3e63117452378807.js +0 -1
  621. package/apps/pwa/out/_next/static/chunks/5080-1613752891fcadb4.js +0 -10
  622. package/apps/pwa/out/_next/static/chunks/5609-012bb3557211f07e.js +0 -1
  623. package/apps/pwa/out/_next/static/chunks/5791-bb82743fa6299562.js +0 -1
  624. package/apps/pwa/out/_next/static/chunks/6090-85a3f05f954e5697.js +0 -1
  625. package/apps/pwa/out/_next/static/chunks/6284-69db415193d5f8bd.js +0 -1
  626. package/apps/pwa/out/_next/static/chunks/6320-baac91d68843a9a6.js +0 -1
  627. package/apps/pwa/out/_next/static/chunks/6416-505ba707cacafbba.js +0 -1
  628. package/apps/pwa/out/_next/static/chunks/6725-68ab7cc0b1faf00d.js +0 -1
  629. package/apps/pwa/out/_next/static/chunks/6998-a654fe5c58271600.js +0 -1
  630. package/apps/pwa/out/_next/static/chunks/7032-f4ef698518fba61c.js +0 -1
  631. package/apps/pwa/out/_next/static/chunks/7647.2fcd30d894d5ee30.js +0 -1
  632. package/apps/pwa/out/_next/static/chunks/7673-2eda1507d38dadb8.js +0 -1
  633. package/apps/pwa/out/_next/static/chunks/7990-e12efba616f46e03.js +0 -1
  634. package/apps/pwa/out/_next/static/chunks/8067-d976b441a104ab74.js +0 -1
  635. package/apps/pwa/out/_next/static/chunks/8142-744998d65d7bb17e.js +0 -1
  636. package/apps/pwa/out/_next/static/chunks/8519-5632377cce994f86.js +0 -1
  637. package/apps/pwa/out/_next/static/chunks/8619-4365e03a2862830f.js +0 -1
  638. package/apps/pwa/out/_next/static/chunks/8630-cdfc61e82c653ffc.js +0 -1
  639. package/apps/pwa/out/_next/static/chunks/8894-e263b332208e3957.js +0 -1
  640. package/apps/pwa/out/_next/static/chunks/920-f7dceb78f1c585ef.js +0 -1
  641. package/apps/pwa/out/_next/static/chunks/9454-139040d37c79dbc9.js +0 -1
  642. package/apps/pwa/out/_next/static/chunks/9651-3cd291a6fa1370d2.js +0 -1
  643. package/apps/pwa/out/_next/static/chunks/9740-8f5ff96c522b5f55.js +0 -1
  644. package/apps/pwa/out/_next/static/chunks/ae787e4c-f2998de7f1ba72a4.js +0 -1
  645. package/apps/pwa/out/_next/static/chunks/app/_not-found/page-859cea1570b6227a.js +0 -1
  646. package/apps/pwa/out/_next/static/chunks/app/approvals/page-fb7c2d458f32fcad.js +0 -1
  647. package/apps/pwa/out/_next/static/chunks/app/autopilot/page-35e2713597dd24d1.js +0 -1
  648. package/apps/pwa/out/_next/static/chunks/app/board/page-918b656f064577ba.js +0 -1
  649. package/apps/pwa/out/_next/static/chunks/app/bots/page-5f30e00693527ebd.js +0 -1
  650. package/apps/pwa/out/_next/static/chunks/app/chat/page-7fbae173b3c103a7.js +0 -1
  651. package/apps/pwa/out/_next/static/chunks/app/consult/page-3b4edcce364062ea.js +0 -1
  652. package/apps/pwa/out/_next/static/chunks/app/control/page-c5794f484c251f44.js +0 -1
  653. package/apps/pwa/out/_next/static/chunks/app/design-check/page-1130d8eefcd87e76.js +0 -1
  654. package/apps/pwa/out/_next/static/chunks/app/editor/page-973996d584f008c1.js +0 -1
  655. package/apps/pwa/out/_next/static/chunks/app/exec/page-016e2bda04eecb1f.js +0 -1
  656. package/apps/pwa/out/_next/static/chunks/app/field/page-b4d6d9a3b56f2940.js +0 -1
  657. package/apps/pwa/out/_next/static/chunks/app/healthz/route-859cea1570b6227a.js +0 -1
  658. package/apps/pwa/out/_next/static/chunks/app/intake/page-ec49a466121233ba.js +0 -1
  659. package/apps/pwa/out/_next/static/chunks/app/layout-f72db356744ceade.js +0 -1
  660. package/apps/pwa/out/_next/static/chunks/app/live/page-a6fd9b50d1b85378.js +0 -1
  661. package/apps/pwa/out/_next/static/chunks/app/market/page-8b0402a46a749a3d.js +0 -1
  662. package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-037f83e2a1edc8e2.js +0 -1
  663. package/apps/pwa/out/_next/static/chunks/app/not-found-46fedff57d4bec67.js +0 -1
  664. package/apps/pwa/out/_next/static/chunks/app/observatory/page-0cf318e9dcee2bbf.js +0 -1
  665. package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-899b327cb8b6845c.js +0 -1
  666. package/apps/pwa/out/_next/static/chunks/app/ops/release/page-6c1e6ba743a29dfe.js +0 -1
  667. package/apps/pwa/out/_next/static/chunks/app/page-1a8e4807292f6b17.js +0 -1
  668. package/apps/pwa/out/_next/static/chunks/app/reflection/page-28deba6bcb834916.js +0 -1
  669. package/apps/pwa/out/_next/static/chunks/app/scheduler/page-de68e2205794037d.js +0 -1
  670. package/apps/pwa/out/_next/static/chunks/app/sessions/page-c71c33a573230672.js +0 -1
  671. package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-0df30e0c7e50148a.js +0 -1
  672. package/apps/pwa/out/_next/static/chunks/app/settings/page-4fc56790fe0d2682.js +0 -1
  673. package/apps/pwa/out/_next/static/chunks/app/setup/done/page-59df2aebb38a7c1e.js +0 -1
  674. package/apps/pwa/out/_next/static/chunks/app/setup/layout-859cea1570b6227a.js +0 -1
  675. package/apps/pwa/out/_next/static/chunks/app/setup/page-4647be5dbcbd0795.js +0 -1
  676. package/apps/pwa/out/_next/static/chunks/app/share/page-e025892bda74b743.js +0 -1
  677. package/apps/pwa/out/_next/static/chunks/app/showroom/page-a0955de73b89f078.js +0 -1
  678. package/apps/pwa/out/_next/static/chunks/app/tasks/page-369846d2921af584.js +0 -1
  679. package/apps/pwa/out/_next/static/chunks/app/term/page-72cbc1c8cdd0f65d.js +0 -1
  680. package/apps/pwa/out/_next/static/chunks/app/trace/page-77b28bfb0996d5ea.js +0 -1
  681. package/apps/pwa/out/_next/static/chunks/app/vault/page-3220c4934f49c6c2.js +0 -1
  682. package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-90670589b87abea8.js +0 -1
  683. package/apps/pwa/out/_next/static/chunks/app/workflows/page-7df9243ed021a4cc.js +0 -1
  684. package/apps/pwa/out/_next/static/chunks/app/workspace/page-4498c3853f4f688d.js +0 -1
  685. package/apps/pwa/out/_next/static/chunks/app/worktrees/page-35bedde6d885f08f.js +0 -1
  686. package/apps/pwa/out/_next/static/chunks/framework-ea806bb57f2b8923.js +0 -1
  687. package/apps/pwa/out/_next/static/chunks/main-8d2302399c2c8f87.js +0 -1
  688. package/apps/pwa/out/_next/static/chunks/main-app-6870f30ea99f8346.js +0 -1
  689. package/apps/pwa/out/_next/static/chunks/pages/_app-b10928c60f0b8488.js +0 -1
  690. package/apps/pwa/out/_next/static/chunks/pages/_error-689039227d443fab.js +0 -1
  691. package/apps/pwa/out/_next/static/chunks/webpack-e5bea36f183b25e6.js +0 -1
  692. package/apps/pwa/out/_next/static/css/f92f63a5df0ba229.css +0 -1
  693. package/src/dashboard/turn-typeahead-echo.ts +0 -23
  694. /package/apps/pwa/out/_next/static/{bFI5EEwg7T6aG88ibX4Zq → Y4zKzL62sakG5momz3SoQ}/_ssgManifest.js +0 -0
@@ -19,6 +19,9 @@ import { setInProcessOutbound } from '../../domains/outbound-alert.js';
19
19
  import { getUserConfig } from '../../user-config.js';
20
20
  import type { TelegramEvent } from '../../workflow-runtime/triggers/telegram-source.js';
21
21
  import { spawnSync } from 'node:child_process';
22
+ import { isAbsolute } from 'node:path';
23
+ import { createProject, listProjects } from '../../project/project-store.js';
24
+ import { handleOutputsGet, type OutputsDeps } from './outputs-route.js';
22
25
  import { compareTokenConstTime } from '../../acp/transport/auth.js';
23
26
  import { ensureAuthToken } from '../../auth/acp-token.js';
24
27
  import type { NexusState } from '../state/state.js';
@@ -40,6 +43,7 @@ import { OPENAI_RELAY_PATH, tryHandleOpenAiRelay } from './openai-relay.js';
40
43
  import { handleHealth, type HealthSetupContext } from './health.js';
41
44
  import { handleTabsList, handleTabDetail, handleNexusSnapshot } from './tabs.js';
42
45
  import { handleSseEvents } from './events.js';
46
+ import { handleInsideEvents, INSIDE_EVENTS_PATH, startInsideEventRelay } from './inside-events.js';
43
47
  import { dispatchIntentPredictionRoute } from './intent-prediction.js';
44
48
  import { handleNotificationAction } from './notification-action.js';
45
49
  import { handleUserIntentEmit, handleUserIntentBatch } from './user-intents.js';
@@ -134,6 +138,7 @@ import {
134
138
  type ReflectionRouteOpts,
135
139
  } from './reflection.js';
136
140
  import { handleSignalBoard } from './signal-board-api.js';
141
+ import { handleUsageGet } from './usage-api.js';
137
142
  import {
138
143
  handleDashboard,
139
144
  handleDashboardRefreshLive,
@@ -154,6 +159,7 @@ import {
154
159
  } from './vault-api.js';
155
160
  import { handleBuildsGet, parseBuildsPath } from './builds-api.js';
156
161
  import { handleHarnessAskPost, handleHarnessAskStatusGet, handleHarnessRunEventsGet, handleHarnessRunScreenGet, handleHarnessRunsGet, handleHarnessStopPost } from './harness-api.js';
162
+ import { handleFabricPlans, type FabricPlansRouteOpts } from './fabric-plans.js';
157
163
  import { dispatchPersonaRoute } from './personas.js';
158
164
  import { handleMe } from './operator.js';
159
165
  import { handleOpsApi } from './ops-api.js';
@@ -163,6 +169,7 @@ import { handleLlmModels } from './llm-models.js';
163
169
  import { handleLlmHostsConfig } from './llm-hosts-config.js';
164
170
  import { handleLlmRotationGet, handleLlmRotationNext } from './llm-rotation.js';
165
171
  import { handleSetupClaim } from './setup-claim.js';
172
+ import { handleSetupCodexLoginGet, handleSetupCodexLoginPost } from './setup-codex-login.js';
166
173
  import {
167
174
  handleLlmProvidersList,
168
175
  handleLlmProviderSet,
@@ -174,6 +181,7 @@ import { handleChannelBotsGet, handleChannelBotSet } from './setup-channel-bot.j
174
181
  import { handleLlmRoutePredict } from './llm-route-predict.js';
175
182
  import type { MissionRouter } from '../../llm/mission-router.js';
176
183
  import { handleContextFetchUrl } from './context-url.js';
184
+ import { contextNow } from '../../context-bus/context-now.js';
177
185
  import type { IntentPredictionService } from '../../intent-prediction/index.js';
178
186
  import type { NotificationActionLoopback } from '../../web-push/notification-action-loopback.js';
179
187
  import { handlePlatforms } from './platforms.js';
@@ -278,7 +286,7 @@ import { handleSchedulesActionPost } from './schedules-action.js';
278
286
  import { handleSchedulesList, handleScheduleDetail, handleScheduleRuns } from './schedules-read.js';
279
287
  import { handleIntakeRunsList } from './intake-runs.js';
280
288
  import { handleMissionsList, handleMissionDetail } from './missions.js';
281
- import { handleSessionsStoreList, handleSessionsStoreGet, handleSessionsStoreFork, handleSessionsStoreDelete } from './sessions-store.js';
289
+ import { handleSessionsStoreList, handleSessionsStoreGet, handleSessionsStoreFork, handleSessionsStoreDelete, handleSessionsStorePatch } from './sessions-store.js';
282
290
  import { handleLogsQuery, handleLogsStream, handleLogsLevelGet, handleLogsLevelPost, handleLogsFacets, handleLogsHistogram, handleLogsInstances } from './log-fabric.js';
283
291
  import { handleTrace, handleTraceEvidence } from './trace.js';
284
292
  import { handleDispatchRunsList } from './dispatch-runs.js';
@@ -457,14 +465,19 @@ export function probeNexusHttpPort(
457
465
  export type NexusWsBridgeInit = Omit<WsBridgeOpts, 'hostname' | 'port'>;
458
466
 
459
467
  export interface NexusHttpServerOpts {
468
+ /** Optional fabric-plan ledger and decomposition seam; production uses the instance root and existing fabric decomposer. */
469
+ fabricPlans?: FabricPlansRouteOpts;
460
470
  /** Optional installer state root for isolated API consumers and tests. */
461
471
  pluginStateRoot?: string;
472
+ outputs?: OutputsDeps;
462
473
  execRequests?: ExecRequestRunner;
463
474
  seatRequests?: SeatRequestsDeps;
464
475
  consultRequests?: ConsultRequestsDeps;
465
476
  state: NexusState;
466
477
  registry: TabRegistry;
467
478
  eventBus: NexusEventBus;
479
+ /** Test seam for the read-only usage collector; production uses the cached handler. */
480
+ usageHandler?: () => Promise<Response>;
468
481
  /** Supervisor handle — required for the write API (PR ι). When omitted
469
482
  * (skipSupervisor mode), mutation routes return 503. */
470
483
  supervisor?: Supervisor;
@@ -784,17 +797,40 @@ export function startNexusHttpServer(opts: NexusHttpServerOpts): NexusHttpServer
784
797
  }
785
798
 
786
799
  const url = `http://${hostname}:${resolvedPort}`;
800
+ const stopInsideRelay = startInsideEventRelay();
787
801
  return {
788
802
  port: resolvedPort,
789
803
  hostname,
790
804
  url,
791
805
  stop() {
806
+ stopInsideRelay();
792
807
  try { server!.stop(true); } catch { /* idempotent */ }
793
808
  setInProcessOutbound(null);
794
809
  },
795
810
  };
796
811
  }
797
812
 
813
+ export function handleProjectsGet(): Response {
814
+ return jsonResponse({ projects: listProjects() });
815
+ }
816
+
817
+ export async function handleProjectsPost(req: Request): Promise<Response> {
818
+ let body: unknown;
819
+ try { body = await req.json(); }
820
+ catch { return jsonResponse({ error: 'invalid_json' }, 400); }
821
+ if (!body || typeof body !== 'object' || Array.isArray(body)) {
822
+ return jsonResponse({ error: 'invalid_name' }, 400);
823
+ }
824
+ const { name, primaryFolder } = body as Record<string, unknown>;
825
+ if (typeof name !== 'string' || !name.trim() || name.length > 80) {
826
+ return jsonResponse({ error: 'invalid_name' }, 400);
827
+ }
828
+ if (primaryFolder !== undefined && (typeof primaryFolder !== 'string' || !isAbsolute(primaryFolder))) {
829
+ return jsonResponse({ error: 'invalid_primary_folder' }, 400);
830
+ }
831
+ return jsonResponse({ project: createProject({ name, ...(primaryFolder !== undefined ? { primaryFolder } : {}) }) }, 201);
832
+ }
833
+
798
834
  function isPortBusy(err: unknown): boolean {
799
835
  if (!err) return false;
800
836
  // Bun.serve errors expose `.code === 'EADDRINUSE'` (Node-compatible)
@@ -957,6 +993,11 @@ export async function routeRequest(
957
993
  }
958
994
  }
959
995
 
996
+ if (pathname === INSIDE_EVENTS_PATH) {
997
+ if (!opts.metaApi || !checkAuth(req, opts.metaApi)) return jsonResponse({ error: 'unauthorized' }, 401);
998
+ return handleInsideEvents(req);
999
+ }
1000
+
960
1001
  if (pathname === LIVE_SHIPPED_PATH) {
961
1002
  return handleLiveShipped(req, { authorize: (request) => !!opts.metaApi && checkAuth(request, opts.metaApi) });
962
1003
  }
@@ -1285,11 +1326,40 @@ export async function routeRequest(
1285
1326
  return handleGraphsValidatePost(req, opts.metaApi);
1286
1327
  }
1287
1328
 
1329
+ if (pathname === '/v1/fabric/decompose' || pathname.startsWith('/v1/fabric/plans/')) {
1330
+ if (!opts.metaApi || !checkAuth(req, opts.metaApi)) return jsonResponse({ error: 'unauthorized' }, 401);
1331
+ return handleFabricPlans(req, opts.fabricPlans);
1332
+ }
1333
+
1334
+ if (pathname === '/v1/projects' && (method === 'GET' || method === 'POST')) {
1335
+ if (!opts.metaApi || !checkAuth(req, opts.metaApi)) return jsonResponse({ error: 'unauthorized' }, 401);
1336
+ return method === 'GET' ? handleProjectsGet() : handleProjectsPost(req);
1337
+ }
1338
+
1339
+ if (method === 'GET' && pathname === '/v1/outputs') {
1340
+ if (!opts.metaApi || !checkAuth(req, opts.metaApi)) return jsonResponse({ error: 'unauthorized' }, 401);
1341
+ return handleOutputsGet(req, opts.outputs);
1342
+ }
1343
+
1288
1344
  if (pathname === '/v1/config/chat-fast-path' && (method === 'GET' || method === 'PUT')) {
1289
1345
  if (!opts.metaApi || !checkAuth(req, opts.metaApi)) return jsonResponse({ error: 'unauthorized' }, 401);
1290
1346
  return handleChatFastPathConfig(req);
1291
1347
  }
1292
1348
 
1349
+ if (pathname === '/v1/usage') {
1350
+ if (!opts.metaApi || !checkAuth(req, opts.metaApi)) return jsonResponse({ error: 'unauthorized' }, 401);
1351
+ if (method !== 'GET') return jsonResponse({ error: 'method-not-allowed' }, 405);
1352
+ return (opts.usageHandler ?? handleUsageGet)();
1353
+ }
1354
+
1355
+ // SK2 (PWA) list — GET must be routed before the non-GET block below; the original route sat inside it,
1356
+ // so the PWA banner's GET always fell through to «not-found» (found by the DEMO-RUNa rehearsal · 10-03).
1357
+ if (method === 'GET' && pathname === '/v1/skills/problems') {
1358
+ if (!opts.metaApi) return jsonResponse({ error: 'meta-api-not-wired' }, 503);
1359
+ const { handleSkillProblems } = await import('./skill-problems.js');
1360
+ return handleSkillProblems(req, opts.metaApi);
1361
+ }
1362
+
1293
1363
  // Mutation routes (PR ι) — POST/PATCH/DELETE on /v1/nexus/tabs[/:id[/action]].
1294
1364
  // Templates POST handled here too (PR κ).
1295
1365
  // Config / secrets PUT/POST/DELETE here too (PR μ).
@@ -1540,6 +1610,11 @@ export async function routeRequest(
1540
1610
  // PWA `/setup` wizard Phase 1 (2026-05-19) — LLM provider 첫 셋업.
1541
1611
  // POST 는 mutation 블록 안에서 등록 (memory `feedback_post_route_must_be_in_method_block`).
1542
1612
  // GET sibling 은 아래 GET-only 블록에 등록.
1613
+ if (pathname === '/v1/setup/codex-login' && (method === 'POST' || method === 'OPTIONS')) {
1614
+ if (method === 'OPTIONS') return corsPreflight('GET, POST, OPTIONS');
1615
+ if (!opts.metaApi || !checkAuth(req, opts.metaApi)) return jsonResponse({ error: 'unauthorized' }, 401);
1616
+ return handleSetupCodexLoginPost(req);
1617
+ }
1543
1618
  if (pathname === '/v1/setup/llm-provider' && (method === 'POST' || method === 'OPTIONS')) {
1544
1619
  if (method === 'POST') { if (!opts.metaApi || !checkAuth(req, opts.metaApi)) return jsonResponse({ error: 'unauthorized' }, 401); }
1545
1620
  return handleLlmProviderSet(req);
@@ -1904,6 +1979,11 @@ export async function routeRequest(
1904
1979
  const id = decodeURIComponent(pathname.slice('/v1/sessions/store/'.length, -'/fork'.length));
1905
1980
  return handleSessionsStoreFork(req, id, opts.metaApi);
1906
1981
  }
1982
+ if (pathname.startsWith('/v1/sessions/store/') && !pathname.endsWith('/fork') && method === 'PATCH') {
1983
+ if (!opts.metaApi) return jsonResponse({ error: 'unauthorized' }, 401);
1984
+ const id = decodeURIComponent(pathname.slice('/v1/sessions/store/'.length));
1985
+ return handleSessionsStorePatch(req, id, opts.metaApi);
1986
+ }
1907
1987
  // on-disk 세션 삭제(파괴적) — 라이브 세션 관리. /store/:id (fork/transcript 와 구분).
1908
1988
  if (pathname.startsWith('/v1/sessions/store/') && !pathname.endsWith('/fork') && method === 'DELETE') {
1909
1989
  if (!opts.metaApi) return jsonResponse({ error: 'meta-api-runtime-not-wired' }, 503);
@@ -2425,6 +2505,10 @@ export async function routeRequest(
2425
2505
  }
2426
2506
  // PWA `/setup` wizard Phase 1 (2026-05-19) — provider catalog 표시.
2427
2507
  // POST sibling (`/v1/setup/llm-provider`) 는 위 mutation 블록.
2508
+ if (pathname === '/v1/setup/codex-login') {
2509
+ if (!opts.metaApi || !checkAuth(req, opts.metaApi)) return jsonResponse({ error: 'unauthorized' }, 401);
2510
+ return handleSetupCodexLoginGet();
2511
+ }
2428
2512
  if (pathname === '/v1/setup/llm-providers') {
2429
2513
  return handleLlmProvidersList(req);
2430
2514
  }
@@ -2723,6 +2807,10 @@ export async function routeRequest(
2723
2807
  const result = await dispatchPersonaRoute(req, pathname);
2724
2808
  if (result) return result;
2725
2809
  }
2810
+ if (pathname === '/v1/context/now') {
2811
+ if (!opts.metaApi || !checkAuth(req, opts.metaApi)) return jsonResponse({ error: 'unauthorized' }, 401);
2812
+ return jsonResponse(contextNow({ ...(url.searchParams.has('topic') ? { topic: url.searchParams.get('topic') ?? '' } : {}) }));
2813
+ }
2726
2814
  // §6.3 (2026-05-09) — context URL fetch (showroom).
2727
2815
  // POST /v1/context/fetch-url
2728
2816
  if (pathname === '/v1/context/fetch-url') {
@@ -0,0 +1,226 @@
1
+ import { randomUUID } from 'node:crypto';
2
+ import { appendFileSync, existsSync, mkdirSync, openSync, closeSync, readSync, readFileSync, statSync, unlinkSync, writeFileSync } from 'node:fs';
3
+ import { join } from 'node:path';
4
+ import { StringDecoder } from 'node:string_decoder';
5
+ import { debug } from '../../debug/log.js';
6
+ import { nexusRootDir } from '../paths.js';
7
+ import { SSE_HEARTBEAT_MS } from './sse-heartbeat.js';
8
+
9
+ /** The node envelope matches apps/pwa/src/lib/inside-events.ts without importing browser code. */
10
+ export interface InsideNodeEvent {
11
+ kind: 'node';
12
+ graphId: string;
13
+ runId: string;
14
+ nodeId: string;
15
+ phase: 'start' | 'ok' | 'fail';
16
+ ts: string;
17
+ seconds?: number;
18
+ }
19
+
20
+ /** Other producers can add their own domain fields without changing the transport. */
21
+ export type InsideLiveEvent = InsideNodeEvent | ({ kind: string; ts: string } & Record<string, unknown>);
22
+ export type InsideEventInput = { kind: string; ts?: string } & Record<string, unknown>;
23
+
24
+ export const INSIDE_EVENTS_PATH = '/v1/inside/events';
25
+ const MAX_PENDING_FRAMES = 16;
26
+ const MAX_FRAME_BYTES = 64 * 1024;
27
+ const MASK = '[REDACTED]';
28
+ const SECRET_KEY = /(?:secret|password|passwd|token|api[_-]?key|authorization|credential|private[_-]?key|cookie|session[_-]?key)/i;
29
+ const INLINE_SECRET = /\b((?:Bearer|Basic)\s+|(?:sk|ghp|gho|ghu|ghs|ghr|github_pat|glpat|xox[baprs])[-_])[^\s"'`,;]+/gi;
30
+ const ASSIGNMENT_SECRET = /\b((?:api[_-]?key|(?:access[_-]?)?token|secret|password|authorization)\s*[:=]\s*)(?:(["'])[^\r\n]*?\2|[^\s"'`,;]+)/gi;
31
+
32
+ function maskString(value: string): string {
33
+ return value.replace(INLINE_SECRET, `$1${MASK}`)
34
+ .replace(ASSIGNMENT_SECRET, (_match, prefix: string, quote?: string) => `${prefix}${quote ?? ''}${MASK}${quote ?? ''}`);
35
+ }
36
+
37
+ /** Sanitize before fan-out; never put an unmasked payload in the subscriber queue. */
38
+ export function maskInsideEventValue(value: unknown, seen = new WeakSet<object>()): unknown {
39
+ if (typeof value === 'string') return maskString(value);
40
+ if (!value || typeof value !== 'object') return value;
41
+ if (seen.has(value)) return MASK;
42
+ seen.add(value);
43
+ if (Array.isArray(value)) {
44
+ const result = value.map((item) => maskInsideEventValue(item, seen));
45
+ seen.delete(value);
46
+ return result;
47
+ }
48
+ const result: Record<string, unknown> = {};
49
+ for (const [key, item] of Object.entries(value)) {
50
+ result[key] = SECRET_KEY.test(key) ? MASK : maskInsideEventValue(item, seen);
51
+ }
52
+ seen.delete(value);
53
+ return result;
54
+ }
55
+
56
+ type Listener = (event: InsideLiveEvent) => void;
57
+ const listeners = new Set<Listener>();
58
+ const RELAY_INTERVAL_MS = 20;
59
+ const RELAY_MAX_RECORD_BYTES = 64 * 1024;
60
+ const RELAY_ROTATE_BYTES = 4 * 1024 * 1024;
61
+ const RELAY_RETIRE_GRACE_MS = 2000;
62
+ const relayIdentity = randomUUID();
63
+
64
+ function relayPaths() {
65
+ const root = nexusRootDir();
66
+ return { root, pointer: join(root, 'inside-events-relay.json') };
67
+ }
68
+
69
+ function dispatch(event: InsideLiveEvent): void {
70
+ for (const listener of listeners) {
71
+ try { listener(event); } catch { /* a disconnected observer must not stop a run */ }
72
+ }
73
+ }
74
+
75
+ /** Each daemon owns its journal; child processes append masked records to that journal.
76
+ * The journal rotates once fully consumed past RELAY_ROTATE_BYTES: the pointer moves to a fresh file and the old one is
77
+ * drained for a grace period (producers that read the old pointer may still append) before it is removed. */
78
+ export function startInsideEventRelay(opts: { rotateBytes?: number; retireGraceMs?: number } = {}): () => void {
79
+ const { root, pointer } = relayPaths();
80
+ mkdirSync(root, { recursive: true });
81
+ const rotateBytes = opts.rotateBytes ?? RELAY_ROTATE_BYTES;
82
+ const retireGraceMs = opts.retireGraceMs ?? RELAY_RETIRE_GRACE_MS;
83
+ type Journal = { file: string; offset: number; pending: string; decoder: StringDecoder; retireAt?: number };
84
+ const journals: Journal[] = [];
85
+ let descriptor = '';
86
+ const open = (): Journal => {
87
+ const id = randomUUID();
88
+ const file = join(root, `inside-events-${id}.jsonl`);
89
+ writeFileSync(file, '', { mode: 0o600, flag: 'wx' });
90
+ descriptor = JSON.stringify({ pid: process.pid, id });
91
+ writeFileSync(pointer, descriptor, { mode: 0o600 });
92
+ const journal: Journal = { file, offset: 0, pending: '', decoder: new StringDecoder('utf8') };
93
+ journals.push(journal);
94
+ return journal;
95
+ };
96
+ let current = open();
97
+ const drain = (journal: Journal): void => {
98
+ const size = statSync(journal.file).size;
99
+ if (size < journal.offset) { journal.offset = 0; journal.pending = ''; journal.decoder = new StringDecoder('utf8'); }
100
+ while (size > journal.offset) {
101
+ const count = Math.min(size - journal.offset, 1024 * 1024);
102
+ const chunk = Buffer.alloc(count);
103
+ const fd = openSync(journal.file, 'r');
104
+ let length: number;
105
+ try { length = readSync(fd, chunk, 0, count, journal.offset); }
106
+ finally { closeSync(fd); }
107
+ if (length <= 0) break;
108
+ journal.offset += length;
109
+ // A chunk boundary may split a multi-byte character; the decoder carries the partial bytes into the next read.
110
+ journal.pending += journal.decoder.write(chunk.subarray(0, length));
111
+ const lines = journal.pending.split('\n');
112
+ journal.pending = lines.pop() ?? '';
113
+ if (journal.pending.length > RELAY_MAX_RECORD_BYTES) journal.pending = '';
114
+ for (const line of lines) {
115
+ if (line.length > RELAY_MAX_RECORD_BYTES) continue;
116
+ try {
117
+ const record = JSON.parse(line) as { origin?: string; event?: InsideEventInput };
118
+ if (record.origin === relayIdentity || !record.event || typeof record.event.kind !== 'string'
119
+ || !/^[a-z][a-z0-9._-]*$/i.test(record.event.kind)) continue;
120
+ dispatch(maskInsideEventValue(record.event) as InsideLiveEvent);
121
+ } catch { /* malformed producer record */ }
122
+ }
123
+ }
124
+ };
125
+ const remove = (journal: Journal): void => {
126
+ try { unlinkSync(journal.file); } catch { /* already removed */ }
127
+ journals.splice(journals.indexOf(journal), 1);
128
+ };
129
+ const timer = setInterval(() => {
130
+ for (const journal of [...journals]) {
131
+ try { drain(journal); } catch { /* journal disappeared during shutdown */ }
132
+ if (journal.retireAt !== undefined && Date.now() >= journal.retireAt && journal.pending === '') remove(journal);
133
+ }
134
+ if (current.offset >= rotateBytes && current.pending === '') {
135
+ try {
136
+ current.retireAt = Date.now() + retireGraceMs;
137
+ current = open();
138
+ debug.log('inside.events', 'relay-rotated', { journals: journals.length });
139
+ } catch { /* keep appending to the current journal */ }
140
+ }
141
+ }, RELAY_INTERVAL_MS);
142
+ timer.unref();
143
+ return () => {
144
+ clearInterval(timer);
145
+ try { if (readFileSync(pointer, 'utf8') === descriptor) unlinkSync(pointer); } catch { /* another daemon owns it */ }
146
+ for (const journal of [...journals]) remove(journal);
147
+ };
148
+ }
149
+
150
+ /** Ordered local delivery plus best-effort cross-process delivery to the current daemon. */
151
+ export function publishInsideEvent(event: InsideEventInput): void {
152
+ if (!event || typeof event.kind !== 'string' || !/^[a-z][a-z0-9._-]*$/i.test(event.kind)) return;
153
+ const safe = maskInsideEventValue({ ...event, ts: event.ts ?? new Date().toISOString() }) as InsideLiveEvent;
154
+ dispatch(safe);
155
+ try {
156
+ const { root, pointer } = relayPaths();
157
+ if (!existsSync(pointer)) return;
158
+ const descriptor = JSON.parse(readFileSync(pointer, 'utf8')) as { pid?: number; id?: string };
159
+ if (!Number.isSafeInteger(descriptor.pid) || typeof descriptor.id !== 'string' || !/^[a-f0-9-]{36}$/.test(descriptor.id)) return;
160
+ process.kill(descriptor.pid!, 0);
161
+ const file = join(root, `inside-events-${descriptor.id}.jsonl`);
162
+ const line = JSON.stringify({ origin: relayIdentity, event: safe }) + '\n';
163
+ if (Buffer.byteLength(line) > RELAY_MAX_RECORD_BYTES) return;
164
+ appendFileSync(file, line, { mode: 0o600, flag: 'a' });
165
+ } catch { /* a missing daemon must not interrupt the producer */ }
166
+ }
167
+
168
+ export function subscribeInsideEvent(listener: Listener): () => void {
169
+ listeners.add(listener);
170
+ return () => { listeners.delete(listener); };
171
+ }
172
+
173
+ /** No history/replay: the stream starts at the moment a client subscribes. */
174
+ export function handleInsideEvents(req: Request): Response {
175
+ if (req.method !== 'GET') return new Response(null, { status: 405, headers: { allow: 'GET' } });
176
+ const encoder = new TextEncoder();
177
+ let cleanup: (() => void) | undefined;
178
+ const stream = new ReadableStream<Uint8Array>({
179
+ start(controller) {
180
+ let closed = false;
181
+ let unsubscribe = () => {};
182
+ let heartbeat: ReturnType<typeof setInterval> | undefined;
183
+ const onAbort = () => close();
184
+ cleanup = () => {
185
+ if (closed) return;
186
+ closed = true;
187
+ if (heartbeat !== undefined) clearInterval(heartbeat);
188
+ unsubscribe();
189
+ req.signal.removeEventListener('abort', onAbort);
190
+ };
191
+ const close = () => {
192
+ cleanup?.();
193
+ try { controller.close(); } catch { /* cancelled already */ }
194
+ };
195
+ const send = (text: string): void => {
196
+ if (closed) return;
197
+ const bytes = encoder.encode(text);
198
+ if (bytes.byteLength > MAX_FRAME_BYTES || (controller.desiredSize ?? 0) <= 0) {
199
+ close();
200
+ return;
201
+ }
202
+ try { controller.enqueue(bytes); } catch { close(); }
203
+ };
204
+ if (req.signal.aborted) {
205
+ close();
206
+ return;
207
+ }
208
+ unsubscribe = subscribeInsideEvent((event) => {
209
+ send(`event: ${event.kind}\ndata: ${JSON.stringify(event)}\n\n`);
210
+ });
211
+ heartbeat = setInterval(() => send(': ping\n\n'), SSE_HEARTBEAT_MS);
212
+ req.signal.addEventListener('abort', onAbort, { once: true });
213
+ if (req.signal.aborted) close();
214
+ else send(': inside events stream\n\n');
215
+ },
216
+ cancel() { cleanup?.(); },
217
+ }, { highWaterMark: MAX_PENDING_FRAMES, size: () => 1 });
218
+ return new Response(stream, {
219
+ headers: {
220
+ 'content-type': 'text/event-stream; charset=utf-8',
221
+ 'cache-control': 'no-cache, no-transform',
222
+ 'x-accel-buffering': 'no',
223
+ connection: 'keep-alive',
224
+ },
225
+ });
226
+ }
@@ -81,6 +81,7 @@ import { createPwaConfirmChannel, createPwaQuestionChannel } from './hitl-pwa-ch
81
81
  import type { NexusEventBus } from './event-bus.js';
82
82
  import { jsonResponse } from './http-server.js';
83
83
  import { defaultChatEventBus } from './chat-event-bus.js';
84
+ import { resolveSessionProjectContext } from '../../project/session-context.js';
84
85
 
85
86
  const MIME_BY_EXT: Record<string, string> = {
86
87
  '.png': 'image/png',
@@ -147,6 +148,10 @@ export interface MetaApiOpts {
147
148
  * compared constant-time against the `Authorization: Bearer …`
148
149
  * header. */
149
150
  bearerToken?: string;
151
+ /** Server-side human identity verification, independent of the shared bearer credential.
152
+ * Never derive this result from request body, claimed source, or bearer possession alone.
153
+ * Without a verifier, prompt tool mutations remain unavailable. */
154
+ resolveVerifiedOwner?: (req: Request) => { id: string } | undefined;
150
155
  /** Convenience for Tailscale-only / dogfood-loopback mode. */
151
156
  noAuth?: boolean;
152
157
  // ── PR k · runtime DI for the lifted endpoints ─────────────────
@@ -788,19 +793,29 @@ function notFound(payload: Record<string, unknown> = {}): Response {
788
793
 
789
794
  // ── /v1/prompt ────────────────────────────────────────────────────
790
795
 
796
+ export function promptVerifiedOwner(req: Request, opts: MetaApiOpts): { id: string } | undefined {
797
+ const owner = opts.resolveVerifiedOwner?.(req);
798
+ return typeof owner?.id === 'string' && owner.id.trim() ? { id: owner.id.trim() } : undefined;
799
+ }
800
+
791
801
  export async function handlePromptPost(
792
802
  req: Request,
793
803
  opts: MetaApiOpts,
794
804
  ): Promise<Response> {
795
805
  if (!checkAuth(req, opts)) return authFailureResponse(req, opts);
796
806
  if (!opts.history) return jsonResponse({ error: RUNTIME_NOT_WIRED }, 503);
797
- let body: DaemonPromptBody;
807
+ let rawBody: unknown;
798
808
  try {
799
- body = (await req.json()) as DaemonPromptBody;
809
+ rawBody = await req.json();
800
810
  } catch {
801
811
  return badRequest('invalid JSON body');
802
812
  }
803
- const parsed = parseDaemonPromptBody(body, opts.systemPrompt);
813
+ if (!rawBody || typeof rawBody !== 'object' || Array.isArray(rawBody)) {
814
+ return badRequest('userText or userContent required');
815
+ }
816
+ const body = rawBody as DaemonPromptBody;
817
+ const projectContext = resolveSessionProjectContext(typeof body.sessionId === 'string' ? body.sessionId : undefined);
818
+ const parsed = parseDaemonPromptBody(body, projectContext?.instructions ? [opts.systemPrompt, projectContext.instructions].filter(Boolean).join('\n\n') : opts.systemPrompt);
804
819
  if (!parsed.ok) return badRequest(parsed.reason);
805
820
  const submit = createDaemonPromptTurnSubmit({
806
821
  kind: 'submit-turn',
@@ -831,9 +846,11 @@ export async function handlePromptPost(
831
846
  surface: surfaceResolution.surface,
832
847
  surfaceResolutionReason: surfaceResolution.reason,
833
848
  ...(parsed.value.userContent ? { promptBlocks: parsed.value.userContent } : {}),
849
+ ...((owner) => owner ? { verifiedOwner: owner } : {})(promptVerifiedOwner(req, opts)),
834
850
  ...(resolvePromptHitlChannels(typeof body.sessionId === 'string' ? body.sessionId : '', opts) ?? {}),
835
851
  ...(effectiveSurface ? { toolSurface: effectiveSurface } : {}),
836
- ...(opts.toolCwd ? { toolCwd: opts.toolCwd } : {}),
852
+ ...(projectContext?.cwd || opts.toolCwd ? { toolCwd: projectContext?.cwd ?? opts.toolCwd } : {}),
853
+ ...(projectContext?.instructions ? { projectInstructions: projectContext.instructions } : {}),
837
854
  dispatchToolErrorMessage: 'NEXUS prompt runtime has no tool surface (start nexus with `--tools readonly|webterm`)',
838
855
  });
839
856
  },
@@ -920,13 +937,18 @@ export async function handlePromptStreamPost(
920
937
  ): Promise<Response> {
921
938
  if (!checkAuth(req, opts)) return authFailureResponse(req, opts);
922
939
  if (!opts.history) return jsonResponse({ error: RUNTIME_NOT_WIRED }, 503);
923
- let body: DaemonPromptBody;
940
+ let rawBody: unknown;
924
941
  try {
925
- body = (await req.json()) as DaemonPromptBody;
942
+ rawBody = await req.json();
926
943
  } catch {
927
944
  return badRequest('invalid JSON body');
928
945
  }
929
- const parsed = parseDaemonPromptBody(body, opts.systemPrompt);
946
+ if (!rawBody || typeof rawBody !== 'object' || Array.isArray(rawBody)) {
947
+ return badRequest('userText or userContent required');
948
+ }
949
+ const body = rawBody as DaemonPromptBody;
950
+ const projectContext = resolveSessionProjectContext(typeof body.sessionId === 'string' ? body.sessionId : undefined);
951
+ const parsed = parseDaemonPromptBody(body, projectContext?.instructions ? [opts.systemPrompt, projectContext.instructions].filter(Boolean).join('\n\n') : opts.systemPrompt);
930
952
  if (!parsed.ok) return badRequest(parsed.reason);
931
953
  // M6 PR 1 (PLAN-rich-dev-feedback-multi-surface · 2026-05-13) — opt-in
932
954
  // debug-tap. PWA `/chat?debug-tap=on` propagates the query down to
@@ -1188,9 +1210,11 @@ export async function handlePromptStreamPost(
1188
1210
  surface: surfaceResolution.surface,
1189
1211
  surfaceResolutionReason: surfaceResolution.reason,
1190
1212
  ...(parsed.value.userContent ? { promptBlocks: parsed.value.userContent } : {}),
1213
+ ...((owner) => owner ? { verifiedOwner: owner } : {})(promptVerifiedOwner(req, opts)),
1191
1214
  ...(resolvePromptHitlChannels(typeof body.sessionId === 'string' ? body.sessionId : '', opts) ?? {}),
1192
1215
  ...(effectiveSurface ? { toolSurface: effectiveSurface } : {}),
1193
- ...(opts.toolCwd ? { toolCwd: opts.toolCwd } : {}),
1216
+ ...(projectContext?.cwd || opts.toolCwd ? { toolCwd: projectContext?.cwd ?? opts.toolCwd } : {}),
1217
+ ...(projectContext?.instructions ? { projectInstructions: projectContext.instructions } : {}),
1194
1218
  signal: turnAbortController.signal,
1195
1219
  onTextDelta: dualEmitTextDelta,
1196
1220
  onImageBlock: dualEmitImageBlock,
@@ -20,6 +20,7 @@
20
20
  * Query params (list):
21
21
  * status=<MissionStatus> filter by status (active / planning / ...)
22
22
  * goalSlug=<slug> filter by goal binding
23
+ * projectId=<id> filter by project association
23
24
  *
24
25
  * Cross-ref:
25
26
  * src/task-orchestrator/store.ts (listMissions · getMission ·
@@ -53,6 +54,7 @@ export interface MissionCardWire {
53
54
  status: MissionStatus;
54
55
  priority: Mission['priority'];
55
56
  goalSlug: string | null;
57
+ projectId?: string;
56
58
  taskCount: number;
57
59
  /** Counts so the PWA mission lane shows progress at a glance. */
58
60
  taskStatusCounts: Record<string, number>;
@@ -85,6 +87,7 @@ export function summarise(mission: Mission, tasks: readonly Task[]): MissionCard
85
87
  status: mission.status,
86
88
  priority: mission.priority,
87
89
  goalSlug: mission.goalSlug ?? null,
90
+ ...(mission.projectId !== undefined ? { projectId: mission.projectId } : {}),
88
91
  taskCount: tasks.length,
89
92
  taskStatusCounts,
90
93
  surfaceKindCounts,
@@ -103,9 +106,11 @@ export function handleMissionsList(
103
106
  const url = new URL(req.url);
104
107
  const statusParam = url.searchParams.get('status');
105
108
  const goalSlug = url.searchParams.get('goalSlug') ?? undefined;
106
- const filter: { status?: MissionStatus; goalSlug?: string } = {};
109
+ const projectId = url.searchParams.get('projectId') ?? undefined;
110
+ const filter: { status?: MissionStatus; goalSlug?: string; projectId?: string } = {};
107
111
  if (statusParam && isMissionStatus(statusParam)) filter.status = statusParam;
108
112
  if (goalSlug) filter.goalSlug = goalSlug;
113
+ if (projectId !== undefined) filter.projectId = projectId;
109
114
 
110
115
  const store = new TaskStore();
111
116
  try {
@@ -3,6 +3,7 @@ import { join } from 'node:path';
3
3
  import { debug, redactSecretText } from '../../debug/log.js';
4
4
  import { effectiveInstanceRoot } from '../../instance/resolve.js';
5
5
  import { listChecklist } from '../../release-loop/checklist.js';
6
+ import { getSchedule } from '../../release-loop/release-schedule.js';
6
7
  import { jsonResponse } from './json-response.js';
7
8
  import { operatorSignal } from './operator.js';
8
9
  import { createSeatsCache, todayKst } from './ops-seats.js';
@@ -90,7 +91,15 @@ export function handleOpsApi(req: Request, metaApi: MetaApiOpts | undefined): Re
90
91
  const version = url.searchParams.get('version');
91
92
  if (pathname === '/v1/ops/checklist') {
92
93
  if (!version || !VERSION.test(version)) return jsonResponse({ error: 'invalid-version' }, 400);
93
- return served(jsonResponse(listChecklist(version)));
94
+ // OPS2 header «컷 · 착지 마감»: the version's row in the release schedule (REL9a), or null when none is set.
95
+ let schedule: { cutAt: string; landBy: string | null } | null = null;
96
+ try {
97
+ const row = getSchedule(version);
98
+ schedule = row ? { cutAt: row.cutAt, landBy: row.landBy ?? null } : null;
99
+ } catch (error) {
100
+ debug.log('ops.api', 'schedule-unreadable', { version, reason: error instanceof Error ? error.message.slice(0, 80) : 'unknown' }, { level: 'warn' });
101
+ }
102
+ return served(jsonResponse({ ...listChecklist(version), schedule }));
94
103
  }
95
104
  if (pathname === '/v1/ops/release/runs') {
96
105
  if (version !== null && !VERSION.test(version)) return jsonResponse({ error: 'invalid-version' }, 400);