@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
@@ -49,12 +49,14 @@
49
49
  * instance is reused across `prompt()` calls).
50
50
  */
51
51
  import { createJiti } from "@mariozechner/jiti";
52
- import { AuthStorage, createAgentSession, DefaultResourceLoader, ModelRegistry, SessionManager, } from "@mariozechner/pi-coding-agent";
52
+ import { AuthStorage, createAgentSession, DefaultResourceLoader, ModelRegistry, SessionManager, } from "../pi/coding-agent/index.js";
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 ?? "",
@@ -41,9 +41,9 @@ import { PiBridge } from "./pi-bridge.js";
41
41
  import { getMemoryState, isSourceEntry, rawTokensSinceLastBound, rawTokensSinceLastCompaction, } from "../memory/branch.js";
42
42
  import { observationPoolTokens, renderSummary } from "../memory/compaction.js";
43
43
  import { loadConfig } from "../memory/config.js";
44
+ import { setProjectObsStore } from "../memory/project-observations-store.js";
44
45
  import { estimateStringTokens } from "../memory/tokens.js";
45
46
  import { reflectionContent, reflectionId } from "../memory/types.js";
46
- import { generateSessionTitle, isDefaultTitle, } from "./title-generator.js";
47
47
  const DEFAULT_BRIDGE_FACTORY = (args) => new PiBridge(args);
48
48
  /** Safety limit for autonomous loop iterations per session. */
49
49
  const MAX_LOOP_ITERATIONS = 100;
