@aexol/spectral 0.7.0 → 0.7.3

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 (671) hide show
  1. package/CHANGELOG.md +5 -0
  2. package/dist/agent/agents.js +1 -1
  3. package/dist/agent/index.js +269 -479
  4. package/dist/cli.js +11 -0
  5. package/dist/commands/serve.js +0 -3
  6. package/dist/designer/data/systems/agentic/DESIGN.md +71 -0
  7. package/dist/designer/data/systems/agentic/components.html +154 -0
  8. package/dist/designer/data/systems/agentic/tokens.css +63 -0
  9. package/dist/designer/data/systems/airbnb/DESIGN.md +393 -0
  10. package/dist/designer/data/systems/airbnb/components.html +1373 -0
  11. package/dist/designer/data/systems/airbnb/tokens.css +261 -0
  12. package/dist/designer/data/systems/airtable/DESIGN.md +92 -0
  13. package/dist/designer/data/systems/airtable/components.html +489 -0
  14. package/dist/designer/data/systems/airtable/tokens.css +261 -0
  15. package/dist/designer/data/systems/ant/DESIGN.md +71 -0
  16. package/dist/designer/data/systems/ant/components.html +154 -0
  17. package/dist/designer/data/systems/ant/tokens.css +63 -0
  18. package/dist/designer/data/systems/apple/DESIGN.md +250 -0
  19. package/dist/designer/data/systems/apple/components.html +749 -0
  20. package/dist/designer/data/systems/apple/tokens.css +286 -0
  21. package/dist/designer/data/systems/application/DESIGN.md +71 -0
  22. package/dist/designer/data/systems/application/components.html +154 -0
  23. package/dist/designer/data/systems/application/tokens.css +63 -0
  24. package/dist/designer/data/systems/arc/DESIGN.md +152 -0
  25. package/dist/designer/data/systems/arc/components.html +432 -0
  26. package/dist/designer/data/systems/arc/tokens.css +137 -0
  27. package/dist/designer/data/systems/artistic/DESIGN.md +71 -0
  28. package/dist/designer/data/systems/artistic/components.html +136 -0
  29. package/dist/designer/data/systems/artistic/tokens.css +63 -0
  30. package/dist/designer/data/systems/atelier-zero/DESIGN.md +316 -0
  31. package/dist/designer/data/systems/atelier-zero/components.html +136 -0
  32. package/dist/designer/data/systems/atelier-zero/tokens.css +63 -0
  33. package/dist/designer/data/systems/bento/DESIGN.md +71 -0
  34. package/dist/designer/data/systems/bento/components.html +136 -0
  35. package/dist/designer/data/systems/bento/tokens.css +63 -0
  36. package/dist/designer/data/systems/binance/DESIGN.md +348 -0
  37. package/dist/designer/data/systems/binance/components.html +550 -0
  38. package/dist/designer/data/systems/binance/tokens.css +255 -0
  39. package/dist/designer/data/systems/bmw/DESIGN.md +183 -0
  40. package/dist/designer/data/systems/bmw/components.html +551 -0
  41. package/dist/designer/data/systems/bmw/tokens.css +179 -0
  42. package/dist/designer/data/systems/bmw-m/DESIGN.md +246 -0
  43. package/dist/designer/data/systems/bmw-m/components.html +342 -0
  44. package/dist/designer/data/systems/bmw-m/tokens.css +64 -0
  45. package/dist/designer/data/systems/bold/DESIGN.md +71 -0
  46. package/dist/designer/data/systems/bold/components.html +136 -0
  47. package/dist/designer/data/systems/bold/tokens.css +63 -0
  48. package/dist/designer/data/systems/brutalism/DESIGN.md +71 -0
  49. package/dist/designer/data/systems/brutalism/components.html +154 -0
  50. package/dist/designer/data/systems/brutalism/tokens.css +63 -0
  51. package/dist/designer/data/systems/bugatti/DESIGN.md +271 -0
  52. package/dist/designer/data/systems/bugatti/components.html +342 -0
  53. package/dist/designer/data/systems/bugatti/tokens.css +64 -0
  54. package/dist/designer/data/systems/cafe/DESIGN.md +71 -0
  55. package/dist/designer/data/systems/cafe/components.html +136 -0
  56. package/dist/designer/data/systems/cafe/tokens.css +63 -0
  57. package/dist/designer/data/systems/cal/DESIGN.md +262 -0
  58. package/dist/designer/data/systems/cal/components.html +376 -0
  59. package/dist/designer/data/systems/cal/tokens.css +265 -0
  60. package/dist/designer/data/systems/canva/DESIGN.md +157 -0
  61. package/dist/designer/data/systems/canva/components.html +461 -0
  62. package/dist/designer/data/systems/canva/tokens.css +147 -0
  63. package/dist/designer/data/systems/cisco/DESIGN.md +201 -0
  64. package/dist/designer/data/systems/cisco/components.html +342 -0
  65. package/dist/designer/data/systems/cisco/tokens.css +64 -0
  66. package/dist/designer/data/systems/claude/DESIGN.md +315 -0
  67. package/dist/designer/data/systems/claude/components.html +483 -0
  68. package/dist/designer/data/systems/claude/tokens.css +130 -0
  69. package/dist/designer/data/systems/clay/DESIGN.md +307 -0
  70. package/dist/designer/data/systems/clay/components.html +136 -0
  71. package/dist/designer/data/systems/clay/tokens.css +63 -0
  72. package/dist/designer/data/systems/claymorphism/DESIGN.md +71 -0
  73. package/dist/designer/data/systems/claymorphism/components.html +136 -0
  74. package/dist/designer/data/systems/claymorphism/tokens.css +63 -0
  75. package/dist/designer/data/systems/clean/DESIGN.md +71 -0
  76. package/dist/designer/data/systems/clean/components.html +136 -0
  77. package/dist/designer/data/systems/clean/tokens.css +63 -0
  78. package/dist/designer/data/systems/clickhouse/DESIGN.md +284 -0
  79. package/dist/designer/data/systems/clickhouse/components.html +506 -0
  80. package/dist/designer/data/systems/clickhouse/tokens.css +135 -0
  81. package/dist/designer/data/systems/cohere/DESIGN.md +269 -0
  82. package/dist/designer/data/systems/cohere/components.html +353 -0
  83. package/dist/designer/data/systems/cohere/tokens.css +126 -0
  84. package/dist/designer/data/systems/coinbase/DESIGN.md +132 -0
  85. package/dist/designer/data/systems/coinbase/components.html +501 -0
  86. package/dist/designer/data/systems/coinbase/tokens.css +257 -0
  87. package/dist/designer/data/systems/colorful/DESIGN.md +71 -0
  88. package/dist/designer/data/systems/colorful/components.html +136 -0
  89. package/dist/designer/data/systems/colorful/tokens.css +63 -0
  90. package/dist/designer/data/systems/composio/DESIGN.md +310 -0
  91. package/dist/designer/data/systems/composio/components.html +342 -0
  92. package/dist/designer/data/systems/composio/tokens.css +64 -0
  93. package/dist/designer/data/systems/contemporary/DESIGN.md +71 -0
  94. package/dist/designer/data/systems/contemporary/components.html +136 -0
  95. package/dist/designer/data/systems/contemporary/tokens.css +63 -0
  96. package/dist/designer/data/systems/corporate/DESIGN.md +71 -0
  97. package/dist/designer/data/systems/corporate/components.html +136 -0
  98. package/dist/designer/data/systems/corporate/tokens.css +63 -0
  99. package/dist/designer/data/systems/cosmic/DESIGN.md +71 -0
  100. package/dist/designer/data/systems/cosmic/components.html +136 -0
  101. package/dist/designer/data/systems/cosmic/tokens.css +63 -0
  102. package/dist/designer/data/systems/creative/DESIGN.md +71 -0
  103. package/dist/designer/data/systems/creative/components.html +136 -0
  104. package/dist/designer/data/systems/creative/tokens.css +63 -0
  105. package/dist/designer/data/systems/cursor/DESIGN.md +312 -0
  106. package/dist/designer/data/systems/cursor/components.html +654 -0
  107. package/dist/designer/data/systems/cursor/tokens.css +218 -0
  108. package/dist/designer/data/systems/dashboard/DESIGN.md +71 -0
  109. package/dist/designer/data/systems/dashboard/components.html +154 -0
  110. package/dist/designer/data/systems/dashboard/tokens.css +63 -0
  111. package/dist/designer/data/systems/default/DESIGN.md +62 -0
  112. package/dist/designer/data/systems/default/components.html +523 -0
  113. package/dist/designer/data/systems/default/tokens.css +200 -0
  114. package/dist/designer/data/systems/discord/DESIGN.md +162 -0
  115. package/dist/designer/data/systems/discord/components.html +359 -0
  116. package/dist/designer/data/systems/discord/tokens.css +125 -0
  117. package/dist/designer/data/systems/dithered/DESIGN.md +71 -0
  118. package/dist/designer/data/systems/dithered/components.html +136 -0
  119. package/dist/designer/data/systems/dithered/tokens.css +63 -0
  120. package/dist/designer/data/systems/doodle/DESIGN.md +71 -0
  121. package/dist/designer/data/systems/doodle/components.html +136 -0
  122. package/dist/designer/data/systems/doodle/tokens.css +63 -0
  123. package/dist/designer/data/systems/dramatic/DESIGN.md +71 -0
  124. package/dist/designer/data/systems/dramatic/components.html +136 -0
  125. package/dist/designer/data/systems/dramatic/tokens.css +63 -0
  126. package/dist/designer/data/systems/duolingo/DESIGN.md +154 -0
  127. package/dist/designer/data/systems/duolingo/components.html +532 -0
  128. package/dist/designer/data/systems/duolingo/tokens.css +130 -0
  129. package/dist/designer/data/systems/editorial/DESIGN.md +71 -0
  130. package/dist/designer/data/systems/editorial/components.html +154 -0
  131. package/dist/designer/data/systems/editorial/tokens.css +63 -0
  132. package/dist/designer/data/systems/elegant/DESIGN.md +71 -0
  133. package/dist/designer/data/systems/elegant/components.html +136 -0
  134. package/dist/designer/data/systems/elegant/tokens.css +63 -0
  135. package/dist/designer/data/systems/elevenlabs/DESIGN.md +268 -0
  136. package/dist/designer/data/systems/elevenlabs/components.html +342 -0
  137. package/dist/designer/data/systems/elevenlabs/tokens.css +127 -0
  138. package/dist/designer/data/systems/energetic/DESIGN.md +72 -0
  139. package/dist/designer/data/systems/energetic/components.html +136 -0
  140. package/dist/designer/data/systems/energetic/tokens.css +63 -0
  141. package/dist/designer/data/systems/enterprise/DESIGN.md +71 -0
  142. package/dist/designer/data/systems/enterprise/components.html +154 -0
  143. package/dist/designer/data/systems/enterprise/tokens.css +63 -0
  144. package/dist/designer/data/systems/expo/DESIGN.md +284 -0
  145. package/dist/designer/data/systems/expo/components.html +342 -0
  146. package/dist/designer/data/systems/expo/tokens.css +64 -0
  147. package/dist/designer/data/systems/expressive/DESIGN.md +71 -0
  148. package/dist/designer/data/systems/expressive/components.html +136 -0
  149. package/dist/designer/data/systems/expressive/tokens.css +63 -0
  150. package/dist/designer/data/systems/fantasy/DESIGN.md +71 -0
  151. package/dist/designer/data/systems/fantasy/components.html +136 -0
  152. package/dist/designer/data/systems/fantasy/tokens.css +63 -0
  153. package/dist/designer/data/systems/ferrari/DESIGN.md +317 -0
  154. package/dist/designer/data/systems/ferrari/components.html +342 -0
  155. package/dist/designer/data/systems/ferrari/tokens.css +64 -0
  156. package/dist/designer/data/systems/figma/DESIGN.md +223 -0
  157. package/dist/designer/data/systems/figma/components.html +344 -0
  158. package/dist/designer/data/systems/figma/tokens.css +126 -0
  159. package/dist/designer/data/systems/flat/DESIGN.md +71 -0
  160. package/dist/designer/data/systems/flat/components.html +136 -0
  161. package/dist/designer/data/systems/flat/tokens.css +63 -0
  162. package/dist/designer/data/systems/framer/DESIGN.md +249 -0
  163. package/dist/designer/data/systems/framer/components.html +438 -0
  164. package/dist/designer/data/systems/framer/tokens.css +238 -0
  165. package/dist/designer/data/systems/friendly/DESIGN.md +71 -0
  166. package/dist/designer/data/systems/friendly/components.html +136 -0
  167. package/dist/designer/data/systems/friendly/tokens.css +63 -0
  168. package/dist/designer/data/systems/futuristic/DESIGN.md +71 -0
  169. package/dist/designer/data/systems/futuristic/components.html +136 -0
  170. package/dist/designer/data/systems/futuristic/tokens.css +63 -0
  171. package/dist/designer/data/systems/github/DESIGN.md +155 -0
  172. package/dist/designer/data/systems/github/components.html +383 -0
  173. package/dist/designer/data/systems/github/tokens.css +125 -0
  174. package/dist/designer/data/systems/glassmorphism/DESIGN.md +71 -0
  175. package/dist/designer/data/systems/glassmorphism/components.html +154 -0
  176. package/dist/designer/data/systems/glassmorphism/tokens.css +63 -0
  177. package/dist/designer/data/systems/gradient/DESIGN.md +71 -0
  178. package/dist/designer/data/systems/gradient/components.html +154 -0
  179. package/dist/designer/data/systems/gradient/tokens.css +63 -0
  180. package/dist/designer/data/systems/hashicorp/DESIGN.md +281 -0
  181. package/dist/designer/data/systems/hashicorp/components.html +502 -0
  182. package/dist/designer/data/systems/hashicorp/tokens.css +272 -0
  183. package/dist/designer/data/systems/hud/DESIGN.md +173 -0
  184. package/dist/designer/data/systems/hud/components.html +136 -0
  185. package/dist/designer/data/systems/hud/tokens.css +63 -0
  186. package/dist/designer/data/systems/huggingface/DESIGN.md +149 -0
  187. package/dist/designer/data/systems/huggingface/components.html +346 -0
  188. package/dist/designer/data/systems/huggingface/tokens.css +125 -0
  189. package/dist/designer/data/systems/ibm/DESIGN.md +335 -0
  190. package/dist/designer/data/systems/ibm/components.html +342 -0
  191. package/dist/designer/data/systems/ibm/tokens.css +64 -0
  192. package/dist/designer/data/systems/intercom/DESIGN.md +149 -0
  193. package/dist/designer/data/systems/intercom/components.html +557 -0
  194. package/dist/designer/data/systems/intercom/tokens.css +150 -0
  195. package/dist/designer/data/systems/kami/DESIGN.md +410 -0
  196. package/dist/designer/data/systems/kami/components.html +601 -0
  197. package/dist/designer/data/systems/kami/tokens.css +272 -0
  198. package/dist/designer/data/systems/kraken/DESIGN.md +128 -0
  199. package/dist/designer/data/systems/kraken/components.html +342 -0
  200. package/dist/designer/data/systems/kraken/tokens.css +64 -0
  201. package/dist/designer/data/systems/lamborghini/DESIGN.md +291 -0
  202. package/dist/designer/data/systems/lamborghini/components.html +342 -0
  203. package/dist/designer/data/systems/lamborghini/tokens.css +64 -0
  204. package/dist/designer/data/systems/levels/DESIGN.md +71 -0
  205. package/dist/designer/data/systems/levels/components.html +154 -0
  206. package/dist/designer/data/systems/levels/tokens.css +63 -0
  207. package/dist/designer/data/systems/linear-app/DESIGN.md +370 -0
  208. package/dist/designer/data/systems/linear-app/components.html +370 -0
  209. package/dist/designer/data/systems/linear-app/tokens.css +130 -0
  210. package/dist/designer/data/systems/lingo/DESIGN.md +71 -0
  211. package/dist/designer/data/systems/lingo/components.html +154 -0
  212. package/dist/designer/data/systems/lingo/tokens.css +63 -0
  213. package/dist/designer/data/systems/loom/DESIGN.md +201 -0
  214. package/dist/designer/data/systems/loom/components.html +446 -0
  215. package/dist/designer/data/systems/loom/tokens.css +138 -0
  216. package/dist/designer/data/systems/lovable/DESIGN.md +301 -0
  217. package/dist/designer/data/systems/lovable/components.html +441 -0
  218. package/dist/designer/data/systems/lovable/tokens.css +258 -0
  219. package/dist/designer/data/systems/luxury/DESIGN.md +71 -0
  220. package/dist/designer/data/systems/luxury/components.html +154 -0
  221. package/dist/designer/data/systems/luxury/tokens.css +63 -0
  222. package/dist/designer/data/systems/mastercard/DESIGN.md +368 -0
  223. package/dist/designer/data/systems/mastercard/components.html +342 -0
  224. package/dist/designer/data/systems/mastercard/tokens.css +64 -0
  225. package/dist/designer/data/systems/material/DESIGN.md +71 -0
  226. package/dist/designer/data/systems/material/components.html +154 -0
  227. package/dist/designer/data/systems/material/tokens.css +63 -0
  228. package/dist/designer/data/systems/meta/DESIGN.md +369 -0
  229. package/dist/designer/data/systems/meta/components.html +398 -0
  230. package/dist/designer/data/systems/meta/tokens.css +263 -0
  231. package/dist/designer/data/systems/minimal/DESIGN.md +71 -0
  232. package/dist/designer/data/systems/minimal/components.html +154 -0
  233. package/dist/designer/data/systems/minimal/tokens.css +63 -0
  234. package/dist/designer/data/systems/minimax/DESIGN.md +260 -0
  235. package/dist/designer/data/systems/minimax/components.html +590 -0
  236. package/dist/designer/data/systems/minimax/tokens.css +148 -0
  237. package/dist/designer/data/systems/mintlify/DESIGN.md +329 -0
  238. package/dist/designer/data/systems/mintlify/components.html +737 -0
  239. package/dist/designer/data/systems/mintlify/tokens.css +256 -0
  240. package/dist/designer/data/systems/miro/DESIGN.md +111 -0
  241. package/dist/designer/data/systems/miro/components.html +342 -0
  242. package/dist/designer/data/systems/miro/tokens.css +64 -0
  243. package/dist/designer/data/systems/mission-control/DESIGN.md +474 -0
  244. package/dist/designer/data/systems/mission-control/components.html +136 -0
  245. package/dist/designer/data/systems/mission-control/tokens.css +63 -0
  246. package/dist/designer/data/systems/mistral-ai/DESIGN.md +264 -0
  247. package/dist/designer/data/systems/mistral-ai/components.html +338 -0
  248. package/dist/designer/data/systems/mistral-ai/tokens.css +125 -0
  249. package/dist/designer/data/systems/modern/DESIGN.md +71 -0
  250. package/dist/designer/data/systems/modern/components.html +154 -0
  251. package/dist/designer/data/systems/modern/tokens.css +63 -0
  252. package/dist/designer/data/systems/mongodb/DESIGN.md +269 -0
  253. package/dist/designer/data/systems/mongodb/components.html +462 -0
  254. package/dist/designer/data/systems/mongodb/tokens.css +176 -0
  255. package/dist/designer/data/systems/mono/DESIGN.md +71 -0
  256. package/dist/designer/data/systems/mono/components.html +136 -0
  257. package/dist/designer/data/systems/mono/tokens.css +63 -0
  258. package/dist/designer/data/systems/neobrutalism/DESIGN.md +71 -0
  259. package/dist/designer/data/systems/neobrutalism/components.html +136 -0
  260. package/dist/designer/data/systems/neobrutalism/tokens.css +63 -0
  261. package/dist/designer/data/systems/neon/DESIGN.md +71 -0
  262. package/dist/designer/data/systems/neon/components.html +136 -0
  263. package/dist/designer/data/systems/neon/tokens.css +63 -0
  264. package/dist/designer/data/systems/neumorphism/DESIGN.md +71 -0
  265. package/dist/designer/data/systems/neumorphism/components.html +136 -0
  266. package/dist/designer/data/systems/neumorphism/tokens.css +63 -0
  267. package/dist/designer/data/systems/nike/DESIGN.md +366 -0
  268. package/dist/designer/data/systems/nike/components.html +512 -0
  269. package/dist/designer/data/systems/nike/tokens.css +304 -0
  270. package/dist/designer/data/systems/notion/DESIGN.md +312 -0
  271. package/dist/designer/data/systems/notion/components.html +413 -0
  272. package/dist/designer/data/systems/notion/tokens.css +130 -0
  273. package/dist/designer/data/systems/nvidia/DESIGN.md +296 -0
  274. package/dist/designer/data/systems/nvidia/components.html +414 -0
  275. package/dist/designer/data/systems/nvidia/tokens.css +133 -0
  276. package/dist/designer/data/systems/ollama/DESIGN.md +270 -0
  277. package/dist/designer/data/systems/ollama/components.html +700 -0
  278. package/dist/designer/data/systems/ollama/tokens.css +242 -0
  279. package/dist/designer/data/systems/openai/DESIGN.md +140 -0
  280. package/dist/designer/data/systems/openai/components.html +382 -0
  281. package/dist/designer/data/systems/openai/tokens.css +133 -0
  282. package/dist/designer/data/systems/opencode-ai/DESIGN.md +284 -0
  283. package/dist/designer/data/systems/opencode-ai/components.html +389 -0
  284. package/dist/designer/data/systems/opencode-ai/tokens.css +126 -0
  285. package/dist/designer/data/systems/pacman/DESIGN.md +71 -0
  286. package/dist/designer/data/systems/pacman/components.html +342 -0
  287. package/dist/designer/data/systems/pacman/tokens.css +64 -0
  288. package/dist/designer/data/systems/paper/DESIGN.md +71 -0
  289. package/dist/designer/data/systems/paper/components.html +136 -0
  290. package/dist/designer/data/systems/paper/tokens.css +63 -0
  291. package/dist/designer/data/systems/perplexity/DESIGN.md +286 -0
  292. package/dist/designer/data/systems/perplexity/components.html +455 -0
  293. package/dist/designer/data/systems/perplexity/tokens.css +151 -0
  294. package/dist/designer/data/systems/perspective/DESIGN.md +71 -0
  295. package/dist/designer/data/systems/perspective/components.html +136 -0
  296. package/dist/designer/data/systems/perspective/tokens.css +63 -0
  297. package/dist/designer/data/systems/pinterest/DESIGN.md +233 -0
  298. package/dist/designer/data/systems/pinterest/components.html +865 -0
  299. package/dist/designer/data/systems/pinterest/tokens.css +262 -0
  300. package/dist/designer/data/systems/playstation/DESIGN.md +367 -0
  301. package/dist/designer/data/systems/playstation/components.html +414 -0
  302. package/dist/designer/data/systems/playstation/tokens.css +150 -0
  303. package/dist/designer/data/systems/posthog/DESIGN.md +259 -0
  304. package/dist/designer/data/systems/posthog/components.html +827 -0
  305. package/dist/designer/data/systems/posthog/tokens.css +272 -0
  306. package/dist/designer/data/systems/premium/DESIGN.md +71 -0
  307. package/dist/designer/data/systems/premium/components.html +154 -0
  308. package/dist/designer/data/systems/premium/tokens.css +63 -0
  309. package/dist/designer/data/systems/professional/DESIGN.md +71 -0
  310. package/dist/designer/data/systems/professional/components.html +136 -0
  311. package/dist/designer/data/systems/professional/tokens.css +63 -0
  312. package/dist/designer/data/systems/publication/DESIGN.md +71 -0
  313. package/dist/designer/data/systems/publication/components.html +154 -0
  314. package/dist/designer/data/systems/publication/tokens.css +63 -0
  315. package/dist/designer/data/systems/raycast/DESIGN.md +271 -0
  316. package/dist/designer/data/systems/raycast/components.html +507 -0
  317. package/dist/designer/data/systems/raycast/tokens.css +143 -0
  318. package/dist/designer/data/systems/refined/DESIGN.md +71 -0
  319. package/dist/designer/data/systems/refined/components.html +136 -0
  320. package/dist/designer/data/systems/refined/tokens.css +63 -0
  321. package/dist/designer/data/systems/renault/DESIGN.md +314 -0
  322. package/dist/designer/data/systems/renault/components.html +154 -0
  323. package/dist/designer/data/systems/renault/tokens.css +63 -0
  324. package/dist/designer/data/systems/replicate/DESIGN.md +264 -0
  325. package/dist/designer/data/systems/replicate/components.html +340 -0
  326. package/dist/designer/data/systems/replicate/tokens.css +125 -0
  327. package/dist/designer/data/systems/resend/DESIGN.md +306 -0
  328. package/dist/designer/data/systems/resend/components.html +839 -0
  329. package/dist/designer/data/systems/resend/tokens.css +353 -0
  330. package/dist/designer/data/systems/retro/DESIGN.md +71 -0
  331. package/dist/designer/data/systems/retro/components.html +136 -0
  332. package/dist/designer/data/systems/retro/tokens.css +63 -0
  333. package/dist/designer/data/systems/revolut/DESIGN.md +188 -0
  334. package/dist/designer/data/systems/revolut/components.html +342 -0
  335. package/dist/designer/data/systems/revolut/tokens.css +64 -0
  336. package/dist/designer/data/systems/runwayml/DESIGN.md +247 -0
  337. package/dist/designer/data/systems/runwayml/components.html +638 -0
  338. package/dist/designer/data/systems/runwayml/tokens.css +204 -0
  339. package/dist/designer/data/systems/sanity/DESIGN.md +360 -0
  340. package/dist/designer/data/systems/sanity/components.html +342 -0
  341. package/dist/designer/data/systems/sanity/tokens.css +64 -0
  342. package/dist/designer/data/systems/sentry/DESIGN.md +265 -0
  343. package/dist/designer/data/systems/sentry/components.html +387 -0
  344. package/dist/designer/data/systems/sentry/tokens.css +219 -0
  345. package/dist/designer/data/systems/shadcn/DESIGN.md +71 -0
  346. package/dist/designer/data/systems/shadcn/components.html +732 -0
  347. package/dist/designer/data/systems/shadcn/tokens.css +255 -0
  348. package/dist/designer/data/systems/shopify/DESIGN.md +353 -0
  349. package/dist/designer/data/systems/shopify/components.html +342 -0
  350. package/dist/designer/data/systems/shopify/tokens.css +141 -0
  351. package/dist/designer/data/systems/simple/DESIGN.md +71 -0
  352. package/dist/designer/data/systems/simple/components.html +136 -0
  353. package/dist/designer/data/systems/simple/tokens.css +63 -0
  354. package/dist/designer/data/systems/skeumorphism/DESIGN.md +71 -0
  355. package/dist/designer/data/systems/skeumorphism/components.html +136 -0
  356. package/dist/designer/data/systems/skeumorphism/tokens.css +63 -0
  357. package/dist/designer/data/systems/slack/DESIGN.md +363 -0
  358. package/dist/designer/data/systems/slack/components.html +387 -0
  359. package/dist/designer/data/systems/slack/tokens.css +127 -0
  360. package/dist/designer/data/systems/sleek/DESIGN.md +71 -0
  361. package/dist/designer/data/systems/sleek/components.html +136 -0
  362. package/dist/designer/data/systems/sleek/tokens.css +63 -0
  363. package/dist/designer/data/systems/spacex/DESIGN.md +197 -0
  364. package/dist/designer/data/systems/spacex/components.html +496 -0
  365. package/dist/designer/data/systems/spacex/tokens.css +154 -0
  366. package/dist/designer/data/systems/spacious/DESIGN.md +71 -0
  367. package/dist/designer/data/systems/spacious/components.html +136 -0
  368. package/dist/designer/data/systems/spacious/tokens.css +63 -0
  369. package/dist/designer/data/systems/spotify/DESIGN.md +249 -0
  370. package/dist/designer/data/systems/spotify/components.html +365 -0
  371. package/dist/designer/data/systems/spotify/tokens.css +127 -0
  372. package/dist/designer/data/systems/starbucks/DESIGN.md +583 -0
  373. package/dist/designer/data/systems/starbucks/components.html +493 -0
  374. package/dist/designer/data/systems/starbucks/tokens.css +182 -0
  375. package/dist/designer/data/systems/storytelling/DESIGN.md +71 -0
  376. package/dist/designer/data/systems/storytelling/components.html +136 -0
  377. package/dist/designer/data/systems/storytelling/tokens.css +63 -0
  378. package/dist/designer/data/systems/stripe/DESIGN.md +325 -0
  379. package/dist/designer/data/systems/stripe/components.html +1018 -0
  380. package/dist/designer/data/systems/stripe/tokens.css +295 -0
  381. package/dist/designer/data/systems/supabase/DESIGN.md +258 -0
  382. package/dist/designer/data/systems/supabase/components.html +741 -0
  383. package/dist/designer/data/systems/supabase/tokens.css +294 -0
  384. package/dist/designer/data/systems/superhuman/DESIGN.md +255 -0
  385. package/dist/designer/data/systems/superhuman/components.html +537 -0
  386. package/dist/designer/data/systems/superhuman/tokens.css +160 -0
  387. package/dist/designer/data/systems/tesla/DESIGN.md +289 -0
  388. package/dist/designer/data/systems/tesla/components.html +724 -0
  389. package/dist/designer/data/systems/tesla/tokens.css +285 -0
  390. package/dist/designer/data/systems/tetris/DESIGN.md +71 -0
  391. package/dist/designer/data/systems/tetris/components.html +342 -0
  392. package/dist/designer/data/systems/tetris/tokens.css +64 -0
  393. package/dist/designer/data/systems/theverge/DESIGN.md +342 -0
  394. package/dist/designer/data/systems/theverge/components.html +342 -0
  395. package/dist/designer/data/systems/theverge/tokens.css +64 -0
  396. package/dist/designer/data/systems/together-ai/DESIGN.md +266 -0
  397. package/dist/designer/data/systems/together-ai/components.html +422 -0
  398. package/dist/designer/data/systems/together-ai/tokens.css +127 -0
  399. package/dist/designer/data/systems/totality-festival/DESIGN.md +206 -0
  400. package/dist/designer/data/systems/totality-festival/components.html +136 -0
  401. package/dist/designer/data/systems/totality-festival/tokens.css +63 -0
  402. package/dist/designer/data/systems/trading-terminal/DESIGN.md +178 -0
  403. package/dist/designer/data/systems/trading-terminal/components.html +154 -0
  404. package/dist/designer/data/systems/trading-terminal/tokens.css +63 -0
  405. package/dist/designer/data/systems/uber/DESIGN.md +298 -0
  406. package/dist/designer/data/systems/uber/components.html +347 -0
  407. package/dist/designer/data/systems/uber/tokens.css +131 -0
  408. package/dist/designer/data/systems/urdu/DESIGN.md +1002 -0
  409. package/dist/designer/data/systems/urdu/components.html +136 -0
  410. package/dist/designer/data/systems/urdu/tokens.css +63 -0
  411. package/dist/designer/data/systems/vercel/DESIGN.md +313 -0
  412. package/dist/designer/data/systems/vercel/components.html +839 -0
  413. package/dist/designer/data/systems/vercel/tokens.css +270 -0
  414. package/dist/designer/data/systems/vibrant/DESIGN.md +71 -0
  415. package/dist/designer/data/systems/vibrant/components.html +136 -0
  416. package/dist/designer/data/systems/vibrant/tokens.css +63 -0
  417. package/dist/designer/data/systems/vintage/DESIGN.md +71 -0
  418. package/dist/designer/data/systems/vintage/components.html +136 -0
  419. package/dist/designer/data/systems/vintage/tokens.css +63 -0
  420. package/dist/designer/data/systems/vodafone/DESIGN.md +426 -0
  421. package/dist/designer/data/systems/vodafone/components.html +342 -0
  422. package/dist/designer/data/systems/vodafone/tokens.css +64 -0
  423. package/dist/designer/data/systems/voltagent/DESIGN.md +326 -0
  424. package/dist/designer/data/systems/voltagent/components.html +154 -0
  425. package/dist/designer/data/systems/voltagent/tokens.css +63 -0
  426. package/dist/designer/data/systems/warm-editorial/DESIGN.md +65 -0
  427. package/dist/designer/data/systems/warm-editorial/components.html +136 -0
  428. package/dist/designer/data/systems/warm-editorial/tokens.css +63 -0
  429. package/dist/designer/data/systems/warp/DESIGN.md +256 -0
  430. package/dist/designer/data/systems/warp/components.html +411 -0
  431. package/dist/designer/data/systems/warp/tokens.css +156 -0
  432. package/dist/designer/data/systems/webex/DESIGN.md +207 -0
  433. package/dist/designer/data/systems/webex/components.html +342 -0
  434. package/dist/designer/data/systems/webex/tokens.css +64 -0
  435. package/dist/designer/data/systems/webflow/DESIGN.md +95 -0
  436. package/dist/designer/data/systems/webflow/components.html +413 -0
  437. package/dist/designer/data/systems/webflow/tokens.css +191 -0
  438. package/dist/designer/data/systems/wechat/DESIGN.md +302 -0
  439. package/dist/designer/data/systems/wechat/components.html +507 -0
  440. package/dist/designer/data/systems/wechat/tokens.css +176 -0
  441. package/dist/designer/data/systems/wired/DESIGN.md +281 -0
  442. package/dist/designer/data/systems/wired/components.html +342 -0
  443. package/dist/designer/data/systems/wired/tokens.css +64 -0
  444. package/dist/designer/data/systems/wise/DESIGN.md +176 -0
  445. package/dist/designer/data/systems/wise/components.html +365 -0
  446. package/dist/designer/data/systems/wise/tokens.css +141 -0
  447. package/dist/designer/data/systems/x-ai/DESIGN.md +260 -0
  448. package/dist/designer/data/systems/x-ai/components.html +460 -0
  449. package/dist/designer/data/systems/x-ai/tokens.css +268 -0
  450. package/dist/designer/data/systems/xiaohongshu/DESIGN.md +402 -0
  451. package/dist/designer/data/systems/xiaohongshu/components.html +865 -0
  452. package/dist/designer/data/systems/xiaohongshu/tokens.css +193 -0
  453. package/dist/designer/data/systems/zapier/DESIGN.md +331 -0
  454. package/dist/designer/data/systems/zapier/components.html +342 -0
  455. package/dist/designer/data/systems/zapier/tokens.css +64 -0
  456. package/dist/designer/guidelines.js +176 -0
  457. package/dist/designer/index.js +236 -0
  458. package/dist/designer/philosophies.js +668 -0
  459. package/dist/designer/skills.js +1675 -0
  460. package/dist/designer/systems.js +216 -0
  461. package/dist/mcp/sampling-handler.js +1 -1
  462. package/dist/memory/commands/status.js +1 -1
  463. package/dist/memory/compaction.js +2 -2
  464. package/dist/memory/config.js +1 -1
  465. package/dist/memory/debug-log.js +1 -1
  466. package/dist/memory/hooks/compaction-hook.js +29 -0
  467. package/dist/memory/index.js +2 -0
  468. package/dist/memory/observer.js +2 -2
  469. package/dist/memory/project-observations-store.js +14 -0
  470. package/dist/memory/tokens.js +1 -1
  471. package/dist/memory/tools/read-project-observations.js +82 -0
  472. package/dist/memory/tools/recall-observation.js +2 -2
  473. package/dist/pi/agent-core/agent-loop.js +501 -0
  474. package/dist/pi/agent-core/agent.js +401 -0
  475. package/dist/pi/agent-core/harness/agent-harness.js +899 -0
  476. package/dist/pi/agent-core/harness/compaction/branch-summarization.js +173 -0
  477. package/dist/pi/agent-core/harness/compaction/compaction.js +532 -0
  478. package/dist/pi/agent-core/harness/compaction/utils.js +130 -0
  479. package/dist/pi/agent-core/harness/env/nodejs.js +485 -0
  480. package/dist/pi/agent-core/harness/messages.js +101 -0
  481. package/dist/pi/agent-core/harness/prompt-templates.js +229 -0
  482. package/dist/pi/agent-core/harness/session/jsonl-repo.js +100 -0
  483. package/dist/pi/agent-core/harness/session/jsonl-storage.js +230 -0
  484. package/dist/pi/agent-core/harness/session/memory-repo.js +41 -0
  485. package/dist/pi/agent-core/harness/session/memory-storage.js +113 -0
  486. package/dist/pi/agent-core/harness/session/repo-utils.js +38 -0
  487. package/dist/pi/agent-core/harness/session/session.js +196 -0
  488. package/dist/pi/agent-core/harness/session/uuid.js +49 -0
  489. package/dist/pi/agent-core/harness/skills.js +310 -0
  490. package/dist/pi/agent-core/harness/system-prompt.js +29 -0
  491. package/dist/pi/agent-core/harness/types.js +93 -0
  492. package/dist/pi/agent-core/harness/utils/shell-output.js +125 -0
  493. package/dist/pi/agent-core/harness/utils/truncate.js +289 -0
  494. package/dist/pi/agent-core/index.js +24 -0
  495. package/dist/pi/agent-core/node.js +2 -0
  496. package/dist/pi/agent-core/proxy.js +277 -0
  497. package/dist/pi/agent-core/types.js +1 -0
  498. package/dist/pi/ai/api-registry.js +43 -0
  499. package/dist/pi/ai/cli.js +120 -0
  500. package/dist/pi/ai/env-api-keys.js +169 -0
  501. package/dist/pi/ai/image-models.generated.js +441 -0
  502. package/dist/pi/ai/image-models.js +22 -0
  503. package/dist/pi/ai/images-api-registry.js +21 -0
  504. package/dist/pi/ai/images.js +13 -0
  505. package/dist/pi/ai/index.js +18 -0
  506. package/dist/pi/ai/models.generated.js +16220 -0
  507. package/dist/pi/ai/models.js +70 -0
  508. package/dist/pi/ai/oauth.js +1 -0
  509. package/dist/pi/ai/providers/anthropic.js +945 -0
  510. package/dist/pi/ai/providers/faux.js +367 -0
  511. package/dist/pi/ai/providers/github-copilot-headers.js +28 -0
  512. package/dist/pi/ai/providers/openai-completions.js +945 -0
  513. package/dist/pi/ai/providers/openai-prompt-cache.js +9 -0
  514. package/dist/pi/ai/providers/register-builtins.js +97 -0
  515. package/dist/pi/ai/providers/simple-options.js +40 -0
  516. package/dist/pi/ai/providers/transform-messages.js +183 -0
  517. package/dist/pi/ai/session-resources.js +21 -0
  518. package/dist/pi/ai/stream.js +26 -0
  519. package/dist/pi/ai/types.js +1 -0
  520. package/dist/pi/ai/utils/diagnostics.js +24 -0
  521. package/dist/pi/ai/utils/event-stream.js +80 -0
  522. package/dist/pi/ai/utils/hash.js +13 -0
  523. package/dist/pi/ai/utils/headers.js +7 -0
  524. package/dist/pi/ai/utils/json-parse.js +112 -0
  525. package/dist/pi/ai/utils/node-http-proxy.js +96 -0
  526. package/dist/pi/ai/utils/oauth/anthropic.js +334 -0
  527. package/dist/pi/ai/utils/oauth/device-code.js +54 -0
  528. package/dist/pi/ai/utils/oauth/github-copilot.js +270 -0
  529. package/dist/pi/ai/utils/oauth/index.js +121 -0
  530. package/dist/pi/ai/utils/oauth/oauth-page.js +104 -0
  531. package/dist/pi/ai/utils/oauth/openai-codex.js +384 -0
  532. package/dist/pi/ai/utils/oauth/pkce.js +30 -0
  533. package/dist/pi/ai/utils/oauth/types.js +1 -0
  534. package/dist/pi/ai/utils/overflow.js +150 -0
  535. package/dist/pi/ai/utils/sanitize-unicode.js +25 -0
  536. package/dist/pi/ai/utils/typebox-helpers.js +20 -0
  537. package/dist/pi/ai/utils/validation.js +280 -0
  538. package/dist/pi/coding-agent/bun/cli.js +7 -0
  539. package/dist/pi/coding-agent/bun/restore-sandbox-env.js +31 -0
  540. package/dist/pi/coding-agent/cli/args.js +340 -0
  541. package/dist/pi/coding-agent/cli/file-processor.js +82 -0
  542. package/dist/pi/coding-agent/cli/initial-message.js +21 -0
  543. package/dist/pi/coding-agent/cli.js +17 -0
  544. package/dist/pi/coding-agent/config.js +414 -0
  545. package/dist/pi/coding-agent/core/agent-session-runtime.js +299 -0
  546. package/dist/pi/coding-agent/core/agent-session-services.js +117 -0
  547. package/dist/pi/coding-agent/core/agent-session.js +2498 -0
  548. package/dist/pi/coding-agent/core/auth-guidance.js +20 -0
  549. package/dist/pi/coding-agent/core/auth-storage.js +441 -0
  550. package/dist/pi/coding-agent/core/bash-executor.js +110 -0
  551. package/dist/pi/coding-agent/core/compaction/branch-summarization.js +242 -0
  552. package/dist/pi/coding-agent/core/compaction/compaction.js +624 -0
  553. package/dist/pi/coding-agent/core/compaction/index.js +6 -0
  554. package/dist/pi/coding-agent/core/compaction/utils.js +152 -0
  555. package/dist/pi/coding-agent/core/defaults.js +1 -0
  556. package/dist/pi/coding-agent/core/diagnostics.js +1 -0
  557. package/dist/pi/coding-agent/core/event-bus.js +24 -0
  558. package/dist/pi/coding-agent/core/exec.js +74 -0
  559. package/dist/pi/coding-agent/core/export-html/ansi-to-html.js +248 -0
  560. package/dist/pi/coding-agent/core/export-html/index.js +225 -0
  561. package/dist/pi/coding-agent/core/export-html/tool-renderer.js +107 -0
  562. package/dist/pi/coding-agent/core/extensions/index.js +8 -0
  563. package/dist/pi/coding-agent/core/extensions/loader.js +485 -0
  564. package/dist/pi/coding-agent/core/extensions/runner.js +824 -0
  565. package/dist/pi/coding-agent/core/extensions/types.js +44 -0
  566. package/dist/pi/coding-agent/core/extensions/wrapper.js +21 -0
  567. package/dist/pi/coding-agent/core/footer-data-provider.js +309 -0
  568. package/dist/pi/coding-agent/core/http-dispatcher.js +47 -0
  569. package/dist/pi/coding-agent/core/index.js +11 -0
  570. package/dist/pi/coding-agent/core/keybindings.js +294 -0
  571. package/dist/pi/coding-agent/core/messages.js +122 -0
  572. package/dist/pi/coding-agent/core/model-registry.js +728 -0
  573. package/dist/pi/coding-agent/core/model-resolver.js +494 -0
  574. package/dist/pi/coding-agent/core/output-guard.js +58 -0
  575. package/dist/pi/coding-agent/core/package-manager.js +2020 -0
  576. package/dist/pi/coding-agent/core/prompt-templates.js +237 -0
  577. package/dist/pi/coding-agent/core/provider-display-names.js +32 -0
  578. package/dist/pi/coding-agent/core/resolve-config-value.js +125 -0
  579. package/dist/pi/coding-agent/core/resource-loader.js +733 -0
  580. package/dist/pi/coding-agent/core/sdk.js +282 -0
  581. package/dist/pi/coding-agent/core/session-cwd.js +37 -0
  582. package/dist/pi/coding-agent/core/session-manager.js +1146 -0
  583. package/dist/pi/coding-agent/core/settings-manager.js +794 -0
  584. package/dist/pi/coding-agent/core/skills.js +386 -0
  585. package/dist/pi/coding-agent/core/slash-commands.js +24 -0
  586. package/dist/pi/coding-agent/core/source-info.js +18 -0
  587. package/dist/pi/coding-agent/core/system-prompt.js +122 -0
  588. package/dist/pi/coding-agent/core/telemetry.js +8 -0
  589. package/dist/pi/coding-agent/core/timings.js +30 -0
  590. package/dist/pi/coding-agent/core/tools/bash.js +341 -0
  591. package/dist/pi/coding-agent/core/tools/edit-diff.js +344 -0
  592. package/dist/pi/coding-agent/core/tools/edit.js +324 -0
  593. package/dist/pi/coding-agent/core/tools/file-mutation-queue.js +36 -0
  594. package/dist/pi/coding-agent/core/tools/find.js +297 -0
  595. package/dist/pi/coding-agent/core/tools/grep.js +303 -0
  596. package/dist/pi/coding-agent/core/tools/index.js +111 -0
  597. package/dist/pi/coding-agent/core/tools/ls.js +168 -0
  598. package/dist/pi/coding-agent/core/tools/output-accumulator.js +183 -0
  599. package/dist/pi/coding-agent/core/tools/path-utils.js +61 -0
  600. package/dist/pi/coding-agent/core/tools/read.js +288 -0
  601. package/dist/pi/coding-agent/core/tools/render-utils.js +48 -0
  602. package/dist/pi/coding-agent/core/tools/tool-definition-wrapper.js +33 -0
  603. package/dist/pi/coding-agent/core/tools/truncate.js +214 -0
  604. package/dist/pi/coding-agent/core/tools/write.js +212 -0
  605. package/dist/pi/coding-agent/index.js +41 -0
  606. package/dist/pi/coding-agent/main.js +5 -0
  607. package/dist/pi/coding-agent/migrations.js +280 -0
  608. package/dist/pi/coding-agent/modes/index.js +7 -0
  609. package/dist/pi/coding-agent/modes/interactive/components/diff.js +132 -0
  610. package/dist/pi/coding-agent/modes/interactive/components/keybinding-hints.js +35 -0
  611. package/dist/pi/coding-agent/modes/interactive/components/visual-truncate.js +32 -0
  612. package/dist/pi/coding-agent/modes/interactive/interactive-mode.js +3 -0
  613. package/dist/pi/coding-agent/modes/interactive/theme/theme.js +1023 -0
  614. package/dist/pi/coding-agent/modes/print-mode.js +130 -0
  615. package/dist/pi/coding-agent/modes/rpc/jsonl.js +48 -0
  616. package/dist/pi/coding-agent/modes/rpc/rpc-client.js +409 -0
  617. package/dist/pi/coding-agent/modes/rpc/rpc-mode.js +600 -0
  618. package/dist/pi/coding-agent/modes/rpc/rpc-types.js +7 -0
  619. package/dist/pi/coding-agent/utils/ansi.js +51 -0
  620. package/dist/pi/coding-agent/utils/changelog.js +86 -0
  621. package/dist/pi/coding-agent/utils/child-process.js +87 -0
  622. package/dist/pi/coding-agent/utils/clipboard-image.js +244 -0
  623. package/dist/pi/coding-agent/utils/clipboard-native.js +13 -0
  624. package/dist/pi/coding-agent/utils/clipboard.js +116 -0
  625. package/dist/pi/coding-agent/utils/exif-orientation.js +157 -0
  626. package/dist/pi/coding-agent/utils/frontmatter.js +25 -0
  627. package/dist/pi/coding-agent/utils/fs-watch.js +24 -0
  628. package/dist/pi/coding-agent/utils/git.js +162 -0
  629. package/dist/pi/coding-agent/utils/html.js +39 -0
  630. package/dist/pi/coding-agent/utils/image-convert.js +38 -0
  631. package/dist/pi/coding-agent/utils/image-resize.js +136 -0
  632. package/dist/pi/coding-agent/utils/mime.js +68 -0
  633. package/dist/pi/coding-agent/utils/paths.js +91 -0
  634. package/dist/pi/coding-agent/utils/photon.js +120 -0
  635. package/dist/pi/coding-agent/utils/pi-user-agent.js +4 -0
  636. package/dist/pi/coding-agent/utils/shell.js +194 -0
  637. package/dist/pi/coding-agent/utils/sleep.js +16 -0
  638. package/dist/pi/coding-agent/utils/syntax-highlight.js +117 -0
  639. package/dist/pi/coding-agent/utils/tools-manager.js +327 -0
  640. package/dist/pi/coding-agent/utils/version-check.js +81 -0
  641. package/dist/pi/coding-agent/utils/windows-self-update.js +76 -0
  642. package/dist/pi/tui/autocomplete.js +631 -0
  643. package/dist/pi/tui/components/box.js +103 -0
  644. package/dist/pi/tui/components/cancellable-loader.js +34 -0
  645. package/dist/pi/tui/components/editor.js +1915 -0
  646. package/dist/pi/tui/components/image.js +88 -0
  647. package/dist/pi/tui/components/input.js +425 -0
  648. package/dist/pi/tui/components/loader.js +68 -0
  649. package/dist/pi/tui/components/markdown.js +633 -0
  650. package/dist/pi/tui/components/select-list.js +158 -0
  651. package/dist/pi/tui/components/settings-list.js +184 -0
  652. package/dist/pi/tui/components/spacer.js +22 -0
  653. package/dist/pi/tui/components/text.js +88 -0
  654. package/dist/pi/tui/components/truncated-text.js +50 -0
  655. package/dist/pi/tui/editor-component.js +1 -0
  656. package/dist/pi/tui/fuzzy.js +109 -0
  657. package/dist/pi/tui/index.js +31 -0
  658. package/dist/pi/tui/keybindings.js +173 -0
  659. package/dist/pi/tui/keys.js +1172 -0
  660. package/dist/pi/tui/kill-ring.js +43 -0
  661. package/dist/pi/tui/stdin-buffer.js +360 -0
  662. package/dist/pi/tui/terminal-image.js +335 -0
  663. package/dist/pi/tui/terminal.js +324 -0
  664. package/dist/pi/tui/tui.js +1076 -0
  665. package/dist/pi/tui/undo-stack.js +24 -0
  666. package/dist/pi/tui/utils.js +1016 -0
  667. package/dist/server/pi-bridge.js +156 -6
  668. package/dist/server/session-stream.js +53 -112
  669. package/dist/server/storage.js +62 -1
  670. package/dist/server/title-generator.js +14 -153
  671. package/package.json +24 -6
