elanous 0.2.32 → 0.2.35

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 (753) 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/{IVKr3AlRUVLKsw2fh7eXF → T1mBQqmkwKDLGtyisDCOd}/_buildManifest.js +1 -1
  4. package/apps/pwa/out/_next/static/chunks/{997ce8a5-2ad501927003b41b.js → 0368f25d-ad84af92fefee68f.js} +1 -1
  5. package/apps/pwa/out/_next/static/chunks/1165.bad13fc9151a7288.js +1 -0
  6. package/apps/pwa/out/_next/static/chunks/13.02a07436dec15f89.js +32 -0
  7. package/apps/pwa/out/_next/static/chunks/{5525.86debf231e181813.js → 1530.0e612369b6fd7ea0.js} +1 -1
  8. package/apps/pwa/out/_next/static/chunks/1540.af38731fa7c4a3e0.js +41 -0
  9. package/apps/pwa/out/_next/static/chunks/{7391.ebae168025c91b6a.js → 1674.2a65fd5668e1cc5f.js} +1 -1
  10. package/apps/pwa/out/_next/static/chunks/1850.f2b470ba5a471da0.js +24 -0
  11. package/apps/pwa/out/_next/static/chunks/193.62da94cd0b88323b.js +74 -0
  12. package/apps/pwa/out/_next/static/chunks/1975.260f6d249fac5f7c.js +1 -0
  13. package/apps/pwa/out/_next/static/chunks/1982-67cd8dfe8682325f.js +1 -0
  14. package/apps/pwa/out/_next/static/chunks/{7947-d0759430f8042240.js → 1993-c0007b7ad0c0ef41.js} +1 -1
  15. package/apps/pwa/out/_next/static/chunks/1999-bb415351c8a2846c.js +1 -0
  16. package/apps/pwa/out/_next/static/chunks/{60fb96c9.360b01d8d4927b7b.js → 1c735de4.f993a30bbd3c57c4.js} +1 -1
  17. package/apps/pwa/out/_next/static/chunks/1dc5a567.9b092bfae3d7099b.js +1 -0
  18. package/apps/pwa/out/_next/static/chunks/{5307.60f2209e809bd627.js → 2018.a741297bce759490.js} +1 -1
  19. package/apps/pwa/out/_next/static/chunks/2085.8f950b4bda1cbbc7.js +1 -0
  20. package/apps/pwa/out/_next/static/chunks/2159-6179a961376956b9.js +1 -0
  21. package/apps/pwa/out/_next/static/chunks/216.b5c2a421aa1d28a5.js +1 -0
  22. package/apps/pwa/out/_next/static/chunks/2251.49fbe369f74c372c.js +148 -0
  23. package/apps/pwa/out/_next/static/chunks/2286-2939577360d3dcc0.js +1 -0
  24. package/apps/pwa/out/_next/static/chunks/{3902.e1e71aaac850a045.js → 2625.5d870aa999f33db1.js} +1 -1
  25. package/apps/pwa/out/_next/static/chunks/2668.34d21539e62bf111.js +77 -0
  26. package/apps/pwa/out/_next/static/chunks/2833-0fe47af99ed13c29.js +1 -0
  27. package/apps/pwa/out/_next/static/chunks/2930.d0edb4f108787ef7.js +1 -0
  28. package/apps/pwa/out/_next/static/chunks/2973.77318e7d85f59477.js +62 -0
  29. package/apps/pwa/out/_next/static/chunks/3103.0df8da390948bb84.js +1 -0
  30. package/apps/pwa/out/_next/static/chunks/3123.2bee9ba15d320bd2.js +90 -0
  31. package/apps/pwa/out/_next/static/chunks/3162-6cf652bf7124d8cf.js +1 -0
  32. package/apps/pwa/out/_next/static/chunks/{4174.92ed04922709ac9e.js → 3408.21d1570602f4b6c0.js} +2 -2
  33. package/apps/pwa/out/_next/static/chunks/3577-7340009f7007a795.js +1 -0
  34. package/apps/pwa/out/_next/static/chunks/3589.5444a06bcf6e775c.js +1 -0
  35. package/apps/pwa/out/_next/static/chunks/359-2250789a2d3499e7.js +1 -0
  36. package/apps/pwa/out/_next/static/chunks/3618.f514792d6c59d7fd.js +36 -0
  37. package/apps/pwa/out/_next/static/chunks/3669.343f9119aa276001.js +1 -0
  38. package/apps/pwa/out/_next/static/chunks/{9398-6aed28f0a96d0d6f.js → 3677-4215f826f6aa68e5.js} +1 -1
  39. package/apps/pwa/out/_next/static/chunks/3736.c2efad489604cc3b.js +79 -0
  40. package/apps/pwa/out/_next/static/chunks/3817.f9aeab2bb6675d73.js +1 -0
  41. package/apps/pwa/out/_next/static/chunks/3f7c4ee5.3dde54f01a816613.js +122 -0
  42. package/apps/pwa/out/_next/static/chunks/4182-0b9b1251c29cc0cf.js +1 -0
  43. package/apps/pwa/out/_next/static/chunks/{7371.80c05c653b08e907.js → 4346.8601952e73bf5803.js} +1 -1
  44. package/apps/pwa/out/_next/static/chunks/4441-875b97f5821ed58a.js +1 -0
  45. package/apps/pwa/out/_next/static/chunks/4582.bd68683c076649e3.js +286 -0
  46. package/apps/pwa/out/_next/static/chunks/4605-6e623f55aec77422.js +1 -0
  47. package/apps/pwa/out/_next/static/chunks/4607.5cc27468628eb4bf.js +1 -0
  48. package/apps/pwa/out/_next/static/chunks/4627.f07508b3936fd6c0.js +24 -0
  49. package/apps/pwa/out/_next/static/chunks/{2940-619bfd8ef337c611.js → 4705-194e64e47ca0fbdb.js} +1 -1
  50. package/apps/pwa/out/_next/static/chunks/{1335-6731f392c35216eb.js → 4718-17d2af636796a330.js} +3 -3
  51. package/apps/pwa/out/_next/static/chunks/4747-c22262c093e46807.js +1 -0
  52. package/apps/pwa/out/_next/static/chunks/4775-178215aed0daba61.js +1 -0
  53. package/apps/pwa/out/_next/static/chunks/4815-6ffb8c3c991cc45d.js +1 -0
  54. package/apps/pwa/out/_next/static/chunks/4834-beca8b47ad29a898.js +1 -0
  55. package/apps/pwa/out/_next/static/chunks/5023-fb4802b6d2492b02.js +1 -0
  56. package/apps/pwa/out/_next/static/chunks/{7502.ccd5b8065545edd0.js → 5101.e32282718f99ed6f.js} +2 -2
  57. package/apps/pwa/out/_next/static/chunks/{2001.6c7e0fd02190886c.js → 5154.a118f3957ed14e36.js} +1 -1
  58. package/apps/pwa/out/_next/static/chunks/5210-a2e0015e3d4d5d9c.js +1 -0
  59. package/apps/pwa/out/_next/static/chunks/5356.84ac712cc15928bf.js +1 -0
  60. package/apps/pwa/out/_next/static/chunks/5401.22352141b6fd336e.js +23 -0
  61. package/apps/pwa/out/_next/static/chunks/{5173-233188df2f42c626.js → 5483-dd5d7697f6bdb106.js} +1 -1
  62. package/apps/pwa/out/_next/static/chunks/5637.281e5dec4ea6ecf1.js +94 -0
  63. package/apps/pwa/out/_next/static/chunks/5662.02eaa029af05ad46.js +1 -0
  64. package/apps/pwa/out/_next/static/chunks/{3267c0e6.d34854e7b3984a6e.js → 56d372f2.681ab4ec4c998fae.js} +1 -1
  65. package/apps/pwa/out/_next/static/chunks/5760.22456f433c6f42c0.js +1 -0
  66. package/apps/pwa/out/_next/static/chunks/5852.db1f7449f4f74612.js +287 -0
  67. package/apps/pwa/out/_next/static/chunks/5891-0f11a7d7362a9072.js +1 -0
  68. package/apps/pwa/out/_next/static/chunks/5943.264d14a44ca32513.js +1 -0
  69. package/apps/pwa/out/_next/static/chunks/604-1b3c39df083c02aa.js +1 -0
  70. package/apps/pwa/out/_next/static/chunks/6121-5f97072330738caf.js +1 -0
  71. package/apps/pwa/out/_next/static/chunks/6193.07d8ca5af4b09086.js +1 -0
  72. package/apps/pwa/out/_next/static/chunks/6203-b3fea3a60d69ff14.js +1 -0
  73. package/apps/pwa/out/_next/static/chunks/{6433.fc573af22bbc9ab7.js → 6236.e18cced2d5ba6afb.js} +17 -17
  74. package/apps/pwa/out/_next/static/chunks/6286.d638fb5953e2e757.js +8 -0
  75. package/apps/pwa/out/_next/static/chunks/630.fe5a46428d63b013.js +1 -0
  76. package/apps/pwa/out/_next/static/chunks/6301.ae0245f507e4395e.js +1 -0
  77. package/apps/pwa/out/_next/static/chunks/6673.fbbe5699f6ea5991.js +27 -0
  78. package/apps/pwa/out/_next/static/chunks/6777-f6d301efb5de828d.js +1 -0
  79. package/apps/pwa/out/_next/static/chunks/6786.423f24c88de034c7.js +93 -0
  80. package/apps/pwa/out/_next/static/chunks/6854-cef64a948c5e122d.js +1 -0
  81. package/apps/pwa/out/_next/static/chunks/6866-79aa5b4e47cac6aa.js +1 -0
  82. package/apps/pwa/out/_next/static/chunks/{6544cb48.a87fe20ddf137be2.js → 6b89c8bd.24df687a820500b3.js} +1 -1
  83. package/apps/pwa/out/_next/static/chunks/7037-fe27f001db30d323.js +1 -0
  84. package/apps/pwa/out/_next/static/chunks/7080.2d826860534fd88e.js +1 -0
  85. package/apps/pwa/out/_next/static/chunks/7118.8731be28c3ebb14b.js +1 -0
  86. package/apps/pwa/out/_next/static/chunks/7196.44241bc1df3e26fe.js +149 -0
  87. package/apps/pwa/out/_next/static/chunks/7235.c7c4e6cb5c693c2d.js +104 -0
  88. package/apps/pwa/out/_next/static/chunks/{2871.0bca6137343b3f76.js → 7385.50a308a477bdfc21.js} +1 -1
  89. package/apps/pwa/out/_next/static/chunks/{2985.39ccdecd36848b12.js → 7644.17e37ba6f1d4226e.js} +4 -4
  90. package/apps/pwa/out/_next/static/chunks/7706-58bfb1546637f217.js +1 -0
  91. package/apps/pwa/out/_next/static/chunks/7839.5b91455338c9fd3f.js +1 -0
  92. package/apps/pwa/out/_next/static/chunks/7857-31f13ee96f4011aa.js +1 -0
  93. package/apps/pwa/out/_next/static/chunks/81.f74cb60312fe4001.js +1 -0
  94. package/apps/pwa/out/_next/static/chunks/{8018.a32663f04a6fc5f9.js → 8219.baa715d1deee80e2.js} +1 -1
  95. package/apps/pwa/out/_next/static/chunks/{4111.2bfedbb233ad206b.js → 8256.e3ac8421a71f82f4.js} +1 -1
  96. package/apps/pwa/out/_next/static/chunks/8310-444a6a895c402f12.js +1 -0
  97. package/apps/pwa/out/_next/static/chunks/8423.f7dda8aca4fcaae5.js +1 -0
  98. package/apps/pwa/out/_next/static/chunks/8437-8d5492094b166cfa.js +1 -0
  99. package/apps/pwa/out/_next/static/chunks/{2213.2ccbada92c33ea0f.js → 8444.4c26b379ca2b9596.js} +17 -17
  100. package/apps/pwa/out/_next/static/chunks/8496.75649af8652c74f4.js +226 -0
  101. package/apps/pwa/out/_next/static/chunks/8557-e7898769499cd56f.js +1 -0
  102. package/apps/pwa/out/_next/static/chunks/8576.65bb654b524f3614.js +1 -0
  103. package/apps/pwa/out/_next/static/chunks/8609.558ce2f8f9aea2be.js +64 -0
  104. package/apps/pwa/out/_next/static/chunks/8614.caec96cfb91f4ae7.js +1 -0
  105. package/apps/pwa/out/_next/static/chunks/{6092.a7f99e68b188ca66.js → 8637.47f5b35afcae5e6b.js} +1 -1
  106. package/apps/pwa/out/_next/static/chunks/8714.ff0b7ce3ec3e3ae2.js +1 -0
  107. package/apps/pwa/out/_next/static/chunks/8732.367f44a916202353.js +1 -0
  108. package/apps/pwa/out/_next/static/chunks/9141-7fd1f73a5400bdc2.js +1 -0
  109. package/apps/pwa/out/_next/static/chunks/921.c4267d0d69a65404.js +1 -0
  110. package/apps/pwa/out/_next/static/chunks/{3278.2e5d15b53a4091c8.js → 9214.63a510d39178e997.js} +2 -2
  111. package/apps/pwa/out/_next/static/chunks/9261.3962c3321b047691.js +115 -0
  112. package/apps/pwa/out/_next/static/chunks/936-26efd1a0efdd44d3.js +1 -0
  113. package/apps/pwa/out/_next/static/chunks/{9221.7d22eaf353a2d4e7.js → 938.66ad1ef0e5abae1c.js} +1 -1
  114. package/apps/pwa/out/_next/static/chunks/{6157.0c9af021de4fb31b.js → 9512.5a76207a730e0491.js} +2 -2
  115. package/apps/pwa/out/_next/static/chunks/9627-4b9efe616b27e2e2.js +1 -0
  116. package/apps/pwa/out/_next/static/chunks/{69-0a2c8209c6d4a158.js → 967-2aa39b2d04b4c690.js} +1 -1
  117. package/apps/pwa/out/_next/static/chunks/9734.40eb1e558c29ccea.js +1 -0
  118. package/apps/pwa/out/_next/static/chunks/9908.3aa54f7a586a73dc.js +1 -0
  119. package/apps/pwa/out/_next/static/chunks/{7862.30a8d6482bb238eb.js → 9952.5daf5f94063a2b3e.js} +1 -1
  120. package/apps/pwa/out/_next/static/chunks/9954-ca8d29752bdbb45a.js +1 -0
  121. package/apps/pwa/out/_next/static/chunks/9974-507fa67cb94066dd.js +1 -0
  122. package/apps/pwa/out/_next/static/chunks/app/_not-found/page-ce9e00f7fb45506a.js +1 -0
  123. package/apps/pwa/out/_next/static/chunks/app/approvals/page-fa59d6d17daa3389.js +1 -0
  124. package/apps/pwa/out/_next/static/chunks/app/autopilot/page-53f68bbe7bd4b774.js +1 -0
  125. package/apps/pwa/out/_next/static/chunks/app/board/page-1c500fbb9f4a7a04.js +1 -0
  126. package/apps/pwa/out/_next/static/chunks/app/botlab/page-99d72673aa5c307c.js +1 -0
  127. package/apps/pwa/out/_next/static/chunks/app/bots/page-d2d5adc1e9484c88.js +1 -0
  128. package/apps/pwa/out/_next/static/chunks/app/ceo/page-c607c5aae637f1cc.js +1 -0
  129. package/apps/pwa/out/_next/static/chunks/app/chat/page-fa8c23596d555c0f.js +1 -0
  130. package/apps/pwa/out/_next/static/chunks/app/consult/page-bdab8c5e855c8416.js +1 -0
  131. package/apps/pwa/out/_next/static/chunks/app/control/{page-a27b1e5a0d1b308f.js → page-406b47745b53f269.js} +1 -1
  132. package/apps/pwa/out/_next/static/chunks/app/decisions/page-a4276386b7051f50.js +1 -0
  133. package/apps/pwa/out/_next/static/chunks/app/design-check/page-8a26bab9ad375f25.js +1 -0
  134. package/apps/pwa/out/_next/static/chunks/app/editor/page-775f48aa1dc7a2d5.js +1 -0
  135. package/apps/pwa/out/_next/static/chunks/app/exec/page-1c4dd5f959d0c558.js +1 -0
  136. package/apps/pwa/out/_next/static/chunks/app/field/page-c48938a8377c9f70.js +1 -0
  137. package/apps/pwa/out/_next/static/chunks/app/healthz/route-ce9e00f7fb45506a.js +1 -0
  138. package/apps/pwa/out/_next/static/chunks/app/inside/page-c6e7905859425aa9.js +1 -0
  139. package/apps/pwa/out/_next/static/chunks/app/intake/page-c280f4252452e830.js +1 -0
  140. package/apps/pwa/out/_next/static/chunks/app/layout-cf8c57498f20970a.js +1 -0
  141. package/apps/pwa/out/_next/static/chunks/app/live/page-ca3a17caf409fc83.js +1 -0
  142. package/apps/pwa/out/_next/static/chunks/app/live-run/page-26e6c18a1a750cf6.js +1 -0
  143. package/apps/pwa/out/_next/static/chunks/app/loops/page-3abc872cc6aeee39.js +1 -0
  144. package/apps/pwa/out/_next/static/chunks/app/market/page-f7481b7b2174fe3d.js +1 -0
  145. package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-1ae7ef8077680337.js +1 -0
  146. package/apps/pwa/out/_next/static/chunks/app/morning/{page-32866485913d6a04.js → page-47c5d4db587266bd.js} +1 -1
  147. package/apps/pwa/out/_next/static/chunks/app/not-found-415f1e243c7ccb13.js +1 -0
  148. package/apps/pwa/out/_next/static/chunks/app/observatory/page-73f380f17b76f95c.js +1 -0
  149. package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-2991073ad66ee2d9.js +1 -0
  150. package/apps/pwa/out/_next/static/chunks/app/ops/release/page-1f5a60f70cb4dd0c.js +1 -0
  151. package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-fbad60d1e358fb2c.js +1 -0
  152. package/apps/pwa/out/_next/static/chunks/app/outputs/page-bac7dee94e5eae4a.js +1 -0
  153. package/apps/pwa/out/_next/static/chunks/app/page-398047d6949e8ca5.js +1 -0
  154. package/apps/pwa/out/_next/static/chunks/app/reflection/page-2d33a2231540ca89.js +1 -0
  155. package/apps/pwa/out/_next/static/chunks/app/scheduler/page-5bf1e6bf70bcb96c.js +1 -0
  156. package/apps/pwa/out/_next/static/chunks/app/sessions/page-ba59c19376a0917d.js +1 -0
  157. package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-111f187139add30f.js +1 -0
  158. package/apps/pwa/out/_next/static/chunks/app/settings/page-acaae197d5be5779.js +1 -0
  159. package/apps/pwa/out/_next/static/chunks/app/setup/done/page-0df20b0f546a0d7d.js +1 -0
  160. package/apps/pwa/out/_next/static/chunks/app/setup/layout-ce9e00f7fb45506a.js +1 -0
  161. package/apps/pwa/out/_next/static/chunks/app/setup/page-27e1202d24b8fe35.js +1 -0
  162. package/apps/pwa/out/_next/static/chunks/app/share/page-bda78c50a78363e5.js +1 -0
  163. package/apps/pwa/out/_next/static/chunks/app/showroom/page-da592691293d9c9f.js +1 -0
  164. package/apps/pwa/out/_next/static/chunks/app/tasks/page-f832994317a2e9f0.js +1 -0
  165. package/apps/pwa/out/_next/static/chunks/app/term/{page-04d00ae9b0890349.js → page-dc0a532f5b9196ec.js} +1 -1
  166. package/apps/pwa/out/_next/static/chunks/app/today/page-cfccbbeae0473404.js +1 -0
  167. package/apps/pwa/out/_next/static/chunks/app/trace/page-527e2073af84c81b.js +1 -0
  168. package/apps/pwa/out/_next/static/chunks/app/vault/page-bac86e9112671357.js +1 -0
  169. package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-6d59dff410e9d76a.js +1 -0
  170. package/apps/pwa/out/_next/static/chunks/app/workflows/page-53a61f8be09f02d2.js +1 -0
  171. package/apps/pwa/out/_next/static/chunks/app/workspace/page-db8f559e763c17f9.js +1 -0
  172. package/apps/pwa/out/_next/static/chunks/app/worktrees/page-c02aa4cc66455093.js +1 -0
  173. package/apps/pwa/out/_next/static/chunks/{7a1887c4.f36b88fba31da8fd.js → b2f6ba4d.fb56fdbbf798df33.js} +1 -1
  174. package/apps/pwa/out/_next/static/chunks/b6705a4f-b9a9047de9eecfd0.js +1 -0
  175. package/apps/pwa/out/_next/static/chunks/{b313b242.cb1265eea908db61.js → cbe38a15.5a032598e39970c6.js} +1 -1
  176. package/apps/pwa/out/_next/static/chunks/{409f1e57.d0649fc47691ebfe.js → d06f9160.a3d9062f95de8ad7.js} +1 -1
  177. package/apps/pwa/out/_next/static/chunks/{0bb0ff36.b8d418980951e5ba.js → da5176c6.6773b6c5994e1d99.js} +7 -7
  178. package/apps/pwa/out/_next/static/chunks/framework-50e6acebc630849b.js +1 -0
  179. package/apps/pwa/out/_next/static/chunks/main-7a1ae342d5ed75e6.js +1 -0
  180. package/apps/pwa/out/_next/static/chunks/main-app-7ad7d505ba1f92b4.js +1 -0
  181. package/apps/pwa/out/_next/static/chunks/pages/_app-02edba75232cb235.js +1 -0
  182. package/apps/pwa/out/_next/static/chunks/pages/_error-97d6ebae3e8eee4a.js +1 -0
  183. package/apps/pwa/out/_next/static/chunks/webpack-e986adaa429163e8.js +1 -0
  184. package/apps/pwa/out/approvals/index.html +1 -1
  185. package/apps/pwa/out/approvals/index.txt +22 -22
  186. package/apps/pwa/out/autopilot/index.html +1 -1
  187. package/apps/pwa/out/autopilot/index.txt +22 -22
  188. package/apps/pwa/out/board/index.html +1 -1
  189. package/apps/pwa/out/board/index.txt +22 -22
  190. package/apps/pwa/out/botlab/index.html +1 -1
  191. package/apps/pwa/out/botlab/index.txt +21 -21
  192. package/apps/pwa/out/bots/index.html +1 -1
  193. package/apps/pwa/out/bots/index.txt +21 -21
  194. package/apps/pwa/out/ceo/index.html +1 -1
  195. package/apps/pwa/out/ceo/index.txt +22 -22
  196. package/apps/pwa/out/chat/index.html +1 -1
  197. package/apps/pwa/out/chat/index.txt +21 -21
  198. package/apps/pwa/out/consult/index.html +1 -1
  199. package/apps/pwa/out/consult/index.txt +22 -22
  200. package/apps/pwa/out/control/index.html +1 -1
  201. package/apps/pwa/out/control/index.txt +22 -22
  202. package/apps/pwa/out/decisions/index.html +1 -1
  203. package/apps/pwa/out/decisions/index.txt +21 -21
  204. package/apps/pwa/out/design-check/index.html +1 -1
  205. package/apps/pwa/out/design-check/index.txt +22 -22
  206. package/apps/pwa/out/editor/index.html +1 -1
  207. package/apps/pwa/out/editor/index.txt +22 -22
  208. package/apps/pwa/out/exec/index.html +1 -1
  209. package/apps/pwa/out/exec/index.txt +22 -22
  210. package/apps/pwa/out/field/index.html +1 -1
  211. package/apps/pwa/out/field/index.txt +22 -22
  212. package/apps/pwa/out/healthz +1 -1
  213. package/apps/pwa/out/index.html +1 -1
  214. package/apps/pwa/out/index.txt +21 -21
  215. package/apps/pwa/out/inside/index.html +1 -1
  216. package/apps/pwa/out/inside/index.txt +21 -21
  217. package/apps/pwa/out/intake/index.html +1 -1
  218. package/apps/pwa/out/intake/index.txt +22 -22
  219. package/apps/pwa/out/live/index.html +1 -1
  220. package/apps/pwa/out/live/index.txt +22 -22
  221. package/apps/pwa/out/live-run/index.html +1 -1
  222. package/apps/pwa/out/live-run/index.txt +22 -22
  223. package/apps/pwa/out/loops/index.html +1 -1
  224. package/apps/pwa/out/loops/index.txt +21 -21
  225. package/apps/pwa/out/market/index.html +1 -1
  226. package/apps/pwa/out/market/index.txt +21 -21
  227. package/apps/pwa/out/missions/placeholder/index.html +1 -1
  228. package/apps/pwa/out/missions/placeholder/index.txt +21 -21
  229. package/apps/pwa/out/morning/index.html +1 -1
  230. package/apps/pwa/out/morning/index.txt +22 -22
  231. package/apps/pwa/out/observatory/index.html +1 -1
  232. package/apps/pwa/out/observatory/index.txt +22 -22
  233. package/apps/pwa/out/ops/checklist/index.html +1 -1
  234. package/apps/pwa/out/ops/checklist/index.txt +21 -21
  235. package/apps/pwa/out/ops/release/index.html +1 -1
  236. package/apps/pwa/out/ops/release/index.txt +21 -21
  237. package/apps/pwa/out/ops/seats/index.html +1 -1
  238. package/apps/pwa/out/ops/seats/index.txt +21 -21
  239. package/apps/pwa/out/outputs/index.html +1 -1
  240. package/apps/pwa/out/outputs/index.txt +21 -21
  241. package/apps/pwa/out/reflection/index.html +1 -1
  242. package/apps/pwa/out/reflection/index.txt +22 -22
  243. package/apps/pwa/out/scheduler/index.html +1 -1
  244. package/apps/pwa/out/scheduler/index.txt +22 -22
  245. package/apps/pwa/out/sessions/index.html +1 -1
  246. package/apps/pwa/out/sessions/index.txt +21 -21
  247. package/apps/pwa/out/settings/devices/index.html +1 -1
  248. package/apps/pwa/out/settings/devices/index.txt +22 -22
  249. package/apps/pwa/out/settings/index.html +1 -1
  250. package/apps/pwa/out/settings/index.txt +22 -22
  251. package/apps/pwa/out/setup/done/index.html +1 -1
  252. package/apps/pwa/out/setup/done/index.txt +22 -22
  253. package/apps/pwa/out/setup/index.html +1 -1
  254. package/apps/pwa/out/setup/index.txt +22 -22
  255. package/apps/pwa/out/share/index.html +1 -1
  256. package/apps/pwa/out/share/index.txt +22 -22
  257. package/apps/pwa/out/showroom/index.html +1 -1
  258. package/apps/pwa/out/showroom/index.txt +21 -21
  259. package/apps/pwa/out/tasks/index.html +1 -1
  260. package/apps/pwa/out/tasks/index.txt +22 -22
  261. package/apps/pwa/out/term/index.html +1 -1
  262. package/apps/pwa/out/term/index.txt +22 -22
  263. package/apps/pwa/out/today/index.html +1 -1
  264. package/apps/pwa/out/today/index.txt +22 -22
  265. package/apps/pwa/out/trace/index.html +1 -1
  266. package/apps/pwa/out/trace/index.txt +22 -22
  267. package/apps/pwa/out/vault/index.html +1 -1
  268. package/apps/pwa/out/vault/index.txt +22 -22
  269. package/apps/pwa/out/workflows/chat-ui/index.html +1 -1
  270. package/apps/pwa/out/workflows/chat-ui/index.txt +22 -22
  271. package/apps/pwa/out/workflows/index.html +1 -1
  272. package/apps/pwa/out/workflows/index.txt +22 -22
  273. package/apps/pwa/out/workspace/index.html +1 -1
  274. package/apps/pwa/out/workspace/index.txt +22 -22
  275. package/apps/pwa/out/worktrees/index.html +1 -1
  276. package/apps/pwa/out/worktrees/index.txt +22 -22
  277. package/bin/elanous.mjs +10 -2
  278. package/catalog/providers/opengateway.yaml +25 -0
  279. package/docs/goal-context/01-goal-authoring-checks.md +8 -0
  280. package/docs/goal-context/03-verification-menu.md +24 -0
  281. package/docs/goal-context/04-mock-scenarios.md +100 -0
  282. package/docs/goal-context/README.md +5 -0
  283. package/graphs/catalog/catalog.yaml +1 -1
  284. package/graphs/default-loop.yaml +76 -5
  285. package/graphs/document-loop.yaml +71 -4
  286. package/graphs/implement-loop.yaml +59 -4
  287. package/graphs/journey/SCENARIOS.md +33 -0
  288. package/graphs/journey/recipes.yaml +1 -0
  289. package/graphs/journey/ta-journey.yaml +94 -0
  290. package/graphs/journey/units/author/author.yaml +20 -0
  291. package/graphs/journey/units/author/recipes.yaml +2 -0
  292. package/graphs/journey/units/author-dialogue/author-dialogue.yaml +42 -0
  293. package/graphs/journey/units/author-dialogue/observe.ts +96 -0
  294. package/graphs/journey/units/author-dialogue/recipes.yaml +10 -0
  295. package/graphs/journey/units/green/green.yaml +20 -0
  296. package/graphs/journey/units/green/recipes.yaml +2 -0
  297. package/graphs/journey/units/pr/pr.yaml +20 -0
  298. package/graphs/journey/units/pr/recipes.yaml +2 -0
  299. package/graphs/journey/units/remember/recipes.yaml +2 -0
  300. package/graphs/journey/units/remember/remember.yaml +20 -0
  301. package/graphs/operate-loop.yaml +71 -4
  302. package/graphs/overlays/stop-heal-ladder.yaml +1 -1
  303. package/graphs/release-rehearsal/recipes.yaml +1 -1
  304. package/graphs/release-rehearsal/release-rehearsal.yaml +2 -2
  305. package/graphs/research-loop.yaml +159 -4
  306. package/graphs/test-diet/test-diet.yaml +3 -0
  307. package/graphs/units/dispatch-pod/dispatch-pod.yaml +50 -0
  308. package/graphs/units/dispatch-pod/recipes.yaml +14 -0
  309. package/graphs/units/entry/entry.yaml +50 -0
  310. package/graphs/units/entry/recipes.yaml +14 -0
  311. package/graphs/units/harvest/harvest.yaml +25 -0
  312. package/graphs/units/harvest/recipes.yaml +4 -0
  313. package/graphs/units/land/land.yaml +45 -0
  314. package/graphs/units/land/recipes.yaml +3 -0
  315. package/graphs/units/recipes.yaml +7 -0
  316. package/graphs/units/recover.yaml +39 -0
  317. package/graphs/units/reflect/recipes.yaml +3 -0
  318. package/graphs/units/reflect/reflect.yaml +15 -0
  319. package/graphs/units/task-agent-recover-review.yaml +17 -0
  320. package/graphs/units/task-agent-recover-wait.yaml +17 -0
  321. package/graphs/units/verbs/make-doc.yaml +34 -0
  322. package/graphs/units/verbs/recipes.yaml +33 -0
  323. package/graphs/units/verbs/verify.yaml +55 -0
  324. package/graphs/work/recipes.yaml +2 -0
  325. package/graphs/work/research-report.yaml +28 -0
  326. package/package.json +1 -1
  327. package/scripts/ci-typecheck-changed.ts +69 -16
  328. package/scripts/coord-role-pack.ts +19 -6
  329. package/scripts/docs/generate-graph-anatomy.ts +19 -2
  330. package/scripts/graph-harvest-unit.ts +22 -0
  331. package/scripts/graph-units/journey-stub.ts +6 -0
  332. package/scripts/graph-units/land-enqueue.ts +78 -0
  333. package/scripts/graph-units/recover-plan.ts +15 -0
  334. package/scripts/graph-units/reflect-node.ts +88 -0
  335. package/scripts/graph-units/ta-journey-observe.ts +109 -0
  336. package/scripts/graph-units/verbs/headless-goal-loop.ts +152 -0
  337. package/scripts/graph-units/verbs/verify-stage.ts +75 -0
  338. package/scripts/graph-units/verbs-envelope.ts +139 -0
  339. package/scripts/hq/standby-snapshot.ts +30 -0
  340. package/scripts/public-export.ts +43 -1
  341. package/scripts/ratchets/train-side-invariants.sh +45 -0
  342. package/scripts/release-loop/auto-approve-node.ts +30 -16
  343. package/scripts/release-loop/docs-land-node.ts +21 -5
  344. package/scripts/release-loop/gate-baseline-receipt.ts +155 -0
  345. package/scripts/release-loop/gate-closure.ts +5 -1
  346. package/scripts/release-loop/gate-diff.ts +1 -1
  347. package/scripts/release-loop/gate-node.ts +675 -49
  348. package/scripts/release-loop/gate-partial.ts +68 -14
  349. package/scripts/release-loop/gate-radius-live.ts +177 -0
  350. package/scripts/release-loop/gate-radius-shadow.ts +138 -0
  351. package/scripts/release-loop/gate-traffic-mode.ts +128 -0
  352. package/scripts/release-loop/gate-triage-node.ts +5 -2
  353. package/scripts/release-loop/known-issues-0.2.33-approved.json +194 -0
  354. package/scripts/release-loop/known-issues-node.ts +77 -8
  355. package/scripts/release-loop/node-verdict.ts +12 -1
  356. package/scripts/release-loop/npm-publish-node.ts +66 -12
  357. package/scripts/release-loop/preflight.ts +93 -7
  358. package/scripts/release-loop/probe-pod-host-dirs-live.ts +5 -0
  359. package/scripts/release-loop/publish-node.ts +60 -9
  360. package/scripts/release-loop/pwa-remote.ts +166 -0
  361. package/scripts/release-loop/pwa-scenarios-node.ts +19 -3
  362. package/scripts/release-loop/resume-cap.ts +56 -0
  363. package/scripts/release-loop/resume-release.ts +155 -19
  364. package/scripts/release-loop/resume.ts +24 -1
  365. package/scripts/release-loop/tui-sim-node.ts +8 -2
  366. package/scripts/release-loop/unattended-release.ts +10 -2
  367. package/scripts/test-diet/lib.ts +6 -1
  368. package/scripts/test-diet/node.ts +194 -13
  369. package/scripts/ux-sim.ts +39 -0
  370. package/src/acp/core-turn-bridge.ts +20 -5
  371. package/src/acp/reasoning-thought-buffer.ts +45 -0
  372. package/src/agent/self-ambient-cache.ts +8 -0
  373. package/src/agent-substrate/acp-reviewer.ts +90 -15
  374. package/src/agent-substrate/pr-reviewer.ts +17 -0
  375. package/src/agent-substrate/review-finding-key.ts +53 -0
  376. package/src/agent-substrate/self-review-cli.ts +188 -18
  377. package/src/ask-user-question/pending-questions.ts +1 -1
  378. package/src/autopilot/pr-manager.ts +393 -65
  379. package/src/budget/run-usage-rollup.ts +1 -0
  380. package/src/chat/index.ts +0 -2
  381. package/src/chat/pickers/modal-runtime.ts +10 -27
  382. package/src/chat/tool-render/dispatch.ts +62 -10
  383. package/src/cli/agent-cli.ts +13 -2
  384. package/src/cli/control-cli.ts +24 -7
  385. package/src/cli/doctor-cli.ts +4 -1
  386. package/src/cli/guardian-cli.ts +10 -0
  387. package/src/cli/light-entry-route.ts +75 -0
  388. package/src/cli/llm-detect-cli.ts +23 -1
  389. package/src/cli/pod-cli.ts +77 -3
  390. package/src/cli/pr-cli.ts +81 -14
  391. package/src/cli/pr-land-base-read.ts +2 -0
  392. package/src/cli/pr-land-overlap-evidence.ts +154 -16
  393. package/src/cli/pr-land-pod-shadow-job.ts +3 -0
  394. package/src/cli/pr-land-recovery.ts +64 -0
  395. package/src/cli/pty-takeover-cli.ts +6 -5
  396. package/src/cli/release-checklist-read-cli.ts +79 -0
  397. package/src/cli/release-cli.ts +189 -132
  398. package/src/cli/release-run-if-ready.ts +29 -28
  399. package/src/cli/release-single-flight.ts +178 -0
  400. package/src/cli/remote-resolve.ts +1 -1
  401. package/src/cli/root-tui-entry.ts +48 -0
  402. package/src/cli/seat-cli.ts +37 -0
  403. package/src/cli/setup-cli.ts +40 -1
  404. package/src/cli/sim-cli.ts +22 -0
  405. package/src/cli/tasks-cli.ts +667 -14
  406. package/src/cli/usage-cli.ts +13 -11
  407. package/src/clipboard/history.ts +179 -13
  408. package/src/config.ts +8 -1
  409. package/src/control/control-status.ts +8 -3
  410. package/src/control-plane/ledger.ts +5 -3
  411. package/src/control-plane/server.ts +5 -3
  412. package/src/core-turn/short-question.ts +5 -1
  413. package/src/dashboard/chat/acp-chat.ts +8 -0
  414. package/src/dashboard/index.ts +114 -77
  415. package/src/dashboard/input/chat-main-plain-turn-runtime.ts +3 -0
  416. package/src/dashboard/input/dashboard-plain-turn-stream.ts +4 -0
  417. package/src/dashboard/input/seat-autowake.ts +56 -3
  418. package/src/dashboard/render/theme-resolver.ts +33 -4
  419. package/src/dashboard/seat-boot-preamble.ts +1 -1
  420. package/src/dashboard/slash-runtime/ask-clarification.ts +48 -0
  421. package/src/dashboard/slash-runtime/dashboard-delegated-slashes.ts +68 -0
  422. package/src/dashboard/slash-runtime/dashboard-handlers.ts +62 -322
  423. package/src/dashboard/slash-runtime/dashboard-log-slash.ts +208 -0
  424. package/src/dashboard/turn-preamble.ts +47 -1
  425. package/src/dashboard/turn-stream-formatter.ts +34 -1
  426. package/src/dashboard/turn-stream-runtime.ts +2 -0
  427. package/src/dashboard/turn-typeahead-prompt-zone.ts +67 -0
  428. package/src/domains/guardian-tick.ts +54 -2
  429. package/src/domains/outbound-alert.ts +3 -2
  430. package/src/domains/schedule-registry.ts +16 -2
  431. package/src/extractors.ts +3 -1
  432. package/src/git-fs/idle-refresh.ts +76 -0
  433. package/src/git-fs/index.ts +18 -7
  434. package/src/git-fs/retry.ts +4 -0
  435. package/src/git-fs/runner.ts +2 -0
  436. package/src/git-fs/worktree.ts +42 -4
  437. package/src/graph-kinds/registry.ts +2 -2
  438. package/src/graph-runner/runner.ts +267 -54
  439. package/src/grok/credential.ts +15 -3
  440. package/src/harness/harness-cli-command.ts +151 -38
  441. package/src/harness/harness-incidents.ts +37 -0
  442. package/src/harness/harness-pod-dispatch.ts +38 -1
  443. package/src/harness/harness-salvage-cli.ts +14 -2
  444. package/src/harness/launch-utterance-ledger.ts +208 -0
  445. package/src/impl-discipline/detector.ts +16 -4
  446. package/src/impl-discipline/system-prompt.ts +11 -0
  447. package/src/impl-discipline/types.ts +2 -2
  448. package/src/index.ts +683 -146
  449. package/src/intake-plane/already-built-hint.ts +91 -0
  450. package/src/intake-plane/requirement-funnel.ts +29 -1
  451. package/src/knowhow/pack.ts +199 -0
  452. package/src/light-cli.ts +111 -0
  453. package/src/llm/opengateway-models.ts +11 -0
  454. package/src/llm/provider-credentials.ts +14 -0
  455. package/src/llm/provider-detect.ts +8 -1
  456. package/src/llm/runtime-model-family.ts +2 -1
  457. package/src/llm.ts +268 -65
  458. package/src/loops/budget.ts +95 -0
  459. package/src/loops/msg-wake.ts +8 -2
  460. package/src/loops/orchestrator/traffic.ts +132 -1
  461. package/src/model-tier/llm-tier-map.ts +15 -1
  462. package/src/mss/logging/log-store.ts +4 -5
  463. package/src/native-tool-catalog.ts +15 -1
  464. package/src/nexus/api/graphs-api.ts +22 -3
  465. package/src/nexus/api/http-server.ts +1 -1
  466. package/src/nexus/api/loop-resources.ts +13 -1
  467. package/src/nexus/api/ops-api.ts +12 -0
  468. package/src/oauth/claude-pty-maturity.ts +66 -0
  469. package/src/oauth/codex-access-mirror.ts +55 -0
  470. package/src/oauth/codex.ts +7 -0
  471. package/src/oauth/fallback-chain.ts +1 -1
  472. package/src/onboarding/first-run.ts +5 -3
  473. package/src/onboarding/non-interactive.ts +64 -13
  474. package/src/onboarding.ts +10 -2
  475. package/src/ops/overview-collect.ts +54 -4
  476. package/src/ops/overview.ts +31 -7
  477. package/src/pr-tool/census.ts +282 -30
  478. package/src/pr-tool/inflight-registry.ts +160 -7
  479. package/src/prompt-library/gpt6-family-addendum.ts +14 -1
  480. package/src/pty-shell/herdr-agent-report.ts +442 -0
  481. package/src/pty-shell/pty-control-ipc.ts +5 -5
  482. package/src/pty-shell/pty-manifest.ts +7 -0
  483. package/src/pty-shell/pty-write-outcome.ts +24 -6
  484. package/src/pty-shell/tui-run-state.ts +117 -3
  485. package/src/release-loop/checklist.ts +103 -5
  486. package/src/release-loop/feature-store.ts +19 -2
  487. package/src/release-loop/landed-but-yellow.ts +129 -5
  488. package/src/release-loop/light-rc.ts +1 -0
  489. package/src/release-loop/placement.ts +10 -3
  490. package/src/release-loop/rehearsal.ts +205 -25
  491. package/src/release-loop/rubric.ts +16 -2
  492. package/src/repl/index.ts +174 -17
  493. package/src/repl/ops-msg-bridge.ts +32 -0
  494. package/src/self-dev/ask-launch-flow.ts +44 -5
  495. package/src/self-dev/cli-help-text.ts +17 -0
  496. package/src/self-dev/dev-cli.ts +11 -9
  497. package/src/self-dev/draft-residue.ts +37 -1
  498. package/src/self-dev/draft-sweep.ts +188 -13
  499. package/src/self-dev/draft-triage-rules.ts +107 -0
  500. package/src/self-dev/fleet-reduce.ts +3 -2
  501. package/src/self-dev/graph-front-nodes.ts +112 -0
  502. package/src/self-dev/graph-journey-nodes.ts +11 -6
  503. package/src/self-dev/graph-journey-route.ts +60 -6
  504. package/src/self-dev/harness-run-cli.ts +3 -15
  505. package/src/self-dev/orchestrate-cli-text.ts +10 -0
  506. package/src/self-dev/orchestrate.ts +79 -3
  507. package/src/self-dev/review-provider-fallback.ts +35 -1
  508. package/src/self-dev/run-supervisor.ts +107 -12
  509. package/src/self-dev/run-types.ts +5 -1
  510. package/src/self-dev/self-orchestrate-runtime.ts +1 -11
  511. package/src/self-dev/shard-aggregate.ts +42 -5
  512. package/src/self-dev/shard-run.ts +8 -1
  513. package/src/self-implement/blocked-draft-policy.ts +20 -0
  514. package/src/self-implement/classify-shadow.ts +3 -7
  515. package/src/self-implement/doctor-visit.ts +18 -1
  516. package/src/self-implement/gate-baseline.ts +95 -12
  517. package/src/self-implement/gate-cli.ts +1 -0
  518. package/src/self-implement/gate-remote.ts +40 -25
  519. package/src/self-implement/goal-author-decompose.ts +275 -47
  520. package/src/self-implement/goal-author-identity.ts +66 -0
  521. package/src/self-implement/goal-author-preservation-obligation.ts +35 -0
  522. package/src/self-implement/goal-author.ts +254 -120
  523. package/src/self-implement/goal-elaborate.ts +295 -0
  524. package/src/self-implement/goal-refine.ts +270 -0
  525. package/src/self-implement/graph-overlay-yaml.ts +28 -2
  526. package/src/self-implement/graph-unit-flatten.ts +103 -0
  527. package/src/self-implement/graph-unit-resolver.ts +107 -0
  528. package/src/self-implement/graph-yaml.ts +151 -1
  529. package/src/self-implement/headless-elanous-driver.ts +1 -0
  530. package/src/self-implement/knowhow-pack.ts +103 -0
  531. package/src/self-implement/orchestrator.ts +160 -45
  532. package/src/self-implement/pod-warm-pool-profile.ts +45 -0
  533. package/src/self-implement/review-mustfix-class.ts +203 -0
  534. package/src/self-implement/rework-budget-judgment.ts +5 -8
  535. package/src/self-implement/run-stop.ts +17 -2
  536. package/src/self-implement/running-runs.ts +29 -1
  537. package/src/self-implement/scope-adjacency.ts +113 -0
  538. package/src/self-implement/seams.ts +138 -4
  539. package/src/self-implement/stop-autoheal.ts +112 -2
  540. package/src/session/chat.ts +27 -0
  541. package/src/session-runtime/index.ts +1 -1
  542. package/src/session-runtime/retry-policy.ts +2 -1
  543. package/src/setup/llm-env-detect.ts +5 -0
  544. package/src/skills/tools/agent.ts +140 -14
  545. package/src/skills/tools/msg-ask.ts +100 -0
  546. package/src/skills/tools/ops-ledger.ts +2 -1
  547. package/src/skills/tools/schedule-wakeup.ts +66 -17
  548. package/src/steward/hold-hygiene.ts +24 -6
  549. package/src/steward/release-day.ts +7 -3
  550. package/src/steward/triage-budget.ts +194 -0
  551. package/src/steward/triage.ts +57 -7
  552. package/src/task-agent/actions.ts +69 -1
  553. package/src/task-agent/green-sweep.ts +4 -0
  554. package/src/task-agent/harvest-unit.ts +141 -0
  555. package/src/task-agent/live-moves.ts +257 -15
  556. package/src/task-agent/parent-host.ts +216 -6
  557. package/src/task-agent/postland-card.ts +80 -1
  558. package/src/task-agent/rejudge-on-head.ts +112 -26
  559. package/src/task-agent/repair-branch-cas.ts +4 -1
  560. package/src/task-agent/repair-cycle.ts +16 -3
  561. package/src/task-agent/run-identity.ts +4 -3
  562. package/src/task-agent/shadow.ts +19 -3
  563. package/src/task-agent/task-hand.ts +96 -36
  564. package/src/task-agent/tier-split.ts +127 -0
  565. package/src/task-agent/work-order-build.ts +24 -0
  566. package/src/task-agent/work-order.ts +3 -2
  567. package/src/task-orchestrator/generator-prompt.ts +60 -11
  568. package/src/task-orchestrator/surfaces/pod-account-broker.ts +72 -3
  569. package/src/task-orchestrator/surfaces/pod-child-providers.ts +1 -1
  570. package/src/task-orchestrator/surfaces/pod-command-job.ts +47 -8
  571. package/src/task-orchestrator/surfaces/pod-image-source.ts +89 -1
  572. package/src/task-orchestrator/surfaces/pod-lease.ts +17 -8
  573. package/src/task-orchestrator/surfaces/pod-lifecycle-stages.ts +86 -8
  574. package/src/task-orchestrator/surfaces/pod-manifest-test-normalize.ts +8 -2
  575. package/src/task-orchestrator/surfaces/pod-pool.ts +73 -17
  576. package/src/task-orchestrator/surfaces/pod-provenance.ts +76 -0
  577. package/src/task-orchestrator/surfaces/pod-source-receive.ts +72 -4
  578. package/src/task-orchestrator/surfaces/pod-warm-provenance.ts +81 -0
  579. package/src/task-orchestrator/surfaces/pod-warm-worker-pod.ts +32 -5
  580. package/src/task-orchestrator/surfaces/pod-warm-worker-protocol.ts +3 -0
  581. package/src/task-orchestrator/surfaces/pod-warm-worker-provider.ts +421 -0
  582. package/src/task-orchestrator/surfaces/pod-warm-worker-runtime.ts +2 -1
  583. package/src/task-orchestrator/surfaces/self-implement-pod.ts +588 -71
  584. package/src/task-orchestrator/surfaces/self-implement.ts +106 -2
  585. package/src/tool-runtime/ops-ledger-runtimes.ts +10 -2
  586. package/src/tool-runtime/truncation-store.ts +4 -0
  587. package/src/tui/README.md +2 -0
  588. package/src/tui/chat/background-job-status.ts +54 -0
  589. package/src/tui/chat/log-view.ts +80 -0
  590. package/src/tui/entry.ts +406 -0
  591. package/src/tui/input/composer.ts +144 -0
  592. package/src/tui/seat-mail-boot.ts +59 -0
  593. package/src/tui/slash/compact.ts +100 -0
  594. package/src/tui/slash/new-session.ts +35 -0
  595. package/src/tui-client/dashboard-session.ts +10 -1
  596. package/src/tui-client/local-chat-turn.ts +239 -0
  597. package/src/tui-client/local-harness-command.ts +63 -0
  598. package/src/tui-client/local-provider-command.ts +184 -0
  599. package/src/user-config/coercion.ts +36 -0
  600. package/src/user-config.ts +22 -43
  601. package/src/ux-sim/event-monkey.ts +378 -0
  602. package/src/ux-sim/fake-bin.ts +42 -7
  603. package/src/ux-sim/fault-nextmove-dispatch.ts +266 -0
  604. package/src/ux-sim/fault-pod-codex-503.ts +211 -0
  605. package/src/ux-sim/fault-scope-escape-lift.ts +189 -0
  606. package/src/ux-sim/scenario.ts +72 -13
  607. package/src/version/packed-revision.json +1 -1
  608. package/apps/pwa/out/_next/static/chunks/1034-8b639cee57b8e4a8.js +0 -1
  609. package/apps/pwa/out/_next/static/chunks/1085-6c2d35526f11f840.js +0 -1
  610. package/apps/pwa/out/_next/static/chunks/1220.1ff7d5cdc34b1ae5.js +0 -27
  611. package/apps/pwa/out/_next/static/chunks/1247.5884ec81b39fe2e7.js +0 -287
  612. package/apps/pwa/out/_next/static/chunks/1302.87681521a7a4661e.js +0 -62
  613. package/apps/pwa/out/_next/static/chunks/1324-59dae3002413623b.js +0 -1
  614. package/apps/pwa/out/_next/static/chunks/1343-f40b5870ac1eda5a.js +0 -1
  615. package/apps/pwa/out/_next/static/chunks/146-b6cd56be11dda017.js +0 -1
  616. package/apps/pwa/out/_next/static/chunks/1654.32de4b324981a188.js +0 -23
  617. package/apps/pwa/out/_next/static/chunks/1834-98b64172bc1efe77.js +0 -1
  618. package/apps/pwa/out/_next/static/chunks/1849.1ce38efa6c527d9a.js +0 -149
  619. package/apps/pwa/out/_next/static/chunks/1913.7cc6fb6055b1ed3f.js +0 -41
  620. package/apps/pwa/out/_next/static/chunks/2030.41fae98c7e907304.js +0 -1
  621. package/apps/pwa/out/_next/static/chunks/2099-08b2f2dfba742c9b.js +0 -1
  622. package/apps/pwa/out/_next/static/chunks/2112-e4efc21a6505d5bc.js +0 -1
  623. package/apps/pwa/out/_next/static/chunks/2134.ecee03a550ee7250.js +0 -1
  624. package/apps/pwa/out/_next/static/chunks/2236.66061832181cb745.js +0 -1
  625. package/apps/pwa/out/_next/static/chunks/2422.b0bd272e7020d7e6.js +0 -1
  626. package/apps/pwa/out/_next/static/chunks/2534.e85ae21ad0dac829.js +0 -1
  627. package/apps/pwa/out/_next/static/chunks/2898.fd781bc7cf01a7b7.js +0 -1
  628. package/apps/pwa/out/_next/static/chunks/3040.92ff9ffc9f971cb9.js +0 -115
  629. package/apps/pwa/out/_next/static/chunks/3144.6861096c7b4edef7.js +0 -64
  630. package/apps/pwa/out/_next/static/chunks/3541-ce3a5424ed5ad7f1.js +0 -1
  631. package/apps/pwa/out/_next/static/chunks/3583.a05e88cc8d594628.js +0 -1
  632. package/apps/pwa/out/_next/static/chunks/3771.e928edf2867d28c0.js +0 -1
  633. package/apps/pwa/out/_next/static/chunks/4063-03284b5de59965f3.js +0 -1
  634. package/apps/pwa/out/_next/static/chunks/4300-c7ec4eeabbb5f3f7.js +0 -1
  635. package/apps/pwa/out/_next/static/chunks/4483.646d5065199e1b55.js +0 -36
  636. package/apps/pwa/out/_next/static/chunks/4519.28199ff26b2fd80d.js +0 -1
  637. package/apps/pwa/out/_next/static/chunks/4581.ef2443578054544f.js +0 -1
  638. package/apps/pwa/out/_next/static/chunks/4608-8d894e9cbe4f08bf.js +0 -1
  639. package/apps/pwa/out/_next/static/chunks/4639.ae48a01d1bb50a93.js +0 -286
  640. package/apps/pwa/out/_next/static/chunks/4739.08742ac668aada67.js +0 -77
  641. package/apps/pwa/out/_next/static/chunks/4745.67d6f99c245af3f7.js +0 -226
  642. package/apps/pwa/out/_next/static/chunks/4882-16cef71d6a1a32be.js +0 -1
  643. package/apps/pwa/out/_next/static/chunks/4999.c064a4000c2a9e94.js +0 -79
  644. package/apps/pwa/out/_next/static/chunks/5260-69f35419bca263e7.js +0 -1
  645. package/apps/pwa/out/_next/static/chunks/5272.b92d1b72a15c25fe.js +0 -1
  646. package/apps/pwa/out/_next/static/chunks/5304.04d24756f242a094.js +0 -148
  647. package/apps/pwa/out/_next/static/chunks/5415-997980f828667736.js +0 -1
  648. package/apps/pwa/out/_next/static/chunks/5458-16cd7a2b51b74c8c.js +0 -1
  649. package/apps/pwa/out/_next/static/chunks/5543.a438b8ab5a13ea47.js +0 -1
  650. package/apps/pwa/out/_next/static/chunks/5572-42c9084f27ca761e.js +0 -1
  651. package/apps/pwa/out/_next/static/chunks/5661-80470aac963d9f36.js +0 -1
  652. package/apps/pwa/out/_next/static/chunks/5723.421338408b5c30c4.js +0 -74
  653. package/apps/pwa/out/_next/static/chunks/5809.64c3664267c50bce.js +0 -1
  654. package/apps/pwa/out/_next/static/chunks/6000.64bc21ac8627f2f5.js +0 -94
  655. package/apps/pwa/out/_next/static/chunks/6013.39459b9c68eabf5f.js +0 -1
  656. package/apps/pwa/out/_next/static/chunks/607-06466dff012b03ef.js +0 -1
  657. package/apps/pwa/out/_next/static/chunks/6192.a190b989b81e9743.js +0 -1
  658. package/apps/pwa/out/_next/static/chunks/6323.8672b4817a306928.js +0 -1
  659. package/apps/pwa/out/_next/static/chunks/6444.7d1fdcb9b09ae71c.js +0 -1
  660. package/apps/pwa/out/_next/static/chunks/6517.4147878ac06d584d.js +0 -90
  661. package/apps/pwa/out/_next/static/chunks/6532.e34302010b2f0b68.js +0 -32
  662. package/apps/pwa/out/_next/static/chunks/6546.74bc4ed82f19016d.js +0 -104
  663. package/apps/pwa/out/_next/static/chunks/6684-e7523ce7c2fad075.js +0 -1
  664. package/apps/pwa/out/_next/static/chunks/6726.ebdc82feb161431e.js +0 -1
  665. package/apps/pwa/out/_next/static/chunks/6739.00fb6f892e5e392b.js +0 -1
  666. package/apps/pwa/out/_next/static/chunks/6745.934c4921bf15513a.js +0 -1
  667. package/apps/pwa/out/_next/static/chunks/6767.ea607cf0c20a25af.js +0 -24
  668. package/apps/pwa/out/_next/static/chunks/6843.67bfd020da0926c5.js +0 -93
  669. package/apps/pwa/out/_next/static/chunks/6948.1062d4594652b5bf.js +0 -1
  670. package/apps/pwa/out/_next/static/chunks/7138-eaf841fc1dc03463.js +0 -1
  671. package/apps/pwa/out/_next/static/chunks/7174-cda29ee13d7790e7.js +0 -1
  672. package/apps/pwa/out/_next/static/chunks/7304-3c07583f4e405f4f.js +0 -1
  673. package/apps/pwa/out/_next/static/chunks/7557.e325503a090a4310.js +0 -8
  674. package/apps/pwa/out/_next/static/chunks/7569-9ce9432c7f10989f.js +0 -1
  675. package/apps/pwa/out/_next/static/chunks/7886-55854585fadeded1.js +0 -1
  676. package/apps/pwa/out/_next/static/chunks/8097-9530c03bcc550f02.js +0 -1
  677. package/apps/pwa/out/_next/static/chunks/8215-1661812b6e9ad71f.js +0 -1
  678. package/apps/pwa/out/_next/static/chunks/8260-19c921a51ca8ec3e.js +0 -1
  679. package/apps/pwa/out/_next/static/chunks/8440.3a5cf5c85aa76db8.js +0 -1
  680. package/apps/pwa/out/_next/static/chunks/8519-4599be2249161e68.js +0 -1
  681. package/apps/pwa/out/_next/static/chunks/8547.b028b90c5c01ace6.js +0 -1
  682. package/apps/pwa/out/_next/static/chunks/8587-cbe02a953a7f4990.js +0 -1
  683. package/apps/pwa/out/_next/static/chunks/877-2b977259c4b15655.js +0 -1
  684. package/apps/pwa/out/_next/static/chunks/9002.e5658224e3dc1b6f.js +0 -24
  685. package/apps/pwa/out/_next/static/chunks/9019-0a4b40c50c7314fb.js +0 -1
  686. package/apps/pwa/out/_next/static/chunks/9138.b6e80031afb1d973.js +0 -1
  687. package/apps/pwa/out/_next/static/chunks/9188-d36e4fc869ddc166.js +0 -1
  688. package/apps/pwa/out/_next/static/chunks/9230.44f5039e796e4ab4.js +0 -1
  689. package/apps/pwa/out/_next/static/chunks/9279-d28c5b7754d010ae.js +0 -1
  690. package/apps/pwa/out/_next/static/chunks/939.336acce73e98482c.js +0 -1
  691. package/apps/pwa/out/_next/static/chunks/9407.e49124dedf0f5e72.js +0 -1
  692. package/apps/pwa/out/_next/static/chunks/9610.c07cce4bfcc14ed7.js +0 -1
  693. package/apps/pwa/out/_next/static/chunks/9667-ce78c2ce91050ff9.js +0 -1
  694. package/apps/pwa/out/_next/static/chunks/9989.3694300e5f000b14.js +0 -1
  695. package/apps/pwa/out/_next/static/chunks/app/_not-found/page-339fabb3499da0e1.js +0 -1
  696. package/apps/pwa/out/_next/static/chunks/app/approvals/page-504204b58c82c253.js +0 -1
  697. package/apps/pwa/out/_next/static/chunks/app/autopilot/page-a9717a67c2eecbaf.js +0 -1
  698. package/apps/pwa/out/_next/static/chunks/app/board/page-5c9ec30aee62dfbf.js +0 -1
  699. package/apps/pwa/out/_next/static/chunks/app/botlab/page-584191533721fa16.js +0 -1
  700. package/apps/pwa/out/_next/static/chunks/app/bots/page-73c4b4bb3ac7ab5f.js +0 -1
  701. package/apps/pwa/out/_next/static/chunks/app/ceo/page-c0f1ca371f710b06.js +0 -1
  702. package/apps/pwa/out/_next/static/chunks/app/chat/page-46430d45a9e04eac.js +0 -1
  703. package/apps/pwa/out/_next/static/chunks/app/consult/page-3b2ebf1dc64ff0be.js +0 -1
  704. package/apps/pwa/out/_next/static/chunks/app/decisions/page-25654b82094f7d22.js +0 -1
  705. package/apps/pwa/out/_next/static/chunks/app/design-check/page-8ea49a4c6dd2c6e7.js +0 -1
  706. package/apps/pwa/out/_next/static/chunks/app/editor/page-ce5113aefea0a8d1.js +0 -1
  707. package/apps/pwa/out/_next/static/chunks/app/exec/page-0e5a41fac1c75396.js +0 -1
  708. package/apps/pwa/out/_next/static/chunks/app/field/page-31aaf1ed37c6df9a.js +0 -1
  709. package/apps/pwa/out/_next/static/chunks/app/healthz/route-339fabb3499da0e1.js +0 -1
  710. package/apps/pwa/out/_next/static/chunks/app/inside/page-3dcc1fa411e1f4e0.js +0 -1
  711. package/apps/pwa/out/_next/static/chunks/app/intake/page-c69247e7134d329d.js +0 -1
  712. package/apps/pwa/out/_next/static/chunks/app/layout-66dc5cd3a0999abe.js +0 -1
  713. package/apps/pwa/out/_next/static/chunks/app/live/page-26ff7ff651a7217d.js +0 -1
  714. package/apps/pwa/out/_next/static/chunks/app/live-run/page-617b3976981efa96.js +0 -1
  715. package/apps/pwa/out/_next/static/chunks/app/loops/page-d256f5d5d9552823.js +0 -1
  716. package/apps/pwa/out/_next/static/chunks/app/market/page-ce8f1907b8a6101c.js +0 -1
  717. package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-33e182a316263116.js +0 -1
  718. package/apps/pwa/out/_next/static/chunks/app/not-found-7607cca9b84950c6.js +0 -1
  719. package/apps/pwa/out/_next/static/chunks/app/observatory/page-eeab86176b03dc3b.js +0 -1
  720. package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-5b93dbae3432b996.js +0 -1
  721. package/apps/pwa/out/_next/static/chunks/app/ops/release/page-77a6cb90a9cf2b10.js +0 -1
  722. package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-f47e768b5b242b5a.js +0 -1
  723. package/apps/pwa/out/_next/static/chunks/app/outputs/page-eb41aa3367fc2505.js +0 -1
  724. package/apps/pwa/out/_next/static/chunks/app/page-4d13ab0b8a267e3f.js +0 -1
  725. package/apps/pwa/out/_next/static/chunks/app/reflection/page-84dad32ff0fc0831.js +0 -1
  726. package/apps/pwa/out/_next/static/chunks/app/scheduler/page-95306f892aa2d0ee.js +0 -1
  727. package/apps/pwa/out/_next/static/chunks/app/sessions/page-940fb6c217f6b470.js +0 -1
  728. package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-8c66a3b24a745630.js +0 -1
  729. package/apps/pwa/out/_next/static/chunks/app/settings/page-7b675dfd35c36fc9.js +0 -1
  730. package/apps/pwa/out/_next/static/chunks/app/setup/done/page-8bd0d3cf7665bcfc.js +0 -1
  731. package/apps/pwa/out/_next/static/chunks/app/setup/layout-339fabb3499da0e1.js +0 -1
  732. package/apps/pwa/out/_next/static/chunks/app/setup/page-c219f2ed171131be.js +0 -1
  733. package/apps/pwa/out/_next/static/chunks/app/share/page-40f8fa21bdae955b.js +0 -1
  734. package/apps/pwa/out/_next/static/chunks/app/showroom/page-468f8313e4f1fbd9.js +0 -1
  735. package/apps/pwa/out/_next/static/chunks/app/tasks/page-7bbb8fa353a246c4.js +0 -1
  736. package/apps/pwa/out/_next/static/chunks/app/today/page-4214b855d9233ea8.js +0 -1
  737. package/apps/pwa/out/_next/static/chunks/app/trace/page-936752c7aa58762e.js +0 -1
  738. package/apps/pwa/out/_next/static/chunks/app/vault/page-ec052ad359df1797.js +0 -1
  739. package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-8305570551091338.js +0 -1
  740. package/apps/pwa/out/_next/static/chunks/app/workflows/page-fad650e4793adb65.js +0 -1
  741. package/apps/pwa/out/_next/static/chunks/app/workspace/page-d90e64743826e1d8.js +0 -1
  742. package/apps/pwa/out/_next/static/chunks/app/worktrees/page-a16bcfd49af86a32.js +0 -1
  743. package/apps/pwa/out/_next/static/chunks/e5012ffe.f727e23c231f4342.js +0 -122
  744. package/apps/pwa/out/_next/static/chunks/ea695e3c-1f1d70d740cf3031.js +0 -1
  745. package/apps/pwa/out/_next/static/chunks/ebc7d829.264a0bcb6c750b50.js +0 -1
  746. package/apps/pwa/out/_next/static/chunks/framework-906af9bd029e166c.js +0 -1
  747. package/apps/pwa/out/_next/static/chunks/main-a24847f9f684d469.js +0 -1
  748. package/apps/pwa/out/_next/static/chunks/main-app-7bdcd8aa7c8397d3.js +0 -1
  749. package/apps/pwa/out/_next/static/chunks/pages/_app-6ba46a5066fc226d.js +0 -1
  750. package/apps/pwa/out/_next/static/chunks/pages/_error-a8dc6d07591f2a25.js +0 -1
  751. package/apps/pwa/out/_next/static/chunks/webpack-f13df28c15c55eee.js +0 -1
  752. package/src/cli/g6a-registration-probe.ts +0 -16
  753. /package/apps/pwa/out/_next/static/{IVKr3AlRUVLKsw2fh7eXF → T1mBQqmkwKDLGtyisDCOd}/_ssgManifest.js +0 -0