@@ -233,17 +233,7 @@ export class SessionStreamManager {
233
233
  machineJwt;
234
234
  bridgeFactory;
235
235
  agentDir;
236
- titleLlmCall;
237
- disableAutoTitle;
238
- publishMetaEvent;
239
236
  streams = new Map();
240
- /**
241
- * Sessions for which we've already attempted (or queued) auto-title
242
- * generation in this server process. Per-process is intentional: a server
243
- * restart resets the set, but `isDefaultTitle()` still gates the work so a
244
- * since-renamed session is never overwritten.
245
- */
246
- titleGenerationAttempted = new Set();
247
237
  disposed = false;
248
238
  constructor(opts) {
249
239
  this.store = opts.store;
@@ -252,9 +242,13 @@ export class SessionStreamManager {
252
242
  this.machineJwt = opts.machineJwt;
253
243
  this.bridgeFactory = opts.bridgeFactory ?? DEFAULT_BRIDGE_FACTORY;
254
244
  this.agentDir = opts.agentDir;
255
- this.titleLlmCall = opts.titleLlmCall;
256
- this.disableAutoTitle = opts.disableAutoTitle === true;
257
- this.publishMetaEvent = opts.publishMetaEvent;
245
+ // Wire the project observations store singleton so the memory extension's
246
+ // read_project_observations tool can query cross-session observations.
247
+ setProjectObsStore({
248
+ insertProjectObservations: (pid, sid, obs, ts) => this.store.insertProjectObservations(pid, sid, obs, ts),
249
+ searchProjectObservations: (pid, q, limit) => this.store.searchProjectObservations(pid, q, limit),
250
+ getProjectByCwd: (cwd) => this.store.getProjectByCwd(cwd),
251
+ });
258
252
  }
259
253
  /**
260
254
  * Attach a subscriber to a session. Lazily creates the underlying pi
@@ -1130,8 +1124,30 @@ export class SessionStreamManager {
1130
1124
  }
1131
1125
  // Track compaction lifecycle so prompt() can block new messages while
1132
1126
  // compaction is running.
1127
+ //
1128
+ // Persist synthetic system messages so historic session replay (reconnect,
1129
+ // page refresh) shows compaction events in the message timeline. These are
1130
+ // broadcast live to connected subscribers AND persisted, so both live and
1131
+ // historic sessions see them.
1133
1132
  if (event.type === "compaction_start") {
1134
1133
  stream.compacting = true;
1134
+ const reasonLabel = event.reason === "manual"
1135
+ ? "Manual compaction"
1136
+ : event.reason === "overflow"
1137
+ ? "Context overflow"
1138
+ : "Context threshold";
1139
+ const sysMsg = `${reasonLabel} — compacting conversation context…`;
1140
+ try {
1141
+ this.store.appendMessage(stream.sessionId, {
1142
+ role: "system",
1143
+ content: sysMsg,
1144
+ eventsJsonl: "",
1145
+ createdAt: Date.now(),
1146
+ });
1147
+ }
1148
+ catch {
1149
+ // best-effort; never block the stream on persistence
1150
+ }
1135
1151
  }
1136
1152
  if (event.type === "compaction_end") {
1137
1153
  stream.compacting = false;
@@ -1139,6 +1155,25 @@ export class SessionStreamManager {
1139
1155
  prunePersistedHistoryAfterCompaction(this.store, stream.sessionId, stream.bridge);
1140
1156
  }
1141
1157
  persistObservationalMemorySnapshot(this.store, stream.sessionId, stream.bridge);
1158
+ const tokensMsg = typeof event.tokensBefore === "number"
1159
+ ? ` (from ~${event.tokensBefore.toLocaleString()} tokens)`
1160
+ : "";
1161
+ const sysMsg = event.aborted
1162
+ ? "Compaction aborted."
1163
+ : event.summary
1164
+ ? `Compaction complete${tokensMsg}. Summary: ${event.summary}`
1165
+ : `Compaction complete${tokensMsg}.`;
1166
+ try {
1167
+ this.store.appendMessage(stream.sessionId, {
1168
+ role: "system",
1169
+ content: sysMsg,
1170
+ eventsJsonl: "",
1171
+ createdAt: Date.now(),
1172
+ });
1173
+ }
1174
+ catch {
1175
+ // best-effort
1176
+ }
1142
1177
  }
1143
1178
  this.broadcast(stream, event);
1144
1179
  if (event.type === "agent_end") {
@@ -1151,11 +1186,6 @@ export class SessionStreamManager {
1151
1186
  stream.lastFlushedEventCount = 0;
1152
1187
  const finishedTurn = stream.currentTurn;
1153
1188
  stream.currentTurn = null;
1154
- // Fire-and-forget auto-title generation. Runs only once per session
1155
- // per server lifetime, only when the session is still wearing its
1156
- // default title, and never blocks the user's stream (the user's
1157
- // turn is already complete by the time this runs).
1158
- this.maybeGenerateTitle(stream, finishedTurn);
1159
1189
  // Autonomous iterative loop (Ralph Wiggum pattern).
1160
1190
  // When loopActive is set, check for completion marker, then re-send
1161
1191
  // the ORIGINAL prompt so the agent sees its prior changes and
@@ -1259,98 +1289,6 @@ export class SessionStreamManager {
1259
1289
  console.error(`[spectral] error: batch-persist flush failed: ${err instanceof Error ? err.message : String(err)}`);
1260
1290
  }
1261
1291
  }
1262
- /**
1263
- * Auto-title the session if it's still wearing the default title and we
1264
- * haven't already attempted generation in this process. Fire-and-forget
1265
- * (errors are caught, logged, and swallowed) — the user's stream finished
1266
- * before this runs, so blocking would only delay the broadcast.
1267
- */
1268
- maybeGenerateTitle(stream, finishedTurn) {
1269
- if (this.disableAutoTitle)
1270
- return;
1271
- if (this.titleGenerationAttempted.has(stream.sessionId))
1272
- return;
1273
- // Check the persisted title now (manual rename takes precedence).
1274
- const detail = this.store.getSession(stream.sessionId);
1275
- if (!detail || !isDefaultTitle(detail.title))
1276
- return;
1277
- // Find the first user message + the assistant text from the just-finished
1278
- // turn. We deliberately read user content from SQLite (authoritative)
1279
- // and assistant content from the in-memory turn buffer (cheap, and
1280
- // matches what the user just saw).
1281
- const firstUser = detail.messages.find((m) => m.role === "user");
1282
- if (!firstUser || !firstUser.content.trim())
1283
- return;
1284
- let assistantText = finishedTurn?.assistantText ?? "";
1285
- if (!assistantText) {
1286
- // Fallback: pull the most recent assistant message from SQLite. This
1287
- // can happen if `agent_end` fires for a turn whose buffer was cleared
1288
- // by an intervening error event, or when this code path is reached
1289
- // via a synthetic test event.
1290
- const lastAssistant = [...detail.messages]
1291
- .reverse()
1292
- .find((m) => m.role === "assistant");
1293
- assistantText = lastAssistant?.content ?? "";
1294
- }
1295
- // Mark BEFORE awaiting so a second `agent_end` arriving while we're
1296
- // generating doesn't double-fire. Even if generation throws, we leave
1297
- // the entry in place — one-shot semantics, no retries.
1298
- this.titleGenerationAttempted.add(stream.sessionId);
1299
- void this.runTitleGeneration(stream, firstUser.content, assistantText);
1300
- }
1301
- async runTitleGeneration(stream, firstUserMessage, firstAssistantMessage) {
1302
- try {
1303
- const title = await generateSessionTitle(firstUserMessage, firstAssistantMessage, {
1304
- cwd: stream.cwd,
1305
- agentDir: this.agentDir,
1306
- llmCall: this.titleLlmCall,
1307
- });
1308
- if (this.disposed)
1309
- return;
1310
- if (!title)
1311
- return;
1312
- // Re-check the title hasn't been changed underneath us while we were
1313
- // waiting on the LLM (e.g. user manually renamed mid-generation).
1314
- const current = this.store.getSession(stream.sessionId);
1315
- if (!current || !isDefaultTitle(current.title))
1316
- return;
1317
- const updated = this.store.renameSession(stream.sessionId, title);
1318
- if (!updated)
1319
- return;
1320
- // Broadcast to every subscriber of this session so all open tabs
1321
- // update their sidebar in real time. The wire event is independent
1322
- // of the in-flight turn lifecycle, so it's safe to fire post-agent_end.
1323
- this.broadcast(stream, {
1324
- type: "session_renamed",
1325
- sessionId: stream.sessionId,
1326
- title: updated.title,
1327
- });
1328
- // Cross-tab fan-out hint: tabs that don't have THIS session open
1329
- // (and so don't have a per-session ws subscription) still want to
1330
- // refresh their sidebar to show the new title. Best-effort; a
1331
- // failed publish never undoes the rename.
1332
- if (this.publishMetaEvent) {
1333
- try {
1334
- this.publishMetaEvent({
1335
- type: "session_renamed",
1336
- projectId: updated.projectId,
1337
- sessionId: stream.sessionId,
1338
- });
1339
- }
1340
- catch (err) {
1341
- const msg = err instanceof Error ? err.message : String(err);
1342
- console.warn(`[spectral] warn: meta publish for auto-title failed: ${msg}`);
1343
- }
1344
- }
1345
- }
1346
- catch (err) {
1347
- // Defensive: generateSessionTitle already swallows LLM errors. This
1348
- // catches any unexpected throw from rename/broadcast so the manager
1349
- // is never destabilized by a background title task.
1350
- const msg = err instanceof Error ? err.message : String(err);
1351
- console.warn(`[spectral] warn: auto-title pipeline failed: ${msg}`);
1352
- }
1353
- }
1354
1292
  broadcast(stream, event) {
1355
1293
  const dead = [];
1356
1294
  for (const sub of stream.subscribers) {
@@ -1378,7 +1316,10 @@ function isReplayable(event) {
1378
1316
  event.type === "tool_result" ||
1379
1317
  event.type === "message_end" ||
1380
1318
  event.type === "token_usage" ||
1381
- event.type === "error");
1319
+ event.type === "error" ||
1320
+ event.type === "subagent_start" ||
1321
+ event.type === "subagent_progress" ||
1322
+ event.type === "subagent_end");
1382
1323
  }
1383
1324
  function snapshotTurn(turn) {
1384
1325
  // Defensive copy of the events array so the snapshot can't be mutated by
@@ -78,6 +78,17 @@ CREATE TABLE IF NOT EXISTS session_memory_snapshots (
78
78
  covered_source_count INTEGER NOT NULL,
79
79
  updated_at INTEGER NOT NULL
80
80
  );
81
+
82
+ CREATE TABLE IF NOT EXISTS project_observations (
83
+ id TEXT PRIMARY KEY,
84
+ project_id TEXT NOT NULL REFERENCES projects(id) ON DELETE CASCADE,
85
+ session_id TEXT NOT NULL,
86
+ content TEXT NOT NULL,
87
+ relevance TEXT NOT NULL CHECK (relevance IN ('low','medium','high','critical')),
88
+ created_at INTEGER NOT NULL
89
+ );
90
+
91
+ CREATE INDEX IF NOT EXISTS idx_project_obs_project ON project_observations(project_id, created_at DESC);
81
92
  `;
82
93
  /**
83
94
  * Synchronous binding-file reader for a project at the given filesystem path.
@@ -108,7 +119,7 @@ function applyBindingFields(project) {
108
119
  };
109
120
  }
110
121
  /** Tables we own — used by the migration drop step. */
111
- const KNOWN_TABLES = ["session_memory_snapshots", "messages", "sessions", "projects"];
122
+ const KNOWN_TABLES = ["project_observations", "session_memory_snapshots", "messages", "sessions", "projects"];
112
123
  /** Best-effort parse of the `images_json` column into `ImageAttachment[]`. */
113
124
  function parseImagesJson(raw) {
114
125
  if (!raw || raw === "")
@@ -169,6 +180,10 @@ export class SessionStore {
169
180
  // Fork & Compact: flag + per-session source tracking.
170
181
  stmtSetForkCompactSource;
171
182
  stmtGetForkCompactSource;
183
+ // Project observations: cross-session durable memory.
184
+ stmtInsertProjectObs;
185
+ stmtSearchProjectObs;
186
+ stmtGetProjectByCwd;
172
187
  constructor(path) {
173
188
  this.path = path;
174
189
  // Make sure the parent directory exists. mkdirSync with recursive is a
@@ -307,6 +322,14 @@ export class SessionStore {
307
322
  this.stmtSetSessionModel = this.db.prepare(`UPDATE sessions SET model_id = ? WHERE id = ?`);
308
323
  this.stmtSetForkCompactSource = this.db.prepare(`UPDATE sessions SET fork_compact_source_id = ? WHERE id = ?`);
309
324
  this.stmtGetForkCompactSource = this.db.prepare(`SELECT fork_compact_source_id FROM sessions WHERE id = ?`);
325
+ this.stmtInsertProjectObs = this.db.prepare(`INSERT OR REPLACE INTO project_observations (id, project_id, session_id, content, relevance, created_at)
326
+ VALUES (?, ?, ?, ?, ?, ?)`);
327
+ this.stmtSearchProjectObs = this.db.prepare(`SELECT id, project_id, session_id, content, relevance, created_at
328
+ FROM project_observations
329
+ WHERE project_id = ? AND content LIKE ?
330
+ ORDER BY created_at DESC
331
+ LIMIT 20`);
332
+ this.stmtGetProjectByCwd = this.db.prepare(`SELECT id FROM projects WHERE path = ? LIMIT 1`);
310
333
  }
311
334
  /** Smoke check: returns the names of the tables in the DB. */
312
335
  listTables() {
@@ -653,6 +676,44 @@ export class SessionStore {
653
676
  clearForkCompactSource(sessionId) {
654
677
  this.stmtSetForkCompactSource.run(null, sessionId);
655
678
  }
679
+ // ----------------------------------------------------------------------
680
+ // Project observations (cross-session durable memory)
681
+ // ----------------------------------------------------------------------
682
+ /**
683
+ * Insert multiple project observations in a single transaction.
684
+ * Uses INSERT OR REPLACE so re-running after the same compaction is idempotent.
685
+ */
686
+ insertProjectObservations(projectId, sessionId, observations, createdAt) {
687
+ if (observations.length === 0)
688
+ return;
689
+ const tx = this.db.transaction(() => {
690
+ for (const obs of observations) {
691
+ this.stmtInsertProjectObs.run(obs.id, projectId, sessionId, obs.content, obs.relevance, createdAt);
692
+ }
693
+ });
694
+ tx();
695
+ }
696
+ /**
697
+ * Search project observations by substring match. Returns up to 20 most recent.
698
+ */
699
+ searchProjectObservations(projectId, query, limit = 20) {
700
+ const pattern = `%${query}%`;
701
+ const rows = this.stmtSearchProjectObs.all(projectId, pattern);
702
+ return rows.slice(0, limit).map((r) => ({
703
+ content: r.content,
704
+ relevance: r.relevance,
705
+ createdAt: r.created_at,
706
+ sessionId: r.session_id,
707
+ }));
708
+ }
709
+ /**
710
+ * Look up a project by its absolute filesystem path.
711
+ * Returns null when no project has been registered for the given path.
712
+ */
713
+ getProjectByCwd(cwd) {
714
+ const row = this.stmtGetProjectByCwd.get(cwd);
715
+ return row?.id ?? null;
716
+ }
656
717
  close() {
657
718
  if (this.closed)
658
719
  return;