@@ -2,10 +2,10 @@
2
2
  * Subagent Delegation Extension for Spectral
3
3
  *
4
4
  * Registers a `subagent` tool that allows the coding agent to delegate tasks
5
- * to specialized sub-agents running in isolated `pi` / `spectral` processes.
5
+ * to specialized sub-agents running in-process via `agentLoop()`.
6
6
  *
7
- * Each subagent invocation spawns a separate process with its own context
8
- * window, keeping the main conversation lean and focused.
7
+ * Each subagent invocation runs with its own fresh AgentContext (isolated
8
+ * context window), keeping the main conversation lean and focused.
9
9
  *
10
10
  * Three execution modes:
11
11
  * - Single: { agent: "name", task: "..." }
@@ -16,25 +16,29 @@
16
16
  * - ~/.pi/agent/agents/*.md (user-level, always loaded)
17
17
  * - .pi/agents/*.md (project-level, opt-in via agentScope)
18
18
  *
19
- * The subagent binary is auto-detected:
20
- * - If running via `spectral`, uses the same invocation path
21
- * - Falls back to `pi` otherwise
19
+ * Subagents use an in-process `agentLoop()` for:
20
+ * - Clean context isolation (fresh messages array)
21
+ * - Combined system prompt (main agent + subagent-specific instructions)
22
+ * - Tool filtering (only the tools specified in agent config)
23
+ * - Model selection (session model preferred, agent-configured as fallback)
24
+ * - Signal propagation (abort passthrough)
25
+ * - Access to observational memory via the recall tool
22
26
  */