@@ -306,13 +306,20 @@ import {
306
306
  } from './render/renderer.js';
307
307
  import { buildPromptFrameDividerRows } from '../display/prompt-frame-paint.js';
308
308
  import {
309
- drawTurnTypeaheadPromptRows,
310
309
  paintTurnTypeaheadEchoRow,
311
310
  resolveEssentialFrameCursorDecision,
312
311
  type EssentialFrameCursorDecision,
313
- type TurnTypeaheadPromptPaintSink,
314
- type TurnTypeaheadPromptRowsInput,
315
312
  } from './input/turn-typeahead-prompt.js';
313
+ import {
314
+ buildDashboardTurnTypeaheadPromptZone,
315
+ drawDashboardTurnTypeaheadPromptRows,
316
+ observeDashboardTurnTypeaheadPromptZone,
317
+ } from './turn-typeahead-prompt-zone.js';
318
+ export {
319
+ buildDashboardTurnTypeaheadPromptZone,
320
+ drawDashboardTurnTypeaheadPromptRows,
321
+ observeDashboardTurnTypeaheadPromptZone,
322
+ } from './turn-typeahead-prompt-zone.js';
316
323
  import { DashboardStateStore } from './runtime/state-store.js';
317
324
  import { perf } from '../perf-counters.js';
