groove-dev 0.26.39 → 0.27.0

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 (914) hide show
  1. package/CHANGELOG.md +59 -0
  2. package/CLAUDE.md +24 -19
  3. package/node_modules/@groove-dev/cli/package.json +1 -1
  4. package/node_modules/@groove-dev/daemon/integrations-registry.json +548 -0
  5. package/node_modules/@groove-dev/daemon/package.json +1 -1
  6. package/node_modules/@groove-dev/daemon/src/api.js +172 -4
  7. package/node_modules/@groove-dev/daemon/src/classifier.js +20 -1
  8. package/node_modules/@groove-dev/daemon/src/firstrun.js +14 -1
  9. package/node_modules/@groove-dev/daemon/src/gateways/manager.js +2 -2
  10. package/node_modules/@groove-dev/daemon/src/index.js +3 -1
  11. package/node_modules/@groove-dev/daemon/src/introducer.js +56 -5
  12. package/node_modules/@groove-dev/daemon/src/journalist.js +43 -1
  13. package/node_modules/@groove-dev/daemon/src/lockmanager.js +60 -0
  14. package/node_modules/@groove-dev/daemon/src/mcp-manager.js +2 -1
  15. package/node_modules/@groove-dev/daemon/src/memory.js +370 -0
  16. package/node_modules/@groove-dev/daemon/src/pm.js +1 -1
  17. package/node_modules/@groove-dev/daemon/src/process.js +20 -1
  18. package/node_modules/@groove-dev/daemon/src/rotator.js +155 -5
  19. package/node_modules/@groove-dev/daemon/src/router.js +43 -0
  20. package/node_modules/@groove-dev/daemon/src/tokentracker.js +62 -8
  21. package/node_modules/@groove-dev/daemon/src/validate.js +0 -13
  22. package/node_modules/@groove-dev/daemon/test/lockmanager.test.js +64 -0
  23. package/node_modules/@groove-dev/daemon/test/memory.test.js +252 -0
  24. package/node_modules/@groove-dev/daemon/test/rotator.test.js +108 -0
  25. package/node_modules/@groove-dev/daemon/test/router.test.js +64 -0
  26. package/node_modules/@groove-dev/daemon/test/tokentracker.test.js +78 -0
  27. package/node_modules/@groove-dev/gui/dist/assets/index-DjORRpF0.css +1 -0
  28. package/node_modules/@groove-dev/gui/dist/assets/index-eCrVowF0.js +652 -0
  29. package/node_modules/@groove-dev/gui/dist/index.html +2 -2
  30. package/node_modules/@groove-dev/gui/package.json +1 -4
  31. package/node_modules/@groove-dev/gui/src/components/agents/spawn-wizard.jsx +18 -0
  32. package/node_modules/@groove-dev/gui/src/components/dashboard/cache-ring.jsx +6 -2
  33. package/node_modules/@groove-dev/gui/src/components/dashboard/intel-panel.jsx +251 -8
  34. package/node_modules/@groove-dev/gui/src/components/dashboard/team-burn-panel.jsx +55 -0
  35. package/node_modules/@groove-dev/gui/src/components/marketplace/marketplace-card.jsx +22 -4
  36. package/node_modules/@groove-dev/gui/src/lib/format.js +0 -6
  37. package/node_modules/@groove-dev/gui/src/lib/hooks/use-dashboard.js +18 -1
  38. package/node_modules/@groove-dev/gui/src/stores/groove.js +0 -2
  39. package/node_modules/@groove-dev/gui/src/views/dashboard.jsx +9 -2
  40. package/node_modules/@groove-dev/gui/src/views/marketplace.jsx +103 -77
  41. package/package.json +2 -8
  42. package/packages/cli/package.json +1 -1
  43. package/packages/daemon/integrations-registry.json +548 -0
  44. package/packages/daemon/package.json +1 -1
  45. package/packages/daemon/src/api.js +172 -4
  46. package/packages/daemon/src/classifier.js +20 -1
  47. package/packages/daemon/src/firstrun.js +14 -1
  48. package/packages/daemon/src/gateways/manager.js +2 -2
  49. package/packages/daemon/src/index.js +3 -1
  50. package/packages/daemon/src/introducer.js +56 -5
  51. package/packages/daemon/src/journalist.js +43 -1
  52. package/packages/daemon/src/lockmanager.js +60 -0
  53. package/packages/daemon/src/mcp-manager.js +2 -1
  54. package/packages/daemon/src/memory.js +370 -0
  55. package/packages/daemon/src/pm.js +1 -1
  56. package/packages/daemon/src/process.js +20 -1
  57. package/packages/daemon/src/rotator.js +155 -5
  58. package/packages/daemon/src/router.js +43 -0
  59. package/packages/daemon/src/tokentracker.js +62 -8
  60. package/packages/daemon/src/validate.js +0 -13
  61. package/packages/gui/dist/assets/index-DjORRpF0.css +1 -0
  62. package/packages/gui/dist/assets/index-eCrVowF0.js +652 -0
  63. package/packages/gui/dist/index.html +2 -2
  64. package/packages/gui/package.json +1 -4
  65. package/packages/gui/src/components/agents/spawn-wizard.jsx +18 -0
  66. package/packages/gui/src/components/dashboard/cache-ring.jsx +6 -2
  67. package/packages/gui/src/components/dashboard/intel-panel.jsx +251 -8
  68. package/packages/gui/src/components/dashboard/team-burn-panel.jsx +55 -0
  69. package/packages/gui/src/components/marketplace/marketplace-card.jsx +22 -4
  70. package/packages/gui/src/lib/format.js +0 -6
  71. package/packages/gui/src/lib/hooks/use-dashboard.js +18 -1
  72. package/packages/gui/src/stores/groove.js +0 -2
  73. package/packages/gui/src/views/dashboard.jsx +9 -2
  74. package/packages/gui/src/views/marketplace.jsx +103 -77
  75. package/docs-manager/DOCS-WORKFLOW.md +0 -176
  76. package/node_modules/@groove-dev/gui/dist/assets/index-BkY43sei.css +0 -1
  77. package/node_modules/@groove-dev/gui/dist/assets/index-DmKZLrXU.js +0 -652
  78. package/node_modules/@groove-dev/gui/dist/groove-logo-short.png +0 -0
  79. package/node_modules/@groove-dev/gui/dist/groove-logo.png +0 -0
  80. package/node_modules/@groove-dev/gui/public/groove-logo-short.png +0 -0
  81. package/node_modules/@groove-dev/gui/public/groove-logo.png +0 -0
  82. package/node_modules/@groove-dev/gui/src/components/ui/dropdown-menu.jsx +0 -60
  83. package/node_modules/@groove-dev/gui/src/lib/hooks/use-media-query.js +0 -18
  84. package/node_modules/@radix-ui/react-dropdown-menu/LICENSE +0 -21
  85. package/node_modules/@radix-ui/react-dropdown-menu/README.md +0 -3
  86. package/node_modules/@radix-ui/react-dropdown-menu/dist/index.d.mts +0 -97
  87. package/node_modules/@radix-ui/react-dropdown-menu/dist/index.d.ts +0 -97
  88. package/node_modules/@radix-ui/react-dropdown-menu/dist/index.js +0 -337
  89. package/node_modules/@radix-ui/react-dropdown-menu/dist/index.js.map +0 -7
  90. package/node_modules/@radix-ui/react-dropdown-menu/dist/index.mjs +0 -305
  91. package/node_modules/@radix-ui/react-dropdown-menu/dist/index.mjs.map +0 -7
  92. package/node_modules/@radix-ui/react-dropdown-menu/package.json +0 -75
  93. package/node_modules/@radix-ui/react-popover/LICENSE +0 -21
  94. package/node_modules/@radix-ui/react-popover/README.md +0 -3
  95. package/node_modules/@radix-ui/react-popover/dist/index.d.mts +0 -85
  96. package/node_modules/@radix-ui/react-popover/dist/index.d.ts +0 -85
  97. package/node_modules/@radix-ui/react-popover/dist/index.js +0 -352
  98. package/node_modules/@radix-ui/react-popover/dist/index.js.map +0 -7
  99. package/node_modules/@radix-ui/react-popover/dist/index.mjs +0 -320
  100. package/node_modules/@radix-ui/react-popover/dist/index.mjs.map +0 -7
  101. package/node_modules/@radix-ui/react-popover/package.json +0 -82
  102. package/node_modules/@radix-ui/react-separator/LICENSE +0 -21
  103. package/node_modules/@radix-ui/react-separator/README.md +0 -3
  104. package/node_modules/@radix-ui/react-separator/dist/index.d.mts +0 -21
  105. package/node_modules/@radix-ui/react-separator/dist/index.d.ts +0 -21
  106. package/node_modules/@radix-ui/react-separator/dist/index.js +0 -65
  107. package/node_modules/@radix-ui/react-separator/dist/index.js.map +0 -7
  108. package/node_modules/@radix-ui/react-separator/dist/index.mjs +0 -32
  109. package/node_modules/@radix-ui/react-separator/dist/index.mjs.map +0 -7
  110. package/node_modules/@radix-ui/react-separator/node_modules/@radix-ui/react-primitive/LICENSE +0 -21
  111. package/node_modules/@radix-ui/react-separator/node_modules/@radix-ui/react-primitive/README.md +0 -3
  112. package/node_modules/@radix-ui/react-separator/node_modules/@radix-ui/react-primitive/dist/index.d.mts +0 -52
  113. package/node_modules/@radix-ui/react-separator/node_modules/@radix-ui/react-primitive/dist/index.d.ts +0 -52
  114. package/node_modules/@radix-ui/react-separator/node_modules/@radix-ui/react-primitive/dist/index.js +0 -80
  115. package/node_modules/@radix-ui/react-separator/node_modules/@radix-ui/react-primitive/dist/index.js.map +0 -7
  116. package/node_modules/@radix-ui/react-separator/node_modules/@radix-ui/react-primitive/dist/index.mjs +0 -47
  117. package/node_modules/@radix-ui/react-separator/node_modules/@radix-ui/react-primitive/dist/index.mjs.map +0 -7
  118. package/node_modules/@radix-ui/react-separator/node_modules/@radix-ui/react-primitive/package.json +0 -69
  119. package/node_modules/@radix-ui/react-separator/node_modules/@radix-ui/react-slot/LICENSE +0 -21
  120. package/node_modules/@radix-ui/react-separator/node_modules/@radix-ui/react-slot/README.md +0 -3
  121. package/node_modules/@radix-ui/react-separator/node_modules/@radix-ui/react-slot/dist/index.d.mts +0 -22
  122. package/node_modules/@radix-ui/react-separator/node_modules/@radix-ui/react-slot/dist/index.d.ts +0 -22
  123. package/node_modules/@radix-ui/react-separator/node_modules/@radix-ui/react-slot/dist/index.js +0 -152
  124. package/node_modules/@radix-ui/react-separator/node_modules/@radix-ui/react-slot/dist/index.js.map +0 -7
  125. package/node_modules/@radix-ui/react-separator/node_modules/@radix-ui/react-slot/dist/index.mjs +0 -119
  126. package/node_modules/@radix-ui/react-separator/node_modules/@radix-ui/react-slot/dist/index.mjs.map +0 -7
  127. package/node_modules/@radix-ui/react-separator/node_modules/@radix-ui/react-slot/package.json +0 -64
  128. package/node_modules/@radix-ui/react-separator/package.json +0 -69
  129. package/packages/gui/dist/assets/index-BkY43sei.css +0 -1
  130. package/packages/gui/dist/assets/index-DmKZLrXU.js +0 -652
  131. package/packages/gui/dist/groove-logo-short.png +0 -0
  132. package/packages/gui/dist/groove-logo.png +0 -0
  133. package/packages/gui/public/groove-logo-short.png +0 -0
  134. package/packages/gui/public/groove-logo.png +0 -0
  135. package/packages/gui/src/components/ui/dropdown-menu.jsx +0 -60
  136. package/packages/gui/src/lib/hooks/use-media-query.js +0 -18
  137. package/slides/convert-slides.js +0 -1120
  138. package/slides/deck.pptx +0 -0
  139. package/slides/index.html +0 -825
  140. package/slides/node_modules/.package-lock.json +0 -527
  141. package/slides/node_modules/@types/node/LICENSE +0 -21
  142. package/slides/node_modules/@types/node/README.md +0 -15
  143. package/slides/node_modules/@types/node/assert/strict.d.ts +0 -111
  144. package/slides/node_modules/@types/node/assert.d.ts +0 -1078
  145. package/slides/node_modules/@types/node/async_hooks.d.ts +0 -603
  146. package/slides/node_modules/@types/node/buffer.buffer.d.ts +0 -472
  147. package/slides/node_modules/@types/node/buffer.d.ts +0 -1934
  148. package/slides/node_modules/@types/node/child_process.d.ts +0 -1476
  149. package/slides/node_modules/@types/node/cluster.d.ts +0 -578
  150. package/slides/node_modules/@types/node/compatibility/disposable.d.ts +0 -14
  151. package/slides/node_modules/@types/node/compatibility/index.d.ts +0 -9
  152. package/slides/node_modules/@types/node/compatibility/indexable.d.ts +0 -20
  153. package/slides/node_modules/@types/node/compatibility/iterators.d.ts +0 -20
  154. package/slides/node_modules/@types/node/console.d.ts +0 -452
  155. package/slides/node_modules/@types/node/constants.d.ts +0 -21
  156. package/slides/node_modules/@types/node/crypto.d.ts +0 -4545
  157. package/slides/node_modules/@types/node/dgram.d.ts +0 -600
  158. package/slides/node_modules/@types/node/diagnostics_channel.d.ts +0 -578
  159. package/slides/node_modules/@types/node/dns/promises.d.ts +0 -503
  160. package/slides/node_modules/@types/node/dns.d.ts +0 -923
  161. package/slides/node_modules/@types/node/domain.d.ts +0 -170
  162. package/slides/node_modules/@types/node/events.d.ts +0 -976
  163. package/slides/node_modules/@types/node/fs/promises.d.ts +0 -1295
  164. package/slides/node_modules/@types/node/fs.d.ts +0 -4461
  165. package/slides/node_modules/@types/node/globals.d.ts +0 -172
  166. package/slides/node_modules/@types/node/globals.typedarray.d.ts +0 -38
  167. package/slides/node_modules/@types/node/http.d.ts +0 -2089
  168. package/slides/node_modules/@types/node/http2.d.ts +0 -2644
  169. package/slides/node_modules/@types/node/https.d.ts +0 -579
  170. package/slides/node_modules/@types/node/index.d.ts +0 -97
  171. package/slides/node_modules/@types/node/inspector.d.ts +0 -253
  172. package/slides/node_modules/@types/node/inspector.generated.d.ts +0 -4052
  173. package/slides/node_modules/@types/node/module.d.ts +0 -891
  174. package/slides/node_modules/@types/node/net.d.ts +0 -1076
  175. package/slides/node_modules/@types/node/os.d.ts +0 -506
  176. package/slides/node_modules/@types/node/package.json +0 -145
  177. package/slides/node_modules/@types/node/path.d.ts +0 -200
  178. package/slides/node_modules/@types/node/perf_hooks.d.ts +0 -968
  179. package/slides/node_modules/@types/node/process.d.ts +0 -2084
  180. package/slides/node_modules/@types/node/punycode.d.ts +0 -117
  181. package/slides/node_modules/@types/node/querystring.d.ts +0 -152
  182. package/slides/node_modules/@types/node/readline/promises.d.ts +0 -161
  183. package/slides/node_modules/@types/node/readline.d.ts +0 -594
  184. package/slides/node_modules/@types/node/repl.d.ts +0 -428
  185. package/slides/node_modules/@types/node/sea.d.ts +0 -153
  186. package/slides/node_modules/@types/node/sqlite.d.ts +0 -721
  187. package/slides/node_modules/@types/node/stream/consumers.d.ts +0 -38
  188. package/slides/node_modules/@types/node/stream/promises.d.ts +0 -90
  189. package/slides/node_modules/@types/node/stream/web.d.ts +0 -622
  190. package/slides/node_modules/@types/node/stream.d.ts +0 -1687
  191. package/slides/node_modules/@types/node/string_decoder.d.ts +0 -67
  192. package/slides/node_modules/@types/node/test.d.ts +0 -2163
  193. package/slides/node_modules/@types/node/timers/promises.d.ts +0 -108
  194. package/slides/node_modules/@types/node/timers.d.ts +0 -287
  195. package/slides/node_modules/@types/node/tls.d.ts +0 -1319
  196. package/slides/node_modules/@types/node/trace_events.d.ts +0 -197
  197. package/slides/node_modules/@types/node/ts5.6/buffer.buffer.d.ts +0 -468
  198. package/slides/node_modules/@types/node/ts5.6/globals.typedarray.d.ts +0 -34
  199. package/slides/node_modules/@types/node/ts5.6/index.d.ts +0 -97
  200. package/slides/node_modules/@types/node/tty.d.ts +0 -208
  201. package/slides/node_modules/@types/node/url.d.ts +0 -984
  202. package/slides/node_modules/@types/node/util.d.ts +0 -2606
  203. package/slides/node_modules/@types/node/v8.d.ts +0 -920
  204. package/slides/node_modules/@types/node/vm.d.ts +0 -1000
  205. package/slides/node_modules/@types/node/wasi.d.ts +0 -181
  206. package/slides/node_modules/@types/node/web-globals/abortcontroller.d.ts +0 -34
  207. package/slides/node_modules/@types/node/web-globals/domexception.d.ts +0 -68
  208. package/slides/node_modules/@types/node/web-globals/events.d.ts +0 -97
  209. package/slides/node_modules/@types/node/web-globals/fetch.d.ts +0 -55
  210. package/slides/node_modules/@types/node/web-globals/navigator.d.ts +0 -22
  211. package/slides/node_modules/@types/node/web-globals/storage.d.ts +0 -24
  212. package/slides/node_modules/@types/node/worker_threads.d.ts +0 -784
  213. package/slides/node_modules/@types/node/zlib.d.ts +0 -747
  214. package/slides/node_modules/base64-js/LICENSE +0 -21
  215. package/slides/node_modules/base64-js/README.md +0 -34
  216. package/slides/node_modules/base64-js/base64js.min.js +0 -1
  217. package/slides/node_modules/base64-js/index.d.ts +0 -3
  218. package/slides/node_modules/base64-js/index.js +0 -150
  219. package/slides/node_modules/base64-js/package.json +0 -47
  220. package/slides/node_modules/bl/.travis.yml +0 -17
  221. package/slides/node_modules/bl/BufferList.js +0 -396
  222. package/slides/node_modules/bl/LICENSE.md +0 -13
  223. package/slides/node_modules/bl/README.md +0 -247
  224. package/slides/node_modules/bl/bl.js +0 -84
  225. package/slides/node_modules/bl/node_modules/readable-stream/CONTRIBUTING.md +0 -38
  226. package/slides/node_modules/bl/node_modules/readable-stream/GOVERNANCE.md +0 -136
  227. package/slides/node_modules/bl/node_modules/readable-stream/LICENSE +0 -47
  228. package/slides/node_modules/bl/node_modules/readable-stream/README.md +0 -106
  229. package/slides/node_modules/bl/node_modules/readable-stream/errors-browser.js +0 -127
  230. package/slides/node_modules/bl/node_modules/readable-stream/errors.js +0 -116
  231. package/slides/node_modules/bl/node_modules/readable-stream/experimentalWarning.js +0 -17
  232. package/slides/node_modules/bl/node_modules/readable-stream/lib/_stream_duplex.js +0 -126
  233. package/slides/node_modules/bl/node_modules/readable-stream/lib/_stream_passthrough.js +0 -37
  234. package/slides/node_modules/bl/node_modules/readable-stream/lib/_stream_readable.js +0 -1027
  235. package/slides/node_modules/bl/node_modules/readable-stream/lib/_stream_transform.js +0 -190
  236. package/slides/node_modules/bl/node_modules/readable-stream/lib/_stream_writable.js +0 -641
  237. package/slides/node_modules/bl/node_modules/readable-stream/lib/internal/streams/async_iterator.js +0 -180
  238. package/slides/node_modules/bl/node_modules/readable-stream/lib/internal/streams/buffer_list.js +0 -183
  239. package/slides/node_modules/bl/node_modules/readable-stream/lib/internal/streams/destroy.js +0 -96
  240. package/slides/node_modules/bl/node_modules/readable-stream/lib/internal/streams/end-of-stream.js +0 -86
  241. package/slides/node_modules/bl/node_modules/readable-stream/lib/internal/streams/from-browser.js +0 -3
  242. package/slides/node_modules/bl/node_modules/readable-stream/lib/internal/streams/from.js +0 -52
  243. package/slides/node_modules/bl/node_modules/readable-stream/lib/internal/streams/pipeline.js +0 -86
  244. package/slides/node_modules/bl/node_modules/readable-stream/lib/internal/streams/state.js +0 -22
  245. package/slides/node_modules/bl/node_modules/readable-stream/lib/internal/streams/stream-browser.js +0 -1
  246. package/slides/node_modules/bl/node_modules/readable-stream/lib/internal/streams/stream.js +0 -1
  247. package/slides/node_modules/bl/node_modules/readable-stream/package.json +0 -68
  248. package/slides/node_modules/bl/node_modules/readable-stream/readable-browser.js +0 -9
  249. package/slides/node_modules/bl/node_modules/readable-stream/readable.js +0 -16
  250. package/slides/node_modules/bl/package.json +0 -37
  251. package/slides/node_modules/bl/test/convert.js +0 -21
  252. package/slides/node_modules/bl/test/indexOf.js +0 -492
  253. package/slides/node_modules/bl/test/isBufferList.js +0 -32
  254. package/slides/node_modules/bl/test/test.js +0 -869
  255. package/slides/node_modules/buffer/AUTHORS.md +0 -70
  256. package/slides/node_modules/buffer/LICENSE +0 -21
  257. package/slides/node_modules/buffer/README.md +0 -410
  258. package/slides/node_modules/buffer/index.d.ts +0 -186
  259. package/slides/node_modules/buffer/index.js +0 -1817
  260. package/slides/node_modules/buffer/package.json +0 -96
  261. package/slides/node_modules/canvas/Readme.md +0 -657
  262. package/slides/node_modules/canvas/binding.gyp +0 -229
  263. package/slides/node_modules/canvas/browser.js +0 -31
  264. package/slides/node_modules/canvas/build/Makefile +0 -347
  265. package/slides/node_modules/canvas/build/Release/canvas.node +0 -0
  266. package/slides/node_modules/canvas/build/Release/libX11.6.dylib +0 -0
  267. package/slides/node_modules/canvas/build/Release/libXau.6.dylib +0 -0
  268. package/slides/node_modules/canvas/build/Release/libXdmcp.6.dylib +0 -0
  269. package/slides/node_modules/canvas/build/Release/libXext.6.dylib +0 -0
  270. package/slides/node_modules/canvas/build/Release/libXrender.1.dylib +0 -0
  271. package/slides/node_modules/canvas/build/Release/libcairo-gobject.2.dylib +0 -0
  272. package/slides/node_modules/canvas/build/Release/libcairo.2.dylib +0 -0
  273. package/slides/node_modules/canvas/build/Release/libdatrie.1.dylib +0 -0
  274. package/slides/node_modules/canvas/build/Release/libfontconfig.1.dylib +0 -0
  275. package/slides/node_modules/canvas/build/Release/libfreetype.6.dylib +0 -0
  276. package/slides/node_modules/canvas/build/Release/libfribidi.0.dylib +0 -0
  277. package/slides/node_modules/canvas/build/Release/libgdk_pixbuf-2.0.0.dylib +0 -0
  278. package/slides/node_modules/canvas/build/Release/libgif.7.2.0.dylib +0 -0
  279. package/slides/node_modules/canvas/build/Release/libgio-2.0.0.dylib +0 -0
  280. package/slides/node_modules/canvas/build/Release/libglib-2.0.0.dylib +0 -0
  281. package/slides/node_modules/canvas/build/Release/libgmodule-2.0.0.dylib +0 -0
  282. package/slides/node_modules/canvas/build/Release/libgobject-2.0.0.dylib +0 -0
  283. package/slides/node_modules/canvas/build/Release/libgraphite2.3.2.1.dylib +0 -0
  284. package/slides/node_modules/canvas/build/Release/libharfbuzz.0.dylib +0 -0
  285. package/slides/node_modules/canvas/build/Release/libintl.8.dylib +0 -0
  286. package/slides/node_modules/canvas/build/Release/libjpeg.8.3.2.dylib +0 -0
  287. package/slides/node_modules/canvas/build/Release/libpango-1.0.0.dylib +0 -0
  288. package/slides/node_modules/canvas/build/Release/libpangocairo-1.0.0.dylib +0 -0
  289. package/slides/node_modules/canvas/build/Release/libpangoft2-1.0.0.dylib +0 -0
  290. package/slides/node_modules/canvas/build/Release/libpcre2-8.0.dylib +0 -0
  291. package/slides/node_modules/canvas/build/Release/libpixman-1.0.dylib +0 -0
  292. package/slides/node_modules/canvas/build/Release/libpng16.16.dylib +0 -0
  293. package/slides/node_modules/canvas/build/Release/librsvg-2.2.dylib +0 -0
  294. package/slides/node_modules/canvas/build/Release/libthai.0.dylib +0 -0
  295. package/slides/node_modules/canvas/build/Release/libxcb-render.0.0.0.dylib +0 -0
  296. package/slides/node_modules/canvas/build/Release/libxcb-shm.0.0.0.dylib +0 -0
  297. package/slides/node_modules/canvas/build/Release/libxcb.1.1.0.dylib +0 -0
  298. package/slides/node_modules/canvas/build/binding.Makefile +0 -6
  299. package/slides/node_modules/canvas/build/canvas.target.mk +0 -299
  300. package/slides/node_modules/canvas/build/gyp-mac-tool +0 -766
  301. package/slides/node_modules/canvas/index.d.ts +0 -507
  302. package/slides/node_modules/canvas/index.js +0 -94
  303. package/slides/node_modules/canvas/lib/DOMMatrix.js +0 -678
  304. package/slides/node_modules/canvas/lib/bindings.js +0 -43
  305. package/slides/node_modules/canvas/lib/canvas.js +0 -113
  306. package/slides/node_modules/canvas/lib/context2d.js +0 -11
  307. package/slides/node_modules/canvas/lib/image.js +0 -97
  308. package/slides/node_modules/canvas/lib/jpegstream.js +0 -41
  309. package/slides/node_modules/canvas/lib/pattern.js +0 -15
  310. package/slides/node_modules/canvas/lib/pdfstream.js +0 -35
  311. package/slides/node_modules/canvas/lib/pngstream.js +0 -42
  312. package/slides/node_modules/canvas/package.json +0 -71
  313. package/slides/node_modules/canvas/src/Backends.h +0 -9
  314. package/slides/node_modules/canvas/src/Canvas.cc +0 -1026
  315. package/slides/node_modules/canvas/src/Canvas.h +0 -128
  316. package/slides/node_modules/canvas/src/CanvasError.h +0 -37
  317. package/slides/node_modules/canvas/src/CanvasGradient.cc +0 -113
  318. package/slides/node_modules/canvas/src/CanvasGradient.h +0 -20
  319. package/slides/node_modules/canvas/src/CanvasPattern.cc +0 -129
  320. package/slides/node_modules/canvas/src/CanvasPattern.h +0 -33
  321. package/slides/node_modules/canvas/src/CanvasRenderingContext2d.cc +0 -3527
  322. package/slides/node_modules/canvas/src/CanvasRenderingContext2d.h +0 -238
  323. package/slides/node_modules/canvas/src/CharData.h +0 -233
  324. package/slides/node_modules/canvas/src/FontParser.cc +0 -605
  325. package/slides/node_modules/canvas/src/FontParser.h +0 -115
  326. package/slides/node_modules/canvas/src/Image.cc +0 -1719
  327. package/slides/node_modules/canvas/src/Image.h +0 -146
  328. package/slides/node_modules/canvas/src/ImageData.cc +0 -138
  329. package/slides/node_modules/canvas/src/ImageData.h +0 -26
  330. package/slides/node_modules/canvas/src/InstanceData.h +0 -12
  331. package/slides/node_modules/canvas/src/JPEGStream.h +0 -157
  332. package/slides/node_modules/canvas/src/PNG.h +0 -292
  333. package/slides/node_modules/canvas/src/Point.h +0 -11
  334. package/slides/node_modules/canvas/src/Util.h +0 -9
  335. package/slides/node_modules/canvas/src/bmp/BMPParser.cc +0 -459
  336. package/slides/node_modules/canvas/src/bmp/BMPParser.h +0 -60
  337. package/slides/node_modules/canvas/src/bmp/LICENSE.md +0 -24
  338. package/slides/node_modules/canvas/src/closure.cc +0 -52
  339. package/slides/node_modules/canvas/src/closure.h +0 -98
  340. package/slides/node_modules/canvas/src/color.cc +0 -796
  341. package/slides/node_modules/canvas/src/color.h +0 -30
  342. package/slides/node_modules/canvas/src/dll_visibility.h +0 -20
  343. package/slides/node_modules/canvas/src/init.cc +0 -114
  344. package/slides/node_modules/canvas/src/register_font.cc +0 -352
  345. package/slides/node_modules/canvas/src/register_font.h +0 -7
  346. package/slides/node_modules/canvas/util/has_lib.js +0 -119
  347. package/slides/node_modules/canvas/util/win_jpeg_lookup.js +0 -21
  348. package/slides/node_modules/chownr/LICENSE +0 -15
  349. package/slides/node_modules/chownr/README.md +0 -3
  350. package/slides/node_modules/chownr/chownr.js +0 -167
  351. package/slides/node_modules/chownr/package.json +0 -29
  352. package/slides/node_modules/core-util-is/LICENSE +0 -19
  353. package/slides/node_modules/core-util-is/README.md +0 -3
  354. package/slides/node_modules/core-util-is/lib/util.js +0 -107
  355. package/slides/node_modules/core-util-is/package.json +0 -38
  356. package/slides/node_modules/decompress-response/index.d.ts +0 -22
  357. package/slides/node_modules/decompress-response/index.js +0 -58
  358. package/slides/node_modules/decompress-response/license +0 -9
  359. package/slides/node_modules/decompress-response/package.json +0 -56
  360. package/slides/node_modules/decompress-response/readme.md +0 -48
  361. package/slides/node_modules/deep-extend/CHANGELOG.md +0 -46
  362. package/slides/node_modules/deep-extend/LICENSE +0 -20
  363. package/slides/node_modules/deep-extend/README.md +0 -91
  364. package/slides/node_modules/deep-extend/index.js +0 -1
  365. package/slides/node_modules/deep-extend/lib/deep-extend.js +0 -150
  366. package/slides/node_modules/deep-extend/package.json +0 -62
  367. package/slides/node_modules/detect-libc/LICENSE +0 -201
  368. package/slides/node_modules/detect-libc/README.md +0 -163
  369. package/slides/node_modules/detect-libc/index.d.ts +0 -14
  370. package/slides/node_modules/detect-libc/lib/detect-libc.js +0 -313
  371. package/slides/node_modules/detect-libc/lib/elf.js +0 -39
  372. package/slides/node_modules/detect-libc/lib/filesystem.js +0 -51
  373. package/slides/node_modules/detect-libc/lib/process.js +0 -24
  374. package/slides/node_modules/detect-libc/package.json +0 -44
  375. package/slides/node_modules/end-of-stream/LICENSE +0 -21
  376. package/slides/node_modules/end-of-stream/README.md +0 -54
  377. package/slides/node_modules/end-of-stream/index.js +0 -96
  378. package/slides/node_modules/end-of-stream/package.json +0 -37
  379. package/slides/node_modules/expand-template/.travis.yml +0 -6
  380. package/slides/node_modules/expand-template/LICENSE +0 -21
  381. package/slides/node_modules/expand-template/README.md +0 -43
  382. package/slides/node_modules/expand-template/index.js +0 -26
  383. package/slides/node_modules/expand-template/package.json +0 -29
  384. package/slides/node_modules/expand-template/test.js +0 -67
  385. package/slides/node_modules/fs-constants/LICENSE +0 -21
  386. package/slides/node_modules/fs-constants/README.md +0 -26
  387. package/slides/node_modules/fs-constants/browser.js +0 -1
  388. package/slides/node_modules/fs-constants/index.js +0 -1
  389. package/slides/node_modules/fs-constants/package.json +0 -19
  390. package/slides/node_modules/github-from-package/.travis.yml +0 -4
  391. package/slides/node_modules/github-from-package/LICENSE +0 -18
  392. package/slides/node_modules/github-from-package/example/package.json +0 -8
  393. package/slides/node_modules/github-from-package/example/url.js +0 -3
  394. package/slides/node_modules/github-from-package/index.js +0 -17
  395. package/slides/node_modules/github-from-package/package.json +0 -30
  396. package/slides/node_modules/github-from-package/readme.markdown +0 -53
  397. package/slides/node_modules/github-from-package/test/a.json +0 -8
  398. package/slides/node_modules/github-from-package/test/b.json +0 -5
  399. package/slides/node_modules/github-from-package/test/c.json +0 -5
  400. package/slides/node_modules/github-from-package/test/d.json +0 -7
  401. package/slides/node_modules/github-from-package/test/e.json +0 -5
  402. package/slides/node_modules/github-from-package/test/url.js +0 -19
  403. package/slides/node_modules/https/package.json +0 -15
  404. package/slides/node_modules/ieee754/LICENSE +0 -11
  405. package/slides/node_modules/ieee754/README.md +0 -51
  406. package/slides/node_modules/ieee754/index.d.ts +0 -10
  407. package/slides/node_modules/ieee754/index.js +0 -85
  408. package/slides/node_modules/ieee754/package.json +0 -52
  409. package/slides/node_modules/image-size/LICENSE +0 -9
  410. package/slides/node_modules/image-size/Readme.md +0 -184
  411. package/slides/node_modules/image-size/bin/image-size.js +0 -53
  412. package/slides/node_modules/image-size/dist/detector.d.ts +0 -2
  413. package/slides/node_modules/image-size/dist/detector.js +0 -30
  414. package/slides/node_modules/image-size/dist/index.d.ts +0 -10
  415. package/slides/node_modules/image-size/dist/index.js +0 -129
  416. package/slides/node_modules/image-size/dist/types/bmp.d.ts +0 -2
  417. package/slides/node_modules/image-size/dist/types/bmp.js +0 -11
  418. package/slides/node_modules/image-size/dist/types/cur.d.ts +0 -2
  419. package/slides/node_modules/image-size/dist/types/cur.js +0 -17
  420. package/slides/node_modules/image-size/dist/types/dds.d.ts +0 -2
  421. package/slides/node_modules/image-size/dist/types/dds.js +0 -11
  422. package/slides/node_modules/image-size/dist/types/gif.d.ts +0 -2
  423. package/slides/node_modules/image-size/dist/types/gif.js +0 -12
  424. package/slides/node_modules/image-size/dist/types/heif.d.ts +0 -2
  425. package/slides/node_modules/image-size/dist/types/heif.js +0 -40
  426. package/slides/node_modules/image-size/dist/types/icns.d.ts +0 -2
  427. package/slides/node_modules/image-size/dist/types/icns.js +0 -101
  428. package/slides/node_modules/image-size/dist/types/ico.d.ts +0 -2
  429. package/slides/node_modules/image-size/dist/types/ico.js +0 -68
  430. package/slides/node_modules/image-size/dist/types/index.d.ts +0 -23
  431. package/slides/node_modules/image-size/dist/types/index.js +0 -46
  432. package/slides/node_modules/image-size/dist/types/interface.d.ts +0 -13
  433. package/slides/node_modules/image-size/dist/types/interface.js +0 -2
  434. package/slides/node_modules/image-size/dist/types/j2c.d.ts +0 -2
  435. package/slides/node_modules/image-size/dist/types/j2c.js +0 -12
  436. package/slides/node_modules/image-size/dist/types/jp2.d.ts +0 -2
  437. package/slides/node_modules/image-size/dist/types/jp2.js +0 -27
  438. package/slides/node_modules/image-size/dist/types/jpg.d.ts +0 -2
  439. package/slides/node_modules/image-size/dist/types/jpg.js +0 -123
  440. package/slides/node_modules/image-size/dist/types/jxl-stream.d.ts +0 -2
  441. package/slides/node_modules/image-size/dist/types/jxl-stream.js +0 -45
  442. package/slides/node_modules/image-size/dist/types/jxl.d.ts +0 -2
  443. package/slides/node_modules/image-size/dist/types/jxl.js +0 -59
  444. package/slides/node_modules/image-size/dist/types/ktx.d.ts +0 -2
  445. package/slides/node_modules/image-size/dist/types/ktx.js +0 -19
  446. package/slides/node_modules/image-size/dist/types/png.d.ts +0 -2
  447. package/slides/node_modules/image-size/dist/types/png.js +0 -35
  448. package/slides/node_modules/image-size/dist/types/pnm.d.ts +0 -2
  449. package/slides/node_modules/image-size/dist/types/pnm.js +0 -72
  450. package/slides/node_modules/image-size/dist/types/psd.d.ts +0 -2
  451. package/slides/node_modules/image-size/dist/types/psd.js +0 -11
  452. package/slides/node_modules/image-size/dist/types/svg.d.ts +0 -2
  453. package/slides/node_modules/image-size/dist/types/svg.js +0 -90
  454. package/slides/node_modules/image-size/dist/types/tga.d.ts +0 -2
  455. package/slides/node_modules/image-size/dist/types/tga.js +0 -15
  456. package/slides/node_modules/image-size/dist/types/tiff.d.ts +0 -2
  457. package/slides/node_modules/image-size/dist/types/tiff.js +0 -95
  458. package/slides/node_modules/image-size/dist/types/utils.d.ts +0 -15
  459. package/slides/node_modules/image-size/dist/types/utils.js +0 -75
  460. package/slides/node_modules/image-size/dist/types/webp.d.ts +0 -2
  461. package/slides/node_modules/image-size/dist/types/webp.js +0 -60
  462. package/slides/node_modules/image-size/dist/utils/bit-reader.d.ts +0 -10
  463. package/slides/node_modules/image-size/dist/utils/bit-reader.js +0 -44
  464. package/slides/node_modules/image-size/package.json +0 -81
  465. package/slides/node_modules/immediate/LICENSE.txt +0 -20
  466. package/slides/node_modules/immediate/README.md +0 -93
  467. package/slides/node_modules/immediate/dist/immediate.js +0 -75
  468. package/slides/node_modules/immediate/dist/immediate.min.js +0 -1
  469. package/slides/node_modules/immediate/lib/browser.js +0 -69
  470. package/slides/node_modules/immediate/lib/index.js +0 -73
  471. package/slides/node_modules/immediate/package.json +0 -42
  472. package/slides/node_modules/inherits/LICENSE +0 -16
  473. package/slides/node_modules/inherits/README.md +0 -42
  474. package/slides/node_modules/inherits/inherits.js +0 -9
  475. package/slides/node_modules/inherits/inherits_browser.js +0 -27
  476. package/slides/node_modules/inherits/package.json +0 -29
  477. package/slides/node_modules/ini/LICENSE +0 -15
  478. package/slides/node_modules/ini/README.md +0 -102
  479. package/slides/node_modules/ini/ini.js +0 -206
  480. package/slides/node_modules/ini/package.json +0 -33
  481. package/slides/node_modules/isarray/.travis.yml +0 -4
  482. package/slides/node_modules/isarray/Makefile +0 -6
  483. package/slides/node_modules/isarray/README.md +0 -60
  484. package/slides/node_modules/isarray/component.json +0 -19
  485. package/slides/node_modules/isarray/index.js +0 -5
  486. package/slides/node_modules/isarray/package.json +0 -45
  487. package/slides/node_modules/isarray/test.js +0 -20
  488. package/slides/node_modules/jszip/.codeclimate.yml +0 -16
  489. package/slides/node_modules/jszip/.editorconfig +0 -8
  490. package/slides/node_modules/jszip/.eslintrc.js +0 -43
  491. package/slides/node_modules/jszip/.github/workflows/pr.yaml +0 -58
  492. package/slides/node_modules/jszip/.jekyll-metadata +0 -0
  493. package/slides/node_modules/jszip/.travis.yml +0 -17
  494. package/slides/node_modules/jszip/CHANGES.md +0 -204
  495. package/slides/node_modules/jszip/LICENSE.markdown +0 -651
  496. package/slides/node_modules/jszip/README.markdown +0 -33
  497. package/slides/node_modules/jszip/deps.js +0 -37
  498. package/slides/node_modules/jszip/dist/jszip.js +0 -11577
  499. package/slides/node_modules/jszip/dist/jszip.min.js +0 -13
  500. package/slides/node_modules/jszip/graph.svg +0 -601
  501. package/slides/node_modules/jszip/index.d.ts +0 -330
  502. package/slides/node_modules/jszip/lib/base64.js +0 -106
  503. package/slides/node_modules/jszip/lib/compressedObject.js +0 -74
  504. package/slides/node_modules/jszip/lib/compressions.js +0 -14
  505. package/slides/node_modules/jszip/lib/crc32.js +0 -77
  506. package/slides/node_modules/jszip/lib/defaults.js +0 -11
  507. package/slides/node_modules/jszip/lib/external.js +0 -18
  508. package/slides/node_modules/jszip/lib/flate.js +0 -85
  509. package/slides/node_modules/jszip/lib/generate/ZipFileWorker.js +0 -539
  510. package/slides/node_modules/jszip/lib/generate/index.js +0 -57
  511. package/slides/node_modules/jszip/lib/index.js +0 -55
  512. package/slides/node_modules/jszip/lib/license_header.js +0 -11
  513. package/slides/node_modules/jszip/lib/load.js +0 -88
  514. package/slides/node_modules/jszip/lib/nodejs/NodejsStreamInputAdapter.js +0 -74
  515. package/slides/node_modules/jszip/lib/nodejs/NodejsStreamOutputAdapter.js +0 -42
  516. package/slides/node_modules/jszip/lib/nodejsUtils.js +0 -57
  517. package/slides/node_modules/jszip/lib/object.js +0 -384
  518. package/slides/node_modules/jszip/lib/readable-stream-browser.js +0 -10
  519. package/slides/node_modules/jszip/lib/reader/ArrayReader.js +0 -57
  520. package/slides/node_modules/jszip/lib/reader/DataReader.js +0 -116
  521. package/slides/node_modules/jszip/lib/reader/NodeBufferReader.js +0 -19
  522. package/slides/node_modules/jszip/lib/reader/StringReader.js +0 -38
  523. package/slides/node_modules/jszip/lib/reader/Uint8ArrayReader.js +0 -22
  524. package/slides/node_modules/jszip/lib/reader/readerFor.js +0 -28
  525. package/slides/node_modules/jszip/lib/signature.js +0 -7
  526. package/slides/node_modules/jszip/lib/stream/ConvertWorker.js +0 -26
  527. package/slides/node_modules/jszip/lib/stream/Crc32Probe.js +0 -24
  528. package/slides/node_modules/jszip/lib/stream/DataLengthProbe.js +0 -29
  529. package/slides/node_modules/jszip/lib/stream/DataWorker.js +0 -116
  530. package/slides/node_modules/jszip/lib/stream/GenericWorker.js +0 -263
  531. package/slides/node_modules/jszip/lib/stream/StreamHelper.js +0 -214
  532. package/slides/node_modules/jszip/lib/support.js +0 -38
  533. package/slides/node_modules/jszip/lib/utf8.js +0 -275
  534. package/slides/node_modules/jszip/lib/utils.js +0 -501
  535. package/slides/node_modules/jszip/lib/zipEntries.js +0 -261
  536. package/slides/node_modules/jszip/lib/zipEntry.js +0 -293
  537. package/slides/node_modules/jszip/lib/zipObject.js +0 -133
  538. package/slides/node_modules/jszip/package.json +0 -67
  539. package/slides/node_modules/jszip/sponsors.md +0 -21
  540. package/slides/node_modules/jszip/tsconfig.json +0 -101
  541. package/slides/node_modules/jszip/vendor/FileSaver.js +0 -247
  542. package/slides/node_modules/lie/README.md +0 -62
  543. package/slides/node_modules/lie/dist/lie.js +0 -350
  544. package/slides/node_modules/lie/dist/lie.min.js +0 -1
  545. package/slides/node_modules/lie/dist/lie.polyfill.js +0 -358
  546. package/slides/node_modules/lie/dist/lie.polyfill.min.js +0 -1
  547. package/slides/node_modules/lie/lib/browser.js +0 -273
  548. package/slides/node_modules/lie/lib/index.js +0 -298
  549. package/slides/node_modules/lie/license.md +0 -7
  550. package/slides/node_modules/lie/lie.d.ts +0 -244
  551. package/slides/node_modules/lie/package.json +0 -69
  552. package/slides/node_modules/lie/polyfill.js +0 -4
  553. package/slides/node_modules/mimic-response/index.d.ts +0 -17
  554. package/slides/node_modules/mimic-response/index.js +0 -77
  555. package/slides/node_modules/mimic-response/license +0 -9
  556. package/slides/node_modules/mimic-response/package.json +0 -42
  557. package/slides/node_modules/mimic-response/readme.md +0 -78
  558. package/slides/node_modules/minimist/.eslintrc +0 -29
  559. package/slides/node_modules/minimist/.github/FUNDING.yml +0 -12
  560. package/slides/node_modules/minimist/.nycrc +0 -14
  561. package/slides/node_modules/minimist/CHANGELOG.md +0 -298
  562. package/slides/node_modules/minimist/LICENSE +0 -18
  563. package/slides/node_modules/minimist/README.md +0 -121
  564. package/slides/node_modules/minimist/example/parse.js +0 -4
  565. package/slides/node_modules/minimist/index.js +0 -263
  566. package/slides/node_modules/minimist/package.json +0 -75
  567. package/slides/node_modules/minimist/test/all_bool.js +0 -34
  568. package/slides/node_modules/minimist/test/bool.js +0 -177
  569. package/slides/node_modules/minimist/test/dash.js +0 -43
  570. package/slides/node_modules/minimist/test/default_bool.js +0 -37
  571. package/slides/node_modules/minimist/test/dotted.js +0 -24
  572. package/slides/node_modules/minimist/test/kv_short.js +0 -32
  573. package/slides/node_modules/minimist/test/long.js +0 -33
  574. package/slides/node_modules/minimist/test/num.js +0 -38
  575. package/slides/node_modules/minimist/test/parse.js +0 -209
  576. package/slides/node_modules/minimist/test/parse_modified.js +0 -11
  577. package/slides/node_modules/minimist/test/proto.js +0 -64
  578. package/slides/node_modules/minimist/test/short.js +0 -69
  579. package/slides/node_modules/minimist/test/stop_early.js +0 -17
  580. package/slides/node_modules/minimist/test/unknown.js +0 -104
  581. package/slides/node_modules/minimist/test/whitespace.js +0 -10
  582. package/slides/node_modules/mkdirp-classic/LICENSE +0 -21
  583. package/slides/node_modules/mkdirp-classic/README.md +0 -18
  584. package/slides/node_modules/mkdirp-classic/index.js +0 -98
  585. package/slides/node_modules/mkdirp-classic/package.json +0 -18
  586. package/slides/node_modules/napi-build-utils/.github/workflows/run-npm-tests.yml +0 -31
  587. package/slides/node_modules/napi-build-utils/LICENSE +0 -21
  588. package/slides/node_modules/napi-build-utils/README.md +0 -52
  589. package/slides/node_modules/napi-build-utils/index.js +0 -214
  590. package/slides/node_modules/napi-build-utils/index.md +0 -0
  591. package/slides/node_modules/napi-build-utils/package.json +0 -42
  592. package/slides/node_modules/node-abi/LICENSE +0 -21
  593. package/slides/node_modules/node-abi/README.md +0 -54
  594. package/slides/node_modules/node-abi/abi_registry.json +0 -439
  595. package/slides/node_modules/node-abi/index.js +0 -179
  596. package/slides/node_modules/node-abi/package.json +0 -45
  597. package/slides/node_modules/node-addon-api/LICENSE.md +0 -9
  598. package/slides/node_modules/node-addon-api/README.md +0 -319
  599. package/slides/node_modules/node-addon-api/common.gypi +0 -20
  600. package/slides/node_modules/node-addon-api/except.gypi +0 -25
  601. package/slides/node_modules/node-addon-api/index.js +0 -12
  602. package/slides/node_modules/node-addon-api/napi-inl.deprecated.h +0 -186
  603. package/slides/node_modules/node-addon-api/napi-inl.h +0 -6607
  604. package/slides/node_modules/node-addon-api/napi.h +0 -3201
  605. package/slides/node_modules/node-addon-api/node_addon_api.gyp +0 -32
  606. package/slides/node_modules/node-addon-api/node_api.gyp +0 -9
  607. package/slides/node_modules/node-addon-api/noexcept.gypi +0 -26
  608. package/slides/node_modules/node-addon-api/nothing.c +0 -0
  609. package/slides/node_modules/node-addon-api/package-support.json +0 -21
  610. package/slides/node_modules/node-addon-api/package.json +0 -480
  611. package/slides/node_modules/node-addon-api/tools/README.md +0 -73
  612. package/slides/node_modules/node-addon-api/tools/check-napi.js +0 -99
  613. package/slides/node_modules/node-addon-api/tools/clang-format.js +0 -71
  614. package/slides/node_modules/node-addon-api/tools/conversion.js +0 -301
  615. package/slides/node_modules/node-addon-api/tools/eslint-format.js +0 -79
  616. package/slides/node_modules/once/LICENSE +0 -15
  617. package/slides/node_modules/once/README.md +0 -79
  618. package/slides/node_modules/once/once.js +0 -42
  619. package/slides/node_modules/once/package.json +0 -33
  620. package/slides/node_modules/pako/CHANGELOG.md +0 -164
  621. package/slides/node_modules/pako/LICENSE +0 -21
  622. package/slides/node_modules/pako/README.md +0 -191
  623. package/slides/node_modules/pako/dist/pako.js +0 -6818
  624. package/slides/node_modules/pako/dist/pako.min.js +0 -1
  625. package/slides/node_modules/pako/dist/pako_deflate.js +0 -3997
  626. package/slides/node_modules/pako/dist/pako_deflate.min.js +0 -1
  627. package/slides/node_modules/pako/dist/pako_inflate.js +0 -3300
  628. package/slides/node_modules/pako/dist/pako_inflate.min.js +0 -1
  629. package/slides/node_modules/pako/index.js +0 -14
  630. package/slides/node_modules/pako/lib/deflate.js +0 -400
  631. package/slides/node_modules/pako/lib/inflate.js +0 -423
  632. package/slides/node_modules/pako/lib/utils/common.js +0 -105
  633. package/slides/node_modules/pako/lib/utils/strings.js +0 -187
  634. package/slides/node_modules/pako/lib/zlib/README +0 -59
  635. package/slides/node_modules/pako/lib/zlib/adler32.js +0 -51
  636. package/slides/node_modules/pako/lib/zlib/constants.js +0 -68
  637. package/slides/node_modules/pako/lib/zlib/crc32.js +0 -59
  638. package/slides/node_modules/pako/lib/zlib/deflate.js +0 -1874
  639. package/slides/node_modules/pako/lib/zlib/gzheader.js +0 -58
  640. package/slides/node_modules/pako/lib/zlib/inffast.js +0 -345
  641. package/slides/node_modules/pako/lib/zlib/inflate.js +0 -1556
  642. package/slides/node_modules/pako/lib/zlib/inftrees.js +0 -343
  643. package/slides/node_modules/pako/lib/zlib/messages.js +0 -32
  644. package/slides/node_modules/pako/lib/zlib/trees.js +0 -1222
  645. package/slides/node_modules/pako/lib/zlib/zstream.js +0 -47
  646. package/slides/node_modules/pako/package.json +0 -44
  647. package/slides/node_modules/pptxgenjs/LICENSE +0 -21
  648. package/slides/node_modules/pptxgenjs/README.md +0 -224
  649. package/slides/node_modules/pptxgenjs/dist/pptxgen.bundle.js +0 -96
  650. package/slides/node_modules/pptxgenjs/dist/pptxgen.bundle.js.map +0 -1
  651. package/slides/node_modules/pptxgenjs/dist/pptxgen.cjs.js +0 -7370
  652. package/slides/node_modules/pptxgenjs/dist/pptxgen.es.js +0 -7368
  653. package/slides/node_modules/pptxgenjs/dist/pptxgen.min.js +0 -96
  654. package/slides/node_modules/pptxgenjs/dist/pptxgen.min.js.map +0 -1
  655. package/slides/node_modules/pptxgenjs/package.json +0 -96
  656. package/slides/node_modules/pptxgenjs/types/index.d.ts +0 -2679
  657. package/slides/node_modules/prebuild-install/CHANGELOG.md +0 -131
  658. package/slides/node_modules/prebuild-install/CONTRIBUTING.md +0 -6
  659. package/slides/node_modules/prebuild-install/LICENSE +0 -21
  660. package/slides/node_modules/prebuild-install/README.md +0 -163
  661. package/slides/node_modules/prebuild-install/asset.js +0 -44
  662. package/slides/node_modules/prebuild-install/bin.js +0 -78
  663. package/slides/node_modules/prebuild-install/download.js +0 -142
  664. package/slides/node_modules/prebuild-install/error.js +0 -14
  665. package/slides/node_modules/prebuild-install/help.txt +0 -16
  666. package/slides/node_modules/prebuild-install/index.js +0 -1
  667. package/slides/node_modules/prebuild-install/log.js +0 -33
  668. package/slides/node_modules/prebuild-install/package.json +0 -67
  669. package/slides/node_modules/prebuild-install/proxy.js +0 -35
  670. package/slides/node_modules/prebuild-install/rc.js +0 -64
  671. package/slides/node_modules/prebuild-install/util.js +0 -143
  672. package/slides/node_modules/process-nextick-args/index.js +0 -45
  673. package/slides/node_modules/process-nextick-args/license.md +0 -19
  674. package/slides/node_modules/process-nextick-args/package.json +0 -25
  675. package/slides/node_modules/process-nextick-args/readme.md +0 -18
  676. package/slides/node_modules/pump/.github/FUNDING.yml +0 -2
  677. package/slides/node_modules/pump/.travis.yml +0 -5
  678. package/slides/node_modules/pump/LICENSE +0 -21
  679. package/slides/node_modules/pump/README.md +0 -74
  680. package/slides/node_modules/pump/SECURITY.md +0 -5
  681. package/slides/node_modules/pump/empty.js +0 -1
  682. package/slides/node_modules/pump/index.js +0 -86
  683. package/slides/node_modules/pump/package.json +0 -30
  684. package/slides/node_modules/pump/test-browser.js +0 -66
  685. package/slides/node_modules/pump/test-node.js +0 -53
  686. package/slides/node_modules/queue/LICENSE +0 -8
  687. package/slides/node_modules/queue/index.d.ts +0 -173
  688. package/slides/node_modules/queue/index.js +0 -195
  689. package/slides/node_modules/queue/package.json +0 -43
  690. package/slides/node_modules/queue/readme.md +0 -221
  691. package/slides/node_modules/rc/LICENSE.APACHE2 +0 -15
  692. package/slides/node_modules/rc/LICENSE.BSD +0 -26
  693. package/slides/node_modules/rc/LICENSE.MIT +0 -24
  694. package/slides/node_modules/rc/README.md +0 -227
  695. package/slides/node_modules/rc/browser.js +0 -7
  696. package/slides/node_modules/rc/cli.js +0 -4
  697. package/slides/node_modules/rc/index.js +0 -53
  698. package/slides/node_modules/rc/lib/utils.js +0 -104
  699. package/slides/node_modules/rc/package.json +0 -29
  700. package/slides/node_modules/rc/test/ini.js +0 -16
  701. package/slides/node_modules/rc/test/nested-env-vars.js +0 -50
  702. package/slides/node_modules/rc/test/test.js +0 -59
  703. package/slides/node_modules/readable-stream/.travis.yml +0 -34
  704. package/slides/node_modules/readable-stream/CONTRIBUTING.md +0 -38
  705. package/slides/node_modules/readable-stream/GOVERNANCE.md +0 -136
  706. package/slides/node_modules/readable-stream/LICENSE +0 -47
  707. package/slides/node_modules/readable-stream/README.md +0 -58
  708. package/slides/node_modules/readable-stream/doc/wg-meetings/2015-01-30.md +0 -60
  709. package/slides/node_modules/readable-stream/duplex-browser.js +0 -1
  710. package/slides/node_modules/readable-stream/duplex.js +0 -1
  711. package/slides/node_modules/readable-stream/lib/_stream_duplex.js +0 -131
  712. package/slides/node_modules/readable-stream/lib/_stream_passthrough.js +0 -47
  713. package/slides/node_modules/readable-stream/lib/_stream_readable.js +0 -1019
  714. package/slides/node_modules/readable-stream/lib/_stream_transform.js +0 -214
  715. package/slides/node_modules/readable-stream/lib/_stream_writable.js +0 -685
  716. package/slides/node_modules/readable-stream/lib/internal/streams/BufferList.js +0 -78
  717. package/slides/node_modules/readable-stream/lib/internal/streams/destroy.js +0 -84
  718. package/slides/node_modules/readable-stream/lib/internal/streams/stream-browser.js +0 -1
  719. package/slides/node_modules/readable-stream/lib/internal/streams/stream.js +0 -1
  720. package/slides/node_modules/readable-stream/package.json +0 -52
  721. package/slides/node_modules/readable-stream/passthrough.js +0 -1
  722. package/slides/node_modules/readable-stream/readable-browser.js +0 -7
  723. package/slides/node_modules/readable-stream/readable.js +0 -19
  724. package/slides/node_modules/readable-stream/transform.js +0 -1
  725. package/slides/node_modules/readable-stream/writable-browser.js +0 -1
  726. package/slides/node_modules/readable-stream/writable.js +0 -8
  727. package/slides/node_modules/safe-buffer/LICENSE +0 -21
  728. package/slides/node_modules/safe-buffer/README.md +0 -584
  729. package/slides/node_modules/safe-buffer/index.d.ts +0 -187
  730. package/slides/node_modules/safe-buffer/index.js +0 -62
  731. package/slides/node_modules/safe-buffer/package.json +0 -37
  732. package/slides/node_modules/semver/LICENSE +0 -15
  733. package/slides/node_modules/semver/README.md +0 -665
  734. package/slides/node_modules/semver/bin/semver.js +0 -191
  735. package/slides/node_modules/semver/classes/comparator.js +0 -143
  736. package/slides/node_modules/semver/classes/index.js +0 -7
  737. package/slides/node_modules/semver/classes/range.js +0 -557
  738. package/slides/node_modules/semver/classes/semver.js +0 -333
  739. package/slides/node_modules/semver/functions/clean.js +0 -8
  740. package/slides/node_modules/semver/functions/cmp.js +0 -54
  741. package/slides/node_modules/semver/functions/coerce.js +0 -62
  742. package/slides/node_modules/semver/functions/compare-build.js +0 -9
  743. package/slides/node_modules/semver/functions/compare-loose.js +0 -5
  744. package/slides/node_modules/semver/functions/compare.js +0 -7
  745. package/slides/node_modules/semver/functions/diff.js +0 -60
  746. package/slides/node_modules/semver/functions/eq.js +0 -5
  747. package/slides/node_modules/semver/functions/gt.js +0 -5
  748. package/slides/node_modules/semver/functions/gte.js +0 -5
  749. package/slides/node_modules/semver/functions/inc.js +0 -21
  750. package/slides/node_modules/semver/functions/lt.js +0 -5
  751. package/slides/node_modules/semver/functions/lte.js +0 -5
  752. package/slides/node_modules/semver/functions/major.js +0 -5
  753. package/slides/node_modules/semver/functions/minor.js +0 -5
  754. package/slides/node_modules/semver/functions/neq.js +0 -5
  755. package/slides/node_modules/semver/functions/parse.js +0 -18
  756. package/slides/node_modules/semver/functions/patch.js +0 -5
  757. package/slides/node_modules/semver/functions/prerelease.js +0 -8
  758. package/slides/node_modules/semver/functions/rcompare.js +0 -5
  759. package/slides/node_modules/semver/functions/rsort.js +0 -5
  760. package/slides/node_modules/semver/functions/satisfies.js +0 -12
  761. package/slides/node_modules/semver/functions/sort.js +0 -5
  762. package/slides/node_modules/semver/functions/valid.js +0 -8
  763. package/slides/node_modules/semver/index.js +0 -91
  764. package/slides/node_modules/semver/internal/constants.js +0 -37
  765. package/slides/node_modules/semver/internal/debug.js +0 -11
  766. package/slides/node_modules/semver/internal/identifiers.js +0 -29
  767. package/slides/node_modules/semver/internal/lrucache.js +0 -42
  768. package/slides/node_modules/semver/internal/parse-options.js +0 -17
  769. package/slides/node_modules/semver/internal/re.js +0 -223
  770. package/slides/node_modules/semver/package.json +0 -78
  771. package/slides/node_modules/semver/preload.js +0 -4
  772. package/slides/node_modules/semver/range.bnf +0 -16
  773. package/slides/node_modules/semver/ranges/gtr.js +0 -6
  774. package/slides/node_modules/semver/ranges/intersects.js +0 -9
  775. package/slides/node_modules/semver/ranges/ltr.js +0 -6
  776. package/slides/node_modules/semver/ranges/max-satisfying.js +0 -27
  777. package/slides/node_modules/semver/ranges/min-satisfying.js +0 -26
  778. package/slides/node_modules/semver/ranges/min-version.js +0 -63
  779. package/slides/node_modules/semver/ranges/outside.js +0 -82
  780. package/slides/node_modules/semver/ranges/simplify.js +0 -49
  781. package/slides/node_modules/semver/ranges/subset.js +0 -249
  782. package/slides/node_modules/semver/ranges/to-comparators.js +0 -10
  783. package/slides/node_modules/semver/ranges/valid.js +0 -13
  784. package/slides/node_modules/setimmediate/LICENSE.txt +0 -20
  785. package/slides/node_modules/setimmediate/package.json +0 -30
  786. package/slides/node_modules/setimmediate/setImmediate.js +0 -186
  787. package/slides/node_modules/simple-concat/.travis.yml +0 -3
  788. package/slides/node_modules/simple-concat/LICENSE +0 -20
  789. package/slides/node_modules/simple-concat/README.md +0 -44
  790. package/slides/node_modules/simple-concat/index.js +0 -15
  791. package/slides/node_modules/simple-concat/package.json +0 -47
  792. package/slides/node_modules/simple-concat/test/basic.js +0 -41
  793. package/slides/node_modules/simple-get/.github/dependabot.yml +0 -15
  794. package/slides/node_modules/simple-get/.github/workflows/ci.yml +0 -23
  795. package/slides/node_modules/simple-get/LICENSE +0 -20
  796. package/slides/node_modules/simple-get/README.md +0 -333
  797. package/slides/node_modules/simple-get/index.js +0 -108
  798. package/slides/node_modules/simple-get/package.json +0 -67
  799. package/slides/node_modules/string_decoder/.travis.yml +0 -50
  800. package/slides/node_modules/string_decoder/LICENSE +0 -48
  801. package/slides/node_modules/string_decoder/README.md +0 -47
  802. package/slides/node_modules/string_decoder/lib/string_decoder.js +0 -296
  803. package/slides/node_modules/string_decoder/package.json +0 -31
  804. package/slides/node_modules/strip-json-comments/index.js +0 -70
  805. package/slides/node_modules/strip-json-comments/license +0 -21
  806. package/slides/node_modules/strip-json-comments/package.json +0 -42
  807. package/slides/node_modules/strip-json-comments/readme.md +0 -64
  808. package/slides/node_modules/tar-fs/.travis.yml +0 -6
  809. package/slides/node_modules/tar-fs/LICENSE +0 -21
  810. package/slides/node_modules/tar-fs/README.md +0 -165
  811. package/slides/node_modules/tar-fs/index.js +0 -363
  812. package/slides/node_modules/tar-fs/package.json +0 -41
  813. package/slides/node_modules/tar-fs/test/fixtures/a/hello.txt +0 -1
  814. package/slides/node_modules/tar-fs/test/fixtures/b/a/test.txt +0 -1
  815. package/slides/node_modules/tar-fs/test/fixtures/d/file1 +0 -0
  816. package/slides/node_modules/tar-fs/test/fixtures/d/file2 +0 -0
  817. package/slides/node_modules/tar-fs/test/fixtures/d/sub-dir/file5 +0 -0
  818. package/slides/node_modules/tar-fs/test/fixtures/d/sub-files/file3 +0 -0
  819. package/slides/node_modules/tar-fs/test/fixtures/d/sub-files/file4 +0 -0
  820. package/slides/node_modules/tar-fs/test/fixtures/e/directory/.ignore +0 -0
  821. package/slides/node_modules/tar-fs/test/fixtures/e/file +0 -0
  822. package/slides/node_modules/tar-fs/test/fixtures/invalid.tar +0 -0
  823. package/slides/node_modules/tar-fs/test/index.js +0 -346
  824. package/slides/node_modules/tar-stream/LICENSE +0 -21
  825. package/slides/node_modules/tar-stream/README.md +0 -168
  826. package/slides/node_modules/tar-stream/extract.js +0 -257
  827. package/slides/node_modules/tar-stream/headers.js +0 -295
  828. package/slides/node_modules/tar-stream/index.js +0 -2
  829. package/slides/node_modules/tar-stream/node_modules/readable-stream/CONTRIBUTING.md +0 -38
  830. package/slides/node_modules/tar-stream/node_modules/readable-stream/GOVERNANCE.md +0 -136
  831. package/slides/node_modules/tar-stream/node_modules/readable-stream/LICENSE +0 -47
  832. package/slides/node_modules/tar-stream/node_modules/readable-stream/README.md +0 -106
  833. package/slides/node_modules/tar-stream/node_modules/readable-stream/errors-browser.js +0 -127
  834. package/slides/node_modules/tar-stream/node_modules/readable-stream/errors.js +0 -116
  835. package/slides/node_modules/tar-stream/node_modules/readable-stream/experimentalWarning.js +0 -17
  836. package/slides/node_modules/tar-stream/node_modules/readable-stream/lib/_stream_duplex.js +0 -126
  837. package/slides/node_modules/tar-stream/node_modules/readable-stream/lib/_stream_passthrough.js +0 -37
  838. package/slides/node_modules/tar-stream/node_modules/readable-stream/lib/_stream_readable.js +0 -1027
  839. package/slides/node_modules/tar-stream/node_modules/readable-stream/lib/_stream_transform.js +0 -190
  840. package/slides/node_modules/tar-stream/node_modules/readable-stream/lib/_stream_writable.js +0 -641
  841. package/slides/node_modules/tar-stream/node_modules/readable-stream/lib/internal/streams/async_iterator.js +0 -180
  842. package/slides/node_modules/tar-stream/node_modules/readable-stream/lib/internal/streams/buffer_list.js +0 -183
  843. package/slides/node_modules/tar-stream/node_modules/readable-stream/lib/internal/streams/destroy.js +0 -96
  844. package/slides/node_modules/tar-stream/node_modules/readable-stream/lib/internal/streams/end-of-stream.js +0 -86
  845. package/slides/node_modules/tar-stream/node_modules/readable-stream/lib/internal/streams/from-browser.js +0 -3
  846. package/slides/node_modules/tar-stream/node_modules/readable-stream/lib/internal/streams/from.js +0 -52
  847. package/slides/node_modules/tar-stream/node_modules/readable-stream/lib/internal/streams/pipeline.js +0 -86
  848. package/slides/node_modules/tar-stream/node_modules/readable-stream/lib/internal/streams/state.js +0 -22
  849. package/slides/node_modules/tar-stream/node_modules/readable-stream/lib/internal/streams/stream-browser.js +0 -1
  850. package/slides/node_modules/tar-stream/node_modules/readable-stream/lib/internal/streams/stream.js +0 -1
  851. package/slides/node_modules/tar-stream/node_modules/readable-stream/package.json +0 -68
  852. package/slides/node_modules/tar-stream/node_modules/readable-stream/readable-browser.js +0 -9
  853. package/slides/node_modules/tar-stream/node_modules/readable-stream/readable.js +0 -16
  854. package/slides/node_modules/tar-stream/pack.js +0 -255
  855. package/slides/node_modules/tar-stream/package.json +0 -58
  856. package/slides/node_modules/tar-stream/sandbox.js +0 -11
  857. package/slides/node_modules/tunnel-agent/LICENSE +0 -55
  858. package/slides/node_modules/tunnel-agent/README.md +0 -4
  859. package/slides/node_modules/tunnel-agent/index.js +0 -244
  860. package/slides/node_modules/tunnel-agent/package.json +0 -22
  861. package/slides/node_modules/undici-types/LICENSE +0 -21
  862. package/slides/node_modules/undici-types/README.md +0 -6
  863. package/slides/node_modules/undici-types/agent.d.ts +0 -31
  864. package/slides/node_modules/undici-types/api.d.ts +0 -43
  865. package/slides/node_modules/undici-types/balanced-pool.d.ts +0 -29
  866. package/slides/node_modules/undici-types/cache.d.ts +0 -36
  867. package/slides/node_modules/undici-types/client.d.ts +0 -108
  868. package/slides/node_modules/undici-types/connector.d.ts +0 -34
  869. package/slides/node_modules/undici-types/content-type.d.ts +0 -21
  870. package/slides/node_modules/undici-types/cookies.d.ts +0 -28
  871. package/slides/node_modules/undici-types/diagnostics-channel.d.ts +0 -66
  872. package/slides/node_modules/undici-types/dispatcher.d.ts +0 -256
  873. package/slides/node_modules/undici-types/env-http-proxy-agent.d.ts +0 -21
  874. package/slides/node_modules/undici-types/errors.d.ts +0 -149
  875. package/slides/node_modules/undici-types/eventsource.d.ts +0 -61
  876. package/slides/node_modules/undici-types/fetch.d.ts +0 -209
  877. package/slides/node_modules/undici-types/file.d.ts +0 -39
  878. package/slides/node_modules/undici-types/filereader.d.ts +0 -54
  879. package/slides/node_modules/undici-types/formdata.d.ts +0 -108
  880. package/slides/node_modules/undici-types/global-dispatcher.d.ts +0 -9
  881. package/slides/node_modules/undici-types/global-origin.d.ts +0 -7
  882. package/slides/node_modules/undici-types/handlers.d.ts +0 -15
  883. package/slides/node_modules/undici-types/header.d.ts +0 -4
  884. package/slides/node_modules/undici-types/index.d.ts +0 -71
  885. package/slides/node_modules/undici-types/interceptors.d.ts +0 -17
  886. package/slides/node_modules/undici-types/mock-agent.d.ts +0 -50
  887. package/slides/node_modules/undici-types/mock-client.d.ts +0 -25
  888. package/slides/node_modules/undici-types/mock-errors.d.ts +0 -12
  889. package/slides/node_modules/undici-types/mock-interceptor.d.ts +0 -93
  890. package/slides/node_modules/undici-types/mock-pool.d.ts +0 -25
  891. package/slides/node_modules/undici-types/package.json +0 -55
  892. package/slides/node_modules/undici-types/patch.d.ts +0 -33
  893. package/slides/node_modules/undici-types/pool-stats.d.ts +0 -19
  894. package/slides/node_modules/undici-types/pool.d.ts +0 -39
  895. package/slides/node_modules/undici-types/proxy-agent.d.ts +0 -28
  896. package/slides/node_modules/undici-types/readable.d.ts +0 -65
  897. package/slides/node_modules/undici-types/retry-agent.d.ts +0 -8
  898. package/slides/node_modules/undici-types/retry-handler.d.ts +0 -116
  899. package/slides/node_modules/undici-types/util.d.ts +0 -18
  900. package/slides/node_modules/undici-types/webidl.d.ts +0 -228
  901. package/slides/node_modules/undici-types/websocket.d.ts +0 -150
  902. package/slides/node_modules/util-deprecate/History.md +0 -16
  903. package/slides/node_modules/util-deprecate/LICENSE +0 -24
  904. package/slides/node_modules/util-deprecate/README.md +0 -53
  905. package/slides/node_modules/util-deprecate/browser.js +0 -67
  906. package/slides/node_modules/util-deprecate/node.js +0 -6
  907. package/slides/node_modules/util-deprecate/package.json +0 -27
  908. package/slides/node_modules/wrappy/LICENSE +0 -15
  909. package/slides/node_modules/wrappy/README.md +0 -36
  910. package/slides/node_modules/wrappy/package.json +0 -29
  911. package/slides/node_modules/wrappy/wrappy.js +0 -33
  912. package/slides/package-lock.json +0 -536
  913. package/slides/package.json +0 -16
  914. package/slides/slides.json +0 -238