23
- import { spawn } from "node:child_process";
24
- import * as fs from "node:fs";
25
- import * as os from "node:os";
26
- import * as path from "node:path";
27
- import { StringEnum } from "@mariozechner/pi-ai";
28
- import { getMarkdownTheme, withFileMutationQueue, } from "@mariozechner/pi-coding-agent";
29
- import { Container, Markdown, Spacer, Text } from "@mariozechner/pi-tui";
27
+ import { agentLoop } from "../pi/agent-core/index.js";
28
+ import { StringEnum } from "../pi/ai/index.js";
29
+ import { Text } from "../pi/tui/index.js";
30
30
  import { Type } from "typebox";
31
31
  import { discoverAgents } from "./agents.js";
32
32
  // ---------------------------------------------------------------------------
33
+ // Built-in tool resolution (no spawn needed — tools are registered in-process)
34
+ // ---------------------------------------------------------------------------
35
+ import { createTool, allToolNames } from "../pi/coding-agent/core/tools/index.js";
36
+ import { wrapToolDefinition } from "../pi/coding-agent/core/tools/tool-definition-wrapper.js";
37
+ // ---------------------------------------------------------------------------
33
38
  // Constants
34
39
  // ---------------------------------------------------------------------------
35
40
  const MAX_PARALLEL_TASKS = 8;