318
325
  import { createSearchModal, type SearchModalHandle, type SearchItem } from '../chat/search/modal.js';
@@ -882,7 +889,8 @@ import {
882
889
  refreshDirtyAsync as refreshGitDirtyAsync,
883
890
  refreshGitSnapshotAsync,
884
891
  } from '../git-fs/index.js';
885
- import { refreshSelfAmbientCache } from '../agent/self-ambient-cache.js';
892
+ import { createIdleGitPoll, dashboardIdleMs, gitDirtyRefreshIntervalMs } from '../git-fs/idle-refresh.js';
893
+ import { refreshSelfAmbientCache, selfAmbientKeepWarmIntervalMs } from '../agent/self-ambient-cache.js';
886
894
  import { getPty, listPty, requestPtyTakeover } from '../pty-shell/registry.js';
887
895
  import { listPtyManifestRowsAt } from '../pty-shell/pty-manifest.js';
888
896
  import { ptyManifestTargets } from '../domains/fleet.js';
@@ -1176,7 +1184,7 @@ export function registerDashboardCoreHostTools(host: Pick<PluginHost, 'registerH
1176
1184
  }
1177
1185
  import { registerDashboardPaneHostTools } from './panes/host-tools.js';
1178
1186
  import { type ThemeTokens } from '../theme/tokens.js';
