elanous 0.2.38 → 0.2.40

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 (615) 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/{RrjXTwz-urRAbChP1bX02 → HjeK7zONHfR7op1hKXp4k}/_buildManifest.js +1 -1
  4. package/apps/pwa/out/_next/static/chunks/{7954.4f7a8832663ee979.js → 1060.014f1f01a17aec26.js} +1 -1
  5. package/apps/pwa/out/_next/static/chunks/{8911.bf5e712acb25fb6c.js → 1281.d81877e35b9068f4.js} +1 -1
  6. package/apps/pwa/out/_next/static/chunks/{2104.70e086d5174a4736.js → 1350.59f40e39e02d91b1.js} +1 -1
  7. package/apps/pwa/out/_next/static/chunks/1415.79821ec7ae99acdb.js +1 -0
  8. package/apps/pwa/out/_next/static/chunks/1452.162bb2d9d699e82a.js +1 -0
  9. package/apps/pwa/out/_next/static/chunks/147.f92f63bbc5e85fa5.js +286 -0
  10. package/apps/pwa/out/_next/static/chunks/1537-6bb97b5214928ea9.js +1 -0
  11. package/apps/pwa/out/_next/static/chunks/1661.fb425a1d8a065b72.js +149 -0
  12. package/apps/pwa/out/_next/static/chunks/1671-1c22b40b50b208f2.js +1 -0
  13. package/apps/pwa/out/_next/static/chunks/1758.0204d3f48783c49d.js +90 -0
  14. package/apps/pwa/out/_next/static/chunks/1806.027bf78b6a94d340.js +104 -0
  15. package/apps/pwa/out/_next/static/chunks/2047.8f23e210995d4548.js +2 -0
  16. package/apps/pwa/out/_next/static/chunks/2061-7f2bbc53ae96c88b.js +1 -0
  17. package/apps/pwa/out/_next/static/chunks/{1632.7d87f998e714bede.js → 2066.a77257c8c350770a.js} +1 -1
  18. package/apps/pwa/out/_next/static/chunks/2096-a938496bc996dcbd.js +1 -0
  19. package/apps/pwa/out/_next/static/chunks/{8019.21ca554a821dad01.js → 2177.df8547f9d7215c4e.js} +3 -3
  20. package/apps/pwa/out/_next/static/chunks/2200-9a453b8f99687d49.js +1 -0
  21. package/apps/pwa/out/_next/static/chunks/{3528.e4b8ab70d339f965.js → 2226.2cf61ec781827219.js} +2 -2
  22. package/apps/pwa/out/_next/static/chunks/2281-b8cede695c6c650e.js +1 -0
  23. package/apps/pwa/out/_next/static/chunks/{6493.27ad77de7aac7966.js → 2499.02fbfd18126c10c0.js} +1 -1
  24. package/apps/pwa/out/_next/static/chunks/{7628.6b16863ac3972333.js → 2522.f2766b76d22c8bdf.js} +1 -1
  25. package/apps/pwa/out/_next/static/chunks/{3086.fb14b60ce98b53d3.js → 2566.beaffc3a5e1fcd2e.js} +1 -1
  26. package/apps/pwa/out/_next/static/chunks/{9299.24e2a7d9b6d1f91b.js → 261.0d471e8aded799f3.js} +3 -3
  27. package/apps/pwa/out/_next/static/chunks/2615.3c9738153de3ef3f.js +1 -0
  28. package/apps/pwa/out/_next/static/chunks/2727.e703d99ac414916d.js +1 -0
  29. package/apps/pwa/out/_next/static/chunks/2752.7904b8df0254d0ae.js +27 -0
  30. package/apps/pwa/out/_next/static/chunks/2762-5051a862dfa40e99.js +1 -0
  31. package/apps/pwa/out/_next/static/chunks/2767-31784bfedf8e245d.js +1 -0
  32. package/apps/pwa/out/_next/static/chunks/2774-719820e3f5b2a3eb.js +1 -0
  33. package/apps/pwa/out/_next/static/chunks/2812-f016aa0dda149287.js +1 -0
  34. package/apps/pwa/out/_next/static/chunks/2829-734fe8bf2eee7347.js +1 -0
  35. package/apps/pwa/out/_next/static/chunks/311-32dcac79970985e8.js +1 -0
  36. package/apps/pwa/out/_next/static/chunks/3175-f93f7495cd28253c.js +1 -0
  37. package/apps/pwa/out/_next/static/chunks/3184.8da993f5502d2140.js +1 -0
  38. package/apps/pwa/out/_next/static/chunks/3231-d7c981db0ff8bdcc.js +1 -0
  39. package/apps/pwa/out/_next/static/chunks/3250.151309c5176d6b4b.js +1 -0
  40. package/apps/pwa/out/_next/static/chunks/{7524.ce973525d30b3d52.js → 3330.7443183b7e6fdbdf.js} +1 -1
  41. package/apps/pwa/out/_next/static/chunks/3517.a5aa1797a9dbf2ee.js +1 -0
  42. package/apps/pwa/out/_next/static/chunks/3567-45f676877ed9e8a5.js +1 -0
  43. package/apps/pwa/out/_next/static/chunks/{3124-561f7f037943cde2.js → 3746-f80a78f220bf37b5.js} +1 -1
  44. package/apps/pwa/out/_next/static/chunks/3819.8a1de79b2e8c7298.js +24 -0
  45. package/apps/pwa/out/_next/static/chunks/39.9b37b0be4c128a83.js +77 -0
  46. package/apps/pwa/out/_next/static/chunks/{bb6987f9.3647e1a23b0e3217.js → 3b355b3d.6f73c98bf6f9c749.js} +1 -1
  47. package/apps/pwa/out/_next/static/chunks/4023.a19045970a9ce16a.js +36 -0
  48. package/apps/pwa/out/_next/static/chunks/{8994d93e.33ba491f95345fc2.js → 409c787b.e48c5bec8ec10456.js} +1 -1
  49. package/apps/pwa/out/_next/static/chunks/{5041-5aada92ca215ffdd.js → 413-24c8284bda08241d.js} +1 -1
  50. package/apps/pwa/out/_next/static/chunks/4135.e45d6ebc29e20647.js +1 -0
  51. package/apps/pwa/out/_next/static/chunks/4283.65502f5d0e6ff6c0.js +287 -0
  52. package/apps/pwa/out/_next/static/chunks/4305-4e28fa92a7b34a5b.js +1 -0
  53. package/apps/pwa/out/_next/static/chunks/4335-50efa61fd7613142.js +1 -0
  54. package/apps/pwa/out/_next/static/chunks/4351.0f37a6db2b34d50b.js +1 -0
  55. package/apps/pwa/out/_next/static/chunks/{5638.107314dc479e2f37.js → 470.51a72a2348306455.js} +2 -2
  56. package/apps/pwa/out/_next/static/chunks/4720.ecbd1693fa151068.js +1 -0
  57. package/apps/pwa/out/_next/static/chunks/{8487.291666583bebe640.js → 4769.9fd582071301f382.js} +1 -1
  58. package/apps/pwa/out/_next/static/chunks/{8509.3a54d4e61893d7cb.js → 483.725e4a61be922788.js} +1 -1
  59. package/apps/pwa/out/_next/static/chunks/{9fe1b809.738da85c8b17e3fb.js → 4864a2ca.1c1c280a7772c5e5.js} +1 -1
  60. package/apps/pwa/out/_next/static/chunks/4969-4b209d7307410c00.js +1 -0
  61. package/apps/pwa/out/_next/static/chunks/5068-c7f53862f83c0917.js +1 -0
  62. package/apps/pwa/out/_next/static/chunks/5315.bc96711c24dfefe2.js +74 -0
  63. package/apps/pwa/out/_next/static/chunks/{8879.ac06755bcf3e44a1.js → 5383.bdfa5d886e39a826.js} +1 -1
  64. package/apps/pwa/out/_next/static/chunks/{6142.913b44e260a3f925.js → 5436.fdf6fa8ae3e9588d.js} +1 -1
  65. package/apps/pwa/out/_next/static/chunks/5542.efbf14f16baed4dd.js +1 -0
  66. package/apps/pwa/out/_next/static/chunks/5622.94893f5aea7185d0.js +1 -0
  67. package/apps/pwa/out/_next/static/chunks/5644.8f401a25601d05fc.js +1 -0
  68. package/apps/pwa/out/_next/static/chunks/5658.35f70eb9871a54bf.js +1 -0
  69. package/apps/pwa/out/_next/static/chunks/5721.7bdc0e904c76ab51.js +8 -0
  70. package/apps/pwa/out/_next/static/chunks/5790-eef0ca20884a6bdf.js +1 -0
  71. package/apps/pwa/out/_next/static/chunks/5802.ef0d8598ca68fe84.js +62 -0
  72. package/apps/pwa/out/_next/static/chunks/5890.fb974729788dcb71.js +1 -0
  73. package/apps/pwa/out/_next/static/chunks/5924.5ef25cddd36d5dbf.js +1 -0
  74. package/apps/pwa/out/_next/static/chunks/5979-e59c099ebf8d1f35.js +1 -0
  75. package/apps/pwa/out/_next/static/chunks/6020.714cfeada2315e2e.js +94 -0
  76. package/apps/pwa/out/_next/static/chunks/6027-dfe0349d8c50f698.js +1 -0
  77. package/apps/pwa/out/_next/static/chunks/{7161-8f22db3ec5ed005e.js → 6051-0ae955eedb10adb9.js} +3 -3
  78. package/apps/pwa/out/_next/static/chunks/6178.bc4730c86cf74536.js +1 -0
  79. package/apps/pwa/out/_next/static/chunks/{3291.f6c1005387d514bd.js → 6257.c0037b8949239f5e.js} +2 -2
  80. package/apps/pwa/out/_next/static/chunks/6273.d808b0dcb3c2b155.js +1 -0
  81. package/apps/pwa/out/_next/static/chunks/6292.6ef1df64fa6a4c8a.js +1 -0
  82. package/apps/pwa/out/_next/static/chunks/647-af8dd920ba46533c.js +1 -0
  83. package/apps/pwa/out/_next/static/chunks/6541-170dc5c59e135c0c.js +1 -0
  84. package/apps/pwa/out/_next/static/chunks/6624.981ef7caeb680560.js +32 -0
  85. package/apps/pwa/out/_next/static/chunks/6742-a1ad4a94ba7bc37a.js +1 -0
  86. package/apps/pwa/out/_next/static/chunks/{5203.51e5d8b5f1dcfe53.js → 6749.0744ce6eb08d40e9.js} +3 -3
  87. package/apps/pwa/out/_next/static/chunks/6836-493dc55c39187949.js +1 -0
  88. package/apps/pwa/out/_next/static/chunks/6856-53ac421c06039a18.js +1 -0
  89. package/apps/pwa/out/_next/static/chunks/{1938.0e6c60ee91c4d7f5.js → 6908.06008c67f6380ea9.js} +2 -2
  90. package/apps/pwa/out/_next/static/chunks/6915.096931864206f522.js +1 -0
  91. package/apps/pwa/out/_next/static/chunks/6925.5e181fb7dcf90193.js +1 -0
  92. package/apps/pwa/out/_next/static/chunks/{de8b930d.d94c0f42acf807fc.js → 6cc1d1d6.9a98dd4622f1afc6.js} +1 -1
  93. package/apps/pwa/out/_next/static/chunks/7203-800e11037adc41eb.js +1 -0
  94. package/apps/pwa/out/_next/static/chunks/7219-15bdd9a80661af8e.js +1 -0
  95. package/apps/pwa/out/_next/static/chunks/7279.6170f591105936bb.js +93 -0
  96. package/apps/pwa/out/_next/static/chunks/7349-373165c7fbdcc3df.js +1 -0
  97. package/apps/pwa/out/_next/static/chunks/7514-a533ba0ca1cae4f4.js +1 -0
  98. package/apps/pwa/out/_next/static/chunks/7515.1ad6efe157fa4448.js +1 -0
  99. package/apps/pwa/out/_next/static/chunks/7521.d919cc1fab80c1d9.js +24 -0
  100. package/apps/pwa/out/_next/static/chunks/7538.90e97bbdf9178cff.js +1 -0
  101. package/apps/pwa/out/_next/static/chunks/7611.85f045bf232053ac.js +1 -0
  102. package/apps/pwa/out/_next/static/chunks/7825-39203196a12579b2.js +1 -0
  103. package/apps/pwa/out/_next/static/chunks/7869.5e1a9a12fd70d6c7.js +1 -0
  104. package/apps/pwa/out/_next/static/chunks/8086.1ab9103c41be884f.js +1 -0
  105. package/apps/pwa/out/_next/static/chunks/8099.1cccf31c1baa7e1c.js +1 -0
  106. package/apps/pwa/out/_next/static/chunks/8179-e61fffbdb70f1152.js +1 -0
  107. package/apps/pwa/out/_next/static/chunks/8265.bdeb991b34db6a06.js +1 -0
  108. package/apps/pwa/out/_next/static/chunks/{1026-44010f405704050c.js → 8272-025653884f9645d2.js} +1 -1
  109. package/apps/pwa/out/_next/static/chunks/{5307.d7328020227880c2.js → 8357.1aaa713b052a78b1.js} +4 -4
  110. package/apps/pwa/out/_next/static/chunks/8638-e42615f2166165b5.js +1 -0
  111. package/apps/pwa/out/_next/static/chunks/{4199-f7c6eb40cd0322f8.js → 8639-92c11d069792429e.js} +1 -1
  112. package/apps/pwa/out/_next/static/chunks/8691.54e22831d5e8ccf8.js +1 -0
  113. package/apps/pwa/out/_next/static/chunks/8d173e38.18a2f7b4e1848bdb.js +1 -0
  114. package/apps/pwa/out/_next/static/chunks/9069.657590a84afb8fac.js +41 -0
  115. package/apps/pwa/out/_next/static/chunks/9125-ae588d88a0293b93.js +1 -0
  116. package/apps/pwa/out/_next/static/chunks/9175.2de5209a5ce6f68a.js +1 -0
  117. package/apps/pwa/out/_next/static/chunks/9184.45afbf44fec87574.js +1 -0
  118. package/apps/pwa/out/_next/static/chunks/{eaad0cba.771200940c529df7.js → 9189505a.980427ac048c8c60.js} +1 -1
  119. package/apps/pwa/out/_next/static/chunks/9311.f9f641a46a508611.js +1 -0
  120. package/apps/pwa/out/_next/static/chunks/9371-a6fee8378ebfa3ee.js +1 -0
  121. package/apps/pwa/out/_next/static/chunks/9421-3aa9ff4fa7f63d8a.js +1 -0
  122. package/apps/pwa/out/_next/static/chunks/9992.07ce73c10bd5e6a1.js +79 -0
  123. package/apps/pwa/out/_next/static/chunks/app/_not-found/page-76394dc618d322c8.js +1 -0
  124. package/apps/pwa/out/_next/static/chunks/app/approvals/page-1b948637c37b3abd.js +1 -0
  125. package/apps/pwa/out/_next/static/chunks/app/autopilot/page-c63400f1bcf3e47c.js +1 -0
  126. package/apps/pwa/out/_next/static/chunks/app/board/page-95d0957267819586.js +1 -0
  127. package/apps/pwa/out/_next/static/chunks/app/botlab/{page-866aac5ff226a7f3.js → page-ba957ff875a026a0.js} +1 -1
  128. package/apps/pwa/out/_next/static/chunks/app/bots/page-bb6fd0714879cb87.js +1 -0
  129. package/apps/pwa/out/_next/static/chunks/app/ceo/page-8f9038520d2acbef.js +1 -0
  130. package/apps/pwa/out/_next/static/chunks/app/chat/page-d4b48397e05fce2c.js +1 -0
  131. package/apps/pwa/out/_next/static/chunks/app/consult/page-72d5744245dc0c27.js +1 -0
  132. package/apps/pwa/out/_next/static/chunks/app/control/page-37625dc8300fa43a.js +1 -0
  133. package/apps/pwa/out/_next/static/chunks/app/decisions/page-fbef9d160272dbc1.js +1 -0
  134. package/apps/pwa/out/_next/static/chunks/app/design-check/page-58424168df84928e.js +1 -0
  135. package/apps/pwa/out/_next/static/chunks/app/editor/page-72c12ba430ac57c0.js +1 -0
  136. package/apps/pwa/out/_next/static/chunks/app/exec/page-d53f3e9ed806d7e0.js +1 -0
  137. package/apps/pwa/out/_next/static/chunks/app/field/page-4d2fbd45feee0829.js +1 -0
  138. package/apps/pwa/out/_next/static/chunks/app/healthz/route-76394dc618d322c8.js +1 -0
  139. package/apps/pwa/out/_next/static/chunks/app/inside/page-8783dc0ed7590a2c.js +1 -0
  140. package/apps/pwa/out/_next/static/chunks/app/intake/page-3706cb390606e930.js +1 -0
  141. package/apps/pwa/out/_next/static/chunks/app/layout-9b0a86598e0111fd.js +1 -0
  142. package/apps/pwa/out/_next/static/chunks/app/live/page-4edb8df90f4537ce.js +1 -0
  143. package/apps/pwa/out/_next/static/chunks/app/live-run/page-83d27757e2b8060a.js +1 -0
  144. package/apps/pwa/out/_next/static/chunks/app/loops/page-47398b9ba1cc5e1b.js +1 -0
  145. package/apps/pwa/out/_next/static/chunks/app/market/page-fb86f55cfe2e681d.js +1 -0
  146. package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-e22345fc8fd47b1b.js +1 -0
  147. package/apps/pwa/out/_next/static/chunks/app/morning/page-fca2e59a81744d9e.js +1 -0
  148. package/apps/pwa/out/_next/static/chunks/app/not-found-6e96bda63100b31e.js +1 -0
  149. package/apps/pwa/out/_next/static/chunks/app/observatory/page-4d17ad8e0db8cea4.js +1 -0
  150. package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-121f92766c33beaa.js +1 -0
  151. package/apps/pwa/out/_next/static/chunks/app/ops/release/page-43f14212c545f92d.js +1 -0
  152. package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-ccec2023e7a974ec.js +1 -0
  153. package/apps/pwa/out/_next/static/chunks/app/outputs/page-b04f33f548b89a94.js +1 -0
  154. package/apps/pwa/out/_next/static/chunks/app/page-c8792823c0917021.js +1 -0
  155. package/apps/pwa/out/_next/static/chunks/app/reflection/page-8c0e32782ceef4cb.js +1 -0
  156. package/apps/pwa/out/_next/static/chunks/app/scheduler/page-94bd3922eb230ce8.js +1 -0
  157. package/apps/pwa/out/_next/static/chunks/app/sessions/page-bca565887bafa03c.js +1 -0
  158. package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-ac1dffafe649fc6c.js +1 -0
  159. package/apps/pwa/out/_next/static/chunks/app/settings/page-52374edb5e23e455.js +1 -0
  160. package/apps/pwa/out/_next/static/chunks/app/setup/done/page-ad4ebca120d43ca7.js +1 -0
  161. package/apps/pwa/out/_next/static/chunks/app/setup/layout-76394dc618d322c8.js +1 -0
  162. package/apps/pwa/out/_next/static/chunks/app/setup/page-718b89ce4b4ae4e4.js +1 -0
  163. package/apps/pwa/out/_next/static/chunks/app/share/page-204eca33eeeaddec.js +1 -0
  164. package/apps/pwa/out/_next/static/chunks/app/showroom/page-e58ba9bcdb9ac0f9.js +1 -0
  165. package/apps/pwa/out/_next/static/chunks/app/tasks/page-98f6dd50bafd7734.js +1 -0
  166. package/apps/pwa/out/_next/static/chunks/app/term/page-139d722de1dcd6c1.js +1 -0
  167. package/apps/pwa/out/_next/static/chunks/app/today/page-5a4bdd72bff27057.js +1 -0
  168. package/apps/pwa/out/_next/static/chunks/app/trace/page-6f6ab17d44f984ce.js +1 -0
  169. package/apps/pwa/out/_next/static/chunks/app/vault/page-aabb7bd15fb72da9.js +1 -0
  170. package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-e4322319164a4436.js +1 -0
  171. package/apps/pwa/out/_next/static/chunks/app/workflows/page-e9efc0c8f32e2371.js +1 -0
  172. package/apps/pwa/out/_next/static/chunks/app/workspace/page-ccde99f07aaf71f7.js +1 -0
  173. package/apps/pwa/out/_next/static/chunks/app/worktrees/page-80464aced9614390.js +1 -0
  174. package/apps/pwa/out/_next/static/chunks/{b7478fef.5917716286213fcc.js → b84cad00.594027ebe0531fe2.js} +1 -1
  175. package/apps/pwa/out/_next/static/chunks/c696986b.5dc8bb1143af16d1.js +1 -0
  176. package/apps/pwa/out/_next/static/chunks/{b7459770.6539b11860eb8a9c.js → ca3702f8.2913182e73889fa2.js} +7 -7
  177. package/apps/pwa/out/_next/static/chunks/{3f0de3de-2340c532c00395db.js → d5d3cefc-373c4eb722ed848b.js} +1 -1
  178. package/apps/pwa/out/_next/static/chunks/{89d6c04f-6b8ab341748e468a.js → d8de0de2-dd0f4ac8e5ab1832.js} +1 -1
  179. package/apps/pwa/out/_next/static/chunks/{framework-4b12a946f352cee2.js → framework-002b472a66935d31.js} +1 -1
  180. package/apps/pwa/out/_next/static/chunks/main-49b88d47292c0476.js +1 -0
  181. package/apps/pwa/out/_next/static/chunks/main-app-fff2549cb10a133f.js +1 -0
  182. package/apps/pwa/out/_next/static/chunks/pages/_app-32abbbba3f3b76b7.js +1 -0
  183. package/apps/pwa/out/_next/static/chunks/pages/_error-9d9cfef60c60dd7a.js +1 -0
  184. package/apps/pwa/out/_next/static/chunks/webpack-cc7f483fa294034a.js +1 -0
  185. package/apps/pwa/out/approvals/index.html +1 -1
  186. package/apps/pwa/out/approvals/index.txt +22 -22
  187. package/apps/pwa/out/autopilot/index.html +1 -1
  188. package/apps/pwa/out/autopilot/index.txt +22 -22
  189. package/apps/pwa/out/board/index.html +1 -1
  190. package/apps/pwa/out/board/index.txt +22 -22
  191. package/apps/pwa/out/botlab/index.html +1 -1
  192. package/apps/pwa/out/botlab/index.txt +21 -21
  193. package/apps/pwa/out/bots/index.html +1 -1
  194. package/apps/pwa/out/bots/index.txt +21 -21
  195. package/apps/pwa/out/ceo/index.html +1 -1
  196. package/apps/pwa/out/ceo/index.txt +22 -22
  197. package/apps/pwa/out/chat/index.html +1 -1
  198. package/apps/pwa/out/chat/index.txt +21 -21
  199. package/apps/pwa/out/consult/index.html +1 -1
  200. package/apps/pwa/out/consult/index.txt +22 -22
  201. package/apps/pwa/out/control/index.html +1 -1
  202. package/apps/pwa/out/control/index.txt +22 -22
  203. package/apps/pwa/out/decisions/index.html +1 -1
  204. package/apps/pwa/out/decisions/index.txt +21 -21
  205. package/apps/pwa/out/design-check/index.html +1 -1
  206. package/apps/pwa/out/design-check/index.txt +22 -22
  207. package/apps/pwa/out/editor/index.html +1 -1
  208. package/apps/pwa/out/editor/index.txt +22 -22
  209. package/apps/pwa/out/exec/index.html +1 -1
  210. package/apps/pwa/out/exec/index.txt +22 -22
  211. package/apps/pwa/out/field/index.html +1 -1
  212. package/apps/pwa/out/field/index.txt +22 -22
  213. package/apps/pwa/out/healthz +1 -1
  214. package/apps/pwa/out/index.html +1 -1
  215. package/apps/pwa/out/index.txt +21 -21
  216. package/apps/pwa/out/inside/index.html +1 -1
  217. package/apps/pwa/out/inside/index.txt +21 -21
  218. package/apps/pwa/out/intake/index.html +1 -1
  219. package/apps/pwa/out/intake/index.txt +22 -22
  220. package/apps/pwa/out/live/index.html +1 -1
  221. package/apps/pwa/out/live/index.txt +22 -22
  222. package/apps/pwa/out/live-run/index.html +1 -1
  223. package/apps/pwa/out/live-run/index.txt +22 -22
  224. package/apps/pwa/out/loops/index.html +1 -1
  225. package/apps/pwa/out/loops/index.txt +21 -21
  226. package/apps/pwa/out/market/index.html +1 -1
  227. package/apps/pwa/out/market/index.txt +21 -21
  228. package/apps/pwa/out/missions/placeholder/index.html +1 -1
  229. package/apps/pwa/out/missions/placeholder/index.txt +21 -21
  230. package/apps/pwa/out/morning/index.html +1 -1
  231. package/apps/pwa/out/morning/index.txt +22 -22
  232. package/apps/pwa/out/observatory/index.html +1 -1
  233. package/apps/pwa/out/observatory/index.txt +22 -22
  234. package/apps/pwa/out/ops/checklist/index.html +1 -1
  235. package/apps/pwa/out/ops/checklist/index.txt +21 -21
  236. package/apps/pwa/out/ops/release/index.html +1 -1
  237. package/apps/pwa/out/ops/release/index.txt +21 -21
  238. package/apps/pwa/out/ops/seats/index.html +1 -1
  239. package/apps/pwa/out/ops/seats/index.txt +21 -21
  240. package/apps/pwa/out/outputs/index.html +1 -1
  241. package/apps/pwa/out/outputs/index.txt +21 -21
  242. package/apps/pwa/out/reflection/index.html +1 -1
  243. package/apps/pwa/out/reflection/index.txt +22 -22
  244. package/apps/pwa/out/scheduler/index.html +1 -1
  245. package/apps/pwa/out/scheduler/index.txt +22 -22
  246. package/apps/pwa/out/sessions/index.html +1 -1
  247. package/apps/pwa/out/sessions/index.txt +21 -21
  248. package/apps/pwa/out/settings/devices/index.html +1 -1
  249. package/apps/pwa/out/settings/devices/index.txt +22 -22
  250. package/apps/pwa/out/settings/index.html +1 -1
  251. package/apps/pwa/out/settings/index.txt +22 -22
  252. package/apps/pwa/out/setup/done/index.html +1 -1
  253. package/apps/pwa/out/setup/done/index.txt +22 -22
  254. package/apps/pwa/out/setup/index.html +1 -1
  255. package/apps/pwa/out/setup/index.txt +22 -22
  256. package/apps/pwa/out/share/index.html +1 -1
  257. package/apps/pwa/out/share/index.txt +22 -22
  258. package/apps/pwa/out/showroom/index.html +1 -1
  259. package/apps/pwa/out/showroom/index.txt +21 -21
  260. package/apps/pwa/out/tasks/index.html +1 -1
  261. package/apps/pwa/out/tasks/index.txt +22 -22
  262. package/apps/pwa/out/term/index.html +1 -1
  263. package/apps/pwa/out/term/index.txt +22 -22
  264. package/apps/pwa/out/today/index.html +1 -1
  265. package/apps/pwa/out/today/index.txt +22 -22
  266. package/apps/pwa/out/trace/index.html +1 -1
  267. package/apps/pwa/out/trace/index.txt +22 -22
  268. package/apps/pwa/out/vault/index.html +1 -1
  269. package/apps/pwa/out/vault/index.txt +22 -22
  270. package/apps/pwa/out/workflows/chat-ui/index.html +1 -1
  271. package/apps/pwa/out/workflows/chat-ui/index.txt +22 -22
  272. package/apps/pwa/out/workflows/index.html +1 -1
  273. package/apps/pwa/out/workflows/index.txt +22 -22
  274. package/apps/pwa/out/workspace/index.html +1 -1
  275. package/apps/pwa/out/workspace/index.txt +22 -22
  276. package/apps/pwa/out/worktrees/index.html +1 -1
  277. package/apps/pwa/out/worktrees/index.txt +22 -22
  278. package/graphs/demo/persona-marketer/fixtures/marketer-scenario.yaml +10 -0
  279. package/graphs/demo/persona-marketer/persona-marketer.yaml +25 -0
  280. package/graphs/demo/persona-marketer/recipes.yaml +19 -0
  281. package/graphs/video/explainer-line.yaml +4 -1
  282. package/package.json +1 -1
  283. package/scripts/dead-code/report.ts +169 -0
  284. package/scripts/lib/morning-report-options.ts +3 -4
  285. package/scripts/lib/tui-regress-evidence.ts +56 -0
  286. package/scripts/morning-report.ts +5 -1
  287. package/scripts/public-export.ts +15 -7
  288. package/scripts/release-loop/export-check-node.ts +21 -3
  289. package/scripts/release-loop/gate-node.ts +379 -48
  290. package/scripts/release-loop/gate-shard-dispatch.ts +128 -0
  291. package/scripts/release-loop/gate-shard-receipts.ts +89 -0
  292. package/scripts/release-loop/gate-wall.ts +5 -5
  293. package/scripts/release-loop/preflight.ts +6 -2
  294. package/scripts/release-loop/resume-release.ts +20 -5
  295. package/scripts/release-loop/resume.ts +48 -0
  296. package/scripts/release-loop/version-node.ts +7 -2
  297. package/scripts/release-story/draft.ts +1 -1
  298. package/scripts/research-bench/README.md +53 -0
  299. package/scripts/research-bench/questions.json +66 -0
  300. package/scripts/research-bench/rubric.md +33 -0
  301. package/scripts/research-bench/run.ts +523 -0
  302. package/scripts/tui-regress.ts +85 -10
  303. package/src/acp/core-turn-bridge.ts +8 -0
  304. package/src/agent/autonomous-tools.ts +10 -3
  305. package/src/agent/monad-agent-turn.ts +4 -1
  306. package/src/agent/registry.ts +26 -2
  307. package/src/agent/shared-app-tools.ts +1 -1
  308. package/src/agent/surface-ux/build.ts +12 -3
  309. package/src/agent/surface-ux/types.ts +1 -1
  310. package/src/agent/task-notification.ts +75 -6
  311. package/src/agent/types.ts +3 -0
  312. package/src/agent-mission/driver.ts +29 -3
  313. package/src/agent-mission/mission-cli.ts +2 -1
  314. package/src/agent-substrate/review-context-pack.ts +365 -0
  315. package/src/agent-substrate/self-review-cli.ts +226 -17
  316. package/src/ask-user-question/index.ts +6 -0
  317. package/src/ask-user-question/inline-resolver.ts +49 -0
  318. package/src/auto-research/question-ladder-contract.ts +22 -3
  319. package/src/auto-research/research-turn.ts +350 -17
  320. package/src/autopilot/agent-loop.ts +1 -1
  321. package/src/autopilot/pty-control-loop.ts +8 -1
  322. package/src/boot/daemon-tools/index.ts +4 -3
  323. package/src/boot/daemon-tools/self-implement.ts +270 -2
  324. package/src/boot/daemon-tools/types.ts +2 -0
  325. package/src/budget/llm-cost.ts +44 -5
  326. package/src/budget/unified-usage.ts +17 -1
  327. package/src/capture/tui-self-report.ts +14 -0
  328. package/src/chat/index.ts +33 -7
  329. package/src/cli/agent-cli.ts +43 -8
  330. package/src/cli/intake-cli.ts +22 -1
  331. package/src/cli/lesson-cli.ts +19 -3
  332. package/src/cli/log-event-names.ts +1 -0
  333. package/src/cli/pod-cli.ts +17 -2
  334. package/src/cli/pty-takeover-cli.ts +67 -7
  335. package/src/cli/release-cli.ts +52 -6
  336. package/src/cli/repo-cli.ts +2 -1
  337. package/src/cli/tasks-cli.ts +36 -9
  338. package/src/control-plane/ledger.ts +21 -4
  339. package/src/core-turn/run-core-turn.ts +44 -3
  340. package/src/core-turn/run-goal-loop.ts +152 -8
  341. package/src/core-turn/types.ts +9 -0
  342. package/src/dashboard/chat/acp-chat.ts +2 -2
  343. package/src/dashboard/classic-sigquit.ts +16 -0
  344. package/src/dashboard/index.ts +321 -27
  345. package/src/dashboard/input/chat-main-interaction-opts.ts +3 -0
  346. package/src/dashboard/input/chat-main-plain-turn-runtime.ts +7 -2
  347. package/src/dashboard/input/chat-main-slash-command.ts +7 -0
  348. package/src/dashboard/input/dashboard-plain-turn-stream.ts +4 -0
  349. package/src/dashboard/input/dashboard-priority-key-route.ts +21 -5
  350. package/src/dashboard/input/external-input-host.ts +2 -0
  351. package/src/dashboard/sidetab-runtime.ts +228 -0
  352. package/src/dashboard/slash-runtime/ask-clarification.ts +7 -1
  353. package/src/dashboard/slash-runtime/dashboard-handlers.ts +20 -8
  354. package/src/dashboard/slash-runtime/help-from-registry.ts +2 -2
  355. package/src/dashboard/term-slash-runtime.ts +16 -18
  356. package/src/dashboard/turn-preamble.ts +2 -0
  357. package/src/domains/knowledge.ts +1 -1
  358. package/src/esc-abort-gate.ts +33 -1
  359. package/src/execution-loop/launch-gate.ts +206 -1
  360. package/src/graph-runner/graph-cli.ts +6 -4
  361. package/src/graph-runner/runner.ts +31 -9
  362. package/src/graph-wizard/generate.ts +16 -7
  363. package/src/graph-wizard/mission-compose.ts +201 -0
  364. package/src/grok/agent-search.ts +8 -2
  365. package/src/grok/credential.ts +5 -0
  366. package/src/grounding/ref-index.ts +11 -0
  367. package/src/grounding/ref-vector.ts +61 -0
  368. package/src/grounding/sources-cli.ts +2 -2
  369. package/src/grounding/sources.ts +15 -1
  370. package/src/harness/harness-cli-command.ts +38 -9
  371. package/src/harness/harness-pod-dispatch.ts +7 -1
  372. package/src/index.ts +18 -4
  373. package/src/input/external-input-queue.ts +10 -0
  374. package/src/intake-plane/collect-telegram-saved.ts +36 -1
  375. package/src/intake-plane/intake-to-tasks.ts +246 -3
  376. package/src/lessons/friction-ledger.ts +154 -0
  377. package/src/live-supply/collector.ts +149 -0
  378. package/src/live-supply/probes.ts +52 -0
  379. package/src/live-supply/snapshot.ts +40 -0
  380. package/src/llm.ts +431 -76
  381. package/src/loops/orchestrator/tick.ts +8 -0
  382. package/src/nexus/api/harness-api.ts +2 -1
  383. package/src/pty/snapshot.py +132 -0
  384. package/src/pty-shell/pty-control-ipc.ts +29 -2
  385. package/src/pty-shell/pty-manifest.ts +59 -3
  386. package/src/pty-shell/registry.ts +2 -0
  387. package/src/pty-shell/tui-run-state.ts +80 -3
  388. package/src/release-loop/gate-host-reservation.ts +13 -4
  389. package/src/release-loop/gate-shard-ledger.ts +68 -0
  390. package/src/release-loop/merged-pr-checklist.ts +25 -2
  391. package/src/release-loop/rehearsal-shard-plan.ts +6 -1
  392. package/src/release-loop/rehearsal.ts +27 -0
  393. package/src/research/edge-decision.ts +124 -15
  394. package/src/research/gap-followup.ts +249 -0
  395. package/src/research/lenses/counter-evidence.ts +100 -0
  396. package/src/research/lenses/working-backwards.ts +89 -0
  397. package/src/research/plugin-discovery.ts +242 -0
  398. package/src/research-bridge/invoke.ts +4 -2
  399. package/src/research-bridge/types.ts +2 -0
  400. package/src/self-dev/ask-launch-flow.ts +34 -106
  401. package/src/self-dev/dev-cli.ts +2 -0
  402. package/src/self-dev/dev-pipeline.ts +8 -4
  403. package/src/self-dev/graph-journey-route.ts +10 -2
  404. package/src/self-dev/launch-preflight-text.ts +2 -2
  405. package/src/self-dev/launch-preflight.ts +38 -7
  406. package/src/self-dev/orchestrate-cli.ts +1 -0
  407. package/src/self-dev/run-supervisor.ts +19 -0
  408. package/src/self-implement/device-first.ts +8 -2
  409. package/src/self-implement/doctor-visit.ts +76 -58
  410. package/src/self-implement/gate-artifacts.ts +3 -0
  411. package/src/self-implement/gate-baseline.ts +75 -4
  412. package/src/self-implement/gate-cli.ts +317 -9
  413. package/src/self-implement/gate-receipt-registry.ts +180 -0
  414. package/src/self-implement/gate-remote.ts +145 -22
  415. package/src/self-implement/goal-author-clarification.ts +178 -24
  416. package/src/self-implement/goal-author-decompose.ts +24 -15
  417. package/src/self-implement/goal-author.ts +9 -5
  418. package/src/self-implement/host-regate.ts +120 -45
  419. package/src/self-implement/impl-findings-feedback.ts +188 -0
  420. package/src/self-implement/knowhow-pack.ts +189 -10
  421. package/src/self-implement/off-diff-evidence.ts +124 -0
  422. package/src/self-implement/orchestrator.ts +85 -7
  423. package/src/self-implement/run-ledger.ts +46 -8
  424. package/src/self-implement/run-stop.ts +12 -0
  425. package/src/self-implement/seams.ts +6 -3
  426. package/src/self-implement/self-implement-cli.ts +4 -2
  427. package/src/session/chat.ts +89 -15
  428. package/src/session-runtime/provider-circuit.ts +140 -0
  429. package/src/shell-runner/file-engine.ts +1 -0
  430. package/src/shell-runner/types.ts +4 -0
  431. package/src/sidetab-core/model.ts +176 -0
  432. package/src/skills/tools/schedule-wakeup.ts +23 -1
  433. package/src/skills/tools/shell.ts +51 -5
  434. package/src/steward/directive-audit.ts +354 -0
  435. package/src/surface/child-process.ts +31 -0
  436. package/src/surface/tui-stderr-owner.ts +48 -0
  437. package/src/task-agent/cover.ts +30 -12
  438. package/src/task-agent/judge.ts +56 -0
  439. package/src/task-agent/postland-card.ts +35 -2
  440. package/src/task-agent/rejudge-on-head.ts +46 -2
  441. package/src/task-agent/repair-cycle.ts +1 -1
  442. package/src/task-agent/task-hand.ts +129 -24
  443. package/src/task-agent/tier-split.ts +105 -21
  444. package/src/task-orchestrator/surfaces/pod-command-job.ts +330 -2
  445. package/src/task-orchestrator/surfaces/pod-config-snapshot.ts +123 -0
  446. package/src/task-orchestrator/surfaces/pod-failure-reason.ts +27 -2
  447. package/src/task-orchestrator/surfaces/pod-mirror-seed.ts +11 -8
  448. package/src/task-orchestrator/surfaces/pod-si-warm-protocol.ts +1 -1
  449. package/src/task-orchestrator/surfaces/pod-source-receive.ts +74 -6
  450. package/src/task-orchestrator/surfaces/pod-warm-worker-pod.ts +2 -1
  451. package/src/task-orchestrator/surfaces/pod-warm-worker-provider.ts +56 -15
  452. package/src/task-orchestrator/surfaces/self-implement-pod.ts +186 -33
  453. package/src/tool-runtime/skill-exec-runtime.ts +95 -5
  454. package/src/tui/entry.ts +15 -2
  455. package/src/tui/inline-choice.ts +188 -0
  456. package/src/tui/sidetab/list.ts +2 -176
  457. package/src/tui/slash/term.ts +12 -1
  458. package/src/tui-client/dashboard-session.ts +7 -1
  459. package/src/user-config.ts +34 -4
  460. package/src/ux-sim/classic-tui-seat-scenarios.ts +1 -7
  461. package/src/ux-sim/fake-land-queue.ts +88 -0
  462. package/src/ux-sim/gate-shard-host-reroute.ts +82 -0
  463. package/src/ux-sim/goal-interim-trace.ts +24 -0
  464. package/src/ux-sim/next-tui-seat-scenarios.ts +8 -13
  465. package/src/ux-sim/task-orchestrator-surfaces-self-implement-pod-device.ts +4 -1
  466. package/src/version/packed-revision.json +1 -1
  467. package/src/video-pipeline/recipes/explainer.ts +54 -2
  468. package/src/web-search/grok.ts +32 -6
  469. package/src/web-search/index.ts +8 -7
  470. package/src/workflow-runtime/node-catalog.ts +53 -4
  471. package/apps/pwa/out/_next/static/chunks/1118.a8a74ea29aac3e46.js +0 -27
  472. package/apps/pwa/out/_next/static/chunks/1204-2aa830479adf80f4.js +0 -1
  473. package/apps/pwa/out/_next/static/chunks/1341-43b7d2dc77d45c9d.js +0 -1
  474. package/apps/pwa/out/_next/static/chunks/1440-c3ea8882badfd9bf.js +0 -1
  475. package/apps/pwa/out/_next/static/chunks/1698-9c11cbf97f13717e.js +0 -1
  476. package/apps/pwa/out/_next/static/chunks/1770-3b1fc92253ef9f2f.js +0 -1
  477. package/apps/pwa/out/_next/static/chunks/1923-5c1695332240246a.js +0 -1
  478. package/apps/pwa/out/_next/static/chunks/213-20675f20673ba22a.js +0 -1
  479. package/apps/pwa/out/_next/static/chunks/214.186a430da28338f1.js +0 -1
  480. package/apps/pwa/out/_next/static/chunks/2277.3bd4c0ac7f1b5996.js +0 -93
  481. package/apps/pwa/out/_next/static/chunks/240.e09f433f71c78ff4.js +0 -104
  482. package/apps/pwa/out/_next/static/chunks/2415.738b777642a02233.js +0 -1
  483. package/apps/pwa/out/_next/static/chunks/2417.02151393605a7cd0.js +0 -1
  484. package/apps/pwa/out/_next/static/chunks/2463.cd2641a76daaa9ff.js +0 -1
  485. package/apps/pwa/out/_next/static/chunks/2576.b9e9c629c4b84c52.js +0 -1
  486. package/apps/pwa/out/_next/static/chunks/265-c021de53f0865bd9.js +0 -1
  487. package/apps/pwa/out/_next/static/chunks/2998-b1cc13956cd6a6e7.js +0 -1
  488. package/apps/pwa/out/_next/static/chunks/2e4782d3.ba2f0ab2b63a53e7.js +0 -1
  489. package/apps/pwa/out/_next/static/chunks/3130.626b54382b4dc379.js +0 -1
  490. package/apps/pwa/out/_next/static/chunks/3221-1bb3f99a55088613.js +0 -1
  491. package/apps/pwa/out/_next/static/chunks/3280.24edb1ffd03a7f3f.js +0 -24
  492. package/apps/pwa/out/_next/static/chunks/3288-eb3c22a1cbf2ae68.js +0 -1
  493. package/apps/pwa/out/_next/static/chunks/33.ef99e8374f96c6c4.js +0 -36
  494. package/apps/pwa/out/_next/static/chunks/3341-f09b9efbd7a82f70.js +0 -1
  495. package/apps/pwa/out/_next/static/chunks/3389.012c70767a872f9b.js +0 -1
  496. package/apps/pwa/out/_next/static/chunks/3410-d7c0f14b329d6fda.js +0 -1
  497. package/apps/pwa/out/_next/static/chunks/3421.c87d6313a7d670f7.js +0 -287
  498. package/apps/pwa/out/_next/static/chunks/3422-83a3953f9bd67e26.js +0 -1
  499. package/apps/pwa/out/_next/static/chunks/3587-002e24e368c515a9.js +0 -1
  500. package/apps/pwa/out/_next/static/chunks/3644.f12a7d821ab940af.js +0 -1
  501. package/apps/pwa/out/_next/static/chunks/3660.d7516588e2d875c3.js +0 -1
  502. package/apps/pwa/out/_next/static/chunks/3695.b82e2610f4cd4ea9.js +0 -1
  503. package/apps/pwa/out/_next/static/chunks/3858.ca1f5bc0f577eac9.js +0 -94
  504. package/apps/pwa/out/_next/static/chunks/3959-e6ac4a139d9d4bcc.js +0 -1
  505. package/apps/pwa/out/_next/static/chunks/4032.53f62176514ec0ea.js +0 -1
  506. package/apps/pwa/out/_next/static/chunks/4204-ef8484cbecd5d62f.js +0 -1
  507. package/apps/pwa/out/_next/static/chunks/4259-163129ca79913c4b.js +0 -1
  508. package/apps/pwa/out/_next/static/chunks/428-eaa77df3d0c85969.js +0 -1
  509. package/apps/pwa/out/_next/static/chunks/4432-97e400ffa1e161f5.js +0 -1
  510. package/apps/pwa/out/_next/static/chunks/449-aa427cf2cbb75f50.js +0 -1
  511. package/apps/pwa/out/_next/static/chunks/4491-39a0fd32bbaf3840.js +0 -1
  512. package/apps/pwa/out/_next/static/chunks/4588.b7cf06d382953979.js +0 -1
  513. package/apps/pwa/out/_next/static/chunks/4690.70ec8060825366ab.js +0 -32
  514. package/apps/pwa/out/_next/static/chunks/4804.6012b5cd33c22792.js +0 -90
  515. package/apps/pwa/out/_next/static/chunks/4881.e4d22d730e3b9df5.js +0 -1
  516. package/apps/pwa/out/_next/static/chunks/4937.ce2e340dc29cad3e.js +0 -79
  517. package/apps/pwa/out/_next/static/chunks/5-bb1c08d84bd71df3.js +0 -1
  518. package/apps/pwa/out/_next/static/chunks/5005.de98df23b37cdf3c.js +0 -1
  519. package/apps/pwa/out/_next/static/chunks/5035.dc64a89cad5573cc.js +0 -74
  520. package/apps/pwa/out/_next/static/chunks/5207.1a224035455790fd.js +0 -1
  521. package/apps/pwa/out/_next/static/chunks/5255-1b60d50eabe9f057.js +0 -1
  522. package/apps/pwa/out/_next/static/chunks/5269.d0436ee6d773382a.js +0 -286
  523. package/apps/pwa/out/_next/static/chunks/5300.677c97e0393742e6.js +0 -1
  524. package/apps/pwa/out/_next/static/chunks/5309.3367c4d50f52b489.js +0 -1
  525. package/apps/pwa/out/_next/static/chunks/552-689827d49780fa00.js +0 -1
  526. package/apps/pwa/out/_next/static/chunks/5539.34cc9d60622cb69b.js +0 -8
  527. package/apps/pwa/out/_next/static/chunks/5568.218dea0c00ca2ec7.js +0 -1
  528. package/apps/pwa/out/_next/static/chunks/5645.b7e3b055455a04ea.js +0 -1
  529. package/apps/pwa/out/_next/static/chunks/5662.18cc0f30353cbd96.js +0 -1
  530. package/apps/pwa/out/_next/static/chunks/5671.da24fc9dc5e98325.js +0 -1
  531. package/apps/pwa/out/_next/static/chunks/5b141171.324c40fd49cb6821.js +0 -1
  532. package/apps/pwa/out/_next/static/chunks/6175-d4621f6a10b0cfab.js +0 -1
  533. package/apps/pwa/out/_next/static/chunks/6290.3eb53a20746b72ce.js +0 -1
  534. package/apps/pwa/out/_next/static/chunks/6415-9307f3eafa90837f.js +0 -1
  535. package/apps/pwa/out/_next/static/chunks/6579-3de35d00aacd71b5.js +0 -1
  536. package/apps/pwa/out/_next/static/chunks/680-2f324c4e039a5b67.js +0 -1
  537. package/apps/pwa/out/_next/static/chunks/6845-331b3c7481da3ba3.js +0 -1
  538. package/apps/pwa/out/_next/static/chunks/7000.28157393caaf5343.js +0 -62
  539. package/apps/pwa/out/_next/static/chunks/7311-60a7ea80d23c7521.js +0 -1
  540. package/apps/pwa/out/_next/static/chunks/7401.525d0a12f7d02c06.js +0 -1
  541. package/apps/pwa/out/_next/static/chunks/7438.c2cf72b66dca6aa4.js +0 -1
  542. package/apps/pwa/out/_next/static/chunks/7488.966b116789f3d41a.js +0 -1
  543. package/apps/pwa/out/_next/static/chunks/7573.2376e13c9c21f1f8.js +0 -77
  544. package/apps/pwa/out/_next/static/chunks/7577.ea6e9ac72e035520.js +0 -1
  545. package/apps/pwa/out/_next/static/chunks/7657.8d1fb3d2f7ebe273.js +0 -1
  546. package/apps/pwa/out/_next/static/chunks/7903-1435d5d2f0dd7807.js +0 -1
  547. package/apps/pwa/out/_next/static/chunks/7978-30a91192c5dbe3c2.js +0 -1
  548. package/apps/pwa/out/_next/static/chunks/8025-8795821525cf1a07.js +0 -1
  549. package/apps/pwa/out/_next/static/chunks/8191.3674a00f0b565c23.js +0 -1
  550. package/apps/pwa/out/_next/static/chunks/8217-604955d8885c5ef2.js +0 -1
  551. package/apps/pwa/out/_next/static/chunks/8298-eed6f5f2585a63f4.js +0 -1
  552. package/apps/pwa/out/_next/static/chunks/8758.ac421f726a189125.js +0 -1
  553. package/apps/pwa/out/_next/static/chunks/891.d6c723a51a067b36.js +0 -149
  554. package/apps/pwa/out/_next/static/chunks/9223.cbcc88e0e9950426.js +0 -41
  555. package/apps/pwa/out/_next/static/chunks/9317.6a9869039c231bb3.js +0 -24
  556. package/apps/pwa/out/_next/static/chunks/9383.e4755f275b3c11ff.js +0 -1
  557. package/apps/pwa/out/_next/static/chunks/9581.da63ddf41acfad46.js +0 -1
  558. package/apps/pwa/out/_next/static/chunks/9715.8c5529a0a5c41a36.js +0 -1
  559. package/apps/pwa/out/_next/static/chunks/9817.3009d65f0889ef1f.js +0 -2
  560. package/apps/pwa/out/_next/static/chunks/app/_not-found/page-76873dd80da4f715.js +0 -1
  561. package/apps/pwa/out/_next/static/chunks/app/approvals/page-ed32b6ec5dea8f23.js +0 -1
  562. package/apps/pwa/out/_next/static/chunks/app/autopilot/page-fdd40e15babf3d25.js +0 -1
  563. package/apps/pwa/out/_next/static/chunks/app/board/page-384efc78e85e400b.js +0 -1
  564. package/apps/pwa/out/_next/static/chunks/app/bots/page-d91809c5aeed319a.js +0 -1
  565. package/apps/pwa/out/_next/static/chunks/app/ceo/page-128f3522f89a81ab.js +0 -1
  566. package/apps/pwa/out/_next/static/chunks/app/chat/page-595961abf3b43ad1.js +0 -1
  567. package/apps/pwa/out/_next/static/chunks/app/consult/page-f41dccb76d8c0263.js +0 -1
  568. package/apps/pwa/out/_next/static/chunks/app/control/page-a3205c2e28b7d0d9.js +0 -1
  569. package/apps/pwa/out/_next/static/chunks/app/decisions/page-c39a80277814a3f4.js +0 -1
  570. package/apps/pwa/out/_next/static/chunks/app/design-check/page-1ab3f98194513195.js +0 -1
  571. package/apps/pwa/out/_next/static/chunks/app/editor/page-a5246f7e254d77d0.js +0 -1
  572. package/apps/pwa/out/_next/static/chunks/app/exec/page-0f92287bdb81217d.js +0 -1
  573. package/apps/pwa/out/_next/static/chunks/app/field/page-5a37131ff63793ef.js +0 -1
  574. package/apps/pwa/out/_next/static/chunks/app/healthz/route-76873dd80da4f715.js +0 -1
  575. package/apps/pwa/out/_next/static/chunks/app/inside/page-ac4bd14bb2348bfd.js +0 -1
  576. package/apps/pwa/out/_next/static/chunks/app/intake/page-c348a3959c5b5fc6.js +0 -1
  577. package/apps/pwa/out/_next/static/chunks/app/layout-2addd81c0d3e2906.js +0 -1
  578. package/apps/pwa/out/_next/static/chunks/app/live/page-da6b765f58a3eefb.js +0 -1
  579. package/apps/pwa/out/_next/static/chunks/app/live-run/page-0661e40f8780c32c.js +0 -1
  580. package/apps/pwa/out/_next/static/chunks/app/loops/page-b89af1b1c8e4875b.js +0 -1
  581. package/apps/pwa/out/_next/static/chunks/app/market/page-da8aeb82ba751cdb.js +0 -1
  582. package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-cc71317b239439db.js +0 -1
  583. package/apps/pwa/out/_next/static/chunks/app/morning/page-bde7fc1d64ffe369.js +0 -1
  584. package/apps/pwa/out/_next/static/chunks/app/not-found-e2797214f713fa58.js +0 -1
  585. package/apps/pwa/out/_next/static/chunks/app/observatory/page-2a35bcda70defaf6.js +0 -1
  586. package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-3af03deedde45032.js +0 -1
  587. package/apps/pwa/out/_next/static/chunks/app/ops/release/page-d1d1210f99f620ae.js +0 -1
  588. package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-46d1b5500885861d.js +0 -1
  589. package/apps/pwa/out/_next/static/chunks/app/outputs/page-291ab19fe2acb173.js +0 -1
  590. package/apps/pwa/out/_next/static/chunks/app/page-7f569e533ddeecba.js +0 -1
  591. package/apps/pwa/out/_next/static/chunks/app/reflection/page-990129c9fee46d8f.js +0 -1
  592. package/apps/pwa/out/_next/static/chunks/app/scheduler/page-7737f785ebb1cdaf.js +0 -1
  593. package/apps/pwa/out/_next/static/chunks/app/sessions/page-9f3c73a4f7ffd2f8.js +0 -1
  594. package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-03be7fb347f01058.js +0 -1
  595. package/apps/pwa/out/_next/static/chunks/app/settings/page-96b0280625e4df2b.js +0 -1
  596. package/apps/pwa/out/_next/static/chunks/app/setup/done/page-56855545049eb56d.js +0 -1
  597. package/apps/pwa/out/_next/static/chunks/app/setup/layout-76873dd80da4f715.js +0 -1
  598. package/apps/pwa/out/_next/static/chunks/app/setup/page-79a909c9981f0338.js +0 -1
  599. package/apps/pwa/out/_next/static/chunks/app/share/page-a9d9a3e66459c1e0.js +0 -1
  600. package/apps/pwa/out/_next/static/chunks/app/showroom/page-c383cbf2013f7069.js +0 -1
  601. package/apps/pwa/out/_next/static/chunks/app/tasks/page-f57c6a2e54dbdca4.js +0 -1
  602. package/apps/pwa/out/_next/static/chunks/app/term/page-6b140f77593576eb.js +0 -1
  603. package/apps/pwa/out/_next/static/chunks/app/today/page-6b767ae2d9d0adfc.js +0 -1
  604. package/apps/pwa/out/_next/static/chunks/app/trace/page-116d6198d5da0e3d.js +0 -1
  605. package/apps/pwa/out/_next/static/chunks/app/vault/page-b9c9b778c7501370.js +0 -1
  606. package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-a6c78392ab8f6335.js +0 -1
  607. package/apps/pwa/out/_next/static/chunks/app/workflows/page-455183deb4ed0cfe.js +0 -1
  608. package/apps/pwa/out/_next/static/chunks/app/workspace/page-6a63e99526bd63d0.js +0 -1
  609. package/apps/pwa/out/_next/static/chunks/app/worktrees/page-31c22caafe788c08.js +0 -1
  610. package/apps/pwa/out/_next/static/chunks/main-941155250ed2644b.js +0 -1
  611. package/apps/pwa/out/_next/static/chunks/main-app-f8b6765abed6d149.js +0 -1
  612. package/apps/pwa/out/_next/static/chunks/pages/_app-78432194c85388f9.js +0 -1
  613. package/apps/pwa/out/_next/static/chunks/pages/_error-cdf7390829512b1b.js +0 -1
  614. package/apps/pwa/out/_next/static/chunks/webpack-d5f0964a9c2e92d2.js +0 -1
  615. /package/apps/pwa/out/_next/static/{RrjXTwz-urRAbChP1bX02 → HjeK7zONHfR7op1hKXp4k}/_ssgManifest.js +0 -0