36
41
  const MAX_CONCURRENCY = 4;
37
- const COLLAPSED_ITEM_COUNT = 10;
38
42
  // ---------------------------------------------------------------------------
39
43
  // Helpers — formatting
40
44
  // ---------------------------------------------------------------------------
@@ -68,69 +72,6 @@ function formatUsageStats(usage, model) {
68
72
  parts.push(model);
69
73
  return parts.join(" ");
70
74
  }
71
- function formatToolCall(toolName, args, themeFg) {
72
- const shortenPath = (p) => {
73
- const home = os.homedir();
74
- return p.startsWith(home) ? `~${p.slice(home.length)}` : p;
75
- };
76
- switch (toolName) {
77
- case "bash": {
78
- const command = args.command || "...";
79
- const preview = command.length > 60 ? `${command.slice(0, 60)}...` : command;
80
- return themeFg("muted", "$ ") + themeFg("toolOutput", preview);
81
- }
82
- case "read": {
83
- const rawPath = (args.file_path || args.path || "...");
84
- const filePath = shortenPath(rawPath);
85
- const offset = args.offset;
86
- const limit = args.limit;
87
- let text = themeFg("accent", filePath);
88
- if (offset !== undefined || limit !== undefined) {
89
- const startLine = offset ?? 1;
90
- const endLine = limit !== undefined ? startLine + limit - 1 : "";
91
- text += themeFg("warning", `:${startLine}${endLine ? `-${endLine}` : ""}`);
92
- }
93
- return themeFg("muted", "read ") + text;
94
- }
95
- case "write": {
96
- const rawPath = (args.file_path || args.path || "...");
97
- const filePath = shortenPath(rawPath);
98
- const content = (args.content || "");
99
- const lines = content.split("\n").length;
100
- let text = themeFg("muted", "write ") + themeFg("accent", filePath);
101
- if (lines > 1)
102
- text += themeFg("dim", ` (${lines} lines)`);
103
- return text;
104
- }
105
- case "edit": {
106
- const rawPath = (args.file_path || args.path || "...");
107
- return themeFg("muted", "edit ") + themeFg("accent", shortenPath(rawPath));
108
- }
109
- case "ls": {
110
- const rawPath = (args.path || ".");
111
- return themeFg("muted", "ls ") + themeFg("accent", shortenPath(rawPath));
112
- }
113
- case "find": {
114
- const pattern = (args.pattern || "*");
115
- const rawPath = (args.path || ".");
116
- return (themeFg("muted", "find ") +
117
- themeFg("accent", pattern) +
118
- themeFg("dim", ` in ${shortenPath(rawPath)}`));
119
- }
120
- case "grep": {
121
- const pattern = (args.pattern || "");
122
- const rawPath = (args.path || ".");
123
- return (themeFg("muted", "grep ") +
124
- themeFg("accent", `/${pattern}/`) +
125
- themeFg("dim", ` in ${shortenPath(rawPath)}`));
126
- }
127
- default: {
128
- const argsStr = JSON.stringify(args);
129
- const preview = argsStr.length > 50 ? `${argsStr.slice(0, 50)}...` : argsStr;
130
- return themeFg("accent", toolName) + themeFg("dim", ` ${preview}`);
131
- }
132
- }
133
- }
134
75
  // ---------------------------------------------------------------------------