1179
- import { resolveActiveTheme } from './render/theme-resolver.js';
1187
+ import { getActiveThemeName, resolveActiveTheme } from './render/theme-resolver.js';
1180
1188
  import { getTheme } from '../themes/index.js';
1181
1189
  import type { PaneFocus, PreviewSource, WorkingDirView } from '../workspace-types.js';
1182
1190
  import type { DisplayMouseEvent } from '../display/types.js';
@@ -1467,30 +1475,6 @@ export function resolveDashboardSlashSurfaceUx(
1467
1475
  : undefined;
1468
1476
  }
1469
1477
 
1470
- /** Dashboard draw entry for the input-prompt zone. Streaming redraws reach
1471
- * this production binding through the zone renderer below. */
1472
- export function drawDashboardTurnTypeaheadPromptRows(
1473
- input: TurnTypeaheadPromptRowsInput,
1474
- sink?: TurnTypeaheadPromptPaintSink,
1475
- ): string[] {
1476
- return drawTurnTypeaheadPromptRows(input, sink);
1477
- }
1478
-
1479
- /** Essential frames own the fallback prompt caret; Z-axis state only wins
1480
- * when a modal has made a visible claim. */
1481
- export function buildDashboardTurnTypeaheadPromptZone(input: TurnTypeaheadPromptRowsInput & {
1482
- suppressPromptArea: boolean;
1483
- }): LayoutZone {
1484
- return {
1485
- id: 'input-prompt',
1486
- height: input.frame.inputHeight,
1487
- render: (height, width) => {
1488
- if (input.suppressPromptArea) return Array.from({ length: height }, () => ' '.repeat(width));
1489
- return drawDashboardTurnTypeaheadPromptRows({ ...input, height, width });
1490
- },
1491
- };
1492
- }
1493
-
1494
1478
  /** The chat-main submit branch calls this before any model dispatch. Keeping
1495
1479
  * the decision here lets the dashboard test execute the same entry point. */
