elanous 0.2.41 → 0.2.42

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 (589) 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/{GiOLWmt4MqDZePubBjA4Q → X1ucLw10Cds_h614NoEnh}/_buildManifest.js +1 -1
  4. package/apps/pwa/out/_next/static/chunks/0244e5b5.6fc7670f8223d82d.js +1 -0
  5. package/apps/pwa/out/_next/static/chunks/{5159.115f1c2ca471386c.js → 1063.2fb8a9dc55c731f2.js} +1 -1
  6. package/apps/pwa/out/_next/static/chunks/1121.13ba7a8aff19df81.js +36 -0
  7. package/apps/pwa/out/_next/static/chunks/1147-5196d19c222051b3.js +1 -0
  8. package/apps/pwa/out/_next/static/chunks/{9048.212083de42d25be3.js → 1262.e804feb8fd1acb8c.js} +2 -2
  9. package/apps/pwa/out/_next/static/chunks/1319.b9b815ae0f181e06.js +1 -0
  10. package/apps/pwa/out/_next/static/chunks/1345-31427b833438f521.js +1 -0
  11. package/apps/pwa/out/_next/static/chunks/1455-530ca16c7e71baff.js +1 -0
  12. package/apps/pwa/out/_next/static/chunks/{4527.a69f2894d1bc9f4a.js → 1487.2f67b79444062da6.js} +1 -1
  13. package/apps/pwa/out/_next/static/chunks/1574.878c18ecc97b1bd4.js +1 -0
  14. package/apps/pwa/out/_next/static/chunks/1586.fafc33a9a5835cb7.js +32 -0
  15. package/apps/pwa/out/_next/static/chunks/1744.855fd60ae4c4a8c8.js +1 -0
  16. package/apps/pwa/out/_next/static/chunks/193.21a47a3e07ef6860.js +1 -0
  17. package/apps/pwa/out/_next/static/chunks/1945.7b54990d578c119b.js +1 -0
  18. package/apps/pwa/out/_next/static/chunks/2004.e839fda7ea5a738a.js +1 -0
  19. package/apps/pwa/out/_next/static/chunks/2044-dd681a5c08779ff8.js +1 -0
  20. package/apps/pwa/out/_next/static/chunks/2101.2248decb38829b03.js +286 -0
  21. package/apps/pwa/out/_next/static/chunks/2160.a097e7b138ae1c55.js +23 -0
  22. package/apps/pwa/out/_next/static/chunks/2300.41ea70ac1bef1446.js +1 -0
  23. package/apps/pwa/out/_next/static/chunks/2357-07b5eeb5fb12628d.js +1 -0
  24. package/apps/pwa/out/_next/static/chunks/2364.28652020695a6db3.js +34 -0
  25. package/apps/pwa/out/_next/static/chunks/2456.b6de0e1c05f28843.js +1 -0
  26. package/apps/pwa/out/_next/static/chunks/2526.c3e50ac1fec064bd.js +1 -0
  27. package/apps/pwa/out/_next/static/chunks/2549-cda50b716ff4250c.js +1 -0
  28. package/apps/pwa/out/_next/static/chunks/2550-5f1e88f615568045.js +1 -0
  29. package/apps/pwa/out/_next/static/chunks/261-319078c954e40d66.js +1 -0
  30. package/apps/pwa/out/_next/static/chunks/{530.d26346e18089640a.js → 2690.0521c738b7749931.js} +1 -1
  31. package/apps/pwa/out/_next/static/chunks/{4702.4a4adc1f16d7c93b.js → 2974.595d1e29d040cb6a.js} +1 -1
  32. package/apps/pwa/out/_next/static/chunks/{2263.e09b6edea33bad2d.js → 3207.a756c95e9ec8c3c8.js} +1 -1
  33. package/apps/pwa/out/_next/static/chunks/{9541.eb8e2f8480c7feca.js → 3285.89ee2f298682f5e5.js} +2 -2
  34. package/apps/pwa/out/_next/static/chunks/{9507.7026657a2f47eb64.js → 3347.f846266b5e5f3ede.js} +16 -16
  35. package/apps/pwa/out/_next/static/chunks/3447.06edc7b092021417.js +41 -0
  36. package/apps/pwa/out/_next/static/chunks/{1178.1aa9cad0e7695427.js → 3482.a9ae9d2ad6a5bd97.js} +1 -1
  37. package/apps/pwa/out/_next/static/chunks/3507.97e1977bc4d5fb0a.js +2 -0
  38. package/apps/pwa/out/_next/static/chunks/3510-9ca392698bfe4391.js +1 -0
  39. package/apps/pwa/out/_next/static/chunks/3541.772e5ce425aaa611.js +24 -0
  40. package/apps/pwa/out/_next/static/chunks/3741.9cf76acaa2ee5298.js +1 -0
  41. package/apps/pwa/out/_next/static/chunks/{1661.0dd330f3d89f73f3.js → 3837.a210d7d0db8d8abd.js} +1 -1
  42. package/apps/pwa/out/_next/static/chunks/3898-955c896f394217a6.js +1 -0
  43. package/apps/pwa/out/_next/static/chunks/3947-ef57acea76eaa8d2.js +1 -0
  44. package/apps/pwa/out/_next/static/chunks/{2fdf2931.b431eee4fb468bc3.js → 3d0154af.5331fec737ffe8c3.js} +1 -1
  45. package/apps/pwa/out/_next/static/chunks/4037-3b82ebc7d78afdc7.js +1 -0
  46. package/apps/pwa/out/_next/static/chunks/4043.6b91203436c9c86b.js +309 -0
  47. package/apps/pwa/out/_next/static/chunks/405.9022d4a478202b67.js +77 -0
  48. package/apps/pwa/out/_next/static/chunks/417-fb2cc9a9910e5968.js +1 -0
  49. package/apps/pwa/out/_next/static/chunks/4276.336d76d858fcdf1b.js +1 -0
  50. package/apps/pwa/out/_next/static/chunks/4302.6ced9aa4535de947.js +1 -0
  51. package/apps/pwa/out/_next/static/chunks/4320.583cbab64db6be02.js +1 -0
  52. package/apps/pwa/out/_next/static/chunks/4768-8eac183fd291ca53.js +1 -0
  53. package/apps/pwa/out/_next/static/chunks/4770.769c9cd9c7034eba.js +148 -0
  54. package/apps/pwa/out/_next/static/chunks/4895.65605ec3e6504e89.js +74 -0
  55. package/apps/pwa/out/_next/static/chunks/50061469.0326382241ef3b2d.js +122 -0
  56. package/apps/pwa/out/_next/static/chunks/{1115.434ae2ecb0ad986d.js → 5112.4b9f300124fab7b3.js} +3 -3
  57. package/apps/pwa/out/_next/static/chunks/5335.375ee922bcd5bc83.js +1 -0
  58. package/apps/pwa/out/_next/static/chunks/5342.023a2e729689b320.js +27 -0
  59. package/apps/pwa/out/_next/static/chunks/53c73f84.373b6160adfa89a4.js +1 -0
  60. package/apps/pwa/out/_next/static/chunks/5431-72a1dbde59400691.js +1 -0
  61. package/apps/pwa/out/_next/static/chunks/5440-4236de26c5ea5856.js +1 -0
  62. package/apps/pwa/out/_next/static/chunks/5486-b318c165f645d8ba.js +1 -0
  63. package/apps/pwa/out/_next/static/chunks/5506-c7d2ec25c62a7c94.js +1 -0
  64. package/apps/pwa/out/_next/static/chunks/5570-c66ecbea26b4e3b1.js +1 -0
  65. package/apps/pwa/out/_next/static/chunks/5696.ffca5aa259d8451e.js +1 -0
  66. package/apps/pwa/out/_next/static/chunks/5793-8c584aea2aa87560.js +1 -0
  67. package/apps/pwa/out/_next/static/chunks/5848-6de6b8c173351a90.js +1 -0
  68. package/apps/pwa/out/_next/static/chunks/5885.0a3e52c8faccec98.js +287 -0
  69. package/apps/pwa/out/_next/static/chunks/5999.94e3c83040200f31.js +1 -0
  70. package/apps/pwa/out/_next/static/chunks/5a7901d6-2d8d9b5587cf9042.js +1 -0
  71. package/apps/pwa/out/_next/static/chunks/6131.348b7d6bdcd267ce.js +226 -0
  72. package/apps/pwa/out/_next/static/chunks/6164.86133a0172611184.js +90 -0
  73. package/apps/pwa/out/_next/static/chunks/{2073.689dcb2680113d76.js → 6377.bc7df239edbff244.js} +1 -1
  74. package/apps/pwa/out/_next/static/chunks/6515.e07e8b2b8a707a87.js +1 -0
  75. package/apps/pwa/out/_next/static/chunks/6522-c005514f87d18982.js +1 -0
  76. package/apps/pwa/out/_next/static/chunks/{1800.f7ff51dc4978a958.js → 6632.0eac1c554f8f2ef3.js} +1 -1
  77. package/apps/pwa/out/_next/static/chunks/6642.648adb1767f39ecf.js +1 -0
  78. package/apps/pwa/out/_next/static/chunks/6848.138805a09d001d09.js +1 -0
  79. package/apps/pwa/out/_next/static/chunks/7049-c09e2b7a253a24f3.js +1 -0
  80. package/apps/pwa/out/_next/static/chunks/7072.1e00447d9fa39972.js +104 -0
  81. package/apps/pwa/out/_next/static/chunks/7106.64201c539c5e220c.js +94 -0
  82. package/apps/pwa/out/_next/static/chunks/7151-1f742b455986530e.js +1 -0
  83. package/apps/pwa/out/_next/static/chunks/7199.18d6b25e001154ce.js +1 -0
  84. package/apps/pwa/out/_next/static/chunks/{2527-5c636a43c7cc5dde.js → 7279-c199ea83f34338fa.js} +1 -1
  85. package/apps/pwa/out/_next/static/chunks/728b938d.ffaa7ad583d60e58.js +1 -0
  86. package/apps/pwa/out/_next/static/chunks/7309.171c3de54e0322f1.js +1 -0
  87. package/apps/pwa/out/_next/static/chunks/733.7a1ab3342e03306f.js +1 -0
  88. package/apps/pwa/out/_next/static/chunks/{385e4574.e9886ab32759eda3.js → 73d2eb0e.4966ad55293c801a.js} +1 -1
  89. package/apps/pwa/out/_next/static/chunks/{5471.1e611302ed3a7c53.js → 7411.9b4b8b747dc7b802.js} +2 -2
  90. package/apps/pwa/out/_next/static/chunks/7504.d5cf1e7cd89b1b08.js +24 -0
  91. package/apps/pwa/out/_next/static/chunks/7573-0fd4af62d65d4598.js +1 -0
  92. package/apps/pwa/out/_next/static/chunks/759.6f8267df4689c401.js +1 -0
  93. package/apps/pwa/out/_next/static/chunks/7825-668b046f72f14483.js +1 -0
  94. package/apps/pwa/out/_next/static/chunks/7852-1538768b6eb19388.js +1 -0
  95. package/apps/pwa/out/_next/static/chunks/7868.cff810430bb63c91.js +1 -0
  96. package/apps/pwa/out/_next/static/chunks/{2fe2c302.41b517f88d6fe502.js → 7a98bc80.fa935989e829f9c2.js} +1 -1
  97. package/apps/pwa/out/_next/static/chunks/8084-dfcc796874ab4e07.js +1 -0
  98. package/apps/pwa/out/_next/static/chunks/8138.6c10b2a356d52fca.js +1 -0
  99. package/apps/pwa/out/_next/static/chunks/{5574.f35accf4f132b29d.js → 8262.ddc03e06b733f184.js} +1 -1
  100. package/apps/pwa/out/_next/static/chunks/8266.6bf9b131b2584678.js +1 -0
  101. package/apps/pwa/out/_next/static/chunks/8403.7b81d5e64074a725.js +8 -0
  102. package/apps/pwa/out/_next/static/chunks/8470.1998cbd0866a7eac.js +1 -0
  103. package/apps/pwa/out/_next/static/chunks/8505.fd803c6c33b54cc3.js +79 -0
  104. package/apps/pwa/out/_next/static/chunks/{8050-9b364bdef8f71927.js → 8546-6f03f8ea34dd61d9.js} +1 -1
  105. package/apps/pwa/out/_next/static/chunks/{5947-135e26537d80a6b9.js → 8673-bab689a55f7e13b9.js} +3 -3
  106. package/apps/pwa/out/_next/static/chunks/8687-246fda8433d3477c.js +1 -0
  107. package/apps/pwa/out/_next/static/chunks/898-280022fb082936bc.js +1 -0
  108. package/apps/pwa/out/_next/static/chunks/9098-50eefc1844212e3d.js +1 -0
  109. package/apps/pwa/out/_next/static/chunks/9211-330b6736a63d4cb3.js +1 -0
  110. package/apps/pwa/out/_next/static/chunks/{5937.c2df9e3447e1f667.js → 9249.976f1e69a9d80754.js} +1 -1
  111. package/apps/pwa/out/_next/static/chunks/9255-cf88fceda5666645.js +1 -0
  112. package/apps/pwa/out/_next/static/chunks/9306-e523ba58bb8adc42.js +1 -0
  113. package/apps/pwa/out/_next/static/chunks/9324.a9866d717ba62cb6.js +1 -0
  114. package/apps/pwa/out/_next/static/chunks/9325.a8510e8aa87c8143.js +1 -0
  115. package/apps/pwa/out/_next/static/chunks/{1971-7efb628c471dc5a0.js → 9353-12bfff0c130104cf.js} +1 -1
  116. package/apps/pwa/out/_next/static/chunks/{7191.fdc955f7d96064a4.js → 9415.69e4a21c60c7d2db.js} +1 -1
  117. package/apps/pwa/out/_next/static/chunks/{1219.7e17964e0e7cd8e5.js → 9427.96aa912ddb5801e0.js} +16 -16
  118. package/apps/pwa/out/_next/static/chunks/9479-154a697d4b6e4e98.js +1 -0
  119. package/apps/pwa/out/_next/static/chunks/9540-65aa6ccc31b3fd78.js +1 -0
  120. package/apps/pwa/out/_next/static/chunks/9633.ce5bddc56784da72.js +1 -0
  121. package/apps/pwa/out/_next/static/chunks/{5964-7e21164a8f2cf0ce.js → 9656-374232558fd528d0.js} +1 -1
  122. package/apps/pwa/out/_next/static/chunks/{6552.a3840aa7da35ad68.js → 9832.f4a98c878ecf2c0a.js} +1 -1
  123. package/apps/pwa/out/_next/static/chunks/9865.f094440645f02d98.js +1 -0
  124. package/apps/pwa/out/_next/static/chunks/9a852a62-6192a6ea9346ced3.js +1 -0
  125. package/apps/pwa/out/_next/static/chunks/app/_not-found/page-e772b4710df5d936.js +1 -0
  126. package/apps/pwa/out/_next/static/chunks/app/approvals/page-4361368e6a76b967.js +1 -0
  127. package/apps/pwa/out/_next/static/chunks/app/autopilot/page-802f349fdd65248d.js +1 -0
  128. package/apps/pwa/out/_next/static/chunks/app/board/page-7f35513988a2a495.js +1 -0
  129. package/apps/pwa/out/_next/static/chunks/app/botlab/page-798121656540e33e.js +1 -0
  130. package/apps/pwa/out/_next/static/chunks/app/bots/page-20a089490affe98c.js +1 -0
  131. package/apps/pwa/out/_next/static/chunks/app/ceo/page-e5e4ec786d70e604.js +1 -0
  132. package/apps/pwa/out/_next/static/chunks/app/chat/page-d12fe5d0801430e4.js +1 -0
  133. package/apps/pwa/out/_next/static/chunks/app/consult/page-d8cf21022fecc026.js +1 -0
  134. package/apps/pwa/out/_next/static/chunks/app/control/page-21ce565c9c57ee97.js +1 -0
  135. package/apps/pwa/out/_next/static/chunks/app/decisions/page-b56563025f619c9b.js +1 -0
  136. package/apps/pwa/out/_next/static/chunks/app/design-check/page-52f14dd133da8348.js +1 -0
  137. package/apps/pwa/out/_next/static/chunks/app/editor/page-c0ed7fdcdba76633.js +1 -0
  138. package/apps/pwa/out/_next/static/chunks/app/exec/page-af8c3020cb520f15.js +1 -0
  139. package/apps/pwa/out/_next/static/chunks/app/field/page-72eda67af9f5e35c.js +1 -0
  140. package/apps/pwa/out/_next/static/chunks/app/healthz/route-e772b4710df5d936.js +1 -0
  141. package/apps/pwa/out/_next/static/chunks/app/inside/page-67a6620d31f0a46f.js +1 -0
  142. package/apps/pwa/out/_next/static/chunks/app/intake/page-f059363aa0880ec2.js +1 -0
  143. package/apps/pwa/out/_next/static/chunks/app/layout-f9f917d6a57f69fb.js +1 -0
  144. package/apps/pwa/out/_next/static/chunks/app/live/page-d3ae55eee2f0826c.js +1 -0
  145. package/apps/pwa/out/_next/static/chunks/app/live-run/page-0e3d7b9421b79dac.js +1 -0
  146. package/apps/pwa/out/_next/static/chunks/app/loops/page-ba738f7e233eb211.js +1 -0
  147. package/apps/pwa/out/_next/static/chunks/app/market/page-33438b98c74fd599.js +1 -0
  148. package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-0b34d5fd990d793a.js +1 -0
  149. package/apps/pwa/out/_next/static/chunks/app/morning/page-0f291d3c8fd55a3a.js +1 -0
  150. package/apps/pwa/out/_next/static/chunks/app/not-found-3fced192be5279c1.js +1 -0
  151. package/apps/pwa/out/_next/static/chunks/app/observatory/page-04cb3cf182a7c1ea.js +1 -0
  152. package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-6ccbd2ab23a21542.js +1 -0
  153. package/apps/pwa/out/_next/static/chunks/app/ops/release/page-aa0518c48a5f4e56.js +1 -0
  154. package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-4b32226d341ad7d7.js +1 -0
  155. package/apps/pwa/out/_next/static/chunks/app/outputs/page-3224fd8f6383b61f.js +1 -0
  156. package/apps/pwa/out/_next/static/chunks/app/page-efbc97459f2914e2.js +1 -0
  157. package/apps/pwa/out/_next/static/chunks/app/reflection/page-2fe487d88cd5d97c.js +1 -0
  158. package/apps/pwa/out/_next/static/chunks/app/scheduler/page-48861dd1a858bab7.js +1 -0
  159. package/apps/pwa/out/_next/static/chunks/app/sessions/page-197d5d4d21d228ea.js +1 -0
  160. package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-a763ba89fbdd9c27.js +1 -0
  161. package/apps/pwa/out/_next/static/chunks/app/settings/page-7edb253510b1c136.js +1 -0
  162. package/apps/pwa/out/_next/static/chunks/app/setup/done/page-0c875702c61965ea.js +1 -0
  163. package/apps/pwa/out/_next/static/chunks/app/setup/layout-e772b4710df5d936.js +1 -0
  164. package/apps/pwa/out/_next/static/chunks/app/setup/page-e425c951151095f7.js +1 -0
  165. package/apps/pwa/out/_next/static/chunks/app/share/page-9c90e0aec4e27f77.js +1 -0
  166. package/apps/pwa/out/_next/static/chunks/app/showroom/page-733e09a02e727d42.js +1 -0
  167. package/apps/pwa/out/_next/static/chunks/app/tasks/page-4f899e14c34d77a1.js +1 -0
  168. package/apps/pwa/out/_next/static/chunks/app/term/page-bf067887b3307423.js +1 -0
  169. package/apps/pwa/out/_next/static/chunks/app/today/page-7af10868ff87d04e.js +1 -0
  170. package/apps/pwa/out/_next/static/chunks/app/trace/page-efe5304057aa11c7.js +1 -0
  171. package/apps/pwa/out/_next/static/chunks/app/vault/page-76bcd29aaa8a26c3.js +1 -0
  172. package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-4cfd88e2273ce50f.js +1 -0
  173. package/apps/pwa/out/_next/static/chunks/app/workflows/page-0a1ddb47efba0a32.js +1 -0
  174. package/apps/pwa/out/_next/static/chunks/app/workspace/page-2a176c707152c892.js +1 -0
  175. package/apps/pwa/out/_next/static/chunks/app/worktrees/page-efe03031b8797fbf.js +1 -0
  176. package/apps/pwa/out/_next/static/chunks/{a0a01613.6d1cca322238d7fe.js → b450776b.3db34d8d965f82d3.js} +1 -1
  177. package/apps/pwa/out/_next/static/chunks/{c0c1a699.0ba79f97005965d4.js → e8543907.5b040a5f22a0b0e5.js} +7 -7
  178. package/apps/pwa/out/_next/static/chunks/framework-d0d2d673bfd8a8a9.js +1 -0
  179. package/apps/pwa/out/_next/static/chunks/main-4c9fceb2baa09cb7.js +1 -0
  180. package/apps/pwa/out/_next/static/chunks/main-app-b0ab8d8fc9a97556.js +1 -0
  181. package/apps/pwa/out/_next/static/chunks/pages/_app-7e2cc62a2e5cec96.js +1 -0
  182. package/apps/pwa/out/_next/static/chunks/pages/_error-22324935f753ec5e.js +1 -0
  183. package/apps/pwa/out/_next/static/chunks/webpack-9dc1bfa25334998a.js +1 -0
  184. package/apps/pwa/out/_next/static/css/{b9d8151e48998417.css → 62c858ad53854f47.css} +1 -1
  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 +23 -24
  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 +22 -22
  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 +23 -24
  222. package/apps/pwa/out/live-run/index.html +1 -1
  223. package/apps/pwa/out/live-run/index.txt +23 -24
  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/docs/goal-context/04-mock-scenarios.md +13 -0
  279. package/graphs/catalog/catalog.yaml +1 -1
  280. package/graphs/heal/heal-loop.yaml +1 -0
  281. package/graphs/overlays/stop-heal-ladder.yaml +113 -0
  282. package/graphs/units/verbs/recipes.yaml +11 -11
  283. package/graphs/work/research-report.yaml +10 -2
  284. package/package.json +1 -1
  285. package/scripts/heal/run-role.ts +99 -5
  286. package/scripts/land-global-checks.ts +6 -1
  287. package/scripts/lib/decompose-ab.ts +1 -0
  288. package/scripts/lib/fixtures/tui-regress/help-insufficient-commands.txt +15 -0
  289. package/scripts/lib/fixtures/tui-regress/help-live.txt +42 -0
  290. package/scripts/lib/fixtures/tui-regress/help-missing-keys.txt +21 -0
  291. package/scripts/lib/fixtures/tui-regress/help-original.txt +51 -0
  292. package/scripts/lib/fixtures/tui-regress/help-shifted-input.txt +26 -0
  293. package/scripts/lib/tui-regress-checks.ts +33 -13
  294. package/scripts/release-loop/gate-baseline-receipt.ts +47 -9
  295. package/scripts/release-loop/gate-image-pin.ts +81 -0
  296. package/scripts/release-loop/gate-node-sim.ts +207 -0
  297. package/scripts/release-loop/gate-node.ts +285 -46
  298. package/scripts/release-loop/gate-pod-image-sticky-plan.ts +99 -0
  299. package/scripts/release-loop/gate-radius-live.ts +97 -13
  300. package/scripts/release-loop/gate-shard-dispatch.ts +43 -0
  301. package/scripts/release-loop/gate-train-receipts.ts +122 -0
  302. package/scripts/release-loop/resume-release.ts +83 -8
  303. package/scripts/ux-sim.ts +18 -1
  304. package/scripts/warm-pool-provider-config.ts +263 -0
  305. package/skills/omni-crawl/SKILL.md +5 -2
  306. package/skills/omni-crawl/scripts/main.ts +84 -23
  307. package/src/acp/core-turn-bridge.ts +13 -0
  308. package/src/agent/registry.ts +2 -0
  309. package/src/agent/task-notification.ts +25 -5
  310. package/src/agent/types.ts +6 -0
  311. package/src/agent-mission/mission-cli.ts +24 -0
  312. package/src/agent-mission/mission-out.ts +595 -0
  313. package/src/agent-mission/tool-install.ts +88 -2
  314. package/src/agent-substrate/context-strategy.ts +4 -4
  315. package/src/agent-substrate/self-review-cli.ts +178 -13
  316. package/src/auto-research/research-turn.ts +123 -50
  317. package/src/autopilot/pr-manager.ts +38 -7
  318. package/src/autopilot/pty-control-loop.ts +2 -0
  319. package/src/capture/tui-self-report.ts +22 -6
  320. package/src/chat/index.ts +1 -1
  321. package/src/cli/fixtures/review-loop-breaker/opwaiver-32646-1694ccc7a170.json +1 -0
  322. package/src/cli/fixtures/review-loop-breaker/opwaiver-32853-bd8f73595c83.json +1 -0
  323. package/src/cli/fixtures/review-loop-breaker/opwaiver-33097-1cc85900413c.json +1 -0
  324. package/src/cli/fixtures/review-loop-breaker/opwaiver-33106-972f31e4a3ca.json +1 -0
  325. package/src/cli/fixtures/review-loop-breaker/opwaiver-33113-3ab51f05968f.json +1 -0
  326. package/src/cli/fixtures/review-loop-breaker/pr-33097-1cc85900413c.json +1 -0
  327. package/src/cli/pr-land-heavy-remote.ts +32 -0
  328. package/src/cli/pr-land-overlap-evidence.ts +100 -1
  329. package/src/cli/pr-land-pod-shadow-job.ts +60 -0
  330. package/src/cli/release-checklist-read-cli.ts +20 -10
  331. package/src/cli/research-cli.ts +4 -5
  332. package/src/cli/tasks-cli.ts +7 -0
  333. package/src/compact/auto.ts +8 -1
  334. package/src/control-plane/ledger.ts +52 -2
  335. package/src/control-plane/server.ts +16 -2
  336. package/src/core-turn/run-core-turn.ts +311 -90
  337. package/src/core-turn/run-goal-loop.ts +18 -0
  338. package/src/core-turn/types.ts +2 -0
  339. package/src/dashboard/classic-sidetab-mission-job.ts +58 -0
  340. package/src/dashboard/classic-sidetab-mission.ts +185 -0
  341. package/src/dashboard/index.ts +149 -15
  342. package/src/dashboard/input/agent-wake.ts +23 -1
  343. package/src/dashboard/input/chat-main-plain-turn-runtime.ts +9 -0
  344. package/src/dashboard/mission-cli-consumer.ts +153 -0
  345. package/src/dashboard/seat-boot-preamble.ts +171 -1
  346. package/src/dashboard/side-basic-runtime.ts +54 -1
  347. package/src/dashboard/sidetab-runtime.ts +90 -1
  348. package/src/dashboard/skill-catalog-preamble.ts +101 -0
  349. package/src/dashboard/skill-detection-runtime.ts +55 -15
  350. package/src/dashboard/slash-runtime/dashboard-handlers.ts +15 -0
  351. package/src/dashboard/turn-preamble.ts +53 -15
  352. package/src/dashboard/turn-prompt-runtime.ts +4 -2
  353. package/src/graph-runner/graph-cli.ts +23 -7
  354. package/src/graph-runner/graph-tick.ts +10 -2
  355. package/src/graph-runner/runner.ts +1 -1
  356. package/src/grok/agent-search.ts +14 -4
  357. package/src/grok/credential.ts +28 -11
  358. package/src/harness/harness-pod-dispatch.ts +81 -15
  359. package/src/harness/harness-stop.ts +155 -11
  360. package/src/index.ts +34 -5
  361. package/src/instance/spawn-elanous.ts +6 -4
  362. package/src/llm.ts +166 -8
  363. package/src/loops/orchestrator/coordinator-shadow.ts +226 -0
  364. package/src/loops/orchestrator/tick.ts +13 -0
  365. package/src/maturity/feature-maturity.ts +1 -1
  366. package/src/native-tool-catalog.ts +2 -2
  367. package/src/nexus/api/harness-traversal.ts +11 -0
  368. package/src/pr-tool/census.ts +3 -2
  369. package/src/pty-shell/tui-run-state.ts +188 -2
  370. package/src/release-loop/checklist-target-path-hint.ts +13 -0
  371. package/src/release-loop/checklist.ts +9 -1
  372. package/src/repl/index.ts +43 -2
  373. package/src/research/axis-fanout.ts +121 -16
  374. package/src/research/bloom-exemplars.ts +3 -1
  375. package/src/research/gap-followup.ts +13 -1
  376. package/src/research/plugin-discovery.ts +36 -14
  377. package/src/research-bridge/invoke.ts +22 -5
  378. package/src/research-bridge/types.ts +2 -0
  379. package/src/self-dev/decompose.ts +119 -5
  380. package/src/self-dev/launch-preflight-text.ts +5 -6
  381. package/src/self-dev/orchestrate.ts +12 -2
  382. package/src/self-dev/review-provider-fallback.ts +9 -2
  383. package/src/self-dev/run-supervisor.ts +42 -4
  384. package/src/self-dev/run-types.ts +4 -0
  385. package/src/self-implement/doctor-visit.ts +88 -0
  386. package/src/self-implement/goal-author.ts +326 -3
  387. package/src/self-implement/graph-overlay-yaml.ts +7 -0
  388. package/src/self-implement/headless-elanous-driver.ts +31 -2
  389. package/src/self-implement/heal-intake.ts +112 -4
  390. package/src/self-implement/heal-triage.ts +20 -0
  391. package/src/self-implement/host-regate.ts +27 -4
  392. package/src/self-implement/merge-train.ts +5 -0
  393. package/src/self-implement/orchestrator.ts +126 -11
  394. package/src/self-implement/regate-detail.ts +38 -1
  395. package/src/self-implement/rework-child-provider.ts +25 -0
  396. package/src/self-implement/run-chart.ts +119 -0
  397. package/src/self-implement/run-ledger.ts +112 -11
  398. package/src/self-implement/run-stop.ts +188 -4
  399. package/src/self-implement/stop-autoheal.ts +13 -0
  400. package/src/session/chat.ts +38 -4
  401. package/src/session-runtime/index.ts +98 -4
  402. package/src/session-runtime/tier-flip.ts +3 -3
  403. package/src/sidetab-core/model.ts +19 -5
  404. package/src/sidetab-core/visible-agent-mission.ts +186 -0
  405. package/src/skills/name-match.ts +20 -0
  406. package/src/skills/tools/agent.ts +30 -2
  407. package/src/skills/tools/omni-search.ts +67 -5
  408. package/src/task-agent/pod-distributor-entry.ts +3 -0
  409. package/src/task-agent/task-hand.ts +27 -0
  410. package/src/task-orchestrator/surfaces/pod-distributor.ts +48 -0
  411. package/src/task-orchestrator/surfaces/pod-ledger-collect.ts +38 -1
  412. package/src/task-orchestrator/surfaces/pod-si-warm-entry.ts +33 -6
  413. package/src/task-orchestrator/surfaces/pod-source-bundle.ts +45 -9
  414. package/src/task-orchestrator/surfaces/pod-source-receive.ts +163 -13
  415. package/src/task-orchestrator/surfaces/pod-source-spec.ts +3 -3
  416. package/src/task-orchestrator/surfaces/pod-warm-worker-provider.ts +209 -39
  417. package/src/task-orchestrator/surfaces/pod-warm-worker-runtime.ts +80 -3
  418. package/src/task-orchestrator/surfaces/self-implement-pod.ts +165 -45
  419. package/src/tokens.ts +35 -2
  420. package/src/tool-runtime/agent-runtime.ts +1 -0
  421. package/src/tool-runtime/elanous-skills-list-runtime.ts +5 -1
  422. package/src/tool-runtime/skill-exec-runtime.ts +33 -13
  423. package/src/tool-runtime/types.ts +1 -0
  424. package/src/tui/entry.ts +14 -4
  425. package/src/tui/sidetab/attach.ts +47 -0
  426. package/src/tui-client/local-chat-turn.ts +26 -13
  427. package/src/tui.ts +22 -0
  428. package/src/ux-sim/fake-kubectl.ts +37 -3
  429. package/src/ux-sim/fault-pool-cap.ts +11 -6
  430. package/src/ux-sim/mock-scenario-catalog.json +41 -0
  431. package/src/ux-sim/mock-scenario-catalog.ts +156 -0
  432. package/src/ux-sim/scenario.ts +116 -23
  433. package/src/version/packed-revision.json +1 -1
  434. package/src/voice/voice-tts-singleton.ts +18 -3
  435. package/src/web-search/grok.ts +5 -9
  436. package/apps/pwa/out/_next/static/chunks/1121.667cec0bcdbb3fdb.js +0 -36
  437. package/apps/pwa/out/_next/static/chunks/1197-54da59d250a6e476.js +0 -1
  438. package/apps/pwa/out/_next/static/chunks/1245.1cfd13b26dbd71d6.js +0 -287
  439. package/apps/pwa/out/_next/static/chunks/1494-f93046ff5c5a124d.js +0 -1
  440. package/apps/pwa/out/_next/static/chunks/1609.2b312797599b8e45.js +0 -1
  441. package/apps/pwa/out/_next/static/chunks/167-0c121e4b47e0f9da.js +0 -1
  442. package/apps/pwa/out/_next/static/chunks/1700.cdc2bf8cc685e221.js +0 -90
  443. package/apps/pwa/out/_next/static/chunks/1703-78e46acad29f3cfc.js +0 -1
  444. package/apps/pwa/out/_next/static/chunks/1765.679b29625c8e88d4.js +0 -77
  445. package/apps/pwa/out/_next/static/chunks/1999-8de7b7bb36801913.js +0 -1
  446. package/apps/pwa/out/_next/static/chunks/2198-557d49184104d165.js +0 -1
  447. package/apps/pwa/out/_next/static/chunks/221-440ce67fa9f5c839.js +0 -1
  448. package/apps/pwa/out/_next/static/chunks/2427-8ed8e98624cbd664.js +0 -1
  449. package/apps/pwa/out/_next/static/chunks/2457-725c5827bc003795.js +0 -1
  450. package/apps/pwa/out/_next/static/chunks/2491-2718b15a5ccb75a5.js +0 -1
  451. package/apps/pwa/out/_next/static/chunks/2692-1027cb16fe4ccf49.js +0 -1
  452. package/apps/pwa/out/_next/static/chunks/2743.5d3f76948be32b34.js +0 -41
  453. package/apps/pwa/out/_next/static/chunks/2773.0e80b9d325fb5635.js +0 -32
  454. package/apps/pwa/out/_next/static/chunks/2873-0f3cb56c8e3528ea.js +0 -1
  455. package/apps/pwa/out/_next/static/chunks/3097.864e92bdaa2f4d15.js +0 -79
  456. package/apps/pwa/out/_next/static/chunks/3136-d6870ba63300a93e.js +0 -1
  457. package/apps/pwa/out/_next/static/chunks/3173-0289113d434e83b7.js +0 -1
  458. package/apps/pwa/out/_next/static/chunks/3230-49298c3b73ef2268.js +0 -1
  459. package/apps/pwa/out/_next/static/chunks/325-dd9208a1a0ab7ce4.js +0 -1
  460. package/apps/pwa/out/_next/static/chunks/3283.528f430dd043fb4e.js +0 -74
  461. package/apps/pwa/out/_next/static/chunks/3295.cc8cb13b8f0dae1a.js +0 -1
  462. package/apps/pwa/out/_next/static/chunks/3688-86e3b88abf18cb3b.js +0 -1
  463. package/apps/pwa/out/_next/static/chunks/3804-7220467a5473a8df.js +0 -1
  464. package/apps/pwa/out/_next/static/chunks/3808.3e1e247ce7bdf889.js +0 -1
  465. package/apps/pwa/out/_next/static/chunks/3927.b5473ad109da44c5.js +0 -1
  466. package/apps/pwa/out/_next/static/chunks/3934-98ea94832e194796.js +0 -1
  467. package/apps/pwa/out/_next/static/chunks/4133.2056bb4d78f621af.js +0 -1
  468. package/apps/pwa/out/_next/static/chunks/4156.ba4de4a3664f04b4.js +0 -1
  469. package/apps/pwa/out/_next/static/chunks/4297-239ca82f293faab0.js +0 -1
  470. package/apps/pwa/out/_next/static/chunks/4320-dcc5a7734126f4c9.js +0 -1
  471. package/apps/pwa/out/_next/static/chunks/4434.94b4c552a2d91e69.js +0 -148
  472. package/apps/pwa/out/_next/static/chunks/4579.03e4092f73950965.js +0 -226
  473. package/apps/pwa/out/_next/static/chunks/4667.97e31aa38c95c475.js +0 -309
  474. package/apps/pwa/out/_next/static/chunks/4815.481501c57b3568d9.js +0 -1
  475. package/apps/pwa/out/_next/static/chunks/487-d16e698ef14662d9.js +0 -1
  476. package/apps/pwa/out/_next/static/chunks/4888-7a38bf522c9cc6fe.js +0 -1
  477. package/apps/pwa/out/_next/static/chunks/5034-30e429d6bb086881.js +0 -1
  478. package/apps/pwa/out/_next/static/chunks/5040-35c494e60dadd97d.js +0 -1
  479. package/apps/pwa/out/_next/static/chunks/50c6ab1e.81a96e419350909d.js +0 -1
  480. package/apps/pwa/out/_next/static/chunks/5154.4b6a836179356f30.js +0 -94
  481. package/apps/pwa/out/_next/static/chunks/5228-a8200df486278f2d.js +0 -1
  482. package/apps/pwa/out/_next/static/chunks/5379.97af106d09566f69.js +0 -8
  483. package/apps/pwa/out/_next/static/chunks/53aeb4ee-51c92f8d683f5220.js +0 -1
  484. package/apps/pwa/out/_next/static/chunks/5479-b6372e762719f92f.js +0 -1
  485. package/apps/pwa/out/_next/static/chunks/5534-699c5cbcbc96c5d7.js +0 -1
  486. package/apps/pwa/out/_next/static/chunks/5701.9c4e8f250312eeee.js +0 -24
  487. package/apps/pwa/out/_next/static/chunks/5744.b9415e18ad623100.js +0 -23
  488. package/apps/pwa/out/_next/static/chunks/5892.2526d962339662d8.js +0 -1
  489. package/apps/pwa/out/_next/static/chunks/5941.8210cc93c9202c0a.js +0 -286
  490. package/apps/pwa/out/_next/static/chunks/5975.4004f820ae3cecd5.js +0 -1
  491. package/apps/pwa/out/_next/static/chunks/6142-7ccd48795d7abd55.js +0 -1
  492. package/apps/pwa/out/_next/static/chunks/6160.bf9177b8c1bfb243.js +0 -1
  493. package/apps/pwa/out/_next/static/chunks/6398.71ba0690c8027555.js +0 -27
  494. package/apps/pwa/out/_next/static/chunks/6492.2bd5c10edc1a064e.js +0 -1
  495. package/apps/pwa/out/_next/static/chunks/6736.1e36d3ac5fa5e41d.js +0 -24
  496. package/apps/pwa/out/_next/static/chunks/6874.d5cf7eb8edb2cabe.js +0 -2
  497. package/apps/pwa/out/_next/static/chunks/6900.3ccbe069bdd4556a.js +0 -1
  498. package/apps/pwa/out/_next/static/chunks/71327eb4.add50b365f94bf3a.js +0 -122
  499. package/apps/pwa/out/_next/static/chunks/7136.deca3e3a2ddaa374.js +0 -1
  500. package/apps/pwa/out/_next/static/chunks/7139-ee9f8ed2677a40b3.js +0 -1
  501. package/apps/pwa/out/_next/static/chunks/7423-e0aa5d9e2962120e.js +0 -1
  502. package/apps/pwa/out/_next/static/chunks/7453.afc1ea7e05d56a8c.js +0 -1
  503. package/apps/pwa/out/_next/static/chunks/7503-5e6a3d7fe67e4a0c.js +0 -1
  504. package/apps/pwa/out/_next/static/chunks/7761-476fd7bf768abd34.js +0 -1
  505. package/apps/pwa/out/_next/static/chunks/7975.eafb12097a0a9e62.js +0 -1
  506. package/apps/pwa/out/_next/static/chunks/8152.64e253c35cccfaae.js +0 -1
  507. package/apps/pwa/out/_next/static/chunks/8190.620f0231b3924bcb.js +0 -1
  508. package/apps/pwa/out/_next/static/chunks/83184dcd-0ee6247ff41eb3f2.js +0 -1
  509. package/apps/pwa/out/_next/static/chunks/8448.45b6b1f1a99eeb35.js +0 -104
  510. package/apps/pwa/out/_next/static/chunks/8464-e24f10451b658aac.js +0 -1
  511. package/apps/pwa/out/_next/static/chunks/8477.e4c944bb3aa5d2f3.js +0 -1
  512. package/apps/pwa/out/_next/static/chunks/8710.ca385257d5ca422e.js +0 -1
  513. package/apps/pwa/out/_next/static/chunks/8830.627ccf294ec2465c.js +0 -1
  514. package/apps/pwa/out/_next/static/chunks/8880.64c445592f04acaf.js +0 -1
  515. package/apps/pwa/out/_next/static/chunks/8981.c706964c8ba27aff.js +0 -1
  516. package/apps/pwa/out/_next/static/chunks/9053.bd0fffaff8d3f836.js +0 -1
  517. package/apps/pwa/out/_next/static/chunks/9161-c66e723d7ec9d682.js +0 -1
  518. package/apps/pwa/out/_next/static/chunks/9185.1ecdf9b65c0bb684.js +0 -1
  519. package/apps/pwa/out/_next/static/chunks/9356.fccd5f58086b4ff5.js +0 -1
  520. package/apps/pwa/out/_next/static/chunks/9446.dc0406109371d329.js +0 -1
  521. package/apps/pwa/out/_next/static/chunks/9506.dcf25d467a42627e.js +0 -1
  522. package/apps/pwa/out/_next/static/chunks/9577.ed7582186efa5482.js +0 -1
  523. package/apps/pwa/out/_next/static/chunks/9579.4a8169600fff2058.js +0 -1
  524. package/apps/pwa/out/_next/static/chunks/9642-ff2e039eb62e3b92.js +0 -1
  525. package/apps/pwa/out/_next/static/chunks/9659-8f2323348113ad80.js +0 -1
  526. package/apps/pwa/out/_next/static/chunks/9724.4c5623af2db43153.js +0 -34
  527. package/apps/pwa/out/_next/static/chunks/9834.63ab2bbc3153172e.js +0 -1
  528. package/apps/pwa/out/_next/static/chunks/9869.81a1e24ca682d5a0.js +0 -1
  529. package/apps/pwa/out/_next/static/chunks/addc2b32.8c4ff8f0aefe987d.js +0 -1
  530. package/apps/pwa/out/_next/static/chunks/app/_not-found/page-8d9d76ea322d855c.js +0 -1
  531. package/apps/pwa/out/_next/static/chunks/app/approvals/page-ed2c4e59f9f1fe21.js +0 -1
  532. package/apps/pwa/out/_next/static/chunks/app/autopilot/page-2dc99e03c5d76ca0.js +0 -1
  533. package/apps/pwa/out/_next/static/chunks/app/board/page-b5a3a788330e920f.js +0 -1
  534. package/apps/pwa/out/_next/static/chunks/app/botlab/page-14949db884bfa672.js +0 -1
  535. package/apps/pwa/out/_next/static/chunks/app/bots/page-ea76c85b36388a97.js +0 -1
  536. package/apps/pwa/out/_next/static/chunks/app/ceo/page-01716d20af62d325.js +0 -1
  537. package/apps/pwa/out/_next/static/chunks/app/chat/page-62baf6881a64b1e9.js +0 -1
  538. package/apps/pwa/out/_next/static/chunks/app/consult/page-f89ba590c2af8afa.js +0 -1
  539. package/apps/pwa/out/_next/static/chunks/app/control/page-22f8b0f78d9637e5.js +0 -1
  540. package/apps/pwa/out/_next/static/chunks/app/decisions/page-817f9d7e6820be80.js +0 -1
  541. package/apps/pwa/out/_next/static/chunks/app/design-check/page-ffb9bc0d2650249a.js +0 -1
  542. package/apps/pwa/out/_next/static/chunks/app/editor/page-f6d0e64873c0f629.js +0 -1
  543. package/apps/pwa/out/_next/static/chunks/app/exec/page-8bfa0d4ba23a209d.js +0 -1
  544. package/apps/pwa/out/_next/static/chunks/app/field/page-f5060462249e32c7.js +0 -1
  545. package/apps/pwa/out/_next/static/chunks/app/healthz/route-8d9d76ea322d855c.js +0 -1
  546. package/apps/pwa/out/_next/static/chunks/app/inside/page-b2049f8b1ef79117.js +0 -1
  547. package/apps/pwa/out/_next/static/chunks/app/intake/page-1446c5fa93907f11.js +0 -1
  548. package/apps/pwa/out/_next/static/chunks/app/layout-b48a7a07c5204156.js +0 -1
  549. package/apps/pwa/out/_next/static/chunks/app/live/page-e974b8c4ca47614c.js +0 -1
  550. package/apps/pwa/out/_next/static/chunks/app/live-run/page-8a919b869bd28594.js +0 -1
  551. package/apps/pwa/out/_next/static/chunks/app/loops/page-d31b8de6bfcd72ed.js +0 -1
  552. package/apps/pwa/out/_next/static/chunks/app/market/page-64765f817909db29.js +0 -1
  553. package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-d128c8569a36ee9b.js +0 -1
  554. package/apps/pwa/out/_next/static/chunks/app/morning/page-b2679d357e9b9270.js +0 -1
  555. package/apps/pwa/out/_next/static/chunks/app/not-found-6fabec98a9e7b269.js +0 -1
  556. package/apps/pwa/out/_next/static/chunks/app/observatory/page-048f30149dcf1349.js +0 -1
  557. package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-9113181d6b5a2725.js +0 -1
  558. package/apps/pwa/out/_next/static/chunks/app/ops/release/page-40f9e19149024298.js +0 -1
  559. package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-1e7a755a13227611.js +0 -1
  560. package/apps/pwa/out/_next/static/chunks/app/outputs/page-3c8f8b67a203cf07.js +0 -1
  561. package/apps/pwa/out/_next/static/chunks/app/page-18032f5437215062.js +0 -1
  562. package/apps/pwa/out/_next/static/chunks/app/reflection/page-da3b739192fd0ee3.js +0 -1
  563. package/apps/pwa/out/_next/static/chunks/app/scheduler/page-d332545571bd6fd1.js +0 -1
  564. package/apps/pwa/out/_next/static/chunks/app/sessions/page-5237aa5b3f3b8ec5.js +0 -1
  565. package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-a142dfb0331a05f5.js +0 -1
  566. package/apps/pwa/out/_next/static/chunks/app/settings/page-d16e56c3989c147e.js +0 -1
  567. package/apps/pwa/out/_next/static/chunks/app/setup/done/page-6b6593600869e2cd.js +0 -1
  568. package/apps/pwa/out/_next/static/chunks/app/setup/layout-8d9d76ea322d855c.js +0 -1
  569. package/apps/pwa/out/_next/static/chunks/app/setup/page-29e8b8a8396b55cb.js +0 -1
  570. package/apps/pwa/out/_next/static/chunks/app/share/page-b3414d856a1a7e2f.js +0 -1
  571. package/apps/pwa/out/_next/static/chunks/app/showroom/page-c3affa52b7ce961b.js +0 -1
  572. package/apps/pwa/out/_next/static/chunks/app/tasks/page-f21dddf9f95b6fab.js +0 -1
  573. package/apps/pwa/out/_next/static/chunks/app/term/page-f5a30a24745bf088.js +0 -1
  574. package/apps/pwa/out/_next/static/chunks/app/today/page-8c8569a09b4d4e34.js +0 -1
  575. package/apps/pwa/out/_next/static/chunks/app/trace/page-2ce32722c0243483.js +0 -1
  576. package/apps/pwa/out/_next/static/chunks/app/vault/page-4767b0d9c0a98c6c.js +0 -1
  577. package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-116ee1339c387a75.js +0 -1
  578. package/apps/pwa/out/_next/static/chunks/app/workflows/page-35e8c50ca4ef7ffc.js +0 -1
  579. package/apps/pwa/out/_next/static/chunks/app/workspace/page-52e17113356bb891.js +0 -1
  580. package/apps/pwa/out/_next/static/chunks/app/worktrees/page-7458ae05ed2ac1a0.js +0 -1
  581. package/apps/pwa/out/_next/static/chunks/b2271e54.c1de3347976e90b0.js +0 -1
  582. package/apps/pwa/out/_next/static/chunks/framework-ad6c9dd524ad6ef8.js +0 -1
  583. package/apps/pwa/out/_next/static/chunks/main-app-2ddd1f2b44d6aa59.js +0 -1
  584. package/apps/pwa/out/_next/static/chunks/main-e3d82bdc358d20c5.js +0 -1
  585. package/apps/pwa/out/_next/static/chunks/pages/_app-71d5aa3896e1655f.js +0 -1
  586. package/apps/pwa/out/_next/static/chunks/pages/_error-03ffc54e00438546.js +0 -1
  587. package/apps/pwa/out/_next/static/chunks/webpack-56bb89af5a611d0b.js +0 -1
  588. package/apps/pwa/out/_next/static/css/d0a48dc099ed86cf.css +0 -1
  589. /package/apps/pwa/out/_next/static/{GiOLWmt4MqDZePubBjA4Q → X1ucLw10Cds_h614NoEnh}/_ssgManifest.js +0 -0
