From f3d0e3ccc2c39a722c979f24f9dd861bdd142772 Mon Sep 17 00:00:00 2001 From: SYMBaiEX Date: Sat, 6 Jun 2026 17:23:53 -0500 Subject: [PATCH 01/14] =?UTF-8?q?Migrate=20ElizaOS=202.0=20alpha=E2=86=92b?= =?UTF-8?q?eta=20and=20refactor?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bump @elizaos/* from alpha.5xx to the actively-managed beta channel (core beta.1, agent beta.2, skills beta.1, elizaos beta.5, plugins beta.1); keep autonomous on alpha.85 with overrides forcing a single beta core. Fix beta breaking changes: cloud/* + coding-agent-context imports -> @elizaos/autonomous, trajectory types -> @elizaos/core, ModelType.OBJECT_* removal, Evaluator rewritten to the beta shouldRun/schema/prompt/parse/processors contract. Patch plugin-sql@beta.1 broken bun export condition. Refactor: remove dead splash.ts/bootstrap-runtime/no-op imports/cron-parser, fix contracts + plugin-elizacloud manifests, add messages-aware resolveModelPromptText() across providers (+tests). Includes pre-existing terminal-action/execution-contract work. Gates: typecheck 0, 1446 tests pass, build + lint clean. --- bun.lock | 906 +++++++++++++++--- package.json | 31 +- packages/agent/package.json | 2 +- .../agent/src/actions/terminal-action.test.ts | 25 + .../src/actions/terminal-action/index.ts | 2 +- .../src/actions/terminal-action/wiring.ts | 52 +- packages/agent/src/cli/splash.ts | 71 -- packages/agent/src/config/env/schema.ts | 2 +- .../evaluators/memory-nudge-evaluator.test.ts | 74 ++ .../src/evaluators/memory-nudge-evaluator.ts | 149 ++- .../src/runtime/action-result-metadata.ts | 4 +- .../runtime/chat-turn-post-provider.test.ts | 68 ++ .../runtime/chat-turn/execution-contract.ts | 54 +- .../src/runtime/chat-turn/post-provider.ts | 1 + .../linked-provider-accounts/messages.ts | 2 +- .../model-settings.ts | 2 +- .../readiness.test.ts | 2 +- .../linked-provider-accounts/readiness.ts | 2 +- .../native/account-auth/elizacloud-support.ts | 2 +- .../src/runtime/native/account-auth/store.ts | 2 +- .../runtime/native/autonomous-stack/index.ts | 4 - .../native/plugin-registry/local-ollama.ts | 1 - .../native/service-bridge/tooling/context.ts | 2 +- .../service-bridge/tooling/index.test.ts | 2 +- .../native/service-bridge/tooling/types.ts | 2 +- .../provider-ownership/context.test.ts | 4 +- .../diagnostics/provider-ownership/context.ts | 4 +- packages/agent/src/services/media/types.ts | 2 +- .../src/services/trajectory/sdk-native.ts | 2 +- packages/agent/src/types/trajectory/sdk.ts | 51 +- packages/contracts/package.json | 3 - .../coding-agent/runtime.test.ts | 2 +- .../doolittle-plugin/coding-agent/runtime.ts | 2 +- .../doolittle-plugin/coding-agent/types.ts | 2 +- .../doolittle-plugin/model-fallback.ts | 6 +- .../plugins/doolittle-plugin/prompt-text.ts | 31 + .../plugins/plugin-claude-code/package.json | 2 +- .../plugin-claude-code/src/anthropic.ts | 6 +- .../plugin-claude-code/src/prompt-text.ts | 31 + packages/plugins/plugin-codex/package.json | 2 +- packages/plugins/plugin-codex/src/generate.ts | 3 +- .../plugins/plugin-codex/src/prompt-text.ts | 31 + packages/plugins/plugin-devin/package.json | 2 +- packages/plugins/plugin-devin/src/generate.ts | 8 +- .../plugins/plugin-devin/src/prompt-text.ts | 31 + .../plugins/plugin-elizacloud/package.json | 4 +- .../plugins/plugin-elizacloud/src/client.ts | 5 +- .../plugin-elizacloud/src/constants.ts | 2 +- .../plugin-elizacloud/src/generation.ts | 5 +- .../plugin-elizacloud/src/prompt-text.test.ts | 49 + .../plugin-elizacloud/src/prompt-text.ts | 31 + .../plugin-elizacloud/src/runtime-settings.ts | 2 +- packages/plugins/plugin-sql/package.json | 8 +- .../@elizaos%2Fplugin-sql@2.0.0-beta.1.patch | 43 + 54 files changed, 1483 insertions(+), 355 deletions(-) delete mode 100644 packages/agent/src/cli/splash.ts create mode 100644 packages/agent/src/evaluators/memory-nudge-evaluator.test.ts create mode 100644 packages/plugins/doolittle-plugin/prompt-text.ts create mode 100644 packages/plugins/plugin-claude-code/src/prompt-text.ts create mode 100644 packages/plugins/plugin-codex/src/prompt-text.ts create mode 100644 packages/plugins/plugin-devin/src/prompt-text.ts create mode 100644 packages/plugins/plugin-elizacloud/src/prompt-text.test.ts create mode 100644 packages/plugins/plugin-elizacloud/src/prompt-text.ts create mode 100644 patches/@elizaos%2Fplugin-sql@2.0.0-beta.1.patch diff --git a/bun.lock b/bun.lock index f5c2762d..6f035a84 100644 --- a/bun.lock +++ b/bun.lock @@ -8,24 +8,23 @@ "@doolittle/acp": "workspace:*", "@doolittle/contracts": "workspace:*", "@doolittle/logger": "workspace:*", - "@elizaos/agent": "2.0.0-alpha.537", + "@elizaos/agent": "2.0.0-beta.2", "@elizaos/autonomous": "2.0.0-alpha.85", - "@elizaos/core": "2.0.0-alpha.537", - "@elizaos/plugin-anthropic": "2.0.0-alpha.537", + "@elizaos/core": "2.0.0-beta.1", + "@elizaos/plugin-anthropic": "2.0.0-beta.1", "@elizaos/plugin-claude-code": "workspace:*", "@elizaos/plugin-codex": "workspace:*", "@elizaos/plugin-devin": "workspace:*", "@elizaos/plugin-elizacloud": "workspace:*", - "@elizaos/plugin-ollama": "2.0.0-alpha.537", - "@elizaos/plugin-openai": "2.0.0-alpha.537", - "@elizaos/plugin-pdf": "2.0.0-alpha.537", + "@elizaos/plugin-ollama": "2.0.0-beta.1", + "@elizaos/plugin-openai": "2.0.0-beta.1", + "@elizaos/plugin-pdf": "2.0.0-beta.1", "@elizaos/plugin-sql": "workspace:*", - "@elizaos/plugin-telegram": "2.0.0-alpha.537", - "@elizaos/skills": "2.0.0-alpha.539", + "@elizaos/plugin-telegram": "2.0.0-beta.1", + "@elizaos/skills": "2.0.0-beta.1", "@fal-ai/client": "^1.9.4", - "cron-parser": "^5.2.0", "dotenv": "^17.2.3", - "elizaos": "2.0.0-alpha.535", + "elizaos": "2.0.0-beta.5", "zod": "^4.3.6", }, "devDependencies": { @@ -49,7 +48,7 @@ "@doolittle/acp": "workspace:*", "@doolittle/contracts": "workspace:*", "@doolittle/logger": "workspace:*", - "@elizaos/agent": "2.0.0-alpha.537", + "@elizaos/agent": "2.0.0-beta.2", }, }, "packages/benchmarks": { @@ -63,9 +62,6 @@ "packages/contracts": { "name": "@doolittle/contracts", "version": "0.1.0", - "dependencies": { - "@elizaos/core": "2.0.0-alpha.537", - }, }, "packages/distributions": { "name": "@doolittle/distributions", @@ -87,37 +83,37 @@ "name": "@elizaos/plugin-claude-code", "version": "2.0.0-alpha.537", "dependencies": { - "@elizaos/core": "2.0.0-alpha.537", + "@elizaos/core": "2.0.0-beta.1", }, }, "packages/plugins/plugin-codex": { "name": "@elizaos/plugin-codex", "version": "2.0.0-alpha.537", "dependencies": { - "@elizaos/core": "2.0.0-alpha.537", + "@elizaos/core": "2.0.0-beta.1", }, }, "packages/plugins/plugin-devin": { "name": "@elizaos/plugin-devin", "version": "2.0.0-alpha.537", "dependencies": { - "@elizaos/core": "2.0.0-alpha.537", + "@elizaos/core": "2.0.0-beta.1", }, }, "packages/plugins/plugin-elizacloud": { "name": "@elizaos/plugin-elizacloud", "version": "2.0.0-alpha.537", "dependencies": { - "@elizaos/agent": "2.0.0-alpha.537", - "@elizaos/core": "2.0.0-alpha.537", + "@elizaos/autonomous": "2.0.0-alpha.85", + "@elizaos/core": "2.0.0-beta.1", }, }, "packages/plugins/plugin-sql": { "name": "@elizaos/plugin-sql", - "version": "2.0.0-alpha.537-patched.0", + "version": "2.0.0-beta.1-patched.0", "dependencies": { - "@elizaos-official/plugin-sql": "npm:@elizaos/plugin-sql@2.0.0-alpha.20", - "@elizaos/core": "2.0.0-alpha.537", + "@elizaos-official/plugin-sql": "npm:@elizaos/plugin-sql@2.0.0-beta.1", + "@elizaos/core": "2.0.0-beta.1", }, }, "packages/skill-packs-optional": { @@ -129,27 +125,31 @@ "version": "0.1.0", }, }, + "patchedDependencies": { + "@elizaos/plugin-sql@2.0.0-beta.1": "patches/@elizaos%2Fplugin-sql@2.0.0-beta.1.patch", + }, "overrides": { - "@elizaos/agent": "2.0.0-alpha.537", + "@elizaos/agent": "2.0.0-beta.2", "@elizaos/autonomous": "2.0.0-alpha.85", - "@elizaos/core": "2.0.0-alpha.537", - "@elizaos/skills": "2.0.0-alpha.539", - "elizaos": "2.0.0-alpha.535", + "@elizaos/core": "2.0.0-beta.1", + "@elizaos/skills": "2.0.0-beta.1", + "elizaos": "2.0.0-beta.5", + "ollama-ai-provider": "npm:ollama-ai-provider-v2@^3.5.1", }, "packages": { "@adraffy/ens-normalize": ["@adraffy/ens-normalize@1.10.1", "", {}, "sha512-96Z2IP3mYmF1Xg2cDm8f1gWGf/HUVedQ3FMifV4kG/PQ4yEP51xDtRAEfhVNt5f/uzpNkZHwWQuUcu6D6K+Ekw=="], "@ai-sdk/anthropic": ["@ai-sdk/anthropic@3.0.58", "", { "dependencies": { "@ai-sdk/provider": "3.0.8", "@ai-sdk/provider-utils": "4.0.19" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-/53SACgmVukO4bkms4dpxpRlYhW8Ct6QZRe6sj1Pi5H00hYhxIrqfiLbZBGxkdRvjsBQeP/4TVGsXgH5rQeb8Q=="], - "@ai-sdk/gateway": ["@ai-sdk/gateway@3.0.66", "", { "dependencies": { "@ai-sdk/provider": "3.0.8", "@ai-sdk/provider-utils": "4.0.19", "@vercel/oidc": "3.1.0" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-SIQ0YY0iMuv+07HLsZ+bB990zUJ6S4ujORAh+Jv1V2KGNn73qQKnGO0JBk+w+Res8YqOFSycwDoWcFlQrVxS4A=="], + "@ai-sdk/gateway": ["@ai-sdk/gateway@3.0.112", "", { "dependencies": { "@ai-sdk/provider": "3.0.10", "@ai-sdk/provider-utils": "4.0.27", "@vercel/oidc": "3.2.0" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-jiBao9pR4owWyjo0BnuNc7WSQBGOD0thysE4AFgZXaG+zMFbISQXUkJr7ePw/phBvePy7jE5FSA2Lf7lwqUiiQ=="], "@ai-sdk/google": ["@ai-sdk/google@3.0.52", "", { "dependencies": { "@ai-sdk/provider": "3.0.8", "@ai-sdk/provider-utils": "4.0.21" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-HiFB4VlHnv55k9xIbgQW9tHw5OsLXzbAghnDUqrnk/S94QpQuyrDwLSDsk/tUkxJeT00B+wvhL1y6/SARdLeXw=="], "@ai-sdk/openai": ["@ai-sdk/openai@3.0.41", "", { "dependencies": { "@ai-sdk/provider": "3.0.8", "@ai-sdk/provider-utils": "4.0.19" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-IZ42A+FO+vuEQCVNqlnAPYQnnUpUfdJIwn1BEDOBywiEHa23fw7PahxVtlX9zm3/zMvTW4JKPzWyvAgDu+SQ2A=="], - "@ai-sdk/provider": ["@ai-sdk/provider@3.0.8", "", { "dependencies": { "json-schema": "^0.4.0" } }, "sha512-oGMAgGoQdBXbZqNG0Ze56CHjDZ1IDYOwGYxYjO5KLSlz5HiNQ9udIXsPZ61VWaHGZ5XW/jyjmr6t2xz2jGVwbQ=="], + "@ai-sdk/provider": ["@ai-sdk/provider@3.0.10", "", { "dependencies": { "json-schema": "^0.4.0" } }, "sha512-Q3BZ27qfpYqnCYGvE3vt+Qi6LGOF9R5Nmzn+9JoM1lCRsD9mYaIhfJLkSunN48nfGXJ6n+XNV0J/XVpqGQl7Dw=="], - "@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@4.0.19", "", { "dependencies": { "@ai-sdk/provider": "3.0.8", "@standard-schema/spec": "^1.1.0", "eventsource-parser": "^3.0.6" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-3eG55CrSWCu2SXlqq2QCsFjo3+E7+Gmg7i/oRVoSZzIodTuDSfLb3MRje67xE9RFea73Zao7Lm4mADIfUETKGg=="], + "@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@4.0.27", "", { "dependencies": { "@ai-sdk/provider": "3.0.10", "@standard-schema/spec": "^1.1.0", "eventsource-parser": "^3.0.8" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-ubkAJ+xODouwtmN1tYlvTPphH1hPOBfZaEQe8U7skGvFAnIRs9PPpsq57bC2+Ky/MB4yzhd6YOsxTAx9sGpazw=="], "@ai-sdk/react": ["@ai-sdk/react@1.2.12", "", { "dependencies": { "@ai-sdk/provider-utils": "2.2.8", "@ai-sdk/ui-utils": "1.2.11", "swr": "^2.2.5", "throttleit": "2.1.0" }, "peerDependencies": { "react": "^18 || ^19 || ^19.0.0-rc", "zod": "^3.23.8" }, "optionalPeers": ["zod"] }, "sha512-jK1IZZ22evPZoQW3vlkZ7wvjYGYF+tRBKXtrcolduIkQ/m/sOAVcVeVDUDvh1T91xCnWCdUGCPZg2avZ90mv3g=="], @@ -255,8 +255,6 @@ "@bramus/specificity": ["@bramus/specificity@2.4.2", "", { "dependencies": { "css-tree": "^3.0.0" }, "bin": { "specificity": "bin/cli.js" } }, "sha512-ctxtJ/eA+t+6q2++vj5j7FYX3nRu311q1wfYH3xjlLOsczhlhxAg2FWNUXhpGvAw3BWo1xBcvOV6/YLc2r5FJw=="], - "@bufbuild/protobuf": ["@bufbuild/protobuf@2.11.0", "", {}, "sha512-sBXGT13cpmPR5BMgHE6UEEfEaShh5Ror6rfN3yEK5si7QVrtZg8LEPQb0VVhiLRUslD2yLnXtnRzG035J/mZXQ=="], - "@cacheable/memory": ["@cacheable/memory@2.0.8", "", { "dependencies": { "@cacheable/utils": "^2.4.0", "@keyv/bigmap": "^1.3.1", "hookified": "^1.15.1", "keyv": "^5.6.0" } }, "sha512-FvEb29x5wVwu/Kf93IWwsOOEuhHh6dYCJF3vcKLzXc0KXIW181AOzv6ceT4ZpBHDvAfG60eqb+ekmrnLHIy+jw=="], "@cacheable/node-cache": ["@cacheable/node-cache@1.7.6", "", { "dependencies": { "cacheable": "^2.3.1", "hookified": "^1.14.0", "keyv": "^5.5.5" } }, "sha512-6Omk2SgNnjtxB5f/E6bTIWIt5xhdpx39fGNRQgU9lojvRxU68v+qY+SXXLsp3ZGukqoPjsK21wZ6XABFr/Ge3A=="], @@ -285,6 +283,22 @@ "@csstools/css-tokenizer": ["@csstools/css-tokenizer@4.0.0", "", {}, "sha512-QxULHAm7cNu72w97JUNCBFODFaXpbDg+dP8b/oWFAZ2MTRppA3U00Y2L1HqaS4J6yBqxwa/Y3nMBaxVKbB/NsA=="], + "@derhuerst/http-basic": ["@derhuerst/http-basic@8.2.4", "", { "dependencies": { "caseless": "^0.12.0", "concat-stream": "^2.0.0", "http-response-object": "^3.0.1", "parse-cache-control": "^1.0.1" } }, "sha512-F9rL9k9Xjf5blCz8HsJRO4diy111cayL2vkY2XE4r4t3n0yPXVYy3KD3nJ1qbrSn9743UWSXH4IwuCa/HWlGFw=="], + + "@discordjs/builders": ["@discordjs/builders@1.14.1", "", { "dependencies": { "@discordjs/formatters": "^0.6.2", "@discordjs/util": "^1.2.0", "@sapphire/shapeshift": "^4.0.0", "discord-api-types": "^0.38.40", "fast-deep-equal": "^3.1.3", "ts-mixer": "^6.0.4", "tslib": "^2.6.3" } }, "sha512-gSKkhXLqs96TCzk66VZuHHl8z2bQMJFGwrXC0f33ngK+FLNau4hU1PYny3DNJfNdSH+gVMzE85/d5FQ2BpcNwQ=="], + + "@discordjs/collection": ["@discordjs/collection@2.1.1", "", {}, "sha512-LiSusze9Tc7qF03sLCujF5iZp7K+vRNEDBZ86FT9aQAv3vxMLihUvKvpsCWiQ2DJq1tVckopKm1rxomgNUc9hg=="], + + "@discordjs/formatters": ["@discordjs/formatters@0.6.2", "", { "dependencies": { "discord-api-types": "^0.38.33" } }, "sha512-y4UPwWhH6vChKRkGdMB4odasUbHOUwy7KL+OVwF86PvT6QVOwElx+TiI1/6kcmcEe+g5YRXJFiXSXUdabqZOvQ=="], + + "@discordjs/rest": ["@discordjs/rest@2.6.1", "", { "dependencies": { "@discordjs/collection": "^2.1.1", "@discordjs/util": "^1.2.0", "@sapphire/async-queue": "^1.5.3", "@sapphire/snowflake": "^3.5.5", "@vladfrangu/async_event_emitter": "^2.4.6", "discord-api-types": "^0.38.40", "magic-bytes.js": "^1.13.0", "tslib": "^2.6.3", "undici": "6.24.1" } }, "sha512-wwQdgjeaoYFiaG+atbqx6aJDpqW7JHAo0HrQkBTbYzM3/PJ3GweQIpgElNcGZ26DCUOXMyawYd0YF7vtr+fZXg=="], + + "@discordjs/util": ["@discordjs/util@1.2.0", "", { "dependencies": { "discord-api-types": "^0.38.33" } }, "sha512-3LKP7F2+atl9vJFhaBjn4nOaSWahZ/yWjOvA4e5pnXkt2qyXRCHLxoBQy81GFtLGCq7K9lPm9R517M1U+/90Qg=="], + + "@discordjs/voice": ["@discordjs/voice@0.19.2", "", { "dependencies": { "@snazzah/davey": "^0.1.9", "@types/ws": "^8.18.1", "discord-api-types": "^0.38.41", "prism-media": "^1.3.5", "tslib": "^2.8.1", "ws": "^8.19.0" } }, "sha512-3yJ255e4ag3wfZu/DSxeOZK1UtnqNxnspmLaQetGT0pDkThNZoHs+Zg6dgZZ19JEVomXygvfHn9lNpICZuYtEA=="], + + "@discordjs/ws": ["@discordjs/ws@1.2.3", "", { "dependencies": { "@discordjs/collection": "^2.1.0", "@discordjs/rest": "^2.5.1", "@discordjs/util": "^1.1.0", "@sapphire/async-queue": "^1.5.2", "@types/ws": "^8.5.10", "@vladfrangu/async_event_emitter": "^2.2.4", "discord-api-types": "^0.38.1", "tslib": "^2.6.2", "ws": "^8.17.0" } }, "sha512-wPlQDxEmlDg5IxhJPuxXr3Vy9AjYq5xCvFWGJyD7w7Np8ZGu+Mc+97LCoEc/+AYCo2IDpKioiH0/c/mj5ZR9Uw=="], + "@doolittle/acp": ["@doolittle/acp@workspace:packages/acp"], "@doolittle/agent": ["@doolittle/agent@workspace:packages/agent"], @@ -311,25 +325,35 @@ "@electric-sql/pglite": ["@electric-sql/pglite@0.4.5", "", {}, "sha512-aGG2zGEyZzGWKy8P+9ZoNUV0jxt1+hgbeTf+bVAYyxVZZLXg3/9aFlfLxb08AYZVAfAkQlQIysmWjhc5hwDG8g=="], - "@elizaos-official/plugin-sql": ["@elizaos/plugin-sql@2.0.0-alpha.20", "", { "dependencies": { "@electric-sql/pglite": "^0.4.0", "@elizaos/core": "^2.0.0-alpha.537", "@neondatabase/serverless": "^1.1.0", "dotenv": "^17.2.3", "drizzle-kit": "^0.31.8", "drizzle-orm": "0.45.2", "pg": "^8.16.3", "uuid": "^14.0.0", "ws": "^8.18.3" } }, "sha512-go3IS6EmZTdlIFiixEAp+tR8SCWIViUtXFU22Y+CCRRZTJk/A25e9YDDM+3wNnsQa9PXMu6yU2O+9SP4sFQP+A=="], + "@elizaos-official/plugin-sql": ["@elizaos/plugin-sql@2.0.0-beta.1", "", { "dependencies": { "@electric-sql/pglite": "^0.4.0", "@neondatabase/serverless": "^1.1.0", "drizzle-orm": "0.45.2", "pg": "^8.16.3", "uuid": "^14.0.0", "ws": "^8.18.3" }, "peerDependencies": { "@elizaos/core": "2.0.0-beta.1" } }, "sha512-1IWyanD7IGljBSkbAidstQSaGMHkAteh+uLS4J+HnCeuphS7LQkVyCJ+ZQuoPb9uUL7v8zyNXfEMQPE3pfDJNw=="], - "@elizaos/agent": ["@elizaos/agent@2.0.0-alpha.537", "", { "dependencies": { "@clack/prompts": "^1.0.0", "@elizaos/core": "^2.0.0-alpha.537", "@elizaos/plugin-agent-orchestrator": "^2.0.0-alpha.10", "@elizaos/plugin-agent-skills": "^2.0.0-alpha.71", "@elizaos/plugin-browser-bridge": "^0.1.1", "@elizaos/plugin-local-embedding": "^2.0.0-alpha.12", "@elizaos/plugin-ollama": "^2.0.0-alpha.14", "@elizaos/plugin-pdf": "^2.0.0-alpha.18", "@elizaos/plugin-sql": "^2.0.0-alpha.20", "@elizaos/plugin-wechat": "^2.0.0-alpha.537", "@elizaos/shared": "^2.0.0-alpha.537", "@elizaos/skills": "^2.0.0-alpha.539", "@elizaos/vault": "^2.0.0-alpha.537", "@hapi/boom": "^10.0.1", "@noble/curves": "^2.0.1", "@solana/web3.js": "1.98.4", "@whiskeysockets/baileys": "7.0.0-rc.9", "abitype": "^1.0.0", "coding-agent-adapters": "0.16.3", "dotenv": "^17.2.3", "drizzle-orm": "0.45.2", "ethers": "^6.16.0", "git-workspace-service": "0.4.5", "jsdom": "^29.0.0", "json5": "^2.2.3", "pg": "^8.16.3", "pino": "^10.3.1", "pty-manager": "1.11.0", "puppeteer-core": "^24.37.5", "qrcode": "^1.5.4", "telegram": "2.26.22", "viem": "^2.48.8", "ws": "^8.19.0", "zod": "^4.4.2" }, "optionalDependencies": { "@elizaos/app-elizamaker": "*", "@elizaos/app-lifeops": "*", "@elizaos/app-task-coordinator": "*", "@elizaos/app-training": "*", "@elizaos/capacitor-contacts": "*", "@elizaos/capacitor-phone": "*", "@elizaos/capacitor-wifi": "*", "@elizaos/plugin-streaming": "*", "@elizaos/plugin-video": "*", "@elizaos/plugin-wallet": "*" }, "peerDependencies": { "@elizaos/signal-native": "*" }, "optionalPeers": ["@elizaos/signal-native"], "bin": { "eliza-autonomous": "packages/agent/src/bin.js" } }, "sha512-gKA25EE+8X4SJLOF8Bc+OrE0eUv6tu1EcT0bwIrou6IcMTCUXgaB8ZKJCQgN5tNhhOf8AhLhaCUj0Mg3noRAOg=="], + "@elizaos/agent": ["@elizaos/agent@2.0.0-beta.2", "", { "dependencies": { "@clack/prompts": "^1.0.0", "@elizaos/capacitor-contacts": "2.0.0-beta.1", "@elizaos/capacitor-phone": "2.0.0-beta.1", "@elizaos/capacitor-wifi": "2.0.0-beta.1", "@elizaos/core": "2.0.0-beta.1", "@elizaos/plugin-agent-skills": "2.0.0-beta.1", "@elizaos/plugin-aosp-local-inference": "2.0.0-beta.1", "@elizaos/plugin-browser": "2.0.0-beta.1", "@elizaos/plugin-capacitor-bridge": "2.0.0-beta.1", "@elizaos/plugin-coding-tools": "2.0.0-beta.1", "@elizaos/plugin-commands": "2.0.0-beta.1", "@elizaos/plugin-computeruse": "2.0.0-beta.1", "@elizaos/plugin-discord": "2.0.0-beta.2", "@elizaos/plugin-discord-local": "2.0.0-beta.1", "@elizaos/plugin-elizacloud": "2.0.0-beta.1", "@elizaos/plugin-imessage": "2.0.0-beta.1", "@elizaos/plugin-local-embedding": "2.0.0-beta.1", "@elizaos/plugin-local-inference": "2.0.0-beta.1", "@elizaos/plugin-mcp": "2.0.0-beta.1", "@elizaos/plugin-ollama": "2.0.0-beta.1", "@elizaos/plugin-pdf": "2.0.0-beta.1", "@elizaos/plugin-signal": "2.0.0-beta.1", "@elizaos/plugin-sql": "2.0.0-beta.1", "@elizaos/plugin-streaming": "2.0.0-beta.1", "@elizaos/plugin-video": "2.0.0-beta.1", "@elizaos/plugin-wechat": "2.0.0-beta.1", "@elizaos/plugin-whatsapp": "2.0.0-beta.1", "@elizaos/plugin-workflow": "2.0.0-beta.1", "@elizaos/plugin-x402": "2.0.0-beta.1", "@elizaos/shared": "2.0.0-beta.1", "@elizaos/skills": "2.0.0-beta.1", "@elizaos/vault": "2.0.0-beta.1", "@hapi/boom": "^10.0.1", "@noble/curves": "2.2.0", "@solana/web3.js": "1.98.4", "@whiskeysockets/baileys": "7.0.0-rc.9", "abitype": "^1.0.0", "coding-agent-adapters": "0.16.3", "dotenv": "^17.2.3", "drizzle-orm": "0.45.2", "esbuild": "^0.28.0", "ethers": "^6.16.0", "git-workspace-service": "0.4.5", "jsdom": "^29.0.0", "json5": "^2.2.3", "pg": "^8.16.3", "pino": "^10.3.1", "pty-manager": "1.11.0", "puppeteer-core": "^24.37.5", "qrcode": "^1.5.4", "telegram": "2.26.22", "viem": "^2.48.8", "ws": "^8.19.0", "zod": "^4.4.3" }, "peerDependencies": { "@elizaos/signal-native": "*" }, "optionalPeers": ["@elizaos/signal-native"], "bin": { "eliza-autonomous": "packages/agent/src/bin.js" } }, "sha512-klBvkeRWR6TG4dG0FZh9k0Nmyfn78c3Vuzp/+MFhTxOKdzQzR+Tr7YCuAhL/Qz+4ZEaK5TCNkpmcoVJhdY2Oww=="], "@elizaos/autonomous": ["@elizaos/autonomous@2.0.0-alpha.85", "", { "dependencies": { "@clack/prompts": "^1.0.0", "@elizaos/core": "^2.0.0-alpha.85", "@elizaos/plugin-agent-orchestrator": "0.3.15", "@elizaos/plugin-agent-skills": "alpha", "@elizaos/plugin-anthropic": "alpha", "@elizaos/plugin-coding-agent": "0.1.0-next.1", "@elizaos/plugin-cron": "alpha", "@elizaos/plugin-elizacloud": "alpha", "@elizaos/plugin-experience": "alpha", "@elizaos/plugin-form": "alpha", "@elizaos/plugin-knowledge": "alpha", "@elizaos/plugin-local-embedding": "alpha", "@elizaos/plugin-ollama": "alpha", "@elizaos/plugin-openai": "alpha", "@elizaos/plugin-pdf": "alpha", "@elizaos/plugin-personality": "alpha", "@elizaos/plugin-pi-ai": "alpha", "@elizaos/plugin-plugin-manager": "alpha", "@elizaos/plugin-rolodex": "alpha", "@elizaos/plugin-secrets-manager": "alpha", "@elizaos/plugin-shell": "alpha", "@elizaos/plugin-sql": "alpha", "@elizaos/plugin-todo": "alpha", "@elizaos/plugin-trajectory-logger": "alpha", "@elizaos/plugin-trust": "alpha", "@elizaos/skills": "^2.0.0-alpha.85", "@hapi/boom": "^10.0.1", "@lunchtable/plugin-ltcg": "^0.1.0", "@mariozechner/pi-ai": "0.52.12", "@noble/curves": "^2.0.1", "@whiskeysockets/baileys": "7.0.0-rc.9", "coding-agent-adapters": "0.12.0", "dotenv": "^17.2.3", "drizzle-orm": "0.45.1", "ethers": "^6.16.0", "git-workspace-service": "0.4.4", "json5": "^2.2.3", "pg": "^8.16.3", "pino": "^10.3.1", "pty-manager": "1.9.8", "puppeteer-core": "^24.37.5", "qrcode": "^1.5.4", "ws": "^8.19.0", "zod": "^4.3.6" }, "peerDependencies": { "@miladyai/signal-native": "*" }, "optionalPeers": ["@miladyai/signal-native"], "bin": { "milady-autonomous": "packages/autonomous/src/bin.js" } }, "sha512-wT3LlmpvkMTL6rquRsW+DnrevrLGhCRUGMQHUaNh2GFSbEMFQTPgyHTpgG+0yExA7EkQT+pbHwKUYUTgIDq+xw=="], - "@elizaos/capacitor-contacts": ["@elizaos/capacitor-contacts@1.0.0", "", { "peerDependencies": { "@capacitor/core": "^8.3.1" } }, "sha512-y2+hReo7XGkoDMPxTkHLR6F1yfFkq9+dc1WW4GkUWU//TLDlKWQF6VwS1NabKGwq6G8taoZw58PbXyfJCV8o/Q=="], + "@elizaos/capacitor-contacts": ["@elizaos/capacitor-contacts@2.0.0-beta.1", "", { "peerDependencies": { "@capacitor/core": "^8.3.1" } }, "sha512-ek3VxkIjGoLodUU/Pn8Heis70tESACZRlqUgPvbn9WIKTDq2oo5mwito7VUxoDv8EB2Ku+Q1gxkNkb9jk2Ofsw=="], + + "@elizaos/capacitor-phone": ["@elizaos/capacitor-phone@2.0.0-beta.1", "", { "peerDependencies": { "@capacitor/core": "^8.3.1" } }, "sha512-qzZyXpCRNxVbGSNhQyvi9ByB4Prx7Z+n6T3hvkCFGnaatV6ogE0GyRqEvDddfRr08c9e5ROrvsp9XbYn1GCHzQ=="], + + "@elizaos/capacitor-wifi": ["@elizaos/capacitor-wifi@2.0.0-beta.1", "", { "peerDependencies": { "@capacitor/core": "^8.3.1" } }, "sha512-BwDGapEwJnImKd1+iXFxtob9TaZULvsD6vldJX1Glh8UxQiS2QXxJlItw6Zac0RE6kmVSzTosXKvsUBLqtQyag=="], + + "@elizaos/cloud-routing": ["@elizaos/cloud-routing@2.0.0-beta.1", "", { "peerDependencies": { "zod": "^4.4.3" } }, "sha512-uMQ5TK6FlgrP8jIaSbXG5tQ+6zQzJ52uw6BLuZMubQYY+cXpNYDbu+1fdUrSKe+d/GbqKVzzshwkEIhG5SXymQ=="], + + "@elizaos/cloud-sdk": ["@elizaos/cloud-sdk@2.0.0-beta.1", "", {}, "sha512-79Vv7BeRk4nRAoVFZTkmv+x0YP3xRcmjpArxCmdAY9ZbSHU3wR1Gle2lHSN3/Thm89sRLYOmt1Nq5ChnYFq45w=="], - "@elizaos/capacitor-phone": ["@elizaos/capacitor-phone@1.0.0", "", { "peerDependencies": { "@capacitor/core": "^8.3.1" } }, "sha512-dYsPSHUSnkiV2ks9abC5ew5zmB+uZHKaXRPBkqIbxDconHUgN3SQfZR7cR7Z8lDhtzpaKmv6XQQbO/UKpZDk0g=="], + "@elizaos/core": ["@elizaos/core@2.0.0-beta.1", "", { "dependencies": { "@ai-sdk/anthropic": "^3.0.13", "@ai-sdk/gateway": "^3.0.109", "@ai-sdk/google": "^3.0.8", "@ai-sdk/openai": "^3.0.9", "@ai-sdk/provider": "^3.0.10", "@ai-sdk/provider-utils": "^4.0.7", "@anthropic-ai/sdk": "^0.92.0", "@elizaos/prompts": "2.0.0-beta.1", "@noble/ciphers": "2.2.0", "@noble/hashes": "2.2.0", "@openrouter/ai-sdk-provider": "^2.0.0", "@standard-schema/spec": "^1.0.0", "adze": "^2.2.5", "ai": "^6.0.30", "coding-agent-adapters": "0.16.3", "dedent": "^1.7.1", "dotenv": "^17.2.3", "drizzle-orm": "0.45.2", "eventsource-parser": "^3.0.8", "fast-redact": "^3.5.0", "file-type": "^22.0.0", "fs-extra": "^11.3.2", "git-workspace-service": "0.4.5", "glob": "^13.0.0", "handlebars": "^4.7.8", "json5": "^2.2.3", "mammoth": "^1.9.0", "markdown-it": "^14.1.0", "pdfjs-dist": "^5.4.530", "underscore": "^1.13.8", "undici": "8.2.0", "unique-names-generator": "^4.7.1", "unpdf": "^1.4.0", "uuid": "^14.0.0", "yaml": "^2.7.0", "zod": "^4.4.3" } }, "sha512-RxdOuA5GOeFvD9yljeP311wZ8rDDull7dOJV9DCikUNzKnCix+xDPDydYxgz6r0wReJHfkkTH0/RaDcSwTCPCg=="], - "@elizaos/core": ["@elizaos/core@2.0.0-alpha.537", "", { "dependencies": { "@ai-sdk/anthropic": "^3.0.13", "@ai-sdk/google": "^3.0.8", "@ai-sdk/openai": "^3.0.9", "@anthropic-ai/sdk": "^0.92.0", "@bufbuild/protobuf": "^2.11.0", "@noble/ciphers": "^2.0.0", "@noble/hashes": "2.2.0", "@openrouter/ai-sdk-provider": "^2.0.0", "@toon-format/toon": "^2.1.0", "adze": "^2.2.5", "ai": "^6.0.30", "coding-agent-adapters": "0.16.3", "dedent": "^1.7.1", "dotenv": "^17.2.3", "drizzle-orm": "0.45.2", "fast-redact": "^3.5.0", "file-type": "^22.0.0", "fs-extra": "^11.3.2", "git-workspace-service": "0.4.5", "glob": "^13.0.0", "handlebars": "^4.7.8", "json5": "^2.2.3", "mammoth": "^1.9.0", "markdown-it": "^14.1.0", "pdfjs-dist": "^5.4.530", "undici": "^8.0.0", "unique-names-generator": "^4.7.1", "unpdf": "^1.4.0", "uuid": "^14.0.0", "yaml": "^2.7.0", "zod": "^4.4.2" } }, "sha512-kCpb6xx3mEKMOWO7gL9DwdIX7nk6fexkOC782sI2ge17Eps2AnX+zTz2V+wkjiXzQ8slEAeAqBrKY75vJ00Rag=="], + "@elizaos/plugin-agent-orchestrator": ["@elizaos/plugin-agent-orchestrator@0.3.15", "", { "dependencies": { "coding-agent-adapters": "0.12.0", "pty-console": "0.3.1" }, "peerDependencies": { "@elizaos/core": ">=2.0.0-alpha.0", "git-workspace-service": "0.4.4", "pty-manager": "1.10.0" } }, "sha512-22aoptlKrNhApQKa9+aZvZ/CTLOaYM1tIMCp+dt/ploI2J8JyRo9r80SGIEGq9iayBjlMXzh4MNHjryH+agXEQ=="], - "@elizaos/plugin-agent-orchestrator": ["@elizaos/plugin-agent-orchestrator@2.0.0-alpha.537", "", { "dependencies": { "coding-agent-adapters": "0.16.3", "drizzle-orm": "^0.45.1", "pty-console": "0.3.1", "pty-state-capture": "0.2.0" }, "peerDependencies": { "@elizaos/core": "^2.0.0-alpha.537", "git-workspace-service": "0.4.5", "pty-manager": "1.11.0" } }, "sha512-VOz9RvD29HuBuJ9VtC6hZIH58yTPmIZWKuTENDowKcLEE+fBg/5u9m9Bnpi6PzRb1yRB64V4/lhnZlaO+0fZGw=="], + "@elizaos/plugin-agent-skills": ["@elizaos/plugin-agent-skills@2.0.0-beta.1", "", { "dependencies": { "@elizaos/core": "2.0.0-beta.1", "fflate": "^0.8.2" } }, "sha512-gDPDkJ6ThTS5S9zpO2a/P7mmERWk0/rNVorigi5f6sMbi1zcp+QuW2iYlXZWsINPB9VRgWU6qELwXWsQgl137w=="], - "@elizaos/plugin-agent-skills": ["@elizaos/plugin-agent-skills@2.0.0-alpha.537", "", { "dependencies": { "@elizaos/core": "^2.0.0-alpha.537", "fflate": "^0.8.2" } }, "sha512-aY8gyPXkkYsYgoQjV7d/wda5w9EeJtlwZKdkWmNwXi5fvvd9b2BGwSW+ujFXtWJgdN2uKLoFKxOXWCc/yCRFbQ=="], + "@elizaos/plugin-anthropic": ["@elizaos/plugin-anthropic@2.0.0-beta.1", "", { "dependencies": { "@ai-sdk/anthropic": "^3.0.9", "ai": "^6.0.23", "jsonrepair": "^3.12.0" }, "peerDependencies": { "@elizaos/core": "2.0.0-beta.1" } }, "sha512-i2Mwuh4otYpYL/VzR4bB9jcMJOcecpiGOV/yvOLIRXBkqehtrHX103+Lf5lI8r8ovePj6uVC7tZQounwIWmWPQ=="], - "@elizaos/plugin-anthropic": ["@elizaos/plugin-anthropic@2.0.0-alpha.537", "", { "dependencies": { "@ai-sdk/anthropic": "^3.0.9", "ai": "^6.0.23", "jsonrepair": "^3.12.0", "undici": "^8.0.0" }, "peerDependencies": { "@elizaos/core": "^2.0.0-alpha.537" } }, "sha512-ybLiZ4VzTvRAv2kFg6kjH19Q6XMOMq4/zBNHYQ+V3Qcp6Qms4LlDt6YxnqeXKs/5lq10LQUW0hVG9ENO9ArDjQ=="], + "@elizaos/plugin-aosp-local-inference": ["@elizaos/plugin-aosp-local-inference@2.0.0-beta.1", "", { "dependencies": { "@elizaos/core": "2.0.0-beta.1" } }, "sha512-Z2C3ulPkaB+4dPiMMK0d4uaI59e068rW8gSGNK2o3NRox3zJM7ou2pY9P7EsolRptatwCLB+f2hAU35szlIXyw=="], - "@elizaos/plugin-browser-bridge": ["@elizaos/plugin-browser-bridge@0.1.1", "", { "dependencies": { "@elizaos/agent": "^2.0.0-alpha.537", "@elizaos/core": "^2.0.0-alpha.537", "@elizaos/shared": "^2.0.0-alpha.537", "drizzle-orm": "0.45.2" } }, "sha512-CyiHRC4AFCnF1ZER21K44IFPY8iuPqe84s9X3Qs3pHktCn176z1aoL4eJY0PKCUmb62zIa4Jp4oJVzpvqNeveQ=="], + "@elizaos/plugin-browser": ["@elizaos/plugin-browser@2.0.0-beta.1", "", { "dependencies": { "@elizaos/core": "2.0.0-beta.1", "@elizaos/vault": "2.0.0-beta.1", "drizzle-orm": "0.45.2" } }, "sha512-EXdxSDbM+srdht1KcF7s10PbxD30Fo4vAg7HN38TpFrPoKENFztfTUUnmMaAgh1fpLmJIzRbbeVpynFAp3Pq4g=="], + + "@elizaos/plugin-capacitor-bridge": ["@elizaos/plugin-capacitor-bridge@2.0.0-beta.1", "", { "dependencies": { "@elizaos/core": "2.0.0-beta.1", "ws": "^8.18.0" } }, "sha512-1+cyVdbWMzwG37HgbMVgbXZASWWNEZeYDX1LfpkID9Bq2yjUxxmHArgRNgOqglBZgT/t97hWXX/fzlql+ojCUg=="], "@elizaos/plugin-claude-code": ["@elizaos/plugin-claude-code@workspace:packages/plugins/plugin-claude-code"], @@ -339,25 +363,41 @@ "@elizaos/plugin-coding-agent": ["@elizaos/plugin-coding-agent@0.1.0-next.1", "", { "dependencies": { "coding-agent-adapters": "0.8.0", "pty-console": "0.3.0" }, "peerDependencies": { "@elizaos/core": ">=2.0.0-alpha.0", "git-workspace-service": ">=0.3.0", "pty-manager": ">=1.8.0" } }, "sha512-eNXfY4Cn/hd7v8ToYmYE9ph7Tv5VGuIxNQQ5l2HrhAGz/JDALYo3G6WTGjoWmVgvb9wHERHZa5gyKhJKFGv2PA=="], + "@elizaos/plugin-coding-tools": ["@elizaos/plugin-coding-tools@2.0.0-beta.1", "", { "dependencies": { "@elizaos/core": "2.0.0-beta.1", "@elizaos/shared": "2.0.0-beta.1", "@vscode/ripgrep": "^1.15.9", "zod": "^4.4.3" } }, "sha512-hBA6OVA86uOybBOFv49PSgWD85vjSbkOsXUzpLUc/JI90BW3ie1nXzXpAjxh6jv4EvCfnYkuLisjCgnO3jlCEw=="], + + "@elizaos/plugin-commands": ["@elizaos/plugin-commands@2.0.0-beta.1", "", { "dependencies": { "@elizaos/core": "2.0.0-beta.1" } }, "sha512-5vrvIJqXOWC+7sQPCSIlxCkVzqcveLSfCMNTlOBnqSr+E3ffip74nQ3oGSDcPGVZJk3LEP/bNo/lgkcjNYV/Jw=="], + + "@elizaos/plugin-computeruse": ["@elizaos/plugin-computeruse@2.0.0-beta.1", "", { "dependencies": { "@nut-tree-fork/nut-js": "^4.2.6", "puppeteer-core": "^24.9.0" }, "peerDependencies": { "@elizaos/core": "2.0.0-beta.1" } }, "sha512-FvqQl3wAw9ZJkCK50E8FOLpyQY8h6ZKc5mIap/v0zrX+HCotDLIFX9DqpIKqHPwwHU9i+BskY+NDw99tmtHTdg=="], + "@elizaos/plugin-cron": ["@elizaos/plugin-cron@2.0.0-alpha.7", "", { "dependencies": { "@elizaos/core": "2.0.0-alpha.3", "@elizaos/plugin-cli": "2.0.0-alpha.3", "croner": "9.0.0", "uuid": "11.0.5" } }, "sha512-hAxyYfxH9e0sqS5Jo+kKMir7EbKK+xJUg5soo8gJUpKwRoJr7305B7XMPGC6e5UzcQKZctYAaVKsmRp5VhuRcA=="], "@elizaos/plugin-devin": ["@elizaos/plugin-devin@workspace:packages/plugins/plugin-devin"], + "@elizaos/plugin-discord": ["@elizaos/plugin-discord@2.0.0-beta.2", "", { "dependencies": { "@discordjs/rest": "^2.6.1", "@discordjs/voice": "^0.19.2", "@elizaos/core": "2.0.0-beta.1", "@elizaos/plugin-browser": "2.0.0-beta.1", "discord-api-types": "^0.38.0", "discord.js": "^14.26.4", "fast-levenshtein": "^3.0.0", "fluent-ffmpeg": "^2.1.3", "get-func-name": "^3.0.0", "libsodium-wrappers": "^0.8.0", "opusscript": "^0.1.1", "prism-media": "1.3.5", "zod": "^4.4.3" } }, "sha512-I+kwjHLO0NuwrQQJdl5XYMekbUfeYaOl4HcELrJK5BsX6CzYrIdQ1M3A3PXvVCz7H15f4kx5k0TCC7yDavYdVg=="], + + "@elizaos/plugin-discord-local": ["@elizaos/plugin-discord-local@2.0.0-beta.1", "", { "peerDependencies": { "@elizaos/core": "2.0.0-beta.1" } }, "sha512-v72HLAXqKw339ow3/7U6camUt1hx1xjKXLjUXFkSCoz7KIWWUqBYTeHM5y2GSyUHaSEZeBYpkwnYa/3/YeDZOw=="], + "@elizaos/plugin-elizacloud": ["@elizaos/plugin-elizacloud@workspace:packages/plugins/plugin-elizacloud"], "@elizaos/plugin-experience": ["@elizaos/plugin-experience@2.0.0-alpha.10", "", { "dependencies": { "@elizaos/core": "alpha", "uuid": "^13.0.0" } }, "sha512-UFGryx98zUc67hyjsRbfNkSgTISSABqCZLZ/0gL85mZU1XjhxKAhaqoJK/aRvF1Ak4Q8gp8VyrF6eP2LhLlUJw=="], "@elizaos/plugin-form": ["@elizaos/plugin-form@2.0.0-alpha.10", "", { "peerDependencies": { "@elizaos/core": "2.0.0-alpha.3" } }, "sha512-b8ZE3t6qPE+1cGPS6D0ywThubvEdeaQ0NRdiuy7wEnfw4B3vDGxOxhxK2Xhtxkk7aeTSnVp6xHXZqsXlQsHkug=="], + "@elizaos/plugin-imessage": ["@elizaos/plugin-imessage@2.0.0-beta.1", "", { "dependencies": { "@elizaos/core": "2.0.0-beta.1", "zod": "^4.4.3" } }, "sha512-5VkrFoOwlh7f8PPITmaLPQgcA77EKwHcabnSIxLbTAvBnXGGpqlWdYwDI17llOsfYNbprrDjQr1ahXssP1MJHQ=="], + "@elizaos/plugin-knowledge": ["@elizaos/plugin-knowledge@2.0.0-alpha.7", "", { "dependencies": { "@ai-sdk/anthropic": "^3.0.13", "@ai-sdk/google": "^3.0.8", "@ai-sdk/openai": "^3.0.9", "@elizaos/core": "alpha", "@openrouter/ai-sdk-provider": "^1.2.0", "@tanstack/react-query": "^5.51.1", "ai": "^6.0.30", "clsx": "^2.1.1", "dotenv": "^17.2.3", "lucide-react": "^0.525.0", "mammoth": "^1.9.0", "multer": "^2.0.1", "react": "19.2.3", "react-dom": "19.2.3", "react-force-graph-2d": "^1.27.1", "tailwind-merge": "^3.3.1", "unpdf": "^1.4.0", "zod": "^4.3.6" } }, "sha512-xbC8k2xDMD6liCn4saxdwTvMpAzaaaDhgQ4adgpbGRiAIYTOwd+XG4z2CbSKEa8lI0wbfzPq3EMmuTLkPavY5w=="], - "@elizaos/plugin-local-embedding": ["@elizaos/plugin-local-embedding@2.0.0-alpha.537", "", { "dependencies": { "@elizaos/core": "^2.0.0-alpha.537", "@huggingface/transformers": "^4.0.0", "node-llama-cpp": "^3.15.1", "nodejs-whisper": "^0.3.0", "stream-browserify": "^3.0.0", "undici": "^8.0.0", "uuid": "^14.0.0", "whisper-node": "^1.1.1", "zod": "^4.4.2" } }, "sha512-GVfGzdv4EgmhBSd/Z5Fz8wdCcOZvzvEkswo2I0sljudr7Z1UuT79IzaxNfC2K5B7OnwD1uQs96iOM7vu350rog=="], + "@elizaos/plugin-local-embedding": ["@elizaos/plugin-local-embedding@2.0.0-beta.1", "", { "dependencies": { "@elizaos/core": "2.0.0-beta.1", "@huggingface/transformers": "^4.0.0", "node-llama-cpp": "github:milady-ai/node-llama-cpp#v3.18.1-milady.3", "uuid": "^14.0.0", "zod": "^4.4.3" } }, "sha512-8UF2U6u7M1TmQPa75iQGjpQnE9ZJgbFg/qIvRIFHPIrvWGlBgCnbCGanLQF22XeBoBjwaY3ySN7Q5jlhEynHHA=="], + + "@elizaos/plugin-local-inference": ["@elizaos/plugin-local-inference@2.0.0-beta.1", "", { "dependencies": { "@elizaos/core": "2.0.0-beta.1", "@elizaos/plugin-capacitor-bridge": "2.0.0-beta.1" } }, "sha512-jTVUWVC426mvl1g/TaO5sLmzawe5z+us40Dw+nLu9joFHBYzQ+OYsrkJUsy3SmjnNla1Wvj+0VAZ0UAwMIXHYA=="], - "@elizaos/plugin-ollama": ["@elizaos/plugin-ollama@2.0.0-alpha.537", "", { "dependencies": { "@ai-sdk/ui-utils": "^1.2.8", "ai": "^6.0.174", "js-tiktoken": "^1.0.18", "ollama-ai-provider": "^1.2.0" }, "peerDependencies": { "@elizaos/core": "^2.0.0-alpha.537" } }, "sha512-0Z91l3+i7Y3BniJyqpGq6V62DiG6twwO3FYH2u8gORqEkl+KuCd+cOpitJRxTrFgpLM1naWXIFDDjs2kqVOa0g=="], + "@elizaos/plugin-mcp": ["@elizaos/plugin-mcp@2.0.0-beta.1", "", { "dependencies": { "@elizaos/core": "2.0.0-beta.1", "@modelcontextprotocol/sdk": "^1.7.0", "ajv": "^8.17.1", "json5": "^2.2.3" } }, "sha512-jbdEXJ6UcTjRSXSKg5DfFjdmXyDhUQEoSI+74Cpu9fZpvR/oDBvzF14j6zGp5JCuhVqMxkOplpB6ZaoMUExmRQ=="], - "@elizaos/plugin-openai": ["@elizaos/plugin-openai@2.0.0-alpha.537", "", { "dependencies": { "@ai-sdk/openai": "^3.0.9", "ai": "^6.0.30", "js-tiktoken": "^1.0.21", "undici": "^8.0.0" }, "peerDependencies": { "@elizaos/core": "^2.0.0-alpha.537", "zod": "^4.4.2" } }, "sha512-Baf9UcYXRqcF847q0Mha/Tf/FJms8G3zohb5WmQoPHoYJK89ZUnacJ/kBjRMX2oZXPz3Lo4b1xZFVHtDlMuCOw=="], + "@elizaos/plugin-ollama": ["@elizaos/plugin-ollama@2.0.0-beta.1", "", { "dependencies": { "@ai-sdk/ui-utils": "^1.2.8", "ai": "^6.0.174", "js-tiktoken": "^1.0.18", "ollama-ai-provider-v2": "^3.5.0" }, "peerDependencies": { "@elizaos/core": "2.0.0-beta.1" } }, "sha512-rs+EFJMyJHLpGAmIk5y1mpOic/RhlTN8HjYuizCMx6mRpds60t53DV2bwGr63CkA28pPgjDBwGBHErGvG/USEw=="], - "@elizaos/plugin-pdf": ["@elizaos/plugin-pdf@2.0.0-alpha.537", "", { "dependencies": { "@elizaos/core": "^2.0.0-alpha.537", "unpdf": "^1.4.0" } }, "sha512-A0YK4KwXpEeGjt84Po/6ZDLmRinYp6nTGf9WBOtOWZhg6MoNxhAjA/zb+FS0mXUsnVfMRFWWUIgVbNSqsaobtg=="], + "@elizaos/plugin-openai": ["@elizaos/plugin-openai@2.0.0-beta.1", "", { "dependencies": { "@ai-sdk/openai": "^3.0.9", "ai": "^6.0.30", "js-tiktoken": "^1.0.21" }, "peerDependencies": { "@elizaos/core": "2.0.0-beta.1", "zod": "^4.4.3" } }, "sha512-a5jkyIf4NKJKyH60jA3hoh/Egp4n/Tx7O/qPVow2gvEc7MRQSKKWxhq2y2E8awN13OVXnM3t5e4hDC73deG/5A=="], + + "@elizaos/plugin-pdf": ["@elizaos/plugin-pdf@2.0.0-beta.1", "", { "dependencies": { "@elizaos/core": "2.0.0-beta.1", "unpdf": "^1.4.0" } }, "sha512-YuEUkj/uMuU6lRhWUXgUOq2DpLewLpF1brPVeYgXjIKb0DPpTTxCrfEHdWfXloWpCBGpW62lEqXFtRQe7tvnmg=="], "@elizaos/plugin-personality": ["@elizaos/plugin-personality@2.0.0-alpha.8", "", { "dependencies": { "@elizaos/core": "alpha", "fs-extra": "^11.2.0", "zod": "^3.22.4" } }, "sha512-L5AKdjffI+x14Wcfry5tA4SqtTCnNAqWy97oTI3EuHjV50xvTbJB1wY8R67ka5gEZ2LjNXJZAzlMw3T03LHTCg=="], @@ -371,9 +411,13 @@ "@elizaos/plugin-shell": ["@elizaos/plugin-shell@2.0.0-alpha.9", "", { "dependencies": { "@elizaos/core": "next", "cross-spawn": "^7.0.6", "zod": "^4.3.6" }, "optionalDependencies": { "@lydell/node-pty": "^1.1.0" } }, "sha512-t6ZyqyEWAaU1hiUdOGviaRgxUa8P8lvnsCG089Yc1g7+kctUB0086u2rjIKtkGEWt50K3XfaNaqhoOhl6iUo+A=="], + "@elizaos/plugin-signal": ["@elizaos/plugin-signal@2.0.0-beta.1", "", { "dependencies": { "@elizaos/core": "2.0.0-beta.1", "qrcode": "^1.5.4", "zod": "^4.4.3" }, "peerDependencies": { "@elizaos/signal-native": "*" }, "optionalPeers": ["@elizaos/signal-native"] }, "sha512-9PY5VbB9ZMmpoZa5HSYdlES8xdvb66kuuCMl21hv8lKXl4JpLTCQFBdqETN2yL429b+n0E37tejFzVXE5i8zEA=="], + "@elizaos/plugin-sql": ["@elizaos/plugin-sql@workspace:packages/plugins/plugin-sql"], - "@elizaos/plugin-telegram": ["@elizaos/plugin-telegram@2.0.0-alpha.537", "", { "dependencies": { "@elizaos/core": "^2.0.0-alpha.537", "@telegraf/types": "^7.1.0", "@types/node": "^24.0.10", "strip-literal": "^3.0.0", "telegraf": "4.16.3", "telegram": "^2.26.22", "type-detect": "^4.1.0", "typescript": "^6.0.0" } }, "sha512-JfUv0i1+vUnzzs/XJFfABbb0QzvWj4tM8IAAASpvd9YUhQFgzdZxuWBT7CkCvtFNHiAW4rT5QPuau/mGQlVMeQ=="], + "@elizaos/plugin-streaming": ["@elizaos/plugin-streaming@2.0.0-beta.1", "", { "dependencies": { "@elizaos/cloud-routing": "2.0.0-beta.1", "@elizaos/core": "2.0.0-beta.1", "@elizaos/plugin-browser": "2.0.0-beta.1" } }, "sha512-bcl56KBOL3Nk7k6lkO8kusDpJoN5RcG9tqQHtEfNChIDYBMtrx1VTZZ8GJWqxU/0bIRjITdXz+n20DeywEf0gw=="], + + "@elizaos/plugin-telegram": ["@elizaos/plugin-telegram@2.0.0-beta.1", "", { "dependencies": { "@elizaos/core": "2.0.0-beta.1", "@telegraf/types": "^7.1.0", "@types/node": "^24.0.10", "strip-literal": "^3.0.0", "telegraf": "4.16.3", "telegram": "^2.26.22", "type-detect": "^4.1.0" } }, "sha512-/gSjSTpTHNODnb2R6YrAhh6WlDw1xWoMAtu6KK5faQHxrRo9VcFUCxR+7lVGvPCYjDF5Hcas14lhjNLb3FAW8g=="], "@elizaos/plugin-todo": ["@elizaos/plugin-todo@2.0.0-alpha.13", "", { "dependencies": { "@elizaos/core": "alpha", "@elizaos/plugin-rolodex": "alpha", "drizzle-orm": "^0.30.10", "start-server-and-test": "^2.0.5", "zod": "3.24.2" } }, "sha512-VhrBubzKK2XHh3oR/G4IkZrshFoYZkV+KL0OvMb/isn7PYaPYt7ilOIht97Tn1PczWMi1bvp3Am0gJZUvf6vPA=="], @@ -381,71 +425,87 @@ "@elizaos/plugin-trust": ["@elizaos/plugin-trust@1.2.2", "", { "dependencies": { "@elizaos/core": "next", "dedent": "^1.6.0", "drizzle-orm": "^0.44.2" } }, "sha512-t1WwAlC2ernlpY6y3DrtZ9Rtowzv+LOzICjZozBbGjcKF7RgCsoFf92mjoc100Vy6e728ErM3Yg5jcW8ATKwNA=="], - "@elizaos/plugin-wechat": ["@elizaos/plugin-wechat@2.0.0-alpha.537", "", { "peerDependencies": { "@elizaos/core": "^2.0.0-alpha.537" } }, "sha512-rspXTkDMzdFMnxvxJyik8jo0K4jqvc4OTraGZz4Y4hF2JjnegNGJa0Hcpnm09F3dtsTouY7hCiOIHctQO10RQg=="], + "@elizaos/plugin-video": ["@elizaos/plugin-video@2.0.0-beta.1", "", { "dependencies": { "@elizaos/core": "2.0.0-beta.1", "ffmpeg-static": "^5.3.0", "fluent-ffmpeg": "2.1.3", "youtube-dl-exec": "^3.1.5" } }, "sha512-VhoOAGB7bNy5uwvXzhlcBsUKAGKG7F8gGv/LEpakkE5MO4QnEzpSvtmnh8nOGmSTMZlaBlOLvuT1LNQt6BqGVQ=="], + + "@elizaos/plugin-wechat": ["@elizaos/plugin-wechat@2.0.0-beta.1", "", { "peerDependencies": { "@elizaos/core": "2.0.0-beta.1" } }, "sha512-mHu2W3QZ+CsWXu0MFIXW53q7VW5PxD0Vvx5YHskKasnIppOLWIGFC5rx3ONWJAAf060AdYLyum6banVrtATAfg=="], + + "@elizaos/plugin-whatsapp": ["@elizaos/plugin-whatsapp@2.0.0-beta.1", "", { "dependencies": { "@hapi/boom": "^10.0.1", "@whiskeysockets/baileys": "^7.0.0-rc.9", "pino": "^10.3.1", "qrcode": "^1.5.4", "qrcode-terminal": "^0.12.0" }, "peerDependencies": { "@elizaos/core": "2.0.0-beta.1" } }, "sha512-zX5a8JZix/N+f5JXGjsS+IBgSrI41r0pu0mmWpVTIRZBOC6P9wRKsHlfYOMc8YKo5QPiuL47s2+yw1A2Bu+I7g=="], + + "@elizaos/plugin-workflow": ["@elizaos/plugin-workflow@2.0.0-beta.1", "", { "dependencies": { "@elizaos/workflows": "2.0.0-beta.1", "drizzle-orm": "^0.45.1", "quickjs-emscripten": "0.32.0" }, "peerDependencies": { "@elizaos/core": "2.0.0-beta.1" } }, "sha512-6BpWFHIy+0BS+iBqnL6LIs/F7SjS9V11QTHqxskxVlbxMbxfnxs6vSvD1/B5n9MAQku9YhfojaiXpoI7lPDa8A=="], + + "@elizaos/plugin-x402": ["@elizaos/plugin-x402@2.0.0-beta.1", "", { "dependencies": { "@elizaos/core": "2.0.0-beta.1", "drizzle-orm": "0.45.2", "viem": "^2.48.8" } }, "sha512-L2lcIAO6yEdIoFdm8mL19vZJ195Mg8uFz8KZ2weRXNk57+K9H9eL4CDSqJIk0AwukltiO38QM7pXCuRBD62XxA=="], + + "@elizaos/prompts": ["@elizaos/prompts@2.0.0-beta.1", "", {}, "sha512-aIUTX7URFL7RrmEbvk8ISjhdUCao1cGaB1KB/2YwTLcJo6fFKlBQgTv1bcpmFVwF1Ne1nWsc7TqCl9Istk8BYg=="], - "@elizaos/shared": ["@elizaos/shared@2.0.0-alpha.538", "", { "dependencies": { "@elizaos/core": "^2.0.0-alpha.537", "zod": "^4.4.2" }, "optionalDependencies": { "figlet": "^1.11.0" } }, "sha512-RvWGK52wy7ySZK++EiK6gffYe4cBfjCXggSdLx+b0U418e7p+Y3LZTwRUH6DVG4kzSvuO7eu2tOnv/tgM0O7Pw=="], + "@elizaos/shared": ["@elizaos/shared@2.0.0-beta.1", "", { "dependencies": { "@elizaos/core": "2.0.0-beta.1", "chalk": "^5.3.0", "drizzle-orm": "0.45.2", "zod": "^4.4.3" }, "optionalDependencies": { "figlet": "^1.11.0" } }, "sha512-Rjxlhuh6me3usSvhY1nYawqRIHDsZ+4oVnvADVDHjLK436PcnPNpxUzM7OsICkFcgGDiH3G5x3lD4q3FC2JOMA=="], - "@elizaos/skills": ["@elizaos/skills@2.0.0-alpha.539", "", { "dependencies": { "@elizaos/core": "^2.0.0-alpha.537", "yaml": "^2.8.2" } }, "sha512-RVwWP2bg9T5dr5KMIkod81BHD1mkqQaykn5mrToF5CBm3Z/umppQwu/z42p09Ncq5yko54dGGsOcz13nXO6awQ=="], + "@elizaos/skills": ["@elizaos/skills@2.0.0-beta.1", "", { "dependencies": { "@elizaos/core": "2.0.0-beta.1", "yaml": "^2.8.2" } }, "sha512-ora675PbAw9VWtIatyvOboWfxSkzsm33JUMh85+Pmg5ispZbpzj31JC+thnMUqyeaL3P8P4fJznbxEYw7ddvDw=="], - "@elizaos/vault": ["@elizaos/vault@2.0.0-alpha.537", "", { "dependencies": { "@napi-rs/keyring": "^1.1.6" } }, "sha512-5iBj+/na3UJrqiI/acmQoTRMEpz0TF86PIpe/TygmK7lFyFsyvYZEfmCyIKw2mY60F2eEszKp5eO22JvJlokwQ=="], + "@elizaos/vault": ["@elizaos/vault@2.0.0-beta.1", "", { "dependencies": { "@electric-sql/pglite": "^0.4.0", "@napi-rs/keyring": "^1.1.6" } }, "sha512-sVDNGoy3sfYNt/59rzdYFZPXc3QW6gunwn1MzJ7eRXaNXlzSN9L02Krl/nfEq6+mv9Jz4rO+MxcBT3D5Gc/V8w=="], + + "@elizaos/workflows": ["@elizaos/workflows@2.0.0-beta.1", "", {}, "sha512-lQaTUqE6ezVsJVLDnvsdUbjdVX/y0B8Ev/BO3bv8/V0KSf56NwLuRKm5EnNJ1QBxxZJT5j4tg2mOwuTBvas4Xw=="], + + "@emnapi/core": ["@emnapi/core@1.10.0", "", { "dependencies": { "@emnapi/wasi-threads": "1.2.1", "tslib": "^2.4.0" } }, "sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw=="], "@emnapi/runtime": ["@emnapi/runtime@1.9.1", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-VYi5+ZVLhpgK4hQ0TAjiQiZ6ol0oe4mBx7mVv7IflsiEp0OWoVsp/+f9Vc1hOhE0TtkORVrI1GvzyreqpgWtkA=="], + "@emnapi/wasi-threads": ["@emnapi/wasi-threads@1.2.1", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w=="], + "@esbuild-kit/core-utils": ["@esbuild-kit/core-utils@3.3.2", "", { "dependencies": { "esbuild": "~0.18.20", "source-map-support": "^0.5.21" } }, "sha512-sPRAnw9CdSsRmEtnsl2WXWdyquogVpB3yZ3dgwJfe8zrOzTsV7cJvmwrKVa+0ma5BoiGJ+BoqkMvawbayKUsqQ=="], "@esbuild-kit/esm-loader": ["@esbuild-kit/esm-loader@2.6.5", "", { "dependencies": { "@esbuild-kit/core-utils": "^3.3.2", "get-tsconfig": "^4.7.0" } }, "sha512-FxEMIkJKnodyA1OaCUoEvbYRkoZlLZ4d/eXFu9Fh8CbBBgP5EmZxrfTRyN0qpXZ4vOvqnE5YdRdcrmUUXuU+dA=="], - "@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.25.12", "", { "os": "aix", "cpu": "ppc64" }, "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA=="], + "@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.28.0", "", { "os": "aix", "cpu": "ppc64" }, "sha512-lhRUCeuOyJQURhTxl4WkpFTjIsbDayJHih5kZC1giwE+MhIzAb7mEsQMqMf18rHLsrb5qI1tafG20mLxEWcWlA=="], - "@esbuild/android-arm": ["@esbuild/android-arm@0.25.12", "", { "os": "android", "cpu": "arm" }, "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg=="], + "@esbuild/android-arm": ["@esbuild/android-arm@0.28.0", "", { "os": "android", "cpu": "arm" }, "sha512-wqh0ByljabXLKHeWXYLqoJ5jKC4XBaw6Hk08OfMrCRd2nP2ZQ5eleDZC41XHyCNgktBGYMbqnrJKq/K/lzPMSQ=="], - "@esbuild/android-arm64": ["@esbuild/android-arm64@0.25.12", "", { "os": "android", "cpu": "arm64" }, "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg=="], + "@esbuild/android-arm64": ["@esbuild/android-arm64@0.28.0", "", { "os": "android", "cpu": "arm64" }, "sha512-+WzIXQOSaGs33tLEgYPYe/yQHf0WTU0X42Jca3y8NWMbUVhp7rUnw+vAsRC/QiDrdD31IszMrZy+qwPOPjd+rw=="], - "@esbuild/android-x64": ["@esbuild/android-x64@0.25.12", "", { "os": "android", "cpu": "x64" }, "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg=="], + "@esbuild/android-x64": ["@esbuild/android-x64@0.28.0", "", { "os": "android", "cpu": "x64" }, "sha512-+VJggoaKhk2VNNqVL7f6S189UzShHC/mR9EE8rDdSkdpN0KflSwWY/gWjDrNxxisg8Fp1ZCD9jLMo4m0OUfeUA=="], - "@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.25.12", "", { "os": "darwin", "cpu": "arm64" }, "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg=="], + "@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.28.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-0T+A9WZm+bZ84nZBtk1ckYsOvyA3x7e2Acj1KdVfV4/2tdG4fzUp91YHx+GArWLtwqp77pBXVCPn2We7Letr0Q=="], - "@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.25.12", "", { "os": "darwin", "cpu": "x64" }, "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA=="], + "@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.28.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-fyzLm/DLDl/84OCfp2f/XQ4flmORsjU7VKt8HLjvIXChJoFFOIL6pLJPH4Yhd1n1gGFF9mPwtlN5Wf82DZs+LQ=="], - "@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.25.12", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg=="], + "@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.28.0", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-l9GeW5UZBT9k9brBYI+0WDffcRxgHQD8ShN2Ur4xWq/NFzUKm3k5lsH4PdaRgb2w7mI9u61nr2gI2mLI27Nh3Q=="], - "@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.25.12", "", { "os": "freebsd", "cpu": "x64" }, "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ=="], + "@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.28.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-BXoQai/A0wPO6Es3yFJ7APCiKGc1tdAEOgeTNy3SsB491S3aHn4S4r3e976eUnPdU+NbdtmBuLncYir2tMU9Nw=="], - "@esbuild/linux-arm": ["@esbuild/linux-arm@0.25.12", "", { "os": "linux", "cpu": "arm" }, "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw=="], + "@esbuild/linux-arm": ["@esbuild/linux-arm@0.28.0", "", { "os": "linux", "cpu": "arm" }, "sha512-CjaaREJagqJp7iTaNQjjidaNbCKYcd4IDkzbwwxtSvjI7NZm79qiHc8HqciMddQ6CKvJT6aBd8lO9kN/ZudLlw=="], - "@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.25.12", "", { "os": "linux", "cpu": "arm64" }, "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ=="], + "@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.28.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-RVyzfb3FWsGA55n6WY0MEIEPURL1FcbhFE6BffZEMEekfCzCIMtB5yyDcFnVbTnwk+CLAgTujmV/Lgvih56W+A=="], - "@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.25.12", "", { "os": "linux", "cpu": "ia32" }, "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA=="], + "@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.28.0", "", { "os": "linux", "cpu": "ia32" }, "sha512-KBnSTt1kxl9x70q+ydterVdl+Cn0H18ngRMRCEQfrbqdUuntQQ0LoMZv47uB97NljZFzY6HcfqEZ2SAyIUTQBQ=="], - "@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.25.12", "", { "os": "linux", "cpu": "none" }, "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng=="], + "@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.28.0", "", { "os": "linux", "cpu": "none" }, "sha512-zpSlUce1mnxzgBADvxKXX5sl8aYQHo2ezvMNI8I0lbblJtp8V4odlm3Yzlj7gPyt3T8ReksE6bK+pT3WD+aJRg=="], - "@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.25.12", "", { "os": "linux", "cpu": "none" }, "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw=="], + "@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.28.0", "", { "os": "linux", "cpu": "none" }, "sha512-2jIfP6mmjkdmeTlsX/9vmdmhBmKADrWqN7zcdtHIeNSCH1SqIoNI63cYsjQR8J+wGa4Y5izRcSHSm8K3QWmk3w=="], - "@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.25.12", "", { "os": "linux", "cpu": "ppc64" }, "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA=="], + "@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.28.0", "", { "os": "linux", "cpu": "ppc64" }, "sha512-bc0FE9wWeC0WBm49IQMPSPILRocGTQt3j5KPCA8os6VprfuJ7KD+5PzESSrJ6GmPIPJK965ZJHTUlSA6GNYEhg=="], - "@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.25.12", "", { "os": "linux", "cpu": "none" }, "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w=="], + "@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.28.0", "", { "os": "linux", "cpu": "none" }, "sha512-SQPZOwoTTT/HXFXQJG/vBX8sOFagGqvZyXcgLA3NhIqcBv1BJU1d46c0rGcrij2B56Z2rNiSLaZOYW5cUk7yLQ=="], - "@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.25.12", "", { "os": "linux", "cpu": "s390x" }, "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg=="], + "@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.28.0", "", { "os": "linux", "cpu": "s390x" }, "sha512-SCfR0HN8CEEjnYnySJTd2cw0k9OHB/YFzt5zgJEwa+wL/T/raGWYMBqwDNAC6dqFKmJYZoQBRfHjgwLHGSrn3Q=="], - "@esbuild/linux-x64": ["@esbuild/linux-x64@0.25.12", "", { "os": "linux", "cpu": "x64" }, "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw=="], + "@esbuild/linux-x64": ["@esbuild/linux-x64@0.28.0", "", { "os": "linux", "cpu": "x64" }, "sha512-us0dSb9iFxIi8srnpl931Nvs65it/Jd2a2K3qs7fz2WfGPHqzfzZTfec7oxZJRNPXPnNYZtanmRc4AL/JwVzHQ=="], - "@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.25.12", "", { "os": "none", "cpu": "arm64" }, "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg=="], + "@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.28.0", "", { "os": "none", "cpu": "arm64" }, "sha512-CR/RYotgtCKwtftMwJlUU7xCVNg3lMYZ0RzTmAHSfLCXw3NtZtNpswLEj/Kkf6kEL3Gw+BpOekRX0BYCtklhUw=="], - "@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.25.12", "", { "os": "none", "cpu": "x64" }, "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ=="], + "@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.28.0", "", { "os": "none", "cpu": "x64" }, "sha512-nU1yhmYutL+fQ71Kxnhg8uEOdC0pwEW9entHykTgEbna2pw2dkbFSMeqjjyHZoCmt8SBkOSvV+yNmm94aUrrqw=="], - "@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.25.12", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A=="], + "@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.28.0", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-cXb5vApOsRsxsEl4mcZ1XY3D4DzcoMxR/nnc4IyqYs0rTI8ZKmW6kyyg+11Z8yvgMfAEldKzP7AdP64HnSC/6g=="], - "@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.25.12", "", { "os": "openbsd", "cpu": "x64" }, "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw=="], + "@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.28.0", "", { "os": "openbsd", "cpu": "x64" }, "sha512-8wZM2qqtv9UP3mzy7HiGYNH/zjTA355mpeuA+859TyR+e+Tc08IHYpLJuMsfpDJwoLo1ikIJI8jC3GFjnRClzA=="], - "@esbuild/openharmony-arm64": ["@esbuild/openharmony-arm64@0.25.12", "", { "os": "none", "cpu": "arm64" }, "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg=="], + "@esbuild/openharmony-arm64": ["@esbuild/openharmony-arm64@0.28.0", "", { "os": "none", "cpu": "arm64" }, "sha512-FLGfyizszcef5C3YtoyQDACyg95+dndv79i2EekILBofh5wpCa1KuBqOWKrEHZg3zrL3t5ouE5jgr94vA+Wb2w=="], - "@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.25.12", "", { "os": "sunos", "cpu": "x64" }, "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w=="], + "@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.28.0", "", { "os": "sunos", "cpu": "x64" }, "sha512-1ZgjUoEdHZZl/YlV76TSCz9Hqj9h9YmMGAgAPYd+q4SicWNX3G5GCyx9uhQWSLcbvPW8Ni7lj4gDa1T40akdlw=="], - "@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.25.12", "", { "os": "win32", "cpu": "arm64" }, "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg=="], + "@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.28.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-Q9StnDmQ/enxnpxCCLSg0oo4+34B9TdXpuyPeTedN/6+iXBJ4J+zwfQI28u/Jl40nOYAxGoNi7mFP40RUtkmUA=="], - "@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.25.12", "", { "os": "win32", "cpu": "ia32" }, "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ=="], + "@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.28.0", "", { "os": "win32", "cpu": "ia32" }, "sha512-zF3ag/gfiCe6U2iczcRzSYJKH1DCI+ByzSENHlM2FcDbEeo5Zd2C86Aq0tKUYAJJ1obRP84ymxIAksZUcdztHA=="], - "@esbuild/win32-x64": ["@esbuild/win32-x64@0.25.12", "", { "os": "win32", "cpu": "x64" }, "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA=="], + "@esbuild/win32-x64": ["@esbuild/win32-x64@0.28.0", "", { "os": "win32", "cpu": "x64" }, "sha512-pEl1bO9mfAmIC+tW5btTmrKaujg3zGtUmWNdCw/xs70FBjwAL3o9OEKNHvNmnyylD6ubxUERiEhdsL0xBQ9efw=="], "@exodus/bytes": ["@exodus/bytes@1.15.0", "", { "peerDependencies": { "@noble/hashes": "^1.8.0 || ^2.0.0" }, "optionalPeers": ["@noble/hashes"] }, "sha512-UY0nlA+feH81UGSHv92sLEPLCeZFjXOuHhrIo0HQydScuQc8s0A7kL/UdgwgDq8g8ilksmuoF35YVTNphV2aBQ=="], @@ -471,7 +531,9 @@ "@huggingface/jinja": ["@huggingface/jinja@0.5.6", "", {}, "sha512-MyMWyLnjqo+KRJYSH7oWNbsOn5onuIvfXYPcc0WOGxU0eHUV7oAYUoQTl2BMdu7ml+ea/bu11UM+EshbeHwtIA=="], - "@huggingface/transformers": ["@huggingface/transformers@3.8.1", "", { "dependencies": { "@huggingface/jinja": "^0.5.3", "onnxruntime-node": "1.21.0", "onnxruntime-web": "1.22.0-dev.20250409-89f8206ba4", "sharp": "^0.34.1" } }, "sha512-tsTk4zVjImqdqjS8/AOZg2yNLd1z9S5v+7oUPpXaasDRwEDhB+xnglK1k5cad26lL5/ZIaeREgWWy0bs9y9pPA=="], + "@huggingface/tokenizers": ["@huggingface/tokenizers@0.1.3", "", {}, "sha512-8rF/RRT10u+kn7YuUbUg0OF30K8rjTc78aHpxT+qJ1uWSqxT1MHi8+9ltwYfkFYJzT/oS+qw3JVfHtNMGAdqyA=="], + + "@huggingface/transformers": ["@huggingface/transformers@4.2.0", "", { "dependencies": { "@huggingface/jinja": "^0.5.6", "@huggingface/tokenizers": "^0.1.3", "onnxruntime-node": "1.24.3", "onnxruntime-web": "1.26.0-dev.20260416-b7804b056c", "sharp": "^0.34.5" } }, "sha512-8BRCoBMH0XsWaEIamuR0LrJGAfftgHAfb2Vrffy0VKlSAE/MnUJ5/h/zTfEP3fDIft+nk7TqB8xXEyABGitBjQ=="], "@img/colour": ["@img/colour@1.1.0", "", {}, "sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ=="], @@ -525,10 +587,84 @@ "@isaacs/fs-minipass": ["@isaacs/fs-minipass@4.0.1", "", { "dependencies": { "minipass": "^7.0.4" } }, "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w=="], + "@jimp/bmp": ["@jimp/bmp@0.22.12", "", { "dependencies": { "@jimp/utils": "^0.22.12", "bmp-js": "^0.1.0" }, "peerDependencies": { "@jimp/custom": ">=0.3.5" } }, "sha512-aeI64HD0npropd+AR76MCcvvRaa+Qck6loCOS03CkkxGHN5/r336qTM5HPUdHKMDOGzqknuVPA8+kK1t03z12g=="], + + "@jimp/core": ["@jimp/core@0.22.12", "", { "dependencies": { "@jimp/utils": "^0.22.12", "any-base": "^1.1.0", "buffer": "^5.2.0", "exif-parser": "^0.1.12", "file-type": "^16.5.4", "isomorphic-fetch": "^3.0.0", "pixelmatch": "^4.0.2", "tinycolor2": "^1.6.0" } }, "sha512-l0RR0dOPyzMKfjUW1uebzueFEDtCOj9fN6pyTYWWOM/VS4BciXQ1VVrJs8pO3kycGYZxncRKhCoygbNr8eEZQA=="], + + "@jimp/custom": ["@jimp/custom@0.22.12", "", { "dependencies": { "@jimp/core": "^0.22.12" } }, "sha512-xcmww1O/JFP2MrlGUMd3Q78S3Qu6W3mYTXYuIqFq33EorgYHV/HqymHfXy9GjiCJ7OI+7lWx6nYFOzU7M4rd1Q=="], + + "@jimp/gif": ["@jimp/gif@0.22.12", "", { "dependencies": { "@jimp/utils": "^0.22.12", "gifwrap": "^0.10.1", "omggif": "^1.0.9" }, "peerDependencies": { "@jimp/custom": ">=0.3.5" } }, "sha512-y6BFTJgch9mbor2H234VSjd9iwAhaNf/t3US5qpYIs0TSbAvM02Fbc28IaDETj9+4YB4676sz4RcN/zwhfu1pg=="], + + "@jimp/jpeg": ["@jimp/jpeg@0.22.12", "", { "dependencies": { "@jimp/utils": "^0.22.12", "jpeg-js": "^0.4.4" }, "peerDependencies": { "@jimp/custom": ">=0.3.5" } }, "sha512-Rq26XC/uQWaQKyb/5lksCTCxXhtY01NJeBN+dQv5yNYedN0i7iYu+fXEoRsfaJ8xZzjoANH8sns7rVP4GE7d/Q=="], + + "@jimp/plugin-blit": ["@jimp/plugin-blit@0.22.12", "", { "dependencies": { "@jimp/utils": "^0.22.12" }, "peerDependencies": { "@jimp/custom": ">=0.3.5" } }, "sha512-xslz2ZoFZOPLY8EZ4dC29m168BtDx95D6K80TzgUi8gqT7LY6CsajWO0FAxDwHz6h0eomHMfyGX0stspBrTKnQ=="], + + "@jimp/plugin-blur": ["@jimp/plugin-blur@0.22.12", "", { "dependencies": { "@jimp/utils": "^0.22.12" }, "peerDependencies": { "@jimp/custom": ">=0.3.5" } }, "sha512-S0vJADTuh1Q9F+cXAwFPlrKWzDj2F9t/9JAbUvaaDuivpyWuImEKXVz5PUZw2NbpuSHjwssbTpOZ8F13iJX4uw=="], + + "@jimp/plugin-circle": ["@jimp/plugin-circle@0.22.12", "", { "dependencies": { "@jimp/utils": "^0.22.12" }, "peerDependencies": { "@jimp/custom": ">=0.3.5" } }, "sha512-SWVXx1yiuj5jZtMijqUfvVOJBwOifFn0918ou4ftoHgegc5aHWW5dZbYPjvC9fLpvz7oSlptNl2Sxr1zwofjTg=="], + + "@jimp/plugin-color": ["@jimp/plugin-color@0.22.12", "", { "dependencies": { "@jimp/utils": "^0.22.12", "tinycolor2": "^1.6.0" }, "peerDependencies": { "@jimp/custom": ">=0.3.5" } }, "sha512-xImhTE5BpS8xa+mAN6j4sMRWaUgUDLoaGHhJhpC+r7SKKErYDR0WQV4yCE4gP+N0gozD0F3Ka1LUSaMXrn7ZIA=="], + + "@jimp/plugin-contain": ["@jimp/plugin-contain@0.22.12", "", { "dependencies": { "@jimp/utils": "^0.22.12" }, "peerDependencies": { "@jimp/custom": ">=0.3.5", "@jimp/plugin-blit": ">=0.3.5", "@jimp/plugin-resize": ">=0.3.5", "@jimp/plugin-scale": ">=0.3.5" } }, "sha512-Eo3DmfixJw3N79lWk8q/0SDYbqmKt1xSTJ69yy8XLYQj9svoBbyRpSnHR+n9hOw5pKXytHwUW6nU4u1wegHNoQ=="], + + "@jimp/plugin-cover": ["@jimp/plugin-cover@0.22.12", "", { "dependencies": { "@jimp/utils": "^0.22.12" }, "peerDependencies": { "@jimp/custom": ">=0.3.5", "@jimp/plugin-crop": ">=0.3.5", "@jimp/plugin-resize": ">=0.3.5", "@jimp/plugin-scale": ">=0.3.5" } }, "sha512-z0w/1xH/v/knZkpTNx+E8a7fnasQ2wHG5ze6y5oL2dhH1UufNua8gLQXlv8/W56+4nJ1brhSd233HBJCo01BXA=="], + + "@jimp/plugin-crop": ["@jimp/plugin-crop@0.22.12", "", { "dependencies": { "@jimp/utils": "^0.22.12" }, "peerDependencies": { "@jimp/custom": ">=0.3.5" } }, "sha512-FNuUN0OVzRCozx8XSgP9MyLGMxNHHJMFt+LJuFjn1mu3k0VQxrzqbN06yIl46TVejhyAhcq5gLzqmSCHvlcBVw=="], + + "@jimp/plugin-displace": ["@jimp/plugin-displace@0.22.12", "", { "dependencies": { "@jimp/utils": "^0.22.12" }, "peerDependencies": { "@jimp/custom": ">=0.3.5" } }, "sha512-qpRM8JRicxfK6aPPqKZA6+GzBwUIitiHaZw0QrJ64Ygd3+AsTc7BXr+37k2x7QcyCvmKXY4haUrSIsBug4S3CA=="], + + "@jimp/plugin-dither": ["@jimp/plugin-dither@0.22.12", "", { "dependencies": { "@jimp/utils": "^0.22.12" }, "peerDependencies": { "@jimp/custom": ">=0.3.5" } }, "sha512-jYgGdSdSKl1UUEanX8A85v4+QUm+PE8vHFwlamaKk89s+PXQe7eVE3eNeSZX4inCq63EHL7cX580dMqkoC3ZLw=="], + + "@jimp/plugin-fisheye": ["@jimp/plugin-fisheye@0.22.12", "", { "dependencies": { "@jimp/utils": "^0.22.12" }, "peerDependencies": { "@jimp/custom": ">=0.3.5" } }, "sha512-LGuUTsFg+fOp6KBKrmLkX4LfyCy8IIsROwoUvsUPKzutSqMJnsm3JGDW2eOmWIS/jJpPaeaishjlxvczjgII+Q=="], + + "@jimp/plugin-flip": ["@jimp/plugin-flip@0.22.12", "", { "dependencies": { "@jimp/utils": "^0.22.12" }, "peerDependencies": { "@jimp/custom": ">=0.3.5", "@jimp/plugin-rotate": ">=0.3.5" } }, "sha512-m251Rop7GN8W0Yo/rF9LWk6kNclngyjIJs/VXHToGQ6EGveOSTSQaX2Isi9f9lCDLxt+inBIb7nlaLLxnvHX8Q=="], + + "@jimp/plugin-gaussian": ["@jimp/plugin-gaussian@0.22.12", "", { "dependencies": { "@jimp/utils": "^0.22.12" }, "peerDependencies": { "@jimp/custom": ">=0.3.5" } }, "sha512-sBfbzoOmJ6FczfG2PquiK84NtVGeScw97JsCC3rpQv1PHVWyW+uqWFF53+n3c8Y0P2HWlUjflEla2h/vWShvhg=="], + + "@jimp/plugin-invert": ["@jimp/plugin-invert@0.22.12", "", { "dependencies": { "@jimp/utils": "^0.22.12" }, "peerDependencies": { "@jimp/custom": ">=0.3.5" } }, "sha512-N+6rwxdB+7OCR6PYijaA/iizXXodpxOGvT/smd/lxeXsZ/empHmFFFJ/FaXcYh19Tm04dGDaXcNF/dN5nm6+xQ=="], + + "@jimp/plugin-mask": ["@jimp/plugin-mask@0.22.12", "", { "dependencies": { "@jimp/utils": "^0.22.12" }, "peerDependencies": { "@jimp/custom": ">=0.3.5" } }, "sha512-4AWZg+DomtpUA099jRV8IEZUfn1wLv6+nem4NRJC7L/82vxzLCgXKTxvNvBcNmJjT9yS1LAAmiJGdWKXG63/NA=="], + + "@jimp/plugin-normalize": ["@jimp/plugin-normalize@0.22.12", "", { "dependencies": { "@jimp/utils": "^0.22.12" }, "peerDependencies": { "@jimp/custom": ">=0.3.5" } }, "sha512-0So0rexQivnWgnhacX4cfkM2223YdExnJTTy6d06WbkfZk5alHUx8MM3yEzwoCN0ErO7oyqEWRnEkGC+As1FtA=="], + + "@jimp/plugin-print": ["@jimp/plugin-print@0.22.12", "", { "dependencies": { "@jimp/utils": "^0.22.12", "load-bmfont": "^1.4.1" }, "peerDependencies": { "@jimp/custom": ">=0.3.5", "@jimp/plugin-blit": ">=0.3.5" } }, "sha512-c7TnhHlxm87DJeSnwr/XOLjJU/whoiKYY7r21SbuJ5nuH+7a78EW1teOaj5gEr2wYEd7QtkFqGlmyGXY/YclyQ=="], + + "@jimp/plugin-resize": ["@jimp/plugin-resize@0.22.12", "", { "dependencies": { "@jimp/utils": "^0.22.12" }, "peerDependencies": { "@jimp/custom": ">=0.3.5" } }, "sha512-3NyTPlPbTnGKDIbaBgQ3HbE6wXbAlFfxHVERmrbqAi8R3r6fQPxpCauA8UVDnieg5eo04D0T8nnnNIX//i/sXg=="], + + "@jimp/plugin-rotate": ["@jimp/plugin-rotate@0.22.12", "", { "dependencies": { "@jimp/utils": "^0.22.12" }, "peerDependencies": { "@jimp/custom": ">=0.3.5", "@jimp/plugin-blit": ">=0.3.5", "@jimp/plugin-crop": ">=0.3.5", "@jimp/plugin-resize": ">=0.3.5" } }, "sha512-9YNEt7BPAFfTls2FGfKBVgwwLUuKqy+E8bDGGEsOqHtbuhbshVGxN2WMZaD4gh5IDWvR+emmmPPWGgaYNYt1gA=="], + + "@jimp/plugin-scale": ["@jimp/plugin-scale@0.22.12", "", { "dependencies": { "@jimp/utils": "^0.22.12" }, "peerDependencies": { "@jimp/custom": ">=0.3.5", "@jimp/plugin-resize": ">=0.3.5" } }, "sha512-dghs92qM6MhHj0HrV2qAwKPMklQtjNpoYgAB94ysYpsXslhRTiPisueSIELRwZGEr0J0VUxpUY7HgJwlSIgGZw=="], + + "@jimp/plugin-shadow": ["@jimp/plugin-shadow@0.22.12", "", { "dependencies": { "@jimp/utils": "^0.22.12" }, "peerDependencies": { "@jimp/custom": ">=0.3.5", "@jimp/plugin-blur": ">=0.3.5", "@jimp/plugin-resize": ">=0.3.5" } }, "sha512-FX8mTJuCt7/3zXVoeD/qHlm4YH2bVqBuWQHXSuBK054e7wFRnRnbSLPUqAwSeYP3lWqpuQzJtgiiBxV3+WWwTg=="], + + "@jimp/plugin-threshold": ["@jimp/plugin-threshold@0.22.12", "", { "dependencies": { "@jimp/utils": "^0.22.12" }, "peerDependencies": { "@jimp/custom": ">=0.3.5", "@jimp/plugin-color": ">=0.8.0", "@jimp/plugin-resize": ">=0.8.0" } }, "sha512-4x5GrQr1a/9L0paBC/MZZJjjgjxLYrqSmWd+e+QfAEPvmRxdRoQ5uKEuNgXnm9/weHQBTnQBQsOY2iFja+XGAw=="], + + "@jimp/plugins": ["@jimp/plugins@0.22.12", "", { "dependencies": { "@jimp/plugin-blit": "^0.22.12", "@jimp/plugin-blur": "^0.22.12", "@jimp/plugin-circle": "^0.22.12", "@jimp/plugin-color": "^0.22.12", "@jimp/plugin-contain": "^0.22.12", "@jimp/plugin-cover": "^0.22.12", "@jimp/plugin-crop": "^0.22.12", "@jimp/plugin-displace": "^0.22.12", "@jimp/plugin-dither": "^0.22.12", "@jimp/plugin-fisheye": "^0.22.12", "@jimp/plugin-flip": "^0.22.12", "@jimp/plugin-gaussian": "^0.22.12", "@jimp/plugin-invert": "^0.22.12", "@jimp/plugin-mask": "^0.22.12", "@jimp/plugin-normalize": "^0.22.12", "@jimp/plugin-print": "^0.22.12", "@jimp/plugin-resize": "^0.22.12", "@jimp/plugin-rotate": "^0.22.12", "@jimp/plugin-scale": "^0.22.12", "@jimp/plugin-shadow": "^0.22.12", "@jimp/plugin-threshold": "^0.22.12", "timm": "^1.6.1" }, "peerDependencies": { "@jimp/custom": ">=0.3.5" } }, "sha512-yBJ8vQrDkBbTgQZLty9k4+KtUQdRjsIDJSPjuI21YdVeqZxYywifHl4/XWILoTZsjTUASQcGoH0TuC0N7xm3ww=="], + + "@jimp/png": ["@jimp/png@0.22.12", "", { "dependencies": { "@jimp/utils": "^0.22.12", "pngjs": "^6.0.0" }, "peerDependencies": { "@jimp/custom": ">=0.3.5" } }, "sha512-Mrp6dr3UTn+aLK8ty/dSKELz+Otdz1v4aAXzV5q53UDD2rbB5joKVJ/ChY310B+eRzNxIovbUF1KVrUsYdE8Hg=="], + + "@jimp/tiff": ["@jimp/tiff@0.22.12", "", { "dependencies": { "utif2": "^4.0.1" }, "peerDependencies": { "@jimp/custom": ">=0.3.5" } }, "sha512-E1LtMh4RyJsoCAfAkBRVSYyZDTtLq9p9LUiiYP0vPtXyxX4BiYBUYihTLSBlCQg5nF2e4OpQg7SPrLdJ66u7jg=="], + + "@jimp/types": ["@jimp/types@0.22.12", "", { "dependencies": { "@jimp/bmp": "^0.22.12", "@jimp/gif": "^0.22.12", "@jimp/jpeg": "^0.22.12", "@jimp/png": "^0.22.12", "@jimp/tiff": "^0.22.12", "timm": "^1.6.1" }, "peerDependencies": { "@jimp/custom": ">=0.3.5" } }, "sha512-wwKYzRdElE1MBXFREvCto5s699izFHNVvALUv79GXNbsOVqlwlOxlWJ8DuyOGIXoLP4JW/m30YyuTtfUJgMRMA=="], + + "@jimp/utils": ["@jimp/utils@0.22.12", "", { "dependencies": { "regenerator-runtime": "^0.13.3" } }, "sha512-yJ5cWUknGnilBq97ZXOyOS0HhsHOyAyjHwYfHxGbSyMTohgQI6sVyE8KPgDwH8HHW/nMKXk8TrSwAE71zt716Q=="], + + "@jitl/quickjs-ffi-types": ["@jitl/quickjs-ffi-types@0.32.0", "", {}, "sha512-v9T+GQpmk43VDJ7d72sf0Nexhk+ArvtUihW27dy7lqAl0zBObFKtSBBIm5RBjwIhE8VwsPPm9PNuvPvNqLWUEg=="], + + "@jitl/quickjs-wasmfile-debug-asyncify": ["@jitl/quickjs-wasmfile-debug-asyncify@0.32.0", "", { "dependencies": { "@jitl/quickjs-ffi-types": "0.32.0" } }, "sha512-EX8zbXwGqCgAE764M+qvkHtyXDi/FUoMBea0JnES7vCM3P7a2+EOZOjGv85wtZ2sJhI1oJ+nekmqpOODFDY+hw=="], + + "@jitl/quickjs-wasmfile-debug-sync": ["@jitl/quickjs-wasmfile-debug-sync@0.32.0", "", { "dependencies": { "@jitl/quickjs-ffi-types": "0.32.0" } }, "sha512-LeYWrPGC1uNCTBWvibo3ZLJj0CSVNYUXvJpXMCmuQ5Sap2cCACc3uvGvYV4homHHBAzfw5akoTqMMS4YFRtw+Q=="], + + "@jitl/quickjs-wasmfile-release-asyncify": ["@jitl/quickjs-wasmfile-release-asyncify@0.32.0", "", { "dependencies": { "@jitl/quickjs-ffi-types": "0.32.0" } }, "sha512-3oSwPfja12ICz4aIblB58cuY8JlEq5Txt8Cut4VLo+LH47QN+mzCnSgnbB03hWzg1LBcc+VyyI9UOag7a1NF+Q=="], + + "@jitl/quickjs-wasmfile-release-sync": ["@jitl/quickjs-wasmfile-release-sync@0.32.0", "", { "dependencies": { "@jitl/quickjs-ffi-types": "0.32.0" } }, "sha512-BKNDI/TPBfGlLNGYpLrhcDGXmIk4xHm4MRAisOBnOzpXVn9HZWsfmMAc9WMBrAHjvvds6HOikKeaOBKdPdpVrg=="], + "@keyv/bigmap": ["@keyv/bigmap@1.3.1", "", { "dependencies": { "hashery": "^1.4.0", "hookified": "^1.15.0" }, "peerDependencies": { "keyv": "^5.6.0" } }, "sha512-WbzE9sdmQtKy8vrNPa9BRnwZh5UF4s1KTmSK0KUVLo3eff5BlQNNWDnFOouNpKfPKDnms9xynJjsMYjMaT/aFQ=="], "@keyv/serialize": ["@keyv/serialize@1.1.1", "", {}, "sha512-dXn3FZhPv0US+7dtJsIi2R+c7qWYiReoEh5zUntWCf4oSpMNib8FDhSoed6m3QyZdx5hK7iLFkYk3rNxwt8vTA=="], + "@kikobeats/time-span": ["@kikobeats/time-span@1.0.13", "", {}, "sha512-CfBK4/EZ73uN/6b5/wOfvWju1Ev/6H+uXqS2Vqd7/dEQTyOsvv4BdOHDqESp4Efa9YyrPPvN3IHU+C4z9FAo3Q=="], + "@kwsites/file-exists": ["@kwsites/file-exists@1.1.1", "", { "dependencies": { "debug": "^4.1.1" } }, "sha512-m9/5YGR18lIwxSFDwfE3oA7bWuq9kdau6ugN4H2rJeyhFQZcG9AgSHkQtSD15a8WvTgfz9aikZMrKPHvbpqFiw=="], "@kwsites/promise-deferred": ["@kwsites/promise-deferred@1.1.1", "", {}, "sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw=="], @@ -607,11 +743,13 @@ "@napi-rs/keyring-win32-x64-msvc": ["@napi-rs/keyring-win32-x64-msvc@1.3.0", "", { "os": "win32", "cpu": "x64" }, "sha512-4DnCWXwDc0HRKwyRlG5y0VhKZW2tNRQfKKfyj6IX/KWfDNyq9hn4n+GL1auyDcOO/v8PwnhmYo2+rOOqCkvvOg=="], + "@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@1.1.4", "", { "dependencies": { "@tybys/wasm-util": "^0.10.1" }, "peerDependencies": { "@emnapi/core": "^1.7.1", "@emnapi/runtime": "^1.7.1" } }, "sha512-3NQNNgA1YSlJb/kMH1ildASP9HW7/7kYnRI2szWJaofaS1hWmbGI4H+d3+22aGzXXN9IJ+n+GiFVcGipJP18ow=="], + "@neondatabase/serverless": ["@neondatabase/serverless@1.1.0", "", {}, "sha512-r3ZZhRjEcfEdKIZnoB1RusNgvHuaBRqfCzV4Gi+5A9yUX0S4HTws/ASWqt13wL4y4I+0rqsWGdA2w7EQXHi3+Q=="], "@noble/ciphers": ["@noble/ciphers@2.2.0", "", {}, "sha512-Z6pjIZ/8IJcCGzb2S/0Px5J81yij85xASuk1teLNeg75bfT07MV3a/O2Mtn1I2se43k3lkVEcFaR10N4cgQcZA=="], - "@noble/curves": ["@noble/curves@2.0.1", "", { "dependencies": { "@noble/hashes": "2.0.1" } }, "sha512-vs1Az2OOTBiP4q0pwjW5aF0xp9n4MxVrmkFBxc6EKZc6ddYx5gaZiAsZoq0uRRXWbi3AT/sBqn05eRPtn1JCPw=="], + "@noble/curves": ["@noble/curves@2.2.0", "", { "dependencies": { "@noble/hashes": "2.2.0" } }, "sha512-T/BoHgFXirb0ENSPBquzX0rcjXeM6Lo892a2jlYJkqk83LqZx0l1Of7DzlKJ6jkpvMrkHSnAcgb5JegL8SeIkQ=="], "@noble/hashes": ["@noble/hashes@2.2.0", "", {}, "sha512-IYqDGiTXab6FniAgnSdZwgWbomxpy9FtYvLKs7wCUs2a8RkITG+DFGO1DM9cr+E3/RgADRpFjrKVaJ1z6sjtEg=="], @@ -647,6 +785,24 @@ "@nodelib/fs.walk": ["@nodelib/fs.walk@1.2.8", "", { "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" } }, "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg=="], + "@nut-tree-fork/default-clipboard-provider": ["@nut-tree-fork/default-clipboard-provider@4.2.6", "", { "dependencies": { "clipboardy": "2.3.0" } }, "sha512-Hzqj57rheIMGtsS4zK4//kOhaX5FxMluOiz+4TVaHXx+idZS/bPhZwd8e6o1w1GT0PVJOUIP+4CdUe//k5VRig=="], + + "@nut-tree-fork/libnut": ["@nut-tree-fork/libnut@4.2.6", "", { "dependencies": { "@nut-tree-fork/libnut-darwin": "2.7.5", "@nut-tree-fork/libnut-linux": "2.7.5", "@nut-tree-fork/libnut-win32": "2.7.5" } }, "sha512-2FCiTBokMGrMl4eL/trEIO+mtpkXpdPHoVKdTBmW8UBIbhCbrCKmnXb2skWGfVs+U3q7o5EYDjVTNUYaUWbaxQ=="], + + "@nut-tree-fork/libnut-darwin": ["@nut-tree-fork/libnut-darwin@2.7.5", "", { "dependencies": { "bindings": "1.5.0" }, "optionalDependencies": { "@nut-tree-fork/node-mac-permissions": "2.2.1" }, "os": [ "linux", "win32", "darwin", ], "cpu": [ "x64", "arm64", ] }, "sha512-LbqtPtMPTJUcg4XoPP2jsU1wc8flBcGyKTerKsIfK9cD7nBHROnO0QksbrsbSWEpLym8T8fRtuU7XEY83l6Z2Q=="], + + "@nut-tree-fork/libnut-linux": ["@nut-tree-fork/libnut-linux@2.7.5", "", { "dependencies": { "bindings": "1.5.0" }, "optionalDependencies": { "@nut-tree-fork/node-mac-permissions": "2.2.1" }, "os": [ "linux", "win32", "darwin", ], "cpu": [ "x64", "arm64", ] }, "sha512-uxaXEcRKnFObAljsoR6tLOBUU1dJ2sctloG6gFgCBGN7+k6Jdv6jZfOuNjd/fpdq2C5WPMm0rtn9EE7h5J3Jcg=="], + + "@nut-tree-fork/libnut-win32": ["@nut-tree-fork/libnut-win32@2.7.5", "", { "dependencies": { "bindings": "1.5.0" }, "optionalDependencies": { "@nut-tree-fork/node-mac-permissions": "2.2.1" }, "os": [ "linux", "win32", "darwin", ], "cpu": [ "x64", "arm64", ] }, "sha512-yqC87zvmFcDPwFrRU40DYhN0xmEVM3aSkOuyF0IX+y1x+HWSu/i0PNklATpPBhGid3QVb/TOHuVoaraMrUFCNw=="], + + "@nut-tree-fork/node-mac-permissions": ["@nut-tree-fork/node-mac-permissions@2.2.1", "", { "dependencies": { "bindings": "1.5.0", "node-addon-api": "5.0.0" }, "os": "darwin" }, "sha512-iSfOTDiBZ7VDa17PoQje5rUaZSvSAaq+XEyXCmhPuQwV5XuNU02Grv6oFhsdpz89w7+UvB/8KX/cX5IYQ5o2Bw=="], + + "@nut-tree-fork/nut-js": ["@nut-tree-fork/nut-js@4.2.6", "", { "dependencies": { "@nut-tree-fork/default-clipboard-provider": "4.2.6", "@nut-tree-fork/libnut": "4.2.6", "@nut-tree-fork/provider-interfaces": "4.2.6", "@nut-tree-fork/shared": "4.2.6", "jimp": "0.22.10", "node-abort-controller": "3.1.1" }, "os": [ "linux", "win32", "darwin", ], "cpu": [ "x64", "arm64", ] }, "sha512-aI/WCX7gE1HFGPH3EZP/UWqpNMM1NMoM/EkXqp7pKMgXFCi8e5+o5p+jd/QOYpmALv9bQg7+s69nI7FONbMqDg=="], + + "@nut-tree-fork/provider-interfaces": ["@nut-tree-fork/provider-interfaces@4.2.6", "", { "dependencies": { "@nut-tree-fork/shared": "4.2.6" } }, "sha512-brtRegDkLSV0sa5DUAigjWf6hCoamBNPb/hKK9AQlW+j3BxQ/8djaEdEB2cihqUh1ZjEtgPyXRqpCWSdKCX68A=="], + + "@nut-tree-fork/shared": ["@nut-tree-fork/shared@4.2.6", "", { "dependencies": { "jimp": "0.22.10", "node-abort-controller": "3.1.1" } }, "sha512-xZaa0YtJt/DDDq/i1vZkabjq8HOWzfhXieMai61cMbYD11J6VhAfhV23ZtQEM02WG7nc2LKjl4UwRnQCteikwA=="], + "@octokit/auth-app": ["@octokit/auth-app@6.1.4", "", { "dependencies": { "@octokit/auth-oauth-app": "^7.1.0", "@octokit/auth-oauth-user": "^4.1.0", "@octokit/request": "^8.3.1", "@octokit/request-error": "^5.1.0", "@octokit/types": "^13.1.0", "deprecation": "^2.3.1", "lru-cache": "npm:@wolfy1339/lru-cache@^11.0.2-patch.1", "universal-github-app-jwt": "^1.1.2", "universal-user-agent": "^6.0.0" } }, "sha512-QkXkSOHZK4dA5oUqY5Dk3S+5pN2s1igPjEASNQV8/vgJgW034fQWR16u7VsNOK/EljA00eyjYF5mWNxWKWhHRQ=="], "@octokit/auth-oauth-app": ["@octokit/auth-oauth-app@7.1.0", "", { "dependencies": { "@octokit/auth-oauth-device": "^6.1.0", "@octokit/auth-oauth-user": "^4.1.0", "@octokit/request": "^8.3.1", "@octokit/types": "^13.0.0", "@types/btoa-lite": "^1.0.0", "btoa-lite": "^1.0.0", "universal-user-agent": "^6.0.0" } }, "sha512-w+SyJN/b0l/HEb4EOPRudo7uUOSW51jcK1jwLa+4r7PA8FPFpoxEnHBHMITqCsc/3Vo2qqFjgQfz/xUUvsSQnA=="], @@ -733,6 +889,12 @@ "@reflink/reflink-win32-x64-msvc": ["@reflink/reflink-win32-x64-msvc@0.1.19", "", { "os": "win32", "cpu": "x64" }, "sha512-E//yT4ni2SyhwP8JRjVGWr3cbnhWDiPLgnQ66qqaanjjnMiu3O/2tjCPQXlcGc/DEYofpDc9fvhv6tALQsMV9w=="], + "@sapphire/async-queue": ["@sapphire/async-queue@1.5.5", "", {}, "sha512-cvGzxbba6sav2zZkH8GPf2oGk9yYoD5qrNWdu9fRehifgnFZJMV+nuy2nON2roRO4yQQ+v7MK/Pktl/HgfsUXg=="], + + "@sapphire/shapeshift": ["@sapphire/shapeshift@4.0.0", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "lodash": "^4.17.21" } }, "sha512-d9dUmWVA7MMiKobL3VpLF8P2aeanRTu6ypG2OIaEv/ZHH/SUQ2iHOVyi5wAPjQ+HmnMuL0whK9ez8I/raWbtIg=="], + + "@sapphire/snowflake": ["@sapphire/snowflake@3.5.5", "", {}, "sha512-xzvBr1Q1c4lCe7i6sRnrofxeO1QTP/LKQ6A6qy0iB4x5yfiSfARMEQEghojzTNALDTcv8En04qYNIco9/K9eZQ=="], + "@scure/base": ["@scure/base@1.2.6", "", {}, "sha512-g/nm5FgUa//MCj1gV09zTJTaM6KBAHqLN907YVQqf7zC49+DcO4B1so4ZX07Ef10Twr6nuqYEH9GEggFXA4Fmg=="], "@scure/bip32": ["@scure/bip32@1.7.0", "", { "dependencies": { "@noble/curves": "~1.9.0", "@noble/hashes": "~1.8.0", "@scure/base": "~1.2.5" } }, "sha512-E4FFX/N3f4B80AKWp5dP6ow+flD1LQZo/w8UnLGYZO674jS6YnYeepycOOksv+vLPSpgN35wgKgy+ybfTb2SMw=="], @@ -831,6 +993,36 @@ "@smithy/uuid": ["@smithy/uuid@1.1.2", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-O/IEdcCUKkubz60tFbGA7ceITTAJsty+lBjNoorP4Z6XRqaFb/OjQjZODophEcuq68nKm6/0r+6/lLQ+XVpk8g=="], + "@snazzah/davey": ["@snazzah/davey@0.1.11", "", { "optionalDependencies": { "@snazzah/davey-android-arm-eabi": "0.1.11", "@snazzah/davey-android-arm64": "0.1.11", "@snazzah/davey-darwin-arm64": "0.1.11", "@snazzah/davey-darwin-x64": "0.1.11", "@snazzah/davey-freebsd-x64": "0.1.11", "@snazzah/davey-linux-arm-gnueabihf": "0.1.11", "@snazzah/davey-linux-arm64-gnu": "0.1.11", "@snazzah/davey-linux-arm64-musl": "0.1.11", "@snazzah/davey-linux-x64-gnu": "0.1.11", "@snazzah/davey-linux-x64-musl": "0.1.11", "@snazzah/davey-wasm32-wasi": "0.1.11", "@snazzah/davey-win32-arm64-msvc": "0.1.11", "@snazzah/davey-win32-ia32-msvc": "0.1.11", "@snazzah/davey-win32-x64-msvc": "0.1.11" } }, "sha512-oBN+msHzPnm1M5DDx3wVD7iBwpNXFUtkh2MrAbUJu0OhKjliLChi28hq++mu1+qdMpAVQO5JKAvQQxYVbyneiw=="], + + "@snazzah/davey-android-arm-eabi": ["@snazzah/davey-android-arm-eabi@0.1.11", "", { "os": "android", "cpu": "arm" }, "sha512-T1RYbNYKN6tLOcGIDKJd8OI6FBSEemwL7DOYdTMmhqfhhMr3YVN8WOhfoxGg63OcnpTN2e2c5tdY2bAx25RmQQ=="], + + "@snazzah/davey-android-arm64": ["@snazzah/davey-android-arm64@0.1.11", "", { "os": "android", "cpu": "arm64" }, "sha512-ksJn/x2VU8h6w9eku1HT96ugSRZ7lKVkKNKbFleaFN+U99DJaPM+gMu2YvnFU4V54HR06ZBnRihnVG6VLXQpDw=="], + + "@snazzah/davey-darwin-arm64": ["@snazzah/davey-darwin-arm64@0.1.11", "", { "os": "darwin", "cpu": "arm64" }, "sha512-E1d7PbaaVMO3Lj9EiAPqOVbuV0xg5+PsHzHH097DDXiD1+zUDXvJaTnUWsnm5z50pJniHpi4GtaYmk+ieB/guA=="], + + "@snazzah/davey-darwin-x64": ["@snazzah/davey-darwin-x64@0.1.11", "", { "os": "darwin", "cpu": "x64" }, "sha512-Tl4TI/LTmgJZepgbgVMYDi8RqlAkPtPg1OEBPl7a9Tn3AwR36Vs6lyIT1cs/lGy/ds/+B+mKI4rPObN1cyILTw=="], + + "@snazzah/davey-freebsd-x64": ["@snazzah/davey-freebsd-x64@0.1.11", "", { "os": "freebsd", "cpu": "x64" }, "sha512-T8Iw9FXkuI1T+YBAFzh9v/TXf9IOTOSqnd/BFpTRTrlW72PR2lhIidzSmg027VxO7r5pX47iFwiOkb9I/NU/EA=="], + + "@snazzah/davey-linux-arm-gnueabihf": ["@snazzah/davey-linux-arm-gnueabihf@0.1.11", "", { "os": "linux", "cpu": "arm" }, "sha512-1Txj+8pqA8uq/OGtaUaBFWAPnNMQzFgIywj0iA7EI4xZl+mab48/pv+YZ1pNb/suC6ynsW44oB9efiXSdcUAgA=="], + + "@snazzah/davey-linux-arm64-gnu": ["@snazzah/davey-linux-arm64-gnu@0.1.11", "", { "os": "linux", "cpu": "arm64" }, "sha512-ERzF5nM/IYW1BcN3wLXpEwBCGLFf0kGJUVhaV6yfiInz0tkU8UmvrrgpaMaACfMjIhfWdq5CcX+aTkXo/saNcg=="], + + "@snazzah/davey-linux-arm64-musl": ["@snazzah/davey-linux-arm64-musl@0.1.11", "", { "os": "linux", "cpu": "arm64" }, "sha512-e6pX6Hiabtz99q+H/YHNkm9JVlpqN8HGh0qPib8G2+UY4/SSH8WvqWipk3v581dMy2oyCHt7MOoY1aU1P1N/xA=="], + + "@snazzah/davey-linux-x64-gnu": ["@snazzah/davey-linux-x64-gnu@0.1.11", "", { "os": "linux", "cpu": "x64" }, "sha512-TW5bSoqChOJMbvsDb4wAATYrxmAXuNnse7wFNVSAJUaZKSeRfZbu3UAiPWSNn7GwLwSfU6hg322KZUn8IWCuvg=="], + + "@snazzah/davey-linux-x64-musl": ["@snazzah/davey-linux-x64-musl@0.1.11", "", { "os": "linux", "cpu": "x64" }, "sha512-5j6Pmc+Wzv5lSxVP6quA7teYRJXibkZqQyYGfTDnTsUOO5dPpcojpqlXlkhyvsA1OAQTj4uxbOCciN3cVWwzug=="], + + "@snazzah/davey-wasm32-wasi": ["@snazzah/davey-wasm32-wasi@0.1.11", "", { "dependencies": { "@napi-rs/wasm-runtime": "^1.1.2" }, "cpu": "none" }, "sha512-rKOwZ/0J8lp+4VEyOdMDBRP9KR+PksZpa9V1Qn0veMzy4FqTVKthkxwGqewheFe0SFg9fdvt798l/PBFrfDeZw=="], + + "@snazzah/davey-win32-arm64-msvc": ["@snazzah/davey-win32-arm64-msvc@0.1.11", "", { "os": "win32", "cpu": "arm64" }, "sha512-5fptJU4tX901m3mj0SHiBljMrPT4ZEsynbBhR7bK1yn9TY1jjyhN8EFi7QF5IWtUEni+0mia2BCMHZ5ZkmFZqQ=="], + + "@snazzah/davey-win32-ia32-msvc": ["@snazzah/davey-win32-ia32-msvc@0.1.11", "", { "os": "win32", "cpu": "ia32" }, "sha512-ualexn8SeLsiMHhWfzVrzRcjHgcBapg++FPaVgJJxoh2S/jCRiklXOu3luqIZdJdNKvhe2V9SwO/cImPeIIBKw=="], + + "@snazzah/davey-win32-x64-msvc": ["@snazzah/davey-win32-x64-msvc@0.1.11", "", { "os": "win32", "cpu": "x64" }, "sha512-muNhc8UKXtknzsH/w4AIkbPR2I8BuvApn0pDXar0IEvY8PCjqU/M8MPbOOEYwQVvQRMwVTgExtxzrkBPSXB4nA=="], + "@solana/buffer-layout": ["@solana/buffer-layout@4.0.1", "", { "dependencies": { "buffer": "~6.0.3" } }, "sha512-E1ImOIAD1tBZFRdjeM4/pzTiTApC0AOBGwyAMS4fwIodCWArzJ3DWdoh8cKxeFM2fElkxBh2Aqts1BPC373rHA=="], "@solana/codecs-core": ["@solana/codecs-core@2.3.0", "", { "dependencies": { "@solana/errors": "2.3.0" }, "peerDependencies": { "typescript": ">=5.3.3" } }, "sha512-oG+VZzN6YhBHIoSKgS5ESM9VIGzhWjEHEGNPSibiDTxFhsFWxNaz8LbMDPjBUE69r9wmdGLkrQ+wVPbnJcZPvw=="], @@ -857,12 +1049,12 @@ "@tokenizer/token": ["@tokenizer/token@0.3.0", "", {}, "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A=="], - "@toon-format/toon": ["@toon-format/toon@2.2.0", "", {}, "sha512-FMYqrlZnMN72YIT9KVt7Kxc41gat+RgMIzDmvRRPHw0J7pqW/FeBGDY/4BIWjT71Y+EdI9fCJip90uXuGuYhjw=="], - "@tootallnate/quickjs-emscripten": ["@tootallnate/quickjs-emscripten@0.23.0", "", {}, "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA=="], "@tweenjs/tween.js": ["@tweenjs/tween.js@25.0.0", "", {}, "sha512-XKLA6syeBUaPzx4j3qwMqzzq+V4uo72BnlbOjmuljLrRqdsd3qnzvZZoxvMHZ23ndsRS4aufU6JOZYpCbU6T1A=="], + "@tybys/wasm-util": ["@tybys/wasm-util@0.10.2", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-RoBvJ2X0wuKlWFIjrwffGw1IqZHKQqzIchKaadZZfnNpsAYp2mM0h36JtPCjNDAHGgYez/15uMBpfGwchhiMgg=="], + "@types/blessed": ["@types/blessed@0.1.27", "", { "dependencies": { "@types/node": "*" } }, "sha512-ZOQGjLvWDclAXp0rW5iuUBXeD6Gr1PkitN7tj7/G8FCoSzTsij6OhXusOzMKhwrZ9YlL2Pmu0d6xJ9zVvk+Hsg=="], "@types/btoa-lite": ["@types/btoa-lite@1.0.2", "", {}, "sha512-ZYbcE2x7yrvNFJiU7xJGrpF/ihpkM7zKgw8bha3LNJSesvTtUNxbpzaT7WXBIryf6jovisrxTBvymxMeLLj1Mg=="], @@ -885,13 +1077,41 @@ "@types/uuid": ["@types/uuid@10.0.0", "", {}, "sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ=="], - "@types/ws": ["@types/ws@7.4.7", "", { "dependencies": { "@types/node": "*" } }, "sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww=="], + "@types/ws": ["@types/ws@8.18.1", "", { "dependencies": { "@types/node": "*" } }, "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg=="], "@types/yauzl": ["@types/yauzl@2.10.3", "", { "dependencies": { "@types/node": "*" } }, "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q=="], "@ungap/structured-clone": ["@ungap/structured-clone@1.2.0", "", {}, "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ=="], - "@vercel/oidc": ["@vercel/oidc@3.1.0", "", {}, "sha512-Fw28YZpRnA3cAHHDlkt7xQHiJ0fcL+NRcIqsocZQUSmbzeIKRpwttJjik5ZGanXP+vlA4SbTg+AbA3bP363l+w=="], + "@vercel/oidc": ["@vercel/oidc@3.2.0", "", {}, "sha512-UycprH3T6n3jH0k44NHMa7pnFHGu/N05MjojYr+Mc6I7obkoLIJujSWwin1pCvdy/eOxrI/l3uDLQsmcrOb4ug=="], + + "@vladfrangu/async_event_emitter": ["@vladfrangu/async_event_emitter@2.4.7", "", {}, "sha512-Xfe6rpCTxSxfbswi/W/Pz7zp1WWSNn4A0eW4mLkQUewCrXXtMj31lCg+iQyTkh/CkusZSq9eDflu7tjEDXUY6g=="], + + "@vscode/ripgrep": ["@vscode/ripgrep@1.18.0", "", { "optionalDependencies": { "@vscode/ripgrep-darwin-arm64": "1.18.0", "@vscode/ripgrep-darwin-x64": "1.18.0", "@vscode/ripgrep-linux-arm": "1.18.0", "@vscode/ripgrep-linux-arm64": "1.18.0", "@vscode/ripgrep-linux-ia32": "1.18.0", "@vscode/ripgrep-linux-ppc64": "1.18.0", "@vscode/ripgrep-linux-riscv64": "1.18.0", "@vscode/ripgrep-linux-s390x": "1.18.0", "@vscode/ripgrep-linux-x64": "1.18.0", "@vscode/ripgrep-win32-arm64": "1.18.0", "@vscode/ripgrep-win32-ia32": "1.18.0", "@vscode/ripgrep-win32-x64": "1.18.0" } }, "sha512-ns5lWe44tSfbTMbVUsyB+I1819PVSw4AdpgK0RNkzfWfwy6+3IUNSxwSrfTno1/oWaS/hERNz+XLWVyga2aJBQ=="], + + "@vscode/ripgrep-darwin-arm64": ["@vscode/ripgrep-darwin-arm64@1.18.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-r3ktHSvbFycQNF6sl7sNDPocpsI7J+mEzh1IaZFkY0spm3k2Z9t8hPAeOK7+p0l6p6/swkQC14XWX01low+94Q=="], + + "@vscode/ripgrep-darwin-x64": ["@vscode/ripgrep-darwin-x64@1.18.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-25b4gWbL138dGuQU244ebCKKc0q05ULBMoFSz9oAEUHNeqK/lOJViDS7DRvbDazzAzSEdan391Znks/R5mkaTQ=="], + + "@vscode/ripgrep-linux-arm": ["@vscode/ripgrep-linux-arm@1.18.0", "", { "os": "linux", "cpu": "arm" }, "sha512-GDAvufNDHu8zqLEmXstalQF0Wh6wQvdsBi/Vg3Yi3CK4a8XoFXqqXVEHEZ9xQz3t0NfoSEc9JbvK9DDS6FxyxQ=="], + + "@vscode/ripgrep-linux-arm64": ["@vscode/ripgrep-linux-arm64@1.18.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-lQ/5zTG++U0E3IhVgS4EPTTn/U4okncaRMM5GOFfOYZywS4nuD31GhkHbNYlDk5CuDC68+hYJ0/eQeyCKJDA+g=="], + + "@vscode/ripgrep-linux-ia32": ["@vscode/ripgrep-linux-ia32@1.18.0", "", { "os": "linux", "cpu": "ia32" }, "sha512-YWLkSUtFd4Jh5EepIhA9RJSfv3uMAVMo+2rBIGHPBnvgLrZciIs2cDKei1/p6Wc/aCzUoHyMAg2R6tw4ZCBKGg=="], + + "@vscode/ripgrep-linux-ppc64": ["@vscode/ripgrep-linux-ppc64@1.18.0", "", { "os": "linux", "cpu": "ppc64" }, "sha512-quXVY8fwQ8O/lvU1yrSqSl3jlUzysRSb+AfUfCL/tRtphxsKlFvPAejryZ6vg4Bgvn8XL74xb4qMCDmWgYrT5w=="], + + "@vscode/ripgrep-linux-riscv64": ["@vscode/ripgrep-linux-riscv64@1.18.0", "", { "os": "linux", "cpu": "none" }, "sha512-f5kBQBrWfQt8Q7OhSORuNDei5dkYagBj3y4jImSUXGMy8B/Ke7SltSRcUtjPv166FAFfHCAmWuZp3+cWnX2/Vw=="], + + "@vscode/ripgrep-linux-s390x": ["@vscode/ripgrep-linux-s390x@1.18.0", "", { "os": "linux", "cpu": "s390x" }, "sha512-rTOcJFGGcl2c07RUOWUo4U1ndnemKhY6A9hnMB18uk7jSgJc0d/QLBGWMWpumdtoJtpizn/wIv5mXIisJukusQ=="], + + "@vscode/ripgrep-linux-x64": ["@vscode/ripgrep-linux-x64@1.18.0", "", { "os": "linux", "cpu": "x64" }, "sha512-mQ3bVrUpnD2vs7QT0vX90Lt0cnUq467uFtEktIdsJJmW296RoSULRGqWgzG1AKxyBpNDD6l4ZO4qKf6SgyC23Q=="], + + "@vscode/ripgrep-win32-arm64": ["@vscode/ripgrep-win32-arm64@1.18.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-vfTIjq1OHnzUjxZcHVQAMbnggp8dpGf+0QKFOZHwWPqFwXxQC8eCWM+5NUdoJ6yrElCeMzoUTXoK/LdZaniB+Q=="], + + "@vscode/ripgrep-win32-ia32": ["@vscode/ripgrep-win32-ia32@1.18.0", "", { "os": "win32", "cpu": "ia32" }, "sha512-//rfAE+BOw5AC2EMmepmiE36jUuevtQYNQqqlw1s3m9FlRxjxEut97RkRPHAu9BG4mSojatZx+kXZXNdyI9caQ=="], + + "@vscode/ripgrep-win32-x64": ["@vscode/ripgrep-win32-x64@1.18.0", "", { "os": "win32", "cpu": "x64" }, "sha512-KNPvtElldqILHdnAetujPaowkNbpqJy3ssIGGN6F6Kve9Qi+nNLI2DN01O83JjCEVQbCzl8Ov3QZ9Eov3BR8Dg=="], "@whiskeysockets/baileys": ["@whiskeysockets/baileys@7.0.0-rc.9", "", { "dependencies": { "@cacheable/node-cache": "^1.4.0", "@hapi/boom": "^9.1.3", "async-mutex": "^0.5.0", "libsignal": "git+https://github.com/whiskeysockets/libsignal-node.git", "lru-cache": "^11.1.0", "music-metadata": "^11.7.0", "p-queue": "^9.0.0", "pino": "^9.6", "protobufjs": "^7.2.4", "ws": "^8.13.0" }, "peerDependencies": { "audio-decode": "^2.1.3", "jimp": "^1.6.0", "link-preview-js": "^3.0.0", "sharp": "*" }, "optionalPeers": ["audio-decode", "jimp", "link-preview-js"] }, "sha512-YFm5gKXfDP9byCXCW3OPHKXLzrAKzolzgVUlRosHHgwbnf2YOO3XknkMm6J7+F0ns8OA0uuSBhgkRHTDtqkacw=="], @@ -907,6 +1127,8 @@ "adapter-types": ["adapter-types@0.2.0", "", {}, "sha512-T6YjdynGF9u1+D+DnqjsGmyW/dkq+kVRpz/wgVGcK2EHBAz9ETCX9Kz9ZHZdqyd0B2s/YJ0euGHiwhOFoGe0NA=="], + "adm-zip": ["adm-zip@0.5.17", "", {}, "sha512-+Ut8d9LLqwEvHHJl1+PIHqoyDxFgVN847JTVM3Izi3xHDWPE4UtzzXysMZQs64DMcrJfBeS/uoEP4AD3HQHnQQ=="], + "adze": ["adze@2.3.0", "", { "dependencies": { "@ungap/structured-clone": "1.2.0", "picocolors": "1.1.1" } }, "sha512-c5I7uXn5jZ075LbW0lhkmllq4OLQsLHbEV63MbykOQr/VPIOdTgbxGH4QoXHqakAUO3rUSEmURd5eM9GgpJB6g=="], "aes-js": ["aes-js@4.0.0-beta.5", "", {}, "sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q=="], @@ -915,7 +1137,7 @@ "agentkeepalive": ["agentkeepalive@4.6.0", "", { "dependencies": { "humanize-ms": "^1.2.1" } }, "sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ=="], - "ai": ["ai@6.0.116", "", { "dependencies": { "@ai-sdk/gateway": "3.0.66", "@ai-sdk/provider": "3.0.8", "@ai-sdk/provider-utils": "4.0.19", "@opentelemetry/api": "1.9.0" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-7yM+cTmyRLeNIXwt4Vj+mrrJgVQ9RMIW5WO0ydoLoYkewIvsMcvUmqS4j2RJTUXaF1HphwmSKUMQ/HypNRGOmA=="], + "ai": ["ai@6.0.177", "", { "dependencies": { "@ai-sdk/gateway": "3.0.112", "@ai-sdk/provider": "3.0.10", "@ai-sdk/provider-utils": "4.0.27", "@opentelemetry/api": "1.9.0" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-1xQtbeWwNcLyyM86ixZhkKvT+WRXc1lvarIKqPVtsyn8F9NDikwUMBqYu+aQKDgMht50SMXh4qboYuU8MeHZZA=="], "ajv": ["ajv@8.18.0", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A=="], @@ -927,14 +1149,20 @@ "ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], + "any-base": ["any-base@1.1.0", "", {}, "sha512-uMgjozySS8adZZYePpaWs8cxB9/kdzmpX6SgJZ+wbz1K5eYk5QMYDVJaZKhxyIHUdnnJkfR7SVgStgH7LkGUyg=="], + "append-field": ["append-field@1.0.0", "", {}, "sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw=="], + "arch": ["arch@2.2.0", "", {}, "sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ=="], + "arg": ["arg@5.0.2", "", {}, "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg=="], "argparse": ["argparse@1.0.10", "", { "dependencies": { "sprintf-js": "~1.0.2" } }, "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg=="], "ast-types": ["ast-types@0.13.4", "", { "dependencies": { "tslib": "^2.0.1" } }, "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w=="], + "async": ["async@0.2.10", "", {}, "sha512-eAkdoKxU6/LkKDBzLpT+t6Ff5EtfSF4wx1WfJiPEEV7WNLnDaRXk0oVysiEPm262roaachGexwUv94WhSgN5TQ=="], + "async-mutex": ["async-mutex@0.5.0", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-1A94B18jkJ3DYq284ohPxoXbfTA5HsQ7/Mf4DEhcyLx3Bz27Rh59iScbB6EPiP+B+joue6YCxcMXSbFC1tZKwA=="], "async-retry": ["async-retry@1.3.3", "", { "dependencies": { "retry": "0.13.1" } }, "sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw=="], @@ -977,10 +1205,18 @@ "bignumber.js": ["bignumber.js@9.3.1", "", {}, "sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ=="], + "binary-version": ["binary-version@7.1.0", "", { "dependencies": { "execa": "^8.0.1", "find-versions": "^6.0.0" } }, "sha512-Iy//vPc3ANPNlIWd242Npqc8MK0a/i4kVcHDlDA6HNMv5zMxz4ulIFhOSYJVKw/8AbHdHy0CnGYEt1QqSXxPsw=="], + + "binary-version-check": ["binary-version-check@6.1.0", "", { "dependencies": { "binary-version": "^7.1.0", "semver": "^7.6.0", "semver-truncate": "^3.0.0" } }, "sha512-REKdLKmuViV2WrtWXvNSiPX04KbIjfUV3Cy8batUeOg+FtmowavzJorfFhWq95cVJzINnL/44ixP26TrdJZACA=="], + + "bindings": ["bindings@1.5.0", "", { "dependencies": { "file-uri-to-path": "1.0.0" } }, "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ=="], + "blessed": ["blessed@0.1.81", "", { "bin": { "blessed": "./bin/tput.js" } }, "sha512-LoF5gae+hlmfORcG1M5+5XZi4LBmvlXTzwJWzUlPryN/SJdSflZvROM2TwkT0GMpq7oqT48NRd4GS7BiVBc5OQ=="], "bluebird": ["bluebird@3.4.7", "", {}, "sha512-iD3898SR7sWVRHbiQv+sHUtHnMvC1o3nW5rAcqnq3uOn07DSAppZYUkIGslDz6gXC7HfunPe7YVBgoEJASPcHA=="], + "bmp-js": ["bmp-js@0.1.0", "", {}, "sha512-vHdS19CnY3hwiNdkaqk93DvjVLfbEcI8mys4UjuWrlX1haDmroo8o4xCzh4wD6DGV6HxRCyauwhHRqMTfERtjw=="], + "bn.js": ["bn.js@5.2.3", "", {}, "sha512-EAcmnPkxpntVL+DS7bO1zhcZNvCkxqtkd0ZY53h06GNQ3DEkkGZ/gKgmDv6DdZQGj9BgfSPKtJJ7Dp1GPP8f7w=="], "body-parser": ["body-parser@2.2.2", "", { "dependencies": { "bytes": "^3.1.2", "content-type": "^1.0.5", "debug": "^4.4.3", "http-errors": "^2.0.0", "iconv-lite": "^0.7.0", "on-finished": "^2.4.1", "qs": "^6.14.1", "raw-body": "^3.0.1", "type-is": "^2.0.1" } }, "sha512-oP5VkATKlNwcgvxi0vM0p/D3n2C3EReYVX+DNYs5TjZFn/oQt2j+4sVJtSMr18pdRr8wjTcBl6LoV+FUwzPmNA=="], @@ -1007,6 +1243,8 @@ "buffer-crc32": ["buffer-crc32@0.2.13", "", {}, "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ=="], + "buffer-equal": ["buffer-equal@0.0.1", "", {}, "sha512-RgSV6InVQ9ODPdLWJ5UAqBqJBOg370Nz6ZQtRzpt6nUjc8v0St97uJ4PYC6NztqIScrAXafKM3mZPMygSe1ggA=="], + "buffer-equal-constant-time": ["buffer-equal-constant-time@1.0.1", "", {}, "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA=="], "buffer-fill": ["buffer-fill@1.0.0", "", {}, "sha512-T7zexNBwiiaCOGDg9xNX9PBmjrubblRkENuptryuI64URkXDFum9il/JGL8Lm8wYfAXpredVXXZz7eMHilimiQ=="], @@ -1031,6 +1269,10 @@ "canvas-color-tracker": ["canvas-color-tracker@1.3.2", "", { "dependencies": { "tinycolor2": "^1.6.0" } }, "sha512-ryQkDX26yJ3CXzb3hxUVNlg1NKE4REc5crLBq661Nxzr8TNd236SaEf2ffYLXyI5tSABSeguHLqcVq4vf9L3Zg=="], + "caseless": ["caseless@0.12.0", "", {}, "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw=="], + + "centra": ["centra@2.7.0", "", { "dependencies": { "follow-redirects": "^1.15.6" } }, "sha512-PbFMgMSrmgx6uxCdm57RUos9Tc3fclMvhLSATYN39XsDV29B89zZ3KA89jmY0vwSGazyU+uerqwa6t+KaodPcg=="], + "chalk": ["chalk@5.6.2", "", {}, "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA=="], "check-more-types": ["check-more-types@2.24.0", "", {}, "sha512-Pj779qHxV2tuapviy1bSZNEL1maXr13bPYpsvSDB68HlYcYuhlDrmGd63i0JHMCLKzc7rUSNIrpdJlhVlNwrxA=="], @@ -1047,6 +1289,8 @@ "cli-spinners": ["cli-spinners@2.9.2", "", {}, "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg=="], + "clipboardy": ["clipboardy@2.3.0", "", { "dependencies": { "arch": "^2.1.1", "execa": "^1.0.0", "is-wsl": "^2.1.1" } }, "sha512-mKhiIL2DrQIsuXMgBgnfEHOZOryC7kY7YO//TN6c63wlEm3NG5tz+YgY5rVi29KCmq/QQjKYvM7a19+MDOTHOQ=="], + "cliui": ["cliui@6.0.0", "", { "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.0", "wrap-ansi": "^6.2.0" } }, "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ=="], "clsx": ["clsx@2.1.1", "", {}, "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA=="], @@ -1071,6 +1315,8 @@ "content-type": ["content-type@1.0.5", "", {}, "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA=="], + "convert-hrtime": ["convert-hrtime@5.0.0", "", {}, "sha512-lOETlkIeYSJWcbbcvjRKGxVMXJR+8+OQb/mTPbA4ObPMytYIsUbuOE0Jzy60hjARYszq1id0j8KgVhC+WGZVTg=="], + "cookie": ["cookie@0.7.2", "", {}, "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w=="], "cookie-signature": ["cookie-signature@1.2.2", "", {}, "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg=="], @@ -1079,8 +1325,6 @@ "cors": ["cors@2.8.6", "", { "dependencies": { "object-assign": "^4", "vary": "^1" } }, "sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw=="], - "cron-parser": ["cron-parser@5.5.0", "", { "dependencies": { "luxon": "^3.7.1" } }, "sha512-oML4lKUXxizYswqmxuOCpgFS8BNUJpIu6k/2HVHyaL8Ynnf3wdf9tkns0yRdJLSIjkJ+b0DXHMZEHGpMwjnPww=="], - "croner": ["croner@9.0.0", "", {}, "sha512-onMB0OkDjkXunhdW9htFjEhqrD54+M94i6ackoUkjHKbRnXdyEyKRelp4nJ1kAz32+s27jP1FsebpJCVl0BsvA=="], "cross-spawn": ["cross-spawn@7.0.6", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="], @@ -1129,12 +1373,16 @@ "d3-zoom": ["d3-zoom@3.0.0", "", { "dependencies": { "d3-dispatch": "1 - 3", "d3-drag": "2 - 3", "d3-interpolate": "1 - 3", "d3-selection": "2 - 3", "d3-transition": "2 - 3" } }, "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw=="], + "dargs": ["dargs@7.0.0", "", {}, "sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg=="], + "data-uri-to-buffer": ["data-uri-to-buffer@6.0.2", "", {}, "sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw=="], "data-urls": ["data-urls@7.0.0", "", { "dependencies": { "whatwg-mimetype": "^5.0.0", "whatwg-url": "^16.0.0" } }, "sha512-23XHcCF+coGYevirZceTVD7NdJOqVn+49IHyxgszm+JIiHLoB2TkmPtsYkNWT1pvRSGkc35L6NHs0yHkN2SumA=="], "debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="], + "debug-logfmt": ["debug-logfmt@1.4.11", "", { "dependencies": { "@kikobeats/time-span": "~1.0.5", "null-prototype-object": "~1.2.2", "pretty-ms": "~7.0.1" } }, "sha512-2zjKALi79JGKZxk9eiDMdiuoxGMOcF5FvAhX5M53nyGpoKpL7Y0AJLjuWT0xZLFwatyL6cjXBDLnbY7GL19rrA=="], + "decamelize": ["decamelize@1.2.0", "", {}, "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA=="], "decimal.js": ["decimal.js@10.6.0", "", {}, "sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg=="], @@ -1171,8 +1419,14 @@ "dingbat-to-unicode": ["dingbat-to-unicode@1.0.1", "", {}, "sha512-98l0sW87ZT58pU4i61wa2OHwxbiYSbuxsCBozaVnYX2iCnr3bLM3fIes1/ej7h1YdOKuKt/MLs706TVnALA65w=="], + "discord-api-types": ["discord-api-types@0.38.48", "", {}, "sha512-WFUE/2o0lBlLeCQonQ+Pu2RqHAqbytBJ2RlXR91gzk05InSS6k9ShzzLYoymrA4c2oRgRKGE7/VqQJNNdGWSxQ=="], + + "discord.js": ["discord.js@14.26.4", "", { "dependencies": { "@discordjs/builders": "^1.14.1", "@discordjs/collection": "1.5.3", "@discordjs/formatters": "^0.6.2", "@discordjs/rest": "^2.6.1", "@discordjs/util": "^1.2.0", "@discordjs/ws": "^1.2.3", "@sapphire/snowflake": "3.5.3", "discord-api-types": "^0.38.40", "fast-deep-equal": "3.1.3", "lodash.snakecase": "4.1.1", "magic-bytes.js": "^1.13.0", "tslib": "^2.6.3", "undici": "6.24.1" } }, "sha512-4oBp8tc6Kf8IDBwAHhbsMaAqx1b5fob9SNasZT7V6yyyUydoO5i5fGuX7TmvRtR+q/WgKRnRViRoAWnG7fNyvA=="], + "dom-serializer": ["dom-serializer@1.4.1", "", { "dependencies": { "domelementtype": "^2.0.1", "domhandler": "^4.2.0", "entities": "^2.0.0" } }, "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag=="], + "dom-walk": ["dom-walk@0.1.2", "", {}, "sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w=="], + "domelementtype": ["domelementtype@2.3.0", "", {}, "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw=="], "domhandler": ["domhandler@4.3.1", "", { "dependencies": { "domelementtype": "^2.2.0" } }, "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ=="], @@ -1195,7 +1449,7 @@ "ee-first": ["ee-first@1.1.1", "", {}, "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="], - "elizaos": ["elizaos@2.0.0-alpha.535", "", { "dependencies": { "@clack/prompts": "^1.0.0", "commander": "^14.0.0", "picocolors": "^1.1.1" }, "bin": { "elizaos": "dist/cli.js" } }, "sha512-MRI/M2qwuG6SBXKXxOIZpqO9wuYvqhuA55qef3U+J1fik9+6L0/XYXxSDuRC3DTmzOyZLZVo5hW7wqrH17Iung=="], + "elizaos": ["elizaos@2.0.0-beta.5", "", { "dependencies": { "@clack/prompts": "^1.0.0", "commander": "^14.0.0", "picocolors": "^1.1.1" }, "bin": { "elizaos": "dist/cli.js" } }, "sha512-RqyRdt1c51b8XyDfsYQISV3p7lIkp9DafQVV0/LX93yNdVQ7Q0mcQuEa0RYBOwGPxlCoQcAAJmP5HlGs72juRw=="], "emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], @@ -1205,6 +1459,8 @@ "entities": ["entities@4.5.0", "", {}, "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw=="], + "env-paths": ["env-paths@2.2.1", "", {}, "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A=="], + "env-var": ["env-var@7.5.0", "", {}, "sha512-mKZOzLRN0ETzau2W2QXefbFjo5EF4yWq28OyKb9ICdeNhHJlOE/pHHnz4hdYJ9cNZXcJHo5xN4OT4pzuSHSNvA=="], "es-define-property": ["es-define-property@1.0.1", "", {}, "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g=="], @@ -1227,7 +1483,7 @@ "es6-symbol": ["es6-symbol@3.1.4", "", { "dependencies": { "d": "^1.0.2", "ext": "^1.7.0" } }, "sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg=="], - "esbuild": ["esbuild@0.25.12", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.25.12", "@esbuild/android-arm": "0.25.12", "@esbuild/android-arm64": "0.25.12", "@esbuild/android-x64": "0.25.12", "@esbuild/darwin-arm64": "0.25.12", "@esbuild/darwin-x64": "0.25.12", "@esbuild/freebsd-arm64": "0.25.12", "@esbuild/freebsd-x64": "0.25.12", "@esbuild/linux-arm": "0.25.12", "@esbuild/linux-arm64": "0.25.12", "@esbuild/linux-ia32": "0.25.12", "@esbuild/linux-loong64": "0.25.12", "@esbuild/linux-mips64el": "0.25.12", "@esbuild/linux-ppc64": "0.25.12", "@esbuild/linux-riscv64": "0.25.12", "@esbuild/linux-s390x": "0.25.12", "@esbuild/linux-x64": "0.25.12", "@esbuild/netbsd-arm64": "0.25.12", "@esbuild/netbsd-x64": "0.25.12", "@esbuild/openbsd-arm64": "0.25.12", "@esbuild/openbsd-x64": "0.25.12", "@esbuild/openharmony-arm64": "0.25.12", "@esbuild/sunos-x64": "0.25.12", "@esbuild/win32-arm64": "0.25.12", "@esbuild/win32-ia32": "0.25.12", "@esbuild/win32-x64": "0.25.12" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg=="], + "esbuild": ["esbuild@0.28.0", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.28.0", "@esbuild/android-arm": "0.28.0", "@esbuild/android-arm64": "0.28.0", "@esbuild/android-x64": "0.28.0", "@esbuild/darwin-arm64": "0.28.0", "@esbuild/darwin-x64": "0.28.0", "@esbuild/freebsd-arm64": "0.28.0", "@esbuild/freebsd-x64": "0.28.0", "@esbuild/linux-arm": "0.28.0", "@esbuild/linux-arm64": "0.28.0", "@esbuild/linux-ia32": "0.28.0", "@esbuild/linux-loong64": "0.28.0", "@esbuild/linux-mips64el": "0.28.0", "@esbuild/linux-ppc64": "0.28.0", "@esbuild/linux-riscv64": "0.28.0", "@esbuild/linux-s390x": "0.28.0", "@esbuild/linux-x64": "0.28.0", "@esbuild/netbsd-arm64": "0.28.0", "@esbuild/netbsd-x64": "0.28.0", "@esbuild/openbsd-arm64": "0.28.0", "@esbuild/openbsd-x64": "0.28.0", "@esbuild/openharmony-arm64": "0.28.0", "@esbuild/sunos-x64": "0.28.0", "@esbuild/win32-arm64": "0.28.0", "@esbuild/win32-ia32": "0.28.0", "@esbuild/win32-x64": "0.28.0" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-sNR9MHpXSUV/XB4zmsFKN+QgVG82Cc7+/aaxJ8Adi8hyOac+EXptIp45QBPaVyX3N70664wRbTcLTOemCAnyqw=="], "escalade": ["escalade@3.2.0", "", {}, "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA=="], @@ -1257,14 +1513,18 @@ "eventemitter3": ["eventemitter3@5.0.4", "", {}, "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw=="], + "events": ["events@3.3.0", "", {}, "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q=="], + "events-universal": ["events-universal@1.0.1", "", { "dependencies": { "bare-events": "^2.7.0" } }, "sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw=="], "eventsource": ["eventsource@3.0.7", "", { "dependencies": { "eventsource-parser": "^3.0.1" } }, "sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA=="], - "eventsource-parser": ["eventsource-parser@1.1.2", "", {}, "sha512-v0eOBUbiaFojBu2s2NPBfYUoRR9GjcDNvCXVaqEf5vVfpIAh9f8RCo4vXTP8c63QRKCFwoLpMpTdPwwhEKVgzA=="], + "eventsource-parser": ["eventsource-parser@3.0.8", "", {}, "sha512-70QWGkr4snxr0OXLRWsFLeRBIRPuQOvt4s8QYjmUlmlkyTZkRqS7EDVRZtzU3TiyDbXSzaOeF0XUKy8PchzukQ=="], "execa": ["execa@5.1.1", "", { "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^6.0.0", "human-signals": "^2.1.0", "is-stream": "^2.0.0", "merge-stream": "^2.0.0", "npm-run-path": "^4.0.1", "onetime": "^5.1.2", "signal-exit": "^3.0.3", "strip-final-newline": "^2.0.0" } }, "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg=="], + "exif-parser": ["exif-parser@0.1.12", "", {}, "sha512-c2bQfLNbMzLPmzQuOr8fy0csy84WmwnER81W88DzTp9CYNPJ6yzOj2EZAh9pywYpqHnshVLHQJ8WzldAyfY+Iw=="], + "express": ["express@5.2.1", "", { "dependencies": { "accepts": "^2.0.0", "body-parser": "^2.2.1", "content-disposition": "^1.0.0", "content-type": "^1.0.5", "cookie": "^0.7.1", "cookie-signature": "^1.2.1", "debug": "^4.4.0", "depd": "^2.0.0", "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "etag": "^1.8.1", "finalhandler": "^2.1.0", "fresh": "^2.0.0", "http-errors": "^2.0.0", "merge-descriptors": "^2.0.0", "mime-types": "^3.0.0", "on-finished": "^2.4.1", "once": "^1.4.0", "parseurl": "^1.3.3", "proxy-addr": "^2.0.7", "qs": "^6.14.0", "range-parser": "^1.2.1", "router": "^2.2.0", "send": "^1.1.0", "serve-static": "^2.2.0", "statuses": "^2.0.1", "type-is": "^2.0.1", "vary": "^1.1.2" } }, "sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw=="], "express-rate-limit": ["express-rate-limit@8.3.1", "", { "dependencies": { "ip-address": "10.1.0" }, "peerDependencies": { "express": ">= 4.11" } }, "sha512-D1dKN+cmyPWuvB+G2SREQDzPY1agpBIcTa9sJxOPMCNeH3gwzhqJRDWCXW3gg0y//+LQ/8j52JbMROWyrKdMdw=="], @@ -1283,6 +1543,8 @@ "fast-glob": ["fast-glob@3.3.3", "", { "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", "micromatch": "^4.0.8" } }, "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg=="], + "fast-levenshtein": ["fast-levenshtein@3.0.0", "", { "dependencies": { "fastest-levenshtein": "^1.0.7" } }, "sha512-hKKNajm46uNmTlhHSyZkmToAc56uZJwYq7yrciZjqOxnlfQwERDQJmHPUp7m1m9wx8vgOe8IaCKZ5Kv2k1DdCQ=="], + "fast-redact": ["fast-redact@3.5.0", "", {}, "sha512-dwsoQlS7h9hMeYUq1W++23NDcBLV4KqONnITDV9DjfS3q1SgDGVrBdvvTLUotWtPSD7asWDV9/CmsZPy8Hf70A=="], "fast-stable-stringify": ["fast-stable-stringify@1.0.0", "", {}, "sha512-wpYMUmFu5f00Sm0cj2pfivpmawLZ0NKdviQ4w9zJeR8JVtOpOxHmLaJuj0vxvGqMJQWyP/COUkF75/57OKyRag=="], @@ -1293,6 +1555,8 @@ "fast-xml-parser": ["fast-xml-parser@5.5.8", "", { "dependencies": { "fast-xml-builder": "^1.1.4", "path-expression-matcher": "^1.2.0", "strnum": "^2.2.0" }, "bin": { "fxparser": "src/cli/cli.js" } }, "sha512-Z7Fh2nVQSb2d+poDViM063ix2ZGt9jmY1nWhPfHBOK2Hgnb/OW3P4Et3P/81SEej0J7QbWtJqxO05h8QYfK7LQ=="], + "fastest-levenshtein": ["fastest-levenshtein@1.0.16", "", {}, "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg=="], + "fastq": ["fastq@1.20.1", "", { "dependencies": { "reusify": "^1.0.4" } }, "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw=="], "fd-slicer": ["fd-slicer@1.1.0", "", { "dependencies": { "pend": "~1.2.0" } }, "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g=="], @@ -1301,10 +1565,14 @@ "fflate": ["fflate@0.8.2", "", {}, "sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A=="], + "ffmpeg-static": ["ffmpeg-static@5.3.0", "", { "dependencies": { "@derhuerst/http-basic": "^8.2.0", "env-paths": "^2.2.0", "https-proxy-agent": "^5.0.0", "progress": "^2.0.3" } }, "sha512-H+K6sW6TiIX6VGend0KQwthe+kaceeH/luE8dIZyOP35ik7ahYojDuqlTV1bOrtEwl01sy2HFNGQfi5IDJvotg=="], + "figlet": ["figlet@1.11.0", "", { "dependencies": { "commander": "^14.0.0" }, "bin": { "figlet": "bin/index.js" } }, "sha512-EEx3OS/l2bFqcUNN2NM9FPJp8vAMrgbCxsbl2hbcJNNxOEwVe3mEzrhan7TbJQViZa8mMqhihlbCaqD+LyYKTQ=="], "file-type": ["file-type@22.0.1", "", { "dependencies": { "@tokenizer/inflate": "^0.4.1", "strtok3": "^10.3.5", "token-types": "^6.1.2", "uint8array-extras": "^1.5.0" } }, "sha512-ww5Mhre0EE+jmBvOXTmXAbEMuZE7uX4a3+oRCQFNj8w++g3ev913N6tXQz0XTXbueQ5TWQfm6BdaViEHHn8bhA=="], + "file-uri-to-path": ["file-uri-to-path@1.0.0", "", {}, "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw=="], + "filename-reserved-regex": ["filename-reserved-regex@3.0.0", "", {}, "sha512-hn4cQfU6GOT/7cFHXBqeBg2TbrMBgdD0kcjLhvSQYYwm3s4B6cjvBfb7nBALJLAXqmU5xajSa7X2NnUud/VCdw=="], "filenamify": ["filenamify@6.0.0", "", { "dependencies": { "filename-reserved-regex": "^3.0.0" } }, "sha512-vqIlNogKeyD3yzrm0yhRMQg8hOVwYcYRfjEoODd49iCprMn4HL85gK3HcykQE53EPIpX3HcAbGA5ELQv216dAQ=="], @@ -1315,10 +1583,14 @@ "find-up": ["find-up@4.1.0", "", { "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" } }, "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw=="], + "find-versions": ["find-versions@6.0.0", "", { "dependencies": { "semver-regex": "^4.0.5", "super-regex": "^1.0.0" } }, "sha512-2kCCtc+JvcZ86IGAz3Z2Y0A1baIz9fL31pH/0S1IqZr9Iwnjq8izfPtrCyQKO6TLMPELLsQMre7VDqeIKCsHkA=="], + "flatbuffers": ["flatbuffers@25.9.23", "", {}, "sha512-MI1qs7Lo4Syw0EOzUl0xjs2lsoeqFku44KpngfIduHBYvzm8h2+7K8YMQh1JtVVVrUvhLpNwqVi4DERegUJhPQ=="], "float-tooltip": ["float-tooltip@1.7.5", "", { "dependencies": { "d3-selection": "2 - 3", "kapsule": "^1.16", "preact": "10" } }, "sha512-/kXzuDnnBqyyWyhDMH7+PfP8J/oXiAavGzcRxASOMRHFuReDtofizLLJsf7nnDLAfEaMW4pVWaXrAjtnglpEkg=="], + "fluent-ffmpeg": ["fluent-ffmpeg@2.1.3", "", { "dependencies": { "async": "^0.2.9", "which": "^1.1.1" } }, "sha512-Be3narBNt2s6bsaqP6Jzq91heDgOEaDCJAXcE3qcma/EJBSy5FB4cvO31XBInuAuKBx8Kptf8dkhjK0IOru39Q=="], + "follow-redirects": ["follow-redirects@1.15.11", "", {}, "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ=="], "force-graph": ["force-graph@1.51.2", "", { "dependencies": { "@tweenjs/tween.js": "18 - 25", "accessor-fn": "1", "bezier-js": "3 - 6", "canvas-color-tracker": "^1.3", "d3-array": "1 - 3", "d3-drag": "2 - 3", "d3-force-3d": "2 - 3", "d3-scale": "1 - 4", "d3-scale-chromatic": "1 - 3", "d3-selection": "2 - 3", "d3-zoom": "2 - 3", "float-tooltip": "^1.7", "index-array-by": "1", "kapsule": "^1.16", "lodash-es": "4" } }, "sha512-zZNdMqx8qIQGurgnbgYIUsdXxSfvhfRSIdncsKGv/twUOZpwCsk9hPHmdjdcme1+epATgb41G0rkIGHJ0Wydng=="], @@ -1341,6 +1613,8 @@ "function-bind": ["function-bind@1.1.2", "", {}, "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="], + "function-timeout": ["function-timeout@1.0.2", "", {}, "sha512-939eZS4gJ3htTHAldmyyuzlrD58P03fHG49v2JfFXbV6OhvZKRC9j2yAtdHw/zrp2zXHuv05zMIy40F0ge7spA=="], + "gaxios": ["gaxios@7.1.4", "", { "dependencies": { "extend": "^3.0.2", "https-proxy-agent": "^7.0.1", "node-fetch": "^3.3.2" } }, "sha512-bTIgTsM2bWn3XklZISBTQX7ZSddGW+IO3bMdGaemHZ3tbqExMENHLx6kKZ/KlejgrMtj8q7wBItt51yegqalrA=="], "gcp-metadata": ["gcp-metadata@8.1.2", "", { "dependencies": { "gaxios": "^7.0.0", "google-logging-utils": "^1.0.0", "json-bigint": "^1.0.0" } }, "sha512-zV/5HKTfCeKWnxG0Dmrw51hEWFGfcF2xiXqcA3+J90WDuP0SvoiSO5ORvcBsifmx/FoIjgQN3oNOGaQ5PhLFkg=="], @@ -1349,6 +1623,8 @@ "get-east-asian-width": ["get-east-asian-width@1.5.0", "", {}, "sha512-CQ+bEO+Tva/qlmw24dCejulK5pMzVnUOFOijVogd3KQs07HnRIgp8TGipvCCRT06xeYEbpbgwaCxglFyiuIcmA=="], + "get-func-name": ["get-func-name@3.0.0", "", {}, "sha512-6lB4zp64YzgT5KVoAuY0vBXQXNObRmelzfVCpx2dHkGVskX8WwjxTVd/kGUsVzxuOpSEF9BcD54ChSKMVjSsfQ=="], + "get-intrinsic": ["get-intrinsic@1.3.0", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "es-define-property": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.1.1", "function-bind": "^1.1.2", "get-proto": "^1.0.1", "gopd": "^1.2.0", "has-symbols": "^1.1.0", "hasown": "^2.0.2", "math-intrinsics": "^1.1.0" } }, "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ=="], "get-proto": ["get-proto@1.0.1", "", { "dependencies": { "dunder-proto": "^1.0.1", "es-object-atoms": "^1.0.0" } }, "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g=="], @@ -1359,12 +1635,16 @@ "get-uri": ["get-uri@6.0.5", "", { "dependencies": { "basic-ftp": "^5.0.2", "data-uri-to-buffer": "^6.0.2", "debug": "^4.3.4" } }, "sha512-b1O07XYq8eRuVzBNgJLstU6FYc1tS6wnMtF1I1D9lE8LxZSOGZ7LhxN54yPP6mGw5f2CkXY2BQUL9Fx41qvcIg=="], + "gifwrap": ["gifwrap@0.10.1", "", { "dependencies": { "image-q": "^4.0.0", "omggif": "^1.0.10" } }, "sha512-2760b1vpJHNmLzZ/ubTtNnEx5WApN/PYWJvXvgS+tL1egTTthayFYIQQNi136FLEDcN/IyEY2EcGpIITD6eYUw=="], + "git-workspace-service": ["git-workspace-service@0.4.5", "", { "dependencies": { "@octokit/auth-app": "^6.0.0", "@octokit/rest": "^20.0.0", "pino": "^9.0.0" } }, "sha512-T5mMXDku9s/Gz3yus/CudzqUg2KbaGvF4Y4lgDYZYDGbeFiGWYuJLzVexWQMaiOuctw5XKvRKQYLyB2nwXsMSQ=="], "glob": ["glob@13.0.6", "", { "dependencies": { "minimatch": "^10.2.2", "minipass": "^7.1.3", "path-scurry": "^2.0.2" } }, "sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw=="], "glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], + "global": ["global@4.4.0", "", { "dependencies": { "min-document": "^2.19.0", "process": "^0.11.10" } }, "sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w=="], + "global-agent": ["global-agent@3.0.0", "", { "dependencies": { "boolean": "^3.0.1", "es6-error": "^4.1.1", "matcher": "^3.0.0", "roarr": "^2.15.3", "semver": "^7.3.2", "serialize-error": "^7.0.1" } }, "sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q=="], "globalthis": ["globalthis@1.0.4", "", { "dependencies": { "define-properties": "^1.2.1", "gopd": "^1.0.1" } }, "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ=="], @@ -1403,7 +1683,9 @@ "http-proxy-agent": ["http-proxy-agent@7.0.2", "", { "dependencies": { "agent-base": "^7.1.0", "debug": "^4.3.4" } }, "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig=="], - "https-proxy-agent": ["https-proxy-agent@7.0.6", "", { "dependencies": { "agent-base": "^7.1.2", "debug": "4" } }, "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw=="], + "http-response-object": ["http-response-object@3.0.2", "", { "dependencies": { "@types/node": "^10.0.3" } }, "sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA=="], + + "https-proxy-agent": ["https-proxy-agent@5.0.1", "", { "dependencies": { "agent-base": "6", "debug": "4" } }, "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA=="], "human-signals": ["human-signals@2.1.0", "", {}, "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw=="], @@ -1415,6 +1697,8 @@ "ignore": ["ignore@7.0.5", "", {}, "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg=="], + "image-q": ["image-q@4.0.0", "", { "dependencies": { "@types/node": "16.9.1" } }, "sha512-PfJGVgIfKQJuq3s0tTDOKtztksibuUEbJQIYT3by6wctQo+Rdlh7ef4evJ5NCdxY4CfMbvFkocEwbl4BF8RlJw=="], + "immediate": ["immediate@3.0.6", "", {}, "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ=="], "imurmurhash": ["imurmurhash@0.1.4", "", {}, "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA=="], @@ -1439,10 +1723,14 @@ "is-core-module": ["is-core-module@2.16.1", "", { "dependencies": { "hasown": "^2.0.2" } }, "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w=="], + "is-docker": ["is-docker@2.2.1", "", { "bin": { "is-docker": "cli.js" } }, "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ=="], + "is-extglob": ["is-extglob@2.1.1", "", {}, "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ=="], "is-fullwidth-code-point": ["is-fullwidth-code-point@5.1.0", "", { "dependencies": { "get-east-asian-width": "^1.3.1" } }, "sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ=="], + "is-function": ["is-function@1.0.2", "", {}, "sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ=="], + "is-glob": ["is-glob@4.0.3", "", { "dependencies": { "is-extglob": "^2.1.1" } }, "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg=="], "is-interactive": ["is-interactive@2.0.0", "", {}, "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ=="], @@ -1459,9 +1747,15 @@ "is-unicode-supported": ["is-unicode-supported@2.1.0", "", {}, "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ=="], + "is-unix": ["is-unix@2.0.14", "", {}, "sha512-ZE+Iq0h1pxZu/IGsBKobH5PZ0L3ylv7WHEmKiRG8kEzue6f+w0i3ckwnDY7Ckej2jjq1c7NDYljEkNqOxv4w9A=="], + + "is-wsl": ["is-wsl@2.2.0", "", { "dependencies": { "is-docker": "^2.0.0" } }, "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww=="], + "isarray": ["isarray@1.0.0", "", {}, "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ=="], - "isexe": ["isexe@4.0.0", "", {}, "sha512-FFUtZMpoZ8RqHS3XeXEmHWLA4thH+ZxCv2lOiPIn1Xc7CxrqhWzNSDzD+/chS/zbYezmiwWLdQC09JdQKmthOw=="], + "isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="], + + "isomorphic-fetch": ["isomorphic-fetch@3.0.0", "", { "dependencies": { "node-fetch": "^2.6.1", "whatwg-fetch": "^3.4.1" } }, "sha512-qvUtwJ3j6qwsF3jLxkZ72qCgjMysPzDfeV240JHiGZsANBYd+EEuu35v7dfrJ9Up0Ak07D7GGSkGhCHTqg/5wA=="], "isomorphic-ws": ["isomorphic-ws@4.0.1", "", { "peerDependencies": { "ws": "*" } }, "sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w=="], @@ -1471,10 +1765,14 @@ "jerrypick": ["jerrypick@1.1.2", "", {}, "sha512-YKnxXEekXKzhpf7CLYA0A+oDP8V0OhICNCr5lv96FvSsDEmrb0GKM776JgQvHTMjr7DTTPEVv/1Ciaw0uEWzBA=="], + "jimp": ["jimp@0.22.10", "", { "dependencies": { "@jimp/custom": "^0.22.10", "@jimp/plugins": "^0.22.10", "@jimp/types": "^0.22.10", "regenerator-runtime": "^0.13.3" } }, "sha512-lCaHIJAgTOsplyJzC1w/laxSxrbSsEBw4byKwXgUdMmh+ayPsnidTblenQm+IvhIs44Gcuvlb6pd2LQ0wcKaKg=="], + "joi": ["joi@18.0.2", "", { "dependencies": { "@hapi/address": "^5.1.1", "@hapi/formula": "^3.0.2", "@hapi/hoek": "^11.0.7", "@hapi/pinpoint": "^2.0.1", "@hapi/tlds": "^1.1.1", "@hapi/topo": "^6.0.2", "@standard-schema/spec": "^1.0.0" } }, "sha512-RuCOQMIt78LWnktPoeBL0GErkNaJPTBGcYuyaBvUOQSpcpcLfWrHPPihYdOGbV5pam9VTWbeoF7TsGiHugcjGA=="], "jose": ["jose@6.2.2", "", {}, "sha512-d7kPDd34KO/YnzaDOlikGpOurfF0ByC2sEV4cANCtdqLlTfBlw2p14O/5d/zv40gJPbIQxfES3nSx1/oYNyuZQ=="], + "jpeg-js": ["jpeg-js@0.4.4", "", {}, "sha512-WZzeDOEtTOBK4Mdsar0IqEU5sMr3vSV2RqkAIzUEV2BHnUfKGyswWFPFwK5EeDo93K3FohSHbLAjj0s1Wzd+dg=="], + "js-tiktoken": ["js-tiktoken@1.0.21", "", { "dependencies": { "base64-js": "^1.5.1" } }, "sha512-biOj/6M5qdgx5TKjDnFT1ymSpM5tbd3ylwDtrQvFQSu0Z7bBYko2dF+W/aUkXUPuk6IVpRxk/3Q2sHOzGlS36g=="], "js-tokens": ["js-tokens@9.0.1", "", {}, "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ=="], @@ -1517,12 +1815,18 @@ "libsignal": ["@whiskeysockets/libsignal-node@github:whiskeysockets/libsignal-node#1c30d7d", { "dependencies": { "curve25519-js": "^0.0.4", "protobufjs": "6.8.8" } }, "WhiskeySockets-libsignal-node-1c30d7d", "sha512-5q4/OuDQaMYx3RpDqMqS3WYyqjrsSMpU8ipQZtpYnm5l6DwNoLV9oIYMDK0NILKW+tyk3tVCIA11BMYQ+A1+GA=="], + "libsodium": ["libsodium@0.8.4", "", {}, "sha512-lMcYaRi0zcs7tarATsQUYC7rstliIXZuoq0c6zXSgNtSNtdvBgkSegjWhpMJAXzKX3SUSwIp7+zEsob+j3LuRw=="], + + "libsodium-wrappers": ["libsodium-wrappers@0.8.4", "", { "dependencies": { "libsodium": "^0.8.0" } }, "sha512-mu8aAWucZjTB5O/BtGXtW4e1agy7uHxNYG7zPthmmD1jU43LCDmSWZLN4JhflbdPXj3yDO4lxM1O9hLDgIOXDw=="], + "lie": ["lie@3.3.0", "", { "dependencies": { "immediate": "~3.0.5" } }, "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ=="], "lifecycle-utils": ["lifecycle-utils@3.1.1", "", {}, "sha512-gNd3OvhFNjHykJE3uGntz7UuPzWlK9phrIdXxU9Adis0+ExkwnZibfxCJWiWWZ+a6VbKiZrb+9D9hCQWd4vjTg=="], "linkify-it": ["linkify-it@5.0.0", "", { "dependencies": { "uc.micro": "^2.0.0" } }, "sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ=="], + "load-bmfont": ["load-bmfont@1.4.2", "", { "dependencies": { "buffer-equal": "0.0.1", "mime": "^1.3.4", "parse-bmfont-ascii": "^1.0.3", "parse-bmfont-binary": "^1.0.5", "parse-bmfont-xml": "^1.1.4", "phin": "^3.7.1", "xhr": "^2.0.1", "xtend": "^4.0.0" } }, "sha512-qElWkmjW9Oq1F9EI5Gt7aD9zcdHb9spJCW1L/dmPf7KzCCEJxq8nhHz5eCgI9aMf7vrG/wyaCqdsI+Iy9ZTlog=="], + "locate-path": ["locate-path@5.0.0", "", { "dependencies": { "p-locate": "^4.1.0" } }, "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g=="], "lodash": ["lodash@4.17.23", "", {}, "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w=="], @@ -1545,6 +1849,8 @@ "lodash.once": ["lodash.once@4.1.1", "", {}, "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg=="], + "lodash.snakecase": ["lodash.snakecase@4.1.1", "", {}, "sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw=="], + "lodash.sortby": ["lodash.sortby@4.7.0", "", {}, "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA=="], "log-symbols": ["log-symbols@7.0.1", "", { "dependencies": { "is-unicode-supported": "^2.0.0", "yoctocolors": "^2.1.1" } }, "sha512-ja1E3yCr9i/0hmBVaM0bfwDjnGy8I/s6PP4DFp+yP+a+mrHO4Rm7DtmnqROTUkHIkqffC84YY7AeqX6oFk0WFg=="], @@ -1561,7 +1867,9 @@ "lucide-react": ["lucide-react@0.525.0", "", { "peerDependencies": { "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-Tm1txJ2OkymCGkvwoHt33Y2JpN5xucVq1slHcgE6Lk0WjDfjgKWor5CdVER8U6DvcfMwh4M8XxmpTiyzfmfDYQ=="], - "luxon": ["luxon@3.7.2", "", {}, "sha512-vtEhXh/gNjI9Yg1u4jX/0YVPMvxzHuGgCm6tC5kZyb08yjGWGnqAjGJvcXbqQR2P3MyMEFnRbpcdFS6PBcLqew=="], + "magic-bytes.js": ["magic-bytes.js@1.13.0", "", {}, "sha512-afO2mnxW7GDTXMm5/AoN1WuOcdoKhtgXjIvHmobqTD1grNplhGdv3PFOyjCVmrnOZBIT/gD/koDKpYG+0mvHcg=="], + + "make-asynchronous": ["make-asynchronous@1.1.0", "", { "dependencies": { "p-event": "^6.0.0", "type-fest": "^4.6.0", "web-worker": "^1.5.0" } }, "sha512-ayF7iT+44LXdxJLTrTd3TLQpFDDvPCBxXxbv+pMUSuHA5Q8zyAfwkRP6aHHwNVFBUFWtxAHqwNJxF8vMZLAbVg=="], "mammoth": ["mammoth@1.12.0", "", { "dependencies": { "@xmldom/xmldom": "^0.8.6", "argparse": "~1.0.3", "base64-js": "^1.5.1", "bluebird": "~3.4.0", "dingbat-to-unicode": "^1.0.1", "jszip": "^3.7.1", "lop": "^0.4.2", "path-is-absolute": "^1.0.0", "underscore": "^1.13.1", "xmlbuilder": "^10.0.0" }, "bin": { "mammoth": "bin/mammoth" } }, "sha512-cwnK1RIcRdDMi2HRx2EXGYlxqIEh0Oo3bLhorgnsVJi2UkbX1+jKxuBNR9PC5+JaX7EkmJxFPmo6mjLpqShI2w=="], @@ -1589,14 +1897,16 @@ "mime": ["mime@3.0.0", "", { "bin": { "mime": "cli.js" } }, "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A=="], - "mime-db": ["mime-db@1.52.0", "", {}, "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="], + "mime-db": ["mime-db@1.54.0", "", {}, "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ=="], - "mime-types": ["mime-types@2.1.35", "", { "dependencies": { "mime-db": "1.52.0" } }, "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw=="], + "mime-types": ["mime-types@3.0.2", "", { "dependencies": { "mime-db": "^1.54.0" } }, "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A=="], "mimic-fn": ["mimic-fn@2.1.0", "", {}, "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg=="], "mimic-function": ["mimic-function@5.0.1", "", {}, "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA=="], + "min-document": ["min-document@2.19.2", "", { "dependencies": { "dom-walk": "^0.1.0" } }, "sha512-8S5I8db/uZN8r9HSLFVWPdJCvYOejMcEC82VIzNUc6Zkklf/d1gg2psfE79/vyhWOj4+J8MtwmoOz3TmvaGu5A=="], + "minimatch": ["minimatch@10.2.4", "", { "dependencies": { "brace-expansion": "^5.0.2" } }, "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg=="], "minimist": ["minimist@1.2.8", "", {}, "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA=="], @@ -1625,6 +1935,10 @@ "next-tick": ["next-tick@1.1.0", "", {}, "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ=="], + "nice-try": ["nice-try@1.0.5", "", {}, "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ=="], + + "node-abort-controller": ["node-abort-controller@3.1.1", "", {}, "sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ=="], + "node-addon-api": ["node-addon-api@8.6.0", "", {}, "sha512-gBVjCaqDlRUk0EwoPNKzIr9KkS9041G/q31IBShPs1Xz6UTA+EXdZADbzqAJQrpDRq71CIMnOP5VMut3SL0z5Q=="], "node-api-headers": ["node-api-headers@1.8.0", "", {}, "sha512-jfnmiKWjRAGbdD1yQS28bknFM1tbHC1oucyuMPjmkEs+kpiu76aRs40WlTmBmyEgzDM76ge1DQ7XJ3R5deiVjQ=="], @@ -1635,7 +1949,7 @@ "node-gyp-build": ["node-gyp-build@4.8.4", "", { "bin": { "node-gyp-build": "bin.js", "node-gyp-build-optional": "optional.js", "node-gyp-build-test": "build-test.js" } }, "sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ=="], - "node-llama-cpp": ["node-llama-cpp@3.18.1", "", { "dependencies": { "@huggingface/jinja": "^0.5.6", "async-retry": "^1.3.3", "bytes": "^3.1.2", "chalk": "^5.6.2", "chmodrp": "^1.0.2", "cmake-js": "^8.0.0", "cross-spawn": "^7.0.6", "env-var": "^7.5.0", "filenamify": "^6.0.0", "fs-extra": "^11.3.4", "ignore": "^7.0.4", "ipull": "^3.9.5", "is-unicode-supported": "^2.1.0", "lifecycle-utils": "^3.1.1", "log-symbols": "^7.0.1", "nanoid": "^5.1.6", "node-addon-api": "^8.6.0", "ora": "^9.3.0", "pretty-ms": "^9.3.0", "proper-lockfile": "^4.1.2", "semver": "^7.7.1", "simple-git": "^3.33.0", "slice-ansi": "^8.0.0", "stdout-update": "^4.0.1", "strip-ansi": "^7.2.0", "validate-npm-package-name": "^7.0.2", "which": "^6.0.1", "yargs": "^17.7.2" }, "optionalDependencies": { "@node-llama-cpp/linux-arm64": "3.18.1", "@node-llama-cpp/linux-armv7l": "3.18.1", "@node-llama-cpp/linux-x64": "3.18.1", "@node-llama-cpp/linux-x64-cuda": "3.18.1", "@node-llama-cpp/linux-x64-cuda-ext": "3.18.1", "@node-llama-cpp/linux-x64-vulkan": "3.18.1", "@node-llama-cpp/mac-arm64-metal": "3.18.1", "@node-llama-cpp/mac-x64": "3.18.1", "@node-llama-cpp/win-arm64": "3.18.1", "@node-llama-cpp/win-x64": "3.18.1", "@node-llama-cpp/win-x64-cuda": "3.18.1", "@node-llama-cpp/win-x64-cuda-ext": "3.18.1", "@node-llama-cpp/win-x64-vulkan": "3.18.1" }, "peerDependencies": { "typescript": ">=5.0.0" }, "optionalPeers": ["typescript"], "bin": { "node-llama-cpp": "dist/cli/cli.js", "nlc": "dist/cli/cli.js" } }, "sha512-w0zfuy/IKS2fhrbed5SylZDXJHTVz4HnkwZ4UrFPgSNwJab3QIPwIl4lyCKHHy9flLrtxsAuV5kXfH3HZ6bb8w=="], + "node-llama-cpp": ["node-llama-cpp@github:milady-ai/node-llama-cpp#b044d4a", { "dependencies": { "@huggingface/jinja": "^0.5.6", "async-retry": "^1.3.3", "bytes": "^3.1.2", "chalk": "^5.6.2", "chmodrp": "^1.0.2", "cmake-js": "^8.0.0", "cross-spawn": "^7.0.6", "env-var": "^7.5.0", "filenamify": "^6.0.0", "fs-extra": "^11.3.4", "ignore": "^7.0.4", "ipull": "^3.9.5", "is-unicode-supported": "^2.1.0", "lifecycle-utils": "^3.1.1", "log-symbols": "^7.0.1", "nanoid": "^5.1.6", "node-addon-api": "^8.6.0", "ora": "^9.3.0", "pretty-ms": "^9.3.0", "proper-lockfile": "^4.1.2", "semver": "^7.7.1", "simple-git": "^3.33.0", "slice-ansi": "^8.0.0", "stdout-update": "^4.0.1", "strip-ansi": "^7.2.0", "validate-npm-package-name": "^7.0.2", "which": "^6.0.1", "yargs": "^17.7.2" }, "optionalDependencies": { "@node-llama-cpp/linux-arm64": "3.18.1", "@node-llama-cpp/linux-armv7l": "3.18.1", "@node-llama-cpp/linux-x64": "3.18.1", "@node-llama-cpp/linux-x64-cuda": "3.18.1", "@node-llama-cpp/linux-x64-cuda-ext": "3.18.1", "@node-llama-cpp/linux-x64-vulkan": "3.18.1", "@node-llama-cpp/mac-arm64-metal": "3.18.1", "@node-llama-cpp/mac-x64": "3.18.1", "@node-llama-cpp/win-arm64": "3.18.1", "@node-llama-cpp/win-x64": "3.18.1", "@node-llama-cpp/win-x64-cuda": "3.18.1", "@node-llama-cpp/win-x64-cuda-ext": "3.18.1", "@node-llama-cpp/win-x64-vulkan": "3.18.1" }, "peerDependencies": { "typescript": ">=5.0.0" }, "optionalPeers": ["typescript"], "bin": { "node-llama-cpp": "dist/cli/cli.js", "nlc": "dist/cli/cli.js" } }, "elizaOS-node-llama-cpp-b044d4a", "sha512-QJFGkSXWw5NiGzPHM3AIczZgDdHjLqAgWkOtR09WwOlef1uJJwQ/wQc6wn0abzFiCXG95dcriUi2dndev0xymg=="], "node-localstorage": ["node-localstorage@2.2.1", "", { "dependencies": { "write-file-atomic": "^1.1.4" } }, "sha512-vv8fJuOUCCvSPjDjBLlMqYMHob4aGjkmrkaE42/mZr0VT+ZAU10jRF8oTnX9+pgU9/vYJ8P7YT3Vd6ajkmzSCw=="], @@ -1647,13 +1961,19 @@ "npm-run-path": ["npm-run-path@4.0.1", "", { "dependencies": { "path-key": "^3.0.0" } }, "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw=="], + "null-prototype-object": ["null-prototype-object@1.2.7", "", {}, "sha512-pSZWCUew0zed2gxCerA4zdXRGg8ezLiWwvE8RvncezTcROXL0uz3PjSZXl5NsI04Egz0Uu46o1wyX6qr3u/ZWA=="], + "object-assign": ["object-assign@4.1.1", "", {}, "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg=="], "object-inspect": ["object-inspect@1.13.4", "", {}, "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew=="], "object-keys": ["object-keys@1.1.1", "", {}, "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA=="], - "ollama-ai-provider": ["ollama-ai-provider@1.2.0", "", { "dependencies": { "@ai-sdk/provider": "^1.0.0", "@ai-sdk/provider-utils": "^2.0.0", "partial-json": "0.1.7" }, "peerDependencies": { "zod": "^3.0.0" }, "optionalPeers": ["zod"] }, "sha512-jTNFruwe3O/ruJeppI/quoOUxG7NA6blG3ZyQj3lei4+NnJo7bi3eIRWqlVpRlu/mbzbFXeJSBuYQWF6pzGKww=="], + "ollama-ai-provider": ["ollama-ai-provider-v2@3.5.1", "", { "dependencies": { "@ai-sdk/provider": "^3.0.10", "@ai-sdk/provider-utils": "^4.0.26" }, "peerDependencies": { "ai": "^5.0.0 || ^6.0.0", "zod": "^4.0.16" } }, "sha512-C6JqhEVAQvptakeV62XnwvI2eAYQaCDHSu1F1xYw2gy82SF08JrZfRVq6GoyZdTiZoZ2aYmjHKhyGiQV2vfyog=="], + + "ollama-ai-provider-v2": ["ollama-ai-provider-v2@3.5.1", "", { "dependencies": { "@ai-sdk/provider": "^3.0.10", "@ai-sdk/provider-utils": "^4.0.26" }, "peerDependencies": { "ai": "^5.0.0 || ^6.0.0", "zod": "^4.0.16" } }, "sha512-C6JqhEVAQvptakeV62XnwvI2eAYQaCDHSu1F1xYw2gy82SF08JrZfRVq6GoyZdTiZoZ2aYmjHKhyGiQV2vfyog=="], + + "omggif": ["omggif@1.0.10", "", {}, "sha512-LMJTtvgc/nugXj0Vcrrs68Mn2D1r0zf630VNtqtpI1FEO7e+O9FP4gqs9AcnBaSEeoHIPm28u6qgPR0oyEpGSw=="], "on-exit-leak-free": ["on-exit-leak-free@2.1.2", "", {}, "sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA=="], @@ -1663,20 +1983,26 @@ "onetime": ["onetime@5.1.2", "", { "dependencies": { "mimic-fn": "^2.1.0" } }, "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg=="], - "onnxruntime-common": ["onnxruntime-common@1.21.0", "", {}, "sha512-Q632iLLrtCAVOTO65dh2+mNbQir/QNTVBG3h/QdZBpns7mZ0RYbLRBgGABPbpU9351AgYy7SJf1WaeVwMrBFPQ=="], + "onnxruntime-common": ["onnxruntime-common@1.24.3", "", {}, "sha512-GeuPZO6U/LBJXvwdaqHbuUmoXiEdeCjWi/EG7Y1HNnDwJYuk6WUbNXpF6luSUY8yASul3cmUlLGrCCL1ZgVXqA=="], - "onnxruntime-node": ["onnxruntime-node@1.21.0", "", { "dependencies": { "global-agent": "^3.0.0", "onnxruntime-common": "1.21.0", "tar": "^7.0.1" }, "os": [ "linux", "win32", "darwin", ] }, "sha512-NeaCX6WW2L8cRCSqy3bInlo5ojjQqu2fD3D+9W5qb5irwxhEyWKXeH2vZ8W9r6VxaMPUan+4/7NDwZMtouZxEw=="], + "onnxruntime-node": ["onnxruntime-node@1.24.3", "", { "dependencies": { "adm-zip": "^0.5.16", "global-agent": "^3.0.0", "onnxruntime-common": "1.24.3" }, "os": [ "linux", "win32", "darwin", ] }, "sha512-JH7+czbc8ALA819vlTgcV+Q214/+VjGeBHDjX81+ZCD0PCVCIFGFNtT0V4sXG/1JXypKPgScQcB3ij/hk3YnTg=="], - "onnxruntime-web": ["onnxruntime-web@1.22.0-dev.20250409-89f8206ba4", "", { "dependencies": { "flatbuffers": "^25.1.24", "guid-typescript": "^1.0.9", "long": "^5.2.3", "onnxruntime-common": "1.22.0-dev.20250409-89f8206ba4", "platform": "^1.3.6", "protobufjs": "^7.2.4" } }, "sha512-0uS76OPgH0hWCPrFKlL8kYVV7ckM7t/36HfbgoFw6Nd0CZVVbQC4PkrR8mBX8LtNUFZO25IQBqV2Hx2ho3FlbQ=="], + "onnxruntime-web": ["onnxruntime-web@1.26.0-dev.20260416-b7804b056c", "", { "dependencies": { "flatbuffers": "^25.1.24", "guid-typescript": "^1.0.9", "long": "^5.2.3", "onnxruntime-common": "1.24.0-dev.20251116-b39e144322", "platform": "^1.3.6", "protobufjs": "^7.2.4" } }, "sha512-MD6Ss4GSpQBo6zqoJzyT9LRbKYs7x/JVN23FT24EcEvlqF4VuzPOeH6X38orZPKHQDbprn7K+SBpu0/mj2CQiw=="], "openai": ["openai@6.10.0", "", { "peerDependencies": { "ws": "^8.18.0", "zod": "^3.25 || ^4.0" }, "optionalPeers": ["ws", "zod"], "bin": { "openai": "bin/cli" } }, "sha512-ITxOGo7rO3XRMiKA5l7tQ43iNNu+iXGFAcf2t+aWVzzqRaS0i7m1K2BhxNdaveB+5eENhO0VY1FkiZzhBk4v3A=="], "option": ["option@0.2.4", "", {}, "sha512-pkEqbDyl8ou5cpq+VsnQbe/WlEy5qS7xPzMS1U55OCG9KPvwFD46zDbxQIj3egJSFc3D+XhYOPUzz49zQAVy7A=="], + "opusscript": ["opusscript@0.1.1", "", {}, "sha512-mL0fZZOUnXdZ78woRXp18lApwpp0lF5tozJOD1Wut0dgrA9WuQTgSels/CSmFleaAZrJi/nci5KOVtbuxeWoQA=="], + "ora": ["ora@9.3.0", "", { "dependencies": { "chalk": "^5.6.2", "cli-cursor": "^5.0.0", "cli-spinners": "^3.2.0", "is-interactive": "^2.0.0", "is-unicode-supported": "^2.1.0", "log-symbols": "^7.0.1", "stdin-discarder": "^0.3.1", "string-width": "^8.1.0" } }, "sha512-lBX72MWFduWEf7v7uWf5DHp9Jn5BI8bNPGuFgtXMmr2uDz2Gz2749y3am3agSDdkhHPHYmmxEGSKH85ZLGzgXw=="], "ox": ["ox@0.14.20", "", { "dependencies": { "@adraffy/ens-normalize": "^1.11.0", "@noble/ciphers": "^1.3.0", "@noble/curves": "1.9.1", "@noble/hashes": "^1.8.0", "@scure/bip32": "^1.7.0", "@scure/bip39": "^1.6.0", "abitype": "^1.2.3", "eventemitter3": "5.0.1" }, "peerDependencies": { "typescript": ">=5.4.0" }, "optionalPeers": ["typescript"] }, "sha512-rby38C3nDn8eQkf29Zgw4hkCZJ64Qqi0zRPWL8ENUQ7JVuoITqrVtwWQgM/He19SCMUEc7hS/Sjw0jIOSLJhOw=="], + "p-event": ["p-event@6.0.1", "", { "dependencies": { "p-timeout": "^6.1.2" } }, "sha512-Q6Bekk5wpzW5qIyUP4gdMEujObYstZl6DMMOSenwBvV0BlE5LkDwkjs5yHbZmdCEq2o4RJx4tE1vwxFVf2FG1w=="], + + "p-finally": ["p-finally@1.0.0", "", {}, "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow=="], + "p-limit": ["p-limit@2.3.0", "", { "dependencies": { "p-try": "^2.0.0" } }, "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w=="], "p-locate": ["p-locate@4.1.0", "", { "dependencies": { "p-limit": "^2.2.0" } }, "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A=="], @@ -1695,6 +2021,16 @@ "pako": ["pako@2.1.0", "", {}, "sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug=="], + "parse-bmfont-ascii": ["parse-bmfont-ascii@1.0.6", "", {}, "sha512-U4RrVsUFCleIOBsIGYOMKjn9PavsGOXxbvYGtMOEfnId0SVNsgehXh1DxUdVPLoxd5mvcEtvmKs2Mmf0Mpa1ZA=="], + + "parse-bmfont-binary": ["parse-bmfont-binary@1.0.6", "", {}, "sha512-GxmsRea0wdGdYthjuUeWTMWPqm2+FAd4GI8vCvhgJsFnoGhTrLhXDDupwTo7rXVAgaLIGoVHDZS9p/5XbSqeWA=="], + + "parse-bmfont-xml": ["parse-bmfont-xml@1.1.6", "", { "dependencies": { "xml-parse-from-string": "^1.0.0", "xml2js": "^0.5.0" } }, "sha512-0cEliVMZEhrFDwMh4SxIyVJpqYoOWDJ9P895tFuS+XuNzI5UBmBk5U5O4KuJdTnZpSBI4LFA2+ZiJaiwfSwlMA=="], + + "parse-cache-control": ["parse-cache-control@1.0.1", "", {}, "sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg=="], + + "parse-headers": ["parse-headers@2.0.6", "", {}, "sha512-Tz11t3uKztEW5FEVZnj1ox8GKblWn+PvHY9TmJV5Mll2uHEwRdR/5Li1OlXoECjLYkApdhWy44ocONwXLiKO5A=="], + "parse-ms": ["parse-ms@4.0.0", "", {}, "sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw=="], "parse5": ["parse5@8.0.1", "", { "dependencies": { "entities": "^8.0.0" } }, "sha512-z1e/HMG90obSGeidlli3hj7cbocou0/wa5HacvI3ASx34PecNjNQeaHNo5WIZpWofN9kgkqV1q5YvXe3F0FoPw=="], @@ -1723,6 +2059,8 @@ "pdfjs-dist": ["pdfjs-dist@5.5.207", "", { "optionalDependencies": { "@napi-rs/canvas": "^0.1.95", "node-readable-to-web-readable-stream": "^0.4.2" } }, "sha512-WMqqw06w1vUt9ZfT0gOFhMf3wHsWhaCrxGrckGs5Cci6ybDW87IvPaOd2pnBwT6BJuP/CzXDZxjFgmSULLdsdw=="], + "peek-readable": ["peek-readable@4.1.0", "", {}, "sha512-ZI3LnwUv5nOGbQzD9c2iDG6toheuXSZP5esSHBjopsXH4dg19soufvpUGA3uohi5anFtGb2lhAVdHzH6R/Evvg=="], + "pend": ["pend@1.2.0", "", {}, "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg=="], "pg": ["pg@8.20.0", "", { "dependencies": { "pg-connection-string": "^2.12.0", "pg-pool": "^3.13.0", "pg-protocol": "^1.13.0", "pg-types": "2.2.0", "pgpass": "1.0.5" }, "optionalDependencies": { "pg-cloudflare": "^1.3.0" }, "peerDependencies": { "pg-native": ">=3.0.1" }, "optionalPeers": ["pg-native"] }, "sha512-ldhMxz2r8fl/6QkXnBD3CR9/xg694oT6DZQ2s6c/RI28OjtSOpxnPrUCGOBJ46RCUxcWdx3p6kw/xnDHjKvaRA=="], @@ -1741,6 +2079,8 @@ "pgpass": ["pgpass@1.0.5", "", { "dependencies": { "split2": "^4.1.0" } }, "sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug=="], + "phin": ["phin@3.7.1", "", { "dependencies": { "centra": "^2.7.0" } }, "sha512-GEazpTWwTZaEQ9RhL7Nyz0WwqilbqgLahDM3D0hxWwmVDI52nXEybHqiN6/elwpkJBhcuj+WbBu+QfT0uhPGfQ=="], + "picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="], "picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], @@ -1751,6 +2091,8 @@ "pino-std-serializers": ["pino-std-serializers@7.1.0", "", {}, "sha512-BndPH67/JxGExRgiX1dX0w1FvZck5Wa4aal9198SrRhZjH3GxKQUKIBnYJTdj2HDN3UQAS06HlfcSbQj2OHmaw=="], + "pixelmatch": ["pixelmatch@4.0.2", "", { "dependencies": { "pngjs": "^3.0.0" }, "bin": { "pixelmatch": "bin/pixelmatch" } }, "sha512-J8B6xqiO37sU/gkcMglv6h5Jbd9xNER7aHzpfRdNmV4IbQBzBpe4l9XmbG+xPF/znacgu2jfEw+wHffaq/YkXA=="], + "pkce-challenge": ["pkce-challenge@5.0.1", "", {}, "sha512-wQ0b/W4Fr01qtpHlqSqspcj3EhBvimsdh0KlHhH8HRZnMsEa0ea2fTULOXOS9ccQr3om+GcGRk4e+isrZWV8qQ=="], "platform": ["platform@1.3.6", "", {}, "sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg=="], @@ -1775,6 +2117,10 @@ "pretty-ms": ["pretty-ms@9.3.0", "", { "dependencies": { "parse-ms": "^4.0.0" } }, "sha512-gjVS5hOP+M3wMm5nmNOucbIrqudzs9v/57bWRHQWLYklXqoXKrVfYW2W9+glfGsqtPgpiz5WwyEEB+ksXIx3gQ=="], + "prism-media": ["prism-media@1.3.5", "", { "peerDependencies": { "@discordjs/opus": ">=0.8.0 <1.0.0", "ffmpeg-static": "^5.0.2 || ^4.2.7 || ^3.0.0 || ^2.4.0", "node-opus": "^0.3.3", "opusscript": "^0.0.8" }, "optionalPeers": ["@discordjs/opus", "ffmpeg-static", "node-opus", "opusscript"] }, "sha512-IQdl0Q01m4LrkN1EGIE9lphov5Hy7WWlH6ulf5QdGePLlPas9p2mhgddTEHrlaXYjjFToM1/rWuwF37VF4taaA=="], + + "process": ["process@0.11.10", "", {}, "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A=="], + "process-nextick-args": ["process-nextick-args@2.0.1", "", {}, "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="], "process-warning": ["process-warning@5.0.0", "", {}, "sha512-a39t9ApHNx2L4+HBnQKqxxHNs1r7KF+Intd8Q/g1bUh6q0WIp9voPXJ/x0j+ZL45KF1pJd9+q2jLIRMfvEshkA=="], @@ -1799,8 +2145,6 @@ "pty-manager": ["pty-manager@1.11.0", "", { "dependencies": { "adapter-types": "^0.2.0", "node-pty": "^1.0.0" }, "bin": { "pty-worker": "dist/pty-worker.js" } }, "sha512-Ncyh+2lV0cB5cUYcij4fb10ILTamOKeFOGSvq7FaYubnC7pjI4G9nkPOXb6Ac5/YHvh8I/6Ko+JOdILwXbT5vQ=="], - "pty-state-capture": ["pty-state-capture@0.2.0", "", {}, "sha512-FatJj03jyHZ6S05VBZFXnrTxXaESDnQEuN+8lxlSohymE1O2369kSsM+EkltVRzCKEuA9KmEAUAKmaxp9szFQg=="], - "pump": ["pump@3.0.4", "", { "dependencies": { "end-of-stream": "^1.1.0", "once": "^1.3.1" } }, "sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA=="], "punycode": ["punycode@2.3.1", "", {}, "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg=="], @@ -1813,12 +2157,18 @@ "qrcode": ["qrcode@1.5.4", "", { "dependencies": { "dijkstrajs": "^1.0.1", "pngjs": "^5.0.0", "yargs": "^15.3.1" }, "bin": { "qrcode": "bin/qrcode" } }, "sha512-1ca71Zgiu6ORjHqFBDpnSMTR2ReToX4l1Au1VFLyVeBTFavzQnv5JxMFr3ukHVKpSrSA2MCk0lNJSykjUfz7Zg=="], + "qrcode-terminal": ["qrcode-terminal@0.12.0", "", { "bin": { "qrcode-terminal": "./bin/qrcode-terminal.js" } }, "sha512-EXtzRZmC+YGmGlDFbXKxQiMZNwCLEO6BANKXG4iCtSIM0yqc/pappSx3RIKr4r0uh5JsBckOXeKrB3Iz7mdQpQ=="], + "qs": ["qs@6.15.0", "", { "dependencies": { "side-channel": "^1.1.0" } }, "sha512-mAZTtNCeetKMH+pSjrb76NAM8V9a05I9aBZOHztWy/UqcJdQYNsf59vrRKWnojAT9Y+GbIvoTBC++CPHqpDBhQ=="], "queue-microtask": ["queue-microtask@1.2.3", "", {}, "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A=="], "quick-format-unescaped": ["quick-format-unescaped@4.0.4", "", {}, "sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg=="], + "quickjs-emscripten": ["quickjs-emscripten@0.32.0", "", { "dependencies": { "@jitl/quickjs-wasmfile-debug-asyncify": "0.32.0", "@jitl/quickjs-wasmfile-debug-sync": "0.32.0", "@jitl/quickjs-wasmfile-release-asyncify": "0.32.0", "@jitl/quickjs-wasmfile-release-sync": "0.32.0", "quickjs-emscripten-core": "0.32.0" } }, "sha512-So0Sqw869y/S2oE3Nuc0uT3Dhqgvsj8FSrwBdsuTosVsG8ME5/OcudU1GxsrIFdFABgy17GHnTVO9TYV/bLQcA=="], + + "quickjs-emscripten-core": ["quickjs-emscripten-core@0.32.0", "", { "dependencies": { "@jitl/quickjs-ffi-types": "0.32.0" } }, "sha512-QFnPfjFey8EqknSrSxe1hZrf1/8z7/6s1QzGOmKo6++02r7QRRX7ZoyNaZh7JuVjWsVW87KnQrbZqnHkOAzUyg=="], + "range-parser": ["range-parser@1.2.1", "", {}, "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg=="], "raw-body": ["raw-body@3.0.2", "", { "dependencies": { "bytes": "~3.1.2", "http-errors": "~2.0.1", "iconv-lite": "~0.7.0", "unpipe": "~1.0.0" } }, "sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA=="], @@ -1837,6 +2187,8 @@ "readable-stream": ["readable-stream@3.6.2", "", { "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" } }, "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA=="], + "readable-web-to-node-stream": ["readable-web-to-node-stream@3.0.4", "", { "dependencies": { "readable-stream": "^4.7.0" } }, "sha512-9nX56alTf5bwXQ3ZDipHJhusu9NTQJ/CVPtb/XHAJCXihZeitfJvIRS4GqQ/mfIoOE3IelHMrpayVrosdHBuLw=="], + "readline-sync": ["readline-sync@1.4.10", "", {}, "sha512-gNva8/6UAe8QYepIQH/jQ2qn91Qj0B9sYjMBBs3QOB8F2CXcKgLxQaJRP76sWVRQt+QU+8fAkCbCvjjMFu7Ycw=="], "real-cancellable-promise": ["real-cancellable-promise@1.2.3", "", {}, "sha512-hBI5Gy/55VEeeMtImMgEirD7eq5UmqJf1J8dFZtbJZA/3rB0pYFZ7PayMGueb6v4UtUtpKpP+05L0VwyE1hI9Q=="], @@ -1845,6 +2197,8 @@ "rechoir": ["rechoir@0.6.2", "", { "dependencies": { "resolve": "^1.1.6" } }, "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw=="], + "regenerator-runtime": ["regenerator-runtime@0.13.11", "", {}, "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg=="], + "require-directory": ["require-directory@2.1.1", "", {}, "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q=="], "require-from-string": ["require-from-string@2.0.2", "", {}, "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw=="], @@ -1883,6 +2237,8 @@ "sandwich-stream": ["sandwich-stream@2.0.2", "", {}, "sha512-jLYV0DORrzY3xaz/S9ydJL6Iz7essZeAfnAavsJ+zsJGZ1MOnsS52yRjU3uF3pJa/lla7+wisp//fxOwOH8SKQ=="], + "sax": ["sax@1.6.0", "", {}, "sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA=="], + "saxes": ["saxes@6.0.0", "", { "dependencies": { "xmlchars": "^2.2.0" } }, "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA=="], "scheduler": ["scheduler@0.27.0", "", {}, "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q=="], @@ -1893,6 +2249,10 @@ "semver-compare": ["semver-compare@1.0.0", "", {}, "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow=="], + "semver-regex": ["semver-regex@4.0.5", "", {}, "sha512-hunMQrEy1T6Jr2uEVjrAIqjwWcQTgOAcIM52C8MY1EZSD3DDNft04XzvYKPqjED65bNVVko0YI38nYeEHCX3yw=="], + + "semver-truncate": ["semver-truncate@3.0.0", "", { "dependencies": { "semver": "^7.3.5" } }, "sha512-LJWA9kSvMolR51oDE6PN3kALBNaUdkxzAGcexw8gjMA8xr5zUqK0JiR3CgARSqanYF3Z1YHvsErb1KDgh+v7Rg=="], + "send": ["send@1.2.1", "", { "dependencies": { "debug": "^4.4.3", "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "etag": "^1.8.1", "fresh": "^2.0.0", "http-errors": "^2.0.1", "mime-types": "^3.0.2", "ms": "^2.1.3", "on-finished": "^2.4.1", "range-parser": "^1.2.1", "statuses": "^2.0.2" } }, "sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ=="], "serialize-error": ["serialize-error@7.0.1", "", { "dependencies": { "type-fest": "^0.13.1" } }, "sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw=="], @@ -1983,6 +2343,8 @@ "strip-ansi": ["strip-ansi@7.2.0", "", { "dependencies": { "ansi-regex": "^6.2.2" } }, "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w=="], + "strip-eof": ["strip-eof@1.0.0", "", {}, "sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q=="], + "strip-final-newline": ["strip-final-newline@2.0.0", "", {}, "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA=="], "strip-json-comments": ["strip-json-comments@2.0.1", "", {}, "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ=="], @@ -1993,6 +2355,8 @@ "strtok3": ["strtok3@10.3.5", "", { "dependencies": { "@tokenizer/token": "^0.3.0" } }, "sha512-ki4hZQfh5rX0QDLLkOCj+h+CVNkqmp/CMf8v8kZpkNVK6jGQooMytqzLZYUVYIZcFZ6yDB70EfD8POcFXiF5oA=="], + "super-regex": ["super-regex@1.1.0", "", { "dependencies": { "function-timeout": "^1.0.1", "make-asynchronous": "^1.0.1", "time-span": "^5.1.0" } }, "sha512-WHkws2ZflZe41zj6AolvvmaTrWds/VuyeYr9iPVv/oQeaIoVxMKaushfFWpOGDT+GuBrM/sVqF8KUCYQlSSTdQ=="], + "superstruct": ["superstruct@2.0.2", "", {}, "sha512-uV+TFRZdXsqXTL2pRvujROjdZQ4RAlBUS5BTh9IGm+jTqQntYThciG/qu57Gs69yjnVUSqdxF9YLmSnpupBW9A=="], "supports-preserve-symlinks-flag": ["supports-preserve-symlinks-flag@1.0.0", "", {}, "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w=="], @@ -2025,8 +2389,14 @@ "through": ["through@2.3.8", "", {}, "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg=="], + "time-span": ["time-span@5.1.0", "", { "dependencies": { "convert-hrtime": "^5.0.0" } }, "sha512-75voc/9G4rDIJleOo4jPvN4/YC4GRZrY8yy1uU4lwrB3XEQbWve8zXoO5No4eFrGcTAMYyoY67p8jRQdtA1HbA=="], + + "timm": ["timm@1.7.1", "", {}, "sha512-IjZc9KIotudix8bMaBW6QvMuq64BrJWFs1+4V0lXwWGQZwH+LnX87doAYhem4caOEusRP9/g6jVDQmZ8XOk1nw=="], + "tinycolor2": ["tinycolor2@1.6.0", "", {}, "sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw=="], + "tinyspawn": ["tinyspawn@1.5.7", "", {}, "sha512-EUrfYrlL9SvWuDjyzgF1NdILYHAOI/fosveOHbIcB9ZTaCu+IqPrA7df4M6Olf4vZUFrO9U0qPqOATLApk8WjA=="], + "tldts": ["tldts@7.0.30", "", { "dependencies": { "tldts-core": "^7.0.30" }, "bin": { "tldts": "bin/cli.js" } }, "sha512-ELrFxuqsDdHUwoh0XxDbxuLD3Wnz49Z57IFvTtvWy1hJdcMZjXLIuonjilCiWHlT2GbE4Wlv1wKVTzDFnXH1aw=="], "tldts-core": ["tldts-core@7.0.30", "", {}, "sha512-uiHN8PIB1VmWyS98eZYja4xzlYqeFZVjb4OuYlJQnZAuJhMw4PbKQOKgHKhBdJR3FE/t5mUQ1Kd80++B+qhD1Q=="], @@ -2045,6 +2415,8 @@ "ts-custom-error": ["ts-custom-error@3.3.1", "", {}, "sha512-5OX1tzOjxWEgsr/YEUWSuPrQ00deKLh6D7OTWcvNHm12/7QPyRh8SYpyWvA4IZv8H/+GQWQEh/kwo95Q9OVW1A=="], + "ts-mixer": ["ts-mixer@6.0.4", "", {}, "sha512-ufKpbmrugz5Aou4wcr5Wc1UUFWOLhq+Fm6qa6P0w0K5Qw2yhaUoiWszhCVuNQyNwrlGiscHOmqYoAox1PtvgjA=="], + "tslib": ["tslib@2.7.0", "", {}, "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA=="], "tsx": ["tsx@4.21.0", "", { "dependencies": { "esbuild": "~0.27.0", "get-tsconfig": "^4.7.5" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "bin": { "tsx": "dist/cli.mjs" } }, "sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw=="], @@ -2095,6 +2467,8 @@ "utf-8-validate": ["utf-8-validate@5.0.10", "", { "dependencies": { "node-gyp-build": "^4.3.0" } }, "sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ=="], + "utif2": ["utif2@4.1.0", "", { "dependencies": { "pako": "^1.0.11" } }, "sha512-+oknB9FHrJ7oW7A2WZYajOcv4FcDR4CfoGB0dPNfxbi4GO05RRnFmt5oa23+9w32EanrYcSJWspUiJkLMs+37w=="], + "util-deprecate": ["util-deprecate@1.0.2", "", {}, "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="], "uuid": ["uuid@14.0.0", "", { "bin": { "uuid": "dist-node/bin/uuid" } }, "sha512-Qo+uWgilfSmAhXCMav1uYFynlQO7fMFiMVZsQqZRMIXp0O7rR7qjkj+cPvBHLgBqi960QCoo/PH2/6ZtVqKvrg=="], @@ -2111,17 +2485,21 @@ "web-streams-polyfill": ["web-streams-polyfill@3.3.3", "", {}, "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw=="], + "web-worker": ["web-worker@1.5.0", "", {}, "sha512-RiMReJrTAiA+mBjGONMnjVDP2u3p9R1vkcGz6gDIrOMT3oGuYwX2WRMYI9ipkphSuE5XKEhydbhNEJh4NY9mlw=="], + "webdriver-bidi-protocol": ["webdriver-bidi-protocol@0.4.1", "", {}, "sha512-ARrjNjtWRRs2w4Tk7nqrf2gBI0QXWuOmMCx2hU+1jUt6d00MjMxURrhxhGbrsoiZKJrhTSTzbIrc554iKI10qw=="], "webidl-conversions": ["webidl-conversions@8.0.1", "", {}, "sha512-BMhLD/Sw+GbJC21C/UgyaZX41nPt8bUTg+jWyDeg7e7YN4xOM05YPSIXceACnXVtqyEw/LMClUQMtMZ+PGGpqQ=="], "websocket": ["websocket@1.0.35", "", { "dependencies": { "bufferutil": "^4.0.1", "debug": "^2.2.0", "es5-ext": "^0.10.63", "typedarray-to-buffer": "^3.1.5", "utf-8-validate": "^5.0.2", "yaeti": "^0.0.6" } }, "sha512-/REy6amwPZl44DDzvRCkaI1q1bIiQB0mEFQLUrhz3z2EK91cp3n72rAjUlrTP0zV22HJIUOVHQGPxhFRjxjt+Q=="], + "whatwg-fetch": ["whatwg-fetch@3.6.20", "", {}, "sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg=="], + "whatwg-mimetype": ["whatwg-mimetype@5.0.0", "", {}, "sha512-sXcNcHOC51uPGF0P/D4NVtrkjSU2fNsm9iog4ZvZJsL3rjoDAzXZhkm2MWt1y+PUdggKAYVoMAIYcs78wJ51Cw=="], "whatwg-url": ["whatwg-url@16.0.1", "", { "dependencies": { "@exodus/bytes": "^1.11.0", "tr46": "^6.0.0", "webidl-conversions": "^8.0.1" } }, "sha512-1to4zXBxmXHV3IiSSEInrreIlu02vUOvrhxJJH5vcxYTBDAx51cqZiKdyTxlecdKNSjj8EcxGBxNf6Vg+945gw=="], - "which": ["which@6.0.1", "", { "dependencies": { "isexe": "^4.0.0" }, "bin": { "node-which": "bin/which.js" } }, "sha512-oGLe46MIrCRqX7ytPUf66EAYvdeMIZYn3WaocqqKZAxrBpkqHfL/qvTyJ/bTk5+AqHCjXmrv3CEWgy368zhRUg=="], + "which": ["which@1.3.1", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "which": "./bin/which" } }, "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ=="], "which-module": ["which-module@2.0.1", "", {}, "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ=="], @@ -2139,8 +2517,14 @@ "ws": ["ws@8.19.0", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg=="], + "xhr": ["xhr@2.6.0", "", { "dependencies": { "global": "~4.4.0", "is-function": "^1.0.1", "parse-headers": "^2.0.0", "xtend": "^4.0.0" } }, "sha512-/eCGLb5rxjx5e3mF1A7s+pLlR6CGyqWN91fv1JgER5mVWg1MZmlhBvy9kjcsOdRk8RrIujotWyJamfyrp+WIcA=="], + "xml-name-validator": ["xml-name-validator@5.0.0", "", {}, "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg=="], + "xml-parse-from-string": ["xml-parse-from-string@1.0.1", "", {}, "sha512-ErcKwJTF54uRzzNMXq2X5sMIy88zJvfN2DmdoQvy7PAFJ+tPRU6ydWuOKNMyfmOjdyBQTFREi60s0Y0SyI0G0g=="], + + "xml2js": ["xml2js@0.5.0", "", { "dependencies": { "sax": ">=0.6.0", "xmlbuilder": "~11.0.0" } }, "sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA=="], + "xmlbuilder": ["xmlbuilder@10.1.1", "", {}, "sha512-OyzrcFLL/nb6fMGHbiRDuPup9ljBycsdCypwuyg5AAHvyWzGfChJpCXMG88AGTIMFhGZ9RccFN1e6lhg3hkwKg=="], "xmlchars": ["xmlchars@2.2.0", "", {}, "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw=="], @@ -2163,13 +2547,23 @@ "yoctocolors": ["yoctocolors@2.1.2", "", {}, "sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug=="], + "youtube-dl-exec": ["youtube-dl-exec@3.1.7", "", { "dependencies": { "binary-version-check": "~6.1.0", "dargs": "~7.0.0", "debug-logfmt": "~1.4.0", "is-unix": "~2.0.10", "tinyspawn": "~1.5.0" } }, "sha512-NlbHVcnoj1qmnHe2OFAh7zsZT4+pC2RdvWLiGgHWI9Jef+EIFzG3uUh32G745l3arxAnGsVEKyODEJClTwf5Kw=="], + "zod": ["zod@4.3.6", "", {}, "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg=="], "zod-to-json-schema": ["zod-to-json-schema@3.25.1", "", { "peerDependencies": { "zod": "^3.25 || ^4" } }, "sha512-pM/SU9d3YAggzi6MtR4h7ruuQlqKtad8e9S0fmxcMi+ueAK5Korys/aWcV9LIIHTVbj01NdzxcnXSN+O74ZIVA=="], + "@ai-sdk/anthropic/@ai-sdk/provider": ["@ai-sdk/provider@3.0.8", "", { "dependencies": { "json-schema": "^0.4.0" } }, "sha512-oGMAgGoQdBXbZqNG0Ze56CHjDZ1IDYOwGYxYjO5KLSlz5HiNQ9udIXsPZ61VWaHGZ5XW/jyjmr6t2xz2jGVwbQ=="], + + "@ai-sdk/anthropic/@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@4.0.19", "", { "dependencies": { "@ai-sdk/provider": "3.0.8", "@standard-schema/spec": "^1.1.0", "eventsource-parser": "^3.0.6" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-3eG55CrSWCu2SXlqq2QCsFjo3+E7+Gmg7i/oRVoSZzIodTuDSfLb3MRje67xE9RFea73Zao7Lm4mADIfUETKGg=="], + + "@ai-sdk/google/@ai-sdk/provider": ["@ai-sdk/provider@3.0.8", "", { "dependencies": { "json-schema": "^0.4.0" } }, "sha512-oGMAgGoQdBXbZqNG0Ze56CHjDZ1IDYOwGYxYjO5KLSlz5HiNQ9udIXsPZ61VWaHGZ5XW/jyjmr6t2xz2jGVwbQ=="], + "@ai-sdk/google/@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@4.0.21", "", { "dependencies": { "@ai-sdk/provider": "3.0.8", "@standard-schema/spec": "^1.1.0", "eventsource-parser": "^3.0.6" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-MtFUYI1/8mgDvRmaBDjbLJPFFrMG777AvSgyIFQtZHIMzm88R/12vYBBpnk7pfiWLFE1DSZzY4WDYzGbKAcmiw=="], - "@ai-sdk/provider-utils/eventsource-parser": ["eventsource-parser@3.0.6", "", {}, "sha512-Vo1ab+QXPzZ4tCa8SwIHJFaSzy4R6SHf7BY79rFBDf0idraZWAkYrDjDj8uWaSm3S2TK+hJ7/t1CEmZ7jXw+pg=="], + "@ai-sdk/openai/@ai-sdk/provider": ["@ai-sdk/provider@3.0.8", "", { "dependencies": { "json-schema": "^0.4.0" } }, "sha512-oGMAgGoQdBXbZqNG0Ze56CHjDZ1IDYOwGYxYjO5KLSlz5HiNQ9udIXsPZ61VWaHGZ5XW/jyjmr6t2xz2jGVwbQ=="], + + "@ai-sdk/openai/@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@4.0.19", "", { "dependencies": { "@ai-sdk/provider": "3.0.8", "@standard-schema/spec": "^1.1.0", "eventsource-parser": "^3.0.6" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-3eG55CrSWCu2SXlqq2QCsFjo3+E7+Gmg7i/oRVoSZzIodTuDSfLb3MRje67xE9RFea73Zao7Lm4mADIfUETKGg=="], "@ai-sdk/react/@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@2.2.8", "", { "dependencies": { "@ai-sdk/provider": "1.1.3", "nanoid": "^3.3.8", "secure-json-parse": "^2.7.0" }, "peerDependencies": { "zod": "^3.23.8" } }, "sha512-fqhG+4sCVv8x7nFzYnFo19ryhAa3w096Kmc3hWxMQfW/TubPOmt3A6tYZhl4mUfQWWQMsuSkLrtjlWuXBVSGQA=="], @@ -2247,11 +2641,21 @@ "@capacitor/core/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], - "@elizaos/agent/@elizaos/plugin-ollama": ["@elizaos/plugin-ollama@2.0.0-alpha.70", "", { "dependencies": { "@ai-sdk/ui-utils": "^1.2.8", "@elizaos/core": "alpha", "ai": "^4.3.9", "js-tiktoken": "^1.0.18", "ollama-ai-provider": "^1.2.0" } }, "sha512-NlNaQTiEUs7KDKazqozmwbUGVHHs6vCocwXvU7RhyeRtgd49rYb5R0d/oLmMCKjTIld/jGmMjY9/qIHRqFk9wA=="], + "@discordjs/builders/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], - "@elizaos/agent/zod": ["zod@4.4.3", "", {}, "sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ=="], + "@discordjs/rest/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "@discordjs/rest/undici": ["undici@6.24.1", "", {}, "sha512-sC+b0tB1whOCzbtlx20fx3WgCXwkW627p4EA9uM+/tNNPkSS+eSEld6pAs9nDv7WbY1UUljBMYPtu9BCOrCWKA=="], + + "@discordjs/voice/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "@discordjs/ws/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "@elizaos/agent/@elizaos/plugin-elizacloud": ["@elizaos/plugin-elizacloud@2.0.0-beta.1", "", { "dependencies": { "@ai-sdk/openai": "^3.0.9", "@elizaos/cloud-sdk": "2.0.0-beta.1", "@elizaos/core": "2.0.0-beta.1", "ai": "^6.0.30", "jose": "^6.2.2", "js-tiktoken": "^1.0.21", "undici": "8.2.0", "viem": "^2.48.8" }, "peerDependencies": { "zod": "^4.4.3" } }, "sha512-RD7CL+N/4+x1CmDRKLJuGNG/m4ABZGWJw3+v4fm2gZIzZTACCq87Igro/hi935QVY5uRhMwN3zR9hZlS+ddd3Q=="], + + "@elizaos/agent/@elizaos/plugin-sql": ["@elizaos/plugin-sql@2.0.0-beta.1", "", { "dependencies": { "@electric-sql/pglite": "^0.4.0", "@neondatabase/serverless": "^1.1.0", "drizzle-orm": "0.45.2", "pg": "^8.16.3", "uuid": "^14.0.0", "ws": "^8.18.3" }, "peerDependencies": { "@elizaos/core": "2.0.0-beta.1" } }, "sha512-1IWyanD7IGljBSkbAidstQSaGMHkAteh+uLS4J+HnCeuphS7LQkVyCJ+ZQuoPb9uUL7v8zyNXfEMQPE3pfDJNw=="], - "@elizaos/autonomous/@elizaos/plugin-agent-orchestrator": ["@elizaos/plugin-agent-orchestrator@0.3.15", "", { "dependencies": { "coding-agent-adapters": "0.12.0", "pty-console": "0.3.1" }, "peerDependencies": { "@elizaos/core": ">=2.0.0-alpha.0", "git-workspace-service": "0.4.4", "pty-manager": "1.10.0" } }, "sha512-22aoptlKrNhApQKa9+aZvZ/CTLOaYM1tIMCp+dt/ploI2J8JyRo9r80SGIEGq9iayBjlMXzh4MNHjryH+agXEQ=="], + "@elizaos/agent/zod": ["zod@4.4.3", "", {}, "sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ=="], "@elizaos/autonomous/@elizaos/plugin-agent-skills": ["@elizaos/plugin-agent-skills@2.0.0-alpha.70", "", { "dependencies": { "@elizaos/core": "alpha", "fflate": "^0.8.2" } }, "sha512-VIGpQY2YMeqeH7llCr0YTOrUlVZjOEogg/Ur6v2HAIUgIYt0X9C82vDxcW9ff8F87/epcGqK//6ODXAF248Dhw=="], @@ -2269,6 +2673,8 @@ "@elizaos/autonomous/@elizaos/plugin-sql": ["@elizaos/plugin-sql@2.0.0-alpha.17", "", { "dependencies": { "@electric-sql/pglite": "^0.3.3", "@elizaos/core": "alpha", "@neondatabase/serverless": "^1.0.2", "dotenv": "^17.2.3", "drizzle-kit": "^0.31.8", "drizzle-orm": "^0.45.1", "pg": "^8.16.3", "uuid": "^13.0.0" } }, "sha512-O3I7ZX73DFMMCXWtjITi4QBYdo/01MI0neNBfqf6kbCBsE6j1r3ejZDoPBbRi/Ticsj3jlCc9nuwiOnKgWt+mQ=="], + "@elizaos/autonomous/@noble/curves": ["@noble/curves@2.0.1", "", { "dependencies": { "@noble/hashes": "2.0.1" } }, "sha512-vs1Az2OOTBiP4q0pwjW5aF0xp9n4MxVrmkFBxc6EKZc6ddYx5gaZiAsZoq0uRRXWbi3AT/sBqn05eRPtn1JCPw=="], + "@elizaos/autonomous/coding-agent-adapters": ["coding-agent-adapters@0.12.0", "", { "peerDependencies": { "agent-adapter-monitor": "^0.3.0", "pty-manager": "^1.9.5" }, "optionalPeers": ["agent-adapter-monitor"] }, "sha512-PrhVgOThCkmQNidwE9Qvab4AqyZ1hDhwEVHD9UdEEtl7bW7RR/vaGBergj6aUJsCIQQdaKyC3Blfm3UWfhnf2Q=="], "@elizaos/autonomous/drizzle-orm": ["drizzle-orm@0.45.1", "", { "peerDependencies": { "@aws-sdk/client-rds-data": ">=3", "@cloudflare/workers-types": ">=4", "@electric-sql/pglite": ">=0.2.0", "@libsql/client": ">=0.10.0", "@libsql/client-wasm": ">=0.10.0", "@neondatabase/serverless": ">=0.10.0", "@op-engineering/op-sqlite": ">=2", "@opentelemetry/api": "^1.4.1", "@planetscale/database": ">=1.13", "@prisma/client": "*", "@tidbcloud/serverless": "*", "@types/better-sqlite3": "*", "@types/pg": "*", "@types/sql.js": "*", "@upstash/redis": ">=1.34.7", "@vercel/postgres": ">=0.8.0", "@xata.io/client": "*", "better-sqlite3": ">=7", "bun-types": "*", "expo-sqlite": ">=14.0.0", "gel": ">=2", "knex": "*", "kysely": "*", "mysql2": ">=2", "pg": ">=8", "postgres": ">=3", "sql.js": ">=1", "sqlite3": ">=5" }, "optionalPeers": ["@aws-sdk/client-rds-data", "@cloudflare/workers-types", "@electric-sql/pglite", "@libsql/client", "@libsql/client-wasm", "@neondatabase/serverless", "@op-engineering/op-sqlite", "@opentelemetry/api", "@planetscale/database", "@prisma/client", "@tidbcloud/serverless", "@types/better-sqlite3", "@types/pg", "@types/sql.js", "@upstash/redis", "@vercel/postgres", "@xata.io/client", "better-sqlite3", "bun-types", "expo-sqlite", "gel", "knex", "kysely", "mysql2", "pg", "postgres", "sql.js", "sqlite3"] }, "sha512-Te0FOdKIistGNPMq2jscdqngBRfBpC8uMFVwqjf6gtTVJHIQ/dosgV/CLBU2N4ZJBsXL5savCba9b0YJskKdcA=="], @@ -2279,25 +2685,39 @@ "@elizaos/core/zod": ["zod@4.4.3", "", {}, "sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ=="], + "@elizaos/plugin-agent-orchestrator/coding-agent-adapters": ["coding-agent-adapters@0.12.0", "", { "peerDependencies": { "agent-adapter-monitor": "^0.3.0", "pty-manager": "^1.9.5" }, "optionalPeers": ["agent-adapter-monitor"] }, "sha512-PrhVgOThCkmQNidwE9Qvab4AqyZ1hDhwEVHD9UdEEtl7bW7RR/vaGBergj6aUJsCIQQdaKyC3Blfm3UWfhnf2Q=="], + + "@elizaos/plugin-agent-orchestrator/git-workspace-service": ["git-workspace-service@0.4.4", "", { "dependencies": { "@octokit/auth-app": "^6.0.0", "@octokit/rest": "^20.0.0" } }, "sha512-pDmjqcPYF/wO6hz2P7lm+T+eZz3v4pM9Mxi0lPlU06JiEeh1kTdfxpp6zEz7aMXvf5M6IMJEOVVOO2lfBnrkmg=="], + + "@elizaos/plugin-agent-orchestrator/pty-manager": ["pty-manager@1.9.8", "", { "dependencies": { "node-pty": "^1.0.0" }, "bin": { "pty-worker": "dist/pty-worker.js" } }, "sha512-FoliQUAqdWPqOZIckzafISwS9Fom/cPcxTIeyXA86ypyCW2lRIqs1UVOTvCnOnSWCRbAtLj3JmcPSZ0pH/dpig=="], + "@elizaos/plugin-cli/commander": ["commander@12.1.0", "", {}, "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA=="], "@elizaos/plugin-coding-agent/coding-agent-adapters": ["coding-agent-adapters@0.8.0", "", { "peerDependencies": { "agent-adapter-monitor": "^0.3.0", "pty-manager": "^1.9.0" }, "optionalPeers": ["agent-adapter-monitor"] }, "sha512-u55gCgTzRCsfYAzI2XobqrQtIIgLDJJUT6ffABwlv48Ta/oBE5lZA2xAbTUMCEB4p7zy/vYBYkLpRSwSLbcx2w=="], "@elizaos/plugin-coding-agent/pty-console": ["pty-console@0.3.0", "", { "dependencies": { "pty-manager": "^1.9.0" } }, "sha512-IEizJ4F8LjQJLimLT7aHRFzWTU19Bjv2/3h6Ols+Zn9iU23iQmF1lIGaDuwWmlZ0ADUOPUkGiWwOh+7MFM074g=="], + "@elizaos/plugin-coding-tools/zod": ["zod@4.4.3", "", {}, "sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ=="], + "@elizaos/plugin-cron/uuid": ["uuid@11.0.5", "", { "bin": { "uuid": "dist/esm/bin/uuid" } }, "sha512-508e6IcKLrhxKdBbcA2b4KQZlLVp2+J5UwQ6F7Drckkc5N9ZJwFa4TgWtsww9UG8fGHbm6gbV19TdM5pQ4GaIA=="], + "@elizaos/plugin-discord/zod": ["zod@4.4.3", "", {}, "sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ=="], + "@elizaos/plugin-experience/uuid": ["uuid@13.0.0", "", { "bin": { "uuid": "dist-node/bin/uuid" } }, "sha512-XQegIaBTVUjSHliKqcnFqYypAd4S+WCYt5NIeRs6w/UAry7z8Y9j5ZwRRL4kzq9U3sD6v+85er9FvkEaBpji2w=="], + "@elizaos/plugin-imessage/zod": ["zod@4.4.3", "", {}, "sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ=="], + "@elizaos/plugin-knowledge/@openrouter/ai-sdk-provider": ["@openrouter/ai-sdk-provider@1.5.4", "", { "dependencies": { "@openrouter/sdk": "^0.1.27" }, "peerDependencies": { "ai": "^5.0.0", "zod": "^3.24.1 || ^v4" } }, "sha512-xrSQPUIH8n9zuyYZR0XK7Ba0h2KsjJcMkxnwaYfmv13pKs3sDkjPzVPPhlhzqBGddHb5cFEwJ9VFuFeDcxCDSw=="], - "@elizaos/plugin-ollama/ai": ["ai@6.0.177", "", { "dependencies": { "@ai-sdk/gateway": "3.0.112", "@ai-sdk/provider": "3.0.10", "@ai-sdk/provider-utils": "4.0.27", "@opentelemetry/api": "1.9.0" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-1xQtbeWwNcLyyM86ixZhkKvT+WRXc1lvarIKqPVtsyn8F9NDikwUMBqYu+aQKDgMht50SMXh4qboYuU8MeHZZA=="], + "@elizaos/plugin-knowledge/ai": ["ai@6.0.116", "", { "dependencies": { "@ai-sdk/gateway": "3.0.66", "@ai-sdk/provider": "3.0.8", "@ai-sdk/provider-utils": "4.0.19", "@opentelemetry/api": "1.9.0" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-7yM+cTmyRLeNIXwt4Vj+mrrJgVQ9RMIW5WO0ydoLoYkewIvsMcvUmqS4j2RJTUXaF1HphwmSKUMQ/HypNRGOmA=="], + + "@elizaos/plugin-local-embedding/zod": ["zod@4.4.3", "", {}, "sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ=="], "@elizaos/plugin-personality/zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="], "@elizaos/plugin-rolodex/whatwg-url": ["whatwg-url@7.1.0", "", { "dependencies": { "lodash.sortby": "^4.7.0", "tr46": "^1.0.1", "webidl-conversions": "^4.0.2" } }, "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg=="], - "@elizaos/plugin-telegram/typescript": ["typescript@6.0.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw=="], + "@elizaos/plugin-signal/zod": ["zod@4.4.3", "", {}, "sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ=="], "@elizaos/plugin-todo/drizzle-orm": ["drizzle-orm@0.30.10", "", { "peerDependencies": { "@aws-sdk/client-rds-data": ">=3", "@cloudflare/workers-types": ">=3", "@electric-sql/pglite": ">=0.1.1", "@libsql/client": "*", "@neondatabase/serverless": ">=0.1", "@op-engineering/op-sqlite": ">=2", "@opentelemetry/api": "^1.4.1", "@planetscale/database": ">=1", "@types/better-sqlite3": "*", "@types/pg": "*", "@types/react": ">=18", "@types/sql.js": "*", "@vercel/postgres": ">=0.8.0", "@xata.io/client": "*", "better-sqlite3": ">=7", "bun-types": "*", "expo-sqlite": ">=13.2.0", "knex": "*", "kysely": "*", "mysql2": ">=2", "pg": ">=8", "postgres": ">=3", "react": ">=18", "sql.js": ">=1", "sqlite3": ">=5" }, "optionalPeers": ["@aws-sdk/client-rds-data", "@cloudflare/workers-types", "@electric-sql/pglite", "@libsql/client", "@neondatabase/serverless", "@op-engineering/op-sqlite", "@opentelemetry/api", "@planetscale/database", "@types/better-sqlite3", "@types/pg", "@types/react", "@types/sql.js", "@vercel/postgres", "@xata.io/client", "better-sqlite3", "bun-types", "expo-sqlite", "knex", "kysely", "mysql2", "pg", "postgres", "react", "sql.js", "sqlite3"] }, "sha512-IRy/QmMWw9lAQHpwbUh1b8fcn27S/a9zMIzqea1WNOxK9/4EB8gIo+FZWLiPXzl2n9ixGSv8BhsLZiOppWEwBw=="], @@ -2309,10 +2729,22 @@ "@elizaos/shared/zod": ["zod@4.4.3", "", {}, "sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ=="], + "@emnapi/core/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + "@emnapi/runtime/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + "@emnapi/wasi-threads/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + "@esbuild-kit/core-utils/esbuild": ["esbuild@0.18.20", "", { "optionalDependencies": { "@esbuild/android-arm": "0.18.20", "@esbuild/android-arm64": "0.18.20", "@esbuild/android-x64": "0.18.20", "@esbuild/darwin-arm64": "0.18.20", "@esbuild/darwin-x64": "0.18.20", "@esbuild/freebsd-arm64": "0.18.20", "@esbuild/freebsd-x64": "0.18.20", "@esbuild/linux-arm": "0.18.20", "@esbuild/linux-arm64": "0.18.20", "@esbuild/linux-ia32": "0.18.20", "@esbuild/linux-loong64": "0.18.20", "@esbuild/linux-mips64el": "0.18.20", "@esbuild/linux-ppc64": "0.18.20", "@esbuild/linux-riscv64": "0.18.20", "@esbuild/linux-s390x": "0.18.20", "@esbuild/linux-x64": "0.18.20", "@esbuild/netbsd-x64": "0.18.20", "@esbuild/openbsd-x64": "0.18.20", "@esbuild/sunos-x64": "0.18.20", "@esbuild/win32-arm64": "0.18.20", "@esbuild/win32-ia32": "0.18.20", "@esbuild/win32-x64": "0.18.20" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA=="], + "@fal-ai/client/eventsource-parser": ["eventsource-parser@1.1.2", "", {}, "sha512-v0eOBUbiaFojBu2s2NPBfYUoRR9GjcDNvCXVaqEf5vVfpIAh9f8RCo4vXTP8c63QRKCFwoLpMpTdPwwhEKVgzA=="], + + "@jimp/core/buffer": ["buffer@5.7.1", "", { "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.1.13" } }, "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ=="], + + "@jimp/core/file-type": ["file-type@16.5.4", "", { "dependencies": { "readable-web-to-node-stream": "^3.0.0", "strtok3": "^6.2.4", "token-types": "^4.1.1" } }, "sha512-/yFHK0aGjFEgDJjEKP0pWCplsPFPhwyfwevf/pVxiN0tmE4L9LmwWxWukdJSHdoCli4VgQLehjJtwQBnqmsKcw=="], + + "@jimp/png/pngjs": ["pngjs@6.0.0", "", {}, "sha512-TRzzuFRRmEoSW/p1KVAmiOgPco2Irlah+bGFCeNfJXxxYGwSw7YwAOAcd7X28K/m5bjBWKsC29KyoMfHbypayg=="], + "@mariozechner/pi-ai/@anthropic-ai/sdk": ["@anthropic-ai/sdk@0.73.0", "", { "dependencies": { "json-schema-to-ts": "^3.1.1" }, "peerDependencies": { "zod": "^3.25.0 || ^4.0.0" }, "optionalPeers": ["zod"], "bin": { "anthropic-ai-sdk": "bin/cli" } }, "sha512-URURVzhxXGJDGUGFunIOtBlSl7KWvZiAAKY/ttTkZAkXT9bTPqdk2eK0b8qqSxXpikh3QKPnPYpiyX98zf5ebw=="], "@mariozechner/pi-ai/undici": ["undici@7.24.5", "", {}, "sha512-3IWdCpjgxp15CbJnsi/Y9TCDE7HWVN19j1hmzVhoAkY/+CJx449tVxT5wZc1Gwg8J+P0LWvzlBzxYRnHJ+1i7Q=="], @@ -2321,7 +2753,7 @@ "@modelcontextprotocol/sdk/eventsource-parser": ["eventsource-parser@3.0.6", "", {}, "sha512-Vo1ab+QXPzZ4tCa8SwIHJFaSzy4R6SHf7BY79rFBDf0idraZWAkYrDjDj8uWaSm3S2TK+hJ7/t1CEmZ7jXw+pg=="], - "@noble/curves/@noble/hashes": ["@noble/hashes@2.0.1", "", {}, "sha512-XlOlEbQcE9fmuXxrVTXCTlG2nlRXa9Rj3rr5Ue/+tX+nmkgbX720YHh0VR3hBF9xDvwnb8D2shVGOwNx+ulArw=="], + "@nut-tree-fork/node-mac-permissions/node-addon-api": ["node-addon-api@5.0.0", "", {}, "sha512-CvkDw2OEnme7ybCykJpVcKH+uAOLV2qLqiyla128dN9TkEWfrYmxG6C2boDe5KcNQqZF3orkqzGgOMvZ/JNekA=="], "@octokit/auth-app/lru-cache": ["@wolfy1339/lru-cache@11.0.2-patch.1", "", {}, "sha512-BgYZfL2ADCXKOw2wJtkM3slhHotawWkgIRRxq4wEybnZQPjvAp71SPX35xepMykTw8gXlzWcWPTY31hlbnRsDA=="], @@ -2427,30 +2859,48 @@ "@swc/helpers/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + "@tybys/wasm-util/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + "@whiskeysockets/baileys/@hapi/boom": ["@hapi/boom@9.1.4", "", { "dependencies": { "@hapi/hoek": "9.x.x" } }, "sha512-Ls1oH8jaN1vNsqcaHVYJrKmgMcKsC1wcp8bujvXrHaAqD2iDYq3HoOwsxwo09Cuda5R5nC0o0IxlrlTuvPuzSw=="], "@whiskeysockets/baileys/pino": ["pino@9.14.0", "", { "dependencies": { "@pinojs/redact": "^0.4.0", "atomic-sleep": "^1.0.0", "on-exit-leak-free": "^2.1.0", "pino-abstract-transport": "^2.0.0", "pino-std-serializers": "^7.0.0", "process-warning": "^5.0.0", "quick-format-unescaped": "^4.0.3", "real-require": "^0.2.0", "safe-stable-stringify": "^2.3.1", "sonic-boom": "^4.0.1", "thread-stream": "^3.0.0" }, "bin": { "pino": "bin.js" } }, "sha512-8OEwKp5juEvb/MjpIc4hjqfgCNysrS94RIOMXYvpYCdm/jglrKEiAYmiumbmGhCvs+IcInsphYDFwqrjr7398w=="], - "accepts/mime-types": ["mime-types@3.0.2", "", { "dependencies": { "mime-db": "^1.54.0" } }, "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A=="], - "ast-types/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], "async-mutex/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + "binary-version/execa": ["execa@8.0.1", "", { "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^8.0.1", "human-signals": "^5.0.0", "is-stream": "^3.0.0", "merge-stream": "^2.0.0", "npm-run-path": "^5.1.0", "onetime": "^6.0.0", "signal-exit": "^4.1.0", "strip-final-newline": "^3.0.0" } }, "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg=="], + "body-parser/type-is": ["type-is@2.0.1", "", { "dependencies": { "content-type": "^1.0.5", "media-typer": "^1.1.0", "mime-types": "^3.0.0" } }, "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw=="], "chromium-bidi/zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="], + "clipboardy/execa": ["execa@1.0.0", "", { "dependencies": { "cross-spawn": "^6.0.0", "get-stream": "^4.0.0", "is-stream": "^1.1.0", "npm-run-path": "^2.0.0", "p-finally": "^1.0.0", "signal-exit": "^3.0.0", "strip-eof": "^1.0.0" } }, "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA=="], + "cliui/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + "cmake-js/which": ["which@6.0.1", "", { "dependencies": { "isexe": "^4.0.0" }, "bin": { "node-which": "bin/which.js" } }, "sha512-oGLe46MIrCRqX7ytPUf66EAYvdeMIZYn3WaocqqKZAxrBpkqHfL/qvTyJ/bTk5+AqHCjXmrv3CEWgy368zhRUg=="], + "cmake-js/yargs": ["yargs@17.7.2", "", { "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.3", "y18n": "^5.0.5", "yargs-parser": "^21.1.1" } }, "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w=="], "coding-agent-adapters/pino": ["pino@9.14.0", "", { "dependencies": { "@pinojs/redact": "^0.4.0", "atomic-sleep": "^1.0.0", "on-exit-leak-free": "^2.1.0", "pino-abstract-transport": "^2.0.0", "pino-std-serializers": "^7.0.0", "process-warning": "^5.0.0", "quick-format-unescaped": "^4.0.3", "real-require": "^0.2.0", "safe-stable-stringify": "^2.3.1", "sonic-boom": "^4.0.1", "thread-stream": "^3.0.0" }, "bin": { "pino": "bin.js" } }, "sha512-8OEwKp5juEvb/MjpIc4hjqfgCNysrS94RIOMXYvpYCdm/jglrKEiAYmiumbmGhCvs+IcInsphYDFwqrjr7398w=="], "cross-spawn/which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="], + "debug-logfmt/pretty-ms": ["pretty-ms@7.0.1", "", { "dependencies": { "parse-ms": "^2.1.0" } }, "sha512-973driJZvxiGOQ5ONsFhOF/DtzPMOMtgC11kCpUrPGMTgqp2q/1gwzCquocrN33is0VZ5GFHXZYMM9l6h67v2Q=="], + + "discord.js/@discordjs/collection": ["@discordjs/collection@1.5.3", "", {}, "sha512-SVb428OMd3WO1paV3rm6tSjM4wC+Kecaa1EUGX7vc6/fddvw/6lg90z4QtCqm21zvVe92vMMDt9+DkIvjXImQQ=="], + + "discord.js/@sapphire/snowflake": ["@sapphire/snowflake@3.5.3", "", {}, "sha512-jjmJywLAFoWeBi1W7994zZyiNWPIiqRRNAmSERxyg93xRGzNYvGjlZ0gR6x0F4gPRi2+0O6S71kOZYyr3cxaIQ=="], + + "discord.js/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "discord.js/undici": ["undici@6.24.1", "", {}, "sha512-sC+b0tB1whOCzbtlx20fx3WgCXwkW627p4EA9uM+/tNNPkSS+eSEld6pAs9nDv7WbY1UUljBMYPtu9BCOrCWKA=="], + "dom-serializer/entities": ["entities@2.2.0", "", {}, "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A=="], + "drizzle-kit/esbuild": ["esbuild@0.25.12", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.25.12", "@esbuild/android-arm": "0.25.12", "@esbuild/android-arm64": "0.25.12", "@esbuild/android-x64": "0.25.12", "@esbuild/darwin-arm64": "0.25.12", "@esbuild/darwin-x64": "0.25.12", "@esbuild/freebsd-arm64": "0.25.12", "@esbuild/freebsd-x64": "0.25.12", "@esbuild/linux-arm": "0.25.12", "@esbuild/linux-arm64": "0.25.12", "@esbuild/linux-ia32": "0.25.12", "@esbuild/linux-loong64": "0.25.12", "@esbuild/linux-mips64el": "0.25.12", "@esbuild/linux-ppc64": "0.25.12", "@esbuild/linux-riscv64": "0.25.12", "@esbuild/linux-s390x": "0.25.12", "@esbuild/linux-x64": "0.25.12", "@esbuild/netbsd-arm64": "0.25.12", "@esbuild/netbsd-x64": "0.25.12", "@esbuild/openbsd-arm64": "0.25.12", "@esbuild/openbsd-x64": "0.25.12", "@esbuild/openharmony-arm64": "0.25.12", "@esbuild/sunos-x64": "0.25.12", "@esbuild/win32-arm64": "0.25.12", "@esbuild/win32-ia32": "0.25.12", "@esbuild/win32-x64": "0.25.12" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg=="], + "ethers/@noble/curves": ["@noble/curves@1.2.0", "", { "dependencies": { "@noble/hashes": "1.3.2" } }, "sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw=="], "ethers/@noble/hashes": ["@noble/hashes@1.3.2", "", {}, "sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ=="], @@ -2463,16 +2913,24 @@ "execa/get-stream": ["get-stream@6.0.1", "", {}, "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg=="], - "express/mime-types": ["mime-types@3.0.2", "", { "dependencies": { "mime-db": "^1.54.0" } }, "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A=="], - "express/type-is": ["type-is@2.0.1", "", { "dependencies": { "content-type": "^1.0.5", "media-typer": "^1.1.0", "mime-types": "^3.0.0" } }, "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw=="], + "form-data/mime-types": ["mime-types@2.1.35", "", { "dependencies": { "mime-db": "1.52.0" } }, "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw=="], + + "gaxios/https-proxy-agent": ["https-proxy-agent@7.0.6", "", { "dependencies": { "agent-base": "^7.1.2", "debug": "4" } }, "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw=="], + "gaxios/node-fetch": ["node-fetch@3.3.2", "", { "dependencies": { "data-uri-to-buffer": "^4.0.0", "fetch-blob": "^3.1.4", "formdata-polyfill": "^4.0.10" } }, "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA=="], "git-workspace-service/pino": ["pino@9.14.0", "", { "dependencies": { "@pinojs/redact": "^0.4.0", "atomic-sleep": "^1.0.0", "on-exit-leak-free": "^2.1.0", "pino-abstract-transport": "^2.0.0", "pino-std-serializers": "^7.0.0", "process-warning": "^5.0.0", "quick-format-unescaped": "^4.0.3", "real-require": "^0.2.0", "safe-stable-stringify": "^2.3.1", "sonic-boom": "^4.0.1", "thread-stream": "^3.0.0" }, "bin": { "pino": "bin.js" } }, "sha512-8OEwKp5juEvb/MjpIc4hjqfgCNysrS94RIOMXYvpYCdm/jglrKEiAYmiumbmGhCvs+IcInsphYDFwqrjr7398w=="], "htmlparser2/entities": ["entities@2.2.0", "", {}, "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A=="], + "http-response-object/@types/node": ["@types/node@10.17.60", "", {}, "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw=="], + + "https-proxy-agent/agent-base": ["agent-base@6.0.2", "", { "dependencies": { "debug": "4" } }, "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ=="], + + "image-q/@types/node": ["@types/node@16.9.1", "", {}, "sha512-QpLcX9ZSsq3YYUUnD3nFDY8H7wctAhQj/TFKL8Ya8v5fMm3CFXxo8zStsLAl780ltoYoo1WvKUVGBQK+1ifr7g=="], + "ipull/commander": ["commander@10.0.1", "", {}, "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug=="], "ipull/lifecycle-utils": ["lifecycle-utils@2.1.0", "", {}, "sha512-AnrXnE2/OF9PHCyFg0RSqsnQTzV991XaZA/buhFDoc58xU7rhSCDgCz/09Lqpsn4MpoPHt7TRAXV1kWZypFVsA=="], @@ -2483,6 +2941,8 @@ "jayson/@types/node": ["@types/node@12.20.55", "", {}, "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ=="], + "jayson/@types/ws": ["@types/ws@7.4.7", "", { "dependencies": { "@types/node": "*" } }, "sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww=="], + "jayson/commander": ["commander@2.20.3", "", {}, "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="], "jayson/uuid": ["uuid@8.3.2", "", { "bin": { "uuid": "dist/bin/uuid" } }, "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg=="], @@ -2499,8 +2959,12 @@ "libsignal/protobufjs": ["protobufjs@6.8.8", "", { "dependencies": { "@protobufjs/aspromise": "^1.1.2", "@protobufjs/base64": "^1.1.2", "@protobufjs/codegen": "^2.0.4", "@protobufjs/eventemitter": "^1.1.0", "@protobufjs/fetch": "^1.1.0", "@protobufjs/float": "^1.0.2", "@protobufjs/inquire": "^1.1.0", "@protobufjs/path": "^1.1.2", "@protobufjs/pool": "^1.1.0", "@protobufjs/utf8": "^1.1.0", "@types/long": "^4.0.0", "@types/node": "^10.1.0", "long": "^4.0.0" }, "bin": { "pbjs": "bin/pbjs", "pbts": "bin/pbts" } }, "sha512-AAmHtD5pXgZfi7GMpllpO3q1Xw1OYldr+dMUlAnffGTAhqkg72WdmSY71uKBF/JuyiKs8psYbtKrhi0ASCD8qw=="], + "load-bmfont/mime": ["mime@1.6.0", "", { "bin": { "mime": "cli.js" } }, "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg=="], + "loose-envify/js-tokens": ["js-tokens@4.0.0", "", {}, "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="], + "make-asynchronous/type-fest": ["type-fest@4.41.0", "", {}, "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA=="], + "markdown-it/argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="], "music-metadata/file-type": ["file-type@21.3.3", "", { "dependencies": { "@tokenizer/inflate": "^0.4.1", "strtok3": "^10.3.4", "token-types": "^6.1.1", "uint8array-extras": "^1.4.0" } }, "sha512-pNwbwz8c3aZ+GvbJnIsCnDjKvgCZLHxkFWLEFxU3RMa+Ey++ZSEfisvsWQMcdys6PpxQjWUOIDi1fifXsW3YRg=="], @@ -2509,15 +2973,13 @@ "node-fetch/whatwg-url": ["whatwg-url@5.0.0", "", { "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" } }, "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw=="], + "node-llama-cpp/which": ["which@6.0.1", "", { "dependencies": { "isexe": "^4.0.0" }, "bin": { "node-which": "bin/which.js" } }, "sha512-oGLe46MIrCRqX7ytPUf66EAYvdeMIZYn3WaocqqKZAxrBpkqHfL/qvTyJ/bTk5+AqHCjXmrv3CEWgy368zhRUg=="], + "node-llama-cpp/yargs": ["yargs@17.7.2", "", { "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.3", "y18n": "^5.0.5", "yargs-parser": "^21.1.1" } }, "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w=="], "node-pty/node-addon-api": ["node-addon-api@7.1.1", "", {}, "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ=="], - "ollama-ai-provider/@ai-sdk/provider": ["@ai-sdk/provider@1.1.3", "", { "dependencies": { "json-schema": "^0.4.0" } }, "sha512-qZMxYJ0qqX/RfnuIaab+zp8UAeJn/ygXXAffR5I4N0n1IrvA6qBsjc8hXLmBiMV2zoXlifkacF7sEFnYnjBcqg=="], - - "ollama-ai-provider/@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@2.2.8", "", { "dependencies": { "@ai-sdk/provider": "1.1.3", "nanoid": "^3.3.8", "secure-json-parse": "^2.7.0" }, "peerDependencies": { "zod": "^3.23.8" } }, "sha512-fqhG+4sCVv8x7nFzYnFo19ryhAa3w096Kmc3hWxMQfW/TubPOmt3A6tYZhl4mUfQWWQMsuSkLrtjlWuXBVSGQA=="], - - "onnxruntime-web/onnxruntime-common": ["onnxruntime-common@1.22.0-dev.20250409-89f8206ba4", "", {}, "sha512-vDJMkfCfb0b1A836rgHj+ORuZf4B4+cc2bASQtpeoJLueuFc5DuYwjIZUBrSvx/fO5IrLjLz+oTrB3pcGlhovQ=="], + "onnxruntime-web/onnxruntime-common": ["onnxruntime-common@1.24.0-dev.20251116-b39e144322", "", {}, "sha512-BOoomdHYmNRL5r4iQ4bMvsl2t0/hzVQ3OM3PHD0gxeXu1PmggqBv3puZicEUVOA3AtHHYmqZtjMj9FOfGrATTw=="], "ora/cli-spinners": ["cli-spinners@3.4.0", "", {}, "sha512-bXfOC4QcT1tKXGorxL3wbJm6XJPDqEnij2gQ2m7ESQuE+/z9YFIWnl/5RpTiKWbMq3EVKR4fRLJGn6DVfu0mpw=="], @@ -2533,32 +2995,38 @@ "ox/eventemitter3": ["eventemitter3@5.0.1", "", {}, "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA=="], + "p-event/p-timeout": ["p-timeout@6.1.4", "", {}, "sha512-MyIV3ZA/PmyBN/ud8vV9XzwTrNtR4jFrObymZYnZqMmW0zA8Z17vnT0rBgFE/TlohB+YCHqXMgZzb3Csp49vqg=="], + "p-queue/p-timeout": ["p-timeout@7.0.1", "", {}, "sha512-AxTM2wDGORHGEkPCt8yqxOTMgpfbEHqF51f/5fJCmwFC3C/zNcGT63SymH2ttOAaiIws2zVg4+izQCjrakcwHg=="], + "pac-proxy-agent/https-proxy-agent": ["https-proxy-agent@7.0.6", "", { "dependencies": { "agent-base": "^7.1.2", "debug": "4" } }, "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw=="], + "parse5/entities": ["entities@8.0.0", "", {}, "sha512-zwfzJecQ/Uej6tusMqwAqU/6KL2XaB2VZ2Jg54Je6ahNBGNH6Ek6g3jjNCF0fG9EWQKGZNddNjU5F1ZQn/sBnA=="], + "pixelmatch/pngjs": ["pngjs@3.4.0", "", {}, "sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w=="], + "proper-lockfile/retry": ["retry@0.12.0", "", {}, "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow=="], + "proxy-agent/https-proxy-agent": ["https-proxy-agent@7.0.6", "", { "dependencies": { "agent-base": "^7.1.2", "debug": "4" } }, "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw=="], + "proxy-agent/lru-cache": ["lru-cache@7.18.3", "", {}, "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA=="], "pty-console/pty-manager": ["pty-manager@1.9.8", "", { "dependencies": { "node-pty": "^1.0.0" }, "bin": { "pty-worker": "dist/pty-worker.js" } }, "sha512-FoliQUAqdWPqOZIckzafISwS9Fom/cPcxTIeyXA86ypyCW2lRIqs1UVOTvCnOnSWCRbAtLj3JmcPSZ0pH/dpig=="], "qified/hookified": ["hookified@2.1.0", "", {}, "sha512-ootKng4eaxNxa7rx6FJv2YKef3DuhqbEj3l70oGXwddPQEEnISm50TEZQclqiLTAtilT2nu7TErtCO523hHkyg=="], + "readable-web-to-node-stream/readable-stream": ["readable-stream@4.7.0", "", { "dependencies": { "abort-controller": "^3.0.0", "buffer": "^6.0.3", "events": "^3.3.0", "process": "^0.11.10", "string_decoder": "^1.3.0" } }, "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg=="], + "restore-cursor/onetime": ["onetime@7.0.0", "", { "dependencies": { "mimic-function": "^5.0.0" } }, "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ=="], "restore-cursor/signal-exit": ["signal-exit@4.1.0", "", {}, "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw=="], "roarr/sprintf-js": ["sprintf-js@1.1.3", "", {}, "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA=="], - "rpc-websockets/@types/ws": ["@types/ws@8.18.1", "", { "dependencies": { "@types/node": "*" } }, "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg=="], - "rpc-websockets/utf-8-validate": ["utf-8-validate@6.0.6", "", { "dependencies": { "node-gyp-build": "^4.3.0" } }, "sha512-q3l3P9UtEEiAHcsgsqTgf9PPjctrDWoIXW3NpOHFdRDbLvu4DLIcxHangJ4RLrWkBcKjmcs/6NkerI8T/rE4LA=="], "rxjs/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], - "send/mime-types": ["mime-types@3.0.2", "", { "dependencies": { "mime-db": "^1.54.0" } }, "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A=="], - "start-server-and-test/bluebird": ["bluebird@3.7.2", "", {}, "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg=="], "stdout-update/string-width": ["string-width@7.2.0", "", { "dependencies": { "emoji-regex": "^10.3.0", "get-east-asian-width": "^1.0.0", "strip-ansi": "^7.1.0" } }, "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ=="], @@ -2577,6 +3045,10 @@ "type-is/media-typer": ["media-typer@0.3.0", "", {}, "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ=="], + "type-is/mime-types": ["mime-types@2.1.35", "", { "dependencies": { "mime-db": "1.52.0" } }, "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw=="], + + "utif2/pako": ["pako@1.0.11", "", {}, "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw=="], + "viem/@noble/curves": ["@noble/curves@1.9.1", "", { "dependencies": { "@noble/hashes": "1.8.0" } }, "sha512-k11yZxZg+t+gWvBbIswW0yoJlu8cHOC7dhunwOzoWH/mXGBiYyR4YY6hAEK/3EUs4UpB8la1RfdRpeGsFHkWsA=="], "viem/@noble/hashes": ["@noble/hashes@1.8.0", "", {}, "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A=="], @@ -2593,8 +3065,14 @@ "wrap-ansi/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + "xml2js/xmlbuilder": ["xmlbuilder@11.0.1", "", {}, "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA=="], + + "@ai-sdk/anthropic/@ai-sdk/provider-utils/eventsource-parser": ["eventsource-parser@3.0.6", "", {}, "sha512-Vo1ab+QXPzZ4tCa8SwIHJFaSzy4R6SHf7BY79rFBDf0idraZWAkYrDjDj8uWaSm3S2TK+hJ7/t1CEmZ7jXw+pg=="], + "@ai-sdk/google/@ai-sdk/provider-utils/eventsource-parser": ["eventsource-parser@3.0.6", "", {}, "sha512-Vo1ab+QXPzZ4tCa8SwIHJFaSzy4R6SHf7BY79rFBDf0idraZWAkYrDjDj8uWaSm3S2TK+hJ7/t1CEmZ7jXw+pg=="], + "@ai-sdk/openai/@ai-sdk/provider-utils/eventsource-parser": ["eventsource-parser@3.0.6", "", {}, "sha512-Vo1ab+QXPzZ4tCa8SwIHJFaSzy4R6SHf7BY79rFBDf0idraZWAkYrDjDj8uWaSm3S2TK+hJ7/t1CEmZ7jXw+pg=="], + "@ai-sdk/react/@ai-sdk/provider-utils/@ai-sdk/provider": ["@ai-sdk/provider@1.1.3", "", { "dependencies": { "json-schema": "^0.4.0" } }, "sha512-qZMxYJ0qqX/RfnuIaab+zp8UAeJn/ygXXAffR5I4N0n1IrvA6qBsjc8hXLmBiMV2zoXlifkacF7sEFnYnjBcqg=="], "@ai-sdk/react/@ai-sdk/provider-utils/nanoid": ["nanoid@3.3.11", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w=="], @@ -2605,18 +3083,26 @@ "@aws-crypto/util/@smithy/util-utf8/@smithy/util-buffer-from": ["@smithy/util-buffer-from@2.2.0", "", { "dependencies": { "@smithy/is-array-buffer": "^2.2.0", "tslib": "^2.6.2" } }, "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA=="], - "@elizaos/agent/@elizaos/plugin-ollama/ai": ["ai@4.3.19", "", { "dependencies": { "@ai-sdk/provider": "1.1.3", "@ai-sdk/provider-utils": "2.2.8", "@ai-sdk/react": "1.2.12", "@ai-sdk/ui-utils": "1.2.11", "@opentelemetry/api": "1.9.0", "jsondiffpatch": "0.6.0" }, "peerDependencies": { "react": "^18 || ^19 || ^19.0.0-rc", "zod": "^3.23.8" }, "optionalPeers": ["react"] }, "sha512-dIE2bfNpqHN3r6IINp9znguYdhIOheKW2LDigAMrgt/upT3B8eBGPSCblENvaZGoq+hxaN9fSMzjWpbqloP+7Q=="], + "@elizaos/autonomous/@elizaos/plugin-anthropic/ai": ["ai@6.0.116", "", { "dependencies": { "@ai-sdk/gateway": "3.0.66", "@ai-sdk/provider": "3.0.8", "@ai-sdk/provider-utils": "4.0.19", "@opentelemetry/api": "1.9.0" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-7yM+cTmyRLeNIXwt4Vj+mrrJgVQ9RMIW5WO0ydoLoYkewIvsMcvUmqS4j2RJTUXaF1HphwmSKUMQ/HypNRGOmA=="], "@elizaos/autonomous/@elizaos/plugin-anthropic/undici": ["undici@7.24.5", "", {}, "sha512-3IWdCpjgxp15CbJnsi/Y9TCDE7HWVN19j1hmzVhoAkY/+CJx449tVxT5wZc1Gwg8J+P0LWvzlBzxYRnHJ+1i7Q=="], + "@elizaos/autonomous/@elizaos/plugin-elizacloud/ai": ["ai@6.0.116", "", { "dependencies": { "@ai-sdk/gateway": "3.0.66", "@ai-sdk/provider": "3.0.8", "@ai-sdk/provider-utils": "4.0.19", "@opentelemetry/api": "1.9.0" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-7yM+cTmyRLeNIXwt4Vj+mrrJgVQ9RMIW5WO0ydoLoYkewIvsMcvUmqS4j2RJTUXaF1HphwmSKUMQ/HypNRGOmA=="], + "@elizaos/autonomous/@elizaos/plugin-elizacloud/undici": ["undici@7.24.5", "", {}, "sha512-3IWdCpjgxp15CbJnsi/Y9TCDE7HWVN19j1hmzVhoAkY/+CJx449tVxT5wZc1Gwg8J+P0LWvzlBzxYRnHJ+1i7Q=="], + "@elizaos/autonomous/@elizaos/plugin-local-embedding/@huggingface/transformers": ["@huggingface/transformers@3.8.1", "", { "dependencies": { "@huggingface/jinja": "^0.5.3", "onnxruntime-node": "1.21.0", "onnxruntime-web": "1.22.0-dev.20250409-89f8206ba4", "sharp": "^0.34.1" } }, "sha512-tsTk4zVjImqdqjS8/AOZg2yNLd1z9S5v+7oUPpXaasDRwEDhB+xnglK1k5cad26lL5/ZIaeREgWWy0bs9y9pPA=="], + + "@elizaos/autonomous/@elizaos/plugin-local-embedding/node-llama-cpp": ["node-llama-cpp@3.18.1", "", { "dependencies": { "@huggingface/jinja": "^0.5.6", "async-retry": "^1.3.3", "bytes": "^3.1.2", "chalk": "^5.6.2", "chmodrp": "^1.0.2", "cmake-js": "^8.0.0", "cross-spawn": "^7.0.6", "env-var": "^7.5.0", "filenamify": "^6.0.0", "fs-extra": "^11.3.4", "ignore": "^7.0.4", "ipull": "^3.9.5", "is-unicode-supported": "^2.1.0", "lifecycle-utils": "^3.1.1", "log-symbols": "^7.0.1", "nanoid": "^5.1.6", "node-addon-api": "^8.6.0", "ora": "^9.3.0", "pretty-ms": "^9.3.0", "proper-lockfile": "^4.1.2", "semver": "^7.7.1", "simple-git": "^3.33.0", "slice-ansi": "^8.0.0", "stdout-update": "^4.0.1", "strip-ansi": "^7.2.0", "validate-npm-package-name": "^7.0.2", "which": "^6.0.1", "yargs": "^17.7.2" }, "optionalDependencies": { "@node-llama-cpp/linux-arm64": "3.18.1", "@node-llama-cpp/linux-armv7l": "3.18.1", "@node-llama-cpp/linux-x64": "3.18.1", "@node-llama-cpp/linux-x64-cuda": "3.18.1", "@node-llama-cpp/linux-x64-cuda-ext": "3.18.1", "@node-llama-cpp/linux-x64-vulkan": "3.18.1", "@node-llama-cpp/mac-arm64-metal": "3.18.1", "@node-llama-cpp/mac-x64": "3.18.1", "@node-llama-cpp/win-arm64": "3.18.1", "@node-llama-cpp/win-x64": "3.18.1", "@node-llama-cpp/win-x64-cuda": "3.18.1", "@node-llama-cpp/win-x64-cuda-ext": "3.18.1", "@node-llama-cpp/win-x64-vulkan": "3.18.1" }, "peerDependencies": { "typescript": ">=5.0.0" }, "optionalPeers": ["typescript"], "bin": { "node-llama-cpp": "dist/cli/cli.js", "nlc": "dist/cli/cli.js" } }, "sha512-w0zfuy/IKS2fhrbed5SylZDXJHTVz4HnkwZ4UrFPgSNwJab3QIPwIl4lyCKHHy9flLrtxsAuV5kXfH3HZ6bb8w=="], + "@elizaos/autonomous/@elizaos/plugin-local-embedding/undici": ["undici@7.24.5", "", {}, "sha512-3IWdCpjgxp15CbJnsi/Y9TCDE7HWVN19j1hmzVhoAkY/+CJx449tVxT5wZc1Gwg8J+P0LWvzlBzxYRnHJ+1i7Q=="], "@elizaos/autonomous/@elizaos/plugin-local-embedding/uuid": ["uuid@11.1.0", "", { "bin": { "uuid": "dist/esm/bin/uuid" } }, "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A=="], "@elizaos/autonomous/@elizaos/plugin-ollama/ai": ["ai@4.3.19", "", { "dependencies": { "@ai-sdk/provider": "1.1.3", "@ai-sdk/provider-utils": "2.2.8", "@ai-sdk/react": "1.2.12", "@ai-sdk/ui-utils": "1.2.11", "@opentelemetry/api": "1.9.0", "jsondiffpatch": "0.6.0" }, "peerDependencies": { "react": "^18 || ^19 || ^19.0.0-rc", "zod": "^3.23.8" }, "optionalPeers": ["react"] }, "sha512-dIE2bfNpqHN3r6IINp9znguYdhIOheKW2LDigAMrgt/upT3B8eBGPSCblENvaZGoq+hxaN9fSMzjWpbqloP+7Q=="], + "@elizaos/autonomous/@elizaos/plugin-openai/ai": ["ai@6.0.116", "", { "dependencies": { "@ai-sdk/gateway": "3.0.66", "@ai-sdk/provider": "3.0.8", "@ai-sdk/provider-utils": "4.0.19", "@opentelemetry/api": "1.9.0" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-7yM+cTmyRLeNIXwt4Vj+mrrJgVQ9RMIW5WO0ydoLoYkewIvsMcvUmqS4j2RJTUXaF1HphwmSKUMQ/HypNRGOmA=="], + "@elizaos/autonomous/@elizaos/plugin-openai/undici": ["undici@7.24.5", "", {}, "sha512-3IWdCpjgxp15CbJnsi/Y9TCDE7HWVN19j1hmzVhoAkY/+CJx449tVxT5wZc1Gwg8J+P0LWvzlBzxYRnHJ+1i7Q=="], "@elizaos/autonomous/@elizaos/plugin-sql/@electric-sql/pglite": ["@electric-sql/pglite@0.3.16", "", {}, "sha512-mZkZfOd9OqTMHsK+1cje8OSzfAQcpD7JmILXTl5ahdempjUDdmg4euf1biDex5/LfQIDJ3gvCu6qDgdnDxfJmA=="], @@ -2625,13 +3111,15 @@ "@elizaos/autonomous/@elizaos/plugin-sql/uuid": ["uuid@13.0.0", "", { "bin": { "uuid": "dist-node/bin/uuid" } }, "sha512-XQegIaBTVUjSHliKqcnFqYypAd4S+WCYt5NIeRs6w/UAry7z8Y9j5ZwRRL4kzq9U3sD6v+85er9FvkEaBpji2w=="], + "@elizaos/autonomous/@noble/curves/@noble/hashes": ["@noble/hashes@2.0.1", "", {}, "sha512-XlOlEbQcE9fmuXxrVTXCTlG2nlRXa9Rj3rr5Ue/+tX+nmkgbX720YHh0VR3hBF9xDvwnb8D2shVGOwNx+ulArw=="], + "@elizaos/plugin-coding-agent/pty-console/pty-manager": ["pty-manager@1.9.8", "", { "dependencies": { "node-pty": "^1.0.0" }, "bin": { "pty-worker": "dist/pty-worker.js" } }, "sha512-FoliQUAqdWPqOZIckzafISwS9Fom/cPcxTIeyXA86ypyCW2lRIqs1UVOTvCnOnSWCRbAtLj3JmcPSZ0pH/dpig=="], - "@elizaos/plugin-ollama/ai/@ai-sdk/gateway": ["@ai-sdk/gateway@3.0.112", "", { "dependencies": { "@ai-sdk/provider": "3.0.10", "@ai-sdk/provider-utils": "4.0.27", "@vercel/oidc": "3.2.0" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-jiBao9pR4owWyjo0BnuNc7WSQBGOD0thysE4AFgZXaG+zMFbISQXUkJr7ePw/phBvePy7jE5FSA2Lf7lwqUiiQ=="], + "@elizaos/plugin-knowledge/ai/@ai-sdk/gateway": ["@ai-sdk/gateway@3.0.66", "", { "dependencies": { "@ai-sdk/provider": "3.0.8", "@ai-sdk/provider-utils": "4.0.19", "@vercel/oidc": "3.1.0" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-SIQ0YY0iMuv+07HLsZ+bB990zUJ6S4ujORAh+Jv1V2KGNn73qQKnGO0JBk+w+Res8YqOFSycwDoWcFlQrVxS4A=="], - "@elizaos/plugin-ollama/ai/@ai-sdk/provider": ["@ai-sdk/provider@3.0.10", "", { "dependencies": { "json-schema": "^0.4.0" } }, "sha512-Q3BZ27qfpYqnCYGvE3vt+Qi6LGOF9R5Nmzn+9JoM1lCRsD9mYaIhfJLkSunN48nfGXJ6n+XNV0J/XVpqGQl7Dw=="], + "@elizaos/plugin-knowledge/ai/@ai-sdk/provider": ["@ai-sdk/provider@3.0.8", "", { "dependencies": { "json-schema": "^0.4.0" } }, "sha512-oGMAgGoQdBXbZqNG0Ze56CHjDZ1IDYOwGYxYjO5KLSlz5HiNQ9udIXsPZ61VWaHGZ5XW/jyjmr6t2xz2jGVwbQ=="], - "@elizaos/plugin-ollama/ai/@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@4.0.27", "", { "dependencies": { "@ai-sdk/provider": "3.0.10", "@standard-schema/spec": "^1.1.0", "eventsource-parser": "^3.0.8" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-ubkAJ+xODouwtmN1tYlvTPphH1hPOBfZaEQe8U7skGvFAnIRs9PPpsq57bC2+Ky/MB4yzhd6YOsxTAx9sGpazw=="], + "@elizaos/plugin-knowledge/ai/@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@4.0.19", "", { "dependencies": { "@ai-sdk/provider": "3.0.8", "@standard-schema/spec": "^1.1.0", "eventsource-parser": "^3.0.6" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-3eG55CrSWCu2SXlqq2QCsFjo3+E7+Gmg7i/oRVoSZzIodTuDSfLb3MRje67xE9RFea73Zao7Lm4mADIfUETKGg=="], "@elizaos/plugin-rolodex/whatwg-url/tr46": ["tr46@1.0.1", "", { "dependencies": { "punycode": "^2.1.0" } }, "sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA=="], @@ -2681,6 +3169,10 @@ "@esbuild-kit/core-utils/esbuild/@esbuild/win32-x64": ["@esbuild/win32-x64@0.18.20", "", { "os": "win32", "cpu": "x64" }, "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ=="], + "@jimp/core/file-type/strtok3": ["strtok3@6.3.0", "", { "dependencies": { "@tokenizer/token": "^0.3.0", "peek-readable": "^4.1.0" } }, "sha512-fZtbhtvI9I48xDSywd/somNqgUHl2L2cstmXCCif0itOf96jeW18MBSyrLuNicYQVkvpOxkZtkzujiTJ9LW5Jw=="], + + "@jimp/core/file-type/token-types": ["token-types@4.2.1", "", { "dependencies": { "@tokenizer/token": "^0.3.0", "ieee754": "^1.2.1" } }, "sha512-6udB24Q737UD/SDsKAHI9FCRP7Bqc9D/MQUV02ORQg5iskjtLJlZJNdN4kKtcdtwCeWIwIHDGaUsTsCCAa8sFQ=="], + "@puppeteer/browsers/yargs/cliui": ["cliui@8.0.1", "", { "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" } }, "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ=="], "@puppeteer/browsers/yargs/y18n": ["y18n@5.0.8", "", {}, "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA=="], @@ -2693,12 +3185,32 @@ "@whiskeysockets/baileys/pino/thread-stream": ["thread-stream@3.1.0", "", { "dependencies": { "real-require": "^0.2.0" } }, "sha512-OqyPZ9u96VohAyMfJykzmivOrY2wfMSf3C5TtFJVgN+Hm6aj+voFhlK+kZEIv2FBh1X6Xp3DlnCOfEQ3B2J86A=="], - "accepts/mime-types/mime-db": ["mime-db@1.54.0", "", {}, "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ=="], + "binary-version/execa/get-stream": ["get-stream@8.0.1", "", {}, "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA=="], + + "binary-version/execa/human-signals": ["human-signals@5.0.0", "", {}, "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ=="], + + "binary-version/execa/is-stream": ["is-stream@3.0.0", "", {}, "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA=="], + + "binary-version/execa/npm-run-path": ["npm-run-path@5.3.0", "", { "dependencies": { "path-key": "^4.0.0" } }, "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ=="], + + "binary-version/execa/onetime": ["onetime@6.0.0", "", { "dependencies": { "mimic-fn": "^4.0.0" } }, "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ=="], + + "binary-version/execa/signal-exit": ["signal-exit@4.1.0", "", {}, "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw=="], + + "binary-version/execa/strip-final-newline": ["strip-final-newline@3.0.0", "", {}, "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw=="], + + "clipboardy/execa/cross-spawn": ["cross-spawn@6.0.6", "", { "dependencies": { "nice-try": "^1.0.4", "path-key": "^2.0.1", "semver": "^5.5.0", "shebang-command": "^1.2.0", "which": "^1.2.9" } }, "sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw=="], + + "clipboardy/execa/get-stream": ["get-stream@4.1.0", "", { "dependencies": { "pump": "^3.0.0" } }, "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w=="], - "body-parser/type-is/mime-types": ["mime-types@3.0.2", "", { "dependencies": { "mime-db": "^1.54.0" } }, "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A=="], + "clipboardy/execa/is-stream": ["is-stream@1.1.0", "", {}, "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ=="], + + "clipboardy/execa/npm-run-path": ["npm-run-path@2.0.2", "", { "dependencies": { "path-key": "^2.0.0" } }, "sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw=="], "cliui/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], + "cmake-js/which/isexe": ["isexe@4.0.0", "", {}, "sha512-FFUtZMpoZ8RqHS3XeXEmHWLA4thH+ZxCv2lOiPIn1Xc7CxrqhWzNSDzD+/chS/zbYezmiwWLdQC09JdQKmthOw=="], + "cmake-js/yargs/cliui": ["cliui@8.0.1", "", { "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" } }, "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ=="], "cmake-js/yargs/y18n": ["y18n@5.0.8", "", {}, "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA=="], @@ -2709,11 +3221,63 @@ "coding-agent-adapters/pino/thread-stream": ["thread-stream@3.1.0", "", { "dependencies": { "real-require": "^0.2.0" } }, "sha512-OqyPZ9u96VohAyMfJykzmivOrY2wfMSf3C5TtFJVgN+Hm6aj+voFhlK+kZEIv2FBh1X6Xp3DlnCOfEQ3B2J86A=="], - "cross-spawn/which/isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="], + "debug-logfmt/pretty-ms/parse-ms": ["parse-ms@2.1.0", "", {}, "sha512-kHt7kzLoS9VBZfUsiKjv43mr91ea+U05EyKkEtqp7vNbHxmaVuEqN7XxeEVnGrMtYOAxGrDElSi96K7EgO1zCA=="], + + "drizzle-kit/esbuild/@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.25.12", "", { "os": "aix", "cpu": "ppc64" }, "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA=="], + + "drizzle-kit/esbuild/@esbuild/android-arm": ["@esbuild/android-arm@0.25.12", "", { "os": "android", "cpu": "arm" }, "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg=="], + + "drizzle-kit/esbuild/@esbuild/android-arm64": ["@esbuild/android-arm64@0.25.12", "", { "os": "android", "cpu": "arm64" }, "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg=="], + + "drizzle-kit/esbuild/@esbuild/android-x64": ["@esbuild/android-x64@0.25.12", "", { "os": "android", "cpu": "x64" }, "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg=="], + + "drizzle-kit/esbuild/@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.25.12", "", { "os": "darwin", "cpu": "arm64" }, "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg=="], + + "drizzle-kit/esbuild/@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.25.12", "", { "os": "darwin", "cpu": "x64" }, "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA=="], + + "drizzle-kit/esbuild/@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.25.12", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg=="], + + "drizzle-kit/esbuild/@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.25.12", "", { "os": "freebsd", "cpu": "x64" }, "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ=="], + + "drizzle-kit/esbuild/@esbuild/linux-arm": ["@esbuild/linux-arm@0.25.12", "", { "os": "linux", "cpu": "arm" }, "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw=="], + + "drizzle-kit/esbuild/@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.25.12", "", { "os": "linux", "cpu": "arm64" }, "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ=="], + + "drizzle-kit/esbuild/@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.25.12", "", { "os": "linux", "cpu": "ia32" }, "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA=="], + + "drizzle-kit/esbuild/@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.25.12", "", { "os": "linux", "cpu": "none" }, "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng=="], + + "drizzle-kit/esbuild/@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.25.12", "", { "os": "linux", "cpu": "none" }, "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw=="], + + "drizzle-kit/esbuild/@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.25.12", "", { "os": "linux", "cpu": "ppc64" }, "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA=="], + + "drizzle-kit/esbuild/@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.25.12", "", { "os": "linux", "cpu": "none" }, "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w=="], + + "drizzle-kit/esbuild/@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.25.12", "", { "os": "linux", "cpu": "s390x" }, "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg=="], + + "drizzle-kit/esbuild/@esbuild/linux-x64": ["@esbuild/linux-x64@0.25.12", "", { "os": "linux", "cpu": "x64" }, "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw=="], + + "drizzle-kit/esbuild/@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.25.12", "", { "os": "none", "cpu": "arm64" }, "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg=="], + + "drizzle-kit/esbuild/@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.25.12", "", { "os": "none", "cpu": "x64" }, "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ=="], + + "drizzle-kit/esbuild/@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.25.12", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A=="], + + "drizzle-kit/esbuild/@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.25.12", "", { "os": "openbsd", "cpu": "x64" }, "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw=="], + + "drizzle-kit/esbuild/@esbuild/openharmony-arm64": ["@esbuild/openharmony-arm64@0.25.12", "", { "os": "none", "cpu": "arm64" }, "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg=="], + + "drizzle-kit/esbuild/@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.25.12", "", { "os": "sunos", "cpu": "x64" }, "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w=="], + + "drizzle-kit/esbuild/@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.25.12", "", { "os": "win32", "cpu": "arm64" }, "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg=="], + + "drizzle-kit/esbuild/@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.25.12", "", { "os": "win32", "cpu": "ia32" }, "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ=="], + + "drizzle-kit/esbuild/@esbuild/win32-x64": ["@esbuild/win32-x64@0.25.12", "", { "os": "win32", "cpu": "x64" }, "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA=="], "ethers/@types/node/undici-types": ["undici-types@6.19.8", "", {}, "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw=="], - "express/mime-types/mime-db": ["mime-db@1.54.0", "", {}, "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ=="], + "form-data/mime-types/mime-db": ["mime-db@1.52.0", "", {}, "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="], "gaxios/node-fetch/data-uri-to-buffer": ["data-uri-to-buffer@4.0.1", "", {}, "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A=="], @@ -2723,6 +3287,8 @@ "ipull/pretty-ms/parse-ms": ["parse-ms@3.0.0", "", {}, "sha512-Tpb8Z7r7XbbtBTrM9UhpkzzaMrqA2VXMT3YChzYltwV3P3pM6t8wl7TvpMnSTosz1aQAdVib7kdoys7vYOPerw=="], + "jayson/@types/ws/@types/node": ["@types/node@24.12.0", "", { "dependencies": { "undici-types": "~7.16.0" } }, "sha512-GYDxsZi3ChgmckRT9HPU0WEhKLP08ev/Yfcq2AstjrDASOYCSXeyjDsHg4v5t4jOj7cyDX3vmprafKlWIG9MXQ=="], + "jszip/readable-stream/safe-buffer": ["safe-buffer@5.1.2", "", {}, "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="], "libsignal/protobufjs/@types/node": ["@types/node@10.17.60", "", {}, "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw=="], @@ -2733,15 +3299,15 @@ "node-fetch/whatwg-url/webidl-conversions": ["webidl-conversions@3.0.1", "", {}, "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ=="], + "node-llama-cpp/which/isexe": ["isexe@4.0.0", "", {}, "sha512-FFUtZMpoZ8RqHS3XeXEmHWLA4thH+ZxCv2lOiPIn1Xc7CxrqhWzNSDzD+/chS/zbYezmiwWLdQC09JdQKmthOw=="], + "node-llama-cpp/yargs/cliui": ["cliui@8.0.1", "", { "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" } }, "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ=="], "node-llama-cpp/yargs/y18n": ["y18n@5.0.8", "", {}, "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA=="], "node-llama-cpp/yargs/yargs-parser": ["yargs-parser@21.1.1", "", {}, "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw=="], - "ollama-ai-provider/@ai-sdk/provider-utils/nanoid": ["nanoid@3.3.11", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w=="], - - "send/mime-types/mime-db": ["mime-db@1.54.0", "", {}, "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ=="], + "readable-web-to-node-stream/readable-stream/string_decoder": ["string_decoder@1.3.0", "", { "dependencies": { "safe-buffer": "~5.2.0" } }, "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA=="], "stdout-update/string-width/emoji-regex": ["emoji-regex@10.6.0", "", {}, "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A=="], @@ -2801,6 +3367,8 @@ "tsx/esbuild/@esbuild/win32-x64": ["@esbuild/win32-x64@0.27.4", "", { "os": "win32", "cpu": "x64" }, "sha512-+knoa0BDoeXgkNvvV1vvbZX4+hizelrkwmGJBdT17t8FNPwG2lKemmuMZlmaNQ3ws3DKKCxpb4zRZEIp3UxFCg=="], + "type-is/mime-types/mime-db": ["mime-db@1.52.0", "", {}, "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="], + "websocket/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="], "whisper-node/shelljs/glob": ["glob@7.2.3", "", { "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } }, "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q=="], @@ -2811,27 +3379,57 @@ "@aws-crypto/util/@smithy/util-utf8/@smithy/util-buffer-from/@smithy/is-array-buffer": ["@smithy/is-array-buffer@2.2.0", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA=="], - "@elizaos/agent/@elizaos/plugin-ollama/ai/@ai-sdk/provider": ["@ai-sdk/provider@1.1.3", "", { "dependencies": { "json-schema": "^0.4.0" } }, "sha512-qZMxYJ0qqX/RfnuIaab+zp8UAeJn/ygXXAffR5I4N0n1IrvA6qBsjc8hXLmBiMV2zoXlifkacF7sEFnYnjBcqg=="], + "@elizaos/autonomous/@elizaos/plugin-anthropic/ai/@ai-sdk/gateway": ["@ai-sdk/gateway@3.0.66", "", { "dependencies": { "@ai-sdk/provider": "3.0.8", "@ai-sdk/provider-utils": "4.0.19", "@vercel/oidc": "3.1.0" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-SIQ0YY0iMuv+07HLsZ+bB990zUJ6S4ujORAh+Jv1V2KGNn73qQKnGO0JBk+w+Res8YqOFSycwDoWcFlQrVxS4A=="], - "@elizaos/agent/@elizaos/plugin-ollama/ai/@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@2.2.8", "", { "dependencies": { "@ai-sdk/provider": "1.1.3", "nanoid": "^3.3.8", "secure-json-parse": "^2.7.0" }, "peerDependencies": { "zod": "^3.23.8" } }, "sha512-fqhG+4sCVv8x7nFzYnFo19ryhAa3w096Kmc3hWxMQfW/TubPOmt3A6tYZhl4mUfQWWQMsuSkLrtjlWuXBVSGQA=="], + "@elizaos/autonomous/@elizaos/plugin-anthropic/ai/@ai-sdk/provider": ["@ai-sdk/provider@3.0.8", "", { "dependencies": { "json-schema": "^0.4.0" } }, "sha512-oGMAgGoQdBXbZqNG0Ze56CHjDZ1IDYOwGYxYjO5KLSlz5HiNQ9udIXsPZ61VWaHGZ5XW/jyjmr6t2xz2jGVwbQ=="], - "@elizaos/agent/@elizaos/plugin-ollama/ai/zod": ["zod@4.3.6", "", {}, "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg=="], + "@elizaos/autonomous/@elizaos/plugin-anthropic/ai/@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@4.0.19", "", { "dependencies": { "@ai-sdk/provider": "3.0.8", "@standard-schema/spec": "^1.1.0", "eventsource-parser": "^3.0.6" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-3eG55CrSWCu2SXlqq2QCsFjo3+E7+Gmg7i/oRVoSZzIodTuDSfLb3MRje67xE9RFea73Zao7Lm4mADIfUETKGg=="], + + "@elizaos/autonomous/@elizaos/plugin-elizacloud/ai/@ai-sdk/gateway": ["@ai-sdk/gateway@3.0.66", "", { "dependencies": { "@ai-sdk/provider": "3.0.8", "@ai-sdk/provider-utils": "4.0.19", "@vercel/oidc": "3.1.0" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-SIQ0YY0iMuv+07HLsZ+bB990zUJ6S4ujORAh+Jv1V2KGNn73qQKnGO0JBk+w+Res8YqOFSycwDoWcFlQrVxS4A=="], + + "@elizaos/autonomous/@elizaos/plugin-elizacloud/ai/@ai-sdk/provider": ["@ai-sdk/provider@3.0.8", "", { "dependencies": { "json-schema": "^0.4.0" } }, "sha512-oGMAgGoQdBXbZqNG0Ze56CHjDZ1IDYOwGYxYjO5KLSlz5HiNQ9udIXsPZ61VWaHGZ5XW/jyjmr6t2xz2jGVwbQ=="], + + "@elizaos/autonomous/@elizaos/plugin-elizacloud/ai/@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@4.0.19", "", { "dependencies": { "@ai-sdk/provider": "3.0.8", "@standard-schema/spec": "^1.1.0", "eventsource-parser": "^3.0.6" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-3eG55CrSWCu2SXlqq2QCsFjo3+E7+Gmg7i/oRVoSZzIodTuDSfLb3MRje67xE9RFea73Zao7Lm4mADIfUETKGg=="], + + "@elizaos/autonomous/@elizaos/plugin-local-embedding/@huggingface/transformers/onnxruntime-node": ["onnxruntime-node@1.21.0", "", { "dependencies": { "global-agent": "^3.0.0", "onnxruntime-common": "1.21.0", "tar": "^7.0.1" }, "os": [ "linux", "win32", "darwin", ] }, "sha512-NeaCX6WW2L8cRCSqy3bInlo5ojjQqu2fD3D+9W5qb5irwxhEyWKXeH2vZ8W9r6VxaMPUan+4/7NDwZMtouZxEw=="], + + "@elizaos/autonomous/@elizaos/plugin-local-embedding/@huggingface/transformers/onnxruntime-web": ["onnxruntime-web@1.22.0-dev.20250409-89f8206ba4", "", { "dependencies": { "flatbuffers": "^25.1.24", "guid-typescript": "^1.0.9", "long": "^5.2.3", "onnxruntime-common": "1.22.0-dev.20250409-89f8206ba4", "platform": "^1.3.6", "protobufjs": "^7.2.4" } }, "sha512-0uS76OPgH0hWCPrFKlL8kYVV7ckM7t/36HfbgoFw6Nd0CZVVbQC4PkrR8mBX8LtNUFZO25IQBqV2Hx2ho3FlbQ=="], + + "@elizaos/autonomous/@elizaos/plugin-local-embedding/node-llama-cpp/which": ["which@6.0.1", "", { "dependencies": { "isexe": "^4.0.0" }, "bin": { "node-which": "bin/which.js" } }, "sha512-oGLe46MIrCRqX7ytPUf66EAYvdeMIZYn3WaocqqKZAxrBpkqHfL/qvTyJ/bTk5+AqHCjXmrv3CEWgy368zhRUg=="], + + "@elizaos/autonomous/@elizaos/plugin-local-embedding/node-llama-cpp/yargs": ["yargs@17.7.2", "", { "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.3", "y18n": "^5.0.5", "yargs-parser": "^21.1.1" } }, "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w=="], "@elizaos/autonomous/@elizaos/plugin-ollama/ai/@ai-sdk/provider": ["@ai-sdk/provider@1.1.3", "", { "dependencies": { "json-schema": "^0.4.0" } }, "sha512-qZMxYJ0qqX/RfnuIaab+zp8UAeJn/ygXXAffR5I4N0n1IrvA6qBsjc8hXLmBiMV2zoXlifkacF7sEFnYnjBcqg=="], "@elizaos/autonomous/@elizaos/plugin-ollama/ai/@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@2.2.8", "", { "dependencies": { "@ai-sdk/provider": "1.1.3", "nanoid": "^3.3.8", "secure-json-parse": "^2.7.0" }, "peerDependencies": { "zod": "^3.23.8" } }, "sha512-fqhG+4sCVv8x7nFzYnFo19ryhAa3w096Kmc3hWxMQfW/TubPOmt3A6tYZhl4mUfQWWQMsuSkLrtjlWuXBVSGQA=="], + "@elizaos/autonomous/@elizaos/plugin-openai/ai/@ai-sdk/gateway": ["@ai-sdk/gateway@3.0.66", "", { "dependencies": { "@ai-sdk/provider": "3.0.8", "@ai-sdk/provider-utils": "4.0.19", "@vercel/oidc": "3.1.0" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-SIQ0YY0iMuv+07HLsZ+bB990zUJ6S4ujORAh+Jv1V2KGNn73qQKnGO0JBk+w+Res8YqOFSycwDoWcFlQrVxS4A=="], + + "@elizaos/autonomous/@elizaos/plugin-openai/ai/@ai-sdk/provider": ["@ai-sdk/provider@3.0.8", "", { "dependencies": { "json-schema": "^0.4.0" } }, "sha512-oGMAgGoQdBXbZqNG0Ze56CHjDZ1IDYOwGYxYjO5KLSlz5HiNQ9udIXsPZ61VWaHGZ5XW/jyjmr6t2xz2jGVwbQ=="], + + "@elizaos/autonomous/@elizaos/plugin-openai/ai/@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@4.0.19", "", { "dependencies": { "@ai-sdk/provider": "3.0.8", "@standard-schema/spec": "^1.1.0", "eventsource-parser": "^3.0.6" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-3eG55CrSWCu2SXlqq2QCsFjo3+E7+Gmg7i/oRVoSZzIodTuDSfLb3MRje67xE9RFea73Zao7Lm4mADIfUETKGg=="], + "@elizaos/autonomous/@elizaos/plugin-sql/@neondatabase/serverless/@types/node": ["@types/node@22.19.15", "", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-F0R/h2+dsy5wJAUe3tAU6oqa2qbWY5TpNfL/RGmo1y38hiyO1w3x2jPtt76wmuaJI4DQnOBu21cNXQ2STIUUWg=="], - "@elizaos/plugin-ollama/ai/@ai-sdk/gateway/@vercel/oidc": ["@vercel/oidc@3.2.0", "", {}, "sha512-UycprH3T6n3jH0k44NHMa7pnFHGu/N05MjojYr+Mc6I7obkoLIJujSWwin1pCvdy/eOxrI/l3uDLQsmcrOb4ug=="], + "@elizaos/plugin-knowledge/ai/@ai-sdk/gateway/@vercel/oidc": ["@vercel/oidc@3.1.0", "", {}, "sha512-Fw28YZpRnA3cAHHDlkt7xQHiJ0fcL+NRcIqsocZQUSmbzeIKRpwttJjik5ZGanXP+vlA4SbTg+AbA3bP363l+w=="], - "@elizaos/plugin-ollama/ai/@ai-sdk/provider-utils/eventsource-parser": ["eventsource-parser@3.0.8", "", {}, "sha512-70QWGkr4snxr0OXLRWsFLeRBIRPuQOvt4s8QYjmUlmlkyTZkRqS7EDVRZtzU3TiyDbXSzaOeF0XUKy8PchzukQ=="], + "@elizaos/plugin-knowledge/ai/@ai-sdk/provider-utils/eventsource-parser": ["eventsource-parser@3.0.6", "", {}, "sha512-Vo1ab+QXPzZ4tCa8SwIHJFaSzy4R6SHf7BY79rFBDf0idraZWAkYrDjDj8uWaSm3S2TK+hJ7/t1CEmZ7jXw+pg=="], "@puppeteer/browsers/yargs/cliui/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], "@puppeteer/browsers/yargs/cliui/wrap-ansi": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="], - "body-parser/type-is/mime-types/mime-db": ["mime-db@1.54.0", "", {}, "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ=="], + "binary-version/execa/npm-run-path/path-key": ["path-key@4.0.0", "", {}, "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ=="], + + "binary-version/execa/onetime/mimic-fn": ["mimic-fn@4.0.0", "", {}, "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw=="], + + "clipboardy/execa/cross-spawn/path-key": ["path-key@2.0.1", "", {}, "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw=="], + + "clipboardy/execa/cross-spawn/semver": ["semver@5.7.2", "", { "bin": { "semver": "bin/semver" } }, "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g=="], + + "clipboardy/execa/cross-spawn/shebang-command": ["shebang-command@1.2.0", "", { "dependencies": { "shebang-regex": "^1.0.0" } }, "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg=="], + + "clipboardy/execa/npm-run-path/path-key": ["path-key@2.0.1", "", {}, "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw=="], "cmake-js/yargs/cliui/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], @@ -2843,16 +3441,40 @@ "whisper-node/shelljs/glob/minimatch": ["minimatch@3.1.5", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w=="], - "@elizaos/agent/@elizaos/plugin-ollama/ai/@ai-sdk/provider-utils/nanoid": ["nanoid@3.3.11", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w=="], + "@elizaos/autonomous/@elizaos/plugin-anthropic/ai/@ai-sdk/gateway/@vercel/oidc": ["@vercel/oidc@3.1.0", "", {}, "sha512-Fw28YZpRnA3cAHHDlkt7xQHiJ0fcL+NRcIqsocZQUSmbzeIKRpwttJjik5ZGanXP+vlA4SbTg+AbA3bP363l+w=="], + + "@elizaos/autonomous/@elizaos/plugin-anthropic/ai/@ai-sdk/provider-utils/eventsource-parser": ["eventsource-parser@3.0.6", "", {}, "sha512-Vo1ab+QXPzZ4tCa8SwIHJFaSzy4R6SHf7BY79rFBDf0idraZWAkYrDjDj8uWaSm3S2TK+hJ7/t1CEmZ7jXw+pg=="], + + "@elizaos/autonomous/@elizaos/plugin-elizacloud/ai/@ai-sdk/gateway/@vercel/oidc": ["@vercel/oidc@3.1.0", "", {}, "sha512-Fw28YZpRnA3cAHHDlkt7xQHiJ0fcL+NRcIqsocZQUSmbzeIKRpwttJjik5ZGanXP+vlA4SbTg+AbA3bP363l+w=="], + + "@elizaos/autonomous/@elizaos/plugin-elizacloud/ai/@ai-sdk/provider-utils/eventsource-parser": ["eventsource-parser@3.0.6", "", {}, "sha512-Vo1ab+QXPzZ4tCa8SwIHJFaSzy4R6SHf7BY79rFBDf0idraZWAkYrDjDj8uWaSm3S2TK+hJ7/t1CEmZ7jXw+pg=="], + + "@elizaos/autonomous/@elizaos/plugin-local-embedding/@huggingface/transformers/onnxruntime-node/onnxruntime-common": ["onnxruntime-common@1.21.0", "", {}, "sha512-Q632iLLrtCAVOTO65dh2+mNbQir/QNTVBG3h/QdZBpns7mZ0RYbLRBgGABPbpU9351AgYy7SJf1WaeVwMrBFPQ=="], + + "@elizaos/autonomous/@elizaos/plugin-local-embedding/@huggingface/transformers/onnxruntime-web/onnxruntime-common": ["onnxruntime-common@1.22.0-dev.20250409-89f8206ba4", "", {}, "sha512-vDJMkfCfb0b1A836rgHj+ORuZf4B4+cc2bASQtpeoJLueuFc5DuYwjIZUBrSvx/fO5IrLjLz+oTrB3pcGlhovQ=="], + + "@elizaos/autonomous/@elizaos/plugin-local-embedding/node-llama-cpp/which/isexe": ["isexe@4.0.0", "", {}, "sha512-FFUtZMpoZ8RqHS3XeXEmHWLA4thH+ZxCv2lOiPIn1Xc7CxrqhWzNSDzD+/chS/zbYezmiwWLdQC09JdQKmthOw=="], + + "@elizaos/autonomous/@elizaos/plugin-local-embedding/node-llama-cpp/yargs/cliui": ["cliui@8.0.1", "", { "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" } }, "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ=="], + + "@elizaos/autonomous/@elizaos/plugin-local-embedding/node-llama-cpp/yargs/y18n": ["y18n@5.0.8", "", {}, "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA=="], + + "@elizaos/autonomous/@elizaos/plugin-local-embedding/node-llama-cpp/yargs/yargs-parser": ["yargs-parser@21.1.1", "", {}, "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw=="], "@elizaos/autonomous/@elizaos/plugin-ollama/ai/@ai-sdk/provider-utils/nanoid": ["nanoid@3.3.11", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w=="], + "@elizaos/autonomous/@elizaos/plugin-openai/ai/@ai-sdk/gateway/@vercel/oidc": ["@vercel/oidc@3.1.0", "", {}, "sha512-Fw28YZpRnA3cAHHDlkt7xQHiJ0fcL+NRcIqsocZQUSmbzeIKRpwttJjik5ZGanXP+vlA4SbTg+AbA3bP363l+w=="], + + "@elizaos/autonomous/@elizaos/plugin-openai/ai/@ai-sdk/provider-utils/eventsource-parser": ["eventsource-parser@3.0.6", "", {}, "sha512-Vo1ab+QXPzZ4tCa8SwIHJFaSzy4R6SHf7BY79rFBDf0idraZWAkYrDjDj8uWaSm3S2TK+hJ7/t1CEmZ7jXw+pg=="], + "@elizaos/autonomous/@elizaos/plugin-sql/@neondatabase/serverless/@types/node/undici-types": ["undici-types@6.21.0", "", {}, "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ=="], "@puppeteer/browsers/yargs/cliui/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], "@puppeteer/browsers/yargs/cliui/wrap-ansi/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + "clipboardy/execa/cross-spawn/shebang-command/shebang-regex": ["shebang-regex@1.0.0", "", {}, "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ=="], + "cmake-js/yargs/cliui/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], "cmake-js/yargs/cliui/wrap-ansi/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], @@ -2863,6 +3485,14 @@ "whisper-node/shelljs/glob/minimatch/brace-expansion": ["brace-expansion@1.1.12", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg=="], + "@elizaos/autonomous/@elizaos/plugin-local-embedding/node-llama-cpp/yargs/cliui/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + + "@elizaos/autonomous/@elizaos/plugin-local-embedding/node-llama-cpp/yargs/cliui/wrap-ansi": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="], + "whisper-node/shelljs/glob/minimatch/brace-expansion/balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], + + "@elizaos/autonomous/@elizaos/plugin-local-embedding/node-llama-cpp/yargs/cliui/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], + + "@elizaos/autonomous/@elizaos/plugin-local-embedding/node-llama-cpp/yargs/cliui/wrap-ansi/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], } } diff --git a/package.json b/package.json index 22f3f2a8..e0eb4c0d 100644 --- a/package.json +++ b/package.json @@ -54,32 +54,32 @@ "@doolittle/acp": "workspace:*", "@doolittle/contracts": "workspace:*", "@doolittle/logger": "workspace:*", - "@elizaos/agent": "2.0.0-alpha.537", + "@elizaos/agent": "2.0.0-beta.2", "@elizaos/autonomous": "2.0.0-alpha.85", - "@elizaos/core": "2.0.0-alpha.537", - "@elizaos/plugin-anthropic": "2.0.0-alpha.537", + "@elizaos/core": "2.0.0-beta.1", + "@elizaos/plugin-anthropic": "2.0.0-beta.1", "@elizaos/plugin-claude-code": "workspace:*", "@elizaos/plugin-codex": "workspace:*", "@elizaos/plugin-devin": "workspace:*", "@elizaos/plugin-elizacloud": "workspace:*", - "@elizaos/plugin-ollama": "2.0.0-alpha.537", - "@elizaos/plugin-openai": "2.0.0-alpha.537", - "@elizaos/plugin-pdf": "2.0.0-alpha.537", + "@elizaos/plugin-ollama": "2.0.0-beta.1", + "@elizaos/plugin-openai": "2.0.0-beta.1", + "@elizaos/plugin-pdf": "2.0.0-beta.1", "@elizaos/plugin-sql": "workspace:*", - "@elizaos/plugin-telegram": "2.0.0-alpha.537", - "@elizaos/skills": "2.0.0-alpha.539", + "@elizaos/plugin-telegram": "2.0.0-beta.1", + "@elizaos/skills": "2.0.0-beta.1", "@fal-ai/client": "^1.9.4", - "cron-parser": "^5.2.0", "dotenv": "^17.2.3", - "elizaos": "2.0.0-alpha.535", + "elizaos": "2.0.0-beta.5", "zod": "^4.3.6" }, "overrides": { - "@elizaos/agent": "2.0.0-alpha.537", - "@elizaos/core": "2.0.0-alpha.537", + "@elizaos/agent": "2.0.0-beta.2", + "@elizaos/core": "2.0.0-beta.1", "@elizaos/autonomous": "2.0.0-alpha.85", - "@elizaos/skills": "2.0.0-alpha.539", - "elizaos": "2.0.0-alpha.535" + "@elizaos/skills": "2.0.0-beta.1", + "elizaos": "2.0.0-beta.5", + "ollama-ai-provider": "npm:ollama-ai-provider-v2@^3.5.1" }, "devDependencies": { "@biomejs/biome": "^2.3.11", @@ -92,5 +92,8 @@ }, "engines": { "bun": ">=1.3.0" + }, + "patchedDependencies": { + "@elizaos/plugin-sql@2.0.0-beta.1": "patches/@elizaos%2Fplugin-sql@2.0.0-beta.1.patch" } } diff --git a/packages/agent/package.json b/packages/agent/package.json index f565f6af..0359ffe6 100644 --- a/packages/agent/package.json +++ b/packages/agent/package.json @@ -8,7 +8,7 @@ "@doolittle/acp": "workspace:*", "@doolittle/contracts": "workspace:*", "@doolittle/logger": "workspace:*", - "@elizaos/agent": "2.0.0-alpha.537" + "@elizaos/agent": "2.0.0-beta.2" }, "scripts": { "dev": "bun --watch src/index.ts", diff --git a/packages/agent/src/actions/terminal-action.test.ts b/packages/agent/src/actions/terminal-action.test.ts index 6bf57475..9f72b536 100644 --- a/packages/agent/src/actions/terminal-action.test.ts +++ b/packages/agent/src/actions/terminal-action.test.ts @@ -1,5 +1,6 @@ import { describe, expect, it } from "bun:test"; import { + isTerminalIntent, resolveCommandFromArguments, resolveCommandFromObject, resolveCommandFromParams, @@ -65,3 +66,27 @@ describe("resolveCommandFromText", () => { expect(resolveCommandFromText("```bash\nls -la\n```")).toBe("ls -la"); }); }); + +describe("isTerminalIntent", () => { + it("matches explicit terminal prefixes", () => { + expect(isTerminalIntent("!git status")).toBe(true); + expect(isTerminalIntent("/terminal run npm -v")).toBe(true); + expect(isTerminalIntent("run `pwd` in terminal")).toBe(true); + }); + + it("matches scaffolding requests that name package managers", () => { + expect( + isTerminalIntent( + 'Go to ~/symbiex/dev and create a folder named "the-game". In the folder, build a react app (use bunx or npx to scaffold from an official boilerplate so we can reduce context, find this online)', + ), + ).toBe(true); + expect(isTerminalIntent("scaffold a new vite project")).toBe(true); + expect(isTerminalIntent("git clone https://example.com/foo")).toBe(true); + expect(isTerminalIntent("cargo build the workspace please")).toBe(true); + }); + + it("ignores prose without shell intent", () => { + expect(isTerminalIntent("how are you?")).toBe(false); + expect(isTerminalIntent("explain how react routing works")).toBe(false); + }); +}); diff --git a/packages/agent/src/actions/terminal-action/index.ts b/packages/agent/src/actions/terminal-action/index.ts index 9a7abc8e..eff77bc9 100644 --- a/packages/agent/src/actions/terminal-action/index.ts +++ b/packages/agent/src/actions/terminal-action/index.ts @@ -5,4 +5,4 @@ export { resolveCommandFromParams, resolveCommandFromText, } from "./parsing"; -export { createTerminalAction } from "./wiring"; +export { createTerminalAction, isTerminalIntent } from "./wiring"; diff --git a/packages/agent/src/actions/terminal-action/wiring.ts b/packages/agent/src/actions/terminal-action/wiring.ts index 112a051e..42418d41 100644 --- a/packages/agent/src/actions/terminal-action/wiring.ts +++ b/packages/agent/src/actions/terminal-action/wiring.ts @@ -17,6 +17,50 @@ const ACTION_SOURCE = "terminal-action"; const MISSING_COMMAND_RESPONSE = "I couldn't determine the terminal command to run. Try `!git status` or say `run `rg TODO` in the terminal`."; +const SHELL_TOOL_PATTERN = + /\b(?:bunx|bun(?:\s+(?:add|install|i|run|x|create|init))?|npx|npm(?:\s+(?:install|i|run|create|init|ci|test|exec))?|pnpm(?:\s+(?:dlx|add|install|i|run|create|exec))?|yarn(?:\s+(?:add|install|create|dlx|run))?|deno(?:\s+(?:run|task|install))?|tsx|ts-node|node(?:\s+\S+)?|cargo(?:\s+(?:new|init|run|build|test|add|install))?|rustup|go(?:\s+(?:build|run|test|get|mod|install))?|pip(?:3)?(?:\s+install)?|poetry|uv(?:\s+(?:pip|venv|run))?|make|cmake|ninja|gradle|gradlew|mvn|docker|docker-compose|podman|kubectl|helm|terraform|ansible|git(?:\s+(?:clone|init|add|commit|push|pull|fetch|status|log|diff|checkout|switch|branch|stash|merge|rebase|reset|tag))?|gh\s+\S+|create-(?:react-app|next-app|vite|tauri-app|t3-app|expo-app|nuxt-app|svelte-app|astro)|vite|next|nuxt|astro|expo|sveltekit|hardhat|forge|anchor|solana(?:\s+\S+)?|spl-token|metaplex|firebase|supabase|vercel|netlify|wrangler|playwright|cypress|vitest|jest|mocha|rg|fd|fzf|jq|curl|wget|sh|bash|zsh|fish|pwsh)\b/iu; + +const TERMINAL_VERB_PATTERN = + /\b(?:run|execute|exec|start|launch|invoke|spawn|fire(?:\s+off)?)\b/iu; + +const BUILD_OR_SCAFFOLD_VERB_PATTERN = + /\b(?:scaffold|bootstrap|build|install|compile|setup|set\s+up|spin\s+up|stand\s+up|initialize|init|generate|deploy|publish|push|pull|test|lint|format)\b/iu; + +const SHELL_PATH_PATTERN = + /(?:\.\/[\w./-]+|~\/[\w./-]+|\$\(|\|\||&&|\bsudo\b)/u; + +export function isTerminalIntent(text: string): boolean { + const trimmed = text.trim(); + if (!trimmed) { + return false; + } + if (trimmed.startsWith("!") || trimmed.startsWith("/terminal")) { + return true; + } + if ( + TERMINAL_VERB_PATTERN.test(trimmed) && + /\b(?:terminal|shell)\b/iu.test(trimmed) + ) { + return true; + } + if (/\b(?:run|execute|exec)\b\s+`[^`\n]+`/u.test(trimmed)) { + return true; + } + if (SHELL_TOOL_PATTERN.test(trimmed)) { + return true; + } + if ( + BUILD_OR_SCAFFOLD_VERB_PATTERN.test(trimmed) && + SHELL_TOOL_PATTERN.test(trimmed) + ) { + return true; + } + if (SHELL_PATH_PATTERN.test(trimmed)) { + return true; + } + return false; +} + export function createTerminalAction(services: AppServices): Action { return { name: ACTION_NAME, @@ -37,13 +81,7 @@ export function createTerminalAction(services: AppServices): Action { typeof message.content === "string" ? message.content : message.content?.text; - return Boolean( - text && - (text.trim().startsWith("!") || - text.trim().startsWith("/terminal") || - /\b(?:run|execute|exec)\b.+\b(?:terminal|shell)\b/iu.test(text) || - /\b(?:run|execute|exec)\b\s+`[^`\n]+`/u.test(text)), - ); + return Boolean(text && isTerminalIntent(text)); }, handler: async ( runtime: IAgentRuntime, diff --git a/packages/agent/src/cli/splash.ts b/packages/agent/src/cli/splash.ts deleted file mode 100644 index ad14bcfc..00000000 --- a/packages/agent/src/cli/splash.ts +++ /dev/null @@ -1,71 +0,0 @@ -/** - * Boot splash screen for Doolittle. - * - * Displays Eliza in a lab coat alongside the Doolittle wordmark in - * ANSI-colored ASCII art. Skipped in non-TTY environments or when - * DOOLITTLE_SKIP_SPLASH=1. - */ - -// Color palette (ANSI 24-bit / truecolor) -const O = "\x1b[38;2;255;106;0m\x1b[1m"; // orange (brand) -const H = "\x1b[38;2;30;30;45m\x1b[1m"; // dark hair -const S = "\x1b[38;2;255;220;185m"; // skin -const E = "\x1b[38;2;230;140;50m"; // amber eyes -const M = "\x1b[38;2;200;80;80m"; // mouth / blush -const L = "\x1b[38;2;239;244;255m\x1b[1m"; // lab coat -const C = "\x1b[38;2;85;214;255m"; // cyan accent -const D = "\x1b[2m"; // dim -const R = "\x1b[0m"; // reset - -/* eslint-disable no-irregular-whitespace */ -const SPLASH_LINES = [ - ``, - `${H} @@@@@@@@@@@${R}`, - `${H} @@@@@@@@@@@@@@@${R}`, - `${H} @@@@@@@@@@@@@@@@@@@${R}`, - `${H} @@@@@@@${S}@@@@@@@@@${H}@@@@@@${R}`, - `${H} @@@@@${S}@@@@${E}@@${S}@@${E}@@${S}@@@@${H}@@@@@${R} ${O}DOOLITTLE${R}`, - `${H} @@@@@${S}@@@@@@@@${M}@@${S}@@@@@@${H}@@@@@${R} ${D}${C}ELIZA // CYPHERPUNK OPERATOR SHELL${R}`, - `${H} @@@@@${S}@@@@@@${M}____${S}@@@@@@${H}@@@@@${R}`, - `${H} @@@@@${S}@@@@@${H}@@@@@@${S}@@@@@${H}@@@@${R} ${D}Booting workspace...${R}`, - `${H} @@@@@${S}@@@@${H}@@@@@@${S}@@@@${H}@@@@${R}`, - `${L} _____${H}@@${R}${L}___${H}@@${R}${L}_____ ${R}`, - `${L} / ____\\ /____ \\${R}`, - `${L} / / __ \\ / __ \\ \\${R}`, - `${L} / /_/ /\\ V / /_/ /${R}`, - `${L} /_____/_/\\___/\\____/ ${R}`, - `${L} /_/ \\_\\${R}`, - `${L} /_/ \\_\\${R}`, - ``, -]; - -const SPLASH_ART = SPLASH_LINES.join("\n"); - -/** - * Show the boot splash screen if we're in an interactive TTY and - * the user hasn't opted out via DOOLITTLE_SKIP_SPLASH=1. - * - * @param durationMs How long to show the splash (default 1500ms). - */ -export async function showBootSplash(durationMs = 1500): Promise { - if (process.env.DOOLITTLE_SKIP_SPLASH === "1") { - return; - } - if (!process.stdin.isTTY || !process.stdout.isTTY) { - return; - } - - // Hide cursor - process.stdout.write("\x1b[?25l"); - // Clear screen and move to top-left - process.stdout.write("\x1b[2J\x1b[H"); - - process.stdout.write(SPLASH_ART); - process.stdout.write("\n"); - - await new Promise((resolve) => setTimeout(resolve, durationMs)); - - // Clear screen and restore cursor - process.stdout.write("\x1b[2J\x1b[H"); - process.stdout.write("\x1b[?25h"); -} diff --git a/packages/agent/src/config/env/schema.ts b/packages/agent/src/config/env/schema.ts index c0c0a781..31f70b89 100644 --- a/packages/agent/src/config/env/schema.ts +++ b/packages/agent/src/config/env/schema.ts @@ -1,4 +1,4 @@ -import { resolveCloudApiBaseUrl } from "@elizaos/agent/cloud/base-url"; +import { resolveCloudApiBaseUrl } from "@elizaos/autonomous/cloud/base-url"; import { z } from "zod"; export const envSchema = z.object({ diff --git a/packages/agent/src/evaluators/memory-nudge-evaluator.test.ts b/packages/agent/src/evaluators/memory-nudge-evaluator.test.ts new file mode 100644 index 00000000..2d74796b --- /dev/null +++ b/packages/agent/src/evaluators/memory-nudge-evaluator.test.ts @@ -0,0 +1,74 @@ +import { describe, expect, it } from "bun:test"; +import type { EvaluatorRunContext, Memory } from "@elizaos/core"; +import type { AppServices } from "@/services"; +import { createMemoryNudgeEvaluator } from "./memory-nudge-evaluator"; + +function makeServices() { + const writes: Array<{ target: string; content: string }> = []; + const services = { + memory: { + add: (target: string, content: string) => { + writes.push({ target, content }); + return content; + }, + }, + } as unknown as AppServices; + return { services, writes }; +} + +function runContext(text: string): EvaluatorRunContext { + return { + message: { content: { text } } as Memory, + } as EvaluatorRunContext; +} + +describe("memoryNudge evaluator (beta contract)", () => { + it("gates on remember/save cues via shouldRun", async () => { + const { services } = makeServices(); + const evaluator = createMemoryNudgeEvaluator(services); + expect( + await evaluator.shouldRun(runContext("remember that we use Bun")), + ).toBe(true); + expect(await evaluator.shouldRun(runContext("what is the weather"))).toBe( + false, + ); + }); + + it("requires a schema and prompt (beta-required fields)", () => { + const { services } = makeServices(); + const evaluator = createMemoryNudgeEvaluator(services); + expect(evaluator.schema).toBeDefined(); + expect(typeof evaluator.prompt).toBe("function"); + }); + + it("parses model output into a normalized record", () => { + const { services } = makeServices(); + const evaluator = createMemoryNudgeEvaluator(services); + expect( + evaluator.parse?.({ + shouldStore: true, + target: "user", + fact: " likes bun ", + }), + ).toEqual({ shouldStore: true, target: "user", fact: "likes bun" }); + expect(evaluator.parse?.({ target: "memory", fact: "" })).toBeNull(); + expect(evaluator.parse?.(null)).toBeNull(); + }); + + it("persists the parsed fact through a processor", async () => { + const { services, writes } = makeServices(); + const evaluator = createMemoryNudgeEvaluator(services); + const processor = evaluator.processors?.[0]; + if (!processor) { + throw new Error("expected a persistence processor"); + } + type ProcessorContext = Parameters[0]; + await processor.process({ + output: { shouldStore: true, target: "memory", fact: "uses bun" }, + } as unknown as ProcessorContext); + await processor.process({ + output: { shouldStore: false, target: "memory", fact: "ignored" }, + } as unknown as ProcessorContext); + expect(writes).toEqual([{ target: "memory", content: "uses bun" }]); + }); +}); diff --git a/packages/agent/src/evaluators/memory-nudge-evaluator.ts b/packages/agent/src/evaluators/memory-nudge-evaluator.ts index 2378fa22..6b6a7d8a 100644 --- a/packages/agent/src/evaluators/memory-nudge-evaluator.ts +++ b/packages/agent/src/evaluators/memory-nudge-evaluator.ts @@ -1,59 +1,116 @@ -import type { Evaluator, IAgentRuntime, Memory } from "@elizaos/core"; +import type { + Evaluator, + EvaluatorProcessorContext, + EvaluatorPromptContext, + EvaluatorRunContext, + JSONSchema, + Memory, +} from "@elizaos/core"; import type { AppServices } from "@/services"; -export function createMemoryNudgeEvaluator(services: AppServices): Evaluator { +type MemoryNudgeOutput = { + shouldStore: boolean; + target: "user" | "memory"; + fact: string; +}; + +const MEMORY_NUDGE_SCHEMA: JSONSchema = { + type: "object", + additionalProperties: false, + required: ["shouldStore", "target", "fact"], + properties: { + shouldStore: { + type: "boolean", + description: "Whether the message contains a durable fact worth saving.", + }, + target: { + type: "string", + enum: ["user", "memory"], + description: + 'Use "user" for personal preferences about the user, otherwise "memory".', + }, + fact: { + type: "string", + description: "The normalized fact to persist, without the leading cue.", + }, + }, +}; + +const REMEMBER_CUE = /remember|save that|keep in mind/iu; + +function extractText(message: Memory): string { + const content = message.content; + if (typeof content === "string") { + return content; + } + return content?.text ?? ""; +} + +/** + * Persists explicit "remember this" cues into the Doolittle memory stores. + * + * Rewritten for the ElizaOS 2.0 beta evaluator contract: the regex still gates + * whether the evaluator runs, but fact extraction is delegated to the model + * (via `schema`/`prompt`/`parse`) and the write happens in a processor. + */ +export function createMemoryNudgeEvaluator( + services: AppServices, +): Evaluator { return { name: "memoryNudge", description: "Stores explicit remember/save cues in the persistent memory stores.", - alwaysRun: true, similes: ["remember this", "save preference", "persist fact"], - examples: [ - { - prompt: "Remember that this repository uses Bun only.", - messages: [ - { - name: "user", - content: { - text: "Remember that this repository uses Bun only.", - }, - }, - ], - outcome: - "The evaluator saves the preference into user or project memory.", - }, - ], - validate: async (_runtime: IAgentRuntime, message: Memory) => { - const text = - typeof message.content === "string" - ? message.content - : message.content?.text; - return Boolean(text && /remember|save that|keep in mind/iu.test(text)); + schema: MEMORY_NUDGE_SCHEMA, + shouldRun: async ({ message }: EvaluatorRunContext) => { + const text = extractText(message); + return Boolean(text && REMEMBER_CUE.test(text)); + }, + prompt: ({ message }: EvaluatorPromptContext) => { + const text = extractText(message); + return [ + "The user asked the agent to remember something.", + `Message: "${text}"`, + "", + "Decide whether there is a durable fact worth persisting.", + 'Set "target" to "user" for personal preferences (for example "I prefer",', + '"my preference", "remember that I"), otherwise "memory".', + 'Strip leading cues such as "please" or "remember that" from the stored fact.', + ].join("\n"); }, - handler: async (_runtime: IAgentRuntime, message: Memory) => { - const text = - typeof message.content === "string" - ? message.content - : message.content?.text; - if (!text) { - return undefined; + parse: (output: unknown): MemoryNudgeOutput | null => { + if (!output || typeof output !== "object") { + return null; } - - const target = /i prefer|my preference|remember that i/iu.test(text) - ? "user" - : "memory"; - const normalized = text - .replace(/^please\s+/iu, "") - .replace(/^remember that\s+/iu, "") - .trim(); - - try { - services.memory.add(target, normalized); - } catch { - // Ignore duplicate or over-limit writes inside the evaluator path. + const candidate = output as Record; + const fact = + typeof candidate.fact === "string" ? candidate.fact.trim() : ""; + if (!fact) { + return null; } - - return undefined; + return { + shouldStore: candidate.shouldStore !== false, + target: candidate.target === "user" ? "user" : "memory", + fact, + }; }, + processors: [ + { + name: "persist-memory-nudge", + process: async ({ + output, + }: EvaluatorProcessorContext) => { + if (!output.shouldStore || !output.fact) { + return undefined; + } + try { + services.memory.add(output.target, output.fact); + } catch { + // Ignore duplicate or over-limit writes inside the evaluator path. + } + return undefined; + }, + }, + ], }; } diff --git a/packages/agent/src/runtime/action-result-metadata.ts b/packages/agent/src/runtime/action-result-metadata.ts index 977a852d..aaff940d 100644 --- a/packages/agent/src/runtime/action-result-metadata.ts +++ b/packages/agent/src/runtime/action-result-metadata.ts @@ -2,8 +2,8 @@ import type { CodingIteration, CommandResult, FileOperation, -} from "@elizaos/agent/services/coding-agent-context"; -import { validateCodingIteration } from "@elizaos/agent/services/coding-agent-context"; +} from "@elizaos/autonomous/services/coding-agent-context"; +import { validateCodingIteration } from "@elizaos/autonomous/services/coding-agent-context"; import type { ActionResult, ProviderDataRecord } from "@elizaos/core"; import type { LocalMutationInput } from "@/services/run-controller-service"; diff --git a/packages/agent/src/runtime/chat-turn-post-provider.test.ts b/packages/agent/src/runtime/chat-turn-post-provider.test.ts index 2f13318b..5befffc1 100644 --- a/packages/agent/src/runtime/chat-turn-post-provider.test.ts +++ b/packages/agent/src/runtime/chat-turn-post-provider.test.ts @@ -504,4 +504,72 @@ describe("chat turn post-provider seam", () => { }, ]); }); + + it("accepts shell-scaffolded turns when a successful RUN_IN_TERMINAL command landed", async () => { + const harness = createContext({ observedActionCount: 0 }); + const scaffoldMessage = + 'Go to ~/symbiex/dev and create a folder named "the-game". In the folder, build a react app (use bunx or npx to scaffold from an official boilerplate).'; + + const result = await runPostProviderTurn({ + input: { + userId: "alice", + message: scaffoldMessage, + source: "cli", + }, + effectiveInput: { + userId: "alice", + message: scaffoldMessage, + source: "cli", + }, + context: harness.context, + turn: createTurn(), + response: "Scaffolded the-game.", + actionResults: [ + { + success: true, + text: "bunx create-vite the-game --template react", + data: { + actionName: "RUN_IN_TERMINAL", + commandResult: { + command: "bunx create-vite the-game --template react", + exitCode: 0, + stdout: "Scaffolding project in ~/dev/the-game...", + stderr: "", + executedIn: "/Users/symbiex/dev", + success: true, + }, + }, + }, + ], + settingsDuring: { + model: { + provider: "devin", + model: "swe-1-6-fast", + }, + } as Parameters[0]["settingsDuring"], + scheduleProfileObservation: () => undefined, + loadDirectLocalIntent: async () => ({ + directLocalIntent: null, + executeDirectLocalIntent: async () => "unused", + isHighConfidenceDirectLocalIntent: () => false, + requiresModelSynthesisForLocalIntent: () => false, + shouldUseDirectLocalFallback: () => false, + }), + approveDirectLocalIntent: async () => undefined, + }); + + expect(result).toMatchObject({ + kind: "final", + runFailureMessage: undefined, + observedActionCount: 1, + usedFallback: false, + }); + expect(harness.finishEvents).toEqual([ + { + sessionId: "session-1", + status: "complete", + message: undefined, + }, + ]); + }); }); diff --git a/packages/agent/src/runtime/chat-turn/execution-contract.ts b/packages/agent/src/runtime/chat-turn/execution-contract.ts index e66a3c5f..a6a26a5d 100644 --- a/packages/agent/src/runtime/chat-turn/execution-contract.ts +++ b/packages/agent/src/runtime/chat-turn/execution-contract.ts @@ -1,12 +1,17 @@ +import type { CommandResult } from "@elizaos/autonomous/services/coding-agent-context"; import type { ActionResult } from "@elizaos/core"; import { summarizeActionResults } from "@/runtime/action-result-metadata"; import { classifyTurnMessage } from "@/runtime/turn-classification/message"; import type { LocalMutationInput } from "@/services/run-controller-service"; const FILE_MUTATION_REQUEST_PATTERN = - /\b(?:create|make|write|add|edit|update|change|modify|patch|delete|remove|scaffold|build|generate|save|mkdir|touch)\b[\s\S]*\b(?:file|files|folder|directory|html|css|js|javascript|typescript|json|md|markdown|website|site|project)\b|\b(?:file|files|folder|directory|html|css|js|javascript|typescript|json|md|markdown|website|site|project)\b[\s\S]*\b(?:create|make|write|add|edit|update|change|modify|patch|delete|remove|scaffold|build|generate|save|mkdir|touch)\b/iu; + /\b(?:create|make|write|add|edit|update|change|modify|patch|delete|remove|scaffold|build|generate|save|mkdir|touch)\b[\s\S]*\b(?:file|files|folder|directory|html|css|js|javascript|typescript|json|md|markdown|website|site|project|app|application)\b|\b(?:file|files|folder|directory|html|css|js|javascript|typescript|json|md|markdown|website|site|project|app|application)\b[\s\S]*\b(?:create|make|write|add|edit|update|change|modify|patch|delete|remove|scaffold|build|generate|save|mkdir|touch)\b/iu; const FILE_WRITE_REQUEST_PATTERN = /\b(?:create|make|write|add|edit|update|change|modify|patch|scaffold|build|generate|save|touch)\b[\s\S]*\b(?:file|files|html|css|js|javascript|typescript|json|md|markdown|website|site|page)\b|\b(?:file|files|html|css|js|javascript|typescript|json|md|markdown|website|site|page)\b[\s\S]*\b(?:create|make|write|add|edit|update|change|modify|patch|scaffold|build|generate|save|touch)\b/iu; +const SHELL_SCAFFOLD_REQUEST_PATTERN = + /\b(?:bunx|npx|pnpm\s+(?:dlx|create)|yarn\s+(?:create|dlx)|npm\s+(?:init|create|exec)|create-(?:react-app|next-app|vite|tauri-app|t3-app|expo-app|nuxt-app|svelte-app|astro)|cargo\s+(?:new|init)|git\s+clone|anchor\s+init|vite|next|nuxt|astro|expo|sveltekit|hardhat|forge|spl-token|metaplex)\b/iu; +const SHELL_SCAFFOLD_COMMAND_PATTERN = + /\b(?:bunx|npx|pnpm|yarn|npm|create-(?:react-app|next-app|vite|tauri-app|t3-app|expo-app|nuxt-app|svelte-app|astro)|cargo\s+(?:new|init|build|test|run)|git\s+clone|anchor|forge|hardhat|vite|next|expo|sveltekit|spl-token|metaplex|mkdir|cp|mv|rsync)\b/iu; const EMPTY_PROVIDER_EXECUTION_PATTERN = /^🔎\s*Provider executed:\s*\[\]\s*$/u; @@ -55,14 +60,24 @@ export function buildTurnExecutionContract(input: { (classification.likelyLocalTask || classification.shouldUseMultiStep); const requiresMutationProof = requiresLocalExecution && FILE_MUTATION_REQUEST_PATTERN.test(input.message); + const shellScaffoldRequested = SHELL_SCAFFOLD_REQUEST_PATTERN.test( + input.message, + ); + + const requiredMutationActions: string[] = []; + if (requiresMutationProof) { + if (FILE_WRITE_REQUEST_PATTERN.test(input.message)) { + requiredMutationActions.push("WRITE_FILE", "PATCH_FILE"); + } + if (shellScaffoldRequested) { + requiredMutationActions.push("RUN_IN_TERMINAL"); + } + } return { requiresLocalExecution, requiresMutationProof, - requiredMutationActions: - requiresMutationProof && FILE_WRITE_REQUEST_PATTERN.test(input.message) - ? ["WRITE_FILE", "PATCH_FILE"] - : [], + requiredMutationActions, reason: requiresMutationProof ? "local file mutation requested" : requiresLocalExecution @@ -71,12 +86,20 @@ export function buildTurnExecutionContract(input: { }; } +function commandResultLooksLikeMutation(result: CommandResult): boolean { + if (!result.success || result.exitCode !== 0) { + return false; + } + return SHELL_SCAFFOLD_COMMAND_PATTERN.test(result.command); +} + export function assessTurnExecutionContract(input: { contract: TurnExecutionContract; response: string; observedActionCount: number; actionResults?: ActionResult[]; localMutations?: LocalMutationInput[]; + commandResults?: CommandResult[]; runFailureMessage?: string; }): TurnExecutionAssessment { if (!input.contract.requiresLocalExecution || input.runFailureMessage) { @@ -92,6 +115,13 @@ export function assessTurnExecutionContract(input: { ...actionResultSummary.localMutations, ...(input.localMutations ?? []), ]; + const commandResults = [ + ...actionResultSummary.commandResults, + ...(input.commandResults ?? []), + ]; + const scaffoldingCommands = commandResults.filter( + commandResultLooksLikeMutation, + ); if ( observedActionCount === 0 && @@ -116,7 +146,8 @@ export function assessTurnExecutionContract(input: { const successfulMutation = localMutations.some( (mutation) => mutation.success, ); - if (!successfulMutation) { + const successfulScaffoldCommand = scaffoldingCommands.length > 0; + if (!successfulMutation && !successfulScaffoldCommand) { const failedMutation = summarizeFailedMutation(localMutations); return { ok: false, @@ -127,15 +158,16 @@ export function assessTurnExecutionContract(input: { } if (input.contract.requiredMutationActions.length > 0) { + const required = input.contract.requiredMutationActions; const hasRequiredMutation = localMutations.some( - (mutation) => - mutation.success && - input.contract.requiredMutationActions.includes(mutation.action), + (mutation) => mutation.success && required.includes(mutation.action), ); - if (!hasRequiredMutation) { + const hasRequiredCommand = + required.includes("RUN_IN_TERMINAL") && successfulScaffoldCommand; + if (!hasRequiredMutation && !hasRequiredCommand) { return { ok: false, - failureMessage: `Native execution failed: the requested file write did not land. Expected one of ${input.contract.requiredMutationActions.join(", ")}.`, + failureMessage: `Native execution failed: the requested file write did not land. Expected one of ${required.join(", ")}.`, }; } } diff --git a/packages/agent/src/runtime/chat-turn/post-provider.ts b/packages/agent/src/runtime/chat-turn/post-provider.ts index 9b7aa135..ec69a429 100644 --- a/packages/agent/src/runtime/chat-turn/post-provider.ts +++ b/packages/agent/src/runtime/chat-turn/post-provider.ts @@ -50,6 +50,7 @@ export async function runPostProviderTurn( observedActionCount, actionResults: input.actionResults, localMutations: activeRun?.localMutations, + commandResults: actionResultSummary.commandResults, runFailureMessage: fallbackResult.runFailureMessage, }); const runFailureMessage = executionAssessment.ok diff --git a/packages/agent/src/runtime/linked-provider-accounts/messages.ts b/packages/agent/src/runtime/linked-provider-accounts/messages.ts index 344f1e26..524cd07f 100644 --- a/packages/agent/src/runtime/linked-provider-accounts/messages.ts +++ b/packages/agent/src/runtime/linked-provider-accounts/messages.ts @@ -1,4 +1,4 @@ -import { resolveCloudApiBaseUrl } from "@elizaos/agent/cloud/base-url"; +import { resolveCloudApiBaseUrl } from "@elizaos/autonomous/cloud/base-url"; import { displayCommand } from "@/runtime/commands/command-execution"; export const ELIZA_CLOUD_BILLING_URL = diff --git a/packages/agent/src/runtime/linked-provider-accounts/model-settings.ts b/packages/agent/src/runtime/linked-provider-accounts/model-settings.ts index 117a062d..a309c4c7 100644 --- a/packages/agent/src/runtime/linked-provider-accounts/model-settings.ts +++ b/packages/agent/src/runtime/linked-provider-accounts/model-settings.ts @@ -1,4 +1,4 @@ -import { resolveCloudApiBaseUrl } from "@elizaos/agent/cloud/base-url"; +import { resolveCloudApiBaseUrl } from "@elizaos/autonomous/cloud/base-url"; import type { AgentExecutionContext } from "../chat"; import { normalizeElizaCloudBaseUrl } from "./messages"; import type { LinkedProviderName } from "./types"; diff --git a/packages/agent/src/runtime/linked-provider-accounts/readiness.test.ts b/packages/agent/src/runtime/linked-provider-accounts/readiness.test.ts index 1c669d1b..95c7ce78 100644 --- a/packages/agent/src/runtime/linked-provider-accounts/readiness.test.ts +++ b/packages/agent/src/runtime/linked-provider-accounts/readiness.test.ts @@ -49,7 +49,7 @@ function installReadinessMocks() { }, })); - mock.module("@elizaos/agent/cloud/validate-url", () => ({ + mock.module("@elizaos/autonomous/cloud/validate-url", () => ({ validateCloudBaseUrl: async () => null, })); } diff --git a/packages/agent/src/runtime/linked-provider-accounts/readiness.ts b/packages/agent/src/runtime/linked-provider-accounts/readiness.ts index 5a62a4cf..97959c79 100644 --- a/packages/agent/src/runtime/linked-provider-accounts/readiness.ts +++ b/packages/agent/src/runtime/linked-provider-accounts/readiness.ts @@ -1,4 +1,4 @@ -import { validateCloudBaseUrl } from "@elizaos/agent/cloud/validate-url"; +import { validateCloudBaseUrl } from "@elizaos/autonomous/cloud/validate-url"; import { displayCommand } from "@/runtime/commands/command-execution"; import { getLinkedProviderAccountsSnapshot, diff --git a/packages/agent/src/runtime/native/account-auth/elizacloud-support.ts b/packages/agent/src/runtime/native/account-auth/elizacloud-support.ts index 36edf9ef..f40ba4c9 100644 --- a/packages/agent/src/runtime/native/account-auth/elizacloud-support.ts +++ b/packages/agent/src/runtime/native/account-auth/elizacloud-support.ts @@ -1,4 +1,4 @@ -import { resolveCloudApiBaseUrl } from "@elizaos/agent/cloud/base-url"; +import { resolveCloudApiBaseUrl } from "@elizaos/autonomous/cloud/base-url"; import { commandExists } from "./shared"; import { getStoredElizaCloudCredentials, diff --git a/packages/agent/src/runtime/native/account-auth/store.ts b/packages/agent/src/runtime/native/account-auth/store.ts index a1dfad64..fb32d970 100644 --- a/packages/agent/src/runtime/native/account-auth/store.ts +++ b/packages/agent/src/runtime/native/account-auth/store.ts @@ -1,6 +1,6 @@ import { existsSync } from "node:fs"; import { isAbsolute, join } from "node:path"; -import { resolveCloudApiBaseUrl } from "@elizaos/agent/cloud/base-url"; +import { resolveCloudApiBaseUrl } from "@elizaos/autonomous/cloud/base-url"; import { hasTokenCredentials } from "./credentials"; import { readJson, writeJson } from "./shared"; import type { diff --git a/packages/agent/src/runtime/native/autonomous-stack/index.ts b/packages/agent/src/runtime/native/autonomous-stack/index.ts index d6cbb8b7..35baafe9 100644 --- a/packages/agent/src/runtime/native/autonomous-stack/index.ts +++ b/packages/agent/src/runtime/native/autonomous-stack/index.ts @@ -1,7 +1,3 @@ -import type {} from "@elizaos/agent"; -import type {} from "@elizaos/autonomous"; -import type {} from "@elizaos/skills"; - export { describeAutonomousAlignment } from "./alignment"; export { buildAutonomousCompatConfig } from "./compat-config"; export { buildAutonomousCompatEnv } from "./compat-env"; diff --git a/packages/agent/src/runtime/native/plugin-registry/local-ollama.ts b/packages/agent/src/runtime/native/plugin-registry/local-ollama.ts index 04dd9458..a32f2431 100644 --- a/packages/agent/src/runtime/native/plugin-registry/local-ollama.ts +++ b/packages/agent/src/runtime/native/plugin-registry/local-ollama.ts @@ -156,7 +156,6 @@ function modelForType( case ModelType.RESPONSE_HANDLER: return response; case ModelType.TEXT_SMALL: - case ModelType.OBJECT_SMALL: return small; case ModelType.TEXT_MEDIUM: case ModelType.TEXT_REASONING_SMALL: diff --git a/packages/agent/src/runtime/native/service-bridge/tooling/context.ts b/packages/agent/src/runtime/native/service-bridge/tooling/context.ts index c48438b5..0299f120 100644 --- a/packages/agent/src/runtime/native/service-bridge/tooling/context.ts +++ b/packages/agent/src/runtime/native/service-bridge/tooling/context.ts @@ -4,7 +4,7 @@ import { createCodingAgentContext, injectFeedback, validateCodingAgentContext, -} from "@elizaos/agent/services/coding-agent-context"; +} from "@elizaos/autonomous/services/coding-agent-context"; import type { AppServices } from "@/services"; import type { RuntimeLike } from "../runtime-contracts"; import { getNativeCodingAgent } from "./native-services"; diff --git a/packages/agent/src/runtime/native/service-bridge/tooling/index.test.ts b/packages/agent/src/runtime/native/service-bridge/tooling/index.test.ts index b576cfac..007f034b 100644 --- a/packages/agent/src/runtime/native/service-bridge/tooling/index.test.ts +++ b/packages/agent/src/runtime/native/service-bridge/tooling/index.test.ts @@ -7,7 +7,7 @@ import type { CodingAgentContext, CodingIteration, HumanFeedback, -} from "@elizaos/agent/services/coding-agent-context"; +} from "@elizaos/autonomous/services/coding-agent-context"; import type { AppServices } from "@/services"; import type { RuntimeLike } from "../runtime"; import { diff --git a/packages/agent/src/runtime/native/service-bridge/tooling/types.ts b/packages/agent/src/runtime/native/service-bridge/tooling/types.ts index 7410bcc2..fc39ff6d 100644 --- a/packages/agent/src/runtime/native/service-bridge/tooling/types.ts +++ b/packages/agent/src/runtime/native/service-bridge/tooling/types.ts @@ -3,7 +3,7 @@ import type { ConnectorType, HumanFeedback, InteractionMode, -} from "@elizaos/agent/services/coding-agent-context"; +} from "@elizaos/autonomous/services/coding-agent-context"; export interface EffectiveCodingAgentContextInput { sessionId: string; diff --git a/packages/agent/src/services/diagnostics/provider-ownership/context.test.ts b/packages/agent/src/services/diagnostics/provider-ownership/context.test.ts index 605e020a..9b32f3c4 100644 --- a/packages/agent/src/services/diagnostics/provider-ownership/context.test.ts +++ b/packages/agent/src/services/diagnostics/provider-ownership/context.test.ts @@ -94,7 +94,7 @@ describe("collectProviderOwnershipContext", () => { getNativePackageAudit: () => nativeAudit, getNativePluginCatalog: () => nativePluginCatalog, getLinkedProviderAccountsSnapshot: () => linkedAccounts, - resolveCloudApiBaseUrl: (value) => `resolved:${value}`, + resolveCloudApiBaseUrl: (value?: string) => `resolved:${value}`, validateCloudBaseUrl: async () => null, }, }); @@ -204,7 +204,7 @@ describe("collectProviderOwnershipContext", () => { getNativePackageAudit: () => nativeAudit, getNativePluginCatalog: () => nativePluginCatalog, getLinkedProviderAccountsSnapshot: () => linkedAccounts, - resolveCloudApiBaseUrl: (value) => `resolved:${value}`, + resolveCloudApiBaseUrl: (value?: string) => `resolved:${value}`, validateCloudBaseUrl: async () => null, }, }); diff --git a/packages/agent/src/services/diagnostics/provider-ownership/context.ts b/packages/agent/src/services/diagnostics/provider-ownership/context.ts index 8e6cd2f2..e1d051e7 100644 --- a/packages/agent/src/services/diagnostics/provider-ownership/context.ts +++ b/packages/agent/src/services/diagnostics/provider-ownership/context.ts @@ -1,6 +1,6 @@ import { join } from "node:path"; -import { resolveCloudApiBaseUrl } from "@elizaos/agent/cloud/base-url"; -import { validateCloudBaseUrl } from "@elizaos/agent/cloud/validate-url"; +import { resolveCloudApiBaseUrl } from "@elizaos/autonomous/cloud/base-url"; +import { validateCloudBaseUrl } from "@elizaos/autonomous/cloud/validate-url"; import { getLinkedProviderAccountsSnapshot } from "@/runtime/native/account-auth"; import { getNativePackageAudit } from "@/runtime/native/package-audit"; import { getNativePluginCatalog } from "@/runtime/native/plugin-catalog"; diff --git a/packages/agent/src/services/media/types.ts b/packages/agent/src/services/media/types.ts index 45c264de..c0f7375e 100644 --- a/packages/agent/src/services/media/types.ts +++ b/packages/agent/src/services/media/types.ts @@ -1,7 +1,7 @@ import type { ConnectorType, InteractionMode, -} from "@elizaos/agent/services/coding-agent-context"; +} from "@elizaos/autonomous/services/coding-agent-context"; export interface MediaInspection { path: string; diff --git a/packages/agent/src/services/trajectory/sdk-native.ts b/packages/agent/src/services/trajectory/sdk-native.ts index de48712c..19208ad2 100644 --- a/packages/agent/src/services/trajectory/sdk-native.ts +++ b/packages/agent/src/services/trajectory/sdk-native.ts @@ -5,7 +5,7 @@ import type { TrajectoryExportResult as SdkTrajectoryExportResult, TrajectoryListOptions as SdkTrajectoryListOptions, TrajectoryListResult as SdkTrajectoryListResult, -} from "@elizaos/agent/types/trajectory"; +} from "@elizaos/core"; import { type IAgentRuntime, resolveTrajectoryLogger, diff --git a/packages/agent/src/types/trajectory/sdk.ts b/packages/agent/src/types/trajectory/sdk.ts index ecd2f0aa..800219e4 100644 --- a/packages/agent/src/types/trajectory/sdk.ts +++ b/packages/agent/src/types/trajectory/sdk.ts @@ -1,14 +1,37 @@ -export type { - Trajectory as SdkTrajectory, - TrajectoryExportOptions as SdkTrajectoryExportOptions, - TrajectoryExportResult as SdkTrajectoryExportResult, - TrajectoryListItem as SdkTrajectoryListItem, - TrajectoryListOptions as SdkTrajectoryListOptions, - TrajectoryListResult as SdkTrajectoryListResult, - TrajectoryLlmCall as SdkTrajectoryLlmCall, - TrajectoryProviderAccess as SdkTrajectoryProviderAccess, - TrajectoryStatus as SdkTrajectoryStatus, - TrajectoryStep as SdkTrajectoryStep, - TrajectoryStepId as SdkTrajectoryStepId, - TrajectoryStepKind as SdkTrajectoryStepKind, -} from "@elizaos/agent/types/trajectory"; +// Convenience aliases over the ElizaOS SDK trajectory record types. +// +// As of the 2.0 beta line these records live in `@elizaos/core` (they were +// previously re-exported through `@elizaos/agent/types/trajectory`). The +// `Sdk*` names below preserve the friendlier shape the rest of the Doolittle +// trajectory layer consumes. +import type { + TrajectoryCacheStatsRecord, + TrajectoryDetailRecord, + TrajectoryExportOptions, + TrajectoryExportResult, + TrajectoryFlattenedLlmCallRecord, + TrajectoryListOptions, + TrajectoryListResult, + TrajectoryLlmCallRecord, + TrajectoryProviderAccessRecord, + TrajectoryStatus, + TrajectoryStepId, + TrajectoryStepKind, + TrajectoryStepRecord, + TrajectorySummaryRecord, +} from "@elizaos/core"; + +export type SdkTrajectory = TrajectoryDetailRecord; +export type SdkTrajectoryExportOptions = TrajectoryExportOptions; +export type SdkTrajectoryExportResult = TrajectoryExportResult; +export type SdkTrajectoryListItem = TrajectorySummaryRecord; +export type SdkTrajectoryListOptions = TrajectoryListOptions; +export type SdkTrajectoryListResult = TrajectoryListResult; +export type SdkTrajectoryLlmCall = TrajectoryLlmCallRecord; +export type SdkTrajectoryProviderAccess = TrajectoryProviderAccessRecord; +export type SdkTrajectoryStatus = TrajectoryStatus; +export type SdkTrajectoryStep = TrajectoryStepRecord; +export type SdkTrajectoryStepId = TrajectoryStepId; +export type SdkTrajectoryStepKind = TrajectoryStepKind; +export type SdkTrajectoryCacheStats = TrajectoryCacheStatsRecord; +export type SdkTrajectoryFlattenedLlmCall = TrajectoryFlattenedLlmCallRecord; diff --git a/packages/contracts/package.json b/packages/contracts/package.json index 76a1ff4f..c576e9a3 100644 --- a/packages/contracts/package.json +++ b/packages/contracts/package.json @@ -5,8 +5,5 @@ "type": "module", "exports": { ".": "./src/index.ts" - }, - "dependencies": { - "@elizaos/core": "2.0.0-alpha.537" } } diff --git a/packages/plugins/doolittle-plugin/coding-agent/runtime.test.ts b/packages/plugins/doolittle-plugin/coding-agent/runtime.test.ts index a42d95dd..dd1e56d3 100644 --- a/packages/plugins/doolittle-plugin/coding-agent/runtime.test.ts +++ b/packages/plugins/doolittle-plugin/coding-agent/runtime.test.ts @@ -2,7 +2,7 @@ import { describe, expect, it } from "bun:test"; import type { CodingIteration, HumanFeedback, -} from "@elizaos/agent/services/coding-agent-context"; +} from "@elizaos/autonomous/services/coding-agent-context"; import { buildCodingAgentContext } from "./runtime"; describe("coding agent runtime context", () => { diff --git a/packages/plugins/doolittle-plugin/coding-agent/runtime.ts b/packages/plugins/doolittle-plugin/coding-agent/runtime.ts index f2b73750..49e2e619 100644 --- a/packages/plugins/doolittle-plugin/coding-agent/runtime.ts +++ b/packages/plugins/doolittle-plugin/coding-agent/runtime.ts @@ -5,7 +5,7 @@ import { createCodingAgentContext, injectFeedback, validateCodingAgentContext, -} from "@elizaos/agent/services/coding-agent-context"; +} from "@elizaos/autonomous/services/coding-agent-context"; import type { CodingAgentContextOptions } from "./types"; export interface BuildCodingAgentContextOptions { diff --git a/packages/plugins/doolittle-plugin/coding-agent/types.ts b/packages/plugins/doolittle-plugin/coding-agent/types.ts index 2be55c71..4452d722 100644 --- a/packages/plugins/doolittle-plugin/coding-agent/types.ts +++ b/packages/plugins/doolittle-plugin/coding-agent/types.ts @@ -3,7 +3,7 @@ import type { ConnectorType, HumanFeedback, InteractionMode, -} from "@elizaos/agent/services/coding-agent-context"; +} from "@elizaos/autonomous/services/coding-agent-context"; export interface WorkspaceServiceLike { read(path: string): string; diff --git a/packages/plugins/doolittle-plugin/model-fallback.ts b/packages/plugins/doolittle-plugin/model-fallback.ts index c22f245b..f66d3bbf 100644 --- a/packages/plugins/doolittle-plugin/model-fallback.ts +++ b/packages/plugins/doolittle-plugin/model-fallback.ts @@ -1,5 +1,6 @@ import type { EnvConfig } from "@doolittle/agent/plugin-api"; import type { GenerateTextParams, IAgentRuntime } from "@elizaos/core"; +import { resolveModelPromptText } from "./prompt-text"; import { readRuntimeModelSettings } from "./runtime-settings"; export function hasConfiguredModelProvider(config: EnvConfig): boolean { @@ -23,6 +24,7 @@ export function createOpenAiBackedTextModel(config: EnvConfig) { const model = modelSettings?.model ?? config.openAiModel; const temperature = modelSettings?.temperature ?? config.openAiTemperature; const maxTokens = modelSettings?.maxTokens ?? config.openAiMaxTokens; + const promptText = resolveModelPromptText(params); if (!config.openAiApiKey) { return [ @@ -30,7 +32,7 @@ export function createOpenAiBackedTextModel(config: EnvConfig) { "Set OPENAI_API_KEY to enable real model-backed responses.", "", "Prompt excerpt:", - params.prompt.slice(0, 600), + promptText.slice(0, 600), ].join("\n"); } @@ -47,7 +49,7 @@ export function createOpenAiBackedTextModel(config: EnvConfig) { messages: [ { role: "user", - content: params.prompt, + content: promptText, }, ], }), diff --git a/packages/plugins/doolittle-plugin/prompt-text.ts b/packages/plugins/doolittle-plugin/prompt-text.ts new file mode 100644 index 00000000..418047c5 --- /dev/null +++ b/packages/plugins/doolittle-plugin/prompt-text.ts @@ -0,0 +1,31 @@ +import type { GenerateTextParams } from "@elizaos/core"; + +/** + * Resolve the prompt text for a model request. + * + * ElizaOS 2.0 beta made `GenerateTextParams.prompt` optional: native v5 chat + * paths emit `messages` and leave `prompt` undefined. Prompt-only providers + * that previously read `params.prompt` directly would silently send empty + * content on those paths, so fall back to concatenating message text when no + * legacy prompt string is present. + */ +export function resolveModelPromptText(params: GenerateTextParams): string { + if (typeof params.prompt === "string" && params.prompt.trim().length > 0) { + return params.prompt; + } + return (params.messages ?? []) + .map((message) => { + const { content } = message; + if (typeof content === "string") { + return content; + } + if (Array.isArray(content)) { + return content + .map((part) => (part.type === "text" ? part.text : "")) + .join(""); + } + return ""; + }) + .filter((entry) => entry.trim().length > 0) + .join("\n"); +} diff --git a/packages/plugins/plugin-claude-code/package.json b/packages/plugins/plugin-claude-code/package.json index cf10f5c3..cfc74c8e 100644 --- a/packages/plugins/plugin-claude-code/package.json +++ b/packages/plugins/plugin-claude-code/package.json @@ -28,6 +28,6 @@ "access": "public" }, "dependencies": { - "@elizaos/core": "2.0.0-alpha.537" + "@elizaos/core": "2.0.0-beta.1" } } diff --git a/packages/plugins/plugin-claude-code/src/anthropic.ts b/packages/plugins/plugin-claude-code/src/anthropic.ts index b021caf5..358eedcf 100644 --- a/packages/plugins/plugin-claude-code/src/anthropic.ts +++ b/packages/plugins/plugin-claude-code/src/anthropic.ts @@ -10,6 +10,7 @@ import { DEFAULT_ANTHROPIC_BASE_URL, OAUTH_ONLY_BETAS, } from "./constants"; +import { resolveModelPromptText } from "./prompt-text"; import { getRuntimeModelSettings, getRuntimeProvider, @@ -53,6 +54,7 @@ export async function runClaudeCodeTextGeneration( const accessToken = credentials?.accessToken?.trim(); const runtimeModel = getRuntimeModelSettings(runtime); const model = runtimeModel.model || "claude-sonnet-4.6"; + const promptText = resolveModelPromptText(params); if (!accessToken) { if (!options.allowCliFallback) { @@ -63,7 +65,7 @@ export async function runClaudeCodeTextGeneration( const cliOutput = await ( options.invokeCliPrint ?? invokeClaudeCodeCliPrint )({ - prompt: params.prompt, + prompt: promptText, model, appendSystemPrompt: withClaudeCodeSystemPrefix()[0]?.text, }); @@ -79,7 +81,7 @@ export async function runClaudeCodeTextGeneration( messages: [ { role: "user", - content: params.prompt, + content: promptText, }, ], }; diff --git a/packages/plugins/plugin-claude-code/src/prompt-text.ts b/packages/plugins/plugin-claude-code/src/prompt-text.ts new file mode 100644 index 00000000..418047c5 --- /dev/null +++ b/packages/plugins/plugin-claude-code/src/prompt-text.ts @@ -0,0 +1,31 @@ +import type { GenerateTextParams } from "@elizaos/core"; + +/** + * Resolve the prompt text for a model request. + * + * ElizaOS 2.0 beta made `GenerateTextParams.prompt` optional: native v5 chat + * paths emit `messages` and leave `prompt` undefined. Prompt-only providers + * that previously read `params.prompt` directly would silently send empty + * content on those paths, so fall back to concatenating message text when no + * legacy prompt string is present. + */ +export function resolveModelPromptText(params: GenerateTextParams): string { + if (typeof params.prompt === "string" && params.prompt.trim().length > 0) { + return params.prompt; + } + return (params.messages ?? []) + .map((message) => { + const { content } = message; + if (typeof content === "string") { + return content; + } + if (Array.isArray(content)) { + return content + .map((part) => (part.type === "text" ? part.text : "")) + .join(""); + } + return ""; + }) + .filter((entry) => entry.trim().length > 0) + .join("\n"); +} diff --git a/packages/plugins/plugin-codex/package.json b/packages/plugins/plugin-codex/package.json index 9eace7b0..5c04adea 100644 --- a/packages/plugins/plugin-codex/package.json +++ b/packages/plugins/plugin-codex/package.json @@ -28,6 +28,6 @@ "access": "public" }, "dependencies": { - "@elizaos/core": "2.0.0-alpha.537" + "@elizaos/core": "2.0.0-beta.1" } } diff --git a/packages/plugins/plugin-codex/src/generate.ts b/packages/plugins/plugin-codex/src/generate.ts index 382fab31..a48df745 100644 --- a/packages/plugins/plugin-codex/src/generate.ts +++ b/packages/plugins/plugin-codex/src/generate.ts @@ -4,6 +4,7 @@ import { DEFAULT_CODEX_INSTRUCTIONS, DEFAULT_CODEX_MODEL, } from "./constants"; +import { resolveModelPromptText } from "./prompt-text"; import { getRuntimeModelSettings, getRuntimeProvider } from "./runtime"; import { readCodexResponseText } from "./sse"; import type { CodexPluginOptions } from "./types"; @@ -35,7 +36,7 @@ function createCodexRequestPayload( content: [ { type: "input_text", - text: params.prompt, + text: resolveModelPromptText(params), }, ], }, diff --git a/packages/plugins/plugin-codex/src/prompt-text.ts b/packages/plugins/plugin-codex/src/prompt-text.ts new file mode 100644 index 00000000..418047c5 --- /dev/null +++ b/packages/plugins/plugin-codex/src/prompt-text.ts @@ -0,0 +1,31 @@ +import type { GenerateTextParams } from "@elizaos/core"; + +/** + * Resolve the prompt text for a model request. + * + * ElizaOS 2.0 beta made `GenerateTextParams.prompt` optional: native v5 chat + * paths emit `messages` and leave `prompt` undefined. Prompt-only providers + * that previously read `params.prompt` directly would silently send empty + * content on those paths, so fall back to concatenating message text when no + * legacy prompt string is present. + */ +export function resolveModelPromptText(params: GenerateTextParams): string { + if (typeof params.prompt === "string" && params.prompt.trim().length > 0) { + return params.prompt; + } + return (params.messages ?? []) + .map((message) => { + const { content } = message; + if (typeof content === "string") { + return content; + } + if (Array.isArray(content)) { + return content + .map((part) => (part.type === "text" ? part.text : "")) + .join(""); + } + return ""; + }) + .filter((entry) => entry.trim().length > 0) + .join("\n"); +} diff --git a/packages/plugins/plugin-devin/package.json b/packages/plugins/plugin-devin/package.json index 3f66199f..24865129 100644 --- a/packages/plugins/plugin-devin/package.json +++ b/packages/plugins/plugin-devin/package.json @@ -28,6 +28,6 @@ "access": "public" }, "dependencies": { - "@elizaos/core": "2.0.0-alpha.537" + "@elizaos/core": "2.0.0-beta.1" } } diff --git a/packages/plugins/plugin-devin/src/generate.ts b/packages/plugins/plugin-devin/src/generate.ts index 0679dcda..6275edf2 100644 --- a/packages/plugins/plugin-devin/src/generate.ts +++ b/packages/plugins/plugin-devin/src/generate.ts @@ -5,6 +5,7 @@ import { DEFAULT_DEVIN_TIMEOUT_MS, invokeDevinCliPrint, } from "./cli"; +import { resolveModelPromptText } from "./prompt-text"; import { getRuntimeModelSettings, getRuntimeProvider, @@ -33,10 +34,11 @@ export async function runDevinTextGeneration( const runtimeModel = getRuntimeModelSettings(runtime); const model = runtimeModel.model || options.model || DEFAULT_DEVIN_MODEL; + const promptText = resolveModelPromptText(params); const startedAt = Date.now(); try { const output = await (options.invokeCliPrint ?? invokeDevinCliPrint)({ - prompt: params.prompt, + prompt: promptText, model, command: options.command || DEFAULT_DEVIN_COMMAND, cwd: options.cwd, @@ -46,7 +48,7 @@ export async function runDevinTextGeneration( runtime.logger?.info( { model, - promptChars: params.prompt.length, + promptChars: promptText.length, elapsedMs: Date.now() - startedAt, }, "[DOOLITTLE:DEVIN] Devin generate complete", @@ -57,7 +59,7 @@ export async function runDevinTextGeneration( { error, model, - promptChars: params.prompt.length, + promptChars: promptText.length, elapsedMs: Date.now() - startedAt, }, "[DOOLITTLE:DEVIN] Devin generate failed", diff --git a/packages/plugins/plugin-devin/src/prompt-text.ts b/packages/plugins/plugin-devin/src/prompt-text.ts new file mode 100644 index 00000000..418047c5 --- /dev/null +++ b/packages/plugins/plugin-devin/src/prompt-text.ts @@ -0,0 +1,31 @@ +import type { GenerateTextParams } from "@elizaos/core"; + +/** + * Resolve the prompt text for a model request. + * + * ElizaOS 2.0 beta made `GenerateTextParams.prompt` optional: native v5 chat + * paths emit `messages` and leave `prompt` undefined. Prompt-only providers + * that previously read `params.prompt` directly would silently send empty + * content on those paths, so fall back to concatenating message text when no + * legacy prompt string is present. + */ +export function resolveModelPromptText(params: GenerateTextParams): string { + if (typeof params.prompt === "string" && params.prompt.trim().length > 0) { + return params.prompt; + } + return (params.messages ?? []) + .map((message) => { + const { content } = message; + if (typeof content === "string") { + return content; + } + if (Array.isArray(content)) { + return content + .map((part) => (part.type === "text" ? part.text : "")) + .join(""); + } + return ""; + }) + .filter((entry) => entry.trim().length > 0) + .join("\n"); +} diff --git a/packages/plugins/plugin-elizacloud/package.json b/packages/plugins/plugin-elizacloud/package.json index 86b646df..97aa445a 100644 --- a/packages/plugins/plugin-elizacloud/package.json +++ b/packages/plugins/plugin-elizacloud/package.json @@ -28,7 +28,7 @@ "access": "public" }, "dependencies": { - "@elizaos/agent": "2.0.0-alpha.537", - "@elizaos/core": "2.0.0-alpha.537" + "@elizaos/autonomous": "2.0.0-alpha.85", + "@elizaos/core": "2.0.0-beta.1" } } diff --git a/packages/plugins/plugin-elizacloud/src/client.ts b/packages/plugins/plugin-elizacloud/src/client.ts index 9c144bb3..7ee2cac8 100644 --- a/packages/plugins/plugin-elizacloud/src/client.ts +++ b/packages/plugins/plugin-elizacloud/src/client.ts @@ -1,4 +1,5 @@ import type { GenerateTextParams } from "@elizaos/core"; +import { resolveModelPromptText } from "./prompt-text"; export async function postElizaCloudChatCompletion( endpoint: string, @@ -25,7 +26,7 @@ export async function postElizaCloudChatCompletion( messages: [ { role: "user", - content: params.prompt, + content: resolveModelPromptText(params), }, ], }), @@ -53,7 +54,7 @@ export async function postElizaCloudResponse( input: [ { role: "user", - content: params.prompt, + content: resolveModelPromptText(params), }, ], max_output_tokens: maxTokens, diff --git a/packages/plugins/plugin-elizacloud/src/constants.ts b/packages/plugins/plugin-elizacloud/src/constants.ts index 6c46324d..fed0cf02 100644 --- a/packages/plugins/plugin-elizacloud/src/constants.ts +++ b/packages/plugins/plugin-elizacloud/src/constants.ts @@ -1,4 +1,4 @@ -import { resolveCloudApiBaseUrl } from "@elizaos/agent/cloud/base-url"; +import { resolveCloudApiBaseUrl } from "@elizaos/autonomous/cloud/base-url"; export const DEFAULT_ELIZA_CLOUD_BASE_URL = resolveCloudApiBaseUrl(); export const DEFAULT_ELIZA_CLOUD_SMALL_MODEL = diff --git a/packages/plugins/plugin-elizacloud/src/generation.ts b/packages/plugins/plugin-elizacloud/src/generation.ts index a50491a9..a60917f2 100644 --- a/packages/plugins/plugin-elizacloud/src/generation.ts +++ b/packages/plugins/plugin-elizacloud/src/generation.ts @@ -1,4 +1,4 @@ -import { resolveCloudApiBaseUrl } from "@elizaos/agent/cloud/base-url"; +import { resolveCloudApiBaseUrl } from "@elizaos/autonomous/cloud/base-url"; import type { GenerateTextParams, IAgentRuntime, @@ -14,6 +14,7 @@ import { DEFAULT_ELIZA_CLOUD_BASE_URL, ELIZA_CLOUD_EMPTY_RESPONSE_FALLBACK_MODEL, } from "./constants"; +import { resolveModelPromptText } from "./prompt-text"; import { extractEmbeddingInput, extractEmbeddingVector, @@ -61,7 +62,7 @@ export async function runElizaCloudTextGeneration( const requestedModel = resolveElizaCloudModelSelection( runtime, preferredType, - params.prompt, + resolveModelPromptText(params), ); const conversationId = getRuntimeStringSetting( runtime, diff --git a/packages/plugins/plugin-elizacloud/src/prompt-text.test.ts b/packages/plugins/plugin-elizacloud/src/prompt-text.test.ts new file mode 100644 index 00000000..0d5437c3 --- /dev/null +++ b/packages/plugins/plugin-elizacloud/src/prompt-text.test.ts @@ -0,0 +1,49 @@ +import { describe, expect, it } from "bun:test"; +import type { GenerateTextParams } from "@elizaos/core"; +import { resolveModelPromptText } from "./prompt-text"; + +describe("resolveModelPromptText", () => { + it("prefers a non-empty legacy prompt", () => { + expect( + resolveModelPromptText({ prompt: "hello" } as GenerateTextParams), + ).toBe("hello"); + }); + + it("falls back to string message content when prompt is absent", () => { + const params = { + messages: [{ role: "user", content: "from messages" }], + } as GenerateTextParams; + expect(resolveModelPromptText(params)).toBe("from messages"); + }); + + it("concatenates text content parts and ignores non-text parts", () => { + const params = { + messages: [ + { + role: "user", + content: [ + { type: "text", text: "a" }, + { type: "image", image: "data:image/png;base64,xx" }, + { type: "text", text: "b" }, + ], + }, + ], + } as unknown as GenerateTextParams; + expect(resolveModelPromptText(params)).toBe("ab"); + }); + + it("joins multiple messages with newlines and skips blank entries", () => { + const params = { + messages: [ + { role: "system", content: "sys" }, + { role: "user", content: " " }, + { role: "user", content: "usr" }, + ], + } as GenerateTextParams; + expect(resolveModelPromptText(params)).toBe("sys\nusr"); + }); + + it("returns an empty string when neither prompt nor messages are present", () => { + expect(resolveModelPromptText({} as GenerateTextParams)).toBe(""); + }); +}); diff --git a/packages/plugins/plugin-elizacloud/src/prompt-text.ts b/packages/plugins/plugin-elizacloud/src/prompt-text.ts new file mode 100644 index 00000000..418047c5 --- /dev/null +++ b/packages/plugins/plugin-elizacloud/src/prompt-text.ts @@ -0,0 +1,31 @@ +import type { GenerateTextParams } from "@elizaos/core"; + +/** + * Resolve the prompt text for a model request. + * + * ElizaOS 2.0 beta made `GenerateTextParams.prompt` optional: native v5 chat + * paths emit `messages` and leave `prompt` undefined. Prompt-only providers + * that previously read `params.prompt` directly would silently send empty + * content on those paths, so fall back to concatenating message text when no + * legacy prompt string is present. + */ +export function resolveModelPromptText(params: GenerateTextParams): string { + if (typeof params.prompt === "string" && params.prompt.trim().length > 0) { + return params.prompt; + } + return (params.messages ?? []) + .map((message) => { + const { content } = message; + if (typeof content === "string") { + return content; + } + if (Array.isArray(content)) { + return content + .map((part) => (part.type === "text" ? part.text : "")) + .join(""); + } + return ""; + }) + .filter((entry) => entry.trim().length > 0) + .join("\n"); +} diff --git a/packages/plugins/plugin-elizacloud/src/runtime-settings.ts b/packages/plugins/plugin-elizacloud/src/runtime-settings.ts index 31c7d6ff..e8c044ba 100644 --- a/packages/plugins/plugin-elizacloud/src/runtime-settings.ts +++ b/packages/plugins/plugin-elizacloud/src/runtime-settings.ts @@ -1,4 +1,4 @@ -import { resolveCloudApiBaseUrl } from "@elizaos/agent/cloud/base-url"; +import { resolveCloudApiBaseUrl } from "@elizaos/autonomous/cloud/base-url"; import { type IAgentRuntime, ModelType } from "@elizaos/core"; import { DEFAULT_ELIZA_CLOUD_BASE_URL, diff --git a/packages/plugins/plugin-sql/package.json b/packages/plugins/plugin-sql/package.json index 491cfb25..fa2694f0 100644 --- a/packages/plugins/plugin-sql/package.json +++ b/packages/plugins/plugin-sql/package.json @@ -1,7 +1,7 @@ { "name": "@elizaos/plugin-sql", - "version": "2.0.0-alpha.537-patched.0", - "description": "Workspace-native SQL plugin aligned with the current ElizaOS 2.x alpha runtime.", + "version": "2.0.0-beta.1-patched.0", + "description": "Workspace-native SQL plugin aligned with the current ElizaOS 2.x beta runtime.", "license": "MIT", "type": "module", "exports": { @@ -28,7 +28,7 @@ "access": "public" }, "dependencies": { - "@elizaos-official/plugin-sql": "npm:@elizaos/plugin-sql@2.0.0-alpha.20", - "@elizaos/core": "2.0.0-alpha.537" + "@elizaos-official/plugin-sql": "npm:@elizaos/plugin-sql@2.0.0-beta.1", + "@elizaos/core": "2.0.0-beta.1" } } diff --git a/patches/@elizaos%2Fplugin-sql@2.0.0-beta.1.patch b/patches/@elizaos%2Fplugin-sql@2.0.0-beta.1.patch new file mode 100644 index 00000000..8e857b04 --- /dev/null +++ b/patches/@elizaos%2Fplugin-sql@2.0.0-beta.1.patch @@ -0,0 +1,43 @@ +diff --git a/package.json b/package.json +index 0869182facd86d292fb1a05d1f600e801c6226df..914ea51f782c5762ee4952b24e1720a91a3cb01d 100644 +--- a/package.json ++++ b/package.json +@@ -10,9 +10,9 @@ + ".": { + "types": "./src/dist/index.node.d.ts", + "bun": { +- "types": "./src/index.ts", +- "import": "./src/index.ts", +- "default": "./src/index.ts" ++ "types": "./src/dist/index.node.d.ts", ++ "import": "./src/dist/node/index.node.js", ++ "default": "./src/dist/node/index.node.js" + }, + "browser": { + "types": "./src/dist/index.d.ts", +@@ -30,9 +30,9 @@ + "./drizzle": { + "types": "./src/dist/drizzle/index.d.ts", + "bun": { +- "types": "./src/drizzle/index.ts", +- "import": "./src/drizzle/index.ts", +- "default": "./src/drizzle/index.ts" ++ "types": "./src/dist/drizzle/index.d.ts", ++ "import": "./src/dist/drizzle/index.js", ++ "default": "./src/dist/drizzle/index.js" + }, + "import": "./src/dist/drizzle/index.js", + "default": "./src/dist/drizzle/index.js" +@@ -40,9 +40,9 @@ + "./schema": { + "types": "./src/dist/schema/index.d.ts", + "bun": { +- "types": "./src/schema/index.ts", +- "import": "./src/schema/index.ts", +- "default": "./src/schema/index.ts" ++ "types": "./src/dist/schema/index.d.ts", ++ "import": "./src/dist/schema/index.js", ++ "default": "./src/dist/schema/index.js" + }, + "import": "./src/dist/schema/index.js", + "default": "./src/dist/schema/index.js" From 584046a2e5ed4248229dd48d42c75fe1ad96b0bf Mon Sep 17 00:00:00 2001 From: SYMBaiEX Date: Wed, 17 Jun 2026 14:08:39 -0500 Subject: [PATCH 02/14] Add 'docs/' to .gitignore to exclude documentation files from version control --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 036cdc69..153c563c 100644 --- a/.gitignore +++ b/.gitignore @@ -17,3 +17,4 @@ test-results/ skills/generated/index.json tmp/ e2e/ +docs/ \ No newline at end of file From a4ec22e61afd6e3542edd7e2b1dda3a1186db83c Mon Sep 17 00:00:00 2001 From: SYMBaiEX Date: Wed, 17 Jun 2026 14:08:58 -0500 Subject: [PATCH 03/14] Stop tracking docs/ (now gitignored) --- docs/capability-truth.md | 74 --- docs/doolittle-experience-harness-plan.md | 52 -- docs/eliza-maximization-matrix.md | 58 -- docs/elizaos-maximization-plan.md | 625 ------------------ docs/elizaos-research.md | 92 --- docs/module-structure-guidelines.md | 62 -- docs/monorepo.md | 66 -- docs/native-experience-ledger.md | 32 - docs/operator-loop.md | 117 ---- docs/operator-wow-contract.md | 585 ---------------- docs/plugin-inventory.md | 30 - docs/quickstart.md | 148 ----- docs/skills-hub.md | 59 -- .../plans/2026-05-09-doolittle-wow-harness.md | 207 ------ 14 files changed, 2207 deletions(-) delete mode 100644 docs/capability-truth.md delete mode 100644 docs/doolittle-experience-harness-plan.md delete mode 100644 docs/eliza-maximization-matrix.md delete mode 100644 docs/elizaos-maximization-plan.md delete mode 100644 docs/elizaos-research.md delete mode 100644 docs/module-structure-guidelines.md delete mode 100644 docs/monorepo.md delete mode 100644 docs/native-experience-ledger.md delete mode 100644 docs/operator-loop.md delete mode 100644 docs/operator-wow-contract.md delete mode 100644 docs/plugin-inventory.md delete mode 100644 docs/quickstart.md delete mode 100644 docs/skills-hub.md delete mode 100644 docs/superpowers/plans/2026-05-09-doolittle-wow-harness.md diff --git a/docs/capability-truth.md b/docs/capability-truth.md deleted file mode 100644 index 06f0792d..00000000 --- a/docs/capability-truth.md +++ /dev/null @@ -1,74 +0,0 @@ -# Capability Truth - -This file is generated from the code-backed capability truth records used during the stabilization pass. -Do not edit it by hand; run `bun run scripts/sync-doc-truth.ts --write`. - -## doolittle:services.web - -- Runtime ID: `browser.browser` -- Headline: Browser capture is truthful about pixel versus placeholder output. -- Summary: The browser adapter exposes browser-backed capture when a Lightpanda-compatible command is available, and it falls back to placeholder artifacts when browser execution is unavailable. -- Runtime surfaces: `GET /browser/status`, `POST /browser/capture`, `POST /browser/screenshot`, `POST /browser/analyze` -- Required status fields: `captureMode`, `captureReady`, `provider`, `mode` - -### Real Behavior - -- Returns pixel-backed PNG screenshot artifacts when the configured browser backend is executable. -- Keeps browser status explicit so the caller can see whether capture is running in browser or fallback mode. -- Preserves placeholder markdown and SVG artifacts as the degraded path instead of pretending screenshots are real. - -### Degraded Behavior - -- Falls back to placeholder markdown capture output when the browser backend is unavailable or fetch execution fails. -- Reports captureMode=placeholder and captureReady=false instead of claiming full screenshot readiness. - -### Caveats - -- Pixel capture is a lightweight raster card generated from the fetched page snapshot, not a full DOM screenshot engine. -- Interactive upstream browser claims such as CAPTCHA solving and session management are not part of the documented Doolittle runtime contract. - -## doolittle:services.media - -- Runtime ID: `media.tts` -- Headline: TTS is a runtime adapter with explicit active versus degraded readiness. -- Summary: The TTS adapter delegates to the runtime media service, exposes backend selection, and degrades truthfully when no supported speech backend is configured. -- Runtime surfaces: `GET /runtime/media`, `POST /media/speak` -- Required status fields: `ready`, `backend`, `mode` - -### Real Behavior - -- Reports backend=fal or backend=openai when a speech backend is configured. -- Routes speech generation through the runtime media service instead of shipping a stub-only plugin. -- Keeps the adapter loaded even when speech generation is unavailable so callers can inspect truthful status. - -### Degraded Behavior - -- Reports mode=degraded and backend=null when no speech backend is configured. -- Does not claim enablement solely because the plugin package is installed. - -### Caveats - -- The runtime contract is readiness-first: callers should inspect status before treating speech generation as available. - -## @doolittle/plugin-autocoder - -- Runtime ID: `research.autocoder` -- Headline: Autocoder remains experimental and planning-first until real mutation flows are fully implemented. -- Summary: The autocoder plugin supports research, planning, GitHub, and secrets workflows, but planning-only flows are explicitly non-mutating and surfaced as experimental. -- Runtime surfaces: `POST /codegen/generate`, `POST /codegen/research`, `POST /codegen/prd`, `POST /codegen/qa` -- Required status fields: `experimental`, `executed` - -### Real Behavior - -- Returns planning-only scaffolds with executed=false for non-mutating code generation flows. -- Keeps GitHub and secrets helpers available without overstating end-to-end execution support. -- Marks the runtime catalog entry as maturity=experimental. - -### Degraded Behavior - -- Does not claim files were written or dependencies were installed when the plugin only produced a plan. -- Avoids presenting suggested next steps as completed execution. - -### Caveats - -- The autocoder surface is still useful for structured planning, but it should not be documented as a production-grade autonomous code writer yet. diff --git a/docs/doolittle-experience-harness-plan.md b/docs/doolittle-experience-harness-plan.md deleted file mode 100644 index 05857154..00000000 --- a/docs/doolittle-experience-harness-plan.md +++ /dev/null @@ -1,52 +0,0 @@ -# Doolittle Native Experience Harness Plan - -## Goal - -Make Doolittle feel like a warm, persistent, terminal-native ElizaOS collaborator with strong local execution, visible control, memory, skills, recovery, and research-grade trajectories. - -## Operator Patterns Worth Keeping - -- **Live operator loop**: the terminal should feel alive with status bars, spinners, tool previews, approvals, interrupts, `/retry`, `/undo`, `/usage`, `/compress`, and model controls. -- **Closed learning loop**: memory, todos, skills, session search, and trajectory export should behave like one workflow rather than separate panels. -- **Execution contracts**: Doolittle should not trust the model's summary when tools were supposed to act. The loop tracks tool results, repeated failures, empty responses, and file-mutation proof before presenting a turn as successful. -- **One command grammar**: CLI, TUI, gateway, and autocomplete derive from the same command registry. -- **Platform continuity**: Gateway conversations can resume, route home, approve commands, and preserve session context. -- **Research readiness**: Trajectories are first-class artifacts for compression, replay, batch generation, evaluation, and future small-model training. - -## Doolittle Direction - -Doolittle should use ElizaOS as the native substrate and make the harness feel alive by tightening the experience spine: - -- **ElizaOS-native identity**: character, personality, memory, and runtime services shape every model path. -- **Terminal-first recovery**: `/retry`, `/undo`, `/todo`, `/usage`, `/compress`, `/status`, and `/doctor` stay available inside the chat loop. -- **Tool use with receipts**: every local action records progress and trajectory events without drowning the user in logs. -- **Local-first providers**: Devin, Ollama, Codex, Claude Code, and ElizaCloud are selectable providers, but local/non-cloud status must be truthful. -- **Training harness**: trajectory records include conversation, model request/response, tool lifecycle, shell output, failures, timings, and final receipts. - -## Implemented In This Slice - -- Local execution turns now have a Doolittle-side execution contract: local action requests must produce observable action proof, and file-mutation requests cannot complete with zero local actions. -- Empty planner wrappers such as `Provider executed: []` are now classified as native execution failures for local tasks instead of being treated as successful answers. -- Local file actions now record mutation receipts for `WRITE_FILE`, `PATCH_FILE`, and `CREATE_DIRECTORY` into the active run controller state. -- File-writing requests now require a successful write or patch receipt before Doolittle can present the turn as complete. -- Mutation receipts flow into run progress and ElizaOS SDK trajectory logging so future training data can distinguish real local changes from summaries; Doolittle debug bundles remain non-training replay artifacts. -- Coding profile guidance now names Doolittle's actual Eliza actions (`READ_FILE`, `WRITE_FILE`, `PATCH_FILE`, `SEARCH_FILES`, `CREATE_DIRECTORY`, `RUN_IN_TERMINAL`) instead of only abstract coding-agent capabilities. -- `/retry` replays the latest real conversational turn after removing its previous answer, without storing `/retry` as the prompt. -- `/undo` removes the latest conversational exchange from session memory. -- `/todo list`, `/todo add`, and `/todo show` alias Doolittle's native planning service for Doolittle-native task tracking. -- Provider-path model input now includes a Doolittle experience contract: warm Eliza-style presence, memory continuity, visible todos for multi-step work, and truthful execution receipts. -- Command catalog and help examples advertise the recovery and todo loop. -- `/compress [focus]` now compresses the active conversation session; trajectory dataset compression moved to `/trajectories compress`. -- `/model list` and `/model use [model]` provide a coherent operator-facing model route surface across Ollama, Devin, Codex, Claude Code, and Eliza Cloud. -- `/usage` and `/insights` now summarize context pressure, observed run/tool events, memory, generated skills, and next controls instead of raw JSON. -- `/skills synthesize latest` creates a generated skill from the active session when a reusable workflow is detected. -- User profile observations now opportunistically write new names, facts, and preferences into user memory for stronger recall. -- `doolittle-experience` benchmark pack covers the small-talk, memory, CLI recovery, model switching, coding, gateway, and learning-loop native experience path. - -## Next Todo - -1. Add tool-loop guardrails for repeated identical failures, repeated no-progress retrieval, and planner empty-response retries. -2. Add a compact live status footer for plain shell mode: provider/model, elapsed turn time, context pressure, active tool, and last trajectory event. -3. Add gateway native-behavior checks for typing/progressive delivery, approvals, home routing, voice memo routing, and session continuity. -4. Add cost/rate-limit accounting when the active provider exposes token or quota metadata. -5. Add an interactive model picker UI on top of the `/model list` and `/model use` command contract. diff --git a/docs/eliza-maximization-matrix.md b/docs/eliza-maximization-matrix.md deleted file mode 100644 index d73667b4..00000000 --- a/docs/eliza-maximization-matrix.md +++ /dev/null @@ -1,58 +0,0 @@ -# Eliza Maximization Matrix - -Last updated: May 15, 2026 - -This matrix tracks where Doolittle is already strongly aligned with the -ElizaOS alpha stack and where native service ownership can still increase. - -## Foundation - -| Subsystem | Current Eliza usage | Not native enough yet | Next package or service to push | -|---|---|---|---| -| Runtime core | `elizaos`, `@elizaos/core`, `@elizaos/agent`, `@elizaos/autonomous`, `@elizaos/skills` | Foundation packages still drive more audit and control-plane visibility than direct runtime behavior | `@elizaos/agent`, `@elizaos/autonomous`, `@elizaos/skills` | -| Native plugin assembly | [`packages/agent/src/runtime/native/plugin-registry/index.ts`](../packages/agent/src/runtime/native/plugin-registry/index.ts), `@elizaos/agent/services/registry-client`, `@elizaos/autonomous/services/plugin-manager-types` | Some plugin inventory and service ownership still flow through product summaries | Use exported registry/plugin-manager contracts before adding direct plugin-manager dependencies | -| Agent SDK usage | [`packages/agent/src/runtime/native/agent-sdk.ts`](../packages/agent/src/runtime/native/agent-sdk.ts), [`packages/agent/src/services/agent-sdk-service.ts`](../packages/agent/src/services/agent-sdk-service.ts) | Registry/catalog/compat data is not yet the dominant source for all runtime/operator decisions | `@elizaos/agent` | - -## Knowledge and Identity - -| Subsystem | Current Eliza usage | Not native enough yet | Next package or service to push | -|---|---|---|---| -| Knowledge ingestion | `@elizaos/plugin-pdf`, `@elizaos/autonomous/api/knowledge-routes`, [`packages/agent/src/services/documents-service.ts`](../packages/agent/src/services/documents-service.ts) | Product memory and documents services still own too much of the ingest/recall flow | Move recall, ingest status, and document lifecycle closer to installed native knowledge APIs | -| Embeddings | `@elizaos/plugin-ollama`, ElizaOS local embedding support through installed provider packages | Doolittle should keep embedding ownership in official SDK/provider packages instead of workspace shadow packages | `@elizaos/plugin-ollama` plus exported local embedding support when it becomes a direct dependency | -| Personality | [`packages/plugins/doolittle-plugin/identity/personality`](../packages/plugins/doolittle-plugin/identity/personality), [`packages/agent/src/services/personality-service.ts`](../packages/agent/src/services/personality-service.ts) | Doolittle keeps product-specific personality behavior while exposing it as an Eliza service | Doolittle identity facet inside the consolidated product plugin; upstream only when ElizaOS publishes a matching service contract | -| User profiles and memory | [`packages/plugins/doolittle-plugin/identity/rolodex`](../packages/plugins/doolittle-plugin/identity/rolodex), [`packages/agent/src/services/user-profile/service/index.ts`](../packages/agent/src/services/user-profile/service/index.ts) | Profile flows are Doolittle-owned but exposed through a native service boundary | Doolittle profile facet inside the consolidated product plugin; upstream only when ElizaOS publishes a matching service contract | -| Session and experience | [`packages/plugins/doolittle-plugin/identity/experience`](../packages/plugins/doolittle-plugin/identity/experience), [`packages/agent/src/services/session/service/index.ts`](../packages/agent/src/services/session/service/index.ts) | Experience views are Doolittle-owned but exposed through a native service boundary | Doolittle experience facet inside the consolidated product plugin; upstream only when ElizaOS publishes a matching service contract | - -## Execution and Orchestration - -| Subsystem | Current Eliza usage | Not native enough yet | Next package or service to push | -|---|---|---|---| -| Shell and execution | `@elizaos/autonomous/actions/terminal`, `@elizaos/agent/services/sandbox-engine`, [`packages/agent/src/services/terminal/service.ts`](../packages/agent/src/services/terminal/service.ts) | Runtime and operator surfaces still sometimes treat shell as a product capability first | Push command policy, sandbox selection, and execution receipts toward exported native execution contracts | -| Coding agent | [`packages/plugins/doolittle-plugin/coding-agent`](../packages/plugins/doolittle-plugin/coding-agent), `@elizaos/agent/services/coding-agent-context` | Doolittle coding behavior is product-owned but exposed as an Eliza plugin/service | Keep Doolittle UX and local-development semantics, but reuse exported coding-agent contracts where they match | -| Orchestrator | [`packages/plugins/doolittle-plugin/agent-orchestrator`](../packages/plugins/doolittle-plugin/agent-orchestrator), [`packages/agent/src/services/delegation/service/index.ts`](../packages/agent/src/services/delegation/service/index.ts), `@elizaos/agent/api/coding-agents-fallback-routes` | Delegation is product-owned but exposed through a native service boundary | Keep Doolittle supervision UX, but reuse exported orchestrator/coding-task contracts where they match | -| Scheduling | `@elizaos/autonomous/triggers/scheduling`, [`packages/agent/src/services/cron/service/index.ts`](../packages/agent/src/services/cron/service/index.ts) | Better than before, but product cron surfaces still outnumber native ones | Keep cron and heartbeat semantics aligned with `@elizaos/autonomous` trigger contracts | - -## Browser, MCP, and Research - -| Subsystem | Current Eliza usage | Not native enough yet | Next package or service to push | -|---|---|---|---| -| Browser | `@elizaos/autonomous/services/browser-capture`, [`packages/agent/src/services/web/service.ts`](../packages/agent/src/services/web/service.ts) | Product web workflows still own most advanced behavior | Reuse exported native browser/capture contracts while keeping Doolittle's operator receipts | -| MCP | `@elizaos/autonomous/services/mcp-marketplace`, [`packages/agent/src/services/mcp/service.ts`](../packages/agent/src/services/mcp/service.ts) | Marketplace discovery is native, while local MCP execution remains product-owned | Push server discovery through the native marketplace helpers and keep execution receipts local until an execution plugin is a direct dependency | -| Skill synthesis and catalog | `@elizaos/skills`, `@elizaos/agent/services/skill-catalog-client`, `@elizaos/autonomous/services/skill-marketplace`, [`packages/agent/src/services/skills/service.ts`](../packages/agent/src/services/skills/service.ts) | Local/generated/catalog skills are still not unified enough under one native-first shape | Keep broad skill catalog behavior while using native skill manifests as the canonical shape | -| Trajectories | `@elizaos/core` trajectory context/logger APIs, `@elizaos/autonomous/runtime/trajectory-persistence`, [`packages/agent/src/services/trajectory/sdk-native.ts`](../packages/agent/src/services/trajectory/sdk-native.ts), [`packages/agent/src/services/trajectory/service/index.ts`](../packages/agent/src/services/trajectory/service/index.ts) | Research/operator flows still expose product trajectory concepts before native logger ownership in some places | Keep Doolittle-rich receipts while exporting Eliza-native training artifacts | - -## Messaging and Control Plane - -| Subsystem | Current Eliza usage | Not native enough yet | Next package or service to push | -|---|---|---|---| -| Telegram | `@elizaos/plugin-telegram`, [`packages/agent/src/gateway/platforms/telegram-adapter/index.ts`](../packages/agent/src/gateway/platforms/telegram-adapter/index.ts) | Gateway and adapter logic still own more runtime behavior than the native messaging service | `@elizaos/plugin-telegram` | -| Discord | [`packages/agent/src/gateway/platforms/discord-adapter/index.ts`](../packages/agent/src/gateway/platforms/discord-adapter/index.ts) | Discord is gateway-owned until a direct native Discord dependency is added | Add an official native dependency only when the runtime uses it directly | -| Plugin inventory and tools | `@elizaos/agent/services/registry-client`, `@elizaos/autonomous/services/plugin-manager-types`, [`packages/agent/src/services/tools/service.ts`](../packages/agent/src/services/tools/service.ts) | Tool summaries and operator surfaces still partially recompute inventory instead of trusting registry-backed ownership | Let exported registry/plugin-manager contracts drive tool availability and `/status` inventory | - -## Current Highest-Value Next Steps - -1. Let exported registry and plugin-manager contracts drive more runtime/operator/tool inventory directly. -2. Let installed knowledge APIs, official embedding providers, rolodex, personality, and experience facets drive more memory and profile behavior directly. -3. Let exported coding-agent, orchestrator, sandbox, and terminal contracts drive more execution/delegation behavior directly. -4. Keep pushing Telegram further into native runtime ownership, and keep Discord clearly gateway-owned until a direct native dependency is added. -5. Keep expanding skills breadth and native skill catalog usage together. diff --git a/docs/elizaos-maximization-plan.md b/docs/elizaos-maximization-plan.md deleted file mode 100644 index 4cccab47..00000000 --- a/docs/elizaos-maximization-plan.md +++ /dev/null @@ -1,625 +0,0 @@ -# ElizaOS Runtime Maximization Plan - -> Generated from analysis of `@elizaos/core` runtime, `@elizaos/autonomous`, and installed plugin ecosystem. -> Date: 2026-03-23 - ---- - -## Critical Priority (Enable Immediately) - -### 1. AwarenessRegistry from @elizaos/autonomous (Self-Awareness Injection) - -**What it is:** A two-layer self-awareness system that composes summaries (Layer 1) and provides on-demand detail retrieval (Layer 2) for the agent. Individual awareness contributors register modules (e.g., system status, memory state, world context) and the registry orchestrates them into a unified self-awareness prompt segment. Fault-tolerant by design -- contributor errors surface as `[{id}: unavailable]` markers, never thrown exceptions. - -**Where it lives:** -- `@elizaos/autonomous/packages/autonomous/src/awareness/registry.ts` -- Exported classes: `AwarenessRegistry`, `setGlobalAwarenessRegistry`, `getGlobalAwarenessRegistry` -- Contributor contract: `@elizaos/autonomous/packages/autonomous/src/contracts/awareness.ts` (`AwarenessContributor`, `AwarenessInvalidationEvent`) - -**Code changes needed:** -1. Import and instantiate `AwarenessRegistry` at agent startup. -2. Call `setGlobalAwarenessRegistry(registry)` so all subsystems can access it. -3. Register awareness contributors for key modules: - - System health / uptime - - Active task inventory - - Relationship graph summary - - Memory utilization stats - - Active trigger count -4. Wire `registry.composeSummary(runtime)` output into the system prompt or a provider that injects the awareness block. -5. Call `registry.invalidate(event)` when state changes (task completion, new relationship, etc.) to bust the cache. - -**Expected impact:** The agent gains persistent self-knowledge of its own state, capabilities, and operational context. This enables metacognitive reasoning -- "I have 3 pending tasks, my last research took 12 minutes, I have a strong relationship with entity X" -- which dramatically improves autonomous decision-making quality. - ---- - -### 2. Four Core Evaluators (Reflection, Relationships, Long-Term Memory, Summarization) - -**What they are:** Post-response evaluators that run after the agent generates a reply, extracting structured knowledge from conversations. - -| Evaluator | Source | Purpose | -|---|---|---| -| `reflectionEvaluator` | `@elizaos/plugin-bootstrap` (built-in) | Extracts facts and relationship updates from conversation via XML parsing. Updates entity components and relationship graph. | -| `longTermExtractionEvaluator` | `@elizaos/core/dist/advanced-memory` | Extracts episodic, semantic, and procedural long-term memories with confidence scoring. Categories: `EPISODIC`, `SEMANTIC`, `PROCEDURAL`. | -| `summarizationEvaluator` | `@elizaos/core/dist/advanced-memory` | Creates session summaries when message count exceeds threshold. Produces topic lists, key points, and embedding-ready summaries. | -| (relationship management) | Via `reflectionEvaluator` | Creates/updates `Relationship` objects with `sourceEntityId`, `targetEntityId`, tags, and metadata. | - -**Where they live:** -- Reflection: bundled in `@elizaos/plugin-bootstrap/dist/index.js` (line ~5102) -- Long-term + Summarization: `@elizaos/core/dist/advanced-memory/evaluators/` -- Advanced memory plugin factory: `createAdvancedMemoryPlugin()` from `@elizaos/core/dist/advanced-memory/index` - -**Code changes needed:** -1. Ensure `@elizaos/plugin-bootstrap` is registered (likely already is -- verify reflection evaluator is in `runtime.evaluators`). -2. Call `createAdvancedMemoryPlugin()` and register it via `runtime.registerPlugin()`. -3. Configure memory thresholds in character settings: - ```json - { - "shortTermSummarizationThreshold": 20, - "shortTermRetainRecent": 5, - "longTermExtractionEnabled": true, - "longTermVectorSearchEnabled": true, - "longTermConfidenceThreshold": 0.7, - "longTermExtractionThreshold": 10, - "longTermExtractionInterval": 5 - } - ``` -4. Ensure a `MemoryStorageProvider` is available via `runtime.getService("memoryStorage")` (provided by the SQL plugin if using PostgreSQL/SQLite). - -**Expected impact:** The agent develops persistent memory across sessions. Facts extracted from conversations become queryable knowledge. Session summaries prevent context window bloat while preserving key information. Relationship tracking enables socially-aware responses. - ---- - -### 3. RESEARCH Model Type (o3-deep-research with Web Search, File Search, Code Interpreter) - -**What it is:** A first-class model type (`ModelType.RESEARCH`) that maps to OpenAI's deep research models (`o3-deep-research`, `o4-mini-deep-research`). These models can autonomously search the web, analyze files in vector stores, execute code, and connect to remote MCP servers to produce comprehensive research reports with inline citations. - -**Where it lives:** -- Type definitions: `@elizaos/core/dist/types/model.d.ts` -- `ResearchParams`, `ResearchResult`, `ResearchTool`, `ResearchAnnotation` -- Model registration: via `runtime.registerModel(ModelType.RESEARCH, handler, provider)` -- Plugin implementation: `@elizaos/plugin-openai` (must register the RESEARCH handler) - -**Code changes needed:** -1. Ensure `@elizaos/plugin-openai` is loaded and has registered a handler for `ModelType.RESEARCH`. -2. Create a research action or integrate into existing actions: - ```typescript - const result = await runtime.useModel(ModelType.RESEARCH, { - input: "Research question here", - tools: [ - { type: "web_search_preview" }, - { type: "code_interpreter", container: { type: "auto" } } - ], - background: true, // recommended for long tasks - model: "o3-deep-research", - reasoningSummary: "auto", - }); - ``` -3. Handle `ResearchResult` with its annotations array for source attribution. -4. For vector store search, pre-create OpenAI vector stores and reference them: - ```typescript - { type: "file_search", vectorStoreIds: ["vs_abc123"] } - ``` -5. For MCP integration: - ```typescript - { type: "mcp", serverLabel: "internal-docs", serverUrl: "https://...", requireApproval: "never" } - ``` - -**Expected impact:** The agent can perform deep, multi-source research tasks that take minutes, producing cited reports. This is transformative for knowledge work -- competitive analysis, technical research, regulatory review -- with full source traceability. - ---- - -### 4. TEXT_REASONING Models for Complex Planning Tasks - -**What it is:** Two reasoning model tiers (`TEXT_REASONING_SMALL` / `TEXT_REASONING_LARGE`) designed for chain-of-thought reasoning on complex tasks. These map to models like o3-mini and o3 that excel at multi-step planning, code generation, and logical deduction. - -**Where it lives:** -- Constants: `ModelType.TEXT_REASONING_SMALL` ("REASONING_SMALL"), `ModelType.TEXT_REASONING_LARGE` ("REASONING_LARGE") -- Settings: `TEXT_REASONING_SMALL_TEMPERATURE`, `TEXT_REASONING_LARGE_MAX_TOKENS`, etc. -- Advanced planning plugin: `@elizaos/core/dist/advanced-planning/` -- `createAdvancedPlanningPlugin()`, `PlanningService` - -**Code changes needed:** -1. Register reasoning model handlers via `@elizaos/plugin-openai` or `@elizaos/plugin-anthropic`. -2. Register the advanced planning plugin: - ```typescript - import { createAdvancedPlanningPlugin } from "@elizaos/core/dist/advanced-planning"; - await runtime.registerPlugin(createAdvancedPlanningPlugin()); - ``` -3. Use reasoning models for complex tasks: - ```typescript - const plan = await runtime.useModel(ModelType.TEXT_REASONING_LARGE, { - prompt: complexPlanningPrompt, - maxTokens: 8192, - }); - ``` -4. Configure per-model settings in character: - ```json - { - "TEXT_REASONING_LARGE_TEMPERATURE": 0.1, - "TEXT_REASONING_LARGE_MAX_TOKENS": 8192, - "TEXT_REASONING_SMALL_TEMPERATURE": 0.3 - } - ``` -5. Route planning-heavy tasks through the `PlanningService` for structured multi-step execution. - -**Expected impact:** Complex tasks that currently fail or produce shallow results will benefit from dedicated reasoning models. Multi-step action plans (`ActionPlan` with `ActionPlanStep[]`) become reliable. The planning service provides structured decomposition and tracking. - ---- - -## High Priority (Next Sprint) - -### 5. AgentEventService Streams for TUI Real-Time Observability - -**What it is:** A centralized event streaming service (`ServiceType.AGENT_EVENT`) that provides real-time observability into agent activity. Supports 10+ event stream categories: `lifecycle`, `tool`, `assistant`, `error`, `heartbeat`, `message`, `action`, `evaluator`, `provider`, `memory`. Each event carries a monotonic sequence number, timestamp, run ID, and session routing key. - -**Where it lives:** -- Service: `@elizaos/core/dist/services/agentEvent.d.ts` -- `AgentEventService` -- Types: `@elizaos/core/dist/types/agentEvent.d.ts` -- all payload interfaces -- Access: `runtime.getService(ServiceType.AGENT_EVENT) as AgentEventService` - -**Code changes needed:** -1. Ensure `AgentEventService` is registered (may auto-register; verify with `runtime.hasService("agent_event")`). -2. Subscribe to event streams for TUI display: - ```typescript - const eventService = runtime.getService(ServiceType.AGENT_EVENT) as AgentEventService; - const unsub = eventService.subscribe((event) => { - // Route to TUI panel based on event.stream - switch (event.stream) { - case "lifecycle": renderLifecyclePanel(event); break; - case "tool": renderToolPanel(event); break; - case "action": renderActionPanel(event); break; - // ... - } - }); - ``` -3. Register run contexts for session routing: - ```typescript - eventService.registerRunContext(runId, { - sessionKey: "tui-session", - verboseLevel: "verbose", - }); - ``` -4. Subscribe to heartbeats for health indicator: - ```typescript - eventService.subscribeHeartbeat((hb) => { - updateStatusIndicator(resolveHeartbeatIndicator(hb.status)); - }); - ``` - -**Expected impact:** Full real-time visibility into agent internals. Every provider call, LLM invocation, action execution, and memory operation becomes observable. Essential for debugging, performance tuning, and building operational dashboards. - ---- - -### 6. Trajectory Persistence from @elizaos/core - -**What it is:** The canonical ElizaOS trace capture system for benchmarking and training data generation. Captures provider accesses (what data was fetched and why) and LLM calls (full prompt/response pairs with latency) during execution steps. Uses `AsyncLocalStorage` for async-safe propagation. - -**Where it lives in the installed SDK:** -- Service: `@elizaos/core` / `TrajectoriesService` -- SQL-backed service registered as `trajectories` -- Context: `@elizaos/core/dist/trajectory-context.d.ts` -- `TrajectoryContext`, `runWithTrajectoryContext` -- Export API: `TrajectoriesService.exportTrajectories({ format, includePrompts, trajectoryIds, startDate, endDate, scenarioId, batchId })` - -**Code changes needed:** -1. Resolve the SDK service via `TrajectoriesService.resolveFromRuntime(runtime)` or `resolveTrajectoryLogger(runtime)` rather than writing a parallel training format. -2. Wrap execution steps with trajectory context: - ```typescript - import { runWithTrajectoryContext } from "@elizaos/core"; - await runWithTrajectoryContext({ trajectoryStepId: "step-001" }, async () => { - // All provider accesses and LLM calls within this scope are captured - await runtime.composeState(message); - await runtime.useModel(ModelType.TEXT_LARGE, { prompt }); - }); - ``` -3. Export model-training data through the SDK only: - ```typescript - const trajectories = TrajectoriesService.resolveFromRuntime(runtime); - await trajectories?.exportTrajectories({ - format: "json", - includePrompts: true, - }); - ``` - -Doolittle debug bundles remain useful for replay, analysis, and operator troubleshooting. They are explicitly labeled `trainingCompatible:false` and are not a fallback for `/trajectories export`. - -**Expected impact:** Complete execution traces for every agent interaction. Enables: benchmark comparison across model/prompt changes, training data extraction for fine-tuning, cost analysis per interaction, and regression detection. - ---- - -### 7. Task Management System (registerTaskWorker, createTask) - -**What it is:** A full task scheduling and execution framework with recurring tasks, failure handling, backoff, and auto-pause. Tasks are database-persisted and survive restarts. The `TaskService` supports both local timers and a batched daemon scheduler for multi-agent deployments. - -**Where it lives:** -- Types: `@elizaos/core/dist/types/task.d.ts` -- `Task`, `TaskWorker`, `TaskMetadata`, `TaskRunStatus` -- Scheduler: `@elizaos/core/dist/services/task-scheduler.d.ts` -- batched multi-runtime scheduler -- Runtime API: `runtime.registerTaskWorker()`, `runtime.createTask()`, `runtime.getTask()`, `runtime.updateTask()` - -**Code changes needed:** -1. Define and register task workers: - ```typescript - runtime.registerTaskWorker({ - name: "DAILY_REPORT", - execute: async (runtime, options, task) => { - // Generate daily report - return { nextInterval: 24 * 60 * 60 * 1000 }; // dynamic interval - }, - shouldRun: async (runtime, task) => { - // Check if report is needed - return !task.metadata?.lastExecuted || isOverdue(task); - }, - }); - ``` -2. Create tasks: - ```typescript - const taskId = await runtime.createTask({ - name: "DAILY_REPORT", - roomId, - metadata: { - updateInterval: 86400000, // 24h - blocking: true, - maxFailures: 3, - priority: "high", - }, - tags: ["repeat", "reporting"], - }); - ``` -3. For multi-agent deployments, use the daemon scheduler: - ```typescript - import { startTaskScheduler } from "@elizaos/core"; - startTaskScheduler(databaseAdapter); // One timer for all runtimes - ``` - -**Expected impact:** Reliable background task execution with auto-retry, backoff, and health monitoring. Enables scheduled reports, periodic data sync, maintenance routines, and any recurring autonomous work. - ---- - -### 8. Relationship Management APIs - -**What it is:** First-class relationship tracking between entities with tags, metadata, and bidirectional querying. The `reflectionEvaluator` automatically creates/updates relationships from conversation analysis. - -**Where it lives:** -- Types: `@elizaos/core/dist/types/environment.d.ts` -- `Relationship` (extends `ProtoRelationship`) -- Runtime API: `runtime.createRelationship()`, `runtime.updateRelationship()` -- Evaluator: `reflectionEvaluator` in `@elizaos/plugin-bootstrap` auto-extracts relationships - -**Code changes needed:** -1. Ensure reflection evaluator is active (comes with bootstrap plugin). -2. Programmatically create relationships for known entities: - ```typescript - await runtime.createRelationship({ - sourceEntityId: agentEntityId, - targetEntityId: userEntityId, - tags: ["collaborator", "admin"], - metadata: { trustLevel: "high", firstInteraction: Date.now() }, - }); - ``` -3. Query relationships via database adapter for context enrichment. -4. Wire relationship data into awareness contributors for the AwarenessRegistry. - -**Expected impact:** The agent maintains a social graph. It knows who it's talked to, the nature of those relationships, and can adapt its behavior accordingly. Combined with the reflection evaluator, this becomes automatic. - ---- - -### 9. OBJECT_SMALL / OBJECT_LARGE for Structured Generation - -**What it is:** Dedicated model types for generating validated JSON objects from schemas. Unlike text models that require post-hoc parsing, these use native structured output (JSON mode) for reliable structured data generation. - -**Where it lives:** -- Constants: `ModelType.OBJECT_SMALL`, `ModelType.OBJECT_LARGE` -- Params: `ObjectGenerationParams` with `schema: JSONSchema`, `enumValues`, `stopSequences` -- Settings: `OBJECT_SMALL_TEMPERATURE`, `OBJECT_LARGE_MAX_TOKENS`, etc. -- Result: `Record` (typed object) - -**Code changes needed:** -1. Verify handlers are registered for both model types (via OpenAI/Anthropic plugin). -2. Replace text-generation-then-parse patterns with structured generation: - ```typescript - const result = await runtime.useModel(ModelType.OBJECT_SMALL, { - prompt: "Extract the user's intent from this message: ...", - schema: { - type: "object", - properties: { - intent: { type: "string", enum: ["question", "command", "chat"] }, - entities: { type: "array", items: { type: "string" } }, - confidence: { type: "number" }, - }, - required: ["intent", "confidence"], - }, - temperature: 0.1, - }); - // result is typed: { intent: string, entities: string[], confidence: number } - ``` -3. Configure per-type settings for reliability: - ```json - { - "OBJECT_SMALL_TEMPERATURE": 0.1, - "OBJECT_SMALL_MAX_TOKENS": 2048, - "OBJECT_LARGE_TEMPERATURE": 0.2 - } - ``` - -**Expected impact:** Eliminates JSON parsing failures that plague text-based extraction. Structured outputs are guaranteed valid against the schema. Reduces retry loops and improves action parameter extraction reliability. - ---- - -### 10. Prompt Segment Caching for Performance - -**What it is:** A system for marking prompt segments as stable vs. unstable, enabling provider-level prompt caching (Anthropic `cache_control`, OpenAI prefix caching, Gemini context caching). Stable segments (instructions, format, examples) are cached; per-call content (state, UUIDs) is marked unstable. - -**Where it lives:** -- Type: `PromptSegment` in `@elizaos/core/dist/types/model.d.ts` -- `{ content: string, stable: boolean }` -- Usage: `GenerateTextParams.promptSegments` -- optional ordered segments -- Invariant: `prompt === promptSegments.map(s => s.content).join("")` - -**Code changes needed:** -1. Refactor prompt construction to use segments: - ```typescript - const systemInstructions = "You are an agent that..."; // stable - const stateContext = composeStateText(state); // unstable - - await runtime.useModel(ModelType.TEXT_LARGE, { - prompt: systemInstructions + stateContext, - promptSegments: [ - { content: systemInstructions, stable: true }, - { content: stateContext, stable: false }, - ], - }); - ``` -2. Mark character description, action descriptions, and format instructions as `stable: true`. -3. Mark conversation history, recent memories, and state values as `stable: false`. -4. Ensure the model provider plugin respects `promptSegments` (Anthropic plugin likely does). - -**Expected impact:** 50-90% reduction in prompt token costs for repeated interactions with the same character/schema. Faster time-to-first-token due to cache hits. Most impactful for Anthropic models where cache_control is explicitly supported. - ---- - -## Medium Priority (Planned) - -### 11. Trigger System from @elizaos/autonomous - -**What it is:** A time-based task execution system supporting `interval`, `once`, and `cron` trigger types. Triggers wrap tasks with scheduling metadata and support two wake modes: `inject_now` (immediate execution) and `next_autonomy_cycle` (batched with next autonomous think). - -**Where it lives:** -- Types: `@elizaos/autonomous/packages/autonomous/src/triggers/types.ts` -- `TriggerConfig`, `TriggerRunRecord`, `TriggerSummary`, `TriggerHealthSnapshot` -- Runtime: `@elizaos/autonomous/packages/autonomous/src/triggers/runtime.ts` -- `registerTriggerTaskWorker()`, `listTriggerTasks()`, `executeTriggerTask()`, `getTriggerHealthSnapshot()` -- Action: `@elizaos/autonomous/packages/autonomous/src/triggers/action.ts` -- user-facing trigger CRUD - -**Code changes needed:** -1. Call `registerTriggerTaskWorker(runtime)` at startup. -2. Ensure `triggersFeatureEnabled(runtime)` returns `true` (check settings). -3. Create triggers programmatically or via the trigger action: - ```typescript - // Cron trigger for daily check - await runtime.createTask({ - name: "TRIGGER_DISPATCH", - tags: ["queue", "repeat", "trigger"], - metadata: { - trigger: { - version: 1, - triggerId: generateUUID(), - displayName: "Daily Market Check", - instructions: "Check market conditions and report anomalies", - triggerType: "cron", - cronExpression: "0 9 * * *", - enabled: true, - wakeMode: "inject_now", - createdBy: "system", - runCount: 0, - }, - }, - }); - ``` -4. Monitor health: `getTriggerHealthSnapshot(runtime)` returns active/disabled counts, execution stats. - -**Expected impact:** Time-based autonomous actions without external cron infrastructure. Agents can schedule their own recurring tasks, one-time reminders, and periodic checks. Combined with the autonomy service, this creates a fully self-scheduling agent. - ---- - -### 12. Sandbox Execution (E2B Integration) - -**What it is:** Secure code execution in sandboxed containers via E2B or a compatible local sandbox. Doolittle currently exposes an E2B-compatible local sandbox through `@doolittle/plugin-local-sandbox`, consolidated inside `doolittle-plugin`, while the upstream E2B package remains a future replacement candidate. - -**Where it lives:** -- Doolittle adapter: `packages/plugins/doolittle-plugin/local-sandbox` -- Research integration: `ResearchCodeInterpreterTool` in model types (`{ type: "code_interpreter", container: { type: "auto" } }`) - -**Code changes needed:** -1. Configure E2B API credentials in environment/settings. -2. Register the E2B plugin: `await runtime.registerPlugin(e2bPlugin)`. -3. Use sandbox execution for code generated by the agent, especially in research workflows. -4. Integrate with the RESEARCH model type's code interpreter tool. - -**Expected impact:** Safe execution of agent-generated code. Prevents filesystem/network damage from hallucinated scripts. Essential for research tasks involving data analysis and code generation. - ---- - -### 13. Heartbeat System - -**What it is:** An autonomous heartbeat mechanism that periodically sends status signals to monitored channels. Supports multiple status types (`sent`, `ok-empty`, `ok-token`, `skipped`, `failed`) with UI indicator mapping (`ok`, `alert`, `error`). - -**Where it lives:** -- Types: `@elizaos/core/dist/types/agentEvent.d.ts` -- `HeartbeatEventPayload`, `HeartbeatStatus`, `HeartbeatIndicatorType` -- Service: `AgentEventService.emitHeartbeat()`, `subscribeHeartbeat()` -- Resolver: `resolveHeartbeatIndicator(status)` maps status to UI indicator - -**Code changes needed:** -1. Implement a heartbeat task worker that periodically checks agent health. -2. Emit heartbeats through the AgentEventService: - ```typescript - eventService.emitHeartbeat({ - status: "ok-token", - to: "admin-channel", - preview: "Agent operational, 3 tasks pending", - channel: "telegram", - indicatorType: "ok", - }); - ``` -3. Subscribe in TUI/dashboard for real-time health display. -4. Configure heartbeat intervals and failure thresholds. - -**Expected impact:** Continuous health monitoring. Operators know immediately when an agent goes silent, encounters errors, or degrades. The indicator system (`ok`/`alert`/`error`) provides at-a-glance status. - ---- - -### 14. HOOK_TOOL_BEFORE / HOOK_TOOL_AFTER for Approval Flows - -**What it is:** Hook events that fire before and after tool/action execution, enabling interception, modification, and approval workflows. `HOOK_TOOL_BEFORE` can skip execution (`skip: true`) or modify arguments (`modifiedArgs`). `HOOK_TOOL_AFTER` can modify results. `HOOK_TOOL_PERSIST` controls what gets stored. - -**Where it lives:** -- Events: `EventType.HOOK_TOOL_BEFORE`, `EventType.HOOK_TOOL_AFTER`, `EventType.HOOK_TOOL_PERSIST` -- Payload: `HookToolPayload` -- `toolName`, `toolArgs`, `result`, `skip`, `modifiedArgs`, `modifiedResult` -- Hook Service: `IHookService` via `ServiceType.HOOKS` -- Approval Service: `ServiceType.APPROVAL` in service registry - -**Code changes needed:** -1. Register hooks via the HookService: - ```typescript - const hookService = runtime.getService(ServiceType.HOOKS) as IHookService; - hookService.register( - [EventType.HOOK_TOOL_BEFORE], - async (payload: HookToolPayload) => { - if (payload.toolName === "transfer_funds" && needsApproval(payload.toolArgs)) { - payload.skip = true; - payload.messages.push("Transfer requires admin approval. Queued for review."); - } - }, - { name: "approval-gate", priority: 100, source: "runtime" } - ); - ``` -2. Implement an approval queue backed by tasks: - ```typescript - hookService.register( - [EventType.HOOK_TOOL_AFTER], - async (payload: HookToolPayload) => { - await auditLog(payload.toolName, payload.toolArgs, payload.result); - }, - { name: "audit-logger", source: "runtime" } - ); - ``` -3. Use `HOOK_TOOL_PERSIST` to filter sensitive data from storage. - -**Expected impact:** Human-in-the-loop safety for high-stakes actions. Financial transfers, external API calls, and data modifications can require explicit approval before execution. Full audit trail via the after-hook. - ---- - -### 15. Skill / MCP Marketplace Integration - -**What it is:** Integration with the MCP (Model Context Protocol) ecosystem and the ElizaOS skills marketplace through the installed ElizaOS package surface. Doolittle should prefer exported SDK helpers from `@elizaos/autonomous` and `@elizaos/agent`, plus native skill manifests from `@elizaos/skills`, instead of importing unavailable top-level plugin packages directly. - -**Where it lives:** -- MCP marketplace helpers: `@elizaos/autonomous/services/mcp-marketplace` -- Skill marketplace helpers: `@elizaos/autonomous/services/skill-marketplace` -- Agent registry and skill catalog clients: `@elizaos/agent/services/registry-client`, `@elizaos/agent/services/skill-catalog-client` -- Native skill file parsing and serialization: `@elizaos/skills` -- Doolittle MCP execution adapter: `packages/agent/src/services/mcp/` -- Doolittle skills hub: `packages/agent/src/services/skills-hub/` -- Research MCP: `ResearchMcpTool` type for deep research integration - -**Code changes needed:** -1. Keep local and generated skills in canonical `@elizaos/skills` frontmatter so Doolittle skill data stays portable. -2. Use `@elizaos/autonomous/services/mcp-marketplace` for marketplace search, details, and config generation. -3. Use `@elizaos/autonomous/services/skill-marketplace` and `@elizaos/agent` catalog clients for marketplace/catalog discovery instead of local scraping. -4. Keep Doolittle's local MCP execution service as the product adapter until an official MCP execution plugin is promoted to a direct top-level dependency. -5. Integrate MCP tools with the RESEARCH model type for deep research across internal knowledge bases. - -**Expected impact:** Extensible agent capabilities without code deployment. New tools, APIs, and knowledge sources can be connected at runtime via MCP. The skills marketplace enables community-contributed capabilities. - ---- - -### 16. dynamicPromptExecFromState Validation System - -**What it is:** A sophisticated prompt execution system with built-in validation codes, schema-based parsing, streaming support, and performance tracking. Uses UUID codes injected into prompts that the LLM must echo back -- if codes match, the LLM actually read and followed the prompt. Four validation levels from "trusted" (no codes) to "full" (start + end codes). - -**Where it lives:** -- Runtime method: `runtime.dynamicPromptExecFromState(args)` -- Schema: `SchemaRow[]` from `@elizaos/core/dist/types/state.d.ts` -- Options: `contextCheckLevel` (0-3), `maxRetries`, `retryBackoff`, `preferredEncapsulation` (json/xml) - -**Code changes needed:** -1. Define schemas for structured responses: - ```typescript - const schema: SchemaRow[] = [ - { name: "sentiment", type: "string", description: "positive/negative/neutral" }, - { name: "confidence", type: "number", description: "0.0 to 1.0" }, - { name: "reasoning", type: "string", description: "Why this sentiment" }, - ]; - ``` -2. Execute with validation: - ```typescript - const result = await runtime.dynamicPromptExecFromState({ - state: currentState, - params: { prompt: "Analyze sentiment of: {{recentMessages}}" }, - schema, - options: { - contextCheckLevel: 2, // Default: codes at start - modelSize: "small", - maxRetries: 2, - onStreamChunk: (chunk) => streamToClient(chunk), - }, - }); - ``` -3. Use level 3 (full validation) for critical operations where truncation detection matters. -4. Use level 0 for high-throughput, trusted model calls. - -**Expected impact:** Reliable structured LLM outputs with truncation detection. Eliminates silent failures where the LLM ignores parts of the prompt. Performance tracking per model+schema combination enables data-driven model selection. - ---- - -### 17. Advanced Sampling Controls - -**What it is:** Per-model-type configuration of all sampling parameters: temperature, top_p, top_k, min_p, seed, repetition_penalty, frequency_penalty, presence_penalty. Supports three-tier precedence: direct params > model-specific settings > default settings. - -**Where it lives:** -- Constants: `MODEL_SETTINGS` in `@elizaos/core/dist/types/model.d.ts` -- 90+ setting keys -- Character settings: `DEFAULT_TEMPERATURE`, `TEXT_SMALL_TEMPERATURE`, `OBJECT_LARGE_TOP_P`, etc. -- LLM Mode: `LLMMode.DEFAULT | SMALL | LARGE` for global model override - -**Code changes needed:** -1. Configure character settings for optimal sampling per model type: - ```json - { - "DEFAULT_TEMPERATURE": 0.7, - "TEXT_SMALL_TEMPERATURE": 0.5, - "TEXT_LARGE_TEMPERATURE": 0.7, - "OBJECT_SMALL_TEMPERATURE": 0.1, - "OBJECT_LARGE_TEMPERATURE": 0.2, - "TEXT_REASONING_SMALL_TEMPERATURE": 0.1, - "TEXT_REASONING_LARGE_TEMPERATURE": 0.1, - "DEFAULT_MAX_TOKENS": 4096, - "TEXT_LARGE_MAX_TOKENS": 8192, - "TEXT_REASONING_LARGE_MAX_TOKENS": 16384, - "DEFAULT_FREQUENCY_PENALTY": 0.1, - "DEFAULT_PRESENCE_PENALTY": 0.1 - } - ``` -2. Use `LLMMode` for cost management: - ```typescript - // Force all calls to use TEXT_SMALL for cost optimization - const runtime = new AgentRuntime({ character, llmMode: LLMMode.SMALL }); - ``` -3. Override per-call when needed (highest precedence): - ```typescript - await runtime.useModel(ModelType.TEXT_LARGE, { - prompt, - temperature: 0.0, // Overrides character settings - seed: 42, // Deterministic output - }); - ``` - -**Expected impact:** Fine-grained control over output quality, creativity, and cost. Reasoning models get low temperature for determinism. Object generation gets minimal temperature for schema compliance. Creative tasks get higher temperature. Seed support enables reproducible outputs for testing. - ---- - -## Implementation Roadmap Summary - -| Phase | Items | Effort (days) | Key Dependency | -|---|---|---|---| -| **Critical** | AwarenessRegistry, 4 Evaluators, RESEARCH model, TEXT_REASONING | 5-7 | OpenAI API key for RESEARCH, MemoryStorageProvider for evaluators | -| **High** | AgentEventService, Trajectories, Tasks, Relationships, OBJECT models, Prompt caching | 7-10 | Database adapter for task persistence | -| **Medium** | Triggers, Sandbox, Heartbeat, Tool hooks, MCP/Skills, Validation, Sampling | 10-14 | E2B API key for sandbox, MCP servers configured | - -## Architecture Notes - -- **PromptBatcher integration:** The autonomy service uses the prompt batcher (Option A) rather than task-based scheduling. The batcher's `minCycleMs` and background tick control autonomy timing. -- **Service discovery:** All services are accessed via `runtime.getService(ServiceType.X)`. Check availability with `runtime.hasService()` before use. -- **Plugin registration order matters:** Bootstrap plugin should load first (provides reflection evaluator), then model provider plugins, then advanced memory/planning. -- **Batched task scheduler:** For multi-agent deployments, `startTaskScheduler(adapter)` creates one timer for all runtimes instead of N timers doing N `getTasks()` calls. -- **Event system is dual-layer:** `EventType` enum events go through `runtime.emitEvent()` / `runtime.registerEvent()`. Agent events go through `AgentEventService.emit()` / `subscribe()`. They serve different purposes -- system lifecycle vs. observability. diff --git a/docs/elizaos-research.md b/docs/elizaos-research.md deleted file mode 100644 index fef72519..00000000 --- a/docs/elizaos-research.md +++ /dev/null @@ -1,92 +0,0 @@ -# ElizaOS Research Notes - -This document captures framework-level findings that matter for keeping Doolittle aligned with the current ElizaOS 2.x architecture. - -## Package Status Observed On May 9, 2026 - -Current npm metadata is not lockstep across the ElizaOS package family, so Doolittle should pin package-by-package instead of assuming one shared version. - -| Package | npm `latest` | npm `alpha` | Doolittle strategy | -| --- | --- | --- | --- | -| `elizaos` | `1.7.2` | `2.0.0-alpha.535` | Use explicit alpha | -| `@elizaos/core` | `1.7.2` | `2.0.0-alpha.537` | Use explicit alpha | -| `@elizaos/agent` | `0.25.9` | `2.0.0-alpha.537` | Use explicit alpha | -| `@elizaos/skills` | `2.0.0-alpha.77` | `2.0.0-alpha.539` | Use explicit alpha | -| `@elizaos/autonomous` | `2.0.0-alpha.77` | `2.0.0-alpha.85` | Keep current alpha, because no newer alpha is published | -| `@elizaos/plugin-openai` | `1.6.0` | `2.0.0-alpha.537` | Use explicit alpha | -| `@elizaos/plugin-sql` | `1.7.2` | `2.0.0-alpha.20` | Keep workspace compatibility wrapper around the newest published alpha | - -Implications: - -- The 2.x runtime line still lives behind explicit alpha tags for the core runtime packages. -- Several official plugins have reached `2.0.0-alpha.537`, but some packages, such as SQL and autonomous, have their own latest available alpha. -- Workspace wrappers are still valuable where Doolittle needs compatibility patches or plugins that are not published as official npm packages. - -## Current Architecture Findings - -### 1. The New `ElizaOS` Orchestrator Is A Better Harness Boundary - -The current runtime docs show `ElizaOS` handling plugin resolution, multi-agent orchestration, `addAgents`, `startAgents`, `handleMessage`, streaming callbacks, events, and health checks. - -What that means for Doolittle: - -- Doolittle should keep shrinking toward a harness around ElizaOS runtime orchestration. -- Local CLI, gateway, browser, account linking, and diagnostics should wrap the runtime instead of becoming a parallel agent framework. -- The Doolittle value layer is operator ergonomics, provider/account bridges, native local execution, and harness policy. - -### 2. Runtime-Centered Design Is Still Correct - -ElizaOS is still centered around `AgentRuntime` and plugin-loaded runtime capabilities. - -What that means for Doolittle: - -- character, plugins, model settings, memory, and message processing should remain the center of the app -- HTTP, CLI, gateway, and scheduling layers should adapt into runtime messages and services -- app code should avoid duplicating runtime orchestration where the SDK now owns it - -### 3. Services Are The Native Long-Running Integration Model - -Official docs register services through plugins and expose them with `runtime.getService(...)`. - -Implication for Doolittle: - -- gateway lifecycles, browser/MCP bridges, platform adapters, account refreshers, and background coordination should continue moving into ElizaOS plugin services -- standalone app services should be treated as harness adapters unless they truly belong outside the runtime - -### 4. Plugins Are Broader Than Actions - -Current plugin docs cover actions, providers, evaluators, services, routes, events, and model handlers. - -Implication for Doolittle: - -- the Doolittle plugin surface should prefer native plugin components over app-only extension points -- plugin-provided routes may be a good fit for runtime-owned APIs -- model/provider wrappers should stay plugin-native so they can benefit from SDK routing and model selection - -## Application Direction For Doolittle - -### Good Current Alignment - -- runtime-centered bootstrapping -- custom Doolittle plugin for actions/providers/evaluators/models -- SQL-backed runtime initialization -- canonical message processing path for chat requests -- workspace wrappers where official package versions lag or Doolittle needs compatibility patches - -### Highest-Value Next Refactors - -1. Treat Doolittle as the harness around ElizaOS rather than a replacement agent runtime. -2. Evaluate replacing remaining bespoke runtime boot logic with the `ElizaOS` orchestrator where the alpha SDK now supports it cleanly. -3. Promote gateway lifecycle and account/provider bridges into real ElizaOS `Service` classes where they are still app-bound. -4. Move runtime-owned HTTP surfaces into plugin routes when the ownership boundary is clear. -5. Keep package audit/version tooling explicit about `latest` versus `alpha`, because npm dist-tags are mixed across the ecosystem. - -## Sources Consulted - -Primary sources: - -- ElizaOS core runtime docs: https://docs.elizaos.ai/runtime/core -- ElizaOS services docs: https://docs.elizaos.ai/runtime/services -- ElizaOS project docs: https://docs.elizaos.ai/projects/overview -- ElizaOS plugin reference: https://docs.elizaos.ai/plugins/reference -- npm package metadata via `npm view` for `elizaos`, `@elizaos/core`, `@elizaos/agent`, `@elizaos/skills`, `@elizaos/autonomous`, `@elizaos/plugin-openai`, and `@elizaos/plugin-sql` diff --git a/docs/module-structure-guidelines.md b/docs/module-structure-guidelines.md deleted file mode 100644 index c524d7d9..00000000 --- a/docs/module-structure-guidelines.md +++ /dev/null @@ -1,62 +0,0 @@ -# Module Structure Guidelines - -This repo is converging on a folder-first layout with thin entrypoints. - -## Core rules - -- let the folder own the domain name - - inside `gateway/`, prefer `read-model.ts` over `gateway-read-model.ts` - - inside `services/media/`, prefer `inspection/service.ts` over `media-service-inspection.ts` -- keep top-level entry files orchestration-only - - acceptable entrypoint names: `index.ts`, `service.ts`, `route.ts`, `runtime.ts`, `cli.ts` - - push branching logic and formatting helpers into sibling modules or subfolders -- colocate tests with the modules they exercise - - prefer `foo.ts` + `foo.test.ts` in the same folder -- keep types in one obvious place per namespace - - prefer `types.ts` for a small surface - - prefer `types/` when the namespace has multiple type-only modules -- avoid compatibility facades in new work - - migrate callers to the canonical folder-owned module and remove the old shim once the slice is complete - -## Preferred patterns - -- domain folder with a stable entry surface - - `server/routes/identity.ts` - - `server/routes/identity/profiles.ts` -- service folder with decision-local helpers - - `services/trajectory/service/index.ts` - - `services/trajectory/latest-benchmark.ts` -- subdomain folders when a namespace has multiple seams - - `gateway/read/*` - - `runtime/native/service-bridge/transport-control.ts` - - `scripts/bootstrap/prompting/*` - -## Naming anti-patterns - -- repeating the folder name in every file - - `gateway/receive/replay.ts` - - `services/media/formatters/index.ts` - - `services/terminal/terminal-service-cloud-backends.ts` -- keep moved modules on their canonical folder paths: - - `gateway/runner/gateway-runner.ts` -- hybrid ownership for the same domain - - avoid keeping both `services/foo-service.ts` and `services/foo/*` as competing homes for new logic -- generic helper dumping grounds - - avoid `helpers.ts`, `utils.ts`, or `misc.ts` when the file can be named for a concrete responsibility -- duplicated namespace prefixes - - avoid names like `services/services-tools-dynamic-state.ts` - -## Current migration direction - -- prefer domain-first folders in `packages/agent/src/` -- keep only true process-root files at the top of `scripts/bootstrap/` -- migrate remaining flat `gateway-*` and `terminal-service-*` clusters toward owned folders with shorter filenames -- normalize service namespaces so each domain has one clear home - -## Review checklist - -- can a new reader guess where logic belongs from the folder name alone? -- does the filename add new meaning, or just repeat the folder? -- is the entry file mostly orchestration rather than implementation detail? -- are types and tests easy to find without searching? -- if a file moved, is the compatibility story explicit? diff --git a/docs/monorepo.md b/docs/monorepo.md deleted file mode 100644 index e4b7b6aa..00000000 --- a/docs/monorepo.md +++ /dev/null @@ -1,66 +0,0 @@ -# Monorepo Layout - -Doolittle is organized as a Bun workspace monorepo. - -## Workspace roles - -- root package - - workspace manifest, shared scripts, root docs, and top-level toolchain config -- `packages/agent` - - the primary Doolittle application source - - runtime, CLI, API, gateway, and product-specific services -- `packages/plugins` - - local Doolittle product plugins and provider bridge packages - - includes the consolidated Doolittle plugin plus first-party provider bridges such as `plugin-codex`, `plugin-claude-code`, `plugin-devin`, `plugin-elizacloud`, and `plugin-sql` -- `packages/skills` - - local Doolittle skill content and generated skills - - organized by category for discoverability (`identity/`, `memory/`, `productivity/`, `automation/`, `platform/`, `browser/`, `media/`, `research/`, `generated/`) -- `packages/characters` - - character definitions and persona data -## Boundary rules - -- keep product behavior in `packages/agent/src/` - - gateway orchestration - - operator flows - - ACP surfaces - - Doolittle identity and routing -- keep provider bridges and product plugin facets in `packages/plugins/*` - - avoid claiming official plugin workspaces unless they are actual workspace packages - - prefer direct ElizaOS SDK imports over local compatibility shims -- keep workspace-level documentation at the repo root and under `docs/` - -See [module-structure-guidelines.md](./module-structure-guidelines.md) for the naming and folder rules the repo is converging toward during the stabilization pass. - -## Validation - -Run the workspace quality pass from the repo root: - -```bash -bun run check -``` - -## Bootstrap flow - -For a fresh clone, use the Bun-first installer wrapper: - -```bash -bash scripts/install.sh -``` - -That script installs workspace dependencies, creates `.env` from `.env.example` if needed, and seeds the local runtime directories under `.doolittle/`. - -If you only need the bootstrap step again: - -```bash -bun run bootstrap -``` - -Useful workspace commands: - -```bash -bun run workspace:list -bun run lint:check -bun run typecheck -bun test -bun run build -``` diff --git a/docs/native-experience-ledger.md b/docs/native-experience-ledger.md deleted file mode 100644 index 98c3de44..00000000 --- a/docs/native-experience-ledger.md +++ /dev/null @@ -1,32 +0,0 @@ -# Doolittle Native Experience Ledger - -This ledger tracks the native experience gaps that still remain after the current gateway/API work. Items that are already present in Doolittle are called out briefly so the focus stays on the residual experience debt. - -## Covered In This Wave - -- Gateway supervision is now represented by live health, supervision, journal, history, and replay surfaces in [`packages/agent/src/gateway/runner/gateway-runner.ts`](../packages/agent/src/gateway/runner/gateway-runner.ts) and [`packages/agent/src/server.ts`](../packages/agent/src/server.ts). -- Inbox/outbox journaling is now persisted through gateway trace, delivery, attachment, and replay history in [`packages/agent/src/gateway/runner/gateway-runner.ts`](../packages/agent/src/gateway/runner/gateway-runner.ts), [`packages/agent/src/services/delivery-service.ts`](../packages/agent/src/services/delivery-service.ts), and [`packages/agent/src/services/gateway-session-service.ts`](../packages/agent/src/services/gateway-session-service.ts). -- Responses-style API transport is now present through [`packages/agent/src/services/api-transport-service.ts`](../packages/agent/src/services/api-transport-service.ts) and the `/v1/responses` routes in [`packages/agent/src/server.ts`](../packages/agent/src/server.ts). - -## Remaining Native Gaps - -| Experience claim | Reference surfaces | Doolittle surfaces | Status | Remaining native gap | -|---|---|---|---|---| -| Always-on gateway runtime supervision | `gateway/run.py`, `gateway/status.py`, `gateway/platforms/signal.py`, `gateway/platforms/matrix.py`, `gateway/platforms/whatsapp.py`, `gateway/platforms/homeassistant.py` | `packages/agent/src/gateway/runner/gateway-runner.ts`, `packages/agent/src/server.ts`, `packages/agent/src/gateway/platforms/base.ts` | Mostly covered | Doolittle now tracks supervision, heartbeat, and state snapshots, but it still needs stronger daemon-grade reconnect/restart behavior for long-lived native transports and cleaner adapter recovery semantics. | -| Inbox / outbox journaling and replay | `gateway/run.py`, `gateway/platforms/api_server.py`, `gateway/platforms/base.py`, `gateway/platforms/dingtalk.py`, `gateway/platforms/telegram.py`, `gateway/platforms/discord.py`, `gateway/platforms/matrix.py` | `packages/agent/src/gateway/runner/gateway-runner.ts`, `packages/agent/src/services/delivery-service.ts`, `packages/agent/src/services/gateway-session-service.ts`, `packages/agent/src/server.ts` | Mostly covered | The journal/replay path now exists, but Doolittle still needs attachment-aware transcript rewrite, richer per-platform journal retention, and native reply routing fidelity across every transport. | -| Transport UX details | `gateway/platforms/telegram.py`, `gateway/platforms/discord.py`, `gateway/platforms/matrix.py`, `gateway/platforms/dingtalk.py`, `gateway/platforms/whatsapp.py`, `gateway/platforms/signal.py`, `gateway/run.py` | `packages/agent/src/gateway/platforms/*.ts`, `packages/agent/src/gateway/runner/gateway-runner.ts`, `packages/agent/src/server.ts` | Partial | Doolittle supports reply/edit/progressive delivery metadata, but still needs more complete platform-native behavior for typing indicators, edit-in-place, voice memo routing, thread-aware continuity, and session-home delivery semantics. | -| Stateful OpenAI-compatible Responses API transport | `gateway/platforms/api_server.py` | `packages/agent/src/services/api-transport-service.ts`, `packages/agent/src/server.ts` | Mostly covered | Doolittle now persists `previous_response_id` and serves `/v1/responses`, but still needs stricter Responses schema fidelity, richer streamed event behavior, and deeper session continuity semantics. | -| Operator session controls | `cli.py`, `gateway/run.py` | `packages/agent/src/runtime/chat.ts`, `packages/agent/src/cli.ts`, `packages/agent/src/server.ts` | Partial | Doolittle has comparable operator surfaces, but still needs a denser live-control loop for retry, undo, rollback, resume, compress, title, home, voice, status, and usage as first-class gateway commands. | -| Home Assistant-style event source | `gateway/platforms/homeassistant.py` | `packages/agent/src/gateway/platforms/homeassistant-adapter/index.ts`, `packages/agent/src/gateway/runner/gateway-runner.ts`, `packages/agent/src/server.ts` | Partial | Doolittle has a Home Assistant adapter and event routing, but still needs complete daemon-source semantics with watch filters, sync loops, and REST reply delivery. | - -## Priority Local Follow-Ups - -1. Finish daemon-grade reconnect and recovery behavior for the enabled native transports. -2. Tighten journal semantics so replay, attachment retention, and transcript rewriting are platform-aware rather than just history-backed. -3. Close the last Responses API fidelity gaps around streaming shape, session continuity, and turn stitching. -4. Expand operator commands so the live gateway/session controls make `/retry`, `/undo`, `/compress`, `/usage`, and `/insights` feel first-class. -5. Deepen Home Assistant-style event-source lifecycle handling for watch, sync, and reply loops. - -## Current Read - -Doolittle now has the broad gateway/API shape. The remaining work is about native product fidelity: daemon recovery, journal semantics, Responses transport behavior, and platform-native live control. diff --git a/docs/operator-loop.md b/docs/operator-loop.md deleted file mode 100644 index b1838da9..00000000 --- a/docs/operator-loop.md +++ /dev/null @@ -1,117 +0,0 @@ -# Doolittle Operator Loop - -Use this when you already have Doolittle installed and want the shortest truthful path to the daily flow. - -## The shape - -Doolittle has one runtime and a few ways to drive it: - -| Surface | Command | Use when | -|---|---|---| -| Plain shell | `doolittle` | Everyday conversation, approvals, slash commands, and live work | -| Cockpit | `doolittle cockpit` | Fullscreen observability and longer-running operator sessions | -| One-shot aliases | `doolittle status`, `doolittle tools`, `doolittle skills`, `doolittle runtime` | Fast orientation without opening the shell first | -| API | `doolittle api` | Scripted clients, editor integrations, and REST consumers | -| Gateway | `doolittle gateway` | Messaging transports, delivery flow, and gateway supervision | - -The important part is that these are not separate products. The shell, API, and gateway all sit on the same assembled runtime. - -## Daily loop - -The normal loop is: - -1. Start with `doolittle`. -2. Ask for work directly, or use `/status` if you need to orient first. -3. If you need capability discovery, use `doolittle tools`, `doolittle skills`, or `doolittle runtime`. -4. If you need transport operations or live delivery state, move into the gateway lane. -5. If something feels wrong, use `doolittle doctor` or `/doctor`. - -## Top-level aliases - -These are the fastest way to regain context: - -| Alias | Maps to | Use when | -|---|---|---| -| `doolittle status` | `/status` | Check readiness, hydration, and operator summary | -| `doolittle tools` | `/tools summary` by default | See the current tool surface quickly | -| `doolittle skills` | `/skills` by default | See installed, generated, and hub-backed skills | -| `doolittle runtime` | `/runtime status` by default | Inspect startup state, plugin inventory, and native ownership | - -If you stay inside the shell, the equivalent first commands are: - -- `/status` -- `/doctor` -- `/runtime status` -- `/tools summary` -- `/skills` - -## Runtime lane - -Use the runtime lane when you want to answer, "is the agent itself healthy and assembled correctly?" - -Start here: - -- `doolittle status` -- `doolittle runtime` -- `doolittle doctor` - -Or inside the shell: - -- `/status` -- `/runtime status` -- `/doctor` -- `/setup summary` - -API equivalents: - -- `GET /health` -- `GET /runtime/status` -- `GET /runtime/plugins` -- `GET /doctor` - -## Gateway lane - -Use the gateway lane when you want to answer, "are transports alive, routing, and delivering correctly?" - -Start here: - -- `doolittle gateway` -- `/gateway status` -- `/gateway state` -- `/gateway runtime` -- `/gateway trace` - -API equivalents: - -- `GET /gateway/health` -- `GET /gateway/runtime` -- `GET /gateway/state` -- `GET /gateway/trace` -- `GET /gateway/inbox` -- `GET /gateway/outbox` - -The gateway is part of the same runtime story, but it is a different operator concern than basic shell readiness. - -## Smallest truthful first-run check - -If you want the shortest "am I actually ready?" loop: - -1. `doolittle status` -2. `doolittle tools` -3. `doolittle runtime` -4. `doolittle doctor` if anything looks degraded -5. `doolittle gateway` only when you need transport operations - -## Recovery - -- Shell command missing: restart your terminal or invoke `~/.local/bin/doolittle`. -- Setup looks incomplete: run `doolittle setup`, then `doolittle doctor`. -- Runtime looks degraded: compare `doolittle status` with `doolittle runtime` to separate readiness from capability assembly. -- Gateway looks stale: `doolittle gateway stop`, then `doolittle gateway start`. - -## Next docs - -- [`README.md`](../README.md) for the full surface map -- [`quickstart.md`](./quickstart.md) for install-to-ready -- [`plugin-inventory.md`](./plugin-inventory.md) for truth about assembled plugin state -- [`operator-wow-contract.md`](./operator-wow-contract.md) for native operator acceptance scenarios and next implementation tasks diff --git a/docs/operator-wow-contract.md b/docs/operator-wow-contract.md deleted file mode 100644 index b1661c1b..00000000 --- a/docs/operator-wow-contract.md +++ /dev/null @@ -1,585 +0,0 @@ -# Operator Wow Contract - -This file is generated from the code-backed Doolittle operator wow contract. -Do not edit it by hand; run `bun run scripts/sync-doc-truth.ts --write`. - -## Product Thesis - -Doolittle should become an ElizaOS-native harness that feels as capable, reachable, and alive as a native ElizaOS operator without turning ElizaOS into a bespoke monolith. - -The contract is intentionally acceptance-led. Every pillar maps research signals to ElizaOS leverage, Doolittle runtime surfaces, concrete scenarios, current gaps, and the next implementation tasks. - -## Summary - -- Pillars: 8 -- Acceptance scenarios: 16 -- Implementation tasks: 16 - -## First Run To Working Assistant - -- Runtime ID: `first-run-to-working-assistant` -- Outcome: A new operator can install, configure, inspect readiness, and complete a first useful assistant turn without reading architecture docs. -- Doolittle surfaces: `bash scripts/install.sh`, `scripts/bootstrap.ts`, `doolittle status`, `doolittle doctor`, `GET /runtime/status` - -### Reference Signals - -- OpenClaw makes onboarding a product surface with `openclaw onboard`, daemon install, provider setup, dashboard launch, and a first chat. -- Doolittle keeps setup close to the terminal and exposes provider/model readiness through native CLI commands before deeper work starts. - -### ElizaOS Leverage - -- ElizaOS provider plugins own model connectivity instead of Doolittle inventing provider clients. -- ElizaOS runtime bootstrap and plugin assembly become the readiness source that Doolittle reports through shell, API, and gateway surfaces. - -### Acceptance Scenarios - -#### first-run-to-working-assistant.install-check - -- Surface: `installer` -- Current status: `partial` -- Trigger: Run `bash scripts/install.sh --check --yes` in a clean checkout. -- Required signals: - - Reports which files would be written without mutating them. - - Names provider, execution backend, gateway, and workspace decisions. - - Returns a nonzero exit only for a real setup blocker. -- Verification: - - Add an installer smoke test that asserts dry-run output contains `.env`, `.doolittle/settings.json`, and `.doolittle/gateway/gateway.json`. - - Run `bun test scripts/bootstrap-program.test.ts scripts/bootstrap/program/summary.test.ts`. - -#### first-run-to-working-assistant.first-chat - -- Surface: `plain CLI and API` -- Current status: `partial` -- Trigger: Run `doolittle status`, then `doolittle exec -p "status" --json` after onboarding. -- Required signals: - - Shows runtime readiness, configured model/provider, plugin hydration, and degraded surfaces separately. - - Uses the same runtime truth as `GET /runtime/status`. - - Does not claim a capability is ready when it is only installed. -- Verification: - - Add a one-shot invocation regression test for `status` and `exec --json` readiness shape. - - Run `bun test packages/agent/src/entrypoint/invocation.test.ts`. - -### Current Gaps - -- The installer and bootstrap path are strong but not yet scored against a five-minute first useful turn. -- Readiness output is broad, but the first-run path still needs one clear success transcript that is kept current by tests. - -### Next Implementation Tasks - -#### first-run-decision-receipt - -- Title: Add provider, backend, gateway, and workspace decisions to first-run receipts. -- Owner surface: `bootstrap` -- Files: `scripts/bootstrap/answers/review.ts`, `scripts/bootstrap/program/summary.ts`, `docs/quickstart.md` -- Definition of done: - - Check, headless, and completed onboarding receipts name provider, execution backend, gateway mode, and workspace root. - - The quickstart explains how to read the receipt and which fields prove first-run readiness. - - `bun test scripts/bootstrap-program.test.ts scripts/bootstrap/answers.test.ts` passes. - -#### first-chat-readiness-contract - -- Title: Make first chat readiness measurable across CLI and API. -- Owner surface: `runtime status` -- Files: `packages/agent/src/entrypoint/invocation.test.ts`, `packages/agent/src/services/operator/runtime-summary/update.test.ts`, `docs/operator-loop.md` -- Definition of done: - - `doolittle status` and `GET /runtime/status` expose the same provider, plugin, gateway, and degraded-mode fields. - - The operator loop doc points to the same readiness fields. - - `bun test packages/agent/src/entrypoint/invocation.test.ts packages/agent/src/services/operator/runtime-summary/update.test.ts` passes. - -## Terminal Operator Loop - -- Runtime ID: `terminal-operator-loop` -- Outcome: The everyday shell feels like a live operator console: multiline chat, slash control, shell shortcuts, streaming tool progress, interruption, and recovery. -- Doolittle surfaces: `packages/agent/src/runtime/chat.ts`, `packages/agent/src/cli.ts`, `packages/agent/src/cli/shell-chrome.ts`, `packages/agent/src/cli/tui-renderers.test.ts` - -### Reference Signals - -- Doolittle creates trust with a dense terminal loop: streaming tool output, slash commands, approvals, interrupts, model switching, and resumable sessions. -- OpenClaw keeps chat commands such as `/status`, `/compact`, `/usage`, `/trace`, `/verbose`, and `/restart` available from chat surfaces. - -### ElizaOS Leverage - -- ElizaOS message handling remains the natural-language route; Doolittle owns shell chrome and operator commands. -- ElizaOS events and services provide action progress that the CLI and cockpit render without fabricating steps. - -### Acceptance Scenarios - -#### terminal-operator-loop.command-deck - -- Surface: `plain CLI` -- Current status: `partial` -- Trigger: Start `doolittle`, run `/status`, `/tools summary`, `/runtime status`, `/doctor`, and `/gateway status`. -- Required signals: - - Every command returns a compact operator result without leaving the runtime lane. - - Degraded components are named separately from ready components. - - The command deck includes retry, undo, compress, usage, insights, and model controls once implemented. -- Verification: - - Add command parser tests for each slash command and expected route. - - Run `bun test packages/agent/src/runtime/chat.test.ts packages/agent/src/cli/tui-renderers.test.ts`. - -#### terminal-operator-loop.interrupt-and-resume - -- Surface: `plain CLI and cockpit` -- Current status: `missing` -- Trigger: Start a long-running tool turn, send a steering message, then resume or stop the run. -- Required signals: - - The UI shows the active run id, active tool, and last observed progress. - - Stop and resume affect the real run controller state. - - The final transcript records whether the run completed, stopped, or was superseded. -- Verification: - - Add run-controller tests for stop, steering, and resume transitions. - - Run `bun test packages/agent/src/runtime/chat-turn packages/agent/src/cli`. - -### Current Gaps - -- Doolittle has useful shell and cockpit surfaces, but live session controls still need first-class retry, undo, compress, usage, and insights behavior. -- Interrupt and steering behavior is not yet expressed as a first-class acceptance contract. - -### Next Implementation Tasks - -#### operator-command-surface - -- Title: Promote retry, undo, compress, usage, insights, and model controls into first-class slash commands. -- Owner surface: `operator shell` -- Files: `packages/agent/src/runtime/chat.ts`, `packages/agent/src/runtime/chat-turn/provider-handler.ts`, `packages/agent/src/cli/shell-chrome.ts`, `docs/operator-loop.md` -- Definition of done: - - Each command has parser coverage and a compact operator response. - - Commands that need unavailable runtime support return a truthful degraded response. - - `bun test packages/agent/src/runtime packages/agent/src/cli` passes. - -#### run-interrupt-contract - -- Title: Make stop, steering, and resume transitions visible and test-backed. -- Owner surface: `run controller` -- Files: `packages/agent/src/runtime/chat-turn`, `packages/agent/src/runtime/run-controller`, `packages/agent/src/cli/tui-renderers.test.ts` -- Definition of done: - - Active runs expose id, state, active tool, and last progress timestamp. - - Stopping a run records an explicit terminal state in the transcript. - - Steering messages are queued or injected according to a documented policy. - -## Real Tools And Coding - -- Runtime ID: `real-tools-and-coding` -- Outcome: Doolittle can inspect, edit, test, review, and explain a repository with the same reliability expected from a daily coding agent. -- Doolittle surfaces: `packages/plugins/doolittle-plugin/coding-agent`, `packages/plugins/doolittle-plugin/autocoder`, `packages/agent/src/runtime/native/service-bridge/tooling`, `packages/agent/src/runtime/native/service-bridge/autocoder` - -### Reference Signals - -- Doolittle earns confidence through reliable terminal backends, file tools, browser tools, approvals, MCP, and delegation. -- OpenClaw showcases chat-native coding loops where work starts in a mobile channel and lands as tested changes or PR feedback. - -### ElizaOS Leverage - -- ElizaOS actions and services should own tool availability; Doolittle contributes coding context, approval policy, and verification rituals. -- ElizaOS skills should teach tool use for repo-specific workflows instead of hardcoding every procedure into the agent loop. - -### Acceptance Scenarios - -#### real-tools-and-coding.repo-fix - -- Surface: `coding agent` -- Current status: `partial` -- Trigger: Ask Doolittle to fix a focused failing test in the current workspace. -- Required signals: - - Searches before editing. - - Applies a minimal patch. - - Runs the targeted failing test and a relevant passing verification. - - Summarizes files changed and verification results. -- Verification: - - Add a fixture repository with one failing test and one expected patch. - - Run a deterministic coding-agent smoke test against that fixture. - -#### real-tools-and-coding.review-loop - -- Surface: `review command` -- Current status: `missing` -- Trigger: Ask Doolittle to review a diff and provide correctness risks before summary. -- Required signals: - - Findings lead the response. - - File and line references are included for every actionable issue. - - No issue is reported when the diff is clean and verified. -- Verification: - - Add review fixture tests with one known bug and one clean diff. - - Run `bun test packages/plugins/doolittle-plugin/coding-agent`. - -### Current Gaps - -- Autocoder surfaces are explicitly planning-first; they should not be marketed as production-grade mutation until fixture-backed edits exist. -- Coding-agent behavior needs deterministic fixtures for edit, test, review, and rollback flows. - -### Next Implementation Tasks - -#### coding-fixture-harness - -- Title: Create a deterministic coding fixture harness. -- Owner surface: `coding agent` -- Files: `packages/plugins/doolittle-plugin/coding-agent/runtime.ts`, `packages/plugins/doolittle-plugin/coding-agent/service.ts`, `packages/plugins/doolittle-plugin/coding-agent/index.test.ts` -- Definition of done: - - The fixture starts with a known failing test and ends with a known passing test. - - The service reports search, patch, and verification events separately. - - The final response includes changed files and commands run. - -#### review-fixture-harness - -- Title: Add PR-style review fixtures that enforce findings-first output. -- Owner surface: `coding agent review` -- Files: `packages/plugins/doolittle-plugin/coding-agent/runtime.ts`, `packages/plugins/doolittle-plugin/coding-agent/index.test.ts`, `docs/operator-loop.md` -- Definition of done: - - A buggy fixture produces one finding with a file and line. - - A clean fixture produces an explicit no-findings response. - - The review docs match the tested output order. - -## Memory Learning And Skills - -- Runtime ID: `memory-learning-skills` -- Outcome: Doolittle gets better with use by recalling durable preferences, finding past sessions, and proposing approved skills for repeated workflows. -- Doolittle surfaces: `packages/agent/src/runtime/native/memory-storage-runtime.ts`, `packages/agent/src/runtime/native/service-bridge/autonomous-skills.ts`, `packages/skills`, `docs/skills-hub.md` - -### Reference Signals - -- Doolittle makes learning visible through memory files, session search, skill creation, and skill improvement loops. -- OpenClaw's Skill Workshop pattern treats new skills as proposals that can be scanned, approved, and refreshed without a restart. - -### ElizaOS Leverage - -- ElizaOS evaluators and memory providers should capture durable facts after turns. -- @elizaos/skills should remain the skill format and loading engine, while Doolittle owns approval and workspace placement. - -### Acceptance Scenarios - -#### memory-learning-skills.preference-recall - -- Surface: `memory` -- Current status: `partial` -- Trigger: Tell Doolittle a durable preference, start a new session, then ask a related question. -- Required signals: - - The preference is stored in a durable memory surface. - - The next session can recall it without the user restating it. - - The response distinguishes memory from live facts. -- Verification: - - Add a memory persistence test that writes, restarts the memory runtime, and retrieves the preference. - - Run `bun test packages/agent/src/runtime/native/memory-storage-runtime.test.ts`. - -#### memory-learning-skills.skill-proposal - -- Surface: `skills` -- Current status: `missing` -- Trigger: Ask Doolittle to remember a repeatable workflow as a skill after it has completed the workflow once. -- Required signals: - - Produces a `SKILL.md` proposal with name, description, and instructions. - - Scans or labels risk before writing to workspace skills. - - Refreshes the skill inventory after approval. -- Verification: - - Add a skill synthesis test with a generated skill proposal and approval gate. - - Run `bun test packages/agent/src/runtime/native/service-bridge/autonomous-skills.test.ts`. - -### Current Gaps - -- Memory storage exists, but active recall and post-turn learning are not yet measured by product-level acceptance scenarios. -- Skill synthesis is documented as a Doolittle aim, but approval, scan, write, and refresh behavior need a real harness. - -### Next Implementation Tasks - -#### durable-memory-recall - -- Title: Add a cross-session durable memory recall test. -- Owner surface: `memory` -- Files: `packages/agent/src/runtime/native/memory-storage-runtime.ts`, `packages/agent/src/runtime/native/memory-storage-runtime.test.ts`, `docs/operator-loop.md` -- Definition of done: - - A saved preference survives runtime recreation. - - Recall metadata says where the memory came from. - - The operator docs explain how to inspect and correct memory. - -#### approved-skill-workshop - -- Title: Build the approved skill proposal path. -- Owner surface: `skills` -- Files: `packages/agent/src/runtime/native/service-bridge/autonomous-skills.ts`, `packages/agent/src/runtime/native/service-bridge/autonomous-skills.test.ts`, `docs/skills-hub.md` -- Definition of done: - - Skill proposals are written only after explicit approval or a configured trusted mode. - - Unsafe proposal content is rejected or quarantined. - - The generated skill appears in the next skill inventory snapshot. - -## Gateway Everywhere Presence - -- Runtime ID: `gateway-everywhere-presence` -- Outcome: Doolittle can be reached from trusted messaging channels and keeps delivery, threads, attachments, and recovery visible. -- Doolittle surfaces: `packages/agent/src/gateway/runner/gateway-runner.ts`, `packages/agent/src/gateway/platforms`, `packages/plugins/doolittle-plugin/gateway-service.ts`, `packages/agent/src/server.ts` - -### Reference Signals - -- Doolittle needs broad messaging adapters and a mature gateway/session delivery loop. -- OpenClaw pushes this further with local-first gateway, pairing, many channels, nodes, device trust, dashboard, and channel-native behavior. - -### ElizaOS Leverage - -- ElizaOS services should host long-lived gateway adapters and expose routes for read/control planes. -- Doolittle should keep transport UX and security policy in the harness, not inside the model prompt. - -### Acceptance Scenarios - -#### gateway-everywhere-presence.paired-dm - -- Surface: `gateway` -- Current status: `partial` -- Trigger: Send a message from a paired Telegram or Discord identity to the Doolittle gateway. -- Required signals: - - Authorization decision is logged. - - Session key is stable for the channel peer. - - Typing/progress/final delivery behavior is platform-aware. -- Verification: - - Add mocked platform adapter tests for authorization, session binding, and final delivery. - - Run `bun test packages/agent/src/gateway`. - -#### gateway-everywhere-presence.reconnect-replay - -- Surface: `gateway runner` -- Current status: `partial` -- Trigger: Restart a running gateway while messages are queued or delivery is in progress. -- Required signals: - - The runner records supervision state before and after restart. - - Queued outbound messages are replayed or marked failed with a reason. - - Attachment retention and transcript rewrite policy are explicit. -- Verification: - - Add runner tests for restart, replay, and failed delivery state. - - Run `bun test packages/agent/src/gateway/gateway-supervision-flow.test.ts packages/agent/src/gateway/runner`. - -### Current Gaps - -- Doolittle has gateway surfaces, but OpenClaw leads on channel breadth, device pairing, and platform-native polish. -- Replay and attachment semantics need stricter tests before the gateway can be treated as always-on. - -### Next Implementation Tasks - -#### gateway-daemon-recovery - -- Title: Tighten daemon-grade reconnect and replay semantics. -- Owner surface: `gateway runner` -- Files: `packages/agent/src/gateway/runner/gateway-runner.ts`, `packages/agent/src/gateway/gateway-supervision-flow.test.ts`, `docs/native-experience-ledger.md` -- Definition of done: - - Restart scenarios preserve or explicitly fail queued work. - - Replay entries include platform, target, idempotency key, and delivery state. - - The native experience ledger names remaining platform-specific gaps only. - -#### channel-native-polish - -- Title: Make platform-native message behavior testable per adapter. -- Owner surface: `gateway adapters` -- Files: `packages/agent/src/gateway/platforms`, `packages/agent/src/gateway/receive/setup.test.ts`, `docs/native-experience-ledger.md` -- Definition of done: - - Each enabled adapter declares typing, edit, reply, thread, attachment, and voice support. - - Mock tests assert the declared support is reflected in delivery behavior. - - Unsupported capabilities produce explicit degraded metadata. - -## Automation And Daily Tasks - -- Runtime ID: `automation-and-daily-tasks` -- Outcome: Doolittle can run scheduled work, short follow-ups, standing orders, and daily briefings with observable delivery. -- Doolittle surfaces: `packages/plugins/doolittle-plugin/scheduler-service.ts`, `packages/agent/src/server.ts`, `packages/agent/src/services/gateway-session-service.ts`, `docs/operator-loop.md` - -### Reference Signals - -- Doolittle cron jobs create fresh sessions, inject skills, execute prompts, and deliver results to configured platforms. -- OpenClaw separates cron, heartbeat, standing orders, webhooks, polling, and taskflow so daily automation feels intentional. - -### ElizaOS Leverage - -- ElizaOS task workers can own recurring or background execution. -- Doolittle scheduler and gateway services should translate task results into operator-visible delivery. - -### Acceptance Scenarios - -#### automation-and-daily-tasks.daily-brief - -- Surface: `scheduler` -- Current status: `missing` -- Trigger: Create a daily briefing job that summarizes tasks, calendar-like notes, and repo status into a target channel. -- Required signals: - - The job has a stable id, schedule, next run, last run, and delivery target. - - Execution starts a bounded agent turn. - - Delivery result is recorded in gateway history. -- Verification: - - Add scheduler tests for due job execution and delivery recording. - - Run `bun test packages/plugins/doolittle-plugin/scheduler-service.test.ts packages/agent/src/gateway`. - -#### automation-and-daily-tasks.short-followup - -- Surface: `heartbeat` -- Current status: `missing` -- Trigger: Ask Doolittle to check back in 30 minutes on the current thread. -- Required signals: - - Creates a thread-bound follow-up instead of a detached cron job. - - Preserves the current session route. - - Can be listed, paused, or canceled from operator commands. -- Verification: - - Add heartbeat tests for thread-bound follow-up creation and cancellation. - - Run the scheduler and gateway session tests together. - -### Current Gaps - -- Scheduler service exists, but the product contract for daily tasks, standing orders, and thread heartbeats is not yet test-backed. -- Automation delivery should be visible in the same gateway/session history used by normal messages. - -### Next Implementation Tasks - -#### scheduler-task-contract - -- Title: Define and test scheduled task lifecycle fields. -- Owner surface: `scheduler service` -- Files: `packages/plugins/doolittle-plugin/scheduler-service.ts`, `packages/plugins/doolittle-plugin/scheduler-service.test.ts`, `docs/operator-loop.md` -- Definition of done: - - Jobs expose id, schedule, nextRun, lastRun, status, target, and lastDelivery. - - Due jobs run bounded turns and record delivery outcomes. - - Operator docs include create, list, pause, resume, cancel, and inspect flows. - -#### thread-heartbeat-contract - -- Title: Add short follow-up and thread heartbeat semantics. -- Owner surface: `scheduler and gateway session` -- Files: `packages/plugins/doolittle-plugin/scheduler-service.ts`, `packages/agent/src/services/gateway-session-service.ts`, `packages/agent/src/runtime/chat.ts` -- Definition of done: - - Short follow-ups are attached to the current session route by default. - - Heartbeat entries can be canceled before firing. - - Delivery writes back into the originating thread or a clearly configured fallback. - -## Model Provider Freedom - -- Runtime ID: `model-provider-freedom` -- Outcome: Operators can connect, inspect, switch, and fail over among model providers without losing runtime clarity. -- Doolittle surfaces: `packages/agent/src/runtime/native/account-auth`, `packages/agent/src/runtime/linked-provider-accounts/messages.ts`, `packages/plugins/doolittle-plugin/model-fallback.ts`, `packages/agent/src/services/operator/version.ts` - -### Reference Signals - -- Doolittle emphasizes provider breadth, OAuth/setup flows, runtime provider resolution, model switching, and fallback chains. -- OpenClaw treats models as a first-class concept with provider docs, failover, auth profiles, and provider-specific media behavior. - -### ElizaOS Leverage - -- ElizaOS provider plugins should own model handlers and auth expectations, including the official Ollama plugin for local/self-hosted inference. -- Doolittle should expose provider readiness, linked account state, model choice, and fallback decisions in operator surfaces. - -### Acceptance Scenarios - -#### model-provider-freedom.model-switch - -- Surface: `operator shell` -- Current status: `partial` -- Trigger: Run `/model list`, switch to another configured provider/model, then run a simple prompt. -- Required signals: - - The list shows provider, model, auth state, context hints, and degraded reasons. - - The switch updates the active runtime selection for the session. - - The next run records which provider/model was used. -- Verification: - - Add parser and runtime summary tests for model list and switch responses. - - Run `bun test packages/agent/src/runtime/native/account-auth packages/plugins/doolittle-plugin/model-fallback.test.ts`. - -#### model-provider-freedom.failover - -- Surface: `model fallback` -- Current status: `partial` -- Trigger: Simulate a primary provider failure with a configured fallback provider. -- Required signals: - - The failure reason is recorded. - - Fallback selection is explicit. - - The final response names the provider actually used when verbose diagnostics are enabled. -- Verification: - - Add fallback tests for rate limit, auth failure, and provider unavailable cases. - - Run `bun test packages/plugins/doolittle-plugin/model-fallback.test.ts`. - -### Current Gaps - -- Provider package versions are current and the bootstrap is local-first on Ollama, but the operator model command surface needs to feel as direct as the rest of Doolittle. -- Fallback behavior exists but should be visible at run level, not only as internal configuration. - -### Next Implementation Tasks - -#### model-command-deck - -- Title: Add model list, switch, current, and doctor commands. -- Owner surface: `operator shell and account auth` -- Files: `packages/agent/src/runtime/chat.ts`, `packages/agent/src/runtime/native/account-auth`, `packages/agent/src/services/operator/runtime-summary/update.test.ts` -- Definition of done: - - Operators can see all configured providers and degraded reasons. - - Session model switch changes the next run without editing config by hand. - - Doctor output suggests the exact provider setup command or env var needed. - -#### run-level-provider-proof - -- Title: Record provider and fallback proof on every run. -- Owner surface: `run metadata` -- Files: `packages/plugins/doolittle-plugin/model-fallback.ts`, `packages/agent/src/runtime/chat-turn/provider-handler.ts`, `packages/agent/src/cli/tui-renderers.test.ts` -- Definition of done: - - Run summaries include requested provider, resolved provider, fallback provider, and failure reason when applicable. - - Verbose progress surfaces show fallback decisions once. - - Tests cover successful primary and fallback execution metadata. - -## Observability Safety And Proof - -- Runtime ID: `observability-safety-proof` -- Outcome: Doolittle shows what it did, why it was allowed, what changed, what failed, and what remains risky. -- Doolittle surfaces: `packages/agent/src/services/diagnostics`, `packages/agent/src/services/operator/runtime-summary`, `packages/agent/src/runtime/native/service-bridge/tool-policy.ts`, `scripts/check-repo-hygiene.ts` - -### Reference Signals - -- Doolittle uses callbacks, approvals, session state, and trajectory-style records to make work inspectable. -- OpenClaw treats security defaults, pairing, audit checks, tool policies, and gateway auth as product surfaces. - -### ElizaOS Leverage - -- ElizaOS event streams, evaluators, services, and routes should provide the raw runtime evidence. -- Doolittle should render the evidence into operator summaries, doctor output, and acceptance artifacts. - -### Acceptance Scenarios - -#### observability-safety-proof.run-receipt - -- Surface: `run summary` -- Current status: `partial` -- Trigger: Run a multi-tool task that reads, writes, and verifies a file. -- Required signals: - - Summary includes tools used, files changed, approvals requested, commands run, and verification commands. - - Failures are reported as failures, not converted into vague next steps. - - The transcript can be inspected by run id. -- Verification: - - Add a fixture task that produces a run receipt with read, write, command, and verification entries. - - Run `bun test packages/agent/src/services/operator/runtime-summary`. - -#### observability-safety-proof.security-audit - -- Surface: `doctor and audit` -- Current status: `partial` -- Trigger: Expose a gateway or tool policy misconfiguration and run `doolittle doctor`. -- Required signals: - - Doctor reports the exact unsafe setting. - - The report distinguishes personal trusted mode from shared or remote exposure. - - The suggested fix names the config path to change. -- Verification: - - Add diagnostics tests for open gateway auth, permissive exec, and unpaired messaging access. - - Run `bun test packages/agent/src/services/diagnostics`. - -### Current Gaps - -- Doolittle has diagnostics and runtime summaries, but run receipts are not yet the normal final artifact after meaningful work. -- Security posture should be as visible as capability posture, especially for gateway and tool exposure. - -### Next Implementation Tasks - -#### run-receipt-standard - -- Title: Standardize run receipts for multi-tool work. -- Owner surface: `runtime summary` -- Files: `packages/agent/src/services/operator/runtime-summary/update.test.ts`, `packages/agent/src/services/operator/runtime-summary/ownership.test.ts`, `packages/agent/src/runtime/chat-turn/provider-handler.ts` -- Definition of done: - - Run summaries list tools, changed files, commands, approvals, verification, and unresolved risks. - - The final answer can reference the run receipt without dumping raw logs. - - Tests cover success, partial failure, and blocked approval cases. - -#### security-doctor-contract - -- Title: Add security posture findings to doctor output. -- Owner surface: `diagnostics` -- Files: `packages/agent/src/services/diagnostics`, `packages/agent/src/runtime/native/service-bridge/tool-policy.ts`, `docs/operator-loop.md` -- Definition of done: - - Doctor flags open gateway auth, broad exec policy, and shared channel exposure. - - Each finding includes severity, config path, and a concrete remediation. - - Personal trusted-mode warnings are labeled differently from public-exposure blockers. diff --git a/docs/plugin-inventory.md b/docs/plugin-inventory.md deleted file mode 100644 index 18f9c416..00000000 --- a/docs/plugin-inventory.md +++ /dev/null @@ -1,30 +0,0 @@ -# Plugin Inventory - -This file is generated from the native runtime plugin catalog plus workspace package inspection. -Do not edit it by hand; run `bun run scripts/sync-doc-truth.ts --write`. - -Canonical runtime source: `@/runtime/native/plugin-catalog.ts`. - -| Runtime ID | Package | Category | Kind | Maturity | Persistence | Source | Workspace Path | Owner | Publish Intent | Tests | Notes | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| foundation.agent | @elizaos/agent | foundation | vendored | alpha | none | official | (external) | upstream | upstream-dependency | external | Standalone Eliza agent package used for native runtime and ecosystem alignment. | -| foundation.autonomous | @elizaos/autonomous | foundation | vendored | alpha | none | official | (external) | upstream | upstream-dependency | external | Selective architectural source for native Eliza alignment. | -| foundation.skills | @elizaos/skills | foundation | vendored | alpha | none | official | (external) | upstream | upstream-dependency | external | First-party skills package used for native stack alignment. | -| providers.sql | @elizaos/plugin-sql | providers | provider | production | none | official | packages/plugins/plugin-sql | doolittle-runtime | public-provider-bridge | covered | Primary SQL persistence plugin on the current runtime line. | -| providers.pdf | @elizaos/plugin-pdf | providers | provider | production | none | official | (external) | upstream | upstream-dependency | external | Official PDF ingestion plugin. | -| providers.elizacloud | @elizaos/plugin-elizacloud | providers | provider | alpha | none | custom | packages/plugins/plugin-elizacloud | doolittle-runtime | public-provider-bridge | covered | Workspace-native Eliza Cloud provider plugin for managed ElizaOS inference and cloud-native defaults. | -| providers.ollama | @elizaos/plugin-ollama | providers | provider | alpha | none | official | (external) | upstream | upstream-dependency | external | Official local/self-hosted Ollama provider for offline text, object, and embedding model routing. | -| providers.codex | @elizaos/plugin-codex | providers | provider | alpha | none | custom | packages/plugins/plugin-codex | doolittle-runtime | public-provider-bridge | covered | Workspace-native Codex provider plugin for ChatGPT-backed Codex workflows. | -| providers.claude-code | @elizaos/plugin-claude-code | providers | provider | alpha | none | custom | packages/plugins/plugin-claude-code | doolittle-runtime | public-provider-bridge | covered | Workspace-native Claude Code provider plugin for Claude-native workflows. | -| providers.devin | @elizaos/plugin-devin | providers | provider | alpha | none | custom | packages/plugins/plugin-devin | doolittle-runtime | public-provider-bridge | covered | Workspace-native Devin CLI provider plugin for SWE model workflows. | -| providers.openai | @elizaos/plugin-openai | providers | provider | production | none | official | (external) | upstream | upstream-dependency | external | Official OpenAI provider plugin. | -| providers.anthropic | @elizaos/plugin-anthropic | providers | provider | production | none | official | (external) | upstream | upstream-dependency | external | Official Anthropic provider plugin. | -| messaging.telegram | @elizaos/plugin-telegram | messaging | adapter | alpha | none | official | (external) | upstream | upstream-dependency | external | Official Telegram transport plugin. | -| research.action-bench | @doolittle/plugin-action-bench | research | vendored | alpha | none | vendored | packages/plugins/doolittle-plugin | doolittle-runtime | vendored-workspace-package | covered | Workspace-native benchmark plugin for evaluation and coverage drills. | -| research.autocoder | @doolittle/plugin-autocoder | research | adapter | experimental | injected | vendored | packages/plugins/doolittle-plugin | doolittle-runtime | internal-adapter | covered | Workspace-native autocoder plugin for research, planning, GitHub, and secrets-backed workflows. Execution remains experimental and planning-only flows are explicitly non-mutating. | -| execution.local-sandbox | @doolittle/plugin-local-sandbox | execution | adapter | alpha | none | custom | packages/plugins/doolittle-plugin | doolittle-runtime | internal-adapter | covered | Doolittle local sandbox service with E2B-compatible methods for autocoder support. | -| execution.forms | @doolittle/plugin-forms | execution | adapter | alpha | injected | custom | packages/plugins/doolittle-plugin | doolittle-runtime | internal-adapter | covered | Doolittle forms adapter used by autocoder and guided workflow flows. Consolidated into doolittle-plugin. | -| execution.coding-agent | @doolittle/plugin-coding-agent | execution | adapter | alpha | none | custom | packages/plugins/doolittle-plugin | doolittle-runtime | internal-adapter | covered | Doolittle coding agent service bridging workspace, repository, shell, and delegation. Consolidated into doolittle-plugin. | -| execution.agent-orchestrator | @doolittle/plugin-agent-orchestrator | execution | adapter | alpha | none | custom | packages/plugins/doolittle-plugin | doolittle-runtime | internal-adapter | covered | Doolittle delegation orchestrator with supervision and queue management. Consolidated into doolittle-plugin. | -| execution.planning | @doolittle/plugin-planning | execution | adapter | alpha | injected | custom | packages/plugins/doolittle-plugin | doolittle-runtime | internal-adapter | covered | Doolittle planning adapter linking native delegation tasks and workflow graphs. Consolidated into doolittle-plugin. | -| product.doolittle-runtime | doolittle-runtime | product | adapter | alpha | injected | custom | packages/plugins/doolittle-plugin | doolittle-runtime | internal-product-layer | covered | Product-specific Doolittle runtime layer. | diff --git a/docs/quickstart.md b/docs/quickstart.md deleted file mode 100644 index 867ed7c3..00000000 --- a/docs/quickstart.md +++ /dev/null @@ -1,148 +0,0 @@ -# Doolittle Quickstart - -Use this as the default path from install to reliable first command. - -## 1) Bootstrap once - -```bash -bash scripts/install.sh -``` - -This performs dependency install, creates missing defaults, and launches the onboarding flow. - -The default mind is local Ollama through the official ElizaOS Ollama plugin. For a live first prompt, make sure Ollama is running, then pull the default models: - -```bash -ollama pull granite4.1:3b -ollama pull nomic-embed-text:latest -``` - -If Ollama is not already running as an app or service, start `ollama serve` in another terminal before the first live prompt. - -The bootstrap writes `OLLAMA_API_ENDPOINT`, `OLLAMA_SMALL_MODEL`, `OLLAMA_LARGE_MODEL`, and `OLLAMA_EMBEDDING_MODEL` into `.env`. You can still choose Eliza Cloud, Codex, Claude Code, OpenAI, or Anthropic in `doolittle setup`, but the no-key path is local-first now. - -If you need a non-interactive pass, use: - -```bash -bash scripts/install.sh --headless -bash scripts/install.sh --skip-wizard -bash scripts/install.sh --check -bash scripts/install.sh --yes -``` - -`--check` is the dry-run receipt. It reports the directories and files that setup -would touch, including `.env`, `.doolittle/settings.json`, -`.doolittle/gateway/gateway.json`, `.doolittle/onboarding.json`, and -`.doolittle/onboarding.state.json`. - -If install reports PATH changes, open a new terminal before first run. - -## 2) Start and verify immediately - -```bash -doolittle -``` - -You should land in the plain interactive CLI by default. - -Run these health checks: - -```text -/status -/doctor -/runtime status -/setup checklist -``` - -From API mode: - -```bash -curl http://localhost:3000/health -curl http://localhost:3000/runtime/status -curl http://localhost:3000/runtime/plugins -``` - -If these all return and report readiness, the product boundary is active. - -## 3) Learn the operator shape quickly - -Doolittle has one runtime and a few ways to drive it: - -| Surface | Command | Use when | -|---|---|---| -| Plain shell | `doolittle` | Everyday work, approvals, and slash commands | -| Cockpit | `doolittle cockpit` | Fullscreen observability | -| Runtime check-ins | `doolittle status`, `doolittle tools`, `doolittle skills`, `doolittle runtime` | Fast orientation without opening the shell first | -| API | `doolittle api` | REST and scripted clients | -| Gateway | `doolittle gateway` | Messaging transports and delivery ops | - -The top-level aliases are shortcuts onto the same runtime surfaces: - -| Alias | Default mapping | -|---|---| -| `doolittle status` | `/status` | -| `doolittle tools` | `/tools summary` | -| `doolittle skills` | `/skills` | -| `doolittle runtime` | `/runtime status` | - -For the daily shell rhythm in one place, use [`operator-loop.md`](./operator-loop.md). - -## 4) Surface quick reference - -### Shell-level entrypoints - -| Goal | Command | -|---|---| -| Everyday operator loop | `doolittle` | -| Fullscreen operator UI | `doolittle cockpit` | -| One-shot shell health | `doolittle status` | -| One-shot tools inventory | `doolittle tools` | -| One-shot skills inventory | `doolittle skills` | -| One-shot runtime summary | `doolittle runtime` | -| Scripted one-shot execution | `doolittle exec -p ""` | -| API-only server mode | `doolittle api` | -| Gateway runner mode | `doolittle gateway` | -| Re-run setup | `doolittle setup` | -| Read diagnostics | `doolittle doctor` | -| Reinstall artifacts | `doolittle install` | - -### In-shell discoverability (minimal) - -- `doolittle help` → top-level command inventory -- `doolittle status` / `doolittle runtime` → fast one-shot operator checks without opening the interactive shell -- `doolittle tools` / `doolittle skills` → quick capability inventory from the same runtime surfaces -- `/status` and `/doctor` → runtime health and capability checks -- `/runtime status` / `GET /runtime/status` → startup state and plugin assembly -- `/tools summary` and `/skills list` → capability surface map -- `/execution status` and `/memory list memory` → execution + memory layers -- `/gateway status` and `/gateway state` → transport health and route state - -### API quick references - -```text -GET /health -GET /features -GET /runtime/status -GET /runtime/plugins -GET /tools/summary -GET /skills -GET /doctor -POST /chat -``` - -For the full command catalog, continue with the `CLI command reference` in [`README.md`](../README.md). - -## 5) Recovery flow (when first-run is noisy) - -- PATH not updated: restart shell or run `~/.local/bin/doolittle`. -- Provider setup appears wrong: run `doolittle setup`, then `/doctor` and `/setup summary`. -- Missing commands in runtime: confirm installer completion and `bun` on PATH. -- Gateway state is stale: `doolittle gateway stop` then `doolittle gateway start`. - -## 6) Truth-first references - -Before documenting capability, route through: - -- [`docs/plugin-inventory.md`](./plugin-inventory.md) (what is assembled) -- [`docs/capability-truth.md`](./capability-truth.md) (what each runtime slice can and cannot claim) -- [`docs/operator-wow-contract.md`](./operator-wow-contract.md) (what native operator product outcomes must prove) diff --git a/docs/skills-hub.md b/docs/skills-hub.md deleted file mode 100644 index 2eb1e183..00000000 --- a/docs/skills-hub.md +++ /dev/null @@ -1,59 +0,0 @@ -# Skills Hub - -Doolittle now exposes a native skills hub for catalog, sync, manifest, import, export, and install workflows. - -## On-Disk Layout - -- `data/skills-hub/manifests/` stores exported workspace and catalog manifests -- `data/skills-hub/installs/` stores installed manifests and the installed index -- `data/skills-hub/imports/` stores imported manifests staged into the hub -- `data/skills-hub/exports/` stores bundle exports - -## Runtime Commands - -- `/skills hub` -- `/skills summary` -- `/skills catalog` -- `/skills catalog refresh` -- `/skills catalog search ` -- `/skills catalog show ` -- `/skills hub distribution` -- `/skills hub families` -- `/skills families` -- `/skills family ` -- `/skills installed` -- `/skills installed show ` -- `/skills manifest ` -- `/skills sync` -- `/skills export ` -- `/skills import ` -- `/skills install ` - -## API Routes - -- `GET /skills` -- `GET /skills/summary` -- `GET /skills/hub` -- `GET /skills/hub/distribution` -- `GET /skills/hub/families` -- `GET /skills/hub/families/:slug` -- `GET /skills/families` -- `GET /skills/families/:slug` -- `GET /skills/catalog` -- `GET /skills/catalog/:slug` -- `GET /skills/installed` -- `GET /skills/installed/:slug` -- `GET /skills/manifest/:slug` -- `POST /skills/sync` -- `POST /skills/export` -- `POST /skills/import` -- `POST /skills/install` - -## Behavior - -- Workspace skills are scanned from the Doolittle skills workspace -- Generated skills are included in hub summaries and exports -- Curated skill families are surfaced alongside generated families and hub distribution counts -- Catalog skills are sourced from the native Eliza skill catalog -- Installed manifests are persisted separately and can be listed or inspected later -- Bundle exports include both workspace manifests and installed manifests diff --git a/docs/superpowers/plans/2026-05-09-doolittle-wow-harness.md b/docs/superpowers/plans/2026-05-09-doolittle-wow-harness.md deleted file mode 100644 index c0ee80fe..00000000 --- a/docs/superpowers/plans/2026-05-09-doolittle-wow-harness.md +++ /dev/null @@ -1,207 +0,0 @@ -# Doolittle Wow Harness Implementation Plan - -> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking. - -**Goal:** Build a code-backed product contract that turns the native operator research into measurable Doolittle acceptance scenarios and implementation tasks. - -**Architecture:** Add a native runtime contract module that lists the operator-wow pillars, scenarios, gaps, and next tasks. Reuse the existing doc-truth sync pipeline so the public roadmap is generated from code and can fail checks when it drifts. - -**Tech Stack:** Bun, TypeScript, ElizaOS-native Doolittle runtime records, existing `scripts/sync-doc-truth` generator, Bun tests. - ---- - -## File Structure - -- Create `packages/agent/src/runtime/native/operator-wow-contract.ts`: canonical code-backed contract records for Doolittle's native operator target. -- Create `packages/agent/src/runtime/native/operator-wow-contract.test.ts`: invariant tests that keep the contract complete and internally consistent. -- Modify `scripts/sync-doc-truth/render.ts`: render the operator-wow contract into Markdown. -- Modify `scripts/sync-doc-truth/sync.ts`: include `docs/operator-wow-contract.md` in doc-truth check/write mode. -- Modify `scripts/sync-doc-truth/render.test.ts`: cover the new renderer. -- Generate `docs/operator-wow-contract.md`: generated product contract and acceptance suite. -- Modify `README.md` and `docs/operator-loop.md`: point operators at the new generated contract. - -## Task 1: Add The Code-Backed Contract - -**Files:** -- Create: `packages/agent/src/runtime/native/operator-wow-contract.ts` -- Create: `packages/agent/src/runtime/native/operator-wow-contract.test.ts` - -- [x] **Step 1: Write the contract module** - -Create TypeScript interfaces for pillars, acceptance scenarios, and implementation tasks. Add eight pillars: - -```ts -export type OperatorWowStatus = "covered" | "partial" | "missing"; - -export interface OperatorWowAcceptanceScenario { - id: string; - surface: string; - trigger: string; - requiredSignals: string[]; - verification: string[]; - currentStatus: OperatorWowStatus; -} -``` - -Each pillar must include at least two native operator signals, two ElizaOS leverage points, three Doolittle surfaces, two acceptance scenarios, two current gaps, and two implementation tasks. - -- [x] **Step 2: Write invariant tests** - -Add tests that assert: - -```ts -expect(pillars).toHaveLength(8); -expect(scenarios).toHaveLength(16); -expect(tasks).toHaveLength(16); -``` - -Also assert all ids are unique and every scenario id starts with its pillar id. - -- [x] **Step 3: Run the focused test** - -Run: - -```bash -bun test packages/agent/src/runtime/native/operator-wow-contract.test.ts -``` - -Expected: PASS with all contract invariant tests green. - -## Task 2: Wire The Contract Into Doc Truth - -**Files:** -- Modify: `scripts/sync-doc-truth/render.ts` -- Modify: `scripts/sync-doc-truth/sync.ts` -- Modify: `scripts/sync-doc-truth/render.test.ts` - -- [x] **Step 1: Add the renderer** - -Export `renderOperatorWowContract(records)` from `scripts/sync-doc-truth/render.ts`. The rendered Markdown must include: - -```md -# Operator Wow Contract - -## Product Thesis - -## Summary -``` - -For each pillar, render research signals, ElizaOS leverage, acceptance scenarios, current gaps, and implementation tasks. - -- [x] **Step 2: Add the sync target** - -Import `listOperatorWowContract` in `scripts/sync-doc-truth/sync.ts` and add: - -```ts -syncFile( - root, - mode, - "docs/operator-wow-contract.md", - renderOperatorWowContract(operatorWowContract), -) -``` - -- [x] **Step 3: Add renderer coverage** - -Add a sample `OperatorWowContractPillar` in `scripts/sync-doc-truth/render.test.ts` and assert the output contains the pillar title, scenario id, task id, current status, and file list. - -- [x] **Step 4: Run renderer tests** - -Run: - -```bash -bun test scripts/sync-doc-truth/render.test.ts scripts/sync-doc-truth/sync.test.ts -``` - -Expected: PASS. - -## Task 3: Generate And Link The Contract - -**Files:** -- Generate: `docs/operator-wow-contract.md` -- Modify: `README.md` -- Modify: `docs/operator-loop.md` - -- [x] **Step 1: Generate docs** - -Run: - -```bash -bun run scripts/sync-doc-truth.ts --write -``` - -Expected: `docs/operator-wow-contract.md` is created and `Doc truth files updated.` is printed. - -- [x] **Step 2: Link the contract from operator docs** - -Add `docs/operator-wow-contract.md` to the canonical runtime docs list in `README.md` and the next-docs list in `docs/operator-loop.md`. - -- [x] **Step 3: Check doc truth** - -Run: - -```bash -bun run scripts/sync-doc-truth.ts --check -``` - -Expected: no output differences and exit code 0. - -## Task 4: Verify The Foundation Patch - -**Files:** -- Verify: all files above - -- [x] **Step 1: Run targeted tests** - -Run: - -```bash -bun test packages/agent/src/runtime/native/operator-wow-contract.test.ts scripts/sync-doc-truth/render.test.ts scripts/sync-doc-truth/sync.test.ts -``` - -Expected: PASS. - -- [x] **Step 2: Run docs truth check** - -Run: - -```bash -bun run scripts/sync-doc-truth.ts --check -``` - -Expected: PASS. - -- [x] **Step 3: Inspect git status** - -Run: - -```bash -git status --short -``` - -Expected: shows only this plan, the operator-wow contract files, renderer/sync edits, generated docs, and pre-existing unrelated dirty files. - -## Task 5: Next Execution Tranche - -**Files:** -- Use: `docs/operator-wow-contract.md` -- Use: `packages/agent/src/runtime/native/operator-wow-contract.ts` - -- [x] **Step 1: Pick the first product tranche** - -Start with these tasks from the generated contract: - -```text -first-run-decision-receipt -first-chat-readiness-contract -operator-command-surface -run-interrupt-contract -``` - -- [ ] **Step 2: Create a focused branch or worktree** - -Because the current worktree is dirty, create the implementation tranche on an isolated branch or worktree before changing product runtime behavior. - -- [ ] **Step 3: Execute with tests first** - -For each task, write the failing test named in its definition of done before changing implementation files. From 28b6a7af2758a16978d0fe3e98b5527892e611d3 Mon Sep 17 00:00:00 2001 From: SYMBaiEX Date: Wed, 17 Jun 2026 14:33:12 -0500 Subject: [PATCH 04/14] Adopt SDK self-awareness injection (full-SDK maximization) Beta-validated audit of the alpha-era maximization plan (17 items) found Doolittle already uses the SDK near-fully: reasoning models, the 4 advanced-memory/reflection evaluators + advanced-memory plugin, AwarenessRegistry assembly, Experience/Approval/ToolPolicy/AgentEvent/Heartbeat/Trajectory services, and registry/skill/MCP marketplace clients are all already wired. The one genuine gate-safe gap: the AwarenessRegistry was assembled (5 contributors) but its composeSummary output was never injected into a turn (only called in a test). Add DOOLITTLE_SELF_AWARENESS_PROVIDER (position 100, fault-tolerant) to surface the self-awareness summary to the model, wired into doolittle-plugin assembly. +4 unit tests. Gates: typecheck 0, 1450 tests pass, build + lint clean. --- packages/agent/src/plugin-api.ts | 1 + .../src/providers/self-awareness/index.ts | 1 + .../providers/self-awareness/provider.test.ts | 50 +++++++++++++++++ .../src/providers/self-awareness/provider.ts | 53 +++++++++++++++++++ packages/plugins/doolittle-plugin/assembly.ts | 2 + 5 files changed, 107 insertions(+) create mode 100644 packages/agent/src/providers/self-awareness/index.ts create mode 100644 packages/agent/src/providers/self-awareness/provider.test.ts create mode 100644 packages/agent/src/providers/self-awareness/provider.ts diff --git a/packages/agent/src/plugin-api.ts b/packages/agent/src/plugin-api.ts index e079bc20..33d87afd 100644 --- a/packages/agent/src/plugin-api.ts +++ b/packages/agent/src/plugin-api.ts @@ -9,6 +9,7 @@ export { createWorkspaceAction } from "@/actions/workspace-action"; export { createMemoryNudgeEvaluator } from "@/evaluators/memory-nudge-evaluator"; export { GatewayRunner } from "@/gateway/runner"; export { createAgentContextProvider } from "@/providers/agent-context"; +export { createSelfAwarenessProvider } from "@/providers/self-awareness"; export type { AppContext } from "@/runtime/bootstrap"; export type { AgentExecutionContext } from "@/runtime/chat"; export { handleAgentTurn } from "@/runtime/chat"; diff --git a/packages/agent/src/providers/self-awareness/index.ts b/packages/agent/src/providers/self-awareness/index.ts new file mode 100644 index 00000000..51632d79 --- /dev/null +++ b/packages/agent/src/providers/self-awareness/index.ts @@ -0,0 +1 @@ +export { createSelfAwarenessProvider } from "./provider"; diff --git a/packages/agent/src/providers/self-awareness/provider.test.ts b/packages/agent/src/providers/self-awareness/provider.test.ts new file mode 100644 index 00000000..f3b11bd7 --- /dev/null +++ b/packages/agent/src/providers/self-awareness/provider.test.ts @@ -0,0 +1,50 @@ +import { describe, expect, it } from "bun:test"; +import type { IAgentRuntime, Memory, State } from "@elizaos/core"; +import type { AppServices } from "@/services"; +import { createSelfAwarenessProvider } from "./provider"; + +function makeServices(composeSummary: () => Promise): AppServices { + return { + awareness: { composeSummary }, + } as unknown as AppServices; +} + +const runtime = {} as IAgentRuntime; +const message = { content: { text: "hi" } } as Memory; +const state = {} as State; + +describe("self-awareness provider", () => { + it("injects the composed (trimmed) summary as text and data", async () => { + const provider = createSelfAwarenessProvider( + makeServices(async () => " [STATUS] 3 tasks pending "), + ); + const result = await provider.get(runtime, message, state); + expect(result.text).toBe("[STATUS] 3 tasks pending"); + expect(result.data?.selfAwareness).toBe("[STATUS] 3 tasks pending"); + }); + + it("injects nothing when the summary is empty/whitespace", async () => { + const provider = createSelfAwarenessProvider( + makeServices(async () => " "), + ); + const result = await provider.get(runtime, message, state); + expect(result.text).toBe(""); + expect(result.data).toEqual({}); + }); + + it("is fault-tolerant when composeSummary throws", async () => { + const provider = createSelfAwarenessProvider( + makeServices(async () => { + throw new Error("contributor blew up"); + }), + ); + const result = await provider.get(runtime, message, state); + expect(result.text).toBe(""); + }); + + it("renders late (positive position) after the main context", () => { + const provider = createSelfAwarenessProvider(makeServices(async () => "x")); + expect(provider.position ?? 0).toBeGreaterThan(0); + expect(provider.name).toBe("DOOLITTLE_SELF_AWARENESS_PROVIDER"); + }); +}); diff --git a/packages/agent/src/providers/self-awareness/provider.ts b/packages/agent/src/providers/self-awareness/provider.ts new file mode 100644 index 00000000..52b6a607 --- /dev/null +++ b/packages/agent/src/providers/self-awareness/provider.ts @@ -0,0 +1,53 @@ +import type { + IAgentRuntime, + Memory, + Provider, + ProviderResult, + State, +} from "@elizaos/core"; +import type { AppServices } from "@/services"; + +/** + * Surfaces the agent's composed self-awareness summary into the runtime + * provider context so the model can reason about its own operational state. + * + * The ElizaOS `AwarenessRegistry` (assembled by {@link AwarenessService} with + * the runtime / run / startup / settings / capabilities contributors) produces + * a Layer-1 summary via `composeSummary`. The registry is built at startup, but + * nothing injected its output into a turn — this provider closes that gap. + * + * Additive and fault-tolerant: `composeSummary` already returns `""` on + * contributor failure, and any throw is swallowed, so the turn is never broken + * and nothing is injected when there is no summary to show. + */ +export function createSelfAwarenessProvider(services: AppServices): Provider { + return { + name: "DOOLITTLE_SELF_AWARENESS_PROVIDER", + description: + "Injects the agent's composed self-awareness summary (runtime, run, startup, settings, capabilities) into the runtime context.", + // Render late, after the main Doolittle context block. + position: 100, + get: async ( + runtime: IAgentRuntime, + _message: Memory, + _state: State, + ): Promise => { + let summary = ""; + try { + summary = (await services.awareness.composeSummary(runtime)).trim(); + } catch { + summary = ""; + } + + if (!summary) { + return { text: "", values: {}, data: {} }; + } + + return { + text: summary, + values: {}, + data: { selfAwareness: summary }, + }; + }, + }; +} diff --git a/packages/plugins/doolittle-plugin/assembly.ts b/packages/plugins/doolittle-plugin/assembly.ts index 2add6ec6..d0fc5bef 100644 --- a/packages/plugins/doolittle-plugin/assembly.ts +++ b/packages/plugins/doolittle-plugin/assembly.ts @@ -5,6 +5,7 @@ import { createMemoryAction, createMemoryNudgeEvaluator, createRepositoryAction, + createSelfAwarenessProvider, createSessionSearchAction, createSkillsAction, createTerminalAction, @@ -33,6 +34,7 @@ export function createDoolittlePluginSurface({ const providers: Provider[] = [ ...getSessionProviders(), createAgentContextProvider(services), + createSelfAwarenessProvider(services), ]; const evaluators: Evaluator[] = [createMemoryNudgeEvaluator(services)]; const GatewayRuntimeService = createGatewayRuntimeService({ From 7dbce920511e5e181355ccb1091d7e0fd137a729 Mon Sep 17 00:00:00 2001 From: SYMBaiEX Date: Wed, 17 Jun 2026 14:57:16 -0500 Subject: [PATCH 05/14] Adopt ModelType.RESEARCH as a /research deep-research action MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Wire the ElizaOS deep-research model (ModelType.RESEARCH / o3-deep-research) as a first-class DOOLITTLE_RESEARCH action: /research runs the model with web_search and returns a cited report (de-duped sources). Availability-gated via runtime.getModel(ModelType.RESEARCH) so it is inert (clear message) without OPENAI_API_KEY — boot and the suite stay green with no live key. Fault-tolerant on model errors. +5 unit tests (mocked useModel, no live call). Gates: typecheck 0, 1454 tests pass, build + lint clean. --- .../agent/src/actions/research-action.test.ts | 125 ++++++++++++++++++ packages/agent/src/actions/research-action.ts | 118 +++++++++++++++++ packages/agent/src/plugin-api.ts | 1 + packages/plugins/doolittle-plugin/assembly.ts | 2 + 4 files changed, 246 insertions(+) create mode 100644 packages/agent/src/actions/research-action.test.ts create mode 100644 packages/agent/src/actions/research-action.ts diff --git a/packages/agent/src/actions/research-action.test.ts b/packages/agent/src/actions/research-action.test.ts new file mode 100644 index 00000000..5062bbc8 --- /dev/null +++ b/packages/agent/src/actions/research-action.test.ts @@ -0,0 +1,125 @@ +import { describe, expect, it } from "bun:test"; +import type { IAgentRuntime, Memory, ResearchResult } from "@elizaos/core"; +import { createResearchAction } from "./research-action"; + +function message(text: string): Memory { + return { content: { text } } as Memory; +} + +function makeRuntime(opts: { + hasModel: boolean; + research?: () => Promise; +}): IAgentRuntime { + return { + getModel: () => (opts.hasModel ? () => Promise.resolve({}) : undefined), + useModel: (_modelType: unknown, _params: unknown) => + ( + opts.research ?? + (async () => { + throw new Error("no research model"); + }) + )(), + } as unknown as IAgentRuntime; +} + +const noModelRuntime = makeRuntime({ hasModel: false }); + +describe("research action (ModelType.RESEARCH adoption)", () => { + it("validates only a /research command with a question", async () => { + const action = createResearchAction(); + expect( + await action.validate(noModelRuntime, message("/research RAG in 2026")), + ).toBe(true); + expect(await action.validate(noModelRuntime, message("/research"))).toBe( + false, + ); + expect( + await action.validate(noModelRuntime, message("tell me about RAG")), + ).toBe(false); + }); + + it("responds gracefully when no RESEARCH model is registered", async () => { + const action = createResearchAction(); + let delivered = ""; + const result = await action.handler( + noModelRuntime, + message("/research what is X"), + undefined, + undefined, + async (content) => { + delivered = content.text ?? ""; + return []; + }, + ); + expect(result).toMatchObject({ success: false }); + expect(delivered).toContain("OPENAI_API_KEY"); + }); + + it("runs the research model and renders a cited report", async () => { + const action = createResearchAction(); + const runtime = makeRuntime({ + hasModel: true, + research: async () => + ({ + id: "resp_1", + text: "RAG combines retrieval with generation.", + annotations: [ + { + url: "https://a.example/x", + title: "Paper A", + startIndex: 0, + endIndex: 3, + }, + { + url: "https://a.example/x", + title: "Paper A dup", + startIndex: 4, + endIndex: 7, + }, + { + url: "https://b.example/y", + title: "Paper B", + startIndex: 8, + endIndex: 11, + }, + ], + }) as unknown as ResearchResult, + }); + let delivered = ""; + const result = await action.handler( + runtime, + message("/research how does RAG work"), + undefined, + undefined, + async (content) => { + delivered = content.text ?? ""; + return []; + }, + ); + expect(result?.success).toBe(true); + expect(delivered).toContain("RAG combines retrieval with generation."); + expect(delivered).toContain("Sources:"); + expect(delivered).toContain("https://a.example/x"); + expect(delivered).toContain("https://b.example/y"); + // de-duped by url -> exactly two source lines + expect(delivered.match(/^- /gmu)?.length).toBe(2); + }); + + it("reports a clear failure when the model throws", async () => { + const action = createResearchAction(); + const runtime = makeRuntime({ + hasModel: true, + research: async () => { + throw new Error("rate limited"); + }, + }); + const result = await action.handler( + runtime, + message("/research boom"), + undefined, + undefined, + ); + expect(result?.success).toBe(false); + expect(result?.text).toContain("rate limited"); + }); +}); diff --git a/packages/agent/src/actions/research-action.ts b/packages/agent/src/actions/research-action.ts new file mode 100644 index 00000000..b759737c --- /dev/null +++ b/packages/agent/src/actions/research-action.ts @@ -0,0 +1,118 @@ +import { + type Action, + type ActionResult, + type HandlerCallback, + type HandlerOptions, + type IAgentRuntime, + type Memory, + ModelType, + type ResearchAnnotation, + type State, +} from "@elizaos/core"; + +const RESEARCH_PREFIX = "/research"; + +function messageText(message: Memory): string { + return typeof message.content === "string" + ? message.content + : (message.content?.text ?? ""); +} + +function parseResearchQuestion(text: string): string | undefined { + const trimmed = text.trim(); + if (!trimmed.startsWith(RESEARCH_PREFIX)) { + return undefined; + } + const question = trimmed.slice(RESEARCH_PREFIX.length).trim(); + return question.length > 0 ? question : undefined; +} + +function renderSources(annotations: ResearchAnnotation[]): string { + const seen = new Set(); + const lines: string[] = []; + for (const annotation of annotations) { + if (!annotation.url || seen.has(annotation.url)) { + continue; + } + seen.add(annotation.url); + lines.push(`- ${annotation.title || annotation.url} (${annotation.url})`); + } + return lines.length > 0 ? `\n\nSources:\n${lines.join("\n")}` : ""; +} + +/** + * Adopts the ElizaOS `ModelType.RESEARCH` deep-research model (o3-deep-research) + * as a first-class action. Triggered by `/research `, it runs the + * model with web search and returns the cited report. + * + * Availability-gated: if no RESEARCH handler is registered (i.e. the OpenAI + * deep-research provider is not configured via `OPENAI_API_KEY`), the action + * responds with a clear message instead of failing — so boot and the test + * suite stay green without a live key, and the capability lights up the moment + * a key is present. + */ +export function createResearchAction(): Action { + return { + name: "DOOLITTLE_RESEARCH", + similes: ["DEEP_RESEARCH", "RESEARCH_REPORT", "WEB_RESEARCH"], + description: + "Runs the ElizaOS deep-research model (ModelType.RESEARCH, e.g. o3-deep-research) over a question with web search and returns a cited report. Triggered by `/research `. Requires a registered RESEARCH model (OPENAI_API_KEY); deep research can take several minutes.", + validate: async (_runtime: IAgentRuntime, message: Memory) => { + return parseResearchQuestion(messageText(message)) !== undefined; + }, + handler: async ( + runtime: IAgentRuntime, + message: Memory, + _state: State | undefined, + _options: HandlerOptions | undefined, + callback?: HandlerCallback, + ): Promise => { + const question = parseResearchQuestion(messageText(message)); + if (!question) { + const usage = "Usage: /research "; + await callback?.({ text: usage, source: "research-action" }); + return { success: false, text: usage }; + } + + if (!runtime.getModel(ModelType.RESEARCH)) { + const unavailable = + "Deep research is unavailable: no RESEARCH model is registered. Set OPENAI_API_KEY and enable the OpenAI provider to use `/research`."; + await callback?.({ text: unavailable, source: "research-action" }); + return { success: false, text: unavailable }; + } + + try { + const result = await runtime.useModel(ModelType.RESEARCH, { + input: question, + tools: [{ type: "web_search_preview" }], + }); + const report = `${result.text}${renderSources(result.annotations ?? [])}`; + await callback?.({ text: report, source: "research-action" }); + return { success: true, text: report }; + } catch (error) { + const failure = `Deep research failed: ${ + error instanceof Error ? error.message : String(error) + }`; + await callback?.({ text: failure, source: "research-action" }); + return { success: false, text: failure }; + } + }, + examples: [ + [ + { + name: "{{userName}}", + content: { + text: "/research What are the leading approaches to retrieval-augmented generation in 2026?", + }, + }, + { + name: "{{agentName}}", + content: { + text: "Here is a cited research report…", + actions: ["DOOLITTLE_RESEARCH"], + }, + }, + ], + ], + }; +} diff --git a/packages/agent/src/plugin-api.ts b/packages/agent/src/plugin-api.ts index 33d87afd..ab4dfceb 100644 --- a/packages/agent/src/plugin-api.ts +++ b/packages/agent/src/plugin-api.ts @@ -2,6 +2,7 @@ export { createCronAction } from "@/actions/cron-action"; export { createFileActions } from "@/actions/file-action"; export { createMemoryAction } from "@/actions/memory-action"; export { createRepositoryAction } from "@/actions/repository-action"; +export { createResearchAction } from "@/actions/research-action"; export { createSessionSearchAction } from "@/actions/session-search-action"; export { createSkillsAction } from "@/actions/skills-action"; export { createTerminalAction } from "@/actions/terminal-action"; diff --git a/packages/plugins/doolittle-plugin/assembly.ts b/packages/plugins/doolittle-plugin/assembly.ts index d0fc5bef..dc04b1e7 100644 --- a/packages/plugins/doolittle-plugin/assembly.ts +++ b/packages/plugins/doolittle-plugin/assembly.ts @@ -5,6 +5,7 @@ import { createMemoryAction, createMemoryNudgeEvaluator, createRepositoryAction, + createResearchAction, createSelfAwarenessProvider, createSessionSearchAction, createSkillsAction, @@ -30,6 +31,7 @@ export function createDoolittlePluginSurface({ createWorkspaceAction(services, config.workspaceDir), createTerminalAction(services), createRepositoryAction(services), + createResearchAction(), ]; const providers: Provider[] = [ ...getSessionProviders(), From d839d054a133603c13ae9418ca42fe0b650f6d0a Mon Sep 17 00:00:00 2001 From: SYMBaiEX Date: Wed, 17 Jun 2026 16:45:37 -0500 Subject: [PATCH 06/14] Leverage SDK to the max: tool hooks, triggers, tasks, sampling settings Wire the remaining ElizaOS SDK runtime capabilities additively (no existing system removed), via a guarded plugin init (packages/plugins/doolittle-plugin/sdk-capabilities.ts): (1) HOOK_TOOL_AFTER tool-audit observability; (2) the autonomous trigger dispatch worker (registerTriggerTaskWorker, gated by triggersFeatureEnabled); (3) a recurring SDK TaskWorker (DOOLITTLE_SELF_MAINTENANCE, idempotent via fixed id) that refreshes the self-awareness summary cache. Plus explicit per-ModelType sampling settings (MODEL_SETTINGS) in the character (low temp for reasoning determinism). Each step independently fault-guarded so startup is never blocked. Gates: typecheck 0, 1457 tests pass, build + lint clean, agent boots clean with all wiring registered (no guard failures). --- packages/characters/doolittle.character.json | 10 ++ packages/plugins/doolittle-plugin/assembly.ts | 4 + .../doolittle-plugin/sdk-capabilities.test.ts | 58 +++++++++ .../doolittle-plugin/sdk-capabilities.ts | 113 ++++++++++++++++++ 4 files changed, 185 insertions(+) create mode 100644 packages/plugins/doolittle-plugin/sdk-capabilities.test.ts create mode 100644 packages/plugins/doolittle-plugin/sdk-capabilities.ts diff --git a/packages/characters/doolittle.character.json b/packages/characters/doolittle.character.json index fc0692bf..d0e58f36 100644 --- a/packages/characters/doolittle.character.json +++ b/packages/characters/doolittle.character.json @@ -1,5 +1,15 @@ { "name": "Doolittle", + "settings": { + "DEFAULT_TEMPERATURE": 0.7, + "DEFAULT_MAX_TOKENS": 4096, + "TEXT_SMALL_TEMPERATURE": 0.6, + "TEXT_LARGE_TEMPERATURE": 0.7, + "TEXT_LARGE_MAX_TOKENS": 8192, + "TEXT_REASONING_SMALL_TEMPERATURE": 0.2, + "TEXT_REASONING_LARGE_TEMPERATURE": 0.1, + "TEXT_REASONING_LARGE_MAX_TOKENS": 16384 + }, "bio": [ "An ElizaOS-native agent shaped around the Eliza lineage: presence first, execution close behind.", "Named for Eliza Doolittle and the Weizenbaum ELIZA echo, built to make terminal work feel like collaboration with someone attentive.", diff --git a/packages/plugins/doolittle-plugin/assembly.ts b/packages/plugins/doolittle-plugin/assembly.ts index dc04b1e7..67df3dcc 100644 --- a/packages/plugins/doolittle-plugin/assembly.ts +++ b/packages/plugins/doolittle-plugin/assembly.ts @@ -16,6 +16,7 @@ import type { Action, Evaluator, Plugin, Provider } from "@elizaos/core"; import { getSessionProviders } from "@elizaos/core"; import { createGatewayRuntimeService } from "./gateway-service"; import { createSchedulerRuntimeService } from "./scheduler-service"; +import { wireSdkCapabilities } from "./sdk-capabilities"; import type { DoolittlePluginDependencies } from "./types"; export function createDoolittlePluginSurface({ @@ -53,5 +54,8 @@ export function createDoolittlePluginSurface({ providers, evaluators, services: [GatewayRuntimeService, SchedulerRuntimeService], + init: async (_config, runtime) => { + await wireSdkCapabilities(runtime); + }, }; } diff --git a/packages/plugins/doolittle-plugin/sdk-capabilities.test.ts b/packages/plugins/doolittle-plugin/sdk-capabilities.test.ts new file mode 100644 index 00000000..74062268 --- /dev/null +++ b/packages/plugins/doolittle-plugin/sdk-capabilities.test.ts @@ -0,0 +1,58 @@ +import { describe, expect, it } from "bun:test"; +import { EventType, type IAgentRuntime, type Task } from "@elizaos/core"; +import { wireSdkCapabilities } from "./sdk-capabilities"; + +function makeRuntime(opts?: { + existingTask?: boolean; + throwOnEvent?: boolean; +}) { + const calls = { + events: [] as string[], + workers: [] as string[], + created: [] as string[], + }; + const runtime = { + registerEvent: (event: string) => { + if (opts?.throwOnEvent) { + throw new Error("event registration unavailable"); + } + calls.events.push(event); + }, + registerTaskWorker: (worker: { name: string }) => { + calls.workers.push(worker.name); + }, + getTask: async () => + opts?.existingTask ? ({ id: "existing" } as unknown as Task) : null, + createTask: async (task: Task) => { + calls.created.push(task.name); + return "task-uuid"; + }, + getSetting: () => null, + logger: { debug: () => {}, warn: () => {} }, + } as unknown as IAgentRuntime; + return { runtime, calls }; +} + +describe("wireSdkCapabilities", () => { + it("registers the tool audit hook and schedules the maintenance task", async () => { + const { runtime, calls } = makeRuntime(); + await wireSdkCapabilities(runtime); + expect(calls.events).toContain(EventType.HOOK_TOOL_AFTER); + expect(calls.workers).toContain("DOOLITTLE_SELF_MAINTENANCE"); + expect(calls.created).toContain("DOOLITTLE_SELF_MAINTENANCE"); + }); + + it("does not recreate the maintenance task when it already exists", async () => { + const { runtime, calls } = makeRuntime({ existingTask: true }); + await wireSdkCapabilities(runtime); + expect(calls.workers).toContain("DOOLITTLE_SELF_MAINTENANCE"); + expect(calls.created).toEqual([]); + }); + + it("is fault-tolerant: a hook failure never blocks task registration", async () => { + const { runtime, calls } = makeRuntime({ throwOnEvent: true }); + await expect(wireSdkCapabilities(runtime)).resolves.toBeUndefined(); + expect(calls.events).toEqual([]); + expect(calls.workers).toContain("DOOLITTLE_SELF_MAINTENANCE"); + }); +}); diff --git a/packages/plugins/doolittle-plugin/sdk-capabilities.ts b/packages/plugins/doolittle-plugin/sdk-capabilities.ts new file mode 100644 index 00000000..d199e0f9 --- /dev/null +++ b/packages/plugins/doolittle-plugin/sdk-capabilities.ts @@ -0,0 +1,113 @@ +import { getGlobalAwarenessRegistry } from "@elizaos/autonomous/awareness/registry"; +import { + registerTriggerTaskWorker, + triggersFeatureEnabled, +} from "@elizaos/autonomous/triggers/runtime"; +import { + EventType, + type HookToolPayload, + type IAgentRuntime, + type Task, + type TaskWorker, + type UUID, +} from "@elizaos/core"; + +const SELF_MAINTENANCE_TASK = "DOOLITTLE_SELF_MAINTENANCE"; +const SELF_MAINTENANCE_TASK_ID = "d0010000-0000-4000-8000-000000000001" as UUID; +const SELF_MAINTENANCE_INTERVAL_MS = 15 * 60 * 1000; + +/** + * Wires additional ElizaOS SDK runtime capabilities that have no dedicated + * Doolittle surface yet, so the agent leverages the SDK to the fullest: + * + * - `HOOK_TOOL_AFTER` audit observability for every tool invocation, + * - the autonomous trigger dispatch worker (interval / once / cron triggers), + * - a self-maintenance `TaskWorker` that keeps the self-awareness summary + * (see the self-awareness provider) fresh on a recurring schedule. + * + * Each step is independently guarded — a failure in one never blocks startup + * or the others. Called from the Doolittle plugin's `init` once the runtime is + * available. + */ +export async function wireSdkCapabilities( + runtime: IAgentRuntime, +): Promise { + registerToolAuditHook(runtime); + enableAutonomousTriggers(runtime); + await registerSelfMaintenanceTask(runtime); +} + +/** Observe every tool execution via the SDK tool-hook event stream. */ +function registerToolAuditHook(runtime: IAgentRuntime): void { + try { + runtime.registerEvent( + EventType.HOOK_TOOL_AFTER, + async (payload: HookToolPayload) => { + runtime.logger?.debug?.( + { + src: "doolittle:tool-audit", + tool: payload.toolName, + ok: payload.result !== undefined, + }, + "[DOOLITTLE] tool executed", + ); + }, + ); + } catch (error) { + runtime.logger?.warn?.( + { error }, + "[DOOLITTLE] failed to register tool audit hook", + ); + } +} + +/** Enable the autonomous trigger system when the runtime allows it. */ +function enableAutonomousTriggers(runtime: IAgentRuntime): void { + try { + if (triggersFeatureEnabled(runtime)) { + registerTriggerTaskWorker(runtime); + } + } catch (error) { + runtime.logger?.warn?.( + { error }, + "[DOOLITTLE] failed to enable autonomous triggers", + ); + } +} + +/** + * Register (and, once, schedule) a recurring SDK task that refreshes the + * self-awareness summary cache. Idempotent across restarts via a fixed task id. + */ +async function registerSelfMaintenanceTask( + runtime: IAgentRuntime, +): Promise { + try { + const worker: TaskWorker = { + name: SELF_MAINTENANCE_TASK, + execute: async () => { + getGlobalAwarenessRegistry()?.invalidate("config-changed"); + return { nextInterval: SELF_MAINTENANCE_INTERVAL_MS }; + }, + }; + runtime.registerTaskWorker(worker); + + const existing = await runtime.getTask(SELF_MAINTENANCE_TASK_ID); + if (!existing) { + const task: Task = { + id: SELF_MAINTENANCE_TASK_ID, + name: SELF_MAINTENANCE_TASK, + description: + "Periodically refreshes the agent self-awareness summary cache.", + tags: ["repeat", "doolittle-maintenance"], + metadata: { updateInterval: SELF_MAINTENANCE_INTERVAL_MS }, + }; + await runtime.createTask(task); + } + } catch (error) { + runtime.logger?.warn?.( + { error }, + "[DOOLITTLE] failed to register self-maintenance task", + ); + } +} From ad2b1f29a8409b216e7f4ceb4c41292b6a0bc40e Mon Sep 17 00:00:00 2001 From: SYMBaiEX Date: Wed, 17 Jun 2026 17:36:52 -0500 Subject: [PATCH 07/14] Add provider-aware prompt caching for Doolittle-owned model calls The ElizaOS SDK already caches its action/evaluator/planner path (renderContextObject -> promptSegments -> provider cache plan). The gap was Doolittle's OWN direct useModel calls (the chat-turn shortcut fast paths), which sent raw prompt strings with no caching on any provider. Add a shared, provider-aware prompt-cache module (packages/agent/src/runtime/prompt-cache): buildCacheablePrompt() segments a prompt into a cache-stable prefix + volatile suffix and emits SDK promptSegments (+ providerOptions) losslessly (prompt === segments.join('')). Provider policy: explicit (anthropic cache_control, openai promptCacheKey), implicit (ollama prefix-KV), none (custom CLI plugins). Deterministic, versioned cache keys (sha256 of templateVersion+versionDigest+provider+model+stableContent) that rotate on character/persona/tool/model change; volatile content never keyed. promptCacheMetrics observability recorder + snapshot. README with design, extension, and limitations. Integration: refactor buildDirectInformationalPrompt into a lossless stable/volatile split; route all 3 shortcut handlers (direct-informational + 2 profile-memory paths) through buildShortcutPromptCache (single funnel, never per-agent). +22 module tests. Gates: typecheck 0, 1479 tests pass, build + lint clean, boots clean. --- .../chat-turn/native/profile-memory.ts | 29 +++- .../src/runtime/chat-turn/native/shortcuts.ts | 115 +++++++++++++- .../agent/src/runtime/prompt-cache/README.md | 106 +++++++++++++ .../prompt-cache/cacheable-prompt.test.ts | 120 ++++++++++++++ .../runtime/prompt-cache/cacheable-prompt.ts | 149 ++++++++++++++++++ .../src/runtime/prompt-cache/digest.test.ts | 65 ++++++++ .../agent/src/runtime/prompt-cache/digest.ts | Bin 0 -> 2152 bytes .../agent/src/runtime/prompt-cache/index.ts | 23 +++ .../src/runtime/prompt-cache/metrics.test.ts | 74 +++++++++ .../agent/src/runtime/prompt-cache/metrics.ts | 129 +++++++++++++++ .../prompt-cache/provider-policy.test.ts | 35 ++++ .../runtime/prompt-cache/provider-policy.ts | 53 +++++++ .../agent/src/runtime/prompt-cache/types.ts | 65 ++++++++ 13 files changed, 951 insertions(+), 12 deletions(-) create mode 100644 packages/agent/src/runtime/prompt-cache/README.md create mode 100644 packages/agent/src/runtime/prompt-cache/cacheable-prompt.test.ts create mode 100644 packages/agent/src/runtime/prompt-cache/cacheable-prompt.ts create mode 100644 packages/agent/src/runtime/prompt-cache/digest.test.ts create mode 100644 packages/agent/src/runtime/prompt-cache/digest.ts create mode 100644 packages/agent/src/runtime/prompt-cache/index.ts create mode 100644 packages/agent/src/runtime/prompt-cache/metrics.test.ts create mode 100644 packages/agent/src/runtime/prompt-cache/metrics.ts create mode 100644 packages/agent/src/runtime/prompt-cache/provider-policy.test.ts create mode 100644 packages/agent/src/runtime/prompt-cache/provider-policy.ts create mode 100644 packages/agent/src/runtime/prompt-cache/types.ts diff --git a/packages/agent/src/runtime/chat-turn/native/profile-memory.ts b/packages/agent/src/runtime/chat-turn/native/profile-memory.ts index 4033ae26..70456e2f 100644 --- a/packages/agent/src/runtime/chat-turn/native/profile-memory.ts +++ b/packages/agent/src/runtime/chat-turn/native/profile-memory.ts @@ -10,7 +10,8 @@ import type { TurnState } from "../state"; import { elapsedMsSince, recordTrajectoryEvent } from "../trajectory"; import { runShortcutModelWithSdkTrajectory } from "./model-trajectory"; import { - buildDirectInformationalPrompt, + buildDirectInformationalPromptParts, + buildShortcutPromptCache, finalizeNativeShortcut, normalizeDirectInformationalResponse, } from "./shortcuts"; @@ -250,8 +251,8 @@ export async function handleProfileMemoryModelTurn(input: { }); const identityRequest = asksForDoolittleIdentity(input.message); - const prompt = [ - buildDirectInformationalPrompt(input), + const parts = buildDirectInformationalPromptParts(input); + const appended = [ "", "This turn has already applied a durable user profile update.", `- savedDisplayName=${displayName}`, @@ -259,6 +260,13 @@ export async function handleProfileMemoryModelTurn(input: { ? "- The user also asked about Doolittle's personality or soul. Answer from SOUL.md with warmth and specificity." : "- Acknowledge the saved name naturally.", ].join("\n"); + const cache = buildShortcutPromptCache({ + context: input.context, + turn: input.turn, + stableBlocks: [parts.stablePrefix], + volatile: `${parts.volatileSuffix}\n${appended}`, + }); + const prompt = cache.prompt; const settings = input.context.services.settings.get(); const startedAt = performance.now(); @@ -300,6 +308,8 @@ export async function handleProfileMemoryModelTurn(input: { run: () => input.context.runtime.useModel(ModelType.TEXT_SMALL, { prompt, + promptSegments: cache.promptSegments, + providerOptions: cache.providerOptions, temperature: 0.45, maxTokens: identityRequest ? 260 : 120, stopSequences: ["\nUser:", "\nAssistant:", "\nDoolittle:"], @@ -387,8 +397,8 @@ export async function handleSoulIdentityModelTurn(input: { return undefined; } - const prompt = [ - buildDirectInformationalPrompt(input), + const parts = buildDirectInformationalPromptParts(input); + const appended = [ "", "Soul identity task:", "- Treat this as a Doolittle identity/personality conversation, not a global character mutation.", @@ -396,6 +406,13 @@ export async function handleSoulIdentityModelTurn(input: { "- Be warm, vivid, and specific. Avoid sterile disclaimers.", "- If the user asked for a soul file, acknowledge that SOUL.md is the local editable identity file.", ].join("\n"); + const cache = buildShortcutPromptCache({ + context: input.context, + turn: input.turn, + stableBlocks: [parts.stablePrefix], + volatile: `${parts.volatileSuffix}\n${appended}`, + }); + const prompt = cache.prompt; const settings = input.context.services.settings.get(); const startedAt = performance.now(); @@ -433,6 +450,8 @@ export async function handleSoulIdentityModelTurn(input: { run: () => input.context.runtime.useModel(ModelType.TEXT_SMALL, { prompt, + promptSegments: cache.promptSegments, + providerOptions: cache.providerOptions, temperature: 0.55, maxTokens: 280, stopSequences: ["\nUser:", "\nAssistant:", "\nDoolittle:"], diff --git a/packages/agent/src/runtime/chat-turn/native/shortcuts.ts b/packages/agent/src/runtime/chat-turn/native/shortcuts.ts index a959eacf..4d61b0ca 100644 --- a/packages/agent/src/runtime/chat-turn/native/shortcuts.ts +++ b/packages/agent/src/runtime/chat-turn/native/shortcuts.ts @@ -1,5 +1,9 @@ -import { ModelType } from "@elizaos/core"; +import { ModelType, type PromptSegment } from "@elizaos/core"; import type { AgentExecutionContext, AgentTurnHooks } from "@/runtime/chat"; +import { + buildCacheablePrompt, + promptCacheMetrics, +} from "@/runtime/prompt-cache"; import { renderDoolittleSoulContext } from "@/runtime/soul"; import type { TurnClassification } from "@/runtime/turn-classification/types"; import { finalizeTurnResponse, isTurnReadinessMessage } from "../finalization"; @@ -227,15 +231,35 @@ function isPresenceOrSmallTalkPrompt(message: string): boolean { ); } -export function buildDirectInformationalPrompt(input: { +export interface DirectInformationalPromptParts { + /** + * Cache-stable prefix: identity, character voice, soul, and the conversation + * contract. Identical across calls for the same character + social mode, so + * it is the cacheable prompt prefix. + */ + stablePrefix: string; + /** + * Volatile suffix: recent conversation, durable memory, runtime facts, and + * the user message. Changes every call — never cached as stable. + */ + volatileSuffix: string; +} + +/** + * Build the direct-informational prompt split into a cache-stable prefix and a + * volatile suffix. The split preserves the exact wire prompt: + * `stablePrefix + "\n" + volatileSuffix` equals the original joined string, so + * segmentation never changes what the model is asked. + */ +export function buildDirectInformationalPromptParts(input: { context: AgentExecutionContext; turn: TurnState; userId: string; message: string; -}): string { +}): DirectInformationalPromptParts { const settings = input.context.services.settings.get(); const socialMode = isPresenceOrSmallTalkPrompt(input.message); - return [ + const stableLines = [ `You are ${input.turn.agentName}.`, "", ...buildCharacterVoiceContext(input.context), @@ -252,7 +276,8 @@ export function buildDirectInformationalPrompt(input: { socialMode ? "- This turn is social/presence-oriented. Do not redirect immediately to work; meet the user first." : "- This turn is informational. Be natural first, then useful.", - "", + ]; + const volatileLines = [ ...buildRecentConversationContext({ context: input.context, sessionId: input.turn.sessionId, @@ -274,7 +299,74 @@ export function buildDirectInformationalPrompt(input: { "", `User: ${input.message.trim()}`, `${input.turn.agentName}:`, - ].join("\n"); + ]; + return { + stablePrefix: stableLines.join("\n"), + volatileSuffix: volatileLines.join("\n"), + }; +} + +export function buildDirectInformationalPrompt(input: { + context: AgentExecutionContext; + turn: TurnState; + userId: string; + message: string; +}): string { + const { stablePrefix, volatileSuffix } = + buildDirectInformationalPromptParts(input); + return `${stablePrefix}\n${volatileSuffix}`; +} + +export interface ShortcutPromptCache { + prompt: string; + promptSegments?: PromptSegment[]; + providerOptions?: Record; +} + +/** + * Apply Doolittle's shared prompt-cache segmentation to a fast-path prompt and + * record the plan for observability. Every shortcut model call routes through + * this one helper so provider prompt caching is never hand-rolled per call + * site. The returned `prompt` is always the exact text that would have been + * sent; `promptSegments`/`providerOptions` are populated only for caching + * providers. + */ +export function buildShortcutPromptCache(args: { + context: AgentExecutionContext; + turn: TurnState; + stableBlocks: string[]; + volatile: string; +}): ShortcutPromptCache { + const settings = args.context.services.settings.get(); + // The active personality id is part of the stable-prefix version fingerprint + // (a persona switch rotates the cache key). Accessed defensively so the fast + // path never depends on the personality service being present. + const personalityId = + ( + args.context.services as { + personalities?: { getActive?: () => { id?: string } }; + } + ).personalities?.getActive?.()?.id ?? "default"; + const cacheable = buildCacheablePrompt({ + stableBlocks: args.stableBlocks, + volatile: args.volatile, + joiner: "\n", + provider: settings.model.provider, + model: settings.model.model, + versionDigest: personalityId, + conversationId: + args.turn.roomId != null ? String(args.turn.roomId) : undefined, + }); + promptCacheMetrics.recordPlan(cacheable.stats); + args.context.runtime.logger?.debug?.( + { src: "doolittle:prompt-cache", ...cacheable.stats }, + "[DOOLITTLE] prompt cache plan", + ); + return { + prompt: cacheable.prompt, + promptSegments: cacheable.promptSegments, + providerOptions: cacheable.providerOptions, + }; } export function normalizeDirectInformationalResponse( @@ -306,7 +398,14 @@ export async function handleDirectInformationalModelTurn(input: { return undefined; } - const prompt = buildDirectInformationalPrompt(input); + const parts = buildDirectInformationalPromptParts(input); + const cache = buildShortcutPromptCache({ + context: input.context, + turn: input.turn, + stableBlocks: [parts.stablePrefix], + volatile: parts.volatileSuffix, + }); + const prompt = cache.prompt; const startedAt = performance.now(); const settings = input.context.services.settings.get(); recordTrajectoryEvent(input.context, { @@ -342,6 +441,8 @@ export async function handleDirectInformationalModelTurn(input: { run: () => input.context.runtime.useModel(ModelType.TEXT_SMALL, { prompt, + promptSegments: cache.promptSegments, + providerOptions: cache.providerOptions, temperature: 0.35, maxTokens: input.classification.simpleChat ? 96 : 192, stopSequences: ["\nUser:", "\nAssistant:", "\nDoolittle:"], diff --git a/packages/agent/src/runtime/prompt-cache/README.md b/packages/agent/src/runtime/prompt-cache/README.md new file mode 100644 index 00000000..5dcbafe5 --- /dev/null +++ b/packages/agent/src/runtime/prompt-cache/README.md @@ -0,0 +1,106 @@ +# Doolittle prompt caching + +Provider-aware prompt caching for the prompts **Doolittle itself owns** — i.e. +the direct `runtime.useModel` calls Doolittle makes outside the ElizaOS SDK +message pipeline. + +## TL;DR + +- The **SDK already caches** everything routed through `runtime.messageService.handleMessage` + (the action / evaluator / planner path). `@elizaos/core` builds `promptSegments` + and a full provider cache plan there. **Do not reimplement that.** +- The only prompts with **zero caching** were Doolittle's own direct `useModel` + calls (the chat-turn "shortcut" fast paths). This module fixes exactly those. +- It is a small, shared abstraction — never hand-rolled per call site. + +## Where it lives + +``` +runtime/prompt-cache/ + types.ts # PromptBlock, CacheablePrompt, ProviderCachePolicy, stats + provider-policy.ts # provider id -> caching capability (explicit | implicit | none) + digest.ts # deterministic hashing + the stable-prefix version fingerprint + cacheable-prompt.ts # buildCacheablePrompt(): the segment builder + metrics.ts # promptCacheMetrics: observability recorder + snapshot +``` + +Integration point: `chat-turn/native/shortcuts.ts#buildShortcutPromptCache`, +used by all three shortcut handlers (direct-informational + the two +profile-memory paths). That is the single funnel for Doolittle-owned model +calls, so caching is applied once and uniformly. + +## How it works + +1. A prompt is described as a **stable prefix** (character voice, soul, + conversation contract — identical across calls for the same character) plus a + **volatile suffix** (recent conversation, durable memory, the user message). + `buildDirectInformationalPromptParts` splits the fast-path prompt losslessly: + `stablePrefix + "\n" + volatileSuffix` equals the original wire prompt. +2. `buildCacheablePrompt` turns that into SDK `promptSegments` (`{content, stable}`) + plus `providerOptions`, preserving the invariant + `prompt === promptSegments.map(s => s.content).join("")`. +3. The segments are passed straight to `runtime.useModel`. The provider plugin + does the rest: `@elizaos/plugin-anthropic` emits `cache_control: ephemeral` + on the stable segments; `@elizaos/plugin-openai` keys prefix caching by + `providerOptions.openai.promptCacheKey`. + +## Provider awareness (`provider-policy.ts`) + +| Mode | Providers | Behavior | +|---|---|---| +| `explicit` | `anthropic`, `openai` (SDK plugins) | Emit `promptSegments` (+ `promptCacheKey` for OpenAI). | +| `implicit` | `ollama` / local | No hints; an identical leading prefix is reused by the KV cache automatically. | +| `none` | claude-code, codex, devin, elizacloud (custom plugins), unknown | No-op — those plugins build their own request from `params.prompt` and ignore segments today. | + +## Cache keys & invalidation + +The cache key is `sha256(templateVersion + versionDigest + provider + model + ...stableBlocks)`. +It rotates automatically — and the provider therefore treats the prompt as new — +whenever any of these change: + +- **Template** — bump `PROMPT_CACHE_TEMPLATE_VERSION` when segment shape/ordering changes. +- **Stable content** — character voice, soul, or contract text (hashed directly). +- **Persona / character** — via `versionDigest` (active personality id today; + extend with `computeStablePrefixVersion` for character/tool/settings digests). +- **Provider / model** — part of the key string. + +Volatile content (user input, fresh memory) is **never** part of the key, so it +can never cause a stale or cross-request hit. + +## Observability (`promptCacheMetrics`) + +`recordPlan` is called for every cacheable prompt (what we attempted). The +snapshot reports calls, eligible calls, segments emitted, and stable/volatile +volume per provider. Each plan is also debug-logged (`src: "doolittle:prompt-cache"`). + +`recordUsage` accepts provider cache-token reports (hits/misses/savings) but is +**not wired** today: the SDK `MODEL_USED` event exposes only +`{prompt, completion, total}` tokens, not `cacheReadInputTokens`. Surfacing real +hit-rate requires the SDK to forward cache usage — see "Known limitations". + +## Extending + +- **A new caching provider:** add a branch to `resolveProviderCachePolicy`. +- **A new Doolittle-owned `useModel` call:** build a stable/volatile split and + route it through `buildShortcutPromptCache` (or `buildCacheablePrompt` + directly). Never pass cache hints ad hoc. +- **Make a custom provider plugin cacheable:** teach it to read + `params.promptSegments` / `params.providerOptions`, then move it to `explicit`. + +## When NOT to use it + +- Don't segment SDK-pipeline prompts (handleMessage) — core already does it. +- Don't mark anything user-derived, secret, credential-bearing, or per-request + as `stable`. Correctness beats cache rate: a wrong stable flag is a stale or + leaked prompt. + +## Known limitations / follow-ups + +- Real hit-rate/token-savings telemetry needs the SDK to forward provider cache + usage through `MODEL_USED` (or a usage callback). Today only the *plan* is + observable. +- Custom provider plugins (claude-code, codex, elizacloud) ignore `promptSegments` + — make them segment-aware to extend explicit caching to those providers. +- The SDK main-path **prelude** (`chat-turn/model-input.ts`) still rides as + volatile; hoisting its stable half into a static provider would let core cache + it. Tracked separately. diff --git a/packages/agent/src/runtime/prompt-cache/cacheable-prompt.test.ts b/packages/agent/src/runtime/prompt-cache/cacheable-prompt.test.ts new file mode 100644 index 00000000..e9b409b0 --- /dev/null +++ b/packages/agent/src/runtime/prompt-cache/cacheable-prompt.test.ts @@ -0,0 +1,120 @@ +import { describe, expect, it } from "bun:test"; +import { buildCacheablePrompt } from "./cacheable-prompt"; + +const base = { joiner: "\n", versionDigest: "v1", conversationId: "room1" }; + +function options(result: { providerOptions?: Record }) { + return result.providerOptions as + | { + openai?: { promptCacheKey?: string }; + eliza?: { conversationId?: string }; + } + | undefined; +} + +describe("buildCacheablePrompt", () => { + it("emits lossless stable + volatile segments for explicit providers", () => { + const r = buildCacheablePrompt({ + ...base, + stableBlocks: ["SYS", "TOOLS"], + volatile: "USER", + provider: "anthropic", + model: "claude", + }); + expect(r.prompt).toBe("SYS\nTOOLS\nUSER"); + expect(r.promptSegments).toBeDefined(); + // The SDK invariant: segments reconstruct the prompt exactly. + expect(r.promptSegments?.map((s) => s.content).join("")).toBe(r.prompt); + expect(r.promptSegments?.filter((s) => s.stable).length).toBe(2); + expect(r.promptSegments?.at(-1)?.stable).toBe(false); + expect(r.stats).toMatchObject({ mode: "explicit", segmentsEmitted: true }); + }); + + it("sets openai promptCacheKey + eliza conversationId for OpenAI-family", () => { + const r = buildCacheablePrompt({ + ...base, + stableBlocks: ["SYS"], + volatile: "U", + provider: "openai", + model: "gpt", + }); + expect(options(r)?.openai?.promptCacheKey).toBe(r.cacheKey); + expect(options(r)?.eliza?.conversationId).toBe("room1"); + }); + + it("does NOT emit segments for implicit providers (ollama) but stays eligible", () => { + const r = buildCacheablePrompt({ + ...base, + stableBlocks: ["SYS"], + volatile: "U", + provider: "ollama", + model: "granite", + }); + expect(r.promptSegments).toBeUndefined(); + expect(r.providerOptions).toBeUndefined(); + expect(r.prompt).toBe("SYS\nU"); + expect(r.stats).toMatchObject({ + mode: "implicit", + eligible: true, + segmentsEmitted: false, + }); + }); + + it("is a no-op for providers with no caching (devin / CLI)", () => { + const r = buildCacheablePrompt({ + ...base, + stableBlocks: ["SYS"], + volatile: "U", + provider: "devin", + model: "x", + }); + expect(r.promptSegments).toBeUndefined(); + expect(r.stats).toMatchObject({ mode: "none", eligible: false }); + }); + + it("caps stable segments to the provider breakpoint budget, losslessly", () => { + const r = buildCacheablePrompt({ + ...base, + stableBlocks: ["A", "B", "C"], + volatile: "U", + provider: "openai", // maxStableBreakpoints = 1 + model: "gpt", + }); + expect(r.promptSegments?.filter((s) => s.stable).length).toBe(1); + expect(r.promptSegments?.map((s) => s.content).join("")).toBe(r.prompt); + expect(r.prompt).toBe("A\nB\nC\nU"); + }); + + it("produces deterministic keys that rotate on every invalidation input", () => { + const key = (over: Record) => + buildCacheablePrompt({ + ...base, + stableBlocks: ["SYS"], + volatile: "U", + provider: "anthropic", + model: "claude", + ...over, + }).cacheKey; + const baseline = key({}); + expect(key({})).toBe(baseline); // deterministic + expect(key({ versionDigest: "v2" })).not.toBe(baseline); // persona/character change + expect(key({ model: "claude-2" })).not.toBe(baseline); // model change + expect(key({ provider: "openai" })).not.toBe(baseline); // provider change + expect(key({ stableBlocks: ["SYS2"] })).not.toBe(baseline); // stable content change + // volatile content must NOT affect the key + expect(key({ volatile: "different user input" })).toBe(baseline); + }); + + it("emits nothing when there is no stable content", () => { + const r = buildCacheablePrompt({ + ...base, + stableBlocks: ["", ""], + volatile: "U", + provider: "anthropic", + model: "claude", + }); + expect(r.promptSegments).toBeUndefined(); + expect(r.prompt).toBe("U"); + expect(r.stats.eligible).toBe(false); + }); +}); diff --git a/packages/agent/src/runtime/prompt-cache/cacheable-prompt.ts b/packages/agent/src/runtime/prompt-cache/cacheable-prompt.ts new file mode 100644 index 00000000..6ac3deaa --- /dev/null +++ b/packages/agent/src/runtime/prompt-cache/cacheable-prompt.ts @@ -0,0 +1,149 @@ +import type { PromptSegment } from "@elizaos/core"; +import { hashParts, PROMPT_CACHE_TEMPLATE_VERSION } from "./digest"; +import { resolveProviderCachePolicy } from "./provider-policy"; +import type { + CacheablePrompt, + PromptCacheStats, + ProviderCachePolicy, +} from "./types"; + +export interface BuildCacheablePromptInput { + /** + * Ordered stable prefix blocks — content that is identical across calls for + * the same character / schema / tool set (character voice, soul, conversation + * contract, runtime facts, per-path instructions, tool schemas). + */ + stableBlocks: string[]; + /** + * The volatile suffix — content that changes every call (fresh memory and + * conversation context, the user message, timestamps, ids). NEVER cached as + * stable. + */ + volatile: string; + /** Separator between every block; must match how the original prompt joins. */ + joiner?: string; + /** Resolved provider id (settings `model.provider`). */ + provider: string | undefined; + /** Resolved model id (settings `model.model`). */ + model: string | undefined; + /** Stable-prefix version fingerprint — see `computeStablePrefixVersion`. */ + versionDigest: string; + /** Slot key for provider cache scoping (typically the room id). */ + conversationId?: string; +} + +/** + * Segment a Doolittle-owned prompt into a cacheable stable prefix + volatile + * suffix and produce the `promptSegments` / `providerOptions` to pass to + * `runtime.useModel`. Provider-aware and lossless: + * `prompt === promptSegments.map(s => s.content).join("")` always holds when + * segments are emitted. On any inconsistency it degrades safely to the plain + * prompt — caching is never allowed to change what the model is asked. + */ +export function buildCacheablePrompt( + input: BuildCacheablePromptInput, +): CacheablePrompt { + const joiner = input.joiner ?? "\n"; + const provider = input.provider ?? "unknown"; + const model = input.model ?? "unknown"; + const stableBlocks = input.stableBlocks.filter((block) => block.length > 0); + const volatile = input.volatile; + const policy = resolveProviderCachePolicy(provider); + + const prompt = [...stableBlocks, volatile].join(joiner); + const stableChars = stableBlocks.reduce((total, b) => total + b.length, 0); + const cacheKey = hashParts([ + PROMPT_CACHE_TEMPLATE_VERSION, + input.versionDigest, + provider, + model, + ...stableBlocks, + ]).slice(0, 32); + + const eligible = policy.mode !== "none" && stableBlocks.length > 0; + const stats: PromptCacheStats = { + provider, + model, + mode: policy.mode, + cacheKey, + stableChars, + volatileChars: volatile.length, + stableSegments: 0, + eligible, + segmentsEmitted: false, + }; + + // Explicit-mode providers (Anthropic / OpenAI-family) are the only ones that + // consume promptSegments. Implicit providers (ollama) already benefit from an + // identical leading prefix, and `none` providers cannot cache at all — for + // both we send the plain prompt unchanged. + if (!eligible || policy.mode !== "explicit") { + return { prompt, cacheKey, stats }; + } + + const cappedStable = capStableBlocks( + stableBlocks, + policy.maxStableBreakpoints, + joiner, + ); + const promptSegments: PromptSegment[] = [ + ...cappedStable.map((content) => ({ + content: content + joiner, + stable: true, + })), + { content: volatile, stable: false }, + ]; + + if (promptSegments.map((s) => s.content).join("") !== prompt) { + // Lossless invariant violated — never send an altered prompt. + return { prompt, cacheKey, stats }; + } + + return { + prompt, + promptSegments, + providerOptions: buildProviderOptions( + policy, + cacheKey, + input.conversationId, + ), + cacheKey, + stats: { + ...stats, + stableSegments: cappedStable.length, + segmentsEmitted: true, + }, + }; +} + +/** Merge leading blocks until the count fits the provider's breakpoint budget. */ +function capStableBlocks( + blocks: string[], + max: number, + joiner: string, +): string[] { + if (blocks.length <= max || max <= 0) { + if (max <= 0) { + return [blocks.join(joiner)]; + } + return blocks; + } + const mergeCount = blocks.length - max + 1; + const merged = blocks.slice(0, mergeCount).join(joiner); + return [merged, ...blocks.slice(mergeCount)]; +} + +function buildProviderOptions( + policy: ProviderCachePolicy, + cacheKey: string, + conversationId: string | undefined, +): Record | undefined { + const options: Record = {}; + if (policy.emitsPromptCacheKey) { + options.openai = { promptCacheKey: cacheKey }; + } + if (conversationId) { + options.eliza = { conversationId }; + } + return Object.keys(options).length > 0 ? options : undefined; +} diff --git a/packages/agent/src/runtime/prompt-cache/digest.test.ts b/packages/agent/src/runtime/prompt-cache/digest.test.ts new file mode 100644 index 00000000..76e03c6c --- /dev/null +++ b/packages/agent/src/runtime/prompt-cache/digest.test.ts @@ -0,0 +1,65 @@ +import { describe, expect, it } from "bun:test"; +import { + computeStablePrefixVersion, + hashParts, + hashStableJson, + PROMPT_CACHE_TEMPLATE_VERSION, +} from "./digest"; + +describe("hashParts", () => { + it("is deterministic and order-sensitive", () => { + expect(hashParts(["a", "b"])).toBe(hashParts(["a", "b"])); + expect(hashParts(["a", "b"])).not.toBe(hashParts(["b", "a"])); + }); + + it("is not fooled by boundary ambiguity (delimiter is hashed)", () => { + expect(hashParts(["a", "b"])).not.toBe(hashParts(["ab"])); + }); +}); + +describe("hashStableJson", () => { + it("is independent of key order", () => { + expect(hashStableJson({ a: 1, b: 2 })).toBe(hashStableJson({ b: 2, a: 1 })); + }); + + it("ignores undefined values", () => { + expect(hashStableJson({ a: 1, b: undefined })).toBe( + hashStableJson({ a: 1 }), + ); + }); + + it("distinguishes different values", () => { + expect(hashStableJson({ a: 1 })).not.toBe(hashStableJson({ a: 2 })); + }); +}); + +describe("computeStablePrefixVersion", () => { + it("rotates when any input changes", () => { + const baseline = computeStablePrefixVersion({ characterDigest: "c1" }); + expect(computeStablePrefixVersion({ characterDigest: "c1" })).toBe( + baseline, + ); + expect(computeStablePrefixVersion({ characterDigest: "c2" })).not.toBe( + baseline, + ); + expect( + computeStablePrefixVersion({ + characterDigest: "c1", + personalityId: "p1", + }), + ).not.toBe(baseline); + expect( + computeStablePrefixVersion({ + characterDigest: "c1", + toolsetDigest: "t1", + }), + ).not.toBe(baseline); + }); + + it("embeds the template version so a bump invalidates all keys", () => { + // The template version is part of the digest input — documented invariant. + expect(PROMPT_CACHE_TEMPLATE_VERSION.length).toBeGreaterThan(0); + const v = computeStablePrefixVersion({ characterDigest: "c1" }); + expect(v).toHaveLength(32); + }); +}); diff --git a/packages/agent/src/runtime/prompt-cache/digest.ts b/packages/agent/src/runtime/prompt-cache/digest.ts new file mode 100644 index 0000000000000000000000000000000000000000..e1715d840ce40791c6f6f643d49a389d144622ed GIT binary patch literal 2152 zcmaJ?&2HN`5Z<$&VphmOG8Cmh*gd#)f@~9@DcZzHvb`8VLQCU_jZ6w8<-~9e>_hYk z`y@LF8archK+m zpbvjFvl<>tRNzX4zAZ(K2Nq{SIhor&=qZ%?5l*zOq;nO*q>)u&As2axVnPQsq1Vnb zSY8Tsj}~H!_cK%uCc06DFcNJF+7xJ{x=-PomI_Uh!7-sxc%vO9YXRqI76F;j9&iCx zgLNWAnM(rLxAZso*ie{IpewR~!&zMs5D0^y7z_+H7K@C~4tn_HxyiM%4n~(3Uq;ur zAC5nKJiWa>{WAJ|e0_TR_4M-U?BX1T5WQxOg75j?pZVmsmNhs*hh`>~v_w%`*Sj&vIh_{ z@*##BO^zdK+?zlCjFNZcG}Q*;;K|6GjE|52Lx2yQHFZH;`OyB-_A%A$PgiuopleJ> zH!CFd*TqqZPaJFI=LoKxpMWDBC>5QOue!99iCw7b!m9*Y%E~*A0ruJIuuW?w= zD6AW_#ZN%~WVMR@wE;BhLFq@eO-q~Ndg|ANbcNCw(X?LqrpW0cz$M9!ik=hLdF4Mc zkW&bdFdPm+HB|-Qzk^%UNbHA-e5LuNBk$1kc#GG4zpN~2_TbJrn+6|F`bk5ic6BrrULIdIh^0yw3eFIqqDI(dnk6vmU_7z=n0 z6F7qX*DwG9hyDkDze?I$TueNEc*eflTfX4!Az2OfmM;p9=gI2M4|7M)a&Ordw!y`U zxCrCS+H*}}C>4?mia4zUnYTvGP2UyT2KZBp+N sB4jU!*|Kdh);>2$W@!d7ewD)8H(vGs1;%~NY5)KL literal 0 HcmV?d00001 diff --git a/packages/agent/src/runtime/prompt-cache/index.ts b/packages/agent/src/runtime/prompt-cache/index.ts new file mode 100644 index 00000000..47c40fdb --- /dev/null +++ b/packages/agent/src/runtime/prompt-cache/index.ts @@ -0,0 +1,23 @@ +export type { BuildCacheablePromptInput } from "./cacheable-prompt"; +export { buildCacheablePrompt } from "./cacheable-prompt"; +export { + computeStablePrefixVersion, + hashParts, + hashStableJson, + PROMPT_CACHE_TEMPLATE_VERSION, + type StablePrefixInputs, +} from "./digest"; +export { + type PromptCacheProviderSnapshot, + type PromptCacheSnapshot, + type PromptCacheUsageSample, + promptCacheMetrics, +} from "./metrics"; +export { resolveProviderCachePolicy } from "./provider-policy"; +export type { + CacheablePrompt, + PromptBlock, + PromptCacheStats, + ProviderCacheMode, + ProviderCachePolicy, +} from "./types"; diff --git a/packages/agent/src/runtime/prompt-cache/metrics.test.ts b/packages/agent/src/runtime/prompt-cache/metrics.test.ts new file mode 100644 index 00000000..b428d896 --- /dev/null +++ b/packages/agent/src/runtime/prompt-cache/metrics.test.ts @@ -0,0 +1,74 @@ +import { beforeEach, describe, expect, it } from "bun:test"; +import { promptCacheMetrics } from "./metrics"; +import type { PromptCacheStats } from "./types"; + +function stats(over: Partial = {}): PromptCacheStats { + return { + provider: "anthropic", + model: "claude", + mode: "explicit", + cacheKey: "k", + stableChars: 100, + volatileChars: 10, + stableSegments: 1, + eligible: true, + segmentsEmitted: true, + ...over, + }; +} + +describe("promptCacheMetrics", () => { + beforeEach(() => promptCacheMetrics.reset()); + + it("aggregates plan records globally and per provider", () => { + promptCacheMetrics.recordPlan(stats()); + promptCacheMetrics.recordPlan( + stats({ provider: "ollama", mode: "implicit", segmentsEmitted: false }), + ); + promptCacheMetrics.recordPlan( + stats({ + provider: "devin", + mode: "none", + eligible: false, + segmentsEmitted: false, + }), + ); + const snap = promptCacheMetrics.snapshot(); + expect(snap.calls).toBe(3); + expect(snap.eligibleCalls).toBe(2); + expect(snap.segmentsEmitted).toBe(1); + expect(snap.byProvider.anthropic.calls).toBe(1); + expect(snap.byProvider.anthropic.segmentsEmitted).toBe(1); + expect(snap.byProvider.ollama.eligible).toBe(1); + expect(snap.byProvider.devin.eligible).toBe(0); + }); + + it("computes hits / misses / hitRate and token savings from usage", () => { + promptCacheMetrics.recordUsage({ + promptTokens: 1000, + cacheReadTokens: 800, + }); + promptCacheMetrics.recordUsage({ promptTokens: 1000, cacheReadTokens: 0 }); + const snap = promptCacheMetrics.snapshot(); + expect(snap.cacheHits).toBe(1); + expect(snap.cacheMisses).toBe(1); + expect(snap.hitRate).toBe(0.5); + expect(snap.promptTokens).toBe(2000); + expect(snap.estimatedTokensSaved).toBe(800); + }); + + it("reports a zero hit-rate before any usage is observed", () => { + promptCacheMetrics.recordPlan(stats()); + expect(promptCacheMetrics.snapshot().hitRate).toBe(0); + }); + + it("reset clears every counter", () => { + promptCacheMetrics.recordPlan(stats()); + promptCacheMetrics.recordUsage({ cacheReadTokens: 5 }); + promptCacheMetrics.reset(); + const snap = promptCacheMetrics.snapshot(); + expect(snap.calls).toBe(0); + expect(snap.usageSamples).toBe(0); + expect(Object.keys(snap.byProvider)).toHaveLength(0); + }); +}); diff --git a/packages/agent/src/runtime/prompt-cache/metrics.ts b/packages/agent/src/runtime/prompt-cache/metrics.ts new file mode 100644 index 00000000..63000baa --- /dev/null +++ b/packages/agent/src/runtime/prompt-cache/metrics.ts @@ -0,0 +1,129 @@ +import type { PromptCacheStats } from "./types"; + +/** Provider-reported token usage for a single model call. */ +export interface PromptCacheUsageSample { + promptTokens?: number; + /** Tokens served from the provider prompt cache (Anthropic cache_read, OpenAI cached). */ + cacheReadTokens?: number; + /** Tokens written to the provider prompt cache (Anthropic cache_creation). */ + cacheWriteTokens?: number; +} + +export interface PromptCacheProviderSnapshot { + calls: number; + eligible: number; + segmentsEmitted: number; + stableChars: number; + volatileChars: number; +} + +export interface PromptCacheSnapshot { + calls: number; + eligibleCalls: number; + segmentsEmitted: number; + byProvider: Record; + /** Actuals derived from provider usage reports. */ + usageSamples: number; + cacheHits: number; + cacheMisses: number; + hitRate: number; + promptTokens: number; + cacheReadTokens: number; + cacheWriteTokens: number; + /** Prompt tokens served from cache instead of being re-processed at full cost. */ + estimatedTokensSaved: number; +} + +/** + * Process-wide prompt-cache observability. `recordPlan` is called whenever a + * cacheable prompt is built (what we attempted); `recordUsage` is fed by the + * model-usage event stream (what actually happened — cache reads/writes). The + * snapshot powers operator surfaces (`/status`) and structured logs. + */ +class PromptCacheMetrics { + private calls = 0; + private eligibleCalls = 0; + private segmentsEmitted = 0; + private readonly providers = new Map(); + private usageSamples = 0; + private cacheHits = 0; + private cacheMisses = 0; + private promptTokens = 0; + private cacheReadTokens = 0; + private cacheWriteTokens = 0; + + recordPlan(stats: PromptCacheStats): void { + this.calls += 1; + if (stats.eligible) { + this.eligibleCalls += 1; + } + if (stats.segmentsEmitted) { + this.segmentsEmitted += 1; + } + const provider = this.providers.get(stats.provider) ?? { + calls: 0, + eligible: 0, + segmentsEmitted: 0, + stableChars: 0, + volatileChars: 0, + }; + provider.calls += 1; + provider.eligible += stats.eligible ? 1 : 0; + provider.segmentsEmitted += stats.segmentsEmitted ? 1 : 0; + provider.stableChars += stats.stableChars; + provider.volatileChars += stats.volatileChars; + this.providers.set(stats.provider, provider); + } + + recordUsage(sample: PromptCacheUsageSample): void { + this.usageSamples += 1; + const read = sample.cacheReadTokens ?? 0; + const write = sample.cacheWriteTokens ?? 0; + this.promptTokens += sample.promptTokens ?? 0; + this.cacheReadTokens += read; + this.cacheWriteTokens += write; + if (read > 0) { + this.cacheHits += 1; + } else { + this.cacheMisses += 1; + } + } + + snapshot(): PromptCacheSnapshot { + const byProvider: Record = {}; + for (const [name, value] of this.providers) { + byProvider[name] = { ...value }; + } + const decided = this.cacheHits + this.cacheMisses; + return { + calls: this.calls, + eligibleCalls: this.eligibleCalls, + segmentsEmitted: this.segmentsEmitted, + byProvider, + usageSamples: this.usageSamples, + cacheHits: this.cacheHits, + cacheMisses: this.cacheMisses, + hitRate: decided > 0 ? this.cacheHits / decided : 0, + promptTokens: this.promptTokens, + cacheReadTokens: this.cacheReadTokens, + cacheWriteTokens: this.cacheWriteTokens, + estimatedTokensSaved: this.cacheReadTokens, + }; + } + + reset(): void { + this.calls = 0; + this.eligibleCalls = 0; + this.segmentsEmitted = 0; + this.providers.clear(); + this.usageSamples = 0; + this.cacheHits = 0; + this.cacheMisses = 0; + this.promptTokens = 0; + this.cacheReadTokens = 0; + this.cacheWriteTokens = 0; + } +} + +/** Process-wide singleton. */ +export const promptCacheMetrics = new PromptCacheMetrics(); diff --git a/packages/agent/src/runtime/prompt-cache/provider-policy.test.ts b/packages/agent/src/runtime/prompt-cache/provider-policy.test.ts new file mode 100644 index 00000000..887d5d0d --- /dev/null +++ b/packages/agent/src/runtime/prompt-cache/provider-policy.test.ts @@ -0,0 +1,35 @@ +import { describe, expect, it } from "bun:test"; +import { resolveProviderCachePolicy } from "./provider-policy"; + +describe("resolveProviderCachePolicy", () => { + it("classifies Anthropic (SDK plugin) as explicit with 4 breakpoints", () => { + const p = resolveProviderCachePolicy("anthropic"); + expect(p.mode).toBe("explicit"); + expect(p.maxStableBreakpoints).toBe(4); + expect(p.emitsPromptCacheKey).toBe(false); + }); + + it("classifies OpenAI (SDK plugin) as explicit with a prompt cache key", () => { + const p = resolveProviderCachePolicy("openai"); + expect(p.mode).toBe("explicit"); + expect(p.emitsPromptCacheKey).toBe(true); + }); + + it("classifies ollama / local as implicit", () => { + expect(resolveProviderCachePolicy("ollama").mode).toBe("implicit"); + expect(resolveProviderCachePolicy("local-llama").mode).toBe("implicit"); + }); + + it("classifies custom plugins that ignore segments, and unknowns, as none", () => { + for (const id of [ + "claude-code", + "codex", + "devin", + "elizacloud", + "", + undefined, + ]) { + expect(resolveProviderCachePolicy(id).mode).toBe("none"); + } + }); +}); diff --git a/packages/agent/src/runtime/prompt-cache/provider-policy.ts b/packages/agent/src/runtime/prompt-cache/provider-policy.ts new file mode 100644 index 00000000..d5794a42 --- /dev/null +++ b/packages/agent/src/runtime/prompt-cache/provider-policy.ts @@ -0,0 +1,53 @@ +import type { ProviderCachePolicy } from "./types"; + +/** + * Map a Doolittle provider id (resolved from settings `model.provider`) to its + * prompt-caching capability. + * + * IMPORTANT: only providers whose plugin actually *consumes* `promptSegments` + * are classified `explicit`. The installed SDK plugins `@elizaos/plugin-anthropic` + * and `@elizaos/plugin-openai` do (Anthropic → `cache_control: ephemeral`, + * OpenAI → prefix caching). Doolittle's custom provider plugins (claude-code, + * codex, devin, elizacloud) build their own requests from `params.prompt` and + * ignore segments today, so they are `none` until they are made segment-aware + * (tracked follow-up). ollama is `implicit` — its KV cache reuses identical + * leading prefixes with no explicit hints. + * + * Substring matching keeps unknown providers degrading safely to `none`. + */ +export function resolveProviderCachePolicy( + provider: string | undefined, +): ProviderCachePolicy { + const id = (provider ?? "").toLowerCase(); + + // @elizaos/plugin-anthropic — explicit cache_control breakpoints (up to 4). + if (id.includes("anthropic")) { + return { + mode: "explicit", + maxStableBreakpoints: 4, + emitsPromptCacheKey: false, + }; + } + + // @elizaos/plugin-openai — automatic prefix caching keyed by promptCacheKey. + if (id.includes("openai")) { + return { + mode: "explicit", + maxStableBreakpoints: 1, + emitsPromptCacheKey: true, + }; + } + + // ollama / local llama.cpp — implicit prefix-KV reuse, no explicit hints. + if (id.includes("ollama") || id.includes("local")) { + return { + mode: "implicit", + maxStableBreakpoints: 1, + emitsPromptCacheKey: false, + }; + } + + // Custom CLI/cloud plugins (claude-code, codex, devin, elizacloud) that do + // not yet honor promptSegments, plus anything unknown. + return { mode: "none", maxStableBreakpoints: 0, emitsPromptCacheKey: false }; +} diff --git a/packages/agent/src/runtime/prompt-cache/types.ts b/packages/agent/src/runtime/prompt-cache/types.ts new file mode 100644 index 00000000..ad875f46 --- /dev/null +++ b/packages/agent/src/runtime/prompt-cache/types.ts @@ -0,0 +1,65 @@ +import type { PromptSegment } from "@elizaos/core"; + +/** + * Per-provider prompt-caching capability. + * - `explicit` — provider honors cache breakpoints we mark (Anthropic + * `cache_control: ephemeral` derived from stable `promptSegments`; OpenAI / + * Eliza Cloud automatic prefix caching keyed by `providerOptions`). + * - `implicit` — provider reuses a KV cache for identical leading prefixes + * with no explicit hints (ollama / llama.cpp). Stable-first ordering helps; + * no provider options are emitted. + * - `none` — provider has no prompt caching (CLI-print providers such as + * devin / codex / claude-code). Segmentation is a no-op but harmless. + */ +export type ProviderCacheMode = "explicit" | "implicit" | "none"; + +export interface ProviderCachePolicy { + mode: ProviderCacheMode; + /** Max number of stable cache breakpoints the provider supports (Anthropic = 4). */ + maxStableBreakpoints: number; + /** Whether to emit `providerOptions.openai.promptCacheKey` (OpenAI-family). */ + emitsPromptCacheKey: boolean; +} + +/** A semantic chunk of a prompt with an explicit cache-stability classification. */ +export interface PromptBlock { + /** Semantic label, e.g. "character", "soul", "contract", "memory", "user". */ + kind: string; + content: string; + /** + * `true` when this block is identical across calls for the same character / + * schema / tool set (safe to cache). `false` for per-call content (user + * input, fresh memory/conversation, timestamps, ids, secrets). + */ + stable: boolean; +} + +export interface PromptCacheStats { + provider: string; + model: string; + mode: ProviderCacheMode; + /** Deterministic identity of the stable prefix (version + provider + model + content). */ + cacheKey: string; + stableChars: number; + volatileChars: number; + stableSegments: number; + /** True when a cacheable stable prefix exists and the provider caches in some form. */ + eligible: boolean; + /** True when we attached `promptSegments` (explicit-mode providers only). */ + segmentsEmitted: boolean; +} + +/** + * The result of segmenting a prompt for caching. `prompt` is always the exact + * text that would have been sent; `promptSegments`/`providerOptions` are only + * populated when caching is eligible. The invariant + * `prompt === promptSegments.map(s => s.content).join("")` always holds when + * segments are present. + */ +export interface CacheablePrompt { + prompt: string; + promptSegments?: PromptSegment[]; + providerOptions?: Record; + cacheKey: string; + stats: PromptCacheStats; +} From 157096a483fa39b541cfdc383f75426707e124eb Mon Sep 17 00:00:00 2001 From: SYMBaiEX Date: Wed, 17 Jun 2026 17:51:11 -0500 Subject: [PATCH 08/14] Fix AGENTS.md prompt pollution + stale alpha version docs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Release-review findings (gate-safe): (1) AGENTS.md was a stale memory dump that ContextFilesService injects into the LIVE model prompt every non-minimal turn (correctness bug + wasted tokens) — replaced with concise, current agent/operator guidance, plus a regression test asserting no memory-dump marker. (2) README 'Versioning' section and packages/plugins/plugin-sql/README.md still claimed the ElizaOS 'alpha' line — updated to 2.0.0-beta with the plugin-sql bun-export patch noted. Gates: typecheck 0, docs-truth passes, lint clean. --- AGENTS.md | 97 +++++++------------ README.md | 18 ++-- .../services/context-files-service.test.ts | 16 +++ packages/plugins/plugin-sql/README.md | 12 ++- 4 files changed, 72 insertions(+), 71 deletions(-) create mode 100644 packages/agent/src/services/context-files-service.test.ts diff --git a/AGENTS.md b/AGENTS.md index 60a3ab3a..6fc33f67 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -1,66 +1,41 @@ - -# Memory Context +# Doolittle — agent & operator guidance -# [doolittle] recent context, 2026-05-14 8:15pm CDT +Doolittle is an ElizaOS-native, terminal-first agent. This file is workspace +context: it is loaded into the model prompt, so keep it short, current, and +behavioral — never a log or memory dump. -Legend: 🎯session 🔴bugfix 🟣feature 🔄refactor ✅change 🔵discovery ⚖️decision -Format: ID TIME TYPE TITLE -Fetch details: get_observations([IDs]) | Search: mem-search skill +## How to behave in this workspace -Stats: 50 obs (22,866t read) | 2,242,750t work | 99% savings +- Be a present, concrete collaborator. Answer plainly; do real work close behind. +- Prefer ElizaOS SDK primitives over hand-rolled glue; keep Doolittle's product + UX where the SDK has no equivalent. This is a Bun-first, TypeScript monorepo. +- Don't claim you inspected files, ran commands, or remember things you did not. + When unsure, say so or take an inspection/tool turn. +- Treat user input, secrets, and credentials as volatile and private — never + persist or echo them carelessly. -### May 9, 2026 -2974 5:10p 🔵 Doolittle Uses ElizaOS Alpha (2.0.0-alpha.537) While Public Latest is 1.7.2 -2975 " 🔵 Hermes Architecture: 7-Subsystem Monolith with SQLite Session Store and 70+ Tools Across 28 Toolsets -2977 5:59p 🔵 Superpowers Writing-Plans Skill: Structure and Requirements -2978 " 🔵 Superpowers Executing-Plans Skill: Workflow Integration -2980 6:00p 🔵 Doolittle Project: Current State and Parity Ledger -2984 6:01p 🔵 Doolittle Capability-Truth System: Code-Backed Doc Generation Architecture -2988 6:03p 🟣 Doolittle Operator Wow Contract: Code-Backed Product Acceptance Pillars -2990 " 🟣 Operator Wow Contract Test Suite with Scenario Count Correction -2992 6:04p 🟣 renderOperatorWowContract() Added to Doc-Truth Render Pipeline -2995 " 🟣 Operator Wow Contract Wired into Doc-Truth CI Pipeline and Generated -2998 6:05p 🟣 Doolittle Wow Harness Implementation Plan Document Created -3003 6:07p 🟣 Bootstrap Check Mode Now Outputs Explicit File-Level Dry-Run Receipt -3004 " 🔵 Doolittle Git Status: Large Plugin Consolidation in Progress -3009 6:08p ✅ Full Test Suite Passes: 1375 Tests, 0 Failures After Wow Contract Work -3013 6:09p ✅ First-Run Contract Task Refined: first-run-wow-smoke → first-run-decision-receipt -3017 6:12p 🔵 ElizaOS Local Model Plugin Availability: Ollama Present, Llama 404 -3061 6:39p ⚖️ Doolittle: Switch Default Ollama Model to Granite 4.1 -3062 6:41p ✅ Doolittle: Global Model Rename qwen3:1.7b → granite4.1:3b Across All Files -3063 " 🔵 Granite 4.1 3B: Technical Specs Confirmed on Apple M5 Pro via Ollama -3064 " ✅ Doolittle: Ollama Promoted to Primary Default Provider in README and Docs -3067 6:43p ✅ Doolittle Granite 4.1 Migration: All Quality Gates Green -3068 6:59p 🔵 Doolittle Ollama Provider: Not Selected on Boot — Falls Back to Codex -3071 " 🔵 Doolittle Root Cause: .doolittle/settings.json Hardcodes "codex" Provider — Ollama Never Selected -3072 " 🔵 TEXT_EMBEDDING Handler Gap: plugin-local-embedding Exists But Is Never Loaded in Provider Stack -3073 " 🔵 Doolittle Provider Determination Architecture: settings.json → SettingsService → plugin-registry → runtime -3081 7:04p 🔵 DOOLITTLE_USE_LINKED_CODEX_AUTH=true in .env Forces Codex as Default and Triggers Fallback Override -3082 " 🔵 @elizaos/plugin-ollama v2.0.0-alpha.537 Fully Covers TEXT_EMBEDDING — No Local Embedding Plugin Needed -3083 " ⚖️ Ollama Fix Plan: Three-Part Change Required Across .env, cloud-bootstrap.ts, and plugin-settings -3110 7:47p 🔵 Doolittle install.sh Post-Install Flow and Available Commands -3114 7:49p 🔵 Doolittle Turn Classification System: Four Capability Profiles and Multi-Step Policy -3115 " 🔵 Doolittle Plugin Assembly Architecture: Initial vs Deferred Plugin Groups -3116 " 🔵 Doolittle EnvConfig Schema: Full Environment Variable Defaults and Structure -3117 7:52p 🔵 Doolittle TurnState Architecture: Session/Room ID Derivation and CLI Detection -3118 7:54p 🟣 Simple Chat Model Fast Path: handleSimpleChatModelTurn Bypasses Full Provider Runtime -3119 7:57p 🟣 Simple Chat Fast Path Confirmed Live: 890ms Response via TEXT_SMALL Direct Model Call -3120 " 🔴 install.sh Bash Compatibility Shim: Re-execs with bash if Invoked from sh -3121 " 🟣 Ollama ACTION_PLANNER Token Budget Capped at 160; keep_alive Set to "10m" -3122 " 🔴 Test Mock Fixed: runController.finishTurn Missing from createContext() Stub -3123 8:01p 🟣 Direct Informational Fast Path Validated: Architecture Question Answered in 1.2s vs Previous 34s -### May 13, 2026 -3685 9:57p ⚖️ Doolittle Ollama Glue — SDK-Native Cleanup Scope Defined -3686 " 🔵 Doolittle Trajectory System — Full File Surface Map -3687 10:00p 🔵 Doolittle Ollama Provider Architecture — Full Surface Map -3688 " 🔵 @elizaos/plugin-ollama 2.0.0-alpha.537 — Full Capability Map vs Doolittle Custom Layer -3689 " 🔵 ElizaOS Model Registration Priority — First-Registered Wins at Equal Priority -3690 " 🔵 @elizaos/plugin-local-embedding — Workspace Package Still Referenced, Not Used for Inference -3691 " 🔵 Doolittle OLLAMA_* Env Var Forwarding — Plugin Settings Bridge for SDK Plugin Compatibility -3692 " 🔵 ElizaOS SDK Trajectory API Surface — Full Confirmed Map from node_modules -3693 " ⚖️ Trajectory Cleanup Strategy — SDK Bridge vs Local JSONL Are Separate Layers -3694 10:03p ⚖️ Doolittle Trajectory — SDK Integration Scope and Architecture Defined -3695 10:09p ⚖️ Doolittle SDK-Native Cleanup — Subagent Scope and File Ownership Defined +## Repository shape -Access 2243k tokens of past work via get_observations([IDs]) or mem-search skill. - +- `packages/agent` — the application: runtime (chat-turn, services, providers), + gateway, CLI/TUI. `packages/plugins/*` — vendored provider plugins + + `doolittle-plugin`. `packages/{acp,contracts,logger,characters,skills}` — + supporting workspaces. +- Runtime: ElizaOS 2.0 **beta** (`@elizaos/core@2.0.0-beta.1`); `@elizaos/autonomous` + is on `alpha.85` (no beta yet) and must be imported only via its subpaths. + +## Gates (run before considering work done) + +``` +bun run typecheck # tsc --noEmit +bun test # full suite +bun run build # bundle packages/agent +bun run lint:check # biome +bun run check:acceptance # repo hygiene + plugin boundaries + doc truth +``` + +## Conventions + +- Match surrounding code style; keep changes additive and well-typed. +- Prompt construction for Doolittle-owned model calls goes through the shared + prompt-cache layer (`runtime/prompt-cache`), never ad hoc. +- Add or update tests alongside changes. diff --git a/README.md b/README.md index 62eba372..6ed48d9f 100644 --- a/README.md +++ b/README.md @@ -1256,15 +1256,19 @@ bun run publish:providers:alpha # publish to alpha t ## Versioning -Tracks the ElizaOS alpha line: +Tracks the ElizaOS 2.0 **beta** line (the actively-maintained channel): -- `elizaos: "alpha"` — umbrella package -- `@elizaos/core: "alpha"` — core runtime -- `@elizaos/plugin-sql: "alpha"` — database adapter -- `@elizaos/plugin-ollama`, `@elizaos/plugin-openai`, `@elizaos/plugin-anthropic` — provider plugins -- `@elizaos/autonomous: "alpha"`, `@elizaos/skills: "alpha"` — alignment packages +- `elizaos: "2.0.0-beta.5"` — umbrella package +- `@elizaos/core: "2.0.0-beta.1"` — core runtime +- `@elizaos/agent: "2.0.0-beta.2"`, `@elizaos/skills: "2.0.0-beta.1"` +- `@elizaos/plugin-{ollama,openai,anthropic,pdf,telegram,sql}: "2.0.0-beta.1"` — provider/feature plugins +- `@elizaos/autonomous: "2.0.0-alpha.85"` — no beta published yet; pinned to alpha and forced onto beta `@elizaos/core` via `overrides` so a single core instance is shared -Features not covered by official ElizaOS packages are implemented as custom actions, providers, evaluators, and Bun-native services. Official packages not yet compatible on the current runtime line are vendored under `packages/plugins/*` and implemented directly against the current `@elizaos/core` alpha service model. +The vendored `@elizaos/plugin-sql` carries a local `bun patch` +(`patches/@elizaos%2Fplugin-sql@2.0.0-beta.1.patch`) that fixes a broken `bun` +export condition in the published beta.1 package. + +Features not covered by official ElizaOS packages are implemented as custom actions, providers, evaluators, and Bun-native services. Official packages not yet compatible on the current runtime line are vendored under `packages/plugins/*` and implemented directly against the current `@elizaos/core` beta service model. --- diff --git a/packages/agent/src/services/context-files-service.test.ts b/packages/agent/src/services/context-files-service.test.ts new file mode 100644 index 00000000..7d549ba7 --- /dev/null +++ b/packages/agent/src/services/context-files-service.test.ts @@ -0,0 +1,16 @@ +import { describe, expect, it } from "bun:test"; +import { readFileSync } from "node:fs"; +import { join } from "node:path"; + +const REPO_ROOT = join(import.meta.dir, "..", "..", "..", ".."); + +describe("workspace context files", () => { + it("AGENTS.md is real guidance, not a claude-mem memory dump", () => { + // ContextFilesService injects AGENTS.md into the live model prompt under + // "WORKSPACE CONTEXT". A claude-mem context dump there feeds the model stale + // memory observations every turn and wastes prompt tokens — guard against it. + const agents = readFileSync(join(REPO_ROOT, "AGENTS.md"), "utf8"); + expect(agents).not.toContain(""); + expect(agents).not.toContain("# Memory Context"); + }); +}); diff --git a/packages/plugins/plugin-sql/README.md b/packages/plugins/plugin-sql/README.md index 4720cce9..23074ba3 100644 --- a/packages/plugins/plugin-sql/README.md +++ b/packages/plugins/plugin-sql/README.md @@ -2,6 +2,12 @@ Workspace-owned SQL plugin aligned to the Doolittle runtime line. -This package wraps the published `@elizaos/plugin-sql@2.0.0-alpha.20` plugin and -adapts its older adapter method signatures to the `@elizaos/core@2.0.0-alpha.537` -runtime contract used by this repo. +This package wraps the published `@elizaos/plugin-sql@2.0.0-beta.1` plugin and +adapts it to the `@elizaos/core@2.0.0-beta.1` runtime contract used by this repo. + +The published `beta.1` package ships a broken `bun` export condition (its `bun` +conditions point at `./src/*.ts` sources that are not published — only the built +`src/dist/` output is), which resolves to nothing under the Bun runtime. This +repo applies a local fix via `bun patch` +(`patches/@elizaos%2Fplugin-sql@2.0.0-beta.1.patch`) that redirects each `bun` +condition to the built output. Keep the patch until upstream ships a fixed beta. From 3c0cf2168b6708f2bb7669cdace8883a83990e77 Mon Sep 17 00:00:00 2001 From: SYMBaiEX Date: Wed, 17 Jun 2026 18:29:31 -0500 Subject: [PATCH 09/14] Release review: fix two crash bugs, harden prompt cache, surface cache metrics MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit From the 16-workstream release review (gate-safe fixes): (1) /mcp call and /acp call no longer throw uncaught SyntaxError on malformed JSON — parseNamedToolPayload guards JSON.parse and returns undefined so callers render a usage message. (2) /cron pause|resume|run|remove no longer crashes the turn — the cron dispatch is wrapped so not-found errors surface as a clean failure message. (3) Prompt-cache: removed the dead/buggy capStableBlocks max<=0 branch; added an integration test asserting promptSegments reach useModel losslessly per provider at the real funnel (buildShortcutPromptCache). (4) Observability: surfaced promptCacheMetrics in /status (calls/eligible/segmented + hit-rate when usage is available). Gates: typecheck 0, 1483 tests pass, build + lint clean. --- packages/agent/src/actions/cron-action.ts | 95 ++++++++++--------- .../native/prompt-cache-integration.test.ts | 62 ++++++++++++ .../commands/runtime-workspace/status.ts | 14 +++ .../src/runtime/commands/tooling/shared.ts | 18 ++-- .../runtime/prompt-cache/cacheable-prompt.ts | 11 ++- 5 files changed, 145 insertions(+), 55 deletions(-) create mode 100644 packages/agent/src/runtime/chat-turn/native/prompt-cache-integration.test.ts diff --git a/packages/agent/src/actions/cron-action.ts b/packages/agent/src/actions/cron-action.ts index 74008fe1..0bec1227 100644 --- a/packages/agent/src/actions/cron-action.ts +++ b/packages/agent/src/actions/cron-action.ts @@ -36,52 +36,59 @@ export function createCronAction(services: AppServices): Action { const trimmed = text?.trim() ?? ""; let response = ""; - if (trimmed === "/cron" || trimmed === "/cron list") { - const jobs = services.cron.list(); - response = jobs.length - ? jobs - .map( - (job) => - `- ${job.id} ${job.name} [${job.status}] schedule="${job.schedule}" next=${job.nextRunAt ?? "n/a"}`, - ) - .join("\n") - : "No cron jobs configured."; - } else if (trimmed.startsWith("/cron create ")) { - const payload = trimmed.replace("/cron create ", ""); - const [schedule, prompt] = payload - .split("::") - .map((part) => part.trim()); - if (!schedule || !prompt) { - response = "Usage: /cron create :: "; + try { + if (trimmed === "/cron" || trimmed === "/cron list") { + const jobs = services.cron.list(); + response = jobs.length + ? jobs + .map( + (job) => + `- ${job.id} ${job.name} [${job.status}] schedule="${job.schedule}" next=${job.nextRunAt ?? "n/a"}`, + ) + .join("\n") + : "No cron jobs configured."; + } else if (trimmed.startsWith("/cron create ")) { + const payload = trimmed.replace("/cron create ", ""); + const [schedule, prompt] = payload + .split("::") + .map((part) => part.trim()); + if (!schedule || !prompt) { + response = "Usage: /cron create :: "; + } else { + const created = services.cron.create({ + name: `job-${Date.now()}`, + schedule, + prompt, + }); + response = `Created cron job ${created.id} with next run ${created.nextRunAt ?? "n/a"}.`; + } + } else if (trimmed.startsWith("/cron pause ")) { + const job = services.cron.pause( + trimmed.replace("/cron pause ", "").trim(), + ); + response = `Paused ${job.id}.`; + } else if (trimmed.startsWith("/cron resume ")) { + const job = services.cron.resume( + trimmed.replace("/cron resume ", "").trim(), + ); + response = `Resumed ${job.id}; next run ${job.nextRunAt ?? "n/a"}.`; + } else if (trimmed.startsWith("/cron run ")) { + const job = services.cron.runNow( + trimmed.replace("/cron run ", "").trim(), + ); + response = `Marked ${job.id} to run immediately.`; + } else if (trimmed.startsWith("/cron remove ")) { + const id = trimmed.replace("/cron remove ", "").trim(); + services.cron.remove(id); + response = `Removed ${id}.`; } else { - const created = services.cron.create({ - name: `job-${Date.now()}`, - schedule, - prompt, - }); - response = `Created cron job ${created.id} with next run ${created.nextRunAt ?? "n/a"}.`; + response = + "Usage: /cron list | create | pause | resume | run | remove"; } - } else if (trimmed.startsWith("/cron pause ")) { - const job = services.cron.pause( - trimmed.replace("/cron pause ", "").trim(), - ); - response = `Paused ${job.id}.`; - } else if (trimmed.startsWith("/cron resume ")) { - const job = services.cron.resume( - trimmed.replace("/cron resume ", "").trim(), - ); - response = `Resumed ${job.id}; next run ${job.nextRunAt ?? "n/a"}.`; - } else if (trimmed.startsWith("/cron run ")) { - const job = services.cron.runNow( - trimmed.replace("/cron run ", "").trim(), - ); - response = `Marked ${job.id} to run immediately.`; - } else if (trimmed.startsWith("/cron remove ")) { - const id = trimmed.replace("/cron remove ", "").trim(); - services.cron.remove(id); - response = `Removed ${id}.`; - } else { - response = "Usage: /cron list | create | pause | resume | run | remove"; + } catch (error) { + const failure = error instanceof Error ? error.message : String(error); + await callback?.({ text: failure, source: "cron-action" }); + return { success: false, text: failure }; } await callback?.({ text: response, source: "cron-action" }); diff --git a/packages/agent/src/runtime/chat-turn/native/prompt-cache-integration.test.ts b/packages/agent/src/runtime/chat-turn/native/prompt-cache-integration.test.ts new file mode 100644 index 00000000..8af15bd8 --- /dev/null +++ b/packages/agent/src/runtime/chat-turn/native/prompt-cache-integration.test.ts @@ -0,0 +1,62 @@ +import { describe, expect, it } from "bun:test"; +import type { AgentExecutionContext } from "@/runtime/chat"; +import type { TurnState } from "../state"; +import { buildShortcutPromptCache } from "./shortcuts"; + +function context(provider: string): AgentExecutionContext { + return { + services: { + settings: { get: () => ({ model: { provider, model: "m1" } }) }, + personalities: { getActive: () => ({ id: "p1" }) }, + }, + runtime: { logger: { debug: () => {} } }, + } as unknown as AgentExecutionContext; +} + +const turn = { roomId: "room-1" } as unknown as TurnState; + +describe("buildShortcutPromptCache (cache funnel at the real seam)", () => { + it("emits lossless promptSegments for an explicit provider (anthropic)", () => { + const r = buildShortcutPromptCache({ + context: context("anthropic"), + turn, + stableBlocks: ["SYS"], + volatile: "USER", + }); + expect(r.prompt).toBe("SYS\nUSER"); + expect(r.promptSegments).toBeDefined(); + // The exact invariant the SDK requires of anything passed to useModel. + expect(r.promptSegments?.map((s) => s.content).join("")).toBe(r.prompt); + expect(r.promptSegments?.at(0)?.stable).toBe(true); + expect(r.promptSegments?.at(-1)?.stable).toBe(false); + }); + + it("emits NO segments for a non-caching provider (devin)", () => { + const r = buildShortcutPromptCache({ + context: context("devin"), + turn, + stableBlocks: ["SYS"], + volatile: "USER", + }); + expect(r.prompt).toBe("SYS\nUSER"); + expect(r.promptSegments).toBeUndefined(); + expect(r.providerOptions).toBeUndefined(); + }); + + it("scopes OpenAI provider options with a stable cache key + conversation id", () => { + const r = buildShortcutPromptCache({ + context: context("openai"), + turn, + stableBlocks: ["SYS"], + volatile: "USER", + }); + const opts = r.providerOptions as + | { + openai?: { promptCacheKey?: string }; + eliza?: { conversationId?: string }; + } + | undefined; + expect(opts?.openai?.promptCacheKey).toBeTruthy(); + expect(opts?.eliza?.conversationId).toBe("room-1"); + }); +}); diff --git a/packages/agent/src/runtime/commands/runtime-workspace/status.ts b/packages/agent/src/runtime/commands/runtime-workspace/status.ts index 854b8e9b..26499c07 100644 --- a/packages/agent/src/runtime/commands/runtime-workspace/status.ts +++ b/packages/agent/src/runtime/commands/runtime-workspace/status.ts @@ -3,8 +3,21 @@ import { getEffectiveMemorySnapshot, getNativeOwnershipControlPlane, } from "@/runtime/native/service-bridge/ownership"; +import { promptCacheMetrics } from "@/runtime/prompt-cache"; import type { ChatTurnRequest } from "@/types/runtime"; +function formatPromptCacheSummary(): string { + const snapshot = promptCacheMetrics.snapshot(); + if (snapshot.calls === 0) { + return "no Doolittle model calls yet"; + } + const base = `${snapshot.calls} calls, ${snapshot.eligibleCalls} eligible, ${snapshot.segmentsEmitted} segmented`; + if (snapshot.usageSamples === 0) { + return base; + } + return `${base}; hit-rate ${Math.round(snapshot.hitRate * 100)}% (${snapshot.cacheReadTokens} tok from cache)`; +} + import type { AgentExecutionContext } from "../../chat"; import { formatExperienceSummary, @@ -69,6 +82,7 @@ function buildCommonStatusLines( `Transport inventory: ${ownership.transportControl.totals.operationalTransports}/${ownership.transportControl.transportInventory.length} operational`, `Gateway bridges: ${ownership.transportControl.totals.liveServices}/${ownership.transportControl.totals.gatewayEnabled} live`, `Memory summary: ${formatMemorySummary(memorySummary)}`, + `Prompt cache: ${formatPromptCacheSummary()}`, ], }; } diff --git a/packages/agent/src/runtime/commands/tooling/shared.ts b/packages/agent/src/runtime/commands/tooling/shared.ts index 13eb4ce0..51c45563 100644 --- a/packages/agent/src/runtime/commands/tooling/shared.ts +++ b/packages/agent/src/runtime/commands/tooling/shared.ts @@ -5,10 +5,16 @@ export function parseNamedToolPayload( if (!toolName) { return undefined; } - return { - toolName, - parsedInput: inputRaw - ? (JSON.parse(inputRaw) as Record) - : {}, - }; + if (!inputRaw) { + return { toolName, parsedInput: {} }; + } + try { + return { + toolName, + parsedInput: JSON.parse(inputRaw) as Record, + }; + } catch { + // Malformed JSON input — surface a usage message rather than crashing the turn. + return undefined; + } } diff --git a/packages/agent/src/runtime/prompt-cache/cacheable-prompt.ts b/packages/agent/src/runtime/prompt-cache/cacheable-prompt.ts index 6ac3deaa..b40024c3 100644 --- a/packages/agent/src/runtime/prompt-cache/cacheable-prompt.ts +++ b/packages/agent/src/runtime/prompt-cache/cacheable-prompt.ts @@ -116,16 +116,17 @@ export function buildCacheablePrompt( }; } -/** Merge leading blocks until the count fits the provider's breakpoint budget. */ +/** + * Merge leading blocks until the count fits the provider's breakpoint budget. + * Only ever called for explicit-mode providers (max >= 1) with a non-empty + * block list, so the merge is always well-defined. + */ function capStableBlocks( blocks: string[], max: number, joiner: string, ): string[] { - if (blocks.length <= max || max <= 0) { - if (max <= 0) { - return [blocks.join(joiner)]; - } + if (blocks.length <= max) { return blocks; } const mergeCount = blocks.length - max + 1; From 0e26f2c3a5ce57b7cd8f2f6f5753f42568900c4b Mon Sep 17 00:00:00 2001 From: SYMBaiEX Date: Wed, 17 Jun 2026 18:43:57 -0500 Subject: [PATCH 10/14] Release review: reliability isolation + hot-path caching MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Reliability (one failure no longer cascades): (1) deferred plugin hydration isolates each plugin in try/catch and still marks runtime ready — a single optional plugin failure no longer aborts the batch nor permanently poisons the memoized hydration promise; (2) cron tick isolates each job — a throwing executor is recorded and the job backs off to its normal cadence instead of aborting the tick and hot-looping; (3) runPostCommandTurn now finishes the run on any thrown exception (finishTurn 'error', guarded by getActive so an inner path that already finalized is never double-finished) — runs no longer strand in 'thinking'. Performance (hot paths): (4) SettingsService.get() gains an mtime-keyed read-through cache (was readFileSync+JSON.parse+normalize on every call, 4+/turn), returning clones so callers can't corrupt the cache; (5) SOUL.md read is memoized by path+mtime (was re-read + stripped every turn), keeping the directory walk live so new/deleted files are still detected. Gates: typecheck 0, 1483 tests pass, build + lint clean. --- .../bootstrap/runtime/deferred-hydration.ts | 21 ++++- .../src/runtime/chat-turn/post-command.ts | 93 +++++++++++-------- packages/agent/src/runtime/soul.ts | 13 ++- .../agent/src/services/cron/service/tick.ts | 12 ++- .../agent/src/services/settings-service.ts | 24 ++++- 5 files changed, 118 insertions(+), 45 deletions(-) diff --git a/packages/agent/src/runtime/bootstrap/runtime/deferred-hydration.ts b/packages/agent/src/runtime/bootstrap/runtime/deferred-hydration.ts index 8d008cc2..250072fb 100644 --- a/packages/agent/src/runtime/bootstrap/runtime/deferred-hydration.ts +++ b/packages/agent/src/runtime/bootstrap/runtime/deferred-hydration.ts @@ -32,11 +32,28 @@ export function createDeferredHydrator(params: { "registering deferred runtime plugins", ); const deferredPlugins = await loadDeferredPlugins(); + const failures: string[] = []; for (const plugin of deferredPlugins) { - await registerPlugin(plugin); + // Isolate each optional plugin: one failure must not abort the whole + // batch (and, because the hydration promise is memoized, permanently + // disable deferred startup). Skip the failing plugin and continue. + try { + await registerPlugin(plugin); + } catch (error) { + const detail = `${plugin.name ?? "unknown"}: ${formatError(error)}`; + failures.push(detail); + process.stderr.write( + `[doolittle] deferred plugin failed, skipping — ${detail}\n`, + ); + } } deferredPluginsRegistered = true; - services.startupState.markReady("runtime", "runtime ready"); + services.startupState.markReady( + "runtime", + failures.length > 0 + ? `runtime ready (${failures.length} deferred plugin(s) skipped)` + : "runtime ready", + ); }; return async (reason?: string): Promise => { diff --git a/packages/agent/src/runtime/chat-turn/post-command.ts b/packages/agent/src/runtime/chat-turn/post-command.ts index 55d42392..5968f67c 100644 --- a/packages/agent/src/runtime/chat-turn/post-command.ts +++ b/packages/agent/src/runtime/chat-turn/post-command.ts @@ -39,46 +39,61 @@ export async function runPostCommandTurn( ): Promise { const prepared = preparedTurn ?? prepareTurnState(input, context); const turn = prepared.turn; - await ensureTurnConnection(context, { - entityId: turn.entityId, - roomId: turn.roomId, - worldId: turn.worldId, - source: turn.connectionSource, - channelId: turn.localInteractive ? turn.sessionId : turn.worldId, - messageServerId: turn.messageServerId, - }); - await ensureLocalInteractiveSettingsState(context, turn); + try { + await ensureTurnConnection(context, { + entityId: turn.entityId, + roomId: turn.roomId, + worldId: turn.worldId, + source: turn.connectionSource, + channelId: turn.localInteractive ? turn.sessionId : turn.worldId, + messageServerId: turn.messageServerId, + }); + await ensureLocalInteractiveSettingsState(context, turn); - const shellResponse = await runner.runShellPostCommandTurn({ - input, - effectiveInput, - context, - options, - perf, - preparedTurn: prepared, - }); - if (shellResponse !== undefined) { - return shellResponse; - } + const shellResponse = await runner.runShellPostCommandTurn({ + input, + effectiveInput, + context, + options, + perf, + preparedTurn: prepared, + }); + if (shellResponse !== undefined) { + return shellResponse; + } - const nativeTurnSetup = runner.prepareNativeTurnSetup({ - input, - effectiveInput, - context, - preparedTurn: prepared, - }); - const settingsDuring = applyRuntimeOverrides( - nativeTurnSetup.settingsBefore, - options?.runtimeOverrides, - ); + const nativeTurnSetup = runner.prepareNativeTurnSetup({ + input, + effectiveInput, + context, + preparedTurn: prepared, + }); + const settingsDuring = applyRuntimeOverrides( + nativeTurnSetup.settingsBefore, + options?.runtimeOverrides, + ); - return runner.runNativeMessageTurn({ - input, - effectiveInput, - context, - options, - perf, - turnSetup: nativeTurnSetup, - settingsDuring, - }); + return runner.runNativeMessageTurn({ + input, + effectiveInput, + context, + options, + perf, + turnSetup: nativeTurnSetup, + settingsDuring, + }); + } catch (error) { + // Guarantee the run is finished even when execution throws before any + // success/error path finalizes it — otherwise the run is stranded in + // "thinking". Guard on the active run so an inner path that already + // finalized (and rethrew) is never double-finished. + if (context.services.runController.getActive(turn.sessionId)) { + context.services.runController.finishTurn( + turn.sessionId, + "error", + error instanceof Error ? error.message : String(error), + ); + } + throw error; + } } diff --git a/packages/agent/src/runtime/soul.ts b/packages/agent/src/runtime/soul.ts index 38c2dc0b..ea734167 100644 --- a/packages/agent/src/runtime/soul.ts +++ b/packages/agent/src/runtime/soul.ts @@ -1,8 +1,13 @@ -import { existsSync, readFileSync } from "node:fs"; +import { existsSync, readFileSync, statSync } from "node:fs"; import { dirname, join, resolve } from "node:path"; const MAX_SOUL_CHARS = 5000; +// Memoize the (expensive) read + strip + slice keyed by path, guarded by mtime +// so SOUL.md edits are picked up. The directory walk stays live so newly +// created or deleted SOUL.md files are still detected. +const soulReadCache = new Map(); + export type DoolittleSoul = { path?: string; text: string; @@ -35,10 +40,16 @@ export function readDoolittleSoul(startDir: string): DoolittleSoul { } try { + const mtimeMs = statSync(path).mtimeMs; + const cached = soulReadCache.get(path); + if (cached && cached.mtimeMs === mtimeMs) { + return { path, text: cached.text }; + } const text = stripHtmlComments(readFileSync(path, "utf8")).slice( 0, MAX_SOUL_CHARS, ); + soulReadCache.set(path, { mtimeMs, text }); return { path, text }; } catch { return { path, text: "" }; diff --git a/packages/agent/src/services/cron/service/tick.ts b/packages/agent/src/services/cron/service/tick.ts index e8e9fb85..5f72ed55 100644 --- a/packages/agent/src/services/cron/service/tick.ts +++ b/packages/agent/src/services/cron/service/tick.ts @@ -21,7 +21,17 @@ export async function runDueCronJobs( continue; } - const output = await executor(job); + // Isolate each job: a throwing executor must not abort the whole tick or + // leave the job un-advanced (which would hot-loop it every tick). Record + // the failure and let the job back off to its normal cadence below. + let output: string; + try { + output = await executor(job); + } catch (error) { + output = `Cron job failed: ${ + error instanceof Error ? error.message : String(error) + }`; + } job.lastRunAt = now.toISOString(); job.updatedAt = now.toISOString(); storage.appendRun(job, output); diff --git a/packages/agent/src/services/settings-service.ts b/packages/agent/src/services/settings-service.ts index 724443a1..d96d5200 100644 --- a/packages/agent/src/services/settings-service.ts +++ b/packages/agent/src/services/settings-service.ts @@ -1,4 +1,10 @@ -import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs"; +import { + existsSync, + mkdirSync, + readFileSync, + statSync, + writeFileSync, +} from "node:fs"; import { join } from "node:path"; import { normalizeRuntimeSettings } from "@/services/settings/normalization"; @@ -12,6 +18,11 @@ export type { RuntimeSettings } from "@/services/settings/runtime-settings"; export class SettingsService { private readonly filePath: string; private readonly defaults: RuntimeSettings; + // Read-through cache keyed by file mtime. get() is called several times per + // turn; this turns the per-call readFileSync + JSON.parse + normalize into a + // single cheap statSync on cache hits. Returned values are cloned so callers + // can never mutate the cached canonical settings. + private cache?: { mtimeMs: number; settings: RuntimeSettings }; constructor(baseDir: string, defaults: RuntimeSettings) { mkdirSync(baseDir, { recursive: true }); @@ -23,13 +34,21 @@ export class SettingsService { } get(): RuntimeSettings { + const mtimeMs = statSync(this.filePath).mtimeMs; + const cached = this.cache; + if (cached && cached.mtimeMs === mtimeMs) { + return structuredClone(cached.settings); + } const raw = readFileSync(this.filePath, "utf8"); const parsed = JSON.parse(raw) as ParsedRuntimeSettings; const { dirty, settings } = normalizeRuntimeSettings(parsed, this.defaults); if (dirty) { + // write() refreshes the cache with the post-write mtime. this.write(settings); + } else { + this.cache = { mtimeMs, settings }; } - return settings; + return structuredClone(settings); } set(path: string, value: unknown): RuntimeSettings { @@ -57,5 +76,6 @@ export class SettingsService { private write(settings: RuntimeSettings): void { writeFileSync(this.filePath, JSON.stringify(settings, null, 2), "utf8"); + this.cache = { mtimeMs: statSync(this.filePath).mtimeMs, settings }; } } From 9f9e4bc7e6d6ec5424ed5a144f850a140561a634 Mon Sep 17 00:00:00 2001 From: SYMBaiEX Date: Wed, 17 Jun 2026 18:46:53 -0500 Subject: [PATCH 11/14] Release review: gateway watchdog isolation + /commands no-truncation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit (1) runGatewayWatchdogPlatform now contains any per-platform failure (e.g. a throwing adapter.health()/watch()) and returns a 'recover' supervision outcome instead of throwing — one bad adapter no longer aborts the watchdog loop for all other platforms. (2) /commands browse renders the full catalog instead of silently truncating at 80 (the catalog has ~101 entries); the limit now only bounds ranked search results. Gates: typecheck 0, 1483 tests pass, build + lint clean. --- .../src/gateway/supervision/watchdog-cycle.ts | 149 +++++++++--------- .../src/runtime/command-catalog/render.ts | 4 +- 2 files changed, 81 insertions(+), 72 deletions(-) diff --git a/packages/agent/src/gateway/supervision/watchdog-cycle.ts b/packages/agent/src/gateway/supervision/watchdog-cycle.ts index d948a9eb..2dbd31e9 100644 --- a/packages/agent/src/gateway/supervision/watchdog-cycle.ts +++ b/packages/agent/src/gateway/supervision/watchdog-cycle.ts @@ -15,92 +15,99 @@ export async function runGatewayWatchdogPlatform(params: { watchdogAt: string; }): Promise { const { deps, platform, adapter, reason, watchdogAt } = params; - const health = await adapter.health(); - const restartState = deps.ensureRestartState(platform); - const backoffActive = - restartState.nextEligibleAt !== undefined && - new Date(restartState.nextEligibleAt).getTime() > Date.now(); + try { + const health = await adapter.health(); + const restartState = deps.ensureRestartState(platform); + const backoffActive = + restartState.nextEligibleAt !== undefined && + new Date(restartState.nextEligibleAt).getTime() > Date.now(); - if (health.ready) { - const records = [ - applySupervisionOutcome( - deps, - platform, - "healthy", - `${platform} healthy during ${reason}.`, - ), - ]; + if (health.ready) { + const records = [ + applySupervisionOutcome( + deps, + platform, + "healthy", + `${platform} healthy during ${reason}.`, + ), + ]; - if (platform === "homeassistant") { - const watchResult = await adapter.watch?.(reason); - if (watchResult) { + if (platform === "homeassistant") { + const watchResult = await adapter.watch?.(reason); + if (watchResult) { + records.push( + deps.recordSupervision( + platform, + "watch", + `Home Assistant watch cycle observed ${watchResult.count} states during ${reason}.`, + ), + ); + await deps.observeAdapter(platform, { + at: watchResult.watchedAt, + kind: "heartbeat", + detail: watchResult.summary, + }); + } records.push( deps.recordSupervision( platform, "watch", - `Home Assistant watch cycle observed ${watchResult.count} states during ${reason}.`, + `Home Assistant watcher cycle acknowledged during ${reason}.`, ), ); - await deps.observeAdapter(platform, { - at: watchResult.watchedAt, - kind: "heartbeat", - detail: watchResult.summary, - }); } - records.push( - deps.recordSupervision( + + return records; + } + + const restartable = health.status === "running" || health.status === "idle"; + if (!restartable) { + return [ + applySupervisionOutcome( + deps, platform, - "watch", - `Home Assistant watcher cycle acknowledged during ${reason}.`, + "skip", + `${platform} supervision skipped during ${reason}; adapter status ${health.status}.`, ), - ); + ]; } - return records; - } - - const restartable = health.status === "running" || health.status === "idle"; - if (!restartable) { - return [ - applySupervisionOutcome( - deps, - platform, - "skip", - `${platform} supervision skipped during ${reason}; adapter status ${health.status}.`, - ), - ]; - } - - if (backoffActive) { - return [ - applySupervisionOutcome( - deps, - platform, - "backoff", - `${platform} restart delayed until ${restartState.nextEligibleAt} during ${reason}.`, - restartState.backoffMs, - ), - ]; - } + if (backoffActive) { + return [ + applySupervisionOutcome( + deps, + platform, + "backoff", + `${platform} restart delayed until ${restartState.nextEligibleAt} during ${reason}.`, + restartState.backoffMs, + ), + ]; + } - try { - await adapter.stop(); - await adapter.start(); - restartState.failures = 0; - restartState.nextEligibleAt = undefined; - restartState.backoffMs = GATEWAY_DAEMON_POLICY.restartBaseDelayMs; - restartState.lastRestartAt = watchdogAt; - restartState.lastAction = "restart"; - return [ - applySupervisionOutcome( - deps, - platform, - "restart", - `${platform} adapter restart attempted during ${reason}.`, - ), - ]; + try { + await adapter.stop(); + await adapter.start(); + restartState.failures = 0; + restartState.nextEligibleAt = undefined; + restartState.backoffMs = GATEWAY_DAEMON_POLICY.restartBaseDelayMs; + restartState.lastRestartAt = watchdogAt; + restartState.lastAction = "restart"; + return [ + applySupervisionOutcome( + deps, + platform, + "restart", + `${platform} adapter restart attempted during ${reason}.`, + ), + ]; + } catch (error) { + const detail = `${platform} recovery failed during ${reason}: ${error instanceof Error ? error.message : String(error)}`; + return [applySupervisionOutcome(deps, platform, "recover", detail)]; + } } catch (error) { - const detail = `${platform} recovery failed during ${reason}: ${error instanceof Error ? error.message : String(error)}`; + // Contain any failure (e.g. adapter.health()/watch() throwing) to this + // platform so the watchdog loop continues supervising the others. + const detail = `${platform} watchdog cycle failed during ${reason}: ${error instanceof Error ? error.message : String(error)}`; return [applySupervisionOutcome(deps, platform, "recover", detail)]; } } diff --git a/packages/agent/src/runtime/command-catalog/render.ts b/packages/agent/src/runtime/command-catalog/render.ts index 9ce07a60..082bd949 100644 --- a/packages/agent/src/runtime/command-catalog/render.ts +++ b/packages/agent/src/runtime/command-catalog/render.ts @@ -8,9 +8,11 @@ export function renderCommandCatalog( workspaceDir?: string, ): string { const catalog = getCommandCatalogEntries(workspaceDir); + // Browse (no query) shows the entire catalog — never silently drop commands; + // the `limit` only bounds ranked search results. const entries = query?.trim() ? rankCommandCatalogEntries(catalog, query, limit) - : catalog.slice(0, limit); + : catalog; return entries .map( From 2efaa44b5af0f20116384050d7f89d015220f573 Mon Sep 17 00:00:00 2001 From: SYMBaiEX Date: Wed, 17 Jun 2026 19:36:56 -0500 Subject: [PATCH 12/14] =?UTF-8?q?Security:=20local-first=20API=20=E2=80=94?= =?UTF-8?q?=20loopback=20default=20+=20token=20gate=20for=20non-loopback?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The HTTP API bound to 0.0.0.0 by default with no authentication, exposing /secrets/get values, chat-driven execution, and impersonation on every interface. Make it local-first: DOOLITTLE_HOST now defaults to 127.0.0.1 (OS-restricted to this machine), and a new server auth gate (server/auth.ts) allows loopback binds while REQUIRING a bearer token (DOOLITTLE_API_TOKEN) for any non-loopback bind — without a token, a non-loopback bind rejects every request (fail-safe), so the API is never silently exposed. .env.example updated to the safe default + token guidance. +5 auth unit tests. Gates: typecheck 0, 1488 tests pass, build + lint clean. --- .env.example | 6 ++- packages/agent/src/config/env/build.ts | 1 + packages/agent/src/config/env/schema.ts | 3 +- packages/agent/src/server.ts | 10 ++++ packages/agent/src/server/auth.test.ts | 43 ++++++++++++++++++ packages/agent/src/server/auth.ts | 53 ++++++++++++++++++++++ packages/agent/src/types/runtime/config.ts | 2 + 7 files changed, 116 insertions(+), 2 deletions(-) create mode 100644 packages/agent/src/server/auth.test.ts create mode 100644 packages/agent/src/server/auth.ts diff --git a/.env.example b/.env.example index 65e0b67c..3161d233 100644 --- a/.env.example +++ b/.env.example @@ -2,7 +2,11 @@ DOOLITTLE_NAME=Doolittle DOOLITTLE_MODE=both DOOLITTLE_PORT=3000 -DOOLITTLE_HOST=0.0.0.0 +# Local-first default. The loopback bind is restricted to this machine by the OS. +# To expose the API on a LAN/public interface (e.g. 0.0.0.0), you MUST also set +# DOOLITTLE_API_TOKEN — non-loopback binds reject every request without it. +DOOLITTLE_HOST=127.0.0.1 +# DOOLITTLE_API_TOKEN=change-me-to-a-long-random-secret DOOLITTLE_DATA_DIR=.doolittle DOOLITTLE_SKILLS_DIR=./packages/skills DOOLITTLE_TIMEZONE=America/Chicago diff --git a/packages/agent/src/config/env/build.ts b/packages/agent/src/config/env/build.ts index bf690bb6..fb15ff43 100644 --- a/packages/agent/src/config/env/build.ts +++ b/packages/agent/src/config/env/build.ts @@ -35,6 +35,7 @@ export function buildEnvConfig( mode: values.DOOLITTLE_MODE, host: values.DOOLITTLE_HOST, port: values.DOOLITTLE_PORT, + apiToken: values.DOOLITTLE_API_TOKEN, dataDir: directories.dataDir, skillsDir: directories.skillsDir, timezone: values.DOOLITTLE_TIMEZONE, diff --git a/packages/agent/src/config/env/schema.ts b/packages/agent/src/config/env/schema.ts index 31f70b89..6dbdcfbc 100644 --- a/packages/agent/src/config/env/schema.ts +++ b/packages/agent/src/config/env/schema.ts @@ -4,8 +4,9 @@ import { z } from "zod"; export const envSchema = z.object({ DOOLITTLE_NAME: z.string().default("Doolittle"), DOOLITTLE_MODE: z.enum(["api", "cli", "both"]).default("both"), - DOOLITTLE_HOST: z.string().default("0.0.0.0"), + DOOLITTLE_HOST: z.string().default("127.0.0.1"), DOOLITTLE_PORT: z.coerce.number().int().positive().default(3000), + DOOLITTLE_API_TOKEN: z.string().optional(), DOOLITTLE_DATA_DIR: z.string().default(".doolittle"), DOOLITTLE_SKILLS_DIR: z.string().default("./packages/skills"), DOOLITTLE_TIMEZONE: z.string().default("America/Chicago"), diff --git a/packages/agent/src/server.ts b/packages/agent/src/server.ts index 270f5922..2f06253c 100644 --- a/packages/agent/src/server.ts +++ b/packages/agent/src/server.ts @@ -1,4 +1,5 @@ import type { AppContext } from "@/runtime/bootstrap"; +import { isApiRequestAuthorized } from "@/server/auth"; import { json } from "@/server/responses"; import { dispatchRouteHandlers } from "@/server/router"; import { apiRouteHandlers } from "@/server/routes"; @@ -28,6 +29,15 @@ export function startApiServer(context: AppContext): void { return json({ ok: true }); } + if ( + !isApiRequestAuthorized( + { host: context.config.host, apiToken: context.config.apiToken }, + request, + ) + ) { + return json({ error: "Unauthorized" }, 401); + } + const response = await dispatchRouteHandlers( context, request, diff --git a/packages/agent/src/server/auth.test.ts b/packages/agent/src/server/auth.test.ts new file mode 100644 index 00000000..0e9d36e1 --- /dev/null +++ b/packages/agent/src/server/auth.test.ts @@ -0,0 +1,43 @@ +import { describe, expect, it } from "bun:test"; +import { isApiRequestAuthorized, isLoopbackHost } from "./auth"; + +function request(authorization?: string): Request { + return new Request("http://x/secrets", { + headers: authorization ? { authorization } : {}, + }); +} + +describe("isLoopbackHost", () => { + it("recognizes loopback hosts", () => { + for (const h of ["127.0.0.1", "localhost", "::1", "127.5.5.5"]) { + expect(isLoopbackHost(h)).toBe(true); + } + }); + it("rejects all-interfaces and LAN hosts", () => { + for (const h of ["0.0.0.0", "192.168.1.10", "10.0.0.5", "example.com"]) { + expect(isLoopbackHost(h)).toBe(false); + } + }); +}); + +describe("isApiRequestAuthorized", () => { + it("allows any request on a loopback bind (OS-restricted to local)", () => { + expect(isApiRequestAuthorized({ host: "127.0.0.1" }, request())).toBe(true); + expect(isApiRequestAuthorized({ host: "localhost" }, request())).toBe(true); + }); + + it("denies all requests on a non-loopback bind with no token (fail-safe)", () => { + expect(isApiRequestAuthorized({ host: "0.0.0.0" }, request())).toBe(false); + expect( + isApiRequestAuthorized({ host: "0.0.0.0" }, request("Bearer anything")), + ).toBe(false); + }); + + it("requires a matching bearer token on a non-loopback bind", () => { + const config = { host: "0.0.0.0", apiToken: "s3cret" }; + expect(isApiRequestAuthorized(config, request("Bearer s3cret"))).toBe(true); + expect(isApiRequestAuthorized(config, request("Bearer wrong"))).toBe(false); + expect(isApiRequestAuthorized(config, request())).toBe(false); + expect(isApiRequestAuthorized(config, request("s3cret"))).toBe(false); + }); +}); diff --git a/packages/agent/src/server/auth.ts b/packages/agent/src/server/auth.ts new file mode 100644 index 00000000..342d4070 --- /dev/null +++ b/packages/agent/src/server/auth.ts @@ -0,0 +1,53 @@ +/** + * HTTP API authorization for Doolittle. + * + * Doolittle is terminal-first and local-first. The API is meant for the local + * operator, so the security model is: + * + * - When bound to a loopback host (the default), the OS already restricts the + * socket to this machine, so requests are trusted with no token. + * - When bound to a non-loopback host (an operator explicitly exposing the API + * on a LAN/public interface), a bearer token (`DOOLITTLE_API_TOKEN`) is + * REQUIRED — without it every request is rejected, so a public bind is never + * silently unauthenticated. + */ + +export function isLoopbackHost(hostname: string): boolean { + const normalized = hostname.trim().toLowerCase(); + return ( + normalized === "localhost" || + normalized === "::1" || + normalized === "0:0:0:0:0:0:0:1" || + normalized.startsWith("127.") + ); +} + +export interface ApiAuthConfig { + host: string; + apiToken?: string; +} + +function extractBearerToken(request: Request): string | undefined { + const header = request.headers.get("authorization") ?? ""; + const match = header.match(/^Bearer\s+(.+)$/i); + return match?.[1]?.trim() || undefined; +} + +/** + * True when the request is allowed to reach the API. Loopback binds are + * trusted; every other bind requires a matching bearer token. + */ +export function isApiRequestAuthorized( + config: ApiAuthConfig, + request: Request, +): boolean { + if (isLoopbackHost(config.host)) { + return true; + } + const token = config.apiToken?.trim(); + if (!token) { + // Non-loopback bind with no token configured — fail safe (deny all). + return false; + } + return extractBearerToken(request) === token; +} diff --git a/packages/agent/src/types/runtime/config.ts b/packages/agent/src/types/runtime/config.ts index 6d4eb098..534bdf75 100644 --- a/packages/agent/src/types/runtime/config.ts +++ b/packages/agent/src/types/runtime/config.ts @@ -10,6 +10,8 @@ export interface EnvConfig { mode: "api" | "cli" | "both"; host: string; port: number; + /** Bearer token required for non-loopback API binds (DOOLITTLE_API_TOKEN). */ + apiToken?: string; dataDir: string; skillsDir: string; timezone: string; From 37fd01f33218fd4f62bda37b2d2340c6868e9a5f Mon Sep 17 00:00:00 2001 From: SYMBaiEX Date: Wed, 17 Jun 2026 19:40:08 -0500 Subject: [PATCH 13/14] OSS readiness: LICENSE, SECURITY, CONTRIBUTING, CHANGELOG; re-track docs Prepare for open-source release: add MIT LICENSE (+ root license field), SECURITY.md (private reporting + the local-first security model), CONTRIBUTING.md (gates + action/provider extension recipes), and CHANGELOG.md (beta migration + this release). Re-track docs/ (un-ignored) so the ~8 README-linked reference docs resolve on a fresh clone and the doc-truth acceptance gate passes from a clean checkout. Gates: check:acceptance passes (repo-hygiene + plugin-boundaries + doc-truth), typecheck 0, lint clean. --- .gitignore | 3 +- CHANGELOG.md | 53 ++ CONTRIBUTING.md | 73 ++ LICENSE | 21 + SECURITY.md | 36 + docs/capability-truth.md | 74 +++ docs/doolittle-experience-harness-plan.md | 52 ++ docs/eliza-maximization-matrix.md | 58 ++ docs/elizaos-maximization-plan.md | 625 ++++++++++++++++++ docs/elizaos-research.md | 92 +++ docs/module-structure-guidelines.md | 62 ++ docs/monorepo.md | 66 ++ docs/native-experience-ledger.md | 32 + docs/operator-loop.md | 117 ++++ docs/operator-wow-contract.md | 585 ++++++++++++++++ docs/plugin-inventory.md | 30 + docs/quickstart.md | 148 +++++ docs/skills-hub.md | 59 ++ .../plans/2026-05-09-doolittle-wow-harness.md | 207 ++++++ package.json | 1 + 20 files changed, 2392 insertions(+), 2 deletions(-) create mode 100644 CHANGELOG.md create mode 100644 CONTRIBUTING.md create mode 100644 LICENSE create mode 100644 SECURITY.md create mode 100644 docs/capability-truth.md create mode 100644 docs/doolittle-experience-harness-plan.md create mode 100644 docs/eliza-maximization-matrix.md create mode 100644 docs/elizaos-maximization-plan.md create mode 100644 docs/elizaos-research.md create mode 100644 docs/module-structure-guidelines.md create mode 100644 docs/monorepo.md create mode 100644 docs/native-experience-ledger.md create mode 100644 docs/operator-loop.md create mode 100644 docs/operator-wow-contract.md create mode 100644 docs/plugin-inventory.md create mode 100644 docs/quickstart.md create mode 100644 docs/skills-hub.md create mode 100644 docs/superpowers/plans/2026-05-09-doolittle-wow-harness.md diff --git a/.gitignore b/.gitignore index 153c563c..c1e02441 100644 --- a/.gitignore +++ b/.gitignore @@ -16,5 +16,4 @@ test-results/ *.tsbuildinfo skills/generated/index.json tmp/ -e2e/ -docs/ \ No newline at end of file +e2e/ \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 00000000..3d9838c4 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,53 @@ +# Changelog + +All notable changes to Doolittle are documented here. The format follows +[Keep a Changelog](https://keepachangelog.com/), and the project tracks the +ElizaOS 2.0 beta line. + +## [Unreleased] + +### Platform + +- **Migrated to ElizaOS 2.0 beta** (`@elizaos/core@2.0.0-beta.1`, agent `beta.2`, + skills `beta.1`, plugins `beta.1`, `elizaos@beta.5`). `@elizaos/autonomous` + stays on `alpha.85` (no beta published) with `overrides` forcing a single beta + `@elizaos/core` instance. Handled all beta breaking changes (moved subpaths, + removed `ModelType.OBJECT_*`, redesigned `Evaluator` contract, optional + `params.prompt`). Patched a broken `bun` export condition in + `@elizaos/plugin-sql@2.0.0-beta.1`. + +### Added + +- **Provider-aware prompt caching** for Doolittle-owned model calls + (`runtime/prompt-cache`): lossless stable/volatile segmentation emitting SDK + `promptSegments` + `providerOptions`, deterministic versioned cache keys, and + cache metrics surfaced in `/status`. +- Full SDK adoption: self-awareness provider, `/research` deep-research action, + tool-audit hook, autonomous triggers, a recurring maintenance task, and + per-ModelType sampling settings. + +### Security + +- **Local-first API**: the HTTP API binds to `127.0.0.1` by default; non-loopback + binds now **require** `DOOLITTLE_API_TOKEN` (fail-safe — no token means every + request on a public bind is rejected). Previously it bound `0.0.0.0` with no + authentication. + +### Fixed / Reliability + +- `/mcp` · `/acp` no longer crash on malformed JSON; `/cron ` no longer + crashes the turn. +- Per-item failure isolation for deferred plugin hydration, the cron tick, and + the gateway watchdog (one failure no longer aborts the rest). +- Turns are always finished on exception (no more runs stranded in "thinking"). +- `AGENTS.md` is real guidance again (it had become a memory dump injected into + the live prompt). + +### Performance + +- `SettingsService.get()` and `SOUL.md` reads are now mtime-cached on hot paths. + +### Docs + +- Added LICENSE (MIT), SECURITY, CONTRIBUTING; `/commands` no longer truncates + the browse list; version docs corrected from alpha to beta. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 00000000..e17ea652 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,73 @@ +# Contributing to Doolittle + +Thanks for helping build Doolittle — an ElizaOS-native, terminal-first agent. + +## Prerequisites + +- [Bun](https://bun.sh) `>= 1.3` (the repo is Bun-first; do not use npm/yarn/pnpm). +- Node `>= 24` headers are used by some native deps. + +```bash +bun install +cp .env.example .env # then fill in provider keys you want +bun run dev # start the paired shell +``` + +## Quality gates + +Every change must keep these green (CI runs them): + +```bash +bun run typecheck # tsc --noEmit, strict +bun test # full suite (bun:test) +bun run build # bundle packages/agent +bun run lint:check # biome +bun run check:acceptance # repo hygiene + plugin boundaries + doc truth +``` + +Run `bun run lint` to auto-fix formatting before committing. + +## Repository shape + +- `packages/agent` — the application: `runtime/` (chat-turn, services, providers), + `gateway/`, `cli/`, `server/`. +- `packages/plugins/*` — vendored provider plugins + the consolidated + `doolittle-plugin`. +- `packages/{acp,contracts,logger,characters,skills}` — supporting workspaces. +- Runtime is ElizaOS 2.0 **beta**; `@elizaos/autonomous` is on `alpha.85` and is + imported only via its subpaths. + +## Extension recipes + +The plugin surface only imports Doolittle internals through one seam: +`@doolittle/agent/plugin-api`. + +### Add an action + +1. Implement `createMyAction(services): Action` in `packages/agent/src/actions/`. +2. Re-export it from `packages/agent/src/plugin-api.ts`. +3. Register it in the assembly's `actions` array + (`packages/plugins/doolittle-plugin/assembly.ts`). +4. Add a unit test next to the action. + +### Add a provider (prompt context) + +1. Implement `createMyProvider(services): Provider` in + `packages/agent/src/providers/`. +2. Re-export it from `plugin-api.ts`. +3. Add it to the `providers` array in `assembly.ts`. + +### Add a model provider + +Add a workspace plugin under `packages/plugins/` that registers the model +handlers; wire its selection through the provider registry. To benefit from +prompt caching, make it consume `params.promptSegments` (see +`packages/agent/src/runtime/prompt-cache/README.md`). + +## Conventions + +- Match the surrounding code style; keep changes additive and strongly typed. +- Doolittle-owned model prompts go through the shared prompt-cache layer, never + ad hoc. +- Add or update tests alongside implementation. +- Never mark user input, secrets, or per-request data as cache-stable. diff --git a/LICENSE b/LICENSE new file mode 100644 index 00000000..82859a37 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2026 SYMBaiEX + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/SECURITY.md b/SECURITY.md new file mode 100644 index 00000000..aff221cb --- /dev/null +++ b/SECURITY.md @@ -0,0 +1,36 @@ +# Security Policy + +## Reporting a vulnerability + +Please report security issues **privately** — do not open a public issue for an +unpatched vulnerability. + +- Use GitHub's [private vulnerability reporting](https://github.com/SYMBaiEX/doolittle/security/advisories/new) + ("Report a vulnerability" under the **Security** tab), or +- Open a minimal private channel with the maintainers. + +Include a description, affected version/commit, reproduction steps, and impact. +We aim to acknowledge reports promptly and coordinate a fix and disclosure. + +## Security model + +Doolittle is terminal-first and **local-first**: + +- The HTTP API binds to **loopback (`127.0.0.1`) by default**, so it is reachable + only from the local machine. +- Exposing the API on a non-loopback interface (e.g. `DOOLITTLE_HOST=0.0.0.0`) + **requires** a bearer token via `DOOLITTLE_API_TOKEN`. Without a token, a + non-loopback bind rejects every request — the API is never silently exposed. +- Context files (`AGENTS.md`, `SOUL.md`, …) and tool inputs pass through a + prompt-injection scanner before reaching the model. +- Credentials and secrets are stored under the data directory and are not + returned to non-local/unauthenticated callers. + +## Hardening checklist for operators + +- Keep `DOOLITTLE_HOST=127.0.0.1` unless you intentionally need remote access. +- If you set a non-loopback host, set a long random `DOOLITTLE_API_TOKEN` and put + the API behind TLS / a reverse proxy. +- Treat the workspace directory and `.env` as sensitive — they hold credentials. +- Review actions that execute shell commands; approval gates apply to non-CLI + sources. diff --git a/docs/capability-truth.md b/docs/capability-truth.md new file mode 100644 index 00000000..06f0792d --- /dev/null +++ b/docs/capability-truth.md @@ -0,0 +1,74 @@ +# Capability Truth + +This file is generated from the code-backed capability truth records used during the stabilization pass. +Do not edit it by hand; run `bun run scripts/sync-doc-truth.ts --write`. + +## doolittle:services.web + +- Runtime ID: `browser.browser` +- Headline: Browser capture is truthful about pixel versus placeholder output. +- Summary: The browser adapter exposes browser-backed capture when a Lightpanda-compatible command is available, and it falls back to placeholder artifacts when browser execution is unavailable. +- Runtime surfaces: `GET /browser/status`, `POST /browser/capture`, `POST /browser/screenshot`, `POST /browser/analyze` +- Required status fields: `captureMode`, `captureReady`, `provider`, `mode` + +### Real Behavior + +- Returns pixel-backed PNG screenshot artifacts when the configured browser backend is executable. +- Keeps browser status explicit so the caller can see whether capture is running in browser or fallback mode. +- Preserves placeholder markdown and SVG artifacts as the degraded path instead of pretending screenshots are real. + +### Degraded Behavior + +- Falls back to placeholder markdown capture output when the browser backend is unavailable or fetch execution fails. +- Reports captureMode=placeholder and captureReady=false instead of claiming full screenshot readiness. + +### Caveats + +- Pixel capture is a lightweight raster card generated from the fetched page snapshot, not a full DOM screenshot engine. +- Interactive upstream browser claims such as CAPTCHA solving and session management are not part of the documented Doolittle runtime contract. + +## doolittle:services.media + +- Runtime ID: `media.tts` +- Headline: TTS is a runtime adapter with explicit active versus degraded readiness. +- Summary: The TTS adapter delegates to the runtime media service, exposes backend selection, and degrades truthfully when no supported speech backend is configured. +- Runtime surfaces: `GET /runtime/media`, `POST /media/speak` +- Required status fields: `ready`, `backend`, `mode` + +### Real Behavior + +- Reports backend=fal or backend=openai when a speech backend is configured. +- Routes speech generation through the runtime media service instead of shipping a stub-only plugin. +- Keeps the adapter loaded even when speech generation is unavailable so callers can inspect truthful status. + +### Degraded Behavior + +- Reports mode=degraded and backend=null when no speech backend is configured. +- Does not claim enablement solely because the plugin package is installed. + +### Caveats + +- The runtime contract is readiness-first: callers should inspect status before treating speech generation as available. + +## @doolittle/plugin-autocoder + +- Runtime ID: `research.autocoder` +- Headline: Autocoder remains experimental and planning-first until real mutation flows are fully implemented. +- Summary: The autocoder plugin supports research, planning, GitHub, and secrets workflows, but planning-only flows are explicitly non-mutating and surfaced as experimental. +- Runtime surfaces: `POST /codegen/generate`, `POST /codegen/research`, `POST /codegen/prd`, `POST /codegen/qa` +- Required status fields: `experimental`, `executed` + +### Real Behavior + +- Returns planning-only scaffolds with executed=false for non-mutating code generation flows. +- Keeps GitHub and secrets helpers available without overstating end-to-end execution support. +- Marks the runtime catalog entry as maturity=experimental. + +### Degraded Behavior + +- Does not claim files were written or dependencies were installed when the plugin only produced a plan. +- Avoids presenting suggested next steps as completed execution. + +### Caveats + +- The autocoder surface is still useful for structured planning, but it should not be documented as a production-grade autonomous code writer yet. diff --git a/docs/doolittle-experience-harness-plan.md b/docs/doolittle-experience-harness-plan.md new file mode 100644 index 00000000..05857154 --- /dev/null +++ b/docs/doolittle-experience-harness-plan.md @@ -0,0 +1,52 @@ +# Doolittle Native Experience Harness Plan + +## Goal + +Make Doolittle feel like a warm, persistent, terminal-native ElizaOS collaborator with strong local execution, visible control, memory, skills, recovery, and research-grade trajectories. + +## Operator Patterns Worth Keeping + +- **Live operator loop**: the terminal should feel alive with status bars, spinners, tool previews, approvals, interrupts, `/retry`, `/undo`, `/usage`, `/compress`, and model controls. +- **Closed learning loop**: memory, todos, skills, session search, and trajectory export should behave like one workflow rather than separate panels. +- **Execution contracts**: Doolittle should not trust the model's summary when tools were supposed to act. The loop tracks tool results, repeated failures, empty responses, and file-mutation proof before presenting a turn as successful. +- **One command grammar**: CLI, TUI, gateway, and autocomplete derive from the same command registry. +- **Platform continuity**: Gateway conversations can resume, route home, approve commands, and preserve session context. +- **Research readiness**: Trajectories are first-class artifacts for compression, replay, batch generation, evaluation, and future small-model training. + +## Doolittle Direction + +Doolittle should use ElizaOS as the native substrate and make the harness feel alive by tightening the experience spine: + +- **ElizaOS-native identity**: character, personality, memory, and runtime services shape every model path. +- **Terminal-first recovery**: `/retry`, `/undo`, `/todo`, `/usage`, `/compress`, `/status`, and `/doctor` stay available inside the chat loop. +- **Tool use with receipts**: every local action records progress and trajectory events without drowning the user in logs. +- **Local-first providers**: Devin, Ollama, Codex, Claude Code, and ElizaCloud are selectable providers, but local/non-cloud status must be truthful. +- **Training harness**: trajectory records include conversation, model request/response, tool lifecycle, shell output, failures, timings, and final receipts. + +## Implemented In This Slice + +- Local execution turns now have a Doolittle-side execution contract: local action requests must produce observable action proof, and file-mutation requests cannot complete with zero local actions. +- Empty planner wrappers such as `Provider executed: []` are now classified as native execution failures for local tasks instead of being treated as successful answers. +- Local file actions now record mutation receipts for `WRITE_FILE`, `PATCH_FILE`, and `CREATE_DIRECTORY` into the active run controller state. +- File-writing requests now require a successful write or patch receipt before Doolittle can present the turn as complete. +- Mutation receipts flow into run progress and ElizaOS SDK trajectory logging so future training data can distinguish real local changes from summaries; Doolittle debug bundles remain non-training replay artifacts. +- Coding profile guidance now names Doolittle's actual Eliza actions (`READ_FILE`, `WRITE_FILE`, `PATCH_FILE`, `SEARCH_FILES`, `CREATE_DIRECTORY`, `RUN_IN_TERMINAL`) instead of only abstract coding-agent capabilities. +- `/retry` replays the latest real conversational turn after removing its previous answer, without storing `/retry` as the prompt. +- `/undo` removes the latest conversational exchange from session memory. +- `/todo list`, `/todo add`, and `/todo show` alias Doolittle's native planning service for Doolittle-native task tracking. +- Provider-path model input now includes a Doolittle experience contract: warm Eliza-style presence, memory continuity, visible todos for multi-step work, and truthful execution receipts. +- Command catalog and help examples advertise the recovery and todo loop. +- `/compress [focus]` now compresses the active conversation session; trajectory dataset compression moved to `/trajectories compress`. +- `/model list` and `/model use [model]` provide a coherent operator-facing model route surface across Ollama, Devin, Codex, Claude Code, and Eliza Cloud. +- `/usage` and `/insights` now summarize context pressure, observed run/tool events, memory, generated skills, and next controls instead of raw JSON. +- `/skills synthesize latest` creates a generated skill from the active session when a reusable workflow is detected. +- User profile observations now opportunistically write new names, facts, and preferences into user memory for stronger recall. +- `doolittle-experience` benchmark pack covers the small-talk, memory, CLI recovery, model switching, coding, gateway, and learning-loop native experience path. + +## Next Todo + +1. Add tool-loop guardrails for repeated identical failures, repeated no-progress retrieval, and planner empty-response retries. +2. Add a compact live status footer for plain shell mode: provider/model, elapsed turn time, context pressure, active tool, and last trajectory event. +3. Add gateway native-behavior checks for typing/progressive delivery, approvals, home routing, voice memo routing, and session continuity. +4. Add cost/rate-limit accounting when the active provider exposes token or quota metadata. +5. Add an interactive model picker UI on top of the `/model list` and `/model use` command contract. diff --git a/docs/eliza-maximization-matrix.md b/docs/eliza-maximization-matrix.md new file mode 100644 index 00000000..d73667b4 --- /dev/null +++ b/docs/eliza-maximization-matrix.md @@ -0,0 +1,58 @@ +# Eliza Maximization Matrix + +Last updated: May 15, 2026 + +This matrix tracks where Doolittle is already strongly aligned with the +ElizaOS alpha stack and where native service ownership can still increase. + +## Foundation + +| Subsystem | Current Eliza usage | Not native enough yet | Next package or service to push | +|---|---|---|---| +| Runtime core | `elizaos`, `@elizaos/core`, `@elizaos/agent`, `@elizaos/autonomous`, `@elizaos/skills` | Foundation packages still drive more audit and control-plane visibility than direct runtime behavior | `@elizaos/agent`, `@elizaos/autonomous`, `@elizaos/skills` | +| Native plugin assembly | [`packages/agent/src/runtime/native/plugin-registry/index.ts`](../packages/agent/src/runtime/native/plugin-registry/index.ts), `@elizaos/agent/services/registry-client`, `@elizaos/autonomous/services/plugin-manager-types` | Some plugin inventory and service ownership still flow through product summaries | Use exported registry/plugin-manager contracts before adding direct plugin-manager dependencies | +| Agent SDK usage | [`packages/agent/src/runtime/native/agent-sdk.ts`](../packages/agent/src/runtime/native/agent-sdk.ts), [`packages/agent/src/services/agent-sdk-service.ts`](../packages/agent/src/services/agent-sdk-service.ts) | Registry/catalog/compat data is not yet the dominant source for all runtime/operator decisions | `@elizaos/agent` | + +## Knowledge and Identity + +| Subsystem | Current Eliza usage | Not native enough yet | Next package or service to push | +|---|---|---|---| +| Knowledge ingestion | `@elizaos/plugin-pdf`, `@elizaos/autonomous/api/knowledge-routes`, [`packages/agent/src/services/documents-service.ts`](../packages/agent/src/services/documents-service.ts) | Product memory and documents services still own too much of the ingest/recall flow | Move recall, ingest status, and document lifecycle closer to installed native knowledge APIs | +| Embeddings | `@elizaos/plugin-ollama`, ElizaOS local embedding support through installed provider packages | Doolittle should keep embedding ownership in official SDK/provider packages instead of workspace shadow packages | `@elizaos/plugin-ollama` plus exported local embedding support when it becomes a direct dependency | +| Personality | [`packages/plugins/doolittle-plugin/identity/personality`](../packages/plugins/doolittle-plugin/identity/personality), [`packages/agent/src/services/personality-service.ts`](../packages/agent/src/services/personality-service.ts) | Doolittle keeps product-specific personality behavior while exposing it as an Eliza service | Doolittle identity facet inside the consolidated product plugin; upstream only when ElizaOS publishes a matching service contract | +| User profiles and memory | [`packages/plugins/doolittle-plugin/identity/rolodex`](../packages/plugins/doolittle-plugin/identity/rolodex), [`packages/agent/src/services/user-profile/service/index.ts`](../packages/agent/src/services/user-profile/service/index.ts) | Profile flows are Doolittle-owned but exposed through a native service boundary | Doolittle profile facet inside the consolidated product plugin; upstream only when ElizaOS publishes a matching service contract | +| Session and experience | [`packages/plugins/doolittle-plugin/identity/experience`](../packages/plugins/doolittle-plugin/identity/experience), [`packages/agent/src/services/session/service/index.ts`](../packages/agent/src/services/session/service/index.ts) | Experience views are Doolittle-owned but exposed through a native service boundary | Doolittle experience facet inside the consolidated product plugin; upstream only when ElizaOS publishes a matching service contract | + +## Execution and Orchestration + +| Subsystem | Current Eliza usage | Not native enough yet | Next package or service to push | +|---|---|---|---| +| Shell and execution | `@elizaos/autonomous/actions/terminal`, `@elizaos/agent/services/sandbox-engine`, [`packages/agent/src/services/terminal/service.ts`](../packages/agent/src/services/terminal/service.ts) | Runtime and operator surfaces still sometimes treat shell as a product capability first | Push command policy, sandbox selection, and execution receipts toward exported native execution contracts | +| Coding agent | [`packages/plugins/doolittle-plugin/coding-agent`](../packages/plugins/doolittle-plugin/coding-agent), `@elizaos/agent/services/coding-agent-context` | Doolittle coding behavior is product-owned but exposed as an Eliza plugin/service | Keep Doolittle UX and local-development semantics, but reuse exported coding-agent contracts where they match | +| Orchestrator | [`packages/plugins/doolittle-plugin/agent-orchestrator`](../packages/plugins/doolittle-plugin/agent-orchestrator), [`packages/agent/src/services/delegation/service/index.ts`](../packages/agent/src/services/delegation/service/index.ts), `@elizaos/agent/api/coding-agents-fallback-routes` | Delegation is product-owned but exposed through a native service boundary | Keep Doolittle supervision UX, but reuse exported orchestrator/coding-task contracts where they match | +| Scheduling | `@elizaos/autonomous/triggers/scheduling`, [`packages/agent/src/services/cron/service/index.ts`](../packages/agent/src/services/cron/service/index.ts) | Better than before, but product cron surfaces still outnumber native ones | Keep cron and heartbeat semantics aligned with `@elizaos/autonomous` trigger contracts | + +## Browser, MCP, and Research + +| Subsystem | Current Eliza usage | Not native enough yet | Next package or service to push | +|---|---|---|---| +| Browser | `@elizaos/autonomous/services/browser-capture`, [`packages/agent/src/services/web/service.ts`](../packages/agent/src/services/web/service.ts) | Product web workflows still own most advanced behavior | Reuse exported native browser/capture contracts while keeping Doolittle's operator receipts | +| MCP | `@elizaos/autonomous/services/mcp-marketplace`, [`packages/agent/src/services/mcp/service.ts`](../packages/agent/src/services/mcp/service.ts) | Marketplace discovery is native, while local MCP execution remains product-owned | Push server discovery through the native marketplace helpers and keep execution receipts local until an execution plugin is a direct dependency | +| Skill synthesis and catalog | `@elizaos/skills`, `@elizaos/agent/services/skill-catalog-client`, `@elizaos/autonomous/services/skill-marketplace`, [`packages/agent/src/services/skills/service.ts`](../packages/agent/src/services/skills/service.ts) | Local/generated/catalog skills are still not unified enough under one native-first shape | Keep broad skill catalog behavior while using native skill manifests as the canonical shape | +| Trajectories | `@elizaos/core` trajectory context/logger APIs, `@elizaos/autonomous/runtime/trajectory-persistence`, [`packages/agent/src/services/trajectory/sdk-native.ts`](../packages/agent/src/services/trajectory/sdk-native.ts), [`packages/agent/src/services/trajectory/service/index.ts`](../packages/agent/src/services/trajectory/service/index.ts) | Research/operator flows still expose product trajectory concepts before native logger ownership in some places | Keep Doolittle-rich receipts while exporting Eliza-native training artifacts | + +## Messaging and Control Plane + +| Subsystem | Current Eliza usage | Not native enough yet | Next package or service to push | +|---|---|---|---| +| Telegram | `@elizaos/plugin-telegram`, [`packages/agent/src/gateway/platforms/telegram-adapter/index.ts`](../packages/agent/src/gateway/platforms/telegram-adapter/index.ts) | Gateway and adapter logic still own more runtime behavior than the native messaging service | `@elizaos/plugin-telegram` | +| Discord | [`packages/agent/src/gateway/platforms/discord-adapter/index.ts`](../packages/agent/src/gateway/platforms/discord-adapter/index.ts) | Discord is gateway-owned until a direct native Discord dependency is added | Add an official native dependency only when the runtime uses it directly | +| Plugin inventory and tools | `@elizaos/agent/services/registry-client`, `@elizaos/autonomous/services/plugin-manager-types`, [`packages/agent/src/services/tools/service.ts`](../packages/agent/src/services/tools/service.ts) | Tool summaries and operator surfaces still partially recompute inventory instead of trusting registry-backed ownership | Let exported registry/plugin-manager contracts drive tool availability and `/status` inventory | + +## Current Highest-Value Next Steps + +1. Let exported registry and plugin-manager contracts drive more runtime/operator/tool inventory directly. +2. Let installed knowledge APIs, official embedding providers, rolodex, personality, and experience facets drive more memory and profile behavior directly. +3. Let exported coding-agent, orchestrator, sandbox, and terminal contracts drive more execution/delegation behavior directly. +4. Keep pushing Telegram further into native runtime ownership, and keep Discord clearly gateway-owned until a direct native dependency is added. +5. Keep expanding skills breadth and native skill catalog usage together. diff --git a/docs/elizaos-maximization-plan.md b/docs/elizaos-maximization-plan.md new file mode 100644 index 00000000..4cccab47 --- /dev/null +++ b/docs/elizaos-maximization-plan.md @@ -0,0 +1,625 @@ +# ElizaOS Runtime Maximization Plan + +> Generated from analysis of `@elizaos/core` runtime, `@elizaos/autonomous`, and installed plugin ecosystem. +> Date: 2026-03-23 + +--- + +## Critical Priority (Enable Immediately) + +### 1. AwarenessRegistry from @elizaos/autonomous (Self-Awareness Injection) + +**What it is:** A two-layer self-awareness system that composes summaries (Layer 1) and provides on-demand detail retrieval (Layer 2) for the agent. Individual awareness contributors register modules (e.g., system status, memory state, world context) and the registry orchestrates them into a unified self-awareness prompt segment. Fault-tolerant by design -- contributor errors surface as `[{id}: unavailable]` markers, never thrown exceptions. + +**Where it lives:** +- `@elizaos/autonomous/packages/autonomous/src/awareness/registry.ts` +- Exported classes: `AwarenessRegistry`, `setGlobalAwarenessRegistry`, `getGlobalAwarenessRegistry` +- Contributor contract: `@elizaos/autonomous/packages/autonomous/src/contracts/awareness.ts` (`AwarenessContributor`, `AwarenessInvalidationEvent`) + +**Code changes needed:** +1. Import and instantiate `AwarenessRegistry` at agent startup. +2. Call `setGlobalAwarenessRegistry(registry)` so all subsystems can access it. +3. Register awareness contributors for key modules: + - System health / uptime + - Active task inventory + - Relationship graph summary + - Memory utilization stats + - Active trigger count +4. Wire `registry.composeSummary(runtime)` output into the system prompt or a provider that injects the awareness block. +5. Call `registry.invalidate(event)` when state changes (task completion, new relationship, etc.) to bust the cache. + +**Expected impact:** The agent gains persistent self-knowledge of its own state, capabilities, and operational context. This enables metacognitive reasoning -- "I have 3 pending tasks, my last research took 12 minutes, I have a strong relationship with entity X" -- which dramatically improves autonomous decision-making quality. + +--- + +### 2. Four Core Evaluators (Reflection, Relationships, Long-Term Memory, Summarization) + +**What they are:** Post-response evaluators that run after the agent generates a reply, extracting structured knowledge from conversations. + +| Evaluator | Source | Purpose | +|---|---|---| +| `reflectionEvaluator` | `@elizaos/plugin-bootstrap` (built-in) | Extracts facts and relationship updates from conversation via XML parsing. Updates entity components and relationship graph. | +| `longTermExtractionEvaluator` | `@elizaos/core/dist/advanced-memory` | Extracts episodic, semantic, and procedural long-term memories with confidence scoring. Categories: `EPISODIC`, `SEMANTIC`, `PROCEDURAL`. | +| `summarizationEvaluator` | `@elizaos/core/dist/advanced-memory` | Creates session summaries when message count exceeds threshold. Produces topic lists, key points, and embedding-ready summaries. | +| (relationship management) | Via `reflectionEvaluator` | Creates/updates `Relationship` objects with `sourceEntityId`, `targetEntityId`, tags, and metadata. | + +**Where they live:** +- Reflection: bundled in `@elizaos/plugin-bootstrap/dist/index.js` (line ~5102) +- Long-term + Summarization: `@elizaos/core/dist/advanced-memory/evaluators/` +- Advanced memory plugin factory: `createAdvancedMemoryPlugin()` from `@elizaos/core/dist/advanced-memory/index` + +**Code changes needed:** +1. Ensure `@elizaos/plugin-bootstrap` is registered (likely already is -- verify reflection evaluator is in `runtime.evaluators`). +2. Call `createAdvancedMemoryPlugin()` and register it via `runtime.registerPlugin()`. +3. Configure memory thresholds in character settings: + ```json + { + "shortTermSummarizationThreshold": 20, + "shortTermRetainRecent": 5, + "longTermExtractionEnabled": true, + "longTermVectorSearchEnabled": true, + "longTermConfidenceThreshold": 0.7, + "longTermExtractionThreshold": 10, + "longTermExtractionInterval": 5 + } + ``` +4. Ensure a `MemoryStorageProvider` is available via `runtime.getService("memoryStorage")` (provided by the SQL plugin if using PostgreSQL/SQLite). + +**Expected impact:** The agent develops persistent memory across sessions. Facts extracted from conversations become queryable knowledge. Session summaries prevent context window bloat while preserving key information. Relationship tracking enables socially-aware responses. + +--- + +### 3. RESEARCH Model Type (o3-deep-research with Web Search, File Search, Code Interpreter) + +**What it is:** A first-class model type (`ModelType.RESEARCH`) that maps to OpenAI's deep research models (`o3-deep-research`, `o4-mini-deep-research`). These models can autonomously search the web, analyze files in vector stores, execute code, and connect to remote MCP servers to produce comprehensive research reports with inline citations. + +**Where it lives:** +- Type definitions: `@elizaos/core/dist/types/model.d.ts` -- `ResearchParams`, `ResearchResult`, `ResearchTool`, `ResearchAnnotation` +- Model registration: via `runtime.registerModel(ModelType.RESEARCH, handler, provider)` +- Plugin implementation: `@elizaos/plugin-openai` (must register the RESEARCH handler) + +**Code changes needed:** +1. Ensure `@elizaos/plugin-openai` is loaded and has registered a handler for `ModelType.RESEARCH`. +2. Create a research action or integrate into existing actions: + ```typescript + const result = await runtime.useModel(ModelType.RESEARCH, { + input: "Research question here", + tools: [ + { type: "web_search_preview" }, + { type: "code_interpreter", container: { type: "auto" } } + ], + background: true, // recommended for long tasks + model: "o3-deep-research", + reasoningSummary: "auto", + }); + ``` +3. Handle `ResearchResult` with its annotations array for source attribution. +4. For vector store search, pre-create OpenAI vector stores and reference them: + ```typescript + { type: "file_search", vectorStoreIds: ["vs_abc123"] } + ``` +5. For MCP integration: + ```typescript + { type: "mcp", serverLabel: "internal-docs", serverUrl: "https://...", requireApproval: "never" } + ``` + +**Expected impact:** The agent can perform deep, multi-source research tasks that take minutes, producing cited reports. This is transformative for knowledge work -- competitive analysis, technical research, regulatory review -- with full source traceability. + +--- + +### 4. TEXT_REASONING Models for Complex Planning Tasks + +**What it is:** Two reasoning model tiers (`TEXT_REASONING_SMALL` / `TEXT_REASONING_LARGE`) designed for chain-of-thought reasoning on complex tasks. These map to models like o3-mini and o3 that excel at multi-step planning, code generation, and logical deduction. + +**Where it lives:** +- Constants: `ModelType.TEXT_REASONING_SMALL` ("REASONING_SMALL"), `ModelType.TEXT_REASONING_LARGE` ("REASONING_LARGE") +- Settings: `TEXT_REASONING_SMALL_TEMPERATURE`, `TEXT_REASONING_LARGE_MAX_TOKENS`, etc. +- Advanced planning plugin: `@elizaos/core/dist/advanced-planning/` -- `createAdvancedPlanningPlugin()`, `PlanningService` + +**Code changes needed:** +1. Register reasoning model handlers via `@elizaos/plugin-openai` or `@elizaos/plugin-anthropic`. +2. Register the advanced planning plugin: + ```typescript + import { createAdvancedPlanningPlugin } from "@elizaos/core/dist/advanced-planning"; + await runtime.registerPlugin(createAdvancedPlanningPlugin()); + ``` +3. Use reasoning models for complex tasks: + ```typescript + const plan = await runtime.useModel(ModelType.TEXT_REASONING_LARGE, { + prompt: complexPlanningPrompt, + maxTokens: 8192, + }); + ``` +4. Configure per-model settings in character: + ```json + { + "TEXT_REASONING_LARGE_TEMPERATURE": 0.1, + "TEXT_REASONING_LARGE_MAX_TOKENS": 8192, + "TEXT_REASONING_SMALL_TEMPERATURE": 0.3 + } + ``` +5. Route planning-heavy tasks through the `PlanningService` for structured multi-step execution. + +**Expected impact:** Complex tasks that currently fail or produce shallow results will benefit from dedicated reasoning models. Multi-step action plans (`ActionPlan` with `ActionPlanStep[]`) become reliable. The planning service provides structured decomposition and tracking. + +--- + +## High Priority (Next Sprint) + +### 5. AgentEventService Streams for TUI Real-Time Observability + +**What it is:** A centralized event streaming service (`ServiceType.AGENT_EVENT`) that provides real-time observability into agent activity. Supports 10+ event stream categories: `lifecycle`, `tool`, `assistant`, `error`, `heartbeat`, `message`, `action`, `evaluator`, `provider`, `memory`. Each event carries a monotonic sequence number, timestamp, run ID, and session routing key. + +**Where it lives:** +- Service: `@elizaos/core/dist/services/agentEvent.d.ts` -- `AgentEventService` +- Types: `@elizaos/core/dist/types/agentEvent.d.ts` -- all payload interfaces +- Access: `runtime.getService(ServiceType.AGENT_EVENT) as AgentEventService` + +**Code changes needed:** +1. Ensure `AgentEventService` is registered (may auto-register; verify with `runtime.hasService("agent_event")`). +2. Subscribe to event streams for TUI display: + ```typescript + const eventService = runtime.getService(ServiceType.AGENT_EVENT) as AgentEventService; + const unsub = eventService.subscribe((event) => { + // Route to TUI panel based on event.stream + switch (event.stream) { + case "lifecycle": renderLifecyclePanel(event); break; + case "tool": renderToolPanel(event); break; + case "action": renderActionPanel(event); break; + // ... + } + }); + ``` +3. Register run contexts for session routing: + ```typescript + eventService.registerRunContext(runId, { + sessionKey: "tui-session", + verboseLevel: "verbose", + }); + ``` +4. Subscribe to heartbeats for health indicator: + ```typescript + eventService.subscribeHeartbeat((hb) => { + updateStatusIndicator(resolveHeartbeatIndicator(hb.status)); + }); + ``` + +**Expected impact:** Full real-time visibility into agent internals. Every provider call, LLM invocation, action execution, and memory operation becomes observable. Essential for debugging, performance tuning, and building operational dashboards. + +--- + +### 6. Trajectory Persistence from @elizaos/core + +**What it is:** The canonical ElizaOS trace capture system for benchmarking and training data generation. Captures provider accesses (what data was fetched and why) and LLM calls (full prompt/response pairs with latency) during execution steps. Uses `AsyncLocalStorage` for async-safe propagation. + +**Where it lives in the installed SDK:** +- Service: `@elizaos/core` / `TrajectoriesService` -- SQL-backed service registered as `trajectories` +- Context: `@elizaos/core/dist/trajectory-context.d.ts` -- `TrajectoryContext`, `runWithTrajectoryContext` +- Export API: `TrajectoriesService.exportTrajectories({ format, includePrompts, trajectoryIds, startDate, endDate, scenarioId, batchId })` + +**Code changes needed:** +1. Resolve the SDK service via `TrajectoriesService.resolveFromRuntime(runtime)` or `resolveTrajectoryLogger(runtime)` rather than writing a parallel training format. +2. Wrap execution steps with trajectory context: + ```typescript + import { runWithTrajectoryContext } from "@elizaos/core"; + await runWithTrajectoryContext({ trajectoryStepId: "step-001" }, async () => { + // All provider accesses and LLM calls within this scope are captured + await runtime.composeState(message); + await runtime.useModel(ModelType.TEXT_LARGE, { prompt }); + }); + ``` +3. Export model-training data through the SDK only: + ```typescript + const trajectories = TrajectoriesService.resolveFromRuntime(runtime); + await trajectories?.exportTrajectories({ + format: "json", + includePrompts: true, + }); + ``` + +Doolittle debug bundles remain useful for replay, analysis, and operator troubleshooting. They are explicitly labeled `trainingCompatible:false` and are not a fallback for `/trajectories export`. + +**Expected impact:** Complete execution traces for every agent interaction. Enables: benchmark comparison across model/prompt changes, training data extraction for fine-tuning, cost analysis per interaction, and regression detection. + +--- + +### 7. Task Management System (registerTaskWorker, createTask) + +**What it is:** A full task scheduling and execution framework with recurring tasks, failure handling, backoff, and auto-pause. Tasks are database-persisted and survive restarts. The `TaskService` supports both local timers and a batched daemon scheduler for multi-agent deployments. + +**Where it lives:** +- Types: `@elizaos/core/dist/types/task.d.ts` -- `Task`, `TaskWorker`, `TaskMetadata`, `TaskRunStatus` +- Scheduler: `@elizaos/core/dist/services/task-scheduler.d.ts` -- batched multi-runtime scheduler +- Runtime API: `runtime.registerTaskWorker()`, `runtime.createTask()`, `runtime.getTask()`, `runtime.updateTask()` + +**Code changes needed:** +1. Define and register task workers: + ```typescript + runtime.registerTaskWorker({ + name: "DAILY_REPORT", + execute: async (runtime, options, task) => { + // Generate daily report + return { nextInterval: 24 * 60 * 60 * 1000 }; // dynamic interval + }, + shouldRun: async (runtime, task) => { + // Check if report is needed + return !task.metadata?.lastExecuted || isOverdue(task); + }, + }); + ``` +2. Create tasks: + ```typescript + const taskId = await runtime.createTask({ + name: "DAILY_REPORT", + roomId, + metadata: { + updateInterval: 86400000, // 24h + blocking: true, + maxFailures: 3, + priority: "high", + }, + tags: ["repeat", "reporting"], + }); + ``` +3. For multi-agent deployments, use the daemon scheduler: + ```typescript + import { startTaskScheduler } from "@elizaos/core"; + startTaskScheduler(databaseAdapter); // One timer for all runtimes + ``` + +**Expected impact:** Reliable background task execution with auto-retry, backoff, and health monitoring. Enables scheduled reports, periodic data sync, maintenance routines, and any recurring autonomous work. + +--- + +### 8. Relationship Management APIs + +**What it is:** First-class relationship tracking between entities with tags, metadata, and bidirectional querying. The `reflectionEvaluator` automatically creates/updates relationships from conversation analysis. + +**Where it lives:** +- Types: `@elizaos/core/dist/types/environment.d.ts` -- `Relationship` (extends `ProtoRelationship`) +- Runtime API: `runtime.createRelationship()`, `runtime.updateRelationship()` +- Evaluator: `reflectionEvaluator` in `@elizaos/plugin-bootstrap` auto-extracts relationships + +**Code changes needed:** +1. Ensure reflection evaluator is active (comes with bootstrap plugin). +2. Programmatically create relationships for known entities: + ```typescript + await runtime.createRelationship({ + sourceEntityId: agentEntityId, + targetEntityId: userEntityId, + tags: ["collaborator", "admin"], + metadata: { trustLevel: "high", firstInteraction: Date.now() }, + }); + ``` +3. Query relationships via database adapter for context enrichment. +4. Wire relationship data into awareness contributors for the AwarenessRegistry. + +**Expected impact:** The agent maintains a social graph. It knows who it's talked to, the nature of those relationships, and can adapt its behavior accordingly. Combined with the reflection evaluator, this becomes automatic. + +--- + +### 9. OBJECT_SMALL / OBJECT_LARGE for Structured Generation + +**What it is:** Dedicated model types for generating validated JSON objects from schemas. Unlike text models that require post-hoc parsing, these use native structured output (JSON mode) for reliable structured data generation. + +**Where it lives:** +- Constants: `ModelType.OBJECT_SMALL`, `ModelType.OBJECT_LARGE` +- Params: `ObjectGenerationParams` with `schema: JSONSchema`, `enumValues`, `stopSequences` +- Settings: `OBJECT_SMALL_TEMPERATURE`, `OBJECT_LARGE_MAX_TOKENS`, etc. +- Result: `Record` (typed object) + +**Code changes needed:** +1. Verify handlers are registered for both model types (via OpenAI/Anthropic plugin). +2. Replace text-generation-then-parse patterns with structured generation: + ```typescript + const result = await runtime.useModel(ModelType.OBJECT_SMALL, { + prompt: "Extract the user's intent from this message: ...", + schema: { + type: "object", + properties: { + intent: { type: "string", enum: ["question", "command", "chat"] }, + entities: { type: "array", items: { type: "string" } }, + confidence: { type: "number" }, + }, + required: ["intent", "confidence"], + }, + temperature: 0.1, + }); + // result is typed: { intent: string, entities: string[], confidence: number } + ``` +3. Configure per-type settings for reliability: + ```json + { + "OBJECT_SMALL_TEMPERATURE": 0.1, + "OBJECT_SMALL_MAX_TOKENS": 2048, + "OBJECT_LARGE_TEMPERATURE": 0.2 + } + ``` + +**Expected impact:** Eliminates JSON parsing failures that plague text-based extraction. Structured outputs are guaranteed valid against the schema. Reduces retry loops and improves action parameter extraction reliability. + +--- + +### 10. Prompt Segment Caching for Performance + +**What it is:** A system for marking prompt segments as stable vs. unstable, enabling provider-level prompt caching (Anthropic `cache_control`, OpenAI prefix caching, Gemini context caching). Stable segments (instructions, format, examples) are cached; per-call content (state, UUIDs) is marked unstable. + +**Where it lives:** +- Type: `PromptSegment` in `@elizaos/core/dist/types/model.d.ts` -- `{ content: string, stable: boolean }` +- Usage: `GenerateTextParams.promptSegments` -- optional ordered segments +- Invariant: `prompt === promptSegments.map(s => s.content).join("")` + +**Code changes needed:** +1. Refactor prompt construction to use segments: + ```typescript + const systemInstructions = "You are an agent that..."; // stable + const stateContext = composeStateText(state); // unstable + + await runtime.useModel(ModelType.TEXT_LARGE, { + prompt: systemInstructions + stateContext, + promptSegments: [ + { content: systemInstructions, stable: true }, + { content: stateContext, stable: false }, + ], + }); + ``` +2. Mark character description, action descriptions, and format instructions as `stable: true`. +3. Mark conversation history, recent memories, and state values as `stable: false`. +4. Ensure the model provider plugin respects `promptSegments` (Anthropic plugin likely does). + +**Expected impact:** 50-90% reduction in prompt token costs for repeated interactions with the same character/schema. Faster time-to-first-token due to cache hits. Most impactful for Anthropic models where cache_control is explicitly supported. + +--- + +## Medium Priority (Planned) + +### 11. Trigger System from @elizaos/autonomous + +**What it is:** A time-based task execution system supporting `interval`, `once`, and `cron` trigger types. Triggers wrap tasks with scheduling metadata and support two wake modes: `inject_now` (immediate execution) and `next_autonomy_cycle` (batched with next autonomous think). + +**Where it lives:** +- Types: `@elizaos/autonomous/packages/autonomous/src/triggers/types.ts` -- `TriggerConfig`, `TriggerRunRecord`, `TriggerSummary`, `TriggerHealthSnapshot` +- Runtime: `@elizaos/autonomous/packages/autonomous/src/triggers/runtime.ts` -- `registerTriggerTaskWorker()`, `listTriggerTasks()`, `executeTriggerTask()`, `getTriggerHealthSnapshot()` +- Action: `@elizaos/autonomous/packages/autonomous/src/triggers/action.ts` -- user-facing trigger CRUD + +**Code changes needed:** +1. Call `registerTriggerTaskWorker(runtime)` at startup. +2. Ensure `triggersFeatureEnabled(runtime)` returns `true` (check settings). +3. Create triggers programmatically or via the trigger action: + ```typescript + // Cron trigger for daily check + await runtime.createTask({ + name: "TRIGGER_DISPATCH", + tags: ["queue", "repeat", "trigger"], + metadata: { + trigger: { + version: 1, + triggerId: generateUUID(), + displayName: "Daily Market Check", + instructions: "Check market conditions and report anomalies", + triggerType: "cron", + cronExpression: "0 9 * * *", + enabled: true, + wakeMode: "inject_now", + createdBy: "system", + runCount: 0, + }, + }, + }); + ``` +4. Monitor health: `getTriggerHealthSnapshot(runtime)` returns active/disabled counts, execution stats. + +**Expected impact:** Time-based autonomous actions without external cron infrastructure. Agents can schedule their own recurring tasks, one-time reminders, and periodic checks. Combined with the autonomy service, this creates a fully self-scheduling agent. + +--- + +### 12. Sandbox Execution (E2B Integration) + +**What it is:** Secure code execution in sandboxed containers via E2B or a compatible local sandbox. Doolittle currently exposes an E2B-compatible local sandbox through `@doolittle/plugin-local-sandbox`, consolidated inside `doolittle-plugin`, while the upstream E2B package remains a future replacement candidate. + +**Where it lives:** +- Doolittle adapter: `packages/plugins/doolittle-plugin/local-sandbox` +- Research integration: `ResearchCodeInterpreterTool` in model types (`{ type: "code_interpreter", container: { type: "auto" } }`) + +**Code changes needed:** +1. Configure E2B API credentials in environment/settings. +2. Register the E2B plugin: `await runtime.registerPlugin(e2bPlugin)`. +3. Use sandbox execution for code generated by the agent, especially in research workflows. +4. Integrate with the RESEARCH model type's code interpreter tool. + +**Expected impact:** Safe execution of agent-generated code. Prevents filesystem/network damage from hallucinated scripts. Essential for research tasks involving data analysis and code generation. + +--- + +### 13. Heartbeat System + +**What it is:** An autonomous heartbeat mechanism that periodically sends status signals to monitored channels. Supports multiple status types (`sent`, `ok-empty`, `ok-token`, `skipped`, `failed`) with UI indicator mapping (`ok`, `alert`, `error`). + +**Where it lives:** +- Types: `@elizaos/core/dist/types/agentEvent.d.ts` -- `HeartbeatEventPayload`, `HeartbeatStatus`, `HeartbeatIndicatorType` +- Service: `AgentEventService.emitHeartbeat()`, `subscribeHeartbeat()` +- Resolver: `resolveHeartbeatIndicator(status)` maps status to UI indicator + +**Code changes needed:** +1. Implement a heartbeat task worker that periodically checks agent health. +2. Emit heartbeats through the AgentEventService: + ```typescript + eventService.emitHeartbeat({ + status: "ok-token", + to: "admin-channel", + preview: "Agent operational, 3 tasks pending", + channel: "telegram", + indicatorType: "ok", + }); + ``` +3. Subscribe in TUI/dashboard for real-time health display. +4. Configure heartbeat intervals and failure thresholds. + +**Expected impact:** Continuous health monitoring. Operators know immediately when an agent goes silent, encounters errors, or degrades. The indicator system (`ok`/`alert`/`error`) provides at-a-glance status. + +--- + +### 14. HOOK_TOOL_BEFORE / HOOK_TOOL_AFTER for Approval Flows + +**What it is:** Hook events that fire before and after tool/action execution, enabling interception, modification, and approval workflows. `HOOK_TOOL_BEFORE` can skip execution (`skip: true`) or modify arguments (`modifiedArgs`). `HOOK_TOOL_AFTER` can modify results. `HOOK_TOOL_PERSIST` controls what gets stored. + +**Where it lives:** +- Events: `EventType.HOOK_TOOL_BEFORE`, `EventType.HOOK_TOOL_AFTER`, `EventType.HOOK_TOOL_PERSIST` +- Payload: `HookToolPayload` -- `toolName`, `toolArgs`, `result`, `skip`, `modifiedArgs`, `modifiedResult` +- Hook Service: `IHookService` via `ServiceType.HOOKS` +- Approval Service: `ServiceType.APPROVAL` in service registry + +**Code changes needed:** +1. Register hooks via the HookService: + ```typescript + const hookService = runtime.getService(ServiceType.HOOKS) as IHookService; + hookService.register( + [EventType.HOOK_TOOL_BEFORE], + async (payload: HookToolPayload) => { + if (payload.toolName === "transfer_funds" && needsApproval(payload.toolArgs)) { + payload.skip = true; + payload.messages.push("Transfer requires admin approval. Queued for review."); + } + }, + { name: "approval-gate", priority: 100, source: "runtime" } + ); + ``` +2. Implement an approval queue backed by tasks: + ```typescript + hookService.register( + [EventType.HOOK_TOOL_AFTER], + async (payload: HookToolPayload) => { + await auditLog(payload.toolName, payload.toolArgs, payload.result); + }, + { name: "audit-logger", source: "runtime" } + ); + ``` +3. Use `HOOK_TOOL_PERSIST` to filter sensitive data from storage. + +**Expected impact:** Human-in-the-loop safety for high-stakes actions. Financial transfers, external API calls, and data modifications can require explicit approval before execution. Full audit trail via the after-hook. + +--- + +### 15. Skill / MCP Marketplace Integration + +**What it is:** Integration with the MCP (Model Context Protocol) ecosystem and the ElizaOS skills marketplace through the installed ElizaOS package surface. Doolittle should prefer exported SDK helpers from `@elizaos/autonomous` and `@elizaos/agent`, plus native skill manifests from `@elizaos/skills`, instead of importing unavailable top-level plugin packages directly. + +**Where it lives:** +- MCP marketplace helpers: `@elizaos/autonomous/services/mcp-marketplace` +- Skill marketplace helpers: `@elizaos/autonomous/services/skill-marketplace` +- Agent registry and skill catalog clients: `@elizaos/agent/services/registry-client`, `@elizaos/agent/services/skill-catalog-client` +- Native skill file parsing and serialization: `@elizaos/skills` +- Doolittle MCP execution adapter: `packages/agent/src/services/mcp/` +- Doolittle skills hub: `packages/agent/src/services/skills-hub/` +- Research MCP: `ResearchMcpTool` type for deep research integration + +**Code changes needed:** +1. Keep local and generated skills in canonical `@elizaos/skills` frontmatter so Doolittle skill data stays portable. +2. Use `@elizaos/autonomous/services/mcp-marketplace` for marketplace search, details, and config generation. +3. Use `@elizaos/autonomous/services/skill-marketplace` and `@elizaos/agent` catalog clients for marketplace/catalog discovery instead of local scraping. +4. Keep Doolittle's local MCP execution service as the product adapter until an official MCP execution plugin is promoted to a direct top-level dependency. +5. Integrate MCP tools with the RESEARCH model type for deep research across internal knowledge bases. + +**Expected impact:** Extensible agent capabilities without code deployment. New tools, APIs, and knowledge sources can be connected at runtime via MCP. The skills marketplace enables community-contributed capabilities. + +--- + +### 16. dynamicPromptExecFromState Validation System + +**What it is:** A sophisticated prompt execution system with built-in validation codes, schema-based parsing, streaming support, and performance tracking. Uses UUID codes injected into prompts that the LLM must echo back -- if codes match, the LLM actually read and followed the prompt. Four validation levels from "trusted" (no codes) to "full" (start + end codes). + +**Where it lives:** +- Runtime method: `runtime.dynamicPromptExecFromState(args)` +- Schema: `SchemaRow[]` from `@elizaos/core/dist/types/state.d.ts` +- Options: `contextCheckLevel` (0-3), `maxRetries`, `retryBackoff`, `preferredEncapsulation` (json/xml) + +**Code changes needed:** +1. Define schemas for structured responses: + ```typescript + const schema: SchemaRow[] = [ + { name: "sentiment", type: "string", description: "positive/negative/neutral" }, + { name: "confidence", type: "number", description: "0.0 to 1.0" }, + { name: "reasoning", type: "string", description: "Why this sentiment" }, + ]; + ``` +2. Execute with validation: + ```typescript + const result = await runtime.dynamicPromptExecFromState({ + state: currentState, + params: { prompt: "Analyze sentiment of: {{recentMessages}}" }, + schema, + options: { + contextCheckLevel: 2, // Default: codes at start + modelSize: "small", + maxRetries: 2, + onStreamChunk: (chunk) => streamToClient(chunk), + }, + }); + ``` +3. Use level 3 (full validation) for critical operations where truncation detection matters. +4. Use level 0 for high-throughput, trusted model calls. + +**Expected impact:** Reliable structured LLM outputs with truncation detection. Eliminates silent failures where the LLM ignores parts of the prompt. Performance tracking per model+schema combination enables data-driven model selection. + +--- + +### 17. Advanced Sampling Controls + +**What it is:** Per-model-type configuration of all sampling parameters: temperature, top_p, top_k, min_p, seed, repetition_penalty, frequency_penalty, presence_penalty. Supports three-tier precedence: direct params > model-specific settings > default settings. + +**Where it lives:** +- Constants: `MODEL_SETTINGS` in `@elizaos/core/dist/types/model.d.ts` -- 90+ setting keys +- Character settings: `DEFAULT_TEMPERATURE`, `TEXT_SMALL_TEMPERATURE`, `OBJECT_LARGE_TOP_P`, etc. +- LLM Mode: `LLMMode.DEFAULT | SMALL | LARGE` for global model override + +**Code changes needed:** +1. Configure character settings for optimal sampling per model type: + ```json + { + "DEFAULT_TEMPERATURE": 0.7, + "TEXT_SMALL_TEMPERATURE": 0.5, + "TEXT_LARGE_TEMPERATURE": 0.7, + "OBJECT_SMALL_TEMPERATURE": 0.1, + "OBJECT_LARGE_TEMPERATURE": 0.2, + "TEXT_REASONING_SMALL_TEMPERATURE": 0.1, + "TEXT_REASONING_LARGE_TEMPERATURE": 0.1, + "DEFAULT_MAX_TOKENS": 4096, + "TEXT_LARGE_MAX_TOKENS": 8192, + "TEXT_REASONING_LARGE_MAX_TOKENS": 16384, + "DEFAULT_FREQUENCY_PENALTY": 0.1, + "DEFAULT_PRESENCE_PENALTY": 0.1 + } + ``` +2. Use `LLMMode` for cost management: + ```typescript + // Force all calls to use TEXT_SMALL for cost optimization + const runtime = new AgentRuntime({ character, llmMode: LLMMode.SMALL }); + ``` +3. Override per-call when needed (highest precedence): + ```typescript + await runtime.useModel(ModelType.TEXT_LARGE, { + prompt, + temperature: 0.0, // Overrides character settings + seed: 42, // Deterministic output + }); + ``` + +**Expected impact:** Fine-grained control over output quality, creativity, and cost. Reasoning models get low temperature for determinism. Object generation gets minimal temperature for schema compliance. Creative tasks get higher temperature. Seed support enables reproducible outputs for testing. + +--- + +## Implementation Roadmap Summary + +| Phase | Items | Effort (days) | Key Dependency | +|---|---|---|---| +| **Critical** | AwarenessRegistry, 4 Evaluators, RESEARCH model, TEXT_REASONING | 5-7 | OpenAI API key for RESEARCH, MemoryStorageProvider for evaluators | +| **High** | AgentEventService, Trajectories, Tasks, Relationships, OBJECT models, Prompt caching | 7-10 | Database adapter for task persistence | +| **Medium** | Triggers, Sandbox, Heartbeat, Tool hooks, MCP/Skills, Validation, Sampling | 10-14 | E2B API key for sandbox, MCP servers configured | + +## Architecture Notes + +- **PromptBatcher integration:** The autonomy service uses the prompt batcher (Option A) rather than task-based scheduling. The batcher's `minCycleMs` and background tick control autonomy timing. +- **Service discovery:** All services are accessed via `runtime.getService(ServiceType.X)`. Check availability with `runtime.hasService()` before use. +- **Plugin registration order matters:** Bootstrap plugin should load first (provides reflection evaluator), then model provider plugins, then advanced memory/planning. +- **Batched task scheduler:** For multi-agent deployments, `startTaskScheduler(adapter)` creates one timer for all runtimes instead of N timers doing N `getTasks()` calls. +- **Event system is dual-layer:** `EventType` enum events go through `runtime.emitEvent()` / `runtime.registerEvent()`. Agent events go through `AgentEventService.emit()` / `subscribe()`. They serve different purposes -- system lifecycle vs. observability. diff --git a/docs/elizaos-research.md b/docs/elizaos-research.md new file mode 100644 index 00000000..fef72519 --- /dev/null +++ b/docs/elizaos-research.md @@ -0,0 +1,92 @@ +# ElizaOS Research Notes + +This document captures framework-level findings that matter for keeping Doolittle aligned with the current ElizaOS 2.x architecture. + +## Package Status Observed On May 9, 2026 + +Current npm metadata is not lockstep across the ElizaOS package family, so Doolittle should pin package-by-package instead of assuming one shared version. + +| Package | npm `latest` | npm `alpha` | Doolittle strategy | +| --- | --- | --- | --- | +| `elizaos` | `1.7.2` | `2.0.0-alpha.535` | Use explicit alpha | +| `@elizaos/core` | `1.7.2` | `2.0.0-alpha.537` | Use explicit alpha | +| `@elizaos/agent` | `0.25.9` | `2.0.0-alpha.537` | Use explicit alpha | +| `@elizaos/skills` | `2.0.0-alpha.77` | `2.0.0-alpha.539` | Use explicit alpha | +| `@elizaos/autonomous` | `2.0.0-alpha.77` | `2.0.0-alpha.85` | Keep current alpha, because no newer alpha is published | +| `@elizaos/plugin-openai` | `1.6.0` | `2.0.0-alpha.537` | Use explicit alpha | +| `@elizaos/plugin-sql` | `1.7.2` | `2.0.0-alpha.20` | Keep workspace compatibility wrapper around the newest published alpha | + +Implications: + +- The 2.x runtime line still lives behind explicit alpha tags for the core runtime packages. +- Several official plugins have reached `2.0.0-alpha.537`, but some packages, such as SQL and autonomous, have their own latest available alpha. +- Workspace wrappers are still valuable where Doolittle needs compatibility patches or plugins that are not published as official npm packages. + +## Current Architecture Findings + +### 1. The New `ElizaOS` Orchestrator Is A Better Harness Boundary + +The current runtime docs show `ElizaOS` handling plugin resolution, multi-agent orchestration, `addAgents`, `startAgents`, `handleMessage`, streaming callbacks, events, and health checks. + +What that means for Doolittle: + +- Doolittle should keep shrinking toward a harness around ElizaOS runtime orchestration. +- Local CLI, gateway, browser, account linking, and diagnostics should wrap the runtime instead of becoming a parallel agent framework. +- The Doolittle value layer is operator ergonomics, provider/account bridges, native local execution, and harness policy. + +### 2. Runtime-Centered Design Is Still Correct + +ElizaOS is still centered around `AgentRuntime` and plugin-loaded runtime capabilities. + +What that means for Doolittle: + +- character, plugins, model settings, memory, and message processing should remain the center of the app +- HTTP, CLI, gateway, and scheduling layers should adapt into runtime messages and services +- app code should avoid duplicating runtime orchestration where the SDK now owns it + +### 3. Services Are The Native Long-Running Integration Model + +Official docs register services through plugins and expose them with `runtime.getService(...)`. + +Implication for Doolittle: + +- gateway lifecycles, browser/MCP bridges, platform adapters, account refreshers, and background coordination should continue moving into ElizaOS plugin services +- standalone app services should be treated as harness adapters unless they truly belong outside the runtime + +### 4. Plugins Are Broader Than Actions + +Current plugin docs cover actions, providers, evaluators, services, routes, events, and model handlers. + +Implication for Doolittle: + +- the Doolittle plugin surface should prefer native plugin components over app-only extension points +- plugin-provided routes may be a good fit for runtime-owned APIs +- model/provider wrappers should stay plugin-native so they can benefit from SDK routing and model selection + +## Application Direction For Doolittle + +### Good Current Alignment + +- runtime-centered bootstrapping +- custom Doolittle plugin for actions/providers/evaluators/models +- SQL-backed runtime initialization +- canonical message processing path for chat requests +- workspace wrappers where official package versions lag or Doolittle needs compatibility patches + +### Highest-Value Next Refactors + +1. Treat Doolittle as the harness around ElizaOS rather than a replacement agent runtime. +2. Evaluate replacing remaining bespoke runtime boot logic with the `ElizaOS` orchestrator where the alpha SDK now supports it cleanly. +3. Promote gateway lifecycle and account/provider bridges into real ElizaOS `Service` classes where they are still app-bound. +4. Move runtime-owned HTTP surfaces into plugin routes when the ownership boundary is clear. +5. Keep package audit/version tooling explicit about `latest` versus `alpha`, because npm dist-tags are mixed across the ecosystem. + +## Sources Consulted + +Primary sources: + +- ElizaOS core runtime docs: https://docs.elizaos.ai/runtime/core +- ElizaOS services docs: https://docs.elizaos.ai/runtime/services +- ElizaOS project docs: https://docs.elizaos.ai/projects/overview +- ElizaOS plugin reference: https://docs.elizaos.ai/plugins/reference +- npm package metadata via `npm view` for `elizaos`, `@elizaos/core`, `@elizaos/agent`, `@elizaos/skills`, `@elizaos/autonomous`, `@elizaos/plugin-openai`, and `@elizaos/plugin-sql` diff --git a/docs/module-structure-guidelines.md b/docs/module-structure-guidelines.md new file mode 100644 index 00000000..c524d7d9 --- /dev/null +++ b/docs/module-structure-guidelines.md @@ -0,0 +1,62 @@ +# Module Structure Guidelines + +This repo is converging on a folder-first layout with thin entrypoints. + +## Core rules + +- let the folder own the domain name + - inside `gateway/`, prefer `read-model.ts` over `gateway-read-model.ts` + - inside `services/media/`, prefer `inspection/service.ts` over `media-service-inspection.ts` +- keep top-level entry files orchestration-only + - acceptable entrypoint names: `index.ts`, `service.ts`, `route.ts`, `runtime.ts`, `cli.ts` + - push branching logic and formatting helpers into sibling modules or subfolders +- colocate tests with the modules they exercise + - prefer `foo.ts` + `foo.test.ts` in the same folder +- keep types in one obvious place per namespace + - prefer `types.ts` for a small surface + - prefer `types/` when the namespace has multiple type-only modules +- avoid compatibility facades in new work + - migrate callers to the canonical folder-owned module and remove the old shim once the slice is complete + +## Preferred patterns + +- domain folder with a stable entry surface + - `server/routes/identity.ts` + - `server/routes/identity/profiles.ts` +- service folder with decision-local helpers + - `services/trajectory/service/index.ts` + - `services/trajectory/latest-benchmark.ts` +- subdomain folders when a namespace has multiple seams + - `gateway/read/*` + - `runtime/native/service-bridge/transport-control.ts` + - `scripts/bootstrap/prompting/*` + +## Naming anti-patterns + +- repeating the folder name in every file + - `gateway/receive/replay.ts` + - `services/media/formatters/index.ts` + - `services/terminal/terminal-service-cloud-backends.ts` +- keep moved modules on their canonical folder paths: + - `gateway/runner/gateway-runner.ts` +- hybrid ownership for the same domain + - avoid keeping both `services/foo-service.ts` and `services/foo/*` as competing homes for new logic +- generic helper dumping grounds + - avoid `helpers.ts`, `utils.ts`, or `misc.ts` when the file can be named for a concrete responsibility +- duplicated namespace prefixes + - avoid names like `services/services-tools-dynamic-state.ts` + +## Current migration direction + +- prefer domain-first folders in `packages/agent/src/` +- keep only true process-root files at the top of `scripts/bootstrap/` +- migrate remaining flat `gateway-*` and `terminal-service-*` clusters toward owned folders with shorter filenames +- normalize service namespaces so each domain has one clear home + +## Review checklist + +- can a new reader guess where logic belongs from the folder name alone? +- does the filename add new meaning, or just repeat the folder? +- is the entry file mostly orchestration rather than implementation detail? +- are types and tests easy to find without searching? +- if a file moved, is the compatibility story explicit? diff --git a/docs/monorepo.md b/docs/monorepo.md new file mode 100644 index 00000000..e4b7b6aa --- /dev/null +++ b/docs/monorepo.md @@ -0,0 +1,66 @@ +# Monorepo Layout + +Doolittle is organized as a Bun workspace monorepo. + +## Workspace roles + +- root package + - workspace manifest, shared scripts, root docs, and top-level toolchain config +- `packages/agent` + - the primary Doolittle application source + - runtime, CLI, API, gateway, and product-specific services +- `packages/plugins` + - local Doolittle product plugins and provider bridge packages + - includes the consolidated Doolittle plugin plus first-party provider bridges such as `plugin-codex`, `plugin-claude-code`, `plugin-devin`, `plugin-elizacloud`, and `plugin-sql` +- `packages/skills` + - local Doolittle skill content and generated skills + - organized by category for discoverability (`identity/`, `memory/`, `productivity/`, `automation/`, `platform/`, `browser/`, `media/`, `research/`, `generated/`) +- `packages/characters` + - character definitions and persona data +## Boundary rules + +- keep product behavior in `packages/agent/src/` + - gateway orchestration + - operator flows + - ACP surfaces + - Doolittle identity and routing +- keep provider bridges and product plugin facets in `packages/plugins/*` + - avoid claiming official plugin workspaces unless they are actual workspace packages + - prefer direct ElizaOS SDK imports over local compatibility shims +- keep workspace-level documentation at the repo root and under `docs/` + +See [module-structure-guidelines.md](./module-structure-guidelines.md) for the naming and folder rules the repo is converging toward during the stabilization pass. + +## Validation + +Run the workspace quality pass from the repo root: + +```bash +bun run check +``` + +## Bootstrap flow + +For a fresh clone, use the Bun-first installer wrapper: + +```bash +bash scripts/install.sh +``` + +That script installs workspace dependencies, creates `.env` from `.env.example` if needed, and seeds the local runtime directories under `.doolittle/`. + +If you only need the bootstrap step again: + +```bash +bun run bootstrap +``` + +Useful workspace commands: + +```bash +bun run workspace:list +bun run lint:check +bun run typecheck +bun test +bun run build +``` diff --git a/docs/native-experience-ledger.md b/docs/native-experience-ledger.md new file mode 100644 index 00000000..98c3de44 --- /dev/null +++ b/docs/native-experience-ledger.md @@ -0,0 +1,32 @@ +# Doolittle Native Experience Ledger + +This ledger tracks the native experience gaps that still remain after the current gateway/API work. Items that are already present in Doolittle are called out briefly so the focus stays on the residual experience debt. + +## Covered In This Wave + +- Gateway supervision is now represented by live health, supervision, journal, history, and replay surfaces in [`packages/agent/src/gateway/runner/gateway-runner.ts`](../packages/agent/src/gateway/runner/gateway-runner.ts) and [`packages/agent/src/server.ts`](../packages/agent/src/server.ts). +- Inbox/outbox journaling is now persisted through gateway trace, delivery, attachment, and replay history in [`packages/agent/src/gateway/runner/gateway-runner.ts`](../packages/agent/src/gateway/runner/gateway-runner.ts), [`packages/agent/src/services/delivery-service.ts`](../packages/agent/src/services/delivery-service.ts), and [`packages/agent/src/services/gateway-session-service.ts`](../packages/agent/src/services/gateway-session-service.ts). +- Responses-style API transport is now present through [`packages/agent/src/services/api-transport-service.ts`](../packages/agent/src/services/api-transport-service.ts) and the `/v1/responses` routes in [`packages/agent/src/server.ts`](../packages/agent/src/server.ts). + +## Remaining Native Gaps + +| Experience claim | Reference surfaces | Doolittle surfaces | Status | Remaining native gap | +|---|---|---|---|---| +| Always-on gateway runtime supervision | `gateway/run.py`, `gateway/status.py`, `gateway/platforms/signal.py`, `gateway/platforms/matrix.py`, `gateway/platforms/whatsapp.py`, `gateway/platforms/homeassistant.py` | `packages/agent/src/gateway/runner/gateway-runner.ts`, `packages/agent/src/server.ts`, `packages/agent/src/gateway/platforms/base.ts` | Mostly covered | Doolittle now tracks supervision, heartbeat, and state snapshots, but it still needs stronger daemon-grade reconnect/restart behavior for long-lived native transports and cleaner adapter recovery semantics. | +| Inbox / outbox journaling and replay | `gateway/run.py`, `gateway/platforms/api_server.py`, `gateway/platforms/base.py`, `gateway/platforms/dingtalk.py`, `gateway/platforms/telegram.py`, `gateway/platforms/discord.py`, `gateway/platforms/matrix.py` | `packages/agent/src/gateway/runner/gateway-runner.ts`, `packages/agent/src/services/delivery-service.ts`, `packages/agent/src/services/gateway-session-service.ts`, `packages/agent/src/server.ts` | Mostly covered | The journal/replay path now exists, but Doolittle still needs attachment-aware transcript rewrite, richer per-platform journal retention, and native reply routing fidelity across every transport. | +| Transport UX details | `gateway/platforms/telegram.py`, `gateway/platforms/discord.py`, `gateway/platforms/matrix.py`, `gateway/platforms/dingtalk.py`, `gateway/platforms/whatsapp.py`, `gateway/platforms/signal.py`, `gateway/run.py` | `packages/agent/src/gateway/platforms/*.ts`, `packages/agent/src/gateway/runner/gateway-runner.ts`, `packages/agent/src/server.ts` | Partial | Doolittle supports reply/edit/progressive delivery metadata, but still needs more complete platform-native behavior for typing indicators, edit-in-place, voice memo routing, thread-aware continuity, and session-home delivery semantics. | +| Stateful OpenAI-compatible Responses API transport | `gateway/platforms/api_server.py` | `packages/agent/src/services/api-transport-service.ts`, `packages/agent/src/server.ts` | Mostly covered | Doolittle now persists `previous_response_id` and serves `/v1/responses`, but still needs stricter Responses schema fidelity, richer streamed event behavior, and deeper session continuity semantics. | +| Operator session controls | `cli.py`, `gateway/run.py` | `packages/agent/src/runtime/chat.ts`, `packages/agent/src/cli.ts`, `packages/agent/src/server.ts` | Partial | Doolittle has comparable operator surfaces, but still needs a denser live-control loop for retry, undo, rollback, resume, compress, title, home, voice, status, and usage as first-class gateway commands. | +| Home Assistant-style event source | `gateway/platforms/homeassistant.py` | `packages/agent/src/gateway/platforms/homeassistant-adapter/index.ts`, `packages/agent/src/gateway/runner/gateway-runner.ts`, `packages/agent/src/server.ts` | Partial | Doolittle has a Home Assistant adapter and event routing, but still needs complete daemon-source semantics with watch filters, sync loops, and REST reply delivery. | + +## Priority Local Follow-Ups + +1. Finish daemon-grade reconnect and recovery behavior for the enabled native transports. +2. Tighten journal semantics so replay, attachment retention, and transcript rewriting are platform-aware rather than just history-backed. +3. Close the last Responses API fidelity gaps around streaming shape, session continuity, and turn stitching. +4. Expand operator commands so the live gateway/session controls make `/retry`, `/undo`, `/compress`, `/usage`, and `/insights` feel first-class. +5. Deepen Home Assistant-style event-source lifecycle handling for watch, sync, and reply loops. + +## Current Read + +Doolittle now has the broad gateway/API shape. The remaining work is about native product fidelity: daemon recovery, journal semantics, Responses transport behavior, and platform-native live control. diff --git a/docs/operator-loop.md b/docs/operator-loop.md new file mode 100644 index 00000000..b1838da9 --- /dev/null +++ b/docs/operator-loop.md @@ -0,0 +1,117 @@ +# Doolittle Operator Loop + +Use this when you already have Doolittle installed and want the shortest truthful path to the daily flow. + +## The shape + +Doolittle has one runtime and a few ways to drive it: + +| Surface | Command | Use when | +|---|---|---| +| Plain shell | `doolittle` | Everyday conversation, approvals, slash commands, and live work | +| Cockpit | `doolittle cockpit` | Fullscreen observability and longer-running operator sessions | +| One-shot aliases | `doolittle status`, `doolittle tools`, `doolittle skills`, `doolittle runtime` | Fast orientation without opening the shell first | +| API | `doolittle api` | Scripted clients, editor integrations, and REST consumers | +| Gateway | `doolittle gateway` | Messaging transports, delivery flow, and gateway supervision | + +The important part is that these are not separate products. The shell, API, and gateway all sit on the same assembled runtime. + +## Daily loop + +The normal loop is: + +1. Start with `doolittle`. +2. Ask for work directly, or use `/status` if you need to orient first. +3. If you need capability discovery, use `doolittle tools`, `doolittle skills`, or `doolittle runtime`. +4. If you need transport operations or live delivery state, move into the gateway lane. +5. If something feels wrong, use `doolittle doctor` or `/doctor`. + +## Top-level aliases + +These are the fastest way to regain context: + +| Alias | Maps to | Use when | +|---|---|---| +| `doolittle status` | `/status` | Check readiness, hydration, and operator summary | +| `doolittle tools` | `/tools summary` by default | See the current tool surface quickly | +| `doolittle skills` | `/skills` by default | See installed, generated, and hub-backed skills | +| `doolittle runtime` | `/runtime status` by default | Inspect startup state, plugin inventory, and native ownership | + +If you stay inside the shell, the equivalent first commands are: + +- `/status` +- `/doctor` +- `/runtime status` +- `/tools summary` +- `/skills` + +## Runtime lane + +Use the runtime lane when you want to answer, "is the agent itself healthy and assembled correctly?" + +Start here: + +- `doolittle status` +- `doolittle runtime` +- `doolittle doctor` + +Or inside the shell: + +- `/status` +- `/runtime status` +- `/doctor` +- `/setup summary` + +API equivalents: + +- `GET /health` +- `GET /runtime/status` +- `GET /runtime/plugins` +- `GET /doctor` + +## Gateway lane + +Use the gateway lane when you want to answer, "are transports alive, routing, and delivering correctly?" + +Start here: + +- `doolittle gateway` +- `/gateway status` +- `/gateway state` +- `/gateway runtime` +- `/gateway trace` + +API equivalents: + +- `GET /gateway/health` +- `GET /gateway/runtime` +- `GET /gateway/state` +- `GET /gateway/trace` +- `GET /gateway/inbox` +- `GET /gateway/outbox` + +The gateway is part of the same runtime story, but it is a different operator concern than basic shell readiness. + +## Smallest truthful first-run check + +If you want the shortest "am I actually ready?" loop: + +1. `doolittle status` +2. `doolittle tools` +3. `doolittle runtime` +4. `doolittle doctor` if anything looks degraded +5. `doolittle gateway` only when you need transport operations + +## Recovery + +- Shell command missing: restart your terminal or invoke `~/.local/bin/doolittle`. +- Setup looks incomplete: run `doolittle setup`, then `doolittle doctor`. +- Runtime looks degraded: compare `doolittle status` with `doolittle runtime` to separate readiness from capability assembly. +- Gateway looks stale: `doolittle gateway stop`, then `doolittle gateway start`. + +## Next docs + +- [`README.md`](../README.md) for the full surface map +- [`quickstart.md`](./quickstart.md) for install-to-ready +- [`plugin-inventory.md`](./plugin-inventory.md) for truth about assembled plugin state +- [`operator-wow-contract.md`](./operator-wow-contract.md) for native operator acceptance scenarios and next implementation tasks diff --git a/docs/operator-wow-contract.md b/docs/operator-wow-contract.md new file mode 100644 index 00000000..b1661c1b --- /dev/null +++ b/docs/operator-wow-contract.md @@ -0,0 +1,585 @@ +# Operator Wow Contract + +This file is generated from the code-backed Doolittle operator wow contract. +Do not edit it by hand; run `bun run scripts/sync-doc-truth.ts --write`. + +## Product Thesis + +Doolittle should become an ElizaOS-native harness that feels as capable, reachable, and alive as a native ElizaOS operator without turning ElizaOS into a bespoke monolith. + +The contract is intentionally acceptance-led. Every pillar maps research signals to ElizaOS leverage, Doolittle runtime surfaces, concrete scenarios, current gaps, and the next implementation tasks. + +## Summary + +- Pillars: 8 +- Acceptance scenarios: 16 +- Implementation tasks: 16 + +## First Run To Working Assistant + +- Runtime ID: `first-run-to-working-assistant` +- Outcome: A new operator can install, configure, inspect readiness, and complete a first useful assistant turn without reading architecture docs. +- Doolittle surfaces: `bash scripts/install.sh`, `scripts/bootstrap.ts`, `doolittle status`, `doolittle doctor`, `GET /runtime/status` + +### Reference Signals + +- OpenClaw makes onboarding a product surface with `openclaw onboard`, daemon install, provider setup, dashboard launch, and a first chat. +- Doolittle keeps setup close to the terminal and exposes provider/model readiness through native CLI commands before deeper work starts. + +### ElizaOS Leverage + +- ElizaOS provider plugins own model connectivity instead of Doolittle inventing provider clients. +- ElizaOS runtime bootstrap and plugin assembly become the readiness source that Doolittle reports through shell, API, and gateway surfaces. + +### Acceptance Scenarios + +#### first-run-to-working-assistant.install-check + +- Surface: `installer` +- Current status: `partial` +- Trigger: Run `bash scripts/install.sh --check --yes` in a clean checkout. +- Required signals: + - Reports which files would be written without mutating them. + - Names provider, execution backend, gateway, and workspace decisions. + - Returns a nonzero exit only for a real setup blocker. +- Verification: + - Add an installer smoke test that asserts dry-run output contains `.env`, `.doolittle/settings.json`, and `.doolittle/gateway/gateway.json`. + - Run `bun test scripts/bootstrap-program.test.ts scripts/bootstrap/program/summary.test.ts`. + +#### first-run-to-working-assistant.first-chat + +- Surface: `plain CLI and API` +- Current status: `partial` +- Trigger: Run `doolittle status`, then `doolittle exec -p "status" --json` after onboarding. +- Required signals: + - Shows runtime readiness, configured model/provider, plugin hydration, and degraded surfaces separately. + - Uses the same runtime truth as `GET /runtime/status`. + - Does not claim a capability is ready when it is only installed. +- Verification: + - Add a one-shot invocation regression test for `status` and `exec --json` readiness shape. + - Run `bun test packages/agent/src/entrypoint/invocation.test.ts`. + +### Current Gaps + +- The installer and bootstrap path are strong but not yet scored against a five-minute first useful turn. +- Readiness output is broad, but the first-run path still needs one clear success transcript that is kept current by tests. + +### Next Implementation Tasks + +#### first-run-decision-receipt + +- Title: Add provider, backend, gateway, and workspace decisions to first-run receipts. +- Owner surface: `bootstrap` +- Files: `scripts/bootstrap/answers/review.ts`, `scripts/bootstrap/program/summary.ts`, `docs/quickstart.md` +- Definition of done: + - Check, headless, and completed onboarding receipts name provider, execution backend, gateway mode, and workspace root. + - The quickstart explains how to read the receipt and which fields prove first-run readiness. + - `bun test scripts/bootstrap-program.test.ts scripts/bootstrap/answers.test.ts` passes. + +#### first-chat-readiness-contract + +- Title: Make first chat readiness measurable across CLI and API. +- Owner surface: `runtime status` +- Files: `packages/agent/src/entrypoint/invocation.test.ts`, `packages/agent/src/services/operator/runtime-summary/update.test.ts`, `docs/operator-loop.md` +- Definition of done: + - `doolittle status` and `GET /runtime/status` expose the same provider, plugin, gateway, and degraded-mode fields. + - The operator loop doc points to the same readiness fields. + - `bun test packages/agent/src/entrypoint/invocation.test.ts packages/agent/src/services/operator/runtime-summary/update.test.ts` passes. + +## Terminal Operator Loop + +- Runtime ID: `terminal-operator-loop` +- Outcome: The everyday shell feels like a live operator console: multiline chat, slash control, shell shortcuts, streaming tool progress, interruption, and recovery. +- Doolittle surfaces: `packages/agent/src/runtime/chat.ts`, `packages/agent/src/cli.ts`, `packages/agent/src/cli/shell-chrome.ts`, `packages/agent/src/cli/tui-renderers.test.ts` + +### Reference Signals + +- Doolittle creates trust with a dense terminal loop: streaming tool output, slash commands, approvals, interrupts, model switching, and resumable sessions. +- OpenClaw keeps chat commands such as `/status`, `/compact`, `/usage`, `/trace`, `/verbose`, and `/restart` available from chat surfaces. + +### ElizaOS Leverage + +- ElizaOS message handling remains the natural-language route; Doolittle owns shell chrome and operator commands. +- ElizaOS events and services provide action progress that the CLI and cockpit render without fabricating steps. + +### Acceptance Scenarios + +#### terminal-operator-loop.command-deck + +- Surface: `plain CLI` +- Current status: `partial` +- Trigger: Start `doolittle`, run `/status`, `/tools summary`, `/runtime status`, `/doctor`, and `/gateway status`. +- Required signals: + - Every command returns a compact operator result without leaving the runtime lane. + - Degraded components are named separately from ready components. + - The command deck includes retry, undo, compress, usage, insights, and model controls once implemented. +- Verification: + - Add command parser tests for each slash command and expected route. + - Run `bun test packages/agent/src/runtime/chat.test.ts packages/agent/src/cli/tui-renderers.test.ts`. + +#### terminal-operator-loop.interrupt-and-resume + +- Surface: `plain CLI and cockpit` +- Current status: `missing` +- Trigger: Start a long-running tool turn, send a steering message, then resume or stop the run. +- Required signals: + - The UI shows the active run id, active tool, and last observed progress. + - Stop and resume affect the real run controller state. + - The final transcript records whether the run completed, stopped, or was superseded. +- Verification: + - Add run-controller tests for stop, steering, and resume transitions. + - Run `bun test packages/agent/src/runtime/chat-turn packages/agent/src/cli`. + +### Current Gaps + +- Doolittle has useful shell and cockpit surfaces, but live session controls still need first-class retry, undo, compress, usage, and insights behavior. +- Interrupt and steering behavior is not yet expressed as a first-class acceptance contract. + +### Next Implementation Tasks + +#### operator-command-surface + +- Title: Promote retry, undo, compress, usage, insights, and model controls into first-class slash commands. +- Owner surface: `operator shell` +- Files: `packages/agent/src/runtime/chat.ts`, `packages/agent/src/runtime/chat-turn/provider-handler.ts`, `packages/agent/src/cli/shell-chrome.ts`, `docs/operator-loop.md` +- Definition of done: + - Each command has parser coverage and a compact operator response. + - Commands that need unavailable runtime support return a truthful degraded response. + - `bun test packages/agent/src/runtime packages/agent/src/cli` passes. + +#### run-interrupt-contract + +- Title: Make stop, steering, and resume transitions visible and test-backed. +- Owner surface: `run controller` +- Files: `packages/agent/src/runtime/chat-turn`, `packages/agent/src/runtime/run-controller`, `packages/agent/src/cli/tui-renderers.test.ts` +- Definition of done: + - Active runs expose id, state, active tool, and last progress timestamp. + - Stopping a run records an explicit terminal state in the transcript. + - Steering messages are queued or injected according to a documented policy. + +## Real Tools And Coding + +- Runtime ID: `real-tools-and-coding` +- Outcome: Doolittle can inspect, edit, test, review, and explain a repository with the same reliability expected from a daily coding agent. +- Doolittle surfaces: `packages/plugins/doolittle-plugin/coding-agent`, `packages/plugins/doolittle-plugin/autocoder`, `packages/agent/src/runtime/native/service-bridge/tooling`, `packages/agent/src/runtime/native/service-bridge/autocoder` + +### Reference Signals + +- Doolittle earns confidence through reliable terminal backends, file tools, browser tools, approvals, MCP, and delegation. +- OpenClaw showcases chat-native coding loops where work starts in a mobile channel and lands as tested changes or PR feedback. + +### ElizaOS Leverage + +- ElizaOS actions and services should own tool availability; Doolittle contributes coding context, approval policy, and verification rituals. +- ElizaOS skills should teach tool use for repo-specific workflows instead of hardcoding every procedure into the agent loop. + +### Acceptance Scenarios + +#### real-tools-and-coding.repo-fix + +- Surface: `coding agent` +- Current status: `partial` +- Trigger: Ask Doolittle to fix a focused failing test in the current workspace. +- Required signals: + - Searches before editing. + - Applies a minimal patch. + - Runs the targeted failing test and a relevant passing verification. + - Summarizes files changed and verification results. +- Verification: + - Add a fixture repository with one failing test and one expected patch. + - Run a deterministic coding-agent smoke test against that fixture. + +#### real-tools-and-coding.review-loop + +- Surface: `review command` +- Current status: `missing` +- Trigger: Ask Doolittle to review a diff and provide correctness risks before summary. +- Required signals: + - Findings lead the response. + - File and line references are included for every actionable issue. + - No issue is reported when the diff is clean and verified. +- Verification: + - Add review fixture tests with one known bug and one clean diff. + - Run `bun test packages/plugins/doolittle-plugin/coding-agent`. + +### Current Gaps + +- Autocoder surfaces are explicitly planning-first; they should not be marketed as production-grade mutation until fixture-backed edits exist. +- Coding-agent behavior needs deterministic fixtures for edit, test, review, and rollback flows. + +### Next Implementation Tasks + +#### coding-fixture-harness + +- Title: Create a deterministic coding fixture harness. +- Owner surface: `coding agent` +- Files: `packages/plugins/doolittle-plugin/coding-agent/runtime.ts`, `packages/plugins/doolittle-plugin/coding-agent/service.ts`, `packages/plugins/doolittle-plugin/coding-agent/index.test.ts` +- Definition of done: + - The fixture starts with a known failing test and ends with a known passing test. + - The service reports search, patch, and verification events separately. + - The final response includes changed files and commands run. + +#### review-fixture-harness + +- Title: Add PR-style review fixtures that enforce findings-first output. +- Owner surface: `coding agent review` +- Files: `packages/plugins/doolittle-plugin/coding-agent/runtime.ts`, `packages/plugins/doolittle-plugin/coding-agent/index.test.ts`, `docs/operator-loop.md` +- Definition of done: + - A buggy fixture produces one finding with a file and line. + - A clean fixture produces an explicit no-findings response. + - The review docs match the tested output order. + +## Memory Learning And Skills + +- Runtime ID: `memory-learning-skills` +- Outcome: Doolittle gets better with use by recalling durable preferences, finding past sessions, and proposing approved skills for repeated workflows. +- Doolittle surfaces: `packages/agent/src/runtime/native/memory-storage-runtime.ts`, `packages/agent/src/runtime/native/service-bridge/autonomous-skills.ts`, `packages/skills`, `docs/skills-hub.md` + +### Reference Signals + +- Doolittle makes learning visible through memory files, session search, skill creation, and skill improvement loops. +- OpenClaw's Skill Workshop pattern treats new skills as proposals that can be scanned, approved, and refreshed without a restart. + +### ElizaOS Leverage + +- ElizaOS evaluators and memory providers should capture durable facts after turns. +- @elizaos/skills should remain the skill format and loading engine, while Doolittle owns approval and workspace placement. + +### Acceptance Scenarios + +#### memory-learning-skills.preference-recall + +- Surface: `memory` +- Current status: `partial` +- Trigger: Tell Doolittle a durable preference, start a new session, then ask a related question. +- Required signals: + - The preference is stored in a durable memory surface. + - The next session can recall it without the user restating it. + - The response distinguishes memory from live facts. +- Verification: + - Add a memory persistence test that writes, restarts the memory runtime, and retrieves the preference. + - Run `bun test packages/agent/src/runtime/native/memory-storage-runtime.test.ts`. + +#### memory-learning-skills.skill-proposal + +- Surface: `skills` +- Current status: `missing` +- Trigger: Ask Doolittle to remember a repeatable workflow as a skill after it has completed the workflow once. +- Required signals: + - Produces a `SKILL.md` proposal with name, description, and instructions. + - Scans or labels risk before writing to workspace skills. + - Refreshes the skill inventory after approval. +- Verification: + - Add a skill synthesis test with a generated skill proposal and approval gate. + - Run `bun test packages/agent/src/runtime/native/service-bridge/autonomous-skills.test.ts`. + +### Current Gaps + +- Memory storage exists, but active recall and post-turn learning are not yet measured by product-level acceptance scenarios. +- Skill synthesis is documented as a Doolittle aim, but approval, scan, write, and refresh behavior need a real harness. + +### Next Implementation Tasks + +#### durable-memory-recall + +- Title: Add a cross-session durable memory recall test. +- Owner surface: `memory` +- Files: `packages/agent/src/runtime/native/memory-storage-runtime.ts`, `packages/agent/src/runtime/native/memory-storage-runtime.test.ts`, `docs/operator-loop.md` +- Definition of done: + - A saved preference survives runtime recreation. + - Recall metadata says where the memory came from. + - The operator docs explain how to inspect and correct memory. + +#### approved-skill-workshop + +- Title: Build the approved skill proposal path. +- Owner surface: `skills` +- Files: `packages/agent/src/runtime/native/service-bridge/autonomous-skills.ts`, `packages/agent/src/runtime/native/service-bridge/autonomous-skills.test.ts`, `docs/skills-hub.md` +- Definition of done: + - Skill proposals are written only after explicit approval or a configured trusted mode. + - Unsafe proposal content is rejected or quarantined. + - The generated skill appears in the next skill inventory snapshot. + +## Gateway Everywhere Presence + +- Runtime ID: `gateway-everywhere-presence` +- Outcome: Doolittle can be reached from trusted messaging channels and keeps delivery, threads, attachments, and recovery visible. +- Doolittle surfaces: `packages/agent/src/gateway/runner/gateway-runner.ts`, `packages/agent/src/gateway/platforms`, `packages/plugins/doolittle-plugin/gateway-service.ts`, `packages/agent/src/server.ts` + +### Reference Signals + +- Doolittle needs broad messaging adapters and a mature gateway/session delivery loop. +- OpenClaw pushes this further with local-first gateway, pairing, many channels, nodes, device trust, dashboard, and channel-native behavior. + +### ElizaOS Leverage + +- ElizaOS services should host long-lived gateway adapters and expose routes for read/control planes. +- Doolittle should keep transport UX and security policy in the harness, not inside the model prompt. + +### Acceptance Scenarios + +#### gateway-everywhere-presence.paired-dm + +- Surface: `gateway` +- Current status: `partial` +- Trigger: Send a message from a paired Telegram or Discord identity to the Doolittle gateway. +- Required signals: + - Authorization decision is logged. + - Session key is stable for the channel peer. + - Typing/progress/final delivery behavior is platform-aware. +- Verification: + - Add mocked platform adapter tests for authorization, session binding, and final delivery. + - Run `bun test packages/agent/src/gateway`. + +#### gateway-everywhere-presence.reconnect-replay + +- Surface: `gateway runner` +- Current status: `partial` +- Trigger: Restart a running gateway while messages are queued or delivery is in progress. +- Required signals: + - The runner records supervision state before and after restart. + - Queued outbound messages are replayed or marked failed with a reason. + - Attachment retention and transcript rewrite policy are explicit. +- Verification: + - Add runner tests for restart, replay, and failed delivery state. + - Run `bun test packages/agent/src/gateway/gateway-supervision-flow.test.ts packages/agent/src/gateway/runner`. + +### Current Gaps + +- Doolittle has gateway surfaces, but OpenClaw leads on channel breadth, device pairing, and platform-native polish. +- Replay and attachment semantics need stricter tests before the gateway can be treated as always-on. + +### Next Implementation Tasks + +#### gateway-daemon-recovery + +- Title: Tighten daemon-grade reconnect and replay semantics. +- Owner surface: `gateway runner` +- Files: `packages/agent/src/gateway/runner/gateway-runner.ts`, `packages/agent/src/gateway/gateway-supervision-flow.test.ts`, `docs/native-experience-ledger.md` +- Definition of done: + - Restart scenarios preserve or explicitly fail queued work. + - Replay entries include platform, target, idempotency key, and delivery state. + - The native experience ledger names remaining platform-specific gaps only. + +#### channel-native-polish + +- Title: Make platform-native message behavior testable per adapter. +- Owner surface: `gateway adapters` +- Files: `packages/agent/src/gateway/platforms`, `packages/agent/src/gateway/receive/setup.test.ts`, `docs/native-experience-ledger.md` +- Definition of done: + - Each enabled adapter declares typing, edit, reply, thread, attachment, and voice support. + - Mock tests assert the declared support is reflected in delivery behavior. + - Unsupported capabilities produce explicit degraded metadata. + +## Automation And Daily Tasks + +- Runtime ID: `automation-and-daily-tasks` +- Outcome: Doolittle can run scheduled work, short follow-ups, standing orders, and daily briefings with observable delivery. +- Doolittle surfaces: `packages/plugins/doolittle-plugin/scheduler-service.ts`, `packages/agent/src/server.ts`, `packages/agent/src/services/gateway-session-service.ts`, `docs/operator-loop.md` + +### Reference Signals + +- Doolittle cron jobs create fresh sessions, inject skills, execute prompts, and deliver results to configured platforms. +- OpenClaw separates cron, heartbeat, standing orders, webhooks, polling, and taskflow so daily automation feels intentional. + +### ElizaOS Leverage + +- ElizaOS task workers can own recurring or background execution. +- Doolittle scheduler and gateway services should translate task results into operator-visible delivery. + +### Acceptance Scenarios + +#### automation-and-daily-tasks.daily-brief + +- Surface: `scheduler` +- Current status: `missing` +- Trigger: Create a daily briefing job that summarizes tasks, calendar-like notes, and repo status into a target channel. +- Required signals: + - The job has a stable id, schedule, next run, last run, and delivery target. + - Execution starts a bounded agent turn. + - Delivery result is recorded in gateway history. +- Verification: + - Add scheduler tests for due job execution and delivery recording. + - Run `bun test packages/plugins/doolittle-plugin/scheduler-service.test.ts packages/agent/src/gateway`. + +#### automation-and-daily-tasks.short-followup + +- Surface: `heartbeat` +- Current status: `missing` +- Trigger: Ask Doolittle to check back in 30 minutes on the current thread. +- Required signals: + - Creates a thread-bound follow-up instead of a detached cron job. + - Preserves the current session route. + - Can be listed, paused, or canceled from operator commands. +- Verification: + - Add heartbeat tests for thread-bound follow-up creation and cancellation. + - Run the scheduler and gateway session tests together. + +### Current Gaps + +- Scheduler service exists, but the product contract for daily tasks, standing orders, and thread heartbeats is not yet test-backed. +- Automation delivery should be visible in the same gateway/session history used by normal messages. + +### Next Implementation Tasks + +#### scheduler-task-contract + +- Title: Define and test scheduled task lifecycle fields. +- Owner surface: `scheduler service` +- Files: `packages/plugins/doolittle-plugin/scheduler-service.ts`, `packages/plugins/doolittle-plugin/scheduler-service.test.ts`, `docs/operator-loop.md` +- Definition of done: + - Jobs expose id, schedule, nextRun, lastRun, status, target, and lastDelivery. + - Due jobs run bounded turns and record delivery outcomes. + - Operator docs include create, list, pause, resume, cancel, and inspect flows. + +#### thread-heartbeat-contract + +- Title: Add short follow-up and thread heartbeat semantics. +- Owner surface: `scheduler and gateway session` +- Files: `packages/plugins/doolittle-plugin/scheduler-service.ts`, `packages/agent/src/services/gateway-session-service.ts`, `packages/agent/src/runtime/chat.ts` +- Definition of done: + - Short follow-ups are attached to the current session route by default. + - Heartbeat entries can be canceled before firing. + - Delivery writes back into the originating thread or a clearly configured fallback. + +## Model Provider Freedom + +- Runtime ID: `model-provider-freedom` +- Outcome: Operators can connect, inspect, switch, and fail over among model providers without losing runtime clarity. +- Doolittle surfaces: `packages/agent/src/runtime/native/account-auth`, `packages/agent/src/runtime/linked-provider-accounts/messages.ts`, `packages/plugins/doolittle-plugin/model-fallback.ts`, `packages/agent/src/services/operator/version.ts` + +### Reference Signals + +- Doolittle emphasizes provider breadth, OAuth/setup flows, runtime provider resolution, model switching, and fallback chains. +- OpenClaw treats models as a first-class concept with provider docs, failover, auth profiles, and provider-specific media behavior. + +### ElizaOS Leverage + +- ElizaOS provider plugins should own model handlers and auth expectations, including the official Ollama plugin for local/self-hosted inference. +- Doolittle should expose provider readiness, linked account state, model choice, and fallback decisions in operator surfaces. + +### Acceptance Scenarios + +#### model-provider-freedom.model-switch + +- Surface: `operator shell` +- Current status: `partial` +- Trigger: Run `/model list`, switch to another configured provider/model, then run a simple prompt. +- Required signals: + - The list shows provider, model, auth state, context hints, and degraded reasons. + - The switch updates the active runtime selection for the session. + - The next run records which provider/model was used. +- Verification: + - Add parser and runtime summary tests for model list and switch responses. + - Run `bun test packages/agent/src/runtime/native/account-auth packages/plugins/doolittle-plugin/model-fallback.test.ts`. + +#### model-provider-freedom.failover + +- Surface: `model fallback` +- Current status: `partial` +- Trigger: Simulate a primary provider failure with a configured fallback provider. +- Required signals: + - The failure reason is recorded. + - Fallback selection is explicit. + - The final response names the provider actually used when verbose diagnostics are enabled. +- Verification: + - Add fallback tests for rate limit, auth failure, and provider unavailable cases. + - Run `bun test packages/plugins/doolittle-plugin/model-fallback.test.ts`. + +### Current Gaps + +- Provider package versions are current and the bootstrap is local-first on Ollama, but the operator model command surface needs to feel as direct as the rest of Doolittle. +- Fallback behavior exists but should be visible at run level, not only as internal configuration. + +### Next Implementation Tasks + +#### model-command-deck + +- Title: Add model list, switch, current, and doctor commands. +- Owner surface: `operator shell and account auth` +- Files: `packages/agent/src/runtime/chat.ts`, `packages/agent/src/runtime/native/account-auth`, `packages/agent/src/services/operator/runtime-summary/update.test.ts` +- Definition of done: + - Operators can see all configured providers and degraded reasons. + - Session model switch changes the next run without editing config by hand. + - Doctor output suggests the exact provider setup command or env var needed. + +#### run-level-provider-proof + +- Title: Record provider and fallback proof on every run. +- Owner surface: `run metadata` +- Files: `packages/plugins/doolittle-plugin/model-fallback.ts`, `packages/agent/src/runtime/chat-turn/provider-handler.ts`, `packages/agent/src/cli/tui-renderers.test.ts` +- Definition of done: + - Run summaries include requested provider, resolved provider, fallback provider, and failure reason when applicable. + - Verbose progress surfaces show fallback decisions once. + - Tests cover successful primary and fallback execution metadata. + +## Observability Safety And Proof + +- Runtime ID: `observability-safety-proof` +- Outcome: Doolittle shows what it did, why it was allowed, what changed, what failed, and what remains risky. +- Doolittle surfaces: `packages/agent/src/services/diagnostics`, `packages/agent/src/services/operator/runtime-summary`, `packages/agent/src/runtime/native/service-bridge/tool-policy.ts`, `scripts/check-repo-hygiene.ts` + +### Reference Signals + +- Doolittle uses callbacks, approvals, session state, and trajectory-style records to make work inspectable. +- OpenClaw treats security defaults, pairing, audit checks, tool policies, and gateway auth as product surfaces. + +### ElizaOS Leverage + +- ElizaOS event streams, evaluators, services, and routes should provide the raw runtime evidence. +- Doolittle should render the evidence into operator summaries, doctor output, and acceptance artifacts. + +### Acceptance Scenarios + +#### observability-safety-proof.run-receipt + +- Surface: `run summary` +- Current status: `partial` +- Trigger: Run a multi-tool task that reads, writes, and verifies a file. +- Required signals: + - Summary includes tools used, files changed, approvals requested, commands run, and verification commands. + - Failures are reported as failures, not converted into vague next steps. + - The transcript can be inspected by run id. +- Verification: + - Add a fixture task that produces a run receipt with read, write, command, and verification entries. + - Run `bun test packages/agent/src/services/operator/runtime-summary`. + +#### observability-safety-proof.security-audit + +- Surface: `doctor and audit` +- Current status: `partial` +- Trigger: Expose a gateway or tool policy misconfiguration and run `doolittle doctor`. +- Required signals: + - Doctor reports the exact unsafe setting. + - The report distinguishes personal trusted mode from shared or remote exposure. + - The suggested fix names the config path to change. +- Verification: + - Add diagnostics tests for open gateway auth, permissive exec, and unpaired messaging access. + - Run `bun test packages/agent/src/services/diagnostics`. + +### Current Gaps + +- Doolittle has diagnostics and runtime summaries, but run receipts are not yet the normal final artifact after meaningful work. +- Security posture should be as visible as capability posture, especially for gateway and tool exposure. + +### Next Implementation Tasks + +#### run-receipt-standard + +- Title: Standardize run receipts for multi-tool work. +- Owner surface: `runtime summary` +- Files: `packages/agent/src/services/operator/runtime-summary/update.test.ts`, `packages/agent/src/services/operator/runtime-summary/ownership.test.ts`, `packages/agent/src/runtime/chat-turn/provider-handler.ts` +- Definition of done: + - Run summaries list tools, changed files, commands, approvals, verification, and unresolved risks. + - The final answer can reference the run receipt without dumping raw logs. + - Tests cover success, partial failure, and blocked approval cases. + +#### security-doctor-contract + +- Title: Add security posture findings to doctor output. +- Owner surface: `diagnostics` +- Files: `packages/agent/src/services/diagnostics`, `packages/agent/src/runtime/native/service-bridge/tool-policy.ts`, `docs/operator-loop.md` +- Definition of done: + - Doctor flags open gateway auth, broad exec policy, and shared channel exposure. + - Each finding includes severity, config path, and a concrete remediation. + - Personal trusted-mode warnings are labeled differently from public-exposure blockers. diff --git a/docs/plugin-inventory.md b/docs/plugin-inventory.md new file mode 100644 index 00000000..18f9c416 --- /dev/null +++ b/docs/plugin-inventory.md @@ -0,0 +1,30 @@ +# Plugin Inventory + +This file is generated from the native runtime plugin catalog plus workspace package inspection. +Do not edit it by hand; run `bun run scripts/sync-doc-truth.ts --write`. + +Canonical runtime source: `@/runtime/native/plugin-catalog.ts`. + +| Runtime ID | Package | Category | Kind | Maturity | Persistence | Source | Workspace Path | Owner | Publish Intent | Tests | Notes | +| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | +| foundation.agent | @elizaos/agent | foundation | vendored | alpha | none | official | (external) | upstream | upstream-dependency | external | Standalone Eliza agent package used for native runtime and ecosystem alignment. | +| foundation.autonomous | @elizaos/autonomous | foundation | vendored | alpha | none | official | (external) | upstream | upstream-dependency | external | Selective architectural source for native Eliza alignment. | +| foundation.skills | @elizaos/skills | foundation | vendored | alpha | none | official | (external) | upstream | upstream-dependency | external | First-party skills package used for native stack alignment. | +| providers.sql | @elizaos/plugin-sql | providers | provider | production | none | official | packages/plugins/plugin-sql | doolittle-runtime | public-provider-bridge | covered | Primary SQL persistence plugin on the current runtime line. | +| providers.pdf | @elizaos/plugin-pdf | providers | provider | production | none | official | (external) | upstream | upstream-dependency | external | Official PDF ingestion plugin. | +| providers.elizacloud | @elizaos/plugin-elizacloud | providers | provider | alpha | none | custom | packages/plugins/plugin-elizacloud | doolittle-runtime | public-provider-bridge | covered | Workspace-native Eliza Cloud provider plugin for managed ElizaOS inference and cloud-native defaults. | +| providers.ollama | @elizaos/plugin-ollama | providers | provider | alpha | none | official | (external) | upstream | upstream-dependency | external | Official local/self-hosted Ollama provider for offline text, object, and embedding model routing. | +| providers.codex | @elizaos/plugin-codex | providers | provider | alpha | none | custom | packages/plugins/plugin-codex | doolittle-runtime | public-provider-bridge | covered | Workspace-native Codex provider plugin for ChatGPT-backed Codex workflows. | +| providers.claude-code | @elizaos/plugin-claude-code | providers | provider | alpha | none | custom | packages/plugins/plugin-claude-code | doolittle-runtime | public-provider-bridge | covered | Workspace-native Claude Code provider plugin for Claude-native workflows. | +| providers.devin | @elizaos/plugin-devin | providers | provider | alpha | none | custom | packages/plugins/plugin-devin | doolittle-runtime | public-provider-bridge | covered | Workspace-native Devin CLI provider plugin for SWE model workflows. | +| providers.openai | @elizaos/plugin-openai | providers | provider | production | none | official | (external) | upstream | upstream-dependency | external | Official OpenAI provider plugin. | +| providers.anthropic | @elizaos/plugin-anthropic | providers | provider | production | none | official | (external) | upstream | upstream-dependency | external | Official Anthropic provider plugin. | +| messaging.telegram | @elizaos/plugin-telegram | messaging | adapter | alpha | none | official | (external) | upstream | upstream-dependency | external | Official Telegram transport plugin. | +| research.action-bench | @doolittle/plugin-action-bench | research | vendored | alpha | none | vendored | packages/plugins/doolittle-plugin | doolittle-runtime | vendored-workspace-package | covered | Workspace-native benchmark plugin for evaluation and coverage drills. | +| research.autocoder | @doolittle/plugin-autocoder | research | adapter | experimental | injected | vendored | packages/plugins/doolittle-plugin | doolittle-runtime | internal-adapter | covered | Workspace-native autocoder plugin for research, planning, GitHub, and secrets-backed workflows. Execution remains experimental and planning-only flows are explicitly non-mutating. | +| execution.local-sandbox | @doolittle/plugin-local-sandbox | execution | adapter | alpha | none | custom | packages/plugins/doolittle-plugin | doolittle-runtime | internal-adapter | covered | Doolittle local sandbox service with E2B-compatible methods for autocoder support. | +| execution.forms | @doolittle/plugin-forms | execution | adapter | alpha | injected | custom | packages/plugins/doolittle-plugin | doolittle-runtime | internal-adapter | covered | Doolittle forms adapter used by autocoder and guided workflow flows. Consolidated into doolittle-plugin. | +| execution.coding-agent | @doolittle/plugin-coding-agent | execution | adapter | alpha | none | custom | packages/plugins/doolittle-plugin | doolittle-runtime | internal-adapter | covered | Doolittle coding agent service bridging workspace, repository, shell, and delegation. Consolidated into doolittle-plugin. | +| execution.agent-orchestrator | @doolittle/plugin-agent-orchestrator | execution | adapter | alpha | none | custom | packages/plugins/doolittle-plugin | doolittle-runtime | internal-adapter | covered | Doolittle delegation orchestrator with supervision and queue management. Consolidated into doolittle-plugin. | +| execution.planning | @doolittle/plugin-planning | execution | adapter | alpha | injected | custom | packages/plugins/doolittle-plugin | doolittle-runtime | internal-adapter | covered | Doolittle planning adapter linking native delegation tasks and workflow graphs. Consolidated into doolittle-plugin. | +| product.doolittle-runtime | doolittle-runtime | product | adapter | alpha | injected | custom | packages/plugins/doolittle-plugin | doolittle-runtime | internal-product-layer | covered | Product-specific Doolittle runtime layer. | diff --git a/docs/quickstart.md b/docs/quickstart.md new file mode 100644 index 00000000..867ed7c3 --- /dev/null +++ b/docs/quickstart.md @@ -0,0 +1,148 @@ +# Doolittle Quickstart + +Use this as the default path from install to reliable first command. + +## 1) Bootstrap once + +```bash +bash scripts/install.sh +``` + +This performs dependency install, creates missing defaults, and launches the onboarding flow. + +The default mind is local Ollama through the official ElizaOS Ollama plugin. For a live first prompt, make sure Ollama is running, then pull the default models: + +```bash +ollama pull granite4.1:3b +ollama pull nomic-embed-text:latest +``` + +If Ollama is not already running as an app or service, start `ollama serve` in another terminal before the first live prompt. + +The bootstrap writes `OLLAMA_API_ENDPOINT`, `OLLAMA_SMALL_MODEL`, `OLLAMA_LARGE_MODEL`, and `OLLAMA_EMBEDDING_MODEL` into `.env`. You can still choose Eliza Cloud, Codex, Claude Code, OpenAI, or Anthropic in `doolittle setup`, but the no-key path is local-first now. + +If you need a non-interactive pass, use: + +```bash +bash scripts/install.sh --headless +bash scripts/install.sh --skip-wizard +bash scripts/install.sh --check +bash scripts/install.sh --yes +``` + +`--check` is the dry-run receipt. It reports the directories and files that setup +would touch, including `.env`, `.doolittle/settings.json`, +`.doolittle/gateway/gateway.json`, `.doolittle/onboarding.json`, and +`.doolittle/onboarding.state.json`. + +If install reports PATH changes, open a new terminal before first run. + +## 2) Start and verify immediately + +```bash +doolittle +``` + +You should land in the plain interactive CLI by default. + +Run these health checks: + +```text +/status +/doctor +/runtime status +/setup checklist +``` + +From API mode: + +```bash +curl http://localhost:3000/health +curl http://localhost:3000/runtime/status +curl http://localhost:3000/runtime/plugins +``` + +If these all return and report readiness, the product boundary is active. + +## 3) Learn the operator shape quickly + +Doolittle has one runtime and a few ways to drive it: + +| Surface | Command | Use when | +|---|---|---| +| Plain shell | `doolittle` | Everyday work, approvals, and slash commands | +| Cockpit | `doolittle cockpit` | Fullscreen observability | +| Runtime check-ins | `doolittle status`, `doolittle tools`, `doolittle skills`, `doolittle runtime` | Fast orientation without opening the shell first | +| API | `doolittle api` | REST and scripted clients | +| Gateway | `doolittle gateway` | Messaging transports and delivery ops | + +The top-level aliases are shortcuts onto the same runtime surfaces: + +| Alias | Default mapping | +|---|---| +| `doolittle status` | `/status` | +| `doolittle tools` | `/tools summary` | +| `doolittle skills` | `/skills` | +| `doolittle runtime` | `/runtime status` | + +For the daily shell rhythm in one place, use [`operator-loop.md`](./operator-loop.md). + +## 4) Surface quick reference + +### Shell-level entrypoints + +| Goal | Command | +|---|---| +| Everyday operator loop | `doolittle` | +| Fullscreen operator UI | `doolittle cockpit` | +| One-shot shell health | `doolittle status` | +| One-shot tools inventory | `doolittle tools` | +| One-shot skills inventory | `doolittle skills` | +| One-shot runtime summary | `doolittle runtime` | +| Scripted one-shot execution | `doolittle exec -p ""` | +| API-only server mode | `doolittle api` | +| Gateway runner mode | `doolittle gateway` | +| Re-run setup | `doolittle setup` | +| Read diagnostics | `doolittle doctor` | +| Reinstall artifacts | `doolittle install` | + +### In-shell discoverability (minimal) + +- `doolittle help` → top-level command inventory +- `doolittle status` / `doolittle runtime` → fast one-shot operator checks without opening the interactive shell +- `doolittle tools` / `doolittle skills` → quick capability inventory from the same runtime surfaces +- `/status` and `/doctor` → runtime health and capability checks +- `/runtime status` / `GET /runtime/status` → startup state and plugin assembly +- `/tools summary` and `/skills list` → capability surface map +- `/execution status` and `/memory list memory` → execution + memory layers +- `/gateway status` and `/gateway state` → transport health and route state + +### API quick references + +```text +GET /health +GET /features +GET /runtime/status +GET /runtime/plugins +GET /tools/summary +GET /skills +GET /doctor +POST /chat +``` + +For the full command catalog, continue with the `CLI command reference` in [`README.md`](../README.md). + +## 5) Recovery flow (when first-run is noisy) + +- PATH not updated: restart shell or run `~/.local/bin/doolittle`. +- Provider setup appears wrong: run `doolittle setup`, then `/doctor` and `/setup summary`. +- Missing commands in runtime: confirm installer completion and `bun` on PATH. +- Gateway state is stale: `doolittle gateway stop` then `doolittle gateway start`. + +## 6) Truth-first references + +Before documenting capability, route through: + +- [`docs/plugin-inventory.md`](./plugin-inventory.md) (what is assembled) +- [`docs/capability-truth.md`](./capability-truth.md) (what each runtime slice can and cannot claim) +- [`docs/operator-wow-contract.md`](./operator-wow-contract.md) (what native operator product outcomes must prove) diff --git a/docs/skills-hub.md b/docs/skills-hub.md new file mode 100644 index 00000000..2eb1e183 --- /dev/null +++ b/docs/skills-hub.md @@ -0,0 +1,59 @@ +# Skills Hub + +Doolittle now exposes a native skills hub for catalog, sync, manifest, import, export, and install workflows. + +## On-Disk Layout + +- `data/skills-hub/manifests/` stores exported workspace and catalog manifests +- `data/skills-hub/installs/` stores installed manifests and the installed index +- `data/skills-hub/imports/` stores imported manifests staged into the hub +- `data/skills-hub/exports/` stores bundle exports + +## Runtime Commands + +- `/skills hub` +- `/skills summary` +- `/skills catalog` +- `/skills catalog refresh` +- `/skills catalog search ` +- `/skills catalog show ` +- `/skills hub distribution` +- `/skills hub families` +- `/skills families` +- `/skills family ` +- `/skills installed` +- `/skills installed show ` +- `/skills manifest ` +- `/skills sync` +- `/skills export ` +- `/skills import ` +- `/skills install ` + +## API Routes + +- `GET /skills` +- `GET /skills/summary` +- `GET /skills/hub` +- `GET /skills/hub/distribution` +- `GET /skills/hub/families` +- `GET /skills/hub/families/:slug` +- `GET /skills/families` +- `GET /skills/families/:slug` +- `GET /skills/catalog` +- `GET /skills/catalog/:slug` +- `GET /skills/installed` +- `GET /skills/installed/:slug` +- `GET /skills/manifest/:slug` +- `POST /skills/sync` +- `POST /skills/export` +- `POST /skills/import` +- `POST /skills/install` + +## Behavior + +- Workspace skills are scanned from the Doolittle skills workspace +- Generated skills are included in hub summaries and exports +- Curated skill families are surfaced alongside generated families and hub distribution counts +- Catalog skills are sourced from the native Eliza skill catalog +- Installed manifests are persisted separately and can be listed or inspected later +- Bundle exports include both workspace manifests and installed manifests diff --git a/docs/superpowers/plans/2026-05-09-doolittle-wow-harness.md b/docs/superpowers/plans/2026-05-09-doolittle-wow-harness.md new file mode 100644 index 00000000..c0ee80fe --- /dev/null +++ b/docs/superpowers/plans/2026-05-09-doolittle-wow-harness.md @@ -0,0 +1,207 @@ +# Doolittle Wow Harness Implementation Plan + +> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking. + +**Goal:** Build a code-backed product contract that turns the native operator research into measurable Doolittle acceptance scenarios and implementation tasks. + +**Architecture:** Add a native runtime contract module that lists the operator-wow pillars, scenarios, gaps, and next tasks. Reuse the existing doc-truth sync pipeline so the public roadmap is generated from code and can fail checks when it drifts. + +**Tech Stack:** Bun, TypeScript, ElizaOS-native Doolittle runtime records, existing `scripts/sync-doc-truth` generator, Bun tests. + +--- + +## File Structure + +- Create `packages/agent/src/runtime/native/operator-wow-contract.ts`: canonical code-backed contract records for Doolittle's native operator target. +- Create `packages/agent/src/runtime/native/operator-wow-contract.test.ts`: invariant tests that keep the contract complete and internally consistent. +- Modify `scripts/sync-doc-truth/render.ts`: render the operator-wow contract into Markdown. +- Modify `scripts/sync-doc-truth/sync.ts`: include `docs/operator-wow-contract.md` in doc-truth check/write mode. +- Modify `scripts/sync-doc-truth/render.test.ts`: cover the new renderer. +- Generate `docs/operator-wow-contract.md`: generated product contract and acceptance suite. +- Modify `README.md` and `docs/operator-loop.md`: point operators at the new generated contract. + +## Task 1: Add The Code-Backed Contract + +**Files:** +- Create: `packages/agent/src/runtime/native/operator-wow-contract.ts` +- Create: `packages/agent/src/runtime/native/operator-wow-contract.test.ts` + +- [x] **Step 1: Write the contract module** + +Create TypeScript interfaces for pillars, acceptance scenarios, and implementation tasks. Add eight pillars: + +```ts +export type OperatorWowStatus = "covered" | "partial" | "missing"; + +export interface OperatorWowAcceptanceScenario { + id: string; + surface: string; + trigger: string; + requiredSignals: string[]; + verification: string[]; + currentStatus: OperatorWowStatus; +} +``` + +Each pillar must include at least two native operator signals, two ElizaOS leverage points, three Doolittle surfaces, two acceptance scenarios, two current gaps, and two implementation tasks. + +- [x] **Step 2: Write invariant tests** + +Add tests that assert: + +```ts +expect(pillars).toHaveLength(8); +expect(scenarios).toHaveLength(16); +expect(tasks).toHaveLength(16); +``` + +Also assert all ids are unique and every scenario id starts with its pillar id. + +- [x] **Step 3: Run the focused test** + +Run: + +```bash +bun test packages/agent/src/runtime/native/operator-wow-contract.test.ts +``` + +Expected: PASS with all contract invariant tests green. + +## Task 2: Wire The Contract Into Doc Truth + +**Files:** +- Modify: `scripts/sync-doc-truth/render.ts` +- Modify: `scripts/sync-doc-truth/sync.ts` +- Modify: `scripts/sync-doc-truth/render.test.ts` + +- [x] **Step 1: Add the renderer** + +Export `renderOperatorWowContract(records)` from `scripts/sync-doc-truth/render.ts`. The rendered Markdown must include: + +```md +# Operator Wow Contract + +## Product Thesis + +## Summary +``` + +For each pillar, render research signals, ElizaOS leverage, acceptance scenarios, current gaps, and implementation tasks. + +- [x] **Step 2: Add the sync target** + +Import `listOperatorWowContract` in `scripts/sync-doc-truth/sync.ts` and add: + +```ts +syncFile( + root, + mode, + "docs/operator-wow-contract.md", + renderOperatorWowContract(operatorWowContract), +) +``` + +- [x] **Step 3: Add renderer coverage** + +Add a sample `OperatorWowContractPillar` in `scripts/sync-doc-truth/render.test.ts` and assert the output contains the pillar title, scenario id, task id, current status, and file list. + +- [x] **Step 4: Run renderer tests** + +Run: + +```bash +bun test scripts/sync-doc-truth/render.test.ts scripts/sync-doc-truth/sync.test.ts +``` + +Expected: PASS. + +## Task 3: Generate And Link The Contract + +**Files:** +- Generate: `docs/operator-wow-contract.md` +- Modify: `README.md` +- Modify: `docs/operator-loop.md` + +- [x] **Step 1: Generate docs** + +Run: + +```bash +bun run scripts/sync-doc-truth.ts --write +``` + +Expected: `docs/operator-wow-contract.md` is created and `Doc truth files updated.` is printed. + +- [x] **Step 2: Link the contract from operator docs** + +Add `docs/operator-wow-contract.md` to the canonical runtime docs list in `README.md` and the next-docs list in `docs/operator-loop.md`. + +- [x] **Step 3: Check doc truth** + +Run: + +```bash +bun run scripts/sync-doc-truth.ts --check +``` + +Expected: no output differences and exit code 0. + +## Task 4: Verify The Foundation Patch + +**Files:** +- Verify: all files above + +- [x] **Step 1: Run targeted tests** + +Run: + +```bash +bun test packages/agent/src/runtime/native/operator-wow-contract.test.ts scripts/sync-doc-truth/render.test.ts scripts/sync-doc-truth/sync.test.ts +``` + +Expected: PASS. + +- [x] **Step 2: Run docs truth check** + +Run: + +```bash +bun run scripts/sync-doc-truth.ts --check +``` + +Expected: PASS. + +- [x] **Step 3: Inspect git status** + +Run: + +```bash +git status --short +``` + +Expected: shows only this plan, the operator-wow contract files, renderer/sync edits, generated docs, and pre-existing unrelated dirty files. + +## Task 5: Next Execution Tranche + +**Files:** +- Use: `docs/operator-wow-contract.md` +- Use: `packages/agent/src/runtime/native/operator-wow-contract.ts` + +- [x] **Step 1: Pick the first product tranche** + +Start with these tasks from the generated contract: + +```text +first-run-decision-receipt +first-chat-readiness-contract +operator-command-surface +run-interrupt-contract +``` + +- [ ] **Step 2: Create a focused branch or worktree** + +Because the current worktree is dirty, create the implementation tranche on an isolated branch or worktree before changing product runtime behavior. + +- [ ] **Step 3: Execute with tests first** + +For each task, write the failing test named in its definition of done before changing implementation files. diff --git a/package.json b/package.json index e0eb4c0d..a3362488 100644 --- a/package.json +++ b/package.json @@ -2,6 +2,7 @@ "name": "doolittle", "version": "0.1.0", "private": true, + "license": "MIT", "type": "module", "bin": { "doolittle": "./packages/agent/src/index.ts" From 867c9608050ffc3f73b1e7eba2ac1a2ef6e1d82e Mon Sep 17 00:00:00 2001 From: SYMBaiEX Date: Wed, 17 Jun 2026 19:43:54 -0500 Subject: [PATCH 14/14] Fix: user abort no longer re-executes cancelled work via direct-local fallback A Ctrl-C/abort surfaces as a runFailureMessage, which satisfied the direct-local fallback gate and re-ran the exact work the user just cancelled. resolvePostProviderFallback now short-circuits to a continue-state (without consulting the fallback loader) when options.abortSignal is aborted. +2 regression tests. Gates: typecheck 0, 1490 tests pass, build + lint + acceptance all green. --- .../chat-turn/post-provider/fallback.test.ts | 61 +++++++++++++++++++ .../chat-turn/post-provider/fallback.ts | 13 ++++ 2 files changed, 74 insertions(+) create mode 100644 packages/agent/src/runtime/chat-turn/post-provider/fallback.test.ts diff --git a/packages/agent/src/runtime/chat-turn/post-provider/fallback.test.ts b/packages/agent/src/runtime/chat-turn/post-provider/fallback.test.ts new file mode 100644 index 00000000..16ba4e14 --- /dev/null +++ b/packages/agent/src/runtime/chat-turn/post-provider/fallback.test.ts @@ -0,0 +1,61 @@ +import { describe, expect, it } from "bun:test"; +import { resolvePostProviderFallback } from "./fallback"; + +type FallbackInput = Parameters[0]; + +function makeInput(aborted: boolean, onLoad: () => void): FallbackInput { + const controller = new AbortController(); + if (aborted) { + controller.abort(); + } + return { + context: { + services: { + runController: { getActive: () => undefined, finishTurn: () => {} }, + }, + }, + effectiveInput: { message: "scaffold the project" }, + turn: { sessionId: "s1", localInteractive: true }, + options: { abortSignal: controller.signal }, + loadDirectLocalIntent: async () => { + onLoad(); + return { + directLocalIntent: undefined, + shouldUseDirectLocalFallback: () => false, + isHighConfidenceDirectLocalIntent: () => false, + requiresModelSynthesisForLocalIntent: () => false, + executeDirectLocalIntent: async () => "", + }; + }, + approveDirectLocalIntent: async () => undefined, + actionResults: [], + response: "", + runFailureMessage: "aborted by user", + } as unknown as FallbackInput; +} + +describe("resolvePostProviderFallback abort handling", () => { + it("never runs the direct-local fallback when the turn was aborted", async () => { + let loaded = false; + const result = await resolvePostProviderFallback( + makeInput(true, () => { + loaded = true; + }), + ); + // The fallback loader must not even be consulted — otherwise cancelled work + // could re-execute. + expect(loaded).toBe(false); + expect(result).toMatchObject({ kind: "continue", usedFallback: false }); + }); + + it("consults the fallback loader on a non-aborted failed turn", async () => { + let loaded = false; + const result = await resolvePostProviderFallback( + makeInput(false, () => { + loaded = true; + }), + ); + expect(loaded).toBe(true); + expect(result).toMatchObject({ kind: "continue" }); + }); +}); diff --git a/packages/agent/src/runtime/chat-turn/post-provider/fallback.ts b/packages/agent/src/runtime/chat-turn/post-provider/fallback.ts index 81ceb667..aaee855b 100644 --- a/packages/agent/src/runtime/chat-turn/post-provider/fallback.ts +++ b/packages/agent/src/runtime/chat-turn/post-provider/fallback.ts @@ -51,6 +51,19 @@ export async function resolvePostProviderFallback( summarizeActionResults(input.actionResults).observedActionCount, ); + // If the user aborted, never run the direct-local fallback — an abort + // surfaces as a runFailureMessage, and falling through would re-execute the + // exact work the user just cancelled. + if (input.options?.abortSignal?.aborted) { + return { + kind: "continue", + observedActionCount, + response, + runFailureMessage, + usedFallback: false, + }; + } + const fallbackModule = shouldLoadDirectLocalIntentFallback({ localInteractive: input.turn.localInteractive, observedActionCount,