@@ -0,0 +1,88 @@
1
+ /** In-process LAND-QUEUE simulator. Scheduling and verdict logic use the production train functions;
2
+ * only git's merge-tree/commit-tree and the remote gate are replaced. */
3
+ import { integrateTrain, runTrain, type TrainCandidate, type TrainGit, type TrainVerdict } from '../self-implement/merge-train.js';
4
+
5
+ export type FakeLandQueueItem = TrainCandidate & { files: string[] };
6
+ export type FakeLandQueueInput = {
7
+ readonly queue: readonly FakeLandQueueItem[];
8
+ readonly load: number;
9
+ readonly previousSlots?: 2 | 3;
10
+ readonly cutWindowOpen?: boolean;
11
+ readonly expedite?: number;
12
+ readonly eject?: readonly number[];
13
+ readonly conflicting?: readonly number[];
14
+ readonly gates?: readonly ('pass' | 'fail' | 'unmeasured')[];
15
+ };
16
+ export type FakeLandQueueResult = {
17
+ readonly slots: 2 | 3;
18
+ readonly departed: readonly (readonly number[])[];
19
+ readonly waiting: readonly number[];
20
+ readonly ejected: readonly number[];
21
+ readonly stoppedAtCut: boolean;
22
+ readonly verdicts: readonly TrainVerdict[];
23
+ };
24
+
25
+ /** Hysteresis prevents slot oscillation: below 60% expand; at/above 80% contract. */
26
+ export function fakeLandSlots(load: number, previous: 2 | 3 = 2): 2 | 3 {
27
+ if (!Number.isFinite(load) || load < 0 || load > 100) throw new Error('load must be between 0 and 100');
28
+ if (load < 60) return 3;
29
+ if (load >= 80) return 2;
30
+ return previous;
31
+ }
32
+
33
+ function syntheticGit(conflicting: ReadonlySet<number>, prByHead: ReadonlyMap<string, number>): TrainGit {
34
+ let commit = 0;
35
+ const sha = (n: number) => n.toString(16).padStart(40, '0');
36
+ return (args) => {
37
+ const command = args.find((arg) => arg === 'merge-tree' || arg === 'commit-tree');
38
+ if (command === 'merge-tree') {
39
+ const pr = prByHead.get(args.at(-1) ?? '');
40
+ return pr !== undefined && conflicting.has(pr)
41
+ ? { status: 1, stdout: `${sha(900 + (pr ?? 0))}\0src/conflict.ts\0\0`, stderr: '' }
42
+ : { status: 0, stdout: `${sha(900 + (pr ?? 0))}\0`, stderr: '' };
43
+ }
44
+ if (command === 'commit-tree') return { status: 0, stdout: sha(++commit), stderr: '' };
45
+ return { status: 2, stdout: '', stderr: `unsupported fake git command: ${args[0]}` };
46
+ };
47
+ }
48
+
49
+ /** One dry-run tick. Cut-window closure and ejection never call the train; no ref is updated. */
50
+ export async function simulateFakeLandQueue(input: FakeLandQueueInput): Promise<FakeLandQueueResult> {
51
+ const ejected = new Set(input.eject ?? []);
52
+ const queue = input.queue.filter((item) => !ejected.has(item.number)).map((item) => ({ ...item, files: [...item.files] }));
53
+ if (input.expedite !== undefined) {
54
+ const at = queue.findIndex((item) => item.number === input.expedite);
55
+ if (at >= 0) queue.unshift(...queue.splice(at, 1));
56
+ }
57
+ const slots = fakeLandSlots(input.load, input.previousSlots);
58
+ if (input.cutWindowOpen === false) return {
59
+ slots, departed: [], waiting: queue.map((item) => item.number), ejected: [...ejected], stoppedAtCut: true, verdicts: [],
60
+ };
61
+
62
+ const departed: number[][] = [];
63
+ const waiting: number[] = [];
64
+ const verdicts: TrainVerdict[] = [];
65
+ const gates = [...(input.gates ?? [])];
66
+ const git = syntheticGit(new Set(input.conflicting ?? []), new Map(queue.map((item) => [item.head, item.number])));
67
+ while (queue.length) {
68
+ const batch: FakeLandQueueItem[] = [];
69
+ const occupied = new Set<string>();
70
+ for (let i = 0; i < queue.length && batch.length < slots;) {
71
+ const candidate = queue[i]!;
72
+ if (candidate.files.some((file) => occupied.has(file))) { waiting.push(candidate.number); queue.splice(i, 1); continue; }
73
+ batch.push(candidate); queue.splice(i, 1); candidate.files.forEach((file) => occupied.add(file));
74
+ }
75
+ if (!batch.length) break;
76
+ departed.push(batch.map((item) => item.number));
77
+ const train = await runTrain(batch, {
78
+ integrate: (candidates) => {
79
+ const integrated = integrateTrain('/fake-land-queue', '1'.repeat(40), candidates, git);
80
+ return integrated;
81
+ },
82
+ gate: async () => gates.shift() ?? 'pass',
83
+ observe: () => {},
84
+ });
85
+ verdicts.push(...train.verdicts);
86
+ }
87
+ return { slots, departed, waiting: [...waiting, ...queue.map((item) => item.number)], ejected: [...ejected], stoppedAtCut: false, verdicts };
88
+ }
@@ -0,0 +1,82 @@
1
+ /** S1 device for a release gate's shard dispatch. It replaces host execution, not planning or reduction. */
2
+ import { createHash } from 'node:crypto';
3
+ import {
4
+ planGateShardDispatch,
5
+ reduceGateShardReceipts,
6
+ type GateShardAction,
7
+ type GateShardDispatchInput,
8
+ type GateShardReceipt,
9
+ type GateShardReduction,
10
+ } from '../../scripts/release-loop/gate-shard-dispatch.js';
11
+
12
+ export interface FakeGateShardHostResult {
13
+ shardId: string;
14
+ host: string;
15
+ status: 'complete' | 'unmeasured';
16
+ failureIds: string[];
17
+ errorIds: string[];
18
+ envKey?: string;
19
+ }
20
+
21
+ export interface GateShardRerouteScenario {
22
+ input: GateShardDispatchInput;
23
+ /** A result is supplied only for an expected host call. An omitted result remains unmeasured. */
24
+ hostResults: readonly FakeGateShardHostResult[];
25
+ }
26
+
27
+ export interface FakeGateShardHostCall {
28
+ shardId: string;
29
+ host: string;
30
+ files: string[];
31
+ head40: string;
32
+ base40: string;
33
+ }
34
+
35
+ export interface GateShardRerouteObservation {
36
+ actions: GateShardAction[];
37
+ hostCalls: FakeGateShardHostCall[];
38
+ /** One selected receipt per reused or executed shard; no predecessor fills a failed remeasurement. */
39
+ receipts: GateShardReceipt[];
40
+ reduction: GateShardReduction;
41
+ }
42
+
43
+ /** Stage inputs without making dispatch decisions; the production planner receives them unchanged. */
44
+ export function gateShardRerouteScenario(
45
+ input: GateShardDispatchInput,
46
+ hostResults: readonly FakeGateShardHostResult[],
47
+ ): GateShardRerouteScenario {
48
+ return { input, hostResults };
49
+ }
50
+
51
+ /**
52
+ * Inject deterministic fake host results into the production planner and reducer. This never starts a gate,
53
+ * Pod, SSH command, or host sweep. The fake evidence digest is a scenario marker, not an artifact verification;
54
+ * the caller of the production planner still owns verification before reuse.
55
+ */
56
+ export function simGateShardHostReroute(scenario: GateShardRerouteScenario): GateShardRerouteObservation {
57
+ const actions = planGateShardDispatch(scenario.input);
58
+ const hostCalls: FakeGateShardHostCall[] = [];
59
+ const receipts: GateShardReceipt[] = [];
60
+ for (const action of actions) {
61
+ if (action.kind === 'reuse') {
62
+ receipts.push(action.receipt);
63
+ continue;
64
+ }
65
+ if (action.kind === 'unmeasured') continue;
66
+ hostCalls.push({ shardId: action.shardId, host: action.host, files: [...action.files],
67
+ head40: scenario.input.head40, base40: scenario.input.base40 });
68
+ const result = scenario.hostResults.find((row) => row.shardId === action.shardId && row.host === action.host);
69
+ if (!result) continue;
70
+ const evidence = JSON.stringify({ head40: scenario.input.head40, base40: scenario.input.base40,
71
+ shardId: action.shardId, host: action.host, files: action.files, result });
72
+ receipts.push({ id: action.shardId, files: [...action.files], head40: scenario.input.head40, base40: scenario.input.base40,
73
+ host: action.host, envKey: result.envKey ?? `sim:${action.host}`, status: result.status,
74
+ failureIds: [...result.failureIds], errorIds: [...result.errorIds],
75
+ evidencePath: `sim/${action.shardId}-${action.host}.json`,
76
+ evidenceSha256: createHash('sha256').update(evidence).digest('hex'),
77
+ measuredAt: '2026-10-27T00:00:00.000Z', attempt: (action.replacing?.attempt ?? 0) + 1 });
78
+ }
79
+ const reduction = reduceGateShardReceipts({ head40: scenario.input.head40, base40: scenario.input.base40,
80
+ shards: scenario.input.shards, receipts });
81
+ return { actions, hostCalls, receipts, reduction };
82
+ }
@@ -0,0 +1,24 @@
1
+ /** One injected input trace shared by classic and next goal-interim renderer evidence. */
2
+ export const GOAL_INTERIM_USER_INPUT = '영상 만들어줘';
3
+ export const GOAL_INTERIM_NOT_DONE_REPLY = '[fake-llm] {step}단계 렌더를 진행했습니다.\n남은 작업 {step}단계: 완료 영상 경로는 아직 보고할 수 없습니다 — 아직 못 했습니다.';
4
+ export const GOAL_INTERIM_TOOL_CALL = JSON.stringify({ when: GOAL_INTERIM_USER_INPUT, name: 'ScheduleWakeup', args: { delaySeconds: 3600, reason: '렌더 점검' } });
5
+
6
+ export const GOAL_INTERIM_RENDER_TRACE = {
7
+ userInput: GOAL_INTERIM_USER_INPUT,
8
+ interimReplies: [1, 2].map((step) => GOAL_INTERIM_NOT_DONE_REPLY.replaceAll('{step}', String(step))),
9
+ finalReply: '완료 영상: /tmp/final.mp4',
10
+ toolCalls: ['ScheduleWakeup', 'ScheduleWakeup progress', 'ScheduleWakeup progress'],
11
+ } as const;
12
+
13
+ export function goalInterimRenderMessages(ts: string) {
14
+ const trace = GOAL_INTERIM_RENDER_TRACE;
15
+ return [
16
+ { role: 'user' as const, content: trace.userInput, ts },
17
+ { role: 'tool' as const, content: '', toolName: trace.toolCalls[0], toolResult: '예약됨', ts },
18
+ { role: 'tool' as const, content: '', toolName: trace.toolCalls[1], toolResult: '진행', ts },
19
+ { role: 'assistant' as const, goalInterim: true, content: trace.interimReplies[0], ts },
20
+ { role: 'tool' as const, content: '', toolName: trace.toolCalls[2], toolResult: '진행', ts },
21
+ { role: 'assistant' as const, goalInterim: true, content: trace.interimReplies[1], ts },
22
+ { role: 'assistant' as const, content: trace.finalReply, ts },
23
+ ];
24
+ }
@@ -7,6 +7,8 @@ import { chmodSync, mkdirSync, readFileSync, readdirSync, writeFileSync } from '
7
7
  import { join, resolve } from 'node:path';