1496
1480
  export function resolveDashboardHarnessSubmitIntent(
@@ -1501,42 +1485,6 @@ export function resolveDashboardHarnessSubmitIntent(
1501
1485
  return routeDevHarnessSubmitIntent(resolveIntent(text, options));
1502
1486
  }
1503
1487
 
1504
- /** 프롬프트 zone 에 관측만 덧입힌다 — 렌더 산출은 `inner` 가 소유한다.
1505
- *
1506
- * ⭐ **왜 뽑았나**(무인 리뷰 must-fix · 2026-08-01): 종전엔 이 래퍼가 `zones.push({...})` 안에
1507
- * 인라인이라, 테스트가 `inner`(=`buildDashboardTurnTypeaheadPromptZone`)만 불러도 통과했다.
1508
- * ⇒ ***래퍼가 `inner.render` 를 부르는 것을 끊어도 검사가 침묵***했다. 이제 그 결선이 검사된다.
1509
- *
1510
- * ⛔⚠️ **여전히 검사 밖인 한 겹**: 이 함수의 반환이 실제로 `zones` 배열에 **push 되는지**는
1511
- * `showDashboard` 안의 지역 조립부라 단위 검사가 닿지 않는다. ***무한 후퇴이므로 여기서 경계를 긋는다*** —
1512
- * 그 한 겹은 **라이브 검증**(`dev --elanous --hold` ⊕ `pty snapshot`)이 맡는다. */
1513
- export function observeDashboardTurnTypeaheadPromptZone(
1514
- inner: LayoutZone,
1515
- deps: {
1516
- promptBottomRow: number;
1517
- state: { buffer: string; queuedSubmissions: string[] };
1518
- isDebugEnabled?: () => boolean;
1519
- log?: (category: string, event: string, data: Record<string, unknown>) => void;
1520
- },
1521
- ): LayoutZone {
1522
- return {
1523
- ...inner,
1524
- render: (height, width) => {
1525
- const rows = inner.render(height, width);
1526
- const enabled = deps.isDebugEnabled ? deps.isDebugEnabled() : debug.enabled;
1527
- if (deps.state.buffer && enabled) {
1528
- (deps.log ?? ((c, e, d) => debug.log(c, e, d)))('dashboard.turn-typeahead-prompt', 'dashboard-draw-prompt', {
1529
- row: deps.promptBottomRow,
1530
- text: rows.at(-1) ?? '',
1531
- bufferLength: deps.state.buffer.length,
1532
- queuedSubmissionCount: deps.state.queuedSubmissions.length,
1533
- });
1534
- }
1535
- return rows;
1536
- },
1537
- };
1538
- }
1539
-
1540
1488
  type DashboardFrameRenderer = (lines: string[], options: RenderOptions) => void;
1541
1489
 
1542
1490
  /** Compose coordinator-owned modal surfaces into the dashboard's single frame overlay. */
@@ -1915,6 +1863,20 @@ export function renderDashboardStatusLines(input: Omit<DashboardStatusLinesInput
1915
1863
  return buildDashboardStatusLines({ ...input, seatsNow });
1916
1864
  }
1917
1865
 
1866
+ /** The pending-input registry is process-local; a remote ACP loop cannot drain it. */
1867
+ export function activeDashboardTypeaheadSessionId(acpSessionId: string | null, daemonAttached: boolean): string | null {
1868
+ return daemonAttached ? null : acpSessionId;
1869
+ }
1870
+
1871
+ /** The streaming keyboard's production typeahead transition. */
1872
+ export function applyDashboardStreamingTypeaheadKey(
1873
+ state: Parameters<typeof applyTurnTypeaheadKey>[0],
1874
+ key: Parameters<typeof applyTurnTypeaheadKey>[1],
1875
+ isImmediate: Parameters<typeof applyTurnTypeaheadKey>[2],
1876
+ ): ReturnType<typeof applyTurnTypeaheadKey> {
1877
+ return applyTurnTypeaheadKey(state, key, isImmediate);
1878
+ }
1879
+
1918
1880
  export async function showDashboard(opts: ShowDashboardOptions = {}): Promise<DashboardAction> {
1919
1881
  let firstDashboardFrameRendered = false;
1920
1882
  await awaitGlobalPersonaLoad().catch(() => {});
@@ -2915,6 +2877,11 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
2915
2877
  // current value so log analysis can filter "what keys fired while
2916
2878
  // a turn was in flight".
2917
2879
  let streamingInFlight = false;
2880
+ let noteClipboardActivity: () => void = () => {};
2881
+ let noteClipboardBusyChange: () => void = () => {};
2882
+ let noteClipboardPanelState: (active: boolean, reason: string) => void = () => {};
2883
+ let dashboardAcpIsBusy: () => boolean = () => false;
2884
+ let lastDashboardInputAt = Date.now();
2918
2885
  /** 지금 턴의 escGate 중단 — 외부 `/stop`(TUI-STOP-INPUT-BYPASS)이 대기열을 건너뛰어 부른다. 턴 밖이면 null. */
2919
2886
  let currentTurnExternalStop: (() => void) | null = null;
2920
2887
  const resolveTmuxStatusLabel = (): string | null => {
@@ -3404,6 +3371,8 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
3404
3371
  getCwd: () => workingDir.cwd,
3405
3372
  notify: (line) => { chatLines.push(C.muted(line)); draw(); },
3406
3373
  });
3374
+ // Set only by the failed-turn callback and consumed by that turn's streaming cleanup.
3375
+ let autowakeTurnFailureRaw: string | null = null;
3407
3376
  const internalTurnYieldPort = wrapAgentWakePort(seatAutowake.wrapPort(internalTurnGate.port));
3408
3377
  // ⭐ H5 자기 예약 깨움(TUI-H5-SCHEDULE-WAKEUP) — 프로세스 안 타이머가 그 시각에 H2 문으로 한 턴을 청한다.
3409
3378
  // 직전 회차 판정 = 그 예약이 연 내부 턴이 아직 도나. 도구 등록은 아래 host tool 자리(하니스 자식 제외).
@@ -3416,7 +3385,6 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
3416
3385
  const acpSessionIdRef: { current: string | null } = { current: null };
3417
3386
  const adoptedAcpSessionIds = new Set<string>();
3418
3387
  let activeAcpSessionId: string | null = null;
3419
- const activeSessionIdForTypeahead = (): string | null => acpSessionIdRef.current;
3420
3388
  const paintTurnTypeaheadEcho = (): void => {
3421
3389
  const { rows: tr, cols: tc } = termSize();
3422
3390
  const pf = currentPromptFrame(tr);
@@ -4087,6 +4055,8 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
4087
4055
  // makes the "*N" suffix tick up within the same frame so the
4088
4056
  // user sees feedback for their own action immediately.
4089
4057
  // TUI-TYPING-LAG — async probe: `git status` must not block key input.
4058
+ lastDashboardInputAt = Date.now();
4059
+ lastGitDirtyProbeAt = lastDashboardInputAt;
4090
4060
  void refreshGitDirtyAsync(getSessionCwd(), { force: true })
4091
4061
  .then(() => { try { draw(); } catch { /* TUI torn down */ } }, () => { /* noop */ });
4092
4062
  });
