@aexol/spectral 0.7.0 → 0.7.1

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 (459) hide show
  1. package/dist/agent/index.js +76 -301
  2. package/dist/cli.js +11 -0
  3. package/dist/designer/data/systems/agentic/DESIGN.md +71 -0
  4. package/dist/designer/data/systems/agentic/components.html +154 -0
  5. package/dist/designer/data/systems/agentic/tokens.css +63 -0
  6. package/dist/designer/data/systems/airbnb/DESIGN.md +393 -0
  7. package/dist/designer/data/systems/airbnb/components.html +1373 -0
  8. package/dist/designer/data/systems/airbnb/tokens.css +261 -0
  9. package/dist/designer/data/systems/airtable/DESIGN.md +92 -0
  10. package/dist/designer/data/systems/airtable/components.html +489 -0
  11. package/dist/designer/data/systems/airtable/tokens.css +261 -0
  12. package/dist/designer/data/systems/ant/DESIGN.md +71 -0
  13. package/dist/designer/data/systems/ant/components.html +154 -0
  14. package/dist/designer/data/systems/ant/tokens.css +63 -0
  15. package/dist/designer/data/systems/apple/DESIGN.md +250 -0
  16. package/dist/designer/data/systems/apple/components.html +749 -0
  17. package/dist/designer/data/systems/apple/tokens.css +286 -0
  18. package/dist/designer/data/systems/application/DESIGN.md +71 -0
  19. package/dist/designer/data/systems/application/components.html +154 -0
  20. package/dist/designer/data/systems/application/tokens.css +63 -0
  21. package/dist/designer/data/systems/arc/DESIGN.md +152 -0
  22. package/dist/designer/data/systems/arc/components.html +432 -0
  23. package/dist/designer/data/systems/arc/tokens.css +137 -0
  24. package/dist/designer/data/systems/artistic/DESIGN.md +71 -0
  25. package/dist/designer/data/systems/artistic/components.html +136 -0
  26. package/dist/designer/data/systems/artistic/tokens.css +63 -0
  27. package/dist/designer/data/systems/atelier-zero/DESIGN.md +316 -0
  28. package/dist/designer/data/systems/atelier-zero/components.html +136 -0
  29. package/dist/designer/data/systems/atelier-zero/tokens.css +63 -0
  30. package/dist/designer/data/systems/bento/DESIGN.md +71 -0
  31. package/dist/designer/data/systems/bento/components.html +136 -0
  32. package/dist/designer/data/systems/bento/tokens.css +63 -0
  33. package/dist/designer/data/systems/binance/DESIGN.md +348 -0
  34. package/dist/designer/data/systems/binance/components.html +550 -0
  35. package/dist/designer/data/systems/binance/tokens.css +255 -0
  36. package/dist/designer/data/systems/bmw/DESIGN.md +183 -0
  37. package/dist/designer/data/systems/bmw/components.html +551 -0
  38. package/dist/designer/data/systems/bmw/tokens.css +179 -0
  39. package/dist/designer/data/systems/bmw-m/DESIGN.md +246 -0
  40. package/dist/designer/data/systems/bmw-m/components.html +342 -0
  41. package/dist/designer/data/systems/bmw-m/tokens.css +64 -0
  42. package/dist/designer/data/systems/bold/DESIGN.md +71 -0
  43. package/dist/designer/data/systems/bold/components.html +136 -0
  44. package/dist/designer/data/systems/bold/tokens.css +63 -0
  45. package/dist/designer/data/systems/brutalism/DESIGN.md +71 -0
  46. package/dist/designer/data/systems/brutalism/components.html +154 -0
  47. package/dist/designer/data/systems/brutalism/tokens.css +63 -0
  48. package/dist/designer/data/systems/bugatti/DESIGN.md +271 -0
  49. package/dist/designer/data/systems/bugatti/components.html +342 -0
  50. package/dist/designer/data/systems/bugatti/tokens.css +64 -0
  51. package/dist/designer/data/systems/cafe/DESIGN.md +71 -0
  52. package/dist/designer/data/systems/cafe/components.html +136 -0
  53. package/dist/designer/data/systems/cafe/tokens.css +63 -0
  54. package/dist/designer/data/systems/cal/DESIGN.md +262 -0
  55. package/dist/designer/data/systems/cal/components.html +376 -0
  56. package/dist/designer/data/systems/cal/tokens.css +265 -0
  57. package/dist/designer/data/systems/canva/DESIGN.md +157 -0
  58. package/dist/designer/data/systems/canva/components.html +461 -0
  59. package/dist/designer/data/systems/canva/tokens.css +147 -0
  60. package/dist/designer/data/systems/cisco/DESIGN.md +201 -0
  61. package/dist/designer/data/systems/cisco/components.html +342 -0
  62. package/dist/designer/data/systems/cisco/tokens.css +64 -0
  63. package/dist/designer/data/systems/claude/DESIGN.md +315 -0
  64. package/dist/designer/data/systems/claude/components.html +483 -0
  65. package/dist/designer/data/systems/claude/tokens.css +130 -0
  66. package/dist/designer/data/systems/clay/DESIGN.md +307 -0
  67. package/dist/designer/data/systems/clay/components.html +136 -0
  68. package/dist/designer/data/systems/clay/tokens.css +63 -0
  69. package/dist/designer/data/systems/claymorphism/DESIGN.md +71 -0
  70. package/dist/designer/data/systems/claymorphism/components.html +136 -0
  71. package/dist/designer/data/systems/claymorphism/tokens.css +63 -0
  72. package/dist/designer/data/systems/clean/DESIGN.md +71 -0
  73. package/dist/designer/data/systems/clean/components.html +136 -0
  74. package/dist/designer/data/systems/clean/tokens.css +63 -0
  75. package/dist/designer/data/systems/clickhouse/DESIGN.md +284 -0
  76. package/dist/designer/data/systems/clickhouse/components.html +506 -0
  77. package/dist/designer/data/systems/clickhouse/tokens.css +135 -0
  78. package/dist/designer/data/systems/cohere/DESIGN.md +269 -0
  79. package/dist/designer/data/systems/cohere/components.html +353 -0
  80. package/dist/designer/data/systems/cohere/tokens.css +126 -0
  81. package/dist/designer/data/systems/coinbase/DESIGN.md +132 -0
  82. package/dist/designer/data/systems/coinbase/components.html +501 -0
  83. package/dist/designer/data/systems/coinbase/tokens.css +257 -0
  84. package/dist/designer/data/systems/colorful/DESIGN.md +71 -0
  85. package/dist/designer/data/systems/colorful/components.html +136 -0
  86. package/dist/designer/data/systems/colorful/tokens.css +63 -0
  87. package/dist/designer/data/systems/composio/DESIGN.md +310 -0
  88. package/dist/designer/data/systems/composio/components.html +342 -0
  89. package/dist/designer/data/systems/composio/tokens.css +64 -0
  90. package/dist/designer/data/systems/contemporary/DESIGN.md +71 -0
  91. package/dist/designer/data/systems/contemporary/components.html +136 -0
  92. package/dist/designer/data/systems/contemporary/tokens.css +63 -0
  93. package/dist/designer/data/systems/corporate/DESIGN.md +71 -0
  94. package/dist/designer/data/systems/corporate/components.html +136 -0
  95. package/dist/designer/data/systems/corporate/tokens.css +63 -0
  96. package/dist/designer/data/systems/cosmic/DESIGN.md +71 -0
  97. package/dist/designer/data/systems/cosmic/components.html +136 -0
  98. package/dist/designer/data/systems/cosmic/tokens.css +63 -0
  99. package/dist/designer/data/systems/creative/DESIGN.md +71 -0
  100. package/dist/designer/data/systems/creative/components.html +136 -0
  101. package/dist/designer/data/systems/creative/tokens.css +63 -0
  102. package/dist/designer/data/systems/cursor/DESIGN.md +312 -0
  103. package/dist/designer/data/systems/cursor/components.html +654 -0
  104. package/dist/designer/data/systems/cursor/tokens.css +218 -0
  105. package/dist/designer/data/systems/dashboard/DESIGN.md +71 -0
  106. package/dist/designer/data/systems/dashboard/components.html +154 -0
  107. package/dist/designer/data/systems/dashboard/tokens.css +63 -0
  108. package/dist/designer/data/systems/default/DESIGN.md +62 -0
  109. package/dist/designer/data/systems/default/components.html +523 -0
  110. package/dist/designer/data/systems/default/tokens.css +200 -0
  111. package/dist/designer/data/systems/discord/DESIGN.md +162 -0
  112. package/dist/designer/data/systems/discord/components.html +359 -0
  113. package/dist/designer/data/systems/discord/tokens.css +125 -0
  114. package/dist/designer/data/systems/dithered/DESIGN.md +71 -0
  115. package/dist/designer/data/systems/dithered/components.html +136 -0
  116. package/dist/designer/data/systems/dithered/tokens.css +63 -0
  117. package/dist/designer/data/systems/doodle/DESIGN.md +71 -0
  118. package/dist/designer/data/systems/doodle/components.html +136 -0
  119. package/dist/designer/data/systems/doodle/tokens.css +63 -0
  120. package/dist/designer/data/systems/dramatic/DESIGN.md +71 -0
  121. package/dist/designer/data/systems/dramatic/components.html +136 -0
  122. package/dist/designer/data/systems/dramatic/tokens.css +63 -0
  123. package/dist/designer/data/systems/duolingo/DESIGN.md +154 -0
  124. package/dist/designer/data/systems/duolingo/components.html +532 -0
  125. package/dist/designer/data/systems/duolingo/tokens.css +130 -0
  126. package/dist/designer/data/systems/editorial/DESIGN.md +71 -0
  127. package/dist/designer/data/systems/editorial/components.html +154 -0
  128. package/dist/designer/data/systems/editorial/tokens.css +63 -0
  129. package/dist/designer/data/systems/elegant/DESIGN.md +71 -0
  130. package/dist/designer/data/systems/elegant/components.html +136 -0
  131. package/dist/designer/data/systems/elegant/tokens.css +63 -0
  132. package/dist/designer/data/systems/elevenlabs/DESIGN.md +268 -0
  133. package/dist/designer/data/systems/elevenlabs/components.html +342 -0
  134. package/dist/designer/data/systems/elevenlabs/tokens.css +127 -0
  135. package/dist/designer/data/systems/energetic/DESIGN.md +72 -0
  136. package/dist/designer/data/systems/energetic/components.html +136 -0
  137. package/dist/designer/data/systems/energetic/tokens.css +63 -0
  138. package/dist/designer/data/systems/enterprise/DESIGN.md +71 -0
  139. package/dist/designer/data/systems/enterprise/components.html +154 -0
  140. package/dist/designer/data/systems/enterprise/tokens.css +63 -0
  141. package/dist/designer/data/systems/expo/DESIGN.md +284 -0
  142. package/dist/designer/data/systems/expo/components.html +342 -0
  143. package/dist/designer/data/systems/expo/tokens.css +64 -0
  144. package/dist/designer/data/systems/expressive/DESIGN.md +71 -0
  145. package/dist/designer/data/systems/expressive/components.html +136 -0
  146. package/dist/designer/data/systems/expressive/tokens.css +63 -0
  147. package/dist/designer/data/systems/fantasy/DESIGN.md +71 -0
  148. package/dist/designer/data/systems/fantasy/components.html +136 -0
  149. package/dist/designer/data/systems/fantasy/tokens.css +63 -0
  150. package/dist/designer/data/systems/ferrari/DESIGN.md +317 -0
  151. package/dist/designer/data/systems/ferrari/components.html +342 -0
  152. package/dist/designer/data/systems/ferrari/tokens.css +64 -0
  153. package/dist/designer/data/systems/figma/DESIGN.md +223 -0
  154. package/dist/designer/data/systems/figma/components.html +344 -0
  155. package/dist/designer/data/systems/figma/tokens.css +126 -0
  156. package/dist/designer/data/systems/flat/DESIGN.md +71 -0
  157. package/dist/designer/data/systems/flat/components.html +136 -0
  158. package/dist/designer/data/systems/flat/tokens.css +63 -0
  159. package/dist/designer/data/systems/framer/DESIGN.md +249 -0
  160. package/dist/designer/data/systems/framer/components.html +438 -0
  161. package/dist/designer/data/systems/framer/tokens.css +238 -0
  162. package/dist/designer/data/systems/friendly/DESIGN.md +71 -0
  163. package/dist/designer/data/systems/friendly/components.html +136 -0
  164. package/dist/designer/data/systems/friendly/tokens.css +63 -0
  165. package/dist/designer/data/systems/futuristic/DESIGN.md +71 -0
  166. package/dist/designer/data/systems/futuristic/components.html +136 -0
  167. package/dist/designer/data/systems/futuristic/tokens.css +63 -0
  168. package/dist/designer/data/systems/github/DESIGN.md +155 -0
  169. package/dist/designer/data/systems/github/components.html +383 -0
  170. package/dist/designer/data/systems/github/tokens.css +125 -0
  171. package/dist/designer/data/systems/glassmorphism/DESIGN.md +71 -0
  172. package/dist/designer/data/systems/glassmorphism/components.html +154 -0
  173. package/dist/designer/data/systems/glassmorphism/tokens.css +63 -0
  174. package/dist/designer/data/systems/gradient/DESIGN.md +71 -0
  175. package/dist/designer/data/systems/gradient/components.html +154 -0
  176. package/dist/designer/data/systems/gradient/tokens.css +63 -0
  177. package/dist/designer/data/systems/hashicorp/DESIGN.md +281 -0
  178. package/dist/designer/data/systems/hashicorp/components.html +502 -0
  179. package/dist/designer/data/systems/hashicorp/tokens.css +272 -0
  180. package/dist/designer/data/systems/hud/DESIGN.md +173 -0
  181. package/dist/designer/data/systems/hud/components.html +136 -0
  182. package/dist/designer/data/systems/hud/tokens.css +63 -0
  183. package/dist/designer/data/systems/huggingface/DESIGN.md +149 -0
  184. package/dist/designer/data/systems/huggingface/components.html +346 -0
  185. package/dist/designer/data/systems/huggingface/tokens.css +125 -0
  186. package/dist/designer/data/systems/ibm/DESIGN.md +335 -0
  187. package/dist/designer/data/systems/ibm/components.html +342 -0
  188. package/dist/designer/data/systems/ibm/tokens.css +64 -0
  189. package/dist/designer/data/systems/intercom/DESIGN.md +149 -0
  190. package/dist/designer/data/systems/intercom/components.html +557 -0
  191. package/dist/designer/data/systems/intercom/tokens.css +150 -0
  192. package/dist/designer/data/systems/kami/DESIGN.md +410 -0
  193. package/dist/designer/data/systems/kami/components.html +601 -0
  194. package/dist/designer/data/systems/kami/tokens.css +272 -0
  195. package/dist/designer/data/systems/kraken/DESIGN.md +128 -0
  196. package/dist/designer/data/systems/kraken/components.html +342 -0
  197. package/dist/designer/data/systems/kraken/tokens.css +64 -0
  198. package/dist/designer/data/systems/lamborghini/DESIGN.md +291 -0
  199. package/dist/designer/data/systems/lamborghini/components.html +342 -0
  200. package/dist/designer/data/systems/lamborghini/tokens.css +64 -0
  201. package/dist/designer/data/systems/levels/DESIGN.md +71 -0
  202. package/dist/designer/data/systems/levels/components.html +154 -0
  203. package/dist/designer/data/systems/levels/tokens.css +63 -0
  204. package/dist/designer/data/systems/linear-app/DESIGN.md +370 -0
  205. package/dist/designer/data/systems/linear-app/components.html +370 -0
  206. package/dist/designer/data/systems/linear-app/tokens.css +130 -0
  207. package/dist/designer/data/systems/lingo/DESIGN.md +71 -0
  208. package/dist/designer/data/systems/lingo/components.html +154 -0
  209. package/dist/designer/data/systems/lingo/tokens.css +63 -0
  210. package/dist/designer/data/systems/loom/DESIGN.md +201 -0
  211. package/dist/designer/data/systems/loom/components.html +446 -0
  212. package/dist/designer/data/systems/loom/tokens.css +138 -0
  213. package/dist/designer/data/systems/lovable/DESIGN.md +301 -0
  214. package/dist/designer/data/systems/lovable/components.html +441 -0
  215. package/dist/designer/data/systems/lovable/tokens.css +258 -0
  216. package/dist/designer/data/systems/luxury/DESIGN.md +71 -0
  217. package/dist/designer/data/systems/luxury/components.html +154 -0
  218. package/dist/designer/data/systems/luxury/tokens.css +63 -0
  219. package/dist/designer/data/systems/mastercard/DESIGN.md +368 -0
  220. package/dist/designer/data/systems/mastercard/components.html +342 -0
  221. package/dist/designer/data/systems/mastercard/tokens.css +64 -0
  222. package/dist/designer/data/systems/material/DESIGN.md +71 -0
  223. package/dist/designer/data/systems/material/components.html +154 -0
  224. package/dist/designer/data/systems/material/tokens.css +63 -0
  225. package/dist/designer/data/systems/meta/DESIGN.md +369 -0
  226. package/dist/designer/data/systems/meta/components.html +398 -0
  227. package/dist/designer/data/systems/meta/tokens.css +263 -0
  228. package/dist/designer/data/systems/minimal/DESIGN.md +71 -0
  229. package/dist/designer/data/systems/minimal/components.html +154 -0
  230. package/dist/designer/data/systems/minimal/tokens.css +63 -0
  231. package/dist/designer/data/systems/minimax/DESIGN.md +260 -0
  232. package/dist/designer/data/systems/minimax/components.html +590 -0
  233. package/dist/designer/data/systems/minimax/tokens.css +148 -0
  234. package/dist/designer/data/systems/mintlify/DESIGN.md +329 -0
  235. package/dist/designer/data/systems/mintlify/components.html +737 -0
  236. package/dist/designer/data/systems/mintlify/tokens.css +256 -0
  237. package/dist/designer/data/systems/miro/DESIGN.md +111 -0
  238. package/dist/designer/data/systems/miro/components.html +342 -0
  239. package/dist/designer/data/systems/miro/tokens.css +64 -0
  240. package/dist/designer/data/systems/mission-control/DESIGN.md +474 -0
  241. package/dist/designer/data/systems/mission-control/components.html +136 -0
  242. package/dist/designer/data/systems/mission-control/tokens.css +63 -0
  243. package/dist/designer/data/systems/mistral-ai/DESIGN.md +264 -0
  244. package/dist/designer/data/systems/mistral-ai/components.html +338 -0
  245. package/dist/designer/data/systems/mistral-ai/tokens.css +125 -0
  246. package/dist/designer/data/systems/modern/DESIGN.md +71 -0
  247. package/dist/designer/data/systems/modern/components.html +154 -0
  248. package/dist/designer/data/systems/modern/tokens.css +63 -0
  249. package/dist/designer/data/systems/mongodb/DESIGN.md +269 -0
  250. package/dist/designer/data/systems/mongodb/components.html +462 -0
  251. package/dist/designer/data/systems/mongodb/tokens.css +176 -0
  252. package/dist/designer/data/systems/mono/DESIGN.md +71 -0
  253. package/dist/designer/data/systems/mono/components.html +136 -0
  254. package/dist/designer/data/systems/mono/tokens.css +63 -0
  255. package/dist/designer/data/systems/neobrutalism/DESIGN.md +71 -0
  256. package/dist/designer/data/systems/neobrutalism/components.html +136 -0
  257. package/dist/designer/data/systems/neobrutalism/tokens.css +63 -0
  258. package/dist/designer/data/systems/neon/DESIGN.md +71 -0
  259. package/dist/designer/data/systems/neon/components.html +136 -0
  260. package/dist/designer/data/systems/neon/tokens.css +63 -0
  261. package/dist/designer/data/systems/neumorphism/DESIGN.md +71 -0
  262. package/dist/designer/data/systems/neumorphism/components.html +136 -0
  263. package/dist/designer/data/systems/neumorphism/tokens.css +63 -0
  264. package/dist/designer/data/systems/nike/DESIGN.md +366 -0
  265. package/dist/designer/data/systems/nike/components.html +512 -0
  266. package/dist/designer/data/systems/nike/tokens.css +304 -0
  267. package/dist/designer/data/systems/notion/DESIGN.md +312 -0
  268. package/dist/designer/data/systems/notion/components.html +413 -0
  269. package/dist/designer/data/systems/notion/tokens.css +130 -0
  270. package/dist/designer/data/systems/nvidia/DESIGN.md +296 -0
  271. package/dist/designer/data/systems/nvidia/components.html +414 -0
  272. package/dist/designer/data/systems/nvidia/tokens.css +133 -0
  273. package/dist/designer/data/systems/ollama/DESIGN.md +270 -0
  274. package/dist/designer/data/systems/ollama/components.html +700 -0
  275. package/dist/designer/data/systems/ollama/tokens.css +242 -0
  276. package/dist/designer/data/systems/openai/DESIGN.md +140 -0
  277. package/dist/designer/data/systems/openai/components.html +382 -0
  278. package/dist/designer/data/systems/openai/tokens.css +133 -0
  279. package/dist/designer/data/systems/opencode-ai/DESIGN.md +284 -0
  280. package/dist/designer/data/systems/opencode-ai/components.html +389 -0
  281. package/dist/designer/data/systems/opencode-ai/tokens.css +126 -0
  282. package/dist/designer/data/systems/pacman/DESIGN.md +71 -0
  283. package/dist/designer/data/systems/pacman/components.html +342 -0
  284. package/dist/designer/data/systems/pacman/tokens.css +64 -0
  285. package/dist/designer/data/systems/paper/DESIGN.md +71 -0
  286. package/dist/designer/data/systems/paper/components.html +136 -0
  287. package/dist/designer/data/systems/paper/tokens.css +63 -0
  288. package/dist/designer/data/systems/perplexity/DESIGN.md +286 -0
  289. package/dist/designer/data/systems/perplexity/components.html +455 -0
  290. package/dist/designer/data/systems/perplexity/tokens.css +151 -0
  291. package/dist/designer/data/systems/perspective/DESIGN.md +71 -0
  292. package/dist/designer/data/systems/perspective/components.html +136 -0
  293. package/dist/designer/data/systems/perspective/tokens.css +63 -0
  294. package/dist/designer/data/systems/pinterest/DESIGN.md +233 -0
  295. package/dist/designer/data/systems/pinterest/components.html +865 -0
  296. package/dist/designer/data/systems/pinterest/tokens.css +262 -0
  297. package/dist/designer/data/systems/playstation/DESIGN.md +367 -0
  298. package/dist/designer/data/systems/playstation/components.html +414 -0
  299. package/dist/designer/data/systems/playstation/tokens.css +150 -0
  300. package/dist/designer/data/systems/posthog/DESIGN.md +259 -0
  301. package/dist/designer/data/systems/posthog/components.html +827 -0
  302. package/dist/designer/data/systems/posthog/tokens.css +272 -0
  303. package/dist/designer/data/systems/premium/DESIGN.md +71 -0
  304. package/dist/designer/data/systems/premium/components.html +154 -0
  305. package/dist/designer/data/systems/premium/tokens.css +63 -0
  306. package/dist/designer/data/systems/professional/DESIGN.md +71 -0
  307. package/dist/designer/data/systems/professional/components.html +136 -0
  308. package/dist/designer/data/systems/professional/tokens.css +63 -0
  309. package/dist/designer/data/systems/publication/DESIGN.md +71 -0
  310. package/dist/designer/data/systems/publication/components.html +154 -0
  311. package/dist/designer/data/systems/publication/tokens.css +63 -0
  312. package/dist/designer/data/systems/raycast/DESIGN.md +271 -0
  313. package/dist/designer/data/systems/raycast/components.html +507 -0
  314. package/dist/designer/data/systems/raycast/tokens.css +143 -0
  315. package/dist/designer/data/systems/refined/DESIGN.md +71 -0
  316. package/dist/designer/data/systems/refined/components.html +136 -0
  317. package/dist/designer/data/systems/refined/tokens.css +63 -0
  318. package/dist/designer/data/systems/renault/DESIGN.md +314 -0
  319. package/dist/designer/data/systems/renault/components.html +154 -0
  320. package/dist/designer/data/systems/renault/tokens.css +63 -0
  321. package/dist/designer/data/systems/replicate/DESIGN.md +264 -0
  322. package/dist/designer/data/systems/replicate/components.html +340 -0
  323. package/dist/designer/data/systems/replicate/tokens.css +125 -0
  324. package/dist/designer/data/systems/resend/DESIGN.md +306 -0
  325. package/dist/designer/data/systems/resend/components.html +839 -0
  326. package/dist/designer/data/systems/resend/tokens.css +353 -0
  327. package/dist/designer/data/systems/retro/DESIGN.md +71 -0
  328. package/dist/designer/data/systems/retro/components.html +136 -0
  329. package/dist/designer/data/systems/retro/tokens.css +63 -0
  330. package/dist/designer/data/systems/revolut/DESIGN.md +188 -0
  331. package/dist/designer/data/systems/revolut/components.html +342 -0
  332. package/dist/designer/data/systems/revolut/tokens.css +64 -0
  333. package/dist/designer/data/systems/runwayml/DESIGN.md +247 -0
  334. package/dist/designer/data/systems/runwayml/components.html +638 -0
  335. package/dist/designer/data/systems/runwayml/tokens.css +204 -0
  336. package/dist/designer/data/systems/sanity/DESIGN.md +360 -0
  337. package/dist/designer/data/systems/sanity/components.html +342 -0
  338. package/dist/designer/data/systems/sanity/tokens.css +64 -0
  339. package/dist/designer/data/systems/sentry/DESIGN.md +265 -0
  340. package/dist/designer/data/systems/sentry/components.html +387 -0
  341. package/dist/designer/data/systems/sentry/tokens.css +219 -0
  342. package/dist/designer/data/systems/shadcn/DESIGN.md +71 -0
  343. package/dist/designer/data/systems/shadcn/components.html +732 -0
  344. package/dist/designer/data/systems/shadcn/tokens.css +255 -0
  345. package/dist/designer/data/systems/shopify/DESIGN.md +353 -0
  346. package/dist/designer/data/systems/shopify/components.html +342 -0
  347. package/dist/designer/data/systems/shopify/tokens.css +141 -0
  348. package/dist/designer/data/systems/simple/DESIGN.md +71 -0
  349. package/dist/designer/data/systems/simple/components.html +136 -0
  350. package/dist/designer/data/systems/simple/tokens.css +63 -0
  351. package/dist/designer/data/systems/skeumorphism/DESIGN.md +71 -0
  352. package/dist/designer/data/systems/skeumorphism/components.html +136 -0
  353. package/dist/designer/data/systems/skeumorphism/tokens.css +63 -0
  354. package/dist/designer/data/systems/slack/DESIGN.md +363 -0
  355. package/dist/designer/data/systems/slack/components.html +387 -0
  356. package/dist/designer/data/systems/slack/tokens.css +127 -0
  357. package/dist/designer/data/systems/sleek/DESIGN.md +71 -0
  358. package/dist/designer/data/systems/sleek/components.html +136 -0
  359. package/dist/designer/data/systems/sleek/tokens.css +63 -0
  360. package/dist/designer/data/systems/spacex/DESIGN.md +197 -0
  361. package/dist/designer/data/systems/spacex/components.html +496 -0
  362. package/dist/designer/data/systems/spacex/tokens.css +154 -0
  363. package/dist/designer/data/systems/spacious/DESIGN.md +71 -0
  364. package/dist/designer/data/systems/spacious/components.html +136 -0
  365. package/dist/designer/data/systems/spacious/tokens.css +63 -0
  366. package/dist/designer/data/systems/spotify/DESIGN.md +249 -0
  367. package/dist/designer/data/systems/spotify/components.html +365 -0
  368. package/dist/designer/data/systems/spotify/tokens.css +127 -0
  369. package/dist/designer/data/systems/starbucks/DESIGN.md +583 -0
  370. package/dist/designer/data/systems/starbucks/components.html +493 -0
  371. package/dist/designer/data/systems/starbucks/tokens.css +182 -0
  372. package/dist/designer/data/systems/storytelling/DESIGN.md +71 -0
  373. package/dist/designer/data/systems/storytelling/components.html +136 -0
  374. package/dist/designer/data/systems/storytelling/tokens.css +63 -0
  375. package/dist/designer/data/systems/stripe/DESIGN.md +325 -0
  376. package/dist/designer/data/systems/stripe/components.html +1018 -0
  377. package/dist/designer/data/systems/stripe/tokens.css +295 -0
  378. package/dist/designer/data/systems/supabase/DESIGN.md +258 -0
  379. package/dist/designer/data/systems/supabase/components.html +741 -0
  380. package/dist/designer/data/systems/supabase/tokens.css +294 -0
  381. package/dist/designer/data/systems/superhuman/DESIGN.md +255 -0
  382. package/dist/designer/data/systems/superhuman/components.html +537 -0
  383. package/dist/designer/data/systems/superhuman/tokens.css +160 -0
  384. package/dist/designer/data/systems/tesla/DESIGN.md +289 -0
  385. package/dist/designer/data/systems/tesla/components.html +724 -0
  386. package/dist/designer/data/systems/tesla/tokens.css +285 -0
  387. package/dist/designer/data/systems/tetris/DESIGN.md +71 -0
  388. package/dist/designer/data/systems/tetris/components.html +342 -0
  389. package/dist/designer/data/systems/tetris/tokens.css +64 -0
  390. package/dist/designer/data/systems/theverge/DESIGN.md +342 -0
  391. package/dist/designer/data/systems/theverge/components.html +342 -0
  392. package/dist/designer/data/systems/theverge/tokens.css +64 -0
  393. package/dist/designer/data/systems/together-ai/DESIGN.md +266 -0
  394. package/dist/designer/data/systems/together-ai/components.html +422 -0
  395. package/dist/designer/data/systems/together-ai/tokens.css +127 -0
  396. package/dist/designer/data/systems/totality-festival/DESIGN.md +206 -0
  397. package/dist/designer/data/systems/totality-festival/components.html +136 -0
  398. package/dist/designer/data/systems/totality-festival/tokens.css +63 -0
  399. package/dist/designer/data/systems/trading-terminal/DESIGN.md +178 -0
  400. package/dist/designer/data/systems/trading-terminal/components.html +154 -0
  401. package/dist/designer/data/systems/trading-terminal/tokens.css +63 -0
  402. package/dist/designer/data/systems/uber/DESIGN.md +298 -0
  403. package/dist/designer/data/systems/uber/components.html +347 -0
  404. package/dist/designer/data/systems/uber/tokens.css +131 -0
  405. package/dist/designer/data/systems/urdu/DESIGN.md +1002 -0
  406. package/dist/designer/data/systems/urdu/components.html +136 -0
  407. package/dist/designer/data/systems/urdu/tokens.css +63 -0
  408. package/dist/designer/data/systems/vercel/DESIGN.md +313 -0
  409. package/dist/designer/data/systems/vercel/components.html +839 -0
  410. package/dist/designer/data/systems/vercel/tokens.css +270 -0
  411. package/dist/designer/data/systems/vibrant/DESIGN.md +71 -0
  412. package/dist/designer/data/systems/vibrant/components.html +136 -0
  413. package/dist/designer/data/systems/vibrant/tokens.css +63 -0
  414. package/dist/designer/data/systems/vintage/DESIGN.md +71 -0
  415. package/dist/designer/data/systems/vintage/components.html +136 -0
  416. package/dist/designer/data/systems/vintage/tokens.css +63 -0
  417. package/dist/designer/data/systems/vodafone/DESIGN.md +426 -0
  418. package/dist/designer/data/systems/vodafone/components.html +342 -0
  419. package/dist/designer/data/systems/vodafone/tokens.css +64 -0
  420. package/dist/designer/data/systems/voltagent/DESIGN.md +326 -0
  421. package/dist/designer/data/systems/voltagent/components.html +154 -0
  422. package/dist/designer/data/systems/voltagent/tokens.css +63 -0
  423. package/dist/designer/data/systems/warm-editorial/DESIGN.md +65 -0
  424. package/dist/designer/data/systems/warm-editorial/components.html +136 -0
  425. package/dist/designer/data/systems/warm-editorial/tokens.css +63 -0
  426. package/dist/designer/data/systems/warp/DESIGN.md +256 -0
  427. package/dist/designer/data/systems/warp/components.html +411 -0
  428. package/dist/designer/data/systems/warp/tokens.css +156 -0
  429. package/dist/designer/data/systems/webex/DESIGN.md +207 -0
  430. package/dist/designer/data/systems/webex/components.html +342 -0
  431. package/dist/designer/data/systems/webex/tokens.css +64 -0
  432. package/dist/designer/data/systems/webflow/DESIGN.md +95 -0
  433. package/dist/designer/data/systems/webflow/components.html +413 -0
  434. package/dist/designer/data/systems/webflow/tokens.css +191 -0
  435. package/dist/designer/data/systems/wechat/DESIGN.md +302 -0
  436. package/dist/designer/data/systems/wechat/components.html +507 -0
  437. package/dist/designer/data/systems/wechat/tokens.css +176 -0
  438. package/dist/designer/data/systems/wired/DESIGN.md +281 -0
  439. package/dist/designer/data/systems/wired/components.html +342 -0
  440. package/dist/designer/data/systems/wired/tokens.css +64 -0
  441. package/dist/designer/data/systems/wise/DESIGN.md +176 -0
  442. package/dist/designer/data/systems/wise/components.html +365 -0
  443. package/dist/designer/data/systems/wise/tokens.css +141 -0
  444. package/dist/designer/data/systems/x-ai/DESIGN.md +260 -0
  445. package/dist/designer/data/systems/x-ai/components.html +460 -0
  446. package/dist/designer/data/systems/x-ai/tokens.css +268 -0
  447. package/dist/designer/data/systems/xiaohongshu/DESIGN.md +402 -0
  448. package/dist/designer/data/systems/xiaohongshu/components.html +865 -0
  449. package/dist/designer/data/systems/xiaohongshu/tokens.css +193 -0
  450. package/dist/designer/data/systems/zapier/DESIGN.md +331 -0
  451. package/dist/designer/data/systems/zapier/components.html +342 -0
  452. package/dist/designer/data/systems/zapier/tokens.css +64 -0
  453. package/dist/designer/guidelines.js +176 -0
  454. package/dist/designer/index.js +236 -0
  455. package/dist/designer/skills.js +1675 -0
  456. package/dist/designer/systems.js +216 -0
  457. package/dist/server/pi-bridge.js +155 -5
  458. package/dist/server/session-stream.js +45 -1
  459. package/package.json +1 -1