@@ -0,0 +1,153 @@
1
+ import { mkdtempSync, rmSync, writeFileSync } from 'node:fs';
2
+ import { tmpdir } from 'node:os';
3
+ import { join } from 'node:path';
4
+ import { spawnElanous } from '../instance/spawn-elanous.js';
5
+
6
+ export interface ClassicMissionCliResult {
7
+ ok: boolean;
8
+ status: 'completed' | 'cancelled' | 'failed';
9
+ interactionId?: string;
10
+ path: string;
11
+ content?: string;
12
+ error?: string;
13
+ }
14
+ interface MissionStatus {
15
+ missionId: string;
16
+ status: 'running' | 'done' | 'completed' | 'cancelled' | 'failed';
17
+ result?: string;
18
+ }
19
+
20
+ const MISSION_ID = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
21
+ // Status is persisted by the CLI bridge; polling every 500 ms would launch up to
22
+ // 7,200 short-lived CLI processes for a one-hour mission. Five seconds keeps
23
+ // eventual completion observable without turning the dashboard into a process loop.
24
+ const POLL_MS = 5_000;
25
+ const MAX_WAIT_MS = 60 * 60 * 1_000;
26
+
27
+ function runCli(args: string[]): Promise<{ code: number | null; stdout: string; stderr: string }> {
28
+ return new Promise((resolve, reject) => {
29
+ // `process.argv[1]` belongs to the parent surface and can be a TUI-only
30
+ // entry. Always route detached mission operations through the installed
31
+ // CLI command, whose `mission` router owns run/status/cancel.
32
+ const child = spawnElanous(args, { executable: 'eln',
33
+ cwd: process.cwd(),
34
+ env: { ...process.env, ELANOUS_FAST_ROUTER: '0' },
35
+ stdio: ['ignore', 'pipe', 'pipe'],
36
+ });
37
+ if (!child.stdout || !child.stderr) { reject(new Error('Installed CLI streams could not be opened')); return; }
38
+ let stdout = '';
39
+ let stderr = '';
40
+ child.stdout.setEncoding('utf8');
41
+ child.stderr.setEncoding('utf8');
42
+ child.stdout.on('data', (chunk: string) => { stdout = `${stdout}${chunk}`.slice(-64_000); });
43
+ child.stderr.on('data', (chunk: string) => { stderr = `${stderr}${chunk}`.slice(-8_000); });
44
+ child.once('error', reject);
45
+ child.once('close', (code) => resolve({ code, stdout, stderr }));
46
+ });
47
+ }
48
+
49
+ function parseJson<T>(result: { code: number | null; stdout: string; stderr: string }): T {
50
+ if (result.code !== 0) throw new Error('Mission CLI command failed');
51
+ try { return JSON.parse(result.stdout) as T; }
52
+ catch { throw new Error('Mission CLI returned invalid JSON'); }
53
+ }
54
+
55
+ const delay = (ms: number): Promise<void> => new Promise((resolve) => setTimeout(resolve, ms));
56
+
57
+ export interface MissionCliConsumerDeps {
58
+ runCli?: typeof runCli;
59
+ delay?: (ms: number) => Promise<void>;
60
+ now?: () => number;
61
+ }
62
+
63
+ export interface StartedClassicMissionCliJob {
64
+ ok: true;
65
+ status: 'running';
66
+ interactionId: string;
67
+ path: string;
68
+ startedAt: number;
69
+ completion: Promise<ClassicMissionCliResult>;
70
+ }
71
+
72
+ export type StartClassicMissionCliResult = StartedClassicMissionCliJob | ClassicMissionCliResult;
73
+
74
+ export function redactMissionResultPath(text: string, path?: string): string {
75
+ return path ? text.replaceAll(path, '[internal result]') : text;
76
+ }
77
+
78
+ export function isClassicMissionId(value: string): boolean {
79
+ return MISSION_ID.test(value);
80
+ }
81
+
82
+ /** Explicitly cancel a detached sidetab mission; parent-turn aborts never call this. */
83
+ export async function cancelClassicMissionCli(interactionId: string, executeCli: typeof runCli = runCli): Promise<boolean> {
84
+ if (!isClassicMissionId(interactionId)) return false;
85
+ const result = parseJson<{ missionId: string; status: string; cancelled: boolean }>(
86
+ await executeCli(['mission', 'cancel', interactionId, '--json']),
87
+ );
88
+ return result.missionId === interactionId && result.cancelled === true && result.status === 'cancelled';
89
+ }
90
+
91
+ /** Start a detached mission and return its identity immediately; poll results independently. */
92
+ export async function startClassicMissionCli(input: {
93
+ agent: 'codex' | 'claude';
94
+ prompt: string;
95
+ onInteractionId?: (interactionId: string) => void;
96
+ }, deps: MissionCliConsumerDeps = {}): Promise<StartClassicMissionCliResult> {
97
+ const executeCli = deps.runCli ?? runCli;
98
+ const wait = deps.delay ?? delay;
99
+ const now = deps.now ?? Date.now;
100
+ const tempRoot = mkdtempSync(join(tmpdir(), 'elanous-classic-mission-'));
101
+ const promptPath = join(tempRoot, 'prompt.txt');
102
+ const outputPath = join(tempRoot, 'result.md');
103
+ let interactionId: string | undefined;
104
+ const startedAt = now();
105
+ try {
106
+ writeFileSync(promptPath, input.prompt, { encoding: 'utf8', mode: 0o600 });
107
+ const launched = parseJson<{ missionId: string; status: 'running' }>(await executeCli([
108
+ 'mission', 'run', '--agent', input.agent, '--prompt-file', promptPath, '--out', outputPath, '--json',
109
+ ]));
110
+ if (!isClassicMissionId(launched.missionId) || launched.status !== 'running') throw new Error('Mission CLI returned an invalid interaction ID');
111
+ interactionId = launched.missionId;
112
+ try { input.onInteractionId?.(interactionId); } catch { /* telemetry must not interrupt mission startup */ }
113
+ const completion = (async (): Promise<ClassicMissionCliResult> => {
114
+ try {
115
+ while (now() - startedAt < MAX_WAIT_MS) {
116
+ const status: MissionStatus = parseJson<MissionStatus>(await executeCli(['mission', 'status', interactionId!, '--json']));
117
+ if (status.missionId !== interactionId) throw new Error('Mission status did not match its interaction ID');
118
+ // `eln mission status --json` exposes completed records as `done`.
119
+ // Keep `completed` accepted for compatible bridges and existing callers.
120
+ if (status.status === 'done' || status.status === 'completed') {
121
+ if (typeof status.result !== 'string' || !status.result.trim()) throw new Error('Mission completed without a final answer');
122
+ return { ok: true, status: 'completed', interactionId, path: outputPath, content: status.result };
123
+ }
124
+ if (status.status !== 'running') return {
125
+ ok: false,
126
+ status: status.status === 'cancelled' ? 'cancelled' : 'failed',
127
+ interactionId,
128
+ path: outputPath,
129
+ error: 'Mission did not complete successfully',
130
+ };
131
+ await wait(POLL_MS);
132
+ }
133
+ await executeCli(['mission', 'cancel', interactionId!, '--json']).catch(() => undefined);
134
+ return { ok: false, status: 'failed', interactionId, path: outputPath, error: 'Mission exceeded the sidetab time limit' };
135
+ } catch {
136
+ return { ok: false, status: 'failed', interactionId, path: outputPath, error: 'Mission CLI could not complete the request' };
137
+ } finally {
138
+ try { rmSync(tempRoot, { recursive: true, force: true }); } catch { /* temp cleanup cannot replace mission outcome */ }
139
+ }
140
+ })();
141
+ return {
142
+ ok: true,
143
+ status: 'running',
144
+ interactionId,
145
+ path: outputPath,
146
+ startedAt,
147
+ completion,
148
+ };
149
+ } catch {
150
+ try { rmSync(tempRoot, { recursive: true, force: true }); } catch { /* temp cleanup cannot replace mission outcome */ }
151
+ return { ok: false, status: 'failed', ...(interactionId ? { interactionId } : {}), path: outputPath, error: 'Mission CLI could not complete the request' };
152
+ }
153
+ }
@@ -95,6 +95,9 @@ export const SEAT_INTENT_ESCALATION_FLOW =
95
95
  export const SEAT_MEMORY_RECALL_PREFIX = '🧠 직전 인계 회상:';