@@ -0,0 +1,370 @@
1
+ // GROOVE — Persistent Agent Memory (Layer 7)
2
+ // FSL-1.1-Apache-2.0 — see LICENSE
3
+ //
4
+ // Four file types, all in .groove/memory/:
5
+ // - project-constraints.md Discovered project rules, do-not-touch, required patterns
6
+ // - handoff-chain/<role>.md Cumulative rotation briefs (newest first, last 10 kept)
7
+ // - agent-discoveries.jsonl Error→fix pairs (only successes stored)
8
+ // - agent-specializations.json Per-agent and per-project-role quality profiles
9
+ //
10
+ // Read by the introducer on every spawn so agent #50 knows what agent #1 learned.
11
+
12
+ import { readFileSync, writeFileSync, existsSync, mkdirSync, readdirSync, appendFileSync, statSync } from 'fs';
13
+ import { resolve } from 'path';
14
+ import { createHash } from 'crypto';
15
+
16
+ const MAX_CONSTRAINTS = 50;
17
+ const MAX_HANDOFF_ROTATIONS = 10;
18
+ const MAX_DISCOVERIES = 1000;
19
+ const HANDOFF_BRIEF_MAX_CHARS = 4000;
20
+
21
+ function hashText(text) {
22
+ return createHash('sha1').update(text.trim().toLowerCase()).digest('hex').slice(0, 12);
23
+ }
24
+
25
+ function safeName(role) {
26
+ return (role || 'unknown').replace(/[^a-zA-Z0-9_-]/g, '_').slice(0, 40);
27
+ }
28
+
29
+ function truncate(text, max) {
30
+ if (!text || text.length <= max) return text || '';
31
+ return text.slice(0, max - 3) + '...';
32
+ }
33
+
34
+ export class MemoryStore {
35
+ constructor(grooveDir) {
36
+ this.memDir = resolve(grooveDir, 'memory');
37
+ this.constraintsPath = resolve(this.memDir, 'project-constraints.md');
38
+ this.handoffDir = resolve(this.memDir, 'handoff-chain');
39
+ this.discoveriesPath = resolve(this.memDir, 'agent-discoveries.jsonl');
40
+ this.specializationsPath = resolve(this.memDir, 'agent-specializations.json');
41
+ this._ensureDirs();
42
+ }
43
+
44
+ _ensureDirs() {
45
+ try {
46
+ mkdirSync(this.memDir, { recursive: true });
47
+ mkdirSync(this.handoffDir, { recursive: true });
48
+ } catch { /* best-effort */ }
49
+ }
50
+
51
+ // --- Project Constraints ---
52
+
53
+ listConstraints() {
54
+ if (!existsSync(this.constraintsPath)) return [];
55
+ try {
56
+ const content = readFileSync(this.constraintsPath, 'utf8');
57
+ const constraints = [];
58
+ const blocks = content.split(/\n(?=- )/); // each constraint starts with "- "
59
+ for (const block of blocks) {
60
+ const m = block.match(/^- \[([a-f0-9]+)\] \*([^*]+)\* (.+)$/s);
61
+ if (m) {
62
+ constraints.push({
63
+ hash: m[1],
64
+ category: m[2].trim(),
65
+ text: m[3].trim(),
66
+ });
67
+ }
68
+ }
69
+ return constraints;
70
+ } catch {
71
+ return [];
72
+ }
73
+ }
74
+
75
+ addConstraint({ text, category = 'general' }) {
76
+ if (!text || typeof text !== 'string') return { added: false, error: 'text required' };
77
+ const trimmed = text.trim();
78
+ if (trimmed.length < 3) return { added: false, error: 'text too short' };
79
+ if (trimmed.length > 500) return { added: false, error: 'text too long (max 500 chars)' };
80
+
81
+ const hash = hashText(trimmed);
82
+ const existing = this.listConstraints();
83
+ if (existing.some((c) => c.hash === hash)) {
84
+ return { added: false, hash, reason: 'duplicate' };
85
+ }
86
+
87
+ existing.push({ hash, category, text: trimmed });
88
+ // Keep most recent MAX_CONSTRAINTS
89
+ const pruned = existing.slice(-MAX_CONSTRAINTS);
90
+ this._writeConstraints(pruned);
91
+ return { added: true, hash };
92
+ }
93
+
94
+ removeConstraint(hash) {
95
+ const existing = this.listConstraints();
96
+ const filtered = existing.filter((c) => c.hash !== hash);
97
+ if (filtered.length === existing.length) return false;
98
+ this._writeConstraints(filtered);
99
+ return true;
100
+ }
101
+
102
+ _writeConstraints(constraints) {
103
+ const lines = [
104
+ '# Project Constraints',
105
+ `*Auto-managed by GROOVE memory (Layer 7). Last updated: ${new Date().toISOString()}*`,
106
+ '',
107
+ ];
108
+ for (const c of constraints) {
109
+ lines.push(`- [${c.hash}] *${c.category}* ${c.text}`);
110
+ }
111
+ lines.push('');
112
+ try {
113
+ writeFileSync(this.constraintsPath, lines.join('\n'));
114
+ } catch { /* best-effort */ }
115
+ }
116
+
117
+ getConstraintsMarkdown(maxChars = 4000) {
118
+ const constraints = this.listConstraints();
119
+ if (constraints.length === 0) return '';
120
+ const byCategory = {};
121
+ for (const c of constraints) {
122
+ byCategory[c.category] = byCategory[c.category] || [];
123
+ byCategory[c.category].push(c.text);
124
+ }
125
+ const lines = [];
126
+ for (const [cat, items] of Object.entries(byCategory)) {
127
+ lines.push(`**${cat}:**`);
128
+ for (const item of items) lines.push(`- ${item}`);
129
+ lines.push('');
130
+ }
131
+ return truncate(lines.join('\n').trim(), maxChars);
132
+ }
133
+
134
+ // --- Handoff Chain ---
135
+
136
+ _chainPath(role) {
137
+ return resolve(this.handoffDir, `${safeName(role)}.md`);
138
+ }
139
+
140
+ getHandoffChain(role) {
141
+ const path = this._chainPath(role);
142
+ if (!existsSync(path)) return [];
143
+ try {
144
+ const content = readFileSync(path, 'utf8');
145
+ const entries = [];
146
+ // Parse entries — each starts with "## Rotation N —"
147
+ // Body includes the header + all content up to (but not including) the
148
+ // trailing --- separator and the next entry.
149
+ const blocks = content.split(/\n(?=## Rotation )/);
150
+ for (const block of blocks) {
151
+ const headerMatch = block.match(/^## Rotation (\d+) —/);
152
+ if (!headerMatch) continue;
153
+ const body = block.replace(/\n---\s*$/, '').trim();
154
+ entries.push({
155
+ rotationN: parseInt(headerMatch[1], 10),
156
+ body,
157
+ });
158
+ }
159
+ return entries;
160
+ } catch {
161
+ return [];
162
+ }
163
+ }
164
+
165
+ appendHandoffBrief(role, entry) {
166
+ if (!role || !entry) return false;
167
+ const chain = this.getHandoffChain(role);
168
+ const nextN = (chain[0]?.rotationN || 0) + 1;
169
+
170
+ const block = [
171
+ `## Rotation ${nextN} — ${entry.timestamp || new Date().toISOString()} (${entry.agentId || '?'} → ${entry.newAgentId || '?'})`,
172
+ `**Reason:** ${entry.reason || 'unknown'}`,
173
+ entry.oldTokens != null ? `**Tokens carried:** ${entry.oldTokens.toLocaleString()}` : '',
174
+ entry.contextUsage != null ? `**Context at rotation:** ${Math.round(entry.contextUsage * 100)}%` : '',
175
+ '',
176
+ '**Brief summary:**',
177
+ truncate(entry.brief || '(no brief)', HANDOFF_BRIEF_MAX_CHARS),
178
+ '',
179
+ ].filter(Boolean).join('\n');
180
+
181
+ // Prepend new entry (newest first), keep last N
182
+ const newChain = [{ rotationN: nextN, body: block }, ...chain].slice(0, MAX_HANDOFF_ROTATIONS);
183
+
184
+ const lines = [
185
+ `# ${role[0].toUpperCase() + role.slice(1)} Handoff Chain`,
186
+ `*Cumulative rotation briefs. Newest first. Last ${MAX_HANDOFF_ROTATIONS} kept.*`,
187
+ '',
188
+ ];
189
+ for (const e of newChain) {
190
+ lines.push(e.body || '');
191
+ lines.push('---');
192
+ lines.push('');
193
+ }
194
+
195
+ try {
196
+ writeFileSync(this._chainPath(role), lines.join('\n'));
197
+ return true;
198
+ } catch {
199
+ return false;
200
+ }
201
+ }
202
+
203
+ getRecentHandoffMarkdown(role, count = 3, maxChars = 4000) {
204
+ const chain = this.getHandoffChain(role);
205
+ if (chain.length === 0) return '';
206
+ const recent = chain.slice(0, count);
207
+ const out = recent.map((e) => e.body || '').join('\n\n---\n\n');
208
+ return truncate(out, maxChars);
209
+ }
210
+
211
+ listHandoffRoles() {
212
+ if (!existsSync(this.handoffDir)) return [];
213
+ try {
214
+ return readdirSync(this.handoffDir)
215
+ .filter((f) => f.endsWith('.md'))
216
+ .map((f) => f.replace(/\.md$/, ''));
217
+ } catch {
218
+ return [];
219
+ }
220
+ }
221
+
222
+ // --- Discoveries (error → fix pairs) ---
223
+
224
+ addDiscovery({ agentId, role, trigger, fix, outcome = 'success' }) {
225
+ if (!trigger || !fix) return { added: false, error: 'trigger and fix required' };
226
+ if (outcome !== 'success') return { added: false, reason: 'only successes stored' };
227
+
228
+ const entry = {
229
+ ts: new Date().toISOString(),
230
+ agentId: agentId || null,
231
+ role: role || 'unknown',
232
+ trigger: truncate(String(trigger).trim(), 300),
233
+ fix: truncate(String(fix).trim(), 500),
234
+ outcome,
235
+ };
236
+
237
+ // Dedup: same trigger+fix = skip
238
+ const existing = this.listDiscoveries({ limit: 200 });
239
+ const key = hashText(entry.trigger + '||' + entry.fix);
240
+ if (existing.some((d) => hashText(d.trigger + '||' + d.fix) === key)) {
241
+ return { added: false, reason: 'duplicate' };
242
+ }
243
+
244
+ try {
245
+ appendFileSync(this.discoveriesPath, JSON.stringify(entry) + '\n');
246
+ this._pruneDiscoveries();
247
+ return { added: true };
248
+ } catch (err) {
249
+ return { added: false, error: err.message };
250
+ }
251
+ }
252
+
253
+ listDiscoveries({ role, limit = 100 } = {}) {
254
+ if (!existsSync(this.discoveriesPath)) return [];
255
+ try {
256
+ const lines = readFileSync(this.discoveriesPath, 'utf8').split('\n').filter(Boolean);
257
+ const entries = [];
258
+ for (const line of lines) {
259
+ try {
260
+ const e = JSON.parse(line);
261
+ if (!role || e.role === role) entries.push(e);
262
+ } catch { /* skip malformed */ }
263
+ }
264
+ return entries.slice(-limit).reverse(); // newest first
265
+ } catch {
266
+ return [];
267
+ }
268
+ }
269
+
270
+ _pruneDiscoveries() {
271
+ if (!existsSync(this.discoveriesPath)) return;
272
+ try {
273
+ const stat = statSync(this.discoveriesPath);
274
+ // Only prune on larger files to avoid thrashing
275
+ if (stat.size < 50_000) return;
276
+ const lines = readFileSync(this.discoveriesPath, 'utf8').split('\n').filter(Boolean);
277
+ if (lines.length <= MAX_DISCOVERIES) return;
278
+ const kept = lines.slice(-MAX_DISCOVERIES);
279
+ writeFileSync(this.discoveriesPath, kept.join('\n') + '\n');
280
+ } catch { /* best-effort */ }
281
+ }
282
+
283
+ getDiscoveriesMarkdown(role, limit = 20, maxChars = 4000) {
284
+ const entries = this.listDiscoveries({ role, limit });
285
+ if (entries.length === 0) return '';
286
+ const lines = entries.map((d) => `- When \`${d.trigger}\` → fix: ${d.fix}`);
287
+ return truncate(lines.join('\n'), maxChars);
288
+ }
289
+
290
+ // --- Specializations ---
291
+
292
+ _loadSpecializations() {
293
+ if (!existsSync(this.specializationsPath)) {
294
+ return { perAgent: {}, perProjectRole: {} };
295
+ }
296
+ try {
297
+ const data = JSON.parse(readFileSync(this.specializationsPath, 'utf8'));
298
+ return {
299
+ perAgent: data.perAgent || {},
300
+ perProjectRole: data.perProjectRole || {},
301
+ };
302
+ } catch {
303
+ return { perAgent: {}, perProjectRole: {} };
304
+ }
305
+ }
306
+
307
+ _saveSpecializations(data) {
308
+ try {
309
+ writeFileSync(this.specializationsPath, JSON.stringify(data, null, 2));
310
+ } catch { /* best-effort */ }
311
+ }
312
+
313
+ updateSpecialization(agentId, { role, qualityScore, filesTouched, signals, threshold }) {
314
+ if (!agentId) return false;
315
+ const data = this._loadSpecializations();
316
+
317
+ const agentEntry = data.perAgent[agentId] || {
318
+ role: role || 'unknown',
319
+ sessionCount: 0,
320
+ avgQualityScore: 0,
321
+ qualityTotal: 0,
322
+ fileTouches: {},
323
+ signatureErrors: [],
324
+ };
325
+ agentEntry.sessionCount += 1;
326
+ if (typeof qualityScore === 'number') {
327
+ agentEntry.qualityTotal += qualityScore;
328
+ agentEntry.avgQualityScore = Math.round(agentEntry.qualityTotal / agentEntry.sessionCount);
329
+ }
330
+ if (Array.isArray(filesTouched)) {
331
+ for (const f of filesTouched) {
332
+ agentEntry.fileTouches[f] = (agentEntry.fileTouches[f] || 0) + 1;
333
+ }
334
+ }
335
+ if (role) agentEntry.role = role;
336
+ if (threshold != null) agentEntry.preferredThreshold = threshold;
337
+ data.perAgent[agentId] = agentEntry;
338
+
339
+ if (role) {
340
+ const roleEntry = data.perProjectRole[role] || {
341
+ sessionCount: 0,
342
+ avgQualityScore: 0,
343
+ qualityTotal: 0,
344
+ topFileChurn: {},
345
+ };
346
+ roleEntry.sessionCount += 1;
347
+ if (typeof qualityScore === 'number') {
348
+ roleEntry.qualityTotal += qualityScore;
349
+ roleEntry.avgQualityScore = Math.round(roleEntry.qualityTotal / roleEntry.sessionCount);
350
+ }
351
+ if (Array.isArray(filesTouched)) {
352
+ for (const f of filesTouched) {
353
+ roleEntry.topFileChurn[f] = (roleEntry.topFileChurn[f] || 0) + 1;
354
+ }
355
+ }
356
+ data.perProjectRole[role] = roleEntry;
357
+ }
358
+
359
+ this._saveSpecializations(data);
360
+ return true;
361
+ }
362
+
363
+ getSpecialization(agentId) {
364
+ return this._loadSpecializations().perAgent[agentId] || null;
365
+ }
366
+
367
+ getAllSpecializations() {
368
+ return this._loadSpecializations();
369
+ }
370
+ }
@@ -54,7 +54,7 @@ Review: Is this within scope? Conflicts with other agents? Aligns with project?
54
54
  Respond in ONE line: APPROVED: <reason> or REJECTED: <reason>`;
55
55
 
56
56
  try {
57
- const result = await this.daemon.journalist.callHeadless(prompt);
57
+ const result = await this.daemon.journalist.callHeadless(prompt, { trackAs: '__pm__' });
58
58
  const text = (result || '').trim();
59
59
  const approved = !text.toUpperCase().startsWith('REJECTED');
60
60
  const reason = text.replace(/^(APPROVED|REJECTED):?\s*/i, '').trim();
@@ -719,6 +719,25 @@ For normal file edits within your scope, proceed without review.
719
719
  // Process cross-scope handoff requests from this agent
720
720
  this._processHandoffs(agent);
721
721
  }
722
+
723
+ // Update Layer 7 specialization profile for this agent's session
724
+ if (this.daemon.memory && (finalStatus === 'completed' || finalStatus === 'crashed')) {
725
+ try {
726
+ const events = this.daemon.classifier?.agentWindows?.[agent.id] || [];
727
+ const signals = events.length >= 6
728
+ ? this.daemon.adaptive.extractSignals(events, agent.scope)
729
+ : null;
730
+ const score = signals ? this.daemon.adaptive.scoreSession(signals) : null;
731
+ const files = this.daemon.journalist?.getAgentFiles(agent) || [];
732
+ this.daemon.memory.updateSpecialization(agent.id, {
733
+ role: agent.role,
734
+ qualityScore: score,
735
+ filesTouched: files,
736
+ signals,
737
+ threshold: this.daemon.adaptive?.getThreshold(agent.provider, agent.role),
738
+ });
739
+ } catch { /* best-effort */ }
740
+ }
722
741
  });
723
742
 
724
743
  proc.on('error', (err) => {
@@ -1278,7 +1297,7 @@ For normal file edits within your scope, proceed without review.
1278
1297
  ].join('\n');
1279
1298
 
1280
1299
  try {
1281
- const response = await journalist.callHeadless(prompt);
1300
+ const response = await journalist.callHeadless(prompt, { trackAs: '__negotiator__' });
1282
1301
  return response;
1283
1302
  } catch {
1284
1303
  // Fallback: return raw data for the agent to interpret
@@ -7,10 +7,11 @@ import { resolve } from 'path';
7
7
 
8
8
  const DEFAULT_THRESHOLD = 0.75;
9
9
  const CHECK_INTERVAL = 15_000;
10
- const QUALITY_THRESHOLD = 40; // Score below this triggers quality rotation
11
- const MIN_EVENTS = 10; // Minimum classifier events before scoring
10
+ const QUALITY_THRESHOLD = 55; // Score below this triggers quality rotation (tuned up from 40 — too hair-trigger)
11
+ const MIN_EVENTS = 30; // Minimum classifier events before scoring (tuned up from 10 — ~100 turns for stable signal)
12
12
  const MIN_AGE_SEC = 120; // Minimum agent age before quality rotation
13
13
  const SCORE_HISTORY_MAX = 40; // ~10 min at 15s intervals
14
+ const ROTATION_COOLDOWN_MS = 5 * 60 * 1000; // 5 min between rotations per agent — prevents churn on persistent low quality
14
15
 
15
16
  export class Rotator extends EventEmitter {
16
17
  constructor(daemon) {
@@ -96,6 +97,18 @@ export class Rotator extends EventEmitter {
96
97
  : Infinity;
97
98
  }
98
99
 
100
+ // Check if this agent rotated recently. Prevents back-to-back rotation
101
+ // churn when quality score stays low post-rotation (e.g. genuinely hard task).
102
+ // Safety triggers bypass cooldown — pathological burn must be stopped.
103
+ _isInCooldown(agent) {
104
+ const last = [...this.rotationHistory]
105
+ .reverse()
106
+ .find((r) => r.newAgentId === agent.id || r.agentId === agent.id);
107
+ if (!last) return false;
108
+ const elapsed = Date.now() - new Date(last.timestamp).getTime();
109
+ return elapsed < ROTATION_COOLDOWN_MS;
110
+ }
111
+
99
112
  scoreLiveSession(agent) {
100
113
  const events = this.daemon.classifier.agentWindows[agent.id] || [];
101
114
  const ageSec = (Date.now() - new Date(agent.spawnedAt).getTime()) / 1000;
@@ -123,13 +136,89 @@ export class Rotator extends EventEmitter {
123
136
  return result;
124
137
  }
125
138
 
139
+ // Safety triggers — runaway agent detection. Scoped to `spawnedAt` so
140
+ // a rotation doesn't re-trigger on inherited cumulative tokens.
141
+ _checkSafetyTriggers(agent) {
142
+ const safety = this.daemon.config?.safety;
143
+ if (!safety || safety.autoRotate === false) return null;
144
+ if (!this.daemon.tokens || !agent.spawnedAt) return null;
145
+
146
+ const spawnedAtMs = new Date(agent.spawnedAt).getTime();
147
+ const ceiling = safety.tokenCeilingPerAgent;
148
+ if (ceiling > 0) {
149
+ const instanceTokens = this.daemon.tokens.getTokensInWindow(agent.id, spawnedAtMs);
150
+ if (instanceTokens >= ceiling) {
151
+ return {
152
+ reason: 'token_limit_exceeded',
153
+ instanceTokens,
154
+ ceiling,
155
+ };
156
+ }
157
+ }
158
+
159
+ const windowMs = (safety.velocityWindowSeconds || 300) * 1000;
160
+ const velocityThreshold = safety.velocityTokenThreshold;
161
+ if (velocityThreshold > 0) {
162
+ const velocity = this.daemon.tokens.getVelocity(agent.id, windowMs);
163
+ if (velocity >= velocityThreshold) {
164
+ return {
165
+ reason: 'runaway_velocity',
166
+ velocity,
167
+ windowMs,
168
+ threshold: velocityThreshold,
169
+ };
170
+ }
171
+ }
172
+
173
+ return null;
174
+ }
175
+
176
+ // Compute post-rotation velocity for rotations that are old enough to
177
+ // have meaningful data. Replaces hardcoded savings assumptions with
178
+ // measured deltas. Positive velocityDelta = rotation reduced burn rate.
179
+ _finalizeRotationMeasurements() {
180
+ if (!this.daemon.tokens?.getVelocity) return;
181
+ const now = Date.now();
182
+ let modified = false;
183
+ for (const record of this.rotationHistory) {
184
+ if (record.postRotationVelocity != null) continue;
185
+ if (record.preRotationVelocity == null) continue;
186
+ if (!record.newAgentId) continue;
187
+ const rotatedAt = new Date(record.timestamp).getTime();
188
+ if (now - rotatedAt < 600_000) continue; // need 10 min of post-data
189
+ const postVelocity = this.daemon.tokens.getVelocity(record.newAgentId, 600_000);
190
+ record.postRotationVelocity = postVelocity;
191
+ record.velocityDelta = record.preRotationVelocity - postVelocity;
192
+ modified = true;
193
+ }
194
+ if (modified) this._saveHistory();
195
+ }
196
+
126
197
  async check() {
198
+ this._finalizeRotationMeasurements();
199
+
127
200
  const agents = this.daemon.registry.getAll();
128
201
  const running = agents.filter((a) => a.status === 'running');
129
202
 
130
203
  for (const agent of running) {
131
204
  if (this.rotating.has(agent.id)) continue;
132
205
 
206
+ // Safety triggers — highest priority, pathological behavior.
207
+ // Bypasses cooldown: pathological burn must be stopped immediately.
208
+ const safety = this._checkSafetyTriggers(agent);
209
+ if (safety) {
210
+ const summary = safety.reason === 'token_limit_exceeded'
211
+ ? `${safety.instanceTokens} tokens >= ${safety.ceiling} ceiling`
212
+ : `${safety.velocity} tokens in ${safety.windowMs / 1000}s >= ${safety.threshold} threshold`;
213
+ console.log(` Rotator: ${agent.name} ${safety.reason} (${summary}) — auto-rotating`);
214
+ await this.rotate(agent.id, safety);
215
+ continue;
216
+ }
217
+
218
+ // Cooldown check — skip threshold-based rotations if agent just rotated.
219
+ // Gives the new instance time to stabilize before another judgment.
220
+ if (this._isInCooldown(agent)) continue;
221
+
133
222
  const threshold = this.daemon.adaptive
134
223
  ? this.daemon.adaptive.getThreshold(agent.provider, agent.role)
135
224
  : DEFAULT_THRESHOLD;
@@ -143,11 +232,17 @@ export class Rotator extends EventEmitter {
143
232
  }
144
233
  }
145
234
 
146
- // Quality-based rotation — detects degradation before tokens are wasted
235
+ // Quality-based rotation — detects degradation before tokens are wasted.
236
+ // Converged provider:role profiles have stable thresholds already, so
237
+ // skip quality rotation there unless score is catastrophically low.
147
238
  const quality = this.scoreLiveSession(agent);
148
239
  if (quality.hasEnoughData && quality.score < QUALITY_THRESHOLD) {
149
- if (this._idleMs(agent) > 10_000) {
150
- console.log(` Rotator: ${agent.name} quality=${quality.score} — rotating (quality)`);
240
+ const profile = this.daemon.adaptive?.getProfile?.(agent.provider, agent.role);
241
+ const converged = profile?.converged;
242
+ // If converged, require a deeper score drop before rotating
243
+ const floor = converged ? QUALITY_THRESHOLD - 15 : QUALITY_THRESHOLD;
244
+ if (quality.score < floor && this._idleMs(agent) > 10_000) {
245
+ console.log(` Rotator: ${agent.name} quality=${quality.score}${converged ? ' (converged profile)' : ''} — rotating (quality)`);
151
246
  await this.rotate(agent.id, {
152
247
  reason: 'quality_degradation',
153
248
  qualityScore: quality.score,
@@ -191,6 +286,13 @@ export class Rotator extends EventEmitter {
191
286
  brief = brief + '\n\n## User Instruction\n\n' + options.additionalPrompt;
192
287
  }
193
288
 
289
+ // Capture pre-rotation velocity (tokens/10min) so we can later measure
290
+ // whether the rotation actually improved token efficiency. Stored in
291
+ // history; finalized by _finalizeRotationMeasurements() on later ticks.
292
+ const preRotationVelocity = this.daemon.tokens?.getVelocity
293
+ ? this.daemon.tokens.getVelocity(agent.id, 600_000)
294
+ : null;
295
+
194
296
  const record = {
195
297
  agentId: agent.id,
196
298
  agentName: agent.name,
@@ -200,9 +302,22 @@ export class Rotator extends EventEmitter {
200
302
  contextUsage: agent.contextUsage,
201
303
  reason: options.reason || 'manual',
202
304
  qualityScore: options.qualityScore || null,
305
+ instanceTokens: options.instanceTokens || null,
306
+ velocity: options.velocity || null,
307
+ preRotationVelocity,
308
+ postRotationVelocity: null,
309
+ velocityDelta: null,
203
310
  timestamp: new Date().toISOString(),
204
311
  };
205
312
 
313
+ // Capture per-session signals for specialization tracking before we clear
314
+ const sessionSignals = classifierEvents.length > 0
315
+ ? this.daemon.adaptive.extractSignals(classifierEvents, agent.scope)
316
+ : null;
317
+ const sessionScore = sessionSignals
318
+ ? this.daemon.adaptive.scoreSession(sessionSignals)
319
+ : null;
320
+
206
321
  await processes.kill(agentId);
207
322
 
208
323
  const routingMode = this.daemon.router.getMode(agentId);
@@ -236,6 +351,35 @@ export class Rotator extends EventEmitter {
236
351
  }
237
352
  this._saveHistory();
238
353
 
354
+ // Append to persistent handoff chain (Layer 7 memory)
355
+ // so agent #50 knows what agent #1 struggled with.
356
+ if (this.daemon.memory) {
357
+ this.daemon.memory.appendHandoffBrief(agent.role, {
358
+ agentId: agent.id,
359
+ newAgentId: newAgent.id,
360
+ reason: record.reason,
361
+ oldTokens: agent.tokensUsed,
362
+ contextUsage: agent.contextUsage,
363
+ brief,
364
+ timestamp: record.timestamp,
365
+ });
366
+
367
+ // Update per-agent + per-role specialization profile
368
+ const files = Array.from(new Set(
369
+ classifierEvents
370
+ .map((e) => e.input || e.file || e.path)
371
+ .filter((f) => typeof f === 'string' && f.length > 0)
372
+ .slice(-20)
373
+ ));
374
+ this.daemon.memory.updateSpecialization(agent.id, {
375
+ role: agent.role,
376
+ qualityScore: sessionScore,
377
+ filesTouched: files,
378
+ signals: sessionSignals,
379
+ threshold: this.daemon.adaptive?.getThreshold(agent.provider, agent.role),
380
+ });
381
+ }
382
+
239
383
  if (this.daemon.timeline) {
240
384
  this.daemon.timeline.recordEvent('rotate', {
241
385
  agentId: newAgent.id, oldAgentId: agentId,
@@ -243,6 +387,8 @@ export class Rotator extends EventEmitter {
243
387
  tokensBefore: agent.tokensUsed,
244
388
  reason: record.reason,
245
389
  qualityScore: record.qualityScore,
390
+ instanceTokens: record.instanceTokens,
391
+ velocity: record.velocity,
246
392
  });
247
393
  }
248
394
 
@@ -332,6 +478,8 @@ export class Rotator extends EventEmitter {
332
478
  const qualityRotations = this.rotationHistory.filter((r) => r.reason === 'quality_degradation').length;
333
479
  const contextRotations = this.rotationHistory.filter((r) => r.reason === 'context_threshold').length;
334
480
  const naturalCompactions = this.rotationHistory.filter((r) => r.reason === 'natural_compaction').length;
481
+ const tokenLimitRotations = this.rotationHistory.filter((r) => r.reason === 'token_limit_exceeded').length;
482
+ const velocityRotations = this.rotationHistory.filter((r) => r.reason === 'runaway_velocity').length;
335
483
  return {
336
484
  enabled: this.enabled,
337
485
  totalRotations,
@@ -339,6 +487,8 @@ export class Rotator extends EventEmitter {
339
487
  qualityRotations,
340
488
  contextRotations,
341
489
  naturalCompactions,
490
+ tokenLimitRotations,
491
+ velocityRotations,
342
492
  rotating: Array.from(this.rotating),
343
493
  liveScores: this.liveScores,
344
494
  scoreHistory: this.scoreHistory,