135
76
  // Helpers — message extraction
136
77
  // ---------------------------------------------------------------------------
@@ -146,22 +87,73 @@ function getFinalOutput(messages) {
146
87
  }
147
88
  return "";
148
89
  }
149
- function getDisplayItems(messages) {
150
- const items = [];
151
- for (const msg of messages) {
152
- if (msg.role === "assistant") {
153
- for (const part of msg.content) {
154
- if (part.type === "text")
155
- items.push({ type: "text", text: part.text });
156
- else if (part.type === "toolCall")
157
- items.push({ type: "toolCall", name: part.name, args: part.arguments });
90
+ // ---------------------------------------------------------------------------
91
+ // Helpers model resolution
92
+ // ---------------------------------------------------------------------------
93
+ /**
94
+ * Resolve a model string (e.g. "claude-sonnet-4-5" or "anthropic/claude-sonnet-4-5")
95
+ * to a Model object from the registry.
96
+ */
97
+ function resolveModelString(modelStr, modelRegistry) {
98
+ if (!modelStr)
99
+ return undefined;
100
+ const allModels = modelRegistry.getAll();
101
+ // Try "provider/modelId" format
102
+ const slashIdx = modelStr.indexOf("/");
103
+ if (slashIdx !== -1) {
104
+ const provider = modelStr.substring(0, slashIdx);
105
+ const modelId = modelStr.substring(slashIdx + 1);
106
+ const match = allModels.find((m) => m.provider.toLowerCase() === provider.toLowerCase() && m.id.toLowerCase() === modelId.toLowerCase());
107
+ if (match)
108
+ return match;
109
+ }
110
+ // Try exact model ID match
111
+ const idMatch = allModels.find((m) => m.id.toLowerCase() === modelStr.toLowerCase());
112
+ if (idMatch)
113
+ return idMatch;
114
+ // Try fuzzy match (model ID contains the string)
115
+ const fuzzy = allModels.find((m) => m.id.toLowerCase().includes(modelStr.toLowerCase()));
116
+ return fuzzy;
117
+ }
118
+ // ---------------------------------------------------------------------------
119
+ // Helpers — tool resolution
120
+ // ---------------------------------------------------------------------------
121
+ /**
122
+ * Resolve tool names from an agent definition into AgentTool objects.
123
+ *
124
+ * Built-in tools (read, bash, edit, write, grep, find, ls) are created via
125
+ * `createTool()`. Extension-registered tools (e.g., recall) are resolved
126
+ * via the ExtensionAPI and wrapped.
127
+ */
128
+ function resolveSubagentTools(toolNames, cwd, pi, ctx) {
129
+ if (!toolNames || toolNames.length === 0)
130
+ return [];
131
+ const tools = [];
132
+ for (const name of toolNames) {
133
+ // Built-in tools
134
+ if (allToolNames.has(name)) {
135
+ try {
136
+ const tool = createTool(name, cwd);
137
+ tools.push(tool);
138
+ }
139
+ catch {
140
+ // Tool creation failed — skip
158
141
  }
142
+ continue;
143
+ }
144
+ // Extension-registered tools (recall, designer_*, etc.)
145
+ // pi at runtime is the embedded ExtensionAPI which has getToolDefinition;
146
+ // the npm types don't expose it, so we cast.
147
+ const richPi = pi;
148
+ const toolDef = richPi.getToolDefinition(name);
149
+ if (toolDef) {
150
+ tools.push(wrapToolDefinition(toolDef, () => ctx));
159
151
  }
160
152
  }
161
- return items;
153
+ return tools;
162
154
  }
163
155
  // ---------------------------------------------------------------------------
164
- // Helpers — concurrency, temp files, binary detection
156
+ // Helpers — concurrency
165
157
  // ---------------------------------------------------------------------------
166
158
  async function mapWithConcurrencyLimit(items, concurrency, fn) {
167
159
  if (items.length === 0)
@@ -180,65 +172,10 @@ async function mapWithConcurrencyLimit(items, concurrency, fn) {
180
172
  await Promise.all(workers);
181
173
  return results;
182
174
  }
183
- async function writePromptToTempFile(agentName, prompt) {
184
- const tmpDir = await fs.promises.mkdtemp(path.join(os.tmpdir(), "spectral-subagent-"));
185
- const safeName = agentName.replace(/[^\w.-]+/g, "_");
186
- const filePath = path.join(tmpDir, `prompt-${safeName}.md`);
187
- await withFileMutationQueue(filePath, async () => {
188
- await fs.promises.writeFile(filePath, prompt, { encoding: "utf-8", mode: 0o600 });
189
- });
190
- return { dir: tmpDir, filePath };
191
- }
192
- /**
193
- * Detect the correct binary for spawning subagent processes.
194
- *
195
- * Strategy:
196
- * 1. If `process.argv[1]` points to an existing script (unlikely in bundled
197
- * env but possible during dev with tsx), use that script with node.
198
- * 2. If the executor is named `spectral` or `aexol`, use it directly (the
199
- * wrapper ensures MCP + memory extensions are auto-loaded).
200
- * 3. Otherwise fall back to `pi`.
201
- */
202
- function getPiInvocation(subagentArgs) {
203
- const currentScript = process.argv[1];
204
- // Case 1: running via tsx with an existing script file
205
- if (currentScript && fs.existsSync(currentScript)) {
206
- return { command: process.execPath, args: [currentScript, ...subagentArgs] };
207
- }
208
- // Case 2: check if this is the spectral/aexol wrapper binary
209
- const execName = path.basename(process.execPath).toLowerCase();
210
- if (execName === "spectral" || execName === "aexol") {
211
- return { command: process.execPath, args: subagentArgs };
212
- }
213
- // Case 3: generic node — try spectral first, then pi
214
- function hasBin(name) {
215
- const PATH = process.env.PATH || "";
216
- const envPathSep = process.platform === "win32" ? ";" : ":";
217
- for (const dir of PATH.split(envPathSep)) {
218
- const candidate = path.join(dir, name);
219
- try {
220
- if (fs.existsSync(candidate))
221
- return true;
222
- }
223
- catch {
224
- /* skip */
225
- }
226
- }
227
- return false;
228
- }
229
- if (hasBin("spectral")) {
230
- return { command: "spectral", args: subagentArgs };
231
- }
232
- if (hasBin("pi")) {
233
- return { command: "pi", args: subagentArgs };
234
- }
235
- // Last resort: use node with pi from node_modules (matches pi's own fallback)
236
- return { command: "pi", args: subagentArgs };
237
- }
238
175
  // ---------------------------------------------------------------------------
239
- // Core — run a single subagent
176
+ // Core — run a single subagent in-process via agentLoop
240
177
  // ---------------------------------------------------------------------------
241
- async function runSingleAgent(defaultCwd, agents, agentName, task, cwd, step, signal, onUpdate, makeDetails) {
178
+ async function runSingleAgent(defaultCwd, agents, agentName, task, cwd, step, signal, onUpdate, makeDetails, pi, ctx) {
242
179
  const agent = agents.find((a) => a.name === agentName);
243
180
  if (!agent) {
244
181
  const available = agents.map((a) => `"${a.name}"`).join(", ") || "none";
@@ -253,13 +190,47 @@ async function runSingleAgent(defaultCwd, agents, agentName, task, cwd, step, si
253
190
  step,
254
191
  };
255
192
  }
256
- const args = ["--mode", "json", "-p", "--no-session"];
257
- if (agent.model)
258
- args.push("--model", agent.model);
259
- if (agent.tools && agent.tools.length > 0)
260
- args.push("--tools", agent.tools.join(","));
261
- let tmpPromptDir = null;
262
- let tmpPromptPath = null;
193
+ // Build combined system prompt: main agent's + subagent's
194
+ const mainSystemPrompt = ctx.getSystemPrompt();
195
+ const combinedPrompt = mainSystemPrompt
196
+ ? `${mainSystemPrompt}\n\n---\n\nSubagent: ${agent.name}\n${agent.systemPrompt}`
197
+ : agent.systemPrompt;
198
+ // Resolve model — session model preferred, agent-configured as fallback
199
+ const sessionModel = ctx.model && ctx.modelRegistry.hasConfiguredAuth(ctx.model) ? ctx.model : undefined;
200
+ const model = sessionModel ?? resolveModelString(agent.model, ctx.modelRegistry);
201
+ if (!model) {
202
+ return {
203
+ agent: agentName,
204
+ agentSource: agent.source,
205
+ task,
206
+ exitCode: 1,
207
+ messages: [],
208
+ stderr: `Cannot resolve model "${agent.model ?? "(none specified)"}". Make sure the model is configured.`,
209
+ usage: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, cost: 0, contextTokens: 0, turns: 0 },
210
+ model: agent.model,
211
+ step,
212
+ errorMessage: `Model not found: ${agent.model ?? "unspecified"}`,
213
+ };
214
+ }
215
+ // Resolve auth for the model
216
+ const auth = await ctx.modelRegistry.getApiKeyAndHeaders(model);
217
+ if (!auth.ok || !auth.apiKey) {
218
+ return {
219
+ agent: agentName,
220
+ agentSource: agent.source,
221
+ task,
222
+ exitCode: 1,
223
+ messages: [],
224
+ stderr: `No API key configured for model "${model.provider}/${model.id}".`,
225
+ usage: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, cost: 0, contextTokens: 0, turns: 0 },
226
+ model: agent.model,
227
+ step,
228
+ errorMessage: `No API key for ${model.provider}/${model.id}`,
229
+ };
230
+ }
231
+ // Resolve tools
232
+ const effectiveCwd = cwd ?? defaultCwd;
233
+ const tools = resolveSubagentTools(agent.tools, effectiveCwd, pi, ctx);
263
234
  const currentResult = {
264
235
  agent: agentName,
265
236
  agentSource: agent.source,
@@ -268,7 +239,7 @@ async function runSingleAgent(defaultCwd, agents, agentName, task, cwd, step, si
268
239
  messages: [],
269
240
  stderr: "",
270
241
  usage: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, cost: 0, contextTokens: 0, turns: 0 },
271
- model: agent.model,
242
+ model: model.id,
272
243
  step,
273
244
  };
274
245
  const emitUpdate = () => {
@@ -280,113 +251,79 @@ async function runSingleAgent(defaultCwd, agents, agentName, task, cwd, step, si
280
251
  }
281
252
  };
282
253
  try {
283
- if (agent.systemPrompt.trim()) {
284
- const tmp = await writePromptToTempFile(agent.name, agent.systemPrompt);
285
- tmpPromptDir = tmp.dir;
286
- tmpPromptPath = tmp.filePath;
287
- args.push("--append-system-prompt", tmpPromptPath);
288
- }
289
- args.push(`Task: ${task}`);
290
- let wasAborted = false;
291
- const exitCode = await new Promise((resolve) => {
292
- const invocation = getPiInvocation(args);
293
- const proc = spawn(invocation.command, invocation.args, {
294
- cwd: cwd ?? defaultCwd,
295
- shell: false,
296
- stdio: ["ignore", "pipe", "pipe"],
297
- });
298
- let buffer = "";
299
- const processLine = (line) => {
300
- if (!line.trim())
301
- return;
302
- let event;
303
- try {
304
- event = JSON.parse(line);
305
- }
306
- catch {
307
- return;
308
- }
309
- if (event.type === "message_end" && event.message) {
310
- const msg = event.message;
311
- currentResult.messages.push(msg);
312
- if (msg.role === "assistant") {
313
- currentResult.usage.turns++;
314
- const usage = msg.usage;
315
- if (usage) {
316
- currentResult.usage.input += usage.input || 0;
317
- currentResult.usage.output += usage.output || 0;
318
- currentResult.usage.cacheRead += usage.cacheRead || 0;
319
- currentResult.usage.cacheWrite += usage.cacheWrite || 0;
320
- currentResult.usage.cost += usage.cost?.total || 0;
321
- currentResult.usage.contextTokens = usage.totalTokens || 0;
322
- }
323
- if (!currentResult.model && msg.model)
324
- currentResult.model = msg.model;
325
- if (msg.stopReason)
326
- currentResult.stopReason = msg.stopReason;
327
- if (msg.errorMessage)
328
- currentResult.errorMessage = msg.errorMessage;
254
+ const config = {
255
+ model,
256
+ apiKey: auth.apiKey,
257
+ headers: auth.headers,
258
+ convertToLlm: (msgs) => msgs.filter((m) => m.role === "user" || m.role === "assistant" || m.role === "toolResult"),
259
+ toolExecution: "parallel",
260
+ };
261
+ const stream = agentLoop([{ role: "user", content: [{ type: "text", text: task }], timestamp: Date.now() }], {
262
+ systemPrompt: combinedPrompt,
263
+ messages: [],
264
+ tools,
265
+ }, config, signal);
266
+ // Collect messages from the stream
267
+ const collectedMessages = [];
268
+ let hadError = false;
269
+ for await (const event of stream) {
270
+ if (signal?.aborted) {
271
+ hadError = true;
272
+ break;
273
+ }
274
+ if (event.type === "message_end" && event.message) {
275
+ const msg = event.message;
276
+ collectedMessages.push(msg);
277
+ if (msg.role === "assistant") {
278
+ currentResult.usage.turns++;
279
+ const usage = msg.usage;
280
+ if (usage) {
281
+ currentResult.usage.input += usage.input || 0;
282
+ currentResult.usage.output += usage.output || 0;
283
+ currentResult.usage.cacheRead += usage.cacheRead || 0;
284
+ currentResult.usage.cacheWrite += usage.cacheWrite || 0;
285
+ currentResult.usage.cost += usage.cost?.total || 0;
286
+ currentResult.usage.contextTokens = usage.totalTokens || 0;
287
+ }
288
+ if (!currentResult.model && msg.model)
289
+ currentResult.model = msg.model;
290
+ if (msg.stopReason)
291
+ currentResult.stopReason = msg.stopReason;
292
+ if (msg.errorMessage)
293
+ currentResult.errorMessage = msg.errorMessage;
294
+ if (msg.stopReason === "error" || msg.stopReason === "aborted") {
295
+ hadError = true;
329
296
  }
330
- emitUpdate();
331
- }
332
- if (event.type === "tool_result_end" && event.message) {
333
- currentResult.messages.push(event.message);
334
- emitUpdate();
335
297
  }
336
- };
337
- proc.stdout.on("data", (data) => {
338
- buffer += data.toString();
339
- const lines = buffer.split("\n");
340
- buffer = lines.pop() || "";
341
- for (const line of lines)
342
- processLine(line);
343
- });
344
- proc.stderr.on("data", (data) => {
345
- currentResult.stderr += data.toString();
346
- });
347
- proc.on("close", (code) => {
348
- if (buffer.trim())
349
- processLine(buffer);
350
- resolve(code ?? 0);
351
- });
352
- proc.on("error", () => {
353
- resolve(1);
354
- });
355
- if (signal) {
356
- const killProc = () => {
357
- wasAborted = true;
358
- proc.kill("SIGTERM");
359
- setTimeout(() => {
360
- if (!proc.killed)
361
- proc.kill("SIGKILL");
362
- }, 5000);
363
- };
364
- if (signal.aborted)
365
- killProc();
366
- else
367
- signal.addEventListener("abort", killProc, { once: true });
298
+ currentResult.messages = [...collectedMessages];
299
+ emitUpdate();
300
+ }
301
+ if (event.type === "tool_execution_end" && event.isError) {
302
+ emitUpdate();
368
303
  }
369
- });
370
- currentResult.exitCode = exitCode;
371
- if (wasAborted)
372
- throw new Error("Subagent was aborted");
304
+ }
305
+ // Drain the stream result (already consumed by iteration, but ensure cleanup)
306
+ try {
307
+ await stream.result();
308
+ }
309
+ catch {
310
+ // Stream result error — already handled by message events
311
+ }
312
+ currentResult.exitCode = hadError ? 1 : 0;
313
+ if (signal?.aborted) {
314
+ currentResult.exitCode = 1;
315
+ currentResult.stopReason = "aborted";
316
+ currentResult.errorMessage = "Subagent was aborted";
317
+ }
373
318
  return currentResult;
374
319
  }
375
- finally {
376
- if (tmpPromptPath)
377
- try {
378
- fs.unlinkSync(tmpPromptPath);
379
- }
380
- catch {
381
- /* ignore */
382
- }
383
- if (tmpPromptDir)
384
- try {
385
- fs.rmdirSync(tmpPromptDir);
386
- }
387
- catch {
388
- /* ignore */
389
- }
320
+ catch (err) {
321
+ const errorMsg = err instanceof Error ? err.message : String(err);
322
+ currentResult.exitCode = 1;
323
+ currentResult.stopReason = "error";
324
+ currentResult.errorMessage = errorMsg;
325
+ currentResult.stderr = errorMsg;
326
+ return currentResult;
390
327
  }
391
328
  }
392
329
  // ---------------------------------------------------------------------------
@@ -471,7 +408,9 @@ export default function subagentExtension(pi) {
471
408
  details: makeDetails("single")([]),
472
409
  };
473
410
  }
474
- // Security: if project-local agents are enabled, confirm with user
411
+ // Security: if project-local agents are enabled, confirm with user.
412
+ // In headless mode (no TUI), project-local agents are silently allowed —
413
+ // the caller is already trusted (it's the coding agent itself).
475
414
  if ((agentScope === "project" || agentScope === "both") &&
476
415
  confirmProjectAgents &&
477
416
  ctx.hasUI) {
@@ -519,7 +458,7 @@ export default function subagentExtension(pi) {
519
458
  }
520
459
  }
521
460
  : undefined;
522
- const result = await runSingleAgent(ctx.cwd, agents, step.agent, taskWithContext, step.cwd, i + 1, signal, chainUpdate, makeDetails("chain"));
461
+ const result = await runSingleAgent(ctx.cwd, agents, step.agent, taskWithContext, step.cwd, i + 1, signal, chainUpdate, makeDetails("chain"), pi, ctx);
523
462
  results.push(result);
524
463
  const isError = result.exitCode !== 0 ||
525
464
  result.stopReason === "error" ||
@@ -597,7 +536,7 @@ export default function subagentExtension(pi) {
597
536
  allResults[index] = partial.details.results[0];
598
537
  emitParallelUpdate();
599
538
  }
600
- }, makeDetails("parallel"));
539
+ }, makeDetails("parallel"), pi, ctx);
601
540
  allResults[index] = result;
602
541
  emitParallelUpdate();
603
542
  return result;
@@ -620,7 +559,7 @@ export default function subagentExtension(pi) {
620
559
  }
621
560
  // ── Single mode ─────────────────────────────────────────────
622
561
  if (params.agent && params.task) {
623
- const result = await runSingleAgent(ctx.cwd, agents, params.agent, params.task, params.cwd, undefined, signal, onUpdate, makeDetails("single"));
562
+ const result = await runSingleAgent(ctx.cwd, agents, params.agent, params.task, params.cwd, undefined, signal, onUpdate, makeDetails("single"), pi, ctx);
624
563
  const isError = result.exitCode !== 0 ||
625
564
  result.stopReason === "error" ||
626
565
  result.stopReason === "aborted";
@@ -661,148 +600,72 @@ export default function subagentExtension(pi) {
661
600
  details: makeDetails("single")([]),
662
601
  };
663
602
  },
664
- // ── Rendering ─────────────────────────────────────────────────
665
- renderCall(args, theme, _context) {
603
+ // ── Rendering (headless-compatible: plain text strings, no TUI imports) ──
604
+ renderCall(args, _theme, _context) {
666
605
  const scope = args.agentScope ?? "user";
667
606
  if (args.chain && args.chain.length > 0) {
668
- let text = theme.fg("toolTitle", theme.bold("subagent ")) +
669
- theme.fg("accent", `chain (${args.chain.length} steps)`) +
670
- theme.fg("muted", ` [${scope}]`);
607
+ let text = `subagent chain (${args.chain.length} steps) [${scope}]`;
671
608
  for (let i = 0; i < Math.min(args.chain.length, 3); i++) {
672
609
  const step = args.chain[i];
673
610
  const cleanTask = step.task.replace(/\{previous\}/g, "").trim();
674
611
  const preview = cleanTask.length > 40 ? `${cleanTask.slice(0, 40)}...` : cleanTask;
675
- text +=
676
- "\n " +
677
- theme.fg("muted", `${i + 1}.`) +
678
- " " +
679
- theme.fg("accent", step.agent) +
680
- theme.fg("dim", ` ${preview}`);
612
+ text += `\n ${i + 1}. ${step.agent} ${preview}`;
681
613
  }
682
614
  if (args.chain.length > 3)
683
- text += `\n ${theme.fg("muted", `... +${args.chain.length - 3} more`)}`;
684
- return new Text(text, 0, 0);
615
+ text += `\n ... +${args.chain.length - 3} more`;
616
+ return new Text(text);
685
617
  }
686
618
  if (args.tasks && args.tasks.length > 0) {
687
- let text = theme.fg("toolTitle", theme.bold("subagent ")) +
688
- theme.fg("accent", `parallel (${args.tasks.length} tasks)`) +
689
- theme.fg("muted", ` [${scope}]`);
619
+ let text = `subagent parallel (${args.tasks.length} tasks) [${scope}]`;
690
620
  for (const t of args.tasks.slice(0, 3)) {
691
621
  const preview = t.task.length > 40 ? `${t.task.slice(0, 40)}...` : t.task;
692
- text += `\n ${theme.fg("accent", t.agent)}${theme.fg("dim", ` ${preview}`)}`;
622
+ text += `\n ${t.agent} ${preview}`;
693
623
  }
694
624
  if (args.tasks.length > 3)
695
- text += `\n ${theme.fg("muted", `... +${args.tasks.length - 3} more`)}`;
696
- return new Text(text, 0, 0);
625
+ text += `\n ... +${args.tasks.length - 3} more`;
626
+ return new Text(text);
697
627
  }
698
628
  const agentName = args.agent || "...";
699
629
  const preview = args.task
700
- ? args.task.length > 60
701
- ? `${args.task.slice(0, 60)}...`
702
- : args.task
630
+ ? args.task.length > 60 ? `${args.task.slice(0, 60)}...` : args.task
703
631
  : "...";
704
- let text = theme.fg("toolTitle", theme.bold("subagent ")) +
705
- theme.fg("accent", agentName) +
706
- theme.fg("muted", ` [${scope}]`);
707
- text += `\n ${theme.fg("dim", preview)}`;
708
- return new Text(text, 0, 0);
632
+ return new Text(`subagent ${agentName} [${scope}]\n ${preview}`);
709
633
  },
710
- renderResult(result, { expanded }, theme, _context) {
634
+ renderResult(result, _opts, _theme, _context) {
711
635
  const details = result.details;
712
636
  if (!details || details.results.length === 0) {
713
637
  const text = result.content[0];
714
- return new Text(text?.type === "text" ? text.text : "(no output)", 0, 0);
638
+ return new Text(text?.type === "text" ? text.text : "(no output)");
715
639
  }
716
- const mdTheme = getMarkdownTheme();
717
- const renderDisplayItems = (items, limit) => {
718
- const toShow = limit ? items.slice(-limit) : items;
719
- const skipped = limit && items.length > limit ? items.length - limit : 0;
720
- let text = "";
721
- if (skipped > 0)
722
- text += theme.fg("muted", `... ${skipped} earlier items\n`);
723
- for (const item of toShow) {
724
- if (item.type === "text") {
725
- const preview = expanded
726
- ? item.text
727
- : item.text.split("\n").slice(0, 3).join("\n");
728
- text += `${theme.fg("toolOutput", preview)}\n`;
729
- }
730
- else {
731
- text += `${theme.fg("muted", "→ ") + formatToolCall(item.name, item.args, theme.fg.bind(theme))}\n`;
732
- }
733
- }
734
- return text.trimEnd();
735
- };
640
+ const lines = [];
736
641
  if (details.mode === "single" && details.results.length === 1) {
737
642
  const r = details.results[0];
738
- const isError = r.exitCode !== 0 ||
739
- r.stopReason === "error" ||
740
- r.stopReason === "aborted";
741
- const icon = isError
742
- ? theme.fg("error", "✗")
743
- : theme.fg("success", "✓");
744
- const displayItems = getDisplayItems(r.messages);
643
+ const isError = r.exitCode !== 0 || r.stopReason === "error" || r.stopReason === "aborted";
644
+ const icon = isError ? "" : "✓";
745
645
  const finalOutput = getFinalOutput(r.messages);
746
- if (expanded) {
747
- const container = new Container();
748
- let header = `${icon} ${theme.fg("toolTitle", theme.bold(r.agent))}${theme.fg("muted", ` (${r.agentSource})`)}`;
749
- if (isError && r.stopReason)
750
- header += ` ${theme.fg("error", `[${r.stopReason}]`)}`;
751
- container.addChild(new Text(header, 0, 0));
752
- if (isError && r.errorMessage)
753
- container.addChild(new Text(theme.fg("error", `Error: ${r.errorMessage}`), 0, 0));
754
- container.addChild(new Spacer(1));
755
- container.addChild(new Text(theme.fg("muted", "─── Task ───"), 0, 0));
756
- container.addChild(new Text(theme.fg("dim", r.task), 0, 0));
757
- container.addChild(new Spacer(1));
758
- container.addChild(new Text(theme.fg("muted", "─── Output ───"), 0, 0));
759
- if (displayItems.length === 0 && !finalOutput) {
760
- container.addChild(new Text(theme.fg("muted", "(no output)"), 0, 0));
761
- }
762
- else {
763
- for (const item of displayItems) {
764
- if (item.type === "toolCall")
765
- container.addChild(new Text(theme.fg("muted", "→ ") +
766
- formatToolCall(item.name, item.args, theme.fg.bind(theme)), 0, 0));
767
- }
768
- if (finalOutput) {
769
- container.addChild(new Spacer(1));
770
- container.addChild(new Markdown(finalOutput.trim(), 0, 0, mdTheme));
771
- }
772
- }
773
- const usageStr = formatUsageStats(r.usage, r.model);
774
- if (usageStr) {
775
- container.addChild(new Spacer(1));
776
- container.addChild(new Text(theme.fg("dim", usageStr), 0, 0));
777
- }
778
- return container;
779
- }
780
- let text = `${icon} ${theme.fg("toolTitle", theme.bold(r.agent))}${theme.fg("muted", ` (${r.agentSource})`)}`;
781
- if (isError && r.stopReason)
782
- text += ` ${theme.fg("error", `[${r.stopReason}]`)}`;
646
+ lines.push(`${icon} ${r.agent} (${r.agentSource})${isError && r.stopReason ? ` [${r.stopReason}]` : ""}`);
783
647
  if (isError && r.errorMessage)
784
- text += `\n${theme.fg("error", `Error: ${r.errorMessage}`)}`;
785
- else if (displayItems.length === 0)
786
- text += `\n${theme.fg("muted", "(no output)")}`;
648
+ lines.push(`Error: ${r.errorMessage}`);
649
+ lines.push("");
650
+ lines.push("─── Task ───");
651
+ lines.push(r.task);
652
+ lines.push("");
653
+ lines.push("─── Output ───");
654
+ if (!finalOutput) {
655
+ lines.push("(no output)");
656
+ }
787
657
  else {
788
- text += `\n${renderDisplayItems(displayItems, COLLAPSED_ITEM_COUNT)}`;
789
- if (displayItems.length > COLLAPSED_ITEM_COUNT)
790
- text += `\n${theme.fg("muted", "(Ctrl+O to expand)")}`;
658
+ lines.push(finalOutput.trim());
791
659
  }
792
660
  const usageStr = formatUsageStats(r.usage, r.model);
793
- if (usageStr)
794
- text += `\n${theme.fg("dim", usageStr)}`;
795
- return new Text(text, 0, 0);
661
+ if (usageStr) {
662
+ lines.push("");
663
+ lines.push(usageStr);
664
+ }
665
+ return new Text(lines.join("\n"));
796
666
  }
797
667
  const aggregateUsage = (results) => {
798
- const total = {
799
- input: 0,
800
- output: 0,
801
- cacheRead: 0,
802
- cacheWrite: 0,
803
- cost: 0,
804
- turns: 0,
805
- };
668
+ const total = { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, cost: 0, turns: 0 };
806
669
  for (const r of results) {
807
670
  total.input += r.usage.input;
808
671
  total.output += r.usage.output;
@@ -815,137 +678,64 @@ export default function subagentExtension(pi) {
815
678
  };
816
679
  if (details.mode === "chain") {
817
680
  const successCount = details.results.filter((r) => r.exitCode === 0).length;
818
- const icon = successCount === details.results.length
819
- ? theme.fg("success", "✓")
820
- : theme.fg("error", "✗");
821
- if (expanded) {
822
- const container = new Container();
823
- container.addChild(new Text(icon +
824
- " " +
825
- theme.fg("toolTitle", theme.bold("chain ")) +
826
- theme.fg("accent", `${successCount}/${details.results.length} steps`), 0, 0));
827
- for (const r of details.results) {
828
- const rIcon = r.exitCode === 0
829
- ? theme.fg("success", "✓")
830
- : theme.fg("error", "✗");
831
- const displayItems = getDisplayItems(r.messages);
832
- const finalOutput = getFinalOutput(r.messages);
833
- container.addChild(new Spacer(1));
834
- container.addChild(new Text(`${theme.fg("muted", `─── Step ${r.step}: `) + theme.fg("accent", r.agent)} ${rIcon}`, 0, 0));
835
- container.addChild(new Text(theme.fg("muted", "Task: ") + theme.fg("dim", r.task), 0, 0));
836
- for (const item of displayItems) {
837
- if (item.type === "toolCall") {
838
- container.addChild(new Text(theme.fg("muted", "→ ") +
839
- formatToolCall(item.name, item.args, theme.fg.bind(theme)), 0, 0));
840
- }
841
- }
842
- if (finalOutput) {
843
- container.addChild(new Spacer(1));
844
- container.addChild(new Markdown(finalOutput.trim(), 0, 0, mdTheme));
845
- }
846
- const stepUsage = formatUsageStats(r.usage, r.model);
847
- if (stepUsage)
848
- container.addChild(new Text(theme.fg("dim", stepUsage), 0, 0));
849
- }
850
- const usageStr = formatUsageStats(aggregateUsage(details.results));
851
- if (usageStr) {
852
- container.addChild(new Spacer(1));
853
- container.addChild(new Text(theme.fg("dim", `Total: ${usageStr}`), 0, 0));
854
- }
855
- return container;
856
- }
857
- let text = icon +
858
- " " +
859
- theme.fg("toolTitle", theme.bold("chain ")) +
860
- theme.fg("accent", `${successCount}/${details.results.length} steps`);
681
+ const icon = successCount === details.results.length ? "✓" : "✗";
682
+ lines.push(`${icon} chain ${successCount}/${details.results.length} steps`);
861
683
  for (const r of details.results) {
862
- const rIcon = r.exitCode === 0
863
- ? theme.fg("success", "✓")
864
- : theme.fg("error", "✗");
865
- const displayItems = getDisplayItems(r.messages);
866
- text += `\n\n${theme.fg("muted", `─── Step ${r.step}: `)}${theme.fg("accent", r.agent)} ${rIcon}`;
867
- if (displayItems.length === 0)
868
- text += `\n${theme.fg("muted", "(no output)")}`;
684
+ const rIcon = r.exitCode === 0 ? "✓" : "✗";
685
+ const finalOutput = getFinalOutput(r.messages);
686
+ lines.push("");
687
+ lines.push(`─── Step ${r.step}: ${r.agent} ${rIcon}`);
688
+ lines.push(`Task: ${r.task}`);
689
+ if (finalOutput)
690
+ lines.push(finalOutput.trim());
869
691
  else
870
- text += `\n${renderDisplayItems(displayItems, 5)}`;
692
+ lines.push("(no output)");
693
+ const stepUsage = formatUsageStats(r.usage, r.model);
694
+ if (stepUsage)
695
+ lines.push(stepUsage);
871
696
  }
872
697
  const usageStr = formatUsageStats(aggregateUsage(details.results));
873
- if (usageStr)
874
- text += `\n\n${theme.fg("dim", `Total: ${usageStr}`)}`;
875
- text += `\n${theme.fg("muted", "(Ctrl+O to expand)")}`;
876
- return new Text(text, 0, 0);
698
+ if (usageStr) {
699
+ lines.push("");
700
+ lines.push(`Total: ${usageStr}`);
701
+ }
702
+ return new Text(lines.join("\n"));
877
703
  }
878
704
  if (details.mode === "parallel") {
879
705
  const running = details.results.filter((r) => r.exitCode === -1).length;
880
706
  const successCount = details.results.filter((r) => r.exitCode === 0).length;
881
707
  const failCount = details.results.filter((r) => r.exitCode > 0).length;
882
708
  const isRunning = running > 0;
883
- const icon = isRunning
884
- ? theme.fg("warning", "⏳")
885
- : failCount > 0
886
- ? theme.fg("warning", "◐")
887
- : theme.fg("success", "✓");
709
+ const icon = isRunning ? "⏳" : failCount > 0 ? "◐" : "✓";
888
710
  const status = isRunning
889
711
  ? `${successCount + failCount}/${details.results.length} done, ${running} running`
890
712
  : `${successCount}/${details.results.length} tasks`;
891
- if (expanded && !isRunning) {
892
- const container = new Container();
893
- container.addChild(new Text(`${icon} ${theme.fg("toolTitle", theme.bold("parallel "))}${theme.fg("accent", status)}`, 0, 0));
894
- for (const r of details.results) {
895
- const rIcon = r.exitCode === 0
896
- ? theme.fg("success", "✓")
897
- : theme.fg("error", "✗");
898
- const displayItems = getDisplayItems(r.messages);
899
- const finalOutput = getFinalOutput(r.messages);
900
- container.addChild(new Spacer(1));
901
- container.addChild(new Text(`${theme.fg("muted", "─── ") + theme.fg("accent", r.agent)} ${rIcon}`, 0, 0));
902
- container.addChild(new Text(theme.fg("muted", "Task: ") + theme.fg("dim", r.task), 0, 0));
903
- for (const item of displayItems) {
904
- if (item.type === "toolCall") {
905
- container.addChild(new Text(theme.fg("muted", "→ ") +
906
- formatToolCall(item.name, item.args, theme.fg.bind(theme)), 0, 0));
907
- }
908
- }
909
- if (finalOutput) {
910
- container.addChild(new Spacer(1));
911
- container.addChild(new Markdown(finalOutput.trim(), 0, 0, mdTheme));
912
- }
913
- const taskUsage = formatUsageStats(r.usage, r.model);
914
- if (taskUsage)
915
- container.addChild(new Text(theme.fg("dim", taskUsage), 0, 0));
916
- }
917
- const usageStr = formatUsageStats(aggregateUsage(details.results));
918
- if (usageStr) {
919
- container.addChild(new Spacer(1));
920
- container.addChild(new Text(theme.fg("dim", `Total: ${usageStr}`), 0, 0));
921
- }
922
- return container;
923
- }
924
- let text = `${icon} ${theme.fg("toolTitle", theme.bold("parallel "))}${theme.fg("accent", status)}`;
713
+ lines.push(`${icon} parallel ${status}`);
925
714
  for (const r of details.results) {
926
- const rIcon = r.exitCode === -1
927
- ? theme.fg("warning", "⏳")
928
- : r.exitCode === 0
929
- ? theme.fg("success", "✓")
930
- : theme.fg("error", "✗");
931
- const displayItems = getDisplayItems(r.messages);
932
- text += `\n\n${theme.fg("muted", "─── ")}${theme.fg("accent", r.agent)} ${rIcon}`;
933
- if (displayItems.length === 0)
934
- text += `\n${theme.fg("muted", r.exitCode === -1 ? "(running...)" : "(no output)")}`;
715
+ const rIcon = r.exitCode === -1 ? "⏳" : r.exitCode === 0 ? "✓" : "✗";
716
+ const finalOutput = getFinalOutput(r.messages);
717
+ lines.push("");
718
+ lines.push(`─── ${r.agent} ${rIcon}`);
719
+ lines.push(`Task: ${r.task}`);
720
+ if (finalOutput)
721
+ lines.push(finalOutput.trim());
935
722
  else
936
- text += `\n${renderDisplayItems(displayItems, 5)}`;
723
+ lines.push(r.exitCode === -1 ? "(running...)" : "(no output)");
724
+ const taskUsage = formatUsageStats(r.usage, r.model);
725
+ if (taskUsage)
726
+ lines.push(taskUsage);
937
727
  }
938
728
  if (!isRunning) {
939
729
  const usageStr = formatUsageStats(aggregateUsage(details.results));
940
- if (usageStr)
941
- text += `\n\n${theme.fg("dim", `Total: ${usageStr}`)}`;
730
+ if (usageStr) {
731
+ lines.push("");
732
+ lines.push(`Total: ${usageStr}`);
733
+ }
942
734
  }
943
- if (!expanded)
944
- text += `\n${theme.fg("muted", "(Ctrl+O to expand)")}`;
945
- return new Text(text, 0, 0);
735
+ return new Text(lines.join("\n"));
946
736
  }
947
737
  const text = result.content[0];
948
- return new Text(text?.type === "text" ? text.text : "(no output)", 0, 0);
738
+ return new Text(text?.type === "text" ? text.text : "(no output)");
949
739
  },
950
740
  });
951
741
  }