96
96
  export const SEAT_MEMORY_RECALL_MAX_CHARS = 360;
97
97
  const RECALL_READ_BYTES = 16_384;
98
+ export const SEAT_MEMORY_IMPORT_PREFIX = '🧠 자리 기억 스냅샷:';
99
+ export const SEAT_MEMORY_IMPORT_MAX_CHARS = 2_000;
100
+ const SEAT_MEMORY_HANDOFF_MAX_AGE_MS = 24 * 60 * 60 * 1_000;
98
101
  /** 발췌(제목 — 첫 줄)에 남길 최소 글자 — 이보다 모자라면 전문 경로를 짧은 꼴로 바꾼다. */
99
102
  const RECALL_MIN_EXCERPT = 60;
100
103
  /** 줄에 싣는 파일명 최대 글자. */
@@ -184,6 +187,162 @@ function seatMemoryRecallLine(seatDir: string): string | null {
184
187
  return recall.line;
185
188
  }
186
189
 
190
+ interface SeatMemorySource {
191
+ path: string | null;
192
+ mtimeMs: number | null;
193
+ }
194
+
195
+ function regularMemorySource(path: string): SeatMemorySource {
196
+ try {
197
+ const stat = lstatSync(path);
198
+ return stat.isFile() ? { path, mtimeMs: stat.mtimeMs } : { path: null, mtimeMs: null };
199
+ } catch {
200
+ return { path: null, mtimeMs: null };
201
+ }
202
+ }
203
+
204
+ function handoffPriorityExcerpt(path: string): { priority: string | null; evidence: string | null } {
205
+ // Only inspect a bounded prefix and extract explicit priority/evidence labels;
206
+ // arbitrary handoff prose can contain account values or stale historical claims.
207
+ const lines = readHead(path).split(/\r\n|[\n\r\u0085\u2028\u2029]/);
208
+ const priorityLabel = /^\s*(?:[-*]\s*)?(?:#{1,6}\s*)?(?:다음 한 수|현재 우선순위|1순위|최우선|next step|priority)\s*[::]/i;
209
+ const evidenceLabel = /^\s*(?:[-*]\s*)?(?:#{1,6}\s*)?(?:근거|증거|evidence|source)\s*[::]/i;
210
+ const priorityRaw = lines.find((line) => priorityLabel.test(line.replace(/\*\*/g, '')));
211
+ const evidenceRaw = lines.find((line) => evidenceLabel.test(line.replace(/\*\*/g, '')));
212
+ const cleanExcerpt = (line: string | undefined): string | null => {
213
+ if (!line || SHELL_CHARS.test(line)) return null;
214
+ const clean = oneLine(line.replace(/\*\*/g, '').replace(/^\s*[-*]\s*/, ''));
215
+ return clean || null;
216
+ };
217
+ const evidencePathStart = /(?:seat-state|docs|src|apps|test)\//gu;
218
+ const evidencePathPattern = /(?:seat-state|docs|src|apps|test)\/[\p{L}\p{N}._/@+-]+/u;
219
+ const paths = (line: string | undefined): { values: string[]; complete: boolean } => {
220
+ if (!line) return { values: [], complete: true };
221
+ const values: string[] = [];
222
+ let complete = true;
223
+ for (const startMatch of line.matchAll(evidencePathStart)) {
224
+ const start = startMatch.index ?? -1;
225
+ if (start < 0) {
226
+ complete = false;
227
+ continue;
228
+ }
229
+ const candidate = line.slice(start).match(evidencePathPattern)?.[0];
230
+ if (!candidate) {
231
+ complete = false;
232
+ continue;
233
+ }
234
+ const after = line[start + candidate.length];
235
+ const afterNext = line[start + candidate.length + 1];
236
+ const boundary = after === undefined || /\s/u.test(after)
237
+ || (/[;,!?()[\]{}<>]/u.test(after) && (afterNext === undefined || /\s/u.test(afterNext)));
238
+ const spacedTail = after === ' '
239
+ ? line.slice(start + candidate.length).match(/^\s+([^·,;!?]*?)(?=\s*[·,;!?]|$)/u)?.[1]?.trim()
240
+ : undefined;
241
+ const looksLikeSpacedPath = Boolean(spacedTail && /\.[\p{L}\p{N}]{1,12}$/u.test(spacedTail));
242
+ if (!boundary || looksLikeSpacedPath) {
243
+ // Never publish a prefix when the source may contain a wider path token.
244
+ complete = false;
245
+ continue;
246
+ }
247
+ values.push(redactSecretText(candidate));
248
+ }
249
+ return { values, complete };
250
+ };
251
+ const priorityPaths = paths(priorityRaw);
252
+ const priority = priorityPaths.complete
253
+ ? cleanExcerpt(priorityRaw)?.replace(new RegExp(evidencePathPattern.source, 'gu'), '〔경로는 근거 포인터 참조〕') ?? null
254
+ : null;
255
+ const evidencePaths = [...new Set([...priorityPaths.values, ...paths(evidenceRaw).values])].slice(0, 2);
256
+ return {
257
+ priority: priority ? priority.slice(0, 700) : null,
258
+ evidence: evidencePaths.length ? evidencePaths.join(' · ') : null,
259
+ };
260
+ }
261
+
262
+ /** Session-start only: bounded source pointers plus a short, explicitly labeled priority excerpt.
263
+ * The card cache keeps this snapshot stable for the conversation; newer files appear next session. */
264
+ function buildSeatMemoryImport(cwd: string, seat: string, home: string, now: Date): string {
265
+ const seatDir = join(home, 'elanous-hq', 'seat-state', seat);
266
+ const handoff = newestHandoff(seatDir);
267
+ const handoffSource = handoff ? { path: handoff.path, mtimeMs: handoff.mtime.getTime() } : { path: null, mtimeMs: null };
268
+ const memory = regularMemorySource(join(home, 'elanous-hq', 'seat-state', 'memory', 'MEMORY.md'));
269
+ const knowhowCandidates = [
270
+ join(cwd, 'docs', 'roles', seat, 'KNOWHOW.md'),
271
+ join(home, 'elanous-hq', 'seats', seat, 'docs', 'roles', seat, 'KNOWHOW.md'),
272
+ ];
273
+ const knowhow = knowhowCandidates.map(regularMemorySource).find((source) => source.path) ?? { path: null, mtimeMs: null };
274
+ const stamp = (source: SeatMemorySource): string => source.mtimeMs === null ? '미상' : new Date(source.mtimeMs).toISOString();
275
+ const stale = (source: SeatMemorySource): boolean => source.mtimeMs === null || handoffSource.mtimeMs === null ||
276
+ now.getTime() - handoffSource.mtimeMs > SEAT_MEMORY_HANDOFF_MAX_AGE_MS ||
277
+ handoffSource.mtimeMs > now.getTime() || source.mtimeMs > now.getTime() || source.mtimeMs < handoffSource.mtimeMs;
278
+ const handoffStale = handoffSource.mtimeMs === null || now.getTime() - handoffSource.mtimeMs > SEAT_MEMORY_HANDOFF_MAX_AGE_MS ||
279
+ handoffSource.mtimeMs > now.getTime();
280
+ const handoffLabel = handoffSource.path
281
+ ? `seat-state/${seat}/${redactSecretText(basename(handoffSource.path))}`
282
+ : `seat-state/${seat}/HANDOFF-*.md 없음`;
283
+ const memoryLabel = memory.path ? 'seat-state/memory/MEMORY.md' : 'seat-state/memory/MEMORY.md 없음';
284
+ const knowhowLabel = knowhow.path ? `docs/roles/${seat}/KNOWHOW.md` : `docs/roles/${seat}/KNOWHOW.md 없음`;
285
+ const sourceLines = [
286
+ `- 인계 포인터: ${handoffLabel} · 갱신 ${stamp(handoffSource)}${handoffStale ? ' · stale/unknown' : ''}`,
287
+ `- 공통 기억 색인: ${memoryLabel} · 갱신 ${stamp(memory)}${stale(memory) ? ' · stale/unknown' : ''}`,
288
+ `- 역할 노하우: ${knowhowLabel} · 갱신 ${stamp(knowhow)}${stale(knowhow) ? ' · stale/unknown' : ''}`,
289
+ ];
290
+ let priority: string | null = null;
291
+ let evidence: string | null = null;
292
+ if (!handoffStale && handoffSource.path) {
293
+ try {
294
+ ({ priority, evidence } = handoffPriorityExcerpt(handoffSource.path));
295
+ } catch { /* missing/unreadable excerpt is unknown, but pointers remain useful */ }
296
+ }
297
+ const priorityPrefix = '- 현재 우선순위(인계 발췌): ';
298
+ const evidencePrefix = '- 근거 포인터(인계 발췌): ';
299
+ const priorityAvailable = !handoffStale && Boolean(priority);
300
+ const evidencePaths = !handoffStale && evidence ? evidence.split(' · ') : [];
301
+ const summary = priorityAvailable ? priorityPrefix : '- 현재 우선순위: 미관측(오래됐거나 명시된 우선순위 줄이 없음) · unknown';
302
+ const evidenceLine = evidencePaths.length ? evidencePrefix : '- 근거 포인터: 미관측 · 원본 확인 필요';
303
+ const guidance = 'stale/unknown 또는 상충하는 기억은 사실로 단정하지 말고 unknown으로 답한 뒤 위 포인터의 정본을 확인한다. 비밀·계정 값은 기억에서 가져오지 않는다.';
304
+ const fixedLines = [
305
+ `${SEAT_MEMORY_IMPORT_PREFIX} 읽기 전용 · 세션 시작 스냅샷 · 다음 세션부터 갱신`,
306
+ ...sourceLines,
307
+ summary,
308
+ evidenceLine,
309
+ guidance,
310
+ ];
311
+ // Reserve space separately for each excerpt. Never slice the assembled card:
312
+ // that could cut a path in half or remove the stale/unknown safety guidance.
313
+ const excerptRoom = Math.max(0, SEAT_MEMORY_IMPORT_MAX_CHARS - fixedLines.join('\n').length);
314
+ const excerptCount = Number(priorityAvailable) + Number(evidencePaths.length > 0);
315
+ const excerptBudget = Math.min(520, Math.floor(excerptRoom / (excerptCount || 1)));
316
+ const priorityText = priorityAvailable
317
+ ? (priority!.length > excerptBudget ? `${priority!.slice(0, Math.max(0, excerptBudget - 1))}…` : priority!)
318
+ : '';
319
+ const evidenceParts: string[] = [];
320
+ let evidenceRoom = excerptBudget;
321
+ let omittedEvidencePaths = 0;
322
+ for (const path of evidencePaths) {
323
+ const separator = evidenceParts.length ? ' · ' : '';
324
+ if (separator.length + path.length <= evidenceRoom) {
325
+ evidenceParts.push(path);
326
+ evidenceRoom -= separator.length + path.length;
327
+ } else {
328
+ omittedEvidencePaths++;
329
+ }
330
+ }
331
+ let evidenceText = evidenceParts.join(' · ');
332
+ if (omittedEvidencePaths) {
333
+ const note = `${evidenceText ? ' · ' : ''}${omittedEvidencePaths}개 긴 경로 생략(원문 인계 포인터 참조)`;
334
+ if (note.length <= evidenceRoom) evidenceText += note;
335
+ }
336
+ const content = [
337
+ `${SEAT_MEMORY_IMPORT_PREFIX} 읽기 전용 · 세션 시작 스냅샷 · 다음 세션부터 갱신`,
338
+ ...sourceLines,
339
+ `${summary}${priorityText}`,
340
+ `${evidenceLine}${evidenceText}`,
341
+ guidance,
342
+ ].join('\n');
343
+ return content;
344
+ }
345
+
187
346
  function buildCardMessages(cwd: string, deps: SeatBootDeps): { messages: LLMMessage[]; observed: Record<string, unknown> } {
188
347
  const detection = detectSeat(cwd, deps.env ?? process.env);
189
348
  if (!detection) return { messages: [], observed: { reason: 'no-seat' } };
@@ -194,13 +353,24 @@ function buildCardMessages(cwd: string, deps: SeatBootDeps): { messages: LLMMess
194
353
  if (!isSeatDir) return { messages: [], observed: { reason: 'no-seat-state', seat: detection.seat, source: detection.source } };
195
354
  const { sections, unread } = collectSeatBootSections(detection.seat, { home, msgPath: deps.msgPath ?? defaultMsgStorePath() });
196
355
  const card = renderSeatBootCard(detection.seat, sections, null);
197
- const at = (deps.now?.() ?? new Date()).toISOString();
356
+ const snapshotAt = deps.now?.() ?? new Date();
357
+ const at = snapshotAt.toISOString();
198
358
  const recall = seatMemoryRecallLine(seatDir);
359
+ const memoryImport = buildSeatMemoryImport(cwd, detection.seat, home, snapshotAt);
360
+ debug.log('dashboard.seat-boot', 'memory-import', {
361
+ seat: detection.seat,
362
+ chars: memoryImport.length,
363
+ priority: memoryImport.includes('- 현재 우선순위(인계 발췌):'),
364
+ evidence: memoryImport.includes('- 근거 포인터(인계 발췌):'),
365
+ unknown: memoryImport.includes('- 현재 우선순위: 미관측'),
366
+ updatedAt: snapshotAt.toISOString(),
367
+ });
199
368
  const content =
200
369
  `## 자리 부트 카드 — 너는 이 작업 디렉터리의 ${detection.seat} 자리에서 일한다\n` +
201
370
  `(판정: ${detection.source === 'cwd' ? `cwd 의 /seats/${detection.seat}` : 'COORD_ID'} · 세션 시작 스냅샷 ${at} · 이후 바뀐 값은 다시 조회하라)\n` +
202
371
  `사람이 다른 일을 먼저 시키지 않았다면, 첫 답에서 자리 이름·'자리 역할' 절의 역할·안 읽은 우편 수를 각각 명시하고 처리할 일을 제안하라. 역할이 미관측이면 추측하지 말고 미관측이라고 말하라.\n` +
203
372
  (recall ? `${recall}\n` : '') +
373
+ `${memoryImport}\n` +
204
374
  '\n' +
205
375
  `${SEAT_INTENT_ESCALATION_FLOW}\n\n` +
206
376
  card;
@@ -12,6 +12,59 @@ export function registerClassicSideSlash(
12
12
  ): void {
13
13
  registry.register(['side'], async (args, ctx) => {
14
14
  const sub = (args[0] ?? 'list').toLowerCase();
15
+ const getRows = (): SidetabRow[] => ctx.classicSidetabAgent?.loadRows(ctx.chatPersona?.sessionId())
16
+ ?? loadRows(ctx.chatPersona?.sessionId());
17
+ if (sub === 'open') {
18
+ const agent = (args[1] ?? '').toLowerCase();
19
+ if (args.length !== 2 || (agent !== 'codex' && agent !== 'claude')) {
20
+ ctx.chatLines.push(ctx.warning(' 사용법: /side open codex|claude'));
21
+ } else if (!ctx.classicSidetabAgent) {
22
+ ctx.chatLines.push(ctx.warning(' classic agent sidetab을 사용할 수 없습니다'));
23
+ } else {
24
+ ctx.classicSidetabAgent.openAgent(agent);
25
+ }
26
+ ctx.setChatScrollOffset(-1);
27
+ return;
28
+ }
29
+ if (sub === 'mission') {
30
+ const agent = (args[1] ?? '').toLowerCase();
31
+ const missionArgs = args.slice(2);
32
+ let outputPath: string | undefined;
33
+ const outputFlag = missionArgs.indexOf('--out');
34
+ if (outputFlag >= 0) {
35
+ outputPath = missionArgs[outputFlag + 1];
36
+ if (!outputPath) {
37
+ ctx.chatLines.push(ctx.warning(' 사용법: /side mission codex|claude [--out <path>] <mission>'));
38
+ ctx.setChatScrollOffset(-1);
39
+ return;
40
+ }
41
+ missionArgs.splice(outputFlag, 2);
42
+ }
43
+ const mission = missionArgs.join(' ').trim();
44
+ if ((agent !== 'codex' && agent !== 'claude') || !mission) {
45
+ ctx.chatLines.push(ctx.warning(' 사용법: /side mission codex|claude [--out <path>] <mission>'));
46
+ } else if (!ctx.classicSidetabAgent) {
47
+ ctx.chatLines.push(ctx.warning(' classic agent sidetab을 사용할 수 없습니다'));
48
+ } else {
49
+ const result = await ctx.classicSidetabAgent.runMission(agent, mission, outputPath);
50
+ if (result.ok) {
51
+ ctx.chatLines.push(ctx.success(` ${agent} 미션 완료`));
52
+ ctx.chatLines.push(ctx.muted(` promptReady=${Boolean(result.promptReady)}`));
53
+ ctx.chatLines.push(ctx.muted(` missionVisible=${Boolean(result.missionVisible)}`));
54
+ ctx.chatLines.push(ctx.muted(` promptReturned=${Boolean(result.promptReturned)}`));
55
+ ctx.chatLines.push(ctx.muted(` completionMarker=${Boolean(result.completionMarker)}`));
56
+ ctx.chatLines.push(ctx.muted(` 결과 파일: ${result.path}${result.firstLine ? ` · ${result.firstLine}` : ''}`));
57
+ } else {
58
+ ctx.chatLines.push(ctx.muted(` promptReady=${Boolean(result.promptReady)}`));
59
+ ctx.chatLines.push(ctx.muted(` missionVisible=${Boolean(result.missionVisible)}`));
60
+ ctx.chatLines.push(ctx.muted(` promptReturned=${Boolean(result.promptReturned)}`));
61
+ ctx.chatLines.push(ctx.muted(` completionMarker=${Boolean(result.completionMarker)}`));
62
+ ctx.chatLines.push(ctx.warning(` ${agent} 미션 실패 · ${result.error ?? '결과 확인 실패'}${result.path ? ` · ${result.path}` : ''}`));
63
+ }
64
+ }
65
+ ctx.setChatScrollOffset(-1);
66
+ return;
67
+ }
15
68
  if (sub === 'new') {
16
69
  if (args.length > 1) ctx.chatLines.push(ctx.warning(' 사용법: /side new'));
17
70
  else ctx.termSlash.openNewTerminal();
@@ -25,7 +78,7 @@ export function registerClassicSideSlash(
25
78
  }
26
79
  // Use the same filtered manifest rows for display and numeric resolution;
27
80
  // never let an exited row shift the number shown to the user.
28
- const rows = loadRows(ctx.chatPersona?.sessionId()).filter(row => row.badge !== 'exited');
81
+ const rows = getRows().filter(row => row.badge !== 'exited');
29
82
  if (sub === 'list') {
30
83
  if (rows.length === 0) ctx.chatLines.push(ctx.muted(' 사이드탭 없음'));
31
84
  rows.forEach((row, i) => ctx.chatLines.push(ctx.muted(` ${i + 1}. ${row.badge} ${row.label}`)));
@@ -3,6 +3,82 @@ import type { ModalSurface } from '../display/modal-stack.js';
3
3
  import type { Key } from '../tui.js';
4
4
  import { loadSidetabRows, type SidetabRow } from '../sidetab-core/model.js';
5
5
 
6
+ export interface DashboardLocalAgentSession {
7
+ id: string;
8
+ title: string;
9
+ kind: 'shell' | 'coding-agent';
10
+ agentBrand?: 'claude-code' | 'codex' | 'gemini';
11
+ state: 'foreground' | 'background' | 'exited';
12
+ }
13
+
14
+ export interface DashboardMissionResult {
15
+ ok: boolean;
16
+ path: string;
17
+ content?: string;
18
+ firstLine?: string;
19
+ promptReady: boolean;
20
+ missionVisible: boolean;
21
+ promptReturned: boolean;
22
+ completionMarker: boolean;
23
+ error?: string;
24
+ }
25
+
26
+ /** Convert popup startup/adapter exceptions into the same explicit mission outcome. */
27
+ export async function runDashboardAgentMission<TSession, TModal>(deps: {
28
+ agent: string;
29
+ requestedOutputPath?: string;
30
+ open: () => TSession | undefined;
31
+ modal: (session: TSession) => TModal | null | undefined;
32
+ outputPath: (session: TSession, requested?: string) => string;
33
+ run: (session: TSession, modal: TModal, outputPath: string) => Promise<DashboardMissionResult>;
34
+ close: (session: TSession) => void;
35
+ }): Promise<DashboardMissionResult> {
36
+ let session: TSession | undefined;
37
+ let resultPath = deps.requestedOutputPath ?? '';
38
+ try {
39
+ session = deps.open();
40
+ if (session === undefined) throw new Error(`${deps.agent} PTY could not start`);
41
+ const modal = deps.modal(session);
42
+ if (!modal) throw new Error(`${deps.agent} PTY could not start`);
43
+ resultPath = deps.outputPath(session, deps.requestedOutputPath);
44
+ return await deps.run(session, modal, resultPath);
45
+ } catch (error) {
46
+ return {
47
+ ok: false,
48
+ path: resultPath,
49
+ promptReady: false,
50
+ missionVisible: false,
51
+ promptReturned: false,
52
+ completionMarker: false,
53
+ error: error instanceof Error ? error.message : String(error),
54
+ };
55
+ } finally {
56
+ if (session !== undefined) {
57
+ try { deps.close(session); } catch { /* closing a failed popup must not replace its mission result */ }
58
+ }
59
+ }
60
+ }
61
+
62
+ /** Keep locally spawned coding-agent tabs attachable even when no PTY manifest row exists. */
63
+ export function mergeLocalAgentSessions(
64
+ rows: readonly SidetabRow[],
65
+ sessions: readonly DashboardLocalAgentSession[],
66
+ ): SidetabRow[] {
67
+ const knownSessionIds = new Set(rows.map((row) => row.sessionId).filter((id): id is string => Boolean(id)));
68
+ const localAgents = sessions
69
+ .filter((session) => session.kind === 'coding-agent' && session.state !== 'exited' && !knownSessionIds.has(session.id))
70
+ .map((session): SidetabRow => ({
71
+ id: session.id,
72
+ label: session.title,
73
+ kind: session.agentBrand ?? 'coding-agent',
74
+ // Terminal foreground/background says where the session is attached,
75
+ // not whether the agent is currently working. Do not infer turn state.
76
+ badge: 'unknown',
77
+ sessionId: session.id,
78
+ }));
79
+ return [...rows, ...localAgents];
80
+ }
81
+
6
82
  export interface DashboardSidetabRuntimeDeps {
7
83
  currentSessionId: () => string | undefined;
8
84
  termSize: () => { cols: number; rows: number };
@@ -10,6 +86,8 @@ export interface DashboardSidetabRuntimeDeps {
10
86
  pushModal: (surface: ModalSurface) => { dispose: () => void };
11
87
  attach: (row: SidetabRow) => void;
12
88
  spawnShell: () => void;
89
+ spawnAgent: (agent: 'codex' | 'claude') => void;
90
+ runMission: (agent: 'codex' | 'claude', mission: string, outputPath?: string) => Promise<DashboardMissionResult>;
13
91
  detach: (row: SidetabRow | null) => void;
14
92
  kill: (row: SidetabRow) => void;
15
93
  returnToParent: () => void;
@@ -17,8 +95,11 @@ export interface DashboardSidetabRuntimeDeps {
17
95
  }
18
96
 
19
97
  export interface DashboardSidetabRuntime {
98
+ loadRows: (sessionId?: string) => SidetabRow[];
20
99
  routeKey: (key: Key) => boolean;
21
100
  beginPrefix: () => void;
101
+ openAgent: DashboardSidetabRuntimeDeps['spawnAgent'];
102
+ runMission: DashboardSidetabRuntimeDeps['runMission'];
22
103
  close: () => void;
23
104
  }
24
105
 
@@ -196,6 +277,11 @@ export function createDashboardSidetabRuntime(
196
277
  deps.spawnShell();
197
278
  return true;
198
279
  }
280
+ if (!key.ctrl && !key.alt && (name === 'c' || name === 'a')) {
281
+ closePanel();
282
+ deps.spawnAgent(name === 'c' ? 'codex' : 'claude');
283
+ return true;
284
+ }
199
285
  if (!key.ctrl && !key.alt && name === 'd') {
200
286
  closePanel();
201
287
  deps.detach(null);
@@ -207,7 +293,7 @@ export function createDashboardSidetabRuntime(
207
293
  confirmKill(row);
208
294
  return true;
209
295
  }
210
- deps.status('사이드탭 키: s 목록 · p 부모 · 1–9 연결 · n 새 셸 · d 분리 · k 종료');
296
+ deps.status('사이드탭 키: s 목록 · p 부모 · 1–9 연결 · c Codex · a Claude · n 새 셸 · d 분리 · k 종료');
211
297
  return true;
212
298
  }
213
299
  if (key.ctrl && !key.alt && (key.name === '\\' || key.name === 'backslash')) {
@@ -218,8 +304,11 @@ export function createDashboardSidetabRuntime(
218
304
  };
219
305
 
220
306
  return {
307
+ loadRows: (sessionId) => getRows(sessionId ?? deps.currentSessionId()),
221
308
  routeKey,
222
309
  beginPrefix,
310
+ openAgent: deps.spawnAgent,
311
+ runMission: deps.runMission,
223
312
  close() {
224
313
  prefixPending = false;
225
314
  closePanel();
@@ -0,0 +1,101 @@
1
+ import { estimateTokens } from '../tokens.js';
2
+
3
+ export interface InstalledSkillSummary {
4
+ name: string;
5
+ description: string;
6
+ }
7
+
8
+ export interface InstalledSkillCatalogMessage {
9
+ role: 'system';
10
+ content: string;
11
+ }
12
+
13
+ export interface InstalledSkillCatalogBuild {
14
+ message: InstalledSkillCatalogMessage | null;
15
+ estimatedTokens: number;
16
+ budgetTokens: number;
17
+ mode: 'full' | 'short-description' | 'names-only' | 'names-truncated' | 'empty';
18
+ skillCount: number;
19
+ }
20
+
21
+ const CONTEXT_WINDOW_FALLBACK = 32_000;
22
+ const CATALOG_CONTEXT_FRACTION = 0.02;
23
+ const OMITTED_SKILLS_NOTE = 'Use elanous_skills_list to inspect other installed skills.';
24
+
25
+ let cachedKey: string | null = null;
26
+ let cachedBuild: InstalledSkillCatalogBuild | null = null;
27
+
28
+ function render(entries: readonly InstalledSkillSummary[], descriptionChars: number, omittedCount = 0): string {
29
+ const lines = entries.map(({ name, description }) => {
30
+ const summary = descriptionChars === 0 ? '' : description.trim().slice(0, descriptionChars).trim();
31
+ return summary ? `- ${name}: ${summary}` : `- ${name}`;
32
+ });
33
+ if (omittedCount > 0) lines.push(`- ${omittedCount} more omitted. ${OMITTED_SKILLS_NOTE}`);
34
+ return [
35
+ '[Installed skills]',
36
+ 'When a listed skill fits, call skill_exec with its exact name and the user task. Call elanous_skills_list only when the needed skill is absent from this list.',
37
+ ...lines,
38
+ ].join('\n');
39
+ }
40
+
41
+ /** Build a stable prompt-prefix snapshot from frontmatter summaries only; skill bodies stay lazy. */
42
+ export function buildInstalledSkillCatalogMessage(
43
+ input: readonly InstalledSkillSummary[],
44
+ contextWindow?: number | null,
45
+ ): InstalledSkillCatalogBuild {
46
+ const entries = [...input]
47
+ .filter(entry => entry.name.trim().length > 0)
48
+ .map(entry => ({ name: entry.name.trim(), description: entry.description.trim() }))
49
+ .sort((a, b) => a.name < b.name ? -1 : a.name > b.name ? 1 : 0);
50
+ const resolvedWindow = Number.isSafeInteger(contextWindow) && (contextWindow as number) > 0
51
+ ? contextWindow as number
52
+ : CONTEXT_WINDOW_FALLBACK;
53
+ const budgetTokens = Math.max(1, Math.floor(resolvedWindow * CATALOG_CONTEXT_FRACTION));
54
+ const key = JSON.stringify([budgetTokens, entries]);
55
+ if (cachedKey === key && cachedBuild) return cachedBuild;
56
+
57
+ if (entries.length === 0) {
58
+ cachedKey = key;
59
+ cachedBuild = { message: null, estimatedTokens: 0, budgetTokens, mode: 'empty', skillCount: 0 };
60
+ return cachedBuild;
61
+ }
62
+
63
+ let content = render(entries, Number.MAX_SAFE_INTEGER);
64
+ let estimatedTokens = estimateTokens(content);
65
+ let mode: InstalledSkillCatalogBuild['mode'] = 'full';
66
+ if (estimatedTokens > budgetTokens) {
67
+ const maxDescriptionChars = Math.max(...entries.map(entry => entry.description.length));
68
+ let descriptionChars = maxDescriptionChars;
69
+ while (descriptionChars > 0 && estimatedTokens > budgetTokens) {
70
+ descriptionChars = Math.floor(descriptionChars / 2);
71
+ content = render(entries, descriptionChars);
72
+ estimatedTokens = estimateTokens(content);
73
+ }
74
+ mode = descriptionChars === 0 ? 'names-only' : 'short-description';
75
+ }
76
+
77
+ let skillCount = entries.length;
78
+ if (estimatedTokens > budgetTokens) {
79
+ mode = 'names-truncated';
80
+ let included: InstalledSkillSummary[] = [];
81
+ for (let index = 0; index < entries.length; index += 1) {
82
+ const candidate = [...included, entries[index]!];
83
+ const candidateContent = render(candidate, 0, entries.length - candidate.length);
84
+ if (estimateTokens(candidateContent) > budgetTokens) break;
85
+ included = candidate;
86
+ }
87
+ content = render(included, 0, entries.length - included.length);
88
+ estimatedTokens = estimateTokens(content);
89
+ skillCount = included.length;
90
+ }
91
+
92
+ cachedKey = key;
93
+ cachedBuild = {
94
+ message: { role: 'system', content },
95
+ estimatedTokens,
96
+ budgetTokens,
97
+ mode,
98
+ skillCount,
99
+ };
100
+ return cachedBuild;
101
+ }