@@ -4111,9 +4081,11 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
4111
4081
  // extras.
4112
4082
  // 3. SWD flip → dispose + re-wire (fresh repo root).
4113
4083
  let gitUnsub: (() => void) | null = null;
4084
+ let lastGitDirtyProbeAt = Date.now();
4114
4085
  const wireGitForSwd = (): void => {
4115
4086
  if (gitUnsub) { try { gitUnsub(); } catch {} gitUnsub = null; }
4116
4087
  const swd = getSessionCwd();
4088
+ lastGitDirtyProbeAt = Date.now();
4117
4089
  gitUnsub = subscribeGitChanges(swd, () => {
4118
4090
  try { draw(); } catch { /* noop */ }
4119
4091
  });
@@ -4151,17 +4123,18 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
4151
4123
  // the git snapshot (async subprocesses) and the self-ambient store scan (worker thread). A turn
4152
4124
  // then serves them from cache instead of rebuilding synchronously on the turn path. Both are
4153
4125
  // no-ops while the cached value is younger than the threshold; failures are fail-soft.
4126
+ const currentDashboardIdleMs = (): number =>
4127
+ dashboardIdleMs(Date.now(), lastDashboardInputAt, streamingInFlight || dashboardAcpIsBusy());
4154
4128
  const warmTurnPreambleCaches = (): void => {
4155
- try { void refreshGitSnapshotAsync(getSessionCwd(), { ifOlderThanMs: 30_000 }); } catch { /* noop */ }
4156
- try { void refreshSelfAmbientCache({}, { ifOlderThanMs: 25_000 }); } catch { /* noop */ }
4129
+ const ambientCacheTtlMs = selfAmbientKeepWarmIntervalMs(currentDashboardIdleMs());
4130
+ try { void refreshSelfAmbientCache({}, { ifOlderThanMs: ambientCacheTtlMs }); } catch { /* noop */ }
4157
4131
  };
4158
- warmTurnPreambleCaches();
4159
- const gitDirtyTimer: ReturnType<typeof setInterval> = setInterval(() => {
4160
- warmTurnPreambleCaches();
4132
+ const probeGitDirty = (minIntervalMs: number): void => {
4133
+ lastGitDirtyProbeAt = Date.now();
4161
4134
  try {
4162
4135
  const before = getGitStatusView(getSessionCwd());
4163
4136
  // TUI-TYPING-LAG — the 5s probe ran `git status` synchronously (130ms+, hundreds under load).
4164
- void refreshGitDirtyAsync(getSessionCwd(), { minIntervalMs: 4_000 }).then((after) => {
4137
+ void refreshGitDirtyAsync(getSessionCwd(), { minIntervalMs }).then((after) => {
4165
4138
  if (
4166
4139
  (before.dirty?.total ?? -1) !== (after.dirty?.total ?? -1) ||
4167
4140
  (before.aheadBehind?.ahead ?? -1) !== (after.aheadBehind?.ahead ?? -1)
@@ -4170,6 +4143,26 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
4170
4143
  }
4171
4144
  }, () => { /* noop */ });
4172
4145
  } catch { /* noop */ }
4146
+ };
4147
+ // CLASSIC-IDLE-GIT-POLL — no git children while idle (2 min without input); the next key warms once
4148
+ // off the input path (deferred) and polling resumes. `git-fs.idle poll-state` records each flip.
4149
+ const gitIdlePoll = createIdleGitPoll({
4150
+ idleMs: currentDashboardIdleMs,
4151
+ poll: (idleMs) => {
4152
+ try { void refreshGitSnapshotAsync(getSessionCwd(), { ifOlderThanMs: 30_000 }); } catch { /* noop */ }
4153
+ if (Date.now() - lastGitDirtyProbeAt < gitDirtyRefreshIntervalMs(idleMs)) return;
4154
+ probeGitDirty(gitDirtyRefreshIntervalMs(idleMs));
4155
+ },
4156
+ warm: () => {
4157
+ try { void refreshGitSnapshotAsync(getSessionCwd(), { ifOlderThanMs: 30_000 }); } catch { /* noop */ }
4158
+ probeGitDirty(0);
4159
+ },
4160
+ });
4161
+ warmTurnPreambleCaches();
4162
+ try { void refreshGitSnapshotAsync(getSessionCwd(), { ifOlderThanMs: 30_000 }); } catch { /* noop */ }
4163
+ const gitDirtyTimer: ReturnType<typeof setInterval> = setInterval(() => {
4164
+ warmTurnPreambleCaches();
4165
+ gitIdlePoll.tick();
4173
4166
  }, 5_000);
4174
4167
  (gitDirtyTimer as unknown as { unref?: () => void }).unref?.();
4175
4168
  // The running module's installed version, not the user's working directory, is the baseline.
@@ -4584,6 +4577,8 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
4584
4577
  };
4585
4578
  let pluginHost: PluginHost;
4586
4579
  let lastThemeLoadError = '';
4580
+ let lastThemeResolutionName: string | null = null;
4581
+ let lastPluginThemeAppliedDebugKey: string | null = null;
4587
4582
  let iulThemePreviewOverride: string | null = null;
4588
4583
  let lastHostChromePolicyDebugKey = '';
4589
4584
  const observeEssentialFrameCursor = createDashboardEssentialCursorObserver({
@@ -4598,9 +4593,26 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
4598
4593
  const raw = iulThemePreviewOverride
4599
4594
  ? { ...(getUserConfig().dashboard.theme as object ?? {}), active: iulThemePreviewOverride }
4600
4595
  : getUserConfig().dashboard.theme;
4596
+ const activeThemeName = getActiveThemeName(raw);
4597
+ if (activeThemeName !== lastThemeResolutionName) {
4598
+ lastThemeResolutionName = activeThemeName;
4599
+ lastPluginThemeAppliedDebugKey = null;
4600
+ }
4601
4601
  return resolveActiveTheme({
4602
4602
  raw,
4603
- loadPlugin: (id) => pluginHost?.loadThemeTokens(id) ?? null,
4603
+ loadPlugin: (id) => {
4604
+ const tokens = pluginHost?.loadThemeTokens(id) ?? null;
4605
+ if (!tokens) lastPluginThemeAppliedDebugKey = null;
4606
+ return tokens;
4607
+ },
4608
+ onPluginApplied: (event) => {
4609
+ const key = `${event.id}:${event.tokensCount}:${event.source}`;
4610
+ if (key === lastPluginThemeAppliedDebugKey) return;
4611
+ try {
4612
+ debug.log('tui.theme', 'plugin-theme-applied', event);
4613
+ lastPluginThemeAppliedDebugKey = key;
4614
+ } catch { /* observation is best-effort */ }
4615
+ },
4604
4616
  onPluginError: (message) => {
4605
4617
  if (lastThemeLoadError !== message) {
4606
4618
  lastThemeLoadError = message;
@@ -6049,6 +6061,8 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
6049
6061
  }
6050
6062
  };
6051
6063
  const syncCompanionPopups = (): void => {
6064
+ // CLASSIC-IDLE-CLIPBOARD: every clipboard open/close/dock path ends here — keep it the only gate.
6065
+ noteClipboardPanelState(companionPopupHost.isActive('clipboard'), companionPopupHost.isDocked('clipboard') ? 'panel-docked' : companionPopupHost.isOpen('clipboard') ? 'panel-open' : 'panel-close');
6052
6066
  const { cols, rows } = termSize();
6053
6067
  const workspaceHost = display.workspaceHostAPI();
6054
6068
  const ownerId = companionPopupHost.ownerId;
@@ -6857,7 +6871,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
6857
6871
  } catch { /* 승격 실패가 스트리밍을 막지 않는다 */ }
6858
6872
  return 'consumed';
6859
6873
  }
6860
- const r = applyTurnTypeaheadKey(turnTypeaheadRef.state, k, isStreamingImmediateSlash);
6874
+ const r = applyDashboardStreamingTypeaheadKey(turnTypeaheadRef.state, k, isStreamingImmediateSlash);
6861
6875
  if (r.consumed) {
6862
6876
  turnTypeaheadRef.state = r.state;
6863
6877
  if (r.submissionDisposition) {
@@ -6873,7 +6887,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
6873
6887
  // ⛔ H2 — 내부 턴 중의 사람 입력은 그 턴에 끼워 넣지 않는다(턴 끝 FIFO 로 기다린다).
6874
6888
  if (r.submissionDisposition === 'fifo' && !r.immediateSubmission && !internalTurnGate.isInternalTurnActive()) {
6875
6889
  const queuedText = turnTypeaheadRef.state.queuedSubmissions.at(-1);
6876
- const sid = activeSessionIdForTypeahead();
6890
+ const sid = activeDashboardTypeaheadSessionId(acpSessionIdRef.current, daemonAttached);
6877
6891
  if (queuedText && sid) {
6878
6892
  const queuedHistoryEntry = inputHistoryStore.record({
6879
6893
  text: queuedText,
@@ -7049,6 +7063,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
7049
7063
  };
7050
7064
 
7051
7065
  const cleanup = attachStreamingKeys(async (key) => {
7066
+ noteClipboardActivity();
7052
7067
  // ── Pre-dispatch gates ────────────────────────────────────
7053
7068
  //
7054
7069
  // These run BEFORE `routeInputEventAsync` because:
@@ -7146,6 +7161,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
7146
7161
  // ⛔ TUI-STALE-BUSY-MARKER — busy 는 «끄는 closure 를 돌려주기 직전»에 켠다. 위 준비(ESC 게이트·키 리스너)가
7147
7162
  // 던지면 호출자는 cleanup 을 못 받으므로, 먼저 켜 두면 아무도 못 끄는 busy 가 남는다(#37).
7148
7163
  streamingInFlight = true;
7164
+ noteClipboardBusyChange();
7149
7165
  reportTuiTurn('busy');
7150
7166
  const externalStop = (): void => { stopTurnViaEscGate(escGate); };
7151
7167
  currentTurnExternalStop = externalStop;
@@ -7164,8 +7180,11 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
7164
7180
  } finally {
7165
7181
  userScrolledDuringStream = false;
7166
7182
  streamingInFlight = false;
7183
+ noteClipboardBusyChange();
7167
7184
  reportTuiTurn('idle');
7168
- seatAutowake.noteTurnEnded();
7185
+ const failedTurnRaw = autowakeTurnFailureRaw;
7186
+ autowakeTurnFailureRaw = null;
7187
+ seatAutowake.noteTurnEnded({ sessionId: currentChatPersonaSessionId(), lastLine: chatLines.at(-1) ?? '', errorDetail: failedTurnRaw ?? undefined });
7169
7188
  }
7170
7189
  };
7171
7190
  };
@@ -7232,6 +7251,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
7232
7251
  const dashboardAcpChat = new DashboardAcpChat({
7233
7252
  cwd: () => workingDir.cwd,
7234
7253
  log: (msg) => pushLog('debug', ` [acp] ${msg}`),
7254
+ onBusyChange: () => noteClipboardBusyChange(),
7235
7255
  // Follow-up #9 — wrap the modal approver so BG records flip to
7236
7256
  // `waiting_for_confirmation` even when the peer (codex-acp /
7237
7257
  // gemini-cli) doesn't emit the `tool_call_update.status` field.
@@ -7241,6 +7261,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
7241
7261
  globalBackgroundManager(),
7242
7262
  ),
7243
7263
  });
7264
+ dashboardAcpIsBusy = () => dashboardAcpChat.isBusy();
7244
7265
  activeAcpRuntimeModel = () => dashboardAcpChat.activeRuntimeModel();
7245
7266
 
7246
7267
  // Obsidian vault browser (Phase O3). Shares the FsEntry shape and
@@ -12394,7 +12415,17 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
12394
12415
  // ticks every ~1.5s on Darwin and stores up to 50 unique text
12395
12416
  // snapshots. Stopped during dashboard teardown to avoid leaking
12396
12417
  // intervals if the host re-enters showDashboard.
12397
- const clipHistory: ClipboardHistory = startClipboardHistory({});
12418
+ // CLASSIC-IDLE-CLIPBOARD: dormant until the clipboard companion is open.
12419
+ const clipHistory: ClipboardHistory = startClipboardHistory({
12420
+ active: companionPopupHost.isActive('clipboard'),
12421
+ isBusy: () => streamingInFlight || dashboardAcpChat.isBusy(),
12422
+ });
12423
+ noteClipboardPanelState = (active, reason) => clipHistory.setActive(active, reason);
12424
+ noteClipboardActivity = () => {
12425
+ lastDashboardInputAt = Date.now();
12426
+ clipHistory.noteActivity();
12427
+ };
12428
+ noteClipboardBusyChange = () => clipHistory.noteBusyChange();
12398
12429
  process.once('beforeExit', () => { clipHistory.stop(); });
12399
12430
  // Re-render whenever the poller picks up a new entry — only when
12400
12431
  // we're actually showing the history viewer, otherwise the side-
@@ -15196,6 +15227,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
15196
15227
  const key: import('../tui.js').Key = wdAutoInput
15197
15228
  ? { name: CHAT_MAIN_AUTO_ENTRY_KEY_NAME, ctrl: false, shift: false }
15198
15229
  : await readKey();
15230
+ if (!wdAutoInput) { noteClipboardActivity(); gitIdlePoll.noteActivity('input'); }
15199
15231
  const helpModal = currentTransientTerminalModal('dashboard-help');
15200
15232
  if (key.name === 'escape' && helpModal) {
15201
15233
  helpModal.dispose();
@@ -18570,6 +18602,10 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
18570
18602
  settleEscAbortToolCall(escAbortToolState, toolCall);
18571
18603
  escHarnessSpacesByCallId.delete(toolCall.id);
18572
18604
  },
18605
+ onThought: (text) => {
18606
+ turnStreamRuntime.onThought?.(text);
18607
+ draw();
18608
+ },
18573
18609
  };
18574
18610
  },
18575
18611
  runTurnUsageRuntime: (usage) => {
@@ -18690,6 +18726,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
18690
18726
  warningLine: (message) => C.warning(`${ICONS.warning} ${message}`),
18691
18727
  pushErrorLine: (message) => { chatLines.push(C.error(`Error: ${message}`)); },
18692
18728
  pushFailureNotice: (notice, raw) => {
18729
+ autowakeTurnFailureRaw = raw;
18693
18730
  chatLines.push(C.warning(notice));
18694
18731
  detailViewerRuntime.stage('turn error', raw.split(/\r?\n/));
18695
18732
  },
@@ -95,6 +95,7 @@ export interface DashboardChatMainPlainTurnRuntimeDeps {
95
95
  onText(chunk: string, accumulated: string): void;
96
96
  onToolCall(call: unknown): void;
97
97
  onToolResult(call: unknown): void;
98
+ onThought?(text: string): void;
98
99
  getAssistantStart(): number;
99
100
  };
100
101
  runTurnUsageRuntime: (usage: unknown) => void;
@@ -117,6 +118,7 @@ export interface DashboardChatMainPlainTurnRuntimeDeps {
117
118
  onToolCall: (call: unknown) => void;
118
119
  onToolResult: (call: unknown) => void;
119
120
  onUsage: (usage: unknown) => void;
121
+ onThought?: (text: string) => void;
120
122
  }): Promise<unknown>;
121
123
  };
122
124
  autoTts: {
@@ -483,6 +485,7 @@ export async function runDashboardChatMainPlainTurn(
483
485
  onUsage: (usage) => {
484
486
  deps.runTurnUsageRuntime(usage);
485
487
  },
488
+ onThought: (text) => { turnStreamRuntime.onThought?.(text); },
486
489
  autoTts: deps.autoTts,
487
490
  voiceChat: deps.voiceChat,
488
491
  drainCooldownMs: userConfig.voice.tts.drainCooldownMs,
@@ -39,6 +39,7 @@ export interface DashboardPlainTurnAcpSend {
39
39
  onToolCall: (call: unknown) => void;
40
40
  onToolResult: (call: unknown) => void;
41
41
  onUsage: (usage: unknown) => void;
42
+ onThought?: (text: string) => void;
42
43
  }): Promise<unknown>;
43
44
  }
44
45
 
@@ -55,6 +56,8 @@ export interface DashboardPlainTurnStreamDeps {
55
56
  onToolCall: (call: unknown) => void;
56
57
  onToolResult: (call: unknown) => void;
57
58
  onUsage: (usage: unknown) => void;
59
+ /** TUI-TURN-NARRATION — 추론 요약 문단(선택). */
60
+ onThought?: (text: string) => void;
58
61
 
59
62
  /** Auto-TTS hooks. `pushChunk` is fired on every text delta;
60
63
  * `commit` / `cancel` are called by the settle sink in the
@@ -173,6 +176,7 @@ export async function runDashboardPlainTurnStream(
173
176
  deps.onToolResult(call);
174
177
  },
175
178
  onUsage: (usage) => deps.onUsage(usage),
179
+ ...(deps.onThought ? { onThought: (text: string) => deps.onThought!(text) } : {}),
176
180
  });
177
181
  settled = deps.abortCtrl.signal.aborted ? 'cancelled' : 'end_turn';
178
182
  // Return the cumulative full response so commit / metrics / autocopy
@@ -92,7 +92,16 @@ export type SeatAutowakeSkipReason =
92
92
  | 'nothing-pending'
93
93
  | 'human-recent'
94
94
  | 'same-order'
95
- | 'cap';
95
+ | 'cap'
96
+ | 'terminal-codex-400';
97
+
98
+ /** The rendered error line is captured before the turn footer shortens it. */
99
+ export interface SeatAutowakeTurnResult {
100
+ sessionId: string | null;
101
+ lastLine: string;
102
+ /** Raw turn failure staged for /detail open when the visible line is condensed. */
103
+ errorDetail?: string;
104
+ }
96
105
 
97
106
  export interface SeatAutowakeInput {
98
107
  /** 자리 TUI 의 자리(대문자) — 자리 아님이면 null. */
@@ -187,7 +196,7 @@ export interface SeatAutowakeDeps {
187
196
 
188
197
  export interface SeatAutowakeController {
189
198
  /** 모델 턴이 끝났다(스트리밍 정리 지점) — 다음 입력칸 마운트에서 한 번 잰다. */
190
- noteTurnEnded(): void;
199
+ noteTurnEnded(result?: SeatAutowakeTurnResult): void;
191
200
  /** 입력칸이 마운트됐다 — 턴 끝이 무장돼 있으면 판정하고, 남은 일이 있으면 H2 로 연다. */
192
201
  check(): SeatAutowakeDecision & { opened?: boolean; rejected?: string };
193
202
  /** H2 의 yield port 를 감싸 «마운트 = 판정 시점»으로 잇는다(입력칸 무접촉). */
@@ -229,6 +238,9 @@ export function createSeatAutowake(deps: SeatAutowakeDeps): SeatAutowakeControll
229
238
  let lastOpenedAt = 0;
230
239
  let capNotified = false;
231
240
  let recheckArmed = false;
241
+ let activeSessionId: string | null = null;
242
+ let lastOrphanFailure: { callId: string; count: number } | null = null;
243
+ let terminalCallId: string | null = null;
232
244
 
233
245
  const check: SeatAutowakeController['check'] = () => {
234
246
  const detection = detect(deps.getCwd());
@@ -256,6 +268,14 @@ export function createSeatAutowake(deps: SeatAutowakeDeps): SeatAutowakeControll
256
268
  seat, enabled, turnEnded, unread, queue, now: t, lastHumanKeyAt: humanAt,
257
269
  humanQuietMs: quietMs, lastFingerprint, consecutive, consecutiveCap: deps.consecutiveCap,
258
270
  });
271
+ if (terminalCallId && activeSessionId) {
272
+ turnEnded = false;
273
+ log('tui.autowake', 'terminal-blocked', {
274
+ seat, sessionId: activeSessionId, errorKind: 'codex-orphan-tool-output-400',
275
+ callId: terminalCallId, recommendedAction: '/session new',
276
+ });
277
+ return { action: 'skip', reason: 'terminal-codex-400', unread: decision.unread, queue: decision.queue };
278
+ }
259
279
  if (decision.action === 'skip' && decision.reason === 'not-turn-end') return decision;
260
280
  const base = {
261
281
  seat,
@@ -301,7 +321,40 @@ export function createSeatAutowake(deps: SeatAutowakeDeps): SeatAutowakeControll
301
321
  };
302
322
 
303
323
  return {
304
- noteTurnEnded() { turnEnded = true; },
324
+ noteTurnEnded(result) {
325
+ turnEnded = true;
326
+ if (!result) return;
327
+ if (result.sessionId !== activeSessionId) {
328
+ activeSessionId = result.sessionId;
329
+ lastOrphanFailure = null;
330
+ terminalCallId = null;
331
+ lastFingerprint = null;
332
+ consecutive = 0;
333
+ }
334
+ // The production failed-turn path renders this exact 400 notice and
335
+ // stages its raw detail. Ordinary assistant text can quote the same API
336
+ // error, so it must never be parsed as a failed turn by itself.
337
+ const is400Notice = result.lastLine.includes('모델 API 가 요청을 400 으로 거절')
338
+ && result.lastLine.includes('원문 /detail open');
339
+ const match = is400Notice
340
+ ? /\bCodex API 400\b[^\n]*?No tool call found for function call output with call_id\s+([\w-]+)/iu.exec(result.errorDetail ?? '')
341
+ : null;
342
+ if (!match || !activeSessionId) {
343
+ lastOrphanFailure = null;
344
+ return;
345
+ }
346
+ const callId = match[1]!;
347
+ lastOrphanFailure = lastOrphanFailure?.callId === callId
348
+ ? { callId, count: lastOrphanFailure.count + 1 } : { callId, count: 1 };
349
+ if (lastOrphanFailure.count < 2 || terminalCallId) return;
350
+ terminalCallId = callId;
351
+ log('tui.autowake', 'terminal', {
352
+ seat: detect(deps.getCwd())?.seat ?? null,
353
+ sessionId: activeSessionId, errorKind: 'codex-orphan-tool-output-400',
354
+ callId, recommendedAction: '/session new',
355
+ });
356
+ deps.notify?.(`⏹ Codex 400 자동 재개 중단 · 세션 ${activeSessionId} · call_id ${callId} · /session new 로 새 세션을 시작하세요`);
357
+ },
305
358
  check,
306
359
  wrapPort(port) {
307
360
  return {
@@ -33,6 +33,12 @@ import { getTheme } from '../../themes/index.js';
33
33
  // same shape `pluginHost.loadThemeTokens` produces — not a full ThemeTokens.
34
34
  export type PluginThemeLoader = (id: string) => ThemeTokenInput | null | undefined;
35
35
 
36
+ export interface PluginThemeAppliedEvent {
37
+ id: string;
38
+ tokensCount: number;
39
+ source: 'plugin';
40
+ }
41
+
36
42
  export interface ResolveActiveThemeOptions {
37
43
  /** Raw `dashboard.theme` value from user-config. Shape is flexible:
38
44
  * `null` | `string` | `{ active: string, ... }` | `{ tokens: {...} }`. */
@@ -44,17 +50,19 @@ export interface ResolveActiveThemeOptions {
44
50
  * (so a broken plugin doesn't crash the dashboard) but reported
45
51
  * here for visibility. */
46
52
  onPluginError?: (message: string) => void;
53
+ /** Called after plugin tokens have been merged into the resolved theme. */
54
+ onPluginApplied?: (event: PluginThemeAppliedEvent) => void;
47
55
  }
48
56
 
49
57
  /** Resolve the active dashboard theme from user-config, with preset
50
58
  * + plugin + default fallback layers. Pure function — no I/O. */
51
59
  export function resolveActiveTheme(opts: ResolveActiveThemeOptions): ThemeTokens {
52
- const { raw, loadPlugin, onPluginError } = opts;
60
+ const { raw, loadPlugin, onPluginError, onPluginApplied } = opts;
53
61
 
54
62
  // Extract active name + user overrides from the raw user-config
55
63
  // value. The config shape evolved over time — handle all known
56
64
  // forms defensively.
57
- const activeName = extractActiveName(raw);
65
+ const activeName = getActiveThemeName(raw);
58
66
  const rawOverrides: ThemeTokenInput | undefined = extractOverrides(raw);
59
67
 
60
68
  // Branch 1: preset registry hit.
@@ -70,10 +78,20 @@ export function resolveActiveTheme(opts: ResolveActiveThemeOptions): ThemeTokens
70
78
  try {
71
79
  const contributed = loadPlugin(activeName);
72
80
  if (contributed) {
73
- return mergeThemeTokens(
81
+ const resolved = mergeThemeTokens(
74
82
  mergeThemeTokens(DEFAULT_THEME_TOKENS, contributed),
75
83
  rawOverrides ?? {},
76
84
  );
85
+ try {
86
+ onPluginApplied?.({
87
+ id: activeName,
88
+ tokensCount: countTokenLeaves(contributed),
89
+ source: 'plugin',
90
+ });
91
+ } catch {
92
+ // Observation failures must not discard an already-resolved theme.
93
+ }
94
+ return resolved;
77
95
  }
78
96
  } catch (err: unknown) {
79
97
  const message =
@@ -86,7 +104,18 @@ export function resolveActiveTheme(opts: ResolveActiveThemeOptions): ThemeTokens
86
104
  return resolveThemeTokens(raw);
87
105
  }
88
106
 
89
- function extractActiveName(raw: unknown): string | null {
107
+ function countTokenLeaves(value: unknown, isRoot = true): number {
108
+ if (value === null || value === undefined) return 0;
109
+ if (typeof value !== 'object') return 1;
110
+ if (Array.isArray(value)) {
111
+ return value.reduce((count, item) => count + countTokenLeaves(item, false), 0);
112
+ }
113
+ return Object.entries(value as Record<string, unknown>)
114
+ .filter(([key]) => !isRoot || key !== 'name')
115
+ .reduce((count, [, item]) => count + countTokenLeaves(item, false), 0);
116
+ }
117
+
118
+ export function getActiveThemeName(raw: unknown): string | null {
90
119
  if (typeof raw === 'string') return raw.trim() || null;
91
120
  if (raw && typeof raw === 'object' && !Array.isArray(raw)) {
92
121
  const active = (raw as Record<string, unknown>).active;
@@ -84,7 +84,7 @@ function buildCardMessages(cwd: string, deps: SeatBootDeps): { messages: LLMMess
84
84
  const content =
85
85
  `## 자리 부트 카드 — 너는 이 작업 디렉터리의 ${detection.seat} 자리에서 일한다\n` +
86
86
  `(판정: ${detection.source === 'cwd' ? `cwd 의 /seats/${detection.seat}` : 'COORD_ID'} · 세션 시작 스냅샷 ${at} · 이후 바뀐 값은 다시 조회하라)\n` +
87
- `사람이 다른 일을 먼저 시키지 않았다면, 첫 답에서 자리와 안 읽은 우편 수를 짚고 처리할 일을 제안하라.\n\n` +
87
+ `사람이 다른 일을 먼저 시키지 않았다면, 첫 답에서 자리 이름·'자리 역할' 절의 역할·안 읽은 우편 수를 각각 명시하고 처리할 일을 제안하라. 역할이 미관측이면 추측하지 말고 미관측이라고 말하라.\n\n` +
88
88
  card;
89
89
  return {
90
90
  messages: [{ role: 'system', content }],
@@ -0,0 +1,48 @@
1
+ import type { SurfaceUx } from '../../agent/surface-ux/types.js';
2
+ import type { AskUserQuestionRequest } from '../../ask-user-question/types.js';
3
+ import { DASHBOARD_CLARIFICATION_REQUEST } from '../../esc-abort-gate.js';
4
+ import type { GoalDocumentClarification } from '../../self-implement/goal-author-clarification.js';
5
+
6
+ /**
7
+ * Converts the line-oriented self-dev clarification seam into the existing
8
+ * structured SurfaceUx question contract. A missing, cancelled, or failed
9
+ * surface answer becomes an empty line, which preserves clarification's
10
+ * existing "unanswered → deferred" behavior without exposing answer text to
11
+ * the observation payload emitted by SurfaceUx.
12
+ */
13
+ export async function readDashboardAskClarification(
14
+ clarification: GoalDocumentClarification,
15
+ surfaceUx: Pick<SurfaceUx, 'question'> | undefined,
16
+ notify?: (line: string) => void,
17
+ ): Promise<string> {
18
+ if (!surfaceUx) return '';
19
+ const request: AskUserQuestionRequest = {
20
+ questions: [{
21
+ id: clarification.questionId,
22
+ header: 'Clarify goal',
23
+ question: clarification.question,
24
+ options: clarification.options.map((option) => ({
25
+ label: option.label,
26
+ description: option.description,
27
+ })),
28
+ includeOther: clarification.includeOther,
29
+ }],
30
+ };
31
+ Object.defineProperty(request, DASHBOARD_CLARIFICATION_REQUEST, { value: true });
32
+ try {
33
+ const pending = surfaceUx.question(request);
34
+ const id = clarification.questionId;
35
+ notify?.('하니스가 묻는다 — 창에서 고르거나 Esc 로 답 없이 진행');
36
+ const result = await pending;
37
+ if (!result || result.cancelled) return '';
38
+ const answer = result.answers[id];
39
+ const selectedLabel = Array.isArray(answer) ? answer[0] : answer;
40
+ const optionIndex = clarification.options.findIndex((option) => option.label === selectedLabel);
41
+ if (optionIndex >= 0) return String(optionIndex);
42
+ const other = clarification.includeOther ? result.otherText?.[id]?.trim() : '';
43
+ return other || '';
44
+ } catch {
45
+ return '';
46
+ }
47
+ }
48
+