@@ -0,0 +1,216 @@
1
+ /**
2
+ * Design System Registry — 150+ Curated Systems from Open Design
3
+ *
4
+ * Design systems are stored as DESIGN.md + tokens.css files under
5
+ * data/systems/<name>/. At import time, we scan the directory and
6
+ * parse each system's metadata (name, category, description) from
7
+ * the DESIGN.md frontmatter. Full content is lazily loaded on first
8
+ * access and cached.
9
+ *
10
+ * The tool interface remains the same as the original systems.ts:
11
+ * findSystem(name) → DesignSystem | undefined
12
+ * formatSystemForLLM(system) → string
13
+ * listSystemsForLLM() → string
14
+ */
15
+ import { existsSync, readdirSync, readFileSync } from "node:fs";
16
+ import { dirname, resolve } from "node:path";
17
+ import { fileURLToPath } from "node:url";
18
+ const __dirname = dirname(fileURLToPath(import.meta.url));
19
+ // ---------------------------------------------------------------------------
20
+ // Discovery — build the registry from data/systems/
21
+ // ---------------------------------------------------------------------------
22
+ /** The directory containing design system data. We try multiple paths to
23
+ * handle both dev (src/) and production (dist/) layouts. */
24
+ function discoverDataDir() {
25
+ // Production: __dirname is dist/designer/, data is dist/designer/data/systems/
26
+ const prodPath = resolve(__dirname, "data", "systems");
27
+ if (existsSync(prodPath))
28
+ return prodPath;
29
+ // Both dev (src/designer/) and production (dist/designer/) layouts resolve the same way
30
+ return prodPath;
31
+ }
32
+ function parseCategory(line) {
33
+ const m = /Category:\s*(.+)/i.exec(line);
34
+ return m ? m[1].trim() : "Uncategorised";
35
+ }
36
+ function parseName(h1) {
37
+ return h1
38
+ .replace(/^#\s*Design System Inspired by\s*/i, "")
39
+ .replace(/^#\s*/i, "")
40
+ .trim();
41
+ }
42
+ function parseDescription(lines) {
43
+ // Take the first non-empty, non-heading, non-bracket line after the header
44
+ for (const line of lines) {
45
+ const trimmed = line.trim();
46
+ if (!trimmed || trimmed.startsWith("#") || trimmed.startsWith(">"))
47
+ continue;
48
+ // Take up to 120 chars for the description
49
+ return trimmed.length > 120 ? trimmed.slice(0, 117) + "..." : trimmed;
50
+ }
51
+ return "Design system from the Open Design registry.";
52
+ }
53
+ function buildRegistry() {
54
+ const map = new Map();
55
+ const baseDir = discoverDataDir();
56
+ if (!existsSync(baseDir)) {
57
+ process.stderr.write(`[designer] Design system data directory not found at ${baseDir}\n`);
58
+ return map;
59
+ }
60
+ let entries;
61
+ try {
62
+ entries = readdirSync(baseDir, { withFileTypes: true })
63
+ .filter((d) => d.isDirectory())
64
+ .map((d) => d.name);
65
+ }
66
+ catch {
67
+ process.stderr.write(`[designer] Cannot read design system directory ${baseDir}\n`);
68
+ return map;
69
+ }
70
+ for (const name of entries) {
71
+ const dir = resolve(baseDir, name);
72
+ const mdPath = resolve(dir, "DESIGN.md");
73
+ const cssPath = resolve(dir, "tokens.css");
74
+ if (!existsSync(mdPath))
75
+ continue;
76
+ let designMd;
77
+ try {
78
+ designMd = readFileSync(mdPath, "utf-8");
79
+ }
80
+ catch {
81
+ continue;
82
+ }
83
+ const mdLines = designMd.split("\n");
84
+ // Extract metadata from the first heading lines
85
+ let h1Line = "";
86
+ let categoryLine = "";
87
+ const bodyLines = [];
88
+ for (const line of mdLines) {
89
+ const t = line.trim();
90
+ if (!h1Line && t.startsWith("# "))
91
+ h1Line = t;
92
+ else if (!categoryLine && t.startsWith("> Category:"))
93
+ categoryLine = t;
94
+ else
95
+ bodyLines.push(line);
96
+ }
97
+ const parsedName = parseName(h1Line || `# ${name}`);
98
+ const category = parseCategory(categoryLine);
99
+ const description = parseDescription(bodyLines);
100
+ let tokensCss = "";
101
+ if (existsSync(cssPath)) {
102
+ try {
103
+ tokensCss = readFileSync(cssPath, "utf-8");
104
+ }
105
+ catch {
106
+ // tokens optional
107
+ }
108
+ }
109
+ let componentsHtml = "";
110
+ const compPath = resolve(dir, "components.html");
111
+ if (existsSync(compPath)) {
112
+ try {
113
+ componentsHtml = readFileSync(compPath, "utf-8");
114
+ }
115
+ catch {
116
+ // components optional
117
+ }
118
+ }
119
+ map.set(parsedName.toLowerCase(), {
120
+ name: parsedName,
121
+ category,
122
+ description,
123
+ designMd,
124
+ tokensCss,
125
+ componentsHtml,
126
+ });
127
+ }
128
+ return map;
129
+ }
130
+ // ---------------------------------------------------------------------------
131
+ // Registry singleton
132
+ // ---------------------------------------------------------------------------
133
+ let _registry = null;
134
+ function registry() {
135
+ if (!_registry)
136
+ _registry = buildRegistry();
137
+ return _registry;
138
+ }
139
+ // ---------------------------------------------------------------------------
140
+ // Lookup
141
+ // ---------------------------------------------------------------------------
142
+ export function findSystem(name) {
143
+ const lower = name.toLowerCase().trim();
144
+ const reg = registry();
145
+ // Exact match
146
+ if (reg.has(lower))
147
+ return reg.get(lower);
148
+ // Prefix / fuzzy match
149
+ for (const [key, sys] of reg) {
150
+ if (key.startsWith(lower) || key.includes(lower))
151
+ return sys;
152
+ }
153
+ return undefined;
154
+ }
155
+ // ---------------------------------------------------------------------------
156
+ // LLM formatters
157
+ // ---------------------------------------------------------------------------
158
+ /**
159
+ * Format a single design system for the LLM.
160
+ * Concatenates the DESIGN.md and tokens.css for a complete picture.
161
+ */
162
+ export function formatSystemForLLM(system) {
163
+ const parts = [system.designMd];
164
+ if (system.tokensCss) {
165
+ parts.push("\n---\n## CSS Custom Properties (tokens.css)\n");
166
+ parts.push("```css");
167
+ parts.push(system.tokensCss);
168
+ parts.push("```");
169
+ }
170
+ if (system.componentsHtml) {
171
+ parts.push("\n---\n## Component Examples (components.html)\n");
172
+ parts.push(system.componentsHtml);
173
+ }
174
+ parts.push("\n---\n", "## How to Use This System\n", "1. Copy the `:root { ... }` block from tokens.css into your `<style>` block.", "2. Reference tokens as `var(--bg)`, `var(--fg)`, `var(--accent)`, `var(--font-body)`, etc.", "3. Follow the component styling guidelines from the DESIGN.md sections.", "4. Use the component examples as concrete starting points — adapt colors and fonts to the active design system.", "5. Apply typography rules: font families, sizes, and line-heights from the tokens.");
175
+ return parts.join("\n");
176
+ }
177
+ /**
178
+ * List all available design systems as a compact markdown table for the LLM.
179
+ */
180
+ export function listSystemsForLLM() {
181
+ const reg = registry();
182
+ const all = [...reg.values()];
183
+ // Group by category
184
+ const byCategory = new Map();
185
+ for (const sys of all) {
186
+ const cat = sys.category;
187
+ if (!byCategory.has(cat))
188
+ byCategory.set(cat, []);
189
+ byCategory.get(cat).push(sys);
190
+ }
191
+ const lines = [
192
+ `# Available Design Systems (${all.length} total)`,
193
+ "",
194
+ "Grouped by category. Use `designer_get_system` with the system **name** to load full tokens and guidelines.",
195
+ "",
196
+ ];
197
+ for (const [category, systems] of [...byCategory].sort((a, b) => a[0].localeCompare(b[0]))) {
198
+ systems.sort((a, b) => a.name.localeCompare(b.name));
199
+ lines.push(`## ${category}`);
200
+ lines.push("");
201
+ for (const s of systems) {
202
+ lines.push(`- **${s.name}** — ${s.description}`);
203
+ }
204
+ lines.push("");
205
+ }
206
+ // Quick-select list at the end
207
+ lines.push("---");
208
+ lines.push("");
209
+ lines.push("Quick reference (all system names, one per line):");
210
+ lines.push("");
211
+ const sorted = [...all].sort((a, b) => a.name.localeCompare(b.name));
212
+ for (const s of sorted) {
213
+ lines.push(`- ${s.name}`);
214
+ }
215
+ return lines.join("\n");
216
+ }
@@ -51,10 +51,12 @@
51
51
  import { createJiti } from "@mariozechner/jiti";
52
52
  import { AuthStorage, createAgentSession, DefaultResourceLoader, ModelRegistry, SessionManager, } from "@mariozechner/pi-coding-agent";
53
53
  import { randomUUID } from "node:crypto";
54
- import { existsSync } from "node:fs";
55
- import { dirname, resolve } from "node:path";
54
+ import { existsSync, statSync } from "node:fs";
55
+ import { dirname, join, resolve } from "node:path";
56
56
  import { fileURLToPath } from "node:url";
57
57
  import aexolMcpExtension from "../extensions/aexol-mcp.js";
58
+ import subagentExt from "../agent/index.js";
59
+ import designerExtension from "../designer/index.js";
58
60
  import observationalMemory from "../memory/index.js";
59
61
  import { Runtime } from "../memory/runtime.js";
60
62
  import { OBSERVATIONAL_MEMORY_CONTEXT_CUSTOM_TYPE, OBSERVATIONAL_MEMORY_SNAPSHOT_CUSTOM_TYPE, } from "../memory/types.js";
@@ -73,6 +75,37 @@ import { fetchAllowedModels as defaultFetchAllowedModels, } from "../relay/model
73
75
  const SPECTRAL_PROXY_ANTHROPIC = "spectral-proxy-anthropic";
74
76
  const SPECTRAL_PROXY_OPENAI = "spectral-proxy-openai";
75
77
  const SPECTRAL_PROXY_USER_MODEL = "spectral-proxy-user-model";
78
+ /**
79
+ * Walk ancestor directories from `cwd` up to the filesystem root, collecting
80
+ * any existing skill directories at the given relative paths (e.g.
81
+ * `.opencode/skills` or `.aexol/skills`).
82
+ *
83
+ * Directories are returned in order from the deepest ancestor to `cwd` so
84
+ * project-local skills override ancestor-level ones when there are name
85
+ * collisions (pi's skill loader keeps the first found).
86
+ */
87
+ function collectAncestorSkillDirs(cwd, relativePaths) {
88
+ const found = [];
89
+ let dir = resolve(cwd);
90
+ while (true) {
91
+ for (const rel of relativePaths) {
92
+ const candidate = join(dir, rel);
93
+ try {
94
+ if (existsSync(candidate) && statSync(candidate).isDirectory()) {
95
+ found.push(candidate);
96
+ }
97
+ }
98
+ catch {
99
+ // skip permission errors etc.
100
+ }
101
+ }
102
+ const parent = dirname(dir);
103
+ if (parent === dir)
104
+ break;
105
+ dir = parent;
106
+ }
107
+ return found;
108
+ }
76
109
  /**
77
110
  * Concatenate text from an `AssistantMessage.content` array. Returns the
78
111
  * empty string when no text blocks are present (tool-only turns) or when
@@ -356,7 +389,7 @@ export class PiBridge {
356
389
  async start() {
357
390
  if (this.disposed)
358
391
  throw new Error("PiBridge already disposed");
359
- const extensionFactories = [aexolMcpExtension, async (pi) => { observationalMemory(pi); }];
392
+ const extensionFactories = [aexolMcpExtension, async (pi) => { subagentExt(pi); }, async (pi) => { designerExtension(pi); }, async (pi) => { observationalMemory(pi); }];
360
393
  // Load pi-mcp-adapter via jiti so tsc never crawls its .ts files in
361
394
  // node_modules. The static `import` was causing tsc to type-check
362
395
  // pi-mcp-adapter's source and fail the build on its type errors.
@@ -380,15 +413,22 @@ export class PiBridge {
380
413
  // ResourceLoader with extensions wired in via factories.
381
414
  // Each factory's signature `(pi: ExtensionAPI) => Promise<void>` matches
382
415
  // the ExtensionFactory type exactly, so we can pass them directly.
416
+ //
417
+ // Skill discovery: pi's defaults scan ~/.pi/agent/skills/ (user),
418
+ // .pi/skills/ (project via CONFIG_DIR_NAME), and .agents/skills/
419
+ // (ancestor-walked). We additionally walk ancestors for
420
+ // .opencode/skills and .aexol/skills so OpenCode/Codex/Aexol skills
421
+ // work out of the box.
422
+ const extraSkillPaths = collectAncestorSkillDirs(this.opts.cwd, [".opencode/skills", ".aexol/skills"]);
383
423
  const resourceLoader = new DefaultResourceLoader({
384
424
  cwd: this.opts.cwd,
385
425
  agentDir: this.opts.agentDir ?? `${process.env.HOME ?? ""}/.pi/agent`,
386
426
  extensionFactories,
387
- // Skip on-disk extension/skill discovery so the server is self-contained.
388
427
  noExtensions: false,
389
- noSkills: true,
428
+ noSkills: false,
390
429
  noPromptTemplates: true,
391
430
  noThemes: true,
431
+ additionalSkillPaths: extraSkillPaths,
392
432
  });
393
433
  await resourceLoader.reload();
394
434
  // In-memory session: SQLite is our source of truth.
@@ -1029,6 +1069,27 @@ export class PiBridge {
1029
1069
  return;
1030
1070
  }
1031
1071
  case "tool_execution_start": {
1072
+ // Emit subagent_start for subagent tool invocations (Option B frontend panels).
1073
+ if (ev.toolName === "subagent") {
1074
+ const args = ev.args;
1075
+ const mode = args?.chain?.length > 0 ? "chain"
1076
+ : args?.tasks?.length > 0 ? "parallel"
1077
+ : "single";
1078
+ const se = {
1079
+ type: "subagent_start",
1080
+ toolCallId: ev.toolCallId,
1081
+ mode,
1082
+ agent: typeof args?.agent === "string" ? args.agent : undefined,
1083
+ task: typeof args?.task === "string" ? args.task : undefined,
1084
+ taskCount: mode === "chain"
1085
+ ? args?.chain?.length
1086
+ : mode === "parallel"
1087
+ ? args?.tasks?.length
1088
+ : undefined,
1089
+ totalSteps: mode === "chain" ? args?.chain?.length : undefined,
1090
+ };
1091
+ this.emitAndBuffer(se);
1092
+ }
1032
1093
  this.emitAndBuffer({
1033
1094
  type: "tool_call",
1034
1095
  messageId: this.pending?.messageId ?? "",
@@ -1038,7 +1099,96 @@ export class PiBridge {
1038
1099
  });
1039
1100
  return;
1040
1101
  }
1102
+ case "tool_execution_update": {
1103
+ // Emit subagent_progress for subagent tool updates.
1104
+ if (ev.toolName === "subagent") {
1105
+ const partialResult = ev.partialResult;
1106
+ const details = partialResult?.details;
1107
+ if (details?.results) {
1108
+ const mode = (details.mode ?? "single");
1109
+ const total = details.results.length;
1110
+ const done = details.results.filter(r => r.exitCode !== undefined && r.exitCode !== -1).length;
1111
+ const running = total - done;
1112
+ const currentAgent = details.results.find(r => r.exitCode === -1 || r.exitCode === undefined)?.agent;
1113
+ const se = {
1114
+ type: "subagent_progress",
1115
+ toolCallId: ev.toolCallId,
1116
+ mode,
1117
+ completedCount: done,
1118
+ totalCount: total,
1119
+ currentStep: mode === "chain" ? details.results[details.results.length - 1]?.step : undefined,
1120
+ currentAgent,
1121
+ message: mode === "parallel"
1122
+ ? `Parallel: ${done}/${total} done, ${running} running`
1123
+ : mode === "chain"
1124
+ ? `Chain: step ${details.results.length}/${total}`
1125
+ : `Running ${currentAgent ?? "subagent"}...`,
1126
+ };
1127
+ try {
1128
+ this.opts.emit(se);
1129
+ }
1130
+ catch { /* best-effort */ }
1131
+ }
1132
+ }
1133
+ return;
1134
+ }
1041
1135
  case "tool_execution_end": {
1136
+ // Emit subagent_end for subagent tool completions.
1137
+ if (ev.toolName === "subagent") {
1138
+ const result = ev.result;
1139
+ const details = result?.details;
1140
+ if (details?.results && details.results.length > 0) {
1141
+ const mode = (details.mode ?? "single");
1142
+ const getOutput = (msgs) => {
1143
+ if (!msgs)
1144
+ return "(no output)";
1145
+ for (let i = msgs.length - 1; i >= 0; i--) {
1146
+ if (msgs[i].role === "assistant") {
1147
+ for (const part of msgs[i].content) {
1148
+ if (part.type === "text" && part.text)
1149
+ return part.text;
1150
+ }
1151
+ }
1152
+ }
1153
+ return "(no output)";
1154
+ };
1155
+ const results = details.results.map(r => ({
1156
+ agent: r.agent,
1157
+ agentSource: r.agentSource ?? "unknown",
1158
+ task: r.task,
1159
+ exitCode: r.exitCode,
1160
+ output: getOutput(r.messages),
1161
+ model: r.model,
1162
+ errorMessage: r.errorMessage,
1163
+ stopReason: r.stopReason,
1164
+ step: r.step,
1165
+ usage: {
1166
+ inputTokens: r.usage?.input ?? 0,
1167
+ outputTokens: r.usage?.output ?? 0,
1168
+ cacheReadTokens: r.usage?.cacheRead ?? 0,
1169
+ cacheWriteTokens: r.usage?.cacheWrite ?? 0,
1170
+ cost: r.usage?.cost ?? 0,
1171
+ turns: r.usage?.turns ?? 0,
1172
+ },
1173
+ }));
1174
+ const totalUsage = results.reduce((acc, r) => ({
1175
+ inputTokens: acc.inputTokens + r.usage.inputTokens,
1176
+ outputTokens: acc.outputTokens + r.usage.outputTokens,
1177
+ cacheReadTokens: acc.cacheReadTokens + r.usage.cacheReadTokens,
1178
+ cacheWriteTokens: acc.cacheWriteTokens + r.usage.cacheWriteTokens,
1179
+ cost: acc.cost + r.usage.cost,
1180
+ turns: acc.turns + r.usage.turns,
1181
+ }), { inputTokens: 0, outputTokens: 0, cacheReadTokens: 0, cacheWriteTokens: 0, cost: 0, turns: 0 });
1182
+ const se = {
1183
+ type: "subagent_end",
1184
+ toolCallId: ev.toolCallId,
1185
+ mode,
1186
+ results,
1187
+ totalUsage,
1188
+ };
1189
+ this.emitAndBuffer(se);
1190
+ }
1191
+ }
1042
1192
  this.emitAndBuffer({
1043
1193
  type: "tool_result",
1044
1194
  messageId: this.pending?.messageId ?? "",
@@ -1130,8 +1130,30 @@ export class SessionStreamManager {
1130
1130
  }
1131
1131
  // Track compaction lifecycle so prompt() can block new messages while
1132
1132
  // compaction is running.
1133
+ //
1134
+ // Persist synthetic system messages so historic session replay (reconnect,
1135
+ // page refresh) shows compaction events in the message timeline. These are
1136
+ // broadcast live to connected subscribers AND persisted, so both live and
1137
+ // historic sessions see them.
1133
1138
  if (event.type === "compaction_start") {
1134
1139
  stream.compacting = true;
1140
+ const reasonLabel = event.reason === "manual"
1141
+ ? "Manual compaction"
1142
+ : event.reason === "overflow"
1143
+ ? "Context overflow"
1144
+ : "Context threshold";
1145
+ const sysMsg = `${reasonLabel} — compacting conversation context…`;
1146
+ try {
1147
+ this.store.appendMessage(stream.sessionId, {
1148
+ role: "system",
1149
+ content: sysMsg,
1150
+ eventsJsonl: "",
1151
+ createdAt: Date.now(),
1152
+ });
1153
+ }
1154
+ catch {
1155
+ // best-effort; never block the stream on persistence
1156
+ }
1135
1157
  }
1136
1158
  if (event.type === "compaction_end") {
1137
1159
  stream.compacting = false;
@@ -1139,6 +1161,25 @@ export class SessionStreamManager {
1139
1161
  prunePersistedHistoryAfterCompaction(this.store, stream.sessionId, stream.bridge);
1140
1162
  }
1141
1163
  persistObservationalMemorySnapshot(this.store, stream.sessionId, stream.bridge);
1164
+ const tokensMsg = typeof event.tokensBefore === "number"
1165
+ ? ` (from ~${event.tokensBefore.toLocaleString()} tokens)`
1166
+ : "";
1167
+ const sysMsg = event.aborted
1168
+ ? "Compaction aborted."
1169
+ : event.summary
1170
+ ? `Compaction complete${tokensMsg}. Summary: ${event.summary}`
1171
+ : `Compaction complete${tokensMsg}.`;
1172
+ try {
1173
+ this.store.appendMessage(stream.sessionId, {
1174
+ role: "system",
1175
+ content: sysMsg,
1176
+ eventsJsonl: "",
1177
+ createdAt: Date.now(),
1178
+ });
1179
+ }
1180
+ catch {
1181
+ // best-effort
1182
+ }
1142
1183
  }
1143
1184
  this.broadcast(stream, event);
1144
1185
  if (event.type === "agent_end") {
@@ -1378,7 +1419,10 @@ function isReplayable(event) {
1378
1419
  event.type === "tool_result" ||
1379
1420
  event.type === "message_end" ||
1380
1421
  event.type === "token_usage" ||
1381
- event.type === "error");
1422
+ event.type === "error" ||
1423
+ event.type === "subagent_start" ||
1424
+ event.type === "subagent_progress" ||
1425
+ event.type === "subagent_end");
1382
1426
  }
1383
1427
  function snapshotTurn(turn) {
1384
1428
  // Defensive copy of the events array so the snapshot can't be mutated by
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aexol/spectral",
3
- "version": "0.7.0",
3
+ "version": "0.7.1",
4
4
  "description": "Always-on coding agent for Aexol — branded pi wrapper with relay-based browser access.",
5
5
  "type": "module",
6
6
  "private": false,