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.
- package/CHANGELOG.md +59 -0
- package/CLAUDE.md +24 -19
- package/node_modules/@groove-dev/cli/package.json +1 -1
- package/node_modules/@groove-dev/daemon/integrations-registry.json +548 -0
- package/node_modules/@groove-dev/daemon/package.json +1 -1
- package/node_modules/@groove-dev/daemon/src/api.js +172 -4
- package/node_modules/@groove-dev/daemon/src/classifier.js +20 -1
- package/node_modules/@groove-dev/daemon/src/firstrun.js +14 -1
- package/node_modules/@groove-dev/daemon/src/gateways/manager.js +2 -2
- package/node_modules/@groove-dev/daemon/src/index.js +3 -1
- package/node_modules/@groove-dev/daemon/src/introducer.js +56 -5
- package/node_modules/@groove-dev/daemon/src/journalist.js +43 -1
- package/node_modules/@groove-dev/daemon/src/lockmanager.js +60 -0
- package/node_modules/@groove-dev/daemon/src/mcp-manager.js +2 -1
- package/node_modules/@groove-dev/daemon/src/memory.js +370 -0
- package/node_modules/@groove-dev/daemon/src/pm.js +1 -1
- package/node_modules/@groove-dev/daemon/src/process.js +20 -1
- package/node_modules/@groove-dev/daemon/src/rotator.js +155 -5
- package/node_modules/@groove-dev/daemon/src/router.js +43 -0
- package/node_modules/@groove-dev/daemon/src/tokentracker.js +62 -8
- package/node_modules/@groove-dev/daemon/src/validate.js +0 -13
- package/node_modules/@groove-dev/daemon/test/lockmanager.test.js +64 -0
- package/node_modules/@groove-dev/daemon/test/memory.test.js +252 -0
- package/node_modules/@groove-dev/daemon/test/rotator.test.js +108 -0
- package/node_modules/@groove-dev/daemon/test/router.test.js +64 -0
- package/node_modules/@groove-dev/daemon/test/tokentracker.test.js +78 -0
- package/node_modules/@groove-dev/gui/dist/assets/index-DjORRpF0.css +1 -0
- package/node_modules/@groove-dev/gui/dist/assets/index-eCrVowF0.js +652 -0
- package/node_modules/@groove-dev/gui/dist/index.html +2 -2
- package/node_modules/@groove-dev/gui/package.json +1 -4
- package/node_modules/@groove-dev/gui/src/components/agents/spawn-wizard.jsx +18 -0
- package/node_modules/@groove-dev/gui/src/components/dashboard/cache-ring.jsx +6 -2
- package/node_modules/@groove-dev/gui/src/components/dashboard/intel-panel.jsx +251 -8
- package/node_modules/@groove-dev/gui/src/components/dashboard/team-burn-panel.jsx +55 -0
- package/node_modules/@groove-dev/gui/src/components/marketplace/marketplace-card.jsx +22 -4
- package/node_modules/@groove-dev/gui/src/lib/format.js +0 -6
- package/node_modules/@groove-dev/gui/src/lib/hooks/use-dashboard.js +18 -1
- package/node_modules/@groove-dev/gui/src/stores/groove.js +0 -2
- package/node_modules/@groove-dev/gui/src/views/dashboard.jsx +9 -2
- package/node_modules/@groove-dev/gui/src/views/marketplace.jsx +103 -77
- package/package.json +2 -8
- package/packages/cli/package.json +1 -1
- package/packages/daemon/integrations-registry.json +548 -0
- package/packages/daemon/package.json +1 -1
- package/packages/daemon/src/api.js +172 -4
- package/packages/daemon/src/classifier.js +20 -1
- package/packages/daemon/src/firstrun.js +14 -1
- package/packages/daemon/src/gateways/manager.js +2 -2
- package/packages/daemon/src/index.js +3 -1
- package/packages/daemon/src/introducer.js +56 -5
- package/packages/daemon/src/journalist.js +43 -1
- package/packages/daemon/src/lockmanager.js +60 -0
- package/packages/daemon/src/mcp-manager.js +2 -1
- package/packages/daemon/src/memory.js +370 -0
- package/packages/daemon/src/pm.js +1 -1
- package/packages/daemon/src/process.js +20 -1
- package/packages/daemon/src/rotator.js +155 -5
- package/packages/daemon/src/router.js +43 -0
- package/packages/daemon/src/tokentracker.js +62 -8
- package/packages/daemon/src/validate.js +0 -13
- package/packages/gui/dist/assets/index-DjORRpF0.css +1 -0
- package/packages/gui/dist/assets/index-eCrVowF0.js +652 -0
- package/packages/gui/dist/index.html +2 -2
- package/packages/gui/package.json +1 -4
- package/packages/gui/src/components/agents/spawn-wizard.jsx +18 -0
- package/packages/gui/src/components/dashboard/cache-ring.jsx +6 -2
- package/packages/gui/src/components/dashboard/intel-panel.jsx +251 -8
- package/packages/gui/src/components/dashboard/team-burn-panel.jsx +55 -0
- package/packages/gui/src/components/marketplace/marketplace-card.jsx +22 -4
- package/packages/gui/src/lib/format.js +0 -6
- package/packages/gui/src/lib/hooks/use-dashboard.js +18 -1
- package/packages/gui/src/stores/groove.js +0 -2
- package/packages/gui/src/views/dashboard.jsx +9 -2
- package/packages/gui/src/views/marketplace.jsx +103 -77
- package/docs-manager/DOCS-WORKFLOW.md +0 -176
- package/node_modules/@groove-dev/gui/dist/assets/index-BkY43sei.css +0 -1
- package/node_modules/@groove-dev/gui/dist/assets/index-DmKZLrXU.js +0 -652
- package/node_modules/@groove-dev/gui/dist/groove-logo-short.png +0 -0
- package/node_modules/@groove-dev/gui/dist/groove-logo.png +0 -0
- package/node_modules/@groove-dev/gui/public/groove-logo-short.png +0 -0
- package/node_modules/@groove-dev/gui/public/groove-logo.png +0 -0
- package/node_modules/@groove-dev/gui/src/components/ui/dropdown-menu.jsx +0 -60
- package/node_modules/@groove-dev/gui/src/lib/hooks/use-media-query.js +0 -18
- package/node_modules/@radix-ui/react-dropdown-menu/LICENSE +0 -21
- package/node_modules/@radix-ui/react-dropdown-menu/README.md +0 -3
- package/node_modules/@radix-ui/react-dropdown-menu/dist/index.d.mts +0 -97
- package/node_modules/@radix-ui/react-dropdown-menu/dist/index.d.ts +0 -97
- package/node_modules/@radix-ui/react-dropdown-menu/dist/index.js +0 -337
- package/node_modules/@radix-ui/react-dropdown-menu/dist/index.js.map +0 -7
- package/node_modules/@radix-ui/react-dropdown-menu/dist/index.mjs +0 -305
- package/node_modules/@radix-ui/react-dropdown-menu/dist/index.mjs.map +0 -7
- package/node_modules/@radix-ui/react-dropdown-menu/package.json +0 -75
- package/node_modules/@radix-ui/react-popover/LICENSE +0 -21
- package/node_modules/@radix-ui/react-popover/README.md +0 -3
- package/node_modules/@radix-ui/react-popover/dist/index.d.mts +0 -85
- package/node_modules/@radix-ui/react-popover/dist/index.d.ts +0 -85
- package/node_modules/@radix-ui/react-popover/dist/index.js +0 -352
- package/node_modules/@radix-ui/react-popover/dist/index.js.map +0 -7
- package/node_modules/@radix-ui/react-popover/dist/index.mjs +0 -320
- package/node_modules/@radix-ui/react-popover/dist/index.mjs.map +0 -7
- package/node_modules/@radix-ui/react-popover/package.json +0 -82
- package/node_modules/@radix-ui/react-separator/LICENSE +0 -21
- package/node_modules/@radix-ui/react-separator/README.md +0 -3
- package/node_modules/@radix-ui/react-separator/dist/index.d.mts +0 -21
- package/node_modules/@radix-ui/react-separator/dist/index.d.ts +0 -21
- package/node_modules/@radix-ui/react-separator/dist/index.js +0 -65
- package/node_modules/@radix-ui/react-separator/dist/index.js.map +0 -7
- package/node_modules/@radix-ui/react-separator/dist/index.mjs +0 -32
- package/node_modules/@radix-ui/react-separator/dist/index.mjs.map +0 -7
- package/node_modules/@radix-ui/react-separator/node_modules/@radix-ui/react-primitive/LICENSE +0 -21
- package/node_modules/@radix-ui/react-separator/node_modules/@radix-ui/react-primitive/README.md +0 -3
- package/node_modules/@radix-ui/react-separator/node_modules/@radix-ui/react-primitive/dist/index.d.mts +0 -52
- package/node_modules/@radix-ui/react-separator/node_modules/@radix-ui/react-primitive/dist/index.d.ts +0 -52
- package/node_modules/@radix-ui/react-separator/node_modules/@radix-ui/react-primitive/dist/index.js +0 -80
- package/node_modules/@radix-ui/react-separator/node_modules/@radix-ui/react-primitive/dist/index.js.map +0 -7
- package/node_modules/@radix-ui/react-separator/node_modules/@radix-ui/react-primitive/dist/index.mjs +0 -47
- package/node_modules/@radix-ui/react-separator/node_modules/@radix-ui/react-primitive/dist/index.mjs.map +0 -7
- package/node_modules/@radix-ui/react-separator/node_modules/@radix-ui/react-primitive/package.json +0 -69
- package/node_modules/@radix-ui/react-separator/node_modules/@radix-ui/react-slot/LICENSE +0 -21
- package/node_modules/@radix-ui/react-separator/node_modules/@radix-ui/react-slot/README.md +0 -3
- package/node_modules/@radix-ui/react-separator/node_modules/@radix-ui/react-slot/dist/index.d.mts +0 -22
- package/node_modules/@radix-ui/react-separator/node_modules/@radix-ui/react-slot/dist/index.d.ts +0 -22
- package/node_modules/@radix-ui/react-separator/node_modules/@radix-ui/react-slot/dist/index.js +0 -152
- package/node_modules/@radix-ui/react-separator/node_modules/@radix-ui/react-slot/dist/index.js.map +0 -7
- package/node_modules/@radix-ui/react-separator/node_modules/@radix-ui/react-slot/dist/index.mjs +0 -119
- package/node_modules/@radix-ui/react-separator/node_modules/@radix-ui/react-slot/dist/index.mjs.map +0 -7
- package/node_modules/@radix-ui/react-separator/node_modules/@radix-ui/react-slot/package.json +0 -64
- package/node_modules/@radix-ui/react-separator/package.json +0 -69
- package/packages/gui/dist/assets/index-BkY43sei.css +0 -1
- package/packages/gui/dist/assets/index-DmKZLrXU.js +0 -652
- package/packages/gui/dist/groove-logo-short.png +0 -0
- package/packages/gui/dist/groove-logo.png +0 -0
- package/packages/gui/public/groove-logo-short.png +0 -0
- package/packages/gui/public/groove-logo.png +0 -0
- package/packages/gui/src/components/ui/dropdown-menu.jsx +0 -60
- package/packages/gui/src/lib/hooks/use-media-query.js +0 -18
- package/slides/convert-slides.js +0 -1120
- package/slides/deck.pptx +0 -0
- package/slides/index.html +0 -825
- package/slides/node_modules/.package-lock.json +0 -527
- package/slides/node_modules/@types/node/LICENSE +0 -21
- package/slides/node_modules/@types/node/README.md +0 -15
- package/slides/node_modules/@types/node/assert/strict.d.ts +0 -111
- package/slides/node_modules/@types/node/assert.d.ts +0 -1078
- package/slides/node_modules/@types/node/async_hooks.d.ts +0 -603
- package/slides/node_modules/@types/node/buffer.buffer.d.ts +0 -472
- package/slides/node_modules/@types/node/buffer.d.ts +0 -1934
- package/slides/node_modules/@types/node/child_process.d.ts +0 -1476
- package/slides/node_modules/@types/node/cluster.d.ts +0 -578
- package/slides/node_modules/@types/node/compatibility/disposable.d.ts +0 -14
- package/slides/node_modules/@types/node/compatibility/index.d.ts +0 -9
- package/slides/node_modules/@types/node/compatibility/indexable.d.ts +0 -20
- package/slides/node_modules/@types/node/compatibility/iterators.d.ts +0 -20
- package/slides/node_modules/@types/node/console.d.ts +0 -452
- package/slides/node_modules/@types/node/constants.d.ts +0 -21
- package/slides/node_modules/@types/node/crypto.d.ts +0 -4545
- package/slides/node_modules/@types/node/dgram.d.ts +0 -600
- package/slides/node_modules/@types/node/diagnostics_channel.d.ts +0 -578
- package/slides/node_modules/@types/node/dns/promises.d.ts +0 -503
- package/slides/node_modules/@types/node/dns.d.ts +0 -923
- package/slides/node_modules/@types/node/domain.d.ts +0 -170
- package/slides/node_modules/@types/node/events.d.ts +0 -976
- package/slides/node_modules/@types/node/fs/promises.d.ts +0 -1295
- package/slides/node_modules/@types/node/fs.d.ts +0 -4461
- package/slides/node_modules/@types/node/globals.d.ts +0 -172
- package/slides/node_modules/@types/node/globals.typedarray.d.ts +0 -38
- package/slides/node_modules/@types/node/http.d.ts +0 -2089
- package/slides/node_modules/@types/node/http2.d.ts +0 -2644
- package/slides/node_modules/@types/node/https.d.ts +0 -579
- package/slides/node_modules/@types/node/index.d.ts +0 -97
- package/slides/node_modules/@types/node/inspector.d.ts +0 -253
- package/slides/node_modules/@types/node/inspector.generated.d.ts +0 -4052
- package/slides/node_modules/@types/node/module.d.ts +0 -891
- package/slides/node_modules/@types/node/net.d.ts +0 -1076
- package/slides/node_modules/@types/node/os.d.ts +0 -506
- package/slides/node_modules/@types/node/package.json +0 -145
- package/slides/node_modules/@types/node/path.d.ts +0 -200
- package/slides/node_modules/@types/node/perf_hooks.d.ts +0 -968
- package/slides/node_modules/@types/node/process.d.ts +0 -2084
- package/slides/node_modules/@types/node/punycode.d.ts +0 -117
- package/slides/node_modules/@types/node/querystring.d.ts +0 -152
- package/slides/node_modules/@types/node/readline/promises.d.ts +0 -161
- package/slides/node_modules/@types/node/readline.d.ts +0 -594
- package/slides/node_modules/@types/node/repl.d.ts +0 -428
- package/slides/node_modules/@types/node/sea.d.ts +0 -153
- package/slides/node_modules/@types/node/sqlite.d.ts +0 -721
- package/slides/node_modules/@types/node/stream/consumers.d.ts +0 -38
- package/slides/node_modules/@types/node/stream/promises.d.ts +0 -90
- package/slides/node_modules/@types/node/stream/web.d.ts +0 -622
- package/slides/node_modules/@types/node/stream.d.ts +0 -1687
- package/slides/node_modules/@types/node/string_decoder.d.ts +0 -67
- package/slides/node_modules/@types/node/test.d.ts +0 -2163
- package/slides/node_modules/@types/node/timers/promises.d.ts +0 -108
- package/slides/node_modules/@types/node/timers.d.ts +0 -287
- package/slides/node_modules/@types/node/tls.d.ts +0 -1319
- package/slides/node_modules/@types/node/trace_events.d.ts +0 -197
- package/slides/node_modules/@types/node/ts5.6/buffer.buffer.d.ts +0 -468
- package/slides/node_modules/@types/node/ts5.6/globals.typedarray.d.ts +0 -34
- package/slides/node_modules/@types/node/ts5.6/index.d.ts +0 -97
- package/slides/node_modules/@types/node/tty.d.ts +0 -208
- package/slides/node_modules/@types/node/url.d.ts +0 -984
- package/slides/node_modules/@types/node/util.d.ts +0 -2606
- package/slides/node_modules/@types/node/v8.d.ts +0 -920
- package/slides/node_modules/@types/node/vm.d.ts +0 -1000
- package/slides/node_modules/@types/node/wasi.d.ts +0 -181
- package/slides/node_modules/@types/node/web-globals/abortcontroller.d.ts +0 -34
- package/slides/node_modules/@types/node/web-globals/domexception.d.ts +0 -68
- package/slides/node_modules/@types/node/web-globals/events.d.ts +0 -97
- package/slides/node_modules/@types/node/web-globals/fetch.d.ts +0 -55
- package/slides/node_modules/@types/node/web-globals/navigator.d.ts +0 -22
- package/slides/node_modules/@types/node/web-globals/storage.d.ts +0 -24
- package/slides/node_modules/@types/node/worker_threads.d.ts +0 -784
- package/slides/node_modules/@types/node/zlib.d.ts +0 -747
- package/slides/node_modules/base64-js/LICENSE +0 -21
- package/slides/node_modules/base64-js/README.md +0 -34
- package/slides/node_modules/base64-js/base64js.min.js +0 -1
- package/slides/node_modules/base64-js/index.d.ts +0 -3
- package/slides/node_modules/base64-js/index.js +0 -150
- package/slides/node_modules/base64-js/package.json +0 -47
- package/slides/node_modules/bl/.travis.yml +0 -17
- package/slides/node_modules/bl/BufferList.js +0 -396
- package/slides/node_modules/bl/LICENSE.md +0 -13
- package/slides/node_modules/bl/README.md +0 -247
- package/slides/node_modules/bl/bl.js +0 -84
- package/slides/node_modules/bl/node_modules/readable-stream/CONTRIBUTING.md +0 -38
- package/slides/node_modules/bl/node_modules/readable-stream/GOVERNANCE.md +0 -136
- package/slides/node_modules/bl/node_modules/readable-stream/LICENSE +0 -47
- package/slides/node_modules/bl/node_modules/readable-stream/README.md +0 -106
- package/slides/node_modules/bl/node_modules/readable-stream/errors-browser.js +0 -127
- package/slides/node_modules/bl/node_modules/readable-stream/errors.js +0 -116
- package/slides/node_modules/bl/node_modules/readable-stream/experimentalWarning.js +0 -17
- package/slides/node_modules/bl/node_modules/readable-stream/lib/_stream_duplex.js +0 -126
- package/slides/node_modules/bl/node_modules/readable-stream/lib/_stream_passthrough.js +0 -37
- package/slides/node_modules/bl/node_modules/readable-stream/lib/_stream_readable.js +0 -1027
- package/slides/node_modules/bl/node_modules/readable-stream/lib/_stream_transform.js +0 -190
- package/slides/node_modules/bl/node_modules/readable-stream/lib/_stream_writable.js +0 -641
- package/slides/node_modules/bl/node_modules/readable-stream/lib/internal/streams/async_iterator.js +0 -180
- package/slides/node_modules/bl/node_modules/readable-stream/lib/internal/streams/buffer_list.js +0 -183
- package/slides/node_modules/bl/node_modules/readable-stream/lib/internal/streams/destroy.js +0 -96
- package/slides/node_modules/bl/node_modules/readable-stream/lib/internal/streams/end-of-stream.js +0 -86
- package/slides/node_modules/bl/node_modules/readable-stream/lib/internal/streams/from-browser.js +0 -3
- package/slides/node_modules/bl/node_modules/readable-stream/lib/internal/streams/from.js +0 -52
- package/slides/node_modules/bl/node_modules/readable-stream/lib/internal/streams/pipeline.js +0 -86
- package/slides/node_modules/bl/node_modules/readable-stream/lib/internal/streams/state.js +0 -22
- package/slides/node_modules/bl/node_modules/readable-stream/lib/internal/streams/stream-browser.js +0 -1
- package/slides/node_modules/bl/node_modules/readable-stream/lib/internal/streams/stream.js +0 -1
- package/slides/node_modules/bl/node_modules/readable-stream/package.json +0 -68
- package/slides/node_modules/bl/node_modules/readable-stream/readable-browser.js +0 -9
- package/slides/node_modules/bl/node_modules/readable-stream/readable.js +0 -16
- package/slides/node_modules/bl/package.json +0 -37
- package/slides/node_modules/bl/test/convert.js +0 -21
- package/slides/node_modules/bl/test/indexOf.js +0 -492
- package/slides/node_modules/bl/test/isBufferList.js +0 -32
- package/slides/node_modules/bl/test/test.js +0 -869
- package/slides/node_modules/buffer/AUTHORS.md +0 -70
- package/slides/node_modules/buffer/LICENSE +0 -21
- package/slides/node_modules/buffer/README.md +0 -410
- package/slides/node_modules/buffer/index.d.ts +0 -186
- package/slides/node_modules/buffer/index.js +0 -1817
- package/slides/node_modules/buffer/package.json +0 -96
- package/slides/node_modules/canvas/Readme.md +0 -657
- package/slides/node_modules/canvas/binding.gyp +0 -229
- package/slides/node_modules/canvas/browser.js +0 -31
- package/slides/node_modules/canvas/build/Makefile +0 -347
- package/slides/node_modules/canvas/build/Release/canvas.node +0 -0
- package/slides/node_modules/canvas/build/Release/libX11.6.dylib +0 -0
- package/slides/node_modules/canvas/build/Release/libXau.6.dylib +0 -0
- package/slides/node_modules/canvas/build/Release/libXdmcp.6.dylib +0 -0
- package/slides/node_modules/canvas/build/Release/libXext.6.dylib +0 -0
- package/slides/node_modules/canvas/build/Release/libXrender.1.dylib +0 -0
- package/slides/node_modules/canvas/build/Release/libcairo-gobject.2.dylib +0 -0
- package/slides/node_modules/canvas/build/Release/libcairo.2.dylib +0 -0
- package/slides/node_modules/canvas/build/Release/libdatrie.1.dylib +0 -0
- package/slides/node_modules/canvas/build/Release/libfontconfig.1.dylib +0 -0
- package/slides/node_modules/canvas/build/Release/libfreetype.6.dylib +0 -0
- package/slides/node_modules/canvas/build/Release/libfribidi.0.dylib +0 -0
- package/slides/node_modules/canvas/build/Release/libgdk_pixbuf-2.0.0.dylib +0 -0
- package/slides/node_modules/canvas/build/Release/libgif.7.2.0.dylib +0 -0
- package/slides/node_modules/canvas/build/Release/libgio-2.0.0.dylib +0 -0
- package/slides/node_modules/canvas/build/Release/libglib-2.0.0.dylib +0 -0
- package/slides/node_modules/canvas/build/Release/libgmodule-2.0.0.dylib +0 -0
- package/slides/node_modules/canvas/build/Release/libgobject-2.0.0.dylib +0 -0
- package/slides/node_modules/canvas/build/Release/libgraphite2.3.2.1.dylib +0 -0
- package/slides/node_modules/canvas/build/Release/libharfbuzz.0.dylib +0 -0
- package/slides/node_modules/canvas/build/Release/libintl.8.dylib +0 -0
- package/slides/node_modules/canvas/build/Release/libjpeg.8.3.2.dylib +0 -0
- package/slides/node_modules/canvas/build/Release/libpango-1.0.0.dylib +0 -0
- package/slides/node_modules/canvas/build/Release/libpangocairo-1.0.0.dylib +0 -0
- package/slides/node_modules/canvas/build/Release/libpangoft2-1.0.0.dylib +0 -0
- package/slides/node_modules/canvas/build/Release/libpcre2-8.0.dylib +0 -0
- package/slides/node_modules/canvas/build/Release/libpixman-1.0.dylib +0 -0
- package/slides/node_modules/canvas/build/Release/libpng16.16.dylib +0 -0
- package/slides/node_modules/canvas/build/Release/librsvg-2.2.dylib +0 -0
- package/slides/node_modules/canvas/build/Release/libthai.0.dylib +0 -0
- package/slides/node_modules/canvas/build/Release/libxcb-render.0.0.0.dylib +0 -0
- package/slides/node_modules/canvas/build/Release/libxcb-shm.0.0.0.dylib +0 -0
- package/slides/node_modules/canvas/build/Release/libxcb.1.1.0.dylib +0 -0
- package/slides/node_modules/canvas/build/binding.Makefile +0 -6
- package/slides/node_modules/canvas/build/canvas.target.mk +0 -299
- package/slides/node_modules/canvas/build/gyp-mac-tool +0 -766
- package/slides/node_modules/canvas/index.d.ts +0 -507
- package/slides/node_modules/canvas/index.js +0 -94
- package/slides/node_modules/canvas/lib/DOMMatrix.js +0 -678
- package/slides/node_modules/canvas/lib/bindings.js +0 -43
- package/slides/node_modules/canvas/lib/canvas.js +0 -113
- package/slides/node_modules/canvas/lib/context2d.js +0 -11
- package/slides/node_modules/canvas/lib/image.js +0 -97
- package/slides/node_modules/canvas/lib/jpegstream.js +0 -41
- package/slides/node_modules/canvas/lib/pattern.js +0 -15
- package/slides/node_modules/canvas/lib/pdfstream.js +0 -35
- package/slides/node_modules/canvas/lib/pngstream.js +0 -42
- package/slides/node_modules/canvas/package.json +0 -71
- package/slides/node_modules/canvas/src/Backends.h +0 -9
- package/slides/node_modules/canvas/src/Canvas.cc +0 -1026
- package/slides/node_modules/canvas/src/Canvas.h +0 -128
- package/slides/node_modules/canvas/src/CanvasError.h +0 -37
- package/slides/node_modules/canvas/src/CanvasGradient.cc +0 -113
- package/slides/node_modules/canvas/src/CanvasGradient.h +0 -20
- package/slides/node_modules/canvas/src/CanvasPattern.cc +0 -129
- package/slides/node_modules/canvas/src/CanvasPattern.h +0 -33
- package/slides/node_modules/canvas/src/CanvasRenderingContext2d.cc +0 -3527
- package/slides/node_modules/canvas/src/CanvasRenderingContext2d.h +0 -238
- package/slides/node_modules/canvas/src/CharData.h +0 -233
- package/slides/node_modules/canvas/src/FontParser.cc +0 -605
- package/slides/node_modules/canvas/src/FontParser.h +0 -115
- package/slides/node_modules/canvas/src/Image.cc +0 -1719
- package/slides/node_modules/canvas/src/Image.h +0 -146
- package/slides/node_modules/canvas/src/ImageData.cc +0 -138
- package/slides/node_modules/canvas/src/ImageData.h +0 -26
- package/slides/node_modules/canvas/src/InstanceData.h +0 -12
- package/slides/node_modules/canvas/src/JPEGStream.h +0 -157
- package/slides/node_modules/canvas/src/PNG.h +0 -292
- package/slides/node_modules/canvas/src/Point.h +0 -11
- package/slides/node_modules/canvas/src/Util.h +0 -9
- package/slides/node_modules/canvas/src/bmp/BMPParser.cc +0 -459
- package/slides/node_modules/canvas/src/bmp/BMPParser.h +0 -60
- package/slides/node_modules/canvas/src/bmp/LICENSE.md +0 -24
- package/slides/node_modules/canvas/src/closure.cc +0 -52
- package/slides/node_modules/canvas/src/closure.h +0 -98
- package/slides/node_modules/canvas/src/color.cc +0 -796
- package/slides/node_modules/canvas/src/color.h +0 -30
- package/slides/node_modules/canvas/src/dll_visibility.h +0 -20
- package/slides/node_modules/canvas/src/init.cc +0 -114
- package/slides/node_modules/canvas/src/register_font.cc +0 -352
- package/slides/node_modules/canvas/src/register_font.h +0 -7
- package/slides/node_modules/canvas/util/has_lib.js +0 -119
- package/slides/node_modules/canvas/util/win_jpeg_lookup.js +0 -21
- package/slides/node_modules/chownr/LICENSE +0 -15
- package/slides/node_modules/chownr/README.md +0 -3
- package/slides/node_modules/chownr/chownr.js +0 -167
- package/slides/node_modules/chownr/package.json +0 -29
- package/slides/node_modules/core-util-is/LICENSE +0 -19
- package/slides/node_modules/core-util-is/README.md +0 -3
- package/slides/node_modules/core-util-is/lib/util.js +0 -107
- package/slides/node_modules/core-util-is/package.json +0 -38
- package/slides/node_modules/decompress-response/index.d.ts +0 -22
- package/slides/node_modules/decompress-response/index.js +0 -58
- package/slides/node_modules/decompress-response/license +0 -9
- package/slides/node_modules/decompress-response/package.json +0 -56
- package/slides/node_modules/decompress-response/readme.md +0 -48
- package/slides/node_modules/deep-extend/CHANGELOG.md +0 -46
- package/slides/node_modules/deep-extend/LICENSE +0 -20
- package/slides/node_modules/deep-extend/README.md +0 -91
- package/slides/node_modules/deep-extend/index.js +0 -1
- package/slides/node_modules/deep-extend/lib/deep-extend.js +0 -150
- package/slides/node_modules/deep-extend/package.json +0 -62
- package/slides/node_modules/detect-libc/LICENSE +0 -201
- package/slides/node_modules/detect-libc/README.md +0 -163
- package/slides/node_modules/detect-libc/index.d.ts +0 -14
- package/slides/node_modules/detect-libc/lib/detect-libc.js +0 -313
- package/slides/node_modules/detect-libc/lib/elf.js +0 -39
- package/slides/node_modules/detect-libc/lib/filesystem.js +0 -51
- package/slides/node_modules/detect-libc/lib/process.js +0 -24
- package/slides/node_modules/detect-libc/package.json +0 -44
- package/slides/node_modules/end-of-stream/LICENSE +0 -21
- package/slides/node_modules/end-of-stream/README.md +0 -54
- package/slides/node_modules/end-of-stream/index.js +0 -96
- package/slides/node_modules/end-of-stream/package.json +0 -37
- package/slides/node_modules/expand-template/.travis.yml +0 -6
- package/slides/node_modules/expand-template/LICENSE +0 -21
- package/slides/node_modules/expand-template/README.md +0 -43
- package/slides/node_modules/expand-template/index.js +0 -26
- package/slides/node_modules/expand-template/package.json +0 -29
- package/slides/node_modules/expand-template/test.js +0 -67
- package/slides/node_modules/fs-constants/LICENSE +0 -21
- package/slides/node_modules/fs-constants/README.md +0 -26
- package/slides/node_modules/fs-constants/browser.js +0 -1
- package/slides/node_modules/fs-constants/index.js +0 -1
- package/slides/node_modules/fs-constants/package.json +0 -19
- package/slides/node_modules/github-from-package/.travis.yml +0 -4
- package/slides/node_modules/github-from-package/LICENSE +0 -18
- package/slides/node_modules/github-from-package/example/package.json +0 -8
- package/slides/node_modules/github-from-package/example/url.js +0 -3
- package/slides/node_modules/github-from-package/index.js +0 -17
- package/slides/node_modules/github-from-package/package.json +0 -30
- package/slides/node_modules/github-from-package/readme.markdown +0 -53
- package/slides/node_modules/github-from-package/test/a.json +0 -8
- package/slides/node_modules/github-from-package/test/b.json +0 -5
- package/slides/node_modules/github-from-package/test/c.json +0 -5
- package/slides/node_modules/github-from-package/test/d.json +0 -7
- package/slides/node_modules/github-from-package/test/e.json +0 -5
- package/slides/node_modules/github-from-package/test/url.js +0 -19
- package/slides/node_modules/https/package.json +0 -15
- package/slides/node_modules/ieee754/LICENSE +0 -11
- package/slides/node_modules/ieee754/README.md +0 -51
- package/slides/node_modules/ieee754/index.d.ts +0 -10
- package/slides/node_modules/ieee754/index.js +0 -85
- package/slides/node_modules/ieee754/package.json +0 -52
- package/slides/node_modules/image-size/LICENSE +0 -9
- package/slides/node_modules/image-size/Readme.md +0 -184
- package/slides/node_modules/image-size/bin/image-size.js +0 -53
- package/slides/node_modules/image-size/dist/detector.d.ts +0 -2
- package/slides/node_modules/image-size/dist/detector.js +0 -30
- package/slides/node_modules/image-size/dist/index.d.ts +0 -10
- package/slides/node_modules/image-size/dist/index.js +0 -129
- package/slides/node_modules/image-size/dist/types/bmp.d.ts +0 -2
- package/slides/node_modules/image-size/dist/types/bmp.js +0 -11
- package/slides/node_modules/image-size/dist/types/cur.d.ts +0 -2
- package/slides/node_modules/image-size/dist/types/cur.js +0 -17
- package/slides/node_modules/image-size/dist/types/dds.d.ts +0 -2
- package/slides/node_modules/image-size/dist/types/dds.js +0 -11
- package/slides/node_modules/image-size/dist/types/gif.d.ts +0 -2
- package/slides/node_modules/image-size/dist/types/gif.js +0 -12
- package/slides/node_modules/image-size/dist/types/heif.d.ts +0 -2
- package/slides/node_modules/image-size/dist/types/heif.js +0 -40
- package/slides/node_modules/image-size/dist/types/icns.d.ts +0 -2
- package/slides/node_modules/image-size/dist/types/icns.js +0 -101
- package/slides/node_modules/image-size/dist/types/ico.d.ts +0 -2
- package/slides/node_modules/image-size/dist/types/ico.js +0 -68
- package/slides/node_modules/image-size/dist/types/index.d.ts +0 -23
- package/slides/node_modules/image-size/dist/types/index.js +0 -46
- package/slides/node_modules/image-size/dist/types/interface.d.ts +0 -13
- package/slides/node_modules/image-size/dist/types/interface.js +0 -2
- package/slides/node_modules/image-size/dist/types/j2c.d.ts +0 -2
- package/slides/node_modules/image-size/dist/types/j2c.js +0 -12
- package/slides/node_modules/image-size/dist/types/jp2.d.ts +0 -2
- package/slides/node_modules/image-size/dist/types/jp2.js +0 -27
- package/slides/node_modules/image-size/dist/types/jpg.d.ts +0 -2
- package/slides/node_modules/image-size/dist/types/jpg.js +0 -123
- package/slides/node_modules/image-size/dist/types/jxl-stream.d.ts +0 -2
- package/slides/node_modules/image-size/dist/types/jxl-stream.js +0 -45
- package/slides/node_modules/image-size/dist/types/jxl.d.ts +0 -2
- package/slides/node_modules/image-size/dist/types/jxl.js +0 -59
- package/slides/node_modules/image-size/dist/types/ktx.d.ts +0 -2
- package/slides/node_modules/image-size/dist/types/ktx.js +0 -19
- package/slides/node_modules/image-size/dist/types/png.d.ts +0 -2
- package/slides/node_modules/image-size/dist/types/png.js +0 -35
- package/slides/node_modules/image-size/dist/types/pnm.d.ts +0 -2
- package/slides/node_modules/image-size/dist/types/pnm.js +0 -72
- package/slides/node_modules/image-size/dist/types/psd.d.ts +0 -2
- package/slides/node_modules/image-size/dist/types/psd.js +0 -11
- package/slides/node_modules/image-size/dist/types/svg.d.ts +0 -2
- package/slides/node_modules/image-size/dist/types/svg.js +0 -90
- package/slides/node_modules/image-size/dist/types/tga.d.ts +0 -2
- package/slides/node_modules/image-size/dist/types/tga.js +0 -15
- package/slides/node_modules/image-size/dist/types/tiff.d.ts +0 -2
- package/slides/node_modules/image-size/dist/types/tiff.js +0 -95
- package/slides/node_modules/image-size/dist/types/utils.d.ts +0 -15
- package/slides/node_modules/image-size/dist/types/utils.js +0 -75
- package/slides/node_modules/image-size/dist/types/webp.d.ts +0 -2
- package/slides/node_modules/image-size/dist/types/webp.js +0 -60
- package/slides/node_modules/image-size/dist/utils/bit-reader.d.ts +0 -10
- package/slides/node_modules/image-size/dist/utils/bit-reader.js +0 -44
- package/slides/node_modules/image-size/package.json +0 -81
- package/slides/node_modules/immediate/LICENSE.txt +0 -20
- package/slides/node_modules/immediate/README.md +0 -93
- package/slides/node_modules/immediate/dist/immediate.js +0 -75
- package/slides/node_modules/immediate/dist/immediate.min.js +0 -1
- package/slides/node_modules/immediate/lib/browser.js +0 -69
- package/slides/node_modules/immediate/lib/index.js +0 -73
- package/slides/node_modules/immediate/package.json +0 -42
- package/slides/node_modules/inherits/LICENSE +0 -16
- package/slides/node_modules/inherits/README.md +0 -42
- package/slides/node_modules/inherits/inherits.js +0 -9
- package/slides/node_modules/inherits/inherits_browser.js +0 -27
- package/slides/node_modules/inherits/package.json +0 -29
- package/slides/node_modules/ini/LICENSE +0 -15
- package/slides/node_modules/ini/README.md +0 -102
- package/slides/node_modules/ini/ini.js +0 -206
- package/slides/node_modules/ini/package.json +0 -33
- package/slides/node_modules/isarray/.travis.yml +0 -4
- package/slides/node_modules/isarray/Makefile +0 -6
- package/slides/node_modules/isarray/README.md +0 -60
- package/slides/node_modules/isarray/component.json +0 -19
- package/slides/node_modules/isarray/index.js +0 -5
- package/slides/node_modules/isarray/package.json +0 -45
- package/slides/node_modules/isarray/test.js +0 -20
- package/slides/node_modules/jszip/.codeclimate.yml +0 -16
- package/slides/node_modules/jszip/.editorconfig +0 -8
- package/slides/node_modules/jszip/.eslintrc.js +0 -43
- package/slides/node_modules/jszip/.github/workflows/pr.yaml +0 -58
- package/slides/node_modules/jszip/.jekyll-metadata +0 -0
- package/slides/node_modules/jszip/.travis.yml +0 -17
- package/slides/node_modules/jszip/CHANGES.md +0 -204
- package/slides/node_modules/jszip/LICENSE.markdown +0 -651
- package/slides/node_modules/jszip/README.markdown +0 -33
- package/slides/node_modules/jszip/deps.js +0 -37
- package/slides/node_modules/jszip/dist/jszip.js +0 -11577
- package/slides/node_modules/jszip/dist/jszip.min.js +0 -13
- package/slides/node_modules/jszip/graph.svg +0 -601
- package/slides/node_modules/jszip/index.d.ts +0 -330
- package/slides/node_modules/jszip/lib/base64.js +0 -106
- package/slides/node_modules/jszip/lib/compressedObject.js +0 -74
- package/slides/node_modules/jszip/lib/compressions.js +0 -14
- package/slides/node_modules/jszip/lib/crc32.js +0 -77
- package/slides/node_modules/jszip/lib/defaults.js +0 -11
- package/slides/node_modules/jszip/lib/external.js +0 -18
- package/slides/node_modules/jszip/lib/flate.js +0 -85
- package/slides/node_modules/jszip/lib/generate/ZipFileWorker.js +0 -539
- package/slides/node_modules/jszip/lib/generate/index.js +0 -57
- package/slides/node_modules/jszip/lib/index.js +0 -55
- package/slides/node_modules/jszip/lib/license_header.js +0 -11
- package/slides/node_modules/jszip/lib/load.js +0 -88
- package/slides/node_modules/jszip/lib/nodejs/NodejsStreamInputAdapter.js +0 -74
- package/slides/node_modules/jszip/lib/nodejs/NodejsStreamOutputAdapter.js +0 -42
- package/slides/node_modules/jszip/lib/nodejsUtils.js +0 -57
- package/slides/node_modules/jszip/lib/object.js +0 -384
- package/slides/node_modules/jszip/lib/readable-stream-browser.js +0 -10
- package/slides/node_modules/jszip/lib/reader/ArrayReader.js +0 -57
- package/slides/node_modules/jszip/lib/reader/DataReader.js +0 -116
- package/slides/node_modules/jszip/lib/reader/NodeBufferReader.js +0 -19
- package/slides/node_modules/jszip/lib/reader/StringReader.js +0 -38
- package/slides/node_modules/jszip/lib/reader/Uint8ArrayReader.js +0 -22
- package/slides/node_modules/jszip/lib/reader/readerFor.js +0 -28
- package/slides/node_modules/jszip/lib/signature.js +0 -7
- package/slides/node_modules/jszip/lib/stream/ConvertWorker.js +0 -26
- package/slides/node_modules/jszip/lib/stream/Crc32Probe.js +0 -24
- package/slides/node_modules/jszip/lib/stream/DataLengthProbe.js +0 -29
- package/slides/node_modules/jszip/lib/stream/DataWorker.js +0 -116
- package/slides/node_modules/jszip/lib/stream/GenericWorker.js +0 -263
- package/slides/node_modules/jszip/lib/stream/StreamHelper.js +0 -214
- package/slides/node_modules/jszip/lib/support.js +0 -38
- package/slides/node_modules/jszip/lib/utf8.js +0 -275
- package/slides/node_modules/jszip/lib/utils.js +0 -501
- package/slides/node_modules/jszip/lib/zipEntries.js +0 -261
- package/slides/node_modules/jszip/lib/zipEntry.js +0 -293
- package/slides/node_modules/jszip/lib/zipObject.js +0 -133
- package/slides/node_modules/jszip/package.json +0 -67
- package/slides/node_modules/jszip/sponsors.md +0 -21
- package/slides/node_modules/jszip/tsconfig.json +0 -101
- package/slides/node_modules/jszip/vendor/FileSaver.js +0 -247
- package/slides/node_modules/lie/README.md +0 -62
- package/slides/node_modules/lie/dist/lie.js +0 -350
- package/slides/node_modules/lie/dist/lie.min.js +0 -1
- package/slides/node_modules/lie/dist/lie.polyfill.js +0 -358
- package/slides/node_modules/lie/dist/lie.polyfill.min.js +0 -1
- package/slides/node_modules/lie/lib/browser.js +0 -273
- package/slides/node_modules/lie/lib/index.js +0 -298
- package/slides/node_modules/lie/license.md +0 -7
- package/slides/node_modules/lie/lie.d.ts +0 -244
- package/slides/node_modules/lie/package.json +0 -69
- package/slides/node_modules/lie/polyfill.js +0 -4
- package/slides/node_modules/mimic-response/index.d.ts +0 -17
- package/slides/node_modules/mimic-response/index.js +0 -77
- package/slides/node_modules/mimic-response/license +0 -9
- package/slides/node_modules/mimic-response/package.json +0 -42
- package/slides/node_modules/mimic-response/readme.md +0 -78
- package/slides/node_modules/minimist/.eslintrc +0 -29
- package/slides/node_modules/minimist/.github/FUNDING.yml +0 -12
- package/slides/node_modules/minimist/.nycrc +0 -14
- package/slides/node_modules/minimist/CHANGELOG.md +0 -298
- package/slides/node_modules/minimist/LICENSE +0 -18
- package/slides/node_modules/minimist/README.md +0 -121
- package/slides/node_modules/minimist/example/parse.js +0 -4
- package/slides/node_modules/minimist/index.js +0 -263
- package/slides/node_modules/minimist/package.json +0 -75
- package/slides/node_modules/minimist/test/all_bool.js +0 -34
- package/slides/node_modules/minimist/test/bool.js +0 -177
- package/slides/node_modules/minimist/test/dash.js +0 -43
- package/slides/node_modules/minimist/test/default_bool.js +0 -37
- package/slides/node_modules/minimist/test/dotted.js +0 -24
- package/slides/node_modules/minimist/test/kv_short.js +0 -32
- package/slides/node_modules/minimist/test/long.js +0 -33
- package/slides/node_modules/minimist/test/num.js +0 -38
- package/slides/node_modules/minimist/test/parse.js +0 -209
- package/slides/node_modules/minimist/test/parse_modified.js +0 -11
- package/slides/node_modules/minimist/test/proto.js +0 -64
- package/slides/node_modules/minimist/test/short.js +0 -69
- package/slides/node_modules/minimist/test/stop_early.js +0 -17
- package/slides/node_modules/minimist/test/unknown.js +0 -104
- package/slides/node_modules/minimist/test/whitespace.js +0 -10
- package/slides/node_modules/mkdirp-classic/LICENSE +0 -21
- package/slides/node_modules/mkdirp-classic/README.md +0 -18
- package/slides/node_modules/mkdirp-classic/index.js +0 -98
- package/slides/node_modules/mkdirp-classic/package.json +0 -18
- package/slides/node_modules/napi-build-utils/.github/workflows/run-npm-tests.yml +0 -31
- package/slides/node_modules/napi-build-utils/LICENSE +0 -21
- package/slides/node_modules/napi-build-utils/README.md +0 -52
- package/slides/node_modules/napi-build-utils/index.js +0 -214
- package/slides/node_modules/napi-build-utils/index.md +0 -0
- package/slides/node_modules/napi-build-utils/package.json +0 -42
- package/slides/node_modules/node-abi/LICENSE +0 -21
- package/slides/node_modules/node-abi/README.md +0 -54
- package/slides/node_modules/node-abi/abi_registry.json +0 -439
- package/slides/node_modules/node-abi/index.js +0 -179
- package/slides/node_modules/node-abi/package.json +0 -45
- package/slides/node_modules/node-addon-api/LICENSE.md +0 -9
- package/slides/node_modules/node-addon-api/README.md +0 -319
- package/slides/node_modules/node-addon-api/common.gypi +0 -20
- package/slides/node_modules/node-addon-api/except.gypi +0 -25
- package/slides/node_modules/node-addon-api/index.js +0 -12
- package/slides/node_modules/node-addon-api/napi-inl.deprecated.h +0 -186
- package/slides/node_modules/node-addon-api/napi-inl.h +0 -6607
- package/slides/node_modules/node-addon-api/napi.h +0 -3201
- package/slides/node_modules/node-addon-api/node_addon_api.gyp +0 -32
- package/slides/node_modules/node-addon-api/node_api.gyp +0 -9
- package/slides/node_modules/node-addon-api/noexcept.gypi +0 -26
- package/slides/node_modules/node-addon-api/nothing.c +0 -0
- package/slides/node_modules/node-addon-api/package-support.json +0 -21
- package/slides/node_modules/node-addon-api/package.json +0 -480
- package/slides/node_modules/node-addon-api/tools/README.md +0 -73
- package/slides/node_modules/node-addon-api/tools/check-napi.js +0 -99
- package/slides/node_modules/node-addon-api/tools/clang-format.js +0 -71
- package/slides/node_modules/node-addon-api/tools/conversion.js +0 -301
- package/slides/node_modules/node-addon-api/tools/eslint-format.js +0 -79
- package/slides/node_modules/once/LICENSE +0 -15
- package/slides/node_modules/once/README.md +0 -79
- package/slides/node_modules/once/once.js +0 -42
- package/slides/node_modules/once/package.json +0 -33
- package/slides/node_modules/pako/CHANGELOG.md +0 -164
- package/slides/node_modules/pako/LICENSE +0 -21
- package/slides/node_modules/pako/README.md +0 -191
- package/slides/node_modules/pako/dist/pako.js +0 -6818
- package/slides/node_modules/pako/dist/pako.min.js +0 -1
- package/slides/node_modules/pako/dist/pako_deflate.js +0 -3997
- package/slides/node_modules/pako/dist/pako_deflate.min.js +0 -1
- package/slides/node_modules/pako/dist/pako_inflate.js +0 -3300
- package/slides/node_modules/pako/dist/pako_inflate.min.js +0 -1
- package/slides/node_modules/pako/index.js +0 -14
- package/slides/node_modules/pako/lib/deflate.js +0 -400
- package/slides/node_modules/pako/lib/inflate.js +0 -423
- package/slides/node_modules/pako/lib/utils/common.js +0 -105
- package/slides/node_modules/pako/lib/utils/strings.js +0 -187
- package/slides/node_modules/pako/lib/zlib/README +0 -59
- package/slides/node_modules/pako/lib/zlib/adler32.js +0 -51
- package/slides/node_modules/pako/lib/zlib/constants.js +0 -68
- package/slides/node_modules/pako/lib/zlib/crc32.js +0 -59
- package/slides/node_modules/pako/lib/zlib/deflate.js +0 -1874
- package/slides/node_modules/pako/lib/zlib/gzheader.js +0 -58
- package/slides/node_modules/pako/lib/zlib/inffast.js +0 -345
- package/slides/node_modules/pako/lib/zlib/inflate.js +0 -1556
- package/slides/node_modules/pako/lib/zlib/inftrees.js +0 -343
- package/slides/node_modules/pako/lib/zlib/messages.js +0 -32
- package/slides/node_modules/pako/lib/zlib/trees.js +0 -1222
- package/slides/node_modules/pako/lib/zlib/zstream.js +0 -47
- package/slides/node_modules/pako/package.json +0 -44
- package/slides/node_modules/pptxgenjs/LICENSE +0 -21
- package/slides/node_modules/pptxgenjs/README.md +0 -224
- package/slides/node_modules/pptxgenjs/dist/pptxgen.bundle.js +0 -96
- package/slides/node_modules/pptxgenjs/dist/pptxgen.bundle.js.map +0 -1
- package/slides/node_modules/pptxgenjs/dist/pptxgen.cjs.js +0 -7370
- package/slides/node_modules/pptxgenjs/dist/pptxgen.es.js +0 -7368
- package/slides/node_modules/pptxgenjs/dist/pptxgen.min.js +0 -96
- package/slides/node_modules/pptxgenjs/dist/pptxgen.min.js.map +0 -1
- package/slides/node_modules/pptxgenjs/package.json +0 -96
- package/slides/node_modules/pptxgenjs/types/index.d.ts +0 -2679
- package/slides/node_modules/prebuild-install/CHANGELOG.md +0 -131
- package/slides/node_modules/prebuild-install/CONTRIBUTING.md +0 -6
- package/slides/node_modules/prebuild-install/LICENSE +0 -21
- package/slides/node_modules/prebuild-install/README.md +0 -163
- package/slides/node_modules/prebuild-install/asset.js +0 -44
- package/slides/node_modules/prebuild-install/bin.js +0 -78
- package/slides/node_modules/prebuild-install/download.js +0 -142
- package/slides/node_modules/prebuild-install/error.js +0 -14
- package/slides/node_modules/prebuild-install/help.txt +0 -16
- package/slides/node_modules/prebuild-install/index.js +0 -1
- package/slides/node_modules/prebuild-install/log.js +0 -33
- package/slides/node_modules/prebuild-install/package.json +0 -67
- package/slides/node_modules/prebuild-install/proxy.js +0 -35
- package/slides/node_modules/prebuild-install/rc.js +0 -64
- package/slides/node_modules/prebuild-install/util.js +0 -143
- package/slides/node_modules/process-nextick-args/index.js +0 -45
- package/slides/node_modules/process-nextick-args/license.md +0 -19
- package/slides/node_modules/process-nextick-args/package.json +0 -25
- package/slides/node_modules/process-nextick-args/readme.md +0 -18
- package/slides/node_modules/pump/.github/FUNDING.yml +0 -2
- package/slides/node_modules/pump/.travis.yml +0 -5
- package/slides/node_modules/pump/LICENSE +0 -21
- package/slides/node_modules/pump/README.md +0 -74
- package/slides/node_modules/pump/SECURITY.md +0 -5
- package/slides/node_modules/pump/empty.js +0 -1
- package/slides/node_modules/pump/index.js +0 -86
- package/slides/node_modules/pump/package.json +0 -30
- package/slides/node_modules/pump/test-browser.js +0 -66
- package/slides/node_modules/pump/test-node.js +0 -53
- package/slides/node_modules/queue/LICENSE +0 -8
- package/slides/node_modules/queue/index.d.ts +0 -173
- package/slides/node_modules/queue/index.js +0 -195
- package/slides/node_modules/queue/package.json +0 -43
- package/slides/node_modules/queue/readme.md +0 -221
- package/slides/node_modules/rc/LICENSE.APACHE2 +0 -15
- package/slides/node_modules/rc/LICENSE.BSD +0 -26
- package/slides/node_modules/rc/LICENSE.MIT +0 -24
- package/slides/node_modules/rc/README.md +0 -227
- package/slides/node_modules/rc/browser.js +0 -7
- package/slides/node_modules/rc/cli.js +0 -4
- package/slides/node_modules/rc/index.js +0 -53
- package/slides/node_modules/rc/lib/utils.js +0 -104
- package/slides/node_modules/rc/package.json +0 -29
- package/slides/node_modules/rc/test/ini.js +0 -16
- package/slides/node_modules/rc/test/nested-env-vars.js +0 -50
- package/slides/node_modules/rc/test/test.js +0 -59
- package/slides/node_modules/readable-stream/.travis.yml +0 -34
- package/slides/node_modules/readable-stream/CONTRIBUTING.md +0 -38
- package/slides/node_modules/readable-stream/GOVERNANCE.md +0 -136
- package/slides/node_modules/readable-stream/LICENSE +0 -47
- package/slides/node_modules/readable-stream/README.md +0 -58
- package/slides/node_modules/readable-stream/doc/wg-meetings/2015-01-30.md +0 -60
- package/slides/node_modules/readable-stream/duplex-browser.js +0 -1
- package/slides/node_modules/readable-stream/duplex.js +0 -1
- package/slides/node_modules/readable-stream/lib/_stream_duplex.js +0 -131
- package/slides/node_modules/readable-stream/lib/_stream_passthrough.js +0 -47
- package/slides/node_modules/readable-stream/lib/_stream_readable.js +0 -1019
- package/slides/node_modules/readable-stream/lib/_stream_transform.js +0 -214
- package/slides/node_modules/readable-stream/lib/_stream_writable.js +0 -685
- package/slides/node_modules/readable-stream/lib/internal/streams/BufferList.js +0 -78
- package/slides/node_modules/readable-stream/lib/internal/streams/destroy.js +0 -84
- package/slides/node_modules/readable-stream/lib/internal/streams/stream-browser.js +0 -1
- package/slides/node_modules/readable-stream/lib/internal/streams/stream.js +0 -1
- package/slides/node_modules/readable-stream/package.json +0 -52
- package/slides/node_modules/readable-stream/passthrough.js +0 -1
- package/slides/node_modules/readable-stream/readable-browser.js +0 -7
- package/slides/node_modules/readable-stream/readable.js +0 -19
- package/slides/node_modules/readable-stream/transform.js +0 -1
- package/slides/node_modules/readable-stream/writable-browser.js +0 -1
- package/slides/node_modules/readable-stream/writable.js +0 -8
- package/slides/node_modules/safe-buffer/LICENSE +0 -21
- package/slides/node_modules/safe-buffer/README.md +0 -584
- package/slides/node_modules/safe-buffer/index.d.ts +0 -187
- package/slides/node_modules/safe-buffer/index.js +0 -62
- package/slides/node_modules/safe-buffer/package.json +0 -37
- package/slides/node_modules/semver/LICENSE +0 -15
- package/slides/node_modules/semver/README.md +0 -665
- package/slides/node_modules/semver/bin/semver.js +0 -191
- package/slides/node_modules/semver/classes/comparator.js +0 -143
- package/slides/node_modules/semver/classes/index.js +0 -7
- package/slides/node_modules/semver/classes/range.js +0 -557
- package/slides/node_modules/semver/classes/semver.js +0 -333
- package/slides/node_modules/semver/functions/clean.js +0 -8
- package/slides/node_modules/semver/functions/cmp.js +0 -54
- package/slides/node_modules/semver/functions/coerce.js +0 -62
- package/slides/node_modules/semver/functions/compare-build.js +0 -9
- package/slides/node_modules/semver/functions/compare-loose.js +0 -5
- package/slides/node_modules/semver/functions/compare.js +0 -7
- package/slides/node_modules/semver/functions/diff.js +0 -60
- package/slides/node_modules/semver/functions/eq.js +0 -5
- package/slides/node_modules/semver/functions/gt.js +0 -5
- package/slides/node_modules/semver/functions/gte.js +0 -5
- package/slides/node_modules/semver/functions/inc.js +0 -21
- package/slides/node_modules/semver/functions/lt.js +0 -5
- package/slides/node_modules/semver/functions/lte.js +0 -5
- package/slides/node_modules/semver/functions/major.js +0 -5
- package/slides/node_modules/semver/functions/minor.js +0 -5
- package/slides/node_modules/semver/functions/neq.js +0 -5
- package/slides/node_modules/semver/functions/parse.js +0 -18
- package/slides/node_modules/semver/functions/patch.js +0 -5
- package/slides/node_modules/semver/functions/prerelease.js +0 -8
- package/slides/node_modules/semver/functions/rcompare.js +0 -5
- package/slides/node_modules/semver/functions/rsort.js +0 -5
- package/slides/node_modules/semver/functions/satisfies.js +0 -12
- package/slides/node_modules/semver/functions/sort.js +0 -5
- package/slides/node_modules/semver/functions/valid.js +0 -8
- package/slides/node_modules/semver/index.js +0 -91
- package/slides/node_modules/semver/internal/constants.js +0 -37
- package/slides/node_modules/semver/internal/debug.js +0 -11
- package/slides/node_modules/semver/internal/identifiers.js +0 -29
- package/slides/node_modules/semver/internal/lrucache.js +0 -42
- package/slides/node_modules/semver/internal/parse-options.js +0 -17
- package/slides/node_modules/semver/internal/re.js +0 -223
- package/slides/node_modules/semver/package.json +0 -78
- package/slides/node_modules/semver/preload.js +0 -4
- package/slides/node_modules/semver/range.bnf +0 -16
- package/slides/node_modules/semver/ranges/gtr.js +0 -6
- package/slides/node_modules/semver/ranges/intersects.js +0 -9
- package/slides/node_modules/semver/ranges/ltr.js +0 -6
- package/slides/node_modules/semver/ranges/max-satisfying.js +0 -27
- package/slides/node_modules/semver/ranges/min-satisfying.js +0 -26
- package/slides/node_modules/semver/ranges/min-version.js +0 -63
- package/slides/node_modules/semver/ranges/outside.js +0 -82
- package/slides/node_modules/semver/ranges/simplify.js +0 -49
- package/slides/node_modules/semver/ranges/subset.js +0 -249
- package/slides/node_modules/semver/ranges/to-comparators.js +0 -10
- package/slides/node_modules/semver/ranges/valid.js +0 -13
- package/slides/node_modules/setimmediate/LICENSE.txt +0 -20
- package/slides/node_modules/setimmediate/package.json +0 -30
- package/slides/node_modules/setimmediate/setImmediate.js +0 -186
- package/slides/node_modules/simple-concat/.travis.yml +0 -3
- package/slides/node_modules/simple-concat/LICENSE +0 -20
- package/slides/node_modules/simple-concat/README.md +0 -44
- package/slides/node_modules/simple-concat/index.js +0 -15
- package/slides/node_modules/simple-concat/package.json +0 -47
- package/slides/node_modules/simple-concat/test/basic.js +0 -41
- package/slides/node_modules/simple-get/.github/dependabot.yml +0 -15
- package/slides/node_modules/simple-get/.github/workflows/ci.yml +0 -23
- package/slides/node_modules/simple-get/LICENSE +0 -20
- package/slides/node_modules/simple-get/README.md +0 -333
- package/slides/node_modules/simple-get/index.js +0 -108
- package/slides/node_modules/simple-get/package.json +0 -67
- package/slides/node_modules/string_decoder/.travis.yml +0 -50
- package/slides/node_modules/string_decoder/LICENSE +0 -48
- package/slides/node_modules/string_decoder/README.md +0 -47
- package/slides/node_modules/string_decoder/lib/string_decoder.js +0 -296
- package/slides/node_modules/string_decoder/package.json +0 -31
- package/slides/node_modules/strip-json-comments/index.js +0 -70
- package/slides/node_modules/strip-json-comments/license +0 -21
- package/slides/node_modules/strip-json-comments/package.json +0 -42
- package/slides/node_modules/strip-json-comments/readme.md +0 -64
- package/slides/node_modules/tar-fs/.travis.yml +0 -6
- package/slides/node_modules/tar-fs/LICENSE +0 -21
- package/slides/node_modules/tar-fs/README.md +0 -165
- package/slides/node_modules/tar-fs/index.js +0 -363
- package/slides/node_modules/tar-fs/package.json +0 -41
- package/slides/node_modules/tar-fs/test/fixtures/a/hello.txt +0 -1
- package/slides/node_modules/tar-fs/test/fixtures/b/a/test.txt +0 -1
- package/slides/node_modules/tar-fs/test/fixtures/d/file1 +0 -0
- package/slides/node_modules/tar-fs/test/fixtures/d/file2 +0 -0
- package/slides/node_modules/tar-fs/test/fixtures/d/sub-dir/file5 +0 -0
- package/slides/node_modules/tar-fs/test/fixtures/d/sub-files/file3 +0 -0
- package/slides/node_modules/tar-fs/test/fixtures/d/sub-files/file4 +0 -0
- package/slides/node_modules/tar-fs/test/fixtures/e/directory/.ignore +0 -0
- package/slides/node_modules/tar-fs/test/fixtures/e/file +0 -0
- package/slides/node_modules/tar-fs/test/fixtures/invalid.tar +0 -0
- package/slides/node_modules/tar-fs/test/index.js +0 -346
- package/slides/node_modules/tar-stream/LICENSE +0 -21
- package/slides/node_modules/tar-stream/README.md +0 -168
- package/slides/node_modules/tar-stream/extract.js +0 -257
- package/slides/node_modules/tar-stream/headers.js +0 -295
- package/slides/node_modules/tar-stream/index.js +0 -2
- package/slides/node_modules/tar-stream/node_modules/readable-stream/CONTRIBUTING.md +0 -38
- package/slides/node_modules/tar-stream/node_modules/readable-stream/GOVERNANCE.md +0 -136
- package/slides/node_modules/tar-stream/node_modules/readable-stream/LICENSE +0 -47
- package/slides/node_modules/tar-stream/node_modules/readable-stream/README.md +0 -106
- package/slides/node_modules/tar-stream/node_modules/readable-stream/errors-browser.js +0 -127
- package/slides/node_modules/tar-stream/node_modules/readable-stream/errors.js +0 -116
- package/slides/node_modules/tar-stream/node_modules/readable-stream/experimentalWarning.js +0 -17
- package/slides/node_modules/tar-stream/node_modules/readable-stream/lib/_stream_duplex.js +0 -126
- package/slides/node_modules/tar-stream/node_modules/readable-stream/lib/_stream_passthrough.js +0 -37
- package/slides/node_modules/tar-stream/node_modules/readable-stream/lib/_stream_readable.js +0 -1027
- package/slides/node_modules/tar-stream/node_modules/readable-stream/lib/_stream_transform.js +0 -190
- package/slides/node_modules/tar-stream/node_modules/readable-stream/lib/_stream_writable.js +0 -641
- package/slides/node_modules/tar-stream/node_modules/readable-stream/lib/internal/streams/async_iterator.js +0 -180
- package/slides/node_modules/tar-stream/node_modules/readable-stream/lib/internal/streams/buffer_list.js +0 -183
- package/slides/node_modules/tar-stream/node_modules/readable-stream/lib/internal/streams/destroy.js +0 -96
- package/slides/node_modules/tar-stream/node_modules/readable-stream/lib/internal/streams/end-of-stream.js +0 -86
- package/slides/node_modules/tar-stream/node_modules/readable-stream/lib/internal/streams/from-browser.js +0 -3
- package/slides/node_modules/tar-stream/node_modules/readable-stream/lib/internal/streams/from.js +0 -52
- package/slides/node_modules/tar-stream/node_modules/readable-stream/lib/internal/streams/pipeline.js +0 -86
- package/slides/node_modules/tar-stream/node_modules/readable-stream/lib/internal/streams/state.js +0 -22
- package/slides/node_modules/tar-stream/node_modules/readable-stream/lib/internal/streams/stream-browser.js +0 -1
- package/slides/node_modules/tar-stream/node_modules/readable-stream/lib/internal/streams/stream.js +0 -1
- package/slides/node_modules/tar-stream/node_modules/readable-stream/package.json +0 -68
- package/slides/node_modules/tar-stream/node_modules/readable-stream/readable-browser.js +0 -9
- package/slides/node_modules/tar-stream/node_modules/readable-stream/readable.js +0 -16
- package/slides/node_modules/tar-stream/pack.js +0 -255
- package/slides/node_modules/tar-stream/package.json +0 -58
- package/slides/node_modules/tar-stream/sandbox.js +0 -11
- package/slides/node_modules/tunnel-agent/LICENSE +0 -55
- package/slides/node_modules/tunnel-agent/README.md +0 -4
- package/slides/node_modules/tunnel-agent/index.js +0 -244
- package/slides/node_modules/tunnel-agent/package.json +0 -22
- package/slides/node_modules/undici-types/LICENSE +0 -21
- package/slides/node_modules/undici-types/README.md +0 -6
- package/slides/node_modules/undici-types/agent.d.ts +0 -31
- package/slides/node_modules/undici-types/api.d.ts +0 -43
- package/slides/node_modules/undici-types/balanced-pool.d.ts +0 -29
- package/slides/node_modules/undici-types/cache.d.ts +0 -36
- package/slides/node_modules/undici-types/client.d.ts +0 -108
- package/slides/node_modules/undici-types/connector.d.ts +0 -34
- package/slides/node_modules/undici-types/content-type.d.ts +0 -21
- package/slides/node_modules/undici-types/cookies.d.ts +0 -28
- package/slides/node_modules/undici-types/diagnostics-channel.d.ts +0 -66
- package/slides/node_modules/undici-types/dispatcher.d.ts +0 -256
- package/slides/node_modules/undici-types/env-http-proxy-agent.d.ts +0 -21
- package/slides/node_modules/undici-types/errors.d.ts +0 -149
- package/slides/node_modules/undici-types/eventsource.d.ts +0 -61
- package/slides/node_modules/undici-types/fetch.d.ts +0 -209
- package/slides/node_modules/undici-types/file.d.ts +0 -39
- package/slides/node_modules/undici-types/filereader.d.ts +0 -54
- package/slides/node_modules/undici-types/formdata.d.ts +0 -108
- package/slides/node_modules/undici-types/global-dispatcher.d.ts +0 -9
- package/slides/node_modules/undici-types/global-origin.d.ts +0 -7
- package/slides/node_modules/undici-types/handlers.d.ts +0 -15
- package/slides/node_modules/undici-types/header.d.ts +0 -4
- package/slides/node_modules/undici-types/index.d.ts +0 -71
- package/slides/node_modules/undici-types/interceptors.d.ts +0 -17
- package/slides/node_modules/undici-types/mock-agent.d.ts +0 -50
- package/slides/node_modules/undici-types/mock-client.d.ts +0 -25
- package/slides/node_modules/undici-types/mock-errors.d.ts +0 -12
- package/slides/node_modules/undici-types/mock-interceptor.d.ts +0 -93
- package/slides/node_modules/undici-types/mock-pool.d.ts +0 -25
- package/slides/node_modules/undici-types/package.json +0 -55
- package/slides/node_modules/undici-types/patch.d.ts +0 -33
- package/slides/node_modules/undici-types/pool-stats.d.ts +0 -19
- package/slides/node_modules/undici-types/pool.d.ts +0 -39
- package/slides/node_modules/undici-types/proxy-agent.d.ts +0 -28
- package/slides/node_modules/undici-types/readable.d.ts +0 -65
- package/slides/node_modules/undici-types/retry-agent.d.ts +0 -8
- package/slides/node_modules/undici-types/retry-handler.d.ts +0 -116
- package/slides/node_modules/undici-types/util.d.ts +0 -18
- package/slides/node_modules/undici-types/webidl.d.ts +0 -228
- package/slides/node_modules/undici-types/websocket.d.ts +0 -150
- package/slides/node_modules/util-deprecate/History.md +0 -16
- package/slides/node_modules/util-deprecate/LICENSE +0 -24
- package/slides/node_modules/util-deprecate/README.md +0 -53
- package/slides/node_modules/util-deprecate/browser.js +0 -67
- package/slides/node_modules/util-deprecate/node.js +0 -6
- package/slides/node_modules/util-deprecate/package.json +0 -27
- package/slides/node_modules/wrappy/LICENSE +0 -15
- package/slides/node_modules/wrappy/README.md +0 -36
- package/slides/node_modules/wrappy/package.json +0 -29
- package/slides/node_modules/wrappy/wrappy.js +0 -33
- package/slides/package-lock.json +0 -536
- package/slides/package.json +0 -16
- package/slides/slides.json +0 -238
|
@@ -142,4 +142,47 @@ export class ModelRouter {
|
|
|
142
142
|
modes: MODES,
|
|
143
143
|
};
|
|
144
144
|
}
|
|
145
|
+
|
|
146
|
+
// Suggest a tier downshift when the classifier has enough confidence that
|
|
147
|
+
// a lighter model would still handle the task. Returns null when no
|
|
148
|
+
// suggestion is warranted. NEVER auto-applied — user must accept via UI.
|
|
149
|
+
// Honors the "heavy defaults" design principle: only suggests downshift,
|
|
150
|
+
// never upshift to heavier (user always has that available manually).
|
|
151
|
+
getSuggestion(agentId) {
|
|
152
|
+
const agent = this.daemon.registry.get(agentId);
|
|
153
|
+
if (!agent) return null;
|
|
154
|
+
|
|
155
|
+
const provider = getProvider(agent.provider);
|
|
156
|
+
if (!provider) return null;
|
|
157
|
+
const models = provider.constructor.models;
|
|
158
|
+
|
|
159
|
+
const classifier = this.daemon.classifier;
|
|
160
|
+
if (!classifier) return null;
|
|
161
|
+
const events = classifier.agentWindows[agentId] || [];
|
|
162
|
+
// Need enough events for a confident classification
|
|
163
|
+
if (events.length < 40) return null;
|
|
164
|
+
|
|
165
|
+
const currentModelId = agent.model || models[0]?.id;
|
|
166
|
+
const currentModel = models.find((m) => m.id === currentModelId || currentModelId?.includes(m.id));
|
|
167
|
+
if (!currentModel) return null;
|
|
168
|
+
|
|
169
|
+
const classifiedTier = classifier.classify(agentId);
|
|
170
|
+
const suggestedModel = models.find((m) => m.tier === classifiedTier);
|
|
171
|
+
if (!suggestedModel || suggestedModel.id === currentModel.id) return null;
|
|
172
|
+
|
|
173
|
+
// Tier order (heavy > medium > light). Only suggest if moving to cheaper tier.
|
|
174
|
+
const tierRank = { heavy: 3, medium: 2, light: 1 };
|
|
175
|
+
const currentRank = tierRank[currentModel.tier] || 2;
|
|
176
|
+
const suggestedRank = tierRank[classifiedTier] || 2;
|
|
177
|
+
if (suggestedRank >= currentRank) return null;
|
|
178
|
+
|
|
179
|
+
return {
|
|
180
|
+
agentId,
|
|
181
|
+
currentModel: { id: currentModel.id, name: currentModel.name, tier: currentModel.tier },
|
|
182
|
+
suggestedModel: { id: suggestedModel.id, name: suggestedModel.name, tier: suggestedModel.tier },
|
|
183
|
+
classifiedTier,
|
|
184
|
+
eventCount: events.length,
|
|
185
|
+
reason: `Last ${events.length} events classified as ${classifiedTier}. A lighter model would likely handle this task and reduce cost.`,
|
|
186
|
+
};
|
|
187
|
+
}
|
|
145
188
|
}
|
|
@@ -116,12 +116,35 @@ export class TokenTracker {
|
|
|
116
116
|
cacheReadTokens: detail.cacheReadTokens || 0,
|
|
117
117
|
cacheCreationTokens: detail.cacheCreationTokens || 0,
|
|
118
118
|
model: detail.model || null,
|
|
119
|
+
// Reserved for future per-project grouping (workspaces feature).
|
|
120
|
+
// Caller passes the project's absolute root path when known.
|
|
121
|
+
projectRoot: detail.projectRoot || null,
|
|
119
122
|
timestamp: new Date().toISOString(),
|
|
120
123
|
});
|
|
121
124
|
|
|
122
125
|
this.save();
|
|
123
126
|
}
|
|
124
127
|
|
|
128
|
+
// Sum tokens recorded for an agent since a given timestamp.
|
|
129
|
+
// Used by safety rotation triggers to measure per-instance burn
|
|
130
|
+
// (scoped to spawnedAt avoids counting pre-rotation history).
|
|
131
|
+
getTokensInWindow(agentId, sinceTs) {
|
|
132
|
+
const entry = this.usage[agentId];
|
|
133
|
+
if (!entry || !Array.isArray(entry.sessions)) return 0;
|
|
134
|
+
const cutoff = typeof sinceTs === 'number' ? sinceTs : new Date(sinceTs).getTime();
|
|
135
|
+
let total = 0;
|
|
136
|
+
for (const session of entry.sessions) {
|
|
137
|
+
const ts = new Date(session.timestamp).getTime();
|
|
138
|
+
if (ts >= cutoff) total += session.tokens || 0;
|
|
139
|
+
}
|
|
140
|
+
return total;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
// Rolling velocity: tokens consumed in the last `windowMs` milliseconds.
|
|
144
|
+
getVelocity(agentId, windowMs) {
|
|
145
|
+
return this.getTokensInWindow(agentId, Date.now() - windowMs);
|
|
146
|
+
}
|
|
147
|
+
|
|
125
148
|
// Record session-level result data (cost, duration, turns) — fires once per completion
|
|
126
149
|
recordResult(agentId, { costUsd, durationMs, turns }) {
|
|
127
150
|
this._initAgent(agentId);
|
|
@@ -179,22 +202,23 @@ export class TokenTracker {
|
|
|
179
202
|
return Object.values(this.usage).reduce((sum, a) => sum + (a.totalCostUsd || 0), 0);
|
|
180
203
|
}
|
|
181
204
|
|
|
205
|
+
// Cache hit rate = cache reads / all cacheable input (reads + creation).
|
|
206
|
+
// Fresh inputTokens are conversation turns that were never cache-eligible,
|
|
207
|
+
// so they must be excluded from the denominator.
|
|
182
208
|
getCacheHitRate() {
|
|
183
|
-
let totalRead = 0, totalCreation = 0
|
|
209
|
+
let totalRead = 0, totalCreation = 0;
|
|
184
210
|
for (const a of Object.values(this.usage)) {
|
|
185
211
|
totalRead += a.cacheReadTokens || 0;
|
|
186
212
|
totalCreation += a.cacheCreationTokens || 0;
|
|
187
|
-
totalInput += a.inputTokens || 0;
|
|
188
213
|
}
|
|
189
|
-
const
|
|
190
|
-
return
|
|
214
|
+
const cacheable = totalRead + totalCreation;
|
|
215
|
+
return cacheable > 0 ? totalRead / cacheable : 0;
|
|
191
216
|
}
|
|
192
217
|
|
|
193
218
|
// Generate a savings summary
|
|
194
219
|
getSummary() {
|
|
195
220
|
const totalTokens = this.getTotal();
|
|
196
221
|
const totalCostUsd = this.getTotalCost();
|
|
197
|
-
const agentCount = Object.keys(this.usage).length;
|
|
198
222
|
const sessionDuration = Date.now() - this.sessionStart;
|
|
199
223
|
|
|
200
224
|
let totalInputTokens = 0, totalOutputTokens = 0;
|
|
@@ -210,6 +234,29 @@ export class TokenTracker {
|
|
|
210
234
|
totalTurns += a.totalTurns || 0;
|
|
211
235
|
}
|
|
212
236
|
|
|
237
|
+
// Segregate internal overhead (reserved IDs prefixed __) from user agents.
|
|
238
|
+
// Internal tokens still count in totals (real billing) but show separately.
|
|
239
|
+
const userEntries = Object.entries(this.usage).filter(([id]) => !id.startsWith('__'));
|
|
240
|
+
const internalEntries = Object.entries(this.usage).filter(([id]) => id.startsWith('__'));
|
|
241
|
+
const agentCount = userEntries.length;
|
|
242
|
+
|
|
243
|
+
const internalComponents = {};
|
|
244
|
+
let internalTokens = 0;
|
|
245
|
+
let internalCostUsd = 0;
|
|
246
|
+
for (const [id, data] of internalEntries) {
|
|
247
|
+
internalComponents[id] = {
|
|
248
|
+
tokens: data.total,
|
|
249
|
+
costUsd: data.totalCostUsd || 0,
|
|
250
|
+
inputTokens: data.inputTokens || 0,
|
|
251
|
+
outputTokens: data.outputTokens || 0,
|
|
252
|
+
cacheReadTokens: data.cacheReadTokens || 0,
|
|
253
|
+
cacheCreationTokens: data.cacheCreationTokens || 0,
|
|
254
|
+
sessions: data.sessions.length,
|
|
255
|
+
};
|
|
256
|
+
internalTokens += data.total;
|
|
257
|
+
internalCostUsd += data.totalCostUsd || 0;
|
|
258
|
+
}
|
|
259
|
+
|
|
213
260
|
const coldStartOverhead = this.getColdStartOverhead();
|
|
214
261
|
const coldStartWaste = this.coldStartsSkipped * coldStartOverhead;
|
|
215
262
|
const conflictWaste = this.conflictsPrevented * CONFLICT_OVERHEAD;
|
|
@@ -221,8 +268,10 @@ export class TokenTracker {
|
|
|
221
268
|
? Math.round(rawPct * 10) / 10
|
|
222
269
|
: Math.round(rawPct);
|
|
223
270
|
|
|
224
|
-
|
|
225
|
-
|
|
271
|
+
// Cache hit rate: reads / (reads + creation). Excludes fresh inputTokens
|
|
272
|
+
// which are never cache-eligible.
|
|
273
|
+
const cacheable = totalCacheRead + totalCacheCreation;
|
|
274
|
+
const cacheHitRate = cacheable > 0 ? totalCacheRead / cacheable : 0;
|
|
226
275
|
|
|
227
276
|
return {
|
|
228
277
|
totalTokens,
|
|
@@ -244,7 +293,12 @@ export class TokenTracker {
|
|
|
244
293
|
percentage: coordPct,
|
|
245
294
|
estimatedWithoutGroove: estimatedWithout,
|
|
246
295
|
},
|
|
247
|
-
|
|
296
|
+
internalOverhead: {
|
|
297
|
+
tokens: internalTokens,
|
|
298
|
+
costUsd: internalCostUsd,
|
|
299
|
+
components: internalComponents,
|
|
300
|
+
},
|
|
301
|
+
perAgent: userEntries.map(([id, data]) => ({
|
|
248
302
|
agentId: id,
|
|
249
303
|
tokens: data.total,
|
|
250
304
|
costUsd: data.totalCostUsd || 0,
|
|
@@ -127,19 +127,6 @@ export function validateTeamName(name) {
|
|
|
127
127
|
// Allow spaces and special chars in display name, sanitize for filesystem separately
|
|
128
128
|
}
|
|
129
129
|
|
|
130
|
-
export function sanitizeForFilename(name) {
|
|
131
|
-
const sanitized = name
|
|
132
|
-
.replace(/[^a-zA-Z0-9_-]/g, '_')
|
|
133
|
-
.replace(/_+/g, '_')
|
|
134
|
-
.toLowerCase()
|
|
135
|
-
.slice(0, 50);
|
|
136
|
-
|
|
137
|
-
if (!sanitized || /^_+$/.test(sanitized)) {
|
|
138
|
-
throw new Error('Team name must contain alphanumeric characters');
|
|
139
|
-
}
|
|
140
|
-
return sanitized;
|
|
141
|
-
}
|
|
142
|
-
|
|
143
130
|
const VALID_GATEWAY_TYPES = ['telegram', 'discord', 'slack'];
|
|
144
131
|
const VALID_NOTIFICATION_PRESETS = ['critical', 'lifecycle', 'all', 'custom'];
|
|
145
132
|
|
|
@@ -83,4 +83,68 @@ describe('LockManager', () => {
|
|
|
83
83
|
assert.equal(locks.check('agent-1', 'src/components/App.jsx').conflict, true);
|
|
84
84
|
assert.equal(locks.check('agent-2', 'src/api/auth.js').conflict, true);
|
|
85
85
|
});
|
|
86
|
+
|
|
87
|
+
describe('coordination operations', () => {
|
|
88
|
+
it('declares an operation with no conflict', () => {
|
|
89
|
+
const result = locks.declareOperation('agent-1', 'npm install', ['package.json']);
|
|
90
|
+
assert.equal(result.conflict, false);
|
|
91
|
+
const ops = locks.getOperations();
|
|
92
|
+
assert.equal(ops['agent-1'].name, 'npm install');
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
it('detects conflict when another agent holds a resource', () => {
|
|
96
|
+
locks.declareOperation('agent-1', 'npm install', ['package.json']);
|
|
97
|
+
const result = locks.declareOperation('agent-2', 'edit manifest', ['package.json']);
|
|
98
|
+
assert.equal(result.conflict, true);
|
|
99
|
+
assert.equal(result.owner, 'agent-1');
|
|
100
|
+
assert.equal(result.resource, 'package.json');
|
|
101
|
+
assert.equal(result.operation, 'npm install');
|
|
102
|
+
});
|
|
103
|
+
|
|
104
|
+
it('allows non-overlapping resource claims', () => {
|
|
105
|
+
locks.declareOperation('agent-1', 'npm install', ['package.json']);
|
|
106
|
+
const result = locks.declareOperation('agent-2', 'restart server', ['server:3000']);
|
|
107
|
+
assert.equal(result.conflict, false);
|
|
108
|
+
});
|
|
109
|
+
|
|
110
|
+
it('same agent can update its own declaration', () => {
|
|
111
|
+
locks.declareOperation('agent-1', 'edit', ['file-a']);
|
|
112
|
+
// Same agent can re-declare without conflict
|
|
113
|
+
const result = locks.declareOperation('agent-1', 'edit', ['file-a', 'file-b']);
|
|
114
|
+
assert.equal(result.conflict, false);
|
|
115
|
+
});
|
|
116
|
+
|
|
117
|
+
it('completeOperation releases the claim', () => {
|
|
118
|
+
locks.declareOperation('agent-1', 'npm install', ['package.json']);
|
|
119
|
+
locks.completeOperation('agent-1');
|
|
120
|
+
|
|
121
|
+
const result = locks.declareOperation('agent-2', 'edit', ['package.json']);
|
|
122
|
+
assert.equal(result.conflict, false);
|
|
123
|
+
});
|
|
124
|
+
|
|
125
|
+
it('operations auto-expire after TTL', () => {
|
|
126
|
+
locks.declareOperation('agent-1', 'stale op', ['resource-x'], 1);
|
|
127
|
+
// Wait past TTL
|
|
128
|
+
const start = Date.now();
|
|
129
|
+
while (Date.now() - start < 5) { /* spin briefly */ }
|
|
130
|
+
|
|
131
|
+
const result = locks.declareOperation('agent-2', 'takeover', ['resource-x']);
|
|
132
|
+
assert.equal(result.conflict, false);
|
|
133
|
+
});
|
|
134
|
+
|
|
135
|
+
it('rejects malformed declarations', () => {
|
|
136
|
+
assert.equal(locks.declareOperation(null, 'op', ['r']).conflict, false);
|
|
137
|
+
assert.equal(locks.declareOperation('a', null, ['r']).conflict, false);
|
|
138
|
+
assert.equal(locks.declareOperation('a', 'op', []).conflict, false);
|
|
139
|
+
// All return error flag
|
|
140
|
+
assert.ok(locks.declareOperation('a', 'op', []).error);
|
|
141
|
+
});
|
|
142
|
+
|
|
143
|
+
it('release() also clears pending operations', () => {
|
|
144
|
+
locks.declareOperation('agent-1', 'op', ['r']);
|
|
145
|
+
locks.release('agent-1');
|
|
146
|
+
const result = locks.declareOperation('agent-2', 'op2', ['r']);
|
|
147
|
+
assert.equal(result.conflict, false);
|
|
148
|
+
});
|
|
149
|
+
});
|
|
86
150
|
});
|
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
// GROOVE — MemoryStore Tests (Layer 7)
|
|
2
|
+
// FSL-1.1-Apache-2.0 — see LICENSE
|
|
3
|
+
|
|
4
|
+
import { describe, it, beforeEach } from 'node:test';
|
|
5
|
+
import assert from 'node:assert/strict';
|
|
6
|
+
import { MemoryStore } from '../src/memory.js';
|
|
7
|
+
import { mkdtempSync, existsSync } from 'fs';
|
|
8
|
+
import { join } from 'path';
|
|
9
|
+
import { tmpdir } from 'os';
|
|
10
|
+
|
|
11
|
+
describe('MemoryStore', () => {
|
|
12
|
+
let memory;
|
|
13
|
+
let tmpDir;
|
|
14
|
+
|
|
15
|
+
beforeEach(() => {
|
|
16
|
+
tmpDir = mkdtempSync(join(tmpdir(), 'groove-memory-test-'));
|
|
17
|
+
memory = new MemoryStore(tmpDir);
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
describe('constraints', () => {
|
|
21
|
+
it('starts with no constraints', () => {
|
|
22
|
+
assert.deepEqual(memory.listConstraints(), []);
|
|
23
|
+
assert.equal(memory.getConstraintsMarkdown(), '');
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
it('adds a constraint and returns a hash', () => {
|
|
27
|
+
const result = memory.addConstraint({ text: 'Never touch packages/daemon/index.js', category: 'hard' });
|
|
28
|
+
assert.equal(result.added, true);
|
|
29
|
+
assert.ok(result.hash);
|
|
30
|
+
|
|
31
|
+
const list = memory.listConstraints();
|
|
32
|
+
assert.equal(list.length, 1);
|
|
33
|
+
assert.equal(list[0].category, 'hard');
|
|
34
|
+
assert.match(list[0].text, /Never touch/);
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
it('dedups identical constraints', () => {
|
|
38
|
+
memory.addConstraint({ text: 'ESM only', category: 'pattern' });
|
|
39
|
+
const result = memory.addConstraint({ text: 'ESM only', category: 'pattern' });
|
|
40
|
+
assert.equal(result.added, false);
|
|
41
|
+
assert.equal(result.reason, 'duplicate');
|
|
42
|
+
assert.equal(memory.listConstraints().length, 1);
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
it('rejects empty and oversized text', () => {
|
|
46
|
+
assert.equal(memory.addConstraint({ text: '' }).added, false);
|
|
47
|
+
assert.equal(memory.addConstraint({ text: 'ab' }).added, false);
|
|
48
|
+
assert.equal(memory.addConstraint({ text: 'x'.repeat(600) }).added, false);
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
it('removes constraints by hash', () => {
|
|
52
|
+
const r = memory.addConstraint({ text: 'remove me', category: 'test' });
|
|
53
|
+
assert.equal(memory.removeConstraint(r.hash), true);
|
|
54
|
+
assert.equal(memory.listConstraints().length, 0);
|
|
55
|
+
// Removing non-existent hash returns false
|
|
56
|
+
assert.equal(memory.removeConstraint('nonexistent'), false);
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
it('getConstraintsMarkdown groups by category', () => {
|
|
60
|
+
memory.addConstraint({ text: 'rule-a', category: 'hard' });
|
|
61
|
+
memory.addConstraint({ text: 'rule-b', category: 'hard' });
|
|
62
|
+
memory.addConstraint({ text: 'pattern-x', category: 'pattern' });
|
|
63
|
+
const md = memory.getConstraintsMarkdown();
|
|
64
|
+
assert.match(md, /\*\*hard:\*\*/);
|
|
65
|
+
assert.match(md, /\*\*pattern:\*\*/);
|
|
66
|
+
assert.match(md, /rule-a/);
|
|
67
|
+
assert.match(md, /pattern-x/);
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
it('survives restart', () => {
|
|
71
|
+
memory.addConstraint({ text: 'persists across restart', category: 'test' });
|
|
72
|
+
const memory2 = new MemoryStore(tmpDir);
|
|
73
|
+
assert.equal(memory2.listConstraints().length, 1);
|
|
74
|
+
assert.match(memory2.listConstraints()[0].text, /persists/);
|
|
75
|
+
});
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
describe('handoff chain', () => {
|
|
79
|
+
it('starts with no chain', () => {
|
|
80
|
+
assert.deepEqual(memory.getHandoffChain('backend'), []);
|
|
81
|
+
assert.equal(memory.getRecentHandoffMarkdown('backend'), '');
|
|
82
|
+
});
|
|
83
|
+
|
|
84
|
+
it('appends a rotation entry', () => {
|
|
85
|
+
const ok = memory.appendHandoffBrief('backend', {
|
|
86
|
+
agentId: 'bk-1',
|
|
87
|
+
newAgentId: 'bk-2',
|
|
88
|
+
reason: 'context_threshold',
|
|
89
|
+
oldTokens: 5_000_000,
|
|
90
|
+
contextUsage: 0.82,
|
|
91
|
+
brief: 'Finished auth refactor, started on payment flow',
|
|
92
|
+
timestamp: '2026-04-12T14:00:00Z',
|
|
93
|
+
});
|
|
94
|
+
assert.equal(ok, true);
|
|
95
|
+
|
|
96
|
+
const chain = memory.getHandoffChain('backend');
|
|
97
|
+
assert.equal(chain.length, 1);
|
|
98
|
+
assert.equal(chain[0].rotationN, 1);
|
|
99
|
+
assert.match(chain[0].body, /Rotation 1/);
|
|
100
|
+
assert.match(chain[0].body, /context_threshold/);
|
|
101
|
+
});
|
|
102
|
+
|
|
103
|
+
it('increments rotation numbers and keeps newest first', () => {
|
|
104
|
+
memory.appendHandoffBrief('backend', { brief: 'first' });
|
|
105
|
+
memory.appendHandoffBrief('backend', { brief: 'second' });
|
|
106
|
+
memory.appendHandoffBrief('backend', { brief: 'third' });
|
|
107
|
+
|
|
108
|
+
const chain = memory.getHandoffChain('backend');
|
|
109
|
+
assert.equal(chain.length, 3);
|
|
110
|
+
assert.equal(chain[0].rotationN, 3);
|
|
111
|
+
assert.equal(chain[2].rotationN, 1);
|
|
112
|
+
});
|
|
113
|
+
|
|
114
|
+
it('caps chain at MAX_HANDOFF_ROTATIONS (10)', () => {
|
|
115
|
+
for (let i = 0; i < 15; i++) {
|
|
116
|
+
memory.appendHandoffBrief('backend', { brief: `rotation-${i}` });
|
|
117
|
+
}
|
|
118
|
+
const chain = memory.getHandoffChain('backend');
|
|
119
|
+
assert.equal(chain.length, 10);
|
|
120
|
+
assert.equal(chain[0].rotationN, 15);
|
|
121
|
+
});
|
|
122
|
+
|
|
123
|
+
it('separate chains per role', () => {
|
|
124
|
+
memory.appendHandoffBrief('backend', { brief: 'backend work' });
|
|
125
|
+
memory.appendHandoffBrief('frontend', { brief: 'frontend work' });
|
|
126
|
+
assert.equal(memory.getHandoffChain('backend').length, 1);
|
|
127
|
+
assert.equal(memory.getHandoffChain('frontend').length, 1);
|
|
128
|
+
assert.deepEqual(memory.listHandoffRoles().sort(), ['backend', 'frontend']);
|
|
129
|
+
});
|
|
130
|
+
|
|
131
|
+
it('getRecentHandoffMarkdown returns N newest', () => {
|
|
132
|
+
for (let i = 0; i < 5; i++) {
|
|
133
|
+
memory.appendHandoffBrief('backend', { brief: `brief-${i}` });
|
|
134
|
+
}
|
|
135
|
+
const md = memory.getRecentHandoffMarkdown('backend', 3);
|
|
136
|
+
assert.match(md, /brief-4/);
|
|
137
|
+
assert.match(md, /brief-3/);
|
|
138
|
+
assert.match(md, /brief-2/);
|
|
139
|
+
assert.ok(!md.includes('brief-1'));
|
|
140
|
+
});
|
|
141
|
+
|
|
142
|
+
it('sanitizes role names for filesystem safety', () => {
|
|
143
|
+
const ok = memory.appendHandoffBrief('../evil/role', { brief: 'test' });
|
|
144
|
+
assert.equal(ok, true);
|
|
145
|
+
// File should be created with safe name, no path traversal
|
|
146
|
+
assert.ok(existsSync(tmpDir));
|
|
147
|
+
});
|
|
148
|
+
});
|
|
149
|
+
|
|
150
|
+
describe('discoveries', () => {
|
|
151
|
+
it('starts with no discoveries', () => {
|
|
152
|
+
assert.deepEqual(memory.listDiscoveries(), []);
|
|
153
|
+
assert.equal(memory.getDiscoveriesMarkdown(), '');
|
|
154
|
+
});
|
|
155
|
+
|
|
156
|
+
it('adds a success discovery', () => {
|
|
157
|
+
const result = memory.addDiscovery({
|
|
158
|
+
agentId: 'bk-1',
|
|
159
|
+
role: 'backend',
|
|
160
|
+
trigger: 'Cannot find module gray-matter',
|
|
161
|
+
fix: 'npm install gray-matter',
|
|
162
|
+
outcome: 'success',
|
|
163
|
+
});
|
|
164
|
+
assert.equal(result.added, true);
|
|
165
|
+
|
|
166
|
+
const list = memory.listDiscoveries();
|
|
167
|
+
assert.equal(list.length, 1);
|
|
168
|
+
assert.equal(list[0].role, 'backend');
|
|
169
|
+
});
|
|
170
|
+
|
|
171
|
+
it('rejects non-success outcomes', () => {
|
|
172
|
+
const result = memory.addDiscovery({
|
|
173
|
+
trigger: 'err',
|
|
174
|
+
fix: 'did not work',
|
|
175
|
+
outcome: 'failed',
|
|
176
|
+
});
|
|
177
|
+
assert.equal(result.added, false);
|
|
178
|
+
});
|
|
179
|
+
|
|
180
|
+
it('rejects incomplete records', () => {
|
|
181
|
+
assert.equal(memory.addDiscovery({ trigger: 'x' }).added, false);
|
|
182
|
+
assert.equal(memory.addDiscovery({ fix: 'y' }).added, false);
|
|
183
|
+
});
|
|
184
|
+
|
|
185
|
+
it('dedups identical trigger+fix pairs', () => {
|
|
186
|
+
memory.addDiscovery({ trigger: 'error X', fix: 'fix X' });
|
|
187
|
+
const result = memory.addDiscovery({ trigger: 'error X', fix: 'fix X' });
|
|
188
|
+
assert.equal(result.added, false);
|
|
189
|
+
assert.equal(result.reason, 'duplicate');
|
|
190
|
+
});
|
|
191
|
+
|
|
192
|
+
it('filters by role', () => {
|
|
193
|
+
memory.addDiscovery({ role: 'backend', trigger: 'a', fix: 'fa' });
|
|
194
|
+
memory.addDiscovery({ role: 'frontend', trigger: 'b', fix: 'fb' });
|
|
195
|
+
memory.addDiscovery({ role: 'backend', trigger: 'c', fix: 'fc' });
|
|
196
|
+
|
|
197
|
+
assert.equal(memory.listDiscoveries({ role: 'backend' }).length, 2);
|
|
198
|
+
assert.equal(memory.listDiscoveries({ role: 'frontend' }).length, 1);
|
|
199
|
+
assert.equal(memory.listDiscoveries().length, 3);
|
|
200
|
+
});
|
|
201
|
+
|
|
202
|
+
it('getDiscoveriesMarkdown formats for agent consumption', () => {
|
|
203
|
+
memory.addDiscovery({ role: 'backend', trigger: 'X error', fix: 'do Y' });
|
|
204
|
+
const md = memory.getDiscoveriesMarkdown('backend');
|
|
205
|
+
assert.match(md, /X error/);
|
|
206
|
+
assert.match(md, /do Y/);
|
|
207
|
+
});
|
|
208
|
+
});
|
|
209
|
+
|
|
210
|
+
describe('specializations', () => {
|
|
211
|
+
it('starts empty', () => {
|
|
212
|
+
const all = memory.getAllSpecializations();
|
|
213
|
+
assert.deepEqual(all.perAgent, {});
|
|
214
|
+
assert.deepEqual(all.perProjectRole, {});
|
|
215
|
+
});
|
|
216
|
+
|
|
217
|
+
it('updates an agent profile', () => {
|
|
218
|
+
memory.updateSpecialization('bk-1', {
|
|
219
|
+
role: 'backend',
|
|
220
|
+
qualityScore: 80,
|
|
221
|
+
filesTouched: ['src/a.js', 'src/b.js'],
|
|
222
|
+
});
|
|
223
|
+
const spec = memory.getSpecialization('bk-1');
|
|
224
|
+
assert.ok(spec);
|
|
225
|
+
assert.equal(spec.role, 'backend');
|
|
226
|
+
assert.equal(spec.avgQualityScore, 80);
|
|
227
|
+
assert.equal(spec.sessionCount, 1);
|
|
228
|
+
assert.equal(spec.fileTouches['src/a.js'], 1);
|
|
229
|
+
});
|
|
230
|
+
|
|
231
|
+
it('averages quality score across sessions', () => {
|
|
232
|
+
memory.updateSpecialization('bk-1', { role: 'backend', qualityScore: 70 });
|
|
233
|
+
memory.updateSpecialization('bk-1', { role: 'backend', qualityScore: 90 });
|
|
234
|
+
assert.equal(memory.getSpecialization('bk-1').avgQualityScore, 80);
|
|
235
|
+
assert.equal(memory.getSpecialization('bk-1').sessionCount, 2);
|
|
236
|
+
});
|
|
237
|
+
|
|
238
|
+
it('aggregates per-role stats', () => {
|
|
239
|
+
memory.updateSpecialization('bk-1', { role: 'backend', qualityScore: 80 });
|
|
240
|
+
memory.updateSpecialization('bk-2', { role: 'backend', qualityScore: 60 });
|
|
241
|
+
const all = memory.getAllSpecializations();
|
|
242
|
+
assert.equal(all.perProjectRole.backend.sessionCount, 2);
|
|
243
|
+
assert.equal(all.perProjectRole.backend.avgQualityScore, 70);
|
|
244
|
+
});
|
|
245
|
+
|
|
246
|
+
it('survives restart', () => {
|
|
247
|
+
memory.updateSpecialization('bk-1', { role: 'backend', qualityScore: 75 });
|
|
248
|
+
const memory2 = new MemoryStore(tmpDir);
|
|
249
|
+
assert.equal(memory2.getSpecialization('bk-1').avgQualityScore, 75);
|
|
250
|
+
});
|
|
251
|
+
});
|
|
252
|
+
});
|
|
@@ -162,4 +162,112 @@ describe('Rotator', () => {
|
|
|
162
162
|
assert.equal(stats.totalRotations, 2);
|
|
163
163
|
assert.equal(stats.totalTokensSaved, 8000);
|
|
164
164
|
});
|
|
165
|
+
|
|
166
|
+
describe('safety triggers', () => {
|
|
167
|
+
const SPAWNED = new Date(Date.now() - 60_000).toISOString(); // spawned 1 min ago
|
|
168
|
+
|
|
169
|
+
function mkAgent(overrides = {}) {
|
|
170
|
+
return {
|
|
171
|
+
id: 'a1', name: 'backend-1', role: 'backend',
|
|
172
|
+
provider: 'claude-code', scope: [], model: null,
|
|
173
|
+
tokensUsed: 0, contextUsage: 0.1, workingDir: '/tmp',
|
|
174
|
+
spawnedAt: SPAWNED, status: 'running',
|
|
175
|
+
...overrides,
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
it('returns null when safety config is missing', () => {
|
|
180
|
+
mockDaemon.config = undefined;
|
|
181
|
+
const trigger = rotator._checkSafetyTriggers(mkAgent());
|
|
182
|
+
assert.equal(trigger, null);
|
|
183
|
+
});
|
|
184
|
+
|
|
185
|
+
it('returns null when autoRotate is disabled', () => {
|
|
186
|
+
mockDaemon.config = { safety: { autoRotate: false, tokenCeilingPerAgent: 100 } };
|
|
187
|
+
mockDaemon.tokens.getTokensInWindow = () => 1000;
|
|
188
|
+
const trigger = rotator._checkSafetyTriggers(mkAgent());
|
|
189
|
+
assert.equal(trigger, null);
|
|
190
|
+
});
|
|
191
|
+
|
|
192
|
+
it('fires token_limit_exceeded when instance tokens hit ceiling', () => {
|
|
193
|
+
mockDaemon.config = {
|
|
194
|
+
safety: {
|
|
195
|
+
autoRotate: true,
|
|
196
|
+
tokenCeilingPerAgent: 1_000_000,
|
|
197
|
+
velocityWindowSeconds: 300,
|
|
198
|
+
velocityTokenThreshold: 2_000_000,
|
|
199
|
+
},
|
|
200
|
+
};
|
|
201
|
+
mockDaemon.tokens.getTokensInWindow = () => 1_200_000;
|
|
202
|
+
mockDaemon.tokens.getVelocity = () => 0;
|
|
203
|
+
|
|
204
|
+
const trigger = rotator._checkSafetyTriggers(mkAgent());
|
|
205
|
+
assert.equal(trigger.reason, 'token_limit_exceeded');
|
|
206
|
+
assert.equal(trigger.instanceTokens, 1_200_000);
|
|
207
|
+
assert.equal(trigger.ceiling, 1_000_000);
|
|
208
|
+
});
|
|
209
|
+
|
|
210
|
+
it('fires runaway_velocity when recent burn exceeds threshold', () => {
|
|
211
|
+
mockDaemon.config = {
|
|
212
|
+
safety: {
|
|
213
|
+
autoRotate: true,
|
|
214
|
+
tokenCeilingPerAgent: 10_000_000,
|
|
215
|
+
velocityWindowSeconds: 300,
|
|
216
|
+
velocityTokenThreshold: 1_000_000,
|
|
217
|
+
},
|
|
218
|
+
};
|
|
219
|
+
mockDaemon.tokens.getTokensInWindow = () => 500_000; // under ceiling
|
|
220
|
+
mockDaemon.tokens.getVelocity = () => 1_500_000;
|
|
221
|
+
|
|
222
|
+
const trigger = rotator._checkSafetyTriggers(mkAgent());
|
|
223
|
+
assert.equal(trigger.reason, 'runaway_velocity');
|
|
224
|
+
assert.equal(trigger.velocity, 1_500_000);
|
|
225
|
+
assert.equal(trigger.threshold, 1_000_000);
|
|
226
|
+
assert.equal(trigger.windowMs, 300_000);
|
|
227
|
+
});
|
|
228
|
+
|
|
229
|
+
it('ceiling check takes priority over velocity check', () => {
|
|
230
|
+
mockDaemon.config = {
|
|
231
|
+
safety: {
|
|
232
|
+
autoRotate: true,
|
|
233
|
+
tokenCeilingPerAgent: 1_000_000,
|
|
234
|
+
velocityWindowSeconds: 300,
|
|
235
|
+
velocityTokenThreshold: 1_000_000,
|
|
236
|
+
},
|
|
237
|
+
};
|
|
238
|
+
mockDaemon.tokens.getTokensInWindow = () => 2_000_000;
|
|
239
|
+
mockDaemon.tokens.getVelocity = () => 2_000_000;
|
|
240
|
+
const trigger = rotator._checkSafetyTriggers(mkAgent());
|
|
241
|
+
assert.equal(trigger.reason, 'token_limit_exceeded');
|
|
242
|
+
});
|
|
243
|
+
|
|
244
|
+
it('returns null when neither threshold hit', () => {
|
|
245
|
+
mockDaemon.config = {
|
|
246
|
+
safety: {
|
|
247
|
+
autoRotate: true,
|
|
248
|
+
tokenCeilingPerAgent: 5_000_000,
|
|
249
|
+
velocityWindowSeconds: 300,
|
|
250
|
+
velocityTokenThreshold: 1_500_000,
|
|
251
|
+
},
|
|
252
|
+
};
|
|
253
|
+
mockDaemon.tokens.getTokensInWindow = () => 100_000;
|
|
254
|
+
mockDaemon.tokens.getVelocity = () => 10_000;
|
|
255
|
+
const trigger = rotator._checkSafetyTriggers(mkAgent());
|
|
256
|
+
assert.equal(trigger, null);
|
|
257
|
+
});
|
|
258
|
+
|
|
259
|
+
it('stats track safety-triggered rotations separately', async () => {
|
|
260
|
+
mockDaemon.registry.agents = [mkAgent({ tokensUsed: 1_200_000 })];
|
|
261
|
+
await rotator.rotate('a1', {
|
|
262
|
+
reason: 'token_limit_exceeded',
|
|
263
|
+
instanceTokens: 1_200_000,
|
|
264
|
+
ceiling: 1_000_000,
|
|
265
|
+
});
|
|
266
|
+
|
|
267
|
+
const stats = rotator.getStats();
|
|
268
|
+
assert.equal(stats.tokenLimitRotations, 1);
|
|
269
|
+
assert.equal(stats.velocityRotations, 0);
|
|
270
|
+
assert.equal(stats.totalRotations, 1);
|
|
271
|
+
});
|
|
272
|
+
});
|
|
165
273
|
});
|