8
8
  import { appendMessage, createSession, getActiveSessionId, loadSession, setActiveSessionId } from '../session/index.js';
9
9
  import { mockSeatPtySequence, type SeatPtySequenceEvidence, type SeatPtyStep } from './mock-seat-pty-sequence.js';
10
+ import { GOAL_INTERIM_NOT_DONE_REPLY, GOAL_INTERIM_TOOL_CALL } from './goal-interim-trace.js';
11
+ export { GOAL_INTERIM_NOT_DONE_REPLY, GOAL_INTERIM_TOOL_CALL } from './goal-interim-trace.js';
10
12
  import { pasteFoldToken } from '../chat/paste-fold.js';
11
13
  import { DEFAULT_GOAL_CONTINUE_CAP } from '../dashboard/input/goal-continue.js';
12
14
  import {
@@ -471,29 +473,24 @@ async function runNextProactiveContinueScenario(spec: NextTuiScenarioSpec, root:
471
473
  /** TUI-NEXT-QUEUE-AND-WAKE ② — a turn calls ScheduleWakeup(60s); a slow human turn covers the due time
472
474
  * (NotIdle → deferred a minute), then the wakeup opens one internal turn on its own. */
473
475
  async function runNextWakeupScenario(spec: NextTuiScenarioSpec, root: string, base: ScenarioBase, reply: string, done: Done): Promise<NextTuiScenarioResult> {
474
- let scheduledAt = 0;
475
476
  const banner = '↻ 자동 재개(scheduled): 점검';
476
477
  const steps: SeatPtyStep[] = [
477
478
  {
478
479
  label: 'scheduled',
479
480
  text: '60초 뒤 예약해줘',
480
- until: (s) => {
481
- const ok = done(1)(s) && s.includes('⏰ 예약 깨움');
482
- if (ok && scheduledAt === 0) scheduledAt = Date.now();
483
- return ok;
484
- },
481
+ until: (s) => done(1)(s) && s.includes('⏰ 예약 깨움'),
485
482
  },
486
- { label: 'before due', until: () => scheduledAt > 0 && Date.now() >= scheduledAt + 45_000, timeoutMs: 60_000 },
487
- { label: 'busy over the due time', text: '긴 작업 하나', until: (s) => s.includes('응답 중') },
488
- { label: 'long turn done', until: done(2, '긴 작업 하나'), timeoutMs: 60_000 },
489
- { label: 'woke', until: (s) => s.includes(banner) && done(3)(s), timeoutMs: 150_000 },
483
+ { label: 'busy over the due time', text: '긴 작업 하나', until: (s) => s.includes('응답 중'), timeoutMs: 30_000 },
484
+ { label: 'long turn done', until: done(2, '긴 작업 하나'), timeoutMs: 30_000 },
485
+ { label: 'woke after one deferral', until: (s) => s.includes(banner) && done(3)(s), timeoutMs: 30_000 },
490
486
  ];
491
487
  const run = await mockSeatPtySequence({
492
488
  ...base,
493
489
  env: {
494
490
  ...base.env,
491
+ ELANOUS_TEST_FAST_WAKEUP_CLOCK: '1',
495
492
  [TEST_FAKE_LLM_TOOL_CALL_ENV]: JSON.stringify({ when: '예약해줘', name: 'ScheduleWakeup', args: { delaySeconds: 60, reason: '점검' } }),
496
- [TEST_FAKE_LLM_DELAY_MS_ENV]: '25000',
493
+ [TEST_FAKE_LLM_DELAY_MS_ENV]: '5000',
497
494
  [TEST_FAKE_LLM_DELAY_WHEN_ENV]: '긴 작업',
498
495
  },
499
496
  steps,
@@ -737,13 +734,11 @@ async function runNextGoalContinueScenario(spec: NextTuiScenarioSpec, root: stri
737
734
 
738
735
  /** TUI-GOAL-INTERIM-QUIET — every step ends with «아직 못 했다» (a different reply per turn via `{step}`, so the
739
736
  * same-reply stop does not end it early). The fake reply's honesty sentence, counted on screen. */
740
- export const GOAL_INTERIM_NOT_DONE_REPLY = '[fake-llm] {step}단계 렌더를 진행했습니다.\n남은 작업 {step}단계: 완료 영상 경로는 아직 보고할 수 없습니다 — 아직 못 했습니다.';
741
737
  const GOAL_INTERIM_STEP_MARK = '단계 렌더를 진행했습니다';
742
738
  const GOAL_INTERIM_NOT_DONE_MARK = '아직 못 했습니다';
743
739
  /** An internal turn drawn as if a person typed it (classic «❯ …» · next «나: …»). */
744
740
  /** The first (human) turn also calls one tool, so a folded reply must leave that turn's tool lines on screen.
745
741
  * ScheduleWakeup an hour out: a real registered tool with no approval prompt that never fires inside the run. */
746
- export const GOAL_INTERIM_TOOL_CALL = JSON.stringify({ when: '영상 만들어줘', name: 'ScheduleWakeup', args: { delaySeconds: 3600, reason: '렌더 점검' } });
747
742
  export const INTERNAL_TURN_USER_HEADER = /(?:나:|❯)\s*\[(?:골 이어가기|자동 재개)\]/u;
748
743
 
749
744
  export interface GoalInterimScreenCounts { steps: number; notDone: number; folded: number; userHeader: boolean }
@@ -31,6 +31,8 @@ export interface PodDeviceEvent {
31
31
  jobConditionReason?: string;
32
32
  jobConditionMessage?: string;
33
33
  activeDeadlineSeconds?: number;
34
+ jobCreatedAt?: string;
35
+ jobCompletedAt?: string;
34
36
  podPhase?: string;
35
37
  podCreatedAt?: string;
36
38
  containerReason?: string | null;
@@ -86,6 +88,7 @@ export const POD_DEVICE_EVENTS: readonly PodDeviceEvent[] = [
86
88
  jobConditionReason: 'DeadlineExceeded',
87
89
  jobConditionMessage: 'Job was active longer than specified deadline',
88
90
  activeDeadlineSeconds: 3600,
91
+ jobCreatedAt: '2026-10-22T12:55:10Z',
89
92
  podPhase: 'Failed',
90
93
  containerReason: 'Error',
91
94
  containerExitCode: 143,
@@ -114,7 +117,7 @@ const ok = (stdout: string) => ({ status: 0, stdout, stderr: '' });
114
117
 
115
118
  function answerJob(event: PodDeviceEvent, jsonpath: string): { status: number; stdout: string; stderr: string } {
116
119
  if (jsonpath === POD_TERMINATION_JOB_JSONPATH) {
117
- return ok(`${event.jobConditionReason ?? ''}\t${event.activeDeadlineSeconds ?? ''}\t${event.jobUid ?? ''}`);
120
+ return ok(`${event.jobConditionReason ?? ''}\t${event.activeDeadlineSeconds ?? ''}\t${event.jobUid ?? ''}\t${event.jobCreatedAt ?? ''}\t${event.jobCompletedAt ?? ''}`);
118
121
  }
119
122
  if (jsonpath.includes('.spec.activeDeadlineSeconds')) return ok(event.activeDeadlineSeconds != null ? String(event.activeDeadlineSeconds) : '');
120
123
  if (jsonpath.includes('conditions[?(@.type=="Failed")].reason')) return ok(event.jobConditionReason ?? '');
@@ -1 +1 @@
1
- {"commit":"a78f3f66a3db5de0bce1342c99d3c4abc0a96f45"}
1
+ {"commit":"0a06cc36728ac7d147fe4988e2fd43d5f5eb8ec8"}
@@ -1,13 +1,16 @@
1
1
  import { spawnSync } from 'node:child_process';
2
2
  import { existsSync, lstatSync, mkdirSync, readFileSync, realpathSync } from 'node:fs';
3
3
  import { dirname, isAbsolute, relative, resolve, sep } from 'node:path';
4
+ import { parse as parseYaml } from 'yaml';
4
5
  import type { RunResult } from './ffmpeg.js';
5
6
  import { UNOBSERVED, type Recipe, type RecipeCtx, type RecipeResult } from './types.js';
7
+ import { parseGraphTemplateYaml, type GraphParseIssue, type GraphTemplateSpec } from '../../self-implement/graph-yaml.js';
6
8
 
7
9
  type CommandRunner = (bin: string, args: readonly string[], timeoutMs: number, cwd?: string) => RunResult;
8
- interface ExplainerDeps { readonly run?: CommandRunner; readonly engineDir?: string }
10
+ interface ExplainerDeps { readonly run?: CommandRunner; readonly engineDir?: string; readonly declarationPath?: string }
9
11
 
10
12
  const ENGINE = resolve(import.meta.dir, '../../../skills/explainer-video/engine');
13
+ const LINE_DECLARATION = resolve(import.meta.dir, '../../../graphs/video/explainer-line.yaml');
11
14
  const ENGINE_MS = 600_000;
12
15
  const QC_MS = 180_000;
13
16
 
@@ -199,7 +202,19 @@ export function explainerQc(deps: ExplainerDeps = {}): Recipe {
199
202
  const peak = Number(j.input_tp);
200
203
  if (j.input_i == null || j.input_tp == null || !Number.isFinite(loudness) || !Number.isFinite(peak)) throw new Error('통합 음량/트루 피크가 비수다');
201
204
  const produced = { loudness_lufs: loudness, true_peak_db: peak };
202
- const outcome = loudness >= -16 && loudness <= -12 && peak <= -1 ? 'pass' : 'loudness';
205
+ let outcome = loudness >= -16 && loudness <= -12 && peak <= -1 ? 'pass' : 'loudness';
206
+ // ⭐ «3분 영상» — qc 생산 경로에서 loadExplainerLine 으로 선언의 target_seconds(180)를 소비한다.
207
+ // 내레이션이 목표 총 길이를 넘으면 too-long → build(재구성). narration_seconds 를 못 쟀으면 건너뛴다(기존 동작 보존).
208
+ const narrationSeconds = ctx.state.narration_seconds;
209
+ if (outcome === 'pass' && typeof narrationSeconds === 'number' && Number.isFinite(narrationSeconds)) {
210
+ const plan = loadExplainerLine(deps.declarationPath);
211
+ if (plan.targetSeconds !== null && narrationSeconds > plan.targetSeconds) {
212
+ return finish(ctx, 'qc', {
213
+ outcome: 'too-long', produced,
214
+ note: `${Math.round(narrationSeconds)}초 내레이션이 선언 목표 ${plan.targetSeconds}초를 넘는다 — build 로 재구성한다`,
215
+ });
216
+ }
217
+ }
203
218
  return finish(ctx, 'qc', { outcome, produced, note: `${loudness} LUFS · ${peak} dBTP` });
204
219
  } catch (e) { return finish(ctx, 'qc', { outcome: UNOBSERVED, note: `loudnorm 결과를 못 읽었다: ${String(e)}` }); }
205
220
  };
@@ -211,3 +226,40 @@ export const EXPLAINER: Readonly<Record<string, Recipe>> = {
211
226
  'explainer-build': explainerBuild(),
212
227
  'explainer-qc': explainerQc(),
213
228
  };
229
+
230
+ /** ⭐ «3분 영상» — explainer-line 선언이 이 라인의 영상 계획에 건 목표 총 길이(초). */
231
+ export interface ExplainerLinePlan {
232
+ /** 지속 필드 `target_seconds`(초). 선언에 없으면 이 라인은 목표 총 길이를 정하지 않았다(null). */
233
+ readonly targetSeconds: number | null;
234
+ /** 생산 컴파일러(parseGraphTemplateYaml)가 낸 정규형 — 나머지 선언(노드·계약·엣지)은 이것으로 관측한다. */
235
+ readonly template: GraphTemplateSpec | null;
236
+ readonly errors: readonly GraphParseIssue[];
237
+ }
238
+
239
+ /** ⭐ 생산 로드 — 라인 저작본(graphs/video/explainer-line.yaml)을 읽어 영상 계획을 낸다.
240
+ * 컴파일러는 top-level 계획 상수를 정규형에 싣지 않는다 — 지속 필드 `target_seconds` 는 로드에서 직접 읽는다.
241
+ * ⛔ 던지지 않는다(graph-yaml 계약) · 뿌리는 인자로 덮는다(ENGINE 과 같은 관습). */
242
+ export function loadExplainerLine(declarationPath = LINE_DECLARATION): ExplainerLinePlan {
243
+ let source: string;
244
+ try {
245
+ source = readFileSync(declarationPath, 'utf8');
246
+ } catch (error) {
247
+ return {
248
+ targetSeconds: null,
249
+ template: null,
250
+ errors: [{ path: declarationPath, message: `선언 읽기 실패: ${error instanceof Error ? error.message : String(error)}` }],
251
+ };
252
+ }
253
+ const compiled = parseGraphTemplateYaml(source, 'explainer-line.yaml');
254
+ let targetSeconds: number | null = null;
255
+ try {
256
+ const raw: unknown = parseYaml(source);
257
+ const declared = raw !== null && typeof raw === 'object' && !Array.isArray(raw)
258
+ ? (raw as Record<string, unknown>).target_seconds
259
+ : undefined;
260
+ if (typeof declared === 'number' && Number.isFinite(declared) && declared > 0) targetSeconds = declared;
261
+ } catch {
262
+ // YAML 파싱 실패는 컴파일 결과(errors)가 이미 싣는다 — 로드는 던지지 않는다.
263
+ }
264
+ return { targetSeconds, template: compiled.template ?? null, errors: compiled.errors };
265
+ }
@@ -18,18 +18,43 @@
18
18
  // custom MCP provider without touching skill bodies.
19
19
 
20
20
  import { getGrokApiKey } from '../config.js';
21
- import { grokAgentSearch, GROK_SEARCH_MODEL } from '../grok/agent-search.js';
21
+ import { grokAgentSearch, GROK_SEARCH_MODEL, type GrokAgentSearchOpts } from '../grok/agent-search.js';
22
+ import { peekGrokCredential, resolveFreshGrokCredential } from '../grok/credential.js';
22
23
  import { wantsXSearch } from './x-intent.js';
23
24
  import type { WebSearchHit, WebSearchProvider, WebSearchResult } from './provider.js';
24
25
 
25
26
  const DEFAULT_LIMIT = 5;
26
27
  const GROK_TIMEOUT_MS = 45_000;
28
+ // The subscription proxy's known working model differs from the metered API default.
29
+ const GROK_SUBSCRIPTION_SEARCH_MODEL = 'grok-4.6';
27
30
 
28
- export function buildGrokWebSearchProvider(): WebSearchProvider {
31
+ /** Explicitly metered API provider. The registry only adds it with webSearch.grokApi.enabled. */
32
+ export function buildGrokWebSearchProvider(opts: { id?: string } = {}): WebSearchProvider {
33
+ return makeGrokProvider(opts.id ?? 'grok', 'Grok (xAI agent-tools search)',
34
+ () => !!getGrokApiKey(), () => ({}));
35
+ }
36
+
37
+ /** Subscription search uses the proven cli-chat-proxy /responses route. No API-key fallback. */
38
+ export function buildGrokSubscriptionWebSearchProvider(): WebSearchProvider {
39
+ return makeGrokProvider('grok', 'Grok (subscription search)',
40
+ () => peekGrokCredential({ model: GROK_SUBSCRIPTION_SEARCH_MODEL })?.kind === 'subscription',
41
+ () => {
42
+ const credential = resolveFreshGrokCredential({ model: GROK_SUBSCRIPTION_SEARCH_MODEL });
43
+ if (credential?.kind !== 'subscription') throw new Error('Grok subscription search unavailable');
44
+ return { apiKey: credential.token, baseUrl: credential.baseUrl, headers: credential.headers, model: GROK_SUBSCRIPTION_SEARCH_MODEL };
45
+ });
46
+ }
47
+
48
+ function makeGrokProvider(
49
+ id: string,
50
+ displayName: string,
51
+ available: () => boolean,
52
+ searchOptions: () => GrokAgentSearchOpts,
53
+ ): WebSearchProvider {
29
54
  return {
30
- id: 'grok',
31
- displayName: 'Grok (xAI agent-tools search)',
32
- available: () => !!getGrokApiKey(),
55
+ id,
56
+ displayName,
57
+ available,
33
58
  search: async (q, signal) => {
34
59
  const startedAt = Date.now();
35
60
  const limit = Math.max(1, Math.min(20, q.limit ?? DEFAULT_LIMIT));
@@ -45,6 +70,7 @@ export function buildGrokWebSearchProvider(): WebSearchProvider {
45
70
 
46
71
  const r = await grokAgentSearch(query, {
47
72
  model: GROK_SEARCH_MODEL,
73
+ ...searchOptions(),
48
74
  tools: ['web_search', 'x_search'],
49
75
  systemPrompt: 'You are a concise web-search assistant. Answer in one or two sentences and let the cited sources carry the detail.',
50
76
  timeoutMs: GROK_TIMEOUT_MS,
@@ -67,7 +93,7 @@ export function buildGrokWebSearchProvider(): WebSearchProvider {
67
93
  const note = r.text.length > 0 ? r.text.slice(0, 1500) : undefined;
68
94
  return {
69
95
  hits,
70
- providerName: 'grok',
96
+ providerName: id,
71
97
  durationMs: Date.now() - startedAt,
72
98
  ...(note ? { note } : {}),
73
99
  } satisfies WebSearchResult;
@@ -5,11 +5,11 @@
5
5
  // order) and routes the query. Callers that want a specific
6
6
  // provider pass `providerId` to force the choice.
7
7
 
8
- import { buildGrokWebSearchProvider } from './grok.js';
8
+ import { buildGrokSubscriptionWebSearchProvider, buildGrokWebSearchProvider } from './grok.js';
9
9
  import { buildFirecrawlWebSearchProvider } from './firecrawl.js';
10
10
  import { buildTavilyWebSearchProvider } from './tavily.js';
11
11
  import { buildFreeWebSearchProvider } from './free.js';
12
- import { isTavilySearchEnabled } from '../user-config.js';
12
+ import { isPaidWebSearchEnabled, isTavilySearchEnabled } from '../user-config.js';
13
13
  import { debug } from '../debug/log.js';
14
14
  import { wantsXSearch } from './x-intent.js';
15
15
  import {
@@ -35,8 +35,9 @@ function registerBuiltins(): void {
35
35
  // ⇒ 켜면 종전과 «똑같이» 1순위로 복귀한다: `elanous config set webSearch.tavily.enabled true`.
36
36
  // ⚠️ 등록 시점이라 config 변경은 **다음 기동부터** 먹는다(이미 뜬 프로세스엔 안 먹는다).
37
37
  if (isTavilySearchEnabled()) providers.push(buildTavilyWebSearchProvider());
38
- providers.push(buildGrokWebSearchProvider());
39
- providers.push(buildFirecrawlWebSearchProvider());
38
+ providers.push(buildGrokSubscriptionWebSearchProvider());
39
+ if (isPaidWebSearchEnabled('grokApi')) providers.push(buildGrokWebSearchProvider({ id: 'grok-api' }));
40
+ if (isPaidWebSearchEnabled('firecrawl')) providers.push(buildFirecrawlWebSearchProvider());
40
41
  providers.push(buildFreeWebSearchProvider());
41
42
  }
42
43
  registerBuiltins();
@@ -70,10 +71,10 @@ export async function searchWeb(
70
71
  ): Promise<WebSearchResult> {
71
72
  const xIntent = !opts.providerId && wantsXSearch(q.query);
72
73
  const candidates = opts.providerId
73
- ? providers.filter(p => p.id === opts.providerId)
74
+ ? providers.filter(p => p.id === opts.providerId || (opts.providerId === 'grok' && p.id === 'grok-api'))
74
75
  : providers.filter(p => p.available());
75
76
  if (xIntent) {
76
- const grokIndex = candidates.findIndex(p => p.id === 'grok');
77
+ const grokIndex = candidates.findIndex(p => p.id === 'grok' || p.id === 'grok-api');
77
78
  if (grokIndex > 0) candidates.unshift(...candidates.splice(grokIndex, 1));
78
79
  }
79
80
  if (candidates.length === 0) {
@@ -91,7 +92,7 @@ export async function searchWeb(
91
92
  try {
92
93
  const result = await provider.search(q, opts.signal);
93
94
  if (!xIntent) return result;
94
- if (provider.id === 'grok') {
95
+ if (provider.id === 'grok' || provider.id === 'grok-api') {
95
96
  const isXUrl = (raw: string): boolean => {
96
97
  try {
97
98
  const url = new URL(raw);
@@ -1,6 +1,10 @@
1
1
  // M4-5 (2026-05-12 · Phase 4 N5-5) — workflow node catalog.
2
2
  //
3
- // Single source of truth for the 20 workflow-runtime node kinds.
3
+ // GRAPH-UNIFY-KINDS (0.2.40 · 2026-10-27) — this catalog is a view over the
4
+ // node-kind vocabulary registry `src/graph-kinds/registry.ts` (WORKFLOW_CORE_
5
+ // KINDS · 24 workflow kinds). The registry owns the vocabulary; this file owns
6
+ // the per-kind YAML specs, and NODE_CATALOG below is derived so the catalog can
7
+ // never drift from the registry again.
4
8
  // CLI (`elanous wf node search/spec/list`) + PWA NodeCreator + external
5
9
  // LLM (R3 NL synth · M4-1 node suggestion) all read this catalog.
6
10
  //
@@ -15,11 +19,13 @@ export type NodeCategory =
15
19
  | 'core' // prompt · bash · skill · cft
16
20
  | 'hitl' // approval
17
21
  | 'branch' // if · switch
18
- | 'iteration' // iteration
22
+ | 'iteration' // iteration · showroom
19
23
  | 'transform' // classify · extract · set · filter · template
20
- | 'integration' // http · task
24
+ | 'integration' // http · task · subworkflow
21
25
  | 'trigger'; // scheduleTrigger · webhookTrigger · discordTrigger · telegramTrigger · manualTrigger · chatTrigger
22
26
 
27
+ import { WORKFLOW_CORE_KINDS } from '../graph-kinds/registry.js';
28
+
23
29
  export interface NodeSpec {
24
30
  /** Stable identifier (snake-case in the YAML key when relevant). */
25
31
  kind: string;
@@ -42,7 +48,7 @@ export interface NodeSpec {
42
48
  related?: string[];
43
49
  }
44
50
 
45
- export const NODE_CATALOG: readonly NodeSpec[] = [
51
+ const NODE_SPECS: readonly NodeSpec[] = [
46
52
  // ── core ────────────────────────────────────────────────────────
47
53
  {
48
54
  kind: 'prompt',
@@ -150,6 +156,26 @@ export const NODE_CATALOG: readonly NodeSpec[] = [
150
156
  echo "item $index = $item"`,
151
157
  related: ['filter'],
152
158
  },
159
+ {
160
+ kind: 'showroom',
161
+ category: 'iteration',
162
+ summary: 'Run a showroom · parallel lane prompts aggregated into a digest pane (strict by default)',
163
+ yamlKey: 'showroom',
164
+ required: ['lanes'],
165
+ optional: ['aggregator', 'mode'],
166
+ example: `- id: digest
167
+ depends_on: [fetch]
168
+ showroom:
169
+ mode: parallel
170
+ lanes:
171
+ - prompt: |
172
+ $ARGUMENTS 어제 이야기를 레인 요약으로 정리.
173
+ - prompt: |
174
+ 오늘 일정을 레인 요약으로 정리.
175
+ aggregator: |
176
+ 레인들을 아침 브리핑으로 합친다.`,
177
+ related: ['iteration', 'subworkflow'],
178
+ },
153
179
 
154
180
  // ── transform ───────────────────────────────────────────────────
155
181
  {
@@ -267,6 +293,21 @@ export const NODE_CATALOG: readonly NodeSpec[] = [
267
293
  url: $hook.output.body.data.url`,
268
294
  related: ['http'],
269
295
  },
296
+ {
297
+ kind: 'subworkflow',
298
+ category: 'integration',
299
+ summary: 'Call another workflow · child output feeds the parent node result',
300
+ yamlKey: 'subworkflow',
301
+ required: ['workflow'],
302
+ optional: ['inputs'],
303
+ example: `- id: call
304
+ depends_on: [build]
305
+ subworkflow:
306
+ workflow: child-graph
307
+ inputs:
308
+ value: $build.output.value`,
309
+ related: ['task', 'http'],
310
+ },
270
311
 
271
312
  // ── trigger ─────────────────────────────────────────────────────
272
313
  {
@@ -355,6 +396,14 @@ export const NODE_CATALOG: readonly NodeSpec[] = [
355
396
  },
356
397
  ] as const;
357
398
 
399
+ /** The workflow-node catalog is a view over the registry's WORKFLOW_CORE_KINDS
400
+ * vocabulary (24 kinds · showroom · subworkflow included): a spec whose kind
401
+ * is not a registry workflow kind is dropped, and `src/graph-kinds/registry.test.ts`
402
+ * asserts the catalog and the registry cover the same 24-kind set. */
403
+ export const NODE_CATALOG: readonly NodeSpec[] = NODE_SPECS.filter(
404
+ (spec): boolean => (WORKFLOW_CORE_KINDS as readonly string[]).includes(spec.kind),
405
+ );
406
+
358
407
  /** Look up a node spec by kind. Case-insensitive. */
359
408
  export function getNodeSpec(kind: string): NodeSpec | undefined {
360
409
  const lower = kind.trim().toLowerCase();
@@ -1,27 +0,0 @@
1
- "use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[1118],{39173:(e,t,i)=>{function r(e,t){e.accDescr&&t.setAccDescription?.(e.accDescr),e.accTitle&&t.setAccTitle?.(e.accTitle),e.title&&t.setDiagramTitle?.(e.title)}i.d(t,{S:()=>r}),(0,i(9820).K)(r,"populateCommonDb")},44845:(e,t,i)=>{i.d(t,{m:()=>n});var r=i(9820),n=class{constructor(e){this.init=e,this.records=this.init()}static{(0,r.K)(this,"ImperativeState")}reset(){this.records=this.init()}}},71118:(e,t,i)=>{i.d(t,{diagram:()=>j});var r=i(44845),n=i(39173),o=i(23208),s=i(36693),a=i(51636),l=i(47356),d=i(54730),c=i(9820),h=i(15568),p=/[─━│┃└┗├┣]/,f=/[└┗├┣]/,g=/[─━]/,u=/^[\s│┃]+$/,w=/^\s*(title[\t ]|accTitle[\t ]*:|accDescr[\t ]*[:{])/,x=/^\s*%%/;function m(e){return e.some(e=>p.test(e))}function b(e){for(let t of e){let e=f.exec(t);if(e?.index&&e.index>0)return e.index}return 4}function y(e,t){return e.replace(/\bline\s+(\d+)\b/gi,(e,i)=>{let r=parseInt(i,10),n=t.get(r);return n?`line ${n}`:e})}function $(e){let t=e.split("\n"),i=new Map,r=-1;for(let[e,i]of t.entries())if("treeView-beta"===i.trim()){r=e;break}if(-1===r)return{text:e,lineMap:i};let n=[];for(let e=r+1;e<t.length;e++){let i=t[e];!(""===i.trim()||x.test(i)||w.test(i))&&(u.test(i)||n.push(i.replace(/\t/g," ")))}if(!m(n))return{text:e,lineMap:i};let o=b(n),s=[],a=0;for(let e=0;e<=r;e++)s.push(t[e]),a++,i.set(a,e+1);for(let e=r+1;e<t.length;e++){let r=t[e],n=r.trim(),l=e+1;if(""===n||x.test(r)||w.test(r)){s.push(r),a++,i.set(a,l);continue}if(u.test(r))continue;let d=r.replace(/\t/g," "),c=f.exec(d);if(c?.index!==void 0){let e=c.index,t=Math.round(e/o)+1,r=e+1;for(;r<d.length&&g.test(d[r]);)r++;for(;r<d.length&&" "===d[r];)r++;let n=d.slice(r).trimEnd();if(!n)throw Error(`Line ${l}: Empty node \u2014 expected a filename or directory name after the box-drawing prefix`);let h=" ".repeat(t);s.push(h+n),a++,i.set(a,l)}else if(/^[\s─━│┃└┗├┣]+$/.test(d))continue;else if(p.test(d))s.push(r),a++,i.set(a,l);else if(/^\s+/.test(d))throw Error(`Line ${l}: Unexpected indentation without box-drawing characters. In box-drawing format, use \u251C\u2500\u2500 or \u2514\u2500\u2500 prefixes for indented nodes.`);else s.push(r),a++,i.set(a,l)}return{text:s.join("\n"),lineMap:i}}(0,c.K)(m,"isBoxDrawingFormat"),(0,c.K)(b,"inferSegmentWidth"),(0,c.K)(y,"remapErrorLines"),(0,c.K)($,"preprocessBoxDrawing");var k=new r.m(()=>({cnt:1,stack:[{id:0,level:-1,name:"/",nodeType:"directory",children:[]}]})),K=(0,c.K)(()=>{k.reset(),(0,l.IU)()},"clear"),v=(0,c.K)(()=>k.records.stack[0],"getRoot"),V=(0,c.K)(()=>k.records.cnt,"getCount"),B=l.UI.treeView,C=(0,c.K)(()=>(0,a.$t)(B,(0,l.zj)().treeView),"getConfig"),I={clear:K,addNode:(0,c.K)((e,t,i,r,n,o)=>{for(;e<=k.records.stack[k.records.stack.length-1].level;)k.records.stack.pop();let s={id:k.records.cnt++,level:e,name:t,nodeType:i,icon:n,cssClass:r,description:o,children:[]};k.records.stack[k.records.stack.length-1].children.push(s),k.records.stack.push(s)},"addNode"),getRoot:v,getCount:V,getConfig:C,getAccTitle:l.iN,getAccDescription:l.m7,getDiagramTitle:l.ab,setAccDescription:l.EI,setAccTitle:l.SV,setDiagramTitle:l.ke},T=(0,c.K)(e=>{for(let t of((0,n.S)(e,I),e.nodes)){let e="number"==typeof t.indent?t.indent:0,i=t.name,r=i.endsWith("/");r&&(i=i.slice(0,-1));let n=r?"directory":"file",o=t.classAnnotation||void 0,s=t.iconAnnotation,a=void 0!==s?s||"none":void 0,d=t.descAnnotation||void 0,c=d?(0,l.jZ)(d,(0,l.zj)()):void 0;I.addNode(e,i,n,o,a,c)}},"populate"),D={parse:(0,c.K)(async e=>{let{text:t,lineMap:i}=$(e);try{let e=await (0,h.qg)("treeView",t);d.R.debug(e),T(e)}catch(e){throw i.size>0&&e instanceof Error&&(e.message=y(e.message,i)),e}},"parse")},E={prefix:"mermaid-treeview",height:24,width:24,icons:{folder:{body:'<path fill="currentColor" d="M10.59 4.59A2 2 0 0 0 9.17 4H4a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.17z"/>'},file:{body:'<path fill="currentColor" fill-rule="evenodd" d="M6 2a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8.83a2 2 0 0 0-.59-1.42l-4.82-4.82A2 2 0 0 0 13.17 2H6Zm7.5 1.9l4.6 4.6h-3.6a1 1 0 0 1-1-1V3.9Z" clip-rule="evenodd"/>'}}};function A(e,t){let i=t?.filenameIcons?.[e];if(i)return i;let r=e.lastIndexOf(".");if(r>0){let i=e.substring(r).toLowerCase(),n=t?.extensionIcons;return n?.[i]??n?.[i.slice(1)]}}function M(e,t){return e.includes(":")?e:e in E.icons||!t?`${E.prefix}:${e}`:`${t}:${e}`}function N(e,t){if("none"!==e.icon){if(e.icon)return M(e.icon,t.defaultIconPack);if(t.showIcons){if("file"===e.nodeType){let i=A(e.name,t);if("none"===i)return;if(i)return M(i,t.defaultIconPack)}return`${E.prefix}:${"directory"===e.nodeType?"folder":"file"}`}}}(0,c.K)(A,"detectIcon"),(0,c.K)(M,"qualifyIcon"),(0,c.K)(N,"getNodeIcon"),(0,s.pC)([{name:E.prefix,icons:E}]);var z=(0,c.K)(async(e,t)=>{let i=[],r=(0,c.K)(e=>{let n=N(e,t);n&&i.push({icon:n,node:e}),e.children.forEach(r)},"collect");return r(e),new Map((await Promise.all(i.map(async({icon:e,node:t})=>({id:t.id,svg:await (0,s.WY)(e,{height:14,width:14})})))).map(({id:e,svg:t})=>[e,t]))},"resolveNodeIcons"),S=(0,c.K)((e,t,i,r,n,o)=>{let s=r.append("g"),a="treeView-node-label";"directory"===i.nodeType&&(a+=" treeView-node-dir"),i.cssClass&&(a+=` ${i.cssClass}`);let l=N(i,n),d=void 0!==l;l&&s.append("g").attr("class","treeView-node-icon").attr("transform",`translate(${e+n.paddingX}, ${t+n.paddingY})`).html(o.get(i.id)??"");let c=s.append("text").text(i.name).attr("dominant-baseline","middle").attr("class",a),{height:h,width:p}=c.node().getBBox(),f=h+2*n.paddingY,g=e+n.paddingX+18*!!d;c.attr("x",g),c.attr("y",t+f/2);let u=g+p;return i.BBox={x:e,y:t,width:p+2*n.paddingX+18*!!d,height:f},i.cssClass?.split(/\s+/).includes("highlight")&&s.insert("rect",":first-child").attr("x",e).attr("y",t+1).attr("width",0).attr("height",f-2).attr("rx",3).attr("class","treeView-highlight-bg"),{node:i,nodeGroup:s,labelRightEdge:u,centerY:t+f/2}},"positionLabel"),X=(0,c.K)((e,t,i,r,n,o)=>e.append("line").attr("x1",t).attr("y1",i).attr("x2",r).attr("y2",n).attr("stroke-width",o).attr("class","treeView-node-line"),"positionLine"),L=(0,c.K)((e,t,i,r)=>{let n=0,o=0,s=[],a=(0,c.K)((e,t,i,a)=>{let l=a*(i.rowIndent+i.paddingX),d=S(l,n,t,e,i,r);s.push(d);let{height:c,width:h}=t.BBox;X(e,l-i.rowIndent,n+c/2,l,n+c/2,i.lineThickness),o=Math.max(o,l+h),n+=c},"drawNode"),l=(0,c.K)((t,r=0)=>{a(e,t,i,r),t.children.forEach(e=>{l(e,r+1)});let{x:n,y:o,height:s}=t.BBox;if(t.children.length){let{y:r,height:a}=t.children[t.children.length-1].BBox;X(e,n+i.paddingX,o+s,n+i.paddingX,r+a/2+i.lineThickness/2,i.lineThickness)}},"processNode");l(t);let d=s.filter(e=>e.node.description);if(d.length>0){let e=Math.max(...s.map(e=>e.labelRightEdge))+16;for(let t of d){let r=t.nodeGroup.append("text").text(t.node.description).attr("dominant-baseline","middle").attr("class","treeView-node-description").attr("x",e).attr("y",t.centerY).node().getBBox();o=Math.max(o,e+r.width+i.paddingX)}}for(let e of s)if(e.node.cssClass?.split(/\s+/).includes("highlight")){let t=e.nodeGroup.select(".treeView-highlight-bg");if(!t.empty()){let i=o-e.node.BBox.x+8;t.attr("width",i),o=Math.max(o,e.node.BBox.x+i+2)}}return{totalHeight:n,totalWidth:o}},"drawTree"),R=(0,c.K)(async(e,t,i,r)=>{d.R.debug("Rendering treeView diagram\n"+e);let n=r.db,s=n.getRoot(),a=n.getConfig(),c=(0,o.D)(t),h=c.append("g");h.attr("class","tree-view");let p=await z(s,a),{totalHeight:f,totalWidth:g}=L(h,s,a,p);c.attr("viewBox",`-${a.lineThickness/2} 0 ${g} ${f}`),(0,l.a$)(c,f,g,a.useMaxWidth)},"draw"),Y={labelFontSize:"16px",labelColor:"black",lineColor:"black",iconColor:"#546e7a",descriptionColor:"#6a9955",highlightBg:"rgba(255, 193, 7, 0.15)",highlightStroke:"#ffc107"},j={db:I,renderer:{draw:R},parser:D,styles:(0,c.K)(({treeView:e})=>{let{labelFontSize:t,labelColor:i,lineColor:r,iconColor:n,descriptionColor:o,highlightBg:s,highlightStroke:l}=(0,a.$t)(Y,e);return`
2
- .treeView-node-label {
3
- font-size: ${t};
4
- fill: ${i};
5
- white-space: pre;
6
- }
7
- .treeView-node-dir {
8
- font-weight: bold;
9
- }
10
- .treeView-node-line {
11
- stroke: ${r};
12
- }
13
- .treeView-node-icon {
14
- color: ${n};
15
- }
16
- .treeView-node-description {
17
- font-size: ${t};
18
- fill: ${o};
19
- font-style: italic;
20
- white-space: pre;
21
- }
22
- .treeView-highlight-bg {
23
- fill: ${s};
24
- stroke: ${l};
25
- stroke-width: 1;
26
- }
27
- `},"styles")}}}]);