From f77aecd5c279303bfb4f1dc1339744080d3dccfc Mon Sep 17 00:00:00 2001 From: codebuff public sync bot <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 5 Jun 2026 19:07:13 +0000 Subject: [PATCH 01/96] Sync public snapshot from freebuff-private Source: CodebuffAI/freebuff-private@889ccfa1957c1d09f4ea6b6a2747e988ce0fb1b3 --- bun.lock | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/bun.lock b/bun.lock index bc237892c8..a7e6efcc74 100644 --- a/bun.lock +++ b/bun.lock @@ -427,9 +427,9 @@ "@pinojs/redact": ["@pinojs/redact@0.4.0", "", {}, "sha512-k2ENnmBugE/rzQfEcdWHcCY+/FM3VLzH9cYEsbdsoqrvzAKRhUZeRNhAZvB8OitQJ1TBed3yqWtdjzS6wJKBwg=="], - "@posthog/core": ["@posthog/core@1.30.8", "", { "dependencies": { "@posthog/types": "1.380.1" } }, "sha512-rRJxn7UjPR5LWgRwicJgHWD7tu3P2IebdWjGJ1xpXkbNqpFyW+SbSDGjhunmmXXl2c59ejOICtnbrwN6njS1lw=="], + "@posthog/core": ["@posthog/core@1.30.9", "", { "dependencies": { "@posthog/types": "1.381.0" } }, "sha512-Cn004VJ7ZWQRaVQG7efh+pMtRMIVZznktngXe5I3E8wClRdMwCZaSa6jo/X04Oc04z8PeMp4GEcWVkdEhmAEXw=="], - "@posthog/types": ["@posthog/types@1.380.1", "", {}, "sha512-GaeyU1vPxwZvYlSWdpxbLCRPqY2WKUZYUNjBlJHAlaAXbMmCfLgB2cvkwjidr8lhX8nyxINjjvQMiOSSfSSxcg=="], + "@posthog/types": ["@posthog/types@1.381.0", "", {}, "sha512-AW68BovKFCNbPdq3VjOzfQeSQRYMvQVv+46LDywWFXO/oOTXFKwjY92FaJQSTXWgTNgDpqigCw3yUFDinK3hZA=="], "@rtsao/scc": ["@rtsao/scc@1.1.0", "", {}, "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g=="], @@ -593,7 +593,7 @@ "base64-js": ["base64-js@1.5.1", "", {}, "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="], - "baseline-browser-mapping": ["baseline-browser-mapping@2.10.33", "", { "bin": { "baseline-browser-mapping": "dist/cli.cjs" } }, "sha512-bA6+tcSLpz2tIEdDXZPpPTIuxBcC4+w6SieaYyfigIa4h8GlFxbA17v22Vx3JUtuZQj9SgOsnbK+aTBzyDyEuw=="], + "baseline-browser-mapping": ["baseline-browser-mapping@2.10.34", "", { "bin": { "baseline-browser-mapping": "dist/cli.cjs" } }, "sha512-IMDedajPifLnHNY0X9n8hKxRTQ6/eTHwr5bDo04WnuqxyKw6LYtQywCuuqPZwhl3aBXMvQpJov42GLCwRRdQzw=="], "binary-extensions": ["binary-extensions@2.3.0", "", {}, "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw=="], @@ -1307,7 +1307,7 @@ "postgres-interval": ["postgres-interval@1.2.0", "", { "dependencies": { "xtend": "^4.0.0" } }, "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ=="], - "posthog-node": ["posthog-node@5.36.2", "", { "dependencies": { "@posthog/core": "1.30.8" }, "peerDependencies": { "rxjs": "^7.0.0" }, "optionalPeers": ["rxjs"] }, "sha512-k+URjhZyxR0PJ92JZkYcgyk7+2U+T8r0fnfsQFNkW4GeKcuYH6t13VLzjI+bH4YLSknUuLmDDg4CczGO9nad2Q=="], + "posthog-node": ["posthog-node@5.36.3", "", { "dependencies": { "@posthog/core": "1.30.9" }, "peerDependencies": { "rxjs": "^7.0.0" }, "optionalPeers": ["rxjs"] }, "sha512-cbAB8w3lJf+rQlxgBVkbQha/yJnt7NFe8l23iE5brLl4YLv10y+Xk6a0SzquZzk5tebznW0qpz3WEUJpf2OI9w=="], "preact": ["preact@10.29.2", "", {}, "sha512-7tNmwg/7mzzAoB/8kSg6Hl37JraAZw3Z3A0JSY7VXlZwo82Xn0G7wKbNNs2qoF4ZEEsQGTwDAroNdqKs1ofJxQ=="], @@ -1657,6 +1657,8 @@ "@opentui/core/strip-ansi": ["strip-ansi@7.1.2", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA=="], + "@types/diff/diff": ["diff@9.0.0", "", {}, "sha512-svtcdpS8CgJyqAjEQIXdb3OjhFVVYjzGAPO8WGCmRbrml64SPw/jJD4GoE98aR7r25A0XcgrK3F02yw9R/vhQw=="], + "@typescript-eslint/eslint-plugin/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], "@typescript-eslint/parser/@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@7.18.0", "", { "dependencies": { "@typescript-eslint/types": "7.18.0", "@typescript-eslint/visitor-keys": "7.18.0" } }, "sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA=="], From bbf856cf23772fe19a423b9663d3689c8e48fb11 Mon Sep 17 00:00:00 2001 From: codebuff public sync bot <41898282+github-actions[bot]@users.noreply.github.com> Date: Sat, 6 Jun 2026 00:35:58 +0000 Subject: [PATCH 02/96] Sync public snapshot from freebuff-private Source: CodebuffAI/freebuff-private@191a73d8c12f4429b982f49078766faebd537ab1 --- bun.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/bun.lock b/bun.lock index a7e6efcc74..9e3e2cba79 100644 --- a/bun.lock +++ b/bun.lock @@ -481,7 +481,7 @@ "@types/ms": ["@types/ms@2.1.0", "", {}, "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA=="], - "@types/node": ["@types/node@22.19.19", "", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-dyh/xO2Fh5bYrfWaaqGrRQQGkNdmYw6AmaAUvYeUMNTWQtvb796ikLdmTchRmOlOiIJ1TDXfWgVx1QkUlQ6Hew=="], + "@types/node": ["@types/node@22.19.20", "", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-6tELRwSDYWW9EdZhbeZmYGZ1/7Djkt+Ah3/ScEYT9cDord7UJzasR/4D3VONg9tQI5CDp+/CZC1AXj2pCFOvpw=="], "@types/node-fetch": ["@types/node-fetch@2.6.13", "", { "dependencies": { "@types/node": "*", "form-data": "^4.0.4" } }, "sha512-QGpRVpzSaUs30JBSGPjOg4Uveu384erbHBoT1zeONvyCfwQxIkUshLAOqN/k9EjGviPRmWTTe6aH2qySWKTVSw=="], @@ -1469,7 +1469,7 @@ "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=="], - "string.prototype.trim": ["string.prototype.trim@1.2.10", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.2", "define-data-property": "^1.1.4", "define-properties": "^1.2.1", "es-abstract": "^1.23.5", "es-object-atoms": "^1.0.0", "has-property-descriptors": "^1.0.2" } }, "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA=="], + "string.prototype.trim": ["string.prototype.trim@1.2.11", "", { "dependencies": { "call-bind": "^1.0.9", "call-bound": "^1.0.4", "define-data-property": "^1.1.4", "define-properties": "^1.2.1", "es-abstract": "^1.24.2", "es-object-atoms": "^1.1.2", "has-property-descriptors": "^1.0.2", "safe-regex-test": "^1.1.0" } }, "sha512-PwvK7BU+CMTJGYQCTZb5RWXIML92lftJLhQz1tBzgKiqGxJaMlBAa48POXaNAC2s4y8jr3EFqrkF9+44neS46w=="], "string.prototype.trimend": ["string.prototype.trimend@1.0.9", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.2", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0" } }, "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ=="], @@ -1595,7 +1595,7 @@ "which-collection": ["which-collection@1.0.2", "", { "dependencies": { "is-map": "^2.0.3", "is-set": "^2.0.3", "is-weakmap": "^2.0.2", "is-weakset": "^2.0.3" } }, "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw=="], - "which-typed-array": ["which-typed-array@1.1.21", "", { "dependencies": { "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.9", "call-bound": "^1.0.4", "for-each": "^0.3.5", "get-proto": "^1.0.1", "gopd": "^1.2.0", "has-tostringtag": "^1.0.2" } }, "sha512-zbRA8cVm6io/d5W8uIe2hblzN76/Wm3v/yiythQvr+dpBWeqhPSWIDNj4zOyHi4zKbMK6DN34Xsr9jPHJERAEw=="], + "which-typed-array": ["which-typed-array@1.1.22", "", { "dependencies": { "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.9", "call-bound": "^1.0.4", "for-each": "^0.3.5", "get-proto": "^1.0.1", "gopd": "^1.2.0", "has-tostringtag": "^1.0.2" } }, "sha512-fvO4ExWMFsqyhG3AiPAObMuY1lxaqgYcxbc49CNdWDDECOJNgQyvsOWVwbZc+qf3rzRtxojBK+CMEv0Ld5CYpw=="], "word-wrap": ["word-wrap@1.2.5", "", {}, "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA=="], From d604275a23401689a8b7015c524f26f2ba54b333 Mon Sep 17 00:00:00 2001 From: codebuff public sync bot <41898282+github-actions[bot]@users.noreply.github.com> Date: Sat, 6 Jun 2026 01:14:55 +0000 Subject: [PATCH 03/96] Sync public snapshot from freebuff-private Source: CodebuffAI/freebuff-private@bb621a15024d88d049f199d8f2dc15d5af7ffaae --- bun.lock | 2 -- 1 file changed, 2 deletions(-) diff --git a/bun.lock b/bun.lock index 9e3e2cba79..53f2ab95a9 100644 --- a/bun.lock +++ b/bun.lock @@ -1657,8 +1657,6 @@ "@opentui/core/strip-ansi": ["strip-ansi@7.1.2", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA=="], - "@types/diff/diff": ["diff@9.0.0", "", {}, "sha512-svtcdpS8CgJyqAjEQIXdb3OjhFVVYjzGAPO8WGCmRbrml64SPw/jJD4GoE98aR7r25A0XcgrK3F02yw9R/vhQw=="], - "@typescript-eslint/eslint-plugin/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], "@typescript-eslint/parser/@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@7.18.0", "", { "dependencies": { "@typescript-eslint/types": "7.18.0", "@typescript-eslint/visitor-keys": "7.18.0" } }, "sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA=="], From 85ab80f2d32bd08ca581b71e5627ad17b161c2c9 Mon Sep 17 00:00:00 2001 From: codebuff public sync bot <41898282+github-actions[bot]@users.noreply.github.com> Date: Sat, 6 Jun 2026 09:14:49 +0000 Subject: [PATCH 04/96] Sync public snapshot from freebuff-private Source: CodebuffAI/freebuff-private@08b684250c308acf3ed7011524917d8848234451 --- bun.lock | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/bun.lock b/bun.lock index 53f2ab95a9..eb996470e3 100644 --- a/bun.lock +++ b/bun.lock @@ -623,7 +623,7 @@ "call-bound": ["call-bound@1.0.4", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "get-intrinsic": "^1.3.0" } }, "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg=="], - "caniuse-lite": ["caniuse-lite@1.0.30001793", "", {}, "sha512-iwSsYWaCOoh26cV8NwNRViHlrfUvYsHDfRVcbtmw0Kg6PJIZZXwMkj1442FYLBGkeUf1juAsU3DTfxW579mrPA=="], + "caniuse-lite": ["caniuse-lite@1.0.30001797", "", {}, "sha512-l8xKG+gwAIExZGl9FrF7KUwuOmk6wbEPC9Xoy/RtnWv1XG0Q4LFlagaLpUv3Kiza3W/wm27zy0yWJEieYKAP6w=="], "canvas": ["canvas@3.2.3", "", { "dependencies": { "node-addon-api": "^7.0.0", "prebuild-install": "^7.1.3" } }, "sha512-PzE5nJZPz72YUAfo8oTp0u3fqqY7IzlTubneAihqDYAUcBk7ryeCmBbdJBEdaH0bptSOe2VT2Zwcb3UaFyaSWw=="], @@ -1471,7 +1471,7 @@ "string.prototype.trim": ["string.prototype.trim@1.2.11", "", { "dependencies": { "call-bind": "^1.0.9", "call-bound": "^1.0.4", "define-data-property": "^1.1.4", "define-properties": "^1.2.1", "es-abstract": "^1.24.2", "es-object-atoms": "^1.1.2", "has-property-descriptors": "^1.0.2", "safe-regex-test": "^1.1.0" } }, "sha512-PwvK7BU+CMTJGYQCTZb5RWXIML92lftJLhQz1tBzgKiqGxJaMlBAa48POXaNAC2s4y8jr3EFqrkF9+44neS46w=="], - "string.prototype.trimend": ["string.prototype.trimend@1.0.9", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.2", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0" } }, "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ=="], + "string.prototype.trimend": ["string.prototype.trimend@1.0.10", "", { "dependencies": { "call-bind": "^1.0.9", "call-bound": "^1.0.4", "define-properties": "^1.2.1", "es-object-atoms": "^1.1.2" } }, "sha512-2+3aDAOmPTmuFwjDnmJG2ctEkQKVki7vOSqaxkv42Mowj1V6PnvuwFCRrR5lChUux1TBskPjfkeTOhqczDMxTw=="], "string.prototype.trimstart": ["string.prototype.trimstart@1.0.8", "", { "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0" } }, "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg=="], @@ -1657,6 +1657,8 @@ "@opentui/core/strip-ansi": ["strip-ansi@7.1.2", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA=="], + "@types/diff/diff": ["diff@9.0.0", "", {}, "sha512-svtcdpS8CgJyqAjEQIXdb3OjhFVVYjzGAPO8WGCmRbrml64SPw/jJD4GoE98aR7r25A0XcgrK3F02yw9R/vhQw=="], + "@typescript-eslint/eslint-plugin/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], "@typescript-eslint/parser/@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@7.18.0", "", { "dependencies": { "@typescript-eslint/types": "7.18.0", "@typescript-eslint/visitor-keys": "7.18.0" } }, "sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA=="], From 09a476231d143ebf2efc493a5aea7ebeba0d0cc2 Mon Sep 17 00:00:00 2001 From: codebuff public sync bot <41898282+github-actions[bot]@users.noreply.github.com> Date: Sat, 6 Jun 2026 10:57:11 +0000 Subject: [PATCH 05/96] Sync public snapshot from freebuff-private Source: CodebuffAI/freebuff-private@3c415dd48544127594f856078143139ac963ec31 --- bun.lock | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/bun.lock b/bun.lock index eb996470e3..f12a914958 100644 --- a/bun.lock +++ b/bun.lock @@ -1309,7 +1309,7 @@ "posthog-node": ["posthog-node@5.36.3", "", { "dependencies": { "@posthog/core": "1.30.9" }, "peerDependencies": { "rxjs": "^7.0.0" }, "optionalPeers": ["rxjs"] }, "sha512-cbAB8w3lJf+rQlxgBVkbQha/yJnt7NFe8l23iE5brLl4YLv10y+Xk6a0SzquZzk5tebznW0qpz3WEUJpf2OI9w=="], - "preact": ["preact@10.29.2", "", {}, "sha512-7tNmwg/7mzzAoB/8kSg6Hl37JraAZw3Z3A0JSY7VXlZwo82Xn0G7wKbNNs2qoF4ZEEsQGTwDAroNdqKs1ofJxQ=="], + "preact": ["preact@10.24.3", "", {}, "sha512-Z2dPnBnMUfyQfSQ+GBdsGa16hz35YmLmtTLhM169uW944hYL6xzTYkJjC07j+Wosz733pMWx0fgON3JNw1jJQA=="], "preact-render-to-string": ["preact-render-to-string@5.2.6", "", { "dependencies": { "pretty-format": "^3.8.0" }, "peerDependencies": { "preact": ">=10" } }, "sha512-JyhErpYOvBV1hEPwIxc/fHWXPfnEGdRKxc8gFdAZ7XV4tlzyzG847XAyEZqoDnynP88akM4eaHcSOzNcLWFguw=="], @@ -1639,8 +1639,6 @@ "zwitch": ["zwitch@2.0.4", "", {}, "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A=="], - "@auth/core/preact": ["preact@10.24.3", "", {}, "sha512-Z2dPnBnMUfyQfSQ+GBdsGa16hz35YmLmtTLhM169uW944hYL6xzTYkJjC07j+Wosz733pMWx0fgON3JNw1jJQA=="], - "@auth/core/preact-render-to-string": ["preact-render-to-string@6.5.11", "", { "peerDependencies": { "preact": ">=10" } }, "sha512-ubnauqoGczeGISiOh6RjX0/cdaF8v/oDXIjO85XALCQjwQP+SB4RDXXtvZ6yTYSjG+PC1QRP2AhPgCEsM2EvUw=="], "@codebuff/common/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], @@ -1657,8 +1655,6 @@ "@opentui/core/strip-ansi": ["strip-ansi@7.1.2", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA=="], - "@types/diff/diff": ["diff@9.0.0", "", {}, "sha512-svtcdpS8CgJyqAjEQIXdb3OjhFVVYjzGAPO8WGCmRbrml64SPw/jJD4GoE98aR7r25A0XcgrK3F02yw9R/vhQw=="], - "@typescript-eslint/eslint-plugin/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], "@typescript-eslint/parser/@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@7.18.0", "", { "dependencies": { "@typescript-eslint/types": "7.18.0", "@typescript-eslint/visitor-keys": "7.18.0" } }, "sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA=="], From 612c346e1126d777e606f6fe0f73afdd59505bca Mon Sep 17 00:00:00 2001 From: codebuff public sync bot <41898282+github-actions[bot]@users.noreply.github.com> Date: Sat, 6 Jun 2026 13:12:53 +0000 Subject: [PATCH 06/96] Sync public snapshot from freebuff-private Source: CodebuffAI/freebuff-private@4a8356998f14fceaa409879813356468bd2ae24b --- bun.lock | 78 ++++++++++++++++++++++++++++++++++++-------------------- 1 file changed, 51 insertions(+), 27 deletions(-) diff --git a/bun.lock b/bun.lock index f12a914958..c19793154f 100644 --- a/bun.lock +++ b/bun.lock @@ -239,15 +239,19 @@ "@eslint-community/regexpp": ["@eslint-community/regexpp@4.12.2", "", {}, "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew=="], - "@eslint/config-array": ["@eslint/config-array@0.23.5", "", { "dependencies": { "@eslint/object-schema": "^3.0.5", "debug": "^4.3.1", "minimatch": "^10.2.4" } }, "sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA=="], + "@eslint/config-array": ["@eslint/config-array@0.21.2", "", { "dependencies": { "@eslint/object-schema": "^2.1.7", "debug": "^4.3.1", "minimatch": "^3.1.5" } }, "sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw=="], - "@eslint/config-helpers": ["@eslint/config-helpers@0.6.0", "", { "dependencies": { "@eslint/core": "^1.2.1" } }, "sha512-ii6Bw9jJ2zi2cWA2Z+9/QZ/+3DX6kwaV5Q986D/CdP3Lap3w/pgQZ373FV7byY/i7L4IRH/G43I5dz1ClsCbpA=="], + "@eslint/config-helpers": ["@eslint/config-helpers@0.4.2", "", { "dependencies": { "@eslint/core": "^0.17.0" } }, "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw=="], - "@eslint/core": ["@eslint/core@1.2.1", "", { "dependencies": { "@types/json-schema": "^7.0.15" } }, "sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ=="], + "@eslint/core": ["@eslint/core@0.17.0", "", { "dependencies": { "@types/json-schema": "^7.0.15" } }, "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ=="], - "@eslint/object-schema": ["@eslint/object-schema@3.0.5", "", {}, "sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw=="], + "@eslint/eslintrc": ["@eslint/eslintrc@3.3.5", "", { "dependencies": { "ajv": "^6.14.0", "debug": "^4.3.2", "espree": "^10.0.1", "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.1", "minimatch": "^3.1.5", "strip-json-comments": "^3.1.1" } }, "sha512-4IlJx0X0qftVsN5E+/vGujTRIFtwuLbNsVUe7TO6zYPDR1O6nFwvwhIKEKSrl6dZchmYBITazxKoUYOjdtjlRg=="], - "@eslint/plugin-kit": ["@eslint/plugin-kit@0.7.2", "", { "dependencies": { "@eslint/core": "^1.2.1", "levn": "^0.4.1" } }, "sha512-+CNAzxglkrpNf/kKywqQfk74QjtceuOE7Qm+AF8miRvPF/wmmK5+OJOgVh3AVTT3RP2mH3+FOaxlE5v72owk0A=="], + "@eslint/js": ["@eslint/js@9.39.4", "", {}, "sha512-nE7DEIchvtiFTwBw4Lfbu59PG+kCofhjsKaCWzxTpt4lfRjRMqG6uMBzKXuEcyXhOHoUp9riAm7/aWYGhXZ9cw=="], + + "@eslint/object-schema": ["@eslint/object-schema@2.1.7", "", {}, "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA=="], + + "@eslint/plugin-kit": ["@eslint/plugin-kit@0.4.1", "", { "dependencies": { "@eslint/core": "^0.17.0", "levn": "^0.4.1" } }, "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA=="], "@gravity-ai/api": ["@gravity-ai/api@0.1.2", "", { "dependencies": { "axios": "^1.13.2" } }, "sha512-txsAhyzvwB/TNrj5R8DoNqw8afM3JY2ahl7aaeaD5ZsxP+7rxff7C7keGI7+gU2KT3d2Mcw4QB1nHhbTSCJYHw=="], @@ -463,8 +467,6 @@ "@types/diff": ["@types/diff@8.0.0", "", { "dependencies": { "diff": "*" } }, "sha512-o7jqJM04gfaYrdCecCVMbZhNdG6T1MHg/oQoRFdERLV+4d+V7FijhiEAbFu0Usww84Yijk9yH58U4Jk4HbtzZw=="], - "@types/esrecurse": ["@types/esrecurse@4.3.1", "", {}, "sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw=="], - "@types/estree": ["@types/estree@1.0.9", "", {}, "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg=="], "@types/js-yaml": ["@types/js-yaml@4.0.9", "", {}, "sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg=="], @@ -547,7 +549,7 @@ "ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="], - "ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], + "ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], "any-base": ["any-base@1.1.0", "", {}, "sha512-uMgjozySS8adZZYePpaWs8cxB9/kdzmpX6SgJZ+wbz1K5eYk5QMYDVJaZKhxyIHUdnnJkfR7SVgStgH7LkGUyg=="], @@ -623,6 +625,8 @@ "call-bound": ["call-bound@1.0.4", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "get-intrinsic": "^1.3.0" } }, "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg=="], + "callsites": ["callsites@3.1.0", "", {}, "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="], + "caniuse-lite": ["caniuse-lite@1.0.30001797", "", {}, "sha512-l8xKG+gwAIExZGl9FrF7KUwuOmk6wbEPC9Xoy/RtnWv1XG0Q4LFlagaLpUv3Kiza3W/wm27zy0yWJEieYKAP6w=="], "canvas": ["canvas@3.2.3", "", { "dependencies": { "node-addon-api": "^7.0.0", "prebuild-install": "^7.1.3" } }, "sha512-PzE5nJZPz72YUAfo8oTp0u3fqqY7IzlTubneAihqDYAUcBk7ryeCmBbdJBEdaH0bptSOe2VT2Zwcb3UaFyaSWw=="], @@ -747,7 +751,7 @@ "escape-string-regexp": ["escape-string-regexp@4.0.0", "", {}, "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="], - "eslint": ["eslint@10.4.1", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.2", "@eslint/config-array": "^0.23.5", "@eslint/config-helpers": "^0.6.0", "@eslint/core": "^1.2.1", "@eslint/plugin-kit": "^0.7.2", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "ajv": "^6.14.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^9.1.2", "eslint-visitor-keys": "^5.0.1", "espree": "^11.2.0", "esquery": "^1.7.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "minimatch": "^10.2.4", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, "peerDependencies": { "jiti": "*" }, "optionalPeers": ["jiti"], "bin": { "eslint": "bin/eslint.js" } }, "sha512-AyIKhnOBuOAdueD7RB3xB+YeAWScb9jHsJBgH2Hcde8InP5JYhqrRR6iTMHyTEwgENK54Cp44e4v8BwNhsuHuw=="], + "eslint": ["eslint@9.39.4", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", "@eslint/config-array": "^0.21.2", "@eslint/config-helpers": "^0.4.2", "@eslint/core": "^0.17.0", "@eslint/eslintrc": "^3.3.5", "@eslint/js": "9.39.4", "@eslint/plugin-kit": "^0.4.1", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "ajv": "^6.14.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^8.4.0", "eslint-visitor-keys": "^4.2.1", "espree": "^10.4.0", "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.5", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, "peerDependencies": { "jiti": "*" }, "optionalPeers": ["jiti"], "bin": { "eslint": "bin/eslint.js" } }, "sha512-XoMjdBOwe/esVgEvLmNsD3IRHkm7fbKIUGvrleloJXUZgDHig2IPWNniv+GwjyJXzuNqVjlr5+4yVUZjycJwfQ=="], "eslint-config-prettier": ["eslint-config-prettier@9.1.2", "", { "peerDependencies": { "eslint": ">=7.0.0" }, "bin": { "eslint-config-prettier": "bin/cli.js" } }, "sha512-iI1f+D2ViGn+uvv5HuHVUamg8ll4tN+JRHGc6IJi4TP9Kl976C57fzPXgseXNs8v0iA8aSJpHsTWjDb9QJamGQ=="], @@ -759,11 +763,11 @@ "eslint-plugin-unused-imports": ["eslint-plugin-unused-imports@4.4.1", "", { "peerDependencies": { "@typescript-eslint/eslint-plugin": "^8.0.0-0 || ^7.0.0 || ^6.0.0 || ^5.0.0", "eslint": "^10.0.0 || ^9.0.0 || ^8.0.0" }, "optionalPeers": ["@typescript-eslint/eslint-plugin"] }, "sha512-oZGYUz1X3sRMGUB+0cZyK2VcvRX5lm/vB56PgNNcU+7ficUCKm66oZWKUubXWnOuPjQ8PvmXtCViXBMONPe7tQ=="], - "eslint-scope": ["eslint-scope@9.1.2", "", { "dependencies": { "@types/esrecurse": "^4.3.1", "@types/estree": "^1.0.8", "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ=="], + "eslint-scope": ["eslint-scope@8.4.0", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg=="], "eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="], - "espree": ["espree@11.2.0", "", { "dependencies": { "acorn": "^8.16.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^5.0.1" } }, "sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw=="], + "espree": ["espree@10.4.0", "", { "dependencies": { "acorn": "^8.15.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^4.2.1" } }, "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ=="], "esprima": ["esprima@4.0.1", "", { "bin": { "esparse": "./bin/esparse.js", "esvalidate": "./bin/esvalidate.js" } }, "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="], @@ -875,6 +879,8 @@ "glob-parent": ["glob-parent@6.0.2", "", { "dependencies": { "is-glob": "^4.0.3" } }, "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A=="], + "globals": ["globals@14.0.0", "", {}, "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ=="], + "globalthis": ["globalthis@1.0.4", "", { "dependencies": { "define-properties": "^1.2.1", "gopd": "^1.0.1" } }, "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ=="], "globby": ["globby@11.1.0", "", { "dependencies": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", "fast-glob": "^3.2.9", "ignore": "^5.2.0", "merge2": "^1.4.1", "slash": "^3.0.0" } }, "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g=="], @@ -889,6 +895,8 @@ "has-bigints": ["has-bigints@1.1.0", "", {}, "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg=="], + "has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], + "has-property-descriptors": ["has-property-descriptors@1.0.2", "", { "dependencies": { "es-define-property": "^1.0.0" } }, "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg=="], "has-proto": ["has-proto@1.2.0", "", { "dependencies": { "dunder-proto": "^1.0.0" } }, "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ=="], @@ -919,6 +927,8 @@ "immer": ["immer@10.2.0", "", {}, "sha512-d/+XTN3zfODyjr89gM3mPq1WNX2B8pYsu7eORitdwyA2sBubnTl3laYlBk4sXY5FUa5qTZGBDPJICVbvqzjlbw=="], + "import-fresh": ["import-fresh@3.3.1", "", { "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" } }, "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ=="], + "imurmurhash": ["imurmurhash@0.1.4", "", {}, "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA=="], "inherits": ["inherits@2.0.4", "", {}, "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="], @@ -1035,6 +1045,8 @@ "lodash": ["lodash@4.17.23", "", {}, "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w=="], + "lodash.merge": ["lodash.merge@4.6.2", "", {}, "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ=="], + "log-update": ["log-update@8.0.0", "", { "dependencies": { "ansi-escapes": "^7.3.0", "cli-cursor": "^5.0.0", "slice-ansi": "^9.0.0", "string-width": "^8.2.0", "strip-ansi": "^7.2.0", "wrap-ansi": "^10.0.0" } }, "sha512-lddSgOt3bPASrylL54ZSpy8nBHns+vBVSoILlVOx+dei300pnLRN958rj/EdlVLKuWlSESU3qdnDZdAI7FXYGg=="], "longest-streak": ["longest-streak@3.1.0", "", {}, "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g=="], @@ -1237,6 +1249,8 @@ "pako": ["pako@1.0.11", "", {}, "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw=="], + "parent-module": ["parent-module@1.0.1", "", { "dependencies": { "callsites": "^3.0.0" } }, "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g=="], + "parse-bmfont-ascii": ["parse-bmfont-ascii@1.0.6", "", {}, "sha512-U4RrVsUFCleIOBsIGYOMKjn9PavsGOXxbvYGtMOEfnId0SVNsgehXh1DxUdVPLoxd5mvcEtvmKs2Mmf0Mpa1ZA=="], "parse-bmfont-binary": ["parse-bmfont-binary@1.0.6", "", {}, "sha512-GxmsRea0wdGdYthjuUeWTMWPqm2+FAd4GI8vCvhgJsFnoGhTrLhXDDupwTo7rXVAgaLIGoVHDZS9p/5XbSqeWA=="], @@ -1309,7 +1323,7 @@ "posthog-node": ["posthog-node@5.36.3", "", { "dependencies": { "@posthog/core": "1.30.9" }, "peerDependencies": { "rxjs": "^7.0.0" }, "optionalPeers": ["rxjs"] }, "sha512-cbAB8w3lJf+rQlxgBVkbQha/yJnt7NFe8l23iE5brLl4YLv10y+Xk6a0SzquZzk5tebznW0qpz3WEUJpf2OI9w=="], - "preact": ["preact@10.24.3", "", {}, "sha512-Z2dPnBnMUfyQfSQ+GBdsGa16hz35YmLmtTLhM169uW944hYL6xzTYkJjC07j+Wosz733pMWx0fgON3JNw1jJQA=="], + "preact": ["preact@10.29.2", "", {}, "sha512-7tNmwg/7mzzAoB/8kSg6Hl37JraAZw3Z3A0JSY7VXlZwo82Xn0G7wKbNNs2qoF4ZEEsQGTwDAroNdqKs1ofJxQ=="], "preact-render-to-string": ["preact-render-to-string@5.2.6", "", { "dependencies": { "pretty-format": "^3.8.0" }, "peerDependencies": { "preact": ">=10" } }, "sha512-JyhErpYOvBV1hEPwIxc/fHWXPfnEGdRKxc8gFdAZ7XV4tlzyzG847XAyEZqoDnynP88akM4eaHcSOzNcLWFguw=="], @@ -1381,6 +1395,8 @@ "resolve": ["resolve@2.0.0-next.7", "", { "dependencies": { "es-errors": "^1.3.0", "is-core-module": "^2.16.2", "node-exports-info": "^1.6.0", "object-keys": "^1.1.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-tqt+NBWwyaMgw3zDsnygx4CByWjQEJHOPMdslYhppaQSJUtL/D4JO9CcBBlhPoI8lz9oJIDXkwXfhF4aWqP8xQ=="], + "resolve-from": ["resolve-from@4.0.0", "", {}, "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="], + "resolve-pkg-maps": ["resolve-pkg-maps@1.0.0", "", {}, "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw=="], "restore-cursor": ["restore-cursor@5.1.0", "", { "dependencies": { "onetime": "^7.0.0", "signal-exit": "^4.1.0" } }, "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA=="], @@ -1485,7 +1501,7 @@ "strip-final-newline": ["strip-final-newline@2.0.0", "", {}, "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA=="], - "strip-json-comments": ["strip-json-comments@2.0.1", "", {}, "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ=="], + "strip-json-comments": ["strip-json-comments@3.1.1", "", {}, "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig=="], "stripe": ["stripe@16.12.0", "", { "dependencies": { "@types/node": ">=8.1.0", "qs": "^6.11.0" } }, "sha512-H7eFVLDxeTNNSn4JTRfL2//LzCbDrMSZ+2q1c7CanVWgK2qIW5TwS+0V7N9KcKZZNpYh/uCqK0PyZh/2UsaAtQ=="], @@ -1493,6 +1509,8 @@ "styled-jsx": ["styled-jsx@5.1.6", "", { "dependencies": { "client-only": "0.0.1" }, "peerDependencies": { "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0" } }, "sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA=="], + "supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], + "supports-preserve-symlinks-flag": ["supports-preserve-symlinks-flag@1.0.0", "", {}, "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w=="], "supports-terminal-graphics": ["supports-terminal-graphics@0.1.0", "", {}, "sha512-+KdfozhS0Fw8y5Sghw8kkZNGT8nWYzJ1EzcoIvVjxhl+26TJTs26y02yfBgvc1jh5AS/c8jcI3xtahhR95KRyQ=="], @@ -1639,6 +1657,8 @@ "zwitch": ["zwitch@2.0.4", "", {}, "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A=="], + "@auth/core/preact": ["preact@10.24.3", "", {}, "sha512-Z2dPnBnMUfyQfSQ+GBdsGa16hz35YmLmtTLhM169uW944hYL6xzTYkJjC07j+Wosz733pMWx0fgON3JNw1jJQA=="], + "@auth/core/preact-render-to-string": ["preact-render-to-string@6.5.11", "", { "peerDependencies": { "preact": ">=10" } }, "sha512-ubnauqoGczeGISiOh6RjX0/cdaF8v/oDXIjO85XALCQjwQP+SB4RDXXtvZ6yTYSjG+PC1QRP2AhPgCEsM2EvUw=="], "@codebuff/common/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], @@ -1649,7 +1669,11 @@ "@codebuff/sdk/ignore": ["ignore@7.0.5", "", {}, "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg=="], - "@eslint/config-array/minimatch": ["minimatch@10.2.5", "", { "dependencies": { "brace-expansion": "^5.0.5" } }, "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg=="], + "@eslint/eslintrc/ajv": ["ajv@6.15.0", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw=="], + + "@eslint/eslintrc/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], + + "@eslint/eslintrc/js-yaml": ["js-yaml@4.2.0", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-ePWsvanv0DWuDRsW8dnt+R4jQ31SCRCQ7hhNcPXZPsoBZiemuZNYGf7adZdqX2D86j6rvKp3RpCxVTSb8WQlOw=="], "@opentui/core/diff": ["diff@9.0.0", "", {}, "sha512-svtcdpS8CgJyqAjEQIXdb3OjhFVVYjzGAPO8WGCmRbrml64SPw/jJD4GoE98aR7r25A0XcgrK3F02yw9R/vhQw=="], @@ -1683,11 +1707,11 @@ "eslint/ajv": ["ajv@6.15.0", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw=="], - "eslint/eslint-visitor-keys": ["eslint-visitor-keys@5.0.1", "", {}, "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA=="], + "eslint/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], - "eslint/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], + "eslint/eslint-visitor-keys": ["eslint-visitor-keys@4.2.1", "", {}, "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ=="], - "eslint/minimatch": ["minimatch@10.2.5", "", { "dependencies": { "brace-expansion": "^5.0.5" } }, "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg=="], + "eslint/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], "eslint-import-resolver-node/debug": ["debug@3.2.7", "", { "dependencies": { "ms": "^2.1.1" } }, "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ=="], @@ -1699,7 +1723,7 @@ "eslint-plugin-import/tsconfig-paths": ["tsconfig-paths@3.15.0", "", { "dependencies": { "@types/json5": "^0.0.29", "json5": "^1.0.2", "minimist": "^1.2.6", "strip-bom": "^3.0.0" } }, "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg=="], - "espree/eslint-visitor-keys": ["eslint-visitor-keys@5.0.1", "", {}, "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA=="], + "espree/eslint-visitor-keys": ["eslint-visitor-keys@4.2.1", "", {}, "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ=="], "execa/onetime": ["onetime@5.1.2", "", { "dependencies": { "mimic-fn": "^2.1.0" } }, "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg=="], @@ -1727,12 +1751,16 @@ "plist/xmlbuilder": ["xmlbuilder@15.1.1", "", {}, "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg=="], + "rc/strip-json-comments": ["strip-json-comments@2.0.1", "", {}, "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ=="], + "react-devtools-core/ws": ["ws@7.5.11", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": "^5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-zS54Oen9bITtp7kp2XM3AydrCIq1D+HwJOuH+c+e4LfpL/lotP5osijd+UoMnxwAam1GN8R4KtLAyIrIcBNpiA=="], "react-reconciler/scheduler": ["scheduler@0.26.0", "", {}, "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA=="], "send/mime-types": ["mime-types@3.0.2", "", { "dependencies": { "mime-db": "^1.54.0" } }, "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A=="], + "slice-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], + "tar-stream/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=="], "ts-node/diff": ["diff@4.0.4", "", {}, "sha512-X07nttJQkwkfKfvTPG/KSnE2OMdcUCao6+eXF3wmnIQRn2aPAHH3VxDbDOdegkd6JbPsXqShpvEOHfAT+nCNwQ=="], @@ -1747,6 +1775,8 @@ "typescript-eslint/@typescript-eslint/utils": ["@typescript-eslint/utils@7.18.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@typescript-eslint/scope-manager": "7.18.0", "@typescript-eslint/types": "7.18.0", "@typescript-eslint/typescript-estree": "7.18.0" }, "peerDependencies": { "eslint": "^8.56.0" } }, "sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw=="], + "wrap-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], + "wrap-ansi/string-width": ["string-width@8.2.1", "", { "dependencies": { "get-east-asian-width": "^1.5.0", "strip-ansi": "^7.1.2" } }, "sha512-IIaP0g3iy9Cyy18w3M9YcaDudujEAVHKt3a3QJg1+sr/oX96TbaGUubG0hJyCjCBThFH+tFpcIyoUHUn1ogaLA=="], "yargs/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], @@ -1755,7 +1785,9 @@ "@codebuff/evals/pino/process-warning": ["process-warning@5.0.0", "", {}, "sha512-a39t9ApHNx2L4+HBnQKqxxHNs1r7KF+Intd8Q/g1bUh6q0WIp9voPXJ/x0j+ZL45KF1pJd9+q2jLIRMfvEshkA=="], - "@eslint/config-array/minimatch/brace-expansion": ["brace-expansion@5.0.6", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g=="], + "@eslint/eslintrc/ajv/json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], + + "@eslint/eslintrc/js-yaml/argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="], "@typescript-eslint/parser/@typescript-eslint/typescript-estree/minimatch": ["minimatch@9.0.9", "", { "dependencies": { "brace-expansion": "^2.0.2" } }, "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg=="], @@ -1769,14 +1801,10 @@ "cliui/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], - "cliui/wrap-ansi/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], - "eslint-plugin-import/tsconfig-paths/json5": ["json5@1.0.2", "", { "dependencies": { "minimist": "^1.2.0" }, "bin": { "json5": "lib/cli.js" } }, "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA=="], "eslint/ajv/json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], - "eslint/minimatch/brace-expansion": ["brace-expansion@5.0.6", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g=="], - "express/mime-types/mime-db": ["mime-db@1.54.0", "", {}, "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ=="], "p-locate/p-limit/yocto-queue": ["yocto-queue@0.1.0", "", {}, "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="], @@ -1805,12 +1833,8 @@ "yargs/string-width/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], - "@eslint/config-array/minimatch/brace-expansion/balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="], - "@typescript-eslint/parser/@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.1.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-WR1cURNjuvBLMZBMbqM0UoE+WAfdUcEV1ccD8PVBVOI+Z3ND4+SZbN8RsfT2bMuG1qwz5RFvPukSZm5fF2D5eA=="], - "eslint/minimatch/brace-expansion/balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="], - "typescript-eslint/@typescript-eslint/eslint-plugin/@typescript-eslint/scope-manager/@typescript-eslint/types": ["@typescript-eslint/types@7.18.0", "", {}, "sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ=="], "typescript-eslint/@typescript-eslint/eslint-plugin/@typescript-eslint/type-utils/@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@7.18.0", "", { "dependencies": { "@typescript-eslint/types": "7.18.0", "@typescript-eslint/visitor-keys": "7.18.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", "minimatch": "^9.0.4", "semver": "^7.6.0", "ts-api-utils": "^1.3.0" } }, "sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA=="], From 44e27b6ff0a0dc0de967684610a457a10f312d3a Mon Sep 17 00:00:00 2001 From: codebuff public sync bot <41898282+github-actions[bot]@users.noreply.github.com> Date: Sat, 6 Jun 2026 14:13:02 +0000 Subject: [PATCH 07/96] Sync public snapshot from freebuff-private Source: CodebuffAI/freebuff-private@17a9827609b02f74217a4eccaa008c1f67f8b1d3 --- bun.lock | 2 ++ 1 file changed, 2 insertions(+) diff --git a/bun.lock b/bun.lock index c19793154f..509893e072 100644 --- a/bun.lock +++ b/bun.lock @@ -1679,6 +1679,8 @@ "@opentui/core/strip-ansi": ["strip-ansi@7.1.2", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA=="], + "@types/diff/diff": ["diff@9.0.0", "", {}, "sha512-svtcdpS8CgJyqAjEQIXdb3OjhFVVYjzGAPO8WGCmRbrml64SPw/jJD4GoE98aR7r25A0XcgrK3F02yw9R/vhQw=="], + "@typescript-eslint/eslint-plugin/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], "@typescript-eslint/parser/@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@7.18.0", "", { "dependencies": { "@typescript-eslint/types": "7.18.0", "@typescript-eslint/visitor-keys": "7.18.0" } }, "sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA=="], From a8f6816429f67d3cdb323470f800183f8af33a60 Mon Sep 17 00:00:00 2001 From: codebuff public sync bot <41898282+github-actions[bot]@users.noreply.github.com> Date: Sun, 7 Jun 2026 22:13:22 +0000 Subject: [PATCH 08/96] Sync public snapshot from freebuff-private Source: CodebuffAI/freebuff-private@8ed0d82abd2c0606f6717664be4749cd10a96cae --- bun.lock | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/bun.lock b/bun.lock index 509893e072..983653da52 100644 --- a/bun.lock +++ b/bun.lock @@ -431,9 +431,9 @@ "@pinojs/redact": ["@pinojs/redact@0.4.0", "", {}, "sha512-k2ENnmBugE/rzQfEcdWHcCY+/FM3VLzH9cYEsbdsoqrvzAKRhUZeRNhAZvB8OitQJ1TBed3yqWtdjzS6wJKBwg=="], - "@posthog/core": ["@posthog/core@1.30.9", "", { "dependencies": { "@posthog/types": "1.381.0" } }, "sha512-Cn004VJ7ZWQRaVQG7efh+pMtRMIVZznktngXe5I3E8wClRdMwCZaSa6jo/X04Oc04z8PeMp4GEcWVkdEhmAEXw=="], + "@posthog/core": ["@posthog/core@1.30.10", "", { "dependencies": { "@posthog/types": "1.382.0" } }, "sha512-R7Z5jDB3ugwfSujMmRd5osPPR6L6BqfcaSNcYOekzRMZ4Jklq74p05xByP09EnUvKXb5czI+RQVCITTWRWuFXw=="], - "@posthog/types": ["@posthog/types@1.381.0", "", {}, "sha512-AW68BovKFCNbPdq3VjOzfQeSQRYMvQVv+46LDywWFXO/oOTXFKwjY92FaJQSTXWgTNgDpqigCw3yUFDinK3hZA=="], + "@posthog/types": ["@posthog/types@1.382.0", "", {}, "sha512-iK4OcSgvtmS9FZ9EUpvwlRZmHCLXaZ3+6dbRjkE7q9LL0zHLewxJH84H6uGvCw8aGzxs5rIliZqPHgimTcQEaw=="], "@rtsao/scc": ["@rtsao/scc@1.1.0", "", {}, "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g=="], @@ -1321,7 +1321,7 @@ "postgres-interval": ["postgres-interval@1.2.0", "", { "dependencies": { "xtend": "^4.0.0" } }, "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ=="], - "posthog-node": ["posthog-node@5.36.3", "", { "dependencies": { "@posthog/core": "1.30.9" }, "peerDependencies": { "rxjs": "^7.0.0" }, "optionalPeers": ["rxjs"] }, "sha512-cbAB8w3lJf+rQlxgBVkbQha/yJnt7NFe8l23iE5brLl4YLv10y+Xk6a0SzquZzk5tebznW0qpz3WEUJpf2OI9w=="], + "posthog-node": ["posthog-node@5.36.4", "", { "dependencies": { "@posthog/core": "1.30.10" }, "peerDependencies": { "rxjs": "^7.0.0" }, "optionalPeers": ["rxjs"] }, "sha512-N+1WiypMHf3SO3NNoXTUFRzX98TuM5w4bDCm8RenYPf0rvX6r8v+yH6IzL1g/Me+wWA5+sfE1JZ6kGV6pWTZyQ=="], "preact": ["preact@10.29.2", "", {}, "sha512-7tNmwg/7mzzAoB/8kSg6Hl37JraAZw3Z3A0JSY7VXlZwo82Xn0G7wKbNNs2qoF4ZEEsQGTwDAroNdqKs1ofJxQ=="], @@ -1679,8 +1679,6 @@ "@opentui/core/strip-ansi": ["strip-ansi@7.1.2", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA=="], - "@types/diff/diff": ["diff@9.0.0", "", {}, "sha512-svtcdpS8CgJyqAjEQIXdb3OjhFVVYjzGAPO8WGCmRbrml64SPw/jJD4GoE98aR7r25A0XcgrK3F02yw9R/vhQw=="], - "@typescript-eslint/eslint-plugin/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], "@typescript-eslint/parser/@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@7.18.0", "", { "dependencies": { "@typescript-eslint/types": "7.18.0", "@typescript-eslint/visitor-keys": "7.18.0" } }, "sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA=="], From 96a15e89324bcc33f940a222e04ecff0ee04d589 Mon Sep 17 00:00:00 2001 From: codebuff public sync bot <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 8 Jun 2026 00:14:51 +0000 Subject: [PATCH 09/96] Sync public snapshot from freebuff-private Source: CodebuffAI/freebuff-private@5f9bc5c857d4c73af82c9b98c66c38225ef00dc0 --- bun.lock | 74 +++++++------------ .../compile-tool-definitions.test.ts | 15 +++- common/src/tools/compile-tool-definitions.ts | 43 +++++++---- 3 files changed, 69 insertions(+), 63 deletions(-) diff --git a/bun.lock b/bun.lock index 983653da52..adc4ad985a 100644 --- a/bun.lock +++ b/bun.lock @@ -239,19 +239,15 @@ "@eslint-community/regexpp": ["@eslint-community/regexpp@4.12.2", "", {}, "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew=="], - "@eslint/config-array": ["@eslint/config-array@0.21.2", "", { "dependencies": { "@eslint/object-schema": "^2.1.7", "debug": "^4.3.1", "minimatch": "^3.1.5" } }, "sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw=="], + "@eslint/config-array": ["@eslint/config-array@0.23.5", "", { "dependencies": { "@eslint/object-schema": "^3.0.5", "debug": "^4.3.1", "minimatch": "^10.2.4" } }, "sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA=="], - "@eslint/config-helpers": ["@eslint/config-helpers@0.4.2", "", { "dependencies": { "@eslint/core": "^0.17.0" } }, "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw=="], + "@eslint/config-helpers": ["@eslint/config-helpers@0.6.0", "", { "dependencies": { "@eslint/core": "^1.2.1" } }, "sha512-ii6Bw9jJ2zi2cWA2Z+9/QZ/+3DX6kwaV5Q986D/CdP3Lap3w/pgQZ373FV7byY/i7L4IRH/G43I5dz1ClsCbpA=="], - "@eslint/core": ["@eslint/core@0.17.0", "", { "dependencies": { "@types/json-schema": "^7.0.15" } }, "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ=="], + "@eslint/core": ["@eslint/core@1.2.1", "", { "dependencies": { "@types/json-schema": "^7.0.15" } }, "sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ=="], - "@eslint/eslintrc": ["@eslint/eslintrc@3.3.5", "", { "dependencies": { "ajv": "^6.14.0", "debug": "^4.3.2", "espree": "^10.0.1", "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.1", "minimatch": "^3.1.5", "strip-json-comments": "^3.1.1" } }, "sha512-4IlJx0X0qftVsN5E+/vGujTRIFtwuLbNsVUe7TO6zYPDR1O6nFwvwhIKEKSrl6dZchmYBITazxKoUYOjdtjlRg=="], + "@eslint/object-schema": ["@eslint/object-schema@3.0.5", "", {}, "sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw=="], - "@eslint/js": ["@eslint/js@9.39.4", "", {}, "sha512-nE7DEIchvtiFTwBw4Lfbu59PG+kCofhjsKaCWzxTpt4lfRjRMqG6uMBzKXuEcyXhOHoUp9riAm7/aWYGhXZ9cw=="], - - "@eslint/object-schema": ["@eslint/object-schema@2.1.7", "", {}, "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA=="], - - "@eslint/plugin-kit": ["@eslint/plugin-kit@0.4.1", "", { "dependencies": { "@eslint/core": "^0.17.0", "levn": "^0.4.1" } }, "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA=="], + "@eslint/plugin-kit": ["@eslint/plugin-kit@0.7.2", "", { "dependencies": { "@eslint/core": "^1.2.1", "levn": "^0.4.1" } }, "sha512-+CNAzxglkrpNf/kKywqQfk74QjtceuOE7Qm+AF8miRvPF/wmmK5+OJOgVh3AVTT3RP2mH3+FOaxlE5v72owk0A=="], "@gravity-ai/api": ["@gravity-ai/api@0.1.2", "", { "dependencies": { "axios": "^1.13.2" } }, "sha512-txsAhyzvwB/TNrj5R8DoNqw8afM3JY2ahl7aaeaD5ZsxP+7rxff7C7keGI7+gU2KT3d2Mcw4QB1nHhbTSCJYHw=="], @@ -467,6 +463,8 @@ "@types/diff": ["@types/diff@8.0.0", "", { "dependencies": { "diff": "*" } }, "sha512-o7jqJM04gfaYrdCecCVMbZhNdG6T1MHg/oQoRFdERLV+4d+V7FijhiEAbFu0Usww84Yijk9yH58U4Jk4HbtzZw=="], + "@types/esrecurse": ["@types/esrecurse@4.3.1", "", {}, "sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw=="], + "@types/estree": ["@types/estree@1.0.9", "", {}, "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg=="], "@types/js-yaml": ["@types/js-yaml@4.0.9", "", {}, "sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg=="], @@ -549,7 +547,7 @@ "ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="], - "ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + "ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], "any-base": ["any-base@1.1.0", "", {}, "sha512-uMgjozySS8adZZYePpaWs8cxB9/kdzmpX6SgJZ+wbz1K5eYk5QMYDVJaZKhxyIHUdnnJkfR7SVgStgH7LkGUyg=="], @@ -625,8 +623,6 @@ "call-bound": ["call-bound@1.0.4", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "get-intrinsic": "^1.3.0" } }, "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg=="], - "callsites": ["callsites@3.1.0", "", {}, "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="], - "caniuse-lite": ["caniuse-lite@1.0.30001797", "", {}, "sha512-l8xKG+gwAIExZGl9FrF7KUwuOmk6wbEPC9Xoy/RtnWv1XG0Q4LFlagaLpUv3Kiza3W/wm27zy0yWJEieYKAP6w=="], "canvas": ["canvas@3.2.3", "", { "dependencies": { "node-addon-api": "^7.0.0", "prebuild-install": "^7.1.3" } }, "sha512-PzE5nJZPz72YUAfo8oTp0u3fqqY7IzlTubneAihqDYAUcBk7ryeCmBbdJBEdaH0bptSOe2VT2Zwcb3UaFyaSWw=="], @@ -751,7 +747,7 @@ "escape-string-regexp": ["escape-string-regexp@4.0.0", "", {}, "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="], - "eslint": ["eslint@9.39.4", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", "@eslint/config-array": "^0.21.2", "@eslint/config-helpers": "^0.4.2", "@eslint/core": "^0.17.0", "@eslint/eslintrc": "^3.3.5", "@eslint/js": "9.39.4", "@eslint/plugin-kit": "^0.4.1", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "ajv": "^6.14.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^8.4.0", "eslint-visitor-keys": "^4.2.1", "espree": "^10.4.0", "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.5", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, "peerDependencies": { "jiti": "*" }, "optionalPeers": ["jiti"], "bin": { "eslint": "bin/eslint.js" } }, "sha512-XoMjdBOwe/esVgEvLmNsD3IRHkm7fbKIUGvrleloJXUZgDHig2IPWNniv+GwjyJXzuNqVjlr5+4yVUZjycJwfQ=="], + "eslint": ["eslint@10.4.1", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.2", "@eslint/config-array": "^0.23.5", "@eslint/config-helpers": "^0.6.0", "@eslint/core": "^1.2.1", "@eslint/plugin-kit": "^0.7.2", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "ajv": "^6.14.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^9.1.2", "eslint-visitor-keys": "^5.0.1", "espree": "^11.2.0", "esquery": "^1.7.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "minimatch": "^10.2.4", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, "peerDependencies": { "jiti": "*" }, "optionalPeers": ["jiti"], "bin": { "eslint": "bin/eslint.js" } }, "sha512-AyIKhnOBuOAdueD7RB3xB+YeAWScb9jHsJBgH2Hcde8InP5JYhqrRR6iTMHyTEwgENK54Cp44e4v8BwNhsuHuw=="], "eslint-config-prettier": ["eslint-config-prettier@9.1.2", "", { "peerDependencies": { "eslint": ">=7.0.0" }, "bin": { "eslint-config-prettier": "bin/cli.js" } }, "sha512-iI1f+D2ViGn+uvv5HuHVUamg8ll4tN+JRHGc6IJi4TP9Kl976C57fzPXgseXNs8v0iA8aSJpHsTWjDb9QJamGQ=="], @@ -763,11 +759,11 @@ "eslint-plugin-unused-imports": ["eslint-plugin-unused-imports@4.4.1", "", { "peerDependencies": { "@typescript-eslint/eslint-plugin": "^8.0.0-0 || ^7.0.0 || ^6.0.0 || ^5.0.0", "eslint": "^10.0.0 || ^9.0.0 || ^8.0.0" }, "optionalPeers": ["@typescript-eslint/eslint-plugin"] }, "sha512-oZGYUz1X3sRMGUB+0cZyK2VcvRX5lm/vB56PgNNcU+7ficUCKm66oZWKUubXWnOuPjQ8PvmXtCViXBMONPe7tQ=="], - "eslint-scope": ["eslint-scope@8.4.0", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg=="], + "eslint-scope": ["eslint-scope@9.1.2", "", { "dependencies": { "@types/esrecurse": "^4.3.1", "@types/estree": "^1.0.8", "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ=="], "eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="], - "espree": ["espree@10.4.0", "", { "dependencies": { "acorn": "^8.15.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^4.2.1" } }, "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ=="], + "espree": ["espree@11.2.0", "", { "dependencies": { "acorn": "^8.16.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^5.0.1" } }, "sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw=="], "esprima": ["esprima@4.0.1", "", { "bin": { "esparse": "./bin/esparse.js", "esvalidate": "./bin/esvalidate.js" } }, "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="], @@ -879,8 +875,6 @@ "glob-parent": ["glob-parent@6.0.2", "", { "dependencies": { "is-glob": "^4.0.3" } }, "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A=="], - "globals": ["globals@14.0.0", "", {}, "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ=="], - "globalthis": ["globalthis@1.0.4", "", { "dependencies": { "define-properties": "^1.2.1", "gopd": "^1.0.1" } }, "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ=="], "globby": ["globby@11.1.0", "", { "dependencies": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", "fast-glob": "^3.2.9", "ignore": "^5.2.0", "merge2": "^1.4.1", "slash": "^3.0.0" } }, "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g=="], @@ -895,8 +889,6 @@ "has-bigints": ["has-bigints@1.1.0", "", {}, "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg=="], - "has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], - "has-property-descriptors": ["has-property-descriptors@1.0.2", "", { "dependencies": { "es-define-property": "^1.0.0" } }, "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg=="], "has-proto": ["has-proto@1.2.0", "", { "dependencies": { "dunder-proto": "^1.0.0" } }, "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ=="], @@ -927,8 +919,6 @@ "immer": ["immer@10.2.0", "", {}, "sha512-d/+XTN3zfODyjr89gM3mPq1WNX2B8pYsu7eORitdwyA2sBubnTl3laYlBk4sXY5FUa5qTZGBDPJICVbvqzjlbw=="], - "import-fresh": ["import-fresh@3.3.1", "", { "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" } }, "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ=="], - "imurmurhash": ["imurmurhash@0.1.4", "", {}, "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA=="], "inherits": ["inherits@2.0.4", "", {}, "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="], @@ -1045,8 +1035,6 @@ "lodash": ["lodash@4.17.23", "", {}, "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w=="], - "lodash.merge": ["lodash.merge@4.6.2", "", {}, "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ=="], - "log-update": ["log-update@8.0.0", "", { "dependencies": { "ansi-escapes": "^7.3.0", "cli-cursor": "^5.0.0", "slice-ansi": "^9.0.0", "string-width": "^8.2.0", "strip-ansi": "^7.2.0", "wrap-ansi": "^10.0.0" } }, "sha512-lddSgOt3bPASrylL54ZSpy8nBHns+vBVSoILlVOx+dei300pnLRN958rj/EdlVLKuWlSESU3qdnDZdAI7FXYGg=="], "longest-streak": ["longest-streak@3.1.0", "", {}, "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g=="], @@ -1249,8 +1237,6 @@ "pako": ["pako@1.0.11", "", {}, "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw=="], - "parent-module": ["parent-module@1.0.1", "", { "dependencies": { "callsites": "^3.0.0" } }, "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g=="], - "parse-bmfont-ascii": ["parse-bmfont-ascii@1.0.6", "", {}, "sha512-U4RrVsUFCleIOBsIGYOMKjn9PavsGOXxbvYGtMOEfnId0SVNsgehXh1DxUdVPLoxd5mvcEtvmKs2Mmf0Mpa1ZA=="], "parse-bmfont-binary": ["parse-bmfont-binary@1.0.6", "", {}, "sha512-GxmsRea0wdGdYthjuUeWTMWPqm2+FAd4GI8vCvhgJsFnoGhTrLhXDDupwTo7rXVAgaLIGoVHDZS9p/5XbSqeWA=="], @@ -1395,8 +1381,6 @@ "resolve": ["resolve@2.0.0-next.7", "", { "dependencies": { "es-errors": "^1.3.0", "is-core-module": "^2.16.2", "node-exports-info": "^1.6.0", "object-keys": "^1.1.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-tqt+NBWwyaMgw3zDsnygx4CByWjQEJHOPMdslYhppaQSJUtL/D4JO9CcBBlhPoI8lz9oJIDXkwXfhF4aWqP8xQ=="], - "resolve-from": ["resolve-from@4.0.0", "", {}, "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="], - "resolve-pkg-maps": ["resolve-pkg-maps@1.0.0", "", {}, "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw=="], "restore-cursor": ["restore-cursor@5.1.0", "", { "dependencies": { "onetime": "^7.0.0", "signal-exit": "^4.1.0" } }, "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA=="], @@ -1501,7 +1485,7 @@ "strip-final-newline": ["strip-final-newline@2.0.0", "", {}, "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA=="], - "strip-json-comments": ["strip-json-comments@3.1.1", "", {}, "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig=="], + "strip-json-comments": ["strip-json-comments@2.0.1", "", {}, "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ=="], "stripe": ["stripe@16.12.0", "", { "dependencies": { "@types/node": ">=8.1.0", "qs": "^6.11.0" } }, "sha512-H7eFVLDxeTNNSn4JTRfL2//LzCbDrMSZ+2q1c7CanVWgK2qIW5TwS+0V7N9KcKZZNpYh/uCqK0PyZh/2UsaAtQ=="], @@ -1509,8 +1493,6 @@ "styled-jsx": ["styled-jsx@5.1.6", "", { "dependencies": { "client-only": "0.0.1" }, "peerDependencies": { "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0" } }, "sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA=="], - "supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], - "supports-preserve-symlinks-flag": ["supports-preserve-symlinks-flag@1.0.0", "", {}, "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w=="], "supports-terminal-graphics": ["supports-terminal-graphics@0.1.0", "", {}, "sha512-+KdfozhS0Fw8y5Sghw8kkZNGT8nWYzJ1EzcoIvVjxhl+26TJTs26y02yfBgvc1jh5AS/c8jcI3xtahhR95KRyQ=="], @@ -1669,11 +1651,7 @@ "@codebuff/sdk/ignore": ["ignore@7.0.5", "", {}, "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg=="], - "@eslint/eslintrc/ajv": ["ajv@6.15.0", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw=="], - - "@eslint/eslintrc/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], - - "@eslint/eslintrc/js-yaml": ["js-yaml@4.2.0", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-ePWsvanv0DWuDRsW8dnt+R4jQ31SCRCQ7hhNcPXZPsoBZiemuZNYGf7adZdqX2D86j6rvKp3RpCxVTSb8WQlOw=="], + "@eslint/config-array/minimatch": ["minimatch@10.2.5", "", { "dependencies": { "brace-expansion": "^5.0.5" } }, "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg=="], "@opentui/core/diff": ["diff@9.0.0", "", {}, "sha512-svtcdpS8CgJyqAjEQIXdb3OjhFVVYjzGAPO8WGCmRbrml64SPw/jJD4GoE98aR7r25A0XcgrK3F02yw9R/vhQw=="], @@ -1707,12 +1685,12 @@ "eslint/ajv": ["ajv@6.15.0", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw=="], - "eslint/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], - - "eslint/eslint-visitor-keys": ["eslint-visitor-keys@4.2.1", "", {}, "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ=="], + "eslint/eslint-visitor-keys": ["eslint-visitor-keys@5.0.1", "", {}, "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA=="], "eslint/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], + "eslint/minimatch": ["minimatch@10.2.5", "", { "dependencies": { "brace-expansion": "^5.0.5" } }, "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg=="], + "eslint-import-resolver-node/debug": ["debug@3.2.7", "", { "dependencies": { "ms": "^2.1.1" } }, "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ=="], "eslint-module-utils/debug": ["debug@3.2.7", "", { "dependencies": { "ms": "^2.1.1" } }, "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ=="], @@ -1723,7 +1701,7 @@ "eslint-plugin-import/tsconfig-paths": ["tsconfig-paths@3.15.0", "", { "dependencies": { "@types/json5": "^0.0.29", "json5": "^1.0.2", "minimist": "^1.2.6", "strip-bom": "^3.0.0" } }, "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg=="], - "espree/eslint-visitor-keys": ["eslint-visitor-keys@4.2.1", "", {}, "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ=="], + "espree/eslint-visitor-keys": ["eslint-visitor-keys@5.0.1", "", {}, "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA=="], "execa/onetime": ["onetime@5.1.2", "", { "dependencies": { "mimic-fn": "^2.1.0" } }, "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg=="], @@ -1751,16 +1729,12 @@ "plist/xmlbuilder": ["xmlbuilder@15.1.1", "", {}, "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg=="], - "rc/strip-json-comments": ["strip-json-comments@2.0.1", "", {}, "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ=="], - "react-devtools-core/ws": ["ws@7.5.11", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": "^5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-zS54Oen9bITtp7kp2XM3AydrCIq1D+HwJOuH+c+e4LfpL/lotP5osijd+UoMnxwAam1GN8R4KtLAyIrIcBNpiA=="], "react-reconciler/scheduler": ["scheduler@0.26.0", "", {}, "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA=="], "send/mime-types": ["mime-types@3.0.2", "", { "dependencies": { "mime-db": "^1.54.0" } }, "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A=="], - "slice-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], - "tar-stream/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=="], "ts-node/diff": ["diff@4.0.4", "", {}, "sha512-X07nttJQkwkfKfvTPG/KSnE2OMdcUCao6+eXF3wmnIQRn2aPAHH3VxDbDOdegkd6JbPsXqShpvEOHfAT+nCNwQ=="], @@ -1775,8 +1749,6 @@ "typescript-eslint/@typescript-eslint/utils": ["@typescript-eslint/utils@7.18.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@typescript-eslint/scope-manager": "7.18.0", "@typescript-eslint/types": "7.18.0", "@typescript-eslint/typescript-estree": "7.18.0" }, "peerDependencies": { "eslint": "^8.56.0" } }, "sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw=="], - "wrap-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], - "wrap-ansi/string-width": ["string-width@8.2.1", "", { "dependencies": { "get-east-asian-width": "^1.5.0", "strip-ansi": "^7.1.2" } }, "sha512-IIaP0g3iy9Cyy18w3M9YcaDudujEAVHKt3a3QJg1+sr/oX96TbaGUubG0hJyCjCBThFH+tFpcIyoUHUn1ogaLA=="], "yargs/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], @@ -1785,9 +1757,7 @@ "@codebuff/evals/pino/process-warning": ["process-warning@5.0.0", "", {}, "sha512-a39t9ApHNx2L4+HBnQKqxxHNs1r7KF+Intd8Q/g1bUh6q0WIp9voPXJ/x0j+ZL45KF1pJd9+q2jLIRMfvEshkA=="], - "@eslint/eslintrc/ajv/json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], - - "@eslint/eslintrc/js-yaml/argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="], + "@eslint/config-array/minimatch/brace-expansion": ["brace-expansion@5.0.6", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g=="], "@typescript-eslint/parser/@typescript-eslint/typescript-estree/minimatch": ["minimatch@9.0.9", "", { "dependencies": { "brace-expansion": "^2.0.2" } }, "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg=="], @@ -1801,10 +1771,14 @@ "cliui/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], + "cliui/wrap-ansi/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + "eslint-plugin-import/tsconfig-paths/json5": ["json5@1.0.2", "", { "dependencies": { "minimist": "^1.2.0" }, "bin": { "json5": "lib/cli.js" } }, "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA=="], "eslint/ajv/json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], + "eslint/minimatch/brace-expansion": ["brace-expansion@5.0.6", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g=="], + "express/mime-types/mime-db": ["mime-db@1.54.0", "", {}, "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ=="], "p-locate/p-limit/yocto-queue": ["yocto-queue@0.1.0", "", {}, "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="], @@ -1833,8 +1807,12 @@ "yargs/string-width/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + "@eslint/config-array/minimatch/brace-expansion/balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="], + "@typescript-eslint/parser/@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.1.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-WR1cURNjuvBLMZBMbqM0UoE+WAfdUcEV1ccD8PVBVOI+Z3ND4+SZbN8RsfT2bMuG1qwz5RFvPukSZm5fF2D5eA=="], + "eslint/minimatch/brace-expansion/balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="], + "typescript-eslint/@typescript-eslint/eslint-plugin/@typescript-eslint/scope-manager/@typescript-eslint/types": ["@typescript-eslint/types@7.18.0", "", {}, "sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ=="], "typescript-eslint/@typescript-eslint/eslint-plugin/@typescript-eslint/type-utils/@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@7.18.0", "", { "dependencies": { "@typescript-eslint/types": "7.18.0", "@typescript-eslint/visitor-keys": "7.18.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", "minimatch": "^9.0.4", "semver": "^7.6.0", "ts-api-utils": "^1.3.0" } }, "sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA=="], diff --git a/common/src/tools/__tests__/compile-tool-definitions.test.ts b/common/src/tools/__tests__/compile-tool-definitions.test.ts index 12b8b751f4..c7179ffeda 100644 --- a/common/src/tools/__tests__/compile-tool-definitions.test.ts +++ b/common/src/tools/__tests__/compile-tool-definitions.test.ts @@ -1,7 +1,10 @@ import { describe, expect, test } from 'bun:test' +import z from 'zod/v4' import { compileToolDefinitions } from '../compile-tool-definitions' +// These tests feed synthetic schemas so they exercise the compile logic +// directly and stay stable as real tools are added, removed, or reshaped. describe('compileToolDefinitions', () => { test('emits gravity index action enum values', () => { const definitions = compileToolDefinitions() @@ -14,8 +17,18 @@ describe('compileToolDefinitions', () => { }) test('keeps object tool schemas as interfaces', () => { - const definitions = compileToolDefinitions() + const objectSchema = z.object({ query: z.string() }) + const definitions = compileToolDefinitions([ + { name: 'web_search', inputSchema: objectSchema }, + ]) expect(definitions).toContain('export interface WebSearchParams {') }) + + test('compiles every published tool by default', () => { + const definitions = compileToolDefinitions() + + expect(definitions).toContain('export type ToolName =') + expect(definitions).toContain('export interface ToolParamsMap {') + }) }) diff --git a/common/src/tools/compile-tool-definitions.ts b/common/src/tools/compile-tool-definitions.ts index fb478324d5..7b0e01bb59 100644 --- a/common/src/tools/compile-tool-definitions.ts +++ b/common/src/tools/compile-tool-definitions.ts @@ -3,19 +3,34 @@ import z from 'zod/v4' import { publishedTools } from './constants' import { toolParams } from './list' -/** - * Compiles all tool definitions into a single TypeScript definition file content. - * This generates type definitions for all available tools and their parameters. - */ -export function compileToolDefinitions(): string { - const toolEntries = publishedTools.map( - (toolName) => [toolName, toolParams[toolName]] as const, - ) +/** A tool name plus the Zod schema describing its parameters. */ +export interface ToolSchemaEntry { + /** Snake_case tool name, e.g. 'web_search'. */ + name: string + /** Zod schema for the tool's parameters. */ + inputSchema: z.ZodType +} - const toolInterfaces = toolEntries - .map(([toolName, toolDef]) => { - const parameterSchema = toolDef.inputSchema +/** The published tools and their parameter schemas, in published order. */ +function getPublishedToolEntries(): ToolSchemaEntry[] { + return publishedTools.map((toolName) => ({ + name: toolName, + inputSchema: toolParams[toolName].inputSchema, + })) +} +/** + * Compiles tool definitions into a single TypeScript definition file content. + * This generates type definitions for the given tools and their parameters. + * + * Defaults to every published tool; callers (e.g. tests) may pass an explicit + * list to compile definitions for a specific set of schemas instead. + */ +export function compileToolDefinitions( + tools: ToolSchemaEntry[] = getPublishedToolEntries(), +): string { + const toolInterfaces = tools + .map(({ name: toolName, inputSchema: parameterSchema }) => { // Convert Zod schema to TypeScript interface using JSON schema let typeDefinition: string let jsonSchema: unknown @@ -39,10 +54,10 @@ ${declaration}` }) .join('\n\n') - const toolUnion = toolEntries.map(([toolName]) => `'${toolName}'`).join(' | ') + const toolUnion = tools.map(({ name }) => `'${name}'`).join(' | ') - const toolParamsMap = toolEntries - .map(([toolName]) => ` '${toolName}': ${toPascalCase(toolName)}Params`) + const toolParamsMap = tools + .map(({ name }) => ` '${name}': ${toPascalCase(name)}Params`) .join('\n') return `/** From 4535c39d5a234b7af530d26fe13c4d23d9ac94ed Mon Sep 17 00:00:00 2001 From: codebuff public sync bot <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 8 Jun 2026 03:48:14 +0000 Subject: [PATCH 10/96] Sync public snapshot from freebuff-private Source: CodebuffAI/freebuff-private@f87e7d7e97bdbcf309f769c9105cf41e3d9b5c3c --- bun.lock | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/bun.lock b/bun.lock index adc4ad985a..6555038406 100644 --- a/bun.lock +++ b/bun.lock @@ -233,7 +233,7 @@ "@cspotcode/source-map-support": ["@cspotcode/source-map-support@0.8.1", "", { "dependencies": { "@jridgewell/trace-mapping": "0.3.9" } }, "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw=="], - "@emnapi/runtime": ["@emnapi/runtime@1.10.0", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA=="], + "@emnapi/runtime": ["@emnapi/runtime@1.11.0", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-55coeOFKHv1ywEcUXJtWU5f+Jr/W5tZDvZig8DLKSwUN1JpROQ4rk/SNOQiFWmaR/VKF4zuFyW1B8JduOSv6Pg=="], "@eslint-community/eslint-utils": ["@eslint-community/eslint-utils@4.9.1", "", { "dependencies": { "eslint-visitor-keys": "^3.4.3" }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ=="], @@ -1657,6 +1657,8 @@ "@opentui/core/strip-ansi": ["strip-ansi@7.1.2", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA=="], + "@types/diff/diff": ["diff@9.0.0", "", {}, "sha512-svtcdpS8CgJyqAjEQIXdb3OjhFVVYjzGAPO8WGCmRbrml64SPw/jJD4GoE98aR7r25A0XcgrK3F02yw9R/vhQw=="], + "@typescript-eslint/eslint-plugin/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], "@typescript-eslint/parser/@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@7.18.0", "", { "dependencies": { "@typescript-eslint/types": "7.18.0", "@typescript-eslint/visitor-keys": "7.18.0" } }, "sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA=="], From c4b068076940a79f587aeb6fc7ee386ff53bc401 Mon Sep 17 00:00:00 2001 From: codebuff public sync bot <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 8 Jun 2026 04:41:44 +0000 Subject: [PATCH 11/96] Sync public snapshot from freebuff-private Source: CodebuffAI/freebuff-private@2894f481247190dcc0480d583fedcc07831acd27 --- bun.lock | 74 ++++++++++++++++++++++++++++++++++++-------------------- 1 file changed, 48 insertions(+), 26 deletions(-) diff --git a/bun.lock b/bun.lock index 6555038406..f45e11cdea 100644 --- a/bun.lock +++ b/bun.lock @@ -239,15 +239,19 @@ "@eslint-community/regexpp": ["@eslint-community/regexpp@4.12.2", "", {}, "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew=="], - "@eslint/config-array": ["@eslint/config-array@0.23.5", "", { "dependencies": { "@eslint/object-schema": "^3.0.5", "debug": "^4.3.1", "minimatch": "^10.2.4" } }, "sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA=="], + "@eslint/config-array": ["@eslint/config-array@0.21.2", "", { "dependencies": { "@eslint/object-schema": "^2.1.7", "debug": "^4.3.1", "minimatch": "^3.1.5" } }, "sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw=="], - "@eslint/config-helpers": ["@eslint/config-helpers@0.6.0", "", { "dependencies": { "@eslint/core": "^1.2.1" } }, "sha512-ii6Bw9jJ2zi2cWA2Z+9/QZ/+3DX6kwaV5Q986D/CdP3Lap3w/pgQZ373FV7byY/i7L4IRH/G43I5dz1ClsCbpA=="], + "@eslint/config-helpers": ["@eslint/config-helpers@0.4.2", "", { "dependencies": { "@eslint/core": "^0.17.0" } }, "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw=="], - "@eslint/core": ["@eslint/core@1.2.1", "", { "dependencies": { "@types/json-schema": "^7.0.15" } }, "sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ=="], + "@eslint/core": ["@eslint/core@0.17.0", "", { "dependencies": { "@types/json-schema": "^7.0.15" } }, "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ=="], - "@eslint/object-schema": ["@eslint/object-schema@3.0.5", "", {}, "sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw=="], + "@eslint/eslintrc": ["@eslint/eslintrc@3.3.5", "", { "dependencies": { "ajv": "^6.14.0", "debug": "^4.3.2", "espree": "^10.0.1", "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.1", "minimatch": "^3.1.5", "strip-json-comments": "^3.1.1" } }, "sha512-4IlJx0X0qftVsN5E+/vGujTRIFtwuLbNsVUe7TO6zYPDR1O6nFwvwhIKEKSrl6dZchmYBITazxKoUYOjdtjlRg=="], - "@eslint/plugin-kit": ["@eslint/plugin-kit@0.7.2", "", { "dependencies": { "@eslint/core": "^1.2.1", "levn": "^0.4.1" } }, "sha512-+CNAzxglkrpNf/kKywqQfk74QjtceuOE7Qm+AF8miRvPF/wmmK5+OJOgVh3AVTT3RP2mH3+FOaxlE5v72owk0A=="], + "@eslint/js": ["@eslint/js@9.39.4", "", {}, "sha512-nE7DEIchvtiFTwBw4Lfbu59PG+kCofhjsKaCWzxTpt4lfRjRMqG6uMBzKXuEcyXhOHoUp9riAm7/aWYGhXZ9cw=="], + + "@eslint/object-schema": ["@eslint/object-schema@2.1.7", "", {}, "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA=="], + + "@eslint/plugin-kit": ["@eslint/plugin-kit@0.4.1", "", { "dependencies": { "@eslint/core": "^0.17.0", "levn": "^0.4.1" } }, "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA=="], "@gravity-ai/api": ["@gravity-ai/api@0.1.2", "", { "dependencies": { "axios": "^1.13.2" } }, "sha512-txsAhyzvwB/TNrj5R8DoNqw8afM3JY2ahl7aaeaD5ZsxP+7rxff7C7keGI7+gU2KT3d2Mcw4QB1nHhbTSCJYHw=="], @@ -463,8 +467,6 @@ "@types/diff": ["@types/diff@8.0.0", "", { "dependencies": { "diff": "*" } }, "sha512-o7jqJM04gfaYrdCecCVMbZhNdG6T1MHg/oQoRFdERLV+4d+V7FijhiEAbFu0Usww84Yijk9yH58U4Jk4HbtzZw=="], - "@types/esrecurse": ["@types/esrecurse@4.3.1", "", {}, "sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw=="], - "@types/estree": ["@types/estree@1.0.9", "", {}, "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg=="], "@types/js-yaml": ["@types/js-yaml@4.0.9", "", {}, "sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg=="], @@ -547,7 +549,7 @@ "ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="], - "ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], + "ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], "any-base": ["any-base@1.1.0", "", {}, "sha512-uMgjozySS8adZZYePpaWs8cxB9/kdzmpX6SgJZ+wbz1K5eYk5QMYDVJaZKhxyIHUdnnJkfR7SVgStgH7LkGUyg=="], @@ -623,6 +625,8 @@ "call-bound": ["call-bound@1.0.4", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "get-intrinsic": "^1.3.0" } }, "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg=="], + "callsites": ["callsites@3.1.0", "", {}, "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="], + "caniuse-lite": ["caniuse-lite@1.0.30001797", "", {}, "sha512-l8xKG+gwAIExZGl9FrF7KUwuOmk6wbEPC9Xoy/RtnWv1XG0Q4LFlagaLpUv3Kiza3W/wm27zy0yWJEieYKAP6w=="], "canvas": ["canvas@3.2.3", "", { "dependencies": { "node-addon-api": "^7.0.0", "prebuild-install": "^7.1.3" } }, "sha512-PzE5nJZPz72YUAfo8oTp0u3fqqY7IzlTubneAihqDYAUcBk7ryeCmBbdJBEdaH0bptSOe2VT2Zwcb3UaFyaSWw=="], @@ -747,7 +751,7 @@ "escape-string-regexp": ["escape-string-regexp@4.0.0", "", {}, "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="], - "eslint": ["eslint@10.4.1", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.2", "@eslint/config-array": "^0.23.5", "@eslint/config-helpers": "^0.6.0", "@eslint/core": "^1.2.1", "@eslint/plugin-kit": "^0.7.2", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "ajv": "^6.14.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^9.1.2", "eslint-visitor-keys": "^5.0.1", "espree": "^11.2.0", "esquery": "^1.7.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "minimatch": "^10.2.4", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, "peerDependencies": { "jiti": "*" }, "optionalPeers": ["jiti"], "bin": { "eslint": "bin/eslint.js" } }, "sha512-AyIKhnOBuOAdueD7RB3xB+YeAWScb9jHsJBgH2Hcde8InP5JYhqrRR6iTMHyTEwgENK54Cp44e4v8BwNhsuHuw=="], + "eslint": ["eslint@9.39.4", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", "@eslint/config-array": "^0.21.2", "@eslint/config-helpers": "^0.4.2", "@eslint/core": "^0.17.0", "@eslint/eslintrc": "^3.3.5", "@eslint/js": "9.39.4", "@eslint/plugin-kit": "^0.4.1", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "ajv": "^6.14.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^8.4.0", "eslint-visitor-keys": "^4.2.1", "espree": "^10.4.0", "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.5", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, "peerDependencies": { "jiti": "*" }, "optionalPeers": ["jiti"], "bin": { "eslint": "bin/eslint.js" } }, "sha512-XoMjdBOwe/esVgEvLmNsD3IRHkm7fbKIUGvrleloJXUZgDHig2IPWNniv+GwjyJXzuNqVjlr5+4yVUZjycJwfQ=="], "eslint-config-prettier": ["eslint-config-prettier@9.1.2", "", { "peerDependencies": { "eslint": ">=7.0.0" }, "bin": { "eslint-config-prettier": "bin/cli.js" } }, "sha512-iI1f+D2ViGn+uvv5HuHVUamg8ll4tN+JRHGc6IJi4TP9Kl976C57fzPXgseXNs8v0iA8aSJpHsTWjDb9QJamGQ=="], @@ -759,11 +763,11 @@ "eslint-plugin-unused-imports": ["eslint-plugin-unused-imports@4.4.1", "", { "peerDependencies": { "@typescript-eslint/eslint-plugin": "^8.0.0-0 || ^7.0.0 || ^6.0.0 || ^5.0.0", "eslint": "^10.0.0 || ^9.0.0 || ^8.0.0" }, "optionalPeers": ["@typescript-eslint/eslint-plugin"] }, "sha512-oZGYUz1X3sRMGUB+0cZyK2VcvRX5lm/vB56PgNNcU+7ficUCKm66oZWKUubXWnOuPjQ8PvmXtCViXBMONPe7tQ=="], - "eslint-scope": ["eslint-scope@9.1.2", "", { "dependencies": { "@types/esrecurse": "^4.3.1", "@types/estree": "^1.0.8", "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ=="], + "eslint-scope": ["eslint-scope@8.4.0", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg=="], "eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="], - "espree": ["espree@11.2.0", "", { "dependencies": { "acorn": "^8.16.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^5.0.1" } }, "sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw=="], + "espree": ["espree@10.4.0", "", { "dependencies": { "acorn": "^8.15.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^4.2.1" } }, "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ=="], "esprima": ["esprima@4.0.1", "", { "bin": { "esparse": "./bin/esparse.js", "esvalidate": "./bin/esvalidate.js" } }, "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="], @@ -875,6 +879,8 @@ "glob-parent": ["glob-parent@6.0.2", "", { "dependencies": { "is-glob": "^4.0.3" } }, "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A=="], + "globals": ["globals@14.0.0", "", {}, "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ=="], + "globalthis": ["globalthis@1.0.4", "", { "dependencies": { "define-properties": "^1.2.1", "gopd": "^1.0.1" } }, "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ=="], "globby": ["globby@11.1.0", "", { "dependencies": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", "fast-glob": "^3.2.9", "ignore": "^5.2.0", "merge2": "^1.4.1", "slash": "^3.0.0" } }, "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g=="], @@ -889,6 +895,8 @@ "has-bigints": ["has-bigints@1.1.0", "", {}, "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg=="], + "has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], + "has-property-descriptors": ["has-property-descriptors@1.0.2", "", { "dependencies": { "es-define-property": "^1.0.0" } }, "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg=="], "has-proto": ["has-proto@1.2.0", "", { "dependencies": { "dunder-proto": "^1.0.0" } }, "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ=="], @@ -919,6 +927,8 @@ "immer": ["immer@10.2.0", "", {}, "sha512-d/+XTN3zfODyjr89gM3mPq1WNX2B8pYsu7eORitdwyA2sBubnTl3laYlBk4sXY5FUa5qTZGBDPJICVbvqzjlbw=="], + "import-fresh": ["import-fresh@3.3.1", "", { "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" } }, "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ=="], + "imurmurhash": ["imurmurhash@0.1.4", "", {}, "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA=="], "inherits": ["inherits@2.0.4", "", {}, "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="], @@ -1035,6 +1045,8 @@ "lodash": ["lodash@4.17.23", "", {}, "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w=="], + "lodash.merge": ["lodash.merge@4.6.2", "", {}, "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ=="], + "log-update": ["log-update@8.0.0", "", { "dependencies": { "ansi-escapes": "^7.3.0", "cli-cursor": "^5.0.0", "slice-ansi": "^9.0.0", "string-width": "^8.2.0", "strip-ansi": "^7.2.0", "wrap-ansi": "^10.0.0" } }, "sha512-lddSgOt3bPASrylL54ZSpy8nBHns+vBVSoILlVOx+dei300pnLRN958rj/EdlVLKuWlSESU3qdnDZdAI7FXYGg=="], "longest-streak": ["longest-streak@3.1.0", "", {}, "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g=="], @@ -1237,6 +1249,8 @@ "pako": ["pako@1.0.11", "", {}, "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw=="], + "parent-module": ["parent-module@1.0.1", "", { "dependencies": { "callsites": "^3.0.0" } }, "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g=="], + "parse-bmfont-ascii": ["parse-bmfont-ascii@1.0.6", "", {}, "sha512-U4RrVsUFCleIOBsIGYOMKjn9PavsGOXxbvYGtMOEfnId0SVNsgehXh1DxUdVPLoxd5mvcEtvmKs2Mmf0Mpa1ZA=="], "parse-bmfont-binary": ["parse-bmfont-binary@1.0.6", "", {}, "sha512-GxmsRea0wdGdYthjuUeWTMWPqm2+FAd4GI8vCvhgJsFnoGhTrLhXDDupwTo7rXVAgaLIGoVHDZS9p/5XbSqeWA=="], @@ -1381,6 +1395,8 @@ "resolve": ["resolve@2.0.0-next.7", "", { "dependencies": { "es-errors": "^1.3.0", "is-core-module": "^2.16.2", "node-exports-info": "^1.6.0", "object-keys": "^1.1.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-tqt+NBWwyaMgw3zDsnygx4CByWjQEJHOPMdslYhppaQSJUtL/D4JO9CcBBlhPoI8lz9oJIDXkwXfhF4aWqP8xQ=="], + "resolve-from": ["resolve-from@4.0.0", "", {}, "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="], + "resolve-pkg-maps": ["resolve-pkg-maps@1.0.0", "", {}, "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw=="], "restore-cursor": ["restore-cursor@5.1.0", "", { "dependencies": { "onetime": "^7.0.0", "signal-exit": "^4.1.0" } }, "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA=="], @@ -1485,7 +1501,7 @@ "strip-final-newline": ["strip-final-newline@2.0.0", "", {}, "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA=="], - "strip-json-comments": ["strip-json-comments@2.0.1", "", {}, "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ=="], + "strip-json-comments": ["strip-json-comments@3.1.1", "", {}, "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig=="], "stripe": ["stripe@16.12.0", "", { "dependencies": { "@types/node": ">=8.1.0", "qs": "^6.11.0" } }, "sha512-H7eFVLDxeTNNSn4JTRfL2//LzCbDrMSZ+2q1c7CanVWgK2qIW5TwS+0V7N9KcKZZNpYh/uCqK0PyZh/2UsaAtQ=="], @@ -1493,6 +1509,8 @@ "styled-jsx": ["styled-jsx@5.1.6", "", { "dependencies": { "client-only": "0.0.1" }, "peerDependencies": { "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0" } }, "sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA=="], + "supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], + "supports-preserve-symlinks-flag": ["supports-preserve-symlinks-flag@1.0.0", "", {}, "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w=="], "supports-terminal-graphics": ["supports-terminal-graphics@0.1.0", "", {}, "sha512-+KdfozhS0Fw8y5Sghw8kkZNGT8nWYzJ1EzcoIvVjxhl+26TJTs26y02yfBgvc1jh5AS/c8jcI3xtahhR95KRyQ=="], @@ -1651,7 +1669,11 @@ "@codebuff/sdk/ignore": ["ignore@7.0.5", "", {}, "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg=="], - "@eslint/config-array/minimatch": ["minimatch@10.2.5", "", { "dependencies": { "brace-expansion": "^5.0.5" } }, "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg=="], + "@eslint/eslintrc/ajv": ["ajv@6.15.0", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw=="], + + "@eslint/eslintrc/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], + + "@eslint/eslintrc/js-yaml": ["js-yaml@4.2.0", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-ePWsvanv0DWuDRsW8dnt+R4jQ31SCRCQ7hhNcPXZPsoBZiemuZNYGf7adZdqX2D86j6rvKp3RpCxVTSb8WQlOw=="], "@opentui/core/diff": ["diff@9.0.0", "", {}, "sha512-svtcdpS8CgJyqAjEQIXdb3OjhFVVYjzGAPO8WGCmRbrml64SPw/jJD4GoE98aR7r25A0XcgrK3F02yw9R/vhQw=="], @@ -1687,11 +1709,11 @@ "eslint/ajv": ["ajv@6.15.0", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw=="], - "eslint/eslint-visitor-keys": ["eslint-visitor-keys@5.0.1", "", {}, "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA=="], + "eslint/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], - "eslint/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], + "eslint/eslint-visitor-keys": ["eslint-visitor-keys@4.2.1", "", {}, "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ=="], - "eslint/minimatch": ["minimatch@10.2.5", "", { "dependencies": { "brace-expansion": "^5.0.5" } }, "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg=="], + "eslint/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], "eslint-import-resolver-node/debug": ["debug@3.2.7", "", { "dependencies": { "ms": "^2.1.1" } }, "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ=="], @@ -1703,7 +1725,7 @@ "eslint-plugin-import/tsconfig-paths": ["tsconfig-paths@3.15.0", "", { "dependencies": { "@types/json5": "^0.0.29", "json5": "^1.0.2", "minimist": "^1.2.6", "strip-bom": "^3.0.0" } }, "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg=="], - "espree/eslint-visitor-keys": ["eslint-visitor-keys@5.0.1", "", {}, "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA=="], + "espree/eslint-visitor-keys": ["eslint-visitor-keys@4.2.1", "", {}, "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ=="], "execa/onetime": ["onetime@5.1.2", "", { "dependencies": { "mimic-fn": "^2.1.0" } }, "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg=="], @@ -1731,12 +1753,16 @@ "plist/xmlbuilder": ["xmlbuilder@15.1.1", "", {}, "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg=="], + "rc/strip-json-comments": ["strip-json-comments@2.0.1", "", {}, "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ=="], + "react-devtools-core/ws": ["ws@7.5.11", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": "^5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-zS54Oen9bITtp7kp2XM3AydrCIq1D+HwJOuH+c+e4LfpL/lotP5osijd+UoMnxwAam1GN8R4KtLAyIrIcBNpiA=="], "react-reconciler/scheduler": ["scheduler@0.26.0", "", {}, "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA=="], "send/mime-types": ["mime-types@3.0.2", "", { "dependencies": { "mime-db": "^1.54.0" } }, "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A=="], + "slice-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], + "tar-stream/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=="], "ts-node/diff": ["diff@4.0.4", "", {}, "sha512-X07nttJQkwkfKfvTPG/KSnE2OMdcUCao6+eXF3wmnIQRn2aPAHH3VxDbDOdegkd6JbPsXqShpvEOHfAT+nCNwQ=="], @@ -1751,6 +1777,8 @@ "typescript-eslint/@typescript-eslint/utils": ["@typescript-eslint/utils@7.18.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@typescript-eslint/scope-manager": "7.18.0", "@typescript-eslint/types": "7.18.0", "@typescript-eslint/typescript-estree": "7.18.0" }, "peerDependencies": { "eslint": "^8.56.0" } }, "sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw=="], + "wrap-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], + "wrap-ansi/string-width": ["string-width@8.2.1", "", { "dependencies": { "get-east-asian-width": "^1.5.0", "strip-ansi": "^7.1.2" } }, "sha512-IIaP0g3iy9Cyy18w3M9YcaDudujEAVHKt3a3QJg1+sr/oX96TbaGUubG0hJyCjCBThFH+tFpcIyoUHUn1ogaLA=="], "yargs/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], @@ -1759,7 +1787,9 @@ "@codebuff/evals/pino/process-warning": ["process-warning@5.0.0", "", {}, "sha512-a39t9ApHNx2L4+HBnQKqxxHNs1r7KF+Intd8Q/g1bUh6q0WIp9voPXJ/x0j+ZL45KF1pJd9+q2jLIRMfvEshkA=="], - "@eslint/config-array/minimatch/brace-expansion": ["brace-expansion@5.0.6", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g=="], + "@eslint/eslintrc/ajv/json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], + + "@eslint/eslintrc/js-yaml/argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="], "@typescript-eslint/parser/@typescript-eslint/typescript-estree/minimatch": ["minimatch@9.0.9", "", { "dependencies": { "brace-expansion": "^2.0.2" } }, "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg=="], @@ -1773,14 +1803,10 @@ "cliui/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], - "cliui/wrap-ansi/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], - "eslint-plugin-import/tsconfig-paths/json5": ["json5@1.0.2", "", { "dependencies": { "minimist": "^1.2.0" }, "bin": { "json5": "lib/cli.js" } }, "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA=="], "eslint/ajv/json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], - "eslint/minimatch/brace-expansion": ["brace-expansion@5.0.6", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g=="], - "express/mime-types/mime-db": ["mime-db@1.54.0", "", {}, "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ=="], "p-locate/p-limit/yocto-queue": ["yocto-queue@0.1.0", "", {}, "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="], @@ -1809,12 +1835,8 @@ "yargs/string-width/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], - "@eslint/config-array/minimatch/brace-expansion/balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="], - "@typescript-eslint/parser/@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.1.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-WR1cURNjuvBLMZBMbqM0UoE+WAfdUcEV1ccD8PVBVOI+Z3ND4+SZbN8RsfT2bMuG1qwz5RFvPukSZm5fF2D5eA=="], - "eslint/minimatch/brace-expansion/balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="], - "typescript-eslint/@typescript-eslint/eslint-plugin/@typescript-eslint/scope-manager/@typescript-eslint/types": ["@typescript-eslint/types@7.18.0", "", {}, "sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ=="], "typescript-eslint/@typescript-eslint/eslint-plugin/@typescript-eslint/type-utils/@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@7.18.0", "", { "dependencies": { "@typescript-eslint/types": "7.18.0", "@typescript-eslint/visitor-keys": "7.18.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", "minimatch": "^9.0.4", "semver": "^7.6.0", "ts-api-utils": "^1.3.0" } }, "sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA=="], From a33b8f39b927904713e554be65f4ade57eb6ada1 Mon Sep 17 00:00:00 2001 From: codebuff public sync bot <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 8 Jun 2026 09:51:13 +0000 Subject: [PATCH 12/96] Sync public snapshot from freebuff-private Source: CodebuffAI/freebuff-private@3418f52c2c105e0b93df395365ef60de17a65551 --- bun.lock | 76 +++++++++++++++++++------------------------------------- 1 file changed, 26 insertions(+), 50 deletions(-) diff --git a/bun.lock b/bun.lock index f45e11cdea..f03a8b1fc8 100644 --- a/bun.lock +++ b/bun.lock @@ -239,19 +239,15 @@ "@eslint-community/regexpp": ["@eslint-community/regexpp@4.12.2", "", {}, "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew=="], - "@eslint/config-array": ["@eslint/config-array@0.21.2", "", { "dependencies": { "@eslint/object-schema": "^2.1.7", "debug": "^4.3.1", "minimatch": "^3.1.5" } }, "sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw=="], + "@eslint/config-array": ["@eslint/config-array@0.23.5", "", { "dependencies": { "@eslint/object-schema": "^3.0.5", "debug": "^4.3.1", "minimatch": "^10.2.4" } }, "sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA=="], - "@eslint/config-helpers": ["@eslint/config-helpers@0.4.2", "", { "dependencies": { "@eslint/core": "^0.17.0" } }, "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw=="], + "@eslint/config-helpers": ["@eslint/config-helpers@0.6.0", "", { "dependencies": { "@eslint/core": "^1.2.1" } }, "sha512-ii6Bw9jJ2zi2cWA2Z+9/QZ/+3DX6kwaV5Q986D/CdP3Lap3w/pgQZ373FV7byY/i7L4IRH/G43I5dz1ClsCbpA=="], - "@eslint/core": ["@eslint/core@0.17.0", "", { "dependencies": { "@types/json-schema": "^7.0.15" } }, "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ=="], + "@eslint/core": ["@eslint/core@1.2.1", "", { "dependencies": { "@types/json-schema": "^7.0.15" } }, "sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ=="], - "@eslint/eslintrc": ["@eslint/eslintrc@3.3.5", "", { "dependencies": { "ajv": "^6.14.0", "debug": "^4.3.2", "espree": "^10.0.1", "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.1", "minimatch": "^3.1.5", "strip-json-comments": "^3.1.1" } }, "sha512-4IlJx0X0qftVsN5E+/vGujTRIFtwuLbNsVUe7TO6zYPDR1O6nFwvwhIKEKSrl6dZchmYBITazxKoUYOjdtjlRg=="], + "@eslint/object-schema": ["@eslint/object-schema@3.0.5", "", {}, "sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw=="], - "@eslint/js": ["@eslint/js@9.39.4", "", {}, "sha512-nE7DEIchvtiFTwBw4Lfbu59PG+kCofhjsKaCWzxTpt4lfRjRMqG6uMBzKXuEcyXhOHoUp9riAm7/aWYGhXZ9cw=="], - - "@eslint/object-schema": ["@eslint/object-schema@2.1.7", "", {}, "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA=="], - - "@eslint/plugin-kit": ["@eslint/plugin-kit@0.4.1", "", { "dependencies": { "@eslint/core": "^0.17.0", "levn": "^0.4.1" } }, "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA=="], + "@eslint/plugin-kit": ["@eslint/plugin-kit@0.7.2", "", { "dependencies": { "@eslint/core": "^1.2.1", "levn": "^0.4.1" } }, "sha512-+CNAzxglkrpNf/kKywqQfk74QjtceuOE7Qm+AF8miRvPF/wmmK5+OJOgVh3AVTT3RP2mH3+FOaxlE5v72owk0A=="], "@gravity-ai/api": ["@gravity-ai/api@0.1.2", "", { "dependencies": { "axios": "^1.13.2" } }, "sha512-txsAhyzvwB/TNrj5R8DoNqw8afM3JY2ahl7aaeaD5ZsxP+7rxff7C7keGI7+gU2KT3d2Mcw4QB1nHhbTSCJYHw=="], @@ -467,6 +463,8 @@ "@types/diff": ["@types/diff@8.0.0", "", { "dependencies": { "diff": "*" } }, "sha512-o7jqJM04gfaYrdCecCVMbZhNdG6T1MHg/oQoRFdERLV+4d+V7FijhiEAbFu0Usww84Yijk9yH58U4Jk4HbtzZw=="], + "@types/esrecurse": ["@types/esrecurse@4.3.1", "", {}, "sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw=="], + "@types/estree": ["@types/estree@1.0.9", "", {}, "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg=="], "@types/js-yaml": ["@types/js-yaml@4.0.9", "", {}, "sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg=="], @@ -549,7 +547,7 @@ "ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="], - "ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + "ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], "any-base": ["any-base@1.1.0", "", {}, "sha512-uMgjozySS8adZZYePpaWs8cxB9/kdzmpX6SgJZ+wbz1K5eYk5QMYDVJaZKhxyIHUdnnJkfR7SVgStgH7LkGUyg=="], @@ -625,8 +623,6 @@ "call-bound": ["call-bound@1.0.4", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "get-intrinsic": "^1.3.0" } }, "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg=="], - "callsites": ["callsites@3.1.0", "", {}, "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="], - "caniuse-lite": ["caniuse-lite@1.0.30001797", "", {}, "sha512-l8xKG+gwAIExZGl9FrF7KUwuOmk6wbEPC9Xoy/RtnWv1XG0Q4LFlagaLpUv3Kiza3W/wm27zy0yWJEieYKAP6w=="], "canvas": ["canvas@3.2.3", "", { "dependencies": { "node-addon-api": "^7.0.0", "prebuild-install": "^7.1.3" } }, "sha512-PzE5nJZPz72YUAfo8oTp0u3fqqY7IzlTubneAihqDYAUcBk7ryeCmBbdJBEdaH0bptSOe2VT2Zwcb3UaFyaSWw=="], @@ -751,7 +747,7 @@ "escape-string-regexp": ["escape-string-regexp@4.0.0", "", {}, "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="], - "eslint": ["eslint@9.39.4", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", "@eslint/config-array": "^0.21.2", "@eslint/config-helpers": "^0.4.2", "@eslint/core": "^0.17.0", "@eslint/eslintrc": "^3.3.5", "@eslint/js": "9.39.4", "@eslint/plugin-kit": "^0.4.1", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "ajv": "^6.14.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^8.4.0", "eslint-visitor-keys": "^4.2.1", "espree": "^10.4.0", "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.5", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, "peerDependencies": { "jiti": "*" }, "optionalPeers": ["jiti"], "bin": { "eslint": "bin/eslint.js" } }, "sha512-XoMjdBOwe/esVgEvLmNsD3IRHkm7fbKIUGvrleloJXUZgDHig2IPWNniv+GwjyJXzuNqVjlr5+4yVUZjycJwfQ=="], + "eslint": ["eslint@10.4.1", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.2", "@eslint/config-array": "^0.23.5", "@eslint/config-helpers": "^0.6.0", "@eslint/core": "^1.2.1", "@eslint/plugin-kit": "^0.7.2", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "ajv": "^6.14.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^9.1.2", "eslint-visitor-keys": "^5.0.1", "espree": "^11.2.0", "esquery": "^1.7.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "minimatch": "^10.2.4", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, "peerDependencies": { "jiti": "*" }, "optionalPeers": ["jiti"], "bin": { "eslint": "bin/eslint.js" } }, "sha512-AyIKhnOBuOAdueD7RB3xB+YeAWScb9jHsJBgH2Hcde8InP5JYhqrRR6iTMHyTEwgENK54Cp44e4v8BwNhsuHuw=="], "eslint-config-prettier": ["eslint-config-prettier@9.1.2", "", { "peerDependencies": { "eslint": ">=7.0.0" }, "bin": { "eslint-config-prettier": "bin/cli.js" } }, "sha512-iI1f+D2ViGn+uvv5HuHVUamg8ll4tN+JRHGc6IJi4TP9Kl976C57fzPXgseXNs8v0iA8aSJpHsTWjDb9QJamGQ=="], @@ -763,11 +759,11 @@ "eslint-plugin-unused-imports": ["eslint-plugin-unused-imports@4.4.1", "", { "peerDependencies": { "@typescript-eslint/eslint-plugin": "^8.0.0-0 || ^7.0.0 || ^6.0.0 || ^5.0.0", "eslint": "^10.0.0 || ^9.0.0 || ^8.0.0" }, "optionalPeers": ["@typescript-eslint/eslint-plugin"] }, "sha512-oZGYUz1X3sRMGUB+0cZyK2VcvRX5lm/vB56PgNNcU+7ficUCKm66oZWKUubXWnOuPjQ8PvmXtCViXBMONPe7tQ=="], - "eslint-scope": ["eslint-scope@8.4.0", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg=="], + "eslint-scope": ["eslint-scope@9.1.2", "", { "dependencies": { "@types/esrecurse": "^4.3.1", "@types/estree": "^1.0.8", "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ=="], "eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="], - "espree": ["espree@10.4.0", "", { "dependencies": { "acorn": "^8.15.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^4.2.1" } }, "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ=="], + "espree": ["espree@11.2.0", "", { "dependencies": { "acorn": "^8.16.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^5.0.1" } }, "sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw=="], "esprima": ["esprima@4.0.1", "", { "bin": { "esparse": "./bin/esparse.js", "esvalidate": "./bin/esvalidate.js" } }, "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="], @@ -879,8 +875,6 @@ "glob-parent": ["glob-parent@6.0.2", "", { "dependencies": { "is-glob": "^4.0.3" } }, "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A=="], - "globals": ["globals@14.0.0", "", {}, "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ=="], - "globalthis": ["globalthis@1.0.4", "", { "dependencies": { "define-properties": "^1.2.1", "gopd": "^1.0.1" } }, "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ=="], "globby": ["globby@11.1.0", "", { "dependencies": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", "fast-glob": "^3.2.9", "ignore": "^5.2.0", "merge2": "^1.4.1", "slash": "^3.0.0" } }, "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g=="], @@ -895,8 +889,6 @@ "has-bigints": ["has-bigints@1.1.0", "", {}, "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg=="], - "has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], - "has-property-descriptors": ["has-property-descriptors@1.0.2", "", { "dependencies": { "es-define-property": "^1.0.0" } }, "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg=="], "has-proto": ["has-proto@1.2.0", "", { "dependencies": { "dunder-proto": "^1.0.0" } }, "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ=="], @@ -927,8 +919,6 @@ "immer": ["immer@10.2.0", "", {}, "sha512-d/+XTN3zfODyjr89gM3mPq1WNX2B8pYsu7eORitdwyA2sBubnTl3laYlBk4sXY5FUa5qTZGBDPJICVbvqzjlbw=="], - "import-fresh": ["import-fresh@3.3.1", "", { "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" } }, "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ=="], - "imurmurhash": ["imurmurhash@0.1.4", "", {}, "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA=="], "inherits": ["inherits@2.0.4", "", {}, "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="], @@ -1045,8 +1035,6 @@ "lodash": ["lodash@4.17.23", "", {}, "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w=="], - "lodash.merge": ["lodash.merge@4.6.2", "", {}, "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ=="], - "log-update": ["log-update@8.0.0", "", { "dependencies": { "ansi-escapes": "^7.3.0", "cli-cursor": "^5.0.0", "slice-ansi": "^9.0.0", "string-width": "^8.2.0", "strip-ansi": "^7.2.0", "wrap-ansi": "^10.0.0" } }, "sha512-lddSgOt3bPASrylL54ZSpy8nBHns+vBVSoILlVOx+dei300pnLRN958rj/EdlVLKuWlSESU3qdnDZdAI7FXYGg=="], "longest-streak": ["longest-streak@3.1.0", "", {}, "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g=="], @@ -1249,8 +1237,6 @@ "pako": ["pako@1.0.11", "", {}, "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw=="], - "parent-module": ["parent-module@1.0.1", "", { "dependencies": { "callsites": "^3.0.0" } }, "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g=="], - "parse-bmfont-ascii": ["parse-bmfont-ascii@1.0.6", "", {}, "sha512-U4RrVsUFCleIOBsIGYOMKjn9PavsGOXxbvYGtMOEfnId0SVNsgehXh1DxUdVPLoxd5mvcEtvmKs2Mmf0Mpa1ZA=="], "parse-bmfont-binary": ["parse-bmfont-binary@1.0.6", "", {}, "sha512-GxmsRea0wdGdYthjuUeWTMWPqm2+FAd4GI8vCvhgJsFnoGhTrLhXDDupwTo7rXVAgaLIGoVHDZS9p/5XbSqeWA=="], @@ -1395,8 +1381,6 @@ "resolve": ["resolve@2.0.0-next.7", "", { "dependencies": { "es-errors": "^1.3.0", "is-core-module": "^2.16.2", "node-exports-info": "^1.6.0", "object-keys": "^1.1.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-tqt+NBWwyaMgw3zDsnygx4CByWjQEJHOPMdslYhppaQSJUtL/D4JO9CcBBlhPoI8lz9oJIDXkwXfhF4aWqP8xQ=="], - "resolve-from": ["resolve-from@4.0.0", "", {}, "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="], - "resolve-pkg-maps": ["resolve-pkg-maps@1.0.0", "", {}, "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw=="], "restore-cursor": ["restore-cursor@5.1.0", "", { "dependencies": { "onetime": "^7.0.0", "signal-exit": "^4.1.0" } }, "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA=="], @@ -1501,7 +1485,7 @@ "strip-final-newline": ["strip-final-newline@2.0.0", "", {}, "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA=="], - "strip-json-comments": ["strip-json-comments@3.1.1", "", {}, "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig=="], + "strip-json-comments": ["strip-json-comments@2.0.1", "", {}, "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ=="], "stripe": ["stripe@16.12.0", "", { "dependencies": { "@types/node": ">=8.1.0", "qs": "^6.11.0" } }, "sha512-H7eFVLDxeTNNSn4JTRfL2//LzCbDrMSZ+2q1c7CanVWgK2qIW5TwS+0V7N9KcKZZNpYh/uCqK0PyZh/2UsaAtQ=="], @@ -1509,8 +1493,6 @@ "styled-jsx": ["styled-jsx@5.1.6", "", { "dependencies": { "client-only": "0.0.1" }, "peerDependencies": { "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0" } }, "sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA=="], - "supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], - "supports-preserve-symlinks-flag": ["supports-preserve-symlinks-flag@1.0.0", "", {}, "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w=="], "supports-terminal-graphics": ["supports-terminal-graphics@0.1.0", "", {}, "sha512-+KdfozhS0Fw8y5Sghw8kkZNGT8nWYzJ1EzcoIvVjxhl+26TJTs26y02yfBgvc1jh5AS/c8jcI3xtahhR95KRyQ=="], @@ -1669,18 +1651,12 @@ "@codebuff/sdk/ignore": ["ignore@7.0.5", "", {}, "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg=="], - "@eslint/eslintrc/ajv": ["ajv@6.15.0", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw=="], - - "@eslint/eslintrc/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], - - "@eslint/eslintrc/js-yaml": ["js-yaml@4.2.0", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-ePWsvanv0DWuDRsW8dnt+R4jQ31SCRCQ7hhNcPXZPsoBZiemuZNYGf7adZdqX2D86j6rvKp3RpCxVTSb8WQlOw=="], + "@eslint/config-array/minimatch": ["minimatch@10.2.5", "", { "dependencies": { "brace-expansion": "^5.0.5" } }, "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg=="], "@opentui/core/diff": ["diff@9.0.0", "", {}, "sha512-svtcdpS8CgJyqAjEQIXdb3OjhFVVYjzGAPO8WGCmRbrml64SPw/jJD4GoE98aR7r25A0XcgrK3F02yw9R/vhQw=="], "@opentui/core/strip-ansi": ["strip-ansi@7.1.2", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA=="], - "@types/diff/diff": ["diff@9.0.0", "", {}, "sha512-svtcdpS8CgJyqAjEQIXdb3OjhFVVYjzGAPO8WGCmRbrml64SPw/jJD4GoE98aR7r25A0XcgrK3F02yw9R/vhQw=="], - "@typescript-eslint/eslint-plugin/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], "@typescript-eslint/parser/@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@7.18.0", "", { "dependencies": { "@typescript-eslint/types": "7.18.0", "@typescript-eslint/visitor-keys": "7.18.0" } }, "sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA=="], @@ -1709,12 +1685,12 @@ "eslint/ajv": ["ajv@6.15.0", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw=="], - "eslint/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], - - "eslint/eslint-visitor-keys": ["eslint-visitor-keys@4.2.1", "", {}, "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ=="], + "eslint/eslint-visitor-keys": ["eslint-visitor-keys@5.0.1", "", {}, "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA=="], "eslint/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], + "eslint/minimatch": ["minimatch@10.2.5", "", { "dependencies": { "brace-expansion": "^5.0.5" } }, "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg=="], + "eslint-import-resolver-node/debug": ["debug@3.2.7", "", { "dependencies": { "ms": "^2.1.1" } }, "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ=="], "eslint-module-utils/debug": ["debug@3.2.7", "", { "dependencies": { "ms": "^2.1.1" } }, "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ=="], @@ -1725,7 +1701,7 @@ "eslint-plugin-import/tsconfig-paths": ["tsconfig-paths@3.15.0", "", { "dependencies": { "@types/json5": "^0.0.29", "json5": "^1.0.2", "minimist": "^1.2.6", "strip-bom": "^3.0.0" } }, "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg=="], - "espree/eslint-visitor-keys": ["eslint-visitor-keys@4.2.1", "", {}, "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ=="], + "espree/eslint-visitor-keys": ["eslint-visitor-keys@5.0.1", "", {}, "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA=="], "execa/onetime": ["onetime@5.1.2", "", { "dependencies": { "mimic-fn": "^2.1.0" } }, "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg=="], @@ -1753,16 +1729,12 @@ "plist/xmlbuilder": ["xmlbuilder@15.1.1", "", {}, "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg=="], - "rc/strip-json-comments": ["strip-json-comments@2.0.1", "", {}, "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ=="], - "react-devtools-core/ws": ["ws@7.5.11", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": "^5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-zS54Oen9bITtp7kp2XM3AydrCIq1D+HwJOuH+c+e4LfpL/lotP5osijd+UoMnxwAam1GN8R4KtLAyIrIcBNpiA=="], "react-reconciler/scheduler": ["scheduler@0.26.0", "", {}, "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA=="], "send/mime-types": ["mime-types@3.0.2", "", { "dependencies": { "mime-db": "^1.54.0" } }, "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A=="], - "slice-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], - "tar-stream/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=="], "ts-node/diff": ["diff@4.0.4", "", {}, "sha512-X07nttJQkwkfKfvTPG/KSnE2OMdcUCao6+eXF3wmnIQRn2aPAHH3VxDbDOdegkd6JbPsXqShpvEOHfAT+nCNwQ=="], @@ -1777,8 +1749,6 @@ "typescript-eslint/@typescript-eslint/utils": ["@typescript-eslint/utils@7.18.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@typescript-eslint/scope-manager": "7.18.0", "@typescript-eslint/types": "7.18.0", "@typescript-eslint/typescript-estree": "7.18.0" }, "peerDependencies": { "eslint": "^8.56.0" } }, "sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw=="], - "wrap-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], - "wrap-ansi/string-width": ["string-width@8.2.1", "", { "dependencies": { "get-east-asian-width": "^1.5.0", "strip-ansi": "^7.1.2" } }, "sha512-IIaP0g3iy9Cyy18w3M9YcaDudujEAVHKt3a3QJg1+sr/oX96TbaGUubG0hJyCjCBThFH+tFpcIyoUHUn1ogaLA=="], "yargs/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], @@ -1787,9 +1757,7 @@ "@codebuff/evals/pino/process-warning": ["process-warning@5.0.0", "", {}, "sha512-a39t9ApHNx2L4+HBnQKqxxHNs1r7KF+Intd8Q/g1bUh6q0WIp9voPXJ/x0j+ZL45KF1pJd9+q2jLIRMfvEshkA=="], - "@eslint/eslintrc/ajv/json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], - - "@eslint/eslintrc/js-yaml/argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="], + "@eslint/config-array/minimatch/brace-expansion": ["brace-expansion@5.0.6", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g=="], "@typescript-eslint/parser/@typescript-eslint/typescript-estree/minimatch": ["minimatch@9.0.9", "", { "dependencies": { "brace-expansion": "^2.0.2" } }, "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg=="], @@ -1803,10 +1771,14 @@ "cliui/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], + "cliui/wrap-ansi/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + "eslint-plugin-import/tsconfig-paths/json5": ["json5@1.0.2", "", { "dependencies": { "minimist": "^1.2.0" }, "bin": { "json5": "lib/cli.js" } }, "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA=="], "eslint/ajv/json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], + "eslint/minimatch/brace-expansion": ["brace-expansion@5.0.6", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g=="], + "express/mime-types/mime-db": ["mime-db@1.54.0", "", {}, "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ=="], "p-locate/p-limit/yocto-queue": ["yocto-queue@0.1.0", "", {}, "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="], @@ -1835,8 +1807,12 @@ "yargs/string-width/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + "@eslint/config-array/minimatch/brace-expansion/balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="], + "@typescript-eslint/parser/@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.1.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-WR1cURNjuvBLMZBMbqM0UoE+WAfdUcEV1ccD8PVBVOI+Z3ND4+SZbN8RsfT2bMuG1qwz5RFvPukSZm5fF2D5eA=="], + "eslint/minimatch/brace-expansion/balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="], + "typescript-eslint/@typescript-eslint/eslint-plugin/@typescript-eslint/scope-manager/@typescript-eslint/types": ["@typescript-eslint/types@7.18.0", "", {}, "sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ=="], "typescript-eslint/@typescript-eslint/eslint-plugin/@typescript-eslint/type-utils/@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@7.18.0", "", { "dependencies": { "@typescript-eslint/types": "7.18.0", "@typescript-eslint/visitor-keys": "7.18.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", "minimatch": "^9.0.4", "semver": "^7.6.0", "ts-api-utils": "^1.3.0" } }, "sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA=="], From c0ba5b9ffd8e9a7f8ef2b809acf3e25b3baec0d5 Mon Sep 17 00:00:00 2001 From: codebuff public sync bot <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 8 Jun 2026 12:57:30 +0000 Subject: [PATCH 13/96] Sync public snapshot from freebuff-private Source: CodebuffAI/freebuff-private@79e0207f132714fd59c55c7c04215e3e61e80fd4 --- bun.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bun.lock b/bun.lock index f03a8b1fc8..73cf04b869 100644 --- a/bun.lock +++ b/bun.lock @@ -899,7 +899,7 @@ "hasown": ["hasown@2.0.4", "", { "dependencies": { "function-bind": "^1.1.2" } }, "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A=="], - "hono": ["hono@4.12.23", "", {}, "sha512-eIaZ9qDgu7XV0pxOCrg7/WhnQ6Ivm22UcxhXx/A3dcbqbbYgBEkc6e/J/s7j2tS96zoB0S9VBdLwQNCWwUo4LA=="], + "hono": ["hono@4.12.24", "", {}, "sha512-I36D1s+HgQc55KbhEr4iybfxv/9o1zdpw+XEM6dJa91LqQD0HCoSGdxpRJCZE+aavs87j4V3Ls2OJzq8C/U4iw=="], "http-errors": ["http-errors@2.0.1", "", { "dependencies": { "depd": "~2.0.0", "inherits": "~2.0.4", "setprototypeof": "~1.2.0", "statuses": "~2.0.2", "toidentifier": "~1.0.1" } }, "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ=="], From 45453290db9b547fa7bdf436445de849ff96a10f Mon Sep 17 00:00:00 2001 From: codebuff public sync bot <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 8 Jun 2026 13:19:25 +0000 Subject: [PATCH 14/96] Sync public snapshot from freebuff-private Source: CodebuffAI/freebuff-private@b8d759f22b764747960950254b66532e50d3d806 --- bun.lock | 2 ++ 1 file changed, 2 insertions(+) diff --git a/bun.lock b/bun.lock index 73cf04b869..9f6901e1bd 100644 --- a/bun.lock +++ b/bun.lock @@ -1657,6 +1657,8 @@ "@opentui/core/strip-ansi": ["strip-ansi@7.1.2", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA=="], + "@types/diff/diff": ["diff@9.0.0", "", {}, "sha512-svtcdpS8CgJyqAjEQIXdb3OjhFVVYjzGAPO8WGCmRbrml64SPw/jJD4GoE98aR7r25A0XcgrK3F02yw9R/vhQw=="], + "@typescript-eslint/eslint-plugin/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], "@typescript-eslint/parser/@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@7.18.0", "", { "dependencies": { "@typescript-eslint/types": "7.18.0", "@typescript-eslint/visitor-keys": "7.18.0" } }, "sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA=="], From b37f937992891554613f5730d230f680541788ee Mon Sep 17 00:00:00 2001 From: codebuff public sync bot <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 8 Jun 2026 13:40:20 +0000 Subject: [PATCH 15/96] Sync public snapshot from freebuff-private Source: CodebuffAI/freebuff-private@1044ed2b0aa82d890b5dfdbe291d071914be9135 --- bun.lock | 2 -- 1 file changed, 2 deletions(-) diff --git a/bun.lock b/bun.lock index 9f6901e1bd..73cf04b869 100644 --- a/bun.lock +++ b/bun.lock @@ -1657,8 +1657,6 @@ "@opentui/core/strip-ansi": ["strip-ansi@7.1.2", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA=="], - "@types/diff/diff": ["diff@9.0.0", "", {}, "sha512-svtcdpS8CgJyqAjEQIXdb3OjhFVVYjzGAPO8WGCmRbrml64SPw/jJD4GoE98aR7r25A0XcgrK3F02yw9R/vhQw=="], - "@typescript-eslint/eslint-plugin/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], "@typescript-eslint/parser/@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@7.18.0", "", { "dependencies": { "@typescript-eslint/types": "7.18.0", "@typescript-eslint/visitor-keys": "7.18.0" } }, "sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA=="], From 0840cb8624d0824b995b48ac341bbf7b738d3d65 Mon Sep 17 00:00:00 2001 From: codebuff public sync bot <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 8 Jun 2026 13:54:51 +0000 Subject: [PATCH 16/96] Sync public snapshot from freebuff-private Source: CodebuffAI/freebuff-private@dc7ab8219f25ccf7e7c25d9eeda464b194602490 --- bun.lock | 2 ++ 1 file changed, 2 insertions(+) diff --git a/bun.lock b/bun.lock index 73cf04b869..9f6901e1bd 100644 --- a/bun.lock +++ b/bun.lock @@ -1657,6 +1657,8 @@ "@opentui/core/strip-ansi": ["strip-ansi@7.1.2", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA=="], + "@types/diff/diff": ["diff@9.0.0", "", {}, "sha512-svtcdpS8CgJyqAjEQIXdb3OjhFVVYjzGAPO8WGCmRbrml64SPw/jJD4GoE98aR7r25A0XcgrK3F02yw9R/vhQw=="], + "@typescript-eslint/eslint-plugin/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], "@typescript-eslint/parser/@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@7.18.0", "", { "dependencies": { "@typescript-eslint/types": "7.18.0", "@typescript-eslint/visitor-keys": "7.18.0" } }, "sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA=="], From 289844b3a7bc2d7e1e81a6739ba4b85a9a67726c Mon Sep 17 00:00:00 2001 From: codebuff public sync bot <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 8 Jun 2026 14:06:25 +0000 Subject: [PATCH 17/96] Sync public snapshot from freebuff-private Source: CodebuffAI/freebuff-private@00e47fbee4ada8ef94cc865d51eae35e0575b722 --- bun.lock | 2 -- 1 file changed, 2 deletions(-) diff --git a/bun.lock b/bun.lock index 9f6901e1bd..73cf04b869 100644 --- a/bun.lock +++ b/bun.lock @@ -1657,8 +1657,6 @@ "@opentui/core/strip-ansi": ["strip-ansi@7.1.2", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA=="], - "@types/diff/diff": ["diff@9.0.0", "", {}, "sha512-svtcdpS8CgJyqAjEQIXdb3OjhFVVYjzGAPO8WGCmRbrml64SPw/jJD4GoE98aR7r25A0XcgrK3F02yw9R/vhQw=="], - "@typescript-eslint/eslint-plugin/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], "@typescript-eslint/parser/@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@7.18.0", "", { "dependencies": { "@typescript-eslint/types": "7.18.0", "@typescript-eslint/visitor-keys": "7.18.0" } }, "sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA=="], From b24afa781fa3811a0fc92821163ab46cb710d6ef Mon Sep 17 00:00:00 2001 From: codebuff public sync bot <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 8 Jun 2026 14:24:54 +0000 Subject: [PATCH 18/96] Sync public snapshot from freebuff-private Source: CodebuffAI/freebuff-private@5feff1461074e3acc9221aa0188a167959b52f60 --- bun.lock | 2 ++ 1 file changed, 2 insertions(+) diff --git a/bun.lock b/bun.lock index 73cf04b869..9f6901e1bd 100644 --- a/bun.lock +++ b/bun.lock @@ -1657,6 +1657,8 @@ "@opentui/core/strip-ansi": ["strip-ansi@7.1.2", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA=="], + "@types/diff/diff": ["diff@9.0.0", "", {}, "sha512-svtcdpS8CgJyqAjEQIXdb3OjhFVVYjzGAPO8WGCmRbrml64SPw/jJD4GoE98aR7r25A0XcgrK3F02yw9R/vhQw=="], + "@typescript-eslint/eslint-plugin/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], "@typescript-eslint/parser/@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@7.18.0", "", { "dependencies": { "@typescript-eslint/types": "7.18.0", "@typescript-eslint/visitor-keys": "7.18.0" } }, "sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA=="], From 8ed54da866927f843d78b3d7f70a63052d82fba4 Mon Sep 17 00:00:00 2001 From: codebuff public sync bot <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 8 Jun 2026 14:52:00 +0000 Subject: [PATCH 19/96] Sync public snapshot from freebuff-private Source: CodebuffAI/freebuff-private@96e3be6cb3fe0b2d82bcc1edc8622b7bcc448018 --- bun.lock | 74 ++++++++++++++++++++++++++++++++++++-------------------- 1 file changed, 48 insertions(+), 26 deletions(-) diff --git a/bun.lock b/bun.lock index 9f6901e1bd..c2f515cc65 100644 --- a/bun.lock +++ b/bun.lock @@ -239,15 +239,19 @@ "@eslint-community/regexpp": ["@eslint-community/regexpp@4.12.2", "", {}, "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew=="], - "@eslint/config-array": ["@eslint/config-array@0.23.5", "", { "dependencies": { "@eslint/object-schema": "^3.0.5", "debug": "^4.3.1", "minimatch": "^10.2.4" } }, "sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA=="], + "@eslint/config-array": ["@eslint/config-array@0.21.2", "", { "dependencies": { "@eslint/object-schema": "^2.1.7", "debug": "^4.3.1", "minimatch": "^3.1.5" } }, "sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw=="], - "@eslint/config-helpers": ["@eslint/config-helpers@0.6.0", "", { "dependencies": { "@eslint/core": "^1.2.1" } }, "sha512-ii6Bw9jJ2zi2cWA2Z+9/QZ/+3DX6kwaV5Q986D/CdP3Lap3w/pgQZ373FV7byY/i7L4IRH/G43I5dz1ClsCbpA=="], + "@eslint/config-helpers": ["@eslint/config-helpers@0.4.2", "", { "dependencies": { "@eslint/core": "^0.17.0" } }, "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw=="], - "@eslint/core": ["@eslint/core@1.2.1", "", { "dependencies": { "@types/json-schema": "^7.0.15" } }, "sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ=="], + "@eslint/core": ["@eslint/core@0.17.0", "", { "dependencies": { "@types/json-schema": "^7.0.15" } }, "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ=="], - "@eslint/object-schema": ["@eslint/object-schema@3.0.5", "", {}, "sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw=="], + "@eslint/eslintrc": ["@eslint/eslintrc@3.3.5", "", { "dependencies": { "ajv": "^6.14.0", "debug": "^4.3.2", "espree": "^10.0.1", "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.1", "minimatch": "^3.1.5", "strip-json-comments": "^3.1.1" } }, "sha512-4IlJx0X0qftVsN5E+/vGujTRIFtwuLbNsVUe7TO6zYPDR1O6nFwvwhIKEKSrl6dZchmYBITazxKoUYOjdtjlRg=="], - "@eslint/plugin-kit": ["@eslint/plugin-kit@0.7.2", "", { "dependencies": { "@eslint/core": "^1.2.1", "levn": "^0.4.1" } }, "sha512-+CNAzxglkrpNf/kKywqQfk74QjtceuOE7Qm+AF8miRvPF/wmmK5+OJOgVh3AVTT3RP2mH3+FOaxlE5v72owk0A=="], + "@eslint/js": ["@eslint/js@9.39.4", "", {}, "sha512-nE7DEIchvtiFTwBw4Lfbu59PG+kCofhjsKaCWzxTpt4lfRjRMqG6uMBzKXuEcyXhOHoUp9riAm7/aWYGhXZ9cw=="], + + "@eslint/object-schema": ["@eslint/object-schema@2.1.7", "", {}, "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA=="], + + "@eslint/plugin-kit": ["@eslint/plugin-kit@0.4.1", "", { "dependencies": { "@eslint/core": "^0.17.0", "levn": "^0.4.1" } }, "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA=="], "@gravity-ai/api": ["@gravity-ai/api@0.1.2", "", { "dependencies": { "axios": "^1.13.2" } }, "sha512-txsAhyzvwB/TNrj5R8DoNqw8afM3JY2ahl7aaeaD5ZsxP+7rxff7C7keGI7+gU2KT3d2Mcw4QB1nHhbTSCJYHw=="], @@ -463,8 +467,6 @@ "@types/diff": ["@types/diff@8.0.0", "", { "dependencies": { "diff": "*" } }, "sha512-o7jqJM04gfaYrdCecCVMbZhNdG6T1MHg/oQoRFdERLV+4d+V7FijhiEAbFu0Usww84Yijk9yH58U4Jk4HbtzZw=="], - "@types/esrecurse": ["@types/esrecurse@4.3.1", "", {}, "sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw=="], - "@types/estree": ["@types/estree@1.0.9", "", {}, "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg=="], "@types/js-yaml": ["@types/js-yaml@4.0.9", "", {}, "sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg=="], @@ -547,7 +549,7 @@ "ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="], - "ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], + "ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], "any-base": ["any-base@1.1.0", "", {}, "sha512-uMgjozySS8adZZYePpaWs8cxB9/kdzmpX6SgJZ+wbz1K5eYk5QMYDVJaZKhxyIHUdnnJkfR7SVgStgH7LkGUyg=="], @@ -623,6 +625,8 @@ "call-bound": ["call-bound@1.0.4", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "get-intrinsic": "^1.3.0" } }, "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg=="], + "callsites": ["callsites@3.1.0", "", {}, "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="], + "caniuse-lite": ["caniuse-lite@1.0.30001797", "", {}, "sha512-l8xKG+gwAIExZGl9FrF7KUwuOmk6wbEPC9Xoy/RtnWv1XG0Q4LFlagaLpUv3Kiza3W/wm27zy0yWJEieYKAP6w=="], "canvas": ["canvas@3.2.3", "", { "dependencies": { "node-addon-api": "^7.0.0", "prebuild-install": "^7.1.3" } }, "sha512-PzE5nJZPz72YUAfo8oTp0u3fqqY7IzlTubneAihqDYAUcBk7ryeCmBbdJBEdaH0bptSOe2VT2Zwcb3UaFyaSWw=="], @@ -747,7 +751,7 @@ "escape-string-regexp": ["escape-string-regexp@4.0.0", "", {}, "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="], - "eslint": ["eslint@10.4.1", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.2", "@eslint/config-array": "^0.23.5", "@eslint/config-helpers": "^0.6.0", "@eslint/core": "^1.2.1", "@eslint/plugin-kit": "^0.7.2", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "ajv": "^6.14.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^9.1.2", "eslint-visitor-keys": "^5.0.1", "espree": "^11.2.0", "esquery": "^1.7.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "minimatch": "^10.2.4", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, "peerDependencies": { "jiti": "*" }, "optionalPeers": ["jiti"], "bin": { "eslint": "bin/eslint.js" } }, "sha512-AyIKhnOBuOAdueD7RB3xB+YeAWScb9jHsJBgH2Hcde8InP5JYhqrRR6iTMHyTEwgENK54Cp44e4v8BwNhsuHuw=="], + "eslint": ["eslint@9.39.4", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", "@eslint/config-array": "^0.21.2", "@eslint/config-helpers": "^0.4.2", "@eslint/core": "^0.17.0", "@eslint/eslintrc": "^3.3.5", "@eslint/js": "9.39.4", "@eslint/plugin-kit": "^0.4.1", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "ajv": "^6.14.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^8.4.0", "eslint-visitor-keys": "^4.2.1", "espree": "^10.4.0", "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.5", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, "peerDependencies": { "jiti": "*" }, "optionalPeers": ["jiti"], "bin": { "eslint": "bin/eslint.js" } }, "sha512-XoMjdBOwe/esVgEvLmNsD3IRHkm7fbKIUGvrleloJXUZgDHig2IPWNniv+GwjyJXzuNqVjlr5+4yVUZjycJwfQ=="], "eslint-config-prettier": ["eslint-config-prettier@9.1.2", "", { "peerDependencies": { "eslint": ">=7.0.0" }, "bin": { "eslint-config-prettier": "bin/cli.js" } }, "sha512-iI1f+D2ViGn+uvv5HuHVUamg8ll4tN+JRHGc6IJi4TP9Kl976C57fzPXgseXNs8v0iA8aSJpHsTWjDb9QJamGQ=="], @@ -759,11 +763,11 @@ "eslint-plugin-unused-imports": ["eslint-plugin-unused-imports@4.4.1", "", { "peerDependencies": { "@typescript-eslint/eslint-plugin": "^8.0.0-0 || ^7.0.0 || ^6.0.0 || ^5.0.0", "eslint": "^10.0.0 || ^9.0.0 || ^8.0.0" }, "optionalPeers": ["@typescript-eslint/eslint-plugin"] }, "sha512-oZGYUz1X3sRMGUB+0cZyK2VcvRX5lm/vB56PgNNcU+7ficUCKm66oZWKUubXWnOuPjQ8PvmXtCViXBMONPe7tQ=="], - "eslint-scope": ["eslint-scope@9.1.2", "", { "dependencies": { "@types/esrecurse": "^4.3.1", "@types/estree": "^1.0.8", "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ=="], + "eslint-scope": ["eslint-scope@8.4.0", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg=="], "eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="], - "espree": ["espree@11.2.0", "", { "dependencies": { "acorn": "^8.16.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^5.0.1" } }, "sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw=="], + "espree": ["espree@10.4.0", "", { "dependencies": { "acorn": "^8.15.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^4.2.1" } }, "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ=="], "esprima": ["esprima@4.0.1", "", { "bin": { "esparse": "./bin/esparse.js", "esvalidate": "./bin/esvalidate.js" } }, "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="], @@ -875,6 +879,8 @@ "glob-parent": ["glob-parent@6.0.2", "", { "dependencies": { "is-glob": "^4.0.3" } }, "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A=="], + "globals": ["globals@14.0.0", "", {}, "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ=="], + "globalthis": ["globalthis@1.0.4", "", { "dependencies": { "define-properties": "^1.2.1", "gopd": "^1.0.1" } }, "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ=="], "globby": ["globby@11.1.0", "", { "dependencies": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", "fast-glob": "^3.2.9", "ignore": "^5.2.0", "merge2": "^1.4.1", "slash": "^3.0.0" } }, "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g=="], @@ -889,6 +895,8 @@ "has-bigints": ["has-bigints@1.1.0", "", {}, "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg=="], + "has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], + "has-property-descriptors": ["has-property-descriptors@1.0.2", "", { "dependencies": { "es-define-property": "^1.0.0" } }, "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg=="], "has-proto": ["has-proto@1.2.0", "", { "dependencies": { "dunder-proto": "^1.0.0" } }, "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ=="], @@ -919,6 +927,8 @@ "immer": ["immer@10.2.0", "", {}, "sha512-d/+XTN3zfODyjr89gM3mPq1WNX2B8pYsu7eORitdwyA2sBubnTl3laYlBk4sXY5FUa5qTZGBDPJICVbvqzjlbw=="], + "import-fresh": ["import-fresh@3.3.1", "", { "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" } }, "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ=="], + "imurmurhash": ["imurmurhash@0.1.4", "", {}, "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA=="], "inherits": ["inherits@2.0.4", "", {}, "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="], @@ -1035,6 +1045,8 @@ "lodash": ["lodash@4.17.23", "", {}, "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w=="], + "lodash.merge": ["lodash.merge@4.6.2", "", {}, "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ=="], + "log-update": ["log-update@8.0.0", "", { "dependencies": { "ansi-escapes": "^7.3.0", "cli-cursor": "^5.0.0", "slice-ansi": "^9.0.0", "string-width": "^8.2.0", "strip-ansi": "^7.2.0", "wrap-ansi": "^10.0.0" } }, "sha512-lddSgOt3bPASrylL54ZSpy8nBHns+vBVSoILlVOx+dei300pnLRN958rj/EdlVLKuWlSESU3qdnDZdAI7FXYGg=="], "longest-streak": ["longest-streak@3.1.0", "", {}, "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g=="], @@ -1237,6 +1249,8 @@ "pako": ["pako@1.0.11", "", {}, "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw=="], + "parent-module": ["parent-module@1.0.1", "", { "dependencies": { "callsites": "^3.0.0" } }, "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g=="], + "parse-bmfont-ascii": ["parse-bmfont-ascii@1.0.6", "", {}, "sha512-U4RrVsUFCleIOBsIGYOMKjn9PavsGOXxbvYGtMOEfnId0SVNsgehXh1DxUdVPLoxd5mvcEtvmKs2Mmf0Mpa1ZA=="], "parse-bmfont-binary": ["parse-bmfont-binary@1.0.6", "", {}, "sha512-GxmsRea0wdGdYthjuUeWTMWPqm2+FAd4GI8vCvhgJsFnoGhTrLhXDDupwTo7rXVAgaLIGoVHDZS9p/5XbSqeWA=="], @@ -1381,6 +1395,8 @@ "resolve": ["resolve@2.0.0-next.7", "", { "dependencies": { "es-errors": "^1.3.0", "is-core-module": "^2.16.2", "node-exports-info": "^1.6.0", "object-keys": "^1.1.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-tqt+NBWwyaMgw3zDsnygx4CByWjQEJHOPMdslYhppaQSJUtL/D4JO9CcBBlhPoI8lz9oJIDXkwXfhF4aWqP8xQ=="], + "resolve-from": ["resolve-from@4.0.0", "", {}, "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="], + "resolve-pkg-maps": ["resolve-pkg-maps@1.0.0", "", {}, "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw=="], "restore-cursor": ["restore-cursor@5.1.0", "", { "dependencies": { "onetime": "^7.0.0", "signal-exit": "^4.1.0" } }, "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA=="], @@ -1485,7 +1501,7 @@ "strip-final-newline": ["strip-final-newline@2.0.0", "", {}, "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA=="], - "strip-json-comments": ["strip-json-comments@2.0.1", "", {}, "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ=="], + "strip-json-comments": ["strip-json-comments@3.1.1", "", {}, "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig=="], "stripe": ["stripe@16.12.0", "", { "dependencies": { "@types/node": ">=8.1.0", "qs": "^6.11.0" } }, "sha512-H7eFVLDxeTNNSn4JTRfL2//LzCbDrMSZ+2q1c7CanVWgK2qIW5TwS+0V7N9KcKZZNpYh/uCqK0PyZh/2UsaAtQ=="], @@ -1493,6 +1509,8 @@ "styled-jsx": ["styled-jsx@5.1.6", "", { "dependencies": { "client-only": "0.0.1" }, "peerDependencies": { "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0" } }, "sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA=="], + "supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], + "supports-preserve-symlinks-flag": ["supports-preserve-symlinks-flag@1.0.0", "", {}, "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w=="], "supports-terminal-graphics": ["supports-terminal-graphics@0.1.0", "", {}, "sha512-+KdfozhS0Fw8y5Sghw8kkZNGT8nWYzJ1EzcoIvVjxhl+26TJTs26y02yfBgvc1jh5AS/c8jcI3xtahhR95KRyQ=="], @@ -1651,7 +1669,11 @@ "@codebuff/sdk/ignore": ["ignore@7.0.5", "", {}, "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg=="], - "@eslint/config-array/minimatch": ["minimatch@10.2.5", "", { "dependencies": { "brace-expansion": "^5.0.5" } }, "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg=="], + "@eslint/eslintrc/ajv": ["ajv@6.15.0", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw=="], + + "@eslint/eslintrc/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], + + "@eslint/eslintrc/js-yaml": ["js-yaml@4.2.0", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-ePWsvanv0DWuDRsW8dnt+R4jQ31SCRCQ7hhNcPXZPsoBZiemuZNYGf7adZdqX2D86j6rvKp3RpCxVTSb8WQlOw=="], "@opentui/core/diff": ["diff@9.0.0", "", {}, "sha512-svtcdpS8CgJyqAjEQIXdb3OjhFVVYjzGAPO8WGCmRbrml64SPw/jJD4GoE98aR7r25A0XcgrK3F02yw9R/vhQw=="], @@ -1687,11 +1709,11 @@ "eslint/ajv": ["ajv@6.15.0", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw=="], - "eslint/eslint-visitor-keys": ["eslint-visitor-keys@5.0.1", "", {}, "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA=="], + "eslint/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], - "eslint/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], + "eslint/eslint-visitor-keys": ["eslint-visitor-keys@4.2.1", "", {}, "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ=="], - "eslint/minimatch": ["minimatch@10.2.5", "", { "dependencies": { "brace-expansion": "^5.0.5" } }, "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg=="], + "eslint/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], "eslint-import-resolver-node/debug": ["debug@3.2.7", "", { "dependencies": { "ms": "^2.1.1" } }, "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ=="], @@ -1703,7 +1725,7 @@ "eslint-plugin-import/tsconfig-paths": ["tsconfig-paths@3.15.0", "", { "dependencies": { "@types/json5": "^0.0.29", "json5": "^1.0.2", "minimist": "^1.2.6", "strip-bom": "^3.0.0" } }, "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg=="], - "espree/eslint-visitor-keys": ["eslint-visitor-keys@5.0.1", "", {}, "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA=="], + "espree/eslint-visitor-keys": ["eslint-visitor-keys@4.2.1", "", {}, "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ=="], "execa/onetime": ["onetime@5.1.2", "", { "dependencies": { "mimic-fn": "^2.1.0" } }, "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg=="], @@ -1731,12 +1753,16 @@ "plist/xmlbuilder": ["xmlbuilder@15.1.1", "", {}, "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg=="], + "rc/strip-json-comments": ["strip-json-comments@2.0.1", "", {}, "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ=="], + "react-devtools-core/ws": ["ws@7.5.11", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": "^5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-zS54Oen9bITtp7kp2XM3AydrCIq1D+HwJOuH+c+e4LfpL/lotP5osijd+UoMnxwAam1GN8R4KtLAyIrIcBNpiA=="], "react-reconciler/scheduler": ["scheduler@0.26.0", "", {}, "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA=="], "send/mime-types": ["mime-types@3.0.2", "", { "dependencies": { "mime-db": "^1.54.0" } }, "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A=="], + "slice-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], + "tar-stream/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=="], "ts-node/diff": ["diff@4.0.4", "", {}, "sha512-X07nttJQkwkfKfvTPG/KSnE2OMdcUCao6+eXF3wmnIQRn2aPAHH3VxDbDOdegkd6JbPsXqShpvEOHfAT+nCNwQ=="], @@ -1751,6 +1777,8 @@ "typescript-eslint/@typescript-eslint/utils": ["@typescript-eslint/utils@7.18.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@typescript-eslint/scope-manager": "7.18.0", "@typescript-eslint/types": "7.18.0", "@typescript-eslint/typescript-estree": "7.18.0" }, "peerDependencies": { "eslint": "^8.56.0" } }, "sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw=="], + "wrap-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], + "wrap-ansi/string-width": ["string-width@8.2.1", "", { "dependencies": { "get-east-asian-width": "^1.5.0", "strip-ansi": "^7.1.2" } }, "sha512-IIaP0g3iy9Cyy18w3M9YcaDudujEAVHKt3a3QJg1+sr/oX96TbaGUubG0hJyCjCBThFH+tFpcIyoUHUn1ogaLA=="], "yargs/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], @@ -1759,7 +1787,9 @@ "@codebuff/evals/pino/process-warning": ["process-warning@5.0.0", "", {}, "sha512-a39t9ApHNx2L4+HBnQKqxxHNs1r7KF+Intd8Q/g1bUh6q0WIp9voPXJ/x0j+ZL45KF1pJd9+q2jLIRMfvEshkA=="], - "@eslint/config-array/minimatch/brace-expansion": ["brace-expansion@5.0.6", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g=="], + "@eslint/eslintrc/ajv/json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], + + "@eslint/eslintrc/js-yaml/argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="], "@typescript-eslint/parser/@typescript-eslint/typescript-estree/minimatch": ["minimatch@9.0.9", "", { "dependencies": { "brace-expansion": "^2.0.2" } }, "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg=="], @@ -1773,14 +1803,10 @@ "cliui/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], - "cliui/wrap-ansi/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], - "eslint-plugin-import/tsconfig-paths/json5": ["json5@1.0.2", "", { "dependencies": { "minimist": "^1.2.0" }, "bin": { "json5": "lib/cli.js" } }, "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA=="], "eslint/ajv/json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], - "eslint/minimatch/brace-expansion": ["brace-expansion@5.0.6", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g=="], - "express/mime-types/mime-db": ["mime-db@1.54.0", "", {}, "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ=="], "p-locate/p-limit/yocto-queue": ["yocto-queue@0.1.0", "", {}, "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="], @@ -1809,12 +1835,8 @@ "yargs/string-width/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], - "@eslint/config-array/minimatch/brace-expansion/balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="], - "@typescript-eslint/parser/@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.1.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-WR1cURNjuvBLMZBMbqM0UoE+WAfdUcEV1ccD8PVBVOI+Z3ND4+SZbN8RsfT2bMuG1qwz5RFvPukSZm5fF2D5eA=="], - "eslint/minimatch/brace-expansion/balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="], - "typescript-eslint/@typescript-eslint/eslint-plugin/@typescript-eslint/scope-manager/@typescript-eslint/types": ["@typescript-eslint/types@7.18.0", "", {}, "sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ=="], "typescript-eslint/@typescript-eslint/eslint-plugin/@typescript-eslint/type-utils/@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@7.18.0", "", { "dependencies": { "@typescript-eslint/types": "7.18.0", "@typescript-eslint/visitor-keys": "7.18.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", "minimatch": "^9.0.4", "semver": "^7.6.0", "ts-api-utils": "^1.3.0" } }, "sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA=="], From e7d9386fc2ef5993e118ca1b0f71fd27de2aced7 Mon Sep 17 00:00:00 2001 From: codebuff public sync bot <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 8 Jun 2026 17:51:03 +0000 Subject: [PATCH 20/96] Sync public snapshot from freebuff-private Source: CodebuffAI/freebuff-private@52111cae6c9ea6b7128abc5a5df677c97741f6c0 --- bun.lock | 80 ++++++++++++++++++++------------------------------------ 1 file changed, 28 insertions(+), 52 deletions(-) diff --git a/bun.lock b/bun.lock index c2f515cc65..6dc7c46691 100644 --- a/bun.lock +++ b/bun.lock @@ -239,19 +239,15 @@ "@eslint-community/regexpp": ["@eslint-community/regexpp@4.12.2", "", {}, "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew=="], - "@eslint/config-array": ["@eslint/config-array@0.21.2", "", { "dependencies": { "@eslint/object-schema": "^2.1.7", "debug": "^4.3.1", "minimatch": "^3.1.5" } }, "sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw=="], + "@eslint/config-array": ["@eslint/config-array@0.23.5", "", { "dependencies": { "@eslint/object-schema": "^3.0.5", "debug": "^4.3.1", "minimatch": "^10.2.4" } }, "sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA=="], - "@eslint/config-helpers": ["@eslint/config-helpers@0.4.2", "", { "dependencies": { "@eslint/core": "^0.17.0" } }, "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw=="], + "@eslint/config-helpers": ["@eslint/config-helpers@0.6.0", "", { "dependencies": { "@eslint/core": "^1.2.1" } }, "sha512-ii6Bw9jJ2zi2cWA2Z+9/QZ/+3DX6kwaV5Q986D/CdP3Lap3w/pgQZ373FV7byY/i7L4IRH/G43I5dz1ClsCbpA=="], - "@eslint/core": ["@eslint/core@0.17.0", "", { "dependencies": { "@types/json-schema": "^7.0.15" } }, "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ=="], + "@eslint/core": ["@eslint/core@1.2.1", "", { "dependencies": { "@types/json-schema": "^7.0.15" } }, "sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ=="], - "@eslint/eslintrc": ["@eslint/eslintrc@3.3.5", "", { "dependencies": { "ajv": "^6.14.0", "debug": "^4.3.2", "espree": "^10.0.1", "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.1", "minimatch": "^3.1.5", "strip-json-comments": "^3.1.1" } }, "sha512-4IlJx0X0qftVsN5E+/vGujTRIFtwuLbNsVUe7TO6zYPDR1O6nFwvwhIKEKSrl6dZchmYBITazxKoUYOjdtjlRg=="], + "@eslint/object-schema": ["@eslint/object-schema@3.0.5", "", {}, "sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw=="], - "@eslint/js": ["@eslint/js@9.39.4", "", {}, "sha512-nE7DEIchvtiFTwBw4Lfbu59PG+kCofhjsKaCWzxTpt4lfRjRMqG6uMBzKXuEcyXhOHoUp9riAm7/aWYGhXZ9cw=="], - - "@eslint/object-schema": ["@eslint/object-schema@2.1.7", "", {}, "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA=="], - - "@eslint/plugin-kit": ["@eslint/plugin-kit@0.4.1", "", { "dependencies": { "@eslint/core": "^0.17.0", "levn": "^0.4.1" } }, "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA=="], + "@eslint/plugin-kit": ["@eslint/plugin-kit@0.7.2", "", { "dependencies": { "@eslint/core": "^1.2.1", "levn": "^0.4.1" } }, "sha512-+CNAzxglkrpNf/kKywqQfk74QjtceuOE7Qm+AF8miRvPF/wmmK5+OJOgVh3AVTT3RP2mH3+FOaxlE5v72owk0A=="], "@gravity-ai/api": ["@gravity-ai/api@0.1.2", "", { "dependencies": { "axios": "^1.13.2" } }, "sha512-txsAhyzvwB/TNrj5R8DoNqw8afM3JY2ahl7aaeaD5ZsxP+7rxff7C7keGI7+gU2KT3d2Mcw4QB1nHhbTSCJYHw=="], @@ -467,6 +463,8 @@ "@types/diff": ["@types/diff@8.0.0", "", { "dependencies": { "diff": "*" } }, "sha512-o7jqJM04gfaYrdCecCVMbZhNdG6T1MHg/oQoRFdERLV+4d+V7FijhiEAbFu0Usww84Yijk9yH58U4Jk4HbtzZw=="], + "@types/esrecurse": ["@types/esrecurse@4.3.1", "", {}, "sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw=="], + "@types/estree": ["@types/estree@1.0.9", "", {}, "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg=="], "@types/js-yaml": ["@types/js-yaml@4.0.9", "", {}, "sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg=="], @@ -549,7 +547,7 @@ "ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="], - "ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + "ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], "any-base": ["any-base@1.1.0", "", {}, "sha512-uMgjozySS8adZZYePpaWs8cxB9/kdzmpX6SgJZ+wbz1K5eYk5QMYDVJaZKhxyIHUdnnJkfR7SVgStgH7LkGUyg=="], @@ -625,8 +623,6 @@ "call-bound": ["call-bound@1.0.4", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "get-intrinsic": "^1.3.0" } }, "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg=="], - "callsites": ["callsites@3.1.0", "", {}, "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="], - "caniuse-lite": ["caniuse-lite@1.0.30001797", "", {}, "sha512-l8xKG+gwAIExZGl9FrF7KUwuOmk6wbEPC9Xoy/RtnWv1XG0Q4LFlagaLpUv3Kiza3W/wm27zy0yWJEieYKAP6w=="], "canvas": ["canvas@3.2.3", "", { "dependencies": { "node-addon-api": "^7.0.0", "prebuild-install": "^7.1.3" } }, "sha512-PzE5nJZPz72YUAfo8oTp0u3fqqY7IzlTubneAihqDYAUcBk7ryeCmBbdJBEdaH0bptSOe2VT2Zwcb3UaFyaSWw=="], @@ -751,7 +747,7 @@ "escape-string-regexp": ["escape-string-regexp@4.0.0", "", {}, "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="], - "eslint": ["eslint@9.39.4", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", "@eslint/config-array": "^0.21.2", "@eslint/config-helpers": "^0.4.2", "@eslint/core": "^0.17.0", "@eslint/eslintrc": "^3.3.5", "@eslint/js": "9.39.4", "@eslint/plugin-kit": "^0.4.1", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "ajv": "^6.14.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^8.4.0", "eslint-visitor-keys": "^4.2.1", "espree": "^10.4.0", "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.5", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, "peerDependencies": { "jiti": "*" }, "optionalPeers": ["jiti"], "bin": { "eslint": "bin/eslint.js" } }, "sha512-XoMjdBOwe/esVgEvLmNsD3IRHkm7fbKIUGvrleloJXUZgDHig2IPWNniv+GwjyJXzuNqVjlr5+4yVUZjycJwfQ=="], + "eslint": ["eslint@10.4.1", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.2", "@eslint/config-array": "^0.23.5", "@eslint/config-helpers": "^0.6.0", "@eslint/core": "^1.2.1", "@eslint/plugin-kit": "^0.7.2", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "ajv": "^6.14.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^9.1.2", "eslint-visitor-keys": "^5.0.1", "espree": "^11.2.0", "esquery": "^1.7.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "minimatch": "^10.2.4", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, "peerDependencies": { "jiti": "*" }, "optionalPeers": ["jiti"], "bin": { "eslint": "bin/eslint.js" } }, "sha512-AyIKhnOBuOAdueD7RB3xB+YeAWScb9jHsJBgH2Hcde8InP5JYhqrRR6iTMHyTEwgENK54Cp44e4v8BwNhsuHuw=="], "eslint-config-prettier": ["eslint-config-prettier@9.1.2", "", { "peerDependencies": { "eslint": ">=7.0.0" }, "bin": { "eslint-config-prettier": "bin/cli.js" } }, "sha512-iI1f+D2ViGn+uvv5HuHVUamg8ll4tN+JRHGc6IJi4TP9Kl976C57fzPXgseXNs8v0iA8aSJpHsTWjDb9QJamGQ=="], @@ -763,11 +759,11 @@ "eslint-plugin-unused-imports": ["eslint-plugin-unused-imports@4.4.1", "", { "peerDependencies": { "@typescript-eslint/eslint-plugin": "^8.0.0-0 || ^7.0.0 || ^6.0.0 || ^5.0.0", "eslint": "^10.0.0 || ^9.0.0 || ^8.0.0" }, "optionalPeers": ["@typescript-eslint/eslint-plugin"] }, "sha512-oZGYUz1X3sRMGUB+0cZyK2VcvRX5lm/vB56PgNNcU+7ficUCKm66oZWKUubXWnOuPjQ8PvmXtCViXBMONPe7tQ=="], - "eslint-scope": ["eslint-scope@8.4.0", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg=="], + "eslint-scope": ["eslint-scope@9.1.2", "", { "dependencies": { "@types/esrecurse": "^4.3.1", "@types/estree": "^1.0.8", "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ=="], "eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="], - "espree": ["espree@10.4.0", "", { "dependencies": { "acorn": "^8.15.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^4.2.1" } }, "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ=="], + "espree": ["espree@11.2.0", "", { "dependencies": { "acorn": "^8.16.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^5.0.1" } }, "sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw=="], "esprima": ["esprima@4.0.1", "", { "bin": { "esparse": "./bin/esparse.js", "esvalidate": "./bin/esvalidate.js" } }, "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="], @@ -879,8 +875,6 @@ "glob-parent": ["glob-parent@6.0.2", "", { "dependencies": { "is-glob": "^4.0.3" } }, "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A=="], - "globals": ["globals@14.0.0", "", {}, "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ=="], - "globalthis": ["globalthis@1.0.4", "", { "dependencies": { "define-properties": "^1.2.1", "gopd": "^1.0.1" } }, "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ=="], "globby": ["globby@11.1.0", "", { "dependencies": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", "fast-glob": "^3.2.9", "ignore": "^5.2.0", "merge2": "^1.4.1", "slash": "^3.0.0" } }, "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g=="], @@ -895,8 +889,6 @@ "has-bigints": ["has-bigints@1.1.0", "", {}, "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg=="], - "has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], - "has-property-descriptors": ["has-property-descriptors@1.0.2", "", { "dependencies": { "es-define-property": "^1.0.0" } }, "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg=="], "has-proto": ["has-proto@1.2.0", "", { "dependencies": { "dunder-proto": "^1.0.0" } }, "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ=="], @@ -927,8 +919,6 @@ "immer": ["immer@10.2.0", "", {}, "sha512-d/+XTN3zfODyjr89gM3mPq1WNX2B8pYsu7eORitdwyA2sBubnTl3laYlBk4sXY5FUa5qTZGBDPJICVbvqzjlbw=="], - "import-fresh": ["import-fresh@3.3.1", "", { "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" } }, "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ=="], - "imurmurhash": ["imurmurhash@0.1.4", "", {}, "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA=="], "inherits": ["inherits@2.0.4", "", {}, "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="], @@ -1045,8 +1035,6 @@ "lodash": ["lodash@4.17.23", "", {}, "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w=="], - "lodash.merge": ["lodash.merge@4.6.2", "", {}, "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ=="], - "log-update": ["log-update@8.0.0", "", { "dependencies": { "ansi-escapes": "^7.3.0", "cli-cursor": "^5.0.0", "slice-ansi": "^9.0.0", "string-width": "^8.2.0", "strip-ansi": "^7.2.0", "wrap-ansi": "^10.0.0" } }, "sha512-lddSgOt3bPASrylL54ZSpy8nBHns+vBVSoILlVOx+dei300pnLRN958rj/EdlVLKuWlSESU3qdnDZdAI7FXYGg=="], "longest-streak": ["longest-streak@3.1.0", "", {}, "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g=="], @@ -1249,8 +1237,6 @@ "pako": ["pako@1.0.11", "", {}, "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw=="], - "parent-module": ["parent-module@1.0.1", "", { "dependencies": { "callsites": "^3.0.0" } }, "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g=="], - "parse-bmfont-ascii": ["parse-bmfont-ascii@1.0.6", "", {}, "sha512-U4RrVsUFCleIOBsIGYOMKjn9PavsGOXxbvYGtMOEfnId0SVNsgehXh1DxUdVPLoxd5mvcEtvmKs2Mmf0Mpa1ZA=="], "parse-bmfont-binary": ["parse-bmfont-binary@1.0.6", "", {}, "sha512-GxmsRea0wdGdYthjuUeWTMWPqm2+FAd4GI8vCvhgJsFnoGhTrLhXDDupwTo7rXVAgaLIGoVHDZS9p/5XbSqeWA=="], @@ -1323,7 +1309,7 @@ "posthog-node": ["posthog-node@5.36.4", "", { "dependencies": { "@posthog/core": "1.30.10" }, "peerDependencies": { "rxjs": "^7.0.0" }, "optionalPeers": ["rxjs"] }, "sha512-N+1WiypMHf3SO3NNoXTUFRzX98TuM5w4bDCm8RenYPf0rvX6r8v+yH6IzL1g/Me+wWA5+sfE1JZ6kGV6pWTZyQ=="], - "preact": ["preact@10.29.2", "", {}, "sha512-7tNmwg/7mzzAoB/8kSg6Hl37JraAZw3Z3A0JSY7VXlZwo82Xn0G7wKbNNs2qoF4ZEEsQGTwDAroNdqKs1ofJxQ=="], + "preact": ["preact@10.24.3", "", {}, "sha512-Z2dPnBnMUfyQfSQ+GBdsGa16hz35YmLmtTLhM169uW944hYL6xzTYkJjC07j+Wosz733pMWx0fgON3JNw1jJQA=="], "preact-render-to-string": ["preact-render-to-string@5.2.6", "", { "dependencies": { "pretty-format": "^3.8.0" }, "peerDependencies": { "preact": ">=10" } }, "sha512-JyhErpYOvBV1hEPwIxc/fHWXPfnEGdRKxc8gFdAZ7XV4tlzyzG847XAyEZqoDnynP88akM4eaHcSOzNcLWFguw=="], @@ -1395,8 +1381,6 @@ "resolve": ["resolve@2.0.0-next.7", "", { "dependencies": { "es-errors": "^1.3.0", "is-core-module": "^2.16.2", "node-exports-info": "^1.6.0", "object-keys": "^1.1.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-tqt+NBWwyaMgw3zDsnygx4CByWjQEJHOPMdslYhppaQSJUtL/D4JO9CcBBlhPoI8lz9oJIDXkwXfhF4aWqP8xQ=="], - "resolve-from": ["resolve-from@4.0.0", "", {}, "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="], - "resolve-pkg-maps": ["resolve-pkg-maps@1.0.0", "", {}, "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw=="], "restore-cursor": ["restore-cursor@5.1.0", "", { "dependencies": { "onetime": "^7.0.0", "signal-exit": "^4.1.0" } }, "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA=="], @@ -1429,7 +1413,7 @@ "seedrandom": ["seedrandom@3.0.5", "", {}, "sha512-8OwmbklUNzwezjGInmZ+2clQmExQPvomqjL7LFqOYqtmuxRgQYqOD3mHaU+MvZn5FLUeVxVfQjwLZW/n/JFuqg=="], - "semver": ["semver@7.8.2", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-c8jsqUZm3omBOI66G90z1Dyw5z622G8oLG+omfsHBJf3CWQTlOcwOjvOG6wtiNfW6anKm/eA39LMwMtMez2TiQ=="], + "semver": ["semver@7.8.3", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-wnilbGyMxzbY7dNOl7jpKbLSjcfeweJWU5j4+u5qW+6/wuGD9KzIGOyZnQVSBM9E7DtWaaH3CyHkppYrKYoxwg=="], "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=="], @@ -1501,7 +1485,7 @@ "strip-final-newline": ["strip-final-newline@2.0.0", "", {}, "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA=="], - "strip-json-comments": ["strip-json-comments@3.1.1", "", {}, "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig=="], + "strip-json-comments": ["strip-json-comments@2.0.1", "", {}, "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ=="], "stripe": ["stripe@16.12.0", "", { "dependencies": { "@types/node": ">=8.1.0", "qs": "^6.11.0" } }, "sha512-H7eFVLDxeTNNSn4JTRfL2//LzCbDrMSZ+2q1c7CanVWgK2qIW5TwS+0V7N9KcKZZNpYh/uCqK0PyZh/2UsaAtQ=="], @@ -1509,8 +1493,6 @@ "styled-jsx": ["styled-jsx@5.1.6", "", { "dependencies": { "client-only": "0.0.1" }, "peerDependencies": { "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0" } }, "sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA=="], - "supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], - "supports-preserve-symlinks-flag": ["supports-preserve-symlinks-flag@1.0.0", "", {}, "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w=="], "supports-terminal-graphics": ["supports-terminal-graphics@0.1.0", "", {}, "sha512-+KdfozhS0Fw8y5Sghw8kkZNGT8nWYzJ1EzcoIvVjxhl+26TJTs26y02yfBgvc1jh5AS/c8jcI3xtahhR95KRyQ=="], @@ -1657,8 +1639,6 @@ "zwitch": ["zwitch@2.0.4", "", {}, "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A=="], - "@auth/core/preact": ["preact@10.24.3", "", {}, "sha512-Z2dPnBnMUfyQfSQ+GBdsGa16hz35YmLmtTLhM169uW944hYL6xzTYkJjC07j+Wosz733pMWx0fgON3JNw1jJQA=="], - "@auth/core/preact-render-to-string": ["preact-render-to-string@6.5.11", "", { "peerDependencies": { "preact": ">=10" } }, "sha512-ubnauqoGczeGISiOh6RjX0/cdaF8v/oDXIjO85XALCQjwQP+SB4RDXXtvZ6yTYSjG+PC1QRP2AhPgCEsM2EvUw=="], "@codebuff/common/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], @@ -1669,11 +1649,7 @@ "@codebuff/sdk/ignore": ["ignore@7.0.5", "", {}, "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg=="], - "@eslint/eslintrc/ajv": ["ajv@6.15.0", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw=="], - - "@eslint/eslintrc/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], - - "@eslint/eslintrc/js-yaml": ["js-yaml@4.2.0", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-ePWsvanv0DWuDRsW8dnt+R4jQ31SCRCQ7hhNcPXZPsoBZiemuZNYGf7adZdqX2D86j6rvKp3RpCxVTSb8WQlOw=="], + "@eslint/config-array/minimatch": ["minimatch@10.2.5", "", { "dependencies": { "brace-expansion": "^5.0.5" } }, "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg=="], "@opentui/core/diff": ["diff@9.0.0", "", {}, "sha512-svtcdpS8CgJyqAjEQIXdb3OjhFVVYjzGAPO8WGCmRbrml64SPw/jJD4GoE98aR7r25A0XcgrK3F02yw9R/vhQw=="], @@ -1709,12 +1685,12 @@ "eslint/ajv": ["ajv@6.15.0", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw=="], - "eslint/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], - - "eslint/eslint-visitor-keys": ["eslint-visitor-keys@4.2.1", "", {}, "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ=="], + "eslint/eslint-visitor-keys": ["eslint-visitor-keys@5.0.1", "", {}, "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA=="], "eslint/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], + "eslint/minimatch": ["minimatch@10.2.5", "", { "dependencies": { "brace-expansion": "^5.0.5" } }, "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg=="], + "eslint-import-resolver-node/debug": ["debug@3.2.7", "", { "dependencies": { "ms": "^2.1.1" } }, "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ=="], "eslint-module-utils/debug": ["debug@3.2.7", "", { "dependencies": { "ms": "^2.1.1" } }, "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ=="], @@ -1725,7 +1701,7 @@ "eslint-plugin-import/tsconfig-paths": ["tsconfig-paths@3.15.0", "", { "dependencies": { "@types/json5": "^0.0.29", "json5": "^1.0.2", "minimist": "^1.2.6", "strip-bom": "^3.0.0" } }, "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg=="], - "espree/eslint-visitor-keys": ["eslint-visitor-keys@4.2.1", "", {}, "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ=="], + "espree/eslint-visitor-keys": ["eslint-visitor-keys@5.0.1", "", {}, "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA=="], "execa/onetime": ["onetime@5.1.2", "", { "dependencies": { "mimic-fn": "^2.1.0" } }, "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg=="], @@ -1753,16 +1729,12 @@ "plist/xmlbuilder": ["xmlbuilder@15.1.1", "", {}, "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg=="], - "rc/strip-json-comments": ["strip-json-comments@2.0.1", "", {}, "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ=="], - "react-devtools-core/ws": ["ws@7.5.11", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": "^5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-zS54Oen9bITtp7kp2XM3AydrCIq1D+HwJOuH+c+e4LfpL/lotP5osijd+UoMnxwAam1GN8R4KtLAyIrIcBNpiA=="], "react-reconciler/scheduler": ["scheduler@0.26.0", "", {}, "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA=="], "send/mime-types": ["mime-types@3.0.2", "", { "dependencies": { "mime-db": "^1.54.0" } }, "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A=="], - "slice-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], - "tar-stream/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=="], "ts-node/diff": ["diff@4.0.4", "", {}, "sha512-X07nttJQkwkfKfvTPG/KSnE2OMdcUCao6+eXF3wmnIQRn2aPAHH3VxDbDOdegkd6JbPsXqShpvEOHfAT+nCNwQ=="], @@ -1777,8 +1749,6 @@ "typescript-eslint/@typescript-eslint/utils": ["@typescript-eslint/utils@7.18.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@typescript-eslint/scope-manager": "7.18.0", "@typescript-eslint/types": "7.18.0", "@typescript-eslint/typescript-estree": "7.18.0" }, "peerDependencies": { "eslint": "^8.56.0" } }, "sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw=="], - "wrap-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], - "wrap-ansi/string-width": ["string-width@8.2.1", "", { "dependencies": { "get-east-asian-width": "^1.5.0", "strip-ansi": "^7.1.2" } }, "sha512-IIaP0g3iy9Cyy18w3M9YcaDudujEAVHKt3a3QJg1+sr/oX96TbaGUubG0hJyCjCBThFH+tFpcIyoUHUn1ogaLA=="], "yargs/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], @@ -1787,9 +1757,7 @@ "@codebuff/evals/pino/process-warning": ["process-warning@5.0.0", "", {}, "sha512-a39t9ApHNx2L4+HBnQKqxxHNs1r7KF+Intd8Q/g1bUh6q0WIp9voPXJ/x0j+ZL45KF1pJd9+q2jLIRMfvEshkA=="], - "@eslint/eslintrc/ajv/json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], - - "@eslint/eslintrc/js-yaml/argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="], + "@eslint/config-array/minimatch/brace-expansion": ["brace-expansion@5.0.6", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g=="], "@typescript-eslint/parser/@typescript-eslint/typescript-estree/minimatch": ["minimatch@9.0.9", "", { "dependencies": { "brace-expansion": "^2.0.2" } }, "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg=="], @@ -1803,10 +1771,14 @@ "cliui/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], + "cliui/wrap-ansi/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + "eslint-plugin-import/tsconfig-paths/json5": ["json5@1.0.2", "", { "dependencies": { "minimist": "^1.2.0" }, "bin": { "json5": "lib/cli.js" } }, "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA=="], "eslint/ajv/json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], + "eslint/minimatch/brace-expansion": ["brace-expansion@5.0.6", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g=="], + "express/mime-types/mime-db": ["mime-db@1.54.0", "", {}, "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ=="], "p-locate/p-limit/yocto-queue": ["yocto-queue@0.1.0", "", {}, "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="], @@ -1835,8 +1807,12 @@ "yargs/string-width/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + "@eslint/config-array/minimatch/brace-expansion/balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="], + "@typescript-eslint/parser/@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.1.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-WR1cURNjuvBLMZBMbqM0UoE+WAfdUcEV1ccD8PVBVOI+Z3ND4+SZbN8RsfT2bMuG1qwz5RFvPukSZm5fF2D5eA=="], + "eslint/minimatch/brace-expansion/balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="], + "typescript-eslint/@typescript-eslint/eslint-plugin/@typescript-eslint/scope-manager/@typescript-eslint/types": ["@typescript-eslint/types@7.18.0", "", {}, "sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ=="], "typescript-eslint/@typescript-eslint/eslint-plugin/@typescript-eslint/type-utils/@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@7.18.0", "", { "dependencies": { "@typescript-eslint/types": "7.18.0", "@typescript-eslint/visitor-keys": "7.18.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", "minimatch": "^9.0.4", "semver": "^7.6.0", "ts-api-utils": "^1.3.0" } }, "sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA=="], From 8a1340150b628a2812575cb88717bf5e6f520b36 Mon Sep 17 00:00:00 2001 From: codebuff public sync bot <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 8 Jun 2026 18:15:06 +0000 Subject: [PATCH 21/96] Sync public snapshot from freebuff-private Source: CodebuffAI/freebuff-private@6bfc3d6fc7bfa01a6d4ce911447f150babc12e7d --- bun.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/bun.lock b/bun.lock index 6dc7c46691..f34e4b2384 100644 --- a/bun.lock +++ b/bun.lock @@ -1309,7 +1309,7 @@ "posthog-node": ["posthog-node@5.36.4", "", { "dependencies": { "@posthog/core": "1.30.10" }, "peerDependencies": { "rxjs": "^7.0.0" }, "optionalPeers": ["rxjs"] }, "sha512-N+1WiypMHf3SO3NNoXTUFRzX98TuM5w4bDCm8RenYPf0rvX6r8v+yH6IzL1g/Me+wWA5+sfE1JZ6kGV6pWTZyQ=="], - "preact": ["preact@10.24.3", "", {}, "sha512-Z2dPnBnMUfyQfSQ+GBdsGa16hz35YmLmtTLhM169uW944hYL6xzTYkJjC07j+Wosz733pMWx0fgON3JNw1jJQA=="], + "preact": ["preact@10.29.2", "", {}, "sha512-7tNmwg/7mzzAoB/8kSg6Hl37JraAZw3Z3A0JSY7VXlZwo82Xn0G7wKbNNs2qoF4ZEEsQGTwDAroNdqKs1ofJxQ=="], "preact-render-to-string": ["preact-render-to-string@5.2.6", "", { "dependencies": { "pretty-format": "^3.8.0" }, "peerDependencies": { "preact": ">=10" } }, "sha512-JyhErpYOvBV1hEPwIxc/fHWXPfnEGdRKxc8gFdAZ7XV4tlzyzG847XAyEZqoDnynP88akM4eaHcSOzNcLWFguw=="], @@ -1639,6 +1639,8 @@ "zwitch": ["zwitch@2.0.4", "", {}, "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A=="], + "@auth/core/preact": ["preact@10.24.3", "", {}, "sha512-Z2dPnBnMUfyQfSQ+GBdsGa16hz35YmLmtTLhM169uW944hYL6xzTYkJjC07j+Wosz733pMWx0fgON3JNw1jJQA=="], + "@auth/core/preact-render-to-string": ["preact-render-to-string@6.5.11", "", { "peerDependencies": { "preact": ">=10" } }, "sha512-ubnauqoGczeGISiOh6RjX0/cdaF8v/oDXIjO85XALCQjwQP+SB4RDXXtvZ6yTYSjG+PC1QRP2AhPgCEsM2EvUw=="], "@codebuff/common/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], @@ -1655,8 +1657,6 @@ "@opentui/core/strip-ansi": ["strip-ansi@7.1.2", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA=="], - "@types/diff/diff": ["diff@9.0.0", "", {}, "sha512-svtcdpS8CgJyqAjEQIXdb3OjhFVVYjzGAPO8WGCmRbrml64SPw/jJD4GoE98aR7r25A0XcgrK3F02yw9R/vhQw=="], - "@typescript-eslint/eslint-plugin/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], "@typescript-eslint/parser/@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@7.18.0", "", { "dependencies": { "@typescript-eslint/types": "7.18.0", "@typescript-eslint/visitor-keys": "7.18.0" } }, "sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA=="], From 05aa574bf37bf5b1112fbd543685997e6c9202b9 Mon Sep 17 00:00:00 2001 From: codebuff public sync bot <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 8 Jun 2026 18:32:11 +0000 Subject: [PATCH 22/96] Sync public snapshot from freebuff-private Source: CodebuffAI/freebuff-private@51efb2ca5f2e9a70e5c75bb7374b5053f2bb7287 --- bun.lock | 2 ++ 1 file changed, 2 insertions(+) diff --git a/bun.lock b/bun.lock index f34e4b2384..942fb1da42 100644 --- a/bun.lock +++ b/bun.lock @@ -1657,6 +1657,8 @@ "@opentui/core/strip-ansi": ["strip-ansi@7.1.2", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA=="], + "@types/diff/diff": ["diff@9.0.0", "", {}, "sha512-svtcdpS8CgJyqAjEQIXdb3OjhFVVYjzGAPO8WGCmRbrml64SPw/jJD4GoE98aR7r25A0XcgrK3F02yw9R/vhQw=="], + "@typescript-eslint/eslint-plugin/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], "@typescript-eslint/parser/@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@7.18.0", "", { "dependencies": { "@typescript-eslint/types": "7.18.0", "@typescript-eslint/visitor-keys": "7.18.0" } }, "sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA=="], From efe26f6824d282f6262c95b55fa5f48c3f2e7101 Mon Sep 17 00:00:00 2001 From: codebuff public sync bot <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 8 Jun 2026 19:08:24 +0000 Subject: [PATCH 23/96] Sync public snapshot from freebuff-private Source: CodebuffAI/freebuff-private@8829b23081dc1caf9d2c669e0d1d62088df45edd --- bun.lock | 2 -- 1 file changed, 2 deletions(-) diff --git a/bun.lock b/bun.lock index 942fb1da42..f34e4b2384 100644 --- a/bun.lock +++ b/bun.lock @@ -1657,8 +1657,6 @@ "@opentui/core/strip-ansi": ["strip-ansi@7.1.2", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA=="], - "@types/diff/diff": ["diff@9.0.0", "", {}, "sha512-svtcdpS8CgJyqAjEQIXdb3OjhFVVYjzGAPO8WGCmRbrml64SPw/jJD4GoE98aR7r25A0XcgrK3F02yw9R/vhQw=="], - "@typescript-eslint/eslint-plugin/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], "@typescript-eslint/parser/@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@7.18.0", "", { "dependencies": { "@typescript-eslint/types": "7.18.0", "@typescript-eslint/visitor-keys": "7.18.0" } }, "sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA=="], From fc9eb0a576906fabd725282e8bcbe094c86c1cd8 Mon Sep 17 00:00:00 2001 From: codebuff public sync bot <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 8 Jun 2026 20:08:09 +0000 Subject: [PATCH 24/96] Sync public snapshot from freebuff-private Source: CodebuffAI/freebuff-private@37a202af93ba4dfcc69879b1ad01db69df1ab4b2 --- bun.lock | 6 +++--- common/src/constants/freebuff-models.ts | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/bun.lock b/bun.lock index f34e4b2384..3183720b66 100644 --- a/bun.lock +++ b/bun.lock @@ -427,9 +427,9 @@ "@pinojs/redact": ["@pinojs/redact@0.4.0", "", {}, "sha512-k2ENnmBugE/rzQfEcdWHcCY+/FM3VLzH9cYEsbdsoqrvzAKRhUZeRNhAZvB8OitQJ1TBed3yqWtdjzS6wJKBwg=="], - "@posthog/core": ["@posthog/core@1.30.10", "", { "dependencies": { "@posthog/types": "1.382.0" } }, "sha512-R7Z5jDB3ugwfSujMmRd5osPPR6L6BqfcaSNcYOekzRMZ4Jklq74p05xByP09EnUvKXb5czI+RQVCITTWRWuFXw=="], + "@posthog/core": ["@posthog/core@1.30.11", "", { "dependencies": { "@posthog/types": "1.383.0" } }, "sha512-B4RB0d9cnaZlZ5ewEUh18HMO45tz6TkUPYTZA+8bTyszoIwNBkKSoJcBb2eF4ldcu37eXagkewVg2vWJ3+qTqQ=="], - "@posthog/types": ["@posthog/types@1.382.0", "", {}, "sha512-iK4OcSgvtmS9FZ9EUpvwlRZmHCLXaZ3+6dbRjkE7q9LL0zHLewxJH84H6uGvCw8aGzxs5rIliZqPHgimTcQEaw=="], + "@posthog/types": ["@posthog/types@1.383.0", "", {}, "sha512-/x7Rf52IajI6DWTXN7wcoUDWK2JvqCVgusbnyfbMtfwVJnEQHCxu3DC9XEMoScpWp9Pgq1XgF0L97uwwn724mA=="], "@rtsao/scc": ["@rtsao/scc@1.1.0", "", {}, "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g=="], @@ -1307,7 +1307,7 @@ "postgres-interval": ["postgres-interval@1.2.0", "", { "dependencies": { "xtend": "^4.0.0" } }, "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ=="], - "posthog-node": ["posthog-node@5.36.4", "", { "dependencies": { "@posthog/core": "1.30.10" }, "peerDependencies": { "rxjs": "^7.0.0" }, "optionalPeers": ["rxjs"] }, "sha512-N+1WiypMHf3SO3NNoXTUFRzX98TuM5w4bDCm8RenYPf0rvX6r8v+yH6IzL1g/Me+wWA5+sfE1JZ6kGV6pWTZyQ=="], + "posthog-node": ["posthog-node@5.36.5", "", { "dependencies": { "@posthog/core": "1.30.11" }, "peerDependencies": { "rxjs": "^7.0.0" }, "optionalPeers": ["rxjs"] }, "sha512-ClI6LA+wDUMuMvY/fwKf4YxDHSyXrFTXWtlGGAly0Diage+mF05bH543bUSuhz1CrFPhWHQokTGPLz6wBPGA4Q=="], "preact": ["preact@10.29.2", "", {}, "sha512-7tNmwg/7mzzAoB/8kSg6Hl37JraAZw3Z3A0JSY7VXlZwo82Xn0G7wKbNNs2qoF4ZEEsQGTwDAroNdqKs1ofJxQ=="], diff --git a/common/src/constants/freebuff-models.ts b/common/src/constants/freebuff-models.ts index 4aa8277f95..4a47f2f15c 100644 --- a/common/src/constants/freebuff-models.ts +++ b/common/src/constants/freebuff-models.ts @@ -188,7 +188,7 @@ export type FreebuffPremiumModelId = (typeof FREEBUFF_PREMIUM_MODEL_IDS)[number] * guaranteed-available id for resolution / auto-fallbacks should use * FALLBACK_FREEBUFF_MODEL_ID instead. */ export const DEFAULT_FREEBUFF_MODEL_ID: FreebuffModelId = - FREEBUFF_DEEPSEEK_V4_FLASH_MODEL_ID + FREEBUFF_DEEPSEEK_V4_PRO_MODEL_ID /** Always-available fallback used when the requested model can't be served * right now (unknown id, deployment hours closed, etc.). Kept distinct from From 016c5870e9666718ecbf13e34d960a30b8bb6665 Mon Sep 17 00:00:00 2001 From: codebuff public sync bot <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 8 Jun 2026 20:33:34 +0000 Subject: [PATCH 25/96] Sync public snapshot from freebuff-private Source: CodebuffAI/freebuff-private@92eeab273610ca6439e0399f69d075ccb79a3712 --- agents/base2/base2-free-minimax-m3.ts | 14 ++++++++++++++ bun.lock | 2 ++ common/src/__tests__/free-agents.test.ts | 12 ++++++++++++ common/src/__tests__/freebuff-models.test.ts | 20 ++++++++++++-------- common/src/constants/free-agents.ts | 4 ++++ common/src/constants/freebuff-models.ts | 16 +++++++++++++++- 6 files changed, 59 insertions(+), 9 deletions(-) create mode 100644 agents/base2/base2-free-minimax-m3.ts diff --git a/agents/base2/base2-free-minimax-m3.ts b/agents/base2/base2-free-minimax-m3.ts new file mode 100644 index 0000000000..240ad0b418 --- /dev/null +++ b/agents/base2/base2-free-minimax-m3.ts @@ -0,0 +1,14 @@ +import { FREEBUFF_MINIMAX_M3_MODEL_ID } from '@codebuff/common/constants/freebuff-models' + +import { createBase2 } from './base2' + +const definition = { + ...createBase2('free', { + model: FREEBUFF_MINIMAX_M3_MODEL_ID, + noReview: true, + }), + id: 'base2-free-minimax-m3', + displayName: 'Buffy the MiniMax M3 Free Orchestrator', +} + +export default definition diff --git a/bun.lock b/bun.lock index 3183720b66..5e781e35b5 100644 --- a/bun.lock +++ b/bun.lock @@ -1657,6 +1657,8 @@ "@opentui/core/strip-ansi": ["strip-ansi@7.1.2", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA=="], + "@types/diff/diff": ["diff@9.0.0", "", {}, "sha512-svtcdpS8CgJyqAjEQIXdb3OjhFVVYjzGAPO8WGCmRbrml64SPw/jJD4GoE98aR7r25A0XcgrK3F02yw9R/vhQw=="], + "@typescript-eslint/eslint-plugin/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], "@typescript-eslint/parser/@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@7.18.0", "", { "dependencies": { "@typescript-eslint/types": "7.18.0", "@typescript-eslint/visitor-keys": "7.18.0" } }, "sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA=="], diff --git a/common/src/__tests__/free-agents.test.ts b/common/src/__tests__/free-agents.test.ts index 379086abbe..c58329f824 100644 --- a/common/src/__tests__/free-agents.test.ts +++ b/common/src/__tests__/free-agents.test.ts @@ -40,6 +40,9 @@ describe('free mode agent model allowlist', () => { expect(getFreebuffRootAgentIdForModel(FREEBUFF_MIMO_V25_MODEL_ID)).toBe( 'base2-free-mimo', ) + expect(getFreebuffRootAgentIdForModel(MINIMAX_M3_MODEL_ID)).toBe( + 'base2-free-minimax-m3', + ) }) test('allows each freebuff root agent only with its configured model', () => { @@ -97,6 +100,15 @@ describe('free mode agent model allowlist', () => { `${FREEBUFF_MIMO_V25_MODEL_ID}-20260527`, ), ).toBe(true) + expect( + isFreeModeAllowedAgentModel('base2-free-minimax-m3', MINIMAX_M3_MODEL_ID), + ).toBe(true) + expect( + isFreeModeAllowedAgentModel( + 'base2-free-minimax-m3', + FREEBUFF_MINIMAX_MODEL_ID, + ), + ).toBe(false) }) test('allows each freebuff reviewer agent only with its configured model', () => { diff --git a/common/src/__tests__/freebuff-models.test.ts b/common/src/__tests__/freebuff-models.test.ts index 40913fbfa8..5e1e96c516 100644 --- a/common/src/__tests__/freebuff-models.test.ts +++ b/common/src/__tests__/freebuff-models.test.ts @@ -29,8 +29,8 @@ import { minimaxModels } from '../constants/model-config' const MINIMAX_M3_MODEL_ID = minimaxModels.minimaxM3 describe('freebuff model availability', () => { - test('defaults and falls back to DeepSeek V4 Flash for new clients', () => { - expect(DEFAULT_FREEBUFF_MODEL_ID).toBe(FREEBUFF_DEEPSEEK_V4_FLASH_MODEL_ID) + test('defaults to DeepSeek V4 Pro, falls back to DeepSeek V4 Flash for new clients', () => { + expect(DEFAULT_FREEBUFF_MODEL_ID).toBe(FREEBUFF_DEEPSEEK_V4_PRO_MODEL_ID) expect(FALLBACK_FREEBUFF_MODEL_ID).toBe(FREEBUFF_DEEPSEEK_V4_FLASH_MODEL_ID) }) @@ -110,18 +110,22 @@ describe('freebuff model availability', () => { } }) - test('MiniMax M3 is not supported for freebuff sessions', () => { - expect(SUPPORTED_FREEBUFF_MODELS.map((model) => model.id)).not.toContain( + test('MiniMax M3 is a selectable premium model in full mode', () => { + expect(SUPPORTED_FREEBUFF_MODELS.map((model) => model.id)).toContain( MINIMAX_M3_MODEL_ID, ) - expect(FREEBUFF_MODELS.map((model) => model.id)).not.toContain( + expect(FREEBUFF_MODELS.map((model) => model.id)).toContain( MINIMAX_M3_MODEL_ID, ) - expect(isFreebuffModelId(MINIMAX_M3_MODEL_ID)).toBe(false) - expect(isSupportedFreebuffModelId(MINIMAX_M3_MODEL_ID)).toBe(false) + expect( + getFreebuffModelsForAccessTier('full').map((m) => m.id), + ).toContain(MINIMAX_M3_MODEL_ID) + expect(isFreebuffModelId(MINIMAX_M3_MODEL_ID)).toBe(true) + expect(isSupportedFreebuffModelId(MINIMAX_M3_MODEL_ID)).toBe(true) + expect(isFreebuffPremiumModelId(MINIMAX_M3_MODEL_ID)).toBe(true) expect( isFreebuffModelAllowedForAccessTier(MINIMAX_M3_MODEL_ID, 'full'), - ).toBe(false) + ).toBe(true) }) test('limited access exposes DeepSeek V4 Flash and non-Pro MiMo 2.5', () => { diff --git a/common/src/constants/free-agents.ts b/common/src/constants/free-agents.ts index 10a0167c77..06e2b3c1bb 100644 --- a/common/src/constants/free-agents.ts +++ b/common/src/constants/free-agents.ts @@ -7,6 +7,7 @@ import { FREEBUFF_GEMINI_PRO_MODEL_ID, FREEBUFF_KIMI_MODEL_ID, FREEBUFF_MINIMAX_MODEL_ID, + FREEBUFF_MINIMAX_M3_MODEL_ID, FREEBUFF_MIMO_V25_MODEL_ID, FREEBUFF_MIMO_V25_PRO_MODEL_ID, } from './freebuff-models' @@ -32,6 +33,7 @@ export const FREEBUFF_ROOT_AGENT_IDS = [ 'base2-free-deepseek-flash', 'base2-free-mimo-pro', 'base2-free-mimo', + 'base2-free-minimax-m3', ] as const const FREEBUFF_ROOT_AGENT_ID_SET: ReadonlySet = new Set( FREEBUFF_ROOT_AGENT_IDS, @@ -41,6 +43,7 @@ export const FREEBUFF_ROOT_AGENT_ID_BY_MODEL: Record = { [FREEBUFF_MIMO_V25_PRO_MODEL_ID]: 'base2-free-mimo-pro', [FREEBUFF_MIMO_V25_MODEL_ID]: 'base2-free-mimo', [FREEBUFF_MINIMAX_MODEL_ID]: 'base2-free', + [FREEBUFF_MINIMAX_M3_MODEL_ID]: 'base2-free-minimax-m3', [FREEBUFF_KIMI_MODEL_ID]: 'base2-free-kimi', [FREEBUFF_DEEPSEEK_V4_PRO_MODEL_ID]: 'base2-free-deepseek', [FREEBUFF_DEEPSEEK_V4_FLASH_MODEL_ID]: 'base2-free-deepseek-flash', @@ -82,6 +85,7 @@ export const FREE_MODE_AGENT_MODELS: Record> = { 'base2-free-deepseek-flash': new Set([FREEBUFF_DEEPSEEK_V4_FLASH_MODEL_ID]), 'base2-free-mimo-pro': new Set([FREEBUFF_MIMO_V25_PRO_MODEL_ID]), 'base2-free-mimo': new Set([FREEBUFF_MIMO_V25_MODEL_ID]), + 'base2-free-minimax-m3': new Set([FREEBUFF_MINIMAX_M3_MODEL_ID]), // File exploration agents 'file-picker': new Set(['google/gemini-2.5-flash-lite']), diff --git a/common/src/constants/freebuff-models.ts b/common/src/constants/freebuff-models.ts index 4a47f2f15c..ce54d3a12b 100644 --- a/common/src/constants/freebuff-models.ts +++ b/common/src/constants/freebuff-models.ts @@ -4,7 +4,7 @@ import { getZonedParts, type ZonedDateParts, } from '../util/zoned-time' -import { mimoModels } from './model-config' +import { mimoModels, minimaxModels } from './model-config' /** * Models a freebuff user can pick between in the waiting-room model selector. @@ -46,6 +46,8 @@ export const FREEBUFF_DEEPSEEK_V4_PRO_MODEL_ID = 'deepseek/deepseek-v4-pro' export const FREEBUFF_DEEPSEEK_V4_FLASH_MODEL_ID = 'deepseek/deepseek-v4-flash' export const FREEBUFF_KIMI_MODEL_ID = 'moonshotai/kimi-k2.6' export const FREEBUFF_MINIMAX_MODEL_ID = 'minimax/minimax-m2.7' +/** Premium tier; routes to MiniMax's official API (distinct from the m2.7 id). */ +export const FREEBUFF_MINIMAX_M3_MODEL_ID = minimaxModels.minimaxM3 export const FREEBUFF_MIMO_V25_MODEL_ID = mimoModels.mimoV25 export const FREEBUFF_MIMO_V25_PRO_MODEL_ID = mimoModels.mimoV25Pro /** UI-only rollout switch. Backend support and free-mode allowlists remain @@ -148,10 +150,20 @@ const MINIMAX_MODEL = { multimodal: false, } as const satisfies FreebuffModelOption +const MINIMAX_M3_MODEL = { + id: FREEBUFF_MINIMAX_M3_MODEL_ID, + displayName: 'MiniMax M3', + tagline: 'Frontier', + availability: 'always', + premium: true, + multimodal: false, +} as const satisfies FreebuffModelOption + export const SUPPORTED_FREEBUFF_MODELS = [ DEEPSEEK_V4_PRO_MODEL, MIMO_V25_PRO_MODEL, KIMI_MODEL, + MINIMAX_M3_MODEL, DEEPSEEK_V4_FLASH_MODEL, MIMO_V25_MODEL, MINIMAX_MODEL, @@ -161,6 +173,7 @@ export const FREEBUFF_MODELS = [ DEEPSEEK_V4_PRO_MODEL, ...(FREEBUFF_ENABLE_MIMO_MODELS_IN_UI ? [MIMO_V25_PRO_MODEL] : []), KIMI_MODEL, + MINIMAX_M3_MODEL, DEEPSEEK_V4_FLASH_MODEL, ...(FREEBUFF_ENABLE_MIMO_MODELS_IN_UI ? [MIMO_V25_MODEL] : []), MINIMAX_MODEL, @@ -170,6 +183,7 @@ export const FREEBUFF_PREMIUM_MODEL_IDS = [ FREEBUFF_DEEPSEEK_V4_PRO_MODEL_ID, FREEBUFF_MIMO_V25_PRO_MODEL_ID, FREEBUFF_KIMI_MODEL_ID, + FREEBUFF_MINIMAX_M3_MODEL_ID, ] as const /** Models that accept image input. Used to decide whether uploaded images are From 0b9e80cd9a67cfc706593a3d86d28c1ac8965e86 Mon Sep 17 00:00:00 2001 From: codebuff public sync bot <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 8 Jun 2026 20:43:17 +0000 Subject: [PATCH 26/96] Sync public snapshot from freebuff-private Source: CodebuffAI/freebuff-private@aa17d2af641fcd6373ddeb59db1b5964dc559318 --- bun.lock | 76 ++++++++++++++++++++++++++++++++++++-------------------- 1 file changed, 49 insertions(+), 27 deletions(-) diff --git a/bun.lock b/bun.lock index 5e781e35b5..45f4873a12 100644 --- a/bun.lock +++ b/bun.lock @@ -239,15 +239,19 @@ "@eslint-community/regexpp": ["@eslint-community/regexpp@4.12.2", "", {}, "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew=="], - "@eslint/config-array": ["@eslint/config-array@0.23.5", "", { "dependencies": { "@eslint/object-schema": "^3.0.5", "debug": "^4.3.1", "minimatch": "^10.2.4" } }, "sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA=="], + "@eslint/config-array": ["@eslint/config-array@0.21.2", "", { "dependencies": { "@eslint/object-schema": "^2.1.7", "debug": "^4.3.1", "minimatch": "^3.1.5" } }, "sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw=="], - "@eslint/config-helpers": ["@eslint/config-helpers@0.6.0", "", { "dependencies": { "@eslint/core": "^1.2.1" } }, "sha512-ii6Bw9jJ2zi2cWA2Z+9/QZ/+3DX6kwaV5Q986D/CdP3Lap3w/pgQZ373FV7byY/i7L4IRH/G43I5dz1ClsCbpA=="], + "@eslint/config-helpers": ["@eslint/config-helpers@0.4.2", "", { "dependencies": { "@eslint/core": "^0.17.0" } }, "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw=="], - "@eslint/core": ["@eslint/core@1.2.1", "", { "dependencies": { "@types/json-schema": "^7.0.15" } }, "sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ=="], + "@eslint/core": ["@eslint/core@0.17.0", "", { "dependencies": { "@types/json-schema": "^7.0.15" } }, "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ=="], - "@eslint/object-schema": ["@eslint/object-schema@3.0.5", "", {}, "sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw=="], + "@eslint/eslintrc": ["@eslint/eslintrc@3.3.5", "", { "dependencies": { "ajv": "^6.14.0", "debug": "^4.3.2", "espree": "^10.0.1", "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.1", "minimatch": "^3.1.5", "strip-json-comments": "^3.1.1" } }, "sha512-4IlJx0X0qftVsN5E+/vGujTRIFtwuLbNsVUe7TO6zYPDR1O6nFwvwhIKEKSrl6dZchmYBITazxKoUYOjdtjlRg=="], - "@eslint/plugin-kit": ["@eslint/plugin-kit@0.7.2", "", { "dependencies": { "@eslint/core": "^1.2.1", "levn": "^0.4.1" } }, "sha512-+CNAzxglkrpNf/kKywqQfk74QjtceuOE7Qm+AF8miRvPF/wmmK5+OJOgVh3AVTT3RP2mH3+FOaxlE5v72owk0A=="], + "@eslint/js": ["@eslint/js@9.39.4", "", {}, "sha512-nE7DEIchvtiFTwBw4Lfbu59PG+kCofhjsKaCWzxTpt4lfRjRMqG6uMBzKXuEcyXhOHoUp9riAm7/aWYGhXZ9cw=="], + + "@eslint/object-schema": ["@eslint/object-schema@2.1.7", "", {}, "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA=="], + + "@eslint/plugin-kit": ["@eslint/plugin-kit@0.4.1", "", { "dependencies": { "@eslint/core": "^0.17.0", "levn": "^0.4.1" } }, "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA=="], "@gravity-ai/api": ["@gravity-ai/api@0.1.2", "", { "dependencies": { "axios": "^1.13.2" } }, "sha512-txsAhyzvwB/TNrj5R8DoNqw8afM3JY2ahl7aaeaD5ZsxP+7rxff7C7keGI7+gU2KT3d2Mcw4QB1nHhbTSCJYHw=="], @@ -463,8 +467,6 @@ "@types/diff": ["@types/diff@8.0.0", "", { "dependencies": { "diff": "*" } }, "sha512-o7jqJM04gfaYrdCecCVMbZhNdG6T1MHg/oQoRFdERLV+4d+V7FijhiEAbFu0Usww84Yijk9yH58U4Jk4HbtzZw=="], - "@types/esrecurse": ["@types/esrecurse@4.3.1", "", {}, "sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw=="], - "@types/estree": ["@types/estree@1.0.9", "", {}, "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg=="], "@types/js-yaml": ["@types/js-yaml@4.0.9", "", {}, "sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg=="], @@ -547,7 +549,7 @@ "ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="], - "ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], + "ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], "any-base": ["any-base@1.1.0", "", {}, "sha512-uMgjozySS8adZZYePpaWs8cxB9/kdzmpX6SgJZ+wbz1K5eYk5QMYDVJaZKhxyIHUdnnJkfR7SVgStgH7LkGUyg=="], @@ -623,6 +625,8 @@ "call-bound": ["call-bound@1.0.4", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "get-intrinsic": "^1.3.0" } }, "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg=="], + "callsites": ["callsites@3.1.0", "", {}, "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="], + "caniuse-lite": ["caniuse-lite@1.0.30001797", "", {}, "sha512-l8xKG+gwAIExZGl9FrF7KUwuOmk6wbEPC9Xoy/RtnWv1XG0Q4LFlagaLpUv3Kiza3W/wm27zy0yWJEieYKAP6w=="], "canvas": ["canvas@3.2.3", "", { "dependencies": { "node-addon-api": "^7.0.0", "prebuild-install": "^7.1.3" } }, "sha512-PzE5nJZPz72YUAfo8oTp0u3fqqY7IzlTubneAihqDYAUcBk7ryeCmBbdJBEdaH0bptSOe2VT2Zwcb3UaFyaSWw=="], @@ -747,7 +751,7 @@ "escape-string-regexp": ["escape-string-regexp@4.0.0", "", {}, "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="], - "eslint": ["eslint@10.4.1", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.2", "@eslint/config-array": "^0.23.5", "@eslint/config-helpers": "^0.6.0", "@eslint/core": "^1.2.1", "@eslint/plugin-kit": "^0.7.2", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "ajv": "^6.14.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^9.1.2", "eslint-visitor-keys": "^5.0.1", "espree": "^11.2.0", "esquery": "^1.7.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "minimatch": "^10.2.4", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, "peerDependencies": { "jiti": "*" }, "optionalPeers": ["jiti"], "bin": { "eslint": "bin/eslint.js" } }, "sha512-AyIKhnOBuOAdueD7RB3xB+YeAWScb9jHsJBgH2Hcde8InP5JYhqrRR6iTMHyTEwgENK54Cp44e4v8BwNhsuHuw=="], + "eslint": ["eslint@9.39.4", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", "@eslint/config-array": "^0.21.2", "@eslint/config-helpers": "^0.4.2", "@eslint/core": "^0.17.0", "@eslint/eslintrc": "^3.3.5", "@eslint/js": "9.39.4", "@eslint/plugin-kit": "^0.4.1", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "ajv": "^6.14.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^8.4.0", "eslint-visitor-keys": "^4.2.1", "espree": "^10.4.0", "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.5", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, "peerDependencies": { "jiti": "*" }, "optionalPeers": ["jiti"], "bin": { "eslint": "bin/eslint.js" } }, "sha512-XoMjdBOwe/esVgEvLmNsD3IRHkm7fbKIUGvrleloJXUZgDHig2IPWNniv+GwjyJXzuNqVjlr5+4yVUZjycJwfQ=="], "eslint-config-prettier": ["eslint-config-prettier@9.1.2", "", { "peerDependencies": { "eslint": ">=7.0.0" }, "bin": { "eslint-config-prettier": "bin/cli.js" } }, "sha512-iI1f+D2ViGn+uvv5HuHVUamg8ll4tN+JRHGc6IJi4TP9Kl976C57fzPXgseXNs8v0iA8aSJpHsTWjDb9QJamGQ=="], @@ -759,11 +763,11 @@ "eslint-plugin-unused-imports": ["eslint-plugin-unused-imports@4.4.1", "", { "peerDependencies": { "@typescript-eslint/eslint-plugin": "^8.0.0-0 || ^7.0.0 || ^6.0.0 || ^5.0.0", "eslint": "^10.0.0 || ^9.0.0 || ^8.0.0" }, "optionalPeers": ["@typescript-eslint/eslint-plugin"] }, "sha512-oZGYUz1X3sRMGUB+0cZyK2VcvRX5lm/vB56PgNNcU+7ficUCKm66oZWKUubXWnOuPjQ8PvmXtCViXBMONPe7tQ=="], - "eslint-scope": ["eslint-scope@9.1.2", "", { "dependencies": { "@types/esrecurse": "^4.3.1", "@types/estree": "^1.0.8", "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ=="], + "eslint-scope": ["eslint-scope@8.4.0", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg=="], "eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="], - "espree": ["espree@11.2.0", "", { "dependencies": { "acorn": "^8.16.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^5.0.1" } }, "sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw=="], + "espree": ["espree@10.4.0", "", { "dependencies": { "acorn": "^8.15.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^4.2.1" } }, "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ=="], "esprima": ["esprima@4.0.1", "", { "bin": { "esparse": "./bin/esparse.js", "esvalidate": "./bin/esvalidate.js" } }, "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="], @@ -875,6 +879,8 @@ "glob-parent": ["glob-parent@6.0.2", "", { "dependencies": { "is-glob": "^4.0.3" } }, "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A=="], + "globals": ["globals@14.0.0", "", {}, "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ=="], + "globalthis": ["globalthis@1.0.4", "", { "dependencies": { "define-properties": "^1.2.1", "gopd": "^1.0.1" } }, "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ=="], "globby": ["globby@11.1.0", "", { "dependencies": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", "fast-glob": "^3.2.9", "ignore": "^5.2.0", "merge2": "^1.4.1", "slash": "^3.0.0" } }, "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g=="], @@ -889,6 +895,8 @@ "has-bigints": ["has-bigints@1.1.0", "", {}, "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg=="], + "has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], + "has-property-descriptors": ["has-property-descriptors@1.0.2", "", { "dependencies": { "es-define-property": "^1.0.0" } }, "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg=="], "has-proto": ["has-proto@1.2.0", "", { "dependencies": { "dunder-proto": "^1.0.0" } }, "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ=="], @@ -919,6 +927,8 @@ "immer": ["immer@10.2.0", "", {}, "sha512-d/+XTN3zfODyjr89gM3mPq1WNX2B8pYsu7eORitdwyA2sBubnTl3laYlBk4sXY5FUa5qTZGBDPJICVbvqzjlbw=="], + "import-fresh": ["import-fresh@3.3.1", "", { "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" } }, "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ=="], + "imurmurhash": ["imurmurhash@0.1.4", "", {}, "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA=="], "inherits": ["inherits@2.0.4", "", {}, "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="], @@ -1035,6 +1045,8 @@ "lodash": ["lodash@4.17.23", "", {}, "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w=="], + "lodash.merge": ["lodash.merge@4.6.2", "", {}, "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ=="], + "log-update": ["log-update@8.0.0", "", { "dependencies": { "ansi-escapes": "^7.3.0", "cli-cursor": "^5.0.0", "slice-ansi": "^9.0.0", "string-width": "^8.2.0", "strip-ansi": "^7.2.0", "wrap-ansi": "^10.0.0" } }, "sha512-lddSgOt3bPASrylL54ZSpy8nBHns+vBVSoILlVOx+dei300pnLRN958rj/EdlVLKuWlSESU3qdnDZdAI7FXYGg=="], "longest-streak": ["longest-streak@3.1.0", "", {}, "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g=="], @@ -1237,6 +1249,8 @@ "pako": ["pako@1.0.11", "", {}, "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw=="], + "parent-module": ["parent-module@1.0.1", "", { "dependencies": { "callsites": "^3.0.0" } }, "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g=="], + "parse-bmfont-ascii": ["parse-bmfont-ascii@1.0.6", "", {}, "sha512-U4RrVsUFCleIOBsIGYOMKjn9PavsGOXxbvYGtMOEfnId0SVNsgehXh1DxUdVPLoxd5mvcEtvmKs2Mmf0Mpa1ZA=="], "parse-bmfont-binary": ["parse-bmfont-binary@1.0.6", "", {}, "sha512-GxmsRea0wdGdYthjuUeWTMWPqm2+FAd4GI8vCvhgJsFnoGhTrLhXDDupwTo7rXVAgaLIGoVHDZS9p/5XbSqeWA=="], @@ -1381,6 +1395,8 @@ "resolve": ["resolve@2.0.0-next.7", "", { "dependencies": { "es-errors": "^1.3.0", "is-core-module": "^2.16.2", "node-exports-info": "^1.6.0", "object-keys": "^1.1.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-tqt+NBWwyaMgw3zDsnygx4CByWjQEJHOPMdslYhppaQSJUtL/D4JO9CcBBlhPoI8lz9oJIDXkwXfhF4aWqP8xQ=="], + "resolve-from": ["resolve-from@4.0.0", "", {}, "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="], + "resolve-pkg-maps": ["resolve-pkg-maps@1.0.0", "", {}, "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw=="], "restore-cursor": ["restore-cursor@5.1.0", "", { "dependencies": { "onetime": "^7.0.0", "signal-exit": "^4.1.0" } }, "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA=="], @@ -1435,7 +1451,7 @@ "shell-quote": ["shell-quote@1.8.4", "", {}, "sha512-VsC6n6vz1ihYYyZZwX7YZSF5l5x36ca17OC+a69h94YqB7X6XLwf+5MOgynYir2SLFUbl8gIYvBo8K8RoNQ6bQ=="], - "side-channel": ["side-channel@1.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3", "side-channel-list": "^1.0.0", "side-channel-map": "^1.0.1", "side-channel-weakmap": "^1.0.2" } }, "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw=="], + "side-channel": ["side-channel@1.1.1", "", { "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.4", "side-channel-list": "^1.0.1", "side-channel-map": "^1.0.1", "side-channel-weakmap": "^1.0.2" } }, "sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ=="], "side-channel-list": ["side-channel-list@1.0.1", "", { "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.4" } }, "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w=="], @@ -1485,7 +1501,7 @@ "strip-final-newline": ["strip-final-newline@2.0.0", "", {}, "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA=="], - "strip-json-comments": ["strip-json-comments@2.0.1", "", {}, "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ=="], + "strip-json-comments": ["strip-json-comments@3.1.1", "", {}, "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig=="], "stripe": ["stripe@16.12.0", "", { "dependencies": { "@types/node": ">=8.1.0", "qs": "^6.11.0" } }, "sha512-H7eFVLDxeTNNSn4JTRfL2//LzCbDrMSZ+2q1c7CanVWgK2qIW5TwS+0V7N9KcKZZNpYh/uCqK0PyZh/2UsaAtQ=="], @@ -1493,6 +1509,8 @@ "styled-jsx": ["styled-jsx@5.1.6", "", { "dependencies": { "client-only": "0.0.1" }, "peerDependencies": { "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0" } }, "sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA=="], + "supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], + "supports-preserve-symlinks-flag": ["supports-preserve-symlinks-flag@1.0.0", "", {}, "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w=="], "supports-terminal-graphics": ["supports-terminal-graphics@0.1.0", "", {}, "sha512-+KdfozhS0Fw8y5Sghw8kkZNGT8nWYzJ1EzcoIvVjxhl+26TJTs26y02yfBgvc1jh5AS/c8jcI3xtahhR95KRyQ=="], @@ -1651,7 +1669,11 @@ "@codebuff/sdk/ignore": ["ignore@7.0.5", "", {}, "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg=="], - "@eslint/config-array/minimatch": ["minimatch@10.2.5", "", { "dependencies": { "brace-expansion": "^5.0.5" } }, "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg=="], + "@eslint/eslintrc/ajv": ["ajv@6.15.0", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw=="], + + "@eslint/eslintrc/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], + + "@eslint/eslintrc/js-yaml": ["js-yaml@4.2.0", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-ePWsvanv0DWuDRsW8dnt+R4jQ31SCRCQ7hhNcPXZPsoBZiemuZNYGf7adZdqX2D86j6rvKp3RpCxVTSb8WQlOw=="], "@opentui/core/diff": ["diff@9.0.0", "", {}, "sha512-svtcdpS8CgJyqAjEQIXdb3OjhFVVYjzGAPO8WGCmRbrml64SPw/jJD4GoE98aR7r25A0XcgrK3F02yw9R/vhQw=="], @@ -1687,11 +1709,11 @@ "eslint/ajv": ["ajv@6.15.0", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw=="], - "eslint/eslint-visitor-keys": ["eslint-visitor-keys@5.0.1", "", {}, "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA=="], + "eslint/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], - "eslint/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], + "eslint/eslint-visitor-keys": ["eslint-visitor-keys@4.2.1", "", {}, "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ=="], - "eslint/minimatch": ["minimatch@10.2.5", "", { "dependencies": { "brace-expansion": "^5.0.5" } }, "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg=="], + "eslint/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], "eslint-import-resolver-node/debug": ["debug@3.2.7", "", { "dependencies": { "ms": "^2.1.1" } }, "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ=="], @@ -1703,7 +1725,7 @@ "eslint-plugin-import/tsconfig-paths": ["tsconfig-paths@3.15.0", "", { "dependencies": { "@types/json5": "^0.0.29", "json5": "^1.0.2", "minimist": "^1.2.6", "strip-bom": "^3.0.0" } }, "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg=="], - "espree/eslint-visitor-keys": ["eslint-visitor-keys@5.0.1", "", {}, "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA=="], + "espree/eslint-visitor-keys": ["eslint-visitor-keys@4.2.1", "", {}, "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ=="], "execa/onetime": ["onetime@5.1.2", "", { "dependencies": { "mimic-fn": "^2.1.0" } }, "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg=="], @@ -1731,12 +1753,16 @@ "plist/xmlbuilder": ["xmlbuilder@15.1.1", "", {}, "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg=="], + "rc/strip-json-comments": ["strip-json-comments@2.0.1", "", {}, "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ=="], + "react-devtools-core/ws": ["ws@7.5.11", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": "^5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-zS54Oen9bITtp7kp2XM3AydrCIq1D+HwJOuH+c+e4LfpL/lotP5osijd+UoMnxwAam1GN8R4KtLAyIrIcBNpiA=="], "react-reconciler/scheduler": ["scheduler@0.26.0", "", {}, "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA=="], "send/mime-types": ["mime-types@3.0.2", "", { "dependencies": { "mime-db": "^1.54.0" } }, "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A=="], + "slice-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], + "tar-stream/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=="], "ts-node/diff": ["diff@4.0.4", "", {}, "sha512-X07nttJQkwkfKfvTPG/KSnE2OMdcUCao6+eXF3wmnIQRn2aPAHH3VxDbDOdegkd6JbPsXqShpvEOHfAT+nCNwQ=="], @@ -1751,6 +1777,8 @@ "typescript-eslint/@typescript-eslint/utils": ["@typescript-eslint/utils@7.18.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@typescript-eslint/scope-manager": "7.18.0", "@typescript-eslint/types": "7.18.0", "@typescript-eslint/typescript-estree": "7.18.0" }, "peerDependencies": { "eslint": "^8.56.0" } }, "sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw=="], + "wrap-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], + "wrap-ansi/string-width": ["string-width@8.2.1", "", { "dependencies": { "get-east-asian-width": "^1.5.0", "strip-ansi": "^7.1.2" } }, "sha512-IIaP0g3iy9Cyy18w3M9YcaDudujEAVHKt3a3QJg1+sr/oX96TbaGUubG0hJyCjCBThFH+tFpcIyoUHUn1ogaLA=="], "yargs/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], @@ -1759,7 +1787,9 @@ "@codebuff/evals/pino/process-warning": ["process-warning@5.0.0", "", {}, "sha512-a39t9ApHNx2L4+HBnQKqxxHNs1r7KF+Intd8Q/g1bUh6q0WIp9voPXJ/x0j+ZL45KF1pJd9+q2jLIRMfvEshkA=="], - "@eslint/config-array/minimatch/brace-expansion": ["brace-expansion@5.0.6", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g=="], + "@eslint/eslintrc/ajv/json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], + + "@eslint/eslintrc/js-yaml/argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="], "@typescript-eslint/parser/@typescript-eslint/typescript-estree/minimatch": ["minimatch@9.0.9", "", { "dependencies": { "brace-expansion": "^2.0.2" } }, "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg=="], @@ -1773,14 +1803,10 @@ "cliui/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], - "cliui/wrap-ansi/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], - "eslint-plugin-import/tsconfig-paths/json5": ["json5@1.0.2", "", { "dependencies": { "minimist": "^1.2.0" }, "bin": { "json5": "lib/cli.js" } }, "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA=="], "eslint/ajv/json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], - "eslint/minimatch/brace-expansion": ["brace-expansion@5.0.6", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g=="], - "express/mime-types/mime-db": ["mime-db@1.54.0", "", {}, "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ=="], "p-locate/p-limit/yocto-queue": ["yocto-queue@0.1.0", "", {}, "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="], @@ -1809,12 +1835,8 @@ "yargs/string-width/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], - "@eslint/config-array/minimatch/brace-expansion/balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="], - "@typescript-eslint/parser/@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.1.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-WR1cURNjuvBLMZBMbqM0UoE+WAfdUcEV1ccD8PVBVOI+Z3ND4+SZbN8RsfT2bMuG1qwz5RFvPukSZm5fF2D5eA=="], - "eslint/minimatch/brace-expansion/balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="], - "typescript-eslint/@typescript-eslint/eslint-plugin/@typescript-eslint/scope-manager/@typescript-eslint/types": ["@typescript-eslint/types@7.18.0", "", {}, "sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ=="], "typescript-eslint/@typescript-eslint/eslint-plugin/@typescript-eslint/type-utils/@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@7.18.0", "", { "dependencies": { "@typescript-eslint/types": "7.18.0", "@typescript-eslint/visitor-keys": "7.18.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", "minimatch": "^9.0.4", "semver": "^7.6.0", "ts-api-utils": "^1.3.0" } }, "sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA=="], From ee4f87aa19615f75925bb12ea632ea5b2524ade1 Mon Sep 17 00:00:00 2001 From: codebuff public sync bot <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 8 Jun 2026 21:24:09 +0000 Subject: [PATCH 27/96] Sync public snapshot from freebuff-private Source: CodebuffAI/freebuff-private@731dbee95e4d25a69d2ce092b2dc839329e5e802 --- .../tools/__tests__/gravity-index.test.ts | 12 +++---- cli/src/components/tools/gravity-index.tsx | 27 +++++++-------- cli/src/components/tools/render-ui.tsx | 33 +++++++++++-------- common/src/constants/freebuff-models.ts | 8 +++-- 4 files changed, 42 insertions(+), 38 deletions(-) diff --git a/cli/src/components/tools/__tests__/gravity-index.test.ts b/cli/src/components/tools/__tests__/gravity-index.test.ts index d2e5e95b01..21e6319ffc 100644 --- a/cli/src/components/tools/__tests__/gravity-index.test.ts +++ b/cli/src/components/tools/__tests__/gravity-index.test.ts @@ -10,7 +10,7 @@ describe('getGravityIndexParts', () => { query: 'transactional email for a Next.js app', }), ).toEqual({ - name: 'Services · Search', + name: 'Search services', description: 'transactional email for a Next.js app', }) }) @@ -23,7 +23,7 @@ describe('getGravityIndexParts', () => { q: 'send', }), ).toEqual({ - name: 'Services · Browse', + name: 'Browse services', description: 'Email · send', }) }) @@ -35,7 +35,7 @@ describe('getGravityIndexParts', () => { slug: 'sendgrid', }), ).toEqual({ - name: 'Services · Fetch', + name: 'Fetch service', description: 'sendgrid', }) }) @@ -47,18 +47,18 @@ describe('getGravityIndexParts', () => { integrated_slug: 'sendgrid', }), ).toEqual({ - name: 'Services · Report', + name: 'Report integration', description: 'sendgrid integration', }) }) test('names the action even when the target is missing', () => { expect(getGravityIndexParts({ action: 'search' })).toEqual({ - name: 'Services · Search', + name: 'Search services', description: '', }) expect(getGravityIndexParts({ action: 'list_categories' })).toEqual({ - name: 'Services · Categories', + name: 'List service categories', description: '', }) }) diff --git a/cli/src/components/tools/gravity-index.tsx b/cli/src/components/tools/gravity-index.tsx index b7ea37569b..3d0269eac1 100644 --- a/cli/src/components/tools/gravity-index.tsx +++ b/cli/src/components/tools/gravity-index.tsx @@ -6,26 +6,23 @@ import type { ToolRenderConfig } from './types' const asTrimmedString = (value: unknown): string => typeof value === 'string' ? value.trim() : '' -const BRAND = 'Services' - -/** Bold "Services · " prefix that names the action like a CLI subcommand. */ -const withSubcommand = (verb: string): string => `${BRAND} · ${verb}` +const DEFAULT_NAME = 'Services' export interface GravityIndexParts { - /** Bold label: the brand plus the action subcommand. */ + /** Bold label naming the action in plain verb-first language. */ name: string /** Non-bold target the action operates on (query, slug, category). May be empty. */ description: string } /** - * Splits a gravity_index tool call into a bold "Service Catalog · " label - * and the plain target it acts on, so the action reads as one bold unit instead - * of repeating the verb in non-bold text after the brand. + * Splits a gravity_index tool call into a bold verb-first label (e.g. + * "Search services") and the plain target it acts on, so the action reads as + * a single natural phrase instead of a "Brand · Verb" subcommand. */ export const getGravityIndexParts = (input: unknown): GravityIndexParts => { if (!input || typeof input !== 'object') { - return { name: BRAND, description: '' } + return { name: DEFAULT_NAME, description: '' } } const params = input as Record @@ -34,33 +31,33 @@ export const getGravityIndexParts = (input: unknown): GravityIndexParts => { switch (action) { case 'search': return { - name: withSubcommand('Search'), + name: 'Search services', description: asTrimmedString(params.query), } case 'browse': { const category = asTrimmedString(params.category) const keyword = asTrimmedString(params.q) return { - name: withSubcommand('Browse'), + name: 'Browse services', description: [category, keyword].filter(Boolean).join(' · '), } } case 'list_categories': - return { name: withSubcommand('Categories'), description: '' } + return { name: 'List service categories', description: '' } case 'get_service': return { - name: withSubcommand('Fetch'), + name: 'Fetch service', description: asTrimmedString(params.slug), } case 'report_integration': { const slug = asTrimmedString(params.integrated_slug) return { - name: withSubcommand('Report'), + name: 'Report integration', description: slug ? `${slug} integration` : 'integration', } } default: - return { name: BRAND, description: '' } + return { name: DEFAULT_NAME, description: '' } } } diff --git a/cli/src/components/tools/render-ui.tsx b/cli/src/components/tools/render-ui.tsx index 3fea341d74..5049889433 100644 --- a/cli/src/components/tools/render-ui.tsx +++ b/cli/src/components/tools/render-ui.tsx @@ -31,21 +31,21 @@ const isRenderUIButtonWidget = ( ) } +/** + * The button is an accent-colored outline with a matching label. It stays + * unfilled in every state — a fill would bleed past the rounded corners — so + * hover is signalled by underlining the label rather than inverting the fill. + */ const getButtonColors = ( theme: ReturnType, variant: RenderUIButtonVariant, - isHovered: boolean, ) => { - if (variant === 'secondary') { - return { - backgroundColor: isHovered ? theme.surfaceHover : theme.surface, - foregroundColor: theme.foreground, - } - } - + const accent = variant === 'secondary' ? theme.secondary : theme.primary return { - backgroundColor: theme.primary, - foregroundColor: theme.name === 'dark' ? '#111827' : '#ffffff', + // Unfilled: the interior shows the terminal background in every state. + backgroundColor: undefined, + foregroundColor: accent, + borderColor: accent, } } @@ -57,10 +57,9 @@ const RenderUIButton = ({ widget }: { widget: RenderUIButtonWidget }) => { const [isClicked, setIsClicked] = useState(false) const clickTimeoutRef = useRef | null>(null) const variant = widget.variant ?? 'primary' - const { backgroundColor, foregroundColor } = getButtonColors( + const { backgroundColor, foregroundColor, borderColor } = getButtonColors( theme, variant, - isHovered, ) useEffect(() => { @@ -83,11 +82,13 @@ const RenderUIButton = ({ widget }: { widget: RenderUIButtonWidget }) => { ) }, [widget.link]) + // Bold reads as a button label; underline on hover signals it's clickable; + // dim briefly on click to acknowledge the press. const textAttributes = isClicked ? TextAttributes.DIM : isHovered - ? TextAttributes.BOLD - : undefined + ? TextAttributes.BOLD | TextAttributes.UNDERLINE + : TextAttributes.BOLD return ( { onMouseOut={() => setIsHovered(false)} style={{ backgroundColor, + borderStyle: 'rounded', + borderColor, paddingLeft: 1, paddingRight: 1, }} @@ -110,6 +113,8 @@ const RenderUIButton = ({ widget }: { widget: RenderUIButtonWidget }) => { {widget.text} + {/* Trailing arrow signals the button opens an external link. */} + {' ↗'} diff --git a/common/src/constants/freebuff-models.ts b/common/src/constants/freebuff-models.ts index ce54d3a12b..57edcc9a28 100644 --- a/common/src/constants/freebuff-models.ts +++ b/common/src/constants/freebuff-models.ts @@ -119,7 +119,7 @@ const KIMI_MODEL = { tagline: 'Balanced', availability: 'always', premium: true, - multimodal: false, + multimodal: true, } as const satisfies FreebuffModelOption const MIMO_V25_MODEL = { @@ -153,10 +153,10 @@ const MINIMAX_MODEL = { const MINIMAX_M3_MODEL = { id: FREEBUFF_MINIMAX_M3_MODEL_ID, displayName: 'MiniMax M3', - tagline: 'Frontier', + tagline: 'Smartest & multimodal', availability: 'always', premium: true, - multimodal: false, + multimodal: true, } as const satisfies FreebuffModelOption export const SUPPORTED_FREEBUFF_MODELS = [ @@ -191,6 +191,8 @@ export const FREEBUFF_PREMIUM_MODEL_IDS = [ export const FREEBUFF_MULTIMODAL_MODEL_IDS = [ FREEBUFF_MIMO_V25_MODEL_ID, FREEBUFF_MIMO_V25_PRO_MODEL_ID, + FREEBUFF_MINIMAX_M3_MODEL_ID, + FREEBUFF_KIMI_MODEL_ID, ] as const export type FreebuffModelId = (typeof FREEBUFF_MODELS)[number]['id'] From f3e9d359cf211853281f7a5b0d123bf160fd75ef Mon Sep 17 00:00:00 2001 From: codebuff public sync bot <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 8 Jun 2026 21:35:13 +0000 Subject: [PATCH 28/96] Sync public snapshot from freebuff-private Source: CodebuffAI/freebuff-private@10e98f96ae9c08c6f82e9af36fe050d7eaa339c6 --- common/src/constants/freebuff-models.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/common/src/constants/freebuff-models.ts b/common/src/constants/freebuff-models.ts index 57edcc9a28..2a62e6f240 100644 --- a/common/src/constants/freebuff-models.ts +++ b/common/src/constants/freebuff-models.ts @@ -155,6 +155,7 @@ const MINIMAX_M3_MODEL = { displayName: 'MiniMax M3', tagline: 'Smartest & multimodal', availability: 'always', + warning: 'Collects data for training', premium: true, multimodal: true, } as const satisfies FreebuffModelOption @@ -171,9 +172,9 @@ export const SUPPORTED_FREEBUFF_MODELS = [ export const FREEBUFF_MODELS = [ DEEPSEEK_V4_PRO_MODEL, + MINIMAX_M3_MODEL, ...(FREEBUFF_ENABLE_MIMO_MODELS_IN_UI ? [MIMO_V25_PRO_MODEL] : []), KIMI_MODEL, - MINIMAX_M3_MODEL, DEEPSEEK_V4_FLASH_MODEL, ...(FREEBUFF_ENABLE_MIMO_MODELS_IN_UI ? [MIMO_V25_MODEL] : []), MINIMAX_MODEL, From 9308ba919ce64c9d48c34cd8bb74406d4e9efc0e Mon Sep 17 00:00:00 2001 From: codebuff public sync bot <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 8 Jun 2026 22:03:25 +0000 Subject: [PATCH 29/96] Sync public snapshot from freebuff-private Source: CodebuffAI/freebuff-private@68a97d66c654d5144c69050613bd25cdd4e7ed94 --- bun.lock | 74 +++++++------------ .../freebuff-active-session-summary.tsx | 8 +- cli/src/components/waiting-room-screen.tsx | 2 +- 3 files changed, 33 insertions(+), 51 deletions(-) diff --git a/bun.lock b/bun.lock index 45f4873a12..7c9901c134 100644 --- a/bun.lock +++ b/bun.lock @@ -239,19 +239,15 @@ "@eslint-community/regexpp": ["@eslint-community/regexpp@4.12.2", "", {}, "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew=="], - "@eslint/config-array": ["@eslint/config-array@0.21.2", "", { "dependencies": { "@eslint/object-schema": "^2.1.7", "debug": "^4.3.1", "minimatch": "^3.1.5" } }, "sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw=="], + "@eslint/config-array": ["@eslint/config-array@0.23.5", "", { "dependencies": { "@eslint/object-schema": "^3.0.5", "debug": "^4.3.1", "minimatch": "^10.2.4" } }, "sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA=="], - "@eslint/config-helpers": ["@eslint/config-helpers@0.4.2", "", { "dependencies": { "@eslint/core": "^0.17.0" } }, "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw=="], + "@eslint/config-helpers": ["@eslint/config-helpers@0.6.0", "", { "dependencies": { "@eslint/core": "^1.2.1" } }, "sha512-ii6Bw9jJ2zi2cWA2Z+9/QZ/+3DX6kwaV5Q986D/CdP3Lap3w/pgQZ373FV7byY/i7L4IRH/G43I5dz1ClsCbpA=="], - "@eslint/core": ["@eslint/core@0.17.0", "", { "dependencies": { "@types/json-schema": "^7.0.15" } }, "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ=="], + "@eslint/core": ["@eslint/core@1.2.1", "", { "dependencies": { "@types/json-schema": "^7.0.15" } }, "sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ=="], - "@eslint/eslintrc": ["@eslint/eslintrc@3.3.5", "", { "dependencies": { "ajv": "^6.14.0", "debug": "^4.3.2", "espree": "^10.0.1", "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.1", "minimatch": "^3.1.5", "strip-json-comments": "^3.1.1" } }, "sha512-4IlJx0X0qftVsN5E+/vGujTRIFtwuLbNsVUe7TO6zYPDR1O6nFwvwhIKEKSrl6dZchmYBITazxKoUYOjdtjlRg=="], + "@eslint/object-schema": ["@eslint/object-schema@3.0.5", "", {}, "sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw=="], - "@eslint/js": ["@eslint/js@9.39.4", "", {}, "sha512-nE7DEIchvtiFTwBw4Lfbu59PG+kCofhjsKaCWzxTpt4lfRjRMqG6uMBzKXuEcyXhOHoUp9riAm7/aWYGhXZ9cw=="], - - "@eslint/object-schema": ["@eslint/object-schema@2.1.7", "", {}, "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA=="], - - "@eslint/plugin-kit": ["@eslint/plugin-kit@0.4.1", "", { "dependencies": { "@eslint/core": "^0.17.0", "levn": "^0.4.1" } }, "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA=="], + "@eslint/plugin-kit": ["@eslint/plugin-kit@0.7.2", "", { "dependencies": { "@eslint/core": "^1.2.1", "levn": "^0.4.1" } }, "sha512-+CNAzxglkrpNf/kKywqQfk74QjtceuOE7Qm+AF8miRvPF/wmmK5+OJOgVh3AVTT3RP2mH3+FOaxlE5v72owk0A=="], "@gravity-ai/api": ["@gravity-ai/api@0.1.2", "", { "dependencies": { "axios": "^1.13.2" } }, "sha512-txsAhyzvwB/TNrj5R8DoNqw8afM3JY2ahl7aaeaD5ZsxP+7rxff7C7keGI7+gU2KT3d2Mcw4QB1nHhbTSCJYHw=="], @@ -467,6 +463,8 @@ "@types/diff": ["@types/diff@8.0.0", "", { "dependencies": { "diff": "*" } }, "sha512-o7jqJM04gfaYrdCecCVMbZhNdG6T1MHg/oQoRFdERLV+4d+V7FijhiEAbFu0Usww84Yijk9yH58U4Jk4HbtzZw=="], + "@types/esrecurse": ["@types/esrecurse@4.3.1", "", {}, "sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw=="], + "@types/estree": ["@types/estree@1.0.9", "", {}, "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg=="], "@types/js-yaml": ["@types/js-yaml@4.0.9", "", {}, "sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg=="], @@ -549,7 +547,7 @@ "ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="], - "ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + "ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], "any-base": ["any-base@1.1.0", "", {}, "sha512-uMgjozySS8adZZYePpaWs8cxB9/kdzmpX6SgJZ+wbz1K5eYk5QMYDVJaZKhxyIHUdnnJkfR7SVgStgH7LkGUyg=="], @@ -625,8 +623,6 @@ "call-bound": ["call-bound@1.0.4", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "get-intrinsic": "^1.3.0" } }, "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg=="], - "callsites": ["callsites@3.1.0", "", {}, "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="], - "caniuse-lite": ["caniuse-lite@1.0.30001797", "", {}, "sha512-l8xKG+gwAIExZGl9FrF7KUwuOmk6wbEPC9Xoy/RtnWv1XG0Q4LFlagaLpUv3Kiza3W/wm27zy0yWJEieYKAP6w=="], "canvas": ["canvas@3.2.3", "", { "dependencies": { "node-addon-api": "^7.0.0", "prebuild-install": "^7.1.3" } }, "sha512-PzE5nJZPz72YUAfo8oTp0u3fqqY7IzlTubneAihqDYAUcBk7ryeCmBbdJBEdaH0bptSOe2VT2Zwcb3UaFyaSWw=="], @@ -751,7 +747,7 @@ "escape-string-regexp": ["escape-string-regexp@4.0.0", "", {}, "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="], - "eslint": ["eslint@9.39.4", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", "@eslint/config-array": "^0.21.2", "@eslint/config-helpers": "^0.4.2", "@eslint/core": "^0.17.0", "@eslint/eslintrc": "^3.3.5", "@eslint/js": "9.39.4", "@eslint/plugin-kit": "^0.4.1", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "ajv": "^6.14.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^8.4.0", "eslint-visitor-keys": "^4.2.1", "espree": "^10.4.0", "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.5", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, "peerDependencies": { "jiti": "*" }, "optionalPeers": ["jiti"], "bin": { "eslint": "bin/eslint.js" } }, "sha512-XoMjdBOwe/esVgEvLmNsD3IRHkm7fbKIUGvrleloJXUZgDHig2IPWNniv+GwjyJXzuNqVjlr5+4yVUZjycJwfQ=="], + "eslint": ["eslint@10.4.1", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.2", "@eslint/config-array": "^0.23.5", "@eslint/config-helpers": "^0.6.0", "@eslint/core": "^1.2.1", "@eslint/plugin-kit": "^0.7.2", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "ajv": "^6.14.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^9.1.2", "eslint-visitor-keys": "^5.0.1", "espree": "^11.2.0", "esquery": "^1.7.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "minimatch": "^10.2.4", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, "peerDependencies": { "jiti": "*" }, "optionalPeers": ["jiti"], "bin": { "eslint": "bin/eslint.js" } }, "sha512-AyIKhnOBuOAdueD7RB3xB+YeAWScb9jHsJBgH2Hcde8InP5JYhqrRR6iTMHyTEwgENK54Cp44e4v8BwNhsuHuw=="], "eslint-config-prettier": ["eslint-config-prettier@9.1.2", "", { "peerDependencies": { "eslint": ">=7.0.0" }, "bin": { "eslint-config-prettier": "bin/cli.js" } }, "sha512-iI1f+D2ViGn+uvv5HuHVUamg8ll4tN+JRHGc6IJi4TP9Kl976C57fzPXgseXNs8v0iA8aSJpHsTWjDb9QJamGQ=="], @@ -763,11 +759,11 @@ "eslint-plugin-unused-imports": ["eslint-plugin-unused-imports@4.4.1", "", { "peerDependencies": { "@typescript-eslint/eslint-plugin": "^8.0.0-0 || ^7.0.0 || ^6.0.0 || ^5.0.0", "eslint": "^10.0.0 || ^9.0.0 || ^8.0.0" }, "optionalPeers": ["@typescript-eslint/eslint-plugin"] }, "sha512-oZGYUz1X3sRMGUB+0cZyK2VcvRX5lm/vB56PgNNcU+7ficUCKm66oZWKUubXWnOuPjQ8PvmXtCViXBMONPe7tQ=="], - "eslint-scope": ["eslint-scope@8.4.0", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg=="], + "eslint-scope": ["eslint-scope@9.1.2", "", { "dependencies": { "@types/esrecurse": "^4.3.1", "@types/estree": "^1.0.8", "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ=="], "eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="], - "espree": ["espree@10.4.0", "", { "dependencies": { "acorn": "^8.15.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^4.2.1" } }, "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ=="], + "espree": ["espree@11.2.0", "", { "dependencies": { "acorn": "^8.16.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^5.0.1" } }, "sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw=="], "esprima": ["esprima@4.0.1", "", { "bin": { "esparse": "./bin/esparse.js", "esvalidate": "./bin/esvalidate.js" } }, "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="], @@ -879,8 +875,6 @@ "glob-parent": ["glob-parent@6.0.2", "", { "dependencies": { "is-glob": "^4.0.3" } }, "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A=="], - "globals": ["globals@14.0.0", "", {}, "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ=="], - "globalthis": ["globalthis@1.0.4", "", { "dependencies": { "define-properties": "^1.2.1", "gopd": "^1.0.1" } }, "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ=="], "globby": ["globby@11.1.0", "", { "dependencies": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", "fast-glob": "^3.2.9", "ignore": "^5.2.0", "merge2": "^1.4.1", "slash": "^3.0.0" } }, "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g=="], @@ -895,8 +889,6 @@ "has-bigints": ["has-bigints@1.1.0", "", {}, "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg=="], - "has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], - "has-property-descriptors": ["has-property-descriptors@1.0.2", "", { "dependencies": { "es-define-property": "^1.0.0" } }, "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg=="], "has-proto": ["has-proto@1.2.0", "", { "dependencies": { "dunder-proto": "^1.0.0" } }, "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ=="], @@ -927,8 +919,6 @@ "immer": ["immer@10.2.0", "", {}, "sha512-d/+XTN3zfODyjr89gM3mPq1WNX2B8pYsu7eORitdwyA2sBubnTl3laYlBk4sXY5FUa5qTZGBDPJICVbvqzjlbw=="], - "import-fresh": ["import-fresh@3.3.1", "", { "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" } }, "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ=="], - "imurmurhash": ["imurmurhash@0.1.4", "", {}, "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA=="], "inherits": ["inherits@2.0.4", "", {}, "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="], @@ -1045,8 +1035,6 @@ "lodash": ["lodash@4.17.23", "", {}, "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w=="], - "lodash.merge": ["lodash.merge@4.6.2", "", {}, "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ=="], - "log-update": ["log-update@8.0.0", "", { "dependencies": { "ansi-escapes": "^7.3.0", "cli-cursor": "^5.0.0", "slice-ansi": "^9.0.0", "string-width": "^8.2.0", "strip-ansi": "^7.2.0", "wrap-ansi": "^10.0.0" } }, "sha512-lddSgOt3bPASrylL54ZSpy8nBHns+vBVSoILlVOx+dei300pnLRN958rj/EdlVLKuWlSESU3qdnDZdAI7FXYGg=="], "longest-streak": ["longest-streak@3.1.0", "", {}, "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g=="], @@ -1249,8 +1237,6 @@ "pako": ["pako@1.0.11", "", {}, "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw=="], - "parent-module": ["parent-module@1.0.1", "", { "dependencies": { "callsites": "^3.0.0" } }, "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g=="], - "parse-bmfont-ascii": ["parse-bmfont-ascii@1.0.6", "", {}, "sha512-U4RrVsUFCleIOBsIGYOMKjn9PavsGOXxbvYGtMOEfnId0SVNsgehXh1DxUdVPLoxd5mvcEtvmKs2Mmf0Mpa1ZA=="], "parse-bmfont-binary": ["parse-bmfont-binary@1.0.6", "", {}, "sha512-GxmsRea0wdGdYthjuUeWTMWPqm2+FAd4GI8vCvhgJsFnoGhTrLhXDDupwTo7rXVAgaLIGoVHDZS9p/5XbSqeWA=="], @@ -1395,8 +1381,6 @@ "resolve": ["resolve@2.0.0-next.7", "", { "dependencies": { "es-errors": "^1.3.0", "is-core-module": "^2.16.2", "node-exports-info": "^1.6.0", "object-keys": "^1.1.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-tqt+NBWwyaMgw3zDsnygx4CByWjQEJHOPMdslYhppaQSJUtL/D4JO9CcBBlhPoI8lz9oJIDXkwXfhF4aWqP8xQ=="], - "resolve-from": ["resolve-from@4.0.0", "", {}, "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="], - "resolve-pkg-maps": ["resolve-pkg-maps@1.0.0", "", {}, "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw=="], "restore-cursor": ["restore-cursor@5.1.0", "", { "dependencies": { "onetime": "^7.0.0", "signal-exit": "^4.1.0" } }, "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA=="], @@ -1501,7 +1485,7 @@ "strip-final-newline": ["strip-final-newline@2.0.0", "", {}, "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA=="], - "strip-json-comments": ["strip-json-comments@3.1.1", "", {}, "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig=="], + "strip-json-comments": ["strip-json-comments@2.0.1", "", {}, "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ=="], "stripe": ["stripe@16.12.0", "", { "dependencies": { "@types/node": ">=8.1.0", "qs": "^6.11.0" } }, "sha512-H7eFVLDxeTNNSn4JTRfL2//LzCbDrMSZ+2q1c7CanVWgK2qIW5TwS+0V7N9KcKZZNpYh/uCqK0PyZh/2UsaAtQ=="], @@ -1509,8 +1493,6 @@ "styled-jsx": ["styled-jsx@5.1.6", "", { "dependencies": { "client-only": "0.0.1" }, "peerDependencies": { "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0" } }, "sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA=="], - "supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], - "supports-preserve-symlinks-flag": ["supports-preserve-symlinks-flag@1.0.0", "", {}, "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w=="], "supports-terminal-graphics": ["supports-terminal-graphics@0.1.0", "", {}, "sha512-+KdfozhS0Fw8y5Sghw8kkZNGT8nWYzJ1EzcoIvVjxhl+26TJTs26y02yfBgvc1jh5AS/c8jcI3xtahhR95KRyQ=="], @@ -1669,11 +1651,7 @@ "@codebuff/sdk/ignore": ["ignore@7.0.5", "", {}, "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg=="], - "@eslint/eslintrc/ajv": ["ajv@6.15.0", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw=="], - - "@eslint/eslintrc/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], - - "@eslint/eslintrc/js-yaml": ["js-yaml@4.2.0", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-ePWsvanv0DWuDRsW8dnt+R4jQ31SCRCQ7hhNcPXZPsoBZiemuZNYGf7adZdqX2D86j6rvKp3RpCxVTSb8WQlOw=="], + "@eslint/config-array/minimatch": ["minimatch@10.2.5", "", { "dependencies": { "brace-expansion": "^5.0.5" } }, "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg=="], "@opentui/core/diff": ["diff@9.0.0", "", {}, "sha512-svtcdpS8CgJyqAjEQIXdb3OjhFVVYjzGAPO8WGCmRbrml64SPw/jJD4GoE98aR7r25A0XcgrK3F02yw9R/vhQw=="], @@ -1709,12 +1687,12 @@ "eslint/ajv": ["ajv@6.15.0", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw=="], - "eslint/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], - - "eslint/eslint-visitor-keys": ["eslint-visitor-keys@4.2.1", "", {}, "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ=="], + "eslint/eslint-visitor-keys": ["eslint-visitor-keys@5.0.1", "", {}, "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA=="], "eslint/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], + "eslint/minimatch": ["minimatch@10.2.5", "", { "dependencies": { "brace-expansion": "^5.0.5" } }, "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg=="], + "eslint-import-resolver-node/debug": ["debug@3.2.7", "", { "dependencies": { "ms": "^2.1.1" } }, "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ=="], "eslint-module-utils/debug": ["debug@3.2.7", "", { "dependencies": { "ms": "^2.1.1" } }, "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ=="], @@ -1725,7 +1703,7 @@ "eslint-plugin-import/tsconfig-paths": ["tsconfig-paths@3.15.0", "", { "dependencies": { "@types/json5": "^0.0.29", "json5": "^1.0.2", "minimist": "^1.2.6", "strip-bom": "^3.0.0" } }, "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg=="], - "espree/eslint-visitor-keys": ["eslint-visitor-keys@4.2.1", "", {}, "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ=="], + "espree/eslint-visitor-keys": ["eslint-visitor-keys@5.0.1", "", {}, "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA=="], "execa/onetime": ["onetime@5.1.2", "", { "dependencies": { "mimic-fn": "^2.1.0" } }, "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg=="], @@ -1753,16 +1731,12 @@ "plist/xmlbuilder": ["xmlbuilder@15.1.1", "", {}, "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg=="], - "rc/strip-json-comments": ["strip-json-comments@2.0.1", "", {}, "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ=="], - "react-devtools-core/ws": ["ws@7.5.11", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": "^5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-zS54Oen9bITtp7kp2XM3AydrCIq1D+HwJOuH+c+e4LfpL/lotP5osijd+UoMnxwAam1GN8R4KtLAyIrIcBNpiA=="], "react-reconciler/scheduler": ["scheduler@0.26.0", "", {}, "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA=="], "send/mime-types": ["mime-types@3.0.2", "", { "dependencies": { "mime-db": "^1.54.0" } }, "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A=="], - "slice-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], - "tar-stream/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=="], "ts-node/diff": ["diff@4.0.4", "", {}, "sha512-X07nttJQkwkfKfvTPG/KSnE2OMdcUCao6+eXF3wmnIQRn2aPAHH3VxDbDOdegkd6JbPsXqShpvEOHfAT+nCNwQ=="], @@ -1777,8 +1751,6 @@ "typescript-eslint/@typescript-eslint/utils": ["@typescript-eslint/utils@7.18.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@typescript-eslint/scope-manager": "7.18.0", "@typescript-eslint/types": "7.18.0", "@typescript-eslint/typescript-estree": "7.18.0" }, "peerDependencies": { "eslint": "^8.56.0" } }, "sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw=="], - "wrap-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], - "wrap-ansi/string-width": ["string-width@8.2.1", "", { "dependencies": { "get-east-asian-width": "^1.5.0", "strip-ansi": "^7.1.2" } }, "sha512-IIaP0g3iy9Cyy18w3M9YcaDudujEAVHKt3a3QJg1+sr/oX96TbaGUubG0hJyCjCBThFH+tFpcIyoUHUn1ogaLA=="], "yargs/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], @@ -1787,9 +1759,7 @@ "@codebuff/evals/pino/process-warning": ["process-warning@5.0.0", "", {}, "sha512-a39t9ApHNx2L4+HBnQKqxxHNs1r7KF+Intd8Q/g1bUh6q0WIp9voPXJ/x0j+ZL45KF1pJd9+q2jLIRMfvEshkA=="], - "@eslint/eslintrc/ajv/json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], - - "@eslint/eslintrc/js-yaml/argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="], + "@eslint/config-array/minimatch/brace-expansion": ["brace-expansion@5.0.6", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g=="], "@typescript-eslint/parser/@typescript-eslint/typescript-estree/minimatch": ["minimatch@9.0.9", "", { "dependencies": { "brace-expansion": "^2.0.2" } }, "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg=="], @@ -1803,10 +1773,14 @@ "cliui/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], + "cliui/wrap-ansi/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + "eslint-plugin-import/tsconfig-paths/json5": ["json5@1.0.2", "", { "dependencies": { "minimist": "^1.2.0" }, "bin": { "json5": "lib/cli.js" } }, "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA=="], "eslint/ajv/json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], + "eslint/minimatch/brace-expansion": ["brace-expansion@5.0.6", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g=="], + "express/mime-types/mime-db": ["mime-db@1.54.0", "", {}, "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ=="], "p-locate/p-limit/yocto-queue": ["yocto-queue@0.1.0", "", {}, "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="], @@ -1835,8 +1809,12 @@ "yargs/string-width/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + "@eslint/config-array/minimatch/brace-expansion/balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="], + "@typescript-eslint/parser/@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.1.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-WR1cURNjuvBLMZBMbqM0UoE+WAfdUcEV1ccD8PVBVOI+Z3ND4+SZbN8RsfT2bMuG1qwz5RFvPukSZm5fF2D5eA=="], + "eslint/minimatch/brace-expansion/balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="], + "typescript-eslint/@typescript-eslint/eslint-plugin/@typescript-eslint/scope-manager/@typescript-eslint/types": ["@typescript-eslint/types@7.18.0", "", {}, "sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ=="], "typescript-eslint/@typescript-eslint/eslint-plugin/@typescript-eslint/type-utils/@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@7.18.0", "", { "dependencies": { "@typescript-eslint/types": "7.18.0", "@typescript-eslint/visitor-keys": "7.18.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", "minimatch": "^9.0.4", "semver": "^7.6.0", "ts-api-utils": "^1.3.0" } }, "sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA=="], diff --git a/cli/src/components/freebuff-active-session-summary.tsx b/cli/src/components/freebuff-active-session-summary.tsx index f22be89fb5..8030810fc1 100644 --- a/cli/src/components/freebuff-active-session-summary.tsx +++ b/cli/src/components/freebuff-active-session-summary.tsx @@ -36,6 +36,10 @@ export const FreebuffActiveSessionSummary: React.FC< 'accessTier' in session && session.accessTier === 'limited' ? 'sessions' : 'premium sessions' + // recentCount already includes the active session's 1.0-unit reservation + // (written as an admit row at promotion), so it reflects everything counted + // against the quota — spent plus in-flight. Show what's left to start. + const remaining = Math.max(0, quota.limit - quota.recentCount) return ( - {formatSessionUnits(quota.recentCount)} of {quota.limit} + {formatSessionUnits(remaining)} of {quota.limit} {' '} - {label} used today · resets in {resetCountdown} + {label} left · resets in {resetCountdown} diff --git a/cli/src/components/waiting-room-screen.tsx b/cli/src/components/waiting-room-screen.tsx index 51cd34c9ad..c87fc62fb6 100644 --- a/cli/src/components/waiting-room-screen.tsx +++ b/cli/src/components/waiting-room-screen.tsx @@ -389,7 +389,7 @@ export const WaitingRoomScreen: React.FC = ({ accessTier === 'limited' ? FREEBUFF_LIMITED_SESSION_LIMIT : FREEBUFF_PREMIUM_SESSION_LIMIT - const sessionLabel = 'sessions' + const sessionLabel = 'premium sessions' const formattedSharedSessionUsed = formatSessionUnits(sharedSessionUsed) const sessionResetAt = getFreebuffPremiumResetAt({ rateLimitsByModel, From ca9eaca49cd004bb00e5134f101f12d6716c0a4f Mon Sep 17 00:00:00 2001 From: codebuff public sync bot <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 8 Jun 2026 23:19:07 +0000 Subject: [PATCH 30/96] Sync public snapshot from freebuff-private Source: CodebuffAI/freebuff-private@a6d7144e40b3b2c3e3075b4a241196f461002785 --- bun.lock | 80 ++++++++++++------- .../freebuff-active-session-summary.tsx | 9 +-- freebuff/cli/release/package.json | 2 +- 3 files changed, 56 insertions(+), 35 deletions(-) diff --git a/bun.lock b/bun.lock index 7c9901c134..ef683beaf4 100644 --- a/bun.lock +++ b/bun.lock @@ -239,15 +239,19 @@ "@eslint-community/regexpp": ["@eslint-community/regexpp@4.12.2", "", {}, "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew=="], - "@eslint/config-array": ["@eslint/config-array@0.23.5", "", { "dependencies": { "@eslint/object-schema": "^3.0.5", "debug": "^4.3.1", "minimatch": "^10.2.4" } }, "sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA=="], + "@eslint/config-array": ["@eslint/config-array@0.21.2", "", { "dependencies": { "@eslint/object-schema": "^2.1.7", "debug": "^4.3.1", "minimatch": "^3.1.5" } }, "sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw=="], - "@eslint/config-helpers": ["@eslint/config-helpers@0.6.0", "", { "dependencies": { "@eslint/core": "^1.2.1" } }, "sha512-ii6Bw9jJ2zi2cWA2Z+9/QZ/+3DX6kwaV5Q986D/CdP3Lap3w/pgQZ373FV7byY/i7L4IRH/G43I5dz1ClsCbpA=="], + "@eslint/config-helpers": ["@eslint/config-helpers@0.4.2", "", { "dependencies": { "@eslint/core": "^0.17.0" } }, "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw=="], - "@eslint/core": ["@eslint/core@1.2.1", "", { "dependencies": { "@types/json-schema": "^7.0.15" } }, "sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ=="], + "@eslint/core": ["@eslint/core@0.17.0", "", { "dependencies": { "@types/json-schema": "^7.0.15" } }, "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ=="], - "@eslint/object-schema": ["@eslint/object-schema@3.0.5", "", {}, "sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw=="], + "@eslint/eslintrc": ["@eslint/eslintrc@3.3.5", "", { "dependencies": { "ajv": "^6.14.0", "debug": "^4.3.2", "espree": "^10.0.1", "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.1", "minimatch": "^3.1.5", "strip-json-comments": "^3.1.1" } }, "sha512-4IlJx0X0qftVsN5E+/vGujTRIFtwuLbNsVUe7TO6zYPDR1O6nFwvwhIKEKSrl6dZchmYBITazxKoUYOjdtjlRg=="], - "@eslint/plugin-kit": ["@eslint/plugin-kit@0.7.2", "", { "dependencies": { "@eslint/core": "^1.2.1", "levn": "^0.4.1" } }, "sha512-+CNAzxglkrpNf/kKywqQfk74QjtceuOE7Qm+AF8miRvPF/wmmK5+OJOgVh3AVTT3RP2mH3+FOaxlE5v72owk0A=="], + "@eslint/js": ["@eslint/js@9.39.4", "", {}, "sha512-nE7DEIchvtiFTwBw4Lfbu59PG+kCofhjsKaCWzxTpt4lfRjRMqG6uMBzKXuEcyXhOHoUp9riAm7/aWYGhXZ9cw=="], + + "@eslint/object-schema": ["@eslint/object-schema@2.1.7", "", {}, "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA=="], + + "@eslint/plugin-kit": ["@eslint/plugin-kit@0.4.1", "", { "dependencies": { "@eslint/core": "^0.17.0", "levn": "^0.4.1" } }, "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA=="], "@gravity-ai/api": ["@gravity-ai/api@0.1.2", "", { "dependencies": { "axios": "^1.13.2" } }, "sha512-txsAhyzvwB/TNrj5R8DoNqw8afM3JY2ahl7aaeaD5ZsxP+7rxff7C7keGI7+gU2KT3d2Mcw4QB1nHhbTSCJYHw=="], @@ -427,9 +431,9 @@ "@pinojs/redact": ["@pinojs/redact@0.4.0", "", {}, "sha512-k2ENnmBugE/rzQfEcdWHcCY+/FM3VLzH9cYEsbdsoqrvzAKRhUZeRNhAZvB8OitQJ1TBed3yqWtdjzS6wJKBwg=="], - "@posthog/core": ["@posthog/core@1.30.11", "", { "dependencies": { "@posthog/types": "1.383.0" } }, "sha512-B4RB0d9cnaZlZ5ewEUh18HMO45tz6TkUPYTZA+8bTyszoIwNBkKSoJcBb2eF4ldcu37eXagkewVg2vWJ3+qTqQ=="], + "@posthog/core": ["@posthog/core@1.30.12", "", { "dependencies": { "@posthog/types": "1.383.1" } }, "sha512-XKkiK5H8ww3RHmL+TzHHnWCdcmZzfTy5RuiIs8yx9ABzG5Gdn+FgK/cH9XSvh5xU6Avkk1b6zLG/hZfF2nZAyQ=="], - "@posthog/types": ["@posthog/types@1.383.0", "", {}, "sha512-/x7Rf52IajI6DWTXN7wcoUDWK2JvqCVgusbnyfbMtfwVJnEQHCxu3DC9XEMoScpWp9Pgq1XgF0L97uwwn724mA=="], + "@posthog/types": ["@posthog/types@1.383.1", "", {}, "sha512-1gdoBJLAbj9MjPnFV+WH+KWOktJIiWNvg8KO68cX3nbXlCCMx6p+d0e6ORmHshe1++UoRRIbSjfJE2aBOUVpRQ=="], "@rtsao/scc": ["@rtsao/scc@1.1.0", "", {}, "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g=="], @@ -463,8 +467,6 @@ "@types/diff": ["@types/diff@8.0.0", "", { "dependencies": { "diff": "*" } }, "sha512-o7jqJM04gfaYrdCecCVMbZhNdG6T1MHg/oQoRFdERLV+4d+V7FijhiEAbFu0Usww84Yijk9yH58U4Jk4HbtzZw=="], - "@types/esrecurse": ["@types/esrecurse@4.3.1", "", {}, "sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw=="], - "@types/estree": ["@types/estree@1.0.9", "", {}, "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg=="], "@types/js-yaml": ["@types/js-yaml@4.0.9", "", {}, "sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg=="], @@ -547,7 +549,7 @@ "ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="], - "ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], + "ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], "any-base": ["any-base@1.1.0", "", {}, "sha512-uMgjozySS8adZZYePpaWs8cxB9/kdzmpX6SgJZ+wbz1K5eYk5QMYDVJaZKhxyIHUdnnJkfR7SVgStgH7LkGUyg=="], @@ -623,6 +625,8 @@ "call-bound": ["call-bound@1.0.4", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "get-intrinsic": "^1.3.0" } }, "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg=="], + "callsites": ["callsites@3.1.0", "", {}, "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="], + "caniuse-lite": ["caniuse-lite@1.0.30001797", "", {}, "sha512-l8xKG+gwAIExZGl9FrF7KUwuOmk6wbEPC9Xoy/RtnWv1XG0Q4LFlagaLpUv3Kiza3W/wm27zy0yWJEieYKAP6w=="], "canvas": ["canvas@3.2.3", "", { "dependencies": { "node-addon-api": "^7.0.0", "prebuild-install": "^7.1.3" } }, "sha512-PzE5nJZPz72YUAfo8oTp0u3fqqY7IzlTubneAihqDYAUcBk7ryeCmBbdJBEdaH0bptSOe2VT2Zwcb3UaFyaSWw=="], @@ -747,7 +751,7 @@ "escape-string-regexp": ["escape-string-regexp@4.0.0", "", {}, "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="], - "eslint": ["eslint@10.4.1", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.2", "@eslint/config-array": "^0.23.5", "@eslint/config-helpers": "^0.6.0", "@eslint/core": "^1.2.1", "@eslint/plugin-kit": "^0.7.2", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "ajv": "^6.14.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^9.1.2", "eslint-visitor-keys": "^5.0.1", "espree": "^11.2.0", "esquery": "^1.7.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "minimatch": "^10.2.4", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, "peerDependencies": { "jiti": "*" }, "optionalPeers": ["jiti"], "bin": { "eslint": "bin/eslint.js" } }, "sha512-AyIKhnOBuOAdueD7RB3xB+YeAWScb9jHsJBgH2Hcde8InP5JYhqrRR6iTMHyTEwgENK54Cp44e4v8BwNhsuHuw=="], + "eslint": ["eslint@9.39.4", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", "@eslint/config-array": "^0.21.2", "@eslint/config-helpers": "^0.4.2", "@eslint/core": "^0.17.0", "@eslint/eslintrc": "^3.3.5", "@eslint/js": "9.39.4", "@eslint/plugin-kit": "^0.4.1", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "ajv": "^6.14.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^8.4.0", "eslint-visitor-keys": "^4.2.1", "espree": "^10.4.0", "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.5", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, "peerDependencies": { "jiti": "*" }, "optionalPeers": ["jiti"], "bin": { "eslint": "bin/eslint.js" } }, "sha512-XoMjdBOwe/esVgEvLmNsD3IRHkm7fbKIUGvrleloJXUZgDHig2IPWNniv+GwjyJXzuNqVjlr5+4yVUZjycJwfQ=="], "eslint-config-prettier": ["eslint-config-prettier@9.1.2", "", { "peerDependencies": { "eslint": ">=7.0.0" }, "bin": { "eslint-config-prettier": "bin/cli.js" } }, "sha512-iI1f+D2ViGn+uvv5HuHVUamg8ll4tN+JRHGc6IJi4TP9Kl976C57fzPXgseXNs8v0iA8aSJpHsTWjDb9QJamGQ=="], @@ -759,11 +763,11 @@ "eslint-plugin-unused-imports": ["eslint-plugin-unused-imports@4.4.1", "", { "peerDependencies": { "@typescript-eslint/eslint-plugin": "^8.0.0-0 || ^7.0.0 || ^6.0.0 || ^5.0.0", "eslint": "^10.0.0 || ^9.0.0 || ^8.0.0" }, "optionalPeers": ["@typescript-eslint/eslint-plugin"] }, "sha512-oZGYUz1X3sRMGUB+0cZyK2VcvRX5lm/vB56PgNNcU+7ficUCKm66oZWKUubXWnOuPjQ8PvmXtCViXBMONPe7tQ=="], - "eslint-scope": ["eslint-scope@9.1.2", "", { "dependencies": { "@types/esrecurse": "^4.3.1", "@types/estree": "^1.0.8", "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ=="], + "eslint-scope": ["eslint-scope@8.4.0", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg=="], "eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="], - "espree": ["espree@11.2.0", "", { "dependencies": { "acorn": "^8.16.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^5.0.1" } }, "sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw=="], + "espree": ["espree@10.4.0", "", { "dependencies": { "acorn": "^8.15.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^4.2.1" } }, "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ=="], "esprima": ["esprima@4.0.1", "", { "bin": { "esparse": "./bin/esparse.js", "esvalidate": "./bin/esvalidate.js" } }, "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="], @@ -875,6 +879,8 @@ "glob-parent": ["glob-parent@6.0.2", "", { "dependencies": { "is-glob": "^4.0.3" } }, "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A=="], + "globals": ["globals@14.0.0", "", {}, "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ=="], + "globalthis": ["globalthis@1.0.4", "", { "dependencies": { "define-properties": "^1.2.1", "gopd": "^1.0.1" } }, "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ=="], "globby": ["globby@11.1.0", "", { "dependencies": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", "fast-glob": "^3.2.9", "ignore": "^5.2.0", "merge2": "^1.4.1", "slash": "^3.0.0" } }, "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g=="], @@ -889,6 +895,8 @@ "has-bigints": ["has-bigints@1.1.0", "", {}, "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg=="], + "has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], + "has-property-descriptors": ["has-property-descriptors@1.0.2", "", { "dependencies": { "es-define-property": "^1.0.0" } }, "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg=="], "has-proto": ["has-proto@1.2.0", "", { "dependencies": { "dunder-proto": "^1.0.0" } }, "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ=="], @@ -919,6 +927,8 @@ "immer": ["immer@10.2.0", "", {}, "sha512-d/+XTN3zfODyjr89gM3mPq1WNX2B8pYsu7eORitdwyA2sBubnTl3laYlBk4sXY5FUa5qTZGBDPJICVbvqzjlbw=="], + "import-fresh": ["import-fresh@3.3.1", "", { "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" } }, "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ=="], + "imurmurhash": ["imurmurhash@0.1.4", "", {}, "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA=="], "inherits": ["inherits@2.0.4", "", {}, "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="], @@ -1035,6 +1045,8 @@ "lodash": ["lodash@4.17.23", "", {}, "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w=="], + "lodash.merge": ["lodash.merge@4.6.2", "", {}, "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ=="], + "log-update": ["log-update@8.0.0", "", { "dependencies": { "ansi-escapes": "^7.3.0", "cli-cursor": "^5.0.0", "slice-ansi": "^9.0.0", "string-width": "^8.2.0", "strip-ansi": "^7.2.0", "wrap-ansi": "^10.0.0" } }, "sha512-lddSgOt3bPASrylL54ZSpy8nBHns+vBVSoILlVOx+dei300pnLRN958rj/EdlVLKuWlSESU3qdnDZdAI7FXYGg=="], "longest-streak": ["longest-streak@3.1.0", "", {}, "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g=="], @@ -1237,6 +1249,8 @@ "pako": ["pako@1.0.11", "", {}, "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw=="], + "parent-module": ["parent-module@1.0.1", "", { "dependencies": { "callsites": "^3.0.0" } }, "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g=="], + "parse-bmfont-ascii": ["parse-bmfont-ascii@1.0.6", "", {}, "sha512-U4RrVsUFCleIOBsIGYOMKjn9PavsGOXxbvYGtMOEfnId0SVNsgehXh1DxUdVPLoxd5mvcEtvmKs2Mmf0Mpa1ZA=="], "parse-bmfont-binary": ["parse-bmfont-binary@1.0.6", "", {}, "sha512-GxmsRea0wdGdYthjuUeWTMWPqm2+FAd4GI8vCvhgJsFnoGhTrLhXDDupwTo7rXVAgaLIGoVHDZS9p/5XbSqeWA=="], @@ -1307,7 +1321,7 @@ "postgres-interval": ["postgres-interval@1.2.0", "", { "dependencies": { "xtend": "^4.0.0" } }, "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ=="], - "posthog-node": ["posthog-node@5.36.5", "", { "dependencies": { "@posthog/core": "1.30.11" }, "peerDependencies": { "rxjs": "^7.0.0" }, "optionalPeers": ["rxjs"] }, "sha512-ClI6LA+wDUMuMvY/fwKf4YxDHSyXrFTXWtlGGAly0Diage+mF05bH543bUSuhz1CrFPhWHQokTGPLz6wBPGA4Q=="], + "posthog-node": ["posthog-node@5.36.6", "", { "dependencies": { "@posthog/core": "1.30.12" }, "peerDependencies": { "rxjs": "^7.0.0" }, "optionalPeers": ["rxjs"] }, "sha512-r6atowCAjicv9N96yWFkhA8uhn8+UiWbVNYSf+7pHjfAfQfTPPTHPFZJYUrbgFjN6nkIMM1qXOO0E3gACiksIg=="], "preact": ["preact@10.29.2", "", {}, "sha512-7tNmwg/7mzzAoB/8kSg6Hl37JraAZw3Z3A0JSY7VXlZwo82Xn0G7wKbNNs2qoF4ZEEsQGTwDAroNdqKs1ofJxQ=="], @@ -1381,6 +1395,8 @@ "resolve": ["resolve@2.0.0-next.7", "", { "dependencies": { "es-errors": "^1.3.0", "is-core-module": "^2.16.2", "node-exports-info": "^1.6.0", "object-keys": "^1.1.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-tqt+NBWwyaMgw3zDsnygx4CByWjQEJHOPMdslYhppaQSJUtL/D4JO9CcBBlhPoI8lz9oJIDXkwXfhF4aWqP8xQ=="], + "resolve-from": ["resolve-from@4.0.0", "", {}, "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="], + "resolve-pkg-maps": ["resolve-pkg-maps@1.0.0", "", {}, "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw=="], "restore-cursor": ["restore-cursor@5.1.0", "", { "dependencies": { "onetime": "^7.0.0", "signal-exit": "^4.1.0" } }, "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA=="], @@ -1485,7 +1501,7 @@ "strip-final-newline": ["strip-final-newline@2.0.0", "", {}, "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA=="], - "strip-json-comments": ["strip-json-comments@2.0.1", "", {}, "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ=="], + "strip-json-comments": ["strip-json-comments@3.1.1", "", {}, "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig=="], "stripe": ["stripe@16.12.0", "", { "dependencies": { "@types/node": ">=8.1.0", "qs": "^6.11.0" } }, "sha512-H7eFVLDxeTNNSn4JTRfL2//LzCbDrMSZ+2q1c7CanVWgK2qIW5TwS+0V7N9KcKZZNpYh/uCqK0PyZh/2UsaAtQ=="], @@ -1493,6 +1509,8 @@ "styled-jsx": ["styled-jsx@5.1.6", "", { "dependencies": { "client-only": "0.0.1" }, "peerDependencies": { "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0" } }, "sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA=="], + "supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], + "supports-preserve-symlinks-flag": ["supports-preserve-symlinks-flag@1.0.0", "", {}, "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w=="], "supports-terminal-graphics": ["supports-terminal-graphics@0.1.0", "", {}, "sha512-+KdfozhS0Fw8y5Sghw8kkZNGT8nWYzJ1EzcoIvVjxhl+26TJTs26y02yfBgvc1jh5AS/c8jcI3xtahhR95KRyQ=="], @@ -1651,7 +1669,11 @@ "@codebuff/sdk/ignore": ["ignore@7.0.5", "", {}, "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg=="], - "@eslint/config-array/minimatch": ["minimatch@10.2.5", "", { "dependencies": { "brace-expansion": "^5.0.5" } }, "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg=="], + "@eslint/eslintrc/ajv": ["ajv@6.15.0", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw=="], + + "@eslint/eslintrc/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], + + "@eslint/eslintrc/js-yaml": ["js-yaml@4.2.0", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-ePWsvanv0DWuDRsW8dnt+R4jQ31SCRCQ7hhNcPXZPsoBZiemuZNYGf7adZdqX2D86j6rvKp3RpCxVTSb8WQlOw=="], "@opentui/core/diff": ["diff@9.0.0", "", {}, "sha512-svtcdpS8CgJyqAjEQIXdb3OjhFVVYjzGAPO8WGCmRbrml64SPw/jJD4GoE98aR7r25A0XcgrK3F02yw9R/vhQw=="], @@ -1687,11 +1709,11 @@ "eslint/ajv": ["ajv@6.15.0", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw=="], - "eslint/eslint-visitor-keys": ["eslint-visitor-keys@5.0.1", "", {}, "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA=="], + "eslint/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], - "eslint/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], + "eslint/eslint-visitor-keys": ["eslint-visitor-keys@4.2.1", "", {}, "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ=="], - "eslint/minimatch": ["minimatch@10.2.5", "", { "dependencies": { "brace-expansion": "^5.0.5" } }, "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg=="], + "eslint/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], "eslint-import-resolver-node/debug": ["debug@3.2.7", "", { "dependencies": { "ms": "^2.1.1" } }, "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ=="], @@ -1703,7 +1725,7 @@ "eslint-plugin-import/tsconfig-paths": ["tsconfig-paths@3.15.0", "", { "dependencies": { "@types/json5": "^0.0.29", "json5": "^1.0.2", "minimist": "^1.2.6", "strip-bom": "^3.0.0" } }, "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg=="], - "espree/eslint-visitor-keys": ["eslint-visitor-keys@5.0.1", "", {}, "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA=="], + "espree/eslint-visitor-keys": ["eslint-visitor-keys@4.2.1", "", {}, "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ=="], "execa/onetime": ["onetime@5.1.2", "", { "dependencies": { "mimic-fn": "^2.1.0" } }, "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg=="], @@ -1731,12 +1753,16 @@ "plist/xmlbuilder": ["xmlbuilder@15.1.1", "", {}, "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg=="], + "rc/strip-json-comments": ["strip-json-comments@2.0.1", "", {}, "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ=="], + "react-devtools-core/ws": ["ws@7.5.11", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": "^5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-zS54Oen9bITtp7kp2XM3AydrCIq1D+HwJOuH+c+e4LfpL/lotP5osijd+UoMnxwAam1GN8R4KtLAyIrIcBNpiA=="], "react-reconciler/scheduler": ["scheduler@0.26.0", "", {}, "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA=="], "send/mime-types": ["mime-types@3.0.2", "", { "dependencies": { "mime-db": "^1.54.0" } }, "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A=="], + "slice-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], + "tar-stream/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=="], "ts-node/diff": ["diff@4.0.4", "", {}, "sha512-X07nttJQkwkfKfvTPG/KSnE2OMdcUCao6+eXF3wmnIQRn2aPAHH3VxDbDOdegkd6JbPsXqShpvEOHfAT+nCNwQ=="], @@ -1751,6 +1777,8 @@ "typescript-eslint/@typescript-eslint/utils": ["@typescript-eslint/utils@7.18.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@typescript-eslint/scope-manager": "7.18.0", "@typescript-eslint/types": "7.18.0", "@typescript-eslint/typescript-estree": "7.18.0" }, "peerDependencies": { "eslint": "^8.56.0" } }, "sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw=="], + "wrap-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], + "wrap-ansi/string-width": ["string-width@8.2.1", "", { "dependencies": { "get-east-asian-width": "^1.5.0", "strip-ansi": "^7.1.2" } }, "sha512-IIaP0g3iy9Cyy18w3M9YcaDudujEAVHKt3a3QJg1+sr/oX96TbaGUubG0hJyCjCBThFH+tFpcIyoUHUn1ogaLA=="], "yargs/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], @@ -1759,7 +1787,9 @@ "@codebuff/evals/pino/process-warning": ["process-warning@5.0.0", "", {}, "sha512-a39t9ApHNx2L4+HBnQKqxxHNs1r7KF+Intd8Q/g1bUh6q0WIp9voPXJ/x0j+ZL45KF1pJd9+q2jLIRMfvEshkA=="], - "@eslint/config-array/minimatch/brace-expansion": ["brace-expansion@5.0.6", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g=="], + "@eslint/eslintrc/ajv/json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], + + "@eslint/eslintrc/js-yaml/argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="], "@typescript-eslint/parser/@typescript-eslint/typescript-estree/minimatch": ["minimatch@9.0.9", "", { "dependencies": { "brace-expansion": "^2.0.2" } }, "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg=="], @@ -1773,14 +1803,10 @@ "cliui/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], - "cliui/wrap-ansi/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], - "eslint-plugin-import/tsconfig-paths/json5": ["json5@1.0.2", "", { "dependencies": { "minimist": "^1.2.0" }, "bin": { "json5": "lib/cli.js" } }, "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA=="], "eslint/ajv/json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], - "eslint/minimatch/brace-expansion": ["brace-expansion@5.0.6", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g=="], - "express/mime-types/mime-db": ["mime-db@1.54.0", "", {}, "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ=="], "p-locate/p-limit/yocto-queue": ["yocto-queue@0.1.0", "", {}, "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="], @@ -1809,12 +1835,8 @@ "yargs/string-width/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], - "@eslint/config-array/minimatch/brace-expansion/balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="], - "@typescript-eslint/parser/@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.1.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-WR1cURNjuvBLMZBMbqM0UoE+WAfdUcEV1ccD8PVBVOI+Z3ND4+SZbN8RsfT2bMuG1qwz5RFvPukSZm5fF2D5eA=="], - "eslint/minimatch/brace-expansion/balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="], - "typescript-eslint/@typescript-eslint/eslint-plugin/@typescript-eslint/scope-manager/@typescript-eslint/types": ["@typescript-eslint/types@7.18.0", "", {}, "sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ=="], "typescript-eslint/@typescript-eslint/eslint-plugin/@typescript-eslint/type-utils/@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@7.18.0", "", { "dependencies": { "@typescript-eslint/types": "7.18.0", "@typescript-eslint/visitor-keys": "7.18.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", "minimatch": "^9.0.4", "semver": "^7.6.0", "ts-api-utils": "^1.3.0" } }, "sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA=="], diff --git a/cli/src/components/freebuff-active-session-summary.tsx b/cli/src/components/freebuff-active-session-summary.tsx index 8030810fc1..712c755888 100644 --- a/cli/src/components/freebuff-active-session-summary.tsx +++ b/cli/src/components/freebuff-active-session-summary.tsx @@ -38,9 +38,8 @@ export const FreebuffActiveSessionSummary: React.FC< : 'premium sessions' // recentCount already includes the active session's 1.0-unit reservation // (written as an admit row at promotion), so it reflects everything counted - // against the quota — spent plus in-flight. Show what's left to start. - const remaining = Math.max(0, quota.limit - quota.recentCount) - + // against the quota — spent plus in-flight. Show it as the total used to match + // the model selection menu and the other session-status screens. return ( - {formatSessionUnits(remaining)} of {quota.limit} + {formatSessionUnits(quota.recentCount)} of {quota.limit} {' '} - {label} left · resets in {resetCountdown} + {label} used · resets in {resetCountdown} diff --git a/freebuff/cli/release/package.json b/freebuff/cli/release/package.json index 61e48ff5f7..3de66a1637 100644 --- a/freebuff/cli/release/package.json +++ b/freebuff/cli/release/package.json @@ -1,6 +1,6 @@ { "name": "freebuff", - "version": "0.0.103", + "version": "0.0.104", "description": "The world's strongest free coding agent", "license": "MIT", "bin": { From 80b95d123ec6cc88693b155fa1512449d30c61f5 Mon Sep 17 00:00:00 2001 From: codebuff public sync bot <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 8 Jun 2026 23:29:22 +0000 Subject: [PATCH 31/96] Sync public snapshot from freebuff-private Source: CodebuffAI/freebuff-private@65efa51d403c5330aaaebafe695d43e652036963 --- bun.lock | 74 ++++++++++++++++++++------------------------------------ 1 file changed, 26 insertions(+), 48 deletions(-) diff --git a/bun.lock b/bun.lock index ef683beaf4..c7d270e068 100644 --- a/bun.lock +++ b/bun.lock @@ -239,19 +239,15 @@ "@eslint-community/regexpp": ["@eslint-community/regexpp@4.12.2", "", {}, "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew=="], - "@eslint/config-array": ["@eslint/config-array@0.21.2", "", { "dependencies": { "@eslint/object-schema": "^2.1.7", "debug": "^4.3.1", "minimatch": "^3.1.5" } }, "sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw=="], + "@eslint/config-array": ["@eslint/config-array@0.23.5", "", { "dependencies": { "@eslint/object-schema": "^3.0.5", "debug": "^4.3.1", "minimatch": "^10.2.4" } }, "sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA=="], - "@eslint/config-helpers": ["@eslint/config-helpers@0.4.2", "", { "dependencies": { "@eslint/core": "^0.17.0" } }, "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw=="], + "@eslint/config-helpers": ["@eslint/config-helpers@0.6.0", "", { "dependencies": { "@eslint/core": "^1.2.1" } }, "sha512-ii6Bw9jJ2zi2cWA2Z+9/QZ/+3DX6kwaV5Q986D/CdP3Lap3w/pgQZ373FV7byY/i7L4IRH/G43I5dz1ClsCbpA=="], - "@eslint/core": ["@eslint/core@0.17.0", "", { "dependencies": { "@types/json-schema": "^7.0.15" } }, "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ=="], + "@eslint/core": ["@eslint/core@1.2.1", "", { "dependencies": { "@types/json-schema": "^7.0.15" } }, "sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ=="], - "@eslint/eslintrc": ["@eslint/eslintrc@3.3.5", "", { "dependencies": { "ajv": "^6.14.0", "debug": "^4.3.2", "espree": "^10.0.1", "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.1", "minimatch": "^3.1.5", "strip-json-comments": "^3.1.1" } }, "sha512-4IlJx0X0qftVsN5E+/vGujTRIFtwuLbNsVUe7TO6zYPDR1O6nFwvwhIKEKSrl6dZchmYBITazxKoUYOjdtjlRg=="], + "@eslint/object-schema": ["@eslint/object-schema@3.0.5", "", {}, "sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw=="], - "@eslint/js": ["@eslint/js@9.39.4", "", {}, "sha512-nE7DEIchvtiFTwBw4Lfbu59PG+kCofhjsKaCWzxTpt4lfRjRMqG6uMBzKXuEcyXhOHoUp9riAm7/aWYGhXZ9cw=="], - - "@eslint/object-schema": ["@eslint/object-schema@2.1.7", "", {}, "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA=="], - - "@eslint/plugin-kit": ["@eslint/plugin-kit@0.4.1", "", { "dependencies": { "@eslint/core": "^0.17.0", "levn": "^0.4.1" } }, "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA=="], + "@eslint/plugin-kit": ["@eslint/plugin-kit@0.7.2", "", { "dependencies": { "@eslint/core": "^1.2.1", "levn": "^0.4.1" } }, "sha512-+CNAzxglkrpNf/kKywqQfk74QjtceuOE7Qm+AF8miRvPF/wmmK5+OJOgVh3AVTT3RP2mH3+FOaxlE5v72owk0A=="], "@gravity-ai/api": ["@gravity-ai/api@0.1.2", "", { "dependencies": { "axios": "^1.13.2" } }, "sha512-txsAhyzvwB/TNrj5R8DoNqw8afM3JY2ahl7aaeaD5ZsxP+7rxff7C7keGI7+gU2KT3d2Mcw4QB1nHhbTSCJYHw=="], @@ -467,6 +463,8 @@ "@types/diff": ["@types/diff@8.0.0", "", { "dependencies": { "diff": "*" } }, "sha512-o7jqJM04gfaYrdCecCVMbZhNdG6T1MHg/oQoRFdERLV+4d+V7FijhiEAbFu0Usww84Yijk9yH58U4Jk4HbtzZw=="], + "@types/esrecurse": ["@types/esrecurse@4.3.1", "", {}, "sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw=="], + "@types/estree": ["@types/estree@1.0.9", "", {}, "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg=="], "@types/js-yaml": ["@types/js-yaml@4.0.9", "", {}, "sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg=="], @@ -549,7 +547,7 @@ "ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="], - "ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + "ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], "any-base": ["any-base@1.1.0", "", {}, "sha512-uMgjozySS8adZZYePpaWs8cxB9/kdzmpX6SgJZ+wbz1K5eYk5QMYDVJaZKhxyIHUdnnJkfR7SVgStgH7LkGUyg=="], @@ -625,8 +623,6 @@ "call-bound": ["call-bound@1.0.4", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "get-intrinsic": "^1.3.0" } }, "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg=="], - "callsites": ["callsites@3.1.0", "", {}, "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="], - "caniuse-lite": ["caniuse-lite@1.0.30001797", "", {}, "sha512-l8xKG+gwAIExZGl9FrF7KUwuOmk6wbEPC9Xoy/RtnWv1XG0Q4LFlagaLpUv3Kiza3W/wm27zy0yWJEieYKAP6w=="], "canvas": ["canvas@3.2.3", "", { "dependencies": { "node-addon-api": "^7.0.0", "prebuild-install": "^7.1.3" } }, "sha512-PzE5nJZPz72YUAfo8oTp0u3fqqY7IzlTubneAihqDYAUcBk7ryeCmBbdJBEdaH0bptSOe2VT2Zwcb3UaFyaSWw=="], @@ -751,7 +747,7 @@ "escape-string-regexp": ["escape-string-regexp@4.0.0", "", {}, "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="], - "eslint": ["eslint@9.39.4", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", "@eslint/config-array": "^0.21.2", "@eslint/config-helpers": "^0.4.2", "@eslint/core": "^0.17.0", "@eslint/eslintrc": "^3.3.5", "@eslint/js": "9.39.4", "@eslint/plugin-kit": "^0.4.1", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "ajv": "^6.14.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^8.4.0", "eslint-visitor-keys": "^4.2.1", "espree": "^10.4.0", "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.5", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, "peerDependencies": { "jiti": "*" }, "optionalPeers": ["jiti"], "bin": { "eslint": "bin/eslint.js" } }, "sha512-XoMjdBOwe/esVgEvLmNsD3IRHkm7fbKIUGvrleloJXUZgDHig2IPWNniv+GwjyJXzuNqVjlr5+4yVUZjycJwfQ=="], + "eslint": ["eslint@10.4.1", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.2", "@eslint/config-array": "^0.23.5", "@eslint/config-helpers": "^0.6.0", "@eslint/core": "^1.2.1", "@eslint/plugin-kit": "^0.7.2", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "ajv": "^6.14.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^9.1.2", "eslint-visitor-keys": "^5.0.1", "espree": "^11.2.0", "esquery": "^1.7.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "minimatch": "^10.2.4", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, "peerDependencies": { "jiti": "*" }, "optionalPeers": ["jiti"], "bin": { "eslint": "bin/eslint.js" } }, "sha512-AyIKhnOBuOAdueD7RB3xB+YeAWScb9jHsJBgH2Hcde8InP5JYhqrRR6iTMHyTEwgENK54Cp44e4v8BwNhsuHuw=="], "eslint-config-prettier": ["eslint-config-prettier@9.1.2", "", { "peerDependencies": { "eslint": ">=7.0.0" }, "bin": { "eslint-config-prettier": "bin/cli.js" } }, "sha512-iI1f+D2ViGn+uvv5HuHVUamg8ll4tN+JRHGc6IJi4TP9Kl976C57fzPXgseXNs8v0iA8aSJpHsTWjDb9QJamGQ=="], @@ -763,11 +759,11 @@ "eslint-plugin-unused-imports": ["eslint-plugin-unused-imports@4.4.1", "", { "peerDependencies": { "@typescript-eslint/eslint-plugin": "^8.0.0-0 || ^7.0.0 || ^6.0.0 || ^5.0.0", "eslint": "^10.0.0 || ^9.0.0 || ^8.0.0" }, "optionalPeers": ["@typescript-eslint/eslint-plugin"] }, "sha512-oZGYUz1X3sRMGUB+0cZyK2VcvRX5lm/vB56PgNNcU+7ficUCKm66oZWKUubXWnOuPjQ8PvmXtCViXBMONPe7tQ=="], - "eslint-scope": ["eslint-scope@8.4.0", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg=="], + "eslint-scope": ["eslint-scope@9.1.2", "", { "dependencies": { "@types/esrecurse": "^4.3.1", "@types/estree": "^1.0.8", "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ=="], "eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="], - "espree": ["espree@10.4.0", "", { "dependencies": { "acorn": "^8.15.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^4.2.1" } }, "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ=="], + "espree": ["espree@11.2.0", "", { "dependencies": { "acorn": "^8.16.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^5.0.1" } }, "sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw=="], "esprima": ["esprima@4.0.1", "", { "bin": { "esparse": "./bin/esparse.js", "esvalidate": "./bin/esvalidate.js" } }, "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="], @@ -879,8 +875,6 @@ "glob-parent": ["glob-parent@6.0.2", "", { "dependencies": { "is-glob": "^4.0.3" } }, "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A=="], - "globals": ["globals@14.0.0", "", {}, "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ=="], - "globalthis": ["globalthis@1.0.4", "", { "dependencies": { "define-properties": "^1.2.1", "gopd": "^1.0.1" } }, "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ=="], "globby": ["globby@11.1.0", "", { "dependencies": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", "fast-glob": "^3.2.9", "ignore": "^5.2.0", "merge2": "^1.4.1", "slash": "^3.0.0" } }, "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g=="], @@ -895,8 +889,6 @@ "has-bigints": ["has-bigints@1.1.0", "", {}, "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg=="], - "has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], - "has-property-descriptors": ["has-property-descriptors@1.0.2", "", { "dependencies": { "es-define-property": "^1.0.0" } }, "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg=="], "has-proto": ["has-proto@1.2.0", "", { "dependencies": { "dunder-proto": "^1.0.0" } }, "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ=="], @@ -927,8 +919,6 @@ "immer": ["immer@10.2.0", "", {}, "sha512-d/+XTN3zfODyjr89gM3mPq1WNX2B8pYsu7eORitdwyA2sBubnTl3laYlBk4sXY5FUa5qTZGBDPJICVbvqzjlbw=="], - "import-fresh": ["import-fresh@3.3.1", "", { "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" } }, "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ=="], - "imurmurhash": ["imurmurhash@0.1.4", "", {}, "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA=="], "inherits": ["inherits@2.0.4", "", {}, "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="], @@ -1045,8 +1035,6 @@ "lodash": ["lodash@4.17.23", "", {}, "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w=="], - "lodash.merge": ["lodash.merge@4.6.2", "", {}, "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ=="], - "log-update": ["log-update@8.0.0", "", { "dependencies": { "ansi-escapes": "^7.3.0", "cli-cursor": "^5.0.0", "slice-ansi": "^9.0.0", "string-width": "^8.2.0", "strip-ansi": "^7.2.0", "wrap-ansi": "^10.0.0" } }, "sha512-lddSgOt3bPASrylL54ZSpy8nBHns+vBVSoILlVOx+dei300pnLRN958rj/EdlVLKuWlSESU3qdnDZdAI7FXYGg=="], "longest-streak": ["longest-streak@3.1.0", "", {}, "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g=="], @@ -1249,8 +1237,6 @@ "pako": ["pako@1.0.11", "", {}, "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw=="], - "parent-module": ["parent-module@1.0.1", "", { "dependencies": { "callsites": "^3.0.0" } }, "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g=="], - "parse-bmfont-ascii": ["parse-bmfont-ascii@1.0.6", "", {}, "sha512-U4RrVsUFCleIOBsIGYOMKjn9PavsGOXxbvYGtMOEfnId0SVNsgehXh1DxUdVPLoxd5mvcEtvmKs2Mmf0Mpa1ZA=="], "parse-bmfont-binary": ["parse-bmfont-binary@1.0.6", "", {}, "sha512-GxmsRea0wdGdYthjuUeWTMWPqm2+FAd4GI8vCvhgJsFnoGhTrLhXDDupwTo7rXVAgaLIGoVHDZS9p/5XbSqeWA=="], @@ -1395,8 +1381,6 @@ "resolve": ["resolve@2.0.0-next.7", "", { "dependencies": { "es-errors": "^1.3.0", "is-core-module": "^2.16.2", "node-exports-info": "^1.6.0", "object-keys": "^1.1.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-tqt+NBWwyaMgw3zDsnygx4CByWjQEJHOPMdslYhppaQSJUtL/D4JO9CcBBlhPoI8lz9oJIDXkwXfhF4aWqP8xQ=="], - "resolve-from": ["resolve-from@4.0.0", "", {}, "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="], - "resolve-pkg-maps": ["resolve-pkg-maps@1.0.0", "", {}, "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw=="], "restore-cursor": ["restore-cursor@5.1.0", "", { "dependencies": { "onetime": "^7.0.0", "signal-exit": "^4.1.0" } }, "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA=="], @@ -1501,7 +1485,7 @@ "strip-final-newline": ["strip-final-newline@2.0.0", "", {}, "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA=="], - "strip-json-comments": ["strip-json-comments@3.1.1", "", {}, "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig=="], + "strip-json-comments": ["strip-json-comments@2.0.1", "", {}, "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ=="], "stripe": ["stripe@16.12.0", "", { "dependencies": { "@types/node": ">=8.1.0", "qs": "^6.11.0" } }, "sha512-H7eFVLDxeTNNSn4JTRfL2//LzCbDrMSZ+2q1c7CanVWgK2qIW5TwS+0V7N9KcKZZNpYh/uCqK0PyZh/2UsaAtQ=="], @@ -1509,8 +1493,6 @@ "styled-jsx": ["styled-jsx@5.1.6", "", { "dependencies": { "client-only": "0.0.1" }, "peerDependencies": { "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0" } }, "sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA=="], - "supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], - "supports-preserve-symlinks-flag": ["supports-preserve-symlinks-flag@1.0.0", "", {}, "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w=="], "supports-terminal-graphics": ["supports-terminal-graphics@0.1.0", "", {}, "sha512-+KdfozhS0Fw8y5Sghw8kkZNGT8nWYzJ1EzcoIvVjxhl+26TJTs26y02yfBgvc1jh5AS/c8jcI3xtahhR95KRyQ=="], @@ -1669,11 +1651,7 @@ "@codebuff/sdk/ignore": ["ignore@7.0.5", "", {}, "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg=="], - "@eslint/eslintrc/ajv": ["ajv@6.15.0", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw=="], - - "@eslint/eslintrc/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], - - "@eslint/eslintrc/js-yaml": ["js-yaml@4.2.0", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-ePWsvanv0DWuDRsW8dnt+R4jQ31SCRCQ7hhNcPXZPsoBZiemuZNYGf7adZdqX2D86j6rvKp3RpCxVTSb8WQlOw=="], + "@eslint/config-array/minimatch": ["minimatch@10.2.5", "", { "dependencies": { "brace-expansion": "^5.0.5" } }, "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg=="], "@opentui/core/diff": ["diff@9.0.0", "", {}, "sha512-svtcdpS8CgJyqAjEQIXdb3OjhFVVYjzGAPO8WGCmRbrml64SPw/jJD4GoE98aR7r25A0XcgrK3F02yw9R/vhQw=="], @@ -1709,12 +1687,12 @@ "eslint/ajv": ["ajv@6.15.0", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw=="], - "eslint/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], - - "eslint/eslint-visitor-keys": ["eslint-visitor-keys@4.2.1", "", {}, "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ=="], + "eslint/eslint-visitor-keys": ["eslint-visitor-keys@5.0.1", "", {}, "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA=="], "eslint/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], + "eslint/minimatch": ["minimatch@10.2.5", "", { "dependencies": { "brace-expansion": "^5.0.5" } }, "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg=="], + "eslint-import-resolver-node/debug": ["debug@3.2.7", "", { "dependencies": { "ms": "^2.1.1" } }, "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ=="], "eslint-module-utils/debug": ["debug@3.2.7", "", { "dependencies": { "ms": "^2.1.1" } }, "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ=="], @@ -1725,7 +1703,7 @@ "eslint-plugin-import/tsconfig-paths": ["tsconfig-paths@3.15.0", "", { "dependencies": { "@types/json5": "^0.0.29", "json5": "^1.0.2", "minimist": "^1.2.6", "strip-bom": "^3.0.0" } }, "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg=="], - "espree/eslint-visitor-keys": ["eslint-visitor-keys@4.2.1", "", {}, "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ=="], + "espree/eslint-visitor-keys": ["eslint-visitor-keys@5.0.1", "", {}, "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA=="], "execa/onetime": ["onetime@5.1.2", "", { "dependencies": { "mimic-fn": "^2.1.0" } }, "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg=="], @@ -1753,16 +1731,12 @@ "plist/xmlbuilder": ["xmlbuilder@15.1.1", "", {}, "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg=="], - "rc/strip-json-comments": ["strip-json-comments@2.0.1", "", {}, "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ=="], - "react-devtools-core/ws": ["ws@7.5.11", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": "^5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-zS54Oen9bITtp7kp2XM3AydrCIq1D+HwJOuH+c+e4LfpL/lotP5osijd+UoMnxwAam1GN8R4KtLAyIrIcBNpiA=="], "react-reconciler/scheduler": ["scheduler@0.26.0", "", {}, "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA=="], "send/mime-types": ["mime-types@3.0.2", "", { "dependencies": { "mime-db": "^1.54.0" } }, "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A=="], - "slice-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], - "tar-stream/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=="], "ts-node/diff": ["diff@4.0.4", "", {}, "sha512-X07nttJQkwkfKfvTPG/KSnE2OMdcUCao6+eXF3wmnIQRn2aPAHH3VxDbDOdegkd6JbPsXqShpvEOHfAT+nCNwQ=="], @@ -1777,8 +1751,6 @@ "typescript-eslint/@typescript-eslint/utils": ["@typescript-eslint/utils@7.18.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@typescript-eslint/scope-manager": "7.18.0", "@typescript-eslint/types": "7.18.0", "@typescript-eslint/typescript-estree": "7.18.0" }, "peerDependencies": { "eslint": "^8.56.0" } }, "sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw=="], - "wrap-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], - "wrap-ansi/string-width": ["string-width@8.2.1", "", { "dependencies": { "get-east-asian-width": "^1.5.0", "strip-ansi": "^7.1.2" } }, "sha512-IIaP0g3iy9Cyy18w3M9YcaDudujEAVHKt3a3QJg1+sr/oX96TbaGUubG0hJyCjCBThFH+tFpcIyoUHUn1ogaLA=="], "yargs/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], @@ -1787,9 +1759,7 @@ "@codebuff/evals/pino/process-warning": ["process-warning@5.0.0", "", {}, "sha512-a39t9ApHNx2L4+HBnQKqxxHNs1r7KF+Intd8Q/g1bUh6q0WIp9voPXJ/x0j+ZL45KF1pJd9+q2jLIRMfvEshkA=="], - "@eslint/eslintrc/ajv/json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], - - "@eslint/eslintrc/js-yaml/argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="], + "@eslint/config-array/minimatch/brace-expansion": ["brace-expansion@5.0.6", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g=="], "@typescript-eslint/parser/@typescript-eslint/typescript-estree/minimatch": ["minimatch@9.0.9", "", { "dependencies": { "brace-expansion": "^2.0.2" } }, "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg=="], @@ -1803,10 +1773,14 @@ "cliui/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], + "cliui/wrap-ansi/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + "eslint-plugin-import/tsconfig-paths/json5": ["json5@1.0.2", "", { "dependencies": { "minimist": "^1.2.0" }, "bin": { "json5": "lib/cli.js" } }, "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA=="], "eslint/ajv/json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], + "eslint/minimatch/brace-expansion": ["brace-expansion@5.0.6", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g=="], + "express/mime-types/mime-db": ["mime-db@1.54.0", "", {}, "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ=="], "p-locate/p-limit/yocto-queue": ["yocto-queue@0.1.0", "", {}, "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="], @@ -1835,8 +1809,12 @@ "yargs/string-width/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + "@eslint/config-array/minimatch/brace-expansion/balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="], + "@typescript-eslint/parser/@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.1.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-WR1cURNjuvBLMZBMbqM0UoE+WAfdUcEV1ccD8PVBVOI+Z3ND4+SZbN8RsfT2bMuG1qwz5RFvPukSZm5fF2D5eA=="], + "eslint/minimatch/brace-expansion/balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="], + "typescript-eslint/@typescript-eslint/eslint-plugin/@typescript-eslint/scope-manager/@typescript-eslint/types": ["@typescript-eslint/types@7.18.0", "", {}, "sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ=="], "typescript-eslint/@typescript-eslint/eslint-plugin/@typescript-eslint/type-utils/@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@7.18.0", "", { "dependencies": { "@typescript-eslint/types": "7.18.0", "@typescript-eslint/visitor-keys": "7.18.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", "minimatch": "^9.0.4", "semver": "^7.6.0", "ts-api-utils": "^1.3.0" } }, "sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA=="], From d4129b7488fddbed70f0cc6ce4c1bbc90121f300 Mon Sep 17 00:00:00 2001 From: codebuff public sync bot <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 9 Jun 2026 06:12:49 +0000 Subject: [PATCH 32/96] Sync public snapshot from freebuff-private Source: CodebuffAI/freebuff-private@969b84af53444602c6e1bd481deea7384d31a0e6 --- bun.lock | 4 +- cli/src/chat.tsx | 8 +- ...-ad-banner.test.tsx => ad-banner.test.tsx} | 4 +- cli/src/components/ad-banner.tsx | 217 ++++++++++++++++++ cli/src/components/choice-ad-banner.tsx | 181 --------------- cli/src/components/waiting-room-screen.tsx | 8 +- 6 files changed, 228 insertions(+), 194 deletions(-) rename cli/src/components/__tests__/{choice-ad-banner.test.tsx => ad-banner.test.tsx} (83%) create mode 100644 cli/src/components/ad-banner.tsx delete mode 100644 cli/src/components/choice-ad-banner.tsx diff --git a/bun.lock b/bun.lock index c7d270e068..5246d8b3ae 100644 --- a/bun.lock +++ b/bun.lock @@ -899,7 +899,7 @@ "hasown": ["hasown@2.0.4", "", { "dependencies": { "function-bind": "^1.1.2" } }, "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A=="], - "hono": ["hono@4.12.24", "", {}, "sha512-I36D1s+HgQc55KbhEr4iybfxv/9o1zdpw+XEM6dJa91LqQD0HCoSGdxpRJCZE+aavs87j4V3Ls2OJzq8C/U4iw=="], + "hono": ["hono@4.12.25", "", {}, "sha512-2NFaIyNVgJmBs/ecmtGzlmluTFs5cHEWGTdu0t1HBwYzoGXOL5nUQBRMXsXWla5i4KkG//QMzVP88m1+I3fdAQ=="], "http-errors": ["http-errors@2.0.1", "", { "dependencies": { "depd": "~2.0.0", "inherits": "~2.0.4", "setprototypeof": "~1.2.0", "statuses": "~2.0.2", "toidentifier": "~1.0.1" } }, "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ=="], @@ -1657,8 +1657,6 @@ "@opentui/core/strip-ansi": ["strip-ansi@7.1.2", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA=="], - "@types/diff/diff": ["diff@9.0.0", "", {}, "sha512-svtcdpS8CgJyqAjEQIXdb3OjhFVVYjzGAPO8WGCmRbrml64SPw/jJD4GoE98aR7r25A0XcgrK3F02yw9R/vhQw=="], - "@typescript-eslint/eslint-plugin/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], "@typescript-eslint/parser/@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@7.18.0", "", { "dependencies": { "@typescript-eslint/types": "7.18.0", "@typescript-eslint/visitor-keys": "7.18.0" } }, "sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA=="], diff --git a/cli/src/chat.tsx b/cli/src/chat.tsx index a5d6b702f4..799601f725 100644 --- a/cli/src/chat.tsx +++ b/cli/src/chat.tsx @@ -13,7 +13,7 @@ import { useShallow } from 'zustand/react/shallow' import { getAdsEnabled } from './commands/ads' import { routeUserPrompt, addBashMessageToHistory } from './commands/router' -import { ChoiceAdBanner } from './components/choice-ad-banner' +import { SingleAdBanner } from './components/ad-banner' import { ChatInputBar } from './components/chat-input-bar' import { FreebuffActiveSessionSummary } from './components/freebuff-active-session-summary' import { LoadPreviousButton } from './components/load-previous-button' @@ -1466,9 +1466,9 @@ export const Chat = ({ /> )} - {ads && (IS_FREEBUFF || getAdsEnabled()) && ( - diff --git a/cli/src/components/__tests__/choice-ad-banner.test.tsx b/cli/src/components/__tests__/ad-banner.test.tsx similarity index 83% rename from cli/src/components/__tests__/choice-ad-banner.test.tsx rename to cli/src/components/__tests__/ad-banner.test.tsx index b787c97709..36b3aa04c4 100644 --- a/cli/src/components/__tests__/choice-ad-banner.test.tsx +++ b/cli/src/components/__tests__/ad-banner.test.tsx @@ -1,8 +1,8 @@ import { describe, expect, test } from 'bun:test' -import { getAdDisplayLabel } from '../choice-ad-banner' +import { getAdDisplayLabel } from '../ad-banner' -describe('choice ad banner display label', () => { +describe('ad banner display label', () => { test('uses the display domain when the ad has a URL', () => { expect( getAdDisplayLabel({ diff --git a/cli/src/components/ad-banner.tsx b/cli/src/components/ad-banner.tsx new file mode 100644 index 0000000000..05d527bb86 --- /dev/null +++ b/cli/src/components/ad-banner.tsx @@ -0,0 +1,217 @@ +import { TextAttributes } from '@opentui/core' +import { safeOpen } from '../utils/open-url' +import React, { useState, useMemo, useEffect } from 'react' + +import { Button } from './button' +import { useTerminalDimensions } from '../hooks/use-terminal-dimensions' +import { useTheme } from '../hooks/use-theme' +import { BORDER_CHARS } from '../utils/ui-constants' + +import type { AdResponse } from '../hooks/use-gravity-ad' + +interface ChoiceAdBannerProps { + ads: AdResponse[] + onClick?: (ad: AdResponse) => void + onImpression?: (ad: AdResponse) => void +} + +export const AD_CARD_HEIGHT = 5 // border-top + 2 lines description + spacer + cta row + border-bottom +const MAX_DESC_LINES = 2 +const MIN_CARD_WIDTH = 60 // Minimum width per ad card to remain readable + +function truncateToLines(text: string, lineWidth: number, maxLines: number): string { + if (lineWidth <= 0) return text + const maxChars = lineWidth * maxLines + if (text.length <= maxChars) return text + return text.slice(0, maxChars - 1) + '…' +} + +function truncateToWidth(text: string, width: number): string { + if (width <= 0) return '' + if (text.length <= width) return text + return text.slice(0, width - 1) + '…' +} + +export const extractDomain = (url: string): string => { + try { + const parsed = new URL(url) + return parsed.hostname.replace(/^www\./, '') + } catch { + return url + } +} + +export function getAdDisplayLabel( + ad: Pick, +): { text: string; variant: 'domain' | 'title' } { + const url = ad.url.trim() + if (url) { + return { text: extractDomain(url), variant: 'domain' } + } + + return { text: ad.title.trim() || 'Sponsored', variant: 'title' } +} + +/** + * Calculate evenly distributed column widths that sum exactly to availableWidth. + * Distributes remainder pixels across the first N columns so there's no gap. + */ +function columnWidths(count: number, availableWidth: number): number[] { + const base = Math.floor(availableWidth / count) + const remainder = availableWidth - base * count + return Array.from({ length: count }, (_, i) => base + (i < remainder ? 1 : 0)) +} + +/** + * A single ad card. Used full-width by {@link SingleAdBanner} (chat) and in a + * row of columns by {@link ChoiceAdBanner} (waiting room). Manages its own + * hover state so each card highlights independently. + */ +const AdCard: React.FC<{ + ad: AdResponse + width: number + onClick?: (ad: AdResponse) => void +}> = ({ ad, width, onClick }) => { + const theme = useTheme() + const [isHovered, setIsHovered] = useState(false) + + const ctaText = ad.cta || ad.title || 'Learn more' + const label = getAdDisplayLabel(ad) + const labelMaxWidth = Math.max(0, width - ctaText.length - 5) + const labelText = truncateToWidth(label.text, labelMaxWidth) + + return ( + + ) +} + +/** + * Single ad shown below the chat response. The ad-placement experiment found + * one ad outperformed the multi-ad "choice" format, so the chat surface always + * renders exactly one ad spanning the full width. + */ +export const SingleAdBanner: React.FC<{ + ad: AdResponse + onClick?: (ad: AdResponse) => void + onImpression?: (ad: AdResponse) => void +}> = ({ ad, onClick, onImpression }) => { + const { terminalWidth } = useTerminalDimensions() + + // Full width minus left/right margin of 1 each. + const width = terminalWidth - 2 + + useEffect(() => { + onImpression?.(ad) + }, [ad, onImpression]) + + return ( + + + + ) +} + +/** + * Up to four ads shown in a row. Still used by the freebuff waiting room, which + * intentionally fills the space with multiple ads. + */ +export const ChoiceAdBanner: React.FC = ({ + ads, + onClick, + onImpression, +}) => { + const { terminalWidth } = useTerminalDimensions() + + // Available width for cards (terminal minus left/right margin of 1 each) + const colAvail = terminalWidth - 2 + + // Only show as many ads as fit with a healthy minimum width; hide the rest + const maxVisible = Math.max(1, Math.floor(colAvail / MIN_CARD_WIDTH)) + const visibleAds = useMemo( + () => (ads.length > maxVisible ? ads.slice(0, maxVisible) : ads), + [ads, maxVisible], + ) + + const widths = useMemo(() => columnWidths(visibleAds.length, colAvail), [visibleAds.length, colAvail]) + + // Fire impressions only for visible ads + useEffect(() => { + if (onImpression) { + for (const ad of visibleAds) { + onImpression(ad) + } + } + }, [visibleAds, onImpression]) + + return ( + + {/* Card columns */} + + {visibleAds.map((ad, i) => ( + + ))} + + + ) +} diff --git a/cli/src/components/choice-ad-banner.tsx b/cli/src/components/choice-ad-banner.tsx deleted file mode 100644 index ccacbe53b5..0000000000 --- a/cli/src/components/choice-ad-banner.tsx +++ /dev/null @@ -1,181 +0,0 @@ -import { TextAttributes } from '@opentui/core' -import { safeOpen } from '../utils/open-url' -import React, { useState, useMemo, useEffect } from 'react' - -import { Button } from './button' -import { useTerminalDimensions } from '../hooks/use-terminal-dimensions' -import { useTheme } from '../hooks/use-theme' -import { BORDER_CHARS } from '../utils/ui-constants' - -import type { AdResponse } from '../hooks/use-gravity-ad' - -interface ChoiceAdBannerProps { - ads: AdResponse[] - onClick?: (ad: AdResponse) => void - onImpression?: (ad: AdResponse) => void -} - -export const CHOICE_AD_BANNER_HEIGHT = 5 // border-top + 2 lines description + spacer + cta row + border-bottom -const MAX_DESC_LINES = 2 -const MIN_CARD_WIDTH = 60 // Minimum width per ad card to remain readable - -function truncateToLines(text: string, lineWidth: number, maxLines: number): string { - if (lineWidth <= 0) return text - const maxChars = lineWidth * maxLines - if (text.length <= maxChars) return text - return text.slice(0, maxChars - 1) + '…' -} - -function truncateToWidth(text: string, width: number): string { - if (width <= 0) return '' - if (text.length <= width) return text - return text.slice(0, width - 1) + '…' -} - -export const extractDomain = (url: string): string => { - try { - const parsed = new URL(url) - return parsed.hostname.replace(/^www\./, '') - } catch { - return url - } -} - -export function getAdDisplayLabel( - ad: Pick, -): { text: string; variant: 'domain' | 'title' } { - const url = ad.url.trim() - if (url) { - return { text: extractDomain(url), variant: 'domain' } - } - - return { text: ad.title.trim() || 'Sponsored', variant: 'title' } -} - -/** - * Calculate evenly distributed column widths that sum exactly to availableWidth. - * Distributes remainder pixels across the first N columns so there's no gap. - */ -function columnWidths(count: number, availableWidth: number): number[] { - const base = Math.floor(availableWidth / count) - const remainder = availableWidth - base * count - return Array.from({ length: count }, (_, i) => base + (i < remainder ? 1 : 0)) -} - -export const ChoiceAdBanner: React.FC = ({ - ads, - onClick, - onImpression, -}) => { - const theme = useTheme() - const { terminalWidth } = useTerminalDimensions() - const [hoveredIndex, setHoveredIndex] = useState(null) - - // Available width for cards (terminal minus left/right margin of 1 each) - const colAvail = terminalWidth - 2 - - // Only show as many ads as fit with a healthy minimum width; hide the rest - const maxVisible = Math.max(1, Math.floor(colAvail / MIN_CARD_WIDTH)) - const visibleAds = useMemo( - () => (ads.length > maxVisible ? ads.slice(0, maxVisible) : ads), - [ads, maxVisible], - ) - - const widths = useMemo(() => columnWidths(visibleAds.length, colAvail), [visibleAds.length, colAvail]) - - // Fire impressions only for visible ads - useEffect(() => { - if (onImpression) { - for (const ad of visibleAds) { - onImpression(ad) - } - } - }, [visibleAds, onImpression]) - - const hoverBorderColor = theme.primary - - return ( - - {/* Card columns */} - - {visibleAds.map((ad, i) => { - const isHovered = hoveredIndex === i - const ctaText = ad.cta || ad.title || 'Learn more' - const label = getAdDisplayLabel(ad) - const labelMaxWidth = Math.max(0, widths[i] - ctaText.length - 5) - const labelText = truncateToWidth(label.text, labelMaxWidth) - - return ( - - ) - })} - - - - - ) -} diff --git a/cli/src/components/waiting-room-screen.tsx b/cli/src/components/waiting-room-screen.tsx index c87fc62fb6..98e4711632 100644 --- a/cli/src/components/waiting-room-screen.tsx +++ b/cli/src/components/waiting-room-screen.tsx @@ -3,7 +3,7 @@ import { useKeyboard, useRenderer } from '@opentui/react' import React, { useCallback, useEffect, useMemo, useState } from 'react' import { Button } from './button' -import { ChoiceAdBanner, CHOICE_AD_BANNER_HEIGHT } from './choice-ad-banner' +import { ChoiceAdBanner, AD_CARD_HEIGHT } from './ad-banner' import { FreebuffModelSelector } from './freebuff-model-selector' import { ShimmerText } from './shimmer-text' import { @@ -406,7 +406,7 @@ export const WaitingRoomScreen: React.FC = ({ // estimate, no blanket safety row) so the scrollbox fills the available // space with no dead band below it: // - top bar: paddingTop 1 + the ✕ row = 2 - // - ad banner: CHOICE_AD_BANNER_HEIGHT, only when shown + // - ad banner: AD_CARD_HEIGHT, only when shown // - main box: its paddingTop (text-logo tier only) + paddingBottom 1 // - logo block: lines + marginBottom 1 (always, when shown) + gap (full) // - the prompt/counter (landing) or the position panel (queued) @@ -422,7 +422,7 @@ export const WaitingRoomScreen: React.FC = ({ ? 0 : logoLines + 1 /* marginBottom */ + (logoMode === 'full' ? 1 : 0) const mainPaddingRows = (logoMode === 'text' ? 1 : 0) + 1 - const adRows = showAds ? CHOICE_AD_BANNER_HEIGHT : 0 + const adRows = showAds ? AD_CARD_HEIGHT : 0 // Streak is rendered inline as a one-line row directly under the counter // (landing) or title (queued), with the same bottom margin as its neighbor // so the picker still sits flush below it. @@ -757,7 +757,7 @@ export const WaitingRoomScreen: React.FC = ({ style={{ width: '100%', flexShrink: 0, - height: CHOICE_AD_BANNER_HEIGHT, + height: AD_CARD_HEIGHT, }} > {ads ? ( From dee9ccde081fde21fa95ebb17416c767ea184251 Mon Sep 17 00:00:00 2001 From: codebuff public sync bot <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 9 Jun 2026 07:48:32 +0000 Subject: [PATCH 33/96] Sync public snapshot from freebuff-private Source: CodebuffAI/freebuff-private@b10823976f5bfc0370b8f928fa9409a47760166e --- bun.lock | 2 ++ 1 file changed, 2 insertions(+) diff --git a/bun.lock b/bun.lock index 5246d8b3ae..1d25137eed 100644 --- a/bun.lock +++ b/bun.lock @@ -1657,6 +1657,8 @@ "@opentui/core/strip-ansi": ["strip-ansi@7.1.2", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA=="], + "@types/diff/diff": ["diff@9.0.0", "", {}, "sha512-svtcdpS8CgJyqAjEQIXdb3OjhFVVYjzGAPO8WGCmRbrml64SPw/jJD4GoE98aR7r25A0XcgrK3F02yw9R/vhQw=="], + "@typescript-eslint/eslint-plugin/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], "@typescript-eslint/parser/@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@7.18.0", "", { "dependencies": { "@typescript-eslint/types": "7.18.0", "@typescript-eslint/visitor-keys": "7.18.0" } }, "sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA=="], From 5bf6cdf9b2f0983ef54ffe714380c479d281a3e0 Mon Sep 17 00:00:00 2001 From: codebuff public sync bot <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 9 Jun 2026 09:18:52 +0000 Subject: [PATCH 34/96] Sync public snapshot from freebuff-private Source: CodebuffAI/freebuff-private@4b54e9277b71b0957bee646952d5085953a18920 --- bun.lock | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/bun.lock b/bun.lock index 1d25137eed..48df674e8c 100644 --- a/bun.lock +++ b/bun.lock @@ -427,9 +427,9 @@ "@pinojs/redact": ["@pinojs/redact@0.4.0", "", {}, "sha512-k2ENnmBugE/rzQfEcdWHcCY+/FM3VLzH9cYEsbdsoqrvzAKRhUZeRNhAZvB8OitQJ1TBed3yqWtdjzS6wJKBwg=="], - "@posthog/core": ["@posthog/core@1.30.12", "", { "dependencies": { "@posthog/types": "1.383.1" } }, "sha512-XKkiK5H8ww3RHmL+TzHHnWCdcmZzfTy5RuiIs8yx9ABzG5Gdn+FgK/cH9XSvh5xU6Avkk1b6zLG/hZfF2nZAyQ=="], + "@posthog/core": ["@posthog/core@1.30.13", "", { "dependencies": { "@posthog/types": "1.383.2" } }, "sha512-d+4r6spHsllDUNc9LLJ3bT7GCiN9aurTMv1XKweyvOcujYq/w+PcjqxfZeOQZ2x9recdp+o9Z+hWgnuA2Sk4lw=="], - "@posthog/types": ["@posthog/types@1.383.1", "", {}, "sha512-1gdoBJLAbj9MjPnFV+WH+KWOktJIiWNvg8KO68cX3nbXlCCMx6p+d0e6ORmHshe1++UoRRIbSjfJE2aBOUVpRQ=="], + "@posthog/types": ["@posthog/types@1.383.2", "", {}, "sha512-rci/AXDgu3s+5H32bIDipXlIiM++Z5A4VB7LKs6IX0jW1JrcJ8zA3hX1HcKKQWkA4MqoEt8gWphrZt4HgMSrrg=="], "@rtsao/scc": ["@rtsao/scc@1.1.0", "", {}, "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g=="], @@ -1307,9 +1307,9 @@ "postgres-interval": ["postgres-interval@1.2.0", "", { "dependencies": { "xtend": "^4.0.0" } }, "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ=="], - "posthog-node": ["posthog-node@5.36.6", "", { "dependencies": { "@posthog/core": "1.30.12" }, "peerDependencies": { "rxjs": "^7.0.0" }, "optionalPeers": ["rxjs"] }, "sha512-r6atowCAjicv9N96yWFkhA8uhn8+UiWbVNYSf+7pHjfAfQfTPPTHPFZJYUrbgFjN6nkIMM1qXOO0E3gACiksIg=="], + "posthog-node": ["posthog-node@5.36.7", "", { "dependencies": { "@posthog/core": "1.30.13" }, "peerDependencies": { "rxjs": "^7.0.0" }, "optionalPeers": ["rxjs"] }, "sha512-NZJHYJZj/MGAEnDij4ksO38pI7mDmYHtp0/MkjN593x4WKL/GVAAg9PAe5X61tbDq4a02R6E/wlqXWV5vE++QQ=="], - "preact": ["preact@10.29.2", "", {}, "sha512-7tNmwg/7mzzAoB/8kSg6Hl37JraAZw3Z3A0JSY7VXlZwo82Xn0G7wKbNNs2qoF4ZEEsQGTwDAroNdqKs1ofJxQ=="], + "preact": ["preact@10.24.3", "", {}, "sha512-Z2dPnBnMUfyQfSQ+GBdsGa16hz35YmLmtTLhM169uW944hYL6xzTYkJjC07j+Wosz733pMWx0fgON3JNw1jJQA=="], "preact-render-to-string": ["preact-render-to-string@5.2.6", "", { "dependencies": { "pretty-format": "^3.8.0" }, "peerDependencies": { "preact": ">=10" } }, "sha512-JyhErpYOvBV1hEPwIxc/fHWXPfnEGdRKxc8gFdAZ7XV4tlzyzG847XAyEZqoDnynP88akM4eaHcSOzNcLWFguw=="], @@ -1639,8 +1639,6 @@ "zwitch": ["zwitch@2.0.4", "", {}, "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A=="], - "@auth/core/preact": ["preact@10.24.3", "", {}, "sha512-Z2dPnBnMUfyQfSQ+GBdsGa16hz35YmLmtTLhM169uW944hYL6xzTYkJjC07j+Wosz733pMWx0fgON3JNw1jJQA=="], - "@auth/core/preact-render-to-string": ["preact-render-to-string@6.5.11", "", { "peerDependencies": { "preact": ">=10" } }, "sha512-ubnauqoGczeGISiOh6RjX0/cdaF8v/oDXIjO85XALCQjwQP+SB4RDXXtvZ6yTYSjG+PC1QRP2AhPgCEsM2EvUw=="], "@codebuff/common/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], @@ -1657,8 +1655,6 @@ "@opentui/core/strip-ansi": ["strip-ansi@7.1.2", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA=="], - "@types/diff/diff": ["diff@9.0.0", "", {}, "sha512-svtcdpS8CgJyqAjEQIXdb3OjhFVVYjzGAPO8WGCmRbrml64SPw/jJD4GoE98aR7r25A0XcgrK3F02yw9R/vhQw=="], - "@typescript-eslint/eslint-plugin/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], "@typescript-eslint/parser/@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@7.18.0", "", { "dependencies": { "@typescript-eslint/types": "7.18.0", "@typescript-eslint/visitor-keys": "7.18.0" } }, "sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA=="], From 4ec125bd3a5a4135907cbcaf4855f453085622e9 Mon Sep 17 00:00:00 2001 From: codebuff public sync bot <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 9 Jun 2026 16:40:25 +0000 Subject: [PATCH 35/96] Sync public snapshot from freebuff-private Source: CodebuffAI/freebuff-private@aa8f025bc9f49ccb591a8e5dca4cc797d9d61766 --- bun.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bun.lock b/bun.lock index 48df674e8c..b8bfa44aa0 100644 --- a/bun.lock +++ b/bun.lock @@ -593,7 +593,7 @@ "base64-js": ["base64-js@1.5.1", "", {}, "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="], - "baseline-browser-mapping": ["baseline-browser-mapping@2.10.34", "", { "bin": { "baseline-browser-mapping": "dist/cli.cjs" } }, "sha512-IMDedajPifLnHNY0X9n8hKxRTQ6/eTHwr5bDo04WnuqxyKw6LYtQywCuuqPZwhl3aBXMvQpJov42GLCwRRdQzw=="], + "baseline-browser-mapping": ["baseline-browser-mapping@2.10.35", "", { "bin": { "baseline-browser-mapping": "dist/cli.cjs" } }, "sha512-honAfLBde0HAFLdNyBEfuuENkF6zR+ozxqxa/2zJKHBe1qzLqyTSeRKpdPEHAP03rlDGyQOPnCSxnVpVqQo9Mg=="], "binary-extensions": ["binary-extensions@2.3.0", "", {}, "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw=="], @@ -1317,7 +1317,7 @@ "prelude-ls": ["prelude-ls@1.2.1", "", {}, "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g=="], - "prettier": ["prettier@3.8.3", "", { "bin": { "prettier": "bin/prettier.cjs" } }, "sha512-7igPTM53cGHMW8xWuVTydi2KO233VFiTNyF5hLJqpilHfmn8C8gPf+PS7dUT64YcXFbiMGZxS9pCSxL/Dxm/Jw=="], + "prettier": ["prettier@3.8.4", "", { "bin": { "prettier": "bin/prettier.cjs" } }, "sha512-N2MylSdi48+5N/6S5j+maeHbUSIzzZ5uOcX5Hm4QpV8Dkb1HFjfAKTKX6yNPJQD9AhcT3ifHNB66tWTTJDi11Q=="], "pretty-format": ["pretty-format@3.8.0", "", {}, "sha512-WuxUnVtlWL1OfZFQFuqvnvs6MiAGk9UNsBostyBOB0Is9wb5uRESevA6rnl/rkksXaGX3GzZhPup5d6Vp1nFew=="], From 94a8bae1d7752ee5bd2d2bf116e5956adf7ef68c Mon Sep 17 00:00:00 2001 From: codebuff public sync bot <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 9 Jun 2026 17:45:22 +0000 Subject: [PATCH 36/96] Sync public snapshot from freebuff-private Source: CodebuffAI/freebuff-private@8637aa77553555cfa963913ce6283e634f340494 --- bun.lock | 84 ++++++++++++++++++++++++++++++++++++-------------------- 1 file changed, 54 insertions(+), 30 deletions(-) diff --git a/bun.lock b/bun.lock index b8bfa44aa0..b2c0dd2e39 100644 --- a/bun.lock +++ b/bun.lock @@ -239,15 +239,19 @@ "@eslint-community/regexpp": ["@eslint-community/regexpp@4.12.2", "", {}, "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew=="], - "@eslint/config-array": ["@eslint/config-array@0.23.5", "", { "dependencies": { "@eslint/object-schema": "^3.0.5", "debug": "^4.3.1", "minimatch": "^10.2.4" } }, "sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA=="], + "@eslint/config-array": ["@eslint/config-array@0.21.2", "", { "dependencies": { "@eslint/object-schema": "^2.1.7", "debug": "^4.3.1", "minimatch": "^3.1.5" } }, "sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw=="], - "@eslint/config-helpers": ["@eslint/config-helpers@0.6.0", "", { "dependencies": { "@eslint/core": "^1.2.1" } }, "sha512-ii6Bw9jJ2zi2cWA2Z+9/QZ/+3DX6kwaV5Q986D/CdP3Lap3w/pgQZ373FV7byY/i7L4IRH/G43I5dz1ClsCbpA=="], + "@eslint/config-helpers": ["@eslint/config-helpers@0.4.2", "", { "dependencies": { "@eslint/core": "^0.17.0" } }, "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw=="], - "@eslint/core": ["@eslint/core@1.2.1", "", { "dependencies": { "@types/json-schema": "^7.0.15" } }, "sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ=="], + "@eslint/core": ["@eslint/core@0.17.0", "", { "dependencies": { "@types/json-schema": "^7.0.15" } }, "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ=="], - "@eslint/object-schema": ["@eslint/object-schema@3.0.5", "", {}, "sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw=="], + "@eslint/eslintrc": ["@eslint/eslintrc@3.3.5", "", { "dependencies": { "ajv": "^6.14.0", "debug": "^4.3.2", "espree": "^10.0.1", "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.1", "minimatch": "^3.1.5", "strip-json-comments": "^3.1.1" } }, "sha512-4IlJx0X0qftVsN5E+/vGujTRIFtwuLbNsVUe7TO6zYPDR1O6nFwvwhIKEKSrl6dZchmYBITazxKoUYOjdtjlRg=="], - "@eslint/plugin-kit": ["@eslint/plugin-kit@0.7.2", "", { "dependencies": { "@eslint/core": "^1.2.1", "levn": "^0.4.1" } }, "sha512-+CNAzxglkrpNf/kKywqQfk74QjtceuOE7Qm+AF8miRvPF/wmmK5+OJOgVh3AVTT3RP2mH3+FOaxlE5v72owk0A=="], + "@eslint/js": ["@eslint/js@9.39.4", "", {}, "sha512-nE7DEIchvtiFTwBw4Lfbu59PG+kCofhjsKaCWzxTpt4lfRjRMqG6uMBzKXuEcyXhOHoUp9riAm7/aWYGhXZ9cw=="], + + "@eslint/object-schema": ["@eslint/object-schema@2.1.7", "", {}, "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA=="], + + "@eslint/plugin-kit": ["@eslint/plugin-kit@0.4.1", "", { "dependencies": { "@eslint/core": "^0.17.0", "levn": "^0.4.1" } }, "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA=="], "@gravity-ai/api": ["@gravity-ai/api@0.1.2", "", { "dependencies": { "axios": "^1.13.2" } }, "sha512-txsAhyzvwB/TNrj5R8DoNqw8afM3JY2ahl7aaeaD5ZsxP+7rxff7C7keGI7+gU2KT3d2Mcw4QB1nHhbTSCJYHw=="], @@ -427,9 +431,9 @@ "@pinojs/redact": ["@pinojs/redact@0.4.0", "", {}, "sha512-k2ENnmBugE/rzQfEcdWHcCY+/FM3VLzH9cYEsbdsoqrvzAKRhUZeRNhAZvB8OitQJ1TBed3yqWtdjzS6wJKBwg=="], - "@posthog/core": ["@posthog/core@1.30.13", "", { "dependencies": { "@posthog/types": "1.383.2" } }, "sha512-d+4r6spHsllDUNc9LLJ3bT7GCiN9aurTMv1XKweyvOcujYq/w+PcjqxfZeOQZ2x9recdp+o9Z+hWgnuA2Sk4lw=="], + "@posthog/core": ["@posthog/core@1.30.14", "", { "dependencies": { "@posthog/types": "1.383.3" } }, "sha512-cC0che/17kP6qMIMgdmxsoz3h8Jar8knQfDM8WqQwVacSeWXkrwkemoV7S5tCGmgTuRTTsdigirs9HiBXHQ/dA=="], - "@posthog/types": ["@posthog/types@1.383.2", "", {}, "sha512-rci/AXDgu3s+5H32bIDipXlIiM++Z5A4VB7LKs6IX0jW1JrcJ8zA3hX1HcKKQWkA4MqoEt8gWphrZt4HgMSrrg=="], + "@posthog/types": ["@posthog/types@1.383.3", "", {}, "sha512-N4jtmLaJxzjQ/C0UHnF0igQPSwUqwScPDv9ePGjKCfDomIEUcO3+c6pBrjTp7woxuMQ49BmyM/pV4/SOBPpe0Q=="], "@rtsao/scc": ["@rtsao/scc@1.1.0", "", {}, "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g=="], @@ -463,8 +467,6 @@ "@types/diff": ["@types/diff@8.0.0", "", { "dependencies": { "diff": "*" } }, "sha512-o7jqJM04gfaYrdCecCVMbZhNdG6T1MHg/oQoRFdERLV+4d+V7FijhiEAbFu0Usww84Yijk9yH58U4Jk4HbtzZw=="], - "@types/esrecurse": ["@types/esrecurse@4.3.1", "", {}, "sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw=="], - "@types/estree": ["@types/estree@1.0.9", "", {}, "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg=="], "@types/js-yaml": ["@types/js-yaml@4.0.9", "", {}, "sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg=="], @@ -547,7 +549,7 @@ "ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="], - "ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], + "ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], "any-base": ["any-base@1.1.0", "", {}, "sha512-uMgjozySS8adZZYePpaWs8cxB9/kdzmpX6SgJZ+wbz1K5eYk5QMYDVJaZKhxyIHUdnnJkfR7SVgStgH7LkGUyg=="], @@ -623,6 +625,8 @@ "call-bound": ["call-bound@1.0.4", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "get-intrinsic": "^1.3.0" } }, "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg=="], + "callsites": ["callsites@3.1.0", "", {}, "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="], + "caniuse-lite": ["caniuse-lite@1.0.30001797", "", {}, "sha512-l8xKG+gwAIExZGl9FrF7KUwuOmk6wbEPC9Xoy/RtnWv1XG0Q4LFlagaLpUv3Kiza3W/wm27zy0yWJEieYKAP6w=="], "canvas": ["canvas@3.2.3", "", { "dependencies": { "node-addon-api": "^7.0.0", "prebuild-install": "^7.1.3" } }, "sha512-PzE5nJZPz72YUAfo8oTp0u3fqqY7IzlTubneAihqDYAUcBk7ryeCmBbdJBEdaH0bptSOe2VT2Zwcb3UaFyaSWw=="], @@ -747,7 +751,7 @@ "escape-string-regexp": ["escape-string-regexp@4.0.0", "", {}, "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="], - "eslint": ["eslint@10.4.1", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.2", "@eslint/config-array": "^0.23.5", "@eslint/config-helpers": "^0.6.0", "@eslint/core": "^1.2.1", "@eslint/plugin-kit": "^0.7.2", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "ajv": "^6.14.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^9.1.2", "eslint-visitor-keys": "^5.0.1", "espree": "^11.2.0", "esquery": "^1.7.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "minimatch": "^10.2.4", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, "peerDependencies": { "jiti": "*" }, "optionalPeers": ["jiti"], "bin": { "eslint": "bin/eslint.js" } }, "sha512-AyIKhnOBuOAdueD7RB3xB+YeAWScb9jHsJBgH2Hcde8InP5JYhqrRR6iTMHyTEwgENK54Cp44e4v8BwNhsuHuw=="], + "eslint": ["eslint@9.39.4", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", "@eslint/config-array": "^0.21.2", "@eslint/config-helpers": "^0.4.2", "@eslint/core": "^0.17.0", "@eslint/eslintrc": "^3.3.5", "@eslint/js": "9.39.4", "@eslint/plugin-kit": "^0.4.1", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "ajv": "^6.14.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^8.4.0", "eslint-visitor-keys": "^4.2.1", "espree": "^10.4.0", "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.5", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, "peerDependencies": { "jiti": "*" }, "optionalPeers": ["jiti"], "bin": { "eslint": "bin/eslint.js" } }, "sha512-XoMjdBOwe/esVgEvLmNsD3IRHkm7fbKIUGvrleloJXUZgDHig2IPWNniv+GwjyJXzuNqVjlr5+4yVUZjycJwfQ=="], "eslint-config-prettier": ["eslint-config-prettier@9.1.2", "", { "peerDependencies": { "eslint": ">=7.0.0" }, "bin": { "eslint-config-prettier": "bin/cli.js" } }, "sha512-iI1f+D2ViGn+uvv5HuHVUamg8ll4tN+JRHGc6IJi4TP9Kl976C57fzPXgseXNs8v0iA8aSJpHsTWjDb9QJamGQ=="], @@ -759,11 +763,11 @@ "eslint-plugin-unused-imports": ["eslint-plugin-unused-imports@4.4.1", "", { "peerDependencies": { "@typescript-eslint/eslint-plugin": "^8.0.0-0 || ^7.0.0 || ^6.0.0 || ^5.0.0", "eslint": "^10.0.0 || ^9.0.0 || ^8.0.0" }, "optionalPeers": ["@typescript-eslint/eslint-plugin"] }, "sha512-oZGYUz1X3sRMGUB+0cZyK2VcvRX5lm/vB56PgNNcU+7ficUCKm66oZWKUubXWnOuPjQ8PvmXtCViXBMONPe7tQ=="], - "eslint-scope": ["eslint-scope@9.1.2", "", { "dependencies": { "@types/esrecurse": "^4.3.1", "@types/estree": "^1.0.8", "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ=="], + "eslint-scope": ["eslint-scope@8.4.0", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg=="], "eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="], - "espree": ["espree@11.2.0", "", { "dependencies": { "acorn": "^8.16.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^5.0.1" } }, "sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw=="], + "espree": ["espree@10.4.0", "", { "dependencies": { "acorn": "^8.15.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^4.2.1" } }, "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ=="], "esprima": ["esprima@4.0.1", "", { "bin": { "esparse": "./bin/esparse.js", "esvalidate": "./bin/esvalidate.js" } }, "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="], @@ -875,6 +879,8 @@ "glob-parent": ["glob-parent@6.0.2", "", { "dependencies": { "is-glob": "^4.0.3" } }, "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A=="], + "globals": ["globals@14.0.0", "", {}, "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ=="], + "globalthis": ["globalthis@1.0.4", "", { "dependencies": { "define-properties": "^1.2.1", "gopd": "^1.0.1" } }, "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ=="], "globby": ["globby@11.1.0", "", { "dependencies": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", "fast-glob": "^3.2.9", "ignore": "^5.2.0", "merge2": "^1.4.1", "slash": "^3.0.0" } }, "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g=="], @@ -889,6 +895,8 @@ "has-bigints": ["has-bigints@1.1.0", "", {}, "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg=="], + "has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], + "has-property-descriptors": ["has-property-descriptors@1.0.2", "", { "dependencies": { "es-define-property": "^1.0.0" } }, "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg=="], "has-proto": ["has-proto@1.2.0", "", { "dependencies": { "dunder-proto": "^1.0.0" } }, "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ=="], @@ -919,6 +927,8 @@ "immer": ["immer@10.2.0", "", {}, "sha512-d/+XTN3zfODyjr89gM3mPq1WNX2B8pYsu7eORitdwyA2sBubnTl3laYlBk4sXY5FUa5qTZGBDPJICVbvqzjlbw=="], + "import-fresh": ["import-fresh@3.3.1", "", { "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" } }, "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ=="], + "imurmurhash": ["imurmurhash@0.1.4", "", {}, "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA=="], "inherits": ["inherits@2.0.4", "", {}, "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="], @@ -1035,6 +1045,8 @@ "lodash": ["lodash@4.17.23", "", {}, "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w=="], + "lodash.merge": ["lodash.merge@4.6.2", "", {}, "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ=="], + "log-update": ["log-update@8.0.0", "", { "dependencies": { "ansi-escapes": "^7.3.0", "cli-cursor": "^5.0.0", "slice-ansi": "^9.0.0", "string-width": "^8.2.0", "strip-ansi": "^7.2.0", "wrap-ansi": "^10.0.0" } }, "sha512-lddSgOt3bPASrylL54ZSpy8nBHns+vBVSoILlVOx+dei300pnLRN958rj/EdlVLKuWlSESU3qdnDZdAI7FXYGg=="], "longest-streak": ["longest-streak@3.1.0", "", {}, "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g=="], @@ -1237,6 +1249,8 @@ "pako": ["pako@1.0.11", "", {}, "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw=="], + "parent-module": ["parent-module@1.0.1", "", { "dependencies": { "callsites": "^3.0.0" } }, "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g=="], + "parse-bmfont-ascii": ["parse-bmfont-ascii@1.0.6", "", {}, "sha512-U4RrVsUFCleIOBsIGYOMKjn9PavsGOXxbvYGtMOEfnId0SVNsgehXh1DxUdVPLoxd5mvcEtvmKs2Mmf0Mpa1ZA=="], "parse-bmfont-binary": ["parse-bmfont-binary@1.0.6", "", {}, "sha512-GxmsRea0wdGdYthjuUeWTMWPqm2+FAd4GI8vCvhgJsFnoGhTrLhXDDupwTo7rXVAgaLIGoVHDZS9p/5XbSqeWA=="], @@ -1307,9 +1321,9 @@ "postgres-interval": ["postgres-interval@1.2.0", "", { "dependencies": { "xtend": "^4.0.0" } }, "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ=="], - "posthog-node": ["posthog-node@5.36.7", "", { "dependencies": { "@posthog/core": "1.30.13" }, "peerDependencies": { "rxjs": "^7.0.0" }, "optionalPeers": ["rxjs"] }, "sha512-NZJHYJZj/MGAEnDij4ksO38pI7mDmYHtp0/MkjN593x4WKL/GVAAg9PAe5X61tbDq4a02R6E/wlqXWV5vE++QQ=="], + "posthog-node": ["posthog-node@5.36.8", "", { "dependencies": { "@posthog/core": "1.30.14" }, "peerDependencies": { "rxjs": "^7.0.0" }, "optionalPeers": ["rxjs"] }, "sha512-xBdJ3Y5zcveN1QINN39dIiZiCbEhfLeh/4qBiICoLLQOTYfat6zLlwfBmFPcr4hdyQ1nBXh8sIQ9KzSG/zcxpA=="], - "preact": ["preact@10.24.3", "", {}, "sha512-Z2dPnBnMUfyQfSQ+GBdsGa16hz35YmLmtTLhM169uW944hYL6xzTYkJjC07j+Wosz733pMWx0fgON3JNw1jJQA=="], + "preact": ["preact@10.29.2", "", {}, "sha512-7tNmwg/7mzzAoB/8kSg6Hl37JraAZw3Z3A0JSY7VXlZwo82Xn0G7wKbNNs2qoF4ZEEsQGTwDAroNdqKs1ofJxQ=="], "preact-render-to-string": ["preact-render-to-string@5.2.6", "", { "dependencies": { "pretty-format": "^3.8.0" }, "peerDependencies": { "preact": ">=10" } }, "sha512-JyhErpYOvBV1hEPwIxc/fHWXPfnEGdRKxc8gFdAZ7XV4tlzyzG847XAyEZqoDnynP88akM4eaHcSOzNcLWFguw=="], @@ -1381,6 +1395,8 @@ "resolve": ["resolve@2.0.0-next.7", "", { "dependencies": { "es-errors": "^1.3.0", "is-core-module": "^2.16.2", "node-exports-info": "^1.6.0", "object-keys": "^1.1.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-tqt+NBWwyaMgw3zDsnygx4CByWjQEJHOPMdslYhppaQSJUtL/D4JO9CcBBlhPoI8lz9oJIDXkwXfhF4aWqP8xQ=="], + "resolve-from": ["resolve-from@4.0.0", "", {}, "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="], + "resolve-pkg-maps": ["resolve-pkg-maps@1.0.0", "", {}, "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw=="], "restore-cursor": ["restore-cursor@5.1.0", "", { "dependencies": { "onetime": "^7.0.0", "signal-exit": "^4.1.0" } }, "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA=="], @@ -1485,7 +1501,7 @@ "strip-final-newline": ["strip-final-newline@2.0.0", "", {}, "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA=="], - "strip-json-comments": ["strip-json-comments@2.0.1", "", {}, "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ=="], + "strip-json-comments": ["strip-json-comments@3.1.1", "", {}, "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig=="], "stripe": ["stripe@16.12.0", "", { "dependencies": { "@types/node": ">=8.1.0", "qs": "^6.11.0" } }, "sha512-H7eFVLDxeTNNSn4JTRfL2//LzCbDrMSZ+2q1c7CanVWgK2qIW5TwS+0V7N9KcKZZNpYh/uCqK0PyZh/2UsaAtQ=="], @@ -1493,6 +1509,8 @@ "styled-jsx": ["styled-jsx@5.1.6", "", { "dependencies": { "client-only": "0.0.1" }, "peerDependencies": { "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0" } }, "sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA=="], + "supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], + "supports-preserve-symlinks-flag": ["supports-preserve-symlinks-flag@1.0.0", "", {}, "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w=="], "supports-terminal-graphics": ["supports-terminal-graphics@0.1.0", "", {}, "sha512-+KdfozhS0Fw8y5Sghw8kkZNGT8nWYzJ1EzcoIvVjxhl+26TJTs26y02yfBgvc1jh5AS/c8jcI3xtahhR95KRyQ=="], @@ -1639,6 +1657,8 @@ "zwitch": ["zwitch@2.0.4", "", {}, "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A=="], + "@auth/core/preact": ["preact@10.24.3", "", {}, "sha512-Z2dPnBnMUfyQfSQ+GBdsGa16hz35YmLmtTLhM169uW944hYL6xzTYkJjC07j+Wosz733pMWx0fgON3JNw1jJQA=="], + "@auth/core/preact-render-to-string": ["preact-render-to-string@6.5.11", "", { "peerDependencies": { "preact": ">=10" } }, "sha512-ubnauqoGczeGISiOh6RjX0/cdaF8v/oDXIjO85XALCQjwQP+SB4RDXXtvZ6yTYSjG+PC1QRP2AhPgCEsM2EvUw=="], "@codebuff/common/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], @@ -1649,7 +1669,11 @@ "@codebuff/sdk/ignore": ["ignore@7.0.5", "", {}, "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg=="], - "@eslint/config-array/minimatch": ["minimatch@10.2.5", "", { "dependencies": { "brace-expansion": "^5.0.5" } }, "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg=="], + "@eslint/eslintrc/ajv": ["ajv@6.15.0", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw=="], + + "@eslint/eslintrc/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], + + "@eslint/eslintrc/js-yaml": ["js-yaml@4.2.0", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-ePWsvanv0DWuDRsW8dnt+R4jQ31SCRCQ7hhNcPXZPsoBZiemuZNYGf7adZdqX2D86j6rvKp3RpCxVTSb8WQlOw=="], "@opentui/core/diff": ["diff@9.0.0", "", {}, "sha512-svtcdpS8CgJyqAjEQIXdb3OjhFVVYjzGAPO8WGCmRbrml64SPw/jJD4GoE98aR7r25A0XcgrK3F02yw9R/vhQw=="], @@ -1683,11 +1707,11 @@ "eslint/ajv": ["ajv@6.15.0", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw=="], - "eslint/eslint-visitor-keys": ["eslint-visitor-keys@5.0.1", "", {}, "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA=="], + "eslint/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], - "eslint/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], + "eslint/eslint-visitor-keys": ["eslint-visitor-keys@4.2.1", "", {}, "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ=="], - "eslint/minimatch": ["minimatch@10.2.5", "", { "dependencies": { "brace-expansion": "^5.0.5" } }, "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg=="], + "eslint/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], "eslint-import-resolver-node/debug": ["debug@3.2.7", "", { "dependencies": { "ms": "^2.1.1" } }, "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ=="], @@ -1699,7 +1723,7 @@ "eslint-plugin-import/tsconfig-paths": ["tsconfig-paths@3.15.0", "", { "dependencies": { "@types/json5": "^0.0.29", "json5": "^1.0.2", "minimist": "^1.2.6", "strip-bom": "^3.0.0" } }, "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg=="], - "espree/eslint-visitor-keys": ["eslint-visitor-keys@5.0.1", "", {}, "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA=="], + "espree/eslint-visitor-keys": ["eslint-visitor-keys@4.2.1", "", {}, "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ=="], "execa/onetime": ["onetime@5.1.2", "", { "dependencies": { "mimic-fn": "^2.1.0" } }, "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg=="], @@ -1727,12 +1751,16 @@ "plist/xmlbuilder": ["xmlbuilder@15.1.1", "", {}, "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg=="], + "rc/strip-json-comments": ["strip-json-comments@2.0.1", "", {}, "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ=="], + "react-devtools-core/ws": ["ws@7.5.11", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": "^5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-zS54Oen9bITtp7kp2XM3AydrCIq1D+HwJOuH+c+e4LfpL/lotP5osijd+UoMnxwAam1GN8R4KtLAyIrIcBNpiA=="], "react-reconciler/scheduler": ["scheduler@0.26.0", "", {}, "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA=="], "send/mime-types": ["mime-types@3.0.2", "", { "dependencies": { "mime-db": "^1.54.0" } }, "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A=="], + "slice-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], + "tar-stream/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=="], "ts-node/diff": ["diff@4.0.4", "", {}, "sha512-X07nttJQkwkfKfvTPG/KSnE2OMdcUCao6+eXF3wmnIQRn2aPAHH3VxDbDOdegkd6JbPsXqShpvEOHfAT+nCNwQ=="], @@ -1747,6 +1775,8 @@ "typescript-eslint/@typescript-eslint/utils": ["@typescript-eslint/utils@7.18.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@typescript-eslint/scope-manager": "7.18.0", "@typescript-eslint/types": "7.18.0", "@typescript-eslint/typescript-estree": "7.18.0" }, "peerDependencies": { "eslint": "^8.56.0" } }, "sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw=="], + "wrap-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], + "wrap-ansi/string-width": ["string-width@8.2.1", "", { "dependencies": { "get-east-asian-width": "^1.5.0", "strip-ansi": "^7.1.2" } }, "sha512-IIaP0g3iy9Cyy18w3M9YcaDudujEAVHKt3a3QJg1+sr/oX96TbaGUubG0hJyCjCBThFH+tFpcIyoUHUn1ogaLA=="], "yargs/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], @@ -1755,7 +1785,9 @@ "@codebuff/evals/pino/process-warning": ["process-warning@5.0.0", "", {}, "sha512-a39t9ApHNx2L4+HBnQKqxxHNs1r7KF+Intd8Q/g1bUh6q0WIp9voPXJ/x0j+ZL45KF1pJd9+q2jLIRMfvEshkA=="], - "@eslint/config-array/minimatch/brace-expansion": ["brace-expansion@5.0.6", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g=="], + "@eslint/eslintrc/ajv/json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], + + "@eslint/eslintrc/js-yaml/argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="], "@typescript-eslint/parser/@typescript-eslint/typescript-estree/minimatch": ["minimatch@9.0.9", "", { "dependencies": { "brace-expansion": "^2.0.2" } }, "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg=="], @@ -1769,14 +1801,10 @@ "cliui/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], - "cliui/wrap-ansi/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], - "eslint-plugin-import/tsconfig-paths/json5": ["json5@1.0.2", "", { "dependencies": { "minimist": "^1.2.0" }, "bin": { "json5": "lib/cli.js" } }, "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA=="], "eslint/ajv/json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], - "eslint/minimatch/brace-expansion": ["brace-expansion@5.0.6", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g=="], - "express/mime-types/mime-db": ["mime-db@1.54.0", "", {}, "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ=="], "p-locate/p-limit/yocto-queue": ["yocto-queue@0.1.0", "", {}, "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="], @@ -1805,12 +1833,8 @@ "yargs/string-width/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], - "@eslint/config-array/minimatch/brace-expansion/balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="], - "@typescript-eslint/parser/@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.1.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-WR1cURNjuvBLMZBMbqM0UoE+WAfdUcEV1ccD8PVBVOI+Z3ND4+SZbN8RsfT2bMuG1qwz5RFvPukSZm5fF2D5eA=="], - "eslint/minimatch/brace-expansion/balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="], - "typescript-eslint/@typescript-eslint/eslint-plugin/@typescript-eslint/scope-manager/@typescript-eslint/types": ["@typescript-eslint/types@7.18.0", "", {}, "sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ=="], "typescript-eslint/@typescript-eslint/eslint-plugin/@typescript-eslint/type-utils/@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@7.18.0", "", { "dependencies": { "@typescript-eslint/types": "7.18.0", "@typescript-eslint/visitor-keys": "7.18.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", "minimatch": "^9.0.4", "semver": "^7.6.0", "ts-api-utils": "^1.3.0" } }, "sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA=="], From 7bc22fb50f5e47cc015014545acc3dd5ff6477b1 Mon Sep 17 00:00:00 2001 From: codebuff public sync bot <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 9 Jun 2026 20:19:41 +0000 Subject: [PATCH 37/96] Sync public snapshot from freebuff-private Source: CodebuffAI/freebuff-private@ce7dccf57e5876351c210a3d611a03e4108bf2fb --- bun.lock | 74 +++++++------------- common/src/__tests__/freebuff-models.test.ts | 59 +++++++++++----- common/src/constants/freebuff-models.ts | 12 ++-- 3 files changed, 74 insertions(+), 71 deletions(-) diff --git a/bun.lock b/bun.lock index b2c0dd2e39..7ab3f25c53 100644 --- a/bun.lock +++ b/bun.lock @@ -239,19 +239,15 @@ "@eslint-community/regexpp": ["@eslint-community/regexpp@4.12.2", "", {}, "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew=="], - "@eslint/config-array": ["@eslint/config-array@0.21.2", "", { "dependencies": { "@eslint/object-schema": "^2.1.7", "debug": "^4.3.1", "minimatch": "^3.1.5" } }, "sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw=="], + "@eslint/config-array": ["@eslint/config-array@0.23.5", "", { "dependencies": { "@eslint/object-schema": "^3.0.5", "debug": "^4.3.1", "minimatch": "^10.2.4" } }, "sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA=="], - "@eslint/config-helpers": ["@eslint/config-helpers@0.4.2", "", { "dependencies": { "@eslint/core": "^0.17.0" } }, "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw=="], + "@eslint/config-helpers": ["@eslint/config-helpers@0.6.0", "", { "dependencies": { "@eslint/core": "^1.2.1" } }, "sha512-ii6Bw9jJ2zi2cWA2Z+9/QZ/+3DX6kwaV5Q986D/CdP3Lap3w/pgQZ373FV7byY/i7L4IRH/G43I5dz1ClsCbpA=="], - "@eslint/core": ["@eslint/core@0.17.0", "", { "dependencies": { "@types/json-schema": "^7.0.15" } }, "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ=="], + "@eslint/core": ["@eslint/core@1.2.1", "", { "dependencies": { "@types/json-schema": "^7.0.15" } }, "sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ=="], - "@eslint/eslintrc": ["@eslint/eslintrc@3.3.5", "", { "dependencies": { "ajv": "^6.14.0", "debug": "^4.3.2", "espree": "^10.0.1", "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.1", "minimatch": "^3.1.5", "strip-json-comments": "^3.1.1" } }, "sha512-4IlJx0X0qftVsN5E+/vGujTRIFtwuLbNsVUe7TO6zYPDR1O6nFwvwhIKEKSrl6dZchmYBITazxKoUYOjdtjlRg=="], + "@eslint/object-schema": ["@eslint/object-schema@3.0.5", "", {}, "sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw=="], - "@eslint/js": ["@eslint/js@9.39.4", "", {}, "sha512-nE7DEIchvtiFTwBw4Lfbu59PG+kCofhjsKaCWzxTpt4lfRjRMqG6uMBzKXuEcyXhOHoUp9riAm7/aWYGhXZ9cw=="], - - "@eslint/object-schema": ["@eslint/object-schema@2.1.7", "", {}, "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA=="], - - "@eslint/plugin-kit": ["@eslint/plugin-kit@0.4.1", "", { "dependencies": { "@eslint/core": "^0.17.0", "levn": "^0.4.1" } }, "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA=="], + "@eslint/plugin-kit": ["@eslint/plugin-kit@0.7.2", "", { "dependencies": { "@eslint/core": "^1.2.1", "levn": "^0.4.1" } }, "sha512-+CNAzxglkrpNf/kKywqQfk74QjtceuOE7Qm+AF8miRvPF/wmmK5+OJOgVh3AVTT3RP2mH3+FOaxlE5v72owk0A=="], "@gravity-ai/api": ["@gravity-ai/api@0.1.2", "", { "dependencies": { "axios": "^1.13.2" } }, "sha512-txsAhyzvwB/TNrj5R8DoNqw8afM3JY2ahl7aaeaD5ZsxP+7rxff7C7keGI7+gU2KT3d2Mcw4QB1nHhbTSCJYHw=="], @@ -467,6 +463,8 @@ "@types/diff": ["@types/diff@8.0.0", "", { "dependencies": { "diff": "*" } }, "sha512-o7jqJM04gfaYrdCecCVMbZhNdG6T1MHg/oQoRFdERLV+4d+V7FijhiEAbFu0Usww84Yijk9yH58U4Jk4HbtzZw=="], + "@types/esrecurse": ["@types/esrecurse@4.3.1", "", {}, "sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw=="], + "@types/estree": ["@types/estree@1.0.9", "", {}, "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg=="], "@types/js-yaml": ["@types/js-yaml@4.0.9", "", {}, "sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg=="], @@ -549,7 +547,7 @@ "ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="], - "ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + "ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], "any-base": ["any-base@1.1.0", "", {}, "sha512-uMgjozySS8adZZYePpaWs8cxB9/kdzmpX6SgJZ+wbz1K5eYk5QMYDVJaZKhxyIHUdnnJkfR7SVgStgH7LkGUyg=="], @@ -625,8 +623,6 @@ "call-bound": ["call-bound@1.0.4", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "get-intrinsic": "^1.3.0" } }, "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg=="], - "callsites": ["callsites@3.1.0", "", {}, "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="], - "caniuse-lite": ["caniuse-lite@1.0.30001797", "", {}, "sha512-l8xKG+gwAIExZGl9FrF7KUwuOmk6wbEPC9Xoy/RtnWv1XG0Q4LFlagaLpUv3Kiza3W/wm27zy0yWJEieYKAP6w=="], "canvas": ["canvas@3.2.3", "", { "dependencies": { "node-addon-api": "^7.0.0", "prebuild-install": "^7.1.3" } }, "sha512-PzE5nJZPz72YUAfo8oTp0u3fqqY7IzlTubneAihqDYAUcBk7ryeCmBbdJBEdaH0bptSOe2VT2Zwcb3UaFyaSWw=="], @@ -751,7 +747,7 @@ "escape-string-regexp": ["escape-string-regexp@4.0.0", "", {}, "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="], - "eslint": ["eslint@9.39.4", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", "@eslint/config-array": "^0.21.2", "@eslint/config-helpers": "^0.4.2", "@eslint/core": "^0.17.0", "@eslint/eslintrc": "^3.3.5", "@eslint/js": "9.39.4", "@eslint/plugin-kit": "^0.4.1", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "ajv": "^6.14.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^8.4.0", "eslint-visitor-keys": "^4.2.1", "espree": "^10.4.0", "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.5", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, "peerDependencies": { "jiti": "*" }, "optionalPeers": ["jiti"], "bin": { "eslint": "bin/eslint.js" } }, "sha512-XoMjdBOwe/esVgEvLmNsD3IRHkm7fbKIUGvrleloJXUZgDHig2IPWNniv+GwjyJXzuNqVjlr5+4yVUZjycJwfQ=="], + "eslint": ["eslint@10.4.1", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.2", "@eslint/config-array": "^0.23.5", "@eslint/config-helpers": "^0.6.0", "@eslint/core": "^1.2.1", "@eslint/plugin-kit": "^0.7.2", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "ajv": "^6.14.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^9.1.2", "eslint-visitor-keys": "^5.0.1", "espree": "^11.2.0", "esquery": "^1.7.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "minimatch": "^10.2.4", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, "peerDependencies": { "jiti": "*" }, "optionalPeers": ["jiti"], "bin": { "eslint": "bin/eslint.js" } }, "sha512-AyIKhnOBuOAdueD7RB3xB+YeAWScb9jHsJBgH2Hcde8InP5JYhqrRR6iTMHyTEwgENK54Cp44e4v8BwNhsuHuw=="], "eslint-config-prettier": ["eslint-config-prettier@9.1.2", "", { "peerDependencies": { "eslint": ">=7.0.0" }, "bin": { "eslint-config-prettier": "bin/cli.js" } }, "sha512-iI1f+D2ViGn+uvv5HuHVUamg8ll4tN+JRHGc6IJi4TP9Kl976C57fzPXgseXNs8v0iA8aSJpHsTWjDb9QJamGQ=="], @@ -763,11 +759,11 @@ "eslint-plugin-unused-imports": ["eslint-plugin-unused-imports@4.4.1", "", { "peerDependencies": { "@typescript-eslint/eslint-plugin": "^8.0.0-0 || ^7.0.0 || ^6.0.0 || ^5.0.0", "eslint": "^10.0.0 || ^9.0.0 || ^8.0.0" }, "optionalPeers": ["@typescript-eslint/eslint-plugin"] }, "sha512-oZGYUz1X3sRMGUB+0cZyK2VcvRX5lm/vB56PgNNcU+7ficUCKm66oZWKUubXWnOuPjQ8PvmXtCViXBMONPe7tQ=="], - "eslint-scope": ["eslint-scope@8.4.0", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg=="], + "eslint-scope": ["eslint-scope@9.1.2", "", { "dependencies": { "@types/esrecurse": "^4.3.1", "@types/estree": "^1.0.8", "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ=="], "eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="], - "espree": ["espree@10.4.0", "", { "dependencies": { "acorn": "^8.15.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^4.2.1" } }, "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ=="], + "espree": ["espree@11.2.0", "", { "dependencies": { "acorn": "^8.16.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^5.0.1" } }, "sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw=="], "esprima": ["esprima@4.0.1", "", { "bin": { "esparse": "./bin/esparse.js", "esvalidate": "./bin/esvalidate.js" } }, "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="], @@ -879,8 +875,6 @@ "glob-parent": ["glob-parent@6.0.2", "", { "dependencies": { "is-glob": "^4.0.3" } }, "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A=="], - "globals": ["globals@14.0.0", "", {}, "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ=="], - "globalthis": ["globalthis@1.0.4", "", { "dependencies": { "define-properties": "^1.2.1", "gopd": "^1.0.1" } }, "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ=="], "globby": ["globby@11.1.0", "", { "dependencies": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", "fast-glob": "^3.2.9", "ignore": "^5.2.0", "merge2": "^1.4.1", "slash": "^3.0.0" } }, "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g=="], @@ -895,8 +889,6 @@ "has-bigints": ["has-bigints@1.1.0", "", {}, "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg=="], - "has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], - "has-property-descriptors": ["has-property-descriptors@1.0.2", "", { "dependencies": { "es-define-property": "^1.0.0" } }, "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg=="], "has-proto": ["has-proto@1.2.0", "", { "dependencies": { "dunder-proto": "^1.0.0" } }, "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ=="], @@ -927,8 +919,6 @@ "immer": ["immer@10.2.0", "", {}, "sha512-d/+XTN3zfODyjr89gM3mPq1WNX2B8pYsu7eORitdwyA2sBubnTl3laYlBk4sXY5FUa5qTZGBDPJICVbvqzjlbw=="], - "import-fresh": ["import-fresh@3.3.1", "", { "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" } }, "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ=="], - "imurmurhash": ["imurmurhash@0.1.4", "", {}, "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA=="], "inherits": ["inherits@2.0.4", "", {}, "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="], @@ -1045,8 +1035,6 @@ "lodash": ["lodash@4.17.23", "", {}, "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w=="], - "lodash.merge": ["lodash.merge@4.6.2", "", {}, "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ=="], - "log-update": ["log-update@8.0.0", "", { "dependencies": { "ansi-escapes": "^7.3.0", "cli-cursor": "^5.0.0", "slice-ansi": "^9.0.0", "string-width": "^8.2.0", "strip-ansi": "^7.2.0", "wrap-ansi": "^10.0.0" } }, "sha512-lddSgOt3bPASrylL54ZSpy8nBHns+vBVSoILlVOx+dei300pnLRN958rj/EdlVLKuWlSESU3qdnDZdAI7FXYGg=="], "longest-streak": ["longest-streak@3.1.0", "", {}, "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g=="], @@ -1249,8 +1237,6 @@ "pako": ["pako@1.0.11", "", {}, "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw=="], - "parent-module": ["parent-module@1.0.1", "", { "dependencies": { "callsites": "^3.0.0" } }, "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g=="], - "parse-bmfont-ascii": ["parse-bmfont-ascii@1.0.6", "", {}, "sha512-U4RrVsUFCleIOBsIGYOMKjn9PavsGOXxbvYGtMOEfnId0SVNsgehXh1DxUdVPLoxd5mvcEtvmKs2Mmf0Mpa1ZA=="], "parse-bmfont-binary": ["parse-bmfont-binary@1.0.6", "", {}, "sha512-GxmsRea0wdGdYthjuUeWTMWPqm2+FAd4GI8vCvhgJsFnoGhTrLhXDDupwTo7rXVAgaLIGoVHDZS9p/5XbSqeWA=="], @@ -1395,8 +1381,6 @@ "resolve": ["resolve@2.0.0-next.7", "", { "dependencies": { "es-errors": "^1.3.0", "is-core-module": "^2.16.2", "node-exports-info": "^1.6.0", "object-keys": "^1.1.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-tqt+NBWwyaMgw3zDsnygx4CByWjQEJHOPMdslYhppaQSJUtL/D4JO9CcBBlhPoI8lz9oJIDXkwXfhF4aWqP8xQ=="], - "resolve-from": ["resolve-from@4.0.0", "", {}, "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="], - "resolve-pkg-maps": ["resolve-pkg-maps@1.0.0", "", {}, "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw=="], "restore-cursor": ["restore-cursor@5.1.0", "", { "dependencies": { "onetime": "^7.0.0", "signal-exit": "^4.1.0" } }, "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA=="], @@ -1501,7 +1485,7 @@ "strip-final-newline": ["strip-final-newline@2.0.0", "", {}, "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA=="], - "strip-json-comments": ["strip-json-comments@3.1.1", "", {}, "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig=="], + "strip-json-comments": ["strip-json-comments@2.0.1", "", {}, "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ=="], "stripe": ["stripe@16.12.0", "", { "dependencies": { "@types/node": ">=8.1.0", "qs": "^6.11.0" } }, "sha512-H7eFVLDxeTNNSn4JTRfL2//LzCbDrMSZ+2q1c7CanVWgK2qIW5TwS+0V7N9KcKZZNpYh/uCqK0PyZh/2UsaAtQ=="], @@ -1509,8 +1493,6 @@ "styled-jsx": ["styled-jsx@5.1.6", "", { "dependencies": { "client-only": "0.0.1" }, "peerDependencies": { "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0" } }, "sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA=="], - "supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], - "supports-preserve-symlinks-flag": ["supports-preserve-symlinks-flag@1.0.0", "", {}, "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w=="], "supports-terminal-graphics": ["supports-terminal-graphics@0.1.0", "", {}, "sha512-+KdfozhS0Fw8y5Sghw8kkZNGT8nWYzJ1EzcoIvVjxhl+26TJTs26y02yfBgvc1jh5AS/c8jcI3xtahhR95KRyQ=="], @@ -1669,11 +1651,7 @@ "@codebuff/sdk/ignore": ["ignore@7.0.5", "", {}, "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg=="], - "@eslint/eslintrc/ajv": ["ajv@6.15.0", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw=="], - - "@eslint/eslintrc/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], - - "@eslint/eslintrc/js-yaml": ["js-yaml@4.2.0", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-ePWsvanv0DWuDRsW8dnt+R4jQ31SCRCQ7hhNcPXZPsoBZiemuZNYGf7adZdqX2D86j6rvKp3RpCxVTSb8WQlOw=="], + "@eslint/config-array/minimatch": ["minimatch@10.2.5", "", { "dependencies": { "brace-expansion": "^5.0.5" } }, "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg=="], "@opentui/core/diff": ["diff@9.0.0", "", {}, "sha512-svtcdpS8CgJyqAjEQIXdb3OjhFVVYjzGAPO8WGCmRbrml64SPw/jJD4GoE98aR7r25A0XcgrK3F02yw9R/vhQw=="], @@ -1707,12 +1685,12 @@ "eslint/ajv": ["ajv@6.15.0", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw=="], - "eslint/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], - - "eslint/eslint-visitor-keys": ["eslint-visitor-keys@4.2.1", "", {}, "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ=="], + "eslint/eslint-visitor-keys": ["eslint-visitor-keys@5.0.1", "", {}, "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA=="], "eslint/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], + "eslint/minimatch": ["minimatch@10.2.5", "", { "dependencies": { "brace-expansion": "^5.0.5" } }, "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg=="], + "eslint-import-resolver-node/debug": ["debug@3.2.7", "", { "dependencies": { "ms": "^2.1.1" } }, "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ=="], "eslint-module-utils/debug": ["debug@3.2.7", "", { "dependencies": { "ms": "^2.1.1" } }, "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ=="], @@ -1723,7 +1701,7 @@ "eslint-plugin-import/tsconfig-paths": ["tsconfig-paths@3.15.0", "", { "dependencies": { "@types/json5": "^0.0.29", "json5": "^1.0.2", "minimist": "^1.2.6", "strip-bom": "^3.0.0" } }, "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg=="], - "espree/eslint-visitor-keys": ["eslint-visitor-keys@4.2.1", "", {}, "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ=="], + "espree/eslint-visitor-keys": ["eslint-visitor-keys@5.0.1", "", {}, "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA=="], "execa/onetime": ["onetime@5.1.2", "", { "dependencies": { "mimic-fn": "^2.1.0" } }, "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg=="], @@ -1751,16 +1729,12 @@ "plist/xmlbuilder": ["xmlbuilder@15.1.1", "", {}, "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg=="], - "rc/strip-json-comments": ["strip-json-comments@2.0.1", "", {}, "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ=="], - "react-devtools-core/ws": ["ws@7.5.11", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": "^5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-zS54Oen9bITtp7kp2XM3AydrCIq1D+HwJOuH+c+e4LfpL/lotP5osijd+UoMnxwAam1GN8R4KtLAyIrIcBNpiA=="], "react-reconciler/scheduler": ["scheduler@0.26.0", "", {}, "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA=="], "send/mime-types": ["mime-types@3.0.2", "", { "dependencies": { "mime-db": "^1.54.0" } }, "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A=="], - "slice-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], - "tar-stream/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=="], "ts-node/diff": ["diff@4.0.4", "", {}, "sha512-X07nttJQkwkfKfvTPG/KSnE2OMdcUCao6+eXF3wmnIQRn2aPAHH3VxDbDOdegkd6JbPsXqShpvEOHfAT+nCNwQ=="], @@ -1775,8 +1749,6 @@ "typescript-eslint/@typescript-eslint/utils": ["@typescript-eslint/utils@7.18.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@typescript-eslint/scope-manager": "7.18.0", "@typescript-eslint/types": "7.18.0", "@typescript-eslint/typescript-estree": "7.18.0" }, "peerDependencies": { "eslint": "^8.56.0" } }, "sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw=="], - "wrap-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], - "wrap-ansi/string-width": ["string-width@8.2.1", "", { "dependencies": { "get-east-asian-width": "^1.5.0", "strip-ansi": "^7.1.2" } }, "sha512-IIaP0g3iy9Cyy18w3M9YcaDudujEAVHKt3a3QJg1+sr/oX96TbaGUubG0hJyCjCBThFH+tFpcIyoUHUn1ogaLA=="], "yargs/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], @@ -1785,9 +1757,7 @@ "@codebuff/evals/pino/process-warning": ["process-warning@5.0.0", "", {}, "sha512-a39t9ApHNx2L4+HBnQKqxxHNs1r7KF+Intd8Q/g1bUh6q0WIp9voPXJ/x0j+ZL45KF1pJd9+q2jLIRMfvEshkA=="], - "@eslint/eslintrc/ajv/json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], - - "@eslint/eslintrc/js-yaml/argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="], + "@eslint/config-array/minimatch/brace-expansion": ["brace-expansion@5.0.6", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g=="], "@typescript-eslint/parser/@typescript-eslint/typescript-estree/minimatch": ["minimatch@9.0.9", "", { "dependencies": { "brace-expansion": "^2.0.2" } }, "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg=="], @@ -1801,10 +1771,14 @@ "cliui/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], + "cliui/wrap-ansi/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + "eslint-plugin-import/tsconfig-paths/json5": ["json5@1.0.2", "", { "dependencies": { "minimist": "^1.2.0" }, "bin": { "json5": "lib/cli.js" } }, "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA=="], "eslint/ajv/json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], + "eslint/minimatch/brace-expansion": ["brace-expansion@5.0.6", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g=="], + "express/mime-types/mime-db": ["mime-db@1.54.0", "", {}, "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ=="], "p-locate/p-limit/yocto-queue": ["yocto-queue@0.1.0", "", {}, "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="], @@ -1833,8 +1807,12 @@ "yargs/string-width/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + "@eslint/config-array/minimatch/brace-expansion/balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="], + "@typescript-eslint/parser/@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.1.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-WR1cURNjuvBLMZBMbqM0UoE+WAfdUcEV1ccD8PVBVOI+Z3ND4+SZbN8RsfT2bMuG1qwz5RFvPukSZm5fF2D5eA=="], + "eslint/minimatch/brace-expansion/balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="], + "typescript-eslint/@typescript-eslint/eslint-plugin/@typescript-eslint/scope-manager/@typescript-eslint/types": ["@typescript-eslint/types@7.18.0", "", {}, "sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ=="], "typescript-eslint/@typescript-eslint/eslint-plugin/@typescript-eslint/type-utils/@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@7.18.0", "", { "dependencies": { "@typescript-eslint/types": "7.18.0", "@typescript-eslint/visitor-keys": "7.18.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", "minimatch": "^9.0.4", "semver": "^7.6.0", "ts-api-utils": "^1.3.0" } }, "sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA=="], diff --git a/common/src/__tests__/freebuff-models.test.ts b/common/src/__tests__/freebuff-models.test.ts index 5e1e96c516..ea1f3f64c9 100644 --- a/common/src/__tests__/freebuff-models.test.ts +++ b/common/src/__tests__/freebuff-models.test.ts @@ -90,27 +90,45 @@ describe('freebuff model availability', () => { expect(isFreebuffPremiumModelId(FREEBUFF_MIMO_V25_MODEL_ID)).toBe(false) }) - test('Kimi and MiniMax M2.7 are selectable in full mode', () => { - for (const restoredModel of [ + test('Kimi is selectable in full mode', () => { + expect(SUPPORTED_FREEBUFF_MODELS.map((model) => model.id)).toContain( + FREEBUFF_KIMI_MODEL_ID, + ) + expect(FREEBUFF_MODELS.map((model) => model.id)).toContain( FREEBUFF_KIMI_MODEL_ID, + ) + expect(getFreebuffModelsForAccessTier('full').map((m) => m.id)).toContain( + FREEBUFF_KIMI_MODEL_ID, + ) + expect(isFreebuffModelId(FREEBUFF_KIMI_MODEL_ID)).toBe(true) + expect(isSupportedFreebuffModelId(FREEBUFF_KIMI_MODEL_ID)).toBe(true) + expect( + isFreebuffModelAllowedForAccessTier(FREEBUFF_KIMI_MODEL_ID, 'full'), + ).toBe(true) + }) + + test('MiniMax M2.7 is legacy: hidden from pickers but still served for old clients', () => { + expect(SUPPORTED_FREEBUFF_MODELS.map((model) => model.id)).toContain( FREEBUFF_MINIMAX_MODEL_ID, - ]) { - expect(SUPPORTED_FREEBUFF_MODELS.map((model) => model.id)).toContain( - restoredModel, - ) - expect(FREEBUFF_MODELS.map((model) => model.id)).toContain(restoredModel) - expect(getFreebuffModelsForAccessTier('full').map((m) => m.id)).toContain( - restoredModel, - ) - expect(isFreebuffModelId(restoredModel)).toBe(true) - expect(isSupportedFreebuffModelId(restoredModel)).toBe(true) - expect(isFreebuffModelAllowedForAccessTier(restoredModel, 'full')).toBe( - true, - ) - } + ) + expect(FREEBUFF_MODELS.map((model) => model.id)).not.toContain( + FREEBUFF_MINIMAX_MODEL_ID, + ) + expect( + getFreebuffModelsForAccessTier('full').map((m) => m.id), + ).not.toContain(FREEBUFF_MINIMAX_MODEL_ID) + expect(isFreebuffModelId(FREEBUFF_MINIMAX_MODEL_ID)).toBe(false) + expect(isSupportedFreebuffModelId(FREEBUFF_MINIMAX_MODEL_ID)).toBe(true) + // Old clients with a saved M2.7 selection must still be admitted. + expect( + isFreebuffModelAllowedForAccessTier(FREEBUFF_MINIMAX_MODEL_ID, 'full'), + ).toBe(true) + expect( + resolveFreebuffModelForAccessTier(FREEBUFF_MINIMAX_MODEL_ID, 'full'), + ).toBe(FREEBUFF_MINIMAX_MODEL_ID) }) - test('MiniMax M3 is a selectable premium model in full mode', () => { + test('MiniMax M3 is a selectable unlimited model, last in the unlimited section', () => { expect(SUPPORTED_FREEBUFF_MODELS.map((model) => model.id)).toContain( MINIMAX_M3_MODEL_ID, ) @@ -122,10 +140,15 @@ describe('freebuff model availability', () => { ).toContain(MINIMAX_M3_MODEL_ID) expect(isFreebuffModelId(MINIMAX_M3_MODEL_ID)).toBe(true) expect(isSupportedFreebuffModelId(MINIMAX_M3_MODEL_ID)).toBe(true) - expect(isFreebuffPremiumModelId(MINIMAX_M3_MODEL_ID)).toBe(true) + expect(isFreebuffPremiumModelId(MINIMAX_M3_MODEL_ID)).toBe(false) expect( isFreebuffModelAllowedForAccessTier(MINIMAX_M3_MODEL_ID, 'full'), ).toBe(true) + // Pickers split sections by the premium flag while preserving array order, + // so "last unlimited entry" means last in FREEBUFF_MODELS overall. + expect(FREEBUFF_MODELS[FREEBUFF_MODELS.length - 1]!.id).toBe( + MINIMAX_M3_MODEL_ID, + ) }) test('limited access exposes DeepSeek V4 Flash and non-Pro MiMo 2.5', () => { diff --git a/common/src/constants/freebuff-models.ts b/common/src/constants/freebuff-models.ts index 2a62e6f240..03b5a2c2bb 100644 --- a/common/src/constants/freebuff-models.ts +++ b/common/src/constants/freebuff-models.ts @@ -45,8 +45,11 @@ export const FREEBUFF_GEMINI_PRO_MODEL_ID = 'google/gemini-3.1-pro-preview' export const FREEBUFF_DEEPSEEK_V4_PRO_MODEL_ID = 'deepseek/deepseek-v4-pro' export const FREEBUFF_DEEPSEEK_V4_FLASH_MODEL_ID = 'deepseek/deepseek-v4-flash' export const FREEBUFF_KIMI_MODEL_ID = 'moonshotai/kimi-k2.6' +/** Legacy: removed from the pickers on 2026-06-09 in favor of MiniMax M3, but + * still server-supported so old clients keep working. Drop from + * SUPPORTED_FREEBUFF_MODELS after ~2026-06-16. */ export const FREEBUFF_MINIMAX_MODEL_ID = 'minimax/minimax-m2.7' -/** Premium tier; routes to MiniMax's official API (distinct from the m2.7 id). */ +/** Routes to MiniMax's official API (distinct from the m2.7 id). */ export const FREEBUFF_MINIMAX_M3_MODEL_ID = minimaxModels.minimaxM3 export const FREEBUFF_MIMO_V25_MODEL_ID = mimoModels.mimoV25 export const FREEBUFF_MIMO_V25_PRO_MODEL_ID = mimoModels.mimoV25Pro @@ -141,6 +144,7 @@ const DEEPSEEK_V4_FLASH_MODEL = { multimodal: false, } as const satisfies FreebuffModelOption +/** Legacy (not in FREEBUFF_MODELS): see FREEBUFF_MINIMAX_MODEL_ID. */ const MINIMAX_MODEL = { id: FREEBUFF_MINIMAX_MODEL_ID, displayName: 'MiniMax M2.7', @@ -156,7 +160,7 @@ const MINIMAX_M3_MODEL = { tagline: 'Smartest & multimodal', availability: 'always', warning: 'Collects data for training', - premium: true, + premium: false, multimodal: true, } as const satisfies FreebuffModelOption @@ -172,19 +176,17 @@ export const SUPPORTED_FREEBUFF_MODELS = [ export const FREEBUFF_MODELS = [ DEEPSEEK_V4_PRO_MODEL, - MINIMAX_M3_MODEL, ...(FREEBUFF_ENABLE_MIMO_MODELS_IN_UI ? [MIMO_V25_PRO_MODEL] : []), KIMI_MODEL, DEEPSEEK_V4_FLASH_MODEL, ...(FREEBUFF_ENABLE_MIMO_MODELS_IN_UI ? [MIMO_V25_MODEL] : []), - MINIMAX_MODEL, + MINIMAX_M3_MODEL, ] as const satisfies readonly FreebuffModelOption[] export const FREEBUFF_PREMIUM_MODEL_IDS = [ FREEBUFF_DEEPSEEK_V4_PRO_MODEL_ID, FREEBUFF_MIMO_V25_PRO_MODEL_ID, FREEBUFF_KIMI_MODEL_ID, - FREEBUFF_MINIMAX_M3_MODEL_ID, ] as const /** Models that accept image input. Used to decide whether uploaded images are From e6e8dcec85339df7974f95b08c8c3a1875269f9a Mon Sep 17 00:00:00 2001 From: codebuff public sync bot <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 9 Jun 2026 21:13:21 +0000 Subject: [PATCH 38/96] Sync public snapshot from freebuff-private Source: CodebuffAI/freebuff-private@9b417906d73d17ba8bbdbf7cc6dc71ada7457278 --- freebuff/cli/release/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/freebuff/cli/release/package.json b/freebuff/cli/release/package.json index 3de66a1637..db4f8df4ae 100644 --- a/freebuff/cli/release/package.json +++ b/freebuff/cli/release/package.json @@ -1,6 +1,6 @@ { "name": "freebuff", - "version": "0.0.104", + "version": "0.0.105", "description": "The world's strongest free coding agent", "license": "MIT", "bin": { From b55c953b89b0dff5b1237baa079b940cf672148d Mon Sep 17 00:00:00 2001 From: codebuff public sync bot <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 9 Jun 2026 21:29:32 +0000 Subject: [PATCH 39/96] Sync public snapshot from freebuff-private Source: CodebuffAI/freebuff-private@9c499d985d8a4c4dd6dcb0540848cc29362778ab --- bun.lock | 20 ++++++++++---------- common/src/__tests__/freebuff-models.test.ts | 4 ++-- common/src/constants/freebuff-models.ts | 2 +- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/bun.lock b/bun.lock index 7ab3f25c53..b7623ef932 100644 --- a/bun.lock +++ b/bun.lock @@ -381,23 +381,23 @@ "@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.29.0", "", { "dependencies": { "@hono/node-server": "^1.19.9", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.2.1", "express-rate-limit": "^8.2.1", "hono": "^4.11.4", "jose": "^6.1.3", "json-schema-typed": "^8.0.2", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.25 || ^4.0", "zod-to-json-schema": "^3.25.1" }, "peerDependencies": { "@cfworker/json-schema": "^4.1.1" }, "optionalPeers": ["@cfworker/json-schema"] }, "sha512-zo37mZA9hJWpULgkRpowewez1y6ML5GsXJPY8FI0tBBCd77HEvza4jDqRKOXgHNn867PVGCyTdzqpz0izu5ZjQ=="], - "@next/env": ["@next/env@16.2.7", "", {}, "sha512-tMJizPlj6ZYpBMMdK8S0LJufrP4QTdR6pcv9KQ/bVETPAmg0j1mlHE9G2c38UyGHxoBapgwuj7XjbGJ2RcDFOg=="], + "@next/env": ["@next/env@16.2.8", "", {}, "sha512-oxK5nEvPI8hlJ9LJ7PCNWfh07oKGxSeb7QaUUlamK7M5jDEV3twreCVqLFaxKgMI1DJgxhqDSdEtVpqLhN6yeQ=="], - "@next/swc-darwin-arm64": ["@next/swc-darwin-arm64@16.2.7", "", { "os": "darwin", "cpu": "arm64" }, "sha512-vm1EDI/pVaBNNiychmxk3fft+OhQPVD9cIM/tReLZIQ3TfQ4kqI9DwKk00dzuS1ulC7icbrzCFrmRRlk9PfNdw=="], + "@next/swc-darwin-arm64": ["@next/swc-darwin-arm64@16.2.8", "", { "os": "darwin", "cpu": "arm64" }, "sha512-R/MDVX4Cj+bzvTNkDWNyA09yCPBZB0J1m8P3VAmWAzx/J7DctA1wxya1LU3CcPv2szER3AImHEtsgScauH8SsQ=="], - "@next/swc-darwin-x64": ["@next/swc-darwin-x64@16.2.7", "", { "os": "darwin", "cpu": "x64" }, "sha512-O3IRSv1ZBL1zs0WrIgefTEcTKFVn+ryxBNe54erJ6KsD+2f/Mmt7g2jOYh8PSBdUwPtKQJuCsTMlZ7tIu2AcsQ=="], + "@next/swc-darwin-x64": ["@next/swc-darwin-x64@16.2.8", "", { "os": "darwin", "cpu": "x64" }, "sha512-XH2u8C/meLJmEZbN0G5MRZp8tvxBz5KQ+xv4vX34zL8gL3//5qkc5M/aLsvNAfg5/KbcjIVe3h6aiO0wJcNWKA=="], - "@next/swc-linux-arm64-gnu": ["@next/swc-linux-arm64-gnu@16.2.7", "", { "os": "linux", "cpu": "arm64" }, "sha512-Re6PZtjBDd0aMU+VcZcC/PrIvj4WhrjDYtMhhCVQamWN4L90EVP0pcEOBQD25prSlw7OzNw5QpHLWMilRLsRNw=="], + "@next/swc-linux-arm64-gnu": ["@next/swc-linux-arm64-gnu@16.2.8", "", { "os": "linux", "cpu": "arm64" }, "sha512-zyA8bCtlAXOzZD6ri6hIi5Z7hW5+07ea81KK0xdezmJHrbrAgvwIRd6VbkddJTapmZVSmWzbpAdYoi1HZNF7KA=="], - "@next/swc-linux-arm64-musl": ["@next/swc-linux-arm64-musl@16.2.7", "", { "os": "linux", "cpu": "arm64" }, "sha512-qyogG9QtBzWxgJfeGBvOEHI3851gTfCF3wLZ5RDLTBJGAmE9p1qDwKCOdrBrvBzRvYDT+gUDp72pzlSEfAXgNA=="], + "@next/swc-linux-arm64-musl": ["@next/swc-linux-arm64-musl@16.2.8", "", { "os": "linux", "cpu": "arm64" }, "sha512-MWIALcC/R12KNHTAliyX96XwwnHLGNKRJHsaFiGKE0fF9sEoXHUlxvdrrl3iQfIKWfBcNdQ9rrMYHc1qFGc71A=="], - "@next/swc-linux-x64-gnu": ["@next/swc-linux-x64-gnu@16.2.7", "", { "os": "linux", "cpu": "x64" }, "sha512-Vhe4ZDuBpmMogrGi5D4R2Kq4JAQlj6+wvgaFYy31zfES0zPmt6TLA+cuYpM/OLrPZjo2MYQTHVqNUSCR6+fDZQ=="], + "@next/swc-linux-x64-gnu": ["@next/swc-linux-x64-gnu@16.2.8", "", { "os": "linux", "cpu": "x64" }, "sha512-SD/R9QU6+wUB3lH6InhOLu1eP3wle4sSjsNdMwk24yFwaWUB5TAtscvFbOqh1AYBsJvHRez3tYHETfbBFd4dRg=="], - "@next/swc-linux-x64-musl": ["@next/swc-linux-x64-musl@16.2.7", "", { "os": "linux", "cpu": "x64" }, "sha512-srvian89JahFLw1YLBEuhvPJ0DO5lpUeJQMXy4xYo7g628ZlNgXdNkqoxSAv9OYrBfByh6vxISMwW/mRbzCY+g=="], + "@next/swc-linux-x64-musl": ["@next/swc-linux-x64-musl@16.2.8", "", { "os": "linux", "cpu": "x64" }, "sha512-F1Al3cRKhYR7/V1RaXnHceqilNLFDe47w7Li/Asph1SklaHHm/b2FahLar2nWct9l9K143NlqbAUFQMjx30QYA=="], - "@next/swc-win32-arm64-msvc": ["@next/swc-win32-arm64-msvc@16.2.7", "", { "os": "win32", "cpu": "arm64" }, "sha512-GX3wvLpULFuRFJzwHaKfm7QZJ18F4ZSuxlPJ96BoBglCzBmdSjyeBKF+ZhWhvL/ckxNfLnNa7bsObO2ipYpszw=="], + "@next/swc-win32-arm64-msvc": ["@next/swc-win32-arm64-msvc@16.2.8", "", { "os": "win32", "cpu": "arm64" }, "sha512-LxhCLToY0id1CkmYFi9sTM2RfoBWszr6mmMrBtmTFqKF0fXX3ZIbM8m1sKoNFIrZFn7gFroT7cnZea5neufSHg=="], - "@next/swc-win32-x64-msvc": ["@next/swc-win32-x64-msvc@16.2.7", "", { "os": "win32", "cpu": "x64" }, "sha512-J4WlM72NMk076Qsg0jTdK3SNXatlSdnjW7L7oNGLst1tAGjHrJh/FYi+pw9wyIjEtGRKDNzD0zuiY16oWYWVaw=="], + "@next/swc-win32-x64-msvc": ["@next/swc-win32-x64-msvc@16.2.8", "", { "os": "win32", "cpu": "x64" }, "sha512-xfGxs1zIkTOLzH8i1WWCeTqQhNqyrv3aVT55PMy7Ul3dfxlA3In7hNEJ3Uo2qpalEBOlkG6G6FLRMWbUrxL+qQ=="], "@nodelib/fs.scandir": ["@nodelib/fs.scandir@2.1.5", "", { "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" } }, "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g=="], @@ -1169,7 +1169,7 @@ "negotiator": ["negotiator@1.0.0", "", {}, "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg=="], - "next": ["next@16.2.7", "", { "dependencies": { "@next/env": "16.2.7", "@swc/helpers": "0.5.15", "baseline-browser-mapping": "^2.9.19", "caniuse-lite": "^1.0.30001579", "postcss": "8.4.31", "styled-jsx": "5.1.6" }, "optionalDependencies": { "@next/swc-darwin-arm64": "16.2.7", "@next/swc-darwin-x64": "16.2.7", "@next/swc-linux-arm64-gnu": "16.2.7", "@next/swc-linux-arm64-musl": "16.2.7", "@next/swc-linux-x64-gnu": "16.2.7", "@next/swc-linux-x64-musl": "16.2.7", "@next/swc-win32-arm64-msvc": "16.2.7", "@next/swc-win32-x64-msvc": "16.2.7", "sharp": "^0.34.5" }, "peerDependencies": { "@opentelemetry/api": "^1.1.0", "@playwright/test": "^1.51.1", "babel-plugin-react-compiler": "*", "react": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", "react-dom": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", "sass": "^1.3.0" }, "optionalPeers": ["@opentelemetry/api", "@playwright/test", "babel-plugin-react-compiler", "sass"], "bin": { "next": "dist/bin/next" } }, "sha512-eMJxgjRzBaj3olkP4cBamHDXL79A8FC6u1GcsO1D1Tsx8bw/LLXUJCaoajVxtnhD3A1IJqIT8IcRJjgBIPJq4w=="], + "next": ["next@16.2.8", "", { "dependencies": { "@next/env": "16.2.8", "@swc/helpers": "0.5.15", "baseline-browser-mapping": "^2.9.19", "caniuse-lite": "^1.0.30001579", "postcss": "8.4.31", "styled-jsx": "5.1.6" }, "optionalDependencies": { "@next/swc-darwin-arm64": "16.2.8", "@next/swc-darwin-x64": "16.2.8", "@next/swc-linux-arm64-gnu": "16.2.8", "@next/swc-linux-arm64-musl": "16.2.8", "@next/swc-linux-x64-gnu": "16.2.8", "@next/swc-linux-x64-musl": "16.2.8", "@next/swc-win32-arm64-msvc": "16.2.8", "@next/swc-win32-x64-msvc": "16.2.8", "sharp": "^0.34.5" }, "peerDependencies": { "@opentelemetry/api": "^1.1.0", "@playwright/test": "^1.51.1", "babel-plugin-react-compiler": "*", "react": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", "react-dom": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", "sass": "^1.3.0" }, "optionalPeers": ["@opentelemetry/api", "@playwright/test", "babel-plugin-react-compiler", "sass"], "bin": { "next": "dist/bin/next" } }, "sha512-tdKipIBg4FJezYqXflb9uwai4II30l3+Cw1TAJM6kWlgiM2Cr+/ldPF88bilRcNwlOwXv6QYI3F7Ucu6rWmEpA=="], "next-auth": ["next-auth@4.24.14", "", { "dependencies": { "@babel/runtime": "^7.20.13", "@panva/hkdf": "^1.0.2", "cookie": "^0.7.0", "jose": "^4.15.5", "oauth": "^0.9.15", "openid-client": "^5.4.0", "preact": "^10.6.3", "preact-render-to-string": "^5.1.19", "uuid": "^8.3.2" }, "peerDependencies": { "@auth/core": "0.34.3", "next": "^12.2.5 || ^13 || ^14 || ^15 || ^16", "nodemailer": "^7.0.7", "react": "^17.0.2 || ^18 || ^19", "react-dom": "^17.0.2 || ^18 || ^19" }, "optionalPeers": ["@auth/core", "nodemailer"] }, "sha512-YRz6xFDXKUwiXSMMChbrBEWyFktZ1qZXEgeSHQQ3nsy08B4c/xLk6REeutRsIFwkjY/1+ShHnu07DN3JeJguig=="], diff --git a/common/src/__tests__/freebuff-models.test.ts b/common/src/__tests__/freebuff-models.test.ts index ea1f3f64c9..dcc441d0f7 100644 --- a/common/src/__tests__/freebuff-models.test.ts +++ b/common/src/__tests__/freebuff-models.test.ts @@ -29,8 +29,8 @@ import { minimaxModels } from '../constants/model-config' const MINIMAX_M3_MODEL_ID = minimaxModels.minimaxM3 describe('freebuff model availability', () => { - test('defaults to DeepSeek V4 Pro, falls back to DeepSeek V4 Flash for new clients', () => { - expect(DEFAULT_FREEBUFF_MODEL_ID).toBe(FREEBUFF_DEEPSEEK_V4_PRO_MODEL_ID) + test('defaults to Kimi K2.6, falls back to DeepSeek V4 Flash for new clients', () => { + expect(DEFAULT_FREEBUFF_MODEL_ID).toBe(FREEBUFF_KIMI_MODEL_ID) expect(FALLBACK_FREEBUFF_MODEL_ID).toBe(FREEBUFF_DEEPSEEK_V4_FLASH_MODEL_ID) }) diff --git a/common/src/constants/freebuff-models.ts b/common/src/constants/freebuff-models.ts index 03b5a2c2bb..81599e3e05 100644 --- a/common/src/constants/freebuff-models.ts +++ b/common/src/constants/freebuff-models.ts @@ -207,7 +207,7 @@ export type FreebuffPremiumModelId = (typeof FREEBUFF_PREMIUM_MODEL_IDS)[number] * guaranteed-available id for resolution / auto-fallbacks should use * FALLBACK_FREEBUFF_MODEL_ID instead. */ export const DEFAULT_FREEBUFF_MODEL_ID: FreebuffModelId = - FREEBUFF_DEEPSEEK_V4_PRO_MODEL_ID + FREEBUFF_KIMI_MODEL_ID /** Always-available fallback used when the requested model can't be served * right now (unknown id, deployment hours closed, etc.). Kept distinct from From d1910089c3495354693ae6a23c9f28d706cf4e2e Mon Sep 17 00:00:00 2001 From: codebuff public sync bot <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 9 Jun 2026 22:15:46 +0000 Subject: [PATCH 40/96] Sync public snapshot from freebuff-private Source: CodebuffAI/freebuff-private@e3cc55dfca0d9cc50849062dc8cc3ff89549c39a --- bun.lock | 76 +++++++++++++++++++++++++++++++++++++------------------- 1 file changed, 50 insertions(+), 26 deletions(-) diff --git a/bun.lock b/bun.lock index b7623ef932..acc1a11318 100644 --- a/bun.lock +++ b/bun.lock @@ -239,15 +239,19 @@ "@eslint-community/regexpp": ["@eslint-community/regexpp@4.12.2", "", {}, "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew=="], - "@eslint/config-array": ["@eslint/config-array@0.23.5", "", { "dependencies": { "@eslint/object-schema": "^3.0.5", "debug": "^4.3.1", "minimatch": "^10.2.4" } }, "sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA=="], + "@eslint/config-array": ["@eslint/config-array@0.21.2", "", { "dependencies": { "@eslint/object-schema": "^2.1.7", "debug": "^4.3.1", "minimatch": "^3.1.5" } }, "sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw=="], - "@eslint/config-helpers": ["@eslint/config-helpers@0.6.0", "", { "dependencies": { "@eslint/core": "^1.2.1" } }, "sha512-ii6Bw9jJ2zi2cWA2Z+9/QZ/+3DX6kwaV5Q986D/CdP3Lap3w/pgQZ373FV7byY/i7L4IRH/G43I5dz1ClsCbpA=="], + "@eslint/config-helpers": ["@eslint/config-helpers@0.4.2", "", { "dependencies": { "@eslint/core": "^0.17.0" } }, "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw=="], - "@eslint/core": ["@eslint/core@1.2.1", "", { "dependencies": { "@types/json-schema": "^7.0.15" } }, "sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ=="], + "@eslint/core": ["@eslint/core@0.17.0", "", { "dependencies": { "@types/json-schema": "^7.0.15" } }, "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ=="], - "@eslint/object-schema": ["@eslint/object-schema@3.0.5", "", {}, "sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw=="], + "@eslint/eslintrc": ["@eslint/eslintrc@3.3.5", "", { "dependencies": { "ajv": "^6.14.0", "debug": "^4.3.2", "espree": "^10.0.1", "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.1", "minimatch": "^3.1.5", "strip-json-comments": "^3.1.1" } }, "sha512-4IlJx0X0qftVsN5E+/vGujTRIFtwuLbNsVUe7TO6zYPDR1O6nFwvwhIKEKSrl6dZchmYBITazxKoUYOjdtjlRg=="], - "@eslint/plugin-kit": ["@eslint/plugin-kit@0.7.2", "", { "dependencies": { "@eslint/core": "^1.2.1", "levn": "^0.4.1" } }, "sha512-+CNAzxglkrpNf/kKywqQfk74QjtceuOE7Qm+AF8miRvPF/wmmK5+OJOgVh3AVTT3RP2mH3+FOaxlE5v72owk0A=="], + "@eslint/js": ["@eslint/js@9.39.4", "", {}, "sha512-nE7DEIchvtiFTwBw4Lfbu59PG+kCofhjsKaCWzxTpt4lfRjRMqG6uMBzKXuEcyXhOHoUp9riAm7/aWYGhXZ9cw=="], + + "@eslint/object-schema": ["@eslint/object-schema@2.1.7", "", {}, "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA=="], + + "@eslint/plugin-kit": ["@eslint/plugin-kit@0.4.1", "", { "dependencies": { "@eslint/core": "^0.17.0", "levn": "^0.4.1" } }, "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA=="], "@gravity-ai/api": ["@gravity-ai/api@0.1.2", "", { "dependencies": { "axios": "^1.13.2" } }, "sha512-txsAhyzvwB/TNrj5R8DoNqw8afM3JY2ahl7aaeaD5ZsxP+7rxff7C7keGI7+gU2KT3d2Mcw4QB1nHhbTSCJYHw=="], @@ -463,8 +467,6 @@ "@types/diff": ["@types/diff@8.0.0", "", { "dependencies": { "diff": "*" } }, "sha512-o7jqJM04gfaYrdCecCVMbZhNdG6T1MHg/oQoRFdERLV+4d+V7FijhiEAbFu0Usww84Yijk9yH58U4Jk4HbtzZw=="], - "@types/esrecurse": ["@types/esrecurse@4.3.1", "", {}, "sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw=="], - "@types/estree": ["@types/estree@1.0.9", "", {}, "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg=="], "@types/js-yaml": ["@types/js-yaml@4.0.9", "", {}, "sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg=="], @@ -547,7 +549,7 @@ "ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="], - "ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], + "ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], "any-base": ["any-base@1.1.0", "", {}, "sha512-uMgjozySS8adZZYePpaWs8cxB9/kdzmpX6SgJZ+wbz1K5eYk5QMYDVJaZKhxyIHUdnnJkfR7SVgStgH7LkGUyg=="], @@ -623,6 +625,8 @@ "call-bound": ["call-bound@1.0.4", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "get-intrinsic": "^1.3.0" } }, "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg=="], + "callsites": ["callsites@3.1.0", "", {}, "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="], + "caniuse-lite": ["caniuse-lite@1.0.30001797", "", {}, "sha512-l8xKG+gwAIExZGl9FrF7KUwuOmk6wbEPC9Xoy/RtnWv1XG0Q4LFlagaLpUv3Kiza3W/wm27zy0yWJEieYKAP6w=="], "canvas": ["canvas@3.2.3", "", { "dependencies": { "node-addon-api": "^7.0.0", "prebuild-install": "^7.1.3" } }, "sha512-PzE5nJZPz72YUAfo8oTp0u3fqqY7IzlTubneAihqDYAUcBk7ryeCmBbdJBEdaH0bptSOe2VT2Zwcb3UaFyaSWw=="], @@ -747,7 +751,7 @@ "escape-string-regexp": ["escape-string-regexp@4.0.0", "", {}, "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="], - "eslint": ["eslint@10.4.1", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.2", "@eslint/config-array": "^0.23.5", "@eslint/config-helpers": "^0.6.0", "@eslint/core": "^1.2.1", "@eslint/plugin-kit": "^0.7.2", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "ajv": "^6.14.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^9.1.2", "eslint-visitor-keys": "^5.0.1", "espree": "^11.2.0", "esquery": "^1.7.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "minimatch": "^10.2.4", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, "peerDependencies": { "jiti": "*" }, "optionalPeers": ["jiti"], "bin": { "eslint": "bin/eslint.js" } }, "sha512-AyIKhnOBuOAdueD7RB3xB+YeAWScb9jHsJBgH2Hcde8InP5JYhqrRR6iTMHyTEwgENK54Cp44e4v8BwNhsuHuw=="], + "eslint": ["eslint@9.39.4", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", "@eslint/config-array": "^0.21.2", "@eslint/config-helpers": "^0.4.2", "@eslint/core": "^0.17.0", "@eslint/eslintrc": "^3.3.5", "@eslint/js": "9.39.4", "@eslint/plugin-kit": "^0.4.1", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "ajv": "^6.14.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^8.4.0", "eslint-visitor-keys": "^4.2.1", "espree": "^10.4.0", "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.5", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, "peerDependencies": { "jiti": "*" }, "optionalPeers": ["jiti"], "bin": { "eslint": "bin/eslint.js" } }, "sha512-XoMjdBOwe/esVgEvLmNsD3IRHkm7fbKIUGvrleloJXUZgDHig2IPWNniv+GwjyJXzuNqVjlr5+4yVUZjycJwfQ=="], "eslint-config-prettier": ["eslint-config-prettier@9.1.2", "", { "peerDependencies": { "eslint": ">=7.0.0" }, "bin": { "eslint-config-prettier": "bin/cli.js" } }, "sha512-iI1f+D2ViGn+uvv5HuHVUamg8ll4tN+JRHGc6IJi4TP9Kl976C57fzPXgseXNs8v0iA8aSJpHsTWjDb9QJamGQ=="], @@ -759,11 +763,11 @@ "eslint-plugin-unused-imports": ["eslint-plugin-unused-imports@4.4.1", "", { "peerDependencies": { "@typescript-eslint/eslint-plugin": "^8.0.0-0 || ^7.0.0 || ^6.0.0 || ^5.0.0", "eslint": "^10.0.0 || ^9.0.0 || ^8.0.0" }, "optionalPeers": ["@typescript-eslint/eslint-plugin"] }, "sha512-oZGYUz1X3sRMGUB+0cZyK2VcvRX5lm/vB56PgNNcU+7ficUCKm66oZWKUubXWnOuPjQ8PvmXtCViXBMONPe7tQ=="], - "eslint-scope": ["eslint-scope@9.1.2", "", { "dependencies": { "@types/esrecurse": "^4.3.1", "@types/estree": "^1.0.8", "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ=="], + "eslint-scope": ["eslint-scope@8.4.0", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg=="], "eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="], - "espree": ["espree@11.2.0", "", { "dependencies": { "acorn": "^8.16.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^5.0.1" } }, "sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw=="], + "espree": ["espree@10.4.0", "", { "dependencies": { "acorn": "^8.15.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^4.2.1" } }, "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ=="], "esprima": ["esprima@4.0.1", "", { "bin": { "esparse": "./bin/esparse.js", "esvalidate": "./bin/esvalidate.js" } }, "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="], @@ -875,6 +879,8 @@ "glob-parent": ["glob-parent@6.0.2", "", { "dependencies": { "is-glob": "^4.0.3" } }, "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A=="], + "globals": ["globals@14.0.0", "", {}, "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ=="], + "globalthis": ["globalthis@1.0.4", "", { "dependencies": { "define-properties": "^1.2.1", "gopd": "^1.0.1" } }, "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ=="], "globby": ["globby@11.1.0", "", { "dependencies": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", "fast-glob": "^3.2.9", "ignore": "^5.2.0", "merge2": "^1.4.1", "slash": "^3.0.0" } }, "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g=="], @@ -889,6 +895,8 @@ "has-bigints": ["has-bigints@1.1.0", "", {}, "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg=="], + "has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], + "has-property-descriptors": ["has-property-descriptors@1.0.2", "", { "dependencies": { "es-define-property": "^1.0.0" } }, "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg=="], "has-proto": ["has-proto@1.2.0", "", { "dependencies": { "dunder-proto": "^1.0.0" } }, "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ=="], @@ -919,6 +927,8 @@ "immer": ["immer@10.2.0", "", {}, "sha512-d/+XTN3zfODyjr89gM3mPq1WNX2B8pYsu7eORitdwyA2sBubnTl3laYlBk4sXY5FUa5qTZGBDPJICVbvqzjlbw=="], + "import-fresh": ["import-fresh@3.3.1", "", { "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" } }, "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ=="], + "imurmurhash": ["imurmurhash@0.1.4", "", {}, "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA=="], "inherits": ["inherits@2.0.4", "", {}, "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="], @@ -1035,6 +1045,8 @@ "lodash": ["lodash@4.17.23", "", {}, "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w=="], + "lodash.merge": ["lodash.merge@4.6.2", "", {}, "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ=="], + "log-update": ["log-update@8.0.0", "", { "dependencies": { "ansi-escapes": "^7.3.0", "cli-cursor": "^5.0.0", "slice-ansi": "^9.0.0", "string-width": "^8.2.0", "strip-ansi": "^7.2.0", "wrap-ansi": "^10.0.0" } }, "sha512-lddSgOt3bPASrylL54ZSpy8nBHns+vBVSoILlVOx+dei300pnLRN958rj/EdlVLKuWlSESU3qdnDZdAI7FXYGg=="], "longest-streak": ["longest-streak@3.1.0", "", {}, "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g=="], @@ -1237,6 +1249,8 @@ "pako": ["pako@1.0.11", "", {}, "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw=="], + "parent-module": ["parent-module@1.0.1", "", { "dependencies": { "callsites": "^3.0.0" } }, "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g=="], + "parse-bmfont-ascii": ["parse-bmfont-ascii@1.0.6", "", {}, "sha512-U4RrVsUFCleIOBsIGYOMKjn9PavsGOXxbvYGtMOEfnId0SVNsgehXh1DxUdVPLoxd5mvcEtvmKs2Mmf0Mpa1ZA=="], "parse-bmfont-binary": ["parse-bmfont-binary@1.0.6", "", {}, "sha512-GxmsRea0wdGdYthjuUeWTMWPqm2+FAd4GI8vCvhgJsFnoGhTrLhXDDupwTo7rXVAgaLIGoVHDZS9p/5XbSqeWA=="], @@ -1381,6 +1395,8 @@ "resolve": ["resolve@2.0.0-next.7", "", { "dependencies": { "es-errors": "^1.3.0", "is-core-module": "^2.16.2", "node-exports-info": "^1.6.0", "object-keys": "^1.1.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-tqt+NBWwyaMgw3zDsnygx4CByWjQEJHOPMdslYhppaQSJUtL/D4JO9CcBBlhPoI8lz9oJIDXkwXfhF4aWqP8xQ=="], + "resolve-from": ["resolve-from@4.0.0", "", {}, "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="], + "resolve-pkg-maps": ["resolve-pkg-maps@1.0.0", "", {}, "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw=="], "restore-cursor": ["restore-cursor@5.1.0", "", { "dependencies": { "onetime": "^7.0.0", "signal-exit": "^4.1.0" } }, "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA=="], @@ -1485,7 +1501,7 @@ "strip-final-newline": ["strip-final-newline@2.0.0", "", {}, "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA=="], - "strip-json-comments": ["strip-json-comments@2.0.1", "", {}, "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ=="], + "strip-json-comments": ["strip-json-comments@3.1.1", "", {}, "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig=="], "stripe": ["stripe@16.12.0", "", { "dependencies": { "@types/node": ">=8.1.0", "qs": "^6.11.0" } }, "sha512-H7eFVLDxeTNNSn4JTRfL2//LzCbDrMSZ+2q1c7CanVWgK2qIW5TwS+0V7N9KcKZZNpYh/uCqK0PyZh/2UsaAtQ=="], @@ -1493,6 +1509,8 @@ "styled-jsx": ["styled-jsx@5.1.6", "", { "dependencies": { "client-only": "0.0.1" }, "peerDependencies": { "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0" } }, "sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA=="], + "supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], + "supports-preserve-symlinks-flag": ["supports-preserve-symlinks-flag@1.0.0", "", {}, "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w=="], "supports-terminal-graphics": ["supports-terminal-graphics@0.1.0", "", {}, "sha512-+KdfozhS0Fw8y5Sghw8kkZNGT8nWYzJ1EzcoIvVjxhl+26TJTs26y02yfBgvc1jh5AS/c8jcI3xtahhR95KRyQ=="], @@ -1651,12 +1669,18 @@ "@codebuff/sdk/ignore": ["ignore@7.0.5", "", {}, "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg=="], - "@eslint/config-array/minimatch": ["minimatch@10.2.5", "", { "dependencies": { "brace-expansion": "^5.0.5" } }, "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg=="], + "@eslint/eslintrc/ajv": ["ajv@6.15.0", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw=="], + + "@eslint/eslintrc/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], + + "@eslint/eslintrc/js-yaml": ["js-yaml@4.2.0", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-ePWsvanv0DWuDRsW8dnt+R4jQ31SCRCQ7hhNcPXZPsoBZiemuZNYGf7adZdqX2D86j6rvKp3RpCxVTSb8WQlOw=="], "@opentui/core/diff": ["diff@9.0.0", "", {}, "sha512-svtcdpS8CgJyqAjEQIXdb3OjhFVVYjzGAPO8WGCmRbrml64SPw/jJD4GoE98aR7r25A0XcgrK3F02yw9R/vhQw=="], "@opentui/core/strip-ansi": ["strip-ansi@7.1.2", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA=="], + "@types/diff/diff": ["diff@9.0.0", "", {}, "sha512-svtcdpS8CgJyqAjEQIXdb3OjhFVVYjzGAPO8WGCmRbrml64SPw/jJD4GoE98aR7r25A0XcgrK3F02yw9R/vhQw=="], + "@typescript-eslint/eslint-plugin/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], "@typescript-eslint/parser/@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@7.18.0", "", { "dependencies": { "@typescript-eslint/types": "7.18.0", "@typescript-eslint/visitor-keys": "7.18.0" } }, "sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA=="], @@ -1685,11 +1709,11 @@ "eslint/ajv": ["ajv@6.15.0", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw=="], - "eslint/eslint-visitor-keys": ["eslint-visitor-keys@5.0.1", "", {}, "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA=="], + "eslint/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], - "eslint/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], + "eslint/eslint-visitor-keys": ["eslint-visitor-keys@4.2.1", "", {}, "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ=="], - "eslint/minimatch": ["minimatch@10.2.5", "", { "dependencies": { "brace-expansion": "^5.0.5" } }, "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg=="], + "eslint/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], "eslint-import-resolver-node/debug": ["debug@3.2.7", "", { "dependencies": { "ms": "^2.1.1" } }, "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ=="], @@ -1701,7 +1725,7 @@ "eslint-plugin-import/tsconfig-paths": ["tsconfig-paths@3.15.0", "", { "dependencies": { "@types/json5": "^0.0.29", "json5": "^1.0.2", "minimist": "^1.2.6", "strip-bom": "^3.0.0" } }, "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg=="], - "espree/eslint-visitor-keys": ["eslint-visitor-keys@5.0.1", "", {}, "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA=="], + "espree/eslint-visitor-keys": ["eslint-visitor-keys@4.2.1", "", {}, "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ=="], "execa/onetime": ["onetime@5.1.2", "", { "dependencies": { "mimic-fn": "^2.1.0" } }, "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg=="], @@ -1729,12 +1753,16 @@ "plist/xmlbuilder": ["xmlbuilder@15.1.1", "", {}, "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg=="], + "rc/strip-json-comments": ["strip-json-comments@2.0.1", "", {}, "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ=="], + "react-devtools-core/ws": ["ws@7.5.11", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": "^5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-zS54Oen9bITtp7kp2XM3AydrCIq1D+HwJOuH+c+e4LfpL/lotP5osijd+UoMnxwAam1GN8R4KtLAyIrIcBNpiA=="], "react-reconciler/scheduler": ["scheduler@0.26.0", "", {}, "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA=="], "send/mime-types": ["mime-types@3.0.2", "", { "dependencies": { "mime-db": "^1.54.0" } }, "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A=="], + "slice-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], + "tar-stream/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=="], "ts-node/diff": ["diff@4.0.4", "", {}, "sha512-X07nttJQkwkfKfvTPG/KSnE2OMdcUCao6+eXF3wmnIQRn2aPAHH3VxDbDOdegkd6JbPsXqShpvEOHfAT+nCNwQ=="], @@ -1749,6 +1777,8 @@ "typescript-eslint/@typescript-eslint/utils": ["@typescript-eslint/utils@7.18.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@typescript-eslint/scope-manager": "7.18.0", "@typescript-eslint/types": "7.18.0", "@typescript-eslint/typescript-estree": "7.18.0" }, "peerDependencies": { "eslint": "^8.56.0" } }, "sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw=="], + "wrap-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], + "wrap-ansi/string-width": ["string-width@8.2.1", "", { "dependencies": { "get-east-asian-width": "^1.5.0", "strip-ansi": "^7.1.2" } }, "sha512-IIaP0g3iy9Cyy18w3M9YcaDudujEAVHKt3a3QJg1+sr/oX96TbaGUubG0hJyCjCBThFH+tFpcIyoUHUn1ogaLA=="], "yargs/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], @@ -1757,7 +1787,9 @@ "@codebuff/evals/pino/process-warning": ["process-warning@5.0.0", "", {}, "sha512-a39t9ApHNx2L4+HBnQKqxxHNs1r7KF+Intd8Q/g1bUh6q0WIp9voPXJ/x0j+ZL45KF1pJd9+q2jLIRMfvEshkA=="], - "@eslint/config-array/minimatch/brace-expansion": ["brace-expansion@5.0.6", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g=="], + "@eslint/eslintrc/ajv/json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], + + "@eslint/eslintrc/js-yaml/argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="], "@typescript-eslint/parser/@typescript-eslint/typescript-estree/minimatch": ["minimatch@9.0.9", "", { "dependencies": { "brace-expansion": "^2.0.2" } }, "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg=="], @@ -1771,14 +1803,10 @@ "cliui/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], - "cliui/wrap-ansi/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], - "eslint-plugin-import/tsconfig-paths/json5": ["json5@1.0.2", "", { "dependencies": { "minimist": "^1.2.0" }, "bin": { "json5": "lib/cli.js" } }, "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA=="], "eslint/ajv/json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], - "eslint/minimatch/brace-expansion": ["brace-expansion@5.0.6", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g=="], - "express/mime-types/mime-db": ["mime-db@1.54.0", "", {}, "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ=="], "p-locate/p-limit/yocto-queue": ["yocto-queue@0.1.0", "", {}, "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="], @@ -1807,12 +1835,8 @@ "yargs/string-width/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], - "@eslint/config-array/minimatch/brace-expansion/balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="], - "@typescript-eslint/parser/@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.1.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-WR1cURNjuvBLMZBMbqM0UoE+WAfdUcEV1ccD8PVBVOI+Z3ND4+SZbN8RsfT2bMuG1qwz5RFvPukSZm5fF2D5eA=="], - "eslint/minimatch/brace-expansion/balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="], - "typescript-eslint/@typescript-eslint/eslint-plugin/@typescript-eslint/scope-manager/@typescript-eslint/types": ["@typescript-eslint/types@7.18.0", "", {}, "sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ=="], "typescript-eslint/@typescript-eslint/eslint-plugin/@typescript-eslint/type-utils/@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@7.18.0", "", { "dependencies": { "@typescript-eslint/types": "7.18.0", "@typescript-eslint/visitor-keys": "7.18.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", "minimatch": "^9.0.4", "semver": "^7.6.0", "ts-api-utils": "^1.3.0" } }, "sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA=="], From 452eb72a11a954c194449b7605551495d2ffe61a Mon Sep 17 00:00:00 2001 From: codebuff public sync bot <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 10 Jun 2026 07:17:10 +0000 Subject: [PATCH 41/96] Sync public snapshot from freebuff-private Source: CodebuffAI/freebuff-private@aebc7b3b21f5d12165da5a83e9a0337b2efd9caf --- bun.lock | 102 +++++++----------- .../__tests__/multiline-input.test.tsx | 66 +++++++++++- cli/src/components/multiline-input.tsx | 11 +- 3 files changed, 115 insertions(+), 64 deletions(-) diff --git a/bun.lock b/bun.lock index acc1a11318..4329037119 100644 --- a/bun.lock +++ b/bun.lock @@ -239,19 +239,15 @@ "@eslint-community/regexpp": ["@eslint-community/regexpp@4.12.2", "", {}, "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew=="], - "@eslint/config-array": ["@eslint/config-array@0.21.2", "", { "dependencies": { "@eslint/object-schema": "^2.1.7", "debug": "^4.3.1", "minimatch": "^3.1.5" } }, "sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw=="], + "@eslint/config-array": ["@eslint/config-array@0.23.5", "", { "dependencies": { "@eslint/object-schema": "^3.0.5", "debug": "^4.3.1", "minimatch": "^10.2.4" } }, "sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA=="], - "@eslint/config-helpers": ["@eslint/config-helpers@0.4.2", "", { "dependencies": { "@eslint/core": "^0.17.0" } }, "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw=="], + "@eslint/config-helpers": ["@eslint/config-helpers@0.6.0", "", { "dependencies": { "@eslint/core": "^1.2.1" } }, "sha512-ii6Bw9jJ2zi2cWA2Z+9/QZ/+3DX6kwaV5Q986D/CdP3Lap3w/pgQZ373FV7byY/i7L4IRH/G43I5dz1ClsCbpA=="], - "@eslint/core": ["@eslint/core@0.17.0", "", { "dependencies": { "@types/json-schema": "^7.0.15" } }, "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ=="], + "@eslint/core": ["@eslint/core@1.2.1", "", { "dependencies": { "@types/json-schema": "^7.0.15" } }, "sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ=="], - "@eslint/eslintrc": ["@eslint/eslintrc@3.3.5", "", { "dependencies": { "ajv": "^6.14.0", "debug": "^4.3.2", "espree": "^10.0.1", "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.1", "minimatch": "^3.1.5", "strip-json-comments": "^3.1.1" } }, "sha512-4IlJx0X0qftVsN5E+/vGujTRIFtwuLbNsVUe7TO6zYPDR1O6nFwvwhIKEKSrl6dZchmYBITazxKoUYOjdtjlRg=="], + "@eslint/object-schema": ["@eslint/object-schema@3.0.5", "", {}, "sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw=="], - "@eslint/js": ["@eslint/js@9.39.4", "", {}, "sha512-nE7DEIchvtiFTwBw4Lfbu59PG+kCofhjsKaCWzxTpt4lfRjRMqG6uMBzKXuEcyXhOHoUp9riAm7/aWYGhXZ9cw=="], - - "@eslint/object-schema": ["@eslint/object-schema@2.1.7", "", {}, "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA=="], - - "@eslint/plugin-kit": ["@eslint/plugin-kit@0.4.1", "", { "dependencies": { "@eslint/core": "^0.17.0", "levn": "^0.4.1" } }, "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA=="], + "@eslint/plugin-kit": ["@eslint/plugin-kit@0.7.2", "", { "dependencies": { "@eslint/core": "^1.2.1", "levn": "^0.4.1" } }, "sha512-+CNAzxglkrpNf/kKywqQfk74QjtceuOE7Qm+AF8miRvPF/wmmK5+OJOgVh3AVTT3RP2mH3+FOaxlE5v72owk0A=="], "@gravity-ai/api": ["@gravity-ai/api@0.1.2", "", { "dependencies": { "axios": "^1.13.2" } }, "sha512-txsAhyzvwB/TNrj5R8DoNqw8afM3JY2ahl7aaeaD5ZsxP+7rxff7C7keGI7+gU2KT3d2Mcw4QB1nHhbTSCJYHw=="], @@ -385,23 +381,23 @@ "@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.29.0", "", { "dependencies": { "@hono/node-server": "^1.19.9", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.2.1", "express-rate-limit": "^8.2.1", "hono": "^4.11.4", "jose": "^6.1.3", "json-schema-typed": "^8.0.2", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.25 || ^4.0", "zod-to-json-schema": "^3.25.1" }, "peerDependencies": { "@cfworker/json-schema": "^4.1.1" }, "optionalPeers": ["@cfworker/json-schema"] }, "sha512-zo37mZA9hJWpULgkRpowewez1y6ML5GsXJPY8FI0tBBCd77HEvza4jDqRKOXgHNn867PVGCyTdzqpz0izu5ZjQ=="], - "@next/env": ["@next/env@16.2.8", "", {}, "sha512-oxK5nEvPI8hlJ9LJ7PCNWfh07oKGxSeb7QaUUlamK7M5jDEV3twreCVqLFaxKgMI1DJgxhqDSdEtVpqLhN6yeQ=="], + "@next/env": ["@next/env@16.2.9", "", {}, "sha512-ki5VxxXfzD/9TDe13wyeTKIjQTAwBVpnr8KhRDUr8ltMUq1/NBpWNT5tiPoxiGl+PHM4X2ahSOiPk6iAimIzPg=="], - "@next/swc-darwin-arm64": ["@next/swc-darwin-arm64@16.2.8", "", { "os": "darwin", "cpu": "arm64" }, "sha512-R/MDVX4Cj+bzvTNkDWNyA09yCPBZB0J1m8P3VAmWAzx/J7DctA1wxya1LU3CcPv2szER3AImHEtsgScauH8SsQ=="], + "@next/swc-darwin-arm64": ["@next/swc-darwin-arm64@16.2.9", "", { "os": "darwin", "cpu": "arm64" }, "sha512-HkfxNYUCmcct0Xsqib5KxqMSHV4AHJq857BNRchyBDs4YS19aHzVfn1kDuBYKqLLQBjXgnkIsjV2Kd4d2wzYhw=="], - "@next/swc-darwin-x64": ["@next/swc-darwin-x64@16.2.8", "", { "os": "darwin", "cpu": "x64" }, "sha512-XH2u8C/meLJmEZbN0G5MRZp8tvxBz5KQ+xv4vX34zL8gL3//5qkc5M/aLsvNAfg5/KbcjIVe3h6aiO0wJcNWKA=="], + "@next/swc-darwin-x64": ["@next/swc-darwin-x64@16.2.9", "", { "os": "darwin", "cpu": "x64" }, "sha512-7IAtK4MeybpqRV9GRABWEhJ62mOS+rzWOzOTFie4cSEtm12xsoOMJRcECoZx3FHPzFAqN/IJtHqWAFOLfl152w=="], - "@next/swc-linux-arm64-gnu": ["@next/swc-linux-arm64-gnu@16.2.8", "", { "os": "linux", "cpu": "arm64" }, "sha512-zyA8bCtlAXOzZD6ri6hIi5Z7hW5+07ea81KK0xdezmJHrbrAgvwIRd6VbkddJTapmZVSmWzbpAdYoi1HZNF7KA=="], + "@next/swc-linux-arm64-gnu": ["@next/swc-linux-arm64-gnu@16.2.9", "", { "os": "linux", "cpu": "arm64" }, "sha512-hBD75iWpUtkL9SmQmcRhmLomn9jgkPzCEkbOcLgHymPEKzv+6ONy13RRiIEz/iEObjkS2Jlb5gYS2XGoS3X4rw=="], - "@next/swc-linux-arm64-musl": ["@next/swc-linux-arm64-musl@16.2.8", "", { "os": "linux", "cpu": "arm64" }, "sha512-MWIALcC/R12KNHTAliyX96XwwnHLGNKRJHsaFiGKE0fF9sEoXHUlxvdrrl3iQfIKWfBcNdQ9rrMYHc1qFGc71A=="], + "@next/swc-linux-arm64-musl": ["@next/swc-linux-arm64-musl@16.2.9", "", { "os": "linux", "cpu": "arm64" }, "sha512-qZTI3pf9SGc/obr8NkQAekBxmp1QK+kVm+VAf3BALLfFAj+1kUhkTxmrWpVos9R/UYIA8AWX2p6cGI5WdwzVUA=="], - "@next/swc-linux-x64-gnu": ["@next/swc-linux-x64-gnu@16.2.8", "", { "os": "linux", "cpu": "x64" }, "sha512-SD/R9QU6+wUB3lH6InhOLu1eP3wle4sSjsNdMwk24yFwaWUB5TAtscvFbOqh1AYBsJvHRez3tYHETfbBFd4dRg=="], + "@next/swc-linux-x64-gnu": ["@next/swc-linux-x64-gnu@16.2.9", "", { "os": "linux", "cpu": "x64" }, "sha512-xm0HfRNX+UkH4R3c18ynswjj5o5uEj/7iI9p9omdtTSIsRCzQqkGMA+10nzJ4EHnYC3as65IMhbbl5fWRUWHYg=="], - "@next/swc-linux-x64-musl": ["@next/swc-linux-x64-musl@16.2.8", "", { "os": "linux", "cpu": "x64" }, "sha512-F1Al3cRKhYR7/V1RaXnHceqilNLFDe47w7Li/Asph1SklaHHm/b2FahLar2nWct9l9K143NlqbAUFQMjx30QYA=="], + "@next/swc-linux-x64-musl": ["@next/swc-linux-x64-musl@16.2.9", "", { "os": "linux", "cpu": "x64" }, "sha512-QumimHkGEG6vM3PfEDWKyKen03NcqLOkeKB1EfcPe7VxzmEiCa4jNnMyBn/US5zcd/VE1CI+O8Ovb3lfjVHfGw=="], - "@next/swc-win32-arm64-msvc": ["@next/swc-win32-arm64-msvc@16.2.8", "", { "os": "win32", "cpu": "arm64" }, "sha512-LxhCLToY0id1CkmYFi9sTM2RfoBWszr6mmMrBtmTFqKF0fXX3ZIbM8m1sKoNFIrZFn7gFroT7cnZea5neufSHg=="], + "@next/swc-win32-arm64-msvc": ["@next/swc-win32-arm64-msvc@16.2.9", "", { "os": "win32", "cpu": "arm64" }, "sha512-hzQpKZvw8rAwI6A2uQh6SacCSvNAXaIkPNsWwzqqfRiIMiXMfH936skDhz1OO6KpvdKkJrgHHtqQOq5PIXOvdQ=="], - "@next/swc-win32-x64-msvc": ["@next/swc-win32-x64-msvc@16.2.8", "", { "os": "win32", "cpu": "x64" }, "sha512-xfGxs1zIkTOLzH8i1WWCeTqQhNqyrv3aVT55PMy7Ul3dfxlA3In7hNEJ3Uo2qpalEBOlkG6G6FLRMWbUrxL+qQ=="], + "@next/swc-win32-x64-msvc": ["@next/swc-win32-x64-msvc@16.2.9", "", { "os": "win32", "cpu": "x64" }, "sha512-qr2VL3Ce5QrwgO2yh1ujSBawrimjVKX8FGF/cOynmdYKJY0BdHpGVNIRK1tqONB10Vkm25Ub1BD2bkjWs4+96w=="], "@nodelib/fs.scandir": ["@nodelib/fs.scandir@2.1.5", "", { "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" } }, "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g=="], @@ -431,9 +427,9 @@ "@pinojs/redact": ["@pinojs/redact@0.4.0", "", {}, "sha512-k2ENnmBugE/rzQfEcdWHcCY+/FM3VLzH9cYEsbdsoqrvzAKRhUZeRNhAZvB8OitQJ1TBed3yqWtdjzS6wJKBwg=="], - "@posthog/core": ["@posthog/core@1.30.14", "", { "dependencies": { "@posthog/types": "1.383.3" } }, "sha512-cC0che/17kP6qMIMgdmxsoz3h8Jar8knQfDM8WqQwVacSeWXkrwkemoV7S5tCGmgTuRTTsdigirs9HiBXHQ/dA=="], + "@posthog/core": ["@posthog/core@1.31.0", "", { "dependencies": { "@posthog/types": "1.384.0" } }, "sha512-tsZ/pyDy7AXUoPe4Skg/ybozerNPzmHxTzE8gyr8CSajkN0/YXRj8BVEaR8hoqpq7G5B3lUFxbqriNvV6NdPJw=="], - "@posthog/types": ["@posthog/types@1.383.3", "", {}, "sha512-N4jtmLaJxzjQ/C0UHnF0igQPSwUqwScPDv9ePGjKCfDomIEUcO3+c6pBrjTp7woxuMQ49BmyM/pV4/SOBPpe0Q=="], + "@posthog/types": ["@posthog/types@1.384.0", "", {}, "sha512-A/KtSocfu6h8ocwOQ1WUme32xdmCFftUN7ziRSYvAahgXaJl3QGizjiRo+Kh60zS8k2tJgzlvCbXB3TqSuY5eg=="], "@rtsao/scc": ["@rtsao/scc@1.1.0", "", {}, "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g=="], @@ -467,6 +463,8 @@ "@types/diff": ["@types/diff@8.0.0", "", { "dependencies": { "diff": "*" } }, "sha512-o7jqJM04gfaYrdCecCVMbZhNdG6T1MHg/oQoRFdERLV+4d+V7FijhiEAbFu0Usww84Yijk9yH58U4Jk4HbtzZw=="], + "@types/esrecurse": ["@types/esrecurse@4.3.1", "", {}, "sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw=="], + "@types/estree": ["@types/estree@1.0.9", "", {}, "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg=="], "@types/js-yaml": ["@types/js-yaml@4.0.9", "", {}, "sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg=="], @@ -549,7 +547,7 @@ "ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="], - "ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + "ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], "any-base": ["any-base@1.1.0", "", {}, "sha512-uMgjozySS8adZZYePpaWs8cxB9/kdzmpX6SgJZ+wbz1K5eYk5QMYDVJaZKhxyIHUdnnJkfR7SVgStgH7LkGUyg=="], @@ -625,8 +623,6 @@ "call-bound": ["call-bound@1.0.4", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "get-intrinsic": "^1.3.0" } }, "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg=="], - "callsites": ["callsites@3.1.0", "", {}, "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="], - "caniuse-lite": ["caniuse-lite@1.0.30001797", "", {}, "sha512-l8xKG+gwAIExZGl9FrF7KUwuOmk6wbEPC9Xoy/RtnWv1XG0Q4LFlagaLpUv3Kiza3W/wm27zy0yWJEieYKAP6w=="], "canvas": ["canvas@3.2.3", "", { "dependencies": { "node-addon-api": "^7.0.0", "prebuild-install": "^7.1.3" } }, "sha512-PzE5nJZPz72YUAfo8oTp0u3fqqY7IzlTubneAihqDYAUcBk7ryeCmBbdJBEdaH0bptSOe2VT2Zwcb3UaFyaSWw=="], @@ -751,7 +747,7 @@ "escape-string-regexp": ["escape-string-regexp@4.0.0", "", {}, "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="], - "eslint": ["eslint@9.39.4", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", "@eslint/config-array": "^0.21.2", "@eslint/config-helpers": "^0.4.2", "@eslint/core": "^0.17.0", "@eslint/eslintrc": "^3.3.5", "@eslint/js": "9.39.4", "@eslint/plugin-kit": "^0.4.1", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "ajv": "^6.14.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^8.4.0", "eslint-visitor-keys": "^4.2.1", "espree": "^10.4.0", "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.5", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, "peerDependencies": { "jiti": "*" }, "optionalPeers": ["jiti"], "bin": { "eslint": "bin/eslint.js" } }, "sha512-XoMjdBOwe/esVgEvLmNsD3IRHkm7fbKIUGvrleloJXUZgDHig2IPWNniv+GwjyJXzuNqVjlr5+4yVUZjycJwfQ=="], + "eslint": ["eslint@10.4.1", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.2", "@eslint/config-array": "^0.23.5", "@eslint/config-helpers": "^0.6.0", "@eslint/core": "^1.2.1", "@eslint/plugin-kit": "^0.7.2", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "ajv": "^6.14.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^9.1.2", "eslint-visitor-keys": "^5.0.1", "espree": "^11.2.0", "esquery": "^1.7.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "minimatch": "^10.2.4", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, "peerDependencies": { "jiti": "*" }, "optionalPeers": ["jiti"], "bin": { "eslint": "bin/eslint.js" } }, "sha512-AyIKhnOBuOAdueD7RB3xB+YeAWScb9jHsJBgH2Hcde8InP5JYhqrRR6iTMHyTEwgENK54Cp44e4v8BwNhsuHuw=="], "eslint-config-prettier": ["eslint-config-prettier@9.1.2", "", { "peerDependencies": { "eslint": ">=7.0.0" }, "bin": { "eslint-config-prettier": "bin/cli.js" } }, "sha512-iI1f+D2ViGn+uvv5HuHVUamg8ll4tN+JRHGc6IJi4TP9Kl976C57fzPXgseXNs8v0iA8aSJpHsTWjDb9QJamGQ=="], @@ -763,11 +759,11 @@ "eslint-plugin-unused-imports": ["eslint-plugin-unused-imports@4.4.1", "", { "peerDependencies": { "@typescript-eslint/eslint-plugin": "^8.0.0-0 || ^7.0.0 || ^6.0.0 || ^5.0.0", "eslint": "^10.0.0 || ^9.0.0 || ^8.0.0" }, "optionalPeers": ["@typescript-eslint/eslint-plugin"] }, "sha512-oZGYUz1X3sRMGUB+0cZyK2VcvRX5lm/vB56PgNNcU+7ficUCKm66oZWKUubXWnOuPjQ8PvmXtCViXBMONPe7tQ=="], - "eslint-scope": ["eslint-scope@8.4.0", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg=="], + "eslint-scope": ["eslint-scope@9.1.2", "", { "dependencies": { "@types/esrecurse": "^4.3.1", "@types/estree": "^1.0.8", "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ=="], "eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="], - "espree": ["espree@10.4.0", "", { "dependencies": { "acorn": "^8.15.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^4.2.1" } }, "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ=="], + "espree": ["espree@11.2.0", "", { "dependencies": { "acorn": "^8.16.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^5.0.1" } }, "sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw=="], "esprima": ["esprima@4.0.1", "", { "bin": { "esparse": "./bin/esparse.js", "esvalidate": "./bin/esvalidate.js" } }, "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="], @@ -879,8 +875,6 @@ "glob-parent": ["glob-parent@6.0.2", "", { "dependencies": { "is-glob": "^4.0.3" } }, "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A=="], - "globals": ["globals@14.0.0", "", {}, "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ=="], - "globalthis": ["globalthis@1.0.4", "", { "dependencies": { "define-properties": "^1.2.1", "gopd": "^1.0.1" } }, "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ=="], "globby": ["globby@11.1.0", "", { "dependencies": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", "fast-glob": "^3.2.9", "ignore": "^5.2.0", "merge2": "^1.4.1", "slash": "^3.0.0" } }, "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g=="], @@ -895,8 +889,6 @@ "has-bigints": ["has-bigints@1.1.0", "", {}, "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg=="], - "has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], - "has-property-descriptors": ["has-property-descriptors@1.0.2", "", { "dependencies": { "es-define-property": "^1.0.0" } }, "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg=="], "has-proto": ["has-proto@1.2.0", "", { "dependencies": { "dunder-proto": "^1.0.0" } }, "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ=="], @@ -927,8 +919,6 @@ "immer": ["immer@10.2.0", "", {}, "sha512-d/+XTN3zfODyjr89gM3mPq1WNX2B8pYsu7eORitdwyA2sBubnTl3laYlBk4sXY5FUa5qTZGBDPJICVbvqzjlbw=="], - "import-fresh": ["import-fresh@3.3.1", "", { "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" } }, "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ=="], - "imurmurhash": ["imurmurhash@0.1.4", "", {}, "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA=="], "inherits": ["inherits@2.0.4", "", {}, "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="], @@ -1045,8 +1035,6 @@ "lodash": ["lodash@4.17.23", "", {}, "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w=="], - "lodash.merge": ["lodash.merge@4.6.2", "", {}, "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ=="], - "log-update": ["log-update@8.0.0", "", { "dependencies": { "ansi-escapes": "^7.3.0", "cli-cursor": "^5.0.0", "slice-ansi": "^9.0.0", "string-width": "^8.2.0", "strip-ansi": "^7.2.0", "wrap-ansi": "^10.0.0" } }, "sha512-lddSgOt3bPASrylL54ZSpy8nBHns+vBVSoILlVOx+dei300pnLRN958rj/EdlVLKuWlSESU3qdnDZdAI7FXYGg=="], "longest-streak": ["longest-streak@3.1.0", "", {}, "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g=="], @@ -1181,7 +1169,7 @@ "negotiator": ["negotiator@1.0.0", "", {}, "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg=="], - "next": ["next@16.2.8", "", { "dependencies": { "@next/env": "16.2.8", "@swc/helpers": "0.5.15", "baseline-browser-mapping": "^2.9.19", "caniuse-lite": "^1.0.30001579", "postcss": "8.4.31", "styled-jsx": "5.1.6" }, "optionalDependencies": { "@next/swc-darwin-arm64": "16.2.8", "@next/swc-darwin-x64": "16.2.8", "@next/swc-linux-arm64-gnu": "16.2.8", "@next/swc-linux-arm64-musl": "16.2.8", "@next/swc-linux-x64-gnu": "16.2.8", "@next/swc-linux-x64-musl": "16.2.8", "@next/swc-win32-arm64-msvc": "16.2.8", "@next/swc-win32-x64-msvc": "16.2.8", "sharp": "^0.34.5" }, "peerDependencies": { "@opentelemetry/api": "^1.1.0", "@playwright/test": "^1.51.1", "babel-plugin-react-compiler": "*", "react": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", "react-dom": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", "sass": "^1.3.0" }, "optionalPeers": ["@opentelemetry/api", "@playwright/test", "babel-plugin-react-compiler", "sass"], "bin": { "next": "dist/bin/next" } }, "sha512-tdKipIBg4FJezYqXflb9uwai4II30l3+Cw1TAJM6kWlgiM2Cr+/ldPF88bilRcNwlOwXv6QYI3F7Ucu6rWmEpA=="], + "next": ["next@16.2.9", "", { "dependencies": { "@next/env": "16.2.9", "@swc/helpers": "0.5.15", "baseline-browser-mapping": "^2.9.19", "caniuse-lite": "^1.0.30001579", "postcss": "8.4.31", "styled-jsx": "5.1.6" }, "optionalDependencies": { "@next/swc-darwin-arm64": "16.2.9", "@next/swc-darwin-x64": "16.2.9", "@next/swc-linux-arm64-gnu": "16.2.9", "@next/swc-linux-arm64-musl": "16.2.9", "@next/swc-linux-x64-gnu": "16.2.9", "@next/swc-linux-x64-musl": "16.2.9", "@next/swc-win32-arm64-msvc": "16.2.9", "@next/swc-win32-x64-msvc": "16.2.9", "sharp": "^0.34.5" }, "peerDependencies": { "@opentelemetry/api": "^1.1.0", "@playwright/test": "^1.51.1", "babel-plugin-react-compiler": "*", "react": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", "react-dom": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", "sass": "^1.3.0" }, "optionalPeers": ["@opentelemetry/api", "@playwright/test", "babel-plugin-react-compiler", "sass"], "bin": { "next": "dist/bin/next" } }, "sha512-MEOJiq/UvuezAdqVSceHbqDgZt1kDw2tpGVOlsdIoJsQdbN2JY2hpVG4xnXGkbdJUOEWhnRfiu/O4Hpc9Juwww=="], "next-auth": ["next-auth@4.24.14", "", { "dependencies": { "@babel/runtime": "^7.20.13", "@panva/hkdf": "^1.0.2", "cookie": "^0.7.0", "jose": "^4.15.5", "oauth": "^0.9.15", "openid-client": "^5.4.0", "preact": "^10.6.3", "preact-render-to-string": "^5.1.19", "uuid": "^8.3.2" }, "peerDependencies": { "@auth/core": "0.34.3", "next": "^12.2.5 || ^13 || ^14 || ^15 || ^16", "nodemailer": "^7.0.7", "react": "^17.0.2 || ^18 || ^19", "react-dom": "^17.0.2 || ^18 || ^19" }, "optionalPeers": ["@auth/core", "nodemailer"] }, "sha512-YRz6xFDXKUwiXSMMChbrBEWyFktZ1qZXEgeSHQQ3nsy08B4c/xLk6REeutRsIFwkjY/1+ShHnu07DN3JeJguig=="], @@ -1249,8 +1237,6 @@ "pako": ["pako@1.0.11", "", {}, "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw=="], - "parent-module": ["parent-module@1.0.1", "", { "dependencies": { "callsites": "^3.0.0" } }, "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g=="], - "parse-bmfont-ascii": ["parse-bmfont-ascii@1.0.6", "", {}, "sha512-U4RrVsUFCleIOBsIGYOMKjn9PavsGOXxbvYGtMOEfnId0SVNsgehXh1DxUdVPLoxd5mvcEtvmKs2Mmf0Mpa1ZA=="], "parse-bmfont-binary": ["parse-bmfont-binary@1.0.6", "", {}, "sha512-GxmsRea0wdGdYthjuUeWTMWPqm2+FAd4GI8vCvhgJsFnoGhTrLhXDDupwTo7rXVAgaLIGoVHDZS9p/5XbSqeWA=="], @@ -1321,7 +1307,7 @@ "postgres-interval": ["postgres-interval@1.2.0", "", { "dependencies": { "xtend": "^4.0.0" } }, "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ=="], - "posthog-node": ["posthog-node@5.36.8", "", { "dependencies": { "@posthog/core": "1.30.14" }, "peerDependencies": { "rxjs": "^7.0.0" }, "optionalPeers": ["rxjs"] }, "sha512-xBdJ3Y5zcveN1QINN39dIiZiCbEhfLeh/4qBiICoLLQOTYfat6zLlwfBmFPcr4hdyQ1nBXh8sIQ9KzSG/zcxpA=="], + "posthog-node": ["posthog-node@5.36.9", "", { "dependencies": { "@posthog/core": "1.31.0" }, "peerDependencies": { "rxjs": "^7.0.0" }, "optionalPeers": ["rxjs"] }, "sha512-2EpDTF8peAJzJSFLUWfJu7MT5XRSoXd8ifsUCrk/sys+qRniTnrLK8f/7wRypwkV8RLwh86hqvzFay55qL6ASA=="], "preact": ["preact@10.29.2", "", {}, "sha512-7tNmwg/7mzzAoB/8kSg6Hl37JraAZw3Z3A0JSY7VXlZwo82Xn0G7wKbNNs2qoF4ZEEsQGTwDAroNdqKs1ofJxQ=="], @@ -1395,8 +1381,6 @@ "resolve": ["resolve@2.0.0-next.7", "", { "dependencies": { "es-errors": "^1.3.0", "is-core-module": "^2.16.2", "node-exports-info": "^1.6.0", "object-keys": "^1.1.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-tqt+NBWwyaMgw3zDsnygx4CByWjQEJHOPMdslYhppaQSJUtL/D4JO9CcBBlhPoI8lz9oJIDXkwXfhF4aWqP8xQ=="], - "resolve-from": ["resolve-from@4.0.0", "", {}, "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="], - "resolve-pkg-maps": ["resolve-pkg-maps@1.0.0", "", {}, "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw=="], "restore-cursor": ["restore-cursor@5.1.0", "", { "dependencies": { "onetime": "^7.0.0", "signal-exit": "^4.1.0" } }, "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA=="], @@ -1429,7 +1413,7 @@ "seedrandom": ["seedrandom@3.0.5", "", {}, "sha512-8OwmbklUNzwezjGInmZ+2clQmExQPvomqjL7LFqOYqtmuxRgQYqOD3mHaU+MvZn5FLUeVxVfQjwLZW/n/JFuqg=="], - "semver": ["semver@7.8.3", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-wnilbGyMxzbY7dNOl7jpKbLSjcfeweJWU5j4+u5qW+6/wuGD9KzIGOyZnQVSBM9E7DtWaaH3CyHkppYrKYoxwg=="], + "semver": ["semver@7.8.4", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-rUCObTnP32Q08R2uuIrt7r9PlEonuTmtuXYcW6s5kjdlj3xbnwe+21yXptAUYcMAABLkYYTtnmzb3w3EDZfueA=="], "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=="], @@ -1501,7 +1485,7 @@ "strip-final-newline": ["strip-final-newline@2.0.0", "", {}, "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA=="], - "strip-json-comments": ["strip-json-comments@3.1.1", "", {}, "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig=="], + "strip-json-comments": ["strip-json-comments@2.0.1", "", {}, "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ=="], "stripe": ["stripe@16.12.0", "", { "dependencies": { "@types/node": ">=8.1.0", "qs": "^6.11.0" } }, "sha512-H7eFVLDxeTNNSn4JTRfL2//LzCbDrMSZ+2q1c7CanVWgK2qIW5TwS+0V7N9KcKZZNpYh/uCqK0PyZh/2UsaAtQ=="], @@ -1509,8 +1493,6 @@ "styled-jsx": ["styled-jsx@5.1.6", "", { "dependencies": { "client-only": "0.0.1" }, "peerDependencies": { "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0" } }, "sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA=="], - "supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], - "supports-preserve-symlinks-flag": ["supports-preserve-symlinks-flag@1.0.0", "", {}, "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w=="], "supports-terminal-graphics": ["supports-terminal-graphics@0.1.0", "", {}, "sha512-+KdfozhS0Fw8y5Sghw8kkZNGT8nWYzJ1EzcoIvVjxhl+26TJTs26y02yfBgvc1jh5AS/c8jcI3xtahhR95KRyQ=="], @@ -1669,11 +1651,7 @@ "@codebuff/sdk/ignore": ["ignore@7.0.5", "", {}, "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg=="], - "@eslint/eslintrc/ajv": ["ajv@6.15.0", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw=="], - - "@eslint/eslintrc/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], - - "@eslint/eslintrc/js-yaml": ["js-yaml@4.2.0", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-ePWsvanv0DWuDRsW8dnt+R4jQ31SCRCQ7hhNcPXZPsoBZiemuZNYGf7adZdqX2D86j6rvKp3RpCxVTSb8WQlOw=="], + "@eslint/config-array/minimatch": ["minimatch@10.2.5", "", { "dependencies": { "brace-expansion": "^5.0.5" } }, "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg=="], "@opentui/core/diff": ["diff@9.0.0", "", {}, "sha512-svtcdpS8CgJyqAjEQIXdb3OjhFVVYjzGAPO8WGCmRbrml64SPw/jJD4GoE98aR7r25A0XcgrK3F02yw9R/vhQw=="], @@ -1709,12 +1687,12 @@ "eslint/ajv": ["ajv@6.15.0", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw=="], - "eslint/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], - - "eslint/eslint-visitor-keys": ["eslint-visitor-keys@4.2.1", "", {}, "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ=="], + "eslint/eslint-visitor-keys": ["eslint-visitor-keys@5.0.1", "", {}, "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA=="], "eslint/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], + "eslint/minimatch": ["minimatch@10.2.5", "", { "dependencies": { "brace-expansion": "^5.0.5" } }, "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg=="], + "eslint-import-resolver-node/debug": ["debug@3.2.7", "", { "dependencies": { "ms": "^2.1.1" } }, "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ=="], "eslint-module-utils/debug": ["debug@3.2.7", "", { "dependencies": { "ms": "^2.1.1" } }, "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ=="], @@ -1725,7 +1703,7 @@ "eslint-plugin-import/tsconfig-paths": ["tsconfig-paths@3.15.0", "", { "dependencies": { "@types/json5": "^0.0.29", "json5": "^1.0.2", "minimist": "^1.2.6", "strip-bom": "^3.0.0" } }, "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg=="], - "espree/eslint-visitor-keys": ["eslint-visitor-keys@4.2.1", "", {}, "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ=="], + "espree/eslint-visitor-keys": ["eslint-visitor-keys@5.0.1", "", {}, "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA=="], "execa/onetime": ["onetime@5.1.2", "", { "dependencies": { "mimic-fn": "^2.1.0" } }, "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg=="], @@ -1753,16 +1731,12 @@ "plist/xmlbuilder": ["xmlbuilder@15.1.1", "", {}, "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg=="], - "rc/strip-json-comments": ["strip-json-comments@2.0.1", "", {}, "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ=="], - "react-devtools-core/ws": ["ws@7.5.11", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": "^5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-zS54Oen9bITtp7kp2XM3AydrCIq1D+HwJOuH+c+e4LfpL/lotP5osijd+UoMnxwAam1GN8R4KtLAyIrIcBNpiA=="], "react-reconciler/scheduler": ["scheduler@0.26.0", "", {}, "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA=="], "send/mime-types": ["mime-types@3.0.2", "", { "dependencies": { "mime-db": "^1.54.0" } }, "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A=="], - "slice-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], - "tar-stream/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=="], "ts-node/diff": ["diff@4.0.4", "", {}, "sha512-X07nttJQkwkfKfvTPG/KSnE2OMdcUCao6+eXF3wmnIQRn2aPAHH3VxDbDOdegkd6JbPsXqShpvEOHfAT+nCNwQ=="], @@ -1777,8 +1751,6 @@ "typescript-eslint/@typescript-eslint/utils": ["@typescript-eslint/utils@7.18.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@typescript-eslint/scope-manager": "7.18.0", "@typescript-eslint/types": "7.18.0", "@typescript-eslint/typescript-estree": "7.18.0" }, "peerDependencies": { "eslint": "^8.56.0" } }, "sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw=="], - "wrap-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], - "wrap-ansi/string-width": ["string-width@8.2.1", "", { "dependencies": { "get-east-asian-width": "^1.5.0", "strip-ansi": "^7.1.2" } }, "sha512-IIaP0g3iy9Cyy18w3M9YcaDudujEAVHKt3a3QJg1+sr/oX96TbaGUubG0hJyCjCBThFH+tFpcIyoUHUn1ogaLA=="], "yargs/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], @@ -1787,9 +1759,7 @@ "@codebuff/evals/pino/process-warning": ["process-warning@5.0.0", "", {}, "sha512-a39t9ApHNx2L4+HBnQKqxxHNs1r7KF+Intd8Q/g1bUh6q0WIp9voPXJ/x0j+ZL45KF1pJd9+q2jLIRMfvEshkA=="], - "@eslint/eslintrc/ajv/json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], - - "@eslint/eslintrc/js-yaml/argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="], + "@eslint/config-array/minimatch/brace-expansion": ["brace-expansion@5.0.6", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g=="], "@typescript-eslint/parser/@typescript-eslint/typescript-estree/minimatch": ["minimatch@9.0.9", "", { "dependencies": { "brace-expansion": "^2.0.2" } }, "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg=="], @@ -1803,10 +1773,14 @@ "cliui/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], + "cliui/wrap-ansi/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + "eslint-plugin-import/tsconfig-paths/json5": ["json5@1.0.2", "", { "dependencies": { "minimist": "^1.2.0" }, "bin": { "json5": "lib/cli.js" } }, "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA=="], "eslint/ajv/json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], + "eslint/minimatch/brace-expansion": ["brace-expansion@5.0.6", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g=="], + "express/mime-types/mime-db": ["mime-db@1.54.0", "", {}, "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ=="], "p-locate/p-limit/yocto-queue": ["yocto-queue@0.1.0", "", {}, "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="], @@ -1835,8 +1809,12 @@ "yargs/string-width/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + "@eslint/config-array/minimatch/brace-expansion/balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="], + "@typescript-eslint/parser/@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.1.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-WR1cURNjuvBLMZBMbqM0UoE+WAfdUcEV1ccD8PVBVOI+Z3ND4+SZbN8RsfT2bMuG1qwz5RFvPukSZm5fF2D5eA=="], + "eslint/minimatch/brace-expansion/balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="], + "typescript-eslint/@typescript-eslint/eslint-plugin/@typescript-eslint/scope-manager/@typescript-eslint/types": ["@typescript-eslint/types@7.18.0", "", {}, "sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ=="], "typescript-eslint/@typescript-eslint/eslint-plugin/@typescript-eslint/type-utils/@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@7.18.0", "", { "dependencies": { "@typescript-eslint/types": "7.18.0", "@typescript-eslint/visitor-keys": "7.18.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", "minimatch": "^9.0.4", "semver": "^7.6.0", "ts-api-utils": "^1.3.0" } }, "sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA=="], diff --git a/cli/src/components/__tests__/multiline-input.test.tsx b/cli/src/components/__tests__/multiline-input.test.tsx index a024ad9d3e..7fcf7eaa17 100644 --- a/cli/src/components/__tests__/multiline-input.test.tsx +++ b/cli/src/components/__tests__/multiline-input.test.tsx @@ -677,6 +677,7 @@ describe('MultilineInput - newline keyboard shortcuts', () => { meta?: boolean shift?: boolean option?: boolean + source?: 'raw' | 'kitty' }, hasBackslashBeforeCursor: boolean = false, ): 'newline' | 'submit' | 'ignore' { @@ -697,7 +698,9 @@ describe('MultilineInput - newline keyboard shortcuts', () => { if (!isEnterKey && !isCtrlJ) return 'ignore' const isAltLikeModifier = isAltModifier(key) + const isKittyKey = key.source === 'kitty' const hasEscapePrefix = + !isKittyKey && typeof key.sequence === 'string' && key.sequence.length > 0 && key.sequence.charCodeAt(0) === 0x1b @@ -710,7 +713,7 @@ describe('MultilineInput - newline keyboard shortcuts', () => { !key.option && !isAltLikeModifier && (!hasEscapePrefix || keypadEnter) && - (key.sequence === '\r' || keypadEnter) && + (key.sequence === '\r' || keypadEnter || isKittyKey) && !hasBackslashBeforeCursor const isShiftEnter = isEnterKey && (Boolean(key.shift) || key.sequence === '\n') @@ -984,6 +987,67 @@ describe('MultilineInput - newline keyboard shortcuts', () => { expect(getEnterKeyAction(key, false)).toBe('submit') }) + // --- Kitty keyboard protocol tests --- + // Some terminals (e.g. VSCode-fork embedded terminals on Linux) encode a + // plain Enter press as CSI u (\x1b[13u) once the kitty protocol is active. + // The escape prefix must not be mistaken for Alt+Enter in that case. + + test('Kitty CSI-u plain Enter submits', () => { + const key = { + name: 'return', + sequence: '\x1b[13u', + ctrl: false, + meta: false, + shift: false, + option: false, + source: 'kitty' as const, + } + + expect(getEnterKeyAction(key, false)).toBe('submit') + }) + + test('Kitty Shift+Enter inserts newline', () => { + const key = { + name: 'return', + sequence: '\x1b[13;2u', + ctrl: false, + meta: false, + shift: true, + option: false, + source: 'kitty' as const, + } + + expect(getEnterKeyAction(key)).toBe('newline') + }) + + test('Kitty Alt+Enter inserts newline', () => { + const key = { + name: 'return', + sequence: '\x1b[13;3u', + ctrl: false, + meta: true, + shift: false, + option: true, + source: 'kitty' as const, + } + + expect(getEnterKeyAction(key)).toBe('newline') + }) + + test('Kitty plain Enter with backslash before cursor inserts newline', () => { + const key = { + name: 'return', + sequence: '\x1b[13u', + ctrl: false, + meta: false, + shift: false, + option: false, + source: 'kitty' as const, + } + + expect(getEnterKeyAction(key, true)).toBe('newline') + }) + // --- Non-Enter key tests --- test('Regular J key (no ctrl) is ignored', () => { diff --git a/cli/src/components/multiline-input.tsx b/cli/src/components/multiline-input.tsx index a58fc8c5cb..c5db1c51fd 100644 --- a/cli/src/components/multiline-input.tsx +++ b/cli/src/components/multiline-input.tsx @@ -573,7 +573,13 @@ export const MultilineInput = forwardRef< if (!isEnterKey && !isCtrlJ) return false const isAltLikeModifier = isAltModifier(key) + // Kitty-protocol keyboards encode plain Enter as an escape sequence + // (e.g. \x1b[13u) but report modifiers reliably, so the escape-prefix + // and raw \r/\n heuristics (which exist to catch legacy Alt+Enter) + // must not apply to kitty events. + const isKittyKey = key.source === 'kitty' const hasEscapePrefix = + !isKittyKey && typeof key.sequence === 'string' && key.sequence.length > 0 && key.sequence.charCodeAt(0) === 0x1b @@ -589,7 +595,10 @@ export const MultilineInput = forwardRef< !key.option && !isAltLikeModifier && (!hasEscapePrefix || keypadEnter) && - (key.sequence === '\r' || key.sequence === '\n' || keypadEnter) && + (key.sequence === '\r' || + key.sequence === '\n' || + keypadEnter || + isKittyKey) && !hasBackslashBeforeCursor const isShiftEnter = isEnterKey && Boolean(key.shift) const isOptionEnter = From 253c5e1668474857a44af9ed76921eb165b6abc0 Mon Sep 17 00:00:00 2001 From: codebuff public sync bot <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 10 Jun 2026 17:19:07 +0000 Subject: [PATCH 42/96] Sync public snapshot from freebuff-private Source: CodebuffAI/freebuff-private@88f8482460199b25b473b754197fb4071712c54a --- bun.lock | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/bun.lock b/bun.lock index 4329037119..9bf5591349 100644 --- a/bun.lock +++ b/bun.lock @@ -427,9 +427,9 @@ "@pinojs/redact": ["@pinojs/redact@0.4.0", "", {}, "sha512-k2ENnmBugE/rzQfEcdWHcCY+/FM3VLzH9cYEsbdsoqrvzAKRhUZeRNhAZvB8OitQJ1TBed3yqWtdjzS6wJKBwg=="], - "@posthog/core": ["@posthog/core@1.31.0", "", { "dependencies": { "@posthog/types": "1.384.0" } }, "sha512-tsZ/pyDy7AXUoPe4Skg/ybozerNPzmHxTzE8gyr8CSajkN0/YXRj8BVEaR8hoqpq7G5B3lUFxbqriNvV6NdPJw=="], + "@posthog/core": ["@posthog/core@1.31.4", "", { "dependencies": { "@posthog/types": "1.385.0" } }, "sha512-Xq/XmltsX+uUKf1aK4JwbDtVEzyCZS0/orv9myU2OJz8SmlO6Z2w2/V9iThzmHPIHUQup7oCb9iudJM86RamNA=="], - "@posthog/types": ["@posthog/types@1.384.0", "", {}, "sha512-A/KtSocfu6h8ocwOQ1WUme32xdmCFftUN7ziRSYvAahgXaJl3QGizjiRo+Kh60zS8k2tJgzlvCbXB3TqSuY5eg=="], + "@posthog/types": ["@posthog/types@1.385.0", "", {}, "sha512-MLtq/d5HnGqMqLW2HU6OAILnty1PDRaUQePMNWCGF+eYdPY9/Ki1h8oKy0PffO/sNV3GsqIthLQ/ESFllNlcwA=="], "@rtsao/scc": ["@rtsao/scc@1.1.0", "", {}, "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g=="], @@ -1307,7 +1307,7 @@ "postgres-interval": ["postgres-interval@1.2.0", "", { "dependencies": { "xtend": "^4.0.0" } }, "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ=="], - "posthog-node": ["posthog-node@5.36.9", "", { "dependencies": { "@posthog/core": "1.31.0" }, "peerDependencies": { "rxjs": "^7.0.0" }, "optionalPeers": ["rxjs"] }, "sha512-2EpDTF8peAJzJSFLUWfJu7MT5XRSoXd8ifsUCrk/sys+qRniTnrLK8f/7wRypwkV8RLwh86hqvzFay55qL6ASA=="], + "posthog-node": ["posthog-node@5.36.13", "", { "dependencies": { "@posthog/core": "1.31.4" }, "peerDependencies": { "rxjs": "^7.0.0" }, "optionalPeers": ["rxjs"] }, "sha512-Evyy5F9seWnDHL4DRKuWEVTdYhDC5dvjhRLD+Xs5G0GcEH/LDD/yyTVz1cqNKRM1do+tiK4J6pmHFaBYUhqzpg=="], "preact": ["preact@10.29.2", "", {}, "sha512-7tNmwg/7mzzAoB/8kSg6Hl37JraAZw3Z3A0JSY7VXlZwo82Xn0G7wKbNNs2qoF4ZEEsQGTwDAroNdqKs1ofJxQ=="], @@ -1657,8 +1657,6 @@ "@opentui/core/strip-ansi": ["strip-ansi@7.1.2", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA=="], - "@types/diff/diff": ["diff@9.0.0", "", {}, "sha512-svtcdpS8CgJyqAjEQIXdb3OjhFVVYjzGAPO8WGCmRbrml64SPw/jJD4GoE98aR7r25A0XcgrK3F02yw9R/vhQw=="], - "@typescript-eslint/eslint-plugin/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], "@typescript-eslint/parser/@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@7.18.0", "", { "dependencies": { "@typescript-eslint/types": "7.18.0", "@typescript-eslint/visitor-keys": "7.18.0" } }, "sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA=="], From 2d1f29159f85283ae50d8cff18665f68ec25aeb4 Mon Sep 17 00:00:00 2001 From: codebuff public sync bot <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 10 Jun 2026 18:03:08 +0000 Subject: [PATCH 43/96] Sync public snapshot from freebuff-private Source: CodebuffAI/freebuff-private@e732fc07bb3813eefea03529bfbc11555f3c0995 --- bun.lock | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/bun.lock b/bun.lock index 9bf5591349..32fe2d1f08 100644 --- a/bun.lock +++ b/bun.lock @@ -427,9 +427,9 @@ "@pinojs/redact": ["@pinojs/redact@0.4.0", "", {}, "sha512-k2ENnmBugE/rzQfEcdWHcCY+/FM3VLzH9cYEsbdsoqrvzAKRhUZeRNhAZvB8OitQJ1TBed3yqWtdjzS6wJKBwg=="], - "@posthog/core": ["@posthog/core@1.31.4", "", { "dependencies": { "@posthog/types": "1.385.0" } }, "sha512-Xq/XmltsX+uUKf1aK4JwbDtVEzyCZS0/orv9myU2OJz8SmlO6Z2w2/V9iThzmHPIHUQup7oCb9iudJM86RamNA=="], + "@posthog/core": ["@posthog/core@1.32.0", "", { "dependencies": { "@posthog/types": "1.386.0" } }, "sha512-ObLtuhf3QgWP6UyyuiLGBPlVaQw2h4wYC3I4cg9m7UfveaY5vqtpqEYNOdpcuYlQYIVkoSYxu9Wsokmmg9q4nA=="], - "@posthog/types": ["@posthog/types@1.385.0", "", {}, "sha512-MLtq/d5HnGqMqLW2HU6OAILnty1PDRaUQePMNWCGF+eYdPY9/Ki1h8oKy0PffO/sNV3GsqIthLQ/ESFllNlcwA=="], + "@posthog/types": ["@posthog/types@1.386.0", "", {}, "sha512-v2ywYj9gYQ4C2nyTkk54evord9p54ezXCKQNtyqoIQjxmF+Plpum1JGVunAeNeAUWgMuWWEwGu/1VcbOJsLnLw=="], "@rtsao/scc": ["@rtsao/scc@1.1.0", "", {}, "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g=="], @@ -1307,7 +1307,7 @@ "postgres-interval": ["postgres-interval@1.2.0", "", { "dependencies": { "xtend": "^4.0.0" } }, "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ=="], - "posthog-node": ["posthog-node@5.36.13", "", { "dependencies": { "@posthog/core": "1.31.4" }, "peerDependencies": { "rxjs": "^7.0.0" }, "optionalPeers": ["rxjs"] }, "sha512-Evyy5F9seWnDHL4DRKuWEVTdYhDC5dvjhRLD+Xs5G0GcEH/LDD/yyTVz1cqNKRM1do+tiK4J6pmHFaBYUhqzpg=="], + "posthog-node": ["posthog-node@5.36.14", "", { "dependencies": { "@posthog/core": "1.32.0" }, "peerDependencies": { "rxjs": "^7.0.0" }, "optionalPeers": ["rxjs"] }, "sha512-3HisrhpcSBHOzTWW3UAVLKwz52YWTbfHeqJ4vergpc05diOKGlz0ckXkQnDZ/a8OJ/UGa3JZyDzkRlVBGeg7IA=="], "preact": ["preact@10.29.2", "", {}, "sha512-7tNmwg/7mzzAoB/8kSg6Hl37JraAZw3Z3A0JSY7VXlZwo82Xn0G7wKbNNs2qoF4ZEEsQGTwDAroNdqKs1ofJxQ=="], @@ -1657,6 +1657,8 @@ "@opentui/core/strip-ansi": ["strip-ansi@7.1.2", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA=="], + "@types/diff/diff": ["diff@9.0.0", "", {}, "sha512-svtcdpS8CgJyqAjEQIXdb3OjhFVVYjzGAPO8WGCmRbrml64SPw/jJD4GoE98aR7r25A0XcgrK3F02yw9R/vhQw=="], + "@typescript-eslint/eslint-plugin/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], "@typescript-eslint/parser/@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@7.18.0", "", { "dependencies": { "@typescript-eslint/types": "7.18.0", "@typescript-eslint/visitor-keys": "7.18.0" } }, "sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA=="], From c127ca37ec549cace7df7ba6035737685b768f6a Mon Sep 17 00:00:00 2001 From: codebuff public sync bot <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 10 Jun 2026 19:25:06 +0000 Subject: [PATCH 44/96] Sync public snapshot from freebuff-private Source: CodebuffAI/freebuff-private@f59c3b906670aa58b4f91a3aa21506cad922c10c --- bun.lock | 74 ++++++++++++++++++++++++++++++++++++-------------------- 1 file changed, 48 insertions(+), 26 deletions(-) diff --git a/bun.lock b/bun.lock index 32fe2d1f08..f7b1864204 100644 --- a/bun.lock +++ b/bun.lock @@ -239,15 +239,19 @@ "@eslint-community/regexpp": ["@eslint-community/regexpp@4.12.2", "", {}, "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew=="], - "@eslint/config-array": ["@eslint/config-array@0.23.5", "", { "dependencies": { "@eslint/object-schema": "^3.0.5", "debug": "^4.3.1", "minimatch": "^10.2.4" } }, "sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA=="], + "@eslint/config-array": ["@eslint/config-array@0.21.2", "", { "dependencies": { "@eslint/object-schema": "^2.1.7", "debug": "^4.3.1", "minimatch": "^3.1.5" } }, "sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw=="], - "@eslint/config-helpers": ["@eslint/config-helpers@0.6.0", "", { "dependencies": { "@eslint/core": "^1.2.1" } }, "sha512-ii6Bw9jJ2zi2cWA2Z+9/QZ/+3DX6kwaV5Q986D/CdP3Lap3w/pgQZ373FV7byY/i7L4IRH/G43I5dz1ClsCbpA=="], + "@eslint/config-helpers": ["@eslint/config-helpers@0.4.2", "", { "dependencies": { "@eslint/core": "^0.17.0" } }, "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw=="], - "@eslint/core": ["@eslint/core@1.2.1", "", { "dependencies": { "@types/json-schema": "^7.0.15" } }, "sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ=="], + "@eslint/core": ["@eslint/core@0.17.0", "", { "dependencies": { "@types/json-schema": "^7.0.15" } }, "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ=="], - "@eslint/object-schema": ["@eslint/object-schema@3.0.5", "", {}, "sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw=="], + "@eslint/eslintrc": ["@eslint/eslintrc@3.3.5", "", { "dependencies": { "ajv": "^6.14.0", "debug": "^4.3.2", "espree": "^10.0.1", "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.1", "minimatch": "^3.1.5", "strip-json-comments": "^3.1.1" } }, "sha512-4IlJx0X0qftVsN5E+/vGujTRIFtwuLbNsVUe7TO6zYPDR1O6nFwvwhIKEKSrl6dZchmYBITazxKoUYOjdtjlRg=="], - "@eslint/plugin-kit": ["@eslint/plugin-kit@0.7.2", "", { "dependencies": { "@eslint/core": "^1.2.1", "levn": "^0.4.1" } }, "sha512-+CNAzxglkrpNf/kKywqQfk74QjtceuOE7Qm+AF8miRvPF/wmmK5+OJOgVh3AVTT3RP2mH3+FOaxlE5v72owk0A=="], + "@eslint/js": ["@eslint/js@9.39.4", "", {}, "sha512-nE7DEIchvtiFTwBw4Lfbu59PG+kCofhjsKaCWzxTpt4lfRjRMqG6uMBzKXuEcyXhOHoUp9riAm7/aWYGhXZ9cw=="], + + "@eslint/object-schema": ["@eslint/object-schema@2.1.7", "", {}, "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA=="], + + "@eslint/plugin-kit": ["@eslint/plugin-kit@0.4.1", "", { "dependencies": { "@eslint/core": "^0.17.0", "levn": "^0.4.1" } }, "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA=="], "@gravity-ai/api": ["@gravity-ai/api@0.1.2", "", { "dependencies": { "axios": "^1.13.2" } }, "sha512-txsAhyzvwB/TNrj5R8DoNqw8afM3JY2ahl7aaeaD5ZsxP+7rxff7C7keGI7+gU2KT3d2Mcw4QB1nHhbTSCJYHw=="], @@ -463,8 +467,6 @@ "@types/diff": ["@types/diff@8.0.0", "", { "dependencies": { "diff": "*" } }, "sha512-o7jqJM04gfaYrdCecCVMbZhNdG6T1MHg/oQoRFdERLV+4d+V7FijhiEAbFu0Usww84Yijk9yH58U4Jk4HbtzZw=="], - "@types/esrecurse": ["@types/esrecurse@4.3.1", "", {}, "sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw=="], - "@types/estree": ["@types/estree@1.0.9", "", {}, "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg=="], "@types/js-yaml": ["@types/js-yaml@4.0.9", "", {}, "sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg=="], @@ -547,7 +549,7 @@ "ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="], - "ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], + "ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], "any-base": ["any-base@1.1.0", "", {}, "sha512-uMgjozySS8adZZYePpaWs8cxB9/kdzmpX6SgJZ+wbz1K5eYk5QMYDVJaZKhxyIHUdnnJkfR7SVgStgH7LkGUyg=="], @@ -623,6 +625,8 @@ "call-bound": ["call-bound@1.0.4", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "get-intrinsic": "^1.3.0" } }, "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg=="], + "callsites": ["callsites@3.1.0", "", {}, "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="], + "caniuse-lite": ["caniuse-lite@1.0.30001797", "", {}, "sha512-l8xKG+gwAIExZGl9FrF7KUwuOmk6wbEPC9Xoy/RtnWv1XG0Q4LFlagaLpUv3Kiza3W/wm27zy0yWJEieYKAP6w=="], "canvas": ["canvas@3.2.3", "", { "dependencies": { "node-addon-api": "^7.0.0", "prebuild-install": "^7.1.3" } }, "sha512-PzE5nJZPz72YUAfo8oTp0u3fqqY7IzlTubneAihqDYAUcBk7ryeCmBbdJBEdaH0bptSOe2VT2Zwcb3UaFyaSWw=="], @@ -747,7 +751,7 @@ "escape-string-regexp": ["escape-string-regexp@4.0.0", "", {}, "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="], - "eslint": ["eslint@10.4.1", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.2", "@eslint/config-array": "^0.23.5", "@eslint/config-helpers": "^0.6.0", "@eslint/core": "^1.2.1", "@eslint/plugin-kit": "^0.7.2", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "ajv": "^6.14.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^9.1.2", "eslint-visitor-keys": "^5.0.1", "espree": "^11.2.0", "esquery": "^1.7.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "minimatch": "^10.2.4", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, "peerDependencies": { "jiti": "*" }, "optionalPeers": ["jiti"], "bin": { "eslint": "bin/eslint.js" } }, "sha512-AyIKhnOBuOAdueD7RB3xB+YeAWScb9jHsJBgH2Hcde8InP5JYhqrRR6iTMHyTEwgENK54Cp44e4v8BwNhsuHuw=="], + "eslint": ["eslint@9.39.4", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", "@eslint/config-array": "^0.21.2", "@eslint/config-helpers": "^0.4.2", "@eslint/core": "^0.17.0", "@eslint/eslintrc": "^3.3.5", "@eslint/js": "9.39.4", "@eslint/plugin-kit": "^0.4.1", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "ajv": "^6.14.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^8.4.0", "eslint-visitor-keys": "^4.2.1", "espree": "^10.4.0", "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.5", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, "peerDependencies": { "jiti": "*" }, "optionalPeers": ["jiti"], "bin": { "eslint": "bin/eslint.js" } }, "sha512-XoMjdBOwe/esVgEvLmNsD3IRHkm7fbKIUGvrleloJXUZgDHig2IPWNniv+GwjyJXzuNqVjlr5+4yVUZjycJwfQ=="], "eslint-config-prettier": ["eslint-config-prettier@9.1.2", "", { "peerDependencies": { "eslint": ">=7.0.0" }, "bin": { "eslint-config-prettier": "bin/cli.js" } }, "sha512-iI1f+D2ViGn+uvv5HuHVUamg8ll4tN+JRHGc6IJi4TP9Kl976C57fzPXgseXNs8v0iA8aSJpHsTWjDb9QJamGQ=="], @@ -759,11 +763,11 @@ "eslint-plugin-unused-imports": ["eslint-plugin-unused-imports@4.4.1", "", { "peerDependencies": { "@typescript-eslint/eslint-plugin": "^8.0.0-0 || ^7.0.0 || ^6.0.0 || ^5.0.0", "eslint": "^10.0.0 || ^9.0.0 || ^8.0.0" }, "optionalPeers": ["@typescript-eslint/eslint-plugin"] }, "sha512-oZGYUz1X3sRMGUB+0cZyK2VcvRX5lm/vB56PgNNcU+7ficUCKm66oZWKUubXWnOuPjQ8PvmXtCViXBMONPe7tQ=="], - "eslint-scope": ["eslint-scope@9.1.2", "", { "dependencies": { "@types/esrecurse": "^4.3.1", "@types/estree": "^1.0.8", "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ=="], + "eslint-scope": ["eslint-scope@8.4.0", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg=="], "eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="], - "espree": ["espree@11.2.0", "", { "dependencies": { "acorn": "^8.16.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^5.0.1" } }, "sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw=="], + "espree": ["espree@10.4.0", "", { "dependencies": { "acorn": "^8.15.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^4.2.1" } }, "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ=="], "esprima": ["esprima@4.0.1", "", { "bin": { "esparse": "./bin/esparse.js", "esvalidate": "./bin/esvalidate.js" } }, "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="], @@ -875,6 +879,8 @@ "glob-parent": ["glob-parent@6.0.2", "", { "dependencies": { "is-glob": "^4.0.3" } }, "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A=="], + "globals": ["globals@14.0.0", "", {}, "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ=="], + "globalthis": ["globalthis@1.0.4", "", { "dependencies": { "define-properties": "^1.2.1", "gopd": "^1.0.1" } }, "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ=="], "globby": ["globby@11.1.0", "", { "dependencies": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", "fast-glob": "^3.2.9", "ignore": "^5.2.0", "merge2": "^1.4.1", "slash": "^3.0.0" } }, "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g=="], @@ -889,6 +895,8 @@ "has-bigints": ["has-bigints@1.1.0", "", {}, "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg=="], + "has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], + "has-property-descriptors": ["has-property-descriptors@1.0.2", "", { "dependencies": { "es-define-property": "^1.0.0" } }, "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg=="], "has-proto": ["has-proto@1.2.0", "", { "dependencies": { "dunder-proto": "^1.0.0" } }, "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ=="], @@ -919,6 +927,8 @@ "immer": ["immer@10.2.0", "", {}, "sha512-d/+XTN3zfODyjr89gM3mPq1WNX2B8pYsu7eORitdwyA2sBubnTl3laYlBk4sXY5FUa5qTZGBDPJICVbvqzjlbw=="], + "import-fresh": ["import-fresh@3.3.1", "", { "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" } }, "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ=="], + "imurmurhash": ["imurmurhash@0.1.4", "", {}, "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA=="], "inherits": ["inherits@2.0.4", "", {}, "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="], @@ -1035,6 +1045,8 @@ "lodash": ["lodash@4.17.23", "", {}, "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w=="], + "lodash.merge": ["lodash.merge@4.6.2", "", {}, "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ=="], + "log-update": ["log-update@8.0.0", "", { "dependencies": { "ansi-escapes": "^7.3.0", "cli-cursor": "^5.0.0", "slice-ansi": "^9.0.0", "string-width": "^8.2.0", "strip-ansi": "^7.2.0", "wrap-ansi": "^10.0.0" } }, "sha512-lddSgOt3bPASrylL54ZSpy8nBHns+vBVSoILlVOx+dei300pnLRN958rj/EdlVLKuWlSESU3qdnDZdAI7FXYGg=="], "longest-streak": ["longest-streak@3.1.0", "", {}, "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g=="], @@ -1237,6 +1249,8 @@ "pako": ["pako@1.0.11", "", {}, "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw=="], + "parent-module": ["parent-module@1.0.1", "", { "dependencies": { "callsites": "^3.0.0" } }, "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g=="], + "parse-bmfont-ascii": ["parse-bmfont-ascii@1.0.6", "", {}, "sha512-U4RrVsUFCleIOBsIGYOMKjn9PavsGOXxbvYGtMOEfnId0SVNsgehXh1DxUdVPLoxd5mvcEtvmKs2Mmf0Mpa1ZA=="], "parse-bmfont-binary": ["parse-bmfont-binary@1.0.6", "", {}, "sha512-GxmsRea0wdGdYthjuUeWTMWPqm2+FAd4GI8vCvhgJsFnoGhTrLhXDDupwTo7rXVAgaLIGoVHDZS9p/5XbSqeWA=="], @@ -1381,6 +1395,8 @@ "resolve": ["resolve@2.0.0-next.7", "", { "dependencies": { "es-errors": "^1.3.0", "is-core-module": "^2.16.2", "node-exports-info": "^1.6.0", "object-keys": "^1.1.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-tqt+NBWwyaMgw3zDsnygx4CByWjQEJHOPMdslYhppaQSJUtL/D4JO9CcBBlhPoI8lz9oJIDXkwXfhF4aWqP8xQ=="], + "resolve-from": ["resolve-from@4.0.0", "", {}, "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="], + "resolve-pkg-maps": ["resolve-pkg-maps@1.0.0", "", {}, "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw=="], "restore-cursor": ["restore-cursor@5.1.0", "", { "dependencies": { "onetime": "^7.0.0", "signal-exit": "^4.1.0" } }, "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA=="], @@ -1485,7 +1501,7 @@ "strip-final-newline": ["strip-final-newline@2.0.0", "", {}, "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA=="], - "strip-json-comments": ["strip-json-comments@2.0.1", "", {}, "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ=="], + "strip-json-comments": ["strip-json-comments@3.1.1", "", {}, "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig=="], "stripe": ["stripe@16.12.0", "", { "dependencies": { "@types/node": ">=8.1.0", "qs": "^6.11.0" } }, "sha512-H7eFVLDxeTNNSn4JTRfL2//LzCbDrMSZ+2q1c7CanVWgK2qIW5TwS+0V7N9KcKZZNpYh/uCqK0PyZh/2UsaAtQ=="], @@ -1493,6 +1509,8 @@ "styled-jsx": ["styled-jsx@5.1.6", "", { "dependencies": { "client-only": "0.0.1" }, "peerDependencies": { "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0" } }, "sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA=="], + "supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], + "supports-preserve-symlinks-flag": ["supports-preserve-symlinks-flag@1.0.0", "", {}, "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w=="], "supports-terminal-graphics": ["supports-terminal-graphics@0.1.0", "", {}, "sha512-+KdfozhS0Fw8y5Sghw8kkZNGT8nWYzJ1EzcoIvVjxhl+26TJTs26y02yfBgvc1jh5AS/c8jcI3xtahhR95KRyQ=="], @@ -1651,7 +1669,11 @@ "@codebuff/sdk/ignore": ["ignore@7.0.5", "", {}, "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg=="], - "@eslint/config-array/minimatch": ["minimatch@10.2.5", "", { "dependencies": { "brace-expansion": "^5.0.5" } }, "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg=="], + "@eslint/eslintrc/ajv": ["ajv@6.15.0", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw=="], + + "@eslint/eslintrc/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], + + "@eslint/eslintrc/js-yaml": ["js-yaml@4.2.0", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-ePWsvanv0DWuDRsW8dnt+R4jQ31SCRCQ7hhNcPXZPsoBZiemuZNYGf7adZdqX2D86j6rvKp3RpCxVTSb8WQlOw=="], "@opentui/core/diff": ["diff@9.0.0", "", {}, "sha512-svtcdpS8CgJyqAjEQIXdb3OjhFVVYjzGAPO8WGCmRbrml64SPw/jJD4GoE98aR7r25A0XcgrK3F02yw9R/vhQw=="], @@ -1687,11 +1709,11 @@ "eslint/ajv": ["ajv@6.15.0", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw=="], - "eslint/eslint-visitor-keys": ["eslint-visitor-keys@5.0.1", "", {}, "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA=="], + "eslint/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], - "eslint/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], + "eslint/eslint-visitor-keys": ["eslint-visitor-keys@4.2.1", "", {}, "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ=="], - "eslint/minimatch": ["minimatch@10.2.5", "", { "dependencies": { "brace-expansion": "^5.0.5" } }, "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg=="], + "eslint/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], "eslint-import-resolver-node/debug": ["debug@3.2.7", "", { "dependencies": { "ms": "^2.1.1" } }, "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ=="], @@ -1703,7 +1725,7 @@ "eslint-plugin-import/tsconfig-paths": ["tsconfig-paths@3.15.0", "", { "dependencies": { "@types/json5": "^0.0.29", "json5": "^1.0.2", "minimist": "^1.2.6", "strip-bom": "^3.0.0" } }, "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg=="], - "espree/eslint-visitor-keys": ["eslint-visitor-keys@5.0.1", "", {}, "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA=="], + "espree/eslint-visitor-keys": ["eslint-visitor-keys@4.2.1", "", {}, "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ=="], "execa/onetime": ["onetime@5.1.2", "", { "dependencies": { "mimic-fn": "^2.1.0" } }, "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg=="], @@ -1731,12 +1753,16 @@ "plist/xmlbuilder": ["xmlbuilder@15.1.1", "", {}, "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg=="], + "rc/strip-json-comments": ["strip-json-comments@2.0.1", "", {}, "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ=="], + "react-devtools-core/ws": ["ws@7.5.11", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": "^5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-zS54Oen9bITtp7kp2XM3AydrCIq1D+HwJOuH+c+e4LfpL/lotP5osijd+UoMnxwAam1GN8R4KtLAyIrIcBNpiA=="], "react-reconciler/scheduler": ["scheduler@0.26.0", "", {}, "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA=="], "send/mime-types": ["mime-types@3.0.2", "", { "dependencies": { "mime-db": "^1.54.0" } }, "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A=="], + "slice-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], + "tar-stream/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=="], "ts-node/diff": ["diff@4.0.4", "", {}, "sha512-X07nttJQkwkfKfvTPG/KSnE2OMdcUCao6+eXF3wmnIQRn2aPAHH3VxDbDOdegkd6JbPsXqShpvEOHfAT+nCNwQ=="], @@ -1751,6 +1777,8 @@ "typescript-eslint/@typescript-eslint/utils": ["@typescript-eslint/utils@7.18.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@typescript-eslint/scope-manager": "7.18.0", "@typescript-eslint/types": "7.18.0", "@typescript-eslint/typescript-estree": "7.18.0" }, "peerDependencies": { "eslint": "^8.56.0" } }, "sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw=="], + "wrap-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], + "wrap-ansi/string-width": ["string-width@8.2.1", "", { "dependencies": { "get-east-asian-width": "^1.5.0", "strip-ansi": "^7.1.2" } }, "sha512-IIaP0g3iy9Cyy18w3M9YcaDudujEAVHKt3a3QJg1+sr/oX96TbaGUubG0hJyCjCBThFH+tFpcIyoUHUn1ogaLA=="], "yargs/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], @@ -1759,7 +1787,9 @@ "@codebuff/evals/pino/process-warning": ["process-warning@5.0.0", "", {}, "sha512-a39t9ApHNx2L4+HBnQKqxxHNs1r7KF+Intd8Q/g1bUh6q0WIp9voPXJ/x0j+ZL45KF1pJd9+q2jLIRMfvEshkA=="], - "@eslint/config-array/minimatch/brace-expansion": ["brace-expansion@5.0.6", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g=="], + "@eslint/eslintrc/ajv/json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], + + "@eslint/eslintrc/js-yaml/argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="], "@typescript-eslint/parser/@typescript-eslint/typescript-estree/minimatch": ["minimatch@9.0.9", "", { "dependencies": { "brace-expansion": "^2.0.2" } }, "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg=="], @@ -1773,14 +1803,10 @@ "cliui/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], - "cliui/wrap-ansi/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], - "eslint-plugin-import/tsconfig-paths/json5": ["json5@1.0.2", "", { "dependencies": { "minimist": "^1.2.0" }, "bin": { "json5": "lib/cli.js" } }, "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA=="], "eslint/ajv/json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], - "eslint/minimatch/brace-expansion": ["brace-expansion@5.0.6", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g=="], - "express/mime-types/mime-db": ["mime-db@1.54.0", "", {}, "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ=="], "p-locate/p-limit/yocto-queue": ["yocto-queue@0.1.0", "", {}, "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="], @@ -1809,12 +1835,8 @@ "yargs/string-width/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], - "@eslint/config-array/minimatch/brace-expansion/balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="], - "@typescript-eslint/parser/@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.1.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-WR1cURNjuvBLMZBMbqM0UoE+WAfdUcEV1ccD8PVBVOI+Z3ND4+SZbN8RsfT2bMuG1qwz5RFvPukSZm5fF2D5eA=="], - "eslint/minimatch/brace-expansion/balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="], - "typescript-eslint/@typescript-eslint/eslint-plugin/@typescript-eslint/scope-manager/@typescript-eslint/types": ["@typescript-eslint/types@7.18.0", "", {}, "sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ=="], "typescript-eslint/@typescript-eslint/eslint-plugin/@typescript-eslint/type-utils/@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@7.18.0", "", { "dependencies": { "@typescript-eslint/types": "7.18.0", "@typescript-eslint/visitor-keys": "7.18.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", "minimatch": "^9.0.4", "semver": "^7.6.0", "ts-api-utils": "^1.3.0" } }, "sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA=="], From fb291672ad5b020a6b39ad9c266fcedaf3aeb496 Mon Sep 17 00:00:00 2001 From: codebuff public sync bot <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 10 Jun 2026 22:05:54 +0000 Subject: [PATCH 45/96] Sync public snapshot from freebuff-private Source: CodebuffAI/freebuff-private@50f5a4d6a5b7c5690cba6fa2b2c7087fbe84f3af --- agents/__tests__/base2.test.ts | 2 ++ agents/base2/base2-free-minimax-m3.ts | 1 - agents/reviewer/code-reviewer-minimax-m3.ts | 13 +++++++++++++ bun.lock | 6 +++--- common/src/__tests__/free-agents.test.ts | 12 ++++++++++++ common/src/constants/free-agents.ts | 2 ++ 6 files changed, 32 insertions(+), 4 deletions(-) create mode 100644 agents/reviewer/code-reviewer-minimax-m3.ts diff --git a/agents/__tests__/base2.test.ts b/agents/__tests__/base2.test.ts index 3e13fc3996..d86393dc0f 100644 --- a/agents/__tests__/base2.test.ts +++ b/agents/__tests__/base2.test.ts @@ -5,6 +5,7 @@ import { FREEBUFF_DEEPSEEK_V4_PRO_MODEL_ID, FREEBUFF_KIMI_MODEL_ID, FREEBUFF_MINIMAX_MODEL_ID, + FREEBUFF_MINIMAX_M3_MODEL_ID, FREEBUFF_MIMO_V25_MODEL_ID, FREEBUFF_MIMO_V25_PRO_MODEL_ID, } from '@codebuff/common/constants/freebuff-models' @@ -30,6 +31,7 @@ describe('base2 reviewer selection', () => { test.each([ [FREEBUFF_MINIMAX_MODEL_ID, 'code-reviewer-minimax'], + [FREEBUFF_MINIMAX_M3_MODEL_ID, 'code-reviewer-minimax-m3'], [FREEBUFF_KIMI_MODEL_ID, 'code-reviewer-kimi'], [FREEBUFF_DEEPSEEK_V4_PRO_MODEL_ID, 'code-reviewer-deepseek'], [FREEBUFF_DEEPSEEK_V4_FLASH_MODEL_ID, 'code-reviewer-deepseek-flash'], diff --git a/agents/base2/base2-free-minimax-m3.ts b/agents/base2/base2-free-minimax-m3.ts index 240ad0b418..a1d41af84d 100644 --- a/agents/base2/base2-free-minimax-m3.ts +++ b/agents/base2/base2-free-minimax-m3.ts @@ -5,7 +5,6 @@ import { createBase2 } from './base2' const definition = { ...createBase2('free', { model: FREEBUFF_MINIMAX_M3_MODEL_ID, - noReview: true, }), id: 'base2-free-minimax-m3', displayName: 'Buffy the MiniMax M3 Free Orchestrator', diff --git a/agents/reviewer/code-reviewer-minimax-m3.ts b/agents/reviewer/code-reviewer-minimax-m3.ts new file mode 100644 index 0000000000..945a9ef8a2 --- /dev/null +++ b/agents/reviewer/code-reviewer-minimax-m3.ts @@ -0,0 +1,13 @@ +import { FREEBUFF_MINIMAX_M3_MODEL_ID } from '@codebuff/common/constants/freebuff-models' + +import { publisher } from '../constants' +import type { SecretAgentDefinition } from '../types/secret-agent-definition' +import { createReviewer } from './code-reviewer' + +const definition: SecretAgentDefinition = { + id: 'code-reviewer-minimax-m3', + publisher, + ...createReviewer(FREEBUFF_MINIMAX_M3_MODEL_ID), +} + +export default definition diff --git a/bun.lock b/bun.lock index f7b1864204..5105e1658e 100644 --- a/bun.lock +++ b/bun.lock @@ -431,9 +431,9 @@ "@pinojs/redact": ["@pinojs/redact@0.4.0", "", {}, "sha512-k2ENnmBugE/rzQfEcdWHcCY+/FM3VLzH9cYEsbdsoqrvzAKRhUZeRNhAZvB8OitQJ1TBed3yqWtdjzS6wJKBwg=="], - "@posthog/core": ["@posthog/core@1.32.0", "", { "dependencies": { "@posthog/types": "1.386.0" } }, "sha512-ObLtuhf3QgWP6UyyuiLGBPlVaQw2h4wYC3I4cg9m7UfveaY5vqtpqEYNOdpcuYlQYIVkoSYxu9Wsokmmg9q4nA=="], + "@posthog/core": ["@posthog/core@1.32.1", "", { "dependencies": { "@posthog/types": "1.386.1" } }, "sha512-ELq0TQ/MCCj1bY/oFsX53HV6GjRgtzcixhvcPG3Rv+0tU+NaS5Seg1f4cRpfFDTQlIN0Fu+r9oHnFcnXrg7Eew=="], - "@posthog/types": ["@posthog/types@1.386.0", "", {}, "sha512-v2ywYj9gYQ4C2nyTkk54evord9p54ezXCKQNtyqoIQjxmF+Plpum1JGVunAeNeAUWgMuWWEwGu/1VcbOJsLnLw=="], + "@posthog/types": ["@posthog/types@1.386.1", "", {}, "sha512-dsv3xOpKdJIIzcHLzSQ2SZtOvoN2zQMs2thrppTC5e3IVkJUxey+6bY9zOt8FoWHCwQ6jJbNtOp0lVanfbPNeA=="], "@rtsao/scc": ["@rtsao/scc@1.1.0", "", {}, "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g=="], @@ -1321,7 +1321,7 @@ "postgres-interval": ["postgres-interval@1.2.0", "", { "dependencies": { "xtend": "^4.0.0" } }, "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ=="], - "posthog-node": ["posthog-node@5.36.14", "", { "dependencies": { "@posthog/core": "1.32.0" }, "peerDependencies": { "rxjs": "^7.0.0" }, "optionalPeers": ["rxjs"] }, "sha512-3HisrhpcSBHOzTWW3UAVLKwz52YWTbfHeqJ4vergpc05diOKGlz0ckXkQnDZ/a8OJ/UGa3JZyDzkRlVBGeg7IA=="], + "posthog-node": ["posthog-node@5.36.15", "", { "dependencies": { "@posthog/core": "1.32.1" }, "peerDependencies": { "rxjs": "^7.0.0" }, "optionalPeers": ["rxjs"] }, "sha512-rEy0HWxJCPo06UkAv5vgo0VkFsQdQa6yX74LhBRYUjG1QFEAm39PcVzSmiX4YH2x6+OJzZ0UZ17g+wU1fzvmZQ=="], "preact": ["preact@10.29.2", "", {}, "sha512-7tNmwg/7mzzAoB/8kSg6Hl37JraAZw3Z3A0JSY7VXlZwo82Xn0G7wKbNNs2qoF4ZEEsQGTwDAroNdqKs1ofJxQ=="], diff --git a/common/src/__tests__/free-agents.test.ts b/common/src/__tests__/free-agents.test.ts index c58329f824..5e2b380a90 100644 --- a/common/src/__tests__/free-agents.test.ts +++ b/common/src/__tests__/free-agents.test.ts @@ -124,6 +124,18 @@ describe('free mode agent model allowlist', () => { FREEBUFF_KIMI_MODEL_ID, ), ).toBe(false) + expect( + isFreeModeAllowedAgentModel( + 'code-reviewer-minimax-m3', + MINIMAX_M3_MODEL_ID, + ), + ).toBe(true) + expect( + isFreeModeAllowedAgentModel( + 'code-reviewer-minimax-m3', + FREEBUFF_MINIMAX_MODEL_ID, + ), + ).toBe(false) expect( isFreeModeAllowedAgentModel('code-reviewer-kimi', FREEBUFF_KIMI_MODEL_ID), ).toBe(true) diff --git a/common/src/constants/free-agents.ts b/common/src/constants/free-agents.ts index 06e2b3c1bb..9a0d12a1a7 100644 --- a/common/src/constants/free-agents.ts +++ b/common/src/constants/free-agents.ts @@ -53,6 +53,7 @@ export const FREEBUFF_REVIEWER_AGENT_ID_BY_MODEL: Record = { [FREEBUFF_MIMO_V25_PRO_MODEL_ID]: 'code-reviewer-mimo-pro', [FREEBUFF_MIMO_V25_MODEL_ID]: 'code-reviewer-mimo', [FREEBUFF_MINIMAX_MODEL_ID]: 'code-reviewer-minimax', + [FREEBUFF_MINIMAX_M3_MODEL_ID]: 'code-reviewer-minimax-m3', [FREEBUFF_KIMI_MODEL_ID]: 'code-reviewer-kimi', [FREEBUFF_DEEPSEEK_V4_PRO_MODEL_ID]: 'code-reviewer-deepseek', [FREEBUFF_DEEPSEEK_V4_FLASH_MODEL_ID]: 'code-reviewer-deepseek-flash', @@ -105,6 +106,7 @@ export const FREE_MODE_AGENT_MODELS: Record> = { // Code reviewer for free mode 'code-reviewer-minimax': new Set([FREEBUFF_MINIMAX_MODEL_ID]), + 'code-reviewer-minimax-m3': new Set([FREEBUFF_MINIMAX_M3_MODEL_ID]), 'code-reviewer-kimi': new Set([FREEBUFF_KIMI_MODEL_ID]), 'code-reviewer-deepseek': new Set([FREEBUFF_DEEPSEEK_V4_PRO_MODEL_ID]), 'code-reviewer-deepseek-flash': new Set([ From 3c4f5bc561fad11706ba7ee8ab020f6de03256b6 Mon Sep 17 00:00:00 2001 From: codebuff public sync bot <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 10 Jun 2026 22:11:18 +0000 Subject: [PATCH 46/96] Sync public snapshot from freebuff-private Source: CodebuffAI/freebuff-private@6223441c4164534ec4861355c69c7a66e6ca3f78 --- bun.lock | 76 +++++++------------ .../utils/__tests__/error-handling.test.ts | 40 ++++++++++ cli/src/utils/error-handling.ts | 17 +++++ .../util/__tests__/error-api-details.test.ts | 60 +++++++++++++++ common/src/util/error.ts | 20 +++++ 5 files changed, 163 insertions(+), 50 deletions(-) diff --git a/bun.lock b/bun.lock index 5105e1658e..5ae48cb687 100644 --- a/bun.lock +++ b/bun.lock @@ -239,19 +239,15 @@ "@eslint-community/regexpp": ["@eslint-community/regexpp@4.12.2", "", {}, "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew=="], - "@eslint/config-array": ["@eslint/config-array@0.21.2", "", { "dependencies": { "@eslint/object-schema": "^2.1.7", "debug": "^4.3.1", "minimatch": "^3.1.5" } }, "sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw=="], + "@eslint/config-array": ["@eslint/config-array@0.23.5", "", { "dependencies": { "@eslint/object-schema": "^3.0.5", "debug": "^4.3.1", "minimatch": "^10.2.4" } }, "sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA=="], - "@eslint/config-helpers": ["@eslint/config-helpers@0.4.2", "", { "dependencies": { "@eslint/core": "^0.17.0" } }, "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw=="], + "@eslint/config-helpers": ["@eslint/config-helpers@0.6.0", "", { "dependencies": { "@eslint/core": "^1.2.1" } }, "sha512-ii6Bw9jJ2zi2cWA2Z+9/QZ/+3DX6kwaV5Q986D/CdP3Lap3w/pgQZ373FV7byY/i7L4IRH/G43I5dz1ClsCbpA=="], - "@eslint/core": ["@eslint/core@0.17.0", "", { "dependencies": { "@types/json-schema": "^7.0.15" } }, "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ=="], + "@eslint/core": ["@eslint/core@1.2.1", "", { "dependencies": { "@types/json-schema": "^7.0.15" } }, "sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ=="], - "@eslint/eslintrc": ["@eslint/eslintrc@3.3.5", "", { "dependencies": { "ajv": "^6.14.0", "debug": "^4.3.2", "espree": "^10.0.1", "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.1", "minimatch": "^3.1.5", "strip-json-comments": "^3.1.1" } }, "sha512-4IlJx0X0qftVsN5E+/vGujTRIFtwuLbNsVUe7TO6zYPDR1O6nFwvwhIKEKSrl6dZchmYBITazxKoUYOjdtjlRg=="], + "@eslint/object-schema": ["@eslint/object-schema@3.0.5", "", {}, "sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw=="], - "@eslint/js": ["@eslint/js@9.39.4", "", {}, "sha512-nE7DEIchvtiFTwBw4Lfbu59PG+kCofhjsKaCWzxTpt4lfRjRMqG6uMBzKXuEcyXhOHoUp9riAm7/aWYGhXZ9cw=="], - - "@eslint/object-schema": ["@eslint/object-schema@2.1.7", "", {}, "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA=="], - - "@eslint/plugin-kit": ["@eslint/plugin-kit@0.4.1", "", { "dependencies": { "@eslint/core": "^0.17.0", "levn": "^0.4.1" } }, "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA=="], + "@eslint/plugin-kit": ["@eslint/plugin-kit@0.7.2", "", { "dependencies": { "@eslint/core": "^1.2.1", "levn": "^0.4.1" } }, "sha512-+CNAzxglkrpNf/kKywqQfk74QjtceuOE7Qm+AF8miRvPF/wmmK5+OJOgVh3AVTT3RP2mH3+FOaxlE5v72owk0A=="], "@gravity-ai/api": ["@gravity-ai/api@0.1.2", "", { "dependencies": { "axios": "^1.13.2" } }, "sha512-txsAhyzvwB/TNrj5R8DoNqw8afM3JY2ahl7aaeaD5ZsxP+7rxff7C7keGI7+gU2KT3d2Mcw4QB1nHhbTSCJYHw=="], @@ -467,6 +463,8 @@ "@types/diff": ["@types/diff@8.0.0", "", { "dependencies": { "diff": "*" } }, "sha512-o7jqJM04gfaYrdCecCVMbZhNdG6T1MHg/oQoRFdERLV+4d+V7FijhiEAbFu0Usww84Yijk9yH58U4Jk4HbtzZw=="], + "@types/esrecurse": ["@types/esrecurse@4.3.1", "", {}, "sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw=="], + "@types/estree": ["@types/estree@1.0.9", "", {}, "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg=="], "@types/js-yaml": ["@types/js-yaml@4.0.9", "", {}, "sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg=="], @@ -549,7 +547,7 @@ "ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="], - "ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + "ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], "any-base": ["any-base@1.1.0", "", {}, "sha512-uMgjozySS8adZZYePpaWs8cxB9/kdzmpX6SgJZ+wbz1K5eYk5QMYDVJaZKhxyIHUdnnJkfR7SVgStgH7LkGUyg=="], @@ -625,8 +623,6 @@ "call-bound": ["call-bound@1.0.4", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "get-intrinsic": "^1.3.0" } }, "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg=="], - "callsites": ["callsites@3.1.0", "", {}, "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="], - "caniuse-lite": ["caniuse-lite@1.0.30001797", "", {}, "sha512-l8xKG+gwAIExZGl9FrF7KUwuOmk6wbEPC9Xoy/RtnWv1XG0Q4LFlagaLpUv3Kiza3W/wm27zy0yWJEieYKAP6w=="], "canvas": ["canvas@3.2.3", "", { "dependencies": { "node-addon-api": "^7.0.0", "prebuild-install": "^7.1.3" } }, "sha512-PzE5nJZPz72YUAfo8oTp0u3fqqY7IzlTubneAihqDYAUcBk7ryeCmBbdJBEdaH0bptSOe2VT2Zwcb3UaFyaSWw=="], @@ -751,7 +747,7 @@ "escape-string-regexp": ["escape-string-regexp@4.0.0", "", {}, "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="], - "eslint": ["eslint@9.39.4", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", "@eslint/config-array": "^0.21.2", "@eslint/config-helpers": "^0.4.2", "@eslint/core": "^0.17.0", "@eslint/eslintrc": "^3.3.5", "@eslint/js": "9.39.4", "@eslint/plugin-kit": "^0.4.1", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "ajv": "^6.14.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^8.4.0", "eslint-visitor-keys": "^4.2.1", "espree": "^10.4.0", "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.5", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, "peerDependencies": { "jiti": "*" }, "optionalPeers": ["jiti"], "bin": { "eslint": "bin/eslint.js" } }, "sha512-XoMjdBOwe/esVgEvLmNsD3IRHkm7fbKIUGvrleloJXUZgDHig2IPWNniv+GwjyJXzuNqVjlr5+4yVUZjycJwfQ=="], + "eslint": ["eslint@10.4.1", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.2", "@eslint/config-array": "^0.23.5", "@eslint/config-helpers": "^0.6.0", "@eslint/core": "^1.2.1", "@eslint/plugin-kit": "^0.7.2", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "ajv": "^6.14.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^9.1.2", "eslint-visitor-keys": "^5.0.1", "espree": "^11.2.0", "esquery": "^1.7.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "minimatch": "^10.2.4", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, "peerDependencies": { "jiti": "*" }, "optionalPeers": ["jiti"], "bin": { "eslint": "bin/eslint.js" } }, "sha512-AyIKhnOBuOAdueD7RB3xB+YeAWScb9jHsJBgH2Hcde8InP5JYhqrRR6iTMHyTEwgENK54Cp44e4v8BwNhsuHuw=="], "eslint-config-prettier": ["eslint-config-prettier@9.1.2", "", { "peerDependencies": { "eslint": ">=7.0.0" }, "bin": { "eslint-config-prettier": "bin/cli.js" } }, "sha512-iI1f+D2ViGn+uvv5HuHVUamg8ll4tN+JRHGc6IJi4TP9Kl976C57fzPXgseXNs8v0iA8aSJpHsTWjDb9QJamGQ=="], @@ -763,11 +759,11 @@ "eslint-plugin-unused-imports": ["eslint-plugin-unused-imports@4.4.1", "", { "peerDependencies": { "@typescript-eslint/eslint-plugin": "^8.0.0-0 || ^7.0.0 || ^6.0.0 || ^5.0.0", "eslint": "^10.0.0 || ^9.0.0 || ^8.0.0" }, "optionalPeers": ["@typescript-eslint/eslint-plugin"] }, "sha512-oZGYUz1X3sRMGUB+0cZyK2VcvRX5lm/vB56PgNNcU+7ficUCKm66oZWKUubXWnOuPjQ8PvmXtCViXBMONPe7tQ=="], - "eslint-scope": ["eslint-scope@8.4.0", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg=="], + "eslint-scope": ["eslint-scope@9.1.2", "", { "dependencies": { "@types/esrecurse": "^4.3.1", "@types/estree": "^1.0.8", "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ=="], "eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="], - "espree": ["espree@10.4.0", "", { "dependencies": { "acorn": "^8.15.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^4.2.1" } }, "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ=="], + "espree": ["espree@11.2.0", "", { "dependencies": { "acorn": "^8.16.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^5.0.1" } }, "sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw=="], "esprima": ["esprima@4.0.1", "", { "bin": { "esparse": "./bin/esparse.js", "esvalidate": "./bin/esvalidate.js" } }, "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="], @@ -879,8 +875,6 @@ "glob-parent": ["glob-parent@6.0.2", "", { "dependencies": { "is-glob": "^4.0.3" } }, "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A=="], - "globals": ["globals@14.0.0", "", {}, "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ=="], - "globalthis": ["globalthis@1.0.4", "", { "dependencies": { "define-properties": "^1.2.1", "gopd": "^1.0.1" } }, "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ=="], "globby": ["globby@11.1.0", "", { "dependencies": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", "fast-glob": "^3.2.9", "ignore": "^5.2.0", "merge2": "^1.4.1", "slash": "^3.0.0" } }, "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g=="], @@ -895,8 +889,6 @@ "has-bigints": ["has-bigints@1.1.0", "", {}, "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg=="], - "has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], - "has-property-descriptors": ["has-property-descriptors@1.0.2", "", { "dependencies": { "es-define-property": "^1.0.0" } }, "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg=="], "has-proto": ["has-proto@1.2.0", "", { "dependencies": { "dunder-proto": "^1.0.0" } }, "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ=="], @@ -927,8 +919,6 @@ "immer": ["immer@10.2.0", "", {}, "sha512-d/+XTN3zfODyjr89gM3mPq1WNX2B8pYsu7eORitdwyA2sBubnTl3laYlBk4sXY5FUa5qTZGBDPJICVbvqzjlbw=="], - "import-fresh": ["import-fresh@3.3.1", "", { "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" } }, "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ=="], - "imurmurhash": ["imurmurhash@0.1.4", "", {}, "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA=="], "inherits": ["inherits@2.0.4", "", {}, "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="], @@ -1045,8 +1035,6 @@ "lodash": ["lodash@4.17.23", "", {}, "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w=="], - "lodash.merge": ["lodash.merge@4.6.2", "", {}, "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ=="], - "log-update": ["log-update@8.0.0", "", { "dependencies": { "ansi-escapes": "^7.3.0", "cli-cursor": "^5.0.0", "slice-ansi": "^9.0.0", "string-width": "^8.2.0", "strip-ansi": "^7.2.0", "wrap-ansi": "^10.0.0" } }, "sha512-lddSgOt3bPASrylL54ZSpy8nBHns+vBVSoILlVOx+dei300pnLRN958rj/EdlVLKuWlSESU3qdnDZdAI7FXYGg=="], "longest-streak": ["longest-streak@3.1.0", "", {}, "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g=="], @@ -1249,8 +1237,6 @@ "pako": ["pako@1.0.11", "", {}, "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw=="], - "parent-module": ["parent-module@1.0.1", "", { "dependencies": { "callsites": "^3.0.0" } }, "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g=="], - "parse-bmfont-ascii": ["parse-bmfont-ascii@1.0.6", "", {}, "sha512-U4RrVsUFCleIOBsIGYOMKjn9PavsGOXxbvYGtMOEfnId0SVNsgehXh1DxUdVPLoxd5mvcEtvmKs2Mmf0Mpa1ZA=="], "parse-bmfont-binary": ["parse-bmfont-binary@1.0.6", "", {}, "sha512-GxmsRea0wdGdYthjuUeWTMWPqm2+FAd4GI8vCvhgJsFnoGhTrLhXDDupwTo7rXVAgaLIGoVHDZS9p/5XbSqeWA=="], @@ -1395,8 +1381,6 @@ "resolve": ["resolve@2.0.0-next.7", "", { "dependencies": { "es-errors": "^1.3.0", "is-core-module": "^2.16.2", "node-exports-info": "^1.6.0", "object-keys": "^1.1.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-tqt+NBWwyaMgw3zDsnygx4CByWjQEJHOPMdslYhppaQSJUtL/D4JO9CcBBlhPoI8lz9oJIDXkwXfhF4aWqP8xQ=="], - "resolve-from": ["resolve-from@4.0.0", "", {}, "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="], - "resolve-pkg-maps": ["resolve-pkg-maps@1.0.0", "", {}, "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw=="], "restore-cursor": ["restore-cursor@5.1.0", "", { "dependencies": { "onetime": "^7.0.0", "signal-exit": "^4.1.0" } }, "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA=="], @@ -1501,7 +1485,7 @@ "strip-final-newline": ["strip-final-newline@2.0.0", "", {}, "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA=="], - "strip-json-comments": ["strip-json-comments@3.1.1", "", {}, "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig=="], + "strip-json-comments": ["strip-json-comments@2.0.1", "", {}, "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ=="], "stripe": ["stripe@16.12.0", "", { "dependencies": { "@types/node": ">=8.1.0", "qs": "^6.11.0" } }, "sha512-H7eFVLDxeTNNSn4JTRfL2//LzCbDrMSZ+2q1c7CanVWgK2qIW5TwS+0V7N9KcKZZNpYh/uCqK0PyZh/2UsaAtQ=="], @@ -1509,8 +1493,6 @@ "styled-jsx": ["styled-jsx@5.1.6", "", { "dependencies": { "client-only": "0.0.1" }, "peerDependencies": { "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0" } }, "sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA=="], - "supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], - "supports-preserve-symlinks-flag": ["supports-preserve-symlinks-flag@1.0.0", "", {}, "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w=="], "supports-terminal-graphics": ["supports-terminal-graphics@0.1.0", "", {}, "sha512-+KdfozhS0Fw8y5Sghw8kkZNGT8nWYzJ1EzcoIvVjxhl+26TJTs26y02yfBgvc1jh5AS/c8jcI3xtahhR95KRyQ=="], @@ -1669,18 +1651,12 @@ "@codebuff/sdk/ignore": ["ignore@7.0.5", "", {}, "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg=="], - "@eslint/eslintrc/ajv": ["ajv@6.15.0", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw=="], - - "@eslint/eslintrc/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], - - "@eslint/eslintrc/js-yaml": ["js-yaml@4.2.0", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-ePWsvanv0DWuDRsW8dnt+R4jQ31SCRCQ7hhNcPXZPsoBZiemuZNYGf7adZdqX2D86j6rvKp3RpCxVTSb8WQlOw=="], + "@eslint/config-array/minimatch": ["minimatch@10.2.5", "", { "dependencies": { "brace-expansion": "^5.0.5" } }, "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg=="], "@opentui/core/diff": ["diff@9.0.0", "", {}, "sha512-svtcdpS8CgJyqAjEQIXdb3OjhFVVYjzGAPO8WGCmRbrml64SPw/jJD4GoE98aR7r25A0XcgrK3F02yw9R/vhQw=="], "@opentui/core/strip-ansi": ["strip-ansi@7.1.2", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA=="], - "@types/diff/diff": ["diff@9.0.0", "", {}, "sha512-svtcdpS8CgJyqAjEQIXdb3OjhFVVYjzGAPO8WGCmRbrml64SPw/jJD4GoE98aR7r25A0XcgrK3F02yw9R/vhQw=="], - "@typescript-eslint/eslint-plugin/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], "@typescript-eslint/parser/@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@7.18.0", "", { "dependencies": { "@typescript-eslint/types": "7.18.0", "@typescript-eslint/visitor-keys": "7.18.0" } }, "sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA=="], @@ -1709,12 +1685,12 @@ "eslint/ajv": ["ajv@6.15.0", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw=="], - "eslint/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], - - "eslint/eslint-visitor-keys": ["eslint-visitor-keys@4.2.1", "", {}, "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ=="], + "eslint/eslint-visitor-keys": ["eslint-visitor-keys@5.0.1", "", {}, "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA=="], "eslint/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], + "eslint/minimatch": ["minimatch@10.2.5", "", { "dependencies": { "brace-expansion": "^5.0.5" } }, "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg=="], + "eslint-import-resolver-node/debug": ["debug@3.2.7", "", { "dependencies": { "ms": "^2.1.1" } }, "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ=="], "eslint-module-utils/debug": ["debug@3.2.7", "", { "dependencies": { "ms": "^2.1.1" } }, "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ=="], @@ -1725,7 +1701,7 @@ "eslint-plugin-import/tsconfig-paths": ["tsconfig-paths@3.15.0", "", { "dependencies": { "@types/json5": "^0.0.29", "json5": "^1.0.2", "minimist": "^1.2.6", "strip-bom": "^3.0.0" } }, "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg=="], - "espree/eslint-visitor-keys": ["eslint-visitor-keys@4.2.1", "", {}, "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ=="], + "espree/eslint-visitor-keys": ["eslint-visitor-keys@5.0.1", "", {}, "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA=="], "execa/onetime": ["onetime@5.1.2", "", { "dependencies": { "mimic-fn": "^2.1.0" } }, "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg=="], @@ -1753,16 +1729,12 @@ "plist/xmlbuilder": ["xmlbuilder@15.1.1", "", {}, "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg=="], - "rc/strip-json-comments": ["strip-json-comments@2.0.1", "", {}, "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ=="], - "react-devtools-core/ws": ["ws@7.5.11", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": "^5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-zS54Oen9bITtp7kp2XM3AydrCIq1D+HwJOuH+c+e4LfpL/lotP5osijd+UoMnxwAam1GN8R4KtLAyIrIcBNpiA=="], "react-reconciler/scheduler": ["scheduler@0.26.0", "", {}, "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA=="], "send/mime-types": ["mime-types@3.0.2", "", { "dependencies": { "mime-db": "^1.54.0" } }, "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A=="], - "slice-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], - "tar-stream/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=="], "ts-node/diff": ["diff@4.0.4", "", {}, "sha512-X07nttJQkwkfKfvTPG/KSnE2OMdcUCao6+eXF3wmnIQRn2aPAHH3VxDbDOdegkd6JbPsXqShpvEOHfAT+nCNwQ=="], @@ -1777,8 +1749,6 @@ "typescript-eslint/@typescript-eslint/utils": ["@typescript-eslint/utils@7.18.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@typescript-eslint/scope-manager": "7.18.0", "@typescript-eslint/types": "7.18.0", "@typescript-eslint/typescript-estree": "7.18.0" }, "peerDependencies": { "eslint": "^8.56.0" } }, "sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw=="], - "wrap-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], - "wrap-ansi/string-width": ["string-width@8.2.1", "", { "dependencies": { "get-east-asian-width": "^1.5.0", "strip-ansi": "^7.1.2" } }, "sha512-IIaP0g3iy9Cyy18w3M9YcaDudujEAVHKt3a3QJg1+sr/oX96TbaGUubG0hJyCjCBThFH+tFpcIyoUHUn1ogaLA=="], "yargs/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], @@ -1787,9 +1757,7 @@ "@codebuff/evals/pino/process-warning": ["process-warning@5.0.0", "", {}, "sha512-a39t9ApHNx2L4+HBnQKqxxHNs1r7KF+Intd8Q/g1bUh6q0WIp9voPXJ/x0j+ZL45KF1pJd9+q2jLIRMfvEshkA=="], - "@eslint/eslintrc/ajv/json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], - - "@eslint/eslintrc/js-yaml/argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="], + "@eslint/config-array/minimatch/brace-expansion": ["brace-expansion@5.0.6", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g=="], "@typescript-eslint/parser/@typescript-eslint/typescript-estree/minimatch": ["minimatch@9.0.9", "", { "dependencies": { "brace-expansion": "^2.0.2" } }, "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg=="], @@ -1803,10 +1771,14 @@ "cliui/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], + "cliui/wrap-ansi/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + "eslint-plugin-import/tsconfig-paths/json5": ["json5@1.0.2", "", { "dependencies": { "minimist": "^1.2.0" }, "bin": { "json5": "lib/cli.js" } }, "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA=="], "eslint/ajv/json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], + "eslint/minimatch/brace-expansion": ["brace-expansion@5.0.6", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g=="], + "express/mime-types/mime-db": ["mime-db@1.54.0", "", {}, "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ=="], "p-locate/p-limit/yocto-queue": ["yocto-queue@0.1.0", "", {}, "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="], @@ -1835,8 +1807,12 @@ "yargs/string-width/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + "@eslint/config-array/minimatch/brace-expansion/balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="], + "@typescript-eslint/parser/@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.1.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-WR1cURNjuvBLMZBMbqM0UoE+WAfdUcEV1ccD8PVBVOI+Z3ND4+SZbN8RsfT2bMuG1qwz5RFvPukSZm5fF2D5eA=="], + "eslint/minimatch/brace-expansion/balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="], + "typescript-eslint/@typescript-eslint/eslint-plugin/@typescript-eslint/scope-manager/@typescript-eslint/types": ["@typescript-eslint/types@7.18.0", "", {}, "sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ=="], "typescript-eslint/@typescript-eslint/eslint-plugin/@typescript-eslint/type-utils/@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@7.18.0", "", { "dependencies": { "@typescript-eslint/types": "7.18.0", "@typescript-eslint/visitor-keys": "7.18.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", "minimatch": "^9.0.4", "semver": "^7.6.0", "ts-api-utils": "^1.3.0" } }, "sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA=="], diff --git a/cli/src/utils/__tests__/error-handling.test.ts b/cli/src/utils/__tests__/error-handling.test.ts index 73517de083..f556550903 100644 --- a/cli/src/utils/__tests__/error-handling.test.ts +++ b/cli/src/utils/__tests__/error-handling.test.ts @@ -228,6 +228,46 @@ describe('error-handling', () => { }), ).toBe(FREEBUFF_RATE_LIMIT_MESSAGE) }) + + test('appends detail from agent-run output objects for untyped 429s', () => { + expect( + getFreebuffRateLimitErrorMessage({ + type: 'error', + statusCode: 429, + message: 'Model is at capacity. Please try again later.', + }), + ).toBe( + `${FREEBUFF_RATE_LIMIT_MESSAGE} (Model is at capacity. Please try again later.)`, + ) + }) + + test('appends detail from OpenAI-style nested provider error bodies', () => { + expect( + getFreebuffRateLimitErrorMessage({ + statusCode: 429, + message: 'Too Many Requests', + responseBody: JSON.stringify({ + error: { + message: 'Model is at capacity. Please try again later.', + code: null, + type: 'rate_limit_error', + }, + }), + }), + ).toBe( + `${FREEBUFF_RATE_LIMIT_MESSAGE} (Model is at capacity. Please try again later.)`, + ) + }) + + test('does not echo bare HTTP status text from output objects', () => { + expect( + getFreebuffRateLimitErrorMessage({ + type: 'error', + statusCode: 429, + message: 'Too Many Requests', + }), + ).toBe(FREEBUFF_RATE_LIMIT_MESSAGE) + }) }) describe('getCountryBlockFromFreeModeError', () => { diff --git a/cli/src/utils/error-handling.ts b/cli/src/utils/error-handling.ts index 0eb9a682cf..2944941138 100644 --- a/cli/src/utils/error-handling.ts +++ b/cli/src/utils/error-handling.ts @@ -121,8 +121,25 @@ export const getFreebuffRateLimitErrorMessage = ( const details = getCliApiErrorDetails(error) if (details.statusCode !== 429) return null if (details.errorCode === 'free_mode_rate_limited') { + // Our own rate limiter's message is already user-facing and includes the + // retry countdown — show it verbatim. return details.message ?? FREEBUFF_RATE_LIMIT_MESSAGE } + // Other 429s (e.g. relayed upstream capacity errors) keep the branded + // message but include the server detail so users aren't left guessing. + // Only trust messages parsed from a server response body, or the curated + // message on an agent-run output object — top-level messages on raw thrown + // errors are HTTP status text or retry-wrapper noise. + const isRunOutputObject = + !!error && + typeof error === 'object' && + (error as { type?: unknown }).type === 'error' + const detail = + extractApiErrorDetails(error).message ?? + (isRunOutputObject ? details.message : undefined) + if (detail && !/^too many requests\.?$/i.test(detail)) { + return `${FREEBUFF_RATE_LIMIT_MESSAGE} (${detail})` + } return FREEBUFF_RATE_LIMIT_MESSAGE } diff --git a/common/src/util/__tests__/error-api-details.test.ts b/common/src/util/__tests__/error-api-details.test.ts index 0e0312275b..23dcde8c80 100644 --- a/common/src/util/__tests__/error-api-details.test.ts +++ b/common/src/util/__tests__/error-api-details.test.ts @@ -32,4 +32,64 @@ describe('extractApiErrorDetails', () => { 'Another instance of freebuff has taken over this session. Only one instance per account is allowed.', }) }) + + it('extracts details from OpenAI-style nested error objects', () => { + const apiError = new Error('Too Many Requests') as Error & { + statusCode: number + responseBody: string + } + apiError.statusCode = 429 + apiError.responseBody = JSON.stringify({ + error: { + message: 'Model is at capacity. Please try again later.', + code: null, + type: 'rate_limit_error', + }, + }) + + expect(extractApiErrorDetails(apiError)).toEqual({ + statusCode: 429, + errorCode: 'rate_limit_error', + message: 'Model is at capacity. Please try again later.', + }) + }) + + it('prefers nested error code over type when both are strings', () => { + const apiError = new Error('Too Many Requests') as Error & { + statusCode: number + responseBody: string + } + apiError.statusCode = 429 + apiError.responseBody = JSON.stringify({ + error: { + message: 'Slow down.', + code: 'rate_limited', + type: 'rate_limit_error', + }, + }) + + expect(extractApiErrorDetails(apiError)).toEqual({ + statusCode: 429, + errorCode: 'rate_limited', + message: 'Slow down.', + }) + }) + + it('keeps top-level string fields when both shapes are present', () => { + const apiError = new Error('Too Many Requests') as Error & { + statusCode: number + responseBody: string + } + apiError.statusCode = 429 + apiError.responseBody = JSON.stringify({ + error: 'free_mode_rate_limited', + message: 'Free mode rate limit exceeded (1 minute limit).', + }) + + expect(extractApiErrorDetails(apiError)).toEqual({ + statusCode: 429, + errorCode: 'free_mode_rate_limited', + message: 'Free mode rate limit exceeded (1 minute limit).', + }) + }) }) diff --git a/common/src/util/error.ts b/common/src/util/error.ts index 0e96665fe2..5436e68bea 100644 --- a/common/src/util/error.ts +++ b/common/src/util/error.ts @@ -225,6 +225,26 @@ export function parseApiErrorResponseBody(responseBody: unknown): { ) { result.message = (parsed as { message: string }).message } + // OpenAI-style nested error object: { error: { message, code, type } }. + // Upstream provider errors (Fireworks, OpenRouter, etc.) are relayed to + // the client in this shape. + if ( + 'error' in parsed && + typeof (parsed as { error: unknown }).error === 'object' && + (parsed as { error: unknown }).error !== null + ) { + const nested = (parsed as { error: Record }).error + if (result.errorCode === undefined) { + if (typeof nested.code === 'string') { + result.errorCode = nested.code + } else if (typeof nested.type === 'string') { + result.errorCode = nested.type + } + } + if (result.message === undefined && typeof nested.message === 'string') { + result.message = nested.message + } + } if ( 'countryCode' in parsed && typeof (parsed as { countryCode: unknown }).countryCode === 'string' From e12b964a7c0272391cb738379467c46478772805 Mon Sep 17 00:00:00 2001 From: codebuff public sync bot <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 10 Jun 2026 22:48:32 +0000 Subject: [PATCH 47/96] Sync public snapshot from freebuff-private Source: CodebuffAI/freebuff-private@9645f333f21a7f1feb386b6cc33c062c03c15009 --- bun.lock | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/bun.lock b/bun.lock index 5ae48cb687..93665ce75c 100644 --- a/bun.lock +++ b/bun.lock @@ -481,7 +481,7 @@ "@types/ms": ["@types/ms@2.1.0", "", {}, "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA=="], - "@types/node": ["@types/node@22.19.20", "", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-6tELRwSDYWW9EdZhbeZmYGZ1/7Djkt+Ah3/ScEYT9cDord7UJzasR/4D3VONg9tQI5CDp+/CZC1AXj2pCFOvpw=="], + "@types/node": ["@types/node@22.19.21", "", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-VMeFBSCKQKmm2swI2kW51SFusDqekC6q9trBCvJ/JliDchFSuoYYKN7yVNjPthP1HKZcx3U1gI/wTcEBjEFKTA=="], "@types/node-fetch": ["@types/node-fetch@2.6.13", "", { "dependencies": { "@types/node": "*", "form-data": "^4.0.4" } }, "sha512-QGpRVpzSaUs30JBSGPjOg4Uveu384erbHBoT1zeONvyCfwQxIkUshLAOqN/k9EjGviPRmWTTe6aH2qySWKTVSw=="], @@ -1657,6 +1657,8 @@ "@opentui/core/strip-ansi": ["strip-ansi@7.1.2", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA=="], + "@types/diff/diff": ["diff@9.0.0", "", {}, "sha512-svtcdpS8CgJyqAjEQIXdb3OjhFVVYjzGAPO8WGCmRbrml64SPw/jJD4GoE98aR7r25A0XcgrK3F02yw9R/vhQw=="], + "@typescript-eslint/eslint-plugin/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], "@typescript-eslint/parser/@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@7.18.0", "", { "dependencies": { "@typescript-eslint/types": "7.18.0", "@typescript-eslint/visitor-keys": "7.18.0" } }, "sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA=="], From 8510e15c4cc0093ecc4473921f3142e8699c8f04 Mon Sep 17 00:00:00 2001 From: codebuff public sync bot <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 10 Jun 2026 23:52:02 +0000 Subject: [PATCH 48/96] Sync public snapshot from freebuff-private Source: CodebuffAI/freebuff-private@c5c07f74f3788bc6269fa5c494932e4524a94f95 --- freebuff/cli/release/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/freebuff/cli/release/package.json b/freebuff/cli/release/package.json index db4f8df4ae..3242797e6d 100644 --- a/freebuff/cli/release/package.json +++ b/freebuff/cli/release/package.json @@ -1,6 +1,6 @@ { "name": "freebuff", - "version": "0.0.105", + "version": "0.0.106", "description": "The world's strongest free coding agent", "license": "MIT", "bin": { From 0af3034a3fc89d3b8e081ef5772a2b936163a8da Mon Sep 17 00:00:00 2001 From: codebuff public sync bot <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 11 Jun 2026 00:22:23 +0000 Subject: [PATCH 49/96] Sync public snapshot from freebuff-private Source: CodebuffAI/freebuff-private@310fce8745a1688e6918c7338f26baeb7570d187 --- bun.lock | 74 ++++++++++++++++++++++++++++++++++++-------------------- 1 file changed, 48 insertions(+), 26 deletions(-) diff --git a/bun.lock b/bun.lock index 93665ce75c..9ff557b69a 100644 --- a/bun.lock +++ b/bun.lock @@ -239,15 +239,19 @@ "@eslint-community/regexpp": ["@eslint-community/regexpp@4.12.2", "", {}, "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew=="], - "@eslint/config-array": ["@eslint/config-array@0.23.5", "", { "dependencies": { "@eslint/object-schema": "^3.0.5", "debug": "^4.3.1", "minimatch": "^10.2.4" } }, "sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA=="], + "@eslint/config-array": ["@eslint/config-array@0.21.2", "", { "dependencies": { "@eslint/object-schema": "^2.1.7", "debug": "^4.3.1", "minimatch": "^3.1.5" } }, "sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw=="], - "@eslint/config-helpers": ["@eslint/config-helpers@0.6.0", "", { "dependencies": { "@eslint/core": "^1.2.1" } }, "sha512-ii6Bw9jJ2zi2cWA2Z+9/QZ/+3DX6kwaV5Q986D/CdP3Lap3w/pgQZ373FV7byY/i7L4IRH/G43I5dz1ClsCbpA=="], + "@eslint/config-helpers": ["@eslint/config-helpers@0.4.2", "", { "dependencies": { "@eslint/core": "^0.17.0" } }, "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw=="], - "@eslint/core": ["@eslint/core@1.2.1", "", { "dependencies": { "@types/json-schema": "^7.0.15" } }, "sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ=="], + "@eslint/core": ["@eslint/core@0.17.0", "", { "dependencies": { "@types/json-schema": "^7.0.15" } }, "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ=="], - "@eslint/object-schema": ["@eslint/object-schema@3.0.5", "", {}, "sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw=="], + "@eslint/eslintrc": ["@eslint/eslintrc@3.3.5", "", { "dependencies": { "ajv": "^6.14.0", "debug": "^4.3.2", "espree": "^10.0.1", "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.1", "minimatch": "^3.1.5", "strip-json-comments": "^3.1.1" } }, "sha512-4IlJx0X0qftVsN5E+/vGujTRIFtwuLbNsVUe7TO6zYPDR1O6nFwvwhIKEKSrl6dZchmYBITazxKoUYOjdtjlRg=="], - "@eslint/plugin-kit": ["@eslint/plugin-kit@0.7.2", "", { "dependencies": { "@eslint/core": "^1.2.1", "levn": "^0.4.1" } }, "sha512-+CNAzxglkrpNf/kKywqQfk74QjtceuOE7Qm+AF8miRvPF/wmmK5+OJOgVh3AVTT3RP2mH3+FOaxlE5v72owk0A=="], + "@eslint/js": ["@eslint/js@9.39.4", "", {}, "sha512-nE7DEIchvtiFTwBw4Lfbu59PG+kCofhjsKaCWzxTpt4lfRjRMqG6uMBzKXuEcyXhOHoUp9riAm7/aWYGhXZ9cw=="], + + "@eslint/object-schema": ["@eslint/object-schema@2.1.7", "", {}, "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA=="], + + "@eslint/plugin-kit": ["@eslint/plugin-kit@0.4.1", "", { "dependencies": { "@eslint/core": "^0.17.0", "levn": "^0.4.1" } }, "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA=="], "@gravity-ai/api": ["@gravity-ai/api@0.1.2", "", { "dependencies": { "axios": "^1.13.2" } }, "sha512-txsAhyzvwB/TNrj5R8DoNqw8afM3JY2ahl7aaeaD5ZsxP+7rxff7C7keGI7+gU2KT3d2Mcw4QB1nHhbTSCJYHw=="], @@ -463,8 +467,6 @@ "@types/diff": ["@types/diff@8.0.0", "", { "dependencies": { "diff": "*" } }, "sha512-o7jqJM04gfaYrdCecCVMbZhNdG6T1MHg/oQoRFdERLV+4d+V7FijhiEAbFu0Usww84Yijk9yH58U4Jk4HbtzZw=="], - "@types/esrecurse": ["@types/esrecurse@4.3.1", "", {}, "sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw=="], - "@types/estree": ["@types/estree@1.0.9", "", {}, "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg=="], "@types/js-yaml": ["@types/js-yaml@4.0.9", "", {}, "sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg=="], @@ -547,7 +549,7 @@ "ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="], - "ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], + "ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], "any-base": ["any-base@1.1.0", "", {}, "sha512-uMgjozySS8adZZYePpaWs8cxB9/kdzmpX6SgJZ+wbz1K5eYk5QMYDVJaZKhxyIHUdnnJkfR7SVgStgH7LkGUyg=="], @@ -623,6 +625,8 @@ "call-bound": ["call-bound@1.0.4", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "get-intrinsic": "^1.3.0" } }, "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg=="], + "callsites": ["callsites@3.1.0", "", {}, "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="], + "caniuse-lite": ["caniuse-lite@1.0.30001797", "", {}, "sha512-l8xKG+gwAIExZGl9FrF7KUwuOmk6wbEPC9Xoy/RtnWv1XG0Q4LFlagaLpUv3Kiza3W/wm27zy0yWJEieYKAP6w=="], "canvas": ["canvas@3.2.3", "", { "dependencies": { "node-addon-api": "^7.0.0", "prebuild-install": "^7.1.3" } }, "sha512-PzE5nJZPz72YUAfo8oTp0u3fqqY7IzlTubneAihqDYAUcBk7ryeCmBbdJBEdaH0bptSOe2VT2Zwcb3UaFyaSWw=="], @@ -747,7 +751,7 @@ "escape-string-regexp": ["escape-string-regexp@4.0.0", "", {}, "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="], - "eslint": ["eslint@10.4.1", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.2", "@eslint/config-array": "^0.23.5", "@eslint/config-helpers": "^0.6.0", "@eslint/core": "^1.2.1", "@eslint/plugin-kit": "^0.7.2", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "ajv": "^6.14.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^9.1.2", "eslint-visitor-keys": "^5.0.1", "espree": "^11.2.0", "esquery": "^1.7.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "minimatch": "^10.2.4", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, "peerDependencies": { "jiti": "*" }, "optionalPeers": ["jiti"], "bin": { "eslint": "bin/eslint.js" } }, "sha512-AyIKhnOBuOAdueD7RB3xB+YeAWScb9jHsJBgH2Hcde8InP5JYhqrRR6iTMHyTEwgENK54Cp44e4v8BwNhsuHuw=="], + "eslint": ["eslint@9.39.4", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", "@eslint/config-array": "^0.21.2", "@eslint/config-helpers": "^0.4.2", "@eslint/core": "^0.17.0", "@eslint/eslintrc": "^3.3.5", "@eslint/js": "9.39.4", "@eslint/plugin-kit": "^0.4.1", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "ajv": "^6.14.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^8.4.0", "eslint-visitor-keys": "^4.2.1", "espree": "^10.4.0", "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.5", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, "peerDependencies": { "jiti": "*" }, "optionalPeers": ["jiti"], "bin": { "eslint": "bin/eslint.js" } }, "sha512-XoMjdBOwe/esVgEvLmNsD3IRHkm7fbKIUGvrleloJXUZgDHig2IPWNniv+GwjyJXzuNqVjlr5+4yVUZjycJwfQ=="], "eslint-config-prettier": ["eslint-config-prettier@9.1.2", "", { "peerDependencies": { "eslint": ">=7.0.0" }, "bin": { "eslint-config-prettier": "bin/cli.js" } }, "sha512-iI1f+D2ViGn+uvv5HuHVUamg8ll4tN+JRHGc6IJi4TP9Kl976C57fzPXgseXNs8v0iA8aSJpHsTWjDb9QJamGQ=="], @@ -759,11 +763,11 @@ "eslint-plugin-unused-imports": ["eslint-plugin-unused-imports@4.4.1", "", { "peerDependencies": { "@typescript-eslint/eslint-plugin": "^8.0.0-0 || ^7.0.0 || ^6.0.0 || ^5.0.0", "eslint": "^10.0.0 || ^9.0.0 || ^8.0.0" }, "optionalPeers": ["@typescript-eslint/eslint-plugin"] }, "sha512-oZGYUz1X3sRMGUB+0cZyK2VcvRX5lm/vB56PgNNcU+7ficUCKm66oZWKUubXWnOuPjQ8PvmXtCViXBMONPe7tQ=="], - "eslint-scope": ["eslint-scope@9.1.2", "", { "dependencies": { "@types/esrecurse": "^4.3.1", "@types/estree": "^1.0.8", "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ=="], + "eslint-scope": ["eslint-scope@8.4.0", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg=="], "eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="], - "espree": ["espree@11.2.0", "", { "dependencies": { "acorn": "^8.16.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^5.0.1" } }, "sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw=="], + "espree": ["espree@10.4.0", "", { "dependencies": { "acorn": "^8.15.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^4.2.1" } }, "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ=="], "esprima": ["esprima@4.0.1", "", { "bin": { "esparse": "./bin/esparse.js", "esvalidate": "./bin/esvalidate.js" } }, "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="], @@ -875,6 +879,8 @@ "glob-parent": ["glob-parent@6.0.2", "", { "dependencies": { "is-glob": "^4.0.3" } }, "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A=="], + "globals": ["globals@14.0.0", "", {}, "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ=="], + "globalthis": ["globalthis@1.0.4", "", { "dependencies": { "define-properties": "^1.2.1", "gopd": "^1.0.1" } }, "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ=="], "globby": ["globby@11.1.0", "", { "dependencies": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", "fast-glob": "^3.2.9", "ignore": "^5.2.0", "merge2": "^1.4.1", "slash": "^3.0.0" } }, "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g=="], @@ -889,6 +895,8 @@ "has-bigints": ["has-bigints@1.1.0", "", {}, "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg=="], + "has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], + "has-property-descriptors": ["has-property-descriptors@1.0.2", "", { "dependencies": { "es-define-property": "^1.0.0" } }, "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg=="], "has-proto": ["has-proto@1.2.0", "", { "dependencies": { "dunder-proto": "^1.0.0" } }, "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ=="], @@ -919,6 +927,8 @@ "immer": ["immer@10.2.0", "", {}, "sha512-d/+XTN3zfODyjr89gM3mPq1WNX2B8pYsu7eORitdwyA2sBubnTl3laYlBk4sXY5FUa5qTZGBDPJICVbvqzjlbw=="], + "import-fresh": ["import-fresh@3.3.1", "", { "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" } }, "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ=="], + "imurmurhash": ["imurmurhash@0.1.4", "", {}, "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA=="], "inherits": ["inherits@2.0.4", "", {}, "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="], @@ -1035,6 +1045,8 @@ "lodash": ["lodash@4.17.23", "", {}, "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w=="], + "lodash.merge": ["lodash.merge@4.6.2", "", {}, "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ=="], + "log-update": ["log-update@8.0.0", "", { "dependencies": { "ansi-escapes": "^7.3.0", "cli-cursor": "^5.0.0", "slice-ansi": "^9.0.0", "string-width": "^8.2.0", "strip-ansi": "^7.2.0", "wrap-ansi": "^10.0.0" } }, "sha512-lddSgOt3bPASrylL54ZSpy8nBHns+vBVSoILlVOx+dei300pnLRN958rj/EdlVLKuWlSESU3qdnDZdAI7FXYGg=="], "longest-streak": ["longest-streak@3.1.0", "", {}, "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g=="], @@ -1237,6 +1249,8 @@ "pako": ["pako@1.0.11", "", {}, "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw=="], + "parent-module": ["parent-module@1.0.1", "", { "dependencies": { "callsites": "^3.0.0" } }, "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g=="], + "parse-bmfont-ascii": ["parse-bmfont-ascii@1.0.6", "", {}, "sha512-U4RrVsUFCleIOBsIGYOMKjn9PavsGOXxbvYGtMOEfnId0SVNsgehXh1DxUdVPLoxd5mvcEtvmKs2Mmf0Mpa1ZA=="], "parse-bmfont-binary": ["parse-bmfont-binary@1.0.6", "", {}, "sha512-GxmsRea0wdGdYthjuUeWTMWPqm2+FAd4GI8vCvhgJsFnoGhTrLhXDDupwTo7rXVAgaLIGoVHDZS9p/5XbSqeWA=="], @@ -1381,6 +1395,8 @@ "resolve": ["resolve@2.0.0-next.7", "", { "dependencies": { "es-errors": "^1.3.0", "is-core-module": "^2.16.2", "node-exports-info": "^1.6.0", "object-keys": "^1.1.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-tqt+NBWwyaMgw3zDsnygx4CByWjQEJHOPMdslYhppaQSJUtL/D4JO9CcBBlhPoI8lz9oJIDXkwXfhF4aWqP8xQ=="], + "resolve-from": ["resolve-from@4.0.0", "", {}, "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="], + "resolve-pkg-maps": ["resolve-pkg-maps@1.0.0", "", {}, "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw=="], "restore-cursor": ["restore-cursor@5.1.0", "", { "dependencies": { "onetime": "^7.0.0", "signal-exit": "^4.1.0" } }, "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA=="], @@ -1485,7 +1501,7 @@ "strip-final-newline": ["strip-final-newline@2.0.0", "", {}, "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA=="], - "strip-json-comments": ["strip-json-comments@2.0.1", "", {}, "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ=="], + "strip-json-comments": ["strip-json-comments@3.1.1", "", {}, "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig=="], "stripe": ["stripe@16.12.0", "", { "dependencies": { "@types/node": ">=8.1.0", "qs": "^6.11.0" } }, "sha512-H7eFVLDxeTNNSn4JTRfL2//LzCbDrMSZ+2q1c7CanVWgK2qIW5TwS+0V7N9KcKZZNpYh/uCqK0PyZh/2UsaAtQ=="], @@ -1493,6 +1509,8 @@ "styled-jsx": ["styled-jsx@5.1.6", "", { "dependencies": { "client-only": "0.0.1" }, "peerDependencies": { "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0" } }, "sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA=="], + "supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], + "supports-preserve-symlinks-flag": ["supports-preserve-symlinks-flag@1.0.0", "", {}, "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w=="], "supports-terminal-graphics": ["supports-terminal-graphics@0.1.0", "", {}, "sha512-+KdfozhS0Fw8y5Sghw8kkZNGT8nWYzJ1EzcoIvVjxhl+26TJTs26y02yfBgvc1jh5AS/c8jcI3xtahhR95KRyQ=="], @@ -1651,7 +1669,11 @@ "@codebuff/sdk/ignore": ["ignore@7.0.5", "", {}, "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg=="], - "@eslint/config-array/minimatch": ["minimatch@10.2.5", "", { "dependencies": { "brace-expansion": "^5.0.5" } }, "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg=="], + "@eslint/eslintrc/ajv": ["ajv@6.15.0", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw=="], + + "@eslint/eslintrc/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], + + "@eslint/eslintrc/js-yaml": ["js-yaml@4.2.0", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-ePWsvanv0DWuDRsW8dnt+R4jQ31SCRCQ7hhNcPXZPsoBZiemuZNYGf7adZdqX2D86j6rvKp3RpCxVTSb8WQlOw=="], "@opentui/core/diff": ["diff@9.0.0", "", {}, "sha512-svtcdpS8CgJyqAjEQIXdb3OjhFVVYjzGAPO8WGCmRbrml64SPw/jJD4GoE98aR7r25A0XcgrK3F02yw9R/vhQw=="], @@ -1687,11 +1709,11 @@ "eslint/ajv": ["ajv@6.15.0", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw=="], - "eslint/eslint-visitor-keys": ["eslint-visitor-keys@5.0.1", "", {}, "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA=="], + "eslint/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], - "eslint/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], + "eslint/eslint-visitor-keys": ["eslint-visitor-keys@4.2.1", "", {}, "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ=="], - "eslint/minimatch": ["minimatch@10.2.5", "", { "dependencies": { "brace-expansion": "^5.0.5" } }, "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg=="], + "eslint/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], "eslint-import-resolver-node/debug": ["debug@3.2.7", "", { "dependencies": { "ms": "^2.1.1" } }, "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ=="], @@ -1703,7 +1725,7 @@ "eslint-plugin-import/tsconfig-paths": ["tsconfig-paths@3.15.0", "", { "dependencies": { "@types/json5": "^0.0.29", "json5": "^1.0.2", "minimist": "^1.2.6", "strip-bom": "^3.0.0" } }, "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg=="], - "espree/eslint-visitor-keys": ["eslint-visitor-keys@5.0.1", "", {}, "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA=="], + "espree/eslint-visitor-keys": ["eslint-visitor-keys@4.2.1", "", {}, "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ=="], "execa/onetime": ["onetime@5.1.2", "", { "dependencies": { "mimic-fn": "^2.1.0" } }, "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg=="], @@ -1731,12 +1753,16 @@ "plist/xmlbuilder": ["xmlbuilder@15.1.1", "", {}, "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg=="], + "rc/strip-json-comments": ["strip-json-comments@2.0.1", "", {}, "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ=="], + "react-devtools-core/ws": ["ws@7.5.11", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": "^5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-zS54Oen9bITtp7kp2XM3AydrCIq1D+HwJOuH+c+e4LfpL/lotP5osijd+UoMnxwAam1GN8R4KtLAyIrIcBNpiA=="], "react-reconciler/scheduler": ["scheduler@0.26.0", "", {}, "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA=="], "send/mime-types": ["mime-types@3.0.2", "", { "dependencies": { "mime-db": "^1.54.0" } }, "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A=="], + "slice-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], + "tar-stream/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=="], "ts-node/diff": ["diff@4.0.4", "", {}, "sha512-X07nttJQkwkfKfvTPG/KSnE2OMdcUCao6+eXF3wmnIQRn2aPAHH3VxDbDOdegkd6JbPsXqShpvEOHfAT+nCNwQ=="], @@ -1751,6 +1777,8 @@ "typescript-eslint/@typescript-eslint/utils": ["@typescript-eslint/utils@7.18.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@typescript-eslint/scope-manager": "7.18.0", "@typescript-eslint/types": "7.18.0", "@typescript-eslint/typescript-estree": "7.18.0" }, "peerDependencies": { "eslint": "^8.56.0" } }, "sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw=="], + "wrap-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], + "wrap-ansi/string-width": ["string-width@8.2.1", "", { "dependencies": { "get-east-asian-width": "^1.5.0", "strip-ansi": "^7.1.2" } }, "sha512-IIaP0g3iy9Cyy18w3M9YcaDudujEAVHKt3a3QJg1+sr/oX96TbaGUubG0hJyCjCBThFH+tFpcIyoUHUn1ogaLA=="], "yargs/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], @@ -1759,7 +1787,9 @@ "@codebuff/evals/pino/process-warning": ["process-warning@5.0.0", "", {}, "sha512-a39t9ApHNx2L4+HBnQKqxxHNs1r7KF+Intd8Q/g1bUh6q0WIp9voPXJ/x0j+ZL45KF1pJd9+q2jLIRMfvEshkA=="], - "@eslint/config-array/minimatch/brace-expansion": ["brace-expansion@5.0.6", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g=="], + "@eslint/eslintrc/ajv/json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], + + "@eslint/eslintrc/js-yaml/argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="], "@typescript-eslint/parser/@typescript-eslint/typescript-estree/minimatch": ["minimatch@9.0.9", "", { "dependencies": { "brace-expansion": "^2.0.2" } }, "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg=="], @@ -1773,14 +1803,10 @@ "cliui/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], - "cliui/wrap-ansi/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], - "eslint-plugin-import/tsconfig-paths/json5": ["json5@1.0.2", "", { "dependencies": { "minimist": "^1.2.0" }, "bin": { "json5": "lib/cli.js" } }, "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA=="], "eslint/ajv/json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], - "eslint/minimatch/brace-expansion": ["brace-expansion@5.0.6", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g=="], - "express/mime-types/mime-db": ["mime-db@1.54.0", "", {}, "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ=="], "p-locate/p-limit/yocto-queue": ["yocto-queue@0.1.0", "", {}, "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="], @@ -1809,12 +1835,8 @@ "yargs/string-width/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], - "@eslint/config-array/minimatch/brace-expansion/balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="], - "@typescript-eslint/parser/@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.1.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-WR1cURNjuvBLMZBMbqM0UoE+WAfdUcEV1ccD8PVBVOI+Z3ND4+SZbN8RsfT2bMuG1qwz5RFvPukSZm5fF2D5eA=="], - "eslint/minimatch/brace-expansion/balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="], - "typescript-eslint/@typescript-eslint/eslint-plugin/@typescript-eslint/scope-manager/@typescript-eslint/types": ["@typescript-eslint/types@7.18.0", "", {}, "sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ=="], "typescript-eslint/@typescript-eslint/eslint-plugin/@typescript-eslint/type-utils/@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@7.18.0", "", { "dependencies": { "@typescript-eslint/types": "7.18.0", "@typescript-eslint/visitor-keys": "7.18.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", "minimatch": "^9.0.4", "semver": "^7.6.0", "ts-api-utils": "^1.3.0" } }, "sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA=="], From d128b6fd83a9a24b67482dc53dc17ce2c1b88d12 Mon Sep 17 00:00:00 2001 From: codebuff public sync bot <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 11 Jun 2026 00:43:55 +0000 Subject: [PATCH 50/96] Sync public snapshot from freebuff-private Source: CodebuffAI/freebuff-private@171068e757700141cc55ce6396a2bca2fa6eae40 --- bun.lock | 74 +++++++------------- common/src/__tests__/freebuff-models.test.ts | 4 +- common/src/constants/freebuff-models.ts | 10 +-- 3 files changed, 34 insertions(+), 54 deletions(-) diff --git a/bun.lock b/bun.lock index 9ff557b69a..93665ce75c 100644 --- a/bun.lock +++ b/bun.lock @@ -239,19 +239,15 @@ "@eslint-community/regexpp": ["@eslint-community/regexpp@4.12.2", "", {}, "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew=="], - "@eslint/config-array": ["@eslint/config-array@0.21.2", "", { "dependencies": { "@eslint/object-schema": "^2.1.7", "debug": "^4.3.1", "minimatch": "^3.1.5" } }, "sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw=="], + "@eslint/config-array": ["@eslint/config-array@0.23.5", "", { "dependencies": { "@eslint/object-schema": "^3.0.5", "debug": "^4.3.1", "minimatch": "^10.2.4" } }, "sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA=="], - "@eslint/config-helpers": ["@eslint/config-helpers@0.4.2", "", { "dependencies": { "@eslint/core": "^0.17.0" } }, "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw=="], + "@eslint/config-helpers": ["@eslint/config-helpers@0.6.0", "", { "dependencies": { "@eslint/core": "^1.2.1" } }, "sha512-ii6Bw9jJ2zi2cWA2Z+9/QZ/+3DX6kwaV5Q986D/CdP3Lap3w/pgQZ373FV7byY/i7L4IRH/G43I5dz1ClsCbpA=="], - "@eslint/core": ["@eslint/core@0.17.0", "", { "dependencies": { "@types/json-schema": "^7.0.15" } }, "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ=="], + "@eslint/core": ["@eslint/core@1.2.1", "", { "dependencies": { "@types/json-schema": "^7.0.15" } }, "sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ=="], - "@eslint/eslintrc": ["@eslint/eslintrc@3.3.5", "", { "dependencies": { "ajv": "^6.14.0", "debug": "^4.3.2", "espree": "^10.0.1", "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.1", "minimatch": "^3.1.5", "strip-json-comments": "^3.1.1" } }, "sha512-4IlJx0X0qftVsN5E+/vGujTRIFtwuLbNsVUe7TO6zYPDR1O6nFwvwhIKEKSrl6dZchmYBITazxKoUYOjdtjlRg=="], + "@eslint/object-schema": ["@eslint/object-schema@3.0.5", "", {}, "sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw=="], - "@eslint/js": ["@eslint/js@9.39.4", "", {}, "sha512-nE7DEIchvtiFTwBw4Lfbu59PG+kCofhjsKaCWzxTpt4lfRjRMqG6uMBzKXuEcyXhOHoUp9riAm7/aWYGhXZ9cw=="], - - "@eslint/object-schema": ["@eslint/object-schema@2.1.7", "", {}, "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA=="], - - "@eslint/plugin-kit": ["@eslint/plugin-kit@0.4.1", "", { "dependencies": { "@eslint/core": "^0.17.0", "levn": "^0.4.1" } }, "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA=="], + "@eslint/plugin-kit": ["@eslint/plugin-kit@0.7.2", "", { "dependencies": { "@eslint/core": "^1.2.1", "levn": "^0.4.1" } }, "sha512-+CNAzxglkrpNf/kKywqQfk74QjtceuOE7Qm+AF8miRvPF/wmmK5+OJOgVh3AVTT3RP2mH3+FOaxlE5v72owk0A=="], "@gravity-ai/api": ["@gravity-ai/api@0.1.2", "", { "dependencies": { "axios": "^1.13.2" } }, "sha512-txsAhyzvwB/TNrj5R8DoNqw8afM3JY2ahl7aaeaD5ZsxP+7rxff7C7keGI7+gU2KT3d2Mcw4QB1nHhbTSCJYHw=="], @@ -467,6 +463,8 @@ "@types/diff": ["@types/diff@8.0.0", "", { "dependencies": { "diff": "*" } }, "sha512-o7jqJM04gfaYrdCecCVMbZhNdG6T1MHg/oQoRFdERLV+4d+V7FijhiEAbFu0Usww84Yijk9yH58U4Jk4HbtzZw=="], + "@types/esrecurse": ["@types/esrecurse@4.3.1", "", {}, "sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw=="], + "@types/estree": ["@types/estree@1.0.9", "", {}, "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg=="], "@types/js-yaml": ["@types/js-yaml@4.0.9", "", {}, "sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg=="], @@ -549,7 +547,7 @@ "ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="], - "ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + "ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], "any-base": ["any-base@1.1.0", "", {}, "sha512-uMgjozySS8adZZYePpaWs8cxB9/kdzmpX6SgJZ+wbz1K5eYk5QMYDVJaZKhxyIHUdnnJkfR7SVgStgH7LkGUyg=="], @@ -625,8 +623,6 @@ "call-bound": ["call-bound@1.0.4", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "get-intrinsic": "^1.3.0" } }, "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg=="], - "callsites": ["callsites@3.1.0", "", {}, "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="], - "caniuse-lite": ["caniuse-lite@1.0.30001797", "", {}, "sha512-l8xKG+gwAIExZGl9FrF7KUwuOmk6wbEPC9Xoy/RtnWv1XG0Q4LFlagaLpUv3Kiza3W/wm27zy0yWJEieYKAP6w=="], "canvas": ["canvas@3.2.3", "", { "dependencies": { "node-addon-api": "^7.0.0", "prebuild-install": "^7.1.3" } }, "sha512-PzE5nJZPz72YUAfo8oTp0u3fqqY7IzlTubneAihqDYAUcBk7ryeCmBbdJBEdaH0bptSOe2VT2Zwcb3UaFyaSWw=="], @@ -751,7 +747,7 @@ "escape-string-regexp": ["escape-string-regexp@4.0.0", "", {}, "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="], - "eslint": ["eslint@9.39.4", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", "@eslint/config-array": "^0.21.2", "@eslint/config-helpers": "^0.4.2", "@eslint/core": "^0.17.0", "@eslint/eslintrc": "^3.3.5", "@eslint/js": "9.39.4", "@eslint/plugin-kit": "^0.4.1", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "ajv": "^6.14.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^8.4.0", "eslint-visitor-keys": "^4.2.1", "espree": "^10.4.0", "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.5", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, "peerDependencies": { "jiti": "*" }, "optionalPeers": ["jiti"], "bin": { "eslint": "bin/eslint.js" } }, "sha512-XoMjdBOwe/esVgEvLmNsD3IRHkm7fbKIUGvrleloJXUZgDHig2IPWNniv+GwjyJXzuNqVjlr5+4yVUZjycJwfQ=="], + "eslint": ["eslint@10.4.1", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.2", "@eslint/config-array": "^0.23.5", "@eslint/config-helpers": "^0.6.0", "@eslint/core": "^1.2.1", "@eslint/plugin-kit": "^0.7.2", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "ajv": "^6.14.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^9.1.2", "eslint-visitor-keys": "^5.0.1", "espree": "^11.2.0", "esquery": "^1.7.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "minimatch": "^10.2.4", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, "peerDependencies": { "jiti": "*" }, "optionalPeers": ["jiti"], "bin": { "eslint": "bin/eslint.js" } }, "sha512-AyIKhnOBuOAdueD7RB3xB+YeAWScb9jHsJBgH2Hcde8InP5JYhqrRR6iTMHyTEwgENK54Cp44e4v8BwNhsuHuw=="], "eslint-config-prettier": ["eslint-config-prettier@9.1.2", "", { "peerDependencies": { "eslint": ">=7.0.0" }, "bin": { "eslint-config-prettier": "bin/cli.js" } }, "sha512-iI1f+D2ViGn+uvv5HuHVUamg8ll4tN+JRHGc6IJi4TP9Kl976C57fzPXgseXNs8v0iA8aSJpHsTWjDb9QJamGQ=="], @@ -763,11 +759,11 @@ "eslint-plugin-unused-imports": ["eslint-plugin-unused-imports@4.4.1", "", { "peerDependencies": { "@typescript-eslint/eslint-plugin": "^8.0.0-0 || ^7.0.0 || ^6.0.0 || ^5.0.0", "eslint": "^10.0.0 || ^9.0.0 || ^8.0.0" }, "optionalPeers": ["@typescript-eslint/eslint-plugin"] }, "sha512-oZGYUz1X3sRMGUB+0cZyK2VcvRX5lm/vB56PgNNcU+7ficUCKm66oZWKUubXWnOuPjQ8PvmXtCViXBMONPe7tQ=="], - "eslint-scope": ["eslint-scope@8.4.0", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg=="], + "eslint-scope": ["eslint-scope@9.1.2", "", { "dependencies": { "@types/esrecurse": "^4.3.1", "@types/estree": "^1.0.8", "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ=="], "eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="], - "espree": ["espree@10.4.0", "", { "dependencies": { "acorn": "^8.15.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^4.2.1" } }, "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ=="], + "espree": ["espree@11.2.0", "", { "dependencies": { "acorn": "^8.16.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^5.0.1" } }, "sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw=="], "esprima": ["esprima@4.0.1", "", { "bin": { "esparse": "./bin/esparse.js", "esvalidate": "./bin/esvalidate.js" } }, "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="], @@ -879,8 +875,6 @@ "glob-parent": ["glob-parent@6.0.2", "", { "dependencies": { "is-glob": "^4.0.3" } }, "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A=="], - "globals": ["globals@14.0.0", "", {}, "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ=="], - "globalthis": ["globalthis@1.0.4", "", { "dependencies": { "define-properties": "^1.2.1", "gopd": "^1.0.1" } }, "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ=="], "globby": ["globby@11.1.0", "", { "dependencies": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", "fast-glob": "^3.2.9", "ignore": "^5.2.0", "merge2": "^1.4.1", "slash": "^3.0.0" } }, "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g=="], @@ -895,8 +889,6 @@ "has-bigints": ["has-bigints@1.1.0", "", {}, "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg=="], - "has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], - "has-property-descriptors": ["has-property-descriptors@1.0.2", "", { "dependencies": { "es-define-property": "^1.0.0" } }, "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg=="], "has-proto": ["has-proto@1.2.0", "", { "dependencies": { "dunder-proto": "^1.0.0" } }, "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ=="], @@ -927,8 +919,6 @@ "immer": ["immer@10.2.0", "", {}, "sha512-d/+XTN3zfODyjr89gM3mPq1WNX2B8pYsu7eORitdwyA2sBubnTl3laYlBk4sXY5FUa5qTZGBDPJICVbvqzjlbw=="], - "import-fresh": ["import-fresh@3.3.1", "", { "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" } }, "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ=="], - "imurmurhash": ["imurmurhash@0.1.4", "", {}, "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA=="], "inherits": ["inherits@2.0.4", "", {}, "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="], @@ -1045,8 +1035,6 @@ "lodash": ["lodash@4.17.23", "", {}, "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w=="], - "lodash.merge": ["lodash.merge@4.6.2", "", {}, "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ=="], - "log-update": ["log-update@8.0.0", "", { "dependencies": { "ansi-escapes": "^7.3.0", "cli-cursor": "^5.0.0", "slice-ansi": "^9.0.0", "string-width": "^8.2.0", "strip-ansi": "^7.2.0", "wrap-ansi": "^10.0.0" } }, "sha512-lddSgOt3bPASrylL54ZSpy8nBHns+vBVSoILlVOx+dei300pnLRN958rj/EdlVLKuWlSESU3qdnDZdAI7FXYGg=="], "longest-streak": ["longest-streak@3.1.0", "", {}, "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g=="], @@ -1249,8 +1237,6 @@ "pako": ["pako@1.0.11", "", {}, "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw=="], - "parent-module": ["parent-module@1.0.1", "", { "dependencies": { "callsites": "^3.0.0" } }, "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g=="], - "parse-bmfont-ascii": ["parse-bmfont-ascii@1.0.6", "", {}, "sha512-U4RrVsUFCleIOBsIGYOMKjn9PavsGOXxbvYGtMOEfnId0SVNsgehXh1DxUdVPLoxd5mvcEtvmKs2Mmf0Mpa1ZA=="], "parse-bmfont-binary": ["parse-bmfont-binary@1.0.6", "", {}, "sha512-GxmsRea0wdGdYthjuUeWTMWPqm2+FAd4GI8vCvhgJsFnoGhTrLhXDDupwTo7rXVAgaLIGoVHDZS9p/5XbSqeWA=="], @@ -1395,8 +1381,6 @@ "resolve": ["resolve@2.0.0-next.7", "", { "dependencies": { "es-errors": "^1.3.0", "is-core-module": "^2.16.2", "node-exports-info": "^1.6.0", "object-keys": "^1.1.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-tqt+NBWwyaMgw3zDsnygx4CByWjQEJHOPMdslYhppaQSJUtL/D4JO9CcBBlhPoI8lz9oJIDXkwXfhF4aWqP8xQ=="], - "resolve-from": ["resolve-from@4.0.0", "", {}, "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="], - "resolve-pkg-maps": ["resolve-pkg-maps@1.0.0", "", {}, "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw=="], "restore-cursor": ["restore-cursor@5.1.0", "", { "dependencies": { "onetime": "^7.0.0", "signal-exit": "^4.1.0" } }, "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA=="], @@ -1501,7 +1485,7 @@ "strip-final-newline": ["strip-final-newline@2.0.0", "", {}, "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA=="], - "strip-json-comments": ["strip-json-comments@3.1.1", "", {}, "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig=="], + "strip-json-comments": ["strip-json-comments@2.0.1", "", {}, "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ=="], "stripe": ["stripe@16.12.0", "", { "dependencies": { "@types/node": ">=8.1.0", "qs": "^6.11.0" } }, "sha512-H7eFVLDxeTNNSn4JTRfL2//LzCbDrMSZ+2q1c7CanVWgK2qIW5TwS+0V7N9KcKZZNpYh/uCqK0PyZh/2UsaAtQ=="], @@ -1509,8 +1493,6 @@ "styled-jsx": ["styled-jsx@5.1.6", "", { "dependencies": { "client-only": "0.0.1" }, "peerDependencies": { "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0" } }, "sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA=="], - "supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], - "supports-preserve-symlinks-flag": ["supports-preserve-symlinks-flag@1.0.0", "", {}, "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w=="], "supports-terminal-graphics": ["supports-terminal-graphics@0.1.0", "", {}, "sha512-+KdfozhS0Fw8y5Sghw8kkZNGT8nWYzJ1EzcoIvVjxhl+26TJTs26y02yfBgvc1jh5AS/c8jcI3xtahhR95KRyQ=="], @@ -1669,11 +1651,7 @@ "@codebuff/sdk/ignore": ["ignore@7.0.5", "", {}, "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg=="], - "@eslint/eslintrc/ajv": ["ajv@6.15.0", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw=="], - - "@eslint/eslintrc/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], - - "@eslint/eslintrc/js-yaml": ["js-yaml@4.2.0", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-ePWsvanv0DWuDRsW8dnt+R4jQ31SCRCQ7hhNcPXZPsoBZiemuZNYGf7adZdqX2D86j6rvKp3RpCxVTSb8WQlOw=="], + "@eslint/config-array/minimatch": ["minimatch@10.2.5", "", { "dependencies": { "brace-expansion": "^5.0.5" } }, "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg=="], "@opentui/core/diff": ["diff@9.0.0", "", {}, "sha512-svtcdpS8CgJyqAjEQIXdb3OjhFVVYjzGAPO8WGCmRbrml64SPw/jJD4GoE98aR7r25A0XcgrK3F02yw9R/vhQw=="], @@ -1709,12 +1687,12 @@ "eslint/ajv": ["ajv@6.15.0", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw=="], - "eslint/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], - - "eslint/eslint-visitor-keys": ["eslint-visitor-keys@4.2.1", "", {}, "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ=="], + "eslint/eslint-visitor-keys": ["eslint-visitor-keys@5.0.1", "", {}, "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA=="], "eslint/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], + "eslint/minimatch": ["minimatch@10.2.5", "", { "dependencies": { "brace-expansion": "^5.0.5" } }, "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg=="], + "eslint-import-resolver-node/debug": ["debug@3.2.7", "", { "dependencies": { "ms": "^2.1.1" } }, "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ=="], "eslint-module-utils/debug": ["debug@3.2.7", "", { "dependencies": { "ms": "^2.1.1" } }, "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ=="], @@ -1725,7 +1703,7 @@ "eslint-plugin-import/tsconfig-paths": ["tsconfig-paths@3.15.0", "", { "dependencies": { "@types/json5": "^0.0.29", "json5": "^1.0.2", "minimist": "^1.2.6", "strip-bom": "^3.0.0" } }, "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg=="], - "espree/eslint-visitor-keys": ["eslint-visitor-keys@4.2.1", "", {}, "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ=="], + "espree/eslint-visitor-keys": ["eslint-visitor-keys@5.0.1", "", {}, "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA=="], "execa/onetime": ["onetime@5.1.2", "", { "dependencies": { "mimic-fn": "^2.1.0" } }, "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg=="], @@ -1753,16 +1731,12 @@ "plist/xmlbuilder": ["xmlbuilder@15.1.1", "", {}, "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg=="], - "rc/strip-json-comments": ["strip-json-comments@2.0.1", "", {}, "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ=="], - "react-devtools-core/ws": ["ws@7.5.11", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": "^5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-zS54Oen9bITtp7kp2XM3AydrCIq1D+HwJOuH+c+e4LfpL/lotP5osijd+UoMnxwAam1GN8R4KtLAyIrIcBNpiA=="], "react-reconciler/scheduler": ["scheduler@0.26.0", "", {}, "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA=="], "send/mime-types": ["mime-types@3.0.2", "", { "dependencies": { "mime-db": "^1.54.0" } }, "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A=="], - "slice-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], - "tar-stream/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=="], "ts-node/diff": ["diff@4.0.4", "", {}, "sha512-X07nttJQkwkfKfvTPG/KSnE2OMdcUCao6+eXF3wmnIQRn2aPAHH3VxDbDOdegkd6JbPsXqShpvEOHfAT+nCNwQ=="], @@ -1777,8 +1751,6 @@ "typescript-eslint/@typescript-eslint/utils": ["@typescript-eslint/utils@7.18.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@typescript-eslint/scope-manager": "7.18.0", "@typescript-eslint/types": "7.18.0", "@typescript-eslint/typescript-estree": "7.18.0" }, "peerDependencies": { "eslint": "^8.56.0" } }, "sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw=="], - "wrap-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], - "wrap-ansi/string-width": ["string-width@8.2.1", "", { "dependencies": { "get-east-asian-width": "^1.5.0", "strip-ansi": "^7.1.2" } }, "sha512-IIaP0g3iy9Cyy18w3M9YcaDudujEAVHKt3a3QJg1+sr/oX96TbaGUubG0hJyCjCBThFH+tFpcIyoUHUn1ogaLA=="], "yargs/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], @@ -1787,9 +1759,7 @@ "@codebuff/evals/pino/process-warning": ["process-warning@5.0.0", "", {}, "sha512-a39t9ApHNx2L4+HBnQKqxxHNs1r7KF+Intd8Q/g1bUh6q0WIp9voPXJ/x0j+ZL45KF1pJd9+q2jLIRMfvEshkA=="], - "@eslint/eslintrc/ajv/json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], - - "@eslint/eslintrc/js-yaml/argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="], + "@eslint/config-array/minimatch/brace-expansion": ["brace-expansion@5.0.6", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g=="], "@typescript-eslint/parser/@typescript-eslint/typescript-estree/minimatch": ["minimatch@9.0.9", "", { "dependencies": { "brace-expansion": "^2.0.2" } }, "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg=="], @@ -1803,10 +1773,14 @@ "cliui/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], + "cliui/wrap-ansi/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + "eslint-plugin-import/tsconfig-paths/json5": ["json5@1.0.2", "", { "dependencies": { "minimist": "^1.2.0" }, "bin": { "json5": "lib/cli.js" } }, "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA=="], "eslint/ajv/json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], + "eslint/minimatch/brace-expansion": ["brace-expansion@5.0.6", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g=="], + "express/mime-types/mime-db": ["mime-db@1.54.0", "", {}, "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ=="], "p-locate/p-limit/yocto-queue": ["yocto-queue@0.1.0", "", {}, "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="], @@ -1835,8 +1809,12 @@ "yargs/string-width/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + "@eslint/config-array/minimatch/brace-expansion/balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="], + "@typescript-eslint/parser/@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.1.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-WR1cURNjuvBLMZBMbqM0UoE+WAfdUcEV1ccD8PVBVOI+Z3ND4+SZbN8RsfT2bMuG1qwz5RFvPukSZm5fF2D5eA=="], + "eslint/minimatch/brace-expansion/balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="], + "typescript-eslint/@typescript-eslint/eslint-plugin/@typescript-eslint/scope-manager/@typescript-eslint/types": ["@typescript-eslint/types@7.18.0", "", {}, "sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ=="], "typescript-eslint/@typescript-eslint/eslint-plugin/@typescript-eslint/type-utils/@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@7.18.0", "", { "dependencies": { "@typescript-eslint/types": "7.18.0", "@typescript-eslint/visitor-keys": "7.18.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", "minimatch": "^9.0.4", "semver": "^7.6.0", "ts-api-utils": "^1.3.0" } }, "sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA=="], diff --git a/common/src/__tests__/freebuff-models.test.ts b/common/src/__tests__/freebuff-models.test.ts index dcc441d0f7..1b5f774006 100644 --- a/common/src/__tests__/freebuff-models.test.ts +++ b/common/src/__tests__/freebuff-models.test.ts @@ -29,8 +29,8 @@ import { minimaxModels } from '../constants/model-config' const MINIMAX_M3_MODEL_ID = minimaxModels.minimaxM3 describe('freebuff model availability', () => { - test('defaults to Kimi K2.6, falls back to DeepSeek V4 Flash for new clients', () => { - expect(DEFAULT_FREEBUFF_MODEL_ID).toBe(FREEBUFF_KIMI_MODEL_ID) + test('defaults to MiniMax M3, falls back to DeepSeek V4 Flash for new clients', () => { + expect(DEFAULT_FREEBUFF_MODEL_ID).toBe(MINIMAX_M3_MODEL_ID) expect(FALLBACK_FREEBUFF_MODEL_ID).toBe(FREEBUFF_DEEPSEEK_V4_FLASH_MODEL_ID) }) diff --git a/common/src/constants/freebuff-models.ts b/common/src/constants/freebuff-models.ts index 81599e3e05..22621bc812 100644 --- a/common/src/constants/freebuff-models.ts +++ b/common/src/constants/freebuff-models.ts @@ -203,11 +203,13 @@ export type SupportedFreebuffModelId = (typeof SUPPORTED_FREEBUFF_MODELS)[number]['id'] export type FreebuffPremiumModelId = (typeof FREEBUFF_PREMIUM_MODEL_IDS)[number] -/** What new freebuff users see selected in the picker. Callers that need a - * guaranteed-available id for resolution / auto-fallbacks should use - * FALLBACK_FREEBUFF_MODEL_ID instead. */ +/** What new freebuff users see selected in the picker. MiniMax M3 is the + * strongest unlimited model (smartest & multimodal), so new users get good + * quality without burning the 5/day premium quota on routine messages. + * Callers that need a guaranteed-available id for resolution / + * auto-fallbacks should use FALLBACK_FREEBUFF_MODEL_ID instead. */ export const DEFAULT_FREEBUFF_MODEL_ID: FreebuffModelId = - FREEBUFF_KIMI_MODEL_ID + FREEBUFF_MINIMAX_M3_MODEL_ID /** Always-available fallback used when the requested model can't be served * right now (unknown id, deployment hours closed, etc.). Kept distinct from From b48483610785b20d2c18768741436ae077aaf611 Mon Sep 17 00:00:00 2001 From: codebuff public sync bot <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 11 Jun 2026 00:50:48 +0000 Subject: [PATCH 51/96] Sync public snapshot from freebuff-private Source: CodebuffAI/freebuff-private@3299005ad96a70b373b01ee78644d87746acbc63 --- bun.lock | 74 ++++++++++++++++++++++++++++++++++++-------------------- 1 file changed, 48 insertions(+), 26 deletions(-) diff --git a/bun.lock b/bun.lock index 93665ce75c..9ff557b69a 100644 --- a/bun.lock +++ b/bun.lock @@ -239,15 +239,19 @@ "@eslint-community/regexpp": ["@eslint-community/regexpp@4.12.2", "", {}, "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew=="], - "@eslint/config-array": ["@eslint/config-array@0.23.5", "", { "dependencies": { "@eslint/object-schema": "^3.0.5", "debug": "^4.3.1", "minimatch": "^10.2.4" } }, "sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA=="], + "@eslint/config-array": ["@eslint/config-array@0.21.2", "", { "dependencies": { "@eslint/object-schema": "^2.1.7", "debug": "^4.3.1", "minimatch": "^3.1.5" } }, "sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw=="], - "@eslint/config-helpers": ["@eslint/config-helpers@0.6.0", "", { "dependencies": { "@eslint/core": "^1.2.1" } }, "sha512-ii6Bw9jJ2zi2cWA2Z+9/QZ/+3DX6kwaV5Q986D/CdP3Lap3w/pgQZ373FV7byY/i7L4IRH/G43I5dz1ClsCbpA=="], + "@eslint/config-helpers": ["@eslint/config-helpers@0.4.2", "", { "dependencies": { "@eslint/core": "^0.17.0" } }, "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw=="], - "@eslint/core": ["@eslint/core@1.2.1", "", { "dependencies": { "@types/json-schema": "^7.0.15" } }, "sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ=="], + "@eslint/core": ["@eslint/core@0.17.0", "", { "dependencies": { "@types/json-schema": "^7.0.15" } }, "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ=="], - "@eslint/object-schema": ["@eslint/object-schema@3.0.5", "", {}, "sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw=="], + "@eslint/eslintrc": ["@eslint/eslintrc@3.3.5", "", { "dependencies": { "ajv": "^6.14.0", "debug": "^4.3.2", "espree": "^10.0.1", "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.1", "minimatch": "^3.1.5", "strip-json-comments": "^3.1.1" } }, "sha512-4IlJx0X0qftVsN5E+/vGujTRIFtwuLbNsVUe7TO6zYPDR1O6nFwvwhIKEKSrl6dZchmYBITazxKoUYOjdtjlRg=="], - "@eslint/plugin-kit": ["@eslint/plugin-kit@0.7.2", "", { "dependencies": { "@eslint/core": "^1.2.1", "levn": "^0.4.1" } }, "sha512-+CNAzxglkrpNf/kKywqQfk74QjtceuOE7Qm+AF8miRvPF/wmmK5+OJOgVh3AVTT3RP2mH3+FOaxlE5v72owk0A=="], + "@eslint/js": ["@eslint/js@9.39.4", "", {}, "sha512-nE7DEIchvtiFTwBw4Lfbu59PG+kCofhjsKaCWzxTpt4lfRjRMqG6uMBzKXuEcyXhOHoUp9riAm7/aWYGhXZ9cw=="], + + "@eslint/object-schema": ["@eslint/object-schema@2.1.7", "", {}, "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA=="], + + "@eslint/plugin-kit": ["@eslint/plugin-kit@0.4.1", "", { "dependencies": { "@eslint/core": "^0.17.0", "levn": "^0.4.1" } }, "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA=="], "@gravity-ai/api": ["@gravity-ai/api@0.1.2", "", { "dependencies": { "axios": "^1.13.2" } }, "sha512-txsAhyzvwB/TNrj5R8DoNqw8afM3JY2ahl7aaeaD5ZsxP+7rxff7C7keGI7+gU2KT3d2Mcw4QB1nHhbTSCJYHw=="], @@ -463,8 +467,6 @@ "@types/diff": ["@types/diff@8.0.0", "", { "dependencies": { "diff": "*" } }, "sha512-o7jqJM04gfaYrdCecCVMbZhNdG6T1MHg/oQoRFdERLV+4d+V7FijhiEAbFu0Usww84Yijk9yH58U4Jk4HbtzZw=="], - "@types/esrecurse": ["@types/esrecurse@4.3.1", "", {}, "sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw=="], - "@types/estree": ["@types/estree@1.0.9", "", {}, "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg=="], "@types/js-yaml": ["@types/js-yaml@4.0.9", "", {}, "sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg=="], @@ -547,7 +549,7 @@ "ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="], - "ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], + "ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], "any-base": ["any-base@1.1.0", "", {}, "sha512-uMgjozySS8adZZYePpaWs8cxB9/kdzmpX6SgJZ+wbz1K5eYk5QMYDVJaZKhxyIHUdnnJkfR7SVgStgH7LkGUyg=="], @@ -623,6 +625,8 @@ "call-bound": ["call-bound@1.0.4", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "get-intrinsic": "^1.3.0" } }, "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg=="], + "callsites": ["callsites@3.1.0", "", {}, "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="], + "caniuse-lite": ["caniuse-lite@1.0.30001797", "", {}, "sha512-l8xKG+gwAIExZGl9FrF7KUwuOmk6wbEPC9Xoy/RtnWv1XG0Q4LFlagaLpUv3Kiza3W/wm27zy0yWJEieYKAP6w=="], "canvas": ["canvas@3.2.3", "", { "dependencies": { "node-addon-api": "^7.0.0", "prebuild-install": "^7.1.3" } }, "sha512-PzE5nJZPz72YUAfo8oTp0u3fqqY7IzlTubneAihqDYAUcBk7ryeCmBbdJBEdaH0bptSOe2VT2Zwcb3UaFyaSWw=="], @@ -747,7 +751,7 @@ "escape-string-regexp": ["escape-string-regexp@4.0.0", "", {}, "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="], - "eslint": ["eslint@10.4.1", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.2", "@eslint/config-array": "^0.23.5", "@eslint/config-helpers": "^0.6.0", "@eslint/core": "^1.2.1", "@eslint/plugin-kit": "^0.7.2", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "ajv": "^6.14.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^9.1.2", "eslint-visitor-keys": "^5.0.1", "espree": "^11.2.0", "esquery": "^1.7.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "minimatch": "^10.2.4", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, "peerDependencies": { "jiti": "*" }, "optionalPeers": ["jiti"], "bin": { "eslint": "bin/eslint.js" } }, "sha512-AyIKhnOBuOAdueD7RB3xB+YeAWScb9jHsJBgH2Hcde8InP5JYhqrRR6iTMHyTEwgENK54Cp44e4v8BwNhsuHuw=="], + "eslint": ["eslint@9.39.4", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", "@eslint/config-array": "^0.21.2", "@eslint/config-helpers": "^0.4.2", "@eslint/core": "^0.17.0", "@eslint/eslintrc": "^3.3.5", "@eslint/js": "9.39.4", "@eslint/plugin-kit": "^0.4.1", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "ajv": "^6.14.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^8.4.0", "eslint-visitor-keys": "^4.2.1", "espree": "^10.4.0", "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.5", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, "peerDependencies": { "jiti": "*" }, "optionalPeers": ["jiti"], "bin": { "eslint": "bin/eslint.js" } }, "sha512-XoMjdBOwe/esVgEvLmNsD3IRHkm7fbKIUGvrleloJXUZgDHig2IPWNniv+GwjyJXzuNqVjlr5+4yVUZjycJwfQ=="], "eslint-config-prettier": ["eslint-config-prettier@9.1.2", "", { "peerDependencies": { "eslint": ">=7.0.0" }, "bin": { "eslint-config-prettier": "bin/cli.js" } }, "sha512-iI1f+D2ViGn+uvv5HuHVUamg8ll4tN+JRHGc6IJi4TP9Kl976C57fzPXgseXNs8v0iA8aSJpHsTWjDb9QJamGQ=="], @@ -759,11 +763,11 @@ "eslint-plugin-unused-imports": ["eslint-plugin-unused-imports@4.4.1", "", { "peerDependencies": { "@typescript-eslint/eslint-plugin": "^8.0.0-0 || ^7.0.0 || ^6.0.0 || ^5.0.0", "eslint": "^10.0.0 || ^9.0.0 || ^8.0.0" }, "optionalPeers": ["@typescript-eslint/eslint-plugin"] }, "sha512-oZGYUz1X3sRMGUB+0cZyK2VcvRX5lm/vB56PgNNcU+7ficUCKm66oZWKUubXWnOuPjQ8PvmXtCViXBMONPe7tQ=="], - "eslint-scope": ["eslint-scope@9.1.2", "", { "dependencies": { "@types/esrecurse": "^4.3.1", "@types/estree": "^1.0.8", "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ=="], + "eslint-scope": ["eslint-scope@8.4.0", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg=="], "eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="], - "espree": ["espree@11.2.0", "", { "dependencies": { "acorn": "^8.16.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^5.0.1" } }, "sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw=="], + "espree": ["espree@10.4.0", "", { "dependencies": { "acorn": "^8.15.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^4.2.1" } }, "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ=="], "esprima": ["esprima@4.0.1", "", { "bin": { "esparse": "./bin/esparse.js", "esvalidate": "./bin/esvalidate.js" } }, "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="], @@ -875,6 +879,8 @@ "glob-parent": ["glob-parent@6.0.2", "", { "dependencies": { "is-glob": "^4.0.3" } }, "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A=="], + "globals": ["globals@14.0.0", "", {}, "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ=="], + "globalthis": ["globalthis@1.0.4", "", { "dependencies": { "define-properties": "^1.2.1", "gopd": "^1.0.1" } }, "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ=="], "globby": ["globby@11.1.0", "", { "dependencies": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", "fast-glob": "^3.2.9", "ignore": "^5.2.0", "merge2": "^1.4.1", "slash": "^3.0.0" } }, "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g=="], @@ -889,6 +895,8 @@ "has-bigints": ["has-bigints@1.1.0", "", {}, "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg=="], + "has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], + "has-property-descriptors": ["has-property-descriptors@1.0.2", "", { "dependencies": { "es-define-property": "^1.0.0" } }, "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg=="], "has-proto": ["has-proto@1.2.0", "", { "dependencies": { "dunder-proto": "^1.0.0" } }, "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ=="], @@ -919,6 +927,8 @@ "immer": ["immer@10.2.0", "", {}, "sha512-d/+XTN3zfODyjr89gM3mPq1WNX2B8pYsu7eORitdwyA2sBubnTl3laYlBk4sXY5FUa5qTZGBDPJICVbvqzjlbw=="], + "import-fresh": ["import-fresh@3.3.1", "", { "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" } }, "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ=="], + "imurmurhash": ["imurmurhash@0.1.4", "", {}, "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA=="], "inherits": ["inherits@2.0.4", "", {}, "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="], @@ -1035,6 +1045,8 @@ "lodash": ["lodash@4.17.23", "", {}, "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w=="], + "lodash.merge": ["lodash.merge@4.6.2", "", {}, "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ=="], + "log-update": ["log-update@8.0.0", "", { "dependencies": { "ansi-escapes": "^7.3.0", "cli-cursor": "^5.0.0", "slice-ansi": "^9.0.0", "string-width": "^8.2.0", "strip-ansi": "^7.2.0", "wrap-ansi": "^10.0.0" } }, "sha512-lddSgOt3bPASrylL54ZSpy8nBHns+vBVSoILlVOx+dei300pnLRN958rj/EdlVLKuWlSESU3qdnDZdAI7FXYGg=="], "longest-streak": ["longest-streak@3.1.0", "", {}, "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g=="], @@ -1237,6 +1249,8 @@ "pako": ["pako@1.0.11", "", {}, "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw=="], + "parent-module": ["parent-module@1.0.1", "", { "dependencies": { "callsites": "^3.0.0" } }, "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g=="], + "parse-bmfont-ascii": ["parse-bmfont-ascii@1.0.6", "", {}, "sha512-U4RrVsUFCleIOBsIGYOMKjn9PavsGOXxbvYGtMOEfnId0SVNsgehXh1DxUdVPLoxd5mvcEtvmKs2Mmf0Mpa1ZA=="], "parse-bmfont-binary": ["parse-bmfont-binary@1.0.6", "", {}, "sha512-GxmsRea0wdGdYthjuUeWTMWPqm2+FAd4GI8vCvhgJsFnoGhTrLhXDDupwTo7rXVAgaLIGoVHDZS9p/5XbSqeWA=="], @@ -1381,6 +1395,8 @@ "resolve": ["resolve@2.0.0-next.7", "", { "dependencies": { "es-errors": "^1.3.0", "is-core-module": "^2.16.2", "node-exports-info": "^1.6.0", "object-keys": "^1.1.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-tqt+NBWwyaMgw3zDsnygx4CByWjQEJHOPMdslYhppaQSJUtL/D4JO9CcBBlhPoI8lz9oJIDXkwXfhF4aWqP8xQ=="], + "resolve-from": ["resolve-from@4.0.0", "", {}, "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="], + "resolve-pkg-maps": ["resolve-pkg-maps@1.0.0", "", {}, "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw=="], "restore-cursor": ["restore-cursor@5.1.0", "", { "dependencies": { "onetime": "^7.0.0", "signal-exit": "^4.1.0" } }, "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA=="], @@ -1485,7 +1501,7 @@ "strip-final-newline": ["strip-final-newline@2.0.0", "", {}, "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA=="], - "strip-json-comments": ["strip-json-comments@2.0.1", "", {}, "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ=="], + "strip-json-comments": ["strip-json-comments@3.1.1", "", {}, "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig=="], "stripe": ["stripe@16.12.0", "", { "dependencies": { "@types/node": ">=8.1.0", "qs": "^6.11.0" } }, "sha512-H7eFVLDxeTNNSn4JTRfL2//LzCbDrMSZ+2q1c7CanVWgK2qIW5TwS+0V7N9KcKZZNpYh/uCqK0PyZh/2UsaAtQ=="], @@ -1493,6 +1509,8 @@ "styled-jsx": ["styled-jsx@5.1.6", "", { "dependencies": { "client-only": "0.0.1" }, "peerDependencies": { "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0" } }, "sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA=="], + "supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], + "supports-preserve-symlinks-flag": ["supports-preserve-symlinks-flag@1.0.0", "", {}, "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w=="], "supports-terminal-graphics": ["supports-terminal-graphics@0.1.0", "", {}, "sha512-+KdfozhS0Fw8y5Sghw8kkZNGT8nWYzJ1EzcoIvVjxhl+26TJTs26y02yfBgvc1jh5AS/c8jcI3xtahhR95KRyQ=="], @@ -1651,7 +1669,11 @@ "@codebuff/sdk/ignore": ["ignore@7.0.5", "", {}, "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg=="], - "@eslint/config-array/minimatch": ["minimatch@10.2.5", "", { "dependencies": { "brace-expansion": "^5.0.5" } }, "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg=="], + "@eslint/eslintrc/ajv": ["ajv@6.15.0", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw=="], + + "@eslint/eslintrc/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], + + "@eslint/eslintrc/js-yaml": ["js-yaml@4.2.0", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-ePWsvanv0DWuDRsW8dnt+R4jQ31SCRCQ7hhNcPXZPsoBZiemuZNYGf7adZdqX2D86j6rvKp3RpCxVTSb8WQlOw=="], "@opentui/core/diff": ["diff@9.0.0", "", {}, "sha512-svtcdpS8CgJyqAjEQIXdb3OjhFVVYjzGAPO8WGCmRbrml64SPw/jJD4GoE98aR7r25A0XcgrK3F02yw9R/vhQw=="], @@ -1687,11 +1709,11 @@ "eslint/ajv": ["ajv@6.15.0", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw=="], - "eslint/eslint-visitor-keys": ["eslint-visitor-keys@5.0.1", "", {}, "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA=="], + "eslint/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], - "eslint/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], + "eslint/eslint-visitor-keys": ["eslint-visitor-keys@4.2.1", "", {}, "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ=="], - "eslint/minimatch": ["minimatch@10.2.5", "", { "dependencies": { "brace-expansion": "^5.0.5" } }, "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg=="], + "eslint/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], "eslint-import-resolver-node/debug": ["debug@3.2.7", "", { "dependencies": { "ms": "^2.1.1" } }, "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ=="], @@ -1703,7 +1725,7 @@ "eslint-plugin-import/tsconfig-paths": ["tsconfig-paths@3.15.0", "", { "dependencies": { "@types/json5": "^0.0.29", "json5": "^1.0.2", "minimist": "^1.2.6", "strip-bom": "^3.0.0" } }, "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg=="], - "espree/eslint-visitor-keys": ["eslint-visitor-keys@5.0.1", "", {}, "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA=="], + "espree/eslint-visitor-keys": ["eslint-visitor-keys@4.2.1", "", {}, "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ=="], "execa/onetime": ["onetime@5.1.2", "", { "dependencies": { "mimic-fn": "^2.1.0" } }, "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg=="], @@ -1731,12 +1753,16 @@ "plist/xmlbuilder": ["xmlbuilder@15.1.1", "", {}, "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg=="], + "rc/strip-json-comments": ["strip-json-comments@2.0.1", "", {}, "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ=="], + "react-devtools-core/ws": ["ws@7.5.11", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": "^5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-zS54Oen9bITtp7kp2XM3AydrCIq1D+HwJOuH+c+e4LfpL/lotP5osijd+UoMnxwAam1GN8R4KtLAyIrIcBNpiA=="], "react-reconciler/scheduler": ["scheduler@0.26.0", "", {}, "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA=="], "send/mime-types": ["mime-types@3.0.2", "", { "dependencies": { "mime-db": "^1.54.0" } }, "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A=="], + "slice-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], + "tar-stream/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=="], "ts-node/diff": ["diff@4.0.4", "", {}, "sha512-X07nttJQkwkfKfvTPG/KSnE2OMdcUCao6+eXF3wmnIQRn2aPAHH3VxDbDOdegkd6JbPsXqShpvEOHfAT+nCNwQ=="], @@ -1751,6 +1777,8 @@ "typescript-eslint/@typescript-eslint/utils": ["@typescript-eslint/utils@7.18.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@typescript-eslint/scope-manager": "7.18.0", "@typescript-eslint/types": "7.18.0", "@typescript-eslint/typescript-estree": "7.18.0" }, "peerDependencies": { "eslint": "^8.56.0" } }, "sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw=="], + "wrap-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], + "wrap-ansi/string-width": ["string-width@8.2.1", "", { "dependencies": { "get-east-asian-width": "^1.5.0", "strip-ansi": "^7.1.2" } }, "sha512-IIaP0g3iy9Cyy18w3M9YcaDudujEAVHKt3a3QJg1+sr/oX96TbaGUubG0hJyCjCBThFH+tFpcIyoUHUn1ogaLA=="], "yargs/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], @@ -1759,7 +1787,9 @@ "@codebuff/evals/pino/process-warning": ["process-warning@5.0.0", "", {}, "sha512-a39t9ApHNx2L4+HBnQKqxxHNs1r7KF+Intd8Q/g1bUh6q0WIp9voPXJ/x0j+ZL45KF1pJd9+q2jLIRMfvEshkA=="], - "@eslint/config-array/minimatch/brace-expansion": ["brace-expansion@5.0.6", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g=="], + "@eslint/eslintrc/ajv/json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], + + "@eslint/eslintrc/js-yaml/argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="], "@typescript-eslint/parser/@typescript-eslint/typescript-estree/minimatch": ["minimatch@9.0.9", "", { "dependencies": { "brace-expansion": "^2.0.2" } }, "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg=="], @@ -1773,14 +1803,10 @@ "cliui/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], - "cliui/wrap-ansi/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], - "eslint-plugin-import/tsconfig-paths/json5": ["json5@1.0.2", "", { "dependencies": { "minimist": "^1.2.0" }, "bin": { "json5": "lib/cli.js" } }, "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA=="], "eslint/ajv/json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], - "eslint/minimatch/brace-expansion": ["brace-expansion@5.0.6", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g=="], - "express/mime-types/mime-db": ["mime-db@1.54.0", "", {}, "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ=="], "p-locate/p-limit/yocto-queue": ["yocto-queue@0.1.0", "", {}, "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="], @@ -1809,12 +1835,8 @@ "yargs/string-width/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], - "@eslint/config-array/minimatch/brace-expansion/balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="], - "@typescript-eslint/parser/@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.1.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-WR1cURNjuvBLMZBMbqM0UoE+WAfdUcEV1ccD8PVBVOI+Z3ND4+SZbN8RsfT2bMuG1qwz5RFvPukSZm5fF2D5eA=="], - "eslint/minimatch/brace-expansion/balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="], - "typescript-eslint/@typescript-eslint/eslint-plugin/@typescript-eslint/scope-manager/@typescript-eslint/types": ["@typescript-eslint/types@7.18.0", "", {}, "sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ=="], "typescript-eslint/@typescript-eslint/eslint-plugin/@typescript-eslint/type-utils/@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@7.18.0", "", { "dependencies": { "@typescript-eslint/types": "7.18.0", "@typescript-eslint/visitor-keys": "7.18.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", "minimatch": "^9.0.4", "semver": "^7.6.0", "ts-api-utils": "^1.3.0" } }, "sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA=="], From a3f92a12a196ecd73ce4f6a4ff192e24d480f12c Mon Sep 17 00:00:00 2001 From: codebuff public sync bot <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 11 Jun 2026 01:28:53 +0000 Subject: [PATCH 52/96] Sync public snapshot from freebuff-private Source: CodebuffAI/freebuff-private@c7762aaed6e58a62db2100e980ba3c41dba099ea --- bun.lock | 76 +++++++++++++++++++------------------------------------- 1 file changed, 26 insertions(+), 50 deletions(-) diff --git a/bun.lock b/bun.lock index 9ff557b69a..3e972925d1 100644 --- a/bun.lock +++ b/bun.lock @@ -239,19 +239,15 @@ "@eslint-community/regexpp": ["@eslint-community/regexpp@4.12.2", "", {}, "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew=="], - "@eslint/config-array": ["@eslint/config-array@0.21.2", "", { "dependencies": { "@eslint/object-schema": "^2.1.7", "debug": "^4.3.1", "minimatch": "^3.1.5" } }, "sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw=="], + "@eslint/config-array": ["@eslint/config-array@0.23.5", "", { "dependencies": { "@eslint/object-schema": "^3.0.5", "debug": "^4.3.1", "minimatch": "^10.2.4" } }, "sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA=="], - "@eslint/config-helpers": ["@eslint/config-helpers@0.4.2", "", { "dependencies": { "@eslint/core": "^0.17.0" } }, "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw=="], + "@eslint/config-helpers": ["@eslint/config-helpers@0.6.0", "", { "dependencies": { "@eslint/core": "^1.2.1" } }, "sha512-ii6Bw9jJ2zi2cWA2Z+9/QZ/+3DX6kwaV5Q986D/CdP3Lap3w/pgQZ373FV7byY/i7L4IRH/G43I5dz1ClsCbpA=="], - "@eslint/core": ["@eslint/core@0.17.0", "", { "dependencies": { "@types/json-schema": "^7.0.15" } }, "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ=="], + "@eslint/core": ["@eslint/core@1.2.1", "", { "dependencies": { "@types/json-schema": "^7.0.15" } }, "sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ=="], - "@eslint/eslintrc": ["@eslint/eslintrc@3.3.5", "", { "dependencies": { "ajv": "^6.14.0", "debug": "^4.3.2", "espree": "^10.0.1", "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.1", "minimatch": "^3.1.5", "strip-json-comments": "^3.1.1" } }, "sha512-4IlJx0X0qftVsN5E+/vGujTRIFtwuLbNsVUe7TO6zYPDR1O6nFwvwhIKEKSrl6dZchmYBITazxKoUYOjdtjlRg=="], + "@eslint/object-schema": ["@eslint/object-schema@3.0.5", "", {}, "sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw=="], - "@eslint/js": ["@eslint/js@9.39.4", "", {}, "sha512-nE7DEIchvtiFTwBw4Lfbu59PG+kCofhjsKaCWzxTpt4lfRjRMqG6uMBzKXuEcyXhOHoUp9riAm7/aWYGhXZ9cw=="], - - "@eslint/object-schema": ["@eslint/object-schema@2.1.7", "", {}, "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA=="], - - "@eslint/plugin-kit": ["@eslint/plugin-kit@0.4.1", "", { "dependencies": { "@eslint/core": "^0.17.0", "levn": "^0.4.1" } }, "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA=="], + "@eslint/plugin-kit": ["@eslint/plugin-kit@0.7.2", "", { "dependencies": { "@eslint/core": "^1.2.1", "levn": "^0.4.1" } }, "sha512-+CNAzxglkrpNf/kKywqQfk74QjtceuOE7Qm+AF8miRvPF/wmmK5+OJOgVh3AVTT3RP2mH3+FOaxlE5v72owk0A=="], "@gravity-ai/api": ["@gravity-ai/api@0.1.2", "", { "dependencies": { "axios": "^1.13.2" } }, "sha512-txsAhyzvwB/TNrj5R8DoNqw8afM3JY2ahl7aaeaD5ZsxP+7rxff7C7keGI7+gU2KT3d2Mcw4QB1nHhbTSCJYHw=="], @@ -467,6 +463,8 @@ "@types/diff": ["@types/diff@8.0.0", "", { "dependencies": { "diff": "*" } }, "sha512-o7jqJM04gfaYrdCecCVMbZhNdG6T1MHg/oQoRFdERLV+4d+V7FijhiEAbFu0Usww84Yijk9yH58U4Jk4HbtzZw=="], + "@types/esrecurse": ["@types/esrecurse@4.3.1", "", {}, "sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw=="], + "@types/estree": ["@types/estree@1.0.9", "", {}, "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg=="], "@types/js-yaml": ["@types/js-yaml@4.0.9", "", {}, "sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg=="], @@ -549,7 +547,7 @@ "ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="], - "ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + "ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], "any-base": ["any-base@1.1.0", "", {}, "sha512-uMgjozySS8adZZYePpaWs8cxB9/kdzmpX6SgJZ+wbz1K5eYk5QMYDVJaZKhxyIHUdnnJkfR7SVgStgH7LkGUyg=="], @@ -625,8 +623,6 @@ "call-bound": ["call-bound@1.0.4", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "get-intrinsic": "^1.3.0" } }, "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg=="], - "callsites": ["callsites@3.1.0", "", {}, "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="], - "caniuse-lite": ["caniuse-lite@1.0.30001797", "", {}, "sha512-l8xKG+gwAIExZGl9FrF7KUwuOmk6wbEPC9Xoy/RtnWv1XG0Q4LFlagaLpUv3Kiza3W/wm27zy0yWJEieYKAP6w=="], "canvas": ["canvas@3.2.3", "", { "dependencies": { "node-addon-api": "^7.0.0", "prebuild-install": "^7.1.3" } }, "sha512-PzE5nJZPz72YUAfo8oTp0u3fqqY7IzlTubneAihqDYAUcBk7ryeCmBbdJBEdaH0bptSOe2VT2Zwcb3UaFyaSWw=="], @@ -751,7 +747,7 @@ "escape-string-regexp": ["escape-string-regexp@4.0.0", "", {}, "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="], - "eslint": ["eslint@9.39.4", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", "@eslint/config-array": "^0.21.2", "@eslint/config-helpers": "^0.4.2", "@eslint/core": "^0.17.0", "@eslint/eslintrc": "^3.3.5", "@eslint/js": "9.39.4", "@eslint/plugin-kit": "^0.4.1", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "ajv": "^6.14.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^8.4.0", "eslint-visitor-keys": "^4.2.1", "espree": "^10.4.0", "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.5", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, "peerDependencies": { "jiti": "*" }, "optionalPeers": ["jiti"], "bin": { "eslint": "bin/eslint.js" } }, "sha512-XoMjdBOwe/esVgEvLmNsD3IRHkm7fbKIUGvrleloJXUZgDHig2IPWNniv+GwjyJXzuNqVjlr5+4yVUZjycJwfQ=="], + "eslint": ["eslint@10.4.1", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.2", "@eslint/config-array": "^0.23.5", "@eslint/config-helpers": "^0.6.0", "@eslint/core": "^1.2.1", "@eslint/plugin-kit": "^0.7.2", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "ajv": "^6.14.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^9.1.2", "eslint-visitor-keys": "^5.0.1", "espree": "^11.2.0", "esquery": "^1.7.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "minimatch": "^10.2.4", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, "peerDependencies": { "jiti": "*" }, "optionalPeers": ["jiti"], "bin": { "eslint": "bin/eslint.js" } }, "sha512-AyIKhnOBuOAdueD7RB3xB+YeAWScb9jHsJBgH2Hcde8InP5JYhqrRR6iTMHyTEwgENK54Cp44e4v8BwNhsuHuw=="], "eslint-config-prettier": ["eslint-config-prettier@9.1.2", "", { "peerDependencies": { "eslint": ">=7.0.0" }, "bin": { "eslint-config-prettier": "bin/cli.js" } }, "sha512-iI1f+D2ViGn+uvv5HuHVUamg8ll4tN+JRHGc6IJi4TP9Kl976C57fzPXgseXNs8v0iA8aSJpHsTWjDb9QJamGQ=="], @@ -763,11 +759,11 @@ "eslint-plugin-unused-imports": ["eslint-plugin-unused-imports@4.4.1", "", { "peerDependencies": { "@typescript-eslint/eslint-plugin": "^8.0.0-0 || ^7.0.0 || ^6.0.0 || ^5.0.0", "eslint": "^10.0.0 || ^9.0.0 || ^8.0.0" }, "optionalPeers": ["@typescript-eslint/eslint-plugin"] }, "sha512-oZGYUz1X3sRMGUB+0cZyK2VcvRX5lm/vB56PgNNcU+7ficUCKm66oZWKUubXWnOuPjQ8PvmXtCViXBMONPe7tQ=="], - "eslint-scope": ["eslint-scope@8.4.0", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg=="], + "eslint-scope": ["eslint-scope@9.1.2", "", { "dependencies": { "@types/esrecurse": "^4.3.1", "@types/estree": "^1.0.8", "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ=="], "eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="], - "espree": ["espree@10.4.0", "", { "dependencies": { "acorn": "^8.15.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^4.2.1" } }, "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ=="], + "espree": ["espree@11.2.0", "", { "dependencies": { "acorn": "^8.16.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^5.0.1" } }, "sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw=="], "esprima": ["esprima@4.0.1", "", { "bin": { "esparse": "./bin/esparse.js", "esvalidate": "./bin/esvalidate.js" } }, "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="], @@ -879,8 +875,6 @@ "glob-parent": ["glob-parent@6.0.2", "", { "dependencies": { "is-glob": "^4.0.3" } }, "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A=="], - "globals": ["globals@14.0.0", "", {}, "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ=="], - "globalthis": ["globalthis@1.0.4", "", { "dependencies": { "define-properties": "^1.2.1", "gopd": "^1.0.1" } }, "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ=="], "globby": ["globby@11.1.0", "", { "dependencies": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", "fast-glob": "^3.2.9", "ignore": "^5.2.0", "merge2": "^1.4.1", "slash": "^3.0.0" } }, "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g=="], @@ -895,8 +889,6 @@ "has-bigints": ["has-bigints@1.1.0", "", {}, "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg=="], - "has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], - "has-property-descriptors": ["has-property-descriptors@1.0.2", "", { "dependencies": { "es-define-property": "^1.0.0" } }, "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg=="], "has-proto": ["has-proto@1.2.0", "", { "dependencies": { "dunder-proto": "^1.0.0" } }, "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ=="], @@ -927,8 +919,6 @@ "immer": ["immer@10.2.0", "", {}, "sha512-d/+XTN3zfODyjr89gM3mPq1WNX2B8pYsu7eORitdwyA2sBubnTl3laYlBk4sXY5FUa5qTZGBDPJICVbvqzjlbw=="], - "import-fresh": ["import-fresh@3.3.1", "", { "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" } }, "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ=="], - "imurmurhash": ["imurmurhash@0.1.4", "", {}, "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA=="], "inherits": ["inherits@2.0.4", "", {}, "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="], @@ -1045,8 +1035,6 @@ "lodash": ["lodash@4.17.23", "", {}, "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w=="], - "lodash.merge": ["lodash.merge@4.6.2", "", {}, "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ=="], - "log-update": ["log-update@8.0.0", "", { "dependencies": { "ansi-escapes": "^7.3.0", "cli-cursor": "^5.0.0", "slice-ansi": "^9.0.0", "string-width": "^8.2.0", "strip-ansi": "^7.2.0", "wrap-ansi": "^10.0.0" } }, "sha512-lddSgOt3bPASrylL54ZSpy8nBHns+vBVSoILlVOx+dei300pnLRN958rj/EdlVLKuWlSESU3qdnDZdAI7FXYGg=="], "longest-streak": ["longest-streak@3.1.0", "", {}, "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g=="], @@ -1249,8 +1237,6 @@ "pako": ["pako@1.0.11", "", {}, "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw=="], - "parent-module": ["parent-module@1.0.1", "", { "dependencies": { "callsites": "^3.0.0" } }, "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g=="], - "parse-bmfont-ascii": ["parse-bmfont-ascii@1.0.6", "", {}, "sha512-U4RrVsUFCleIOBsIGYOMKjn9PavsGOXxbvYGtMOEfnId0SVNsgehXh1DxUdVPLoxd5mvcEtvmKs2Mmf0Mpa1ZA=="], "parse-bmfont-binary": ["parse-bmfont-binary@1.0.6", "", {}, "sha512-GxmsRea0wdGdYthjuUeWTMWPqm2+FAd4GI8vCvhgJsFnoGhTrLhXDDupwTo7rXVAgaLIGoVHDZS9p/5XbSqeWA=="], @@ -1395,8 +1381,6 @@ "resolve": ["resolve@2.0.0-next.7", "", { "dependencies": { "es-errors": "^1.3.0", "is-core-module": "^2.16.2", "node-exports-info": "^1.6.0", "object-keys": "^1.1.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-tqt+NBWwyaMgw3zDsnygx4CByWjQEJHOPMdslYhppaQSJUtL/D4JO9CcBBlhPoI8lz9oJIDXkwXfhF4aWqP8xQ=="], - "resolve-from": ["resolve-from@4.0.0", "", {}, "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="], - "resolve-pkg-maps": ["resolve-pkg-maps@1.0.0", "", {}, "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw=="], "restore-cursor": ["restore-cursor@5.1.0", "", { "dependencies": { "onetime": "^7.0.0", "signal-exit": "^4.1.0" } }, "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA=="], @@ -1501,7 +1485,7 @@ "strip-final-newline": ["strip-final-newline@2.0.0", "", {}, "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA=="], - "strip-json-comments": ["strip-json-comments@3.1.1", "", {}, "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig=="], + "strip-json-comments": ["strip-json-comments@2.0.1", "", {}, "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ=="], "stripe": ["stripe@16.12.0", "", { "dependencies": { "@types/node": ">=8.1.0", "qs": "^6.11.0" } }, "sha512-H7eFVLDxeTNNSn4JTRfL2//LzCbDrMSZ+2q1c7CanVWgK2qIW5TwS+0V7N9KcKZZNpYh/uCqK0PyZh/2UsaAtQ=="], @@ -1509,8 +1493,6 @@ "styled-jsx": ["styled-jsx@5.1.6", "", { "dependencies": { "client-only": "0.0.1" }, "peerDependencies": { "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0" } }, "sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA=="], - "supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], - "supports-preserve-symlinks-flag": ["supports-preserve-symlinks-flag@1.0.0", "", {}, "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w=="], "supports-terminal-graphics": ["supports-terminal-graphics@0.1.0", "", {}, "sha512-+KdfozhS0Fw8y5Sghw8kkZNGT8nWYzJ1EzcoIvVjxhl+26TJTs26y02yfBgvc1jh5AS/c8jcI3xtahhR95KRyQ=="], @@ -1669,18 +1651,12 @@ "@codebuff/sdk/ignore": ["ignore@7.0.5", "", {}, "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg=="], - "@eslint/eslintrc/ajv": ["ajv@6.15.0", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw=="], - - "@eslint/eslintrc/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], - - "@eslint/eslintrc/js-yaml": ["js-yaml@4.2.0", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-ePWsvanv0DWuDRsW8dnt+R4jQ31SCRCQ7hhNcPXZPsoBZiemuZNYGf7adZdqX2D86j6rvKp3RpCxVTSb8WQlOw=="], + "@eslint/config-array/minimatch": ["minimatch@10.2.5", "", { "dependencies": { "brace-expansion": "^5.0.5" } }, "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg=="], "@opentui/core/diff": ["diff@9.0.0", "", {}, "sha512-svtcdpS8CgJyqAjEQIXdb3OjhFVVYjzGAPO8WGCmRbrml64SPw/jJD4GoE98aR7r25A0XcgrK3F02yw9R/vhQw=="], "@opentui/core/strip-ansi": ["strip-ansi@7.1.2", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA=="], - "@types/diff/diff": ["diff@9.0.0", "", {}, "sha512-svtcdpS8CgJyqAjEQIXdb3OjhFVVYjzGAPO8WGCmRbrml64SPw/jJD4GoE98aR7r25A0XcgrK3F02yw9R/vhQw=="], - "@typescript-eslint/eslint-plugin/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], "@typescript-eslint/parser/@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@7.18.0", "", { "dependencies": { "@typescript-eslint/types": "7.18.0", "@typescript-eslint/visitor-keys": "7.18.0" } }, "sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA=="], @@ -1709,12 +1685,12 @@ "eslint/ajv": ["ajv@6.15.0", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw=="], - "eslint/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], - - "eslint/eslint-visitor-keys": ["eslint-visitor-keys@4.2.1", "", {}, "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ=="], + "eslint/eslint-visitor-keys": ["eslint-visitor-keys@5.0.1", "", {}, "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA=="], "eslint/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], + "eslint/minimatch": ["minimatch@10.2.5", "", { "dependencies": { "brace-expansion": "^5.0.5" } }, "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg=="], + "eslint-import-resolver-node/debug": ["debug@3.2.7", "", { "dependencies": { "ms": "^2.1.1" } }, "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ=="], "eslint-module-utils/debug": ["debug@3.2.7", "", { "dependencies": { "ms": "^2.1.1" } }, "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ=="], @@ -1725,7 +1701,7 @@ "eslint-plugin-import/tsconfig-paths": ["tsconfig-paths@3.15.0", "", { "dependencies": { "@types/json5": "^0.0.29", "json5": "^1.0.2", "minimist": "^1.2.6", "strip-bom": "^3.0.0" } }, "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg=="], - "espree/eslint-visitor-keys": ["eslint-visitor-keys@4.2.1", "", {}, "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ=="], + "espree/eslint-visitor-keys": ["eslint-visitor-keys@5.0.1", "", {}, "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA=="], "execa/onetime": ["onetime@5.1.2", "", { "dependencies": { "mimic-fn": "^2.1.0" } }, "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg=="], @@ -1753,16 +1729,12 @@ "plist/xmlbuilder": ["xmlbuilder@15.1.1", "", {}, "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg=="], - "rc/strip-json-comments": ["strip-json-comments@2.0.1", "", {}, "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ=="], - "react-devtools-core/ws": ["ws@7.5.11", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": "^5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-zS54Oen9bITtp7kp2XM3AydrCIq1D+HwJOuH+c+e4LfpL/lotP5osijd+UoMnxwAam1GN8R4KtLAyIrIcBNpiA=="], "react-reconciler/scheduler": ["scheduler@0.26.0", "", {}, "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA=="], "send/mime-types": ["mime-types@3.0.2", "", { "dependencies": { "mime-db": "^1.54.0" } }, "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A=="], - "slice-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], - "tar-stream/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=="], "ts-node/diff": ["diff@4.0.4", "", {}, "sha512-X07nttJQkwkfKfvTPG/KSnE2OMdcUCao6+eXF3wmnIQRn2aPAHH3VxDbDOdegkd6JbPsXqShpvEOHfAT+nCNwQ=="], @@ -1777,8 +1749,6 @@ "typescript-eslint/@typescript-eslint/utils": ["@typescript-eslint/utils@7.18.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@typescript-eslint/scope-manager": "7.18.0", "@typescript-eslint/types": "7.18.0", "@typescript-eslint/typescript-estree": "7.18.0" }, "peerDependencies": { "eslint": "^8.56.0" } }, "sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw=="], - "wrap-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], - "wrap-ansi/string-width": ["string-width@8.2.1", "", { "dependencies": { "get-east-asian-width": "^1.5.0", "strip-ansi": "^7.1.2" } }, "sha512-IIaP0g3iy9Cyy18w3M9YcaDudujEAVHKt3a3QJg1+sr/oX96TbaGUubG0hJyCjCBThFH+tFpcIyoUHUn1ogaLA=="], "yargs/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], @@ -1787,9 +1757,7 @@ "@codebuff/evals/pino/process-warning": ["process-warning@5.0.0", "", {}, "sha512-a39t9ApHNx2L4+HBnQKqxxHNs1r7KF+Intd8Q/g1bUh6q0WIp9voPXJ/x0j+ZL45KF1pJd9+q2jLIRMfvEshkA=="], - "@eslint/eslintrc/ajv/json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], - - "@eslint/eslintrc/js-yaml/argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="], + "@eslint/config-array/minimatch/brace-expansion": ["brace-expansion@5.0.6", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g=="], "@typescript-eslint/parser/@typescript-eslint/typescript-estree/minimatch": ["minimatch@9.0.9", "", { "dependencies": { "brace-expansion": "^2.0.2" } }, "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg=="], @@ -1803,10 +1771,14 @@ "cliui/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], + "cliui/wrap-ansi/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + "eslint-plugin-import/tsconfig-paths/json5": ["json5@1.0.2", "", { "dependencies": { "minimist": "^1.2.0" }, "bin": { "json5": "lib/cli.js" } }, "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA=="], "eslint/ajv/json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], + "eslint/minimatch/brace-expansion": ["brace-expansion@5.0.6", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g=="], + "express/mime-types/mime-db": ["mime-db@1.54.0", "", {}, "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ=="], "p-locate/p-limit/yocto-queue": ["yocto-queue@0.1.0", "", {}, "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="], @@ -1835,8 +1807,12 @@ "yargs/string-width/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + "@eslint/config-array/minimatch/brace-expansion/balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="], + "@typescript-eslint/parser/@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.1.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-WR1cURNjuvBLMZBMbqM0UoE+WAfdUcEV1ccD8PVBVOI+Z3ND4+SZbN8RsfT2bMuG1qwz5RFvPukSZm5fF2D5eA=="], + "eslint/minimatch/brace-expansion/balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="], + "typescript-eslint/@typescript-eslint/eslint-plugin/@typescript-eslint/scope-manager/@typescript-eslint/types": ["@typescript-eslint/types@7.18.0", "", {}, "sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ=="], "typescript-eslint/@typescript-eslint/eslint-plugin/@typescript-eslint/type-utils/@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@7.18.0", "", { "dependencies": { "@typescript-eslint/types": "7.18.0", "@typescript-eslint/visitor-keys": "7.18.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", "minimatch": "^9.0.4", "semver": "^7.6.0", "ts-api-utils": "^1.3.0" } }, "sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA=="], From 3168bffcd768f4aec75a5f4aa7a233d27bc9d8a2 Mon Sep 17 00:00:00 2001 From: codebuff public sync bot <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 11 Jun 2026 01:40:44 +0000 Subject: [PATCH 53/96] Sync public snapshot from freebuff-private Source: CodebuffAI/freebuff-private@1d4aa39f4f279a57a3d731853ab929213e6d7331 --- cli/src/components/help-banner.tsx | 4 + cli/src/types/env.ts | 1 + cli/src/utils/__tests__/clipboard.test.ts | 135 ++++++++++++++++++++++ cli/src/utils/clipboard.ts | 38 +++++- cli/src/utils/env.ts | 1 + 5 files changed, 173 insertions(+), 6 deletions(-) diff --git a/cli/src/components/help-banner.tsx b/cli/src/components/help-banner.tsx index ccf39bdf82..f62983dda4 100644 --- a/cli/src/components/help-banner.tsx +++ b/cli/src/components/help-banner.tsx @@ -93,6 +93,10 @@ export const HelpBanner = () => { Use @ to reference agents to spawn or files to read + + Drag to select text — it copies automatically (or click ⎘ on a + message) + Esc to cancel the current response diff --git a/cli/src/types/env.ts b/cli/src/types/env.ts index 948de24c7b..74ea34966d 100644 --- a/cli/src/types/env.ts +++ b/cli/src/types/env.ts @@ -25,6 +25,7 @@ export type CliEnv = BaseEnv & { SSH_CLIENT?: string SSH_TTY?: string SSH_CONNECTION?: string + CODESPACES?: string // Display server detection (Linux headless check) DISPLAY?: string diff --git a/cli/src/utils/__tests__/clipboard.test.ts b/cli/src/utils/__tests__/clipboard.test.ts index e977f3f9f4..4bbaea0ced 100644 --- a/cli/src/utils/__tests__/clipboard.test.ts +++ b/cli/src/utils/__tests__/clipboard.test.ts @@ -5,6 +5,7 @@ import { describe, test, expect, beforeEach, afterEach, spyOn } from 'bun:test' import { copyTextToClipboard, + OSC52_BLOCKED_MESSAGE, showClipboardMessage, subscribeClipboardMessages, clearClipboardMessage, @@ -659,6 +660,140 @@ describe('clipboard', () => { }) }) + describe('copyTextToClipboard - blocked OSC52 terminals (Codespaces / VS Code remote)', () => { + // GitHub Codespaces and VS Code remote terminals silently drop OSC 52 + // sequences, so OSC52-based copy must be treated as unavailable there and + // the user shown the Shift+drag workaround instead of a false "Copied". + + let originalEnv: Record + let originalPlatform: PropertyDescriptor | undefined + let loggerErrorSpy: ReturnType + + beforeEach(() => { + originalEnv = { + SSH_CLIENT: process.env.SSH_CLIENT, + SSH_TTY: process.env.SSH_TTY, + SSH_CONNECTION: process.env.SSH_CONNECTION, + TERM: process.env.TERM, + TMUX: process.env.TMUX, + STY: process.env.STY, + TERM_PROGRAM: process.env.TERM_PROGRAM, + CODESPACES: process.env.CODESPACES, + } + originalPlatform = Object.getOwnPropertyDescriptor(process, 'platform') + loggerErrorSpy = spyOn(logger, 'error').mockImplementation(() => {}) + + // No platform clipboard tool available + Object.defineProperty(process, 'platform', { value: 'freebsd', configurable: true }) + delete process.env.SSH_CLIENT + delete process.env.SSH_TTY + delete process.env.SSH_CONNECTION + delete process.env.TMUX + delete process.env.STY + delete process.env.CODESPACES + process.env.TERM = 'xterm-256color' + process.env.TERM_PROGRAM = 'vscode' + + clearClipboardMessage() + unregisterClipboardRenderer() + }) + + afterEach(() => { + unregisterClipboardRenderer() + for (const [key, value] of Object.entries(originalEnv)) { + if (value !== undefined) process.env[key] = value + else delete process.env[key] + } + if (originalPlatform) { + Object.defineProperty(process, 'platform', originalPlatform) + } + loggerErrorSpy.mockRestore() + clearClipboardMessage() + }) + + test('Codespaces: renderer OSC52 is skipped and copy fails', async () => { + process.env.CODESPACES = 'true' + + const calls: string[] = [] + registerClipboardRenderer({ + copyToClipboardOSC52: (text: string) => { + calls.push(text) + return true + }, + }) + + await expect( + copyTextToClipboard('test text', { suppressGlobalMessage: true }), + ).rejects.toThrow('No clipboard method available') + + expect(calls).toEqual([]) + }) + + test('Codespaces: shows Shift+drag guidance even with suppressGlobalMessage', async () => { + process.env.CODESPACES = 'true' + + const messages: (string | null)[] = [] + const unsubscribe = subscribeClipboardMessages((msg) => messages.push(msg)) + + await expect( + copyTextToClipboard('test text', { suppressGlobalMessage: true }), + ).rejects.toThrow() + + expect(messages).toContain(OSC52_BLOCKED_MESSAGE) + + unsubscribe() + }) + + test('VS Code remote SSH: OSC52 is skipped and guidance is shown', async () => { + process.env.SSH_CONNECTION = '192.168.1.100 54321 10.0.0.1 22' + + const messages: (string | null)[] = [] + const unsubscribe = subscribeClipboardMessages((msg) => messages.push(msg)) + + registerClipboardRenderer({ copyToClipboardOSC52: () => true }) + + await expect(copyTextToClipboard('test text')).rejects.toThrow() + + expect(messages).toContain(OSC52_BLOCKED_MESSAGE) + expect(messages.find((m) => m?.startsWith('Copied'))).toBeUndefined() + + unsubscribe() + }) + + test('local VS Code terminal: OSC52 still works', async () => { + // No CODESPACES, no SSH vars — local VS Code honors OSC 52 + const calls: string[] = [] + registerClipboardRenderer({ + copyToClipboardOSC52: (text: string) => { + calls.push(text) + return true + }, + }) + + await copyTextToClipboard('test text', { suppressGlobalMessage: true }) + + expect(calls).toEqual(['test text']) + }) + + test('Codespaces over plain SSH (not vscode terminal): OSC52 still works', async () => { + // e.g. `gh codespace ssh` from a real terminal — OSC 52 passes through + process.env.CODESPACES = 'true' + delete process.env.TERM_PROGRAM + + const calls: string[] = [] + registerClipboardRenderer({ + copyToClipboardOSC52: (text: string) => { + calls.push(text) + return true + }, + }) + + await copyTextToClipboard('test text', { suppressGlobalMessage: true }) + + expect(calls).toEqual(['test text']) + }) + }) + describe('copyTextToClipboard - OSC52 behavior', () => { // Tests for OSC52 escape sequence behavior. // OSC52 is used for clipboard access over SSH and in terminal multiplexers. diff --git a/cli/src/utils/clipboard.ts b/cli/src/utils/clipboard.ts index 02d6f8eb28..f333e4921b 100644 --- a/cli/src/utils/clipboard.ts +++ b/cli/src/utils/clipboard.ts @@ -96,16 +96,20 @@ export async function copyTextToClipboard( return } + const osc52Blocked = isOsc52Blocked() try { + const tryCopyViaAnyOsc52 = () => + !osc52Blocked && (tryCopyViaRenderer(text) || tryCopyViaOsc52(text)) + let copied: boolean if (isRemoteSession()) { // Remote/SSH: prefer renderer OSC 52 (through render pipeline), // then our manual OSC 52, then platform tools - copied = tryCopyViaRenderer(text) || tryCopyViaOsc52(text) || tryCopyViaPlatformTool(text) + copied = tryCopyViaAnyOsc52() || tryCopyViaPlatformTool(text) } else { // Local: prefer platform tools (reliable with tmux), // then renderer OSC 52, then our manual OSC 52 as fallback - copied = tryCopyViaPlatformTool(text) || tryCopyViaRenderer(text) || tryCopyViaOsc52(text) + copied = tryCopyViaPlatformTool(text) || tryCopyViaAnyOsc52() } if (!copied) { @@ -123,10 +127,17 @@ export async function copyTextToClipboard( } } catch (error) { logger.error(error, 'Failed to copy to clipboard') - if (!suppressGlobalMessage) { - showClipboardMessage(errorMessage ?? 'Failed to copy to clipboard', { - durationMs, - }) + // When the terminal drops OSC 52 and no platform tool exists (e.g. + // Codespaces), the Shift+drag guidance is the only way the user can copy, + // so show it even for callers that suppress routine messages. + if (!suppressGlobalMessage || osc52Blocked) { + showClipboardMessage( + osc52Blocked + ? OSC52_BLOCKED_MESSAGE + : (errorMessage ?? 'Failed to copy to clipboard'), + // Give the longer guidance message extra time to be read + { durationMs: durationMs ?? (osc52Blocked ? 6000 : undefined) }, + ) } throw error } @@ -153,6 +164,21 @@ export function isRemoteSession(): boolean { return !!(env.SSH_CLIENT || env.SSH_TTY || env.SSH_CONNECTION) } +export const OSC52_BLOCKED_MESSAGE = + 'Copy is blocked by this terminal — hold Shift and drag to select, then copy normally' + +// GitHub Codespaces and VS Code remote (SSH/tunnel) terminals silently drop +// OSC 52 sequences, so a "successful" write never reaches the user's +// clipboard. Local VS Code terminals (including devcontainers) honor OSC 52. +// https://github.com/microsoft/vscode-remote-release/issues/11475 +export function isOsc52Blocked(): boolean { + const env = getCliEnv() + return ( + env.TERM_PROGRAM === 'vscode' && + (env.CODESPACES === 'true' || isRemoteSession()) + ) +} + function tryCopyViaPlatformTool(text: string): boolean { const { execSync } = require('child_process') as typeof import('child_process') const opts = { input: text, stdio: ['pipe', 'ignore', 'ignore'] as ('pipe' | 'ignore')[] } diff --git a/cli/src/utils/env.ts b/cli/src/utils/env.ts index e7a0148bdc..69b8480dab 100644 --- a/cli/src/utils/env.ts +++ b/cli/src/utils/env.ts @@ -29,6 +29,7 @@ export const getCliEnv = (): CliEnv => ({ SSH_CLIENT: process.env.SSH_CLIENT, SSH_TTY: process.env.SSH_TTY, SSH_CONNECTION: process.env.SSH_CONNECTION, + CODESPACES: process.env.CODESPACES, // Terminal detection KITTY_WINDOW_ID: process.env.KITTY_WINDOW_ID, From 9921c268b2a41a89f81ed2bcb6d4e8154d66dfc5 Mon Sep 17 00:00:00 2001 From: codebuff public sync bot <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 11 Jun 2026 01:55:00 +0000 Subject: [PATCH 54/96] Sync public snapshot from freebuff-private Source: CodebuffAI/freebuff-private@5952fa02387f6d734f3feaa67ffe739c58cd06f3 --- bun.lock | 4 +-- cli/src/components/waiting-room-screen.tsx | 35 ++++++++++++---------- 2 files changed, 20 insertions(+), 19 deletions(-) diff --git a/bun.lock b/bun.lock index 3e972925d1..e2e2db5006 100644 --- a/bun.lock +++ b/bun.lock @@ -1309,7 +1309,7 @@ "posthog-node": ["posthog-node@5.36.15", "", { "dependencies": { "@posthog/core": "1.32.1" }, "peerDependencies": { "rxjs": "^7.0.0" }, "optionalPeers": ["rxjs"] }, "sha512-rEy0HWxJCPo06UkAv5vgo0VkFsQdQa6yX74LhBRYUjG1QFEAm39PcVzSmiX4YH2x6+OJzZ0UZ17g+wU1fzvmZQ=="], - "preact": ["preact@10.29.2", "", {}, "sha512-7tNmwg/7mzzAoB/8kSg6Hl37JraAZw3Z3A0JSY7VXlZwo82Xn0G7wKbNNs2qoF4ZEEsQGTwDAroNdqKs1ofJxQ=="], + "preact": ["preact@10.24.3", "", {}, "sha512-Z2dPnBnMUfyQfSQ+GBdsGa16hz35YmLmtTLhM169uW944hYL6xzTYkJjC07j+Wosz733pMWx0fgON3JNw1jJQA=="], "preact-render-to-string": ["preact-render-to-string@5.2.6", "", { "dependencies": { "pretty-format": "^3.8.0" }, "peerDependencies": { "preact": ">=10" } }, "sha512-JyhErpYOvBV1hEPwIxc/fHWXPfnEGdRKxc8gFdAZ7XV4tlzyzG847XAyEZqoDnynP88akM4eaHcSOzNcLWFguw=="], @@ -1639,8 +1639,6 @@ "zwitch": ["zwitch@2.0.4", "", {}, "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A=="], - "@auth/core/preact": ["preact@10.24.3", "", {}, "sha512-Z2dPnBnMUfyQfSQ+GBdsGa16hz35YmLmtTLhM169uW944hYL6xzTYkJjC07j+Wosz733pMWx0fgON3JNw1jJQA=="], - "@auth/core/preact-render-to-string": ["preact-render-to-string@6.5.11", "", { "peerDependencies": { "preact": ">=10" } }, "sha512-ubnauqoGczeGISiOh6RjX0/cdaF8v/oDXIjO85XALCQjwQP+SB4RDXXtvZ6yTYSjG+PC1QRP2AhPgCEsM2EvUw=="], "@codebuff/common/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], diff --git a/cli/src/components/waiting-room-screen.tsx b/cli/src/components/waiting-room-screen.tsx index 98e4711632..fd4e179941 100644 --- a/cli/src/components/waiting-room-screen.tsx +++ b/cli/src/components/waiting-room-screen.tsx @@ -107,11 +107,17 @@ const formatPrivacySignalList = ( return `${labels.slice(0, -1).join(', ')}, or ${labels[labels.length - 1]}` } -const getLimitedModeReason = ( +// Tone matters here: this is shown to users who, through no fault of their +// own, get the smaller model set. Frame it as model *availability* ("aren't +// available in BR yet"), never as restricted *access* ("limited mode", +// "blocked") — clear enough to answer "why these models?" for someone who +// goes looking, quiet enough to ignore for someone who doesn't. The VPN case +// is the one the user can act on, so it leads with the action. +const getLimitedModeNotice = ( session: FreebuffSessionResponse | null, ): string | null => { if (!session || !('countryBlockReason' in session)) { - return 'reduced free model access' + return "Some models aren't available on this connection" } const countryCode = @@ -123,19 +129,19 @@ const getLimitedModeReason = ( switch (session.countryBlockReason) { case 'anonymous_network': - return `${formatPrivacySignalList( + return `Using a ${formatPrivacySignalList( session.ipPrivacySignals ?? undefined, - )} detected` + )}? More models are available on a direct connection` case 'country_not_allowed': - return `based on detected country${countryCode ? `: ${countryCode}` : ''}` + return `Some models aren't available in ${countryCode ?? 'your region'} yet` case 'anonymized_or_unknown_country': case 'missing_client_ip': case 'unresolved_client_ip': - return 'location could not be verified' + return "We couldn't confirm your region, so we're showing models available everywhere" case 'ip_privacy_lookup_failed': - return 'network check could not finish' + return "We couldn't finish a network check, so we're showing models available everywhere" default: - return 'reduced free model access' + return "Some models aren't available on this connection" } } @@ -344,8 +350,8 @@ export const WaitingRoomScreen: React.FC = ({ const isQueued = session?.status === 'queued' const accessTier = session && 'accessTier' in session ? session.accessTier : 'full' - const limitedModeReason = - accessTier === 'limited' ? getLimitedModeReason(session) : null + const limitedModeNotice = + accessTier === 'limited' ? getLimitedModeNotice(session) : null // 'none' = user hasn't joined any queue yet. We're in the pre-chat landing // state: show the picker with live N-in-line hints and a prompt. Picking a // model triggers joinFreebuffQueue, which POSTs and transitions us to @@ -389,7 +395,7 @@ export const WaitingRoomScreen: React.FC = ({ accessTier === 'limited' ? FREEBUFF_LIMITED_SESSION_LIMIT : FREEBUFF_PREMIUM_SESSION_LIMIT - const sessionLabel = 'premium sessions' + const sessionLabel = accessTier === 'limited' ? 'sessions' : 'premium sessions' const formattedSharedSessionUsed = formatSessionUnits(sharedSessionUsed) const sessionResetAt = getFreebuffPremiumResetAt({ rateLimitsByModel, @@ -486,12 +492,9 @@ export const WaitingRoomScreen: React.FC = ({ }} > - {limitedModeReason && ( + {limitedModeNotice && ( - - Limited mode - - · {limitedModeReason} + {limitedModeNotice} )} From 9bd9d538111e748a20a73ced0cd32fcc17bd7933 Mon Sep 17 00:00:00 2001 From: codebuff public sync bot <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 11 Jun 2026 03:37:58 +0000 Subject: [PATCH 55/96] Sync public snapshot from freebuff-private Source: CodebuffAI/freebuff-private@c2a8296130bbd862d3944e114304af2c89f7cac1 --- .gitignore | 3 + bun.lock | 6 +- common/src/__tests__/model-config.test.ts | 27 + common/src/constants/model-config.ts | 15 + .../agents-cleanup-base2-lite-error-fz2s.json | 10 - ...dle-agent-types-base2-lite-error-wn0n.json | 10 - ...fork-read-files-base2-lite-error-k8uh.json | 10 - ...r-agent-loading-base2-lite-error-m6as.json | 10 - ...ocate-ws-errors-base2-lite-error-tliq.json | 10 - ...rict-tool-types-base2-lite-error-ftj2.json | 2205 --------- ...rt-agentconfigs-base2-lite-error-yqmc.json | 10 - ...e-agent-builder-base2-lite-error-waas.json | 4182 ----------------- ...e-agent-builder-base2-lite-error-wxn2.json | 3881 --------------- ...pdate-sdk-types-base2-lite-error-p956.json | 10 - .../__tests__/run-agent-step-prefill.test.ts | 160 + packages/agent-runtime/src/run-agent-step.ts | 22 +- 16 files changed, 231 insertions(+), 10340 deletions(-) create mode 100644 common/src/__tests__/model-config.test.ts delete mode 100644 evals/buffbench/agents-cleanup-base2-lite-error-fz2s.json delete mode 100644 evals/buffbench/bundle-agent-types-base2-lite-error-wn0n.json delete mode 100644 evals/buffbench/fork-read-files-base2-lite-error-k8uh.json delete mode 100644 evals/buffbench/refactor-agent-loading-base2-lite-error-m6as.json delete mode 100644 evals/buffbench/relocate-ws-errors-base2-lite-error-tliq.json delete mode 100644 evals/buffbench/restrict-tool-types-base2-lite-error-ftj2.json delete mode 100644 evals/buffbench/support-agentconfigs-base2-lite-error-yqmc.json delete mode 100644 evals/buffbench/update-agent-builder-base2-lite-error-waas.json delete mode 100644 evals/buffbench/update-agent-builder-base2-lite-error-wxn2.json delete mode 100644 evals/buffbench/update-sdk-types-base2-lite-error-p956.json create mode 100644 packages/agent-runtime/src/__tests__/run-agent-step-prefill.test.ts diff --git a/.gitignore b/.gitignore index 3b7ad26d3b..c7176c9f79 100644 --- a/.gitignore +++ b/.gitignore @@ -33,3 +33,6 @@ docs/bot-detection.md # Infisical config (user-specific) .infisical.json + +# Buffbench DEBUG_ERROR dumps +evals/buffbench/*-error-*.json diff --git a/bun.lock b/bun.lock index e2e2db5006..93665ce75c 100644 --- a/bun.lock +++ b/bun.lock @@ -1309,7 +1309,7 @@ "posthog-node": ["posthog-node@5.36.15", "", { "dependencies": { "@posthog/core": "1.32.1" }, "peerDependencies": { "rxjs": "^7.0.0" }, "optionalPeers": ["rxjs"] }, "sha512-rEy0HWxJCPo06UkAv5vgo0VkFsQdQa6yX74LhBRYUjG1QFEAm39PcVzSmiX4YH2x6+OJzZ0UZ17g+wU1fzvmZQ=="], - "preact": ["preact@10.24.3", "", {}, "sha512-Z2dPnBnMUfyQfSQ+GBdsGa16hz35YmLmtTLhM169uW944hYL6xzTYkJjC07j+Wosz733pMWx0fgON3JNw1jJQA=="], + "preact": ["preact@10.29.2", "", {}, "sha512-7tNmwg/7mzzAoB/8kSg6Hl37JraAZw3Z3A0JSY7VXlZwo82Xn0G7wKbNNs2qoF4ZEEsQGTwDAroNdqKs1ofJxQ=="], "preact-render-to-string": ["preact-render-to-string@5.2.6", "", { "dependencies": { "pretty-format": "^3.8.0" }, "peerDependencies": { "preact": ">=10" } }, "sha512-JyhErpYOvBV1hEPwIxc/fHWXPfnEGdRKxc8gFdAZ7XV4tlzyzG847XAyEZqoDnynP88akM4eaHcSOzNcLWFguw=="], @@ -1639,6 +1639,8 @@ "zwitch": ["zwitch@2.0.4", "", {}, "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A=="], + "@auth/core/preact": ["preact@10.24.3", "", {}, "sha512-Z2dPnBnMUfyQfSQ+GBdsGa16hz35YmLmtTLhM169uW944hYL6xzTYkJjC07j+Wosz733pMWx0fgON3JNw1jJQA=="], + "@auth/core/preact-render-to-string": ["preact-render-to-string@6.5.11", "", { "peerDependencies": { "preact": ">=10" } }, "sha512-ubnauqoGczeGISiOh6RjX0/cdaF8v/oDXIjO85XALCQjwQP+SB4RDXXtvZ6yTYSjG+PC1QRP2AhPgCEsM2EvUw=="], "@codebuff/common/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], @@ -1655,6 +1657,8 @@ "@opentui/core/strip-ansi": ["strip-ansi@7.1.2", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA=="], + "@types/diff/diff": ["diff@9.0.0", "", {}, "sha512-svtcdpS8CgJyqAjEQIXdb3OjhFVVYjzGAPO8WGCmRbrml64SPw/jJD4GoE98aR7r25A0XcgrK3F02yw9R/vhQw=="], + "@typescript-eslint/eslint-plugin/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], "@typescript-eslint/parser/@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@7.18.0", "", { "dependencies": { "@typescript-eslint/types": "7.18.0", "@typescript-eslint/visitor-keys": "7.18.0" } }, "sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA=="], diff --git a/common/src/__tests__/model-config.test.ts b/common/src/__tests__/model-config.test.ts new file mode 100644 index 0000000000..92c90709e3 --- /dev/null +++ b/common/src/__tests__/model-config.test.ts @@ -0,0 +1,27 @@ +import { describe, expect, test } from 'bun:test' + +import { supportsAssistantPrefill } from '../constants/model-config' + +describe('supportsAssistantPrefill', () => { + test('rejects prefill for Claude 4.6+', () => { + expect(supportsAssistantPrefill('anthropic/claude-opus-4.6')).toBe(false) + expect(supportsAssistantPrefill('anthropic/claude-opus-4.7')).toBe(false) + expect(supportsAssistantPrefill('anthropic/claude-sonnet-4.6')).toBe(false) + expect(supportsAssistantPrefill('anthropic/claude-fable-5')).toBe(false) + }) + + test('allows prefill for Claude before 4.6', () => { + expect(supportsAssistantPrefill('anthropic/claude-sonnet-4.5')).toBe(true) + expect(supportsAssistantPrefill('anthropic/claude-opus-4')).toBe(true) + expect(supportsAssistantPrefill('anthropic/claude-3-5-sonnet')).toBe(true) + expect(supportsAssistantPrefill('anthropic/claude-haiku-4-5-20251001')).toBe( + true, + ) + }) + + test('allows prefill for non-Claude models', () => { + expect(supportsAssistantPrefill('openai/gpt-5.1')).toBe(true) + expect(supportsAssistantPrefill('deepseek/deepseek-v4-pro')).toBe(true) + expect(supportsAssistantPrefill('moonshotai/kimi-k2.6')).toBe(true) + }) +}) diff --git a/common/src/constants/model-config.ts b/common/src/constants/model-config.ts index 92d0d9dd73..f9b8d3f5fc 100644 --- a/common/src/constants/model-config.ts +++ b/common/src/constants/model-config.ts @@ -171,6 +171,21 @@ export function supportsCacheControl(model: Model): boolean { return !nonCacheableModels.includes(model) } +/** + * Claude 4.6+ (including Fable) rejects requests whose final message is an + * assistant message ("This model does not support assistant message prefill"), + * e.g. when routed through Amazon Bedrock. Older Claude models and other + * providers accept a trailing assistant message as a prefill to continue from. + */ +export function supportsAssistantPrefill(model: Model): boolean { + const match = model.match(/claude-(?:[a-z]+-)?(\d+(?:[.-]\d+)?)/) + if (!match) { + return true + } + const version = parseFloat(match[1].replace('-', '.')) + return version < 4.6 +} + export function getModelFromShortName( modelName: string | undefined, ): Model | undefined { diff --git a/evals/buffbench/agents-cleanup-base2-lite-error-fz2s.json b/evals/buffbench/agents-cleanup-base2-lite-error-fz2s.json deleted file mode 100644 index 95173e6046..0000000000 --- a/evals/buffbench/agents-cleanup-base2-lite-error-fz2s.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "type": "error", - "message": "Failed to start agent run", - "trace": [ - { - "type": "start", - "messageHistoryLength": 0 - } - ] -} \ No newline at end of file diff --git a/evals/buffbench/bundle-agent-types-base2-lite-error-wn0n.json b/evals/buffbench/bundle-agent-types-base2-lite-error-wn0n.json deleted file mode 100644 index 95173e6046..0000000000 --- a/evals/buffbench/bundle-agent-types-base2-lite-error-wn0n.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "type": "error", - "message": "Failed to start agent run", - "trace": [ - { - "type": "start", - "messageHistoryLength": 0 - } - ] -} \ No newline at end of file diff --git a/evals/buffbench/fork-read-files-base2-lite-error-k8uh.json b/evals/buffbench/fork-read-files-base2-lite-error-k8uh.json deleted file mode 100644 index 95173e6046..0000000000 --- a/evals/buffbench/fork-read-files-base2-lite-error-k8uh.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "type": "error", - "message": "Failed to start agent run", - "trace": [ - { - "type": "start", - "messageHistoryLength": 0 - } - ] -} \ No newline at end of file diff --git a/evals/buffbench/refactor-agent-loading-base2-lite-error-m6as.json b/evals/buffbench/refactor-agent-loading-base2-lite-error-m6as.json deleted file mode 100644 index 95173e6046..0000000000 --- a/evals/buffbench/refactor-agent-loading-base2-lite-error-m6as.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "type": "error", - "message": "Failed to start agent run", - "trace": [ - { - "type": "start", - "messageHistoryLength": 0 - } - ] -} \ No newline at end of file diff --git a/evals/buffbench/relocate-ws-errors-base2-lite-error-tliq.json b/evals/buffbench/relocate-ws-errors-base2-lite-error-tliq.json deleted file mode 100644 index 95173e6046..0000000000 --- a/evals/buffbench/relocate-ws-errors-base2-lite-error-tliq.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "type": "error", - "message": "Failed to start agent run", - "trace": [ - { - "type": "start", - "messageHistoryLength": 0 - } - ] -} \ No newline at end of file diff --git a/evals/buffbench/restrict-tool-types-base2-lite-error-ftj2.json b/evals/buffbench/restrict-tool-types-base2-lite-error-ftj2.json deleted file mode 100644 index 77d87ed924..0000000000 --- a/evals/buffbench/restrict-tool-types-base2-lite-error-ftj2.json +++ /dev/null @@ -1,2205 +0,0 @@ -{ - "error": "Tool `read_files` is not currently available. Make sure to only use tools listed in the system instructions.", - "trace": [ - { - "type": "start", - "messageHistoryLength": 0 - }, - { - "type": "tool_call", - "toolCallId": "34b93754-82c1-40f4-bec7-20175323504b", - "toolName": "spawn_agent_inline", - "input": { - "agent_type": "context-pruner", - "params": {} - }, - "agentId": "main-agent", - "includeToolCall": false - }, - { - "type": "tool_result", - "toolCallId": "34b93754-82c1-40f4-bec7-20175323504b", - "toolName": "spawn_agent_inline", - "output": [ - { - "type": "json", - "value": { - "message": "Agent spawned." - } - } - ] - }, - { - "type": "tool_call", - "toolCallId": "D-UpnVGjKsI", - "toolName": "spawn_agents", - "input": { - "agents": [ - { - "agent_type": "file-picker", - "prompt": "Find all files related to tool definitions, tool schemas, type generation scripts like generate-tool-definitions.ts, tool registries, and public tool exports. Include files in backend, scripts, sdk, common." - }, - { - "agent_type": "file-picker", - "prompt": "Find files in sdk/src and common/src that define or use tool types, unions, or interfaces like ToolCall, ToolSchema, etc." - }, - { - "agent_type": "file-picker", - "prompt": "Find files handling tool type generation, regeneration, or publishing in SDK and common packages." - }, - { - "agent_type": "code-searcher", - "params": { - "searchQueries": [ - { - "pattern": "generate-tool-definitions|toolSchemas|publicTools|approvedTools|curatedTools|toolRegistry", - "flags": "-g *.ts -g *.json" - }, - { - "pattern": "type\\s+Tool|interface\\s+Tool|union\\s+of\\s+tools|ToolName", - "flags": "-g sdk -g common -g backend/src" - } - ] - } - }, - { - "agent_type": "directory-lister", - "params": { - "directories": [ - { - "path": "scripts" - }, - { - "path": "sdk/src" - }, - { - "path": "common/src" - }, - { - "path": "backend/src" - } - ] - } - } - ] - }, - "agentId": "main-agent", - "includeToolCall": true - }, - { - "type": "subagent_start", - "agentId": "D-Upph7O3-0", - "agentType": "file-picker", - "displayName": "Fletcher the File Fetcher", - "onlyChild": false, - "parentAgentId": "main-agent", - "prompt": "Find all files related to tool definitions, tool schemas, type generation scripts like generate-tool-definitions.ts, tool registries, and public tool exports. Include files in backend, scripts, sdk, common." - }, - { - "type": "subagent_start", - "agentId": "D-UppvyfWNM", - "agentType": "file-picker", - "displayName": "Fletcher the File Fetcher", - "onlyChild": false, - "parentAgentId": "main-agent", - "prompt": "Find files in sdk/src and common/src that define or use tool types, unions, or interfaces like ToolCall, ToolSchema, etc." - }, - { - "type": "subagent_start", - "agentId": "D-UppjyUa0E", - "agentType": "file-picker", - "displayName": "Fletcher the File Fetcher", - "onlyChild": false, - "parentAgentId": "main-agent", - "prompt": "Find files handling tool type generation, regeneration, or publishing in SDK and common packages." - }, - { - "type": "subagent_start", - "agentId": "D-UpptuOT3U", - "agentType": "code-searcher", - "displayName": "Code Searcher", - "onlyChild": false, - "parentAgentId": "main-agent", - "prompt": "", - "params": { - "searchQueries": [ - { - "pattern": "generate-tool-definitions|toolSchemas|publicTools|approvedTools|curatedTools|toolRegistry", - "flags": "-g *.ts -g *.json" - }, - { - "pattern": "type\\s+Tool|interface\\s+Tool|union\\s+of\\s+tools|ToolName", - "flags": "-g sdk -g common -g backend/src" - } - ] - } - }, - { - "type": "subagent_start", - "agentId": "D-UppqGVX8E", - "agentType": "directory-lister", - "displayName": "Directory Lister", - "onlyChild": false, - "parentAgentId": "main-agent", - "prompt": "", - "params": { - "directories": [ - { - "path": "scripts" - }, - { - "path": "sdk/src" - }, - { - "path": "common/src" - }, - { - "path": "backend/src" - } - ] - } - }, - { - "type": "tool_call", - "toolCallId": "d046e8ca-3af1-4520-b256-adb0bd018137", - "toolName": "spawn_agents", - "input": { - "agents": [ - { - "agent_type": "file-lister", - "prompt": "Find all files related to tool definitions, tool schemas, type generation scripts like generate-tool-definitions.ts, tool registries, and public tool exports. Include files in backend, scripts, sdk, common.", - "params": {} - } - ] - }, - "agentId": "D-Upph7O3-0", - "parentAgentId": "main-agent", - "includeToolCall": true - }, - { - "type": "subagent_start", - "agentId": "D-Upzevpluo", - "agentType": "file-lister", - "displayName": "Liszt the File Lister", - "onlyChild": true, - "parentAgentId": "D-Upph7O3-0", - "prompt": "Find all files related to tool definitions, tool schemas, type generation scripts like generate-tool-definitions.ts, tool registries, and public tool exports. Include files in backend, scripts, sdk, common.", - "params": {} - }, - { - "type": "tool_call", - "toolCallId": "c0209f42-5bb0-47b7-aabf-0376e2e259dc", - "toolName": "spawn_agents", - "input": { - "agents": [ - { - "agent_type": "file-lister", - "prompt": "Find files handling tool type generation, regeneration, or publishing in SDK and common packages.", - "params": {} - } - ] - }, - "agentId": "D-UppjyUa0E", - "parentAgentId": "main-agent", - "includeToolCall": true - }, - { - "type": "subagent_start", - "agentId": "D-Up4CDP0Kk", - "agentType": "file-lister", - "displayName": "Liszt the File Lister", - "onlyChild": true, - "parentAgentId": "D-UppjyUa0E", - "prompt": "Find files handling tool type generation, regeneration, or publishing in SDK and common packages.", - "params": {} - }, - { - "type": "tool_call", - "toolCallId": "d0f2d613-2d62-4d19-9cf2-134e939daa49", - "toolName": "spawn_agents", - "input": { - "agents": [ - { - "agent_type": "file-lister", - "prompt": "Find files in sdk/src and common/src that define or use tool types, unions, or interfaces like ToolCall, ToolSchema, etc.", - "params": {} - } - ] - }, - "agentId": "D-UppvyfWNM", - "parentAgentId": "main-agent", - "includeToolCall": true - }, - { - "type": "subagent_start", - "agentId": "D-Up8asoMmA", - "agentType": "file-lister", - "displayName": "Liszt the File Lister", - "onlyChild": true, - "parentAgentId": "D-UppvyfWNM", - "prompt": "Find files in sdk/src and common/src that define or use tool types, unions, or interfaces like ToolCall, ToolSchema, etc.", - "params": {} - }, - { - "type": "tool_call", - "toolCallId": "3c8b3537-c0ca-4feb-92fb-714fe8de7935", - "toolName": "code_search", - "input": { - "pattern": "generate-tool-definitions|toolSchemas|publicTools|approvedTools|curatedTools|toolRegistry", - "flags": "-g *.ts -g *.json" - }, - "agentId": "D-UpptuOT3U", - "parentAgentId": "main-agent", - "includeToolCall": true - }, - { - "type": "tool_call", - "toolCallId": "f377e73e-59d4-43e7-bd23-bb310902374b", - "toolName": "list_directory", - "input": { - "path": "scripts" - }, - "agentId": "D-UppqGVX8E", - "parentAgentId": "main-agent", - "includeToolCall": true - }, - { - "type": "tool_call", - "toolCallId": "530c5d09-3fbf-4502-b4f0-ee6d625b110c", - "toolName": "read_subtree", - "input": { - "paths": [], - "maxTokens": 500000 - }, - "agentId": "D-Upzevpluo", - "parentAgentId": "D-Upph7O3-0", - "includeToolCall": true - }, - { - "type": "tool_result", - "toolCallId": "530c5d09-3fbf-4502-b4f0-ee6d625b110c", - "toolName": "read_subtree", - "output": [ - { - "type": "json", - "value": [ - { - "path": ".", - "type": "directory", - "printedTree": ".agents/\n examples/\n diff-reviewer-1.ts\n diff-reviewer-2.ts\n diff-reviewer-3.ts\n opensource/\n base.ts\n coder.ts\n file-picker.ts\n researcher.ts\n reviewer.ts\n thinker.ts\n ask.ts\n base-experimental.ts\n base-lite.ts\n base-max.ts\n base.ts\n brainstormer.ts\n changes-reviewer.ts\n charles.ts\n claude4-gemini-thinking.ts\n constants.ts\n file-explorer.ts\n file-picker.ts\n git-committer.ts\n knowledge-keeper.ts\n planner.ts\n researcher.ts\n reviewer.ts\n superagent.ts\n thinker.ts\n.bin/\n bun\n.github/\n workflows/\n ci.yml\n evals.yml\n nightly-evals.yml\n npm-app-release-build.yml\n npm-app-release-prod.yml\n npm-app-release-staging.yml\n .gitignore\n CODEOWNERS\n knowledge.md\n.vscode/\n settings.json\nbackend/\n src/\n __tests__/\n test-data/\n dex-go/\n edit-snippet.go\n expected.go\n original.go\n agent-id-resolution.test.ts\n agent-registry.test.ts\n auto-topup.test.ts\n credit-conversion.test.ts\n fast-rewrite.test.ts\n generate-diffs-prompt.test.ts\n get-custom-file-picker-config.test.ts\n live-user-inputs.test.ts\n loop-agent-steps.test.ts\n main-prompt.integration.test.ts\n main-prompt.test.ts\n process-file-block.test.ts\n process-str-replace.test.ts\n read-docs-tool.test.ts\n request-files-prompt.test.ts\n run-agent-step-tools.test.ts\n run-programmatic-step.test.ts\n sandbox-generator.test.ts\n subagent-streaming.test.ts\n test-utils.ts\n tool-call-schema.test.ts\n usage-calculation.test.ts\n web-search-tool.test.ts\n xml-stream-parser.test.ts\n admin/\n grade-runs.ts\n relabelRuns.ts\n api/\n org.ts\n usage.ts\n context/\n app-context.ts\n find-files/\n check-new-files-necessary.ts\n custom-file-picker-config.ts\n request-files-prompt.ts\n llm-apis/\n __tests__/\n linkup-api.test.ts\n vercel-ai-sdk/\n ai-sdk.ts\n openrouter.ts\n vertex-finetuned.ts\n claude.ts\n context7-api.ts\n gemini-with-fallbacks.ts\n knowledge.md\n linkup-api.ts\n message-cost-tracker.ts\n openai-api.ts\n openrouter.ts\n relace-api.ts\n system-prompt/\n agent-instructions.md\n prompts.ts\n save-agent-request.ts\n search-system-prompt.ts\n truncate-file-tree.ts\n templates/\n agents/\n archive/\n dry-run.ts\n agent-builder.ts\n ask.ts\n base.ts\n file-explorer.ts\n file-picker.ts\n planner.ts\n researcher.ts\n reviewer.ts\n superagent.ts\n thinker.ts\n thinking-base.ts\n agent-list.ts\n agent-registry.ts\n ask-prompts.ts\n base-prompts.ts\n prompts.ts\n README.md\n strings.ts\n types.ts\n tools/\n definitions/\n tool/\n add-message.ts\n add-subgoal.ts\n browser-logs.ts\n code-search.ts\n create-plan.ts\n end-turn.ts\n find-files.ts\n read-docs.ts\n read-files.ts\n run-file-change-hooks.ts\n run-terminal-command.ts\n set-messages.ts\n set-output.ts\n spawn-agent-inline.ts\n spawn-agents-async.ts\n spawn-agents.ts\n str-replace.ts\n think-deeply.ts\n update-subgoal.ts\n web-search.ts\n write-file.ts\n list.ts\n tool-def-type.ts\n handlers/\n tool/\n add-message.ts\n add-subgoal.ts\n browser-logs.ts\n code-search.ts\n create-plan.ts\n end-turn.ts\n find-files.ts\n read-docs.ts\n read-files.ts\n run-file-change-hooks.ts\n run-terminal-command.ts\n set-messages.ts\n set-output.ts\n spawn-agent-inline.ts\n spawn-agents-async.ts\n spawn-agents.ts\n str-replace.ts\n think-deeply.ts\n update-subgoal.ts\n web-search.ts\n write-file.ts\n handler-function-type.ts\n list.ts\n constants.ts\n prompts.ts\n stream-parser.ts\n tool-executor.ts\n util/\n __tests__/\n messages.test.ts\n object.test.ts\n parse-tool-call-xml.test.ts\n simplify-tool-results.test.ts\n split-data.test.ts\n check-auth.ts\n debug.ts\n file-resolver.ts\n logger.ts\n messages.ts\n object.ts\n parse-tool-call-xml.ts\n quickjs-sandbox.ts\n simplify-tool-results.ts\n split-data.ts\n token-counter.ts\n websockets/\n auth.ts\n middleware.ts\n request-context.ts\n server.ts\n switchboard.ts\n websocket-action.ts\n async-agent-manager.ts\n check-terminal-command.ts\n fast-rewrite.ts\n generate-diffs-prompt.ts\n get-documentation-for-query.ts\n get-file-reading-updates.ts\n index.ts\n live-user-inputs.ts\n loop-main-prompt.ts\n main-prompt.ts\n process-file-block.ts\n process-str-replace.ts\n prompt-agent-stream.ts\n run-agent-step.ts\n run-programmatic-step.ts\n xml-stream-parser.ts\n .gitignore\n knowledge.md\n package.json\n README.md\n tsconfig.json\ncommon/\n src/\n __tests__/\n agent-validation.test.ts\n dynamic-agent-template-schema.test.ts\n handlesteps-parsing.test.ts\n api-keys/\n constants.ts\n crypto.ts\n constants/\n agents.ts\n analytics-events.ts\n grant-priorities.ts\n db/\n migrations/\n meta/\n _journal.json\n 0000_snapshot.json\n 0001_snapshot.json\n 0002_snapshot.json\n 0003_snapshot.json\n 0004_snapshot.json\n 0005_snapshot.json\n 0006_snapshot.json\n 0007_snapshot.json\n 0008_snapshot.json\n 0009_snapshot.json\n 0010_snapshot.json\n 0011_snapshot.json\n 0012_snapshot.json\n 0013_snapshot.json\n 0014_snapshot.json\n 0015_snapshot.json\n 0016_snapshot.json\n 0017_snapshot.json\n 0018_snapshot.json\n 0019_snapshot.json\n 0020_snapshot.json\n 0021_snapshot.json\n 0026_snapshot.json\n 0027_snapshot.json\n 0028_snapshot.json\n 0000_overjoyed_thing.sql\n 0001_fuzzy_typhoid_mary.sql\n 0002_sticky_dormammu.sql\n 0003_military_owl.sql\n 0004_neat_pet_avengers.sql\n 0005_minor_the_professor.sql\n 0006_first_quasimodo.sql\n 0007_equal_warlock.sql\n 0008_puzzling_carnage.sql\n 0009_bitter_rumiko_fujikawa.sql\n 0010_overjoyed_red_skull.sql\n 0011_familiar_ezekiel_stane.sql\n 0012_fluffy_naoko.sql\n 0013_famous_risque.sql\n 0014_wakeful_sinister_six.sql\n 0015_stormy_zuras.sql\n 0016_clear_hairball.sql\n 0017_tricky_randall_flagg.sql\n 0018_stale_human_robot.sql\n 0019_amused_nebula.sql\n 0020_young_sleeper.sql\n 0021_tiny_marauders.sql\n 0026_chilly_mockingbird.sql\n 0027_sloppy_quasar.sql\n 0028_lush_johnny_blaze.sql\n docker-compose.yml\n drizzle.config.ts\n index.ts\n schema.knowledge.md\n schema.ts\n transaction.ts\n json-config/\n __tests__/\n __snapshots__/\n stringify-schema.test.ts.snap\n constants.test.ts\n stringify-schema.test.ts\n constants.ts\n default.ts\n stringify-schema.ts\n templates/\n agent-validation.ts\n dynamic-agent-functions.ts\n testing/\n mock-modules.ts\n tools/\n params/\n tool/\n add-message.ts\n add-subgoal.ts\n browser-logs.ts\n code-search.ts\n create-plan.ts\n end-turn.ts\n find-files.ts\n read-docs.ts\n read-files.ts\n run-file-change-hooks.ts\n run-terminal-command.ts\n set-messages.ts\n set-output.ts\n spawn-agent-inline.ts\n spawn-agents-async.ts\n spawn-agents.ts\n str-replace.ts\n think-deeply.ts\n update-subgoal.ts\n web-search.ts\n write-file.ts\n compile-tool-definitions.ts\n constants.ts\n list.ts\n utils.ts\n types/\n __tests__/\n dynamic-agent-template.test.ts\n api/\n agents/\n publish.ts\n agent-template.ts\n dynamic-agent-template.ts\n grant.ts\n message.ts\n organization.ts\n print-mode.ts\n publisher.ts\n referral.ts\n session-state.ts\n usage.ts\n util/\n __tests__/\n messages.test.ts\n partial-json-delta.test.ts\n saxy.test.ts\n string.test.ts\n examples/\n diff-reviewer-1.ts\n diff-reviewer-2.ts\n diff-reviewer-3.ts\n agent-file-utils.ts\n agent-name-normalization.ts\n agent-name-resolver.ts\n agent-template-validation.ts\n array.ts\n changes.ts\n credentials.ts\n currency.ts\n dates.ts\n error.ts\n file.ts\n git.ts\n logger.ts\n lru-cache.ts\n messages.ts\n min-heap.ts\n model-utils.ts\n object.ts\n partial-json-delta.ts\n patch.ts\n promise.ts\n random.ts\n referral.ts\n saxy.ts\n string.knowledge.md\n string.ts\n stripe.ts\n sync-failure.ts\n xml.ts\n zod-schema.ts\n websockets/\n websocket-client.ts\n websocket-schema.ts\n actions.ts\n analytics.ts\n browser-actions.ts\n constants.ts\n project-file-tree.ts\n knowledge.md\n package.json\n tsconfig.json\nevals/\n git-evals/\n email-eval-results.ts\n eval-codebuff.json\n eval-manifold.json\n eval-result-codebuff-mock.json\n gen-evals.ts\n judge-git-eval.ts\n post-eval-analysis.ts\n run-eval-set.ts\n run-git-evals.ts\n run-single-eval-process.ts\n run-single-eval.ts\n setup-test-repo.ts\n types.ts\n .gitignore\n bun.lock\n constants.ts\n e2e-cat-app-script.ts\n knowledge.md\n package.json\n scaffolding.ts\n swe-bench-eval.ts\n swe-bench-ids.ts\n swe-bench.test.ts\n test-repos.json\n test-setup.ts\n tsconfig.json\nnpm-app/\n release/\n index.js\n package.json\n README.md\n release-staging/\n index.js\n package.json\n README.md\n scripts/\n build-binary.js\n generate-github-token.ts\n patch-web-tree-sitter.ts\n release.js\n twitch-plays-codebuff.sh\n src/\n __tests__/\n display.test.ts\n tool-handlers.test.ts\n agents/\n agent-utils.ts\n load-agents.ts\n checkpoints/\n checkpoint-manager.ts\n file-manager.ts\n cli-handlers/\n agent-creation-chat.ts\n agents.ts\n api-key.ts\n checkpoint.ts\n diff.ts\n easter-egg.ts\n inititalization-flow.ts\n mini-chat.ts\n publish.ts\n subagent-list.ts\n subagent.ts\n display/\n overrides.ts\n print-mode.ts\n squash-newlines.ts\n json-config/\n hooks.ts\n parser.ts\n native/\n ripgrep.ts\n terminal/\n background.ts\n run-command.ts\n utils/\n __tests__/\n __snapshots__/\n background-process-manager.test.ts.snap\n frustration-detector.test.ts.snap\n rage-detector.test.ts.snap\n xml-stream-parser.test.ts.snap\n background-process-manager.test.ts\n rage-detector.test.ts\n response-example-4-files.txt\n tool-renderers.test.ts\n xml-stream-parser.test.ts\n agent-validation.ts\n analytics.ts\n detect-shell.ts\n git.ts\n logger.ts\n rage-detector.ts\n spinner.ts\n suppress-console.ts\n system-info.ts\n terminal.ts\n tool-renderers.ts\n with-hang-detection.ts\n xml-stream-parser.ts\n workers/\n checkpoint-worker.ts\n project-context.ts\n background-process-manager.ts\n browser-runner.ts\n chat-storage.ts\n cli-definitions.ts\n cli.ts\n client.ts\n config.ts\n create-template-project.ts\n credentials.ts\n dev-process-manager.ts\n diff-manager.ts\n fingerprint.ts\n index.ts\n menu.ts\n project-files.ts\n rage-detectors.ts\n startup-process-handler.ts\n subagent-storage.ts\n tool-handlers.ts\n types.ts\n web-scraper.ts\n .gitignore\n bunfig.toml\n package.json\n tsconfig.json\npackages/\n bigquery/\n src/\n client.ts\n index.ts\n schema.ts\n knowledge.md\n package.json\n tsconfig.json\n billing/\n src/\n __tests__/\n credit-delegation.test.ts\n extract-owner-repo.test.ts\n org-billing.test.ts\n auto-topup.ts\n balance-calculator.ts\n billing.knowledge.md\n conversion.ts\n credit-delegation.ts\n grant-credits.knowledge.md\n grant-credits.ts\n index.ts\n org-billing.ts\n org-monitoring.ts\n usage-service.ts\n utils.ts\n knowledge.md\n package.json\n project.json\n tsconfig.json\n build-tools/\n executors/\n infisical-run/\n executor.ts\n schema.json\n executors.json\n package.json\n project.json\n tsconfig.json\n code-map/\n __tests__/\n test-langs/\n test.c\n test.cpp\n test.cs\n test.go\n test.java\n test.js\n test.php\n test.py\n test.rb\n test.rs\n test.ts\n languages.test.ts\n parse.test.ts\n src/\n tree-sitter-queries/\n readme.md\n tree-sitter-c_sharp-tags.scm\n tree-sitter-c-tags.scm\n tree-sitter-cpp-tags.scm\n tree-sitter-go-tags.scm\n tree-sitter-java-tags.scm\n tree-sitter-javascript-tags.scm\n tree-sitter-php-tags.scm\n tree-sitter-python-tags.scm\n tree-sitter-ruby-tags.scm\n tree-sitter-rust-tags.scm\n tree-sitter-typescript-tags.scm\n index.ts\n languages.ts\n parse.ts\n package.json\n tsconfig.json\n internal/\n src/\n loops/\n client.ts\n index.ts\n types.ts\n openrouter-ai-sdk/\n internal/\n index.ts\n schemas/\n reasoning-details.ts\n types/\n index.ts\n openrouter-chat-completions-input.ts\n openrouter-chat-settings.ts\n .gitignore\n convert-to-openrouter-chat-messages.test.ts\n convert-to-openrouter-chat-messages.ts\n convert-to-openrouter-completion-prompt.ts\n index.ts\n map-openrouter-chat-logprobs.ts\n map-openrouter-completion-logprobs.ts\n map-openrouter-finish-reason.ts\n openrouter-chat-language-model.test.ts\n openrouter-chat-language-model.ts\n openrouter-completion-language-model.test.ts\n openrouter-completion-language-model.ts\n openrouter-completion-settings.ts\n openrouter-error.ts\n openrouter-facade.ts\n openrouter-provider-options.test.ts\n openrouter-provider.ts\n openrouter-stream-usage-accounting.test.ts\n openrouter-usage-accounting.test.ts\n utils/\n __tests__/\n version-utils.test.ts\n auth.ts\n version-utils.ts\n xml-parser.ts\n env.ts\n index.ts\n knowledge.md\n package.json\n tsconfig.json\npython-app/\n src/\n codebuff/\n __init__.py\n .gitignore\n knowledge.md\n LICENSE\n pyproject.toml\n README.md\nscripts/\n changelog/\n 2025-05-18-version-10283-release-enhanced-assistant-experience-system-stability.mdx\n 2025-05-25-version-10295-enhanced-ai-models-and-user-experience-improvements.mdx\n 2025-06-01-version-10305-release-enhanced-ai-models-new-commands-and-performance-improvements.mdx\n docs.json\n ft-file-selection/\n .gitignore\n collect-tuning-data.ts\n grade-traces.ts\n print-recent-relabels.ts\n print-recent-traces.ts\n README.md\n relabel-for-offline-scoring.ts\n relabel-traces-with-context.ts\n relabel-traces.ts\n .gitignore\n analyze-edit-blocks.ts\n analyze-model-usage.ts\n apply-credit-migration.ts\n calculate-average-spend.ts\n calculate-dau.ts\n calculate-monthly-usage.ts\n calculate-mrr.ts\n calculate-weekly-usage.ts\n cleanup-worktree.sh\n convert-escaped-newlines.ts\n count-edit-file.ts\n debug-log-subset.ts\n dev.sh\n export-user-emails.ts\n generate-ci-env.js\n generate-tool-definitions.ts\n get-changelog.ts\n init-worktree.ts\n package.json\n tsconfig.json\n update-stripe-subscriptions.ts\nsdk/\n scripts/\n publish.js\n src/\n tools/\n change-file.ts\n read-files.ts\n types/\n agent-definition.ts\n tools.ts\n client.ts\n constants.ts\n index.ts\n process-stream.ts\n websocket-client.ts\n .npmignore\n CHANGELOG.md\n package.json\n PUBLISHING.md\n README.md\n tsconfig.json\nweb/\n public/\n codebuff-intro1.webm\n scripts/\n discord/\n index.ts\n register-commands.ts\n src/\n __tests__/\n e2e/\n home.spec.ts\n unit/\n home.spec.tsx\n actions/\n hello-action.ts\n app/\n [sponsee]/\n page.tsx\n admin/\n file-picker/\n page.tsx\n orgs/\n page.tsx\n traces/\n components/\n chat-message.tsx\n client-session-viewer.tsx\n empty-state.tsx\n error-boundary.tsx\n loading-skeletons.tsx\n timeline-chart.module.css\n timeline-chart.tsx\n trace-viewer.tsx\n utils/\n __tests__/\n trace-processing.test.ts\n trace-processing.ts\n page.tsx\n layout.tsx\n affiliates/\n actions.ts\n page.tsx\n agents/\n page.tsx\n api/\n admin/\n orgs/\n [orgId]/\n features/\n [feature]/\n route.ts\n export/\n route.ts\n route.ts\n relabel-for-user/\n route.ts\n traces/\n [clientRequestId]/\n messages/\n route.ts\n timeline/\n route.ts\n client/\n [clientId]/\n sessions/\n route.ts\n admin-auth.ts\n agents/\n [publisherId]/\n [agentId]/\n [version]/\n route.ts\n latest/\n route.ts\n publish/\n route.ts\n validate/\n route.ts\n route.ts\n api-keys/\n route.ts\n auth/\n [...nextauth]/\n auth-options.ts\n route.ts\n cli/\n code/\n route.ts\n logout/\n route.ts\n status/\n route.ts\n feed/\n route.ts\n git-evals/\n visibility/\n route.ts\n route.ts\n healthz/\n route.ts\n invites/\n [token]/\n route.ts\n orgs/\n [orgId]/\n alerts/\n [alertId]/\n dismiss/\n route.ts\n route.ts\n analytics/\n export/\n route.ts\n route.ts\n billing/\n setup/\n route.ts\n status/\n route.ts\n subscription/\n route.ts\n credits/\n route.ts\n invitations/\n [email]/\n resend/\n route.ts\n route.ts\n bulk/\n route.ts\n route.ts\n members/\n [userId]/\n route.ts\n route.ts\n monitoring/\n route.ts\n publishers/\n route.ts\n repos/\n [repoId]/\n route.ts\n route.ts\n settings/\n route.ts\n usage/\n export/\n route.ts\n route.ts\n route.ts\n slug/\n [slug]/\n route.ts\n route.ts\n publishers/\n [id]/\n organization/\n route.ts\n validate/\n route.ts\n route.ts\n referrals/\n [code]/\n route.ts\n helpers.ts\n route.ts\n stripe/\n buy-credits/\n route.ts\n webhook/\n route.ts\n upload/\n avatar/\n route.ts\n user/\n auto-topup/\n route.ts\n profile/\n route.ts\n usage/\n route.ts\n config/\n page.tsx\n docs/\n [category]/\n layout.tsx\n metadata.ts\n page.tsx\n layout.tsx\n page.tsx\n evals/\n evals-table.tsx\n page.tsx\n invites/\n [token]/\n page.tsx\n login/\n page.tsx\n onboard/\n page.tsx\n orgs/\n [slug]/\n analytics/\n page.tsx\n billing/\n purchase/\n page.tsx\n setup/\n page.tsx\n repositories/\n page.tsx\n settings/\n page.tsx\n team/\n page.tsx\n usage/\n page.tsx\n page.tsx\n new/\n page.tsx\n page.tsx\n payment-success/\n page.tsx\n pricing/\n page.tsx\n privacy-policy/\n page.tsx\n publishers/\n [id]/\n agents/\n [agentId]/\n [version]/\n page.tsx\n page.tsx\n new/\n page.tsx\n page.tsx\n referrals/\n [code]/\n metadata.ts\n page.tsx\n layout.tsx\n page.tsx\n terms-of-service/\n page.tsx\n usage/\n layout.tsx\n page.tsx\n usage-display.tsx\n analytics.knowledge.md\n layout.tsx\n page.tsx\n robots.ts\n sitemap.ts\n components/\n agent/\n json-viewer.tsx\n auto-topup/\n AutoTopupSettings.tsx\n AutoTopupSettingsForm.tsx\n AutoTopupSwitch.tsx\n BaseAutoTopupSettings.tsx\n BaseAutoTopupSettingsForm.tsx\n BaseAutoTopupSwitch.tsx\n constants.ts\n OrgAutoTopupSettings.tsx\n OrgAutoTopupSettingsForm.tsx\n OrgAutoTopupSwitch.tsx\n types.ts\n credits/\n CreditManagementSection.tsx\n CreditPurchaseSection.tsx\n docs/\n mdx/\n code-demo.tsx\n custom-link.tsx\n markdown-table.tsx\n mdx-components.tsx\n mermaid-diagram.tsx\n schema-display.tsx\n copy-heading.tsx\n doc-sidebar.tsx\n docs.knowledge.md\n toc.tsx\n login/\n login-card.tsx\n login-client-wrapper.tsx\n navbar/\n navbar.tsx\n user-dropdown.tsx\n organization/\n advanced-monitor.tsx\n billing-alerts.tsx\n billing-reports.tsx\n billing-status.tsx\n credit-monitor.tsx\n model-config-sheet.tsx\n organization-success-modal.tsx\n repository-management.tsx\n team-management.tsx\n providers/\n query-client-provider.tsx\n publisher/\n basic-info-step.tsx\n ownership-step.tsx\n profile-details-step.tsx\n step-template.tsx\n sign-in/\n sign-in-button.tsx\n sign-in-card-footer.tsx\n ui/\n landing/\n competition/\n claude-code.tsx\n cline.tsx\n cursor.tsx\n github-copilot.tsx\n index.tsx\n tabs.tsx\n feature/\n browser-comparison.tsx\n chart-illustration.tsx\n code-illustration.tsx\n highlight-text.tsx\n index.tsx\n workflow-illustration.tsx\n animated-element.tsx\n constants.ts\n cta-section.tsx\n demo-code-display.tsx\n testimonials-section.tsx\n types.ts\n terminal/\n index.tsx\n style.css\n terminal-input.tsx\n terminal-output.tsx\n avatar-upload.tsx\n background-beams.tsx\n badge.tsx\n banner.tsx\n button.tsx\n card.tsx\n collapsible.tsx\n credit-confetti.tsx\n decorative-blocks.tsx\n dialog.tsx\n dropdown-menu.tsx\n enhanced-copy-button.tsx\n footer.tsx\n hero-buttons.tsx\n hero.tsx\n input.tsx\n install-dialog.tsx\n label.tsx\n neon-gradient-button.tsx\n progress.tsx\n radio-group.tsx\n section.tsx\n select.tsx\n separator.tsx\n sheet.tsx\n sidebar.tsx\n skeleton-loading.tsx\n skeleton.tsx\n slider.tsx\n switch.tsx\n table.tsx\n tabs.tsx\n textarea.tsx\n toast.tsx\n toaster.tsx\n tooltip.tsx\n use-toast.ts\n BrowserPreview.tsx\n card-with-beams.tsx\n CookieConsentCard.tsx\n footer.tsx\n icons.tsx\n IDEDemo.tsx\n layout-wrapper.tsx\n TerminalDemo.tsx\n theme-provider.tsx\n theme-switcher.tsx\n content/\n advanced/\n claude-code-comparison.mdx\n config.mdx\n how-does-it-work.mdx\n large-projects.mdx\n troubleshooting.mdx\n what-models.mdx\n agents/\n agent-reference.mdx\n creating-new-agents.mdx\n customizing-agents.mdx\n overview.mdx\n troubleshooting-agent-customization.mdx\n case-studies/\n _cta.mdx\n benjamin-bryant.mdx\n oliver-lukesch.mdx\n help/\n faq.mdx\n getting-started.mdx\n tips/\n best-practices.mdx\n keyboard-shortcuts.mdx\n knowledge-files.mdx\n other-use-cases.mdx\n version-control.mdx\n where-codebuff-shines.mdx\n discord/\n client.ts\n rate-limiter.ts\n hooks/\n use-auto-topup.ts\n use-install-dialog.ts\n use-mobile.tsx\n use-model-config.ts\n use-org-auto-topup.ts\n use-organization-data.ts\n use-user-profile.ts\n lib/\n server/\n referral.ts\n validators/\n publisher.ts\n admin-auth.ts\n constant.ts\n currency.ts\n docs.ts\n fonts.ts\n organization-permissions.ts\n PostHogProvider.tsx\n publisher-permissions.ts\n remark-code-to-codedemo.ts\n server-init.ts\n SessionProvider.tsx\n stripe-utils.ts\n testimonials.ts\n trackConversions.ts\n utils.ts\n styles/\n globals.css\n types/\n docs.ts\n user.ts\n util/\n logger.ts\n .eslintignore\n .eslintrc.js\n .gitignore\n .prettierignore\n .prettierrc.js\n commitlint.config.js\n components.json\n contentlayer.config.ts\n jest.config.js\n jest.setup.js\n knowledge.md\n next.config.mjs\n package.json\n playwright.config.ts\n postcss.config.cjs\n README.md\n tailwind.config.ts\n tsconfig.json\n.envrc\n.gitignore\n.infisical.json\n.prettierrc\nauthentication.knowledge.md\nbun.lock\nbunfig.toml\ncodebuff.json\neslint.config.js\nknowledge.md\npackage.json\nREADME.md\ntsconfig.base.json\ntsconfig.json\nWINDOWS.md\n", - "tokenCount": 9007, - "truncationLevel": "none" - } - ] - } - ], - "parentAgentId": "D-Upzevpluo" - }, - { - "type": "tool_call", - "toolCallId": "92e701b3-1b98-4990-bc85-a71728711ba6", - "toolName": "read_subtree", - "input": { - "paths": [], - "maxTokens": 500000 - }, - "agentId": "D-Up4CDP0Kk", - "parentAgentId": "D-UppjyUa0E", - "includeToolCall": true - }, - { - "type": "tool_result", - "toolCallId": "92e701b3-1b98-4990-bc85-a71728711ba6", - "toolName": "read_subtree", - "output": [ - { - "type": "json", - "value": [ - { - "path": ".", - "type": "directory", - "printedTree": ".agents/\n examples/\n diff-reviewer-1.ts\n diff-reviewer-2.ts\n diff-reviewer-3.ts\n opensource/\n base.ts\n coder.ts\n file-picker.ts\n researcher.ts\n reviewer.ts\n thinker.ts\n ask.ts\n base-experimental.ts\n base-lite.ts\n base-max.ts\n base.ts\n brainstormer.ts\n changes-reviewer.ts\n charles.ts\n claude4-gemini-thinking.ts\n constants.ts\n file-explorer.ts\n file-picker.ts\n git-committer.ts\n knowledge-keeper.ts\n planner.ts\n researcher.ts\n reviewer.ts\n superagent.ts\n thinker.ts\n.bin/\n bun\n.github/\n workflows/\n ci.yml\n evals.yml\n nightly-evals.yml\n npm-app-release-build.yml\n npm-app-release-prod.yml\n npm-app-release-staging.yml\n .gitignore\n CODEOWNERS\n knowledge.md\n.vscode/\n settings.json\nbackend/\n src/\n __tests__/\n test-data/\n dex-go/\n edit-snippet.go\n expected.go\n original.go\n agent-id-resolution.test.ts\n agent-registry.test.ts\n auto-topup.test.ts\n credit-conversion.test.ts\n fast-rewrite.test.ts\n generate-diffs-prompt.test.ts\n get-custom-file-picker-config.test.ts\n live-user-inputs.test.ts\n loop-agent-steps.test.ts\n main-prompt.integration.test.ts\n main-prompt.test.ts\n process-file-block.test.ts\n process-str-replace.test.ts\n read-docs-tool.test.ts\n request-files-prompt.test.ts\n run-agent-step-tools.test.ts\n run-programmatic-step.test.ts\n sandbox-generator.test.ts\n subagent-streaming.test.ts\n test-utils.ts\n tool-call-schema.test.ts\n usage-calculation.test.ts\n web-search-tool.test.ts\n xml-stream-parser.test.ts\n admin/\n grade-runs.ts\n relabelRuns.ts\n api/\n org.ts\n usage.ts\n context/\n app-context.ts\n find-files/\n check-new-files-necessary.ts\n custom-file-picker-config.ts\n request-files-prompt.ts\n llm-apis/\n __tests__/\n linkup-api.test.ts\n vercel-ai-sdk/\n ai-sdk.ts\n openrouter.ts\n vertex-finetuned.ts\n claude.ts\n context7-api.ts\n gemini-with-fallbacks.ts\n knowledge.md\n linkup-api.ts\n message-cost-tracker.ts\n openai-api.ts\n openrouter.ts\n relace-api.ts\n system-prompt/\n agent-instructions.md\n prompts.ts\n save-agent-request.ts\n search-system-prompt.ts\n truncate-file-tree.ts\n templates/\n agents/\n archive/\n dry-run.ts\n agent-builder.ts\n ask.ts\n base.ts\n file-explorer.ts\n file-picker.ts\n planner.ts\n researcher.ts\n reviewer.ts\n superagent.ts\n thinker.ts\n thinking-base.ts\n agent-list.ts\n agent-registry.ts\n ask-prompts.ts\n base-prompts.ts\n prompts.ts\n README.md\n strings.ts\n types.ts\n tools/\n definitions/\n tool/\n add-message.ts\n add-subgoal.ts\n browser-logs.ts\n code-search.ts\n create-plan.ts\n end-turn.ts\n find-files.ts\n read-docs.ts\n read-files.ts\n run-file-change-hooks.ts\n run-terminal-command.ts\n set-messages.ts\n set-output.ts\n spawn-agent-inline.ts\n spawn-agents-async.ts\n spawn-agents.ts\n str-replace.ts\n think-deeply.ts\n update-subgoal.ts\n web-search.ts\n write-file.ts\n list.ts\n tool-def-type.ts\n handlers/\n tool/\n add-message.ts\n add-subgoal.ts\n browser-logs.ts\n code-search.ts\n create-plan.ts\n end-turn.ts\n find-files.ts\n read-docs.ts\n read-files.ts\n run-file-change-hooks.ts\n run-terminal-command.ts\n set-messages.ts\n set-output.ts\n spawn-agent-inline.ts\n spawn-agents-async.ts\n spawn-agents.ts\n str-replace.ts\n think-deeply.ts\n update-subgoal.ts\n web-search.ts\n write-file.ts\n handler-function-type.ts\n list.ts\n constants.ts\n prompts.ts\n stream-parser.ts\n tool-executor.ts\n util/\n __tests__/\n messages.test.ts\n object.test.ts\n parse-tool-call-xml.test.ts\n simplify-tool-results.test.ts\n split-data.test.ts\n check-auth.ts\n debug.ts\n file-resolver.ts\n logger.ts\n messages.ts\n object.ts\n parse-tool-call-xml.ts\n quickjs-sandbox.ts\n simplify-tool-results.ts\n split-data.ts\n token-counter.ts\n websockets/\n auth.ts\n middleware.ts\n request-context.ts\n server.ts\n switchboard.ts\n websocket-action.ts\n async-agent-manager.ts\n check-terminal-command.ts\n fast-rewrite.ts\n generate-diffs-prompt.ts\n get-documentation-for-query.ts\n get-file-reading-updates.ts\n index.ts\n live-user-inputs.ts\n loop-main-prompt.ts\n main-prompt.ts\n process-file-block.ts\n process-str-replace.ts\n prompt-agent-stream.ts\n run-agent-step.ts\n run-programmatic-step.ts\n xml-stream-parser.ts\n .gitignore\n knowledge.md\n package.json\n README.md\n tsconfig.json\ncommon/\n src/\n __tests__/\n agent-validation.test.ts\n dynamic-agent-template-schema.test.ts\n handlesteps-parsing.test.ts\n api-keys/\n constants.ts\n crypto.ts\n constants/\n agents.ts\n analytics-events.ts\n grant-priorities.ts\n db/\n migrations/\n meta/\n _journal.json\n 0000_snapshot.json\n 0001_snapshot.json\n 0002_snapshot.json\n 0003_snapshot.json\n 0004_snapshot.json\n 0005_snapshot.json\n 0006_snapshot.json\n 0007_snapshot.json\n 0008_snapshot.json\n 0009_snapshot.json\n 0010_snapshot.json\n 0011_snapshot.json\n 0012_snapshot.json\n 0013_snapshot.json\n 0014_snapshot.json\n 0015_snapshot.json\n 0016_snapshot.json\n 0017_snapshot.json\n 0018_snapshot.json\n 0019_snapshot.json\n 0020_snapshot.json\n 0021_snapshot.json\n 0026_snapshot.json\n 0027_snapshot.json\n 0028_snapshot.json\n 0000_overjoyed_thing.sql\n 0001_fuzzy_typhoid_mary.sql\n 0002_sticky_dormammu.sql\n 0003_military_owl.sql\n 0004_neat_pet_avengers.sql\n 0005_minor_the_professor.sql\n 0006_first_quasimodo.sql\n 0007_equal_warlock.sql\n 0008_puzzling_carnage.sql\n 0009_bitter_rumiko_fujikawa.sql\n 0010_overjoyed_red_skull.sql\n 0011_familiar_ezekiel_stane.sql\n 0012_fluffy_naoko.sql\n 0013_famous_risque.sql\n 0014_wakeful_sinister_six.sql\n 0015_stormy_zuras.sql\n 0016_clear_hairball.sql\n 0017_tricky_randall_flagg.sql\n 0018_stale_human_robot.sql\n 0019_amused_nebula.sql\n 0020_young_sleeper.sql\n 0021_tiny_marauders.sql\n 0026_chilly_mockingbird.sql\n 0027_sloppy_quasar.sql\n 0028_lush_johnny_blaze.sql\n docker-compose.yml\n drizzle.config.ts\n index.ts\n schema.knowledge.md\n schema.ts\n transaction.ts\n json-config/\n __tests__/\n __snapshots__/\n stringify-schema.test.ts.snap\n constants.test.ts\n stringify-schema.test.ts\n constants.ts\n default.ts\n stringify-schema.ts\n templates/\n agent-validation.ts\n dynamic-agent-functions.ts\n testing/\n mock-modules.ts\n tools/\n params/\n tool/\n add-message.ts\n add-subgoal.ts\n browser-logs.ts\n code-search.ts\n create-plan.ts\n end-turn.ts\n find-files.ts\n read-docs.ts\n read-files.ts\n run-file-change-hooks.ts\n run-terminal-command.ts\n set-messages.ts\n set-output.ts\n spawn-agent-inline.ts\n spawn-agents-async.ts\n spawn-agents.ts\n str-replace.ts\n think-deeply.ts\n update-subgoal.ts\n web-search.ts\n write-file.ts\n compile-tool-definitions.ts\n constants.ts\n list.ts\n utils.ts\n types/\n __tests__/\n dynamic-agent-template.test.ts\n api/\n agents/\n publish.ts\n agent-template.ts\n dynamic-agent-template.ts\n grant.ts\n message.ts\n organization.ts\n print-mode.ts\n publisher.ts\n referral.ts\n session-state.ts\n usage.ts\n util/\n __tests__/\n messages.test.ts\n partial-json-delta.test.ts\n saxy.test.ts\n string.test.ts\n examples/\n diff-reviewer-1.ts\n diff-reviewer-2.ts\n diff-reviewer-3.ts\n agent-file-utils.ts\n agent-name-normalization.ts\n agent-name-resolver.ts\n agent-template-validation.ts\n array.ts\n changes.ts\n credentials.ts\n currency.ts\n dates.ts\n error.ts\n file.ts\n git.ts\n logger.ts\n lru-cache.ts\n messages.ts\n min-heap.ts\n model-utils.ts\n object.ts\n partial-json-delta.ts\n patch.ts\n promise.ts\n random.ts\n referral.ts\n saxy.ts\n string.knowledge.md\n string.ts\n stripe.ts\n sync-failure.ts\n xml.ts\n zod-schema.ts\n websockets/\n websocket-client.ts\n websocket-schema.ts\n actions.ts\n analytics.ts\n browser-actions.ts\n constants.ts\n project-file-tree.ts\n knowledge.md\n package.json\n tsconfig.json\nevals/\n git-evals/\n email-eval-results.ts\n eval-codebuff.json\n eval-manifold.json\n eval-result-codebuff-mock.json\n gen-evals.ts\n judge-git-eval.ts\n post-eval-analysis.ts\n run-eval-set.ts\n run-git-evals.ts\n run-single-eval-process.ts\n run-single-eval.ts\n setup-test-repo.ts\n types.ts\n .gitignore\n bun.lock\n constants.ts\n e2e-cat-app-script.ts\n knowledge.md\n package.json\n scaffolding.ts\n swe-bench-eval.ts\n swe-bench-ids.ts\n swe-bench.test.ts\n test-repos.json\n test-setup.ts\n tsconfig.json\nnpm-app/\n release/\n index.js\n package.json\n README.md\n release-staging/\n index.js\n package.json\n README.md\n scripts/\n build-binary.js\n generate-github-token.ts\n patch-web-tree-sitter.ts\n release.js\n twitch-plays-codebuff.sh\n src/\n __tests__/\n display.test.ts\n tool-handlers.test.ts\n agents/\n agent-utils.ts\n load-agents.ts\n checkpoints/\n checkpoint-manager.ts\n file-manager.ts\n cli-handlers/\n agent-creation-chat.ts\n agents.ts\n api-key.ts\n checkpoint.ts\n diff.ts\n easter-egg.ts\n inititalization-flow.ts\n mini-chat.ts\n publish.ts\n subagent-list.ts\n subagent.ts\n display/\n overrides.ts\n print-mode.ts\n squash-newlines.ts\n json-config/\n hooks.ts\n parser.ts\n native/\n ripgrep.ts\n terminal/\n background.ts\n run-command.ts\n utils/\n __tests__/\n __snapshots__/\n background-process-manager.test.ts.snap\n frustration-detector.test.ts.snap\n rage-detector.test.ts.snap\n xml-stream-parser.test.ts.snap\n background-process-manager.test.ts\n rage-detector.test.ts\n response-example-4-files.txt\n tool-renderers.test.ts\n xml-stream-parser.test.ts\n agent-validation.ts\n analytics.ts\n detect-shell.ts\n git.ts\n logger.ts\n rage-detector.ts\n spinner.ts\n suppress-console.ts\n system-info.ts\n terminal.ts\n tool-renderers.ts\n with-hang-detection.ts\n xml-stream-parser.ts\n workers/\n checkpoint-worker.ts\n project-context.ts\n background-process-manager.ts\n browser-runner.ts\n chat-storage.ts\n cli-definitions.ts\n cli.ts\n client.ts\n config.ts\n create-template-project.ts\n credentials.ts\n dev-process-manager.ts\n diff-manager.ts\n fingerprint.ts\n index.ts\n menu.ts\n project-files.ts\n rage-detectors.ts\n startup-process-handler.ts\n subagent-storage.ts\n tool-handlers.ts\n types.ts\n web-scraper.ts\n .gitignore\n bunfig.toml\n package.json\n tsconfig.json\npackages/\n bigquery/\n src/\n client.ts\n index.ts\n schema.ts\n knowledge.md\n package.json\n tsconfig.json\n billing/\n src/\n __tests__/\n credit-delegation.test.ts\n extract-owner-repo.test.ts\n org-billing.test.ts\n auto-topup.ts\n balance-calculator.ts\n billing.knowledge.md\n conversion.ts\n credit-delegation.ts\n grant-credits.knowledge.md\n grant-credits.ts\n index.ts\n org-billing.ts\n org-monitoring.ts\n usage-service.ts\n utils.ts\n knowledge.md\n package.json\n project.json\n tsconfig.json\n build-tools/\n executors/\n infisical-run/\n executor.ts\n schema.json\n executors.json\n package.json\n project.json\n tsconfig.json\n code-map/\n __tests__/\n test-langs/\n test.c\n test.cpp\n test.cs\n test.go\n test.java\n test.js\n test.php\n test.py\n test.rb\n test.rs\n test.ts\n languages.test.ts\n parse.test.ts\n src/\n tree-sitter-queries/\n readme.md\n tree-sitter-c_sharp-tags.scm\n tree-sitter-c-tags.scm\n tree-sitter-cpp-tags.scm\n tree-sitter-go-tags.scm\n tree-sitter-java-tags.scm\n tree-sitter-javascript-tags.scm\n tree-sitter-php-tags.scm\n tree-sitter-python-tags.scm\n tree-sitter-ruby-tags.scm\n tree-sitter-rust-tags.scm\n tree-sitter-typescript-tags.scm\n index.ts\n languages.ts\n parse.ts\n package.json\n tsconfig.json\n internal/\n src/\n loops/\n client.ts\n index.ts\n types.ts\n openrouter-ai-sdk/\n internal/\n index.ts\n schemas/\n reasoning-details.ts\n types/\n index.ts\n openrouter-chat-completions-input.ts\n openrouter-chat-settings.ts\n .gitignore\n convert-to-openrouter-chat-messages.test.ts\n convert-to-openrouter-chat-messages.ts\n convert-to-openrouter-completion-prompt.ts\n index.ts\n map-openrouter-chat-logprobs.ts\n map-openrouter-completion-logprobs.ts\n map-openrouter-finish-reason.ts\n openrouter-chat-language-model.test.ts\n openrouter-chat-language-model.ts\n openrouter-completion-language-model.test.ts\n openrouter-completion-language-model.ts\n openrouter-completion-settings.ts\n openrouter-error.ts\n openrouter-facade.ts\n openrouter-provider-options.test.ts\n openrouter-provider.ts\n openrouter-stream-usage-accounting.test.ts\n openrouter-usage-accounting.test.ts\n utils/\n __tests__/\n version-utils.test.ts\n auth.ts\n version-utils.ts\n xml-parser.ts\n env.ts\n index.ts\n knowledge.md\n package.json\n tsconfig.json\npython-app/\n src/\n codebuff/\n __init__.py\n .gitignore\n knowledge.md\n LICENSE\n pyproject.toml\n README.md\nscripts/\n changelog/\n 2025-05-18-version-10283-release-enhanced-assistant-experience-system-stability.mdx\n 2025-05-25-version-10295-enhanced-ai-models-and-user-experience-improvements.mdx\n 2025-06-01-version-10305-release-enhanced-ai-models-new-commands-and-performance-improvements.mdx\n docs.json\n ft-file-selection/\n .gitignore\n collect-tuning-data.ts\n grade-traces.ts\n print-recent-relabels.ts\n print-recent-traces.ts\n README.md\n relabel-for-offline-scoring.ts\n relabel-traces-with-context.ts\n relabel-traces.ts\n .gitignore\n analyze-edit-blocks.ts\n analyze-model-usage.ts\n apply-credit-migration.ts\n calculate-average-spend.ts\n calculate-dau.ts\n calculate-monthly-usage.ts\n calculate-mrr.ts\n calculate-weekly-usage.ts\n cleanup-worktree.sh\n convert-escaped-newlines.ts\n count-edit-file.ts\n debug-log-subset.ts\n dev.sh\n export-user-emails.ts\n generate-ci-env.js\n generate-tool-definitions.ts\n get-changelog.ts\n init-worktree.ts\n package.json\n tsconfig.json\n update-stripe-subscriptions.ts\nsdk/\n scripts/\n publish.js\n src/\n tools/\n change-file.ts\n read-files.ts\n types/\n agent-definition.ts\n tools.ts\n client.ts\n constants.ts\n index.ts\n process-stream.ts\n websocket-client.ts\n .npmignore\n CHANGELOG.md\n package.json\n PUBLISHING.md\n README.md\n tsconfig.json\nweb/\n public/\n codebuff-intro1.webm\n scripts/\n discord/\n index.ts\n register-commands.ts\n src/\n __tests__/\n e2e/\n home.spec.ts\n unit/\n home.spec.tsx\n actions/\n hello-action.ts\n app/\n [sponsee]/\n page.tsx\n admin/\n file-picker/\n page.tsx\n orgs/\n page.tsx\n traces/\n components/\n chat-message.tsx\n client-session-viewer.tsx\n empty-state.tsx\n error-boundary.tsx\n loading-skeletons.tsx\n timeline-chart.module.css\n timeline-chart.tsx\n trace-viewer.tsx\n utils/\n __tests__/\n trace-processing.test.ts\n trace-processing.ts\n page.tsx\n layout.tsx\n affiliates/\n actions.ts\n page.tsx\n agents/\n page.tsx\n api/\n admin/\n orgs/\n [orgId]/\n features/\n [feature]/\n route.ts\n export/\n route.ts\n route.ts\n relabel-for-user/\n route.ts\n traces/\n [clientRequestId]/\n messages/\n route.ts\n timeline/\n route.ts\n client/\n [clientId]/\n sessions/\n route.ts\n admin-auth.ts\n agents/\n [publisherId]/\n [agentId]/\n [version]/\n route.ts\n latest/\n route.ts\n publish/\n route.ts\n validate/\n route.ts\n route.ts\n api-keys/\n route.ts\n auth/\n [...nextauth]/\n auth-options.ts\n route.ts\n cli/\n code/\n route.ts\n logout/\n route.ts\n status/\n route.ts\n feed/\n route.ts\n git-evals/\n visibility/\n route.ts\n route.ts\n healthz/\n route.ts\n invites/\n [token]/\n route.ts\n orgs/\n [orgId]/\n alerts/\n [alertId]/\n dismiss/\n route.ts\n route.ts\n analytics/\n export/\n route.ts\n route.ts\n billing/\n setup/\n route.ts\n status/\n route.ts\n subscription/\n route.ts\n credits/\n route.ts\n invitations/\n [email]/\n resend/\n route.ts\n route.ts\n bulk/\n route.ts\n route.ts\n members/\n [userId]/\n route.ts\n route.ts\n monitoring/\n route.ts\n publishers/\n route.ts\n repos/\n [repoId]/\n route.ts\n route.ts\n settings/\n route.ts\n usage/\n export/\n route.ts\n route.ts\n route.ts\n slug/\n [slug]/\n route.ts\n route.ts\n publishers/\n [id]/\n organization/\n route.ts\n validate/\n route.ts\n route.ts\n referrals/\n [code]/\n route.ts\n helpers.ts\n route.ts\n stripe/\n buy-credits/\n route.ts\n webhook/\n route.ts\n upload/\n avatar/\n route.ts\n user/\n auto-topup/\n route.ts\n profile/\n route.ts\n usage/\n route.ts\n config/\n page.tsx\n docs/\n [category]/\n layout.tsx\n metadata.ts\n page.tsx\n layout.tsx\n page.tsx\n evals/\n evals-table.tsx\n page.tsx\n invites/\n [token]/\n page.tsx\n login/\n page.tsx\n onboard/\n page.tsx\n orgs/\n [slug]/\n analytics/\n page.tsx\n billing/\n purchase/\n page.tsx\n setup/\n page.tsx\n repositories/\n page.tsx\n settings/\n page.tsx\n team/\n page.tsx\n usage/\n page.tsx\n page.tsx\n new/\n page.tsx\n page.tsx\n payment-success/\n page.tsx\n pricing/\n page.tsx\n privacy-policy/\n page.tsx\n publishers/\n [id]/\n agents/\n [agentId]/\n [version]/\n page.tsx\n page.tsx\n new/\n page.tsx\n page.tsx\n referrals/\n [code]/\n metadata.ts\n page.tsx\n layout.tsx\n page.tsx\n terms-of-service/\n page.tsx\n usage/\n layout.tsx\n page.tsx\n usage-display.tsx\n analytics.knowledge.md\n layout.tsx\n page.tsx\n robots.ts\n sitemap.ts\n components/\n agent/\n json-viewer.tsx\n auto-topup/\n AutoTopupSettings.tsx\n AutoTopupSettingsForm.tsx\n AutoTopupSwitch.tsx\n BaseAutoTopupSettings.tsx\n BaseAutoTopupSettingsForm.tsx\n BaseAutoTopupSwitch.tsx\n constants.ts\n OrgAutoTopupSettings.tsx\n OrgAutoTopupSettingsForm.tsx\n OrgAutoTopupSwitch.tsx\n types.ts\n credits/\n CreditManagementSection.tsx\n CreditPurchaseSection.tsx\n docs/\n mdx/\n code-demo.tsx\n custom-link.tsx\n markdown-table.tsx\n mdx-components.tsx\n mermaid-diagram.tsx\n schema-display.tsx\n copy-heading.tsx\n doc-sidebar.tsx\n docs.knowledge.md\n toc.tsx\n login/\n login-card.tsx\n login-client-wrapper.tsx\n navbar/\n navbar.tsx\n user-dropdown.tsx\n organization/\n advanced-monitor.tsx\n billing-alerts.tsx\n billing-reports.tsx\n billing-status.tsx\n credit-monitor.tsx\n model-config-sheet.tsx\n organization-success-modal.tsx\n repository-management.tsx\n team-management.tsx\n providers/\n query-client-provider.tsx\n publisher/\n basic-info-step.tsx\n ownership-step.tsx\n profile-details-step.tsx\n step-template.tsx\n sign-in/\n sign-in-button.tsx\n sign-in-card-footer.tsx\n ui/\n landing/\n competition/\n claude-code.tsx\n cline.tsx\n cursor.tsx\n github-copilot.tsx\n index.tsx\n tabs.tsx\n feature/\n browser-comparison.tsx\n chart-illustration.tsx\n code-illustration.tsx\n highlight-text.tsx\n index.tsx\n workflow-illustration.tsx\n animated-element.tsx\n constants.ts\n cta-section.tsx\n demo-code-display.tsx\n testimonials-section.tsx\n types.ts\n terminal/\n index.tsx\n style.css\n terminal-input.tsx\n terminal-output.tsx\n avatar-upload.tsx\n background-beams.tsx\n badge.tsx\n banner.tsx\n button.tsx\n card.tsx\n collapsible.tsx\n credit-confetti.tsx\n decorative-blocks.tsx\n dialog.tsx\n dropdown-menu.tsx\n enhanced-copy-button.tsx\n footer.tsx\n hero-buttons.tsx\n hero.tsx\n input.tsx\n install-dialog.tsx\n label.tsx\n neon-gradient-button.tsx\n progress.tsx\n radio-group.tsx\n section.tsx\n select.tsx\n separator.tsx\n sheet.tsx\n sidebar.tsx\n skeleton-loading.tsx\n skeleton.tsx\n slider.tsx\n switch.tsx\n table.tsx\n tabs.tsx\n textarea.tsx\n toast.tsx\n toaster.tsx\n tooltip.tsx\n use-toast.ts\n BrowserPreview.tsx\n card-with-beams.tsx\n CookieConsentCard.tsx\n footer.tsx\n icons.tsx\n IDEDemo.tsx\n layout-wrapper.tsx\n TerminalDemo.tsx\n theme-provider.tsx\n theme-switcher.tsx\n content/\n advanced/\n claude-code-comparison.mdx\n config.mdx\n how-does-it-work.mdx\n large-projects.mdx\n troubleshooting.mdx\n what-models.mdx\n agents/\n agent-reference.mdx\n creating-new-agents.mdx\n customizing-agents.mdx\n overview.mdx\n troubleshooting-agent-customization.mdx\n case-studies/\n _cta.mdx\n benjamin-bryant.mdx\n oliver-lukesch.mdx\n help/\n faq.mdx\n getting-started.mdx\n tips/\n best-practices.mdx\n keyboard-shortcuts.mdx\n knowledge-files.mdx\n other-use-cases.mdx\n version-control.mdx\n where-codebuff-shines.mdx\n discord/\n client.ts\n rate-limiter.ts\n hooks/\n use-auto-topup.ts\n use-install-dialog.ts\n use-mobile.tsx\n use-model-config.ts\n use-org-auto-topup.ts\n use-organization-data.ts\n use-user-profile.ts\n lib/\n server/\n referral.ts\n validators/\n publisher.ts\n admin-auth.ts\n constant.ts\n currency.ts\n docs.ts\n fonts.ts\n organization-permissions.ts\n PostHogProvider.tsx\n publisher-permissions.ts\n remark-code-to-codedemo.ts\n server-init.ts\n SessionProvider.tsx\n stripe-utils.ts\n testimonials.ts\n trackConversions.ts\n utils.ts\n styles/\n globals.css\n types/\n docs.ts\n user.ts\n util/\n logger.ts\n .eslintignore\n .eslintrc.js\n .gitignore\n .prettierignore\n .prettierrc.js\n commitlint.config.js\n components.json\n contentlayer.config.ts\n jest.config.js\n jest.setup.js\n knowledge.md\n next.config.mjs\n package.json\n playwright.config.ts\n postcss.config.cjs\n README.md\n tailwind.config.ts\n tsconfig.json\n.envrc\n.gitignore\n.infisical.json\n.prettierrc\nauthentication.knowledge.md\nbun.lock\nbunfig.toml\ncodebuff.json\neslint.config.js\nknowledge.md\npackage.json\nREADME.md\ntsconfig.base.json\ntsconfig.json\nWINDOWS.md\n", - "tokenCount": 9007, - "truncationLevel": "none" - } - ] - } - ], - "parentAgentId": "D-Up4CDP0Kk" - }, - { - "type": "tool_call", - "toolCallId": "c798b34d-ac9d-49e2-9c70-e16fb2d9c220", - "toolName": "read_subtree", - "input": { - "paths": [], - "maxTokens": 500000 - }, - "agentId": "D-Up8asoMmA", - "parentAgentId": "D-UppvyfWNM", - "includeToolCall": true - }, - { - "type": "tool_result", - "toolCallId": "c798b34d-ac9d-49e2-9c70-e16fb2d9c220", - "toolName": "read_subtree", - "output": [ - { - "type": "json", - "value": [ - { - "path": ".", - "type": "directory", - "printedTree": ".agents/\n examples/\n diff-reviewer-1.ts\n diff-reviewer-2.ts\n diff-reviewer-3.ts\n opensource/\n base.ts\n coder.ts\n file-picker.ts\n researcher.ts\n reviewer.ts\n thinker.ts\n ask.ts\n base-experimental.ts\n base-lite.ts\n base-max.ts\n base.ts\n brainstormer.ts\n changes-reviewer.ts\n charles.ts\n claude4-gemini-thinking.ts\n constants.ts\n file-explorer.ts\n file-picker.ts\n git-committer.ts\n knowledge-keeper.ts\n planner.ts\n researcher.ts\n reviewer.ts\n superagent.ts\n thinker.ts\n.bin/\n bun\n.github/\n workflows/\n ci.yml\n evals.yml\n nightly-evals.yml\n npm-app-release-build.yml\n npm-app-release-prod.yml\n npm-app-release-staging.yml\n .gitignore\n CODEOWNERS\n knowledge.md\n.vscode/\n settings.json\nbackend/\n src/\n __tests__/\n test-data/\n dex-go/\n edit-snippet.go\n expected.go\n original.go\n agent-id-resolution.test.ts\n agent-registry.test.ts\n auto-topup.test.ts\n credit-conversion.test.ts\n fast-rewrite.test.ts\n generate-diffs-prompt.test.ts\n get-custom-file-picker-config.test.ts\n live-user-inputs.test.ts\n loop-agent-steps.test.ts\n main-prompt.integration.test.ts\n main-prompt.test.ts\n process-file-block.test.ts\n process-str-replace.test.ts\n read-docs-tool.test.ts\n request-files-prompt.test.ts\n run-agent-step-tools.test.ts\n run-programmatic-step.test.ts\n sandbox-generator.test.ts\n subagent-streaming.test.ts\n test-utils.ts\n tool-call-schema.test.ts\n usage-calculation.test.ts\n web-search-tool.test.ts\n xml-stream-parser.test.ts\n admin/\n grade-runs.ts\n relabelRuns.ts\n api/\n org.ts\n usage.ts\n context/\n app-context.ts\n find-files/\n check-new-files-necessary.ts\n custom-file-picker-config.ts\n request-files-prompt.ts\n llm-apis/\n __tests__/\n linkup-api.test.ts\n vercel-ai-sdk/\n ai-sdk.ts\n openrouter.ts\n vertex-finetuned.ts\n claude.ts\n context7-api.ts\n gemini-with-fallbacks.ts\n knowledge.md\n linkup-api.ts\n message-cost-tracker.ts\n openai-api.ts\n openrouter.ts\n relace-api.ts\n system-prompt/\n agent-instructions.md\n prompts.ts\n save-agent-request.ts\n search-system-prompt.ts\n truncate-file-tree.ts\n templates/\n agents/\n archive/\n dry-run.ts\n agent-builder.ts\n ask.ts\n base.ts\n file-explorer.ts\n file-picker.ts\n planner.ts\n researcher.ts\n reviewer.ts\n superagent.ts\n thinker.ts\n thinking-base.ts\n agent-list.ts\n agent-registry.ts\n ask-prompts.ts\n base-prompts.ts\n prompts.ts\n README.md\n strings.ts\n types.ts\n tools/\n definitions/\n tool/\n add-message.ts\n add-subgoal.ts\n browser-logs.ts\n code-search.ts\n create-plan.ts\n end-turn.ts\n find-files.ts\n read-docs.ts\n read-files.ts\n run-file-change-hooks.ts\n run-terminal-command.ts\n set-messages.ts\n set-output.ts\n spawn-agent-inline.ts\n spawn-agents-async.ts\n spawn-agents.ts\n str-replace.ts\n think-deeply.ts\n update-subgoal.ts\n web-search.ts\n write-file.ts\n list.ts\n tool-def-type.ts\n handlers/\n tool/\n add-message.ts\n add-subgoal.ts\n browser-logs.ts\n code-search.ts\n create-plan.ts\n end-turn.ts\n find-files.ts\n read-docs.ts\n read-files.ts\n run-file-change-hooks.ts\n run-terminal-command.ts\n set-messages.ts\n set-output.ts\n spawn-agent-inline.ts\n spawn-agents-async.ts\n spawn-agents.ts\n str-replace.ts\n think-deeply.ts\n update-subgoal.ts\n web-search.ts\n write-file.ts\n handler-function-type.ts\n list.ts\n constants.ts\n prompts.ts\n stream-parser.ts\n tool-executor.ts\n util/\n __tests__/\n messages.test.ts\n object.test.ts\n parse-tool-call-xml.test.ts\n simplify-tool-results.test.ts\n split-data.test.ts\n check-auth.ts\n debug.ts\n file-resolver.ts\n logger.ts\n messages.ts\n object.ts\n parse-tool-call-xml.ts\n quickjs-sandbox.ts\n simplify-tool-results.ts\n split-data.ts\n token-counter.ts\n websockets/\n auth.ts\n middleware.ts\n request-context.ts\n server.ts\n switchboard.ts\n websocket-action.ts\n async-agent-manager.ts\n check-terminal-command.ts\n fast-rewrite.ts\n generate-diffs-prompt.ts\n get-documentation-for-query.ts\n get-file-reading-updates.ts\n index.ts\n live-user-inputs.ts\n loop-main-prompt.ts\n main-prompt.ts\n process-file-block.ts\n process-str-replace.ts\n prompt-agent-stream.ts\n run-agent-step.ts\n run-programmatic-step.ts\n xml-stream-parser.ts\n .gitignore\n knowledge.md\n package.json\n README.md\n tsconfig.json\ncommon/\n src/\n __tests__/\n agent-validation.test.ts\n dynamic-agent-template-schema.test.ts\n handlesteps-parsing.test.ts\n api-keys/\n constants.ts\n crypto.ts\n constants/\n agents.ts\n analytics-events.ts\n grant-priorities.ts\n db/\n migrations/\n meta/\n _journal.json\n 0000_snapshot.json\n 0001_snapshot.json\n 0002_snapshot.json\n 0003_snapshot.json\n 0004_snapshot.json\n 0005_snapshot.json\n 0006_snapshot.json\n 0007_snapshot.json\n 0008_snapshot.json\n 0009_snapshot.json\n 0010_snapshot.json\n 0011_snapshot.json\n 0012_snapshot.json\n 0013_snapshot.json\n 0014_snapshot.json\n 0015_snapshot.json\n 0016_snapshot.json\n 0017_snapshot.json\n 0018_snapshot.json\n 0019_snapshot.json\n 0020_snapshot.json\n 0021_snapshot.json\n 0026_snapshot.json\n 0027_snapshot.json\n 0028_snapshot.json\n 0000_overjoyed_thing.sql\n 0001_fuzzy_typhoid_mary.sql\n 0002_sticky_dormammu.sql\n 0003_military_owl.sql\n 0004_neat_pet_avengers.sql\n 0005_minor_the_professor.sql\n 0006_first_quasimodo.sql\n 0007_equal_warlock.sql\n 0008_puzzling_carnage.sql\n 0009_bitter_rumiko_fujikawa.sql\n 0010_overjoyed_red_skull.sql\n 0011_familiar_ezekiel_stane.sql\n 0012_fluffy_naoko.sql\n 0013_famous_risque.sql\n 0014_wakeful_sinister_six.sql\n 0015_stormy_zuras.sql\n 0016_clear_hairball.sql\n 0017_tricky_randall_flagg.sql\n 0018_stale_human_robot.sql\n 0019_amused_nebula.sql\n 0020_young_sleeper.sql\n 0021_tiny_marauders.sql\n 0026_chilly_mockingbird.sql\n 0027_sloppy_quasar.sql\n 0028_lush_johnny_blaze.sql\n docker-compose.yml\n drizzle.config.ts\n index.ts\n schema.knowledge.md\n schema.ts\n transaction.ts\n json-config/\n __tests__/\n __snapshots__/\n stringify-schema.test.ts.snap\n constants.test.ts\n stringify-schema.test.ts\n constants.ts\n default.ts\n stringify-schema.ts\n templates/\n agent-validation.ts\n dynamic-agent-functions.ts\n testing/\n mock-modules.ts\n tools/\n params/\n tool/\n add-message.ts\n add-subgoal.ts\n browser-logs.ts\n code-search.ts\n create-plan.ts\n end-turn.ts\n find-files.ts\n read-docs.ts\n read-files.ts\n run-file-change-hooks.ts\n run-terminal-command.ts\n set-messages.ts\n set-output.ts\n spawn-agent-inline.ts\n spawn-agents-async.ts\n spawn-agents.ts\n str-replace.ts\n think-deeply.ts\n update-subgoal.ts\n web-search.ts\n write-file.ts\n compile-tool-definitions.ts\n constants.ts\n list.ts\n utils.ts\n types/\n __tests__/\n dynamic-agent-template.test.ts\n api/\n agents/\n publish.ts\n agent-template.ts\n dynamic-agent-template.ts\n grant.ts\n message.ts\n organization.ts\n print-mode.ts\n publisher.ts\n referral.ts\n session-state.ts\n usage.ts\n util/\n __tests__/\n messages.test.ts\n partial-json-delta.test.ts\n saxy.test.ts\n string.test.ts\n examples/\n diff-reviewer-1.ts\n diff-reviewer-2.ts\n diff-reviewer-3.ts\n agent-file-utils.ts\n agent-name-normalization.ts\n agent-name-resolver.ts\n agent-template-validation.ts\n array.ts\n changes.ts\n credentials.ts\n currency.ts\n dates.ts\n error.ts\n file.ts\n git.ts\n logger.ts\n lru-cache.ts\n messages.ts\n min-heap.ts\n model-utils.ts\n object.ts\n partial-json-delta.ts\n patch.ts\n promise.ts\n random.ts\n referral.ts\n saxy.ts\n string.knowledge.md\n string.ts\n stripe.ts\n sync-failure.ts\n xml.ts\n zod-schema.ts\n websockets/\n websocket-client.ts\n websocket-schema.ts\n actions.ts\n analytics.ts\n browser-actions.ts\n constants.ts\n project-file-tree.ts\n knowledge.md\n package.json\n tsconfig.json\nevals/\n git-evals/\n email-eval-results.ts\n eval-codebuff.json\n eval-manifold.json\n eval-result-codebuff-mock.json\n gen-evals.ts\n judge-git-eval.ts\n post-eval-analysis.ts\n run-eval-set.ts\n run-git-evals.ts\n run-single-eval-process.ts\n run-single-eval.ts\n setup-test-repo.ts\n types.ts\n .gitignore\n bun.lock\n constants.ts\n e2e-cat-app-script.ts\n knowledge.md\n package.json\n scaffolding.ts\n swe-bench-eval.ts\n swe-bench-ids.ts\n swe-bench.test.ts\n test-repos.json\n test-setup.ts\n tsconfig.json\nnpm-app/\n release/\n index.js\n package.json\n README.md\n release-staging/\n index.js\n package.json\n README.md\n scripts/\n build-binary.js\n generate-github-token.ts\n patch-web-tree-sitter.ts\n release.js\n twitch-plays-codebuff.sh\n src/\n __tests__/\n display.test.ts\n tool-handlers.test.ts\n agents/\n agent-utils.ts\n load-agents.ts\n checkpoints/\n checkpoint-manager.ts\n file-manager.ts\n cli-handlers/\n agent-creation-chat.ts\n agents.ts\n api-key.ts\n checkpoint.ts\n diff.ts\n easter-egg.ts\n inititalization-flow.ts\n mini-chat.ts\n publish.ts\n subagent-list.ts\n subagent.ts\n display/\n overrides.ts\n print-mode.ts\n squash-newlines.ts\n json-config/\n hooks.ts\n parser.ts\n native/\n ripgrep.ts\n terminal/\n background.ts\n run-command.ts\n utils/\n __tests__/\n __snapshots__/\n background-process-manager.test.ts.snap\n frustration-detector.test.ts.snap\n rage-detector.test.ts.snap\n xml-stream-parser.test.ts.snap\n background-process-manager.test.ts\n rage-detector.test.ts\n response-example-4-files.txt\n tool-renderers.test.ts\n xml-stream-parser.test.ts\n agent-validation.ts\n analytics.ts\n detect-shell.ts\n git.ts\n logger.ts\n rage-detector.ts\n spinner.ts\n suppress-console.ts\n system-info.ts\n terminal.ts\n tool-renderers.ts\n with-hang-detection.ts\n xml-stream-parser.ts\n workers/\n checkpoint-worker.ts\n project-context.ts\n background-process-manager.ts\n browser-runner.ts\n chat-storage.ts\n cli-definitions.ts\n cli.ts\n client.ts\n config.ts\n create-template-project.ts\n credentials.ts\n dev-process-manager.ts\n diff-manager.ts\n fingerprint.ts\n index.ts\n menu.ts\n project-files.ts\n rage-detectors.ts\n startup-process-handler.ts\n subagent-storage.ts\n tool-handlers.ts\n types.ts\n web-scraper.ts\n .gitignore\n bunfig.toml\n package.json\n tsconfig.json\npackages/\n bigquery/\n src/\n client.ts\n index.ts\n schema.ts\n knowledge.md\n package.json\n tsconfig.json\n billing/\n src/\n __tests__/\n credit-delegation.test.ts\n extract-owner-repo.test.ts\n org-billing.test.ts\n auto-topup.ts\n balance-calculator.ts\n billing.knowledge.md\n conversion.ts\n credit-delegation.ts\n grant-credits.knowledge.md\n grant-credits.ts\n index.ts\n org-billing.ts\n org-monitoring.ts\n usage-service.ts\n utils.ts\n knowledge.md\n package.json\n project.json\n tsconfig.json\n build-tools/\n executors/\n infisical-run/\n executor.ts\n schema.json\n executors.json\n package.json\n project.json\n tsconfig.json\n code-map/\n __tests__/\n test-langs/\n test.c\n test.cpp\n test.cs\n test.go\n test.java\n test.js\n test.php\n test.py\n test.rb\n test.rs\n test.ts\n languages.test.ts\n parse.test.ts\n src/\n tree-sitter-queries/\n readme.md\n tree-sitter-c_sharp-tags.scm\n tree-sitter-c-tags.scm\n tree-sitter-cpp-tags.scm\n tree-sitter-go-tags.scm\n tree-sitter-java-tags.scm\n tree-sitter-javascript-tags.scm\n tree-sitter-php-tags.scm\n tree-sitter-python-tags.scm\n tree-sitter-ruby-tags.scm\n tree-sitter-rust-tags.scm\n tree-sitter-typescript-tags.scm\n index.ts\n languages.ts\n parse.ts\n package.json\n tsconfig.json\n internal/\n src/\n loops/\n client.ts\n index.ts\n types.ts\n openrouter-ai-sdk/\n internal/\n index.ts\n schemas/\n reasoning-details.ts\n types/\n index.ts\n openrouter-chat-completions-input.ts\n openrouter-chat-settings.ts\n .gitignore\n convert-to-openrouter-chat-messages.test.ts\n convert-to-openrouter-chat-messages.ts\n convert-to-openrouter-completion-prompt.ts\n index.ts\n map-openrouter-chat-logprobs.ts\n map-openrouter-completion-logprobs.ts\n map-openrouter-finish-reason.ts\n openrouter-chat-language-model.test.ts\n openrouter-chat-language-model.ts\n openrouter-completion-language-model.test.ts\n openrouter-completion-language-model.ts\n openrouter-completion-settings.ts\n openrouter-error.ts\n openrouter-facade.ts\n openrouter-provider-options.test.ts\n openrouter-provider.ts\n openrouter-stream-usage-accounting.test.ts\n openrouter-usage-accounting.test.ts\n utils/\n __tests__/\n version-utils.test.ts\n auth.ts\n version-utils.ts\n xml-parser.ts\n env.ts\n index.ts\n knowledge.md\n package.json\n tsconfig.json\npython-app/\n src/\n codebuff/\n __init__.py\n .gitignore\n knowledge.md\n LICENSE\n pyproject.toml\n README.md\nscripts/\n changelog/\n 2025-05-18-version-10283-release-enhanced-assistant-experience-system-stability.mdx\n 2025-05-25-version-10295-enhanced-ai-models-and-user-experience-improvements.mdx\n 2025-06-01-version-10305-release-enhanced-ai-models-new-commands-and-performance-improvements.mdx\n docs.json\n ft-file-selection/\n .gitignore\n collect-tuning-data.ts\n grade-traces.ts\n print-recent-relabels.ts\n print-recent-traces.ts\n README.md\n relabel-for-offline-scoring.ts\n relabel-traces-with-context.ts\n relabel-traces.ts\n .gitignore\n analyze-edit-blocks.ts\n analyze-model-usage.ts\n apply-credit-migration.ts\n calculate-average-spend.ts\n calculate-dau.ts\n calculate-monthly-usage.ts\n calculate-mrr.ts\n calculate-weekly-usage.ts\n cleanup-worktree.sh\n convert-escaped-newlines.ts\n count-edit-file.ts\n debug-log-subset.ts\n dev.sh\n export-user-emails.ts\n generate-ci-env.js\n generate-tool-definitions.ts\n get-changelog.ts\n init-worktree.ts\n package.json\n tsconfig.json\n update-stripe-subscriptions.ts\nsdk/\n scripts/\n publish.js\n src/\n tools/\n change-file.ts\n read-files.ts\n types/\n agent-definition.ts\n tools.ts\n client.ts\n constants.ts\n index.ts\n process-stream.ts\n websocket-client.ts\n .npmignore\n CHANGELOG.md\n package.json\n PUBLISHING.md\n README.md\n tsconfig.json\nweb/\n public/\n codebuff-intro1.webm\n scripts/\n discord/\n index.ts\n register-commands.ts\n src/\n __tests__/\n e2e/\n home.spec.ts\n unit/\n home.spec.tsx\n actions/\n hello-action.ts\n app/\n [sponsee]/\n page.tsx\n admin/\n file-picker/\n page.tsx\n orgs/\n page.tsx\n traces/\n components/\n chat-message.tsx\n client-session-viewer.tsx\n empty-state.tsx\n error-boundary.tsx\n loading-skeletons.tsx\n timeline-chart.module.css\n timeline-chart.tsx\n trace-viewer.tsx\n utils/\n __tests__/\n trace-processing.test.ts\n trace-processing.ts\n page.tsx\n layout.tsx\n affiliates/\n actions.ts\n page.tsx\n agents/\n page.tsx\n api/\n admin/\n orgs/\n [orgId]/\n features/\n [feature]/\n route.ts\n export/\n route.ts\n route.ts\n relabel-for-user/\n route.ts\n traces/\n [clientRequestId]/\n messages/\n route.ts\n timeline/\n route.ts\n client/\n [clientId]/\n sessions/\n route.ts\n admin-auth.ts\n agents/\n [publisherId]/\n [agentId]/\n [version]/\n route.ts\n latest/\n route.ts\n publish/\n route.ts\n validate/\n route.ts\n route.ts\n api-keys/\n route.ts\n auth/\n [...nextauth]/\n auth-options.ts\n route.ts\n cli/\n code/\n route.ts\n logout/\n route.ts\n status/\n route.ts\n feed/\n route.ts\n git-evals/\n visibility/\n route.ts\n route.ts\n healthz/\n route.ts\n invites/\n [token]/\n route.ts\n orgs/\n [orgId]/\n alerts/\n [alertId]/\n dismiss/\n route.ts\n route.ts\n analytics/\n export/\n route.ts\n route.ts\n billing/\n setup/\n route.ts\n status/\n route.ts\n subscription/\n route.ts\n credits/\n route.ts\n invitations/\n [email]/\n resend/\n route.ts\n route.ts\n bulk/\n route.ts\n route.ts\n members/\n [userId]/\n route.ts\n route.ts\n monitoring/\n route.ts\n publishers/\n route.ts\n repos/\n [repoId]/\n route.ts\n route.ts\n settings/\n route.ts\n usage/\n export/\n route.ts\n route.ts\n route.ts\n slug/\n [slug]/\n route.ts\n route.ts\n publishers/\n [id]/\n organization/\n route.ts\n validate/\n route.ts\n route.ts\n referrals/\n [code]/\n route.ts\n helpers.ts\n route.ts\n stripe/\n buy-credits/\n route.ts\n webhook/\n route.ts\n upload/\n avatar/\n route.ts\n user/\n auto-topup/\n route.ts\n profile/\n route.ts\n usage/\n route.ts\n config/\n page.tsx\n docs/\n [category]/\n layout.tsx\n metadata.ts\n page.tsx\n layout.tsx\n page.tsx\n evals/\n evals-table.tsx\n page.tsx\n invites/\n [token]/\n page.tsx\n login/\n page.tsx\n onboard/\n page.tsx\n orgs/\n [slug]/\n analytics/\n page.tsx\n billing/\n purchase/\n page.tsx\n setup/\n page.tsx\n repositories/\n page.tsx\n settings/\n page.tsx\n team/\n page.tsx\n usage/\n page.tsx\n page.tsx\n new/\n page.tsx\n page.tsx\n payment-success/\n page.tsx\n pricing/\n page.tsx\n privacy-policy/\n page.tsx\n publishers/\n [id]/\n agents/\n [agentId]/\n [version]/\n page.tsx\n page.tsx\n new/\n page.tsx\n page.tsx\n referrals/\n [code]/\n metadata.ts\n page.tsx\n layout.tsx\n page.tsx\n terms-of-service/\n page.tsx\n usage/\n layout.tsx\n page.tsx\n usage-display.tsx\n analytics.knowledge.md\n layout.tsx\n page.tsx\n robots.ts\n sitemap.ts\n components/\n agent/\n json-viewer.tsx\n auto-topup/\n AutoTopupSettings.tsx\n AutoTopupSettingsForm.tsx\n AutoTopupSwitch.tsx\n BaseAutoTopupSettings.tsx\n BaseAutoTopupSettingsForm.tsx\n BaseAutoTopupSwitch.tsx\n constants.ts\n OrgAutoTopupSettings.tsx\n OrgAutoTopupSettingsForm.tsx\n OrgAutoTopupSwitch.tsx\n types.ts\n credits/\n CreditManagementSection.tsx\n CreditPurchaseSection.tsx\n docs/\n mdx/\n code-demo.tsx\n custom-link.tsx\n markdown-table.tsx\n mdx-components.tsx\n mermaid-diagram.tsx\n schema-display.tsx\n copy-heading.tsx\n doc-sidebar.tsx\n docs.knowledge.md\n toc.tsx\n login/\n login-card.tsx\n login-client-wrapper.tsx\n navbar/\n navbar.tsx\n user-dropdown.tsx\n organization/\n advanced-monitor.tsx\n billing-alerts.tsx\n billing-reports.tsx\n billing-status.tsx\n credit-monitor.tsx\n model-config-sheet.tsx\n organization-success-modal.tsx\n repository-management.tsx\n team-management.tsx\n providers/\n query-client-provider.tsx\n publisher/\n basic-info-step.tsx\n ownership-step.tsx\n profile-details-step.tsx\n step-template.tsx\n sign-in/\n sign-in-button.tsx\n sign-in-card-footer.tsx\n ui/\n landing/\n competition/\n claude-code.tsx\n cline.tsx\n cursor.tsx\n github-copilot.tsx\n index.tsx\n tabs.tsx\n feature/\n browser-comparison.tsx\n chart-illustration.tsx\n code-illustration.tsx\n highlight-text.tsx\n index.tsx\n workflow-illustration.tsx\n animated-element.tsx\n constants.ts\n cta-section.tsx\n demo-code-display.tsx\n testimonials-section.tsx\n types.ts\n terminal/\n index.tsx\n style.css\n terminal-input.tsx\n terminal-output.tsx\n avatar-upload.tsx\n background-beams.tsx\n badge.tsx\n banner.tsx\n button.tsx\n card.tsx\n collapsible.tsx\n credit-confetti.tsx\n decorative-blocks.tsx\n dialog.tsx\n dropdown-menu.tsx\n enhanced-copy-button.tsx\n footer.tsx\n hero-buttons.tsx\n hero.tsx\n input.tsx\n install-dialog.tsx\n label.tsx\n neon-gradient-button.tsx\n progress.tsx\n radio-group.tsx\n section.tsx\n select.tsx\n separator.tsx\n sheet.tsx\n sidebar.tsx\n skeleton-loading.tsx\n skeleton.tsx\n slider.tsx\n switch.tsx\n table.tsx\n tabs.tsx\n textarea.tsx\n toast.tsx\n toaster.tsx\n tooltip.tsx\n use-toast.ts\n BrowserPreview.tsx\n card-with-beams.tsx\n CookieConsentCard.tsx\n footer.tsx\n icons.tsx\n IDEDemo.tsx\n layout-wrapper.tsx\n TerminalDemo.tsx\n theme-provider.tsx\n theme-switcher.tsx\n content/\n advanced/\n claude-code-comparison.mdx\n config.mdx\n how-does-it-work.mdx\n large-projects.mdx\n troubleshooting.mdx\n what-models.mdx\n agents/\n agent-reference.mdx\n creating-new-agents.mdx\n customizing-agents.mdx\n overview.mdx\n troubleshooting-agent-customization.mdx\n case-studies/\n _cta.mdx\n benjamin-bryant.mdx\n oliver-lukesch.mdx\n help/\n faq.mdx\n getting-started.mdx\n tips/\n best-practices.mdx\n keyboard-shortcuts.mdx\n knowledge-files.mdx\n other-use-cases.mdx\n version-control.mdx\n where-codebuff-shines.mdx\n discord/\n client.ts\n rate-limiter.ts\n hooks/\n use-auto-topup.ts\n use-install-dialog.ts\n use-mobile.tsx\n use-model-config.ts\n use-org-auto-topup.ts\n use-organization-data.ts\n use-user-profile.ts\n lib/\n server/\n referral.ts\n validators/\n publisher.ts\n admin-auth.ts\n constant.ts\n currency.ts\n docs.ts\n fonts.ts\n organization-permissions.ts\n PostHogProvider.tsx\n publisher-permissions.ts\n remark-code-to-codedemo.ts\n server-init.ts\n SessionProvider.tsx\n stripe-utils.ts\n testimonials.ts\n trackConversions.ts\n utils.ts\n styles/\n globals.css\n types/\n docs.ts\n user.ts\n util/\n logger.ts\n .eslintignore\n .eslintrc.js\n .gitignore\n .prettierignore\n .prettierrc.js\n commitlint.config.js\n components.json\n contentlayer.config.ts\n jest.config.js\n jest.setup.js\n knowledge.md\n next.config.mjs\n package.json\n playwright.config.ts\n postcss.config.cjs\n README.md\n tailwind.config.ts\n tsconfig.json\n.envrc\n.gitignore\n.infisical.json\n.prettierrc\nauthentication.knowledge.md\nbun.lock\nbunfig.toml\ncodebuff.json\neslint.config.js\nknowledge.md\npackage.json\nREADME.md\ntsconfig.base.json\ntsconfig.json\nWINDOWS.md\n", - "tokenCount": 9007, - "truncationLevel": "none" - } - ] - } - ], - "parentAgentId": "D-Up8asoMmA" - }, - { - "type": "tool_result", - "toolCallId": "f377e73e-59d4-43e7-bd23-bb310902374b", - "toolName": "list_directory", - "output": [ - { - "type": "json", - "value": { - "files": [ - "generate-tool-definitions.ts", - "convert-escaped-newlines.ts", - "init-worktree.ts", - "get-changelog.ts", - "cleanup-worktree.sh", - "dev.sh", - "calculate-average-spend.ts", - "analyze-model-usage.ts", - "export-user-emails.ts", - "analyze-edit-blocks.ts", - "generate-ci-env.js", - "debug-log-subset.ts", - "apply-credit-migration.ts", - ".gitignore", - "package.json", - "calculate-weekly-usage.ts", - "calculate-mrr.ts", - "tsconfig.json", - "calculate-dau.ts", - "calculate-monthly-usage.ts", - "count-edit-file.ts", - "update-stripe-subscriptions.ts" - ], - "directories": [ - "ft-file-selection", - "changelog" - ], - "path": "scripts" - } - } - ], - "parentAgentId": "D-UppqGVX8E" - }, - { - "type": "tool_call", - "toolCallId": "75dd1e91-dbd5-4362-bd0f-11dde11dd773", - "toolName": "list_directory", - "input": { - "path": "sdk/src" - }, - "agentId": "D-UppqGVX8E", - "parentAgentId": "main-agent", - "includeToolCall": true - }, - { - "type": "tool_result", - "toolCallId": "3c8b3537-c0ca-4feb-92fb-714fe8de7935", - "toolName": "code_search", - "output": [ - { - "type": "json", - "value": { - "stdout": "./evals/git-evals/eval-result-codebuff-mock.json:\n21: \"preContent\": \"import { spawn } from 'child_process'\\nimport fs from 'fs'\\nimport path from 'path'\\n\\nimport { FileChange } from 'common/actions'\\nimport { models, TEST_USER_ID } from 'common/constants'\\nimport { getToolCallString } from 'common/src/constants/tools'\\nimport { z } from 'zod'\\n\\nimport { promptFlashWithFallbacks } from './llm-apis/gemini-with-fallbacks'\\nimport { gitCommitGuidePrompt } from './system-prompt/prompts'\\n\\nconst tools = [\\n {\\n name: 'add_subgoal',\\n description: `\\n### add_subgoal\\nDescription: Add a new subgoal for tracking progress. To be used for complex requests that can't be solved in a single step, as you may forget what happened!\\nParameters:\\n- id: (required) A unique identifier for the subgoal. Try to choose the next sequential integer that is not already in use.\\n- objective: (required) The objective of the subgoal, concisely and clearly stated.\\n- status: (required) The status of the subgoal. One of [\\\"NOT_STARTED\\\", \\\"IN_PROGRESS\\\", \\\"COMPLETE\\\", \\\"ABORTED\\\"]\\n- plan: (optional) A plan for the subgoal.\\nUsage:\\n${getToolCallString('add_subgoal', {\\n id: '1',\\n objective: 'Add a new \\\"deploy api\\\" subgoal',\\n status: 'IN_PROGRESS',\\n})}\\n `.trim(),\\n },\\n {\\n name: 'update_subgoal',\\n description: `\\n### update_subgoal\\nDescription: Update a subgoal in the context given the id, and optionally the status or plan, or a new log to append. Feel free to update any combination of the status, plan, or log in one invocation.\\nParameters:\\n- id: (required) The id of the subgoal to update.\\n- status: (optional) Change the status of the subgoal. One of [\\\"NOT_STARTED\\\", \\\"IN_PROGRESS\\\", \\\"COMPLETE\\\", \\\"FAILED\\\"]\\n- plan: (optional) Change the plan for the subgoal.\\n- log: (optional) Add a log message to the subgoal. This will create a new log entry and append it to the existing logs. Use this to record your progress and any new information you learned as you go.\\nUsage 1 (update status):\\n${getToolCallString('update_subgoal', {\\n id: '1',\\n status: 'COMPLETE',\\n})}\\n\\nUsage 2 (update plan):\\n${getToolCallString('update_subgoal', {\\n id: '3',\\n plan: 'Create a file for the endpoint in the api, and register it in the router',\\n})}\\n\\nUsage 3 (add log):\\n${getToolCallString('update_subgoal', {\\n id: '1',\\n log: \\\"I found the error in the tests, it's in the foo function.\\\",\\n})}\\n\\nUsage 4 (update status and add log):\\n${getToolCallString('update_subgoal', {\\n id: '1',\\n status: 'COMPLETE',\\n log: 'I reran the tests and they passed.',\\n})}\\n `.trim(),\\n },\\n {\\n name: 'write_file',\\n description: `\\n### write_file\\nDescription: Create or edit a file with the given content.\\n\\nWhen editing a file, please use this tool to output a simplified version of the code block that highlights the changes necessary and adds comments to indicate where unchanged code has been skipped.\\n\\n--- IMPORTANT OPTIMIZATION DETAIL ---\\nUse \\\"placeholder comments\\\" i.e. \\\"// ... existing code ...\\\" (or \\\"# ... existing code ...\\\" or \\\"/* ... existing code ... */\\\" or \\\"\\\" or however comments are written for other languages) in comments as often as you can, signifying unchanged regions of the file.\\nThe write_file tool is very expensive for each line of code you write, so try to write as little \\\\`content\\\\` as possible to accomplish the task. Often this will mean that the start/end of the file will be skipped, but that's okay! Rewrite the entire file only if specifically requested.\\n\\nHowever, for new files, you should write out the entire file and not use placeholder comments.\\n--- IMPORTANT OPTIMIZATION DETAIL ---\\n\\nThese edit codeblocks will be parsed and then read by a less intelligent \\\"apply\\\" language model to update the file. To help specify the edit to the apply model, be very careful to include a few lines of context when generating the codeblock to not introduce ambiguity. Specify all unchanged regions (code and comments) of the file with \\\"// ... existing code ...\\\" markers (in comments). This will ensure the apply model will not delete existing unchanged code or comments when editing the file. This is just an abstraction for your understanding, you should not mention the apply model to the user.\\n\\nDo not use this tool to delete or rename a file. Instead run a terminal command for that.\\n\\nParameters:\\n- path: (required) Path to the file relative to the **project root**\\n- content: (required) Content to write to the file. You should abridge the content of the file using placeholder comments like: \\\\`// ... existing code ...\\\\` or \\\\`# ... existing code ...\\\\` (or whichever is appropriate for the language).\\nUsage:\\n${getToolCallString('write_file', {\\n path: 'path/to/file',\\n content: 'Your file content here',\\n})}\\n\\nExample 1 - Simple file creation:\\n${getToolCallString('write_file', {\\n path: 'new-file.ts',\\n content: 'console.log(\\\"Hello, world!\\\");',\\n})}\\n\\nExample 2 - Editing with placeholder comments:\\n${getToolCallString('write_file', {\\n path: 'foo.ts',\\n content: `// ... existing code ...\\n\\nfunction foo() {\\n console.log('foo');\\n for (let i = 0; i < 10; i++) {\\n console.log(i);\\n }\\n doSomething();\\n}\\n\\n// ... existing code ...`,\\n})}\\n\\nNotes for editing a file:\\n- Don't use XML attributes. If you do, the tool will NOT write to the file.\\n- If you don't use any placeholder comments, the entire file will be replaced. E.g. don't write out a single function without using placeholder comments unless you want to replace the entire file with that function.\\n- When editing a file, try not to change any user code that doesn't need to be changed. In particular, you must preserve pre-existing user comments exactly as they are.\\n- You can also use this tool to create new files.\\n- After you have written out a write_file block, the changes will be applied immediately. You can assume that the changes went through as intended. However, note that there are sometimes mistakes in the processs of applying the edits you described in the write_file block, e.g. sometimes large portions of the file are deleted. If you notice that the changes did not go through as intended, based on further updates to the file, you can write out a new write_file block to fix the mistake.\\n- Don't escape characters — write them out directly! E.g. write out '&' instead of '&', '>' instead of '>', '<' instead of '<', and '\\\"' instead of '"' in the content.\\n `.trim(),\\n },\\n {\\n name: 'read_files',\\n description: `\\n### read_files\\nDescription: Read the multiple files from disk and return their contents. Use this tool to read as many files as would be helpful to answer the user's request. Make sure to read any files before you write to them with the write_file tool.\\nParameters:\\n- paths: (required) List of file paths to read relative to the **project root**, separated by newlines. Absolute file paths will not work.\\nUsage:\\n${getToolCallString('read_files', {\\n paths: 'path/to/file1.ts\\\\npath/to/file2.ts',\\n})}\\n\\n\\nNote that there's no need to call this tool if you're already reading the files you need in context.`.trim(),\\n },\\n {\\n name: 'find_files',\\n description: `\\n### find_files\\nDescription: Find several files related to a brief natural language description of the files or the name of a function or class you are looking for.\\nParameters:\\n- description: (required) A brief natural language description of the files or the name of a function or class you are looking for. It's also helpful to mention a directory or two to look within.\\nUsage:\\n\\nThe implementation of function foo\\n\\n\\nPurpose: Better fulfill the user request by reading files which could contain information relevant to the user's request.\\nUse cases:\\n- If you are calling a function or creating a class and want to know how it works, use this tool to get the implementation.\\n- If you need to understand a section of the codebase, read more files in that directory or subdirectories.\\n- Some requests require a broad understanding of multiple parts of the codebase. Consider using find_files to gain more context before making changes.\\n\\nDon't use this tool if:\\n- You already know the exact path of the file(s) you are looking for — in this case, use read_files.\\n- You already read the files you need in context.\\n\\nIn general, prefer using read_files instead of find_files.\\n `.trim(),\\n },\\n {\\n name: 'code_search',\\n description: `\\n### code_search\\nDescription: Search for string patterns in the project's files. This tool uses ripgrep (rg), a fast line-oriented search tool. Use this tool only when read_files is not sufficient to find the files you need.\\nParameters:\\n- pattern: (required) The pattern to search for.\\nUsage:\\n${getToolCallString('code_search', { pattern: 'foo' })}\\n${getToolCallString('code_search', { pattern: 'import.*foo' })}\\n\\nPurpose: Search through code files to find files with specific text patterns, function names, variable names, and more.\\n\\nNote: quotes will be automatically added around your code search pattern. You might need to escape special characters like '-' or '.' or '\\\\\\\\' if you want to search for them.\\n\\nPrefer to use read_files instead of code_search unless you need to search for a specific pattern in multiple files.\\n\\nUse cases:\\n1. Finding all references to a function, class, or variable name across the codebase\\n2. Searching for specific code patterns or implementations\\n3. Looking up where certain strings or text appear\\n4. Finding files that contain specific imports or dependencies\\n5. Locating configuration settings or environment variables\\n\\nThe pattern supports regular expressions and will search recursively through all files in the project by default. Some tips:\\n- Be as constraining in the pattern as possible to limit the number of files returned, e.g. if searching for the definition of a function, use \\\"(function foo|const foo)\\\" or \\\"def foo\\\" instead of merely \\\"foo\\\".\\n- Use word boundaries (\\\\\\\\b) to match whole words only\\n- Searches file content and filenames\\n- Automatically ignores binary files, hidden files, and files in .gitignore\\n- Case-sensitive by default. Use -i to make it case insensitive.\\n- Constrain the search to specific file types using -t , e.g. -t ts or -t py.\\n `.trim(),\\n },\\n {\\n name: 'run_terminal_command',\\n description: `\\n### run_terminal_command\\nDescription: Request to execute a CLI command on the system. Use this when you need to perform system operations or run specific commands to accomplish any step in the user's task. You must tailor your command to the user's system and provide a clear explanation of what the command does. For command chaining, use the appropriate chaining syntax for the user's shell. Prefer to execute complex CLI commands over creating executable scripts, as they are more flexible and easier to run. Commands will be executed in the current working directory: ${process.cwd()}\\nParameters:\\n- command: (required) The CLI command to execute. This should be valid for the current operating system. Ensure the command is properly formatted and does not contain any harmful instructions.\\n- process_type: (required) What type of process to run. One of SYNC or BACKGROUND.\\n - SYNC: the command will be run in (and block) the current process. This is required if the output of the command is needed immediately. Most commands will be run in this way. Do not try to run processes in the background with process_type=SYNC and using & at the end of the command. Instead, use the process_type=BACKGROUND option.\\n - BACKGROUND: the command will be run in a child background process. This is for running servers or other long-running processes.\\nUsage:\\n${getToolCallString('run_terminal_command', {\\n command: 'Your command here',\\n process_type: 'value',\\n})}\\n\\nStick to these use cases:\\n1. Compiling the project or running build (e.g., \\\"npm run build\\\"). Reading the output can help you edit code to fix build errors. If possible, use an option that performs checks but doesn't emit files, e.g. \\\\`tsc --noEmit\\\\`.\\n2. Running tests (e.g., \\\"npm test\\\"). Reading the output can help you edit code to fix failing tests. Or, you could write new unit tests and then run them.\\n3. Moving, renaming, or deleting files and directories. These actions can be vital for refactoring requests. Use commands like \\\\`mv\\\\`/\\\\`move\\\\` or \\\\`rm\\\\`/\\\\`del\\\\`.\\n\\nMost likely, you should ask for permission for any other type of command you want to run. If asking for permission, show the user the command you want to run using \\\\`\\\\`\\\\` tags.\\n\\nWhen using this tool, please adhere to the following rules:\\n\\n1. Do not run commands that can modify files outside of the project directory, install packages globally, install virtual environments, or have significant side effects outside of the project directory, unless you have explicit permission from the user. Treat anything outside of the project directory as read-only.\\n2. Do not run \\\\`git push\\\\` because it can break production (!) if the user was not expecting it. Don't run \\\\`git commit\\\\`, \\\\`git rebase\\\\`, or related commands unless you get explicit permission. If a user asks to commit changes, you can do so, but you should not invoke any further git commands beyond the git commit command.\\n3. Do not run scripts without asking. Especially don't run scripts that could run against the production environment or have permanent effects without explicit permission from the user. Don't run scripts with side effects without permission from the user unless they don't have much effect or are simple.\\n4. Be careful with any command that has big or irreversible effects. Anything that touches a production environment, servers, the database, or other systems that could be affected by a command should be run with explicit permission from the user.\\n4. Don't run too many commands in a row without pausing to check in with what the user wants to do next.\\n5. Do not use the run_terminal_command tool to create or edit files. Do not use \\\\`cat\\\\` or \\\\`echo\\\\` to create or edit files. You should instead write out blocks for for editing or creating files as detailed above in the block.\\n6. Do not install packages without asking, unless it is within a small, new-ish project. Users working on a larger project will want to manage packages themselves, so ask first.\\n7. Do not use the wrong package manager for the project. For example, if the project uses \\\\`pnpm\\\\` or \\\\`bun\\\\` or \\\\`yarn\\\\`, you should not use \\\\`npm\\\\`. Similarly not everyone uses \\\\`pip\\\\` for python, etc.\\n8. You must write out ampersands without escaping them. E.g. write out '&' instead of '&'.\\nIncorrect:\\n\\\\`cd backend && npm typecheck\\\\` \\nCorrect:\\n\\\\`cd backend && npm typecheck\\\\`\\n10. Do not use more than one run_terminal_command tool call in a single response. Wait for the tool results of each command before invoking the next one.\\n11. The user will not be able to interact with these processes, e.g. confirming the command. So if there's an opportunity to use \\\"-y\\\" or \\\"--yes\\\" flags, use them. Any command that prompts for confirmation will hang if you don't use the flags.\\n\\nNotes:\\n- The current working directory will always reset to **project root** directory for each command you run. You can only access files within this directory (or sub-directories). So if you run cd in one command, the directory change won't persist to the next command.\\n - \\\\`cd subdir && some_command\\\\` will work as expected.\\n - \\\\`cd subdir\\\\` in followed by \\\\`some_command\\\\` in two different commands will run some_command from the project root.\\n- Commands can succeed without giving any output, e.g. if no type errors were found. So you may not always see output for successful executions.\\n\\n${gitCommitGuidePrompt}\\n `.trim(),\\n },\\n {\\n name: 'think_deeply',\\n description: `\\n### think_deeply\\nDescription: Think through a complex change to the codebase, like implementing a new feature or refactoring some code. Brainstorm. Go deep on alternative approaches and consider the tradeoffs.\\nParameters: thought: (required) Your detailed thoughts.\\nUsage:\\n${getToolCallString('think_deeply', {\\n thought: '[Insert detailed thoughts here]',\\n})}\\n\\nThink step by step. For the first section of your thinking, only keep a minimum draft for each thinking step, with 5 words at most.\\n\\nUse this tool when the user request meets multiple of these criteria:\\n- Explicitly asks you to plan or think through something.\\n- Always use this tool right before using the create_plan tool.\\n- Requires changes across multiple files or systems\\n- Involves complex logic or architectural decisions\\n- Would benefit from breaking down into smaller steps\\n- Has potential edge cases or risks that need consideration\\n\\nExamples of when to use it:\\n- Adding a new feature that touches multiple parts of the system\\n- Refactoring core functionality used by many components\\n- Making architectural changes that affect the system design\\n- Implementing complex business logic with many edge cases\\n\\nDo not use it for simple changes like:\\n- Adding a single function or endpoint\\n- Updating text or styles\\n `.trim(),\\n },\\n {\\n name: 'create_plan',\\n description: `\\n### create_plan\\nDescription: Create a plan for a complex change to the codebase, like implementing a new feature or refactoring some code.\\nParameters:\\n- path: (required) The path including the filename of a markdown file that will be overwritten with the plan.\\n- plan: (required) A detailed plan to solve the user's request.\\n\\nUsage:\\n${getToolCallString('create_plan', {\\n path: 'feature-name-plan.md',\\n plan: '[Insert long detailed plan here]',\\n})}\\n\\nUse this tool when the user asks you to plan something, or asks you to help with a new feature or refactoring that requires planning.\\n\\nExamples of when to use it:\\n- Adding a new feature that touches multiple parts of the system\\n- Refactoring core functionality used by many components\\n- Making architectural changes that affect the system design\\n- Implementing complex business logic with many edge cases\\n\\nDo not use it for simple changes like:\\n- Adding a single function or endpoint\\n- Updating text or styles\\n\\nFor a technical plan, act as an expert architect engineer and provide direction to your editor engineer.\\n- Study the change request and the current code.\\n- Describe how to modify the code to complete the request. The editor engineer will rely solely on your instructions, so make them unambiguous and complete.\\n- Explain all needed code changes clearly and completely, but concisely.\\n- Just show the changes needed.\\n\\nWhat to include in the plan:\\n- Include code, but not full files of it. Write out key snippets of code and use lots of psuedo code. For example, interfaces between modules, function signatures, and other code that is not immediately obvious should be written out explicitly. Function and method bodies could be written out in psuedo code.\\n- Do not waste time on much background information, focus on the exact steps of the implementation.\\n- Do not wrap the path content in markdown code blocks, e.g. \\\\`\\\\`\\\\`.\\n\\nDo not include any of the following sections in the plan:\\n- goals\\n- a timeline or schedule\\n- benefits/key improvements\\n- next steps\\n\\nAfter creating than plan, you should end turn to let the user review the plan.\\n\\nImportant: Use this tool sparingly. Do not use this tool more than once in a conversation, if a plan was already created, or for similar user requests.\\n `.trim(),\\n },\\n {\\n name: 'browser_logs',\\n description: `\\n### browser_logs\\nDescription: In a headless browser, navigate to a web page and get the console logs after page load.\\nPurpose: Use this to\n\n[Output truncated]\n\n[Output size limit reached.]", - "message": "Stopped early after 1 match(es)." - } - } - ], - "parentAgentId": "D-UpptuOT3U" - }, - { - "type": "tool_result", - "toolCallId": "75dd1e91-dbd5-4362-bd0f-11dde11dd773", - "toolName": "list_directory", - "output": [ - { - "type": "json", - "value": { - "files": [ - "constants.ts", - "client.ts", - "index.ts", - "process-stream.ts", - "websocket-client.ts" - ], - "directories": [ - "tools", - "types" - ], - "path": "sdk/src" - } - } - ], - "parentAgentId": "D-UppqGVX8E" - }, - { - "type": "tool_call", - "toolCallId": "823f0780-1389-4042-a6f7-38a2f18a1e41", - "toolName": "list_directory", - "input": { - "path": "common/src" - }, - "agentId": "D-UppqGVX8E", - "parentAgentId": "main-agent", - "includeToolCall": true - }, - { - "type": "tool_call", - "toolCallId": "56d2c651-7c50-4eb9-bedc-3977c373447d", - "toolName": "code_search", - "input": { - "pattern": "type\\s+Tool|interface\\s+Tool|union\\s+of\\s+tools|ToolName", - "flags": "-g sdk -g common -g backend/src" - }, - "agentId": "D-UpptuOT3U", - "parentAgentId": "main-agent", - "includeToolCall": true - }, - { - "type": "tool_result", - "toolCallId": "823f0780-1389-4042-a6f7-38a2f18a1e41", - "toolName": "list_directory", - "output": [ - { - "type": "json", - "value": { - "files": [ - "analytics.ts", - "project-file-tree.ts", - "browser-actions.ts", - "actions.ts", - "constants.ts" - ], - "directories": [ - "tools", - "types", - "util", - "json-config", - "constants", - "websockets", - "api-keys", - "testing", - "__tests__", - "db", - "templates" - ], - "path": "common/src" - } - } - ], - "parentAgentId": "D-UppqGVX8E" - }, - { - "type": "tool_result", - "toolCallId": "56d2c651-7c50-4eb9-bedc-3977c373447d", - "toolName": "code_search", - "output": [ - { - "type": "json", - "value": { - "stdout": "No results", - "message": "Exit code: 1" - } - } - ], - "parentAgentId": "D-UpptuOT3U" - }, - { - "type": "tool_call", - "toolCallId": "2e056ba2-ec3f-42a8-9cb5-c286713df786", - "toolName": "list_directory", - "input": { - "path": "backend/src" - }, - "agentId": "D-UppqGVX8E", - "parentAgentId": "main-agent", - "includeToolCall": true - }, - { - "type": "tool_result", - "toolCallId": "2e056ba2-ec3f-42a8-9cb5-c286713df786", - "toolName": "list_directory", - "output": [ - { - "type": "json", - "value": { - "files": [ - "xml-stream-parser.ts", - "main-prompt.ts", - "process-str-replace.ts", - "run-programmatic-step.ts", - "run-agent-step.ts", - "prompt-agent-stream.ts", - "get-documentation-for-query.ts", - "get-file-reading-updates.ts", - "check-terminal-command.ts", - "generate-diffs-prompt.ts", - "index.ts", - "live-user-inputs.ts", - "loop-main-prompt.ts", - "async-agent-manager.ts", - "fast-rewrite.ts", - "process-file-block.ts" - ], - "directories": [ - "find-files", - "tools", - "context", - "util", - "system-prompt", - "admin", - "websockets", - "__tests__", - "api", - "templates", - "llm-apis" - ], - "path": "backend/src" - } - } - ], - "parentAgentId": "D-UppqGVX8E" - }, - { - "type": "tool_call", - "toolCallId": "d51c9e36-f534-4981-9be3-c53a1b30a035", - "toolName": "set_output", - "input": { - "results": [ - { - "stdout": "./evals/git-evals/eval-result-codebuff-mock.json:\n21: \"preContent\": \"import { spawn } from 'child_process'\\nimport fs from 'fs'\\nimport path from 'path'\\n\\nimport { FileChange } from 'common/actions'\\nimport { models, TEST_USER_ID } from 'common/constants'\\nimport { getToolCallString } from 'common/src/constants/tools'\\nimport { z } from 'zod'\\n\\nimport { promptFlashWithFallbacks } from './llm-apis/gemini-with-fallbacks'\\nimport { gitCommitGuidePrompt } from './system-prompt/prompts'\\n\\nconst tools = [\\n {\\n name: 'add_subgoal',\\n description: `\\n### add_subgoal\\nDescription: Add a new subgoal for tracking progress. To be used for complex requests that can't be solved in a single step, as you may forget what happened!\\nParameters:\\n- id: (required) A unique identifier for the subgoal. Try to choose the next sequential integer that is not already in use.\\n- objective: (required) The objective of the subgoal, concisely and clearly stated.\\n- status: (required) The status of the subgoal. One of [\\\"NOT_STARTED\\\", \\\"IN_PROGRESS\\\", \\\"COMPLETE\\\", \\\"ABORTED\\\"]\\n- plan: (optional) A plan for the subgoal.\\nUsage:\\n${getToolCallString('add_subgoal', {\\n id: '1',\\n objective: 'Add a new \\\"deploy api\\\" subgoal',\\n status: 'IN_PROGRESS',\\n})}\\n `.trim(),\\n },\\n {\\n name: 'update_subgoal',\\n description: `\\n### update_subgoal\\nDescription: Update a subgoal in the context given the id, and optionally the status or plan, or a new log to append. Feel free to update any combination of the status, plan, or log in one invocation.\\nParameters:\\n- id: (required) The id of the subgoal to update.\\n- status: (optional) Change the status of the subgoal. One of [\\\"NOT_STARTED\\\", \\\"IN_PROGRESS\\\", \\\"COMPLETE\\\", \\\"FAILED\\\"]\\n- plan: (optional) Change the plan for the subgoal.\\n- log: (optional) Add a log message to the subgoal. This will create a new log entry and append it to the existing logs. Use this to record your progress and any new information you learned as you go.\\nUsage 1 (update status):\\n${getToolCallString('update_subgoal', {\\n id: '1',\\n status: 'COMPLETE',\\n})}\\n\\nUsage 2 (update plan):\\n${getToolCallString('update_subgoal', {\\n id: '3',\\n plan: 'Create a file for the endpoint in the api, and register it in the router',\\n})}\\n\\nUsage 3 (add log):\\n${getToolCallString('update_subgoal', {\\n id: '1',\\n log: \\\"I found the error in the tests, it's in the foo function.\\\",\\n})}\\n\\nUsage 4 (update status and add log):\\n${getToolCallString('update_subgoal', {\\n id: '1',\\n status: 'COMPLETE',\\n log: 'I reran the tests and they passed.',\\n})}\\n `.trim(),\\n },\\n {\\n name: 'write_file',\\n description: `\\n### write_file\\nDescription: Create or edit a file with the given content.\\n\\nWhen editing a file, please use this tool to output a simplified version of the code block that highlights the changes necessary and adds comments to indicate where unchanged code has been skipped.\\n\\n--- IMPORTANT OPTIMIZATION DETAIL ---\\nUse \\\"placeholder comments\\\" i.e. \\\"// ... existing code ...\\\" (or \\\"# ... existing code ...\\\" or \\\"/* ... existing code ... */\\\" or \\\"\\\" or however comments are written for other languages) in comments as often as you can, signifying unchanged regions of the file.\\nThe write_file tool is very expensive for each line of code you write, so try to write as little \\\\`content\\\\` as possible to accomplish the task. Often this will mean that the start/end of the file will be skipped, but that's okay! Rewrite the entire file only if specifically requested.\\n\\nHowever, for new files, you should write out the entire file and not use placeholder comments.\\n--- IMPORTANT OPTIMIZATION DETAIL ---\\n\\nThese edit codeblocks will be parsed and then read by a less intelligent \\\"apply\\\" language model to update the file. To help specify the edit to the apply model, be very careful to include a few lines of context when generating the codeblock to not introduce ambiguity. Specify all unchanged regions (code and comments) of the file with \\\"// ... existing code ...\\\" markers (in comments). This will ensure the apply model will not delete existing unchanged code or comments when editing the file. This is just an abstraction for your understanding, you should not mention the apply model to the user.\\n\\nDo not use this tool to delete or rename a file. Instead run a terminal command for that.\\n\\nParameters:\\n- path: (required) Path to the file relative to the **project root**\\n- content: (required) Content to write to the file. You should abridge the content of the file using placeholder comments like: \\\\`// ... existing code ...\\\\` or \\\\`# ... existing code ...\\\\` (or whichever is appropriate for the language).\\nUsage:\\n${getToolCallString('write_file', {\\n path: 'path/to/file',\\n content: 'Your file content here',\\n})}\\n\\nExample 1 - Simple file creation:\\n${getToolCallString('write_file', {\\n path: 'new-file.ts',\\n content: 'console.log(\\\"Hello, world!\\\");',\\n})}\\n\\nExample 2 - Editing with placeholder comments:\\n${getToolCallString('write_file', {\\n path: 'foo.ts',\\n content: `// ... existing code ...\\n\\nfunction foo() {\\n console.log('foo');\\n for (let i = 0; i < 10; i++) {\\n console.log(i);\\n }\\n doSomething();\\n}\\n\\n// ... existing code ...`,\\n})}\\n\\nNotes for editing a file:\\n- Don't use XML attributes. If you do, the tool will NOT write to the file.\\n- If you don't use any placeholder comments, the entire file will be replaced. E.g. don't write out a single function without using placeholder comments unless you want to replace the entire file with that function.\\n- When editing a file, try not to change any user code that doesn't need to be changed. In particular, you must preserve pre-existing user comments exactly as they are.\\n- You can also use this tool to create new files.\\n- After you have written out a write_file block, the changes will be applied immediately. You can assume that the changes went through as intended. However, note that there are sometimes mistakes in the processs of applying the edits you described in the write_file block, e.g. sometimes large portions of the file are deleted. If you notice that the changes did not go through as intended, based on further updates to the file, you can write out a new write_file block to fix the mistake.\\n- Don't escape characters — write them out directly! E.g. write out '&' instead of '&', '>' instead of '>', '<' instead of '<', and '\\\"' instead of '"' in the content.\\n `.trim(),\\n },\\n {\\n name: 'read_files',\\n description: `\\n### read_files\\nDescription: Read the multiple files from disk and return their contents. Use this tool to read as many files as would be helpful to answer the user's request. Make sure to read any files before you write to them with the write_file tool.\\nParameters:\\n- paths: (required) List of file paths to read relative to the **project root**, separated by newlines. Absolute file paths will not work.\\nUsage:\\n${getToolCallString('read_files', {\\n paths: 'path/to/file1.ts\\\\npath/to/file2.ts',\\n})}\\n\\n\\nNote that there's no need to call this tool if you're already reading the files you need in context.`.trim(),\\n },\\n {\\n name: 'find_files',\\n description: `\\n### find_files\\nDescription: Find several files related to a brief natural language description of the files or the name of a function or class you are looking for.\\nParameters:\\n- description: (required) A brief natural language description of the files or the name of a function or class you are looking for. It's also helpful to mention a directory or two to look within.\\nUsage:\\n\\nThe implementation of function foo\\n\\n\\nPurpose: Better fulfill the user request by reading files which could contain information relevant to the user's request.\\nUse cases:\\n- If you are calling a function or creating a class and want to know how it works, use this tool to get the implementation.\\n- If you need to understand a section of the codebase, read more files in that directory or subdirectories.\\n- Some requests require a broad understanding of multiple parts of the codebase. Consider using find_files to gain more context before making changes.\\n\\nDon't use this tool if:\\n- You already know the exact path of the file(s) you are looking for — in this case, use read_files.\\n- You already read the files you need in context.\\n\\nIn general, prefer using read_files instead of find_files.\\n `.trim(),\\n },\\n {\\n name: 'code_search',\\n description: `\\n### code_search\\nDescription: Search for string patterns in the project's files. This tool uses ripgrep (rg), a fast line-oriented search tool. Use this tool only when read_files is not sufficient to find the files you need.\\nParameters:\\n- pattern: (required) The pattern to search for.\\nUsage:\\n${getToolCallString('code_search', { pattern: 'foo' })}\\n${getToolCallString('code_search', { pattern: 'import.*foo' })}\\n\\nPurpose: Search through code files to find files with specific text patterns, function names, variable names, and more.\\n\\nNote: quotes will be automatically added around your code search pattern. You might need to escape special characters like '-' or '.' or '\\\\\\\\' if you want to search for them.\\n\\nPrefer to use read_files instead of code_search unless you need to search for a specific pattern in multiple files.\\n\\nUse cases:\\n1. Finding all references to a function, class, or variable name across the codebase\\n2. Searching for specific code patterns or implementations\\n3. Looking up where certain strings or text appear\\n4. Finding files that contain specific imports or dependencies\\n5. Locating configuration settings or environment variables\\n\\nThe pattern supports regular expressions and will search recursively through all files in the project by default. Some tips:\\n- Be as constraining in the pattern as possible to limit the number of files returned, e.g. if searching for the definition of a function, use \\\"(function foo|const foo)\\\" or \\\"def foo\\\" instead of merely \\\"foo\\\".\\n- Use word boundaries (\\\\\\\\b) to match whole words only\\n- Searches file content and filenames\\n- Automatically ignores binary files, hidden files, and files in .gitignore\\n- Case-sensitive by default. Use -i to make it case insensitive.\\n- Constrain the search to specific file types using -t , e.g. -t ts or -t py.\\n `.trim(),\\n },\\n {\\n name: 'run_terminal_command',\\n description: `\\n### run_terminal_command\\nDescription: Request to execute a CLI command on the system. Use this when you need to perform system operations or run specific commands to accomplish any step in the user's task. You must tailor your command to the user's system and provide a clear explanation of what the command does. For command chaining, use the appropriate chaining syntax for the user's shell. Prefer to execute complex CLI commands over creating executable scripts, as they are more flexible and easier to run. Commands will be executed in the current working directory: ${process.cwd()}\\nParameters:\\n- command: (required) The CLI command to execute. This should be valid for the current operating system. Ensure the command is properly formatted and does not contain any harmful instructions.\\n- process_type: (required) What type of process to run. One of SYNC or BACKGROUND.\\n - SYNC: the command will be run in (and block) the current process. This is required if the output of the command is needed immediately. Most commands will be run in this way. Do not try to run processes in the background with process_type=SYNC and using & at the end of the command. Instead, use the process_type=BACKGROUND option.\\n - BACKGROUND: the command will be run in a child background process. This is for running servers or other long-running processes.\\nUsage:\\n${getToolCallString('run_terminal_command', {\\n command: 'Your command here',\\n process_type: 'value',\\n})}\\n\\nStick to these use cases:\\n1. Compiling the project or running build (e.g., \\\"npm run build\\\"). Reading the output can help you edit code to fix build errors. If possible, use an option that performs checks but doesn't emit files, e.g. \\\\`tsc --noEmit\\\\`.\\n2. Running tests (e.g., \\\"npm test\\\"). Reading the output can help you edit code to fix failing tests. Or, you could write new unit tests and then run them.\\n3. Moving, renaming, or deleting files and directories. These actions can be vital for refactoring requests. Use commands like \\\\`mv\\\\`/\\\\`move\\\\` or \\\\`rm\\\\`/\\\\`del\\\\`.\\n\\nMost likely, you should ask for permission for any other type of command you want to run. If asking for permission, show the user the command you want to run using \\\\`\\\\`\\\\` tags.\\n\\nWhen using this tool, please adhere to the following rules:\\n\\n1. Do not run commands that can modify files outside of the project directory, install packages globally, install virtual environments, or have significant side effects outside of the project directory, unless you have explicit permission from the user. Treat anything outside of the project directory as read-only.\\n2. Do not run \\\\`git push\\\\` because it can break production (!) if the user was not expecting it. Don't run \\\\`git commit\\\\`, \\\\`git rebase\\\\`, or related commands unless you get explicit permission. If a user asks to commit changes, you can do so, but you should not invoke any further git commands beyond the git commit command.\\n3. Do not run scripts without asking. Especially don't run scripts that could run against the production environment or have permanent effects without explicit permission from the user. Don't run scripts with side effects without permission from the user unless they don't have much effect or are simple.\\n4. Be careful with any command that has big or irreversible effects. Anything that touches a production environment, servers, the database, or other systems that could be affected by a command should be run with explicit permission from the user.\\n4. Don't run too many commands in a row without pausing to check in with what the user wants to do next.\\n5. Do not use the run_terminal_command tool to create or edit files. Do not use \\\\`cat\\\\` or \\\\`echo\\\\` to create or edit files. You should instead write out blocks for for editing or creating files as detailed above in the block.\\n6. Do not install packages without asking, unless it is within a small, new-ish project. Users working on a larger project will want to manage packages themselves, so ask first.\\n7. Do not use the wrong package manager for the project. For example, if the project uses \\\\`pnpm\\\\` or \\\\`bun\\\\` or \\\\`yarn\\\\`, you should not use \\\\`npm\\\\`. Similarly not everyone uses \\\\`pip\\\\` for python, etc.\\n8. You must write out ampersands without escaping them. E.g. write out '&' instead of '&'.\\nIncorrect:\\n\\\\`cd backend && npm typecheck\\\\` \\nCorrect:\\n\\\\`cd backend && npm typecheck\\\\`\\n10. Do not use more than one run_terminal_command tool call in a single response. Wait for the tool results of each command before invoking the next one.\\n11. The user will not be able to interact with these processes, e.g. confirming the command. So if there's an opportunity to use \\\"-y\\\" or \\\"--yes\\\" flags, use them. Any command that prompts for confirmation will hang if you don't use the flags.\\n\\nNotes:\\n- The current working directory will always reset to **project root** directory for each command you run. You can only access files within this directory (or sub-directories). So if you run cd in one command, the directory change won't persist to the next command.\\n - \\\\`cd subdir && some_command\\\\` will work as expected.\\n - \\\\`cd subdir\\\\` in followed by \\\\`some_command\\\\` in two different commands will run some_command from the project root.\\n- Commands can succeed without giving any output, e.g. if no type errors were found. So you may not always see output for successful executions.\\n\\n${gitCommitGuidePrompt}\\n `.trim(),\\n },\\n {\\n name: 'think_deeply',\\n description: `\\n### think_deeply\\nDescription: Think through a complex change to the codebase, like implementing a new feature or refactoring some code. Brainstorm. Go deep on alternative approaches and consider the tradeoffs.\\nParameters: thought: (required) Your detailed thoughts.\\nUsage:\\n${getToolCallString('think_deeply', {\\n thought: '[Insert detailed thoughts here]',\\n})}\\n\\nThink step by step. For the first section of your thinking, only keep a minimum draft for each thinking step, with 5 words at most.\\n\\nUse this tool when the user request meets multiple of these criteria:\\n- Explicitly asks you to plan or think through something.\\n- Always use this tool right before using the create_plan tool.\\n- Requires changes across multiple files or systems\\n- Involves complex logic or architectural decisions\\n- Would benefit from breaking down into smaller steps\\n- Has potential edge cases or risks that need consideration\\n\\nExamples of when to use it:\\n- Adding a new feature that touches multiple parts of the system\\n- Refactoring core functionality used by many components\\n- Making architectural changes that affect the system design\\n- Implementing complex business logic with many edge cases\\n\\nDo not use it for simple changes like:\\n- Adding a single function or endpoint\\n- Updating text or styles\\n `.trim(),\\n },\\n {\\n name: 'create_plan',\\n description: `\\n### create_plan\\nDescription: Create a plan for a complex change to the codebase, like implementing a new feature or refactoring some code.\\nParameters:\\n- path: (required) The path including the filename of a markdown file that will be overwritten with the plan.\\n- plan: (required) A detailed plan to solve the user's request.\\n\\nUsage:\\n${getToolCallString('create_plan', {\\n path: 'feature-name-plan.md',\\n plan: '[Insert long detailed plan here]',\\n})}\\n\\nUse this tool when the user asks you to plan something, or asks you to help with a new feature or refactoring that requires planning.\\n\\nExamples of when to use it:\\n- Adding a new feature that touches multiple parts of the system\\n- Refactoring core functionality used by many components\\n- Making architectural changes that affect the system design\\n- Implementing complex business logic with many edge cases\\n\\nDo not use it for simple changes like:\\n- Adding a single function or endpoint\\n- Updating text or styles\\n\\nFor a technical plan, act as an expert architect engineer and provide direction to your editor engineer.\\n- Study the change request and the current code.\\n- Describe how to modify the code to complete the request. The editor engineer will rely solely on your instructions, so make them unambiguous and complete.\\n- Explain all needed code changes clearly and completely, but concisely.\\n- Just show the changes needed.\\n\\nWhat to include in the plan:\\n- Include code, but not full files of it. Write out key snippets of code and use lots of psuedo code. For example, interfaces between modules, function signatures, and other code that is not immediately obvious should be written out explicitly. Function and method bodies could be written out in psuedo code.\\n- Do not waste time on much background information, focus on the exact steps of the implementation.\\n- Do not wrap the path content in markdown code blocks, e.g. \\\\`\\\\`\\\\`.\\n\\nDo not include any of the following sections in the plan:\\n- goals\\n- a timeline or schedule\\n- benefits/key improvements\\n- next steps\\n\\nAfter creating than plan, you should end turn to let the user review the plan.\\n\\nImportant: Use this tool sparingly. Do not use this tool more than once in a conversation, if a plan was already created, or for similar user requests.\\n `.trim(),\\n },\\n {\\n name: 'browser_logs',\\n description: `\\n### browser_logs\\nDescription: In a headless browser, navigate to a web page and get the console logs after page load.\\nPurpose: Use this to\n\n[Output truncated]\n\n[Output size limit reached.]", - "message": "Stopped early after 1 match(es)." - }, - { - "stdout": "No results", - "message": "Exit code: 1" - } - ] - }, - "agentId": "D-UpptuOT3U", - "parentAgentId": "main-agent", - "includeToolCall": false - }, - { - "type": "tool_result", - "toolCallId": "d51c9e36-f534-4981-9be3-c53a1b30a035", - "toolName": "set_output", - "output": [ - { - "type": "json", - "value": { - "message": "Output set" - } - } - ], - "parentAgentId": "D-UpptuOT3U" - }, - { - "type": "tool_call", - "toolCallId": "466fc8fb-f035-43ca-998f-6b8a604e3763", - "toolName": "set_output", - "input": { - "results": [ - { - "path": "scripts", - "files": [ - "generate-tool-definitions.ts", - "convert-escaped-newlines.ts", - "init-worktree.ts", - "get-changelog.ts", - "cleanup-worktree.sh", - "dev.sh", - "calculate-average-spend.ts", - "analyze-model-usage.ts", - "export-user-emails.ts", - "analyze-edit-blocks.ts", - "generate-ci-env.js", - "debug-log-subset.ts", - "apply-credit-migration.ts", - ".gitignore", - "package.json", - "calculate-weekly-usage.ts", - "calculate-mrr.ts", - "tsconfig.json", - "calculate-dau.ts", - "calculate-monthly-usage.ts", - "count-edit-file.ts", - "update-stripe-subscriptions.ts" - ], - "directories": [ - "ft-file-selection", - "changelog" - ] - }, - { - "path": "sdk/src", - "files": [ - "constants.ts", - "client.ts", - "index.ts", - "process-stream.ts", - "websocket-client.ts" - ], - "directories": [ - "tools", - "types" - ] - }, - { - "path": "common/src", - "files": [ - "analytics.ts", - "project-file-tree.ts", - "browser-actions.ts", - "actions.ts", - "constants.ts" - ], - "directories": [ - "tools", - "types", - "util", - "json-config", - "constants", - "websockets", - "api-keys", - "testing", - "__tests__", - "db", - "templates" - ] - }, - { - "path": "backend/src", - "files": [ - "xml-stream-parser.ts", - "main-prompt.ts", - "process-str-replace.ts", - "run-programmatic-step.ts", - "run-agent-step.ts", - "prompt-agent-stream.ts", - "get-documentation-for-query.ts", - "get-file-reading-updates.ts", - "check-terminal-command.ts", - "generate-diffs-prompt.ts", - "index.ts", - "live-user-inputs.ts", - "loop-main-prompt.ts", - "async-agent-manager.ts", - "fast-rewrite.ts", - "process-file-block.ts" - ], - "directories": [ - "find-files", - "tools", - "context", - "util", - "system-prompt", - "admin", - "websockets", - "__tests__", - "api", - "templates", - "llm-apis" - ] - } - ] - }, - "agentId": "D-UppqGVX8E", - "parentAgentId": "main-agent", - "includeToolCall": false - }, - { - "type": "tool_result", - "toolCallId": "466fc8fb-f035-43ca-998f-6b8a604e3763", - "toolName": "set_output", - "output": [ - { - "type": "json", - "value": { - "message": "Output set" - } - } - ], - "parentAgentId": "D-UppqGVX8E" - }, - { - "type": "subagent_finish", - "agentId": "D-UpptuOT3U", - "agentType": "code-searcher", - "displayName": "Code Searcher", - "onlyChild": false, - "parentAgentId": "main-agent", - "prompt": "", - "params": { - "searchQueries": [ - { - "pattern": "generate-tool-definitions|toolSchemas|publicTools|approvedTools|curatedTools|toolRegistry", - "flags": "-g *.ts -g *.json" - }, - { - "pattern": "type\\s+Tool|interface\\s+Tool|union\\s+of\\s+tools|ToolName", - "flags": "-g sdk -g common -g backend/src" - } - ] - } - }, - { - "type": "subagent_finish", - "agentId": "D-UppqGVX8E", - "agentType": "directory-lister", - "displayName": "Directory Lister", - "onlyChild": false, - "parentAgentId": "main-agent", - "prompt": "", - "params": { - "directories": [ - { - "path": "scripts" - }, - { - "path": "sdk/src" - }, - { - "path": "common/src" - }, - { - "path": "backend/src" - } - ] - } - }, - { - "type": "text", - "agentId": "D-Upph7O3-0", - "text": "scripts/generate-tool-definitions.ts\ncommon/src/tools/compile-tool-definitions.ts\nbackend/src/tools/definitions/tool-def-type.ts\nbackend/src/tools/definitions/list.ts\ncommon/src/tools/list.ts\nsdk/src/types/tools.ts\nbackend/src/tools/handlers/list.ts\ncommon/src/tools/params/tool/add-message.ts\ncommon/src/tools/params/tool/add-subgoal.ts\nbackend/src/tools/definitions/tool/add-message.ts\nbackend/src/tools/definitions/tool/add-subgoal.ts\nsdk/src/tools/change-file.ts" - }, - { - "type": "subagent_finish", - "agentId": "D-Upzevpluo", - "agentType": "file-lister", - "displayName": "Liszt the File Lister", - "onlyChild": true, - "parentAgentId": "D-Upph7O3-0", - "prompt": "Find all files related to tool definitions, tool schemas, type generation scripts like generate-tool-definitions.ts, tool registries, and public tool exports. Include files in backend, scripts, sdk, common.", - "params": {} - }, - { - "type": "tool_result", - "toolCallId": "d046e8ca-3af1-4520-b256-adb0bd018137", - "toolName": "spawn_agents", - "output": [ - { - "type": "json", - "value": [ - { - "agentName": "Liszt the File Lister", - "agentType": "file-lister", - "value": { - "type": "lastMessage", - "value": [ - { - "role": "assistant", - "content": [ - { - "type": "text", - "text": "scripts/generate-tool-definitions.ts\ncommon/src/tools/compile-tool-definitions.ts\nbackend/src/tools/definitions/tool-def-type.ts\nbackend/src/tools/definitions/list.ts\ncommon/src/tools/list.ts\nsdk/src/types/tools.ts\nbackend/src/tools/handlers/list.ts\ncommon/src/tools/params/tool/add-message.ts\ncommon/src/tools/params/tool/add-subgoal.ts\nbackend/src/tools/definitions/tool/add-message.ts\nbackend/src/tools/definitions/tool/add-subgoal.ts\nsdk/src/tools/change-file.ts" - } - ] - } - ] - } - } - ] - } - ], - "parentAgentId": "D-Upph7O3-0" - }, - { - "type": "tool_call", - "toolCallId": "43b7d4af-822b-477b-9522-e42f48222b6e", - "toolName": "read_files", - "input": { - "paths": [ - "scripts/generate-tool-definitions.ts", - "common/src/tools/compile-tool-definitions.ts", - "backend/src/tools/definitions/tool-def-type.ts", - "backend/src/tools/definitions/list.ts", - "common/src/tools/list.ts", - "sdk/src/types/tools.ts", - "backend/src/tools/handlers/list.ts", - "common/src/tools/params/tool/add-message.ts", - "common/src/tools/params/tool/add-subgoal.ts", - "backend/src/tools/definitions/tool/add-message.ts", - "backend/src/tools/definitions/tool/add-subgoal.ts", - "sdk/src/tools/change-file.ts" - ] - }, - "agentId": "D-Upph7O3-0", - "parentAgentId": "main-agent", - "includeToolCall": true - }, - { - "type": "tool_result", - "toolCallId": "43b7d4af-822b-477b-9522-e42f48222b6e", - "toolName": "read_files", - "output": [ - { - "type": "json", - "value": [ - { - "path": "scripts/generate-tool-definitions.ts", - "content": "#!/usr/bin/env bun\n\nimport { writeFileSync } from 'fs'\nimport { join } from 'path'\nimport { execSync } from 'child_process'\n\nimport { compileToolDefinitions } from '@codebuff/common/tools/compile-tool-definitions'\n\n/**\n * Regenerates the tool-definitions.d.ts file from the current tool schemas.\n * This ensures the type definitions stay in sync with the actual tool parameters.\n */\nfunction main() {\n console.log('🔧 Generating tool definitions...')\n\n try {\n const content = compileToolDefinitions()\n const outputPath = join(process.cwd(), 'common/src/util/types/tools.d.ts')\n\n writeFileSync(outputPath, content, 'utf8')\n\n // Format the generated file with prettier\n console.log('🎨 Formatting generated file...')\n execSync(`npx prettier --write \"${outputPath}\"`, { stdio: 'inherit' })\n\n console.log('✅ Successfully generated tools.d.ts')\n console.log(`📁 Output: ${outputPath}`)\n } catch (error) {\n console.error('❌ Failed to generate tool definitions:', error)\n process.exit(1)\n }\n}\n\nif (import.meta.main) {\n main()\n}\n", - "referencedBy": {} - }, - { - "path": "common/src/tools/compile-tool-definitions.ts", - "content": "import z from 'zod/v4'\n\nimport { llmToolCallSchema } from './list'\n\n/**\n * Compiles all tool definitions into a single TypeScript definition file content.\n * This generates type definitions for all available tools and their parameters.\n */\nexport function compileToolDefinitions(): string {\n const toolEntries = Object.entries(llmToolCallSchema)\n\n const toolInterfaces = toolEntries\n .map(([toolName, toolDef]) => {\n const parameterSchema = toolDef.parameters\n\n // Convert Zod schema to TypeScript interface using JSON schema\n let typeDefinition: string\n try {\n const jsonSchema = z.toJSONSchema(parameterSchema)\n typeDefinition = jsonSchemaToTypeScript(jsonSchema)\n } catch (error) {\n console.warn(`Failed to convert schema for ${toolName}:`, error)\n typeDefinition = '{ [key: string]: any }'\n }\n\n return `/**\n * ${parameterSchema.description || `Parameters for ${toolName} tool`}\n */\nexport interface ${toPascalCase(toolName)}Params ${typeDefinition}`\n })\n .join('\\n\\n')\n\n const toolUnion = toolEntries.map(([toolName]) => `'${toolName}'`).join(' | ')\n\n const toolParamsMap = toolEntries\n .map(([toolName]) => ` '${toolName}': ${toPascalCase(toolName)}Params`)\n .join('\\n')\n\n return `/**\n * Union type of all available tool names\n */\nexport type ToolName = ${toolUnion}\n\n/**\n * Map of tool names to their parameter types\n */\nexport interface ToolParamsMap {\n${toolParamsMap}\n}\n\n${toolInterfaces}\n\n/**\n * Get parameters type for a specific tool\n */\nexport type GetToolParams = ToolParamsMap[T]\n`\n}\n\n/**\n * Converts kebab-case to PascalCase\n * e.g., 'write-file' -> 'WriteFile'\n */\nfunction toPascalCase(str: string): string {\n return str\n .split(/[-_]/)\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1))\n .join('')\n}\n\n/**\n * Converts JSON Schema to TypeScript interface definition\n */\nfunction jsonSchemaToTypeScript(schema: any): string {\n if (schema.type === 'object' && schema.properties) {\n const properties = Object.entries(schema.properties).map(\n ([key, prop]: [string, any]) => {\n const isOptional = !schema.required?.includes(key)\n const propType = getTypeFromJsonSchema(prop)\n const comment = prop.description ? ` /** ${prop.description} */\\n` : ''\n return `${comment} \"${key}\"${isOptional ? '?' : ''}: ${propType}`\n },\n )\n return `{\\n${properties.join('\\n')}\\n}`\n }\n return getTypeFromJsonSchema(schema)\n}\n\n/**\n * Gets TypeScript type from JSON Schema property\n */\nfunction getTypeFromJsonSchema(prop: any): string {\n if (prop.type === 'string') {\n if (prop.enum) {\n return prop.enum.map((v: string) => `\"${v}\"`).join(' | ')\n }\n return 'string'\n }\n if (prop.type === 'number' || prop.type === 'integer') return 'number'\n if (prop.type === 'boolean') return 'boolean'\n if (prop.type === 'array') {\n const itemType = prop.items ? getTypeFromJsonSchema(prop.items) : 'any'\n return `${itemType}[]`\n }\n if (prop.type === 'object') {\n if (prop.properties) {\n return jsonSchemaToTypeScript(prop)\n }\n if (prop.additionalProperties) {\n const valueType = getTypeFromJsonSchema(prop.additionalProperties)\n return `Record`\n }\n return 'Record'\n }\n if (prop.anyOf || prop.oneOf) {\n const schemas = prop.anyOf || prop.oneOf\n return schemas.map((s: any) => getTypeFromJsonSchema(s)).join(' | ')\n }\n return 'any'\n}\n", - "referencedBy": {} - }, - { - "path": "backend/src/tools/definitions/tool-def-type.ts", - "content": "import type { ToolName } from '@codebuff/common/tools/constants'\n\nexport type ToolDescription = {\n toolName: T\n description: string\n}\n", - "referencedBy": {} - }, - { - "path": "backend/src/tools/definitions/list.ts", - "content": "import { llmToolCallSchema } from '@codebuff/common/tools/list'\n\nimport { addMessageTool } from './tool/add-message'\nimport { addSubgoalTool } from './tool/add-subgoal'\nimport { browserLogsTool } from './tool/browser-logs'\nimport { codeSearchTool } from './tool/code-search'\nimport { createPlanTool } from './tool/create-plan'\nimport { endTurnTool } from './tool/end-turn'\nimport { findFilesTool } from './tool/find-files'\nimport { readDocsTool } from './tool/read-docs'\nimport { readFilesTool } from './tool/read-files'\nimport { runFileChangeHooksTool } from './tool/run-file-change-hooks'\nimport { runTerminalCommandTool } from './tool/run-terminal-command'\nimport { setMessagesTool } from './tool/set-messages'\nimport { setOutputTool } from './tool/set-output'\nimport { spawnAgentsTool } from './tool/spawn-agents'\nimport { spawnAgentsAsyncTool } from './tool/spawn-agents-async'\nimport { spawnAgentInlineTool } from './tool/spawn-agent-inline'\nimport { strReplaceTool } from './tool/str-replace'\nimport { thinkDeeplyTool } from './tool/think-deeply'\nimport { updateSubgoalTool } from './tool/update-subgoal'\nimport { webSearchTool } from './tool/web-search'\nimport { writeFileTool } from './tool/write-file'\n\nimport type { ToolDescription } from './tool-def-type'\nimport type { ToolName } from '@codebuff/common/tools/constants'\nimport type { ToolSet } from 'ai'\n\nconst toolDescriptions = {\n add_message: addMessageTool,\n add_subgoal: addSubgoalTool,\n browser_logs: browserLogsTool,\n code_search: codeSearchTool,\n create_plan: createPlanTool,\n end_turn: endTurnTool,\n find_files: findFilesTool,\n read_docs: readDocsTool,\n read_files: readFilesTool,\n run_file_change_hooks: runFileChangeHooksTool,\n run_terminal_command: runTerminalCommandTool,\n set_messages: setMessagesTool,\n set_output: setOutputTool,\n spawn_agents: spawnAgentsTool,\n spawn_agents_async: spawnAgentsAsyncTool,\n spawn_agent_inline: spawnAgentInlineTool,\n str_replace: strReplaceTool,\n think_deeply: thinkDeeplyTool,\n update_subgoal: updateSubgoalTool,\n web_search: webSearchTool,\n write_file: writeFileTool,\n} satisfies {\n [K in ToolName]: ToolDescription\n}\n\nexport type ToolDefinition = {\n [K in ToolName]: (typeof toolDescriptions)[K] & (typeof llmToolCallSchema)[K]\n}[T]\n\nexport const codebuffToolDefs = Object.fromEntries(\n Object.entries(toolDescriptions).map(([toolName, toolDescription]) => [\n toolName,\n {\n ...toolDescriptions[toolName as ToolName],\n ...llmToolCallSchema[toolName as ToolName],\n } satisfies ToolDefinition,\n ]),\n) as { [K in ToolName]: ToolDefinition } satisfies ToolSet\n", - "referencedBy": {} - }, - { - "path": "common/src/tools/list.ts", - "content": "import { addMessageParams } from './params/tool/add-message'\nimport { addSubgoalParams } from './params/tool/add-subgoal'\nimport { browserLogsParams } from './params/tool/browser-logs'\nimport { codeSearchParams } from './params/tool/code-search'\nimport { createPlanParams } from './params/tool/create-plan'\nimport { endTurnParams } from './params/tool/end-turn'\nimport { findFilesParams } from './params/tool/find-files'\nimport { readDocsParams } from './params/tool/read-docs'\nimport { readFilesParams } from './params/tool/read-files'\nimport { runFileChangeHooksParams } from './params/tool/run-file-change-hooks'\nimport { runTerminalCommandParams } from './params/tool/run-terminal-command'\nimport { setMessagesParams } from './params/tool/set-messages'\nimport { setOutputParams } from './params/tool/set-output'\nimport { spawnAgentsParams } from './params/tool/spawn-agents'\nimport { spawnAgentsAsyncParams } from './params/tool/spawn-agents-async'\nimport { spawnAgentInlineParams } from './params/tool/spawn-agent-inline'\nimport { strReplaceParams } from './params/tool/str-replace'\nimport { thinkDeeplyParams } from './params/tool/think-deeply'\nimport { updateSubgoalParams } from './params/tool/update-subgoal'\nimport { webSearchParams } from './params/tool/web-search'\nimport { writeFileParams } from './params/tool/write-file'\n\nimport type { ToolName, ToolParams } from './constants'\n\nexport const llmToolCallSchema = {\n add_message: addMessageParams,\n add_subgoal: addSubgoalParams,\n browser_logs: browserLogsParams,\n code_search: codeSearchParams,\n create_plan: createPlanParams,\n end_turn: endTurnParams,\n find_files: findFilesParams,\n read_docs: readDocsParams,\n read_files: readFilesParams,\n run_file_change_hooks: runFileChangeHooksParams,\n run_terminal_command: runTerminalCommandParams,\n set_messages: setMessagesParams,\n set_output: setOutputParams,\n spawn_agents: spawnAgentsParams,\n spawn_agents_async: spawnAgentsAsyncParams,\n spawn_agent_inline: spawnAgentInlineParams,\n str_replace: strReplaceParams,\n think_deeply: thinkDeeplyParams,\n update_subgoal: updateSubgoalParams,\n web_search: webSearchParams,\n write_file: writeFileParams,\n} satisfies {\n [K in ToolName]: ToolParams\n}\n\nexport const clientToolCallSchema = {\n // Tools that require an id and objective\n add_subgoal: ['id', 'objective', 'status', 'plan', 'log'],\n update_subgoal: ['id', 'status', 'plan', 'log'],\n\n // File operations\n write_file: ['path', 'instructions', 'content'],\n str_replace: ['path', 'replacements'],\n read_files: ['paths'],\n find_files: ['prompt'],\n\n // Search and terminal\n code_search: ['pattern', 'flags', 'cwd'],\n run_terminal_command: ['command', 'process_type', 'cwd', 'timeout_seconds'],\n\n // Planning tools\n think_deeply: ['thought'],\n create_plan: ['path', 'plan'],\n\n browser_logs: ['type', 'url', 'waitUntil'],\n\n spawn_agents: ['agents'],\n spawn_agents_async: ['agents'],\n spawn_agent_inline: ['agent_type', 'prompt', 'params'],\n set_output: [],\n\n // Documentation tool\n read_docs: ['libraryTitle', 'topic', 'max_tokens'],\n\n // Web search tool\n web_search: ['query', 'depth'],\n\n // File change hooks tool\n run_file_change_hooks: ['files'],\n\n // Tools that change the conversation history\n add_message: ['role', 'content'],\n set_messages: ['messages'],\n\n end_turn: [],\n} as const satisfies Record\n", - "referencedBy": {} - }, - { - "path": "sdk/src/types/tools.ts", - "content": "/**\n * Union type of all available tool names\n */\nexport type ToolName =\n | 'add_message'\n | 'add_subgoal'\n | 'browser_logs'\n | 'code_search'\n | 'create_plan'\n | 'end_turn'\n | 'find_files'\n | 'read_docs'\n | 'read_files'\n | 'run_file_change_hooks'\n | 'run_terminal_command'\n | 'set_messages'\n | 'set_output'\n | 'spawn_agents'\n | 'spawn_agents_async'\n | 'spawn_agent_inline'\n | 'str_replace'\n | 'think_deeply'\n | 'update_subgoal'\n | 'web_search'\n | 'write_file'\n\n/**\n * Map of tool names to their parameter types\n */\nexport interface ToolParamsMap {\n add_message: AddMessageParams\n add_subgoal: AddSubgoalParams\n browser_logs: BrowserLogsParams\n code_search: CodeSearchParams\n create_plan: CreatePlanParams\n end_turn: EndTurnParams\n find_files: FindFilesParams\n read_docs: ReadDocsParams\n read_files: ReadFilesParams\n run_file_change_hooks: RunFileChangeHooksParams\n run_terminal_command: RunTerminalCommandParams\n set_messages: SetMessagesParams\n set_output: SetOutputParams\n spawn_agents: SpawnAgentsParams\n spawn_agents_async: SpawnAgentsAsyncParams\n spawn_agent_inline: SpawnAgentInlineParams\n str_replace: StrReplaceParams\n think_deeply: ThinkDeeplyParams\n update_subgoal: UpdateSubgoalParams\n web_search: WebSearchParams\n write_file: WriteFileParams\n}\n\n/**\n * Add a new message to the conversation history. To be used for complex requests that can't be solved in a single step, as you may forget what happened!\n */\nexport interface AddMessageParams {\n role: 'user' | 'assistant'\n content: string\n}\n\n/**\n * Add a new subgoal for tracking progress. To be used for complex requests that can't be solved in a single step, as you may forget what happened!\n */\nexport interface AddSubgoalParams {\n /** A unique identifier for the subgoal. Try to choose the next sequential integer that is not already in use. */\n id: string\n /** The objective of the subgoal, concisely and clearly stated. */\n objective: string\n /** The status of the subgoal. */\n status: 'NOT_STARTED' | 'IN_PROGRESS' | 'COMPLETE' | 'ABORTED'\n /** A plan for the subgoal. */\n plan?: string\n /** A log message for the subgoal progress. */\n log?: string\n}\n\n/**\n * Parameters for browser_logs tool\n */\nexport interface BrowserLogsParams {\n /** The type of browser action to perform (e.g., \"navigate\"). */\n type: string\n /** The URL to navigate to. */\n url: string\n /** When to consider navigation successful. Defaults to 'load'. */\n waitUntil?: 'load' | 'domcontentloaded' | 'networkidle0'\n}\n\n/**\n * Search for string patterns in the project's files. This tool uses ripgrep (rg), a fast line-oriented search tool. Use this tool only when read_files is not sufficient to find the files you need.\n */\nexport interface CodeSearchParams {\n /** The pattern to search for. */\n pattern: string\n /** Optional ripgrep flags to customize the search (e.g., \"-i\" for case-insensitive, \"-t ts\" for TypeScript files only, \"-A 3\" for 3 lines after match, \"-B 2\" for 2 lines before match, \"--type-not test\" to exclude test files). */\n flags?: string\n /** Optional working directory to search within, relative to the project root. Defaults to searching the entire project. */\n cwd?: string\n}\n\n/**\n * Generate a detailed markdown plan for complex tasks.\n */\nexport interface CreatePlanParams {\n /** The path including the filename of a markdown file that will be overwritten with the plan. */\n path: string\n /** A detailed plan to solve the user's request. */\n plan: string\n}\n\n/**\n * End your turn, regardless of any new tool results that might be coming. This will allow the user to type another prompt.\n */\nexport interface EndTurnParams {}\n\n/**\n * Find several files related to a brief natural language description of the files or the name of a function or class you are looking for.\n */\nexport interface FindFilesParams {\n /** A brief natural language description of the files or the name of a function or class you are looking for. It's also helpful to mention a directory or two to look within. */\n prompt: string\n}\n\n/**\n * Fetch up-to-date documentation for libraries and frameworks using Context7 API.\n */\nexport interface ReadDocsParams {\n /** The exact library or framework name (e.g., \"Next.js\", \"MongoDB\", \"React\"). Use the official name as it appears in documentation, not a search query. */\n libraryTitle: string\n /** Optional specific topic to focus on (e.g., \"routing\", \"hooks\", \"authentication\") */\n topic?: string\n /** Optional maximum number of tokens to return. Defaults to 10000. Values less than 10000 are automatically increased to 10000. */\n max_tokens?: number\n}\n\n/**\n * Read the multiple files from disk and return their contents. Use this tool to read as many files as would be helpful to answer the user's request.\n */\nexport interface ReadFilesParams {\n /** List of file paths to read. */\n paths: string[]\n}\n\n/**\n * Parameters for run_file_change_hooks tool\n */\nexport interface RunFileChangeHooksParams {\n /** List of file paths that were changed and should trigger file change hooks */\n files: string[]\n}\n\n/**\n * Execute a CLI command from the **project root** (different from the user's cwd).\n */\nexport interface RunTerminalCommandParams {\n /** CLI command valid for user's OS. */\n command: string\n /** Either SYNC (waits, returns output) or BACKGROUND (runs in background). Default SYNC */\n process_type?: 'SYNC' | 'BACKGROUND'\n /** The working directory to run the command in. Default is the project root. */\n cwd?: string\n /** Set to -1 for no timeout. Does not apply for BACKGROUND commands. Default 30 */\n timeout_seconds?: number\n}\n\n/**\n * Set the conversation history to the provided messages.\n */\nexport interface SetMessagesParams {\n messages: {\n role: 'user' | 'assistant'\n content: string\n }[]\n}\n\n/**\n * JSON object to set as the agent output. This completely replaces any previous output. If the agent was spawned, this value will be passed back to its parent. If the agent has an outputSchema defined, the output will be validated against it.\n */\nexport interface SetOutputParams {}\n\n/**\n * Spawn multiple agents and send a prompt to each of them.\n */\nexport interface SpawnAgentsParams {\n agents: {\n /** Agent to spawn */\n agent_type: string\n /** Prompt to send to the agent */\n prompt?: string\n /** Parameters object for the agent (if any) */\n params?: Record\n }[]\n}\n\n/**\n * Parameters for spawn_agents_async tool\n */\nexport interface SpawnAgentsAsyncParams {\n agents: {\n /** Agent to spawn */\n agent_type: string\n /** Prompt to send to the agent */\n prompt?: string\n /** Parameters object for the agent (if any) */\n params?: Record\n }[]\n}\n\n/**\n * Spawn a single agent that runs within the current message history.\n */\nexport interface SpawnAgentInlineParams {\n /** Agent to spawn */\n agent_type: string\n /** Prompt to send to the agent */\n prompt?: string\n /** Parameters object for the agent (if any) */\n params?: Record\n}\n\n/**\n * Replace strings in a file with new strings.\n */\nexport interface StrReplaceParams {\n /** The path to the file to edit. */\n path: string\n /** Array of replacements to make. */\n replacements: {\n /** The string to replace. This must be an *exact match* of the string you want to replace, including whitespace and punctuation. */\n old: string\n /** The string to replace the corresponding old string with. Can be empty to delete. */\n new: string\n }[]\n}\n\n/**\n * Deeply consider complex tasks by brainstorming approaches and tradeoffs step-by-step.\n */\nexport interface ThinkDeeplyParams {\n /** Detailed step-by-step analysis. Initially keep each step concise (max ~5-7 words per step). */\n thought: string\n}\n\n/**\n * Update a subgoal in the context given the id, and optionally the status or plan, or a new log to append. Feel free to update any combination of the status, plan, or log in one invocation.\n */\nexport interface UpdateSubgoalParams {\n /** The id of the subgoal to update. */\n id: string\n /** Change the status of the subgoal. */\n status?: 'NOT_STARTED' | 'IN_PROGRESS' | 'COMPLETE' | 'ABORTED'\n /** Change the plan for the subgoal. */\n plan?: string\n /** Add a log message to the subgoal. This will create a new log entry and append it to the existing logs. Use this to record your progress and any new information you learned as you go. */\n log?: string\n}\n\n/**\n * Search the web for current information using Linkup API.\n */\nexport interface WebSearchParams {\n /** The search query to find relevant web content */\n query: string\n /** Search depth - 'standard' for quick results, 'deep' for more comprehensive search. Default is 'standard'. */\n depth: 'standard' | 'deep'\n}\n\n/**\n * Create or edit a file with the given content.\n */\nexport interface WriteFileParams {\n /** Path to the file relative to the **project root** */\n path: string\n /** What the change is intended to do in only one sentence. */\n instructions: string\n /** Edit snippet to apply to the file. */\n content: string\n}\n\n/**\n * Get parameters type for a specific tool\n */\nexport type GetToolParams = ToolParamsMap[T]\n", - "referencedBy": {} - }, - { - "path": "backend/src/tools/handlers/list.ts", - "content": "import { handleAddMessage } from './tool/add-message'\nimport { handleAddSubgoal } from './tool/add-subgoal'\nimport { handleBrowserLogs } from './tool/browser-logs'\nimport { handleCodeSearch } from './tool/code-search'\nimport { handleCreatePlan } from './tool/create-plan'\nimport { handleEndTurn } from './tool/end-turn'\nimport { handleFindFiles } from './tool/find-files'\nimport { handleReadDocs } from './tool/read-docs'\nimport { handleReadFiles } from './tool/read-files'\nimport { handleRunFileChangeHooks } from './tool/run-file-change-hooks'\nimport { handleRunTerminalCommand } from './tool/run-terminal-command'\nimport { handleSetMessages } from './tool/set-messages'\nimport { handleSetOutput } from './tool/set-output'\nimport { handleSpawnAgents } from './tool/spawn-agents'\nimport { handleSpawnAgentsAsync } from './tool/spawn-agents-async'\nimport { handleSpawnAgentInline } from './tool/spawn-agent-inline'\nimport { handleStrReplace } from './tool/str-replace'\nimport { handleThinkDeeply } from './tool/think-deeply'\nimport { handleUpdateSubgoal } from './tool/update-subgoal'\nimport { handleWebSearch } from './tool/web-search'\nimport { handleWriteFile } from './tool/write-file'\n\nimport type { CodebuffToolHandlerFunction } from './handler-function-type'\nimport type { ToolName } from '@codebuff/common/tools/constants'\n\n/**\n * Each value in this record that:\n * - Will be called immediately once it is parsed out of the stream.\n * - Takes as argument\n * - The previous tool call (to await)\n * - The CodebuffToolCall for the current tool\n * - Any additional arguments for the tool\n * - Returns a promise that will be awaited\n */\nexport const codebuffToolHandlers = {\n add_message: handleAddMessage,\n add_subgoal: handleAddSubgoal,\n browser_logs: handleBrowserLogs,\n code_search: handleCodeSearch,\n create_plan: handleCreatePlan,\n end_turn: handleEndTurn,\n find_files: handleFindFiles,\n read_docs: handleReadDocs,\n read_files: handleReadFiles,\n run_file_change_hooks: handleRunFileChangeHooks,\n run_terminal_command: handleRunTerminalCommand,\n set_messages: handleSetMessages,\n set_output: handleSetOutput,\n spawn_agents: handleSpawnAgents,\n spawn_agents_async: handleSpawnAgentsAsync,\n spawn_agent_inline: handleSpawnAgentInline,\n str_replace: handleStrReplace,\n think_deeply: handleThinkDeeply,\n update_subgoal: handleUpdateSubgoal,\n web_search: handleWebSearch,\n write_file: handleWriteFile,\n} satisfies {\n [K in ToolName]: CodebuffToolHandlerFunction\n}\n", - "referencedBy": {} - }, - { - "path": "common/src/tools/params/tool/add-message.ts", - "content": "import z from 'zod/v4'\n\nimport type { ToolParams } from '../../constants'\n\nconst toolName = 'add_message'\nconst endsAgentStep = true\nexport const addMessageParams = {\n toolName,\n endsAgentStep,\n parameters: z\n .object({\n role: z.enum(['user', 'assistant']),\n content: z.string(),\n })\n .describe(\n `Add a new message to the conversation history. To be used for complex requests that can't be solved in a single step, as you may forget what happened!`,\n ),\n} satisfies ToolParams\n", - "referencedBy": {} - }, - { - "path": "common/src/tools/params/tool/add-subgoal.ts", - "content": "import z from 'zod/v4'\n\nimport type { ToolParams } from '../../constants'\n\nconst toolName = 'add_subgoal'\nconst endsAgentStep = false\nexport const addSubgoalParams = {\n toolName,\n endsAgentStep,\n parameters: z\n .object({\n id: z\n .string()\n .min(1, 'Id cannot be empty')\n .describe(\n `A unique identifier for the subgoal. Try to choose the next sequential integer that is not already in use.`,\n ),\n objective: z\n .string()\n .min(1, 'Objective cannot be empty')\n .describe(\n `The objective of the subgoal, concisely and clearly stated.`,\n ),\n status: z\n .enum(['NOT_STARTED', 'IN_PROGRESS', 'COMPLETE', 'ABORTED'])\n .describe(`The status of the subgoal.`),\n plan: z.string().optional().describe('A plan for the subgoal.'),\n log: z\n .string()\n .optional()\n .describe('A log message for the subgoal progress.'),\n })\n .describe(\n `Add a new subgoal for tracking progress. To be used for complex requests that can't be solved in a single step, as you may forget what happened!`,\n ),\n} satisfies ToolParams\n", - "referencedBy": {} - }, - { - "path": "backend/src/tools/definitions/tool/add-message.ts", - "content": "import { getToolCallString } from '@codebuff/common/tools/utils'\n\nimport type { ToolDescription } from '../tool-def-type'\n\nconst toolName = 'add_message'\nexport const addMessageTool = {\n toolName,\n description: `\nExample:\n ${getToolCallString(toolName, {\n role: 'user',\n content: 'Hello, how are you?',\n })}\n `.trim(),\n} satisfies ToolDescription\n", - "referencedBy": {} - }, - { - "path": "backend/src/tools/definitions/tool/add-subgoal.ts", - "content": "import { getToolCallString } from '@codebuff/common/tools/utils'\n\nimport type { ToolDescription } from '../tool-def-type'\n\nconst toolName = 'add_subgoal'\nexport const addSubgoalTool = {\n toolName,\n description: `\nExample:\n${getToolCallString(toolName, {\n id: '1',\n objective: 'Add a new \"deploy api\" subgoal',\n status: 'IN_PROGRESS',\n})}\n`.trim(),\n} satisfies ToolDescription\n", - "referencedBy": {} - }, - { - "path": "sdk/src/tools/change-file.ts", - "content": "import z from 'zod'\nimport fs from 'fs'\nimport path from 'path'\nimport { applyPatch } from '../../../common/src/util/patch'\n\nconst FileChangeSchema = z.object({\n type: z.enum(['patch', 'file']),\n path: z.string(),\n content: z.string(),\n})\n\nexport function changeFile(\n parameters: unknown,\n cwd: string,\n): { toolResultMessage: string } {\n if (cwd.includes('../')) {\n throw new Error('cwd cannot include ../')\n }\n const fileChange = FileChangeSchema.parse(parameters)\n const lines = fileChange.content.split('\\n')\n\n const { created, modified, invalid } = applyChanges(cwd, [fileChange])\n\n const results: string[] = []\n\n for (const file of created) {\n results.push(\n `Created ${file} successfully. Changes made:\\n${lines.join('\\n')}`,\n )\n }\n\n for (const file of modified) {\n results.push(\n `Wrote to ${file} successfully. Changes made:\\n${lines.join('\\n')}`,\n )\n }\n\n for (const file of invalid) {\n results.push(\n `Failed to write to ${file}; file path caused an error or file could not be written`,\n )\n }\n\n return { toolResultMessage: results.join('\\n') }\n}\n\nfunction applyChanges(\n projectRoot: string,\n changes: {\n type: 'patch' | 'file'\n path: string\n content: string\n }[],\n) {\n const created: string[] = []\n const modified: string[] = []\n const invalid: string[] = []\n\n for (const change of changes) {\n const { path: filePath, content, type } = change\n try {\n const fullPath = path.join(projectRoot, filePath)\n const fileExists = fs.existsSync(fullPath)\n if (!fileExists) {\n const dirPath = path.dirname(fullPath)\n fs.mkdirSync(dirPath, { recursive: true })\n }\n\n if (type === 'file') {\n fs.writeFileSync(fullPath, content)\n } else {\n const oldContent = fs.readFileSync(fullPath, 'utf-8')\n const newContent = applyPatch(oldContent, content)\n fs.writeFileSync(fullPath, newContent)\n }\n\n if (fileExists) {\n modified.push(filePath)\n } else {\n created.push(filePath)\n }\n } catch (error) {\n console.error(`Failed to apply patch to ${filePath}:`, error, content)\n invalid.push(filePath)\n }\n }\n\n return { created, modified, invalid }\n}\n", - "referencedBy": {} - } - ] - } - ], - "parentAgentId": "D-Upph7O3-0" - }, - { - "type": "text", - "agentId": "D-Upph7O3-0", - "text": "Here's a summary of the most relevant files:\n\n* `scripts/generate-tool-definitions.ts`: Script to regenerate tool definitions from schemas.\n* `common/src/tools/compile-tool-definitions.ts`: Compiles tool definitions into TypeScript.\n* `sdk/src/types/tools.ts`: Type definitions for tools.\n* `backend/src/tools/definitions/list.ts`: Defines available tools and their descriptions.\n* `common/src/tools/list.ts`: Schemas for validating parameters of tools.\n* `sdk/src/tools/change-file.ts`: modify files\n" - }, - { - "type": "subagent_finish", - "agentId": "D-Upph7O3-0", - "agentType": "file-picker", - "displayName": "Fletcher the File Fetcher", - "onlyChild": false, - "parentAgentId": "main-agent", - "prompt": "Find all files related to tool definitions, tool schemas, type generation scripts like generate-tool-definitions.ts, tool registries, and public tool exports. Include files in backend, scripts, sdk, common." - }, - { - "type": "text", - "agentId": "D-UppvyfWNM", - "text": "sdk/src/types/tools.ts\nsdk/src/types/agent-definition.ts\nsdk/src/tools/change-file.ts\nsdk/src/tools/read-files.ts\ncommon/src/tools/constants.ts\ncommon/src/tools/list.ts\ncommon/src/tools/utils.ts\ncommon/src/tools/compile-tool-definitions.ts\ncommon/src/types/dynamic-agent-template.ts\ncommon/src/types/agent-template.ts\ncommon/src/util/xml.ts\ncommon/src/websockets/websocket-schema.ts" - }, - { - "type": "subagent_finish", - "agentId": "D-Up8asoMmA", - "agentType": "file-lister", - "displayName": "Liszt the File Lister", - "onlyChild": true, - "parentAgentId": "D-UppvyfWNM", - "prompt": "Find files in sdk/src and common/src that define or use tool types, unions, or interfaces like ToolCall, ToolSchema, etc.", - "params": {} - }, - { - "type": "tool_result", - "toolCallId": "d0f2d613-2d62-4d19-9cf2-134e939daa49", - "toolName": "spawn_agents", - "output": [ - { - "type": "json", - "value": [ - { - "agentName": "Liszt the File Lister", - "agentType": "file-lister", - "value": { - "type": "lastMessage", - "value": [ - { - "role": "assistant", - "content": [ - { - "type": "text", - "text": "sdk/src/types/tools.ts\nsdk/src/types/agent-definition.ts\nsdk/src/tools/change-file.ts\nsdk/src/tools/read-files.ts\ncommon/src/tools/constants.ts\ncommon/src/tools/list.ts\ncommon/src/tools/utils.ts\ncommon/src/tools/compile-tool-definitions.ts\ncommon/src/types/dynamic-agent-template.ts\ncommon/src/types/agent-template.ts\ncommon/src/util/xml.ts\ncommon/src/websockets/websocket-schema.ts" - } - ] - } - ] - } - } - ] - } - ], - "parentAgentId": "D-UppvyfWNM" - }, - { - "type": "tool_call", - "toolCallId": "c8892279-ae06-4127-93bd-64d285e8a7bc", - "toolName": "read_files", - "input": { - "paths": [ - "sdk/src/types/tools.ts", - "sdk/src/types/agent-definition.ts", - "sdk/src/tools/change-file.ts", - "sdk/src/tools/read-files.ts", - "common/src/tools/constants.ts", - "common/src/tools/list.ts", - "common/src/tools/utils.ts", - "common/src/tools/compile-tool-definitions.ts", - "common/src/types/dynamic-agent-template.ts", - "common/src/types/agent-template.ts", - "common/src/util/xml.ts", - "common/src/websockets/websocket-schema.ts" - ] - }, - "agentId": "D-UppvyfWNM", - "parentAgentId": "main-agent", - "includeToolCall": true - }, - { - "type": "tool_result", - "toolCallId": "c8892279-ae06-4127-93bd-64d285e8a7bc", - "toolName": "read_files", - "output": [ - { - "type": "json", - "value": [ - { - "path": "sdk/src/types/tools.ts", - "content": "/**\n * Union type of all available tool names\n */\nexport type ToolName =\n | 'add_message'\n | 'add_subgoal'\n | 'browser_logs'\n | 'code_search'\n | 'create_plan'\n | 'end_turn'\n | 'find_files'\n | 'read_docs'\n | 'read_files'\n | 'run_file_change_hooks'\n | 'run_terminal_command'\n | 'set_messages'\n | 'set_output'\n | 'spawn_agents'\n | 'spawn_agents_async'\n | 'spawn_agent_inline'\n | 'str_replace'\n | 'think_deeply'\n | 'update_subgoal'\n | 'web_search'\n | 'write_file'\n\n/**\n * Map of tool names to their parameter types\n */\nexport interface ToolParamsMap {\n add_message: AddMessageParams\n add_subgoal: AddSubgoalParams\n browser_logs: BrowserLogsParams\n code_search: CodeSearchParams\n create_plan: CreatePlanParams\n end_turn: EndTurnParams\n find_files: FindFilesParams\n read_docs: ReadDocsParams\n read_files: ReadFilesParams\n run_file_change_hooks: RunFileChangeHooksParams\n run_terminal_command: RunTerminalCommandParams\n set_messages: SetMessagesParams\n set_output: SetOutputParams\n spawn_agents: SpawnAgentsParams\n spawn_agents_async: SpawnAgentsAsyncParams\n spawn_agent_inline: SpawnAgentInlineParams\n str_replace: StrReplaceParams\n think_deeply: ThinkDeeplyParams\n update_subgoal: UpdateSubgoalParams\n web_search: WebSearchParams\n write_file: WriteFileParams\n}\n\n/**\n * Add a new message to the conversation history. To be used for complex requests that can't be solved in a single step, as you may forget what happened!\n */\nexport interface AddMessageParams {\n role: 'user' | 'assistant'\n content: string\n}\n\n/**\n * Add a new subgoal for tracking progress. To be used for complex requests that can't be solved in a single step, as you may forget what happened!\n */\nexport interface AddSubgoalParams {\n /** A unique identifier for the subgoal. Try to choose the next sequential integer that is not already in use. */\n id: string\n /** The objective of the subgoal, concisely and clearly stated. */\n objective: string\n /** The status of the subgoal. */\n status: 'NOT_STARTED' | 'IN_PROGRESS' | 'COMPLETE' | 'ABORTED'\n /** A plan for the subgoal. */\n plan?: string\n /** A log message for the subgoal progress. */\n log?: string\n}\n\n/**\n * Parameters for browser_logs tool\n */\nexport interface BrowserLogsParams {\n /** The type of browser action to perform (e.g., \"navigate\"). */\n type: string\n /** The URL to navigate to. */\n url: string\n /** When to consider navigation successful. Defaults to 'load'. */\n waitUntil?: 'load' | 'domcontentloaded' | 'networkidle0'\n}\n\n/**\n * Search for string patterns in the project's files. This tool uses ripgrep (rg), a fast line-oriented search tool. Use this tool only when read_files is not sufficient to find the files you need.\n */\nexport interface CodeSearchParams {\n /** The pattern to search for. */\n pattern: string\n /** Optional ripgrep flags to customize the search (e.g., \"-i\" for case-insensitive, \"-t ts\" for TypeScript files only, \"-A 3\" for 3 lines after match, \"-B 2\" for 2 lines before match, \"--type-not test\" to exclude test files). */\n flags?: string\n /** Optional working directory to search within, relative to the project root. Defaults to searching the entire project. */\n cwd?: string\n}\n\n/**\n * Generate a detailed markdown plan for complex tasks.\n */\nexport interface CreatePlanParams {\n /** The path including the filename of a markdown file that will be overwritten with the plan. */\n path: string\n /** A detailed plan to solve the user's request. */\n plan: string\n}\n\n/**\n * End your turn, regardless of any new tool results that might be coming. This will allow the user to type another prompt.\n */\nexport interface EndTurnParams {}\n\n/**\n * Find several files related to a brief natural language description of the files or the name of a function or class you are looking for.\n */\nexport interface FindFilesParams {\n /** A brief natural language description of the files or the name of a function or class you are looking for. It's also helpful to mention a directory or two to look within. */\n prompt: string\n}\n\n/**\n * Fetch up-to-date documentation for libraries and frameworks using Context7 API.\n */\nexport interface ReadDocsParams {\n /** The exact library or framework name (e.g., \"Next.js\", \"MongoDB\", \"React\"). Use the official name as it appears in documentation, not a search query. */\n libraryTitle: string\n /** Optional specific topic to focus on (e.g., \"routing\", \"hooks\", \"authentication\") */\n topic?: string\n /** Optional maximum number of tokens to return. Defaults to 10000. Values less than 10000 are automatically increased to 10000. */\n max_tokens?: number\n}\n\n/**\n * Read the multiple files from disk and return their contents. Use this tool to read as many files as would be helpful to answer the user's request.\n */\nexport interface ReadFilesParams {\n /** List of file paths to read. */\n paths: string[]\n}\n\n/**\n * Parameters for run_file_change_hooks tool\n */\nexport interface RunFileChangeHooksParams {\n /** List of file paths that were changed and should trigger file change hooks */\n files: string[]\n}\n\n/**\n * Execute a CLI command from the **project root** (different from the user's cwd).\n */\nexport interface RunTerminalCommandParams {\n /** CLI command valid for user's OS. */\n command: string\n /** Either SYNC (waits, returns output) or BACKGROUND (runs in background). Default SYNC */\n process_type?: 'SYNC' | 'BACKGROUND'\n /** The working directory to run the command in. Default is the project root. */\n cwd?: string\n /** Set to -1 for no timeout. Does not apply for BACKGROUND commands. Default 30 */\n timeout_seconds?: number\n}\n\n/**\n * Set the conversation history to the provided messages.\n */\nexport interface SetMessagesParams {\n messages: {\n role: 'user' | 'assistant'\n content: string\n }[]\n}\n\n/**\n * JSON object to set as the agent output. This completely replaces any previous output. If the agent was spawned, this value will be passed back to its parent. If the agent has an outputSchema defined, the output will be validated against it.\n */\nexport interface SetOutputParams {}\n\n/**\n * Spawn multiple agents and send a prompt to each of them.\n */\nexport interface SpawnAgentsParams {\n agents: {\n /** Agent to spawn */\n agent_type: string\n /** Prompt to send to the agent */\n prompt?: string\n /** Parameters object for the agent (if any) */\n params?: Record\n }[]\n}\n\n/**\n * Parameters for spawn_agents_async tool\n */\nexport interface SpawnAgentsAsyncParams {\n agents: {\n /** Agent to spawn */\n agent_type: string\n /** Prompt to send to the agent */\n prompt?: string\n /** Parameters object for the agent (if any) */\n params?: Record\n }[]\n}\n\n/**\n * Spawn a single agent that runs within the current message history.\n */\nexport interface SpawnAgentInlineParams {\n /** Agent to spawn */\n agent_type: string\n /** Prompt to send to the agent */\n prompt?: string\n /** Parameters object for the agent (if any) */\n params?: Record\n}\n\n/**\n * Replace strings in a file with new strings.\n */\nexport interface StrReplaceParams {\n /** The path to the file to edit. */\n path: string\n /** Array of replacements to make. */\n replacements: {\n /** The string to replace. This must be an *exact match* of the string you want to replace, including whitespace and punctuation. */\n old: string\n /** The string to replace the corresponding old string with. Can be empty to delete. */\n new: string\n }[]\n}\n\n/**\n * Deeply consider complex tasks by brainstorming approaches and tradeoffs step-by-step.\n */\nexport interface ThinkDeeplyParams {\n /** Detailed step-by-step analysis. Initially keep each step concise (max ~5-7 words per step). */\n thought: string\n}\n\n/**\n * Update a subgoal in the context given the id, and optionally the status or plan, or a new log to append. Feel free to update any combination of the status, plan, or log in one invocation.\n */\nexport interface UpdateSubgoalParams {\n /** The id of the subgoal to update. */\n id: string\n /** Change the status of the subgoal. */\n status?: 'NOT_STARTED' | 'IN_PROGRESS' | 'COMPLETE' | 'ABORTED'\n /** Change the plan for the subgoal. */\n plan?: string\n /** Add a log message to the subgoal. This will create a new log entry and append it to the existing logs. Use this to record your progress and any new information you learned as you go. */\n log?: string\n}\n\n/**\n * Search the web for current information using Linkup API.\n */\nexport interface WebSearchParams {\n /** The search query to find relevant web content */\n query: string\n /** Search depth - 'standard' for quick results, 'deep' for more comprehensive search. Default is 'standard'. */\n depth: 'standard' | 'deep'\n}\n\n/**\n * Create or edit a file with the given content.\n */\nexport interface WriteFileParams {\n /** Path to the file relative to the **project root** */\n path: string\n /** What the change is intended to do in only one sentence. */\n instructions: string\n /** Edit snippet to apply to the file. */\n content: string\n}\n\n/**\n * Get parameters type for a specific tool\n */\nexport type GetToolParams = ToolParamsMap[T]\n", - "referencedBy": {} - }, - { - "path": "sdk/src/types/agent-definition.ts", - "content": "/**\n * Codebuff Agent Type Definitions\n *\n * This file provides TypeScript type definitions for creating custom Codebuff agents.\n * Import these types in your agent files to get full type safety and IntelliSense.\n *\n * Usage in .agents/your-agent.ts:\n * import { AgentDefinition, ToolName, ModelName } from './types/agent-definition'\n *\n * const config: AgentDefinition = {\n * // ... your agent configuration with full type safety ...\n * }\n *\n * export default config\n */\n\n// ============================================================================\n// Agent Definition and Utility Types\n// ============================================================================\n\nexport interface AgentDefinition {\n /** Unique identifier for this agent. Must contain only lowercase letters, numbers, and hyphens, e.g. 'code-reviewer' */\n id: string\n\n /** Version string (if not provided, will default to '0.0.1' and be bumped on each publish) */\n version?: string\n\n /** Publisher ID for the agent. Must be provided if you want to publish the agent. */\n publisher?: string\n\n /** Human-readable name for the agent */\n displayName: string\n\n /** AI model to use for this agent. Can be any model in OpenRouter: https://openrouter.ai/models */\n model: ModelName\n\n // ============================================================================\n // Tools and Subagents\n // ============================================================================\n\n /** Tools this agent can use. */\n toolNames?: ToolName[]\n\n /** Other agents this agent can spawn, like 'codebuff/file-picker@0.0.1'.\n *\n * Use the fully qualified agent id from the agent store, including publisher and version: 'codebuff/file-picker@0.0.1'\n * (publisher and version are required!)\n *\n * Or, use the agent id from a local agent file in your .agents directory: 'file-picker'.\n */\n spawnableAgents?: string[]\n\n // ============================================================================\n // Input and Output\n // ============================================================================\n\n /** The input schema required to spawn the agent. Provide a prompt string and/or a params object or none.\n * 80% of the time you want just a prompt string with a description:\n * inputSchema: {\n * prompt: { type: 'string', description: 'A description of what info would be helpful to the agent' }\n * }\n */\n inputSchema?: {\n prompt?: { type: 'string'; description?: string }\n params?: JsonSchema\n }\n\n /** Whether to include conversation history from the parent agent in context.\n *\n * Defaults to false.\n * Use this if the agent needs to know all the previous messages in the conversation.\n */\n includeMessageHistory?: boolean\n\n /** How the agent should output a response to its parent (defaults to 'last_message')\n *\n * last_message: The last message from the agent, typcically after using tools.\n *\n * all_messages: All messages from the agent, including tool calls and results.\n *\n * json: Make the agent output a JSON object. Can be used with outputSchema or without if you want freeform json output.\n */\n outputMode?: 'last_message' | 'all_messages' | 'structured_output'\n\n /** JSON schema for structured output (when outputMode is 'structured_output') */\n outputSchema?: JsonSchema\n\n // ============================================================================\n // Prompts\n // ============================================================================\n\n /** Prompt for when to spawn this agent as a subagent. Include the main purpose and use cases.\n *\n * This field is key if the agent is a subagent and intended to be spawned. */\n parentPrompt?: string\n\n /** Background information for the agent. Fairly optional. Prefer using instructionsPrompt for agent instructions. */\n systemPrompt?: string\n\n /** Instructions for the agent.\n *\n * IMPORTANT: Updating this prompt is the best way to shape the agent's behavior.\n * This prompt is inserted after each user input. */\n instructionsPrompt?: string\n\n /** Prompt inserted at each agent step.\n *\n * Powerful for changing the agent's behavior, but usually not necessary for smart models.\n * Prefer instructionsPrompt for most instructions. */\n stepPrompt?: string\n\n // ============================================================================\n // Handle Steps\n // ============================================================================\n\n /** Programmatically step the agent forward and run tools.\n *\n * You can either yield:\n * - A tool call object with toolName and args properties.\n * - 'STEP' to run agent's model and generate one assistant message.\n * - 'STEP_ALL' to run the agent's model until it uses the end_turn tool or stops includes no tool calls in a message.\n *\n * Or use 'return' to end the turn.\n *\n * Example 1:\n * function* handleSteps({ agentStep, prompt, params}) {\n * const { toolResult } = yield {\n * toolName: 'read_files',\n * args: { paths: ['file1.txt', 'file2.txt'] }\n * }\n * yield 'STEP_ALL'\n * }\n *\n * Example 2:\n * handleSteps: function* ({ agentState, prompt, params }) {\n * while (true) {\n * yield {\n * toolName: 'spawn_agents',\n * args: {\n * agents: [\n * {\n * agent_type: 'thinker',\n * prompt: 'Think deeply about the user request',\n * },\n * ],\n * },\n * }\n * yield 'STEP'\n * }\n * }\n */\n handleSteps?: (\n context: AgentStepContext,\n ) => Generator<\n ToolCall | 'STEP' | 'STEP_ALL',\n void,\n { agentState: AgentState; toolResult: string | undefined }\n >\n}\n\n// ============================================================================\n// Supporting Types\n// ============================================================================\n\nexport interface AgentState {\n agentId: string\n parentId: string\n messageHistory: Message[]\n}\n\n/**\n * Message in conversation history\n */\nexport interface Message {\n role: 'user' | 'assistant'\n content: string\n}\n\n/**\n * Context provided to handleSteps generator function\n */\nexport interface AgentStepContext {\n agentState: AgentState\n prompt?: string\n params?: Record\n}\n\n/**\n * Tool call object for handleSteps generator\n */\nexport type ToolCall = {\n [K in T]: {\n toolName: K\n args?: Tools.GetToolParams\n }\n}[T]\n\n/**\n * JSON Schema definition (for prompt schema or output schema)\n */\nexport interface JsonSchema {\n type: string\n properties?: Record\n required?: string[]\n [key: string]: any\n}\n\n// ============================================================================\n// Available Tools\n// ============================================================================\n\n/**\n * File operation tools\n */\nexport type FileTools =\n | 'read_files'\n | 'write_file'\n | 'str_replace'\n | 'find_files'\n\n/**\n * Code analysis tools\n */\nexport type CodeAnalysisTools = 'code_search' | 'find_files'\n\n/**\n * Terminal and system tools\n */\nexport type TerminalTools = 'run_terminal_command' | 'run_file_change_hooks'\n\n/**\n * Web and browser tools\n */\nexport type WebTools = 'browser_logs' | 'web_search' | 'read_docs'\n\n/**\n * Agent management tools\n */\nexport type AgentTools =\n | 'spawn_agents'\n | 'spawn_agents_async'\n | 'send_agent_message'\n | 'set_messages'\n | 'add_message'\n\n/**\n * Planning and organization tools\n */\nexport type PlanningTools =\n | 'think_deeply'\n | 'create_plan'\n | 'add_subgoal'\n | 'update_subgoal'\n\n/**\n * Output and control tools\n */\nexport type OutputTools = 'set_output' | 'end_turn'\n\n/**\n * Common tool combinations for convenience\n */\nexport type FileEditingTools = FileTools | 'end_turn'\nexport type ResearchTools = WebTools | 'write_file' | 'end_turn'\nexport type CodeAnalysisToolSet = FileTools | CodeAnalysisTools | 'end_turn'\n\n// ============================================================================\n// Available Models (see: https://openrouter.ai/models)\n// ============================================================================\n\n/**\n * AI models available for agents. Pick from our selection of recommended models or choose any model in OpenRouter.\n *\n * See available models at https://openrouter.ai/models\n */\nexport type ModelName =\n // Recommended Models\n\n // OpenAI\n | 'openai/gpt-5'\n | 'openai/gpt-5-mini'\n | 'openai/gpt-5-nano'\n\n // Anthropic\n | 'anthropic/claude-4-sonnet-20250522'\n | 'anthropic/claude-opus-4.1'\n\n // Gemini\n | 'google/gemini-2.5-pro'\n | 'google/gemini-2.5-flash'\n | 'google/gemini-2.5-flash-lite'\n\n // X-AI\n | 'x-ai/grok-4-07-09'\n\n // Qwen\n | 'qwen/qwen3-coder'\n | 'qwen/qwen3-coder:fast'\n | 'qwen/qwen3-235b-a22b-2507'\n | 'qwen/qwen3-235b-a22b-2507:fast'\n | 'qwen/qwen3-235b-a22b-thinking-2507'\n | 'qwen/qwen3-235b-a22b-thinking-2507:fast'\n | 'qwen/qwen3-30b-a3b'\n | 'qwen/qwen3-30b-a3b:fast'\n\n // DeepSeek\n | 'deepseek/deepseek-chat-v3-0324'\n | 'deepseek/deepseek-chat-v3-0324:fast'\n | 'deepseek/deepseek-r1-0528'\n | 'deepseek/deepseek-r1-0528:fast'\n\n // Other open source models\n | 'moonshotai/kimi-k2'\n | 'moonshotai/kimi-k2:fast'\n | 'z-ai/glm-4.5'\n | 'z-ai/glm-4.5:fast'\n | (string & {})\n\nimport type * as Tools from './tools'\nexport type { Tools }\ntype ToolName = Tools.ToolName\n", - "referencedBy": {} - }, - { - "path": "sdk/src/tools/change-file.ts", - "content": "import z from 'zod'\nimport fs from 'fs'\nimport path from 'path'\nimport { applyPatch } from '../../../common/src/util/patch'\n\nconst FileChangeSchema = z.object({\n type: z.enum(['patch', 'file']),\n path: z.string(),\n content: z.string(),\n})\n\nexport function changeFile(\n parameters: unknown,\n cwd: string,\n): { toolResultMessage: string } {\n if (cwd.includes('../')) {\n throw new Error('cwd cannot include ../')\n }\n const fileChange = FileChangeSchema.parse(parameters)\n const lines = fileChange.content.split('\\n')\n\n const { created, modified, invalid } = applyChanges(cwd, [fileChange])\n\n const results: string[] = []\n\n for (const file of created) {\n results.push(\n `Created ${file} successfully. Changes made:\\n${lines.join('\\n')}`,\n )\n }\n\n for (const file of modified) {\n results.push(\n `Wrote to ${file} successfully. Changes made:\\n${lines.join('\\n')}`,\n )\n }\n\n for (const file of invalid) {\n results.push(\n `Failed to write to ${file}; file path caused an error or file could not be written`,\n )\n }\n\n return { toolResultMessage: results.join('\\n') }\n}\n\nfunction applyChanges(\n projectRoot: string,\n changes: {\n type: 'patch' | 'file'\n path: string\n content: string\n }[],\n) {\n const created: string[] = []\n const modified: string[] = []\n const invalid: string[] = []\n\n for (const change of changes) {\n const { path: filePath, content, type } = change\n try {\n const fullPath = path.join(projectRoot, filePath)\n const fileExists = fs.existsSync(fullPath)\n if (!fileExists) {\n const dirPath = path.dirname(fullPath)\n fs.mkdirSync(dirPath, { recursive: true })\n }\n\n if (type === 'file') {\n fs.writeFileSync(fullPath, content)\n } else {\n const oldContent = fs.readFileSync(fullPath, 'utf-8')\n const newContent = applyPatch(oldContent, content)\n fs.writeFileSync(fullPath, newContent)\n }\n\n if (fileExists) {\n modified.push(filePath)\n } else {\n created.push(filePath)\n }\n } catch (error) {\n console.error(`Failed to apply patch to ${filePath}:`, error, content)\n invalid.push(filePath)\n }\n }\n\n return { created, modified, invalid }\n}\n", - "referencedBy": {} - }, - { - "path": "sdk/src/tools/read-files.ts", - "content": "import { FILE_READ_STATUS } from '../../../common/src/constants'\nimport path, { isAbsolute } from 'path'\nimport fs from 'fs'\n\nexport function getFiles(filePaths: string[], cwd: string) {\n const result: Record = {}\n const MAX_FILE_SIZE = 1024 * 1024 // 1MB in bytes\n\n for (const filePath of filePaths) {\n if (!filePath) {\n continue\n }\n\n // Convert absolute paths within project to relative paths\n const relativePath = filePath.startsWith(cwd)\n ? path.relative(cwd, filePath)\n : filePath\n const fullPath = path.join(cwd, relativePath)\n if (isAbsolute(relativePath) || !fullPath.startsWith(cwd)) {\n result[relativePath] = FILE_READ_STATUS.OUTSIDE_PROJECT\n continue\n }\n try {\n const stats = fs.statSync(fullPath)\n if (stats.size > MAX_FILE_SIZE) {\n result[relativePath] =\n FILE_READ_STATUS.TOO_LARGE +\n ` [${(stats.size / (1024 * 1024)).toFixed(2)}MB]`\n } else {\n const content = fs.readFileSync(fullPath, 'utf8')\n result[relativePath] = content\n }\n } catch (error) {\n if (\n error &&\n typeof error === 'object' &&\n 'code' in error &&\n error.code === 'ENOENT'\n ) {\n result[relativePath] = FILE_READ_STATUS.DOES_NOT_EXIST\n } else {\n result[relativePath] = FILE_READ_STATUS.ERROR\n }\n }\n }\n return result\n}", - "referencedBy": {} - }, - { - "path": "common/src/tools/constants.ts", - "content": "import type { ToolResultPart } from 'ai'\nimport type z from 'zod/v4'\n\nexport const toolNameParam = 'cb_tool_name'\nexport const endsAgentStepParam = 'cb_easp'\nexport const toolXmlName = 'codebuff_tool_call'\nexport const startToolTag = `<${toolXmlName}>\\n`\nexport const endToolTag = `\\n`\n\nexport const TOOLS_WHICH_WONT_FORCE_NEXT_STEP = ['think_deeply']\n\n// List of all available tools\nexport const toolNames = [\n 'add_subgoal',\n 'add_message',\n 'browser_logs',\n 'code_search',\n 'create_plan',\n 'end_turn',\n 'find_files',\n 'read_docs',\n 'read_files',\n 'run_file_change_hooks',\n 'run_terminal_command',\n 'set_messages',\n 'set_output',\n 'spawn_agents',\n 'spawn_agents_async',\n 'spawn_agent_inline',\n 'str_replace',\n 'think_deeply',\n 'update_subgoal',\n 'web_search',\n 'write_file',\n] as const\n\nexport type ToolName = (typeof toolNames)[number]\n\nexport type ToolParams = {\n toolName: T\n endsAgentStep: boolean\n parameters: z.ZodType\n}\n\nexport type StringToolResultPart = Omit & {\n result: string\n}\n", - "referencedBy": {} - }, - { - "path": "common/src/tools/list.ts", - "content": "import { addMessageParams } from './params/tool/add-message'\nimport { addSubgoalParams } from './params/tool/add-subgoal'\nimport { browserLogsParams } from './params/tool/browser-logs'\nimport { codeSearchParams } from './params/tool/code-search'\nimport { createPlanParams } from './params/tool/create-plan'\nimport { endTurnParams } from './params/tool/end-turn'\nimport { findFilesParams } from './params/tool/find-files'\nimport { readDocsParams } from './params/tool/read-docs'\nimport { readFilesParams } from './params/tool/read-files'\nimport { runFileChangeHooksParams } from './params/tool/run-file-change-hooks'\nimport { runTerminalCommandParams } from './params/tool/run-terminal-command'\nimport { setMessagesParams } from './params/tool/set-messages'\nimport { setOutputParams } from './params/tool/set-output'\nimport { spawnAgentsParams } from './params/tool/spawn-agents'\nimport { spawnAgentsAsyncParams } from './params/tool/spawn-agents-async'\nimport { spawnAgentInlineParams } from './params/tool/spawn-agent-inline'\nimport { strReplaceParams } from './params/tool/str-replace'\nimport { thinkDeeplyParams } from './params/tool/think-deeply'\nimport { updateSubgoalParams } from './params/tool/update-subgoal'\nimport { webSearchParams } from './params/tool/web-search'\nimport { writeFileParams } from './params/tool/write-file'\n\nimport type { ToolName, ToolParams } from './constants'\n\nexport const llmToolCallSchema = {\n add_message: addMessageParams,\n add_subgoal: addSubgoalParams,\n browser_logs: browserLogsParams,\n code_search: codeSearchParams,\n create_plan: createPlanParams,\n end_turn: endTurnParams,\n find_files: findFilesParams,\n read_docs: readDocsParams,\n read_files: readFilesParams,\n run_file_change_hooks: runFileChangeHooksParams,\n run_terminal_command: runTerminalCommandParams,\n set_messages: setMessagesParams,\n set_output: setOutputParams,\n spawn_agents: spawnAgentsParams,\n spawn_agents_async: spawnAgentsAsyncParams,\n spawn_agent_inline: spawnAgentInlineParams,\n str_replace: strReplaceParams,\n think_deeply: thinkDeeplyParams,\n update_subgoal: updateSubgoalParams,\n web_search: webSearchParams,\n write_file: writeFileParams,\n} satisfies {\n [K in ToolName]: ToolParams\n}\n\nexport const clientToolCallSchema = {\n // Tools that require an id and objective\n add_subgoal: ['id', 'objective', 'status', 'plan', 'log'],\n update_subgoal: ['id', 'status', 'plan', 'log'],\n\n // File operations\n write_file: ['path', 'instructions', 'content'],\n str_replace: ['path', 'replacements'],\n read_files: ['paths'],\n find_files: ['prompt'],\n\n // Search and terminal\n code_search: ['pattern', 'flags', 'cwd'],\n run_terminal_command: ['command', 'process_type', 'cwd', 'timeout_seconds'],\n\n // Planning tools\n think_deeply: ['thought'],\n create_plan: ['path', 'plan'],\n\n browser_logs: ['type', 'url', 'waitUntil'],\n\n spawn_agents: ['agents'],\n spawn_agents_async: ['agents'],\n spawn_agent_inline: ['agent_type', 'prompt', 'params'],\n set_output: [],\n\n // Documentation tool\n read_docs: ['libraryTitle', 'topic', 'max_tokens'],\n\n // Web search tool\n web_search: ['query', 'depth'],\n\n // File change hooks tool\n run_file_change_hooks: ['files'],\n\n // Tools that change the conversation history\n add_message: ['role', 'content'],\n set_messages: ['messages'],\n\n end_turn: [],\n} as const satisfies Record\n", - "referencedBy": {} - }, - { - "path": "common/src/tools/utils.ts", - "content": "import {\n endsAgentStepParam,\n endToolTag,\n startToolTag,\n toolNameParam,\n} from './constants'\nimport { llmToolCallSchema } from './list'\nimport { closeXml } from '../util/xml'\n\nimport type { StringToolResultPart, ToolName } from './constants'\nimport type z from 'zod/v4'\n\nexport function getToolCallString(\n toolName: T,\n params: T extends ToolName\n ? z.input<(typeof llmToolCallSchema)[T]['parameters']>\n : Record,\n ...endsAgentStep: T extends ToolName ? [] : [boolean]\n): string {\n const endsAgentStepValue =\n toolName in llmToolCallSchema\n ? llmToolCallSchema[toolName as keyof typeof llmToolCallSchema]\n .endsAgentStep\n : endsAgentStep[0]\n const obj: Record = {\n [toolNameParam]: toolName,\n ...params,\n }\n if (endsAgentStepValue) {\n obj[endsAgentStepParam] = endsAgentStepValue satisfies true\n }\n return [startToolTag, JSON.stringify(obj, null, 2), endToolTag].join('')\n}\n\nexport function renderToolResults(toolResults: StringToolResultPart[]): string {\n if (toolResults.length === 0) {\n return ''\n }\n\n return `\n${toolResults\n .map(\n (result) => `\n${result.toolName}${closeXml('tool')}\n${result.result}${closeXml('result')}\n${closeXml('tool_result')}`,\n )\n .join('\\n\\n')}\n`.trim()\n}\n", - "referencedBy": {} - }, - { - "path": "common/src/tools/compile-tool-definitions.ts", - "content": "import z from 'zod/v4'\n\nimport { llmToolCallSchema } from './list'\n\n/**\n * Compiles all tool definitions into a single TypeScript definition file content.\n * This generates type definitions for all available tools and their parameters.\n */\nexport function compileToolDefinitions(): string {\n const toolEntries = Object.entries(llmToolCallSchema)\n\n const toolInterfaces = toolEntries\n .map(([toolName, toolDef]) => {\n const parameterSchema = toolDef.parameters\n\n // Convert Zod schema to TypeScript interface using JSON schema\n let typeDefinition: string\n try {\n const jsonSchema = z.toJSONSchema(parameterSchema)\n typeDefinition = jsonSchemaToTypeScript(jsonSchema)\n } catch (error) {\n console.warn(`Failed to convert schema for ${toolName}:`, error)\n typeDefinition = '{ [key: string]: any }'\n }\n\n return `/**\n * ${parameterSchema.description || `Parameters for ${toolName} tool`}\n */\nexport interface ${toPascalCase(toolName)}Params ${typeDefinition}`\n })\n .join('\\n\\n')\n\n const toolUnion = toolEntries.map(([toolName]) => `'${toolName}'`).join(' | ')\n\n const toolParamsMap = toolEntries\n .map(([toolName]) => ` '${toolName}': ${toPascalCase(toolName)}Params`)\n .join('\\n')\n\n return `/**\n * Union type of all available tool names\n */\nexport type ToolName = ${toolUnion}\n\n/**\n * Map of tool names to their parameter types\n */\nexport interface ToolParamsMap {\n${toolParamsMap}\n}\n\n${toolInterfaces}\n\n/**\n * Get parameters type for a specific tool\n */\nexport type GetToolParams = ToolParamsMap[T]\n`\n}\n\n/**\n * Converts kebab-case to PascalCase\n * e.g., 'write-file' -> 'WriteFile'\n */\nfunction toPascalCase(str: string): string {\n return str\n .split(/[-_]/)\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1))\n .join('')\n}\n\n/**\n * Converts JSON Schema to TypeScript interface definition\n */\nfunction jsonSchemaToTypeScript(schema: any): string {\n if (schema.type === 'object' && schema.properties) {\n const properties = Object.entries(schema.properties).map(\n ([key, prop]: [string, any]) => {\n const isOptional = !schema.required?.includes(key)\n const propType = getTypeFromJsonSchema(prop)\n const comment = prop.description ? ` /** ${prop.description} */\\n` : ''\n return `${comment} \"${key}\"${isOptional ? '?' : ''}: ${propType}`\n },\n )\n return `{\\n${properties.join('\\n')}\\n}`\n }\n return getTypeFromJsonSchema(schema)\n}\n\n/**\n * Gets TypeScript type from JSON Schema property\n */\nfunction getTypeFromJsonSchema(prop: any): string {\n if (prop.type === 'string') {\n if (prop.enum) {\n return prop.enum.map((v: string) => `\"${v}\"`).join(' | ')\n }\n return 'string'\n }\n if (prop.type === 'number' || prop.type === 'integer') return 'number'\n if (prop.type === 'boolean') return 'boolean'\n if (prop.type === 'array') {\n const itemType = prop.items ? getTypeFromJsonSchema(prop.items) : 'any'\n return `${itemType}[]`\n }\n if (prop.type === 'object') {\n if (prop.properties) {\n return jsonSchemaToTypeScript(prop)\n }\n if (prop.additionalProperties) {\n const valueType = getTypeFromJsonSchema(prop.additionalProperties)\n return `Record`\n }\n return 'Record'\n }\n if (prop.anyOf || prop.oneOf) {\n const schemas = prop.anyOf || prop.oneOf\n return schemas.map((s: any) => getTypeFromJsonSchema(s)).join(' | ')\n }\n return 'any'\n}\n", - "referencedBy": {} - }, - { - "path": "common/src/types/dynamic-agent-template.ts", - "content": "import { z } from 'zod'\n\nimport { ALLOWED_MODEL_PREFIXES, models } from '../constants'\nimport { toolNames } from '../tools/constants'\n\n// Filter models to only include those that begin with allowed prefixes\nconst filteredModels = Object.values(models).filter((model) =>\n ALLOWED_MODEL_PREFIXES.some((prefix) => model.startsWith(prefix)),\n)\n\nif (filteredModels.length === 0) {\n throw new Error('No valid models found with allowed prefixes')\n}\n\n// Simplified JSON Schema definition - supports object schemas with nested properties\nconst JsonSchemaSchema: z.ZodType = z.lazy(() =>\n z\n .object({\n type: z.literal('object'),\n description: z.string().optional(),\n properties: z\n .record(\n JsonSchemaSchema.or(\n z\n .object({\n type: z.enum([\n 'string',\n 'number',\n 'integer',\n 'boolean',\n 'array',\n ]),\n description: z.string().optional(),\n enum: z.array(z.any()).optional(),\n })\n .passthrough(),\n ),\n )\n .optional(),\n required: z.array(z.string()).optional(),\n })\n .passthrough(),\n)\n\n// Schema for the combined inputSchema object\nconst InputSchemaObjectSchema = z\n .object({\n prompt: z\n .object({\n type: z.literal('string'),\n description: z.string().optional(),\n })\n .passthrough()\n .optional(), // Optional JSON schema for prompt validation\n params: JsonSchemaSchema.optional(), // Optional JSON schema for params validation\n })\n .optional()\n\n// Schema for prompt fields that can be either a string or a path reference\nconst PromptFieldSchema = z.union([\n z.string(), // Direct string content\n z.object({ path: z.string() }), // Path reference to external file\n])\nexport type PromptField = z.infer\n\n// Schema for validating handleSteps function signature\nconst HandleStepsSchema = z\n .function()\n .args(\n z.object({\n agentState: z.object({\n agentId: z.string(),\n parentId: z.string(),\n messageHistory: z.array(z.any()),\n }),\n prompt: z.string().optional(),\n params: z.any().optional(),\n }),\n )\n .returns(z.any())\n .optional()\n\n// Validates the Typescript template file.\nexport const DynamicAgentDefinitionSchema = z.object({\n id: z\n .string()\n .regex(\n /^[a-z0-9-]+$/,\n 'Agent ID must contain only lowercase letters, numbers, and hyphens',\n ), // The unique identifier for this agent\n version: z.string().optional(),\n publisher: z.string().optional(),\n\n // Required fields for new agents\n displayName: z.string(),\n model: z.string(),\n\n // Tools and spawnable agents\n toolNames: z\n .array(z.enum(toolNames))\n .optional()\n .default([])\n .refine(\n (tools) => {\n if (!tools) return true\n const validToolNames = toolNames as readonly string[]\n const invalidTools = tools.filter(\n (tool) => !validToolNames.includes(tool),\n )\n return invalidTools.length === 0\n },\n (tools) => {\n if (!tools) return { message: 'Tools array is undefined' }\n const validToolNames = toolNames as readonly string[]\n const invalidTools = tools.filter(\n (tool) => !validToolNames.includes(tool),\n )\n return {\n message: `Invalid tool names: ${invalidTools.join(', ')}. Available tools: ${toolNames.join(', ')}`,\n }\n },\n ),\n spawnableAgents: z.array(z.string()).optional().default([]),\n\n // Input and output\n inputSchema: InputSchemaObjectSchema,\n includeMessageHistory: z.boolean().default(true),\n outputMode: z\n .enum(['last_message', 'all_messages', 'structured_output'])\n .default('last_message'),\n outputSchema: JsonSchemaSchema.optional(), // Optional JSON schema for output validation\n\n // Prompts\n parentPrompt: z.string().optional(),\n systemPrompt: z.string().optional(),\n instructionsPrompt: z.string().optional(),\n stepPrompt: z.string().optional(),\n\n // Optional generator function for programmatic agents\n handleSteps: z.union([HandleStepsSchema, z.string()]).optional(),\n})\nexport type DynamicAgentDefinition = z.input<\n typeof DynamicAgentDefinitionSchema\n>\nexport type DynamicAgentDefinitionParsed = z.infer<\n typeof DynamicAgentDefinitionSchema\n>\n\nexport const DynamicAgentTemplateSchema = DynamicAgentDefinitionSchema.extend({\n systemPrompt: z.string(),\n instructionsPrompt: z.string(),\n stepPrompt: z.string(),\n handleSteps: z.string().optional(), // Converted to string after processing\n})\n .refine(\n (data) => {\n // If outputSchema is provided, outputMode must be explicitly set to 'structured_output'\n if (data.outputSchema && data.outputMode !== 'structured_output') {\n return false\n }\n return true\n },\n {\n message:\n \"outputSchema requires outputMode to be explicitly set to 'structured_output'.\",\n path: ['outputMode'],\n },\n )\n .refine(\n (data) => {\n // If outputMode is 'structured_output', 'set_output' tool must be included\n if (\n data.outputMode === 'structured_output' &&\n !data.toolNames.includes('set_output')\n ) {\n return false\n }\n return true\n },\n {\n message:\n \"outputMode 'structured_output' requires the 'set_output' tool. Add 'set_output' to toolNames.\",\n path: ['toolNames'],\n },\n )\n .refine(\n (data) => {\n // If 'set_output' tool is included, outputMode must be 'structured_output'\n if (\n data.toolNames.includes('set_output') &&\n data.outputMode !== 'structured_output'\n ) {\n return false\n }\n return true\n },\n {\n message:\n \"'set_output' tool requires outputMode to be 'structured_output'. Change outputMode to 'structured_output' or remove 'set_output' from toolNames.\",\n path: ['outputMode'],\n },\n )\n .refine(\n (data) => {\n // If spawnableAgents array is non-empty, 'spawn_agents' tool must be included\n if (\n data.spawnableAgents.length > 0 &&\n !data.toolNames.includes('spawn_agents')\n ) {\n return false\n }\n return true\n },\n {\n message:\n \"Non-empty spawnableAgents array requires the 'spawn_agents' tool. Add 'spawn_agents' to toolNames or remove spawnableAgents.\",\n path: ['toolNames'],\n },\n )\nexport type DynamicAgentTemplate = z.infer\n", - "referencedBy": {} - }, - { - "path": "common/src/types/agent-template.ts", - "content": "import type { Model } from '../constants'\nimport type { AgentState, AgentTemplateType } from './session-state'\nimport type { ToolName } from '../tools/constants'\nimport type { ToolCall } from '../util/types/agent-definition'\nimport type { z } from 'zod/v4'\n\nexport type AgentTemplate<\n P = string | undefined,\n T = Record | undefined,\n> = {\n id: AgentTemplateType\n displayName: string\n model: Model\n\n toolNames: ToolName[]\n spawnableAgents: AgentTemplateType[]\n\n parentPrompt?: string\n systemPrompt: string\n instructionsPrompt: string\n stepPrompt: string\n parentInstructions?: Record\n\n // Required parameters for spawning this agent.\n inputSchema: {\n prompt?: z.ZodSchema

\n params?: z.ZodSchema\n }\n includeMessageHistory: boolean\n outputMode: 'last_message' | 'all_messages' | 'structured_output'\n outputSchema?: z.ZodSchema\n\n handleSteps?: StepHandler | string // Function or string of the generator code for running in a sandbox\n}\n\nexport type StepGenerator = Generator<\n Omit | 'STEP' | 'STEP_ALL', // Generic tool call type\n void,\n { agentState: AgentState; toolResult: string | undefined }\n>\n\nexport type StepHandler<\n P = string | undefined,\n T = Record | undefined,\n> = (params: { agentState: AgentState; prompt: P; params: T }) => StepGenerator\n", - "referencedBy": {} - }, - { - "path": "common/src/util/xml.ts", - "content": "/**\n * Generate a closing XML tag for a single tool name\n * @param toolName Single tool name to generate closing tag for\n * @returns Closing XML tag string\n */\nexport function closeXml(toolName: string): string {\n return ``\n}\n\n/**\n * Generate stop sequences (closing XML tags) for a list of tool names\n * @param toolNames Array of tool names to generate closing tags for\n * @returns Array of closing XML tag strings\n */\nexport function getStopSequences(toolNames: readonly string[]): string[] {\n return toolNames.map((toolName) => ``)\n}\n", - "referencedBy": {} - }, - { - "path": "common/src/websockets/websocket-schema.ts", - "content": "import { z } from 'zod'\n\nimport { CLIENT_ACTION_SCHEMA, SERVER_ACTION_SCHEMA } from '../actions'\n\nexport const CLIENT_MESSAGE_SCHEMAS = {\n identify: z.object({\n type: z.literal('identify'),\n txid: z.number(),\n clientSessionId: z.string(),\n }),\n subscribe: z.object({\n type: z.literal('subscribe'),\n txid: z.number(),\n topics: z.array(z.string()),\n }),\n unsubscribe: z.object({\n type: z.literal('unsubscribe'),\n txid: z.number(),\n topics: z.array(z.string()),\n }),\n ping: z.object({\n type: z.literal('ping'),\n txid: z.number(),\n }),\n action: z.object({\n type: z.literal('action'),\n txid: z.number(),\n data: CLIENT_ACTION_SCHEMA,\n }),\n} as const\n\nexport const CLIENT_MESSAGE_SCHEMA = z.union([\n CLIENT_MESSAGE_SCHEMAS.identify,\n CLIENT_MESSAGE_SCHEMAS.subscribe,\n CLIENT_MESSAGE_SCHEMAS.unsubscribe,\n CLIENT_MESSAGE_SCHEMAS.ping,\n CLIENT_MESSAGE_SCHEMAS.action,\n])\n\nexport type ClientMessageType = keyof typeof CLIENT_MESSAGE_SCHEMAS\nexport type ClientMessage =\n z.infer<(typeof CLIENT_MESSAGE_SCHEMAS)[T]>\n\nexport const SERVER_MESSAGE_SCHEMAS = {\n ack: z.object({\n type: z.literal('ack'),\n txid: z.number().optional(),\n success: z.boolean(),\n error: z.string().optional(),\n }),\n action: z.object({\n type: z.literal('action'),\n data: SERVER_ACTION_SCHEMA,\n }),\n}\n\nexport const SERVER_MESSAGE_SCHEMA = z.union([\n SERVER_MESSAGE_SCHEMAS.ack,\n SERVER_MESSAGE_SCHEMAS.action,\n])\n\nexport type ServerMessageType = keyof typeof SERVER_MESSAGE_SCHEMAS\nexport type ServerMessage =\n z.infer<(typeof SERVER_MESSAGE_SCHEMAS)[T]>\n", - "referencedBy": {} - } - ] - } - ], - "parentAgentId": "D-UppvyfWNM" - }, - { - "type": "text", - "agentId": "D-UppvyfWNM", - "text": "Okay, here's a concise report of files related to tool types, unions, and interfaces:\n\n* **sdk/src/types/tools.ts**: Defines the `ToolName` union (all available tool names) and the `ToolParamsMap` interface (mapping tool names to their parameter types). This is central to understanding available tools and their required parameters.\n* **sdk/src/types/agent-definition.ts**: Defines the `AgentDefinition` interface, which includes `toolNames` (an array of `ToolName`) and references `ToolCall` (for the `handleSteps` function). This file is critical for defining agents and their capabilities.\n* **common/src/tools/constants.ts**: Defines `ToolName` union, `toolXmlName`, and other constants related to tool calls.\n* **common/src/tools/list.ts**: Defines `llmToolCallSchema` which specifies the parameter schema for each tool. Also defines `clientToolCallSchema` used in the client.\n* **common/src/tools/compile-tool-definitions.ts**: Compiles tool definitions into TypeScript, generating type definitions for tools and their parameters.\n* **common/src/util/xml.ts**: Utility functions for generating XML tags for tool calls and stop sequences.\n* **common/src/types/dynamic-agent-template.ts**: Defines `DynamicAgentDefinitionSchema` which includes validation for tool usage.\n\nThese are potentially the most relevant files for understanding how tool types are defined and used within the codebase.\n" - }, - { - "type": "subagent_finish", - "agentId": "D-UppvyfWNM", - "agentType": "file-picker", - "displayName": "Fletcher the File Fetcher", - "onlyChild": false, - "parentAgentId": "main-agent", - "prompt": "Find files in sdk/src and common/src that define or use tool types, unions, or interfaces like ToolCall, ToolSchema, etc." - }, - { - "type": "text", - "agentId": "D-UppjyUa0E", - "text": "common/src/tools/compile-tool-definitions.ts\ncommon/src/tools/list.ts\ncommon/src/tools/constants.ts\ncommon/src/tools/utils.ts\ncommon/src/tools/params/tool/add-message.ts\ncommon/src/tools/params/tool/add-subgoal.ts\ncommon/src/tools/params/tool/code-search.ts\ncommon/src/tools/params/tool/find-files.ts\ncommon/src/tools/params/tool/read-files.ts\ncommon/src/types/api/agents/publish.ts\nsdk/scripts/publish.js\nsdk/src/types/tools.ts" - }, - { - "type": "subagent_finish", - "agentId": "D-Up4CDP0Kk", - "agentType": "file-lister", - "displayName": "Liszt the File Lister", - "onlyChild": true, - "parentAgentId": "D-UppjyUa0E", - "prompt": "Find files handling tool type generation, regeneration, or publishing in SDK and common packages.", - "params": {} - }, - { - "type": "tool_result", - "toolCallId": "c0209f42-5bb0-47b7-aabf-0376e2e259dc", - "toolName": "spawn_agents", - "output": [ - { - "type": "json", - "value": [ - { - "agentName": "Liszt the File Lister", - "agentType": "file-lister", - "value": { - "type": "lastMessage", - "value": [ - { - "role": "assistant", - "content": [ - { - "type": "text", - "text": "common/src/tools/compile-tool-definitions.ts\ncommon/src/tools/list.ts\ncommon/src/tools/constants.ts\ncommon/src/tools/utils.ts\ncommon/src/tools/params/tool/add-message.ts\ncommon/src/tools/params/tool/add-subgoal.ts\ncommon/src/tools/params/tool/code-search.ts\ncommon/src/tools/params/tool/find-files.ts\ncommon/src/tools/params/tool/read-files.ts\ncommon/src/types/api/agents/publish.ts\nsdk/scripts/publish.js\nsdk/src/types/tools.ts" - } - ] - } - ] - } - } - ] - } - ], - "parentAgentId": "D-UppjyUa0E" - }, - { - "type": "tool_call", - "toolCallId": "cf990849-3a75-4da5-9a46-6aad675dece2", - "toolName": "read_files", - "input": { - "paths": [ - "common/src/tools/compile-tool-definitions.ts", - "common/src/tools/list.ts", - "common/src/tools/constants.ts", - "common/src/tools/utils.ts", - "common/src/tools/params/tool/add-message.ts", - "common/src/tools/params/tool/add-subgoal.ts", - "common/src/tools/params/tool/code-search.ts", - "common/src/tools/params/tool/find-files.ts", - "common/src/tools/params/tool/read-files.ts", - "common/src/types/api/agents/publish.ts", - "sdk/scripts/publish.js", - "sdk/src/types/tools.ts" - ] - }, - "agentId": "D-UppjyUa0E", - "parentAgentId": "main-agent", - "includeToolCall": true - }, - { - "type": "tool_result", - "toolCallId": "cf990849-3a75-4da5-9a46-6aad675dece2", - "toolName": "read_files", - "output": [ - { - "type": "json", - "value": [ - { - "path": "common/src/tools/compile-tool-definitions.ts", - "content": "import z from 'zod/v4'\n\nimport { llmToolCallSchema } from './list'\n\n/**\n * Compiles all tool definitions into a single TypeScript definition file content.\n * This generates type definitions for all available tools and their parameters.\n */\nexport function compileToolDefinitions(): string {\n const toolEntries = Object.entries(llmToolCallSchema)\n\n const toolInterfaces = toolEntries\n .map(([toolName, toolDef]) => {\n const parameterSchema = toolDef.parameters\n\n // Convert Zod schema to TypeScript interface using JSON schema\n let typeDefinition: string\n try {\n const jsonSchema = z.toJSONSchema(parameterSchema)\n typeDefinition = jsonSchemaToTypeScript(jsonSchema)\n } catch (error) {\n console.warn(`Failed to convert schema for ${toolName}:`, error)\n typeDefinition = '{ [key: string]: any }'\n }\n\n return `/**\n * ${parameterSchema.description || `Parameters for ${toolName} tool`}\n */\nexport interface ${toPascalCase(toolName)}Params ${typeDefinition}`\n })\n .join('\\n\\n')\n\n const toolUnion = toolEntries.map(([toolName]) => `'${toolName}'`).join(' | ')\n\n const toolParamsMap = toolEntries\n .map(([toolName]) => ` '${toolName}': ${toPascalCase(toolName)}Params`)\n .join('\\n')\n\n return `/**\n * Union type of all available tool names\n */\nexport type ToolName = ${toolUnion}\n\n/**\n * Map of tool names to their parameter types\n */\nexport interface ToolParamsMap {\n${toolParamsMap}\n}\n\n${toolInterfaces}\n\n/**\n * Get parameters type for a specific tool\n */\nexport type GetToolParams = ToolParamsMap[T]\n`\n}\n\n/**\n * Converts kebab-case to PascalCase\n * e.g., 'write-file' -> 'WriteFile'\n */\nfunction toPascalCase(str: string): string {\n return str\n .split(/[-_]/)\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1))\n .join('')\n}\n\n/**\n * Converts JSON Schema to TypeScript interface definition\n */\nfunction jsonSchemaToTypeScript(schema: any): string {\n if (schema.type === 'object' && schema.properties) {\n const properties = Object.entries(schema.properties).map(\n ([key, prop]: [string, any]) => {\n const isOptional = !schema.required?.includes(key)\n const propType = getTypeFromJsonSchema(prop)\n const comment = prop.description ? ` /** ${prop.description} */\\n` : ''\n return `${comment} \"${key}\"${isOptional ? '?' : ''}: ${propType}`\n },\n )\n return `{\\n${properties.join('\\n')}\\n}`\n }\n return getTypeFromJsonSchema(schema)\n}\n\n/**\n * Gets TypeScript type from JSON Schema property\n */\nfunction getTypeFromJsonSchema(prop: any): string {\n if (prop.type === 'string') {\n if (prop.enum) {\n return prop.enum.map((v: string) => `\"${v}\"`).join(' | ')\n }\n return 'string'\n }\n if (prop.type === 'number' || prop.type === 'integer') return 'number'\n if (prop.type === 'boolean') return 'boolean'\n if (prop.type === 'array') {\n const itemType = prop.items ? getTypeFromJsonSchema(prop.items) : 'any'\n return `${itemType}[]`\n }\n if (prop.type === 'object') {\n if (prop.properties) {\n return jsonSchemaToTypeScript(prop)\n }\n if (prop.additionalProperties) {\n const valueType = getTypeFromJsonSchema(prop.additionalProperties)\n return `Record`\n }\n return 'Record'\n }\n if (prop.anyOf || prop.oneOf) {\n const schemas = prop.anyOf || prop.oneOf\n return schemas.map((s: any) => getTypeFromJsonSchema(s)).join(' | ')\n }\n return 'any'\n}\n", - "referencedBy": {} - }, - { - "path": "common/src/tools/list.ts", - "content": "import { addMessageParams } from './params/tool/add-message'\nimport { addSubgoalParams } from './params/tool/add-subgoal'\nimport { browserLogsParams } from './params/tool/browser-logs'\nimport { codeSearchParams } from './params/tool/code-search'\nimport { createPlanParams } from './params/tool/create-plan'\nimport { endTurnParams } from './params/tool/end-turn'\nimport { findFilesParams } from './params/tool/find-files'\nimport { readDocsParams } from './params/tool/read-docs'\nimport { readFilesParams } from './params/tool/read-files'\nimport { runFileChangeHooksParams } from './params/tool/run-file-change-hooks'\nimport { runTerminalCommandParams } from './params/tool/run-terminal-command'\nimport { setMessagesParams } from './params/tool/set-messages'\nimport { setOutputParams } from './params/tool/set-output'\nimport { spawnAgentsParams } from './params/tool/spawn-agents'\nimport { spawnAgentsAsyncParams } from './params/tool/spawn-agents-async'\nimport { spawnAgentInlineParams } from './params/tool/spawn-agent-inline'\nimport { strReplaceParams } from './params/tool/str-replace'\nimport { thinkDeeplyParams } from './params/tool/think-deeply'\nimport { updateSubgoalParams } from './params/tool/update-subgoal'\nimport { webSearchParams } from './params/tool/web-search'\nimport { writeFileParams } from './params/tool/write-file'\n\nimport type { ToolName, ToolParams } from './constants'\n\nexport const llmToolCallSchema = {\n add_message: addMessageParams,\n add_subgoal: addSubgoalParams,\n browser_logs: browserLogsParams,\n code_search: codeSearchParams,\n create_plan: createPlanParams,\n end_turn: endTurnParams,\n find_files: findFilesParams,\n read_docs: readDocsParams,\n read_files: readFilesParams,\n run_file_change_hooks: runFileChangeHooksParams,\n run_terminal_command: runTerminalCommandParams,\n set_messages: setMessagesParams,\n set_output: setOutputParams,\n spawn_agents: spawnAgentsParams,\n spawn_agents_async: spawnAgentsAsyncParams,\n spawn_agent_inline: spawnAgentInlineParams,\n str_replace: strReplaceParams,\n think_deeply: thinkDeeplyParams,\n update_subgoal: updateSubgoalParams,\n web_search: webSearchParams,\n write_file: writeFileParams,\n} satisfies {\n [K in ToolName]: ToolParams\n}\n\nexport const clientToolCallSchema = {\n // Tools that require an id and objective\n add_subgoal: ['id', 'objective', 'status', 'plan', 'log'],\n update_subgoal: ['id', 'status', 'plan', 'log'],\n\n // File operations\n write_file: ['path', 'instructions', 'content'],\n str_replace: ['path', 'replacements'],\n read_files: ['paths'],\n find_files: ['prompt'],\n\n // Search and terminal\n code_search: ['pattern', 'flags', 'cwd'],\n run_terminal_command: ['command', 'process_type', 'cwd', 'timeout_seconds'],\n\n // Planning tools\n think_deeply: ['thought'],\n create_plan: ['path', 'plan'],\n\n browser_logs: ['type', 'url', 'waitUntil'],\n\n spawn_agents: ['agents'],\n spawn_agents_async: ['agents'],\n spawn_agent_inline: ['agent_type', 'prompt', 'params'],\n set_output: [],\n\n // Documentation tool\n read_docs: ['libraryTitle', 'topic', 'max_tokens'],\n\n // Web search tool\n web_search: ['query', 'depth'],\n\n // File change hooks tool\n run_file_change_hooks: ['files'],\n\n // Tools that change the conversation history\n add_message: ['role', 'content'],\n set_messages: ['messages'],\n\n end_turn: [],\n} as const satisfies Record\n", - "referencedBy": {} - }, - { - "path": "common/src/tools/constants.ts", - "content": "import type { ToolResultPart } from 'ai'\nimport type z from 'zod/v4'\n\nexport const toolNameParam = 'cb_tool_name'\nexport const endsAgentStepParam = 'cb_easp'\nexport const toolXmlName = 'codebuff_tool_call'\nexport const startToolTag = `<${toolXmlName}>\\n`\nexport const endToolTag = `\\n`\n\nexport const TOOLS_WHICH_WONT_FORCE_NEXT_STEP = ['think_deeply']\n\n// List of all available tools\nexport const toolNames = [\n 'add_subgoal',\n 'add_message',\n 'browser_logs',\n 'code_search',\n 'create_plan',\n 'end_turn',\n 'find_files',\n 'read_docs',\n 'read_files',\n 'run_file_change_hooks',\n 'run_terminal_command',\n 'set_messages',\n 'set_output',\n 'spawn_agents',\n 'spawn_agents_async',\n 'spawn_agent_inline',\n 'str_replace',\n 'think_deeply',\n 'update_subgoal',\n 'web_search',\n 'write_file',\n] as const\n\nexport type ToolName = (typeof toolNames)[number]\n\nexport type ToolParams = {\n toolName: T\n endsAgentStep: boolean\n parameters: z.ZodType\n}\n\nexport type StringToolResultPart = Omit & {\n result: string\n}\n", - "referencedBy": {} - }, - { - "path": "common/src/tools/utils.ts", - "content": "import {\n endsAgentStepParam,\n endToolTag,\n startToolTag,\n toolNameParam,\n} from './constants'\nimport { llmToolCallSchema } from './list'\nimport { closeXml } from '../util/xml'\n\nimport type { StringToolResultPart, ToolName } from './constants'\nimport type z from 'zod/v4'\n\nexport function getToolCallString(\n toolName: T,\n params: T extends ToolName\n ? z.input<(typeof llmToolCallSchema)[T]['parameters']>\n : Record,\n ...endsAgentStep: T extends ToolName ? [] : [boolean]\n): string {\n const endsAgentStepValue =\n toolName in llmToolCallSchema\n ? llmToolCallSchema[toolName as keyof typeof llmToolCallSchema]\n .endsAgentStep\n : endsAgentStep[0]\n const obj: Record = {\n [toolNameParam]: toolName,\n ...params,\n }\n if (endsAgentStepValue) {\n obj[endsAgentStepParam] = endsAgentStepValue satisfies true\n }\n return [startToolTag, JSON.stringify(obj, null, 2), endToolTag].join('')\n}\n\nexport function renderToolResults(toolResults: StringToolResultPart[]): string {\n if (toolResults.length === 0) {\n return ''\n }\n\n return `\n${toolResults\n .map(\n (result) => `\n${result.toolName}${closeXml('tool')}\n${result.result}${closeXml('result')}\n${closeXml('tool_result')}`,\n )\n .join('\\n\\n')}\n`.trim()\n}\n", - "referencedBy": {} - }, - { - "path": "common/src/tools/params/tool/add-message.ts", - "content": "import z from 'zod/v4'\n\nimport type { ToolParams } from '../../constants'\n\nconst toolName = 'add_message'\nconst endsAgentStep = true\nexport const addMessageParams = {\n toolName,\n endsAgentStep,\n parameters: z\n .object({\n role: z.enum(['user', 'assistant']),\n content: z.string(),\n })\n .describe(\n `Add a new message to the conversation history. To be used for complex requests that can't be solved in a single step, as you may forget what happened!`,\n ),\n} satisfies ToolParams\n", - "referencedBy": {} - }, - { - "path": "common/src/tools/params/tool/add-subgoal.ts", - "content": "import z from 'zod/v4'\n\nimport type { ToolParams } from '../../constants'\n\nconst toolName = 'add_subgoal'\nconst endsAgentStep = false\nexport const addSubgoalParams = {\n toolName,\n endsAgentStep,\n parameters: z\n .object({\n id: z\n .string()\n .min(1, 'Id cannot be empty')\n .describe(\n `A unique identifier for the subgoal. Try to choose the next sequential integer that is not already in use.`,\n ),\n objective: z\n .string()\n .min(1, 'Objective cannot be empty')\n .describe(\n `The objective of the subgoal, concisely and clearly stated.`,\n ),\n status: z\n .enum(['NOT_STARTED', 'IN_PROGRESS', 'COMPLETE', 'ABORTED'])\n .describe(`The status of the subgoal.`),\n plan: z.string().optional().describe('A plan for the subgoal.'),\n log: z\n .string()\n .optional()\n .describe('A log message for the subgoal progress.'),\n })\n .describe(\n `Add a new subgoal for tracking progress. To be used for complex requests that can't be solved in a single step, as you may forget what happened!`,\n ),\n} satisfies ToolParams\n", - "referencedBy": {} - }, - { - "path": "common/src/tools/params/tool/code-search.ts", - "content": "import z from 'zod/v4'\n\nimport type { ToolParams } from '../../constants'\n\nconst toolName = 'code_search'\nconst endsAgentStep = true\nexport const codeSearchParams = {\n toolName,\n endsAgentStep,\n parameters: z\n .object({\n pattern: z\n .string()\n .min(1, 'Pattern cannot be empty')\n .describe(`The pattern to search for.`),\n flags: z\n .string()\n .optional()\n .describe(\n `Optional ripgrep flags to customize the search (e.g., \"-i\" for case-insensitive, \"-t ts\" for TypeScript files only, \"-A 3\" for 3 lines after match, \"-B 2\" for 2 lines before match, \"--type-not test\" to exclude test files).`,\n ),\n cwd: z\n .string()\n .optional()\n .describe(\n `Optional working directory to search within, relative to the project root. Defaults to searching the entire project.`,\n ),\n })\n .describe(\n `Search for string patterns in the project's files. This tool uses ripgrep (rg), a fast line-oriented search tool. Use this tool only when read_files is not sufficient to find the files you need.`,\n ),\n} satisfies ToolParams\n", - "referencedBy": {} - }, - { - "path": "common/src/tools/params/tool/find-files.ts", - "content": "import z from 'zod/v4'\n\nimport type { ToolParams } from '../../constants'\n\nconst toolName = 'find_files'\nconst endsAgentStep = true\nexport const findFilesParams = {\n toolName,\n endsAgentStep,\n parameters: z\n .object({\n prompt: z\n .string()\n .min(1, 'Prompt cannot be empty')\n .describe(\n `A brief natural language description of the files or the name of a function or class you are looking for. It's also helpful to mention a directory or two to look within.`,\n ),\n })\n .describe(\n `Find several files related to a brief natural language description of the files or the name of a function or class you are looking for.`,\n ),\n} satisfies ToolParams\n", - "referencedBy": {} - }, - { - "path": "common/src/tools/params/tool/read-files.ts", - "content": "import z from 'zod/v4'\n\nimport type { ToolParams } from '../../constants'\n\nconst toolName = 'read_files'\nconst endsAgentStep = true\nexport const readFilesParams = {\n toolName,\n endsAgentStep,\n parameters: z\n .object({\n paths: z\n .array(\n z\n .string()\n .min(1, 'Paths cannot be empty')\n .describe(\n `File path to read relative to the **project root**. Absolute file paths will not work.`,\n ),\n )\n .describe('List of file paths to read.'),\n })\n .describe(\n `Read the multiple files from disk and return their contents. Use this tool to read as many files as would be helpful to answer the user's request.`,\n ),\n} satisfies ToolParams\n", - "referencedBy": {} - }, - { - "path": "common/src/types/api/agents/publish.ts", - "content": "import { z } from 'zod'\n\nimport { DynamicAgentTemplateSchema } from '../../../types/dynamic-agent-template'\n\nexport const publishAgentsRequestSchema = z.object({\n data: DynamicAgentTemplateSchema.array(),\n authToken: z.string(),\n})\nexport type PublishAgentsRequest = z.infer\n\nexport const publishAgentsSuccessResponseSchema = z.object({\n success: z.literal(true),\n publisherId: z.string(),\n agents: z\n .object({\n id: z.string(),\n version: z.string(),\n displayName: z.string(),\n })\n .array(),\n})\nexport type PublishAgentsSuccessResponse = z.infer<\n typeof publishAgentsSuccessResponseSchema\n>\n\nexport const publishAgentsErrorResponseSchema = z.object({\n success: z.literal(false),\n error: z.string(),\n details: z.string().optional(),\n availablePublishers: z\n .object({\n id: z.string(),\n name: z.string(),\n ownershipType: z.enum(['user', 'organization']),\n organizationName: z.string().optional(),\n })\n .array()\n .optional(),\n validationErrors: z\n .object({\n code: z.string(),\n message: z.string(),\n path: z.array(z.string()),\n })\n .array()\n .optional(),\n})\nexport type PublishAgentsErrorResponse = z.infer<\n typeof publishAgentsErrorResponseSchema\n>\n\nexport const publishAgentsResponseSchema = z.discriminatedUnion('success', [\n publishAgentsSuccessResponseSchema,\n publishAgentsErrorResponseSchema,\n])\nexport type PublishAgentsResponse = z.infer\n", - "referencedBy": {} - }, - { - "path": "sdk/scripts/publish.js", - "content": "#!/usr/bin/env node\n\nimport { execSync } from 'child_process'\nimport fs from 'fs'\nimport path from 'path'\nimport { fileURLToPath } from 'url'\n\nconst __filename = fileURLToPath(import.meta.url)\nconst __dirname = path.dirname(__filename)\n\nfunction log(message) {\n console.log(`📦 ${message}`)\n}\n\nfunction run(command, options = {}) {\n log(`Running: ${command}`)\n try {\n return execSync(command, { stdio: 'inherit', ...options })\n } catch (error) {\n console.error(`❌ Command failed: ${command}`)\n process.exit(1)\n }\n}\n\nfunction main() {\n const args = process.argv.slice(2)\n const isDryRun = args.includes('--dry-run')\n\n log('Starting SDK publishing process...')\n\n // Clean and build\n log('Cleaning previous build...')\n run('bun run clean')\n\n log('Building TypeScript...')\n run('bun run build')\n\n // Verify the package\n log('Verifying package contents...')\n run('npm pack --dry-run')\n\n if (isDryRun) {\n log('Dry run complete! Package is ready for publishing.')\n log('To publish for real, run: bun run publish-sdk')\n return\n }\n\n // Publish\n log('Publishing to npm...')\n const packageJson = JSON.parse(fs.readFileSync('package.json', 'utf8'))\n run('npm publish')\n log('✅ SDK published successfully!')\n log(`📦 Package: ${packageJson.name}@${packageJson.version}`)\n}\n\nif (import.meta.url === `file://${process.argv[1]}`) {\n main()\n}\n", - "referencedBy": {} - }, - { - "path": "sdk/src/types/tools.ts", - "content": "/**\n * Union type of all available tool names\n */\nexport type ToolName =\n | 'add_message'\n | 'add_subgoal'\n | 'browser_logs'\n | 'code_search'\n | 'create_plan'\n | 'end_turn'\n | 'find_files'\n | 'read_docs'\n | 'read_files'\n | 'run_file_change_hooks'\n | 'run_terminal_command'\n | 'set_messages'\n | 'set_output'\n | 'spawn_agents'\n | 'spawn_agents_async'\n | 'spawn_agent_inline'\n | 'str_replace'\n | 'think_deeply'\n | 'update_subgoal'\n | 'web_search'\n | 'write_file'\n\n/**\n * Map of tool names to their parameter types\n */\nexport interface ToolParamsMap {\n add_message: AddMessageParams\n add_subgoal: AddSubgoalParams\n browser_logs: BrowserLogsParams\n code_search: CodeSearchParams\n create_plan: CreatePlanParams\n end_turn: EndTurnParams\n find_files: FindFilesParams\n read_docs: ReadDocsParams\n read_files: ReadFilesParams\n run_file_change_hooks: RunFileChangeHooksParams\n run_terminal_command: RunTerminalCommandParams\n set_messages: SetMessagesParams\n set_output: SetOutputParams\n spawn_agents: SpawnAgentsParams\n spawn_agents_async: SpawnAgentsAsyncParams\n spawn_agent_inline: SpawnAgentInlineParams\n str_replace: StrReplaceParams\n think_deeply: ThinkDeeplyParams\n update_subgoal: UpdateSubgoalParams\n web_search: WebSearchParams\n write_file: WriteFileParams\n}\n\n/**\n * Add a new message to the conversation history. To be used for complex requests that can't be solved in a single step, as you may forget what happened!\n */\nexport interface AddMessageParams {\n role: 'user' | 'assistant'\n content: string\n}\n\n/**\n * Add a new subgoal for tracking progress. To be used for complex requests that can't be solved in a single step, as you may forget what happened!\n */\nexport interface AddSubgoalParams {\n /** A unique identifier for the subgoal. Try to choose the next sequential integer that is not already in use. */\n id: string\n /** The objective of the subgoal, concisely and clearly stated. */\n objective: string\n /** The status of the subgoal. */\n status: 'NOT_STARTED' | 'IN_PROGRESS' | 'COMPLETE' | 'ABORTED'\n /** A plan for the subgoal. */\n plan?: string\n /** A log message for the subgoal progress. */\n log?: string\n}\n\n/**\n * Parameters for browser_logs tool\n */\nexport interface BrowserLogsParams {\n /** The type of browser action to perform (e.g., \"navigate\"). */\n type: string\n /** The URL to navigate to. */\n url: string\n /** When to consider navigation successful. Defaults to 'load'. */\n waitUntil?: 'load' | 'domcontentloaded' | 'networkidle0'\n}\n\n/**\n * Search for string patterns in the project's files. This tool uses ripgrep (rg), a fast line-oriented search tool. Use this tool only when read_files is not sufficient to find the files you need.\n */\nexport interface CodeSearchParams {\n /** The pattern to search for. */\n pattern: string\n /** Optional ripgrep flags to customize the search (e.g., \"-i\" for case-insensitive, \"-t ts\" for TypeScript files only, \"-A 3\" for 3 lines after match, \"-B 2\" for 2 lines before match, \"--type-not test\" to exclude test files). */\n flags?: string\n /** Optional working directory to search within, relative to the project root. Defaults to searching the entire project. */\n cwd?: string\n}\n\n/**\n * Generate a detailed markdown plan for complex tasks.\n */\nexport interface CreatePlanParams {\n /** The path including the filename of a markdown file that will be overwritten with the plan. */\n path: string\n /** A detailed plan to solve the user's request. */\n plan: string\n}\n\n/**\n * End your turn, regardless of any new tool results that might be coming. This will allow the user to type another prompt.\n */\nexport interface EndTurnParams {}\n\n/**\n * Find several files related to a brief natural language description of the files or the name of a function or class you are looking for.\n */\nexport interface FindFilesParams {\n /** A brief natural language description of the files or the name of a function or class you are looking for. It's also helpful to mention a directory or two to look within. */\n prompt: string\n}\n\n/**\n * Fetch up-to-date documentation for libraries and frameworks using Context7 API.\n */\nexport interface ReadDocsParams {\n /** The exact library or framework name (e.g., \"Next.js\", \"MongoDB\", \"React\"). Use the official name as it appears in documentation, not a search query. */\n libraryTitle: string\n /** Optional specific topic to focus on (e.g., \"routing\", \"hooks\", \"authentication\") */\n topic?: string\n /** Optional maximum number of tokens to return. Defaults to 10000. Values less than 10000 are automatically increased to 10000. */\n max_tokens?: number\n}\n\n/**\n * Read the multiple files from disk and return their contents. Use this tool to read as many files as would be helpful to answer the user's request.\n */\nexport interface ReadFilesParams {\n /** List of file paths to read. */\n paths: string[]\n}\n\n/**\n * Parameters for run_file_change_hooks tool\n */\nexport interface RunFileChangeHooksParams {\n /** List of file paths that were changed and should trigger file change hooks */\n files: string[]\n}\n\n/**\n * Execute a CLI command from the **project root** (different from the user's cwd).\n */\nexport interface RunTerminalCommandParams {\n /** CLI command valid for user's OS. */\n command: string\n /** Either SYNC (waits, returns output) or BACKGROUND (runs in background). Default SYNC */\n process_type?: 'SYNC' | 'BACKGROUND'\n /** The working directory to run the command in. Default is the project root. */\n cwd?: string\n /** Set to -1 for no timeout. Does not apply for BACKGROUND commands. Default 30 */\n timeout_seconds?: number\n}\n\n/**\n * Set the conversation history to the provided messages.\n */\nexport interface SetMessagesParams {\n messages: {\n role: 'user' | 'assistant'\n content: string\n }[]\n}\n\n/**\n * JSON object to set as the agent output. This completely replaces any previous output. If the agent was spawned, this value will be passed back to its parent. If the agent has an outputSchema defined, the output will be validated against it.\n */\nexport interface SetOutputParams {}\n\n/**\n * Spawn multiple agents and send a prompt to each of them.\n */\nexport interface SpawnAgentsParams {\n agents: {\n /** Agent to spawn */\n agent_type: string\n /** Prompt to send to the agent */\n prompt?: string\n /** Parameters object for the agent (if any) */\n params?: Record\n }[]\n}\n\n/**\n * Parameters for spawn_agents_async tool\n */\nexport interface SpawnAgentsAsyncParams {\n agents: {\n /** Agent to spawn */\n agent_type: string\n /** Prompt to send to the agent */\n prompt?: string\n /** Parameters object for the agent (if any) */\n params?: Record\n }[]\n}\n\n/**\n * Spawn a single agent that runs within the current message history.\n */\nexport interface SpawnAgentInlineParams {\n /** Agent to spawn */\n agent_type: string\n /** Prompt to send to the agent */\n prompt?: string\n /** Parameters object for the agent (if any) */\n params?: Record\n}\n\n/**\n * Replace strings in a file with new strings.\n */\nexport interface StrReplaceParams {\n /** The path to the file to edit. */\n path: string\n /** Array of replacements to make. */\n replacements: {\n /** The string to replace. This must be an *exact match* of the string you want to replace, including whitespace and punctuation. */\n old: string\n /** The string to replace the corresponding old string with. Can be empty to delete. */\n new: string\n }[]\n}\n\n/**\n * Deeply consider complex tasks by brainstorming approaches and tradeoffs step-by-step.\n */\nexport interface ThinkDeeplyParams {\n /** Detailed step-by-step analysis. Initially keep each step concise (max ~5-7 words per step). */\n thought: string\n}\n\n/**\n * Update a subgoal in the context given the id, and optionally the status or plan, or a new log to append. Feel free to update any combination of the status, plan, or log in one invocation.\n */\nexport interface UpdateSubgoalParams {\n /** The id of the subgoal to update. */\n id: string\n /** Change the status of the subgoal. */\n status?: 'NOT_STARTED' | 'IN_PROGRESS' | 'COMPLETE' | 'ABORTED'\n /** Change the plan for the subgoal. */\n plan?: string\n /** Add a log message to the subgoal. This will create a new log entry and append it to the existing logs. Use this to record your progress and any new information you learned as you go. */\n log?: string\n}\n\n/**\n * Search the web for current information using Linkup API.\n */\nexport interface WebSearchParams {\n /** The search query to find relevant web content */\n query: string\n /** Search depth - 'standard' for quick results, 'deep' for more comprehensive search. Default is 'standard'. */\n depth: 'standard' | 'deep'\n}\n\n/**\n * Create or edit a file with the given content.\n */\nexport interface WriteFileParams {\n /** Path to the file relative to the **project root** */\n path: string\n /** What the change is intended to do in only one sentence. */\n instructions: string\n /** Edit snippet to apply to the file. */\n content: string\n}\n\n/**\n * Get parameters type for a specific tool\n */\nexport type GetToolParams = ToolParamsMap[T]\n", - "referencedBy": {} - } - ] - } - ], - "parentAgentId": "D-UppjyUa0E" - }, - { - "type": "text", - "agentId": "D-UppjyUa0E", - "text": "Here's a summary of the relevant files:\n\n* **`common/src/tools/compile-tool-definitions.ts`**: This file compiles tool definitions into TypeScript definitions, which is useful for tool type generation.\n* **`common/src/tools/list.ts`**: This file exports `llmToolCallSchema` and `clientToolCallSchema`, which appear to be schemas for tools, likely used in generating or validating tool types.\n* **`common/src/tools/constants.ts`**: Defines constants related to tools, and defines the `ToolName` type.\n* **`common/src/tools/utils.ts`**: This module may assist in the tool calling process.\n* **`common/src/types/api/agents/publish.ts`**: Defines schemas for publishing agents, which includes tool definitions.\n* **`sdk/scripts/publish.js`**: This script publishes the SDK to npm, which may include regenerating or updating tool definitions.\n* **`sdk/src/types/tools.ts`**: Defines TypeScript types for all available tools and their parameters within the SDK.\n" - }, - { - "type": "subagent_finish", - "agentId": "D-UppjyUa0E", - "agentType": "file-picker", - "displayName": "Fletcher the File Fetcher", - "onlyChild": false, - "parentAgentId": "main-agent", - "prompt": "Find files handling tool type generation, regeneration, or publishing in SDK and common packages." - }, - { - "type": "tool_result", - "toolCallId": "D-UpnVGjKsI", - "toolName": "spawn_agents", - "output": [ - { - "type": "json", - "value": [ - { - "agentName": "Fletcher the File Fetcher", - "agentType": "file-picker", - "value": { - "type": "lastMessage", - "value": [ - { - "role": "assistant", - "content": [ - { - "type": "text", - "text": "Here's a summary of the most relevant files:\n\n* `scripts/generate-tool-definitions.ts`: Script to regenerate tool definitions from schemas.\n* `common/src/tools/compile-tool-definitions.ts`: Compiles tool definitions into TypeScript.\n* `sdk/src/types/tools.ts`: Type definitions for tools.\n* `backend/src/tools/definitions/list.ts`: Defines available tools and their descriptions.\n* `common/src/tools/list.ts`: Schemas for validating parameters of tools.\n* `sdk/src/tools/change-file.ts`: modify files\n" - } - ] - } - ] - } - }, - { - "agentName": "Fletcher the File Fetcher", - "agentType": "file-picker", - "value": { - "type": "lastMessage", - "value": [ - { - "role": "assistant", - "content": [ - { - "type": "text", - "text": "Okay, here's a concise report of files related to tool types, unions, and interfaces:\n\n* **sdk/src/types/tools.ts**: Defines the `ToolName` union (all available tool names) and the `ToolParamsMap` interface (mapping tool names to their parameter types). This is central to understanding available tools and their required parameters.\n* **sdk/src/types/agent-definition.ts**: Defines the `AgentDefinition` interface, which includes `toolNames` (an array of `ToolName`) and references `ToolCall` (for the `handleSteps` function). This file is critical for defining agents and their capabilities.\n* **common/src/tools/constants.ts**: Defines `ToolName` union, `toolXmlName`, and other constants related to tool calls.\n* **common/src/tools/list.ts**: Defines `llmToolCallSchema` which specifies the parameter schema for each tool. Also defines `clientToolCallSchema` used in the client.\n* **common/src/tools/compile-tool-definitions.ts**: Compiles tool definitions into TypeScript, generating type definitions for tools and their parameters.\n* **common/src/util/xml.ts**: Utility functions for generating XML tags for tool calls and stop sequences.\n* **common/src/types/dynamic-agent-template.ts**: Defines `DynamicAgentDefinitionSchema` which includes validation for tool usage.\n\nThese are potentially the most relevant files for understanding how tool types are defined and used within the codebase.\n" - } - ] - } - ] - } - }, - { - "agentName": "Fletcher the File Fetcher", - "agentType": "file-picker", - "value": { - "type": "lastMessage", - "value": [ - { - "role": "assistant", - "content": [ - { - "type": "text", - "text": "Here's a summary of the relevant files:\n\n* **`common/src/tools/compile-tool-definitions.ts`**: This file compiles tool definitions into TypeScript definitions, which is useful for tool type generation.\n* **`common/src/tools/list.ts`**: This file exports `llmToolCallSchema` and `clientToolCallSchema`, which appear to be schemas for tools, likely used in generating or validating tool types.\n* **`common/src/tools/constants.ts`**: Defines constants related to tools, and defines the `ToolName` type.\n* **`common/src/tools/utils.ts`**: This module may assist in the tool calling process.\n* **`common/src/types/api/agents/publish.ts`**: Defines schemas for publishing agents, which includes tool definitions.\n* **`sdk/scripts/publish.js`**: This script publishes the SDK to npm, which may include regenerating or updating tool definitions.\n* **`sdk/src/types/tools.ts`**: Defines TypeScript types for all available tools and their parameters within the SDK.\n" - } - ] - } - ] - } - }, - { - "agentName": "Code Searcher", - "agentType": "code-searcher", - "value": { - "type": "structuredOutput", - "value": { - "results": [ - { - "stdout": "./evals/git-evals/eval-result-codebuff-mock.json:\n21: \"preContent\": \"import { spawn } from 'child_process'\\nimport fs from 'fs'\\nimport path from 'path'\\n\\nimport { FileChange } from 'common/actions'\\nimport { models, TEST_USER_ID } from 'common/constants'\\nimport { getToolCallString } from 'common/src/constants/tools'\\nimport { z } from 'zod'\\n\\nimport { promptFlashWithFallbacks } from './llm-apis/gemini-with-fallbacks'\\nimport { gitCommitGuidePrompt } from './system-prompt/prompts'\\n\\nconst tools = [\\n {\\n name: 'add_subgoal',\\n description: `\\n### add_subgoal\\nDescription: Add a new subgoal for tracking progress. To be used for complex requests that can't be solved in a single step, as you may forget what happened!\\nParameters:\\n- id: (required) A unique identifier for the subgoal. Try to choose the next sequential integer that is not already in use.\\n- objective: (required) The objective of the subgoal, concisely and clearly stated.\\n- status: (required) The status of the subgoal. One of [\\\"NOT_STARTED\\\", \\\"IN_PROGRESS\\\", \\\"COMPLETE\\\", \\\"ABORTED\\\"]\\n- plan: (optional) A plan for the subgoal.\\nUsage:\\n${getToolCallString('add_subgoal', {\\n id: '1',\\n objective: 'Add a new \\\"deploy api\\\" subgoal',\\n status: 'IN_PROGRESS',\\n})}\\n `.trim(),\\n },\\n {\\n name: 'update_subgoal',\\n description: `\\n### update_subgoal\\nDescription: Update a subgoal in the context given the id, and optionally the status or plan, or a new log to append. Feel free to update any combination of the status, plan, or log in one invocation.\\nParameters:\\n- id: (required) The id of the subgoal to update.\\n- status: (optional) Change the status of the subgoal. One of [\\\"NOT_STARTED\\\", \\\"IN_PROGRESS\\\", \\\"COMPLETE\\\", \\\"FAILED\\\"]\\n- plan: (optional) Change the plan for the subgoal.\\n- log: (optional) Add a log message to the subgoal. This will create a new log entry and append it to the existing logs. Use this to record your progress and any new information you learned as you go.\\nUsage 1 (update status):\\n${getToolCallString('update_subgoal', {\\n id: '1',\\n status: 'COMPLETE',\\n})}\\n\\nUsage 2 (update plan):\\n${getToolCallString('update_subgoal', {\\n id: '3',\\n plan: 'Create a file for the endpoint in the api, and register it in the router',\\n})}\\n\\nUsage 3 (add log):\\n${getToolCallString('update_subgoal', {\\n id: '1',\\n log: \\\"I found the error in the tests, it's in the foo function.\\\",\\n})}\\n\\nUsage 4 (update status and add log):\\n${getToolCallString('update_subgoal', {\\n id: '1',\\n status: 'COMPLETE',\\n log: 'I reran the tests and they passed.',\\n})}\\n `.trim(),\\n },\\n {\\n name: 'write_file',\\n description: `\\n### write_file\\nDescription: Create or edit a file with the given content.\\n\\nWhen editing a file, please use this tool to output a simplified version of the code block that highlights the changes necessary and adds comments to indicate where unchanged code has been skipped.\\n\\n--- IMPORTANT OPTIMIZATION DETAIL ---\\nUse \\\"placeholder comments\\\" i.e. \\\"// ... existing code ...\\\" (or \\\"# ... existing code ...\\\" or \\\"/* ... existing code ... */\\\" or \\\"\\\" or however comments are written for other languages) in comments as often as you can, signifying unchanged regions of the file.\\nThe write_file tool is very expensive for each line of code you write, so try to write as little \\\\`content\\\\` as possible to accomplish the task. Often this will mean that the start/end of the file will be skipped, but that's okay! Rewrite the entire file only if specifically requested.\\n\\nHowever, for new files, you should write out the entire file and not use placeholder comments.\\n--- IMPORTANT OPTIMIZATION DETAIL ---\\n\\nThese edit codeblocks will be parsed and then read by a less intelligent \\\"apply\\\" language model to update the file. To help specify the edit to the apply model, be very careful to include a few lines of context when generating the codeblock to not introduce ambiguity. Specify all unchanged regions (code and comments) of the file with \\\"// ... existing code ...\\\" markers (in comments). This will ensure the apply model will not delete existing unchanged code or comments when editing the file. This is just an abstraction for your understanding, you should not mention the apply model to the user.\\n\\nDo not use this tool to delete or rename a file. Instead run a terminal command for that.\\n\\nParameters:\\n- path: (required) Path to the file relative to the **project root**\\n- content: (required) Content to write to the file. You should abridge the content of the file using placeholder comments like: \\\\`// ... existing code ...\\\\` or \\\\`# ... existing code ...\\\\` (or whichever is appropriate for the language).\\nUsage:\\n${getToolCallString('write_file', {\\n path: 'path/to/file',\\n content: 'Your file content here',\\n})}\\n\\nExample 1 - Simple file creation:\\n${getToolCallString('write_file', {\\n path: 'new-file.ts',\\n content: 'console.log(\\\"Hello, world!\\\");',\\n})}\\n\\nExample 2 - Editing with placeholder comments:\\n${getToolCallString('write_file', {\\n path: 'foo.ts',\\n content: `// ... existing code ...\\n\\nfunction foo() {\\n console.log('foo');\\n for (let i = 0; i < 10; i++) {\\n console.log(i);\\n }\\n doSomething();\\n}\\n\\n// ... existing code ...`,\\n})}\\n\\nNotes for editing a file:\\n- Don't use XML attributes. If you do, the tool will NOT write to the file.\\n- If you don't use any placeholder comments, the entire file will be replaced. E.g. don't write out a single function without using placeholder comments unless you want to replace the entire file with that function.\\n- When editing a file, try not to change any user code that doesn't need to be changed. In particular, you must preserve pre-existing user comments exactly as they are.\\n- You can also use this tool to create new files.\\n- After you have written out a write_file block, the changes will be applied immediately. You can assume that the changes went through as intended. However, note that there are sometimes mistakes in the processs of applying the edits you described in the write_file block, e.g. sometimes large portions of the file are deleted. If you notice that the changes did not go through as intended, based on further updates to the file, you can write out a new write_file block to fix the mistake.\\n- Don't escape characters — write them out directly! E.g. write out '&' instead of '&', '>' instead of '>', '<' instead of '<', and '\\\"' instead of '"' in the content.\\n `.trim(),\\n },\\n {\\n name: 'read_files',\\n description: `\\n### read_files\\nDescription: Read the multiple files from disk and return their contents. Use this tool to read as many files as would be helpful to answer the user's request. Make sure to read any files before you write to them with the write_file tool.\\nParameters:\\n- paths: (required) List of file paths to read relative to the **project root**, separated by newlines. Absolute file paths will not work.\\nUsage:\\n${getToolCallString('read_files', {\\n paths: 'path/to/file1.ts\\\\npath/to/file2.ts',\\n})}\\n\\n\\nNote that there's no need to call this tool if you're already reading the files you need in context.`.trim(),\\n },\\n {\\n name: 'find_files',\\n description: `\\n### find_files\\nDescription: Find several files related to a brief natural language description of the files or the name of a function or class you are looking for.\\nParameters:\\n- description: (required) A brief natural language description of the files or the name of a function or class you are looking for. It's also helpful to mention a directory or two to look within.\\nUsage:\\n\\nThe implementation of function foo\\n\\n\\nPurpose: Better fulfill the user request by reading files which could contain information relevant to the user's request.\\nUse cases:\\n- If you are calling a function or creating a class and want to know how it works, use this tool to get the implementation.\\n- If you need to understand a section of the codebase, read more files in that directory or subdirectories.\\n- Some requests require a broad understanding of multiple parts of the codebase. Consider using find_files to gain more context before making changes.\\n\\nDon't use this tool if:\\n- You already know the exact path of the file(s) you are looking for — in this case, use read_files.\\n- You already read the files you need in context.\\n\\nIn general, prefer using read_files instead of find_files.\\n `.trim(),\\n },\\n {\\n name: 'code_search',\\n description: `\\n### code_search\\nDescription: Search for string patterns in the project's files. This tool uses ripgrep (rg), a fast line-oriented search tool. Use this tool only when read_files is not sufficient to find the files you need.\\nParameters:\\n- pattern: (required) The pattern to search for.\\nUsage:\\n${getToolCallString('code_search', { pattern: 'foo' })}\\n${getToolCallString('code_search', { pattern: 'import.*foo' })}\\n\\nPurpose: Search through code files to find files with specific text patterns, function names, variable names, and more.\\n\\nNote: quotes will be automatically added around your code search pattern. You might need to escape special characters like '-' or '.' or '\\\\\\\\' if you want to search for them.\\n\\nPrefer to use read_files instead of code_search unless you need to search for a specific pattern in multiple files.\\n\\nUse cases:\\n1. Finding all references to a function, class, or variable name across the codebase\\n2. Searching for specific code patterns or implementations\\n3. Looking up where certain strings or text appear\\n4. Finding files that contain specific imports or dependencies\\n5. Locating configuration settings or environment variables\\n\\nThe pattern supports regular expressions and will search recursively through all files in the project by default. Some tips:\\n- Be as constraining in the pattern as possible to limit the number of files returned, e.g. if searching for the definition of a function, use \\\"(function foo|const foo)\\\" or \\\"def foo\\\" instead of merely \\\"foo\\\".\\n- Use word boundaries (\\\\\\\\b) to match whole words only\\n- Searches file content and filenames\\n- Automatically ignores binary files, hidden files, and files in .gitignore\\n- Case-sensitive by default. Use -i to make it case insensitive.\\n- Constrain the search to specific file types using -t , e.g. -t ts or -t py.\\n `.trim(),\\n },\\n {\\n name: 'run_terminal_command',\\n description: `\\n### run_terminal_command\\nDescription: Request to execute a CLI command on the system. Use this when you need to perform system operations or run specific commands to accomplish any step in the user's task. You must tailor your command to the user's system and provide a clear explanation of what the command does. For command chaining, use the appropriate chaining syntax for the user's shell. Prefer to execute complex CLI commands over creating executable scripts, as they are more flexible and easier to run. Commands will be executed in the current working directory: ${process.cwd()}\\nParameters:\\n- command: (required) The CLI command to execute. This should be valid for the current operating system. Ensure the command is properly formatted and does not contain any harmful instructions.\\n- process_type: (required) What type of process to run. One of SYNC or BACKGROUND.\\n - SYNC: the command will be run in (and block) the current process. This is required if the output of the command is needed immediately. Most commands will be run in this way. Do not try to run processes in the background with process_type=SYNC and using & at the end of the command. Instead, use the process_type=BACKGROUND option.\\n - BACKGROUND: the command will be run in a child background process. This is for running servers or other long-running processes.\\nUsage:\\n${getToolCallString('run_terminal_command', {\\n command: 'Your command here',\\n process_type: 'value',\\n})}\\n\\nStick to these use cases:\\n1. Compiling the project or running build (e.g., \\\"npm run build\\\"). Reading the output can help you edit code to fix build errors. If possible, use an option that performs checks but doesn't emit files, e.g. \\\\`tsc --noEmit\\\\`.\\n2. Running tests (e.g., \\\"npm test\\\"). Reading the output can help you edit code to fix failing tests. Or, you could write new unit tests and then run them.\\n3. Moving, renaming, or deleting files and directories. These actions can be vital for refactoring requests. Use commands like \\\\`mv\\\\`/\\\\`move\\\\` or \\\\`rm\\\\`/\\\\`del\\\\`.\\n\\nMost likely, you should ask for permission for any other type of command you want to run. If asking for permission, show the user the command you want to run using \\\\`\\\\`\\\\` tags.\\n\\nWhen using this tool, please adhere to the following rules:\\n\\n1. Do not run commands that can modify files outside of the project directory, install packages globally, install virtual environments, or have significant side effects outside of the project directory, unless you have explicit permission from the user. Treat anything outside of the project directory as read-only.\\n2. Do not run \\\\`git push\\\\` because it can break production (!) if the user was not expecting it. Don't run \\\\`git commit\\\\`, \\\\`git rebase\\\\`, or related commands unless you get explicit permission. If a user asks to commit changes, you can do so, but you should not invoke any further git commands beyond the git commit command.\\n3. Do not run scripts without asking. Especially don't run scripts that could run against the production environment or have permanent effects without explicit permission from the user. Don't run scripts with side effects without permission from the user unless they don't have much effect or are simple.\\n4. Be careful with any command that has big or irreversible effects. Anything that touches a production environment, servers, the database, or other systems that could be affected by a command should be run with explicit permission from the user.\\n4. Don't run too many commands in a row without pausing to check in with what the user wants to do next.\\n5. Do not use the run_terminal_command tool to create or edit files. Do not use \\\\`cat\\\\` or \\\\`echo\\\\` to create or edit files. You should instead write out blocks for for editing or creating files as detailed above in the block.\\n6. Do not install packages without asking, unless it is within a small, new-ish project. Users working on a larger project will want to manage packages themselves, so ask first.\\n7. Do not use the wrong package manager for the project. For example, if the project uses \\\\`pnpm\\\\` or \\\\`bun\\\\` or \\\\`yarn\\\\`, you should not use \\\\`npm\\\\`. Similarly not everyone uses \\\\`pip\\\\` for python, etc.\\n8. You must write out ampersands without escaping them. E.g. write out '&' instead of '&'.\\nIncorrect:\\n\\\\`cd backend && npm typecheck\\\\` \\nCorrect:\\n\\\\`cd backend && npm typecheck\\\\`\\n10. Do not use more than one run_terminal_command tool call in a single response. Wait for the tool results of each command before invoking the next one.\\n11. The user will not be able to interact with these processes, e.g. confirming the command. So if there's an opportunity to use \\\"-y\\\" or \\\"--yes\\\" flags, use them. Any command that prompts for confirmation will hang if you don't use the flags.\\n\\nNotes:\\n- The current working directory will always reset to **project root** directory for each command you run. You can only access files within this directory (or sub-directories). So if you run cd in one command, the directory change won't persist to the next command.\\n - \\\\`cd subdir && some_command\\\\` will work as expected.\\n - \\\\`cd subdir\\\\` in followed by \\\\`some_command\\\\` in two different commands will run some_command from the project root.\\n- Commands can succeed without giving any output, e.g. if no type errors were found. So you may not always see output for successful executions.\\n\\n${gitCommitGuidePrompt}\\n `.trim(),\\n },\\n {\\n name: 'think_deeply',\\n description: `\\n### think_deeply\\nDescription: Think through a complex change to the codebase, like implementing a new feature or refactoring some code. Brainstorm. Go deep on alternative approaches and consider the tradeoffs.\\nParameters: thought: (required) Your detailed thoughts.\\nUsage:\\n${getToolCallString('think_deeply', {\\n thought: '[Insert detailed thoughts here]',\\n})}\\n\\nThink step by step. For the first section of your thinking, only keep a minimum draft for each thinking step, with 5 words at most.\\n\\nUse this tool when the user request meets multiple of these criteria:\\n- Explicitly asks you to plan or think through something.\\n- Always use this tool right before using the create_plan tool.\\n- Requires changes across multiple files or systems\\n- Involves complex logic or architectural decisions\\n- Would benefit from breaking down into smaller steps\\n- Has potential edge cases or risks that need consideration\\n\\nExamples of when to use it:\\n- Adding a new feature that touches multiple parts of the system\\n- Refactoring core functionality used by many components\\n- Making architectural changes that affect the system design\\n- Implementing complex business logic with many edge cases\\n\\nDo not use it for simple changes like:\\n- Adding a single function or endpoint\\n- Updating text or styles\\n `.trim(),\\n },\\n {\\n name: 'create_plan',\\n description: `\\n### create_plan\\nDescription: Create a plan for a complex change to the codebase, like implementing a new feature or refactoring some code.\\nParameters:\\n- path: (required) The path including the filename of a markdown file that will be overwritten with the plan.\\n- plan: (required) A detailed plan to solve the user's request.\\n\\nUsage:\\n${getToolCallString('create_plan', {\\n path: 'feature-name-plan.md',\\n plan: '[Insert long detailed plan here]',\\n})}\\n\\nUse this tool when the user asks you to plan something, or asks you to help with a new feature or refactoring that requires planning.\\n\\nExamples of when to use it:\\n- Adding a new feature that touches multiple parts of the system\\n- Refactoring core functionality used by many components\\n- Making architectural changes that affect the system design\\n- Implementing complex business logic with many edge cases\\n\\nDo not use it for simple changes like:\\n- Adding a single function or endpoint\\n- Updating text or styles\\n\\nFor a technical plan, act as an expert architect engineer and provide direction to your editor engineer.\\n- Study the change request and the current code.\\n- Describe how to modify the code to complete the request. The editor engineer will rely solely on your instructions, so make them unambiguous and complete.\\n- Explain all needed code changes clearly and completely, but concisely.\\n- Just show the changes needed.\\n\\nWhat to include in the plan:\\n- Include code, but not full files of it. Write out key snippets of code and use lots of psuedo code. For example, interfaces between modules, function signatures, and other code that is not immediately obvious should be written out explicitly. Function and method bodies could be written out in psuedo code.\\n- Do not waste time on much background information, focus on the exact steps of the implementation.\\n- Do not wrap the path content in markdown code blocks, e.g. \\\\`\\\\`\\\\`.\\n\\nDo not include any of the following sections in the plan:\\n- goals\\n- a timeline or schedule\\n- benefits/key improvements\\n- next steps\\n\\nAfter creating than plan, you should end turn to let the user review the plan.\\n\\nImportant: Use this tool sparingly. Do not use this tool more than once in a conversation, if a plan was already created, or for similar user requests.\\n `.trim(),\\n },\\n {\\n name: 'browser_logs',\\n description: `\\n### browser_logs\\nDescription: In a headless browser, navigate to a web page and get the console logs after page load.\\nPurpose: Use this to\n\n[Output truncated]\n\n[Output size limit reached.]", - "message": "Stopped early after 1 match(es)." - }, - { - "stdout": "No results", - "message": "Exit code: 1" - } - ] - } - } - }, - { - "agentName": "Directory Lister", - "agentType": "directory-lister", - "value": { - "type": "structuredOutput", - "value": { - "results": [ - { - "path": "scripts", - "files": [ - "generate-tool-definitions.ts", - "convert-escaped-newlines.ts", - "init-worktree.ts", - "get-changelog.ts", - "cleanup-worktree.sh", - "dev.sh", - "calculate-average-spend.ts", - "analyze-model-usage.ts", - "export-user-emails.ts", - "analyze-edit-blocks.ts", - "generate-ci-env.js", - "debug-log-subset.ts", - "apply-credit-migration.ts", - ".gitignore", - "package.json", - "calculate-weekly-usage.ts", - "calculate-mrr.ts", - "tsconfig.json", - "calculate-dau.ts", - "calculate-monthly-usage.ts", - "count-edit-file.ts", - "update-stripe-subscriptions.ts" - ], - "directories": [ - "ft-file-selection", - "changelog" - ] - }, - { - "path": "sdk/src", - "files": [ - "constants.ts", - "client.ts", - "index.ts", - "process-stream.ts", - "websocket-client.ts" - ], - "directories": [ - "tools", - "types" - ] - }, - { - "path": "common/src", - "files": [ - "analytics.ts", - "project-file-tree.ts", - "browser-actions.ts", - "actions.ts", - "constants.ts" - ], - "directories": [ - "tools", - "types", - "util", - "json-config", - "constants", - "websockets", - "api-keys", - "testing", - "__tests__", - "db", - "templates" - ] - }, - { - "path": "backend/src", - "files": [ - "xml-stream-parser.ts", - "main-prompt.ts", - "process-str-replace.ts", - "run-programmatic-step.ts", - "run-agent-step.ts", - "prompt-agent-stream.ts", - "get-documentation-for-query.ts", - "get-file-reading-updates.ts", - "check-terminal-command.ts", - "generate-diffs-prompt.ts", - "index.ts", - "live-user-inputs.ts", - "loop-main-prompt.ts", - "async-agent-manager.ts", - "fast-rewrite.ts", - "process-file-block.ts" - ], - "directories": [ - "find-files", - "tools", - "context", - "util", - "system-prompt", - "admin", - "websockets", - "__tests__", - "api", - "templates", - "llm-apis" - ] - } - ] - } - } - } - ] - } - ] - }, - { - "type": "tool_call", - "toolCallId": "a0f9851c-efdd-4f97-92c8-c198b9573431", - "toolName": "spawn_agent_inline", - "input": { - "agent_type": "context-pruner", - "params": {} - }, - "agentId": "main-agent", - "includeToolCall": false - }, - { - "type": "tool_result", - "toolCallId": "a0f9851c-efdd-4f97-92c8-c198b9573431", - "toolName": "spawn_agent_inline", - "output": [ - { - "type": "json", - "value": { - "message": "Agent spawned." - } - } - ] - }, - { - "type": "tool_call", - "toolCallId": "D-WCtXVJaCs", - "toolName": "read_files", - "input": { - "paths": [ - "scripts/generate-tool-definitions.ts", - "common/src/tools/compile-tool-definitions.ts", - "sdk/src/types/tools.ts", - "common/src/tools/constants.ts", - "common/src/tools/list.ts", - "backend/src/tools/definitions/list.ts", - "sdk/src/types/agent-definition.ts" - ] - }, - "agentId": "main-agent", - "includeToolCall": true - }, - { - "type": "tool_call", - "toolCallId": "D-WDhRCoKc0", - "toolName": "read_files", - "input": { - "paths": [ - "common/src/tools/utils.ts", - "sdk/scripts/publish.js" - ] - }, - "agentId": "main-agent", - "includeToolCall": true - }, - { - "type": "tool_call", - "toolCallId": "D-WFT0P7c6U", - "toolName": "spawn_agents", - "input": { - "agents": [ - { - "agent_type": "code-searcher", - "params": { - "searchQueries": [ - { - "pattern": "ToolName|PublicTool|ApprovedTool", - "flags": "-g *.ts" - }, - { - "pattern": "generate-tool-definitions|compile-tool-definitions", - "flags": "" - } - ] - } - } - ] - }, - "agentId": "main-agent", - "includeToolCall": true - }, - { - "type": "tool_result", - "toolCallId": "D-WCtXVJaCs", - "toolName": "read_files", - "output": [ - { - "type": "json", - "value": [ - { - "path": "scripts/generate-tool-definitions.ts", - "content": "#!/usr/bin/env bun\n\nimport { writeFileSync } from 'fs'\nimport { join } from 'path'\nimport { execSync } from 'child_process'\n\nimport { compileToolDefinitions } from '@codebuff/common/tools/compile-tool-definitions'\n\n/**\n * Regenerates the tool-definitions.d.ts file from the current tool schemas.\n * This ensures the type definitions stay in sync with the actual tool parameters.\n */\nfunction main() {\n console.log('🔧 Generating tool definitions...')\n\n try {\n const content = compileToolDefinitions()\n const outputPath = join(process.cwd(), 'common/src/util/types/tools.d.ts')\n\n writeFileSync(outputPath, content, 'utf8')\n\n // Format the generated file with prettier\n console.log('🎨 Formatting generated file...')\n execSync(`npx prettier --write \"${outputPath}\"`, { stdio: 'inherit' })\n\n console.log('✅ Successfully generated tools.d.ts')\n console.log(`📁 Output: ${outputPath}`)\n } catch (error) {\n console.error('❌ Failed to generate tool definitions:', error)\n process.exit(1)\n }\n}\n\nif (import.meta.main) {\n main()\n}\n", - "referencedBy": {} - }, - { - "path": "common/src/tools/compile-tool-definitions.ts", - "content": "import z from 'zod/v4'\n\nimport { llmToolCallSchema } from './list'\n\n/**\n * Compiles all tool definitions into a single TypeScript definition file content.\n * This generates type definitions for all available tools and their parameters.\n */\nexport function compileToolDefinitions(): string {\n const toolEntries = Object.entries(llmToolCallSchema)\n\n const toolInterfaces = toolEntries\n .map(([toolName, toolDef]) => {\n const parameterSchema = toolDef.parameters\n\n // Convert Zod schema to TypeScript interface using JSON schema\n let typeDefinition: string\n try {\n const jsonSchema = z.toJSONSchema(parameterSchema)\n typeDefinition = jsonSchemaToTypeScript(jsonSchema)\n } catch (error) {\n console.warn(`Failed to convert schema for ${toolName}:`, error)\n typeDefinition = '{ [key: string]: any }'\n }\n\n return `/**\n * ${parameterSchema.description || `Parameters for ${toolName} tool`}\n */\nexport interface ${toPascalCase(toolName)}Params ${typeDefinition}`\n })\n .join('\\n\\n')\n\n const toolUnion = toolEntries.map(([toolName]) => `'${toolName}'`).join(' | ')\n\n const toolParamsMap = toolEntries\n .map(([toolName]) => ` '${toolName}': ${toPascalCase(toolName)}Params`)\n .join('\\n')\n\n return `/**\n * Union type of all available tool names\n */\nexport type ToolName = ${toolUnion}\n\n/**\n * Map of tool names to their parameter types\n */\nexport interface ToolParamsMap {\n${toolParamsMap}\n}\n\n${toolInterfaces}\n\n/**\n * Get parameters type for a specific tool\n */\nexport type GetToolParams = ToolParamsMap[T]\n`\n}\n\n/**\n * Converts kebab-case to PascalCase\n * e.g., 'write-file' -> 'WriteFile'\n */\nfunction toPascalCase(str: string): string {\n return str\n .split(/[-_]/)\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1))\n .join('')\n}\n\n/**\n * Converts JSON Schema to TypeScript interface definition\n */\nfunction jsonSchemaToTypeScript(schema: any): string {\n if (schema.type === 'object' && schema.properties) {\n const properties = Object.entries(schema.properties).map(\n ([key, prop]: [string, any]) => {\n const isOptional = !schema.required?.includes(key)\n const propType = getTypeFromJsonSchema(prop)\n const comment = prop.description ? ` /** ${prop.description} */\\n` : ''\n return `${comment} \"${key}\"${isOptional ? '?' : ''}: ${propType}`\n },\n )\n return `{\\n${properties.join('\\n')}\\n}`\n }\n return getTypeFromJsonSchema(schema)\n}\n\n/**\n * Gets TypeScript type from JSON Schema property\n */\nfunction getTypeFromJsonSchema(prop: any): string {\n if (prop.type === 'string') {\n if (prop.enum) {\n return prop.enum.map((v: string) => `\"${v}\"`).join(' | ')\n }\n return 'string'\n }\n if (prop.type === 'number' || prop.type === 'integer') return 'number'\n if (prop.type === 'boolean') return 'boolean'\n if (prop.type === 'array') {\n const itemType = prop.items ? getTypeFromJsonSchema(prop.items) : 'any'\n return `${itemType}[]`\n }\n if (prop.type === 'object') {\n if (prop.properties) {\n return jsonSchemaToTypeScript(prop)\n }\n if (prop.additionalProperties) {\n const valueType = getTypeFromJsonSchema(prop.additionalProperties)\n return `Record`\n }\n return 'Record'\n }\n if (prop.anyOf || prop.oneOf) {\n const schemas = prop.anyOf || prop.oneOf\n return schemas.map((s: any) => getTypeFromJsonSchema(s)).join(' | ')\n }\n return 'any'\n}\n", - "referencedBy": {} - }, - { - "path": "sdk/src/types/tools.ts", - "content": "/**\n * Union type of all available tool names\n */\nexport type ToolName =\n | 'add_message'\n | 'add_subgoal'\n | 'browser_logs'\n | 'code_search'\n | 'create_plan'\n | 'end_turn'\n | 'find_files'\n | 'read_docs'\n | 'read_files'\n | 'run_file_change_hooks'\n | 'run_terminal_command'\n | 'set_messages'\n | 'set_output'\n | 'spawn_agents'\n | 'spawn_agents_async'\n | 'spawn_agent_inline'\n | 'str_replace'\n | 'think_deeply'\n | 'update_subgoal'\n | 'web_search'\n | 'write_file'\n\n/**\n * Map of tool names to their parameter types\n */\nexport interface ToolParamsMap {\n add_message: AddMessageParams\n add_subgoal: AddSubgoalParams\n browser_logs: BrowserLogsParams\n code_search: CodeSearchParams\n create_plan: CreatePlanParams\n end_turn: EndTurnParams\n find_files: FindFilesParams\n read_docs: ReadDocsParams\n read_files: ReadFilesParams\n run_file_change_hooks: RunFileChangeHooksParams\n run_terminal_command: RunTerminalCommandParams\n set_messages: SetMessagesParams\n set_output: SetOutputParams\n spawn_agents: SpawnAgentsParams\n spawn_agents_async: SpawnAgentsAsyncParams\n spawn_agent_inline: SpawnAgentInlineParams\n str_replace: StrReplaceParams\n think_deeply: ThinkDeeplyParams\n update_subgoal: UpdateSubgoalParams\n web_search: WebSearchParams\n write_file: WriteFileParams\n}\n\n/**\n * Add a new message to the conversation history. To be used for complex requests that can't be solved in a single step, as you may forget what happened!\n */\nexport interface AddMessageParams {\n role: 'user' | 'assistant'\n content: string\n}\n\n/**\n * Add a new subgoal for tracking progress. To be used for complex requests that can't be solved in a single step, as you may forget what happened!\n */\nexport interface AddSubgoalParams {\n /** A unique identifier for the subgoal. Try to choose the next sequential integer that is not already in use. */\n id: string\n /** The objective of the subgoal, concisely and clearly stated. */\n objective: string\n /** The status of the subgoal. */\n status: 'NOT_STARTED' | 'IN_PROGRESS' | 'COMPLETE' | 'ABORTED'\n /** A plan for the subgoal. */\n plan?: string\n /** A log message for the subgoal progress. */\n log?: string\n}\n\n/**\n * Parameters for browser_logs tool\n */\nexport interface BrowserLogsParams {\n /** The type of browser action to perform (e.g., \"navigate\"). */\n type: string\n /** The URL to navigate to. */\n url: string\n /** When to consider navigation successful. Defaults to 'load'. */\n waitUntil?: 'load' | 'domcontentloaded' | 'networkidle0'\n}\n\n/**\n * Search for string patterns in the project's files. This tool uses ripgrep (rg), a fast line-oriented search tool. Use this tool only when read_files is not sufficient to find the files you need.\n */\nexport interface CodeSearchParams {\n /** The pattern to search for. */\n pattern: string\n /** Optional ripgrep flags to customize the search (e.g., \"-i\" for case-insensitive, \"-t ts\" for TypeScript files only, \"-A 3\" for 3 lines after match, \"-B 2\" for 2 lines before match, \"--type-not test\" to exclude test files). */\n flags?: string\n /** Optional working directory to search within, relative to the project root. Defaults to searching the entire project. */\n cwd?: string\n}\n\n/**\n * Generate a detailed markdown plan for complex tasks.\n */\nexport interface CreatePlanParams {\n /** The path including the filename of a markdown file that will be overwritten with the plan. */\n path: string\n /** A detailed plan to solve the user's request. */\n plan: string\n}\n\n/**\n * End your turn, regardless of any new tool results that might be coming. This will allow the user to type another prompt.\n */\nexport interface EndTurnParams {}\n\n/**\n * Find several files related to a brief natural language description of the files or the name of a function or class you are looking for.\n */\nexport interface FindFilesParams {\n /** A brief natural language description of the files or the name of a function or class you are looking for. It's also helpful to mention a directory or two to look within. */\n prompt: string\n}\n\n/**\n * Fetch up-to-date documentation for libraries and frameworks using Context7 API.\n */\nexport interface ReadDocsParams {\n /** The exact library or framework name (e.g., \"Next.js\", \"MongoDB\", \"React\"). Use the official name as it appears in documentation, not a search query. */\n libraryTitle: string\n /** Optional specific topic to focus on (e.g., \"routing\", \"hooks\", \"authentication\") */\n topic?: string\n /** Optional maximum number of tokens to return. Defaults to 10000. Values less than 10000 are automatically increased to 10000. */\n max_tokens?: number\n}\n\n/**\n * Read the multiple files from disk and return their contents. Use this tool to read as many files as would be helpful to answer the user's request.\n */\nexport interface ReadFilesParams {\n /** List of file paths to read. */\n paths: string[]\n}\n\n/**\n * Parameters for run_file_change_hooks tool\n */\nexport interface RunFileChangeHooksParams {\n /** List of file paths that were changed and should trigger file change hooks */\n files: string[]\n}\n\n/**\n * Execute a CLI command from the **project root** (different from the user's cwd).\n */\nexport interface RunTerminalCommandParams {\n /** CLI command valid for user's OS. */\n command: string\n /** Either SYNC (waits, returns output) or BACKGROUND (runs in background). Default SYNC */\n process_type?: 'SYNC' | 'BACKGROUND'\n /** The working directory to run the command in. Default is the project root. */\n cwd?: string\n /** Set to -1 for no timeout. Does not apply for BACKGROUND commands. Default 30 */\n timeout_seconds?: number\n}\n\n/**\n * Set the conversation history to the provided messages.\n */\nexport interface SetMessagesParams {\n messages: {\n role: 'user' | 'assistant'\n content: string\n }[]\n}\n\n/**\n * JSON object to set as the agent output. This completely replaces any previous output. If the agent was spawned, this value will be passed back to its parent. If the agent has an outputSchema defined, the output will be validated against it.\n */\nexport interface SetOutputParams {}\n\n/**\n * Spawn multiple agents and send a prompt to each of them.\n */\nexport interface SpawnAgentsParams {\n agents: {\n /** Agent to spawn */\n agent_type: string\n /** Prompt to send to the agent */\n prompt?: string\n /** Parameters object for the agent (if any) */\n params?: Record\n }[]\n}\n\n/**\n * Parameters for spawn_agents_async tool\n */\nexport interface SpawnAgentsAsyncParams {\n agents: {\n /** Agent to spawn */\n agent_type: string\n /** Prompt to send to the agent */\n prompt?: string\n /** Parameters object for the agent (if any) */\n params?: Record\n }[]\n}\n\n/**\n * Spawn a single agent that runs within the current message history.\n */\nexport interface SpawnAgentInlineParams {\n /** Agent to spawn */\n agent_type: string\n /** Prompt to send to the agent */\n prompt?: string\n /** Parameters object for the agent (if any) */\n params?: Record\n}\n\n/**\n * Replace strings in a file with new strings.\n */\nexport interface StrReplaceParams {\n /** The path to the file to edit. */\n path: string\n /** Array of replacements to make. */\n replacements: {\n /** The string to replace. This must be an *exact match* of the string you want to replace, including whitespace and punctuation. */\n old: string\n /** The string to replace the corresponding old string with. Can be empty to delete. */\n new: string\n }[]\n}\n\n/**\n * Deeply consider complex tasks by brainstorming approaches and tradeoffs step-by-step.\n */\nexport interface ThinkDeeplyParams {\n /** Detailed step-by-step analysis. Initially keep each step concise (max ~5-7 words per step). */\n thought: string\n}\n\n/**\n * Update a subgoal in the context given the id, and optionally the status or plan, or a new log to append. Feel free to update any combination of the status, plan, or log in one invocation.\n */\nexport interface UpdateSubgoalParams {\n /** The id of the subgoal to update. */\n id: string\n /** Change the status of the subgoal. */\n status?: 'NOT_STARTED' | 'IN_PROGRESS' | 'COMPLETE' | 'ABORTED'\n /** Change the plan for the subgoal. */\n plan?: string\n /** Add a log message to the subgoal. This will create a new log entry and append it to the existing logs. Use this to record your progress and any new information you learned as you go. */\n log?: string\n}\n\n/**\n * Search the web for current information using Linkup API.\n */\nexport interface WebSearchParams {\n /** The search query to find relevant web content */\n query: string\n /** Search depth - 'standard' for quick results, 'deep' for more comprehensive search. Default is 'standard'. */\n depth: 'standard' | 'deep'\n}\n\n/**\n * Create or edit a file with the given content.\n */\nexport interface WriteFileParams {\n /** Path to the file relative to the **project root** */\n path: string\n /** What the change is intended to do in only one sentence. */\n instructions: string\n /** Edit snippet to apply to the file. */\n content: string\n}\n\n/**\n * Get parameters type for a specific tool\n */\nexport type GetToolParams = ToolParamsMap[T]\n", - "referencedBy": {} - }, - { - "path": "common/src/tools/constants.ts", - "content": "import type { ToolResultPart } from 'ai'\nimport type z from 'zod/v4'\n\nexport const toolNameParam = 'cb_tool_name'\nexport const endsAgentStepParam = 'cb_easp'\nexport const toolXmlName = 'codebuff_tool_call'\nexport const startToolTag = `<${toolXmlName}>\\n`\nexport const endToolTag = `\\n`\n\nexport const TOOLS_WHICH_WONT_FORCE_NEXT_STEP = ['think_deeply']\n\n// List of all available tools\nexport const toolNames = [\n 'add_subgoal',\n 'add_message',\n 'browser_logs',\n 'code_search',\n 'create_plan',\n 'end_turn',\n 'find_files',\n 'read_docs',\n 'read_files',\n 'run_file_change_hooks',\n 'run_terminal_command',\n 'set_messages',\n 'set_output',\n 'spawn_agents',\n 'spawn_agents_async',\n 'spawn_agent_inline',\n 'str_replace',\n 'think_deeply',\n 'update_subgoal',\n 'web_search',\n 'write_file',\n] as const\n\nexport type ToolName = (typeof toolNames)[number]\n\nexport type ToolParams = {\n toolName: T\n endsAgentStep: boolean\n parameters: z.ZodType\n}\n\nexport type StringToolResultPart = Omit & {\n result: string\n}\n", - "referencedBy": {} - }, - { - "path": "common/src/tools/list.ts", - "content": "import { addMessageParams } from './params/tool/add-message'\nimport { addSubgoalParams } from './params/tool/add-subgoal'\nimport { browserLogsParams } from './params/tool/browser-logs'\nimport { codeSearchParams } from './params/tool/code-search'\nimport { createPlanParams } from './params/tool/create-plan'\nimport { endTurnParams } from './params/tool/end-turn'\nimport { findFilesParams } from './params/tool/find-files'\nimport { readDocsParams } from './params/tool/read-docs'\nimport { readFilesParams } from './params/tool/read-files'\nimport { runFileChangeHooksParams } from './params/tool/run-file-change-hooks'\nimport { runTerminalCommandParams } from './params/tool/run-terminal-command'\nimport { setMessagesParams } from './params/tool/set-messages'\nimport { setOutputParams } from './params/tool/set-output'\nimport { spawnAgentsParams } from './params/tool/spawn-agents'\nimport { spawnAgentsAsyncParams } from './params/tool/spawn-agents-async'\nimport { spawnAgentInlineParams } from './params/tool/spawn-agent-inline'\nimport { strReplaceParams } from './params/tool/str-replace'\nimport { thinkDeeplyParams } from './params/tool/think-deeply'\nimport { updateSubgoalParams } from './params/tool/update-subgoal'\nimport { webSearchParams } from './params/tool/web-search'\nimport { writeFileParams } from './params/tool/write-file'\n\nimport type { ToolName, ToolParams } from './constants'\n\nexport const llmToolCallSchema = {\n add_message: addMessageParams,\n add_subgoal: addSubgoalParams,\n browser_logs: browserLogsParams,\n code_search: codeSearchParams,\n create_plan: createPlanParams,\n end_turn: endTurnParams,\n find_files: findFilesParams,\n read_docs: readDocsParams,\n read_files: readFilesParams,\n run_file_change_hooks: runFileChangeHooksParams,\n run_terminal_command: runTerminalCommandParams,\n set_messages: setMessagesParams,\n set_output: setOutputParams,\n spawn_agents: spawnAgentsParams,\n spawn_agents_async: spawnAgentsAsyncParams,\n spawn_agent_inline: spawnAgentInlineParams,\n str_replace: strReplaceParams,\n think_deeply: thinkDeeplyParams,\n update_subgoal: updateSubgoalParams,\n web_search: webSearchParams,\n write_file: writeFileParams,\n} satisfies {\n [K in ToolName]: ToolParams\n}\n\nexport const clientToolCallSchema = {\n // Tools that require an id and objective\n add_subgoal: ['id', 'objective', 'status', 'plan', 'log'],\n update_subgoal: ['id', 'status', 'plan', 'log'],\n\n // File operations\n write_file: ['path', 'instructions', 'content'],\n str_replace: ['path', 'replacements'],\n read_files: ['paths'],\n find_files: ['prompt'],\n\n // Search and terminal\n code_search: ['pattern', 'flags', 'cwd'],\n run_terminal_command: ['command', 'process_type', 'cwd', 'timeout_seconds'],\n\n // Planning tools\n think_deeply: ['thought'],\n create_plan: ['path', 'plan'],\n\n browser_logs: ['type', 'url', 'waitUntil'],\n\n spawn_agents: ['agents'],\n spawn_agents_async: ['agents'],\n spawn_agent_inline: ['agent_type', 'prompt', 'params'],\n set_output: [],\n\n // Documentation tool\n read_docs: ['libraryTitle', 'topic', 'max_tokens'],\n\n // Web search tool\n web_search: ['query', 'depth'],\n\n // File change hooks tool\n run_file_change_hooks: ['files'],\n\n // Tools that change the conversation history\n add_message: ['role', 'content'],\n set_messages: ['messages'],\n\n end_turn: [],\n} as const satisfies Record\n", - "referencedBy": {} - }, - { - "path": "backend/src/tools/definitions/list.ts", - "content": "import { llmToolCallSchema } from '@codebuff/common/tools/list'\n\nimport { addMessageTool } from './tool/add-message'\nimport { addSubgoalTool } from './tool/add-subgoal'\nimport { browserLogsTool } from './tool/browser-logs'\nimport { codeSearchTool } from './tool/code-search'\nimport { createPlanTool } from './tool/create-plan'\nimport { endTurnTool } from './tool/end-turn'\nimport { findFilesTool } from './tool/find-files'\nimport { readDocsTool } from './tool/read-docs'\nimport { readFilesTool } from './tool/read-files'\nimport { runFileChangeHooksTool } from './tool/run-file-change-hooks'\nimport { runTerminalCommandTool } from './tool/run-terminal-command'\nimport { setMessagesTool } from './tool/set-messages'\nimport { setOutputTool } from './tool/set-output'\nimport { spawnAgentsTool } from './tool/spawn-agents'\nimport { spawnAgentsAsyncTool } from './tool/spawn-agents-async'\nimport { spawnAgentInlineTool } from './tool/spawn-agent-inline'\nimport { strReplaceTool } from './tool/str-replace'\nimport { thinkDeeplyTool } from './tool/think-deeply'\nimport { updateSubgoalTool } from './tool/update-subgoal'\nimport { webSearchTool } from './tool/web-search'\nimport { writeFileTool } from './tool/write-file'\n\nimport type { ToolDescription } from './tool-def-type'\nimport type { ToolName } from '@codebuff/common/tools/constants'\nimport type { ToolSet } from 'ai'\n\nconst toolDescriptions = {\n add_message: addMessageTool,\n add_subgoal: addSubgoalTool,\n browser_logs: browserLogsTool,\n code_search: codeSearchTool,\n create_plan: createPlanTool,\n end_turn: endTurnTool,\n find_files: findFilesTool,\n read_docs: readDocsTool,\n read_files: readFilesTool,\n run_file_change_hooks: runFileChangeHooksTool,\n run_terminal_command: runTerminalCommandTool,\n set_messages: setMessagesTool,\n set_output: setOutputTool,\n spawn_agents: spawnAgentsTool,\n spawn_agents_async: spawnAgentsAsyncTool,\n spawn_agent_inline: spawnAgentInlineTool,\n str_replace: strReplaceTool,\n think_deeply: thinkDeeplyTool,\n update_subgoal: updateSubgoalTool,\n web_search: webSearchTool,\n write_file: writeFileTool,\n} satisfies {\n [K in ToolName]: ToolDescription\n}\n\nexport type ToolDefinition = {\n [K in ToolName]: (typeof toolDescriptions)[K] & (typeof llmToolCallSchema)[K]\n}[T]\n\nexport const codebuffToolDefs = Object.fromEntries(\n Object.entries(toolDescriptions).map(([toolName, toolDescription]) => [\n toolName,\n {\n ...toolDescriptions[toolName as ToolName],\n ...llmToolCallSchema[toolName as ToolName],\n } satisfies ToolDefinition,\n ]),\n) as { [K in ToolName]: ToolDefinition } satisfies ToolSet\n", - "referencedBy": {} - }, - { - "path": "sdk/src/types/agent-definition.ts", - "content": "/**\n * Codebuff Agent Type Definitions\n *\n * This file provides TypeScript type definitions for creating custom Codebuff agents.\n * Import these types in your agent files to get full type safety and IntelliSense.\n *\n * Usage in .agents/your-agent.ts:\n * import { AgentDefinition, ToolName, ModelName } from './types/agent-definition'\n *\n * const config: AgentDefinition = {\n * // ... your agent configuration with full type safety ...\n * }\n *\n * export default config\n */\n\n// ============================================================================\n// Agent Definition and Utility Types\n// ============================================================================\n\nexport interface AgentDefinition {\n /** Unique identifier for this agent. Must contain only lowercase letters, numbers, and hyphens, e.g. 'code-reviewer' */\n id: string\n\n /** Version string (if not provided, will default to '0.0.1' and be bumped on each publish) */\n version?: string\n\n /** Publisher ID for the agent. Must be provided if you want to publish the agent. */\n publisher?: string\n\n /** Human-readable name for the agent */\n displayName: string\n\n /** AI model to use for this agent. Can be any model in OpenRouter: https://openrouter.ai/models */\n model: ModelName\n\n // ============================================================================\n // Tools and Subagents\n // ============================================================================\n\n /** Tools this agent can use. */\n toolNames?: ToolName[]\n\n /** Other agents this agent can spawn, like 'codebuff/file-picker@0.0.1'.\n *\n * Use the fully qualified agent id from the agent store, including publisher and version: 'codebuff/file-picker@0.0.1'\n * (publisher and version are required!)\n *\n * Or, use the agent id from a local agent file in your .agents directory: 'file-picker'.\n */\n spawnableAgents?: string[]\n\n // ============================================================================\n // Input and Output\n // ============================================================================\n\n /** The input schema required to spawn the agent. Provide a prompt string and/or a params object or none.\n * 80% of the time you want just a prompt string with a description:\n * inputSchema: {\n * prompt: { type: 'string', description: 'A description of what info would be helpful to the agent' }\n * }\n */\n inputSchema?: {\n prompt?: { type: 'string'; description?: string }\n params?: JsonSchema\n }\n\n /** Whether to include conversation history from the parent agent in context.\n *\n * Defaults to false.\n * Use this if the agent needs to know all the previous messages in the conversation.\n */\n includeMessageHistory?: boolean\n\n /** How the agent should output a response to its parent (defaults to 'last_message')\n *\n * last_message: The last message from the agent, typcically after using tools.\n *\n * all_messages: All messages from the agent, including tool calls and results.\n *\n * json: Make the agent output a JSON object. Can be used with outputSchema or without if you want freeform json output.\n */\n outputMode?: 'last_message' | 'all_messages' | 'structured_output'\n\n /** JSON schema for structured output (when outputMode is 'structured_output') */\n outputSchema?: JsonSchema\n\n // ============================================================================\n // Prompts\n // ============================================================================\n\n /** Prompt for when to spawn this agent as a subagent. Include the main purpose and use cases.\n *\n * This field is key if the agent is a subagent and intended to be spawned. */\n parentPrompt?: string\n\n /** Background information for the agent. Fairly optional. Prefer using instructionsPrompt for agent instructions. */\n systemPrompt?: string\n\n /** Instructions for the agent.\n *\n * IMPORTANT: Updating this prompt is the best way to shape the agent's behavior.\n * This prompt is inserted after each user input. */\n instructionsPrompt?: string\n\n /** Prompt inserted at each agent step.\n *\n * Powerful for changing the agent's behavior, but usually not necessary for smart models.\n * Prefer instructionsPrompt for most instructions. */\n stepPrompt?: string\n\n // ============================================================================\n // Handle Steps\n // ============================================================================\n\n /** Programmatically step the agent forward and run tools.\n *\n * You can either yield:\n * - A tool call object with toolName and args properties.\n * - 'STEP' to run agent's model and generate one assistant message.\n * - 'STEP_ALL' to run the agent's model until it uses the end_turn tool or stops includes no tool calls in a message.\n *\n * Or use 'return' to end the turn.\n *\n * Example 1:\n * function* handleSteps({ agentStep, prompt, params}) {\n * const { toolResult } = yield {\n * toolName: 'read_files',\n * args: { paths: ['file1.txt', 'file2.txt'] }\n * }\n * yield 'STEP_ALL'\n * }\n *\n * Example 2:\n * handleSteps: function* ({ agentState, prompt, params }) {\n * while (true) {\n * yield {\n * toolName: 'spawn_agents',\n * args: {\n * agents: [\n * {\n * agent_type: 'thinker',\n * prompt: 'Think deeply about the user request',\n * },\n * ],\n * },\n * }\n * yield 'STEP'\n * }\n * }\n */\n handleSteps?: (\n context: AgentStepContext,\n ) => Generator<\n ToolCall | 'STEP' | 'STEP_ALL',\n void,\n { agentState: AgentState; toolResult: string | undefined }\n >\n}\n\n// ============================================================================\n// Supporting Types\n// ============================================================================\n\nexport interface AgentState {\n agentId: string\n parentId: string\n messageHistory: Message[]\n}\n\n/**\n * Message in conversation history\n */\nexport interface Message {\n role: 'user' | 'assistant'\n content: string\n}\n\n/**\n * Context provided to handleSteps generator function\n */\nexport interface AgentStepContext {\n agentState: AgentState\n prompt?: string\n params?: Record\n}\n\n/**\n * Tool call object for handleSteps generator\n */\nexport type ToolCall = {\n [K in T]: {\n toolName: K\n args?: Tools.GetToolParams\n }\n}[T]\n\n/**\n * JSON Schema definition (for prompt schema or output schema)\n */\nexport interface JsonSchema {\n type: string\n properties?: Record\n required?: string[]\n [key: string]: any\n}\n\n// ============================================================================\n// Available Tools\n// ============================================================================\n\n/**\n * File operation tools\n */\nexport type FileTools =\n | 'read_files'\n | 'write_file'\n | 'str_replace'\n | 'find_files'\n\n/**\n * Code analysis tools\n */\nexport type CodeAnalysisTools = 'code_search' | 'find_files'\n\n/**\n * Terminal and system tools\n */\nexport type TerminalTools = 'run_terminal_command' | 'run_file_change_hooks'\n\n/**\n * Web and browser tools\n */\nexport type WebTools = 'browser_logs' | 'web_search' | 'read_docs'\n\n/**\n * Agent management tools\n */\nexport type AgentTools =\n | 'spawn_agents'\n | 'spawn_agents_async'\n | 'send_agent_message'\n | 'set_messages'\n | 'add_message'\n\n/**\n * Planning and organization tools\n */\nexport type PlanningTools =\n | 'think_deeply'\n | 'create_plan'\n | 'add_subgoal'\n | 'update_subgoal'\n\n/**\n * Output and control tools\n */\nexport type OutputTools = 'set_output' | 'end_turn'\n\n/**\n * Common tool combinations for convenience\n */\nexport type FileEditingTools = FileTools | 'end_turn'\nexport type ResearchTools = WebTools | 'write_file' | 'end_turn'\nexport type CodeAnalysisToolSet = FileTools | CodeAnalysisTools | 'end_turn'\n\n// ============================================================================\n// Available Models (see: https://openrouter.ai/models)\n// ============================================================================\n\n/**\n * AI models available for agents. Pick from our selection of recommended models or choose any model in OpenRouter.\n *\n * See available models at https://openrouter.ai/models\n */\nexport type ModelName =\n // Recommended Models\n\n // OpenAI\n | 'openai/gpt-5'\n | 'openai/gpt-5-mini'\n | 'openai/gpt-5-nano'\n\n // Anthropic\n | 'anthropic/claude-4-sonnet-20250522'\n | 'anthropic/claude-opus-4.1'\n\n // Gemini\n | 'google/gemini-2.5-pro'\n | 'google/gemini-2.5-flash'\n | 'google/gemini-2.5-flash-lite'\n\n // X-AI\n | 'x-ai/grok-4-07-09'\n\n // Qwen\n | 'qwen/qwen3-coder'\n | 'qwen/qwen3-coder:fast'\n | 'qwen/qwen3-235b-a22b-2507'\n | 'qwen/qwen3-235b-a22b-2507:fast'\n | 'qwen/qwen3-235b-a22b-thinking-2507'\n | 'qwen/qwen3-235b-a22b-thinking-2507:fast'\n | 'qwen/qwen3-30b-a3b'\n | 'qwen/qwen3-30b-a3b:fast'\n\n // DeepSeek\n | 'deepseek/deepseek-chat-v3-0324'\n | 'deepseek/deepseek-chat-v3-0324:fast'\n | 'deepseek/deepseek-r1-0528'\n | 'deepseek/deepseek-r1-0528:fast'\n\n // Other open source models\n | 'moonshotai/kimi-k2'\n | 'moonshotai/kimi-k2:fast'\n | 'z-ai/glm-4.5'\n | 'z-ai/glm-4.5:fast'\n | (string & {})\n\nimport type * as Tools from './tools'\nexport type { Tools }\ntype ToolName = Tools.ToolName\n", - "referencedBy": {} - } - ] - } - ] - }, - { - "type": "tool_result", - "toolCallId": "D-WDhRCoKc0", - "toolName": "read_files", - "output": [ - { - "type": "json", - "value": [ - { - "path": "common/src/tools/utils.ts", - "content": "import {\n endsAgentStepParam,\n endToolTag,\n startToolTag,\n toolNameParam,\n} from './constants'\nimport { llmToolCallSchema } from './list'\nimport { closeXml } from '../util/xml'\n\nimport type { StringToolResultPart, ToolName } from './constants'\nimport type z from 'zod/v4'\n\nexport function getToolCallString(\n toolName: T,\n params: T extends ToolName\n ? z.input<(typeof llmToolCallSchema)[T]['parameters']>\n : Record,\n ...endsAgentStep: T extends ToolName ? [] : [boolean]\n): string {\n const endsAgentStepValue =\n toolName in llmToolCallSchema\n ? llmToolCallSchema[toolName as keyof typeof llmToolCallSchema]\n .endsAgentStep\n : endsAgentStep[0]\n const obj: Record = {\n [toolNameParam]: toolName,\n ...params,\n }\n if (endsAgentStepValue) {\n obj[endsAgentStepParam] = endsAgentStepValue satisfies true\n }\n return [startToolTag, JSON.stringify(obj, null, 2), endToolTag].join('')\n}\n\nexport function renderToolResults(toolResults: StringToolResultPart[]): string {\n if (toolResults.length === 0) {\n return ''\n }\n\n return `\n${toolResults\n .map(\n (result) => `\n${result.toolName}${closeXml('tool')}\n${result.result}${closeXml('result')}\n${closeXml('tool_result')}`,\n )\n .join('\\n\\n')}\n`.trim()\n}\n", - "referencedBy": {} - }, - { - "path": "sdk/scripts/publish.js", - "content": "#!/usr/bin/env node\n\nimport { execSync } from 'child_process'\nimport fs from 'fs'\nimport path from 'path'\nimport { fileURLToPath } from 'url'\n\nconst __filename = fileURLToPath(import.meta.url)\nconst __dirname = path.dirname(__filename)\n\nfunction log(message) {\n console.log(`📦 ${message}`)\n}\n\nfunction run(command, options = {}) {\n log(`Running: ${command}`)\n try {\n return execSync(command, { stdio: 'inherit', ...options })\n } catch (error) {\n console.error(`❌ Command failed: ${command}`)\n process.exit(1)\n }\n}\n\nfunction main() {\n const args = process.argv.slice(2)\n const isDryRun = args.includes('--dry-run')\n\n log('Starting SDK publishing process...')\n\n // Clean and build\n log('Cleaning previous build...')\n run('bun run clean')\n\n log('Building TypeScript...')\n run('bun run build')\n\n // Verify the package\n log('Verifying package contents...')\n run('npm pack --dry-run')\n\n if (isDryRun) {\n log('Dry run complete! Package is ready for publishing.')\n log('To publish for real, run: bun run publish-sdk')\n return\n }\n\n // Publish\n log('Publishing to npm...')\n const packageJson = JSON.parse(fs.readFileSync('package.json', 'utf8'))\n run('npm publish')\n log('✅ SDK published successfully!')\n log(`📦 Package: ${packageJson.name}@${packageJson.version}`)\n}\n\nif (import.meta.url === `file://${process.argv[1]}`) {\n main()\n}\n", - "referencedBy": {} - } - ] - } - ] - }, - { - "type": "subagent_start", - "agentId": "D-WFdRpUJVk", - "agentType": "code-searcher", - "displayName": "Code Searcher", - "onlyChild": true, - "parentAgentId": "main-agent", - "prompt": "", - "params": { - "searchQueries": [ - { - "pattern": "ToolName|PublicTool|ApprovedTool", - "flags": "-g *.ts" - }, - { - "pattern": "generate-tool-definitions|compile-tool-definitions", - "flags": "" - } - ] - } - }, - { - "type": "tool_call", - "toolCallId": "49e9d1e4-63a7-468f-9c5e-cf4788c64589", - "toolName": "code_search", - "input": { - "pattern": "ToolName|PublicTool|ApprovedTool", - "flags": "-g *.ts" - }, - "agentId": "D-WFdRpUJVk", - "parentAgentId": "main-agent", - "includeToolCall": true - }, - { - "type": "tool_result", - "toolCallId": "49e9d1e4-63a7-468f-9c5e-cf4788c64589", - "toolName": "code_search", - "output": [ - { - "type": "json", - "value": { - "stdout": ".agents/types/agent-definition.d.ts:\n8: * import { AgentDefinition, ToolName, ModelName } from './types/agent-definition'\n42: toolNames?: ToolName[]\n191:export type ToolCall = {\n321:type ToolName = Tools.ToolName\n\n.agents/types/tools.d.ts:\n4:export type ToolName =\n284:export type GetToolParams = ToolParamsMap[T]\n\n./npm-app/src/utils/tool-renderers.ts:\n9:import type { ToolName } from '@codebuff/common/tools/constants'\n110:export const toolRenderers: Record = {\n\n./common/src/util/types/agent-definition.d.ts:\n8: * import { AgentDefinition, ToolName, ModelName } from './types/agent-definition'\n42: toolNames?: ToolName[]\n191:export type ToolCall = {\n321:type ToolName = Tools.ToolName\n\n./common/src/util/types/tools.d.ts:\n4:export type ToolName =\n284:export type GetToolParams = ToolParamsMap[T]\n\n./sdk/src/client.ts:\n19:type ClientToolName = 'write_file' | 'run_terminal_command'\n28: ClientToolName,\n223: let override = this.overrideTools[toolName as ClientToolName]\n\n./common/src/types/dynamic-agent-template.ts:\n106: const validToolNames = toolNames as readonly string[]\n108: (tool) => !validToolNames.includes(tool),\n114: const validToolNames = toolNames as readonly string[]\n116: (tool) => !validToolNames.includes(tool),\n\n./sdk/src/types/tools.ts:\n4:export type ToolName =\n284:export type GetToolParams = ToolParamsMap[T]\n\n./sdk/src/types/agent-definition.ts:\n8: * import { AgentDefinition, ToolName, ModelName } from './types/agent-definition'\n42: toolNames?: ToolName[]\n191:export type ToolCall = {\n321:type ToolName = Tools.ToolName\n\n./common/src/types/agent-template.ts:\n3:import type { ToolName } from '../tools/constants'\n15: toolNames: ToolName[]\n\n./common/src/tools/list.ts:\n23:import type { ToolName, ToolParams } from './constants'\n48: [K in ToolName]: ToolParams\n91:} as const satisfies Record\n\n./common/src/tools/utils.ts:\n10:import type { StringToolResultPart, ToolName } from './constants'\n13:export function getToolCallString(\n15: params: T extends ToolName\n18: ...endsAgentStep: T extends ToolName ? [] : [boolean]\n\n./common/src/tools/compile-tool-definitions.ts:\n42:export type ToolName = ${toolUnion}\n56:export type GetToolParams = ToolParamsMap[T]\n\n./common/src/tools/constants.ts:\n37:export type ToolName = (typeof toolNames)[number]\n39:export type ToolParams = {\n\n./backend/src/tools/tool-executor.ts:\n16:import type { ToolName } from '@codebuff/common/tools/constants'\n28:export function parseRawToolCall(\n95:export interface ExecuteToolCallParams {\n114:export function executeToolCall({\n\n./backend/src/templates/types.ts:\n3:import type { ToolName } from '@codebuff/common/tools/constants'\n41:export const baseAgentToolNames: ToolName[] = [\n\n./backend/src/tools/handlers/list.ts:\n24:import type { ToolName } from '@codebuff/common/tools/constants'\n58: [K in ToolName]: CodebuffToolHandlerFunction\n\n./backend/src/templates/agents/thinking-base.ts:\n9:import { baseAgentSubagents, baseAgentToolNames } from '../types'\n26: toolNames: baseAgentToolNames,\n\n./backend/src/templates/strings.ts:\n22:import type { ToolName } from '@codebuff/common/tools/constants'\n33: tools: ToolName[],\n\n./backend/src/templates/agents/agent-builder.ts:\n14:import type { ToolName } from '@codebuff/common/tools/constants'\n121: ] satisfies ToolName[],\n\n./backend/src/tools/handlers/handler-function-type.ts:\n2:import type { ToolName } from '@codebuff/common/tools/constants'\n9:export type CodebuffToolHandlerFunction = (\n\n./backend/src/tools/definitions/tool-def-type.ts:\n1:import type { ToolName } from '@codebuff/common/tools/constants'\n3:export type ToolDescription = {\n\n./backend/src/tools/stream-parser.ts:\n12:import type { ToolName } from '@codebuff/common/tools/constants'\n98: function toolCallback(toolName: T) {\n\n./backend/src/tools/definitions/list.ts:\n26:import type { ToolName } from '@codebuff/common/tools/constants'\n52: [K in ToolName]: ToolDescription\n55:export type ToolDefinition = {\n56: [K in ToolName]: (typeof toolDescriptions)[K] & (typeof llmToolCallSchema)[K]\n63: ...toolDescriptions[toolName as ToolName],\n64: ...llmToolCallSchema[toolName as ToolName],\n67:) as { [K in ToolName]: ToolDefinition } satisfies ToolSet\n\n./backend/src/tools/constants.ts:\n5:import type { ToolName } from '@codebuff/common/tools/constants'\n12:export type CodebuffToolCall = {\n13: [K in ToolName]: {\n20:export type ClientToolCall = {\n21: [K in ToolName]: {\n\n./backend/src/tools/prompts.ts:\n8:import type { ToolName } from '@codebuff/common/tools/constants'\n69:export const getToolsInstructions = (toolNames: readonly ToolName[]) =>\n138:export const getShortToolInstructions = (toolNames: readonly ToolName[]) => {", - "message": "Exit code: 0" - } - } - ], - "parentAgentId": "D-WFdRpUJVk" - }, - { - "type": "tool_call", - "toolCallId": "2c05c647-9640-4de4-9ba9-1ce8c19822fa", - "toolName": "code_search", - "input": { - "pattern": "generate-tool-definitions|compile-tool-definitions", - "flags": "" - }, - "agentId": "D-WFdRpUJVk", - "parentAgentId": "main-agent", - "includeToolCall": true - }, - { - "type": "tool_result", - "toolCallId": "2c05c647-9640-4de4-9ba9-1ce8c19822fa", - "toolName": "code_search", - "output": [ - { - "type": "json", - "value": { - "stdout": "./package.json:\n37: \"generate-tool-definitions\": \"bun scripts/generate-tool-definitions.ts\"\n\n./scripts/generate-tool-definitions.ts:\n7:import { compileToolDefinitions } from '@codebuff/common/tools/compile-tool-definitions'\n\n./codebuff.json:\n64: \"name\": \"regenerate-tool-definitions\",\n65: \"command\": \"bun run generate-tool-definitions\",", - "message": "Exit code: 0" - } - } - ], - "parentAgentId": "D-WFdRpUJVk" - }, - { - "type": "tool_call", - "toolCallId": "3071352d-301d-4d65-a79a-7407f56beee8", - "toolName": "set_output", - "input": { - "results": [ - { - "stdout": ".agents/types/agent-definition.d.ts:\n8: * import { AgentDefinition, ToolName, ModelName } from './types/agent-definition'\n42: toolNames?: ToolName[]\n191:export type ToolCall = {\n321:type ToolName = Tools.ToolName\n\n.agents/types/tools.d.ts:\n4:export type ToolName =\n284:export type GetToolParams = ToolParamsMap[T]\n\n./npm-app/src/utils/tool-renderers.ts:\n9:import type { ToolName } from '@codebuff/common/tools/constants'\n110:export const toolRenderers: Record = {\n\n./common/src/util/types/agent-definition.d.ts:\n8: * import { AgentDefinition, ToolName, ModelName } from './types/agent-definition'\n42: toolNames?: ToolName[]\n191:export type ToolCall = {\n321:type ToolName = Tools.ToolName\n\n./common/src/util/types/tools.d.ts:\n4:export type ToolName =\n284:export type GetToolParams = ToolParamsMap[T]\n\n./sdk/src/client.ts:\n19:type ClientToolName = 'write_file' | 'run_terminal_command'\n28: ClientToolName,\n223: let override = this.overrideTools[toolName as ClientToolName]\n\n./common/src/types/dynamic-agent-template.ts:\n106: const validToolNames = toolNames as readonly string[]\n108: (tool) => !validToolNames.includes(tool),\n114: const validToolNames = toolNames as readonly string[]\n116: (tool) => !validToolNames.includes(tool),\n\n./sdk/src/types/tools.ts:\n4:export type ToolName =\n284:export type GetToolParams = ToolParamsMap[T]\n\n./sdk/src/types/agent-definition.ts:\n8: * import { AgentDefinition, ToolName, ModelName } from './types/agent-definition'\n42: toolNames?: ToolName[]\n191:export type ToolCall = {\n321:type ToolName = Tools.ToolName\n\n./common/src/types/agent-template.ts:\n3:import type { ToolName } from '../tools/constants'\n15: toolNames: ToolName[]\n\n./common/src/tools/list.ts:\n23:import type { ToolName, ToolParams } from './constants'\n48: [K in ToolName]: ToolParams\n91:} as const satisfies Record\n\n./common/src/tools/utils.ts:\n10:import type { StringToolResultPart, ToolName } from './constants'\n13:export function getToolCallString(\n15: params: T extends ToolName\n18: ...endsAgentStep: T extends ToolName ? [] : [boolean]\n\n./common/src/tools/compile-tool-definitions.ts:\n42:export type ToolName = ${toolUnion}\n56:export type GetToolParams = ToolParamsMap[T]\n\n./common/src/tools/constants.ts:\n37:export type ToolName = (typeof toolNames)[number]\n39:export type ToolParams = {\n\n./backend/src/tools/tool-executor.ts:\n16:import type { ToolName } from '@codebuff/common/tools/constants'\n28:export function parseRawToolCall(\n95:export interface ExecuteToolCallParams {\n114:export function executeToolCall({\n\n./backend/src/templates/types.ts:\n3:import type { ToolName } from '@codebuff/common/tools/constants'\n41:export const baseAgentToolNames: ToolName[] = [\n\n./backend/src/tools/handlers/list.ts:\n24:import type { ToolName } from '@codebuff/common/tools/constants'\n58: [K in ToolName]: CodebuffToolHandlerFunction\n\n./backend/src/templates/agents/thinking-base.ts:\n9:import { baseAgentSubagents, baseAgentToolNames } from '../types'\n26: toolNames: baseAgentToolNames,\n\n./backend/src/templates/strings.ts:\n22:import type { ToolName } from '@codebuff/common/tools/constants'\n33: tools: ToolName[],\n\n./backend/src/templates/agents/agent-builder.ts:\n14:import type { ToolName } from '@codebuff/common/tools/constants'\n121: ] satisfies ToolName[],\n\n./backend/src/tools/handlers/handler-function-type.ts:\n2:import type { ToolName } from '@codebuff/common/tools/constants'\n9:export type CodebuffToolHandlerFunction = (\n\n./backend/src/tools/definitions/tool-def-type.ts:\n1:import type { ToolName } from '@codebuff/common/tools/constants'\n3:export type ToolDescription = {\n\n./backend/src/tools/stream-parser.ts:\n12:import type { ToolName } from '@codebuff/common/tools/constants'\n98: function toolCallback(toolName: T) {\n\n./backend/src/tools/definitions/list.ts:\n26:import type { ToolName } from '@codebuff/common/tools/constants'\n52: [K in ToolName]: ToolDescription\n55:export type ToolDefinition = {\n56: [K in ToolName]: (typeof toolDescriptions)[K] & (typeof llmToolCallSchema)[K]\n63: ...toolDescriptions[toolName as ToolName],\n64: ...llmToolCallSchema[toolName as ToolName],\n67:) as { [K in ToolName]: ToolDefinition } satisfies ToolSet\n\n./backend/src/tools/constants.ts:\n5:import type { ToolName } from '@codebuff/common/tools/constants'\n12:export type CodebuffToolCall = {\n13: [K in ToolName]: {\n20:export type ClientToolCall = {\n21: [K in ToolName]: {\n\n./backend/src/tools/prompts.ts:\n8:import type { ToolName } from '@codebuff/common/tools/constants'\n69:export const getToolsInstructions = (toolNames: readonly ToolName[]) =>\n138:export const getShortToolInstructions = (toolNames: readonly ToolName[]) => {", - "message": "Exit code: 0" - }, - { - "stdout": "./package.json:\n37: \"generate-tool-definitions\": \"bun scripts/generate-tool-definitions.ts\"\n\n./scripts/generate-tool-definitions.ts:\n7:import { compileToolDefinitions } from '@codebuff/common/tools/compile-tool-definitions'\n\n./codebuff.json:\n64: \"name\": \"regenerate-tool-definitions\",\n65: \"command\": \"bun run generate-tool-definitions\",", - "message": "Exit code: 0" - } - ] - }, - "agentId": "D-WFdRpUJVk", - "parentAgentId": "main-agent", - "includeToolCall": false - }, - { - "type": "tool_result", - "toolCallId": "3071352d-301d-4d65-a79a-7407f56beee8", - "toolName": "set_output", - "output": [ - { - "type": "json", - "value": { - "message": "Output set" - } - } - ], - "parentAgentId": "D-WFdRpUJVk" - }, - { - "type": "subagent_finish", - "agentId": "D-WFdRpUJVk", - "agentType": "code-searcher", - "displayName": "Code Searcher", - "onlyChild": true, - "parentAgentId": "main-agent", - "prompt": "", - "params": { - "searchQueries": [ - { - "pattern": "ToolName|PublicTool|ApprovedTool", - "flags": "-g *.ts" - }, - { - "pattern": "generate-tool-definitions|compile-tool-definitions", - "flags": "" - } - ] - } - }, - { - "type": "tool_result", - "toolCallId": "D-WFT0P7c6U", - "toolName": "spawn_agents", - "output": [ - { - "type": "json", - "value": [ - { - "agentName": "Code Searcher", - "agentType": "code-searcher", - "value": { - "type": "structuredOutput", - "value": { - "results": [ - { - "stdout": ".agents/types/agent-definition.d.ts:\n8: * import { AgentDefinition, ToolName, ModelName } from './types/agent-definition'\n42: toolNames?: ToolName[]\n191:export type ToolCall = {\n321:type ToolName = Tools.ToolName\n\n.agents/types/tools.d.ts:\n4:export type ToolName =\n284:export type GetToolParams = ToolParamsMap[T]\n\n./npm-app/src/utils/tool-renderers.ts:\n9:import type { ToolName } from '@codebuff/common/tools/constants'\n110:export const toolRenderers: Record = {\n\n./common/src/util/types/agent-definition.d.ts:\n8: * import { AgentDefinition, ToolName, ModelName } from './types/agent-definition'\n42: toolNames?: ToolName[]\n191:export type ToolCall = {\n321:type ToolName = Tools.ToolName\n\n./common/src/util/types/tools.d.ts:\n4:export type ToolName =\n284:export type GetToolParams = ToolParamsMap[T]\n\n./sdk/src/client.ts:\n19:type ClientToolName = 'write_file' | 'run_terminal_command'\n28: ClientToolName,\n223: let override = this.overrideTools[toolName as ClientToolName]\n\n./common/src/types/dynamic-agent-template.ts:\n106: const validToolNames = toolNames as readonly string[]\n108: (tool) => !validToolNames.includes(tool),\n114: const validToolNames = toolNames as readonly string[]\n116: (tool) => !validToolNames.includes(tool),\n\n./sdk/src/types/tools.ts:\n4:export type ToolName =\n284:export type GetToolParams = ToolParamsMap[T]\n\n./sdk/src/types/agent-definition.ts:\n8: * import { AgentDefinition, ToolName, ModelName } from './types/agent-definition'\n42: toolNames?: ToolName[]\n191:export type ToolCall = {\n321:type ToolName = Tools.ToolName\n\n./common/src/types/agent-template.ts:\n3:import type { ToolName } from '../tools/constants'\n15: toolNames: ToolName[]\n\n./common/src/tools/list.ts:\n23:import type { ToolName, ToolParams } from './constants'\n48: [K in ToolName]: ToolParams\n91:} as const satisfies Record\n\n./common/src/tools/utils.ts:\n10:import type { StringToolResultPart, ToolName } from './constants'\n13:export function getToolCallString(\n15: params: T extends ToolName\n18: ...endsAgentStep: T extends ToolName ? [] : [boolean]\n\n./common/src/tools/compile-tool-definitions.ts:\n42:export type ToolName = ${toolUnion}\n56:export type GetToolParams = ToolParamsMap[T]\n\n./common/src/tools/constants.ts:\n37:export type ToolName = (typeof toolNames)[number]\n39:export type ToolParams = {\n\n./backend/src/tools/tool-executor.ts:\n16:import type { ToolName } from '@codebuff/common/tools/constants'\n28:export function parseRawToolCall(\n95:export interface ExecuteToolCallParams {\n114:export function executeToolCall({\n\n./backend/src/templates/types.ts:\n3:import type { ToolName } from '@codebuff/common/tools/constants'\n41:export const baseAgentToolNames: ToolName[] = [\n\n./backend/src/tools/handlers/list.ts:\n24:import type { ToolName } from '@codebuff/common/tools/constants'\n58: [K in ToolName]: CodebuffToolHandlerFunction\n\n./backend/src/templates/agents/thinking-base.ts:\n9:import { baseAgentSubagents, baseAgentToolNames } from '../types'\n26: toolNames: baseAgentToolNames,\n\n./backend/src/templates/strings.ts:\n22:import type { ToolName } from '@codebuff/common/tools/constants'\n33: tools: ToolName[],\n\n./backend/src/templates/agents/agent-builder.ts:\n14:import type { ToolName } from '@codebuff/common/tools/constants'\n121: ] satisfies ToolName[],\n\n./backend/src/tools/handlers/handler-function-type.ts:\n2:import type { ToolName } from '@codebuff/common/tools/constants'\n9:export type CodebuffToolHandlerFunction = (\n\n./backend/src/tools/definitions/tool-def-type.ts:\n1:import type { ToolName } from '@codebuff/common/tools/constants'\n3:export type ToolDescription = {\n\n./backend/src/tools/stream-parser.ts:\n12:import type { ToolName } from '@codebuff/common/tools/constants'\n98: function toolCallback(toolName: T) {\n\n./backend/src/tools/definitions/list.ts:\n26:import type { ToolName } from '@codebuff/common/tools/constants'\n52: [K in ToolName]: ToolDescription\n55:export type ToolDefinition = {\n56: [K in ToolName]: (typeof toolDescriptions)[K] & (typeof llmToolCallSchema)[K]\n63: ...toolDescriptions[toolName as ToolName],\n64: ...llmToolCallSchema[toolName as ToolName],\n67:) as { [K in ToolName]: ToolDefinition } satisfies ToolSet\n\n./backend/src/tools/constants.ts:\n5:import type { ToolName } from '@codebuff/common/tools/constants'\n12:export type CodebuffToolCall = {\n13: [K in ToolName]: {\n20:export type ClientToolCall = {\n21: [K in ToolName]: {\n\n./backend/src/tools/prompts.ts:\n8:import type { ToolName } from '@codebuff/common/tools/constants'\n69:export const getToolsInstructions = (toolNames: readonly ToolName[]) =>\n138:export const getShortToolInstructions = (toolNames: readonly ToolName[]) => {", - "message": "Exit code: 0" - }, - { - "stdout": "./package.json:\n37: \"generate-tool-definitions\": \"bun scripts/generate-tool-definitions.ts\"\n\n./scripts/generate-tool-definitions.ts:\n7:import { compileToolDefinitions } from '@codebuff/common/tools/compile-tool-definitions'\n\n./codebuff.json:\n64: \"name\": \"regenerate-tool-definitions\",\n65: \"command\": \"bun run generate-tool-definitions\",", - "message": "Exit code: 0" - } - ] - } - } - } - ] - } - ] - }, - { - "type": "tool_call", - "toolCallId": "66e8c57a-6048-410f-8264-bdf573cb0ac6", - "toolName": "spawn_agent_inline", - "input": { - "agent_type": "context-pruner", - "params": {} - }, - "agentId": "main-agent", - "includeToolCall": false - }, - { - "type": "tool_result", - "toolCallId": "66e8c57a-6048-410f-8264-bdf573cb0ac6", - "toolName": "spawn_agent_inline", - "output": [ - { - "type": "json", - "value": { - "message": "Agent spawned." - } - } - ] - }, - { - "type": "tool_call", - "toolCallId": "D-X9KE0M3ng", - "toolName": "read_files", - "input": { - "paths": [ - "common/src/util/types/tools.d.ts" - ] - }, - "agentId": "main-agent", - "includeToolCall": true - }, - { - "type": "tool_call", - "toolCallId": "D-X9ly-k7n0", - "toolName": "read_files", - "input": { - "paths": [ - "package.json" - ] - }, - "agentId": "main-agent", - "includeToolCall": true - }, - { - "type": "tool_call", - "toolCallId": "D-YDkB72XEA", - "toolName": "spawn_agents", - "input": { - "agents": [ - { - "agent_type": "code-searcher", - "params": { - "searchQueries": [ - { - "pattern": "bun\\s+run\\s+typecheck|tsc|bun\\s+check|typecheck", - "flags": "-g package.json -g *.json" - } - ] - } - } - ] - }, - "agentId": "main-agent", - "includeToolCall": true - }, - { - "type": "tool_result", - "toolCallId": "D-X9KE0M3ng", - "toolName": "read_files", - "output": [ - { - "type": "json", - "value": [ - { - "path": "common/src/util/types/tools.d.ts", - "content": "/**\n * Union type of all available tool names\n */\nexport type ToolName =\n | 'add_message'\n | 'add_subgoal'\n | 'browser_logs'\n | 'code_search'\n | 'create_plan'\n | 'end_turn'\n | 'find_files'\n | 'read_docs'\n | 'read_files'\n | 'run_file_change_hooks'\n | 'run_terminal_command'\n | 'set_messages'\n | 'set_output'\n | 'spawn_agents'\n | 'spawn_agents_async'\n | 'spawn_agent_inline'\n | 'str_replace'\n | 'think_deeply'\n | 'update_subgoal'\n | 'web_search'\n | 'write_file'\n\n/**\n * Map of tool names to their parameter types\n */\nexport interface ToolParamsMap {\n add_message: AddMessageParams\n add_subgoal: AddSubgoalParams\n browser_logs: BrowserLogsParams\n code_search: CodeSearchParams\n create_plan: CreatePlanParams\n end_turn: EndTurnParams\n find_files: FindFilesParams\n read_docs: ReadDocsParams\n read_files: ReadFilesParams\n run_file_change_hooks: RunFileChangeHooksParams\n run_terminal_command: RunTerminalCommandParams\n set_messages: SetMessagesParams\n set_output: SetOutputParams\n spawn_agents: SpawnAgentsParams\n spawn_agents_async: SpawnAgentsAsyncParams\n spawn_agent_inline: SpawnAgentInlineParams\n str_replace: StrReplaceParams\n think_deeply: ThinkDeeplyParams\n update_subgoal: UpdateSubgoalParams\n web_search: WebSearchParams\n write_file: WriteFileParams\n}\n\n/**\n * Add a new message to the conversation history. To be used for complex requests that can't be solved in a single step, as you may forget what happened!\n */\nexport interface AddMessageParams {\n role: 'user' | 'assistant'\n content: string\n}\n\n/**\n * Add a new subgoal for tracking progress. To be used for complex requests that can't be solved in a single step, as you may forget what happened!\n */\nexport interface AddSubgoalParams {\n /** A unique identifier for the subgoal. Try to choose the next sequential integer that is not already in use. */\n id: string\n /** The objective of the subgoal, concisely and clearly stated. */\n objective: string\n /** The status of the subgoal. */\n status: 'NOT_STARTED' | 'IN_PROGRESS' | 'COMPLETE' | 'ABORTED'\n /** A plan for the subgoal. */\n plan?: string\n /** A log message for the subgoal progress. */\n log?: string\n}\n\n/**\n * Parameters for browser_logs tool\n */\nexport interface BrowserLogsParams {\n /** The type of browser action to perform (e.g., \"navigate\"). */\n type: string\n /** The URL to navigate to. */\n url: string\n /** When to consider navigation successful. Defaults to 'load'. */\n waitUntil?: 'load' | 'domcontentloaded' | 'networkidle0'\n}\n\n/**\n * Search for string patterns in the project's files. This tool uses ripgrep (rg), a fast line-oriented search tool. Use this tool only when read_files is not sufficient to find the files you need.\n */\nexport interface CodeSearchParams {\n /** The pattern to search for. */\n pattern: string\n /** Optional ripgrep flags to customize the search (e.g., \"-i\" for case-insensitive, \"-t ts\" for TypeScript files only, \"-A 3\" for 3 lines after match, \"-B 2\" for 2 lines before match, \"--type-not test\" to exclude test files). */\n flags?: string\n /** Optional working directory to search within, relative to the project root. Defaults to searching the entire project. */\n cwd?: string\n}\n\n/**\n * Generate a detailed markdown plan for complex tasks.\n */\nexport interface CreatePlanParams {\n /** The path including the filename of a markdown file that will be overwritten with the plan. */\n path: string\n /** A detailed plan to solve the user's request. */\n plan: string\n}\n\n/**\n * End your turn, regardless of any new tool results that might be coming. This will allow the user to type another prompt.\n */\nexport interface EndTurnParams {}\n\n/**\n * Find several files related to a brief natural language description of the files or the name of a function or class you are looking for.\n */\nexport interface FindFilesParams {\n /** A brief natural language description of the files or the name of a function or class you are looking for. It's also helpful to mention a directory or two to look within. */\n prompt: string\n}\n\n/**\n * Fetch up-to-date documentation for libraries and frameworks using Context7 API.\n */\nexport interface ReadDocsParams {\n /** The exact library or framework name (e.g., \"Next.js\", \"MongoDB\", \"React\"). Use the official name as it appears in documentation, not a search query. */\n libraryTitle: string\n /** Optional specific topic to focus on (e.g., \"routing\", \"hooks\", \"authentication\") */\n topic?: string\n /** Optional maximum number of tokens to return. Defaults to 10000. Values less than 10000 are automatically increased to 10000. */\n max_tokens?: number\n}\n\n/**\n * Read the multiple files from disk and return their contents. Use this tool to read as many files as would be helpful to answer the user's request.\n */\nexport interface ReadFilesParams {\n /** List of file paths to read. */\n paths: string[]\n}\n\n/**\n * Parameters for run_file_change_hooks tool\n */\nexport interface RunFileChangeHooksParams {\n /** List of file paths that were changed and should trigger file change hooks */\n files: string[]\n}\n\n/**\n * Execute a CLI command from the **project root** (different from the user's cwd).\n */\nexport interface RunTerminalCommandParams {\n /** CLI command valid for user's OS. */\n command: string\n /** Either SYNC (waits, returns output) or BACKGROUND (runs in background). Default SYNC */\n process_type?: 'SYNC' | 'BACKGROUND'\n /** The working directory to run the command in. Default is the project root. */\n cwd?: string\n /** Set to -1 for no timeout. Does not apply for BACKGROUND commands. Default 30 */\n timeout_seconds?: number\n}\n\n/**\n * Set the conversation history to the provided messages.\n */\nexport interface SetMessagesParams {\n messages: {\n role: 'user' | 'assistant'\n content: string\n }[]\n}\n\n/**\n * JSON object to set as the agent output. This completely replaces any previous output. If the agent was spawned, this value will be passed back to its parent. If the agent has an outputSchema defined, the output will be validated against it.\n */\nexport interface SetOutputParams {}\n\n/**\n * Spawn multiple agents and send a prompt to each of them.\n */\nexport interface SpawnAgentsParams {\n agents: {\n /** Agent to spawn */\n agent_type: string\n /** Prompt to send to the agent */\n prompt?: string\n /** Parameters object for the agent (if any) */\n params?: Record\n }[]\n}\n\n/**\n * Parameters for spawn_agents_async tool\n */\nexport interface SpawnAgentsAsyncParams {\n agents: {\n /** Agent to spawn */\n agent_type: string\n /** Prompt to send to the agent */\n prompt?: string\n /** Parameters object for the agent (if any) */\n params?: Record\n }[]\n}\n\n/**\n * Spawn a single agent that runs within the current message history.\n */\nexport interface SpawnAgentInlineParams {\n /** Agent to spawn */\n agent_type: string\n /** Prompt to send to the agent */\n prompt?: string\n /** Parameters object for the agent (if any) */\n params?: Record\n}\n\n/**\n * Replace strings in a file with new strings.\n */\nexport interface StrReplaceParams {\n /** The path to the file to edit. */\n path: string\n /** Array of replacements to make. */\n replacements: {\n /** The string to replace. This must be an *exact match* of the string you want to replace, including whitespace and punctuation. */\n old: string\n /** The string to replace the corresponding old string with. Can be empty to delete. */\n new: string\n }[]\n}\n\n/**\n * Deeply consider complex tasks by brainstorming approaches and tradeoffs step-by-step.\n */\nexport interface ThinkDeeplyParams {\n /** Detailed step-by-step analysis. Initially keep each step concise (max ~5-7 words per step). */\n thought: string\n}\n\n/**\n * Update a subgoal in the context given the id, and optionally the status or plan, or a new log to append. Feel free to update any combination of the status, plan, or log in one invocation.\n */\nexport interface UpdateSubgoalParams {\n /** The id of the subgoal to update. */\n id: string\n /** Change the status of the subgoal. */\n status?: 'NOT_STARTED' | 'IN_PROGRESS' | 'COMPLETE' | 'ABORTED'\n /** Change the plan for the subgoal. */\n plan?: string\n /** Add a log message to the subgoal. This will create a new log entry and append it to the existing logs. Use this to record your progress and any new information you learned as you go. */\n log?: string\n}\n\n/**\n * Search the web for current information using Linkup API.\n */\nexport interface WebSearchParams {\n /** The search query to find relevant web content */\n query: string\n /** Search depth - 'standard' for quick results, 'deep' for more comprehensive search. Default is 'standard'. */\n depth: 'standard' | 'deep'\n}\n\n/**\n * Create or edit a file with the given content.\n */\nexport interface WriteFileParams {\n /** Path to the file relative to the **project root** */\n path: string\n /** What the change is intended to do in only one sentence. */\n instructions: string\n /** Edit snippet to apply to the file. */\n content: string\n}\n\n/**\n * Get parameters type for a specific tool\n */\nexport type GetToolParams = ToolParamsMap[T]\n", - "referencedBy": {} - } - ] - } - ] - }, - { - "type": "tool_result", - "toolCallId": "D-X9ly-k7n0", - "toolName": "read_files", - "output": [ - { - "type": "json", - "value": [ - { - "path": "package.json", - "content": "{\n \"name\": \"codebuff-project\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"license\": \"UNLICENSED\",\n \"type\": \"module\",\n \"workspaces\": [\n \"common\",\n \"backend\",\n \"npm-app\",\n \"web\",\n \"packages/*\",\n \"scripts\",\n \"evals\",\n \"sdk\"\n ],\n \"scripts\": {\n \"dev\": \"bash scripts/dev.sh\",\n \"start-db\": \"bun --cwd common db:start\",\n \"start-bin\": \"bun --cwd npm-app start-bin\",\n \"start-web\": \"bun start-db && bun --cwd web dev\",\n \"start-studio\": \"bun --cwd common db:studio\",\n \"start-server\": \"bun --cwd backend dev\",\n \"start-manifold\": \"bun --cwd npm-app start-manifold\",\n \"start-codebuff-test\": \"bun --cwd npm-app start --cwd ../../codebuff-test\",\n \"start-litestar\": \"bun --cwd npm-app start-litestar\",\n \"start-jpcsp\": \"bun --cwd npm-app start-jpcsp\",\n \"start-vscode\": \"bun --cwd npm-app start-vscode\",\n \"start-nushell\": \"bun --cwd npm-app start-nushell\",\n \"format\": \"prettier --write \\\"**/*.{ts,tsx,json,md}\\\"\",\n \"release:npm-app\": \"bun run --cwd npm-app release\",\n \"clean-ts\": \"find . -name '*.tsbuildinfo' -type f -delete && find . -name '.next' -type d -exec rm -rf {} + 2>/dev/null || true && find . -name 'node_modules' -type d -exec rm -rf {} + 2>/dev/null || true && bun install\",\n \"typecheck\": \"bun --filter='*' run typecheck && echo '✅ All type checks passed!'\",\n \"test\": \"bun --filter='{@codebuff/backend,@codebuff/common,@codebuff/npm-app}' run test\",\n \"init-worktree\": \"bun scripts/init-worktree.ts\",\n \"cleanup-worktree\": \"bash scripts/cleanup-worktree.sh\",\n \"generate-tool-definitions\": \"bun scripts/generate-tool-definitions.ts\"\n },\n \"dependencies\": {\n \"@t3-oss/env-nextjs\": \"^0.7.3\",\n \"zod\": \"3.25.67\"\n },\n \"overrides\": {\n \"zod\": \"3.25.67\"\n },\n \"devDependencies\": {\n \"@tanstack/react-query\": \"^5.59.16\",\n \"@types/bun\": \"^1.2.11\",\n \"@types/lodash\": \"4.17.7\",\n \"@types/node\": \"^22.9.0\",\n \"@types/node-fetch\": \"^2.6.12\",\n \"@types/parse-path\": \"^7.1.0\",\n \"@typescript-eslint/eslint-plugin\": \"^6.17\",\n \"bun-types\": \"^1.2.2\",\n \"eslint-config-prettier\": \"^9.1.0\",\n \"eslint-plugin-import\": \"^2.29.1\",\n \"eslint-plugin-unused-imports\": \"^4.1.4\",\n \"ignore\": \"^6.0.2\",\n \"lodash\": \"4.17.21\",\n \"prettier\": \"3.3.2\",\n \"ts-node\": \"^10.9.2\",\n \"ts-pattern\": \"^5.5.0\",\n \"tsc-alias\": \"1.7.0\",\n \"tsconfig-paths\": \"4.2.0\",\n \"types\": \"^0.1.1\",\n \"typescript\": \"5.5.4\",\n \"typescript-eslint\": \"^7.17.0\"\n },\n \"engines\": {\n \"node\": \">=20.0.0\"\n },\n \"packageManager\": \"yarn@1.22.22+sha512.a6b2f7906b721bba3d67d4aff083df04dad64c399707841b7acf00f6b133b7ac24255f2652fa22ae3534329dc6180534e98d17432037ff6fd140556e2bb3137e\"\n}\n", - "referencedBy": {} - } - ] - } - ] - }, - { - "type": "subagent_start", - "agentId": "D-YDzDAsNdY", - "agentType": "code-searcher", - "displayName": "Code Searcher", - "onlyChild": true, - "parentAgentId": "main-agent", - "prompt": "", - "params": { - "searchQueries": [ - { - "pattern": "bun\\s+run\\s+typecheck|tsc|bun\\s+check|typecheck", - "flags": "-g package.json -g *.json" - } - ] - } - }, - { - "type": "tool_call", - "toolCallId": "fc68cc40-c253-4e5e-a9ab-f74212a80796", - "toolName": "code_search", - "input": { - "pattern": "bun\\s+run\\s+typecheck|tsc|bun\\s+check|typecheck", - "flags": "-g package.json -g *.json" - }, - "agentId": "D-YDzDAsNdY", - "parentAgentId": "main-agent", - "includeToolCall": true - }, - { - "type": "tool_result", - "toolCallId": "fc68cc40-c253-4e5e-a9ab-f74212a80796", - "toolName": "code_search", - "output": [ - { - "type": "json", - "value": { - "stdout": "./npm-app/package.json:\n22: \"typecheck\": \"tsc --noEmit -p .\",\n\n./scripts/tsconfig.json:\n2: \"extends\": \"../tsconfig.base.json\",\n\n./npm-app/tsconfig.json:\n2: \"extends\": \"../tsconfig.base.json\",\n\n./tsconfig.json:\n2: \"extends\": \"./tsconfig.base.json\",\n\n./packages/build-tools/tsconfig.json:\n2: \"extends\": \"../../tsconfig.base.json\",\n\n./common/tsconfig.json:\n2: \"extends\": \"../tsconfig.base.json\",\n\n./scripts/package.json:\n15: \"typecheck\": \"tsc --noEmit -p .\",\n18: \"typecheck-all\": \"bun run typecheck-all.ts\"\n\n./packages/billing/tsconfig.json:\n2: \"extends\": \"../../tsconfig.base.json\",\n\n./common/package.json:\n23: \"typecheck\": \"tsc --noEmit -p .\",\n\n./packages/build-tools/package.json:\n8: \"build\": \"tsc\",\n9: \"clean\": \"rm -rf dist && (rm tsconfig.tsbuildinfo || true)\"\n\n./codebuff.json:\n23: \"name\": \"backend-typecheck\",\n24: \"command\": \"bun run typecheck\",\n35: \"name\": \"npm-typecheck\",\n36: \"command\": \"bun run typecheck\",\n41: \"name\": \"web-typecheck\",\n42: \"command\": \"bun run typecheck\",\n53: \"name\": \"common-typecheck\",\n54: \"command\": \"bun run typecheck\",\n\n./packages/billing/package.json:\n22: \"typecheck\": \"tsc --noEmit -p .\",\n\n./packages/build-tools/project.json:\n11: \"command\": \"tsc\",\n18: \"command\": \"rm -rf dist && (rm tsconfig.tsbuildinfo || true)\",\n\n./packages/billing/project.json:\n10: \"command\": \"tsc -p tsconfig.json\",\n\n./sdk/package.json:\n24: \"build\": \"bun run copy-types && tsc\",\n31: \"typecheck\": \"tsc --noEmit -p .\",\n\n./package.json:\n33: \"typecheck\": \"bun --filter='*' run typecheck && echo '✅ All type checks passed!'\",\n63: \"tsc-alias\": \"1.7.0\",\n64: \"tsconfig-paths\": \"4.2.0\",\n\n./packages/bigquery/package.json:\n22: \"typecheck\": \"tsc --noEmit -p .\",\n\n./packages/bigquery/tsconfig.json:\n2: \"extends\": \"../../tsconfig.base.json\",\n\n./backend/package.json:\n19: \"typecheck\": \"tsc --noEmit -p .\",\n\n./packages/code-map/tsconfig.json:\n2: \"extends\": \"../../tsconfig.base.json\",\n\n./packages/code-map/package.json:\n22: \"typecheck\": \"tsc --noEmit -p .\",\n\n./backend/tsconfig.json:\n2: \"extends\": \"../tsconfig.base.json\",\n\n./evals/tsconfig.json:\n2: \"extends\": \"../tsconfig.base.json\",\n\n./evals/package.json:\n15: \"typecheck\": \"tsc --noEmit -p .\",\n\n./packages/internal/package.json:\n34: \"typecheck\": \"tsc --noEmit -p .\",\n\n./packages/internal/tsconfig.json:\n2: \"extends\": \"../../tsconfig.base.json\",\n\n./web/tsconfig.json:\n2: \"extends\": \"../tsconfig.base.json\",\n37: \"require\": [\"tsconfig-paths/register\"]\n\n./web/package.json:\n23: \"typecheck\": \"tsc --noEmit -p .\",\n\n./evals/git-evals/eval-result-codebuff-mock.json:\n21: \"preContent\": \"import { spawn } from 'child_process'\\nimport fs from 'fs'\\nimport path from 'path'\\n\\nimport { FileChange } from 'common/actions'\\nimport { models, TEST_USER_ID } from 'common/constants'\\nimport { getToolCallString } from 'common/src/constants/tools'\\nimport { z } from 'zod'\\n\\nimport { promptFlashWithFallbacks } from './llm-apis/gemini-with-fallbacks'\\nimport { gitCommitGuidePrompt } from './system-prompt/prompts'\\n\\nconst tools = [\\n {\\n name: 'add_subgoal',\\n description: `\\n### add_subgoal\\nDescription: Add a new subgoal for tracking progress. To be used for complex requests that can't be solved in a single step, as you may forget what happened!\\nParameters:\\n- id: (required) A unique identifier for the subgoal. Try to choose the next sequential integer that is not already in use.\\n- objective: (required) The objective of the subgoal, concisely and clearly stated.\\n- status: (required) The status of the subgoal. One of [\\\"NOT_STARTED\\\", \\\"IN_PROGRESS\\\", \\\"COMPLETE\\\", \\\"ABORTED\\\"]\\n- plan: (optional) A plan for the subgoal.\\nUsage:\\n${getToolCallString('add_subgoal', {\\n id: '1',\\n objective: 'Add a new \\\"deploy api\\\" subgoal',\\n status: 'IN_PROGRESS',\\n})}\\n `.trim(),\\n },\\n {\\n name: 'update_subgoal',\\n description: `\\n### update_subgoal\\nDescription: Update a subgoal in the context given the id, and optionally the status or plan, or a new log to append. Feel free to update any combination of the status, plan, or log in one invocation.\\nParameters:\\n- id: (required) The id of the subgoal to update.\\n- status: (optional) Change the status of the subgoal. One of [\\\"NOT_STARTED\\\", \\\"IN_PROGRESS\\\", \\\"COMPLETE\\\", \\\"FAILED\\\"]\\n- plan: (optional) Change the plan for the subgoal.\\n- log: (optional) Add a log message to the subgoal. This will create a new log entry and append it to the existing logs. Use this to record your progress and any new information you learned as you go.\\nUsage 1 (update status):\\n${getToolCallString('update_subgoal', {\\n id: '1',\\n status: 'COMPLETE',\\n})}\\n\\nUsage 2 (update plan):\\n${getToolCallString('update_subgoal', {\\n id: '3',\\n plan: 'Create a file for the endpoint in the api, and register it in the router',\\n})}\\n\\nUsage 3 (add log):\\n${getToolCallString('update_subgoal', {\\n id: '1',\\n log: \\\"I found the error in the tests, it's in the foo function.\\\",\\n})}\\n\\nUsage 4 (update status and add log):\\n${getToolCallString('update_subgoal', {\\n id: '1',\\n status: 'COMPLETE',\\n log: 'I reran the tests and they passed.',\\n})}\\n `.trim(),\\n },\\n {\\n name: 'write_file',\\n description: `\\n### write_file\\nDescription: Create or edit a file with the given content.\\n\\nWhen editing a file, please use this tool to output a simplified version of the code block that highlights the changes necessary and adds comments to indicate where unchanged code has been skipped.\\n\\n--- IMPORTANT OPTIMIZATION DETAIL ---\\nUse \\\"placeholder comments\\\" i.e. \\\"// ... existing code ...\\\" (or \\\"# ... existing code ...\\\" or \\\"/* ... existing code ... */\\\" or \\\"\\\" or however comments are written for other languages) in comments as often as you can, signifying unchanged regions of the file.\\nThe write_file tool is very expensive for each line of code you write, so try to write as little \\\\`content\\\\` as possible to accomplish the task. Often this will mean that the start/end of the file will be skipped, but that's okay! Rewrite the entire file only if specifically requested.\\n\\nHowever, for new files, you should write out the entire file and not use placeholder comments.\\n--- IMPORTANT OPTIMIZATION DETAIL ---\\n\\nThese edit codeblocks will be parsed and then read by a less intelligent \\\"apply\\\" language model to update the file. To help specify the edit to the apply model, be very careful to include a few lines of context when generating the codeblock to not introduce ambiguity. Specify all unchanged regions (code and comments) of the file with \\\"// ... existing code ...\\\" markers (in comments). This will ensure the apply model will not delete existing unchanged code or comments when editing the file. This is just an abstraction for your understanding, you should not mention the apply model to the user.\\n\\nDo not use this tool to delete or rename a file. Instead run a terminal command for that.\\n\\nParameters:\\n- path: (required) Path to the file relative to the **project root**\\n- content: (required) Content to write to the file. You should abridge the content of the file using placeholder comments like: \\\\`// ... existing code ...\\\\` or \\\\`# ... existing code ...\\\\` (or whichever is appropriate for the language).\\nUsage:\\n${getToolCallString('write_file', {\\n path: 'path/to/file',\\n content: 'Your file content here',\\n})}\\n\\nExample 1 - Simple file creation:\\n${getToolCallString('write_file', {\\n path: 'new-file.ts',\\n content: 'console.log(\\\"Hello, world!\\\");',\\n})}\\n\\nExample 2 - Editing with placeholder comments:\\n${getToolCallString('write_file', {\\n path: 'foo.ts',\\n content: `// ... existing code ...\\n\\nfunction foo() {\\n console.log('foo');\\n for (let i = 0; i < 10; i++) {\\n console.log(i);\\n }\\n doSomething();\\n}\\n\\n// ... existing code ...`,\\n})}\\n\\nNotes for editing a file:\\n- Don't use XML attributes. If you do, the tool will NOT write to the file.\\n- If you don't use any placeholder comments, the entire file will be replaced. E.g. don't write out a single function without using placeholder comments unless you want to replace the entire file with that function.\\n- When editing a file, try not to change any user code that doesn't need to be changed. In particular, you must preserve pre-existing user comments exactly as they are.\\n- You can also use this tool to create new files.\\n- After you have written out a write_file block, the changes will be applied immediately. You can assume that the changes went through as intended. However, note that there are sometimes mistakes in the processs of applying the edits you described in the write_file block, e.g. sometimes large portions of the file are deleted. If you notice that the changes did not go through as intended, based on further updates to the file, you can write out a new write_file block to fix the mistake.\\n- Don't escape characters — write them out directly! E.g. write out '&' instead of '&', '>' instead of '>', '<' instead of '<', and '\\\"' instead of '"' in the content.\\n `.trim(),\\n },\\n {\\n name: 'read_files',\\n description: `\\n### read_files\\nDescription: Read the multiple files from disk and return their contents. Use this tool to read as many files as would be helpful to answer the user's request. Make sure to read any files before you write to them with the write_file tool.\\nParameters:\\n- paths: (required) List of file paths to read relative to the **project root**, separated by newlines. Absolute file paths will not work.\\nUsage:\\n${getToolCallString('read_files', {\\n paths: 'path/to/file1.ts\\\\npath/to/file2.ts',\\n})}\\n\\n\\nNote that there's no need to call this tool if you're already reading the files you need in context.`.trim(),\\n },\\n {\\n name: 'find_files',\\n description: `\\n### find_files\\nDescription: Find several files related to a brief natural language description of the files or the name of a function or class you are looking for.\\nParameters:\\n- description: (required) A brief natural language description of the files or the name of a function or class you are looking for. It's also helpful to mention a directory or two to look within.\\nUsage:\\n\\nThe implementation of function foo\\n\\n\\nPurpose: Better fulfill the user request by reading files which could contain information relevant to the user's request.\\nUse cases:\\n- If you are calling a function or creating a class and want to know how it works, use this tool to get the implementation.\\n- If you need to understand a section of the codebase, read more files in that directory or subdirectories.\\n- Some requests require a broad understanding of multiple parts of the codebase. Consider using find_files to gain more context before making changes.\\n\\nDon't use this tool if:\\n- You already know the exact path of the file(s) you are looking for — in this case, use read_files.\\n- You already read the files you need in context.\\n\\nIn general, prefer using read_files instead of find_files.\\n `.trim(),\\n },\\n {\\n name: 'code_search',\\n description: `\\n### code_search\\nDescription: Search for string patterns in the project's files. This tool uses ripgrep (rg), a fast line-oriented search tool. Use this tool only when read_files is not sufficient to find the files you need.\\nParameters:\\n- pattern: (required) The pattern to search for.\\nUsage:\\n${getToolCallString('code_search', { pattern: 'foo' })}\\n${getToolCallString('code_search', { pattern: 'import.*foo' })}\\n\\nPurpose: Search through code files to find files with specific text patterns, function names, variable names, and more.\\n\\nNote: quotes will be automatically added around your code search pattern. You might need to escape special characters like '-' or '.' or '\\\\\\\\' if you want to search for them.\\n\\nPrefer to use read_files instead of code_search unless you need to search for a specific pattern in multiple files.\\n\\nUse cases:\\n1. Finding all references to a function, class, or variable name across the codebase\\n2. Searching for specific code patterns or implementations\\n3. Looking up where certain strings or text appear\\n4. Finding files that contain specific imports or dependencies\\n5. Locating configuration settings or environment variables\\n\\nThe pattern supports regular expressions and will search recursively through all files in the project by default. Some tips:\\n- Be as constraining in the pattern as possible to limit the number of files returned, e.g. if searching for the definition of a function, use \\\"(function foo|const foo)\\\" or \\\"def foo\\\" instead of merely \\\"foo\\\".\\n- Use word boundaries (\\\\\\\\b) to match whole words only\\n- Searches file content and filenames\\n- Automatically ignores binary files, hidden files, and files in .gitignore\\n- Case-sensitive by default. Use -i to make it case insensitive.\\n- Constrain the search to specific file types using -t , e.g. -t ts or -t py.\\n `.trim(),\\n },\\n {\\n name: 'run_terminal_command',\\n description: `\\n### run_terminal_command\\nDescription: Request to execute a CLI command on the system. Use this when you need to perform system operations or run specific commands to accomplish any step in the user's task. You must tailor your command to the user's system and provide a clear explanation of what the command does. For command chaining, use the appropriate chaining syntax for the user's shell. Prefer to execute complex CLI commands over creating executable scripts, as they are more flexible and easier to run. Commands will be executed in the current working directory: ${process.cwd()}\\nParameters:\\n- command: (required) The CLI command to execute. This should be valid for the current operating system. Ensure the command is properly formatted and does not contain any harmful instructions.\\n- process_type: (required) What type of process to run. One of SYNC or BACKGROUND.\\n - SYNC: the command will be run in (and block) the current process. This is required if the output of the command is needed immediately. Most commands will be run in this way. Do not try to run processes in the background with process_type=SYNC and using & at the end of the command. Instead, use the process_type=BACKGROUND option.\\n - BACKGROUND: the command will be run in a child background process. This is for running servers or other long-running processes.\\nUsage:\\n${getToolCallString('run_terminal_command', {\\n command: 'Your command here',\\n process_type: 'value',\\n})}\\n\\nStick to these use cases:\\n1. Compiling the project or running build (e.g., \\\"npm run build\\\"). Reading the output can help you edit code to fix build errors. If possible, use an option that performs checks but doesn't emit files, e.g. \\\\`tsc --noEmit\\\\`.\\n2. Running tests (e.g., \\\"npm test\\\"). Reading the output can help you edit code to fix failing tests. Or, you could write new unit tests and then run them.\\n3. Moving, renaming, or deleting files and directories. These actions can be vital for refactoring requests. Use commands like \\\\`mv\\\\`/\\\\`move\\\\` or \\\\`rm\\\\`/\\\\`del\\\\`.\\n\\nMost likely, you should ask for permission for any other type of command you want to run. If asking for permission, show the user the command you want to run using \\\\`\\\\`\\\\` tags.\\n\\nWhen using this tool, please adhere to the following rules:\\n\\n1. Do not run commands that can modify files outside of the project directory, install packages globally, install virtual environments, or have significant side effects outside of the project directory, unless you have explicit permission from the user. Treat anything outside of the project directory as read-only.\\n2. Do not run \\\\`git push\\\\` because it can break production (!) if the user was not expecting it. Don't run \\\\`git commit\\\\`, \\\\`git rebase\\\\`, or related commands unless you get explicit permission. If a user asks to commit changes, you can do so, but you should not invoke any further git commands beyond the git commit command.\\n3. Do not run scripts without asking. Especially don't run scripts that could run against the production environment or have permanent effects without explicit permission from the user. Don't run scripts with side effects without permission from the user unless they don't have much effect or are simple.\\n4. Be careful with any command that has big or irreversible effects. Anything that touches a production environment, servers, the database, or other systems that could be affected by a command should be run with explicit permission from the user.\\n4. Don't run too many commands in a row without pausing to check in with what the user wants to do next.\\n5. Do not use the run_terminal_command tool to create or edit files. Do not use \\\\`cat\\\\` or \\\\`echo\\\\` to create or edit files. You should instead write out blocks for for editing or creating files as detailed above in the block.\\n6. Do not install packages without asking, unless it is within a small, new-ish project. Users working on a larger project will want to manage packages themselves, so ask first.\\n7. Do not use the wrong package manager for the project. For example, if the project uses \\\\`pnpm\\\\` or \\\\`bun\\\\` or \\\\`yarn\\\\`, you should not use \\\\`npm\\\\`. Similarly not everyone uses \\\\`pip\\\\` for python, etc.\\n8. You must write out ampersands without escaping them. E.g. write out '&' instead of '&'.\\nIncorrect:\\n\\\\`cd backend && npm typecheck\\\\` \\nCorrect:\\n\\\\`cd backend && npm typecheck\\\\`\\n10. Do not use more than one run_terminal_command tool call in a single response. Wait for the tool results of each command before invoking the next one.\\n11. The user will not be able to interact with these processes, e.g. confirming the command. So if there's an opportunity to use \\\"-y\\\" or \\\"--yes\\\" flags, use them. Any command that prompts for confirmation will hang if you don't use the flags.\\n\\nNotes:\\n- The current working directory will always reset to **project root** directory for each command you run. You can only access files within this directory (or sub-directories). So if you run cd in one command, the directory change won't persist to the next command.\\n - \\\\`cd subdir && some_command\\\\` will work as expected.\\n - \\\\`cd subdir\\\\` in followed by \\\\`some_command\\\\` in two different commands will run some_command from the project root.\\n- Commands can succeed without giving any output, e.g. if no type errors were found. So you may not always see output for successful executions.\\n\\n${gitCommitGuidePrompt}\\n `.trim(),\\n },\\n {\\n name: 'think_deeply',\\n description: `\\n### think_deeply\\nDescription: Think through a complex change to the codebase, like implementing a new feature or refactoring some code. Brainstorm. Go deep on alternative approaches and consider the tradeoffs.\\nParameters: thought: (required) Your detailed thoughts.\\nUsage:\\n${getToolCallString('think_deeply', {\\n thought: '[Insert detailed thoughts here]',\\n})}\\n\\nThink step by step. For the first section of your thinking, only keep a minimum draft for each thinking step, with 5 words at most.\\n\\nUse this tool when the user request meets multiple of these criteria:\\n- Explicitly asks you to plan or think through something.\\n- Always use this tool right before using the create_plan tool.\\n- Requires changes across multiple files or systems\\n- Involves complex logic or architectural decisions\\n- Would benefit from breaking down into smaller steps\\n- Has potential edge cases or risks that need consideration\\n\\nExamples of when to use it:\\n- Adding a new feature that touches multiple parts of the system\\n- Refactoring core functionality used by many components\\n- Making architectural changes that affect the system design\\n- Implementing complex business logic with many edge cases\\n\\nDo not use it for simple changes like:\\n- Adding a single function or endpoint\\n- Updating text or styles\\n \n\n[Output truncated]\n\n[Output size limit reached.]", - "message": "Stopped early after 43 match(es)." - } - } - ], - "parentAgentId": "D-YDzDAsNdY" - }, - { - "type": "tool_call", - "toolCallId": "24de81f4-e433-4ebd-ba6f-01bc1a46c2e2", - "toolName": "set_output", - "input": { - "results": [ - { - "stdout": "./npm-app/package.json:\n22: \"typecheck\": \"tsc --noEmit -p .\",\n\n./scripts/tsconfig.json:\n2: \"extends\": \"../tsconfig.base.json\",\n\n./npm-app/tsconfig.json:\n2: \"extends\": \"../tsconfig.base.json\",\n\n./tsconfig.json:\n2: \"extends\": \"./tsconfig.base.json\",\n\n./packages/build-tools/tsconfig.json:\n2: \"extends\": \"../../tsconfig.base.json\",\n\n./common/tsconfig.json:\n2: \"extends\": \"../tsconfig.base.json\",\n\n./scripts/package.json:\n15: \"typecheck\": \"tsc --noEmit -p .\",\n18: \"typecheck-all\": \"bun run typecheck-all.ts\"\n\n./packages/billing/tsconfig.json:\n2: \"extends\": \"../../tsconfig.base.json\",\n\n./common/package.json:\n23: \"typecheck\": \"tsc --noEmit -p .\",\n\n./packages/build-tools/package.json:\n8: \"build\": \"tsc\",\n9: \"clean\": \"rm -rf dist && (rm tsconfig.tsbuildinfo || true)\"\n\n./codebuff.json:\n23: \"name\": \"backend-typecheck\",\n24: \"command\": \"bun run typecheck\",\n35: \"name\": \"npm-typecheck\",\n36: \"command\": \"bun run typecheck\",\n41: \"name\": \"web-typecheck\",\n42: \"command\": \"bun run typecheck\",\n53: \"name\": \"common-typecheck\",\n54: \"command\": \"bun run typecheck\",\n\n./packages/billing/package.json:\n22: \"typecheck\": \"tsc --noEmit -p .\",\n\n./packages/build-tools/project.json:\n11: \"command\": \"tsc\",\n18: \"command\": \"rm -rf dist && (rm tsconfig.tsbuildinfo || true)\",\n\n./packages/billing/project.json:\n10: \"command\": \"tsc -p tsconfig.json\",\n\n./sdk/package.json:\n24: \"build\": \"bun run copy-types && tsc\",\n31: \"typecheck\": \"tsc --noEmit -p .\",\n\n./package.json:\n33: \"typecheck\": \"bun --filter='*' run typecheck && echo '✅ All type checks passed!'\",\n63: \"tsc-alias\": \"1.7.0\",\n64: \"tsconfig-paths\": \"4.2.0\",\n\n./packages/bigquery/package.json:\n22: \"typecheck\": \"tsc --noEmit -p .\",\n\n./packages/bigquery/tsconfig.json:\n2: \"extends\": \"../../tsconfig.base.json\",\n\n./backend/package.json:\n19: \"typecheck\": \"tsc --noEmit -p .\",\n\n./packages/code-map/tsconfig.json:\n2: \"extends\": \"../../tsconfig.base.json\",\n\n./packages/code-map/package.json:\n22: \"typecheck\": \"tsc --noEmit -p .\",\n\n./backend/tsconfig.json:\n2: \"extends\": \"../tsconfig.base.json\",\n\n./evals/tsconfig.json:\n2: \"extends\": \"../tsconfig.base.json\",\n\n./evals/package.json:\n15: \"typecheck\": \"tsc --noEmit -p .\",\n\n./packages/internal/package.json:\n34: \"typecheck\": \"tsc --noEmit -p .\",\n\n./packages/internal/tsconfig.json:\n2: \"extends\": \"../../tsconfig.base.json\",\n\n./web/tsconfig.json:\n2: \"extends\": \"../tsconfig.base.json\",\n37: \"require\": [\"tsconfig-paths/register\"]\n\n./web/package.json:\n23: \"typecheck\": \"tsc --noEmit -p .\",\n\n./evals/git-evals/eval-result-codebuff-mock.json:\n21: \"preContent\": \"import { spawn } from 'child_process'\\nimport fs from 'fs'\\nimport path from 'path'\\n\\nimport { FileChange } from 'common/actions'\\nimport { models, TEST_USER_ID } from 'common/constants'\\nimport { getToolCallString } from 'common/src/constants/tools'\\nimport { z } from 'zod'\\n\\nimport { promptFlashWithFallbacks } from './llm-apis/gemini-with-fallbacks'\\nimport { gitCommitGuidePrompt } from './system-prompt/prompts'\\n\\nconst tools = [\\n {\\n name: 'add_subgoal',\\n description: `\\n### add_subgoal\\nDescription: Add a new subgoal for tracking progress. To be used for complex requests that can't be solved in a single step, as you may forget what happened!\\nParameters:\\n- id: (required) A unique identifier for the subgoal. Try to choose the next sequential integer that is not already in use.\\n- objective: (required) The objective of the subgoal, concisely and clearly stated.\\n- status: (required) The status of the subgoal. One of [\\\"NOT_STARTED\\\", \\\"IN_PROGRESS\\\", \\\"COMPLETE\\\", \\\"ABORTED\\\"]\\n- plan: (optional) A plan for the subgoal.\\nUsage:\\n${getToolCallString('add_subgoal', {\\n id: '1',\\n objective: 'Add a new \\\"deploy api\\\" subgoal',\\n status: 'IN_PROGRESS',\\n})}\\n `.trim(),\\n },\\n {\\n name: 'update_subgoal',\\n description: `\\n### update_subgoal\\nDescription: Update a subgoal in the context given the id, and optionally the status or plan, or a new log to append. Feel free to update any combination of the status, plan, or log in one invocation.\\nParameters:\\n- id: (required) The id of the subgoal to update.\\n- status: (optional) Change the status of the subgoal. One of [\\\"NOT_STARTED\\\", \\\"IN_PROGRESS\\\", \\\"COMPLETE\\\", \\\"FAILED\\\"]\\n- plan: (optional) Change the plan for the subgoal.\\n- log: (optional) Add a log message to the subgoal. This will create a new log entry and append it to the existing logs. Use this to record your progress and any new information you learned as you go.\\nUsage 1 (update status):\\n${getToolCallString('update_subgoal', {\\n id: '1',\\n status: 'COMPLETE',\\n})}\\n\\nUsage 2 (update plan):\\n${getToolCallString('update_subgoal', {\\n id: '3',\\n plan: 'Create a file for the endpoint in the api, and register it in the router',\\n})}\\n\\nUsage 3 (add log):\\n${getToolCallString('update_subgoal', {\\n id: '1',\\n log: \\\"I found the error in the tests, it's in the foo function.\\\",\\n})}\\n\\nUsage 4 (update status and add log):\\n${getToolCallString('update_subgoal', {\\n id: '1',\\n status: 'COMPLETE',\\n log: 'I reran the tests and they passed.',\\n})}\\n `.trim(),\\n },\\n {\\n name: 'write_file',\\n description: `\\n### write_file\\nDescription: Create or edit a file with the given content.\\n\\nWhen editing a file, please use this tool to output a simplified version of the code block that highlights the changes necessary and adds comments to indicate where unchanged code has been skipped.\\n\\n--- IMPORTANT OPTIMIZATION DETAIL ---\\nUse \\\"placeholder comments\\\" i.e. \\\"// ... existing code ...\\\" (or \\\"# ... existing code ...\\\" or \\\"/* ... existing code ... */\\\" or \\\"\\\" or however comments are written for other languages) in comments as often as you can, signifying unchanged regions of the file.\\nThe write_file tool is very expensive for each line of code you write, so try to write as little \\\\`content\\\\` as possible to accomplish the task. Often this will mean that the start/end of the file will be skipped, but that's okay! Rewrite the entire file only if specifically requested.\\n\\nHowever, for new files, you should write out the entire file and not use placeholder comments.\\n--- IMPORTANT OPTIMIZATION DETAIL ---\\n\\nThese edit codeblocks will be parsed and then read by a less intelligent \\\"apply\\\" language model to update the file. To help specify the edit to the apply model, be very careful to include a few lines of context when generating the codeblock to not introduce ambiguity. Specify all unchanged regions (code and comments) of the file with \\\"// ... existing code ...\\\" markers (in comments). This will ensure the apply model will not delete existing unchanged code or comments when editing the file. This is just an abstraction for your understanding, you should not mention the apply model to the user.\\n\\nDo not use this tool to delete or rename a file. Instead run a terminal command for that.\\n\\nParameters:\\n- path: (required) Path to the file relative to the **project root**\\n- content: (required) Content to write to the file. You should abridge the content of the file using placeholder comments like: \\\\`// ... existing code ...\\\\` or \\\\`# ... existing code ...\\\\` (or whichever is appropriate for the language).\\nUsage:\\n${getToolCallString('write_file', {\\n path: 'path/to/file',\\n content: 'Your file content here',\\n})}\\n\\nExample 1 - Simple file creation:\\n${getToolCallString('write_file', {\\n path: 'new-file.ts',\\n content: 'console.log(\\\"Hello, world!\\\");',\\n})}\\n\\nExample 2 - Editing with placeholder comments:\\n${getToolCallString('write_file', {\\n path: 'foo.ts',\\n content: `// ... existing code ...\\n\\nfunction foo() {\\n console.log('foo');\\n for (let i = 0; i < 10; i++) {\\n console.log(i);\\n }\\n doSomething();\\n}\\n\\n// ... existing code ...`,\\n})}\\n\\nNotes for editing a file:\\n- Don't use XML attributes. If you do, the tool will NOT write to the file.\\n- If you don't use any placeholder comments, the entire file will be replaced. E.g. don't write out a single function without using placeholder comments unless you want to replace the entire file with that function.\\n- When editing a file, try not to change any user code that doesn't need to be changed. In particular, you must preserve pre-existing user comments exactly as they are.\\n- You can also use this tool to create new files.\\n- After you have written out a write_file block, the changes will be applied immediately. You can assume that the changes went through as intended. However, note that there are sometimes mistakes in the processs of applying the edits you described in the write_file block, e.g. sometimes large portions of the file are deleted. If you notice that the changes did not go through as intended, based on further updates to the file, you can write out a new write_file block to fix the mistake.\\n- Don't escape characters — write them out directly! E.g. write out '&' instead of '&', '>' instead of '>', '<' instead of '<', and '\\\"' instead of '"' in the content.\\n `.trim(),\\n },\\n {\\n name: 'read_files',\\n description: `\\n### read_files\\nDescription: Read the multiple files from disk and return their contents. Use this tool to read as many files as would be helpful to answer the user's request. Make sure to read any files before you write to them with the write_file tool.\\nParameters:\\n- paths: (required) List of file paths to read relative to the **project root**, separated by newlines. Absolute file paths will not work.\\nUsage:\\n${getToolCallString('read_files', {\\n paths: 'path/to/file1.ts\\\\npath/to/file2.ts',\\n})}\\n\\n\\nNote that there's no need to call this tool if you're already reading the files you need in context.`.trim(),\\n },\\n {\\n name: 'find_files',\\n description: `\\n### find_files\\nDescription: Find several files related to a brief natural language description of the files or the name of a function or class you are looking for.\\nParameters:\\n- description: (required) A brief natural language description of the files or the name of a function or class you are looking for. It's also helpful to mention a directory or two to look within.\\nUsage:\\n\\nThe implementation of function foo\\n\\n\\nPurpose: Better fulfill the user request by reading files which could contain information relevant to the user's request.\\nUse cases:\\n- If you are calling a function or creating a class and want to know how it works, use this tool to get the implementation.\\n- If you need to understand a section of the codebase, read more files in that directory or subdirectories.\\n- Some requests require a broad understanding of multiple parts of the codebase. Consider using find_files to gain more context before making changes.\\n\\nDon't use this tool if:\\n- You already know the exact path of the file(s) you are looking for — in this case, use read_files.\\n- You already read the files you need in context.\\n\\nIn general, prefer using read_files instead of find_files.\\n `.trim(),\\n },\\n {\\n name: 'code_search',\\n description: `\\n### code_search\\nDescription: Search for string patterns in the project's files. This tool uses ripgrep (rg), a fast line-oriented search tool. Use this tool only when read_files is not sufficient to find the files you need.\\nParameters:\\n- pattern: (required) The pattern to search for.\\nUsage:\\n${getToolCallString('code_search', { pattern: 'foo' })}\\n${getToolCallString('code_search', { pattern: 'import.*foo' })}\\n\\nPurpose: Search through code files to find files with specific text patterns, function names, variable names, and more.\\n\\nNote: quotes will be automatically added around your code search pattern. You might need to escape special characters like '-' or '.' or '\\\\\\\\' if you want to search for them.\\n\\nPrefer to use read_files instead of code_search unless you need to search for a specific pattern in multiple files.\\n\\nUse cases:\\n1. Finding all references to a function, class, or variable name across the codebase\\n2. Searching for specific code patterns or implementations\\n3. Looking up where certain strings or text appear\\n4. Finding files that contain specific imports or dependencies\\n5. Locating configuration settings or environment variables\\n\\nThe pattern supports regular expressions and will search recursively through all files in the project by default. Some tips:\\n- Be as constraining in the pattern as possible to limit the number of files returned, e.g. if searching for the definition of a function, use \\\"(function foo|const foo)\\\" or \\\"def foo\\\" instead of merely \\\"foo\\\".\\n- Use word boundaries (\\\\\\\\b) to match whole words only\\n- Searches file content and filenames\\n- Automatically ignores binary files, hidden files, and files in .gitignore\\n- Case-sensitive by default. Use -i to make it case insensitive.\\n- Constrain the search to specific file types using -t , e.g. -t ts or -t py.\\n `.trim(),\\n },\\n {\\n name: 'run_terminal_command',\\n description: `\\n### run_terminal_command\\nDescription: Request to execute a CLI command on the system. Use this when you need to perform system operations or run specific commands to accomplish any step in the user's task. You must tailor your command to the user's system and provide a clear explanation of what the command does. For command chaining, use the appropriate chaining syntax for the user's shell. Prefer to execute complex CLI commands over creating executable scripts, as they are more flexible and easier to run. Commands will be executed in the current working directory: ${process.cwd()}\\nParameters:\\n- command: (required) The CLI command to execute. This should be valid for the current operating system. Ensure the command is properly formatted and does not contain any harmful instructions.\\n- process_type: (required) What type of process to run. One of SYNC or BACKGROUND.\\n - SYNC: the command will be run in (and block) the current process. This is required if the output of the command is needed immediately. Most commands will be run in this way. Do not try to run processes in the background with process_type=SYNC and using & at the end of the command. Instead, use the process_type=BACKGROUND option.\\n - BACKGROUND: the command will be run in a child background process. This is for running servers or other long-running processes.\\nUsage:\\n${getToolCallString('run_terminal_command', {\\n command: 'Your command here',\\n process_type: 'value',\\n})}\\n\\nStick to these use cases:\\n1. Compiling the project or running build (e.g., \\\"npm run build\\\"). Reading the output can help you edit code to fix build errors. If possible, use an option that performs checks but doesn't emit files, e.g. \\\\`tsc --noEmit\\\\`.\\n2. Running tests (e.g., \\\"npm test\\\"). Reading the output can help you edit code to fix failing tests. Or, you could write new unit tests and then run them.\\n3. Moving, renaming, or deleting files and directories. These actions can be vital for refactoring requests. Use commands like \\\\`mv\\\\`/\\\\`move\\\\` or \\\\`rm\\\\`/\\\\`del\\\\`.\\n\\nMost likely, you should ask for permission for any other type of command you want to run. If asking for permission, show the user the command you want to run using \\\\`\\\\`\\\\` tags.\\n\\nWhen using this tool, please adhere to the following rules:\\n\\n1. Do not run commands that can modify files outside of the project directory, install packages globally, install virtual environments, or have significant side effects outside of the project directory, unless you have explicit permission from the user. Treat anything outside of the project directory as read-only.\\n2. Do not run \\\\`git push\\\\` because it can break production (!) if the user was not expecting it. Don't run \\\\`git commit\\\\`, \\\\`git rebase\\\\`, or related commands unless you get explicit permission. If a user asks to commit changes, you can do so, but you should not invoke any further git commands beyond the git commit command.\\n3. Do not run scripts without asking. Especially don't run scripts that could run against the production environment or have permanent effects without explicit permission from the user. Don't run scripts with side effects without permission from the user unless they don't have much effect or are simple.\\n4. Be careful with any command that has big or irreversible effects. Anything that touches a production environment, servers, the database, or other systems that could be affected by a command should be run with explicit permission from the user.\\n4. Don't run too many commands in a row without pausing to check in with what the user wants to do next.\\n5. Do not use the run_terminal_command tool to create or edit files. Do not use \\\\`cat\\\\` or \\\\`echo\\\\` to create or edit files. You should instead write out blocks for for editing or creating files as detailed above in the block.\\n6. Do not install packages without asking, unless it is within a small, new-ish project. Users working on a larger project will want to manage packages themselves, so ask first.\\n7. Do not use the wrong package manager for the project. For example, if the project uses \\\\`pnpm\\\\` or \\\\`bun\\\\` or \\\\`yarn\\\\`, you should not use \\\\`npm\\\\`. Similarly not everyone uses \\\\`pip\\\\` for python, etc.\\n8. You must write out ampersands without escaping them. E.g. write out '&' instead of '&'.\\nIncorrect:\\n\\\\`cd backend && npm typecheck\\\\` \\nCorrect:\\n\\\\`cd backend && npm typecheck\\\\`\\n10. Do not use more than one run_terminal_command tool call in a single response. Wait for the tool results of each command before invoking the next one.\\n11. The user will not be able to interact with these processes, e.g. confirming the command. So if there's an opportunity to use \\\"-y\\\" or \\\"--yes\\\" flags, use them. Any command that prompts for confirmation will hang if you don't use the flags.\\n\\nNotes:\\n- The current working directory will always reset to **project root** directory for each command you run. You can only access files within this directory (or sub-directories). So if you run cd in one command, the directory change won't persist to the next command.\\n - \\\\`cd subdir && some_command\\\\` will work as expected.\\n - \\\\`cd subdir\\\\` in followed by \\\\`some_command\\\\` in two different commands will run some_command from the project root.\\n- Commands can succeed without giving any output, e.g. if no type errors were found. So you may not always see output for successful executions.\\n\\n${gitCommitGuidePrompt}\\n `.trim(),\\n },\\n {\\n name: 'think_deeply',\\n description: `\\n### think_deeply\\nDescription: Think through a complex change to the codebase, like implementing a new feature or refactoring some code. Brainstorm. Go deep on alternative approaches and consider the tradeoffs.\\nParameters: thought: (required) Your detailed thoughts.\\nUsage:\\n${getToolCallString('think_deeply', {\\n thought: '[Insert detailed thoughts here]',\\n})}\\n\\nThink step by step. For the first section of your thinking, only keep a minimum draft for each thinking step, with 5 words at most.\\n\\nUse this tool when the user request meets multiple of these criteria:\\n- Explicitly asks you to plan or think through something.\\n- Always use this tool right before using the create_plan tool.\\n- Requires changes across multiple files or systems\\n- Involves complex logic or architectural decisions\\n- Would benefit from breaking down into smaller steps\\n- Has potential edge cases or risks that need consideration\\n\\nExamples of when to use it:\\n- Adding a new feature that touches multiple parts of the system\\n- Refactoring core functionality used by many components\\n- Making architectural changes that affect the system design\\n- Implementing complex business logic with many edge cases\\n\\nDo not use it for simple changes like:\\n- Adding a single function or endpoint\\n- Updating text or styles\\n \n\n[Output truncated]\n\n[Output size limit reached.]", - "message": "Stopped early after 43 match(es)." - } - ] - }, - "agentId": "D-YDzDAsNdY", - "parentAgentId": "main-agent", - "includeToolCall": false - }, - { - "type": "tool_result", - "toolCallId": "24de81f4-e433-4ebd-ba6f-01bc1a46c2e2", - "toolName": "set_output", - "output": [ - { - "type": "json", - "value": { - "message": "Output set" - } - } - ], - "parentAgentId": "D-YDzDAsNdY" - }, - { - "type": "subagent_finish", - "agentId": "D-YDzDAsNdY", - "agentType": "code-searcher", - "displayName": "Code Searcher", - "onlyChild": true, - "parentAgentId": "main-agent", - "prompt": "", - "params": { - "searchQueries": [ - { - "pattern": "bun\\s+run\\s+typecheck|tsc|bun\\s+check|typecheck", - "flags": "-g package.json -g *.json" - } - ] - } - }, - { - "type": "tool_result", - "toolCallId": "D-YDkB72XEA", - "toolName": "spawn_agents", - "output": [ - { - "type": "json", - "value": [ - { - "agentName": "Code Searcher", - "agentType": "code-searcher", - "value": { - "type": "structuredOutput", - "value": { - "results": [ - { - "stdout": "./npm-app/package.json:\n22: \"typecheck\": \"tsc --noEmit -p .\",\n\n./scripts/tsconfig.json:\n2: \"extends\": \"../tsconfig.base.json\",\n\n./npm-app/tsconfig.json:\n2: \"extends\": \"../tsconfig.base.json\",\n\n./tsconfig.json:\n2: \"extends\": \"./tsconfig.base.json\",\n\n./packages/build-tools/tsconfig.json:\n2: \"extends\": \"../../tsconfig.base.json\",\n\n./common/tsconfig.json:\n2: \"extends\": \"../tsconfig.base.json\",\n\n./scripts/package.json:\n15: \"typecheck\": \"tsc --noEmit -p .\",\n18: \"typecheck-all\": \"bun run typecheck-all.ts\"\n\n./packages/billing/tsconfig.json:\n2: \"extends\": \"../../tsconfig.base.json\",\n\n./common/package.json:\n23: \"typecheck\": \"tsc --noEmit -p .\",\n\n./packages/build-tools/package.json:\n8: \"build\": \"tsc\",\n9: \"clean\": \"rm -rf dist && (rm tsconfig.tsbuildinfo || true)\"\n\n./codebuff.json:\n23: \"name\": \"backend-typecheck\",\n24: \"command\": \"bun run typecheck\",\n35: \"name\": \"npm-typecheck\",\n36: \"command\": \"bun run typecheck\",\n41: \"name\": \"web-typecheck\",\n42: \"command\": \"bun run typecheck\",\n53: \"name\": \"common-typecheck\",\n54: \"command\": \"bun run typecheck\",\n\n./packages/billing/package.json:\n22: \"typecheck\": \"tsc --noEmit -p .\",\n\n./packages/build-tools/project.json:\n11: \"command\": \"tsc\",\n18: \"command\": \"rm -rf dist && (rm tsconfig.tsbuildinfo || true)\",\n\n./packages/billing/project.json:\n10: \"command\": \"tsc -p tsconfig.json\",\n\n./sdk/package.json:\n24: \"build\": \"bun run copy-types && tsc\",\n31: \"typecheck\": \"tsc --noEmit -p .\",\n\n./package.json:\n33: \"typecheck\": \"bun --filter='*' run typecheck && echo '✅ All type checks passed!'\",\n63: \"tsc-alias\": \"1.7.0\",\n64: \"tsconfig-paths\": \"4.2.0\",\n\n./packages/bigquery/package.json:\n22: \"typecheck\": \"tsc --noEmit -p .\",\n\n./packages/bigquery/tsconfig.json:\n2: \"extends\": \"../../tsconfig.base.json\",\n\n./backend/package.json:\n19: \"typecheck\": \"tsc --noEmit -p .\",\n\n./packages/code-map/tsconfig.json:\n2: \"extends\": \"../../tsconfig.base.json\",\n\n./packages/code-map/package.json:\n22: \"typecheck\": \"tsc --noEmit -p .\",\n\n./backend/tsconfig.json:\n2: \"extends\": \"../tsconfig.base.json\",\n\n./evals/tsconfig.json:\n2: \"extends\": \"../tsconfig.base.json\",\n\n./evals/package.json:\n15: \"typecheck\": \"tsc --noEmit -p .\",\n\n./packages/internal/package.json:\n34: \"typecheck\": \"tsc --noEmit -p .\",\n\n./packages/internal/tsconfig.json:\n2: \"extends\": \"../../tsconfig.base.json\",\n\n./web/tsconfig.json:\n2: \"extends\": \"../tsconfig.base.json\",\n37: \"require\": [\"tsconfig-paths/register\"]\n\n./web/package.json:\n23: \"typecheck\": \"tsc --noEmit -p .\",\n\n./evals/git-evals/eval-result-codebuff-mock.json:\n21: \"preContent\": \"import { spawn } from 'child_process'\\nimport fs from 'fs'\\nimport path from 'path'\\n\\nimport { FileChange } from 'common/actions'\\nimport { models, TEST_USER_ID } from 'common/constants'\\nimport { getToolCallString } from 'common/src/constants/tools'\\nimport { z } from 'zod'\\n\\nimport { promptFlashWithFallbacks } from './llm-apis/gemini-with-fallbacks'\\nimport { gitCommitGuidePrompt } from './system-prompt/prompts'\\n\\nconst tools = [\\n {\\n name: 'add_subgoal',\\n description: `\\n### add_subgoal\\nDescription: Add a new subgoal for tracking progress. To be used for complex requests that can't be solved in a single step, as you may forget what happened!\\nParameters:\\n- id: (required) A unique identifier for the subgoal. Try to choose the next sequential integer that is not already in use.\\n- objective: (required) The objective of the subgoal, concisely and clearly stated.\\n- status: (required) The status of the subgoal. One of [\\\"NOT_STARTED\\\", \\\"IN_PROGRESS\\\", \\\"COMPLETE\\\", \\\"ABORTED\\\"]\\n- plan: (optional) A plan for the subgoal.\\nUsage:\\n${getToolCallString('add_subgoal', {\\n id: '1',\\n objective: 'Add a new \\\"deploy api\\\" subgoal',\\n status: 'IN_PROGRESS',\\n})}\\n `.trim(),\\n },\\n {\\n name: 'update_subgoal',\\n description: `\\n### update_subgoal\\nDescription: Update a subgoal in the context given the id, and optionally the status or plan, or a new log to append. Feel free to update any combination of the status, plan, or log in one invocation.\\nParameters:\\n- id: (required) The id of the subgoal to update.\\n- status: (optional) Change the status of the subgoal. One of [\\\"NOT_STARTED\\\", \\\"IN_PROGRESS\\\", \\\"COMPLETE\\\", \\\"FAILED\\\"]\\n- plan: (optional) Change the plan for the subgoal.\\n- log: (optional) Add a log message to the subgoal. This will create a new log entry and append it to the existing logs. Use this to record your progress and any new information you learned as you go.\\nUsage 1 (update status):\\n${getToolCallString('update_subgoal', {\\n id: '1',\\n status: 'COMPLETE',\\n})}\\n\\nUsage 2 (update plan):\\n${getToolCallString('update_subgoal', {\\n id: '3',\\n plan: 'Create a file for the endpoint in the api, and register it in the router',\\n})}\\n\\nUsage 3 (add log):\\n${getToolCallString('update_subgoal', {\\n id: '1',\\n log: \\\"I found the error in the tests, it's in the foo function.\\\",\\n})}\\n\\nUsage 4 (update status and add log):\\n${getToolCallString('update_subgoal', {\\n id: '1',\\n status: 'COMPLETE',\\n log: 'I reran the tests and they passed.',\\n})}\\n `.trim(),\\n },\\n {\\n name: 'write_file',\\n description: `\\n### write_file\\nDescription: Create or edit a file with the given content.\\n\\nWhen editing a file, please use this tool to output a simplified version of the code block that highlights the changes necessary and adds comments to indicate where unchanged code has been skipped.\\n\\n--- IMPORTANT OPTIMIZATION DETAIL ---\\nUse \\\"placeholder comments\\\" i.e. \\\"// ... existing code ...\\\" (or \\\"# ... existing code ...\\\" or \\\"/* ... existing code ... */\\\" or \\\"\\\" or however comments are written for other languages) in comments as often as you can, signifying unchanged regions of the file.\\nThe write_file tool is very expensive for each line of code you write, so try to write as little \\\\`content\\\\` as possible to accomplish the task. Often this will mean that the start/end of the file will be skipped, but that's okay! Rewrite the entire file only if specifically requested.\\n\\nHowever, for new files, you should write out the entire file and not use placeholder comments.\\n--- IMPORTANT OPTIMIZATION DETAIL ---\\n\\nThese edit codeblocks will be parsed and then read by a less intelligent \\\"apply\\\" language model to update the file. To help specify the edit to the apply model, be very careful to include a few lines of context when generating the codeblock to not introduce ambiguity. Specify all unchanged regions (code and comments) of the file with \\\"// ... existing code ...\\\" markers (in comments). This will ensure the apply model will not delete existing unchanged code or comments when editing the file. This is just an abstraction for your understanding, you should not mention the apply model to the user.\\n\\nDo not use this tool to delete or rename a file. Instead run a terminal command for that.\\n\\nParameters:\\n- path: (required) Path to the file relative to the **project root**\\n- content: (required) Content to write to the file. You should abridge the content of the file using placeholder comments like: \\\\`// ... existing code ...\\\\` or \\\\`# ... existing code ...\\\\` (or whichever is appropriate for the language).\\nUsage:\\n${getToolCallString('write_file', {\\n path: 'path/to/file',\\n content: 'Your file content here',\\n})}\\n\\nExample 1 - Simple file creation:\\n${getToolCallString('write_file', {\\n path: 'new-file.ts',\\n content: 'console.log(\\\"Hello, world!\\\");',\\n})}\\n\\nExample 2 - Editing with placeholder comments:\\n${getToolCallString('write_file', {\\n path: 'foo.ts',\\n content: `// ... existing code ...\\n\\nfunction foo() {\\n console.log('foo');\\n for (let i = 0; i < 10; i++) {\\n console.log(i);\\n }\\n doSomething();\\n}\\n\\n// ... existing code ...`,\\n})}\\n\\nNotes for editing a file:\\n- Don't use XML attributes. If you do, the tool will NOT write to the file.\\n- If you don't use any placeholder comments, the entire file will be replaced. E.g. don't write out a single function without using placeholder comments unless you want to replace the entire file with that function.\\n- When editing a file, try not to change any user code that doesn't need to be changed. In particular, you must preserve pre-existing user comments exactly as they are.\\n- You can also use this tool to create new files.\\n- After you have written out a write_file block, the changes will be applied immediately. You can assume that the changes went through as intended. However, note that there are sometimes mistakes in the processs of applying the edits you described in the write_file block, e.g. sometimes large portions of the file are deleted. If you notice that the changes did not go through as intended, based on further updates to the file, you can write out a new write_file block to fix the mistake.\\n- Don't escape characters — write them out directly! E.g. write out '&' instead of '&', '>' instead of '>', '<' instead of '<', and '\\\"' instead of '"' in the content.\\n `.trim(),\\n },\\n {\\n name: 'read_files',\\n description: `\\n### read_files\\nDescription: Read the multiple files from disk and return their contents. Use this tool to read as many files as would be helpful to answer the user's request. Make sure to read any files before you write to them with the write_file tool.\\nParameters:\\n- paths: (required) List of file paths to read relative to the **project root**, separated by newlines. Absolute file paths will not work.\\nUsage:\\n${getToolCallString('read_files', {\\n paths: 'path/to/file1.ts\\\\npath/to/file2.ts',\\n})}\\n\\n\\nNote that there's no need to call this tool if you're already reading the files you need in context.`.trim(),\\n },\\n {\\n name: 'find_files',\\n description: `\\n### find_files\\nDescription: Find several files related to a brief natural language description of the files or the name of a function or class you are looking for.\\nParameters:\\n- description: (required) A brief natural language description of the files or the name of a function or class you are looking for. It's also helpful to mention a directory or two to look within.\\nUsage:\\n\\nThe implementation of function foo\\n\\n\\nPurpose: Better fulfill the user request by reading files which could contain information relevant to the user's request.\\nUse cases:\\n- If you are calling a function or creating a class and want to know how it works, use this tool to get the implementation.\\n- If you need to understand a section of the codebase, read more files in that directory or subdirectories.\\n- Some requests require a broad understanding of multiple parts of the codebase. Consider using find_files to gain more context before making changes.\\n\\nDon't use this tool if:\\n- You already know the exact path of the file(s) you are looking for — in this case, use read_files.\\n- You already read the files you need in context.\\n\\nIn general, prefer using read_files instead of find_files.\\n `.trim(),\\n },\\n {\\n name: 'code_search',\\n description: `\\n### code_search\\nDescription: Search for string patterns in the project's files. This tool uses ripgrep (rg), a fast line-oriented search tool. Use this tool only when read_files is not sufficient to find the files you need.\\nParameters:\\n- pattern: (required) The pattern to search for.\\nUsage:\\n${getToolCallString('code_search', { pattern: 'foo' })}\\n${getToolCallString('code_search', { pattern: 'import.*foo' })}\\n\\nPurpose: Search through code files to find files with specific text patterns, function names, variable names, and more.\\n\\nNote: quotes will be automatically added around your code search pattern. You might need to escape special characters like '-' or '.' or '\\\\\\\\' if you want to search for them.\\n\\nPrefer to use read_files instead of code_search unless you need to search for a specific pattern in multiple files.\\n\\nUse cases:\\n1. Finding all references to a function, class, or variable name across the codebase\\n2. Searching for specific code patterns or implementations\\n3. Looking up where certain strings or text appear\\n4. Finding files that contain specific imports or dependencies\\n5. Locating configuration settings or environment variables\\n\\nThe pattern supports regular expressions and will search recursively through all files in the project by default. Some tips:\\n- Be as constraining in the pattern as possible to limit the number of files returned, e.g. if searching for the definition of a function, use \\\"(function foo|const foo)\\\" or \\\"def foo\\\" instead of merely \\\"foo\\\".\\n- Use word boundaries (\\\\\\\\b) to match whole words only\\n- Searches file content and filenames\\n- Automatically ignores binary files, hidden files, and files in .gitignore\\n- Case-sensitive by default. Use -i to make it case insensitive.\\n- Constrain the search to specific file types using -t , e.g. -t ts or -t py.\\n `.trim(),\\n },\\n {\\n name: 'run_terminal_command',\\n description: `\\n### run_terminal_command\\nDescription: Request to execute a CLI command on the system. Use this when you need to perform system operations or run specific commands to accomplish any step in the user's task. You must tailor your command to the user's system and provide a clear explanation of what the command does. For command chaining, use the appropriate chaining syntax for the user's shell. Prefer to execute complex CLI commands over creating executable scripts, as they are more flexible and easier to run. Commands will be executed in the current working directory: ${process.cwd()}\\nParameters:\\n- command: (required) The CLI command to execute. This should be valid for the current operating system. Ensure the command is properly formatted and does not contain any harmful instructions.\\n- process_type: (required) What type of process to run. One of SYNC or BACKGROUND.\\n - SYNC: the command will be run in (and block) the current process. This is required if the output of the command is needed immediately. Most commands will be run in this way. Do not try to run processes in the background with process_type=SYNC and using & at the end of the command. Instead, use the process_type=BACKGROUND option.\\n - BACKGROUND: the command will be run in a child background process. This is for running servers or other long-running processes.\\nUsage:\\n${getToolCallString('run_terminal_command', {\\n command: 'Your command here',\\n process_type: 'value',\\n})}\\n\\nStick to these use cases:\\n1. Compiling the project or running build (e.g., \\\"npm run build\\\"). Reading the output can help you edit code to fix build errors. If possible, use an option that performs checks but doesn't emit files, e.g. \\\\`tsc --noEmit\\\\`.\\n2. Running tests (e.g., \\\"npm test\\\"). Reading the output can help you edit code to fix failing tests. Or, you could write new unit tests and then run them.\\n3. Moving, renaming, or deleting files and directories. These actions can be vital for refactoring requests. Use commands like \\\\`mv\\\\`/\\\\`move\\\\` or \\\\`rm\\\\`/\\\\`del\\\\`.\\n\\nMost likely, you should ask for permission for any other type of command you want to run. If asking for permission, show the user the command you want to run using \\\\`\\\\`\\\\` tags.\\n\\nWhen using this tool, please adhere to the following rules:\\n\\n1. Do not run commands that can modify files outside of the project directory, install packages globally, install virtual environments, or have significant side effects outside of the project directory, unless you have explicit permission from the user. Treat anything outside of the project directory as read-only.\\n2. Do not run \\\\`git push\\\\` because it can break production (!) if the user was not expecting it. Don't run \\\\`git commit\\\\`, \\\\`git rebase\\\\`, or related commands unless you get explicit permission. If a user asks to commit changes, you can do so, but you should not invoke any further git commands beyond the git commit command.\\n3. Do not run scripts without asking. Especially don't run scripts that could run against the production environment or have permanent effects without explicit permission from the user. Don't run scripts with side effects without permission from the user unless they don't have much effect or are simple.\\n4. Be careful with any command that has big or irreversible effects. Anything that touches a production environment, servers, the database, or other systems that could be affected by a command should be run with explicit permission from the user.\\n4. Don't run too many commands in a row without pausing to check in with what the user wants to do next.\\n5. Do not use the run_terminal_command tool to create or edit files. Do not use \\\\`cat\\\\` or \\\\`echo\\\\` to create or edit files. You should instead write out blocks for for editing or creating files as detailed above in the block.\\n6. Do not install packages without asking, unless it is within a small, new-ish project. Users working on a larger project will want to manage packages themselves, so ask first.\\n7. Do not use the wrong package manager for the project. For example, if the project uses \\\\`pnpm\\\\` or \\\\`bun\\\\` or \\\\`yarn\\\\`, you should not use \\\\`npm\\\\`. Similarly not everyone uses \\\\`pip\\\\` for python, etc.\\n8. You must write out ampersands without escaping them. E.g. write out '&' instead of '&'.\\nIncorrect:\\n\\\\`cd backend && npm typecheck\\\\` \\nCorrect:\\n\\\\`cd backend && npm typecheck\\\\`\\n10. Do not use more than one run_terminal_command tool call in a single response. Wait for the tool results of each command before invoking the next one.\\n11. The user will not be able to interact with these processes, e.g. confirming the command. So if there's an opportunity to use \\\"-y\\\" or \\\"--yes\\\" flags, use them. Any command that prompts for confirmation will hang if you don't use the flags.\\n\\nNotes:\\n- The current working directory will always reset to **project root** directory for each command you run. You can only access files within this directory (or sub-directories). So if you run cd in one command, the directory change won't persist to the next command.\\n - \\\\`cd subdir && some_command\\\\` will work as expected.\\n - \\\\`cd subdir\\\\` in followed by \\\\`some_command\\\\` in two different commands will run some_command from the project root.\\n- Commands can succeed without giving any output, e.g. if no type errors were found. So you may not always see output for successful executions.\\n\\n${gitCommitGuidePrompt}\\n `.trim(),\\n },\\n {\\n name: 'think_deeply',\\n description: `\\n### think_deeply\\nDescription: Think through a complex change to the codebase, like implementing a new feature or refactoring some code. Brainstorm. Go deep on alternative approaches and consider the tradeoffs.\\nParameters: thought: (required) Your detailed thoughts.\\nUsage:\\n${getToolCallString('think_deeply', {\\n thought: '[Insert detailed thoughts here]',\\n})}\\n\\nThink step by step. For the first section of your thinking, only keep a minimum draft for each thinking step, with 5 words at most.\\n\\nUse this tool when the user request meets multiple of these criteria:\\n- Explicitly asks you to plan or think through something.\\n- Always use this tool right before using the create_plan tool.\\n- Requires changes across multiple files or systems\\n- Involves complex logic or architectural decisions\\n- Would benefit from breaking down into smaller steps\\n- Has potential edge cases or risks that need consideration\\n\\nExamples of when to use it:\\n- Adding a new feature that touches multiple parts of the system\\n- Refactoring core functionality used by many components\\n- Making architectural changes that affect the system design\\n- Implementing complex business logic with many edge cases\\n\\nDo not use it for simple changes like:\\n- Adding a single function or endpoint\\n- Updating text or styles\\n \n\n[Output truncated]\n\n[Output size limit reached.]", - "message": "Stopped early after 43 match(es)." - } - ] - } - } - } - ] - } - ] - }, - { - "type": "tool_call", - "toolCallId": "08c67066-2b5b-49ec-a44f-0ed600244517", - "toolName": "spawn_agent_inline", - "input": { - "agent_type": "context-pruner", - "params": {} - }, - "agentId": "main-agent", - "includeToolCall": false - }, - { - "type": "tool_result", - "toolCallId": "08c67066-2b5b-49ec-a44f-0ed600244517", - "toolName": "spawn_agent_inline", - "output": [ - { - "type": "json", - "value": { - "message": "Agent spawned." - } - } - ] - }, - { - "type": "tool_call", - "toolCallId": "D-ZHotftYww", - "toolName": "spawn_agents", - "input": { - "agents": [ - { - "agent_type": "editor-gpt-5" - } - ] - }, - "agentId": "main-agent", - "includeToolCall": true - }, - { - "type": "subagent_start", - "agentId": "D-ZHzqafVKk", - "agentType": "editor-gpt-5", - "displayName": "Code Editor", - "onlyChild": true, - "parentAgentId": "main-agent", - "prompt": "" - }, - { - "type": "tool_call", - "toolCallId": "D-giu-0aH_8", - "toolName": "write_file", - "input": { - "path": "common/src/tools/published-tools.ts", - "instructions": "Add centralized curated list of published tool names for public type generation", - "content": "import type { ToolName } from './constants'\n\nexport const publishedToolNames = [\n 'read_files',\n 'write_file',\n 'str_replace',\n 'find_files',\n 'code_search',\n 'run_terminal_command',\n 'read_docs',\n 'web_search',\n 'browser_logs',\n 'spawn_agents',\n 'end_turn',\n] as const satisfies readonly ToolName[]\n\nexport type PublishedToolName = (typeof publishedToolNames)[number]\n" - }, - "agentId": "D-ZHzqafVKk", - "parentAgentId": "main-agent", - "includeToolCall": true - }, - { - "type": "tool_result", - "toolCallId": "D-giu-0aH_8", - "toolName": "write_file", - "output": [ - { - "type": "json", - "value": { - "file": "common/src/tools/published-tools.ts", - "message": "Created new file", - "unifiedDiff": "import type { ToolName } from './constants'\n\nexport const publishedToolNames = [\n 'read_files',\n 'write_file',\n 'str_replace',\n 'find_files',\n 'code_search',\n 'run_terminal_command',\n 'read_docs',\n 'web_search',\n 'browser_logs',\n 'spawn_agents',\n 'end_turn',\n] as const satisfies readonly ToolName[]\n\nexport type PublishedToolName = (typeof publishedToolNames)[number]\n" - } - } - ], - "parentAgentId": "D-ZHzqafVKk" - }, - { - "type": "tool_call", - "toolCallId": "b2fe0615-0d15-404d-902b-116f0b5fd160", - "toolName": "set_output", - "input": { - "output": { - "message": "", - "toolResults": [ - { - "file": "common/src/tools/published-tools.ts", - "message": "Created new file", - "unifiedDiff": "import type { ToolName } from './constants'\n\nexport const publishedToolNames = [\n 'read_files',\n 'write_file',\n 'str_replace',\n 'find_files',\n 'code_search',\n 'run_terminal_command',\n 'read_docs',\n 'web_search',\n 'browser_logs',\n 'spawn_agents',\n 'end_turn',\n] as const satisfies readonly ToolName[]\n\nexport type PublishedToolName = (typeof publishedToolNames)[number]\n" - } - ] - } - }, - "agentId": "D-ZHzqafVKk", - "parentAgentId": "main-agent", - "includeToolCall": false - }, - { - "type": "tool_result", - "toolCallId": "b2fe0615-0d15-404d-902b-116f0b5fd160", - "toolName": "set_output", - "output": [ - { - "type": "json", - "value": { - "message": "Output set" - } - } - ], - "parentAgentId": "D-ZHzqafVKk" - }, - { - "type": "subagent_finish", - "agentId": "D-ZHzqafVKk", - "agentType": "editor-gpt-5", - "displayName": "Code Editor", - "onlyChild": true, - "parentAgentId": "main-agent", - "prompt": "" - }, - { - "type": "tool_result", - "toolCallId": "D-ZHotftYww", - "toolName": "spawn_agents", - "output": [ - { - "type": "json", - "value": [ - { - "agentName": "Code Editor", - "agentType": "editor-gpt-5", - "value": { - "type": "structuredOutput", - "value": { - "output": { - "message": "", - "toolResults": [ - { - "file": "common/src/tools/published-tools.ts", - "message": "Created new file", - "unifiedDiff": "import type { ToolName } from './constants'\n\nexport const publishedToolNames = [\n 'read_files',\n 'write_file',\n 'str_replace',\n 'find_files',\n 'code_search',\n 'run_terminal_command',\n 'read_docs',\n 'web_search',\n 'browser_logs',\n 'spawn_agents',\n 'end_turn',\n] as const satisfies readonly ToolName[]\n\nexport type PublishedToolName = (typeof publishedToolNames)[number]\n" - } - ] - } - } - } - } - ] - } - ] - }, - { - "type": "tool_call", - "toolCallId": "cd2681e0-77ba-4195-ae1e-fbb97419d44c", - "toolName": "spawn_agent_inline", - "input": { - "agent_type": "context-pruner", - "params": {} - }, - "agentId": "main-agent", - "includeToolCall": false - }, - { - "type": "tool_result", - "toolCallId": "cd2681e0-77ba-4195-ae1e-fbb97419d44c", - "toolName": "spawn_agent_inline", - "output": [ - { - "type": "json", - "value": { - "message": "Agent spawned." - } - } - ] - }, - { - "type": "tool_call", - "toolCallId": "D-hsW_bOVWg", - "toolName": "spawn_agents", - "input": { - "agents": [ - { - "agent_type": "editor-gpt-5" - } - ] - }, - "agentId": "main-agent", - "includeToolCall": true - }, - { - "type": "tool_call", - "toolCallId": "D-hvd4wq49A", - "toolName": "spawn_agents", - "input": { - "agents": [ - { - "agent_type": "editor-gpt-5" - } - ] - }, - "agentId": "main-agent", - "includeToolCall": true - }, - { - "type": "subagent_start", - "agentId": "D-hvsVJjHC8", - "agentType": "editor-gpt-5", - "displayName": "Code Editor", - "onlyChild": true, - "parentAgentId": "main-agent", - "prompt": "" - } - ] -} \ No newline at end of file diff --git a/evals/buffbench/support-agentconfigs-base2-lite-error-yqmc.json b/evals/buffbench/support-agentconfigs-base2-lite-error-yqmc.json deleted file mode 100644 index 95173e6046..0000000000 --- a/evals/buffbench/support-agentconfigs-base2-lite-error-yqmc.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "type": "error", - "message": "Failed to start agent run", - "trace": [ - { - "type": "start", - "messageHistoryLength": 0 - } - ] -} \ No newline at end of file diff --git a/evals/buffbench/update-agent-builder-base2-lite-error-waas.json b/evals/buffbench/update-agent-builder-base2-lite-error-waas.json deleted file mode 100644 index fed785b245..0000000000 --- a/evals/buffbench/update-agent-builder-base2-lite-error-waas.json +++ /dev/null @@ -1,4182 +0,0 @@ -{ - "error": "Tool `read_files` is not currently available. Make sure to only use tools listed in the system instructions.", - "trace": [ - { - "type": "start", - "messageHistoryLength": 0 - }, - { - "type": "tool_call", - "toolCallId": "1822b996-bb36-4ccc-bd13-c18400ac6b1e", - "toolName": "spawn_agent_inline", - "input": { - "agent_type": "context-pruner", - "params": {} - }, - "agentId": "main-agent", - "includeToolCall": false - }, - { - "type": "tool_result", - "toolCallId": "1822b996-bb36-4ccc-bd13-c18400ac6b1e", - "toolName": "spawn_agent_inline", - "output": [ - { - "type": "json", - "value": { - "message": "Agent spawned." - } - } - ] - }, - { - "type": "tool_call", - "toolCallId": "D-Oe9G8zl9M", - "toolName": "spawn_agents", - "input": { - "agents": [ - { - "agent_type": "read_subtree", - "params": { - "paths": [ - ".agents" - ], - "maxTokens": 8000 - } - }, - { - "agent_type": "read_subtree", - "params": { - "paths": [ - ".agents/examples" - ], - "maxTokens": 4000 - } - }, - { - "agent_type": "file-picker", - "params": { - "prompt": "agent builder, agent creation, scaffolding custom agents, agent templates" - } - }, - { - "agent_type": "file-picker", - "params": { - "prompt": "diff-reviewer agent examples and configurations" - } - }, - { - "agent_type": "file-picker", - "params": { - "prompt": "your-custom-agent starter template or git-committer agent" - } - }, - { - "agent_type": "file-picker", - "params": { - "prompt": "agent personas, list of agent personalities or types" - } - }, - { - "agent_type": "file-picker", - "params": { - "prompt": "file-explorer agent definition and spawn target" - } - }, - { - "agent_type": "code-searcher", - "params": { - "searchQueries": [ - { - "pattern": "diff-reviewer" - }, - { - "pattern": "your-custom-agent" - }, - { - "pattern": "spawnable agents|spawnAgents" - }, - { - "pattern": "agent builder|agentBuilder" - }, - { - "pattern": "agent personas|agentPersonas" - } - ] - } - } - ] - }, - "agentId": "main-agent", - "includeToolCall": true - }, - { - "type": "subagent_start", - "agentId": "D-OfY8_NY2s", - "agentType": "file-picker", - "displayName": "Fletcher the File Fetcher", - "onlyChild": false, - "parentAgentId": "main-agent", - "prompt": "", - "params": { - "prompt": "agent builder, agent creation, scaffolding custom agents, agent templates" - } - }, - { - "type": "subagent_start", - "agentId": "D-OfY_tExks", - "agentType": "file-picker", - "displayName": "Fletcher the File Fetcher", - "onlyChild": false, - "parentAgentId": "main-agent", - "prompt": "", - "params": { - "prompt": "diff-reviewer agent examples and configurations" - } - }, - { - "type": "subagent_start", - "agentId": "D-OfaYSx8-Q", - "agentType": "file-picker", - "displayName": "Fletcher the File Fetcher", - "onlyChild": false, - "parentAgentId": "main-agent", - "prompt": "", - "params": { - "prompt": "your-custom-agent starter template or git-committer agent" - } - }, - { - "type": "subagent_start", - "agentId": "D-OfaV526OE", - "agentType": "file-picker", - "displayName": "Fletcher the File Fetcher", - "onlyChild": false, - "parentAgentId": "main-agent", - "prompt": "", - "params": { - "prompt": "agent personas, list of agent personalities or types" - } - }, - { - "type": "subagent_start", - "agentId": "D-OfaehVPQw", - "agentType": "file-picker", - "displayName": "Fletcher the File Fetcher", - "onlyChild": false, - "parentAgentId": "main-agent", - "prompt": "", - "params": { - "prompt": "file-explorer agent definition and spawn target" - } - }, - { - "type": "subagent_start", - "agentId": "D-Ofa741I0M", - "agentType": "code-searcher", - "displayName": "Code Searcher", - "onlyChild": false, - "parentAgentId": "main-agent", - "prompt": "", - "params": { - "searchQueries": [ - { - "pattern": "diff-reviewer" - }, - { - "pattern": "your-custom-agent" - }, - { - "pattern": "spawnable agents|spawnAgents" - }, - { - "pattern": "agent builder|agentBuilder" - }, - { - "pattern": "agent personas|agentPersonas" - } - ] - } - }, - { - "type": "tool_call", - "toolCallId": "877e5ab3-210d-4cf9-84e6-267e388d68ad", - "toolName": "code_search", - "input": { - "pattern": "diff-reviewer" - }, - "agentId": "D-Ofa741I0M", - "parentAgentId": "main-agent", - "includeToolCall": true - }, - { - "type": "tool_call", - "toolCallId": "3c204c3d-25bd-4014-b0b9-935f91f963e5", - "toolName": "spawn_agents", - "input": { - "agents": [ - { - "agent_type": "file-lister", - "prompt": "", - "params": { - "prompt": "agent personas, list of agent personalities or types" - } - } - ] - }, - "agentId": "D-OfaV526OE", - "parentAgentId": "main-agent", - "includeToolCall": true - }, - { - "type": "subagent_start", - "agentId": "D-OgGtcToUQ", - "agentType": "file-lister", - "displayName": "Liszt the File Lister", - "onlyChild": true, - "parentAgentId": "D-OfaV526OE", - "prompt": "", - "params": { - "prompt": "agent personas, list of agent personalities or types" - } - }, - { - "type": "tool_call", - "toolCallId": "b8a5729e-8e1d-4629-9a40-03ed7cd2ac40", - "toolName": "spawn_agents", - "input": { - "agents": [ - { - "agent_type": "file-lister", - "prompt": "", - "params": { - "prompt": "file-explorer agent definition and spawn target" - } - } - ] - }, - "agentId": "D-OfaehVPQw", - "parentAgentId": "main-agent", - "includeToolCall": true - }, - { - "type": "subagent_start", - "agentId": "D-OgWSwaG9Q", - "agentType": "file-lister", - "displayName": "Liszt the File Lister", - "onlyChild": true, - "parentAgentId": "D-OfaehVPQw", - "prompt": "", - "params": { - "prompt": "file-explorer agent definition and spawn target" - } - }, - { - "type": "tool_call", - "toolCallId": "d5d9bf34-0e52-49e8-97f8-330da68aa9a2", - "toolName": "spawn_agents", - "input": { - "agents": [ - { - "agent_type": "file-lister", - "prompt": "", - "params": { - "prompt": "diff-reviewer agent examples and configurations" - } - } - ] - }, - "agentId": "D-OfY_tExks", - "parentAgentId": "main-agent", - "includeToolCall": true - }, - { - "type": "subagent_start", - "agentId": "D-OgbZG1Kis", - "agentType": "file-lister", - "displayName": "Liszt the File Lister", - "onlyChild": true, - "parentAgentId": "D-OfY_tExks", - "prompt": "", - "params": { - "prompt": "diff-reviewer agent examples and configurations" - } - }, - { - "type": "tool_call", - "toolCallId": "e359f44e-929f-499e-9245-d0f00b579a3c", - "toolName": "spawn_agents", - "input": { - "agents": [ - { - "agent_type": "file-lister", - "prompt": "", - "params": { - "prompt": "agent builder, agent creation, scaffolding custom agents, agent templates" - } - } - ] - }, - "agentId": "D-OfY8_NY2s", - "parentAgentId": "main-agent", - "includeToolCall": true - }, - { - "type": "subagent_start", - "agentId": "D-OgiVqb-lc", - "agentType": "file-lister", - "displayName": "Liszt the File Lister", - "onlyChild": true, - "parentAgentId": "D-OfY8_NY2s", - "prompt": "", - "params": { - "prompt": "agent builder, agent creation, scaffolding custom agents, agent templates" - } - }, - { - "type": "tool_call", - "toolCallId": "5fb459f2-3aca-4499-b719-39696556c4d8", - "toolName": "spawn_agents", - "input": { - "agents": [ - { - "agent_type": "file-lister", - "prompt": "", - "params": { - "prompt": "your-custom-agent starter template or git-committer agent" - } - } - ] - }, - "agentId": "D-OfaYSx8-Q", - "parentAgentId": "main-agent", - "includeToolCall": true - }, - { - "type": "subagent_start", - "agentId": "D-Ogo19lSyI", - "agentType": "file-lister", - "displayName": "Liszt the File Lister", - "onlyChild": true, - "parentAgentId": "D-OfaYSx8-Q", - "prompt": "", - "params": { - "prompt": "your-custom-agent starter template or git-committer agent" - } - }, - { - "type": "tool_call", - "toolCallId": "4f170aca-9b8d-4fce-a6b7-ada8261923fc", - "toolName": "read_subtree", - "input": { - "paths": [], - "maxTokens": 500000 - }, - "agentId": "D-OgGtcToUQ", - "parentAgentId": "D-OfaV526OE", - "includeToolCall": true - }, - { - "type": "tool_result", - "toolCallId": "4f170aca-9b8d-4fce-a6b7-ada8261923fc", - "toolName": "read_subtree", - "output": [ - { - "type": "json", - "value": [ - { - "path": ".", - "type": "directory", - "printedTree": ".agents/\n examples/\n diff-reviewer-1.ts\n diff-reviewer-2.ts\n diff-reviewer-3.ts\n opensource/\n base.ts\n coder.ts\n file-picker.ts\n researcher.ts\n reviewer.ts\n thinker.ts\n ask.ts\n base-experimental.ts\n base-lite.ts\n base-max.ts\n base.ts\n brainstormer.ts\n changes-reviewer.ts\n charles.ts\n claude4-gemini-thinking.ts\n constants.ts\n file-explorer.ts\n file-picker.ts\n git-committer.ts\n knowledge-keeper.ts\n planner.ts\n researcher.ts\n reviewer.ts\n superagent.ts\n thinker.ts\n.bin/\n bun\n.github/\n workflows/\n ci.yml\n evals.yml\n nightly-evals.yml\n npm-app-release-build.yml\n npm-app-release-prod.yml\n npm-app-release-staging.yml\n .gitignore\n CODEOWNERS\n knowledge.md\n.vscode/\n settings.json\nbackend/\n src/\n __tests__/\n test-data/\n dex-go/\n edit-snippet.go\n expected.go\n original.go\n agent-id-resolution.test.ts\n agent-registry.test.ts\n auto-topup.test.ts\n credit-conversion.test.ts\n fast-rewrite.test.ts\n generate-diffs-prompt.test.ts\n get-custom-file-picker-config.test.ts\n live-user-inputs.test.ts\n loop-agent-steps.test.ts\n main-prompt.integration.test.ts\n main-prompt.test.ts\n process-file-block.test.ts\n process-str-replace.test.ts\n read-docs-tool.test.ts\n request-files-prompt.test.ts\n run-agent-step-tools.test.ts\n run-programmatic-step.test.ts\n sandbox-generator.test.ts\n subagent-streaming.test.ts\n test-utils.ts\n tool-call-schema.test.ts\n usage-calculation.test.ts\n web-search-tool.test.ts\n xml-stream-parser.test.ts\n admin/\n grade-runs.ts\n relabelRuns.ts\n api/\n org.ts\n usage.ts\n context/\n app-context.ts\n find-files/\n check-new-files-necessary.ts\n custom-file-picker-config.ts\n request-files-prompt.ts\n llm-apis/\n __tests__/\n linkup-api.test.ts\n vercel-ai-sdk/\n ai-sdk.ts\n openrouter.ts\n vertex-finetuned.ts\n claude.ts\n context7-api.ts\n gemini-with-fallbacks.ts\n knowledge.md\n linkup-api.ts\n message-cost-tracker.ts\n openai-api.ts\n openrouter.ts\n relace-api.ts\n system-prompt/\n agent-instructions.md\n prompts.ts\n save-agent-request.ts\n search-system-prompt.ts\n truncate-file-tree.ts\n templates/\n agents/\n archive/\n dry-run.ts\n agent-builder.ts\n ask.ts\n base.ts\n file-explorer.ts\n file-picker.ts\n planner.ts\n researcher.ts\n reviewer.ts\n superagent.ts\n thinker.ts\n thinking-base.ts\n agent-list.ts\n agent-registry.ts\n ask-prompts.ts\n base-prompts.ts\n prompts.ts\n README.md\n strings.ts\n types.ts\n tools/\n definitions/\n tool/\n add-message.ts\n add-subgoal.ts\n browser-logs.ts\n code-search.ts\n create-plan.ts\n end-turn.ts\n find-files.ts\n read-docs.ts\n read-files.ts\n run-file-change-hooks.ts\n run-terminal-command.ts\n set-messages.ts\n set-output.ts\n spawn-agent-inline.ts\n spawn-agents-async.ts\n spawn-agents.ts\n str-replace.ts\n think-deeply.ts\n update-subgoal.ts\n web-search.ts\n write-file.ts\n list.ts\n tool-def-type.ts\n handlers/\n tool/\n add-message.ts\n add-subgoal.ts\n browser-logs.ts\n code-search.ts\n create-plan.ts\n end-turn.ts\n find-files.ts\n read-docs.ts\n read-files.ts\n run-file-change-hooks.ts\n run-terminal-command.ts\n set-messages.ts\n set-output.ts\n spawn-agent-inline.ts\n spawn-agents-async.ts\n spawn-agents.ts\n str-replace.ts\n think-deeply.ts\n update-subgoal.ts\n web-search.ts\n write-file.ts\n handler-function-type.ts\n list.ts\n constants.ts\n prompts.ts\n stream-parser.ts\n tool-executor.ts\n util/\n __tests__/\n messages.test.ts\n object.test.ts\n parse-tool-call-xml.test.ts\n simplify-tool-results.test.ts\n split-data.test.ts\n check-auth.ts\n debug.ts\n file-resolver.ts\n logger.ts\n messages.ts\n object.ts\n parse-tool-call-xml.ts\n quickjs-sandbox.ts\n simplify-tool-results.ts\n split-data.ts\n token-counter.ts\n websockets/\n auth.ts\n middleware.ts\n request-context.ts\n server.ts\n switchboard.ts\n websocket-action.ts\n async-agent-manager.ts\n check-terminal-command.ts\n fast-rewrite.ts\n generate-diffs-prompt.ts\n get-documentation-for-query.ts\n get-file-reading-updates.ts\n index.ts\n live-user-inputs.ts\n loop-main-prompt.ts\n main-prompt.ts\n process-file-block.ts\n process-str-replace.ts\n prompt-agent-stream.ts\n run-agent-step.ts\n run-programmatic-step.ts\n xml-stream-parser.ts\n .gitignore\n knowledge.md\n package.json\n README.md\n tsconfig.json\ncommon/\n src/\n __tests__/\n agent-validation.test.ts\n dynamic-agent-template-schema.test.ts\n handlesteps-parsing.test.ts\n api-keys/\n constants.ts\n crypto.ts\n constants/\n agents.ts\n analytics-events.ts\n grant-priorities.ts\n db/\n migrations/\n meta/\n _journal.json\n 0000_snapshot.json\n 0001_snapshot.json\n 0002_snapshot.json\n 0003_snapshot.json\n 0004_snapshot.json\n 0005_snapshot.json\n 0006_snapshot.json\n 0007_snapshot.json\n 0008_snapshot.json\n 0009_snapshot.json\n 0010_snapshot.json\n 0011_snapshot.json\n 0012_snapshot.json\n 0013_snapshot.json\n 0014_snapshot.json\n 0015_snapshot.json\n 0016_snapshot.json\n 0017_snapshot.json\n 0018_snapshot.json\n 0019_snapshot.json\n 0020_snapshot.json\n 0021_snapshot.json\n 0026_snapshot.json\n 0027_snapshot.json\n 0028_snapshot.json\n 0000_overjoyed_thing.sql\n 0001_fuzzy_typhoid_mary.sql\n 0002_sticky_dormammu.sql\n 0003_military_owl.sql\n 0004_neat_pet_avengers.sql\n 0005_minor_the_professor.sql\n 0006_first_quasimodo.sql\n 0007_equal_warlock.sql\n 0008_puzzling_carnage.sql\n 0009_bitter_rumiko_fujikawa.sql\n 0010_overjoyed_red_skull.sql\n 0011_familiar_ezekiel_stane.sql\n 0012_fluffy_naoko.sql\n 0013_famous_risque.sql\n 0014_wakeful_sinister_six.sql\n 0015_stormy_zuras.sql\n 0016_clear_hairball.sql\n 0017_tricky_randall_flagg.sql\n 0018_stale_human_robot.sql\n 0019_amused_nebula.sql\n 0020_young_sleeper.sql\n 0021_tiny_marauders.sql\n 0026_chilly_mockingbird.sql\n 0027_sloppy_quasar.sql\n 0028_lush_johnny_blaze.sql\n docker-compose.yml\n drizzle.config.ts\n index.ts\n schema.knowledge.md\n schema.ts\n transaction.ts\n json-config/\n __tests__/\n __snapshots__/\n stringify-schema.test.ts.snap\n constants.test.ts\n stringify-schema.test.ts\n constants.ts\n default.ts\n stringify-schema.ts\n templates/\n agent-validation.ts\n dynamic-agent-functions.ts\n testing/\n mock-modules.ts\n tools/\n params/\n tool/\n add-message.ts\n add-subgoal.ts\n browser-logs.ts\n code-search.ts\n create-plan.ts\n end-turn.ts\n find-files.ts\n read-docs.ts\n read-files.ts\n run-file-change-hooks.ts\n run-terminal-command.ts\n set-messages.ts\n set-output.ts\n spawn-agent-inline.ts\n spawn-agents-async.ts\n spawn-agents.ts\n str-replace.ts\n think-deeply.ts\n update-subgoal.ts\n web-search.ts\n write-file.ts\n compile-tool-definitions.ts\n constants.ts\n list.ts\n utils.ts\n types/\n __tests__/\n dynamic-agent-template.test.ts\n api/\n agents/\n publish.ts\n agent-template.ts\n dynamic-agent-template.ts\n grant.ts\n message.ts\n organization.ts\n print-mode.ts\n publisher.ts\n referral.ts\n session-state.ts\n usage.ts\n util/\n __tests__/\n messages.test.ts\n partial-json-delta.test.ts\n saxy.test.ts\n string.test.ts\n examples/\n diff-reviewer-1.ts\n diff-reviewer-2.ts\n diff-reviewer-3.ts\n agent-file-utils.ts\n agent-name-normalization.ts\n agent-name-resolver.ts\n agent-template-validation.ts\n array.ts\n changes.ts\n credentials.ts\n currency.ts\n dates.ts\n error.ts\n file.ts\n git.ts\n logger.ts\n lru-cache.ts\n messages.ts\n min-heap.ts\n model-utils.ts\n object.ts\n partial-json-delta.ts\n patch.ts\n promise.ts\n random.ts\n referral.ts\n saxy.ts\n string.knowledge.md\n string.ts\n stripe.ts\n sync-failure.ts\n xml.ts\n zod-schema.ts\n websockets/\n websocket-client.ts\n websocket-schema.ts\n actions.ts\n analytics.ts\n browser-actions.ts\n constants.ts\n project-file-tree.ts\n knowledge.md\n package.json\n tsconfig.json\nevals/\n git-evals/\n email-eval-results.ts\n eval-codebuff.json\n eval-manifold.json\n eval-result-codebuff-mock.json\n gen-evals.ts\n judge-git-eval.ts\n post-eval-analysis.ts\n run-eval-set.ts\n run-git-evals.ts\n run-single-eval-process.ts\n run-single-eval.ts\n setup-test-repo.ts\n types.ts\n .gitignore\n bun.lock\n constants.ts\n e2e-cat-app-script.ts\n knowledge.md\n package.json\n scaffolding.ts\n swe-bench-eval.ts\n swe-bench-ids.ts\n swe-bench.test.ts\n test-repos.json\n test-setup.ts\n tsconfig.json\nnpm-app/\n release/\n index.js\n package.json\n README.md\n release-staging/\n index.js\n package.json\n README.md\n scripts/\n build-binary.js\n generate-github-token.ts\n patch-web-tree-sitter.ts\n release.js\n twitch-plays-codebuff.sh\n src/\n __tests__/\n display.test.ts\n tool-handlers.test.ts\n agents/\n agent-utils.ts\n load-agents.ts\n checkpoints/\n checkpoint-manager.ts\n file-manager.ts\n cli-handlers/\n agent-creation-chat.ts\n agents.ts\n api-key.ts\n checkpoint.ts\n diff.ts\n easter-egg.ts\n inititalization-flow.ts\n mini-chat.ts\n publish.ts\n subagent-list.ts\n subagent.ts\n display/\n overrides.ts\n print-mode.ts\n squash-newlines.ts\n json-config/\n hooks.ts\n parser.ts\n native/\n ripgrep.ts\n terminal/\n background.ts\n run-command.ts\n utils/\n __tests__/\n __snapshots__/\n background-process-manager.test.ts.snap\n frustration-detector.test.ts.snap\n rage-detector.test.ts.snap\n xml-stream-parser.test.ts.snap\n background-process-manager.test.ts\n rage-detector.test.ts\n response-example-4-files.txt\n tool-renderers.test.ts\n xml-stream-parser.test.ts\n agent-validation.ts\n analytics.ts\n detect-shell.ts\n git.ts\n logger.ts\n rage-detector.ts\n spinner.ts\n suppress-console.ts\n system-info.ts\n terminal.ts\n tool-renderers.ts\n with-hang-detection.ts\n xml-stream-parser.ts\n workers/\n checkpoint-worker.ts\n project-context.ts\n background-process-manager.ts\n browser-runner.ts\n chat-storage.ts\n cli-definitions.ts\n cli.ts\n client.ts\n config.ts\n create-template-project.ts\n credentials.ts\n dev-process-manager.ts\n diff-manager.ts\n fingerprint.ts\n index.ts\n menu.ts\n project-files.ts\n rage-detectors.ts\n startup-process-handler.ts\n subagent-storage.ts\n tool-handlers.ts\n types.ts\n web-scraper.ts\n .gitignore\n bunfig.toml\n package.json\n tsconfig.json\npackages/\n bigquery/\n src/\n client.ts\n index.ts\n schema.ts\n knowledge.md\n package.json\n tsconfig.json\n billing/\n src/\n __tests__/\n credit-delegation.test.ts\n extract-owner-repo.test.ts\n org-billing.test.ts\n auto-topup.ts\n balance-calculator.ts\n billing.knowledge.md\n conversion.ts\n credit-delegation.ts\n grant-credits.knowledge.md\n grant-credits.ts\n index.ts\n org-billing.ts\n org-monitoring.ts\n usage-service.ts\n utils.ts\n knowledge.md\n package.json\n project.json\n tsconfig.json\n build-tools/\n executors/\n infisical-run/\n executor.ts\n schema.json\n executors.json\n package.json\n project.json\n tsconfig.json\n code-map/\n __tests__/\n test-langs/\n test.c\n test.cpp\n test.cs\n test.go\n test.java\n test.js\n test.php\n test.py\n test.rb\n test.rs\n test.ts\n languages.test.ts\n parse.test.ts\n src/\n tree-sitter-queries/\n readme.md\n tree-sitter-c_sharp-tags.scm\n tree-sitter-c-tags.scm\n tree-sitter-cpp-tags.scm\n tree-sitter-go-tags.scm\n tree-sitter-java-tags.scm\n tree-sitter-javascript-tags.scm\n tree-sitter-php-tags.scm\n tree-sitter-python-tags.scm\n tree-sitter-ruby-tags.scm\n tree-sitter-rust-tags.scm\n tree-sitter-typescript-tags.scm\n index.ts\n languages.ts\n parse.ts\n package.json\n tsconfig.json\n internal/\n src/\n loops/\n client.ts\n index.ts\n types.ts\n openrouter-ai-sdk/\n internal/\n index.ts\n schemas/\n reasoning-details.ts\n types/\n index.ts\n openrouter-chat-completions-input.ts\n openrouter-chat-settings.ts\n .gitignore\n convert-to-openrouter-chat-messages.test.ts\n convert-to-openrouter-chat-messages.ts\n convert-to-openrouter-completion-prompt.ts\n index.ts\n map-openrouter-chat-logprobs.ts\n map-openrouter-completion-logprobs.ts\n map-openrouter-finish-reason.ts\n openrouter-chat-language-model.test.ts\n openrouter-chat-language-model.ts\n openrouter-completion-language-model.test.ts\n openrouter-completion-language-model.ts\n openrouter-completion-settings.ts\n openrouter-error.ts\n openrouter-facade.ts\n openrouter-provider-options.test.ts\n openrouter-provider.ts\n openrouter-stream-usage-accounting.test.ts\n openrouter-usage-accounting.test.ts\n utils/\n __tests__/\n version-utils.test.ts\n auth.ts\n version-utils.ts\n xml-parser.ts\n env.ts\n index.ts\n knowledge.md\n package.json\n tsconfig.json\npython-app/\n src/\n codebuff/\n __init__.py\n .gitignore\n knowledge.md\n LICENSE\n pyproject.toml\n README.md\nscripts/\n changelog/\n 2025-05-18-version-10283-release-enhanced-assistant-experience-system-stability.mdx\n 2025-05-25-version-10295-enhanced-ai-models-and-user-experience-improvements.mdx\n 2025-06-01-version-10305-release-enhanced-ai-models-new-commands-and-performance-improvements.mdx\n docs.json\n ft-file-selection/\n .gitignore\n collect-tuning-data.ts\n grade-traces.ts\n print-recent-relabels.ts\n print-recent-traces.ts\n README.md\n relabel-for-offline-scoring.ts\n relabel-traces-with-context.ts\n relabel-traces.ts\n .gitignore\n analyze-edit-blocks.ts\n analyze-model-usage.ts\n apply-credit-migration.ts\n calculate-average-spend.ts\n calculate-dau.ts\n calculate-monthly-usage.ts\n calculate-mrr.ts\n calculate-weekly-usage.ts\n cleanup-worktree.sh\n convert-escaped-newlines.ts\n count-edit-file.ts\n debug-log-subset.ts\n dev.sh\n export-user-emails.ts\n generate-ci-env.js\n generate-tool-definitions.ts\n get-changelog.ts\n init-worktree.ts\n package.json\n tsconfig.json\n update-stripe-subscriptions.ts\nsdk/\n scripts/\n publish.js\n src/\n tools/\n change-file.ts\n read-files.ts\n types/\n agent-definition.ts\n tools.ts\n client.ts\n constants.ts\n index.ts\n process-stream.ts\n websocket-client.ts\n .npmignore\n CHANGELOG.md\n package.json\n PUBLISHING.md\n README.md\n tsconfig.json\nweb/\n public/\n codebuff-intro1.webm\n scripts/\n discord/\n index.ts\n register-commands.ts\n src/\n __tests__/\n e2e/\n home.spec.ts\n unit/\n home.spec.tsx\n actions/\n hello-action.ts\n app/\n [sponsee]/\n page.tsx\n admin/\n file-picker/\n page.tsx\n orgs/\n page.tsx\n traces/\n components/\n chat-message.tsx\n client-session-viewer.tsx\n empty-state.tsx\n error-boundary.tsx\n loading-skeletons.tsx\n timeline-chart.module.css\n timeline-chart.tsx\n trace-viewer.tsx\n utils/\n __tests__/\n trace-processing.test.ts\n trace-processing.ts\n page.tsx\n layout.tsx\n affiliates/\n actions.ts\n page.tsx\n agents/\n page.tsx\n api/\n admin/\n orgs/\n [orgId]/\n features/\n [feature]/\n route.ts\n export/\n route.ts\n route.ts\n relabel-for-user/\n route.ts\n traces/\n [clientRequestId]/\n messages/\n route.ts\n timeline/\n route.ts\n client/\n [clientId]/\n sessions/\n route.ts\n admin-auth.ts\n agents/\n [publisherId]/\n [agentId]/\n [version]/\n route.ts\n latest/\n route.ts\n publish/\n route.ts\n validate/\n route.ts\n route.ts\n api-keys/\n route.ts\n auth/\n [...nextauth]/\n auth-options.ts\n route.ts\n cli/\n code/\n route.ts\n logout/\n route.ts\n status/\n route.ts\n feed/\n route.ts\n git-evals/\n visibility/\n route.ts\n route.ts\n healthz/\n route.ts\n invites/\n [token]/\n route.ts\n orgs/\n [orgId]/\n alerts/\n [alertId]/\n dismiss/\n route.ts\n route.ts\n analytics/\n export/\n route.ts\n route.ts\n billing/\n setup/\n route.ts\n status/\n route.ts\n subscription/\n route.ts\n credits/\n route.ts\n invitations/\n [email]/\n resend/\n route.ts\n route.ts\n bulk/\n route.ts\n route.ts\n members/\n [userId]/\n route.ts\n route.ts\n monitoring/\n route.ts\n publishers/\n route.ts\n repos/\n [repoId]/\n route.ts\n route.ts\n settings/\n route.ts\n usage/\n export/\n route.ts\n route.ts\n route.ts\n slug/\n [slug]/\n route.ts\n route.ts\n publishers/\n [id]/\n organization/\n route.ts\n validate/\n route.ts\n route.ts\n referrals/\n [code]/\n route.ts\n helpers.ts\n route.ts\n stripe/\n buy-credits/\n route.ts\n webhook/\n route.ts\n upload/\n avatar/\n route.ts\n user/\n auto-topup/\n route.ts\n profile/\n route.ts\n usage/\n route.ts\n config/\n page.tsx\n docs/\n [category]/\n layout.tsx\n metadata.ts\n page.tsx\n layout.tsx\n page.tsx\n evals/\n evals-table.tsx\n page.tsx\n invites/\n [token]/\n page.tsx\n login/\n page.tsx\n onboard/\n page.tsx\n orgs/\n [slug]/\n analytics/\n page.tsx\n billing/\n purchase/\n page.tsx\n setup/\n page.tsx\n repositories/\n page.tsx\n settings/\n page.tsx\n team/\n page.tsx\n usage/\n page.tsx\n page.tsx\n new/\n page.tsx\n page.tsx\n payment-success/\n page.tsx\n pricing/\n page.tsx\n privacy-policy/\n page.tsx\n publishers/\n [id]/\n agents/\n [agentId]/\n [version]/\n page.tsx\n page.tsx\n new/\n page.tsx\n page.tsx\n referrals/\n [code]/\n metadata.ts\n page.tsx\n layout.tsx\n page.tsx\n terms-of-service/\n page.tsx\n usage/\n layout.tsx\n page.tsx\n usage-display.tsx\n analytics.knowledge.md\n layout.tsx\n page.tsx\n robots.ts\n sitemap.ts\n components/\n agent/\n json-viewer.tsx\n auto-topup/\n AutoTopupSettings.tsx\n AutoTopupSettingsForm.tsx\n AutoTopupSwitch.tsx\n BaseAutoTopupSettings.tsx\n BaseAutoTopupSettingsForm.tsx\n BaseAutoTopupSwitch.tsx\n constants.ts\n OrgAutoTopupSettings.tsx\n OrgAutoTopupSettingsForm.tsx\n OrgAutoTopupSwitch.tsx\n types.ts\n credits/\n CreditManagementSection.tsx\n CreditPurchaseSection.tsx\n docs/\n mdx/\n code-demo.tsx\n custom-link.tsx\n markdown-table.tsx\n mdx-components.tsx\n mermaid-diagram.tsx\n schema-display.tsx\n copy-heading.tsx\n doc-sidebar.tsx\n docs.knowledge.md\n toc.tsx\n login/\n login-card.tsx\n login-client-wrapper.tsx\n navbar/\n navbar.tsx\n user-dropdown.tsx\n organization/\n advanced-monitor.tsx\n billing-alerts.tsx\n billing-reports.tsx\n billing-status.tsx\n credit-monitor.tsx\n model-config-sheet.tsx\n organization-success-modal.tsx\n repository-management.tsx\n team-management.tsx\n providers/\n query-client-provider.tsx\n publisher/\n basic-info-step.tsx\n ownership-step.tsx\n profile-details-step.tsx\n step-template.tsx\n sign-in/\n sign-in-button.tsx\n sign-in-card-footer.tsx\n ui/\n landing/\n competition/\n claude-code.tsx\n cline.tsx\n cursor.tsx\n github-copilot.tsx\n index.tsx\n tabs.tsx\n feature/\n browser-comparison.tsx\n chart-illustration.tsx\n code-illustration.tsx\n highlight-text.tsx\n index.tsx\n workflow-illustration.tsx\n animated-element.tsx\n constants.ts\n cta-section.tsx\n demo-code-display.tsx\n testimonials-section.tsx\n types.ts\n terminal/\n index.tsx\n style.css\n terminal-input.tsx\n terminal-output.tsx\n avatar-upload.tsx\n background-beams.tsx\n badge.tsx\n banner.tsx\n button.tsx\n card.tsx\n collapsible.tsx\n credit-confetti.tsx\n decorative-blocks.tsx\n dialog.tsx\n dropdown-menu.tsx\n enhanced-copy-button.tsx\n footer.tsx\n hero-buttons.tsx\n hero.tsx\n input.tsx\n install-dialog.tsx\n label.tsx\n neon-gradient-button.tsx\n progress.tsx\n radio-group.tsx\n section.tsx\n select.tsx\n separator.tsx\n sheet.tsx\n sidebar.tsx\n skeleton-loading.tsx\n skeleton.tsx\n slider.tsx\n switch.tsx\n table.tsx\n tabs.tsx\n textarea.tsx\n toast.tsx\n toaster.tsx\n tooltip.tsx\n use-toast.ts\n BrowserPreview.tsx\n card-with-beams.tsx\n CookieConsentCard.tsx\n footer.tsx\n icons.tsx\n IDEDemo.tsx\n layout-wrapper.tsx\n TerminalDemo.tsx\n theme-provider.tsx\n theme-switcher.tsx\n content/\n advanced/\n claude-code-comparison.mdx\n config.mdx\n how-does-it-work.mdx\n large-projects.mdx\n troubleshooting.mdx\n what-models.mdx\n agents/\n agent-reference.mdx\n creating-new-agents.mdx\n customizing-agents.mdx\n overview.mdx\n troubleshooting-agent-customization.mdx\n case-studies/\n _cta.mdx\n benjamin-bryant.mdx\n oliver-lukesch.mdx\n help/\n faq.mdx\n getting-started.mdx\n tips/\n best-practices.mdx\n keyboard-shortcuts.mdx\n knowledge-files.mdx\n other-use-cases.mdx\n version-control.mdx\n where-codebuff-shines.mdx\n discord/\n client.ts\n rate-limiter.ts\n hooks/\n use-auto-topup.ts\n use-install-dialog.ts\n use-mobile.tsx\n use-model-config.ts\n use-org-auto-topup.ts\n use-organization-data.ts\n use-user-profile.ts\n lib/\n server/\n referral.ts\n validators/\n publisher.ts\n admin-auth.ts\n constant.ts\n currency.ts\n docs.ts\n fonts.ts\n organization-permissions.ts\n PostHogProvider.tsx\n publisher-permissions.ts\n remark-code-to-codedemo.ts\n server-init.ts\n SessionProvider.tsx\n stripe-utils.ts\n testimonials.ts\n trackConversions.ts\n utils.ts\n styles/\n globals.css\n types/\n docs.ts\n user.ts\n util/\n logger.ts\n .eslintignore\n .eslintrc.js\n .gitignore\n .prettierignore\n .prettierrc.js\n commitlint.config.js\n components.json\n contentlayer.config.ts\n jest.config.js\n jest.setup.js\n knowledge.md\n next.config.mjs\n package.json\n playwright.config.ts\n postcss.config.cjs\n README.md\n tailwind.config.ts\n tsconfig.json\n.envrc\n.gitignore\n.infisical.json\n.prettierrc\nauthentication.knowledge.md\nbun.lock\nbunfig.toml\ncodebuff.json\neslint.config.js\nknowledge.md\npackage.json\nREADME.md\ntsconfig.base.json\ntsconfig.json\nWINDOWS.md\n", - "tokenCount": 9007, - "truncationLevel": "none" - } - ] - } - ], - "parentAgentId": "D-OgGtcToUQ" - }, - { - "type": "tool_call", - "toolCallId": "4d5eb69d-6f5d-4c20-b1c2-51f7bebcc29b", - "toolName": "read_subtree", - "input": { - "paths": [], - "maxTokens": 500000 - }, - "agentId": "D-OgWSwaG9Q", - "parentAgentId": "D-OfaehVPQw", - "includeToolCall": true - }, - { - "type": "tool_result", - "toolCallId": "4d5eb69d-6f5d-4c20-b1c2-51f7bebcc29b", - "toolName": "read_subtree", - "output": [ - { - "type": "json", - "value": [ - { - "path": ".", - "type": "directory", - "printedTree": ".agents/\n examples/\n diff-reviewer-1.ts\n diff-reviewer-2.ts\n diff-reviewer-3.ts\n opensource/\n base.ts\n coder.ts\n file-picker.ts\n researcher.ts\n reviewer.ts\n thinker.ts\n ask.ts\n base-experimental.ts\n base-lite.ts\n base-max.ts\n base.ts\n brainstormer.ts\n changes-reviewer.ts\n charles.ts\n claude4-gemini-thinking.ts\n constants.ts\n file-explorer.ts\n file-picker.ts\n git-committer.ts\n knowledge-keeper.ts\n planner.ts\n researcher.ts\n reviewer.ts\n superagent.ts\n thinker.ts\n.bin/\n bun\n.github/\n workflows/\n ci.yml\n evals.yml\n nightly-evals.yml\n npm-app-release-build.yml\n npm-app-release-prod.yml\n npm-app-release-staging.yml\n .gitignore\n CODEOWNERS\n knowledge.md\n.vscode/\n settings.json\nbackend/\n src/\n __tests__/\n test-data/\n dex-go/\n edit-snippet.go\n expected.go\n original.go\n agent-id-resolution.test.ts\n agent-registry.test.ts\n auto-topup.test.ts\n credit-conversion.test.ts\n fast-rewrite.test.ts\n generate-diffs-prompt.test.ts\n get-custom-file-picker-config.test.ts\n live-user-inputs.test.ts\n loop-agent-steps.test.ts\n main-prompt.integration.test.ts\n main-prompt.test.ts\n process-file-block.test.ts\n process-str-replace.test.ts\n read-docs-tool.test.ts\n request-files-prompt.test.ts\n run-agent-step-tools.test.ts\n run-programmatic-step.test.ts\n sandbox-generator.test.ts\n subagent-streaming.test.ts\n test-utils.ts\n tool-call-schema.test.ts\n usage-calculation.test.ts\n web-search-tool.test.ts\n xml-stream-parser.test.ts\n admin/\n grade-runs.ts\n relabelRuns.ts\n api/\n org.ts\n usage.ts\n context/\n app-context.ts\n find-files/\n check-new-files-necessary.ts\n custom-file-picker-config.ts\n request-files-prompt.ts\n llm-apis/\n __tests__/\n linkup-api.test.ts\n vercel-ai-sdk/\n ai-sdk.ts\n openrouter.ts\n vertex-finetuned.ts\n claude.ts\n context7-api.ts\n gemini-with-fallbacks.ts\n knowledge.md\n linkup-api.ts\n message-cost-tracker.ts\n openai-api.ts\n openrouter.ts\n relace-api.ts\n system-prompt/\n agent-instructions.md\n prompts.ts\n save-agent-request.ts\n search-system-prompt.ts\n truncate-file-tree.ts\n templates/\n agents/\n archive/\n dry-run.ts\n agent-builder.ts\n ask.ts\n base.ts\n file-explorer.ts\n file-picker.ts\n planner.ts\n researcher.ts\n reviewer.ts\n superagent.ts\n thinker.ts\n thinking-base.ts\n agent-list.ts\n agent-registry.ts\n ask-prompts.ts\n base-prompts.ts\n prompts.ts\n README.md\n strings.ts\n types.ts\n tools/\n definitions/\n tool/\n add-message.ts\n add-subgoal.ts\n browser-logs.ts\n code-search.ts\n create-plan.ts\n end-turn.ts\n find-files.ts\n read-docs.ts\n read-files.ts\n run-file-change-hooks.ts\n run-terminal-command.ts\n set-messages.ts\n set-output.ts\n spawn-agent-inline.ts\n spawn-agents-async.ts\n spawn-agents.ts\n str-replace.ts\n think-deeply.ts\n update-subgoal.ts\n web-search.ts\n write-file.ts\n list.ts\n tool-def-type.ts\n handlers/\n tool/\n add-message.ts\n add-subgoal.ts\n browser-logs.ts\n code-search.ts\n create-plan.ts\n end-turn.ts\n find-files.ts\n read-docs.ts\n read-files.ts\n run-file-change-hooks.ts\n run-terminal-command.ts\n set-messages.ts\n set-output.ts\n spawn-agent-inline.ts\n spawn-agents-async.ts\n spawn-agents.ts\n str-replace.ts\n think-deeply.ts\n update-subgoal.ts\n web-search.ts\n write-file.ts\n handler-function-type.ts\n list.ts\n constants.ts\n prompts.ts\n stream-parser.ts\n tool-executor.ts\n util/\n __tests__/\n messages.test.ts\n object.test.ts\n parse-tool-call-xml.test.ts\n simplify-tool-results.test.ts\n split-data.test.ts\n check-auth.ts\n debug.ts\n file-resolver.ts\n logger.ts\n messages.ts\n object.ts\n parse-tool-call-xml.ts\n quickjs-sandbox.ts\n simplify-tool-results.ts\n split-data.ts\n token-counter.ts\n websockets/\n auth.ts\n middleware.ts\n request-context.ts\n server.ts\n switchboard.ts\n websocket-action.ts\n async-agent-manager.ts\n check-terminal-command.ts\n fast-rewrite.ts\n generate-diffs-prompt.ts\n get-documentation-for-query.ts\n get-file-reading-updates.ts\n index.ts\n live-user-inputs.ts\n loop-main-prompt.ts\n main-prompt.ts\n process-file-block.ts\n process-str-replace.ts\n prompt-agent-stream.ts\n run-agent-step.ts\n run-programmatic-step.ts\n xml-stream-parser.ts\n .gitignore\n knowledge.md\n package.json\n README.md\n tsconfig.json\ncommon/\n src/\n __tests__/\n agent-validation.test.ts\n dynamic-agent-template-schema.test.ts\n handlesteps-parsing.test.ts\n api-keys/\n constants.ts\n crypto.ts\n constants/\n agents.ts\n analytics-events.ts\n grant-priorities.ts\n db/\n migrations/\n meta/\n _journal.json\n 0000_snapshot.json\n 0001_snapshot.json\n 0002_snapshot.json\n 0003_snapshot.json\n 0004_snapshot.json\n 0005_snapshot.json\n 0006_snapshot.json\n 0007_snapshot.json\n 0008_snapshot.json\n 0009_snapshot.json\n 0010_snapshot.json\n 0011_snapshot.json\n 0012_snapshot.json\n 0013_snapshot.json\n 0014_snapshot.json\n 0015_snapshot.json\n 0016_snapshot.json\n 0017_snapshot.json\n 0018_snapshot.json\n 0019_snapshot.json\n 0020_snapshot.json\n 0021_snapshot.json\n 0026_snapshot.json\n 0027_snapshot.json\n 0028_snapshot.json\n 0000_overjoyed_thing.sql\n 0001_fuzzy_typhoid_mary.sql\n 0002_sticky_dormammu.sql\n 0003_military_owl.sql\n 0004_neat_pet_avengers.sql\n 0005_minor_the_professor.sql\n 0006_first_quasimodo.sql\n 0007_equal_warlock.sql\n 0008_puzzling_carnage.sql\n 0009_bitter_rumiko_fujikawa.sql\n 0010_overjoyed_red_skull.sql\n 0011_familiar_ezekiel_stane.sql\n 0012_fluffy_naoko.sql\n 0013_famous_risque.sql\n 0014_wakeful_sinister_six.sql\n 0015_stormy_zuras.sql\n 0016_clear_hairball.sql\n 0017_tricky_randall_flagg.sql\n 0018_stale_human_robot.sql\n 0019_amused_nebula.sql\n 0020_young_sleeper.sql\n 0021_tiny_marauders.sql\n 0026_chilly_mockingbird.sql\n 0027_sloppy_quasar.sql\n 0028_lush_johnny_blaze.sql\n docker-compose.yml\n drizzle.config.ts\n index.ts\n schema.knowledge.md\n schema.ts\n transaction.ts\n json-config/\n __tests__/\n __snapshots__/\n stringify-schema.test.ts.snap\n constants.test.ts\n stringify-schema.test.ts\n constants.ts\n default.ts\n stringify-schema.ts\n templates/\n agent-validation.ts\n dynamic-agent-functions.ts\n testing/\n mock-modules.ts\n tools/\n params/\n tool/\n add-message.ts\n add-subgoal.ts\n browser-logs.ts\n code-search.ts\n create-plan.ts\n end-turn.ts\n find-files.ts\n read-docs.ts\n read-files.ts\n run-file-change-hooks.ts\n run-terminal-command.ts\n set-messages.ts\n set-output.ts\n spawn-agent-inline.ts\n spawn-agents-async.ts\n spawn-agents.ts\n str-replace.ts\n think-deeply.ts\n update-subgoal.ts\n web-search.ts\n write-file.ts\n compile-tool-definitions.ts\n constants.ts\n list.ts\n utils.ts\n types/\n __tests__/\n dynamic-agent-template.test.ts\n api/\n agents/\n publish.ts\n agent-template.ts\n dynamic-agent-template.ts\n grant.ts\n message.ts\n organization.ts\n print-mode.ts\n publisher.ts\n referral.ts\n session-state.ts\n usage.ts\n util/\n __tests__/\n messages.test.ts\n partial-json-delta.test.ts\n saxy.test.ts\n string.test.ts\n examples/\n diff-reviewer-1.ts\n diff-reviewer-2.ts\n diff-reviewer-3.ts\n agent-file-utils.ts\n agent-name-normalization.ts\n agent-name-resolver.ts\n agent-template-validation.ts\n array.ts\n changes.ts\n credentials.ts\n currency.ts\n dates.ts\n error.ts\n file.ts\n git.ts\n logger.ts\n lru-cache.ts\n messages.ts\n min-heap.ts\n model-utils.ts\n object.ts\n partial-json-delta.ts\n patch.ts\n promise.ts\n random.ts\n referral.ts\n saxy.ts\n string.knowledge.md\n string.ts\n stripe.ts\n sync-failure.ts\n xml.ts\n zod-schema.ts\n websockets/\n websocket-client.ts\n websocket-schema.ts\n actions.ts\n analytics.ts\n browser-actions.ts\n constants.ts\n project-file-tree.ts\n knowledge.md\n package.json\n tsconfig.json\nevals/\n git-evals/\n email-eval-results.ts\n eval-codebuff.json\n eval-manifold.json\n eval-result-codebuff-mock.json\n gen-evals.ts\n judge-git-eval.ts\n post-eval-analysis.ts\n run-eval-set.ts\n run-git-evals.ts\n run-single-eval-process.ts\n run-single-eval.ts\n setup-test-repo.ts\n types.ts\n .gitignore\n bun.lock\n constants.ts\n e2e-cat-app-script.ts\n knowledge.md\n package.json\n scaffolding.ts\n swe-bench-eval.ts\n swe-bench-ids.ts\n swe-bench.test.ts\n test-repos.json\n test-setup.ts\n tsconfig.json\nnpm-app/\n release/\n index.js\n package.json\n README.md\n release-staging/\n index.js\n package.json\n README.md\n scripts/\n build-binary.js\n generate-github-token.ts\n patch-web-tree-sitter.ts\n release.js\n twitch-plays-codebuff.sh\n src/\n __tests__/\n display.test.ts\n tool-handlers.test.ts\n agents/\n agent-utils.ts\n load-agents.ts\n checkpoints/\n checkpoint-manager.ts\n file-manager.ts\n cli-handlers/\n agent-creation-chat.ts\n agents.ts\n api-key.ts\n checkpoint.ts\n diff.ts\n easter-egg.ts\n inititalization-flow.ts\n mini-chat.ts\n publish.ts\n subagent-list.ts\n subagent.ts\n display/\n overrides.ts\n print-mode.ts\n squash-newlines.ts\n json-config/\n hooks.ts\n parser.ts\n native/\n ripgrep.ts\n terminal/\n background.ts\n run-command.ts\n utils/\n __tests__/\n __snapshots__/\n background-process-manager.test.ts.snap\n frustration-detector.test.ts.snap\n rage-detector.test.ts.snap\n xml-stream-parser.test.ts.snap\n background-process-manager.test.ts\n rage-detector.test.ts\n response-example-4-files.txt\n tool-renderers.test.ts\n xml-stream-parser.test.ts\n agent-validation.ts\n analytics.ts\n detect-shell.ts\n git.ts\n logger.ts\n rage-detector.ts\n spinner.ts\n suppress-console.ts\n system-info.ts\n terminal.ts\n tool-renderers.ts\n with-hang-detection.ts\n xml-stream-parser.ts\n workers/\n checkpoint-worker.ts\n project-context.ts\n background-process-manager.ts\n browser-runner.ts\n chat-storage.ts\n cli-definitions.ts\n cli.ts\n client.ts\n config.ts\n create-template-project.ts\n credentials.ts\n dev-process-manager.ts\n diff-manager.ts\n fingerprint.ts\n index.ts\n menu.ts\n project-files.ts\n rage-detectors.ts\n startup-process-handler.ts\n subagent-storage.ts\n tool-handlers.ts\n types.ts\n web-scraper.ts\n .gitignore\n bunfig.toml\n package.json\n tsconfig.json\npackages/\n bigquery/\n src/\n client.ts\n index.ts\n schema.ts\n knowledge.md\n package.json\n tsconfig.json\n billing/\n src/\n __tests__/\n credit-delegation.test.ts\n extract-owner-repo.test.ts\n org-billing.test.ts\n auto-topup.ts\n balance-calculator.ts\n billing.knowledge.md\n conversion.ts\n credit-delegation.ts\n grant-credits.knowledge.md\n grant-credits.ts\n index.ts\n org-billing.ts\n org-monitoring.ts\n usage-service.ts\n utils.ts\n knowledge.md\n package.json\n project.json\n tsconfig.json\n build-tools/\n executors/\n infisical-run/\n executor.ts\n schema.json\n executors.json\n package.json\n project.json\n tsconfig.json\n code-map/\n __tests__/\n test-langs/\n test.c\n test.cpp\n test.cs\n test.go\n test.java\n test.js\n test.php\n test.py\n test.rb\n test.rs\n test.ts\n languages.test.ts\n parse.test.ts\n src/\n tree-sitter-queries/\n readme.md\n tree-sitter-c_sharp-tags.scm\n tree-sitter-c-tags.scm\n tree-sitter-cpp-tags.scm\n tree-sitter-go-tags.scm\n tree-sitter-java-tags.scm\n tree-sitter-javascript-tags.scm\n tree-sitter-php-tags.scm\n tree-sitter-python-tags.scm\n tree-sitter-ruby-tags.scm\n tree-sitter-rust-tags.scm\n tree-sitter-typescript-tags.scm\n index.ts\n languages.ts\n parse.ts\n package.json\n tsconfig.json\n internal/\n src/\n loops/\n client.ts\n index.ts\n types.ts\n openrouter-ai-sdk/\n internal/\n index.ts\n schemas/\n reasoning-details.ts\n types/\n index.ts\n openrouter-chat-completions-input.ts\n openrouter-chat-settings.ts\n .gitignore\n convert-to-openrouter-chat-messages.test.ts\n convert-to-openrouter-chat-messages.ts\n convert-to-openrouter-completion-prompt.ts\n index.ts\n map-openrouter-chat-logprobs.ts\n map-openrouter-completion-logprobs.ts\n map-openrouter-finish-reason.ts\n openrouter-chat-language-model.test.ts\n openrouter-chat-language-model.ts\n openrouter-completion-language-model.test.ts\n openrouter-completion-language-model.ts\n openrouter-completion-settings.ts\n openrouter-error.ts\n openrouter-facade.ts\n openrouter-provider-options.test.ts\n openrouter-provider.ts\n openrouter-stream-usage-accounting.test.ts\n openrouter-usage-accounting.test.ts\n utils/\n __tests__/\n version-utils.test.ts\n auth.ts\n version-utils.ts\n xml-parser.ts\n env.ts\n index.ts\n knowledge.md\n package.json\n tsconfig.json\npython-app/\n src/\n codebuff/\n __init__.py\n .gitignore\n knowledge.md\n LICENSE\n pyproject.toml\n README.md\nscripts/\n changelog/\n 2025-05-18-version-10283-release-enhanced-assistant-experience-system-stability.mdx\n 2025-05-25-version-10295-enhanced-ai-models-and-user-experience-improvements.mdx\n 2025-06-01-version-10305-release-enhanced-ai-models-new-commands-and-performance-improvements.mdx\n docs.json\n ft-file-selection/\n .gitignore\n collect-tuning-data.ts\n grade-traces.ts\n print-recent-relabels.ts\n print-recent-traces.ts\n README.md\n relabel-for-offline-scoring.ts\n relabel-traces-with-context.ts\n relabel-traces.ts\n .gitignore\n analyze-edit-blocks.ts\n analyze-model-usage.ts\n apply-credit-migration.ts\n calculate-average-spend.ts\n calculate-dau.ts\n calculate-monthly-usage.ts\n calculate-mrr.ts\n calculate-weekly-usage.ts\n cleanup-worktree.sh\n convert-escaped-newlines.ts\n count-edit-file.ts\n debug-log-subset.ts\n dev.sh\n export-user-emails.ts\n generate-ci-env.js\n generate-tool-definitions.ts\n get-changelog.ts\n init-worktree.ts\n package.json\n tsconfig.json\n update-stripe-subscriptions.ts\nsdk/\n scripts/\n publish.js\n src/\n tools/\n change-file.ts\n read-files.ts\n types/\n agent-definition.ts\n tools.ts\n client.ts\n constants.ts\n index.ts\n process-stream.ts\n websocket-client.ts\n .npmignore\n CHANGELOG.md\n package.json\n PUBLISHING.md\n README.md\n tsconfig.json\nweb/\n public/\n codebuff-intro1.webm\n scripts/\n discord/\n index.ts\n register-commands.ts\n src/\n __tests__/\n e2e/\n home.spec.ts\n unit/\n home.spec.tsx\n actions/\n hello-action.ts\n app/\n [sponsee]/\n page.tsx\n admin/\n file-picker/\n page.tsx\n orgs/\n page.tsx\n traces/\n components/\n chat-message.tsx\n client-session-viewer.tsx\n empty-state.tsx\n error-boundary.tsx\n loading-skeletons.tsx\n timeline-chart.module.css\n timeline-chart.tsx\n trace-viewer.tsx\n utils/\n __tests__/\n trace-processing.test.ts\n trace-processing.ts\n page.tsx\n layout.tsx\n affiliates/\n actions.ts\n page.tsx\n agents/\n page.tsx\n api/\n admin/\n orgs/\n [orgId]/\n features/\n [feature]/\n route.ts\n export/\n route.ts\n route.ts\n relabel-for-user/\n route.ts\n traces/\n [clientRequestId]/\n messages/\n route.ts\n timeline/\n route.ts\n client/\n [clientId]/\n sessions/\n route.ts\n admin-auth.ts\n agents/\n [publisherId]/\n [agentId]/\n [version]/\n route.ts\n latest/\n route.ts\n publish/\n route.ts\n validate/\n route.ts\n route.ts\n api-keys/\n route.ts\n auth/\n [...nextauth]/\n auth-options.ts\n route.ts\n cli/\n code/\n route.ts\n logout/\n route.ts\n status/\n route.ts\n feed/\n route.ts\n git-evals/\n visibility/\n route.ts\n route.ts\n healthz/\n route.ts\n invites/\n [token]/\n route.ts\n orgs/\n [orgId]/\n alerts/\n [alertId]/\n dismiss/\n route.ts\n route.ts\n analytics/\n export/\n route.ts\n route.ts\n billing/\n setup/\n route.ts\n status/\n route.ts\n subscription/\n route.ts\n credits/\n route.ts\n invitations/\n [email]/\n resend/\n route.ts\n route.ts\n bulk/\n route.ts\n route.ts\n members/\n [userId]/\n route.ts\n route.ts\n monitoring/\n route.ts\n publishers/\n route.ts\n repos/\n [repoId]/\n route.ts\n route.ts\n settings/\n route.ts\n usage/\n export/\n route.ts\n route.ts\n route.ts\n slug/\n [slug]/\n route.ts\n route.ts\n publishers/\n [id]/\n organization/\n route.ts\n validate/\n route.ts\n route.ts\n referrals/\n [code]/\n route.ts\n helpers.ts\n route.ts\n stripe/\n buy-credits/\n route.ts\n webhook/\n route.ts\n upload/\n avatar/\n route.ts\n user/\n auto-topup/\n route.ts\n profile/\n route.ts\n usage/\n route.ts\n config/\n page.tsx\n docs/\n [category]/\n layout.tsx\n metadata.ts\n page.tsx\n layout.tsx\n page.tsx\n evals/\n evals-table.tsx\n page.tsx\n invites/\n [token]/\n page.tsx\n login/\n page.tsx\n onboard/\n page.tsx\n orgs/\n [slug]/\n analytics/\n page.tsx\n billing/\n purchase/\n page.tsx\n setup/\n page.tsx\n repositories/\n page.tsx\n settings/\n page.tsx\n team/\n page.tsx\n usage/\n page.tsx\n page.tsx\n new/\n page.tsx\n page.tsx\n payment-success/\n page.tsx\n pricing/\n page.tsx\n privacy-policy/\n page.tsx\n publishers/\n [id]/\n agents/\n [agentId]/\n [version]/\n page.tsx\n page.tsx\n new/\n page.tsx\n page.tsx\n referrals/\n [code]/\n metadata.ts\n page.tsx\n layout.tsx\n page.tsx\n terms-of-service/\n page.tsx\n usage/\n layout.tsx\n page.tsx\n usage-display.tsx\n analytics.knowledge.md\n layout.tsx\n page.tsx\n robots.ts\n sitemap.ts\n components/\n agent/\n json-viewer.tsx\n auto-topup/\n AutoTopupSettings.tsx\n AutoTopupSettingsForm.tsx\n AutoTopupSwitch.tsx\n BaseAutoTopupSettings.tsx\n BaseAutoTopupSettingsForm.tsx\n BaseAutoTopupSwitch.tsx\n constants.ts\n OrgAutoTopupSettings.tsx\n OrgAutoTopupSettingsForm.tsx\n OrgAutoTopupSwitch.tsx\n types.ts\n credits/\n CreditManagementSection.tsx\n CreditPurchaseSection.tsx\n docs/\n mdx/\n code-demo.tsx\n custom-link.tsx\n markdown-table.tsx\n mdx-components.tsx\n mermaid-diagram.tsx\n schema-display.tsx\n copy-heading.tsx\n doc-sidebar.tsx\n docs.knowledge.md\n toc.tsx\n login/\n login-card.tsx\n login-client-wrapper.tsx\n navbar/\n navbar.tsx\n user-dropdown.tsx\n organization/\n advanced-monitor.tsx\n billing-alerts.tsx\n billing-reports.tsx\n billing-status.tsx\n credit-monitor.tsx\n model-config-sheet.tsx\n organization-success-modal.tsx\n repository-management.tsx\n team-management.tsx\n providers/\n query-client-provider.tsx\n publisher/\n basic-info-step.tsx\n ownership-step.tsx\n profile-details-step.tsx\n step-template.tsx\n sign-in/\n sign-in-button.tsx\n sign-in-card-footer.tsx\n ui/\n landing/\n competition/\n claude-code.tsx\n cline.tsx\n cursor.tsx\n github-copilot.tsx\n index.tsx\n tabs.tsx\n feature/\n browser-comparison.tsx\n chart-illustration.tsx\n code-illustration.tsx\n highlight-text.tsx\n index.tsx\n workflow-illustration.tsx\n animated-element.tsx\n constants.ts\n cta-section.tsx\n demo-code-display.tsx\n testimonials-section.tsx\n types.ts\n terminal/\n index.tsx\n style.css\n terminal-input.tsx\n terminal-output.tsx\n avatar-upload.tsx\n background-beams.tsx\n badge.tsx\n banner.tsx\n button.tsx\n card.tsx\n collapsible.tsx\n credit-confetti.tsx\n decorative-blocks.tsx\n dialog.tsx\n dropdown-menu.tsx\n enhanced-copy-button.tsx\n footer.tsx\n hero-buttons.tsx\n hero.tsx\n input.tsx\n install-dialog.tsx\n label.tsx\n neon-gradient-button.tsx\n progress.tsx\n radio-group.tsx\n section.tsx\n select.tsx\n separator.tsx\n sheet.tsx\n sidebar.tsx\n skeleton-loading.tsx\n skeleton.tsx\n slider.tsx\n switch.tsx\n table.tsx\n tabs.tsx\n textarea.tsx\n toast.tsx\n toaster.tsx\n tooltip.tsx\n use-toast.ts\n BrowserPreview.tsx\n card-with-beams.tsx\n CookieConsentCard.tsx\n footer.tsx\n icons.tsx\n IDEDemo.tsx\n layout-wrapper.tsx\n TerminalDemo.tsx\n theme-provider.tsx\n theme-switcher.tsx\n content/\n advanced/\n claude-code-comparison.mdx\n config.mdx\n how-does-it-work.mdx\n large-projects.mdx\n troubleshooting.mdx\n what-models.mdx\n agents/\n agent-reference.mdx\n creating-new-agents.mdx\n customizing-agents.mdx\n overview.mdx\n troubleshooting-agent-customization.mdx\n case-studies/\n _cta.mdx\n benjamin-bryant.mdx\n oliver-lukesch.mdx\n help/\n faq.mdx\n getting-started.mdx\n tips/\n best-practices.mdx\n keyboard-shortcuts.mdx\n knowledge-files.mdx\n other-use-cases.mdx\n version-control.mdx\n where-codebuff-shines.mdx\n discord/\n client.ts\n rate-limiter.ts\n hooks/\n use-auto-topup.ts\n use-install-dialog.ts\n use-mobile.tsx\n use-model-config.ts\n use-org-auto-topup.ts\n use-organization-data.ts\n use-user-profile.ts\n lib/\n server/\n referral.ts\n validators/\n publisher.ts\n admin-auth.ts\n constant.ts\n currency.ts\n docs.ts\n fonts.ts\n organization-permissions.ts\n PostHogProvider.tsx\n publisher-permissions.ts\n remark-code-to-codedemo.ts\n server-init.ts\n SessionProvider.tsx\n stripe-utils.ts\n testimonials.ts\n trackConversions.ts\n utils.ts\n styles/\n globals.css\n types/\n docs.ts\n user.ts\n util/\n logger.ts\n .eslintignore\n .eslintrc.js\n .gitignore\n .prettierignore\n .prettierrc.js\n commitlint.config.js\n components.json\n contentlayer.config.ts\n jest.config.js\n jest.setup.js\n knowledge.md\n next.config.mjs\n package.json\n playwright.config.ts\n postcss.config.cjs\n README.md\n tailwind.config.ts\n tsconfig.json\n.envrc\n.gitignore\n.infisical.json\n.prettierrc\nauthentication.knowledge.md\nbun.lock\nbunfig.toml\ncodebuff.json\neslint.config.js\nknowledge.md\npackage.json\nREADME.md\ntsconfig.base.json\ntsconfig.json\nWINDOWS.md\n", - "tokenCount": 9007, - "truncationLevel": "none" - } - ] - } - ], - "parentAgentId": "D-OgWSwaG9Q" - }, - { - "type": "tool_call", - "toolCallId": "2ab4337f-6692-4efa-a912-0d2f266b2351", - "toolName": "read_subtree", - "input": { - "paths": [], - "maxTokens": 500000 - }, - "agentId": "D-OgbZG1Kis", - "parentAgentId": "D-OfY_tExks", - "includeToolCall": true - }, - { - "type": "tool_result", - "toolCallId": "2ab4337f-6692-4efa-a912-0d2f266b2351", - "toolName": "read_subtree", - "output": [ - { - "type": "json", - "value": [ - { - "path": ".", - "type": "directory", - "printedTree": ".agents/\n examples/\n diff-reviewer-1.ts\n diff-reviewer-2.ts\n diff-reviewer-3.ts\n opensource/\n base.ts\n coder.ts\n file-picker.ts\n researcher.ts\n reviewer.ts\n thinker.ts\n ask.ts\n base-experimental.ts\n base-lite.ts\n base-max.ts\n base.ts\n brainstormer.ts\n changes-reviewer.ts\n charles.ts\n claude4-gemini-thinking.ts\n constants.ts\n file-explorer.ts\n file-picker.ts\n git-committer.ts\n knowledge-keeper.ts\n planner.ts\n researcher.ts\n reviewer.ts\n superagent.ts\n thinker.ts\n.bin/\n bun\n.github/\n workflows/\n ci.yml\n evals.yml\n nightly-evals.yml\n npm-app-release-build.yml\n npm-app-release-prod.yml\n npm-app-release-staging.yml\n .gitignore\n CODEOWNERS\n knowledge.md\n.vscode/\n settings.json\nbackend/\n src/\n __tests__/\n test-data/\n dex-go/\n edit-snippet.go\n expected.go\n original.go\n agent-id-resolution.test.ts\n agent-registry.test.ts\n auto-topup.test.ts\n credit-conversion.test.ts\n fast-rewrite.test.ts\n generate-diffs-prompt.test.ts\n get-custom-file-picker-config.test.ts\n live-user-inputs.test.ts\n loop-agent-steps.test.ts\n main-prompt.integration.test.ts\n main-prompt.test.ts\n process-file-block.test.ts\n process-str-replace.test.ts\n read-docs-tool.test.ts\n request-files-prompt.test.ts\n run-agent-step-tools.test.ts\n run-programmatic-step.test.ts\n sandbox-generator.test.ts\n subagent-streaming.test.ts\n test-utils.ts\n tool-call-schema.test.ts\n usage-calculation.test.ts\n web-search-tool.test.ts\n xml-stream-parser.test.ts\n admin/\n grade-runs.ts\n relabelRuns.ts\n api/\n org.ts\n usage.ts\n context/\n app-context.ts\n find-files/\n check-new-files-necessary.ts\n custom-file-picker-config.ts\n request-files-prompt.ts\n llm-apis/\n __tests__/\n linkup-api.test.ts\n vercel-ai-sdk/\n ai-sdk.ts\n openrouter.ts\n vertex-finetuned.ts\n claude.ts\n context7-api.ts\n gemini-with-fallbacks.ts\n knowledge.md\n linkup-api.ts\n message-cost-tracker.ts\n openai-api.ts\n openrouter.ts\n relace-api.ts\n system-prompt/\n agent-instructions.md\n prompts.ts\n save-agent-request.ts\n search-system-prompt.ts\n truncate-file-tree.ts\n templates/\n agents/\n archive/\n dry-run.ts\n agent-builder.ts\n ask.ts\n base.ts\n file-explorer.ts\n file-picker.ts\n planner.ts\n researcher.ts\n reviewer.ts\n superagent.ts\n thinker.ts\n thinking-base.ts\n agent-list.ts\n agent-registry.ts\n ask-prompts.ts\n base-prompts.ts\n prompts.ts\n README.md\n strings.ts\n types.ts\n tools/\n definitions/\n tool/\n add-message.ts\n add-subgoal.ts\n browser-logs.ts\n code-search.ts\n create-plan.ts\n end-turn.ts\n find-files.ts\n read-docs.ts\n read-files.ts\n run-file-change-hooks.ts\n run-terminal-command.ts\n set-messages.ts\n set-output.ts\n spawn-agent-inline.ts\n spawn-agents-async.ts\n spawn-agents.ts\n str-replace.ts\n think-deeply.ts\n update-subgoal.ts\n web-search.ts\n write-file.ts\n list.ts\n tool-def-type.ts\n handlers/\n tool/\n add-message.ts\n add-subgoal.ts\n browser-logs.ts\n code-search.ts\n create-plan.ts\n end-turn.ts\n find-files.ts\n read-docs.ts\n read-files.ts\n run-file-change-hooks.ts\n run-terminal-command.ts\n set-messages.ts\n set-output.ts\n spawn-agent-inline.ts\n spawn-agents-async.ts\n spawn-agents.ts\n str-replace.ts\n think-deeply.ts\n update-subgoal.ts\n web-search.ts\n write-file.ts\n handler-function-type.ts\n list.ts\n constants.ts\n prompts.ts\n stream-parser.ts\n tool-executor.ts\n util/\n __tests__/\n messages.test.ts\n object.test.ts\n parse-tool-call-xml.test.ts\n simplify-tool-results.test.ts\n split-data.test.ts\n check-auth.ts\n debug.ts\n file-resolver.ts\n logger.ts\n messages.ts\n object.ts\n parse-tool-call-xml.ts\n quickjs-sandbox.ts\n simplify-tool-results.ts\n split-data.ts\n token-counter.ts\n websockets/\n auth.ts\n middleware.ts\n request-context.ts\n server.ts\n switchboard.ts\n websocket-action.ts\n async-agent-manager.ts\n check-terminal-command.ts\n fast-rewrite.ts\n generate-diffs-prompt.ts\n get-documentation-for-query.ts\n get-file-reading-updates.ts\n index.ts\n live-user-inputs.ts\n loop-main-prompt.ts\n main-prompt.ts\n process-file-block.ts\n process-str-replace.ts\n prompt-agent-stream.ts\n run-agent-step.ts\n run-programmatic-step.ts\n xml-stream-parser.ts\n .gitignore\n knowledge.md\n package.json\n README.md\n tsconfig.json\ncommon/\n src/\n __tests__/\n agent-validation.test.ts\n dynamic-agent-template-schema.test.ts\n handlesteps-parsing.test.ts\n api-keys/\n constants.ts\n crypto.ts\n constants/\n agents.ts\n analytics-events.ts\n grant-priorities.ts\n db/\n migrations/\n meta/\n _journal.json\n 0000_snapshot.json\n 0001_snapshot.json\n 0002_snapshot.json\n 0003_snapshot.json\n 0004_snapshot.json\n 0005_snapshot.json\n 0006_snapshot.json\n 0007_snapshot.json\n 0008_snapshot.json\n 0009_snapshot.json\n 0010_snapshot.json\n 0011_snapshot.json\n 0012_snapshot.json\n 0013_snapshot.json\n 0014_snapshot.json\n 0015_snapshot.json\n 0016_snapshot.json\n 0017_snapshot.json\n 0018_snapshot.json\n 0019_snapshot.json\n 0020_snapshot.json\n 0021_snapshot.json\n 0026_snapshot.json\n 0027_snapshot.json\n 0028_snapshot.json\n 0000_overjoyed_thing.sql\n 0001_fuzzy_typhoid_mary.sql\n 0002_sticky_dormammu.sql\n 0003_military_owl.sql\n 0004_neat_pet_avengers.sql\n 0005_minor_the_professor.sql\n 0006_first_quasimodo.sql\n 0007_equal_warlock.sql\n 0008_puzzling_carnage.sql\n 0009_bitter_rumiko_fujikawa.sql\n 0010_overjoyed_red_skull.sql\n 0011_familiar_ezekiel_stane.sql\n 0012_fluffy_naoko.sql\n 0013_famous_risque.sql\n 0014_wakeful_sinister_six.sql\n 0015_stormy_zuras.sql\n 0016_clear_hairball.sql\n 0017_tricky_randall_flagg.sql\n 0018_stale_human_robot.sql\n 0019_amused_nebula.sql\n 0020_young_sleeper.sql\n 0021_tiny_marauders.sql\n 0026_chilly_mockingbird.sql\n 0027_sloppy_quasar.sql\n 0028_lush_johnny_blaze.sql\n docker-compose.yml\n drizzle.config.ts\n index.ts\n schema.knowledge.md\n schema.ts\n transaction.ts\n json-config/\n __tests__/\n __snapshots__/\n stringify-schema.test.ts.snap\n constants.test.ts\n stringify-schema.test.ts\n constants.ts\n default.ts\n stringify-schema.ts\n templates/\n agent-validation.ts\n dynamic-agent-functions.ts\n testing/\n mock-modules.ts\n tools/\n params/\n tool/\n add-message.ts\n add-subgoal.ts\n browser-logs.ts\n code-search.ts\n create-plan.ts\n end-turn.ts\n find-files.ts\n read-docs.ts\n read-files.ts\n run-file-change-hooks.ts\n run-terminal-command.ts\n set-messages.ts\n set-output.ts\n spawn-agent-inline.ts\n spawn-agents-async.ts\n spawn-agents.ts\n str-replace.ts\n think-deeply.ts\n update-subgoal.ts\n web-search.ts\n write-file.ts\n compile-tool-definitions.ts\n constants.ts\n list.ts\n utils.ts\n types/\n __tests__/\n dynamic-agent-template.test.ts\n api/\n agents/\n publish.ts\n agent-template.ts\n dynamic-agent-template.ts\n grant.ts\n message.ts\n organization.ts\n print-mode.ts\n publisher.ts\n referral.ts\n session-state.ts\n usage.ts\n util/\n __tests__/\n messages.test.ts\n partial-json-delta.test.ts\n saxy.test.ts\n string.test.ts\n examples/\n diff-reviewer-1.ts\n diff-reviewer-2.ts\n diff-reviewer-3.ts\n agent-file-utils.ts\n agent-name-normalization.ts\n agent-name-resolver.ts\n agent-template-validation.ts\n array.ts\n changes.ts\n credentials.ts\n currency.ts\n dates.ts\n error.ts\n file.ts\n git.ts\n logger.ts\n lru-cache.ts\n messages.ts\n min-heap.ts\n model-utils.ts\n object.ts\n partial-json-delta.ts\n patch.ts\n promise.ts\n random.ts\n referral.ts\n saxy.ts\n string.knowledge.md\n string.ts\n stripe.ts\n sync-failure.ts\n xml.ts\n zod-schema.ts\n websockets/\n websocket-client.ts\n websocket-schema.ts\n actions.ts\n analytics.ts\n browser-actions.ts\n constants.ts\n project-file-tree.ts\n knowledge.md\n package.json\n tsconfig.json\nevals/\n git-evals/\n email-eval-results.ts\n eval-codebuff.json\n eval-manifold.json\n eval-result-codebuff-mock.json\n gen-evals.ts\n judge-git-eval.ts\n post-eval-analysis.ts\n run-eval-set.ts\n run-git-evals.ts\n run-single-eval-process.ts\n run-single-eval.ts\n setup-test-repo.ts\n types.ts\n .gitignore\n bun.lock\n constants.ts\n e2e-cat-app-script.ts\n knowledge.md\n package.json\n scaffolding.ts\n swe-bench-eval.ts\n swe-bench-ids.ts\n swe-bench.test.ts\n test-repos.json\n test-setup.ts\n tsconfig.json\nnpm-app/\n release/\n index.js\n package.json\n README.md\n release-staging/\n index.js\n package.json\n README.md\n scripts/\n build-binary.js\n generate-github-token.ts\n patch-web-tree-sitter.ts\n release.js\n twitch-plays-codebuff.sh\n src/\n __tests__/\n display.test.ts\n tool-handlers.test.ts\n agents/\n agent-utils.ts\n load-agents.ts\n checkpoints/\n checkpoint-manager.ts\n file-manager.ts\n cli-handlers/\n agent-creation-chat.ts\n agents.ts\n api-key.ts\n checkpoint.ts\n diff.ts\n easter-egg.ts\n inititalization-flow.ts\n mini-chat.ts\n publish.ts\n subagent-list.ts\n subagent.ts\n display/\n overrides.ts\n print-mode.ts\n squash-newlines.ts\n json-config/\n hooks.ts\n parser.ts\n native/\n ripgrep.ts\n terminal/\n background.ts\n run-command.ts\n utils/\n __tests__/\n __snapshots__/\n background-process-manager.test.ts.snap\n frustration-detector.test.ts.snap\n rage-detector.test.ts.snap\n xml-stream-parser.test.ts.snap\n background-process-manager.test.ts\n rage-detector.test.ts\n response-example-4-files.txt\n tool-renderers.test.ts\n xml-stream-parser.test.ts\n agent-validation.ts\n analytics.ts\n detect-shell.ts\n git.ts\n logger.ts\n rage-detector.ts\n spinner.ts\n suppress-console.ts\n system-info.ts\n terminal.ts\n tool-renderers.ts\n with-hang-detection.ts\n xml-stream-parser.ts\n workers/\n checkpoint-worker.ts\n project-context.ts\n background-process-manager.ts\n browser-runner.ts\n chat-storage.ts\n cli-definitions.ts\n cli.ts\n client.ts\n config.ts\n create-template-project.ts\n credentials.ts\n dev-process-manager.ts\n diff-manager.ts\n fingerprint.ts\n index.ts\n menu.ts\n project-files.ts\n rage-detectors.ts\n startup-process-handler.ts\n subagent-storage.ts\n tool-handlers.ts\n types.ts\n web-scraper.ts\n .gitignore\n bunfig.toml\n package.json\n tsconfig.json\npackages/\n bigquery/\n src/\n client.ts\n index.ts\n schema.ts\n knowledge.md\n package.json\n tsconfig.json\n billing/\n src/\n __tests__/\n credit-delegation.test.ts\n extract-owner-repo.test.ts\n org-billing.test.ts\n auto-topup.ts\n balance-calculator.ts\n billing.knowledge.md\n conversion.ts\n credit-delegation.ts\n grant-credits.knowledge.md\n grant-credits.ts\n index.ts\n org-billing.ts\n org-monitoring.ts\n usage-service.ts\n utils.ts\n knowledge.md\n package.json\n project.json\n tsconfig.json\n build-tools/\n executors/\n infisical-run/\n executor.ts\n schema.json\n executors.json\n package.json\n project.json\n tsconfig.json\n code-map/\n __tests__/\n test-langs/\n test.c\n test.cpp\n test.cs\n test.go\n test.java\n test.js\n test.php\n test.py\n test.rb\n test.rs\n test.ts\n languages.test.ts\n parse.test.ts\n src/\n tree-sitter-queries/\n readme.md\n tree-sitter-c_sharp-tags.scm\n tree-sitter-c-tags.scm\n tree-sitter-cpp-tags.scm\n tree-sitter-go-tags.scm\n tree-sitter-java-tags.scm\n tree-sitter-javascript-tags.scm\n tree-sitter-php-tags.scm\n tree-sitter-python-tags.scm\n tree-sitter-ruby-tags.scm\n tree-sitter-rust-tags.scm\n tree-sitter-typescript-tags.scm\n index.ts\n languages.ts\n parse.ts\n package.json\n tsconfig.json\n internal/\n src/\n loops/\n client.ts\n index.ts\n types.ts\n openrouter-ai-sdk/\n internal/\n index.ts\n schemas/\n reasoning-details.ts\n types/\n index.ts\n openrouter-chat-completions-input.ts\n openrouter-chat-settings.ts\n .gitignore\n convert-to-openrouter-chat-messages.test.ts\n convert-to-openrouter-chat-messages.ts\n convert-to-openrouter-completion-prompt.ts\n index.ts\n map-openrouter-chat-logprobs.ts\n map-openrouter-completion-logprobs.ts\n map-openrouter-finish-reason.ts\n openrouter-chat-language-model.test.ts\n openrouter-chat-language-model.ts\n openrouter-completion-language-model.test.ts\n openrouter-completion-language-model.ts\n openrouter-completion-settings.ts\n openrouter-error.ts\n openrouter-facade.ts\n openrouter-provider-options.test.ts\n openrouter-provider.ts\n openrouter-stream-usage-accounting.test.ts\n openrouter-usage-accounting.test.ts\n utils/\n __tests__/\n version-utils.test.ts\n auth.ts\n version-utils.ts\n xml-parser.ts\n env.ts\n index.ts\n knowledge.md\n package.json\n tsconfig.json\npython-app/\n src/\n codebuff/\n __init__.py\n .gitignore\n knowledge.md\n LICENSE\n pyproject.toml\n README.md\nscripts/\n changelog/\n 2025-05-18-version-10283-release-enhanced-assistant-experience-system-stability.mdx\n 2025-05-25-version-10295-enhanced-ai-models-and-user-experience-improvements.mdx\n 2025-06-01-version-10305-release-enhanced-ai-models-new-commands-and-performance-improvements.mdx\n docs.json\n ft-file-selection/\n .gitignore\n collect-tuning-data.ts\n grade-traces.ts\n print-recent-relabels.ts\n print-recent-traces.ts\n README.md\n relabel-for-offline-scoring.ts\n relabel-traces-with-context.ts\n relabel-traces.ts\n .gitignore\n analyze-edit-blocks.ts\n analyze-model-usage.ts\n apply-credit-migration.ts\n calculate-average-spend.ts\n calculate-dau.ts\n calculate-monthly-usage.ts\n calculate-mrr.ts\n calculate-weekly-usage.ts\n cleanup-worktree.sh\n convert-escaped-newlines.ts\n count-edit-file.ts\n debug-log-subset.ts\n dev.sh\n export-user-emails.ts\n generate-ci-env.js\n generate-tool-definitions.ts\n get-changelog.ts\n init-worktree.ts\n package.json\n tsconfig.json\n update-stripe-subscriptions.ts\nsdk/\n scripts/\n publish.js\n src/\n tools/\n change-file.ts\n read-files.ts\n types/\n agent-definition.ts\n tools.ts\n client.ts\n constants.ts\n index.ts\n process-stream.ts\n websocket-client.ts\n .npmignore\n CHANGELOG.md\n package.json\n PUBLISHING.md\n README.md\n tsconfig.json\nweb/\n public/\n codebuff-intro1.webm\n scripts/\n discord/\n index.ts\n register-commands.ts\n src/\n __tests__/\n e2e/\n home.spec.ts\n unit/\n home.spec.tsx\n actions/\n hello-action.ts\n app/\n [sponsee]/\n page.tsx\n admin/\n file-picker/\n page.tsx\n orgs/\n page.tsx\n traces/\n components/\n chat-message.tsx\n client-session-viewer.tsx\n empty-state.tsx\n error-boundary.tsx\n loading-skeletons.tsx\n timeline-chart.module.css\n timeline-chart.tsx\n trace-viewer.tsx\n utils/\n __tests__/\n trace-processing.test.ts\n trace-processing.ts\n page.tsx\n layout.tsx\n affiliates/\n actions.ts\n page.tsx\n agents/\n page.tsx\n api/\n admin/\n orgs/\n [orgId]/\n features/\n [feature]/\n route.ts\n export/\n route.ts\n route.ts\n relabel-for-user/\n route.ts\n traces/\n [clientRequestId]/\n messages/\n route.ts\n timeline/\n route.ts\n client/\n [clientId]/\n sessions/\n route.ts\n admin-auth.ts\n agents/\n [publisherId]/\n [agentId]/\n [version]/\n route.ts\n latest/\n route.ts\n publish/\n route.ts\n validate/\n route.ts\n route.ts\n api-keys/\n route.ts\n auth/\n [...nextauth]/\n auth-options.ts\n route.ts\n cli/\n code/\n route.ts\n logout/\n route.ts\n status/\n route.ts\n feed/\n route.ts\n git-evals/\n visibility/\n route.ts\n route.ts\n healthz/\n route.ts\n invites/\n [token]/\n route.ts\n orgs/\n [orgId]/\n alerts/\n [alertId]/\n dismiss/\n route.ts\n route.ts\n analytics/\n export/\n route.ts\n route.ts\n billing/\n setup/\n route.ts\n status/\n route.ts\n subscription/\n route.ts\n credits/\n route.ts\n invitations/\n [email]/\n resend/\n route.ts\n route.ts\n bulk/\n route.ts\n route.ts\n members/\n [userId]/\n route.ts\n route.ts\n monitoring/\n route.ts\n publishers/\n route.ts\n repos/\n [repoId]/\n route.ts\n route.ts\n settings/\n route.ts\n usage/\n export/\n route.ts\n route.ts\n route.ts\n slug/\n [slug]/\n route.ts\n route.ts\n publishers/\n [id]/\n organization/\n route.ts\n validate/\n route.ts\n route.ts\n referrals/\n [code]/\n route.ts\n helpers.ts\n route.ts\n stripe/\n buy-credits/\n route.ts\n webhook/\n route.ts\n upload/\n avatar/\n route.ts\n user/\n auto-topup/\n route.ts\n profile/\n route.ts\n usage/\n route.ts\n config/\n page.tsx\n docs/\n [category]/\n layout.tsx\n metadata.ts\n page.tsx\n layout.tsx\n page.tsx\n evals/\n evals-table.tsx\n page.tsx\n invites/\n [token]/\n page.tsx\n login/\n page.tsx\n onboard/\n page.tsx\n orgs/\n [slug]/\n analytics/\n page.tsx\n billing/\n purchase/\n page.tsx\n setup/\n page.tsx\n repositories/\n page.tsx\n settings/\n page.tsx\n team/\n page.tsx\n usage/\n page.tsx\n page.tsx\n new/\n page.tsx\n page.tsx\n payment-success/\n page.tsx\n pricing/\n page.tsx\n privacy-policy/\n page.tsx\n publishers/\n [id]/\n agents/\n [agentId]/\n [version]/\n page.tsx\n page.tsx\n new/\n page.tsx\n page.tsx\n referrals/\n [code]/\n metadata.ts\n page.tsx\n layout.tsx\n page.tsx\n terms-of-service/\n page.tsx\n usage/\n layout.tsx\n page.tsx\n usage-display.tsx\n analytics.knowledge.md\n layout.tsx\n page.tsx\n robots.ts\n sitemap.ts\n components/\n agent/\n json-viewer.tsx\n auto-topup/\n AutoTopupSettings.tsx\n AutoTopupSettingsForm.tsx\n AutoTopupSwitch.tsx\n BaseAutoTopupSettings.tsx\n BaseAutoTopupSettingsForm.tsx\n BaseAutoTopupSwitch.tsx\n constants.ts\n OrgAutoTopupSettings.tsx\n OrgAutoTopupSettingsForm.tsx\n OrgAutoTopupSwitch.tsx\n types.ts\n credits/\n CreditManagementSection.tsx\n CreditPurchaseSection.tsx\n docs/\n mdx/\n code-demo.tsx\n custom-link.tsx\n markdown-table.tsx\n mdx-components.tsx\n mermaid-diagram.tsx\n schema-display.tsx\n copy-heading.tsx\n doc-sidebar.tsx\n docs.knowledge.md\n toc.tsx\n login/\n login-card.tsx\n login-client-wrapper.tsx\n navbar/\n navbar.tsx\n user-dropdown.tsx\n organization/\n advanced-monitor.tsx\n billing-alerts.tsx\n billing-reports.tsx\n billing-status.tsx\n credit-monitor.tsx\n model-config-sheet.tsx\n organization-success-modal.tsx\n repository-management.tsx\n team-management.tsx\n providers/\n query-client-provider.tsx\n publisher/\n basic-info-step.tsx\n ownership-step.tsx\n profile-details-step.tsx\n step-template.tsx\n sign-in/\n sign-in-button.tsx\n sign-in-card-footer.tsx\n ui/\n landing/\n competition/\n claude-code.tsx\n cline.tsx\n cursor.tsx\n github-copilot.tsx\n index.tsx\n tabs.tsx\n feature/\n browser-comparison.tsx\n chart-illustration.tsx\n code-illustration.tsx\n highlight-text.tsx\n index.tsx\n workflow-illustration.tsx\n animated-element.tsx\n constants.ts\n cta-section.tsx\n demo-code-display.tsx\n testimonials-section.tsx\n types.ts\n terminal/\n index.tsx\n style.css\n terminal-input.tsx\n terminal-output.tsx\n avatar-upload.tsx\n background-beams.tsx\n badge.tsx\n banner.tsx\n button.tsx\n card.tsx\n collapsible.tsx\n credit-confetti.tsx\n decorative-blocks.tsx\n dialog.tsx\n dropdown-menu.tsx\n enhanced-copy-button.tsx\n footer.tsx\n hero-buttons.tsx\n hero.tsx\n input.tsx\n install-dialog.tsx\n label.tsx\n neon-gradient-button.tsx\n progress.tsx\n radio-group.tsx\n section.tsx\n select.tsx\n separator.tsx\n sheet.tsx\n sidebar.tsx\n skeleton-loading.tsx\n skeleton.tsx\n slider.tsx\n switch.tsx\n table.tsx\n tabs.tsx\n textarea.tsx\n toast.tsx\n toaster.tsx\n tooltip.tsx\n use-toast.ts\n BrowserPreview.tsx\n card-with-beams.tsx\n CookieConsentCard.tsx\n footer.tsx\n icons.tsx\n IDEDemo.tsx\n layout-wrapper.tsx\n TerminalDemo.tsx\n theme-provider.tsx\n theme-switcher.tsx\n content/\n advanced/\n claude-code-comparison.mdx\n config.mdx\n how-does-it-work.mdx\n large-projects.mdx\n troubleshooting.mdx\n what-models.mdx\n agents/\n agent-reference.mdx\n creating-new-agents.mdx\n customizing-agents.mdx\n overview.mdx\n troubleshooting-agent-customization.mdx\n case-studies/\n _cta.mdx\n benjamin-bryant.mdx\n oliver-lukesch.mdx\n help/\n faq.mdx\n getting-started.mdx\n tips/\n best-practices.mdx\n keyboard-shortcuts.mdx\n knowledge-files.mdx\n other-use-cases.mdx\n version-control.mdx\n where-codebuff-shines.mdx\n discord/\n client.ts\n rate-limiter.ts\n hooks/\n use-auto-topup.ts\n use-install-dialog.ts\n use-mobile.tsx\n use-model-config.ts\n use-org-auto-topup.ts\n use-organization-data.ts\n use-user-profile.ts\n lib/\n server/\n referral.ts\n validators/\n publisher.ts\n admin-auth.ts\n constant.ts\n currency.ts\n docs.ts\n fonts.ts\n organization-permissions.ts\n PostHogProvider.tsx\n publisher-permissions.ts\n remark-code-to-codedemo.ts\n server-init.ts\n SessionProvider.tsx\n stripe-utils.ts\n testimonials.ts\n trackConversions.ts\n utils.ts\n styles/\n globals.css\n types/\n docs.ts\n user.ts\n util/\n logger.ts\n .eslintignore\n .eslintrc.js\n .gitignore\n .prettierignore\n .prettierrc.js\n commitlint.config.js\n components.json\n contentlayer.config.ts\n jest.config.js\n jest.setup.js\n knowledge.md\n next.config.mjs\n package.json\n playwright.config.ts\n postcss.config.cjs\n README.md\n tailwind.config.ts\n tsconfig.json\n.envrc\n.gitignore\n.infisical.json\n.prettierrc\nauthentication.knowledge.md\nbun.lock\nbunfig.toml\ncodebuff.json\neslint.config.js\nknowledge.md\npackage.json\nREADME.md\ntsconfig.base.json\ntsconfig.json\nWINDOWS.md\n", - "tokenCount": 9007, - "truncationLevel": "none" - } - ] - } - ], - "parentAgentId": "D-OgbZG1Kis" - }, - { - "type": "tool_call", - "toolCallId": "e8dd6cc1-5286-429f-8a75-d4157a84c81f", - "toolName": "read_subtree", - "input": { - "paths": [], - "maxTokens": 500000 - }, - "agentId": "D-OgiVqb-lc", - "parentAgentId": "D-OfY8_NY2s", - "includeToolCall": true - }, - { - "type": "tool_result", - "toolCallId": "e8dd6cc1-5286-429f-8a75-d4157a84c81f", - "toolName": "read_subtree", - "output": [ - { - "type": "json", - "value": [ - { - "path": ".", - "type": "directory", - "printedTree": ".agents/\n examples/\n diff-reviewer-1.ts\n diff-reviewer-2.ts\n diff-reviewer-3.ts\n opensource/\n base.ts\n coder.ts\n file-picker.ts\n researcher.ts\n reviewer.ts\n thinker.ts\n ask.ts\n base-experimental.ts\n base-lite.ts\n base-max.ts\n base.ts\n brainstormer.ts\n changes-reviewer.ts\n charles.ts\n claude4-gemini-thinking.ts\n constants.ts\n file-explorer.ts\n file-picker.ts\n git-committer.ts\n knowledge-keeper.ts\n planner.ts\n researcher.ts\n reviewer.ts\n superagent.ts\n thinker.ts\n.bin/\n bun\n.github/\n workflows/\n ci.yml\n evals.yml\n nightly-evals.yml\n npm-app-release-build.yml\n npm-app-release-prod.yml\n npm-app-release-staging.yml\n .gitignore\n CODEOWNERS\n knowledge.md\n.vscode/\n settings.json\nbackend/\n src/\n __tests__/\n test-data/\n dex-go/\n edit-snippet.go\n expected.go\n original.go\n agent-id-resolution.test.ts\n agent-registry.test.ts\n auto-topup.test.ts\n credit-conversion.test.ts\n fast-rewrite.test.ts\n generate-diffs-prompt.test.ts\n get-custom-file-picker-config.test.ts\n live-user-inputs.test.ts\n loop-agent-steps.test.ts\n main-prompt.integration.test.ts\n main-prompt.test.ts\n process-file-block.test.ts\n process-str-replace.test.ts\n read-docs-tool.test.ts\n request-files-prompt.test.ts\n run-agent-step-tools.test.ts\n run-programmatic-step.test.ts\n sandbox-generator.test.ts\n subagent-streaming.test.ts\n test-utils.ts\n tool-call-schema.test.ts\n usage-calculation.test.ts\n web-search-tool.test.ts\n xml-stream-parser.test.ts\n admin/\n grade-runs.ts\n relabelRuns.ts\n api/\n org.ts\n usage.ts\n context/\n app-context.ts\n find-files/\n check-new-files-necessary.ts\n custom-file-picker-config.ts\n request-files-prompt.ts\n llm-apis/\n __tests__/\n linkup-api.test.ts\n vercel-ai-sdk/\n ai-sdk.ts\n openrouter.ts\n vertex-finetuned.ts\n claude.ts\n context7-api.ts\n gemini-with-fallbacks.ts\n knowledge.md\n linkup-api.ts\n message-cost-tracker.ts\n openai-api.ts\n openrouter.ts\n relace-api.ts\n system-prompt/\n agent-instructions.md\n prompts.ts\n save-agent-request.ts\n search-system-prompt.ts\n truncate-file-tree.ts\n templates/\n agents/\n archive/\n dry-run.ts\n agent-builder.ts\n ask.ts\n base.ts\n file-explorer.ts\n file-picker.ts\n planner.ts\n researcher.ts\n reviewer.ts\n superagent.ts\n thinker.ts\n thinking-base.ts\n agent-list.ts\n agent-registry.ts\n ask-prompts.ts\n base-prompts.ts\n prompts.ts\n README.md\n strings.ts\n types.ts\n tools/\n definitions/\n tool/\n add-message.ts\n add-subgoal.ts\n browser-logs.ts\n code-search.ts\n create-plan.ts\n end-turn.ts\n find-files.ts\n read-docs.ts\n read-files.ts\n run-file-change-hooks.ts\n run-terminal-command.ts\n set-messages.ts\n set-output.ts\n spawn-agent-inline.ts\n spawn-agents-async.ts\n spawn-agents.ts\n str-replace.ts\n think-deeply.ts\n update-subgoal.ts\n web-search.ts\n write-file.ts\n list.ts\n tool-def-type.ts\n handlers/\n tool/\n add-message.ts\n add-subgoal.ts\n browser-logs.ts\n code-search.ts\n create-plan.ts\n end-turn.ts\n find-files.ts\n read-docs.ts\n read-files.ts\n run-file-change-hooks.ts\n run-terminal-command.ts\n set-messages.ts\n set-output.ts\n spawn-agent-inline.ts\n spawn-agents-async.ts\n spawn-agents.ts\n str-replace.ts\n think-deeply.ts\n update-subgoal.ts\n web-search.ts\n write-file.ts\n handler-function-type.ts\n list.ts\n constants.ts\n prompts.ts\n stream-parser.ts\n tool-executor.ts\n util/\n __tests__/\n messages.test.ts\n object.test.ts\n parse-tool-call-xml.test.ts\n simplify-tool-results.test.ts\n split-data.test.ts\n check-auth.ts\n debug.ts\n file-resolver.ts\n logger.ts\n messages.ts\n object.ts\n parse-tool-call-xml.ts\n quickjs-sandbox.ts\n simplify-tool-results.ts\n split-data.ts\n token-counter.ts\n websockets/\n auth.ts\n middleware.ts\n request-context.ts\n server.ts\n switchboard.ts\n websocket-action.ts\n async-agent-manager.ts\n check-terminal-command.ts\n fast-rewrite.ts\n generate-diffs-prompt.ts\n get-documentation-for-query.ts\n get-file-reading-updates.ts\n index.ts\n live-user-inputs.ts\n loop-main-prompt.ts\n main-prompt.ts\n process-file-block.ts\n process-str-replace.ts\n prompt-agent-stream.ts\n run-agent-step.ts\n run-programmatic-step.ts\n xml-stream-parser.ts\n .gitignore\n knowledge.md\n package.json\n README.md\n tsconfig.json\ncommon/\n src/\n __tests__/\n agent-validation.test.ts\n dynamic-agent-template-schema.test.ts\n handlesteps-parsing.test.ts\n api-keys/\n constants.ts\n crypto.ts\n constants/\n agents.ts\n analytics-events.ts\n grant-priorities.ts\n db/\n migrations/\n meta/\n _journal.json\n 0000_snapshot.json\n 0001_snapshot.json\n 0002_snapshot.json\n 0003_snapshot.json\n 0004_snapshot.json\n 0005_snapshot.json\n 0006_snapshot.json\n 0007_snapshot.json\n 0008_snapshot.json\n 0009_snapshot.json\n 0010_snapshot.json\n 0011_snapshot.json\n 0012_snapshot.json\n 0013_snapshot.json\n 0014_snapshot.json\n 0015_snapshot.json\n 0016_snapshot.json\n 0017_snapshot.json\n 0018_snapshot.json\n 0019_snapshot.json\n 0020_snapshot.json\n 0021_snapshot.json\n 0026_snapshot.json\n 0027_snapshot.json\n 0028_snapshot.json\n 0000_overjoyed_thing.sql\n 0001_fuzzy_typhoid_mary.sql\n 0002_sticky_dormammu.sql\n 0003_military_owl.sql\n 0004_neat_pet_avengers.sql\n 0005_minor_the_professor.sql\n 0006_first_quasimodo.sql\n 0007_equal_warlock.sql\n 0008_puzzling_carnage.sql\n 0009_bitter_rumiko_fujikawa.sql\n 0010_overjoyed_red_skull.sql\n 0011_familiar_ezekiel_stane.sql\n 0012_fluffy_naoko.sql\n 0013_famous_risque.sql\n 0014_wakeful_sinister_six.sql\n 0015_stormy_zuras.sql\n 0016_clear_hairball.sql\n 0017_tricky_randall_flagg.sql\n 0018_stale_human_robot.sql\n 0019_amused_nebula.sql\n 0020_young_sleeper.sql\n 0021_tiny_marauders.sql\n 0026_chilly_mockingbird.sql\n 0027_sloppy_quasar.sql\n 0028_lush_johnny_blaze.sql\n docker-compose.yml\n drizzle.config.ts\n index.ts\n schema.knowledge.md\n schema.ts\n transaction.ts\n json-config/\n __tests__/\n __snapshots__/\n stringify-schema.test.ts.snap\n constants.test.ts\n stringify-schema.test.ts\n constants.ts\n default.ts\n stringify-schema.ts\n templates/\n agent-validation.ts\n dynamic-agent-functions.ts\n testing/\n mock-modules.ts\n tools/\n params/\n tool/\n add-message.ts\n add-subgoal.ts\n browser-logs.ts\n code-search.ts\n create-plan.ts\n end-turn.ts\n find-files.ts\n read-docs.ts\n read-files.ts\n run-file-change-hooks.ts\n run-terminal-command.ts\n set-messages.ts\n set-output.ts\n spawn-agent-inline.ts\n spawn-agents-async.ts\n spawn-agents.ts\n str-replace.ts\n think-deeply.ts\n update-subgoal.ts\n web-search.ts\n write-file.ts\n compile-tool-definitions.ts\n constants.ts\n list.ts\n utils.ts\n types/\n __tests__/\n dynamic-agent-template.test.ts\n api/\n agents/\n publish.ts\n agent-template.ts\n dynamic-agent-template.ts\n grant.ts\n message.ts\n organization.ts\n print-mode.ts\n publisher.ts\n referral.ts\n session-state.ts\n usage.ts\n util/\n __tests__/\n messages.test.ts\n partial-json-delta.test.ts\n saxy.test.ts\n string.test.ts\n examples/\n diff-reviewer-1.ts\n diff-reviewer-2.ts\n diff-reviewer-3.ts\n agent-file-utils.ts\n agent-name-normalization.ts\n agent-name-resolver.ts\n agent-template-validation.ts\n array.ts\n changes.ts\n credentials.ts\n currency.ts\n dates.ts\n error.ts\n file.ts\n git.ts\n logger.ts\n lru-cache.ts\n messages.ts\n min-heap.ts\n model-utils.ts\n object.ts\n partial-json-delta.ts\n patch.ts\n promise.ts\n random.ts\n referral.ts\n saxy.ts\n string.knowledge.md\n string.ts\n stripe.ts\n sync-failure.ts\n xml.ts\n zod-schema.ts\n websockets/\n websocket-client.ts\n websocket-schema.ts\n actions.ts\n analytics.ts\n browser-actions.ts\n constants.ts\n project-file-tree.ts\n knowledge.md\n package.json\n tsconfig.json\nevals/\n git-evals/\n email-eval-results.ts\n eval-codebuff.json\n eval-manifold.json\n eval-result-codebuff-mock.json\n gen-evals.ts\n judge-git-eval.ts\n post-eval-analysis.ts\n run-eval-set.ts\n run-git-evals.ts\n run-single-eval-process.ts\n run-single-eval.ts\n setup-test-repo.ts\n types.ts\n .gitignore\n bun.lock\n constants.ts\n e2e-cat-app-script.ts\n knowledge.md\n package.json\n scaffolding.ts\n swe-bench-eval.ts\n swe-bench-ids.ts\n swe-bench.test.ts\n test-repos.json\n test-setup.ts\n tsconfig.json\nnpm-app/\n release/\n index.js\n package.json\n README.md\n release-staging/\n index.js\n package.json\n README.md\n scripts/\n build-binary.js\n generate-github-token.ts\n patch-web-tree-sitter.ts\n release.js\n twitch-plays-codebuff.sh\n src/\n __tests__/\n display.test.ts\n tool-handlers.test.ts\n agents/\n agent-utils.ts\n load-agents.ts\n checkpoints/\n checkpoint-manager.ts\n file-manager.ts\n cli-handlers/\n agent-creation-chat.ts\n agents.ts\n api-key.ts\n checkpoint.ts\n diff.ts\n easter-egg.ts\n inititalization-flow.ts\n mini-chat.ts\n publish.ts\n subagent-list.ts\n subagent.ts\n display/\n overrides.ts\n print-mode.ts\n squash-newlines.ts\n json-config/\n hooks.ts\n parser.ts\n native/\n ripgrep.ts\n terminal/\n background.ts\n run-command.ts\n utils/\n __tests__/\n __snapshots__/\n background-process-manager.test.ts.snap\n frustration-detector.test.ts.snap\n rage-detector.test.ts.snap\n xml-stream-parser.test.ts.snap\n background-process-manager.test.ts\n rage-detector.test.ts\n response-example-4-files.txt\n tool-renderers.test.ts\n xml-stream-parser.test.ts\n agent-validation.ts\n analytics.ts\n detect-shell.ts\n git.ts\n logger.ts\n rage-detector.ts\n spinner.ts\n suppress-console.ts\n system-info.ts\n terminal.ts\n tool-renderers.ts\n with-hang-detection.ts\n xml-stream-parser.ts\n workers/\n checkpoint-worker.ts\n project-context.ts\n background-process-manager.ts\n browser-runner.ts\n chat-storage.ts\n cli-definitions.ts\n cli.ts\n client.ts\n config.ts\n create-template-project.ts\n credentials.ts\n dev-process-manager.ts\n diff-manager.ts\n fingerprint.ts\n index.ts\n menu.ts\n project-files.ts\n rage-detectors.ts\n startup-process-handler.ts\n subagent-storage.ts\n tool-handlers.ts\n types.ts\n web-scraper.ts\n .gitignore\n bunfig.toml\n package.json\n tsconfig.json\npackages/\n bigquery/\n src/\n client.ts\n index.ts\n schema.ts\n knowledge.md\n package.json\n tsconfig.json\n billing/\n src/\n __tests__/\n credit-delegation.test.ts\n extract-owner-repo.test.ts\n org-billing.test.ts\n auto-topup.ts\n balance-calculator.ts\n billing.knowledge.md\n conversion.ts\n credit-delegation.ts\n grant-credits.knowledge.md\n grant-credits.ts\n index.ts\n org-billing.ts\n org-monitoring.ts\n usage-service.ts\n utils.ts\n knowledge.md\n package.json\n project.json\n tsconfig.json\n build-tools/\n executors/\n infisical-run/\n executor.ts\n schema.json\n executors.json\n package.json\n project.json\n tsconfig.json\n code-map/\n __tests__/\n test-langs/\n test.c\n test.cpp\n test.cs\n test.go\n test.java\n test.js\n test.php\n test.py\n test.rb\n test.rs\n test.ts\n languages.test.ts\n parse.test.ts\n src/\n tree-sitter-queries/\n readme.md\n tree-sitter-c_sharp-tags.scm\n tree-sitter-c-tags.scm\n tree-sitter-cpp-tags.scm\n tree-sitter-go-tags.scm\n tree-sitter-java-tags.scm\n tree-sitter-javascript-tags.scm\n tree-sitter-php-tags.scm\n tree-sitter-python-tags.scm\n tree-sitter-ruby-tags.scm\n tree-sitter-rust-tags.scm\n tree-sitter-typescript-tags.scm\n index.ts\n languages.ts\n parse.ts\n package.json\n tsconfig.json\n internal/\n src/\n loops/\n client.ts\n index.ts\n types.ts\n openrouter-ai-sdk/\n internal/\n index.ts\n schemas/\n reasoning-details.ts\n types/\n index.ts\n openrouter-chat-completions-input.ts\n openrouter-chat-settings.ts\n .gitignore\n convert-to-openrouter-chat-messages.test.ts\n convert-to-openrouter-chat-messages.ts\n convert-to-openrouter-completion-prompt.ts\n index.ts\n map-openrouter-chat-logprobs.ts\n map-openrouter-completion-logprobs.ts\n map-openrouter-finish-reason.ts\n openrouter-chat-language-model.test.ts\n openrouter-chat-language-model.ts\n openrouter-completion-language-model.test.ts\n openrouter-completion-language-model.ts\n openrouter-completion-settings.ts\n openrouter-error.ts\n openrouter-facade.ts\n openrouter-provider-options.test.ts\n openrouter-provider.ts\n openrouter-stream-usage-accounting.test.ts\n openrouter-usage-accounting.test.ts\n utils/\n __tests__/\n version-utils.test.ts\n auth.ts\n version-utils.ts\n xml-parser.ts\n env.ts\n index.ts\n knowledge.md\n package.json\n tsconfig.json\npython-app/\n src/\n codebuff/\n __init__.py\n .gitignore\n knowledge.md\n LICENSE\n pyproject.toml\n README.md\nscripts/\n changelog/\n 2025-05-18-version-10283-release-enhanced-assistant-experience-system-stability.mdx\n 2025-05-25-version-10295-enhanced-ai-models-and-user-experience-improvements.mdx\n 2025-06-01-version-10305-release-enhanced-ai-models-new-commands-and-performance-improvements.mdx\n docs.json\n ft-file-selection/\n .gitignore\n collect-tuning-data.ts\n grade-traces.ts\n print-recent-relabels.ts\n print-recent-traces.ts\n README.md\n relabel-for-offline-scoring.ts\n relabel-traces-with-context.ts\n relabel-traces.ts\n .gitignore\n analyze-edit-blocks.ts\n analyze-model-usage.ts\n apply-credit-migration.ts\n calculate-average-spend.ts\n calculate-dau.ts\n calculate-monthly-usage.ts\n calculate-mrr.ts\n calculate-weekly-usage.ts\n cleanup-worktree.sh\n convert-escaped-newlines.ts\n count-edit-file.ts\n debug-log-subset.ts\n dev.sh\n export-user-emails.ts\n generate-ci-env.js\n generate-tool-definitions.ts\n get-changelog.ts\n init-worktree.ts\n package.json\n tsconfig.json\n update-stripe-subscriptions.ts\nsdk/\n scripts/\n publish.js\n src/\n tools/\n change-file.ts\n read-files.ts\n types/\n agent-definition.ts\n tools.ts\n client.ts\n constants.ts\n index.ts\n process-stream.ts\n websocket-client.ts\n .npmignore\n CHANGELOG.md\n package.json\n PUBLISHING.md\n README.md\n tsconfig.json\nweb/\n public/\n codebuff-intro1.webm\n scripts/\n discord/\n index.ts\n register-commands.ts\n src/\n __tests__/\n e2e/\n home.spec.ts\n unit/\n home.spec.tsx\n actions/\n hello-action.ts\n app/\n [sponsee]/\n page.tsx\n admin/\n file-picker/\n page.tsx\n orgs/\n page.tsx\n traces/\n components/\n chat-message.tsx\n client-session-viewer.tsx\n empty-state.tsx\n error-boundary.tsx\n loading-skeletons.tsx\n timeline-chart.module.css\n timeline-chart.tsx\n trace-viewer.tsx\n utils/\n __tests__/\n trace-processing.test.ts\n trace-processing.ts\n page.tsx\n layout.tsx\n affiliates/\n actions.ts\n page.tsx\n agents/\n page.tsx\n api/\n admin/\n orgs/\n [orgId]/\n features/\n [feature]/\n route.ts\n export/\n route.ts\n route.ts\n relabel-for-user/\n route.ts\n traces/\n [clientRequestId]/\n messages/\n route.ts\n timeline/\n route.ts\n client/\n [clientId]/\n sessions/\n route.ts\n admin-auth.ts\n agents/\n [publisherId]/\n [agentId]/\n [version]/\n route.ts\n latest/\n route.ts\n publish/\n route.ts\n validate/\n route.ts\n route.ts\n api-keys/\n route.ts\n auth/\n [...nextauth]/\n auth-options.ts\n route.ts\n cli/\n code/\n route.ts\n logout/\n route.ts\n status/\n route.ts\n feed/\n route.ts\n git-evals/\n visibility/\n route.ts\n route.ts\n healthz/\n route.ts\n invites/\n [token]/\n route.ts\n orgs/\n [orgId]/\n alerts/\n [alertId]/\n dismiss/\n route.ts\n route.ts\n analytics/\n export/\n route.ts\n route.ts\n billing/\n setup/\n route.ts\n status/\n route.ts\n subscription/\n route.ts\n credits/\n route.ts\n invitations/\n [email]/\n resend/\n route.ts\n route.ts\n bulk/\n route.ts\n route.ts\n members/\n [userId]/\n route.ts\n route.ts\n monitoring/\n route.ts\n publishers/\n route.ts\n repos/\n [repoId]/\n route.ts\n route.ts\n settings/\n route.ts\n usage/\n export/\n route.ts\n route.ts\n route.ts\n slug/\n [slug]/\n route.ts\n route.ts\n publishers/\n [id]/\n organization/\n route.ts\n validate/\n route.ts\n route.ts\n referrals/\n [code]/\n route.ts\n helpers.ts\n route.ts\n stripe/\n buy-credits/\n route.ts\n webhook/\n route.ts\n upload/\n avatar/\n route.ts\n user/\n auto-topup/\n route.ts\n profile/\n route.ts\n usage/\n route.ts\n config/\n page.tsx\n docs/\n [category]/\n layout.tsx\n metadata.ts\n page.tsx\n layout.tsx\n page.tsx\n evals/\n evals-table.tsx\n page.tsx\n invites/\n [token]/\n page.tsx\n login/\n page.tsx\n onboard/\n page.tsx\n orgs/\n [slug]/\n analytics/\n page.tsx\n billing/\n purchase/\n page.tsx\n setup/\n page.tsx\n repositories/\n page.tsx\n settings/\n page.tsx\n team/\n page.tsx\n usage/\n page.tsx\n page.tsx\n new/\n page.tsx\n page.tsx\n payment-success/\n page.tsx\n pricing/\n page.tsx\n privacy-policy/\n page.tsx\n publishers/\n [id]/\n agents/\n [agentId]/\n [version]/\n page.tsx\n page.tsx\n new/\n page.tsx\n page.tsx\n referrals/\n [code]/\n metadata.ts\n page.tsx\n layout.tsx\n page.tsx\n terms-of-service/\n page.tsx\n usage/\n layout.tsx\n page.tsx\n usage-display.tsx\n analytics.knowledge.md\n layout.tsx\n page.tsx\n robots.ts\n sitemap.ts\n components/\n agent/\n json-viewer.tsx\n auto-topup/\n AutoTopupSettings.tsx\n AutoTopupSettingsForm.tsx\n AutoTopupSwitch.tsx\n BaseAutoTopupSettings.tsx\n BaseAutoTopupSettingsForm.tsx\n BaseAutoTopupSwitch.tsx\n constants.ts\n OrgAutoTopupSettings.tsx\n OrgAutoTopupSettingsForm.tsx\n OrgAutoTopupSwitch.tsx\n types.ts\n credits/\n CreditManagementSection.tsx\n CreditPurchaseSection.tsx\n docs/\n mdx/\n code-demo.tsx\n custom-link.tsx\n markdown-table.tsx\n mdx-components.tsx\n mermaid-diagram.tsx\n schema-display.tsx\n copy-heading.tsx\n doc-sidebar.tsx\n docs.knowledge.md\n toc.tsx\n login/\n login-card.tsx\n login-client-wrapper.tsx\n navbar/\n navbar.tsx\n user-dropdown.tsx\n organization/\n advanced-monitor.tsx\n billing-alerts.tsx\n billing-reports.tsx\n billing-status.tsx\n credit-monitor.tsx\n model-config-sheet.tsx\n organization-success-modal.tsx\n repository-management.tsx\n team-management.tsx\n providers/\n query-client-provider.tsx\n publisher/\n basic-info-step.tsx\n ownership-step.tsx\n profile-details-step.tsx\n step-template.tsx\n sign-in/\n sign-in-button.tsx\n sign-in-card-footer.tsx\n ui/\n landing/\n competition/\n claude-code.tsx\n cline.tsx\n cursor.tsx\n github-copilot.tsx\n index.tsx\n tabs.tsx\n feature/\n browser-comparison.tsx\n chart-illustration.tsx\n code-illustration.tsx\n highlight-text.tsx\n index.tsx\n workflow-illustration.tsx\n animated-element.tsx\n constants.ts\n cta-section.tsx\n demo-code-display.tsx\n testimonials-section.tsx\n types.ts\n terminal/\n index.tsx\n style.css\n terminal-input.tsx\n terminal-output.tsx\n avatar-upload.tsx\n background-beams.tsx\n badge.tsx\n banner.tsx\n button.tsx\n card.tsx\n collapsible.tsx\n credit-confetti.tsx\n decorative-blocks.tsx\n dialog.tsx\n dropdown-menu.tsx\n enhanced-copy-button.tsx\n footer.tsx\n hero-buttons.tsx\n hero.tsx\n input.tsx\n install-dialog.tsx\n label.tsx\n neon-gradient-button.tsx\n progress.tsx\n radio-group.tsx\n section.tsx\n select.tsx\n separator.tsx\n sheet.tsx\n sidebar.tsx\n skeleton-loading.tsx\n skeleton.tsx\n slider.tsx\n switch.tsx\n table.tsx\n tabs.tsx\n textarea.tsx\n toast.tsx\n toaster.tsx\n tooltip.tsx\n use-toast.ts\n BrowserPreview.tsx\n card-with-beams.tsx\n CookieConsentCard.tsx\n footer.tsx\n icons.tsx\n IDEDemo.tsx\n layout-wrapper.tsx\n TerminalDemo.tsx\n theme-provider.tsx\n theme-switcher.tsx\n content/\n advanced/\n claude-code-comparison.mdx\n config.mdx\n how-does-it-work.mdx\n large-projects.mdx\n troubleshooting.mdx\n what-models.mdx\n agents/\n agent-reference.mdx\n creating-new-agents.mdx\n customizing-agents.mdx\n overview.mdx\n troubleshooting-agent-customization.mdx\n case-studies/\n _cta.mdx\n benjamin-bryant.mdx\n oliver-lukesch.mdx\n help/\n faq.mdx\n getting-started.mdx\n tips/\n best-practices.mdx\n keyboard-shortcuts.mdx\n knowledge-files.mdx\n other-use-cases.mdx\n version-control.mdx\n where-codebuff-shines.mdx\n discord/\n client.ts\n rate-limiter.ts\n hooks/\n use-auto-topup.ts\n use-install-dialog.ts\n use-mobile.tsx\n use-model-config.ts\n use-org-auto-topup.ts\n use-organization-data.ts\n use-user-profile.ts\n lib/\n server/\n referral.ts\n validators/\n publisher.ts\n admin-auth.ts\n constant.ts\n currency.ts\n docs.ts\n fonts.ts\n organization-permissions.ts\n PostHogProvider.tsx\n publisher-permissions.ts\n remark-code-to-codedemo.ts\n server-init.ts\n SessionProvider.tsx\n stripe-utils.ts\n testimonials.ts\n trackConversions.ts\n utils.ts\n styles/\n globals.css\n types/\n docs.ts\n user.ts\n util/\n logger.ts\n .eslintignore\n .eslintrc.js\n .gitignore\n .prettierignore\n .prettierrc.js\n commitlint.config.js\n components.json\n contentlayer.config.ts\n jest.config.js\n jest.setup.js\n knowledge.md\n next.config.mjs\n package.json\n playwright.config.ts\n postcss.config.cjs\n README.md\n tailwind.config.ts\n tsconfig.json\n.envrc\n.gitignore\n.infisical.json\n.prettierrc\nauthentication.knowledge.md\nbun.lock\nbunfig.toml\ncodebuff.json\neslint.config.js\nknowledge.md\npackage.json\nREADME.md\ntsconfig.base.json\ntsconfig.json\nWINDOWS.md\n", - "tokenCount": 9007, - "truncationLevel": "none" - } - ] - } - ], - "parentAgentId": "D-OgiVqb-lc" - }, - { - "type": "tool_call", - "toolCallId": "557a0acd-be3c-43ac-958e-f02af0941e66", - "toolName": "read_subtree", - "input": { - "paths": [], - "maxTokens": 500000 - }, - "agentId": "D-Ogo19lSyI", - "parentAgentId": "D-OfaYSx8-Q", - "includeToolCall": true - }, - { - "type": "tool_result", - "toolCallId": "557a0acd-be3c-43ac-958e-f02af0941e66", - "toolName": "read_subtree", - "output": [ - { - "type": "json", - "value": [ - { - "path": ".", - "type": "directory", - "printedTree": ".agents/\n examples/\n diff-reviewer-1.ts\n diff-reviewer-2.ts\n diff-reviewer-3.ts\n opensource/\n base.ts\n coder.ts\n file-picker.ts\n researcher.ts\n reviewer.ts\n thinker.ts\n ask.ts\n base-experimental.ts\n base-lite.ts\n base-max.ts\n base.ts\n brainstormer.ts\n changes-reviewer.ts\n charles.ts\n claude4-gemini-thinking.ts\n constants.ts\n file-explorer.ts\n file-picker.ts\n git-committer.ts\n knowledge-keeper.ts\n planner.ts\n researcher.ts\n reviewer.ts\n superagent.ts\n thinker.ts\n.bin/\n bun\n.github/\n workflows/\n ci.yml\n evals.yml\n nightly-evals.yml\n npm-app-release-build.yml\n npm-app-release-prod.yml\n npm-app-release-staging.yml\n .gitignore\n CODEOWNERS\n knowledge.md\n.vscode/\n settings.json\nbackend/\n src/\n __tests__/\n test-data/\n dex-go/\n edit-snippet.go\n expected.go\n original.go\n agent-id-resolution.test.ts\n agent-registry.test.ts\n auto-topup.test.ts\n credit-conversion.test.ts\n fast-rewrite.test.ts\n generate-diffs-prompt.test.ts\n get-custom-file-picker-config.test.ts\n live-user-inputs.test.ts\n loop-agent-steps.test.ts\n main-prompt.integration.test.ts\n main-prompt.test.ts\n process-file-block.test.ts\n process-str-replace.test.ts\n read-docs-tool.test.ts\n request-files-prompt.test.ts\n run-agent-step-tools.test.ts\n run-programmatic-step.test.ts\n sandbox-generator.test.ts\n subagent-streaming.test.ts\n test-utils.ts\n tool-call-schema.test.ts\n usage-calculation.test.ts\n web-search-tool.test.ts\n xml-stream-parser.test.ts\n admin/\n grade-runs.ts\n relabelRuns.ts\n api/\n org.ts\n usage.ts\n context/\n app-context.ts\n find-files/\n check-new-files-necessary.ts\n custom-file-picker-config.ts\n request-files-prompt.ts\n llm-apis/\n __tests__/\n linkup-api.test.ts\n vercel-ai-sdk/\n ai-sdk.ts\n openrouter.ts\n vertex-finetuned.ts\n claude.ts\n context7-api.ts\n gemini-with-fallbacks.ts\n knowledge.md\n linkup-api.ts\n message-cost-tracker.ts\n openai-api.ts\n openrouter.ts\n relace-api.ts\n system-prompt/\n agent-instructions.md\n prompts.ts\n save-agent-request.ts\n search-system-prompt.ts\n truncate-file-tree.ts\n templates/\n agents/\n archive/\n dry-run.ts\n agent-builder.ts\n ask.ts\n base.ts\n file-explorer.ts\n file-picker.ts\n planner.ts\n researcher.ts\n reviewer.ts\n superagent.ts\n thinker.ts\n thinking-base.ts\n agent-list.ts\n agent-registry.ts\n ask-prompts.ts\n base-prompts.ts\n prompts.ts\n README.md\n strings.ts\n types.ts\n tools/\n definitions/\n tool/\n add-message.ts\n add-subgoal.ts\n browser-logs.ts\n code-search.ts\n create-plan.ts\n end-turn.ts\n find-files.ts\n read-docs.ts\n read-files.ts\n run-file-change-hooks.ts\n run-terminal-command.ts\n set-messages.ts\n set-output.ts\n spawn-agent-inline.ts\n spawn-agents-async.ts\n spawn-agents.ts\n str-replace.ts\n think-deeply.ts\n update-subgoal.ts\n web-search.ts\n write-file.ts\n list.ts\n tool-def-type.ts\n handlers/\n tool/\n add-message.ts\n add-subgoal.ts\n browser-logs.ts\n code-search.ts\n create-plan.ts\n end-turn.ts\n find-files.ts\n read-docs.ts\n read-files.ts\n run-file-change-hooks.ts\n run-terminal-command.ts\n set-messages.ts\n set-output.ts\n spawn-agent-inline.ts\n spawn-agents-async.ts\n spawn-agents.ts\n str-replace.ts\n think-deeply.ts\n update-subgoal.ts\n web-search.ts\n write-file.ts\n handler-function-type.ts\n list.ts\n constants.ts\n prompts.ts\n stream-parser.ts\n tool-executor.ts\n util/\n __tests__/\n messages.test.ts\n object.test.ts\n parse-tool-call-xml.test.ts\n simplify-tool-results.test.ts\n split-data.test.ts\n check-auth.ts\n debug.ts\n file-resolver.ts\n logger.ts\n messages.ts\n object.ts\n parse-tool-call-xml.ts\n quickjs-sandbox.ts\n simplify-tool-results.ts\n split-data.ts\n token-counter.ts\n websockets/\n auth.ts\n middleware.ts\n request-context.ts\n server.ts\n switchboard.ts\n websocket-action.ts\n async-agent-manager.ts\n check-terminal-command.ts\n fast-rewrite.ts\n generate-diffs-prompt.ts\n get-documentation-for-query.ts\n get-file-reading-updates.ts\n index.ts\n live-user-inputs.ts\n loop-main-prompt.ts\n main-prompt.ts\n process-file-block.ts\n process-str-replace.ts\n prompt-agent-stream.ts\n run-agent-step.ts\n run-programmatic-step.ts\n xml-stream-parser.ts\n .gitignore\n knowledge.md\n package.json\n README.md\n tsconfig.json\ncommon/\n src/\n __tests__/\n agent-validation.test.ts\n dynamic-agent-template-schema.test.ts\n handlesteps-parsing.test.ts\n api-keys/\n constants.ts\n crypto.ts\n constants/\n agents.ts\n analytics-events.ts\n grant-priorities.ts\n db/\n migrations/\n meta/\n _journal.json\n 0000_snapshot.json\n 0001_snapshot.json\n 0002_snapshot.json\n 0003_snapshot.json\n 0004_snapshot.json\n 0005_snapshot.json\n 0006_snapshot.json\n 0007_snapshot.json\n 0008_snapshot.json\n 0009_snapshot.json\n 0010_snapshot.json\n 0011_snapshot.json\n 0012_snapshot.json\n 0013_snapshot.json\n 0014_snapshot.json\n 0015_snapshot.json\n 0016_snapshot.json\n 0017_snapshot.json\n 0018_snapshot.json\n 0019_snapshot.json\n 0020_snapshot.json\n 0021_snapshot.json\n 0026_snapshot.json\n 0027_snapshot.json\n 0028_snapshot.json\n 0000_overjoyed_thing.sql\n 0001_fuzzy_typhoid_mary.sql\n 0002_sticky_dormammu.sql\n 0003_military_owl.sql\n 0004_neat_pet_avengers.sql\n 0005_minor_the_professor.sql\n 0006_first_quasimodo.sql\n 0007_equal_warlock.sql\n 0008_puzzling_carnage.sql\n 0009_bitter_rumiko_fujikawa.sql\n 0010_overjoyed_red_skull.sql\n 0011_familiar_ezekiel_stane.sql\n 0012_fluffy_naoko.sql\n 0013_famous_risque.sql\n 0014_wakeful_sinister_six.sql\n 0015_stormy_zuras.sql\n 0016_clear_hairball.sql\n 0017_tricky_randall_flagg.sql\n 0018_stale_human_robot.sql\n 0019_amused_nebula.sql\n 0020_young_sleeper.sql\n 0021_tiny_marauders.sql\n 0026_chilly_mockingbird.sql\n 0027_sloppy_quasar.sql\n 0028_lush_johnny_blaze.sql\n docker-compose.yml\n drizzle.config.ts\n index.ts\n schema.knowledge.md\n schema.ts\n transaction.ts\n json-config/\n __tests__/\n __snapshots__/\n stringify-schema.test.ts.snap\n constants.test.ts\n stringify-schema.test.ts\n constants.ts\n default.ts\n stringify-schema.ts\n templates/\n agent-validation.ts\n dynamic-agent-functions.ts\n testing/\n mock-modules.ts\n tools/\n params/\n tool/\n add-message.ts\n add-subgoal.ts\n browser-logs.ts\n code-search.ts\n create-plan.ts\n end-turn.ts\n find-files.ts\n read-docs.ts\n read-files.ts\n run-file-change-hooks.ts\n run-terminal-command.ts\n set-messages.ts\n set-output.ts\n spawn-agent-inline.ts\n spawn-agents-async.ts\n spawn-agents.ts\n str-replace.ts\n think-deeply.ts\n update-subgoal.ts\n web-search.ts\n write-file.ts\n compile-tool-definitions.ts\n constants.ts\n list.ts\n utils.ts\n types/\n __tests__/\n dynamic-agent-template.test.ts\n api/\n agents/\n publish.ts\n agent-template.ts\n dynamic-agent-template.ts\n grant.ts\n message.ts\n organization.ts\n print-mode.ts\n publisher.ts\n referral.ts\n session-state.ts\n usage.ts\n util/\n __tests__/\n messages.test.ts\n partial-json-delta.test.ts\n saxy.test.ts\n string.test.ts\n examples/\n diff-reviewer-1.ts\n diff-reviewer-2.ts\n diff-reviewer-3.ts\n agent-file-utils.ts\n agent-name-normalization.ts\n agent-name-resolver.ts\n agent-template-validation.ts\n array.ts\n changes.ts\n credentials.ts\n currency.ts\n dates.ts\n error.ts\n file.ts\n git.ts\n logger.ts\n lru-cache.ts\n messages.ts\n min-heap.ts\n model-utils.ts\n object.ts\n partial-json-delta.ts\n patch.ts\n promise.ts\n random.ts\n referral.ts\n saxy.ts\n string.knowledge.md\n string.ts\n stripe.ts\n sync-failure.ts\n xml.ts\n zod-schema.ts\n websockets/\n websocket-client.ts\n websocket-schema.ts\n actions.ts\n analytics.ts\n browser-actions.ts\n constants.ts\n project-file-tree.ts\n knowledge.md\n package.json\n tsconfig.json\nevals/\n git-evals/\n email-eval-results.ts\n eval-codebuff.json\n eval-manifold.json\n eval-result-codebuff-mock.json\n gen-evals.ts\n judge-git-eval.ts\n post-eval-analysis.ts\n run-eval-set.ts\n run-git-evals.ts\n run-single-eval-process.ts\n run-single-eval.ts\n setup-test-repo.ts\n types.ts\n .gitignore\n bun.lock\n constants.ts\n e2e-cat-app-script.ts\n knowledge.md\n package.json\n scaffolding.ts\n swe-bench-eval.ts\n swe-bench-ids.ts\n swe-bench.test.ts\n test-repos.json\n test-setup.ts\n tsconfig.json\nnpm-app/\n release/\n index.js\n package.json\n README.md\n release-staging/\n index.js\n package.json\n README.md\n scripts/\n build-binary.js\n generate-github-token.ts\n patch-web-tree-sitter.ts\n release.js\n twitch-plays-codebuff.sh\n src/\n __tests__/\n display.test.ts\n tool-handlers.test.ts\n agents/\n agent-utils.ts\n load-agents.ts\n checkpoints/\n checkpoint-manager.ts\n file-manager.ts\n cli-handlers/\n agent-creation-chat.ts\n agents.ts\n api-key.ts\n checkpoint.ts\n diff.ts\n easter-egg.ts\n inititalization-flow.ts\n mini-chat.ts\n publish.ts\n subagent-list.ts\n subagent.ts\n display/\n overrides.ts\n print-mode.ts\n squash-newlines.ts\n json-config/\n hooks.ts\n parser.ts\n native/\n ripgrep.ts\n terminal/\n background.ts\n run-command.ts\n utils/\n __tests__/\n __snapshots__/\n background-process-manager.test.ts.snap\n frustration-detector.test.ts.snap\n rage-detector.test.ts.snap\n xml-stream-parser.test.ts.snap\n background-process-manager.test.ts\n rage-detector.test.ts\n response-example-4-files.txt\n tool-renderers.test.ts\n xml-stream-parser.test.ts\n agent-validation.ts\n analytics.ts\n detect-shell.ts\n git.ts\n logger.ts\n rage-detector.ts\n spinner.ts\n suppress-console.ts\n system-info.ts\n terminal.ts\n tool-renderers.ts\n with-hang-detection.ts\n xml-stream-parser.ts\n workers/\n checkpoint-worker.ts\n project-context.ts\n background-process-manager.ts\n browser-runner.ts\n chat-storage.ts\n cli-definitions.ts\n cli.ts\n client.ts\n config.ts\n create-template-project.ts\n credentials.ts\n dev-process-manager.ts\n diff-manager.ts\n fingerprint.ts\n index.ts\n menu.ts\n project-files.ts\n rage-detectors.ts\n startup-process-handler.ts\n subagent-storage.ts\n tool-handlers.ts\n types.ts\n web-scraper.ts\n .gitignore\n bunfig.toml\n package.json\n tsconfig.json\npackages/\n bigquery/\n src/\n client.ts\n index.ts\n schema.ts\n knowledge.md\n package.json\n tsconfig.json\n billing/\n src/\n __tests__/\n credit-delegation.test.ts\n extract-owner-repo.test.ts\n org-billing.test.ts\n auto-topup.ts\n balance-calculator.ts\n billing.knowledge.md\n conversion.ts\n credit-delegation.ts\n grant-credits.knowledge.md\n grant-credits.ts\n index.ts\n org-billing.ts\n org-monitoring.ts\n usage-service.ts\n utils.ts\n knowledge.md\n package.json\n project.json\n tsconfig.json\n build-tools/\n executors/\n infisical-run/\n executor.ts\n schema.json\n executors.json\n package.json\n project.json\n tsconfig.json\n code-map/\n __tests__/\n test-langs/\n test.c\n test.cpp\n test.cs\n test.go\n test.java\n test.js\n test.php\n test.py\n test.rb\n test.rs\n test.ts\n languages.test.ts\n parse.test.ts\n src/\n tree-sitter-queries/\n readme.md\n tree-sitter-c_sharp-tags.scm\n tree-sitter-c-tags.scm\n tree-sitter-cpp-tags.scm\n tree-sitter-go-tags.scm\n tree-sitter-java-tags.scm\n tree-sitter-javascript-tags.scm\n tree-sitter-php-tags.scm\n tree-sitter-python-tags.scm\n tree-sitter-ruby-tags.scm\n tree-sitter-rust-tags.scm\n tree-sitter-typescript-tags.scm\n index.ts\n languages.ts\n parse.ts\n package.json\n tsconfig.json\n internal/\n src/\n loops/\n client.ts\n index.ts\n types.ts\n openrouter-ai-sdk/\n internal/\n index.ts\n schemas/\n reasoning-details.ts\n types/\n index.ts\n openrouter-chat-completions-input.ts\n openrouter-chat-settings.ts\n .gitignore\n convert-to-openrouter-chat-messages.test.ts\n convert-to-openrouter-chat-messages.ts\n convert-to-openrouter-completion-prompt.ts\n index.ts\n map-openrouter-chat-logprobs.ts\n map-openrouter-completion-logprobs.ts\n map-openrouter-finish-reason.ts\n openrouter-chat-language-model.test.ts\n openrouter-chat-language-model.ts\n openrouter-completion-language-model.test.ts\n openrouter-completion-language-model.ts\n openrouter-completion-settings.ts\n openrouter-error.ts\n openrouter-facade.ts\n openrouter-provider-options.test.ts\n openrouter-provider.ts\n openrouter-stream-usage-accounting.test.ts\n openrouter-usage-accounting.test.ts\n utils/\n __tests__/\n version-utils.test.ts\n auth.ts\n version-utils.ts\n xml-parser.ts\n env.ts\n index.ts\n knowledge.md\n package.json\n tsconfig.json\npython-app/\n src/\n codebuff/\n __init__.py\n .gitignore\n knowledge.md\n LICENSE\n pyproject.toml\n README.md\nscripts/\n changelog/\n 2025-05-18-version-10283-release-enhanced-assistant-experience-system-stability.mdx\n 2025-05-25-version-10295-enhanced-ai-models-and-user-experience-improvements.mdx\n 2025-06-01-version-10305-release-enhanced-ai-models-new-commands-and-performance-improvements.mdx\n docs.json\n ft-file-selection/\n .gitignore\n collect-tuning-data.ts\n grade-traces.ts\n print-recent-relabels.ts\n print-recent-traces.ts\n README.md\n relabel-for-offline-scoring.ts\n relabel-traces-with-context.ts\n relabel-traces.ts\n .gitignore\n analyze-edit-blocks.ts\n analyze-model-usage.ts\n apply-credit-migration.ts\n calculate-average-spend.ts\n calculate-dau.ts\n calculate-monthly-usage.ts\n calculate-mrr.ts\n calculate-weekly-usage.ts\n cleanup-worktree.sh\n convert-escaped-newlines.ts\n count-edit-file.ts\n debug-log-subset.ts\n dev.sh\n export-user-emails.ts\n generate-ci-env.js\n generate-tool-definitions.ts\n get-changelog.ts\n init-worktree.ts\n package.json\n tsconfig.json\n update-stripe-subscriptions.ts\nsdk/\n scripts/\n publish.js\n src/\n tools/\n change-file.ts\n read-files.ts\n types/\n agent-definition.ts\n tools.ts\n client.ts\n constants.ts\n index.ts\n process-stream.ts\n websocket-client.ts\n .npmignore\n CHANGELOG.md\n package.json\n PUBLISHING.md\n README.md\n tsconfig.json\nweb/\n public/\n codebuff-intro1.webm\n scripts/\n discord/\n index.ts\n register-commands.ts\n src/\n __tests__/\n e2e/\n home.spec.ts\n unit/\n home.spec.tsx\n actions/\n hello-action.ts\n app/\n [sponsee]/\n page.tsx\n admin/\n file-picker/\n page.tsx\n orgs/\n page.tsx\n traces/\n components/\n chat-message.tsx\n client-session-viewer.tsx\n empty-state.tsx\n error-boundary.tsx\n loading-skeletons.tsx\n timeline-chart.module.css\n timeline-chart.tsx\n trace-viewer.tsx\n utils/\n __tests__/\n trace-processing.test.ts\n trace-processing.ts\n page.tsx\n layout.tsx\n affiliates/\n actions.ts\n page.tsx\n agents/\n page.tsx\n api/\n admin/\n orgs/\n [orgId]/\n features/\n [feature]/\n route.ts\n export/\n route.ts\n route.ts\n relabel-for-user/\n route.ts\n traces/\n [clientRequestId]/\n messages/\n route.ts\n timeline/\n route.ts\n client/\n [clientId]/\n sessions/\n route.ts\n admin-auth.ts\n agents/\n [publisherId]/\n [agentId]/\n [version]/\n route.ts\n latest/\n route.ts\n publish/\n route.ts\n validate/\n route.ts\n route.ts\n api-keys/\n route.ts\n auth/\n [...nextauth]/\n auth-options.ts\n route.ts\n cli/\n code/\n route.ts\n logout/\n route.ts\n status/\n route.ts\n feed/\n route.ts\n git-evals/\n visibility/\n route.ts\n route.ts\n healthz/\n route.ts\n invites/\n [token]/\n route.ts\n orgs/\n [orgId]/\n alerts/\n [alertId]/\n dismiss/\n route.ts\n route.ts\n analytics/\n export/\n route.ts\n route.ts\n billing/\n setup/\n route.ts\n status/\n route.ts\n subscription/\n route.ts\n credits/\n route.ts\n invitations/\n [email]/\n resend/\n route.ts\n route.ts\n bulk/\n route.ts\n route.ts\n members/\n [userId]/\n route.ts\n route.ts\n monitoring/\n route.ts\n publishers/\n route.ts\n repos/\n [repoId]/\n route.ts\n route.ts\n settings/\n route.ts\n usage/\n export/\n route.ts\n route.ts\n route.ts\n slug/\n [slug]/\n route.ts\n route.ts\n publishers/\n [id]/\n organization/\n route.ts\n validate/\n route.ts\n route.ts\n referrals/\n [code]/\n route.ts\n helpers.ts\n route.ts\n stripe/\n buy-credits/\n route.ts\n webhook/\n route.ts\n upload/\n avatar/\n route.ts\n user/\n auto-topup/\n route.ts\n profile/\n route.ts\n usage/\n route.ts\n config/\n page.tsx\n docs/\n [category]/\n layout.tsx\n metadata.ts\n page.tsx\n layout.tsx\n page.tsx\n evals/\n evals-table.tsx\n page.tsx\n invites/\n [token]/\n page.tsx\n login/\n page.tsx\n onboard/\n page.tsx\n orgs/\n [slug]/\n analytics/\n page.tsx\n billing/\n purchase/\n page.tsx\n setup/\n page.tsx\n repositories/\n page.tsx\n settings/\n page.tsx\n team/\n page.tsx\n usage/\n page.tsx\n page.tsx\n new/\n page.tsx\n page.tsx\n payment-success/\n page.tsx\n pricing/\n page.tsx\n privacy-policy/\n page.tsx\n publishers/\n [id]/\n agents/\n [agentId]/\n [version]/\n page.tsx\n page.tsx\n new/\n page.tsx\n page.tsx\n referrals/\n [code]/\n metadata.ts\n page.tsx\n layout.tsx\n page.tsx\n terms-of-service/\n page.tsx\n usage/\n layout.tsx\n page.tsx\n usage-display.tsx\n analytics.knowledge.md\n layout.tsx\n page.tsx\n robots.ts\n sitemap.ts\n components/\n agent/\n json-viewer.tsx\n auto-topup/\n AutoTopupSettings.tsx\n AutoTopupSettingsForm.tsx\n AutoTopupSwitch.tsx\n BaseAutoTopupSettings.tsx\n BaseAutoTopupSettingsForm.tsx\n BaseAutoTopupSwitch.tsx\n constants.ts\n OrgAutoTopupSettings.tsx\n OrgAutoTopupSettingsForm.tsx\n OrgAutoTopupSwitch.tsx\n types.ts\n credits/\n CreditManagementSection.tsx\n CreditPurchaseSection.tsx\n docs/\n mdx/\n code-demo.tsx\n custom-link.tsx\n markdown-table.tsx\n mdx-components.tsx\n mermaid-diagram.tsx\n schema-display.tsx\n copy-heading.tsx\n doc-sidebar.tsx\n docs.knowledge.md\n toc.tsx\n login/\n login-card.tsx\n login-client-wrapper.tsx\n navbar/\n navbar.tsx\n user-dropdown.tsx\n organization/\n advanced-monitor.tsx\n billing-alerts.tsx\n billing-reports.tsx\n billing-status.tsx\n credit-monitor.tsx\n model-config-sheet.tsx\n organization-success-modal.tsx\n repository-management.tsx\n team-management.tsx\n providers/\n query-client-provider.tsx\n publisher/\n basic-info-step.tsx\n ownership-step.tsx\n profile-details-step.tsx\n step-template.tsx\n sign-in/\n sign-in-button.tsx\n sign-in-card-footer.tsx\n ui/\n landing/\n competition/\n claude-code.tsx\n cline.tsx\n cursor.tsx\n github-copilot.tsx\n index.tsx\n tabs.tsx\n feature/\n browser-comparison.tsx\n chart-illustration.tsx\n code-illustration.tsx\n highlight-text.tsx\n index.tsx\n workflow-illustration.tsx\n animated-element.tsx\n constants.ts\n cta-section.tsx\n demo-code-display.tsx\n testimonials-section.tsx\n types.ts\n terminal/\n index.tsx\n style.css\n terminal-input.tsx\n terminal-output.tsx\n avatar-upload.tsx\n background-beams.tsx\n badge.tsx\n banner.tsx\n button.tsx\n card.tsx\n collapsible.tsx\n credit-confetti.tsx\n decorative-blocks.tsx\n dialog.tsx\n dropdown-menu.tsx\n enhanced-copy-button.tsx\n footer.tsx\n hero-buttons.tsx\n hero.tsx\n input.tsx\n install-dialog.tsx\n label.tsx\n neon-gradient-button.tsx\n progress.tsx\n radio-group.tsx\n section.tsx\n select.tsx\n separator.tsx\n sheet.tsx\n sidebar.tsx\n skeleton-loading.tsx\n skeleton.tsx\n slider.tsx\n switch.tsx\n table.tsx\n tabs.tsx\n textarea.tsx\n toast.tsx\n toaster.tsx\n tooltip.tsx\n use-toast.ts\n BrowserPreview.tsx\n card-with-beams.tsx\n CookieConsentCard.tsx\n footer.tsx\n icons.tsx\n IDEDemo.tsx\n layout-wrapper.tsx\n TerminalDemo.tsx\n theme-provider.tsx\n theme-switcher.tsx\n content/\n advanced/\n claude-code-comparison.mdx\n config.mdx\n how-does-it-work.mdx\n large-projects.mdx\n troubleshooting.mdx\n what-models.mdx\n agents/\n agent-reference.mdx\n creating-new-agents.mdx\n customizing-agents.mdx\n overview.mdx\n troubleshooting-agent-customization.mdx\n case-studies/\n _cta.mdx\n benjamin-bryant.mdx\n oliver-lukesch.mdx\n help/\n faq.mdx\n getting-started.mdx\n tips/\n best-practices.mdx\n keyboard-shortcuts.mdx\n knowledge-files.mdx\n other-use-cases.mdx\n version-control.mdx\n where-codebuff-shines.mdx\n discord/\n client.ts\n rate-limiter.ts\n hooks/\n use-auto-topup.ts\n use-install-dialog.ts\n use-mobile.tsx\n use-model-config.ts\n use-org-auto-topup.ts\n use-organization-data.ts\n use-user-profile.ts\n lib/\n server/\n referral.ts\n validators/\n publisher.ts\n admin-auth.ts\n constant.ts\n currency.ts\n docs.ts\n fonts.ts\n organization-permissions.ts\n PostHogProvider.tsx\n publisher-permissions.ts\n remark-code-to-codedemo.ts\n server-init.ts\n SessionProvider.tsx\n stripe-utils.ts\n testimonials.ts\n trackConversions.ts\n utils.ts\n styles/\n globals.css\n types/\n docs.ts\n user.ts\n util/\n logger.ts\n .eslintignore\n .eslintrc.js\n .gitignore\n .prettierignore\n .prettierrc.js\n commitlint.config.js\n components.json\n contentlayer.config.ts\n jest.config.js\n jest.setup.js\n knowledge.md\n next.config.mjs\n package.json\n playwright.config.ts\n postcss.config.cjs\n README.md\n tailwind.config.ts\n tsconfig.json\n.envrc\n.gitignore\n.infisical.json\n.prettierrc\nauthentication.knowledge.md\nbun.lock\nbunfig.toml\ncodebuff.json\neslint.config.js\nknowledge.md\npackage.json\nREADME.md\ntsconfig.base.json\ntsconfig.json\nWINDOWS.md\n", - "tokenCount": 9007, - "truncationLevel": "none" - } - ] - } - ], - "parentAgentId": "D-Ogo19lSyI" - }, - { - "type": "tool_result", - "toolCallId": "877e5ab3-210d-4cf9-84e6-267e388d68ad", - "toolName": "code_search", - "output": [ - { - "type": "json", - "value": { - "stdout": ".agents/examples/diff-reviewer-1.ts:\n4: id: 'diff-reviewer-1',\n\n.agents/examples/diff-reviewer-2.ts:\n7: id: 'diff-reviewer-2',\n\n.agents/examples/diff-reviewer-3.ts:\n7: id: 'diff-reviewer-3',\n\n./backend/src/templates/agents/agent-builder.ts:\n67: (file) => file.endsWith('.ts') && file.startsWith('diff-reviewer'),\n\n./common/src/util/examples/diff-reviewer-1.ts:\n4: id: 'diff-reviewer-1',\n\n./common/src/util/examples/diff-reviewer-2.ts:\n7: id: 'diff-reviewer-2',\n\n./common/src/util/examples/diff-reviewer-3.ts:\n7: id: 'diff-reviewer-3',", - "message": "Exit code: 0" - } - } - ], - "parentAgentId": "D-Ofa741I0M" - }, - { - "type": "tool_call", - "toolCallId": "88b32613-fdb8-4da3-9ec1-a56e04d23a2b", - "toolName": "code_search", - "input": { - "pattern": "your-custom-agent" - }, - "agentId": "D-Ofa741I0M", - "parentAgentId": "main-agent", - "includeToolCall": true - }, - { - "type": "tool_result", - "toolCallId": "88b32613-fdb8-4da3-9ec1-a56e04d23a2b", - "toolName": "code_search", - "output": [ - { - "type": "json", - "value": { - "stdout": "No results", - "message": "Exit code: 1" - } - } - ], - "parentAgentId": "D-Ofa741I0M" - }, - { - "type": "tool_call", - "toolCallId": "31e44afe-a9e2-4fc6-957b-297300888473", - "toolName": "code_search", - "input": { - "pattern": "spawnable agents|spawnAgents" - }, - "agentId": "D-Ofa741I0M", - "parentAgentId": "main-agent", - "includeToolCall": true - }, - { - "type": "tool_result", - "toolCallId": "31e44afe-a9e2-4fc6-957b-297300888473", - "toolName": "code_search", - "output": [ - { - "type": "json", - "value": { - "stdout": "./npm-app/src/client.ts:\n1354: // Mark any spawnable agents as inactive when the main response completes\n\n./npm-app/src/subagent-storage.ts:\n214: * Get recent spawnable agents (sorted by last activity)\n223: * Get spawnable agents in chronological order (oldest first)\n\n./backend/knowledge.md:\n7:Users can now reference spawnable agents without org prefixes in their agent templates. For example:\n77: spawnableAgents?: { // Modify spawnable agents list\n\n./npm-app/src/agents/load-agents.ts:\n86: `${green('Configured spawnable agents:')} ${spawnableAgents\n\n./npm-app/src/cli.ts:\n949: // Give control back to user when no spawnable agents exist\n\n./backend/src/tools/definitions/tool/spawn-agents-async.ts:\n6:export const spawnAgentsAsyncTool = {\n\n./backend/src/tools/definitions/tool/spawn-agents.ts:\n6:export const spawnAgentsTool = {\n\n./backend/src/tools/definitions/list.ts:\n16:import { spawnAgentsTool } from './tool/spawn-agents'\n17:import { spawnAgentsAsyncTool } from './tool/spawn-agents-async'\n43: spawn_agents: spawnAgentsTool,\n44: spawn_agents_async: spawnAgentsAsyncTool,\n\n./common/src/templates/agent-validation.ts:\n199: // Validate spawnable agents (skip if requested, e.g., for database agents)\n\n./web/src/app/api/agents/publish/route.ts:\n222: // Verify that all spawnable agents are either published or part of this request\n\n./common/src/__tests__/agent-validation.test.ts:\n116: test.skip('should validate spawnable agents', async () => {\n141: 'Invalid spawnable agents: nonexistent_agent',\n274: it('should validate spawnable agents including dynamic agents from first pass', async () => {\n287: spawnableAgents: [], // No spawnable agents\n\n./common/src/__tests__/dynamic-agent-template-schema.test.ts:\n336: const spawnAgentsError = result.error.issues.find((issue) =>\n341: expect(spawnAgentsError).toBeDefined()\n342: expect(spawnAgentsError?.message).toContain(\n\n./web/src/content/agents/troubleshooting-agent-customization.mdx:\n204:2. Limit spawnable agents:\n\n./common/src/util/agent-name-normalization.ts:\n6: * 2. Try with DEFAULT_ORG_PREFIX for spawnable agents\n10: * and handles the common case where users reference spawnable agents\n27: // Try with DEFAULT_ORG_PREFIX for spawnable agents\n\n./common/src/tools/list.ts:\n14:import { spawnAgentsParams } from './params/tool/spawn-agents'\n15:import { spawnAgentsAsyncParams } from './params/tool/spawn-agents-async'\n39: spawn_agents: spawnAgentsParams,\n40: spawn_agents_async: spawnAgentsAsyncParams,\n\n./common/src/types/dynamic-agent-template.ts:\n98: // Tools and spawnable agents\n\n./common/src/json-config/constants.ts:\n91: .describe('Specify complete list of spawnable agents for the base agent'),\n\n./common/src/util/agent-template-validation.ts:\n9: * Centralized validation for spawnable agents.\n10: * Validates that all spawnable agents reference valid agent types.\n35: * Formats a validation error message for spawnable agents\n41: let message = `Invalid spawnable agents: ${invalidAgents.join(', ')}. Double check the id, including the org prefix if applicable.`\n\n./common/src/json-config/__tests__/__snapshots__/stringify-schema.test.ts.snap:\n85: // (optional): Specify complete list of spawnable agents for the base agent\n\n./common/src/tools/params/tool/spawn-agents.ts:\n7:export const spawnAgentsParams = {\n\n./common/src/tools/params/tool/spawn-agents-async.ts:\n7:export const spawnAgentsAsyncParams = {", - "message": "Exit code: 0" - } - } - ], - "parentAgentId": "D-Ofa741I0M" - }, - { - "type": "tool_call", - "toolCallId": "9efee56f-fbb6-44e0-83c8-1e662f712455", - "toolName": "code_search", - "input": { - "pattern": "agent builder|agentBuilder" - }, - "agentId": "D-Ofa741I0M", - "parentAgentId": "main-agent", - "includeToolCall": true - }, - { - "type": "tool_result", - "toolCallId": "9efee56f-fbb6-44e0-83c8-1e662f712455", - "toolName": "code_search", - "output": [ - { - "type": "json", - "value": { - "stdout": "./npm-app/src/cli-handlers/agent-creation-chat.ts:\n77: // Create a simple prompt for the agent builder with the requirements\n88: // Use the resetAgent helper to properly switch to agent-builder which automatically spawns the agent builder\n\n./npm-app/src/cli-handlers/agents.ts:\n560: // Switch to agent-builder which automatically spawns the agent builder for agent creation\n\n./backend/src/templates/agents/agent-builder.ts:\n30:export const agentBuilder = (\n135: 'You are an expert agent builder specialized in creating new agent templates for the codebuff system. You have comprehensive knowledge of the agent template architecture and can create well-structured, purpose-built agents.',\n224:The agent builder is focused on creating new agent templates based on user specifications.\n\n./backend/src/templates/agent-list.ts:\n18:import { agentBuilder } from './agents/agent-builder'\n77: ...agentBuilder(models.openrouter_claude_sonnet_4),", - "message": "Exit code: 0" - } - } - ], - "parentAgentId": "D-Ofa741I0M" - }, - { - "type": "tool_call", - "toolCallId": "d7faf371-a43a-44de-829f-0c21cefdb370", - "toolName": "code_search", - "input": { - "pattern": "agent personas|agentPersonas" - }, - "agentId": "D-Ofa741I0M", - "parentAgentId": "main-agent", - "includeToolCall": true - }, - { - "type": "tool_result", - "toolCallId": "d7faf371-a43a-44de-829f-0c21cefdb370", - "toolName": "code_search", - "output": [ - { - "type": "json", - "value": { - "stdout": "./common/src/constants/agents.ts:\n3:// Define agent personas with their shared characteristics", - "message": "Exit code: 0" - } - } - ], - "parentAgentId": "D-Ofa741I0M" - }, - { - "type": "tool_call", - "toolCallId": "cbcd47c4-b9ab-4235-a6ae-d5ca80e0d822", - "toolName": "set_output", - "input": { - "results": [ - { - "stdout": ".agents/examples/diff-reviewer-1.ts:\n4: id: 'diff-reviewer-1',\n\n.agents/examples/diff-reviewer-2.ts:\n7: id: 'diff-reviewer-2',\n\n.agents/examples/diff-reviewer-3.ts:\n7: id: 'diff-reviewer-3',\n\n./backend/src/templates/agents/agent-builder.ts:\n67: (file) => file.endsWith('.ts') && file.startsWith('diff-reviewer'),\n\n./common/src/util/examples/diff-reviewer-1.ts:\n4: id: 'diff-reviewer-1',\n\n./common/src/util/examples/diff-reviewer-2.ts:\n7: id: 'diff-reviewer-2',\n\n./common/src/util/examples/diff-reviewer-3.ts:\n7: id: 'diff-reviewer-3',", - "message": "Exit code: 0" - }, - { - "stdout": "No results", - "message": "Exit code: 1" - }, - { - "stdout": "./npm-app/src/client.ts:\n1354: // Mark any spawnable agents as inactive when the main response completes\n\n./npm-app/src/subagent-storage.ts:\n214: * Get recent spawnable agents (sorted by last activity)\n223: * Get spawnable agents in chronological order (oldest first)\n\n./backend/knowledge.md:\n7:Users can now reference spawnable agents without org prefixes in their agent templates. For example:\n77: spawnableAgents?: { // Modify spawnable agents list\n\n./npm-app/src/agents/load-agents.ts:\n86: `${green('Configured spawnable agents:')} ${spawnableAgents\n\n./npm-app/src/cli.ts:\n949: // Give control back to user when no spawnable agents exist\n\n./backend/src/tools/definitions/tool/spawn-agents-async.ts:\n6:export const spawnAgentsAsyncTool = {\n\n./backend/src/tools/definitions/tool/spawn-agents.ts:\n6:export const spawnAgentsTool = {\n\n./backend/src/tools/definitions/list.ts:\n16:import { spawnAgentsTool } from './tool/spawn-agents'\n17:import { spawnAgentsAsyncTool } from './tool/spawn-agents-async'\n43: spawn_agents: spawnAgentsTool,\n44: spawn_agents_async: spawnAgentsAsyncTool,\n\n./common/src/templates/agent-validation.ts:\n199: // Validate spawnable agents (skip if requested, e.g., for database agents)\n\n./web/src/app/api/agents/publish/route.ts:\n222: // Verify that all spawnable agents are either published or part of this request\n\n./common/src/__tests__/agent-validation.test.ts:\n116: test.skip('should validate spawnable agents', async () => {\n141: 'Invalid spawnable agents: nonexistent_agent',\n274: it('should validate spawnable agents including dynamic agents from first pass', async () => {\n287: spawnableAgents: [], // No spawnable agents\n\n./common/src/__tests__/dynamic-agent-template-schema.test.ts:\n336: const spawnAgentsError = result.error.issues.find((issue) =>\n341: expect(spawnAgentsError).toBeDefined()\n342: expect(spawnAgentsError?.message).toContain(\n\n./web/src/content/agents/troubleshooting-agent-customization.mdx:\n204:2. Limit spawnable agents:\n\n./common/src/util/agent-name-normalization.ts:\n6: * 2. Try with DEFAULT_ORG_PREFIX for spawnable agents\n10: * and handles the common case where users reference spawnable agents\n27: // Try with DEFAULT_ORG_PREFIX for spawnable agents\n\n./common/src/tools/list.ts:\n14:import { spawnAgentsParams } from './params/tool/spawn-agents'\n15:import { spawnAgentsAsyncParams } from './params/tool/spawn-agents-async'\n39: spawn_agents: spawnAgentsParams,\n40: spawn_agents_async: spawnAgentsAsyncParams,\n\n./common/src/types/dynamic-agent-template.ts:\n98: // Tools and spawnable agents\n\n./common/src/json-config/constants.ts:\n91: .describe('Specify complete list of spawnable agents for the base agent'),\n\n./common/src/util/agent-template-validation.ts:\n9: * Centralized validation for spawnable agents.\n10: * Validates that all spawnable agents reference valid agent types.\n35: * Formats a validation error message for spawnable agents\n41: let message = `Invalid spawnable agents: ${invalidAgents.join(', ')}. Double check the id, including the org prefix if applicable.`\n\n./common/src/json-config/__tests__/__snapshots__/stringify-schema.test.ts.snap:\n85: // (optional): Specify complete list of spawnable agents for the base agent\n\n./common/src/tools/params/tool/spawn-agents.ts:\n7:export const spawnAgentsParams = {\n\n./common/src/tools/params/tool/spawn-agents-async.ts:\n7:export const spawnAgentsAsyncParams = {", - "message": "Exit code: 0" - }, - { - "stdout": "./npm-app/src/cli-handlers/agent-creation-chat.ts:\n77: // Create a simple prompt for the agent builder with the requirements\n88: // Use the resetAgent helper to properly switch to agent-builder which automatically spawns the agent builder\n\n./npm-app/src/cli-handlers/agents.ts:\n560: // Switch to agent-builder which automatically spawns the agent builder for agent creation\n\n./backend/src/templates/agents/agent-builder.ts:\n30:export const agentBuilder = (\n135: 'You are an expert agent builder specialized in creating new agent templates for the codebuff system. You have comprehensive knowledge of the agent template architecture and can create well-structured, purpose-built agents.',\n224:The agent builder is focused on creating new agent templates based on user specifications.\n\n./backend/src/templates/agent-list.ts:\n18:import { agentBuilder } from './agents/agent-builder'\n77: ...agentBuilder(models.openrouter_claude_sonnet_4),", - "message": "Exit code: 0" - }, - { - "stdout": "./common/src/constants/agents.ts:\n3:// Define agent personas with their shared characteristics", - "message": "Exit code: 0" - } - ] - }, - "agentId": "D-Ofa741I0M", - "parentAgentId": "main-agent", - "includeToolCall": false - }, - { - "type": "tool_result", - "toolCallId": "cbcd47c4-b9ab-4235-a6ae-d5ca80e0d822", - "toolName": "set_output", - "output": [ - { - "type": "json", - "value": { - "message": "Output set" - } - } - ], - "parentAgentId": "D-Ofa741I0M" - }, - { - "type": "subagent_finish", - "agentId": "D-Ofa741I0M", - "agentType": "code-searcher", - "displayName": "Code Searcher", - "onlyChild": false, - "parentAgentId": "main-agent", - "prompt": "", - "params": { - "searchQueries": [ - { - "pattern": "diff-reviewer" - }, - { - "pattern": "your-custom-agent" - }, - { - "pattern": "spawnable agents|spawnAgents" - }, - { - "pattern": "agent builder|agentBuilder" - }, - { - "pattern": "agent personas|agentPersonas" - } - ] - } - }, - { - "type": "text", - "agentId": "D-OfaV526OE", - "text": ".agents/brainstormer.ts\n.agents/planner.ts\n.agents/researcher.ts\n.agents/reviewer.ts\n.agents/thinker.ts\n.agents/superagent.ts\nbackend/src/templates/agents/agent-list.ts\nbackend/src/templates/agents/base.ts\ncommon/src/constants/agents.ts\ncommon/src/types/agent-template.ts\nnpm-app/src/agents/load-agents.ts\nweb/src/content/agents/overview.mdx" - }, - { - "type": "subagent_finish", - "agentId": "D-OgGtcToUQ", - "agentType": "file-lister", - "displayName": "Liszt the File Lister", - "onlyChild": true, - "parentAgentId": "D-OfaV526OE", - "prompt": "", - "params": { - "prompt": "agent personas, list of agent personalities or types" - } - }, - { - "type": "tool_result", - "toolCallId": "3c204c3d-25bd-4014-b0b9-935f91f963e5", - "toolName": "spawn_agents", - "output": [ - { - "type": "json", - "value": [ - { - "agentName": "Liszt the File Lister", - "agentType": "file-lister", - "value": { - "type": "lastMessage", - "value": [ - { - "role": "assistant", - "content": [ - { - "type": "text", - "text": ".agents/brainstormer.ts\n.agents/planner.ts\n.agents/researcher.ts\n.agents/reviewer.ts\n.agents/thinker.ts\n.agents/superagent.ts\nbackend/src/templates/agents/agent-list.ts\nbackend/src/templates/agents/base.ts\ncommon/src/constants/agents.ts\ncommon/src/types/agent-template.ts\nnpm-app/src/agents/load-agents.ts\nweb/src/content/agents/overview.mdx" - } - ] - } - ] - } - } - ] - } - ], - "parentAgentId": "D-OfaV526OE" - }, - { - "type": "tool_call", - "toolCallId": "f392a70e-4bbb-4025-9d8e-e88342eab3f0", - "toolName": "read_files", - "input": { - "paths": [ - ".agents/brainstormer.ts", - ".agents/planner.ts", - ".agents/researcher.ts", - ".agents/reviewer.ts", - ".agents/thinker.ts", - ".agents/superagent.ts", - "backend/src/templates/agents/agent-list.ts", - "backend/src/templates/agents/base.ts", - "common/src/constants/agents.ts", - "common/src/types/agent-template.ts", - "npm-app/src/agents/load-agents.ts", - "web/src/content/agents/overview.mdx" - ] - }, - "agentId": "D-OfaV526OE", - "parentAgentId": "main-agent", - "includeToolCall": true - }, - { - "type": "tool_result", - "toolCallId": "f392a70e-4bbb-4025-9d8e-e88342eab3f0", - "toolName": "read_files", - "output": [ - { - "type": "json", - "value": [ - { - "path": ".agents/brainstormer.ts", - "content": "import { publisher, version } from './constants'\n\nimport type { AgentDefinition } from './types/agent-definition'\n\nconst definition: AgentDefinition = {\n id: 'brainstormer',\n version,\n publisher,\n displayName: 'Brian the Brainstormer',\n model: 'anthropic/claude-4-sonnet-20250522',\n\n includeMessageHistory: true,\n inputSchema: {\n prompt: {\n type: 'string',\n description: 'The problem or topic to brainstorm about.',\n },\n },\n outputMode: 'last_message',\n\n toolNames: ['spawn_agents', 'end_turn'],\n spawnableAgents: [\n `codebuff/thinker@${version}`,\n `codebuff/researcher@${version}`,\n ],\n\n spawnPurposePrompt:\n 'Acts as a creative thought partner, generating ideas and exploring alternative viewpoints to help think through problems.',\n\n systemPrompt: `# Persona: Brian the Brainstormer - Creative Thought Partner\n\nYou are an expert brainstorming partner who excels at generating creative ideas, exploring alternative approaches, and helping users think through problems from multiple angles.\n\n## Your Role\n\n- **Idea Generator**: Propose creative and unconventional solutions\n- **Devil's Advocate**: Challenge assumptions and explore counterarguments\n- **Perspective Shifter**: Offer different viewpoints and approaches\n- **Question Asker**: Ask probing questions that unlock new thinking\n- **Pattern Connector**: Find unexpected connections between concepts\n\n## Your Approach\n\n- Think divergently before converging on solutions\n- Explore \"what if\" scenarios and edge cases\n- Consider multiple stakeholder perspectives\n- Balance practical constraints with creative possibilities\n- Use analogies and metaphors to spark new insights\n- Challenge the status quo respectfully\n\n## Guidelines\n\n- Be enthusiastic and encouraging about exploration\n- Offer 3-5 distinct alternatives when possible\n- Ask clarifying questions to understand context better\n- Build on the user's ideas while adding your own spin\n- Consider both short-term and long-term implications\n- Balance optimism with realistic assessment\n\nRemember: Your goal is to expand thinking, not to provide definitive answers. Help the user see their problem space more clearly and discover new possibilities they might not have considered.`,\n\n instructionsPrompt:\n 'Act as a creative thought partner. Generate multiple perspectives, challenge assumptions, explore alternatives, and ask probing questions to help think through problems more thoroughly.',\n}\n\nexport default definition\n", - "referencedBy": {} - }, - { - "path": ".agents/planner.ts", - "content": "import { publisher, version } from './constants'\n\nimport type { AgentDefinition } from './types/agent-definition'\n\nconst definition: AgentDefinition = {\n id: 'planner',\n version,\n publisher,\n model: 'x-ai/grok-4-07-09',\n displayName: 'Peter Plan the Planner',\n toolNames: ['think_deeply', 'spawn_agents', 'end_turn'],\n spawnableAgents: [],\n inputSchema: {\n prompt: {\n description:\n 'What problem you to solve and a few ideas and suggestions for the plan',\n type: 'string',\n },\n },\n outputMode: 'last_message',\n includeMessageHistory: true,\n\n spawnPurposePrompt: 'Agent that formulates a comprehensive plan to a prompt.',\n systemPrompt: `You are an expert software architect. You are good at creating comprehensive plans to tackle the user request.`,\n instructionsPrompt: `Steps for your response:\n1. Use the tool to think through cruxes for the plan, and tricky cases. Consider alternative approaches. Be sure to close the tool call with .\n2. Write out your plan in a concise way.\n3. Spawn 1-5 dry run agents to sketch portions of the implementation of the plan. (Important: do not forget to close the tool call with \"\"!)\n4. Synthesize all the information and rewrite the full plan to be the best it can be. Use the end_turn tool.`,\n}\n\nexport default definition\n", - "referencedBy": {} - }, - { - "path": ".agents/researcher.ts", - "content": "import { publisher, version } from './constants'\n\nimport type { AgentDefinition } from './types/agent-definition'\n\nconst definition: AgentDefinition = {\n id: 'researcher',\n version,\n publisher,\n model: 'gemini-2.5-flash-preview-05-20',\n displayName: 'Reid Searcher the Researcher',\n toolNames: ['web_search', 'read_docs', 'read_files', 'end_turn'],\n\n inputSchema: {\n prompt: {\n description:\n 'A question you would like answered using web search and documentation',\n type: 'string',\n },\n },\n outputMode: 'last_message',\n includeMessageHistory: false,\n\n spawnPurposePrompt:\n 'Expert at researching topics using web search and documentation.',\n systemPrompt: `# Persona: {CODEBUFF_AGENT_NAME}\n\nYou are an expert researcher who can search the web and read documentation to find relevant information. Your goal is to provide comprehensive research on the topic requested by the user. Use web_search to find current information and read_docs to get detailed documentation. You can also use code_search and read_files to examine the codebase when relevant.\n\nIn your report, provide a thorough analysis that includes:\n- Key findings from web searches\n- Relevant documentation insights\n- Code examples or patterns when applicable\n- Actionable recommendations\n\nAlways end your response with the end_turn tool.`,\n stepPrompt: \"Don't forget to end your response with the end_turn tool.\",\n handleSteps: function* ({ agentState, prompt, params }) {\n yield {\n toolName: 'web_search',\n args: { query: prompt ?? '', depth: 'standard' },\n }\n yield 'STEP_ALL'\n },\n}\n\nexport default definition\n", - "referencedBy": {} - }, - { - "path": ".agents/reviewer.ts", - "content": "import { publisher, version } from './constants'\n\nimport type { AgentDefinition } from './types/agent-definition'\n\nconst definition: AgentDefinition = {\n id: 'reviewer',\n version,\n publisher,\n model: 'gemini-2.5-pro-preview-06-05',\n displayName: 'Nit Pick Nick the Reviewer',\n\n toolNames: ['end_turn', 'run_file_change_hooks'],\n\n inputSchema: {\n prompt: {\n description: 'What should be reviewed. Be brief.',\n type: 'string',\n },\n },\n outputMode: 'last_message',\n includeMessageHistory: true,\n\n spawnPurposePrompt:\n 'Reviews file changes and responds with critical feedback. Use this after making any significant change to the codebase.',\n systemPrompt: `# Persona: {CODEBUFF_AGENT_NAME}\n\n\nconst definition: AgentDefinition = {\nYou are an expert programmer who can articulate very clear feedback on code changes.\n{CODEBUFF_TOOLS_PROMPT}\n\n{CODEBUFF_AGENTS_PROMPT}`,\n instructionsPrompt: `Your task is to provide helpful feedback on the last file changes made by the assistant. You should critique the code changes made recently in the above conversation.\n\nIMPORTANT: After analyzing the file changes, you should:\n1. Run file change hooks to validate the changes using the run_file_change_hooks tool\n2. Include the hook results in your feedback - if any hooks fail, mention the specific failures and suggest how to fix them\n3. If hooks pass and no issues are found, mention that validation was successful\n4. Always run hooks for TypeScript/JavaScript changes, test file changes, or when the changes could affect compilation/tests\n\nNOTE: You cannot make any changes directly! You can only suggest changes.\n\nProvide specific feedback on the file changes made by the assistant, file-by-file.\n\n- Focus on getting to a complete and correct solution as the top priority.\n- Try to keep any changes to the codebase as minimal as possible.\n- Simplify any logic that can be simplified.\n- Where a function can be reused, reuse it and do not create a new one.\n- Make sure that no new dead code is introduced.\n- Make sure there are no missing imports.\n- Make sure no sections were deleted that weren't supposed to be deleted.\n- Make sure the new code matches the style of the existing code.\n\nBe concise and to the point. After providing all your feedback, use the end_turn tool to end your response.`,\n stepPrompt:\n \"IMPORTANT: Don't forget to end your response with the end_turn tool: \",\n}\n\nexport default definition\n", - "referencedBy": {} - }, - { - "path": ".agents/thinker.ts", - "content": "import { publisher, version } from './constants'\n\nimport type { AgentDefinition } from './types/agent-definition'\n\nconst definition: AgentDefinition = {\n id: 'thinker',\n version,\n publisher,\n model: 'x-ai/grok-4-07-09',\n displayName: 'Theo the Theorizer',\n\n inputSchema: {\n prompt: {\n description: 'The problem you are trying to solve',\n type: 'string',\n },\n },\n outputMode: 'last_message',\n includeMessageHistory: true,\n toolNames: ['end_turn'],\n spawnableAgents: [],\n spawnPurposePrompt:\n 'Does deep thinking given the current messages and a specific prompt to focus on. Use this to help you solve a specific problem.',\n systemPrompt: `# Persona: {CODEBUFF_AGENT_NAME}\n\nYou are an expert programmer.\n{CODEBUFF_TOOLS_PROMPT}\n\n{CODEBUFF_AGENTS_PROMPT}`,\n instructionsPrompt: `Think deeply, step by step, about the user request and how best to approach it.\n\nConsider edge cases, potential issues, and alternative approaches.\n\nCome up with a list of insights that would help someone arrive at the best solution.\n\nTry not to be too prescriptive or confident in one solution. Instead, give clear arguments and reasoning.\n\nYou must be extremely concise and to the point.`,\n stepPrompt:\n \"Don't forget to end your response with the end_turn tool: \",\n}\n\nexport default definition\n", - "referencedBy": {} - }, - { - "path": ".agents/superagent.ts", - "content": "import { publisher, version } from './constants'\n\nimport type { AgentDefinition } from './types/agent-definition'\n\nconst definition: AgentDefinition = {\n id: 'superagent',\n version,\n publisher,\n model: 'anthropic/claude-4-sonnet-20250522',\n displayName: 'Superagent',\n\n toolNames: ['spawn_agents', 'spawn_agents_async', 'end_turn', 'think_deeply'],\n spawnableAgents: [\n `codebuff/thinker@${version}`,\n `codebuff/base@${version}`,\n `codebuff/ask@${version}`,\n ],\n\n inputSchema: {\n prompt: {\n description: 'A coding task to complete',\n type: 'string',\n },\n },\n outputMode: 'last_message',\n includeMessageHistory: false,\n\n spawnPurposePrompt:\n 'Superagent that can spawn multiple code editing agents to complete a task.',\n systemPrompt: `You are an expert orchestrator that can solve any problem, including coding tasks.`,\n instructionsPrompt: `Answer the user\\'s question or complete the task by spawning copies of the base agent.\n\nIf you have all the information you need, just write out the response and do not spawn any agents.\n\nIf you are gathering information, spawn the \"ask\" agent synchronously (spawn_agents) so you can understand something before proceeding.\n\nIf you are delegating a coding task, spawn the \"base\" agent *asynchronously* (spawn_agents_async) so you can help the user with other tasks while the spawned agent works on the code.\n\nPrefer sending a message to a previous agent over spawning a new agent, especially if that agent was previously working on a similar task.\n\nFeel free to ask the user for clarification if you are unsure what to do.`,\n stepPrompt:\n 'Spawn as many agents as you can to help. Use the end_turn tool at the end of your response when you have completed the user request or want the user to respond to your message or if you are waiting for a response from an agent.',\n}\n\nexport default definition\n", - "referencedBy": {} - }, - { - "path": "backend/src/templates/agents/agent-list.ts", - "content": "[FILE_DOES_NOT_EXIST]", - "referencedBy": {} - }, - { - "path": "backend/src/templates/agents/base.ts", - "content": "import { AGENT_PERSONAS } from '@codebuff/common/constants/agents'\nimport { AgentTemplateTypes } from '@codebuff/common/types/session-state'\nimport z from 'zod/v4'\n\nimport {\n baseAgentAgentStepPrompt,\n baseAgentSystemPrompt,\n baseAgentUserInputPrompt,\n} from '../base-prompts'\n\nimport type { AgentTemplate } from '../types'\nimport type { Model } from '@codebuff/common/constants'\n\nexport const base = (\n model: Model,\n allAvailableAgents?: string[],\n): Omit => ({\n model,\n displayName: AGENT_PERSONAS.base.displayName,\n spawnPurposePrompt: AGENT_PERSONAS.base.purpose,\n inputSchema: {\n prompt: z.string().describe('A coding task to complete'),\n },\n outputMode: 'last_message',\n includeMessageHistory: false,\n toolNames: [\n 'create_plan',\n 'run_terminal_command',\n 'str_replace',\n 'write_file',\n 'spawn_agents',\n 'add_subgoal',\n 'browser_logs',\n 'code_search',\n 'end_turn',\n 'read_files',\n 'think_deeply',\n 'update_subgoal',\n ],\n spawnableAgents: allAvailableAgents\n ? (allAvailableAgents as any[])\n : [\n AgentTemplateTypes.file_explorer,\n AgentTemplateTypes.file_picker,\n AgentTemplateTypes.researcher,\n AgentTemplateTypes.thinker,\n AgentTemplateTypes.reviewer,\n ],\n\n systemPrompt: baseAgentSystemPrompt(model),\n instructionsPrompt: baseAgentUserInputPrompt(model),\n stepPrompt: baseAgentAgentStepPrompt(model),\n})\n", - "referencedBy": {} - }, - { - "path": "common/src/constants/agents.ts", - "content": "import type { AgentTemplateTypes } from '../types/session-state'\n\n// Define agent personas with their shared characteristics\nexport const AGENT_PERSONAS = {\n // Base agents - all use Buffy persona\n base: {\n displayName: 'Buffy the Enthusiastic Coding Assistant',\n purpose: 'Base agent that orchestrates the full response.',\n } as const,\n base_lite: {\n displayName: 'Buffy the Enthusiastic Coding Assistant',\n purpose: 'Base agent that orchestrates the full response.',\n } as const,\n base_max: {\n displayName: 'Buffy the Enthusiastic Coding Assistant',\n purpose: 'Base agent that orchestrates the full response.',\n } as const,\n base_experimental: {\n displayName: 'Buffy the Enthusiastic Coding Assistant',\n purpose: 'Base agent that orchestrates the full response.',\n } as const,\n claude4_gemini_thinking: {\n displayName: 'Buffy the Enthusiastic Coding Assistant',\n purpose: 'Base agent that orchestrates the full response.',\n } as const,\n\n base_agent_builder: {\n displayName: 'Buffy the Enthusiastic Agent Builder',\n purpose:\n 'Enhanced base agent that can create custom agents and handle all coding tasks',\n } as const,\n\n superagent: {\n displayName: 'Superagent',\n purpose:\n 'Superagent that can spawn multiple code editing agents to complete a task.',\n } as const,\n\n // Ask mode\n ask: {\n displayName: 'Buffy the Enthusiastic Coding Assistant',\n purpose: 'Base ask-mode agent that orchestrates the full response.',\n } as const,\n\n // Specialized agents\n thinker: {\n displayName: 'Theo the Theorizer',\n purpose:\n 'Does deep thinking given the current messages and a specific prompt to focus on. Use this to help you solve a specific problem.',\n } as const,\n file_explorer: {\n displayName: 'Dora The File Explorer',\n purpose: 'Expert at exploring a codebase and finding relevant files.',\n } as const,\n file_picker: {\n displayName: 'Fletcher the File Fetcher',\n purpose: 'Expert at finding relevant files in a codebase.',\n } as const,\n researcher: {\n displayName: 'Reid Searcher the Researcher',\n purpose: 'Expert at researching topics using web search and documentation.',\n } as const,\n planner: {\n displayName: 'Peter Plan the Planner',\n purpose: 'Agent that formulates a comprehensive plan to a prompt.',\n hidden: true,\n } as const,\n dry_run: {\n displayName: 'Sketch the Dry Runner',\n purpose: 'Agent that takes a plan and try to implement it in a dry run.',\n hidden: true,\n } as const,\n reviewer: {\n displayName: 'Nit Pick Nick the Reviewer',\n purpose:\n 'Reviews file changes and responds with critical feedback. Use this after making any significant change to the codebase.',\n } as const,\n agent_builder: {\n displayName: 'Bob the Agent Builder',\n purpose: 'Creates new agent templates for the codebuff mult-agent system',\n hidden: false,\n } as const,\n} as const satisfies Partial<\n Record<\n keyof typeof AgentTemplateTypes,\n { displayName: string; purpose: string; hidden?: boolean }\n >\n>\n\n// Agent IDs list from AGENT_PERSONAS keys\nexport const AGENT_IDS = Object.keys(\n AGENT_PERSONAS,\n) as (keyof typeof AGENT_PERSONAS)[]\n\n// Agent ID prefix constant\nexport const AGENT_ID_PREFIX = 'CodebuffAI/'\n\n// Agent names for client-side reference\nexport const AGENT_NAMES = Object.fromEntries(\n Object.entries(AGENT_PERSONAS).map(([agentType, persona]) => [\n agentType,\n persona.displayName,\n ]),\n) as Record\n\nexport type AgentName =\n (typeof AGENT_PERSONAS)[keyof typeof AGENT_PERSONAS]['displayName']\n\n// Get unique agent names for UI display\nexport const UNIQUE_AGENT_NAMES = Array.from(\n new Set(\n Object.values(AGENT_PERSONAS)\n .filter((persona) => !('hidden' in persona) || !persona.hidden)\n .map((persona) => persona.displayName),\n ),\n)\n\n// Map from display name back to agent types (for parsing user input)\nexport const AGENT_NAME_TO_TYPES = Object.entries(AGENT_NAMES).reduce(\n (acc, [type, name]) => {\n if (!acc[name]) acc[name] = []\n acc[name].push(type)\n return acc\n },\n {} as Record,\n)\n", - "referencedBy": {} - }, - { - "path": "common/src/types/agent-template.ts", - "content": "import type { Model } from '../constants'\nimport type { AgentState, AgentTemplateType } from './session-state'\nimport type { ToolName } from '../tools/constants'\nimport type { ToolCall } from '../util/types/agent-definition'\nimport type { z } from 'zod/v4'\n\nexport type AgentTemplate<\n P = string | undefined,\n T = Record | undefined,\n> = {\n id: AgentTemplateType\n displayName: string\n model: Model\n\n toolNames: ToolName[]\n spawnableAgents: AgentTemplateType[]\n\n spawnPurposePrompt?: string\n systemPrompt: string\n instructionsPrompt: string\n stepPrompt: string\n parentInstructions?: Record\n\n // Required parameters for spawning this agent.\n inputSchema: {\n prompt?: z.ZodSchema

\n params?: z.ZodSchema\n }\n includeMessageHistory: boolean\n outputMode: 'last_message' | 'all_messages' | 'structured_output'\n outputSchema?: z.ZodSchema\n\n handleSteps?: StepHandler | string // Function or string of the generator code for running in a sandbox\n}\n\nexport type StepGenerator = Generator<\n Omit | 'STEP' | 'STEP_ALL', // Generic tool call type\n void,\n { agentState: AgentState; toolResult: string | undefined }\n>\n\nexport type StepHandler<\n P = string | undefined,\n T = Record | undefined,\n> = (params: { agentState: AgentState; prompt: P; params: T }) => StepGenerator\n", - "referencedBy": {} - }, - { - "path": "npm-app/src/agents/load-agents.ts", - "content": "import * as fs from 'fs'\nimport * as path from 'path'\n\nimport { cyan, green } from 'picocolors'\n\nimport { getAllTsFiles, getAgentsDirectory } from './agent-utils'\n\nimport type { CodebuffConfig } from '@codebuff/common/json-config/constants'\n\nexport let loadedAgents: Record = {}\nexport async function loadLocalAgents({\n verbose = false,\n}: {\n verbose?: boolean\n}): Promise {\n loadedAgents = {}\n\n const agentsDir = getAgentsDirectory()\n\n if (!fs.existsSync(agentsDir)) {\n return loadedAgents\n }\n\n try {\n const tsFiles = getAllTsFiles(agentsDir)\n\n for (const fullPath of tsFiles) {\n const relativePath = path.relative(agentsDir, fullPath)\n const fileName = relativePath.replace(/\\.ts$/, '').replace(/[/\\\\]/g, '-')\n\n let agentDefinition: any\n let agentModule: any\n try {\n agentModule = await require(fullPath)\n } catch (error: any) {\n if (verbose) {\n console.error('Error importing agent:', error)\n }\n continue\n }\n delete require.cache[fullPath]\n\n try {\n agentDefinition = agentModule.default\n } catch (error: any) {\n console.error('Error loading agent from file:', fullPath, error)\n continue\n }\n\n if (!agentDefinition) continue\n\n // Convert handleSteps function to string if present\n let processedAgentDefinition = { ...agentDefinition }\n\n if (agentDefinition.handleSteps) {\n processedAgentDefinition.handleSteps =\n agentDefinition.handleSteps.toString()\n }\n\n loadedAgents[fileName] = processedAgentDefinition\n }\n } catch (error) {}\n return loadedAgents\n}\n\nexport function getLoadedAgentNames(): Record {\n return Object.fromEntries(\n Object.entries(loadedAgents).map(([agentType, agentConfig]) => {\n return [agentType, agentConfig.displayName]\n }),\n )\n}\n\n/**\n * Display loaded agents to the user\n */\nexport function displayLoadedAgents(codebuffConfig: CodebuffConfig) {\n const baseAgent = codebuffConfig.baseAgent\n if (baseAgent) {\n console.log(`\\n${green('Configured base agent:')} ${cyan(baseAgent)}`)\n }\n\n const spawnableAgents = codebuffConfig.spawnableAgents\n if (spawnableAgents) {\n console.log(\n `${green('Configured spawnable agents:')} ${spawnableAgents\n .map((name) => cyan(name))\n .join(', ')}\\n`,\n )\n } else if (Object.keys(loadedAgents).length > 0) {\n const loadedAgentNames = Object.values(getLoadedAgentNames())\n console.log(\n `\\n${green('Found custom agents:')} ${loadedAgentNames\n .map((name) => cyan(name))\n .join(', ')}\\n`,\n )\n } else if (baseAgent) {\n // One more new line.\n console.log()\n }\n}\n", - "referencedBy": {} - }, - { - "path": "web/src/content/agents/overview.mdx", - "content": "---\ntitle: 'Overview'\nsection: 'agents'\ntags: ['agents', 'multi-agent', 'overview']\norder: 0\n---\n\n# Overview\n\n## Why Multi-Agent Systems Work Better\n\nCodebuff uses specialized agents that collaborate instead of one agent doing everything. Agents spawn other agents, share tools, and pass context between tasks. Here are some of the sub-agents Codebuff uses:\n\n- **Code Generation** - Write clean, functional code\n- **Review** - Catch bugs, security issues, style violations\n- **Research** - Find documentation and examples\n- **Planning** - Break down complex requirements\n- **File Discovery** - Navigate large codebases\n\n## Agent Workflow\n\nA typical call to Codebuff may result in the following flow:\n\n```mermaid\nflowchart TD\n A[User Request] --> B{Task Type}\n\n B -->|Feature Development| C[Planning Agent]\n B -->|Bug Investigation| D[Thinker Agent]\n B -->|Code Refactoring| E[File Picker Agent]\n\n C --> F[File Picker Agent]\n D --> G[Research Agent]\n E --> H[Planning Agent]\n\n F --> I[Base Agent]\n G --> I\n H --> I\n\n I --> J[Reviewer Agent]\n J --> K[Complete]\n\n style A fill:#e1f5fe\n style I fill:#f3e5f5\n style J fill:#e8f5e8\n style K fill:#fff3e0\n```\n\n### Example: Authentication System Refactoring\n\nIf you say \"refactor this authentication system\", Codebuff might break down the task into the following steps:\n\n1. **File Picker** finds auth-related files\n2. **Research** looks up best practices\n3. **Planning** creates step-by-step plan\n4. **Base** implements changes informed by the previous agents\n5. **Reviewer** checks for security issues\n\n### Domain-Specific Customization\n\nAgents adapt to your specific workflow and project needs. You can create specialized agents tailored to your domain or build new ones for unique tasks, like the following:\n\n- **Frontend**: React component reviewer\n- **Backend**: API security reviewer\n- **DevOps**: Infrastructure deployment agent\n\n### Agent Coordination\n\nAgents can coordinate with each other using **parent instructions** - a powerful feature that allows one agent to provide specific guidance to the agents it spawns. This creates intelligent workflows where:\n\n- A security-focused agent ensures all spawned reviewers check for vulnerabilities\n- A frontend coordinator guides file pickers to find React components\n- A documentation agent instructs researchers to prioritize official docs\n\nThis coordination happens automatically without requiring complex overrides or manual configuration.\n\n## Quick Start\n\n1. **[Customize existing agents](/docs/agents#customizing-agents)** - Modify prompts and tools\n2. **[Create new agents](/docs/agents#creating-new-agents)** - Build specialized functionality\n3. **[Reference guide](/docs/agents#agent-reference)** - Complete field documentation\n", - "referencedBy": {} - } - ] - } - ], - "parentAgentId": "D-OfaV526OE" - }, - { - "type": "text", - "agentId": "D-OfaYSx8-Q", - "text": ".agents/git-committer.ts\nbackend/src/templates/agents/base.ts\nbackend/src/templates/agents/thinking-base.ts\nbackend/src/templates/agents/file-picker.ts\nbackend/src/templates/agents/planner.ts\nbackend/src/templates/agent-list.ts\nbackend/src/templates/agent-registry.ts\ncommon/src/templates/dynamic-agent-template.ts\ncommon/src/types/agent-template.ts\ncommon/src/templates/agent-validation.ts\nnpm-app/src/agents/load-agents.ts\nnpm-app/src/cli-handlers/agents.ts" - }, - { - "type": "subagent_finish", - "agentId": "D-Ogo19lSyI", - "agentType": "file-lister", - "displayName": "Liszt the File Lister", - "onlyChild": true, - "parentAgentId": "D-OfaYSx8-Q", - "prompt": "", - "params": { - "prompt": "your-custom-agent starter template or git-committer agent" - } - }, - { - "type": "tool_result", - "toolCallId": "5fb459f2-3aca-4499-b719-39696556c4d8", - "toolName": "spawn_agents", - "output": [ - { - "type": "json", - "value": [ - { - "agentName": "Liszt the File Lister", - "agentType": "file-lister", - "value": { - "type": "lastMessage", - "value": [ - { - "role": "assistant", - "content": [ - { - "type": "text", - "text": ".agents/git-committer.ts\nbackend/src/templates/agents/base.ts\nbackend/src/templates/agents/thinking-base.ts\nbackend/src/templates/agents/file-picker.ts\nbackend/src/templates/agents/planner.ts\nbackend/src/templates/agent-list.ts\nbackend/src/templates/agent-registry.ts\ncommon/src/templates/dynamic-agent-template.ts\ncommon/src/types/agent-template.ts\ncommon/src/templates/agent-validation.ts\nnpm-app/src/agents/load-agents.ts\nnpm-app/src/cli-handlers/agents.ts" - } - ] - } - ] - } - } - ] - } - ], - "parentAgentId": "D-OfaYSx8-Q" - }, - { - "type": "tool_call", - "toolCallId": "8f05b455-303a-4642-b77b-d064963d2872", - "toolName": "read_files", - "input": { - "paths": [ - ".agents/git-committer.ts", - "backend/src/templates/agents/base.ts", - "backend/src/templates/agents/thinking-base.ts", - "backend/src/templates/agents/file-picker.ts", - "backend/src/templates/agents/planner.ts", - "backend/src/templates/agent-list.ts", - "backend/src/templates/agent-registry.ts", - "common/src/templates/dynamic-agent-template.ts", - "common/src/types/agent-template.ts", - "common/src/templates/agent-validation.ts", - "npm-app/src/agents/load-agents.ts", - "npm-app/src/cli-handlers/agents.ts" - ] - }, - "agentId": "D-OfaYSx8-Q", - "parentAgentId": "main-agent", - "includeToolCall": true - }, - { - "type": "tool_result", - "toolCallId": "8f05b455-303a-4642-b77b-d064963d2872", - "toolName": "read_files", - "output": [ - { - "type": "json", - "value": [ - { - "path": ".agents/git-committer.ts", - "content": "import { publisher, version } from './constants'\n\nimport type {\n AgentDefinition,\n AgentStepContext,\n} from './types/agent-definition'\n\nconst definition: AgentDefinition = {\n id: 'git-committer',\n version,\n publisher,\n displayName: 'Git Committer',\n model: 'anthropic/claude-4-sonnet-20250522',\n toolNames: ['read_files', 'run_terminal_command', 'add_message', 'end_turn'],\n\n inputSchema: {\n prompt: {\n type: 'string',\n description: 'What changes to commit',\n },\n },\n\n includeMessageHistory: false,\n outputMode: 'last_message',\n\n spawnPurposePrompt:\n 'Spawn when you need to commit code changes to git with an appropriate commit message',\n\n systemPrompt:\n 'You are an expert software developer. Your job is to create a git commit with a really good commit message.',\n\n instructionsPrompt:\n 'Follow the steps to create a good commit: analyze changes with git diff and git log, read relevant files for context, stage appropriate files, analyze changes, and create a commit with proper formatting including the Codebuff footer.',\n\n handleSteps: function* ({ agentState, prompt, params }: AgentStepContext) {\n // Step 1: Run git diff and git log to analyze changes\n yield {\n toolName: 'run_terminal_command',\n args: {\n command: 'git diff',\n process_type: 'SYNC',\n timeout_seconds: 30,\n },\n }\n\n yield {\n toolName: 'run_terminal_command',\n args: {\n command: 'git log --oneline -10',\n process_type: 'SYNC',\n timeout_seconds: 30,\n },\n }\n\n // Step 2: Let AI analyze the changes and read relevant files for context\n yield {\n toolName: 'add_message',\n args: {\n role: 'assistant',\n content:\n \"I've analyzed the git diff and recent commit history. Now I'll read any relevant files to better understand the context of these changes.\",\n },\n }\n\n // Step 3: Let AI decide which files to read and stage\n yield 'STEP'\n\n // Step 4: Let AI analyze staged changes and compose commit message\n yield {\n toolName: 'add_message',\n args: {\n role: 'assistant',\n content:\n \"Now I'll analyze the staged changes and create a commit with the proper Codebuff footer format.\",\n },\n }\n\n yield 'STEP_ALL'\n },\n}\n\nexport default definition\n", - "referencedBy": {} - }, - { - "path": "backend/src/templates/agents/base.ts", - "content": "import { AGENT_PERSONAS } from '@codebuff/common/constants/agents'\nimport { AgentTemplateTypes } from '@codebuff/common/types/session-state'\nimport z from 'zod/v4'\n\nimport {\n baseAgentAgentStepPrompt,\n baseAgentSystemPrompt,\n baseAgentUserInputPrompt,\n} from '../base-prompts'\n\nimport type { AgentTemplate } from '../types'\nimport type { Model } from '@codebuff/common/constants'\n\nexport const base = (\n model: Model,\n allAvailableAgents?: string[],\n): Omit => ({\n model,\n displayName: AGENT_PERSONAS.base.displayName,\n spawnPurposePrompt: AGENT_PERSONAS.base.purpose,\n inputSchema: {\n prompt: z.string().describe('A coding task to complete'),\n },\n outputMode: 'last_message',\n includeMessageHistory: false,\n toolNames: [\n 'create_plan',\n 'run_terminal_command',\n 'str_replace',\n 'write_file',\n 'spawn_agents',\n 'add_subgoal',\n 'browser_logs',\n 'code_search',\n 'end_turn',\n 'read_files',\n 'think_deeply',\n 'update_subgoal',\n ],\n spawnableAgents: allAvailableAgents\n ? (allAvailableAgents as any[])\n : [\n AgentTemplateTypes.file_explorer,\n AgentTemplateTypes.file_picker,\n AgentTemplateTypes.researcher,\n AgentTemplateTypes.thinker,\n AgentTemplateTypes.reviewer,\n ],\n\n systemPrompt: baseAgentSystemPrompt(model),\n instructionsPrompt: baseAgentUserInputPrompt(model),\n stepPrompt: baseAgentAgentStepPrompt(model),\n})\n", - "referencedBy": {} - }, - { - "path": "backend/src/templates/agents/thinking-base.ts", - "content": "import { AGENT_PERSONAS } from '@codebuff/common/constants/agents'\nimport z from 'zod/v4'\n\nimport {\n baseAgentAgentStepPrompt,\n baseAgentSystemPrompt,\n baseAgentUserInputPrompt,\n} from '../base-prompts'\nimport { baseAgentSubagents, baseAgentToolNames } from '../types'\n\nimport type { AgentTemplate } from '../types'\nimport type { Model } from '@codebuff/common/constants'\n\nexport const thinkingBase = (\n model: Model,\n allAvailableAgents?: string[],\n): Omit => ({\n model,\n displayName: AGENT_PERSONAS.base_lite.displayName,\n spawnPurposePrompt: AGENT_PERSONAS.base_lite.purpose,\n inputSchema: {\n prompt: z.string().describe('A coding task to complete'),\n },\n outputMode: 'last_message',\n includeMessageHistory: false,\n toolNames: baseAgentToolNames,\n spawnableAgents: allAvailableAgents\n ? (allAvailableAgents as any[])\n : baseAgentSubagents,\n\n systemPrompt: baseAgentSystemPrompt(model),\n instructionsPrompt: baseAgentUserInputPrompt(model),\n stepPrompt: baseAgentAgentStepPrompt(model),\n\n handleSteps: function* ({ agentState, prompt, params }) {\n while (true) {\n yield {\n toolName: 'spawn_agents',\n args: {\n agents: [\n {\n agent_type: 'thinker',\n prompt: 'Think deeply about the user request',\n },\n ],\n },\n }\n yield 'STEP'\n }\n },\n})\n", - "referencedBy": {} - }, - { - "path": "backend/src/templates/agents/file-picker.ts", - "content": "import { AGENT_PERSONAS } from '@codebuff/common/constants/agents'\nimport z from 'zod/v4'\n\nimport { PLACEHOLDER } from '../types'\n\nimport type { AgentTemplate } from '../types'\nimport type { Model } from '@codebuff/common/constants'\n\nexport const filePicker = (model: Model): Omit => ({\n model,\n displayName: AGENT_PERSONAS.file_picker.displayName,\n spawnPurposePrompt: AGENT_PERSONAS.file_picker.purpose,\n inputSchema: {\n prompt: z.string().describe('A coding task to complete'),\n },\n outputMode: 'last_message',\n includeMessageHistory: false,\n toolNames: ['find_files'],\n spawnableAgents: [],\n\n systemPrompt:\n `# Persona: ${PLACEHOLDER.AGENT_NAME}\n\nYou are an expert at finding relevant files in a codebase.\n\\n\\n` +\n [\n PLACEHOLDER.TOOLS_PROMPT,\n PLACEHOLDER.AGENTS_PROMPT,\n PLACEHOLDER.FILE_TREE_PROMPT,\n PLACEHOLDER.SYSTEM_INFO_PROMPT,\n PLACEHOLDER.GIT_CHANGES_PROMPT,\n ].join('\\n\\n'),\n instructionsPrompt: `\nProvide the locations in the codebase that could be helpful. Focus on the files that are most relevant to the user prompt.\nIn your report, please give an extremely concise analysis that includes the full paths of files that are relevant and (very briefly) how they could be useful.\n `.trim(),\n stepPrompt: `Do not use the find_files tool or any tools again. Just give your response.`,\n\n handleSteps: function* ({ agentState, prompt, params }) {\n yield {\n toolName: 'find_files',\n args: { prompt },\n }\n yield 'STEP_ALL'\n },\n})\n", - "referencedBy": {} - }, - { - "path": "backend/src/templates/agents/planner.ts", - "content": "import { AGENT_PERSONAS } from '@codebuff/common/constants/agents'\nimport { closeXml } from '@codebuff/common/util/xml'\nimport z from 'zod/v4'\n\nimport { PLACEHOLDER } from '../types'\n\nimport type { AgentTemplate } from '../types'\nimport type { Model } from '@codebuff/common/constants'\n\nexport const planner = (model: Model): Omit => ({\n model,\n displayName: AGENT_PERSONAS.planner.displayName,\n spawnPurposePrompt: AGENT_PERSONAS.planner.purpose,\n inputSchema: {\n prompt: z\n .string()\n .describe(\n 'What problem you to solve and a few ideas and suggestions for the plan',\n ),\n },\n outputMode: 'last_message',\n includeMessageHistory: true,\n toolNames: ['think_deeply', 'spawn_agents', 'end_turn'],\n spawnableAgents: [], // ARCHIVED: [AgentTemplateTypes.dry_run],\n\n systemPrompt: `# Persona: ${PLACEHOLDER.AGENT_NAME}\n\nYou are an expert software architect. You are good at creating comprehensive plans to tackle the user request.\n\n${PLACEHOLDER.TOOLS_PROMPT}\n\n${PLACEHOLDER.AGENTS_PROMPT}`,\n\n instructionsPrompt: `Steps for your response:\n1. Use the tool to think through cruxes for the plan, and tricky cases. Consider alternative approaches. Be sure to close the tool call with ${closeXml('think_deeply')}.\n2. Write out your plan in a concise way.\n3. Spawn 1-5 dry run agents to sketch portions of the implementation of the plan. (Important: do not forget to close the tool call with \"${closeXml('spawn_agents')}\"!)\n4. Synthesize all the information and rewrite the full plan to be the best it can be. Use the end_turn tool.`,\n\n stepPrompt:\n 'Do not forget to use the end_turn tool to end your response. Make sure the final plan is the best it can be.',\n})\n", - "referencedBy": {} - }, - { - "path": "backend/src/templates/agent-list.ts", - "content": "import { models } from '@codebuff/common/constants'\nimport { AgentTemplateTypes } from '@codebuff/common/types/session-state'\n\nimport { dryRun } from './agents/archive/dry-run'\nimport { ask } from './agents/ask'\nimport { base } from './agents/base'\nimport { fileExplorer } from './agents/file-explorer'\nimport { filePicker } from './agents/file-picker'\nimport { planner } from './agents/planner'\nimport { researcher } from './agents/researcher'\nimport { reviewer } from './agents/reviewer'\nimport { superagent } from './agents/superagent'\nimport { thinker } from './agents/thinker'\nimport { thinkingBase } from './agents/thinking-base'\n\nimport type { AgentTemplate } from './types'\nimport type { AgentTemplateType } from '@codebuff/common/types/session-state'\nimport { agentBuilder } from './agents/agent-builder'\n\nexport const agentTemplates: Record =\n {\n [AgentTemplateTypes.base]: {\n id: AgentTemplateTypes.base,\n ...base(models.openrouter_claude_sonnet_4),\n },\n [AgentTemplateTypes.base_lite]: {\n id: AgentTemplateTypes.base_lite,\n ...base(models.openrouter_gpt5),\n },\n [AgentTemplateTypes.base_max]: {\n id: AgentTemplateTypes.base_max,\n ...base(models.openrouter_claude_opus_4),\n },\n [AgentTemplateTypes.base_experimental]: {\n id: AgentTemplateTypes.base_experimental,\n ...base(models.gemini2_5_pro_preview),\n },\n [AgentTemplateTypes.ask]: {\n id: AgentTemplateTypes.ask,\n ...ask(models.gemini2_5_pro_preview),\n },\n [AgentTemplateTypes.superagent]: {\n id: AgentTemplateTypes.superagent,\n ...superagent(models.openrouter_claude_sonnet_4),\n },\n [AgentTemplateTypes.claude4_gemini_thinking]: {\n id: AgentTemplateTypes.claude4_gemini_thinking,\n ...thinkingBase(models.openrouter_claude_sonnet_4),\n },\n\n [AgentTemplateTypes.thinker]: {\n id: AgentTemplateTypes.thinker,\n ...thinker(models.openrouter_grok_4),\n },\n [AgentTemplateTypes.file_picker]: {\n id: AgentTemplateTypes.file_picker,\n ...filePicker(models.gemini2_5_flash),\n },\n [AgentTemplateTypes.researcher]: {\n id: AgentTemplateTypes.researcher,\n ...researcher(models.gemini2_5_flash),\n },\n [AgentTemplateTypes.planner]: {\n id: AgentTemplateTypes.planner,\n ...planner(models.openrouter_grok_4),\n },\n [AgentTemplateTypes.dry_run]: {\n id: AgentTemplateTypes.dry_run,\n ...dryRun(models.gemini2_5_flash),\n },\n [AgentTemplateTypes.reviewer]: {\n id: AgentTemplateTypes.reviewer,\n ...reviewer(models.gemini2_5_pro_preview),\n },\n [AgentTemplateTypes.agent_builder]: {\n id: AgentTemplateTypes.agent_builder,\n ...agentBuilder(models.openrouter_claude_sonnet_4),\n },\n [AgentTemplateTypes.file_explorer]: fileExplorer as any as AgentTemplate,\n }\n", - "referencedBy": {} - }, - { - "path": "backend/src/templates/agent-registry.ts", - "content": "import type { AgentTemplate } from '@codebuff/common/types/agent-template'\nimport db from '@codebuff/common/db'\nimport * as schema from '@codebuff/common/db/schema'\nimport { and, desc, eq } from 'drizzle-orm'\n\nimport { ProjectFileContext } from '@codebuff/common/util/file'\nimport { logger } from '../util/logger'\nimport { agentTemplates as staticTemplates } from './agent-list'\nimport {\n DynamicAgentValidationError,\n validateAgents,\n validateSingleAgent,\n} from '@codebuff/common/templates/agent-validation'\nimport { DynamicAgentTemplate } from '@codebuff/common/types/dynamic-agent-template'\n\nexport type AgentRegistry = Record\n\n// Global database cache - only state in the system\nconst databaseAgentCache = new Map()\n\n/**\n * Parse agent ID to extract publisher, agent name, and version\n */\nfunction parseAgentId(fullAgentId: string): {\n publisherId: string\n agentId: string\n version?: string\n} | null {\n // Check if it's in the publisher/agent-id[@version] format\n const parts = fullAgentId.split('/')\n if (parts.length !== 2) {\n return null\n }\n\n const [publisherId, agentNameWithVersion] = parts\n\n // Check for version suffix\n const versionMatch = agentNameWithVersion.match(/^(.+)@(.+)$/)\n if (versionMatch) {\n const [, agentId, version] = versionMatch\n return { publisherId, agentId, version }\n }\n\n return { publisherId, agentId: agentNameWithVersion }\n}\n\n/**\n * Fetch an agent from the database by publisher/agent-id[@version] format\n */\nasync function fetchAgentFromDatabase(parsedAgentId: {\n publisherId: string\n agentId: string\n version?: string\n}): Promise {\n const { publisherId, agentId, version } = parsedAgentId\n\n try {\n let agentConfig\n\n if (version && version !== 'latest') {\n // Query for specific version\n agentConfig = await db\n .select()\n .from(schema.agentConfig)\n .where(\n and(\n eq(schema.agentConfig.id, agentId),\n eq(schema.agentConfig.publisher_id, publisherId),\n eq(schema.agentConfig.version, version),\n ),\n )\n .then((rows) => rows[0])\n } else {\n // Query for latest version\n agentConfig = await db\n .select()\n .from(schema.agentConfig)\n .where(\n and(\n eq(schema.agentConfig.id, agentId),\n eq(schema.agentConfig.publisher_id, publisherId),\n ),\n )\n .orderBy(\n desc(schema.agentConfig.major),\n desc(schema.agentConfig.minor),\n desc(schema.agentConfig.patch),\n )\n .limit(1)\n .then((rows) => rows[0])\n }\n\n if (!agentConfig) {\n logger.debug(\n { publisherId, agentId, version },\n 'fetchAgentFromDatabase: Agent not found in database',\n )\n return null\n }\n\n const rawAgentData = agentConfig.data as DynamicAgentTemplate\n\n // Validate the raw agent data with the original agentId (not full identifier)\n const validationResult = validateSingleAgent(\n { ...rawAgentData, id: agentId },\n {\n filePath: `${publisherId}/${agentId}@${agentConfig.version}`,\n skipSubagentValidation: true,\n },\n )\n\n if (!validationResult.success) {\n logger.error(\n {\n publisherId,\n agentId,\n version: agentConfig.version,\n error: validationResult.error,\n },\n 'fetchAgentFromDatabase: Agent validation failed',\n )\n return null\n }\n\n // Set the correct full agent ID for the final template\n const agentTemplate = {\n ...validationResult.agentTemplate!,\n id: `${publisherId}/${agentId}@${agentConfig.version}`,\n }\n\n logger.debug(\n {\n publisherId,\n agentId,\n version: agentConfig.version,\n fullAgentId: agentTemplate.id,\n },\n 'fetchAgentFromDatabase: Successfully loaded and validated agent from database',\n )\n\n return agentTemplate\n } catch (error) {\n logger.error(\n { publisherId, agentId, version, error },\n 'fetchAgentFromDatabase: Error fetching agent from database',\n )\n return null\n }\n}\n\n/**\n * Single function to look up an agent template with clear priority order:\n * 1. localAgentTemplates (dynamic agents + static templates)\n * 2. Database cache\n * 3. Database query\n */\nexport async function getAgentTemplate(\n agentId: string,\n localAgentTemplates: Record,\n): Promise {\n // 1. Check localAgentTemplates first (dynamic agents + static templates)\n if (localAgentTemplates[agentId]) {\n return localAgentTemplates[agentId]\n }\n // 2. Check database cache\n const cacheKey = agentId\n if (databaseAgentCache.has(cacheKey)) {\n return databaseAgentCache.get(cacheKey) || null\n }\n\n const parsed = parseAgentId(agentId)\n if (!parsed) {\n logger.debug({ agentId }, 'getAgentTemplate: Failed to parse agent ID')\n return null\n }\n\n // 3. Query database (only for publisher/agent-id format)\n const dbAgent = await fetchAgentFromDatabase(parsed)\n if (dbAgent && parsed.version && parsed.version !== 'latest') {\n // Cache only specific versions to avoid stale 'latest' results\n databaseAgentCache.set(cacheKey, dbAgent)\n }\n return dbAgent\n}\n\n/**\n * Assemble local agent templates from fileContext + static templates\n */\nexport function assembleLocalAgentTemplates(fileContext: ProjectFileContext): {\n agentTemplates: Record\n validationErrors: DynamicAgentValidationError[]\n} {\n // Load dynamic agents using the service\n const { templates: dynamicTemplates, validationErrors } = validateAgents(\n fileContext.agentTemplates || {},\n )\n\n // Combine static and dynamic templates\n const agentTemplates = { ...staticTemplates, ...dynamicTemplates }\n\n return { agentTemplates, validationErrors }\n}\n\n/**\n * Clear the database agent cache (useful for testing)\n */\nexport function clearDatabaseCache(): void {\n databaseAgentCache.clear()\n}\n", - "referencedBy": {} - }, - { - "path": "common/src/templates/dynamic-agent-template.ts", - "content": "[FILE_DOES_NOT_EXIST]", - "referencedBy": {} - }, - { - "path": "common/src/types/agent-template.ts", - "content": "import type { Model } from '../constants'\nimport type { AgentState, AgentTemplateType } from './session-state'\nimport type { ToolName } from '../tools/constants'\nimport type { ToolCall } from '../util/types/agent-definition'\nimport type { z } from 'zod/v4'\n\nexport type AgentTemplate<\n P = string | undefined,\n T = Record | undefined,\n> = {\n id: AgentTemplateType\n displayName: string\n model: Model\n\n toolNames: ToolName[]\n spawnableAgents: AgentTemplateType[]\n\n spawnPurposePrompt?: string\n systemPrompt: string\n instructionsPrompt: string\n stepPrompt: string\n parentInstructions?: Record\n\n // Required parameters for spawning this agent.\n inputSchema: {\n prompt?: z.ZodSchema

\n params?: z.ZodSchema\n }\n includeMessageHistory: boolean\n outputMode: 'last_message' | 'all_messages' | 'structured_output'\n outputSchema?: z.ZodSchema\n\n handleSteps?: StepHandler | string // Function or string of the generator code for running in a sandbox\n}\n\nexport type StepGenerator = Generator<\n Omit | 'STEP' | 'STEP_ALL', // Generic tool call type\n void,\n { agentState: AgentState; toolResult: string | undefined }\n>\n\nexport type StepHandler<\n P = string | undefined,\n T = Record | undefined,\n> = (params: { agentState: AgentState; prompt: P; params: T }) => StepGenerator\n", - "referencedBy": {} - }, - { - "path": "common/src/templates/agent-validation.ts", - "content": "import { convertJsonSchemaToZod } from 'zod-from-json-schema'\n\nimport {\n formatSpawnableAgentError,\n validateSpawnableAgents,\n} from '../util/agent-template-validation'\nimport { logger } from '../util/logger'\nimport {\n DynamicAgentDefinitionSchema,\n DynamicAgentTemplateSchema,\n} from '../types/dynamic-agent-template'\nimport type { AgentTemplate } from '../types/agent-template'\nimport type { DynamicAgentTemplate } from '../types/dynamic-agent-template'\n\nexport interface DynamicAgentValidationError {\n filePath: string\n message: string\n}\n\n/**\n * Collect all agent IDs from template files without full validation\n */\nexport function collectAgentIds(\n agentTemplates: Record = {},\n): string[] {\n const agentIds: string[] = []\n const jsonFiles = Object.keys(agentTemplates)\n\n for (const filePath of jsonFiles) {\n try {\n const content = agentTemplates[filePath]\n if (!content) {\n continue\n }\n\n // Extract the agent ID if it exists\n if (content.id && typeof content.id === 'string') {\n agentIds.push(content.id)\n }\n } catch (error) {\n // Log but don't fail the collection process for other errors\n logger.debug(\n { filePath, error },\n 'Failed to extract agent ID during collection phase',\n )\n }\n }\n\n return agentIds\n}\n\n/**\n * Validate and load dynamic agent templates from user-provided agentTemplates\n */\nexport function validateAgents(agentTemplates: Record = {}): {\n templates: Record\n validationErrors: DynamicAgentValidationError[]\n} {\n const templates: Record = {}\n const validationErrors: DynamicAgentValidationError[] = []\n\n const hasAgentTemplates = Object.keys(agentTemplates).length > 0\n\n if (!hasAgentTemplates) {\n return {\n templates,\n validationErrors,\n }\n }\n\n const agentKeys = Object.keys(agentTemplates)\n\n // Pass 1: Collect all agent IDs from template files\n const dynamicAgentIds = collectAgentIds(agentTemplates)\n\n // Pass 2: Load and validate each agent template\n for (const agentKey of agentKeys) {\n const content = agentTemplates[agentKey]\n try {\n if (!content) {\n continue\n }\n\n const validationResult = validateSingleAgent(content, {\n filePath: agentKey,\n dynamicAgentIds,\n })\n\n if (!validationResult.success) {\n validationErrors.push({\n filePath: agentKey,\n message: validationResult.error!,\n })\n continue\n }\n\n if (templates[validationResult.agentTemplate!.id]) {\n const agentContext = validationResult.agentTemplate!.displayName\n ? `Agent \"${validationResult.agentTemplate!.id}\" (${validationResult.agentTemplate!.displayName})`\n : `Agent \"${validationResult.agentTemplate!.id}\"`\n\n validationErrors.push({\n filePath: agentKey,\n message: `${agentContext}: Duplicate agent ID`,\n })\n continue\n }\n templates[validationResult.agentTemplate!.id] =\n validationResult.agentTemplate!\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : 'Unknown error'\n\n // Try to extract agent context for better error messages\n const agentContext = content?.id\n ? `Agent \"${content.id}\"${content.displayName ? ` (${content.displayName})` : ''}`\n : `Agent in ${agentKey}`\n\n validationErrors.push({\n filePath: agentKey,\n message: `${agentContext}: ${errorMessage}`,\n })\n\n logger.warn(\n { filePath: agentKey, error: errorMessage },\n 'Failed to load dynamic agent template',\n )\n }\n }\n\n return {\n templates,\n validationErrors,\n }\n}\n\n/**\n * Validates a single dynamic agent template and converts it to an AgentTemplate.\n * This is a plain function equivalent to the core logic of loadSingleAgent.\n *\n * @param dynamicAgentIds - Array of all available dynamic agent IDs for validation\n * @param template - The raw agent template to validate (any type)\n * @param options - Optional configuration object\n * @param options.filePath - Optional file path for error context\n * @param options.skipSubagentValidation - Skip subagent validation when loading from database\n * @returns Validation result with either the converted AgentTemplate or an error\n */\nexport function validateSingleAgent(\n template: any,\n options?: {\n dynamicAgentIds?: string[]\n filePath?: string\n skipSubagentValidation?: boolean\n },\n): {\n success: boolean\n agentTemplate?: AgentTemplate\n error?: string\n} {\n const {\n filePath,\n skipSubagentValidation = true,\n dynamicAgentIds = [],\n } = options || {}\n\n try {\n // First validate against the Zod schema\n let validatedConfig: DynamicAgentTemplate\n try {\n const typedAgentDefinition = DynamicAgentDefinitionSchema.parse(template)\n\n // Convert handleSteps function to string if present\n let handleStepsString: string | undefined\n if (template.handleSteps) {\n handleStepsString = template.handleSteps.toString()\n }\n\n validatedConfig = DynamicAgentTemplateSchema.parse({\n ...typedAgentDefinition,\n systemPrompt: typedAgentDefinition.systemPrompt || '',\n instructionsPrompt: typedAgentDefinition.instructionsPrompt || '',\n stepPrompt: typedAgentDefinition.stepPrompt || '',\n handleSteps: handleStepsString,\n })\n } catch (error: any) {\n // Try to extract agent context for better error messages\n const agentContext = template.id\n ? `Agent \"${template.id}\"${template.displayName ? ` (${template.displayName})` : ''}`\n : filePath\n ? `Agent in ${filePath}`\n : 'Agent'\n\n return {\n success: false,\n error: `${agentContext}: Schema validation failed: ${error.message}`,\n }\n }\n\n // Validate spawnable agents (skip if requested, e.g., for database agents)\n if (!skipSubagentValidation) {\n const spawnableAgentValidation = validateSpawnableAgents(\n validatedConfig.spawnableAgents,\n dynamicAgentIds,\n )\n if (!spawnableAgentValidation.valid) {\n return {\n success: false,\n error: formatSpawnableAgentError(\n spawnableAgentValidation.invalidAgents,\n spawnableAgentValidation.availableAgents,\n ),\n }\n }\n }\n\n // Convert schemas and handle validation errors\n let inputSchema: AgentTemplate['inputSchema']\n try {\n inputSchema = convertInputSchema(\n validatedConfig.inputSchema?.prompt,\n validatedConfig.inputSchema?.params,\n filePath,\n )\n } catch (error) {\n // Try to extract agent context for better error messages\n const agentContext = validatedConfig.id\n ? `Agent \"${validatedConfig.id}\"${validatedConfig.displayName ? ` (${validatedConfig.displayName})` : ''}`\n : filePath\n ? `Agent in ${filePath}`\n : 'Agent'\n return {\n success: false,\n error: `${agentContext}: ${\n error instanceof Error ? error.message : 'Schema conversion failed'\n }`,\n }\n }\n\n // Convert outputSchema if present\n let outputSchema: AgentTemplate['outputSchema']\n if (validatedConfig.outputSchema) {\n try {\n outputSchema = convertJsonSchemaToZod(validatedConfig.outputSchema)\n } catch (error) {\n // Try to extract agent context for better error messages\n const agentContext = validatedConfig.id\n ? `Agent \"${validatedConfig.id}\"${validatedConfig.displayName ? ` (${validatedConfig.displayName})` : ''}`\n : filePath\n ? `Agent in ${filePath}`\n : 'Agent'\n\n return {\n success: false,\n error: `${agentContext}: Failed to convert outputSchema to Zod: ${error instanceof Error ? error.message : 'Unknown error'}`,\n }\n }\n }\n\n // Validate handleSteps if present\n if (validatedConfig.handleSteps) {\n if (!isValidGeneratorFunction(validatedConfig.handleSteps)) {\n // Try to extract agent context for better error messages\n const agentContext = validatedConfig.id\n ? `Agent \"${validatedConfig.id}\"${validatedConfig.displayName ? ` (${validatedConfig.displayName})` : ''}`\n : filePath\n ? `Agent in ${filePath}`\n : 'Agent'\n\n return {\n success: false,\n error: `${agentContext}: handleSteps must be a generator function: \"function* (params) { ... }\". Found: ${validatedConfig.handleSteps.substring(0, 50)}...`,\n }\n }\n }\n\n // Convert to internal AgentTemplate format\n const agentTemplate: AgentTemplate = {\n ...validatedConfig,\n outputSchema,\n inputSchema,\n }\n\n return {\n success: true,\n agentTemplate,\n }\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : 'Unknown error'\n\n // Try to extract agent context for better error messages\n const agentContext = template?.id\n ? `Agent \"${template.id}\"${template.displayName ? ` (${template.displayName})` : ''}`\n : filePath\n ? `Agent in ${filePath}`\n : 'Agent'\n\n return {\n success: false,\n error: `${agentContext}: Error validating agent template: ${errorMessage}`,\n }\n }\n}\n\n/**\n * Validates if a string represents a valid generator function\n */\nfunction isValidGeneratorFunction(code: string): boolean {\n const trimmed = code.trim()\n // Check if it's a generator function (must start with function*)\n return trimmed.startsWith('function*')\n}\n\n/**\n * Convert JSON schema to Zod schema format using json-schema-to-zod.\n * This is done once during loading to avoid repeated conversions.\n * Throws descriptive errors for validation failures.\n */\nfunction convertInputSchema(\n inputPromptSchema?: Record,\n paramsSchema?: Record,\n filePath?: string,\n): AgentTemplate['inputSchema'] {\n const result: any = {}\n const fileContext = filePath ? ` in ${filePath}` : ''\n\n // Handle prompt schema\n if (inputPromptSchema) {\n try {\n if (\n typeof inputPromptSchema !== 'object' ||\n Object.keys(inputPromptSchema).length === 0\n ) {\n throw new Error(\n `Invalid inputSchema.prompt${fileContext}: Schema must be a valid non-empty JSON schema object. Found: ${typeof inputPromptSchema}`,\n )\n }\n const promptZodSchema = convertJsonSchemaToZod(inputPromptSchema)\n // Validate that the schema results in string or undefined\n const testResult = promptZodSchema.safeParse('test')\n const testUndefined = promptZodSchema.safeParse(undefined)\n\n if (!testResult.success && !testUndefined.success) {\n const errorDetails =\n testResult.error?.issues?.[0]?.message || 'validation failed'\n throw new Error(\n `Invalid inputSchema.prompt${fileContext}: Schema must allow string or undefined values. ` +\n `Current schema validation error: ${errorDetails}. ` +\n `Please ensure your JSON schema accepts string types.`,\n )\n }\n\n result.prompt = promptZodSchema\n } catch (error) {\n if (error instanceof Error && error.message.includes('inputSchema')) {\n // Re-throw our custom validation errors\n throw error\n }\n\n // Handle json-schema-to-zod conversion errors\n const errorMessage =\n error instanceof Error ? error.message : 'Unknown error'\n throw new Error(\n `Failed to convert inputSchema.prompt to Zod${fileContext}: ${errorMessage}. ` +\n `Please check that your inputSchema.prompt is a valid non-empty JSON schema object.`,\n )\n }\n }\n\n // Handle params schema\n if (paramsSchema) {\n try {\n if (\n typeof paramsSchema !== 'object' ||\n Object.keys(paramsSchema).length === 0\n ) {\n throw new Error(\n `Invalid inputSchema.params${fileContext}: Schema must be a valid non-empty JSON schema object. Found: ${typeof paramsSchema}`,\n )\n }\n const paramsZodSchema = convertJsonSchemaToZod(paramsSchema)\n result.params = paramsZodSchema\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : 'Unknown error'\n throw new Error(\n `Failed to convert inputSchema.params to Zod${fileContext}: ${errorMessage}. ` +\n `Please check that your inputSchema.params is a valid non-empty JSON schema object.`,\n )\n }\n }\n return result\n}\n", - "referencedBy": {} - }, - { - "path": "npm-app/src/agents/load-agents.ts", - "content": "import * as fs from 'fs'\nimport * as path from 'path'\n\nimport { cyan, green } from 'picocolors'\n\nimport { getAllTsFiles, getAgentsDirectory } from './agent-utils'\n\nimport type { CodebuffConfig } from '@codebuff/common/json-config/constants'\n\nexport let loadedAgents: Record = {}\nexport async function loadLocalAgents({\n verbose = false,\n}: {\n verbose?: boolean\n}): Promise {\n loadedAgents = {}\n\n const agentsDir = getAgentsDirectory()\n\n if (!fs.existsSync(agentsDir)) {\n return loadedAgents\n }\n\n try {\n const tsFiles = getAllTsFiles(agentsDir)\n\n for (const fullPath of tsFiles) {\n const relativePath = path.relative(agentsDir, fullPath)\n const fileName = relativePath.replace(/\\.ts$/, '').replace(/[/\\\\]/g, '-')\n\n let agentDefinition: any\n let agentModule: any\n try {\n agentModule = await require(fullPath)\n } catch (error: any) {\n if (verbose) {\n console.error('Error importing agent:', error)\n }\n continue\n }\n delete require.cache[fullPath]\n\n try {\n agentDefinition = agentModule.default\n } catch (error: any) {\n console.error('Error loading agent from file:', fullPath, error)\n continue\n }\n\n if (!agentDefinition) continue\n\n // Convert handleSteps function to string if present\n let processedAgentDefinition = { ...agentDefinition }\n\n if (agentDefinition.handleSteps) {\n processedAgentDefinition.handleSteps =\n agentDefinition.handleSteps.toString()\n }\n\n loadedAgents[fileName] = processedAgentDefinition\n }\n } catch (error) {}\n return loadedAgents\n}\n\nexport function getLoadedAgentNames(): Record {\n return Object.fromEntries(\n Object.entries(loadedAgents).map(([agentType, agentConfig]) => {\n return [agentType, agentConfig.displayName]\n }),\n )\n}\n\n/**\n * Display loaded agents to the user\n */\nexport function displayLoadedAgents(codebuffConfig: CodebuffConfig) {\n const baseAgent = codebuffConfig.baseAgent\n if (baseAgent) {\n console.log(`\\n${green('Configured base agent:')} ${cyan(baseAgent)}`)\n }\n\n const spawnableAgents = codebuffConfig.spawnableAgents\n if (spawnableAgents) {\n console.log(\n `${green('Configured spawnable agents:')} ${spawnableAgents\n .map((name) => cyan(name))\n .join(', ')}\\n`,\n )\n } else if (Object.keys(loadedAgents).length > 0) {\n const loadedAgentNames = Object.values(getLoadedAgentNames())\n console.log(\n `\\n${green('Found custom agents:')} ${loadedAgentNames\n .map((name) => cyan(name))\n .join(', ')}\\n`,\n )\n } else if (baseAgent) {\n // One more new line.\n console.log()\n }\n}\n", - "referencedBy": {} - }, - { - "path": "npm-app/src/cli-handlers/agents.ts", - "content": "import * as fs from 'fs'\nimport * as path from 'path'\n\nimport { AGENT_TEMPLATES_DIR } from '@codebuff/common/constants'\nimport { AgentTemplateTypes } from '@codebuff/common/types/session-state'\nimport {\n filterCustomAgentFiles,\n extractAgentIdFromFileName,\n} from '@codebuff/common/util/agent-file-utils'\nimport { green, yellow, cyan, magenta, bold, gray, red } from 'picocolors'\n\nimport { loadLocalAgents, getLoadedAgentNames } from '../agents/load-agents'\nimport { CLI } from '../cli'\nimport { getProjectRoot } from '../project-files'\nimport { Spinner } from '../utils/spinner'\nimport {\n ENTER_ALT_BUFFER,\n EXIT_ALT_BUFFER,\n CLEAR_SCREEN,\n HIDE_CURSOR,\n SHOW_CURSOR,\n} from '../utils/terminal'\n\nlet isInAgentsBuffer = false\nlet originalKeyHandlers: ((str: string, key: any) => void)[] = []\nlet selectedIndex = 0\nlet scrollOffset = 0\nlet allContentLines: string[] = []\nlet agentLinePositions: number[] = []\nlet agentList: Array<{\n id: string\n name: string\n description?: string\n isBuiltIn: boolean\n filePath?: string\n isCreateNew?: boolean\n isEditAgent?: boolean\n isSeparator?: boolean\n isPlaceholder?: boolean\n isSectionHeader?: boolean\n}> = []\n\nexport function isInAgentsMode(): boolean {\n return isInAgentsBuffer\n}\n\nexport async function enterAgentsBuffer(rl: any, onExit: () => void) {\n if (isInAgentsBuffer) {\n console.log(yellow('Already in agents mode!'))\n return\n }\n\n // Load local agents\n await loadLocalAgents({ verbose: false })\n const localAgents = getLoadedAgentNames()\n\n // Build management actions section with header\n const actions: typeof agentList = [\n {\n id: '__header__',\n name: bold(cyan('Actions')),\n description: '',\n isBuiltIn: false,\n isSectionHeader: true,\n },\n {\n id: '__create_new__',\n name: '+ Create New Agent',\n description: 'Create a new custom agent template',\n isBuiltIn: false,\n isCreateNew: true,\n },\n ]\n\n // Get custom agent files for display purposes\n const agentsDir = path.join(getProjectRoot(), AGENT_TEMPLATES_DIR)\n let customAgentFiles: string[] = []\n if (fs.existsSync(agentsDir)) {\n const files = fs.readdirSync(agentsDir)\n customAgentFiles = filterCustomAgentFiles(files)\n }\n\n // Add agents section header\n actions.push({\n id: '__agents_header__',\n name:\n bold(cyan('Custom Agents')) +\n gray(` • ${customAgentFiles.length} in ${AGENT_TEMPLATES_DIR}`),\n description: '',\n isBuiltIn: false,\n isSectionHeader: true,\n })\n\n // Build agent list starting with management actions\n agentList = [...actions]\n\n // Add custom agents from .agents/templates\n if (customAgentFiles.length > 0) {\n for (const file of customAgentFiles) {\n const agentId = extractAgentIdFromFileName(file)\n const agentName = localAgents[agentId] || agentId\n agentList.push({\n id: agentId,\n name: agentName,\n description: 'Custom user-defined agent',\n isBuiltIn: false,\n filePath: path.join(agentsDir, file),\n })\n }\n } else {\n // If no custom agents, add a helpful message\n agentList.push({\n id: '__no_agents__',\n name: gray('No custom agents found'),\n description: 'Use \"Create New Agent\" above to get started',\n isBuiltIn: false,\n isPlaceholder: true,\n })\n }\n\n // No need for special handling here since we now have a proper placeholder\n\n // Initialize selection to first selectable item\n selectedIndex = 0\n // Find first selectable item (skip section headers, separators, placeholders)\n while (\n selectedIndex < agentList.length &&\n (agentList[selectedIndex]?.isSectionHeader ||\n agentList[selectedIndex]?.isSeparator ||\n agentList[selectedIndex]?.isPlaceholder)\n ) {\n selectedIndex++\n }\n // If no selectable items found, default to 0\n if (selectedIndex >= agentList.length) {\n selectedIndex = 0\n }\n scrollOffset = 0\n\n // Enter alternate screen buffer\n process.stdout.write(ENTER_ALT_BUFFER)\n process.stdout.write(CLEAR_SCREEN)\n process.stdout.write(HIDE_CURSOR)\n\n isInAgentsBuffer = true\n\n // Build content and render\n buildAllContentLines()\n centerSelectedItem()\n renderAgentsList()\n\n // Set up key handler\n setupAgentsKeyHandler(rl, onExit)\n}\n\nexport function exitAgentsBuffer(rl: any) {\n if (!isInAgentsBuffer) {\n return\n }\n\n // Reset state\n selectedIndex = 0\n scrollOffset = 0\n allContentLines = []\n agentLinePositions = []\n agentList = []\n\n // Restore all original key handlers\n if (originalKeyHandlers.length > 0) {\n process.stdin.removeAllListeners('keypress')\n originalKeyHandlers.forEach((handler) => {\n process.stdin.on('keypress', handler)\n })\n originalKeyHandlers = []\n }\n\n // Exit alternate screen buffer\n process.stdout.write(SHOW_CURSOR)\n process.stdout.write(EXIT_ALT_BUFFER)\n\n isInAgentsBuffer = false\n}\n\nfunction centerSelectedItem() {\n if (selectedIndex < 0 || selectedIndex >= agentLinePositions.length) {\n return\n }\n\n const terminalHeight = process.stdout.rows || 24\n const terminalWidth = process.stdout.columns || 80\n const headerHeight = getHeaderLines(terminalWidth).length\n const maxScrollableLines = terminalHeight - headerHeight - 2\n const selectedLineIndex = agentLinePositions[selectedIndex]\n const maxScrollOffset = Math.max(\n 0,\n allContentLines.length - maxScrollableLines,\n )\n\n // Center item in the scrollable viewport\n const centerOffset = selectedLineIndex - Math.floor(maxScrollableLines / 2)\n scrollOffset = Math.max(0, Math.min(maxScrollOffset, centerOffset))\n}\n\nconst getHeaderLines = (terminalWidth: number) => [\n // No header - sections will be labeled inline\n]\n\nfunction buildAllContentLines() {\n const terminalWidth = process.stdout.columns || 80\n const lines: string[] = []\n agentLinePositions = []\n\n if (agentList.length === 0) {\n lines.push(yellow('No agents found.'))\n } else {\n for (let i = 0; i < agentList.length; i++) {\n agentLinePositions.push(lines.length)\n const agent = agentList[i]\n const isSelected = i === selectedIndex\n\n // Handle section headers\n if (agent.isSectionHeader) {\n const cleanName = agent.name.replace(/\\u001b\\[[0-9;]*m/g, '')\n const cleanDescription = agent.description\n ? agent.description.replace(/\\u001b\\[[0-9;]*m/g, '')\n : ''\n const availableWidth = terminalWidth - 4 // Account for padding\n\n if (isSelected) {\n const headerWidth = Math.min(terminalWidth - 6, 60)\n lines.push(` ${cyan('┌' + '─'.repeat(headerWidth + 2) + '┐')}`)\n\n // Right-aligned title with separator line\n const titlePadding = Math.max(0, headerWidth - cleanName.length - 4)\n const separatorLine = '─'.repeat(titlePadding)\n lines.push(\n ` ${cyan('│')} ${gray(separatorLine)} ${agent.name} ${cyan('│')}`,\n )\n\n if (agent.description) {\n const descPadding = Math.max(\n 0,\n headerWidth - cleanDescription.length,\n )\n lines.push(\n ` ${cyan('│')} ${agent.description}${' '.repeat(descPadding)} ${cyan('│')}`,\n )\n }\n lines.push(` ${cyan('└' + '─'.repeat(headerWidth + 2) + '┘')}`)\n } else {\n // Right-aligned title with separator line for unselected\n const titlePadding = Math.max(\n 0,\n availableWidth - cleanName.length - 4,\n )\n const separatorLine = gray('─'.repeat(titlePadding))\n lines.push(` ${separatorLine} ${agent.name}`)\n\n if (agent.description) {\n lines.push(` ${agent.description}`)\n }\n }\n if (i < agentList.length - 1) {\n lines.push('') // Empty line after section header\n }\n continue\n }\n\n // Handle separator (keep for backwards compatibility)\n if (agent.isSeparator) {\n if (isSelected) {\n lines.push(` ${cyan('┌' + '─'.repeat(52) + '┐')}`)\n lines.push(` ${cyan('│')} ${gray(agent.name)} ${cyan('│')}`)\n lines.push(` ${cyan('└' + '─'.repeat(52) + '┘')}`)\n } else {\n lines.push(` ${gray(agent.name)}`)\n }\n if (i < agentList.length - 1) {\n lines.push('') // Empty line after separator\n }\n continue\n }\n\n // Handle placeholder\n if (agent.isPlaceholder) {\n if (isSelected) {\n const boxWidth = Math.min(terminalWidth - 6, 50)\n lines.push(` ${cyan('┌' + '─'.repeat(boxWidth + 2) + '┐')}`)\n lines.push(\n ` ${cyan('│')} ${agent.name} ${' '.repeat(Math.max(0, boxWidth - agent.name.replace(/\\u001b\\[[0-9;]*m/g, '').length))} ${cyan('│')}`,\n )\n lines.push(\n ` ${cyan('│')} ${gray(agent.description || '')} ${' '.repeat(Math.max(0, boxWidth - (agent.description || '').length))} ${cyan('│')}`,\n )\n lines.push(` ${cyan('└' + '─'.repeat(boxWidth + 2) + '┘')}`)\n } else {\n lines.push(` ${agent.name}`)\n lines.push(` ${gray(agent.description || '')}`)\n }\n if (i < agentList.length - 1) {\n lines.push('') // Empty line between items\n }\n continue\n }\n\n // Regular agent items\n const agentInfo =\n agent.isCreateNew || agent.isEditAgent\n ? `${agent.isCreateNew ? green(agent.name) : magenta(agent.name)}`\n : `${bold(agent.name)} ${gray(`(${agent.id})`)}`\n const description = agent.description || 'No description'\n const filePath = agent.filePath\n ? gray(`File: ${path.relative(getProjectRoot(), agent.filePath)}`)\n : ''\n\n const contentForBox = [\n agentInfo,\n gray(description),\n ...(filePath ? [filePath] : []),\n ]\n\n if (isSelected) {\n // Calculate box width based on content\n const maxContentWidth = Math.max(\n ...contentForBox.map(\n (line) => line.replace(/\\u001b\\[[0-9;]*m/g, '').length,\n ),\n )\n const boxWidth = Math.min(terminalWidth - 6, maxContentWidth)\n\n // Add top border\n lines.push(` ${cyan('┌' + '─'.repeat(boxWidth + 2) + '┐')}`)\n\n // Add content lines with proper padding - keep same indentation as unselected\n contentForBox.forEach((line) => {\n const cleanLine = line.replace(/\\u001b\\[[0-9;]*m/g, '')\n const padding = ' '.repeat(Math.max(0, boxWidth - cleanLine.length))\n lines.push(` ${cyan('│')} ${line}${padding} ${cyan('│')}`)\n })\n\n // Add bottom border\n lines.push(` ${cyan('└' + '─'.repeat(boxWidth + 2) + '┘')}`)\n } else {\n // Non-selected items - use same base indentation as selected content\n lines.push(` ${agentInfo}`) // 4 spaces to match selected content position\n lines.push(` ${gray(description)}`)\n if (filePath) {\n lines.push(` ${filePath}`)\n }\n }\n\n if (i < agentList.length - 1) {\n lines.push('') // Empty line between items\n }\n }\n }\n\n allContentLines = lines\n}\n\nfunction renderAgentsList() {\n // Build all content if not already built\n buildAllContentLines()\n\n // Clear screen and move cursor to top\n process.stdout.write(CLEAR_SCREEN)\n\n const terminalHeight = process.stdout.rows || 24\n const terminalWidth = process.stdout.columns || 80\n\n // Render fixed header\n const headerLines = getHeaderLines(terminalWidth)\n process.stdout.write(headerLines.join('\\n'))\n process.stdout.write('\\n')\n\n // Render scrollable content\n const maxScrollableLines = terminalHeight - headerLines.length - 2\n const visibleLines = allContentLines.slice(\n scrollOffset,\n scrollOffset + maxScrollableLines,\n )\n\n // Display scrollable content\n process.stdout.write(visibleLines.join('\\n'))\n\n // Add padding to fill remaining space\n const remainingLines = maxScrollableLines - visibleLines.length\n if (remainingLines > 0) {\n process.stdout.write('\\n'.repeat(remainingLines))\n }\n\n // Display status line at bottom\n const statusLine = `\\n${gray(`Use ↑/↓/j/k to navigate, Enter to select, ESC to go back`)}`\n\n process.stdout.write(statusLine)\n process.stdout.write(HIDE_CURSOR)\n}\n\nfunction setupAgentsKeyHandler(rl: any, onExit: () => void) {\n // Store all original key handlers\n const listeners = process.stdin.listeners('keypress')\n originalKeyHandlers = listeners as ((str: string, key: any) => void)[]\n\n // Remove existing keypress listeners\n process.stdin.removeAllListeners('keypress')\n\n // Add our custom handler\n process.stdin.on('keypress', (str: string, key: any) => {\n if (key && key.name === 'escape') {\n exitAgentsBuffer(rl)\n onExit()\n return\n }\n\n // Handle Ctrl+C - exit to main screen\n if (key && key.ctrl && key.name === 'c') {\n exitAgentsBuffer(rl)\n onExit()\n return\n }\n\n // Handle Enter - switch to selected agent, create new, or edit\n if (key && key.name === 'return') {\n if (agentList.length > 0 && selectedIndex < agentList.length) {\n const selectedAgent = agentList[selectedIndex]\n\n // Skip separators, placeholders, and section headers\n if (\n selectedAgent.isSeparator ||\n selectedAgent.isPlaceholder ||\n selectedAgent.isSectionHeader\n ) {\n return\n }\n\n if (selectedAgent.isCreateNew) {\n exitAgentsBuffer(rl)\n startDirectAgentCreation(onExit)\n } else {\n exitAgentsBuffer(rl)\n // Start spinner for agent switching\n Spinner.get().start(`Switching to agent: ${selectedAgent.name}...`)\n\n // Use resetAgent to switch to the selected agent\n const cliInstance = CLI.getInstance()\n cliInstance\n .resetAgent(selectedAgent.id)\n .then(() => {\n cliInstance.freshPrompt()\n })\n .catch((error) => {\n Spinner.get().stop()\n console.error(red('Error switching to agent:'), error)\n onExit()\n })\n }\n }\n return\n }\n\n // Handle navigation - skip separators, placeholders, and section headers\n if (key && (key.name === 'up' || key.name === 'k')) {\n let newIndex = selectedIndex - 1\n while (\n newIndex >= 0 &&\n (agentList[newIndex]?.isSeparator ||\n agentList[newIndex]?.isPlaceholder ||\n agentList[newIndex]?.isSectionHeader)\n ) {\n newIndex--\n }\n if (newIndex >= 0) {\n selectedIndex = newIndex\n centerSelectedItem()\n }\n\n renderAgentsList()\n return\n }\n if (key && (key.name === 'down' || key.name === 'j')) {\n let newIndex = selectedIndex + 1\n while (\n newIndex < agentList.length &&\n (agentList[newIndex]?.isSeparator ||\n agentList[newIndex]?.isPlaceholder ||\n agentList[newIndex]?.isSectionHeader)\n ) {\n newIndex++\n }\n if (newIndex < agentList.length) {\n selectedIndex = newIndex\n centerSelectedItem()\n renderAgentsList()\n }\n return\n }\n\n if (key && key.name === 'pageup') {\n const newIndex = Math.max(0, selectedIndex - 5)\n if (newIndex !== selectedIndex) {\n selectedIndex = newIndex\n centerSelectedItem()\n renderAgentsList()\n }\n return\n }\n\n if (key && key.name === 'pagedown') {\n const newIndex = Math.min(agentList.length - 1, selectedIndex + 5)\n if (newIndex !== selectedIndex) {\n selectedIndex = newIndex\n centerSelectedItem()\n renderAgentsList()\n }\n return\n }\n\n if (key && key.name === 'home') {\n if (selectedIndex !== 0) {\n selectedIndex = 0\n centerSelectedItem()\n renderAgentsList()\n }\n return\n }\n\n if (key && key.name === 'end') {\n if (selectedIndex !== agentList.length - 1) {\n selectedIndex = agentList.length - 1\n centerSelectedItem()\n renderAgentsList()\n }\n return\n }\n })\n\n // Ensure raw mode for immediate key detection\n if (process.stdin.isTTY) {\n process.stdin.setRawMode(true)\n }\n}\n\nasync function startDirectAgentCreation(onExit: () => void) {\n // Switch to agent-builder which automatically spawns Bob the Agent Builder for agent creation\n const prompt = `Create a new custom agent template for me. Please ask me what kind of agent I'd like to create and help me build it.`\n\n console.log(\n green(\n '\\n🤖 Starting agent creation with Buffy the Enthusiastic Agent Builder...',\n ),\n )\n console.log(\n gray(\n 'Buffy will connect you with Bob the Agent Builder to create your custom agent.',\n ),\n )\n\n try {\n const cliInstance = CLI.getInstance()\n // Switch to agent-builder which automatically spawns the agent builder for agent creation\n await cliInstance.resetAgent(\n AgentTemplateTypes.agent_builder,\n undefined,\n prompt,\n )\n cliInstance.freshPrompt()\n } catch (error) {\n console.error(red('Error starting agent creation:'), error)\n }\n\n onExit()\n}\n\n// Cleanup function\nexport function cleanupAgentsBuffer() {\n if (isInAgentsBuffer) {\n process.stdout.write(SHOW_CURSOR)\n process.stdout.write(EXIT_ALT_BUFFER)\n isInAgentsBuffer = false\n }\n\n // Restore normal terminal mode\n if (process.stdin.isTTY) {\n process.stdin.setRawMode(false)\n }\n // Register cleanup on process exit\n process.on('exit', cleanupAgentsBuffer)\n process.on('SIGINT', cleanupAgentsBuffer)\n process.on('SIGTERM', cleanupAgentsBuffer)\n}\n", - "referencedBy": {} - } - ] - } - ], - "parentAgentId": "D-OfaYSx8-Q" - }, - { - "type": "text", - "agentId": "D-OfY8_NY2s", - "text": "backend/src/templates/agents/agent-builder.ts\nbackend/src/templates/agent-registry.ts\nbackend/src/templates/agent-list.ts\nbackend/src/templates/agents/base.ts\nbackend/src/templates/agents/thinking-base.ts\nbackend/src/templates/base-prompts.ts\ncommon/src/templates/dynamic-agent-template.ts\ncommon/src/types/dynamic-agent-template.ts\ncommon/src/json-config/default.ts\nnpm-app/src/cli-handlers/agent-creation-chat.ts\nnpm-app/src/create-template-project.ts\nweb/src/content/agents/creating-new-agents.mdx" - }, - { - "type": "subagent_finish", - "agentId": "D-OgiVqb-lc", - "agentType": "file-lister", - "displayName": "Liszt the File Lister", - "onlyChild": true, - "parentAgentId": "D-OfY8_NY2s", - "prompt": "", - "params": { - "prompt": "agent builder, agent creation, scaffolding custom agents, agent templates" - } - }, - { - "type": "tool_result", - "toolCallId": "e359f44e-929f-499e-9245-d0f00b579a3c", - "toolName": "spawn_agents", - "output": [ - { - "type": "json", - "value": [ - { - "agentName": "Liszt the File Lister", - "agentType": "file-lister", - "value": { - "type": "lastMessage", - "value": [ - { - "role": "assistant", - "content": [ - { - "type": "text", - "text": "backend/src/templates/agents/agent-builder.ts\nbackend/src/templates/agent-registry.ts\nbackend/src/templates/agent-list.ts\nbackend/src/templates/agents/base.ts\nbackend/src/templates/agents/thinking-base.ts\nbackend/src/templates/base-prompts.ts\ncommon/src/templates/dynamic-agent-template.ts\ncommon/src/types/dynamic-agent-template.ts\ncommon/src/json-config/default.ts\nnpm-app/src/cli-handlers/agent-creation-chat.ts\nnpm-app/src/create-template-project.ts\nweb/src/content/agents/creating-new-agents.mdx" - } - ] - } - ] - } - } - ] - } - ], - "parentAgentId": "D-OfY8_NY2s" - }, - { - "type": "tool_call", - "toolCallId": "7c405474-9532-4f78-84bf-a3898d68cdca", - "toolName": "read_files", - "input": { - "paths": [ - "backend/src/templates/agents/agent-builder.ts", - "backend/src/templates/agent-registry.ts", - "backend/src/templates/agent-list.ts", - "backend/src/templates/agents/base.ts", - "backend/src/templates/agents/thinking-base.ts", - "backend/src/templates/base-prompts.ts", - "common/src/templates/dynamic-agent-template.ts", - "common/src/types/dynamic-agent-template.ts", - "common/src/json-config/default.ts", - "npm-app/src/cli-handlers/agent-creation-chat.ts", - "npm-app/src/create-template-project.ts", - "web/src/content/agents/creating-new-agents.mdx" - ] - }, - "agentId": "D-OfY8_NY2s", - "parentAgentId": "main-agent", - "includeToolCall": true - }, - { - "type": "tool_result", - "toolCallId": "7c405474-9532-4f78-84bf-a3898d68cdca", - "toolName": "read_files", - "output": [ - { - "type": "json", - "value": [ - { - "path": "backend/src/templates/agents/agent-builder.ts", - "content": "import * as fs from 'fs'\nimport * as path from 'path'\n\nimport {\n AGENT_TEMPLATES_DIR,\n openrouterModels,\n AGENT_DEFINITION_FILE,\n} from '@codebuff/common/constants'\nimport { AgentTemplateTypes } from '@codebuff/common/types/session-state'\nimport z from 'zod/v4'\n\nimport type { AgentTemplate } from '../types'\nimport type { Model } from '@codebuff/common/constants'\nimport type { ToolName } from '@codebuff/common/tools/constants'\n\nconst COMMON_UTIL_PATH = '../../../../common/src/util'\nconst TEMPLATE_RELATIVE_PATH =\n `${COMMON_UTIL_PATH}/types/${AGENT_DEFINITION_FILE}` as const\n// Import to validate path exists at compile time\nimport(TEMPLATE_RELATIVE_PATH)\n\nconst TEMPLATE_PATH = path.join(__dirname, TEMPLATE_RELATIVE_PATH)\nconst DEFAULT_MODEL = openrouterModels.openrouter_claude_sonnet_4\nconst TYPES_DIR = path.join(AGENT_TEMPLATES_DIR, 'types')\nconst EXAMPLES_DIR = path.join(AGENT_TEMPLATES_DIR, 'examples')\nconst TEMPLATE_TYPES_PATH = path.join(TYPES_DIR, AGENT_DEFINITION_FILE)\nconst TOOL_DEFINITIONS_FILE = 'tools.d.ts'\nconst TOOL_DEFINITIONS_PATH = path.join(TYPES_DIR, TOOL_DEFINITIONS_FILE)\n\nexport const agentBuilder = (\n model: Model,\n allAvailableAgents?: string[],\n): Omit => {\n // Read the AGENT_CONFIG_FILE content dynamically\n // The import above ensures this path exists at compile time\n let agentTemplateContent = ''\n try {\n agentTemplateContent = fs.readFileSync(TEMPLATE_PATH, 'utf8')\n } catch (error) {\n console.warn(`Could not read ${AGENT_DEFINITION_FILE}:`, error)\n agentTemplateContent = '// Agent template types not available'\n }\n // Read the tools.d.ts content from common package\n let toolDefinitionsContent = ''\n try {\n const toolsPath = path.join(\n __dirname,\n `${COMMON_UTIL_PATH}/types/tools.d.ts`,\n )\n toolDefinitionsContent = fs.readFileSync(toolsPath, 'utf8')\n } catch (error) {\n console.warn(`Could not read tools.d.ts from common:`, error)\n toolDefinitionsContent = '// Tool definitions not available'\n }\n\n // Read example agent files from common package\n const exampleAgentContents: Record = {}\n\n try {\n const exampleAgentsDir = path.join(__dirname, `${COMMON_UTIL_PATH}`)\n // Check if directory exists before trying to read it\n if (fs.existsSync(exampleAgentsDir)) {\n const files = fs.readdirSync(exampleAgentsDir)\n\n files\n .filter(\n (file) => file.endsWith('.ts') && file.startsWith('diff-reviewer'),\n )\n .forEach((filename) => {\n try {\n const fullPath = path.join(exampleAgentsDir, filename)\n const content = fs.readFileSync(fullPath, 'utf8')\n exampleAgentContents[filename] = content\n } catch (error) {\n console.warn(`Could not read example agent ${filename}:`, error)\n }\n })\n } else {\n console.warn(\n `Example agents directory does not exist: ${exampleAgentsDir}`,\n )\n }\n } catch (error) {\n console.warn('Could not read example agents directory:', error)\n }\n\n return {\n model,\n displayName: 'Bob the Agent Builder',\n spawnPurposePrompt:\n 'Enhanced base agent that can create custom agents and handle all coding tasks with deterministic agent creation behavior',\n inputSchema: {\n prompt: z\n .string()\n .optional()\n .describe(\n 'What agent type you would like to create or edit. Include as many details as possible.',\n ),\n params: z\n .object({\n name: z.string().optional(),\n purpose: z.string().optional(),\n specialty: z.string().optional(),\n model: z.string().optional(),\n })\n .passthrough()\n .optional(),\n },\n outputMode: 'structured_output',\n includeMessageHistory: false,\n toolNames: [\n 'write_file',\n 'str_replace',\n 'run_terminal_command',\n 'read_files',\n 'code_search',\n 'spawn_agents',\n 'add_message',\n 'set_output',\n 'end_turn',\n ] satisfies ToolName[],\n spawnableAgents: allAvailableAgents\n ? (allAvailableAgents as any[])\n : [\n AgentTemplateTypes.file_picker,\n AgentTemplateTypes.researcher,\n AgentTemplateTypes.thinker,\n AgentTemplateTypes.reviewer,\n AgentTemplateTypes.agent_builder,\n ],\n\n systemPrompt: [\n '# Bob the Agent Builder',\n '',\n 'You are an expert agent builder specialized in creating new agent templates for the codebuff system. You have comprehensive knowledge of the agent template architecture and can create well-structured, purpose-built agents.',\n '',\n '## Environment Setup Complete',\n '',\n 'Your environment has been automatically prepared with:',\n '- Agent template type definitions in `.agents/types/agent-definition.d.ts`',\n '- Tool type definitions in `.agents/types/tools.d.ts`',\n '- Example agent files copied to `.agents/` directory for reference',\n '',\n 'All necessary files are now available in your working directory.',\n '',\n '## Complete Agent Template Type Definitions',\n '',\n 'Here are the complete TypeScript type definitions for creating custom Codebuff agents:',\n '```typescript',\n agentTemplateContent,\n '```',\n '',\n '## Available Tools Type Definitions',\n '',\n 'Here are the complete TypeScript type definitions for all available tools:',\n '',\n '```typescript',\n toolDefinitionsContent,\n '```',\n '',\n '## Agent Template Patterns:',\n '',\n '1. **Base Agent Pattern**: Full-featured agents with comprehensive tool access',\n '2. **Specialized Agent Pattern**: Focused agents with limited tool sets',\n '3. **Thinking Agent Pattern**: Agents that spawn thinker sub-agents',\n '4. **Research Agent Pattern**: Agents that start with web search',\n '',\n '## Best Practices:',\n '',\n '1. **Use as few fields as possible**: Leave out fields that are not needed to reduce complexity',\n '2. **Minimal Tools**: Only include tools the agent actually needs',\n '3. **Clear and Concise Prompts**: Write clear, specific prompts that have no unnecessary words',\n '4. **Consistent Naming**: Follow naming conventions (kebab-case for IDs)',\n '5. **Appropriate Model**: Choose the right model for the task complexity. Default is claude-4-sonnet-20250522 for medium-high complexity tasks, and openai/gpt-5 for all other tasks.',\n '',\n '## Your Task:',\n 'When asked to create an agent template, you should:',\n \"1. Understand the requested agent's purpose and capabilities\",\n \"2. Choose appropriate tools for the agent's function\",\n '3. Write a comprehensive system prompt',\n `4. Create the complete agent template file in ${AGENT_TEMPLATES_DIR}`,\n '5. Ensure the template follows all conventions and best practices',\n '6. Use the AgentDefinition interface for the configuration',\n '7. Start the file with: import type { AgentDefinition } from \"./types/agent-definition.d.ts\"',\n '',\n 'Create agent templates that are focused, efficient, and well-documented. Always import the AgentDefinition type and export a default configuration object.',\n ].join('\\n'),\n instructionsPrompt: `You are helping to create or edit an agent template. The user will describe what kind of agent they want to create or how they want to modify an existing agent.\n\n## Environment Ready\n\nYour environment has been automatically set up with:\n- Type definitions in \\`.agents/types/\\`\n- Example agent files in \\`.agents/\\` directory\n- All necessary scaffolding complete\n\nYou can now proceed directly to agent creation or editing.\n\n## Example Agents Available\n\nThree example agents are now available in your \\`.agents/\\` directory which are all diff reviewers of increasing complexity. These can serve as examples of well-made agents at different stages of complexity.\n\n**IMPORTANT**: Examine these examples to find connections and patterns that relate to the user's request. Look for:\n- Similar tool combinations\n- Comparable complexity levels\n- Related functionality patterns\n- Appropriate model choices\n- Relevant prompt structures\n\nUse these examples as inspiration and starting points, adapting their patterns to fit the user's specific needs.\n\n## For New Agents\n\nAnalyze their request and create a complete agent template that:\n- Has a clear purpose and appropriate capabilities\n- Leaves out fields that are not needed\n- Uses only the tools it needs\n- Follows naming conventions\n- Is properly structured\n- Draws inspiration from relevant example agents\n\n## For Creating New Agents\n\nThe agent builder is focused on creating new agent templates based on user specifications.\n\nIMPORTANT: Always end your response with the end_turn tool when you have completed the agent creation or editing task.`,\n stepPrompt: '',\n\n handleSteps: function* ({ agentState, prompt, params }) {\n // Step 1: Create directory structure\n yield {\n toolName: 'run_terminal_command',\n args: {\n command: `mkdir -p ${TYPES_DIR} && mkdir -p ${EXAMPLES_DIR}`,\n process_type: 'SYNC',\n timeout_seconds: 10,\n },\n }\n\n // Step 2: Write the AGENT_DEFINITION_FILE with the template content\n yield {\n toolName: 'write_file',\n args: {\n path: TEMPLATE_TYPES_PATH,\n instructions: 'Create agent template type definitions file',\n content: agentTemplateContent,\n },\n }\n\n // Step 3: Write the tool definitions file (copy from existing tools.d.ts)\n yield {\n toolName: 'write_file',\n args: {\n path: TOOL_DEFINITIONS_PATH,\n instructions: 'Create tools type file',\n content: toolDefinitionsContent,\n },\n }\n\n // Step 4: Add message about reading example files and then read them\n yield {\n toolName: 'add_message',\n args: {\n role: 'assistant',\n content:\n \"I'll read the example agent files to understand the patterns and then help you create your agent.\",\n },\n }\n\n // Step 5: Copy example agent files to .agents/ directory\n for (const [filename, content] of Object.entries(exampleAgentContents)) {\n if (content) {\n yield {\n toolName: 'write_file',\n args: {\n path: `${EXAMPLES_DIR}/${filename}`,\n instructions: `Copy example agent file ${filename}`,\n content: content,\n },\n }\n }\n }\n\n // Step 6: Complete agent creation process\n yield 'STEP_ALL'\n },\n }\n}\n", - "referencedBy": {} - }, - { - "path": "backend/src/templates/agent-registry.ts", - "content": "import type { AgentTemplate } from '@codebuff/common/types/agent-template'\nimport db from '@codebuff/common/db'\nimport * as schema from '@codebuff/common/db/schema'\nimport { and, desc, eq } from 'drizzle-orm'\n\nimport { ProjectFileContext } from '@codebuff/common/util/file'\nimport { logger } from '../util/logger'\nimport { agentTemplates as staticTemplates } from './agent-list'\nimport {\n DynamicAgentValidationError,\n validateAgents,\n validateSingleAgent,\n} from '@codebuff/common/templates/agent-validation'\nimport { DynamicAgentTemplate } from '@codebuff/common/types/dynamic-agent-template'\n\nexport type AgentRegistry = Record\n\n// Global database cache - only state in the system\nconst databaseAgentCache = new Map()\n\n/**\n * Parse agent ID to extract publisher, agent name, and version\n */\nfunction parseAgentId(fullAgentId: string): {\n publisherId: string\n agentId: string\n version?: string\n} | null {\n // Check if it's in the publisher/agent-id[@version] format\n const parts = fullAgentId.split('/')\n if (parts.length !== 2) {\n return null\n }\n\n const [publisherId, agentNameWithVersion] = parts\n\n // Check for version suffix\n const versionMatch = agentNameWithVersion.match(/^(.+)@(.+)$/)\n if (versionMatch) {\n const [, agentId, version] = versionMatch\n return { publisherId, agentId, version }\n }\n\n return { publisherId, agentId: agentNameWithVersion }\n}\n\n/**\n * Fetch an agent from the database by publisher/agent-id[@version] format\n */\nasync function fetchAgentFromDatabase(parsedAgentId: {\n publisherId: string\n agentId: string\n version?: string\n}): Promise {\n const { publisherId, agentId, version } = parsedAgentId\n\n try {\n let agentConfig\n\n if (version && version !== 'latest') {\n // Query for specific version\n agentConfig = await db\n .select()\n .from(schema.agentConfig)\n .where(\n and(\n eq(schema.agentConfig.id, agentId),\n eq(schema.agentConfig.publisher_id, publisherId),\n eq(schema.agentConfig.version, version),\n ),\n )\n .then((rows) => rows[0])\n } else {\n // Query for latest version\n agentConfig = await db\n .select()\n .from(schema.agentConfig)\n .where(\n and(\n eq(schema.agentConfig.id, agentId),\n eq(schema.agentConfig.publisher_id, publisherId),\n ),\n )\n .orderBy(\n desc(schema.agentConfig.major),\n desc(schema.agentConfig.minor),\n desc(schema.agentConfig.patch),\n )\n .limit(1)\n .then((rows) => rows[0])\n }\n\n if (!agentConfig) {\n logger.debug(\n { publisherId, agentId, version },\n 'fetchAgentFromDatabase: Agent not found in database',\n )\n return null\n }\n\n const rawAgentData = agentConfig.data as DynamicAgentTemplate\n\n // Validate the raw agent data with the original agentId (not full identifier)\n const validationResult = validateSingleAgent(\n { ...rawAgentData, id: agentId },\n {\n filePath: `${publisherId}/${agentId}@${agentConfig.version}`,\n skipSubagentValidation: true,\n },\n )\n\n if (!validationResult.success) {\n logger.error(\n {\n publisherId,\n agentId,\n version: agentConfig.version,\n error: validationResult.error,\n },\n 'fetchAgentFromDatabase: Agent validation failed',\n )\n return null\n }\n\n // Set the correct full agent ID for the final template\n const agentTemplate = {\n ...validationResult.agentTemplate!,\n id: `${publisherId}/${agentId}@${agentConfig.version}`,\n }\n\n logger.debug(\n {\n publisherId,\n agentId,\n version: agentConfig.version,\n fullAgentId: agentTemplate.id,\n },\n 'fetchAgentFromDatabase: Successfully loaded and validated agent from database',\n )\n\n return agentTemplate\n } catch (error) {\n logger.error(\n { publisherId, agentId, version, error },\n 'fetchAgentFromDatabase: Error fetching agent from database',\n )\n return null\n }\n}\n\n/**\n * Single function to look up an agent template with clear priority order:\n * 1. localAgentTemplates (dynamic agents + static templates)\n * 2. Database cache\n * 3. Database query\n */\nexport async function getAgentTemplate(\n agentId: string,\n localAgentTemplates: Record,\n): Promise {\n // 1. Check localAgentTemplates first (dynamic agents + static templates)\n if (localAgentTemplates[agentId]) {\n return localAgentTemplates[agentId]\n }\n // 2. Check database cache\n const cacheKey = agentId\n if (databaseAgentCache.has(cacheKey)) {\n return databaseAgentCache.get(cacheKey) || null\n }\n\n const parsed = parseAgentId(agentId)\n if (!parsed) {\n logger.debug({ agentId }, 'getAgentTemplate: Failed to parse agent ID')\n return null\n }\n\n // 3. Query database (only for publisher/agent-id format)\n const dbAgent = await fetchAgentFromDatabase(parsed)\n if (dbAgent && parsed.version && parsed.version !== 'latest') {\n // Cache only specific versions to avoid stale 'latest' results\n databaseAgentCache.set(cacheKey, dbAgent)\n }\n return dbAgent\n}\n\n/**\n * Assemble local agent templates from fileContext + static templates\n */\nexport function assembleLocalAgentTemplates(fileContext: ProjectFileContext): {\n agentTemplates: Record\n validationErrors: DynamicAgentValidationError[]\n} {\n // Load dynamic agents using the service\n const { templates: dynamicTemplates, validationErrors } = validateAgents(\n fileContext.agentTemplates || {},\n )\n\n // Combine static and dynamic templates\n const agentTemplates = { ...staticTemplates, ...dynamicTemplates }\n\n return { agentTemplates, validationErrors }\n}\n\n/**\n * Clear the database agent cache (useful for testing)\n */\nexport function clearDatabaseCache(): void {\n databaseAgentCache.clear()\n}\n", - "referencedBy": {} - }, - { - "path": "backend/src/templates/agent-list.ts", - "content": "import { models } from '@codebuff/common/constants'\nimport { AgentTemplateTypes } from '@codebuff/common/types/session-state'\n\nimport { dryRun } from './agents/archive/dry-run'\nimport { ask } from './agents/ask'\nimport { base } from './agents/base'\nimport { fileExplorer } from './agents/file-explorer'\nimport { filePicker } from './agents/file-picker'\nimport { planner } from './agents/planner'\nimport { researcher } from './agents/researcher'\nimport { reviewer } from './agents/reviewer'\nimport { superagent } from './agents/superagent'\nimport { thinker } from './agents/thinker'\nimport { thinkingBase } from './agents/thinking-base'\n\nimport type { AgentTemplate } from './types'\nimport type { AgentTemplateType } from '@codebuff/common/types/session-state'\nimport { agentBuilder } from './agents/agent-builder'\n\nexport const agentTemplates: Record =\n {\n [AgentTemplateTypes.base]: {\n id: AgentTemplateTypes.base,\n ...base(models.openrouter_claude_sonnet_4),\n },\n [AgentTemplateTypes.base_lite]: {\n id: AgentTemplateTypes.base_lite,\n ...base(models.openrouter_gpt5),\n },\n [AgentTemplateTypes.base_max]: {\n id: AgentTemplateTypes.base_max,\n ...base(models.openrouter_claude_opus_4),\n },\n [AgentTemplateTypes.base_experimental]: {\n id: AgentTemplateTypes.base_experimental,\n ...base(models.gemini2_5_pro_preview),\n },\n [AgentTemplateTypes.ask]: {\n id: AgentTemplateTypes.ask,\n ...ask(models.gemini2_5_pro_preview),\n },\n [AgentTemplateTypes.superagent]: {\n id: AgentTemplateTypes.superagent,\n ...superagent(models.openrouter_claude_sonnet_4),\n },\n [AgentTemplateTypes.claude4_gemini_thinking]: {\n id: AgentTemplateTypes.claude4_gemini_thinking,\n ...thinkingBase(models.openrouter_claude_sonnet_4),\n },\n\n [AgentTemplateTypes.thinker]: {\n id: AgentTemplateTypes.thinker,\n ...thinker(models.openrouter_grok_4),\n },\n [AgentTemplateTypes.file_picker]: {\n id: AgentTemplateTypes.file_picker,\n ...filePicker(models.gemini2_5_flash),\n },\n [AgentTemplateTypes.researcher]: {\n id: AgentTemplateTypes.researcher,\n ...researcher(models.gemini2_5_flash),\n },\n [AgentTemplateTypes.planner]: {\n id: AgentTemplateTypes.planner,\n ...planner(models.openrouter_grok_4),\n },\n [AgentTemplateTypes.dry_run]: {\n id: AgentTemplateTypes.dry_run,\n ...dryRun(models.gemini2_5_flash),\n },\n [AgentTemplateTypes.reviewer]: {\n id: AgentTemplateTypes.reviewer,\n ...reviewer(models.gemini2_5_pro_preview),\n },\n [AgentTemplateTypes.agent_builder]: {\n id: AgentTemplateTypes.agent_builder,\n ...agentBuilder(models.openrouter_claude_sonnet_4),\n },\n [AgentTemplateTypes.file_explorer]: fileExplorer as any as AgentTemplate,\n }\n", - "referencedBy": {} - }, - { - "path": "backend/src/templates/agents/base.ts", - "content": "import { AGENT_PERSONAS } from '@codebuff/common/constants/agents'\nimport { AgentTemplateTypes } from '@codebuff/common/types/session-state'\nimport z from 'zod/v4'\n\nimport {\n baseAgentAgentStepPrompt,\n baseAgentSystemPrompt,\n baseAgentUserInputPrompt,\n} from '../base-prompts'\n\nimport type { AgentTemplate } from '../types'\nimport type { Model } from '@codebuff/common/constants'\n\nexport const base = (\n model: Model,\n allAvailableAgents?: string[],\n): Omit => ({\n model,\n displayName: AGENT_PERSONAS.base.displayName,\n spawnPurposePrompt: AGENT_PERSONAS.base.purpose,\n inputSchema: {\n prompt: z.string().describe('A coding task to complete'),\n },\n outputMode: 'last_message',\n includeMessageHistory: false,\n toolNames: [\n 'create_plan',\n 'run_terminal_command',\n 'str_replace',\n 'write_file',\n 'spawn_agents',\n 'add_subgoal',\n 'browser_logs',\n 'code_search',\n 'end_turn',\n 'read_files',\n 'think_deeply',\n 'update_subgoal',\n ],\n spawnableAgents: allAvailableAgents\n ? (allAvailableAgents as any[])\n : [\n AgentTemplateTypes.file_explorer,\n AgentTemplateTypes.file_picker,\n AgentTemplateTypes.researcher,\n AgentTemplateTypes.thinker,\n AgentTemplateTypes.reviewer,\n ],\n\n systemPrompt: baseAgentSystemPrompt(model),\n instructionsPrompt: baseAgentUserInputPrompt(model),\n stepPrompt: baseAgentAgentStepPrompt(model),\n})\n", - "referencedBy": {} - }, - { - "path": "backend/src/templates/agents/thinking-base.ts", - "content": "import { AGENT_PERSONAS } from '@codebuff/common/constants/agents'\nimport z from 'zod/v4'\n\nimport {\n baseAgentAgentStepPrompt,\n baseAgentSystemPrompt,\n baseAgentUserInputPrompt,\n} from '../base-prompts'\nimport { baseAgentSubagents, baseAgentToolNames } from '../types'\n\nimport type { AgentTemplate } from '../types'\nimport type { Model } from '@codebuff/common/constants'\n\nexport const thinkingBase = (\n model: Model,\n allAvailableAgents?: string[],\n): Omit => ({\n model,\n displayName: AGENT_PERSONAS.base_lite.displayName,\n spawnPurposePrompt: AGENT_PERSONAS.base_lite.purpose,\n inputSchema: {\n prompt: z.string().describe('A coding task to complete'),\n },\n outputMode: 'last_message',\n includeMessageHistory: false,\n toolNames: baseAgentToolNames,\n spawnableAgents: allAvailableAgents\n ? (allAvailableAgents as any[])\n : baseAgentSubagents,\n\n systemPrompt: baseAgentSystemPrompt(model),\n instructionsPrompt: baseAgentUserInputPrompt(model),\n stepPrompt: baseAgentAgentStepPrompt(model),\n\n handleSteps: function* ({ agentState, prompt, params }) {\n while (true) {\n yield {\n toolName: 'spawn_agents',\n args: {\n agents: [\n {\n agent_type: 'thinker',\n prompt: 'Think deeply about the user request',\n },\n ],\n },\n }\n yield 'STEP'\n }\n },\n})\n", - "referencedBy": {} - }, - { - "path": "backend/src/templates/base-prompts.ts", - "content": "import { models } from '@codebuff/common/constants'\nimport { getToolCallString } from '@codebuff/common/tools/utils'\nimport { buildArray } from '@codebuff/common/util/array'\nimport { closeXml } from '@codebuff/common/util/xml'\n\nimport { PLACEHOLDER } from './types'\n\nimport type { Model } from '@codebuff/common/constants'\n\nexport const baseAgentSystemPrompt = (model: Model) => {\n return `# Persona: ${PLACEHOLDER.AGENT_NAME}\n\n**Your core identity is ${PLACEHOLDER.AGENT_NAME}.** You are an expert coding assistant who is enthusiastic, proactive, and helpful.\n\n- **Tone:** Maintain a positive, friendly, and helpful tone. Use clear and encouraging language.\n- **Clarity & Conciseness:** Explain your steps clearly but concisely. Say the least you can to get your point across. If you can, answer in one sentence only. Do not summarize changes. End turn early.\n\nYou are working on a project over multiple \"iterations,\" reminiscent of the movie \"Memento,\" aiming to accomplish the user's request.\n\n# Agents\n\nUse the spawn_agents tool to spawn agents to help you complete the user request! Each agent has a specific role and can help you with different parts of the user request.\n\nYou should spawn many parallel agents in the same tool call to increase time efficiency.\n\nNote that any spawned agent starts with no context at all, and it is up to you to prompt it with enough information to complete your request.\n\n# Files\n\nThe \\`read_file\\` tool result shows files you have previously read from \\`read_files\\` tool calls.\n\nIf you write to a file, or if the user modifies a file, new copies of a file will be included in \\`read_file\\` tool results.\n\nThus, multiple copies of the same file may be included over the course of a conversation. Each represents a distinct version in chronological order.\n\nImportant:\n\n- Pay particular attention to the last copy of a file as that one is current!\n- You are not the only one making changes to files. The user may modify files too, and you will see the latest version of the file after their changes. You must base you future write_file/str_replace edits off of the latest changes. You must try to accommodate the changes that the user has made and treat those as explicit instructions to follow. If they add lines of code or delete them, you should assume they want the file to remain modified that way unless otherwise noted.\n\n# Subgoals\n\nFirst, create and edit subgoals if none exist and pursue the most appropriate one. This one of the few ways you can \"take notes\" in the Memento-esque environment. This is important, as you may forget what happened later! Use the \\`add_subgoal\\` and \\`update_subgoal\\` tools for this.\n\nNotes:\n\n- Try to phrase the subgoal objective first in terms of observable behavior rather than how to implement it, if possible. The subgoal is what you are solving, not how you are solving it.\n\n# System Messages\n\nMessages from the system are surrounded by ${closeXml('system')} or ${closeXml('system_instructions')} XML tags. These are NOT messages from the user.\n\n# How to Respond\n\n- **Respond as ${PLACEHOLDER.AGENT_NAME}:** Maintain the helpful and upbeat persona defined above throughout your entire response, but also be as conscise as possible.\n- **DO NOT Narrate Parameter Choices:** While commentary about your actions is required (Rule #2), **DO NOT** explain _why_ you chose specific parameter values for a tool (e.g., don't say \"I am using the path 'src/...' because...\"). Just provide the tool call after your action commentary.\n- **CRITICAL TOOL FORMATTING:**\n - **NO MARKDOWN:** Tool calls **MUST NOT** be wrapped in markdown code blocks (like \\`\\`\\`). Output the raw XML tags directly. **This is non-negotiable.**\n - **MANDATORY EMPTY LINES:** Tool calls **MUST** be surrounded by a _single empty line_ both before the opening tag (e.g., \\`\\`) and after the closing tag (e.g., \\`${closeXml('tool_name')}\\`). See the example below. **Failure to include these empty lines will break the process.**\n - **NESTED ELEMENTS ONLY:** Tool parameters **MUST** be specified using _only_ nested XML elements, like \\`value${closeXml('parameter_name')}\\`. You **MUST NOT** use XML attributes within the tool call tags (e.g., writing \\`\\`). Stick strictly to the nested element format shown in the example response below. This is absolutely critical for the parser.\n- **User Questions:** If the user is asking for help with ideas or brainstorming, or asking a question, then you should directly answer the user's question, but do not make any changes to the codebase. Do not call modification tools like \\`write_file\\` or \\`str_replace\\`.\n- **Handling Requests:**\n - For complex requests, create a subgoal using \\`add_subgoal\\` to track objectives from the user request. Use \\`update_subgoal\\` to record progress. Put summaries of actions taken into the subgoal's \\`log\\`.\n - For straightforward requests, proceed directly without adding subgoals.\n- **Reading Files:** Try to read as many files as could possibly be relevant in your first 1 or 2 read_files tool calls. List multiple file paths in one tool call, as many as you can. You must read more files whenever it would improve your response.\n- **Minimal Changes:** You should make as few changes as possible to the codebase to address the user's request. Only do what the user has asked for and no more. When modifying existing code, assume every line of code has a purpose and is there for a reason. Do not change the behavior of code except in the most minimal way to accomplish the user's request.\n- **DO NOT run scripts, make git commits or push to remote repositories without permission from the user.** It's extremely important not to run scripts that could have major effects. Similarly, a wrong git push could break production. For these actions, always ask permission first and wait for user confirmation.\n- **Code Hygiene:** Make sure to leave things in a good state:\n\n - Don't forget to add any imports that might be needed\n - Remove unused variables, functions, and files as a result of your changes.\n - If you added files or functions meant to replace existing code, then you should also remove the previous code.\n\n- **Read Before Writing:** If you are about to edit a file, make sure it is one that you have already read, i.e. is included in your context -- otherwise, use the read_file tool to read it first!\n- **Check for Existing Changes:** If the user is requesting a change that you think has already been made based on the current version of files, simply tell the user that \"It looks like that change has already been made!\". It is common that a file you intend to update already has the changes you want.\n- **Think about your next action:** After receiving tool results, carefully reflect on their quality and determine optimal next steps before proceeding. Use your thinking to plan and iterate based on this new information, and then take the best next action.\n- **Package Management:** When adding new packages, use the run_terminal_command tool to install the package rather than editing the package.json file with a guess at the version number to use (or similar for other languages). This way, you will be sure to have the latest version of the package. Do not install packages globally unless asked by the user (e.g. Don't run \\`npm install -g \\`). Always try to use the package manager associated with the project (e.g. it might be \\`pnpm\\` or \\`bun\\` or \\`yarn\\` instead of \\`npm\\`, or similar for other languages).\n- **Refactoring Awareness:** Whenever you modify an exported token like a function or class or variable, you should use the code_search tool to find all references to it before it was renamed (or had its type/parameters changed) and update the references appropriately.\n- **Testing:** If you create a unit test, you should run it using \\`run_terminal_command\\` to see if it passes, and fix it if it doesn't.\n- **Front end development** We want to make the UI look as good as possible. Don't hold back. Give it your all.\n - Include as many relevant features and interactions as possible\n - Add thoughtful details like hover states, transitions, and micro-interactions\n - Apply design principles: hierarchy, contrast, balance, and movement\n - Create an impressive demonstration showcasing web development capabilities\n\n- **Don't summarize your changes** Omit summaries as much as possible. Be extremely concise when explaining the changes you made. There's no need to write a long explanation of what you did. Keep it to 1-2 two sentences max.\n- **Ending Your Response:** Your aim should be to completely fulfill the user's request before using ending your response. DO NOT END TURN IF YOU ARE STILL WORKING ON THE USER'S REQUEST. If the user's request requires multiple steps, please complete ALL the steps before stopping, even if you have done a lot of work so far.\n- **FINALLY, YOU MUST USE THE END TURN TOOL** When you have fully answered the user _or_ you are explicitly waiting for the user's next typed input, always conclude the message with a standalone \\`${getToolCallString('end_turn', {})}\\` tool call (surrounded by its required blank lines). This should be at the end of your message, e.g.:\n \n User: Hi\n Assisistant: Hello, what can I do for you today?\\\\n\\\\n${getToolCallString('end_turn', {})}\n ${closeXml('example')}\n\n## Verifying Your Changes at the End of Your Response\n\n### User has a \\`codebuff.json\\`\n\nIf the user has a \\`codebuff.json\\` with the appropriate \\`fileChangeHooks\\`, there is no need to run any commands.\n\nIf the \\`fileChangeHooks\\` are not configured, inform the user about the \\`fileChangeHooks\\` parameter.\n\n### User has no \\`codebuff.json\\`\n\nIf this is the case, inform the user know about the \\`/init\\` command (within Codebuff, not a terminal command).\n\nCheck the knowledge files to see if the user has specified a further protocol for what terminal commands should be run to verify edits. For example, a \\`knowledge.md\\` file could specify that after every change you should run the tests or linting or run the type checker. If there are multiple commands to run, you should run them all using '&&' to concatenate them into one commands, e.g. \\`npm run lint && npm run test\\`.\n\n## Example Response (Simplified - Demonstrating Rules)\n\nUser: Please console.log the props in the component Foo\n\nAssistant: Certainly! I can add that console log for you. Let's start by reading the file:\n\n${getToolCallString('read_files', { paths: ['src/components/foo.tsx'] })}\n\nNow, I'll add the console.log at the beginning of the Foo component:\n\n${getToolCallString('str_replace', {\n path: 'src/components/foo.tsx',\n replacements: [\n {\n old: `function Foo(props: {\n bar: string\n}) {\n`,\n new: `function Foo(props: {\n bar: string\n})\n console.log(\"Foo props:\", props);\n`,\n },\n ],\n})}\n\nLet me check my changes\n\n${getToolCallString('run_terminal_command', { command: 'npm run typecheck' })}\n\nI see that my changes went through correctly. What would you like to do next?\n\n${getToolCallString('end_turn', {})}\n\n${PLACEHOLDER.TOOLS_PROMPT}\n\n${PLACEHOLDER.AGENTS_PROMPT}\n\n# Knowledge files\n\nKnowledge files are your guide to the project. Knowledge files (files ending in \"knowledge.md\" or \"CLAUDE.md\") within a directory capture knowledge about that portion of the codebase. They are another way to take notes in this \"Memento\"-style environment.\n\nKnowledge files were created by previous engineers working on the codebase, and they were given these same instructions. They contain key concepts or helpful tips that are not obvious from the code. e.g., let's say I want to use a package manager aside from the default. That is hard to find in the codebase and would therefore be an appropriate piece of information to add to a knowledge file.\n\nEach knowledge file should develop over time into a concise but rich repository of knowledge about the files within the directory, subdirectories, or the specific file it's associated with.\n\nThere is a special class of user knowledge files that are stored in the user's home directory, e.g. \\`~/.knowledge.md\\`. These files are available to be read, but you cannot edit them because they are outside of the project directory. Do not try to edit them.\n\nWhen should you update a knowledge file?\n- If the user gives broad advice to \"always do x\", that is a good candidate for updating a knowledge file with a concise rule to follow or bit of advice so you won't make the mistake again.\n- If the user corrects you because they expected something different from your response, any bit of information that would help you better meet their expectations in the future is a good candidate for a knowledge file.\n\nWhat to include in knowledge files:\n- The mission of the project. Goals, purpose, and a high-level overview of the project.\n- Explanations of how different parts of the codebase work or interact.\n- Examples of how to do common tasks with a short explanation.\n- Anti-examples of what should be avoided.\n- Anything the user has said to do.\n- Anything you can infer that the user wants you to do going forward.\n- Tips and tricks.\n- Style preferences for the codebase.\n- Technical goals that are in progress. For example, migrations that are underway, like using the new backend service instead of the old one.\n- Links to reference pages that are helpful. For example, the url of documentation for an api you are using.\n- Anything else that would be helpful for you or an inexperienced coder to know\n\nWhat *not* to include in knowledge files:\n- Documentation of a single file.\n- Restated code or interfaces in natural language.\n- Anything obvious from reading the codebase.\n- Lots of detail about a minor change.\n- An explanation of the code you just wrote, unless there's something very unintuitive.\n\nAgain, DO NOT include details from your recent change that are not relevant more broadly.\n\nGuidelines for updating knowledge files:\n- Be concise and focused on the most important aspects of the project.\n- Integrate new knowledge into existing sections when possible.\n- Avoid overemphasizing recent changes or the aspect you're currently working on. Your current change is less important than you think.\n- Remove as many words as possible while keeping the meaning. Use command verbs. Use sentence fragments.\n- Use markdown features to improve clarity in knowledge files: headings, coding blocks, lists, dividers and so on.\n\nOnce again: BE CONCISE!\n\nIf the user sends you the url to a page that is helpful now or could be helpful in the future (e.g. documentation for a library or api), you should always save the url in a knowledge file for future reference. Any links included in knowledge files are automatically scraped and the web page content is added to the knowledge file.\n\n# Codebuff Configuration (codebuff.json)\n\n## Schema\n\nThe following describes the structure of the \\`./codebuff.json\\` configuration file that users might have in their project root. You can use this to understand user settings if they mention them.\n\n${PLACEHOLDER.CONFIG_SCHEMA}\n\n## Background Processes\n\nThe user does not have access to these outputs. Please display any pertinent information to the user before referring to it.\n\nTo stop a background process, attempt to close the process using the appropriate command. If you deem that command to be \\`kill\\`, **make sure** to kill the **ENTIRE PROCESS GROUP** (Mac/Linux) or tree (Windows).\n\nWhen you want to restart a background process, make sure to run the terminal command in the background.\n\n${PLACEHOLDER.FILE_TREE_PROMPT}\n\n${PLACEHOLDER.SYSTEM_INFO_PROMPT}\n\n${PLACEHOLDER.GIT_CHANGES_PROMPT}`\n}\n\nexport const baseAgentUserInputPrompt = (model: Model) => {\n const isFlash =\n model === models.gemini2_5_flash ||\n model === models.gemini2_5_flash_thinking\n const isGeminiPro = model === models.gemini2_5_pro_preview\n\n return (\n PLACEHOLDER.KNOWLEDGE_FILES_CONTENTS +\n '\\n\\n' +\n buildArray(\n 'Proceed toward the user request and any subgoals. Please either 1. clarify the request or 2. complete the entire user request. If you made any changes to the codebase, you must spawn the reviewer agent to review your changes. Then, finally you must use the end_turn tool at the end of your response. If you have already completed the user request, write nothing at all and end your response.',\n\n \"If there are multiple ways the user's request could be interpreted that would lead to very different outcomes, ask at least one clarifying question that will help you understand what they are really asking for, and then use the end_turn tool.\",\n\n 'Use the spawn_agents tool to spawn agents to help you complete the user request. You can spawn as many agents as you want.',\n\n 'It is a good idea to spawn a file explorer agent first to explore the codebase from different perspectives. Use the researcher agent to help you get up-to-date information from docs and web results too. After that, for complex requests, you should spawn the thinker agent to do deep thinking on a problem, but do not spawn it at the same time as the file picker, only spawn it *after* you have the file picker results. Finally, you must spawn the reviewer agent to review your code changes.',\n \"Important: you *must* read as many files with the read_files tool as possible from the results of the file picker agents. Don't be afraid to read 20 files. The more files you read, the better context you have on the codebase and the better your response will be.\",\n\n 'If the users uses \"@AgentName\" in their message, you must spawn the agent with the name \"@AgentName\". Spawn all the agents that the user mentions.',\n\n 'Be extremely concise in your replies. Example: If asked what 2+2 equals, respond simply: \"4\". No need to even write a full sentence.',\n\n 'Important: When using write_file, do NOT rewrite the entire file. Only show the parts of the file that have changed and write \"// ... existing code ...\" comments (or \"# ... existing code ...\" or \"/* ... existing code ... */\", whichever is appropriate for the language) around the changed area.',\n\n isGeminiPro &&\n `Any tool calls will be run from the project root (${PLACEHOLDER.PROJECT_ROOT}) unless otherwise specified`,\n\n 'You must read additional files with the read_files tool whenever it could possibly improve your response.',\n\n (isFlash || isGeminiPro) &&\n 'Before you use write_file or str_replace to edit an existing file, make sure to read it if you have not already!',\n\n (isFlash || isGeminiPro) &&\n 'Important: When mentioning a file path, for example for `write_file` or `read_files`, make sure to include all the directories in the path to the file from the project root. For example, do not forget the \"src\" directory if the file is at backend/src/utils/foo.ts! Sometimes imports for a file do not match the actual directories path (backend/utils/foo.ts for example).',\n\n !isFlash &&\n 'You must use the \"add_subgoal\" and \"update_subgoal\" tools to record your progress and any new information you learned as you go. If the change is very minimal, you may not need to use these tools.',\n\n 'Preserve as much of the existing code, its comments, and its behavior as possible. Make minimal edits to accomplish only the core of what is requested. Pay attention to any comments in the file you are editing and keep original user comments exactly as they were, line for line.',\n\n 'If you are trying to kill background processes, make sure to kill the entire process GROUP (or tree in Windows), and always prefer SIGTERM signals. If you restart the process, make sure to do so with process_type=BACKGROUND',\n\n !isFlash &&\n 'To confirm complex changes to a web app, you should use the browser_logs tool to check for console logs or errors.',\n\n (isFlash || isGeminiPro) &&\n 'Important: When using write_file, do NOT rewrite the entire file. Only show the parts of the file that have changed and write \"// ... existing code ...\" comments (or \"# ... existing code ..\", \"/* ... existing code ... */\", \"\", whichever is appropriate for the language) around the changed area. Additionally, in order to delete any code, you must include a deletion comment.',\n\n 'If the user request is very complex, consider invoking think_deeply.',\n\n \"If the user asks to create a plan, invoke the create_plan tool. Don't act on the plan created by the create_plan tool. Instead, wait for the user to review it.\",\n\n 'If the user tells you to implement a plan, please implement the whole plan, continuing until it is complete. Do not stop after one step.',\n\n 'If the user had knowledge files (or CLAUDE.md) and any of them say to run specific terminal commands after every change, e.g. to check for type errors or test errors, then do that at the end of your response if that would be helpful in this case. No need to run these checks for simple changes.',\n\n 'If you have learned something useful for the future that is not derivable from the code, consider updating a knowledge file at the end of your response to add this condensed information.',\n\n 'Important: DO NOT run scripts or git commands or start a dev server without being specifically asked to do so. If you want to run one of these commands, you should ask for permission first. This can prevent costly accidents!',\n\n 'Otherwise, the user is in charge and you should never refuse what the user asks you to do.',\n\n 'Important: When editing an existing file with the write_file tool, do not rewrite the entire file, write just the parts of the file that have changed. Do not start writing the first line of the file. Instead, use comments surrounding your edits like \"// ... existing code ...\" (or \"# ... existing code ...\" or \"/* ... existing code ... */\" or \"\", whichever is appropriate for the language) plus a few lines of context from the original file, to show just the sections that have changed.',\n\n (isFlash || isGeminiPro) &&\n 'You must use the spawn_agents tool to spawn agents to help you complete the user request. You can spawn as many agents as you want. It is a good idea to spawn a file explorer agent first to explore the codebase. Finally, you must spawn the reviewer agent to review your code changes.',\n\n 'Finally, you must use the end_turn tool at the end of your response when you have completed the user request or want the user to respond to your message.',\n ).join('\\n\\n') +\n closeXml('system_instructions')\n )\n}\n\nexport const baseAgentAgentStepPrompt = (model: Model) => {\n return `\nYou have ${PLACEHOLDER.REMAINING_STEPS} more response(s) before you will be cut off and the turn will be ended automatically.\n\nAssistant cwd (project root): ${PLACEHOLDER.PROJECT_ROOT}\nUser cwd: ${PLACEHOLDER.USER_CWD}\n${closeXml('system')}\n`\n}\n", - "referencedBy": {} - }, - { - "path": "common/src/templates/dynamic-agent-template.ts", - "content": "[FILE_DOES_NOT_EXIST]", - "referencedBy": {} - }, - { - "path": "common/src/types/dynamic-agent-template.ts", - "content": "import { z } from 'zod'\n\nimport { ALLOWED_MODEL_PREFIXES, models } from '../constants'\nimport { toolNames } from '../tools/constants'\n\n// Filter models to only include those that begin with allowed prefixes\nconst filteredModels = Object.values(models).filter((model) =>\n ALLOWED_MODEL_PREFIXES.some((prefix) => model.startsWith(prefix)),\n)\n\nif (filteredModels.length === 0) {\n throw new Error('No valid models found with allowed prefixes')\n}\n\n// Simplified JSON Schema definition - supports object schemas with nested properties\nconst JsonSchemaSchema: z.ZodType = z.lazy(() =>\n z\n .object({\n type: z.literal('object'),\n description: z.string().optional(),\n properties: z\n .record(\n JsonSchemaSchema.or(\n z\n .object({\n type: z.enum([\n 'string',\n 'number',\n 'integer',\n 'boolean',\n 'array',\n ]),\n description: z.string().optional(),\n enum: z.array(z.any()).optional(),\n })\n .passthrough(),\n ),\n )\n .optional(),\n required: z.array(z.string()).optional(),\n })\n .passthrough(),\n)\n\n// Schema for the combined inputSchema object\nconst InputSchemaObjectSchema = z\n .object({\n prompt: z\n .object({\n type: z.literal('string'),\n description: z.string().optional(),\n })\n .passthrough()\n .optional(), // Optional JSON schema for prompt validation\n params: JsonSchemaSchema.optional(), // Optional JSON schema for params validation\n })\n .optional()\n\n// Schema for prompt fields that can be either a string or a path reference\nconst PromptFieldSchema = z.union([\n z.string(), // Direct string content\n z.object({ path: z.string() }), // Path reference to external file\n])\nexport type PromptField = z.infer\n\n// Schema for validating handleSteps function signature\nconst HandleStepsSchema = z\n .function()\n .args(\n z.object({\n agentState: z.object({\n agentId: z.string(),\n parentId: z.string(),\n messageHistory: z.array(z.any()),\n }),\n prompt: z.string().optional(),\n params: z.any().optional(),\n }),\n )\n .returns(z.any())\n .optional()\n\n// Validates the Typescript template file.\nexport const DynamicAgentDefinitionSchema = z.object({\n id: z\n .string()\n .regex(\n /^[a-z0-9-]+$/,\n 'Agent ID must contain only lowercase letters, numbers, and hyphens',\n ), // The unique identifier for this agent\n version: z.string().optional(),\n publisher: z.string().optional(),\n\n // Required fields for new agents\n displayName: z.string(),\n model: z.string(),\n\n // Tools and spawnable agents\n toolNames: z\n .array(z.enum(toolNames))\n .optional()\n .default([])\n .refine(\n (tools) => {\n if (!tools) return true\n const validToolNames = toolNames as readonly string[]\n const invalidTools = tools.filter(\n (tool) => !validToolNames.includes(tool),\n )\n return invalidTools.length === 0\n },\n (tools) => {\n if (!tools) return { message: 'Tools array is undefined' }\n const validToolNames = toolNames as readonly string[]\n const invalidTools = tools.filter(\n (tool) => !validToolNames.includes(tool),\n )\n return {\n message: `Invalid tool names: ${invalidTools.join(', ')}. Available tools: ${toolNames.join(', ')}`,\n }\n },\n ),\n spawnableAgents: z.array(z.string()).optional().default([]),\n\n // Input and output\n inputSchema: InputSchemaObjectSchema,\n includeMessageHistory: z.boolean().default(true),\n outputMode: z\n .enum(['last_message', 'all_messages', 'structured_output'])\n .default('last_message'),\n outputSchema: JsonSchemaSchema.optional(), // Optional JSON schema for output validation\n\n // Prompts\n spawnPurposePrompt: z.string().optional(),\n systemPrompt: z.string().optional(),\n instructionsPrompt: z.string().optional(),\n stepPrompt: z.string().optional(),\n\n // Optional generator function for programmatic agents\n handleSteps: z.union([HandleStepsSchema, z.string()]).optional(),\n})\nexport type DynamicAgentDefinition = z.input<\n typeof DynamicAgentDefinitionSchema\n>\nexport type DynamicAgentDefinitionParsed = z.infer<\n typeof DynamicAgentDefinitionSchema\n>\n\nexport const DynamicAgentTemplateSchema = DynamicAgentDefinitionSchema.extend({\n systemPrompt: z.string(),\n instructionsPrompt: z.string(),\n stepPrompt: z.string(),\n handleSteps: z.string().optional(), // Converted to string after processing\n})\n .refine(\n (data) => {\n // If outputSchema is provided, outputMode must be explicitly set to 'structured_output'\n if (data.outputSchema && data.outputMode !== 'structured_output') {\n return false\n }\n return true\n },\n {\n message:\n \"outputSchema requires outputMode to be explicitly set to 'structured_output'.\",\n path: ['outputMode'],\n },\n )\n .refine(\n (data) => {\n // If outputMode is 'structured_output', 'set_output' tool must be included\n if (\n data.outputMode === 'structured_output' &&\n !data.toolNames.includes('set_output')\n ) {\n return false\n }\n return true\n },\n {\n message:\n \"outputMode 'structured_output' requires the 'set_output' tool. Add 'set_output' to toolNames.\",\n path: ['toolNames'],\n },\n )\n .refine(\n (data) => {\n // If 'set_output' tool is included, outputMode must be 'structured_output'\n if (\n data.toolNames.includes('set_output') &&\n data.outputMode !== 'structured_output'\n ) {\n return false\n }\n return true\n },\n {\n message:\n \"'set_output' tool requires outputMode to be 'structured_output'. Change outputMode to 'structured_output' or remove 'set_output' from toolNames.\",\n path: ['outputMode'],\n },\n )\n .refine(\n (data) => {\n // If spawnableAgents array is non-empty, 'spawn_agents' tool must be included\n if (\n data.spawnableAgents.length > 0 &&\n !data.toolNames.includes('spawn_agents')\n ) {\n return false\n }\n return true\n },\n {\n message:\n \"Non-empty spawnableAgents array requires the 'spawn_agents' tool. Add 'spawn_agents' to toolNames or remove spawnableAgents.\",\n path: ['toolNames'],\n },\n )\nexport type DynamicAgentTemplate = z.infer\n", - "referencedBy": {} - }, - { - "path": "common/src/json-config/default.ts", - "content": "import type { CodebuffConfig } from './constants'\n\nexport function getDefaultConfig(): CodebuffConfig {\n return {\n description: '',\n startupProcesses: [],\n fileChangeHooks: [],\n maxAgentSteps: 12,\n baseAgent: undefined,\n spawnableAgents: undefined,\n }\n}\n", - "referencedBy": {} - }, - { - "path": "npm-app/src/cli-handlers/agent-creation-chat.ts", - "content": "import { AGENT_TEMPLATES_DIR } from '@codebuff/common/constants'\nimport { AgentTemplateTypes } from '@codebuff/common/types/session-state'\nimport { green, gray, red } from 'picocolors'\n\nimport { enterMiniChat } from './mini-chat'\nimport { CLI } from '../cli'\n\ninterface AgentRequirements {\n name: string\n purpose: string\n specialty: string\n model: string\n}\n\nconst AGENT_CREATION_STEPS = [\n {\n question:\n \"Hi! I'll help you create a custom agent. What would you like to name your agent?\",\n field: 'name',\n placeholder: 'e.g., \"Code Reviewer\", \"API Helper\", \"Test Generator\"',\n },\n {\n question:\n \"Great! What's the main purpose of this agent? What should it help you with?\",\n field: 'purpose',\n placeholder:\n 'e.g., \"Review code for best practices\", \"Help with API integration\"',\n },\n {\n question: \"What's this agent's specialty or domain expertise?\",\n field: 'specialty',\n placeholder:\n 'e.g., \"React development\", \"Database optimization\", \"Security auditing\"',\n },\n {\n question:\n 'Which model should this agent use? (Press Enter for default: anthropic/claude-4-sonnet-20250522)',\n field: 'model',\n placeholder:\n 'anthropic/claude-4-sonnet-20250522, gpt-4o, gemini-2.0-flash-exp',\n defaultValue: 'anthropic/claude-4-sonnet-20250522',\n },\n]\n\nexport function startAgentCreationChat(\n rl: any,\n onExit: () => void,\n onComplete: (requirements: AgentRequirements) => void,\n) {\n enterMiniChat(rl, onExit, {\n title: '🤖 Agent Creation Assistant',\n steps: AGENT_CREATION_STEPS,\n onComplete: async (responses) => {\n const requirements: AgentRequirements = {\n name: responses.name || 'My Custom Agent',\n purpose:\n responses.purpose ||\n 'A custom agent that helps with development tasks',\n specialty: responses.specialty || 'general development',\n model: responses.model || 'anthropic/claude-4-sonnet-20250522',\n }\n\n try {\n await createAgentFromRequirements(requirements)\n } catch (error) {\n console.error(red('\\nError creating agent:'))\n console.error(error instanceof Error ? error.message : String(error))\n onExit() // Only exit on error\n }\n },\n })\n}\n\nexport async function createAgentFromRequirements(\n requirements: AgentRequirements,\n) {\n // Create a simple prompt for the agent builder with the requirements\n const prompt = `Create a new agent template with these requirements:\n\nAgent Name: ${requirements.name}\nPurpose: ${requirements.purpose}\nSpecialty: ${requirements.specialty}\nModel: ${requirements.model}\n\nPlease create a complete TypeScript agent template file in the ${AGENT_TEMPLATES_DIR} directory with proper types and a comprehensive system prompt.`\n\n try {\n // Use the resetAgent helper to properly switch to agent-builder which automatically spawns the agent builder\n const cliInstance = CLI.getInstance()\n await cliInstance.resetAgent(\n AgentTemplateTypes.agent_builder,\n {\n name: requirements.name,\n purpose: requirements.purpose,\n specialty: requirements.specialty,\n model: requirements.model,\n },\n prompt,\n )\n\n console.log(\n green(\n `\\n✅ Agent created! Check the ${AGENT_TEMPLATES_DIR} directory for your new agent.`,\n ),\n )\n console.log(\n gray(\n 'Continue adjusting your agent here, or type \"/agents\" to switch agents and test it out.',\n ),\n )\n\n cliInstance.freshPrompt()\n } catch (error) {\n console.error(red('\\nError during agent creation:'))\n console.error(\n 'Error message:',\n error instanceof Error ? error.message : String(error),\n )\n throw error\n }\n}\n", - "referencedBy": {} - }, - { - "path": "npm-app/src/create-template-project.ts", - "content": "import { execSync } from 'child_process'\nimport * as fs from 'fs'\nimport * as os from 'os'\nimport { join } from 'path'\n\nimport { green } from 'picocolors'\n\nimport { logger } from './utils/logger'\n\nexport async function createTemplateProject(\n template: string,\n projectDir: string,\n projectName: string = template,\n) {\n console.log(\n `Creating project from ${template} template in ${projectDir}/${projectName}`,\n )\n\n // Validate template name contains only alphanumeric chars, dash and underscore\n if (!/^[a-zA-Z0-9-_]+$/.test(template)) {\n console.error(\n 'Template name can only contain letters, numbers, dash and underscore',\n )\n logger.error(\n {\n errorMessage:\n 'Template name can only contain letters, numbers, dash and underscore',\n template,\n },\n 'Invalid template name',\n )\n process.exit(1)\n }\n\n // Validate project name\n if (!/^[a-zA-Z0-9-_]+$/.test(projectName)) {\n console.error(\n 'Project name can only contain letters, numbers, dash and underscore',\n )\n logger.error(\n {\n errorMessage:\n 'Project name can only contain letters, numbers, dash and underscore',\n projectName,\n },\n 'Invalid project name',\n )\n process.exit(1)\n }\n\n const projectPath = join(projectDir, projectName)\n\n // Check if directory already exists\n if (fs.existsSync(projectPath)) {\n console.error(`Directory ${projectPath} already exists`)\n logger.error(\n {\n errorMessage: `Directory ${projectPath} already exists`,\n projectPath,\n },\n 'Directory already exists',\n )\n process.exit(1)\n }\n\n try {\n console.log('\\nDownloading template...')\n // Clone the community repo to a temp directory\n const tempDir = fs.mkdtempSync(join(os.tmpdir(), 'codebuff-starter-'))\n execSync(\n 'git clone --depth 1 https://github.com/CodebuffAI/codebuff-community.git .',\n {\n cwd: tempDir,\n stdio: 'pipe',\n },\n )\n\n // Check if template exists in starter-templates or showcase directory\n const starterTemplateDir = join(tempDir, 'starter-templates', template)\n const showcaseDir = join(tempDir, 'showcase', template)\n let templateDir: string\n\n if (fs.existsSync(starterTemplateDir)) {\n templateDir = starterTemplateDir\n } else if (fs.existsSync(showcaseDir)) {\n templateDir = showcaseDir\n } else {\n console.error(\n `Template ${template} not found in starter-templates/ or showcase/`,\n )\n logger.error(\n {\n errorMessage: `Template ${template} not found in starter-templates/ or showcase/`,\n template,\n },\n 'Template not found',\n )\n fs.rmSync(tempDir, { recursive: true, force: true })\n process.exit(1)\n }\n\n // Create parent directory if it doesn't exist\n if (projectDir) {\n fs.mkdirSync(projectDir, { recursive: true })\n }\n\n // Copy template to new directory\n fs.mkdirSync(projectPath)\n fs.cpSync(templateDir, projectPath, { recursive: true })\n\n // Remove .git directory if it exists\n const gitDir = join(projectPath, '.git')\n if (fs.existsSync(gitDir)) {\n fs.rmSync(gitDir, { recursive: true, force: true })\n }\n\n // Initialize new git repo\n console.log('\\nInitializing git repo...')\n execSync('git init', { cwd: projectPath, stdio: 'pipe' })\n\n // Clean up temp directory\n fs.rmSync(tempDir, { recursive: true, force: true })\n\n // Install dependencies\n if (fs.existsSync(join(projectPath, 'package-lock.json'))) {\n console.log('\\nInstalling dependencies...')\n execSync('npm install', { cwd: projectPath, stdio: 'inherit' })\n }\n\n console.log(green(`\\nSuccessfully created new project in ${projectPath}\\n`))\n\n // Change into the new project directory and run codebuff\n process.chdir(projectPath)\n console.log('Starting Codebuff in the new project...\\n')\n console.log('--------------------------------\\n')\n execSync('codebuff', { stdio: 'inherit' })\n } catch (error) {\n logger.error(\n {\n errorMessage: error instanceof Error ? error.message : String(error),\n errorStack: error instanceof Error ? error.stack : undefined,\n template,\n projectDir,\n projectName,\n },\n 'Failed to initialize project',\n )\n console.error('Failed to initialize project:', error)\n process.exit(1)\n }\n}\n", - "referencedBy": {} - }, - { - "path": "web/src/content/agents/creating-new-agents.mdx", - "content": "---\ntitle: 'Creating New Agents'\nsection: 'advanced'\ntags: ['customization', 'agent templates', 'agents']\norder: 2\n---\n\n# Creating New Agents\n\nCreate specialized agents from scratch using JSON templates.\n\n**Types:**\n\n- **LLM-based** - Use prompts and language models\n- **Programmatic** (coming soon) - Use JavaScript/TypeScript code\n\n## Basic Structure\n\nNew agents need `\"override\": false` and these required fields:\n\n```json\n{\n \"id\": \"my-custom-agent\",\n \"version\": \"1.0.0\",\n \"override\": false,\n\n \"displayName\": \"My Custom Agent\",\n \"purpose\": \"A specialized agent for my workflow\",\n \"model\": \"anthropic/claude-4-sonnet-20250522\",\n \"outputMode\": \"last_message\",\n \"includeMessageHistory\": true,\n \"toolNames\": [\"read_files\", \"write_file\", \"end_turn\"],\n \"spawnableAgents\": [\"researcher\"],\n\n \"inputSchema\": {\n \"prompt\": {\n \"type\": \"string\",\n \"description\": \"What documentation to create or update\"\n }\n },\n\n \"parentInstructions\": {\n \"researcher\": \"When you need to understand API patterns or find code examples for documentation, spawn my-custom-agent to gather information about our repository's best practices.\"\n },\n\n \"systemPrompt\": {\n \"path\": \"./system.md\"\n },\n \"instructionsPrompt\": \"Create comprehensive documentation based on the user's request. Research existing code and patterns first.\"\n \"stepPrompt\": \"Continue working on the documentation. Use end_turn when complete.\"\n}\n```\n\n**.agents/templates/doc-writer-system.md**\n\n```markdown\n# Documentation Writer\n\nCreate clear, comprehensive documentation for codebases.\n\n## Guidelines\n\n- Research codebase first\n- Use clear, concise language\n- Include practical examples\n- Test examples for accuracy\n```\n\n## More Domain-Specific Examples\n\n### API Documentation Agent\n\nSpecialized for documenting REST APIs and GraphQL schemas:\n\n**.agents/templates/api-documenter.json**\n\n```json\n{\n \"id\": \"api-documenter\",\n \"version\": \"1.0.0\",\n \"override\": false,\n\n \"displayName\": \"API Documentation Specialist\"\n \"purpose\": \"Creates comprehensive API documentation with examples and schemas\",\n \"model\": \"anthropic/claude-4-sonnet-20250522\",\n \"outputMode\": \"last_message\",\n \"includeMessageHistory\": true,\n\n \"toolNames\": [\"read_files\", \"code_search\", \"write_file\", \"spawn_agents\", \"end_turn\"],\n \"spawnableAgents\": [\"researcher\"],\n\n \"inputSchema\": {\n \"prompt\": {\n \"type\": \"string\",\n \"description\": \"What API endpoints or schemas to document\"\n }\n },\n\n \"systemPrompt\": \"You are an API documentation specialist. Create clear, comprehensive documentation for REST APIs and GraphQL schemas with examples, request/response formats, and error codes.\",\n \"instructionsPrompt\": \"Analyze the specified API endpoints and create detailed documentation including examples, parameters, and response schemas.\"\n \"stepPrompt\": \"Continue documenting the API. Include practical examples and edge cases. Use end_turn when complete.\"\n}\n```\n\n### Database Migration Agent\n\nSpecialized for creating and reviewing database migrations:\n\n**.agents/templates/migration-specialist.json**\n\n```json\n{\n \"id\": \"migration-specialist\",\n \"version\": \"1.0.0\",\n \"override\": false,\n\n \"displayName\": \"Database Migration Specialist\"\n \"purpose\": \"Creates safe, reversible database migrations with proper indexing\",\n \"model\": \"anthropic/claude-4-sonnet-20250522\",\n \"outputMode\": \"last_message\",\n \"includeMessageHistory\": true,\n\n \"toolNames\": [\"read_files\", \"write_file\", \"code_search\", \"run_terminal_command\", \"end_turn\"],\n \"spawnableAgents\": [\"reviewer\"],\n\n \"parentInstructions\": {\n \"reviewer\": \"When database migrations are created or modified, spawn migration-specialist to review for data loss risks, locking issues, rollback procedures, and performance impact.\"\n },\n\n \"systemPrompt\": {\n \"path\": \"./migration-guidelines.md\"\n },\n \"instructionsPrompt\": \"Create a database migration for the requested schema changes. Ensure it's reversible and includes proper indexing.\"\n \"stepPrompt\": \"Continue working on the migration. Test it if possible and spawn a reviewer to check for issues.\"\n}\n```\n\n**.agents/templates/migration-guidelines.md**\n\n```markdown\n# Database Migration Guidelines\n\n## Safety First\n\n- Always create reversible migrations (up and down)\n- Test migrations on a copy of production data\n- Add indexes for new foreign keys\n- Use transactions where supported\n\n## Performance Considerations\n\n- Avoid locking tables during peak hours\n- Use `ADD COLUMN` with defaults carefully\n- Consider batching large data changes\n- Monitor migration execution time\n\n## Best Practices\n\n- Include descriptive migration names\n- Add comments explaining complex changes\n- Validate data integrity after migration\n- Keep migrations atomic and focused\n```\n\n## Parent Instructions\n\nParent instructions allow your agent to provide specific guidance to other agents when spawning them. This creates a hierarchical coordination system without requiring full agent overrides.\n\n### When to Use Parent Instructions\n\n- **Workflow Coordination**: Ensure spawned agents follow specific patterns\n- **Domain Expertise**: Share specialized knowledge with sub-agents\n- **Context Preservation**: Pass important context from parent to child agents\n- **Quality Control**: Add specific validation requirements\n\n### Real-World Examples\n\n#### Frontend Development Coordinator\n\n```json\n{\n \"id\": \"frontend-coordinator\",\n \"version\": \"1.0.0\",\n \"override\": false,\n \"displayName\": \"Frontend Development Coordinator\"\n \"purpose\": \"Coordinates frontend development with React best practices\",\n \"model\": \"anthropic/claude-4-sonnet-20250522\",\n \"outputMode\": \"last_message\",\n \"includeMessageHistory\": true,\n \"toolNames\": [\"read_files\", \"write_file\", \"code_search\", \"spawn_agents\", \"end_turn\"],\n \"spawnableAgents\": [\"reviewer\", \"researcher\", \"file_picker\"],\n \"inputSchema\": {\n \"prompt\": {\n \"type\": \"string\",\n \"description\": \"Frontend development task to coordinate\"\n }\n },\n \"parentInstructions\": {\n \"reviewer\": \"Spawn frontend-coordinator when you are looking at changes to React components or hooks to ensure proper hook usage, component composition, accessibility, and performance.\",\n \"researcher\": \"Need React patterns or component library info? Spawn frontend-coordinator to research official React docs and modern frontend practices.\",\n \"file_picker\": \"To understand the React codebase structure, spawn frontend-coordinator to find components, hooks, styles, and configuration files.\"\n },\n \"systemPrompt\": \"You are a frontend development coordinator specializing in React best practices. Guide development workflows and ensure code quality.\",\n \"instructionsPrompt\": \"Coordinate the frontend development task, spawning appropriate agents as needed.\"\n \"stepPrompt\": \"Continue coordinating the frontend development workflow. Use end_turn when complete.\"\n}\n```\n\n#### API Development Specialist\n\n```json\n{\n \"id\": \"api-specialist\",\n \"version\": \"1.0.0\",\n \"override\": false,\n \"displayName\": \"API Development Specialist\"\n \"purpose\": \"Specialized for REST API development and documentation\",\n \"model\": \"anthropic/claude-4-sonnet-20250522\",\n \"outputMode\": \"last_message\",\n \"includeMessageHistory\": true,\n \"toolNames\": [\"read_files\", \"write_file\", \"code_search\", \"spawn_agents\", \"run_terminal_command\", \"end_turn\"],\n \"spawnableAgents\": [\"reviewer\", \"researcher\", \"file_picker\"],\n \"inputSchema\": {\n \"prompt\": {\n \"type\": \"string\",\n \"description\": \"API development or documentation task\"\n }\n },\n \"parentInstructions\": {\n \"reviewer\": \"When API endpoints are created or modified, spawn api-specialist to review HTTP methods, status codes, error handling, and OpenAPI compliance.\",\n \"researcher\": \"For API design patterns or authentication strategies, spawn api-specialist to research industry standards and best practices.\",\n \"file_picker\": \"Understanding API structure requires spawning api-specialist to locate route definitions, middleware, controllers, and schema files.\"\n },\n \"systemPrompt\": \"You are an API development specialist focused on creating robust, well-documented REST APIs following industry standards.\",\n \"instructionsPrompt\": \"Handle the API development task, ensuring proper design patterns and documentation.\"\n \"stepPrompt\": \"Continue working on the API development task. Use end_turn when complete.\"\n}\n```\n\n#### DevOps Automation Agent\n\n```json\n{\n \"id\": \"devops-automator\",\n \"version\": \"1.0.0\",\n \"override\": false,\n \"displayName\": \"DevOps Automation Specialist\"\n \"purpose\": \"Handles infrastructure and deployment automation\",\n \"model\": \"anthropic/claude-4-sonnet-20250522\",\n \"outputMode\": \"last_message\",\n \"includeMessageHistory\": true,\n \"toolNames\": [\"read_files\", \"write_file\", \"code_search\", \"spawn_agents\", \"run_terminal_command\", \"end_turn\"],\n \"spawnableAgents\": [\"reviewer\", \"researcher\", \"file_picker\"],\n \"inputSchema\": {\n \"prompt\": {\n \"type\": \"string\",\n \"description\": \"Infrastructure or deployment automation task\"\n }\n },\n \"parentInstructions\": {\n \"reviewer\": \"Infrastructure code changes should be sent to devops-automator for review, security, resource optimization, deployment safety, and secrets management.\",\n \"researcher\": \"Cloud best practices or CI/CD patterns needed? Spawn devops-automator to apply container orchestration and disaster recovery best practices.\",\n \"file_picker\": \"Spawn devops-automator when infrastructure setup understanding is needed - it excels at finding Docker files, CI/CD configs, and deployment scripts.\"\n },\n \"systemPrompt\": \"You are a DevOps automation specialist focused on secure, scalable infrastructure and deployment pipelines.\",\n \"instructionsPrompt\": \"Handle the infrastructure or deployment automation task with security and reliability in mind.\"\n \"stepPrompt\": \"Continue working on the DevOps automation task. Use end_turn when complete.\"\n}\n```\n\n### Best Practices for Parent Instructions\n\n1. **Stay Focused**: Each instruction should relate to the target agent's core purpose.\n2. **Avoid Conflicts**: Consider how multiple parent instructions might interact. Each instruction across all your agents are added to the parent agent.\n3. **Test Thoroughly**: Verify instructions work across different scenarios. Start Codebuff with the option `--agent ` to talk with a specific agent to debug.\n\n## Programmatic Agents\n\n**Coming Soon** - Use JavaScript/TypeScript for complex orchestration logic.\n\n## Best Practices\n\n1. **Start small** - Begin with simple agents before complex ones\n2. **Experiment** - Try different tool/prompt combinations\n3. **Share** - Version control your `.agents/` directory\n4. **Iterate** - Improve based on usage\n5. **Leverage `parentInstructions`** - Coordinate agent behavior effectively\n", - "referencedBy": {} - } - ] - } - ], - "parentAgentId": "D-OfY8_NY2s" - }, - { - "type": "text", - "agentId": "D-OfaV526OE", - "text": "Here's a concise report of the locations in the codebase that define agent personalities or types:\n\n* `.agents/brainstormer.ts`, `.agents/planner.ts`, `.agents/researcher.ts`, `.agents/reviewer.ts`, `.agents/thinker.ts`, `.agents/superagent.ts`: These files define the persona, instructions, and capabilities of different agent types. They are useful as a central location for understanding specific agent behaviors.\n* `common/src/constants/agents.ts`: This file contains the `AGENT_PERSONAS` constant, which provides display names and purposes for different base and specialized agents. It's helpful for understanding the high-level categorization and naming of agents.\n* `common/src/types/agent-template.ts`: This file defines the `AgentTemplate` type, which outlines the structure of agent definitions, including fields like `displayName`, `systemPrompt`, `inputSchema`, and `toolNames`.\n* `npm-app/src/agents/load-agents.ts`: This file is responsible for loading local agent definitions, and could be useful for understanding how agents are managed.\n* `web/src/content/agents/overview.mdx`: Documentation summarizing agent design and purpose.\n" - }, - { - "type": "subagent_finish", - "agentId": "D-OfaV526OE", - "agentType": "file-picker", - "displayName": "Fletcher the File Fetcher", - "onlyChild": false, - "parentAgentId": "main-agent", - "prompt": "", - "params": { - "prompt": "agent personas, list of agent personalities or types" - } - }, - { - "type": "text", - "agentId": "D-OfY_tExks", - "text": ".agents/examples/diff-reviewer-1.ts\n.agents/examples/diff-reviewer-2.ts\n.agents/examples/diff-reviewer-3.ts\ncommon/src/util/examples/diff-reviewer-1.ts\ncommon/src/util/examples/diff-reviewer-2.ts\ncommon/src/util/examples/diff-reviewer-3.ts\nbackend/src/templates/agents/reviewer.ts\nbackend/src/templates/agents/thinker.ts\nbackend/src/templates/agents/planner.ts\nbackend/src/system-prompt/agent-instructions.md\nbackend/src/templates/prompts.ts\ncommon/src/constants/agents.ts" - }, - { - "type": "subagent_finish", - "agentId": "D-OgbZG1Kis", - "agentType": "file-lister", - "displayName": "Liszt the File Lister", - "onlyChild": true, - "parentAgentId": "D-OfY_tExks", - "prompt": "", - "params": { - "prompt": "diff-reviewer agent examples and configurations" - } - }, - { - "type": "tool_result", - "toolCallId": "d5d9bf34-0e52-49e8-97f8-330da68aa9a2", - "toolName": "spawn_agents", - "output": [ - { - "type": "json", - "value": [ - { - "agentName": "Liszt the File Lister", - "agentType": "file-lister", - "value": { - "type": "lastMessage", - "value": [ - { - "role": "assistant", - "content": [ - { - "type": "text", - "text": ".agents/examples/diff-reviewer-1.ts\n.agents/examples/diff-reviewer-2.ts\n.agents/examples/diff-reviewer-3.ts\ncommon/src/util/examples/diff-reviewer-1.ts\ncommon/src/util/examples/diff-reviewer-2.ts\ncommon/src/util/examples/diff-reviewer-3.ts\nbackend/src/templates/agents/reviewer.ts\nbackend/src/templates/agents/thinker.ts\nbackend/src/templates/agents/planner.ts\nbackend/src/system-prompt/agent-instructions.md\nbackend/src/templates/prompts.ts\ncommon/src/constants/agents.ts" - } - ] - } - ] - } - } - ] - } - ], - "parentAgentId": "D-OfY_tExks" - }, - { - "type": "tool_call", - "toolCallId": "3a890855-cfa7-43ef-97f7-d6ee3b29cb7e", - "toolName": "read_files", - "input": { - "paths": [ - ".agents/examples/diff-reviewer-1.ts", - ".agents/examples/diff-reviewer-2.ts", - ".agents/examples/diff-reviewer-3.ts", - "common/src/util/examples/diff-reviewer-1.ts", - "common/src/util/examples/diff-reviewer-2.ts", - "common/src/util/examples/diff-reviewer-3.ts", - "backend/src/templates/agents/reviewer.ts", - "backend/src/templates/agents/thinker.ts", - "backend/src/templates/agents/planner.ts", - "backend/src/system-prompt/agent-instructions.md", - "backend/src/templates/prompts.ts", - "common/src/constants/agents.ts" - ] - }, - "agentId": "D-OfY_tExks", - "parentAgentId": "main-agent", - "includeToolCall": true - }, - { - "type": "tool_result", - "toolCallId": "3a890855-cfa7-43ef-97f7-d6ee3b29cb7e", - "toolName": "read_files", - "output": [ - { - "type": "json", - "value": [ - { - "path": ".agents/examples/diff-reviewer-1.ts", - "content": "import type { AgentDefinition } from '../types/agent-definition'\n\nconst definition: AgentDefinition = {\n id: 'diff-reviewer-1',\n\n displayName: 'Diff Reviewer (Level 1)',\n model: 'openai/gpt-5',\n toolNames: ['read_files', 'run_terminal_command'],\n\n spawnPurposePrompt:\n 'Spawn when you need to review code changes in the git diff',\n\n instructionsPrompt: `Execute the following steps:\n1. Run git diff\n2. Read the files that have changed\n3. Review the changes and suggest improvements`,\n}\n\nexport default definition\n", - "referencedBy": {} - }, - { - "path": ".agents/examples/diff-reviewer-2.ts", - "content": "import type {\n AgentDefinition,\n AgentStepContext,\n} from '../types/agent-definition'\n\nconst definition: AgentDefinition = {\n id: 'diff-reviewer-2',\n displayName: 'Diff Reviewer (Level 2)',\n model: 'openai/gpt-5',\n\n inputSchema: {\n prompt: {\n type: 'string',\n description:\n 'Please provide a short description of the changes you want to review',\n },\n },\n toolNames: ['read_files', 'run_terminal_command'],\n\n spawnPurposePrompt:\n 'Spawn when you need to review code changes in the git diff',\n\n systemPrompt:\n 'You are an expert software developer. Your job is to review code changes and provide helpful feedback.',\n\n instructionsPrompt: `Execute the following steps:\n1. Run git diff\n2. Read the files that have changed\n3. Review the changes and suggest improvements\n\nUse the following guidelines while reviewing the changes:\n- Find ways to simplify the code\n- Reuse existing code as much as possible instead of writing new code\n- Preserve as much behavior as possible in the existing code\n- Prefer changing as few lines of code as possible\n- Look for opportunities to improve the code's readability\n- Look for logical errors in the code\n- Look for missed cases in the code\n- Look for any other bugs`,\n\n handleSteps: function* ({ agentState, prompt, params }: AgentStepContext) {\n // Step 1: Run git diff immediately. Saves the agent a step, lowering cost and latency!\n yield {\n toolName: 'run_terminal_command',\n args: {\n command: 'git diff',\n },\n }\n\n // Step 2: Let AI run the rest of the steps!\n yield 'STEP_ALL'\n },\n}\n\nexport default definition\n", - "referencedBy": {} - }, - { - "path": ".agents/examples/diff-reviewer-3.ts", - "content": "import type {\n AgentDefinition,\n AgentStepContext,\n} from '../types/agent-definition'\n\nconst definition: AgentDefinition = {\n id: 'diff-reviewer-3',\n\n displayName: 'Diff Reviewer (Level 3)',\n model: 'openai/gpt-5',\n inputSchema: {\n prompt: {\n type: 'string',\n description:\n 'Please provide a short description of the changes you want to review',\n },\n },\n outputMode: 'last_message',\n\n toolNames: ['read_files', 'run_terminal_command', 'spawn_agents'],\n spawnableAgents: ['james/file-explorer@0.1.3'],\n\n spawnPurposePrompt:\n 'Spawn when you need to review code changes in the git diff',\n\n systemPrompt:\n 'You are an expert software developer. Your job is to review code changes and provide helpful feedback.',\n\n instructionsPrompt: `Review the changes and suggest improvements.\n\nUse the following guidelines while reviewing the changes:\n- Find ways to simplify the code\n- Reuse existing code as much as possible instead of writing new code\n- Preserve as much behavior as possible in the existing code\n- Prefer changing as few lines of code as possible\n- Look for opportunities to improve the code's readability\n- Look for logical errors in the code\n- Look for missed cases in the code\n- Look for any other bugs`,\n\n handleSteps: function* ({ agentState, prompt, params }: AgentStepContext) {\n // Step 1: Get list of changed files from git diff --name-only\n const { toolResult: gitDiffFilesResult } = yield {\n toolName: 'run_terminal_command',\n args: {\n command: 'git diff --name-only',\n },\n }\n\n // Then, extract file paths from the result\n const changedFiles = (gitDiffFilesResult || '')\n .split('\\n')\n .map((line) => line.trim())\n .filter((line) => line && !line.startsWith('??') && !line.includes('OSC'))\n\n // Step 2: Read the files\n if (changedFiles.length > 0) {\n yield {\n toolName: 'read_files',\n args: {\n paths: changedFiles,\n },\n }\n }\n\n // Step 3: Run full git diff to see the actual changes\n yield {\n toolName: 'run_terminal_command',\n args: {\n command: 'git diff',\n },\n }\n\n // Step 4: Put words in the AI's mouth to get it to spawn the file explorer.\n yield {\n toolName: 'add_message',\n args: {\n role: 'assistant',\n content:\n 'Now I will spawn a file explorer to find any missing codebase context.',\n },\n }\n\n yield 'STEP'\n\n // Step 5: Put words in the AI's mouth to review the changes.\n yield {\n toolName: 'add_message',\n args: {\n role: 'assistant',\n content: 'Here is my comprehensive review of the changes.',\n },\n }\n\n // Step 6: Let AI review the changes in a final step. (The last message is also the agent's output.)\n yield 'STEP'\n },\n}\n\nexport default definition\n", - "referencedBy": {} - }, - { - "path": "common/src/util/examples/diff-reviewer-1.ts", - "content": "import type { AgentDefinition } from '../types/agent-definition'\n\nconst definition: AgentDefinition = {\n id: 'diff-reviewer-1',\n\n displayName: 'Diff Reviewer (Level 1)',\n model: 'openai/gpt-5',\n toolNames: ['read_files', 'run_terminal_command'],\n\n spawnPurposePrompt:\n 'Spawn when you need to review code changes in the git diff',\n\n instructionsPrompt: `Execute the following steps:\n1. Run git diff\n2. Read the files that have changed\n3. Review the changes and suggest improvements`,\n}\n\nexport default definition\n", - "referencedBy": {} - }, - { - "path": "common/src/util/examples/diff-reviewer-2.ts", - "content": "import type {\n AgentDefinition,\n AgentStepContext,\n} from '../types/agent-definition'\n\nconst definition: AgentDefinition = {\n id: 'diff-reviewer-2',\n displayName: 'Diff Reviewer (Level 2)',\n model: 'openai/gpt-5',\n\n inputSchema: {\n prompt: {\n type: 'string',\n description:\n 'Please provide a short description of the changes you want to review',\n },\n },\n toolNames: ['read_files', 'run_terminal_command'],\n\n spawnPurposePrompt:\n 'Spawn when you need to review code changes in the git diff',\n\n systemPrompt:\n 'You are an expert software developer. Your job is to review code changes and provide helpful feedback.',\n\n instructionsPrompt: `Execute the following steps:\n1. Run git diff\n2. Read the files that have changed\n3. Review the changes and suggest improvements\n\nUse the following guidelines while reviewing the changes:\n- Find ways to simplify the code\n- Reuse existing code as much as possible instead of writing new code\n- Preserve as much behavior as possible in the existing code\n- Prefer changing as few lines of code as possible\n- Look for opportunities to improve the code's readability\n- Look for logical errors in the code\n- Look for missed cases in the code\n- Look for any other bugs`,\n\n handleSteps: function* ({ agentState, prompt, params }: AgentStepContext) {\n // Step 1: Run git diff immediately. Saves the agent a step, lowering cost and latency!\n yield {\n toolName: 'run_terminal_command',\n args: {\n command: 'git diff',\n },\n }\n\n // Step 2: Let AI run the rest of the steps!\n yield 'STEP_ALL'\n },\n}\n\nexport default definition\n", - "referencedBy": {} - }, - { - "path": "common/src/util/examples/diff-reviewer-3.ts", - "content": "import type {\n AgentDefinition,\n AgentStepContext,\n} from '../types/agent-definition'\n\nconst definition: AgentDefinition = {\n id: 'diff-reviewer-3',\n\n displayName: 'Diff Reviewer (Level 3)',\n model: 'openai/gpt-5',\n inputSchema: {\n prompt: {\n type: 'string',\n description:\n 'Please provide a short description of the changes you want to review',\n },\n },\n outputMode: 'last_message',\n\n toolNames: ['read_files', 'run_terminal_command', 'spawn_agents'],\n spawnableAgents: ['james/file-explorer@0.1.3'],\n\n spawnPurposePrompt:\n 'Spawn when you need to review code changes in the git diff',\n\n systemPrompt:\n 'You are an expert software developer. Your job is to review code changes and provide helpful feedback.',\n\n instructionsPrompt: `Review the changes and suggest improvements.\n\nUse the following guidelines while reviewing the changes:\n- Find ways to simplify the code\n- Reuse existing code as much as possible instead of writing new code\n- Preserve as much behavior as possible in the existing code\n- Prefer changing as few lines of code as possible\n- Look for opportunities to improve the code's readability\n- Look for logical errors in the code\n- Look for missed cases in the code\n- Look for any other bugs`,\n\n handleSteps: function* ({ agentState, prompt, params }: AgentStepContext) {\n // Step 1: Get list of changed files from git diff --name-only\n const { toolResult: gitDiffFilesResult } = yield {\n toolName: 'run_terminal_command',\n args: {\n command: 'git diff --name-only',\n },\n }\n\n // Then, extract file paths from the result\n const changedFiles = (gitDiffFilesResult || '')\n .split('\\n')\n .map((line) => line.trim())\n .filter((line) => line && !line.startsWith('??') && !line.includes('OSC'))\n\n // Step 2: Read the files\n if (changedFiles.length > 0) {\n yield {\n toolName: 'read_files',\n args: {\n paths: changedFiles,\n },\n }\n }\n\n // Step 3: Run full git diff to see the actual changes\n yield {\n toolName: 'run_terminal_command',\n args: {\n command: 'git diff',\n },\n }\n\n // Step 4: Put words in the AI's mouth to get it to spawn the file explorer.\n yield {\n toolName: 'add_message',\n args: {\n role: 'assistant',\n content:\n 'Now I will spawn a file explorer to find any missing codebase context.',\n },\n }\n\n yield 'STEP'\n\n // Step 5: Put words in the AI's mouth to review the changes.\n yield {\n toolName: 'add_message',\n args: {\n role: 'assistant',\n content: 'Here is my comprehensive review of the changes.',\n },\n }\n\n // Step 6: Let AI review the changes in a final step. (The last message is also the agent's output.)\n yield 'STEP'\n },\n}\n\nexport default definition\n", - "referencedBy": {} - }, - { - "path": "backend/src/templates/agents/reviewer.ts", - "content": "import { AGENT_PERSONAS } from '@codebuff/common/constants/agents'\nimport { closeXml } from '@codebuff/common/util/xml'\nimport z from 'zod/v4'\n\nimport { PLACEHOLDER } from '../types'\n\nimport type { AgentTemplate } from '../types'\nimport type { Model } from '@codebuff/common/constants'\n\nexport const reviewer = (model: Model): Omit => ({\n model,\n displayName: AGENT_PERSONAS.reviewer.displayName,\n spawnPurposePrompt: AGENT_PERSONAS.reviewer.purpose,\n inputSchema: {\n prompt: z.string().describe('What should be reviewed. Be brief.'),\n },\n outputMode: 'last_message',\n includeMessageHistory: true,\n toolNames: ['end_turn', 'run_file_change_hooks'],\n spawnableAgents: [],\n\n systemPrompt: `# Persona: ${PLACEHOLDER.AGENT_NAME}\n\nYou are an expert programmer who can articulate very clear feedback on code changes.\n\n${PLACEHOLDER.TOOLS_PROMPT}\n\n${PLACEHOLDER.AGENTS_PROMPT}`,\n\n instructionsPrompt: `Your task is to provide helpful feedback on the last file changes made by the assistant. You should critique the code changes made recently in the above conversation.\n\nIMPORTANT: After analyzing the file changes, you should:\n1. Run file change hooks to validate the changes using the run_file_change_hooks tool\n2. Include the hook results in your feedback - if any hooks fail, mention the specific failures and suggest how to fix them\n3. If hooks pass and no issues are found, mention that validation was successful\n4. Always run hooks for TypeScript/JavaScript changes, test file changes, or when the changes could affect compilation/tests\n\nNOTE: You cannot make any changes directly! You can only suggest changes.\n\nProvide specific feedback on the file changes made by the assistant, file-by-file.\n\n- Focus on getting to a complete and correct solution as the top priority.\n- Try to keep any changes to the codebase as minimal as possible.\n- Simplify any logic that can be simplified.\n- Where a function can be reused, reuse it and do not create a new one.\n- Make sure that no new dead code is introduced.\n- Make sure there are no missing imports.\n- Make sure no sections were deleted that weren't supposed to be deleted.\n- Make sure the new code matches the style of the existing code.\n\nBe concise and to the point. After providing all your feedback, use the end_turn tool to end your response.`,\n\n stepPrompt: `IMPORTANT: Don't forget to end your response with the end_turn tool: ${closeXml('end_turn')}`,\n})\n", - "referencedBy": {} - }, - { - "path": "backend/src/templates/agents/thinker.ts", - "content": "import { AGENT_PERSONAS } from '@codebuff/common/constants/agents'\nimport { closeXml } from '@codebuff/common/util/xml'\nimport z from 'zod/v4'\n\nimport { PLACEHOLDER } from '../types'\n\nimport type { AgentTemplate } from '../types'\nimport type { Model } from '@codebuff/common/constants'\n\nexport const thinker = (model: Model): Omit => ({\n model,\n displayName: AGENT_PERSONAS.thinker.displayName,\n spawnPurposePrompt: AGENT_PERSONAS.thinker.purpose,\n inputSchema: {\n prompt: z.string().describe('The problem you are trying to solve'),\n },\n outputMode: 'last_message',\n includeMessageHistory: true,\n toolNames: ['end_turn'],\n spawnableAgents: [],\n\n systemPrompt: `# Persona: ${PLACEHOLDER.AGENT_NAME}\n\nYou are an expert programmer.\n\n${PLACEHOLDER.TOOLS_PROMPT}\n\n${PLACEHOLDER.AGENTS_PROMPT}`,\n\n instructionsPrompt: `\nThink deeply, step by step, about the user request and how best to approach it.\n\nConsider edge cases, potential issues, and alternative approaches.\n\nCome up with a list of insights that would help someone arrive at the best solution.\n\nTry not to be too prescriptive or confident in one solution. Instead, give clear arguments and reasoning.\n\nYou must be extremely concise and to the point.\n`.trim(),\n\n stepPrompt: `Don't forget to end your response with the end_turn tool: ${closeXml('end_turn')}`,\n})\n", - "referencedBy": {} - }, - { - "path": "backend/src/templates/agents/planner.ts", - "content": "import { AGENT_PERSONAS } from '@codebuff/common/constants/agents'\nimport { closeXml } from '@codebuff/common/util/xml'\nimport z from 'zod/v4'\n\nimport { PLACEHOLDER } from '../types'\n\nimport type { AgentTemplate } from '../types'\nimport type { Model } from '@codebuff/common/constants'\n\nexport const planner = (model: Model): Omit => ({\n model,\n displayName: AGENT_PERSONAS.planner.displayName,\n spawnPurposePrompt: AGENT_PERSONAS.planner.purpose,\n inputSchema: {\n prompt: z\n .string()\n .describe(\n 'What problem you to solve and a few ideas and suggestions for the plan',\n ),\n },\n outputMode: 'last_message',\n includeMessageHistory: true,\n toolNames: ['think_deeply', 'spawn_agents', 'end_turn'],\n spawnableAgents: [], // ARCHIVED: [AgentTemplateTypes.dry_run],\n\n systemPrompt: `# Persona: ${PLACEHOLDER.AGENT_NAME}\n\nYou are an expert software architect. You are good at creating comprehensive plans to tackle the user request.\n\n${PLACEHOLDER.TOOLS_PROMPT}\n\n${PLACEHOLDER.AGENTS_PROMPT}`,\n\n instructionsPrompt: `Steps for your response:\n1. Use the tool to think through cruxes for the plan, and tricky cases. Consider alternative approaches. Be sure to close the tool call with ${closeXml('think_deeply')}.\n2. Write out your plan in a concise way.\n3. Spawn 1-5 dry run agents to sketch portions of the implementation of the plan. (Important: do not forget to close the tool call with \"${closeXml('spawn_agents')}\"!)\n4. Synthesize all the information and rewrite the full plan to be the best it can be. Use the end_turn tool.`,\n\n stepPrompt:\n 'Do not forget to use the end_turn tool to end your response. Make sure the final plan is the best it can be.',\n})\n", - "referencedBy": {} - }, - { - "path": "backend/src/system-prompt/agent-instructions.md", - "content": "# Persona: Buffy - The Enthusiastic Coding Assistant\n\n**Your core identity is Buffy.** Buffy is an expert coding assistant who is enthusiastic, proactive, and helpful.\n\n- **Tone:** Maintain a positive, friendly, and helpful tone. Use clear and encouraging language.\n- **Clarity & Conciseness:** Explain your steps clearly but concisely. Say the least you can to get your point across. If you can, answer in one sentence only. Do not summarize changes. End turn early.\n\nYou are working on a project over multiple \"iterations,\" reminiscent of the movie \"Memento,\" aiming to accomplish the user's request.\n\n# Files\n\nThe tool result shows files you have previously read from tool calls.\n\nIf you write to a file, or if the user modifies a file, new copies of a file will be included in tool results.\n\nThus, multiple copies of the same file may be included over the course of a conversation. Each represents a distinct version in chronological order.\n\nImportant:\n\n- Pay particular attention to the last copy of a file as that one is current!\n- You are not the only one making changes to files. The user may modify files too, and you will see the latest version of the file after their changes. You must base you future write_file edits off of the latest changes. You must try to accommodate the changes that the user has made and treat those as explicit instructions to follow. If they add lines of code or delete them, you should assume they want the file to remain modified that way unless otherwise noted.\n\n# Subgoals\n\nFirst, create and edit subgoals if none exist and pursue the most appropriate one. This one of the few ways you can \"take notes\" in the Memento-esque environment. This is important, as you may forget what happened later! Use the and tools for this.\n\nThe following is a mock example of the subgoal schema:\n\n1\nFix the tests\nCOMPLETE\nRun them, find the error, fix it\nRan the tests and traced the error to component foo.\nModified the foo component to fix the error\n\n\nNotes:\n\n- Try to phrase the subgoal objective first in terms of observable behavior rather than how to implement it, if possible. The subgoal is what you are solving, not how you are solving it.\n\n# System Messages\n\nMessages from the system are surrounded by or XML tags. These are NOT messages from the user.\n\n# How to Respond\n\n- **Respond as Buffy:** Maintain the helpful and upbeat persona defined above throughout your entire response, but also be as conscise as possible.\n- **DO NOT Narrate Parameter Choices:** While commentary about your actions is required (Rule #2), **DO NOT** explain _why_ you chose specific parameter values for a tool (e.g., don't say \"I am using the path 'src/...' because...\"). Just provide the tool call after your action commentary.\n- **CRITICAL TOOL FORMATTING:**\n - **NO MARKDOWN:** Tool calls **MUST NOT** be wrapped in markdown code blocks (like \\`\\`\\`). Output the raw XML tags directly. **This is non-negotiable.**\n - **MANDATORY EMPTY LINES:** Tool calls **MUST** be surrounded by a _single empty line_ both before the opening tag (e.g., ``) and after the closing tag (e.g., ``). See the example below. **Failure to include these empty lines will break the process.**\n - **NESTED ELEMENTS ONLY:** Tool parameters **MUST** be specified using _only_ nested XML elements, like `value`. You **MUST NOT** use XML attributes within the tool call tags (e.g., writing ``). Stick strictly to the nested element format shown in the example response below. This is absolutely critical for the parser.\n- **User Questions:** If the user is asking for help with ideas or brainstorming, or asking a question, then you should directly answer the user's question, but do not make any changes to the codebase. Do not call modification tools like `write_file`.\n- **Handling Requests:**\n - For complex requests, create a subgoal using to track objectives from the user request. Use to record progress. Put summaries of actions taken into the subgoal's .\n - For straightforward requests, proceed directly without adding subgoals.\n- **Reading Files:** Try to read as many files as could possibly be relevant in your first 1 or 2 read_files tool calls. List multiple file paths in one tool call, as many as you can. You must read more files whenever it would improve your response.\n- **Minimal Changes:** You should make as few changes as possible to the codebase to address the user's request. Only do what the user has asked for and no more. When modifying existing code, assume every line of code has a purpose and is there for a reason. Do not change the behavior of code except in the most minimal way to accomplish the user's request.\n- **DO NOT run scripts, make git commits or push to remote repositories without permission from the user.** It's extremely important not to run scripts that could have major effects. Similarly, a wrong git push could break production. For these actions, always ask permission first and wait for user confirmation.\n- **Code Hygiene:** Make sure to leave things in a good state:\n\n - Don't forget to add any imports that might be needed\n - Remove unused variables, functions, and files as a result of your changes.\n - If you added files or functions meant to replace existing code, then you should also remove the previous code.\n\n- **Read Before Writing:** If you are about to edit a file, make sure it is one that you have already read, i.e. is included in your context -- otherwise, use the read_file tool to read it first!\n- **Check for Existing Changes:** If the user is requesting a change that you think has already been made based on the current version of files, simply tell the user that \"It looks like that change has already been made!\". It is common that a file you intend to update already has the changes you want.\n- **Think about your next action:** After receiving tool results, carefully reflect on their quality and determine optimal next steps before proceeding. Use your thinking to plan and iterate based on this new information, and then take the best next action.\n- **Package Management:** When adding new packages, use the run_terminal_command tool to install the package rather than editing the package.json file with a guess at the version number to use (or similar for other languages). This way, you will be sure to have the latest version of the package. Do not install packages globally unless asked by the user (e.g. Don't run \\`npm install -g \\`). Always try to use the package manager associated with the project (e.g. it might be \\`pnpm\\` or \\`bun\\` or \\`yarn\\` instead of \\`npm\\`, or similar for other languages).\n- **Refactoring Awareness:** Whenever you modify an exported token like a function or class or variable, you should use the code_search tool to find all references to it before it was renamed (or had its type/parameters changed) and update the references appropriately.\n- **Testing:** If you create a unit test, you should run it using `run_terminal_command` to see if it passes, and fix it if it doesn't.\n- **Front end development** We want to make the UI look as good as possible. Don't hold back. Give it your all.\n\n - Include as many relevant features and interactions as possible\n - Add thoughtful details like hover states, transitions, and micro-interactions\n - Apply design principles: hierarchy, contrast, balance, and movement\n - Create an impressive demonstration showcasing web development capabilities\n\n- **Don't summarize your changes** Omit summaries as much as possible. Be extremely concise when explaining the changes you made. There's no need to write a long explanation of what you did. Keep it to 1-2 two sentences max.\n- **Ending Your Response:** Your aim should be to completely fulfill the user's request before using ending your response. DO NOT END TURN IF YOU ARE STILL WORKING ON THE USER'S REQUEST. If the user's request requires multiple steps, please complete ALL the steps before stopping, even if you have done a lot of work so far.\n- **FINALLY, YOU MUST USE THE END TURN TOOL** When you have fully answered the user _or_ you are explicitly waiting for the user's next typed input, always conclude the message with a standalone `` tool call (surrounded by its required blank lines). This should be at the end of your message, e.g.:\n \n User: Hi\n Assisistant: Hello, what can I do for you today?\\n\\n\n \n\n## Verifying Your Changes at the End of Your Response\n\n### User has a `codebuff.json`\n\nIf the user has a `codebuff.json` with the appropriate `fileChangeHooks`, there is no need to run any commands.\n\nIf the `fileChangeHooks` are not configured, inform the user about the `fileChangeHooks` parameter.\n\n### User has no `codebuff.json`\n\nIf this is the case, inform the user know about the `/init` command (within Codebuff, not a terminal command).\n\nCheck the knowledge files to see if the user has specified a further protocol for what terminal commands should be run to verify edits. For example, a \\`knowledge.md\\` file could specify that after every change you should run the tests or linting or run the type checker. If there are multiple commands to run, you should run them all using '&&' to concatenate them into one commands, e.g. \\`npm run lint && npm run test\\`.\n\n## Example Response (Simplified - Demonstrating Rules)\n\nUser: Please console.log the props in the component Foo\n\nAssistant: Certainly! I can add that console log for you. Let's start by reading the file:\n\n\nsrc/components/foo.tsx\n\n\nNow, I'll add the console.log at the beginning of the Foo component:\n\n\nsrc/components/foo.tsx\n\n// ... existing code ...\nfunction Foo(props: {\nbar: string\n}) {\nconsole.log(\"Foo props:\", props);\n// ... rest of the function ...\n}\n// ... existing code ...\n\n\n\nLet me check my changes\n\n\nnpm run typecheck\n\n\nI see that my changes went through correctly. What would you like to do next?\n\n\n", - "referencedBy": {} - }, - { - "path": "backend/src/templates/prompts.ts", - "content": "import { schemaToJsonStr } from '@codebuff/common/util/zod-schema'\nimport type { AgentTemplate } from '@codebuff/common/types/agent-template'\nimport type { AgentTemplateType } from '@codebuff/common/types/session-state'\nimport { getAgentTemplate } from './agent-registry'\n\nexport async function buildSpawnableAgentsDescription(\n spawnableAgents: AgentTemplateType[],\n agentTemplates: Record,\n): Promise {\n if (spawnableAgents.length === 0) {\n return ''\n }\n\n const subAgentTypesAndTemplates = await Promise.all(\n spawnableAgents.map(async (agentType) => {\n return [\n agentType,\n await getAgentTemplate(agentType, agentTemplates),\n ] as const\n }),\n )\n\n const agentsDescription = subAgentTypesAndTemplates\n .map(([agentType, agentTemplate]) => {\n if (!agentTemplate) {\n // Fallback for unknown agents\n return `- ${agentType}: Dynamic agent (description not available)\nprompt: {\"description\": \"A coding task to complete\", \"type\": \"string\"}\nparams: None`\n }\n const { inputSchema } = agentTemplate\n if (!inputSchema) {\n return `- ${agentType}: ${agentTemplate.spawnPurposePrompt}\nprompt: None\nparams: None`\n }\n const { prompt, params } = inputSchema\n return `- ${agentType}: ${agentTemplate.spawnPurposePrompt}\nprompt: ${schemaToJsonStr(prompt)}\nparams: ${schemaToJsonStr(params)}`\n })\n .filter(Boolean)\n .join('\\n\\n')\n\n return `\\n\\n## Spawnable Agents\n\nUse the spawn_agents tool to spawn agents to help you complete the user request. Here are the available agents by their agent_type:\n\n${agentsDescription}`\n}\n", - "referencedBy": {} - }, - { - "path": "common/src/constants/agents.ts", - "content": "import type { AgentTemplateTypes } from '../types/session-state'\n\n// Define agent personas with their shared characteristics\nexport const AGENT_PERSONAS = {\n // Base agents - all use Buffy persona\n base: {\n displayName: 'Buffy the Enthusiastic Coding Assistant',\n purpose: 'Base agent that orchestrates the full response.',\n } as const,\n base_lite: {\n displayName: 'Buffy the Enthusiastic Coding Assistant',\n purpose: 'Base agent that orchestrates the full response.',\n } as const,\n base_max: {\n displayName: 'Buffy the Enthusiastic Coding Assistant',\n purpose: 'Base agent that orchestrates the full response.',\n } as const,\n base_experimental: {\n displayName: 'Buffy the Enthusiastic Coding Assistant',\n purpose: 'Base agent that orchestrates the full response.',\n } as const,\n claude4_gemini_thinking: {\n displayName: 'Buffy the Enthusiastic Coding Assistant',\n purpose: 'Base agent that orchestrates the full response.',\n } as const,\n\n base_agent_builder: {\n displayName: 'Buffy the Enthusiastic Agent Builder',\n purpose:\n 'Enhanced base agent that can create custom agents and handle all coding tasks',\n } as const,\n\n superagent: {\n displayName: 'Superagent',\n purpose:\n 'Superagent that can spawn multiple code editing agents to complete a task.',\n } as const,\n\n // Ask mode\n ask: {\n displayName: 'Buffy the Enthusiastic Coding Assistant',\n purpose: 'Base ask-mode agent that orchestrates the full response.',\n } as const,\n\n // Specialized agents\n thinker: {\n displayName: 'Theo the Theorizer',\n purpose:\n 'Does deep thinking given the current messages and a specific prompt to focus on. Use this to help you solve a specific problem.',\n } as const,\n file_explorer: {\n displayName: 'Dora The File Explorer',\n purpose: 'Expert at exploring a codebase and finding relevant files.',\n } as const,\n file_picker: {\n displayName: 'Fletcher the File Fetcher',\n purpose: 'Expert at finding relevant files in a codebase.',\n } as const,\n researcher: {\n displayName: 'Reid Searcher the Researcher',\n purpose: 'Expert at researching topics using web search and documentation.',\n } as const,\n planner: {\n displayName: 'Peter Plan the Planner',\n purpose: 'Agent that formulates a comprehensive plan to a prompt.',\n hidden: true,\n } as const,\n dry_run: {\n displayName: 'Sketch the Dry Runner',\n purpose: 'Agent that takes a plan and try to implement it in a dry run.',\n hidden: true,\n } as const,\n reviewer: {\n displayName: 'Nit Pick Nick the Reviewer',\n purpose:\n 'Reviews file changes and responds with critical feedback. Use this after making any significant change to the codebase.',\n } as const,\n agent_builder: {\n displayName: 'Bob the Agent Builder',\n purpose: 'Creates new agent templates for the codebuff mult-agent system',\n hidden: false,\n } as const,\n} as const satisfies Partial<\n Record<\n keyof typeof AgentTemplateTypes,\n { displayName: string; purpose: string; hidden?: boolean }\n >\n>\n\n// Agent IDs list from AGENT_PERSONAS keys\nexport const AGENT_IDS = Object.keys(\n AGENT_PERSONAS,\n) as (keyof typeof AGENT_PERSONAS)[]\n\n// Agent ID prefix constant\nexport const AGENT_ID_PREFIX = 'CodebuffAI/'\n\n// Agent names for client-side reference\nexport const AGENT_NAMES = Object.fromEntries(\n Object.entries(AGENT_PERSONAS).map(([agentType, persona]) => [\n agentType,\n persona.displayName,\n ]),\n) as Record\n\nexport type AgentName =\n (typeof AGENT_PERSONAS)[keyof typeof AGENT_PERSONAS]['displayName']\n\n// Get unique agent names for UI display\nexport const UNIQUE_AGENT_NAMES = Array.from(\n new Set(\n Object.values(AGENT_PERSONAS)\n .filter((persona) => !('hidden' in persona) || !persona.hidden)\n .map((persona) => persona.displayName),\n ),\n)\n\n// Map from display name back to agent types (for parsing user input)\nexport const AGENT_NAME_TO_TYPES = Object.entries(AGENT_NAMES).reduce(\n (acc, [type, name]) => {\n if (!acc[name]) acc[name] = []\n acc[name].push(type)\n return acc\n },\n {} as Record,\n)\n", - "referencedBy": {} - } - ] - } - ], - "parentAgentId": "D-OfY_tExks" - }, - { - "type": "text", - "agentId": "D-OfaYSx8-Q", - "text": "Okay, here's a concise report on the locations in the codebase that could be helpful for creating a custom agent from a starter template, or understanding the existing `git-committer` agent:\n\n* `.agents/git-committer.ts`: This is the definition of the `git-committer` agent. It shows the structure of an agent definition, including its `id`, `inputSchema`, `systemPrompt`, `instructionsPrompt`, and `handleSteps`. Crucially it shows the tools and steps this agent uses.\n* `backend/src/templates/agents/base.ts`: This file provides the base template for creating agents. It defines the core structure, including the input schema, output mode, and available tools.\n* `backend/src/templates/agent-list.ts`: This file defines a list of available static agentTemplates providing a way to reference existing, simple (non-dynamic) agents.\n* `common/src/types/agent-template.ts`: This file defines the `AgentTemplate` type, which is the structure that all agent definitions must adhere to. It specifies the required and optional properties of an agent.\n* `npm-app/src/cli-handlers/agents.ts`: This file contains the logic for displaying and selecting agents within the CLI. You likely do not require this information.\n" - }, - { - "type": "subagent_finish", - "agentId": "D-OfaYSx8-Q", - "agentType": "file-picker", - "displayName": "Fletcher the File Fetcher", - "onlyChild": false, - "parentAgentId": "main-agent", - "prompt": "", - "params": { - "prompt": "your-custom-agent starter template or git-committer agent" - } - }, - { - "type": "text", - "agentId": "D-OfY8_NY2s", - "text": "Here's a short report of the locations in the codebase that could be helpful, focusing on the most relevant files:\n\n* **`backend/src/templates/agents/agent-builder.ts`**: This file contains the `agentBuilder` function, which is responsible for creating new agent templates. It reads agent template types, tool definitions, and example agent files, providing a good starting point for understanding the agent creation process.\n* **`backend/src/templates/agent-registry.ts`**: This file manages the agent registry, fetching agents from the database and assembling local agent templates. It is useful for understanding how agents are stored and retrieved.\n* **`npm-app/src/cli-handlers/agent-creation-chat.ts`**: This file contains the `startAgentCreationChat` function, which guides users through the agent creation process via a CLI chat interface. It showcases how agent requirements are collected and used to create agent templates.\n* **`web/src/content/agents/creating-new-agents.mdx`**: This file provides documentation on creating new agents, including examples and best practices. It offers insights into the structure and required fields of agent templates.\n* **`common/src/types/dynamic-agent-template.ts`**: This file defines the schema for dynamic agent templates, outlining the structure and properties of custom Codebuff agents.\n" - }, - { - "type": "subagent_finish", - "agentId": "D-OfY8_NY2s", - "agentType": "file-picker", - "displayName": "Fletcher the File Fetcher", - "onlyChild": false, - "parentAgentId": "main-agent", - "prompt": "", - "params": { - "prompt": "agent builder, agent creation, scaffolding custom agents, agent templates" - } - }, - { - "type": "text", - "agentId": "D-OfY_tExks", - "text": "Here's a concise report on diff-reviewer agent examples and configurations:\n\n* `.agents/examples/diff-reviewer-1.ts`, `.agents/examples/diff-reviewer-2.ts`, `.agents/examples/diff-reviewer-3.ts`, `common/src/util/examples/diff-reviewer-1.ts`, `common/src/util/examples/diff-reviewer-2.ts`, `common/src/util/examples/diff-reviewer-3.ts`: These files provide example definitions for diff-reviewer agents at different levels (1-3), showcasing variations in input schema, tools used, and step handling.\n\n* `backend/src/templates/agents/reviewer.ts`: This file defines the reviewer agent template, including its persona, instructions, and tool usage, focusing on providing feedback on code changes.\n\n* `backend/src/system-prompt/agent-instructions.md`: This file dictates the system prompt and instructions for the diff reviewer, shaping its behavior and emphasizing clarity, conciseness, and adherence to code style.\n\nThese files offer insights into the agent's configuration, behavior, and usage within the codebase.\n" - }, - { - "type": "subagent_finish", - "agentId": "D-OfY_tExks", - "agentType": "file-picker", - "displayName": "Fletcher the File Fetcher", - "onlyChild": false, - "parentAgentId": "main-agent", - "prompt": "", - "params": { - "prompt": "diff-reviewer agent examples and configurations" - } - }, - { - "type": "text", - "agentId": "D-OfaehVPQw", - "text": "backend/src/templates/agents/file-explorer.ts\nbackend/src/tools/definitions/tool/spawn-agents.ts\nbackend/src/tools/handlers/tool/spawn-agents.ts\nbackend/src/templates/agent-registry.ts\ncommon/src/templates/agent-list.ts\ncommon/src/constants/agents.ts\nbackend/src/system-prompt/prompts.ts\nbackend/src/main-prompt.ts\nnpm-app/src/agents/load-agents.ts\nnpm-app/src/cli-handlers/agents.ts\nbackend/src/templates/base.ts\nbackend/src/tools/definitions/tool/spawn-agent-inline.ts" - }, - { - "type": "subagent_finish", - "agentId": "D-OgWSwaG9Q", - "agentType": "file-lister", - "displayName": "Liszt the File Lister", - "onlyChild": true, - "parentAgentId": "D-OfaehVPQw", - "prompt": "", - "params": { - "prompt": "file-explorer agent definition and spawn target" - } - }, - { - "type": "tool_result", - "toolCallId": "b8a5729e-8e1d-4629-9a40-03ed7cd2ac40", - "toolName": "spawn_agents", - "output": [ - { - "type": "json", - "value": [ - { - "agentName": "Liszt the File Lister", - "agentType": "file-lister", - "value": { - "type": "lastMessage", - "value": [ - { - "role": "assistant", - "content": [ - { - "type": "text", - "text": "backend/src/templates/agents/file-explorer.ts\nbackend/src/tools/definitions/tool/spawn-agents.ts\nbackend/src/tools/handlers/tool/spawn-agents.ts\nbackend/src/templates/agent-registry.ts\ncommon/src/templates/agent-list.ts\ncommon/src/constants/agents.ts\nbackend/src/system-prompt/prompts.ts\nbackend/src/main-prompt.ts\nnpm-app/src/agents/load-agents.ts\nnpm-app/src/cli-handlers/agents.ts\nbackend/src/templates/base.ts\nbackend/src/tools/definitions/tool/spawn-agent-inline.ts" - } - ] - } - ] - } - } - ] - } - ], - "parentAgentId": "D-OfaehVPQw" - }, - { - "type": "tool_call", - "toolCallId": "3aa0ab7d-9afc-4330-929f-c01e72330ad1", - "toolName": "read_files", - "input": { - "paths": [ - "backend/src/templates/agents/file-explorer.ts", - "backend/src/tools/definitions/tool/spawn-agents.ts", - "backend/src/tools/handlers/tool/spawn-agents.ts", - "backend/src/templates/agent-registry.ts", - "common/src/templates/agent-list.ts", - "common/src/constants/agents.ts", - "backend/src/system-prompt/prompts.ts", - "backend/src/main-prompt.ts", - "npm-app/src/agents/load-agents.ts", - "npm-app/src/cli-handlers/agents.ts", - "backend/src/templates/base.ts", - "backend/src/tools/definitions/tool/spawn-agent-inline.ts" - ] - }, - "agentId": "D-OfaehVPQw", - "parentAgentId": "main-agent", - "includeToolCall": true - }, - { - "type": "tool_result", - "toolCallId": "3aa0ab7d-9afc-4330-929f-c01e72330ad1", - "toolName": "read_files", - "output": [ - { - "type": "json", - "value": [ - { - "path": "backend/src/templates/agents/file-explorer.ts", - "content": "import { AgentTemplateTypes } from '@codebuff/common/types/session-state'\nimport { z } from 'zod/v4'\n\nimport type { AgentTemplate } from '../types'\n\nconst paramsSchema = z.object({\n prompts: z\n .array(z.string())\n .describe(\n 'List of 1-4 different parts of the codebase that could be useful to explore',\n ),\n})\n\nexport const fileExplorer = {\n id: AgentTemplateTypes.file_explorer,\n displayName: 'Dora the File Explorer',\n spawnPurposePrompt:\n 'Spawns multiple file picker agents in parallel to comprehensively explore the codebase from different perspectives',\n model: 'anthropic/claude-4-sonnet-20250522',\n outputMode: 'structured_output',\n includeMessageHistory: false,\n toolNames: ['spawn_agents', 'set_output'],\n spawnableAgents: ['file-picker'],\n inputSchema: {\n prompt: z\n .string()\n .describe('What you need to accomplish by exploring the codebase'),\n params: paramsSchema,\n },\n systemPrompt:\n 'You are a file explorer agent that spawns multiple file picker agents in parallel to comprehensively explore the codebase.',\n instructionsPrompt: '',\n stepPrompt: '',\n\n handleSteps: function* ({ prompt, params }) {\n const filePickerPrompts = params.prompts.map(\n (focusPrompt) =>\n `Based on the overall goal \"${prompt}\", find files related to this specific area: ${focusPrompt}`,\n )\n\n // Spawn all file pickers in parallel\n const { toolResult: spawnResult } = yield {\n toolName: 'spawn_agents' as const,\n args: {\n agents: filePickerPrompts.map((promptText) => ({\n agent_type: 'file-picker' as const,\n prompt: promptText,\n })),\n },\n }\n\n // Set output with aggregated results\n yield {\n toolName: 'set_output' as const,\n args: {\n results: spawnResult,\n },\n }\n },\n} satisfies AgentTemplate>\n", - "referencedBy": {} - }, - { - "path": "backend/src/tools/definitions/tool/spawn-agents.ts", - "content": "import { getToolCallString } from '@codebuff/common/tools/utils'\n\nimport type { ToolDescription } from '../tool-def-type'\n\nconst toolName = 'spawn_agents'\nexport const spawnAgentsTool = {\n toolName,\n description: `\nUse this tool to spawn agents to help you complete the user request. Each agent has specific requirements for prompt and params based on their inputSchema.\n\nThe prompt field is a simple string, while params is a JSON object that gets validated against the agent's schema.\n\nExample:\n${getToolCallString(toolName, {\n agents: [\n {\n agent_type: 'planner',\n prompt: 'Create a plan for implementing user authentication',\n params: { filePaths: ['src/auth.ts', 'src/user.ts'] },\n },\n ],\n})}\n `.trim(),\n} satisfies ToolDescription\n", - "referencedBy": {} - }, - { - "path": "backend/src/tools/handlers/tool/spawn-agents.ts", - "content": "import { generateCompactId } from '@codebuff/common/util/string'\n\nimport { getAgentTemplate } from '../../../templates/agent-registry'\nimport { logger } from '../../../util/logger'\n\nimport type { CodebuffToolCall } from '../../constants'\nimport type { CodebuffToolHandlerFunction } from '../handler-function-type'\nimport type { AgentTemplate } from '@codebuff/common/types/agent-template'\nimport type { CodebuffMessage } from '@codebuff/common/types/message'\nimport type { PrintModeEvent } from '@codebuff/common/types/print-mode'\nimport type {\n AgentState,\n AgentTemplateType,\n} from '@codebuff/common/types/session-state'\nimport type { ProjectFileContext } from '@codebuff/common/util/file'\nimport type { WebSocket } from 'ws'\n\nexport type SendSubagentChunk = (data: {\n userInputId: string\n agentId: string\n agentType: string\n chunk: string\n prompt?: string\n}) => void\n\nexport const handleSpawnAgents = ((params: {\n previousToolCallFinished: Promise\n toolCall: CodebuffToolCall<'spawn_agents'>\n\n fileContext: ProjectFileContext\n clientSessionId: string\n userInputId: string\n\n getLatestState: () => { messages: CodebuffMessage[] }\n state: {\n ws?: WebSocket\n fingerprintId?: string\n userId?: string\n agentTemplate?: AgentTemplate\n localAgentTemplates?: Record\n sendSubagentChunk?: SendSubagentChunk\n messages?: CodebuffMessage[]\n agentState?: AgentState\n }\n}): { result: Promise; state: {} } => {\n const {\n previousToolCallFinished,\n toolCall,\n\n fileContext,\n clientSessionId,\n userInputId,\n getLatestState,\n state,\n } = params\n const { agents } = toolCall.args\n const {\n ws,\n fingerprintId,\n userId,\n agentTemplate: parentAgentTemplate,\n localAgentTemplates,\n sendSubagentChunk,\n messages,\n } = state\n let { agentState } = state\n\n if (!ws) {\n throw new Error(\n 'Internal error for spawn_agents: Missing WebSocket in state',\n )\n }\n if (!fingerprintId) {\n throw new Error(\n 'Internal error for spawn_agents: Missing fingerprintId in state',\n )\n }\n if (!parentAgentTemplate) {\n throw new Error(\n 'Internal error for spawn_agents: Missing agentTemplate in state',\n )\n }\n if (!sendSubagentChunk) {\n throw new Error(\n 'Internal error for spawn_agents: Missing sendSubagentChunk in state',\n )\n }\n if (!messages) {\n throw new Error(\n 'Internal error for spawn_agents: Missing messages in state',\n )\n }\n if (!agentState) {\n throw new Error(\n 'Internal error for spawn_agents: Missing agentState in state',\n )\n }\n if (!localAgentTemplates) {\n throw new Error(\n 'Internal error for spawn_agents: Missing localAgentTemplates in state',\n )\n }\n\n const triggerSpawnAgents = async () => {\n const conversationHistoryMessage: CodebuffMessage = {\n role: 'user',\n content: `For context, the following is the conversation history between the user and an assistant:\\n\\n${JSON.stringify(\n getLatestState().messages,\n null,\n 2,\n )}`,\n }\n const results = await Promise.allSettled(\n agents.map(async ({ agent_type: agentTypeStr, prompt, params }) => {\n const agentType = agentTypeStr as AgentTemplateType\n const agentTemplate = await getAgentTemplate(\n agentType,\n localAgentTemplates,\n )\n\n if (!agentTemplate) {\n throw new Error(`Agent type ${agentTypeStr} not found.`)\n }\n\n if (!parentAgentTemplate.spawnableAgents.includes(agentType)) {\n throw new Error(\n `Agent type ${parentAgentTemplate.id} is not allowed to spawn child agent type ${agentType}.`,\n )\n }\n\n // Validate prompt and params against agent's schema\n const { inputSchema } = agentTemplate\n\n // Validate prompt requirement\n if (inputSchema.prompt) {\n const result = inputSchema.prompt.safeParse(prompt)\n if (!result.success) {\n throw new Error(\n `Invalid prompt for agent ${agentType}: ${JSON.stringify(result.error.issues, null, 2)}`,\n )\n }\n }\n\n // Validate params if schema exists\n if (inputSchema.params) {\n const result = inputSchema.params.safeParse(params)\n if (!result.success) {\n throw new Error(\n `Invalid params for agent ${agentType}: ${JSON.stringify(result.error.issues, null, 2)}`,\n )\n }\n }\n\n const agentId = generateCompactId()\n const subAgentMessages: CodebuffMessage[] = []\n if (agentTemplate.includeMessageHistory) {\n subAgentMessages.push(conversationHistoryMessage)\n }\n\n const subAgentState: AgentState = {\n agentId,\n agentType,\n agentContext: {},\n subagents: [],\n messageHistory: subAgentMessages,\n stepsRemaining: 20, // MAX_AGENT_STEPS\n output: undefined,\n parentId: agentState!.agentId,\n }\n\n logger.debug(\n {\n agentTemplate,\n prompt,\n params,\n agentId,\n parentId: subAgentState.parentId,\n },\n `Spawning agent — ${agentType} (${agentId})`,\n )\n\n // Import loopAgentSteps dynamically to avoid circular dependency\n const { loopAgentSteps } = await import('../../../run-agent-step')\n\n const result = await loopAgentSteps(ws, {\n userInputId: `${userInputId}-${agentType}${agentId}`,\n prompt: prompt || '',\n params,\n agentType: agentTemplate.id,\n agentState: subAgentState,\n fingerprintId,\n fileContext,\n localAgentTemplates,\n toolResults: [],\n userId,\n clientSessionId,\n onResponseChunk: (chunk: string | PrintModeEvent) => {\n if (typeof chunk !== 'string') {\n return\n }\n // Send subagent streaming chunks to client\n sendSubagentChunk({\n userInputId,\n agentId,\n agentType,\n chunk,\n prompt,\n })\n },\n })\n\n return {\n ...result,\n agentType,\n agentName: agentTemplate.displayName,\n }\n }),\n )\n\n const reports = await Promise.all(\n results.map(async (result, index) => {\n const agentInfo = agents[index]\n const agentTypeStr = agentInfo.agent_type\n\n if (result.status === 'fulfilled') {\n const { agentState, agentName } = result.value\n const agentTemplate = await getAgentTemplate(\n agentState.agentType!,\n localAgentTemplates,\n )\n if (!agentTemplate) {\n return `**Agent (${agentTypeStr}):**\\nError: Could not find agent template for ${agentState.agentType!}`\n }\n let report = ''\n\n if (agentTemplate.outputMode === 'structured_output') {\n report = JSON.stringify(result.value.agentState.output, null, 2)\n } else if (agentTemplate.outputMode === 'last_message') {\n const { agentState } = result.value\n const assistantMessages = agentState.messageHistory.filter(\n (message) => message.role === 'assistant',\n )\n const lastAssistantMessage =\n assistantMessages[assistantMessages.length - 1]\n if (!lastAssistantMessage) {\n report = 'No response from agent'\n } else if (typeof lastAssistantMessage.content === 'string') {\n report = lastAssistantMessage.content\n } else {\n report = JSON.stringify(lastAssistantMessage.content, null, 2)\n }\n } else if (agentTemplate.outputMode === 'all_messages') {\n const { agentState } = result.value\n // Remove the first message, which includes the previous conversation history.\n const agentMessages = agentState.messageHistory.slice(1)\n report = `Agent messages:\\n\\n${JSON.stringify(agentMessages, null, 2)}`\n } else {\n throw new Error(\n `Unknown output mode: ${'outputMode' in agentTemplate ? agentTemplate.outputMode : 'undefined'}`,\n )\n }\n\n return `**${agentName}:**\\n${report}`\n } else {\n return `**Agent (${agentTypeStr}):**\\nError spawning agent: ${result.reason}`\n }\n }),\n )\n return reports\n .map((report: string) => `${report}`)\n .join('\\n')\n }\n\n return {\n result: previousToolCallFinished.then(triggerSpawnAgents),\n state: {},\n }\n}) satisfies CodebuffToolHandlerFunction<'spawn_agents'>\n", - "referencedBy": {} - }, - { - "path": "backend/src/templates/agent-registry.ts", - "content": "import type { AgentTemplate } from '@codebuff/common/types/agent-template'\nimport db from '@codebuff/common/db'\nimport * as schema from '@codebuff/common/db/schema'\nimport { and, desc, eq } from 'drizzle-orm'\n\nimport { ProjectFileContext } from '@codebuff/common/util/file'\nimport { logger } from '../util/logger'\nimport { agentTemplates as staticTemplates } from './agent-list'\nimport {\n DynamicAgentValidationError,\n validateAgents,\n validateSingleAgent,\n} from '@codebuff/common/templates/agent-validation'\nimport { DynamicAgentTemplate } from '@codebuff/common/types/dynamic-agent-template'\n\nexport type AgentRegistry = Record\n\n// Global database cache - only state in the system\nconst databaseAgentCache = new Map()\n\n/**\n * Parse agent ID to extract publisher, agent name, and version\n */\nfunction parseAgentId(fullAgentId: string): {\n publisherId: string\n agentId: string\n version?: string\n} | null {\n // Check if it's in the publisher/agent-id[@version] format\n const parts = fullAgentId.split('/')\n if (parts.length !== 2) {\n return null\n }\n\n const [publisherId, agentNameWithVersion] = parts\n\n // Check for version suffix\n const versionMatch = agentNameWithVersion.match(/^(.+)@(.+)$/)\n if (versionMatch) {\n const [, agentId, version] = versionMatch\n return { publisherId, agentId, version }\n }\n\n return { publisherId, agentId: agentNameWithVersion }\n}\n\n/**\n * Fetch an agent from the database by publisher/agent-id[@version] format\n */\nasync function fetchAgentFromDatabase(parsedAgentId: {\n publisherId: string\n agentId: string\n version?: string\n}): Promise {\n const { publisherId, agentId, version } = parsedAgentId\n\n try {\n let agentConfig\n\n if (version && version !== 'latest') {\n // Query for specific version\n agentConfig = await db\n .select()\n .from(schema.agentConfig)\n .where(\n and(\n eq(schema.agentConfig.id, agentId),\n eq(schema.agentConfig.publisher_id, publisherId),\n eq(schema.agentConfig.version, version),\n ),\n )\n .then((rows) => rows[0])\n } else {\n // Query for latest version\n agentConfig = await db\n .select()\n .from(schema.agentConfig)\n .where(\n and(\n eq(schema.agentConfig.id, agentId),\n eq(schema.agentConfig.publisher_id, publisherId),\n ),\n )\n .orderBy(\n desc(schema.agentConfig.major),\n desc(schema.agentConfig.minor),\n desc(schema.agentConfig.patch),\n )\n .limit(1)\n .then((rows) => rows[0])\n }\n\n if (!agentConfig) {\n logger.debug(\n { publisherId, agentId, version },\n 'fetchAgentFromDatabase: Agent not found in database',\n )\n return null\n }\n\n const rawAgentData = agentConfig.data as DynamicAgentTemplate\n\n // Validate the raw agent data with the original agentId (not full identifier)\n const validationResult = validateSingleAgent(\n { ...rawAgentData, id: agentId },\n {\n filePath: `${publisherId}/${agentId}@${agentConfig.version}`,\n skipSubagentValidation: true,\n },\n )\n\n if (!validationResult.success) {\n logger.error(\n {\n publisherId,\n agentId,\n version: agentConfig.version,\n error: validationResult.error,\n },\n 'fetchAgentFromDatabase: Agent validation failed',\n )\n return null\n }\n\n // Set the correct full agent ID for the final template\n const agentTemplate = {\n ...validationResult.agentTemplate!,\n id: `${publisherId}/${agentId}@${agentConfig.version}`,\n }\n\n logger.debug(\n {\n publisherId,\n agentId,\n version: agentConfig.version,\n fullAgentId: agentTemplate.id,\n },\n 'fetchAgentFromDatabase: Successfully loaded and validated agent from database',\n )\n\n return agentTemplate\n } catch (error) {\n logger.error(\n { publisherId, agentId, version, error },\n 'fetchAgentFromDatabase: Error fetching agent from database',\n )\n return null\n }\n}\n\n/**\n * Single function to look up an agent template with clear priority order:\n * 1. localAgentTemplates (dynamic agents + static templates)\n * 2. Database cache\n * 3. Database query\n */\nexport async function getAgentTemplate(\n agentId: string,\n localAgentTemplates: Record,\n): Promise {\n // 1. Check localAgentTemplates first (dynamic agents + static templates)\n if (localAgentTemplates[agentId]) {\n return localAgentTemplates[agentId]\n }\n // 2. Check database cache\n const cacheKey = agentId\n if (databaseAgentCache.has(cacheKey)) {\n return databaseAgentCache.get(cacheKey) || null\n }\n\n const parsed = parseAgentId(agentId)\n if (!parsed) {\n logger.debug({ agentId }, 'getAgentTemplate: Failed to parse agent ID')\n return null\n }\n\n // 3. Query database (only for publisher/agent-id format)\n const dbAgent = await fetchAgentFromDatabase(parsed)\n if (dbAgent && parsed.version && parsed.version !== 'latest') {\n // Cache only specific versions to avoid stale 'latest' results\n databaseAgentCache.set(cacheKey, dbAgent)\n }\n return dbAgent\n}\n\n/**\n * Assemble local agent templates from fileContext + static templates\n */\nexport function assembleLocalAgentTemplates(fileContext: ProjectFileContext): {\n agentTemplates: Record\n validationErrors: DynamicAgentValidationError[]\n} {\n // Load dynamic agents using the service\n const { templates: dynamicTemplates, validationErrors } = validateAgents(\n fileContext.agentTemplates || {},\n )\n\n // Combine static and dynamic templates\n const agentTemplates = { ...staticTemplates, ...dynamicTemplates }\n\n return { agentTemplates, validationErrors }\n}\n\n/**\n * Clear the database agent cache (useful for testing)\n */\nexport function clearDatabaseCache(): void {\n databaseAgentCache.clear()\n}\n", - "referencedBy": {} - }, - { - "path": "common/src/templates/agent-list.ts", - "content": "[FILE_DOES_NOT_EXIST]", - "referencedBy": {} - }, - { - "path": "common/src/constants/agents.ts", - "content": "import type { AgentTemplateTypes } from '../types/session-state'\n\n// Define agent personas with their shared characteristics\nexport const AGENT_PERSONAS = {\n // Base agents - all use Buffy persona\n base: {\n displayName: 'Buffy the Enthusiastic Coding Assistant',\n purpose: 'Base agent that orchestrates the full response.',\n } as const,\n base_lite: {\n displayName: 'Buffy the Enthusiastic Coding Assistant',\n purpose: 'Base agent that orchestrates the full response.',\n } as const,\n base_max: {\n displayName: 'Buffy the Enthusiastic Coding Assistant',\n purpose: 'Base agent that orchestrates the full response.',\n } as const,\n base_experimental: {\n displayName: 'Buffy the Enthusiastic Coding Assistant',\n purpose: 'Base agent that orchestrates the full response.',\n } as const,\n claude4_gemini_thinking: {\n displayName: 'Buffy the Enthusiastic Coding Assistant',\n purpose: 'Base agent that orchestrates the full response.',\n } as const,\n\n base_agent_builder: {\n displayName: 'Buffy the Enthusiastic Agent Builder',\n purpose:\n 'Enhanced base agent that can create custom agents and handle all coding tasks',\n } as const,\n\n superagent: {\n displayName: 'Superagent',\n purpose:\n 'Superagent that can spawn multiple code editing agents to complete a task.',\n } as const,\n\n // Ask mode\n ask: {\n displayName: 'Buffy the Enthusiastic Coding Assistant',\n purpose: 'Base ask-mode agent that orchestrates the full response.',\n } as const,\n\n // Specialized agents\n thinker: {\n displayName: 'Theo the Theorizer',\n purpose:\n 'Does deep thinking given the current messages and a specific prompt to focus on. Use this to help you solve a specific problem.',\n } as const,\n file_explorer: {\n displayName: 'Dora The File Explorer',\n purpose: 'Expert at exploring a codebase and finding relevant files.',\n } as const,\n file_picker: {\n displayName: 'Fletcher the File Fetcher',\n purpose: 'Expert at finding relevant files in a codebase.',\n } as const,\n researcher: {\n displayName: 'Reid Searcher the Researcher',\n purpose: 'Expert at researching topics using web search and documentation.',\n } as const,\n planner: {\n displayName: 'Peter Plan the Planner',\n purpose: 'Agent that formulates a comprehensive plan to a prompt.',\n hidden: true,\n } as const,\n dry_run: {\n displayName: 'Sketch the Dry Runner',\n purpose: 'Agent that takes a plan and try to implement it in a dry run.',\n hidden: true,\n } as const,\n reviewer: {\n displayName: 'Nit Pick Nick the Reviewer',\n purpose:\n 'Reviews file changes and responds with critical feedback. Use this after making any significant change to the codebase.',\n } as const,\n agent_builder: {\n displayName: 'Bob the Agent Builder',\n purpose: 'Creates new agent templates for the codebuff mult-agent system',\n hidden: false,\n } as const,\n} as const satisfies Partial<\n Record<\n keyof typeof AgentTemplateTypes,\n { displayName: string; purpose: string; hidden?: boolean }\n >\n>\n\n// Agent IDs list from AGENT_PERSONAS keys\nexport const AGENT_IDS = Object.keys(\n AGENT_PERSONAS,\n) as (keyof typeof AGENT_PERSONAS)[]\n\n// Agent ID prefix constant\nexport const AGENT_ID_PREFIX = 'CodebuffAI/'\n\n// Agent names for client-side reference\nexport const AGENT_NAMES = Object.fromEntries(\n Object.entries(AGENT_PERSONAS).map(([agentType, persona]) => [\n agentType,\n persona.displayName,\n ]),\n) as Record\n\nexport type AgentName =\n (typeof AGENT_PERSONAS)[keyof typeof AGENT_PERSONAS]['displayName']\n\n// Get unique agent names for UI display\nexport const UNIQUE_AGENT_NAMES = Array.from(\n new Set(\n Object.values(AGENT_PERSONAS)\n .filter((persona) => !('hidden' in persona) || !persona.hidden)\n .map((persona) => persona.displayName),\n ),\n)\n\n// Map from display name back to agent types (for parsing user input)\nexport const AGENT_NAME_TO_TYPES = Object.entries(AGENT_NAMES).reduce(\n (acc, [type, name]) => {\n if (!acc[name]) acc[name] = []\n acc[name].push(type)\n return acc\n },\n {} as Record,\n)\n", - "referencedBy": {} - }, - { - "path": "backend/src/system-prompt/prompts.ts", - "content": "import { STOP_MARKER } from '@codebuff/common/constants'\nimport {\n codebuffConfigFile,\n CodebuffConfigSchema,\n} from '@codebuff/common/json-config/constants'\nimport { stringifySchema } from '@codebuff/common/json-config/stringify-schema'\nimport {\n flattenTree,\n getLastReadFilePaths,\n} from '@codebuff/common/project-file-tree'\nimport { createMarkdownFileBlock } from '@codebuff/common/util/file'\nimport { truncateString } from '@codebuff/common/util/string'\nimport { closeXml } from '@codebuff/common/util/xml'\n\nimport { truncateFileTreeBasedOnTokenBudget } from './truncate-file-tree'\n\nimport type { ProjectFileContext } from '@codebuff/common/util/file'\n\nexport const configSchemaPrompt = `\n# Codebuff Configuration (${codebuffConfigFile})\n\n## Schema\n\nThe following describes the structure of the \\`./${codebuffConfigFile}\\` configuration file that users might have in their project root. You can use this to understand user settings if they mention them.\n\n${stringifySchema(CodebuffConfigSchema)}\n\n## Background Processes\n\nThe user does not have access to these outputs. Please display any pertinent information to the user before referring to it.\n\nTo stop a background process, attempt to close the process using the appropriate command. If you deem that command to be \\`kill\\`, **make sure** to kill the **ENTIRE PROCESS GROUP** (Mac/Linux) or tree (Windows).\n\nWhen you want to restart a background process, make sure to run the terminal command in the background.\n`.trim()\n\nexport const knowledgeFilesPrompt = `\n# Knowledge files\n\nKnowledge files are your guide to the project. Knowledge files (files ending in \"knowledge.md\" or \"CLAUDE.md\") within a directory capture knowledge about that portion of the codebase. They are another way to take notes in this \"Memento\"-style environment.\n\nKnowledge files were created by previous engineers working on the codebase, and they were given these same instructions. They contain key concepts or helpful tips that are not obvious from the code. e.g., let's say I want to use a package manager aside from the default. That is hard to find in the codebase and would therefore be an appropriate piece of information to add to a knowledge file.\n\nEach knowledge file should develop over time into a concise but rich repository of knowledge about the files within the directory, subdirectories, or the specific file it's associated with.\n\nThere is a special class of user knowledge files that are stored in the user's home directory, e.g. \\`~/.knowledge.md\\`. These files are available to be read, but you cannot edit them because they are outside of the project directory. Do not try to edit them.\n\nWhen should you update a knowledge file?\n- If the user gives broad advice to \"always do x\", that is a good candidate for updating a knowledge file with a concise rule to follow or bit of advice so you won't make the mistake again.\n- If the user corrects you because they expected something different from your response, any bit of information that would help you better meet their expectations in the future is a good candidate for a knowledge file.\n\nWhat to include in knowledge files:\n- The mission of the project. Goals, purpose, and a high-level overview of the project.\n- Explanations of how different parts of the codebase work or interact.\n- Examples of how to do common tasks with a short explanation.\n- Anti-examples of what should be avoided.\n- Anything the user has said to do.\n- Anything you can infer that the user wants you to do going forward.\n- Tips and tricks.\n- Style preferences for the codebase.\n- Technical goals that are in progress. For example, migrations that are underway, like using the new backend service instead of the old one.\n- Links to reference pages that are helpful. For example, the url of documentation for an api you are using.\n- Anything else that would be helpful for you or an inexperienced coder to know\n\nWhat *not* to include in knowledge files:\n- Documentation of a single file.\n- Restated code or interfaces in natural language.\n- Anything obvious from reading the codebase.\n- Lots of detail about a minor change.\n- An explanation of the code you just wrote, unless there's something very unintuitive.\n\nAgain, DO NOT include details from your recent change that are not relevant more broadly.\n\nGuidelines for updating knowledge files:\n- Be concise and focused on the most important aspects of the project.\n- Integrate new knowledge into existing sections when possible.\n- Avoid overemphasizing recent changes or the aspect you're currently working on. Your current change is less important than you think.\n- Remove as many words as possible while keeping the meaning. Use command verbs. Use sentence fragments.\n- Use markdown features to improve clarity in knowledge files: headings, coding blocks, lists, dividers and so on.\n\nOnce again: BE CONCISE!\n\nIf the user sends you the url to a page that is helpful now or could be helpful in the future (e.g. documentation for a library or api), you should always save the url in a knowledge file for future reference. Any links included in knowledge files are automatically scraped and the web page content is added to the knowledge file.\n`.trim()\n\nconst initPrompt = `\nUser has typed \"init\". Trigger initialization flow:\n\nFirst, read knowldge.md and ${codebuffConfigFile} top level directory.\n\nKnowledge file:\n- If it does not exist, create a new one with updated information.\n- If it does, do nothing.\n\nConfig file (probably already exists):\n- Do not edit the description field.\n- If it looks already populated, do nothing.\n- If it is just a template without any configurations set (empty arrays), determine whether background processes are necessary for development. If they are, populate the fields to according to the project. Additionally:\n - Do provide:\n - startupProcesses.item.stdoutFile: \"logs/{name}.log\"\n - Do not provide:\n - startupProcesses.item.stderrFile\n - startupProcesses.item.enabled\n - Provide startupProcesses.item.cwd only if it is not '.'\n\nAfter populating the config file (if necessary), simply respond to the user with:\n\n✅ Created ${codebuffConfigFile}\n\nThe CLI will automatically show additional tips and start any configured background processes after this response completes.\n`.trim()\n\nconst compactPrompt = `\nUser has typed \"compact\". Summarize the current conversation and prepare it to replace the existing message history.\n\n1. Summarize the entire conversation up to this point (excluding this 'compact' command).\n2. The summary should be detailed and must capture the key decisions, analysis, changes, and outcomes.\n`.trim()\n\nconst exportPrompt = `\nUser has typed \"export\". Export the current conversation. (It's ok to proceed even if in \"Ask\" mode because of user change to \"Export\" mode).\n\n1. Summarize the entire conversation up to this point from the message history (excluding this 'export' command) into a new file.\n2. The summary MUST be in Markdown format.\n3. The summary MUST include:\n - All key decisions made during the conversation.\n - All significant file changes. If you have access to write_file blocks from our history, reproduce their paths and content accurately. If you only have diffs or descriptions of changes, summarize those.\n - The reasoning behind those decisions and changes.\n4. Use the 'write_file' tool to save this Markdown summary to a new file with a generated name starting with the prefix 'codebuff-export-' like 'codebuff-export-topic-of-conversation.md' in the project root directory.\n\nWrite file tool format:\n\n\ncodebuff-export-file-name.md${closeXml('path')}\n\n[Insert markdown content here]\n${closeXml('content')}\n${closeXml('write_file')}\n`.trim()\n\nexport const additionalSystemPrompts = {\n '/init': initPrompt,\n init: initPrompt,\n '/export': exportPrompt,\n export: exportPrompt,\n '/compact': compactPrompt,\n compact: compactPrompt,\n} as const\n\nexport const getProjectFileTreePrompt = (\n fileContext: ProjectFileContext,\n fileTreeTokenBudget: number,\n mode: 'search' | 'agent',\n) => {\n const { projectRoot } = fileContext\n const { printedTree, truncationLevel } = truncateFileTreeBasedOnTokenBudget(\n fileContext,\n Math.max(0, fileTreeTokenBudget),\n )\n\n const truncationNote =\n truncationLevel === 'none'\n ? ''\n : truncationLevel === 'unimportant-files'\n ? '\\nNote: Unimportant files (like build artifacts and cache files) have been removed from the file tree.'\n : truncationLevel === 'tokens'\n ? '\\nNote: Selected function, class, and variable names in source files have been removed from the file tree to fit within token limits.'\n : '\\nNote: The file tree has been truncated to show a subset of files to fit within token limits.'\n\n return `\n# Project file tree\n\nAs Buffy, you have access to all the files in the project.\n\nThe following is the path to the project on the user's computer. It is also the current working directory for terminal commands:\n\n${projectRoot}\n${closeXml('project_path')}\n\nWithin this project directory, here is the file tree.\nNote that the file tree:\n- Is cached from the start of this conversation. Files created after the start of this conversation will not appear.\n- Excludes files that are .gitignored.\n${\n mode === 'agent'\n ? `\\nThe project file tree below can be ignored unless you need to know what files are in the project.\\n`\n : ''\n}\n\n${printedTree}\n${closeXml('project_file_tree')}\n${truncationNote}\n`.trim()\n}\n\nconst windowsNote = `\nNote: many commands in the terminal are different on Windows.\nFor example, the mkdir command is \\`mkdir\\` instead of \\`mkdir -p\\`. Instead of grep, use \\`findstr\\`. Instead of \\`ls\\` use \\`dir\\` to list files. Instead of \\`mv\\` use \\`move\\`. Instead of \\`rm\\` use \\`del\\`. Instead of \\`cp\\` use \\`copy\\`. Unless the user is in Powershell, in which case you should use the Powershell commands instead.\n`.trim()\n\nexport const getSystemInfoPrompt = (fileContext: ProjectFileContext) => {\n const { fileTree, shellConfigFiles, systemInfo } = fileContext\n const flattenedNodes = flattenTree(fileTree)\n const lastReadFilePaths = getLastReadFilePaths(flattenedNodes, 20)\n\n return `\n# System Info\n\nOperating System: ${systemInfo.platform}\n${systemInfo.platform === 'win32' ? windowsNote + '\\n' : ''}\nShell: ${systemInfo.shell}\n\n\n${Object.entries(shellConfigFiles)\n .map(([path, content]) => createMarkdownFileBlock(path, content))\n .join('\\n')}\n${closeXml('user_shell_config_files')}\n\nThe following are the most recently read files according to the OS atime. This is cached from the start of this conversation:\n\n${lastReadFilePaths.join('\\n')}\n${closeXml('recently_read_file_paths_most_recent_first')}\n`.trim()\n}\n\nexport const getGitChangesPrompt = (fileContext: ProjectFileContext) => {\n const { gitChanges } = fileContext\n if (!gitChanges) {\n return ''\n }\n const maxLength = 30_000\n return `\nCurrent Git Changes:\n\n${truncateString(gitChanges.status, maxLength / 10)}\n${closeXml('git_status')}\n\n\n${truncateString(gitChanges.diff, maxLength)}\n${closeXml('git_diff')}\n\n\n${truncateString(gitChanges.diffCached, maxLength)}\n${closeXml('git_diff_cached')}\n\n\n${truncateString(gitChanges.lastCommitMessages, maxLength / 10)}\n${closeXml('git_commit_messages_most_recent_first')}\n`.trim()\n}\n\nexport const gitCommitGuidePrompt = `\n### Using git to commit changes\n\nWhen the user requests a new git commit, please follow these steps closely:\n\n1. **Run two run_terminal_command tool calls:**\n - Run \\`git diff\\` to review both staged and unstaged modifications.\n - Run \\`git log\\` to check recent commit messages, ensuring consistency with this repository's style.\n\n2. **Select relevant files to include in the commit:**\n Use the git context established at the start of this conversation to decide which files are pertinent to the changes. Stage any new untracked files that are relevant, but avoid committing previously modified files (from the beginning of the conversation) unless they directly relate to this commit.\n\n3. **Analyze the staged changes and compose a commit message:**\n Enclose your analysis in tags. Within these tags, you should:\n - Note which files have been altered or added.\n - Categorize the nature of the changes (e.g., new feature, fix, refactor, documentation, etc.).\n - Consider the purpose or motivation behind the alterations.\n - Refrain from using tools to inspect code beyond what is presented in the git context.\n - Evaluate the overall impact on the project.\n - Check for sensitive details that should not be committed.\n - Draft a concise, one- to two-sentence commit message focusing on the “why” rather than the “what.”\n - Use precise, straightforward language that accurately represents the changes.\n - Ensure the message provides clarity—avoid generic or vague terms like “Update” or “Fix” without context.\n - Revisit your draft to confirm it truly reflects the changes and their intention.\n\n4. **Create the commit, ending with this specific footer:**\n \\`\\`\\`\n Generated with Codebuff 🤖\n Co-Authored-By: Codebuff \n \\`\\`\\`\n To maintain proper formatting, always place the commit message in a HEREDOC. For instance:\n \\`\\`\\`\n git commit -m \"$(cat <<'EOF'\n Your commit message here.\n\n 🤖 Generated with Codebuff\n Co-Authored-By: Codebuff \n EOF\n )\"\n \\`\\`\\`\n (Make sure to end each line with ^ on Windows:)\n \\`\\`\\`\n git commit -m \"Your commit message here.^\n ^\n 🤖 Generated with Codebuff^\n Co-Authored-By: Codebuff \"\n \\`\\`\\`\n\n**Important details**\n\n- When feasible, use a single \\`git commit -am\\` command to add and commit together, but do not accidentally stage unrelated files.\n- Never alter the git config.\n- Do not push to the remote repository.\n- Avoid using interactive flags (e.g., \\`-i\\`) that require unsupported interactive input.\n- Do not create an empty commit if there are no changes.\n- Make sure your commit message is concise yet descriptive, focusing on the intention behind the changes rather than merely describing them.\n`\n\n// NOTE: Deprecated prompts below.\n\nconst introPrompt = `\nYou are Buffy, an expert programmer assistant with extensive knowledge across backend and frontend technologies. You are a strong technical writer that communicates with clarity. You are concise. You produce opinions and code that are as simple as possible while accomplishing their purpose.\n\nAs Buffy, you are friendly, professional, and always eager to help users improve their code and understanding of programming concepts.\n\nYou are assisting the user with one particular coding project to which you have full access. You can see the file tree of all the files in the project. You can edit files. You can request to read any set of files to see their full content. You can run terminal commands on the user's computer within the project directory to compile code, run tests, install packages, and search for relevant code. You will be called on again and again for advice and for direct code changes and other changes to files in this project.\n\nIf you are unsure about the answer to a user's question, you should say \"I don't have enough information to confidently answer your question.\" If the scope of the change the user is requesting is too large to implement all at once (e.g. requires greater than 750 lines of code), you can tell the user the scope is too big and ask which sub-problem to focus on first.\n`.trim()\n\nconst toolsPrompt = `\n# Tools\n\nYou have access to the following tools:\n- [DESCRIPTION_OF_FILES]${closeXml('tool_call')}: Find files given a brief natural language description of the files or the name of a function or class you are looking for.\n- [LIST_OF_FILE_PATHS]${closeXml('tool_call')}: Provide a list of file paths to read, separated by newlines. The file paths must be relative to the project root directory. Prefer using this tool over find_files when you know the exact file(s) you want to read.\n- [PATTERN]${closeXml('tool_call')}: Search for the given pattern in the project directory. Use this tool to search for code in the project, like function names, class names, variable names, types, where a function is called from, where it is defined, etc.\n- ${closeXml('tool_call')}: Think through a complex change to the codebase, like implementing a new feature or refactoring some code. Don't pass any arguments to this tool. Use this tool to think on a user request that requires planning. Only use this if the user asks you to plan.\n- [YOUR COMMAND HERE]${closeXml('tool_call')}')}: Execute a command in the terminal and return the result.\n- [URL HERE]${closeXml('tool_call')}')}: Scrape the web page at the given url and return the content.\n- [BROWSER_ACTION_XML_HERE]${closeXml('tool_call')}')}: Navigate to a url, take screenshots, and view console.log output or errors for a web page. Use this tool to debug a web app or improve its visual style.\n\nImportant notes:\n- Immediately after you finish writing the closing tag of a tool call, you should write ${STOP_MARKER}, and end your response. Do not write out any other text. A tool call is a delgation -- do not write any other analysis or commentary.\n- Do not write out a tool call within another tool call block.\n- Do not write out a nested tool call within an block. If you want to read a file before editing it, write the first. Similarly, do not write a tool call to run a terminal command within an block.\n- You can freely explain what tools you have available, but do not write out \" unless you are actually intending to call the tool, otherwise you will accidentally be calling the tool when explaining it.\n\n## Finding files\n\nUse the ...${closeXml('tool_call')}')} tool to read more files beyond what is provided in the initial set of files.\n\nPurpose: Better fulfill the user request by reading files which could contain information relevant to the user's request.\n\nUse cases:\n- If you are calling a function or creating a class and want to know how it works, go get the implementation with a tool call to find_files. E.g. \"The implementation of function foo${closeXml('tool_call')}\".\n- If you want to modify a file, but don't currently have it in context. Be sure to call find_files before writing out an block, or I will be very upset.\n- If you need to understand a section of the codebase, read more files in that directory or subdirectories.\n- Some requests require a broad understanding of multiple parts of the codebase. Consider using find_files to gain more context before making changes.\n\nHowever, use this tool sparingly. DO NOT USE \"find_files\" WHEN:\n- You are creating a new file\n- You want to edit a file that you already have in context. Double check that the file is not listed in the block already before calling find_files.\n- You already called it recently. Multiple calls in a row are not productive.\n- You are inside an block.\n\n## Reading files\n\nUse the ...${closeXml('tool_call')}')} tool to read files you don't already have in context.\n\nFeel free to use this tool as much as needed to read files that would be relevant to the user's request.\n\nHowever, do not use this tool to read files that you already have in context. Do not repeat reading calls that you have already read.\n\nMake sure the file paths are relative to the project root directory, not absolute paths like \"C:\\\\Users\\\\my-project\\\\example.ts\". Also ensure that the path includes all intermediate directories to the file.\n\n## Code search\n\nUse the ...${closeXml('tool_call')}')} tool to search for string patterns in the project's files. This tool uses ripgrep (rg), a fast line-oriented search tool.\n\nPurpose: Search through code files to find files with specific text patterns, function names, variable names, and more.\n\nExamples:\nfoo${closeXml('tool_call')}')}\nimport.*foo${closeXml('tool_call')}')}\n\nNote: quotes will be automatically added around your code search pattern. You might need to escape special characters like '-' or '.' or '\\' if you want to search for them.\n\nUse cases:\n1. Finding all references to a function, class, or variable name across the codebase\n2. Searching for specific code patterns or implementations\n3. Looking up where certain strings or text appear\n4. Finding files that contain specific imports or dependencies\n5. Locating configuration settings or environment variables\n\nThe pattern supports regular expressions and will search recursively through all files in the project by default. Some tips:\n- Be as constraining in the pattern as possible to limit the number of files returned, e.g. if searching for the definition of a function, use \"(function foo|const foo)\" or \"def foo\" instead of merely \"foo\".\n- Use word boundaries (\\b) to match whole words only\n- Searches file content and filenames\n- Automatically ignores binary files, hidden files, and files in .gitignore\n- Case-sensitive by default. Use -i to make it case insensitive.\n- Constrain the search to specific file types using -t , e.g. -t ts or -t py.\n\nDo not use code_search when:\n- You already know the exact file location\n- You want to load the contents of files (use find_files instead)\n- You're inside an block\n\n## Think deeply\n\nWhen the user asks you to create a plan, use the think_deeply tool. This tool leverages deep reasoning capabilities to break down difficult problems into clear implementation steps.\n\nDo not use this tool more than once in a conversation.\n\nUse cases:\n1. Planning new features\n2. Planning refactoring operations\n3. Making architectural decisions\n4. Breaking down difficult problems into steps\n5. When you seem to be stuck and need to get unstuck\n\nBest practices:\n- Use for complex changes that need careful planning\n- Don't use for simple changes or quick decisions\n\nIt's a good idea to ask the user to suggest modifications to the plan, which you can make, or if they want to proceed with the current plan.\n\n## Running terminal commands\n\nYou can write out [YOUR COMMAND HERE]${closeXml('tool_call')}')} to execute shell commands in the user's terminal.\n\nPurpose: Better fulfill the user request by running terminal commands in the user's terminal and reading the standard output.\n\nWarning: Use this tool sparingly. You should only use it when you are sure it is the best way to accomplish the user's request. Do not run more commands than the user has asked for. Especially be careful with commands that could have permanent effects.\n\nIf you just want to show the user a terminal command without immediately running it, you can write out a markdown \\`\\`\\` command block instead:\n\\`\\`\\`bash\n# ... command to show the user ...\n\\`\\`\\`\n\nStick to these use cases:\n1. Compiling the project or running build (e.g., \"npm run build\"). Reading the output can help you edit code to fix build errors. If possible, use an option that performs checks but doesn't emit files, e.g. \\`tsc --noEmit\\`.\n2. Running tests (e.g., \"npm test\"). Reading the output can help you edit code to fix failing tests. Or, you could write new unit tests and then run them.\n3. Moving, renaming, or deleting files and directories. These actions can be vital for refactoring requests. Use commands like \\`mv\\`/\\`move\\` or \\`rm\\`/\\`del\\`.\n\nMost likely, you should ask for permission for any other type of command you want to run. If asking for permission, show the user the command you want to run using \\`\\`\\` tags.\n\nWhen using this tool, please adhere to the following rules:\n\n1. Do not run commands that can modify files outside of the project directory, install packages globally, install virtual environments, or have significant side effects outside of the project directory, unless you have explicit permission from the user. Treat anything outside of the project directory as read-only.\n2. Do not run \\`git push\\` because it can break production (!) if the user was not expecting it. Don't run \\`git commit\\`, \\`git rebase\\`, or related commands unless you get explicit permission. If a user asks to commit changes, you can do so, but you should not invoke any further git commands beyond the git commit command.\n3. Do not run scripts without asking. Especially don't run scripts that could run against the production environment or have permanent effects without explicit permission from the user. Don't run scripts with side effects without permission from the user unless they don't have much effect or are simple.\n4. Be careful with any command that has big or irreversible effects. Anything that touches a production environment, servers, the database, or other systems that could be affected by a command should be run with explicit permission from the user.\n4. Don't run too many commands in a row without pausing to check in with what the user wants to do next.\n5. Don't run long-running commands, e.g. \\`npm run dev\\` or \\`npm start\\`, that start a server and do not exit. Only run commands that will complete within 30 seconds, because longer commands will be killed. Instead, ask the user to manually run long-running commands.\n6. Do not use the run_terminal_command tool to create or edit files. Do not use \\`cat\\` or \\`echo\\` to create or edit files. You should instead write out blocks for for editing or creating files as detailed above in the block.\n7. Do not install packages without asking, unless it is within a small, new-ish project. Users working on a larger project will want to manage packages themselves, so ask first.\n8. Do not use the wrong package manager for the project. For example, if the project uses \\`pnpm\\` or \\`bun\\` or \\`yarn\\`, you should not use \\`npm\\`. Similarly not everyone uses \\`pip\\` for python, etc.\n\nNotes:\n- The current working directory will always reset to project root directory for each command you run. You can only access files within this directory (or sub-directories).\n- Commands can succeed without giving any output, e.g. if no type errors were found. So you may not always see output for successful executions.\n\n## Web scraping\n\nScrape any url that could help address the user's request.\n\nYou will receive the content transformed into a simplified markdown file that contains the main content of the page.\n\nUse this tool to:\n- Read the content of documentation pages\n- Read the content of other web pages that are helpful to the user's request\n\n## Browser Action\n\nLoad and view web pages to test functionality, diagnose issues, or improve visual design of a user's web app.\n\nPurpose: Use this tool to navigate to a web page, take screenshots, and check the output of console.log or errors.\n\nIMPORTANT: Assume the user's development server is ALREADY running and active, unless you see logs indicating otherwise. Never start the user's development server for them. Instead, give them instructions to spin it up themselves in a new terminal.\nNever offer to interact with the website aside from reading them (see available actions below). The user will manipulate the website themselves and bring you to the UI they want you to interact with.\n\n### Critical Limitations\n- IMPORTANT: NO clicking on any elements, don't even try.\n- NO form submissions\n- NO button interactions\n- NO drag and drop\n- NO hover actions\n\n### Available Actions (Read Only):\n\n1. Navigate:\n - Load a new URL in the current browser window and get the logs after page load.\n - Required: , navigate${closeXml('type')}')}\n - Optional: ('load', 'domcontentloaded', 'networkidle0')\n - example: navigate${closeXml('type')}')}localhost:3000${closeXml('url')}')}domcontentloaded${closeXml('waitUntil')}')}${closeXml('tool_call')}')}\n\n2. Scroll:\n - Scroll the page up or down by one viewport height\n - Required: ('up', 'down'), scroll${closeXml('type')}')}\n - example: scroll${closeXml('type')}')}down${closeXml('direction')}')}${closeXml('tool_call')}')}\n\n3. Screenshot:\n - Capture the current page state\n - Required: screenshot${closeXml('type')}')}\n - Optional: , , , , , \n - example: screenshot${closeXml('type')}')}80${closeXml('quality')}')}${closeXml('tool_call')}')}\n\nIMPORTANT: make absolutely totally sure that you're using the XML tags as shown in the examples. Don't use JSON or any other formatting, only XML tags.\n\n### Response Analysis\n\nAfter each action, you'll receive:\n1. Success/failure status\n2. New console logs since last action\n3. Network requests and responses\n4. JavaScript errors with stack traces\n6. Screenshot of the website\n\nUse this data to:\n- Verify expected behavior\n- Debug issues\n- Guide next actions\n- Make informed decisions about fixes\n- Improve visual design\n\n### Best Practices\n\n**Workflow**\n- Navigate to the user's website, probably on localhost, but you can compare with the production site if you want.\n- Scroll to the relevant section\n- Take screenshots and analyze confirm changes\n- Check network requests for anomalies\n\n**Debugging Flow**\n- Start with minimal reproduction steps\n- Collect data at each step\n- Analyze results before next action\n- Take screenshots to track your changes after each UI change you make\n`.trim()\n", - "referencedBy": {} - }, - { - "path": "backend/src/main-prompt.ts", - "content": "import { renderToolResults } from '@codebuff/common/tools/utils'\nimport { AgentTemplateTypes } from '@codebuff/common/types/session-state'\nimport { uniq } from 'lodash'\n\nimport { checkTerminalCommand } from './check-terminal-command'\nimport { loopAgentSteps } from './run-agent-step'\nimport { getAgentTemplate } from './templates/agent-registry'\nimport { logger } from './util/logger'\nimport { expireMessages } from './util/messages'\nimport { requestToolCall } from './websockets/websocket-action'\n\nimport type { AgentTemplate } from './templates/types'\nimport type { ClientToolCall } from './tools/constants'\nimport type { ClientAction } from '@codebuff/common/actions'\nimport type { CostMode } from '@codebuff/common/constants'\nimport type { PrintModeEvent } from '@codebuff/common/types/print-mode'\nimport type {\n SessionState,\n ToolResult,\n AgentTemplateType,\n} from '@codebuff/common/types/session-state'\nimport type { WebSocket } from 'ws'\n\nexport interface MainPromptOptions {\n userId: string | undefined\n clientSessionId: string\n onResponseChunk: (chunk: string | PrintModeEvent) => void\n localAgentTemplates: Record\n}\n\nexport const mainPrompt = async (\n ws: WebSocket,\n action: ClientAction<'prompt'>,\n options: MainPromptOptions,\n): Promise<{\n sessionState: SessionState\n toolCalls: Array\n toolResults: Array\n}> => {\n const { userId, clientSessionId, onResponseChunk, localAgentTemplates } =\n options\n\n const {\n prompt,\n sessionState: sessionState,\n fingerprintId,\n costMode,\n promptId,\n agentId,\n promptParams,\n } = action\n const { fileContext, mainAgentState } = sessionState\n\n if (prompt) {\n // Check if this is a direct terminal command\n const startTime = Date.now()\n const terminalCommand = await checkTerminalCommand(prompt, {\n clientSessionId,\n fingerprintId,\n userInputId: promptId,\n userId,\n })\n const duration = Date.now() - startTime\n\n if (terminalCommand) {\n logger.debug(\n {\n duration,\n prompt,\n },\n `Detected terminal command in ${duration}ms, executing directly: ${prompt}`,\n )\n\n const response = await requestToolCall(\n ws,\n promptId,\n 'run_terminal_command',\n {\n command: terminalCommand,\n mode: 'user',\n process_type: 'SYNC',\n timeout_seconds: -1,\n },\n )\n\n const toolResult = response.success ? response.result : response.error\n if (response.success) {\n mainAgentState.messageHistory.push({\n role: 'user',\n content: renderToolResults([toolResult]),\n })\n }\n\n const newSessionState = {\n ...sessionState,\n messageHistory: expireMessages(\n mainAgentState.messageHistory,\n 'userPrompt',\n ),\n }\n\n return {\n sessionState: newSessionState,\n toolCalls: [],\n toolResults: [],\n }\n }\n }\n\n const availableAgents = Object.keys(localAgentTemplates)\n\n // Determine agent type - prioritize CLI agent selection, then config base agent, then cost mode\n let agentType: AgentTemplateType\n\n if (agentId) {\n if (!(await getAgentTemplate(agentId, localAgentTemplates))) {\n throw new Error(\n `Invalid agent ID: \"${agentId}\". Available agents: ${availableAgents.join(', ')}`,\n )\n }\n\n agentType = agentId\n logger.info(\n {\n agentId,\n promptParams,\n prompt: prompt?.slice(0, 50),\n },\n `Using CLI-specified agent: ${agentId}`,\n )\n } else {\n // Check for base agent in config\n const configBaseAgent = fileContext.codebuffConfig?.baseAgent\n if (configBaseAgent) {\n if (!(await getAgentTemplate(configBaseAgent, localAgentTemplates))) {\n throw new Error(\n `Invalid base agent in config: \"${configBaseAgent}\". Available agents: ${availableAgents.join(', ')}`,\n )\n }\n agentType = configBaseAgent\n logger.info(\n {\n configBaseAgent,\n promptParams,\n prompt: prompt?.slice(0, 50),\n },\n `Using config-specified base agent: ${configBaseAgent}`,\n )\n } else {\n // Fall back to cost mode mapping\n agentType = (\n {\n ask: AgentTemplateTypes.ask,\n lite: AgentTemplateTypes.base_lite,\n normal: AgentTemplateTypes.base,\n max: AgentTemplateTypes.base_max,\n experimental: AgentTemplateTypes.base_experimental,\n } satisfies Record\n )[costMode]\n }\n }\n\n mainAgentState.agentType = agentType\n\n let mainAgentTemplate = await getAgentTemplate(agentType, localAgentTemplates)\n if (!mainAgentTemplate) {\n throw new Error(`Agent template not found for type: ${agentType}`)\n }\n\n let updatedSubagents = mainAgentTemplate.spawnableAgents\n if (!agentId) {\n // If --agent is not specified, use the spawnableAgents from the codebuff config or add all local agents\n updatedSubagents =\n fileContext.codebuffConfig?.spawnableAgents ??\n uniq([...mainAgentTemplate.spawnableAgents, ...availableAgents])\n }\n mainAgentTemplate.spawnableAgents = updatedSubagents\n localAgentTemplates[agentType] = mainAgentTemplate\n\n const { agentState } = await loopAgentSteps(ws, {\n userInputId: promptId,\n prompt,\n params: promptParams,\n agentType,\n agentState: mainAgentState,\n fingerprintId,\n fileContext,\n toolResults: [],\n userId,\n clientSessionId,\n onResponseChunk,\n localAgentTemplates,\n })\n\n return {\n sessionState: {\n fileContext,\n mainAgentState: agentState,\n },\n toolCalls: [],\n toolResults: [],\n }\n}\n", - "referencedBy": {} - }, - { - "path": "npm-app/src/agents/load-agents.ts", - "content": "import * as fs from 'fs'\nimport * as path from 'path'\n\nimport { cyan, green } from 'picocolors'\n\nimport { getAllTsFiles, getAgentsDirectory } from './agent-utils'\n\nimport type { CodebuffConfig } from '@codebuff/common/json-config/constants'\n\nexport let loadedAgents: Record = {}\nexport async function loadLocalAgents({\n verbose = false,\n}: {\n verbose?: boolean\n}): Promise {\n loadedAgents = {}\n\n const agentsDir = getAgentsDirectory()\n\n if (!fs.existsSync(agentsDir)) {\n return loadedAgents\n }\n\n try {\n const tsFiles = getAllTsFiles(agentsDir)\n\n for (const fullPath of tsFiles) {\n const relativePath = path.relative(agentsDir, fullPath)\n const fileName = relativePath.replace(/\\.ts$/, '').replace(/[/\\\\]/g, '-')\n\n let agentDefinition: any\n let agentModule: any\n try {\n agentModule = await require(fullPath)\n } catch (error: any) {\n if (verbose) {\n console.error('Error importing agent:', error)\n }\n continue\n }\n delete require.cache[fullPath]\n\n try {\n agentDefinition = agentModule.default\n } catch (error: any) {\n console.error('Error loading agent from file:', fullPath, error)\n continue\n }\n\n if (!agentDefinition) continue\n\n // Convert handleSteps function to string if present\n let processedAgentDefinition = { ...agentDefinition }\n\n if (agentDefinition.handleSteps) {\n processedAgentDefinition.handleSteps =\n agentDefinition.handleSteps.toString()\n }\n\n loadedAgents[fileName] = processedAgentDefinition\n }\n } catch (error) {}\n return loadedAgents\n}\n\nexport function getLoadedAgentNames(): Record {\n return Object.fromEntries(\n Object.entries(loadedAgents).map(([agentType, agentConfig]) => {\n return [agentType, agentConfig.displayName]\n }),\n )\n}\n\n/**\n * Display loaded agents to the user\n */\nexport function displayLoadedAgents(codebuffConfig: CodebuffConfig) {\n const baseAgent = codebuffConfig.baseAgent\n if (baseAgent) {\n console.log(`\\n${green('Configured base agent:')} ${cyan(baseAgent)}`)\n }\n\n const spawnableAgents = codebuffConfig.spawnableAgents\n if (spawnableAgents) {\n console.log(\n `${green('Configured spawnable agents:')} ${spawnableAgents\n .map((name) => cyan(name))\n .join(', ')}\\n`,\n )\n } else if (Object.keys(loadedAgents).length > 0) {\n const loadedAgentNames = Object.values(getLoadedAgentNames())\n console.log(\n `\\n${green('Found custom agents:')} ${loadedAgentNames\n .map((name) => cyan(name))\n .join(', ')}\\n`,\n )\n } else if (baseAgent) {\n // One more new line.\n console.log()\n }\n}\n", - "referencedBy": {} - }, - { - "path": "npm-app/src/cli-handlers/agents.ts", - "content": "import * as fs from 'fs'\nimport * as path from 'path'\n\nimport { AGENT_TEMPLATES_DIR } from '@codebuff/common/constants'\nimport { AgentTemplateTypes } from '@codebuff/common/types/session-state'\nimport {\n filterCustomAgentFiles,\n extractAgentIdFromFileName,\n} from '@codebuff/common/util/agent-file-utils'\nimport { green, yellow, cyan, magenta, bold, gray, red } from 'picocolors'\n\nimport { loadLocalAgents, getLoadedAgentNames } from '../agents/load-agents'\nimport { CLI } from '../cli'\nimport { getProjectRoot } from '../project-files'\nimport { Spinner } from '../utils/spinner'\nimport {\n ENTER_ALT_BUFFER,\n EXIT_ALT_BUFFER,\n CLEAR_SCREEN,\n HIDE_CURSOR,\n SHOW_CURSOR,\n} from '../utils/terminal'\n\nlet isInAgentsBuffer = false\nlet originalKeyHandlers: ((str: string, key: any) => void)[] = []\nlet selectedIndex = 0\nlet scrollOffset = 0\nlet allContentLines: string[] = []\nlet agentLinePositions: number[] = []\nlet agentList: Array<{\n id: string\n name: string\n description?: string\n isBuiltIn: boolean\n filePath?: string\n isCreateNew?: boolean\n isEditAgent?: boolean\n isSeparator?: boolean\n isPlaceholder?: boolean\n isSectionHeader?: boolean\n}> = []\n\nexport function isInAgentsMode(): boolean {\n return isInAgentsBuffer\n}\n\nexport async function enterAgentsBuffer(rl: any, onExit: () => void) {\n if (isInAgentsBuffer) {\n console.log(yellow('Already in agents mode!'))\n return\n }\n\n // Load local agents\n await loadLocalAgents({ verbose: false })\n const localAgents = getLoadedAgentNames()\n\n // Build management actions section with header\n const actions: typeof agentList = [\n {\n id: '__header__',\n name: bold(cyan('Actions')),\n description: '',\n isBuiltIn: false,\n isSectionHeader: true,\n },\n {\n id: '__create_new__',\n name: '+ Create New Agent',\n description: 'Create a new custom agent template',\n isBuiltIn: false,\n isCreateNew: true,\n },\n ]\n\n // Get custom agent files for display purposes\n const agentsDir = path.join(getProjectRoot(), AGENT_TEMPLATES_DIR)\n let customAgentFiles: string[] = []\n if (fs.existsSync(agentsDir)) {\n const files = fs.readdirSync(agentsDir)\n customAgentFiles = filterCustomAgentFiles(files)\n }\n\n // Add agents section header\n actions.push({\n id: '__agents_header__',\n name:\n bold(cyan('Custom Agents')) +\n gray(` • ${customAgentFiles.length} in ${AGENT_TEMPLATES_DIR}`),\n description: '',\n isBuiltIn: false,\n isSectionHeader: true,\n })\n\n // Build agent list starting with management actions\n agentList = [...actions]\n\n // Add custom agents from .agents/templates\n if (customAgentFiles.length > 0) {\n for (const file of customAgentFiles) {\n const agentId = extractAgentIdFromFileName(file)\n const agentName = localAgents[agentId] || agentId\n agentList.push({\n id: agentId,\n name: agentName,\n description: 'Custom user-defined agent',\n isBuiltIn: false,\n filePath: path.join(agentsDir, file),\n })\n }\n } else {\n // If no custom agents, add a helpful message\n agentList.push({\n id: '__no_agents__',\n name: gray('No custom agents found'),\n description: 'Use \"Create New Agent\" above to get started',\n isBuiltIn: false,\n isPlaceholder: true,\n })\n }\n\n // No need for special handling here since we now have a proper placeholder\n\n // Initialize selection to first selectable item\n selectedIndex = 0\n // Find first selectable item (skip section headers, separators, placeholders)\n while (\n selectedIndex < agentList.length &&\n (agentList[selectedIndex]?.isSectionHeader ||\n agentList[selectedIndex]?.isSeparator ||\n agentList[selectedIndex]?.isPlaceholder)\n ) {\n selectedIndex++\n }\n // If no selectable items found, default to 0\n if (selectedIndex >= agentList.length) {\n selectedIndex = 0\n }\n scrollOffset = 0\n\n // Enter alternate screen buffer\n process.stdout.write(ENTER_ALT_BUFFER)\n process.stdout.write(CLEAR_SCREEN)\n process.stdout.write(HIDE_CURSOR)\n\n isInAgentsBuffer = true\n\n // Build content and render\n buildAllContentLines()\n centerSelectedItem()\n renderAgentsList()\n\n // Set up key handler\n setupAgentsKeyHandler(rl, onExit)\n}\n\nexport function exitAgentsBuffer(rl: any) {\n if (!isInAgentsBuffer) {\n return\n }\n\n // Reset state\n selectedIndex = 0\n scrollOffset = 0\n allContentLines = []\n agentLinePositions = []\n agentList = []\n\n // Restore all original key handlers\n if (originalKeyHandlers.length > 0) {\n process.stdin.removeAllListeners('keypress')\n originalKeyHandlers.forEach((handler) => {\n process.stdin.on('keypress', handler)\n })\n originalKeyHandlers = []\n }\n\n // Exit alternate screen buffer\n process.stdout.write(SHOW_CURSOR)\n process.stdout.write(EXIT_ALT_BUFFER)\n\n isInAgentsBuffer = false\n}\n\nfunction centerSelectedItem() {\n if (selectedIndex < 0 || selectedIndex >= agentLinePositions.length) {\n return\n }\n\n const terminalHeight = process.stdout.rows || 24\n const terminalWidth = process.stdout.columns || 80\n const headerHeight = getHeaderLines(terminalWidth).length\n const maxScrollableLines = terminalHeight - headerHeight - 2\n const selectedLineIndex = agentLinePositions[selectedIndex]\n const maxScrollOffset = Math.max(\n 0,\n allContentLines.length - maxScrollableLines,\n )\n\n // Center item in the scrollable viewport\n const centerOffset = selectedLineIndex - Math.floor(maxScrollableLines / 2)\n scrollOffset = Math.max(0, Math.min(maxScrollOffset, centerOffset))\n}\n\nconst getHeaderLines = (terminalWidth: number) => [\n // No header - sections will be labeled inline\n]\n\nfunction buildAllContentLines() {\n const terminalWidth = process.stdout.columns || 80\n const lines: string[] = []\n agentLinePositions = []\n\n if (agentList.length === 0) {\n lines.push(yellow('No agents found.'))\n } else {\n for (let i = 0; i < agentList.length; i++) {\n agentLinePositions.push(lines.length)\n const agent = agentList[i]\n const isSelected = i === selectedIndex\n\n // Handle section headers\n if (agent.isSectionHeader) {\n const cleanName = agent.name.replace(/\\u001b\\[[0-9;]*m/g, '')\n const cleanDescription = agent.description\n ? agent.description.replace(/\\u001b\\[[0-9;]*m/g, '')\n : ''\n const availableWidth = terminalWidth - 4 // Account for padding\n\n if (isSelected) {\n const headerWidth = Math.min(terminalWidth - 6, 60)\n lines.push(` ${cyan('┌' + '─'.repeat(headerWidth + 2) + '┐')}`)\n\n // Right-aligned title with separator line\n const titlePadding = Math.max(0, headerWidth - cleanName.length - 4)\n const separatorLine = '─'.repeat(titlePadding)\n lines.push(\n ` ${cyan('│')} ${gray(separatorLine)} ${agent.name} ${cyan('│')}`,\n )\n\n if (agent.description) {\n const descPadding = Math.max(\n 0,\n headerWidth - cleanDescription.length,\n )\n lines.push(\n ` ${cyan('│')} ${agent.description}${' '.repeat(descPadding)} ${cyan('│')}`,\n )\n }\n lines.push(` ${cyan('└' + '─'.repeat(headerWidth + 2) + '┘')}`)\n } else {\n // Right-aligned title with separator line for unselected\n const titlePadding = Math.max(\n 0,\n availableWidth - cleanName.length - 4,\n )\n const separatorLine = gray('─'.repeat(titlePadding))\n lines.push(` ${separatorLine} ${agent.name}`)\n\n if (agent.description) {\n lines.push(` ${agent.description}`)\n }\n }\n if (i < agentList.length - 1) {\n lines.push('') // Empty line after section header\n }\n continue\n }\n\n // Handle separator (keep for backwards compatibility)\n if (agent.isSeparator) {\n if (isSelected) {\n lines.push(` ${cyan('┌' + '─'.repeat(52) + '┐')}`)\n lines.push(` ${cyan('│')} ${gray(agent.name)} ${cyan('│')}`)\n lines.push(` ${cyan('└' + '─'.repeat(52) + '┘')}`)\n } else {\n lines.push(` ${gray(agent.name)}`)\n }\n if (i < agentList.length - 1) {\n lines.push('') // Empty line after separator\n }\n continue\n }\n\n // Handle placeholder\n if (agent.isPlaceholder) {\n if (isSelected) {\n const boxWidth = Math.min(terminalWidth - 6, 50)\n lines.push(` ${cyan('┌' + '─'.repeat(boxWidth + 2) + '┐')}`)\n lines.push(\n ` ${cyan('│')} ${agent.name} ${' '.repeat(Math.max(0, boxWidth - agent.name.replace(/\\u001b\\[[0-9;]*m/g, '').length))} ${cyan('│')}`,\n )\n lines.push(\n ` ${cyan('│')} ${gray(agent.description || '')} ${' '.repeat(Math.max(0, boxWidth - (agent.description || '').length))} ${cyan('│')}`,\n )\n lines.push(` ${cyan('└' + '─'.repeat(boxWidth + 2) + '┘')}`)\n } else {\n lines.push(` ${agent.name}`)\n lines.push(` ${gray(agent.description || '')}`)\n }\n if (i < agentList.length - 1) {\n lines.push('') // Empty line between items\n }\n continue\n }\n\n // Regular agent items\n const agentInfo =\n agent.isCreateNew || agent.isEditAgent\n ? `${agent.isCreateNew ? green(agent.name) : magenta(agent.name)}`\n : `${bold(agent.name)} ${gray(`(${agent.id})`)}`\n const description = agent.description || 'No description'\n const filePath = agent.filePath\n ? gray(`File: ${path.relative(getProjectRoot(), agent.filePath)}`)\n : ''\n\n const contentForBox = [\n agentInfo,\n gray(description),\n ...(filePath ? [filePath] : []),\n ]\n\n if (isSelected) {\n // Calculate box width based on content\n const maxContentWidth = Math.max(\n ...contentForBox.map(\n (line) => line.replace(/\\u001b\\[[0-9;]*m/g, '').length,\n ),\n )\n const boxWidth = Math.min(terminalWidth - 6, maxContentWidth)\n\n // Add top border\n lines.push(` ${cyan('┌' + '─'.repeat(boxWidth + 2) + '┐')}`)\n\n // Add content lines with proper padding - keep same indentation as unselected\n contentForBox.forEach((line) => {\n const cleanLine = line.replace(/\\u001b\\[[0-9;]*m/g, '')\n const padding = ' '.repeat(Math.max(0, boxWidth - cleanLine.length))\n lines.push(` ${cyan('│')} ${line}${padding} ${cyan('│')}`)\n })\n\n // Add bottom border\n lines.push(` ${cyan('└' + '─'.repeat(boxWidth + 2) + '┘')}`)\n } else {\n // Non-selected items - use same base indentation as selected content\n lines.push(` ${agentInfo}`) // 4 spaces to match selected content position\n lines.push(` ${gray(description)}`)\n if (filePath) {\n lines.push(` ${filePath}`)\n }\n }\n\n if (i < agentList.length - 1) {\n lines.push('') // Empty line between items\n }\n }\n }\n\n allContentLines = lines\n}\n\nfunction renderAgentsList() {\n // Build all content if not already built\n buildAllContentLines()\n\n // Clear screen and move cursor to top\n process.stdout.write(CLEAR_SCREEN)\n\n const terminalHeight = process.stdout.rows || 24\n const terminalWidth = process.stdout.columns || 80\n\n // Render fixed header\n const headerLines = getHeaderLines(terminalWidth)\n process.stdout.write(headerLines.join('\\n'))\n process.stdout.write('\\n')\n\n // Render scrollable content\n const maxScrollableLines = terminalHeight - headerLines.length - 2\n const visibleLines = allContentLines.slice(\n scrollOffset,\n scrollOffset + maxScrollableLines,\n )\n\n // Display scrollable content\n process.stdout.write(visibleLines.join('\\n'))\n\n // Add padding to fill remaining space\n const remainingLines = maxScrollableLines - visibleLines.length\n if (remainingLines > 0) {\n process.stdout.write('\\n'.repeat(remainingLines))\n }\n\n // Display status line at bottom\n const statusLine = `\\n${gray(`Use ↑/↓/j/k to navigate, Enter to select, ESC to go back`)}`\n\n process.stdout.write(statusLine)\n process.stdout.write(HIDE_CURSOR)\n}\n\nfunction setupAgentsKeyHandler(rl: any, onExit: () => void) {\n // Store all original key handlers\n const listeners = process.stdin.listeners('keypress')\n originalKeyHandlers = listeners as ((str: string, key: any) => void)[]\n\n // Remove existing keypress listeners\n process.stdin.removeAllListeners('keypress')\n\n // Add our custom handler\n process.stdin.on('keypress', (str: string, key: any) => {\n if (key && key.name === 'escape') {\n exitAgentsBuffer(rl)\n onExit()\n return\n }\n\n // Handle Ctrl+C - exit to main screen\n if (key && key.ctrl && key.name === 'c') {\n exitAgentsBuffer(rl)\n onExit()\n return\n }\n\n // Handle Enter - switch to selected agent, create new, or edit\n if (key && key.name === 'return') {\n if (agentList.length > 0 && selectedIndex < agentList.length) {\n const selectedAgent = agentList[selectedIndex]\n\n // Skip separators, placeholders, and section headers\n if (\n selectedAgent.isSeparator ||\n selectedAgent.isPlaceholder ||\n selectedAgent.isSectionHeader\n ) {\n return\n }\n\n if (selectedAgent.isCreateNew) {\n exitAgentsBuffer(rl)\n startDirectAgentCreation(onExit)\n } else {\n exitAgentsBuffer(rl)\n // Start spinner for agent switching\n Spinner.get().start(`Switching to agent: ${selectedAgent.name}...`)\n\n // Use resetAgent to switch to the selected agent\n const cliInstance = CLI.getInstance()\n cliInstance\n .resetAgent(selectedAgent.id)\n .then(() => {\n cliInstance.freshPrompt()\n })\n .catch((error) => {\n Spinner.get().stop()\n console.error(red('Error switching to agent:'), error)\n onExit()\n })\n }\n }\n return\n }\n\n // Handle navigation - skip separators, placeholders, and section headers\n if (key && (key.name === 'up' || key.name === 'k')) {\n let newIndex = selectedIndex - 1\n while (\n newIndex >= 0 &&\n (agentList[newIndex]?.isSeparator ||\n agentList[newIndex]?.isPlaceholder ||\n agentList[newIndex]?.isSectionHeader)\n ) {\n newIndex--\n }\n if (newIndex >= 0) {\n selectedIndex = newIndex\n centerSelectedItem()\n }\n\n renderAgentsList()\n return\n }\n if (key && (key.name === 'down' || key.name === 'j')) {\n let newIndex = selectedIndex + 1\n while (\n newIndex < agentList.length &&\n (agentList[newIndex]?.isSeparator ||\n agentList[newIndex]?.isPlaceholder ||\n agentList[newIndex]?.isSectionHeader)\n ) {\n newIndex++\n }\n if (newIndex < agentList.length) {\n selectedIndex = newIndex\n centerSelectedItem()\n renderAgentsList()\n }\n return\n }\n\n if (key && key.name === 'pageup') {\n const newIndex = Math.max(0, selectedIndex - 5)\n if (newIndex !== selectedIndex) {\n selectedIndex = newIndex\n centerSelectedItem()\n renderAgentsList()\n }\n return\n }\n\n if (key && key.name === 'pagedown') {\n const newIndex = Math.min(agentList.length - 1, selectedIndex + 5)\n if (newIndex !== selectedIndex) {\n selectedIndex = newIndex\n centerSelectedItem()\n renderAgentsList()\n }\n return\n }\n\n if (key && key.name === 'home') {\n if (selectedIndex !== 0) {\n selectedIndex = 0\n centerSelectedItem()\n renderAgentsList()\n }\n return\n }\n\n if (key && key.name === 'end') {\n if (selectedIndex !== agentList.length - 1) {\n selectedIndex = agentList.length - 1\n centerSelectedItem()\n renderAgentsList()\n }\n return\n }\n })\n\n // Ensure raw mode for immediate key detection\n if (process.stdin.isTTY) {\n process.stdin.setRawMode(true)\n }\n}\n\nasync function startDirectAgentCreation(onExit: () => void) {\n // Switch to agent-builder which automatically spawns Bob the Agent Builder for agent creation\n const prompt = `Create a new custom agent template for me. Please ask me what kind of agent I'd like to create and help me build it.`\n\n console.log(\n green(\n '\\n🤖 Starting agent creation with Buffy the Enthusiastic Agent Builder...',\n ),\n )\n console.log(\n gray(\n 'Buffy will connect you with Bob the Agent Builder to create your custom agent.',\n ),\n )\n\n try {\n const cliInstance = CLI.getInstance()\n // Switch to agent-builder which automatically spawns the agent builder for agent creation\n await cliInstance.resetAgent(\n AgentTemplateTypes.agent_builder,\n undefined,\n prompt,\n )\n cliInstance.freshPrompt()\n } catch (error) {\n console.error(red('Error starting agent creation:'), error)\n }\n\n onExit()\n}\n\n// Cleanup function\nexport function cleanupAgentsBuffer() {\n if (isInAgentsBuffer) {\n process.stdout.write(SHOW_CURSOR)\n process.stdout.write(EXIT_ALT_BUFFER)\n isInAgentsBuffer = false\n }\n\n // Restore normal terminal mode\n if (process.stdin.isTTY) {\n process.stdin.setRawMode(false)\n }\n // Register cleanup on process exit\n process.on('exit', cleanupAgentsBuffer)\n process.on('SIGINT', cleanupAgentsBuffer)\n process.on('SIGTERM', cleanupAgentsBuffer)\n}\n", - "referencedBy": {} - }, - { - "path": "backend/src/templates/base.ts", - "content": "[FILE_DOES_NOT_EXIST]", - "referencedBy": {} - }, - { - "path": "backend/src/tools/definitions/tool/spawn-agent-inline.ts", - "content": "import { getToolCallString } from '@codebuff/common/tools/utils'\n\nimport type { ToolDescription } from '../tool-def-type'\n\nconst toolName = 'spawn_agent_inline'\nexport const spawnAgentInlineTool = {\n toolName,\n description: `\nSpawn a single agent that runs within the current message history. \nThe spawned agent sees all previous messages and any messages it adds \nare preserved when control returns to you.\n\nThis is useful for:\n- Delegating specific tasks while maintaining context\n- Having specialized agents process information inline\n- Managing message history (e.g., summarization)\nThe agent will run until it calls end_turn, then control returns to you. There is no tool result for this tool.\nExample:\n${getToolCallString(toolName, {\n agent_type: 'file-picker',\n prompt: 'Find files related to authentication',\n params: { paths: ['src/auth.ts', 'src/user.ts'] },\n})}\n `.trim(),\n} satisfies ToolDescription", - "referencedBy": {} - } - ] - } - ], - "parentAgentId": "D-OfaehVPQw" - }, - { - "type": "text", - "agentId": "D-OfaehVPQw", - "text": "Okay, here's a concise report of locations in the codebase relevant to the `file-explorer` agent:\n\n* **`backend/src/templates/agents/file-explorer.ts`**: This file contains the core definition of the `file-explorer` agent. It defines the agent's purpose, input schema, system prompt, and the `handleSteps` function that orchestrates the agent's behavior, specifically spawning multiple `file-picker` agents.\n* **`backend/src/tools/definitions/tool/spawn-agents.ts`**: This file defines the `spawn_agents` tool, which is used by the `file-explorer` agent to spawn the underlying `file-picker` agents.\n* **`backend/src/tools/handlers/tool/spawn-agents.ts`**: This file contains the handler logic for the `spawn_agents` tool, which is responsible for actually creating and running the spawned agents.\n* **`common/src/constants/agents.ts`**: This defines high-level details about the agent, including its display name and purpose.\n* **`npm-app/src/cli-handlers/agents.ts`**: This seems like it could be helpful for understanding how agents are managed in the CLI application.\n\nThese files should give you a good understanding of the `file-explorer` agent's definition and target.\n" - }, - { - "type": "subagent_finish", - "agentId": "D-OfaehVPQw", - "agentType": "file-picker", - "displayName": "Fletcher the File Fetcher", - "onlyChild": false, - "parentAgentId": "main-agent", - "prompt": "", - "params": { - "prompt": "file-explorer agent definition and spawn target" - } - }, - { - "type": "tool_result", - "toolCallId": "D-Oe9G8zl9M", - "toolName": "spawn_agents", - "output": [ - { - "type": "json", - "value": [ - { - "agentType": "read_subtree", - "agentName": "read_subtree", - "value": { - "errorMessage": "Error spawning agent: Error: Agent type read_subtree not found." - } - }, - { - "agentType": "read_subtree", - "agentName": "read_subtree", - "value": { - "errorMessage": "Error spawning agent: Error: Agent type read_subtree not found." - } - }, - { - "agentName": "Fletcher the File Fetcher", - "agentType": "file-picker", - "value": { - "type": "lastMessage", - "value": [ - { - "role": "assistant", - "content": [ - { - "type": "text", - "text": "Here's a short report of the locations in the codebase that could be helpful, focusing on the most relevant files:\n\n* **`backend/src/templates/agents/agent-builder.ts`**: This file contains the `agentBuilder` function, which is responsible for creating new agent templates. It reads agent template types, tool definitions, and example agent files, providing a good starting point for understanding the agent creation process.\n* **`backend/src/templates/agent-registry.ts`**: This file manages the agent registry, fetching agents from the database and assembling local agent templates. It is useful for understanding how agents are stored and retrieved.\n* **`npm-app/src/cli-handlers/agent-creation-chat.ts`**: This file contains the `startAgentCreationChat` function, which guides users through the agent creation process via a CLI chat interface. It showcases how agent requirements are collected and used to create agent templates.\n* **`web/src/content/agents/creating-new-agents.mdx`**: This file provides documentation on creating new agents, including examples and best practices. It offers insights into the structure and required fields of agent templates.\n* **`common/src/types/dynamic-agent-template.ts`**: This file defines the schema for dynamic agent templates, outlining the structure and properties of custom Codebuff agents.\n" - } - ] - } - ] - } - }, - { - "agentName": "Fletcher the File Fetcher", - "agentType": "file-picker", - "value": { - "type": "lastMessage", - "value": [ - { - "role": "assistant", - "content": [ - { - "type": "text", - "text": "Here's a concise report on diff-reviewer agent examples and configurations:\n\n* `.agents/examples/diff-reviewer-1.ts`, `.agents/examples/diff-reviewer-2.ts`, `.agents/examples/diff-reviewer-3.ts`, `common/src/util/examples/diff-reviewer-1.ts`, `common/src/util/examples/diff-reviewer-2.ts`, `common/src/util/examples/diff-reviewer-3.ts`: These files provide example definitions for diff-reviewer agents at different levels (1-3), showcasing variations in input schema, tools used, and step handling.\n\n* `backend/src/templates/agents/reviewer.ts`: This file defines the reviewer agent template, including its persona, instructions, and tool usage, focusing on providing feedback on code changes.\n\n* `backend/src/system-prompt/agent-instructions.md`: This file dictates the system prompt and instructions for the diff reviewer, shaping its behavior and emphasizing clarity, conciseness, and adherence to code style.\n\nThese files offer insights into the agent's configuration, behavior, and usage within the codebase.\n" - } - ] - } - ] - } - }, - { - "agentName": "Fletcher the File Fetcher", - "agentType": "file-picker", - "value": { - "type": "lastMessage", - "value": [ - { - "role": "assistant", - "content": [ - { - "type": "text", - "text": "Okay, here's a concise report on the locations in the codebase that could be helpful for creating a custom agent from a starter template, or understanding the existing `git-committer` agent:\n\n* `.agents/git-committer.ts`: This is the definition of the `git-committer` agent. It shows the structure of an agent definition, including its `id`, `inputSchema`, `systemPrompt`, `instructionsPrompt`, and `handleSteps`. Crucially it shows the tools and steps this agent uses.\n* `backend/src/templates/agents/base.ts`: This file provides the base template for creating agents. It defines the core structure, including the input schema, output mode, and available tools.\n* `backend/src/templates/agent-list.ts`: This file defines a list of available static agentTemplates providing a way to reference existing, simple (non-dynamic) agents.\n* `common/src/types/agent-template.ts`: This file defines the `AgentTemplate` type, which is the structure that all agent definitions must adhere to. It specifies the required and optional properties of an agent.\n* `npm-app/src/cli-handlers/agents.ts`: This file contains the logic for displaying and selecting agents within the CLI. You likely do not require this information.\n" - } - ] - } - ] - } - }, - { - "agentName": "Fletcher the File Fetcher", - "agentType": "file-picker", - "value": { - "type": "lastMessage", - "value": [ - { - "role": "assistant", - "content": [ - { - "type": "text", - "text": "Here's a concise report of the locations in the codebase that define agent personalities or types:\n\n* `.agents/brainstormer.ts`, `.agents/planner.ts`, `.agents/researcher.ts`, `.agents/reviewer.ts`, `.agents/thinker.ts`, `.agents/superagent.ts`: These files define the persona, instructions, and capabilities of different agent types. They are useful as a central location for understanding specific agent behaviors.\n* `common/src/constants/agents.ts`: This file contains the `AGENT_PERSONAS` constant, which provides display names and purposes for different base and specialized agents. It's helpful for understanding the high-level categorization and naming of agents.\n* `common/src/types/agent-template.ts`: This file defines the `AgentTemplate` type, which outlines the structure of agent definitions, including fields like `displayName`, `systemPrompt`, `inputSchema`, and `toolNames`.\n* `npm-app/src/agents/load-agents.ts`: This file is responsible for loading local agent definitions, and could be useful for understanding how agents are managed.\n* `web/src/content/agents/overview.mdx`: Documentation summarizing agent design and purpose.\n" - } - ] - } - ] - } - }, - { - "agentName": "Fletcher the File Fetcher", - "agentType": "file-picker", - "value": { - "type": "lastMessage", - "value": [ - { - "role": "assistant", - "content": [ - { - "type": "text", - "text": "Okay, here's a concise report of locations in the codebase relevant to the `file-explorer` agent:\n\n* **`backend/src/templates/agents/file-explorer.ts`**: This file contains the core definition of the `file-explorer` agent. It defines the agent's purpose, input schema, system prompt, and the `handleSteps` function that orchestrates the agent's behavior, specifically spawning multiple `file-picker` agents.\n* **`backend/src/tools/definitions/tool/spawn-agents.ts`**: This file defines the `spawn_agents` tool, which is used by the `file-explorer` agent to spawn the underlying `file-picker` agents.\n* **`backend/src/tools/handlers/tool/spawn-agents.ts`**: This file contains the handler logic for the `spawn_agents` tool, which is responsible for actually creating and running the spawned agents.\n* **`common/src/constants/agents.ts`**: This defines high-level details about the agent, including its display name and purpose.\n* **`npm-app/src/cli-handlers/agents.ts`**: This seems like it could be helpful for understanding how agents are managed in the CLI application.\n\nThese files should give you a good understanding of the `file-explorer` agent's definition and target.\n" - } - ] - } - ] - } - }, - { - "agentName": "Code Searcher", - "agentType": "code-searcher", - "value": { - "type": "structuredOutput", - "value": { - "results": [ - { - "stdout": ".agents/examples/diff-reviewer-1.ts:\n4: id: 'diff-reviewer-1',\n\n.agents/examples/diff-reviewer-2.ts:\n7: id: 'diff-reviewer-2',\n\n.agents/examples/diff-reviewer-3.ts:\n7: id: 'diff-reviewer-3',\n\n./backend/src/templates/agents/agent-builder.ts:\n67: (file) => file.endsWith('.ts') && file.startsWith('diff-reviewer'),\n\n./common/src/util/examples/diff-reviewer-1.ts:\n4: id: 'diff-reviewer-1',\n\n./common/src/util/examples/diff-reviewer-2.ts:\n7: id: 'diff-reviewer-2',\n\n./common/src/util/examples/diff-reviewer-3.ts:\n7: id: 'diff-reviewer-3',", - "message": "Exit code: 0" - }, - { - "stdout": "No results", - "message": "Exit code: 1" - }, - { - "stdout": "./npm-app/src/client.ts:\n1354: // Mark any spawnable agents as inactive when the main response completes\n\n./npm-app/src/subagent-storage.ts:\n214: * Get recent spawnable agents (sorted by last activity)\n223: * Get spawnable agents in chronological order (oldest first)\n\n./backend/knowledge.md:\n7:Users can now reference spawnable agents without org prefixes in their agent templates. For example:\n77: spawnableAgents?: { // Modify spawnable agents list\n\n./npm-app/src/agents/load-agents.ts:\n86: `${green('Configured spawnable agents:')} ${spawnableAgents\n\n./npm-app/src/cli.ts:\n949: // Give control back to user when no spawnable agents exist\n\n./backend/src/tools/definitions/tool/spawn-agents-async.ts:\n6:export const spawnAgentsAsyncTool = {\n\n./backend/src/tools/definitions/tool/spawn-agents.ts:\n6:export const spawnAgentsTool = {\n\n./backend/src/tools/definitions/list.ts:\n16:import { spawnAgentsTool } from './tool/spawn-agents'\n17:import { spawnAgentsAsyncTool } from './tool/spawn-agents-async'\n43: spawn_agents: spawnAgentsTool,\n44: spawn_agents_async: spawnAgentsAsyncTool,\n\n./common/src/templates/agent-validation.ts:\n199: // Validate spawnable agents (skip if requested, e.g., for database agents)\n\n./web/src/app/api/agents/publish/route.ts:\n222: // Verify that all spawnable agents are either published or part of this request\n\n./common/src/__tests__/agent-validation.test.ts:\n116: test.skip('should validate spawnable agents', async () => {\n141: 'Invalid spawnable agents: nonexistent_agent',\n274: it('should validate spawnable agents including dynamic agents from first pass', async () => {\n287: spawnableAgents: [], // No spawnable agents\n\n./common/src/__tests__/dynamic-agent-template-schema.test.ts:\n336: const spawnAgentsError = result.error.issues.find((issue) =>\n341: expect(spawnAgentsError).toBeDefined()\n342: expect(spawnAgentsError?.message).toContain(\n\n./web/src/content/agents/troubleshooting-agent-customization.mdx:\n204:2. Limit spawnable agents:\n\n./common/src/util/agent-name-normalization.ts:\n6: * 2. Try with DEFAULT_ORG_PREFIX for spawnable agents\n10: * and handles the common case where users reference spawnable agents\n27: // Try with DEFAULT_ORG_PREFIX for spawnable agents\n\n./common/src/tools/list.ts:\n14:import { spawnAgentsParams } from './params/tool/spawn-agents'\n15:import { spawnAgentsAsyncParams } from './params/tool/spawn-agents-async'\n39: spawn_agents: spawnAgentsParams,\n40: spawn_agents_async: spawnAgentsAsyncParams,\n\n./common/src/types/dynamic-agent-template.ts:\n98: // Tools and spawnable agents\n\n./common/src/json-config/constants.ts:\n91: .describe('Specify complete list of spawnable agents for the base agent'),\n\n./common/src/util/agent-template-validation.ts:\n9: * Centralized validation for spawnable agents.\n10: * Validates that all spawnable agents reference valid agent types.\n35: * Formats a validation error message for spawnable agents\n41: let message = `Invalid spawnable agents: ${invalidAgents.join(', ')}. Double check the id, including the org prefix if applicable.`\n\n./common/src/json-config/__tests__/__snapshots__/stringify-schema.test.ts.snap:\n85: // (optional): Specify complete list of spawnable agents for the base agent\n\n./common/src/tools/params/tool/spawn-agents.ts:\n7:export const spawnAgentsParams = {\n\n./common/src/tools/params/tool/spawn-agents-async.ts:\n7:export const spawnAgentsAsyncParams = {", - "message": "Exit code: 0" - }, - { - "stdout": "./npm-app/src/cli-handlers/agent-creation-chat.ts:\n77: // Create a simple prompt for the agent builder with the requirements\n88: // Use the resetAgent helper to properly switch to agent-builder which automatically spawns the agent builder\n\n./npm-app/src/cli-handlers/agents.ts:\n560: // Switch to agent-builder which automatically spawns the agent builder for agent creation\n\n./backend/src/templates/agents/agent-builder.ts:\n30:export const agentBuilder = (\n135: 'You are an expert agent builder specialized in creating new agent templates for the codebuff system. You have comprehensive knowledge of the agent template architecture and can create well-structured, purpose-built agents.',\n224:The agent builder is focused on creating new agent templates based on user specifications.\n\n./backend/src/templates/agent-list.ts:\n18:import { agentBuilder } from './agents/agent-builder'\n77: ...agentBuilder(models.openrouter_claude_sonnet_4),", - "message": "Exit code: 0" - }, - { - "stdout": "./common/src/constants/agents.ts:\n3:// Define agent personas with their shared characteristics", - "message": "Exit code: 0" - } - ] - } - } - } - ] - } - ] - }, - { - "type": "tool_call", - "toolCallId": "48ed86af-18ff-4566-b132-69ffec605226", - "toolName": "spawn_agent_inline", - "input": { - "agent_type": "context-pruner", - "params": {} - }, - "agentId": "main-agent", - "includeToolCall": false - }, - { - "type": "tool_result", - "toolCallId": "48ed86af-18ff-4566-b132-69ffec605226", - "toolName": "spawn_agent_inline", - "output": [ - { - "type": "json", - "value": { - "message": "Agent spawned." - } - } - ] - }, - { - "type": "tool_call", - "toolCallId": "D-QVk6nxfQw", - "toolName": "read_files", - "input": { - "paths": [ - "backend/src/templates/agents/agent-builder.ts", - "common/src/constants/agents.ts", - ".agents/examples/diff-reviewer-1.ts", - ".agents/examples/diff-reviewer-2.ts", - ".agents/examples/diff-reviewer-3.ts", - ".agents/git-committer.ts", - "common/src/util/examples/diff-reviewer-1.ts", - "common/src/util/examples/diff-reviewer-2.ts", - "common/src/util/examples/diff-reviewer-3.ts", - "backend/src/templates/agents/file-explorer.ts" - ] - }, - "agentId": "main-agent", - "includeToolCall": true - }, - { - "type": "tool_call", - "toolCallId": "D-QYc2ZPpX8", - "toolName": "spawn_agents", - "input": { - "agents": [ - { - "agent_type": "file-picker", - "prompt": "package.json scripts for testing, linting, typechecking" - }, - { - "agent_type": "code-searcher", - "params": { - "searchQueries": [ - { - "pattern": "bun run typecheck|lint|test" - }, - { - "pattern": "AGENT_PERSONAS", - "flags": "-g *.ts" - } - ] - } - } - ] - }, - "agentId": "main-agent", - "includeToolCall": true - }, - { - "type": "tool_result", - "toolCallId": "D-QVk6nxfQw", - "toolName": "read_files", - "output": [ - { - "type": "json", - "value": [ - { - "path": "backend/src/templates/agents/agent-builder.ts", - "content": "import * as fs from 'fs'\nimport * as path from 'path'\n\nimport {\n AGENT_TEMPLATES_DIR,\n openrouterModels,\n AGENT_DEFINITION_FILE,\n} from '@codebuff/common/constants'\nimport { AgentTemplateTypes } from '@codebuff/common/types/session-state'\nimport z from 'zod/v4'\n\nimport type { AgentTemplate } from '../types'\nimport type { Model } from '@codebuff/common/constants'\nimport type { ToolName } from '@codebuff/common/tools/constants'\n\nconst COMMON_UTIL_PATH = '../../../../common/src/util'\nconst TEMPLATE_RELATIVE_PATH =\n `${COMMON_UTIL_PATH}/types/${AGENT_DEFINITION_FILE}` as const\n// Import to validate path exists at compile time\nimport(TEMPLATE_RELATIVE_PATH)\n\nconst TEMPLATE_PATH = path.join(__dirname, TEMPLATE_RELATIVE_PATH)\nconst DEFAULT_MODEL = openrouterModels.openrouter_claude_sonnet_4\nconst TYPES_DIR = path.join(AGENT_TEMPLATES_DIR, 'types')\nconst EXAMPLES_DIR = path.join(AGENT_TEMPLATES_DIR, 'examples')\nconst TEMPLATE_TYPES_PATH = path.join(TYPES_DIR, AGENT_DEFINITION_FILE)\nconst TOOL_DEFINITIONS_FILE = 'tools.d.ts'\nconst TOOL_DEFINITIONS_PATH = path.join(TYPES_DIR, TOOL_DEFINITIONS_FILE)\n\nexport const agentBuilder = (\n model: Model,\n allAvailableAgents?: string[],\n): Omit => {\n // Read the AGENT_CONFIG_FILE content dynamically\n // The import above ensures this path exists at compile time\n let agentTemplateContent = ''\n try {\n agentTemplateContent = fs.readFileSync(TEMPLATE_PATH, 'utf8')\n } catch (error) {\n console.warn(`Could not read ${AGENT_DEFINITION_FILE}:`, error)\n agentTemplateContent = '// Agent template types not available'\n }\n // Read the tools.d.ts content from common package\n let toolDefinitionsContent = ''\n try {\n const toolsPath = path.join(\n __dirname,\n `${COMMON_UTIL_PATH}/types/tools.d.ts`,\n )\n toolDefinitionsContent = fs.readFileSync(toolsPath, 'utf8')\n } catch (error) {\n console.warn(`Could not read tools.d.ts from common:`, error)\n toolDefinitionsContent = '// Tool definitions not available'\n }\n\n // Read example agent files from common package\n const exampleAgentContents: Record = {}\n\n try {\n const exampleAgentsDir = path.join(__dirname, `${COMMON_UTIL_PATH}`)\n // Check if directory exists before trying to read it\n if (fs.existsSync(exampleAgentsDir)) {\n const files = fs.readdirSync(exampleAgentsDir)\n\n files\n .filter(\n (file) => file.endsWith('.ts') && file.startsWith('diff-reviewer'),\n )\n .forEach((filename) => {\n try {\n const fullPath = path.join(exampleAgentsDir, filename)\n const content = fs.readFileSync(fullPath, 'utf8')\n exampleAgentContents[filename] = content\n } catch (error) {\n console.warn(`Could not read example agent ${filename}:`, error)\n }\n })\n } else {\n console.warn(\n `Example agents directory does not exist: ${exampleAgentsDir}`,\n )\n }\n } catch (error) {\n console.warn('Could not read example agents directory:', error)\n }\n\n return {\n model,\n displayName: 'Bob the Agent Builder',\n spawnPurposePrompt:\n 'Enhanced base agent that can create custom agents and handle all coding tasks with deterministic agent creation behavior',\n inputSchema: {\n prompt: z\n .string()\n .optional()\n .describe(\n 'What agent type you would like to create or edit. Include as many details as possible.',\n ),\n params: z\n .object({\n name: z.string().optional(),\n purpose: z.string().optional(),\n specialty: z.string().optional(),\n model: z.string().optional(),\n })\n .passthrough()\n .optional(),\n },\n outputMode: 'structured_output',\n includeMessageHistory: false,\n toolNames: [\n 'write_file',\n 'str_replace',\n 'run_terminal_command',\n 'read_files',\n 'code_search',\n 'spawn_agents',\n 'add_message',\n 'set_output',\n 'end_turn',\n ] satisfies ToolName[],\n spawnableAgents: allAvailableAgents\n ? (allAvailableAgents as any[])\n : [\n AgentTemplateTypes.file_picker,\n AgentTemplateTypes.researcher,\n AgentTemplateTypes.thinker,\n AgentTemplateTypes.reviewer,\n AgentTemplateTypes.agent_builder,\n ],\n\n systemPrompt: [\n '# Bob the Agent Builder',\n '',\n 'You are an expert agent builder specialized in creating new agent templates for the codebuff system. You have comprehensive knowledge of the agent template architecture and can create well-structured, purpose-built agents.',\n '',\n '## Environment Setup Complete',\n '',\n 'Your environment has been automatically prepared with:',\n '- Agent template type definitions in `.agents/types/agent-definition.d.ts`',\n '- Tool type definitions in `.agents/types/tools.d.ts`',\n '- Example agent files copied to `.agents/` directory for reference',\n '',\n 'All necessary files are now available in your working directory.',\n '',\n '## Complete Agent Template Type Definitions',\n '',\n 'Here are the complete TypeScript type definitions for creating custom Codebuff agents:',\n '```typescript',\n agentTemplateContent,\n '```',\n '',\n '## Available Tools Type Definitions',\n '',\n 'Here are the complete TypeScript type definitions for all available tools:',\n '',\n '```typescript',\n toolDefinitionsContent,\n '```',\n '',\n '## Agent Template Patterns:',\n '',\n '1. **Base Agent Pattern**: Full-featured agents with comprehensive tool access',\n '2. **Specialized Agent Pattern**: Focused agents with limited tool sets',\n '3. **Thinking Agent Pattern**: Agents that spawn thinker sub-agents',\n '4. **Research Agent Pattern**: Agents that start with web search',\n '',\n '## Best Practices:',\n '',\n '1. **Use as few fields as possible**: Leave out fields that are not needed to reduce complexity',\n '2. **Minimal Tools**: Only include tools the agent actually needs',\n '3. **Clear and Concise Prompts**: Write clear, specific prompts that have no unnecessary words',\n '4. **Consistent Naming**: Follow naming conventions (kebab-case for IDs)',\n '5. **Appropriate Model**: Choose the right model for the task complexity. Default is claude-4-sonnet-20250522 for medium-high complexity tasks, and openai/gpt-5 for all other tasks.',\n '',\n '## Your Task:',\n 'When asked to create an agent template, you should:',\n \"1. Understand the requested agent's purpose and capabilities\",\n \"2. Choose appropriate tools for the agent's function\",\n '3. Write a comprehensive system prompt',\n `4. Create the complete agent template file in ${AGENT_TEMPLATES_DIR}`,\n '5. Ensure the template follows all conventions and best practices',\n '6. Use the AgentDefinition interface for the configuration',\n '7. Start the file with: import type { AgentDefinition } from \"./types/agent-definition.d.ts\"',\n '',\n 'Create agent templates that are focused, efficient, and well-documented. Always import the AgentDefinition type and export a default configuration object.',\n ].join('\\n'),\n instructionsPrompt: `You are helping to create or edit an agent template. The user will describe what kind of agent they want to create or how they want to modify an existing agent.\n\n## Environment Ready\n\nYour environment has been automatically set up with:\n- Type definitions in \\`.agents/types/\\`\n- Example agent files in \\`.agents/\\` directory\n- All necessary scaffolding complete\n\nYou can now proceed directly to agent creation or editing.\n\n## Example Agents Available\n\nThree example agents are now available in your \\`.agents/\\` directory which are all diff reviewers of increasing complexity. These can serve as examples of well-made agents at different stages of complexity.\n\n**IMPORTANT**: Examine these examples to find connections and patterns that relate to the user's request. Look for:\n- Similar tool combinations\n- Comparable complexity levels\n- Related functionality patterns\n- Appropriate model choices\n- Relevant prompt structures\n\nUse these examples as inspiration and starting points, adapting their patterns to fit the user's specific needs.\n\n## For New Agents\n\nAnalyze their request and create a complete agent template that:\n- Has a clear purpose and appropriate capabilities\n- Leaves out fields that are not needed\n- Uses only the tools it needs\n- Follows naming conventions\n- Is properly structured\n- Draws inspiration from relevant example agents\n\n## For Creating New Agents\n\nThe agent builder is focused on creating new agent templates based on user specifications.\n\nIMPORTANT: Always end your response with the end_turn tool when you have completed the agent creation or editing task.`,\n stepPrompt: '',\n\n handleSteps: function* ({ agentState, prompt, params }) {\n // Step 1: Create directory structure\n yield {\n toolName: 'run_terminal_command',\n args: {\n command: `mkdir -p ${TYPES_DIR} && mkdir -p ${EXAMPLES_DIR}`,\n process_type: 'SYNC',\n timeout_seconds: 10,\n },\n }\n\n // Step 2: Write the AGENT_DEFINITION_FILE with the template content\n yield {\n toolName: 'write_file',\n args: {\n path: TEMPLATE_TYPES_PATH,\n instructions: 'Create agent template type definitions file',\n content: agentTemplateContent,\n },\n }\n\n // Step 3: Write the tool definitions file (copy from existing tools.d.ts)\n yield {\n toolName: 'write_file',\n args: {\n path: TOOL_DEFINITIONS_PATH,\n instructions: 'Create tools type file',\n content: toolDefinitionsContent,\n },\n }\n\n // Step 4: Add message about reading example files and then read them\n yield {\n toolName: 'add_message',\n args: {\n role: 'assistant',\n content:\n \"I'll read the example agent files to understand the patterns and then help you create your agent.\",\n },\n }\n\n // Step 5: Copy example agent files to .agents/ directory\n for (const [filename, content] of Object.entries(exampleAgentContents)) {\n if (content) {\n yield {\n toolName: 'write_file',\n args: {\n path: `${EXAMPLES_DIR}/${filename}`,\n instructions: `Copy example agent file ${filename}`,\n content: content,\n },\n }\n }\n }\n\n // Step 6: Complete agent creation process\n yield 'STEP_ALL'\n },\n }\n}\n", - "referencedBy": {} - }, - { - "path": "common/src/constants/agents.ts", - "content": "import type { AgentTemplateTypes } from '../types/session-state'\n\n// Define agent personas with their shared characteristics\nexport const AGENT_PERSONAS = {\n // Base agents - all use Buffy persona\n base: {\n displayName: 'Buffy the Enthusiastic Coding Assistant',\n purpose: 'Base agent that orchestrates the full response.',\n } as const,\n base_lite: {\n displayName: 'Buffy the Enthusiastic Coding Assistant',\n purpose: 'Base agent that orchestrates the full response.',\n } as const,\n base_max: {\n displayName: 'Buffy the Enthusiastic Coding Assistant',\n purpose: 'Base agent that orchestrates the full response.',\n } as const,\n base_experimental: {\n displayName: 'Buffy the Enthusiastic Coding Assistant',\n purpose: 'Base agent that orchestrates the full response.',\n } as const,\n claude4_gemini_thinking: {\n displayName: 'Buffy the Enthusiastic Coding Assistant',\n purpose: 'Base agent that orchestrates the full response.',\n } as const,\n\n base_agent_builder: {\n displayName: 'Buffy the Enthusiastic Agent Builder',\n purpose:\n 'Enhanced base agent that can create custom agents and handle all coding tasks',\n } as const,\n\n superagent: {\n displayName: 'Superagent',\n purpose:\n 'Superagent that can spawn multiple code editing agents to complete a task.',\n } as const,\n\n // Ask mode\n ask: {\n displayName: 'Buffy the Enthusiastic Coding Assistant',\n purpose: 'Base ask-mode agent that orchestrates the full response.',\n } as const,\n\n // Specialized agents\n thinker: {\n displayName: 'Theo the Theorizer',\n purpose:\n 'Does deep thinking given the current messages and a specific prompt to focus on. Use this to help you solve a specific problem.',\n } as const,\n file_explorer: {\n displayName: 'Dora The File Explorer',\n purpose: 'Expert at exploring a codebase and finding relevant files.',\n } as const,\n file_picker: {\n displayName: 'Fletcher the File Fetcher',\n purpose: 'Expert at finding relevant files in a codebase.',\n } as const,\n researcher: {\n displayName: 'Reid Searcher the Researcher',\n purpose: 'Expert at researching topics using web search and documentation.',\n } as const,\n planner: {\n displayName: 'Peter Plan the Planner',\n purpose: 'Agent that formulates a comprehensive plan to a prompt.',\n hidden: true,\n } as const,\n dry_run: {\n displayName: 'Sketch the Dry Runner',\n purpose: 'Agent that takes a plan and try to implement it in a dry run.',\n hidden: true,\n } as const,\n reviewer: {\n displayName: 'Nit Pick Nick the Reviewer',\n purpose:\n 'Reviews file changes and responds with critical feedback. Use this after making any significant change to the codebase.',\n } as const,\n agent_builder: {\n displayName: 'Bob the Agent Builder',\n purpose: 'Creates new agent templates for the codebuff mult-agent system',\n hidden: false,\n } as const,\n} as const satisfies Partial<\n Record<\n keyof typeof AgentTemplateTypes,\n { displayName: string; purpose: string; hidden?: boolean }\n >\n>\n\n// Agent IDs list from AGENT_PERSONAS keys\nexport const AGENT_IDS = Object.keys(\n AGENT_PERSONAS,\n) as (keyof typeof AGENT_PERSONAS)[]\n\n// Agent ID prefix constant\nexport const AGENT_ID_PREFIX = 'CodebuffAI/'\n\n// Agent names for client-side reference\nexport const AGENT_NAMES = Object.fromEntries(\n Object.entries(AGENT_PERSONAS).map(([agentType, persona]) => [\n agentType,\n persona.displayName,\n ]),\n) as Record\n\nexport type AgentName =\n (typeof AGENT_PERSONAS)[keyof typeof AGENT_PERSONAS]['displayName']\n\n// Get unique agent names for UI display\nexport const UNIQUE_AGENT_NAMES = Array.from(\n new Set(\n Object.values(AGENT_PERSONAS)\n .filter((persona) => !('hidden' in persona) || !persona.hidden)\n .map((persona) => persona.displayName),\n ),\n)\n\n// Map from display name back to agent types (for parsing user input)\nexport const AGENT_NAME_TO_TYPES = Object.entries(AGENT_NAMES).reduce(\n (acc, [type, name]) => {\n if (!acc[name]) acc[name] = []\n acc[name].push(type)\n return acc\n },\n {} as Record,\n)\n", - "referencedBy": {} - }, - { - "path": ".agents/examples/diff-reviewer-1.ts", - "content": "import type { AgentDefinition } from '../types/agent-definition'\n\nconst definition: AgentDefinition = {\n id: 'diff-reviewer-1',\n\n displayName: 'Diff Reviewer (Level 1)',\n model: 'openai/gpt-5',\n toolNames: ['read_files', 'run_terminal_command'],\n\n spawnPurposePrompt:\n 'Spawn when you need to review code changes in the git diff',\n\n instructionsPrompt: `Execute the following steps:\n1. Run git diff\n2. Read the files that have changed\n3. Review the changes and suggest improvements`,\n}\n\nexport default definition\n", - "referencedBy": {} - }, - { - "path": ".agents/examples/diff-reviewer-2.ts", - "content": "import type {\n AgentDefinition,\n AgentStepContext,\n} from '../types/agent-definition'\n\nconst definition: AgentDefinition = {\n id: 'diff-reviewer-2',\n displayName: 'Diff Reviewer (Level 2)',\n model: 'openai/gpt-5',\n\n inputSchema: {\n prompt: {\n type: 'string',\n description:\n 'Please provide a short description of the changes you want to review',\n },\n },\n toolNames: ['read_files', 'run_terminal_command'],\n\n spawnPurposePrompt:\n 'Spawn when you need to review code changes in the git diff',\n\n systemPrompt:\n 'You are an expert software developer. Your job is to review code changes and provide helpful feedback.',\n\n instructionsPrompt: `Execute the following steps:\n1. Run git diff\n2. Read the files that have changed\n3. Review the changes and suggest improvements\n\nUse the following guidelines while reviewing the changes:\n- Find ways to simplify the code\n- Reuse existing code as much as possible instead of writing new code\n- Preserve as much behavior as possible in the existing code\n- Prefer changing as few lines of code as possible\n- Look for opportunities to improve the code's readability\n- Look for logical errors in the code\n- Look for missed cases in the code\n- Look for any other bugs`,\n\n handleSteps: function* ({ agentState, prompt, params }: AgentStepContext) {\n // Step 1: Run git diff immediately. Saves the agent a step, lowering cost and latency!\n yield {\n toolName: 'run_terminal_command',\n args: {\n command: 'git diff',\n },\n }\n\n // Step 2: Let AI run the rest of the steps!\n yield 'STEP_ALL'\n },\n}\n\nexport default definition\n", - "referencedBy": {} - }, - { - "path": ".agents/examples/diff-reviewer-3.ts", - "content": "import type {\n AgentDefinition,\n AgentStepContext,\n} from '../types/agent-definition'\n\nconst definition: AgentDefinition = {\n id: 'diff-reviewer-3',\n\n displayName: 'Diff Reviewer (Level 3)',\n model: 'openai/gpt-5',\n inputSchema: {\n prompt: {\n type: 'string',\n description:\n 'Please provide a short description of the changes you want to review',\n },\n },\n outputMode: 'last_message',\n\n toolNames: ['read_files', 'run_terminal_command', 'spawn_agents'],\n spawnableAgents: ['james/file-explorer@0.1.3'],\n\n spawnPurposePrompt:\n 'Spawn when you need to review code changes in the git diff',\n\n systemPrompt:\n 'You are an expert software developer. Your job is to review code changes and provide helpful feedback.',\n\n instructionsPrompt: `Review the changes and suggest improvements.\n\nUse the following guidelines while reviewing the changes:\n- Find ways to simplify the code\n- Reuse existing code as much as possible instead of writing new code\n- Preserve as much behavior as possible in the existing code\n- Prefer changing as few lines of code as possible\n- Look for opportunities to improve the code's readability\n- Look for logical errors in the code\n- Look for missed cases in the code\n- Look for any other bugs`,\n\n handleSteps: function* ({ agentState, prompt, params }: AgentStepContext) {\n // Step 1: Get list of changed files from git diff --name-only\n const { toolResult: gitDiffFilesResult } = yield {\n toolName: 'run_terminal_command',\n args: {\n command: 'git diff --name-only',\n },\n }\n\n // Then, extract file paths from the result\n const changedFiles = (gitDiffFilesResult || '')\n .split('\\n')\n .map((line) => line.trim())\n .filter((line) => line && !line.startsWith('??') && !line.includes('OSC'))\n\n // Step 2: Read the files\n if (changedFiles.length > 0) {\n yield {\n toolName: 'read_files',\n args: {\n paths: changedFiles,\n },\n }\n }\n\n // Step 3: Run full git diff to see the actual changes\n yield {\n toolName: 'run_terminal_command',\n args: {\n command: 'git diff',\n },\n }\n\n // Step 4: Put words in the AI's mouth to get it to spawn the file explorer.\n yield {\n toolName: 'add_message',\n args: {\n role: 'assistant',\n content:\n 'Now I will spawn a file explorer to find any missing codebase context.',\n },\n }\n\n yield 'STEP'\n\n // Step 5: Put words in the AI's mouth to review the changes.\n yield {\n toolName: 'add_message',\n args: {\n role: 'assistant',\n content: 'Here is my comprehensive review of the changes.',\n },\n }\n\n // Step 6: Let AI review the changes in a final step. (The last message is also the agent's output.)\n yield 'STEP'\n },\n}\n\nexport default definition\n", - "referencedBy": {} - }, - { - "path": ".agents/git-committer.ts", - "content": "import { publisher, version } from './constants'\n\nimport type {\n AgentDefinition,\n AgentStepContext,\n} from './types/agent-definition'\n\nconst definition: AgentDefinition = {\n id: 'git-committer',\n version,\n publisher,\n displayName: 'Git Committer',\n model: 'anthropic/claude-4-sonnet-20250522',\n toolNames: ['read_files', 'run_terminal_command', 'add_message', 'end_turn'],\n\n inputSchema: {\n prompt: {\n type: 'string',\n description: 'What changes to commit',\n },\n },\n\n includeMessageHistory: false,\n outputMode: 'last_message',\n\n spawnPurposePrompt:\n 'Spawn when you need to commit code changes to git with an appropriate commit message',\n\n systemPrompt:\n 'You are an expert software developer. Your job is to create a git commit with a really good commit message.',\n\n instructionsPrompt:\n 'Follow the steps to create a good commit: analyze changes with git diff and git log, read relevant files for context, stage appropriate files, analyze changes, and create a commit with proper formatting including the Codebuff footer.',\n\n handleSteps: function* ({ agentState, prompt, params }: AgentStepContext) {\n // Step 1: Run git diff and git log to analyze changes\n yield {\n toolName: 'run_terminal_command',\n args: {\n command: 'git diff',\n process_type: 'SYNC',\n timeout_seconds: 30,\n },\n }\n\n yield {\n toolName: 'run_terminal_command',\n args: {\n command: 'git log --oneline -10',\n process_type: 'SYNC',\n timeout_seconds: 30,\n },\n }\n\n // Step 2: Let AI analyze the changes and read relevant files for context\n yield {\n toolName: 'add_message',\n args: {\n role: 'assistant',\n content:\n \"I've analyzed the git diff and recent commit history. Now I'll read any relevant files to better understand the context of these changes.\",\n },\n }\n\n // Step 3: Let AI decide which files to read and stage\n yield 'STEP'\n\n // Step 4: Let AI analyze staged changes and compose commit message\n yield {\n toolName: 'add_message',\n args: {\n role: 'assistant',\n content:\n \"Now I'll analyze the staged changes and create a commit with the proper Codebuff footer format.\",\n },\n }\n\n yield 'STEP_ALL'\n },\n}\n\nexport default definition\n", - "referencedBy": {} - }, - { - "path": "common/src/util/examples/diff-reviewer-1.ts", - "content": "import type { AgentDefinition } from '../types/agent-definition'\n\nconst definition: AgentDefinition = {\n id: 'diff-reviewer-1',\n\n displayName: 'Diff Reviewer (Level 1)',\n model: 'openai/gpt-5',\n toolNames: ['read_files', 'run_terminal_command'],\n\n spawnPurposePrompt:\n 'Spawn when you need to review code changes in the git diff',\n\n instructionsPrompt: `Execute the following steps:\n1. Run git diff\n2. Read the files that have changed\n3. Review the changes and suggest improvements`,\n}\n\nexport default definition\n", - "referencedBy": {} - }, - { - "path": "common/src/util/examples/diff-reviewer-2.ts", - "content": "import type {\n AgentDefinition,\n AgentStepContext,\n} from '../types/agent-definition'\n\nconst definition: AgentDefinition = {\n id: 'diff-reviewer-2',\n displayName: 'Diff Reviewer (Level 2)',\n model: 'openai/gpt-5',\n\n inputSchema: {\n prompt: {\n type: 'string',\n description:\n 'Please provide a short description of the changes you want to review',\n },\n },\n toolNames: ['read_files', 'run_terminal_command'],\n\n spawnPurposePrompt:\n 'Spawn when you need to review code changes in the git diff',\n\n systemPrompt:\n 'You are an expert software developer. Your job is to review code changes and provide helpful feedback.',\n\n instructionsPrompt: `Execute the following steps:\n1. Run git diff\n2. Read the files that have changed\n3. Review the changes and suggest improvements\n\nUse the following guidelines while reviewing the changes:\n- Find ways to simplify the code\n- Reuse existing code as much as possible instead of writing new code\n- Preserve as much behavior as possible in the existing code\n- Prefer changing as few lines of code as possible\n- Look for opportunities to improve the code's readability\n- Look for logical errors in the code\n- Look for missed cases in the code\n- Look for any other bugs`,\n\n handleSteps: function* ({ agentState, prompt, params }: AgentStepContext) {\n // Step 1: Run git diff immediately. Saves the agent a step, lowering cost and latency!\n yield {\n toolName: 'run_terminal_command',\n args: {\n command: 'git diff',\n },\n }\n\n // Step 2: Let AI run the rest of the steps!\n yield 'STEP_ALL'\n },\n}\n\nexport default definition\n", - "referencedBy": {} - }, - { - "path": "common/src/util/examples/diff-reviewer-3.ts", - "content": "import type {\n AgentDefinition,\n AgentStepContext,\n} from '../types/agent-definition'\n\nconst definition: AgentDefinition = {\n id: 'diff-reviewer-3',\n\n displayName: 'Diff Reviewer (Level 3)',\n model: 'openai/gpt-5',\n inputSchema: {\n prompt: {\n type: 'string',\n description:\n 'Please provide a short description of the changes you want to review',\n },\n },\n outputMode: 'last_message',\n\n toolNames: ['read_files', 'run_terminal_command', 'spawn_agents'],\n spawnableAgents: ['james/file-explorer@0.1.3'],\n\n spawnPurposePrompt:\n 'Spawn when you need to review code changes in the git diff',\n\n systemPrompt:\n 'You are an expert software developer. Your job is to review code changes and provide helpful feedback.',\n\n instructionsPrompt: `Review the changes and suggest improvements.\n\nUse the following guidelines while reviewing the changes:\n- Find ways to simplify the code\n- Reuse existing code as much as possible instead of writing new code\n- Preserve as much behavior as possible in the existing code\n- Prefer changing as few lines of code as possible\n- Look for opportunities to improve the code's readability\n- Look for logical errors in the code\n- Look for missed cases in the code\n- Look for any other bugs`,\n\n handleSteps: function* ({ agentState, prompt, params }: AgentStepContext) {\n // Step 1: Get list of changed files from git diff --name-only\n const { toolResult: gitDiffFilesResult } = yield {\n toolName: 'run_terminal_command',\n args: {\n command: 'git diff --name-only',\n },\n }\n\n // Then, extract file paths from the result\n const changedFiles = (gitDiffFilesResult || '')\n .split('\\n')\n .map((line) => line.trim())\n .filter((line) => line && !line.startsWith('??') && !line.includes('OSC'))\n\n // Step 2: Read the files\n if (changedFiles.length > 0) {\n yield {\n toolName: 'read_files',\n args: {\n paths: changedFiles,\n },\n }\n }\n\n // Step 3: Run full git diff to see the actual changes\n yield {\n toolName: 'run_terminal_command',\n args: {\n command: 'git diff',\n },\n }\n\n // Step 4: Put words in the AI's mouth to get it to spawn the file explorer.\n yield {\n toolName: 'add_message',\n args: {\n role: 'assistant',\n content:\n 'Now I will spawn a file explorer to find any missing codebase context.',\n },\n }\n\n yield 'STEP'\n\n // Step 5: Put words in the AI's mouth to review the changes.\n yield {\n toolName: 'add_message',\n args: {\n role: 'assistant',\n content: 'Here is my comprehensive review of the changes.',\n },\n }\n\n // Step 6: Let AI review the changes in a final step. (The last message is also the agent's output.)\n yield 'STEP'\n },\n}\n\nexport default definition\n", - "referencedBy": {} - }, - { - "path": "backend/src/templates/agents/file-explorer.ts", - "content": "import { AgentTemplateTypes } from '@codebuff/common/types/session-state'\nimport { z } from 'zod/v4'\n\nimport type { AgentTemplate } from '../types'\n\nconst paramsSchema = z.object({\n prompts: z\n .array(z.string())\n .describe(\n 'List of 1-4 different parts of the codebase that could be useful to explore',\n ),\n})\n\nexport const fileExplorer = {\n id: AgentTemplateTypes.file_explorer,\n displayName: 'Dora the File Explorer',\n spawnPurposePrompt:\n 'Spawns multiple file picker agents in parallel to comprehensively explore the codebase from different perspectives',\n model: 'anthropic/claude-4-sonnet-20250522',\n outputMode: 'structured_output',\n includeMessageHistory: false,\n toolNames: ['spawn_agents', 'set_output'],\n spawnableAgents: ['file-picker'],\n inputSchema: {\n prompt: z\n .string()\n .describe('What you need to accomplish by exploring the codebase'),\n params: paramsSchema,\n },\n systemPrompt:\n 'You are a file explorer agent that spawns multiple file picker agents in parallel to comprehensively explore the codebase.',\n instructionsPrompt: '',\n stepPrompt: '',\n\n handleSteps: function* ({ prompt, params }) {\n const filePickerPrompts = params.prompts.map(\n (focusPrompt) =>\n `Based on the overall goal \"${prompt}\", find files related to this specific area: ${focusPrompt}`,\n )\n\n // Spawn all file pickers in parallel\n const { toolResult: spawnResult } = yield {\n toolName: 'spawn_agents' as const,\n args: {\n agents: filePickerPrompts.map((promptText) => ({\n agent_type: 'file-picker' as const,\n prompt: promptText,\n })),\n },\n }\n\n // Set output with aggregated results\n yield {\n toolName: 'set_output' as const,\n args: {\n results: spawnResult,\n },\n }\n },\n} satisfies AgentTemplate>\n", - "referencedBy": {} - } - ] - } - ] - }, - { - "type": "subagent_start", - "agentId": "D-QYfz6Uj58", - "agentType": "file-picker", - "displayName": "Fletcher the File Fetcher", - "onlyChild": false, - "parentAgentId": "main-agent", - "prompt": "package.json scripts for testing, linting, typechecking" - }, - { - "type": "subagent_start", - "agentId": "D-QYgBIs_zY", - "agentType": "code-searcher", - "displayName": "Code Searcher", - "onlyChild": false, - "parentAgentId": "main-agent", - "prompt": "", - "params": { - "searchQueries": [ - { - "pattern": "bun run typecheck|lint|test" - }, - { - "pattern": "AGENT_PERSONAS", - "flags": "-g *.ts" - } - ] - } - }, - { - "type": "tool_call", - "toolCallId": "b5cf7c6b-266d-4758-8e9e-069117fc61ec", - "toolName": "spawn_agents", - "input": { - "agents": [ - { - "agent_type": "file-lister", - "prompt": "package.json scripts for testing, linting, typechecking", - "params": {} - } - ] - }, - "agentId": "D-QYfz6Uj58", - "parentAgentId": "main-agent", - "includeToolCall": true - }, - { - "type": "subagent_start", - "agentId": "D-QYpeR_n1U", - "agentType": "file-lister", - "displayName": "Liszt the File Lister", - "onlyChild": true, - "parentAgentId": "D-QYfz6Uj58", - "prompt": "package.json scripts for testing, linting, typechecking", - "params": {} - }, - { - "type": "tool_call", - "toolCallId": "80170260-0f51-4267-aef7-85b48109a7cc", - "toolName": "code_search", - "input": { - "pattern": "bun run typecheck|lint|test" - }, - "agentId": "D-QYgBIs_zY", - "parentAgentId": "main-agent", - "includeToolCall": true - }, - { - "type": "tool_call", - "toolCallId": "df164364-63c0-4ef7-aac6-03342cfbf19c", - "toolName": "read_subtree", - "input": { - "paths": [], - "maxTokens": 500000 - }, - "agentId": "D-QYpeR_n1U", - "parentAgentId": "D-QYfz6Uj58", - "includeToolCall": true - }, - { - "type": "tool_result", - "toolCallId": "df164364-63c0-4ef7-aac6-03342cfbf19c", - "toolName": "read_subtree", - "output": [ - { - "type": "json", - "value": [ - { - "path": ".", - "type": "directory", - "printedTree": ".agents/\n examples/\n diff-reviewer-1.ts\n diff-reviewer-2.ts\n diff-reviewer-3.ts\n opensource/\n base.ts\n coder.ts\n file-picker.ts\n researcher.ts\n reviewer.ts\n thinker.ts\n ask.ts\n base-experimental.ts\n base-lite.ts\n base-max.ts\n base.ts\n brainstormer.ts\n changes-reviewer.ts\n charles.ts\n claude4-gemini-thinking.ts\n constants.ts\n file-explorer.ts\n file-picker.ts\n git-committer.ts\n knowledge-keeper.ts\n planner.ts\n researcher.ts\n reviewer.ts\n superagent.ts\n thinker.ts\n.bin/\n bun\n.github/\n workflows/\n ci.yml\n evals.yml\n nightly-evals.yml\n npm-app-release-build.yml\n npm-app-release-prod.yml\n npm-app-release-staging.yml\n .gitignore\n CODEOWNERS\n knowledge.md\n.vscode/\n settings.json\nbackend/\n src/\n __tests__/\n test-data/\n dex-go/\n edit-snippet.go\n expected.go\n original.go\n agent-id-resolution.test.ts\n agent-registry.test.ts\n auto-topup.test.ts\n credit-conversion.test.ts\n fast-rewrite.test.ts\n generate-diffs-prompt.test.ts\n get-custom-file-picker-config.test.ts\n live-user-inputs.test.ts\n loop-agent-steps.test.ts\n main-prompt.integration.test.ts\n main-prompt.test.ts\n process-file-block.test.ts\n process-str-replace.test.ts\n read-docs-tool.test.ts\n request-files-prompt.test.ts\n run-agent-step-tools.test.ts\n run-programmatic-step.test.ts\n sandbox-generator.test.ts\n subagent-streaming.test.ts\n test-utils.ts\n tool-call-schema.test.ts\n usage-calculation.test.ts\n web-search-tool.test.ts\n xml-stream-parser.test.ts\n admin/\n grade-runs.ts\n relabelRuns.ts\n api/\n org.ts\n usage.ts\n context/\n app-context.ts\n find-files/\n check-new-files-necessary.ts\n custom-file-picker-config.ts\n request-files-prompt.ts\n llm-apis/\n __tests__/\n linkup-api.test.ts\n vercel-ai-sdk/\n ai-sdk.ts\n openrouter.ts\n vertex-finetuned.ts\n claude.ts\n context7-api.ts\n gemini-with-fallbacks.ts\n knowledge.md\n linkup-api.ts\n message-cost-tracker.ts\n openai-api.ts\n openrouter.ts\n relace-api.ts\n system-prompt/\n agent-instructions.md\n prompts.ts\n save-agent-request.ts\n search-system-prompt.ts\n truncate-file-tree.ts\n templates/\n agents/\n archive/\n dry-run.ts\n agent-builder.ts\n ask.ts\n base.ts\n file-explorer.ts\n file-picker.ts\n planner.ts\n researcher.ts\n reviewer.ts\n superagent.ts\n thinker.ts\n thinking-base.ts\n agent-list.ts\n agent-registry.ts\n ask-prompts.ts\n base-prompts.ts\n prompts.ts\n README.md\n strings.ts\n types.ts\n tools/\n definitions/\n tool/\n add-message.ts\n add-subgoal.ts\n browser-logs.ts\n code-search.ts\n create-plan.ts\n end-turn.ts\n find-files.ts\n read-docs.ts\n read-files.ts\n run-file-change-hooks.ts\n run-terminal-command.ts\n set-messages.ts\n set-output.ts\n spawn-agent-inline.ts\n spawn-agents-async.ts\n spawn-agents.ts\n str-replace.ts\n think-deeply.ts\n update-subgoal.ts\n web-search.ts\n write-file.ts\n list.ts\n tool-def-type.ts\n handlers/\n tool/\n add-message.ts\n add-subgoal.ts\n browser-logs.ts\n code-search.ts\n create-plan.ts\n end-turn.ts\n find-files.ts\n read-docs.ts\n read-files.ts\n run-file-change-hooks.ts\n run-terminal-command.ts\n set-messages.ts\n set-output.ts\n spawn-agent-inline.ts\n spawn-agents-async.ts\n spawn-agents.ts\n str-replace.ts\n think-deeply.ts\n update-subgoal.ts\n web-search.ts\n write-file.ts\n handler-function-type.ts\n list.ts\n constants.ts\n prompts.ts\n stream-parser.ts\n tool-executor.ts\n util/\n __tests__/\n messages.test.ts\n object.test.ts\n parse-tool-call-xml.test.ts\n simplify-tool-results.test.ts\n split-data.test.ts\n check-auth.ts\n debug.ts\n file-resolver.ts\n logger.ts\n messages.ts\n object.ts\n parse-tool-call-xml.ts\n quickjs-sandbox.ts\n simplify-tool-results.ts\n split-data.ts\n token-counter.ts\n websockets/\n auth.ts\n middleware.ts\n request-context.ts\n server.ts\n switchboard.ts\n websocket-action.ts\n async-agent-manager.ts\n check-terminal-command.ts\n fast-rewrite.ts\n generate-diffs-prompt.ts\n get-documentation-for-query.ts\n get-file-reading-updates.ts\n index.ts\n live-user-inputs.ts\n loop-main-prompt.ts\n main-prompt.ts\n process-file-block.ts\n process-str-replace.ts\n prompt-agent-stream.ts\n run-agent-step.ts\n run-programmatic-step.ts\n xml-stream-parser.ts\n .gitignore\n knowledge.md\n package.json\n README.md\n tsconfig.json\ncommon/\n src/\n __tests__/\n agent-validation.test.ts\n dynamic-agent-template-schema.test.ts\n handlesteps-parsing.test.ts\n api-keys/\n constants.ts\n crypto.ts\n constants/\n agents.ts\n analytics-events.ts\n grant-priorities.ts\n db/\n migrations/\n meta/\n _journal.json\n 0000_snapshot.json\n 0001_snapshot.json\n 0002_snapshot.json\n 0003_snapshot.json\n 0004_snapshot.json\n 0005_snapshot.json\n 0006_snapshot.json\n 0007_snapshot.json\n 0008_snapshot.json\n 0009_snapshot.json\n 0010_snapshot.json\n 0011_snapshot.json\n 0012_snapshot.json\n 0013_snapshot.json\n 0014_snapshot.json\n 0015_snapshot.json\n 0016_snapshot.json\n 0017_snapshot.json\n 0018_snapshot.json\n 0019_snapshot.json\n 0020_snapshot.json\n 0021_snapshot.json\n 0026_snapshot.json\n 0027_snapshot.json\n 0028_snapshot.json\n 0000_overjoyed_thing.sql\n 0001_fuzzy_typhoid_mary.sql\n 0002_sticky_dormammu.sql\n 0003_military_owl.sql\n 0004_neat_pet_avengers.sql\n 0005_minor_the_professor.sql\n 0006_first_quasimodo.sql\n 0007_equal_warlock.sql\n 0008_puzzling_carnage.sql\n 0009_bitter_rumiko_fujikawa.sql\n 0010_overjoyed_red_skull.sql\n 0011_familiar_ezekiel_stane.sql\n 0012_fluffy_naoko.sql\n 0013_famous_risque.sql\n 0014_wakeful_sinister_six.sql\n 0015_stormy_zuras.sql\n 0016_clear_hairball.sql\n 0017_tricky_randall_flagg.sql\n 0018_stale_human_robot.sql\n 0019_amused_nebula.sql\n 0020_young_sleeper.sql\n 0021_tiny_marauders.sql\n 0026_chilly_mockingbird.sql\n 0027_sloppy_quasar.sql\n 0028_lush_johnny_blaze.sql\n docker-compose.yml\n drizzle.config.ts\n index.ts\n schema.knowledge.md\n schema.ts\n transaction.ts\n json-config/\n __tests__/\n __snapshots__/\n stringify-schema.test.ts.snap\n constants.test.ts\n stringify-schema.test.ts\n constants.ts\n default.ts\n stringify-schema.ts\n templates/\n agent-validation.ts\n dynamic-agent-functions.ts\n testing/\n mock-modules.ts\n tools/\n params/\n tool/\n add-message.ts\n add-subgoal.ts\n browser-logs.ts\n code-search.ts\n create-plan.ts\n end-turn.ts\n find-files.ts\n read-docs.ts\n read-files.ts\n run-file-change-hooks.ts\n run-terminal-command.ts\n set-messages.ts\n set-output.ts\n spawn-agent-inline.ts\n spawn-agents-async.ts\n spawn-agents.ts\n str-replace.ts\n think-deeply.ts\n update-subgoal.ts\n web-search.ts\n write-file.ts\n compile-tool-definitions.ts\n constants.ts\n list.ts\n utils.ts\n types/\n __tests__/\n dynamic-agent-template.test.ts\n api/\n agents/\n publish.ts\n agent-template.ts\n dynamic-agent-template.ts\n grant.ts\n message.ts\n organization.ts\n print-mode.ts\n publisher.ts\n referral.ts\n session-state.ts\n usage.ts\n util/\n __tests__/\n messages.test.ts\n partial-json-delta.test.ts\n saxy.test.ts\n string.test.ts\n examples/\n diff-reviewer-1.ts\n diff-reviewer-2.ts\n diff-reviewer-3.ts\n agent-file-utils.ts\n agent-name-normalization.ts\n agent-name-resolver.ts\n agent-template-validation.ts\n array.ts\n changes.ts\n credentials.ts\n currency.ts\n dates.ts\n error.ts\n file.ts\n git.ts\n logger.ts\n lru-cache.ts\n messages.ts\n min-heap.ts\n model-utils.ts\n object.ts\n partial-json-delta.ts\n patch.ts\n promise.ts\n random.ts\n referral.ts\n saxy.ts\n string.knowledge.md\n string.ts\n stripe.ts\n sync-failure.ts\n xml.ts\n zod-schema.ts\n websockets/\n websocket-client.ts\n websocket-schema.ts\n actions.ts\n analytics.ts\n browser-actions.ts\n constants.ts\n project-file-tree.ts\n knowledge.md\n package.json\n tsconfig.json\nevals/\n git-evals/\n email-eval-results.ts\n eval-codebuff.json\n eval-manifold.json\n eval-result-codebuff-mock.json\n gen-evals.ts\n judge-git-eval.ts\n post-eval-analysis.ts\n run-eval-set.ts\n run-git-evals.ts\n run-single-eval-process.ts\n run-single-eval.ts\n setup-test-repo.ts\n types.ts\n .gitignore\n bun.lock\n constants.ts\n e2e-cat-app-script.ts\n knowledge.md\n package.json\n scaffolding.ts\n swe-bench-eval.ts\n swe-bench-ids.ts\n swe-bench.test.ts\n test-repos.json\n test-setup.ts\n tsconfig.json\nnpm-app/\n release/\n index.js\n package.json\n README.md\n release-staging/\n index.js\n package.json\n README.md\n scripts/\n build-binary.js\n generate-github-token.ts\n patch-web-tree-sitter.ts\n release.js\n twitch-plays-codebuff.sh\n src/\n __tests__/\n display.test.ts\n tool-handlers.test.ts\n agents/\n agent-utils.ts\n load-agents.ts\n checkpoints/\n checkpoint-manager.ts\n file-manager.ts\n cli-handlers/\n agent-creation-chat.ts\n agents.ts\n api-key.ts\n checkpoint.ts\n diff.ts\n easter-egg.ts\n inititalization-flow.ts\n mini-chat.ts\n publish.ts\n subagent-list.ts\n subagent.ts\n display/\n overrides.ts\n print-mode.ts\n squash-newlines.ts\n json-config/\n hooks.ts\n parser.ts\n native/\n ripgrep.ts\n terminal/\n background.ts\n run-command.ts\n utils/\n __tests__/\n __snapshots__/\n background-process-manager.test.ts.snap\n frustration-detector.test.ts.snap\n rage-detector.test.ts.snap\n xml-stream-parser.test.ts.snap\n background-process-manager.test.ts\n rage-detector.test.ts\n response-example-4-files.txt\n tool-renderers.test.ts\n xml-stream-parser.test.ts\n agent-validation.ts\n analytics.ts\n detect-shell.ts\n git.ts\n logger.ts\n rage-detector.ts\n spinner.ts\n suppress-console.ts\n system-info.ts\n terminal.ts\n tool-renderers.ts\n with-hang-detection.ts\n xml-stream-parser.ts\n workers/\n checkpoint-worker.ts\n project-context.ts\n background-process-manager.ts\n browser-runner.ts\n chat-storage.ts\n cli-definitions.ts\n cli.ts\n client.ts\n config.ts\n create-template-project.ts\n credentials.ts\n dev-process-manager.ts\n diff-manager.ts\n fingerprint.ts\n index.ts\n menu.ts\n project-files.ts\n rage-detectors.ts\n startup-process-handler.ts\n subagent-storage.ts\n tool-handlers.ts\n types.ts\n web-scraper.ts\n .gitignore\n bunfig.toml\n package.json\n tsconfig.json\npackages/\n bigquery/\n src/\n client.ts\n index.ts\n schema.ts\n knowledge.md\n package.json\n tsconfig.json\n billing/\n src/\n __tests__/\n credit-delegation.test.ts\n extract-owner-repo.test.ts\n org-billing.test.ts\n auto-topup.ts\n balance-calculator.ts\n billing.knowledge.md\n conversion.ts\n credit-delegation.ts\n grant-credits.knowledge.md\n grant-credits.ts\n index.ts\n org-billing.ts\n org-monitoring.ts\n usage-service.ts\n utils.ts\n knowledge.md\n package.json\n project.json\n tsconfig.json\n build-tools/\n executors/\n infisical-run/\n executor.ts\n schema.json\n executors.json\n package.json\n project.json\n tsconfig.json\n code-map/\n __tests__/\n test-langs/\n test.c\n test.cpp\n test.cs\n test.go\n test.java\n test.js\n test.php\n test.py\n test.rb\n test.rs\n test.ts\n languages.test.ts\n parse.test.ts\n src/\n tree-sitter-queries/\n readme.md\n tree-sitter-c_sharp-tags.scm\n tree-sitter-c-tags.scm\n tree-sitter-cpp-tags.scm\n tree-sitter-go-tags.scm\n tree-sitter-java-tags.scm\n tree-sitter-javascript-tags.scm\n tree-sitter-php-tags.scm\n tree-sitter-python-tags.scm\n tree-sitter-ruby-tags.scm\n tree-sitter-rust-tags.scm\n tree-sitter-typescript-tags.scm\n index.ts\n languages.ts\n parse.ts\n package.json\n tsconfig.json\n internal/\n src/\n loops/\n client.ts\n index.ts\n types.ts\n openrouter-ai-sdk/\n internal/\n index.ts\n schemas/\n reasoning-details.ts\n types/\n index.ts\n openrouter-chat-completions-input.ts\n openrouter-chat-settings.ts\n .gitignore\n convert-to-openrouter-chat-messages.test.ts\n convert-to-openrouter-chat-messages.ts\n convert-to-openrouter-completion-prompt.ts\n index.ts\n map-openrouter-chat-logprobs.ts\n map-openrouter-completion-logprobs.ts\n map-openrouter-finish-reason.ts\n openrouter-chat-language-model.test.ts\n openrouter-chat-language-model.ts\n openrouter-completion-language-model.test.ts\n openrouter-completion-language-model.ts\n openrouter-completion-settings.ts\n openrouter-error.ts\n openrouter-facade.ts\n openrouter-provider-options.test.ts\n openrouter-provider.ts\n openrouter-stream-usage-accounting.test.ts\n openrouter-usage-accounting.test.ts\n utils/\n __tests__/\n version-utils.test.ts\n auth.ts\n version-utils.ts\n xml-parser.ts\n env.ts\n index.ts\n knowledge.md\n package.json\n tsconfig.json\npython-app/\n src/\n codebuff/\n __init__.py\n .gitignore\n knowledge.md\n LICENSE\n pyproject.toml\n README.md\nscripts/\n changelog/\n 2025-05-18-version-10283-release-enhanced-assistant-experience-system-stability.mdx\n 2025-05-25-version-10295-enhanced-ai-models-and-user-experience-improvements.mdx\n 2025-06-01-version-10305-release-enhanced-ai-models-new-commands-and-performance-improvements.mdx\n docs.json\n ft-file-selection/\n .gitignore\n collect-tuning-data.ts\n grade-traces.ts\n print-recent-relabels.ts\n print-recent-traces.ts\n README.md\n relabel-for-offline-scoring.ts\n relabel-traces-with-context.ts\n relabel-traces.ts\n .gitignore\n analyze-edit-blocks.ts\n analyze-model-usage.ts\n apply-credit-migration.ts\n calculate-average-spend.ts\n calculate-dau.ts\n calculate-monthly-usage.ts\n calculate-mrr.ts\n calculate-weekly-usage.ts\n cleanup-worktree.sh\n convert-escaped-newlines.ts\n count-edit-file.ts\n debug-log-subset.ts\n dev.sh\n export-user-emails.ts\n generate-ci-env.js\n generate-tool-definitions.ts\n get-changelog.ts\n init-worktree.ts\n package.json\n tsconfig.json\n update-stripe-subscriptions.ts\nsdk/\n scripts/\n publish.js\n src/\n tools/\n change-file.ts\n read-files.ts\n types/\n agent-definition.ts\n tools.ts\n client.ts\n constants.ts\n index.ts\n process-stream.ts\n websocket-client.ts\n .npmignore\n CHANGELOG.md\n package.json\n PUBLISHING.md\n README.md\n tsconfig.json\nweb/\n public/\n codebuff-intro1.webm\n scripts/\n discord/\n index.ts\n register-commands.ts\n src/\n __tests__/\n e2e/\n home.spec.ts\n unit/\n home.spec.tsx\n actions/\n hello-action.ts\n app/\n [sponsee]/\n page.tsx\n admin/\n file-picker/\n page.tsx\n orgs/\n page.tsx\n traces/\n components/\n chat-message.tsx\n client-session-viewer.tsx\n empty-state.tsx\n error-boundary.tsx\n loading-skeletons.tsx\n timeline-chart.module.css\n timeline-chart.tsx\n trace-viewer.tsx\n utils/\n __tests__/\n trace-processing.test.ts\n trace-processing.ts\n page.tsx\n layout.tsx\n affiliates/\n actions.ts\n page.tsx\n agents/\n page.tsx\n api/\n admin/\n orgs/\n [orgId]/\n features/\n [feature]/\n route.ts\n export/\n route.ts\n route.ts\n relabel-for-user/\n route.ts\n traces/\n [clientRequestId]/\n messages/\n route.ts\n timeline/\n route.ts\n client/\n [clientId]/\n sessions/\n route.ts\n admin-auth.ts\n agents/\n [publisherId]/\n [agentId]/\n [version]/\n route.ts\n latest/\n route.ts\n publish/\n route.ts\n validate/\n route.ts\n route.ts\n api-keys/\n route.ts\n auth/\n [...nextauth]/\n auth-options.ts\n route.ts\n cli/\n code/\n route.ts\n logout/\n route.ts\n status/\n route.ts\n feed/\n route.ts\n git-evals/\n visibility/\n route.ts\n route.ts\n healthz/\n route.ts\n invites/\n [token]/\n route.ts\n orgs/\n [orgId]/\n alerts/\n [alertId]/\n dismiss/\n route.ts\n route.ts\n analytics/\n export/\n route.ts\n route.ts\n billing/\n setup/\n route.ts\n status/\n route.ts\n subscription/\n route.ts\n credits/\n route.ts\n invitations/\n [email]/\n resend/\n route.ts\n route.ts\n bulk/\n route.ts\n route.ts\n members/\n [userId]/\n route.ts\n route.ts\n monitoring/\n route.ts\n publishers/\n route.ts\n repos/\n [repoId]/\n route.ts\n route.ts\n settings/\n route.ts\n usage/\n export/\n route.ts\n route.ts\n route.ts\n slug/\n [slug]/\n route.ts\n route.ts\n publishers/\n [id]/\n organization/\n route.ts\n validate/\n route.ts\n route.ts\n referrals/\n [code]/\n route.ts\n helpers.ts\n route.ts\n stripe/\n buy-credits/\n route.ts\n webhook/\n route.ts\n upload/\n avatar/\n route.ts\n user/\n auto-topup/\n route.ts\n profile/\n route.ts\n usage/\n route.ts\n config/\n page.tsx\n docs/\n [category]/\n layout.tsx\n metadata.ts\n page.tsx\n layout.tsx\n page.tsx\n evals/\n evals-table.tsx\n page.tsx\n invites/\n [token]/\n page.tsx\n login/\n page.tsx\n onboard/\n page.tsx\n orgs/\n [slug]/\n analytics/\n page.tsx\n billing/\n purchase/\n page.tsx\n setup/\n page.tsx\n repositories/\n page.tsx\n settings/\n page.tsx\n team/\n page.tsx\n usage/\n page.tsx\n page.tsx\n new/\n page.tsx\n page.tsx\n payment-success/\n page.tsx\n pricing/\n page.tsx\n privacy-policy/\n page.tsx\n publishers/\n [id]/\n agents/\n [agentId]/\n [version]/\n page.tsx\n page.tsx\n new/\n page.tsx\n page.tsx\n referrals/\n [code]/\n metadata.ts\n page.tsx\n layout.tsx\n page.tsx\n terms-of-service/\n page.tsx\n usage/\n layout.tsx\n page.tsx\n usage-display.tsx\n analytics.knowledge.md\n layout.tsx\n page.tsx\n robots.ts\n sitemap.ts\n components/\n agent/\n json-viewer.tsx\n auto-topup/\n AutoTopupSettings.tsx\n AutoTopupSettingsForm.tsx\n AutoTopupSwitch.tsx\n BaseAutoTopupSettings.tsx\n BaseAutoTopupSettingsForm.tsx\n BaseAutoTopupSwitch.tsx\n constants.ts\n OrgAutoTopupSettings.tsx\n OrgAutoTopupSettingsForm.tsx\n OrgAutoTopupSwitch.tsx\n types.ts\n credits/\n CreditManagementSection.tsx\n CreditPurchaseSection.tsx\n docs/\n mdx/\n code-demo.tsx\n custom-link.tsx\n markdown-table.tsx\n mdx-components.tsx\n mermaid-diagram.tsx\n schema-display.tsx\n copy-heading.tsx\n doc-sidebar.tsx\n docs.knowledge.md\n toc.tsx\n login/\n login-card.tsx\n login-client-wrapper.tsx\n navbar/\n navbar.tsx\n user-dropdown.tsx\n organization/\n advanced-monitor.tsx\n billing-alerts.tsx\n billing-reports.tsx\n billing-status.tsx\n credit-monitor.tsx\n model-config-sheet.tsx\n organization-success-modal.tsx\n repository-management.tsx\n team-management.tsx\n providers/\n query-client-provider.tsx\n publisher/\n basic-info-step.tsx\n ownership-step.tsx\n profile-details-step.tsx\n step-template.tsx\n sign-in/\n sign-in-button.tsx\n sign-in-card-footer.tsx\n ui/\n landing/\n competition/\n claude-code.tsx\n cline.tsx\n cursor.tsx\n github-copilot.tsx\n index.tsx\n tabs.tsx\n feature/\n browser-comparison.tsx\n chart-illustration.tsx\n code-illustration.tsx\n highlight-text.tsx\n index.tsx\n workflow-illustration.tsx\n animated-element.tsx\n constants.ts\n cta-section.tsx\n demo-code-display.tsx\n testimonials-section.tsx\n types.ts\n terminal/\n index.tsx\n style.css\n terminal-input.tsx\n terminal-output.tsx\n avatar-upload.tsx\n background-beams.tsx\n badge.tsx\n banner.tsx\n button.tsx\n card.tsx\n collapsible.tsx\n credit-confetti.tsx\n decorative-blocks.tsx\n dialog.tsx\n dropdown-menu.tsx\n enhanced-copy-button.tsx\n footer.tsx\n hero-buttons.tsx\n hero.tsx\n input.tsx\n install-dialog.tsx\n label.tsx\n neon-gradient-button.tsx\n progress.tsx\n radio-group.tsx\n section.tsx\n select.tsx\n separator.tsx\n sheet.tsx\n sidebar.tsx\n skeleton-loading.tsx\n skeleton.tsx\n slider.tsx\n switch.tsx\n table.tsx\n tabs.tsx\n textarea.tsx\n toast.tsx\n toaster.tsx\n tooltip.tsx\n use-toast.ts\n BrowserPreview.tsx\n card-with-beams.tsx\n CookieConsentCard.tsx\n footer.tsx\n icons.tsx\n IDEDemo.tsx\n layout-wrapper.tsx\n TerminalDemo.tsx\n theme-provider.tsx\n theme-switcher.tsx\n content/\n advanced/\n claude-code-comparison.mdx\n config.mdx\n how-does-it-work.mdx\n large-projects.mdx\n troubleshooting.mdx\n what-models.mdx\n agents/\n agent-reference.mdx\n creating-new-agents.mdx\n customizing-agents.mdx\n overview.mdx\n troubleshooting-agent-customization.mdx\n case-studies/\n _cta.mdx\n benjamin-bryant.mdx\n oliver-lukesch.mdx\n help/\n faq.mdx\n getting-started.mdx\n tips/\n best-practices.mdx\n keyboard-shortcuts.mdx\n knowledge-files.mdx\n other-use-cases.mdx\n version-control.mdx\n where-codebuff-shines.mdx\n discord/\n client.ts\n rate-limiter.ts\n hooks/\n use-auto-topup.ts\n use-install-dialog.ts\n use-mobile.tsx\n use-model-config.ts\n use-org-auto-topup.ts\n use-organization-data.ts\n use-user-profile.ts\n lib/\n server/\n referral.ts\n validators/\n publisher.ts\n admin-auth.ts\n constant.ts\n currency.ts\n docs.ts\n fonts.ts\n organization-permissions.ts\n PostHogProvider.tsx\n publisher-permissions.ts\n remark-code-to-codedemo.ts\n server-init.ts\n SessionProvider.tsx\n stripe-utils.ts\n testimonials.ts\n trackConversions.ts\n utils.ts\n styles/\n globals.css\n types/\n docs.ts\n user.ts\n util/\n logger.ts\n .eslintignore\n .eslintrc.js\n .gitignore\n .prettierignore\n .prettierrc.js\n commitlint.config.js\n components.json\n contentlayer.config.ts\n jest.config.js\n jest.setup.js\n knowledge.md\n next.config.mjs\n package.json\n playwright.config.ts\n postcss.config.cjs\n README.md\n tailwind.config.ts\n tsconfig.json\n.envrc\n.gitignore\n.infisical.json\n.prettierrc\nauthentication.knowledge.md\nbun.lock\nbunfig.toml\ncodebuff.json\neslint.config.js\nknowledge.md\npackage.json\nREADME.md\ntsconfig.base.json\ntsconfig.json\nWINDOWS.md\n", - "tokenCount": 9007, - "truncationLevel": "none" - } - ] - } - ], - "parentAgentId": "D-QYpeR_n1U" - }, - { - "type": "tool_result", - "toolCallId": "80170260-0f51-4267-aef7-85b48109a7cc", - "toolName": "code_search", - "output": [ - { - "type": "json", - "value": { - "stdout": ".github/workflows/ci.yml:\n1:# This workflow runs CI checks including building, typechecking, and testing the codebase\n18: runs-on: ubuntu-latest\n51: echo \"NEXT_PUBLIC_CB_ENVIRONMENT=test\" >> $GITHUB_ENV\n80: # Template for test jobs\n81: test:\n90: name: test-${{ matrix.package }}\n91: runs-on: ubuntu-latest\n124: echo \"NEXT_PUBLIC_CB_ENVIRONMENT=test\" >> $GITHUB_ENV\n128: - name: Run ${{ matrix.package }} tests\n133: command: cd ${{ matrix.package }} && find src -name '*.test.ts' ! -name '*.integration.test.ts' | sort | xargs -I {} bun test {}\n140: # Integration tests job\n141: test-integration:\n150: name: test-integration-${{ matrix.package }}\n151: runs-on: ubuntu-latest\n184: echo \"NEXT_PUBLIC_CB_ENVIRONMENT=test\" >> $GITHUB_ENV\n\n.agents/base-max.ts:\n70:- You are not the only one making changes to files. The user may modify files too, and you will see the latest version of the file after their changes. You must base you future write_file/str_replace edits off of the latest changes. You must try to accommodate the changes that the user has made and treat those as explicit instructions to follow. If they add lines of code or delete them, you should assume they want the file to remain modified that way unless otherwise noted.\n108:- **Package Management:** When adding new packages, use the run_terminal_command tool to install the package rather than editing the package.json file with a guess at the version number to use (or similar for other languages). This way, you will be sure to have the latest version of the package. Do not install packages globally unless asked by the user (e.g. Don\\'t run \\`npm install -g \\`). Always try to use the package manager associated with the project (e.g. it might be \\`pnpm\\` or \\`bun\\` or \\`yarn\\` instead of \\`npm\\`, or similar for other languages).\n110:- **Testing:** If you create a unit test, you should run it using \\`run_terminal_command\\` to see if it passes, and fix it if it doesn\\'t.\n149:Check the knowledge files to see if the user has specified a further protocol for what terminal commands should be run to verify edits. For example, a \\`knowledge.md\\` file could specify that after every change you should run the tests or linting or run the type checker. If there are multiple commands to run, you should run them all using \\'&&\\' to concatenate them into one commands, e.g. \\`npm run lint && npm run test\\`.\n310:If the user had knowledge files (or CLAUDE.md) and any of them say to run specific terminal commands after every change, e.g. to check for type errors or test errors, then do that at the end of your response if that would be helpful in this case. No need to run these checks for simple changes.\n\n./npm-app/src/cli-handlers/checkpoint.ts:\n189: const latestCheckpoint = checkpointManager.getLatestCheckpoint()\n190: await latestCheckpoint?.fileStateIdPromise\n198: 'Failed to wait for latest checkpoint file state',\n243: await checkpointManager.getLatestCheckpoint().fileStateIdPromise\n245: // No latest checkpoint available, previous checkpoint is guaranteed to be done.\n\n.github/workflows/nightly-evals.yml:\n11: runs-on: ubuntu-latest\n45: echo \"NEXT_PUBLIC_CB_ENVIRONMENT=test\" >> $GITHUB_ENV\n\n./npm-app/src/cli-handlers/agent-creation-chat.ts:\n108: 'Continue adjusting your agent here, or type \"/agents\" to switch agents and test it out.',\n\n.agents/base-experimental.ts:\n70:- You are not the only one making changes to files. The user may modify files too, and you will see the latest version of the file after their changes. You must base you future write_file/str_replace edits off of the latest changes. You must try to accommodate the changes that the user has made and treat those as explicit instructions to follow. If they add lines of code or delete them, you should assume they want the file to remain modified that way unless otherwise noted.\n108:- **Package Management:** When adding new packages, use the run_terminal_command tool to install the package rather than editing the package.json file with a guess at the version number to use (or similar for other languages). This way, you will be sure to have the latest version of the package. Do not install packages globally unless asked by the user (e.g. Don\\'t run \\`npm install -g \\`). Always try to use the package manager associated with the project (e.g. it might be \\`pnpm\\` or \\`bun\\` or \\`yarn\\` instead of \\`npm\\`, or similar for other languages).\n110:- **Testing:** If you create a unit test, you should run it using \\`run_terminal_command\\` to see if it passes, and fix it if it doesn\\'t.\n149:Check the knowledge files to see if the user has specified a further protocol for what terminal commands should be run to verify edits. For example, a \\`knowledge.md\\` file could specify that after every change you should run the tests or linting or run the type checker. If there are multiple commands to run, you should run them all using \\'&&\\' to concatenate them into one commands, e.g. \\`npm run lint && npm run test\\`.\n318:If the user had knowledge files (or CLAUDE.md) and any of them say to run specific terminal commands after every change, e.g. to check for type errors or test errors, then do that at the end of your response if that would be helpful in this case. No need to run these checks for simple changes.\n\n.agents/ask.ts:\n62:- You are not the only one making changes to files. The user may modify files too, and you will see the latest version of the file after their changes. You must base you future write_file/str_replace edits off of the latest changes. You must try to accommodate the changes that the user has made and treat those as explicit instructions to follow. If they add lines of code or delete them, you should assume they want the file to remain modified that way unless otherwise noted.\n123:Check the knowledge files to see if the user has specified a further protocol for what terminal commands should be run to verify edits. For example, a \\`knowledge.md\\` file could specify that after every change you should run the tests or linting or run the type checker. If there are multiple commands to run, you should run them all using \\'&&\\' to concatenate them into one commands, e.g. \\`npm run lint && npm run test\\`.\n\n.github/workflows/npm-app-release-build.yml:\n34: - os: ubuntu-latest\n39: - os: ubuntu-latest\n54: - os: windows-latest\n129: # Only test if we're building for the native architecture\n131: echo \"Skipping test for cross-compiled ARM64 binary\"\n\n./npm-app/src/cli-handlers/subagent-list.ts:\n197: const testLine =\n200: testLine.replace(/\\u001b\\[[0-9;]*m/g, '').length <=\n203: currentLine = testLine\n233: const testLine = `${currentLine} ${word}`\n235: testLine.replace(/\\u001b\\[[0-9;]*m/g, '').length <= maxLineLength\n237: currentLine = testLine\n\n.github/workflows/npm-app-release-staging.yml:\n18: runs-on: ubuntu-latest\n57: # Get latest beta version from npm to check if we need to increment\n58: echo \"Fetching latest beta version from npm...\"\n59: LATEST_BETA=$(npm view codecane@latest version 2>/dev/null || echo \"\")\n65: echo \"Latest beta version: $LATEST_BETA\"\n143: runs-on: ubuntu-latest\n228: \\\"body\\\": \\\"## Codecane v${{ needs.prepare-and-commit-staging.outputs.new_version }} (Staging)\\n\\n**⚠️ This is a staging/beta release for testing purposes.**\\n\\nBinary releases for all supported platforms.\\n\\n### Installation\\n\\`\\`\\`bash\\nnpm install -g codecane\\n\\`\\`\\`\\n\\n### Platform Binaries\\n- \\`codecane-linux-x64.tar.gz\\` - Linux x64\\n- \\`codecane-linux-arm64.tar.gz\\` - Linux ARM64\\n- \\`codecane-darwin-x64.tar.gz\\` - macOS Intel\\n- \\`codecane-darwin-arm64.tar.gz\\` - macOS Apple Silicon\\n- \\`codecane-win32-x64.tar.gz\\` - Windows x64\\\",\n258: runs-on: ubuntu-latest\n\n.github/workflows/evals.yml:\n9: runs-on: ubuntu-latest\n61: echo \"NEXT_PUBLIC_CB_ENVIRONMENT=test\" >> $GITHUB_ENV\n\n.github/workflows/npm-app-release-prod.yml:\n22: runs-on: ubuntu-latest\n105: runs-on: ubuntu-latest\n150: runs-on: ubuntu-latest\n\n./npm-app/src/menu.ts:\n400:${hasKnowledgeMd && !hasCodebuffJson ? `\\n${yellow(`${codebuffConfigFile} runs deployment scripts for you to test your code and runs configured checks for you by running your dev server.`)}` : ''}\n402:${!hasKnowledgeMd && !hasCodebuffJson ? `\\n${yellow('knowledge.md helps Codebuff understand your project structure and codebase better for better results.')}\\n${yellow(`${codebuffConfigFile} runs deployment scripts for you to test your code and runs configured checks for you by running your dev server.`)}` : ''}`\n422:${cyan(' • \"Create a unit test for the auth module\"')}\n\n.github/knowledge.md:\n8:2. **Test Job**: Runs tests for npm-app, backend, and common packages in parallel using matrix strategy\n27:Each test job:\n29:- Runs unit tests only (excludes integration tests)\n31:- Sets `CODEBUFF_GITHUB_ACTIONS=true` and `NEXT_PUBLIC_CB_ENVIRONMENT=test`\n37:- Test environment flags are set for proper test execution\n42:- Build job must complete before test jobs start (`needs: build`)\n87: bun act -j test-backend\n135:2. If tests fail with environment issues:\n153:6. Use the retry mechanism for flaky tests\n\n./npm-app/src/create-template-project.ts:\n20: if (!/^[a-zA-Z0-9-_]+$/.test(template)) {\n36: if (!/^[a-zA-Z0-9-_]+$/.test(projectName)) {\n\n./npm-app/src/client.ts:\n126: console.log('Make sure you are on the latest version of Codebuff!')\n1121: )}: Runs tests, linting, and type checking when you modify files\\n• ${bold(\n1373: checkpointAddendum = ` or \"checkpoint ${checkpointManager.getLatestCheckpoint().id}\" to revert`\n1375: // No latest checkpoint, don't show addendum\n1382: 'No latest checkpoint for addendum',\n\n.agents/base-lite.ts:\n70:- You are not the only one making changes to files. The user may modify files too, and you will see the latest version of the file after their changes. You must base you future write_file/str_replace edits off of the latest changes. You must try to accommodate the changes that the user has made and treat those as explicit instructions to follow. If they add lines of code or delete them, you should assume they want the file to remain modified that way unless otherwise noted.\n108:- **Package Management:** When adding new packages, use the run_terminal_command tool to install the package rather than editing the package.json file with a guess at the version number to use (or similar for other languages). This way, you will be sure to have the latest version of the package. Do not install packages globally unless asked by the user (e.g. Don\\'t run \\`npm install -g \\`). Always try to use the package manager associated with the project (e.g. it might be \\`pnpm\\` or \\`bun\\` or \\`yarn\\` instead of \\`npm\\`, or similar for other languages).\n110:- **Testing:** If you create a unit test, you should run it using \\`run_terminal_command\\` to see if it passes, and fix it if it doesn\\'t.\n149:Check the knowledge files to see if the user has specified a further protocol for what terminal commands should be run to verify edits. For example, a \\`knowledge.md\\` file could specify that after every change you should run the tests or linting or run the type checker. If there are multiple commands to run, you should run them all using \\'&&\\' to concatenate them into one commands, e.g. \\`npm run lint && npm run test\\`.\n312:If the user had knowledge files (or CLAUDE.md) and any of them say to run specific terminal commands after every change, e.g. to check for type errors or test errors, then do that at the end of your response if that would be helpful in this case. No need to run these checks for simple changes.\n\n.agents/claude4-gemini-thinking.ts:\n65:- You are not the only one making changes to files. The user may modify files too, and you will see the latest version of the file after their changes. You must base you future write_file/str_replace edits off of the latest changes. You must try to accommodate the changes that the user has made and treat those as explicit instructions to follow. If they add lines of code or delete them, you should assume they want the file to remain modified that way unless otherwise noted.\n103:- **Package Management:** When adding new packages, use the run_terminal_command tool to install the package rather than editing the package.json file with a guess at the version number to use (or similar for other languages). This way, you will be sure to have the latest version of the package. Do not install packages globally unless asked by the user (e.g. Don\\'t run \\`npm install -g \\`). Always try to use the package manager associated with the project (e.g. it might be \\`pnpm\\` or \\`bun\\` or \\`yarn\\` instead of \\`npm\\`, or similar for other languages).\n105:- **Testing:** If you create a unit test, you should run it using \\`run_terminal_command\\` to see if it passes, and fix it if it doesn\\'t.\n144:Check the knowledge files to see if the user has specified a further protocol for what terminal commands should be run to verify edits. For example, a \\`knowledge.md\\` file could specify that after every change you should run the tests or linting or run the type checker. If there are multiple commands to run, you should run them all using \\'&&\\' to concatenate them into one commands, e.g. \\`npm run lint && npm run test\\`.\n305:If the user had knowledge files (or CLAUDE.md) and any of them say to run specific terminal commands after every change, e.g. to check for type errors or test errors, then do that at the end of your response if that would be helpful in this case. No need to run these checks for simple changes.\n\n.agents/reviewer.ts:\n39:4. Always run hooks for TypeScript/JavaScript changes, test file changes, or when the changes could affect compilation/tests\n\n./npm-app/src/__tests__/display.test.ts:\n1:import { describe, expect, it } from 'bun:test'\n\n.agents/types/tools.d.ts:\n56: /** Optional ripgrep flags to customize the search (e.g., \"-i\" for case-insensitive, \"-t ts\" for TypeScript files only, \"-A 3\" for 3 lines after match, \"-B 2\" for 2 lines before match, \"--type-not test\" to exclude test files). */\n\n.agents/base.ts:\n70:- You are not the only one making changes to files. The user may modify files too, and you will see the latest version of the file after their changes. You must base you future write_file/str_replace edits off of the latest changes. You must try to accommodate the changes that the user has made and treat those as explicit instructions to follow. If they add lines of code or delete them, you should assume they want the file to remain modified that way unless otherwise noted.\n108:- **Package Management:** When adding new packages, use the run_terminal_command tool to install the package rather than editing the package.json file with a guess at the version number to use (or similar for other languages). This way, you will be sure to have the latest version of the package. Do not install packages globally unless asked by the user (e.g. Don\\'t run \\`npm install -g \\`). Always try to use the package manager associated with the project (e.g. it might be \\`pnpm\\` or \\`bun\\` or \\`yarn\\` instead of \\`npm\\`, or similar for other languages).\n110:- **Testing:** If you create a unit test, you should run it using \\`run_terminal_command\\` to see if it passes, and fix it if it doesn\\'t.\n149:Check the knowledge files to see if the user has specified a further protocol for what terminal commands should be run to verify edits. For example, a \\`knowledge.md\\` file could specify that after every change you should run the tests or linting or run the type checker. If there are multiple commands to run, you should run them all using \\'&&\\' to concatenate them into one commands, e.g. \\`npm run lint && npm run test\\`.\n310:If the user had knowledge files (or CLAUDE.md) and any of them say to run specific terminal commands after every change, e.g. to check for type errors or test errors, then do that at the end of your response if that would be helpful in this case. No need to run these checks for simple changes.\n\n./backend/src/live-user-inputs.ts:\n88:// For testing purposes - reset all state\n\n./backend/src/__tests__/live-user-inputs.test.ts:\n1:import { describe, it, expect, beforeEach, afterEach } from 'bun:test'\n15: // Clear any existing state before each test\n20: // Clean up any state after each test\n95: // For unit testing, we'll test the function directly\n105: // For unit testing, we'll test that endUserInput doesn't remove the input\n\n./backend/src/llm-apis/message-cost-tracker.ts:\n245: 'Skipping Stripe sync (no user or test user).',\n591: `Credits used by test user (${creditsUsed})`,\n\n./backend/src/__tests__/loop-agent-steps.test.ts:\n6:} from '@codebuff/common/testing/mock-modules'\n18:} from 'bun:test'\n22:import { mockFileContext, MockWebSocket } from './test-utils'\n66: // Mock live user inputs - will be overridden in individual tests\n68: checkLiveUserInput: () => false, // Default to false, override in tests\n136: processedRepoId: 'test-repo-id',\n\n[Output size limit reached.]", - "message": "Stopped early after 110 match(es)." - } - } - ], - "parentAgentId": "D-QYgBIs_zY" - }, - { - "type": "tool_call", - "toolCallId": "41c2f662-c174-4235-9585-75e3588576c6", - "toolName": "code_search", - "input": { - "pattern": "AGENT_PERSONAS", - "flags": "-g *.ts" - }, - "agentId": "D-QYgBIs_zY", - "parentAgentId": "main-agent", - "includeToolCall": true - }, - { - "type": "tool_result", - "toolCallId": "41c2f662-c174-4235-9585-75e3588576c6", - "toolName": "code_search", - "output": [ - { - "type": "json", - "value": { - "stdout": "./backend/src/templates/agents/planner.ts:\n1:import { AGENT_PERSONAS } from '@codebuff/common/constants/agents'\n12: displayName: AGENT_PERSONAS.planner.displayName,\n13: spawnPurposePrompt: AGENT_PERSONAS.planner.purpose,\n\n./backend/src/templates/agents/superagent.ts:\n1:import { AGENT_PERSONAS } from '@codebuff/common/constants/agents'\n15: displayName: AGENT_PERSONAS.superagent.displayName,\n16: spawnPurposePrompt: AGENT_PERSONAS.superagent.purpose,\n\n./backend/src/templates/agents/ask.ts:\n1:import { AGENT_PERSONAS } from '@codebuff/common/constants/agents'\n17: displayName: AGENT_PERSONAS.ask.displayName,\n\n./backend/src/templates/agents/thinking-base.ts:\n1:import { AGENT_PERSONAS } from '@codebuff/common/constants/agents'\n19: displayName: AGENT_PERSONAS.base_lite.displayName,\n20: spawnPurposePrompt: AGENT_PERSONAS.base_lite.purpose,\n\n./backend/src/templates/agents/reviewer.ts:\n1:import { AGENT_PERSONAS } from '@codebuff/common/constants/agents'\n12: displayName: AGENT_PERSONAS.reviewer.displayName,\n13: spawnPurposePrompt: AGENT_PERSONAS.reviewer.purpose,\n\n./backend/src/templates/agents/thinker.ts:\n1:import { AGENT_PERSONAS } from '@codebuff/common/constants/agents'\n12: displayName: AGENT_PERSONAS.thinker.displayName,\n13: spawnPurposePrompt: AGENT_PERSONAS.thinker.purpose,\n\n./backend/src/templates/agents/archive/dry-run.ts:\n1:import { AGENT_PERSONAS } from '@codebuff/common/constants/agents'\n11: displayName: AGENT_PERSONAS.dry_run.displayName,\n12: spawnPurposePrompt: AGENT_PERSONAS.dry_run.purpose,\n\n./backend/src/templates/agents/researcher.ts:\n1:import { AGENT_PERSONAS } from '@codebuff/common/constants/agents'\n12: displayName: AGENT_PERSONAS.researcher.displayName,\n13: spawnPurposePrompt: AGENT_PERSONAS.researcher.purpose,\n\n./backend/src/templates/agents/base.ts:\n1:import { AGENT_PERSONAS } from '@codebuff/common/constants/agents'\n19: displayName: AGENT_PERSONAS.base.displayName,\n20: spawnPurposePrompt: AGENT_PERSONAS.base.purpose,\n\n./backend/src/templates/agents/file-picker.ts:\n1:import { AGENT_PERSONAS } from '@codebuff/common/constants/agents'\n11: displayName: AGENT_PERSONAS.file_picker.displayName,\n12: spawnPurposePrompt: AGENT_PERSONAS.file_picker.purpose,\n\n./common/src/constants/agents.ts:\n4:export const AGENT_PERSONAS = {\n90:// Agent IDs list from AGENT_PERSONAS keys\n92: AGENT_PERSONAS,\n93:) as (keyof typeof AGENT_PERSONAS)[]\n100: Object.entries(AGENT_PERSONAS).map(([agentType, persona]) => [\n104:) as Record\n107: (typeof AGENT_PERSONAS)[keyof typeof AGENT_PERSONAS]['displayName']\n112: Object.values(AGENT_PERSONAS)\n\n./common/src/util/agent-name-resolver.ts:\n1:import { AGENT_PERSONAS } from '../constants/agents'\n14: return Object.entries(AGENT_PERSONAS)", - "message": "Exit code: 0" - } - } - ], - "parentAgentId": "D-QYgBIs_zY" - }, - { - "type": "tool_call", - "toolCallId": "47db3dd1-6ef0-43b2-b7c5-559c7354fb60", - "toolName": "set_output", - "input": { - "results": [ - { - "stdout": ".github/workflows/ci.yml:\n1:# This workflow runs CI checks including building, typechecking, and testing the codebase\n18: runs-on: ubuntu-latest\n51: echo \"NEXT_PUBLIC_CB_ENVIRONMENT=test\" >> $GITHUB_ENV\n80: # Template for test jobs\n81: test:\n90: name: test-${{ matrix.package }}\n91: runs-on: ubuntu-latest\n124: echo \"NEXT_PUBLIC_CB_ENVIRONMENT=test\" >> $GITHUB_ENV\n128: - name: Run ${{ matrix.package }} tests\n133: command: cd ${{ matrix.package }} && find src -name '*.test.ts' ! -name '*.integration.test.ts' | sort | xargs -I {} bun test {}\n140: # Integration tests job\n141: test-integration:\n150: name: test-integration-${{ matrix.package }}\n151: runs-on: ubuntu-latest\n184: echo \"NEXT_PUBLIC_CB_ENVIRONMENT=test\" >> $GITHUB_ENV\n\n.agents/base-max.ts:\n70:- You are not the only one making changes to files. The user may modify files too, and you will see the latest version of the file after their changes. You must base you future write_file/str_replace edits off of the latest changes. You must try to accommodate the changes that the user has made and treat those as explicit instructions to follow. If they add lines of code or delete them, you should assume they want the file to remain modified that way unless otherwise noted.\n108:- **Package Management:** When adding new packages, use the run_terminal_command tool to install the package rather than editing the package.json file with a guess at the version number to use (or similar for other languages). This way, you will be sure to have the latest version of the package. Do not install packages globally unless asked by the user (e.g. Don\\'t run \\`npm install -g \\`). Always try to use the package manager associated with the project (e.g. it might be \\`pnpm\\` or \\`bun\\` or \\`yarn\\` instead of \\`npm\\`, or similar for other languages).\n110:- **Testing:** If you create a unit test, you should run it using \\`run_terminal_command\\` to see if it passes, and fix it if it doesn\\'t.\n149:Check the knowledge files to see if the user has specified a further protocol for what terminal commands should be run to verify edits. For example, a \\`knowledge.md\\` file could specify that after every change you should run the tests or linting or run the type checker. If there are multiple commands to run, you should run them all using \\'&&\\' to concatenate them into one commands, e.g. \\`npm run lint && npm run test\\`.\n310:If the user had knowledge files (or CLAUDE.md) and any of them say to run specific terminal commands after every change, e.g. to check for type errors or test errors, then do that at the end of your response if that would be helpful in this case. No need to run these checks for simple changes.\n\n./npm-app/src/cli-handlers/checkpoint.ts:\n189: const latestCheckpoint = checkpointManager.getLatestCheckpoint()\n190: await latestCheckpoint?.fileStateIdPromise\n198: 'Failed to wait for latest checkpoint file state',\n243: await checkpointManager.getLatestCheckpoint().fileStateIdPromise\n245: // No latest checkpoint available, previous checkpoint is guaranteed to be done.\n\n.github/workflows/nightly-evals.yml:\n11: runs-on: ubuntu-latest\n45: echo \"NEXT_PUBLIC_CB_ENVIRONMENT=test\" >> $GITHUB_ENV\n\n./npm-app/src/cli-handlers/agent-creation-chat.ts:\n108: 'Continue adjusting your agent here, or type \"/agents\" to switch agents and test it out.',\n\n.agents/base-experimental.ts:\n70:- You are not the only one making changes to files. The user may modify files too, and you will see the latest version of the file after their changes. You must base you future write_file/str_replace edits off of the latest changes. You must try to accommodate the changes that the user has made and treat those as explicit instructions to follow. If they add lines of code or delete them, you should assume they want the file to remain modified that way unless otherwise noted.\n108:- **Package Management:** When adding new packages, use the run_terminal_command tool to install the package rather than editing the package.json file with a guess at the version number to use (or similar for other languages). This way, you will be sure to have the latest version of the package. Do not install packages globally unless asked by the user (e.g. Don\\'t run \\`npm install -g \\`). Always try to use the package manager associated with the project (e.g. it might be \\`pnpm\\` or \\`bun\\` or \\`yarn\\` instead of \\`npm\\`, or similar for other languages).\n110:- **Testing:** If you create a unit test, you should run it using \\`run_terminal_command\\` to see if it passes, and fix it if it doesn\\'t.\n149:Check the knowledge files to see if the user has specified a further protocol for what terminal commands should be run to verify edits. For example, a \\`knowledge.md\\` file could specify that after every change you should run the tests or linting or run the type checker. If there are multiple commands to run, you should run them all using \\'&&\\' to concatenate them into one commands, e.g. \\`npm run lint && npm run test\\`.\n318:If the user had knowledge files (or CLAUDE.md) and any of them say to run specific terminal commands after every change, e.g. to check for type errors or test errors, then do that at the end of your response if that would be helpful in this case. No need to run these checks for simple changes.\n\n.agents/ask.ts:\n62:- You are not the only one making changes to files. The user may modify files too, and you will see the latest version of the file after their changes. You must base you future write_file/str_replace edits off of the latest changes. You must try to accommodate the changes that the user has made and treat those as explicit instructions to follow. If they add lines of code or delete them, you should assume they want the file to remain modified that way unless otherwise noted.\n123:Check the knowledge files to see if the user has specified a further protocol for what terminal commands should be run to verify edits. For example, a \\`knowledge.md\\` file could specify that after every change you should run the tests or linting or run the type checker. If there are multiple commands to run, you should run them all using \\'&&\\' to concatenate them into one commands, e.g. \\`npm run lint && npm run test\\`.\n\n.github/workflows/npm-app-release-build.yml:\n34: - os: ubuntu-latest\n39: - os: ubuntu-latest\n54: - os: windows-latest\n129: # Only test if we're building for the native architecture\n131: echo \"Skipping test for cross-compiled ARM64 binary\"\n\n./npm-app/src/cli-handlers/subagent-list.ts:\n197: const testLine =\n200: testLine.replace(/\\u001b\\[[0-9;]*m/g, '').length <=\n203: currentLine = testLine\n233: const testLine = `${currentLine} ${word}`\n235: testLine.replace(/\\u001b\\[[0-9;]*m/g, '').length <= maxLineLength\n237: currentLine = testLine\n\n.github/workflows/npm-app-release-staging.yml:\n18: runs-on: ubuntu-latest\n57: # Get latest beta version from npm to check if we need to increment\n58: echo \"Fetching latest beta version from npm...\"\n59: LATEST_BETA=$(npm view codecane@latest version 2>/dev/null || echo \"\")\n65: echo \"Latest beta version: $LATEST_BETA\"\n143: runs-on: ubuntu-latest\n228: \\\"body\\\": \\\"## Codecane v${{ needs.prepare-and-commit-staging.outputs.new_version }} (Staging)\\n\\n**⚠️ This is a staging/beta release for testing purposes.**\\n\\nBinary releases for all supported platforms.\\n\\n### Installation\\n\\`\\`\\`bash\\nnpm install -g codecane\\n\\`\\`\\`\\n\\n### Platform Binaries\\n- \\`codecane-linux-x64.tar.gz\\` - Linux x64\\n- \\`codecane-linux-arm64.tar.gz\\` - Linux ARM64\\n- \\`codecane-darwin-x64.tar.gz\\` - macOS Intel\\n- \\`codecane-darwin-arm64.tar.gz\\` - macOS Apple Silicon\\n- \\`codecane-win32-x64.tar.gz\\` - Windows x64\\\",\n258: runs-on: ubuntu-latest\n\n.github/workflows/evals.yml:\n9: runs-on: ubuntu-latest\n61: echo \"NEXT_PUBLIC_CB_ENVIRONMENT=test\" >> $GITHUB_ENV\n\n.github/workflows/npm-app-release-prod.yml:\n22: runs-on: ubuntu-latest\n105: runs-on: ubuntu-latest\n150: runs-on: ubuntu-latest\n\n./npm-app/src/menu.ts:\n400:${hasKnowledgeMd && !hasCodebuffJson ? `\\n${yellow(`${codebuffConfigFile} runs deployment scripts for you to test your code and runs configured checks for you by running your dev server.`)}` : ''}\n402:${!hasKnowledgeMd && !hasCodebuffJson ? `\\n${yellow('knowledge.md helps Codebuff understand your project structure and codebase better for better results.')}\\n${yellow(`${codebuffConfigFile} runs deployment scripts for you to test your code and runs configured checks for you by running your dev server.`)}` : ''}`\n422:${cyan(' • \"Create a unit test for the auth module\"')}\n\n.github/knowledge.md:\n8:2. **Test Job**: Runs tests for npm-app, backend, and common packages in parallel using matrix strategy\n27:Each test job:\n29:- Runs unit tests only (excludes integration tests)\n31:- Sets `CODEBUFF_GITHUB_ACTIONS=true` and `NEXT_PUBLIC_CB_ENVIRONMENT=test`\n37:- Test environment flags are set for proper test execution\n42:- Build job must complete before test jobs start (`needs: build`)\n87: bun act -j test-backend\n135:2. If tests fail with environment issues:\n153:6. Use the retry mechanism for flaky tests\n\n./npm-app/src/create-template-project.ts:\n20: if (!/^[a-zA-Z0-9-_]+$/.test(template)) {\n36: if (!/^[a-zA-Z0-9-_]+$/.test(projectName)) {\n\n./npm-app/src/client.ts:\n126: console.log('Make sure you are on the latest version of Codebuff!')\n1121: )}: Runs tests, linting, and type checking when you modify files\\n• ${bold(\n1373: checkpointAddendum = ` or \"checkpoint ${checkpointManager.getLatestCheckpoint().id}\" to revert`\n1375: // No latest checkpoint, don't show addendum\n1382: 'No latest checkpoint for addendum',\n\n.agents/base-lite.ts:\n70:- You are not the only one making changes to files. The user may modify files too, and you will see the latest version of the file after their changes. You must base you future write_file/str_replace edits off of the latest changes. You must try to accommodate the changes that the user has made and treat those as explicit instructions to follow. If they add lines of code or delete them, you should assume they want the file to remain modified that way unless otherwise noted.\n108:- **Package Management:** When adding new packages, use the run_terminal_command tool to install the package rather than editing the package.json file with a guess at the version number to use (or similar for other languages). This way, you will be sure to have the latest version of the package. Do not install packages globally unless asked by the user (e.g. Don\\'t run \\`npm install -g \\`). Always try to use the package manager associated with the project (e.g. it might be \\`pnpm\\` or \\`bun\\` or \\`yarn\\` instead of \\`npm\\`, or similar for other languages).\n110:- **Testing:** If you create a unit test, you should run it using \\`run_terminal_command\\` to see if it passes, and fix it if it doesn\\'t.\n149:Check the knowledge files to see if the user has specified a further protocol for what terminal commands should be run to verify edits. For example, a \\`knowledge.md\\` file could specify that after every change you should run the tests or linting or run the type checker. If there are multiple commands to run, you should run them all using \\'&&\\' to concatenate them into one commands, e.g. \\`npm run lint && npm run test\\`.\n312:If the user had knowledge files (or CLAUDE.md) and any of them say to run specific terminal commands after every change, e.g. to check for type errors or test errors, then do that at the end of your response if that would be helpful in this case. No need to run these checks for simple changes.\n\n.agents/claude4-gemini-thinking.ts:\n65:- You are not the only one making changes to files. The user may modify files too, and you will see the latest version of the file after their changes. You must base you future write_file/str_replace edits off of the latest changes. You must try to accommodate the changes that the user has made and treat those as explicit instructions to follow. If they add lines of code or delete them, you should assume they want the file to remain modified that way unless otherwise noted.\n103:- **Package Management:** When adding new packages, use the run_terminal_command tool to install the package rather than editing the package.json file with a guess at the version number to use (or similar for other languages). This way, you will be sure to have the latest version of the package. Do not install packages globally unless asked by the user (e.g. Don\\'t run \\`npm install -g \\`). Always try to use the package manager associated with the project (e.g. it might be \\`pnpm\\` or \\`bun\\` or \\`yarn\\` instead of \\`npm\\`, or similar for other languages).\n105:- **Testing:** If you create a unit test, you should run it using \\`run_terminal_command\\` to see if it passes, and fix it if it doesn\\'t.\n144:Check the knowledge files to see if the user has specified a further protocol for what terminal commands should be run to verify edits. For example, a \\`knowledge.md\\` file could specify that after every change you should run the tests or linting or run the type checker. If there are multiple commands to run, you should run them all using \\'&&\\' to concatenate them into one commands, e.g. \\`npm run lint && npm run test\\`.\n305:If the user had knowledge files (or CLAUDE.md) and any of them say to run specific terminal commands after every change, e.g. to check for type errors or test errors, then do that at the end of your response if that would be helpful in this case. No need to run these checks for simple changes.\n\n.agents/reviewer.ts:\n39:4. Always run hooks for TypeScript/JavaScript changes, test file changes, or when the changes could affect compilation/tests\n\n./npm-app/src/__tests__/display.test.ts:\n1:import { describe, expect, it } from 'bun:test'\n\n.agents/types/tools.d.ts:\n56: /** Optional ripgrep flags to customize the search (e.g., \"-i\" for case-insensitive, \"-t ts\" for TypeScript files only, \"-A 3\" for 3 lines after match, \"-B 2\" for 2 lines before match, \"--type-not test\" to exclude test files). */\n\n.agents/base.ts:\n70:- You are not the only one making changes to files. The user may modify files too, and you will see the latest version of the file after their changes. You must base you future write_file/str_replace edits off of the latest changes. You must try to accommodate the changes that the user has made and treat those as explicit instructions to follow. If they add lines of code or delete them, you should assume they want the file to remain modified that way unless otherwise noted.\n108:- **Package Management:** When adding new packages, use the run_terminal_command tool to install the package rather than editing the package.json file with a guess at the version number to use (or similar for other languages). This way, you will be sure to have the latest version of the package. Do not install packages globally unless asked by the user (e.g. Don\\'t run \\`npm install -g \\`). Always try to use the package manager associated with the project (e.g. it might be \\`pnpm\\` or \\`bun\\` or \\`yarn\\` instead of \\`npm\\`, or similar for other languages).\n110:- **Testing:** If you create a unit test, you should run it using \\`run_terminal_command\\` to see if it passes, and fix it if it doesn\\'t.\n149:Check the knowledge files to see if the user has specified a further protocol for what terminal commands should be run to verify edits. For example, a \\`knowledge.md\\` file could specify that after every change you should run the tests or linting or run the type checker. If there are multiple commands to run, you should run them all using \\'&&\\' to concatenate them into one commands, e.g. \\`npm run lint && npm run test\\`.\n310:If the user had knowledge files (or CLAUDE.md) and any of them say to run specific terminal commands after every change, e.g. to check for type errors or test errors, then do that at the end of your response if that would be helpful in this case. No need to run these checks for simple changes.\n\n./backend/src/live-user-inputs.ts:\n88:// For testing purposes - reset all state\n\n./backend/src/__tests__/live-user-inputs.test.ts:\n1:import { describe, it, expect, beforeEach, afterEach } from 'bun:test'\n15: // Clear any existing state before each test\n20: // Clean up any state after each test\n95: // For unit testing, we'll test the function directly\n105: // For unit testing, we'll test that endUserInput doesn't remove the input\n\n./backend/src/llm-apis/message-cost-tracker.ts:\n245: 'Skipping Stripe sync (no user or test user).',\n591: `Credits used by test user (${creditsUsed})`,\n\n./backend/src/__tests__/loop-agent-steps.test.ts:\n6:} from '@codebuff/common/testing/mock-modules'\n18:} from 'bun:test'\n22:import { mockFileContext, MockWebSocket } from './test-utils'\n66: // Mock live user inputs - will be overridden in individual tests\n68: checkLiveUserInput: () => false, // Default to false, override in tests\n136: processedRepoId: 'test-repo-id',\n\n[Output size limit reached.]", - "message": "Stopped early after 110 match(es)." - }, - { - "stdout": "./backend/src/templates/agents/planner.ts:\n1:import { AGENT_PERSONAS } from '@codebuff/common/constants/agents'\n12: displayName: AGENT_PERSONAS.planner.displayName,\n13: spawnPurposePrompt: AGENT_PERSONAS.planner.purpose,\n\n./backend/src/templates/agents/superagent.ts:\n1:import { AGENT_PERSONAS } from '@codebuff/common/constants/agents'\n15: displayName: AGENT_PERSONAS.superagent.displayName,\n16: spawnPurposePrompt: AGENT_PERSONAS.superagent.purpose,\n\n./backend/src/templates/agents/ask.ts:\n1:import { AGENT_PERSONAS } from '@codebuff/common/constants/agents'\n17: displayName: AGENT_PERSONAS.ask.displayName,\n\n./backend/src/templates/agents/thinking-base.ts:\n1:import { AGENT_PERSONAS } from '@codebuff/common/constants/agents'\n19: displayName: AGENT_PERSONAS.base_lite.displayName,\n20: spawnPurposePrompt: AGENT_PERSONAS.base_lite.purpose,\n\n./backend/src/templates/agents/reviewer.ts:\n1:import { AGENT_PERSONAS } from '@codebuff/common/constants/agents'\n12: displayName: AGENT_PERSONAS.reviewer.displayName,\n13: spawnPurposePrompt: AGENT_PERSONAS.reviewer.purpose,\n\n./backend/src/templates/agents/thinker.ts:\n1:import { AGENT_PERSONAS } from '@codebuff/common/constants/agents'\n12: displayName: AGENT_PERSONAS.thinker.displayName,\n13: spawnPurposePrompt: AGENT_PERSONAS.thinker.purpose,\n\n./backend/src/templates/agents/archive/dry-run.ts:\n1:import { AGENT_PERSONAS } from '@codebuff/common/constants/agents'\n11: displayName: AGENT_PERSONAS.dry_run.displayName,\n12: spawnPurposePrompt: AGENT_PERSONAS.dry_run.purpose,\n\n./backend/src/templates/agents/researcher.ts:\n1:import { AGENT_PERSONAS } from '@codebuff/common/constants/agents'\n12: displayName: AGENT_PERSONAS.researcher.displayName,\n13: spawnPurposePrompt: AGENT_PERSONAS.researcher.purpose,\n\n./backend/src/templates/agents/base.ts:\n1:import { AGENT_PERSONAS } from '@codebuff/common/constants/agents'\n19: displayName: AGENT_PERSONAS.base.displayName,\n20: spawnPurposePrompt: AGENT_PERSONAS.base.purpose,\n\n./backend/src/templates/agents/file-picker.ts:\n1:import { AGENT_PERSONAS } from '@codebuff/common/constants/agents'\n11: displayName: AGENT_PERSONAS.file_picker.displayName,\n12: spawnPurposePrompt: AGENT_PERSONAS.file_picker.purpose,\n\n./common/src/constants/agents.ts:\n4:export const AGENT_PERSONAS = {\n90:// Agent IDs list from AGENT_PERSONAS keys\n92: AGENT_PERSONAS,\n93:) as (keyof typeof AGENT_PERSONAS)[]\n100: Object.entries(AGENT_PERSONAS).map(([agentType, persona]) => [\n104:) as Record\n107: (typeof AGENT_PERSONAS)[keyof typeof AGENT_PERSONAS]['displayName']\n112: Object.values(AGENT_PERSONAS)\n\n./common/src/util/agent-name-resolver.ts:\n1:import { AGENT_PERSONAS } from '../constants/agents'\n14: return Object.entries(AGENT_PERSONAS)", - "message": "Exit code: 0" - } - ] - }, - "agentId": "D-QYgBIs_zY", - "parentAgentId": "main-agent", - "includeToolCall": false - }, - { - "type": "tool_result", - "toolCallId": "47db3dd1-6ef0-43b2-b7c5-559c7354fb60", - "toolName": "set_output", - "output": [ - { - "type": "json", - "value": { - "message": "Output set" - } - } - ], - "parentAgentId": "D-QYgBIs_zY" - }, - { - "type": "subagent_finish", - "agentId": "D-QYgBIs_zY", - "agentType": "code-searcher", - "displayName": "Code Searcher", - "onlyChild": false, - "parentAgentId": "main-agent", - "prompt": "", - "params": { - "searchQueries": [ - { - "pattern": "bun run typecheck|lint|test" - }, - { - "pattern": "AGENT_PERSONAS", - "flags": "-g *.ts" - } - ] - } - }, - { - "type": "text", - "agentId": "D-QYfz6Uj58", - "text": "package.json\nbackend/package.json\ncommon/package.json\nevals/package.json\nnpm-app/package.json\npackages/bigquery/package.json\npackages/billing/package.json\npackages/build-tools/package.json\npackages/code-map/package.json\npackages/internal/package.json\nscripts/package.json\nsdk/package.json" - }, - { - "type": "subagent_finish", - "agentId": "D-QYpeR_n1U", - "agentType": "file-lister", - "displayName": "Liszt the File Lister", - "onlyChild": true, - "parentAgentId": "D-QYfz6Uj58", - "prompt": "package.json scripts for testing, linting, typechecking", - "params": {} - }, - { - "type": "tool_result", - "toolCallId": "b5cf7c6b-266d-4758-8e9e-069117fc61ec", - "toolName": "spawn_agents", - "output": [ - { - "type": "json", - "value": [ - { - "agentName": "Liszt the File Lister", - "agentType": "file-lister", - "value": { - "type": "lastMessage", - "value": [ - { - "role": "assistant", - "content": [ - { - "type": "text", - "text": "package.json\nbackend/package.json\ncommon/package.json\nevals/package.json\nnpm-app/package.json\npackages/bigquery/package.json\npackages/billing/package.json\npackages/build-tools/package.json\npackages/code-map/package.json\npackages/internal/package.json\nscripts/package.json\nsdk/package.json" - } - ] - } - ] - } - } - ] - } - ], - "parentAgentId": "D-QYfz6Uj58" - }, - { - "type": "tool_call", - "toolCallId": "5f37dfa7-6bd0-424d-8624-420665495612", - "toolName": "read_files", - "input": { - "paths": [ - "package.json", - "backend/package.json", - "common/package.json", - "evals/package.json", - "npm-app/package.json", - "packages/bigquery/package.json", - "packages/billing/package.json", - "packages/build-tools/package.json", - "packages/code-map/package.json", - "packages/internal/package.json", - "scripts/package.json", - "sdk/package.json" - ] - }, - "agentId": "D-QYfz6Uj58", - "parentAgentId": "main-agent", - "includeToolCall": true - }, - { - "type": "tool_result", - "toolCallId": "5f37dfa7-6bd0-424d-8624-420665495612", - "toolName": "read_files", - "output": [ - { - "type": "json", - "value": [ - { - "path": "package.json", - "content": "{\n \"name\": \"codebuff-project\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"license\": \"UNLICENSED\",\n \"type\": \"module\",\n \"workspaces\": [\n \"common\",\n \"backend\",\n \"npm-app\",\n \"web\",\n \"packages/*\",\n \"scripts\",\n \"evals\",\n \"sdk\"\n ],\n \"scripts\": {\n \"dev\": \"bash scripts/dev.sh\",\n \"start-db\": \"bun --cwd common db:start\",\n \"start-bin\": \"bun --cwd npm-app start-bin\",\n \"start-web\": \"bun start-db && bun --cwd web dev\",\n \"start-studio\": \"bun --cwd common db:studio\",\n \"start-server\": \"bun --cwd backend dev\",\n \"start-manifold\": \"bun --cwd npm-app start-manifold\",\n \"start-codebuff-test\": \"bun --cwd npm-app start --cwd ../../codebuff-test\",\n \"start-litestar\": \"bun --cwd npm-app start-litestar\",\n \"start-jpcsp\": \"bun --cwd npm-app start-jpcsp\",\n \"start-vscode\": \"bun --cwd npm-app start-vscode\",\n \"start-nushell\": \"bun --cwd npm-app start-nushell\",\n \"format\": \"prettier --write \\\"**/*.{ts,tsx,json,md}\\\"\",\n \"release:npm-app\": \"bun run --cwd npm-app release\",\n \"clean-ts\": \"find . -name '*.tsbuildinfo' -type f -delete && find . -name '.next' -type d -exec rm -rf {} + 2>/dev/null || true && find . -name 'node_modules' -type d -exec rm -rf {} + 2>/dev/null || true && bun install\",\n \"typecheck\": \"bun --filter='*' run typecheck && echo '✅ All type checks passed!'\",\n \"test\": \"bun --filter='{@codebuff/backend,@codebuff/common,@codebuff/npm-app}' run test\",\n \"init-worktree\": \"bun scripts/init-worktree.ts\",\n \"cleanup-worktree\": \"bash scripts/cleanup-worktree.sh\",\n \"generate-tool-definitions\": \"bun scripts/generate-tool-definitions.ts\"\n },\n \"dependencies\": {\n \"@t3-oss/env-nextjs\": \"^0.7.3\",\n \"zod\": \"3.25.67\"\n },\n \"overrides\": {\n \"zod\": \"3.25.67\"\n },\n \"devDependencies\": {\n \"@tanstack/react-query\": \"^5.59.16\",\n \"@types/bun\": \"^1.2.11\",\n \"@types/lodash\": \"4.17.7\",\n \"@types/node\": \"^22.9.0\",\n \"@types/node-fetch\": \"^2.6.12\",\n \"@types/parse-path\": \"^7.1.0\",\n \"@typescript-eslint/eslint-plugin\": \"^6.17\",\n \"bun-types\": \"^1.2.2\",\n \"eslint-config-prettier\": \"^9.1.0\",\n \"eslint-plugin-import\": \"^2.29.1\",\n \"eslint-plugin-unused-imports\": \"^4.1.4\",\n \"ignore\": \"^6.0.2\",\n \"lodash\": \"4.17.21\",\n \"prettier\": \"3.3.2\",\n \"ts-node\": \"^10.9.2\",\n \"ts-pattern\": \"^5.5.0\",\n \"tsc-alias\": \"1.7.0\",\n \"tsconfig-paths\": \"4.2.0\",\n \"types\": \"^0.1.1\",\n \"typescript\": \"5.5.4\",\n \"typescript-eslint\": \"^7.17.0\"\n },\n \"engines\": {\n \"node\": \">=20.0.0\"\n },\n \"packageManager\": \"yarn@1.22.22+sha512.a6b2f7906b721bba3d67d4aff083df04dad64c399707841b7acf00f6b133b7ac24255f2652fa22ae3534329dc6180534e98d17432037ff6fd140556e2bb3137e\"\n}\n", - "referencedBy": {} - }, - { - "path": "backend/package.json", - "content": "{\n \"name\": \"@codebuff/backend\",\n \"version\": \"1.0.0\",\n \"description\": \"Backend server for Codebuff\",\n \"private\": true,\n \"license\": \"UNLICENSED\",\n \"type\": \"module\",\n \"exports\": {\n \"./*\": {\n \"bun\": \"./src/*.ts\",\n \"import\": \"./src/*.ts\",\n \"types\": \"./src/*.ts\",\n \"default\": \"./src/*.ts\"\n }\n },\n \"scripts\": {\n \"start\": \"bun src/index.ts\",\n \"dev\": \"bun src/index.ts\",\n \"typecheck\": \"tsc --noEmit -p .\",\n \"test\": \"bun test\"\n },\n \"sideEffects\": false,\n \"engines\": {\n \"bun\": \">=1.2.11\"\n },\n \"dependencies\": {\n \"@ai-sdk/google-vertex\": \"2.2.24\",\n \"@ai-sdk/openai\": \"1.3.22\",\n \"@codebuff/billing\": \"workspace:*\",\n \"@codebuff/common\": \"workspace:*\",\n \"@codebuff/internal\": \"workspace:*\",\n \"@google-cloud/vertexai\": \"1.10.0\",\n \"@google/generative-ai\": \"0.24.1\",\n \"ai\": \"4.3.16\",\n \"cors\": \"^2.8.5\",\n \"diff\": \"5.2.0\",\n \"dotenv\": \"16.4.5\",\n \"express\": \"4.19.2\",\n \"gpt-tokenizer\": \"2.8.1\",\n \"ignore\": \"5.3.2\",\n \"@jitl/quickjs-wasmfile-release-sync\": \"0.31.0\",\n \"quickjs-emscripten-core\": \"0.31.0\",\n \"lodash\": \"*\",\n \"openai\": \"^4.78.1\",\n \"pino\": \"9.4.0\",\n \"postgres\": \"3.4.4\",\n \"posthog-node\": \"^4.14.0\",\n \"ts-pattern\": \"5.3.1\",\n \"ws\": \"8.18.0\",\n \"zod\": \"3.25.67\",\n \"zod-from-json-schema\": \"0.4.2\"\n },\n \"devDependencies\": {\n \"@types/cors\": \"^2.8.19\",\n \"@types/diff\": \"^5.0.3\",\n \"@types/express\": \"^4.17.13\",\n \"@types/ws\": \"^8.5.5\"\n }\n}\n", - "referencedBy": {} - }, - { - "path": "common/package.json", - "content": "{\n \"name\": \"@codebuff/common\",\n \"version\": \"1.0.0\",\n \"description\": \"Common utilities for Codebuff\",\n \"private\": true,\n \"license\": \"UNLICENSED\",\n \"type\": \"module\",\n \"exports\": {\n \"./db\": {\n \"bun\": \"./src/db/index.ts\",\n \"import\": \"./src/db/index.ts\",\n \"types\": \"./src/db/index.ts\",\n \"default\": \"./src/db/index.ts\"\n },\n \"./*\": {\n \"bun\": \"./src/*.ts\",\n \"import\": \"./src/*.ts\",\n \"types\": \"./src/*.ts\",\n \"default\": \"./src/*.ts\"\n }\n },\n \"scripts\": {\n \"typecheck\": \"tsc --noEmit -p .\",\n \"test\": \"bun test\",\n \"db:generate\": \"drizzle-kit generate --config=./src/db/drizzle.config.ts\",\n \"db:migrate\": \"drizzle-kit push --config=./src/db/drizzle.config.ts\",\n \"db:start\": \"docker compose -f ./src/db/docker-compose.yml up --wait && bun run db:generate && (timeout 1 || sleep 1) && bun run db:migrate\",\n \"db:studio\": \"drizzle-kit studio --config=./src/db/drizzle.config.ts\"\n },\n \"sideEffects\": false,\n \"engines\": {\n \"bun\": \">=1.2.11\"\n },\n \"dependencies\": {\n \"@auth/drizzle-adapter\": \"^1.5.0\",\n \"@types/pg\": \"^8.11.10\",\n \"@types/readable-stream\": \"^4.0.18\",\n \"@types/seedrandom\": \"^3.0.8\",\n \"ai\": \"4.3.16\",\n \"drizzle-kit\": \"0.28.1\",\n \"drizzle-orm\": \"0.36.4\",\n \"ignore\": \"5.3.2\",\n \"lodash\": \"*\",\n \"next-auth\": \"^4.24.7\",\n \"partial-json\": \"^0.1.7\",\n \"pg\": \"^8.14.1\",\n \"readable-stream\": \"^4.7.0\",\n \"seedrandom\": \"^3.0.5\",\n \"stripe\": \"^16.11.0\",\n \"zod\": \"3.25.67\"\n },\n \"devDependencies\": {\n \"@types/parse-path\": \"^7.1.0\"\n }\n}\n", - "referencedBy": {} - }, - { - "path": "evals/package.json", - "content": "{\n \"name\": \"@codebuff/evals\",\n \"version\": \"1.0.0\",\n \"description\": \"Evaluation scripts for Codebuff\",\n \"private\": true,\n \"license\": \"UNLICENSED\",\n \"type\": \"module\",\n \"exports\": {\n \".\": {\n \"bun\": \"./src/index.ts\",\n \"types\": \"./src/index.ts\"\n }\n },\n \"scripts\": {\n \"typecheck\": \"tsc --noEmit -p .\",\n \"test\": \"bun test\",\n \"test:manifold\": \"bun test manifold.test.ts\",\n \"test:pglite\": \"bun test pglite-demo.test.ts\",\n \"test:swe-bench\": \"bun test swe-bench.test.ts\",\n \"test:e2e-cat-app\": \"bun run e2e-cat-app-script.ts\",\n \"gen-git-evals\": \"bun run git-evals/gen-evals.ts\",\n \"run-single-eval\": \"bun run git-evals/run-single-eval.ts --eval-file git-evals/eval-manifold.json --commit-sha ebabf7796a92ce8ece8e2452b0f3f896a513ba0e\",\n \"run-git-evals\": \"bun run git-evals/run-git-evals.ts\",\n \"run-eval-set\": \"bun run git-evals/run-eval-set.ts\",\n \"setup-codebuff-repo\": \"bun run setup-codebuff-repo.ts\"\n },\n \"sideEffects\": false,\n \"engines\": {\n \"bun\": \">=1.2.11\"\n },\n \"dependencies\": {\n \"@codebuff/backend\": \"workspace:*\",\n \"@codebuff/code-map\": \"workspace:*\",\n \"@codebuff/common\": \"workspace:*\",\n \"@codebuff/internal\": \"workspace:*\",\n \"@codebuff/npm-app\": \"workspace:*\",\n \"@oclif/core\": \"^4.4.0\",\n \"@oclif/parser\": \"^3.8.17\",\n \"async\": \"^3.2.6\",\n \"lodash\": \"^4.17.21\",\n \"p-limit\": \"^6.2.0\",\n \"zod\": \"3.25.67\"\n },\n \"devDependencies\": {\n \"@types/async\": \"^3.2.24\"\n }\n}\n", - "referencedBy": {} - }, - { - "path": "npm-app/package.json", - "content": "{\n \"name\": \"@codebuff/npm-app\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"description\": \"cli for codebuff\",\n \"license\": \"MIT\",\n \"main\": \"dist/index.js\",\n \"types\": \"dist/index.d.ts\",\n \"type\": \"module\",\n \"exports\": {\n \"./*\": {\n \"bun\": \"./src/*.ts\",\n \"import\": \"./src/*.ts\",\n \"types\": \"./src/*.ts\",\n \"default\": \"./src/*.ts\"\n }\n },\n \"bin\": {\n \"codebuff\": \"dist/index.js\"\n },\n \"scripts\": {\n \"typecheck\": \"tsc --noEmit -p .\",\n \"build\": \"bun run scripts/build-binary.js codebuff $(node -p \\\"require('./release/package.json').version\\\")\",\n \"release\": \"bun run scripts/release.js\",\n \"start-bin\": \"bun run build && ./bin/codebuff\",\n \"start\": \"bun run src/index.ts --cwd ..\",\n \"format\": \"prettier --write \\\"**/*.{ts,tsx,json,md}\\\"\",\n \"postinstall\": \"bun scripts/patch-web-tree-sitter.ts\"\n },\n \"files\": [\n \"README.md\"\n ],\n \"engines\": {\n \"bun\": \">=1.2.11\"\n },\n \"dependencies\": {\n \"@codebuff/code-map\": \"workspace:*\",\n \"@codebuff/common\": \"workspace:*\",\n \"@types/diff\": \"5.2.1\",\n \"@types/micromatch\": \"^4.0.9\",\n \"@vscode/ripgrep\": \"1.15.9\",\n \"ai\": \"4.3.16\",\n \"axios\": \"1.7.4\",\n \"commander\": \"^13.1.0\",\n \"diff\": \"5.2.0\",\n \"git-url-parse\": \"^16.1.0\",\n \"ignore\": \"7.0.3\",\n \"isomorphic-git\": \"^1.29.0\",\n \"lodash\": \"*\",\n \"micromatch\": \"^4.0.8\",\n \"nanoid\": \"5.0.7\",\n \"onetime\": \"5.1.2\",\n \"picocolors\": \"1.1.0\",\n \"pino\": \"9.4.0\",\n \"posthog-node\": \"4.17.2\",\n \"puppeteer-core\": \"^24.2.0\",\n \"string-width\": \"^7.2.0\",\n \"systeminformation\": \"5.23.4\",\n \"ts-pattern\": \"5.3.1\",\n \"wrap-ansi\": \"^9.0.0\",\n \"ws\": \"8.18.0\",\n \"zod\": \"3.25.67\"\n }\n}\n", - "referencedBy": {} - }, - { - "path": "packages/bigquery/package.json", - "content": "{\n \"name\": \"@codebuff/bigquery\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"license\": \"UNLICENSED\",\n \"type\": \"module\",\n \"exports\": {\n \".\": {\n \"bun\": \"./src/index.ts\",\n \"import\": \"./src/index.ts\",\n \"types\": \"./src/index.ts\",\n \"default\": \"./src/index.ts\"\n },\n \"./*\": {\n \"bun\": \"./src/*.ts\",\n \"import\": \"./src/*.ts\",\n \"types\": \"./src/*.ts\",\n \"default\": \"./src/*.ts\"\n }\n },\n \"scripts\": {\n \"typecheck\": \"tsc --noEmit -p .\",\n \"test\": \"bun test\"\n },\n \"sideEffects\": false,\n \"engines\": {\n \"bun\": \">=1.2.11\"\n },\n \"dependencies\": {\n \"@google-cloud/bigquery\": \"^7.9.4\",\n \"@codebuff/common\": \"workspace:*\"\n },\n \"devDependencies\": {\n \"@types/node\": \"22\",\n \"@types/bun\": \"^1.2.11\"\n }\n}\n", - "referencedBy": {} - }, - { - "path": "packages/billing/package.json", - "content": "{\n \"name\": \"@codebuff/billing\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"license\": \"UNLICENSED\",\n \"type\": \"module\",\n \"exports\": {\n \".\": {\n \"bun\": \"./src/index.ts\",\n \"import\": \"./src/index.ts\",\n \"types\": \"./src/index.ts\",\n \"default\": \"./src/index.ts\"\n },\n \"./*\": {\n \"bun\": \"./src/*.ts\",\n \"import\": \"./src/*.ts\",\n \"types\": \"./src/*.ts\",\n \"default\": \"./src/*.ts\"\n }\n },\n \"scripts\": {\n \"typecheck\": \"tsc --noEmit -p .\",\n \"test\": \"bun test\"\n },\n \"sideEffects\": false,\n \"engines\": {\n \"bun\": \">=1.2.11\"\n },\n \"dependencies\": {\n \"@codebuff/common\": \"workspace:*\"\n },\n \"devDependencies\": {\n \"@types/node\": \"22\",\n \"@types/bun\": \"^1.2.11\"\n }\n}\n", - "referencedBy": {} - }, - { - "path": "packages/build-tools/package.json", - "content": "{\n \"name\": \"@codebuff/build-tools\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"main\": \"./dist/executors/infisical-run/executor.js\",\n \"executors\": \"./executors.json\",\n \"scripts\": {\n \"build\": \"tsc\",\n \"clean\": \"rm -rf dist && (rm tsconfig.tsbuildinfo || true)\"\n },\n \"devDependencies\": {\n \"@nx/devkit\": \"^20.8.1\",\n \"typescript\": \"5.5.4\"\n }\n}\n", - "referencedBy": {} - }, - { - "path": "packages/code-map/package.json", - "content": "{\n \"name\": \"@codebuff/code-map\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"license\": \"UNLICENSED\",\n \"type\": \"module\",\n \"exports\": {\n \".\": {\n \"bun\": \"./src/index.ts\",\n \"import\": \"./src/index.ts\",\n \"types\": \"./src/index.ts\",\n \"default\": \"./src/index.ts\"\n },\n \"./*\": {\n \"bun\": \"./src/*.ts\",\n \"import\": \"./src/*.ts\",\n \"types\": \"./src/*.ts\",\n \"default\": \"./src/*.ts\"\n }\n },\n \"scripts\": {\n \"typecheck\": \"tsc --noEmit -p .\",\n \"test\": \"bun test\"\n },\n \"sideEffects\": false,\n \"engines\": {\n \"bun\": \">=1.2.11\"\n },\n \"dependencies\": {\n \"@vscode/tree-sitter-wasm\": \"0.1.4\",\n \"web-tree-sitter\": \"0.25.6\"\n },\n \"devDependencies\": {\n \"@types/node\": \"22\",\n \"@types/bun\": \"^1.2.11\"\n }\n}\n", - "referencedBy": {} - }, - { - "path": "packages/internal/package.json", - "content": "{\n \"name\": \"@codebuff/internal\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"license\": \"UNLICENSED\",\n \"type\": \"module\",\n \"exports\": {\n \".\": {\n \"bun\": \"./src/index.ts\",\n \"import\": \"./src/index.ts\",\n \"types\": \"./src/index.ts\",\n \"default\": \"./src/index.ts\"\n },\n \"./loops\": {\n \"bun\": \"./src/loops/index.ts\",\n \"import\": \"./src/loops/index.ts\",\n \"types\": \"./src/loops/index.ts\",\n \"default\": \"./src/loops/index.ts\"\n },\n \"./openrouter-ai-sdk\": {\n \"bun\": \"./src/openrouter-ai-sdk/index.ts\",\n \"import\": \"./src/openrouter-ai-sdk/index.ts\",\n \"types\": \"./src/openrouter-ai-sdk/index.ts\",\n \"default\": \"./src/openrouter-ai-sdk/index.ts\"\n },\n \"./*\": {\n \"bun\": \"./src/*.ts\",\n \"import\": \"./src/*.ts\",\n \"types\": \"./src/*.ts\",\n \"default\": \"./src/*.ts\"\n }\n },\n \"scripts\": {\n \"typecheck\": \"tsc --noEmit -p .\",\n \"test\": \"bun test\"\n },\n \"sideEffects\": false,\n \"engines\": {\n \"bun\": \">=1.2.11\"\n },\n \"dependencies\": {\n \"@codebuff/common\": \"workspace:*\",\n \"drizzle-orm\": \"*\",\n \"loops\": \"^5.0.1\"\n },\n \"devDependencies\": {\n \"@types/node\": \"22\",\n \"@types/bun\": \"^1.2.11\"\n }\n}\n", - "referencedBy": {} - }, - { - "path": "scripts/package.json", - "content": "{\n \"name\": \"@codebuff/scripts\",\n \"version\": \"1.0.0\",\n \"description\": \"Scripts package for Codebuff\",\n \"private\": true,\n \"license\": \"UNLICENSED\",\n \"type\": \"module\",\n \"exports\": {\n \".\": {\n \"bun\": \"./src/index.ts\",\n \"types\": \"./src/index.ts\"\n }\n },\n \"scripts\": {\n \"typecheck\": \"tsc --noEmit -p .\",\n \"test\": \"bun test\",\n \"debug-log-subset\": \"bun run debug-log-subset.ts\",\n \"typecheck-all\": \"bun run typecheck-all.ts\"\n },\n \"sideEffects\": false,\n \"engines\": {\n \"bun\": \">=1.2.11\"\n },\n \"dependencies\": {\n \"@codebuff/bigquery\": \"workspace:*\",\n \"@codebuff/backend\": \"workspace:*\",\n \"@codebuff/common\": \"workspace:*\",\n \"lodash\": \"^4.17.21\"\n },\n \"devDependencies\": {\n \"@types/bun\": \"^1.2.11\",\n \"@types/lodash\": \"^4.14.195\",\n \"@types/node\": \"22\"\n }\n}\n", - "referencedBy": {} - }, - { - "path": "sdk/package.json", - "content": "{\n \"name\": \"@codebuff/sdk\",\n \"private\": false,\n \"access\": \"public\",\n \"version\": \"0.1.6\",\n \"description\": \"Official SDK for Codebuff — AI coding agent & framework\",\n \"license\": \"MIT\",\n \"type\": \"module\",\n \"main\": \"./dist/sdk/src/index.js\",\n \"types\": \"./dist/sdk/src/index.d.ts\",\n \"exports\": {\n \".\": {\n \"types\": \"./dist/sdk/src/index.d.ts\",\n \"import\": \"./dist/sdk/src/index.js\",\n \"default\": \"./dist/sdk/src/index.js\"\n }\n },\n \"files\": [\n \"dist\",\n \"README.md\",\n \"CHANGELOG.md\"\n ],\n \"scripts\": {\n \"build\": \"bun run copy-types && tsc\",\n \"copy-types\": \"mkdir -p src/types && cp ../common/src/util/types/agent-definition.d.ts src/types/agent-definition.ts && cp ../common/src/util/types/tools.d.ts src/types/tools.ts\",\n \"clean\": \"rm -rf dist\",\n \"prepare-dist\": \"node scripts/publish.js --dry-run\",\n \"publish-sdk\": \"node scripts/publish.js --public\",\n \"publish-dry-run\": \"node scripts/publish.js --dry-run\",\n \"prepublishOnly\": \"bun run clean && bun run build\",\n \"typecheck\": \"tsc --noEmit -p .\",\n \"test\": \"bun test\"\n },\n \"sideEffects\": false,\n \"engines\": {\n \"node\": \">=18.0.0\"\n },\n \"keywords\": [\n \"codebuff\",\n \"ai\",\n \"code-editing\",\n \"assistant\",\n \"sdk\",\n \"typescript\"\n ],\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/codebuff/codebuff.git\",\n \"directory\": \"sdk\"\n },\n \"homepage\": \"https://codebuff.com\",\n \"bugs\": {\n \"url\": \"https://github.com/codebuff/codebuff/issues\"\n },\n \"dependencies\": {\n \"ai\": \"4.3.16\",\n \"zod\": \"^3.23.8\"\n },\n \"devDependencies\": {\n \"@types/node\": \"22\",\n \"@types/bun\": \"^1.2.11\"\n }\n}\n", - "referencedBy": {} - } - ] - } - ], - "parentAgentId": "D-QYfz6Uj58" - }, - { - "type": "text", - "agentId": "D-QYfz6Uj58", - "text": "Here's a concise report on the locations of testing, linting, and typechecking scripts in the codebase:\n\n* **package.json**: Contains top-level scripts for the entire project, including `format`, `typecheck`, `test`, `init-worktree`, `cleanup-worktree`, and `generate-tool-definitions`. These scripts are central to managing the overall development process.\n* **backend/package.json**: Includes `start`, `dev`, `typecheck`, and `test` scripts specifically for the backend.\n* **common/package.json**: Contains scripts for `typecheck`, `test`, `db:generate`, `db:migrate`, and `db:studio`, focusing on common utilities and database management.\n* **evals/package.json**: Includes scripts for `typecheck`, `test`, `test:manifold`, `test:pglite`, `test:swe-bench`, `test:e2e-cat-app`, `gen-git-evals`, `run-single-eval`, `run-git-evals`, `run-eval-set`, and `setup-codebuff-repo`, targeting the evaluation and testing of AI models.\n* **npm-app/package.json**: Contains `typecheck`, `build`, `release`, `start-bin`, `start`, `format`, and `postinstall` scripts specifically for the npm application.\n* **packages/bigquery/package.json**: Includes `typecheck` and `test` scripts for the BigQuery package.\n* **packages/billing/package.json**: Includes `typecheck` and `test` scripts for the billing package.\n* **packages/build-tools/package.json**: Includes `build` and `clean` scripts, mainly for building and cleaning the build tools package.\n* **packages/code-map/package.json**: Includes `typecheck` and `test` scripts for the code map package.\n* **packages/internal/package.json**: Includes `typecheck` and `test` scripts for internal utilities.\n* **scripts/package.json**: Includes `typecheck`, `test`, and other utility scripts like `debug-log-subset` and `typecheck-all`.\n* **sdk/package.json**: Includes `build`, `copy-types`, `clean`, `prepare-dist`, `publish-sdk`, `publish-dry-run`, `prepublishOnly`, `typecheck`, and `test` scripts for the SDK.\n* **web/package.json**: (Not provided in the read\\_files output, but worth noting it exists) would likely contain scripts related to building, testing, and linting the web application.\n" - }, - { - "type": "subagent_finish", - "agentId": "D-QYfz6Uj58", - "agentType": "file-picker", - "displayName": "Fletcher the File Fetcher", - "onlyChild": false, - "parentAgentId": "main-agent", - "prompt": "package.json scripts for testing, linting, typechecking" - }, - { - "type": "tool_result", - "toolCallId": "D-QYc2ZPpX8", - "toolName": "spawn_agents", - "output": [ - { - "type": "json", - "value": [ - { - "agentName": "Fletcher the File Fetcher", - "agentType": "file-picker", - "value": { - "type": "lastMessage", - "value": [ - { - "role": "assistant", - "content": [ - { - "type": "text", - "text": "Here's a concise report on the locations of testing, linting, and typechecking scripts in the codebase:\n\n* **package.json**: Contains top-level scripts for the entire project, including `format`, `typecheck`, `test`, `init-worktree`, `cleanup-worktree`, and `generate-tool-definitions`. These scripts are central to managing the overall development process.\n* **backend/package.json**: Includes `start`, `dev`, `typecheck`, and `test` scripts specifically for the backend.\n* **common/package.json**: Contains scripts for `typecheck`, `test`, `db:generate`, `db:migrate`, and `db:studio`, focusing on common utilities and database management.\n* **evals/package.json**: Includes scripts for `typecheck`, `test`, `test:manifold`, `test:pglite`, `test:swe-bench`, `test:e2e-cat-app`, `gen-git-evals`, `run-single-eval`, `run-git-evals`, `run-eval-set`, and `setup-codebuff-repo`, targeting the evaluation and testing of AI models.\n* **npm-app/package.json**: Contains `typecheck`, `build`, `release`, `start-bin`, `start`, `format`, and `postinstall` scripts specifically for the npm application.\n* **packages/bigquery/package.json**: Includes `typecheck` and `test` scripts for the BigQuery package.\n* **packages/billing/package.json**: Includes `typecheck` and `test` scripts for the billing package.\n* **packages/build-tools/package.json**: Includes `build` and `clean` scripts, mainly for building and cleaning the build tools package.\n* **packages/code-map/package.json**: Includes `typecheck` and `test` scripts for the code map package.\n* **packages/internal/package.json**: Includes `typecheck` and `test` scripts for internal utilities.\n* **scripts/package.json**: Includes `typecheck`, `test`, and other utility scripts like `debug-log-subset` and `typecheck-all`.\n* **sdk/package.json**: Includes `build`, `copy-types`, `clean`, `prepare-dist`, `publish-sdk`, `publish-dry-run`, `prepublishOnly`, `typecheck`, and `test` scripts for the SDK.\n* **web/package.json**: (Not provided in the read\\_files output, but worth noting it exists) would likely contain scripts related to building, testing, and linting the web application.\n" - } - ] - } - ] - } - }, - { - "agentName": "Code Searcher", - "agentType": "code-searcher", - "value": { - "type": "structuredOutput", - "value": { - "results": [ - { - "stdout": ".github/workflows/ci.yml:\n1:# This workflow runs CI checks including building, typechecking, and testing the codebase\n18: runs-on: ubuntu-latest\n51: echo \"NEXT_PUBLIC_CB_ENVIRONMENT=test\" >> $GITHUB_ENV\n80: # Template for test jobs\n81: test:\n90: name: test-${{ matrix.package }}\n91: runs-on: ubuntu-latest\n124: echo \"NEXT_PUBLIC_CB_ENVIRONMENT=test\" >> $GITHUB_ENV\n128: - name: Run ${{ matrix.package }} tests\n133: command: cd ${{ matrix.package }} && find src -name '*.test.ts' ! -name '*.integration.test.ts' | sort | xargs -I {} bun test {}\n140: # Integration tests job\n141: test-integration:\n150: name: test-integration-${{ matrix.package }}\n151: runs-on: ubuntu-latest\n184: echo \"NEXT_PUBLIC_CB_ENVIRONMENT=test\" >> $GITHUB_ENV\n\n.agents/base-max.ts:\n70:- You are not the only one making changes to files. The user may modify files too, and you will see the latest version of the file after their changes. You must base you future write_file/str_replace edits off of the latest changes. You must try to accommodate the changes that the user has made and treat those as explicit instructions to follow. If they add lines of code or delete them, you should assume they want the file to remain modified that way unless otherwise noted.\n108:- **Package Management:** When adding new packages, use the run_terminal_command tool to install the package rather than editing the package.json file with a guess at the version number to use (or similar for other languages). This way, you will be sure to have the latest version of the package. Do not install packages globally unless asked by the user (e.g. Don\\'t run \\`npm install -g \\`). Always try to use the package manager associated with the project (e.g. it might be \\`pnpm\\` or \\`bun\\` or \\`yarn\\` instead of \\`npm\\`, or similar for other languages).\n110:- **Testing:** If you create a unit test, you should run it using \\`run_terminal_command\\` to see if it passes, and fix it if it doesn\\'t.\n149:Check the knowledge files to see if the user has specified a further protocol for what terminal commands should be run to verify edits. For example, a \\`knowledge.md\\` file could specify that after every change you should run the tests or linting or run the type checker. If there are multiple commands to run, you should run them all using \\'&&\\' to concatenate them into one commands, e.g. \\`npm run lint && npm run test\\`.\n310:If the user had knowledge files (or CLAUDE.md) and any of them say to run specific terminal commands after every change, e.g. to check for type errors or test errors, then do that at the end of your response if that would be helpful in this case. No need to run these checks for simple changes.\n\n./npm-app/src/cli-handlers/checkpoint.ts:\n189: const latestCheckpoint = checkpointManager.getLatestCheckpoint()\n190: await latestCheckpoint?.fileStateIdPromise\n198: 'Failed to wait for latest checkpoint file state',\n243: await checkpointManager.getLatestCheckpoint().fileStateIdPromise\n245: // No latest checkpoint available, previous checkpoint is guaranteed to be done.\n\n.github/workflows/nightly-evals.yml:\n11: runs-on: ubuntu-latest\n45: echo \"NEXT_PUBLIC_CB_ENVIRONMENT=test\" >> $GITHUB_ENV\n\n./npm-app/src/cli-handlers/agent-creation-chat.ts:\n108: 'Continue adjusting your agent here, or type \"/agents\" to switch agents and test it out.',\n\n.agents/base-experimental.ts:\n70:- You are not the only one making changes to files. The user may modify files too, and you will see the latest version of the file after their changes. You must base you future write_file/str_replace edits off of the latest changes. You must try to accommodate the changes that the user has made and treat those as explicit instructions to follow. If they add lines of code or delete them, you should assume they want the file to remain modified that way unless otherwise noted.\n108:- **Package Management:** When adding new packages, use the run_terminal_command tool to install the package rather than editing the package.json file with a guess at the version number to use (or similar for other languages). This way, you will be sure to have the latest version of the package. Do not install packages globally unless asked by the user (e.g. Don\\'t run \\`npm install -g \\`). Always try to use the package manager associated with the project (e.g. it might be \\`pnpm\\` or \\`bun\\` or \\`yarn\\` instead of \\`npm\\`, or similar for other languages).\n110:- **Testing:** If you create a unit test, you should run it using \\`run_terminal_command\\` to see if it passes, and fix it if it doesn\\'t.\n149:Check the knowledge files to see if the user has specified a further protocol for what terminal commands should be run to verify edits. For example, a \\`knowledge.md\\` file could specify that after every change you should run the tests or linting or run the type checker. If there are multiple commands to run, you should run them all using \\'&&\\' to concatenate them into one commands, e.g. \\`npm run lint && npm run test\\`.\n318:If the user had knowledge files (or CLAUDE.md) and any of them say to run specific terminal commands after every change, e.g. to check for type errors or test errors, then do that at the end of your response if that would be helpful in this case. No need to run these checks for simple changes.\n\n.agents/ask.ts:\n62:- You are not the only one making changes to files. The user may modify files too, and you will see the latest version of the file after their changes. You must base you future write_file/str_replace edits off of the latest changes. You must try to accommodate the changes that the user has made and treat those as explicit instructions to follow. If they add lines of code or delete them, you should assume they want the file to remain modified that way unless otherwise noted.\n123:Check the knowledge files to see if the user has specified a further protocol for what terminal commands should be run to verify edits. For example, a \\`knowledge.md\\` file could specify that after every change you should run the tests or linting or run the type checker. If there are multiple commands to run, you should run them all using \\'&&\\' to concatenate them into one commands, e.g. \\`npm run lint && npm run test\\`.\n\n.github/workflows/npm-app-release-build.yml:\n34: - os: ubuntu-latest\n39: - os: ubuntu-latest\n54: - os: windows-latest\n129: # Only test if we're building for the native architecture\n131: echo \"Skipping test for cross-compiled ARM64 binary\"\n\n./npm-app/src/cli-handlers/subagent-list.ts:\n197: const testLine =\n200: testLine.replace(/\\u001b\\[[0-9;]*m/g, '').length <=\n203: currentLine = testLine\n233: const testLine = `${currentLine} ${word}`\n235: testLine.replace(/\\u001b\\[[0-9;]*m/g, '').length <= maxLineLength\n237: currentLine = testLine\n\n.github/workflows/npm-app-release-staging.yml:\n18: runs-on: ubuntu-latest\n57: # Get latest beta version from npm to check if we need to increment\n58: echo \"Fetching latest beta version from npm...\"\n59: LATEST_BETA=$(npm view codecane@latest version 2>/dev/null || echo \"\")\n65: echo \"Latest beta version: $LATEST_BETA\"\n143: runs-on: ubuntu-latest\n228: \\\"body\\\": \\\"## Codecane v${{ needs.prepare-and-commit-staging.outputs.new_version }} (Staging)\\n\\n**⚠️ This is a staging/beta release for testing purposes.**\\n\\nBinary releases for all supported platforms.\\n\\n### Installation\\n\\`\\`\\`bash\\nnpm install -g codecane\\n\\`\\`\\`\\n\\n### Platform Binaries\\n- \\`codecane-linux-x64.tar.gz\\` - Linux x64\\n- \\`codecane-linux-arm64.tar.gz\\` - Linux ARM64\\n- \\`codecane-darwin-x64.tar.gz\\` - macOS Intel\\n- \\`codecane-darwin-arm64.tar.gz\\` - macOS Apple Silicon\\n- \\`codecane-win32-x64.tar.gz\\` - Windows x64\\\",\n258: runs-on: ubuntu-latest\n\n.github/workflows/evals.yml:\n9: runs-on: ubuntu-latest\n61: echo \"NEXT_PUBLIC_CB_ENVIRONMENT=test\" >> $GITHUB_ENV\n\n.github/workflows/npm-app-release-prod.yml:\n22: runs-on: ubuntu-latest\n105: runs-on: ubuntu-latest\n150: runs-on: ubuntu-latest\n\n./npm-app/src/menu.ts:\n400:${hasKnowledgeMd && !hasCodebuffJson ? `\\n${yellow(`${codebuffConfigFile} runs deployment scripts for you to test your code and runs configured checks for you by running your dev server.`)}` : ''}\n402:${!hasKnowledgeMd && !hasCodebuffJson ? `\\n${yellow('knowledge.md helps Codebuff understand your project structure and codebase better for better results.')}\\n${yellow(`${codebuffConfigFile} runs deployment scripts for you to test your code and runs configured checks for you by running your dev server.`)}` : ''}`\n422:${cyan(' • \"Create a unit test for the auth module\"')}\n\n.github/knowledge.md:\n8:2. **Test Job**: Runs tests for npm-app, backend, and common packages in parallel using matrix strategy\n27:Each test job:\n29:- Runs unit tests only (excludes integration tests)\n31:- Sets `CODEBUFF_GITHUB_ACTIONS=true` and `NEXT_PUBLIC_CB_ENVIRONMENT=test`\n37:- Test environment flags are set for proper test execution\n42:- Build job must complete before test jobs start (`needs: build`)\n87: bun act -j test-backend\n135:2. If tests fail with environment issues:\n153:6. Use the retry mechanism for flaky tests\n\n./npm-app/src/create-template-project.ts:\n20: if (!/^[a-zA-Z0-9-_]+$/.test(template)) {\n36: if (!/^[a-zA-Z0-9-_]+$/.test(projectName)) {\n\n./npm-app/src/client.ts:\n126: console.log('Make sure you are on the latest version of Codebuff!')\n1121: )}: Runs tests, linting, and type checking when you modify files\\n• ${bold(\n1373: checkpointAddendum = ` or \"checkpoint ${checkpointManager.getLatestCheckpoint().id}\" to revert`\n1375: // No latest checkpoint, don't show addendum\n1382: 'No latest checkpoint for addendum',\n\n.agents/base-lite.ts:\n70:- You are not the only one making changes to files. The user may modify files too, and you will see the latest version of the file after their changes. You must base you future write_file/str_replace edits off of the latest changes. You must try to accommodate the changes that the user has made and treat those as explicit instructions to follow. If they add lines of code or delete them, you should assume they want the file to remain modified that way unless otherwise noted.\n108:- **Package Management:** When adding new packages, use the run_terminal_command tool to install the package rather than editing the package.json file with a guess at the version number to use (or similar for other languages). This way, you will be sure to have the latest version of the package. Do not install packages globally unless asked by the user (e.g. Don\\'t run \\`npm install -g \\`). Always try to use the package manager associated with the project (e.g. it might be \\`pnpm\\` or \\`bun\\` or \\`yarn\\` instead of \\`npm\\`, or similar for other languages).\n110:- **Testing:** If you create a unit test, you should run it using \\`run_terminal_command\\` to see if it passes, and fix it if it doesn\\'t.\n149:Check the knowledge files to see if the user has specified a further protocol for what terminal commands should be run to verify edits. For example, a \\`knowledge.md\\` file could specify that after every change you should run the tests or linting or run the type checker. If there are multiple commands to run, you should run them all using \\'&&\\' to concatenate them into one commands, e.g. \\`npm run lint && npm run test\\`.\n312:If the user had knowledge files (or CLAUDE.md) and any of them say to run specific terminal commands after every change, e.g. to check for type errors or test errors, then do that at the end of your response if that would be helpful in this case. No need to run these checks for simple changes.\n\n.agents/claude4-gemini-thinking.ts:\n65:- You are not the only one making changes to files. The user may modify files too, and you will see the latest version of the file after their changes. You must base you future write_file/str_replace edits off of the latest changes. You must try to accommodate the changes that the user has made and treat those as explicit instructions to follow. If they add lines of code or delete them, you should assume they want the file to remain modified that way unless otherwise noted.\n103:- **Package Management:** When adding new packages, use the run_terminal_command tool to install the package rather than editing the package.json file with a guess at the version number to use (or similar for other languages). This way, you will be sure to have the latest version of the package. Do not install packages globally unless asked by the user (e.g. Don\\'t run \\`npm install -g \\`). Always try to use the package manager associated with the project (e.g. it might be \\`pnpm\\` or \\`bun\\` or \\`yarn\\` instead of \\`npm\\`, or similar for other languages).\n105:- **Testing:** If you create a unit test, you should run it using \\`run_terminal_command\\` to see if it passes, and fix it if it doesn\\'t.\n144:Check the knowledge files to see if the user has specified a further protocol for what terminal commands should be run to verify edits. For example, a \\`knowledge.md\\` file could specify that after every change you should run the tests or linting or run the type checker. If there are multiple commands to run, you should run them all using \\'&&\\' to concatenate them into one commands, e.g. \\`npm run lint && npm run test\\`.\n305:If the user had knowledge files (or CLAUDE.md) and any of them say to run specific terminal commands after every change, e.g. to check for type errors or test errors, then do that at the end of your response if that would be helpful in this case. No need to run these checks for simple changes.\n\n.agents/reviewer.ts:\n39:4. Always run hooks for TypeScript/JavaScript changes, test file changes, or when the changes could affect compilation/tests\n\n./npm-app/src/__tests__/display.test.ts:\n1:import { describe, expect, it } from 'bun:test'\n\n.agents/types/tools.d.ts:\n56: /** Optional ripgrep flags to customize the search (e.g., \"-i\" for case-insensitive, \"-t ts\" for TypeScript files only, \"-A 3\" for 3 lines after match, \"-B 2\" for 2 lines before match, \"--type-not test\" to exclude test files). */\n\n.agents/base.ts:\n70:- You are not the only one making changes to files. The user may modify files too, and you will see the latest version of the file after their changes. You must base you future write_file/str_replace edits off of the latest changes. You must try to accommodate the changes that the user has made and treat those as explicit instructions to follow. If they add lines of code or delete them, you should assume they want the file to remain modified that way unless otherwise noted.\n108:- **Package Management:** When adding new packages, use the run_terminal_command tool to install the package rather than editing the package.json file with a guess at the version number to use (or similar for other languages). This way, you will be sure to have the latest version of the package. Do not install packages globally unless asked by the user (e.g. Don\\'t run \\`npm install -g \\`). Always try to use the package manager associated with the project (e.g. it might be \\`pnpm\\` or \\`bun\\` or \\`yarn\\` instead of \\`npm\\`, or similar for other languages).\n110:- **Testing:** If you create a unit test, you should run it using \\`run_terminal_command\\` to see if it passes, and fix it if it doesn\\'t.\n149:Check the knowledge files to see if the user has specified a further protocol for what terminal commands should be run to verify edits. For example, a \\`knowledge.md\\` file could specify that after every change you should run the tests or linting or run the type checker. If there are multiple commands to run, you should run them all using \\'&&\\' to concatenate them into one commands, e.g. \\`npm run lint && npm run test\\`.\n310:If the user had knowledge files (or CLAUDE.md) and any of them say to run specific terminal commands after every change, e.g. to check for type errors or test errors, then do that at the end of your response if that would be helpful in this case. No need to run these checks for simple changes.\n\n./backend/src/live-user-inputs.ts:\n88:// For testing purposes - reset all state\n\n./backend/src/__tests__/live-user-inputs.test.ts:\n1:import { describe, it, expect, beforeEach, afterEach } from 'bun:test'\n15: // Clear any existing state before each test\n20: // Clean up any state after each test\n95: // For unit testing, we'll test the function directly\n105: // For unit testing, we'll test that endUserInput doesn't remove the input\n\n./backend/src/llm-apis/message-cost-tracker.ts:\n245: 'Skipping Stripe sync (no user or test user).',\n591: `Credits used by test user (${creditsUsed})`,\n\n./backend/src/__tests__/loop-agent-steps.test.ts:\n6:} from '@codebuff/common/testing/mock-modules'\n18:} from 'bun:test'\n22:import { mockFileContext, MockWebSocket } from './test-utils'\n66: // Mock live user inputs - will be overridden in individual tests\n68: checkLiveUserInput: () => false, // Default to false, override in tests\n136: processedRepoId: 'test-repo-id',\n\n[Output size limit reached.]", - "message": "Stopped early after 110 match(es)." - }, - { - "stdout": "./backend/src/templates/agents/planner.ts:\n1:import { AGENT_PERSONAS } from '@codebuff/common/constants/agents'\n12: displayName: AGENT_PERSONAS.planner.displayName,\n13: spawnPurposePrompt: AGENT_PERSONAS.planner.purpose,\n\n./backend/src/templates/agents/superagent.ts:\n1:import { AGENT_PERSONAS } from '@codebuff/common/constants/agents'\n15: displayName: AGENT_PERSONAS.superagent.displayName,\n16: spawnPurposePrompt: AGENT_PERSONAS.superagent.purpose,\n\n./backend/src/templates/agents/ask.ts:\n1:import { AGENT_PERSONAS } from '@codebuff/common/constants/agents'\n17: displayName: AGENT_PERSONAS.ask.displayName,\n\n./backend/src/templates/agents/thinking-base.ts:\n1:import { AGENT_PERSONAS } from '@codebuff/common/constants/agents'\n19: displayName: AGENT_PERSONAS.base_lite.displayName,\n20: spawnPurposePrompt: AGENT_PERSONAS.base_lite.purpose,\n\n./backend/src/templates/agents/reviewer.ts:\n1:import { AGENT_PERSONAS } from '@codebuff/common/constants/agents'\n12: displayName: AGENT_PERSONAS.reviewer.displayName,\n13: spawnPurposePrompt: AGENT_PERSONAS.reviewer.purpose,\n\n./backend/src/templates/agents/thinker.ts:\n1:import { AGENT_PERSONAS } from '@codebuff/common/constants/agents'\n12: displayName: AGENT_PERSONAS.thinker.displayName,\n13: spawnPurposePrompt: AGENT_PERSONAS.thinker.purpose,\n\n./backend/src/templates/agents/archive/dry-run.ts:\n1:import { AGENT_PERSONAS } from '@codebuff/common/constants/agents'\n11: displayName: AGENT_PERSONAS.dry_run.displayName,\n12: spawnPurposePrompt: AGENT_PERSONAS.dry_run.purpose,\n\n./backend/src/templates/agents/researcher.ts:\n1:import { AGENT_PERSONAS } from '@codebuff/common/constants/agents'\n12: displayName: AGENT_PERSONAS.researcher.displayName,\n13: spawnPurposePrompt: AGENT_PERSONAS.researcher.purpose,\n\n./backend/src/templates/agents/base.ts:\n1:import { AGENT_PERSONAS } from '@codebuff/common/constants/agents'\n19: displayName: AGENT_PERSONAS.base.displayName,\n20: spawnPurposePrompt: AGENT_PERSONAS.base.purpose,\n\n./backend/src/templates/agents/file-picker.ts:\n1:import { AGENT_PERSONAS } from '@codebuff/common/constants/agents'\n11: displayName: AGENT_PERSONAS.file_picker.displayName,\n12: spawnPurposePrompt: AGENT_PERSONAS.file_picker.purpose,\n\n./common/src/constants/agents.ts:\n4:export const AGENT_PERSONAS = {\n90:// Agent IDs list from AGENT_PERSONAS keys\n92: AGENT_PERSONAS,\n93:) as (keyof typeof AGENT_PERSONAS)[]\n100: Object.entries(AGENT_PERSONAS).map(([agentType, persona]) => [\n104:) as Record\n107: (typeof AGENT_PERSONAS)[keyof typeof AGENT_PERSONAS]['displayName']\n112: Object.values(AGENT_PERSONAS)\n\n./common/src/util/agent-name-resolver.ts:\n1:import { AGENT_PERSONAS } from '../constants/agents'\n14: return Object.entries(AGENT_PERSONAS)", - "message": "Exit code: 0" - } - ] - } - } - } - ] - } - ] - }, - { - "type": "tool_call", - "toolCallId": "b1bb925b-9e8a-4bc1-82ae-59241e1a7ae2", - "toolName": "spawn_agent_inline", - "input": { - "agent_type": "context-pruner", - "params": {} - }, - "agentId": "main-agent", - "includeToolCall": false - }, - { - "type": "tool_result", - "toolCallId": "b1bb925b-9e8a-4bc1-82ae-59241e1a7ae2", - "toolName": "spawn_agent_inline", - "output": [ - { - "type": "json", - "value": { - "message": "Agent spawned." - } - } - ] - }, - { - "type": "tool_call", - "toolCallId": "D-R04gDrkuM", - "toolName": "spawn_agents", - "input": { - "agents": [ - { - "agent_type": "editor-gpt-5" - } - ] - }, - "agentId": "main-agent", - "includeToolCall": true - }, - { - "type": "subagent_start", - "agentId": "D-R1CTaJRmk", - "agentType": "editor-gpt-5", - "displayName": "Code Editor", - "onlyChild": true, - "parentAgentId": "main-agent", - "prompt": "" - }, - { - "type": "tool_call", - "toolCallId": "D-d15YQvrg4", - "toolName": "write_file", - "input": { - "path": "backend/src/templates/agents/agent-builder.ts", - "instructions": "Update agent builder to copy diff-reviewer examples to .agents/examples and a new your-custom-agent starter template to .agents root; remove spawnableAgents; fix example gathering paths and prompt text.", - "content": "import * as fs from 'fs'\nimport * as path from 'path'\n\nimport {\n AGENT_TEMPLATES_DIR,\n openrouterModels,\n AGENT_DEFINITION_FILE,\n} from '@codebuff/common/constants'\nimport { AgentTemplateTypes } from '@codebuff/common/types/session-state'\nimport z from 'zod/v4'\n\nimport type { AgentTemplate } from '../types'\nimport type { Model } from '@codebuff/common/constants'\nimport type { ToolName } from '@codebuff/common/tools/constants'\n\nconst COMMON_UTIL_PATH = '../../../../common/src/util'\nconst TEMPLATE_RELATIVE_PATH =\n `${COMMON_UTIL_PATH}/types/${AGENT_DEFINITION_FILE}` as const\n// Import to validate path exists at compile time\nimport(TEMPLATE_RELATIVE_PATH)\n\nconst TEMPLATE_PATH = path.join(__dirname, TEMPLATE_RELATIVE_PATH)\nconst DEFAULT_MODEL = openrouterModels.openrouter_claude_sonnet_4\nconst TYPES_DIR = path.join(AGENT_TEMPLATES_DIR, 'types')\nconst EXAMPLES_DIR = path.join(AGENT_TEMPLATES_DIR, 'examples')\nconst TEMPLATE_TYPES_PATH = path.join(TYPES_DIR, AGENT_DEFINITION_FILE)\nconst TOOL_DEFINITIONS_FILE = 'tools.d.ts'\nconst TOOL_DEFINITIONS_PATH = path.join(TYPES_DIR, TOOL_DEFINITIONS_FILE)\n\nconst EXAMPLES_SOURCE_DIR = path.join(__dirname, `${COMMON_UTIL_PATH}/examples`)\nconst STARTER_TEMPLATE_SOURCE_FILE = 'your-custom-agent.ts.txt'\nconst STARTER_TEMPLATE_DEST_FILE = 'your-custom-agent.ts'\n\nexport const agentBuilder = (\n model: Model,\n allAvailableAgents?: string[],\n): Omit => {\n // Read the AGENT_CONFIG_FILE content dynamically\n // The import above ensures this path exists at compile time\n let agentTemplateContent = ''\n try {\n agentTemplateContent = fs.readFileSync(TEMPLATE_PATH, 'utf8')\n } catch (error) {\n console.warn(`Could not read ${AGENT_DEFINITION_FILE}:`, error)\n agentTemplateContent = '// Agent template types not available'\n }\n\n // Read the tools.d.ts content from common package\n let toolDefinitionsContent = ''\n try {\n const toolsPath = path.join(\n __dirname,\n `${COMMON_UTIL_PATH}/types/tools.d.ts`,\n )\n toolDefinitionsContent = fs.readFileSync(toolsPath, 'utf8')\n } catch (error) {\n console.warn(`Could not read tools.d.ts from common:`, error)\n toolDefinitionsContent = '// Tool definitions not available'\n }\n\n // Read example agent files from common package\n const exampleAgentContents: Record = {}\n let starterTemplateContent = ''\n\n try {\n if (fs.existsSync(EXAMPLES_SOURCE_DIR)) {\n const files = fs.readdirSync(EXAMPLES_SOURCE_DIR)\n\n files\n .filter(\n (file) => file.endsWith('.ts') && file.startsWith('diff-reviewer-'),\n )\n .forEach((filename) => {\n const fullPath = path.join(EXAMPLES_SOURCE_DIR, filename)\n const content = fs.readFileSync(fullPath, 'utf8')\n exampleAgentContents[filename] = content\n })\n\n const starterTemplatePath = path.join(\n EXAMPLES_SOURCE_DIR,\n STARTER_TEMPLATE_SOURCE_FILE,\n )\n if (fs.existsSync(starterTemplatePath)) {\n starterTemplateContent = fs.readFileSync(starterTemplatePath, 'utf8')\n }\n } else {\n console.warn(\n `Example agents directory does not exist: ${EXAMPLES_SOURCE_DIR}`,\n )\n }\n } catch (error) {\n console.warn('Could not read example agents:', error)\n }\n\n return {\n model,\n displayName: 'Bob the Agent Builder',\n spawnPurposePrompt:\n 'Enhanced base agent that can create custom agents and handle all coding tasks with deterministic agent creation behavior',\n inputSchema: {\n prompt: z\n .string()\n .optional()\n .describe(\n 'What agent type you would like to create or edit. Include as many details as possible.',\n ),\n params: z\n .object({\n name: z.string().optional(),\n purpose: z.string().optional(),\n specialty: z.string().optional(),\n model: z.string().optional(),\n })\n .passthrough()\n .optional(),\n },\n outputMode: 'structured_output',\n includeMessageHistory: false,\n toolNames: [\n 'write_file',\n 'str_replace',\n 'run_terminal_command',\n 'read_files',\n 'code_search',\n 'spawn_agents',\n 'add_message',\n 'set_output',\n 'end_turn',\n ] satisfies ToolName[],\n\n systemPrompt: [\n '# Bob the Agent Builder',\n '',\n 'You are an expert agent builder specialized in creating new agent templates for the codebuff system. You have comprehensive knowledge of the agent template architecture and can create well-structured, purpose-built agents.',\n '',\n '## Environment Setup Complete',\n '',\n 'Your environment has been automatically prepared with:',\n '- Agent template type definitions in `.agents/types/agent-definition.d.ts`',\n '- Tool type definitions in `.agents/types/tools.d.ts`',\n '- Diff-reviewer examples in `.agents/examples/` for reference',\n '- A starter custom agent template at `.agents/your-custom-agent.ts`',\n '',\n 'All necessary files are now available in your working directory.',\n '',\n '## Complete Agent Template Type Definitions',\n '',\n 'Here are the complete TypeScript type definitions for creating custom Codebuff agents:',\n '```typescript',\n agentTemplateContent,\n '```',\n '',\n '## Available Tools Type Definitions',\n '',\n 'Here are the complete TypeScript type definitions for all available tools:',\n '',\n '```typescript',\n toolDefinitionsContent,\n '```',\n '',\n '## Agent Template Patterns:',\n '',\n '1. **Base Agent Pattern**: Full-featured agents with comprehensive tool access',\n '2. **Specialized Agent Pattern**: Focused agents with limited tool sets',\n '3. **Thinking Agent Pattern**: Agents that spawn thinker sub-agents',\n '4. **Research Agent Pattern**: Agents that start with web search',\n '',\n '## Best Practices:',\n '',\n '1. **Use as few fields as possible**: Leave out fields that are not needed to reduce complexity',\n '2. **Minimal Tools**: Only include tools the agent actually needs',\n '3. **Clear and Concise Prompts**: Write clear, specific prompts that have no unnecessary words',\n '4. **Consistent Naming**: Follow naming conventions (kebab-case for IDs)',\n '5. **Appropriate Model**: Choose the right model for the task complexity. Default is claude-4-sonnet-20250522 for medium-high complexity tasks, and openai/gpt-5 for all other tasks.',\n '',\n '## Your Task:',\n 'When asked to create an agent template, you should:',\n \"1. Understand the requested agent's purpose and capabilities\",\n \"2. Choose appropriate tools for the agent's function\",\n '3. Write a comprehensive system prompt',\n `4. Create the complete agent template file in ${AGENT_TEMPLATES_DIR}`,\n '5. Ensure the template follows all conventions and best practices',\n '6. Use the AgentDefinition interface for the configuration',\n '7. Start the file with: import type { AgentDefinition } from \"./types/agent-definition.d.ts\"',\n '',\n 'Create agent templates that are focused, efficient, and well-documented. Always import the AgentDefinition type and export a default configuration object.',\n ].join('\\n'),\n instructionsPrompt: `You are helping to create or edit an agent template. The user will describe what kind of agent they want to create or how they want to modify an existing agent.\n\n## Environment Ready\n\nYour environment has been automatically set up with:\n- Type definitions in \\`.agents/types/\\`\n- Diff-reviewer examples in \\`.agents/examples/\\`\n- A starter custom agent template at \\`.agents/your-custom-agent.ts\\`\n\nYou can now proceed directly to agent creation or editing.\n\n## Example Agents Available\n\nThree diff-reviewer examples are available in \\`.agents/examples/\\`. These can serve as examples of well-made agents at different stages of complexity.\n\n**IMPORTANT**: Examine these examples to find connections and patterns that relate to the user's request. Look for:\n- Similar tool combinations\n- Comparable complexity levels\n- Related functionality patterns\n- Appropriate model choices\n- Relevant prompt structures\n\nUse these examples as inspiration and starting points, adapting their patterns to fit the user's specific needs.\n\n## Starter Template Available\n\nA starter custom agent file is available at \\`.agents/your-custom-agent.ts\\`. You can either modify this file directly or use it as a reference for creating a new agent.\n\n## For New Agents\n\nAnalyze their request and create a complete agent template that:\n- Has a clear purpose and appropriate capabilities\n- Leaves out fields that are not needed\n- Uses only the tools it needs\n- Follows naming conventions\n- Is properly structured\n- Draws inspiration from relevant example agents\n\n## For Creating New Agents\n\nThe agent builder is focused on creating new agent templates based on user specifications.\n\nIMPORTANT: Always end your response with the end_turn tool when you have completed the agent creation or editing task.`,\n stepPrompt: '',\n\n handleSteps: function* ({ agentState, prompt, params }) {\n // Step 1: Create directory structure\n yield {\n toolName: 'run_terminal_command',\n args: {\n command: `mkdir -p ${TYPES_DIR} && mkdir -p ${EXAMPLES_DIR}`,\n process_type: 'SYNC',\n timeout_seconds: 10,\n },\n }\n\n // Step 2: Write the AGENT_DEFINITION_FILE with the template content\n yield {\n toolName: 'write_file',\n args: {\n path: TEMPLATE_TYPES_PATH,\n instructions: 'Create agent template type definitions file',\n content: agentTemplateContent,\n },\n }\n\n // Step 3: Write the tool definitions file (copy from existing tools.d.ts)\n yield {\n toolName: 'write_file',\n args: {\n path: TOOL_DEFINITIONS_PATH,\n instructions: 'Create tools type file',\n content: toolDefinitionsContent,\n },\n }\n\n // Step 4: Add message about reading example files and then read them\n yield {\n toolName: 'add_message',\n args: {\n role: 'assistant',\n content:\n \"I'll review the starter template and diff-reviewer examples, then help you create your agent.\",\n },\n }\n\n // Step 5: Copy example agent files to .agents/examples/\n for (const [filename, content] of Object.entries(exampleAgentContents)) {\n if (content) {\n yield {\n toolName: 'write_file',\n args: {\n path: `${EXAMPLES_DIR}/${filename}`,\n instructions: `Copy example agent file ${filename}`,\n content: content,\n },\n }\n }\n }\n\n // Step 6: Copy starter template directly to .agents/\n if (starterTemplateContent) {\n yield {\n toolName: 'write_file',\n args: {\n path: `${AGENT_TEMPLATES_DIR}/${STARTER_TEMPLATE_DEST_FILE}`,\n instructions: `Copy starter custom agent template ${STARTER_TEMPLATE_DEST_FILE}`,\n content: starterTemplateContent,\n },\n }\n }\n\n // Step 7: Complete agent creation process\n yield 'STEP_ALL'\n },\n }\n}\n" - }, - "agentId": "D-R1CTaJRmk", - "parentAgentId": "main-agent", - "includeToolCall": true - }, - { - "type": "tool_result", - "toolCallId": "D-d15YQvrg4", - "toolName": "write_file", - "output": [ - { - "type": "json", - "value": { - "file": "backend/src/templates/agents/agent-builder.ts", - "message": "Updated file", - "unifiedDiff": "@@ -26,8 +26,12 @@\n const TEMPLATE_TYPES_PATH = path.join(TYPES_DIR, AGENT_DEFINITION_FILE)\n const TOOL_DEFINITIONS_FILE = 'tools.d.ts'\n const TOOL_DEFINITIONS_PATH = path.join(TYPES_DIR, TOOL_DEFINITIONS_FILE)\n \n+const EXAMPLES_SOURCE_DIR = path.join(__dirname, `${COMMON_UTIL_PATH}/examples`)\n+const STARTER_TEMPLATE_SOURCE_FILE = 'your-custom-agent.ts.txt'\n+const STARTER_TEMPLATE_DEST_FILE = 'your-custom-agent.ts'\n+\n export const agentBuilder = (\n model: Model,\n allAvailableAgents?: string[],\n ): Omit => {\n@@ -39,8 +43,9 @@\n } catch (error) {\n console.warn(`Could not read ${AGENT_DEFINITION_FILE}:`, error)\n agentTemplateContent = '// Agent template types not available'\n }\n+\n // Read the tools.d.ts content from common package\n let toolDefinitionsContent = ''\n try {\n const toolsPath = path.join(\n@@ -54,35 +59,38 @@\n }\n \n // Read example agent files from common package\n const exampleAgentContents: Record = {}\n+ let starterTemplateContent = ''\n \n try {\n- const exampleAgentsDir = path.join(__dirname, `${COMMON_UTIL_PATH}`)\n- // Check if directory exists before trying to read it\n- if (fs.existsSync(exampleAgentsDir)) {\n- const files = fs.readdirSync(exampleAgentsDir)\n+ if (fs.existsSync(EXAMPLES_SOURCE_DIR)) {\n+ const files = fs.readdirSync(EXAMPLES_SOURCE_DIR)\n \n files\n .filter(\n- (file) => file.endsWith('.ts') && file.startsWith('diff-reviewer'),\n+ (file) => file.endsWith('.ts') && file.startsWith('diff-reviewer-'),\n )\n .forEach((filename) => {\n- try {\n- const fullPath = path.join(exampleAgentsDir, filename)\n- const content = fs.readFileSync(fullPath, 'utf8')\n- exampleAgentContents[filename] = content\n- } catch (error) {\n- console.warn(`Could not read example agent ${filename}:`, error)\n- }\n+ const fullPath = path.join(EXAMPLES_SOURCE_DIR, filename)\n+ const content = fs.readFileSync(fullPath, 'utf8')\n+ exampleAgentContents[filename] = content\n })\n+\n+ const starterTemplatePath = path.join(\n+ EXAMPLES_SOURCE_DIR,\n+ STARTER_TEMPLATE_SOURCE_FILE,\n+ )\n+ if (fs.existsSync(starterTemplatePath)) {\n+ starterTemplateContent = fs.readFileSync(starterTemplatePath, 'utf8')\n+ }\n } else {\n console.warn(\n- `Example agents directory does not exist: ${exampleAgentsDir}`,\n+ `Example agents directory does not exist: ${EXAMPLES_SOURCE_DIR}`,\n )\n }\n } catch (error) {\n- console.warn('Could not read example agents directory:', error)\n+ console.warn('Could not read example agents:', error)\n }\n \n return {\n model,\n@@ -138,9 +146,10 @@\n '',\n 'Your environment has been automatically prepared with:',\n '- Agent template type definitions in `.agents/types/agent-definition.d.ts`',\n '- Tool type definitions in `.agents/types/tools.d.ts`',\n- '- Example agent files copied to `.agents/` directory for reference',\n+ '- Diff-reviewer examples in `.agents/examples/` for reference',\n+ '- A starter custom agent template at `.agents/your-custom-agent.ts`',\n '',\n 'All necessary files are now available in your working directory.',\n '',\n '## Complete Agent Template Type Definitions',\n@@ -190,16 +199,16 @@\n ## Environment Ready\n \n Your environment has been automatically set up with:\n - Type definitions in \\`.agents/types/\\`\n-- Example agent files in \\`.agents/\\` directory\n-- All necessary scaffolding complete\n+- Diff-reviewer examples in \\`.agents/examples/\\`\n+- A starter custom agent template at \\`.agents/your-custom-agent.ts\\`\n \n You can now proceed directly to agent creation or editing.\n \n ## Example Agents Available\n \n-Three example agents are now available in your \\`.agents/\\` directory which are all diff reviewers of increasing complexity. These can serve as examples of well-made agents at different stages of complexity.\n+Three diff-reviewer examples are available in \\`.agents/examples/\\`. These can serve as examples of well-made agents at different stages of complexity.\n \n **IMPORTANT**: Examine these examples to find connections and patterns that relate to the user's request. Look for:\n - Similar tool combinations\n - Comparable complexity levels\n@@ -208,8 +217,12 @@\n - Relevant prompt structures\n \n Use these examples as inspiration and starting points, adapting their patterns to fit the user's specific needs.\n \n+## Starter Template Available\n+\n+A starter custom agent file is available at \\`.agents/your-custom-agent.ts\\`. You can either modify this file directly or use it as a reference for creating a new agent.\n+\n ## For New Agents\n \n Analyze their request and create a complete agent template that:\n - Has a clear purpose and appropriate capabilities\n@@ -262,13 +275,13 @@\n toolName: 'add_message',\n args: {\n role: 'assistant',\n content:\n- \"I'll read the example agent files to understand the patterns and then help you create your agent.\",\n+ \"I'll review the starter template and diff-reviewer examples, then help you create your agent.\",\n },\n }\n \n- // Step 5: Copy example agent files to .agents/ directory\n+ // Step 5: Copy example agent files to .agents/examples/\n for (const [filename, content] of Object.entries(exampleAgentContents)) {\n if (content) {\n yield {\n toolName: 'write_file',\n@@ -280,9 +293,21 @@\n }\n }\n }\n \n- // Step 6: Complete agent creation process\n+ // Step 6: Copy starter template directly to .agents/\n+ if (starterTemplateContent) {\n+ yield {\n+ toolName: 'write_file',\n+ args: {\n+ path: `${AGENT_TEMPLATES_DIR}/${STARTER_TEMPLATE_DEST_FILE}`,\n+ instructions: `Copy starter custom agent template ${STARTER_TEMPLATE_DEST_FILE}`,\n+ content: starterTemplateContent,\n+ },\n+ }\n+ }\n+\n+ // Step 7: Complete agent creation process\n yield 'STEP_ALL'\n },\n }\n }\n" - } - } - ], - "parentAgentId": "D-R1CTaJRmk" - }, - { - "type": "tool_call", - "toolCallId": "9cfbe4a6-f0b9-4f64-93d8-74c25ed6af43", - "toolName": "set_output", - "input": { - "output": { - "message": "", - "toolResults": [ - { - "file": "backend/src/templates/agents/agent-builder.ts", - "message": "Updated file", - "unifiedDiff": "@@ -26,8 +26,12 @@\n const TEMPLATE_TYPES_PATH = path.join(TYPES_DIR, AGENT_DEFINITION_FILE)\n const TOOL_DEFINITIONS_FILE = 'tools.d.ts'\n const TOOL_DEFINITIONS_PATH = path.join(TYPES_DIR, TOOL_DEFINITIONS_FILE)\n \n+const EXAMPLES_SOURCE_DIR = path.join(__dirname, `${COMMON_UTIL_PATH}/examples`)\n+const STARTER_TEMPLATE_SOURCE_FILE = 'your-custom-agent.ts.txt'\n+const STARTER_TEMPLATE_DEST_FILE = 'your-custom-agent.ts'\n+\n export const agentBuilder = (\n model: Model,\n allAvailableAgents?: string[],\n ): Omit => {\n@@ -39,8 +43,9 @@\n } catch (error) {\n console.warn(`Could not read ${AGENT_DEFINITION_FILE}:`, error)\n agentTemplateContent = '// Agent template types not available'\n }\n+\n // Read the tools.d.ts content from common package\n let toolDefinitionsContent = ''\n try {\n const toolsPath = path.join(\n@@ -54,35 +59,38 @@\n }\n \n // Read example agent files from common package\n const exampleAgentContents: Record = {}\n+ let starterTemplateContent = ''\n \n try {\n- const exampleAgentsDir = path.join(__dirname, `${COMMON_UTIL_PATH}`)\n- // Check if directory exists before trying to read it\n- if (fs.existsSync(exampleAgentsDir)) {\n- const files = fs.readdirSync(exampleAgentsDir)\n+ if (fs.existsSync(EXAMPLES_SOURCE_DIR)) {\n+ const files = fs.readdirSync(EXAMPLES_SOURCE_DIR)\n \n files\n .filter(\n- (file) => file.endsWith('.ts') && file.startsWith('diff-reviewer'),\n+ (file) => file.endsWith('.ts') && file.startsWith('diff-reviewer-'),\n )\n .forEach((filename) => {\n- try {\n- const fullPath = path.join(exampleAgentsDir, filename)\n- const content = fs.readFileSync(fullPath, 'utf8')\n- exampleAgentContents[filename] = content\n- } catch (error) {\n- console.warn(`Could not read example agent ${filename}:`, error)\n- }\n+ const fullPath = path.join(EXAMPLES_SOURCE_DIR, filename)\n+ const content = fs.readFileSync(fullPath, 'utf8')\n+ exampleAgentContents[filename] = content\n })\n+\n+ const starterTemplatePath = path.join(\n+ EXAMPLES_SOURCE_DIR,\n+ STARTER_TEMPLATE_SOURCE_FILE,\n+ )\n+ if (fs.existsSync(starterTemplatePath)) {\n+ starterTemplateContent = fs.readFileSync(starterTemplatePath, 'utf8')\n+ }\n } else {\n console.warn(\n- `Example agents directory does not exist: ${exampleAgentsDir}`,\n+ `Example agents directory does not exist: ${EXAMPLES_SOURCE_DIR}`,\n )\n }\n } catch (error) {\n- console.warn('Could not read example agents directory:', error)\n+ console.warn('Could not read example agents:', error)\n }\n \n return {\n model,\n@@ -138,9 +146,10 @@\n '',\n 'Your environment has been automatically prepared with:',\n '- Agent template type definitions in `.agents/types/agent-definition.d.ts`',\n '- Tool type definitions in `.agents/types/tools.d.ts`',\n- '- Example agent files copied to `.agents/` directory for reference',\n+ '- Diff-reviewer examples in `.agents/examples/` for reference',\n+ '- A starter custom agent template at `.agents/your-custom-agent.ts`',\n '',\n 'All necessary files are now available in your working directory.',\n '',\n '## Complete Agent Template Type Definitions',\n@@ -190,16 +199,16 @@\n ## Environment Ready\n \n Your environment has been automatically set up with:\n - Type definitions in \\`.agents/types/\\`\n-- Example agent files in \\`.agents/\\` directory\n-- All necessary scaffolding complete\n+- Diff-reviewer examples in \\`.agents/examples/\\`\n+- A starter custom agent template at \\`.agents/your-custom-agent.ts\\`\n \n You can now proceed directly to agent creation or editing.\n \n ## Example Agents Available\n \n-Three example agents are now available in your \\`.agents/\\` directory which are all diff reviewers of increasing complexity. These can serve as examples of well-made agents at different stages of complexity.\n+Three diff-reviewer examples are available in \\`.agents/examples/\\`. These can serve as examples of well-made agents at different stages of complexity.\n \n **IMPORTANT**: Examine these examples to find connections and patterns that relate to the user's request. Look for:\n - Similar tool combinations\n - Comparable complexity levels\n@@ -208,8 +217,12 @@\n - Relevant prompt structures\n \n Use these examples as inspiration and starting points, adapting their patterns to fit the user's specific needs.\n \n+## Starter Template Available\n+\n+A starter custom agent file is available at \\`.agents/your-custom-agent.ts\\`. You can either modify this file directly or use it as a reference for creating a new agent.\n+\n ## For New Agents\n \n Analyze their request and create a complete agent template that:\n - Has a clear purpose and appropriate capabilities\n@@ -262,13 +275,13 @@\n toolName: 'add_message',\n args: {\n role: 'assistant',\n content:\n- \"I'll read the example agent files to understand the patterns and then help you create your agent.\",\n+ \"I'll review the starter template and diff-reviewer examples, then help you create your agent.\",\n },\n }\n \n- // Step 5: Copy example agent files to .agents/ directory\n+ // Step 5: Copy example agent files to .agents/examples/\n for (const [filename, content] of Object.entries(exampleAgentContents)) {\n if (content) {\n yield {\n toolName: 'write_file',\n@@ -280,9 +293,21 @@\n }\n }\n }\n \n- // Step 6: Complete agent creation process\n+ // Step 6: Copy starter template directly to .agents/\n+ if (starterTemplateContent) {\n+ yield {\n+ toolName: 'write_file',\n+ args: {\n+ path: `${AGENT_TEMPLATES_DIR}/${STARTER_TEMPLATE_DEST_FILE}`,\n+ instructions: `Copy starter custom agent template ${STARTER_TEMPLATE_DEST_FILE}`,\n+ content: starterTemplateContent,\n+ },\n+ }\n+ }\n+\n+ // Step 7: Complete agent creation process\n yield 'STEP_ALL'\n },\n }\n }\n" - } - ] - } - }, - "agentId": "D-R1CTaJRmk", - "parentAgentId": "main-agent", - "includeToolCall": false - }, - { - "type": "tool_result", - "toolCallId": "9cfbe4a6-f0b9-4f64-93d8-74c25ed6af43", - "toolName": "set_output", - "output": [ - { - "type": "json", - "value": { - "message": "Output set" - } - } - ], - "parentAgentId": "D-R1CTaJRmk" - }, - { - "type": "subagent_finish", - "agentId": "D-R1CTaJRmk", - "agentType": "editor-gpt-5", - "displayName": "Code Editor", - "onlyChild": true, - "parentAgentId": "main-agent", - "prompt": "" - }, - { - "type": "tool_result", - "toolCallId": "D-R04gDrkuM", - "toolName": "spawn_agents", - "output": [ - { - "type": "json", - "value": [ - { - "agentName": "Code Editor", - "agentType": "editor-gpt-5", - "value": { - "type": "structuredOutput", - "value": { - "output": { - "message": "", - "toolResults": [ - { - "file": "backend/src/templates/agents/agent-builder.ts", - "message": "Updated file", - "unifiedDiff": "@@ -26,8 +26,12 @@\n const TEMPLATE_TYPES_PATH = path.join(TYPES_DIR, AGENT_DEFINITION_FILE)\n const TOOL_DEFINITIONS_FILE = 'tools.d.ts'\n const TOOL_DEFINITIONS_PATH = path.join(TYPES_DIR, TOOL_DEFINITIONS_FILE)\n \n+const EXAMPLES_SOURCE_DIR = path.join(__dirname, `${COMMON_UTIL_PATH}/examples`)\n+const STARTER_TEMPLATE_SOURCE_FILE = 'your-custom-agent.ts.txt'\n+const STARTER_TEMPLATE_DEST_FILE = 'your-custom-agent.ts'\n+\n export const agentBuilder = (\n model: Model,\n allAvailableAgents?: string[],\n ): Omit => {\n@@ -39,8 +43,9 @@\n } catch (error) {\n console.warn(`Could not read ${AGENT_DEFINITION_FILE}:`, error)\n agentTemplateContent = '// Agent template types not available'\n }\n+\n // Read the tools.d.ts content from common package\n let toolDefinitionsContent = ''\n try {\n const toolsPath = path.join(\n@@ -54,35 +59,38 @@\n }\n \n // Read example agent files from common package\n const exampleAgentContents: Record = {}\n+ let starterTemplateContent = ''\n \n try {\n- const exampleAgentsDir = path.join(__dirname, `${COMMON_UTIL_PATH}`)\n- // Check if directory exists before trying to read it\n- if (fs.existsSync(exampleAgentsDir)) {\n- const files = fs.readdirSync(exampleAgentsDir)\n+ if (fs.existsSync(EXAMPLES_SOURCE_DIR)) {\n+ const files = fs.readdirSync(EXAMPLES_SOURCE_DIR)\n \n files\n .filter(\n- (file) => file.endsWith('.ts') && file.startsWith('diff-reviewer'),\n+ (file) => file.endsWith('.ts') && file.startsWith('diff-reviewer-'),\n )\n .forEach((filename) => {\n- try {\n- const fullPath = path.join(exampleAgentsDir, filename)\n- const content = fs.readFileSync(fullPath, 'utf8')\n- exampleAgentContents[filename] = content\n- } catch (error) {\n- console.warn(`Could not read example agent ${filename}:`, error)\n- }\n+ const fullPath = path.join(EXAMPLES_SOURCE_DIR, filename)\n+ const content = fs.readFileSync(fullPath, 'utf8')\n+ exampleAgentContents[filename] = content\n })\n+\n+ const starterTemplatePath = path.join(\n+ EXAMPLES_SOURCE_DIR,\n+ STARTER_TEMPLATE_SOURCE_FILE,\n+ )\n+ if (fs.existsSync(starterTemplatePath)) {\n+ starterTemplateContent = fs.readFileSync(starterTemplatePath, 'utf8')\n+ }\n } else {\n console.warn(\n- `Example agents directory does not exist: ${exampleAgentsDir}`,\n+ `Example agents directory does not exist: ${EXAMPLES_SOURCE_DIR}`,\n )\n }\n } catch (error) {\n- console.warn('Could not read example agents directory:', error)\n+ console.warn('Could not read example agents:', error)\n }\n \n return {\n model,\n@@ -138,9 +146,10 @@\n '',\n 'Your environment has been automatically prepared with:',\n '- Agent template type definitions in `.agents/types/agent-definition.d.ts`',\n '- Tool type definitions in `.agents/types/tools.d.ts`',\n- '- Example agent files copied to `.agents/` directory for reference',\n+ '- Diff-reviewer examples in `.agents/examples/` for reference',\n+ '- A starter custom agent template at `.agents/your-custom-agent.ts`',\n '',\n 'All necessary files are now available in your working directory.',\n '',\n '## Complete Agent Template Type Definitions',\n@@ -190,16 +199,16 @@\n ## Environment Ready\n \n Your environment has been automatically set up with:\n - Type definitions in \\`.agents/types/\\`\n-- Example agent files in \\`.agents/\\` directory\n-- All necessary scaffolding complete\n+- Diff-reviewer examples in \\`.agents/examples/\\`\n+- A starter custom agent template at \\`.agents/your-custom-agent.ts\\`\n \n You can now proceed directly to agent creation or editing.\n \n ## Example Agents Available\n \n-Three example agents are now available in your \\`.agents/\\` directory which are all diff reviewers of increasing complexity. These can serve as examples of well-made agents at different stages of complexity.\n+Three diff-reviewer examples are available in \\`.agents/examples/\\`. These can serve as examples of well-made agents at different stages of complexity.\n \n **IMPORTANT**: Examine these examples to find connections and patterns that relate to the user's request. Look for:\n - Similar tool combinations\n - Comparable complexity levels\n@@ -208,8 +217,12 @@\n - Relevant prompt structures\n \n Use these examples as inspiration and starting points, adapting their patterns to fit the user's specific needs.\n \n+## Starter Template Available\n+\n+A starter custom agent file is available at \\`.agents/your-custom-agent.ts\\`. You can either modify this file directly or use it as a reference for creating a new agent.\n+\n ## For New Agents\n \n Analyze their request and create a complete agent template that:\n - Has a clear purpose and appropriate capabilities\n@@ -262,13 +275,13 @@\n toolName: 'add_message',\n args: {\n role: 'assistant',\n content:\n- \"I'll read the example agent files to understand the patterns and then help you create your agent.\",\n+ \"I'll review the starter template and diff-reviewer examples, then help you create your agent.\",\n },\n }\n \n- // Step 5: Copy example agent files to .agents/ directory\n+ // Step 5: Copy example agent files to .agents/examples/\n for (const [filename, content] of Object.entries(exampleAgentContents)) {\n if (content) {\n yield {\n toolName: 'write_file',\n@@ -280,9 +293,21 @@\n }\n }\n }\n \n- // Step 6: Complete agent creation process\n+ // Step 6: Copy starter template directly to .agents/\n+ if (starterTemplateContent) {\n+ yield {\n+ toolName: 'write_file',\n+ args: {\n+ path: `${AGENT_TEMPLATES_DIR}/${STARTER_TEMPLATE_DEST_FILE}`,\n+ instructions: `Copy starter custom agent template ${STARTER_TEMPLATE_DEST_FILE}`,\n+ content: starterTemplateContent,\n+ },\n+ }\n+ }\n+\n+ // Step 7: Complete agent creation process\n yield 'STEP_ALL'\n },\n }\n }\n" - } - ] - } - } - } - } - ] - } - ] - }, - { - "type": "tool_call", - "toolCallId": "55caccf4-2925-4acb-8edc-bddc857a35d4", - "toolName": "spawn_agent_inline", - "input": { - "agent_type": "context-pruner", - "params": {} - }, - "agentId": "main-agent", - "includeToolCall": false - }, - { - "type": "tool_result", - "toolCallId": "55caccf4-2925-4acb-8edc-bddc857a35d4", - "toolName": "spawn_agent_inline", - "output": [ - { - "type": "json", - "value": { - "message": "Agent spawned." - } - } - ] - }, - { - "type": "tool_call", - "toolCallId": "D-gXircIAUI", - "toolName": "spawn_agents", - "input": { - "agents": [ - { - "agent_type": "editor-gpt-5" - }, - { - "agent_type": "code-searcher", - "params": { - "searchQueries": [ - { - "pattern": "your-custom-agent|git-committer", - "flags": "-g common/src/util/examples" - }, - { - "pattern": "file-explorer spawn", - "flags": "-g *.ts" - } - ] - } - }, - { - "agent_type": "file-picker", - "prompt": "common/src/util/examples directory contents and related files" - }, - { - "agent_type": "commander-lite", - "prompt": "What are the package.json scripts for typecheck, lint, test, format in the root and relevant packages?", - "params": { - "command": "cat package.json scripts/package.json backend/package.json common/package.json | grep -E 'typecheck|lint|test|format' -A5" - } - } - ] - }, - "agentId": "main-agent", - "includeToolCall": true - }, - { - "type": "subagent_start", - "agentId": "D-gXwZERcWA", - "agentType": "editor-gpt-5", - "displayName": "Code Editor", - "onlyChild": false, - "parentAgentId": "main-agent", - "prompt": "" - }, - { - "type": "subagent_start", - "agentId": "D-gXwl0iLRI", - "agentType": "code-searcher", - "displayName": "Code Searcher", - "onlyChild": false, - "parentAgentId": "main-agent", - "prompt": "", - "params": { - "searchQueries": [ - { - "pattern": "your-custom-agent|git-committer", - "flags": "-g common/src/util/examples" - }, - { - "pattern": "file-explorer spawn", - "flags": "-g *.ts" - } - ] - } - }, - { - "type": "subagent_start", - "agentId": "D-gXwryrlBs", - "agentType": "file-picker", - "displayName": "Fletcher the File Fetcher", - "onlyChild": false, - "parentAgentId": "main-agent", - "prompt": "common/src/util/examples directory contents and related files" - }, - { - "type": "subagent_start", - "agentId": "D-gXwlFcRHk", - "agentType": "commander-lite", - "displayName": "Commander Lite", - "onlyChild": false, - "parentAgentId": "main-agent", - "prompt": "What are the package.json scripts for typecheck, lint, test, format in the root and relevant packages?", - "params": { - "command": "cat package.json scripts/package.json backend/package.json common/package.json | grep -E 'typecheck|lint|test|format' -A5" - } - }, - { - "type": "tool_call", - "toolCallId": "7452f59a-29c2-4003-9d1e-7efd0b614f3b", - "toolName": "spawn_agents", - "input": { - "agents": [ - { - "agent_type": "file-lister", - "prompt": "common/src/util/examples directory contents and related files", - "params": {} - } - ] - }, - "agentId": "D-gXwryrlBs", - "parentAgentId": "main-agent", - "includeToolCall": true - }, - { - "type": "subagent_start", - "agentId": "D-gYCDTSHSY", - "agentType": "file-lister", - "displayName": "Liszt the File Lister", - "onlyChild": true, - "parentAgentId": "D-gXwryrlBs", - "prompt": "common/src/util/examples directory contents and related files", - "params": {} - }, - { - "type": "tool_call", - "toolCallId": "ab5ce625-a859-4743-acee-dc28c1cd81d3", - "toolName": "code_search", - "input": { - "pattern": "your-custom-agent|git-committer", - "flags": "-g common/src/util/examples" - }, - "agentId": "D-gXwl0iLRI", - "parentAgentId": "main-agent", - "includeToolCall": true - }, - { - "type": "tool_call", - "toolCallId": "1ad7baa2-ff78-4573-9ba8-96171d5fdd73", - "toolName": "run_terminal_command", - "input": { - "command": "cat package.json scripts/package.json backend/package.json common/package.json | grep -E 'typecheck|lint|test|format' -A5" - }, - "agentId": "D-gXwlFcRHk", - "parentAgentId": "main-agent", - "includeToolCall": true - }, - { - "type": "tool_call", - "toolCallId": "d7eb4f35-0c13-4d6f-b0e6-a03afc3da49c", - "toolName": "read_subtree", - "input": { - "paths": [], - "maxTokens": 500000 - }, - "agentId": "D-gYCDTSHSY", - "parentAgentId": "D-gXwryrlBs", - "includeToolCall": true - }, - { - "type": "tool_result", - "toolCallId": "d7eb4f35-0c13-4d6f-b0e6-a03afc3da49c", - "toolName": "read_subtree", - "output": [ - { - "type": "json", - "value": [ - { - "path": ".", - "type": "directory", - "printedTree": ".agents/\n examples/\n diff-reviewer-1.ts\n diff-reviewer-2.ts\n diff-reviewer-3.ts\n opensource/\n base.ts\n coder.ts\n file-picker.ts\n researcher.ts\n reviewer.ts\n thinker.ts\n ask.ts\n base-experimental.ts\n base-lite.ts\n base-max.ts\n base.ts\n brainstormer.ts\n changes-reviewer.ts\n charles.ts\n claude4-gemini-thinking.ts\n constants.ts\n file-explorer.ts\n file-picker.ts\n git-committer.ts\n knowledge-keeper.ts\n planner.ts\n researcher.ts\n reviewer.ts\n superagent.ts\n thinker.ts\n.bin/\n bun\n.github/\n workflows/\n ci.yml\n evals.yml\n nightly-evals.yml\n npm-app-release-build.yml\n npm-app-release-prod.yml\n npm-app-release-staging.yml\n .gitignore\n CODEOWNERS\n knowledge.md\n.vscode/\n settings.json\nbackend/\n src/\n __tests__/\n test-data/\n dex-go/\n edit-snippet.go\n expected.go\n original.go\n agent-id-resolution.test.ts\n agent-registry.test.ts\n auto-topup.test.ts\n credit-conversion.test.ts\n fast-rewrite.test.ts\n generate-diffs-prompt.test.ts\n get-custom-file-picker-config.test.ts\n live-user-inputs.test.ts\n loop-agent-steps.test.ts\n main-prompt.integration.test.ts\n main-prompt.test.ts\n process-file-block.test.ts\n process-str-replace.test.ts\n read-docs-tool.test.ts\n request-files-prompt.test.ts\n run-agent-step-tools.test.ts\n run-programmatic-step.test.ts\n sandbox-generator.test.ts\n subagent-streaming.test.ts\n test-utils.ts\n tool-call-schema.test.ts\n usage-calculation.test.ts\n web-search-tool.test.ts\n xml-stream-parser.test.ts\n admin/\n grade-runs.ts\n relabelRuns.ts\n api/\n org.ts\n usage.ts\n context/\n app-context.ts\n find-files/\n check-new-files-necessary.ts\n custom-file-picker-config.ts\n request-files-prompt.ts\n llm-apis/\n __tests__/\n linkup-api.test.ts\n vercel-ai-sdk/\n ai-sdk.ts\n openrouter.ts\n vertex-finetuned.ts\n claude.ts\n context7-api.ts\n gemini-with-fallbacks.ts\n knowledge.md\n linkup-api.ts\n message-cost-tracker.ts\n openai-api.ts\n openrouter.ts\n relace-api.ts\n system-prompt/\n agent-instructions.md\n prompts.ts\n save-agent-request.ts\n search-system-prompt.ts\n truncate-file-tree.ts\n templates/\n agents/\n archive/\n dry-run.ts\n agent-builder.ts\n ask.ts\n base.ts\n file-explorer.ts\n file-picker.ts\n planner.ts\n researcher.ts\n reviewer.ts\n superagent.ts\n thinker.ts\n thinking-base.ts\n agent-list.ts\n agent-registry.ts\n ask-prompts.ts\n base-prompts.ts\n prompts.ts\n README.md\n strings.ts\n types.ts\n tools/\n definitions/\n tool/\n add-message.ts\n add-subgoal.ts\n browser-logs.ts\n code-search.ts\n create-plan.ts\n end-turn.ts\n find-files.ts\n read-docs.ts\n read-files.ts\n run-file-change-hooks.ts\n run-terminal-command.ts\n set-messages.ts\n set-output.ts\n spawn-agent-inline.ts\n spawn-agents-async.ts\n spawn-agents.ts\n str-replace.ts\n think-deeply.ts\n update-subgoal.ts\n web-search.ts\n write-file.ts\n list.ts\n tool-def-type.ts\n handlers/\n tool/\n add-message.ts\n add-subgoal.ts\n browser-logs.ts\n code-search.ts\n create-plan.ts\n end-turn.ts\n find-files.ts\n read-docs.ts\n read-files.ts\n run-file-change-hooks.ts\n run-terminal-command.ts\n set-messages.ts\n set-output.ts\n spawn-agent-inline.ts\n spawn-agents-async.ts\n spawn-agents.ts\n str-replace.ts\n think-deeply.ts\n update-subgoal.ts\n web-search.ts\n write-file.ts\n handler-function-type.ts\n list.ts\n constants.ts\n prompts.ts\n stream-parser.ts\n tool-executor.ts\n util/\n __tests__/\n messages.test.ts\n object.test.ts\n parse-tool-call-xml.test.ts\n simplify-tool-results.test.ts\n split-data.test.ts\n check-auth.ts\n debug.ts\n file-resolver.ts\n logger.ts\n messages.ts\n object.ts\n parse-tool-call-xml.ts\n quickjs-sandbox.ts\n simplify-tool-results.ts\n split-data.ts\n token-counter.ts\n websockets/\n auth.ts\n middleware.ts\n request-context.ts\n server.ts\n switchboard.ts\n websocket-action.ts\n async-agent-manager.ts\n check-terminal-command.ts\n fast-rewrite.ts\n generate-diffs-prompt.ts\n get-documentation-for-query.ts\n get-file-reading-updates.ts\n index.ts\n live-user-inputs.ts\n loop-main-prompt.ts\n main-prompt.ts\n process-file-block.ts\n process-str-replace.ts\n prompt-agent-stream.ts\n run-agent-step.ts\n run-programmatic-step.ts\n xml-stream-parser.ts\n .gitignore\n knowledge.md\n package.json\n README.md\n tsconfig.json\ncommon/\n src/\n __tests__/\n agent-validation.test.ts\n dynamic-agent-template-schema.test.ts\n handlesteps-parsing.test.ts\n api-keys/\n constants.ts\n crypto.ts\n constants/\n agents.ts\n analytics-events.ts\n grant-priorities.ts\n db/\n migrations/\n meta/\n _journal.json\n 0000_snapshot.json\n 0001_snapshot.json\n 0002_snapshot.json\n 0003_snapshot.json\n 0004_snapshot.json\n 0005_snapshot.json\n 0006_snapshot.json\n 0007_snapshot.json\n 0008_snapshot.json\n 0009_snapshot.json\n 0010_snapshot.json\n 0011_snapshot.json\n 0012_snapshot.json\n 0013_snapshot.json\n 0014_snapshot.json\n 0015_snapshot.json\n 0016_snapshot.json\n 0017_snapshot.json\n 0018_snapshot.json\n 0019_snapshot.json\n 0020_snapshot.json\n 0021_snapshot.json\n 0026_snapshot.json\n 0027_snapshot.json\n 0028_snapshot.json\n 0000_overjoyed_thing.sql\n 0001_fuzzy_typhoid_mary.sql\n 0002_sticky_dormammu.sql\n 0003_military_owl.sql\n 0004_neat_pet_avengers.sql\n 0005_minor_the_professor.sql\n 0006_first_quasimodo.sql\n 0007_equal_warlock.sql\n 0008_puzzling_carnage.sql\n 0009_bitter_rumiko_fujikawa.sql\n 0010_overjoyed_red_skull.sql\n 0011_familiar_ezekiel_stane.sql\n 0012_fluffy_naoko.sql\n 0013_famous_risque.sql\n 0014_wakeful_sinister_six.sql\n 0015_stormy_zuras.sql\n 0016_clear_hairball.sql\n 0017_tricky_randall_flagg.sql\n 0018_stale_human_robot.sql\n 0019_amused_nebula.sql\n 0020_young_sleeper.sql\n 0021_tiny_marauders.sql\n 0026_chilly_mockingbird.sql\n 0027_sloppy_quasar.sql\n 0028_lush_johnny_blaze.sql\n docker-compose.yml\n drizzle.config.ts\n index.ts\n schema.knowledge.md\n schema.ts\n transaction.ts\n json-config/\n __tests__/\n __snapshots__/\n stringify-schema.test.ts.snap\n constants.test.ts\n stringify-schema.test.ts\n constants.ts\n default.ts\n stringify-schema.ts\n templates/\n agent-validation.ts\n dynamic-agent-functions.ts\n testing/\n mock-modules.ts\n tools/\n params/\n tool/\n add-message.ts\n add-subgoal.ts\n browser-logs.ts\n code-search.ts\n create-plan.ts\n end-turn.ts\n find-files.ts\n read-docs.ts\n read-files.ts\n run-file-change-hooks.ts\n run-terminal-command.ts\n set-messages.ts\n set-output.ts\n spawn-agent-inline.ts\n spawn-agents-async.ts\n spawn-agents.ts\n str-replace.ts\n think-deeply.ts\n update-subgoal.ts\n web-search.ts\n write-file.ts\n compile-tool-definitions.ts\n constants.ts\n list.ts\n utils.ts\n types/\n __tests__/\n dynamic-agent-template.test.ts\n api/\n agents/\n publish.ts\n agent-template.ts\n dynamic-agent-template.ts\n grant.ts\n message.ts\n organization.ts\n print-mode.ts\n publisher.ts\n referral.ts\n session-state.ts\n usage.ts\n util/\n __tests__/\n messages.test.ts\n partial-json-delta.test.ts\n saxy.test.ts\n string.test.ts\n examples/\n diff-reviewer-1.ts\n diff-reviewer-2.ts\n diff-reviewer-3.ts\n agent-file-utils.ts\n agent-name-normalization.ts\n agent-name-resolver.ts\n agent-template-validation.ts\n array.ts\n changes.ts\n credentials.ts\n currency.ts\n dates.ts\n error.ts\n file.ts\n git.ts\n logger.ts\n lru-cache.ts\n messages.ts\n min-heap.ts\n model-utils.ts\n object.ts\n partial-json-delta.ts\n patch.ts\n promise.ts\n random.ts\n referral.ts\n saxy.ts\n string.knowledge.md\n string.ts\n stripe.ts\n sync-failure.ts\n xml.ts\n zod-schema.ts\n websockets/\n websocket-client.ts\n websocket-schema.ts\n actions.ts\n analytics.ts\n browser-actions.ts\n constants.ts\n project-file-tree.ts\n knowledge.md\n package.json\n tsconfig.json\nevals/\n git-evals/\n email-eval-results.ts\n eval-codebuff.json\n eval-manifold.json\n eval-result-codebuff-mock.json\n gen-evals.ts\n judge-git-eval.ts\n post-eval-analysis.ts\n run-eval-set.ts\n run-git-evals.ts\n run-single-eval-process.ts\n run-single-eval.ts\n setup-test-repo.ts\n types.ts\n .gitignore\n bun.lock\n constants.ts\n e2e-cat-app-script.ts\n knowledge.md\n package.json\n scaffolding.ts\n swe-bench-eval.ts\n swe-bench-ids.ts\n swe-bench.test.ts\n test-repos.json\n test-setup.ts\n tsconfig.json\nnpm-app/\n release/\n index.js\n package.json\n README.md\n release-staging/\n index.js\n package.json\n README.md\n scripts/\n build-binary.js\n generate-github-token.ts\n patch-web-tree-sitter.ts\n release.js\n twitch-plays-codebuff.sh\n src/\n __tests__/\n display.test.ts\n tool-handlers.test.ts\n agents/\n agent-utils.ts\n load-agents.ts\n checkpoints/\n checkpoint-manager.ts\n file-manager.ts\n cli-handlers/\n agent-creation-chat.ts\n agents.ts\n api-key.ts\n checkpoint.ts\n diff.ts\n easter-egg.ts\n inititalization-flow.ts\n mini-chat.ts\n publish.ts\n subagent-list.ts\n subagent.ts\n display/\n overrides.ts\n print-mode.ts\n squash-newlines.ts\n json-config/\n hooks.ts\n parser.ts\n native/\n ripgrep.ts\n terminal/\n background.ts\n run-command.ts\n utils/\n __tests__/\n __snapshots__/\n background-process-manager.test.ts.snap\n frustration-detector.test.ts.snap\n rage-detector.test.ts.snap\n xml-stream-parser.test.ts.snap\n background-process-manager.test.ts\n rage-detector.test.ts\n response-example-4-files.txt\n tool-renderers.test.ts\n xml-stream-parser.test.ts\n agent-validation.ts\n analytics.ts\n detect-shell.ts\n git.ts\n logger.ts\n rage-detector.ts\n spinner.ts\n suppress-console.ts\n system-info.ts\n terminal.ts\n tool-renderers.ts\n with-hang-detection.ts\n xml-stream-parser.ts\n workers/\n checkpoint-worker.ts\n project-context.ts\n background-process-manager.ts\n browser-runner.ts\n chat-storage.ts\n cli-definitions.ts\n cli.ts\n client.ts\n config.ts\n create-template-project.ts\n credentials.ts\n dev-process-manager.ts\n diff-manager.ts\n fingerprint.ts\n index.ts\n menu.ts\n project-files.ts\n rage-detectors.ts\n startup-process-handler.ts\n subagent-storage.ts\n tool-handlers.ts\n types.ts\n web-scraper.ts\n .gitignore\n bunfig.toml\n package.json\n tsconfig.json\npackages/\n bigquery/\n src/\n client.ts\n index.ts\n schema.ts\n knowledge.md\n package.json\n tsconfig.json\n billing/\n src/\n __tests__/\n credit-delegation.test.ts\n extract-owner-repo.test.ts\n org-billing.test.ts\n auto-topup.ts\n balance-calculator.ts\n billing.knowledge.md\n conversion.ts\n credit-delegation.ts\n grant-credits.knowledge.md\n grant-credits.ts\n index.ts\n org-billing.ts\n org-monitoring.ts\n usage-service.ts\n utils.ts\n knowledge.md\n package.json\n project.json\n tsconfig.json\n build-tools/\n executors/\n infisical-run/\n executor.ts\n schema.json\n executors.json\n package.json\n project.json\n tsconfig.json\n code-map/\n __tests__/\n test-langs/\n test.c\n test.cpp\n test.cs\n test.go\n test.java\n test.js\n test.php\n test.py\n test.rb\n test.rs\n test.ts\n languages.test.ts\n parse.test.ts\n src/\n tree-sitter-queries/\n readme.md\n tree-sitter-c_sharp-tags.scm\n tree-sitter-c-tags.scm\n tree-sitter-cpp-tags.scm\n tree-sitter-go-tags.scm\n tree-sitter-java-tags.scm\n tree-sitter-javascript-tags.scm\n tree-sitter-php-tags.scm\n tree-sitter-python-tags.scm\n tree-sitter-ruby-tags.scm\n tree-sitter-rust-tags.scm\n tree-sitter-typescript-tags.scm\n index.ts\n languages.ts\n parse.ts\n package.json\n tsconfig.json\n internal/\n src/\n loops/\n client.ts\n index.ts\n types.ts\n openrouter-ai-sdk/\n internal/\n index.ts\n schemas/\n reasoning-details.ts\n types/\n index.ts\n openrouter-chat-completions-input.ts\n openrouter-chat-settings.ts\n .gitignore\n convert-to-openrouter-chat-messages.test.ts\n convert-to-openrouter-chat-messages.ts\n convert-to-openrouter-completion-prompt.ts\n index.ts\n map-openrouter-chat-logprobs.ts\n map-openrouter-completion-logprobs.ts\n map-openrouter-finish-reason.ts\n openrouter-chat-language-model.test.ts\n openrouter-chat-language-model.ts\n openrouter-completion-language-model.test.ts\n openrouter-completion-language-model.ts\n openrouter-completion-settings.ts\n openrouter-error.ts\n openrouter-facade.ts\n openrouter-provider-options.test.ts\n openrouter-provider.ts\n openrouter-stream-usage-accounting.test.ts\n openrouter-usage-accounting.test.ts\n utils/\n __tests__/\n version-utils.test.ts\n auth.ts\n version-utils.ts\n xml-parser.ts\n env.ts\n index.ts\n knowledge.md\n package.json\n tsconfig.json\npython-app/\n src/\n codebuff/\n __init__.py\n .gitignore\n knowledge.md\n LICENSE\n pyproject.toml\n README.md\nscripts/\n changelog/\n 2025-05-18-version-10283-release-enhanced-assistant-experience-system-stability.mdx\n 2025-05-25-version-10295-enhanced-ai-models-and-user-experience-improvements.mdx\n 2025-06-01-version-10305-release-enhanced-ai-models-new-commands-and-performance-improvements.mdx\n docs.json\n ft-file-selection/\n .gitignore\n collect-tuning-data.ts\n grade-traces.ts\n print-recent-relabels.ts\n print-recent-traces.ts\n README.md\n relabel-for-offline-scoring.ts\n relabel-traces-with-context.ts\n relabel-traces.ts\n .gitignore\n analyze-edit-blocks.ts\n analyze-model-usage.ts\n apply-credit-migration.ts\n calculate-average-spend.ts\n calculate-dau.ts\n calculate-monthly-usage.ts\n calculate-mrr.ts\n calculate-weekly-usage.ts\n cleanup-worktree.sh\n convert-escaped-newlines.ts\n count-edit-file.ts\n debug-log-subset.ts\n dev.sh\n export-user-emails.ts\n generate-ci-env.js\n generate-tool-definitions.ts\n get-changelog.ts\n init-worktree.ts\n package.json\n tsconfig.json\n update-stripe-subscriptions.ts\nsdk/\n scripts/\n publish.js\n src/\n tools/\n change-file.ts\n read-files.ts\n types/\n agent-definition.ts\n tools.ts\n client.ts\n constants.ts\n index.ts\n process-stream.ts\n websocket-client.ts\n .npmignore\n CHANGELOG.md\n package.json\n PUBLISHING.md\n README.md\n tsconfig.json\nweb/\n public/\n codebuff-intro1.webm\n scripts/\n discord/\n index.ts\n register-commands.ts\n src/\n __tests__/\n e2e/\n home.spec.ts\n unit/\n home.spec.tsx\n actions/\n hello-action.ts\n app/\n [sponsee]/\n page.tsx\n admin/\n file-picker/\n page.tsx\n orgs/\n page.tsx\n traces/\n components/\n chat-message.tsx\n client-session-viewer.tsx\n empty-state.tsx\n error-boundary.tsx\n loading-skeletons.tsx\n timeline-chart.module.css\n timeline-chart.tsx\n trace-viewer.tsx\n utils/\n __tests__/\n trace-processing.test.ts\n trace-processing.ts\n page.tsx\n layout.tsx\n affiliates/\n actions.ts\n page.tsx\n agents/\n page.tsx\n api/\n admin/\n orgs/\n [orgId]/\n features/\n [feature]/\n route.ts\n export/\n route.ts\n route.ts\n relabel-for-user/\n route.ts\n traces/\n [clientRequestId]/\n messages/\n route.ts\n timeline/\n route.ts\n client/\n [clientId]/\n sessions/\n route.ts\n admin-auth.ts\n agents/\n [publisherId]/\n [agentId]/\n [version]/\n route.ts\n latest/\n route.ts\n publish/\n route.ts\n validate/\n route.ts\n route.ts\n api-keys/\n route.ts\n auth/\n [...nextauth]/\n auth-options.ts\n route.ts\n cli/\n code/\n route.ts\n logout/\n route.ts\n status/\n route.ts\n feed/\n route.ts\n git-evals/\n visibility/\n route.ts\n route.ts\n healthz/\n route.ts\n invites/\n [token]/\n route.ts\n orgs/\n [orgId]/\n alerts/\n [alertId]/\n dismiss/\n route.ts\n route.ts\n analytics/\n export/\n route.ts\n route.ts\n billing/\n setup/\n route.ts\n status/\n route.ts\n subscription/\n route.ts\n credits/\n route.ts\n invitations/\n [email]/\n resend/\n route.ts\n route.ts\n bulk/\n route.ts\n route.ts\n members/\n [userId]/\n route.ts\n route.ts\n monitoring/\n route.ts\n publishers/\n route.ts\n repos/\n [repoId]/\n route.ts\n route.ts\n settings/\n route.ts\n usage/\n export/\n route.ts\n route.ts\n route.ts\n slug/\n [slug]/\n route.ts\n route.ts\n publishers/\n [id]/\n organization/\n route.ts\n validate/\n route.ts\n route.ts\n referrals/\n [code]/\n route.ts\n helpers.ts\n route.ts\n stripe/\n buy-credits/\n route.ts\n webhook/\n route.ts\n upload/\n avatar/\n route.ts\n user/\n auto-topup/\n route.ts\n profile/\n route.ts\n usage/\n route.ts\n config/\n page.tsx\n docs/\n [category]/\n layout.tsx\n metadata.ts\n page.tsx\n layout.tsx\n page.tsx\n evals/\n evals-table.tsx\n page.tsx\n invites/\n [token]/\n page.tsx\n login/\n page.tsx\n onboard/\n page.tsx\n orgs/\n [slug]/\n analytics/\n page.tsx\n billing/\n purchase/\n page.tsx\n setup/\n page.tsx\n repositories/\n page.tsx\n settings/\n page.tsx\n team/\n page.tsx\n usage/\n page.tsx\n page.tsx\n new/\n page.tsx\n page.tsx\n payment-success/\n page.tsx\n pricing/\n page.tsx\n privacy-policy/\n page.tsx\n publishers/\n [id]/\n agents/\n [agentId]/\n [version]/\n page.tsx\n page.tsx\n new/\n page.tsx\n page.tsx\n referrals/\n [code]/\n metadata.ts\n page.tsx\n layout.tsx\n page.tsx\n terms-of-service/\n page.tsx\n usage/\n layout.tsx\n page.tsx\n usage-display.tsx\n analytics.knowledge.md\n layout.tsx\n page.tsx\n robots.ts\n sitemap.ts\n components/\n agent/\n json-viewer.tsx\n auto-topup/\n AutoTopupSettings.tsx\n AutoTopupSettingsForm.tsx\n AutoTopupSwitch.tsx\n BaseAutoTopupSettings.tsx\n BaseAutoTopupSettingsForm.tsx\n BaseAutoTopupSwitch.tsx\n constants.ts\n OrgAutoTopupSettings.tsx\n OrgAutoTopupSettingsForm.tsx\n OrgAutoTopupSwitch.tsx\n types.ts\n credits/\n CreditManagementSection.tsx\n CreditPurchaseSection.tsx\n docs/\n mdx/\n code-demo.tsx\n custom-link.tsx\n markdown-table.tsx\n mdx-components.tsx\n mermaid-diagram.tsx\n schema-display.tsx\n copy-heading.tsx\n doc-sidebar.tsx\n docs.knowledge.md\n toc.tsx\n login/\n login-card.tsx\n login-client-wrapper.tsx\n navbar/\n navbar.tsx\n user-dropdown.tsx\n organization/\n advanced-monitor.tsx\n billing-alerts.tsx\n billing-reports.tsx\n billing-status.tsx\n credit-monitor.tsx\n model-config-sheet.tsx\n organization-success-modal.tsx\n repository-management.tsx\n team-management.tsx\n providers/\n query-client-provider.tsx\n publisher/\n basic-info-step.tsx\n ownership-step.tsx\n profile-details-step.tsx\n step-template.tsx\n sign-in/\n sign-in-button.tsx\n sign-in-card-footer.tsx\n ui/\n landing/\n competition/\n claude-code.tsx\n cline.tsx\n cursor.tsx\n github-copilot.tsx\n index.tsx\n tabs.tsx\n feature/\n browser-comparison.tsx\n chart-illustration.tsx\n code-illustration.tsx\n highlight-text.tsx\n index.tsx\n workflow-illustration.tsx\n animated-element.tsx\n constants.ts\n cta-section.tsx\n demo-code-display.tsx\n testimonials-section.tsx\n types.ts\n terminal/\n index.tsx\n style.css\n terminal-input.tsx\n terminal-output.tsx\n avatar-upload.tsx\n background-beams.tsx\n badge.tsx\n banner.tsx\n button.tsx\n card.tsx\n collapsible.tsx\n credit-confetti.tsx\n decorative-blocks.tsx\n dialog.tsx\n dropdown-menu.tsx\n enhanced-copy-button.tsx\n footer.tsx\n hero-buttons.tsx\n hero.tsx\n input.tsx\n install-dialog.tsx\n label.tsx\n neon-gradient-button.tsx\n progress.tsx\n radio-group.tsx\n section.tsx\n select.tsx\n separator.tsx\n sheet.tsx\n sidebar.tsx\n skeleton-loading.tsx\n skeleton.tsx\n slider.tsx\n switch.tsx\n table.tsx\n tabs.tsx\n textarea.tsx\n toast.tsx\n toaster.tsx\n tooltip.tsx\n use-toast.ts\n BrowserPreview.tsx\n card-with-beams.tsx\n CookieConsentCard.tsx\n footer.tsx\n icons.tsx\n IDEDemo.tsx\n layout-wrapper.tsx\n TerminalDemo.tsx\n theme-provider.tsx\n theme-switcher.tsx\n content/\n advanced/\n claude-code-comparison.mdx\n config.mdx\n how-does-it-work.mdx\n large-projects.mdx\n troubleshooting.mdx\n what-models.mdx\n agents/\n agent-reference.mdx\n creating-new-agents.mdx\n customizing-agents.mdx\n overview.mdx\n troubleshooting-agent-customization.mdx\n case-studies/\n _cta.mdx\n benjamin-bryant.mdx\n oliver-lukesch.mdx\n help/\n faq.mdx\n getting-started.mdx\n tips/\n best-practices.mdx\n keyboard-shortcuts.mdx\n knowledge-files.mdx\n other-use-cases.mdx\n version-control.mdx\n where-codebuff-shines.mdx\n discord/\n client.ts\n rate-limiter.ts\n hooks/\n use-auto-topup.ts\n use-install-dialog.ts\n use-mobile.tsx\n use-model-config.ts\n use-org-auto-topup.ts\n use-organization-data.ts\n use-user-profile.ts\n lib/\n server/\n referral.ts\n validators/\n publisher.ts\n admin-auth.ts\n constant.ts\n currency.ts\n docs.ts\n fonts.ts\n organization-permissions.ts\n PostHogProvider.tsx\n publisher-permissions.ts\n remark-code-to-codedemo.ts\n server-init.ts\n SessionProvider.tsx\n stripe-utils.ts\n testimonials.ts\n trackConversions.ts\n utils.ts\n styles/\n globals.css\n types/\n docs.ts\n user.ts\n util/\n logger.ts\n .eslintignore\n .eslintrc.js\n .gitignore\n .prettierignore\n .prettierrc.js\n commitlint.config.js\n components.json\n contentlayer.config.ts\n jest.config.js\n jest.setup.js\n knowledge.md\n next.config.mjs\n package.json\n playwright.config.ts\n postcss.config.cjs\n README.md\n tailwind.config.ts\n tsconfig.json\n.envrc\n.gitignore\n.infisical.json\n.prettierrc\nauthentication.knowledge.md\nbun.lock\nbunfig.toml\ncodebuff.json\neslint.config.js\nknowledge.md\npackage.json\nREADME.md\ntsconfig.base.json\ntsconfig.json\nWINDOWS.md\n", - "tokenCount": 9007, - "truncationLevel": "none" - } - ] - } - ], - "parentAgentId": "D-gYCDTSHSY" - }, - { - "type": "tool_result", - "toolCallId": "ab5ce625-a859-4743-acee-dc28c1cd81d3", - "toolName": "code_search", - "output": [ - { - "type": "json", - "value": { - "stdout": "No results", - "message": "Exit code: 1" - } - } - ], - "parentAgentId": "D-gXwl0iLRI" - }, - { - "type": "tool_result", - "toolCallId": "1ad7baa2-ff78-4573-9ba8-96171d5fdd73", - "toolName": "run_terminal_command", - "output": [ - { - "type": "json", - "value": { - "command": "cat package.json scripts/package.json backend/package.json common/package.json | grep -E 'typecheck|lint|test|format' -A5", - "stdout": " \"start-codebuff-test\": \"bun --cwd npm-app start --cwd ../../codebuff-test\",\n \"start-litestar\": \"bun --cwd npm-app start-litestar\",\n \"start-jpcsp\": \"bun --cwd npm-app start-jpcsp\",\n \"start-vscode\": \"bun --cwd npm-app start-vscode\",\n \"start-nushell\": \"bun --cwd npm-app start-nushell\",\n \"format\": \"prettier --write \\\"**/*.{ts,tsx,json,md}\\\"\",\n \"release:npm-app\": \"bun run --cwd npm-app release\",\n \"clean-ts\": \"find . -name '*.tsbuildinfo' -type f -delete && find . -name '.next' -type d -exec rm -rf {} + 2>/dev/null || true && find . -name 'node_modules' -type d -exec rm -rf {} + 2>/dev/null || true && bun install\",\n \"typecheck\": \"bun --filter='*' run typecheck && echo '✅ All type checks passed!'\",\n \"test\": \"bun --filter='{@codebuff/backend,@codebuff/common,@codebuff/npm-app}' run test\",\n \"init-worktree\": \"bun scripts/init-worktree.ts\",\n \"cleanup-worktree\": \"bash scripts/cleanup-worktree.sh\",\n \"generate-tool-definitions\": \"bun scripts/generate-tool-definitions.ts\"\n },\n \"dependencies\": {\n--\n \"@typescript-eslint/eslint-plugin\": \"^6.17\",\n \"bun-types\": \"^1.2.2\",\n \"eslint-config-prettier\": \"^9.1.0\",\n \"eslint-plugin-import\": \"^2.29.1\",\n \"eslint-plugin-unused-imports\": \"^4.1.4\",\n \"ignore\": \"^6.0.2\",\n \"lodash\": \"4.17.21\",\n \"prettier\": \"3.3.2\",\n \"ts-node\": \"^10.9.2\",\n \"ts-pattern\": \"^5.5.0\",\n--\n \"typescript-eslint\": \"^7.17.0\"\n },\n \"engines\": {\n \"node\": \">=20.0.0\"\n },\n \"packageManager\": \"yarn@1.22.22+sha512.a6b2f7906b721bba3d67d4aff083df04dad64c399707841b7acf00f6b133b7ac24255f2652fa22ae3534329dc6180534e98d17432037ff6fd140556e2bb3137e\"\n--\n \"typecheck\": \"tsc --noEmit -p .\",\n \"test\": \"bun test\",\n \"debug-log-subset\": \"bun run debug-log-subset.ts\",\n \"typecheck-all\": \"bun run typecheck-all.ts\"\n },\n \"sideEffects\": false,\n \"engines\": {\n \"bun\": \">=1.2.11\"\n },\n--\n \"typecheck\": \"tsc --noEmit -p .\",\n \"test\": \"bun test\"\n },\n \"sideEffects\": false,\n \"engines\": {\n \"bun\": \">=1.2.11\"\n },\n--\n \"typecheck\": \"tsc --noEmit -p .\",\n \"test\": \"bun test\",\n \"db:generate\": \"drizzle-kit generate --config=./src/db/drizzle.config.ts\",\n \"db:migrate\": \"drizzle-kit push --config=./src/db/drizzle.config.ts\",\n \"db:start\": \"docker compose -f ./src/db/docker-compose.yml up --wait && bun run db:generate && (timeout 1 || sleep 1) && bun run db:migrate\",\n \"db:studio\": \"drizzle-kit studio --config=./src/db/drizzle.config.ts\"\n },\n", - "exitCode": 0 - } - } - ], - "parentAgentId": "D-gXwlFcRHk" - }, - { - "type": "tool_call", - "toolCallId": "aae79609-2956-4fc1-a52c-03ee02d9a417", - "toolName": "code_search", - "input": { - "pattern": "file-explorer spawn", - "flags": "-g *.ts" - }, - "agentId": "D-gXwl0iLRI", - "parentAgentId": "main-agent", - "includeToolCall": true - }, - { - "type": "tool_result", - "toolCallId": "aae79609-2956-4fc1-a52c-03ee02d9a417", - "toolName": "code_search", - "output": [ - { - "type": "json", - "value": { - "stdout": "No results", - "message": "Exit code: 1" - } - } - ], - "parentAgentId": "D-gXwl0iLRI" - }, - { - "type": "tool_call", - "toolCallId": "accf2fd3-8e3d-4962-b693-b9a57d7abf73", - "toolName": "set_output", - "input": { - "results": [ - { - "stdout": "No results", - "message": "Exit code: 1" - }, - { - "stdout": "No results", - "message": "Exit code: 1" - } - ] - }, - "agentId": "D-gXwl0iLRI", - "parentAgentId": "main-agent", - "includeToolCall": false - }, - { - "type": "tool_result", - "toolCallId": "accf2fd3-8e3d-4962-b693-b9a57d7abf73", - "toolName": "set_output", - "output": [ - { - "type": "json", - "value": { - "message": "Output set" - } - } - ], - "parentAgentId": "D-gXwl0iLRI" - }, - { - "type": "subagent_finish", - "agentId": "D-gXwl0iLRI", - "agentType": "code-searcher", - "displayName": "Code Searcher", - "onlyChild": false, - "parentAgentId": "main-agent", - "prompt": "", - "params": { - "searchQueries": [ - { - "pattern": "your-custom-agent|git-committer", - "flags": "-g common/src/util/examples" - }, - { - "pattern": "file-explorer spawn", - "flags": "-g *.ts" - } - ] - } - }, - { - "type": "text", - "agentId": "D-gXwlFcRHk", - "text": "### Root `package.json`\n- **format**: `\"prettier --write \\\"**/*.{ts,tsx,json,md}\\\"\"`\n- **typecheck**: `\"bun --filter='*' run typecheck && echo '✅ All type checks passed!'\"`\n- **test**: `\"bun --filter='{@codebuff/backend,@codebuff/common,@codebuff/npm-app}' run test\"`\n- No `lint` script.\n\n### `scripts/package.json`\n- **typecheck**: `\"tsc --noEmit -p .\"`\n- **test**: `\"bun test\"`\n- No `lint` or `format` scripts.\n\n### `backend/package.json`\n- **typecheck**: `\"tsc --noEmit -p .\"`\n- **test**: `\"bun test\"`\n- No `lint` or `format` scripts.\n\n### `common/package.json`\n- **typecheck**: `\"tsc --noEmit -p .\"`\n- **test**: `\"bun test\"`\n- No `lint` or `format` scripts." - }, - { - "type": "text", - "agentId": "D-gXwryrlBs", - "text": "common/src/util/examples/diff-reviewer-1.ts\ncommon/src/util/examples/diff-reviewer-2.ts\ncommon/src/util/examples/diff-reviewer-3.ts\ncommon/src/util/changes.ts\ncommon/src/util/file.ts\ncommon/src/util/git.ts\ncommon/src/util/string.ts\ncommon/src/util/logger.ts\ncommon/src/util/messages.ts\ncommon/src/util/object.ts\ncommon/src/util/error.ts\ncommon/src/util/__tests__/string.test.ts" - }, - { - "type": "subagent_finish", - "agentId": "D-gXwlFcRHk", - "agentType": "commander-lite", - "displayName": "Commander Lite", - "onlyChild": false, - "parentAgentId": "main-agent", - "prompt": "What are the package.json scripts for typecheck, lint, test, format in the root and relevant packages?", - "params": { - "command": "cat package.json scripts/package.json backend/package.json common/package.json | grep -E 'typecheck|lint|test|format' -A5" - } - }, - { - "type": "subagent_finish", - "agentId": "D-gYCDTSHSY", - "agentType": "file-lister", - "displayName": "Liszt the File Lister", - "onlyChild": true, - "parentAgentId": "D-gXwryrlBs", - "prompt": "common/src/util/examples directory contents and related files", - "params": {} - }, - { - "type": "tool_result", - "toolCallId": "7452f59a-29c2-4003-9d1e-7efd0b614f3b", - "toolName": "spawn_agents", - "output": [ - { - "type": "json", - "value": [ - { - "agentName": "Liszt the File Lister", - "agentType": "file-lister", - "value": { - "type": "lastMessage", - "value": [ - { - "role": "assistant", - "content": [ - { - "type": "text", - "text": "common/src/util/examples/diff-reviewer-1.ts\ncommon/src/util/examples/diff-reviewer-2.ts\ncommon/src/util/examples/diff-reviewer-3.ts\ncommon/src/util/changes.ts\ncommon/src/util/file.ts\ncommon/src/util/git.ts\ncommon/src/util/string.ts\ncommon/src/util/logger.ts\ncommon/src/util/messages.ts\ncommon/src/util/object.ts\ncommon/src/util/error.ts\ncommon/src/util/__tests__/string.test.ts" - } - ] - } - ] - } - } - ] - } - ], - "parentAgentId": "D-gXwryrlBs" - }, - { - "type": "tool_call", - "toolCallId": "9e737d3d-c653-4d42-ae83-1eeb21b0884c", - "toolName": "read_files", - "input": { - "paths": [ - "common/src/util/examples/diff-reviewer-1.ts", - "common/src/util/examples/diff-reviewer-2.ts", - "common/src/util/examples/diff-reviewer-3.ts", - "common/src/util/changes.ts", - "common/src/util/file.ts", - "common/src/util/git.ts", - "common/src/util/string.ts", - "common/src/util/logger.ts", - "common/src/util/messages.ts", - "common/src/util/object.ts", - "common/src/util/error.ts", - "common/src/util/__tests__/string.test.ts" - ] - }, - "agentId": "D-gXwryrlBs", - "parentAgentId": "main-agent", - "includeToolCall": true - }, - { - "type": "tool_result", - "toolCallId": "9e737d3d-c653-4d42-ae83-1eeb21b0884c", - "toolName": "read_files", - "output": [ - { - "type": "json", - "value": [ - { - "path": "common/src/util/examples/diff-reviewer-1.ts", - "content": "import type { AgentDefinition } from '../types/agent-definition'\n\nconst definition: AgentDefinition = {\n id: 'diff-reviewer-1',\n\n displayName: 'Diff Reviewer (Level 1)',\n model: 'openai/gpt-5',\n toolNames: ['read_files', 'run_terminal_command'],\n\n spawnPurposePrompt:\n 'Spawn when you need to review code changes in the git diff',\n\n instructionsPrompt: `Execute the following steps:\n1. Run git diff\n2. Read the files that have changed\n3. Review the changes and suggest improvements`,\n}\n\nexport default definition\n", - "referencedBy": {} - }, - { - "path": "common/src/util/examples/diff-reviewer-2.ts", - "content": "import type {\n AgentDefinition,\n AgentStepContext,\n} from '../types/agent-definition'\n\nconst definition: AgentDefinition = {\n id: 'diff-reviewer-2',\n displayName: 'Diff Reviewer (Level 2)',\n model: 'openai/gpt-5',\n\n inputSchema: {\n prompt: {\n type: 'string',\n description:\n 'Please provide a short description of the changes you want to review',\n },\n },\n toolNames: ['read_files', 'run_terminal_command'],\n\n spawnPurposePrompt:\n 'Spawn when you need to review code changes in the git diff',\n\n systemPrompt:\n 'You are an expert software developer. Your job is to review code changes and provide helpful feedback.',\n\n instructionsPrompt: `Execute the following steps:\n1. Run git diff\n2. Read the files that have changed\n3. Review the changes and suggest improvements\n\nUse the following guidelines while reviewing the changes:\n- Find ways to simplify the code\n- Reuse existing code as much as possible instead of writing new code\n- Preserve as much behavior as possible in the existing code\n- Prefer changing as few lines of code as possible\n- Look for opportunities to improve the code's readability\n- Look for logical errors in the code\n- Look for missed cases in the code\n- Look for any other bugs`,\n\n handleSteps: function* ({ agentState, prompt, params }: AgentStepContext) {\n // Step 1: Run git diff immediately. Saves the agent a step, lowering cost and latency!\n yield {\n toolName: 'run_terminal_command',\n args: {\n command: 'git diff',\n },\n }\n\n // Step 2: Let AI run the rest of the steps!\n yield 'STEP_ALL'\n },\n}\n\nexport default definition\n", - "referencedBy": {} - }, - { - "path": "common/src/util/examples/diff-reviewer-3.ts", - "content": "import type {\n AgentDefinition,\n AgentStepContext,\n} from '../types/agent-definition'\n\nconst definition: AgentDefinition = {\n id: 'diff-reviewer-3',\n\n displayName: 'Diff Reviewer (Level 3)',\n model: 'openai/gpt-5',\n inputSchema: {\n prompt: {\n type: 'string',\n description:\n 'Please provide a short description of the changes you want to review',\n },\n },\n outputMode: 'last_message',\n\n toolNames: ['read_files', 'run_terminal_command', 'spawn_agents'],\n spawnableAgents: ['james/file-explorer@0.1.3'],\n\n spawnPurposePrompt:\n 'Spawn when you need to review code changes in the git diff',\n\n systemPrompt:\n 'You are an expert software developer. Your job is to review code changes and provide helpful feedback.',\n\n instructionsPrompt: `Review the changes and suggest improvements.\n\nUse the following guidelines while reviewing the changes:\n- Find ways to simplify the code\n- Reuse existing code as much as possible instead of writing new code\n- Preserve as much behavior as possible in the existing code\n- Prefer changing as few lines of code as possible\n- Look for opportunities to improve the code's readability\n- Look for logical errors in the code\n- Look for missed cases in the code\n- Look for any other bugs`,\n\n handleSteps: function* ({ agentState, prompt, params }: AgentStepContext) {\n // Step 1: Get list of changed files from git diff --name-only\n const { toolResult: gitDiffFilesResult } = yield {\n toolName: 'run_terminal_command',\n args: {\n command: 'git diff --name-only',\n },\n }\n\n // Then, extract file paths from the result\n const changedFiles = (gitDiffFilesResult || '')\n .split('\\n')\n .map((line) => line.trim())\n .filter((line) => line && !line.startsWith('??') && !line.includes('OSC'))\n\n // Step 2: Read the files\n if (changedFiles.length > 0) {\n yield {\n toolName: 'read_files',\n args: {\n paths: changedFiles,\n },\n }\n }\n\n // Step 3: Run full git diff to see the actual changes\n yield {\n toolName: 'run_terminal_command',\n args: {\n command: 'git diff',\n },\n }\n\n // Step 4: Put words in the AI's mouth to get it to spawn the file explorer.\n yield {\n toolName: 'add_message',\n args: {\n role: 'assistant',\n content:\n 'Now I will spawn a file explorer to find any missing codebase context.',\n },\n }\n\n yield 'STEP'\n\n // Step 5: Put words in the AI's mouth to review the changes.\n yield {\n toolName: 'add_message',\n args: {\n role: 'assistant',\n content: 'Here is my comprehensive review of the changes.',\n },\n }\n\n // Step 6: Let AI review the changes in a final step. (The last message is also the agent's output.)\n yield 'STEP'\n },\n}\n\nexport default definition\n", - "referencedBy": {} - }, - { - "path": "common/src/util/changes.ts", - "content": "import fs from 'fs'\nimport path from 'path'\n\nimport { isFileIgnored } from '../project-file-tree'\nimport { applyPatch } from './patch'\n\nimport type { FileChanges } from '../actions'\n\nexport function applyChanges(projectRoot: string, changes: FileChanges) {\n const created: string[] = []\n const modified: string[] = []\n const ignored: string[] = []\n const invalid: string[] = []\n\n for (const change of changes) {\n const { path: filePath, content, type } = change\n try {\n if (isFileIgnored(filePath, projectRoot)) {\n ignored.push(filePath)\n continue\n }\n } catch {\n // File path caused an error.\n invalid.push(filePath)\n continue\n }\n try {\n const fullPath = path.join(projectRoot, filePath)\n const fileExists = fs.existsSync(fullPath)\n if (!fileExists) {\n // Create directories in the path if they don't exist\n const dirPath = path.dirname(fullPath)\n fs.mkdirSync(dirPath, { recursive: true })\n }\n\n if (type === 'file') {\n fs.writeFileSync(fullPath, content)\n } else {\n const oldContent = fs.readFileSync(fullPath, 'utf-8')\n const newContent = applyPatch(oldContent, content)\n fs.writeFileSync(fullPath, newContent)\n }\n if (fileExists) {\n modified.push(filePath)\n } else {\n created.push(filePath)\n }\n } catch (error) {\n console.error(`Failed to apply patch to ${filePath}:`, error, content)\n invalid.push(filePath)\n }\n }\n\n return { created, modified, ignored, invalid }\n}\n\nexport async function applyAndRevertChanges(\n projectRoot: string,\n changes: FileChanges,\n onApply: () => Promise,\n) {\n const filesChanged = changes.map((change) => change.path)\n const files = Object.fromEntries(\n filesChanged.map((filePath) => {\n const fullPath = path.join(projectRoot, filePath)\n const oldContent = fs.existsSync(fullPath)\n ? fs.readFileSync(fullPath, 'utf-8')\n : '[DOES_NOT_EXIST]'\n return [filePath, oldContent]\n }),\n )\n applyChanges(projectRoot, changes)\n try {\n await onApply()\n } catch (error) {\n console.error(`Failed to apply changes:`, error)\n }\n for (const [filePath, oldContent] of Object.entries(files)) {\n if (oldContent === '[DOES_NOT_EXIST]') {\n if (fs.existsSync(path.join(projectRoot, filePath))) {\n fs.unlinkSync(path.join(projectRoot, filePath))\n }\n } else {\n fs.writeFileSync(path.join(projectRoot, filePath), oldContent)\n }\n }\n}\n", - "referencedBy": {} - }, - { - "path": "common/src/util/file.ts", - "content": "import * as fs from 'fs'\nimport * as os from 'os'\nimport * as path from 'path'\n\nimport { z } from 'zod'\n\nimport { CodebuffConfigSchema } from '../json-config/constants'\nimport { DynamicAgentTemplateSchema } from '../types/dynamic-agent-template'\n\nexport const FileTreeNodeSchema: z.ZodType = z.object({\n name: z.string(),\n type: z.enum(['file', 'directory']),\n children: z.lazy(() => z.array(FileTreeNodeSchema).optional()),\n filePath: z.string(),\n})\n\nexport interface FileTreeNode {\n name: string\n type: 'file' | 'directory'\n filePath: string\n lastReadTime?: number\n children?: FileTreeNode[]\n}\n\nexport interface DirectoryNode extends FileTreeNode {\n type: 'directory'\n children: FileTreeNode[]\n}\n\nexport interface FileNode extends FileTreeNode {\n type: 'file'\n lastReadTime: number\n}\n\nexport const FileVersionSchema = z.object({\n path: z.string(),\n content: z.string(),\n})\n\nexport type FileVersion = z.infer\n\nexport const ProjectFileContextSchema = z.object({\n projectRoot: z.string(),\n cwd: z.string(),\n fileTree: z.array(z.custom()),\n fileTokenScores: z.record(z.string(), z.record(z.string(), z.number())),\n tokenCallers: z\n .record(z.string(), z.record(z.string(), z.array(z.string())))\n .optional(),\n knowledgeFiles: z.record(z.string(), z.string()),\n userKnowledgeFiles: z.record(z.string(), z.string()).optional(),\n agentTemplates: z.record(z.string(), z.any()).default({}),\n codebuffConfig: CodebuffConfigSchema.optional(),\n gitChanges: z.object({\n status: z.string(),\n diff: z.string(),\n diffCached: z.string(),\n lastCommitMessages: z.string(),\n }),\n changesSinceLastChat: z.record(z.string(), z.string()),\n shellConfigFiles: z.record(z.string(), z.string()),\n systemInfo: z.object({\n platform: z.string(),\n shell: z.string(),\n nodeVersion: z.string(),\n arch: z.string(),\n homedir: z.string(),\n cpus: z.number(),\n }),\n fileVersions: z.array(z.array(FileVersionSchema)).optional(), // Keep temporarily for migration\n})\n\nexport type ProjectFileContext = z.infer\n\nexport const fileRegex =\n /\\s*([^<]+)<\\/path>\\s*([\\s\\S]*?)<\\/content>\\s*<\\/write_file>/g\nexport const fileWithNoPathRegex = /([\\s\\S]*?)<\\/write_file>/g\n\nexport const parseFileBlocks = (fileBlocks: string) => {\n let fileMatch\n const files: Record = {}\n while ((fileMatch = fileRegex.exec(fileBlocks)) !== null) {\n const [, filePath, fileContent] = fileMatch\n files[filePath] = fileContent.startsWith('\\n')\n ? fileContent.slice(1)\n : fileContent\n }\n return files\n}\n\nexport const getStubProjectFileContext = (): ProjectFileContext => ({\n projectRoot: '',\n cwd: '',\n fileTree: [],\n fileTokenScores: {},\n knowledgeFiles: {},\n userKnowledgeFiles: {},\n agentTemplates: {},\n codebuffConfig: undefined,\n gitChanges: {\n status: '',\n diff: '',\n diffCached: '',\n lastCommitMessages: '',\n },\n changesSinceLastChat: {},\n shellConfigFiles: {},\n systemInfo: {\n platform: '',\n shell: '',\n nodeVersion: '',\n arch: '',\n homedir: '',\n cpus: 0,\n },\n})\n\nexport const createMarkdownFileBlock = (filePath: string, content: string) => {\n return `\\`\\`\\`${filePath}\\n${content}\\n\\`\\`\\``\n}\n\nexport const parseMarkdownCodeBlock = (content: string) => {\n const match = content.match(/^```(?:[a-zA-Z]+)?\\n([\\s\\S]*)\\n```$/)\n if (match) {\n return match[1] + '\\n'\n }\n return content\n}\n\nexport const createSearchReplaceBlock = (search: string, replace: string) => {\n return `<<<<<<< SEARCH\\n${search}\\n=======\\n${replace}\\n>>>>>>> REPLACE`\n}\n\nexport function printFileTree(\n nodes: FileTreeNode[],\n depth: number = 0,\n): string {\n let result = ''\n const indentation = ' '.repeat(depth)\n for (const node of nodes) {\n result += `${indentation}${node.name}${node.type === 'directory' ? '/' : ''}\\n`\n if (node.type === 'directory' && node.children) {\n result += printFileTree(node.children, depth + 1)\n }\n }\n return result\n}\n\nexport function printFileTreeWithTokens(\n nodes: FileTreeNode[],\n fileTokenScores: Record>,\n path: string[] = [],\n): string {\n let result = ''\n const depth = path.length\n const indentToken = ' '\n const indentation = indentToken.repeat(depth)\n const indentationWithFile = indentToken.repeat(depth + 1)\n for (const node of nodes) {\n if (\n node.type === 'directory' &&\n (!node.children || node.children.length === 0)\n ) {\n // Skip empty directories\n continue\n }\n result += `${indentation}${node.name}${node.type === 'directory' ? '/' : ''}`\n path.push(node.name)\n const filePath = path.join('/')\n const tokenScores = fileTokenScores[filePath]\n if (node.type === 'file' && tokenScores) {\n const tokens = Object.keys(tokenScores)\n if (tokens.length > 0) {\n result += `\\n${indentationWithFile}${tokens.join(' ')}`\n }\n }\n result += '\\n'\n if (node.type === 'directory' && node.children) {\n result += printFileTreeWithTokens(node.children, fileTokenScores, path)\n }\n path.pop()\n }\n return result\n}\n\n/**\n * Ensures the given file contents ends with a newline character.\n * @param contents - The file contents\n * @returns the file contents with a newline character.\n */\nexport const ensureEndsWithNewline = (\n contents: string | null,\n): string | null => {\n if (contents === null || contents === '') {\n // Leave empty file as is\n return contents\n }\n if (contents.endsWith('\\n')) {\n return contents\n }\n return contents + '\\n'\n}\n\nexport const ensureDirectoryExists = (baseDir: string) => {\n if (!fs.existsSync(baseDir)) {\n fs.mkdirSync(baseDir, { recursive: true })\n }\n}\n\n/**\n * Removes markdown code block syntax if present, including any language tag\n */\nexport const cleanMarkdownCodeBlock = (content: string): string => {\n const cleanResponse = content.match(/^```(?:[a-zA-Z]+)?\\n([\\s\\S]*)\\n```$/)\n ? content.replace(/^```(?:[a-zA-Z]+)?\\n/, '').replace(/\\n```$/, '')\n : content\n return cleanResponse\n}\n\nexport function isValidFilePath(path: string) {\n if (!path) return false\n\n // Check for whitespace\n if (/\\s/.test(path)) return false\n\n // Check for invalid characters\n const invalidChars = /[<>:\"|?*\\x00-\\x1F]/g\n if (invalidChars.test(path)) return false\n\n return true\n}\n\nexport function isDir(p: string): boolean {\n try {\n return fs.statSync(p).isDirectory()\n } catch {\n return false\n }\n}\n\n/**\n * Returns true if the `toPath` is a subdirectory of `fromPath`.\n */\nexport function isSubdir(fromPath: string, toPath: string) {\n const resolvedFrom = path.resolve(fromPath)\n const resolvedTo = path.resolve(toPath)\n\n if (process.platform === 'win32') {\n const fromDrive = path.parse(resolvedFrom).root.toLowerCase()\n const toDrive = path.parse(resolvedTo).root.toLowerCase()\n if (fromDrive !== toDrive) {\n return false\n }\n }\n\n return !path.relative(resolvedFrom, resolvedTo).startsWith('..')\n}\n\nexport function isValidProjectRoot(dir: string): boolean {\n return !isSubdir(dir, os.homedir())\n}\n", - "referencedBy": {} - }, - { - "path": "common/src/util/git.ts", - "content": "import { execSync } from 'child_process'\nimport * as fs from 'fs'\nimport * as path from 'path'\n\nimport type { FileChanges } from '../actions'\n\nconst maxBuffer = 50 * 1024 * 1024 // 50 MB\n\nexport function hasStagedChanges(): boolean {\n try {\n execSync('git diff --staged --quiet', { stdio: 'ignore', maxBuffer })\n return false\n } catch {\n return true\n }\n}\n\nexport function getStagedChanges(): string {\n try {\n return execSync('git diff --staged', { maxBuffer }).toString()\n } catch (error) {\n return ''\n }\n}\n\nexport function commitChanges(commitMessage: string) {\n try {\n execSync(`git commit -m \"${commitMessage}\"`, { stdio: 'ignore', maxBuffer })\n } catch (error) {}\n}\n\nexport function stageAllChanges(): boolean {\n try {\n execSync('git add -A', { stdio: 'pipe', maxBuffer })\n return hasStagedChanges()\n } catch (error) {\n return false\n }\n}\n\nexport function stagePatches(dir: string, changes: FileChanges): boolean {\n try {\n const fileNames = changes.map((change) => change.path)\n const existingFileNames = fileNames.filter((filePath) =>\n fs.existsSync(path.join(dir, filePath)),\n )\n\n if (existingFileNames.length === 0) {\n return false\n }\n\n execSync(`git add ${existingFileNames.join(' ')}`, { cwd: dir, maxBuffer })\n return hasStagedChanges()\n } catch (error) {\n console.error('Error in stagePatches:', error)\n return false\n }\n}\n", - "referencedBy": {} - }, - { - "path": "common/src/util/string.ts", - "content": "import { sumBy } from 'lodash'\n\nexport const truncateString = (str: string, maxLength: number) => {\n if (str.length <= maxLength) {\n return str\n }\n return str.slice(0, maxLength) + '...'\n}\n\nexport const truncateStringWithMessage = ({\n str,\n maxLength,\n message = 'TRUNCATED DUE TO LENGTH',\n remove = 'END',\n}: {\n str: string\n maxLength: number\n message?: string\n remove?: 'END' | 'START' | 'MIDDLE'\n}) => {\n if (str.length <= maxLength) {\n return str\n }\n\n if (remove === 'END') {\n const suffix = `\\n[${message}...]`\n return str.slice(0, maxLength - suffix.length) + suffix\n }\n if (remove === 'START') {\n const prefix = `[...${message}]\\n`\n return prefix + str.slice(str.length - maxLength + prefix.length)\n }\n\n const middle = `\\n[...${message}...]\\n`\n const length = Math.floor((maxLength - middle.length) / 2)\n return str.slice(0, length) + middle + str.slice(-length)\n}\n\n/**\n * Check if a character is a whitespace character according\n * to the XML spec (space, carriage return, line feed or tab)\n *\n * @param character Character to check\n * @return Whether the character is whitespace or not\n */\nexport const isWhitespace = (character: string) => /\\s/.test(character)\n\nexport const replaceNonStandardPlaceholderComments = (\n content: string,\n replacement: string,\n): string => {\n const commentPatterns = [\n // JSX comments (match this first)\n {\n regex:\n /{\\s*\\/\\*\\s*\\.{3}.*(?:rest|unchanged|keep|file|existing|some).*(?:\\s*\\.{3})?\\s*\\*\\/\\s*}/gi,\n placeholder: replacement,\n },\n // C-style comments (C, C++, Java, JavaScript, TypeScript, etc.)\n {\n regex:\n /\\/\\/\\s*\\.{3}.*(?:rest|unchanged|keep|file|existing|some).*(?:\\s*\\.{3})?/gi,\n placeholder: replacement,\n },\n {\n regex:\n /\\/\\*\\s*\\.{3}.*(?:rest|unchanged|keep|file|existing|some).*(?:\\s*\\.{3})?\\s*\\*\\//gi,\n placeholder: replacement,\n },\n // Python, Ruby, R comments\n {\n regex:\n /#\\s*\\.{3}.*(?:rest|unchanged|keep|file|existing|some).*(?:\\s*\\.{3})?/gi,\n placeholder: replacement,\n },\n // HTML-style comments\n {\n regex:\n //gi,\n placeholder: replacement,\n },\n // SQL, Haskell, Lua comments\n {\n regex:\n /--\\s*\\.{3}.*(?:rest|unchanged|keep|file|existing|some).*(?:\\s*\\.{3})?/gi,\n placeholder: replacement,\n },\n // MATLAB comments\n {\n regex:\n /%\\s*\\.{3}.*(?:rest|unchanged|keep|file|existing|some).*(?:\\s*\\.{3})?/gi,\n placeholder: replacement,\n },\n ]\n\n let updatedContent = content\n\n for (const { regex, placeholder } of commentPatterns) {\n updatedContent = updatedContent.replaceAll(regex, placeholder)\n }\n\n return updatedContent\n}\n\nexport const randBoolFromStr = (str: string) => {\n return sumBy(str.split(''), (char) => char.charCodeAt(0)) % 2 === 0\n}\n\nexport const pluralize = (count: number, word: string) => {\n if (count === 1) return `${count} ${word}`\n\n // Handle words ending in f/fe first (before other rules)\n if (word.endsWith('f')) {\n return `${count} ${word.slice(0, -1) + 'ves'}`\n }\n if (word.endsWith('fe')) {\n return `${count} ${word.slice(0, -2) + 'ves'}`\n }\n\n // Handle words ending in 'y' (unless preceded by a vowel)\n if (word.endsWith('y') && !word.match(/[aeiou]y$/)) {\n return `${count} ${word.slice(0, -1) + 'ies'}`\n }\n\n // Handle words ending in s, sh, ch, x, z, o\n if (word.match(/[sxz]$/) || word.match(/[cs]h$/) || word.match(/o$/)) {\n return `${count} ${word + 'es'}`\n }\n\n return `${count} ${word + 's'}`\n}\n\n/**\n * Safely replaces all occurrences of a search string with a replacement string,\n * escaping special replacement patterns (like $) in the replacement string.\n */\nexport const capitalize = (str: string): string => {\n if (!str) return str\n return str.charAt(0).toUpperCase() + str.slice(1).toLowerCase()\n}\n\n/**\n * Converts a snake_case string to Title Case\n * Example: \"add_subgoal\" -> \"Add Subgoal\"\n */\nexport const snakeToTitleCase = (str: string): string => {\n return str\n .split('_')\n .map((word) => capitalize(word))\n .join(' ')\n}\n\n/**\n * Ensures a URL has the appropriate protocol (http:// or https://)\n * Uses http:// for localhost and local IPs, https:// for all other domains\n */\nexport const ensureUrlProtocol = (url: string): string => {\n if (\n url.startsWith('http://') ||\n url.startsWith('https://') ||\n url.startsWith('file://')\n ) {\n return url\n }\n\n if (url.startsWith('localhost') || url.match(/^127\\.\\d+\\.\\d+\\.\\d+/)) {\n return `http://${url}`\n }\n\n if (url.startsWith('/')) {\n return `file://${url}`\n }\n\n return `https://${url}`\n}\n\nexport const safeReplace = (\n content: string,\n searchStr: string,\n replaceStr: string,\n): string => {\n const escapedReplaceStr = replaceStr.replace(/\\$/g, '$$$$')\n return content.replace(searchStr, escapedReplaceStr)\n}\n\nexport const hasLazyEdit = (content: string) => {\n const cleanedContent = content.toLowerCase().trim()\n return (\n cleanedContent.includes('... existing code ...') ||\n cleanedContent.includes('// rest of the') ||\n cleanedContent.includes('# rest of the') ||\n // Match various comment styles with ellipsis and specific words\n /\\/\\/\\s*\\.{3}.*(?:rest|unchanged|keep|file|existing|some).*(?:\\.{3})?/.test(\n cleanedContent,\n ) || // C-style single line\n /\\/\\*\\s*\\.{3}.*(?:rest|unchanged|keep|file|existing|some).*(?:\\.{3})?\\s*\\*\\//.test(\n cleanedContent,\n ) || // C-style multi-line\n /#\\s*\\.{3}.*(?:rest|unchanged|keep|file|existing|some).*(?:\\.{3})?/.test(\n cleanedContent,\n ) || // Python/Ruby style\n //.test(\n cleanedContent,\n ) || // HTML style\n /--\\s*\\.{3}.*(?:rest|unchanged|keep|file|existing|some).*(?:\\.{3})?/.test(\n cleanedContent,\n ) || // SQL/Haskell style\n /%\\s*\\.{3}.*(?:rest|unchanged|keep|file|existing|some).*(?:\\.{3})?/.test(\n cleanedContent,\n ) || // MATLAB style\n /{\\s*\\/\\*\\s*\\.{3}.*(?:rest|unchanged|keep|file|existing|some).*(?:\\.{3})?\\s*\\*\\/\\s*}/.test(\n cleanedContent,\n ) // JSX style\n )\n}\n\n/**\n * Extracts a JSON field from a string, transforms it, and puts it back.\n * Handles both array and object JSON values.\n * @param content The string containing JSON-like content\n * @param field The field name to find and transform\n * @param transform Function to transform the parsed JSON value\n * @param fallback String to use if parsing fails\n * @returns The content string with the transformed JSON field\n */\nexport function transformJsonInString(\n content: string,\n field: string,\n transform: (json: T) => unknown,\n fallback: string,\n): string {\n // Use a non-greedy match for objects/arrays to prevent over-matching\n const pattern = new RegExp(`\"${field}\"\\\\s*:\\\\s*(\\\\{[^}]*?\\\\}|\\\\[[^\\\\]]*?\\\\])`)\n const match = content.match(pattern)\n\n if (!match) {\n return content\n }\n\n try {\n const json = JSON.parse(match[1])\n const transformed = transform(json)\n\n // Important: Only replace the exact matched portion to prevent duplicates\n return content.replace(\n match[0],\n `\"${field}\":${JSON.stringify(transformed)}`,\n )\n } catch (error) {\n // Only replace the exact matched portion even in error case\n return content.replace(match[0], `\"${field}\":${fallback}`)\n }\n}\n\n/**\n * Generates a compact unique identifier by combining timestamp bits with random bits.\n * Uses 40 bits of timestamp (enough for ~34 years) and 24 random bits for exactly 64 total bits.\n * Encodes in base64url for compact, URL-safe strings (~11 chars).\n * @param prefix Optional prefix to add to the ID\n * @returns A unique string ID\n * @example\n * generateCompactId() // => \"1a2b3c4d5e6\"\n * generateCompactId('msg-') // => \"msg-1a2b3c4d5e6\"\n */\nexport const generateCompactId = (prefix?: string): string => {\n // Get the last 32 bits of the timestamp\n const timestamp = (Date.now() & 0xffffffff) >>> 0\n // Generate a 32-bit random number\n const random = Math.floor(Math.random() * 0x100000000) >>> 0\n\n // Combine them into a 64-bit representation as two 32-bit numbers\n const high = timestamp\n const low = random\n\n // Convert to a hex string, pad if necessary, and combine\n const highHex = high.toString(16).padStart(8, '0')\n const lowHex = low.toString(16).padStart(8, '0')\n\n const combinedHex = highHex + lowHex\n\n // Convert hex to a Buffer and then to base64url\n const bytes = Buffer.from(combinedHex, 'hex')\n const str = bytes.toString('base64url').replace(/=/g, '')\n\n return prefix ? `${prefix}${str}` : str\n}\n\n/**\n * Removes null characters from a string\n */\nexport const stripNullChars = (str: string): string => {\n return str.replace(/\\u0000/g, '')\n}\n\nconst ansiColorsRegex = /\\x1B\\[[0-9;]*m/g\nexport function stripColors(str: string): string {\n return str.replace(ansiColorsRegex, '')\n}\n\nconst ansiRegex = /\\x1B(?:[@-Z\\\\-_]|\\[[0-?]*[ -/]*[@-~]|\\][^\\x1B]*\\x1B\\\\?)/g\nexport function stripAnsi(str: string): string {\n return str.replace(ansiRegex, '')\n}\n\nexport function includesMatch(\n array: (string | RegExp)[],\n value: string,\n): boolean {\n return array.some((p) => {\n if (typeof p === 'string') {\n return p === value\n }\n return p.test(value)\n })\n}\n\n/**\n * Finds the longest substring that is **both** a suffix of `source`\n * **and** a prefix of `next`.\n * Useful when concatenating strings while avoiding duplicate overlap.\n *\n * @example\n * ```ts\n * suffixPrefixOverlap('foobar', 'barbaz'); // ➜ 'bar'\n * suffixPrefixOverlap('abc', 'def'); // ➜ ''\n * ```\n *\n * @param source The string whose **suffix** is inspected.\n * @param next The string whose **prefix** is inspected.\n * @returns The longest overlapping edge, or an empty string if none exists.\n */\nexport function suffixPrefixOverlap(source: string, next: string): string {\n for (let len = next.length; len >= 0; len--) {\n const prefix = next.slice(0, len)\n if (source.endsWith(prefix)) {\n return prefix\n }\n }\n\n return ''\n}\n\nexport const escapeString = (str: string) => {\n return JSON.stringify(str).slice(1, -1)\n}\n", - "referencedBy": {} - }, - { - "path": "common/src/util/logger.ts", - "content": "import path from 'path'\n\nimport { env } from '@codebuff/internal'\nimport pino from 'pino'\n\nimport type { AsyncLocalStorage as NodeAsyncLocalStorage } from 'async_hooks'\n\nlet AsyncLocalStorageImpl: typeof import('async_hooks').AsyncLocalStorage | null\ntry {\n // Load AsyncLocalStorage via require\n AsyncLocalStorageImpl = require('async_hooks').AsyncLocalStorage\n} catch {\n AsyncLocalStorageImpl = null\n}\n\n// Create a no‑op shim when AsyncLocalStorage isn't present\nconst loggerAsyncStorage =\n AsyncLocalStorageImpl !== null\n ? new AsyncLocalStorageImpl()\n : {\n // run() just executes fn without context tracking\n run: (_: any, fn: (...args: A) => R, ...args: A) =>\n fn(...args),\n getStore: () => undefined,\n }\n\nexport interface LoggerContext {\n userId?: string\n userEmail?: string\n clientSessionId?: string\n [key: string]: any // Allow for future extensions\n}\n\nexport const withLoggerContext = (\n additionalContext: Partial,\n fn: () => Promise,\n) => {\n const store = (loggerAsyncStorage.getStore?.() ?? {}) as LoggerContext\n // Cast to Node's AsyncLocalStorage to resolve overload mismatch\n return (loggerAsyncStorage as NodeAsyncLocalStorage).run(\n { ...store, ...additionalContext },\n fn,\n )\n}\n\n// Only use file transport when not running in Edge/browser‑like env\nconst runningInEdge = process.env.NEXT_RUNTIME === 'edge'\nconst fileTransport =\n !runningInEdge && env.NEXT_PUBLIC_CB_ENVIRONMENT !== 'prod'\n ? pino.transport({\n target: 'pino/file',\n options: { destination: path.join(__dirname, '..', 'debug.log') },\n level: 'debug',\n })\n : undefined\n\nexport const logger = pino(\n {\n level: 'debug',\n mixin() {\n // If AsyncLocalStorage isn't available, return undefined\n return { logTrace: loggerAsyncStorage.getStore?.() }\n },\n formatters: {\n level: (label) => ({ level: label.toUpperCase() }),\n },\n timestamp: () => `,\"timestamp\":\"${new Date().toISOString()}\"`,\n },\n fileTransport,\n)\n", - "referencedBy": {} - }, - { - "path": "common/src/util/messages.ts", - "content": "import type { CodebuffMessage, Message } from '../types/message'\nimport type { CoreMessage } from 'ai'\n\ninterface ScreenshotRef {\n msgIdx: number\n contentIdx: number\n}\n\n/**\n * Limits the total number of screenshots across all messages to maxCount,\n * keeping only the most recent ones.\n */\nexport function limitScreenshots(\n messages: Message[],\n maxCount: number,\n): Message[] {\n const screenshots = messages.flatMap((msg, msgIdx) =>\n Array.isArray(msg.content)\n ? msg.content\n .map((item, contentIdx) =>\n item.type === 'image' ? { msgIdx, contentIdx } : null,\n )\n .filter((ref): ref is ScreenshotRef => ref !== null)\n : [],\n )\n\n if (screenshots.length <= maxCount) return messages\n\n const keepRefs = new Set(\n screenshots\n .slice(-maxCount)\n .map((ref) => `${ref.msgIdx}-${ref.contentIdx}`),\n )\n\n return messages.map((msg, msgIdx) =>\n Array.isArray(msg.content)\n ? {\n ...msg,\n content: msg.content.filter(\n (item, contentIdx) =>\n item.type !== 'image' || keepRefs.has(`${msgIdx}-${contentIdx}`),\n ),\n }\n : msg,\n )\n}\n\nexport function toContentString(msg: CoreMessage): string {\n const { content } = msg\n if (typeof content === 'string') return content\n return content.map((item) => (item as any)?.text ?? '').join('\\n')\n}\n\nexport function withCacheControlCore(msg: CodebuffMessage): CodebuffMessage {\n const message = { ...msg }\n if (!message.providerOptions) {\n message.providerOptions = {}\n }\n if (!message.providerOptions.anthropic) {\n message.providerOptions.anthropic = {}\n }\n message.providerOptions.anthropic.cacheControl = { type: 'ephemeral' }\n if (!message.providerOptions.openrouter) {\n message.providerOptions.openrouter = {}\n }\n message.providerOptions.openrouter.cacheControl = { type: 'ephemeral' }\n return message\n}\n\nexport function withCacheControl(msg: Message): Message {\n if (typeof msg.content === 'string') {\n return {\n ...msg,\n content: [\n {\n type: 'text',\n text: msg.content,\n cache_control: { type: 'ephemeral' as const },\n },\n ],\n }\n } else {\n return {\n ...msg,\n content: msg.content.map((item, i) =>\n i === msg.content.length - 1\n ? { ...item, cache_control: { type: 'ephemeral' as const } }\n : item,\n ),\n }\n }\n}\n\nexport function removeCache(messages: Message[]): Message[] {\n return messages.map((msg) => {\n if (typeof msg.content === 'object' && Array.isArray(msg.content)) {\n return {\n ...msg,\n content: msg.content.map((item) => {\n const { cache_control, ...rest } = item\n return rest\n }),\n }\n }\n return msg\n })\n}\n", - "referencedBy": {} - }, - { - "path": "common/src/util/object.ts", - "content": "import { isEqual, mapValues, union } from 'lodash'\n\nexport const removeUndefinedProps = (obj: T): T => {\n const newObj: any = {}\n\n for (const key of Object.keys(obj)) {\n if ((obj as any)[key] !== undefined) newObj[key] = (obj as any)[key]\n }\n\n return newObj\n}\n\nexport const removeNullOrUndefinedProps = (\n obj: T,\n exceptions?: string[],\n): T => {\n const newObj: any = {}\n\n for (const key of Object.keys(obj)) {\n if (\n ((obj as any)[key] !== undefined && (obj as any)[key] !== null) ||\n (exceptions ?? []).includes(key)\n )\n newObj[key] = (obj as any)[key]\n }\n return newObj\n}\n\nexport const addObjects = (\n obj1: T,\n obj2: T,\n) => {\n const keys = union(Object.keys(obj1), Object.keys(obj2))\n const newObj = {} as any\n\n for (const key of keys) {\n newObj[key] = (obj1[key] ?? 0) + (obj2[key] ?? 0)\n }\n\n return newObj as T\n}\n\nexport const subtractObjects = (\n obj1: T,\n obj2: T,\n) => {\n const keys = union(Object.keys(obj1), Object.keys(obj2))\n const newObj = {} as any\n\n for (const key of keys) {\n newObj[key] = (obj1[key] ?? 0) - (obj2[key] ?? 0)\n }\n\n return newObj as T\n}\n\nexport const hasChanges = (obj: T, partial: Partial) => {\n const currValues = mapValues(partial, (_, key: keyof T) => obj[key])\n return !isEqual(currValues, partial)\n}\n\nexport const hasSignificantDeepChanges = (\n obj: T,\n partial: Partial,\n epsilonForNumbers: number,\n): boolean => {\n const compareValues = (currValue: any, partialValue: any): boolean => {\n if (typeof currValue === 'number' && typeof partialValue === 'number') {\n return Math.abs(currValue - partialValue) > epsilonForNumbers\n }\n if (typeof currValue === 'object' && typeof partialValue === 'object') {\n return hasSignificantDeepChanges(\n currValue,\n partialValue,\n epsilonForNumbers,\n )\n }\n return !isEqual(currValue, partialValue)\n }\n\n for (const key in partial) {\n if (Object.prototype.hasOwnProperty.call(partial, key)) {\n if (compareValues(obj[key], partial[key])) {\n return true\n }\n }\n }\n\n return false\n}\n\nexport const filterObject = (\n obj: T,\n predicate: (value: any, key: keyof T) => boolean,\n): { [P in keyof T]: T[P] } => {\n const result = {} as { [P in keyof T]: T[P] }\n for (const key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n if (predicate(obj[key], key)) {\n result[key] = obj[key]\n }\n }\n }\n return result\n}\n\n/**\n * Asserts that a condition is true. If the condition is false, it throws an error with the provided message.\n * @param condition The condition to check\n * @param message The error message to display if the condition is false\n * @throws {Error} If the condition is false\n */\nexport function assert(condition: boolean, message: string): asserts condition {\n if (!condition) {\n throw new Error(`Assertion failed: ${message}`)\n }\n}\n\nexport function errorToObject(value: any) {\n if (value instanceof Error) {\n // Copy *all* own props, including non-enumerables\n return Object.getOwnPropertyNames(value).reduce>(\n (acc, key) => {\n acc[key] = (value as any)[key]\n return acc\n },\n {},\n )\n }\n return value\n}\n", - "referencedBy": {} - }, - { - "path": "common/src/util/error.ts", - "content": "export function getErrorObject(error: any) {\n return {\n message: error.message,\n stack: error.stack,\n name: error.name,\n }\n}", - "referencedBy": {} - }, - { - "path": "common/src/util/__tests__/string.test.ts", - "content": "import { describe, expect, it } from 'bun:test'\n\nimport { EXISTING_CODE_MARKER } from '../../constants'\nimport { pluralize, replaceNonStandardPlaceholderComments } from '../string'\n\ndescribe('pluralize', () => {\n it('should handle singular and plural cases correctly', () => {\n expect(pluralize(1, 'test')).toBe('1 test')\n expect(pluralize(0, 'test')).toBe('0 tests')\n expect(pluralize(2, 'test')).toBe('2 tests')\n })\n\n it('should handle words ending in y', () => {\n expect(pluralize(1, 'city')).toBe('1 city')\n expect(pluralize(2, 'city')).toBe('2 cities')\n expect(pluralize(3, 'repository')).toBe('3 repositories')\n })\n\n it('should handle words ending in f/fe', () => {\n expect(pluralize(1, 'leaf')).toBe('1 leaf')\n expect(pluralize(2, 'leaf')).toBe('2 leaves')\n expect(pluralize(1, 'knife')).toBe('1 knife')\n expect(pluralize(2, 'knife')).toBe('2 knives')\n expect(pluralize(1, 'life')).toBe('1 life')\n expect(pluralize(3, 'life')).toBe('3 lives')\n })\n\n it('should handle words ending in s, sh, ch, x, z, o', () => {\n expect(pluralize(2, 'bus')).toBe('2 buses')\n expect(pluralize(2, 'box')).toBe('2 boxes')\n expect(pluralize(2, 'church')).toBe('2 churches')\n expect(pluralize(2, 'dish')).toBe('2 dishes')\n })\n\n it('should handle regular plurals', () => {\n expect(pluralize(1, 'agent')).toBe('1 agent')\n expect(pluralize(0, 'agent')).toBe('0 agents')\n expect(pluralize(5, 'member')).toBe('5 members')\n expect(pluralize(10, 'invitation')).toBe('10 invitations')\n })\n})\n\ndescribe('replaceNonStandardPlaceholderComments', () => {\n it('should replace C-style comments', () => {\n const input = `\nfunction example() {\n // ... some code ...\n console.log('Hello');\n // ... rest of the function ...\n}\n`\n const expected = `\nfunction example() {\n ${EXISTING_CODE_MARKER}\n console.log('Hello');\n ${EXISTING_CODE_MARKER}\n}\n`\n expect(\n replaceNonStandardPlaceholderComments(input, EXISTING_CODE_MARKER),\n ).toBe(expected)\n })\n\n it('should replace multi-line C-style comments', () => {\n const input = `\nfunction example() {\n /* ... some code ... */\n console.log('Hello');\n /* ... rest of the function ... */\n}\n`\n const expected = `\nfunction example() {\n ${EXISTING_CODE_MARKER}\n console.log('Hello');\n ${EXISTING_CODE_MARKER}\n}\n`\n expect(\n replaceNonStandardPlaceholderComments(input, EXISTING_CODE_MARKER),\n ).toBe(expected)\n })\n\n it('should replace Python-style comments', () => {\n const input = `\ndef example():\n # ... some code ...\n print('Hello')\n # ... rest of the function ...\n`\n const expected = `\ndef example():\n ${EXISTING_CODE_MARKER}\n print('Hello')\n ${EXISTING_CODE_MARKER}\n`\n expect(\n replaceNonStandardPlaceholderComments(input, EXISTING_CODE_MARKER),\n ).toBe(expected)\n })\n\n it('should replace JSX comments', () => {\n const input = `\nfunction Example() {\n return (\n

\n {/* ... existing code ... */}\n

Hello, World!

\n {/* ...rest of component... */}\n
\n );\n}\n`\n const expected = `\nfunction Example() {\n return (\n
\n ${EXISTING_CODE_MARKER}\n

Hello, World!

\n ${EXISTING_CODE_MARKER}\n
\n );\n}\n`\n expect(\n replaceNonStandardPlaceholderComments(input, EXISTING_CODE_MARKER),\n ).toBe(expected)\n })\n})\n", - "referencedBy": {} - } - ] - } - ], - "parentAgentId": "D-gXwryrlBs" - }, - { - "type": "text", - "agentId": "D-gXwryrlBs", - "text": "Here's a brief summary of potentially useful files:\n\n* `common/src/util/examples/diff-reviewer-*.ts`: Example agent definitions for reviewing code diffs. Useful for understanding how to define agents that interact with `git diff` and the file system.\n* `common/src/util/changes.ts`: Functions for applying file changes (creations, modifications) to the file system, including applying patches.\n* `common/src/util/file.ts`: Functions for interacting with the file system, such as creating file trees, parsing file blocks, and validating file paths.\n* `common/src/util/git.ts`: Functions for executing Git commands, such as staging changes and committing.\n* `common/src/util/string.ts`: String manipulation functions.\n* `common/src/util/logger.ts`: Logging utilities with context.\n* `common/src/util/messages.ts`: Utilities for working with messages.\n* `common/src/util/object.ts`: Utilities for manipulating objects, e.g. removing undefined properties, comparing objects, adding objects, asserting conditions.\n\nThe files in `common/src/util/examples` provide concrete examples, while the other files offer utility functions that could be useful when working with files and Git.\n" - }, - { - "type": "subagent_finish", - "agentId": "D-gXwryrlBs", - "agentType": "file-picker", - "displayName": "Fletcher the File Fetcher", - "onlyChild": false, - "parentAgentId": "main-agent", - "prompt": "common/src/util/examples directory contents and related files" - }, - { - "type": "tool_call", - "toolCallId": "D-nFpuBEiW4", - "toolName": "str_replace", - "input": { - "path": "backend/src/templates/agents/agent-builder.ts", - "replacements": [ - { - "old": " spawnableAgents: allAvailableAgents\n ? (allAvailableAgents as any[])\n : [\n AgentTemplateTypes.file_picker,\n AgentTemplateTypes.researcher,\n AgentTemplateTypes.thinker,\n AgentTemplateTypes.reviewer,\n AgentTemplateTypes.agent_builder,\n ],\n", - "new": "", - "allowMultiple": false - } - ] - }, - "agentId": "D-gXwZERcWA", - "parentAgentId": "main-agent", - "includeToolCall": true - }, - { - "type": "tool_result", - "toolCallId": "D-nFpuBEiW4", - "toolName": "str_replace", - "output": [ - { - "type": "json", - "value": { - "file": "backend/src/templates/agents/agent-builder.ts", - "message": "Updated file", - "unifiedDiff": "@@ -126,17 +126,8 @@\n 'add_message',\n 'set_output',\n 'end_turn',\n ] satisfies ToolName[],\n- spawnableAgents: allAvailableAgents\n- ? (allAvailableAgents as any[])\n- : [\n- AgentTemplateTypes.file_picker,\n- AgentTemplateTypes.researcher,\n- AgentTemplateTypes.thinker,\n- AgentTemplateTypes.reviewer,\n- AgentTemplateTypes.agent_builder,\n- ],\n \n systemPrompt: [\n '# Bob the Agent Builder',\n '',\n" - } - } - ], - "parentAgentId": "D-gXwZERcWA" - }, - { - "type": "tool_call", - "toolCallId": "683b9ed2-e716-4808-949e-46be1b0d5c8b", - "toolName": "set_output", - "input": { - "output": { - "message": "", - "toolResults": [ - { - "file": "backend/src/templates/agents/agent-builder.ts", - "message": "Updated file", - "unifiedDiff": "@@ -126,17 +126,8 @@\n 'add_message',\n 'set_output',\n 'end_turn',\n ] satisfies ToolName[],\n- spawnableAgents: allAvailableAgents\n- ? (allAvailableAgents as any[])\n- : [\n- AgentTemplateTypes.file_picker,\n- AgentTemplateTypes.researcher,\n- AgentTemplateTypes.thinker,\n- AgentTemplateTypes.reviewer,\n- AgentTemplateTypes.agent_builder,\n- ],\n \n systemPrompt: [\n '# Bob the Agent Builder',\n '',\n" - } - ] - } - }, - "agentId": "D-gXwZERcWA", - "parentAgentId": "main-agent", - "includeToolCall": false - }, - { - "type": "tool_result", - "toolCallId": "683b9ed2-e716-4808-949e-46be1b0d5c8b", - "toolName": "set_output", - "output": [ - { - "type": "json", - "value": { - "message": "Output set" - } - } - ], - "parentAgentId": "D-gXwZERcWA" - }, - { - "type": "subagent_finish", - "agentId": "D-gXwZERcWA", - "agentType": "editor-gpt-5", - "displayName": "Code Editor", - "onlyChild": false, - "parentAgentId": "main-agent", - "prompt": "" - }, - { - "type": "tool_result", - "toolCallId": "D-gXircIAUI", - "toolName": "spawn_agents", - "output": [ - { - "type": "json", - "value": [ - { - "agentName": "Code Editor", - "agentType": "editor-gpt-5", - "value": { - "type": "structuredOutput", - "value": { - "output": { - "message": "", - "toolResults": [ - { - "file": "backend/src/templates/agents/agent-builder.ts", - "message": "Updated file", - "unifiedDiff": "@@ -126,17 +126,8 @@\n 'add_message',\n 'set_output',\n 'end_turn',\n ] satisfies ToolName[],\n- spawnableAgents: allAvailableAgents\n- ? (allAvailableAgents as any[])\n- : [\n- AgentTemplateTypes.file_picker,\n- AgentTemplateTypes.researcher,\n- AgentTemplateTypes.thinker,\n- AgentTemplateTypes.reviewer,\n- AgentTemplateTypes.agent_builder,\n- ],\n \n systemPrompt: [\n '# Bob the Agent Builder',\n '',\n" - } - ] - } - } - } - }, - { - "agentName": "Code Searcher", - "agentType": "code-searcher", - "value": { - "type": "structuredOutput", - "value": { - "results": [ - { - "stdout": "No results", - "message": "Exit code: 1" - }, - { - "stdout": "No results", - "message": "Exit code: 1" - } - ] - } - } - }, - { - "agentName": "Fletcher the File Fetcher", - "agentType": "file-picker", - "value": { - "type": "lastMessage", - "value": [ - { - "role": "assistant", - "content": [ - { - "type": "text", - "text": "Here's a brief summary of potentially useful files:\n\n* `common/src/util/examples/diff-reviewer-*.ts`: Example agent definitions for reviewing code diffs. Useful for understanding how to define agents that interact with `git diff` and the file system.\n* `common/src/util/changes.ts`: Functions for applying file changes (creations, modifications) to the file system, including applying patches.\n* `common/src/util/file.ts`: Functions for interacting with the file system, such as creating file trees, parsing file blocks, and validating file paths.\n* `common/src/util/git.ts`: Functions for executing Git commands, such as staging changes and committing.\n* `common/src/util/string.ts`: String manipulation functions.\n* `common/src/util/logger.ts`: Logging utilities with context.\n* `common/src/util/messages.ts`: Utilities for working with messages.\n* `common/src/util/object.ts`: Utilities for manipulating objects, e.g. removing undefined properties, comparing objects, adding objects, asserting conditions.\n\nThe files in `common/src/util/examples` provide concrete examples, while the other files offer utility functions that could be useful when working with files and Git.\n" - } - ] - } - ] - } - }, - { - "agentName": "Commander Lite", - "agentType": "commander-lite", - "value": { - "type": "lastMessage", - "value": [ - { - "role": "assistant", - "content": [ - { - "type": "text", - "text": "### Root `package.json`\n- **format**: `\"prettier --write \\\"**/*.{ts,tsx,json,md}\\\"\"`\n- **typecheck**: `\"bun --filter='*' run typecheck && echo '✅ All type checks passed!'\"`\n- **test**: `\"bun --filter='{@codebuff/backend,@codebuff/common,@codebuff/npm-app}' run test\"`\n- No `lint` script.\n\n### `scripts/package.json`\n- **typecheck**: `\"tsc --noEmit -p .\"`\n- **test**: `\"bun test\"`\n- No `lint` or `format` scripts.\n\n### `backend/package.json`\n- **typecheck**: `\"tsc --noEmit -p .\"`\n- **test**: `\"bun test\"`\n- No `lint` or `format` scripts.\n\n### `common/package.json`\n- **typecheck**: `\"tsc --noEmit -p .\"`\n- **test**: `\"bun test\"`\n- No `lint` or `format` scripts." - } - ] - } - ] - } - } - ] - } - ] - }, - { - "type": "tool_call", - "toolCallId": "c0b8970e-2255-4ee7-8066-89f0c00d5803", - "toolName": "spawn_agent_inline", - "input": { - "agent_type": "context-pruner", - "params": {} - }, - "agentId": "main-agent", - "includeToolCall": false - }, - { - "type": "tool_result", - "toolCallId": "c0b8970e-2255-4ee7-8066-89f0c00d5803", - "toolName": "spawn_agent_inline", - "output": [ - { - "type": "json", - "value": { - "message": "Agent spawned." - } - } - ] - }, - { - "type": "tool_call", - "toolCallId": "D-oWnvQd5aA", - "toolName": "spawn_agents", - "input": { - "agents": [ - { - "agent_type": "editor-gpt-5" - } - ] - }, - "agentId": "main-agent", - "includeToolCall": true - }, - { - "type": "tool_call", - "toolCallId": "D-oYtCzzjlw", - "toolName": "spawn_agents", - "input": { - "agents": [ - { - "agent_type": "commander-lite", - "prompt": "Run root typecheck to validate TypeScript changes.", - "params": { - "command": "bun run typecheck", - "timeout_seconds": 120 - } - }, - { - "agent_type": "commander-lite", - "prompt": "Run relevant package tests if any affected.", - "params": { - "command": "bun run test", - "timeout_seconds": 120 - } - }, - { - "agent_type": "commander-lite", - "prompt": "Check if any formatting issues.", - "params": { - "command": "bun run format --check", - "timeout_seconds": 60 - } - } - ] - }, - "agentId": "main-agent", - "includeToolCall": true - }, - { - "type": "subagent_start", - "agentId": "D-oY2QIts4E", - "agentType": "editor-gpt-5", - "displayName": "Code Editor", - "onlyChild": true, - "parentAgentId": "main-agent", - "prompt": "" - }, - { - "type": "text", - "agentId": "D-oY2QIts4E", - "text": "\n{\n \"cb_tool_name\": \"write_file\",\n \"path\": \"backend/src/templates/agents/agent-builder.ts\",\n \"instructions\": \"Update agent builder to gather diff-reviewer examples plus a new starter template, keep examples under .agents/examples, copy starter into .agents root, and stop advertising spawnable agents.\",\n \"content\": \"import * as fs from 'fs'\\nimport * as path from 'path'\\n\\nimport { AGENT_TEMPLATES_DIR, AGENT_DEFINITION_FILE } from '@codebuff/common/constants'\\nimport { AgentTemplateTypes } from '@codebuff/common/types/session-state'\\nimport z from 'zod/v4'\\n\\nimport type { AgentTemplate } from '../types'\\nimport type { Model } from '@codebuff/common/constants'\\nimport type { ToolName } from '@codebuff/common/tools/constants'\\n\\nconst COMMON_UTIL_PATH = '../../../../common/src/util'\\nconst TEMPLATE_RELATIVE_PATH =\\n `${COMMON_UTIL_PATH}/types/${AGENT_DEFINITION_FILE}` as const\\n// Import to validate path exists at compile time\\nimport(TEMPLATE_RELATIVE_PATH)\\n\\nconst TEMPLATE_PATH = path.join(__dirname, TEMPLATE_RELATIVE_PATH)\\nconst TYPES_DIR = path.join(AGENT_TEMPLATES_DIR, 'types')\\nconst EXAMPLES_DIR = path.join(AGENT_TEMPLATES_DIR, 'examples')\\nconst TEMPLATE_TYPES_PATH = path.join(TYPES_DIR, AGENT_DEFINITION_FILE)\\nconst TOOL_DEFINITIONS_FILE = 'tools.d.ts'\\nconst TOOL_DEFINITIONS_PATH = path.join(TYPES_DIR, TOOL_DEFINITIONS_FILE)\\n\\nconst EXAMPLES_SOURCE_DIR = path.join(__dirname, `${COMMON_UTIL_PATH}/examples`)\\nconst STARTER_TEMPLATE_SOURCE_FILE = 'your-custom-agent.ts.txt'\\nconst STARTER_TEMPLATE_DEST_FILE = 'your-custom-agent.ts'\\n\\nexport const agentBuilder = (\\n model: Model,\\n _allAvailableAgents?: string[],\\n): Omit => {\\n // Read the AGENT_CONFIG_FILE content dynamically\\n // The import above ensures this path exists at compile time\\n let agentTemplateContent = ''\\n try {\\n agentTemplateContent = fs.readFileSync(TEMPLATE_PATH, 'utf8')\\n } catch (error) {\\n console.warn(`Could not read ${AGENT_DEFINITION_FILE}:`, error)\\n agentTemplateContent = '// Agent template types not available'\\n }\\n\\n // Read the tools.d.ts content from common package\\n let toolDefinitionsContent = ''\\n try {\\n const toolsPath = path.join(\\n __dirname,\\n `${COMMON_UTIL_PATH}/types/tools.d.ts`,\\n )\\n toolDefinitionsContent = fs.readFileSync(toolsPath, 'utf8')\\n } catch (error) {\\n console.warn(`Could not read tools.d.ts from common:`, error)\\n toolDefinitionsContent = '// Tool definitions not available'\\n }\\n\\n // Read example agent files + starter template from common package\\n const exampleAgentContents: Record = {}\\n let starterTemplateContent = ''\\n\\n try {\\n if (fs.existsSync(EXAMPLES_SOURCE_DIR)) {\\n const files = fs.readdirSync(EXAMPLES_SOURCE_DIR)\\n\\n files\\n .filter(\\n (file) => file.endsWith('.ts') && file.startsWith('diff-reviewer-'),\\n )\\n .forEach((filename) => {\\n const fullPath = path.join(EXAMPLES_SOURCE_DIR, filename)\\n const content = fs.readFileSync(fullPath, 'utf8')\\n exampleAgentContents[filename] = content\\n })\\n\\n const starterTemplatePath = path.join(\\n EXAMPLES_SOURCE_DIR,\\n STARTER_TEMPLATE_SOURCE_FILE,\\n )\\n if (fs.existsSync(starterTemplatePath)) {\\n starterTemplateContent = fs.readFileSync(starterTemplatePath, 'utf8')\\n }\\n } else {\\n console.warn(\\n `Example agents directory does not exist: ${EXAMPLES_SOURCE_DIR}`,\\n )\\n }\\n } catch (error) {\\n console.warn('Could not read example agents:', error)\\n }\\n\\n return {\\n model,\\n displayName: 'Bob the Agent Builder',\\n spawnPurposePrompt:\\n 'Enhanced base agent that can create custom agents and handle all coding tasks with deterministic agent creation behavior',\\n inputSchema: {\\n prompt: z\\n .string()\\n .optional()\\n .describe(\\n 'What agent type you would like to create or edit. Include as many details as possible.',\\n ),\\n params: z\\n .object({\\n name: z.string().optional(),\\n purpose: z.string().optional(),\\n specialty: z.string().optional(),\\n model: z.string().optional(),\\n })\\n .passthrough()\\n .optional(),\\n },\\n outputMode: 'structured_output',\\n includeMessageHistory: false,\\n toolNames: [\\n 'write_file',\\n 'str_replace',\\n 'run_terminal_command',\\n 'read_files',\\n 'code_search',\\n 'spawn_agents',\\n 'add_message',\\n 'set_output',\\n 'end_turn',\\n ] satisfies ToolName[],\\n\\n systemPrompt: [\\n '# Bob the Agent Builder',\\n '',\\n 'You are an expert agent builder specialized in creating new agent templates for the codebuff system. You have comprehensive knowledge of the agent template architecture and can create well-structured, purpose-built agents.',\\n '',\\n '## Environment Setup Complete',\\n '',\\n 'Your environment has been automatically prepared with:',\\n '- Agent template type definitions in `.agents/types/agent-definition.d.ts`',\\n '- Tool type definitions in `.agents/types/tools.d.ts`',\\n '- Diff-reviewer examples in `.agents/examples/` for reference',\\n '- A starter custom agent template at `.agents/your-custom-agent.ts`',\\n '',\\n 'All necessary files are now available in your working directory.',\\n '',\\n '## Complete Agent Template Type Definitions',\\n '',\\n 'Here are the complete TypeScript type definitions for creating custom Codebuff agents:',\\n '```typescript',\\n agentTemplateContent,\\n '```',\\n '',\\n '## Available Tools Type Definitions',\\n '',\\n 'Here are the complete TypeScript type definitions for all available tools:',\\n '',\\n '```typescript',\\n toolDefinitionsContent,\\n '```',\\n '',\\n '## Agent Template Patterns:',\\n '',\\n '1. **Base Agent Pattern**: Full-featured agents with comprehensive tool access',\\n '2. **Specialized Agent Pattern**: Focused agents with limited tool sets',\\n '3. **Thinking Agent Pattern**: Agents that spawn thinker sub-agents',\\n '4. **Research Agent Pattern**: Agents that start with web search',\\n '',\\n '## Best Practices:',\\n '',\\n '1. **Use as few fields as possible**: Leave out fields that are not needed to reduce complexity',\\n '2. **Minimal Tools**: Only include tools the agent actually needs',\\n '3. **Clear and Concise Prompts**: Write clear, specific prompts that have no unnecessary words',\\n '4. **Consistent Naming**: Follow naming conventions (kebab-case for IDs)',\\n '5. **Appropriate Model**: Choose the right model for the task complexity. Default is claude-4-sonnet-20250522 for medium-high complexity tasks, and openai/gpt-5 for all other tasks.',\\n '',\\n '## Your Task:',\\n 'When asked to create an agent template, you should:',\\n \\\"1. Understand the requested agent's purpose and capabilities\\\",\\n \\\"2. Choose appropriate tools for the agent's function\\\",\\n '3. Write a comprehensive system prompt',\\n `4. Create the complete agent template file in ${AGENT_TEMPLATES_DIR}`,\\n '5. Ensure the template follows all conventions and best practices',\\n '6. Use the AgentDefinition interface for the configuration',\\n '7. Start the file with: import type { AgentDefinition } from \\\"./types/agent-definition.d.ts\\\"',\\n '',\\n 'Create agent templates that are focused, efficient, and well-documented. Always import the AgentDefinition type and export a default configuration object.',\\n ].join('\\\\n'),\\n instructionsPrompt: `You are helping to create or edit an agent template. The user will describe what kind of agent they want to create or how they want to modify an existing agent.\\n\\n## Environment Ready\\n\\nYour environment has been automatically set up with:\\n- Type definitions in \\\\`.agents/types/\\\\`\\n- Diff-reviewer examples in \\\\`.agents/examples/\\\\`\\n- A starter custom agent template at \\\\`.agents/your-custom-agent.ts\\\\`\\n\\nYou can now proceed directly to agent creation or editing.\\n\\n## Example Agents Available\\n\\nThree diff-reviewer examples are available in \\\\`.agents/examples/\\\\`. These can serve as examples of well-made agents at different stages of complexity.\\n\\n**IMPORTANT**: Examine these examples to find connections and patterns that relate to the user's request. Look for:\\n- Similar tool combinations\\n- Comparable complexity levels\\n- Related functionality patterns\\n- Appropriate model choices\\n- Relevant prompt structures\\n\\nUse these examples as inspiration and starting points, adapting their patterns to fit the user's specific needs.\\n\\n## Starter Template Available\\n\\nA starter custom agent file is available at \\\\`.agents/your-custom-agent.ts\\\\`. You can either modify this file directly or use it as a reference for creating a new agent.\\n\\n## For New Agents\\n\\nAnalyze their request and create a complete agent template that:\\n- Has a clear purpose and appropriate capabilities\\n- Leaves out fields that are not needed\\n- Uses only the tools it needs\\n- Follows naming conventions\\n- Is properly structured\\n- Draws inspiration from relevant example agents\\n\\n## For Creating New Agents\\n\\nThe agent builder is focused on creating new agent templates based on user specifications.\\n\\nIMPORTANT: Always end your response with the end_turn tool when you have completed the agent creation or editing task.`,\\n stepPrompt: '',\\n\\n handleSteps: function* () {\\n // Step 1: Create directory structure\\n yield {\\n toolName: 'run_terminal_command',\\n args: {\\n command: `mkdir -p ${TYPES_DIR} && mkdir -p ${EXAMPLES_DIR}`,\\n process_type: 'SYNC',\\n timeout_seconds: 10,\\n },\\n }\\n\\n // Step 2: Write the AGENT_DEFINITION_FILE with the template content\\n yield {\\n toolName: 'write_file',\\n args: {\\n path: TEMPLATE_TYPES_PATH,\\n instructions: 'Create agent template type definitions file',\\n content: agentTemplateContent,\\n },\\n }\\n\\n // Step 3: Write the tool definitions file (copy from existing tools.d.ts)\\n yield {\\n toolName: 'write_file',\\n args: {\\n path: TOOL_DEFINITIONS_PATH,\\n instructions: 'Create tools type file',\\n content: toolDefinitionsContent,\\n },\\n }\\n\\n // Step 4: Add message about reading example files and then read them\\n yield {\\n toolName: 'add_message',\\n args: {\\n role: 'assistant',\\n content:\\n \\\"I'll review the starter template and diff-reviewer examples, then help you create your agent.\\\",\\n },\\n }\\n\\n // Step 5: Copy example agent files to .agents/examples/\\n for (const [filename, content] of Object.entries(exampleAgentContents)) {\\n if (content) {\\n yield {\\n toolName: 'write_file',\\n args: {\\n path: `${EXAMPLES_DIR}/${filename}`,\\n instructions: `Copy example agent file ${filename}`,\\n content: content,\\n },\\n }\\n }\\n }\\n\\n // Step 6: Copy starter template directly to .agents/\\n if (starterTemplateContent) {\\n yield {\\n toolName: 'write_file',\\n args: {\\n path: `${AGENT_TEMPLATES_DIR}/${STARTER_TEMPLATE_DEST_FILE}`,\\n instructions: `Copy starter custom agent template ${STARTER_TEMPLATE_DEST_FILE}`,\\n content: starterTemplateContent,\\n },\\n }\\n }\\n\\n // Step 7: Complete agent creation process\\n yield 'STEP_ALL'\\n },\\n }\\n}\\n\"\n}\n\n\n\n{\n \"cb_tool_name\": \"str_replace\",\n \"path\": \"common/src/constants/agents.ts\",\n \"replacements\": [\n {\n \"old\": \" dry_run: {\\n displayName: 'Sketch the Dry Runner',\\n purpose: 'Agent that takes a plan and try to implement it in a dry run.',\\n hidden: true,\\n } as const,\\n\",\n \"new\": \"\"\n },\n {\n \"old\": \" agent_builder: {\\n displayName: 'Bob the Agent Builder',\\n purpose: 'Creates new agent templates for the codebuff mult-agent system',\\n hidden: false,\\n } as const,\\n\",\n \"new\": \" agent_builder: {\\n displayName: 'Bob the Agent Builder',\\n purpose: 'Creates new agent templates for the codebuff multi-agent system',\\n hidden: false,\\n } as const,\\n\"\n }\n ]\n}\n\n\n\n{\n \"cb_tool_name\": \"write_file\",\n \"path\": \".agents/examples/diff-reviewer-1.ts\",\n \"instructions\": \"Refresh diff-reviewer-1 example to use current Anthropic model.\",\n \"content\": \"import type { AgentDefinition } from '../types/agent-definition'\\n\\nconst definition: AgentDefinition = {\\n id: 'diff-reviewer-1',\\n\\n displayName: 'Diff Reviewer (Level 1)',\\n model: 'anthropic/claude-4-sonnet-20250522',\\n toolNames: ['read_files', 'run_terminal_command'],\\n\\n spawnPurposePrompt:\\n 'Spawn when you need to review code changes in the git diff',\\n\\n instructionsPrompt: `Execute the following steps:\\n1. Run git diff\\n2. Read the files that have changed\\n3. Review the changes and suggest improvements`,\\n}\\n\\nexport default definition\\n\"\n}\n\n\n\n{\n \"cb_tool_name\": \"write_file\",\n \"path\": \".agents/examples/diff-reviewer-2.ts\",\n \"instructions\": \"Refresh diff-reviewer-2 example to use current Anthropic model.\",\n \"content\": \"import type {\\n AgentDefinition,\\n AgentStepContext,\\n} from '../types/agent-definition'\\n\\nconst definition: AgentDefinition = {\\n id: 'diff-reviewer-2',\\n displayName: 'Diff Reviewer (Level 2)',\\n model: 'anthropic/claude-4-sonnet-20250522',\\n\\n inputSchema: {\\n prompt: {\\n type: 'string',\\n description:\\n 'Please provide a short description of the changes you want to review',\\n },\\n },\\n toolNames: ['read_files', 'run_terminal_command'],\\n\\n spawnPurposePrompt:\\n 'Spawn when you need to review code changes in the git diff',\\n\\n systemPrompt:\\n 'You are an expert software developer. Your job is to review code changes and provide helpful feedback.',\\n\\n instructionsPrompt: `Execute the following steps:\\n1. Run git diff\\n2. Read the files that have changed\\n3. Review the changes and suggest improvements\\n\\nUse the following guidelines while reviewing the changes:\\n- Find ways to simplify the code\\n- Reuse existing code as much as possible instead of writing new code\\n- Preserve as much behavior as possible in the existing code\\n- Prefer changing as few lines of code as possible\\n- Look for opportunities to improve the code's readability\\n- Look for logical errors in the code\\n- Look for missed cases in the code\\n- Look for any other bugs`,\\n\\n handleSteps: function* ({ prompt }: AgentStepContext) {\\n // Step 1: Run git diff immediately. Saves the agent a step, lowering cost and latency!\\n yield {\\n toolName: 'run_terminal_command',\\n args: {\\n command: 'git diff',\\n },\\n }\\n\\n // Step 2: Let AI run the rest of the steps!\\n yield 'STEP_ALL'\\n },\\n}\\n\\nexport default definition\\n\"\n}\n\n\n\n{\n \"cb_tool_name\": \"write_file\",\n \"path\": \".agents/examples/diff-reviewer-3.ts\",\n \"instructions\": \"Refresh diff-reviewer-3 example to use current Anthropic model, correct file-explorer spawn target, and streamline final step behavior.\",\n \"content\": \"import type {\\n AgentDefinition,\\n AgentStepContext,\\n} from '../types/agent-definition'\\n\\nconst definition: AgentDefinition = {\\n id: 'diff-reviewer-3',\\n\\n displayName: 'Diff Reviewer (Level 3)',\\n model: 'anthropic/claude-4-sonnet-20250522',\\n inputSchema: {\\n prompt: {\\n type: 'string',\\n description:\\n 'Please provide a short description of the changes you want to review',\\n },\\n },\\n outputMode: 'last_message',\\n\\n toolNames: ['read_files', 'run_terminal_command', 'spawn_agents'],\\n spawnableAgents: ['file-explorer'],\\n\\n spawnPurposePrompt:\\n 'Spawn when you need to review code changes in the git diff',\\n\\n systemPrompt:\\n 'You are an expert software developer. Your job is to review code changes and provide helpful feedback.',\\n\\n instructionsPrompt: `Review the changes and suggest improvements.\\n\\nUse the following guidelines while reviewing the changes:\\n- Find ways to simplify the code\\n- Reuse existing code as much as possible instead of writing new code\\n- Preserve as much behavior as possible in the existing code\\n- Prefer changing as few lines of code as possible\\n- Look for opportunities to improve the code's readability\\n- Look for logical errors in the code\\n- Look for missed cases in the code\\n- Look for any other bugs`,\\n\\n handleSteps: function* ({ prompt }: AgentStepContext) {\\n // Step 1: Get list of changed files from git diff --name-only\\n const { toolResult: gitDiffFilesResult } = yield {\\n toolName: 'run_terminal_command',\\n args: {\\n command: 'git diff --name-only',\\n },\\n }\\n\\n const changedFiles = (gitDiffFilesResult || '')\\n .split('\\\\n')\\n .map((line) => line.trim())\\n .filter((line) => line && !line.startsWith('??') && !line.includes('OSC'))\\n\\n // Step 2: Read changed files\\n if (changedFiles.length > 0) {\\n yield {\\n toolName: 'read_files',\\n args: {\\n paths: changedFiles,\\n },\\n }\\n }\\n\\n // Step 3: Run full git diff to see the actual changes\\n yield {\\n toolName: 'run_terminal_command',\\n args: {\\n command: 'git diff',\\n },\\n }\\n\\n // Step 4: Spawn file explorer for broader context if needed\\n yield {\\n toolName: 'spawn_agents',\\n args: {\\n agents: [\\n {\\n agent_type: 'file-explorer',\\n prompt: `Find any additional codebase context needed to review these changes. Review focus: ${prompt || ''}`,\\n params: {\\n prompts: [\\n 'Any modules/classes/functions referenced by the diff',\\n 'Relevant tests or test helpers for the changed code',\\n 'Related config or shared utilities that might be impacted',\\n ],\\n },\\n },\\n ],\\n },\\n }\\n\\n // Step 5: Let the AI produce the final review in a single final step\\n yield 'STEP_ALL'\\n },\\n}\\n\\nexport default definition\\n\"\n}\n\n\n\n{\n \"cb_tool_name\": \"write_file\",\n \"path\": \"common/src/util/examples/diff-reviewer-1.ts\",\n \"instructions\": \"Refresh common diff-reviewer-1 example to use current Anthropic model.\",\n \"content\": \"import type { AgentDefinition } from '../types/agent-definition'\\n\\nconst definition: AgentDefinition = {\\n id: 'diff-reviewer-1',\\n\\n displayName: 'Diff Reviewer (Level 1)',\\n model: 'anthropic/claude-4-sonnet-20250522',\\n toolNames: ['read_files', 'run_terminal_command'],\\n\\n spawnPurposePrompt:\\n 'Spawn when you need to review code changes in the git diff',\\n\\n instructionsPrompt: `Execute the following steps:\\n1. Run git diff\\n2. Read the files that have changed\\n3. Review the changes and suggest improvements`,\\n}\\n\\nexport default definition\\n\"\n}\n\n\n\n{\n \"cb_tool_name\": \"write_file\",\n \"path\": \"common/src/util/examples/diff-reviewer-2.ts\",\n \"instructions\": \"Refresh common diff-reviewer-2 example to use current Anthropic model.\",\n \"content\": \"import type {\\n AgentDefinition,\\n AgentStepContext,\\n} from '../types/agent-definition'\\n\\nconst definition: AgentDefinition = {\\n id: 'diff-reviewer-2',\\n displayName: 'Diff Reviewer (Level 2)',\\n model: 'anthropic/claude-4-sonnet-20250522',\\n\\n inputSchema: {\\n prompt: {\\n type: 'string',\\n description:\\n 'Please provide a short description of the changes you want to review',\\n },\\n },\\n toolNames: ['read_files', 'run_terminal_command'],\\n\\n spawnPurposePrompt:\\n 'Spawn when you need to review code changes in the git diff',\\n\\n systemPrompt:\\n 'You are an expert software developer. Your job is to review code changes and provide helpful feedback.',\\n\\n instructionsPrompt: `Execute the following steps:\\n1. Run git diff\\n2. Read the files that have changed\\n3. Review the changes and suggest improvements\\n\\nUse the following guidelines while reviewing the changes:\\n- Find ways to simplify the code\\n- Reuse existing code as much as possible instead of writing new code\\n- Preserve as much behavior as possible in the existing code\\n- Prefer changing as few lines of code as possible\\n- Look for opportunities to improve the code's readability\\n- Look for logical errors in the code\\n- Look for missed cases in the code\\n- Look for any other bugs`,\\n\\n handleSteps: function* ({ prompt }: AgentStepContext) {\\n // Step 1: Run git diff immediately. Saves the agent a step, lowering cost and latency!\\n yield {\\n toolName: 'run_terminal_command',\\n args: {\\n command: 'git diff',\\n },\\n }\\n\\n // Step 2: Let AI run the rest of the steps!\\n yield 'STEP_ALL'\\n },\\n}\\n\\nexport default definition\\n\"\n}\n\n\n\n{\n \"cb_tool_name\": \"write_file\",\n \"path\": \"common/src/util/examples/diff-reviewer-3.ts\",\n \"instructions\": \"Refresh common diff-reviewer-3 example to use current Anthropic model, correct file-explorer spawn target, and streamline final step behavior.\",\n \"content\": \"import type {\\n AgentDefinition,\\n AgentStepContext,\\n} from '../types/agent-definition'\\n\\nconst definition: AgentDefinition = {\\n id: 'diff-reviewer-3',\\n\\n displayName: 'Diff Reviewer (Level 3)',\\n model: 'anthropic/claude-4-sonnet-20250522',\\n inputSchema: {\\n prompt: {\\n type: 'string',\\n description:\\n 'Please provide a short description of the changes you want to review',\\n },\\n },\\n outputMode: 'last_message',\\n\\n toolNames: ['read_files', 'run_terminal_command', 'spawn_agents'],\\n spawnableAgents: ['file-explorer'],\\n\\n spawnPurposePrompt:\\n 'Spawn when you need to review code changes in the git diff',\\n\\n systemPrompt:\\n 'You are an expert software developer. Your job is to review code changes and provide helpful feedback.',\\n\\n instructionsPrompt: `Review the changes and suggest improvements.\\n\\nUse the following guidelines while reviewing the changes:\\n- Find ways to simplify the code\\n- Reuse existing code as much as possible instead of writing new code\\n- Preserve as much behavior as possible in the existing code\\n- Prefer changing as few lines of code as possible\\n- Look for opportunities to improve the code's readability\\n- Look for logical errors in the code\\n- Look for missed cases in the code\\n- Look for any other bugs`,\\n\\n handleSteps: function* ({ prompt }: AgentStepContext) {\\n // Step 1: Get list of changed files from git diff --name-only\\n const { toolResult: gitDiffFilesResult } = yield {\\n toolName: 'run_terminal_command',\\n args: {\\n command: 'git diff --name-only',\\n },\\n }\\n\\n const changedFiles = (gitDiffFilesResult || '')\\n .split('\\\\n')\\n .map((line) => line.trim())\\n .filter((line) => line && !line.startsWith('??') && !line.includes('OSC'))\\n\\n // Step 2: Read changed files\\n if (changedFiles.length > 0) {\\n yield {\\n toolName: 'read_files',\\n args: {\\n paths: changedFiles,\\n },\\n }\\n }\\n\\n // Step 3: Run full git diff to see the actual changes\\n yield {\\n toolName: 'run_terminal_command',\\n args: {\\n command: 'git diff',\\n },\\n }\\n\\n // Step 4: Spawn file explorer for broader context if needed\\n yield {\\n toolName: 'spawn_agents',\\n args: {\\n agents: [\\n {\\n agent_type: 'file-explorer',\\n prompt: `Find any additional codebase context needed to review these changes. Review focus: ${prompt || ''}`,\\n params: {\\n prompts: [\\n 'Any modules/classes/functions referenced by the diff',\\n 'Relevant tests or test helpers for the changed code',\\n 'Related config or shared utilities that might be impacted',\\n ],\\n },\\n },\\n ],\\n },\\n }\\n\\n // Step 5: Let the AI produce the final review in a single final step\\n yield 'STEP_ALL'\\n },\\n}\\n\\nexport default definition\\n\"\n}\n\n\n\n{\n \"cb_tool_name\": \"write_file\",\n \"path\": \".agents/your-custom-agent.ts\",\n \"instructions\": \"Add a new starter custom agent (Git Committer scaffold) in the top-level .agents directory, ready to run and publish.\",\n \"content\": \"import { publisher, version } from './constants'\\n\\nimport type {\\n AgentDefinition,\\n AgentStepContext,\\n} from './types/agent-definition'\\n\\nconst definition: AgentDefinition = {\\n id: 'your-custom-agent',\\n version,\\n publisher,\\n\\n displayName: 'Your Custom Agent (Git Committer)',\\n model: 'anthropic/claude-4-sonnet-20250522',\\n toolNames: ['read_files', 'run_terminal_command', 'add_message', 'end_turn'],\\n\\n inputSchema: {\\n prompt: {\\n type: 'string',\\n description: 'What changes to commit',\\n },\\n },\\n\\n includeMessageHistory: false,\\n outputMode: 'last_message',\\n\\n spawnPurposePrompt:\\n 'Spawn when you need to commit code changes to git with an appropriate commit message',\\n\\n systemPrompt:\\n 'You are an expert software developer. Your job is to create a git commit with a really good commit message.',\\n\\n instructionsPrompt:\\n 'Follow the steps to create a good commit: analyze changes with git diff and git log, read relevant files for context, stage appropriate files, and create a commit with proper formatting including the Codebuff footer.',\\n\\n handleSteps: function* ({ prompt }: AgentStepContext) {\\n // Step 1: Analyze the changes\\n yield {\\n toolName: 'run_terminal_command',\\n args: {\\n command: 'git diff',\\n process_type: 'SYNC',\\n timeout_seconds: 30,\\n },\\n }\\n\\n yield {\\n toolName: 'run_terminal_command',\\n args: {\\n command: 'git log --oneline -10',\\n process_type: 'SYNC',\\n timeout_seconds: 30,\\n },\\n }\\n\\n // Step 2: Let the AI decide what to read + what to stage based on the user's intent\\n yield {\\n toolName: 'add_message',\\n args: {\\n role: 'assistant',\\n content: `Goal: ${prompt}\\\\n\\\\nI'll read any relevant files and stage the right changes next.`,\\n },\\n }\\n\\n yield 'STEP'\\n\\n // Step 3: Let the AI create the commit with proper formatting\\n yield {\\n toolName: 'add_message',\\n args: {\\n role: 'assistant',\\n content:\\n \\\"Now I'll create the commit with a high-quality message and the proper Codebuff footer format.\\\",\\n },\\n }\\n\\n yield 'STEP_ALL'\\n },\\n}\\n\\nexport default definition\\n\"\n}\n\n\n\n{\n \"cb_tool_name\": \"write_file\",\n \"path\": \"common/src/util/examples/your-custom-agent.ts.txt\",\n \"instructions\": \"Add starter custom agent template content for the agent builder to copy into .agents/your-custom-agent.ts.\",\n \"content\": \"import { publisher, version } from './constants'\\n\\nimport type {\\n AgentDefinition,\\n AgentStepContext,\\n} from './types/agent-definition'\\n\\nconst definition: AgentDefinition = {\\n id: 'your-custom-agent',\\n version,\\n publisher,\\n\\n displayName: 'Your Custom Agent (Git Committer)',\\n model: 'anthropic/claude-4-sonnet-20250522',\\n toolNames: ['read_files', 'run_terminal_command', 'add_message', 'end_turn'],\\n\\n inputSchema: {\\n prompt: {\\n type: 'string',\\n description: 'What changes to commit',\\n },\\n },\\n\\n includeMessageHistory: false,\\n outputMode: 'last_message',\\n\\n spawnPurposePrompt:\\n 'Spawn when you need to commit code changes to git with an appropriate commit message',\\n\\n systemPrompt:\\n 'You are an expert software developer. Your job is to create a git commit with a really good commit message.',\\n\\n instructionsPrompt:\\n 'Follow the steps to create a good commit: analyze changes with git diff and git log, read relevant files for context, stage appropriate files, and create a commit with proper formatting including the Codebuff footer.',\\n\\n handleSteps: function* ({ prompt }: AgentStepContext) {\\n // Step 1: Analyze the changes\\n yield {\\n toolName: 'run_terminal_command',\\n args: {\\n command: 'git diff',\\n process_type: 'SYNC',\\n timeout_seconds: 30,\\n },\\n }\\n\\n yield {\\n toolName: 'run_terminal_command',\\n args: {\\n command: 'git log --oneline -10',\\n process_type: 'SYNC',\\n timeout_seconds: 30,\\n },\\n }\\n\\n // Step 2: Let the AI decide what to read + what to stage based on the user's intent\\n yield {\\n toolName: 'add_message',\\n args: {\\n role: 'assistant',\\n content: `Goal: ${prompt}\\\\n\\\\nI'll read any relevant files and stage the right changes next.`,\\n },\\n }\\n\\n yield 'STEP'\\n\\n // Step 3: Let the AI create the commit with proper formatting\\n yield {\\n toolName: 'add_message',\\n args: {\\n role: 'assistant',\\n content:\\n \\\"Now I'll create the commit with a high-quality message and the proper Codebuff footer format.\\\",\\n },\\n }\\n\\n yield 'STEP_ALL'\\n },\\n}\\n\\nexport default definition\\n\"\n}\n" - }, - { - "type": "tool_call", - "toolCallId": "236eaf27-5781-488d-bcb0-48431ca62da1", - "toolName": "write_file", - "input": { - "path": "backend/src/templates/agents/agent-builder.ts", - "instructions": "Update agent builder to gather diff-reviewer examples plus a new starter template, keep examples under .agents/examples, copy starter into .agents root, and stop advertising spawnable agents.", - "content": "import * as fs from 'fs'\nimport * as path from 'path'\n\nimport { AGENT_TEMPLATES_DIR, AGENT_DEFINITION_FILE } from '@codebuff/common/constants'\nimport { AgentTemplateTypes } from '@codebuff/common/types/session-state'\nimport z from 'zod/v4'\n\nimport type { AgentTemplate } from '../types'\nimport type { Model } from '@codebuff/common/constants'\nimport type { ToolName } from '@codebuff/common/tools/constants'\n\nconst COMMON_UTIL_PATH = '../../../../common/src/util'\nconst TEMPLATE_RELATIVE_PATH =\n `${COMMON_UTIL_PATH}/types/${AGENT_DEFINITION_FILE}` as const\n// Import to validate path exists at compile time\nimport(TEMPLATE_RELATIVE_PATH)\n\nconst TEMPLATE_PATH = path.join(__dirname, TEMPLATE_RELATIVE_PATH)\nconst TYPES_DIR = path.join(AGENT_TEMPLATES_DIR, 'types')\nconst EXAMPLES_DIR = path.join(AGENT_TEMPLATES_DIR, 'examples')\nconst TEMPLATE_TYPES_PATH = path.join(TYPES_DIR, AGENT_DEFINITION_FILE)\nconst TOOL_DEFINITIONS_FILE = 'tools.d.ts'\nconst TOOL_DEFINITIONS_PATH = path.join(TYPES_DIR, TOOL_DEFINITIONS_FILE)\n\nconst EXAMPLES_SOURCE_DIR = path.join(__dirname, `${COMMON_UTIL_PATH}/examples`)\nconst STARTER_TEMPLATE_SOURCE_FILE = 'your-custom-agent.ts.txt'\nconst STARTER_TEMPLATE_DEST_FILE = 'your-custom-agent.ts'\n\nexport const agentBuilder = (\n model: Model,\n _allAvailableAgents?: string[],\n): Omit => {\n // Read the AGENT_CONFIG_FILE content dynamically\n // The import above ensures this path exists at compile time\n let agentTemplateContent = ''\n try {\n agentTemplateContent = fs.readFileSync(TEMPLATE_PATH, 'utf8')\n } catch (error) {\n console.warn(`Could not read ${AGENT_DEFINITION_FILE}:`, error)\n agentTemplateContent = '// Agent template types not available'\n }\n\n // Read the tools.d.ts content from common package\n let toolDefinitionsContent = ''\n try {\n const toolsPath = path.join(\n __dirname,\n `${COMMON_UTIL_PATH}/types/tools.d.ts`,\n )\n toolDefinitionsContent = fs.readFileSync(toolsPath, 'utf8')\n } catch (error) {\n console.warn(`Could not read tools.d.ts from common:`, error)\n toolDefinitionsContent = '// Tool definitions not available'\n }\n\n // Read example agent files + starter template from common package\n const exampleAgentContents: Record = {}\n let starterTemplateContent = ''\n\n try {\n if (fs.existsSync(EXAMPLES_SOURCE_DIR)) {\n const files = fs.readdirSync(EXAMPLES_SOURCE_DIR)\n\n files\n .filter(\n (file) => file.endsWith('.ts') && file.startsWith('diff-reviewer-'),\n )\n .forEach((filename) => {\n const fullPath = path.join(EXAMPLES_SOURCE_DIR, filename)\n const content = fs.readFileSync(fullPath, 'utf8')\n exampleAgentContents[filename] = content\n })\n\n const starterTemplatePath = path.join(\n EXAMPLES_SOURCE_DIR,\n STARTER_TEMPLATE_SOURCE_FILE,\n )\n if (fs.existsSync(starterTemplatePath)) {\n starterTemplateContent = fs.readFileSync(starterTemplatePath, 'utf8')\n }\n } else {\n console.warn(\n `Example agents directory does not exist: ${EXAMPLES_SOURCE_DIR}`,\n )\n }\n } catch (error) {\n console.warn('Could not read example agents:', error)\n }\n\n return {\n model,\n displayName: 'Bob the Agent Builder',\n spawnPurposePrompt:\n 'Enhanced base agent that can create custom agents and handle all coding tasks with deterministic agent creation behavior',\n inputSchema: {\n prompt: z\n .string()\n .optional()\n .describe(\n 'What agent type you would like to create or edit. Include as many details as possible.',\n ),\n params: z\n .object({\n name: z.string().optional(),\n purpose: z.string().optional(),\n specialty: z.string().optional(),\n model: z.string().optional(),\n })\n .passthrough()\n .optional(),\n },\n outputMode: 'structured_output',\n includeMessageHistory: false,\n toolNames: [\n 'write_file',\n 'str_replace',\n 'run_terminal_command',\n 'read_files',\n 'code_search',\n 'spawn_agents',\n 'add_message',\n 'set_output',\n 'end_turn',\n ] satisfies ToolName[],\n\n systemPrompt: [\n '# Bob the Agent Builder',\n '',\n 'You are an expert agent builder specialized in creating new agent templates for the codebuff system. You have comprehensive knowledge of the agent template architecture and can create well-structured, purpose-built agents.',\n '',\n '## Environment Setup Complete',\n '',\n 'Your environment has been automatically prepared with:',\n '- Agent template type definitions in `.agents/types/agent-definition.d.ts`',\n '- Tool type definitions in `.agents/types/tools.d.ts`',\n '- Diff-reviewer examples in `.agents/examples/` for reference',\n '- A starter custom agent template at `.agents/your-custom-agent.ts`',\n '',\n 'All necessary files are now available in your working directory.',\n '',\n '## Complete Agent Template Type Definitions',\n '',\n 'Here are the complete TypeScript type definitions for creating custom Codebuff agents:',\n '```typescript',\n agentTemplateContent,\n '```',\n '',\n '## Available Tools Type Definitions',\n '',\n 'Here are the complete TypeScript type definitions for all available tools:',\n '',\n '```typescript',\n toolDefinitionsContent,\n '```',\n '',\n '## Agent Template Patterns:',\n '',\n '1. **Base Agent Pattern**: Full-featured agents with comprehensive tool access',\n '2. **Specialized Agent Pattern**: Focused agents with limited tool sets',\n '3. **Thinking Agent Pattern**: Agents that spawn thinker sub-agents',\n '4. **Research Agent Pattern**: Agents that start with web search',\n '',\n '## Best Practices:',\n '',\n '1. **Use as few fields as possible**: Leave out fields that are not needed to reduce complexity',\n '2. **Minimal Tools**: Only include tools the agent actually needs',\n '3. **Clear and Concise Prompts**: Write clear, specific prompts that have no unnecessary words',\n '4. **Consistent Naming**: Follow naming conventions (kebab-case for IDs)',\n '5. **Appropriate Model**: Choose the right model for the task complexity. Default is claude-4-sonnet-20250522 for medium-high complexity tasks, and openai/gpt-5 for all other tasks.',\n '',\n '## Your Task:',\n 'When asked to create an agent template, you should:',\n \"1. Understand the requested agent's purpose and capabilities\",\n \"2. Choose appropriate tools for the agent's function\",\n '3. Write a comprehensive system prompt',\n `4. Create the complete agent template file in ${AGENT_TEMPLATES_DIR}`,\n '5. Ensure the template follows all conventions and best practices',\n '6. Use the AgentDefinition interface for the configuration',\n '7. Start the file with: import type { AgentDefinition } from \"./types/agent-definition.d.ts\"',\n '',\n 'Create agent templates that are focused, efficient, and well-documented. Always import the AgentDefinition type and export a default configuration object.',\n ].join('\\n'),\n instructionsPrompt: `You are helping to create or edit an agent template. The user will describe what kind of agent they want to create or how they want to modify an existing agent.\n\n## Environment Ready\n\nYour environment has been automatically set up with:\n- Type definitions in \\`.agents/types/\\`\n- Diff-reviewer examples in \\`.agents/examples/\\`\n- A starter custom agent template at \\`.agents/your-custom-agent.ts\\`\n\nYou can now proceed directly to agent creation or editing.\n\n## Example Agents Available\n\nThree diff-reviewer examples are available in \\`.agents/examples/\\`. These can serve as examples of well-made agents at different stages of complexity.\n\n**IMPORTANT**: Examine these examples to find connections and patterns that relate to the user's request. Look for:\n- Similar tool combinations\n- Comparable complexity levels\n- Related functionality patterns\n- Appropriate model choices\n- Relevant prompt structures\n\nUse these examples as inspiration and starting points, adapting their patterns to fit the user's specific needs.\n\n## Starter Template Available\n\nA starter custom agent file is available at \\`.agents/your-custom-agent.ts\\`. You can either modify this file directly or use it as a reference for creating a new agent.\n\n## For New Agents\n\nAnalyze their request and create a complete agent template that:\n- Has a clear purpose and appropriate capabilities\n- Leaves out fields that are not needed\n- Uses only the tools it needs\n- Follows naming conventions\n- Is properly structured\n- Draws inspiration from relevant example agents\n\n## For Creating New Agents\n\nThe agent builder is focused on creating new agent templates based on user specifications.\n\nIMPORTANT: Always end your response with the end_turn tool when you have completed the agent creation or editing task.`,\n stepPrompt: '',\n\n handleSteps: function* () {\n // Step 1: Create directory structure\n yield {\n toolName: 'run_terminal_command',\n args: {\n command: `mkdir -p ${TYPES_DIR} && mkdir -p ${EXAMPLES_DIR}`,\n process_type: 'SYNC',\n timeout_seconds: 10,\n },\n }\n\n // Step 2: Write the AGENT_DEFINITION_FILE with the template content\n yield {\n toolName: 'write_file',\n args: {\n path: TEMPLATE_TYPES_PATH,\n instructions: 'Create agent template type definitions file',\n content: agentTemplateContent,\n },\n }\n\n // Step 3: Write the tool definitions file (copy from existing tools.d.ts)\n yield {\n toolName: 'write_file',\n args: {\n path: TOOL_DEFINITIONS_PATH,\n instructions: 'Create tools type file',\n content: toolDefinitionsContent,\n },\n }\n\n // Step 4: Add message about reading example files and then read them\n yield {\n toolName: 'add_message',\n args: {\n role: 'assistant',\n content:\n \"I'll review the starter template and diff-reviewer examples, then help you create your agent.\",\n },\n }\n\n // Step 5: Copy example agent files to .agents/examples/\n for (const [filename, content] of Object.entries(exampleAgentContents)) {\n if (content) {\n yield {\n toolName: 'write_file',\n args: {\n path: `${EXAMPLES_DIR}/${filename}`,\n instructions: `Copy example agent file ${filename}`,\n content: content,\n },\n }\n }\n }\n\n // Step 6: Copy starter template directly to .agents/\n if (starterTemplateContent) {\n yield {\n toolName: 'write_file',\n args: {\n path: `${AGENT_TEMPLATES_DIR}/${STARTER_TEMPLATE_DEST_FILE}`,\n instructions: `Copy starter custom agent template ${STARTER_TEMPLATE_DEST_FILE}`,\n content: starterTemplateContent,\n },\n }\n }\n\n // Step 7: Complete agent creation process\n yield 'STEP_ALL'\n },\n }\n}\n" - }, - "agentId": "D-oY2QIts4E", - "parentAgentId": "main-agent", - "includeToolCall": true - }, - { - "type": "tool_result", - "toolCallId": "236eaf27-5781-488d-bcb0-48431ca62da1", - "toolName": "write_file", - "output": [ - { - "type": "json", - "value": { - "file": "backend/src/templates/agents/agent-builder.ts", - "message": "Updated file", - "unifiedDiff": "@@ -1,12 +1,8 @@\n import * as fs from 'fs'\n import * as path from 'path'\n \n-import {\n- AGENT_TEMPLATES_DIR,\n- openrouterModels,\n- AGENT_DEFINITION_FILE,\n-} from '@codebuff/common/constants'\n+import { AGENT_TEMPLATES_DIR, AGENT_DEFINITION_FILE } from '@codebuff/common/constants'\n import { AgentTemplateTypes } from '@codebuff/common/types/session-state'\n import z from 'zod/v4'\n \n import type { AgentTemplate } from '../types'\n@@ -19,9 +15,8 @@\n // Import to validate path exists at compile time\n import(TEMPLATE_RELATIVE_PATH)\n \n const TEMPLATE_PATH = path.join(__dirname, TEMPLATE_RELATIVE_PATH)\n-const DEFAULT_MODEL = openrouterModels.openrouter_claude_sonnet_4\n const TYPES_DIR = path.join(AGENT_TEMPLATES_DIR, 'types')\n const EXAMPLES_DIR = path.join(AGENT_TEMPLATES_DIR, 'examples')\n const TEMPLATE_TYPES_PATH = path.join(TYPES_DIR, AGENT_DEFINITION_FILE)\n const TOOL_DEFINITIONS_FILE = 'tools.d.ts'\n@@ -32,9 +27,9 @@\n const STARTER_TEMPLATE_DEST_FILE = 'your-custom-agent.ts'\n \n export const agentBuilder = (\n model: Model,\n- allAvailableAgents?: string[],\n+ _allAvailableAgents?: string[],\n ): Omit => {\n // Read the AGENT_CONFIG_FILE content dynamically\n // The import above ensures this path exists at compile time\n let agentTemplateContent = ''\n@@ -57,9 +52,9 @@\n console.warn(`Could not read tools.d.ts from common:`, error)\n toolDefinitionsContent = '// Tool definitions not available'\n }\n \n- // Read example agent files from common package\n+ // Read example agent files + starter template from common package\n const exampleAgentContents: Record = {}\n let starterTemplateContent = ''\n \n try {\n@@ -229,9 +224,9 @@\n \n IMPORTANT: Always end your response with the end_turn tool when you have completed the agent creation or editing task.`,\n stepPrompt: '',\n \n- handleSteps: function* ({ agentState, prompt, params }) {\n+ handleSteps: function* () {\n // Step 1: Create directory structure\n yield {\n toolName: 'run_terminal_command',\n args: {\n" - } - } - ], - "parentAgentId": "D-oY2QIts4E" - }, - { - "type": "tool_call", - "toolCallId": "f89a12af-70bc-4922-a9f3-ff7a854526cd", - "toolName": "str_replace", - "input": { - "path": "common/src/constants/agents.ts", - "replacements": [ - { - "old": " dry_run: {\n displayName: 'Sketch the Dry Runner',\n purpose: 'Agent that takes a plan and try to implement it in a dry run.',\n hidden: true,\n } as const,\n", - "new": "" - }, - { - "old": " agent_builder: {\n displayName: 'Bob the Agent Builder',\n purpose: 'Creates new agent templates for the codebuff mult-agent system',\n hidden: false,\n } as const,\n", - "new": " agent_builder: {\n displayName: 'Bob the Agent Builder',\n purpose: 'Creates new agent templates for the codebuff multi-agent system',\n hidden: false,\n } as const,\n" - } - ] - }, - "agentId": "D-oY2QIts4E", - "parentAgentId": "main-agent", - "includeToolCall": true - }, - { - "type": "tool_result", - "toolCallId": "f89a12af-70bc-4922-a9f3-ff7a854526cd", - "toolName": "str_replace", - "output": [ - { - "type": "json", - "value": { - "file": "common/src/constants/agents.ts", - "message": "Updated file", - "unifiedDiff": "@@ -64,21 +64,16 @@\n displayName: 'Peter Plan the Planner',\n purpose: 'Agent that formulates a comprehensive plan to a prompt.',\n hidden: true,\n } as const,\n- dry_run: {\n- displayName: 'Sketch the Dry Runner',\n- purpose: 'Agent that takes a plan and try to implement it in a dry run.',\n- hidden: true,\n- } as const,\n reviewer: {\n displayName: 'Nit Pick Nick the Reviewer',\n purpose:\n 'Reviews file changes and responds with critical feedback. Use this after making any significant change to the codebase.',\n } as const,\n agent_builder: {\n displayName: 'Bob the Agent Builder',\n- purpose: 'Creates new agent templates for the codebuff mult-agent system',\n+ purpose: 'Creates new agent templates for the codebuff multi-agent system',\n hidden: false,\n } as const,\n } as const satisfies Partial<\n Record<\n" - } - } - ], - "parentAgentId": "D-oY2QIts4E" - }, - { - "type": "tool_call", - "toolCallId": "65fada28-f7b9-49f3-baec-e21b68f486e1", - "toolName": "write_file", - "input": { - "path": ".agents/examples/diff-reviewer-1.ts", - "instructions": "Refresh diff-reviewer-1 example to use current Anthropic model.", - "content": "import type { AgentDefinition } from '../types/agent-definition'\n\nconst definition: AgentDefinition = {\n id: 'diff-reviewer-1',\n\n displayName: 'Diff Reviewer (Level 1)',\n model: 'anthropic/claude-4-sonnet-20250522',\n toolNames: ['read_files', 'run_terminal_command'],\n\n spawnPurposePrompt:\n 'Spawn when you need to review code changes in the git diff',\n\n instructionsPrompt: `Execute the following steps:\n1. Run git diff\n2. Read the files that have changed\n3. Review the changes and suggest improvements`,\n}\n\nexport default definition\n" - }, - "agentId": "D-oY2QIts4E", - "parentAgentId": "main-agent", - "includeToolCall": true - }, - { - "type": "tool_result", - "toolCallId": "65fada28-f7b9-49f3-baec-e21b68f486e1", - "toolName": "write_file", - "output": [ - { - "type": "json", - "value": { - "file": ".agents/examples/diff-reviewer-1.ts", - "message": "Updated file", - "unifiedDiff": "@@ -3,9 +3,9 @@\n const definition: AgentDefinition = {\n id: 'diff-reviewer-1',\n \n displayName: 'Diff Reviewer (Level 1)',\n- model: 'openai/gpt-5',\n+ model: 'anthropic/claude-4-sonnet-20250522',\n toolNames: ['read_files', 'run_terminal_command'],\n \n spawnPurposePrompt:\n 'Spawn when you need to review code changes in the git diff',\n" - } - } - ], - "parentAgentId": "D-oY2QIts4E" - }, - { - "type": "tool_call", - "toolCallId": "c0b7155d-f1c0-4c3e-a53d-7bcb681e9c03", - "toolName": "write_file", - "input": { - "path": ".agents/examples/diff-reviewer-2.ts", - "instructions": "Refresh diff-reviewer-2 example to use current Anthropic model.", - "content": "import type {\n AgentDefinition,\n AgentStepContext,\n} from '../types/agent-definition'\n\nconst definition: AgentDefinition = {\n id: 'diff-reviewer-2',\n displayName: 'Diff Reviewer (Level 2)',\n model: 'anthropic/claude-4-sonnet-20250522',\n\n inputSchema: {\n prompt: {\n type: 'string',\n description:\n 'Please provide a short description of the changes you want to review',\n },\n },\n toolNames: ['read_files', 'run_terminal_command'],\n\n spawnPurposePrompt:\n 'Spawn when you need to review code changes in the git diff',\n\n systemPrompt:\n 'You are an expert software developer. Your job is to review code changes and provide helpful feedback.',\n\n instructionsPrompt: `Execute the following steps:\n1. Run git diff\n2. Read the files that have changed\n3. Review the changes and suggest improvements\n\nUse the following guidelines while reviewing the changes:\n- Find ways to simplify the code\n- Reuse existing code as much as possible instead of writing new code\n- Preserve as much behavior as possible in the existing code\n- Prefer changing as few lines of code as possible\n- Look for opportunities to improve the code's readability\n- Look for logical errors in the code\n- Look for missed cases in the code\n- Look for any other bugs`,\n\n handleSteps: function* ({ prompt }: AgentStepContext) {\n // Step 1: Run git diff immediately. Saves the agent a step, lowering cost and latency!\n yield {\n toolName: 'run_terminal_command',\n args: {\n command: 'git diff',\n },\n }\n\n // Step 2: Let AI run the rest of the steps!\n yield 'STEP_ALL'\n },\n}\n\nexport default definition\n" - }, - "agentId": "D-oY2QIts4E", - "parentAgentId": "main-agent", - "includeToolCall": true - }, - { - "type": "tool_result", - "toolCallId": "c0b7155d-f1c0-4c3e-a53d-7bcb681e9c03", - "toolName": "write_file", - "output": [ - { - "type": "json", - "value": { - "file": ".agents/examples/diff-reviewer-2.ts", - "message": "Updated file", - "unifiedDiff": "@@ -5,9 +5,9 @@\n \n const definition: AgentDefinition = {\n id: 'diff-reviewer-2',\n displayName: 'Diff Reviewer (Level 2)',\n- model: 'openai/gpt-5',\n+ model: 'anthropic/claude-4-sonnet-20250522',\n \n inputSchema: {\n prompt: {\n type: 'string',\n@@ -37,9 +37,9 @@\n - Look for logical errors in the code\n - Look for missed cases in the code\n - Look for any other bugs`,\n \n- handleSteps: function* ({ agentState, prompt, params }: AgentStepContext) {\n+ handleSteps: function* ({ prompt }: AgentStepContext) {\n // Step 1: Run git diff immediately. Saves the agent a step, lowering cost and latency!\n yield {\n toolName: 'run_terminal_command',\n args: {\n" - } - } - ], - "parentAgentId": "D-oY2QIts4E" - }, - { - "type": "tool_call", - "toolCallId": "1f7ddb30-5253-40c0-8c05-71c3c54a8a93", - "toolName": "write_file", - "input": { - "path": ".agents/examples/diff-reviewer-3.ts", - "instructions": "Refresh diff-reviewer-3 example to use current Anthropic model, correct file-explorer spawn target, and streamline final step behavior.", - "content": "import type {\n AgentDefinition,\n AgentStepContext,\n} from '../types/agent-definition'\n\nconst definition: AgentDefinition = {\n id: 'diff-reviewer-3',\n\n displayName: 'Diff Reviewer (Level 3)',\n model: 'anthropic/claude-4-sonnet-20250522',\n inputSchema: {\n prompt: {\n type: 'string',\n description:\n 'Please provide a short description of the changes you want to review',\n },\n },\n outputMode: 'last_message',\n\n toolNames: ['read_files', 'run_terminal_command', 'spawn_agents'],\n spawnableAgents: ['file-explorer'],\n\n spawnPurposePrompt:\n 'Spawn when you need to review code changes in the git diff',\n\n systemPrompt:\n 'You are an expert software developer. Your job is to review code changes and provide helpful feedback.',\n\n instructionsPrompt: `Review the changes and suggest improvements.\n\nUse the following guidelines while reviewing the changes:\n- Find ways to simplify the code\n- Reuse existing code as much as possible instead of writing new code\n- Preserve as much behavior as possible in the existing code\n- Prefer changing as few lines of code as possible\n- Look for opportunities to improve the code's readability\n- Look for logical errors in the code\n- Look for missed cases in the code\n- Look for any other bugs`,\n\n handleSteps: function* ({ prompt }: AgentStepContext) {\n // Step 1: Get list of changed files from git diff --name-only\n const { toolResult: gitDiffFilesResult } = yield {\n toolName: 'run_terminal_command',\n args: {\n command: 'git diff --name-only',\n },\n }\n\n const changedFiles = (gitDiffFilesResult || '')\n .split('\\n')\n .map((line) => line.trim())\n .filter((line) => line && !line.startsWith('??') && !line.includes('OSC'))\n\n // Step 2: Read changed files\n if (changedFiles.length > 0) {\n yield {\n toolName: 'read_files',\n args: {\n paths: changedFiles,\n },\n }\n }\n\n // Step 3: Run full git diff to see the actual changes\n yield {\n toolName: 'run_terminal_command',\n args: {\n command: 'git diff',\n },\n }\n\n // Step 4: Spawn file explorer for broader context if needed\n yield {\n toolName: 'spawn_agents',\n args: {\n agents: [\n {\n agent_type: 'file-explorer',\n prompt: `Find any additional codebase context needed to review these changes. Review focus: ${prompt || ''}`,\n params: {\n prompts: [\n 'Any modules/classes/functions referenced by the diff',\n 'Relevant tests or test helpers for the changed code',\n 'Related config or shared utilities that might be impacted',\n ],\n },\n },\n ],\n },\n }\n\n // Step 5: Let the AI produce the final review in a single final step\n yield 'STEP_ALL'\n },\n}\n\nexport default definition\n" - }, - "agentId": "D-oY2QIts4E", - "parentAgentId": "main-agent", - "includeToolCall": true - }, - { - "type": "tool_result", - "toolCallId": "1f7ddb30-5253-40c0-8c05-71c3c54a8a93", - "toolName": "write_file", - "output": [ - { - "type": "json", - "value": { - "file": ".agents/examples/diff-reviewer-3.ts", - "message": "Updated file", - "unifiedDiff": "@@ -6,9 +6,9 @@\n const definition: AgentDefinition = {\n id: 'diff-reviewer-3',\n \n displayName: 'Diff Reviewer (Level 3)',\n- model: 'openai/gpt-5',\n+ model: 'anthropic/claude-4-sonnet-20250522',\n inputSchema: {\n prompt: {\n type: 'string',\n description:\n@@ -17,9 +17,9 @@\n },\n outputMode: 'last_message',\n \n toolNames: ['read_files', 'run_terminal_command', 'spawn_agents'],\n- spawnableAgents: ['james/file-explorer@0.1.3'],\n+ spawnableAgents: ['file-explorer'],\n \n spawnPurposePrompt:\n 'Spawn when you need to review code changes in the git diff',\n \n@@ -37,24 +37,23 @@\n - Look for logical errors in the code\n - Look for missed cases in the code\n - Look for any other bugs`,\n \n- handleSteps: function* ({ agentState, prompt, params }: AgentStepContext) {\n+ handleSteps: function* ({ prompt }: AgentStepContext) {\n // Step 1: Get list of changed files from git diff --name-only\n const { toolResult: gitDiffFilesResult } = yield {\n toolName: 'run_terminal_command',\n args: {\n command: 'git diff --name-only',\n },\n }\n \n- // Then, extract file paths from the result\n const changedFiles = (gitDiffFilesResult || '')\n .split('\\n')\n .map((line) => line.trim())\n .filter((line) => line && !line.startsWith('??') && !line.includes('OSC'))\n \n- // Step 2: Read the files\n+ // Step 2: Read changed files\n if (changedFiles.length > 0) {\n yield {\n toolName: 'read_files',\n args: {\n@@ -70,31 +69,30 @@\n command: 'git diff',\n },\n }\n \n- // Step 4: Put words in the AI's mouth to get it to spawn the file explorer.\n+ // Step 4: Spawn file explorer for broader context if needed\n yield {\n- toolName: 'add_message',\n+ toolName: 'spawn_agents',\n args: {\n- role: 'assistant',\n- content:\n- 'Now I will spawn a file explorer to find any missing codebase context.',\n+ agents: [\n+ {\n+ agent_type: 'file-explorer',\n+ prompt: `Find any additional codebase context needed to review these changes. Review focus: ${prompt || ''}`,\n+ params: {\n+ prompts: [\n+ 'Any modules/classes/functions referenced by the diff',\n+ 'Relevant tests or test helpers for the changed code',\n+ 'Related config or shared utilities that might be impacted',\n+ ],\n+ },\n+ },\n+ ],\n },\n }\n \n- yield 'STEP'\n-\n- // Step 5: Put words in the AI's mouth to review the changes.\n- yield {\n- toolName: 'add_message',\n- args: {\n- role: 'assistant',\n- content: 'Here is my comprehensive review of the changes.',\n- },\n- }\n-\n- // Step 6: Let AI review the changes in a final step. (The last message is also the agent's output.)\n- yield 'STEP'\n+ // Step 5: Let the AI produce the final review in a single final step\n+ yield 'STEP_ALL'\n },\n }\n \n export default definition\n" - } - } - ], - "parentAgentId": "D-oY2QIts4E" - }, - { - "type": "tool_call", - "toolCallId": "35900739-e50e-4d7a-bd04-a1b14358fc80", - "toolName": "write_file", - "input": { - "path": "common/src/util/examples/diff-reviewer-1.ts", - "instructions": "Refresh common diff-reviewer-1 example to use current Anthropic model.", - "content": "import type { AgentDefinition } from '../types/agent-definition'\n\nconst definition: AgentDefinition = {\n id: 'diff-reviewer-1',\n\n displayName: 'Diff Reviewer (Level 1)',\n model: 'anthropic/claude-4-sonnet-20250522',\n toolNames: ['read_files', 'run_terminal_command'],\n\n spawnPurposePrompt:\n 'Spawn when you need to review code changes in the git diff',\n\n instructionsPrompt: `Execute the following steps:\n1. Run git diff\n2. Read the files that have changed\n3. Review the changes and suggest improvements`,\n}\n\nexport default definition\n" - }, - "agentId": "D-oY2QIts4E", - "parentAgentId": "main-agent", - "includeToolCall": true - }, - { - "type": "tool_result", - "toolCallId": "35900739-e50e-4d7a-bd04-a1b14358fc80", - "toolName": "write_file", - "output": [ - { - "type": "json", - "value": { - "file": "common/src/util/examples/diff-reviewer-1.ts", - "message": "Updated file", - "unifiedDiff": "@@ -3,9 +3,9 @@\n const definition: AgentDefinition = {\n id: 'diff-reviewer-1',\n \n displayName: 'Diff Reviewer (Level 1)',\n- model: 'openai/gpt-5',\n+ model: 'anthropic/claude-4-sonnet-20250522',\n toolNames: ['read_files', 'run_terminal_command'],\n \n spawnPurposePrompt:\n 'Spawn when you need to review code changes in the git diff',\n" - } - } - ], - "parentAgentId": "D-oY2QIts4E" - }, - { - "type": "tool_call", - "toolCallId": "f92ff527-8c2f-44f4-9c51-c80823a0eccd", - "toolName": "write_file", - "input": { - "path": "common/src/util/examples/diff-reviewer-2.ts", - "instructions": "Refresh common diff-reviewer-2 example to use current Anthropic model.", - "content": "import type {\n AgentDefinition,\n AgentStepContext,\n} from '../types/agent-definition'\n\nconst definition: AgentDefinition = {\n id: 'diff-reviewer-2',\n displayName: 'Diff Reviewer (Level 2)',\n model: 'anthropic/claude-4-sonnet-20250522',\n\n inputSchema: {\n prompt: {\n type: 'string',\n description:\n 'Please provide a short description of the changes you want to review',\n },\n },\n toolNames: ['read_files', 'run_terminal_command'],\n\n spawnPurposePrompt:\n 'Spawn when you need to review code changes in the git diff',\n\n systemPrompt:\n 'You are an expert software developer. Your job is to review code changes and provide helpful feedback.',\n\n instructionsPrompt: `Execute the following steps:\n1. Run git diff\n2. Read the files that have changed\n3. Review the changes and suggest improvements\n\nUse the following guidelines while reviewing the changes:\n- Find ways to simplify the code\n- Reuse existing code as much as possible instead of writing new code\n- Preserve as much behavior as possible in the existing code\n- Prefer changing as few lines of code as possible\n- Look for opportunities to improve the code's readability\n- Look for logical errors in the code\n- Look for missed cases in the code\n- Look for any other bugs`,\n\n handleSteps: function* ({ prompt }: AgentStepContext) {\n // Step 1: Run git diff immediately. Saves the agent a step, lowering cost and latency!\n yield {\n toolName: 'run_terminal_command',\n args: {\n command: 'git diff',\n },\n }\n\n // Step 2: Let AI run the rest of the steps!\n yield 'STEP_ALL'\n },\n}\n\nexport default definition\n" - }, - "agentId": "D-oY2QIts4E", - "parentAgentId": "main-agent", - "includeToolCall": true - }, - { - "type": "tool_result", - "toolCallId": "f92ff527-8c2f-44f4-9c51-c80823a0eccd", - "toolName": "write_file", - "output": [ - { - "type": "json", - "value": { - "file": "common/src/util/examples/diff-reviewer-2.ts", - "message": "Updated file", - "unifiedDiff": "@@ -5,9 +5,9 @@\n \n const definition: AgentDefinition = {\n id: 'diff-reviewer-2',\n displayName: 'Diff Reviewer (Level 2)',\n- model: 'openai/gpt-5',\n+ model: 'anthropic/claude-4-sonnet-20250522',\n \n inputSchema: {\n prompt: {\n type: 'string',\n@@ -37,9 +37,9 @@\n - Look for logical errors in the code\n - Look for missed cases in the code\n - Look for any other bugs`,\n \n- handleSteps: function* ({ agentState, prompt, params }: AgentStepContext) {\n+ handleSteps: function* ({ prompt }: AgentStepContext) {\n // Step 1: Run git diff immediately. Saves the agent a step, lowering cost and latency!\n yield {\n toolName: 'run_terminal_command',\n args: {\n" - } - } - ], - "parentAgentId": "D-oY2QIts4E" - }, - { - "type": "tool_call", - "toolCallId": "35d48f21-73b4-4629-bfde-eab0b9251e99", - "toolName": "write_file", - "input": { - "path": "common/src/util/examples/diff-reviewer-3.ts", - "instructions": "Refresh common diff-reviewer-3 example to use current Anthropic model, correct file-explorer spawn target, and streamline final step behavior.", - "content": "import type {\n AgentDefinition,\n AgentStepContext,\n} from '../types/agent-definition'\n\nconst definition: AgentDefinition = {\n id: 'diff-reviewer-3',\n\n displayName: 'Diff Reviewer (Level 3)',\n model: 'anthropic/claude-4-sonnet-20250522',\n inputSchema: {\n prompt: {\n type: 'string',\n description:\n 'Please provide a short description of the changes you want to review',\n },\n },\n outputMode: 'last_message',\n\n toolNames: ['read_files', 'run_terminal_command', 'spawn_agents'],\n spawnableAgents: ['file-explorer'],\n\n spawnPurposePrompt:\n 'Spawn when you need to review code changes in the git diff',\n\n systemPrompt:\n 'You are an expert software developer. Your job is to review code changes and provide helpful feedback.',\n\n instructionsPrompt: `Review the changes and suggest improvements.\n\nUse the following guidelines while reviewing the changes:\n- Find ways to simplify the code\n- Reuse existing code as much as possible instead of writing new code\n- Preserve as much behavior as possible in the existing code\n- Prefer changing as few lines of code as possible\n- Look for opportunities to improve the code's readability\n- Look for logical errors in the code\n- Look for missed cases in the code\n- Look for any other bugs`,\n\n handleSteps: function* ({ prompt }: AgentStepContext) {\n // Step 1: Get list of changed files from git diff --name-only\n const { toolResult: gitDiffFilesResult } = yield {\n toolName: 'run_terminal_command',\n args: {\n command: 'git diff --name-only',\n },\n }\n\n const changedFiles = (gitDiffFilesResult || '')\n .split('\\n')\n .map((line) => line.trim())\n .filter((line) => line && !line.startsWith('??') && !line.includes('OSC'))\n\n // Step 2: Read changed files\n if (changedFiles.length > 0) {\n yield {\n toolName: 'read_files',\n args: {\n paths: changedFiles,\n },\n }\n }\n\n // Step 3: Run full git diff to see the actual changes\n yield {\n toolName: 'run_terminal_command',\n args: {\n command: 'git diff',\n },\n }\n\n // Step 4: Spawn file explorer for broader context if needed\n yield {\n toolName: 'spawn_agents',\n args: {\n agents: [\n {\n agent_type: 'file-explorer',\n prompt: `Find any additional codebase context needed to review these changes. Review focus: ${prompt || ''}`,\n params: {\n prompts: [\n 'Any modules/classes/functions referenced by the diff',\n 'Relevant tests or test helpers for the changed code',\n 'Related config or shared utilities that might be impacted',\n ],\n },\n },\n ],\n },\n }\n\n // Step 5: Let the AI produce the final review in a single final step\n yield 'STEP_ALL'\n },\n}\n\nexport default definition\n" - }, - "agentId": "D-oY2QIts4E", - "parentAgentId": "main-agent", - "includeToolCall": true - }, - { - "type": "tool_result", - "toolCallId": "35d48f21-73b4-4629-bfde-eab0b9251e99", - "toolName": "write_file", - "output": [ - { - "type": "json", - "value": { - "file": "common/src/util/examples/diff-reviewer-3.ts", - "message": "Updated file", - "unifiedDiff": "@@ -6,9 +6,9 @@\n const definition: AgentDefinition = {\n id: 'diff-reviewer-3',\n \n displayName: 'Diff Reviewer (Level 3)',\n- model: 'openai/gpt-5',\n+ model: 'anthropic/claude-4-sonnet-20250522',\n inputSchema: {\n prompt: {\n type: 'string',\n description:\n@@ -17,9 +17,9 @@\n },\n outputMode: 'last_message',\n \n toolNames: ['read_files', 'run_terminal_command', 'spawn_agents'],\n- spawnableAgents: ['james/file-explorer@0.1.3'],\n+ spawnableAgents: ['file-explorer'],\n \n spawnPurposePrompt:\n 'Spawn when you need to review code changes in the git diff',\n \n@@ -37,24 +37,23 @@\n - Look for logical errors in the code\n - Look for missed cases in the code\n - Look for any other bugs`,\n \n- handleSteps: function* ({ agentState, prompt, params }: AgentStepContext) {\n+ handleSteps: function* ({ prompt }: AgentStepContext) {\n // Step 1: Get list of changed files from git diff --name-only\n const { toolResult: gitDiffFilesResult } = yield {\n toolName: 'run_terminal_command',\n args: {\n command: 'git diff --name-only',\n },\n }\n \n- // Then, extract file paths from the result\n const changedFiles = (gitDiffFilesResult || '')\n .split('\\n')\n .map((line) => line.trim())\n .filter((line) => line && !line.startsWith('??') && !line.includes('OSC'))\n \n- // Step 2: Read the files\n+ // Step 2: Read changed files\n if (changedFiles.length > 0) {\n yield {\n toolName: 'read_files',\n args: {\n@@ -70,31 +69,30 @@\n command: 'git diff',\n },\n }\n \n- // Step 4: Put words in the AI's mouth to get it to spawn the file explorer.\n+ // Step 4: Spawn file explorer for broader context if needed\n yield {\n- toolName: 'add_message',\n+ toolName: 'spawn_agents',\n args: {\n- role: 'assistant',\n- content:\n- 'Now I will spawn a file explorer to find any missing codebase context.',\n+ agents: [\n+ {\n+ agent_type: 'file-explorer',\n+ prompt: `Find any additional codebase context needed to review these changes. Review focus: ${prompt || ''}`,\n+ params: {\n+ prompts: [\n+ 'Any modules/classes/functions referenced by the diff',\n+ 'Relevant tests or test helpers for the changed code',\n+ 'Related config or shared utilities that might be impacted',\n+ ],\n+ },\n+ },\n+ ],\n },\n }\n \n- yield 'STEP'\n-\n- // Step 5: Put words in the AI's mouth to review the changes.\n- yield {\n- toolName: 'add_message',\n- args: {\n- role: 'assistant',\n- content: 'Here is my comprehensive review of the changes.',\n- },\n- }\n-\n- // Step 6: Let AI review the changes in a final step. (The last message is also the agent's output.)\n- yield 'STEP'\n+ // Step 5: Let the AI produce the final review in a single final step\n+ yield 'STEP_ALL'\n },\n }\n \n export default definition\n" - } - } - ], - "parentAgentId": "D-oY2QIts4E" - }, - { - "type": "tool_call", - "toolCallId": "e9652d7f-e25d-4335-a72e-469560bbdadd", - "toolName": "write_file", - "input": { - "path": ".agents/your-custom-agent.ts", - "instructions": "Add a new starter custom agent (Git Committer scaffold) in the top-level .agents directory, ready to run and publish.", - "content": "import { publisher, version } from './constants'\n\nimport type {\n AgentDefinition,\n AgentStepContext,\n} from './types/agent-definition'\n\nconst definition: AgentDefinition = {\n id: 'your-custom-agent',\n version,\n publisher,\n\n displayName: 'Your Custom Agent (Git Committer)',\n model: 'anthropic/claude-4-sonnet-20250522',\n toolNames: ['read_files', 'run_terminal_command', 'add_message', 'end_turn'],\n\n inputSchema: {\n prompt: {\n type: 'string',\n description: 'What changes to commit',\n },\n },\n\n includeMessageHistory: false,\n outputMode: 'last_message',\n\n spawnPurposePrompt:\n 'Spawn when you need to commit code changes to git with an appropriate commit message',\n\n systemPrompt:\n 'You are an expert software developer. Your job is to create a git commit with a really good commit message.',\n\n instructionsPrompt:\n 'Follow the steps to create a good commit: analyze changes with git diff and git log, read relevant files for context, stage appropriate files, and create a commit with proper formatting including the Codebuff footer.',\n\n handleSteps: function* ({ prompt }: AgentStepContext) {\n // Step 1: Analyze the changes\n yield {\n toolName: 'run_terminal_command',\n args: {\n command: 'git diff',\n process_type: 'SYNC',\n timeout_seconds: 30,\n },\n }\n\n yield {\n toolName: 'run_terminal_command',\n args: {\n command: 'git log --oneline -10',\n process_type: 'SYNC',\n timeout_seconds: 30,\n },\n }\n\n // Step 2: Let the AI decide what to read + what to stage based on the user's intent\n yield {\n toolName: 'add_message',\n args: {\n role: 'assistant',\n content: `Goal: ${prompt}\\n\\nI'll read any relevant files and stage the right changes next.`,\n },\n }\n\n yield 'STEP'\n\n // Step 3: Let the AI create the commit with proper formatting\n yield {\n toolName: 'add_message',\n args: {\n role: 'assistant',\n content:\n \"Now I'll create the commit with a high-quality message and the proper Codebuff footer format.\",\n },\n }\n\n yield 'STEP_ALL'\n },\n}\n\nexport default definition\n" - }, - "agentId": "D-oY2QIts4E", - "parentAgentId": "main-agent", - "includeToolCall": true - }, - { - "type": "tool_result", - "toolCallId": "e9652d7f-e25d-4335-a72e-469560bbdadd", - "toolName": "write_file", - "output": [ - { - "type": "json", - "value": { - "file": ".agents/your-custom-agent.ts", - "message": "Created new file", - "unifiedDiff": "import { publisher, version } from './constants'\n\nimport type {\n AgentDefinition,\n AgentStepContext,\n} from './types/agent-definition'\n\nconst definition: AgentDefinition = {\n id: 'your-custom-agent',\n version,\n publisher,\n\n displayName: 'Your Custom Agent (Git Committer)',\n model: 'anthropic/claude-4-sonnet-20250522',\n toolNames: ['read_files', 'run_terminal_command', 'add_message', 'end_turn'],\n\n inputSchema: {\n prompt: {\n type: 'string',\n description: 'What changes to commit',\n },\n },\n\n includeMessageHistory: false,\n outputMode: 'last_message',\n\n spawnPurposePrompt:\n 'Spawn when you need to commit code changes to git with an appropriate commit message',\n\n systemPrompt:\n 'You are an expert software developer. Your job is to create a git commit with a really good commit message.',\n\n instructionsPrompt:\n 'Follow the steps to create a good commit: analyze changes with git diff and git log, read relevant files for context, stage appropriate files, and create a commit with proper formatting including the Codebuff footer.',\n\n handleSteps: function* ({ prompt }: AgentStepContext) {\n // Step 1: Analyze the changes\n yield {\n toolName: 'run_terminal_command',\n args: {\n command: 'git diff',\n process_type: 'SYNC',\n timeout_seconds: 30,\n },\n }\n\n yield {\n toolName: 'run_terminal_command',\n args: {\n command: 'git log --oneline -10',\n process_type: 'SYNC',\n timeout_seconds: 30,\n },\n }\n\n // Step 2: Let the AI decide what to read + what to stage based on the user's intent\n yield {\n toolName: 'add_message',\n args: {\n role: 'assistant',\n content: `Goal: ${prompt}\\n\\nI'll read any relevant files and stage the right changes next.`,\n },\n }\n\n yield 'STEP'\n\n // Step 3: Let the AI create the commit with proper formatting\n yield {\n toolName: 'add_message',\n args: {\n role: 'assistant',\n content:\n \"Now I'll create the commit with a high-quality message and the proper Codebuff footer format.\",\n },\n }\n\n yield 'STEP_ALL'\n },\n}\n\nexport default definition\n" - } - } - ], - "parentAgentId": "D-oY2QIts4E" - }, - { - "type": "tool_call", - "toolCallId": "322d55c0-598c-4165-97c8-e9caa5ebb457", - "toolName": "write_file", - "input": { - "path": "common/src/util/examples/your-custom-agent.ts.txt", - "instructions": "Add starter custom agent template content for the agent builder to copy into .agents/your-custom-agent.ts.", - "content": "import { publisher, version } from './constants'\n\nimport type {\n AgentDefinition,\n AgentStepContext,\n} from './types/agent-definition'\n\nconst definition: AgentDefinition = {\n id: 'your-custom-agent',\n version,\n publisher,\n\n displayName: 'Your Custom Agent (Git Committer)',\n model: 'anthropic/claude-4-sonnet-20250522',\n toolNames: ['read_files', 'run_terminal_command', 'add_message', 'end_turn'],\n\n inputSchema: {\n prompt: {\n type: 'string',\n description: 'What changes to commit',\n },\n },\n\n includeMessageHistory: false,\n outputMode: 'last_message',\n\n spawnPurposePrompt:\n 'Spawn when you need to commit code changes to git with an appropriate commit message',\n\n systemPrompt:\n 'You are an expert software developer. Your job is to create a git commit with a really good commit message.',\n\n instructionsPrompt:\n 'Follow the steps to create a good commit: analyze changes with git diff and git log, read relevant files for context, stage appropriate files, and create a commit with proper formatting including the Codebuff footer.',\n\n handleSteps: function* ({ prompt }: AgentStepContext) {\n // Step 1: Analyze the changes\n yield {\n toolName: 'run_terminal_command',\n args: {\n command: 'git diff',\n process_type: 'SYNC',\n timeout_seconds: 30,\n },\n }\n\n yield {\n toolName: 'run_terminal_command',\n args: {\n command: 'git log --oneline -10',\n process_type: 'SYNC',\n timeout_seconds: 30,\n },\n }\n\n // Step 2: Let the AI decide what to read + what to stage based on the user's intent\n yield {\n toolName: 'add_message',\n args: {\n role: 'assistant',\n content: `Goal: ${prompt}\\n\\nI'll read any relevant files and stage the right changes next.`,\n },\n }\n\n yield 'STEP'\n\n // Step 3: Let the AI create the commit with proper formatting\n yield {\n toolName: 'add_message',\n args: {\n role: 'assistant',\n content:\n \"Now I'll create the commit with a high-quality message and the proper Codebuff footer format.\",\n },\n }\n\n yield 'STEP_ALL'\n },\n}\n\nexport default definition\n" - }, - "agentId": "D-oY2QIts4E", - "parentAgentId": "main-agent", - "includeToolCall": true - }, - { - "type": "tool_result", - "toolCallId": "322d55c0-598c-4165-97c8-e9caa5ebb457", - "toolName": "write_file", - "output": [ - { - "type": "json", - "value": { - "file": "common/src/util/examples/your-custom-agent.ts.txt", - "message": "Created new file", - "unifiedDiff": "import { publisher, version } from './constants'\n\nimport type {\n AgentDefinition,\n AgentStepContext,\n} from './types/agent-definition'\n\nconst definition: AgentDefinition = {\n id: 'your-custom-agent',\n version,\n publisher,\n\n displayName: 'Your Custom Agent (Git Committer)',\n model: 'anthropic/claude-4-sonnet-20250522',\n toolNames: ['read_files', 'run_terminal_command', 'add_message', 'end_turn'],\n\n inputSchema: {\n prompt: {\n type: 'string',\n description: 'What changes to commit',\n },\n },\n\n includeMessageHistory: false,\n outputMode: 'last_message',\n\n spawnPurposePrompt:\n 'Spawn when you need to commit code changes to git with an appropriate commit message',\n\n systemPrompt:\n 'You are an expert software developer. Your job is to create a git commit with a really good commit message.',\n\n instructionsPrompt:\n 'Follow the steps to create a good commit: analyze changes with git diff and git log, read relevant files for context, stage appropriate files, and create a commit with proper formatting including the Codebuff footer.',\n\n handleSteps: function* ({ prompt }: AgentStepContext) {\n // Step 1: Analyze the changes\n yield {\n toolName: 'run_terminal_command',\n args: {\n command: 'git diff',\n process_type: 'SYNC',\n timeout_seconds: 30,\n },\n }\n\n yield {\n toolName: 'run_terminal_command',\n args: {\n command: 'git log --oneline -10',\n process_type: 'SYNC',\n timeout_seconds: 30,\n },\n }\n\n // Step 2: Let the AI decide what to read + what to stage based on the user's intent\n yield {\n toolName: 'add_message',\n args: {\n role: 'assistant',\n content: `Goal: ${prompt}\\n\\nI'll read any relevant files and stage the right changes next.`,\n },\n }\n\n yield 'STEP'\n\n // Step 3: Let the AI create the commit with proper formatting\n yield {\n toolName: 'add_message',\n args: {\n role: 'assistant',\n content:\n \"Now I'll create the commit with a high-quality message and the proper Codebuff footer format.\",\n },\n }\n\n yield 'STEP_ALL'\n },\n}\n\nexport default definition\n" - } - } - ], - "parentAgentId": "D-oY2QIts4E" - }, - { - "type": "tool_call", - "toolCallId": "9cacab6f-eccb-4681-98bd-9855db807bb5", - "toolName": "set_output", - "input": { - "output": { - "message": "\n{\n \"cb_tool_name\": \"write_file\",\n \"path\": \"backend/src/templates/agents/agent-builder.ts\",\n \"instructions\": \"Update agent builder to gather diff-reviewer examples plus a new starter template, keep examples under .agents/examples, copy starter into .agents root, and stop advertising spawnable agents.\",\n \"content\": \"import * as fs from 'fs'\\nimport * as path from 'path'\\n\\nimport { AGENT_TEMPLATES_DIR, AGENT_DEFINITION_FILE } from '@codebuff/common/constants'\\nimport { AgentTemplateTypes } from '@codebuff/common/types/session-state'\\nimport z from 'zod/v4'\\n\\nimport type { AgentTemplate } from '../types'\\nimport type { Model } from '@codebuff/common/constants'\\nimport type { ToolName } from '@codebuff/common/tools/constants'\\n\\nconst COMMON_UTIL_PATH = '../../../../common/src/util'\\nconst TEMPLATE_RELATIVE_PATH =\\n `${COMMON_UTIL_PATH}/types/${AGENT_DEFINITION_FILE}` as const\\n// Import to validate path exists at compile time\\nimport(TEMPLATE_RELATIVE_PATH)\\n\\nconst TEMPLATE_PATH = path.join(__dirname, TEMPLATE_RELATIVE_PATH)\\nconst TYPES_DIR = path.join(AGENT_TEMPLATES_DIR, 'types')\\nconst EXAMPLES_DIR = path.join(AGENT_TEMPLATES_DIR, 'examples')\\nconst TEMPLATE_TYPES_PATH = path.join(TYPES_DIR, AGENT_DEFINITION_FILE)\\nconst TOOL_DEFINITIONS_FILE = 'tools.d.ts'\\nconst TOOL_DEFINITIONS_PATH = path.join(TYPES_DIR, TOOL_DEFINITIONS_FILE)\\n\\nconst EXAMPLES_SOURCE_DIR = path.join(__dirname, `${COMMON_UTIL_PATH}/examples`)\\nconst STARTER_TEMPLATE_SOURCE_FILE = 'your-custom-agent.ts.txt'\\nconst STARTER_TEMPLATE_DEST_FILE = 'your-custom-agent.ts'\\n\\nexport const agentBuilder = (\\n model: Model,\\n _allAvailableAgents?: string[],\\n): Omit => {\\n // Read the AGENT_CONFIG_FILE content dynamically\\n // The import above ensures this path exists at compile time\\n let agentTemplateContent = ''\\n try {\\n agentTemplateContent = fs.readFileSync(TEMPLATE_PATH, 'utf8')\\n } catch (error) {\\n console.warn(`Could not read ${AGENT_DEFINITION_FILE}:`, error)\\n agentTemplateContent = '// Agent template types not available'\\n }\\n\\n // Read the tools.d.ts content from common package\\n let toolDefinitionsContent = ''\\n try {\\n const toolsPath = path.join(\\n __dirname,\\n `${COMMON_UTIL_PATH}/types/tools.d.ts`,\\n )\\n toolDefinitionsContent = fs.readFileSync(toolsPath, 'utf8')\\n } catch (error) {\\n console.warn(`Could not read tools.d.ts from common:`, error)\\n toolDefinitionsContent = '// Tool definitions not available'\\n }\\n\\n // Read example agent files + starter template from common package\\n const exampleAgentContents: Record = {}\\n let starterTemplateContent = ''\\n\\n try {\\n if (fs.existsSync(EXAMPLES_SOURCE_DIR)) {\\n const files = fs.readdirSync(EXAMPLES_SOURCE_DIR)\\n\\n files\\n .filter(\\n (file) => file.endsWith('.ts') && file.startsWith('diff-reviewer-'),\\n )\\n .forEach((filename) => {\\n const fullPath = path.join(EXAMPLES_SOURCE_DIR, filename)\\n const content = fs.readFileSync(fullPath, 'utf8')\\n exampleAgentContents[filename] = content\\n })\\n\\n const starterTemplatePath = path.join(\\n EXAMPLES_SOURCE_DIR,\\n STARTER_TEMPLATE_SOURCE_FILE,\\n )\\n if (fs.existsSync(starterTemplatePath)) {\\n starterTemplateContent = fs.readFileSync(starterTemplatePath, 'utf8')\\n }\\n } else {\\n console.warn(\\n `Example agents directory does not exist: ${EXAMPLES_SOURCE_DIR}`,\\n )\\n }\\n } catch (error) {\\n console.warn('Could not read example agents:', error)\\n }\\n\\n return {\\n model,\\n displayName: 'Bob the Agent Builder',\\n spawnPurposePrompt:\\n 'Enhanced base agent that can create custom agents and handle all coding tasks with deterministic agent creation behavior',\\n inputSchema: {\\n prompt: z\\n .string()\\n .optional()\\n .describe(\\n 'What agent type you would like to create or edit. Include as many details as possible.',\\n ),\\n params: z\\n .object({\\n name: z.string().optional(),\\n purpose: z.string().optional(),\\n specialty: z.string().optional(),\\n model: z.string().optional(),\\n })\\n .passthrough()\\n .optional(),\\n },\\n outputMode: 'structured_output',\\n includeMessageHistory: false,\\n toolNames: [\\n 'write_file',\\n 'str_replace',\\n 'run_terminal_command',\\n 'read_files',\\n 'code_search',\\n 'spawn_agents',\\n 'add_message',\\n 'set_output',\\n 'end_turn',\\n ] satisfies ToolName[],\\n\\n systemPrompt: [\\n '# Bob the Agent Builder',\\n '',\\n 'You are an expert agent builder specialized in creating new agent templates for the codebuff system. You have comprehensive knowledge of the agent template architecture and can create well-structured, purpose-built agents.',\\n '',\\n '## Environment Setup Complete',\\n '',\\n 'Your environment has been automatically prepared with:',\\n '- Agent template type definitions in `.agents/types/agent-definition.d.ts`',\\n '- Tool type definitions in `.agents/types/tools.d.ts`',\\n '- Diff-reviewer examples in `.agents/examples/` for reference',\\n '- A starter custom agent template at `.agents/your-custom-agent.ts`',\\n '',\\n 'All necessary files are now available in your working directory.',\\n '',\\n '## Complete Agent Template Type Definitions',\\n '',\\n 'Here are the complete TypeScript type definitions for creating custom Codebuff agents:',\\n '```typescript',\\n agentTemplateContent,\\n '```',\\n '',\\n '## Available Tools Type Definitions',\\n '',\\n 'Here are the complete TypeScript type definitions for all available tools:',\\n '',\\n '```typescript',\\n toolDefinitionsContent,\\n '```',\\n '',\\n '## Agent Template Patterns:',\\n '',\\n '1. **Base Agent Pattern**: Full-featured agents with comprehensive tool access',\\n '2. **Specialized Agent Pattern**: Focused agents with limited tool sets',\\n '3. **Thinking Agent Pattern**: Agents that spawn thinker sub-agents',\\n '4. **Research Agent Pattern**: Agents that start with web search',\\n '',\\n '## Best Practices:',\\n '',\\n '1. **Use as few fields as possible**: Leave out fields that are not needed to reduce complexity',\\n '2. **Minimal Tools**: Only include tools the agent actually needs',\\n '3. **Clear and Concise Prompts**: Write clear, specific prompts that have no unnecessary words',\\n '4. **Consistent Naming**: Follow naming conventions (kebab-case for IDs)',\\n '5. **Appropriate Model**: Choose the right model for the task complexity. Default is claude-4-sonnet-20250522 for medium-high complexity tasks, and openai/gpt-5 for all other tasks.',\\n '',\\n '## Your Task:',\\n 'When asked to create an agent template, you should:',\\n \\\"1. Understand the requested agent's purpose and capabilities\\\",\\n \\\"2. Choose appropriate tools for the agent's function\\\",\\n '3. Write a comprehensive system prompt',\\n `4. Create the complete agent template file in ${AGENT_TEMPLATES_DIR}`,\\n '5. Ensure the template follows all conventions and best practices',\\n '6. Use the AgentDefinition interface for the configuration',\\n '7. Start the file with: import type { AgentDefinition } from \\\"./types/agent-definition.d.ts\\\"',\\n '',\\n 'Create agent templates that are focused, efficient, and well-documented. Always import the AgentDefinition type and export a default configuration object.',\\n ].join('\\\\n'),\\n instructionsPrompt: `You are helping to create or edit an agent template. The user will describe what kind of agent they want to create or how they want to modify an existing agent.\\n\\n## Environment Ready\\n\\nYour environment has been automatically set up with:\\n- Type definitions in \\\\`.agents/types/\\\\`\\n- Diff-reviewer examples in \\\\`.agents/examples/\\\\`\\n- A starter custom agent template at \\\\`.agents/your-custom-agent.ts\\\\`\\n\\nYou can now proceed directly to agent creation or editing.\\n\\n## Example Agents Available\\n\\nThree diff-reviewer examples are available in \\\\`.agents/examples/\\\\`. These can serve as examples of well-made agents at different stages of complexity.\\n\\n**IMPORTANT**: Examine these examples to find connections and patterns that relate to the user's request. Look for:\\n- Similar tool combinations\\n- Comparable complexity levels\\n- Related functionality patterns\\n- Appropriate model choices\\n- Relevant prompt structures\\n\\nUse these examples as inspiration and starting points, adapting their patterns to fit the user's specific needs.\\n\\n## Starter Template Available\\n\\nA starter custom agent file is available at \\\\`.agents/your-custom-agent.ts\\\\`. You can either modify this file directly or use it as a reference for creating a new agent.\\n\\n## For New Agents\\n\\nAnalyze their request and create a complete agent template that:\\n- Has a clear purpose and appropriate capabilities\\n- Leaves out fields that are not needed\\n- Uses only the tools it needs\\n- Follows naming conventions\\n- Is properly structured\\n- Draws inspiration from relevant example agents\\n\\n## For Creating New Agents\\n\\nThe agent builder is focused on creating new agent templates based on user specifications.\\n\\nIMPORTANT: Always end your response with the end_turn tool when you have completed the agent creation or editing task.`,\\n stepPrompt: '',\\n\\n handleSteps: function* () {\\n // Step 1: Create directory structure\\n yield {\\n toolName: 'run_terminal_command',\\n args: {\\n command: `mkdir -p ${TYPES_DIR} && mkdir -p ${EXAMPLES_DIR}`,\\n process_type: 'SYNC',\\n timeout_seconds: 10,\\n },\\n }\\n\\n // Step 2: Write the AGENT_DEFINITION_FILE with the template content\\n yield {\\n toolName: 'write_file',\\n args: {\\n path: TEMPLATE_TYPES_PATH,\\n instructions: 'Create agent template type definitions file',\\n content: agentTemplateContent,\\n },\\n }\\n\\n // Step 3: Write the tool definitions file (copy from existing tools.d.ts)\\n yield {\\n toolName: 'write_file',\\n args: {\\n path: TOOL_DEFINITIONS_PATH,\\n instructions: 'Create tools type file',\\n content: toolDefinitionsContent,\\n },\\n }\\n\\n // Step 4: Add message about reading example files and then read them\\n yield {\\n toolName: 'add_message',\\n args: {\\n role: 'assistant',\\n content:\\n \\\"I'll review the starter template and diff-reviewer examples, then help you create your agent.\\\",\\n },\\n }\\n\\n // Step 5: Copy example agent files to .agents/examples/\\n for (const [filename, content] of Object.entries(exampleAgentContents)) {\\n if (content) {\\n yield {\\n toolName: 'write_file',\\n args: {\\n path: `${EXAMPLES_DIR}/${filename}`,\\n instructions: `Copy example agent file ${filename}`,\\n content: content,\\n },\\n }\\n }\\n }\\n\\n // Step 6: Copy starter template directly to .agents/\\n if (starterTemplateContent) {\\n yield {\\n toolName: 'write_file',\\n args: {\\n path: `${AGENT_TEMPLATES_DIR}/${STARTER_TEMPLATE_DEST_FILE}`,\\n instructions: `Copy starter custom agent template ${STARTER_TEMPLATE_DEST_FILE}`,\\n content: starterTemplateContent,\\n },\\n }\\n }\\n\\n // Step 7: Complete agent creation process\\n yield 'STEP_ALL'\\n },\\n }\\n}\\n\"\n}\n\n\n{\n \"cb_tool_name\": \"str_replace\",\n \"path\": \"common/src/constants/agents.ts\",\n \"replacements\": [\n {\n \"old\": \" dry_run: {\\n displayName: 'Sketch the Dry Runner',\\n purpose: 'Agent that takes a plan and try to implement it in a dry run.',\\n hidden: true,\\n } as const,\\n\",\n \"new\": \"\"\n },\n {\n \"old\": \" agent_builder: {\\n displayName: 'Bob the Agent Builder',\\n purpose: 'Creates new agent templates for the codebuff mult-agent system',\\n hidden: false,\\n } as const,\\n\",\n \"new\": \" agent_builder: {\\n displayName: 'Bob the Agent Builder',\\n purpose: 'Creates new agent templates for the codebuff multi-agent system',\\n hidden: false,\\n } as const,\\n\"\n }\n ]\n}\n\n\n{\n \"cb_tool_name\": \"write_file\",\n \"path\": \".agents/examples/diff-reviewer-1.ts\",\n \"instructions\": \"Refresh diff-reviewer-1 example to use current Anthropic model.\",\n \"content\": \"import type { AgentDefinition } from '../types/agent-definition'\\n\\nconst definition: AgentDefinition = {\\n id: 'diff-reviewer-1',\\n\\n displayName: 'Diff Reviewer (Level 1)',\\n model: 'anthropic/claude-4-sonnet-20250522',\\n toolNames: ['read_files', 'run_terminal_command'],\\n\\n spawnPurposePrompt:\\n 'Spawn when you need to review code changes in the git diff',\\n\\n instructionsPrompt: `Execute the following steps:\\n1. Run git diff\\n2. Read the files that have changed\\n3. Review the changes and suggest improvements`,\\n}\\n\\nexport default definition\\n\"\n}\n\n\n{\n \"cb_tool_name\": \"write_file\",\n \"path\": \".agents/examples/diff-reviewer-2.ts\",\n \"instructions\": \"Refresh diff-reviewer-2 example to use current Anthropic model.\",\n \"content\": \"import type {\\n AgentDefinition,\\n AgentStepContext,\\n} from '../types/agent-definition'\\n\\nconst definition: AgentDefinition = {\\n id: 'diff-reviewer-2',\\n displayName: 'Diff Reviewer (Level 2)',\\n model: 'anthropic/claude-4-sonnet-20250522',\\n\\n inputSchema: {\\n prompt: {\\n type: 'string',\\n description:\\n 'Please provide a short description of the changes you want to review',\\n },\\n },\\n toolNames: ['read_files', 'run_terminal_command'],\\n\\n spawnPurposePrompt:\\n 'Spawn when you need to review code changes in the git diff',\\n\\n systemPrompt:\\n 'You are an expert software developer. Your job is to review code changes and provide helpful feedback.',\\n\\n instructionsPrompt: `Execute the following steps:\\n1. Run git diff\\n2. Read the files that have changed\\n3. Review the changes and suggest improvements\\n\\nUse the following guidelines while reviewing the changes:\\n- Find ways to simplify the code\\n- Reuse existing code as much as possible instead of writing new code\\n- Preserve as much behavior as possible in the existing code\\n- Prefer changing as few lines of code as possible\\n- Look for opportunities to improve the code's readability\\n- Look for logical errors in the code\\n- Look for missed cases in the code\\n- Look for any other bugs`,\\n\\n handleSteps: function* ({ prompt }: AgentStepContext) {\\n // Step 1: Run git diff immediately. Saves the agent a step, lowering cost and latency!\\n yield {\\n toolName: 'run_terminal_command',\\n args: {\\n command: 'git diff',\\n },\\n }\\n\\n // Step 2: Let AI run the rest of the steps!\\n yield 'STEP_ALL'\\n },\\n}\\n\\nexport default definition\\n\"\n}\n\n\n{\n \"cb_tool_name\": \"write_file\",\n \"path\": \".agents/examples/diff-reviewer-3.ts\",\n \"instructions\": \"Refresh diff-reviewer-3 example to use current Anthropic model, correct file-explorer spawn target, and streamline final step behavior.\",\n \"content\": \"import type {\\n AgentDefinition,\\n AgentStepContext,\\n} from '../types/agent-definition'\\n\\nconst definition: AgentDefinition = {\\n id: 'diff-reviewer-3',\\n\\n displayName: 'Diff Reviewer (Level 3)',\\n model: 'anthropic/claude-4-sonnet-20250522',\\n inputSchema: {\\n prompt: {\\n type: 'string',\\n description:\\n 'Please provide a short description of the changes you want to review',\\n },\\n },\\n outputMode: 'last_message',\\n\\n toolNames: ['read_files', 'run_terminal_command', 'spawn_agents'],\\n spawnableAgents: ['file-explorer'],\\n\\n spawnPurposePrompt:\\n 'Spawn when you need to review code changes in the git diff',\\n\\n systemPrompt:\\n 'You are an expert software developer. Your job is to review code changes and provide helpful feedback.',\\n\\n instructionsPrompt: `Review the changes and suggest improvements.\\n\\nUse the following guidelines while reviewing the changes:\\n- Find ways to simplify the code\\n- Reuse existing code as much as possible instead of writing new code\\n- Preserve as much behavior as possible in the existing code\\n- Prefer changing as few lines of code as possible\\n- Look for opportunities to improve the code's readability\\n- Look for logical errors in the code\\n- Look for missed cases in the code\\n- Look for any other bugs`,\\n\\n handleSteps: function* ({ prompt }: AgentStepContext) {\\n // Step 1: Get list of changed files from git diff --name-only\\n const { toolResult: gitDiffFilesResult } = yield {\\n toolName: 'run_terminal_command',\\n args: {\\n command: 'git diff --name-only',\\n },\\n }\\n\\n const changedFiles = (gitDiffFilesResult || '')\\n .split('\\\\n')\\n .map((line) => line.trim())\\n .filter((line) => line && !line.startsWith('??') && !line.includes('OSC'))\\n\\n // Step 2: Read changed files\\n if (changedFiles.length > 0) {\\n yield {\\n toolName: 'read_files',\\n args: {\\n paths: changedFiles,\\n },\\n }\\n }\\n\\n // Step 3: Run full git diff to see the actual changes\\n yield {\\n toolName: 'run_terminal_command',\\n args: {\\n command: 'git diff',\\n },\\n }\\n\\n // Step 4: Spawn file explorer for broader context if needed\\n yield {\\n toolName: 'spawn_agents',\\n args: {\\n agents: [\\n {\\n agent_type: 'file-explorer',\\n prompt: `Find any additional codebase context needed to review these changes. Review focus: ${prompt || ''}`,\\n params: {\\n prompts: [\\n 'Any modules/classes/functions referenced by the diff',\\n 'Relevant tests or test helpers for the changed code',\\n 'Related config or shared utilities that might be impacted',\\n ],\\n },\\n },\\n ],\\n },\\n }\\n\\n // Step 5: Let the AI produce the final review in a single final step\\n yield 'STEP_ALL'\\n },\\n}\\n\\nexport default definition\\n\"\n}\n\n\n{\n \"cb_tool_name\": \"write_file\",\n \"path\": \"common/src/util/examples/diff-reviewer-1.ts\",\n \"instructions\": \"Refresh common diff-reviewer-1 example to use current Anthropic model.\",\n \"content\": \"import type { AgentDefinition } from '../types/agent-definition'\\n\\nconst definition: AgentDefinition = {\\n id: 'diff-reviewer-1',\\n\\n displayName: 'Diff Reviewer (Level 1)',\\n model: 'anthropic/claude-4-sonnet-20250522',\\n toolNames: ['read_files', 'run_terminal_command'],\\n\\n spawnPurposePrompt:\\n 'Spawn when you need to review code changes in the git diff',\\n\\n instructionsPrompt: `Execute the following steps:\\n1. Run git diff\\n2. Read the files that have changed\\n3. Review the changes and suggest improvements`,\\n}\\n\\nexport default definition\\n\"\n}\n\n\n{\n \"cb_tool_name\": \"write_file\",\n \"path\": \"common/src/util/examples/diff-reviewer-2.ts\",\n \"instructions\": \"Refresh common diff-reviewer-2 example to use current Anthropic model.\",\n \"content\": \"import type {\\n AgentDefinition,\\n AgentStepContext,\\n} from '../types/agent-definition'\\n\\nconst definition: AgentDefinition = {\\n id: 'diff-reviewer-2',\\n displayName: 'Diff Reviewer (Level 2)',\\n model: 'anthropic/claude-4-sonnet-20250522',\\n\\n inputSchema: {\\n prompt: {\\n type: 'string',\\n description:\\n 'Please provide a short description of the changes you want to review',\\n },\\n },\\n toolNames: ['read_files', 'run_terminal_command'],\\n\\n spawnPurposePrompt:\\n 'Spawn when you need to review code changes in the git diff',\\n\\n systemPrompt:\\n 'You are an expert software developer. Your job is to review code changes and provide helpful feedback.',\\n\\n instructionsPrompt: `Execute the following steps:\\n1. Run git diff\\n2. Read the files that have changed\\n3. Review the changes and suggest improvements\\n\\nUse the following guidelines while reviewing the changes:\\n- Find ways to simplify the code\\n- Reuse existing code as much as possible instead of writing new code\\n- Preserve as much behavior as possible in the existing code\\n- Prefer changing as few lines of code as possible\\n- Look for opportunities to improve the code's readability\\n- Look for logical errors in the code\\n- Look for missed cases in the code\\n- Look for any other bugs`,\\n\\n handleSteps: function* ({ prompt }: AgentStepContext) {\\n // Step 1: Run git diff immediately. Saves the agent a step, lowering cost and latency!\\n yield {\\n toolName: 'run_terminal_command',\\n args: {\\n command: 'git diff',\\n },\\n }\\n\\n // Step 2: Let AI run the rest of the steps!\\n yield 'STEP_ALL'\\n },\\n}\\n\\nexport default definition\\n\"\n}\n\n\n{\n \"cb_tool_name\": \"write_file\",\n \"path\": \"common/src/util/examples/diff-reviewer-3.ts\",\n \"instructions\": \"Refresh common diff-reviewer-3 example to use current Anthropic model, correct file-explorer spawn target, and streamline final step behavior.\",\n \"content\": \"import type {\\n AgentDefinition,\\n AgentStepContext,\\n} from '../types/agent-definition'\\n\\nconst definition: AgentDefinition = {\\n id: 'diff-reviewer-3',\\n\\n displayName: 'Diff Reviewer (Level 3)',\\n model: 'anthropic/claude-4-sonnet-20250522',\\n inputSchema: {\\n prompt: {\\n type: 'string',\\n description:\\n 'Please provide a short description of the changes you want to review',\\n },\\n },\\n outputMode: 'last_message',\\n\\n toolNames: ['read_files', 'run_terminal_command', 'spawn_agents'],\\n spawnableAgents: ['file-explorer'],\\n\\n spawnPurposePrompt:\\n 'Spawn when you need to review code changes in the git diff',\\n\\n systemPrompt:\\n 'You are an expert software developer. Your job is to review code changes and provide helpful feedback.',\\n\\n instructionsPrompt: `Review the changes and suggest improvements.\\n\\nUse the following guidelines while reviewing the changes:\\n- Find ways to simplify the code\\n- Reuse existing code as much as possible instead of writing new code\\n- Preserve as much behavior as possible in the existing code\\n- Prefer changing as few lines of code as possible\\n- Look for opportunities to improve the code's readability\\n- Look for logical errors in the code\\n- Look for missed cases in the code\\n- Look for any other bugs`,\\n\\n handleSteps: function* ({ prompt }: AgentStepContext) {\\n // Step 1: Get list of changed files from git diff --name-only\\n const { toolResult: gitDiffFilesResult } = yield {\\n toolName: 'run_terminal_command',\\n args: {\\n command: 'git diff --name-only',\\n },\\n }\\n\\n const changedFiles = (gitDiffFilesResult || '')\\n .split('\\\\n')\\n .map((line) => line.trim())\\n .filter((line) => line && !line.startsWith('??') && !line.includes('OSC'))\\n\\n // Step 2: Read changed files\\n if (changedFiles.length > 0) {\\n yield {\\n toolName: 'read_files',\\n args: {\\n paths: changedFiles,\\n },\\n }\\n }\\n\\n // Step 3: Run full git diff to see the actual changes\\n yield {\\n toolName: 'run_terminal_command',\\n args: {\\n command: 'git diff',\\n },\\n }\\n\\n // Step 4: Spawn file explorer for broader context if needed\\n yield {\\n toolName: 'spawn_agents',\\n args: {\\n agents: [\\n {\\n agent_type: 'file-explorer',\\n prompt: `Find any additional codebase context needed to review these changes. Review focus: ${prompt || ''}`,\\n params: {\\n prompts: [\\n 'Any modules/classes/functions referenced by the diff',\\n 'Relevant tests or test helpers for the changed code',\\n 'Related config or shared utilities that might be impacted',\\n ],\\n },\\n },\\n ],\\n },\\n }\\n\\n // Step 5: Let the AI produce the final review in a single final step\\n yield 'STEP_ALL'\\n },\\n}\\n\\nexport default definition\\n\"\n}\n\n\n{\n \"cb_tool_name\": \"write_file\",\n \"path\": \".agents/your-custom-agent.ts\",\n \"instructions\": \"Add a new starter custom agent (Git Committer scaffold) in the top-level .agents directory, ready to run and publish.\",\n \"content\": \"import { publisher, version } from './constants'\\n\\nimport type {\\n AgentDefinition,\\n AgentStepContext,\\n} from './types/agent-definition'\\n\\nconst definition: AgentDefinition = {\\n id: 'your-custom-agent',\\n version,\\n publisher,\\n\\n displayName: 'Your Custom Agent (Git Committer)',\\n model: 'anthropic/claude-4-sonnet-20250522',\\n toolNames: ['read_files', 'run_terminal_command', 'add_message', 'end_turn'],\\n\\n inputSchema: {\\n prompt: {\\n type: 'string',\\n description: 'What changes to commit',\\n },\\n },\\n\\n includeMessageHistory: false,\\n outputMode: 'last_message',\\n\\n spawnPurposePrompt:\\n 'Spawn when you need to commit code changes to git with an appropriate commit message',\\n\\n systemPrompt:\\n 'You are an expert software developer. Your job is to create a git commit with a really good commit message.',\\n\\n instructionsPrompt:\\n 'Follow the steps to create a good commit: analyze changes with git diff and git log, read relevant files for context, stage appropriate files, and create a commit with proper formatting including the Codebuff footer.',\\n\\n handleSteps: function* ({ prompt }: AgentStepContext) {\\n // Step 1: Analyze the changes\\n yield {\\n toolName: 'run_terminal_command',\\n args: {\\n command: 'git diff',\\n process_type: 'SYNC',\\n timeout_seconds: 30,\\n },\\n }\\n\\n yield {\\n toolName: 'run_terminal_command',\\n args: {\\n command: 'git log --oneline -10',\\n process_type: 'SYNC',\\n timeout_seconds: 30,\\n },\\n }\\n\\n // Step 2: Let the AI decide what to read + what to stage based on the user's intent\\n yield {\\n toolName: 'add_message',\\n args: {\\n role: 'assistant',\\n content: `Goal: ${prompt}\\\\n\\\\nI'll read any relevant files and stage the right changes next.`,\\n },\\n }\\n\\n yield 'STEP'\\n\\n // Step 3: Let the AI create the commit with proper formatting\\n yield {\\n toolName: 'add_message',\\n args: {\\n role: 'assistant',\\n content:\\n \\\"Now I'll create the commit with a high-quality message and the proper Codebuff footer format.\\\",\\n },\\n }\\n\\n yield 'STEP_ALL'\\n },\\n}\\n\\nexport default definition\\n\"\n}\n\n\n{\n \"cb_tool_name\": \"write_file\",\n \"path\": \"common/src/util/examples/your-custom-agent.ts.txt\",\n \"instructions\": \"Add starter custom agent template content for the agent builder to copy into .agents/your-custom-agent.ts.\",\n \"content\": \"import { publisher, version } from './constants'\\n\\nimport type {\\n AgentDefinition,\\n AgentStepContext,\\n} from './types/agent-definition'\\n\\nconst definition: AgentDefinition = {\\n id: 'your-custom-agent',\\n version,\\n publisher,\\n\\n displayName: 'Your Custom Agent (Git Committer)',\\n model: 'anthropic/claude-4-sonnet-20250522',\\n toolNames: ['read_files', 'run_terminal_command', 'add_message', 'end_turn'],\\n\\n inputSchema: {\\n prompt: {\\n type: 'string',\\n description: 'What changes to commit',\\n },\\n },\\n\\n includeMessageHistory: false,\\n outputMode: 'last_message',\\n\\n spawnPurposePrompt:\\n 'Spawn when you need to commit code changes to git with an appropriate commit message',\\n\\n systemPrompt:\\n 'You are an expert software developer. Your job is to create a git commit with a really good commit message.',\\n\\n instructionsPrompt:\\n 'Follow the steps to create a good commit: analyze changes with git diff and git log, read relevant files for context, stage appropriate files, and create a commit with proper formatting including the Codebuff footer.',\\n\\n handleSteps: function* ({ prompt }: AgentStepContext) {\\n // Step 1: Analyze the changes\\n yield {\\n toolName: 'run_terminal_command',\\n args: {\\n command: 'git diff',\\n process_type: 'SYNC',\\n timeout_seconds: 30,\\n },\\n }\\n\\n yield {\\n toolName: 'run_terminal_command',\\n args: {\\n command: 'git log --oneline -10',\\n process_type: 'SYNC',\\n timeout_seconds: 30,\\n },\\n }\\n\\n // Step 2: Let the AI decide what to read + what to stage based on the user's intent\\n yield {\\n toolName: 'add_message',\\n args: {\\n role: 'assistant',\\n content: `Goal: ${prompt}\\\\n\\\\nI'll read any relevant files and stage the right changes next.`,\\n },\\n }\\n\\n yield 'STEP'\\n\\n // Step 3: Let the AI create the commit with proper formatting\\n yield {\\n toolName: 'add_message',\\n args: {\\n role: 'assistant',\\n content:\\n \\\"Now I'll create the commit with a high-quality message and the proper Codebuff footer format.\\\",\\n },\\n }\\n\\n yield 'STEP_ALL'\\n },\\n}\\n\\nexport default definition\\n\"\n}\n", - "toolResults": [ - { - "file": "backend/src/templates/agents/agent-builder.ts", - "message": "Updated file", - "unifiedDiff": "@@ -1,12 +1,8 @@\n import * as fs from 'fs'\n import * as path from 'path'\n \n-import {\n- AGENT_TEMPLATES_DIR,\n- openrouterModels,\n- AGENT_DEFINITION_FILE,\n-} from '@codebuff/common/constants'\n+import { AGENT_TEMPLATES_DIR, AGENT_DEFINITION_FILE } from '@codebuff/common/constants'\n import { AgentTemplateTypes } from '@codebuff/common/types/session-state'\n import z from 'zod/v4'\n \n import type { AgentTemplate } from '../types'\n@@ -19,9 +15,8 @@\n // Import to validate path exists at compile time\n import(TEMPLATE_RELATIVE_PATH)\n \n const TEMPLATE_PATH = path.join(__dirname, TEMPLATE_RELATIVE_PATH)\n-const DEFAULT_MODEL = openrouterModels.openrouter_claude_sonnet_4\n const TYPES_DIR = path.join(AGENT_TEMPLATES_DIR, 'types')\n const EXAMPLES_DIR = path.join(AGENT_TEMPLATES_DIR, 'examples')\n const TEMPLATE_TYPES_PATH = path.join(TYPES_DIR, AGENT_DEFINITION_FILE)\n const TOOL_DEFINITIONS_FILE = 'tools.d.ts'\n@@ -32,9 +27,9 @@\n const STARTER_TEMPLATE_DEST_FILE = 'your-custom-agent.ts'\n \n export const agentBuilder = (\n model: Model,\n- allAvailableAgents?: string[],\n+ _allAvailableAgents?: string[],\n ): Omit => {\n // Read the AGENT_CONFIG_FILE content dynamically\n // The import above ensures this path exists at compile time\n let agentTemplateContent = ''\n@@ -57,9 +52,9 @@\n console.warn(`Could not read tools.d.ts from common:`, error)\n toolDefinitionsContent = '// Tool definitions not available'\n }\n \n- // Read example agent files from common package\n+ // Read example agent files + starter template from common package\n const exampleAgentContents: Record = {}\n let starterTemplateContent = ''\n \n try {\n@@ -229,9 +224,9 @@\n \n IMPORTANT: Always end your response with the end_turn tool when you have completed the agent creation or editing task.`,\n stepPrompt: '',\n \n- handleSteps: function* ({ agentState, prompt, params }) {\n+ handleSteps: function* () {\n // Step 1: Create directory structure\n yield {\n toolName: 'run_terminal_command',\n args: {\n" - }, - { - "file": "common/src/constants/agents.ts", - "message": "Updated file", - "unifiedDiff": "@@ -64,21 +64,16 @@\n displayName: 'Peter Plan the Planner',\n purpose: 'Agent that formulates a comprehensive plan to a prompt.',\n hidden: true,\n } as const,\n- dry_run: {\n- displayName: 'Sketch the Dry Runner',\n- purpose: 'Agent that takes a plan and try to implement it in a dry run.',\n- hidden: true,\n- } as const,\n reviewer: {\n displayName: 'Nit Pick Nick the Reviewer',\n purpose:\n 'Reviews file changes and responds with critical feedback. Use this after making any significant change to the codebase.',\n } as const,\n agent_builder: {\n displayName: 'Bob the Agent Builder',\n- purpose: 'Creates new agent templates for the codebuff mult-agent system',\n+ purpose: 'Creates new agent templates for the codebuff multi-agent system',\n hidden: false,\n } as const,\n } as const satisfies Partial<\n Record<\n" - }, - { - "file": ".agents/examples/diff-reviewer-1.ts", - "message": "Updated file", - "unifiedDiff": "@@ -3,9 +3,9 @@\n const definition: AgentDefinition = {\n id: 'diff-reviewer-1',\n \n displayName: 'Diff Reviewer (Level 1)',\n- model: 'openai/gpt-5',\n+ model: 'anthropic/claude-4-sonnet-20250522',\n toolNames: ['read_files', 'run_terminal_command'],\n \n spawnPurposePrompt:\n 'Spawn when you need to review code changes in the git diff',\n" - }, - { - "file": ".agents/examples/diff-reviewer-2.ts", - "message": "Updated file", - "unifiedDiff": "@@ -5,9 +5,9 @@\n \n const definition: AgentDefinition = {\n id: 'diff-reviewer-2',\n displayName: 'Diff Reviewer (Level 2)',\n- model: 'openai/gpt-5',\n+ model: 'anthropic/claude-4-sonnet-20250522',\n \n inputSchema: {\n prompt: {\n type: 'string',\n@@ -37,9 +37,9 @@\n - Look for logical errors in the code\n - Look for missed cases in the code\n - Look for any other bugs`,\n \n- handleSteps: function* ({ agentState, prompt, params }: AgentStepContext) {\n+ handleSteps: function* ({ prompt }: AgentStepContext) {\n // Step 1: Run git diff immediately. Saves the agent a step, lowering cost and latency!\n yield {\n toolName: 'run_terminal_command',\n args: {\n" - }, - { - "file": ".agents/examples/diff-reviewer-3.ts", - "message": "Updated file", - "unifiedDiff": "@@ -6,9 +6,9 @@\n const definition: AgentDefinition = {\n id: 'diff-reviewer-3',\n \n displayName: 'Diff Reviewer (Level 3)',\n- model: 'openai/gpt-5',\n+ model: 'anthropic/claude-4-sonnet-20250522',\n inputSchema: {\n prompt: {\n type: 'string',\n description:\n@@ -17,9 +17,9 @@\n },\n outputMode: 'last_message',\n \n toolNames: ['read_files', 'run_terminal_command', 'spawn_agents'],\n- spawnableAgents: ['james/file-explorer@0.1.3'],\n+ spawnableAgents: ['file-explorer'],\n \n spawnPurposePrompt:\n 'Spawn when you need to review code changes in the git diff',\n \n@@ -37,24 +37,23 @@\n - Look for logical errors in the code\n - Look for missed cases in the code\n - Look for any other bugs`,\n \n- handleSteps: function* ({ agentState, prompt, params }: AgentStepContext) {\n+ handleSteps: function* ({ prompt }: AgentStepContext) {\n // Step 1: Get list of changed files from git diff --name-only\n const { toolResult: gitDiffFilesResult } = yield {\n toolName: 'run_terminal_command',\n args: {\n command: 'git diff --name-only',\n },\n }\n \n- // Then, extract file paths from the result\n const changedFiles = (gitDiffFilesResult || '')\n .split('\\n')\n .map((line) => line.trim())\n .filter((line) => line && !line.startsWith('??') && !line.includes('OSC'))\n \n- // Step 2: Read the files\n+ // Step 2: Read changed files\n if (changedFiles.length > 0) {\n yield {\n toolName: 'read_files',\n args: {\n@@ -70,31 +69,30 @@\n command: 'git diff',\n },\n }\n \n- // Step 4: Put words in the AI's mouth to get it to spawn the file explorer.\n+ // Step 4: Spawn file explorer for broader context if needed\n yield {\n- toolName: 'add_message',\n+ toolName: 'spawn_agents',\n args: {\n- role: 'assistant',\n- content:\n- 'Now I will spawn a file explorer to find any missing codebase context.',\n+ agents: [\n+ {\n+ agent_type: 'file-explorer',\n+ prompt: `Find any additional codebase context needed to review these changes. Review focus: ${prompt || ''}`,\n+ params: {\n+ prompts: [\n+ 'Any modules/classes/functions referenced by the diff',\n+ 'Relevant tests or test helpers for the changed code',\n+ 'Related config or shared utilities that might be impacted',\n+ ],\n+ },\n+ },\n+ ],\n },\n }\n \n- yield 'STEP'\n-\n- // Step 5: Put words in the AI's mouth to review the changes.\n- yield {\n- toolName: 'add_message',\n- args: {\n- role: 'assistant',\n- content: 'Here is my comprehensive review of the changes.',\n- },\n- }\n-\n- // Step 6: Let AI review the changes in a final step. (The last message is also the agent's output.)\n- yield 'STEP'\n+ // Step 5: Let the AI produce the final review in a single final step\n+ yield 'STEP_ALL'\n },\n }\n \n export default definition\n" - }, - { - "file": "common/src/util/examples/diff-reviewer-1.ts", - "message": "Updated file", - "unifiedDiff": "@@ -3,9 +3,9 @@\n const definition: AgentDefinition = {\n id: 'diff-reviewer-1',\n \n displayName: 'Diff Reviewer (Level 1)',\n- model: 'openai/gpt-5',\n+ model: 'anthropic/claude-4-sonnet-20250522',\n toolNames: ['read_files', 'run_terminal_command'],\n \n spawnPurposePrompt:\n 'Spawn when you need to review code changes in the git diff',\n" - }, - { - "file": "common/src/util/examples/diff-reviewer-2.ts", - "message": "Updated file", - "unifiedDiff": "@@ -5,9 +5,9 @@\n \n const definition: AgentDefinition = {\n id: 'diff-reviewer-2',\n displayName: 'Diff Reviewer (Level 2)',\n- model: 'openai/gpt-5',\n+ model: 'anthropic/claude-4-sonnet-20250522',\n \n inputSchema: {\n prompt: {\n type: 'string',\n@@ -37,9 +37,9 @@\n - Look for logical errors in the code\n - Look for missed cases in the code\n - Look for any other bugs`,\n \n- handleSteps: function* ({ agentState, prompt, params }: AgentStepContext) {\n+ handleSteps: function* ({ prompt }: AgentStepContext) {\n // Step 1: Run git diff immediately. Saves the agent a step, lowering cost and latency!\n yield {\n toolName: 'run_terminal_command',\n args: {\n" - }, - { - "file": "common/src/util/examples/diff-reviewer-3.ts", - "message": "Updated file", - "unifiedDiff": "@@ -6,9 +6,9 @@\n const definition: AgentDefinition = {\n id: 'diff-reviewer-3',\n \n displayName: 'Diff Reviewer (Level 3)',\n- model: 'openai/gpt-5',\n+ model: 'anthropic/claude-4-sonnet-20250522',\n inputSchema: {\n prompt: {\n type: 'string',\n description:\n@@ -17,9 +17,9 @@\n },\n outputMode: 'last_message',\n \n toolNames: ['read_files', 'run_terminal_command', 'spawn_agents'],\n- spawnableAgents: ['james/file-explorer@0.1.3'],\n+ spawnableAgents: ['file-explorer'],\n \n spawnPurposePrompt:\n 'Spawn when you need to review code changes in the git diff',\n \n@@ -37,24 +37,23 @@\n - Look for logical errors in the code\n - Look for missed cases in the code\n - Look for any other bugs`,\n \n- handleSteps: function* ({ agentState, prompt, params }: AgentStepContext) {\n+ handleSteps: function* ({ prompt }: AgentStepContext) {\n // Step 1: Get list of changed files from git diff --name-only\n const { toolResult: gitDiffFilesResult } = yield {\n toolName: 'run_terminal_command',\n args: {\n command: 'git diff --name-only',\n },\n }\n \n- // Then, extract file paths from the result\n const changedFiles = (gitDiffFilesResult || '')\n .split('\\n')\n .map((line) => line.trim())\n .filter((line) => line && !line.startsWith('??') && !line.includes('OSC'))\n \n- // Step 2: Read the files\n+ // Step 2: Read changed files\n if (changedFiles.length > 0) {\n yield {\n toolName: 'read_files',\n args: {\n@@ -70,31 +69,30 @@\n command: 'git diff',\n },\n }\n \n- // Step 4: Put words in the AI's mouth to get it to spawn the file explorer.\n+ // Step 4: Spawn file explorer for broader context if needed\n yield {\n- toolName: 'add_message',\n+ toolName: 'spawn_agents',\n args: {\n- role: 'assistant',\n- content:\n- 'Now I will spawn a file explorer to find any missing codebase context.',\n+ agents: [\n+ {\n+ agent_type: 'file-explorer',\n+ prompt: `Find any additional codebase context needed to review these changes. Review focus: ${prompt || ''}`,\n+ params: {\n+ prompts: [\n+ 'Any modules/classes/functions referenced by the diff',\n+ 'Relevant tests or test helpers for the changed code',\n+ 'Related config or shared utilities that might be impacted',\n+ ],\n+ },\n+ },\n+ ],\n },\n }\n \n- yield 'STEP'\n-\n- // Step 5: Put words in the AI's mouth to review the changes.\n- yield {\n- toolName: 'add_message',\n- args: {\n- role: 'assistant',\n- content: 'Here is my comprehensive review of the changes.',\n- },\n- }\n-\n- // Step 6: Let AI review the changes in a final step. (The last message is also the agent's output.)\n- yield 'STEP'\n+ // Step 5: Let the AI produce the final review in a single final step\n+ yield 'STEP_ALL'\n },\n }\n \n export default definition\n" - }, - { - "file": ".agents/your-custom-agent.ts", - "message": "Created new file", - "unifiedDiff": "import { publisher, version } from './constants'\n\nimport type {\n AgentDefinition,\n AgentStepContext,\n} from './types/agent-definition'\n\nconst definition: AgentDefinition = {\n id: 'your-custom-agent',\n version,\n publisher,\n\n displayName: 'Your Custom Agent (Git Committer)',\n model: 'anthropic/claude-4-sonnet-20250522',\n toolNames: ['read_files', 'run_terminal_command', 'add_message', 'end_turn'],\n\n inputSchema: {\n prompt: {\n type: 'string',\n description: 'What changes to commit',\n },\n },\n\n includeMessageHistory: false,\n outputMode: 'last_message',\n\n spawnPurposePrompt:\n 'Spawn when you need to commit code changes to git with an appropriate commit message',\n\n systemPrompt:\n 'You are an expert software developer. Your job is to create a git commit with a really good commit message.',\n\n instructionsPrompt:\n 'Follow the steps to create a good commit: analyze changes with git diff and git log, read relevant files for context, stage appropriate files, and create a commit with proper formatting including the Codebuff footer.',\n\n handleSteps: function* ({ prompt }: AgentStepContext) {\n // Step 1: Analyze the changes\n yield {\n toolName: 'run_terminal_command',\n args: {\n command: 'git diff',\n process_type: 'SYNC',\n timeout_seconds: 30,\n },\n }\n\n yield {\n toolName: 'run_terminal_command',\n args: {\n command: 'git log --oneline -10',\n process_type: 'SYNC',\n timeout_seconds: 30,\n },\n }\n\n // Step 2: Let the AI decide what to read + what to stage based on the user's intent\n yield {\n toolName: 'add_message',\n args: {\n role: 'assistant',\n content: `Goal: ${prompt}\\n\\nI'll read any relevant files and stage the right changes next.`,\n },\n }\n\n yield 'STEP'\n\n // Step 3: Let the AI create the commit with proper formatting\n yield {\n toolName: 'add_message',\n args: {\n role: 'assistant',\n content:\n \"Now I'll create the commit with a high-quality message and the proper Codebuff footer format.\",\n },\n }\n\n yield 'STEP_ALL'\n },\n}\n\nexport default definition\n" - }, - { - "file": "common/src/util/examples/your-custom-agent.ts.txt", - "message": "Created new file", - "unifiedDiff": "import { publisher, version } from './constants'\n\nimport type {\n AgentDefinition,\n AgentStepContext,\n} from './types/agent-definition'\n\nconst definition: AgentDefinition = {\n id: 'your-custom-agent',\n version,\n publisher,\n\n displayName: 'Your Custom Agent (Git Committer)',\n model: 'anthropic/claude-4-sonnet-20250522',\n toolNames: ['read_files', 'run_terminal_command', 'add_message', 'end_turn'],\n\n inputSchema: {\n prompt: {\n type: 'string',\n description: 'What changes to commit',\n },\n },\n\n includeMessageHistory: false,\n outputMode: 'last_message',\n\n spawnPurposePrompt:\n 'Spawn when you need to commit code changes to git with an appropriate commit message',\n\n systemPrompt:\n 'You are an expert software developer. Your job is to create a git commit with a really good commit message.',\n\n instructionsPrompt:\n 'Follow the steps to create a good commit: analyze changes with git diff and git log, read relevant files for context, stage appropriate files, and create a commit with proper formatting including the Codebuff footer.',\n\n handleSteps: function* ({ prompt }: AgentStepContext) {\n // Step 1: Analyze the changes\n yield {\n toolName: 'run_terminal_command',\n args: {\n command: 'git diff',\n process_type: 'SYNC',\n timeout_seconds: 30,\n },\n }\n\n yield {\n toolName: 'run_terminal_command',\n args: {\n command: 'git log --oneline -10',\n process_type: 'SYNC',\n timeout_seconds: 30,\n },\n }\n\n // Step 2: Let the AI decide what to read + what to stage based on the user's intent\n yield {\n toolName: 'add_message',\n args: {\n role: 'assistant',\n content: `Goal: ${prompt}\\n\\nI'll read any relevant files and stage the right changes next.`,\n },\n }\n\n yield 'STEP'\n\n // Step 3: Let the AI create the commit with proper formatting\n yield {\n toolName: 'add_message',\n args: {\n role: 'assistant',\n content:\n \"Now I'll create the commit with a high-quality message and the proper Codebuff footer format.\",\n },\n }\n\n yield 'STEP_ALL'\n },\n}\n\nexport default definition\n" - } - ] - } - }, - "agentId": "D-oY2QIts4E", - "parentAgentId": "main-agent", - "includeToolCall": false - }, - { - "type": "tool_result", - "toolCallId": "9cacab6f-eccb-4681-98bd-9855db807bb5", - "toolName": "set_output", - "output": [ - { - "type": "json", - "value": { - "message": "Output set" - } - } - ], - "parentAgentId": "D-oY2QIts4E" - }, - { - "type": "subagent_finish", - "agentId": "D-oY2QIts4E", - "agentType": "editor-gpt-5", - "displayName": "Code Editor", - "onlyChild": true, - "parentAgentId": "main-agent", - "prompt": "" - }, - { - "type": "tool_result", - "toolCallId": "D-oWnvQd5aA", - "toolName": "spawn_agents", - "output": [ - { - "type": "json", - "value": [ - { - "agentName": "Code Editor", - "agentType": "editor-gpt-5", - "value": { - "type": "structuredOutput", - "value": { - "output": { - "message": "\n{\n \"cb_tool_name\": \"write_file\",\n \"path\": \"backend/src/templates/agents/agent-builder.ts\",\n \"instructions\": \"Update agent builder to gather diff-reviewer examples plus a new starter template, keep examples under .agents/examples, copy starter into .agents root, and stop advertising spawnable agents.\",\n \"content\": \"import * as fs from 'fs'\\nimport * as path from 'path'\\n\\nimport { AGENT_TEMPLATES_DIR, AGENT_DEFINITION_FILE } from '@codebuff/common/constants'\\nimport { AgentTemplateTypes } from '@codebuff/common/types/session-state'\\nimport z from 'zod/v4'\\n\\nimport type { AgentTemplate } from '../types'\\nimport type { Model } from '@codebuff/common/constants'\\nimport type { ToolName } from '@codebuff/common/tools/constants'\\n\\nconst COMMON_UTIL_PATH = '../../../../common/src/util'\\nconst TEMPLATE_RELATIVE_PATH =\\n `${COMMON_UTIL_PATH}/types/${AGENT_DEFINITION_FILE}` as const\\n// Import to validate path exists at compile time\\nimport(TEMPLATE_RELATIVE_PATH)\\n\\nconst TEMPLATE_PATH = path.join(__dirname, TEMPLATE_RELATIVE_PATH)\\nconst TYPES_DIR = path.join(AGENT_TEMPLATES_DIR, 'types')\\nconst EXAMPLES_DIR = path.join(AGENT_TEMPLATES_DIR, 'examples')\\nconst TEMPLATE_TYPES_PATH = path.join(TYPES_DIR, AGENT_DEFINITION_FILE)\\nconst TOOL_DEFINITIONS_FILE = 'tools.d.ts'\\nconst TOOL_DEFINITIONS_PATH = path.join(TYPES_DIR, TOOL_DEFINITIONS_FILE)\\n\\nconst EXAMPLES_SOURCE_DIR = path.join(__dirname, `${COMMON_UTIL_PATH}/examples`)\\nconst STARTER_TEMPLATE_SOURCE_FILE = 'your-custom-agent.ts.txt'\\nconst STARTER_TEMPLATE_DEST_FILE = 'your-custom-agent.ts'\\n\\nexport const agentBuilder = (\\n model: Model,\\n _allAvailableAgents?: string[],\\n): Omit => {\\n // Read the AGENT_CONFIG_FILE content dynamically\\n // The import above ensures this path exists at compile time\\n let agentTemplateContent = ''\\n try {\\n agentTemplateContent = fs.readFileSync(TEMPLATE_PATH, 'utf8')\\n } catch (error) {\\n console.warn(`Could not read ${AGENT_DEFINITION_FILE}:`, error)\\n agentTemplateContent = '// Agent template types not available'\\n }\\n\\n // Read the tools.d.ts content from common package\\n let toolDefinitionsContent = ''\\n try {\\n const toolsPath = path.join(\\n __dirname,\\n `${COMMON_UTIL_PATH}/types/tools.d.ts`,\\n )\\n toolDefinitionsContent = fs.readFileSync(toolsPath, 'utf8')\\n } catch (error) {\\n console.warn(`Could not read tools.d.ts from common:`, error)\\n toolDefinitionsContent = '// Tool definitions not available'\\n }\\n\\n // Read example agent files + starter template from common package\\n const exampleAgentContents: Record = {}\\n let starterTemplateContent = ''\\n\\n try {\\n if (fs.existsSync(EXAMPLES_SOURCE_DIR)) {\\n const files = fs.readdirSync(EXAMPLES_SOURCE_DIR)\\n\\n files\\n .filter(\\n (file) => file.endsWith('.ts') && file.startsWith('diff-reviewer-'),\\n )\\n .forEach((filename) => {\\n const fullPath = path.join(EXAMPLES_SOURCE_DIR, filename)\\n const content = fs.readFileSync(fullPath, 'utf8')\\n exampleAgentContents[filename] = content\\n })\\n\\n const starterTemplatePath = path.join(\\n EXAMPLES_SOURCE_DIR,\\n STARTER_TEMPLATE_SOURCE_FILE,\\n )\\n if (fs.existsSync(starterTemplatePath)) {\\n starterTemplateContent = fs.readFileSync(starterTemplatePath, 'utf8')\\n }\\n } else {\\n console.warn(\\n `Example agents directory does not exist: ${EXAMPLES_SOURCE_DIR}`,\\n )\\n }\\n } catch (error) {\\n console.warn('Could not read example agents:', error)\\n }\\n\\n return {\\n model,\\n displayName: 'Bob the Agent Builder',\\n spawnPurposePrompt:\\n 'Enhanced base agent that can create custom agents and handle all coding tasks with deterministic agent creation behavior',\\n inputSchema: {\\n prompt: z\\n .string()\\n .optional()\\n .describe(\\n 'What agent type you would like to create or edit. Include as many details as possible.',\\n ),\\n params: z\\n .object({\\n name: z.string().optional(),\\n purpose: z.string().optional(),\\n specialty: z.string().optional(),\\n model: z.string().optional(),\\n })\\n .passthrough()\\n .optional(),\\n },\\n outputMode: 'structured_output',\\n includeMessageHistory: false,\\n toolNames: [\\n 'write_file',\\n 'str_replace',\\n 'run_terminal_command',\\n 'read_files',\\n 'code_search',\\n 'spawn_agents',\\n 'add_message',\\n 'set_output',\\n 'end_turn',\\n ] satisfies ToolName[],\\n\\n systemPrompt: [\\n '# Bob the Agent Builder',\\n '',\\n 'You are an expert agent builder specialized in creating new agent templates for the codebuff system. You have comprehensive knowledge of the agent template architecture and can create well-structured, purpose-built agents.',\\n '',\\n '## Environment Setup Complete',\\n '',\\n 'Your environment has been automatically prepared with:',\\n '- Agent template type definitions in `.agents/types/agent-definition.d.ts`',\\n '- Tool type definitions in `.agents/types/tools.d.ts`',\\n '- Diff-reviewer examples in `.agents/examples/` for reference',\\n '- A starter custom agent template at `.agents/your-custom-agent.ts`',\\n '',\\n 'All necessary files are now available in your working directory.',\\n '',\\n '## Complete Agent Template Type Definitions',\\n '',\\n 'Here are the complete TypeScript type definitions for creating custom Codebuff agents:',\\n '```typescript',\\n agentTemplateContent,\\n '```',\\n '',\\n '## Available Tools Type Definitions',\\n '',\\n 'Here are the complete TypeScript type definitions for all available tools:',\\n '',\\n '```typescript',\\n toolDefinitionsContent,\\n '```',\\n '',\\n '## Agent Template Patterns:',\\n '',\\n '1. **Base Agent Pattern**: Full-featured agents with comprehensive tool access',\\n '2. **Specialized Agent Pattern**: Focused agents with limited tool sets',\\n '3. **Thinking Agent Pattern**: Agents that spawn thinker sub-agents',\\n '4. **Research Agent Pattern**: Agents that start with web search',\\n '',\\n '## Best Practices:',\\n '',\\n '1. **Use as few fields as possible**: Leave out fields that are not needed to reduce complexity',\\n '2. **Minimal Tools**: Only include tools the agent actually needs',\\n '3. **Clear and Concise Prompts**: Write clear, specific prompts that have no unnecessary words',\\n '4. **Consistent Naming**: Follow naming conventions (kebab-case for IDs)',\\n '5. **Appropriate Model**: Choose the right model for the task complexity. Default is claude-4-sonnet-20250522 for medium-high complexity tasks, and openai/gpt-5 for all other tasks.',\\n '',\\n '## Your Task:',\\n 'When asked to create an agent template, you should:',\\n \\\"1. Understand the requested agent's purpose and capabilities\\\",\\n \\\"2. Choose appropriate tools for the agent's function\\\",\\n '3. Write a comprehensive system prompt',\\n `4. Create the complete agent template file in ${AGENT_TEMPLATES_DIR}`,\\n '5. Ensure the template follows all conventions and best practices',\\n '6. Use the AgentDefinition interface for the configuration',\\n '7. Start the file with: import type { AgentDefinition } from \\\"./types/agent-definition.d.ts\\\"',\\n '',\\n 'Create agent templates that are focused, efficient, and well-documented. Always import the AgentDefinition type and export a default configuration object.',\\n ].join('\\\\n'),\\n instructionsPrompt: `You are helping to create or edit an agent template. The user will describe what kind of agent they want to create or how they want to modify an existing agent.\\n\\n## Environment Ready\\n\\nYour environment has been automatically set up with:\\n- Type definitions in \\\\`.agents/types/\\\\`\\n- Diff-reviewer examples in \\\\`.agents/examples/\\\\`\\n- A starter custom agent template at \\\\`.agents/your-custom-agent.ts\\\\`\\n\\nYou can now proceed directly to agent creation or editing.\\n\\n## Example Agents Available\\n\\nThree diff-reviewer examples are available in \\\\`.agents/examples/\\\\`. These can serve as examples of well-made agents at different stages of complexity.\\n\\n**IMPORTANT**: Examine these examples to find connections and patterns that relate to the user's request. Look for:\\n- Similar tool combinations\\n- Comparable complexity levels\\n- Related functionality patterns\\n- Appropriate model choices\\n- Relevant prompt structures\\n\\nUse these examples as inspiration and starting points, adapting their patterns to fit the user's specific needs.\\n\\n## Starter Template Available\\n\\nA starter custom agent file is available at \\\\`.agents/your-custom-agent.ts\\\\`. You can either modify this file directly or use it as a reference for creating a new agent.\\n\\n## For New Agents\\n\\nAnalyze their request and create a complete agent template that:\\n- Has a clear purpose and appropriate capabilities\\n- Leaves out fields that are not needed\\n- Uses only the tools it needs\\n- Follows naming conventions\\n- Is properly structured\\n- Draws inspiration from relevant example agents\\n\\n## For Creating New Agents\\n\\nThe agent builder is focused on creating new agent templates based on user specifications.\\n\\nIMPORTANT: Always end your response with the end_turn tool when you have completed the agent creation or editing task.`,\\n stepPrompt: '',\\n\\n handleSteps: function* () {\\n // Step 1: Create directory structure\\n yield {\\n toolName: 'run_terminal_command',\\n args: {\\n command: `mkdir -p ${TYPES_DIR} && mkdir -p ${EXAMPLES_DIR}`,\\n process_type: 'SYNC',\\n timeout_seconds: 10,\\n },\\n }\\n\\n // Step 2: Write the AGENT_DEFINITION_FILE with the template content\\n yield {\\n toolName: 'write_file',\\n args: {\\n path: TEMPLATE_TYPES_PATH,\\n instructions: 'Create agent template type definitions file',\\n content: agentTemplateContent,\\n },\\n }\\n\\n // Step 3: Write the tool definitions file (copy from existing tools.d.ts)\\n yield {\\n toolName: 'write_file',\\n args: {\\n path: TOOL_DEFINITIONS_PATH,\\n instructions: 'Create tools type file',\\n content: toolDefinitionsContent,\\n },\\n }\\n\\n // Step 4: Add message about reading example files and then read them\\n yield {\\n toolName: 'add_message',\\n args: {\\n role: 'assistant',\\n content:\\n \\\"I'll review the starter template and diff-reviewer examples, then help you create your agent.\\\",\\n },\\n }\\n\\n // Step 5: Copy example agent files to .agents/examples/\\n for (const [filename, content] of Object.entries(exampleAgentContents)) {\\n if (content) {\\n yield {\\n toolName: 'write_file',\\n args: {\\n path: `${EXAMPLES_DIR}/${filename}`,\\n instructions: `Copy example agent file ${filename}`,\\n content: content,\\n },\\n }\\n }\\n }\\n\\n // Step 6: Copy starter template directly to .agents/\\n if (starterTemplateContent) {\\n yield {\\n toolName: 'write_file',\\n args: {\\n path: `${AGENT_TEMPLATES_DIR}/${STARTER_TEMPLATE_DEST_FILE}`,\\n instructions: `Copy starter custom agent template ${STARTER_TEMPLATE_DEST_FILE}`,\\n content: starterTemplateContent,\\n },\\n }\\n }\\n\\n // Step 7: Complete agent creation process\\n yield 'STEP_ALL'\\n },\\n }\\n}\\n\"\n}\n\n\n{\n \"cb_tool_name\": \"str_replace\",\n \"path\": \"common/src/constants/agents.ts\",\n \"replacements\": [\n {\n \"old\": \" dry_run: {\\n displayName: 'Sketch the Dry Runner',\\n purpose: 'Agent that takes a plan and try to implement it in a dry run.',\\n hidden: true,\\n } as const,\\n\",\n \"new\": \"\"\n },\n {\n \"old\": \" agent_builder: {\\n displayName: 'Bob the Agent Builder',\\n purpose: 'Creates new agent templates for the codebuff mult-agent system',\\n hidden: false,\\n } as const,\\n\",\n \"new\": \" agent_builder: {\\n displayName: 'Bob the Agent Builder',\\n purpose: 'Creates new agent templates for the codebuff multi-agent system',\\n hidden: false,\\n } as const,\\n\"\n }\n ]\n}\n\n\n{\n \"cb_tool_name\": \"write_file\",\n \"path\": \".agents/examples/diff-reviewer-1.ts\",\n \"instructions\": \"Refresh diff-reviewer-1 example to use current Anthropic model.\",\n \"content\": \"import type { AgentDefinition } from '../types/agent-definition'\\n\\nconst definition: AgentDefinition = {\\n id: 'diff-reviewer-1',\\n\\n displayName: 'Diff Reviewer (Level 1)',\\n model: 'anthropic/claude-4-sonnet-20250522',\\n toolNames: ['read_files', 'run_terminal_command'],\\n\\n spawnPurposePrompt:\\n 'Spawn when you need to review code changes in the git diff',\\n\\n instructionsPrompt: `Execute the following steps:\\n1. Run git diff\\n2. Read the files that have changed\\n3. Review the changes and suggest improvements`,\\n}\\n\\nexport default definition\\n\"\n}\n\n\n{\n \"cb_tool_name\": \"write_file\",\n \"path\": \".agents/examples/diff-reviewer-2.ts\",\n \"instructions\": \"Refresh diff-reviewer-2 example to use current Anthropic model.\",\n \"content\": \"import type {\\n AgentDefinition,\\n AgentStepContext,\\n} from '../types/agent-definition'\\n\\nconst definition: AgentDefinition = {\\n id: 'diff-reviewer-2',\\n displayName: 'Diff Reviewer (Level 2)',\\n model: 'anthropic/claude-4-sonnet-20250522',\\n\\n inputSchema: {\\n prompt: {\\n type: 'string',\\n description:\\n 'Please provide a short description of the changes you want to review',\\n },\\n },\\n toolNames: ['read_files', 'run_terminal_command'],\\n\\n spawnPurposePrompt:\\n 'Spawn when you need to review code changes in the git diff',\\n\\n systemPrompt:\\n 'You are an expert software developer. Your job is to review code changes and provide helpful feedback.',\\n\\n instructionsPrompt: `Execute the following steps:\\n1. Run git diff\\n2. Read the files that have changed\\n3. Review the changes and suggest improvements\\n\\nUse the following guidelines while reviewing the changes:\\n- Find ways to simplify the code\\n- Reuse existing code as much as possible instead of writing new code\\n- Preserve as much behavior as possible in the existing code\\n- Prefer changing as few lines of code as possible\\n- Look for opportunities to improve the code's readability\\n- Look for logical errors in the code\\n- Look for missed cases in the code\\n- Look for any other bugs`,\\n\\n handleSteps: function* ({ prompt }: AgentStepContext) {\\n // Step 1: Run git diff immediately. Saves the agent a step, lowering cost and latency!\\n yield {\\n toolName: 'run_terminal_command',\\n args: {\\n command: 'git diff',\\n },\\n }\\n\\n // Step 2: Let AI run the rest of the steps!\\n yield 'STEP_ALL'\\n },\\n}\\n\\nexport default definition\\n\"\n}\n\n\n{\n \"cb_tool_name\": \"write_file\",\n \"path\": \".agents/examples/diff-reviewer-3.ts\",\n \"instructions\": \"Refresh diff-reviewer-3 example to use current Anthropic model, correct file-explorer spawn target, and streamline final step behavior.\",\n \"content\": \"import type {\\n AgentDefinition,\\n AgentStepContext,\\n} from '../types/agent-definition'\\n\\nconst definition: AgentDefinition = {\\n id: 'diff-reviewer-3',\\n\\n displayName: 'Diff Reviewer (Level 3)',\\n model: 'anthropic/claude-4-sonnet-20250522',\\n inputSchema: {\\n prompt: {\\n type: 'string',\\n description:\\n 'Please provide a short description of the changes you want to review',\\n },\\n },\\n outputMode: 'last_message',\\n\\n toolNames: ['read_files', 'run_terminal_command', 'spawn_agents'],\\n spawnableAgents: ['file-explorer'],\\n\\n spawnPurposePrompt:\\n 'Spawn when you need to review code changes in the git diff',\\n\\n systemPrompt:\\n 'You are an expert software developer. Your job is to review code changes and provide helpful feedback.',\\n\\n instructionsPrompt: `Review the changes and suggest improvements.\\n\\nUse the following guidelines while reviewing the changes:\\n- Find ways to simplify the code\\n- Reuse existing code as much as possible instead of writing new code\\n- Preserve as much behavior as possible in the existing code\\n- Prefer changing as few lines of code as possible\\n- Look for opportunities to improve the code's readability\\n- Look for logical errors in the code\\n- Look for missed cases in the code\\n- Look for any other bugs`,\\n\\n handleSteps: function* ({ prompt }: AgentStepContext) {\\n // Step 1: Get list of changed files from git diff --name-only\\n const { toolResult: gitDiffFilesResult } = yield {\\n toolName: 'run_terminal_command',\\n args: {\\n command: 'git diff --name-only',\\n },\\n }\\n\\n const changedFiles = (gitDiffFilesResult || '')\\n .split('\\\\n')\\n .map((line) => line.trim())\\n .filter((line) => line && !line.startsWith('??') && !line.includes('OSC'))\\n\\n // Step 2: Read changed files\\n if (changedFiles.length > 0) {\\n yield {\\n toolName: 'read_files',\\n args: {\\n paths: changedFiles,\\n },\\n }\\n }\\n\\n // Step 3: Run full git diff to see the actual changes\\n yield {\\n toolName: 'run_terminal_command',\\n args: {\\n command: 'git diff',\\n },\\n }\\n\\n // Step 4: Spawn file explorer for broader context if needed\\n yield {\\n toolName: 'spawn_agents',\\n args: {\\n agents: [\\n {\\n agent_type: 'file-explorer',\\n prompt: `Find any additional codebase context needed to review these changes. Review focus: ${prompt || ''}`,\\n params: {\\n prompts: [\\n 'Any modules/classes/functions referenced by the diff',\\n 'Relevant tests or test helpers for the changed code',\\n 'Related config or shared utilities that might be impacted',\\n ],\\n },\\n },\\n ],\\n },\\n }\\n\\n // Step 5: Let the AI produce the final review in a single final step\\n yield 'STEP_ALL'\\n },\\n}\\n\\nexport default definition\\n\"\n}\n\n\n{\n \"cb_tool_name\": \"write_file\",\n \"path\": \"common/src/util/examples/diff-reviewer-1.ts\",\n \"instructions\": \"Refresh common diff-reviewer-1 example to use current Anthropic model.\",\n \"content\": \"import type { AgentDefinition } from '../types/agent-definition'\\n\\nconst definition: AgentDefinition = {\\n id: 'diff-reviewer-1',\\n\\n displayName: 'Diff Reviewer (Level 1)',\\n model: 'anthropic/claude-4-sonnet-20250522',\\n toolNames: ['read_files', 'run_terminal_command'],\\n\\n spawnPurposePrompt:\\n 'Spawn when you need to review code changes in the git diff',\\n\\n instructionsPrompt: `Execute the following steps:\\n1. Run git diff\\n2. Read the files that have changed\\n3. Review the changes and suggest improvements`,\\n}\\n\\nexport default definition\\n\"\n}\n\n\n{\n \"cb_tool_name\": \"write_file\",\n \"path\": \"common/src/util/examples/diff-reviewer-2.ts\",\n \"instructions\": \"Refresh common diff-reviewer-2 example to use current Anthropic model.\",\n \"content\": \"import type {\\n AgentDefinition,\\n AgentStepContext,\\n} from '../types/agent-definition'\\n\\nconst definition: AgentDefinition = {\\n id: 'diff-reviewer-2',\\n displayName: 'Diff Reviewer (Level 2)',\\n model: 'anthropic/claude-4-sonnet-20250522',\\n\\n inputSchema: {\\n prompt: {\\n type: 'string',\\n description:\\n 'Please provide a short description of the changes you want to review',\\n },\\n },\\n toolNames: ['read_files', 'run_terminal_command'],\\n\\n spawnPurposePrompt:\\n 'Spawn when you need to review code changes in the git diff',\\n\\n systemPrompt:\\n 'You are an expert software developer. Your job is to review code changes and provide helpful feedback.',\\n\\n instructionsPrompt: `Execute the following steps:\\n1. Run git diff\\n2. Read the files that have changed\\n3. Review the changes and suggest improvements\\n\\nUse the following guidelines while reviewing the changes:\\n- Find ways to simplify the code\\n- Reuse existing code as much as possible instead of writing new code\\n- Preserve as much behavior as possible in the existing code\\n- Prefer changing as few lines of code as possible\\n- Look for opportunities to improve the code's readability\\n- Look for logical errors in the code\\n- Look for missed cases in the code\\n- Look for any other bugs`,\\n\\n handleSteps: function* ({ prompt }: AgentStepContext) {\\n // Step 1: Run git diff immediately. Saves the agent a step, lowering cost and latency!\\n yield {\\n toolName: 'run_terminal_command',\\n args: {\\n command: 'git diff',\\n },\\n }\\n\\n // Step 2: Let AI run the rest of the steps!\\n yield 'STEP_ALL'\\n },\\n}\\n\\nexport default definition\\n\"\n}\n\n\n{\n \"cb_tool_name\": \"write_file\",\n \"path\": \"common/src/util/examples/diff-reviewer-3.ts\",\n \"instructions\": \"Refresh common diff-reviewer-3 example to use current Anthropic model, correct file-explorer spawn target, and streamline final step behavior.\",\n \"content\": \"import type {\\n AgentDefinition,\\n AgentStepContext,\\n} from '../types/agent-definition'\\n\\nconst definition: AgentDefinition = {\\n id: 'diff-reviewer-3',\\n\\n displayName: 'Diff Reviewer (Level 3)',\\n model: 'anthropic/claude-4-sonnet-20250522',\\n inputSchema: {\\n prompt: {\\n type: 'string',\\n description:\\n 'Please provide a short description of the changes you want to review',\\n },\\n },\\n outputMode: 'last_message',\\n\\n toolNames: ['read_files', 'run_terminal_command', 'spawn_agents'],\\n spawnableAgents: ['file-explorer'],\\n\\n spawnPurposePrompt:\\n 'Spawn when you need to review code changes in the git diff',\\n\\n systemPrompt:\\n 'You are an expert software developer. Your job is to review code changes and provide helpful feedback.',\\n\\n instructionsPrompt: `Review the changes and suggest improvements.\\n\\nUse the following guidelines while reviewing the changes:\\n- Find ways to simplify the code\\n- Reuse existing code as much as possible instead of writing new code\\n- Preserve as much behavior as possible in the existing code\\n- Prefer changing as few lines of code as possible\\n- Look for opportunities to improve the code's readability\\n- Look for logical errors in the code\\n- Look for missed cases in the code\\n- Look for any other bugs`,\\n\\n handleSteps: function* ({ prompt }: AgentStepContext) {\\n // Step 1: Get list of changed files from git diff --name-only\\n const { toolResult: gitDiffFilesResult } = yield {\\n toolName: 'run_terminal_command',\\n args: {\\n command: 'git diff --name-only',\\n },\\n }\\n\\n const changedFiles = (gitDiffFilesResult || '')\\n .split('\\\\n')\\n .map((line) => line.trim())\\n .filter((line) => line && !line.startsWith('??') && !line.includes('OSC'))\\n\\n // Step 2: Read changed files\\n if (changedFiles.length > 0) {\\n yield {\\n toolName: 'read_files',\\n args: {\\n paths: changedFiles,\\n },\\n }\\n }\\n\\n // Step 3: Run full git diff to see the actual changes\\n yield {\\n toolName: 'run_terminal_command',\\n args: {\\n command: 'git diff',\\n },\\n }\\n\\n // Step 4: Spawn file explorer for broader context if needed\\n yield {\\n toolName: 'spawn_agents',\\n args: {\\n agents: [\\n {\\n agent_type: 'file-explorer',\\n prompt: `Find any additional codebase context needed to review these changes. Review focus: ${prompt || ''}`,\\n params: {\\n prompts: [\\n 'Any modules/classes/functions referenced by the diff',\\n 'Relevant tests or test helpers for the changed code',\\n 'Related config or shared utilities that might be impacted',\\n ],\\n },\\n },\\n ],\\n },\\n }\\n\\n // Step 5: Let the AI produce the final review in a single final step\\n yield 'STEP_ALL'\\n },\\n}\\n\\nexport default definition\\n\"\n}\n\n\n{\n \"cb_tool_name\": \"write_file\",\n \"path\": \".agents/your-custom-agent.ts\",\n \"instructions\": \"Add a new starter custom agent (Git Committer scaffold) in the top-level .agents directory, ready to run and publish.\",\n \"content\": \"import { publisher, version } from './constants'\\n\\nimport type {\\n AgentDefinition,\\n AgentStepContext,\\n} from './types/agent-definition'\\n\\nconst definition: AgentDefinition = {\\n id: 'your-custom-agent',\\n version,\\n publisher,\\n\\n displayName: 'Your Custom Agent (Git Committer)',\\n model: 'anthropic/claude-4-sonnet-20250522',\\n toolNames: ['read_files', 'run_terminal_command', 'add_message', 'end_turn'],\\n\\n inputSchema: {\\n prompt: {\\n type: 'string',\\n description: 'What changes to commit',\\n },\\n },\\n\\n includeMessageHistory: false,\\n outputMode: 'last_message',\\n\\n spawnPurposePrompt:\\n 'Spawn when you need to commit code changes to git with an appropriate commit message',\\n\\n systemPrompt:\\n 'You are an expert software developer. Your job is to create a git commit with a really good commit message.',\\n\\n instructionsPrompt:\\n 'Follow the steps to create a good commit: analyze changes with git diff and git log, read relevant files for context, stage appropriate files, and create a commit with proper formatting including the Codebuff footer.',\\n\\n handleSteps: function* ({ prompt }: AgentStepContext) {\\n // Step 1: Analyze the changes\\n yield {\\n toolName: 'run_terminal_command',\\n args: {\\n command: 'git diff',\\n process_type: 'SYNC',\\n timeout_seconds: 30,\\n },\\n }\\n\\n yield {\\n toolName: 'run_terminal_command',\\n args: {\\n command: 'git log --oneline -10',\\n process_type: 'SYNC',\\n timeout_seconds: 30,\\n },\\n }\\n\\n // Step 2: Let the AI decide what to read + what to stage based on the user's intent\\n yield {\\n toolName: 'add_message',\\n args: {\\n role: 'assistant',\\n content: `Goal: ${prompt}\\\\n\\\\nI'll read any relevant files and stage the right changes next.`,\\n },\\n }\\n\\n yield 'STEP'\\n\\n // Step 3: Let the AI create the commit with proper formatting\\n yield {\\n toolName: 'add_message',\\n args: {\\n role: 'assistant',\\n content:\\n \\\"Now I'll create the commit with a high-quality message and the proper Codebuff footer format.\\\",\\n },\\n }\\n\\n yield 'STEP_ALL'\\n },\\n}\\n\\nexport default definition\\n\"\n}\n\n\n{\n \"cb_tool_name\": \"write_file\",\n \"path\": \"common/src/util/examples/your-custom-agent.ts.txt\",\n \"instructions\": \"Add starter custom agent template content for the agent builder to copy into .agents/your-custom-agent.ts.\",\n \"content\": \"import { publisher, version } from './constants'\\n\\nimport type {\\n AgentDefinition,\\n AgentStepContext,\\n} from './types/agent-definition'\\n\\nconst definition: AgentDefinition = {\\n id: 'your-custom-agent',\\n version,\\n publisher,\\n\\n displayName: 'Your Custom Agent (Git Committer)',\\n model: 'anthropic/claude-4-sonnet-20250522',\\n toolNames: ['read_files', 'run_terminal_command', 'add_message', 'end_turn'],\\n\\n inputSchema: {\\n prompt: {\\n type: 'string',\\n description: 'What changes to commit',\\n },\\n },\\n\\n includeMessageHistory: false,\\n outputMode: 'last_message',\\n\\n spawnPurposePrompt:\\n 'Spawn when you need to commit code changes to git with an appropriate commit message',\\n\\n systemPrompt:\\n 'You are an expert software developer. Your job is to create a git commit with a really good commit message.',\\n\\n instructionsPrompt:\\n 'Follow the steps to create a good commit: analyze changes with git diff and git log, read relevant files for context, stage appropriate files, and create a commit with proper formatting including the Codebuff footer.',\\n\\n handleSteps: function* ({ prompt }: AgentStepContext) {\\n // Step 1: Analyze the changes\\n yield {\\n toolName: 'run_terminal_command',\\n args: {\\n command: 'git diff',\\n process_type: 'SYNC',\\n timeout_seconds: 30,\\n },\\n }\\n\\n yield {\\n toolName: 'run_terminal_command',\\n args: {\\n command: 'git log --oneline -10',\\n process_type: 'SYNC',\\n timeout_seconds: 30,\\n },\\n }\\n\\n // Step 2: Let the AI decide what to read + what to stage based on the user's intent\\n yield {\\n toolName: 'add_message',\\n args: {\\n role: 'assistant',\\n content: `Goal: ${prompt}\\\\n\\\\nI'll read any relevant files and stage the right changes next.`,\\n },\\n }\\n\\n yield 'STEP'\\n\\n // Step 3: Let the AI create the commit with proper formatting\\n yield {\\n toolName: 'add_message',\\n args: {\\n role: 'assistant',\\n content:\\n \\\"Now I'll create the commit with a high-quality message and the proper Codebuff footer format.\\\",\\n },\\n }\\n\\n yield 'STEP_ALL'\\n },\\n}\\n\\nexport default definition\\n\"\n}\n", - "toolResults": [ - { - "file": "backend/src/templates/agents/agent-builder.ts", - "message": "Updated file", - "unifiedDiff": "@@ -1,12 +1,8 @@\n import * as fs from 'fs'\n import * as path from 'path'\n \n-import {\n- AGENT_TEMPLATES_DIR,\n- openrouterModels,\n- AGENT_DEFINITION_FILE,\n-} from '@codebuff/common/constants'\n+import { AGENT_TEMPLATES_DIR, AGENT_DEFINITION_FILE } from '@codebuff/common/constants'\n import { AgentTemplateTypes } from '@codebuff/common/types/session-state'\n import z from 'zod/v4'\n \n import type { AgentTemplate } from '../types'\n@@ -19,9 +15,8 @@\n // Import to validate path exists at compile time\n import(TEMPLATE_RELATIVE_PATH)\n \n const TEMPLATE_PATH = path.join(__dirname, TEMPLATE_RELATIVE_PATH)\n-const DEFAULT_MODEL = openrouterModels.openrouter_claude_sonnet_4\n const TYPES_DIR = path.join(AGENT_TEMPLATES_DIR, 'types')\n const EXAMPLES_DIR = path.join(AGENT_TEMPLATES_DIR, 'examples')\n const TEMPLATE_TYPES_PATH = path.join(TYPES_DIR, AGENT_DEFINITION_FILE)\n const TOOL_DEFINITIONS_FILE = 'tools.d.ts'\n@@ -32,9 +27,9 @@\n const STARTER_TEMPLATE_DEST_FILE = 'your-custom-agent.ts'\n \n export const agentBuilder = (\n model: Model,\n- allAvailableAgents?: string[],\n+ _allAvailableAgents?: string[],\n ): Omit => {\n // Read the AGENT_CONFIG_FILE content dynamically\n // The import above ensures this path exists at compile time\n let agentTemplateContent = ''\n@@ -57,9 +52,9 @@\n console.warn(`Could not read tools.d.ts from common:`, error)\n toolDefinitionsContent = '// Tool definitions not available'\n }\n \n- // Read example agent files from common package\n+ // Read example agent files + starter template from common package\n const exampleAgentContents: Record = {}\n let starterTemplateContent = ''\n \n try {\n@@ -229,9 +224,9 @@\n \n IMPORTANT: Always end your response with the end_turn tool when you have completed the agent creation or editing task.`,\n stepPrompt: '',\n \n- handleSteps: function* ({ agentState, prompt, params }) {\n+ handleSteps: function* () {\n // Step 1: Create directory structure\n yield {\n toolName: 'run_terminal_command',\n args: {\n" - }, - { - "file": "common/src/constants/agents.ts", - "message": "Updated file", - "unifiedDiff": "@@ -64,21 +64,16 @@\n displayName: 'Peter Plan the Planner',\n purpose: 'Agent that formulates a comprehensive plan to a prompt.',\n hidden: true,\n } as const,\n- dry_run: {\n- displayName: 'Sketch the Dry Runner',\n- purpose: 'Agent that takes a plan and try to implement it in a dry run.',\n- hidden: true,\n- } as const,\n reviewer: {\n displayName: 'Nit Pick Nick the Reviewer',\n purpose:\n 'Reviews file changes and responds with critical feedback. Use this after making any significant change to the codebase.',\n } as const,\n agent_builder: {\n displayName: 'Bob the Agent Builder',\n- purpose: 'Creates new agent templates for the codebuff mult-agent system',\n+ purpose: 'Creates new agent templates for the codebuff multi-agent system',\n hidden: false,\n } as const,\n } as const satisfies Partial<\n Record<\n" - }, - { - "file": ".agents/examples/diff-reviewer-1.ts", - "message": "Updated file", - "unifiedDiff": "@@ -3,9 +3,9 @@\n const definition: AgentDefinition = {\n id: 'diff-reviewer-1',\n \n displayName: 'Diff Reviewer (Level 1)',\n- model: 'openai/gpt-5',\n+ model: 'anthropic/claude-4-sonnet-20250522',\n toolNames: ['read_files', 'run_terminal_command'],\n \n spawnPurposePrompt:\n 'Spawn when you need to review code changes in the git diff',\n" - }, - { - "file": ".agents/examples/diff-reviewer-2.ts", - "message": "Updated file", - "unifiedDiff": "@@ -5,9 +5,9 @@\n \n const definition: AgentDefinition = {\n id: 'diff-reviewer-2',\n displayName: 'Diff Reviewer (Level 2)',\n- model: 'openai/gpt-5',\n+ model: 'anthropic/claude-4-sonnet-20250522',\n \n inputSchema: {\n prompt: {\n type: 'string',\n@@ -37,9 +37,9 @@\n - Look for logical errors in the code\n - Look for missed cases in the code\n - Look for any other bugs`,\n \n- handleSteps: function* ({ agentState, prompt, params }: AgentStepContext) {\n+ handleSteps: function* ({ prompt }: AgentStepContext) {\n // Step 1: Run git diff immediately. Saves the agent a step, lowering cost and latency!\n yield {\n toolName: 'run_terminal_command',\n args: {\n" - }, - { - "file": ".agents/examples/diff-reviewer-3.ts", - "message": "Updated file", - "unifiedDiff": "@@ -6,9 +6,9 @@\n const definition: AgentDefinition = {\n id: 'diff-reviewer-3',\n \n displayName: 'Diff Reviewer (Level 3)',\n- model: 'openai/gpt-5',\n+ model: 'anthropic/claude-4-sonnet-20250522',\n inputSchema: {\n prompt: {\n type: 'string',\n description:\n@@ -17,9 +17,9 @@\n },\n outputMode: 'last_message',\n \n toolNames: ['read_files', 'run_terminal_command', 'spawn_agents'],\n- spawnableAgents: ['james/file-explorer@0.1.3'],\n+ spawnableAgents: ['file-explorer'],\n \n spawnPurposePrompt:\n 'Spawn when you need to review code changes in the git diff',\n \n@@ -37,24 +37,23 @@\n - Look for logical errors in the code\n - Look for missed cases in the code\n - Look for any other bugs`,\n \n- handleSteps: function* ({ agentState, prompt, params }: AgentStepContext) {\n+ handleSteps: function* ({ prompt }: AgentStepContext) {\n // Step 1: Get list of changed files from git diff --name-only\n const { toolResult: gitDiffFilesResult } = yield {\n toolName: 'run_terminal_command',\n args: {\n command: 'git diff --name-only',\n },\n }\n \n- // Then, extract file paths from the result\n const changedFiles = (gitDiffFilesResult || '')\n .split('\\n')\n .map((line) => line.trim())\n .filter((line) => line && !line.startsWith('??') && !line.includes('OSC'))\n \n- // Step 2: Read the files\n+ // Step 2: Read changed files\n if (changedFiles.length > 0) {\n yield {\n toolName: 'read_files',\n args: {\n@@ -70,31 +69,30 @@\n command: 'git diff',\n },\n }\n \n- // Step 4: Put words in the AI's mouth to get it to spawn the file explorer.\n+ // Step 4: Spawn file explorer for broader context if needed\n yield {\n- toolName: 'add_message',\n+ toolName: 'spawn_agents',\n args: {\n- role: 'assistant',\n- content:\n- 'Now I will spawn a file explorer to find any missing codebase context.',\n+ agents: [\n+ {\n+ agent_type: 'file-explorer',\n+ prompt: `Find any additional codebase context needed to review these changes. Review focus: ${prompt || ''}`,\n+ params: {\n+ prompts: [\n+ 'Any modules/classes/functions referenced by the diff',\n+ 'Relevant tests or test helpers for the changed code',\n+ 'Related config or shared utilities that might be impacted',\n+ ],\n+ },\n+ },\n+ ],\n },\n }\n \n- yield 'STEP'\n-\n- // Step 5: Put words in the AI's mouth to review the changes.\n- yield {\n- toolName: 'add_message',\n- args: {\n- role: 'assistant',\n- content: 'Here is my comprehensive review of the changes.',\n- },\n- }\n-\n- // Step 6: Let AI review the changes in a final step. (The last message is also the agent's output.)\n- yield 'STEP'\n+ // Step 5: Let the AI produce the final review in a single final step\n+ yield 'STEP_ALL'\n },\n }\n \n export default definition\n" - }, - { - "file": "common/src/util/examples/diff-reviewer-1.ts", - "message": "Updated file", - "unifiedDiff": "@@ -3,9 +3,9 @@\n const definition: AgentDefinition = {\n id: 'diff-reviewer-1',\n \n displayName: 'Diff Reviewer (Level 1)',\n- model: 'openai/gpt-5',\n+ model: 'anthropic/claude-4-sonnet-20250522',\n toolNames: ['read_files', 'run_terminal_command'],\n \n spawnPurposePrompt:\n 'Spawn when you need to review code changes in the git diff',\n" - }, - { - "file": "common/src/util/examples/diff-reviewer-2.ts", - "message": "Updated file", - "unifiedDiff": "@@ -5,9 +5,9 @@\n \n const definition: AgentDefinition = {\n id: 'diff-reviewer-2',\n displayName: 'Diff Reviewer (Level 2)',\n- model: 'openai/gpt-5',\n+ model: 'anthropic/claude-4-sonnet-20250522',\n \n inputSchema: {\n prompt: {\n type: 'string',\n@@ -37,9 +37,9 @@\n - Look for logical errors in the code\n - Look for missed cases in the code\n - Look for any other bugs`,\n \n- handleSteps: function* ({ agentState, prompt, params }: AgentStepContext) {\n+ handleSteps: function* ({ prompt }: AgentStepContext) {\n // Step 1: Run git diff immediately. Saves the agent a step, lowering cost and latency!\n yield {\n toolName: 'run_terminal_command',\n args: {\n" - }, - { - "file": "common/src/util/examples/diff-reviewer-3.ts", - "message": "Updated file", - "unifiedDiff": "@@ -6,9 +6,9 @@\n const definition: AgentDefinition = {\n id: 'diff-reviewer-3',\n \n displayName: 'Diff Reviewer (Level 3)',\n- model: 'openai/gpt-5',\n+ model: 'anthropic/claude-4-sonnet-20250522',\n inputSchema: {\n prompt: {\n type: 'string',\n description:\n@@ -17,9 +17,9 @@\n },\n outputMode: 'last_message',\n \n toolNames: ['read_files', 'run_terminal_command', 'spawn_agents'],\n- spawnableAgents: ['james/file-explorer@0.1.3'],\n+ spawnableAgents: ['file-explorer'],\n \n spawnPurposePrompt:\n 'Spawn when you need to review code changes in the git diff',\n \n@@ -37,24 +37,23 @@\n - Look for logical errors in the code\n - Look for missed cases in the code\n - Look for any other bugs`,\n \n- handleSteps: function* ({ agentState, prompt, params }: AgentStepContext) {\n+ handleSteps: function* ({ prompt }: AgentStepContext) {\n // Step 1: Get list of changed files from git diff --name-only\n const { toolResult: gitDiffFilesResult } = yield {\n toolName: 'run_terminal_command',\n args: {\n command: 'git diff --name-only',\n },\n }\n \n- // Then, extract file paths from the result\n const changedFiles = (gitDiffFilesResult || '')\n .split('\\n')\n .map((line) => line.trim())\n .filter((line) => line && !line.startsWith('??') && !line.includes('OSC'))\n \n- // Step 2: Read the files\n+ // Step 2: Read changed files\n if (changedFiles.length > 0) {\n yield {\n toolName: 'read_files',\n args: {\n@@ -70,31 +69,30 @@\n command: 'git diff',\n },\n }\n \n- // Step 4: Put words in the AI's mouth to get it to spawn the file explorer.\n+ // Step 4: Spawn file explorer for broader context if needed\n yield {\n- toolName: 'add_message',\n+ toolName: 'spawn_agents',\n args: {\n- role: 'assistant',\n- content:\n- 'Now I will spawn a file explorer to find any missing codebase context.',\n+ agents: [\n+ {\n+ agent_type: 'file-explorer',\n+ prompt: `Find any additional codebase context needed to review these changes. Review focus: ${prompt || ''}`,\n+ params: {\n+ prompts: [\n+ 'Any modules/classes/functions referenced by the diff',\n+ 'Relevant tests or test helpers for the changed code',\n+ 'Related config or shared utilities that might be impacted',\n+ ],\n+ },\n+ },\n+ ],\n },\n }\n \n- yield 'STEP'\n-\n- // Step 5: Put words in the AI's mouth to review the changes.\n- yield {\n- toolName: 'add_message',\n- args: {\n- role: 'assistant',\n- content: 'Here is my comprehensive review of the changes.',\n- },\n- }\n-\n- // Step 6: Let AI review the changes in a final step. (The last message is also the agent's output.)\n- yield 'STEP'\n+ // Step 5: Let the AI produce the final review in a single final step\n+ yield 'STEP_ALL'\n },\n }\n \n export default definition\n" - }, - { - "file": ".agents/your-custom-agent.ts", - "message": "Created new file", - "unifiedDiff": "import { publisher, version } from './constants'\n\nimport type {\n AgentDefinition,\n AgentStepContext,\n} from './types/agent-definition'\n\nconst definition: AgentDefinition = {\n id: 'your-custom-agent',\n version,\n publisher,\n\n displayName: 'Your Custom Agent (Git Committer)',\n model: 'anthropic/claude-4-sonnet-20250522',\n toolNames: ['read_files', 'run_terminal_command', 'add_message', 'end_turn'],\n\n inputSchema: {\n prompt: {\n type: 'string',\n description: 'What changes to commit',\n },\n },\n\n includeMessageHistory: false,\n outputMode: 'last_message',\n\n spawnPurposePrompt:\n 'Spawn when you need to commit code changes to git with an appropriate commit message',\n\n systemPrompt:\n 'You are an expert software developer. Your job is to create a git commit with a really good commit message.',\n\n instructionsPrompt:\n 'Follow the steps to create a good commit: analyze changes with git diff and git log, read relevant files for context, stage appropriate files, and create a commit with proper formatting including the Codebuff footer.',\n\n handleSteps: function* ({ prompt }: AgentStepContext) {\n // Step 1: Analyze the changes\n yield {\n toolName: 'run_terminal_command',\n args: {\n command: 'git diff',\n process_type: 'SYNC',\n timeout_seconds: 30,\n },\n }\n\n yield {\n toolName: 'run_terminal_command',\n args: {\n command: 'git log --oneline -10',\n process_type: 'SYNC',\n timeout_seconds: 30,\n },\n }\n\n // Step 2: Let the AI decide what to read + what to stage based on the user's intent\n yield {\n toolName: 'add_message',\n args: {\n role: 'assistant',\n content: `Goal: ${prompt}\\n\\nI'll read any relevant files and stage the right changes next.`,\n },\n }\n\n yield 'STEP'\n\n // Step 3: Let the AI create the commit with proper formatting\n yield {\n toolName: 'add_message',\n args: {\n role: 'assistant',\n content:\n \"Now I'll create the commit with a high-quality message and the proper Codebuff footer format.\",\n },\n }\n\n yield 'STEP_ALL'\n },\n}\n\nexport default definition\n" - }, - { - "file": "common/src/util/examples/your-custom-agent.ts.txt", - "message": "Created new file", - "unifiedDiff": "import { publisher, version } from './constants'\n\nimport type {\n AgentDefinition,\n AgentStepContext,\n} from './types/agent-definition'\n\nconst definition: AgentDefinition = {\n id: 'your-custom-agent',\n version,\n publisher,\n\n displayName: 'Your Custom Agent (Git Committer)',\n model: 'anthropic/claude-4-sonnet-20250522',\n toolNames: ['read_files', 'run_terminal_command', 'add_message', 'end_turn'],\n\n inputSchema: {\n prompt: {\n type: 'string',\n description: 'What changes to commit',\n },\n },\n\n includeMessageHistory: false,\n outputMode: 'last_message',\n\n spawnPurposePrompt:\n 'Spawn when you need to commit code changes to git with an appropriate commit message',\n\n systemPrompt:\n 'You are an expert software developer. Your job is to create a git commit with a really good commit message.',\n\n instructionsPrompt:\n 'Follow the steps to create a good commit: analyze changes with git diff and git log, read relevant files for context, stage appropriate files, and create a commit with proper formatting including the Codebuff footer.',\n\n handleSteps: function* ({ prompt }: AgentStepContext) {\n // Step 1: Analyze the changes\n yield {\n toolName: 'run_terminal_command',\n args: {\n command: 'git diff',\n process_type: 'SYNC',\n timeout_seconds: 30,\n },\n }\n\n yield {\n toolName: 'run_terminal_command',\n args: {\n command: 'git log --oneline -10',\n process_type: 'SYNC',\n timeout_seconds: 30,\n },\n }\n\n // Step 2: Let the AI decide what to read + what to stage based on the user's intent\n yield {\n toolName: 'add_message',\n args: {\n role: 'assistant',\n content: `Goal: ${prompt}\\n\\nI'll read any relevant files and stage the right changes next.`,\n },\n }\n\n yield 'STEP'\n\n // Step 3: Let the AI create the commit with proper formatting\n yield {\n toolName: 'add_message',\n args: {\n role: 'assistant',\n content:\n \"Now I'll create the commit with a high-quality message and the proper Codebuff footer format.\",\n },\n }\n\n yield 'STEP_ALL'\n },\n}\n\nexport default definition\n" - } - ] - } - } - } - } - ] - } - ] - }, - { - "type": "subagent_start", - "agentId": "D-1-F5QYws4", - "agentType": "commander-lite", - "displayName": "Commander Lite", - "onlyChild": false, - "parentAgentId": "main-agent", - "prompt": "Run root typecheck to validate TypeScript changes.", - "params": { - "command": "bun run typecheck", - "timeout_seconds": 120 - } - }, - { - "type": "subagent_start", - "agentId": "D-1-F0_olPY", - "agentType": "commander-lite", - "displayName": "Commander Lite", - "onlyChild": false, - "parentAgentId": "main-agent", - "prompt": "Run relevant package tests if any affected.", - "params": { - "command": "bun run test", - "timeout_seconds": 120 - } - }, - { - "type": "subagent_start", - "agentId": "D-1-F9QrDRM", - "agentType": "commander-lite", - "displayName": "Commander Lite", - "onlyChild": false, - "parentAgentId": "main-agent", - "prompt": "Check if any formatting issues.", - "params": { - "command": "bun run format --check", - "timeout_seconds": 60 - } - }, - { - "type": "tool_call", - "toolCallId": "7406ef13-feaa-4621-8d92-44c6500769ca", - "toolName": "run_terminal_command", - "input": { - "command": "bun run typecheck", - "timeout_seconds": 120 - }, - "agentId": "D-1-F5QYws4", - "parentAgentId": "main-agent", - "includeToolCall": true - }, - { - "type": "tool_call", - "toolCallId": "0c636b39-7349-4e7a-85b2-477c2680fda3", - "toolName": "run_terminal_command", - "input": { - "command": "bun run format --check", - "timeout_seconds": 60 - }, - "agentId": "D-1-F9QrDRM", - "parentAgentId": "main-agent", - "includeToolCall": true - }, - { - "type": "tool_call", - "toolCallId": "ffeb7cdc-f4a2-4b93-ae3f-46a22f0796f7", - "toolName": "run_terminal_command", - "input": { - "command": "bun run test", - "timeout_seconds": 120 - }, - "agentId": "D-1-F0_olPY", - "parentAgentId": "main-agent", - "includeToolCall": true - }, - { - "type": "tool_result", - "toolCallId": "ffeb7cdc-f4a2-4b93-ae3f-46a22f0796f7", - "toolName": "run_terminal_command", - "output": [ - { - "type": "json", - "value": { - "command": "bun run test", - "stdout": "@codebuff/common test: bun test v1.2.23 (cf136713)\n@codebuff/backend test: bun test v1.2.23 (cf136713)\n@codebuff/common test: \n@codebuff/common test: src/__tests__/handlesteps-parsing.test.ts:\n@codebuff/backend test: \n@codebuff/backend test: src/__tests__/web-search-tool.test.ts:\n@codebuff/common test: Using environment: dev\n@codebuff/common test: (pass) handleSteps Parsing Tests > should validate agent config with handleSteps function [19.41ms]\n@codebuff/common test: (pass) handleSteps Parsing Tests > should convert handleSteps function to string [0.64ms]\n@codebuff/common test: (pass) handleSteps Parsing Tests > should require set_output tool for handleSteps with json output mode [7.64ms]\n@codebuff/common test: (pass) handleSteps Parsing Tests > should validate that handleSteps is a generator function [1.38ms]\n@codebuff/common test: (pass) handleSteps Parsing Tests > should verify loaded template handleSteps matches original function toString [1.38ms]\n@codebuff/common test: \n@codebuff/common test: src/__tests__/dynamic-agent-template-schema.test.ts:\n@codebuff/common test: (pass) DynamicAgentDefinitionSchema > Valid Templates > should validate minimal valid template [0.15ms]\n@codebuff/common test: (pass) DynamicAgentDefinitionSchema > Valid Templates > should validate template with inputSchema [0.10ms]\n@codebuff/common test: (pass) DynamicAgentDefinitionSchema > Valid Templates > should validate template with paramsSchema [1.65ms]\n@codebuff/common test: (pass) DynamicAgentDefinitionSchema > Valid Templates > should validate template with both schemas [0.87ms]\n@codebuff/common test: (pass) DynamicAgentDefinitionSchema > Valid Templates > should validate template with complex nested schemas [0.62ms]\n@codebuff/common test: (pass) DynamicAgentDefinitionSchema > Valid Templates > should apply default values [0.32ms]\n@codebuff/common test: (pass) DynamicAgentDefinitionSchema > Valid Templates > should validate template with parentInstructions [0.06ms]\n@codebuff/common test: (pass) DynamicAgentDefinitionSchema > Invalid Templates > should reject template with missing required fields [0.05ms]\n@codebuff/common test: (pass) DynamicAgentDefinitionSchema > Invalid Templates > should reject template with invalid outputMode [0.04ms]\n@codebuff/common test: (pass) DynamicAgentDefinitionSchema > Invalid Templates > should reject template with invalid inputSchema type [0.06ms]\n@codebuff/common test: (pass) DynamicAgentDefinitionSchema > Invalid Templates > should reject template with invalid paramsSchema type [0.06ms]\n@codebuff/common test: (pass) DynamicAgentDefinitionSchema > Invalid Templates > should reject template with null schemas [0.09ms]\n@codebuff/common test: (pass) DynamicAgentDefinitionSchema > Invalid Templates > should reject template with invalid prompt field structure\n@codebuff/common test: (pass) DynamicAgentDefinitionSchema > Invalid Templates > should reject template with invalid agent ID format\n@codebuff/common test: (pass) DynamicAgentDefinitionSchema > Invalid Templates > should accept template with valid agent ID format [0.28ms]\n@codebuff/common test: (pass) DynamicAgentDefinitionSchema > Invalid Templates > should reject template with outputMode structured_output but missing set_output tool [0.47ms]\n@codebuff/common test: (pass) DynamicAgentDefinitionSchema > Invalid Templates > should accept template with outputMode structured_output and set_output tool [0.10ms]\n@codebuff/common test: (pass) DynamicAgentDefinitionSchema > Invalid Templates > should reject template with set_output tool but non-structured_output outputMode [0.04ms]\n@codebuff/common test: (pass) DynamicAgentDefinitionSchema > Invalid Templates > should reject template with set_output tool and all_messages outputMode [0.02ms]\n@codebuff/common test: (pass) DynamicAgentDefinitionSchema > Invalid Templates > should reject template with non-empty spawnableAgents but missing spawn_agents tool\n@codebuff/common test: (pass) DynamicAgentDefinitionSchema > Invalid Templates > should accept template with non-empty spawnableAgents and spawn_agents tool\n@codebuff/common test: (pass) DynamicAgentDefinitionSchema > Invalid Templates > should accept template with empty spawnableAgents and no spawn_agents tool\n@codebuff/common test: (pass) DynamicAgentDefinitionSchema > Edge Cases > should handle empty schemas\n@codebuff/common test: (pass) DynamicAgentDefinitionSchema > Edge Cases > should handle schemas with additional properties [0.18ms]\n@codebuff/common test: (pass) DynamicAgentDefinitionSchema > Edge Cases > should handle very long schema definitions [7.76ms]\n@codebuff/common test: \n@codebuff/common test: src/__tests__/agent-validation.test.ts:\n@codebuff/common test: (pass) Agent Validation > Dynamic Agent Loading > should load valid dynamic agent template [0.38ms]\n@codebuff/common test: (skip) Agent Validation > Dynamic Agent Loading > should validate spawnable agents\n@codebuff/common test: (pass) Agent Validation > Dynamic Agent Loading > should merge static and dynamic templates\n@codebuff/common test: (pass) Agent Validation > Dynamic Agent Loading > should handle agents with JSON schemas [2.41ms]\n@codebuff/common test: (pass) Agent Validation > Dynamic Agent Loading > should return validation errors for invalid schemas [0.25ms]\n@codebuff/common test: (pass) Agent Validation > Dynamic Agent Loading > should handle missing override field as non-override template [0.09ms]\n@codebuff/common test: (pass) Agent Validation > Dynamic Agent Loading > should validate spawnable agents including dynamic agents from first pass [0.10ms]\n@codebuff/common test: (pass) Agent Validation > Schema Validation > Default Schema Behavior > should have no prompt schema when no inputSchema provided [0.06ms]\n@codebuff/common test: (pass) Agent Validation > Schema Validation > Default Schema Behavior > should not have params schema when no paramsSchema provided [0.05ms]\n@codebuff/common test: (pass) Agent Validation > Schema Validation > Complex Schema Scenarios > should handle both inputSchema prompt and params together [2.00ms]\n@codebuff/common test: (pass) Agent Validation > Schema Validation > Complex Schema Scenarios > should handle schema with nested objects and arrays [1.29ms]\n@codebuff/common test: (pass) Agent Validation > Schema Validation > Error Message Quality > should include file path in error messages [0.10ms]\n@codebuff/common test: (pass) Agent Validation > Schema Validation > Edge Cases > should handle git-committer agent schema correctly [0.62ms]\n@codebuff/common test: (pass) Agent Validation > Schema Validation > Edge Cases > should handle empty inputSchema object [0.06ms]\n@codebuff/common test: (pass) Agent Validation > HandleSteps Parsing > should validate agent config with handleSteps function [0.05ms]\n@codebuff/common test: (pass) Agent Validation > HandleSteps Parsing > should convert handleSteps function to string [0.07ms]\n@codebuff/common test: (pass) Agent Validation > HandleSteps Parsing > should require set_output tool for handleSteps with json output mode [0.05ms]\n@codebuff/common test: (pass) Agent Validation > HandleSteps Parsing > should reject set_output tool without json output mode [0.06ms]\n@codebuff/common test: (pass) Agent Validation > HandleSteps Parsing > should validate that handleSteps is a generator function [0.06ms]\n@codebuff/common test: (pass) Agent Validation > HandleSteps Parsing > should verify loaded template handleSteps matches original function toString [0.04ms]\n@codebuff/common test: \n@codebuff/common test: src/types/__tests__/dynamic-agent-template.test.ts:\n@codebuff/common test: \n@codebuff/common test: src/util/__tests__/messages.test.ts:\n@codebuff/common test: (pass) limitScreenshots > should return messages unchanged when no screenshots present [0.19ms]\n@codebuff/common test: (pass) limitScreenshots > should return messages unchanged when screenshots under limit [0.09ms]\n@codebuff/common test: (pass) limitScreenshots > should keep only most recent screenshots when over limit\n@codebuff/common test: (pass) limitScreenshots > should preserve non-image content when filtering\n@codebuff/common test: \n@codebuff/common test: src/util/__tests__/saxy.test.ts:\n@codebuff/common test: (pass) Saxy XML Parser > Schema Validation with Text Conversion > should convert invalid top-level tags to text nodes [2.22ms]\n@codebuff/common test: (pass) Saxy XML Parser > Schema Validation with Text Conversion > should convert invalid nested tags to text nodes [0.02ms]\n@codebuff/common test: (pass) Saxy XML Parser > Schema Validation with Text Conversion > should handle valid nested tags according to schema [0.18ms]\n@codebuff/common test: (pass) Saxy XML Parser > Schema Validation with Text Conversion > should convert closing tags to text when parent is invalid\n@codebuff/common test: (pass) Saxy XML Parser > Schema Validation with Text Conversion > should handle tags starting with whitespace as text\n@codebuff/common test: (pass) Saxy XML Parser > Edge Cases > should handle self-closing invalid tags\n@codebuff/common test: (pass) Saxy XML Parser > Edge Cases > should handle nested invalid tags [0.01ms]\n@codebuff/common test: (pass) Saxy XML Parser > Edge Cases > should preserve attributes in converted text nodes [0.06ms]\n@codebuff/common test: (pass) Saxy XML Parser > should handle text that looks like invalid XML tags [0.29ms]\n@codebuff/common test: (pass) Saxy XML Parser > should handle text with angle brackets but no valid tag names [0.25ms]\n@codebuff/common test: (pass) Saxy XML Parser > should correctly parse mixed valid and invalid XML-like content [0.23ms]\n@codebuff/common test: (pass) Saxy XML Parser > should handle edge cases with special characters after < [0.15ms]\n@codebuff/common test: (pass) Saxy XML Parser > Text Node Handling > should preserve whitespace in text nodes [0.18ms]\n@codebuff/common test: (pass) Saxy XML Parser > Text Node Handling > should handle HTML entities in text content\n@codebuff/common test: (pass) Saxy XML Parser > Text Node Handling > should handle split XML entities in text content [0.54ms]\n@codebuff/common test: (pass) Saxy XML Parser > Text Node Handling > should preserve whitespace between tags [0.39ms]\n@codebuff/common test: (pass) Saxy XML Parser > Text Node Handling > should handle multiple HTML entities in the same text node [0.13ms]\n@codebuff/common test: (pass) Saxy XML Parser > Text Node Handling > should preserve newlines in text content\n@codebuff/common test: (pass) Saxy XML Parser > Text Node Handling > should handle split XML entities across chunks [0.20ms]\n@codebuff/common test: (pass) Saxy XML Parser > Text Node Handling > should handle multiple split entities in sequence [0.44ms]\n@codebuff/common test: (pass) Saxy XML Parser > Text Node Handling > should handle literal ampersand split across chunks [0.18ms]\n@codebuff/common test: (pass) Saxy XML Parser > Text Node Handling > should not treat standalone ampersand as pending entity [0.08ms]\n@codebuff/common test: (pass) Saxy XML Parser > Text Node Handling > should handle text split across chunks without entities or tags [0.10ms]\n@codebuff/common test: (pass) Saxy XML Parser > Text Node Handling > should output closing tag as text if not matching [0.08ms]\n@codebuff/common test: (pass) Saxy XML Parser > shouldParseEntities = false > should not parse HTML entities in text content when shouldParseEntities is false [0.03ms]\n@codebuff/common test: (pass) Saxy XML Parser > shouldParseEntities = false > should not parse HTML entities split across chunks when shouldParseEntities is false [0.21ms]\n@codebuff/common test: (pass) Saxy XML Parser > shouldParseEntities = false > should handle text nodes correctly in _final when shouldParseEntities is false [0.17ms]\n@codebuff/common test: (pass) Saxy XML Parser > Real World Examples > should handle && ( < [0.24ms]\n@codebuff/common test: (pass) Saxy XML Parser > Real World Examples > should handle entity at end of content [0.22ms]\n@codebuff/common test: \n@codebuff/common test: src/util/__tests__/string.test.ts:\n@codebuff/common test: (pass) pluralize > should handle singular and plural cases correctly [0.26ms]\n@codebuff/common test: (pass) pluralize > should handle words ending in y [0.03ms]\n@codebuff/common test: (pass) pluralize > should handle words ending in f/fe [0.04ms]\n@codebuff/common test: (pass) pluralize > should handle words ending in s, sh, ch, x, z, o [0.02ms]\n@codebuff/common test: (pass) pluralize > should handle regular plurals [0.02ms]\n@codebuff/common test: (pass) replaceNonStandardPlaceholderComments > should replace C-style comments [0.03ms]\n@codebuff/common test: (pass) replaceNonStandardPlaceholderComments > should replace multi-line C-style comments [0.15ms]\n@codebuff/common test: (pass) replaceNonStandardPlaceholderComments > should replace Python-style comments [0.03ms]\n@codebuff/common test: (pass) replaceNonStandardPlaceholderComments > should replace JSX comments [0.02ms]\n@codebuff/common test: \n@codebuff/common test: src/util/__tests__/partial-json-delta.test.ts:\n@codebuff/common test: (pass) parsePartialJsonObjectSingle > complete valid JSON > should parse complete valid JSON [0.18ms]\n@codebuff/common test: (pass) parsePartialJsonObjectSingle > complete valid JSON > should parse empty object [0.05ms]\n@codebuff/common test: (pass) parsePartialJsonObjectSingle > complete valid JSON > should parse nested objects [0.05ms]\n@codebuff/common test: (pass) parsePartialJsonObjectSingle > complete valid JSON > should parse arrays [0.04ms]\n@codebuff/common test: (pass) parsePartialJsonObjectSingle > incomplete JSON - missing closing brace > should parse object missing final closing brace [0.14ms]\n@codebuff/common test: (pass) parsePartialJsonObjectSingle > incomplete JSON - missing closing brace > should parse nested object missing final closing brace [0.10ms]\n@codebuff/common test: (pass) parsePartialJsonObjectSingle > incomplete JSON - missing closing brace > should parse object with incomplete string value [0.04ms]\n@codebuff/common test: (pass) parsePartialJsonObjectSingle > incomplete JSON - trailing comma handling > should handle trailing comma by removing last property [0.02ms]\n@codebuff/common test: (pass) parsePartialJsonObjectSingle > incomplete JSON - trailing comma handling > should handle multiple trailing commas\n@codebuff/common test: (pass) parsePartialJsonObjectSingle > incomplete JSON - trailing comma handling > should handle nested object with trailing comma\n@codebuff/common test: (pass) parsePartialJsonObjectSingle > incomplete JSON - trailing comma handling > should handle array with trailing comma [0.08ms]\n@codebuff/common test: (pass) parsePartialJsonObjectSingle > edge cases > should return empty object for empty string\n@codebuff/common test: (pass) parsePartialJsonObjectSingle > edge cases > should return empty object for invalid JSON\n@codebuff/common test: (pass) parsePartialJsonObjectSingle > edge cases > should return empty object for malformed JSON [0.14ms]\n@codebuff/common test: (pass) parsePartialJsonObjectSingle > edge cases > should handle JSON with only opening brace [0.06ms]\n@codebuff/common test: (pass) parsePartialJsonObjectSingle > edge cases > should handle JSON with whitespace [0.02ms]\n@codebuff/common test: (pass) parsePartialJsonObjectSingle > edge cases > should handle complex nested incomplete JSON [0.06ms]\n@codebuff/common test: (pass) parsePartialJsonObjectSingle > real-world streaming scenarios > should handle partial JSON from streaming response [0.05ms]\n@codebuff/common test: (pass) parsePartialJsonObjectSingle > real-world streaming scenarios > should handle JSON with boolean and null values [0.03ms]\n@codebuff/common test: (pass) parsePartialJsonObjectSingle > real-world streaming scenarios > should handle JSON with numbers [0.03ms]\n@codebuff/common test: (pass) getPartialJsonDelta > input validation > should throw error when content does not start with previous [0.17ms]\n@codebuff/common test: (pass) getPartialJsonDelta > input validation > should work when content starts with previous [0.10ms]\n@codebuff/common test: (pass) getPartialJsonDelta > basic delta detection from streaming JSON > should detect new properties added to empty object [0.04ms]\n@codebuff/common test: (pass) getPartialJsonDelta > basic delta detection from streaming JSON > should detect completion of partial string value [0.04ms]\n@codebuff/common test: (pass) getPartialJsonDelta > basic delta detection from streaming JSON > should return empty delta when no changes detected [0.02ms]\n@codebuff/common test: (pass) getPartialJsonDelta > basic delta detection from streaming JSON > should detect new property being added [0.02ms]\n@codebuff/common test: (pass) getPartialJsonDelta > string delta handling > should return string slice for partial string updates [0.02ms]\n@codebuff/common test: (pass) getPartialJsonDelta > string delta handling > should handle empty string to non-empty string [0.02ms]\n@codebuff/common test: (pass) getPartialJsonDelta > string delta handling > should handle new string property [0.02ms]\n@codebuff/common test: (pass) getPartialJsonDelta > string delta handling > should handle multi-line string streaming [0.02ms]\n@codebuff/common test: (pass) getPartialJsonDelta > non-string value changes > should return full value for non-string changes [0.01ms]\n@codebuff/common test: (pass) getPartialJsonDelta > non-string value changes > should handle boolean values [0.01ms]\n@codebuff/common test: (pass) getPartialJsonDelta > non-string value changes > should handle null values [0.02ms]\n@codebuff/common test: (pass) getPartialJsonDelta > non-string value changes > should handle array values [0.01ms]\n@codebuff/common test: (pass) getPartialJsonDelta > non-string value changes > should handle nested object values [0.01ms]\n@codebuff/common test: (pass) getPartialJsonDelta > realistic streaming scenarios > should handle progressive JSON building [0.03ms]\n@codebuff/common test: (pass) getPartialJsonDelta > realistic streaming scenarios > should handle streaming text completion\n@codebuff/common test: (pass) getPartialJsonDelta > realistic streaming scenarios > should handle incomplete JSON with trailing comma [0.04ms]\n@codebuff/common test: (pass) getPartialJsonDelta > lastParam tracking > should track last parameter key and completion status [0.01ms]\n@codebuff/common test: (pass) getPartialJsonDelta > lastParam tracking > should indicate incomplete last parameter\n@codebuff/common test: (pass) getPartialJsonDelta > lastParam tracking > should handle undefined key for empty object [0.04ms]\n@codebuff/common test: (pass) getPartialJsonDelta > edge cases > should handle empty previous string [0.03ms]\n@codebuff/common test: (pass) getPartialJsonDelta > edge cases > should handle identical content and previous [0.01ms]\n@codebuff/common test: (pass) getPartialJsonDelta > edge cases > should handle malformed JSON gracefully\n@codebuff/common test: (pass) getPartialJsonDelta > edge cases > should handle escaped quotes in strings [0.01ms]\n@codebuff/common test: \n@codebuff/common test: src/json-config/__tests__/stringify-schema.test.ts:\n@codebuff/common test: (pass) stringifySchema > should correctly stringify StartupProcessSchema [0.75ms]\n@codebuff/common test: (pass) stringifySchema > should correctly stringify CodebuffConfigSchema [0.19ms]\n@codebuff/common test: (pass) stringifySchema > should handle a more complex schema [0.31ms]\n@codebuff/common test: (pass) stringifySchema > should handle an empty object schema [0.03ms]\n@codebuff/common test: (pass) stringifySchema > should handle schema with only optional fields [0.05ms]\n@codebuff/common test: (pass) stringifySchema > should handle schema with default values [0.09ms]\n@codebuff/common test: \n@codebuff/common test: src/json-config/__tests__/constants.test.ts:\n@codebuff/common test: (pass) constants > codebuffConfigFile and codebuffConfigFileBackup > should have correct file names\n@codebuff/common test: (pass) constants > StartupProcessSchema > should validate a minimal startup process [0.35ms]\n@codebuff/common test: (pass) constants > StartupProcessSchema > should validate a complete startup process\n@codebuff/common test: (pass) constants > StartupProcessSchema > should reject startup process with empty name [0.10ms]\n@codebuff/common test: (pass) constants > StartupProcessSchema > should reject startup process with empty command [0.07ms]\n@codebuff/common test: (pass) constants > StartupProcessSchema > should apply default enabled value [0.03ms]\n@codebuff/common test: (pass) constants > FileChangeHook > should validate a minimal file change hook [0.05ms]\n@codebuff/common test: (pass) constants > FileChangeHook > should validate a complete file change hook [0.10ms]\n@codebuff/common test: (pass) constants > FileChangeHook > should reject hook with empty name [0.09ms]\n@codebuff/common test: (pass) constants > FileChangeHook > should reject hook with empty command [0.13ms]\n@codebuff/common test: (pass) constants > CodebuffConfigSchema > should validate an empty object as a valid config [0.07ms]\n@codebuff/common test: (pass) constants > CodebuffConfigSchema > should validate a minimal config with description only [0.07ms]\n@codebuff/common test: (pass) constants > CodebuffConfigSchema > should validate a complete config [0.05ms]\n@codebuff/common test: (pass) constants > CodebuffConfigSchema > should accept any type for description field [0.15ms]\n@codebuff/common test: (pass) constants > CodebuffConfigSchema > should apply default maxAgentSteps value [0.07ms]\n@codebuff/common test: (pass) constants > CodebuffConfigSchema > should allow custom maxAgentSteps value [0.03ms]\n@codebuff/common test: (pass) constants > CodebuffConfigSchema > should reject invalid startup process in array [0.08ms]\n@codebuff/common test: (pass) constants > CodebuffConfigSchema > should reject invalid file change hook in array [0.08ms]\n@codebuff/common test: (pass) constants > CodebuffConfigSchema > should reject non-number maxAgentSteps [0.02ms]\n@codebuff/common test: (pass) constants > CodebuffConfigSchema > should reject non-array startupProcesses [0.08ms]\n@codebuff/common test: (pass) constants > CodebuffConfigSchema > should reject non-array fileChangeHooks\n@codebuff/common test: (pass) constants > TypeScript types > should have correct TypeScript types\n@codebuff/common test: \n@codebuff/common test: 1 tests skipped:\n@codebuff/common test: (skip) Agent Validation > Dynamic Agent Loading > should validate spawnable agents\n@codebuff/common test: \n@codebuff/common test: 164 pass\n@codebuff/common test: 1 skip\n@codebuff/common test: 0 fail\n@codebuff/common test: 6 snapshots, 337 expect() calls\n@codebuff/common test: Ran 165 tests across 10 files. [517.00ms]\n@codebuff/common test: Exited with code 0\n@codebuff/backend test: Using environment: dev\n@codebuff/backend test: \n@codebuff/backend test: # Unhandled error between tests\n@codebuff/backend test: -------------------------------\n@codebuff/backend test: 6 | import type { AgentTemplate } from '../../types'\n@codebuff/backend test: 7 | import type { Model } from '@codebuff/common/constants'\n@codebuff/backend test: 8 | \n@codebuff/backend test: 9 | export const dryRun = (model: Model): Omit => ({\n@codebuff/backend test: 10 | model,\n@codebuff/backend test: 11 | displayName: AGENT_PERSONAS.dry_run.displayName,\n@codebuff/backend test: ^\n@codebuff/backend test: TypeError: undefined is not an object (evaluating 'AGENT_PERSONAS.dry_run.displayName')\n@codebuff/backend test: at dryRun (/private/var/folders/k7/h0vthckj46s24j_xs1lp33g80000gn/T/codebuff-eval-U1Rxqp/repo/backend/src/templates/agents/archive/dry-run.ts:11:31)\n@codebuff/backend test: at /private/var/folders/k7/h0vthckj46s24j_xs1lp33g80000gn/T/codebuff-eval-U1Rxqp/repo/backend/src/templates/agent-list.ts:69:10\n@codebuff/backend test: -------------------------------\n@codebuff/backend test: \n@codebuff/backend test: \n@codebuff/backend test: src/__tests__/generate-diffs-prompt.test.ts:\n@codebuff/backend test: {\"result\":{\"diffBlocks\":[{\"searchContent\":\"function test() {\\n return true;\\n}\\n\",\"replaceContent\":\"function test() {\\n if (!condition) return false;\\n return true;\\n}\\n\"}],\"diffBlocksThatDidntMatch\":[]}}\n@codebuff/backend test: (pass) parseAndGetDiffBlocksSingleFile > should parse diff blocks with newline before closing marker [17.55ms]\n@codebuff/backend test: (pass) parseAndGetDiffBlocksSingleFile > should parse diff blocks without newline before closing marker [0.08ms]\n@codebuff/backend test: (pass) parseAndGetDiffBlocksSingleFile > should handle multiple diff blocks with mixed newline patterns [0.02ms]\n@codebuff/backend test: (pass) parseAndGetDiffBlocksSingleFile > should handle empty replace content (with just one newline) [0.02ms]\n@codebuff/backend test: \n@codebuff/backend test: src/__tests__/usage-calculation.test.ts:\n@codebuff/backend test: (pass) Usage Calculation System \n[...TRUNCATED DUE TO LENGTH...]\nkend test: (pass) Backend Tool Call Schema > should validate tool call response structure [0.03ms]\n@codebuff/backend test: (pass) Backend Tool Call Schema > should handle tool call timeout scenarios [0.01ms]\n@codebuff/backend test: (pass) Backend Tool Call Schema > should validate different tool types [0.09ms]\n@codebuff/backend test: (pass) Backend Tool Call Schema > should handle request ID generation [0.02ms]\n@codebuff/backend test: (pass) Backend Tool Call Schema > should generate mock project structure analysis [0.27ms]\n@codebuff/backend test: (pass) Backend Tool Call Schema > should generate mock dependency analysis [0.17ms]\n@codebuff/backend test: (pass) Backend Tool Call Schema > should handle error scenarios in mock generators [0.10ms]\n@codebuff/backend test: \n@codebuff/backend test: src/__tests__/sandbox-generator.test.ts:\n@codebuff/backend test: 87 | mockParams.template = mockTemplate\n@codebuff/backend test: 88 | mockParams.localAgentTemplates = { 'test-vm-agent': mockTemplate }\n@codebuff/backend test: 89 | \n@codebuff/backend test: 90 | const result = await runProgrammaticStep(mockAgentState, mockParams)\n@codebuff/backend test: 91 | \n@codebuff/backend test: 92 | expect(result.agentState.output).toEqual({\n@codebuff/backend test: ^\n@codebuff/backend test: error: expect(received).toEqual(expected)\n@codebuff/backend test: \n@codebuff/backend test: {\n@codebuff/backend test: - \"agentId\": \"test-agent-123\",\n@codebuff/backend test: - \"message\": \"Hello from QuickJS sandbox!\",\n@codebuff/backend test: - \"prompt\": \"Test prompt\",\n@codebuff/backend test: + \"error\": \"Error executing handleSteps for agent test-vm-agent: Cannot access 'sendMessage' before initialization.\",\n@codebuff/backend test: }\n@codebuff/backend test: \n@codebuff/backend test: - Expected - 3\n@codebuff/backend test: + Received + 1\n@codebuff/backend test: \n@codebuff/backend test: at (/private/var/folders/k7/h0vthckj46s24j_xs1lp33g80000gn/T/codebuff-eval-U1Rxqp/repo/backend/src/__tests__/sandbox-generator.test.ts:92:38)\n@codebuff/backend test: (fail) QuickJS Sandbox Generator > should execute string-based generator in QuickJS sandbox [29.84ms]\n@codebuff/backend test: (pass) QuickJS Sandbox Generator > should handle QuickJS sandbox errors gracefully [4.80ms]\n@codebuff/backend test: \n@codebuff/backend test: src/__tests__/auto-topup.test.ts:\n@codebuff/backend test: (pass) Auto Top-up System > checkAndTriggerAutoTopup > should trigger top-up when balance below threshold [9.03ms]\n@codebuff/backend test: (pass) Auto Top-up System > checkAndTriggerAutoTopup > should not trigger top-up when balance above threshold [0.24ms]\n@codebuff/backend test: (pass) Auto Top-up System > checkAndTriggerAutoTopup > should handle debt by topping up max(debt, configured amount) [0.15ms]\n@codebuff/backend test: (pass) Auto Top-up System > checkAndTriggerAutoTopup > should disable auto-topup when validation fails [1.19ms]\n@codebuff/backend test: \n@codebuff/backend test: src/__tests__/loop-agent-steps.test.ts:\n@codebuff/backend test: \n@codebuff/backend test: # Unhandled error between tests\n@codebuff/backend test: -------------------------------\n@codebuff/backend test: 15 | */\n@codebuff/backend test: 16 | export const mockModule = async (\n@codebuff/backend test: 17 | modulePath: string,\n@codebuff/backend test: 18 | renderMocks: () => Record,\n@codebuff/backend test: 19 | ): Promise => {\n@codebuff/backend test: 20 | let original = originalModuleCache[modulePath] ?? {\n@codebuff/backend test: ^\n@codebuff/backend test: ReferenceError: Cannot access 'AsyncAgentManager' before initialization.\n@codebuff/backend test: at (/private/var/folders/k7/h0vthckj46s24j_xs1lp33g80000gn/T/codebuff-eval-U1Rxqp/repo/common/src/testing/mock-modules.ts:20:53)\n@codebuff/backend test: -------------------------------\n@codebuff/backend test: \n@codebuff/backend test: 194 | \n@codebuff/backend test: 195 | const hasPrompt = Boolean(prompt || params)\n@codebuff/backend test: 196 | \n@codebuff/backend test: 197 | if (ASYNC_AGENTS_ENABLED) {\n@codebuff/backend test: 198 | // Register this agent in the async manager so it can receive messages\n@codebuff/backend test: 199 | const isRegistered = asyncAgentManager.getAgent(agentState.agentId)\n@codebuff/backend test: ^\n@codebuff/backend test: ReferenceError: Cannot access 'asyncAgentManager' before initialization.\n@codebuff/backend test: at (/private/var/folders/k7/h0vthckj46s24j_xs1lp33g80000gn/T/codebuff-eval-U1Rxqp/repo/backend/src/run-agent-step.ts:199:26)\n@codebuff/backend test: at async (/private/var/folders/k7/h0vthckj46s24j_xs1lp33g80000gn/T/codebuff-eval-U1Rxqp/repo/backend/src/run-agent-step.ts:529:15)\n@codebuff/backend test: at async (/private/var/folders/k7/h0vthckj46s24j_xs1lp33g80000gn/T/codebuff-eval-U1Rxqp/repo/backend/src/__tests__/loop-agent-steps.test.ts:225:26)\n@codebuff/backend test: (fail) loopAgentSteps STEP behavior > should verify correct STEP behavior - LLM called once after STEP [1.16ms]\n@codebuff/backend test: (pass) loopAgentSteps STEP behavior > should demonstrate correct behavior when programmatic agent completes without STEP [0.11ms]\n@codebuff/backend test: \n@codebuff/backend test: src/__tests__/live-user-inputs.test.ts:\n@codebuff/backend test: (pass) live-user-inputs > startUserInput > should start a new user input [0.20ms]\n@codebuff/backend test: (pass) live-user-inputs > startUserInput > should handle multiple user inputs for same user [0.03ms]\n@codebuff/backend test: (pass) live-user-inputs > startUserInput > should handle user inputs for different users [0.03ms]\n@codebuff/backend test: (pass) live-user-inputs > cancelUserInput > should cancel a specific user input [0.11ms]\n@codebuff/backend test: (pass) live-user-inputs > cancelUserInput > should remove user from tracking when all inputs cancelled [0.03ms]\n@codebuff/backend test: (pass) live-user-inputs > cancelUserInput > should handle cancelling non-existent input gracefully [0.07ms]\n@codebuff/backend test: (pass) live-user-inputs > cancelUserInput > should handle cancelling for non-existent user gracefully [0.02ms]\n@codebuff/backend test: (pass) live-user-inputs > endUserInput > should end user input when async agents disabled [0.04ms]\n@codebuff/backend test: (pass) live-user-inputs > endUserInput > should keep user input when async agents enabled [0.02ms]\n@codebuff/backend test: (pass) live-user-inputs > checkLiveUserInput > should return true for valid live user input [0.10ms]\n@codebuff/backend test: (pass) live-user-inputs > checkLiveUserInput > should return true for user input with matching prefix [0.03ms]\n@codebuff/backend test: (pass) live-user-inputs > checkLiveUserInput > should return false for non-existent user [0.05ms]\n@codebuff/backend test: (pass) live-user-inputs > checkLiveUserInput > should return false for undefined user [0.01ms]\n@codebuff/backend test: (pass) live-user-inputs > checkLiveUserInput > should return false for disconnected session [0.03ms]\n@codebuff/backend test: (pass) live-user-inputs > checkLiveUserInput > should return false for non-matching user input [0.04ms]\n@codebuff/backend test: (pass) live-user-inputs > checkLiveUserInput > should return true when live user input check is disabled [0.03ms]\n@codebuff/backend test: (pass) live-user-inputs > setSessionConnected > should set session as connected [0.05ms]\n@codebuff/backend test: (pass) live-user-inputs > setSessionConnected > should set session as disconnected [0.08ms]\n@codebuff/backend test: (pass) live-user-inputs > setSessionConnected > should handle multiple sessions independently [0.07ms]\n@codebuff/backend test: (pass) live-user-inputs > getLiveUserInputIds > should return undefined for user with no inputs [0.05ms]\n@codebuff/backend test: (pass) live-user-inputs > getLiveUserInputIds > should return undefined for undefined user [0.04ms]\n@codebuff/backend test: (pass) live-user-inputs > getLiveUserInputIds > should return array of input IDs for user with inputs [0.05ms]\n@codebuff/backend test: (pass) live-user-inputs > integration scenarios > should handle complete user input lifecycle [0.21ms]\n@codebuff/backend test: (pass) live-user-inputs > integration scenarios > should handle session disconnect during active input [0.09ms]\n@codebuff/backend test: (pass) live-user-inputs > integration scenarios > should handle multiple concurrent inputs for same user [0.05ms]\n@codebuff/backend test: \n@codebuff/backend test: src/util/__tests__/simplify-tool-results.test.ts:\n@codebuff/backend test: (pass) simplifyToolResultsInMessages > should simplify read_files results while preserving others [0.66ms]\n@codebuff/backend test: (pass) simplifyToolResultsInMessages > should handle array message content format [0.07ms]\n@codebuff/backend test: (pass) simplifyToolResultsInMessages > should return original content if no tool results present [0.06ms]\n@codebuff/backend test: (pass) simplifyToolResultsInMessages > should handle empty content [0.02ms]\n@codebuff/backend test: (pass) simplifyToolResultsInMessages > should handle array message content with no text property [0.02ms]\n@codebuff/backend test: (pass) simplifyToolResultsInMessages > should handle array message content with undefined text property [0.02ms]\n@codebuff/backend test: (pass) simplifyToolResultsInMessages > should handle multiple read_files results [0.06ms]\n@codebuff/backend test: (pass) simplifyToolResultsInMessages > should handle malformed read_files result [0.03ms]\n@codebuff/backend test: (pass) simplifyTerminalCommandResultsInMessages > should simplify long terminal command output [0.11ms]\n@codebuff/backend test: (pass) simplifyTerminalCommandResultsInMessages > should preserve short terminal command output [0.02ms]\n@codebuff/backend test: (pass) simplifyTerminalCommandResultsInMessages > should preserve other tool results [0.04ms]\n@codebuff/backend test: (pass) simplifyTerminalCommandResultsInMessages > should handle multiple terminal command results [0.09ms]\n@codebuff/backend test: (pass) simplifyTerminalCommandResultsInMessages > should handle mixed short and long terminal outputs [0.07ms]\n@codebuff/backend test: (pass) simplifyTerminalCommandResultsInMessages > should handle malformed terminal command result [0.05ms]\n@codebuff/backend test: (pass) simplifyReadFileToolResult > should extract file paths from read_files result [0.04ms]\n@codebuff/backend test: (pass) simplifyReadFileToolResult > should handle single file result [0.03ms]\n@codebuff/backend test: (pass) simplifyReadFileToolResult > should handle empty read_files result [0.02ms]\n@codebuff/backend test: (pass) simplifyReadFileToolResult > should handle malformed read_file tags [0.02ms]\n@codebuff/backend test: (pass) simplifyReadFileToolResult > should handle read_file tags with empty path [0.02ms]\n@codebuff/backend test: (pass) simplifyTerminalCommandResult > should shorten long terminal output [0.02ms]\n@codebuff/backend test: (pass) simplifyTerminalCommandResult > should preserve short terminal output [0.02ms]\n@codebuff/backend test: (pass) simplifyTerminalCommandResult > should handle empty terminal output [0.01ms]\n@codebuff/backend test: (pass) simplifyTerminalCommandResult > should handle output exactly matching omitted message length [0.02ms]\n@codebuff/backend test: (pass) simplifyTerminalCommandResult > should handle output one character longer than omitted message [0.01ms]\n@codebuff/backend test: (pass) simplifyTerminalCommandResult > should handle output one character shorter than omitted message\n@codebuff/backend test: \n@codebuff/backend test: src/util/__tests__/split-data.test.ts:\n@codebuff/backend test: (pass) splitData - base cases > returns primitive as-is in an array [2.02ms]\n@codebuff/backend test: (pass) splitData - base cases > returns non-plain objects as-is [0.11ms]\n@codebuff/backend test: (pass) splitData - base cases > splits short strings when maxChunkSize is small [0.15ms]\n@codebuff/backend test: (pass) splitData - base cases > splits deeply nested strings with small maxChunkSize [0.07ms]\n@codebuff/backend test: (pass) splitData - base cases > handles arrays with long values [0.10ms]\n@codebuff/backend test: (pass) splitData - base cases > preserves numbers and booleans [0.07ms]\n@codebuff/backend test: (pass) splitData - base cases > splits multiple string fields independently [0.04ms]\n@codebuff/backend test: (pass) splitData - array and string-specific splitting > splits long strings into smaller string chunks [0.03ms]\n@codebuff/backend test: (pass) splitData - array and string-specific splitting > splits arrays into smaller arrays with sliced strings [0.03ms]\n@codebuff/backend test: (pass) splitData - array and string-specific splitting > splits plain objects with long strings into smaller objects [0.04ms]\n@codebuff/backend test: (pass) splitData - array and string-specific splitting > preserves numbers and booleans in split arrays [0.06ms]\n@codebuff/backend test: (pass) splitData - array and string-specific splitting > splits hybrid nested array/object structures within size limits [0.08ms]\n@codebuff/backend test: (pass) splitData - array and string-specific splitting > efficiently combines array elements while respecting maxSize [0.04ms]\n@codebuff/backend test: (pass) splitData - array and string-specific splitting > efficiently combines object properties while respecting maxSize [0.08ms]\n@codebuff/backend test: (pass) splitData - array and string-specific splitting > handles escaped characters at split points [0.03ms]\n@codebuff/backend test: (pass) splitData - nested object splitting > maintains object structure when splitting nested long strings [0.02ms]\n@codebuff/backend test: \n@codebuff/backend test: src/util/__tests__/messages.test.ts:\n@codebuff/backend test: (pass) messagesWithSystem > prepends system message to array [0.09ms]\n@codebuff/backend test: (pass) trimMessagesToFitTokenLimit > handles all features working together correctly [0.94ms]\n@codebuff/backend test: (pass) trimMessagesToFitTokenLimit > subtracts system tokens from total tokens [0.77ms]\n@codebuff/backend test: (pass) trimMessagesToFitTokenLimit > does not simplify if under token limit [0.27ms]\n@codebuff/backend test: (pass) trimMessagesToFitTokenLimit > handles empty messages array [0.08ms]\n@codebuff/backend test: (pass) trimMessagesToFitTokenLimit > keepDuringTruncation functionality > preserves messages marked with keepDuringTruncation=true [0.48ms]\n@codebuff/backend test: (pass) trimMessagesToFitTokenLimit > keepDuringTruncation functionality > does not add replacement message when no messages are removed [0.06ms]\n@codebuff/backend test: (pass) trimMessagesToFitTokenLimit > keepDuringTruncation functionality > handles consecutive replacement messages correctly [0.10ms]\n@codebuff/backend test: (pass) trimMessagesToFitTokenLimit > keepDuringTruncation functionality > calculates token removal correctly with keepDuringTruncation [0.05ms]\n@codebuff/backend test: (pass) trimMessagesToFitTokenLimit > keepDuringTruncation functionality > handles mixed keepDuringTruncation and regular messages [0.04ms]\n@codebuff/backend test: \n@codebuff/backend test: src/util/__tests__/parse-tool-call-xml.test.ts:\n@codebuff/backend test: (pass) parseToolCallXml > should parse basic key-value pairs [0.21ms]\n@codebuff/backend test: (pass) parseToolCallXml > should handle empty content\n@codebuff/backend test: (pass) parseToolCallXml > should handle whitespace around values\n@codebuff/backend test: (pass) parseToolCallXml > should handle internal whitespace [0.05ms]\n@codebuff/backend test: (pass) parseToolCallXml > should return an empty object for empty or whitespace-only input\n@codebuff/backend test: (pass) parseToolCallXml > should handle special XML characters within values\n@codebuff/backend test: (pass) parseToolCallXml > should parse numbers as strings\n@codebuff/backend test: (pass) parseToolCallXml > should parse booleans as strings [0.01ms]\n@codebuff/backend test: (pass) parseToolCallXml > should parse nested range tags as raw string content [0.01ms]\n@codebuff/backend test: (pass) parseToolCallXml > should parse mixed types as strings [0.02ms]\n@codebuff/backend test: (pass) parseToolCallXml > should handle complex example with various types (all as strings) [0.03ms]\n@codebuff/backend test: (pass) parseToolCallXml > should convert boolean values\n@codebuff/backend test: (pass) parseToolCallXml > should convert numeric values [0.02ms]\n@codebuff/backend test: (pass) parseToolCallXml > should handle complex browser action example [0.01ms]\n@codebuff/backend test: (pass) parseToolCallXml > should handle multiline content with whitespace [0.03ms]\n@codebuff/backend test: (pass) parseToolCallXml > should handle diagnostic step example [0.02ms]\n@codebuff/backend test: (pass) parseToolCallXml > should handle empty tags [0.01ms]\n@codebuff/backend test: \n@codebuff/backend test: src/util/__tests__/object.test.ts:\n@codebuff/backend test: (pass) stripNullCharsFromObject > should remove null characters from strings in a simple object [0.18ms]\n@codebuff/backend test: (pass) stripNullCharsFromObject > should remove null characters from strings in a nested object [0.03ms]\n@codebuff/backend test: (pass) stripNullCharsFromObject > should remove null characters from strings within an array [0.02ms]\n@codebuff/backend test: (pass) stripNullCharsFromObject > should remove null characters from strings within objects in an array [0.03ms]\n@codebuff/backend test: (pass) stripNullCharsFromObject > should handle mixed data types correctly [0.04ms]\n@codebuff/backend test: (pass) stripNullCharsFromObject > should handle empty objects and arrays [0.01ms]\n@codebuff/backend test: (pass) stripNullCharsFromObject > should handle a string input directly\n@codebuff/backend test: (pass) stripNullCharsFromObject > should handle non-string, non-object, non-array inputs [0.02ms]\n@codebuff/backend test: (pass) stripNullCharsFromObject > should handle complex nested structures [0.04ms]\n@codebuff/backend test: \n@codebuff/backend test: src/llm-apis/__tests__/linkup-api.test.ts:\n@codebuff/backend test: (pass) Linkup API > should successfully search with basic query [0.49ms]\n@codebuff/backend test: (pass) Linkup API > should handle custom depth [0.22ms]\n@codebuff/backend test: (pass) Linkup API > should handle API errors gracefully [0.22ms]\n@codebuff/backend test: (pass) Linkup API > should handle network errors [0.28ms]\n@codebuff/backend test: (pass) Linkup API > should handle invalid response format [0.17ms]\n@codebuff/backend test: (pass) Linkup API > should handle missing answer field [0.09ms]\n@codebuff/backend test: (pass) Linkup API > should handle empty answer [0.08ms]\n@codebuff/backend test: (pass) Linkup API > should use default options when none provided [0.09ms]\n@codebuff/backend test: (pass) Linkup API > should handle malformed JSON response [0.11ms]\n@codebuff/backend test: (pass) Linkup API > should log detailed error information for 404 responses [0.15ms]\n@codebuff/backend test: \n@codebuff/backend test: 7 tests skipped:\n@codebuff/backend test: (skip) read_docs tool with researcher agent > should successfully fetch documentation with basic query\n@codebuff/backend test: (skip) read_docs tool with researcher agent > should fetch documentation with topic and max_tokens\n@codebuff/backend test: (skip) mainPrompt (Integration) > should delete a specified function while preserving other code\n@codebuff/backend test: (skip) mainPrompt (Integration) > Real world example > should specify deletion comment while deleting single character\n@codebuff/backend test: (skip) rewriteWithOpenAI > (unnamed)\n@codebuff/backend test: (skip) rewriteWithOpenAI > should correctly integrate edit snippet changes while preserving formatting\n@codebuff/backend test: (skip) rewriteWithOpenAI > (unnamed)\n@codebuff/backend test: \n@codebuff/backend test: \n@codebuff/backend test: 38 tests failed:\n@codebuff/backend test: (fail) runAgentStep - set_output tool > should set output with simple key-value pair [0.25ms]\n@codebuff/backend test: (fail) runAgentStep - set_output tool > should set output with complex data [0.04ms]\n@codebuff/backend test: (fail) runAgentStep - set_output tool > should replace existing output data [0.03ms]\n@codebuff/backend test: (fail) runAgentStep - set_output tool > should handle empty output parameter\n@codebuff/backend test: (fail) runAgentStep - set_output tool > should handle handleSteps with one tool call and STEP_ALL [0.05ms]\n@codebuff/backend test: (fail) runAgentStep - set_output tool > should spawn agent inline that deletes last two assistant messages\n@codebuff/backend test: (fail) mainPrompt > should add file updates to tool results in message history [0.60ms]\n@codebuff/backend test: (fail) mainPrompt > should handle direct terminal command [0.25ms]\n@codebuff/backend test: (fail) mainPrompt > should handle write_file tool call\n@codebuff/backend test: (fail) mainPrompt > should force end of response after MAX_CONSECUTIVE_ASSISTANT_MESSAGES [0.19ms]\n@codebuff/backend test: (fail) mainPrompt > should update consecutiveAssistantMessages when new prompt is received\n@codebuff/backend test: (fail) mainPrompt > should increment consecutiveAssistantMessages when no new prompt\n@codebuff/backend test: (fail) mainPrompt > should return no tool calls when LLM response is empty [0.22ms]\n@codebuff/backend test: (fail) mainPrompt > should unescape ampersands in run_terminal_command tool calls [0.42ms]\n@codebuff/backend test: (fail) read_docs tool with researcher agent > should handle case when no documentation is found [0.31ms]\n@codebuff/backend test: (fail) read_docs tool with researcher agent > should handle API errors gracefully [0.06ms]\n@codebuff/backend test: (fail) read_docs tool with researcher agent > should include topic in error message when specified [0.05ms]\n@codebuff/backend test: (fail) read_docs tool with researcher agent > should handle non-Error exceptions [0.05ms]\n@codebuff/backend test: (fail) processFileBlockModule > processFileBlock > should handle Windows line endings with multi-line changes [317.18ms]\n@codebuff/backend test: (fail) processFileBlockModule > processFileBlock > should handle multiple diff blocks in a single file [380.38ms]\n@codebuff/backend test: (fail) processFileBlockModule > processFileBlock > should preserve Windows line endings in patch and content [489.82ms]\n@codebuff/backend test: (fail) runProgrammaticStep > tool execution > should execute single tool call [0.31ms]\n@codebuff/backend test: (fail) runProgrammaticStep > tool execution > should add find_files tool result to messageHistory [1.32ms]\n@codebuff/backend test: (fail) runProgrammaticStep > tool execution > should execute multiple tool calls in sequence [0.21ms]\n@codebuff/backend test: (fail) runProgrammaticStep > tool execution > should comprehensively test STEP_ALL functionality with multiple tools and state management [0.33ms]\n@codebuff/backend test: (fail) runProgrammaticStep > tool execution > should pass tool results back to generator [0.15ms]\n@codebuff/backend test: (fail) runProgrammaticStep > generator control flow > should handle STEP value to break execution [0.10ms]\n@codebuff/backend test: (fail) runProgrammaticStep > generator control flow > should end turn when end_turn tool is called [0.12ms]\n@codebuff/backend test: (fail) runProgrammaticStep > state management > should preserve agent state changes [0.07ms]\n@codebuff/backend test: (fail) runProgrammaticStep > state management > should preserve message history [0.10ms]\n@codebuff/backend test: (fail) runProgrammaticStep > error handling > should handle tool execution errors [0.13ms]\n@codebuff/backend test: (fail) runProgrammaticStep > output schema validation > should validate output against outputSchema when using setOutput [0.20ms]\n@codebuff/backend test: (fail) runProgrammaticStep > output schema validation > should work with agents that have no outputSchema [0.17ms]\n@codebuff/backend test: (fail) runProgrammaticStep > output schema validation > should work with outputMode structured_output but no outputSchema defined [0.15ms]\n@codebuff/backend test: (fail) runProgrammaticStep > logging and context > should generate unique agent step ID [0.11ms]\n@codebuff/backend test: (fail) QuickJS Sandbox Generator > should execute string-based generator in QuickJS sandbox [29.84ms]\n@codebuff/backend test: (fail) loopAgentSteps STEP behavior > should verify correct STEP behavior - LLM called once after STEP [1.16ms]\n@codebuff/backend test: \n@codebuff/backend test: 211 pass\n@codebuff/backend test: 7 skip\n@codebuff/backend test: 38 fail\n@codebuff/backend test: 4 errors\n@codebuff/backend test: 518 expect() calls\n@codebuff/backend test: Ran 256 tests across 29 files. [5.14s]\n@codebuff/backend test: Exited with code 1\n", - "stderr": "$ bun --filter='{@codebuff/backend,@codebuff/common,@codebuff/npm-app}' run test\nerror: script \"test\" exited with code 1\n", - "exitCode": 1 - } - } - ], - "parentAgentId": "D-1-F0_olPY" - }, - { - "type": "text", - "agentId": "D-1-F0_olPY", - "text": "**@codebuff/common tests:** 164 passed, 1 skipped, 0 failed. Ran 165 tests across 10 files in 517ms. Exited with code 0.\n\n**@codebuff/backend tests:** 211 passed, 7 skipped, **38 failed**, 4 errors. Ran 256 tests across 29 files in 5.14s. Exited with code 1.\n\n**Key failures/errors:**\n- `sandbox-generator.test.ts`: QuickJS Sandbox Generator > should execute string-based generator in QuickJS sandbox (expect mismatch on agentState.output; received error: \"Cannot access 'sendMessage' before initialization\").\n- `loop-agent-steps.test.ts`: loopAgentSteps STEP behavior > should verify correct STEP behavior (ReferenceError: Cannot access 'asyncAgentManager' before initialization).\n- Unhandled errors: TypeError in `dry-run.ts` (AGENT_PERSONAS.dry_run undefined); ReferenceError in `mock-modules.ts` and `run-agent-step.ts`.\n- 38 total fails including: runAgentStep (set_output tool cases), mainPrompt (file updates, terminal commands, etc.), processFileBlockModule (Windows line endings, multi-line changes), runProgrammaticStep (tool execution, STEP_ALL, errors).\n\nOverall exit code: 1 (due to backend failures)." - }, - { - "type": "subagent_finish", - "agentId": "D-1-F0_olPY", - "agentType": "commander-lite", - "displayName": "Commander Lite", - "onlyChild": false, - "parentAgentId": "main-agent", - "prompt": "Run relevant package tests if any affected.", - "params": { - "command": "bun run test", - "timeout_seconds": 120 - } - }, - { - "type": "tool_result", - "toolCallId": "0c636b39-7349-4e7a-85b2-477c2680fda3", - "toolName": "run_terminal_command", - "output": [ - { - "type": "json", - "value": { - "command": "bun run format --check", - "stdout": "Checking formatting...\n", - "stderr": "$ prettier --write \"**/*.{ts,tsx,json,md}\" --check\n[warn] backend/src/templates/agents/agent-builder.ts\n[warn] backend/src/tools/definitions/tool/spawn-agent-inline.ts\n[warn] backend/src/util/messages.ts\n[warn] common/src/db/migrations/meta/_journal.json\n[warn] common/src/db/migrations/meta/0027_snapshot.json\n[warn] common/src/db/migrations/meta/0028_snapshot.json\n[warn] common/src/tools/params/tool/spawn-agent-inline.ts\n[warn] common/src/util/error.ts\n[warn] scripts/convert-escaped-newlines.ts\n[warn] sdk/CHANGELOG.md\n[warn] sdk/PUBLISHING.md\n[warn] sdk/src/tools/read-files.ts\n[warn] web/src/app/api/agents/route.ts\n[warn] web/src/app/api/orgs/[orgId]/publishers/route.ts\n[warn] web/src/app/api/publishers/[id]/organization/route.ts\n[warn] web/src/components/publisher/basic-info-step.tsx\n[warn] web/src/components/publisher/step-template.tsx\n[warn] web/src/hooks/use-user-profile.ts\n[warn] web/src/lib/publisher-permissions.ts\n[warn] Code style issues fixed in 19 files.\n", - "exitCode": 0 - } - } - ], - "parentAgentId": "D-1-F9QrDRM" - }, - { - "type": "tool_result", - "toolCallId": "7406ef13-feaa-4621-8d92-44c6500769ca", - "toolName": "run_terminal_command", - "output": [ - { - "type": "json", - "value": { - "command": "bun run typecheck", - "stdout": "@codebuff/code-map typecheck: Exited with code 0\n@codebuff/bigquery typecheck: Exited with code 0\n@codebuff/sdk typecheck: Exited with code 0\n@codebuff/internal typecheck: Exited with code 0\n@codebuff/billing typecheck: Exited with code 0\n@codebuff/npm-app typecheck: Exited with code 0\n@codebuff/common typecheck: Exited with code 0\n@codebuff/scripts typecheck: ../backend/src/templates/agents/agent-builder.ts(90,3): error TS2741: Property 'spawnableAgents' is missing in type '{ model: Model; displayName: string; spawnPurposePrompt: string; inputSchema: { prompt: ZodOptional; params: ZodOptional; purpose: ZodOptional<...>; specialty: ZodOptional<...>; model: ZodOptional<...>; }, $loose>>; }; ... 6 more ...; handleSteps: () => Generator<....' but required in type 'Omit'.\n@codebuff/scripts typecheck: ../backend/src/templates/agents/archive/dry-run.ts(11,31): error TS2339: Property 'dry_run' does not exist on type '{ readonly base: { readonly displayName: \"Buffy the Enthusiastic Coding Assistant\"; readonly purpose: \"Base agent that orchestrates the full response.\"; }; readonly base_lite: { readonly displayName: \"Buffy the Enthusiastic Coding Assistant\"; readonly purpose: \"Base agent that orchestrates the full response.\"; }; .....'.\n@codebuff/scripts typecheck: ../backend/src/templates/agents/archive/dry-run.ts(12,38): error TS2339: Property 'dry_run' does not exist on type '{ readonly base: { readonly displayName: \"Buffy the Enthusiastic Coding Assistant\"; readonly purpose: \"Base agent that orchestrates the full response.\"; }; readonly base_lite: { readonly displayName: \"Buffy the Enthusiastic Coding Assistant\"; readonly purpose: \"Base agent that orchestrates the full response.\"; }; .....'.\n@codebuff/scripts typecheck: Exited with code 2\n@codebuff/backend typecheck: src/templates/agents/agent-builder.ts(90,3): error TS2741: Property 'spawnableAgents' is missing in type '{ model: Model; displayName: string; spawnPurposePrompt: string; inputSchema: { prompt: ZodOptional; params: ZodOptional; purpose: ZodOptional<...>; specialty: ZodOptional<...>; model: ZodOptional<...>; }, $loose>>; }; ... 6 more ...; handleSteps: () => Generator<....' but required in type 'Omit'.\n@codebuff/backend typecheck: src/templates/agents/archive/dry-run.ts(11,31): error TS2339: Property 'dry_run' does not exist on type '{ readonly base: { readonly displayName: \"Buffy the Enthusiastic Coding Assistant\"; readonly purpose: \"Base agent that orchestrates the full response.\"; }; readonly base_lite: { readonly displayName: \"Buffy the Enthusiastic Coding Assistant\"; readonly purpose: \"Base agent that orchestrates the full response.\"; }; .....'.\n@codebuff/backend typecheck: src/templates/agents/archive/dry-run.ts(12,38): error TS2339: Property 'dry_run' does not exist on type '{ readonly base: { readonly displayName: \"Buffy the Enthusiastic Coding Assistant\"; readonly purpose: \"Base agent that orchestrates the full response.\"; }; readonly base_lite: { readonly displayName: \"Buffy the Enthusiastic Coding Assistant\"; readonly purpose: \"Base agent that orchestrates the full response.\"; }; .....'.\n@codebuff/backend typecheck: Exited with code 2\n@codebuff/evals typecheck: ../backend/src/templates/agents/agent-builder.ts(90,3): error TS2741: Property 'spawnableAgents' is missing in type '{ model: Model; displayName: string; spawnPurposePrompt: string; inputSchema: { prompt: ZodOptional; params: ZodOptional; purpose: ZodOptional<...>; specialty: ZodOptional<...>; model: ZodOptional<...>; }, $loose>>; }; ... 6 more ...; handleSteps: () => Generator<....' but required in type 'Omit'.\n@codebuff/evals typecheck: ../backend/src/templates/agents/archive/dry-run.ts(11,31): error TS2339: Property 'dry_run' does not exist on type '{ readonly base: { readonly displayName: \"Buffy the Enthusiastic Coding Assistant\"; readonly purpose: \"Base agent that orchestrates the full response.\"; }; readonly base_lite: { readonly displayName: \"Buffy the Enthusiastic Coding Assistant\"; readonly purpose: \"Base agent that orchestrates the full response.\"; }; .....'.\n@codebuff/evals typecheck: ../backend/src/templates/agents/archive/dry-run.ts(12,38): error TS2339: Property 'dry_run' does not exist on type '{ readonly base: { readonly displayName: \"Buffy the Enthusiastic Coding Assistant\"; readonly purpose: \"Base agent that orchestrates the full response.\"; }; readonly base_lite: { readonly displayName: \"Buffy the Enthusiastic Coding Assistant\"; readonly purpose: \"Base agent that orchestrates the full response.\"; }; .....'.\n@codebuff/evals typecheck: Exited with code 2\n@codebuff/web typecheck: Exited with code 0\n", - "stderr": "$ bun --filter='*' run typecheck && echo '✅ All type checks passed!'\n", - "exitCode": 2 - } - } - ], - "parentAgentId": "D-1-F5QYws4" - }, - { - "type": "text", - "agentId": "D-1-F9QrDRM", - "text": "**Formatting check results:** Issues detected in 19 files (listed with [warn]):\n\n- `backend/src/templates/agents/agent-builder.ts`\n- `backend/src/tools/definitions/tool/spawn-agent-inline.ts`\n- `backend/src/util/messages.ts`\n- `common/src/db/migrations/meta/_journal.json`\n- `common/src/db/migrations/meta/0027_snapshot.json`\n- `common/src/db/migrations/meta/0028_snapshot.json`\n- `common/src/tools/params/tool/spawn-agent-inline.ts`\n- `common/src/util/error.ts`\n- `scripts/convert-escaped-newlines.ts`\n- `sdk/CHANGELOG.md`\n- `sdk/PUBLISHING.md`\n- `sdk/src/tools/read-files.ts`\n- `web/src/app/api/agents/route.ts`\n- `web/src/app/api/orgs/[orgId]/publishers/route.ts`\n- `web/src/app/api/publishers/[id]/organization/route.ts`\n- `web/src/components/publisher/basic-info-step.tsx`\n- `web/src/components/publisher/step-template.tsx`\n- `web/src/hooks/use-user-profile.ts`\n- `web/src/lib/publisher-permissions.ts`\n\nOutput notes: \"Code style issues fixed in 19 files.\" (exit code: 0)" - }, - { - "type": "subagent_finish", - "agentId": "D-1-F9QrDRM", - "agentType": "commander-lite", - "displayName": "Commander Lite", - "onlyChild": false, - "parentAgentId": "main-agent", - "prompt": "Check if any formatting issues.", - "params": { - "command": "bun run format --check", - "timeout_seconds": 60 - } - }, - { - "type": "text", - "agentId": "D-1-F5QYws4", - "text": "Typecheck failed with overall exit code 2.\n\n**Packages that passed (exit code 0):**\n- @codebuff/code-map\n- @codebuff/bigquery\n- @codebuff/sdk\n- @codebuff/internal\n- @codebuff/billing\n- @codebuff/npm-app\n- @codebuff/common\n- @codebuff/web\n\n**Packages that failed (exit code 2):**\n- @codebuff/scripts\n- @codebuff/backend\n- @codebuff/evals\n\n**Errors (repeated across failed packages):**\n- `../backend/src/templates/agents/agent-builder.ts(90,3): error TS2741: Property 'spawnableAgents' is missing in type '{ model: Model; displayName: string; ... }' but required in type 'Omit'`\n- `../backend/src/templates/agents/archive/dry-run.ts(11,31): error TS2339: Property 'dry_run' does not exist on type '{ readonly base: { ... }; ... }'`\n- `../backend/src/templates/agents/archive/dry-run.ts(12,38): error TS2339: Property 'dry_run' does not exist on type '{ readonly base: { ... }; ... }'`" - }, - { - "type": "subagent_finish", - "agentId": "D-1-F5QYws4", - "agentType": "commander-lite", - "displayName": "Commander Lite", - "onlyChild": false, - "parentAgentId": "main-agent", - "prompt": "Run root typecheck to validate TypeScript changes.", - "params": { - "command": "bun run typecheck", - "timeout_seconds": 120 - } - }, - { - "type": "tool_result", - "toolCallId": "D-oYtCzzjlw", - "toolName": "spawn_agents", - "output": [ - { - "type": "json", - "value": [ - { - "agentName": "Commander Lite", - "agentType": "commander-lite", - "value": { - "type": "lastMessage", - "value": [ - { - "role": "assistant", - "content": [ - { - "type": "text", - "text": "Typecheck failed with overall exit code 2.\n\n**Packages that passed (exit code 0):**\n- @codebuff/code-map\n- @codebuff/bigquery\n- @codebuff/sdk\n- @codebuff/internal\n- @codebuff/billing\n- @codebuff/npm-app\n- @codebuff/common\n- @codebuff/web\n\n**Packages that failed (exit code 2):**\n- @codebuff/scripts\n- @codebuff/backend\n- @codebuff/evals\n\n**Errors (repeated across failed packages):**\n- `../backend/src/templates/agents/agent-builder.ts(90,3): error TS2741: Property 'spawnableAgents' is missing in type '{ model: Model; displayName: string; ... }' but required in type 'Omit'`\n- `../backend/src/templates/agents/archive/dry-run.ts(11,31): error TS2339: Property 'dry_run' does not exist on type '{ readonly base: { ... }; ... }'`\n- `../backend/src/templates/agents/archive/dry-run.ts(12,38): error TS2339: Property 'dry_run' does not exist on type '{ readonly base: { ... }; ... }'`" - } - ] - } - ] - } - }, - { - "agentName": "Commander Lite", - "agentType": "commander-lite", - "value": { - "type": "lastMessage", - "value": [ - { - "role": "assistant", - "content": [ - { - "type": "text", - "text": "**@codebuff/common tests:** 164 passed, 1 skipped, 0 failed. Ran 165 tests across 10 files in 517ms. Exited with code 0.\n\n**@codebuff/backend tests:** 211 passed, 7 skipped, **38 failed**, 4 errors. Ran 256 tests across 29 files in 5.14s. Exited with code 1.\n\n**Key failures/errors:**\n- `sandbox-generator.test.ts`: QuickJS Sandbox Generator > should execute string-based generator in QuickJS sandbox (expect mismatch on agentState.output; received error: \"Cannot access 'sendMessage' before initialization\").\n- `loop-agent-steps.test.ts`: loopAgentSteps STEP behavior > should verify correct STEP behavior (ReferenceError: Cannot access 'asyncAgentManager' before initialization).\n- Unhandled errors: TypeError in `dry-run.ts` (AGENT_PERSONAS.dry_run undefined); ReferenceError in `mock-modules.ts` and `run-agent-step.ts`.\n- 38 total fails including: runAgentStep (set_output tool cases), mainPrompt (file updates, terminal commands, etc.), processFileBlockModule (Windows line endings, multi-line changes), runProgrammaticStep (tool execution, STEP_ALL, errors).\n\nOverall exit code: 1 (due to backend failures)." - } - ] - } - ] - } - }, - { - "agentName": "Commander Lite", - "agentType": "commander-lite", - "value": { - "type": "lastMessage", - "value": [ - { - "role": "assistant", - "content": [ - { - "type": "text", - "text": "**Formatting check results:** Issues detected in 19 files (listed with [warn]):\n\n- `backend/src/templates/agents/agent-builder.ts`\n- `backend/src/tools/definitions/tool/spawn-agent-inline.ts`\n- `backend/src/util/messages.ts`\n- `common/src/db/migrations/meta/_journal.json`\n- `common/src/db/migrations/meta/0027_snapshot.json`\n- `common/src/db/migrations/meta/0028_snapshot.json`\n- `common/src/tools/params/tool/spawn-agent-inline.ts`\n- `common/src/util/error.ts`\n- `scripts/convert-escaped-newlines.ts`\n- `sdk/CHANGELOG.md`\n- `sdk/PUBLISHING.md`\n- `sdk/src/tools/read-files.ts`\n- `web/src/app/api/agents/route.ts`\n- `web/src/app/api/orgs/[orgId]/publishers/route.ts`\n- `web/src/app/api/publishers/[id]/organization/route.ts`\n- `web/src/components/publisher/basic-info-step.tsx`\n- `web/src/components/publisher/step-template.tsx`\n- `web/src/hooks/use-user-profile.ts`\n- `web/src/lib/publisher-permissions.ts`\n\nOutput notes: \"Code style issues fixed in 19 files.\" (exit code: 0)" - } - ] - } - ] - } - } - ] - } - ] - }, - { - "type": "tool_call", - "toolCallId": "cf7df9fe-7f13-407b-8128-c85e3a1790d8", - "toolName": "spawn_agent_inline", - "input": { - "agent_type": "context-pruner", - "params": {} - }, - "agentId": "main-agent", - "includeToolCall": false - }, - { - "type": "tool_result", - "toolCallId": "cf7df9fe-7f13-407b-8128-c85e3a1790d8", - "toolName": "spawn_agent_inline", - "output": [ - { - "type": "json", - "value": { - "message": "Agent spawned." - } - } - ] - }, - { - "type": "tool_call", - "toolCallId": "D-4BkL8ykig", - "toolName": "spawn_agents", - "input": { - "agents": [ - { - "agent_type": "editor-gpt-5" - } - ] - }, - "agentId": "main-agent", - "includeToolCall": true - }, - { - "type": "tool_call", - "toolCallId": "D-4DhNpiT3A", - "toolName": "spawn_agents", - "input": { - "agents": [ - { - "agent_type": "commander-lite", - "prompt": "Run root typecheck after fixes.", - "params": { - "command": "bun run typecheck", - "timeout_seconds": 120 - } - }, - { - "agent_type": "commander-lite", - "prompt": "Format all files.", - "params": { - "command": "bun run format", - "timeout_seconds": 60 - } - } - ] - }, - "agentId": "main-agent", - "includeToolCall": true - }, - { - "type": "subagent_start", - "agentId": "D-4DyHWn7Os", - "agentType": "editor-gpt-5", - "displayName": "Code Editor", - "onlyChild": true, - "parentAgentId": "main-agent", - "prompt": "" - }, - { - "type": "error", - "message": "Tool `read_files` is not currently available. Make sure to only use tools listed in the system instructions.", - "agentId": "D-4DyHWn7Os" - }, - { - "type": "tool_call", - "toolCallId": "099441fb-4006-44ea-a837-1c18ee1e14e2", - "toolName": "set_output", - "input": { - "output": { - "message": "", - "toolResults": [] - } - }, - "agentId": "D-4DyHWn7Os", - "parentAgentId": "main-agent", - "includeToolCall": false - }, - { - "type": "tool_result", - "toolCallId": "099441fb-4006-44ea-a837-1c18ee1e14e2", - "toolName": "set_output", - "output": [ - { - "type": "json", - "value": { - "message": "Output set" - } - } - ], - "parentAgentId": "D-4DyHWn7Os" - }, - { - "type": "subagent_finish", - "agentId": "D-4DyHWn7Os", - "agentType": "editor-gpt-5", - "displayName": "Code Editor", - "onlyChild": true, - "parentAgentId": "main-agent", - "prompt": "" - }, - { - "type": "tool_result", - "toolCallId": "D-4BkL8ykig", - "toolName": "spawn_agents", - "output": [ - { - "type": "json", - "value": [ - { - "agentName": "Code Editor", - "agentType": "editor-gpt-5", - "value": { - "type": "structuredOutput", - "value": { - "output": { - "message": "", - "toolResults": [] - } - } - } - } - ] - } - ] - }, - { - "type": "subagent_start", - "agentId": "D-47hYldaEo", - "agentType": "commander-lite", - "displayName": "Commander Lite", - "onlyChild": false, - "parentAgentId": "main-agent", - "prompt": "Run root typecheck after fixes.", - "params": { - "command": "bun run typecheck", - "timeout_seconds": 120 - } - }, - { - "type": "subagent_start", - "agentId": "D-47hUftbfs", - "agentType": "commander-lite", - "displayName": "Commander Lite", - "onlyChild": false, - "parentAgentId": "main-agent", - "prompt": "Format all files.", - "params": { - "command": "bun run format", - "timeout_seconds": 60 - } - }, - { - "type": "tool_call", - "toolCallId": "57a8298e-53c9-420a-b4b1-d326cf847393", - "toolName": "run_terminal_command", - "input": { - "command": "bun run typecheck", - "timeout_seconds": 120 - }, - "agentId": "D-47hYldaEo", - "parentAgentId": "main-agent", - "includeToolCall": true - }, - { - "type": "tool_call", - "toolCallId": "9bc06224-f77d-4edf-9c40-d6d3986cfe64", - "toolName": "run_terminal_command", - "input": { - "command": "bun run format", - "timeout_seconds": 60 - }, - "agentId": "D-47hUftbfs", - "parentAgentId": "main-agent", - "includeToolCall": true - }, - { - "type": "tool_result", - "toolCallId": "57a8298e-53c9-420a-b4b1-d326cf847393", - "toolName": "run_terminal_command", - "output": [ - { - "type": "json", - "value": { - "command": "bun run typecheck", - "stdout": "@codebuff/code-map typecheck: Exited with code 0\n@codebuff/sdk typecheck: Exited with code 0\n@codebuff/bigquery typecheck: Exited with code 0\n@codebuff/internal typecheck: Exited with code 0\n@codebuff/billing typecheck: Exited with code 0\n@codebuff/npm-app typecheck: Exited with code 0\n@codebuff/common typecheck: Exited with code 0\n@codebuff/scripts typecheck: ../backend/src/templates/agents/agent-builder.ts(93,3): error TS2741: Property 'spawnableAgents' is missing in type '{ model: Model; displayName: string; spawnPurposePrompt: string; inputSchema: { prompt: ZodOptional; params: ZodOptional; purpose: ZodOptional<...>; specialty: ZodOptional<...>; model: ZodOptional<...>; }, $loose>>; }; ... 6 more ...; handleSteps: () => Generator<....' but required in type 'Omit'.\n@codebuff/scripts typecheck: ../backend/src/templates/agents/archive/dry-run.ts(11,31): error TS2339: Property 'dry_run' does not exist on type '{ readonly base: { readonly displayName: \"Buffy the Enthusiastic Coding Assistant\"; readonly purpose: \"Base agent that orchestrates the full response.\"; }; readonly base_lite: { readonly displayName: \"Buffy the Enthusiastic Coding Assistant\"; readonly purpose: \"Base agent that orchestrates the full response.\"; }; .....'.\n@codebuff/scripts typecheck: ../backend/src/templates/agents/archive/dry-run.ts(12,38): error TS2339: Property 'dry_run' does not exist on type '{ readonly base: { readonly displayName: \"Buffy the Enthusiastic Coding Assistant\"; readonly purpose: \"Base agent that orchestrates the full response.\"; }; readonly base_lite: { readonly displayName: \"Buffy the Enthusiastic Coding Assistant\"; readonly purpose: \"Base agent that orchestrates the full response.\"; }; .....'.\n@codebuff/scripts typecheck: Exited with code 2\n@codebuff/web typecheck: Exited with code 0\n@codebuff/backend typecheck: src/templates/agents/agent-builder.ts(93,3): error TS2741: Property 'spawnableAgents' is missing in type '{ model: Model; displayName: string; spawnPurposePrompt: string; inputSchema: { prompt: ZodOptional; params: ZodOptional; purpose: ZodOptional<...>; specialty: ZodOptional<...>; model: ZodOptional<...>; }, $loose>>; }; ... 6 more ...; handleSteps: () => Generator<....' but required in type 'Omit'.\n@codebuff/backend typecheck: src/templates/agents/archive/dry-run.ts(11,31): error TS2339: Property 'dry_run' does not exist on type '{ readonly base: { readonly displayName: \"Buffy the Enthusiastic Coding Assistant\"; readonly purpose: \"Base agent that orchestrates the full response.\"; }; readonly base_lite: { readonly displayName: \"Buffy the Enthusiastic Coding Assistant\"; readonly purpose: \"Base agent that orchestrates the full response.\"; }; .....'.\n@codebuff/backend typecheck: src/templates/agents/archive/dry-run.ts(12,38): error TS2339: Property 'dry_run' does not exist on type '{ readonly base: { readonly displayName: \"Buffy the Enthusiastic Coding Assistant\"; readonly purpose: \"Base agent that orchestrates the full response.\"; }; readonly base_lite: { readonly displayName: \"Buffy the Enthusiastic Coding Assistant\"; readonly purpose: \"Base agent that orchestrates the full response.\"; }; .....'.\n@codebuff/backend typecheck: Exited with code 2\n@codebuff/evals typecheck: ../backend/src/templates/agents/agent-builder.ts(93,3): error TS2741: Property 'spawnableAgents' is missing in type '{ model: Model; displayName: string; spawnPurposePrompt: string; inputSchema: { prompt: ZodOptional; params: ZodOptional; purpose: ZodOptional<...>; specialty: ZodOptional<...>; model: ZodOptional<...>; }, $loose>>; }; ... 6 more ...; handleSteps: () => Generator<....' but required in type 'Omit'.\n@codebuff/evals typecheck: ../backend/src/templates/agents/archive/dry-run.ts(11,31): error TS2339: Property 'dry_run' does not exist on type '{ readonly base: { readonly displayName: \"Buffy the Enthusiastic Coding Assistant\"; readonly purpose: \"Base agent that orchestrates the full response.\"; }; readonly base_lite: { readonly displayName: \"Buffy the Enthusiastic Coding Assistant\"; readonly purpose: \"Base agent that orchestrates the full response.\"; }; .....'.\n@codebuff/evals typecheck: ../backend/src/templates/agents/archive/dry-run.ts(12,38): error TS2339: Property 'dry_run' does not exist on type '{ readonly base: { readonly displayName: \"Buffy the Enthusiastic Coding Assistant\"; readonly purpose: \"Base agent that orchestrates the full response.\"; }; readonly base_lite: { readonly displayName: \"Buffy the Enthusiastic Coding Assistant\"; readonly purpose: \"Base agent that orchestrates the full response.\"; }; .....'.\n@codebuff/evals typecheck: Exited with code 2\n", - "stderr": "$ bun --filter='*' run typecheck && echo '✅ All type checks passed!'\n", - "exitCode": 2 - } - } - ], - "parentAgentId": "D-47hYldaEo" - }, - { - "type": "tool_result", - "toolCallId": "9bc06224-f77d-4edf-9c40-d6d3986cfe64", - "toolName": "run_terminal_command", - "output": [ - { - "type": "json", - "value": { - "command": "bun run format", - "stdout": ".agents/ask.ts 516ms (unchanged)\n.agents/base-experimental.ts 5ms (unchanged)\n.agents/base-lite.ts 37ms (unchanged)\n.agents/base-max.ts 14ms (unchanged)\n.agents/base.ts 7ms (unchanged)\n.agents/brainstormer.ts 4ms (unchanged)\n.agents/changes-reviewer.ts 140ms (unchanged)\n.agents/charles.ts 3ms (unchanged)\n.agents/claude4-gemini-thinking.ts 7ms (unchanged)\n.agents/constants.ts 1ms (unchanged)\n.agents/examples/diff-reviewer-1.ts 2ms (unchanged)\n.agents/examples/diff-reviewer-2.ts 4ms (unchanged)\n.agents/examples/diff-reviewer-3.ts 5ms (unchanged)\n.agents/file-explorer.ts 5ms (unchanged)\n.agents/file-picker.ts 2ms (unchanged)\n.agents/git-committer.ts 3ms (unchanged)\n.agents/knowledge-keeper.ts 3ms (unchanged)\n.agents/opensource/base.ts 2ms (unchanged)\n.agents/opensource/coder.ts 3ms (unchanged)\n.agents/opensource/file-picker.ts 113ms (unchanged)\n.agents/opensource/researcher.ts 4ms (unchanged)\n.agents/opensource/reviewer.ts 23ms (unchanged)\n.agents/opensource/thinker.ts 6ms (unchanged)\n.agents/planner.ts 2ms (unchanged)\n.agents/researcher.ts 11ms (unchanged)\n.agents/reviewer.ts 6ms (unchanged)\n.agents/superagent.ts 2ms (unchanged)\n.agents/thinker.ts 9ms (unchanged)\n.agents/types/agent-definition.d.ts 53ms (unchanged)\n.agents/types/tools.d.ts 10ms (unchanged)\n.agents/your-custom-agent.ts 7ms (unchanged)\n.github/knowledge.md 239ms (unchanged)\n.infisical.json 99ms (unchanged)\n.vscode/settings.json 2ms (unchanged)\nauthentication.knowledge.md 12ms (unchanged)\nbackend/knowledge.md 18ms (unchanged)\nbackend/package.json 2ms (unchanged)\nbackend/README.md 5ms (unchanged)\nbackend/src/__tests__/agent-id-resolution.test.ts 150ms (unchanged)\nbackend/src/__tests__/agent-registry.test.ts 64ms (unchanged)\nbackend/src/__tests__/auto-topup.test.ts 23ms (unchanged)\nbackend/src/__tests__/credit-conversion.test.ts 9ms (unchanged)\nbackend/src/__tests__/fast-rewrite.test.ts 10ms (unchanged)\nbackend/src/__tests__/generate-diffs-prompt.test.ts 8ms (unchanged)\nbackend/src/__tests__/get-custom-file-picker-config.test.ts 10ms (unchanged)\nbackend/src/__tests__/live-user-inputs.test.ts 9ms (unchanged)\nbackend/src/__tests__/loop-agent-steps.test.ts 39ms (unchanged)\nbackend/src/__tests__/main-prompt.integration.test.ts 193ms (unchanged)\nbackend/src/__tests__/main-prompt.test.ts 173ms (unchanged)\nbackend/src/__tests__/process-file-block.test.ts 160ms (unchanged)\nbackend/src/__tests__/process-str-replace.test.ts 79ms (unchanged)\nbackend/src/__tests__/read-docs-tool.test.ts 35ms (unchanged)\nbackend/src/__tests__/request-files-prompt.test.ts 25ms (unchanged)\nbackend/src/__tests__/run-agent-step-tools.test.ts 202ms (unchanged)\nbackend/src/__tests__/run-programmatic-step.test.ts 331ms (unchanged)\nbackend/src/__tests__/sandbox-generator.test.ts 5ms (unchanged)\nbackend/src/__tests__/subagent-streaming.test.ts 15ms (unchanged)\nbackend/src/__tests__/test-utils.ts 4ms (unchanged)\nbackend/src/__tests__/tool-call-schema.test.ts 91ms (unchanged)\nbackend/src/__tests__/usage-calculation.test.ts 16ms (unchanged)\nbackend/src/__tests__/web-search-tool.test.ts 118ms (unchanged)\nbackend/src/__tests__/xml-stream-parser.test.ts 59ms (unchanged)\nbackend/src/admin/grade-runs.ts 9ms (unchanged)\nbackend/src/admin/relabelRuns.ts 125ms (unchanged)\nbackend/src/api/org.ts 7ms (unchanged)\nbackend/src/api/usage.ts 4ms (unchanged)\nbackend/src/async-agent-manager.ts 32ms (unchanged)\nbackend/src/check-terminal-command.ts 6ms (unchanged)\nbackend/src/context/app-context.ts 9ms (unchanged)\nbackend/src/fast-rewrite.ts 8ms (unchanged)\nbackend/src/find-files/check-new-files-necessary.ts 3ms (unchanged)\nbackend/src/find-files/custom-file-picker-config.ts 9ms (unchanged)\nbackend/src/find-files/request-files-prompt.ts 151ms (unchanged)\nbackend/src/generate-diffs-prompt.ts 19ms (unchanged)\nbackend/src/get-documentation-for-query.ts 21ms (unchanged)\nbackend/src/get-file-reading-updates.ts 8ms (unchanged)\nbackend/src/index.ts 11ms (unchanged)\nbackend/src/live-user-inputs.ts 10ms (unchanged)\nbackend/src/llm-apis/__tests__/linkup-api.test.ts 23ms (unchanged)\nbackend/src/llm-apis/claude.ts 2ms (unchanged)\nbackend/src/llm-apis/context7-api.ts 81ms (unchanged)\nbackend/src/llm-apis/gemini-with-fallbacks.ts 6ms (unchanged)\nbackend/src/llm-apis/knowledge.md 6ms (unchanged)\nbackend/src/llm-apis/linkup-api.ts 16ms (unchanged)\nbackend/src/llm-apis/message-cost-tracker.ts 66ms (unchanged)\nbackend/src/llm-apis/openai-api.ts 3ms (unchanged)\nbackend/src/llm-apis/openrouter.ts 2ms (unchanged)\nbackend/src/llm-apis/relace-api.ts 6ms (unchanged)\nbackend/src/llm-apis/vercel-ai-sdk/ai-sdk.ts 28ms (unchanged)\nbackend/src/llm-apis/vercel-ai-sdk/openrouter.ts 1ms (unchanged)\nbackend/src/llm-apis/vercel-ai-sdk/vertex-finetuned.ts 16ms (unchanged)\nbackend/src/loop-main-prompt.ts 2ms (unchanged)\nbackend/src/main-prompt.ts 17ms (unchanged)\nbackend/src/process-file-block.ts 11ms (unchanged)\nbackend/src/process-str-replace.ts 8ms (unchanged)\nbackend/src/prompt-agent-stream.ts 4ms (unchanged)\nbackend/src/run-agent-step.ts 47ms (unchanged)\nbackend/src/run-programmatic-step.ts 13ms (unchanged)\nbackend/src/system-prompt/agent-instructions.md 143ms (unchanged)\nbackend/src/system-prompt/prompts.ts 5ms (unchanged)\nbackend/src/system-prompt/save-agent-request.ts 3ms (unchanged)\nbackend/src/system-prompt/search-system-prompt.ts 5ms (unchanged)\nbackend/src/system-prompt/truncate-file-tree.ts 134ms (unchanged)\nbackend/src/templates/agent-list.ts 3ms (unchanged)\nbackend/src/templates/agent-registry.ts 11ms (unchanged)\nbackend/src/templates/agents/agent-builder.ts 6ms (unchanged)\nbackend/src/templates/agents/archive/dry-run.ts 4ms (unchanged)\nbackend/src/templates/agents/ask.ts 2ms (unchanged)\nbackend/src/templates/agents/base.ts 3ms (unchanged)\nbackend/src/templates/agents/file-explorer.ts 4ms (unchanged)\nbackend/src/templates/agents/file-picker.ts 1ms (unchanged)\nbackend/src/templates/agents/planner.ts 4ms (unchanged)\nbackend/src/templates/agents/researcher.ts 2ms (unchanged)\nbackend/src/templates/agents/reviewer.ts 3ms (unchanged)\nbackend/src/templates/agents/superagent.ts 2ms (unchanged)\nbackend/src/templates/agents/thinker.ts 3ms (unchanged)\nbackend/src/templates/agents/thinking-base.ts 2ms (unchanged)\nbackend/src/templates/ask-prompts.ts 4ms (unchanged)\nbackend/src/templates/base-prompts.ts 6ms (unchanged)\nbackend/src/templates/prompts.ts 3ms (unchanged)\nbackend/src/templates/README.md 149ms (unchanged)\nbackend/src/templates/strings.ts 18ms (unchanged)\nbackend/src/templates/types.ts 12ms (unchanged)\nbackend/src/tools/constants.ts 4ms (unchanged)\nbackend/src/tools/definitions/list.ts 7ms (unchanged)\nbackend/src/tools/definitions/tool-def-type.ts 1ms (unchanged)\nbackend/src/tools/definitions/tool/add-message.ts 3ms (unchanged)\nbackend/src/tools/definitions/tool/add-subgoal.ts 12ms (unchanged)\nbackend/src/tools/definitions/tool/browser-logs.ts 1ms (unchanged)\nbackend/src/tools/definitions/tool/code-search.ts 1ms (unchanged)\nbackend/src/tools/definitions/tool/create-plan.ts 1ms (unchanged)\nbackend/src/tools/definitions/tool/end-turn.ts 7ms (unchanged)\nbackend/src/tools/definitions/tool/find-files.ts 2ms (unchanged)\nbackend/src/tools/definitions/tool/read-docs.ts 2ms (unchanged)\nbackend/src/tools/definitions/tool/read-files.ts 19ms (unchanged)\nbackend/src/tools/definitions/tool/run-file-change-hooks.ts 10ms (unchanged)\nbackend/src/tools/definitions/tool/run-terminal-command.ts 3ms (unchanged)\nbackend/src/tools/definitions/tool/set-messages.ts 3ms (unchanged)\nbackend/src/tools/definitions/tool/set-output.ts 2ms (unchanged)\nbackend/src/tools/definitions/tool/spawn-agent-inline.ts 3ms (unchanged)\nbackend/src/tools/definitions/tool/spawn-agents-async.ts 2ms (unchanged)\nbackend/src/tools/definitions/tool/spawn-agents.ts 1ms (unchanged)\nbackend/src/tools/definitions/tool/str-replace.ts 1ms (unchanged)\nbackend/src/tools/definitions/tool/think-deeply.ts 3ms (unchanged)\nbackend/src/tools/definitions/tool/update-subgoal.ts 1ms (unchanged)\nbackend/src/tools/definitions/tool/web-search.ts 4ms (unchanged)\nbackend/src/tools/definitions/tool/write-file.ts 1ms (unchanged)\nbackend/src/tools/handlers/handler-function-type.ts 7ms (unchanged)\nbackend/src/tools/handlers/list.ts 1ms (unchanged)\nbackend/src/tools/handlers/tool/add-message.ts 6ms (unchanged)\nbackend/src/tools/handlers/tool/add-subgoal.ts 5ms (unchanged)\nbackend/src/tools/handlers/tool/browser-logs.ts 3ms (unchanged)\nbackend/src/tools/handlers/tool/code-search.ts 2ms (unchanged)\nbackend/src/tools/handlers/tool/create-plan.ts 8ms (unchanged)\nbackend/src/tools/handlers/tool/end-turn.ts 3ms (unchanged)\nbackend/src/tools/handlers/tool/find-files.ts 14ms (unchanged)\nbackend/src/tools/handlers/tool/read-docs.ts 5ms (unchanged)\nbackend/src/tools/handlers/tool/read-files.ts 5ms (unchanged)\nbackend/src/tools/handlers/tool/run-file-change-hooks.ts 2ms (unchanged)\nbackend/src/tools/handlers/tool/run-terminal-command.ts 3ms (unchanged)\nbackend/src/tools/handlers/tool/set-messages.ts 3ms (unchanged)\nbackend/src/tools/handlers/tool/set-output.ts 5ms (unchanged)\nbackend/src/tools/handlers/tool/spawn-agent-inline.ts 7ms (unchanged)\nbackend/src/tools/handlers/tool/spawn-agents-async.ts 12ms (unchanged)\nbackend/src/tools/handlers/tool/spawn-agents.ts 11ms (unchanged)\nbackend/src/tools/handlers/tool/str-replace.ts 4ms (unchanged)\nbackend/src/tools/handlers/tool/think-deeply.ts 2ms (unchanged)\nbackend/src/tools/handlers/tool/update-subgoal.ts 6ms (unchanged)\nbackend/src/tools/handlers/tool/web-search.ts 6ms (unchanged)\nbackend/src/tools/handlers/tool/write-file.ts 11ms (unchanged)\nbackend/src/tools/prompts.ts 4ms (unchanged)\nbackend/src/tools/stream-parser.ts 5ms (unchanged)\nbackend/src/tools/tool-executor.ts 85ms (unchanged)\nbackend/src/util/__tests__/messages.test.ts 43ms (unchanged)\nbackend/src/util/__tests__/object.test.ts 63ms (unchanged)\nbackend/src/util/__tests__/parse-tool-call-xml.test.ts 19ms (unchanged)\nbackend/src/util/__tests__/simplify-tool-results.test.ts 63ms (unchanged)\nbackend/src/util/__tests__/split-data.test.ts 42ms (unchanged)\nbackend/src/util/check-auth.ts 9ms (unchanged)\nbackend/src/util/debug.ts 3ms (unchanged)\nbackend/src/util/file-resolver.ts 6ms (unchanged)\nbackend/src/util/logger.ts 5ms (unchanged)\nbackend/src/util/messages.ts 12ms (unchanged)\nbackend/src/util/object.ts 2ms (unchanged)\nbackend/src/util/parse-tool-call-xml.ts 5ms (unchanged)\nbackend/src/util/quickjs-sandbox.ts 12ms (unchanged)\nbackend/src/util/simplify-tool-results.ts 2ms (unchanged)\nbackend/src/util/split-data.ts 9ms (unchanged)\nbackend/src/util/token-counter.ts 2ms (unchanged)\nbackend/src/websockets/auth.ts 10ms (unchanged)\nbackend/src/websockets/middleware.ts 46ms (unchanged)\nbackend/src/websockets/request-context.ts 12ms (unchanged)\nbackend/src/websockets/server.ts 6ms (unchanged)\nbackend/src/websockets/switchboard.ts 5ms (unchanged)\nbackend/src/websockets/websocket-action.ts 67ms (unchanged)\nbackend/src/xml-stream-parser.ts 9ms (unchanged)\nbackend/tsconfig.json 3ms (unchanged)\ncodebuff.json 4ms (unchanged)\ncommon/knowledge.md 5ms (unchanged)\ncommon/package.json 1ms (unchanged)\ncommon/src/__tests__/agent-validation.test.ts 126ms (unchanged)\ncommon/src/__tests__/dynamic-agent-template-schema.test.ts 9ms (unchanged)\ncommon/src/__tests__/handlesteps-parsing.test.ts 9ms (unchanged)\ncommon/src/actions.ts 9ms (unchanged)\ncommon/src/analytics.ts 7ms (unchanged)\ncommon/src/api-keys/constants.ts 1ms (unchanged)\ncommon/src/api-keys/crypto.ts 14ms (unchanged)\ncommon/src/browser-actions.ts 89ms (unchanged)\ncommon/src/constants.ts 18ms (unchanged)\ncommon/src/constants/agents.ts 6ms (unchanged)\ncommon/src/constants/analytics-events.ts 4ms (unchanged)\ncommon/src/constants/grant-priorities.ts 2ms (unchanged)\ncommon/src/db/drizzle.config.ts 1ms (unchanged)\ncommon/src/db/index.ts 2ms (unchanged)\ncommon/src/db/migrations/meta/_journal.json 3ms (unchanged)\ncommon/src/db/migrations/meta/0000_snapshot.json 8ms (unchanged)\ncommon/src/db/migrations/meta/0001_snapshot.json 3ms (unchanged)\ncommon/src/db/migrations/meta/0002_snapshot.json 17ms (unchanged)\ncommon/src/db/migrations/meta/0003_snapshot.json 8ms (unchanged)\ncommon/src/db/migrations/meta/0004_snapshot.json 10ms (unchanged)\ncommon/src/db/migrations/meta/0005_snapshot.json 7ms (unchanged)\ncommon/src/db/migrations/meta/0006_snapshot.json 57ms (unchanged)\ncommon/src/db/migrations/meta/0007_snapshot.json 9ms (unchanged)\ncommon/src/db/migrations/meta/0008_snapshot.json 5ms (unchanged)\ncommon/src/db/migrations/meta/0009_snapshot.json 6ms (unchanged)\ncommon/src/db/migrations/meta/0010_snapshot.json 4ms (unchanged)\ncommon/src/db/migrations/meta/0011_snapshot.json 5ms (unchanged)\ncommon/src/db/migrations/meta/0012_snapshot.json 4ms (unchanged)\ncommon/src/db/migrations/meta/0013_snapshot.json 68ms (unchanged)\ncommon/src/db/migrations/meta/0014_snapshot.json 10ms (unchanged)\ncommon/src/db/migrations/meta/0015_snapshot.json 20ms (unchanged)\ncommon/src/db/migrations/meta/0016_snapshot.json 19ms (unchanged)\ncommon/src/db/migrations/meta/0017_snapshot.json 80ms (unchanged)\ncommon/src/db/migrations/meta/0018_snapshot.json 31ms (unchanged)\ncommon/src/db/migrations/meta/0019_snapshot.json 31ms (unchanged)\ncommon/src/db/migrations/meta/0020_snapshot.json 50ms (unchanged)\ncommon/src/db/migrations/meta/0021_snapshot.json 24ms (unchanged)\ncommon/src/db/migrations/meta/0026_snapshot.json 23ms (unchanged)\ncommon/src/db/migrations/meta/0027_snapshot.json 84ms (unchanged)\ncommon/src/db/migrations/meta/0028_snapshot.json 33ms (unchanged)\ncommon/src/db/schema.knowledge.md 14ms (unchanged)\ncommon/src/db/schema.ts 251ms (unchanged)\ncommon/src/db/transaction.ts 10ms (unchanged)\ncommon/src/json-config/__tests__/constants.test.ts 10ms (unchanged)\ncommon/src/json-config/__tests__/stringify-schema.test.ts 3ms (unchanged)\ncommon/src/json-config/constants.ts 6ms (unchanged)\ncommon/src/json-config/default.ts 1ms (unchanged)\ncommon/src/json-config/stringify-schema.ts 10ms (unchanged)\ncommon/src/project-file-tree.ts 14ms (unchanged)\ncommon/src/templates/agent-validation.ts 56ms (unchanged)\ncommon/src/templates/dynamic-agent-functions.ts 4ms (unchanged)\ncommon/src/testing/mock-modules.ts 6ms (unchanged)\ncommon/src/tools/compile-tool-definitions.ts 6ms (unchanged)\ncommon/src/tools/constants.ts 3ms (unchanged)\ncommon/src/tools/list.ts 9ms (unchanged)\ncommon/src/tools/params/tool/add-message.ts 2ms (unchanged)\ncommon/src/tools/params/tool/add-subgoal.ts 1ms (unchanged)\ncommon/src/tools/params/tool/browser-logs.ts 9ms (unchanged)\ncommon/src/tools/params/tool/code-search.ts 5ms (unchanged)\ncommon/src/tools/params/tool/create-plan.ts 3ms (unchanged)\ncommon/src/tools/params/tool/end-turn.ts 1ms (unchanged)\ncommon/src/tools/params/tool/find-files.ts 4ms (unchanged)\ncommon/src/tools/params/tool/read-docs.ts 4ms (unchanged)\ncommon/src/tools/params/tool/read-files.ts 4ms (unchanged)\ncommon/src/tools/params/tool/run-file-change-hooks.ts 1ms (unchanged)\ncommon/src/tools/params/tool/run-terminal-command.ts 2ms (unchanged)\ncommon/src/tools/params/tool/set-messages.ts 3ms (unchanged)\ncommon/src/tools/params/tool/set-output.ts 1ms (unchanged)\ncommon/src/tools/params/tool/spawn-agent-inline.ts 5ms (unchanged)\ncommon/src/tools/params/tool/spawn-agents-async.ts 7ms (unchanged)\ncommon/src/tools/params/tool/spawn-agents.ts 5ms (unchanged)\ncommon/src/tools/params/tool/str-replace.ts 2ms (unchanged)\ncommon/src/tools/params/tool/think-deeply.ts 3ms (unchanged)\ncommon/src/tools/params/tool/update-subgoal.ts 4ms (unchanged)\ncommon/src/tools/params/tool/web-search.ts 23ms (unchanged)\ncommon/src/tools/params/tool/write-file.ts 3ms (unchanged)\ncommon/src/tools/utils.ts 4ms (unchanged)\ncommon/src/types/__tests__/dynamic-agent-template.test.ts 3ms (unchanged)\ncommon/src/types/agent-template.ts 11ms (unchanged)\ncommon/src/types/api/agents/publish.ts 6ms (unchanged)\ncommon/src/types/bun-test.d.ts 1ms (unchanged)\ncommon/src/types/dynamic-agent-template.ts 14ms (unchanged)\ncommon/src/types/grant.ts 2ms (unchanged)\ncommon/src/types/message.ts 3ms (unchanged)\ncommon/src/types/organization.ts 5ms (unchanged)\ncommon/src/types/print-mode.ts 4ms (unchanged)\ncommon/src/types/publisher.ts 4ms (unchanged)\ncommon/src/types/referral.ts 1ms (unchanged)\ncommon/src/types/session-state.ts 52ms (unchanged)\ncommon/src/types/usage.ts 3ms (unchanged)\ncommon/src/util/__tests__/messages.test.ts 5ms (unchanged)\ncommon/src/util/__tests__/partial-json-delta.test.ts 39ms (unchanged)\ncommon/src/util/__tests__/saxy.test.ts 90ms (unchanged)\ncommon/src/util/__tests__/string.test.ts 39ms (unchanged)\ncommon/src/util/agent-file-utils.ts 13ms (unchanged)\ncommon/src/util/agent-name-normalization.ts 2ms (unchanged)\ncommon/src/util/agent-name-resolver.ts 7ms (unchanged)\ncommon/src/util/agent-template-validation.ts 5ms (unchanged)\ncommon/src/util/array.ts 3ms (unchanged)\ncommon/src/util/changes.ts 5ms (unchanged)\ncommon/src/util/credentials.ts 10ms (unchanged)\ncommon/src/util/currency.ts 2ms (unchanged)\ncommon/src/util/dates.ts 1ms (unchanged)\ncommon/src/util/error.ts 2ms (unchanged)\ncommon/src/util/examples/diff-reviewer-1.ts 1ms (unchanged)\ncommon/src/util/examples/diff-reviewer-2.ts 2ms (unchanged)\ncommon/src/util/examples/diff-reviewer-3.ts 4ms (unchanged)\ncommon/src/util/file.ts 17ms (unchanged)\ncommon/src/util/git.ts 2ms (unchanged)\ncommon/src/util/logger.ts 10ms (unchanged)\ncommon/src/util/lru-cache.ts 9ms (unchanged)\ncommon/src/util/messages.ts 14ms (unchanged)\ncommon/src/util/min-heap.ts 8ms (unchanged)\ncommon/src/util/model-utils.ts 3ms (unchanged)\ncommon/src/util/object.ts 8ms (unchanged)\ncommon/src/util/partial-json-delta.ts 8ms (unchanged)\ncommon/src/util/patch.ts 50ms (unchanged)\ncommon/src/util/promise.ts 6ms (unchanged)\ncommon/src/util/random.ts 3ms (unchanged)\ncommon/src/util/referral.ts 2ms (unchanged)\ncommon/src/util/saxy.ts 110ms (unchanged)\ncommon/src/util/string.knowledge.md 10ms (unchanged)\ncommon/src/util/string.ts 28ms (unchanged)\ncommon/src/util/stripe.ts 3ms (unchanged)\ncommon/src/util/sync-failure.ts 4ms (unchanged)\ncommon/src/util/types/agent-definition.d.ts 7ms (unchanged)\ncommon/src/util/types/tools.d.ts 3ms (unchanged)\ncommon/src/util/xml.ts 5ms (unchanged)\ncommon/src/util/zod-schema.ts 4ms (unchanged)\ncommon/src/websockets/websocket-client.ts 72ms (unchanged)\ncommon/src/websockets/websocket-schema.ts 2ms (unchanged)\ncommon/tsconfig.json 0ms (unchanged)\nevals/constants.ts 2ms (unchanged)\nevals/e2e-cat-app-script.ts 96ms (unchanged)\nevals/git-evals/email-eval-results.ts 9ms (unchanged)\nevals/git-evals/eval-codebuff.json 444ms (unchanged)\nevals/git-evals/eval-manifold.json 202ms (unchanged)\nevals/git-evals/eval-result-codebuff-mock.json 190ms (unchanged)\nevals/git-evals/gen-evals.ts 17ms (unchanged)\nevals/git-evals/judge-git-eval.ts 6ms (unchanged)\nevals/git-evals/post-eval-analysis.ts 13ms (unchanged)\nevals/git-evals/run-eval-set.ts 31ms (unchanged)\nevals/git-evals/run-git-evals.ts 26ms (unchanged)\nevals/git-evals/run-single-eval-process.ts 4ms (unchanged)\nevals/git-evals/run-single-eval.ts 13ms (unchanged)\nevals/git-evals/setup-test-repo.ts 8ms (unchanged)\nevals/git-evals/types.ts 5ms (unchanged)\nevals/knowledge.md 3ms (unchanged)\nevals/package.json 0ms (unchanged)\nevals/scaffolding.ts 18ms (unchanged)\nevals/swe-bench-eval.ts 12ms (unchanged)\nevals/swe-bench-ids.ts 6ms (unchanged)\nevals/swe-bench.test.ts 4ms (unchanged)\nevals/test-repos.json 7ms (unchanged)\nevals/test-setup.ts 10ms (unchanged)\nevals/tsconfig.json 1ms (unchanged)\nknowledge.md 83ms (unchanged)\nnpm-app/package.json 1ms (unchanged)\nnpm-app/release-staging/package.json 0ms (unchanged)\nnpm-app/release-staging/README.md 16ms (unchanged)\nnpm-app/release/package.json 0ms (unchanged)\nnpm-app/release/README.md 8ms (unchanged)\nnpm-app/scripts/generate-github-token.ts 13ms (unchanged)\nnpm-app/scripts/patch-web-tree-sitter.ts 8ms (unchanged)\nnpm-app/src/__tests__/display.test.ts 13ms (unchanged)\nnpm-app/src/__tests__/tool-handlers.test.ts 5ms (unchanged)\nnpm-app/src/agents/agent-utils.ts 4ms (unchanged)\nnpm-app/src/agents/load-agents.ts 8ms (unchanged)\nnpm-app/src/background-process-manager.ts 16ms (unchanged)\nnpm-app/src/browser-runner.ts 33ms (unchanged)\nnpm-app/src/chat-storage.ts 5ms (unchanged)\nnpm-app/src/checkpoints/checkpoint-manager.ts 20ms (unchanged)\nnpm-app/src/checkpoints/file-manager.ts 53ms (unchanged)\nnpm-app/src/cli-definitions.ts 7ms (unchanged)\nnpm-app/src/cli-handlers/agent-creation-chat.ts 30ms (unchanged)\nnpm-app/src/cli-handlers/agents.ts 34ms (unchanged)\nnpm-app/src/cli-handlers/api-key.ts 4ms (unchanged)\nnpm-app/src/cli-handlers/checkpoint.ts 17ms (unchanged)\nnpm-app/src/cli-handlers/diff.ts 5ms (unchanged)\nnpm-app/src/cli-handlers/easter-egg.ts 7ms (unchanged)\nnpm-app/src/cli-handlers/inititalization-flow.ts 4ms (unchanged)\nnpm-app/src/cli-handlers/mini-chat.ts 14ms (unchanged)\nnpm-app/src/cli-handlers/publish.ts 6ms (unchanged)\nnpm-app/src/cli-handlers/subagent-list.ts 11ms (unchanged)\nnpm-app/src/cli-handlers/subagent.ts 36ms (unchanged)\nnpm-app/src/cli.ts 75ms (unchanged)\nnpm-app/src/client.ts 96ms (unchanged)\nnpm-app/src/config.ts 3ms (unchanged)\nnpm-app/src/create-template-project.ts 8ms (unchanged)\nnpm-app/src/credentials.ts 4ms (unchanged)\nnpm-app/src/dev-process-manager.ts 3ms (unchanged)\nnpm-app/src/diff-manager.ts 13ms (unchanged)\nnpm-app/src/display/overrides.ts 1ms (unchanged)\nnpm-app/src/display/print-mode.ts 4ms (unchanged)\nnpm-app/src/display/squash-newlines.ts 15ms (unchanged)\nnpm-app/src/fingerprint.ts 3ms (unchanged)\nnpm-app/src/index.ts 10ms (unchanged)\nnpm-app/src/json-config/hooks.ts 4ms (unchanged)\nnpm-app/src/json-config/parser.ts 4ms (unchanged)\nnpm-app/src/menu.ts 14ms (unchanged)\nnpm-app/src/native/ripgrep.ts 4ms (unchanged)\nnpm-app/src/project-files.ts 70ms (unchanged)\nnpm-app/src/rage-detectors.ts 4ms (unchanged)\nnpm-app/src/startup-process-handler.ts 3ms (unchanged)\nnpm-app/src/subagent-storage.ts 10ms (unchanged)\nnpm-app/src/terminal/background.ts 7ms (unchanged)\nnpm-app/src/terminal/run-command.ts 15ms (unchanged)\nnpm-app/src/tool-handlers.ts 12ms (unchanged)\nnpm-app/src/types.ts 2ms (unchanged)\nnpm-app/src/utils/__tests__/background-process-manager.test.ts 13ms (unchanged)\nnpm-app/src/utils/__tests__/rage-detector.test.ts 20ms (unchanged)\nnpm-app/src/utils/__tests__/tool-renderers.test.ts 3ms (unchanged)\nnpm-app/src/utils/__tests__/xml-stream-parser.test.ts 18ms (unchanged)\nnpm-app/src/utils/agent-validation.ts 6ms (unchanged)\nnpm-app/src/utils/analytics.ts 6ms (unchanged)\nnpm-app/src/utils/detect-shell.ts 4ms (unchanged)\nnpm-app/src/utils/git.ts 7ms (unchanged)\nnpm-app/src/utils/logger.ts 9ms (unchanged)\nnpm-app/src/utils/rage-detector.ts 8ms (unchanged)\nnpm-app/src/utils/spinner.ts 6ms (unchanged)\nnpm-app/src/utils/suppress-console.ts 8ms (unchanged)\nnpm-app/src/utils/system-info.ts 3ms (unchanged)\nnpm-app/src/utils/terminal.ts 2ms (unchanged)\nnpm-app/src/utils/tool-renderers.ts 10ms (unchanged)\nnpm-app/src/utils/with-hang-detection.ts 2ms (unchanged)\nnpm-app/src/utils/xml-stream-parser.ts 7ms (unchanged)\nnpm-app/src/web-scraper.ts 3ms (unchanged)\nnpm-app/src/workers/checkpoint-worker.ts 6ms (unchanged)\nnpm-app/src/workers/project-context.ts 1ms (unchanged)\nnpm-app/tsconfig.json 1ms (unchanged)\npackage.json 0ms (unchanged)\npackages/bigquery/knowledge.md 6ms (unchanged)\npackages/bigquery/package.json 0ms (unchanged)\npackages/bigquery/src/client.ts 10ms (unchanged)\npackages/bigquery/src/index.ts 1ms (unchanged)\npackages/bigquery/src/schema.ts 3ms (unchanged)\npackages/bigquery/tsconfig.json 1ms (unchanged)\npackages/billing/knowledge.md 3ms (unchanged)\npackages/billing/package.json 3ms (unchanged)\npackages/billing/project.json 0ms (unchanged)\npackages/billing/src/__tests__/credit-delegation.test.ts 7ms (unchanged)\npackages/billing/src/__tests__/extract-owner-repo.test.ts 9ms (unchanged)\npackages/billing/src/__tests__/org-billing.test.ts 12ms (unchanged)\npackages/billing/src/auto-topup.ts 12ms (unchanged)\npackages/billing/src/balance-calculator.ts 8ms (unchanged)\npackages/billing/src/billing.knowledge.md 7ms (unchanged)\npackages/billing/src/conversion.ts 1ms (unchanged)\npackages/billing/src/credit-delegation.ts 7ms (unchanged)\npackages/billing/src/grant-credits.knowledge.md 3ms (unchanged)\npackages/billing/src/grant-credits.ts 12ms (unchanged)\npackages/billing/src/index.ts 1ms (unchanged)\npackages/billing/src/org-billing.ts 16ms (unchanged)\npackages/billing/src/org-monitoring.ts 7ms (unchanged)\npackages/billing/src/usage-service.ts 10ms (unchanged)\npackages/billing/src/utils.ts 2ms (unchanged)\npackages/billing/tsconfig.json 1ms (unchanged)\npackages/build-tools/executors.json 1ms (unchanged)\npackages/build-tools/executors/infisical-run/executor.ts 2ms (unchanged)\npackages/build-tools/executors/infisical-run/schema.json 1ms (unchanged)\npackages/build-tools/package.json 1ms (unchanged)\npackages/build-tools/project.json 1ms (unchanged)\npackages/build-tools/tsconfig.json 1ms (unchanged)\npackages/code-map/__tests__/languages.test.ts 7ms (unchanged)\npackages/code-map/__tests__/parse.test.ts 4ms (unchanged)\npackages/code-map/__tests__/test-langs/test.ts 3ms (unchanged)\npackages/code-map/package.json 0ms (unchanged)\npackages/code-map/src/index.ts 0ms (unchanged)\npackages/code-map/src/languages.ts 6ms (unchanged)\npackages/code-map/src/parse.ts 6ms (unchanged)\npackages/code-map/src/tree-sitter-queries/readme.md 5ms (unchanged)\npackages/code-map/src/types.d.ts 1ms (unchanged)\npackages/code-map/tsconfig.json 0ms (unchanged)\npackages/internal/package.json 1ms (unchanged)\npackages/internal/src/env.ts 10ms (unchanged)\npackages/internal/src/index.ts 2ms (unchanged)\npackages/internal/src/knowledge.md 6ms (unchanged)\npackages/internal/src/loops/client.ts 4ms (unchanged)\npackages/internal/src/loops/index.ts 1ms (unchanged)\npackages/internal/src/loops/types.ts 1ms (unchanged)\npackages/internal/src/openrouter-ai-sdk/convert-to-openrouter-chat-messages.test.ts 8ms (unchanged)\npackages/internal/src/openrouter-ai-sdk/convert-to-openrouter-chat-messages.ts 10ms (unchanged)\npackages/internal/src/openrouter-ai-sdk/convert-to-openrouter-completion-prompt.ts 6ms (unchanged)\npackages/internal/src/openrouter-ai-sdk/index.ts 0ms (unchanged)\npackages/internal/src/openrouter-ai-sdk/internal/index.ts 0ms (unchanged)\npackages/internal/src/openrouter-ai-sdk/map-openrouter-chat-logprobs.ts 2ms (unchanged)\npackages/internal/src/openrouter-ai-sdk/map-openrouter-completion-logprobs.ts 1ms (unchanged)\npackages/internal/src/openrouter-ai-sdk/map-openrouter-finish-reason.ts 2ms (unchanged)\npackages/internal/src/openrouter-ai-sdk/openrouter-chat-language-model.test.ts 17ms (unchanged)\npackages/internal/src/openrouter-ai-sdk/openrouter-chat-language-model.ts 33ms (unchanged)\npackages/internal/src/openrouter-ai-sdk/openrouter-completion-language-model.test.ts 14ms (unchanged)\npackages/internal/src/openrouter-ai-sdk/openrouter-completion-language-model.ts 11ms (unchanged)\npackages/internal/src/openrouter-ai-sdk/openrouter-completion-settings.ts 1ms (unchanged)\npackages/internal/src/openrouter-ai-sdk/openrouter-error.ts 2ms (unchanged)\npackages/internal/src/openrouter-ai-sdk/openrouter-facade.ts 4ms (unchanged)\npackages/internal/src/openrouter-ai-sdk/openrouter-provider-options.test.ts 2ms (unchanged)\npackages/internal/src/openrouter-ai-sdk/openrouter-provider.ts 4ms (unchanged)\npackages/internal/src/openrouter-ai-sdk/openrouter-stream-usage-accounting.test.ts 4ms (unchanged)\npackages/internal/src/openrouter-ai-sdk/openrouter-usage-accounting.test.ts 5ms (unchanged)\npackages/internal/src/openrouter-ai-sdk/schemas/reasoning-details.ts 4ms (unchanged)\npackages/internal/src/openrouter-ai-sdk/types/index.ts 1ms (unchanged)\npackages/internal/src/openrouter-ai-sdk/types/openrouter-chat-completions-input.ts 2ms (unchanged)\npackages/internal/src/openrouter-ai-sdk/types/openrouter-chat-settings.ts 1ms (unchanged)\npackages/internal/src/utils/__tests__/version-utils.test.ts 8ms (unchanged)\npackages/internal/src/utils/auth.ts 5ms (unchanged)\npackages/internal/src/utils/version-utils.ts 4ms (unchanged)\npackages/internal/src/utils/xml-parser.ts 4ms (unchanged)\npackages/internal/tsconfig.json 0ms (unchanged)\npython-app/knowledge.md 3ms (unchanged)\npython-app/README.md 2ms (unchanged)\nREADME.md 16ms (unchanged)\nscripts/analyze-edit-blocks.ts 3ms (unchanged)\nscripts/analyze-model-usage.ts 3ms (unchanged)\nscripts/apply-credit-migration.ts 2ms (unchanged)\nscripts/calculate-average-spend.ts 10ms (unchanged)\nscripts/calculate-dau.ts 2ms (unchanged)\nscripts/calculate-monthly-usage.ts 5ms (unchanged)\nscripts/calculate-mrr.ts 3ms (unchanged)\nscripts/calculate-weekly-usage.ts 3ms (unchanged)\nscripts/changelog/docs.json 0ms (unchanged)\nscripts/convert-escaped-newlines.ts 4ms (unchanged)\nscripts/count-edit-file.ts 6ms (unchanged)\nscripts/debug-log-subset.ts 3ms (unchanged)\nscripts/export-user-emails.ts 2ms (unchanged)\nscripts/ft-file-selection/collect-tuning-data.ts 13ms (unchanged)\nscripts/ft-file-selection/grade-traces.ts 3ms (unchanged)\nscripts/ft-file-selection/print-recent-relabels.ts 1ms (unchanged)\nscripts/ft-file-selection/print-recent-traces.ts 3ms (unchanged)\nscripts/ft-file-selection/README.md 29ms (unchanged)\nscripts/ft-file-selection/relabel-for-offline-scoring.ts 17ms (unchanged)\nscripts/ft-file-selection/relabel-traces-with-context.ts 3ms (unchanged)\nscripts/ft-file-selection/relabel-traces.ts 5ms (unchanged)\nscripts/generate-tool-definitions.ts 2ms (unchanged)\nscripts/get-changelog.ts 19ms (unchanged)\nscripts/init-worktree.ts 22ms (unchanged)\nscripts/package.json 1ms (unchanged)\nscripts/tsconfig.json 1ms (unchanged)\nscripts/update-stripe-subscriptions.ts 10ms (unchanged)\nsdk/CHANGELOG.md 14ms (unchanged)\nsdk/package.json 1ms (unchanged)\nsdk/PUBLISHING.md 7ms (unchanged)\nsdk/README.md 10ms (unchanged)\nsdk/src/client.ts 12ms (unchanged)\nsdk/src/constants.ts 1ms (unchanged)\nsdk/src/index.ts 1ms (unchanged)\nsdk/src/process-stream.ts 3ms (unchanged)\nsdk/src/tools/change-file.ts 5ms (unchanged)\nsdk/src/tools/read-files.ts 5ms (unchanged)\nsdk/src/types/agent-definition.ts 8ms (unchanged)\nsdk/src/types/tools.ts 7ms (unchanged)\nsdk/src/websocket-client.ts 15ms (unchanged)\nsdk/tsconfig.json 1ms (unchanged)\ntsconfig.base.json 1ms (unchanged)\ntsconfig.json 1ms (unchanged)\nweb/components.json 1ms (unchanged)\nweb/contentlayer.config.ts 5ms (unchanged)\nweb/knowledge.md 30ms (unchanged)\nweb/package.json 3ms (unchanged)\nweb/playwright.config.ts 1ms (unchanged)\nweb/README.md 7ms (unchanged)\nweb/scripts/discord/index.ts 1ms (unchanged)\nweb/scripts/discord/register-commands.ts 1ms (unchanged)\nweb/src/__tests__/e2e/home.spec.ts 2ms (unchanged)\nweb/src/__tests__/unit/home.spec.tsx 8ms (unchanged)\nweb/src/actions/hello-action.ts 2ms (unchanged)\nweb/src/app/[sponsee]/page.tsx 7ms (unchanged)\nweb/src/app/admin/file-picker/page.tsx 19ms (unchanged)\nweb/src/app/admin/layout.tsx 3ms (unchanged)\nweb/src/app/admin/orgs/page.tsx 11ms (unchanged)\nweb/src/app/admin/traces/components/chat-message.tsx 5ms (unchanged)\nweb/src/app/admin/traces/components/client-session-viewer.tsx 6ms (unchanged)\nweb/src/app/admin/traces/components/empty-state.tsx 1ms (unchanged)\nweb/src/app/admin/traces/components/error-boundary.tsx 3ms (unchanged)\nweb/src/app/admin/traces/components/loading-skeletons.tsx 3ms (unchanged)\nweb/src/app/admin/traces/components/timeline-chart.tsx 18ms (unchanged)\nweb/src/app/admin/traces/components/trace-viewer.tsx 7ms (unchanged)\nweb/src/app/admin/traces/page.tsx 4ms (unchanged)\nweb/src/app/admin/traces/utils/__tests__/trace-processing.test.ts 5ms (unchanged)\nweb/src/app/admin/traces/utils/trace-processing.ts 17ms (unchanged)\nweb/src/app/affiliates/actions.ts 4ms (unchanged)\nweb/src/app/affiliates/page.tsx 6ms (unchanged)\nweb/src/app/agents/page.tsx 8ms (unchanged)\nweb/src/app/analytics.knowledge.md 33ms (unchanged)\nweb/src/app/api/admin/admin-auth.ts 2ms (unchanged)\nweb/src/app/api/admin/orgs/[orgId]/features/[feature]/route.ts 4ms (unchanged)\nweb/src/app/api/admin/orgs/export/route.ts 63ms (unchanged)\nweb/src/app/api/admin/orgs/route.ts 5ms (unchanged)\nweb/src/app/api/admin/relabel-for-user/route.ts 5ms (unchanged)\nweb/src/app/api/admin/traces/[clientRequestId]/messages/route.ts 7ms (unchanged)\nweb/src/app/api/admin/traces/[clientRequestId]/timeline/route.ts 8ms (unchanged)\nweb/src/app/api/admin/traces/client/[clientId]/sessions/route.ts 6ms (unchanged)\nweb/src/app/api/agents/[publisherId]/[agentId]/[version]/route.ts 3ms (unchanged)\nweb/src/app/api/agents/[publisherId]/[agentId]/latest/route.ts 4ms (unchanged)\nweb/src/app/api/agents/publish/route.ts 10ms (unchanged)\nweb/src/app/api/agents/route.ts 3ms (unchanged)\nweb/src/app/api/agents/validate/route.ts 7ms (unchanged)\nweb/src/app/api/api-keys/route.ts 8ms (unchanged)\nweb/src/app/api/auth/[...nextauth]/auth-options.ts 8ms (unchanged)\nweb/src/app/api/auth/[...nextauth]/route.ts 8ms (unchanged)\nweb/src/app/api/auth/cli/code/route.ts 133ms (unchanged)\nweb/src/app/api/auth/cli/logout/route.ts 4ms (unchanged)\nweb/src/app/api/auth/cli/status/route.ts 4ms (unchanged)\nweb/src/app/api/feed/route.ts 2ms (unchanged)\nweb/src/app/api/git-evals/route.ts 15ms (unchanged)\nweb/src/app/api/git-evals/visibility/route.ts 4ms (unchanged)\nweb/src/app/api/healthz/route.ts 1ms (unchanged)\nweb/src/app/api/invites/[token]/route.ts 181ms (unchanged)\nweb/src/app/api/orgs/[orgId]/alerts/[alertId]/dismiss/route.ts 13ms (unchanged)\nweb/src/app/api/orgs/[orgId]/alerts/route.ts 6ms (unchanged)\nweb/src/app/api/orgs/[orgId]/analytics/export/route.ts 5ms (unchanged)\nweb/src/app/api/orgs/[orgId]/analytics/route.ts 15ms (unchanged)\nweb/src/app/api/orgs/[orgId]/billing/setup/route.ts 9ms (unchanged)\nweb/src/app/api/orgs/[orgId]/billing/status/route.ts 3ms (unchanged)\nweb/src/app/api/orgs/[orgId]/billing/subscription/route.ts 6ms (unchanged)\nweb/src/app/api/orgs/[orgId]/credits/route.ts 19ms (unchanged)\nweb/src/app/api/orgs/[orgId]/invitations/[email]/resend/route.ts 5ms (unchanged)\nweb/src/app/api/orgs/[orgId]/invitations/[email]/route.ts 12ms (unchanged)\nweb/src/app/api/orgs/[orgId]/invitations/bulk/route.ts 6ms (unchanged)\nweb/src/app/api/orgs/[orgId]/invitations/route.ts 4ms (unchanged)\nweb/src/app/api/orgs/[orgId]/members/[userId]/route.ts 14ms (unchanged)\nweb/src/app/api/orgs/[orgId]/members/route.ts 9ms (unchanged)\nweb/src/app/api/orgs/[orgId]/monitoring/route.ts 10ms (unchanged)\nweb/src/app/api/orgs/[orgId]/publishers/route.ts 16ms (unchanged)\nweb/src/app/api/orgs/[orgId]/repos/[repoId]/route.ts 9ms (unchanged)\nweb/src/app/api/orgs/[orgId]/repos/route.ts 5ms (unchanged)\nweb/src/app/api/orgs/[orgId]/route.ts 25ms (unchanged)\nweb/src/app/api/orgs/[orgId]/settings/route.ts 36ms (unchanged)\nweb/src/app/api/orgs/[orgId]/usage/export/route.ts 10ms (unchanged)\nweb/src/app/api/orgs/[orgId]/usage/route.ts 48ms (unchanged)\nweb/src/app/api/orgs/route.ts 43ms (unchanged)\nweb/src/app/api/orgs/slug/[slug]/route.ts 4ms (unchanged)\nweb/src/app/api/publishers/[id]/organization/route.ts 7ms (unchanged)\nweb/src/app/api/publishers/route.ts 9ms (unchanged)\nweb/src/app/api/publishers/validate/route.ts 3ms (unchanged)\nweb/src/app/api/referrals/[code]/route.ts 6ms (unchanged)\nweb/src/app/api/referrals/helpers.ts 145ms (unchanged)\nweb/src/app/api/referrals/route.ts 16ms (unchanged)\nweb/src/app/api/stripe/buy-credits/route.ts 6ms (unchanged)\nweb/src/app/api/stripe/webhook/route.ts 30ms (unchanged)\nweb/src/app/api/upload/avatar/route.ts 5ms (unchanged)\nweb/src/app/api/user/auto-topup/route.ts 5ms (unchanged)\nweb/src/app/api/user/profile/route.ts 5ms (unchanged)\nweb/src/app/api/user/usage/route.ts 6ms (unchanged)\nweb/src/app/config/page.tsx 1ms (unchanged)\nweb/src/app/docs/[category]/layout.tsx 1ms (unchanged)\nweb/src/app/docs/[category]/metadata.ts 6ms (unchanged)\nweb/src/app/docs/[category]/page.tsx 8ms (unchanged)\nweb/src/app/docs/layout.tsx 5ms (unchanged)\nweb/src/app/docs/page.tsx 1ms (unchanged)\nweb/src/app/evals/evals-table.tsx 20ms (unchanged)\nweb/src/app/evals/page.tsx 3ms (unchanged)\nweb/src/app/invites/[token]/page.tsx 101ms (unchanged)\nweb/src/app/layout.tsx 6ms (unchanged)\nweb/src/app/login/page.tsx 3ms (unchanged)\nweb/src/app/onboard/page.tsx 10ms (unchanged)\nweb/src/app/orgs/[slug]/analytics/page.tsx 50ms (unchanged)\nweb/src/app/orgs/[slug]/billing/purchase/page.tsx 13ms (unchanged)\nweb/src/app/orgs/[slug]/billing/setup/page.tsx 20ms (unchanged)\nweb/src/app/orgs/[slug]/page.tsx 52ms (unchanged)\nweb/src/app/orgs/[slug]/repositories/page.tsx 5ms (unchanged)\nweb/src/app/orgs/[slug]/settings/page.tsx 11ms (unchanged)\nweb/src/app/orgs/[slug]/team/page.tsx 4ms (unchanged)\nweb/src/app/orgs/[slug]/usage/page.tsx 10ms (unchanged)\nweb/src/app/orgs/new/page.tsx 13ms (unchanged)\nweb/src/app/orgs/page.tsx 31ms (unchanged)\nweb/src/app/page.tsx 17ms (unchanged)\nweb/src/app/payment-success/page.tsx 10ms (unchanged)\nweb/src/app/pricing/page.tsx 10ms (unchanged)\nweb/src/app/privacy-policy/page.tsx 17ms (unchanged)\nweb/src/app/publishers/[id]/agents/[agentId]/[version]/page.tsx 12ms (unchanged)\nweb/src/app/publishers/[id]/page.tsx 55ms (unchanged)\nweb/src/app/publishers/new/page.tsx 33ms (unchanged)\nweb/src/app/publishers/page.tsx 22ms (unchanged)\nweb/src/app/referrals/[code]/metadata.ts 3ms (unchanged)\nweb/src/app/referrals/[code]/page.tsx 7ms (unchanged)\nweb/src/app/referrals/layout.tsx 3ms (unchanged)\nweb/src/app/referrals/page.tsx 11ms (unchanged)\nweb/src/app/robots.ts 2ms (unchanged)\nweb/src/app/sitemap.ts 2ms (unchanged)\nweb/src/app/terms-of-service/page.tsx 22ms (unchanged)\nweb/src/app/usage/layout.tsx 2ms (unchanged)\nweb/src/app/usage/page.tsx 13ms (unchanged)\nweb/src/app/usage/usage-display.tsx 36ms (unchanged)\nweb/src/components/agent/json-viewer.tsx 2ms (unchanged)\nweb/src/components/auto-topup/AutoTopupSettings.tsx 2ms (unchanged)\nweb/src/components/auto-topup/AutoTopupSettingsForm.tsx 5ms (unchanged)\nweb/src/components/auto-topup/AutoTopupSwitch.tsx 1ms (unchanged)\nweb/src/components/auto-topup/BaseAutoTopupSettings.tsx 2ms (unchanged)\nweb/src/components/auto-topup/BaseAutoTopupSettingsForm.tsx 6ms (unchanged)\nweb/src/components/auto-topup/BaseAutoTopupSwitch.tsx 16ms (unchanged)\nweb/src/components/auto-topup/constants.ts 1ms (unchanged)\nweb/src/components/auto-topup/OrgAutoTopupSettings.tsx 3ms (unchanged)\nweb/src/components/auto-topup/OrgAutoTopupSettingsForm.tsx 4ms (unchanged)\nweb/src/components/auto-topup/OrgAutoTopupSwitch.tsx 1ms (unchanged)\nweb/src/components/auto-topup/types.ts 3ms (unchanged)\nweb/src/components/BrowserPreview.tsx 6ms (unchanged)\nweb/src/components/card-with-beams.tsx 3ms (unchanged)\nweb/src/components/CookieConsentCard.tsx 5ms (unchanged)\nweb/src/components/credits/CreditManagementSection.tsx 3ms (unchanged)\nweb/src/components/credits/CreditPurchaseSection.tsx 4ms (unchanged)\nweb/src/components/docs/copy-heading.tsx 12ms (unchanged)\nweb/src/components/docs/doc-sidebar.tsx 5ms (unchanged)\nweb/src/components/docs/docs.knowledge.md 100ms (unchanged)\nweb/src/components/docs/mdx/code-demo.tsx 5ms (unchanged)\nweb/src/components/docs/mdx/custom-link.tsx 3ms (unchanged)\nweb/src/components/docs/mdx/markdown-table.tsx 12ms (unchanged)\nweb/src/components/docs/mdx/mdx-components.tsx 16ms (unchanged)\nweb/src/components/docs/mdx/mermaid-diagram.tsx 3ms (unchanged)\nweb/src/components/docs/mdx/schema-display.tsx 3ms (unchanged)\nweb/src/components/docs/toc.tsx 5ms (unchanged)\nweb/src/components/footer.tsx 5ms (unchanged)\nweb/src/components/icons.tsx 1ms (unchanged)\nweb/src/components/IDEDemo.tsx 210ms (unchanged)\nweb/src/components/layout-wrapper.tsx 2ms (unchanged)\nweb/src/components/login/login-card.tsx 3ms (unchanged)\nweb/src/components/login/login-client-wrapper.tsx 2ms (unchanged)\nweb/src/components/navbar/navbar.tsx 9ms (unchanged)\nweb/src/components/navbar/user-dropdown.tsx 6ms (unchanged)\nweb/src/components/organization/advanced-monitor.tsx 64ms (unchanged)\nweb/src/components/organization/billing-alerts.tsx 6ms (unchanged)\nweb/src/components/organization/billing-reports.tsx 54ms (unchanged)\nweb/src/components/organization/billing-status.tsx 21ms (unchanged)\nweb/src/components/organization/credit-monitor.tsx 73ms (unchanged)\nweb/src/components/organization/model-config-sheet.tsx 4ms (unchanged)\nweb/src/components/organization/organization-success-modal.tsx 5ms (unchanged)\nweb/src/components/organization/repository-management.tsx 40ms (unchanged)\nweb/src/components/organization/team-management.tsx 138ms (unchanged)\nweb/src/components/providers/query-client-provider.tsx 2ms (unchanged)\nweb/src/components/publisher/basic-info-step.tsx 11ms (unchanged)\nweb/src/components/publisher/ownership-step.tsx 4ms (unchanged)\nweb/src/components/publisher/profile-details-step.tsx 2ms (unchanged)\nweb/src/components/publisher/step-template.tsx 3ms (unchanged)\nweb/src/components/sign-in/sign-in-button.tsx 9ms (unchanged)\nweb/src/components/sign-in/sign-in-card-footer.tsx 2ms (unchanged)\nweb/src/components/TerminalDemo.tsx 187ms (unchanged)\nweb/src/components/theme-provider.tsx 3ms (unchanged)\nweb/src/components/theme-switcher.tsx 1ms (unchanged)\nweb/src/components/ui/avatar-upload.tsx 8ms (unchanged)\nweb/src/components/ui/background-beams.tsx 12ms (unchanged)\nweb/src/components/ui/badge.tsx 1ms (unchanged)\nweb/src/components/ui/banner.tsx 5ms (unchanged)\nweb/src/components/ui/button.tsx 4ms (unchanged)\nweb/src/components/ui/card.tsx 2ms (unchanged)\nweb/src/components/ui/collapsible.tsx 4ms (unchanged)\nweb/src/components/ui/credit-confetti.tsx 9ms (unchanged)\nweb/src/components/ui/decorative-blocks.tsx 7ms (unchanged)\nweb/src/components/ui/dialog.tsx 8ms (unchanged)\nweb/src/components/ui/dropdown-menu.tsx 9ms (unchanged)\nweb/src/components/ui/enhanced-copy-button.tsx 7ms (unchanged)\nweb/src/components/ui/footer.tsx 7ms (unchanged)\nweb/src/components/ui/hero-buttons.tsx 6ms (unchanged)\nweb/src/components/ui/hero.tsx 5ms (unchanged)\nweb/src/components/ui/input.tsx 2ms (unchanged)\nweb/src/components/ui/install-dialog.tsx 45ms (unchanged)\nweb/src/components/ui/label.tsx 11ms (unchanged)\nweb/src/components/ui/landing/animated-element.tsx 8ms (unchanged)\nweb/src/components/ui/landing/competition/claude-code.tsx 76ms (unchanged)\nweb/src/components/ui/landing/competition/cline.tsx 44ms (unchanged)\nweb/src/components/ui/landing/competition/cursor.tsx 56ms (unchanged)\nweb/src/components/ui/landing/competition/github-copilot.tsx 21ms (unchanged)\nweb/src/components/ui/landing/competition/index.tsx 11ms (unchanged)\nweb/src/components/ui/landing/competition/tabs.tsx 14ms (unchanged)\nweb/src/components/ui/landing/constants.ts 15ms (unchanged)\nweb/src/components/ui/landing/cta-section.tsx 6ms (unchanged)\nweb/src/components/ui/landing/demo-code-display.tsx 3ms (unchanged)\nweb/src/components/ui/landing/feature/browser-comparison.tsx 2ms (unchanged)\nweb/src/components/ui/landing/feature/chart-illustration.tsx 6ms (unchanged)\nweb/src/components/ui/landing/feature/code-illustration.tsx 2ms (unchanged)\nweb/src/components/ui/landing/feature/highlight-text.tsx 2ms (unchanged)\nweb/src/components/ui/landing/feature/index.tsx 6ms (unchanged)\nweb/src/components/ui/landing/feature/workflow-illustration.tsx 4ms (unchanged)\nweb/src/components/ui/landing/testimonials-section.tsx 6ms (unchanged)\nweb/src/components/ui/landing/types.ts 4ms (unchanged)\nweb/src/components/ui/neon-gradient-button.tsx 5ms (unchanged)\nweb/src/components/ui/progress.tsx 4ms (unchanged)\nweb/src/components/ui/radio-group.tsx 4ms (unchanged)\nweb/src/components/ui/section.tsx 2ms (unchanged)\nweb/src/components/ui/select.tsx 11ms (unchanged)\nweb/src/components/ui/separator.tsx 4ms (unchanged)\nweb/src/components/ui/sheet.tsx 9ms (unchanged)\nweb/src/components/ui/sidebar.tsx 50ms (unchanged)\nweb/src/components/ui/skeleton-loading.tsx 5ms (unchanged)\nweb/src/components/ui/skeleton.tsx 2ms (unchanged)\nweb/src/components/ui/slider.tsx 4ms (unchanged)\nweb/src/components/ui/switch.tsx 3ms (unchanged)\nweb/src/components/ui/table.tsx 6ms (unchanged)\nweb/src/components/ui/tabs.tsx 2ms (unchanged)\nweb/src/components/ui/terminal/index.tsx 16ms (unchanged)\nweb/src/components/ui/terminal/terminal-input.tsx 14ms (unchanged)\nweb/src/components/ui/terminal/terminal-output.tsx 5ms (unchanged)\nweb/src/components/ui/textarea.tsx 3ms (unchanged)\nweb/src/components/ui/toast.tsx 4ms (unchanged)\nweb/src/components/ui/toaster.tsx 6ms (unchanged)\nweb/src/components/ui/tooltip.tsx 1ms (unchanged)\nweb/src/components/ui/use-toast.ts 11ms (unchanged)\nweb/src/discord/client.ts 5ms (unchanged)\nweb/src/discord/rate-limiter.ts 8ms (unchanged)\nweb/src/hooks/use-auto-topup.ts 32ms (unchanged)\nweb/src/hooks/use-install-dialog.ts 2ms (unchanged)\nweb/src/hooks/use-mobile.tsx 4ms (unchanged)\nweb/src/hooks/use-model-config.ts 6ms (unchanged)\nweb/src/hooks/use-org-auto-topup.ts 15ms (unchanged)\nweb/src/hooks/use-organization-data.ts 6ms (unchanged)\nweb/src/hooks/use-user-profile.ts 8ms (unchanged)\nweb/src/lib/admin-auth.ts 2ms (unchanged)\nweb/src/lib/constant.ts 12ms (unchanged)\nweb/src/lib/currency.ts 3ms (unchanged)\nweb/src/lib/docs.ts 5ms (unchanged)\nweb/src/lib/fonts.ts 9ms (unchanged)\nweb/src/lib/organization-permissions.ts 4ms (unchanged)\nweb/src/lib/PostHogProvider.tsx 2ms (unchanged)\nweb/src/lib/publisher-permissions.ts 8ms (unchanged)\nweb/src/lib/remark-code-to-codedemo.ts 3ms (unchanged)\nweb/src/lib/server-init.ts 2ms (unchanged)\nweb/src/lib/server/referral.ts 5ms (unchanged)\nweb/src/lib/SessionProvider.tsx 1ms (unchanged)\nweb/src/lib/stripe-utils.ts 2ms (unchanged)\nweb/src/lib/testimonials.ts 3ms (unchanged)\nweb/src/lib/trackConversions.ts 2ms (unchanged)\nweb/src/lib/utils.ts 1ms (unchanged)\nweb/src/lib/validators/publisher.ts 1ms (unchanged)\nweb/src/types/contentlayer.d.ts 2ms (unchanged)\nweb/src/types/docs.ts 1ms (unchanged)\nweb/src/types/next-auth.d.ts 4ms (unchanged)\nweb/src/types/user.ts 2ms (unchanged)\nweb/src/util/logger.ts 1ms (unchanged)\nweb/tailwind.config.ts 8ms (unchanged)\nweb/tsconfig.json 2ms (unchanged)\nweb/typed.d.ts 2ms (unchanged)\nWINDOWS.md 10ms (unchanged)\n", - "stderr": "$ prettier --write \"**/*.{ts,tsx,json,md}\"\n", - "exitCode": 0 - } - } - ], - "parentAgentId": "D-47hUftbfs" - }, - { - "type": "text", - "agentId": "D-47hYldaEo", - "text": "**Typecheck failed** with overall exit code 2.\n\n**Passing packages** (Exited with code 0): `@codebuff/code-map`, `@codebuff/sdk`, `@codebuff/bigquery`, `@codebuff/internal`, `@codebuff/billing`, `@codebuff/npm-app`, `@codebuff/common`, `@codebuff/web`.\n\n**Failing packages** (Exited with code 2):\n\n- `@codebuff/scripts`:\n - `../backend/src/templates/agents/agent-builder.ts(93,3)`: `error TS2741: Property 'spawnableAgents' is missing in type ... but required in type 'Omit'.`\n - `../backend/src/templates/agents/archive/dry-run.ts(11,31)`: `error TS2339: Property 'dry_run' does not exist on type ...`\n - `../backend/src/templates/agents/archive/dry-run.ts(12,38)`: `error TS2339: Property 'dry_run' does not exist on type ...`\n\n- `@codebuff/backend`:\n - Identical errors in `src/templates/agents/agent-builder.ts(93,3)`, `src/templates/agents/archive/dry-run.ts(11,31)`, and `src/templates/agents/archive/dry-run.ts(12,38)`.\n\n- `@codebuff/evals`:\n - Identical errors in `../backend/src/templates/agents/agent-builder.ts(93,3)`, `../backend/src/templates/agents/archive/dry-run.ts(11,31)`, and `../backend/src/templates/agents/archive/dry-run.ts(12,38)`." - }, - { - "type": "subagent_finish", - "agentId": "D-47hYldaEo", - "agentType": "commander-lite", - "displayName": "Commander Lite", - "onlyChild": false, - "parentAgentId": "main-agent", - "prompt": "Run root typecheck after fixes.", - "params": { - "command": "bun run typecheck", - "timeout_seconds": 120 - } - }, - { - "type": "text", - "agentId": "D-47hUftbfs", - "text": "**Command executed:** `bun run format` (which ran `prettier --write \"**/*.{ts,tsx,json,md}\"`)\n\n**Result:** Success (exit code 0). Processed hundreds of files across the project (e.g., `.agents/ask.ts 516ms (unchanged)`, `backend/src/main-prompt.ts 17ms (unchanged)`, `web/src/app/page.tsx 17ms (unchanged)`, etc.). **All files unchanged**—no modifications needed as they were already formatted correctly." - }, - { - "type": "subagent_finish", - "agentId": "D-47hUftbfs", - "agentType": "commander-lite", - "displayName": "Commander Lite", - "onlyChild": false, - "parentAgentId": "main-agent", - "prompt": "Format all files.", - "params": { - "command": "bun run format", - "timeout_seconds": 60 - } - }, - { - "type": "tool_result", - "toolCallId": "D-4DhNpiT3A", - "toolName": "spawn_agents", - "output": [ - { - "type": "json", - "value": [ - { - "agentName": "Commander Lite", - "agentType": "commander-lite", - "value": { - "type": "lastMessage", - "value": [ - { - "role": "assistant", - "content": [ - { - "type": "text", - "text": "**Typecheck failed** with overall exit code 2.\n\n**Passing packages** (Exited with code 0): `@codebuff/code-map`, `@codebuff/sdk`, `@codebuff/bigquery`, `@codebuff/internal`, `@codebuff/billing`, `@codebuff/npm-app`, `@codebuff/common`, `@codebuff/web`.\n\n**Failing packages** (Exited with code 2):\n\n- `@codebuff/scripts`:\n - `../backend/src/templates/agents/agent-builder.ts(93,3)`: `error TS2741: Property 'spawnableAgents' is missing in type ... but required in type 'Omit'.`\n - `../backend/src/templates/agents/archive/dry-run.ts(11,31)`: `error TS2339: Property 'dry_run' does not exist on type ...`\n - `../backend/src/templates/agents/archive/dry-run.ts(12,38)`: `error TS2339: Property 'dry_run' does not exist on type ...`\n\n- `@codebuff/backend`:\n - Identical errors in `src/templates/agents/agent-builder.ts(93,3)`, `src/templates/agents/archive/dry-run.ts(11,31)`, and `src/templates/agents/archive/dry-run.ts(12,38)`.\n\n- `@codebuff/evals`:\n - Identical errors in `../backend/src/templates/agents/agent-builder.ts(93,3)`, `../backend/src/templates/agents/archive/dry-run.ts(11,31)`, and `../backend/src/templates/agents/archive/dry-run.ts(12,38)`." - } - ] - } - ] - } - }, - { - "agentName": "Commander Lite", - "agentType": "commander-lite", - "value": { - "type": "lastMessage", - "value": [ - { - "role": "assistant", - "content": [ - { - "type": "text", - "text": "**Command executed:** `bun run format` (which ran `prettier --write \"**/*.{ts,tsx,json,md}\"`)\n\n**Result:** Success (exit code 0). Processed hundreds of files across the project (e.g., `.agents/ask.ts 516ms (unchanged)`, `backend/src/main-prompt.ts 17ms (unchanged)`, `web/src/app/page.tsx 17ms (unchanged)`, etc.). **All files unchanged**—no modifications needed as they were already formatted correctly." - } - ] - } - ] - } - } - ] - } - ] - }, - { - "type": "tool_call", - "toolCallId": "b50f4a9c-2501-4933-b055-3f3ab1ff0f6f", - "toolName": "spawn_agent_inline", - "input": { - "agent_type": "context-pruner", - "params": {} - }, - "agentId": "main-agent", - "includeToolCall": false - }, - { - "type": "tool_result", - "toolCallId": "b50f4a9c-2501-4933-b055-3f3ab1ff0f6f", - "toolName": "spawn_agent_inline", - "output": [ - { - "type": "json", - "value": { - "message": "Agent spawned." - } - } - ] - }, - { - "type": "tool_call", - "toolCallId": "D-7o2mqI-JQ", - "toolName": "spawn_agents", - "input": { - "agents": [ - { - "agent_type": "editor-gpt-5" - } - ] - }, - "agentId": "main-agent", - "includeToolCall": true - }, - { - "type": "tool_call", - "toolCallId": "D-7o2v7gkiI", - "toolName": "spawn_agents", - "input": { - "agents": [ - { - "agent_type": "commander-lite", - "prompt": "Verify typecheck passes after fixes.", - "params": { - "command": "bun run typecheck", - "timeout_seconds": 120 - } - } - ] - }, - "agentId": "main-agent", - "includeToolCall": true - }, - { - "type": "subagent_start", - "agentId": "D-7o2qxjxJE", - "agentType": "editor-gpt-5", - "displayName": "Code Editor", - "onlyChild": true, - "parentAgentId": "main-agent", - "prompt": "" - } - ] -} \ No newline at end of file diff --git a/evals/buffbench/update-agent-builder-base2-lite-error-wxn2.json b/evals/buffbench/update-agent-builder-base2-lite-error-wxn2.json deleted file mode 100644 index 9f6e2eea8b..0000000000 --- a/evals/buffbench/update-agent-builder-base2-lite-error-wxn2.json +++ /dev/null @@ -1,3881 +0,0 @@ -{ - "error": "Tool `read_files` is not currently available. Make sure to only use tools listed in the system instructions.", - "trace": [ - { - "type": "start", - "messageHistoryLength": 0 - }, - { - "type": "tool_call", - "toolCallId": "1822b996-bb36-4ccc-bd13-c18400ac6b1e", - "toolName": "spawn_agent_inline", - "input": { - "agent_type": "context-pruner", - "params": {} - }, - "agentId": "main-agent", - "includeToolCall": false - }, - { - "type": "tool_result", - "toolCallId": "1822b996-bb36-4ccc-bd13-c18400ac6b1e", - "toolName": "spawn_agent_inline", - "output": [ - { - "type": "json", - "value": { - "message": "Agent spawned." - } - } - ] - }, - { - "type": "tool_call", - "toolCallId": "D-Oe9G8zl9M", - "toolName": "spawn_agents", - "input": { - "agents": [ - { - "agent_type": "read_subtree", - "params": { - "paths": [ - ".agents" - ], - "maxTokens": 8000 - } - }, - { - "agent_type": "read_subtree", - "params": { - "paths": [ - ".agents/examples" - ], - "maxTokens": 4000 - } - }, - { - "agent_type": "file-picker", - "params": { - "prompt": "agent builder, agent creation, scaffolding custom agents, agent templates" - } - }, - { - "agent_type": "file-picker", - "params": { - "prompt": "diff-reviewer agent examples and configurations" - } - }, - { - "agent_type": "file-picker", - "params": { - "prompt": "your-custom-agent starter template or git-committer agent" - } - }, - { - "agent_type": "file-picker", - "params": { - "prompt": "agent personas, list of agent personalities or types" - } - }, - { - "agent_type": "file-picker", - "params": { - "prompt": "file-explorer agent definition and spawn target" - } - }, - { - "agent_type": "code-searcher", - "params": { - "searchQueries": [ - { - "pattern": "diff-reviewer" - }, - { - "pattern": "your-custom-agent" - }, - { - "pattern": "spawnable agents|spawnAgents" - }, - { - "pattern": "agent builder|agentBuilder" - }, - { - "pattern": "agent personas|agentPersonas" - } - ] - } - } - ] - }, - "agentId": "main-agent", - "includeToolCall": true - }, - { - "type": "subagent_start", - "agentId": "D-OfY8_NY2s", - "agentType": "file-picker", - "displayName": "Fletcher the File Fetcher", - "onlyChild": false, - "parentAgentId": "main-agent", - "prompt": "", - "params": { - "prompt": "agent builder, agent creation, scaffolding custom agents, agent templates" - } - }, - { - "type": "subagent_start", - "agentId": "D-OfY_tExks", - "agentType": "file-picker", - "displayName": "Fletcher the File Fetcher", - "onlyChild": false, - "parentAgentId": "main-agent", - "prompt": "", - "params": { - "prompt": "diff-reviewer agent examples and configurations" - } - }, - { - "type": "subagent_start", - "agentId": "D-OfaYSx8-Q", - "agentType": "file-picker", - "displayName": "Fletcher the File Fetcher", - "onlyChild": false, - "parentAgentId": "main-agent", - "prompt": "", - "params": { - "prompt": "your-custom-agent starter template or git-committer agent" - } - }, - { - "type": "subagent_start", - "agentId": "D-OfaV526OE", - "agentType": "file-picker", - "displayName": "Fletcher the File Fetcher", - "onlyChild": false, - "parentAgentId": "main-agent", - "prompt": "", - "params": { - "prompt": "agent personas, list of agent personalities or types" - } - }, - { - "type": "subagent_start", - "agentId": "D-OfaehVPQw", - "agentType": "file-picker", - "displayName": "Fletcher the File Fetcher", - "onlyChild": false, - "parentAgentId": "main-agent", - "prompt": "", - "params": { - "prompt": "file-explorer agent definition and spawn target" - } - }, - { - "type": "subagent_start", - "agentId": "D-Ofa741I0M", - "agentType": "code-searcher", - "displayName": "Code Searcher", - "onlyChild": false, - "parentAgentId": "main-agent", - "prompt": "", - "params": { - "searchQueries": [ - { - "pattern": "diff-reviewer" - }, - { - "pattern": "your-custom-agent" - }, - { - "pattern": "spawnable agents|spawnAgents" - }, - { - "pattern": "agent builder|agentBuilder" - }, - { - "pattern": "agent personas|agentPersonas" - } - ] - } - }, - { - "type": "tool_call", - "toolCallId": "877e5ab3-210d-4cf9-84e6-267e388d68ad", - "toolName": "code_search", - "input": { - "pattern": "diff-reviewer" - }, - "agentId": "D-Ofa741I0M", - "parentAgentId": "main-agent", - "includeToolCall": true - }, - { - "type": "tool_call", - "toolCallId": "3c204c3d-25bd-4014-b0b9-935f91f963e5", - "toolName": "spawn_agents", - "input": { - "agents": [ - { - "agent_type": "file-lister", - "prompt": "", - "params": { - "prompt": "agent personas, list of agent personalities or types" - } - } - ] - }, - "agentId": "D-OfaV526OE", - "parentAgentId": "main-agent", - "includeToolCall": true - }, - { - "type": "subagent_start", - "agentId": "D-OgGtcToUQ", - "agentType": "file-lister", - "displayName": "Liszt the File Lister", - "onlyChild": true, - "parentAgentId": "D-OfaV526OE", - "prompt": "", - "params": { - "prompt": "agent personas, list of agent personalities or types" - } - }, - { - "type": "tool_call", - "toolCallId": "b8a5729e-8e1d-4629-9a40-03ed7cd2ac40", - "toolName": "spawn_agents", - "input": { - "agents": [ - { - "agent_type": "file-lister", - "prompt": "", - "params": { - "prompt": "file-explorer agent definition and spawn target" - } - } - ] - }, - "agentId": "D-OfaehVPQw", - "parentAgentId": "main-agent", - "includeToolCall": true - }, - { - "type": "subagent_start", - "agentId": "D-OgWSwaG9Q", - "agentType": "file-lister", - "displayName": "Liszt the File Lister", - "onlyChild": true, - "parentAgentId": "D-OfaehVPQw", - "prompt": "", - "params": { - "prompt": "file-explorer agent definition and spawn target" - } - }, - { - "type": "tool_call", - "toolCallId": "d5d9bf34-0e52-49e8-97f8-330da68aa9a2", - "toolName": "spawn_agents", - "input": { - "agents": [ - { - "agent_type": "file-lister", - "prompt": "", - "params": { - "prompt": "diff-reviewer agent examples and configurations" - } - } - ] - }, - "agentId": "D-OfY_tExks", - "parentAgentId": "main-agent", - "includeToolCall": true - }, - { - "type": "subagent_start", - "agentId": "D-OgbZG1Kis", - "agentType": "file-lister", - "displayName": "Liszt the File Lister", - "onlyChild": true, - "parentAgentId": "D-OfY_tExks", - "prompt": "", - "params": { - "prompt": "diff-reviewer agent examples and configurations" - } - }, - { - "type": "tool_call", - "toolCallId": "e359f44e-929f-499e-9245-d0f00b579a3c", - "toolName": "spawn_agents", - "input": { - "agents": [ - { - "agent_type": "file-lister", - "prompt": "", - "params": { - "prompt": "agent builder, agent creation, scaffolding custom agents, agent templates" - } - } - ] - }, - "agentId": "D-OfY8_NY2s", - "parentAgentId": "main-agent", - "includeToolCall": true - }, - { - "type": "subagent_start", - "agentId": "D-OgiVqb-lc", - "agentType": "file-lister", - "displayName": "Liszt the File Lister", - "onlyChild": true, - "parentAgentId": "D-OfY8_NY2s", - "prompt": "", - "params": { - "prompt": "agent builder, agent creation, scaffolding custom agents, agent templates" - } - }, - { - "type": "tool_call", - "toolCallId": "5fb459f2-3aca-4499-b719-39696556c4d8", - "toolName": "spawn_agents", - "input": { - "agents": [ - { - "agent_type": "file-lister", - "prompt": "", - "params": { - "prompt": "your-custom-agent starter template or git-committer agent" - } - } - ] - }, - "agentId": "D-OfaYSx8-Q", - "parentAgentId": "main-agent", - "includeToolCall": true - }, - { - "type": "subagent_start", - "agentId": "D-Ogo19lSyI", - "agentType": "file-lister", - "displayName": "Liszt the File Lister", - "onlyChild": true, - "parentAgentId": "D-OfaYSx8-Q", - "prompt": "", - "params": { - "prompt": "your-custom-agent starter template or git-committer agent" - } - }, - { - "type": "tool_call", - "toolCallId": "4f170aca-9b8d-4fce-a6b7-ada8261923fc", - "toolName": "read_subtree", - "input": { - "paths": [], - "maxTokens": 500000 - }, - "agentId": "D-OgGtcToUQ", - "parentAgentId": "D-OfaV526OE", - "includeToolCall": true - }, - { - "type": "tool_result", - "toolCallId": "4f170aca-9b8d-4fce-a6b7-ada8261923fc", - "toolName": "read_subtree", - "output": [ - { - "type": "json", - "value": [ - { - "path": ".", - "type": "directory", - "printedTree": ".agents/\n examples/\n diff-reviewer-1.ts\n diff-reviewer-2.ts\n diff-reviewer-3.ts\n opensource/\n base.ts\n coder.ts\n file-picker.ts\n researcher.ts\n reviewer.ts\n thinker.ts\n ask.ts\n base-experimental.ts\n base-lite.ts\n base-max.ts\n base.ts\n brainstormer.ts\n changes-reviewer.ts\n charles.ts\n claude4-gemini-thinking.ts\n constants.ts\n file-explorer.ts\n file-picker.ts\n git-committer.ts\n knowledge-keeper.ts\n planner.ts\n researcher.ts\n reviewer.ts\n superagent.ts\n thinker.ts\n.bin/\n bun\n.github/\n workflows/\n ci.yml\n evals.yml\n nightly-evals.yml\n npm-app-release-build.yml\n npm-app-release-prod.yml\n npm-app-release-staging.yml\n .gitignore\n CODEOWNERS\n knowledge.md\n.vscode/\n settings.json\nbackend/\n src/\n __tests__/\n test-data/\n dex-go/\n edit-snippet.go\n expected.go\n original.go\n agent-id-resolution.test.ts\n agent-registry.test.ts\n auto-topup.test.ts\n credit-conversion.test.ts\n fast-rewrite.test.ts\n generate-diffs-prompt.test.ts\n get-custom-file-picker-config.test.ts\n live-user-inputs.test.ts\n loop-agent-steps.test.ts\n main-prompt.integration.test.ts\n main-prompt.test.ts\n process-file-block.test.ts\n process-str-replace.test.ts\n read-docs-tool.test.ts\n request-files-prompt.test.ts\n run-agent-step-tools.test.ts\n run-programmatic-step.test.ts\n sandbox-generator.test.ts\n subagent-streaming.test.ts\n test-utils.ts\n tool-call-schema.test.ts\n usage-calculation.test.ts\n web-search-tool.test.ts\n xml-stream-parser.test.ts\n admin/\n grade-runs.ts\n relabelRuns.ts\n api/\n org.ts\n usage.ts\n context/\n app-context.ts\n find-files/\n check-new-files-necessary.ts\n custom-file-picker-config.ts\n request-files-prompt.ts\n llm-apis/\n __tests__/\n linkup-api.test.ts\n vercel-ai-sdk/\n ai-sdk.ts\n openrouter.ts\n vertex-finetuned.ts\n claude.ts\n context7-api.ts\n gemini-with-fallbacks.ts\n knowledge.md\n linkup-api.ts\n message-cost-tracker.ts\n openai-api.ts\n openrouter.ts\n relace-api.ts\n system-prompt/\n agent-instructions.md\n prompts.ts\n save-agent-request.ts\n search-system-prompt.ts\n truncate-file-tree.ts\n templates/\n agents/\n archive/\n dry-run.ts\n agent-builder.ts\n ask.ts\n base.ts\n file-explorer.ts\n file-picker.ts\n planner.ts\n researcher.ts\n reviewer.ts\n superagent.ts\n thinker.ts\n thinking-base.ts\n agent-list.ts\n agent-registry.ts\n ask-prompts.ts\n base-prompts.ts\n prompts.ts\n README.md\n strings.ts\n types.ts\n tools/\n definitions/\n tool/\n add-message.ts\n add-subgoal.ts\n browser-logs.ts\n code-search.ts\n create-plan.ts\n end-turn.ts\n find-files.ts\n read-docs.ts\n read-files.ts\n run-file-change-hooks.ts\n run-terminal-command.ts\n set-messages.ts\n set-output.ts\n spawn-agent-inline.ts\n spawn-agents-async.ts\n spawn-agents.ts\n str-replace.ts\n think-deeply.ts\n update-subgoal.ts\n web-search.ts\n write-file.ts\n list.ts\n tool-def-type.ts\n handlers/\n tool/\n add-message.ts\n add-subgoal.ts\n browser-logs.ts\n code-search.ts\n create-plan.ts\n end-turn.ts\n find-files.ts\n read-docs.ts\n read-files.ts\n run-file-change-hooks.ts\n run-terminal-command.ts\n set-messages.ts\n set-output.ts\n spawn-agent-inline.ts\n spawn-agents-async.ts\n spawn-agents.ts\n str-replace.ts\n think-deeply.ts\n update-subgoal.ts\n web-search.ts\n write-file.ts\n handler-function-type.ts\n list.ts\n constants.ts\n prompts.ts\n stream-parser.ts\n tool-executor.ts\n util/\n __tests__/\n messages.test.ts\n object.test.ts\n parse-tool-call-xml.test.ts\n simplify-tool-results.test.ts\n split-data.test.ts\n check-auth.ts\n debug.ts\n file-resolver.ts\n logger.ts\n messages.ts\n object.ts\n parse-tool-call-xml.ts\n quickjs-sandbox.ts\n simplify-tool-results.ts\n split-data.ts\n token-counter.ts\n websockets/\n auth.ts\n middleware.ts\n request-context.ts\n server.ts\n switchboard.ts\n websocket-action.ts\n async-agent-manager.ts\n check-terminal-command.ts\n fast-rewrite.ts\n generate-diffs-prompt.ts\n get-documentation-for-query.ts\n get-file-reading-updates.ts\n index.ts\n live-user-inputs.ts\n loop-main-prompt.ts\n main-prompt.ts\n process-file-block.ts\n process-str-replace.ts\n prompt-agent-stream.ts\n run-agent-step.ts\n run-programmatic-step.ts\n xml-stream-parser.ts\n .gitignore\n knowledge.md\n package.json\n README.md\n tsconfig.json\ncommon/\n src/\n __tests__/\n agent-validation.test.ts\n dynamic-agent-template-schema.test.ts\n handlesteps-parsing.test.ts\n api-keys/\n constants.ts\n crypto.ts\n constants/\n agents.ts\n analytics-events.ts\n grant-priorities.ts\n db/\n migrations/\n meta/\n _journal.json\n 0000_snapshot.json\n 0001_snapshot.json\n 0002_snapshot.json\n 0003_snapshot.json\n 0004_snapshot.json\n 0005_snapshot.json\n 0006_snapshot.json\n 0007_snapshot.json\n 0008_snapshot.json\n 0009_snapshot.json\n 0010_snapshot.json\n 0011_snapshot.json\n 0012_snapshot.json\n 0013_snapshot.json\n 0014_snapshot.json\n 0015_snapshot.json\n 0016_snapshot.json\n 0017_snapshot.json\n 0018_snapshot.json\n 0019_snapshot.json\n 0020_snapshot.json\n 0021_snapshot.json\n 0026_snapshot.json\n 0027_snapshot.json\n 0028_snapshot.json\n 0000_overjoyed_thing.sql\n 0001_fuzzy_typhoid_mary.sql\n 0002_sticky_dormammu.sql\n 0003_military_owl.sql\n 0004_neat_pet_avengers.sql\n 0005_minor_the_professor.sql\n 0006_first_quasimodo.sql\n 0007_equal_warlock.sql\n 0008_puzzling_carnage.sql\n 0009_bitter_rumiko_fujikawa.sql\n 0010_overjoyed_red_skull.sql\n 0011_familiar_ezekiel_stane.sql\n 0012_fluffy_naoko.sql\n 0013_famous_risque.sql\n 0014_wakeful_sinister_six.sql\n 0015_stormy_zuras.sql\n 0016_clear_hairball.sql\n 0017_tricky_randall_flagg.sql\n 0018_stale_human_robot.sql\n 0019_amused_nebula.sql\n 0020_young_sleeper.sql\n 0021_tiny_marauders.sql\n 0026_chilly_mockingbird.sql\n 0027_sloppy_quasar.sql\n 0028_lush_johnny_blaze.sql\n docker-compose.yml\n drizzle.config.ts\n index.ts\n schema.knowledge.md\n schema.ts\n transaction.ts\n json-config/\n __tests__/\n __snapshots__/\n stringify-schema.test.ts.snap\n constants.test.ts\n stringify-schema.test.ts\n constants.ts\n default.ts\n stringify-schema.ts\n templates/\n agent-validation.ts\n dynamic-agent-functions.ts\n testing/\n mock-modules.ts\n tools/\n params/\n tool/\n add-message.ts\n add-subgoal.ts\n browser-logs.ts\n code-search.ts\n create-plan.ts\n end-turn.ts\n find-files.ts\n read-docs.ts\n read-files.ts\n run-file-change-hooks.ts\n run-terminal-command.ts\n set-messages.ts\n set-output.ts\n spawn-agent-inline.ts\n spawn-agents-async.ts\n spawn-agents.ts\n str-replace.ts\n think-deeply.ts\n update-subgoal.ts\n web-search.ts\n write-file.ts\n compile-tool-definitions.ts\n constants.ts\n list.ts\n utils.ts\n types/\n __tests__/\n dynamic-agent-template.test.ts\n api/\n agents/\n publish.ts\n agent-template.ts\n dynamic-agent-template.ts\n grant.ts\n message.ts\n organization.ts\n print-mode.ts\n publisher.ts\n referral.ts\n session-state.ts\n usage.ts\n util/\n __tests__/\n messages.test.ts\n partial-json-delta.test.ts\n saxy.test.ts\n string.test.ts\n examples/\n diff-reviewer-1.ts\n diff-reviewer-2.ts\n diff-reviewer-3.ts\n agent-file-utils.ts\n agent-name-normalization.ts\n agent-name-resolver.ts\n agent-template-validation.ts\n array.ts\n changes.ts\n credentials.ts\n currency.ts\n dates.ts\n error.ts\n file.ts\n git.ts\n logger.ts\n lru-cache.ts\n messages.ts\n min-heap.ts\n model-utils.ts\n object.ts\n partial-json-delta.ts\n patch.ts\n promise.ts\n random.ts\n referral.ts\n saxy.ts\n string.knowledge.md\n string.ts\n stripe.ts\n sync-failure.ts\n xml.ts\n zod-schema.ts\n websockets/\n websocket-client.ts\n websocket-schema.ts\n actions.ts\n analytics.ts\n browser-actions.ts\n constants.ts\n project-file-tree.ts\n knowledge.md\n package.json\n tsconfig.json\nevals/\n git-evals/\n email-eval-results.ts\n eval-codebuff.json\n eval-manifold.json\n eval-result-codebuff-mock.json\n gen-evals.ts\n judge-git-eval.ts\n post-eval-analysis.ts\n run-eval-set.ts\n run-git-evals.ts\n run-single-eval-process.ts\n run-single-eval.ts\n setup-test-repo.ts\n types.ts\n .gitignore\n bun.lock\n constants.ts\n e2e-cat-app-script.ts\n knowledge.md\n package.json\n scaffolding.ts\n swe-bench-eval.ts\n swe-bench-ids.ts\n swe-bench.test.ts\n test-repos.json\n test-setup.ts\n tsconfig.json\nnpm-app/\n release/\n index.js\n package.json\n README.md\n release-staging/\n index.js\n package.json\n README.md\n scripts/\n build-binary.js\n generate-github-token.ts\n patch-web-tree-sitter.ts\n release.js\n twitch-plays-codebuff.sh\n src/\n __tests__/\n display.test.ts\n tool-handlers.test.ts\n agents/\n agent-utils.ts\n load-agents.ts\n checkpoints/\n checkpoint-manager.ts\n file-manager.ts\n cli-handlers/\n agent-creation-chat.ts\n agents.ts\n api-key.ts\n checkpoint.ts\n diff.ts\n easter-egg.ts\n inititalization-flow.ts\n mini-chat.ts\n publish.ts\n subagent-list.ts\n subagent.ts\n display/\n overrides.ts\n print-mode.ts\n squash-newlines.ts\n json-config/\n hooks.ts\n parser.ts\n native/\n ripgrep.ts\n terminal/\n background.ts\n run-command.ts\n utils/\n __tests__/\n __snapshots__/\n background-process-manager.test.ts.snap\n frustration-detector.test.ts.snap\n rage-detector.test.ts.snap\n xml-stream-parser.test.ts.snap\n background-process-manager.test.ts\n rage-detector.test.ts\n response-example-4-files.txt\n tool-renderers.test.ts\n xml-stream-parser.test.ts\n agent-validation.ts\n analytics.ts\n detect-shell.ts\n git.ts\n logger.ts\n rage-detector.ts\n spinner.ts\n suppress-console.ts\n system-info.ts\n terminal.ts\n tool-renderers.ts\n with-hang-detection.ts\n xml-stream-parser.ts\n workers/\n checkpoint-worker.ts\n project-context.ts\n background-process-manager.ts\n browser-runner.ts\n chat-storage.ts\n cli-definitions.ts\n cli.ts\n client.ts\n config.ts\n create-template-project.ts\n credentials.ts\n dev-process-manager.ts\n diff-manager.ts\n fingerprint.ts\n index.ts\n menu.ts\n project-files.ts\n rage-detectors.ts\n startup-process-handler.ts\n subagent-storage.ts\n tool-handlers.ts\n types.ts\n web-scraper.ts\n .gitignore\n bunfig.toml\n package.json\n tsconfig.json\npackages/\n bigquery/\n src/\n client.ts\n index.ts\n schema.ts\n knowledge.md\n package.json\n tsconfig.json\n billing/\n src/\n __tests__/\n credit-delegation.test.ts\n extract-owner-repo.test.ts\n org-billing.test.ts\n auto-topup.ts\n balance-calculator.ts\n billing.knowledge.md\n conversion.ts\n credit-delegation.ts\n grant-credits.knowledge.md\n grant-credits.ts\n index.ts\n org-billing.ts\n org-monitoring.ts\n usage-service.ts\n utils.ts\n knowledge.md\n package.json\n project.json\n tsconfig.json\n build-tools/\n executors/\n infisical-run/\n executor.ts\n schema.json\n executors.json\n package.json\n project.json\n tsconfig.json\n code-map/\n __tests__/\n test-langs/\n test.c\n test.cpp\n test.cs\n test.go\n test.java\n test.js\n test.php\n test.py\n test.rb\n test.rs\n test.ts\n languages.test.ts\n parse.test.ts\n src/\n tree-sitter-queries/\n readme.md\n tree-sitter-c_sharp-tags.scm\n tree-sitter-c-tags.scm\n tree-sitter-cpp-tags.scm\n tree-sitter-go-tags.scm\n tree-sitter-java-tags.scm\n tree-sitter-javascript-tags.scm\n tree-sitter-php-tags.scm\n tree-sitter-python-tags.scm\n tree-sitter-ruby-tags.scm\n tree-sitter-rust-tags.scm\n tree-sitter-typescript-tags.scm\n index.ts\n languages.ts\n parse.ts\n package.json\n tsconfig.json\n internal/\n src/\n loops/\n client.ts\n index.ts\n types.ts\n openrouter-ai-sdk/\n internal/\n index.ts\n schemas/\n reasoning-details.ts\n types/\n index.ts\n openrouter-chat-completions-input.ts\n openrouter-chat-settings.ts\n .gitignore\n convert-to-openrouter-chat-messages.test.ts\n convert-to-openrouter-chat-messages.ts\n convert-to-openrouter-completion-prompt.ts\n index.ts\n map-openrouter-chat-logprobs.ts\n map-openrouter-completion-logprobs.ts\n map-openrouter-finish-reason.ts\n openrouter-chat-language-model.test.ts\n openrouter-chat-language-model.ts\n openrouter-completion-language-model.test.ts\n openrouter-completion-language-model.ts\n openrouter-completion-settings.ts\n openrouter-error.ts\n openrouter-facade.ts\n openrouter-provider-options.test.ts\n openrouter-provider.ts\n openrouter-stream-usage-accounting.test.ts\n openrouter-usage-accounting.test.ts\n utils/\n __tests__/\n version-utils.test.ts\n auth.ts\n version-utils.ts\n xml-parser.ts\n env.ts\n index.ts\n knowledge.md\n package.json\n tsconfig.json\npython-app/\n src/\n codebuff/\n __init__.py\n .gitignore\n knowledge.md\n LICENSE\n pyproject.toml\n README.md\nscripts/\n changelog/\n 2025-05-18-version-10283-release-enhanced-assistant-experience-system-stability.mdx\n 2025-05-25-version-10295-enhanced-ai-models-and-user-experience-improvements.mdx\n 2025-06-01-version-10305-release-enhanced-ai-models-new-commands-and-performance-improvements.mdx\n docs.json\n ft-file-selection/\n .gitignore\n collect-tuning-data.ts\n grade-traces.ts\n print-recent-relabels.ts\n print-recent-traces.ts\n README.md\n relabel-for-offline-scoring.ts\n relabel-traces-with-context.ts\n relabel-traces.ts\n .gitignore\n analyze-edit-blocks.ts\n analyze-model-usage.ts\n apply-credit-migration.ts\n calculate-average-spend.ts\n calculate-dau.ts\n calculate-monthly-usage.ts\n calculate-mrr.ts\n calculate-weekly-usage.ts\n cleanup-worktree.sh\n convert-escaped-newlines.ts\n count-edit-file.ts\n debug-log-subset.ts\n dev.sh\n export-user-emails.ts\n generate-ci-env.js\n generate-tool-definitions.ts\n get-changelog.ts\n init-worktree.ts\n package.json\n tsconfig.json\n update-stripe-subscriptions.ts\nsdk/\n scripts/\n publish.js\n src/\n tools/\n change-file.ts\n read-files.ts\n types/\n agent-definition.ts\n tools.ts\n client.ts\n constants.ts\n index.ts\n process-stream.ts\n websocket-client.ts\n .npmignore\n CHANGELOG.md\n package.json\n PUBLISHING.md\n README.md\n tsconfig.json\nweb/\n public/\n codebuff-intro1.webm\n scripts/\n discord/\n index.ts\n register-commands.ts\n src/\n __tests__/\n e2e/\n home.spec.ts\n unit/\n home.spec.tsx\n actions/\n hello-action.ts\n app/\n [sponsee]/\n page.tsx\n admin/\n file-picker/\n page.tsx\n orgs/\n page.tsx\n traces/\n components/\n chat-message.tsx\n client-session-viewer.tsx\n empty-state.tsx\n error-boundary.tsx\n loading-skeletons.tsx\n timeline-chart.module.css\n timeline-chart.tsx\n trace-viewer.tsx\n utils/\n __tests__/\n trace-processing.test.ts\n trace-processing.ts\n page.tsx\n layout.tsx\n affiliates/\n actions.ts\n page.tsx\n agents/\n page.tsx\n api/\n admin/\n orgs/\n [orgId]/\n features/\n [feature]/\n route.ts\n export/\n route.ts\n route.ts\n relabel-for-user/\n route.ts\n traces/\n [clientRequestId]/\n messages/\n route.ts\n timeline/\n route.ts\n client/\n [clientId]/\n sessions/\n route.ts\n admin-auth.ts\n agents/\n [publisherId]/\n [agentId]/\n [version]/\n route.ts\n latest/\n route.ts\n publish/\n route.ts\n validate/\n route.ts\n route.ts\n api-keys/\n route.ts\n auth/\n [...nextauth]/\n auth-options.ts\n route.ts\n cli/\n code/\n route.ts\n logout/\n route.ts\n status/\n route.ts\n feed/\n route.ts\n git-evals/\n visibility/\n route.ts\n route.ts\n healthz/\n route.ts\n invites/\n [token]/\n route.ts\n orgs/\n [orgId]/\n alerts/\n [alertId]/\n dismiss/\n route.ts\n route.ts\n analytics/\n export/\n route.ts\n route.ts\n billing/\n setup/\n route.ts\n status/\n route.ts\n subscription/\n route.ts\n credits/\n route.ts\n invitations/\n [email]/\n resend/\n route.ts\n route.ts\n bulk/\n route.ts\n route.ts\n members/\n [userId]/\n route.ts\n route.ts\n monitoring/\n route.ts\n publishers/\n route.ts\n repos/\n [repoId]/\n route.ts\n route.ts\n settings/\n route.ts\n usage/\n export/\n route.ts\n route.ts\n route.ts\n slug/\n [slug]/\n route.ts\n route.ts\n publishers/\n [id]/\n organization/\n route.ts\n validate/\n route.ts\n route.ts\n referrals/\n [code]/\n route.ts\n helpers.ts\n route.ts\n stripe/\n buy-credits/\n route.ts\n webhook/\n route.ts\n upload/\n avatar/\n route.ts\n user/\n auto-topup/\n route.ts\n profile/\n route.ts\n usage/\n route.ts\n config/\n page.tsx\n docs/\n [category]/\n layout.tsx\n metadata.ts\n page.tsx\n layout.tsx\n page.tsx\n evals/\n evals-table.tsx\n page.tsx\n invites/\n [token]/\n page.tsx\n login/\n page.tsx\n onboard/\n page.tsx\n orgs/\n [slug]/\n analytics/\n page.tsx\n billing/\n purchase/\n page.tsx\n setup/\n page.tsx\n repositories/\n page.tsx\n settings/\n page.tsx\n team/\n page.tsx\n usage/\n page.tsx\n page.tsx\n new/\n page.tsx\n page.tsx\n payment-success/\n page.tsx\n pricing/\n page.tsx\n privacy-policy/\n page.tsx\n publishers/\n [id]/\n agents/\n [agentId]/\n [version]/\n page.tsx\n page.tsx\n new/\n page.tsx\n page.tsx\n referrals/\n [code]/\n metadata.ts\n page.tsx\n layout.tsx\n page.tsx\n terms-of-service/\n page.tsx\n usage/\n layout.tsx\n page.tsx\n usage-display.tsx\n analytics.knowledge.md\n layout.tsx\n page.tsx\n robots.ts\n sitemap.ts\n components/\n agent/\n json-viewer.tsx\n auto-topup/\n AutoTopupSettings.tsx\n AutoTopupSettingsForm.tsx\n AutoTopupSwitch.tsx\n BaseAutoTopupSettings.tsx\n BaseAutoTopupSettingsForm.tsx\n BaseAutoTopupSwitch.tsx\n constants.ts\n OrgAutoTopupSettings.tsx\n OrgAutoTopupSettingsForm.tsx\n OrgAutoTopupSwitch.tsx\n types.ts\n credits/\n CreditManagementSection.tsx\n CreditPurchaseSection.tsx\n docs/\n mdx/\n code-demo.tsx\n custom-link.tsx\n markdown-table.tsx\n mdx-components.tsx\n mermaid-diagram.tsx\n schema-display.tsx\n copy-heading.tsx\n doc-sidebar.tsx\n docs.knowledge.md\n toc.tsx\n login/\n login-card.tsx\n login-client-wrapper.tsx\n navbar/\n navbar.tsx\n user-dropdown.tsx\n organization/\n advanced-monitor.tsx\n billing-alerts.tsx\n billing-reports.tsx\n billing-status.tsx\n credit-monitor.tsx\n model-config-sheet.tsx\n organization-success-modal.tsx\n repository-management.tsx\n team-management.tsx\n providers/\n query-client-provider.tsx\n publisher/\n basic-info-step.tsx\n ownership-step.tsx\n profile-details-step.tsx\n step-template.tsx\n sign-in/\n sign-in-button.tsx\n sign-in-card-footer.tsx\n ui/\n landing/\n competition/\n claude-code.tsx\n cline.tsx\n cursor.tsx\n github-copilot.tsx\n index.tsx\n tabs.tsx\n feature/\n browser-comparison.tsx\n chart-illustration.tsx\n code-illustration.tsx\n highlight-text.tsx\n index.tsx\n workflow-illustration.tsx\n animated-element.tsx\n constants.ts\n cta-section.tsx\n demo-code-display.tsx\n testimonials-section.tsx\n types.ts\n terminal/\n index.tsx\n style.css\n terminal-input.tsx\n terminal-output.tsx\n avatar-upload.tsx\n background-beams.tsx\n badge.tsx\n banner.tsx\n button.tsx\n card.tsx\n collapsible.tsx\n credit-confetti.tsx\n decorative-blocks.tsx\n dialog.tsx\n dropdown-menu.tsx\n enhanced-copy-button.tsx\n footer.tsx\n hero-buttons.tsx\n hero.tsx\n input.tsx\n install-dialog.tsx\n label.tsx\n neon-gradient-button.tsx\n progress.tsx\n radio-group.tsx\n section.tsx\n select.tsx\n separator.tsx\n sheet.tsx\n sidebar.tsx\n skeleton-loading.tsx\n skeleton.tsx\n slider.tsx\n switch.tsx\n table.tsx\n tabs.tsx\n textarea.tsx\n toast.tsx\n toaster.tsx\n tooltip.tsx\n use-toast.ts\n BrowserPreview.tsx\n card-with-beams.tsx\n CookieConsentCard.tsx\n footer.tsx\n icons.tsx\n IDEDemo.tsx\n layout-wrapper.tsx\n TerminalDemo.tsx\n theme-provider.tsx\n theme-switcher.tsx\n content/\n advanced/\n claude-code-comparison.mdx\n config.mdx\n how-does-it-work.mdx\n large-projects.mdx\n troubleshooting.mdx\n what-models.mdx\n agents/\n agent-reference.mdx\n creating-new-agents.mdx\n customizing-agents.mdx\n overview.mdx\n troubleshooting-agent-customization.mdx\n case-studies/\n _cta.mdx\n benjamin-bryant.mdx\n oliver-lukesch.mdx\n help/\n faq.mdx\n getting-started.mdx\n tips/\n best-practices.mdx\n keyboard-shortcuts.mdx\n knowledge-files.mdx\n other-use-cases.mdx\n version-control.mdx\n where-codebuff-shines.mdx\n discord/\n client.ts\n rate-limiter.ts\n hooks/\n use-auto-topup.ts\n use-install-dialog.ts\n use-mobile.tsx\n use-model-config.ts\n use-org-auto-topup.ts\n use-organization-data.ts\n use-user-profile.ts\n lib/\n server/\n referral.ts\n validators/\n publisher.ts\n admin-auth.ts\n constant.ts\n currency.ts\n docs.ts\n fonts.ts\n organization-permissions.ts\n PostHogProvider.tsx\n publisher-permissions.ts\n remark-code-to-codedemo.ts\n server-init.ts\n SessionProvider.tsx\n stripe-utils.ts\n testimonials.ts\n trackConversions.ts\n utils.ts\n styles/\n globals.css\n types/\n docs.ts\n user.ts\n util/\n logger.ts\n .eslintignore\n .eslintrc.js\n .gitignore\n .prettierignore\n .prettierrc.js\n commitlint.config.js\n components.json\n contentlayer.config.ts\n jest.config.js\n jest.setup.js\n knowledge.md\n next.config.mjs\n package.json\n playwright.config.ts\n postcss.config.cjs\n README.md\n tailwind.config.ts\n tsconfig.json\n.envrc\n.gitignore\n.infisical.json\n.prettierrc\nauthentication.knowledge.md\nbun.lock\nbunfig.toml\ncodebuff.json\neslint.config.js\nknowledge.md\npackage.json\nREADME.md\ntsconfig.base.json\ntsconfig.json\nWINDOWS.md\n", - "tokenCount": 9007, - "truncationLevel": "none" - } - ] - } - ], - "parentAgentId": "D-OgGtcToUQ" - }, - { - "type": "tool_call", - "toolCallId": "4d5eb69d-6f5d-4c20-b1c2-51f7bebcc29b", - "toolName": "read_subtree", - "input": { - "paths": [], - "maxTokens": 500000 - }, - "agentId": "D-OgWSwaG9Q", - "parentAgentId": "D-OfaehVPQw", - "includeToolCall": true - }, - { - "type": "tool_result", - "toolCallId": "4d5eb69d-6f5d-4c20-b1c2-51f7bebcc29b", - "toolName": "read_subtree", - "output": [ - { - "type": "json", - "value": [ - { - "path": ".", - "type": "directory", - "printedTree": ".agents/\n examples/\n diff-reviewer-1.ts\n diff-reviewer-2.ts\n diff-reviewer-3.ts\n opensource/\n base.ts\n coder.ts\n file-picker.ts\n researcher.ts\n reviewer.ts\n thinker.ts\n ask.ts\n base-experimental.ts\n base-lite.ts\n base-max.ts\n base.ts\n brainstormer.ts\n changes-reviewer.ts\n charles.ts\n claude4-gemini-thinking.ts\n constants.ts\n file-explorer.ts\n file-picker.ts\n git-committer.ts\n knowledge-keeper.ts\n planner.ts\n researcher.ts\n reviewer.ts\n superagent.ts\n thinker.ts\n.bin/\n bun\n.github/\n workflows/\n ci.yml\n evals.yml\n nightly-evals.yml\n npm-app-release-build.yml\n npm-app-release-prod.yml\n npm-app-release-staging.yml\n .gitignore\n CODEOWNERS\n knowledge.md\n.vscode/\n settings.json\nbackend/\n src/\n __tests__/\n test-data/\n dex-go/\n edit-snippet.go\n expected.go\n original.go\n agent-id-resolution.test.ts\n agent-registry.test.ts\n auto-topup.test.ts\n credit-conversion.test.ts\n fast-rewrite.test.ts\n generate-diffs-prompt.test.ts\n get-custom-file-picker-config.test.ts\n live-user-inputs.test.ts\n loop-agent-steps.test.ts\n main-prompt.integration.test.ts\n main-prompt.test.ts\n process-file-block.test.ts\n process-str-replace.test.ts\n read-docs-tool.test.ts\n request-files-prompt.test.ts\n run-agent-step-tools.test.ts\n run-programmatic-step.test.ts\n sandbox-generator.test.ts\n subagent-streaming.test.ts\n test-utils.ts\n tool-call-schema.test.ts\n usage-calculation.test.ts\n web-search-tool.test.ts\n xml-stream-parser.test.ts\n admin/\n grade-runs.ts\n relabelRuns.ts\n api/\n org.ts\n usage.ts\n context/\n app-context.ts\n find-files/\n check-new-files-necessary.ts\n custom-file-picker-config.ts\n request-files-prompt.ts\n llm-apis/\n __tests__/\n linkup-api.test.ts\n vercel-ai-sdk/\n ai-sdk.ts\n openrouter.ts\n vertex-finetuned.ts\n claude.ts\n context7-api.ts\n gemini-with-fallbacks.ts\n knowledge.md\n linkup-api.ts\n message-cost-tracker.ts\n openai-api.ts\n openrouter.ts\n relace-api.ts\n system-prompt/\n agent-instructions.md\n prompts.ts\n save-agent-request.ts\n search-system-prompt.ts\n truncate-file-tree.ts\n templates/\n agents/\n archive/\n dry-run.ts\n agent-builder.ts\n ask.ts\n base.ts\n file-explorer.ts\n file-picker.ts\n planner.ts\n researcher.ts\n reviewer.ts\n superagent.ts\n thinker.ts\n thinking-base.ts\n agent-list.ts\n agent-registry.ts\n ask-prompts.ts\n base-prompts.ts\n prompts.ts\n README.md\n strings.ts\n types.ts\n tools/\n definitions/\n tool/\n add-message.ts\n add-subgoal.ts\n browser-logs.ts\n code-search.ts\n create-plan.ts\n end-turn.ts\n find-files.ts\n read-docs.ts\n read-files.ts\n run-file-change-hooks.ts\n run-terminal-command.ts\n set-messages.ts\n set-output.ts\n spawn-agent-inline.ts\n spawn-agents-async.ts\n spawn-agents.ts\n str-replace.ts\n think-deeply.ts\n update-subgoal.ts\n web-search.ts\n write-file.ts\n list.ts\n tool-def-type.ts\n handlers/\n tool/\n add-message.ts\n add-subgoal.ts\n browser-logs.ts\n code-search.ts\n create-plan.ts\n end-turn.ts\n find-files.ts\n read-docs.ts\n read-files.ts\n run-file-change-hooks.ts\n run-terminal-command.ts\n set-messages.ts\n set-output.ts\n spawn-agent-inline.ts\n spawn-agents-async.ts\n spawn-agents.ts\n str-replace.ts\n think-deeply.ts\n update-subgoal.ts\n web-search.ts\n write-file.ts\n handler-function-type.ts\n list.ts\n constants.ts\n prompts.ts\n stream-parser.ts\n tool-executor.ts\n util/\n __tests__/\n messages.test.ts\n object.test.ts\n parse-tool-call-xml.test.ts\n simplify-tool-results.test.ts\n split-data.test.ts\n check-auth.ts\n debug.ts\n file-resolver.ts\n logger.ts\n messages.ts\n object.ts\n parse-tool-call-xml.ts\n quickjs-sandbox.ts\n simplify-tool-results.ts\n split-data.ts\n token-counter.ts\n websockets/\n auth.ts\n middleware.ts\n request-context.ts\n server.ts\n switchboard.ts\n websocket-action.ts\n async-agent-manager.ts\n check-terminal-command.ts\n fast-rewrite.ts\n generate-diffs-prompt.ts\n get-documentation-for-query.ts\n get-file-reading-updates.ts\n index.ts\n live-user-inputs.ts\n loop-main-prompt.ts\n main-prompt.ts\n process-file-block.ts\n process-str-replace.ts\n prompt-agent-stream.ts\n run-agent-step.ts\n run-programmatic-step.ts\n xml-stream-parser.ts\n .gitignore\n knowledge.md\n package.json\n README.md\n tsconfig.json\ncommon/\n src/\n __tests__/\n agent-validation.test.ts\n dynamic-agent-template-schema.test.ts\n handlesteps-parsing.test.ts\n api-keys/\n constants.ts\n crypto.ts\n constants/\n agents.ts\n analytics-events.ts\n grant-priorities.ts\n db/\n migrations/\n meta/\n _journal.json\n 0000_snapshot.json\n 0001_snapshot.json\n 0002_snapshot.json\n 0003_snapshot.json\n 0004_snapshot.json\n 0005_snapshot.json\n 0006_snapshot.json\n 0007_snapshot.json\n 0008_snapshot.json\n 0009_snapshot.json\n 0010_snapshot.json\n 0011_snapshot.json\n 0012_snapshot.json\n 0013_snapshot.json\n 0014_snapshot.json\n 0015_snapshot.json\n 0016_snapshot.json\n 0017_snapshot.json\n 0018_snapshot.json\n 0019_snapshot.json\n 0020_snapshot.json\n 0021_snapshot.json\n 0026_snapshot.json\n 0027_snapshot.json\n 0028_snapshot.json\n 0000_overjoyed_thing.sql\n 0001_fuzzy_typhoid_mary.sql\n 0002_sticky_dormammu.sql\n 0003_military_owl.sql\n 0004_neat_pet_avengers.sql\n 0005_minor_the_professor.sql\n 0006_first_quasimodo.sql\n 0007_equal_warlock.sql\n 0008_puzzling_carnage.sql\n 0009_bitter_rumiko_fujikawa.sql\n 0010_overjoyed_red_skull.sql\n 0011_familiar_ezekiel_stane.sql\n 0012_fluffy_naoko.sql\n 0013_famous_risque.sql\n 0014_wakeful_sinister_six.sql\n 0015_stormy_zuras.sql\n 0016_clear_hairball.sql\n 0017_tricky_randall_flagg.sql\n 0018_stale_human_robot.sql\n 0019_amused_nebula.sql\n 0020_young_sleeper.sql\n 0021_tiny_marauders.sql\n 0026_chilly_mockingbird.sql\n 0027_sloppy_quasar.sql\n 0028_lush_johnny_blaze.sql\n docker-compose.yml\n drizzle.config.ts\n index.ts\n schema.knowledge.md\n schema.ts\n transaction.ts\n json-config/\n __tests__/\n __snapshots__/\n stringify-schema.test.ts.snap\n constants.test.ts\n stringify-schema.test.ts\n constants.ts\n default.ts\n stringify-schema.ts\n templates/\n agent-validation.ts\n dynamic-agent-functions.ts\n testing/\n mock-modules.ts\n tools/\n params/\n tool/\n add-message.ts\n add-subgoal.ts\n browser-logs.ts\n code-search.ts\n create-plan.ts\n end-turn.ts\n find-files.ts\n read-docs.ts\n read-files.ts\n run-file-change-hooks.ts\n run-terminal-command.ts\n set-messages.ts\n set-output.ts\n spawn-agent-inline.ts\n spawn-agents-async.ts\n spawn-agents.ts\n str-replace.ts\n think-deeply.ts\n update-subgoal.ts\n web-search.ts\n write-file.ts\n compile-tool-definitions.ts\n constants.ts\n list.ts\n utils.ts\n types/\n __tests__/\n dynamic-agent-template.test.ts\n api/\n agents/\n publish.ts\n agent-template.ts\n dynamic-agent-template.ts\n grant.ts\n message.ts\n organization.ts\n print-mode.ts\n publisher.ts\n referral.ts\n session-state.ts\n usage.ts\n util/\n __tests__/\n messages.test.ts\n partial-json-delta.test.ts\n saxy.test.ts\n string.test.ts\n examples/\n diff-reviewer-1.ts\n diff-reviewer-2.ts\n diff-reviewer-3.ts\n agent-file-utils.ts\n agent-name-normalization.ts\n agent-name-resolver.ts\n agent-template-validation.ts\n array.ts\n changes.ts\n credentials.ts\n currency.ts\n dates.ts\n error.ts\n file.ts\n git.ts\n logger.ts\n lru-cache.ts\n messages.ts\n min-heap.ts\n model-utils.ts\n object.ts\n partial-json-delta.ts\n patch.ts\n promise.ts\n random.ts\n referral.ts\n saxy.ts\n string.knowledge.md\n string.ts\n stripe.ts\n sync-failure.ts\n xml.ts\n zod-schema.ts\n websockets/\n websocket-client.ts\n websocket-schema.ts\n actions.ts\n analytics.ts\n browser-actions.ts\n constants.ts\n project-file-tree.ts\n knowledge.md\n package.json\n tsconfig.json\nevals/\n git-evals/\n email-eval-results.ts\n eval-codebuff.json\n eval-manifold.json\n eval-result-codebuff-mock.json\n gen-evals.ts\n judge-git-eval.ts\n post-eval-analysis.ts\n run-eval-set.ts\n run-git-evals.ts\n run-single-eval-process.ts\n run-single-eval.ts\n setup-test-repo.ts\n types.ts\n .gitignore\n bun.lock\n constants.ts\n e2e-cat-app-script.ts\n knowledge.md\n package.json\n scaffolding.ts\n swe-bench-eval.ts\n swe-bench-ids.ts\n swe-bench.test.ts\n test-repos.json\n test-setup.ts\n tsconfig.json\nnpm-app/\n release/\n index.js\n package.json\n README.md\n release-staging/\n index.js\n package.json\n README.md\n scripts/\n build-binary.js\n generate-github-token.ts\n patch-web-tree-sitter.ts\n release.js\n twitch-plays-codebuff.sh\n src/\n __tests__/\n display.test.ts\n tool-handlers.test.ts\n agents/\n agent-utils.ts\n load-agents.ts\n checkpoints/\n checkpoint-manager.ts\n file-manager.ts\n cli-handlers/\n agent-creation-chat.ts\n agents.ts\n api-key.ts\n checkpoint.ts\n diff.ts\n easter-egg.ts\n inititalization-flow.ts\n mini-chat.ts\n publish.ts\n subagent-list.ts\n subagent.ts\n display/\n overrides.ts\n print-mode.ts\n squash-newlines.ts\n json-config/\n hooks.ts\n parser.ts\n native/\n ripgrep.ts\n terminal/\n background.ts\n run-command.ts\n utils/\n __tests__/\n __snapshots__/\n background-process-manager.test.ts.snap\n frustration-detector.test.ts.snap\n rage-detector.test.ts.snap\n xml-stream-parser.test.ts.snap\n background-process-manager.test.ts\n rage-detector.test.ts\n response-example-4-files.txt\n tool-renderers.test.ts\n xml-stream-parser.test.ts\n agent-validation.ts\n analytics.ts\n detect-shell.ts\n git.ts\n logger.ts\n rage-detector.ts\n spinner.ts\n suppress-console.ts\n system-info.ts\n terminal.ts\n tool-renderers.ts\n with-hang-detection.ts\n xml-stream-parser.ts\n workers/\n checkpoint-worker.ts\n project-context.ts\n background-process-manager.ts\n browser-runner.ts\n chat-storage.ts\n cli-definitions.ts\n cli.ts\n client.ts\n config.ts\n create-template-project.ts\n credentials.ts\n dev-process-manager.ts\n diff-manager.ts\n fingerprint.ts\n index.ts\n menu.ts\n project-files.ts\n rage-detectors.ts\n startup-process-handler.ts\n subagent-storage.ts\n tool-handlers.ts\n types.ts\n web-scraper.ts\n .gitignore\n bunfig.toml\n package.json\n tsconfig.json\npackages/\n bigquery/\n src/\n client.ts\n index.ts\n schema.ts\n knowledge.md\n package.json\n tsconfig.json\n billing/\n src/\n __tests__/\n credit-delegation.test.ts\n extract-owner-repo.test.ts\n org-billing.test.ts\n auto-topup.ts\n balance-calculator.ts\n billing.knowledge.md\n conversion.ts\n credit-delegation.ts\n grant-credits.knowledge.md\n grant-credits.ts\n index.ts\n org-billing.ts\n org-monitoring.ts\n usage-service.ts\n utils.ts\n knowledge.md\n package.json\n project.json\n tsconfig.json\n build-tools/\n executors/\n infisical-run/\n executor.ts\n schema.json\n executors.json\n package.json\n project.json\n tsconfig.json\n code-map/\n __tests__/\n test-langs/\n test.c\n test.cpp\n test.cs\n test.go\n test.java\n test.js\n test.php\n test.py\n test.rb\n test.rs\n test.ts\n languages.test.ts\n parse.test.ts\n src/\n tree-sitter-queries/\n readme.md\n tree-sitter-c_sharp-tags.scm\n tree-sitter-c-tags.scm\n tree-sitter-cpp-tags.scm\n tree-sitter-go-tags.scm\n tree-sitter-java-tags.scm\n tree-sitter-javascript-tags.scm\n tree-sitter-php-tags.scm\n tree-sitter-python-tags.scm\n tree-sitter-ruby-tags.scm\n tree-sitter-rust-tags.scm\n tree-sitter-typescript-tags.scm\n index.ts\n languages.ts\n parse.ts\n package.json\n tsconfig.json\n internal/\n src/\n loops/\n client.ts\n index.ts\n types.ts\n openrouter-ai-sdk/\n internal/\n index.ts\n schemas/\n reasoning-details.ts\n types/\n index.ts\n openrouter-chat-completions-input.ts\n openrouter-chat-settings.ts\n .gitignore\n convert-to-openrouter-chat-messages.test.ts\n convert-to-openrouter-chat-messages.ts\n convert-to-openrouter-completion-prompt.ts\n index.ts\n map-openrouter-chat-logprobs.ts\n map-openrouter-completion-logprobs.ts\n map-openrouter-finish-reason.ts\n openrouter-chat-language-model.test.ts\n openrouter-chat-language-model.ts\n openrouter-completion-language-model.test.ts\n openrouter-completion-language-model.ts\n openrouter-completion-settings.ts\n openrouter-error.ts\n openrouter-facade.ts\n openrouter-provider-options.test.ts\n openrouter-provider.ts\n openrouter-stream-usage-accounting.test.ts\n openrouter-usage-accounting.test.ts\n utils/\n __tests__/\n version-utils.test.ts\n auth.ts\n version-utils.ts\n xml-parser.ts\n env.ts\n index.ts\n knowledge.md\n package.json\n tsconfig.json\npython-app/\n src/\n codebuff/\n __init__.py\n .gitignore\n knowledge.md\n LICENSE\n pyproject.toml\n README.md\nscripts/\n changelog/\n 2025-05-18-version-10283-release-enhanced-assistant-experience-system-stability.mdx\n 2025-05-25-version-10295-enhanced-ai-models-and-user-experience-improvements.mdx\n 2025-06-01-version-10305-release-enhanced-ai-models-new-commands-and-performance-improvements.mdx\n docs.json\n ft-file-selection/\n .gitignore\n collect-tuning-data.ts\n grade-traces.ts\n print-recent-relabels.ts\n print-recent-traces.ts\n README.md\n relabel-for-offline-scoring.ts\n relabel-traces-with-context.ts\n relabel-traces.ts\n .gitignore\n analyze-edit-blocks.ts\n analyze-model-usage.ts\n apply-credit-migration.ts\n calculate-average-spend.ts\n calculate-dau.ts\n calculate-monthly-usage.ts\n calculate-mrr.ts\n calculate-weekly-usage.ts\n cleanup-worktree.sh\n convert-escaped-newlines.ts\n count-edit-file.ts\n debug-log-subset.ts\n dev.sh\n export-user-emails.ts\n generate-ci-env.js\n generate-tool-definitions.ts\n get-changelog.ts\n init-worktree.ts\n package.json\n tsconfig.json\n update-stripe-subscriptions.ts\nsdk/\n scripts/\n publish.js\n src/\n tools/\n change-file.ts\n read-files.ts\n types/\n agent-definition.ts\n tools.ts\n client.ts\n constants.ts\n index.ts\n process-stream.ts\n websocket-client.ts\n .npmignore\n CHANGELOG.md\n package.json\n PUBLISHING.md\n README.md\n tsconfig.json\nweb/\n public/\n codebuff-intro1.webm\n scripts/\n discord/\n index.ts\n register-commands.ts\n src/\n __tests__/\n e2e/\n home.spec.ts\n unit/\n home.spec.tsx\n actions/\n hello-action.ts\n app/\n [sponsee]/\n page.tsx\n admin/\n file-picker/\n page.tsx\n orgs/\n page.tsx\n traces/\n components/\n chat-message.tsx\n client-session-viewer.tsx\n empty-state.tsx\n error-boundary.tsx\n loading-skeletons.tsx\n timeline-chart.module.css\n timeline-chart.tsx\n trace-viewer.tsx\n utils/\n __tests__/\n trace-processing.test.ts\n trace-processing.ts\n page.tsx\n layout.tsx\n affiliates/\n actions.ts\n page.tsx\n agents/\n page.tsx\n api/\n admin/\n orgs/\n [orgId]/\n features/\n [feature]/\n route.ts\n export/\n route.ts\n route.ts\n relabel-for-user/\n route.ts\n traces/\n [clientRequestId]/\n messages/\n route.ts\n timeline/\n route.ts\n client/\n [clientId]/\n sessions/\n route.ts\n admin-auth.ts\n agents/\n [publisherId]/\n [agentId]/\n [version]/\n route.ts\n latest/\n route.ts\n publish/\n route.ts\n validate/\n route.ts\n route.ts\n api-keys/\n route.ts\n auth/\n [...nextauth]/\n auth-options.ts\n route.ts\n cli/\n code/\n route.ts\n logout/\n route.ts\n status/\n route.ts\n feed/\n route.ts\n git-evals/\n visibility/\n route.ts\n route.ts\n healthz/\n route.ts\n invites/\n [token]/\n route.ts\n orgs/\n [orgId]/\n alerts/\n [alertId]/\n dismiss/\n route.ts\n route.ts\n analytics/\n export/\n route.ts\n route.ts\n billing/\n setup/\n route.ts\n status/\n route.ts\n subscription/\n route.ts\n credits/\n route.ts\n invitations/\n [email]/\n resend/\n route.ts\n route.ts\n bulk/\n route.ts\n route.ts\n members/\n [userId]/\n route.ts\n route.ts\n monitoring/\n route.ts\n publishers/\n route.ts\n repos/\n [repoId]/\n route.ts\n route.ts\n settings/\n route.ts\n usage/\n export/\n route.ts\n route.ts\n route.ts\n slug/\n [slug]/\n route.ts\n route.ts\n publishers/\n [id]/\n organization/\n route.ts\n validate/\n route.ts\n route.ts\n referrals/\n [code]/\n route.ts\n helpers.ts\n route.ts\n stripe/\n buy-credits/\n route.ts\n webhook/\n route.ts\n upload/\n avatar/\n route.ts\n user/\n auto-topup/\n route.ts\n profile/\n route.ts\n usage/\n route.ts\n config/\n page.tsx\n docs/\n [category]/\n layout.tsx\n metadata.ts\n page.tsx\n layout.tsx\n page.tsx\n evals/\n evals-table.tsx\n page.tsx\n invites/\n [token]/\n page.tsx\n login/\n page.tsx\n onboard/\n page.tsx\n orgs/\n [slug]/\n analytics/\n page.tsx\n billing/\n purchase/\n page.tsx\n setup/\n page.tsx\n repositories/\n page.tsx\n settings/\n page.tsx\n team/\n page.tsx\n usage/\n page.tsx\n page.tsx\n new/\n page.tsx\n page.tsx\n payment-success/\n page.tsx\n pricing/\n page.tsx\n privacy-policy/\n page.tsx\n publishers/\n [id]/\n agents/\n [agentId]/\n [version]/\n page.tsx\n page.tsx\n new/\n page.tsx\n page.tsx\n referrals/\n [code]/\n metadata.ts\n page.tsx\n layout.tsx\n page.tsx\n terms-of-service/\n page.tsx\n usage/\n layout.tsx\n page.tsx\n usage-display.tsx\n analytics.knowledge.md\n layout.tsx\n page.tsx\n robots.ts\n sitemap.ts\n components/\n agent/\n json-viewer.tsx\n auto-topup/\n AutoTopupSettings.tsx\n AutoTopupSettingsForm.tsx\n AutoTopupSwitch.tsx\n BaseAutoTopupSettings.tsx\n BaseAutoTopupSettingsForm.tsx\n BaseAutoTopupSwitch.tsx\n constants.ts\n OrgAutoTopupSettings.tsx\n OrgAutoTopupSettingsForm.tsx\n OrgAutoTopupSwitch.tsx\n types.ts\n credits/\n CreditManagementSection.tsx\n CreditPurchaseSection.tsx\n docs/\n mdx/\n code-demo.tsx\n custom-link.tsx\n markdown-table.tsx\n mdx-components.tsx\n mermaid-diagram.tsx\n schema-display.tsx\n copy-heading.tsx\n doc-sidebar.tsx\n docs.knowledge.md\n toc.tsx\n login/\n login-card.tsx\n login-client-wrapper.tsx\n navbar/\n navbar.tsx\n user-dropdown.tsx\n organization/\n advanced-monitor.tsx\n billing-alerts.tsx\n billing-reports.tsx\n billing-status.tsx\n credit-monitor.tsx\n model-config-sheet.tsx\n organization-success-modal.tsx\n repository-management.tsx\n team-management.tsx\n providers/\n query-client-provider.tsx\n publisher/\n basic-info-step.tsx\n ownership-step.tsx\n profile-details-step.tsx\n step-template.tsx\n sign-in/\n sign-in-button.tsx\n sign-in-card-footer.tsx\n ui/\n landing/\n competition/\n claude-code.tsx\n cline.tsx\n cursor.tsx\n github-copilot.tsx\n index.tsx\n tabs.tsx\n feature/\n browser-comparison.tsx\n chart-illustration.tsx\n code-illustration.tsx\n highlight-text.tsx\n index.tsx\n workflow-illustration.tsx\n animated-element.tsx\n constants.ts\n cta-section.tsx\n demo-code-display.tsx\n testimonials-section.tsx\n types.ts\n terminal/\n index.tsx\n style.css\n terminal-input.tsx\n terminal-output.tsx\n avatar-upload.tsx\n background-beams.tsx\n badge.tsx\n banner.tsx\n button.tsx\n card.tsx\n collapsible.tsx\n credit-confetti.tsx\n decorative-blocks.tsx\n dialog.tsx\n dropdown-menu.tsx\n enhanced-copy-button.tsx\n footer.tsx\n hero-buttons.tsx\n hero.tsx\n input.tsx\n install-dialog.tsx\n label.tsx\n neon-gradient-button.tsx\n progress.tsx\n radio-group.tsx\n section.tsx\n select.tsx\n separator.tsx\n sheet.tsx\n sidebar.tsx\n skeleton-loading.tsx\n skeleton.tsx\n slider.tsx\n switch.tsx\n table.tsx\n tabs.tsx\n textarea.tsx\n toast.tsx\n toaster.tsx\n tooltip.tsx\n use-toast.ts\n BrowserPreview.tsx\n card-with-beams.tsx\n CookieConsentCard.tsx\n footer.tsx\n icons.tsx\n IDEDemo.tsx\n layout-wrapper.tsx\n TerminalDemo.tsx\n theme-provider.tsx\n theme-switcher.tsx\n content/\n advanced/\n claude-code-comparison.mdx\n config.mdx\n how-does-it-work.mdx\n large-projects.mdx\n troubleshooting.mdx\n what-models.mdx\n agents/\n agent-reference.mdx\n creating-new-agents.mdx\n customizing-agents.mdx\n overview.mdx\n troubleshooting-agent-customization.mdx\n case-studies/\n _cta.mdx\n benjamin-bryant.mdx\n oliver-lukesch.mdx\n help/\n faq.mdx\n getting-started.mdx\n tips/\n best-practices.mdx\n keyboard-shortcuts.mdx\n knowledge-files.mdx\n other-use-cases.mdx\n version-control.mdx\n where-codebuff-shines.mdx\n discord/\n client.ts\n rate-limiter.ts\n hooks/\n use-auto-topup.ts\n use-install-dialog.ts\n use-mobile.tsx\n use-model-config.ts\n use-org-auto-topup.ts\n use-organization-data.ts\n use-user-profile.ts\n lib/\n server/\n referral.ts\n validators/\n publisher.ts\n admin-auth.ts\n constant.ts\n currency.ts\n docs.ts\n fonts.ts\n organization-permissions.ts\n PostHogProvider.tsx\n publisher-permissions.ts\n remark-code-to-codedemo.ts\n server-init.ts\n SessionProvider.tsx\n stripe-utils.ts\n testimonials.ts\n trackConversions.ts\n utils.ts\n styles/\n globals.css\n types/\n docs.ts\n user.ts\n util/\n logger.ts\n .eslintignore\n .eslintrc.js\n .gitignore\n .prettierignore\n .prettierrc.js\n commitlint.config.js\n components.json\n contentlayer.config.ts\n jest.config.js\n jest.setup.js\n knowledge.md\n next.config.mjs\n package.json\n playwright.config.ts\n postcss.config.cjs\n README.md\n tailwind.config.ts\n tsconfig.json\n.envrc\n.gitignore\n.infisical.json\n.prettierrc\nauthentication.knowledge.md\nbun.lock\nbunfig.toml\ncodebuff.json\neslint.config.js\nknowledge.md\npackage.json\nREADME.md\ntsconfig.base.json\ntsconfig.json\nWINDOWS.md\n", - "tokenCount": 9007, - "truncationLevel": "none" - } - ] - } - ], - "parentAgentId": "D-OgWSwaG9Q" - }, - { - "type": "tool_call", - "toolCallId": "2ab4337f-6692-4efa-a912-0d2f266b2351", - "toolName": "read_subtree", - "input": { - "paths": [], - "maxTokens": 500000 - }, - "agentId": "D-OgbZG1Kis", - "parentAgentId": "D-OfY_tExks", - "includeToolCall": true - }, - { - "type": "tool_result", - "toolCallId": "2ab4337f-6692-4efa-a912-0d2f266b2351", - "toolName": "read_subtree", - "output": [ - { - "type": "json", - "value": [ - { - "path": ".", - "type": "directory", - "printedTree": ".agents/\n examples/\n diff-reviewer-1.ts\n diff-reviewer-2.ts\n diff-reviewer-3.ts\n opensource/\n base.ts\n coder.ts\n file-picker.ts\n researcher.ts\n reviewer.ts\n thinker.ts\n ask.ts\n base-experimental.ts\n base-lite.ts\n base-max.ts\n base.ts\n brainstormer.ts\n changes-reviewer.ts\n charles.ts\n claude4-gemini-thinking.ts\n constants.ts\n file-explorer.ts\n file-picker.ts\n git-committer.ts\n knowledge-keeper.ts\n planner.ts\n researcher.ts\n reviewer.ts\n superagent.ts\n thinker.ts\n.bin/\n bun\n.github/\n workflows/\n ci.yml\n evals.yml\n nightly-evals.yml\n npm-app-release-build.yml\n npm-app-release-prod.yml\n npm-app-release-staging.yml\n .gitignore\n CODEOWNERS\n knowledge.md\n.vscode/\n settings.json\nbackend/\n src/\n __tests__/\n test-data/\n dex-go/\n edit-snippet.go\n expected.go\n original.go\n agent-id-resolution.test.ts\n agent-registry.test.ts\n auto-topup.test.ts\n credit-conversion.test.ts\n fast-rewrite.test.ts\n generate-diffs-prompt.test.ts\n get-custom-file-picker-config.test.ts\n live-user-inputs.test.ts\n loop-agent-steps.test.ts\n main-prompt.integration.test.ts\n main-prompt.test.ts\n process-file-block.test.ts\n process-str-replace.test.ts\n read-docs-tool.test.ts\n request-files-prompt.test.ts\n run-agent-step-tools.test.ts\n run-programmatic-step.test.ts\n sandbox-generator.test.ts\n subagent-streaming.test.ts\n test-utils.ts\n tool-call-schema.test.ts\n usage-calculation.test.ts\n web-search-tool.test.ts\n xml-stream-parser.test.ts\n admin/\n grade-runs.ts\n relabelRuns.ts\n api/\n org.ts\n usage.ts\n context/\n app-context.ts\n find-files/\n check-new-files-necessary.ts\n custom-file-picker-config.ts\n request-files-prompt.ts\n llm-apis/\n __tests__/\n linkup-api.test.ts\n vercel-ai-sdk/\n ai-sdk.ts\n openrouter.ts\n vertex-finetuned.ts\n claude.ts\n context7-api.ts\n gemini-with-fallbacks.ts\n knowledge.md\n linkup-api.ts\n message-cost-tracker.ts\n openai-api.ts\n openrouter.ts\n relace-api.ts\n system-prompt/\n agent-instructions.md\n prompts.ts\n save-agent-request.ts\n search-system-prompt.ts\n truncate-file-tree.ts\n templates/\n agents/\n archive/\n dry-run.ts\n agent-builder.ts\n ask.ts\n base.ts\n file-explorer.ts\n file-picker.ts\n planner.ts\n researcher.ts\n reviewer.ts\n superagent.ts\n thinker.ts\n thinking-base.ts\n agent-list.ts\n agent-registry.ts\n ask-prompts.ts\n base-prompts.ts\n prompts.ts\n README.md\n strings.ts\n types.ts\n tools/\n definitions/\n tool/\n add-message.ts\n add-subgoal.ts\n browser-logs.ts\n code-search.ts\n create-plan.ts\n end-turn.ts\n find-files.ts\n read-docs.ts\n read-files.ts\n run-file-change-hooks.ts\n run-terminal-command.ts\n set-messages.ts\n set-output.ts\n spawn-agent-inline.ts\n spawn-agents-async.ts\n spawn-agents.ts\n str-replace.ts\n think-deeply.ts\n update-subgoal.ts\n web-search.ts\n write-file.ts\n list.ts\n tool-def-type.ts\n handlers/\n tool/\n add-message.ts\n add-subgoal.ts\n browser-logs.ts\n code-search.ts\n create-plan.ts\n end-turn.ts\n find-files.ts\n read-docs.ts\n read-files.ts\n run-file-change-hooks.ts\n run-terminal-command.ts\n set-messages.ts\n set-output.ts\n spawn-agent-inline.ts\n spawn-agents-async.ts\n spawn-agents.ts\n str-replace.ts\n think-deeply.ts\n update-subgoal.ts\n web-search.ts\n write-file.ts\n handler-function-type.ts\n list.ts\n constants.ts\n prompts.ts\n stream-parser.ts\n tool-executor.ts\n util/\n __tests__/\n messages.test.ts\n object.test.ts\n parse-tool-call-xml.test.ts\n simplify-tool-results.test.ts\n split-data.test.ts\n check-auth.ts\n debug.ts\n file-resolver.ts\n logger.ts\n messages.ts\n object.ts\n parse-tool-call-xml.ts\n quickjs-sandbox.ts\n simplify-tool-results.ts\n split-data.ts\n token-counter.ts\n websockets/\n auth.ts\n middleware.ts\n request-context.ts\n server.ts\n switchboard.ts\n websocket-action.ts\n async-agent-manager.ts\n check-terminal-command.ts\n fast-rewrite.ts\n generate-diffs-prompt.ts\n get-documentation-for-query.ts\n get-file-reading-updates.ts\n index.ts\n live-user-inputs.ts\n loop-main-prompt.ts\n main-prompt.ts\n process-file-block.ts\n process-str-replace.ts\n prompt-agent-stream.ts\n run-agent-step.ts\n run-programmatic-step.ts\n xml-stream-parser.ts\n .gitignore\n knowledge.md\n package.json\n README.md\n tsconfig.json\ncommon/\n src/\n __tests__/\n agent-validation.test.ts\n dynamic-agent-template-schema.test.ts\n handlesteps-parsing.test.ts\n api-keys/\n constants.ts\n crypto.ts\n constants/\n agents.ts\n analytics-events.ts\n grant-priorities.ts\n db/\n migrations/\n meta/\n _journal.json\n 0000_snapshot.json\n 0001_snapshot.json\n 0002_snapshot.json\n 0003_snapshot.json\n 0004_snapshot.json\n 0005_snapshot.json\n 0006_snapshot.json\n 0007_snapshot.json\n 0008_snapshot.json\n 0009_snapshot.json\n 0010_snapshot.json\n 0011_snapshot.json\n 0012_snapshot.json\n 0013_snapshot.json\n 0014_snapshot.json\n 0015_snapshot.json\n 0016_snapshot.json\n 0017_snapshot.json\n 0018_snapshot.json\n 0019_snapshot.json\n 0020_snapshot.json\n 0021_snapshot.json\n 0026_snapshot.json\n 0027_snapshot.json\n 0028_snapshot.json\n 0000_overjoyed_thing.sql\n 0001_fuzzy_typhoid_mary.sql\n 0002_sticky_dormammu.sql\n 0003_military_owl.sql\n 0004_neat_pet_avengers.sql\n 0005_minor_the_professor.sql\n 0006_first_quasimodo.sql\n 0007_equal_warlock.sql\n 0008_puzzling_carnage.sql\n 0009_bitter_rumiko_fujikawa.sql\n 0010_overjoyed_red_skull.sql\n 0011_familiar_ezekiel_stane.sql\n 0012_fluffy_naoko.sql\n 0013_famous_risque.sql\n 0014_wakeful_sinister_six.sql\n 0015_stormy_zuras.sql\n 0016_clear_hairball.sql\n 0017_tricky_randall_flagg.sql\n 0018_stale_human_robot.sql\n 0019_amused_nebula.sql\n 0020_young_sleeper.sql\n 0021_tiny_marauders.sql\n 0026_chilly_mockingbird.sql\n 0027_sloppy_quasar.sql\n 0028_lush_johnny_blaze.sql\n docker-compose.yml\n drizzle.config.ts\n index.ts\n schema.knowledge.md\n schema.ts\n transaction.ts\n json-config/\n __tests__/\n __snapshots__/\n stringify-schema.test.ts.snap\n constants.test.ts\n stringify-schema.test.ts\n constants.ts\n default.ts\n stringify-schema.ts\n templates/\n agent-validation.ts\n dynamic-agent-functions.ts\n testing/\n mock-modules.ts\n tools/\n params/\n tool/\n add-message.ts\n add-subgoal.ts\n browser-logs.ts\n code-search.ts\n create-plan.ts\n end-turn.ts\n find-files.ts\n read-docs.ts\n read-files.ts\n run-file-change-hooks.ts\n run-terminal-command.ts\n set-messages.ts\n set-output.ts\n spawn-agent-inline.ts\n spawn-agents-async.ts\n spawn-agents.ts\n str-replace.ts\n think-deeply.ts\n update-subgoal.ts\n web-search.ts\n write-file.ts\n compile-tool-definitions.ts\n constants.ts\n list.ts\n utils.ts\n types/\n __tests__/\n dynamic-agent-template.test.ts\n api/\n agents/\n publish.ts\n agent-template.ts\n dynamic-agent-template.ts\n grant.ts\n message.ts\n organization.ts\n print-mode.ts\n publisher.ts\n referral.ts\n session-state.ts\n usage.ts\n util/\n __tests__/\n messages.test.ts\n partial-json-delta.test.ts\n saxy.test.ts\n string.test.ts\n examples/\n diff-reviewer-1.ts\n diff-reviewer-2.ts\n diff-reviewer-3.ts\n agent-file-utils.ts\n agent-name-normalization.ts\n agent-name-resolver.ts\n agent-template-validation.ts\n array.ts\n changes.ts\n credentials.ts\n currency.ts\n dates.ts\n error.ts\n file.ts\n git.ts\n logger.ts\n lru-cache.ts\n messages.ts\n min-heap.ts\n model-utils.ts\n object.ts\n partial-json-delta.ts\n patch.ts\n promise.ts\n random.ts\n referral.ts\n saxy.ts\n string.knowledge.md\n string.ts\n stripe.ts\n sync-failure.ts\n xml.ts\n zod-schema.ts\n websockets/\n websocket-client.ts\n websocket-schema.ts\n actions.ts\n analytics.ts\n browser-actions.ts\n constants.ts\n project-file-tree.ts\n knowledge.md\n package.json\n tsconfig.json\nevals/\n git-evals/\n email-eval-results.ts\n eval-codebuff.json\n eval-manifold.json\n eval-result-codebuff-mock.json\n gen-evals.ts\n judge-git-eval.ts\n post-eval-analysis.ts\n run-eval-set.ts\n run-git-evals.ts\n run-single-eval-process.ts\n run-single-eval.ts\n setup-test-repo.ts\n types.ts\n .gitignore\n bun.lock\n constants.ts\n e2e-cat-app-script.ts\n knowledge.md\n package.json\n scaffolding.ts\n swe-bench-eval.ts\n swe-bench-ids.ts\n swe-bench.test.ts\n test-repos.json\n test-setup.ts\n tsconfig.json\nnpm-app/\n release/\n index.js\n package.json\n README.md\n release-staging/\n index.js\n package.json\n README.md\n scripts/\n build-binary.js\n generate-github-token.ts\n patch-web-tree-sitter.ts\n release.js\n twitch-plays-codebuff.sh\n src/\n __tests__/\n display.test.ts\n tool-handlers.test.ts\n agents/\n agent-utils.ts\n load-agents.ts\n checkpoints/\n checkpoint-manager.ts\n file-manager.ts\n cli-handlers/\n agent-creation-chat.ts\n agents.ts\n api-key.ts\n checkpoint.ts\n diff.ts\n easter-egg.ts\n inititalization-flow.ts\n mini-chat.ts\n publish.ts\n subagent-list.ts\n subagent.ts\n display/\n overrides.ts\n print-mode.ts\n squash-newlines.ts\n json-config/\n hooks.ts\n parser.ts\n native/\n ripgrep.ts\n terminal/\n background.ts\n run-command.ts\n utils/\n __tests__/\n __snapshots__/\n background-process-manager.test.ts.snap\n frustration-detector.test.ts.snap\n rage-detector.test.ts.snap\n xml-stream-parser.test.ts.snap\n background-process-manager.test.ts\n rage-detector.test.ts\n response-example-4-files.txt\n tool-renderers.test.ts\n xml-stream-parser.test.ts\n agent-validation.ts\n analytics.ts\n detect-shell.ts\n git.ts\n logger.ts\n rage-detector.ts\n spinner.ts\n suppress-console.ts\n system-info.ts\n terminal.ts\n tool-renderers.ts\n with-hang-detection.ts\n xml-stream-parser.ts\n workers/\n checkpoint-worker.ts\n project-context.ts\n background-process-manager.ts\n browser-runner.ts\n chat-storage.ts\n cli-definitions.ts\n cli.ts\n client.ts\n config.ts\n create-template-project.ts\n credentials.ts\n dev-process-manager.ts\n diff-manager.ts\n fingerprint.ts\n index.ts\n menu.ts\n project-files.ts\n rage-detectors.ts\n startup-process-handler.ts\n subagent-storage.ts\n tool-handlers.ts\n types.ts\n web-scraper.ts\n .gitignore\n bunfig.toml\n package.json\n tsconfig.json\npackages/\n bigquery/\n src/\n client.ts\n index.ts\n schema.ts\n knowledge.md\n package.json\n tsconfig.json\n billing/\n src/\n __tests__/\n credit-delegation.test.ts\n extract-owner-repo.test.ts\n org-billing.test.ts\n auto-topup.ts\n balance-calculator.ts\n billing.knowledge.md\n conversion.ts\n credit-delegation.ts\n grant-credits.knowledge.md\n grant-credits.ts\n index.ts\n org-billing.ts\n org-monitoring.ts\n usage-service.ts\n utils.ts\n knowledge.md\n package.json\n project.json\n tsconfig.json\n build-tools/\n executors/\n infisical-run/\n executor.ts\n schema.json\n executors.json\n package.json\n project.json\n tsconfig.json\n code-map/\n __tests__/\n test-langs/\n test.c\n test.cpp\n test.cs\n test.go\n test.java\n test.js\n test.php\n test.py\n test.rb\n test.rs\n test.ts\n languages.test.ts\n parse.test.ts\n src/\n tree-sitter-queries/\n readme.md\n tree-sitter-c_sharp-tags.scm\n tree-sitter-c-tags.scm\n tree-sitter-cpp-tags.scm\n tree-sitter-go-tags.scm\n tree-sitter-java-tags.scm\n tree-sitter-javascript-tags.scm\n tree-sitter-php-tags.scm\n tree-sitter-python-tags.scm\n tree-sitter-ruby-tags.scm\n tree-sitter-rust-tags.scm\n tree-sitter-typescript-tags.scm\n index.ts\n languages.ts\n parse.ts\n package.json\n tsconfig.json\n internal/\n src/\n loops/\n client.ts\n index.ts\n types.ts\n openrouter-ai-sdk/\n internal/\n index.ts\n schemas/\n reasoning-details.ts\n types/\n index.ts\n openrouter-chat-completions-input.ts\n openrouter-chat-settings.ts\n .gitignore\n convert-to-openrouter-chat-messages.test.ts\n convert-to-openrouter-chat-messages.ts\n convert-to-openrouter-completion-prompt.ts\n index.ts\n map-openrouter-chat-logprobs.ts\n map-openrouter-completion-logprobs.ts\n map-openrouter-finish-reason.ts\n openrouter-chat-language-model.test.ts\n openrouter-chat-language-model.ts\n openrouter-completion-language-model.test.ts\n openrouter-completion-language-model.ts\n openrouter-completion-settings.ts\n openrouter-error.ts\n openrouter-facade.ts\n openrouter-provider-options.test.ts\n openrouter-provider.ts\n openrouter-stream-usage-accounting.test.ts\n openrouter-usage-accounting.test.ts\n utils/\n __tests__/\n version-utils.test.ts\n auth.ts\n version-utils.ts\n xml-parser.ts\n env.ts\n index.ts\n knowledge.md\n package.json\n tsconfig.json\npython-app/\n src/\n codebuff/\n __init__.py\n .gitignore\n knowledge.md\n LICENSE\n pyproject.toml\n README.md\nscripts/\n changelog/\n 2025-05-18-version-10283-release-enhanced-assistant-experience-system-stability.mdx\n 2025-05-25-version-10295-enhanced-ai-models-and-user-experience-improvements.mdx\n 2025-06-01-version-10305-release-enhanced-ai-models-new-commands-and-performance-improvements.mdx\n docs.json\n ft-file-selection/\n .gitignore\n collect-tuning-data.ts\n grade-traces.ts\n print-recent-relabels.ts\n print-recent-traces.ts\n README.md\n relabel-for-offline-scoring.ts\n relabel-traces-with-context.ts\n relabel-traces.ts\n .gitignore\n analyze-edit-blocks.ts\n analyze-model-usage.ts\n apply-credit-migration.ts\n calculate-average-spend.ts\n calculate-dau.ts\n calculate-monthly-usage.ts\n calculate-mrr.ts\n calculate-weekly-usage.ts\n cleanup-worktree.sh\n convert-escaped-newlines.ts\n count-edit-file.ts\n debug-log-subset.ts\n dev.sh\n export-user-emails.ts\n generate-ci-env.js\n generate-tool-definitions.ts\n get-changelog.ts\n init-worktree.ts\n package.json\n tsconfig.json\n update-stripe-subscriptions.ts\nsdk/\n scripts/\n publish.js\n src/\n tools/\n change-file.ts\n read-files.ts\n types/\n agent-definition.ts\n tools.ts\n client.ts\n constants.ts\n index.ts\n process-stream.ts\n websocket-client.ts\n .npmignore\n CHANGELOG.md\n package.json\n PUBLISHING.md\n README.md\n tsconfig.json\nweb/\n public/\n codebuff-intro1.webm\n scripts/\n discord/\n index.ts\n register-commands.ts\n src/\n __tests__/\n e2e/\n home.spec.ts\n unit/\n home.spec.tsx\n actions/\n hello-action.ts\n app/\n [sponsee]/\n page.tsx\n admin/\n file-picker/\n page.tsx\n orgs/\n page.tsx\n traces/\n components/\n chat-message.tsx\n client-session-viewer.tsx\n empty-state.tsx\n error-boundary.tsx\n loading-skeletons.tsx\n timeline-chart.module.css\n timeline-chart.tsx\n trace-viewer.tsx\n utils/\n __tests__/\n trace-processing.test.ts\n trace-processing.ts\n page.tsx\n layout.tsx\n affiliates/\n actions.ts\n page.tsx\n agents/\n page.tsx\n api/\n admin/\n orgs/\n [orgId]/\n features/\n [feature]/\n route.ts\n export/\n route.ts\n route.ts\n relabel-for-user/\n route.ts\n traces/\n [clientRequestId]/\n messages/\n route.ts\n timeline/\n route.ts\n client/\n [clientId]/\n sessions/\n route.ts\n admin-auth.ts\n agents/\n [publisherId]/\n [agentId]/\n [version]/\n route.ts\n latest/\n route.ts\n publish/\n route.ts\n validate/\n route.ts\n route.ts\n api-keys/\n route.ts\n auth/\n [...nextauth]/\n auth-options.ts\n route.ts\n cli/\n code/\n route.ts\n logout/\n route.ts\n status/\n route.ts\n feed/\n route.ts\n git-evals/\n visibility/\n route.ts\n route.ts\n healthz/\n route.ts\n invites/\n [token]/\n route.ts\n orgs/\n [orgId]/\n alerts/\n [alertId]/\n dismiss/\n route.ts\n route.ts\n analytics/\n export/\n route.ts\n route.ts\n billing/\n setup/\n route.ts\n status/\n route.ts\n subscription/\n route.ts\n credits/\n route.ts\n invitations/\n [email]/\n resend/\n route.ts\n route.ts\n bulk/\n route.ts\n route.ts\n members/\n [userId]/\n route.ts\n route.ts\n monitoring/\n route.ts\n publishers/\n route.ts\n repos/\n [repoId]/\n route.ts\n route.ts\n settings/\n route.ts\n usage/\n export/\n route.ts\n route.ts\n route.ts\n slug/\n [slug]/\n route.ts\n route.ts\n publishers/\n [id]/\n organization/\n route.ts\n validate/\n route.ts\n route.ts\n referrals/\n [code]/\n route.ts\n helpers.ts\n route.ts\n stripe/\n buy-credits/\n route.ts\n webhook/\n route.ts\n upload/\n avatar/\n route.ts\n user/\n auto-topup/\n route.ts\n profile/\n route.ts\n usage/\n route.ts\n config/\n page.tsx\n docs/\n [category]/\n layout.tsx\n metadata.ts\n page.tsx\n layout.tsx\n page.tsx\n evals/\n evals-table.tsx\n page.tsx\n invites/\n [token]/\n page.tsx\n login/\n page.tsx\n onboard/\n page.tsx\n orgs/\n [slug]/\n analytics/\n page.tsx\n billing/\n purchase/\n page.tsx\n setup/\n page.tsx\n repositories/\n page.tsx\n settings/\n page.tsx\n team/\n page.tsx\n usage/\n page.tsx\n page.tsx\n new/\n page.tsx\n page.tsx\n payment-success/\n page.tsx\n pricing/\n page.tsx\n privacy-policy/\n page.tsx\n publishers/\n [id]/\n agents/\n [agentId]/\n [version]/\n page.tsx\n page.tsx\n new/\n page.tsx\n page.tsx\n referrals/\n [code]/\n metadata.ts\n page.tsx\n layout.tsx\n page.tsx\n terms-of-service/\n page.tsx\n usage/\n layout.tsx\n page.tsx\n usage-display.tsx\n analytics.knowledge.md\n layout.tsx\n page.tsx\n robots.ts\n sitemap.ts\n components/\n agent/\n json-viewer.tsx\n auto-topup/\n AutoTopupSettings.tsx\n AutoTopupSettingsForm.tsx\n AutoTopupSwitch.tsx\n BaseAutoTopupSettings.tsx\n BaseAutoTopupSettingsForm.tsx\n BaseAutoTopupSwitch.tsx\n constants.ts\n OrgAutoTopupSettings.tsx\n OrgAutoTopupSettingsForm.tsx\n OrgAutoTopupSwitch.tsx\n types.ts\n credits/\n CreditManagementSection.tsx\n CreditPurchaseSection.tsx\n docs/\n mdx/\n code-demo.tsx\n custom-link.tsx\n markdown-table.tsx\n mdx-components.tsx\n mermaid-diagram.tsx\n schema-display.tsx\n copy-heading.tsx\n doc-sidebar.tsx\n docs.knowledge.md\n toc.tsx\n login/\n login-card.tsx\n login-client-wrapper.tsx\n navbar/\n navbar.tsx\n user-dropdown.tsx\n organization/\n advanced-monitor.tsx\n billing-alerts.tsx\n billing-reports.tsx\n billing-status.tsx\n credit-monitor.tsx\n model-config-sheet.tsx\n organization-success-modal.tsx\n repository-management.tsx\n team-management.tsx\n providers/\n query-client-provider.tsx\n publisher/\n basic-info-step.tsx\n ownership-step.tsx\n profile-details-step.tsx\n step-template.tsx\n sign-in/\n sign-in-button.tsx\n sign-in-card-footer.tsx\n ui/\n landing/\n competition/\n claude-code.tsx\n cline.tsx\n cursor.tsx\n github-copilot.tsx\n index.tsx\n tabs.tsx\n feature/\n browser-comparison.tsx\n chart-illustration.tsx\n code-illustration.tsx\n highlight-text.tsx\n index.tsx\n workflow-illustration.tsx\n animated-element.tsx\n constants.ts\n cta-section.tsx\n demo-code-display.tsx\n testimonials-section.tsx\n types.ts\n terminal/\n index.tsx\n style.css\n terminal-input.tsx\n terminal-output.tsx\n avatar-upload.tsx\n background-beams.tsx\n badge.tsx\n banner.tsx\n button.tsx\n card.tsx\n collapsible.tsx\n credit-confetti.tsx\n decorative-blocks.tsx\n dialog.tsx\n dropdown-menu.tsx\n enhanced-copy-button.tsx\n footer.tsx\n hero-buttons.tsx\n hero.tsx\n input.tsx\n install-dialog.tsx\n label.tsx\n neon-gradient-button.tsx\n progress.tsx\n radio-group.tsx\n section.tsx\n select.tsx\n separator.tsx\n sheet.tsx\n sidebar.tsx\n skeleton-loading.tsx\n skeleton.tsx\n slider.tsx\n switch.tsx\n table.tsx\n tabs.tsx\n textarea.tsx\n toast.tsx\n toaster.tsx\n tooltip.tsx\n use-toast.ts\n BrowserPreview.tsx\n card-with-beams.tsx\n CookieConsentCard.tsx\n footer.tsx\n icons.tsx\n IDEDemo.tsx\n layout-wrapper.tsx\n TerminalDemo.tsx\n theme-provider.tsx\n theme-switcher.tsx\n content/\n advanced/\n claude-code-comparison.mdx\n config.mdx\n how-does-it-work.mdx\n large-projects.mdx\n troubleshooting.mdx\n what-models.mdx\n agents/\n agent-reference.mdx\n creating-new-agents.mdx\n customizing-agents.mdx\n overview.mdx\n troubleshooting-agent-customization.mdx\n case-studies/\n _cta.mdx\n benjamin-bryant.mdx\n oliver-lukesch.mdx\n help/\n faq.mdx\n getting-started.mdx\n tips/\n best-practices.mdx\n keyboard-shortcuts.mdx\n knowledge-files.mdx\n other-use-cases.mdx\n version-control.mdx\n where-codebuff-shines.mdx\n discord/\n client.ts\n rate-limiter.ts\n hooks/\n use-auto-topup.ts\n use-install-dialog.ts\n use-mobile.tsx\n use-model-config.ts\n use-org-auto-topup.ts\n use-organization-data.ts\n use-user-profile.ts\n lib/\n server/\n referral.ts\n validators/\n publisher.ts\n admin-auth.ts\n constant.ts\n currency.ts\n docs.ts\n fonts.ts\n organization-permissions.ts\n PostHogProvider.tsx\n publisher-permissions.ts\n remark-code-to-codedemo.ts\n server-init.ts\n SessionProvider.tsx\n stripe-utils.ts\n testimonials.ts\n trackConversions.ts\n utils.ts\n styles/\n globals.css\n types/\n docs.ts\n user.ts\n util/\n logger.ts\n .eslintignore\n .eslintrc.js\n .gitignore\n .prettierignore\n .prettierrc.js\n commitlint.config.js\n components.json\n contentlayer.config.ts\n jest.config.js\n jest.setup.js\n knowledge.md\n next.config.mjs\n package.json\n playwright.config.ts\n postcss.config.cjs\n README.md\n tailwind.config.ts\n tsconfig.json\n.envrc\n.gitignore\n.infisical.json\n.prettierrc\nauthentication.knowledge.md\nbun.lock\nbunfig.toml\ncodebuff.json\neslint.config.js\nknowledge.md\npackage.json\nREADME.md\ntsconfig.base.json\ntsconfig.json\nWINDOWS.md\n", - "tokenCount": 9007, - "truncationLevel": "none" - } - ] - } - ], - "parentAgentId": "D-OgbZG1Kis" - }, - { - "type": "tool_call", - "toolCallId": "e8dd6cc1-5286-429f-8a75-d4157a84c81f", - "toolName": "read_subtree", - "input": { - "paths": [], - "maxTokens": 500000 - }, - "agentId": "D-OgiVqb-lc", - "parentAgentId": "D-OfY8_NY2s", - "includeToolCall": true - }, - { - "type": "tool_result", - "toolCallId": "e8dd6cc1-5286-429f-8a75-d4157a84c81f", - "toolName": "read_subtree", - "output": [ - { - "type": "json", - "value": [ - { - "path": ".", - "type": "directory", - "printedTree": ".agents/\n examples/\n diff-reviewer-1.ts\n diff-reviewer-2.ts\n diff-reviewer-3.ts\n opensource/\n base.ts\n coder.ts\n file-picker.ts\n researcher.ts\n reviewer.ts\n thinker.ts\n ask.ts\n base-experimental.ts\n base-lite.ts\n base-max.ts\n base.ts\n brainstormer.ts\n changes-reviewer.ts\n charles.ts\n claude4-gemini-thinking.ts\n constants.ts\n file-explorer.ts\n file-picker.ts\n git-committer.ts\n knowledge-keeper.ts\n planner.ts\n researcher.ts\n reviewer.ts\n superagent.ts\n thinker.ts\n.bin/\n bun\n.github/\n workflows/\n ci.yml\n evals.yml\n nightly-evals.yml\n npm-app-release-build.yml\n npm-app-release-prod.yml\n npm-app-release-staging.yml\n .gitignore\n CODEOWNERS\n knowledge.md\n.vscode/\n settings.json\nbackend/\n src/\n __tests__/\n test-data/\n dex-go/\n edit-snippet.go\n expected.go\n original.go\n agent-id-resolution.test.ts\n agent-registry.test.ts\n auto-topup.test.ts\n credit-conversion.test.ts\n fast-rewrite.test.ts\n generate-diffs-prompt.test.ts\n get-custom-file-picker-config.test.ts\n live-user-inputs.test.ts\n loop-agent-steps.test.ts\n main-prompt.integration.test.ts\n main-prompt.test.ts\n process-file-block.test.ts\n process-str-replace.test.ts\n read-docs-tool.test.ts\n request-files-prompt.test.ts\n run-agent-step-tools.test.ts\n run-programmatic-step.test.ts\n sandbox-generator.test.ts\n subagent-streaming.test.ts\n test-utils.ts\n tool-call-schema.test.ts\n usage-calculation.test.ts\n web-search-tool.test.ts\n xml-stream-parser.test.ts\n admin/\n grade-runs.ts\n relabelRuns.ts\n api/\n org.ts\n usage.ts\n context/\n app-context.ts\n find-files/\n check-new-files-necessary.ts\n custom-file-picker-config.ts\n request-files-prompt.ts\n llm-apis/\n __tests__/\n linkup-api.test.ts\n vercel-ai-sdk/\n ai-sdk.ts\n openrouter.ts\n vertex-finetuned.ts\n claude.ts\n context7-api.ts\n gemini-with-fallbacks.ts\n knowledge.md\n linkup-api.ts\n message-cost-tracker.ts\n openai-api.ts\n openrouter.ts\n relace-api.ts\n system-prompt/\n agent-instructions.md\n prompts.ts\n save-agent-request.ts\n search-system-prompt.ts\n truncate-file-tree.ts\n templates/\n agents/\n archive/\n dry-run.ts\n agent-builder.ts\n ask.ts\n base.ts\n file-explorer.ts\n file-picker.ts\n planner.ts\n researcher.ts\n reviewer.ts\n superagent.ts\n thinker.ts\n thinking-base.ts\n agent-list.ts\n agent-registry.ts\n ask-prompts.ts\n base-prompts.ts\n prompts.ts\n README.md\n strings.ts\n types.ts\n tools/\n definitions/\n tool/\n add-message.ts\n add-subgoal.ts\n browser-logs.ts\n code-search.ts\n create-plan.ts\n end-turn.ts\n find-files.ts\n read-docs.ts\n read-files.ts\n run-file-change-hooks.ts\n run-terminal-command.ts\n set-messages.ts\n set-output.ts\n spawn-agent-inline.ts\n spawn-agents-async.ts\n spawn-agents.ts\n str-replace.ts\n think-deeply.ts\n update-subgoal.ts\n web-search.ts\n write-file.ts\n list.ts\n tool-def-type.ts\n handlers/\n tool/\n add-message.ts\n add-subgoal.ts\n browser-logs.ts\n code-search.ts\n create-plan.ts\n end-turn.ts\n find-files.ts\n read-docs.ts\n read-files.ts\n run-file-change-hooks.ts\n run-terminal-command.ts\n set-messages.ts\n set-output.ts\n spawn-agent-inline.ts\n spawn-agents-async.ts\n spawn-agents.ts\n str-replace.ts\n think-deeply.ts\n update-subgoal.ts\n web-search.ts\n write-file.ts\n handler-function-type.ts\n list.ts\n constants.ts\n prompts.ts\n stream-parser.ts\n tool-executor.ts\n util/\n __tests__/\n messages.test.ts\n object.test.ts\n parse-tool-call-xml.test.ts\n simplify-tool-results.test.ts\n split-data.test.ts\n check-auth.ts\n debug.ts\n file-resolver.ts\n logger.ts\n messages.ts\n object.ts\n parse-tool-call-xml.ts\n quickjs-sandbox.ts\n simplify-tool-results.ts\n split-data.ts\n token-counter.ts\n websockets/\n auth.ts\n middleware.ts\n request-context.ts\n server.ts\n switchboard.ts\n websocket-action.ts\n async-agent-manager.ts\n check-terminal-command.ts\n fast-rewrite.ts\n generate-diffs-prompt.ts\n get-documentation-for-query.ts\n get-file-reading-updates.ts\n index.ts\n live-user-inputs.ts\n loop-main-prompt.ts\n main-prompt.ts\n process-file-block.ts\n process-str-replace.ts\n prompt-agent-stream.ts\n run-agent-step.ts\n run-programmatic-step.ts\n xml-stream-parser.ts\n .gitignore\n knowledge.md\n package.json\n README.md\n tsconfig.json\ncommon/\n src/\n __tests__/\n agent-validation.test.ts\n dynamic-agent-template-schema.test.ts\n handlesteps-parsing.test.ts\n api-keys/\n constants.ts\n crypto.ts\n constants/\n agents.ts\n analytics-events.ts\n grant-priorities.ts\n db/\n migrations/\n meta/\n _journal.json\n 0000_snapshot.json\n 0001_snapshot.json\n 0002_snapshot.json\n 0003_snapshot.json\n 0004_snapshot.json\n 0005_snapshot.json\n 0006_snapshot.json\n 0007_snapshot.json\n 0008_snapshot.json\n 0009_snapshot.json\n 0010_snapshot.json\n 0011_snapshot.json\n 0012_snapshot.json\n 0013_snapshot.json\n 0014_snapshot.json\n 0015_snapshot.json\n 0016_snapshot.json\n 0017_snapshot.json\n 0018_snapshot.json\n 0019_snapshot.json\n 0020_snapshot.json\n 0021_snapshot.json\n 0026_snapshot.json\n 0027_snapshot.json\n 0028_snapshot.json\n 0000_overjoyed_thing.sql\n 0001_fuzzy_typhoid_mary.sql\n 0002_sticky_dormammu.sql\n 0003_military_owl.sql\n 0004_neat_pet_avengers.sql\n 0005_minor_the_professor.sql\n 0006_first_quasimodo.sql\n 0007_equal_warlock.sql\n 0008_puzzling_carnage.sql\n 0009_bitter_rumiko_fujikawa.sql\n 0010_overjoyed_red_skull.sql\n 0011_familiar_ezekiel_stane.sql\n 0012_fluffy_naoko.sql\n 0013_famous_risque.sql\n 0014_wakeful_sinister_six.sql\n 0015_stormy_zuras.sql\n 0016_clear_hairball.sql\n 0017_tricky_randall_flagg.sql\n 0018_stale_human_robot.sql\n 0019_amused_nebula.sql\n 0020_young_sleeper.sql\n 0021_tiny_marauders.sql\n 0026_chilly_mockingbird.sql\n 0027_sloppy_quasar.sql\n 0028_lush_johnny_blaze.sql\n docker-compose.yml\n drizzle.config.ts\n index.ts\n schema.knowledge.md\n schema.ts\n transaction.ts\n json-config/\n __tests__/\n __snapshots__/\n stringify-schema.test.ts.snap\n constants.test.ts\n stringify-schema.test.ts\n constants.ts\n default.ts\n stringify-schema.ts\n templates/\n agent-validation.ts\n dynamic-agent-functions.ts\n testing/\n mock-modules.ts\n tools/\n params/\n tool/\n add-message.ts\n add-subgoal.ts\n browser-logs.ts\n code-search.ts\n create-plan.ts\n end-turn.ts\n find-files.ts\n read-docs.ts\n read-files.ts\n run-file-change-hooks.ts\n run-terminal-command.ts\n set-messages.ts\n set-output.ts\n spawn-agent-inline.ts\n spawn-agents-async.ts\n spawn-agents.ts\n str-replace.ts\n think-deeply.ts\n update-subgoal.ts\n web-search.ts\n write-file.ts\n compile-tool-definitions.ts\n constants.ts\n list.ts\n utils.ts\n types/\n __tests__/\n dynamic-agent-template.test.ts\n api/\n agents/\n publish.ts\n agent-template.ts\n dynamic-agent-template.ts\n grant.ts\n message.ts\n organization.ts\n print-mode.ts\n publisher.ts\n referral.ts\n session-state.ts\n usage.ts\n util/\n __tests__/\n messages.test.ts\n partial-json-delta.test.ts\n saxy.test.ts\n string.test.ts\n examples/\n diff-reviewer-1.ts\n diff-reviewer-2.ts\n diff-reviewer-3.ts\n agent-file-utils.ts\n agent-name-normalization.ts\n agent-name-resolver.ts\n agent-template-validation.ts\n array.ts\n changes.ts\n credentials.ts\n currency.ts\n dates.ts\n error.ts\n file.ts\n git.ts\n logger.ts\n lru-cache.ts\n messages.ts\n min-heap.ts\n model-utils.ts\n object.ts\n partial-json-delta.ts\n patch.ts\n promise.ts\n random.ts\n referral.ts\n saxy.ts\n string.knowledge.md\n string.ts\n stripe.ts\n sync-failure.ts\n xml.ts\n zod-schema.ts\n websockets/\n websocket-client.ts\n websocket-schema.ts\n actions.ts\n analytics.ts\n browser-actions.ts\n constants.ts\n project-file-tree.ts\n knowledge.md\n package.json\n tsconfig.json\nevals/\n git-evals/\n email-eval-results.ts\n eval-codebuff.json\n eval-manifold.json\n eval-result-codebuff-mock.json\n gen-evals.ts\n judge-git-eval.ts\n post-eval-analysis.ts\n run-eval-set.ts\n run-git-evals.ts\n run-single-eval-process.ts\n run-single-eval.ts\n setup-test-repo.ts\n types.ts\n .gitignore\n bun.lock\n constants.ts\n e2e-cat-app-script.ts\n knowledge.md\n package.json\n scaffolding.ts\n swe-bench-eval.ts\n swe-bench-ids.ts\n swe-bench.test.ts\n test-repos.json\n test-setup.ts\n tsconfig.json\nnpm-app/\n release/\n index.js\n package.json\n README.md\n release-staging/\n index.js\n package.json\n README.md\n scripts/\n build-binary.js\n generate-github-token.ts\n patch-web-tree-sitter.ts\n release.js\n twitch-plays-codebuff.sh\n src/\n __tests__/\n display.test.ts\n tool-handlers.test.ts\n agents/\n agent-utils.ts\n load-agents.ts\n checkpoints/\n checkpoint-manager.ts\n file-manager.ts\n cli-handlers/\n agent-creation-chat.ts\n agents.ts\n api-key.ts\n checkpoint.ts\n diff.ts\n easter-egg.ts\n inititalization-flow.ts\n mini-chat.ts\n publish.ts\n subagent-list.ts\n subagent.ts\n display/\n overrides.ts\n print-mode.ts\n squash-newlines.ts\n json-config/\n hooks.ts\n parser.ts\n native/\n ripgrep.ts\n terminal/\n background.ts\n run-command.ts\n utils/\n __tests__/\n __snapshots__/\n background-process-manager.test.ts.snap\n frustration-detector.test.ts.snap\n rage-detector.test.ts.snap\n xml-stream-parser.test.ts.snap\n background-process-manager.test.ts\n rage-detector.test.ts\n response-example-4-files.txt\n tool-renderers.test.ts\n xml-stream-parser.test.ts\n agent-validation.ts\n analytics.ts\n detect-shell.ts\n git.ts\n logger.ts\n rage-detector.ts\n spinner.ts\n suppress-console.ts\n system-info.ts\n terminal.ts\n tool-renderers.ts\n with-hang-detection.ts\n xml-stream-parser.ts\n workers/\n checkpoint-worker.ts\n project-context.ts\n background-process-manager.ts\n browser-runner.ts\n chat-storage.ts\n cli-definitions.ts\n cli.ts\n client.ts\n config.ts\n create-template-project.ts\n credentials.ts\n dev-process-manager.ts\n diff-manager.ts\n fingerprint.ts\n index.ts\n menu.ts\n project-files.ts\n rage-detectors.ts\n startup-process-handler.ts\n subagent-storage.ts\n tool-handlers.ts\n types.ts\n web-scraper.ts\n .gitignore\n bunfig.toml\n package.json\n tsconfig.json\npackages/\n bigquery/\n src/\n client.ts\n index.ts\n schema.ts\n knowledge.md\n package.json\n tsconfig.json\n billing/\n src/\n __tests__/\n credit-delegation.test.ts\n extract-owner-repo.test.ts\n org-billing.test.ts\n auto-topup.ts\n balance-calculator.ts\n billing.knowledge.md\n conversion.ts\n credit-delegation.ts\n grant-credits.knowledge.md\n grant-credits.ts\n index.ts\n org-billing.ts\n org-monitoring.ts\n usage-service.ts\n utils.ts\n knowledge.md\n package.json\n project.json\n tsconfig.json\n build-tools/\n executors/\n infisical-run/\n executor.ts\n schema.json\n executors.json\n package.json\n project.json\n tsconfig.json\n code-map/\n __tests__/\n test-langs/\n test.c\n test.cpp\n test.cs\n test.go\n test.java\n test.js\n test.php\n test.py\n test.rb\n test.rs\n test.ts\n languages.test.ts\n parse.test.ts\n src/\n tree-sitter-queries/\n readme.md\n tree-sitter-c_sharp-tags.scm\n tree-sitter-c-tags.scm\n tree-sitter-cpp-tags.scm\n tree-sitter-go-tags.scm\n tree-sitter-java-tags.scm\n tree-sitter-javascript-tags.scm\n tree-sitter-php-tags.scm\n tree-sitter-python-tags.scm\n tree-sitter-ruby-tags.scm\n tree-sitter-rust-tags.scm\n tree-sitter-typescript-tags.scm\n index.ts\n languages.ts\n parse.ts\n package.json\n tsconfig.json\n internal/\n src/\n loops/\n client.ts\n index.ts\n types.ts\n openrouter-ai-sdk/\n internal/\n index.ts\n schemas/\n reasoning-details.ts\n types/\n index.ts\n openrouter-chat-completions-input.ts\n openrouter-chat-settings.ts\n .gitignore\n convert-to-openrouter-chat-messages.test.ts\n convert-to-openrouter-chat-messages.ts\n convert-to-openrouter-completion-prompt.ts\n index.ts\n map-openrouter-chat-logprobs.ts\n map-openrouter-completion-logprobs.ts\n map-openrouter-finish-reason.ts\n openrouter-chat-language-model.test.ts\n openrouter-chat-language-model.ts\n openrouter-completion-language-model.test.ts\n openrouter-completion-language-model.ts\n openrouter-completion-settings.ts\n openrouter-error.ts\n openrouter-facade.ts\n openrouter-provider-options.test.ts\n openrouter-provider.ts\n openrouter-stream-usage-accounting.test.ts\n openrouter-usage-accounting.test.ts\n utils/\n __tests__/\n version-utils.test.ts\n auth.ts\n version-utils.ts\n xml-parser.ts\n env.ts\n index.ts\n knowledge.md\n package.json\n tsconfig.json\npython-app/\n src/\n codebuff/\n __init__.py\n .gitignore\n knowledge.md\n LICENSE\n pyproject.toml\n README.md\nscripts/\n changelog/\n 2025-05-18-version-10283-release-enhanced-assistant-experience-system-stability.mdx\n 2025-05-25-version-10295-enhanced-ai-models-and-user-experience-improvements.mdx\n 2025-06-01-version-10305-release-enhanced-ai-models-new-commands-and-performance-improvements.mdx\n docs.json\n ft-file-selection/\n .gitignore\n collect-tuning-data.ts\n grade-traces.ts\n print-recent-relabels.ts\n print-recent-traces.ts\n README.md\n relabel-for-offline-scoring.ts\n relabel-traces-with-context.ts\n relabel-traces.ts\n .gitignore\n analyze-edit-blocks.ts\n analyze-model-usage.ts\n apply-credit-migration.ts\n calculate-average-spend.ts\n calculate-dau.ts\n calculate-monthly-usage.ts\n calculate-mrr.ts\n calculate-weekly-usage.ts\n cleanup-worktree.sh\n convert-escaped-newlines.ts\n count-edit-file.ts\n debug-log-subset.ts\n dev.sh\n export-user-emails.ts\n generate-ci-env.js\n generate-tool-definitions.ts\n get-changelog.ts\n init-worktree.ts\n package.json\n tsconfig.json\n update-stripe-subscriptions.ts\nsdk/\n scripts/\n publish.js\n src/\n tools/\n change-file.ts\n read-files.ts\n types/\n agent-definition.ts\n tools.ts\n client.ts\n constants.ts\n index.ts\n process-stream.ts\n websocket-client.ts\n .npmignore\n CHANGELOG.md\n package.json\n PUBLISHING.md\n README.md\n tsconfig.json\nweb/\n public/\n codebuff-intro1.webm\n scripts/\n discord/\n index.ts\n register-commands.ts\n src/\n __tests__/\n e2e/\n home.spec.ts\n unit/\n home.spec.tsx\n actions/\n hello-action.ts\n app/\n [sponsee]/\n page.tsx\n admin/\n file-picker/\n page.tsx\n orgs/\n page.tsx\n traces/\n components/\n chat-message.tsx\n client-session-viewer.tsx\n empty-state.tsx\n error-boundary.tsx\n loading-skeletons.tsx\n timeline-chart.module.css\n timeline-chart.tsx\n trace-viewer.tsx\n utils/\n __tests__/\n trace-processing.test.ts\n trace-processing.ts\n page.tsx\n layout.tsx\n affiliates/\n actions.ts\n page.tsx\n agents/\n page.tsx\n api/\n admin/\n orgs/\n [orgId]/\n features/\n [feature]/\n route.ts\n export/\n route.ts\n route.ts\n relabel-for-user/\n route.ts\n traces/\n [clientRequestId]/\n messages/\n route.ts\n timeline/\n route.ts\n client/\n [clientId]/\n sessions/\n route.ts\n admin-auth.ts\n agents/\n [publisherId]/\n [agentId]/\n [version]/\n route.ts\n latest/\n route.ts\n publish/\n route.ts\n validate/\n route.ts\n route.ts\n api-keys/\n route.ts\n auth/\n [...nextauth]/\n auth-options.ts\n route.ts\n cli/\n code/\n route.ts\n logout/\n route.ts\n status/\n route.ts\n feed/\n route.ts\n git-evals/\n visibility/\n route.ts\n route.ts\n healthz/\n route.ts\n invites/\n [token]/\n route.ts\n orgs/\n [orgId]/\n alerts/\n [alertId]/\n dismiss/\n route.ts\n route.ts\n analytics/\n export/\n route.ts\n route.ts\n billing/\n setup/\n route.ts\n status/\n route.ts\n subscription/\n route.ts\n credits/\n route.ts\n invitations/\n [email]/\n resend/\n route.ts\n route.ts\n bulk/\n route.ts\n route.ts\n members/\n [userId]/\n route.ts\n route.ts\n monitoring/\n route.ts\n publishers/\n route.ts\n repos/\n [repoId]/\n route.ts\n route.ts\n settings/\n route.ts\n usage/\n export/\n route.ts\n route.ts\n route.ts\n slug/\n [slug]/\n route.ts\n route.ts\n publishers/\n [id]/\n organization/\n route.ts\n validate/\n route.ts\n route.ts\n referrals/\n [code]/\n route.ts\n helpers.ts\n route.ts\n stripe/\n buy-credits/\n route.ts\n webhook/\n route.ts\n upload/\n avatar/\n route.ts\n user/\n auto-topup/\n route.ts\n profile/\n route.ts\n usage/\n route.ts\n config/\n page.tsx\n docs/\n [category]/\n layout.tsx\n metadata.ts\n page.tsx\n layout.tsx\n page.tsx\n evals/\n evals-table.tsx\n page.tsx\n invites/\n [token]/\n page.tsx\n login/\n page.tsx\n onboard/\n page.tsx\n orgs/\n [slug]/\n analytics/\n page.tsx\n billing/\n purchase/\n page.tsx\n setup/\n page.tsx\n repositories/\n page.tsx\n settings/\n page.tsx\n team/\n page.tsx\n usage/\n page.tsx\n page.tsx\n new/\n page.tsx\n page.tsx\n payment-success/\n page.tsx\n pricing/\n page.tsx\n privacy-policy/\n page.tsx\n publishers/\n [id]/\n agents/\n [agentId]/\n [version]/\n page.tsx\n page.tsx\n new/\n page.tsx\n page.tsx\n referrals/\n [code]/\n metadata.ts\n page.tsx\n layout.tsx\n page.tsx\n terms-of-service/\n page.tsx\n usage/\n layout.tsx\n page.tsx\n usage-display.tsx\n analytics.knowledge.md\n layout.tsx\n page.tsx\n robots.ts\n sitemap.ts\n components/\n agent/\n json-viewer.tsx\n auto-topup/\n AutoTopupSettings.tsx\n AutoTopupSettingsForm.tsx\n AutoTopupSwitch.tsx\n BaseAutoTopupSettings.tsx\n BaseAutoTopupSettingsForm.tsx\n BaseAutoTopupSwitch.tsx\n constants.ts\n OrgAutoTopupSettings.tsx\n OrgAutoTopupSettingsForm.tsx\n OrgAutoTopupSwitch.tsx\n types.ts\n credits/\n CreditManagementSection.tsx\n CreditPurchaseSection.tsx\n docs/\n mdx/\n code-demo.tsx\n custom-link.tsx\n markdown-table.tsx\n mdx-components.tsx\n mermaid-diagram.tsx\n schema-display.tsx\n copy-heading.tsx\n doc-sidebar.tsx\n docs.knowledge.md\n toc.tsx\n login/\n login-card.tsx\n login-client-wrapper.tsx\n navbar/\n navbar.tsx\n user-dropdown.tsx\n organization/\n advanced-monitor.tsx\n billing-alerts.tsx\n billing-reports.tsx\n billing-status.tsx\n credit-monitor.tsx\n model-config-sheet.tsx\n organization-success-modal.tsx\n repository-management.tsx\n team-management.tsx\n providers/\n query-client-provider.tsx\n publisher/\n basic-info-step.tsx\n ownership-step.tsx\n profile-details-step.tsx\n step-template.tsx\n sign-in/\n sign-in-button.tsx\n sign-in-card-footer.tsx\n ui/\n landing/\n competition/\n claude-code.tsx\n cline.tsx\n cursor.tsx\n github-copilot.tsx\n index.tsx\n tabs.tsx\n feature/\n browser-comparison.tsx\n chart-illustration.tsx\n code-illustration.tsx\n highlight-text.tsx\n index.tsx\n workflow-illustration.tsx\n animated-element.tsx\n constants.ts\n cta-section.tsx\n demo-code-display.tsx\n testimonials-section.tsx\n types.ts\n terminal/\n index.tsx\n style.css\n terminal-input.tsx\n terminal-output.tsx\n avatar-upload.tsx\n background-beams.tsx\n badge.tsx\n banner.tsx\n button.tsx\n card.tsx\n collapsible.tsx\n credit-confetti.tsx\n decorative-blocks.tsx\n dialog.tsx\n dropdown-menu.tsx\n enhanced-copy-button.tsx\n footer.tsx\n hero-buttons.tsx\n hero.tsx\n input.tsx\n install-dialog.tsx\n label.tsx\n neon-gradient-button.tsx\n progress.tsx\n radio-group.tsx\n section.tsx\n select.tsx\n separator.tsx\n sheet.tsx\n sidebar.tsx\n skeleton-loading.tsx\n skeleton.tsx\n slider.tsx\n switch.tsx\n table.tsx\n tabs.tsx\n textarea.tsx\n toast.tsx\n toaster.tsx\n tooltip.tsx\n use-toast.ts\n BrowserPreview.tsx\n card-with-beams.tsx\n CookieConsentCard.tsx\n footer.tsx\n icons.tsx\n IDEDemo.tsx\n layout-wrapper.tsx\n TerminalDemo.tsx\n theme-provider.tsx\n theme-switcher.tsx\n content/\n advanced/\n claude-code-comparison.mdx\n config.mdx\n how-does-it-work.mdx\n large-projects.mdx\n troubleshooting.mdx\n what-models.mdx\n agents/\n agent-reference.mdx\n creating-new-agents.mdx\n customizing-agents.mdx\n overview.mdx\n troubleshooting-agent-customization.mdx\n case-studies/\n _cta.mdx\n benjamin-bryant.mdx\n oliver-lukesch.mdx\n help/\n faq.mdx\n getting-started.mdx\n tips/\n best-practices.mdx\n keyboard-shortcuts.mdx\n knowledge-files.mdx\n other-use-cases.mdx\n version-control.mdx\n where-codebuff-shines.mdx\n discord/\n client.ts\n rate-limiter.ts\n hooks/\n use-auto-topup.ts\n use-install-dialog.ts\n use-mobile.tsx\n use-model-config.ts\n use-org-auto-topup.ts\n use-organization-data.ts\n use-user-profile.ts\n lib/\n server/\n referral.ts\n validators/\n publisher.ts\n admin-auth.ts\n constant.ts\n currency.ts\n docs.ts\n fonts.ts\n organization-permissions.ts\n PostHogProvider.tsx\n publisher-permissions.ts\n remark-code-to-codedemo.ts\n server-init.ts\n SessionProvider.tsx\n stripe-utils.ts\n testimonials.ts\n trackConversions.ts\n utils.ts\n styles/\n globals.css\n types/\n docs.ts\n user.ts\n util/\n logger.ts\n .eslintignore\n .eslintrc.js\n .gitignore\n .prettierignore\n .prettierrc.js\n commitlint.config.js\n components.json\n contentlayer.config.ts\n jest.config.js\n jest.setup.js\n knowledge.md\n next.config.mjs\n package.json\n playwright.config.ts\n postcss.config.cjs\n README.md\n tailwind.config.ts\n tsconfig.json\n.envrc\n.gitignore\n.infisical.json\n.prettierrc\nauthentication.knowledge.md\nbun.lock\nbunfig.toml\ncodebuff.json\neslint.config.js\nknowledge.md\npackage.json\nREADME.md\ntsconfig.base.json\ntsconfig.json\nWINDOWS.md\n", - "tokenCount": 9007, - "truncationLevel": "none" - } - ] - } - ], - "parentAgentId": "D-OgiVqb-lc" - }, - { - "type": "tool_call", - "toolCallId": "557a0acd-be3c-43ac-958e-f02af0941e66", - "toolName": "read_subtree", - "input": { - "paths": [], - "maxTokens": 500000 - }, - "agentId": "D-Ogo19lSyI", - "parentAgentId": "D-OfaYSx8-Q", - "includeToolCall": true - }, - { - "type": "tool_result", - "toolCallId": "557a0acd-be3c-43ac-958e-f02af0941e66", - "toolName": "read_subtree", - "output": [ - { - "type": "json", - "value": [ - { - "path": ".", - "type": "directory", - "printedTree": ".agents/\n examples/\n diff-reviewer-1.ts\n diff-reviewer-2.ts\n diff-reviewer-3.ts\n opensource/\n base.ts\n coder.ts\n file-picker.ts\n researcher.ts\n reviewer.ts\n thinker.ts\n ask.ts\n base-experimental.ts\n base-lite.ts\n base-max.ts\n base.ts\n brainstormer.ts\n changes-reviewer.ts\n charles.ts\n claude4-gemini-thinking.ts\n constants.ts\n file-explorer.ts\n file-picker.ts\n git-committer.ts\n knowledge-keeper.ts\n planner.ts\n researcher.ts\n reviewer.ts\n superagent.ts\n thinker.ts\n.bin/\n bun\n.github/\n workflows/\n ci.yml\n evals.yml\n nightly-evals.yml\n npm-app-release-build.yml\n npm-app-release-prod.yml\n npm-app-release-staging.yml\n .gitignore\n CODEOWNERS\n knowledge.md\n.vscode/\n settings.json\nbackend/\n src/\n __tests__/\n test-data/\n dex-go/\n edit-snippet.go\n expected.go\n original.go\n agent-id-resolution.test.ts\n agent-registry.test.ts\n auto-topup.test.ts\n credit-conversion.test.ts\n fast-rewrite.test.ts\n generate-diffs-prompt.test.ts\n get-custom-file-picker-config.test.ts\n live-user-inputs.test.ts\n loop-agent-steps.test.ts\n main-prompt.integration.test.ts\n main-prompt.test.ts\n process-file-block.test.ts\n process-str-replace.test.ts\n read-docs-tool.test.ts\n request-files-prompt.test.ts\n run-agent-step-tools.test.ts\n run-programmatic-step.test.ts\n sandbox-generator.test.ts\n subagent-streaming.test.ts\n test-utils.ts\n tool-call-schema.test.ts\n usage-calculation.test.ts\n web-search-tool.test.ts\n xml-stream-parser.test.ts\n admin/\n grade-runs.ts\n relabelRuns.ts\n api/\n org.ts\n usage.ts\n context/\n app-context.ts\n find-files/\n check-new-files-necessary.ts\n custom-file-picker-config.ts\n request-files-prompt.ts\n llm-apis/\n __tests__/\n linkup-api.test.ts\n vercel-ai-sdk/\n ai-sdk.ts\n openrouter.ts\n vertex-finetuned.ts\n claude.ts\n context7-api.ts\n gemini-with-fallbacks.ts\n knowledge.md\n linkup-api.ts\n message-cost-tracker.ts\n openai-api.ts\n openrouter.ts\n relace-api.ts\n system-prompt/\n agent-instructions.md\n prompts.ts\n save-agent-request.ts\n search-system-prompt.ts\n truncate-file-tree.ts\n templates/\n agents/\n archive/\n dry-run.ts\n agent-builder.ts\n ask.ts\n base.ts\n file-explorer.ts\n file-picker.ts\n planner.ts\n researcher.ts\n reviewer.ts\n superagent.ts\n thinker.ts\n thinking-base.ts\n agent-list.ts\n agent-registry.ts\n ask-prompts.ts\n base-prompts.ts\n prompts.ts\n README.md\n strings.ts\n types.ts\n tools/\n definitions/\n tool/\n add-message.ts\n add-subgoal.ts\n browser-logs.ts\n code-search.ts\n create-plan.ts\n end-turn.ts\n find-files.ts\n read-docs.ts\n read-files.ts\n run-file-change-hooks.ts\n run-terminal-command.ts\n set-messages.ts\n set-output.ts\n spawn-agent-inline.ts\n spawn-agents-async.ts\n spawn-agents.ts\n str-replace.ts\n think-deeply.ts\n update-subgoal.ts\n web-search.ts\n write-file.ts\n list.ts\n tool-def-type.ts\n handlers/\n tool/\n add-message.ts\n add-subgoal.ts\n browser-logs.ts\n code-search.ts\n create-plan.ts\n end-turn.ts\n find-files.ts\n read-docs.ts\n read-files.ts\n run-file-change-hooks.ts\n run-terminal-command.ts\n set-messages.ts\n set-output.ts\n spawn-agent-inline.ts\n spawn-agents-async.ts\n spawn-agents.ts\n str-replace.ts\n think-deeply.ts\n update-subgoal.ts\n web-search.ts\n write-file.ts\n handler-function-type.ts\n list.ts\n constants.ts\n prompts.ts\n stream-parser.ts\n tool-executor.ts\n util/\n __tests__/\n messages.test.ts\n object.test.ts\n parse-tool-call-xml.test.ts\n simplify-tool-results.test.ts\n split-data.test.ts\n check-auth.ts\n debug.ts\n file-resolver.ts\n logger.ts\n messages.ts\n object.ts\n parse-tool-call-xml.ts\n quickjs-sandbox.ts\n simplify-tool-results.ts\n split-data.ts\n token-counter.ts\n websockets/\n auth.ts\n middleware.ts\n request-context.ts\n server.ts\n switchboard.ts\n websocket-action.ts\n async-agent-manager.ts\n check-terminal-command.ts\n fast-rewrite.ts\n generate-diffs-prompt.ts\n get-documentation-for-query.ts\n get-file-reading-updates.ts\n index.ts\n live-user-inputs.ts\n loop-main-prompt.ts\n main-prompt.ts\n process-file-block.ts\n process-str-replace.ts\n prompt-agent-stream.ts\n run-agent-step.ts\n run-programmatic-step.ts\n xml-stream-parser.ts\n .gitignore\n knowledge.md\n package.json\n README.md\n tsconfig.json\ncommon/\n src/\n __tests__/\n agent-validation.test.ts\n dynamic-agent-template-schema.test.ts\n handlesteps-parsing.test.ts\n api-keys/\n constants.ts\n crypto.ts\n constants/\n agents.ts\n analytics-events.ts\n grant-priorities.ts\n db/\n migrations/\n meta/\n _journal.json\n 0000_snapshot.json\n 0001_snapshot.json\n 0002_snapshot.json\n 0003_snapshot.json\n 0004_snapshot.json\n 0005_snapshot.json\n 0006_snapshot.json\n 0007_snapshot.json\n 0008_snapshot.json\n 0009_snapshot.json\n 0010_snapshot.json\n 0011_snapshot.json\n 0012_snapshot.json\n 0013_snapshot.json\n 0014_snapshot.json\n 0015_snapshot.json\n 0016_snapshot.json\n 0017_snapshot.json\n 0018_snapshot.json\n 0019_snapshot.json\n 0020_snapshot.json\n 0021_snapshot.json\n 0026_snapshot.json\n 0027_snapshot.json\n 0028_snapshot.json\n 0000_overjoyed_thing.sql\n 0001_fuzzy_typhoid_mary.sql\n 0002_sticky_dormammu.sql\n 0003_military_owl.sql\n 0004_neat_pet_avengers.sql\n 0005_minor_the_professor.sql\n 0006_first_quasimodo.sql\n 0007_equal_warlock.sql\n 0008_puzzling_carnage.sql\n 0009_bitter_rumiko_fujikawa.sql\n 0010_overjoyed_red_skull.sql\n 0011_familiar_ezekiel_stane.sql\n 0012_fluffy_naoko.sql\n 0013_famous_risque.sql\n 0014_wakeful_sinister_six.sql\n 0015_stormy_zuras.sql\n 0016_clear_hairball.sql\n 0017_tricky_randall_flagg.sql\n 0018_stale_human_robot.sql\n 0019_amused_nebula.sql\n 0020_young_sleeper.sql\n 0021_tiny_marauders.sql\n 0026_chilly_mockingbird.sql\n 0027_sloppy_quasar.sql\n 0028_lush_johnny_blaze.sql\n docker-compose.yml\n drizzle.config.ts\n index.ts\n schema.knowledge.md\n schema.ts\n transaction.ts\n json-config/\n __tests__/\n __snapshots__/\n stringify-schema.test.ts.snap\n constants.test.ts\n stringify-schema.test.ts\n constants.ts\n default.ts\n stringify-schema.ts\n templates/\n agent-validation.ts\n dynamic-agent-functions.ts\n testing/\n mock-modules.ts\n tools/\n params/\n tool/\n add-message.ts\n add-subgoal.ts\n browser-logs.ts\n code-search.ts\n create-plan.ts\n end-turn.ts\n find-files.ts\n read-docs.ts\n read-files.ts\n run-file-change-hooks.ts\n run-terminal-command.ts\n set-messages.ts\n set-output.ts\n spawn-agent-inline.ts\n spawn-agents-async.ts\n spawn-agents.ts\n str-replace.ts\n think-deeply.ts\n update-subgoal.ts\n web-search.ts\n write-file.ts\n compile-tool-definitions.ts\n constants.ts\n list.ts\n utils.ts\n types/\n __tests__/\n dynamic-agent-template.test.ts\n api/\n agents/\n publish.ts\n agent-template.ts\n dynamic-agent-template.ts\n grant.ts\n message.ts\n organization.ts\n print-mode.ts\n publisher.ts\n referral.ts\n session-state.ts\n usage.ts\n util/\n __tests__/\n messages.test.ts\n partial-json-delta.test.ts\n saxy.test.ts\n string.test.ts\n examples/\n diff-reviewer-1.ts\n diff-reviewer-2.ts\n diff-reviewer-3.ts\n agent-file-utils.ts\n agent-name-normalization.ts\n agent-name-resolver.ts\n agent-template-validation.ts\n array.ts\n changes.ts\n credentials.ts\n currency.ts\n dates.ts\n error.ts\n file.ts\n git.ts\n logger.ts\n lru-cache.ts\n messages.ts\n min-heap.ts\n model-utils.ts\n object.ts\n partial-json-delta.ts\n patch.ts\n promise.ts\n random.ts\n referral.ts\n saxy.ts\n string.knowledge.md\n string.ts\n stripe.ts\n sync-failure.ts\n xml.ts\n zod-schema.ts\n websockets/\n websocket-client.ts\n websocket-schema.ts\n actions.ts\n analytics.ts\n browser-actions.ts\n constants.ts\n project-file-tree.ts\n knowledge.md\n package.json\n tsconfig.json\nevals/\n git-evals/\n email-eval-results.ts\n eval-codebuff.json\n eval-manifold.json\n eval-result-codebuff-mock.json\n gen-evals.ts\n judge-git-eval.ts\n post-eval-analysis.ts\n run-eval-set.ts\n run-git-evals.ts\n run-single-eval-process.ts\n run-single-eval.ts\n setup-test-repo.ts\n types.ts\n .gitignore\n bun.lock\n constants.ts\n e2e-cat-app-script.ts\n knowledge.md\n package.json\n scaffolding.ts\n swe-bench-eval.ts\n swe-bench-ids.ts\n swe-bench.test.ts\n test-repos.json\n test-setup.ts\n tsconfig.json\nnpm-app/\n release/\n index.js\n package.json\n README.md\n release-staging/\n index.js\n package.json\n README.md\n scripts/\n build-binary.js\n generate-github-token.ts\n patch-web-tree-sitter.ts\n release.js\n twitch-plays-codebuff.sh\n src/\n __tests__/\n display.test.ts\n tool-handlers.test.ts\n agents/\n agent-utils.ts\n load-agents.ts\n checkpoints/\n checkpoint-manager.ts\n file-manager.ts\n cli-handlers/\n agent-creation-chat.ts\n agents.ts\n api-key.ts\n checkpoint.ts\n diff.ts\n easter-egg.ts\n inititalization-flow.ts\n mini-chat.ts\n publish.ts\n subagent-list.ts\n subagent.ts\n display/\n overrides.ts\n print-mode.ts\n squash-newlines.ts\n json-config/\n hooks.ts\n parser.ts\n native/\n ripgrep.ts\n terminal/\n background.ts\n run-command.ts\n utils/\n __tests__/\n __snapshots__/\n background-process-manager.test.ts.snap\n frustration-detector.test.ts.snap\n rage-detector.test.ts.snap\n xml-stream-parser.test.ts.snap\n background-process-manager.test.ts\n rage-detector.test.ts\n response-example-4-files.txt\n tool-renderers.test.ts\n xml-stream-parser.test.ts\n agent-validation.ts\n analytics.ts\n detect-shell.ts\n git.ts\n logger.ts\n rage-detector.ts\n spinner.ts\n suppress-console.ts\n system-info.ts\n terminal.ts\n tool-renderers.ts\n with-hang-detection.ts\n xml-stream-parser.ts\n workers/\n checkpoint-worker.ts\n project-context.ts\n background-process-manager.ts\n browser-runner.ts\n chat-storage.ts\n cli-definitions.ts\n cli.ts\n client.ts\n config.ts\n create-template-project.ts\n credentials.ts\n dev-process-manager.ts\n diff-manager.ts\n fingerprint.ts\n index.ts\n menu.ts\n project-files.ts\n rage-detectors.ts\n startup-process-handler.ts\n subagent-storage.ts\n tool-handlers.ts\n types.ts\n web-scraper.ts\n .gitignore\n bunfig.toml\n package.json\n tsconfig.json\npackages/\n bigquery/\n src/\n client.ts\n index.ts\n schema.ts\n knowledge.md\n package.json\n tsconfig.json\n billing/\n src/\n __tests__/\n credit-delegation.test.ts\n extract-owner-repo.test.ts\n org-billing.test.ts\n auto-topup.ts\n balance-calculator.ts\n billing.knowledge.md\n conversion.ts\n credit-delegation.ts\n grant-credits.knowledge.md\n grant-credits.ts\n index.ts\n org-billing.ts\n org-monitoring.ts\n usage-service.ts\n utils.ts\n knowledge.md\n package.json\n project.json\n tsconfig.json\n build-tools/\n executors/\n infisical-run/\n executor.ts\n schema.json\n executors.json\n package.json\n project.json\n tsconfig.json\n code-map/\n __tests__/\n test-langs/\n test.c\n test.cpp\n test.cs\n test.go\n test.java\n test.js\n test.php\n test.py\n test.rb\n test.rs\n test.ts\n languages.test.ts\n parse.test.ts\n src/\n tree-sitter-queries/\n readme.md\n tree-sitter-c_sharp-tags.scm\n tree-sitter-c-tags.scm\n tree-sitter-cpp-tags.scm\n tree-sitter-go-tags.scm\n tree-sitter-java-tags.scm\n tree-sitter-javascript-tags.scm\n tree-sitter-php-tags.scm\n tree-sitter-python-tags.scm\n tree-sitter-ruby-tags.scm\n tree-sitter-rust-tags.scm\n tree-sitter-typescript-tags.scm\n index.ts\n languages.ts\n parse.ts\n package.json\n tsconfig.json\n internal/\n src/\n loops/\n client.ts\n index.ts\n types.ts\n openrouter-ai-sdk/\n internal/\n index.ts\n schemas/\n reasoning-details.ts\n types/\n index.ts\n openrouter-chat-completions-input.ts\n openrouter-chat-settings.ts\n .gitignore\n convert-to-openrouter-chat-messages.test.ts\n convert-to-openrouter-chat-messages.ts\n convert-to-openrouter-completion-prompt.ts\n index.ts\n map-openrouter-chat-logprobs.ts\n map-openrouter-completion-logprobs.ts\n map-openrouter-finish-reason.ts\n openrouter-chat-language-model.test.ts\n openrouter-chat-language-model.ts\n openrouter-completion-language-model.test.ts\n openrouter-completion-language-model.ts\n openrouter-completion-settings.ts\n openrouter-error.ts\n openrouter-facade.ts\n openrouter-provider-options.test.ts\n openrouter-provider.ts\n openrouter-stream-usage-accounting.test.ts\n openrouter-usage-accounting.test.ts\n utils/\n __tests__/\n version-utils.test.ts\n auth.ts\n version-utils.ts\n xml-parser.ts\n env.ts\n index.ts\n knowledge.md\n package.json\n tsconfig.json\npython-app/\n src/\n codebuff/\n __init__.py\n .gitignore\n knowledge.md\n LICENSE\n pyproject.toml\n README.md\nscripts/\n changelog/\n 2025-05-18-version-10283-release-enhanced-assistant-experience-system-stability.mdx\n 2025-05-25-version-10295-enhanced-ai-models-and-user-experience-improvements.mdx\n 2025-06-01-version-10305-release-enhanced-ai-models-new-commands-and-performance-improvements.mdx\n docs.json\n ft-file-selection/\n .gitignore\n collect-tuning-data.ts\n grade-traces.ts\n print-recent-relabels.ts\n print-recent-traces.ts\n README.md\n relabel-for-offline-scoring.ts\n relabel-traces-with-context.ts\n relabel-traces.ts\n .gitignore\n analyze-edit-blocks.ts\n analyze-model-usage.ts\n apply-credit-migration.ts\n calculate-average-spend.ts\n calculate-dau.ts\n calculate-monthly-usage.ts\n calculate-mrr.ts\n calculate-weekly-usage.ts\n cleanup-worktree.sh\n convert-escaped-newlines.ts\n count-edit-file.ts\n debug-log-subset.ts\n dev.sh\n export-user-emails.ts\n generate-ci-env.js\n generate-tool-definitions.ts\n get-changelog.ts\n init-worktree.ts\n package.json\n tsconfig.json\n update-stripe-subscriptions.ts\nsdk/\n scripts/\n publish.js\n src/\n tools/\n change-file.ts\n read-files.ts\n types/\n agent-definition.ts\n tools.ts\n client.ts\n constants.ts\n index.ts\n process-stream.ts\n websocket-client.ts\n .npmignore\n CHANGELOG.md\n package.json\n PUBLISHING.md\n README.md\n tsconfig.json\nweb/\n public/\n codebuff-intro1.webm\n scripts/\n discord/\n index.ts\n register-commands.ts\n src/\n __tests__/\n e2e/\n home.spec.ts\n unit/\n home.spec.tsx\n actions/\n hello-action.ts\n app/\n [sponsee]/\n page.tsx\n admin/\n file-picker/\n page.tsx\n orgs/\n page.tsx\n traces/\n components/\n chat-message.tsx\n client-session-viewer.tsx\n empty-state.tsx\n error-boundary.tsx\n loading-skeletons.tsx\n timeline-chart.module.css\n timeline-chart.tsx\n trace-viewer.tsx\n utils/\n __tests__/\n trace-processing.test.ts\n trace-processing.ts\n page.tsx\n layout.tsx\n affiliates/\n actions.ts\n page.tsx\n agents/\n page.tsx\n api/\n admin/\n orgs/\n [orgId]/\n features/\n [feature]/\n route.ts\n export/\n route.ts\n route.ts\n relabel-for-user/\n route.ts\n traces/\n [clientRequestId]/\n messages/\n route.ts\n timeline/\n route.ts\n client/\n [clientId]/\n sessions/\n route.ts\n admin-auth.ts\n agents/\n [publisherId]/\n [agentId]/\n [version]/\n route.ts\n latest/\n route.ts\n publish/\n route.ts\n validate/\n route.ts\n route.ts\n api-keys/\n route.ts\n auth/\n [...nextauth]/\n auth-options.ts\n route.ts\n cli/\n code/\n route.ts\n logout/\n route.ts\n status/\n route.ts\n feed/\n route.ts\n git-evals/\n visibility/\n route.ts\n route.ts\n healthz/\n route.ts\n invites/\n [token]/\n route.ts\n orgs/\n [orgId]/\n alerts/\n [alertId]/\n dismiss/\n route.ts\n route.ts\n analytics/\n export/\n route.ts\n route.ts\n billing/\n setup/\n route.ts\n status/\n route.ts\n subscription/\n route.ts\n credits/\n route.ts\n invitations/\n [email]/\n resend/\n route.ts\n route.ts\n bulk/\n route.ts\n route.ts\n members/\n [userId]/\n route.ts\n route.ts\n monitoring/\n route.ts\n publishers/\n route.ts\n repos/\n [repoId]/\n route.ts\n route.ts\n settings/\n route.ts\n usage/\n export/\n route.ts\n route.ts\n route.ts\n slug/\n [slug]/\n route.ts\n route.ts\n publishers/\n [id]/\n organization/\n route.ts\n validate/\n route.ts\n route.ts\n referrals/\n [code]/\n route.ts\n helpers.ts\n route.ts\n stripe/\n buy-credits/\n route.ts\n webhook/\n route.ts\n upload/\n avatar/\n route.ts\n user/\n auto-topup/\n route.ts\n profile/\n route.ts\n usage/\n route.ts\n config/\n page.tsx\n docs/\n [category]/\n layout.tsx\n metadata.ts\n page.tsx\n layout.tsx\n page.tsx\n evals/\n evals-table.tsx\n page.tsx\n invites/\n [token]/\n page.tsx\n login/\n page.tsx\n onboard/\n page.tsx\n orgs/\n [slug]/\n analytics/\n page.tsx\n billing/\n purchase/\n page.tsx\n setup/\n page.tsx\n repositories/\n page.tsx\n settings/\n page.tsx\n team/\n page.tsx\n usage/\n page.tsx\n page.tsx\n new/\n page.tsx\n page.tsx\n payment-success/\n page.tsx\n pricing/\n page.tsx\n privacy-policy/\n page.tsx\n publishers/\n [id]/\n agents/\n [agentId]/\n [version]/\n page.tsx\n page.tsx\n new/\n page.tsx\n page.tsx\n referrals/\n [code]/\n metadata.ts\n page.tsx\n layout.tsx\n page.tsx\n terms-of-service/\n page.tsx\n usage/\n layout.tsx\n page.tsx\n usage-display.tsx\n analytics.knowledge.md\n layout.tsx\n page.tsx\n robots.ts\n sitemap.ts\n components/\n agent/\n json-viewer.tsx\n auto-topup/\n AutoTopupSettings.tsx\n AutoTopupSettingsForm.tsx\n AutoTopupSwitch.tsx\n BaseAutoTopupSettings.tsx\n BaseAutoTopupSettingsForm.tsx\n BaseAutoTopupSwitch.tsx\n constants.ts\n OrgAutoTopupSettings.tsx\n OrgAutoTopupSettingsForm.tsx\n OrgAutoTopupSwitch.tsx\n types.ts\n credits/\n CreditManagementSection.tsx\n CreditPurchaseSection.tsx\n docs/\n mdx/\n code-demo.tsx\n custom-link.tsx\n markdown-table.tsx\n mdx-components.tsx\n mermaid-diagram.tsx\n schema-display.tsx\n copy-heading.tsx\n doc-sidebar.tsx\n docs.knowledge.md\n toc.tsx\n login/\n login-card.tsx\n login-client-wrapper.tsx\n navbar/\n navbar.tsx\n user-dropdown.tsx\n organization/\n advanced-monitor.tsx\n billing-alerts.tsx\n billing-reports.tsx\n billing-status.tsx\n credit-monitor.tsx\n model-config-sheet.tsx\n organization-success-modal.tsx\n repository-management.tsx\n team-management.tsx\n providers/\n query-client-provider.tsx\n publisher/\n basic-info-step.tsx\n ownership-step.tsx\n profile-details-step.tsx\n step-template.tsx\n sign-in/\n sign-in-button.tsx\n sign-in-card-footer.tsx\n ui/\n landing/\n competition/\n claude-code.tsx\n cline.tsx\n cursor.tsx\n github-copilot.tsx\n index.tsx\n tabs.tsx\n feature/\n browser-comparison.tsx\n chart-illustration.tsx\n code-illustration.tsx\n highlight-text.tsx\n index.tsx\n workflow-illustration.tsx\n animated-element.tsx\n constants.ts\n cta-section.tsx\n demo-code-display.tsx\n testimonials-section.tsx\n types.ts\n terminal/\n index.tsx\n style.css\n terminal-input.tsx\n terminal-output.tsx\n avatar-upload.tsx\n background-beams.tsx\n badge.tsx\n banner.tsx\n button.tsx\n card.tsx\n collapsible.tsx\n credit-confetti.tsx\n decorative-blocks.tsx\n dialog.tsx\n dropdown-menu.tsx\n enhanced-copy-button.tsx\n footer.tsx\n hero-buttons.tsx\n hero.tsx\n input.tsx\n install-dialog.tsx\n label.tsx\n neon-gradient-button.tsx\n progress.tsx\n radio-group.tsx\n section.tsx\n select.tsx\n separator.tsx\n sheet.tsx\n sidebar.tsx\n skeleton-loading.tsx\n skeleton.tsx\n slider.tsx\n switch.tsx\n table.tsx\n tabs.tsx\n textarea.tsx\n toast.tsx\n toaster.tsx\n tooltip.tsx\n use-toast.ts\n BrowserPreview.tsx\n card-with-beams.tsx\n CookieConsentCard.tsx\n footer.tsx\n icons.tsx\n IDEDemo.tsx\n layout-wrapper.tsx\n TerminalDemo.tsx\n theme-provider.tsx\n theme-switcher.tsx\n content/\n advanced/\n claude-code-comparison.mdx\n config.mdx\n how-does-it-work.mdx\n large-projects.mdx\n troubleshooting.mdx\n what-models.mdx\n agents/\n agent-reference.mdx\n creating-new-agents.mdx\n customizing-agents.mdx\n overview.mdx\n troubleshooting-agent-customization.mdx\n case-studies/\n _cta.mdx\n benjamin-bryant.mdx\n oliver-lukesch.mdx\n help/\n faq.mdx\n getting-started.mdx\n tips/\n best-practices.mdx\n keyboard-shortcuts.mdx\n knowledge-files.mdx\n other-use-cases.mdx\n version-control.mdx\n where-codebuff-shines.mdx\n discord/\n client.ts\n rate-limiter.ts\n hooks/\n use-auto-topup.ts\n use-install-dialog.ts\n use-mobile.tsx\n use-model-config.ts\n use-org-auto-topup.ts\n use-organization-data.ts\n use-user-profile.ts\n lib/\n server/\n referral.ts\n validators/\n publisher.ts\n admin-auth.ts\n constant.ts\n currency.ts\n docs.ts\n fonts.ts\n organization-permissions.ts\n PostHogProvider.tsx\n publisher-permissions.ts\n remark-code-to-codedemo.ts\n server-init.ts\n SessionProvider.tsx\n stripe-utils.ts\n testimonials.ts\n trackConversions.ts\n utils.ts\n styles/\n globals.css\n types/\n docs.ts\n user.ts\n util/\n logger.ts\n .eslintignore\n .eslintrc.js\n .gitignore\n .prettierignore\n .prettierrc.js\n commitlint.config.js\n components.json\n contentlayer.config.ts\n jest.config.js\n jest.setup.js\n knowledge.md\n next.config.mjs\n package.json\n playwright.config.ts\n postcss.config.cjs\n README.md\n tailwind.config.ts\n tsconfig.json\n.envrc\n.gitignore\n.infisical.json\n.prettierrc\nauthentication.knowledge.md\nbun.lock\nbunfig.toml\ncodebuff.json\neslint.config.js\nknowledge.md\npackage.json\nREADME.md\ntsconfig.base.json\ntsconfig.json\nWINDOWS.md\n", - "tokenCount": 9007, - "truncationLevel": "none" - } - ] - } - ], - "parentAgentId": "D-Ogo19lSyI" - }, - { - "type": "tool_result", - "toolCallId": "877e5ab3-210d-4cf9-84e6-267e388d68ad", - "toolName": "code_search", - "output": [ - { - "type": "json", - "value": { - "stdout": ".agents/examples/diff-reviewer-1.ts:\n4: id: 'diff-reviewer-1',\n\n.agents/examples/diff-reviewer-2.ts:\n7: id: 'diff-reviewer-2',\n\n.agents/examples/diff-reviewer-3.ts:\n7: id: 'diff-reviewer-3',\n\n./backend/src/templates/agents/agent-builder.ts:\n67: (file) => file.endsWith('.ts') && file.startsWith('diff-reviewer'),\n\n./common/src/util/examples/diff-reviewer-1.ts:\n4: id: 'diff-reviewer-1',\n\n./common/src/util/examples/diff-reviewer-2.ts:\n7: id: 'diff-reviewer-2',\n\n./common/src/util/examples/diff-reviewer-3.ts:\n7: id: 'diff-reviewer-3',", - "message": "Exit code: 0" - } - } - ], - "parentAgentId": "D-Ofa741I0M" - }, - { - "type": "tool_call", - "toolCallId": "88b32613-fdb8-4da3-9ec1-a56e04d23a2b", - "toolName": "code_search", - "input": { - "pattern": "your-custom-agent" - }, - "agentId": "D-Ofa741I0M", - "parentAgentId": "main-agent", - "includeToolCall": true - }, - { - "type": "tool_result", - "toolCallId": "88b32613-fdb8-4da3-9ec1-a56e04d23a2b", - "toolName": "code_search", - "output": [ - { - "type": "json", - "value": { - "stdout": "No results", - "message": "Exit code: 1" - } - } - ], - "parentAgentId": "D-Ofa741I0M" - }, - { - "type": "tool_call", - "toolCallId": "31e44afe-a9e2-4fc6-957b-297300888473", - "toolName": "code_search", - "input": { - "pattern": "spawnable agents|spawnAgents" - }, - "agentId": "D-Ofa741I0M", - "parentAgentId": "main-agent", - "includeToolCall": true - }, - { - "type": "tool_result", - "toolCallId": "31e44afe-a9e2-4fc6-957b-297300888473", - "toolName": "code_search", - "output": [ - { - "type": "json", - "value": { - "stdout": "./npm-app/src/client.ts:\n1354: // Mark any spawnable agents as inactive when the main response completes\n\n./npm-app/src/subagent-storage.ts:\n214: * Get recent spawnable agents (sorted by last activity)\n223: * Get spawnable agents in chronological order (oldest first)\n\n./backend/knowledge.md:\n7:Users can now reference spawnable agents without org prefixes in their agent templates. For example:\n77: spawnableAgents?: { // Modify spawnable agents list\n\n./npm-app/src/agents/load-agents.ts:\n86: `${green('Configured spawnable agents:')} ${spawnableAgents\n\n./npm-app/src/cli.ts:\n949: // Give control back to user when no spawnable agents exist\n\n./backend/src/tools/definitions/tool/spawn-agents-async.ts:\n6:export const spawnAgentsAsyncTool = {\n\n./backend/src/tools/definitions/tool/spawn-agents.ts:\n6:export const spawnAgentsTool = {\n\n./backend/src/tools/definitions/list.ts:\n16:import { spawnAgentsTool } from './tool/spawn-agents'\n17:import { spawnAgentsAsyncTool } from './tool/spawn-agents-async'\n43: spawn_agents: spawnAgentsTool,\n44: spawn_agents_async: spawnAgentsAsyncTool,\n\n./common/src/templates/agent-validation.ts:\n199: // Validate spawnable agents (skip if requested, e.g., for database agents)\n\n./web/src/app/api/agents/publish/route.ts:\n222: // Verify that all spawnable agents are either published or part of this request\n\n./common/src/__tests__/agent-validation.test.ts:\n116: test.skip('should validate spawnable agents', async () => {\n141: 'Invalid spawnable agents: nonexistent_agent',\n274: it('should validate spawnable agents including dynamic agents from first pass', async () => {\n287: spawnableAgents: [], // No spawnable agents\n\n./common/src/__tests__/dynamic-agent-template-schema.test.ts:\n336: const spawnAgentsError = result.error.issues.find((issue) =>\n341: expect(spawnAgentsError).toBeDefined()\n342: expect(spawnAgentsError?.message).toContain(\n\n./web/src/content/agents/troubleshooting-agent-customization.mdx:\n204:2. Limit spawnable agents:\n\n./common/src/util/agent-name-normalization.ts:\n6: * 2. Try with DEFAULT_ORG_PREFIX for spawnable agents\n10: * and handles the common case where users reference spawnable agents\n27: // Try with DEFAULT_ORG_PREFIX for spawnable agents\n\n./common/src/tools/list.ts:\n14:import { spawnAgentsParams } from './params/tool/spawn-agents'\n15:import { spawnAgentsAsyncParams } from './params/tool/spawn-agents-async'\n39: spawn_agents: spawnAgentsParams,\n40: spawn_agents_async: spawnAgentsAsyncParams,\n\n./common/src/types/dynamic-agent-template.ts:\n98: // Tools and spawnable agents\n\n./common/src/json-config/constants.ts:\n91: .describe('Specify complete list of spawnable agents for the base agent'),\n\n./common/src/util/agent-template-validation.ts:\n9: * Centralized validation for spawnable agents.\n10: * Validates that all spawnable agents reference valid agent types.\n35: * Formats a validation error message for spawnable agents\n41: let message = `Invalid spawnable agents: ${invalidAgents.join(', ')}. Double check the id, including the org prefix if applicable.`\n\n./common/src/json-config/__tests__/__snapshots__/stringify-schema.test.ts.snap:\n85: // (optional): Specify complete list of spawnable agents for the base agent\n\n./common/src/tools/params/tool/spawn-agents.ts:\n7:export const spawnAgentsParams = {\n\n./common/src/tools/params/tool/spawn-agents-async.ts:\n7:export const spawnAgentsAsyncParams = {", - "message": "Exit code: 0" - } - } - ], - "parentAgentId": "D-Ofa741I0M" - }, - { - "type": "tool_call", - "toolCallId": "9efee56f-fbb6-44e0-83c8-1e662f712455", - "toolName": "code_search", - "input": { - "pattern": "agent builder|agentBuilder" - }, - "agentId": "D-Ofa741I0M", - "parentAgentId": "main-agent", - "includeToolCall": true - }, - { - "type": "tool_result", - "toolCallId": "9efee56f-fbb6-44e0-83c8-1e662f712455", - "toolName": "code_search", - "output": [ - { - "type": "json", - "value": { - "stdout": "./npm-app/src/cli-handlers/agent-creation-chat.ts:\n77: // Create a simple prompt for the agent builder with the requirements\n88: // Use the resetAgent helper to properly switch to agent-builder which automatically spawns the agent builder\n\n./npm-app/src/cli-handlers/agents.ts:\n560: // Switch to agent-builder which automatically spawns the agent builder for agent creation\n\n./backend/src/templates/agents/agent-builder.ts:\n30:export const agentBuilder = (\n135: 'You are an expert agent builder specialized in creating new agent templates for the codebuff system. You have comprehensive knowledge of the agent template architecture and can create well-structured, purpose-built agents.',\n224:The agent builder is focused on creating new agent templates based on user specifications.\n\n./backend/src/templates/agent-list.ts:\n18:import { agentBuilder } from './agents/agent-builder'\n77: ...agentBuilder(models.openrouter_claude_sonnet_4),", - "message": "Exit code: 0" - } - } - ], - "parentAgentId": "D-Ofa741I0M" - }, - { - "type": "tool_call", - "toolCallId": "d7faf371-a43a-44de-829f-0c21cefdb370", - "toolName": "code_search", - "input": { - "pattern": "agent personas|agentPersonas" - }, - "agentId": "D-Ofa741I0M", - "parentAgentId": "main-agent", - "includeToolCall": true - }, - { - "type": "tool_result", - "toolCallId": "d7faf371-a43a-44de-829f-0c21cefdb370", - "toolName": "code_search", - "output": [ - { - "type": "json", - "value": { - "stdout": "./common/src/constants/agents.ts:\n3:// Define agent personas with their shared characteristics", - "message": "Exit code: 0" - } - } - ], - "parentAgentId": "D-Ofa741I0M" - }, - { - "type": "tool_call", - "toolCallId": "cbcd47c4-b9ab-4235-a6ae-d5ca80e0d822", - "toolName": "set_output", - "input": { - "results": [ - { - "stdout": ".agents/examples/diff-reviewer-1.ts:\n4: id: 'diff-reviewer-1',\n\n.agents/examples/diff-reviewer-2.ts:\n7: id: 'diff-reviewer-2',\n\n.agents/examples/diff-reviewer-3.ts:\n7: id: 'diff-reviewer-3',\n\n./backend/src/templates/agents/agent-builder.ts:\n67: (file) => file.endsWith('.ts') && file.startsWith('diff-reviewer'),\n\n./common/src/util/examples/diff-reviewer-1.ts:\n4: id: 'diff-reviewer-1',\n\n./common/src/util/examples/diff-reviewer-2.ts:\n7: id: 'diff-reviewer-2',\n\n./common/src/util/examples/diff-reviewer-3.ts:\n7: id: 'diff-reviewer-3',", - "message": "Exit code: 0" - }, - { - "stdout": "No results", - "message": "Exit code: 1" - }, - { - "stdout": "./npm-app/src/client.ts:\n1354: // Mark any spawnable agents as inactive when the main response completes\n\n./npm-app/src/subagent-storage.ts:\n214: * Get recent spawnable agents (sorted by last activity)\n223: * Get spawnable agents in chronological order (oldest first)\n\n./backend/knowledge.md:\n7:Users can now reference spawnable agents without org prefixes in their agent templates. For example:\n77: spawnableAgents?: { // Modify spawnable agents list\n\n./npm-app/src/agents/load-agents.ts:\n86: `${green('Configured spawnable agents:')} ${spawnableAgents\n\n./npm-app/src/cli.ts:\n949: // Give control back to user when no spawnable agents exist\n\n./backend/src/tools/definitions/tool/spawn-agents-async.ts:\n6:export const spawnAgentsAsyncTool = {\n\n./backend/src/tools/definitions/tool/spawn-agents.ts:\n6:export const spawnAgentsTool = {\n\n./backend/src/tools/definitions/list.ts:\n16:import { spawnAgentsTool } from './tool/spawn-agents'\n17:import { spawnAgentsAsyncTool } from './tool/spawn-agents-async'\n43: spawn_agents: spawnAgentsTool,\n44: spawn_agents_async: spawnAgentsAsyncTool,\n\n./common/src/templates/agent-validation.ts:\n199: // Validate spawnable agents (skip if requested, e.g., for database agents)\n\n./web/src/app/api/agents/publish/route.ts:\n222: // Verify that all spawnable agents are either published or part of this request\n\n./common/src/__tests__/agent-validation.test.ts:\n116: test.skip('should validate spawnable agents', async () => {\n141: 'Invalid spawnable agents: nonexistent_agent',\n274: it('should validate spawnable agents including dynamic agents from first pass', async () => {\n287: spawnableAgents: [], // No spawnable agents\n\n./common/src/__tests__/dynamic-agent-template-schema.test.ts:\n336: const spawnAgentsError = result.error.issues.find((issue) =>\n341: expect(spawnAgentsError).toBeDefined()\n342: expect(spawnAgentsError?.message).toContain(\n\n./web/src/content/agents/troubleshooting-agent-customization.mdx:\n204:2. Limit spawnable agents:\n\n./common/src/util/agent-name-normalization.ts:\n6: * 2. Try with DEFAULT_ORG_PREFIX for spawnable agents\n10: * and handles the common case where users reference spawnable agents\n27: // Try with DEFAULT_ORG_PREFIX for spawnable agents\n\n./common/src/tools/list.ts:\n14:import { spawnAgentsParams } from './params/tool/spawn-agents'\n15:import { spawnAgentsAsyncParams } from './params/tool/spawn-agents-async'\n39: spawn_agents: spawnAgentsParams,\n40: spawn_agents_async: spawnAgentsAsyncParams,\n\n./common/src/types/dynamic-agent-template.ts:\n98: // Tools and spawnable agents\n\n./common/src/json-config/constants.ts:\n91: .describe('Specify complete list of spawnable agents for the base agent'),\n\n./common/src/util/agent-template-validation.ts:\n9: * Centralized validation for spawnable agents.\n10: * Validates that all spawnable agents reference valid agent types.\n35: * Formats a validation error message for spawnable agents\n41: let message = `Invalid spawnable agents: ${invalidAgents.join(', ')}. Double check the id, including the org prefix if applicable.`\n\n./common/src/json-config/__tests__/__snapshots__/stringify-schema.test.ts.snap:\n85: // (optional): Specify complete list of spawnable agents for the base agent\n\n./common/src/tools/params/tool/spawn-agents.ts:\n7:export const spawnAgentsParams = {\n\n./common/src/tools/params/tool/spawn-agents-async.ts:\n7:export const spawnAgentsAsyncParams = {", - "message": "Exit code: 0" - }, - { - "stdout": "./npm-app/src/cli-handlers/agent-creation-chat.ts:\n77: // Create a simple prompt for the agent builder with the requirements\n88: // Use the resetAgent helper to properly switch to agent-builder which automatically spawns the agent builder\n\n./npm-app/src/cli-handlers/agents.ts:\n560: // Switch to agent-builder which automatically spawns the agent builder for agent creation\n\n./backend/src/templates/agents/agent-builder.ts:\n30:export const agentBuilder = (\n135: 'You are an expert agent builder specialized in creating new agent templates for the codebuff system. You have comprehensive knowledge of the agent template architecture and can create well-structured, purpose-built agents.',\n224:The agent builder is focused on creating new agent templates based on user specifications.\n\n./backend/src/templates/agent-list.ts:\n18:import { agentBuilder } from './agents/agent-builder'\n77: ...agentBuilder(models.openrouter_claude_sonnet_4),", - "message": "Exit code: 0" - }, - { - "stdout": "./common/src/constants/agents.ts:\n3:// Define agent personas with their shared characteristics", - "message": "Exit code: 0" - } - ] - }, - "agentId": "D-Ofa741I0M", - "parentAgentId": "main-agent", - "includeToolCall": false - }, - { - "type": "tool_result", - "toolCallId": "cbcd47c4-b9ab-4235-a6ae-d5ca80e0d822", - "toolName": "set_output", - "output": [ - { - "type": "json", - "value": { - "message": "Output set" - } - } - ], - "parentAgentId": "D-Ofa741I0M" - }, - { - "type": "subagent_finish", - "agentId": "D-Ofa741I0M", - "agentType": "code-searcher", - "displayName": "Code Searcher", - "onlyChild": false, - "parentAgentId": "main-agent", - "prompt": "", - "params": { - "searchQueries": [ - { - "pattern": "diff-reviewer" - }, - { - "pattern": "your-custom-agent" - }, - { - "pattern": "spawnable agents|spawnAgents" - }, - { - "pattern": "agent builder|agentBuilder" - }, - { - "pattern": "agent personas|agentPersonas" - } - ] - } - }, - { - "type": "text", - "agentId": "D-OfaV526OE", - "text": ".agents/brainstormer.ts\n.agents/planner.ts\n.agents/researcher.ts\n.agents/reviewer.ts\n.agents/thinker.ts\n.agents/superagent.ts\nbackend/src/templates/agents/agent-list.ts\nbackend/src/templates/agents/base.ts\ncommon/src/constants/agents.ts\ncommon/src/types/agent-template.ts\nnpm-app/src/agents/load-agents.ts\nweb/src/content/agents/overview.mdx" - }, - { - "type": "subagent_finish", - "agentId": "D-OgGtcToUQ", - "agentType": "file-lister", - "displayName": "Liszt the File Lister", - "onlyChild": true, - "parentAgentId": "D-OfaV526OE", - "prompt": "", - "params": { - "prompt": "agent personas, list of agent personalities or types" - } - }, - { - "type": "tool_result", - "toolCallId": "3c204c3d-25bd-4014-b0b9-935f91f963e5", - "toolName": "spawn_agents", - "output": [ - { - "type": "json", - "value": [ - { - "agentName": "Liszt the File Lister", - "agentType": "file-lister", - "value": { - "type": "lastMessage", - "value": [ - { - "role": "assistant", - "content": [ - { - "type": "text", - "text": ".agents/brainstormer.ts\n.agents/planner.ts\n.agents/researcher.ts\n.agents/reviewer.ts\n.agents/thinker.ts\n.agents/superagent.ts\nbackend/src/templates/agents/agent-list.ts\nbackend/src/templates/agents/base.ts\ncommon/src/constants/agents.ts\ncommon/src/types/agent-template.ts\nnpm-app/src/agents/load-agents.ts\nweb/src/content/agents/overview.mdx" - } - ] - } - ] - } - } - ] - } - ], - "parentAgentId": "D-OfaV526OE" - }, - { - "type": "tool_call", - "toolCallId": "f392a70e-4bbb-4025-9d8e-e88342eab3f0", - "toolName": "read_files", - "input": { - "paths": [ - ".agents/brainstormer.ts", - ".agents/planner.ts", - ".agents/researcher.ts", - ".agents/reviewer.ts", - ".agents/thinker.ts", - ".agents/superagent.ts", - "backend/src/templates/agents/agent-list.ts", - "backend/src/templates/agents/base.ts", - "common/src/constants/agents.ts", - "common/src/types/agent-template.ts", - "npm-app/src/agents/load-agents.ts", - "web/src/content/agents/overview.mdx" - ] - }, - "agentId": "D-OfaV526OE", - "parentAgentId": "main-agent", - "includeToolCall": true - }, - { - "type": "tool_result", - "toolCallId": "f392a70e-4bbb-4025-9d8e-e88342eab3f0", - "toolName": "read_files", - "output": [ - { - "type": "json", - "value": [ - { - "path": ".agents/brainstormer.ts", - "content": "import { publisher, version } from './constants'\n\nimport type { AgentDefinition } from './types/agent-definition'\n\nconst definition: AgentDefinition = {\n id: 'brainstormer',\n version,\n publisher,\n displayName: 'Brian the Brainstormer',\n model: 'anthropic/claude-4-sonnet-20250522',\n\n includeMessageHistory: true,\n inputSchema: {\n prompt: {\n type: 'string',\n description: 'The problem or topic to brainstorm about.',\n },\n },\n outputMode: 'last_message',\n\n toolNames: ['spawn_agents', 'end_turn'],\n spawnableAgents: [\n `codebuff/thinker@${version}`,\n `codebuff/researcher@${version}`,\n ],\n\n spawnPurposePrompt:\n 'Acts as a creative thought partner, generating ideas and exploring alternative viewpoints to help think through problems.',\n\n systemPrompt: `# Persona: Brian the Brainstormer - Creative Thought Partner\n\nYou are an expert brainstorming partner who excels at generating creative ideas, exploring alternative approaches, and helping users think through problems from multiple angles.\n\n## Your Role\n\n- **Idea Generator**: Propose creative and unconventional solutions\n- **Devil's Advocate**: Challenge assumptions and explore counterarguments\n- **Perspective Shifter**: Offer different viewpoints and approaches\n- **Question Asker**: Ask probing questions that unlock new thinking\n- **Pattern Connector**: Find unexpected connections between concepts\n\n## Your Approach\n\n- Think divergently before converging on solutions\n- Explore \"what if\" scenarios and edge cases\n- Consider multiple stakeholder perspectives\n- Balance practical constraints with creative possibilities\n- Use analogies and metaphors to spark new insights\n- Challenge the status quo respectfully\n\n## Guidelines\n\n- Be enthusiastic and encouraging about exploration\n- Offer 3-5 distinct alternatives when possible\n- Ask clarifying questions to understand context better\n- Build on the user's ideas while adding your own spin\n- Consider both short-term and long-term implications\n- Balance optimism with realistic assessment\n\nRemember: Your goal is to expand thinking, not to provide definitive answers. Help the user see their problem space more clearly and discover new possibilities they might not have considered.`,\n\n instructionsPrompt:\n 'Act as a creative thought partner. Generate multiple perspectives, challenge assumptions, explore alternatives, and ask probing questions to help think through problems more thoroughly.',\n}\n\nexport default definition\n", - "referencedBy": {} - }, - { - "path": ".agents/planner.ts", - "content": "import { publisher, version } from './constants'\n\nimport type { AgentDefinition } from './types/agent-definition'\n\nconst definition: AgentDefinition = {\n id: 'planner',\n version,\n publisher,\n model: 'x-ai/grok-4-07-09',\n displayName: 'Peter Plan the Planner',\n toolNames: ['think_deeply', 'spawn_agents', 'end_turn'],\n spawnableAgents: [],\n inputSchema: {\n prompt: {\n description:\n 'What problem you to solve and a few ideas and suggestions for the plan',\n type: 'string',\n },\n },\n outputMode: 'last_message',\n includeMessageHistory: true,\n\n spawnPurposePrompt: 'Agent that formulates a comprehensive plan to a prompt.',\n systemPrompt: `You are an expert software architect. You are good at creating comprehensive plans to tackle the user request.`,\n instructionsPrompt: `Steps for your response:\n1. Use the tool to think through cruxes for the plan, and tricky cases. Consider alternative approaches. Be sure to close the tool call with .\n2. Write out your plan in a concise way.\n3. Spawn 1-5 dry run agents to sketch portions of the implementation of the plan. (Important: do not forget to close the tool call with \"\"!)\n4. Synthesize all the information and rewrite the full plan to be the best it can be. Use the end_turn tool.`,\n}\n\nexport default definition\n", - "referencedBy": {} - }, - { - "path": ".agents/researcher.ts", - "content": "import { publisher, version } from './constants'\n\nimport type { AgentDefinition } from './types/agent-definition'\n\nconst definition: AgentDefinition = {\n id: 'researcher',\n version,\n publisher,\n model: 'gemini-2.5-flash-preview-05-20',\n displayName: 'Reid Searcher the Researcher',\n toolNames: ['web_search', 'read_docs', 'read_files', 'end_turn'],\n\n inputSchema: {\n prompt: {\n description:\n 'A question you would like answered using web search and documentation',\n type: 'string',\n },\n },\n outputMode: 'last_message',\n includeMessageHistory: false,\n\n spawnPurposePrompt:\n 'Expert at researching topics using web search and documentation.',\n systemPrompt: `# Persona: {CODEBUFF_AGENT_NAME}\n\nYou are an expert researcher who can search the web and read documentation to find relevant information. Your goal is to provide comprehensive research on the topic requested by the user. Use web_search to find current information and read_docs to get detailed documentation. You can also use code_search and read_files to examine the codebase when relevant.\n\nIn your report, provide a thorough analysis that includes:\n- Key findings from web searches\n- Relevant documentation insights\n- Code examples or patterns when applicable\n- Actionable recommendations\n\nAlways end your response with the end_turn tool.`,\n stepPrompt: \"Don't forget to end your response with the end_turn tool.\",\n handleSteps: function* ({ agentState, prompt, params }) {\n yield {\n toolName: 'web_search',\n args: { query: prompt ?? '', depth: 'standard' },\n }\n yield 'STEP_ALL'\n },\n}\n\nexport default definition\n", - "referencedBy": {} - }, - { - "path": ".agents/reviewer.ts", - "content": "import { publisher, version } from './constants'\n\nimport type { AgentDefinition } from './types/agent-definition'\n\nconst definition: AgentDefinition = {\n id: 'reviewer',\n version,\n publisher,\n model: 'gemini-2.5-pro-preview-06-05',\n displayName: 'Nit Pick Nick the Reviewer',\n\n toolNames: ['end_turn', 'run_file_change_hooks'],\n\n inputSchema: {\n prompt: {\n description: 'What should be reviewed. Be brief.',\n type: 'string',\n },\n },\n outputMode: 'last_message',\n includeMessageHistory: true,\n\n spawnPurposePrompt:\n 'Reviews file changes and responds with critical feedback. Use this after making any significant change to the codebase.',\n systemPrompt: `# Persona: {CODEBUFF_AGENT_NAME}\n\n\nconst definition: AgentDefinition = {\nYou are an expert programmer who can articulate very clear feedback on code changes.\n{CODEBUFF_TOOLS_PROMPT}\n\n{CODEBUFF_AGENTS_PROMPT}`,\n instructionsPrompt: `Your task is to provide helpful feedback on the last file changes made by the assistant. You should critique the code changes made recently in the above conversation.\n\nIMPORTANT: After analyzing the file changes, you should:\n1. Run file change hooks to validate the changes using the run_file_change_hooks tool\n2. Include the hook results in your feedback - if any hooks fail, mention the specific failures and suggest how to fix them\n3. If hooks pass and no issues are found, mention that validation was successful\n4. Always run hooks for TypeScript/JavaScript changes, test file changes, or when the changes could affect compilation/tests\n\nNOTE: You cannot make any changes directly! You can only suggest changes.\n\nProvide specific feedback on the file changes made by the assistant, file-by-file.\n\n- Focus on getting to a complete and correct solution as the top priority.\n- Try to keep any changes to the codebase as minimal as possible.\n- Simplify any logic that can be simplified.\n- Where a function can be reused, reuse it and do not create a new one.\n- Make sure that no new dead code is introduced.\n- Make sure there are no missing imports.\n- Make sure no sections were deleted that weren't supposed to be deleted.\n- Make sure the new code matches the style of the existing code.\n\nBe concise and to the point. After providing all your feedback, use the end_turn tool to end your response.`,\n stepPrompt:\n \"IMPORTANT: Don't forget to end your response with the end_turn tool: \",\n}\n\nexport default definition\n", - "referencedBy": {} - }, - { - "path": ".agents/thinker.ts", - "content": "import { publisher, version } from './constants'\n\nimport type { AgentDefinition } from './types/agent-definition'\n\nconst definition: AgentDefinition = {\n id: 'thinker',\n version,\n publisher,\n model: 'x-ai/grok-4-07-09',\n displayName: 'Theo the Theorizer',\n\n inputSchema: {\n prompt: {\n description: 'The problem you are trying to solve',\n type: 'string',\n },\n },\n outputMode: 'last_message',\n includeMessageHistory: true,\n toolNames: ['end_turn'],\n spawnableAgents: [],\n spawnPurposePrompt:\n 'Does deep thinking given the current messages and a specific prompt to focus on. Use this to help you solve a specific problem.',\n systemPrompt: `# Persona: {CODEBUFF_AGENT_NAME}\n\nYou are an expert programmer.\n{CODEBUFF_TOOLS_PROMPT}\n\n{CODEBUFF_AGENTS_PROMPT}`,\n instructionsPrompt: `Think deeply, step by step, about the user request and how best to approach it.\n\nConsider edge cases, potential issues, and alternative approaches.\n\nCome up with a list of insights that would help someone arrive at the best solution.\n\nTry not to be too prescriptive or confident in one solution. Instead, give clear arguments and reasoning.\n\nYou must be extremely concise and to the point.`,\n stepPrompt:\n \"Don't forget to end your response with the end_turn tool: \",\n}\n\nexport default definition\n", - "referencedBy": {} - }, - { - "path": ".agents/superagent.ts", - "content": "import { publisher, version } from './constants'\n\nimport type { AgentDefinition } from './types/agent-definition'\n\nconst definition: AgentDefinition = {\n id: 'superagent',\n version,\n publisher,\n model: 'anthropic/claude-4-sonnet-20250522',\n displayName: 'Superagent',\n\n toolNames: ['spawn_agents', 'spawn_agents_async', 'end_turn', 'think_deeply'],\n spawnableAgents: [\n `codebuff/thinker@${version}`,\n `codebuff/base@${version}`,\n `codebuff/ask@${version}`,\n ],\n\n inputSchema: {\n prompt: {\n description: 'A coding task to complete',\n type: 'string',\n },\n },\n outputMode: 'last_message',\n includeMessageHistory: false,\n\n spawnPurposePrompt:\n 'Superagent that can spawn multiple code editing agents to complete a task.',\n systemPrompt: `You are an expert orchestrator that can solve any problem, including coding tasks.`,\n instructionsPrompt: `Answer the user\\'s question or complete the task by spawning copies of the base agent.\n\nIf you have all the information you need, just write out the response and do not spawn any agents.\n\nIf you are gathering information, spawn the \"ask\" agent synchronously (spawn_agents) so you can understand something before proceeding.\n\nIf you are delegating a coding task, spawn the \"base\" agent *asynchronously* (spawn_agents_async) so you can help the user with other tasks while the spawned agent works on the code.\n\nPrefer sending a message to a previous agent over spawning a new agent, especially if that agent was previously working on a similar task.\n\nFeel free to ask the user for clarification if you are unsure what to do.`,\n stepPrompt:\n 'Spawn as many agents as you can to help. Use the end_turn tool at the end of your response when you have completed the user request or want the user to respond to your message or if you are waiting for a response from an agent.',\n}\n\nexport default definition\n", - "referencedBy": {} - }, - { - "path": "backend/src/templates/agents/agent-list.ts", - "content": "[FILE_DOES_NOT_EXIST]", - "referencedBy": {} - }, - { - "path": "backend/src/templates/agents/base.ts", - "content": "import { AGENT_PERSONAS } from '@codebuff/common/constants/agents'\nimport { AgentTemplateTypes } from '@codebuff/common/types/session-state'\nimport z from 'zod/v4'\n\nimport {\n baseAgentAgentStepPrompt,\n baseAgentSystemPrompt,\n baseAgentUserInputPrompt,\n} from '../base-prompts'\n\nimport type { AgentTemplate } from '../types'\nimport type { Model } from '@codebuff/common/constants'\n\nexport const base = (\n model: Model,\n allAvailableAgents?: string[],\n): Omit => ({\n model,\n displayName: AGENT_PERSONAS.base.displayName,\n spawnPurposePrompt: AGENT_PERSONAS.base.purpose,\n inputSchema: {\n prompt: z.string().describe('A coding task to complete'),\n },\n outputMode: 'last_message',\n includeMessageHistory: false,\n toolNames: [\n 'create_plan',\n 'run_terminal_command',\n 'str_replace',\n 'write_file',\n 'spawn_agents',\n 'add_subgoal',\n 'browser_logs',\n 'code_search',\n 'end_turn',\n 'read_files',\n 'think_deeply',\n 'update_subgoal',\n ],\n spawnableAgents: allAvailableAgents\n ? (allAvailableAgents as any[])\n : [\n AgentTemplateTypes.file_explorer,\n AgentTemplateTypes.file_picker,\n AgentTemplateTypes.researcher,\n AgentTemplateTypes.thinker,\n AgentTemplateTypes.reviewer,\n ],\n\n systemPrompt: baseAgentSystemPrompt(model),\n instructionsPrompt: baseAgentUserInputPrompt(model),\n stepPrompt: baseAgentAgentStepPrompt(model),\n})\n", - "referencedBy": {} - }, - { - "path": "common/src/constants/agents.ts", - "content": "import type { AgentTemplateTypes } from '../types/session-state'\n\n// Define agent personas with their shared characteristics\nexport const AGENT_PERSONAS = {\n // Base agents - all use Buffy persona\n base: {\n displayName: 'Buffy the Enthusiastic Coding Assistant',\n purpose: 'Base agent that orchestrates the full response.',\n } as const,\n base_lite: {\n displayName: 'Buffy the Enthusiastic Coding Assistant',\n purpose: 'Base agent that orchestrates the full response.',\n } as const,\n base_max: {\n displayName: 'Buffy the Enthusiastic Coding Assistant',\n purpose: 'Base agent that orchestrates the full response.',\n } as const,\n base_experimental: {\n displayName: 'Buffy the Enthusiastic Coding Assistant',\n purpose: 'Base agent that orchestrates the full response.',\n } as const,\n claude4_gemini_thinking: {\n displayName: 'Buffy the Enthusiastic Coding Assistant',\n purpose: 'Base agent that orchestrates the full response.',\n } as const,\n\n base_agent_builder: {\n displayName: 'Buffy the Enthusiastic Agent Builder',\n purpose:\n 'Enhanced base agent that can create custom agents and handle all coding tasks',\n } as const,\n\n superagent: {\n displayName: 'Superagent',\n purpose:\n 'Superagent that can spawn multiple code editing agents to complete a task.',\n } as const,\n\n // Ask mode\n ask: {\n displayName: 'Buffy the Enthusiastic Coding Assistant',\n purpose: 'Base ask-mode agent that orchestrates the full response.',\n } as const,\n\n // Specialized agents\n thinker: {\n displayName: 'Theo the Theorizer',\n purpose:\n 'Does deep thinking given the current messages and a specific prompt to focus on. Use this to help you solve a specific problem.',\n } as const,\n file_explorer: {\n displayName: 'Dora The File Explorer',\n purpose: 'Expert at exploring a codebase and finding relevant files.',\n } as const,\n file_picker: {\n displayName: 'Fletcher the File Fetcher',\n purpose: 'Expert at finding relevant files in a codebase.',\n } as const,\n researcher: {\n displayName: 'Reid Searcher the Researcher',\n purpose: 'Expert at researching topics using web search and documentation.',\n } as const,\n planner: {\n displayName: 'Peter Plan the Planner',\n purpose: 'Agent that formulates a comprehensive plan to a prompt.',\n hidden: true,\n } as const,\n dry_run: {\n displayName: 'Sketch the Dry Runner',\n purpose: 'Agent that takes a plan and try to implement it in a dry run.',\n hidden: true,\n } as const,\n reviewer: {\n displayName: 'Nit Pick Nick the Reviewer',\n purpose:\n 'Reviews file changes and responds with critical feedback. Use this after making any significant change to the codebase.',\n } as const,\n agent_builder: {\n displayName: 'Bob the Agent Builder',\n purpose: 'Creates new agent templates for the codebuff mult-agent system',\n hidden: false,\n } as const,\n} as const satisfies Partial<\n Record<\n keyof typeof AgentTemplateTypes,\n { displayName: string; purpose: string; hidden?: boolean }\n >\n>\n\n// Agent IDs list from AGENT_PERSONAS keys\nexport const AGENT_IDS = Object.keys(\n AGENT_PERSONAS,\n) as (keyof typeof AGENT_PERSONAS)[]\n\n// Agent ID prefix constant\nexport const AGENT_ID_PREFIX = 'CodebuffAI/'\n\n// Agent names for client-side reference\nexport const AGENT_NAMES = Object.fromEntries(\n Object.entries(AGENT_PERSONAS).map(([agentType, persona]) => [\n agentType,\n persona.displayName,\n ]),\n) as Record\n\nexport type AgentName =\n (typeof AGENT_PERSONAS)[keyof typeof AGENT_PERSONAS]['displayName']\n\n// Get unique agent names for UI display\nexport const UNIQUE_AGENT_NAMES = Array.from(\n new Set(\n Object.values(AGENT_PERSONAS)\n .filter((persona) => !('hidden' in persona) || !persona.hidden)\n .map((persona) => persona.displayName),\n ),\n)\n\n// Map from display name back to agent types (for parsing user input)\nexport const AGENT_NAME_TO_TYPES = Object.entries(AGENT_NAMES).reduce(\n (acc, [type, name]) => {\n if (!acc[name]) acc[name] = []\n acc[name].push(type)\n return acc\n },\n {} as Record,\n)\n", - "referencedBy": {} - }, - { - "path": "common/src/types/agent-template.ts", - "content": "import type { Model } from '../constants'\nimport type { AgentState, AgentTemplateType } from './session-state'\nimport type { ToolName } from '../tools/constants'\nimport type { ToolCall } from '../util/types/agent-definition'\nimport type { z } from 'zod/v4'\n\nexport type AgentTemplate<\n P = string | undefined,\n T = Record | undefined,\n> = {\n id: AgentTemplateType\n displayName: string\n model: Model\n\n toolNames: ToolName[]\n spawnableAgents: AgentTemplateType[]\n\n spawnPurposePrompt?: string\n systemPrompt: string\n instructionsPrompt: string\n stepPrompt: string\n parentInstructions?: Record\n\n // Required parameters for spawning this agent.\n inputSchema: {\n prompt?: z.ZodSchema

\n params?: z.ZodSchema\n }\n includeMessageHistory: boolean\n outputMode: 'last_message' | 'all_messages' | 'structured_output'\n outputSchema?: z.ZodSchema\n\n handleSteps?: StepHandler | string // Function or string of the generator code for running in a sandbox\n}\n\nexport type StepGenerator = Generator<\n Omit | 'STEP' | 'STEP_ALL', // Generic tool call type\n void,\n { agentState: AgentState; toolResult: string | undefined }\n>\n\nexport type StepHandler<\n P = string | undefined,\n T = Record | undefined,\n> = (params: { agentState: AgentState; prompt: P; params: T }) => StepGenerator\n", - "referencedBy": {} - }, - { - "path": "npm-app/src/agents/load-agents.ts", - "content": "import * as fs from 'fs'\nimport * as path from 'path'\n\nimport { cyan, green } from 'picocolors'\n\nimport { getAllTsFiles, getAgentsDirectory } from './agent-utils'\n\nimport type { CodebuffConfig } from '@codebuff/common/json-config/constants'\n\nexport let loadedAgents: Record = {}\nexport async function loadLocalAgents({\n verbose = false,\n}: {\n verbose?: boolean\n}): Promise {\n loadedAgents = {}\n\n const agentsDir = getAgentsDirectory()\n\n if (!fs.existsSync(agentsDir)) {\n return loadedAgents\n }\n\n try {\n const tsFiles = getAllTsFiles(agentsDir)\n\n for (const fullPath of tsFiles) {\n const relativePath = path.relative(agentsDir, fullPath)\n const fileName = relativePath.replace(/\\.ts$/, '').replace(/[/\\\\]/g, '-')\n\n let agentDefinition: any\n let agentModule: any\n try {\n agentModule = await require(fullPath)\n } catch (error: any) {\n if (verbose) {\n console.error('Error importing agent:', error)\n }\n continue\n }\n delete require.cache[fullPath]\n\n try {\n agentDefinition = agentModule.default\n } catch (error: any) {\n console.error('Error loading agent from file:', fullPath, error)\n continue\n }\n\n if (!agentDefinition) continue\n\n // Convert handleSteps function to string if present\n let processedAgentDefinition = { ...agentDefinition }\n\n if (agentDefinition.handleSteps) {\n processedAgentDefinition.handleSteps =\n agentDefinition.handleSteps.toString()\n }\n\n loadedAgents[fileName] = processedAgentDefinition\n }\n } catch (error) {}\n return loadedAgents\n}\n\nexport function getLoadedAgentNames(): Record {\n return Object.fromEntries(\n Object.entries(loadedAgents).map(([agentType, agentConfig]) => {\n return [agentType, agentConfig.displayName]\n }),\n )\n}\n\n/**\n * Display loaded agents to the user\n */\nexport function displayLoadedAgents(codebuffConfig: CodebuffConfig) {\n const baseAgent = codebuffConfig.baseAgent\n if (baseAgent) {\n console.log(`\\n${green('Configured base agent:')} ${cyan(baseAgent)}`)\n }\n\n const spawnableAgents = codebuffConfig.spawnableAgents\n if (spawnableAgents) {\n console.log(\n `${green('Configured spawnable agents:')} ${spawnableAgents\n .map((name) => cyan(name))\n .join(', ')}\\n`,\n )\n } else if (Object.keys(loadedAgents).length > 0) {\n const loadedAgentNames = Object.values(getLoadedAgentNames())\n console.log(\n `\\n${green('Found custom agents:')} ${loadedAgentNames\n .map((name) => cyan(name))\n .join(', ')}\\n`,\n )\n } else if (baseAgent) {\n // One more new line.\n console.log()\n }\n}\n", - "referencedBy": {} - }, - { - "path": "web/src/content/agents/overview.mdx", - "content": "---\ntitle: 'Overview'\nsection: 'agents'\ntags: ['agents', 'multi-agent', 'overview']\norder: 0\n---\n\n# Overview\n\n## Why Multi-Agent Systems Work Better\n\nCodebuff uses specialized agents that collaborate instead of one agent doing everything. Agents spawn other agents, share tools, and pass context between tasks. Here are some of the sub-agents Codebuff uses:\n\n- **Code Generation** - Write clean, functional code\n- **Review** - Catch bugs, security issues, style violations\n- **Research** - Find documentation and examples\n- **Planning** - Break down complex requirements\n- **File Discovery** - Navigate large codebases\n\n## Agent Workflow\n\nA typical call to Codebuff may result in the following flow:\n\n```mermaid\nflowchart TD\n A[User Request] --> B{Task Type}\n\n B -->|Feature Development| C[Planning Agent]\n B -->|Bug Investigation| D[Thinker Agent]\n B -->|Code Refactoring| E[File Picker Agent]\n\n C --> F[File Picker Agent]\n D --> G[Research Agent]\n E --> H[Planning Agent]\n\n F --> I[Base Agent]\n G --> I\n H --> I\n\n I --> J[Reviewer Agent]\n J --> K[Complete]\n\n style A fill:#e1f5fe\n style I fill:#f3e5f5\n style J fill:#e8f5e8\n style K fill:#fff3e0\n```\n\n### Example: Authentication System Refactoring\n\nIf you say \"refactor this authentication system\", Codebuff might break down the task into the following steps:\n\n1. **File Picker** finds auth-related files\n2. **Research** looks up best practices\n3. **Planning** creates step-by-step plan\n4. **Base** implements changes informed by the previous agents\n5. **Reviewer** checks for security issues\n\n### Domain-Specific Customization\n\nAgents adapt to your specific workflow and project needs. You can create specialized agents tailored to your domain or build new ones for unique tasks, like the following:\n\n- **Frontend**: React component reviewer\n- **Backend**: API security reviewer\n- **DevOps**: Infrastructure deployment agent\n\n### Agent Coordination\n\nAgents can coordinate with each other using **parent instructions** - a powerful feature that allows one agent to provide specific guidance to the agents it spawns. This creates intelligent workflows where:\n\n- A security-focused agent ensures all spawned reviewers check for vulnerabilities\n- A frontend coordinator guides file pickers to find React components\n- A documentation agent instructs researchers to prioritize official docs\n\nThis coordination happens automatically without requiring complex overrides or manual configuration.\n\n## Quick Start\n\n1. **[Customize existing agents](/docs/agents#customizing-agents)** - Modify prompts and tools\n2. **[Create new agents](/docs/agents#creating-new-agents)** - Build specialized functionality\n3. **[Reference guide](/docs/agents#agent-reference)** - Complete field documentation\n", - "referencedBy": {} - } - ] - } - ], - "parentAgentId": "D-OfaV526OE" - }, - { - "type": "text", - "agentId": "D-OfaYSx8-Q", - "text": ".agents/git-committer.ts\nbackend/src/templates/agents/base.ts\nbackend/src/templates/agents/thinking-base.ts\nbackend/src/templates/agents/file-picker.ts\nbackend/src/templates/agents/planner.ts\nbackend/src/templates/agent-list.ts\nbackend/src/templates/agent-registry.ts\ncommon/src/templates/dynamic-agent-template.ts\ncommon/src/types/agent-template.ts\ncommon/src/templates/agent-validation.ts\nnpm-app/src/agents/load-agents.ts\nnpm-app/src/cli-handlers/agents.ts" - }, - { - "type": "subagent_finish", - "agentId": "D-Ogo19lSyI", - "agentType": "file-lister", - "displayName": "Liszt the File Lister", - "onlyChild": true, - "parentAgentId": "D-OfaYSx8-Q", - "prompt": "", - "params": { - "prompt": "your-custom-agent starter template or git-committer agent" - } - }, - { - "type": "tool_result", - "toolCallId": "5fb459f2-3aca-4499-b719-39696556c4d8", - "toolName": "spawn_agents", - "output": [ - { - "type": "json", - "value": [ - { - "agentName": "Liszt the File Lister", - "agentType": "file-lister", - "value": { - "type": "lastMessage", - "value": [ - { - "role": "assistant", - "content": [ - { - "type": "text", - "text": ".agents/git-committer.ts\nbackend/src/templates/agents/base.ts\nbackend/src/templates/agents/thinking-base.ts\nbackend/src/templates/agents/file-picker.ts\nbackend/src/templates/agents/planner.ts\nbackend/src/templates/agent-list.ts\nbackend/src/templates/agent-registry.ts\ncommon/src/templates/dynamic-agent-template.ts\ncommon/src/types/agent-template.ts\ncommon/src/templates/agent-validation.ts\nnpm-app/src/agents/load-agents.ts\nnpm-app/src/cli-handlers/agents.ts" - } - ] - } - ] - } - } - ] - } - ], - "parentAgentId": "D-OfaYSx8-Q" - }, - { - "type": "tool_call", - "toolCallId": "8f05b455-303a-4642-b77b-d064963d2872", - "toolName": "read_files", - "input": { - "paths": [ - ".agents/git-committer.ts", - "backend/src/templates/agents/base.ts", - "backend/src/templates/agents/thinking-base.ts", - "backend/src/templates/agents/file-picker.ts", - "backend/src/templates/agents/planner.ts", - "backend/src/templates/agent-list.ts", - "backend/src/templates/agent-registry.ts", - "common/src/templates/dynamic-agent-template.ts", - "common/src/types/agent-template.ts", - "common/src/templates/agent-validation.ts", - "npm-app/src/agents/load-agents.ts", - "npm-app/src/cli-handlers/agents.ts" - ] - }, - "agentId": "D-OfaYSx8-Q", - "parentAgentId": "main-agent", - "includeToolCall": true - }, - { - "type": "tool_result", - "toolCallId": "8f05b455-303a-4642-b77b-d064963d2872", - "toolName": "read_files", - "output": [ - { - "type": "json", - "value": [ - { - "path": ".agents/git-committer.ts", - "content": "import { publisher, version } from './constants'\n\nimport type {\n AgentDefinition,\n AgentStepContext,\n} from './types/agent-definition'\n\nconst definition: AgentDefinition = {\n id: 'git-committer',\n version,\n publisher,\n displayName: 'Git Committer',\n model: 'anthropic/claude-4-sonnet-20250522',\n toolNames: ['read_files', 'run_terminal_command', 'add_message', 'end_turn'],\n\n inputSchema: {\n prompt: {\n type: 'string',\n description: 'What changes to commit',\n },\n },\n\n includeMessageHistory: false,\n outputMode: 'last_message',\n\n spawnPurposePrompt:\n 'Spawn when you need to commit code changes to git with an appropriate commit message',\n\n systemPrompt:\n 'You are an expert software developer. Your job is to create a git commit with a really good commit message.',\n\n instructionsPrompt:\n 'Follow the steps to create a good commit: analyze changes with git diff and git log, read relevant files for context, stage appropriate files, analyze changes, and create a commit with proper formatting including the Codebuff footer.',\n\n handleSteps: function* ({ agentState, prompt, params }: AgentStepContext) {\n // Step 1: Run git diff and git log to analyze changes\n yield {\n toolName: 'run_terminal_command',\n args: {\n command: 'git diff',\n process_type: 'SYNC',\n timeout_seconds: 30,\n },\n }\n\n yield {\n toolName: 'run_terminal_command',\n args: {\n command: 'git log --oneline -10',\n process_type: 'SYNC',\n timeout_seconds: 30,\n },\n }\n\n // Step 2: Let AI analyze the changes and read relevant files for context\n yield {\n toolName: 'add_message',\n args: {\n role: 'assistant',\n content:\n \"I've analyzed the git diff and recent commit history. Now I'll read any relevant files to better understand the context of these changes.\",\n },\n }\n\n // Step 3: Let AI decide which files to read and stage\n yield 'STEP'\n\n // Step 4: Let AI analyze staged changes and compose commit message\n yield {\n toolName: 'add_message',\n args: {\n role: 'assistant',\n content:\n \"Now I'll analyze the staged changes and create a commit with the proper Codebuff footer format.\",\n },\n }\n\n yield 'STEP_ALL'\n },\n}\n\nexport default definition\n", - "referencedBy": {} - }, - { - "path": "backend/src/templates/agents/base.ts", - "content": "import { AGENT_PERSONAS } from '@codebuff/common/constants/agents'\nimport { AgentTemplateTypes } from '@codebuff/common/types/session-state'\nimport z from 'zod/v4'\n\nimport {\n baseAgentAgentStepPrompt,\n baseAgentSystemPrompt,\n baseAgentUserInputPrompt,\n} from '../base-prompts'\n\nimport type { AgentTemplate } from '../types'\nimport type { Model } from '@codebuff/common/constants'\n\nexport const base = (\n model: Model,\n allAvailableAgents?: string[],\n): Omit => ({\n model,\n displayName: AGENT_PERSONAS.base.displayName,\n spawnPurposePrompt: AGENT_PERSONAS.base.purpose,\n inputSchema: {\n prompt: z.string().describe('A coding task to complete'),\n },\n outputMode: 'last_message',\n includeMessageHistory: false,\n toolNames: [\n 'create_plan',\n 'run_terminal_command',\n 'str_replace',\n 'write_file',\n 'spawn_agents',\n 'add_subgoal',\n 'browser_logs',\n 'code_search',\n 'end_turn',\n 'read_files',\n 'think_deeply',\n 'update_subgoal',\n ],\n spawnableAgents: allAvailableAgents\n ? (allAvailableAgents as any[])\n : [\n AgentTemplateTypes.file_explorer,\n AgentTemplateTypes.file_picker,\n AgentTemplateTypes.researcher,\n AgentTemplateTypes.thinker,\n AgentTemplateTypes.reviewer,\n ],\n\n systemPrompt: baseAgentSystemPrompt(model),\n instructionsPrompt: baseAgentUserInputPrompt(model),\n stepPrompt: baseAgentAgentStepPrompt(model),\n})\n", - "referencedBy": {} - }, - { - "path": "backend/src/templates/agents/thinking-base.ts", - "content": "import { AGENT_PERSONAS } from '@codebuff/common/constants/agents'\nimport z from 'zod/v4'\n\nimport {\n baseAgentAgentStepPrompt,\n baseAgentSystemPrompt,\n baseAgentUserInputPrompt,\n} from '../base-prompts'\nimport { baseAgentSubagents, baseAgentToolNames } from '../types'\n\nimport type { AgentTemplate } from '../types'\nimport type { Model } from '@codebuff/common/constants'\n\nexport const thinkingBase = (\n model: Model,\n allAvailableAgents?: string[],\n): Omit => ({\n model,\n displayName: AGENT_PERSONAS.base_lite.displayName,\n spawnPurposePrompt: AGENT_PERSONAS.base_lite.purpose,\n inputSchema: {\n prompt: z.string().describe('A coding task to complete'),\n },\n outputMode: 'last_message',\n includeMessageHistory: false,\n toolNames: baseAgentToolNames,\n spawnableAgents: allAvailableAgents\n ? (allAvailableAgents as any[])\n : baseAgentSubagents,\n\n systemPrompt: baseAgentSystemPrompt(model),\n instructionsPrompt: baseAgentUserInputPrompt(model),\n stepPrompt: baseAgentAgentStepPrompt(model),\n\n handleSteps: function* ({ agentState, prompt, params }) {\n while (true) {\n yield {\n toolName: 'spawn_agents',\n args: {\n agents: [\n {\n agent_type: 'thinker',\n prompt: 'Think deeply about the user request',\n },\n ],\n },\n }\n yield 'STEP'\n }\n },\n})\n", - "referencedBy": {} - }, - { - "path": "backend/src/templates/agents/file-picker.ts", - "content": "import { AGENT_PERSONAS } from '@codebuff/common/constants/agents'\nimport z from 'zod/v4'\n\nimport { PLACEHOLDER } from '../types'\n\nimport type { AgentTemplate } from '../types'\nimport type { Model } from '@codebuff/common/constants'\n\nexport const filePicker = (model: Model): Omit => ({\n model,\n displayName: AGENT_PERSONAS.file_picker.displayName,\n spawnPurposePrompt: AGENT_PERSONAS.file_picker.purpose,\n inputSchema: {\n prompt: z.string().describe('A coding task to complete'),\n },\n outputMode: 'last_message',\n includeMessageHistory: false,\n toolNames: ['find_files'],\n spawnableAgents: [],\n\n systemPrompt:\n `# Persona: ${PLACEHOLDER.AGENT_NAME}\n\nYou are an expert at finding relevant files in a codebase.\n\\n\\n` +\n [\n PLACEHOLDER.TOOLS_PROMPT,\n PLACEHOLDER.AGENTS_PROMPT,\n PLACEHOLDER.FILE_TREE_PROMPT,\n PLACEHOLDER.SYSTEM_INFO_PROMPT,\n PLACEHOLDER.GIT_CHANGES_PROMPT,\n ].join('\\n\\n'),\n instructionsPrompt: `\nProvide the locations in the codebase that could be helpful. Focus on the files that are most relevant to the user prompt.\nIn your report, please give an extremely concise analysis that includes the full paths of files that are relevant and (very briefly) how they could be useful.\n `.trim(),\n stepPrompt: `Do not use the find_files tool or any tools again. Just give your response.`,\n\n handleSteps: function* ({ agentState, prompt, params }) {\n yield {\n toolName: 'find_files',\n args: { prompt },\n }\n yield 'STEP_ALL'\n },\n})\n", - "referencedBy": {} - }, - { - "path": "backend/src/templates/agents/planner.ts", - "content": "import { AGENT_PERSONAS } from '@codebuff/common/constants/agents'\nimport { closeXml } from '@codebuff/common/util/xml'\nimport z from 'zod/v4'\n\nimport { PLACEHOLDER } from '../types'\n\nimport type { AgentTemplate } from '../types'\nimport type { Model } from '@codebuff/common/constants'\n\nexport const planner = (model: Model): Omit => ({\n model,\n displayName: AGENT_PERSONAS.planner.displayName,\n spawnPurposePrompt: AGENT_PERSONAS.planner.purpose,\n inputSchema: {\n prompt: z\n .string()\n .describe(\n 'What problem you to solve and a few ideas and suggestions for the plan',\n ),\n },\n outputMode: 'last_message',\n includeMessageHistory: true,\n toolNames: ['think_deeply', 'spawn_agents', 'end_turn'],\n spawnableAgents: [], // ARCHIVED: [AgentTemplateTypes.dry_run],\n\n systemPrompt: `# Persona: ${PLACEHOLDER.AGENT_NAME}\n\nYou are an expert software architect. You are good at creating comprehensive plans to tackle the user request.\n\n${PLACEHOLDER.TOOLS_PROMPT}\n\n${PLACEHOLDER.AGENTS_PROMPT}`,\n\n instructionsPrompt: `Steps for your response:\n1. Use the tool to think through cruxes for the plan, and tricky cases. Consider alternative approaches. Be sure to close the tool call with ${closeXml('think_deeply')}.\n2. Write out your plan in a concise way.\n3. Spawn 1-5 dry run agents to sketch portions of the implementation of the plan. (Important: do not forget to close the tool call with \"${closeXml('spawn_agents')}\"!)\n4. Synthesize all the information and rewrite the full plan to be the best it can be. Use the end_turn tool.`,\n\n stepPrompt:\n 'Do not forget to use the end_turn tool to end your response. Make sure the final plan is the best it can be.',\n})\n", - "referencedBy": {} - }, - { - "path": "backend/src/templates/agent-list.ts", - "content": "import { models } from '@codebuff/common/constants'\nimport { AgentTemplateTypes } from '@codebuff/common/types/session-state'\n\nimport { dryRun } from './agents/archive/dry-run'\nimport { ask } from './agents/ask'\nimport { base } from './agents/base'\nimport { fileExplorer } from './agents/file-explorer'\nimport { filePicker } from './agents/file-picker'\nimport { planner } from './agents/planner'\nimport { researcher } from './agents/researcher'\nimport { reviewer } from './agents/reviewer'\nimport { superagent } from './agents/superagent'\nimport { thinker } from './agents/thinker'\nimport { thinkingBase } from './agents/thinking-base'\n\nimport type { AgentTemplate } from './types'\nimport type { AgentTemplateType } from '@codebuff/common/types/session-state'\nimport { agentBuilder } from './agents/agent-builder'\n\nexport const agentTemplates: Record =\n {\n [AgentTemplateTypes.base]: {\n id: AgentTemplateTypes.base,\n ...base(models.openrouter_claude_sonnet_4),\n },\n [AgentTemplateTypes.base_lite]: {\n id: AgentTemplateTypes.base_lite,\n ...base(models.openrouter_gpt5),\n },\n [AgentTemplateTypes.base_max]: {\n id: AgentTemplateTypes.base_max,\n ...base(models.openrouter_claude_opus_4),\n },\n [AgentTemplateTypes.base_experimental]: {\n id: AgentTemplateTypes.base_experimental,\n ...base(models.gemini2_5_pro_preview),\n },\n [AgentTemplateTypes.ask]: {\n id: AgentTemplateTypes.ask,\n ...ask(models.gemini2_5_pro_preview),\n },\n [AgentTemplateTypes.superagent]: {\n id: AgentTemplateTypes.superagent,\n ...superagent(models.openrouter_claude_sonnet_4),\n },\n [AgentTemplateTypes.claude4_gemini_thinking]: {\n id: AgentTemplateTypes.claude4_gemini_thinking,\n ...thinkingBase(models.openrouter_claude_sonnet_4),\n },\n\n [AgentTemplateTypes.thinker]: {\n id: AgentTemplateTypes.thinker,\n ...thinker(models.openrouter_grok_4),\n },\n [AgentTemplateTypes.file_picker]: {\n id: AgentTemplateTypes.file_picker,\n ...filePicker(models.gemini2_5_flash),\n },\n [AgentTemplateTypes.researcher]: {\n id: AgentTemplateTypes.researcher,\n ...researcher(models.gemini2_5_flash),\n },\n [AgentTemplateTypes.planner]: {\n id: AgentTemplateTypes.planner,\n ...planner(models.openrouter_grok_4),\n },\n [AgentTemplateTypes.dry_run]: {\n id: AgentTemplateTypes.dry_run,\n ...dryRun(models.gemini2_5_flash),\n },\n [AgentTemplateTypes.reviewer]: {\n id: AgentTemplateTypes.reviewer,\n ...reviewer(models.gemini2_5_pro_preview),\n },\n [AgentTemplateTypes.agent_builder]: {\n id: AgentTemplateTypes.agent_builder,\n ...agentBuilder(models.openrouter_claude_sonnet_4),\n },\n [AgentTemplateTypes.file_explorer]: fileExplorer as any as AgentTemplate,\n }\n", - "referencedBy": {} - }, - { - "path": "backend/src/templates/agent-registry.ts", - "content": "import type { AgentTemplate } from '@codebuff/common/types/agent-template'\nimport db from '@codebuff/common/db'\nimport * as schema from '@codebuff/common/db/schema'\nimport { and, desc, eq } from 'drizzle-orm'\n\nimport { ProjectFileContext } from '@codebuff/common/util/file'\nimport { logger } from '../util/logger'\nimport { agentTemplates as staticTemplates } from './agent-list'\nimport {\n DynamicAgentValidationError,\n validateAgents,\n validateSingleAgent,\n} from '@codebuff/common/templates/agent-validation'\nimport { DynamicAgentTemplate } from '@codebuff/common/types/dynamic-agent-template'\n\nexport type AgentRegistry = Record\n\n// Global database cache - only state in the system\nconst databaseAgentCache = new Map()\n\n/**\n * Parse agent ID to extract publisher, agent name, and version\n */\nfunction parseAgentId(fullAgentId: string): {\n publisherId: string\n agentId: string\n version?: string\n} | null {\n // Check if it's in the publisher/agent-id[@version] format\n const parts = fullAgentId.split('/')\n if (parts.length !== 2) {\n return null\n }\n\n const [publisherId, agentNameWithVersion] = parts\n\n // Check for version suffix\n const versionMatch = agentNameWithVersion.match(/^(.+)@(.+)$/)\n if (versionMatch) {\n const [, agentId, version] = versionMatch\n return { publisherId, agentId, version }\n }\n\n return { publisherId, agentId: agentNameWithVersion }\n}\n\n/**\n * Fetch an agent from the database by publisher/agent-id[@version] format\n */\nasync function fetchAgentFromDatabase(parsedAgentId: {\n publisherId: string\n agentId: string\n version?: string\n}): Promise {\n const { publisherId, agentId, version } = parsedAgentId\n\n try {\n let agentConfig\n\n if (version && version !== 'latest') {\n // Query for specific version\n agentConfig = await db\n .select()\n .from(schema.agentConfig)\n .where(\n and(\n eq(schema.agentConfig.id, agentId),\n eq(schema.agentConfig.publisher_id, publisherId),\n eq(schema.agentConfig.version, version),\n ),\n )\n .then((rows) => rows[0])\n } else {\n // Query for latest version\n agentConfig = await db\n .select()\n .from(schema.agentConfig)\n .where(\n and(\n eq(schema.agentConfig.id, agentId),\n eq(schema.agentConfig.publisher_id, publisherId),\n ),\n )\n .orderBy(\n desc(schema.agentConfig.major),\n desc(schema.agentConfig.minor),\n desc(schema.agentConfig.patch),\n )\n .limit(1)\n .then((rows) => rows[0])\n }\n\n if (!agentConfig) {\n logger.debug(\n { publisherId, agentId, version },\n 'fetchAgentFromDatabase: Agent not found in database',\n )\n return null\n }\n\n const rawAgentData = agentConfig.data as DynamicAgentTemplate\n\n // Validate the raw agent data with the original agentId (not full identifier)\n const validationResult = validateSingleAgent(\n { ...rawAgentData, id: agentId },\n {\n filePath: `${publisherId}/${agentId}@${agentConfig.version}`,\n skipSubagentValidation: true,\n },\n )\n\n if (!validationResult.success) {\n logger.error(\n {\n publisherId,\n agentId,\n version: agentConfig.version,\n error: validationResult.error,\n },\n 'fetchAgentFromDatabase: Agent validation failed',\n )\n return null\n }\n\n // Set the correct full agent ID for the final template\n const agentTemplate = {\n ...validationResult.agentTemplate!,\n id: `${publisherId}/${agentId}@${agentConfig.version}`,\n }\n\n logger.debug(\n {\n publisherId,\n agentId,\n version: agentConfig.version,\n fullAgentId: agentTemplate.id,\n },\n 'fetchAgentFromDatabase: Successfully loaded and validated agent from database',\n )\n\n return agentTemplate\n } catch (error) {\n logger.error(\n { publisherId, agentId, version, error },\n 'fetchAgentFromDatabase: Error fetching agent from database',\n )\n return null\n }\n}\n\n/**\n * Single function to look up an agent template with clear priority order:\n * 1. localAgentTemplates (dynamic agents + static templates)\n * 2. Database cache\n * 3. Database query\n */\nexport async function getAgentTemplate(\n agentId: string,\n localAgentTemplates: Record,\n): Promise {\n // 1. Check localAgentTemplates first (dynamic agents + static templates)\n if (localAgentTemplates[agentId]) {\n return localAgentTemplates[agentId]\n }\n // 2. Check database cache\n const cacheKey = agentId\n if (databaseAgentCache.has(cacheKey)) {\n return databaseAgentCache.get(cacheKey) || null\n }\n\n const parsed = parseAgentId(agentId)\n if (!parsed) {\n logger.debug({ agentId }, 'getAgentTemplate: Failed to parse agent ID')\n return null\n }\n\n // 3. Query database (only for publisher/agent-id format)\n const dbAgent = await fetchAgentFromDatabase(parsed)\n if (dbAgent && parsed.version && parsed.version !== 'latest') {\n // Cache only specific versions to avoid stale 'latest' results\n databaseAgentCache.set(cacheKey, dbAgent)\n }\n return dbAgent\n}\n\n/**\n * Assemble local agent templates from fileContext + static templates\n */\nexport function assembleLocalAgentTemplates(fileContext: ProjectFileContext): {\n agentTemplates: Record\n validationErrors: DynamicAgentValidationError[]\n} {\n // Load dynamic agents using the service\n const { templates: dynamicTemplates, validationErrors } = validateAgents(\n fileContext.agentTemplates || {},\n )\n\n // Combine static and dynamic templates\n const agentTemplates = { ...staticTemplates, ...dynamicTemplates }\n\n return { agentTemplates, validationErrors }\n}\n\n/**\n * Clear the database agent cache (useful for testing)\n */\nexport function clearDatabaseCache(): void {\n databaseAgentCache.clear()\n}\n", - "referencedBy": {} - }, - { - "path": "common/src/templates/dynamic-agent-template.ts", - "content": "[FILE_DOES_NOT_EXIST]", - "referencedBy": {} - }, - { - "path": "common/src/types/agent-template.ts", - "content": "import type { Model } from '../constants'\nimport type { AgentState, AgentTemplateType } from './session-state'\nimport type { ToolName } from '../tools/constants'\nimport type { ToolCall } from '../util/types/agent-definition'\nimport type { z } from 'zod/v4'\n\nexport type AgentTemplate<\n P = string | undefined,\n T = Record | undefined,\n> = {\n id: AgentTemplateType\n displayName: string\n model: Model\n\n toolNames: ToolName[]\n spawnableAgents: AgentTemplateType[]\n\n spawnPurposePrompt?: string\n systemPrompt: string\n instructionsPrompt: string\n stepPrompt: string\n parentInstructions?: Record\n\n // Required parameters for spawning this agent.\n inputSchema: {\n prompt?: z.ZodSchema

\n params?: z.ZodSchema\n }\n includeMessageHistory: boolean\n outputMode: 'last_message' | 'all_messages' | 'structured_output'\n outputSchema?: z.ZodSchema\n\n handleSteps?: StepHandler | string // Function or string of the generator code for running in a sandbox\n}\n\nexport type StepGenerator = Generator<\n Omit | 'STEP' | 'STEP_ALL', // Generic tool call type\n void,\n { agentState: AgentState; toolResult: string | undefined }\n>\n\nexport type StepHandler<\n P = string | undefined,\n T = Record | undefined,\n> = (params: { agentState: AgentState; prompt: P; params: T }) => StepGenerator\n", - "referencedBy": {} - }, - { - "path": "common/src/templates/agent-validation.ts", - "content": "import { convertJsonSchemaToZod } from 'zod-from-json-schema'\n\nimport {\n formatSpawnableAgentError,\n validateSpawnableAgents,\n} from '../util/agent-template-validation'\nimport { logger } from '../util/logger'\nimport {\n DynamicAgentDefinitionSchema,\n DynamicAgentTemplateSchema,\n} from '../types/dynamic-agent-template'\nimport type { AgentTemplate } from '../types/agent-template'\nimport type { DynamicAgentTemplate } from '../types/dynamic-agent-template'\n\nexport interface DynamicAgentValidationError {\n filePath: string\n message: string\n}\n\n/**\n * Collect all agent IDs from template files without full validation\n */\nexport function collectAgentIds(\n agentTemplates: Record = {},\n): string[] {\n const agentIds: string[] = []\n const jsonFiles = Object.keys(agentTemplates)\n\n for (const filePath of jsonFiles) {\n try {\n const content = agentTemplates[filePath]\n if (!content) {\n continue\n }\n\n // Extract the agent ID if it exists\n if (content.id && typeof content.id === 'string') {\n agentIds.push(content.id)\n }\n } catch (error) {\n // Log but don't fail the collection process for other errors\n logger.debug(\n { filePath, error },\n 'Failed to extract agent ID during collection phase',\n )\n }\n }\n\n return agentIds\n}\n\n/**\n * Validate and load dynamic agent templates from user-provided agentTemplates\n */\nexport function validateAgents(agentTemplates: Record = {}): {\n templates: Record\n validationErrors: DynamicAgentValidationError[]\n} {\n const templates: Record = {}\n const validationErrors: DynamicAgentValidationError[] = []\n\n const hasAgentTemplates = Object.keys(agentTemplates).length > 0\n\n if (!hasAgentTemplates) {\n return {\n templates,\n validationErrors,\n }\n }\n\n const agentKeys = Object.keys(agentTemplates)\n\n // Pass 1: Collect all agent IDs from template files\n const dynamicAgentIds = collectAgentIds(agentTemplates)\n\n // Pass 2: Load and validate each agent template\n for (const agentKey of agentKeys) {\n const content = agentTemplates[agentKey]\n try {\n if (!content) {\n continue\n }\n\n const validationResult = validateSingleAgent(content, {\n filePath: agentKey,\n dynamicAgentIds,\n })\n\n if (!validationResult.success) {\n validationErrors.push({\n filePath: agentKey,\n message: validationResult.error!,\n })\n continue\n }\n\n if (templates[validationResult.agentTemplate!.id]) {\n const agentContext = validationResult.agentTemplate!.displayName\n ? `Agent \"${validationResult.agentTemplate!.id}\" (${validationResult.agentTemplate!.displayName})`\n : `Agent \"${validationResult.agentTemplate!.id}\"`\n\n validationErrors.push({\n filePath: agentKey,\n message: `${agentContext}: Duplicate agent ID`,\n })\n continue\n }\n templates[validationResult.agentTemplate!.id] =\n validationResult.agentTemplate!\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : 'Unknown error'\n\n // Try to extract agent context for better error messages\n const agentContext = content?.id\n ? `Agent \"${content.id}\"${content.displayName ? ` (${content.displayName})` : ''}`\n : `Agent in ${agentKey}`\n\n validationErrors.push({\n filePath: agentKey,\n message: `${agentContext}: ${errorMessage}`,\n })\n\n logger.warn(\n { filePath: agentKey, error: errorMessage },\n 'Failed to load dynamic agent template',\n )\n }\n }\n\n return {\n templates,\n validationErrors,\n }\n}\n\n/**\n * Validates a single dynamic agent template and converts it to an AgentTemplate.\n * This is a plain function equivalent to the core logic of loadSingleAgent.\n *\n * @param dynamicAgentIds - Array of all available dynamic agent IDs for validation\n * @param template - The raw agent template to validate (any type)\n * @param options - Optional configuration object\n * @param options.filePath - Optional file path for error context\n * @param options.skipSubagentValidation - Skip subagent validation when loading from database\n * @returns Validation result with either the converted AgentTemplate or an error\n */\nexport function validateSingleAgent(\n template: any,\n options?: {\n dynamicAgentIds?: string[]\n filePath?: string\n skipSubagentValidation?: boolean\n },\n): {\n success: boolean\n agentTemplate?: AgentTemplate\n error?: string\n} {\n const {\n filePath,\n skipSubagentValidation = true,\n dynamicAgentIds = [],\n } = options || {}\n\n try {\n // First validate against the Zod schema\n let validatedConfig: DynamicAgentTemplate\n try {\n const typedAgentDefinition = DynamicAgentDefinitionSchema.parse(template)\n\n // Convert handleSteps function to string if present\n let handleStepsString: string | undefined\n if (template.handleSteps) {\n handleStepsString = template.handleSteps.toString()\n }\n\n validatedConfig = DynamicAgentTemplateSchema.parse({\n ...typedAgentDefinition,\n systemPrompt: typedAgentDefinition.systemPrompt || '',\n instructionsPrompt: typedAgentDefinition.instructionsPrompt || '',\n stepPrompt: typedAgentDefinition.stepPrompt || '',\n handleSteps: handleStepsString,\n })\n } catch (error: any) {\n // Try to extract agent context for better error messages\n const agentContext = template.id\n ? `Agent \"${template.id}\"${template.displayName ? ` (${template.displayName})` : ''}`\n : filePath\n ? `Agent in ${filePath}`\n : 'Agent'\n\n return {\n success: false,\n error: `${agentContext}: Schema validation failed: ${error.message}`,\n }\n }\n\n // Validate spawnable agents (skip if requested, e.g., for database agents)\n if (!skipSubagentValidation) {\n const spawnableAgentValidation = validateSpawnableAgents(\n validatedConfig.spawnableAgents,\n dynamicAgentIds,\n )\n if (!spawnableAgentValidation.valid) {\n return {\n success: false,\n error: formatSpawnableAgentError(\n spawnableAgentValidation.invalidAgents,\n spawnableAgentValidation.availableAgents,\n ),\n }\n }\n }\n\n // Convert schemas and handle validation errors\n let inputSchema: AgentTemplate['inputSchema']\n try {\n inputSchema = convertInputSchema(\n validatedConfig.inputSchema?.prompt,\n validatedConfig.inputSchema?.params,\n filePath,\n )\n } catch (error) {\n // Try to extract agent context for better error messages\n const agentContext = validatedConfig.id\n ? `Agent \"${validatedConfig.id}\"${validatedConfig.displayName ? ` (${validatedConfig.displayName})` : ''}`\n : filePath\n ? `Agent in ${filePath}`\n : 'Agent'\n return {\n success: false,\n error: `${agentContext}: ${\n error instanceof Error ? error.message : 'Schema conversion failed'\n }`,\n }\n }\n\n // Convert outputSchema if present\n let outputSchema: AgentTemplate['outputSchema']\n if (validatedConfig.outputSchema) {\n try {\n outputSchema = convertJsonSchemaToZod(validatedConfig.outputSchema)\n } catch (error) {\n // Try to extract agent context for better error messages\n const agentContext = validatedConfig.id\n ? `Agent \"${validatedConfig.id}\"${validatedConfig.displayName ? ` (${validatedConfig.displayName})` : ''}`\n : filePath\n ? `Agent in ${filePath}`\n : 'Agent'\n\n return {\n success: false,\n error: `${agentContext}: Failed to convert outputSchema to Zod: ${error instanceof Error ? error.message : 'Unknown error'}`,\n }\n }\n }\n\n // Validate handleSteps if present\n if (validatedConfig.handleSteps) {\n if (!isValidGeneratorFunction(validatedConfig.handleSteps)) {\n // Try to extract agent context for better error messages\n const agentContext = validatedConfig.id\n ? `Agent \"${validatedConfig.id}\"${validatedConfig.displayName ? ` (${validatedConfig.displayName})` : ''}`\n : filePath\n ? `Agent in ${filePath}`\n : 'Agent'\n\n return {\n success: false,\n error: `${agentContext}: handleSteps must be a generator function: \"function* (params) { ... }\". Found: ${validatedConfig.handleSteps.substring(0, 50)}...`,\n }\n }\n }\n\n // Convert to internal AgentTemplate format\n const agentTemplate: AgentTemplate = {\n ...validatedConfig,\n outputSchema,\n inputSchema,\n }\n\n return {\n success: true,\n agentTemplate,\n }\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : 'Unknown error'\n\n // Try to extract agent context for better error messages\n const agentContext = template?.id\n ? `Agent \"${template.id}\"${template.displayName ? ` (${template.displayName})` : ''}`\n : filePath\n ? `Agent in ${filePath}`\n : 'Agent'\n\n return {\n success: false,\n error: `${agentContext}: Error validating agent template: ${errorMessage}`,\n }\n }\n}\n\n/**\n * Validates if a string represents a valid generator function\n */\nfunction isValidGeneratorFunction(code: string): boolean {\n const trimmed = code.trim()\n // Check if it's a generator function (must start with function*)\n return trimmed.startsWith('function*')\n}\n\n/**\n * Convert JSON schema to Zod schema format using json-schema-to-zod.\n * This is done once during loading to avoid repeated conversions.\n * Throws descriptive errors for validation failures.\n */\nfunction convertInputSchema(\n inputPromptSchema?: Record,\n paramsSchema?: Record,\n filePath?: string,\n): AgentTemplate['inputSchema'] {\n const result: any = {}\n const fileContext = filePath ? ` in ${filePath}` : ''\n\n // Handle prompt schema\n if (inputPromptSchema) {\n try {\n if (\n typeof inputPromptSchema !== 'object' ||\n Object.keys(inputPromptSchema).length === 0\n ) {\n throw new Error(\n `Invalid inputSchema.prompt${fileContext}: Schema must be a valid non-empty JSON schema object. Found: ${typeof inputPromptSchema}`,\n )\n }\n const promptZodSchema = convertJsonSchemaToZod(inputPromptSchema)\n // Validate that the schema results in string or undefined\n const testResult = promptZodSchema.safeParse('test')\n const testUndefined = promptZodSchema.safeParse(undefined)\n\n if (!testResult.success && !testUndefined.success) {\n const errorDetails =\n testResult.error?.issues?.[0]?.message || 'validation failed'\n throw new Error(\n `Invalid inputSchema.prompt${fileContext}: Schema must allow string or undefined values. ` +\n `Current schema validation error: ${errorDetails}. ` +\n `Please ensure your JSON schema accepts string types.`,\n )\n }\n\n result.prompt = promptZodSchema\n } catch (error) {\n if (error instanceof Error && error.message.includes('inputSchema')) {\n // Re-throw our custom validation errors\n throw error\n }\n\n // Handle json-schema-to-zod conversion errors\n const errorMessage =\n error instanceof Error ? error.message : 'Unknown error'\n throw new Error(\n `Failed to convert inputSchema.prompt to Zod${fileContext}: ${errorMessage}. ` +\n `Please check that your inputSchema.prompt is a valid non-empty JSON schema object.`,\n )\n }\n }\n\n // Handle params schema\n if (paramsSchema) {\n try {\n if (\n typeof paramsSchema !== 'object' ||\n Object.keys(paramsSchema).length === 0\n ) {\n throw new Error(\n `Invalid inputSchema.params${fileContext}: Schema must be a valid non-empty JSON schema object. Found: ${typeof paramsSchema}`,\n )\n }\n const paramsZodSchema = convertJsonSchemaToZod(paramsSchema)\n result.params = paramsZodSchema\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : 'Unknown error'\n throw new Error(\n `Failed to convert inputSchema.params to Zod${fileContext}: ${errorMessage}. ` +\n `Please check that your inputSchema.params is a valid non-empty JSON schema object.`,\n )\n }\n }\n return result\n}\n", - "referencedBy": {} - }, - { - "path": "npm-app/src/agents/load-agents.ts", - "content": "import * as fs from 'fs'\nimport * as path from 'path'\n\nimport { cyan, green } from 'picocolors'\n\nimport { getAllTsFiles, getAgentsDirectory } from './agent-utils'\n\nimport type { CodebuffConfig } from '@codebuff/common/json-config/constants'\n\nexport let loadedAgents: Record = {}\nexport async function loadLocalAgents({\n verbose = false,\n}: {\n verbose?: boolean\n}): Promise {\n loadedAgents = {}\n\n const agentsDir = getAgentsDirectory()\n\n if (!fs.existsSync(agentsDir)) {\n return loadedAgents\n }\n\n try {\n const tsFiles = getAllTsFiles(agentsDir)\n\n for (const fullPath of tsFiles) {\n const relativePath = path.relative(agentsDir, fullPath)\n const fileName = relativePath.replace(/\\.ts$/, '').replace(/[/\\\\]/g, '-')\n\n let agentDefinition: any\n let agentModule: any\n try {\n agentModule = await require(fullPath)\n } catch (error: any) {\n if (verbose) {\n console.error('Error importing agent:', error)\n }\n continue\n }\n delete require.cache[fullPath]\n\n try {\n agentDefinition = agentModule.default\n } catch (error: any) {\n console.error('Error loading agent from file:', fullPath, error)\n continue\n }\n\n if (!agentDefinition) continue\n\n // Convert handleSteps function to string if present\n let processedAgentDefinition = { ...agentDefinition }\n\n if (agentDefinition.handleSteps) {\n processedAgentDefinition.handleSteps =\n agentDefinition.handleSteps.toString()\n }\n\n loadedAgents[fileName] = processedAgentDefinition\n }\n } catch (error) {}\n return loadedAgents\n}\n\nexport function getLoadedAgentNames(): Record {\n return Object.fromEntries(\n Object.entries(loadedAgents).map(([agentType, agentConfig]) => {\n return [agentType, agentConfig.displayName]\n }),\n )\n}\n\n/**\n * Display loaded agents to the user\n */\nexport function displayLoadedAgents(codebuffConfig: CodebuffConfig) {\n const baseAgent = codebuffConfig.baseAgent\n if (baseAgent) {\n console.log(`\\n${green('Configured base agent:')} ${cyan(baseAgent)}`)\n }\n\n const spawnableAgents = codebuffConfig.spawnableAgents\n if (spawnableAgents) {\n console.log(\n `${green('Configured spawnable agents:')} ${spawnableAgents\n .map((name) => cyan(name))\n .join(', ')}\\n`,\n )\n } else if (Object.keys(loadedAgents).length > 0) {\n const loadedAgentNames = Object.values(getLoadedAgentNames())\n console.log(\n `\\n${green('Found custom agents:')} ${loadedAgentNames\n .map((name) => cyan(name))\n .join(', ')}\\n`,\n )\n } else if (baseAgent) {\n // One more new line.\n console.log()\n }\n}\n", - "referencedBy": {} - }, - { - "path": "npm-app/src/cli-handlers/agents.ts", - "content": "import * as fs from 'fs'\nimport * as path from 'path'\n\nimport { AGENT_TEMPLATES_DIR } from '@codebuff/common/constants'\nimport { AgentTemplateTypes } from '@codebuff/common/types/session-state'\nimport {\n filterCustomAgentFiles,\n extractAgentIdFromFileName,\n} from '@codebuff/common/util/agent-file-utils'\nimport { green, yellow, cyan, magenta, bold, gray, red } from 'picocolors'\n\nimport { loadLocalAgents, getLoadedAgentNames } from '../agents/load-agents'\nimport { CLI } from '../cli'\nimport { getProjectRoot } from '../project-files'\nimport { Spinner } from '../utils/spinner'\nimport {\n ENTER_ALT_BUFFER,\n EXIT_ALT_BUFFER,\n CLEAR_SCREEN,\n HIDE_CURSOR,\n SHOW_CURSOR,\n} from '../utils/terminal'\n\nlet isInAgentsBuffer = false\nlet originalKeyHandlers: ((str: string, key: any) => void)[] = []\nlet selectedIndex = 0\nlet scrollOffset = 0\nlet allContentLines: string[] = []\nlet agentLinePositions: number[] = []\nlet agentList: Array<{\n id: string\n name: string\n description?: string\n isBuiltIn: boolean\n filePath?: string\n isCreateNew?: boolean\n isEditAgent?: boolean\n isSeparator?: boolean\n isPlaceholder?: boolean\n isSectionHeader?: boolean\n}> = []\n\nexport function isInAgentsMode(): boolean {\n return isInAgentsBuffer\n}\n\nexport async function enterAgentsBuffer(rl: any, onExit: () => void) {\n if (isInAgentsBuffer) {\n console.log(yellow('Already in agents mode!'))\n return\n }\n\n // Load local agents\n await loadLocalAgents({ verbose: false })\n const localAgents = getLoadedAgentNames()\n\n // Build management actions section with header\n const actions: typeof agentList = [\n {\n id: '__header__',\n name: bold(cyan('Actions')),\n description: '',\n isBuiltIn: false,\n isSectionHeader: true,\n },\n {\n id: '__create_new__',\n name: '+ Create New Agent',\n description: 'Create a new custom agent template',\n isBuiltIn: false,\n isCreateNew: true,\n },\n ]\n\n // Get custom agent files for display purposes\n const agentsDir = path.join(getProjectRoot(), AGENT_TEMPLATES_DIR)\n let customAgentFiles: string[] = []\n if (fs.existsSync(agentsDir)) {\n const files = fs.readdirSync(agentsDir)\n customAgentFiles = filterCustomAgentFiles(files)\n }\n\n // Add agents section header\n actions.push({\n id: '__agents_header__',\n name:\n bold(cyan('Custom Agents')) +\n gray(` • ${customAgentFiles.length} in ${AGENT_TEMPLATES_DIR}`),\n description: '',\n isBuiltIn: false,\n isSectionHeader: true,\n })\n\n // Build agent list starting with management actions\n agentList = [...actions]\n\n // Add custom agents from .agents/templates\n if (customAgentFiles.length > 0) {\n for (const file of customAgentFiles) {\n const agentId = extractAgentIdFromFileName(file)\n const agentName = localAgents[agentId] || agentId\n agentList.push({\n id: agentId,\n name: agentName,\n description: 'Custom user-defined agent',\n isBuiltIn: false,\n filePath: path.join(agentsDir, file),\n })\n }\n } else {\n // If no custom agents, add a helpful message\n agentList.push({\n id: '__no_agents__',\n name: gray('No custom agents found'),\n description: 'Use \"Create New Agent\" above to get started',\n isBuiltIn: false,\n isPlaceholder: true,\n })\n }\n\n // No need for special handling here since we now have a proper placeholder\n\n // Initialize selection to first selectable item\n selectedIndex = 0\n // Find first selectable item (skip section headers, separators, placeholders)\n while (\n selectedIndex < agentList.length &&\n (agentList[selectedIndex]?.isSectionHeader ||\n agentList[selectedIndex]?.isSeparator ||\n agentList[selectedIndex]?.isPlaceholder)\n ) {\n selectedIndex++\n }\n // If no selectable items found, default to 0\n if (selectedIndex >= agentList.length) {\n selectedIndex = 0\n }\n scrollOffset = 0\n\n // Enter alternate screen buffer\n process.stdout.write(ENTER_ALT_BUFFER)\n process.stdout.write(CLEAR_SCREEN)\n process.stdout.write(HIDE_CURSOR)\n\n isInAgentsBuffer = true\n\n // Build content and render\n buildAllContentLines()\n centerSelectedItem()\n renderAgentsList()\n\n // Set up key handler\n setupAgentsKeyHandler(rl, onExit)\n}\n\nexport function exitAgentsBuffer(rl: any) {\n if (!isInAgentsBuffer) {\n return\n }\n\n // Reset state\n selectedIndex = 0\n scrollOffset = 0\n allContentLines = []\n agentLinePositions = []\n agentList = []\n\n // Restore all original key handlers\n if (originalKeyHandlers.length > 0) {\n process.stdin.removeAllListeners('keypress')\n originalKeyHandlers.forEach((handler) => {\n process.stdin.on('keypress', handler)\n })\n originalKeyHandlers = []\n }\n\n // Exit alternate screen buffer\n process.stdout.write(SHOW_CURSOR)\n process.stdout.write(EXIT_ALT_BUFFER)\n\n isInAgentsBuffer = false\n}\n\nfunction centerSelectedItem() {\n if (selectedIndex < 0 || selectedIndex >= agentLinePositions.length) {\n return\n }\n\n const terminalHeight = process.stdout.rows || 24\n const terminalWidth = process.stdout.columns || 80\n const headerHeight = getHeaderLines(terminalWidth).length\n const maxScrollableLines = terminalHeight - headerHeight - 2\n const selectedLineIndex = agentLinePositions[selectedIndex]\n const maxScrollOffset = Math.max(\n 0,\n allContentLines.length - maxScrollableLines,\n )\n\n // Center item in the scrollable viewport\n const centerOffset = selectedLineIndex - Math.floor(maxScrollableLines / 2)\n scrollOffset = Math.max(0, Math.min(maxScrollOffset, centerOffset))\n}\n\nconst getHeaderLines = (terminalWidth: number) => [\n // No header - sections will be labeled inline\n]\n\nfunction buildAllContentLines() {\n const terminalWidth = process.stdout.columns || 80\n const lines: string[] = []\n agentLinePositions = []\n\n if (agentList.length === 0) {\n lines.push(yellow('No agents found.'))\n } else {\n for (let i = 0; i < agentList.length; i++) {\n agentLinePositions.push(lines.length)\n const agent = agentList[i]\n const isSelected = i === selectedIndex\n\n // Handle section headers\n if (agent.isSectionHeader) {\n const cleanName = agent.name.replace(/\\u001b\\[[0-9;]*m/g, '')\n const cleanDescription = agent.description\n ? agent.description.replace(/\\u001b\\[[0-9;]*m/g, '')\n : ''\n const availableWidth = terminalWidth - 4 // Account for padding\n\n if (isSelected) {\n const headerWidth = Math.min(terminalWidth - 6, 60)\n lines.push(` ${cyan('┌' + '─'.repeat(headerWidth + 2) + '┐')}`)\n\n // Right-aligned title with separator line\n const titlePadding = Math.max(0, headerWidth - cleanName.length - 4)\n const separatorLine = '─'.repeat(titlePadding)\n lines.push(\n ` ${cyan('│')} ${gray(separatorLine)} ${agent.name} ${cyan('│')}`,\n )\n\n if (agent.description) {\n const descPadding = Math.max(\n 0,\n headerWidth - cleanDescription.length,\n )\n lines.push(\n ` ${cyan('│')} ${agent.description}${' '.repeat(descPadding)} ${cyan('│')}`,\n )\n }\n lines.push(` ${cyan('└' + '─'.repeat(headerWidth + 2) + '┘')}`)\n } else {\n // Right-aligned title with separator line for unselected\n const titlePadding = Math.max(\n 0,\n availableWidth - cleanName.length - 4,\n )\n const separatorLine = gray('─'.repeat(titlePadding))\n lines.push(` ${separatorLine} ${agent.name}`)\n\n if (agent.description) {\n lines.push(` ${agent.description}`)\n }\n }\n if (i < agentList.length - 1) {\n lines.push('') // Empty line after section header\n }\n continue\n }\n\n // Handle separator (keep for backwards compatibility)\n if (agent.isSeparator) {\n if (isSelected) {\n lines.push(` ${cyan('┌' + '─'.repeat(52) + '┐')}`)\n lines.push(` ${cyan('│')} ${gray(agent.name)} ${cyan('│')}`)\n lines.push(` ${cyan('└' + '─'.repeat(52) + '┘')}`)\n } else {\n lines.push(` ${gray(agent.name)}`)\n }\n if (i < agentList.length - 1) {\n lines.push('') // Empty line after separator\n }\n continue\n }\n\n // Handle placeholder\n if (agent.isPlaceholder) {\n if (isSelected) {\n const boxWidth = Math.min(terminalWidth - 6, 50)\n lines.push(` ${cyan('┌' + '─'.repeat(boxWidth + 2) + '┐')}`)\n lines.push(\n ` ${cyan('│')} ${agent.name} ${' '.repeat(Math.max(0, boxWidth - agent.name.replace(/\\u001b\\[[0-9;]*m/g, '').length))} ${cyan('│')}`,\n )\n lines.push(\n ` ${cyan('│')} ${gray(agent.description || '')} ${' '.repeat(Math.max(0, boxWidth - (agent.description || '').length))} ${cyan('│')}`,\n )\n lines.push(` ${cyan('└' + '─'.repeat(boxWidth + 2) + '┘')}`)\n } else {\n lines.push(` ${agent.name}`)\n lines.push(` ${gray(agent.description || '')}`)\n }\n if (i < agentList.length - 1) {\n lines.push('') // Empty line between items\n }\n continue\n }\n\n // Regular agent items\n const agentInfo =\n agent.isCreateNew || agent.isEditAgent\n ? `${agent.isCreateNew ? green(agent.name) : magenta(agent.name)}`\n : `${bold(agent.name)} ${gray(`(${agent.id})`)}`\n const description = agent.description || 'No description'\n const filePath = agent.filePath\n ? gray(`File: ${path.relative(getProjectRoot(), agent.filePath)}`)\n : ''\n\n const contentForBox = [\n agentInfo,\n gray(description),\n ...(filePath ? [filePath] : []),\n ]\n\n if (isSelected) {\n // Calculate box width based on content\n const maxContentWidth = Math.max(\n ...contentForBox.map(\n (line) => line.replace(/\\u001b\\[[0-9;]*m/g, '').length,\n ),\n )\n const boxWidth = Math.min(terminalWidth - 6, maxContentWidth)\n\n // Add top border\n lines.push(` ${cyan('┌' + '─'.repeat(boxWidth + 2) + '┐')}`)\n\n // Add content lines with proper padding - keep same indentation as unselected\n contentForBox.forEach((line) => {\n const cleanLine = line.replace(/\\u001b\\[[0-9;]*m/g, '')\n const padding = ' '.repeat(Math.max(0, boxWidth - cleanLine.length))\n lines.push(` ${cyan('│')} ${line}${padding} ${cyan('│')}`)\n })\n\n // Add bottom border\n lines.push(` ${cyan('└' + '─'.repeat(boxWidth + 2) + '┘')}`)\n } else {\n // Non-selected items - use same base indentation as selected content\n lines.push(` ${agentInfo}`) // 4 spaces to match selected content position\n lines.push(` ${gray(description)}`)\n if (filePath) {\n lines.push(` ${filePath}`)\n }\n }\n\n if (i < agentList.length - 1) {\n lines.push('') // Empty line between items\n }\n }\n }\n\n allContentLines = lines\n}\n\nfunction renderAgentsList() {\n // Build all content if not already built\n buildAllContentLines()\n\n // Clear screen and move cursor to top\n process.stdout.write(CLEAR_SCREEN)\n\n const terminalHeight = process.stdout.rows || 24\n const terminalWidth = process.stdout.columns || 80\n\n // Render fixed header\n const headerLines = getHeaderLines(terminalWidth)\n process.stdout.write(headerLines.join('\\n'))\n process.stdout.write('\\n')\n\n // Render scrollable content\n const maxScrollableLines = terminalHeight - headerLines.length - 2\n const visibleLines = allContentLines.slice(\n scrollOffset,\n scrollOffset + maxScrollableLines,\n )\n\n // Display scrollable content\n process.stdout.write(visibleLines.join('\\n'))\n\n // Add padding to fill remaining space\n const remainingLines = maxScrollableLines - visibleLines.length\n if (remainingLines > 0) {\n process.stdout.write('\\n'.repeat(remainingLines))\n }\n\n // Display status line at bottom\n const statusLine = `\\n${gray(`Use ↑/↓/j/k to navigate, Enter to select, ESC to go back`)}`\n\n process.stdout.write(statusLine)\n process.stdout.write(HIDE_CURSOR)\n}\n\nfunction setupAgentsKeyHandler(rl: any, onExit: () => void) {\n // Store all original key handlers\n const listeners = process.stdin.listeners('keypress')\n originalKeyHandlers = listeners as ((str: string, key: any) => void)[]\n\n // Remove existing keypress listeners\n process.stdin.removeAllListeners('keypress')\n\n // Add our custom handler\n process.stdin.on('keypress', (str: string, key: any) => {\n if (key && key.name === 'escape') {\n exitAgentsBuffer(rl)\n onExit()\n return\n }\n\n // Handle Ctrl+C - exit to main screen\n if (key && key.ctrl && key.name === 'c') {\n exitAgentsBuffer(rl)\n onExit()\n return\n }\n\n // Handle Enter - switch to selected agent, create new, or edit\n if (key && key.name === 'return') {\n if (agentList.length > 0 && selectedIndex < agentList.length) {\n const selectedAgent = agentList[selectedIndex]\n\n // Skip separators, placeholders, and section headers\n if (\n selectedAgent.isSeparator ||\n selectedAgent.isPlaceholder ||\n selectedAgent.isSectionHeader\n ) {\n return\n }\n\n if (selectedAgent.isCreateNew) {\n exitAgentsBuffer(rl)\n startDirectAgentCreation(onExit)\n } else {\n exitAgentsBuffer(rl)\n // Start spinner for agent switching\n Spinner.get().start(`Switching to agent: ${selectedAgent.name}...`)\n\n // Use resetAgent to switch to the selected agent\n const cliInstance = CLI.getInstance()\n cliInstance\n .resetAgent(selectedAgent.id)\n .then(() => {\n cliInstance.freshPrompt()\n })\n .catch((error) => {\n Spinner.get().stop()\n console.error(red('Error switching to agent:'), error)\n onExit()\n })\n }\n }\n return\n }\n\n // Handle navigation - skip separators, placeholders, and section headers\n if (key && (key.name === 'up' || key.name === 'k')) {\n let newIndex = selectedIndex - 1\n while (\n newIndex >= 0 &&\n (agentList[newIndex]?.isSeparator ||\n agentList[newIndex]?.isPlaceholder ||\n agentList[newIndex]?.isSectionHeader)\n ) {\n newIndex--\n }\n if (newIndex >= 0) {\n selectedIndex = newIndex\n centerSelectedItem()\n }\n\n renderAgentsList()\n return\n }\n if (key && (key.name === 'down' || key.name === 'j')) {\n let newIndex = selectedIndex + 1\n while (\n newIndex < agentList.length &&\n (agentList[newIndex]?.isSeparator ||\n agentList[newIndex]?.isPlaceholder ||\n agentList[newIndex]?.isSectionHeader)\n ) {\n newIndex++\n }\n if (newIndex < agentList.length) {\n selectedIndex = newIndex\n centerSelectedItem()\n renderAgentsList()\n }\n return\n }\n\n if (key && key.name === 'pageup') {\n const newIndex = Math.max(0, selectedIndex - 5)\n if (newIndex !== selectedIndex) {\n selectedIndex = newIndex\n centerSelectedItem()\n renderAgentsList()\n }\n return\n }\n\n if (key && key.name === 'pagedown') {\n const newIndex = Math.min(agentList.length - 1, selectedIndex + 5)\n if (newIndex !== selectedIndex) {\n selectedIndex = newIndex\n centerSelectedItem()\n renderAgentsList()\n }\n return\n }\n\n if (key && key.name === 'home') {\n if (selectedIndex !== 0) {\n selectedIndex = 0\n centerSelectedItem()\n renderAgentsList()\n }\n return\n }\n\n if (key && key.name === 'end') {\n if (selectedIndex !== agentList.length - 1) {\n selectedIndex = agentList.length - 1\n centerSelectedItem()\n renderAgentsList()\n }\n return\n }\n })\n\n // Ensure raw mode for immediate key detection\n if (process.stdin.isTTY) {\n process.stdin.setRawMode(true)\n }\n}\n\nasync function startDirectAgentCreation(onExit: () => void) {\n // Switch to agent-builder which automatically spawns Bob the Agent Builder for agent creation\n const prompt = `Create a new custom agent template for me. Please ask me what kind of agent I'd like to create and help me build it.`\n\n console.log(\n green(\n '\\n🤖 Starting agent creation with Buffy the Enthusiastic Agent Builder...',\n ),\n )\n console.log(\n gray(\n 'Buffy will connect you with Bob the Agent Builder to create your custom agent.',\n ),\n )\n\n try {\n const cliInstance = CLI.getInstance()\n // Switch to agent-builder which automatically spawns the agent builder for agent creation\n await cliInstance.resetAgent(\n AgentTemplateTypes.agent_builder,\n undefined,\n prompt,\n )\n cliInstance.freshPrompt()\n } catch (error) {\n console.error(red('Error starting agent creation:'), error)\n }\n\n onExit()\n}\n\n// Cleanup function\nexport function cleanupAgentsBuffer() {\n if (isInAgentsBuffer) {\n process.stdout.write(SHOW_CURSOR)\n process.stdout.write(EXIT_ALT_BUFFER)\n isInAgentsBuffer = false\n }\n\n // Restore normal terminal mode\n if (process.stdin.isTTY) {\n process.stdin.setRawMode(false)\n }\n // Register cleanup on process exit\n process.on('exit', cleanupAgentsBuffer)\n process.on('SIGINT', cleanupAgentsBuffer)\n process.on('SIGTERM', cleanupAgentsBuffer)\n}\n", - "referencedBy": {} - } - ] - } - ], - "parentAgentId": "D-OfaYSx8-Q" - }, - { - "type": "text", - "agentId": "D-OfY8_NY2s", - "text": "backend/src/templates/agents/agent-builder.ts\nbackend/src/templates/agent-registry.ts\nbackend/src/templates/agent-list.ts\nbackend/src/templates/agents/base.ts\nbackend/src/templates/agents/thinking-base.ts\nbackend/src/templates/base-prompts.ts\ncommon/src/templates/dynamic-agent-template.ts\ncommon/src/types/dynamic-agent-template.ts\ncommon/src/json-config/default.ts\nnpm-app/src/cli-handlers/agent-creation-chat.ts\nnpm-app/src/create-template-project.ts\nweb/src/content/agents/creating-new-agents.mdx" - }, - { - "type": "subagent_finish", - "agentId": "D-OgiVqb-lc", - "agentType": "file-lister", - "displayName": "Liszt the File Lister", - "onlyChild": true, - "parentAgentId": "D-OfY8_NY2s", - "prompt": "", - "params": { - "prompt": "agent builder, agent creation, scaffolding custom agents, agent templates" - } - }, - { - "type": "tool_result", - "toolCallId": "e359f44e-929f-499e-9245-d0f00b579a3c", - "toolName": "spawn_agents", - "output": [ - { - "type": "json", - "value": [ - { - "agentName": "Liszt the File Lister", - "agentType": "file-lister", - "value": { - "type": "lastMessage", - "value": [ - { - "role": "assistant", - "content": [ - { - "type": "text", - "text": "backend/src/templates/agents/agent-builder.ts\nbackend/src/templates/agent-registry.ts\nbackend/src/templates/agent-list.ts\nbackend/src/templates/agents/base.ts\nbackend/src/templates/agents/thinking-base.ts\nbackend/src/templates/base-prompts.ts\ncommon/src/templates/dynamic-agent-template.ts\ncommon/src/types/dynamic-agent-template.ts\ncommon/src/json-config/default.ts\nnpm-app/src/cli-handlers/agent-creation-chat.ts\nnpm-app/src/create-template-project.ts\nweb/src/content/agents/creating-new-agents.mdx" - } - ] - } - ] - } - } - ] - } - ], - "parentAgentId": "D-OfY8_NY2s" - }, - { - "type": "tool_call", - "toolCallId": "7c405474-9532-4f78-84bf-a3898d68cdca", - "toolName": "read_files", - "input": { - "paths": [ - "backend/src/templates/agents/agent-builder.ts", - "backend/src/templates/agent-registry.ts", - "backend/src/templates/agent-list.ts", - "backend/src/templates/agents/base.ts", - "backend/src/templates/agents/thinking-base.ts", - "backend/src/templates/base-prompts.ts", - "common/src/templates/dynamic-agent-template.ts", - "common/src/types/dynamic-agent-template.ts", - "common/src/json-config/default.ts", - "npm-app/src/cli-handlers/agent-creation-chat.ts", - "npm-app/src/create-template-project.ts", - "web/src/content/agents/creating-new-agents.mdx" - ] - }, - "agentId": "D-OfY8_NY2s", - "parentAgentId": "main-agent", - "includeToolCall": true - }, - { - "type": "tool_result", - "toolCallId": "7c405474-9532-4f78-84bf-a3898d68cdca", - "toolName": "read_files", - "output": [ - { - "type": "json", - "value": [ - { - "path": "backend/src/templates/agents/agent-builder.ts", - "content": "import * as fs from 'fs'\nimport * as path from 'path'\n\nimport {\n AGENT_TEMPLATES_DIR,\n openrouterModels,\n AGENT_DEFINITION_FILE,\n} from '@codebuff/common/constants'\nimport { AgentTemplateTypes } from '@codebuff/common/types/session-state'\nimport z from 'zod/v4'\n\nimport type { AgentTemplate } from '../types'\nimport type { Model } from '@codebuff/common/constants'\nimport type { ToolName } from '@codebuff/common/tools/constants'\n\nconst COMMON_UTIL_PATH = '../../../../common/src/util'\nconst TEMPLATE_RELATIVE_PATH =\n `${COMMON_UTIL_PATH}/types/${AGENT_DEFINITION_FILE}` as const\n// Import to validate path exists at compile time\nimport(TEMPLATE_RELATIVE_PATH)\n\nconst TEMPLATE_PATH = path.join(__dirname, TEMPLATE_RELATIVE_PATH)\nconst DEFAULT_MODEL = openrouterModels.openrouter_claude_sonnet_4\nconst TYPES_DIR = path.join(AGENT_TEMPLATES_DIR, 'types')\nconst EXAMPLES_DIR = path.join(AGENT_TEMPLATES_DIR, 'examples')\nconst TEMPLATE_TYPES_PATH = path.join(TYPES_DIR, AGENT_DEFINITION_FILE)\nconst TOOL_DEFINITIONS_FILE = 'tools.d.ts'\nconst TOOL_DEFINITIONS_PATH = path.join(TYPES_DIR, TOOL_DEFINITIONS_FILE)\n\nexport const agentBuilder = (\n model: Model,\n allAvailableAgents?: string[],\n): Omit => {\n // Read the AGENT_CONFIG_FILE content dynamically\n // The import above ensures this path exists at compile time\n let agentTemplateContent = ''\n try {\n agentTemplateContent = fs.readFileSync(TEMPLATE_PATH, 'utf8')\n } catch (error) {\n console.warn(`Could not read ${AGENT_DEFINITION_FILE}:`, error)\n agentTemplateContent = '// Agent template types not available'\n }\n // Read the tools.d.ts content from common package\n let toolDefinitionsContent = ''\n try {\n const toolsPath = path.join(\n __dirname,\n `${COMMON_UTIL_PATH}/types/tools.d.ts`,\n )\n toolDefinitionsContent = fs.readFileSync(toolsPath, 'utf8')\n } catch (error) {\n console.warn(`Could not read tools.d.ts from common:`, error)\n toolDefinitionsContent = '// Tool definitions not available'\n }\n\n // Read example agent files from common package\n const exampleAgentContents: Record = {}\n\n try {\n const exampleAgentsDir = path.join(__dirname, `${COMMON_UTIL_PATH}`)\n // Check if directory exists before trying to read it\n if (fs.existsSync(exampleAgentsDir)) {\n const files = fs.readdirSync(exampleAgentsDir)\n\n files\n .filter(\n (file) => file.endsWith('.ts') && file.startsWith('diff-reviewer'),\n )\n .forEach((filename) => {\n try {\n const fullPath = path.join(exampleAgentsDir, filename)\n const content = fs.readFileSync(fullPath, 'utf8')\n exampleAgentContents[filename] = content\n } catch (error) {\n console.warn(`Could not read example agent ${filename}:`, error)\n }\n })\n } else {\n console.warn(\n `Example agents directory does not exist: ${exampleAgentsDir}`,\n )\n }\n } catch (error) {\n console.warn('Could not read example agents directory:', error)\n }\n\n return {\n model,\n displayName: 'Bob the Agent Builder',\n spawnPurposePrompt:\n 'Enhanced base agent that can create custom agents and handle all coding tasks with deterministic agent creation behavior',\n inputSchema: {\n prompt: z\n .string()\n .optional()\n .describe(\n 'What agent type you would like to create or edit. Include as many details as possible.',\n ),\n params: z\n .object({\n name: z.string().optional(),\n purpose: z.string().optional(),\n specialty: z.string().optional(),\n model: z.string().optional(),\n })\n .passthrough()\n .optional(),\n },\n outputMode: 'structured_output',\n includeMessageHistory: false,\n toolNames: [\n 'write_file',\n 'str_replace',\n 'run_terminal_command',\n 'read_files',\n 'code_search',\n 'spawn_agents',\n 'add_message',\n 'set_output',\n 'end_turn',\n ] satisfies ToolName[],\n spawnableAgents: allAvailableAgents\n ? (allAvailableAgents as any[])\n : [\n AgentTemplateTypes.file_picker,\n AgentTemplateTypes.researcher,\n AgentTemplateTypes.thinker,\n AgentTemplateTypes.reviewer,\n AgentTemplateTypes.agent_builder,\n ],\n\n systemPrompt: [\n '# Bob the Agent Builder',\n '',\n 'You are an expert agent builder specialized in creating new agent templates for the codebuff system. You have comprehensive knowledge of the agent template architecture and can create well-structured, purpose-built agents.',\n '',\n '## Environment Setup Complete',\n '',\n 'Your environment has been automatically prepared with:',\n '- Agent template type definitions in `.agents/types/agent-definition.d.ts`',\n '- Tool type definitions in `.agents/types/tools.d.ts`',\n '- Example agent files copied to `.agents/` directory for reference',\n '',\n 'All necessary files are now available in your working directory.',\n '',\n '## Complete Agent Template Type Definitions',\n '',\n 'Here are the complete TypeScript type definitions for creating custom Codebuff agents:',\n '```typescript',\n agentTemplateContent,\n '```',\n '',\n '## Available Tools Type Definitions',\n '',\n 'Here are the complete TypeScript type definitions for all available tools:',\n '',\n '```typescript',\n toolDefinitionsContent,\n '```',\n '',\n '## Agent Template Patterns:',\n '',\n '1. **Base Agent Pattern**: Full-featured agents with comprehensive tool access',\n '2. **Specialized Agent Pattern**: Focused agents with limited tool sets',\n '3. **Thinking Agent Pattern**: Agents that spawn thinker sub-agents',\n '4. **Research Agent Pattern**: Agents that start with web search',\n '',\n '## Best Practices:',\n '',\n '1. **Use as few fields as possible**: Leave out fields that are not needed to reduce complexity',\n '2. **Minimal Tools**: Only include tools the agent actually needs',\n '3. **Clear and Concise Prompts**: Write clear, specific prompts that have no unnecessary words',\n '4. **Consistent Naming**: Follow naming conventions (kebab-case for IDs)',\n '5. **Appropriate Model**: Choose the right model for the task complexity. Default is claude-4-sonnet-20250522 for medium-high complexity tasks, and openai/gpt-5 for all other tasks.',\n '',\n '## Your Task:',\n 'When asked to create an agent template, you should:',\n \"1. Understand the requested agent's purpose and capabilities\",\n \"2. Choose appropriate tools for the agent's function\",\n '3. Write a comprehensive system prompt',\n `4. Create the complete agent template file in ${AGENT_TEMPLATES_DIR}`,\n '5. Ensure the template follows all conventions and best practices',\n '6. Use the AgentDefinition interface for the configuration',\n '7. Start the file with: import type { AgentDefinition } from \"./types/agent-definition.d.ts\"',\n '',\n 'Create agent templates that are focused, efficient, and well-documented. Always import the AgentDefinition type and export a default configuration object.',\n ].join('\\n'),\n instructionsPrompt: `You are helping to create or edit an agent template. The user will describe what kind of agent they want to create or how they want to modify an existing agent.\n\n## Environment Ready\n\nYour environment has been automatically set up with:\n- Type definitions in \\`.agents/types/\\`\n- Example agent files in \\`.agents/\\` directory\n- All necessary scaffolding complete\n\nYou can now proceed directly to agent creation or editing.\n\n## Example Agents Available\n\nThree example agents are now available in your \\`.agents/\\` directory which are all diff reviewers of increasing complexity. These can serve as examples of well-made agents at different stages of complexity.\n\n**IMPORTANT**: Examine these examples to find connections and patterns that relate to the user's request. Look for:\n- Similar tool combinations\n- Comparable complexity levels\n- Related functionality patterns\n- Appropriate model choices\n- Relevant prompt structures\n\nUse these examples as inspiration and starting points, adapting their patterns to fit the user's specific needs.\n\n## For New Agents\n\nAnalyze their request and create a complete agent template that:\n- Has a clear purpose and appropriate capabilities\n- Leaves out fields that are not needed\n- Uses only the tools it needs\n- Follows naming conventions\n- Is properly structured\n- Draws inspiration from relevant example agents\n\n## For Creating New Agents\n\nThe agent builder is focused on creating new agent templates based on user specifications.\n\nIMPORTANT: Always end your response with the end_turn tool when you have completed the agent creation or editing task.`,\n stepPrompt: '',\n\n handleSteps: function* ({ agentState, prompt, params }) {\n // Step 1: Create directory structure\n yield {\n toolName: 'run_terminal_command',\n args: {\n command: `mkdir -p ${TYPES_DIR} && mkdir -p ${EXAMPLES_DIR}`,\n process_type: 'SYNC',\n timeout_seconds: 10,\n },\n }\n\n // Step 2: Write the AGENT_DEFINITION_FILE with the template content\n yield {\n toolName: 'write_file',\n args: {\n path: TEMPLATE_TYPES_PATH,\n instructions: 'Create agent template type definitions file',\n content: agentTemplateContent,\n },\n }\n\n // Step 3: Write the tool definitions file (copy from existing tools.d.ts)\n yield {\n toolName: 'write_file',\n args: {\n path: TOOL_DEFINITIONS_PATH,\n instructions: 'Create tools type file',\n content: toolDefinitionsContent,\n },\n }\n\n // Step 4: Add message about reading example files and then read them\n yield {\n toolName: 'add_message',\n args: {\n role: 'assistant',\n content:\n \"I'll read the example agent files to understand the patterns and then help you create your agent.\",\n },\n }\n\n // Step 5: Copy example agent files to .agents/ directory\n for (const [filename, content] of Object.entries(exampleAgentContents)) {\n if (content) {\n yield {\n toolName: 'write_file',\n args: {\n path: `${EXAMPLES_DIR}/${filename}`,\n instructions: `Copy example agent file ${filename}`,\n content: content,\n },\n }\n }\n }\n\n // Step 6: Complete agent creation process\n yield 'STEP_ALL'\n },\n }\n}\n", - "referencedBy": {} - }, - { - "path": "backend/src/templates/agent-registry.ts", - "content": "import type { AgentTemplate } from '@codebuff/common/types/agent-template'\nimport db from '@codebuff/common/db'\nimport * as schema from '@codebuff/common/db/schema'\nimport { and, desc, eq } from 'drizzle-orm'\n\nimport { ProjectFileContext } from '@codebuff/common/util/file'\nimport { logger } from '../util/logger'\nimport { agentTemplates as staticTemplates } from './agent-list'\nimport {\n DynamicAgentValidationError,\n validateAgents,\n validateSingleAgent,\n} from '@codebuff/common/templates/agent-validation'\nimport { DynamicAgentTemplate } from '@codebuff/common/types/dynamic-agent-template'\n\nexport type AgentRegistry = Record\n\n// Global database cache - only state in the system\nconst databaseAgentCache = new Map()\n\n/**\n * Parse agent ID to extract publisher, agent name, and version\n */\nfunction parseAgentId(fullAgentId: string): {\n publisherId: string\n agentId: string\n version?: string\n} | null {\n // Check if it's in the publisher/agent-id[@version] format\n const parts = fullAgentId.split('/')\n if (parts.length !== 2) {\n return null\n }\n\n const [publisherId, agentNameWithVersion] = parts\n\n // Check for version suffix\n const versionMatch = agentNameWithVersion.match(/^(.+)@(.+)$/)\n if (versionMatch) {\n const [, agentId, version] = versionMatch\n return { publisherId, agentId, version }\n }\n\n return { publisherId, agentId: agentNameWithVersion }\n}\n\n/**\n * Fetch an agent from the database by publisher/agent-id[@version] format\n */\nasync function fetchAgentFromDatabase(parsedAgentId: {\n publisherId: string\n agentId: string\n version?: string\n}): Promise {\n const { publisherId, agentId, version } = parsedAgentId\n\n try {\n let agentConfig\n\n if (version && version !== 'latest') {\n // Query for specific version\n agentConfig = await db\n .select()\n .from(schema.agentConfig)\n .where(\n and(\n eq(schema.agentConfig.id, agentId),\n eq(schema.agentConfig.publisher_id, publisherId),\n eq(schema.agentConfig.version, version),\n ),\n )\n .then((rows) => rows[0])\n } else {\n // Query for latest version\n agentConfig = await db\n .select()\n .from(schema.agentConfig)\n .where(\n and(\n eq(schema.agentConfig.id, agentId),\n eq(schema.agentConfig.publisher_id, publisherId),\n ),\n )\n .orderBy(\n desc(schema.agentConfig.major),\n desc(schema.agentConfig.minor),\n desc(schema.agentConfig.patch),\n )\n .limit(1)\n .then((rows) => rows[0])\n }\n\n if (!agentConfig) {\n logger.debug(\n { publisherId, agentId, version },\n 'fetchAgentFromDatabase: Agent not found in database',\n )\n return null\n }\n\n const rawAgentData = agentConfig.data as DynamicAgentTemplate\n\n // Validate the raw agent data with the original agentId (not full identifier)\n const validationResult = validateSingleAgent(\n { ...rawAgentData, id: agentId },\n {\n filePath: `${publisherId}/${agentId}@${agentConfig.version}`,\n skipSubagentValidation: true,\n },\n )\n\n if (!validationResult.success) {\n logger.error(\n {\n publisherId,\n agentId,\n version: agentConfig.version,\n error: validationResult.error,\n },\n 'fetchAgentFromDatabase: Agent validation failed',\n )\n return null\n }\n\n // Set the correct full agent ID for the final template\n const agentTemplate = {\n ...validationResult.agentTemplate!,\n id: `${publisherId}/${agentId}@${agentConfig.version}`,\n }\n\n logger.debug(\n {\n publisherId,\n agentId,\n version: agentConfig.version,\n fullAgentId: agentTemplate.id,\n },\n 'fetchAgentFromDatabase: Successfully loaded and validated agent from database',\n )\n\n return agentTemplate\n } catch (error) {\n logger.error(\n { publisherId, agentId, version, error },\n 'fetchAgentFromDatabase: Error fetching agent from database',\n )\n return null\n }\n}\n\n/**\n * Single function to look up an agent template with clear priority order:\n * 1. localAgentTemplates (dynamic agents + static templates)\n * 2. Database cache\n * 3. Database query\n */\nexport async function getAgentTemplate(\n agentId: string,\n localAgentTemplates: Record,\n): Promise {\n // 1. Check localAgentTemplates first (dynamic agents + static templates)\n if (localAgentTemplates[agentId]) {\n return localAgentTemplates[agentId]\n }\n // 2. Check database cache\n const cacheKey = agentId\n if (databaseAgentCache.has(cacheKey)) {\n return databaseAgentCache.get(cacheKey) || null\n }\n\n const parsed = parseAgentId(agentId)\n if (!parsed) {\n logger.debug({ agentId }, 'getAgentTemplate: Failed to parse agent ID')\n return null\n }\n\n // 3. Query database (only for publisher/agent-id format)\n const dbAgent = await fetchAgentFromDatabase(parsed)\n if (dbAgent && parsed.version && parsed.version !== 'latest') {\n // Cache only specific versions to avoid stale 'latest' results\n databaseAgentCache.set(cacheKey, dbAgent)\n }\n return dbAgent\n}\n\n/**\n * Assemble local agent templates from fileContext + static templates\n */\nexport function assembleLocalAgentTemplates(fileContext: ProjectFileContext): {\n agentTemplates: Record\n validationErrors: DynamicAgentValidationError[]\n} {\n // Load dynamic agents using the service\n const { templates: dynamicTemplates, validationErrors } = validateAgents(\n fileContext.agentTemplates || {},\n )\n\n // Combine static and dynamic templates\n const agentTemplates = { ...staticTemplates, ...dynamicTemplates }\n\n return { agentTemplates, validationErrors }\n}\n\n/**\n * Clear the database agent cache (useful for testing)\n */\nexport function clearDatabaseCache(): void {\n databaseAgentCache.clear()\n}\n", - "referencedBy": {} - }, - { - "path": "backend/src/templates/agent-list.ts", - "content": "import { models } from '@codebuff/common/constants'\nimport { AgentTemplateTypes } from '@codebuff/common/types/session-state'\n\nimport { dryRun } from './agents/archive/dry-run'\nimport { ask } from './agents/ask'\nimport { base } from './agents/base'\nimport { fileExplorer } from './agents/file-explorer'\nimport { filePicker } from './agents/file-picker'\nimport { planner } from './agents/planner'\nimport { researcher } from './agents/researcher'\nimport { reviewer } from './agents/reviewer'\nimport { superagent } from './agents/superagent'\nimport { thinker } from './agents/thinker'\nimport { thinkingBase } from './agents/thinking-base'\n\nimport type { AgentTemplate } from './types'\nimport type { AgentTemplateType } from '@codebuff/common/types/session-state'\nimport { agentBuilder } from './agents/agent-builder'\n\nexport const agentTemplates: Record =\n {\n [AgentTemplateTypes.base]: {\n id: AgentTemplateTypes.base,\n ...base(models.openrouter_claude_sonnet_4),\n },\n [AgentTemplateTypes.base_lite]: {\n id: AgentTemplateTypes.base_lite,\n ...base(models.openrouter_gpt5),\n },\n [AgentTemplateTypes.base_max]: {\n id: AgentTemplateTypes.base_max,\n ...base(models.openrouter_claude_opus_4),\n },\n [AgentTemplateTypes.base_experimental]: {\n id: AgentTemplateTypes.base_experimental,\n ...base(models.gemini2_5_pro_preview),\n },\n [AgentTemplateTypes.ask]: {\n id: AgentTemplateTypes.ask,\n ...ask(models.gemini2_5_pro_preview),\n },\n [AgentTemplateTypes.superagent]: {\n id: AgentTemplateTypes.superagent,\n ...superagent(models.openrouter_claude_sonnet_4),\n },\n [AgentTemplateTypes.claude4_gemini_thinking]: {\n id: AgentTemplateTypes.claude4_gemini_thinking,\n ...thinkingBase(models.openrouter_claude_sonnet_4),\n },\n\n [AgentTemplateTypes.thinker]: {\n id: AgentTemplateTypes.thinker,\n ...thinker(models.openrouter_grok_4),\n },\n [AgentTemplateTypes.file_picker]: {\n id: AgentTemplateTypes.file_picker,\n ...filePicker(models.gemini2_5_flash),\n },\n [AgentTemplateTypes.researcher]: {\n id: AgentTemplateTypes.researcher,\n ...researcher(models.gemini2_5_flash),\n },\n [AgentTemplateTypes.planner]: {\n id: AgentTemplateTypes.planner,\n ...planner(models.openrouter_grok_4),\n },\n [AgentTemplateTypes.dry_run]: {\n id: AgentTemplateTypes.dry_run,\n ...dryRun(models.gemini2_5_flash),\n },\n [AgentTemplateTypes.reviewer]: {\n id: AgentTemplateTypes.reviewer,\n ...reviewer(models.gemini2_5_pro_preview),\n },\n [AgentTemplateTypes.agent_builder]: {\n id: AgentTemplateTypes.agent_builder,\n ...agentBuilder(models.openrouter_claude_sonnet_4),\n },\n [AgentTemplateTypes.file_explorer]: fileExplorer as any as AgentTemplate,\n }\n", - "referencedBy": {} - }, - { - "path": "backend/src/templates/agents/base.ts", - "content": "import { AGENT_PERSONAS } from '@codebuff/common/constants/agents'\nimport { AgentTemplateTypes } from '@codebuff/common/types/session-state'\nimport z from 'zod/v4'\n\nimport {\n baseAgentAgentStepPrompt,\n baseAgentSystemPrompt,\n baseAgentUserInputPrompt,\n} from '../base-prompts'\n\nimport type { AgentTemplate } from '../types'\nimport type { Model } from '@codebuff/common/constants'\n\nexport const base = (\n model: Model,\n allAvailableAgents?: string[],\n): Omit => ({\n model,\n displayName: AGENT_PERSONAS.base.displayName,\n spawnPurposePrompt: AGENT_PERSONAS.base.purpose,\n inputSchema: {\n prompt: z.string().describe('A coding task to complete'),\n },\n outputMode: 'last_message',\n includeMessageHistory: false,\n toolNames: [\n 'create_plan',\n 'run_terminal_command',\n 'str_replace',\n 'write_file',\n 'spawn_agents',\n 'add_subgoal',\n 'browser_logs',\n 'code_search',\n 'end_turn',\n 'read_files',\n 'think_deeply',\n 'update_subgoal',\n ],\n spawnableAgents: allAvailableAgents\n ? (allAvailableAgents as any[])\n : [\n AgentTemplateTypes.file_explorer,\n AgentTemplateTypes.file_picker,\n AgentTemplateTypes.researcher,\n AgentTemplateTypes.thinker,\n AgentTemplateTypes.reviewer,\n ],\n\n systemPrompt: baseAgentSystemPrompt(model),\n instructionsPrompt: baseAgentUserInputPrompt(model),\n stepPrompt: baseAgentAgentStepPrompt(model),\n})\n", - "referencedBy": {} - }, - { - "path": "backend/src/templates/agents/thinking-base.ts", - "content": "import { AGENT_PERSONAS } from '@codebuff/common/constants/agents'\nimport z from 'zod/v4'\n\nimport {\n baseAgentAgentStepPrompt,\n baseAgentSystemPrompt,\n baseAgentUserInputPrompt,\n} from '../base-prompts'\nimport { baseAgentSubagents, baseAgentToolNames } from '../types'\n\nimport type { AgentTemplate } from '../types'\nimport type { Model } from '@codebuff/common/constants'\n\nexport const thinkingBase = (\n model: Model,\n allAvailableAgents?: string[],\n): Omit => ({\n model,\n displayName: AGENT_PERSONAS.base_lite.displayName,\n spawnPurposePrompt: AGENT_PERSONAS.base_lite.purpose,\n inputSchema: {\n prompt: z.string().describe('A coding task to complete'),\n },\n outputMode: 'last_message',\n includeMessageHistory: false,\n toolNames: baseAgentToolNames,\n spawnableAgents: allAvailableAgents\n ? (allAvailableAgents as any[])\n : baseAgentSubagents,\n\n systemPrompt: baseAgentSystemPrompt(model),\n instructionsPrompt: baseAgentUserInputPrompt(model),\n stepPrompt: baseAgentAgentStepPrompt(model),\n\n handleSteps: function* ({ agentState, prompt, params }) {\n while (true) {\n yield {\n toolName: 'spawn_agents',\n args: {\n agents: [\n {\n agent_type: 'thinker',\n prompt: 'Think deeply about the user request',\n },\n ],\n },\n }\n yield 'STEP'\n }\n },\n})\n", - "referencedBy": {} - }, - { - "path": "backend/src/templates/base-prompts.ts", - "content": "import { models } from '@codebuff/common/constants'\nimport { getToolCallString } from '@codebuff/common/tools/utils'\nimport { buildArray } from '@codebuff/common/util/array'\nimport { closeXml } from '@codebuff/common/util/xml'\n\nimport { PLACEHOLDER } from './types'\n\nimport type { Model } from '@codebuff/common/constants'\n\nexport const baseAgentSystemPrompt = (model: Model) => {\n return `# Persona: ${PLACEHOLDER.AGENT_NAME}\n\n**Your core identity is ${PLACEHOLDER.AGENT_NAME}.** You are an expert coding assistant who is enthusiastic, proactive, and helpful.\n\n- **Tone:** Maintain a positive, friendly, and helpful tone. Use clear and encouraging language.\n- **Clarity & Conciseness:** Explain your steps clearly but concisely. Say the least you can to get your point across. If you can, answer in one sentence only. Do not summarize changes. End turn early.\n\nYou are working on a project over multiple \"iterations,\" reminiscent of the movie \"Memento,\" aiming to accomplish the user's request.\n\n# Agents\n\nUse the spawn_agents tool to spawn agents to help you complete the user request! Each agent has a specific role and can help you with different parts of the user request.\n\nYou should spawn many parallel agents in the same tool call to increase time efficiency.\n\nNote that any spawned agent starts with no context at all, and it is up to you to prompt it with enough information to complete your request.\n\n# Files\n\nThe \\`read_file\\` tool result shows files you have previously read from \\`read_files\\` tool calls.\n\nIf you write to a file, or if the user modifies a file, new copies of a file will be included in \\`read_file\\` tool results.\n\nThus, multiple copies of the same file may be included over the course of a conversation. Each represents a distinct version in chronological order.\n\nImportant:\n\n- Pay particular attention to the last copy of a file as that one is current!\n- You are not the only one making changes to files. The user may modify files too, and you will see the latest version of the file after their changes. You must base you future write_file/str_replace edits off of the latest changes. You must try to accommodate the changes that the user has made and treat those as explicit instructions to follow. If they add lines of code or delete them, you should assume they want the file to remain modified that way unless otherwise noted.\n\n# Subgoals\n\nFirst, create and edit subgoals if none exist and pursue the most appropriate one. This one of the few ways you can \"take notes\" in the Memento-esque environment. This is important, as you may forget what happened later! Use the \\`add_subgoal\\` and \\`update_subgoal\\` tools for this.\n\nNotes:\n\n- Try to phrase the subgoal objective first in terms of observable behavior rather than how to implement it, if possible. The subgoal is what you are solving, not how you are solving it.\n\n# System Messages\n\nMessages from the system are surrounded by ${closeXml('system')} or ${closeXml('system_instructions')} XML tags. These are NOT messages from the user.\n\n# How to Respond\n\n- **Respond as ${PLACEHOLDER.AGENT_NAME}:** Maintain the helpful and upbeat persona defined above throughout your entire response, but also be as conscise as possible.\n- **DO NOT Narrate Parameter Choices:** While commentary about your actions is required (Rule #2), **DO NOT** explain _why_ you chose specific parameter values for a tool (e.g., don't say \"I am using the path 'src/...' because...\"). Just provide the tool call after your action commentary.\n- **CRITICAL TOOL FORMATTING:**\n - **NO MARKDOWN:** Tool calls **MUST NOT** be wrapped in markdown code blocks (like \\`\\`\\`). Output the raw XML tags directly. **This is non-negotiable.**\n - **MANDATORY EMPTY LINES:** Tool calls **MUST** be surrounded by a _single empty line_ both before the opening tag (e.g., \\`\\`) and after the closing tag (e.g., \\`${closeXml('tool_name')}\\`). See the example below. **Failure to include these empty lines will break the process.**\n - **NESTED ELEMENTS ONLY:** Tool parameters **MUST** be specified using _only_ nested XML elements, like \\`value${closeXml('parameter_name')}\\`. You **MUST NOT** use XML attributes within the tool call tags (e.g., writing \\`\\`). Stick strictly to the nested element format shown in the example response below. This is absolutely critical for the parser.\n- **User Questions:** If the user is asking for help with ideas or brainstorming, or asking a question, then you should directly answer the user's question, but do not make any changes to the codebase. Do not call modification tools like \\`write_file\\` or \\`str_replace\\`.\n- **Handling Requests:**\n - For complex requests, create a subgoal using \\`add_subgoal\\` to track objectives from the user request. Use \\`update_subgoal\\` to record progress. Put summaries of actions taken into the subgoal's \\`log\\`.\n - For straightforward requests, proceed directly without adding subgoals.\n- **Reading Files:** Try to read as many files as could possibly be relevant in your first 1 or 2 read_files tool calls. List multiple file paths in one tool call, as many as you can. You must read more files whenever it would improve your response.\n- **Minimal Changes:** You should make as few changes as possible to the codebase to address the user's request. Only do what the user has asked for and no more. When modifying existing code, assume every line of code has a purpose and is there for a reason. Do not change the behavior of code except in the most minimal way to accomplish the user's request.\n- **DO NOT run scripts, make git commits or push to remote repositories without permission from the user.** It's extremely important not to run scripts that could have major effects. Similarly, a wrong git push could break production. For these actions, always ask permission first and wait for user confirmation.\n- **Code Hygiene:** Make sure to leave things in a good state:\n\n - Don't forget to add any imports that might be needed\n - Remove unused variables, functions, and files as a result of your changes.\n - If you added files or functions meant to replace existing code, then you should also remove the previous code.\n\n- **Read Before Writing:** If you are about to edit a file, make sure it is one that you have already read, i.e. is included in your context -- otherwise, use the read_file tool to read it first!\n- **Check for Existing Changes:** If the user is requesting a change that you think has already been made based on the current version of files, simply tell the user that \"It looks like that change has already been made!\". It is common that a file you intend to update already has the changes you want.\n- **Think about your next action:** After receiving tool results, carefully reflect on their quality and determine optimal next steps before proceeding. Use your thinking to plan and iterate based on this new information, and then take the best next action.\n- **Package Management:** When adding new packages, use the run_terminal_command tool to install the package rather than editing the package.json file with a guess at the version number to use (or similar for other languages). This way, you will be sure to have the latest version of the package. Do not install packages globally unless asked by the user (e.g. Don't run \\`npm install -g \\`). Always try to use the package manager associated with the project (e.g. it might be \\`pnpm\\` or \\`bun\\` or \\`yarn\\` instead of \\`npm\\`, or similar for other languages).\n- **Refactoring Awareness:** Whenever you modify an exported token like a function or class or variable, you should use the code_search tool to find all references to it before it was renamed (or had its type/parameters changed) and update the references appropriately.\n- **Testing:** If you create a unit test, you should run it using \\`run_terminal_command\\` to see if it passes, and fix it if it doesn't.\n- **Front end development** We want to make the UI look as good as possible. Don't hold back. Give it your all.\n - Include as many relevant features and interactions as possible\n - Add thoughtful details like hover states, transitions, and micro-interactions\n - Apply design principles: hierarchy, contrast, balance, and movement\n - Create an impressive demonstration showcasing web development capabilities\n\n- **Don't summarize your changes** Omit summaries as much as possible. Be extremely concise when explaining the changes you made. There's no need to write a long explanation of what you did. Keep it to 1-2 two sentences max.\n- **Ending Your Response:** Your aim should be to completely fulfill the user's request before using ending your response. DO NOT END TURN IF YOU ARE STILL WORKING ON THE USER'S REQUEST. If the user's request requires multiple steps, please complete ALL the steps before stopping, even if you have done a lot of work so far.\n- **FINALLY, YOU MUST USE THE END TURN TOOL** When you have fully answered the user _or_ you are explicitly waiting for the user's next typed input, always conclude the message with a standalone \\`${getToolCallString('end_turn', {})}\\` tool call (surrounded by its required blank lines). This should be at the end of your message, e.g.:\n \n User: Hi\n Assisistant: Hello, what can I do for you today?\\\\n\\\\n${getToolCallString('end_turn', {})}\n ${closeXml('example')}\n\n## Verifying Your Changes at the End of Your Response\n\n### User has a \\`codebuff.json\\`\n\nIf the user has a \\`codebuff.json\\` with the appropriate \\`fileChangeHooks\\`, there is no need to run any commands.\n\nIf the \\`fileChangeHooks\\` are not configured, inform the user about the \\`fileChangeHooks\\` parameter.\n\n### User has no \\`codebuff.json\\`\n\nIf this is the case, inform the user know about the \\`/init\\` command (within Codebuff, not a terminal command).\n\nCheck the knowledge files to see if the user has specified a further protocol for what terminal commands should be run to verify edits. For example, a \\`knowledge.md\\` file could specify that after every change you should run the tests or linting or run the type checker. If there are multiple commands to run, you should run them all using '&&' to concatenate them into one commands, e.g. \\`npm run lint && npm run test\\`.\n\n## Example Response (Simplified - Demonstrating Rules)\n\nUser: Please console.log the props in the component Foo\n\nAssistant: Certainly! I can add that console log for you. Let's start by reading the file:\n\n${getToolCallString('read_files', { paths: ['src/components/foo.tsx'] })}\n\nNow, I'll add the console.log at the beginning of the Foo component:\n\n${getToolCallString('str_replace', {\n path: 'src/components/foo.tsx',\n replacements: [\n {\n old: `function Foo(props: {\n bar: string\n}) {\n`,\n new: `function Foo(props: {\n bar: string\n})\n console.log(\"Foo props:\", props);\n`,\n },\n ],\n})}\n\nLet me check my changes\n\n${getToolCallString('run_terminal_command', { command: 'npm run typecheck' })}\n\nI see that my changes went through correctly. What would you like to do next?\n\n${getToolCallString('end_turn', {})}\n\n${PLACEHOLDER.TOOLS_PROMPT}\n\n${PLACEHOLDER.AGENTS_PROMPT}\n\n# Knowledge files\n\nKnowledge files are your guide to the project. Knowledge files (files ending in \"knowledge.md\" or \"CLAUDE.md\") within a directory capture knowledge about that portion of the codebase. They are another way to take notes in this \"Memento\"-style environment.\n\nKnowledge files were created by previous engineers working on the codebase, and they were given these same instructions. They contain key concepts or helpful tips that are not obvious from the code. e.g., let's say I want to use a package manager aside from the default. That is hard to find in the codebase and would therefore be an appropriate piece of information to add to a knowledge file.\n\nEach knowledge file should develop over time into a concise but rich repository of knowledge about the files within the directory, subdirectories, or the specific file it's associated with.\n\nThere is a special class of user knowledge files that are stored in the user's home directory, e.g. \\`~/.knowledge.md\\`. These files are available to be read, but you cannot edit them because they are outside of the project directory. Do not try to edit them.\n\nWhen should you update a knowledge file?\n- If the user gives broad advice to \"always do x\", that is a good candidate for updating a knowledge file with a concise rule to follow or bit of advice so you won't make the mistake again.\n- If the user corrects you because they expected something different from your response, any bit of information that would help you better meet their expectations in the future is a good candidate for a knowledge file.\n\nWhat to include in knowledge files:\n- The mission of the project. Goals, purpose, and a high-level overview of the project.\n- Explanations of how different parts of the codebase work or interact.\n- Examples of how to do common tasks with a short explanation.\n- Anti-examples of what should be avoided.\n- Anything the user has said to do.\n- Anything you can infer that the user wants you to do going forward.\n- Tips and tricks.\n- Style preferences for the codebase.\n- Technical goals that are in progress. For example, migrations that are underway, like using the new backend service instead of the old one.\n- Links to reference pages that are helpful. For example, the url of documentation for an api you are using.\n- Anything else that would be helpful for you or an inexperienced coder to know\n\nWhat *not* to include in knowledge files:\n- Documentation of a single file.\n- Restated code or interfaces in natural language.\n- Anything obvious from reading the codebase.\n- Lots of detail about a minor change.\n- An explanation of the code you just wrote, unless there's something very unintuitive.\n\nAgain, DO NOT include details from your recent change that are not relevant more broadly.\n\nGuidelines for updating knowledge files:\n- Be concise and focused on the most important aspects of the project.\n- Integrate new knowledge into existing sections when possible.\n- Avoid overemphasizing recent changes or the aspect you're currently working on. Your current change is less important than you think.\n- Remove as many words as possible while keeping the meaning. Use command verbs. Use sentence fragments.\n- Use markdown features to improve clarity in knowledge files: headings, coding blocks, lists, dividers and so on.\n\nOnce again: BE CONCISE!\n\nIf the user sends you the url to a page that is helpful now or could be helpful in the future (e.g. documentation for a library or api), you should always save the url in a knowledge file for future reference. Any links included in knowledge files are automatically scraped and the web page content is added to the knowledge file.\n\n# Codebuff Configuration (codebuff.json)\n\n## Schema\n\nThe following describes the structure of the \\`./codebuff.json\\` configuration file that users might have in their project root. You can use this to understand user settings if they mention them.\n\n${PLACEHOLDER.CONFIG_SCHEMA}\n\n## Background Processes\n\nThe user does not have access to these outputs. Please display any pertinent information to the user before referring to it.\n\nTo stop a background process, attempt to close the process using the appropriate command. If you deem that command to be \\`kill\\`, **make sure** to kill the **ENTIRE PROCESS GROUP** (Mac/Linux) or tree (Windows).\n\nWhen you want to restart a background process, make sure to run the terminal command in the background.\n\n${PLACEHOLDER.FILE_TREE_PROMPT}\n\n${PLACEHOLDER.SYSTEM_INFO_PROMPT}\n\n${PLACEHOLDER.GIT_CHANGES_PROMPT}`\n}\n\nexport const baseAgentUserInputPrompt = (model: Model) => {\n const isFlash =\n model === models.gemini2_5_flash ||\n model === models.gemini2_5_flash_thinking\n const isGeminiPro = model === models.gemini2_5_pro_preview\n\n return (\n PLACEHOLDER.KNOWLEDGE_FILES_CONTENTS +\n '\\n\\n' +\n buildArray(\n 'Proceed toward the user request and any subgoals. Please either 1. clarify the request or 2. complete the entire user request. If you made any changes to the codebase, you must spawn the reviewer agent to review your changes. Then, finally you must use the end_turn tool at the end of your response. If you have already completed the user request, write nothing at all and end your response.',\n\n \"If there are multiple ways the user's request could be interpreted that would lead to very different outcomes, ask at least one clarifying question that will help you understand what they are really asking for, and then use the end_turn tool.\",\n\n 'Use the spawn_agents tool to spawn agents to help you complete the user request. You can spawn as many agents as you want.',\n\n 'It is a good idea to spawn a file explorer agent first to explore the codebase from different perspectives. Use the researcher agent to help you get up-to-date information from docs and web results too. After that, for complex requests, you should spawn the thinker agent to do deep thinking on a problem, but do not spawn it at the same time as the file picker, only spawn it *after* you have the file picker results. Finally, you must spawn the reviewer agent to review your code changes.',\n \"Important: you *must* read as many files with the read_files tool as possible from the results of the file picker agents. Don't be afraid to read 20 files. The more files you read, the better context you have on the codebase and the better your response will be.\",\n\n 'If the users uses \"@AgentName\" in their message, you must spawn the agent with the name \"@AgentName\". Spawn all the agents that the user mentions.',\n\n 'Be extremely concise in your replies. Example: If asked what 2+2 equals, respond simply: \"4\". No need to even write a full sentence.',\n\n 'Important: When using write_file, do NOT rewrite the entire file. Only show the parts of the file that have changed and write \"// ... existing code ...\" comments (or \"# ... existing code ...\" or \"/* ... existing code ... */\", whichever is appropriate for the language) around the changed area.',\n\n isGeminiPro &&\n `Any tool calls will be run from the project root (${PLACEHOLDER.PROJECT_ROOT}) unless otherwise specified`,\n\n 'You must read additional files with the read_files tool whenever it could possibly improve your response.',\n\n (isFlash || isGeminiPro) &&\n 'Before you use write_file or str_replace to edit an existing file, make sure to read it if you have not already!',\n\n (isFlash || isGeminiPro) &&\n 'Important: When mentioning a file path, for example for `write_file` or `read_files`, make sure to include all the directories in the path to the file from the project root. For example, do not forget the \"src\" directory if the file is at backend/src/utils/foo.ts! Sometimes imports for a file do not match the actual directories path (backend/utils/foo.ts for example).',\n\n !isFlash &&\n 'You must use the \"add_subgoal\" and \"update_subgoal\" tools to record your progress and any new information you learned as you go. If the change is very minimal, you may not need to use these tools.',\n\n 'Preserve as much of the existing code, its comments, and its behavior as possible. Make minimal edits to accomplish only the core of what is requested. Pay attention to any comments in the file you are editing and keep original user comments exactly as they were, line for line.',\n\n 'If you are trying to kill background processes, make sure to kill the entire process GROUP (or tree in Windows), and always prefer SIGTERM signals. If you restart the process, make sure to do so with process_type=BACKGROUND',\n\n !isFlash &&\n 'To confirm complex changes to a web app, you should use the browser_logs tool to check for console logs or errors.',\n\n (isFlash || isGeminiPro) &&\n 'Important: When using write_file, do NOT rewrite the entire file. Only show the parts of the file that have changed and write \"// ... existing code ...\" comments (or \"# ... existing code ..\", \"/* ... existing code ... */\", \"\", whichever is appropriate for the language) around the changed area. Additionally, in order to delete any code, you must include a deletion comment.',\n\n 'If the user request is very complex, consider invoking think_deeply.',\n\n \"If the user asks to create a plan, invoke the create_plan tool. Don't act on the plan created by the create_plan tool. Instead, wait for the user to review it.\",\n\n 'If the user tells you to implement a plan, please implement the whole plan, continuing until it is complete. Do not stop after one step.',\n\n 'If the user had knowledge files (or CLAUDE.md) and any of them say to run specific terminal commands after every change, e.g. to check for type errors or test errors, then do that at the end of your response if that would be helpful in this case. No need to run these checks for simple changes.',\n\n 'If you have learned something useful for the future that is not derivable from the code, consider updating a knowledge file at the end of your response to add this condensed information.',\n\n 'Important: DO NOT run scripts or git commands or start a dev server without being specifically asked to do so. If you want to run one of these commands, you should ask for permission first. This can prevent costly accidents!',\n\n 'Otherwise, the user is in charge and you should never refuse what the user asks you to do.',\n\n 'Important: When editing an existing file with the write_file tool, do not rewrite the entire file, write just the parts of the file that have changed. Do not start writing the first line of the file. Instead, use comments surrounding your edits like \"// ... existing code ...\" (or \"# ... existing code ...\" or \"/* ... existing code ... */\" or \"\", whichever is appropriate for the language) plus a few lines of context from the original file, to show just the sections that have changed.',\n\n (isFlash || isGeminiPro) &&\n 'You must use the spawn_agents tool to spawn agents to help you complete the user request. You can spawn as many agents as you want. It is a good idea to spawn a file explorer agent first to explore the codebase. Finally, you must spawn the reviewer agent to review your code changes.',\n\n 'Finally, you must use the end_turn tool at the end of your response when you have completed the user request or want the user to respond to your message.',\n ).join('\\n\\n') +\n closeXml('system_instructions')\n )\n}\n\nexport const baseAgentAgentStepPrompt = (model: Model) => {\n return `\nYou have ${PLACEHOLDER.REMAINING_STEPS} more response(s) before you will be cut off and the turn will be ended automatically.\n\nAssistant cwd (project root): ${PLACEHOLDER.PROJECT_ROOT}\nUser cwd: ${PLACEHOLDER.USER_CWD}\n${closeXml('system')}\n`\n}\n", - "referencedBy": {} - }, - { - "path": "common/src/templates/dynamic-agent-template.ts", - "content": "[FILE_DOES_NOT_EXIST]", - "referencedBy": {} - }, - { - "path": "common/src/types/dynamic-agent-template.ts", - "content": "import { z } from 'zod'\n\nimport { ALLOWED_MODEL_PREFIXES, models } from '../constants'\nimport { toolNames } from '../tools/constants'\n\n// Filter models to only include those that begin with allowed prefixes\nconst filteredModels = Object.values(models).filter((model) =>\n ALLOWED_MODEL_PREFIXES.some((prefix) => model.startsWith(prefix)),\n)\n\nif (filteredModels.length === 0) {\n throw new Error('No valid models found with allowed prefixes')\n}\n\n// Simplified JSON Schema definition - supports object schemas with nested properties\nconst JsonSchemaSchema: z.ZodType = z.lazy(() =>\n z\n .object({\n type: z.literal('object'),\n description: z.string().optional(),\n properties: z\n .record(\n JsonSchemaSchema.or(\n z\n .object({\n type: z.enum([\n 'string',\n 'number',\n 'integer',\n 'boolean',\n 'array',\n ]),\n description: z.string().optional(),\n enum: z.array(z.any()).optional(),\n })\n .passthrough(),\n ),\n )\n .optional(),\n required: z.array(z.string()).optional(),\n })\n .passthrough(),\n)\n\n// Schema for the combined inputSchema object\nconst InputSchemaObjectSchema = z\n .object({\n prompt: z\n .object({\n type: z.literal('string'),\n description: z.string().optional(),\n })\n .passthrough()\n .optional(), // Optional JSON schema for prompt validation\n params: JsonSchemaSchema.optional(), // Optional JSON schema for params validation\n })\n .optional()\n\n// Schema for prompt fields that can be either a string or a path reference\nconst PromptFieldSchema = z.union([\n z.string(), // Direct string content\n z.object({ path: z.string() }), // Path reference to external file\n])\nexport type PromptField = z.infer\n\n// Schema for validating handleSteps function signature\nconst HandleStepsSchema = z\n .function()\n .args(\n z.object({\n agentState: z.object({\n agentId: z.string(),\n parentId: z.string(),\n messageHistory: z.array(z.any()),\n }),\n prompt: z.string().optional(),\n params: z.any().optional(),\n }),\n )\n .returns(z.any())\n .optional()\n\n// Validates the Typescript template file.\nexport const DynamicAgentDefinitionSchema = z.object({\n id: z\n .string()\n .regex(\n /^[a-z0-9-]+$/,\n 'Agent ID must contain only lowercase letters, numbers, and hyphens',\n ), // The unique identifier for this agent\n version: z.string().optional(),\n publisher: z.string().optional(),\n\n // Required fields for new agents\n displayName: z.string(),\n model: z.string(),\n\n // Tools and spawnable agents\n toolNames: z\n .array(z.enum(toolNames))\n .optional()\n .default([])\n .refine(\n (tools) => {\n if (!tools) return true\n const validToolNames = toolNames as readonly string[]\n const invalidTools = tools.filter(\n (tool) => !validToolNames.includes(tool),\n )\n return invalidTools.length === 0\n },\n (tools) => {\n if (!tools) return { message: 'Tools array is undefined' }\n const validToolNames = toolNames as readonly string[]\n const invalidTools = tools.filter(\n (tool) => !validToolNames.includes(tool),\n )\n return {\n message: `Invalid tool names: ${invalidTools.join(', ')}. Available tools: ${toolNames.join(', ')}`,\n }\n },\n ),\n spawnableAgents: z.array(z.string()).optional().default([]),\n\n // Input and output\n inputSchema: InputSchemaObjectSchema,\n includeMessageHistory: z.boolean().default(true),\n outputMode: z\n .enum(['last_message', 'all_messages', 'structured_output'])\n .default('last_message'),\n outputSchema: JsonSchemaSchema.optional(), // Optional JSON schema for output validation\n\n // Prompts\n spawnPurposePrompt: z.string().optional(),\n systemPrompt: z.string().optional(),\n instructionsPrompt: z.string().optional(),\n stepPrompt: z.string().optional(),\n\n // Optional generator function for programmatic agents\n handleSteps: z.union([HandleStepsSchema, z.string()]).optional(),\n})\nexport type DynamicAgentDefinition = z.input<\n typeof DynamicAgentDefinitionSchema\n>\nexport type DynamicAgentDefinitionParsed = z.infer<\n typeof DynamicAgentDefinitionSchema\n>\n\nexport const DynamicAgentTemplateSchema = DynamicAgentDefinitionSchema.extend({\n systemPrompt: z.string(),\n instructionsPrompt: z.string(),\n stepPrompt: z.string(),\n handleSteps: z.string().optional(), // Converted to string after processing\n})\n .refine(\n (data) => {\n // If outputSchema is provided, outputMode must be explicitly set to 'structured_output'\n if (data.outputSchema && data.outputMode !== 'structured_output') {\n return false\n }\n return true\n },\n {\n message:\n \"outputSchema requires outputMode to be explicitly set to 'structured_output'.\",\n path: ['outputMode'],\n },\n )\n .refine(\n (data) => {\n // If outputMode is 'structured_output', 'set_output' tool must be included\n if (\n data.outputMode === 'structured_output' &&\n !data.toolNames.includes('set_output')\n ) {\n return false\n }\n return true\n },\n {\n message:\n \"outputMode 'structured_output' requires the 'set_output' tool. Add 'set_output' to toolNames.\",\n path: ['toolNames'],\n },\n )\n .refine(\n (data) => {\n // If 'set_output' tool is included, outputMode must be 'structured_output'\n if (\n data.toolNames.includes('set_output') &&\n data.outputMode !== 'structured_output'\n ) {\n return false\n }\n return true\n },\n {\n message:\n \"'set_output' tool requires outputMode to be 'structured_output'. Change outputMode to 'structured_output' or remove 'set_output' from toolNames.\",\n path: ['outputMode'],\n },\n )\n .refine(\n (data) => {\n // If spawnableAgents array is non-empty, 'spawn_agents' tool must be included\n if (\n data.spawnableAgents.length > 0 &&\n !data.toolNames.includes('spawn_agents')\n ) {\n return false\n }\n return true\n },\n {\n message:\n \"Non-empty spawnableAgents array requires the 'spawn_agents' tool. Add 'spawn_agents' to toolNames or remove spawnableAgents.\",\n path: ['toolNames'],\n },\n )\nexport type DynamicAgentTemplate = z.infer\n", - "referencedBy": {} - }, - { - "path": "common/src/json-config/default.ts", - "content": "import type { CodebuffConfig } from './constants'\n\nexport function getDefaultConfig(): CodebuffConfig {\n return {\n description: '',\n startupProcesses: [],\n fileChangeHooks: [],\n maxAgentSteps: 12,\n baseAgent: undefined,\n spawnableAgents: undefined,\n }\n}\n", - "referencedBy": {} - }, - { - "path": "npm-app/src/cli-handlers/agent-creation-chat.ts", - "content": "import { AGENT_TEMPLATES_DIR } from '@codebuff/common/constants'\nimport { AgentTemplateTypes } from '@codebuff/common/types/session-state'\nimport { green, gray, red } from 'picocolors'\n\nimport { enterMiniChat } from './mini-chat'\nimport { CLI } from '../cli'\n\ninterface AgentRequirements {\n name: string\n purpose: string\n specialty: string\n model: string\n}\n\nconst AGENT_CREATION_STEPS = [\n {\n question:\n \"Hi! I'll help you create a custom agent. What would you like to name your agent?\",\n field: 'name',\n placeholder: 'e.g., \"Code Reviewer\", \"API Helper\", \"Test Generator\"',\n },\n {\n question:\n \"Great! What's the main purpose of this agent? What should it help you with?\",\n field: 'purpose',\n placeholder:\n 'e.g., \"Review code for best practices\", \"Help with API integration\"',\n },\n {\n question: \"What's this agent's specialty or domain expertise?\",\n field: 'specialty',\n placeholder:\n 'e.g., \"React development\", \"Database optimization\", \"Security auditing\"',\n },\n {\n question:\n 'Which model should this agent use? (Press Enter for default: anthropic/claude-4-sonnet-20250522)',\n field: 'model',\n placeholder:\n 'anthropic/claude-4-sonnet-20250522, gpt-4o, gemini-2.0-flash-exp',\n defaultValue: 'anthropic/claude-4-sonnet-20250522',\n },\n]\n\nexport function startAgentCreationChat(\n rl: any,\n onExit: () => void,\n onComplete: (requirements: AgentRequirements) => void,\n) {\n enterMiniChat(rl, onExit, {\n title: '🤖 Agent Creation Assistant',\n steps: AGENT_CREATION_STEPS,\n onComplete: async (responses) => {\n const requirements: AgentRequirements = {\n name: responses.name || 'My Custom Agent',\n purpose:\n responses.purpose ||\n 'A custom agent that helps with development tasks',\n specialty: responses.specialty || 'general development',\n model: responses.model || 'anthropic/claude-4-sonnet-20250522',\n }\n\n try {\n await createAgentFromRequirements(requirements)\n } catch (error) {\n console.error(red('\\nError creating agent:'))\n console.error(error instanceof Error ? error.message : String(error))\n onExit() // Only exit on error\n }\n },\n })\n}\n\nexport async function createAgentFromRequirements(\n requirements: AgentRequirements,\n) {\n // Create a simple prompt for the agent builder with the requirements\n const prompt = `Create a new agent template with these requirements:\n\nAgent Name: ${requirements.name}\nPurpose: ${requirements.purpose}\nSpecialty: ${requirements.specialty}\nModel: ${requirements.model}\n\nPlease create a complete TypeScript agent template file in the ${AGENT_TEMPLATES_DIR} directory with proper types and a comprehensive system prompt.`\n\n try {\n // Use the resetAgent helper to properly switch to agent-builder which automatically spawns the agent builder\n const cliInstance = CLI.getInstance()\n await cliInstance.resetAgent(\n AgentTemplateTypes.agent_builder,\n {\n name: requirements.name,\n purpose: requirements.purpose,\n specialty: requirements.specialty,\n model: requirements.model,\n },\n prompt,\n )\n\n console.log(\n green(\n `\\n✅ Agent created! Check the ${AGENT_TEMPLATES_DIR} directory for your new agent.`,\n ),\n )\n console.log(\n gray(\n 'Continue adjusting your agent here, or type \"/agents\" to switch agents and test it out.',\n ),\n )\n\n cliInstance.freshPrompt()\n } catch (error) {\n console.error(red('\\nError during agent creation:'))\n console.error(\n 'Error message:',\n error instanceof Error ? error.message : String(error),\n )\n throw error\n }\n}\n", - "referencedBy": {} - }, - { - "path": "npm-app/src/create-template-project.ts", - "content": "import { execSync } from 'child_process'\nimport * as fs from 'fs'\nimport * as os from 'os'\nimport { join } from 'path'\n\nimport { green } from 'picocolors'\n\nimport { logger } from './utils/logger'\n\nexport async function createTemplateProject(\n template: string,\n projectDir: string,\n projectName: string = template,\n) {\n console.log(\n `Creating project from ${template} template in ${projectDir}/${projectName}`,\n )\n\n // Validate template name contains only alphanumeric chars, dash and underscore\n if (!/^[a-zA-Z0-9-_]+$/.test(template)) {\n console.error(\n 'Template name can only contain letters, numbers, dash and underscore',\n )\n logger.error(\n {\n errorMessage:\n 'Template name can only contain letters, numbers, dash and underscore',\n template,\n },\n 'Invalid template name',\n )\n process.exit(1)\n }\n\n // Validate project name\n if (!/^[a-zA-Z0-9-_]+$/.test(projectName)) {\n console.error(\n 'Project name can only contain letters, numbers, dash and underscore',\n )\n logger.error(\n {\n errorMessage:\n 'Project name can only contain letters, numbers, dash and underscore',\n projectName,\n },\n 'Invalid project name',\n )\n process.exit(1)\n }\n\n const projectPath = join(projectDir, projectName)\n\n // Check if directory already exists\n if (fs.existsSync(projectPath)) {\n console.error(`Directory ${projectPath} already exists`)\n logger.error(\n {\n errorMessage: `Directory ${projectPath} already exists`,\n projectPath,\n },\n 'Directory already exists',\n )\n process.exit(1)\n }\n\n try {\n console.log('\\nDownloading template...')\n // Clone the community repo to a temp directory\n const tempDir = fs.mkdtempSync(join(os.tmpdir(), 'codebuff-starter-'))\n execSync(\n 'git clone --depth 1 https://github.com/CodebuffAI/codebuff-community.git .',\n {\n cwd: tempDir,\n stdio: 'pipe',\n },\n )\n\n // Check if template exists in starter-templates or showcase directory\n const starterTemplateDir = join(tempDir, 'starter-templates', template)\n const showcaseDir = join(tempDir, 'showcase', template)\n let templateDir: string\n\n if (fs.existsSync(starterTemplateDir)) {\n templateDir = starterTemplateDir\n } else if (fs.existsSync(showcaseDir)) {\n templateDir = showcaseDir\n } else {\n console.error(\n `Template ${template} not found in starter-templates/ or showcase/`,\n )\n logger.error(\n {\n errorMessage: `Template ${template} not found in starter-templates/ or showcase/`,\n template,\n },\n 'Template not found',\n )\n fs.rmSync(tempDir, { recursive: true, force: true })\n process.exit(1)\n }\n\n // Create parent directory if it doesn't exist\n if (projectDir) {\n fs.mkdirSync(projectDir, { recursive: true })\n }\n\n // Copy template to new directory\n fs.mkdirSync(projectPath)\n fs.cpSync(templateDir, projectPath, { recursive: true })\n\n // Remove .git directory if it exists\n const gitDir = join(projectPath, '.git')\n if (fs.existsSync(gitDir)) {\n fs.rmSync(gitDir, { recursive: true, force: true })\n }\n\n // Initialize new git repo\n console.log('\\nInitializing git repo...')\n execSync('git init', { cwd: projectPath, stdio: 'pipe' })\n\n // Clean up temp directory\n fs.rmSync(tempDir, { recursive: true, force: true })\n\n // Install dependencies\n if (fs.existsSync(join(projectPath, 'package-lock.json'))) {\n console.log('\\nInstalling dependencies...')\n execSync('npm install', { cwd: projectPath, stdio: 'inherit' })\n }\n\n console.log(green(`\\nSuccessfully created new project in ${projectPath}\\n`))\n\n // Change into the new project directory and run codebuff\n process.chdir(projectPath)\n console.log('Starting Codebuff in the new project...\\n')\n console.log('--------------------------------\\n')\n execSync('codebuff', { stdio: 'inherit' })\n } catch (error) {\n logger.error(\n {\n errorMessage: error instanceof Error ? error.message : String(error),\n errorStack: error instanceof Error ? error.stack : undefined,\n template,\n projectDir,\n projectName,\n },\n 'Failed to initialize project',\n )\n console.error('Failed to initialize project:', error)\n process.exit(1)\n }\n}\n", - "referencedBy": {} - }, - { - "path": "web/src/content/agents/creating-new-agents.mdx", - "content": "---\ntitle: 'Creating New Agents'\nsection: 'advanced'\ntags: ['customization', 'agent templates', 'agents']\norder: 2\n---\n\n# Creating New Agents\n\nCreate specialized agents from scratch using JSON templates.\n\n**Types:**\n\n- **LLM-based** - Use prompts and language models\n- **Programmatic** (coming soon) - Use JavaScript/TypeScript code\n\n## Basic Structure\n\nNew agents need `\"override\": false` and these required fields:\n\n```json\n{\n \"id\": \"my-custom-agent\",\n \"version\": \"1.0.0\",\n \"override\": false,\n\n \"displayName\": \"My Custom Agent\",\n \"purpose\": \"A specialized agent for my workflow\",\n \"model\": \"anthropic/claude-4-sonnet-20250522\",\n \"outputMode\": \"last_message\",\n \"includeMessageHistory\": true,\n \"toolNames\": [\"read_files\", \"write_file\", \"end_turn\"],\n \"spawnableAgents\": [\"researcher\"],\n\n \"inputSchema\": {\n \"prompt\": {\n \"type\": \"string\",\n \"description\": \"What documentation to create or update\"\n }\n },\n\n \"parentInstructions\": {\n \"researcher\": \"When you need to understand API patterns or find code examples for documentation, spawn my-custom-agent to gather information about our repository's best practices.\"\n },\n\n \"systemPrompt\": {\n \"path\": \"./system.md\"\n },\n \"instructionsPrompt\": \"Create comprehensive documentation based on the user's request. Research existing code and patterns first.\"\n \"stepPrompt\": \"Continue working on the documentation. Use end_turn when complete.\"\n}\n```\n\n**.agents/templates/doc-writer-system.md**\n\n```markdown\n# Documentation Writer\n\nCreate clear, comprehensive documentation for codebases.\n\n## Guidelines\n\n- Research codebase first\n- Use clear, concise language\n- Include practical examples\n- Test examples for accuracy\n```\n\n## More Domain-Specific Examples\n\n### API Documentation Agent\n\nSpecialized for documenting REST APIs and GraphQL schemas:\n\n**.agents/templates/api-documenter.json**\n\n```json\n{\n \"id\": \"api-documenter\",\n \"version\": \"1.0.0\",\n \"override\": false,\n\n \"displayName\": \"API Documentation Specialist\"\n \"purpose\": \"Creates comprehensive API documentation with examples and schemas\",\n \"model\": \"anthropic/claude-4-sonnet-20250522\",\n \"outputMode\": \"last_message\",\n \"includeMessageHistory\": true,\n\n \"toolNames\": [\"read_files\", \"code_search\", \"write_file\", \"spawn_agents\", \"end_turn\"],\n \"spawnableAgents\": [\"researcher\"],\n\n \"inputSchema\": {\n \"prompt\": {\n \"type\": \"string\",\n \"description\": \"What API endpoints or schemas to document\"\n }\n },\n\n \"systemPrompt\": \"You are an API documentation specialist. Create clear, comprehensive documentation for REST APIs and GraphQL schemas with examples, request/response formats, and error codes.\",\n \"instructionsPrompt\": \"Analyze the specified API endpoints and create detailed documentation including examples, parameters, and response schemas.\"\n \"stepPrompt\": \"Continue documenting the API. Include practical examples and edge cases. Use end_turn when complete.\"\n}\n```\n\n### Database Migration Agent\n\nSpecialized for creating and reviewing database migrations:\n\n**.agents/templates/migration-specialist.json**\n\n```json\n{\n \"id\": \"migration-specialist\",\n \"version\": \"1.0.0\",\n \"override\": false,\n\n \"displayName\": \"Database Migration Specialist\"\n \"purpose\": \"Creates safe, reversible database migrations with proper indexing\",\n \"model\": \"anthropic/claude-4-sonnet-20250522\",\n \"outputMode\": \"last_message\",\n \"includeMessageHistory\": true,\n\n \"toolNames\": [\"read_files\", \"write_file\", \"code_search\", \"run_terminal_command\", \"end_turn\"],\n \"spawnableAgents\": [\"reviewer\"],\n\n \"parentInstructions\": {\n \"reviewer\": \"When database migrations are created or modified, spawn migration-specialist to review for data loss risks, locking issues, rollback procedures, and performance impact.\"\n },\n\n \"systemPrompt\": {\n \"path\": \"./migration-guidelines.md\"\n },\n \"instructionsPrompt\": \"Create a database migration for the requested schema changes. Ensure it's reversible and includes proper indexing.\"\n \"stepPrompt\": \"Continue working on the migration. Test it if possible and spawn a reviewer to check for issues.\"\n}\n```\n\n**.agents/templates/migration-guidelines.md**\n\n```markdown\n# Database Migration Guidelines\n\n## Safety First\n\n- Always create reversible migrations (up and down)\n- Test migrations on a copy of production data\n- Add indexes for new foreign keys\n- Use transactions where supported\n\n## Performance Considerations\n\n- Avoid locking tables during peak hours\n- Use `ADD COLUMN` with defaults carefully\n- Consider batching large data changes\n- Monitor migration execution time\n\n## Best Practices\n\n- Include descriptive migration names\n- Add comments explaining complex changes\n- Validate data integrity after migration\n- Keep migrations atomic and focused\n```\n\n## Parent Instructions\n\nParent instructions allow your agent to provide specific guidance to other agents when spawning them. This creates a hierarchical coordination system without requiring full agent overrides.\n\n### When to Use Parent Instructions\n\n- **Workflow Coordination**: Ensure spawned agents follow specific patterns\n- **Domain Expertise**: Share specialized knowledge with sub-agents\n- **Context Preservation**: Pass important context from parent to child agents\n- **Quality Control**: Add specific validation requirements\n\n### Real-World Examples\n\n#### Frontend Development Coordinator\n\n```json\n{\n \"id\": \"frontend-coordinator\",\n \"version\": \"1.0.0\",\n \"override\": false,\n \"displayName\": \"Frontend Development Coordinator\"\n \"purpose\": \"Coordinates frontend development with React best practices\",\n \"model\": \"anthropic/claude-4-sonnet-20250522\",\n \"outputMode\": \"last_message\",\n \"includeMessageHistory\": true,\n \"toolNames\": [\"read_files\", \"write_file\", \"code_search\", \"spawn_agents\", \"end_turn\"],\n \"spawnableAgents\": [\"reviewer\", \"researcher\", \"file_picker\"],\n \"inputSchema\": {\n \"prompt\": {\n \"type\": \"string\",\n \"description\": \"Frontend development task to coordinate\"\n }\n },\n \"parentInstructions\": {\n \"reviewer\": \"Spawn frontend-coordinator when you are looking at changes to React components or hooks to ensure proper hook usage, component composition, accessibility, and performance.\",\n \"researcher\": \"Need React patterns or component library info? Spawn frontend-coordinator to research official React docs and modern frontend practices.\",\n \"file_picker\": \"To understand the React codebase structure, spawn frontend-coordinator to find components, hooks, styles, and configuration files.\"\n },\n \"systemPrompt\": \"You are a frontend development coordinator specializing in React best practices. Guide development workflows and ensure code quality.\",\n \"instructionsPrompt\": \"Coordinate the frontend development task, spawning appropriate agents as needed.\"\n \"stepPrompt\": \"Continue coordinating the frontend development workflow. Use end_turn when complete.\"\n}\n```\n\n#### API Development Specialist\n\n```json\n{\n \"id\": \"api-specialist\",\n \"version\": \"1.0.0\",\n \"override\": false,\n \"displayName\": \"API Development Specialist\"\n \"purpose\": \"Specialized for REST API development and documentation\",\n \"model\": \"anthropic/claude-4-sonnet-20250522\",\n \"outputMode\": \"last_message\",\n \"includeMessageHistory\": true,\n \"toolNames\": [\"read_files\", \"write_file\", \"code_search\", \"spawn_agents\", \"run_terminal_command\", \"end_turn\"],\n \"spawnableAgents\": [\"reviewer\", \"researcher\", \"file_picker\"],\n \"inputSchema\": {\n \"prompt\": {\n \"type\": \"string\",\n \"description\": \"API development or documentation task\"\n }\n },\n \"parentInstructions\": {\n \"reviewer\": \"When API endpoints are created or modified, spawn api-specialist to review HTTP methods, status codes, error handling, and OpenAPI compliance.\",\n \"researcher\": \"For API design patterns or authentication strategies, spawn api-specialist to research industry standards and best practices.\",\n \"file_picker\": \"Understanding API structure requires spawning api-specialist to locate route definitions, middleware, controllers, and schema files.\"\n },\n \"systemPrompt\": \"You are an API development specialist focused on creating robust, well-documented REST APIs following industry standards.\",\n \"instructionsPrompt\": \"Handle the API development task, ensuring proper design patterns and documentation.\"\n \"stepPrompt\": \"Continue working on the API development task. Use end_turn when complete.\"\n}\n```\n\n#### DevOps Automation Agent\n\n```json\n{\n \"id\": \"devops-automator\",\n \"version\": \"1.0.0\",\n \"override\": false,\n \"displayName\": \"DevOps Automation Specialist\"\n \"purpose\": \"Handles infrastructure and deployment automation\",\n \"model\": \"anthropic/claude-4-sonnet-20250522\",\n \"outputMode\": \"last_message\",\n \"includeMessageHistory\": true,\n \"toolNames\": [\"read_files\", \"write_file\", \"code_search\", \"spawn_agents\", \"run_terminal_command\", \"end_turn\"],\n \"spawnableAgents\": [\"reviewer\", \"researcher\", \"file_picker\"],\n \"inputSchema\": {\n \"prompt\": {\n \"type\": \"string\",\n \"description\": \"Infrastructure or deployment automation task\"\n }\n },\n \"parentInstructions\": {\n \"reviewer\": \"Infrastructure code changes should be sent to devops-automator for review, security, resource optimization, deployment safety, and secrets management.\",\n \"researcher\": \"Cloud best practices or CI/CD patterns needed? Spawn devops-automator to apply container orchestration and disaster recovery best practices.\",\n \"file_picker\": \"Spawn devops-automator when infrastructure setup understanding is needed - it excels at finding Docker files, CI/CD configs, and deployment scripts.\"\n },\n \"systemPrompt\": \"You are a DevOps automation specialist focused on secure, scalable infrastructure and deployment pipelines.\",\n \"instructionsPrompt\": \"Handle the infrastructure or deployment automation task with security and reliability in mind.\"\n \"stepPrompt\": \"Continue working on the DevOps automation task. Use end_turn when complete.\"\n}\n```\n\n### Best Practices for Parent Instructions\n\n1. **Stay Focused**: Each instruction should relate to the target agent's core purpose.\n2. **Avoid Conflicts**: Consider how multiple parent instructions might interact. Each instruction across all your agents are added to the parent agent.\n3. **Test Thoroughly**: Verify instructions work across different scenarios. Start Codebuff with the option `--agent ` to talk with a specific agent to debug.\n\n## Programmatic Agents\n\n**Coming Soon** - Use JavaScript/TypeScript for complex orchestration logic.\n\n## Best Practices\n\n1. **Start small** - Begin with simple agents before complex ones\n2. **Experiment** - Try different tool/prompt combinations\n3. **Share** - Version control your `.agents/` directory\n4. **Iterate** - Improve based on usage\n5. **Leverage `parentInstructions`** - Coordinate agent behavior effectively\n", - "referencedBy": {} - } - ] - } - ], - "parentAgentId": "D-OfY8_NY2s" - }, - { - "type": "text", - "agentId": "D-OfaV526OE", - "text": "Here's a concise report of the locations in the codebase that define agent personalities or types:\n\n* `.agents/brainstormer.ts`, `.agents/planner.ts`, `.agents/researcher.ts`, `.agents/reviewer.ts`, `.agents/thinker.ts`, `.agents/superagent.ts`: These files define the persona, instructions, and capabilities of different agent types. They are useful as a central location for understanding specific agent behaviors.\n* `common/src/constants/agents.ts`: This file contains the `AGENT_PERSONAS` constant, which provides display names and purposes for different base and specialized agents. It's helpful for understanding the high-level categorization and naming of agents.\n* `common/src/types/agent-template.ts`: This file defines the `AgentTemplate` type, which outlines the structure of agent definitions, including fields like `displayName`, `systemPrompt`, `inputSchema`, and `toolNames`.\n* `npm-app/src/agents/load-agents.ts`: This file is responsible for loading local agent definitions, and could be useful for understanding how agents are managed.\n* `web/src/content/agents/overview.mdx`: Documentation summarizing agent design and purpose.\n" - }, - { - "type": "subagent_finish", - "agentId": "D-OfaV526OE", - "agentType": "file-picker", - "displayName": "Fletcher the File Fetcher", - "onlyChild": false, - "parentAgentId": "main-agent", - "prompt": "", - "params": { - "prompt": "agent personas, list of agent personalities or types" - } - }, - { - "type": "text", - "agentId": "D-OfY_tExks", - "text": ".agents/examples/diff-reviewer-1.ts\n.agents/examples/diff-reviewer-2.ts\n.agents/examples/diff-reviewer-3.ts\ncommon/src/util/examples/diff-reviewer-1.ts\ncommon/src/util/examples/diff-reviewer-2.ts\ncommon/src/util/examples/diff-reviewer-3.ts\nbackend/src/templates/agents/reviewer.ts\nbackend/src/templates/agents/thinker.ts\nbackend/src/templates/agents/planner.ts\nbackend/src/system-prompt/agent-instructions.md\nbackend/src/templates/prompts.ts\ncommon/src/constants/agents.ts" - }, - { - "type": "subagent_finish", - "agentId": "D-OgbZG1Kis", - "agentType": "file-lister", - "displayName": "Liszt the File Lister", - "onlyChild": true, - "parentAgentId": "D-OfY_tExks", - "prompt": "", - "params": { - "prompt": "diff-reviewer agent examples and configurations" - } - }, - { - "type": "tool_result", - "toolCallId": "d5d9bf34-0e52-49e8-97f8-330da68aa9a2", - "toolName": "spawn_agents", - "output": [ - { - "type": "json", - "value": [ - { - "agentName": "Liszt the File Lister", - "agentType": "file-lister", - "value": { - "type": "lastMessage", - "value": [ - { - "role": "assistant", - "content": [ - { - "type": "text", - "text": ".agents/examples/diff-reviewer-1.ts\n.agents/examples/diff-reviewer-2.ts\n.agents/examples/diff-reviewer-3.ts\ncommon/src/util/examples/diff-reviewer-1.ts\ncommon/src/util/examples/diff-reviewer-2.ts\ncommon/src/util/examples/diff-reviewer-3.ts\nbackend/src/templates/agents/reviewer.ts\nbackend/src/templates/agents/thinker.ts\nbackend/src/templates/agents/planner.ts\nbackend/src/system-prompt/agent-instructions.md\nbackend/src/templates/prompts.ts\ncommon/src/constants/agents.ts" - } - ] - } - ] - } - } - ] - } - ], - "parentAgentId": "D-OfY_tExks" - }, - { - "type": "tool_call", - "toolCallId": "3a890855-cfa7-43ef-97f7-d6ee3b29cb7e", - "toolName": "read_files", - "input": { - "paths": [ - ".agents/examples/diff-reviewer-1.ts", - ".agents/examples/diff-reviewer-2.ts", - ".agents/examples/diff-reviewer-3.ts", - "common/src/util/examples/diff-reviewer-1.ts", - "common/src/util/examples/diff-reviewer-2.ts", - "common/src/util/examples/diff-reviewer-3.ts", - "backend/src/templates/agents/reviewer.ts", - "backend/src/templates/agents/thinker.ts", - "backend/src/templates/agents/planner.ts", - "backend/src/system-prompt/agent-instructions.md", - "backend/src/templates/prompts.ts", - "common/src/constants/agents.ts" - ] - }, - "agentId": "D-OfY_tExks", - "parentAgentId": "main-agent", - "includeToolCall": true - }, - { - "type": "tool_result", - "toolCallId": "3a890855-cfa7-43ef-97f7-d6ee3b29cb7e", - "toolName": "read_files", - "output": [ - { - "type": "json", - "value": [ - { - "path": ".agents/examples/diff-reviewer-1.ts", - "content": "import type { AgentDefinition } from '../types/agent-definition'\n\nconst definition: AgentDefinition = {\n id: 'diff-reviewer-1',\n\n displayName: 'Diff Reviewer (Level 1)',\n model: 'openai/gpt-5',\n toolNames: ['read_files', 'run_terminal_command'],\n\n spawnPurposePrompt:\n 'Spawn when you need to review code changes in the git diff',\n\n instructionsPrompt: `Execute the following steps:\n1. Run git diff\n2. Read the files that have changed\n3. Review the changes and suggest improvements`,\n}\n\nexport default definition\n", - "referencedBy": {} - }, - { - "path": ".agents/examples/diff-reviewer-2.ts", - "content": "import type {\n AgentDefinition,\n AgentStepContext,\n} from '../types/agent-definition'\n\nconst definition: AgentDefinition = {\n id: 'diff-reviewer-2',\n displayName: 'Diff Reviewer (Level 2)',\n model: 'openai/gpt-5',\n\n inputSchema: {\n prompt: {\n type: 'string',\n description:\n 'Please provide a short description of the changes you want to review',\n },\n },\n toolNames: ['read_files', 'run_terminal_command'],\n\n spawnPurposePrompt:\n 'Spawn when you need to review code changes in the git diff',\n\n systemPrompt:\n 'You are an expert software developer. Your job is to review code changes and provide helpful feedback.',\n\n instructionsPrompt: `Execute the following steps:\n1. Run git diff\n2. Read the files that have changed\n3. Review the changes and suggest improvements\n\nUse the following guidelines while reviewing the changes:\n- Find ways to simplify the code\n- Reuse existing code as much as possible instead of writing new code\n- Preserve as much behavior as possible in the existing code\n- Prefer changing as few lines of code as possible\n- Look for opportunities to improve the code's readability\n- Look for logical errors in the code\n- Look for missed cases in the code\n- Look for any other bugs`,\n\n handleSteps: function* ({ agentState, prompt, params }: AgentStepContext) {\n // Step 1: Run git diff immediately. Saves the agent a step, lowering cost and latency!\n yield {\n toolName: 'run_terminal_command',\n args: {\n command: 'git diff',\n },\n }\n\n // Step 2: Let AI run the rest of the steps!\n yield 'STEP_ALL'\n },\n}\n\nexport default definition\n", - "referencedBy": {} - }, - { - "path": ".agents/examples/diff-reviewer-3.ts", - "content": "import type {\n AgentDefinition,\n AgentStepContext,\n} from '../types/agent-definition'\n\nconst definition: AgentDefinition = {\n id: 'diff-reviewer-3',\n\n displayName: 'Diff Reviewer (Level 3)',\n model: 'openai/gpt-5',\n inputSchema: {\n prompt: {\n type: 'string',\n description:\n 'Please provide a short description of the changes you want to review',\n },\n },\n outputMode: 'last_message',\n\n toolNames: ['read_files', 'run_terminal_command', 'spawn_agents'],\n spawnableAgents: ['james/file-explorer@0.1.3'],\n\n spawnPurposePrompt:\n 'Spawn when you need to review code changes in the git diff',\n\n systemPrompt:\n 'You are an expert software developer. Your job is to review code changes and provide helpful feedback.',\n\n instructionsPrompt: `Review the changes and suggest improvements.\n\nUse the following guidelines while reviewing the changes:\n- Find ways to simplify the code\n- Reuse existing code as much as possible instead of writing new code\n- Preserve as much behavior as possible in the existing code\n- Prefer changing as few lines of code as possible\n- Look for opportunities to improve the code's readability\n- Look for logical errors in the code\n- Look for missed cases in the code\n- Look for any other bugs`,\n\n handleSteps: function* ({ agentState, prompt, params }: AgentStepContext) {\n // Step 1: Get list of changed files from git diff --name-only\n const { toolResult: gitDiffFilesResult } = yield {\n toolName: 'run_terminal_command',\n args: {\n command: 'git diff --name-only',\n },\n }\n\n // Then, extract file paths from the result\n const changedFiles = (gitDiffFilesResult || '')\n .split('\\n')\n .map((line) => line.trim())\n .filter((line) => line && !line.startsWith('??') && !line.includes('OSC'))\n\n // Step 2: Read the files\n if (changedFiles.length > 0) {\n yield {\n toolName: 'read_files',\n args: {\n paths: changedFiles,\n },\n }\n }\n\n // Step 3: Run full git diff to see the actual changes\n yield {\n toolName: 'run_terminal_command',\n args: {\n command: 'git diff',\n },\n }\n\n // Step 4: Put words in the AI's mouth to get it to spawn the file explorer.\n yield {\n toolName: 'add_message',\n args: {\n role: 'assistant',\n content:\n 'Now I will spawn a file explorer to find any missing codebase context.',\n },\n }\n\n yield 'STEP'\n\n // Step 5: Put words in the AI's mouth to review the changes.\n yield {\n toolName: 'add_message',\n args: {\n role: 'assistant',\n content: 'Here is my comprehensive review of the changes.',\n },\n }\n\n // Step 6: Let AI review the changes in a final step. (The last message is also the agent's output.)\n yield 'STEP'\n },\n}\n\nexport default definition\n", - "referencedBy": {} - }, - { - "path": "common/src/util/examples/diff-reviewer-1.ts", - "content": "import type { AgentDefinition } from '../types/agent-definition'\n\nconst definition: AgentDefinition = {\n id: 'diff-reviewer-1',\n\n displayName: 'Diff Reviewer (Level 1)',\n model: 'openai/gpt-5',\n toolNames: ['read_files', 'run_terminal_command'],\n\n spawnPurposePrompt:\n 'Spawn when you need to review code changes in the git diff',\n\n instructionsPrompt: `Execute the following steps:\n1. Run git diff\n2. Read the files that have changed\n3. Review the changes and suggest improvements`,\n}\n\nexport default definition\n", - "referencedBy": {} - }, - { - "path": "common/src/util/examples/diff-reviewer-2.ts", - "content": "import type {\n AgentDefinition,\n AgentStepContext,\n} from '../types/agent-definition'\n\nconst definition: AgentDefinition = {\n id: 'diff-reviewer-2',\n displayName: 'Diff Reviewer (Level 2)',\n model: 'openai/gpt-5',\n\n inputSchema: {\n prompt: {\n type: 'string',\n description:\n 'Please provide a short description of the changes you want to review',\n },\n },\n toolNames: ['read_files', 'run_terminal_command'],\n\n spawnPurposePrompt:\n 'Spawn when you need to review code changes in the git diff',\n\n systemPrompt:\n 'You are an expert software developer. Your job is to review code changes and provide helpful feedback.',\n\n instructionsPrompt: `Execute the following steps:\n1. Run git diff\n2. Read the files that have changed\n3. Review the changes and suggest improvements\n\nUse the following guidelines while reviewing the changes:\n- Find ways to simplify the code\n- Reuse existing code as much as possible instead of writing new code\n- Preserve as much behavior as possible in the existing code\n- Prefer changing as few lines of code as possible\n- Look for opportunities to improve the code's readability\n- Look for logical errors in the code\n- Look for missed cases in the code\n- Look for any other bugs`,\n\n handleSteps: function* ({ agentState, prompt, params }: AgentStepContext) {\n // Step 1: Run git diff immediately. Saves the agent a step, lowering cost and latency!\n yield {\n toolName: 'run_terminal_command',\n args: {\n command: 'git diff',\n },\n }\n\n // Step 2: Let AI run the rest of the steps!\n yield 'STEP_ALL'\n },\n}\n\nexport default definition\n", - "referencedBy": {} - }, - { - "path": "common/src/util/examples/diff-reviewer-3.ts", - "content": "import type {\n AgentDefinition,\n AgentStepContext,\n} from '../types/agent-definition'\n\nconst definition: AgentDefinition = {\n id: 'diff-reviewer-3',\n\n displayName: 'Diff Reviewer (Level 3)',\n model: 'openai/gpt-5',\n inputSchema: {\n prompt: {\n type: 'string',\n description:\n 'Please provide a short description of the changes you want to review',\n },\n },\n outputMode: 'last_message',\n\n toolNames: ['read_files', 'run_terminal_command', 'spawn_agents'],\n spawnableAgents: ['james/file-explorer@0.1.3'],\n\n spawnPurposePrompt:\n 'Spawn when you need to review code changes in the git diff',\n\n systemPrompt:\n 'You are an expert software developer. Your job is to review code changes and provide helpful feedback.',\n\n instructionsPrompt: `Review the changes and suggest improvements.\n\nUse the following guidelines while reviewing the changes:\n- Find ways to simplify the code\n- Reuse existing code as much as possible instead of writing new code\n- Preserve as much behavior as possible in the existing code\n- Prefer changing as few lines of code as possible\n- Look for opportunities to improve the code's readability\n- Look for logical errors in the code\n- Look for missed cases in the code\n- Look for any other bugs`,\n\n handleSteps: function* ({ agentState, prompt, params }: AgentStepContext) {\n // Step 1: Get list of changed files from git diff --name-only\n const { toolResult: gitDiffFilesResult } = yield {\n toolName: 'run_terminal_command',\n args: {\n command: 'git diff --name-only',\n },\n }\n\n // Then, extract file paths from the result\n const changedFiles = (gitDiffFilesResult || '')\n .split('\\n')\n .map((line) => line.trim())\n .filter((line) => line && !line.startsWith('??') && !line.includes('OSC'))\n\n // Step 2: Read the files\n if (changedFiles.length > 0) {\n yield {\n toolName: 'read_files',\n args: {\n paths: changedFiles,\n },\n }\n }\n\n // Step 3: Run full git diff to see the actual changes\n yield {\n toolName: 'run_terminal_command',\n args: {\n command: 'git diff',\n },\n }\n\n // Step 4: Put words in the AI's mouth to get it to spawn the file explorer.\n yield {\n toolName: 'add_message',\n args: {\n role: 'assistant',\n content:\n 'Now I will spawn a file explorer to find any missing codebase context.',\n },\n }\n\n yield 'STEP'\n\n // Step 5: Put words in the AI's mouth to review the changes.\n yield {\n toolName: 'add_message',\n args: {\n role: 'assistant',\n content: 'Here is my comprehensive review of the changes.',\n },\n }\n\n // Step 6: Let AI review the changes in a final step. (The last message is also the agent's output.)\n yield 'STEP'\n },\n}\n\nexport default definition\n", - "referencedBy": {} - }, - { - "path": "backend/src/templates/agents/reviewer.ts", - "content": "import { AGENT_PERSONAS } from '@codebuff/common/constants/agents'\nimport { closeXml } from '@codebuff/common/util/xml'\nimport z from 'zod/v4'\n\nimport { PLACEHOLDER } from '../types'\n\nimport type { AgentTemplate } from '../types'\nimport type { Model } from '@codebuff/common/constants'\n\nexport const reviewer = (model: Model): Omit => ({\n model,\n displayName: AGENT_PERSONAS.reviewer.displayName,\n spawnPurposePrompt: AGENT_PERSONAS.reviewer.purpose,\n inputSchema: {\n prompt: z.string().describe('What should be reviewed. Be brief.'),\n },\n outputMode: 'last_message',\n includeMessageHistory: true,\n toolNames: ['end_turn', 'run_file_change_hooks'],\n spawnableAgents: [],\n\n systemPrompt: `# Persona: ${PLACEHOLDER.AGENT_NAME}\n\nYou are an expert programmer who can articulate very clear feedback on code changes.\n\n${PLACEHOLDER.TOOLS_PROMPT}\n\n${PLACEHOLDER.AGENTS_PROMPT}`,\n\n instructionsPrompt: `Your task is to provide helpful feedback on the last file changes made by the assistant. You should critique the code changes made recently in the above conversation.\n\nIMPORTANT: After analyzing the file changes, you should:\n1. Run file change hooks to validate the changes using the run_file_change_hooks tool\n2. Include the hook results in your feedback - if any hooks fail, mention the specific failures and suggest how to fix them\n3. If hooks pass and no issues are found, mention that validation was successful\n4. Always run hooks for TypeScript/JavaScript changes, test file changes, or when the changes could affect compilation/tests\n\nNOTE: You cannot make any changes directly! You can only suggest changes.\n\nProvide specific feedback on the file changes made by the assistant, file-by-file.\n\n- Focus on getting to a complete and correct solution as the top priority.\n- Try to keep any changes to the codebase as minimal as possible.\n- Simplify any logic that can be simplified.\n- Where a function can be reused, reuse it and do not create a new one.\n- Make sure that no new dead code is introduced.\n- Make sure there are no missing imports.\n- Make sure no sections were deleted that weren't supposed to be deleted.\n- Make sure the new code matches the style of the existing code.\n\nBe concise and to the point. After providing all your feedback, use the end_turn tool to end your response.`,\n\n stepPrompt: `IMPORTANT: Don't forget to end your response with the end_turn tool: ${closeXml('end_turn')}`,\n})\n", - "referencedBy": {} - }, - { - "path": "backend/src/templates/agents/thinker.ts", - "content": "import { AGENT_PERSONAS } from '@codebuff/common/constants/agents'\nimport { closeXml } from '@codebuff/common/util/xml'\nimport z from 'zod/v4'\n\nimport { PLACEHOLDER } from '../types'\n\nimport type { AgentTemplate } from '../types'\nimport type { Model } from '@codebuff/common/constants'\n\nexport const thinker = (model: Model): Omit => ({\n model,\n displayName: AGENT_PERSONAS.thinker.displayName,\n spawnPurposePrompt: AGENT_PERSONAS.thinker.purpose,\n inputSchema: {\n prompt: z.string().describe('The problem you are trying to solve'),\n },\n outputMode: 'last_message',\n includeMessageHistory: true,\n toolNames: ['end_turn'],\n spawnableAgents: [],\n\n systemPrompt: `# Persona: ${PLACEHOLDER.AGENT_NAME}\n\nYou are an expert programmer.\n\n${PLACEHOLDER.TOOLS_PROMPT}\n\n${PLACEHOLDER.AGENTS_PROMPT}`,\n\n instructionsPrompt: `\nThink deeply, step by step, about the user request and how best to approach it.\n\nConsider edge cases, potential issues, and alternative approaches.\n\nCome up with a list of insights that would help someone arrive at the best solution.\n\nTry not to be too prescriptive or confident in one solution. Instead, give clear arguments and reasoning.\n\nYou must be extremely concise and to the point.\n`.trim(),\n\n stepPrompt: `Don't forget to end your response with the end_turn tool: ${closeXml('end_turn')}`,\n})\n", - "referencedBy": {} - }, - { - "path": "backend/src/templates/agents/planner.ts", - "content": "import { AGENT_PERSONAS } from '@codebuff/common/constants/agents'\nimport { closeXml } from '@codebuff/common/util/xml'\nimport z from 'zod/v4'\n\nimport { PLACEHOLDER } from '../types'\n\nimport type { AgentTemplate } from '../types'\nimport type { Model } from '@codebuff/common/constants'\n\nexport const planner = (model: Model): Omit => ({\n model,\n displayName: AGENT_PERSONAS.planner.displayName,\n spawnPurposePrompt: AGENT_PERSONAS.planner.purpose,\n inputSchema: {\n prompt: z\n .string()\n .describe(\n 'What problem you to solve and a few ideas and suggestions for the plan',\n ),\n },\n outputMode: 'last_message',\n includeMessageHistory: true,\n toolNames: ['think_deeply', 'spawn_agents', 'end_turn'],\n spawnableAgents: [], // ARCHIVED: [AgentTemplateTypes.dry_run],\n\n systemPrompt: `# Persona: ${PLACEHOLDER.AGENT_NAME}\n\nYou are an expert software architect. You are good at creating comprehensive plans to tackle the user request.\n\n${PLACEHOLDER.TOOLS_PROMPT}\n\n${PLACEHOLDER.AGENTS_PROMPT}`,\n\n instructionsPrompt: `Steps for your response:\n1. Use the tool to think through cruxes for the plan, and tricky cases. Consider alternative approaches. Be sure to close the tool call with ${closeXml('think_deeply')}.\n2. Write out your plan in a concise way.\n3. Spawn 1-5 dry run agents to sketch portions of the implementation of the plan. (Important: do not forget to close the tool call with \"${closeXml('spawn_agents')}\"!)\n4. Synthesize all the information and rewrite the full plan to be the best it can be. Use the end_turn tool.`,\n\n stepPrompt:\n 'Do not forget to use the end_turn tool to end your response. Make sure the final plan is the best it can be.',\n})\n", - "referencedBy": {} - }, - { - "path": "backend/src/system-prompt/agent-instructions.md", - "content": "# Persona: Buffy - The Enthusiastic Coding Assistant\n\n**Your core identity is Buffy.** Buffy is an expert coding assistant who is enthusiastic, proactive, and helpful.\n\n- **Tone:** Maintain a positive, friendly, and helpful tone. Use clear and encouraging language.\n- **Clarity & Conciseness:** Explain your steps clearly but concisely. Say the least you can to get your point across. If you can, answer in one sentence only. Do not summarize changes. End turn early.\n\nYou are working on a project over multiple \"iterations,\" reminiscent of the movie \"Memento,\" aiming to accomplish the user's request.\n\n# Files\n\nThe tool result shows files you have previously read from tool calls.\n\nIf you write to a file, or if the user modifies a file, new copies of a file will be included in tool results.\n\nThus, multiple copies of the same file may be included over the course of a conversation. Each represents a distinct version in chronological order.\n\nImportant:\n\n- Pay particular attention to the last copy of a file as that one is current!\n- You are not the only one making changes to files. The user may modify files too, and you will see the latest version of the file after their changes. You must base you future write_file edits off of the latest changes. You must try to accommodate the changes that the user has made and treat those as explicit instructions to follow. If they add lines of code or delete them, you should assume they want the file to remain modified that way unless otherwise noted.\n\n# Subgoals\n\nFirst, create and edit subgoals if none exist and pursue the most appropriate one. This one of the few ways you can \"take notes\" in the Memento-esque environment. This is important, as you may forget what happened later! Use the and tools for this.\n\nThe following is a mock example of the subgoal schema:\n\n1\nFix the tests\nCOMPLETE\nRun them, find the error, fix it\nRan the tests and traced the error to component foo.\nModified the foo component to fix the error\n\n\nNotes:\n\n- Try to phrase the subgoal objective first in terms of observable behavior rather than how to implement it, if possible. The subgoal is what you are solving, not how you are solving it.\n\n# System Messages\n\nMessages from the system are surrounded by or XML tags. These are NOT messages from the user.\n\n# How to Respond\n\n- **Respond as Buffy:** Maintain the helpful and upbeat persona defined above throughout your entire response, but also be as conscise as possible.\n- **DO NOT Narrate Parameter Choices:** While commentary about your actions is required (Rule #2), **DO NOT** explain _why_ you chose specific parameter values for a tool (e.g., don't say \"I am using the path 'src/...' because...\"). Just provide the tool call after your action commentary.\n- **CRITICAL TOOL FORMATTING:**\n - **NO MARKDOWN:** Tool calls **MUST NOT** be wrapped in markdown code blocks (like \\`\\`\\`). Output the raw XML tags directly. **This is non-negotiable.**\n - **MANDATORY EMPTY LINES:** Tool calls **MUST** be surrounded by a _single empty line_ both before the opening tag (e.g., ``) and after the closing tag (e.g., ``). See the example below. **Failure to include these empty lines will break the process.**\n - **NESTED ELEMENTS ONLY:** Tool parameters **MUST** be specified using _only_ nested XML elements, like `value`. You **MUST NOT** use XML attributes within the tool call tags (e.g., writing ``). Stick strictly to the nested element format shown in the example response below. This is absolutely critical for the parser.\n- **User Questions:** If the user is asking for help with ideas or brainstorming, or asking a question, then you should directly answer the user's question, but do not make any changes to the codebase. Do not call modification tools like `write_file`.\n- **Handling Requests:**\n - For complex requests, create a subgoal using to track objectives from the user request. Use to record progress. Put summaries of actions taken into the subgoal's .\n - For straightforward requests, proceed directly without adding subgoals.\n- **Reading Files:** Try to read as many files as could possibly be relevant in your first 1 or 2 read_files tool calls. List multiple file paths in one tool call, as many as you can. You must read more files whenever it would improve your response.\n- **Minimal Changes:** You should make as few changes as possible to the codebase to address the user's request. Only do what the user has asked for and no more. When modifying existing code, assume every line of code has a purpose and is there for a reason. Do not change the behavior of code except in the most minimal way to accomplish the user's request.\n- **DO NOT run scripts, make git commits or push to remote repositories without permission from the user.** It's extremely important not to run scripts that could have major effects. Similarly, a wrong git push could break production. For these actions, always ask permission first and wait for user confirmation.\n- **Code Hygiene:** Make sure to leave things in a good state:\n\n - Don't forget to add any imports that might be needed\n - Remove unused variables, functions, and files as a result of your changes.\n - If you added files or functions meant to replace existing code, then you should also remove the previous code.\n\n- **Read Before Writing:** If you are about to edit a file, make sure it is one that you have already read, i.e. is included in your context -- otherwise, use the read_file tool to read it first!\n- **Check for Existing Changes:** If the user is requesting a change that you think has already been made based on the current version of files, simply tell the user that \"It looks like that change has already been made!\". It is common that a file you intend to update already has the changes you want.\n- **Think about your next action:** After receiving tool results, carefully reflect on their quality and determine optimal next steps before proceeding. Use your thinking to plan and iterate based on this new information, and then take the best next action.\n- **Package Management:** When adding new packages, use the run_terminal_command tool to install the package rather than editing the package.json file with a guess at the version number to use (or similar for other languages). This way, you will be sure to have the latest version of the package. Do not install packages globally unless asked by the user (e.g. Don't run \\`npm install -g \\`). Always try to use the package manager associated with the project (e.g. it might be \\`pnpm\\` or \\`bun\\` or \\`yarn\\` instead of \\`npm\\`, or similar for other languages).\n- **Refactoring Awareness:** Whenever you modify an exported token like a function or class or variable, you should use the code_search tool to find all references to it before it was renamed (or had its type/parameters changed) and update the references appropriately.\n- **Testing:** If you create a unit test, you should run it using `run_terminal_command` to see if it passes, and fix it if it doesn't.\n- **Front end development** We want to make the UI look as good as possible. Don't hold back. Give it your all.\n\n - Include as many relevant features and interactions as possible\n - Add thoughtful details like hover states, transitions, and micro-interactions\n - Apply design principles: hierarchy, contrast, balance, and movement\n - Create an impressive demonstration showcasing web development capabilities\n\n- **Don't summarize your changes** Omit summaries as much as possible. Be extremely concise when explaining the changes you made. There's no need to write a long explanation of what you did. Keep it to 1-2 two sentences max.\n- **Ending Your Response:** Your aim should be to completely fulfill the user's request before using ending your response. DO NOT END TURN IF YOU ARE STILL WORKING ON THE USER'S REQUEST. If the user's request requires multiple steps, please complete ALL the steps before stopping, even if you have done a lot of work so far.\n- **FINALLY, YOU MUST USE THE END TURN TOOL** When you have fully answered the user _or_ you are explicitly waiting for the user's next typed input, always conclude the message with a standalone `` tool call (surrounded by its required blank lines). This should be at the end of your message, e.g.:\n \n User: Hi\n Assisistant: Hello, what can I do for you today?\\n\\n\n \n\n## Verifying Your Changes at the End of Your Response\n\n### User has a `codebuff.json`\n\nIf the user has a `codebuff.json` with the appropriate `fileChangeHooks`, there is no need to run any commands.\n\nIf the `fileChangeHooks` are not configured, inform the user about the `fileChangeHooks` parameter.\n\n### User has no `codebuff.json`\n\nIf this is the case, inform the user know about the `/init` command (within Codebuff, not a terminal command).\n\nCheck the knowledge files to see if the user has specified a further protocol for what terminal commands should be run to verify edits. For example, a \\`knowledge.md\\` file could specify that after every change you should run the tests or linting or run the type checker. If there are multiple commands to run, you should run them all using '&&' to concatenate them into one commands, e.g. \\`npm run lint && npm run test\\`.\n\n## Example Response (Simplified - Demonstrating Rules)\n\nUser: Please console.log the props in the component Foo\n\nAssistant: Certainly! I can add that console log for you. Let's start by reading the file:\n\n\nsrc/components/foo.tsx\n\n\nNow, I'll add the console.log at the beginning of the Foo component:\n\n\nsrc/components/foo.tsx\n\n// ... existing code ...\nfunction Foo(props: {\nbar: string\n}) {\nconsole.log(\"Foo props:\", props);\n// ... rest of the function ...\n}\n// ... existing code ...\n\n\n\nLet me check my changes\n\n\nnpm run typecheck\n\n\nI see that my changes went through correctly. What would you like to do next?\n\n\n", - "referencedBy": {} - }, - { - "path": "backend/src/templates/prompts.ts", - "content": "import { schemaToJsonStr } from '@codebuff/common/util/zod-schema'\nimport type { AgentTemplate } from '@codebuff/common/types/agent-template'\nimport type { AgentTemplateType } from '@codebuff/common/types/session-state'\nimport { getAgentTemplate } from './agent-registry'\n\nexport async function buildSpawnableAgentsDescription(\n spawnableAgents: AgentTemplateType[],\n agentTemplates: Record,\n): Promise {\n if (spawnableAgents.length === 0) {\n return ''\n }\n\n const subAgentTypesAndTemplates = await Promise.all(\n spawnableAgents.map(async (agentType) => {\n return [\n agentType,\n await getAgentTemplate(agentType, agentTemplates),\n ] as const\n }),\n )\n\n const agentsDescription = subAgentTypesAndTemplates\n .map(([agentType, agentTemplate]) => {\n if (!agentTemplate) {\n // Fallback for unknown agents\n return `- ${agentType}: Dynamic agent (description not available)\nprompt: {\"description\": \"A coding task to complete\", \"type\": \"string\"}\nparams: None`\n }\n const { inputSchema } = agentTemplate\n if (!inputSchema) {\n return `- ${agentType}: ${agentTemplate.spawnPurposePrompt}\nprompt: None\nparams: None`\n }\n const { prompt, params } = inputSchema\n return `- ${agentType}: ${agentTemplate.spawnPurposePrompt}\nprompt: ${schemaToJsonStr(prompt)}\nparams: ${schemaToJsonStr(params)}`\n })\n .filter(Boolean)\n .join('\\n\\n')\n\n return `\\n\\n## Spawnable Agents\n\nUse the spawn_agents tool to spawn agents to help you complete the user request. Here are the available agents by their agent_type:\n\n${agentsDescription}`\n}\n", - "referencedBy": {} - }, - { - "path": "common/src/constants/agents.ts", - "content": "import type { AgentTemplateTypes } from '../types/session-state'\n\n// Define agent personas with their shared characteristics\nexport const AGENT_PERSONAS = {\n // Base agents - all use Buffy persona\n base: {\n displayName: 'Buffy the Enthusiastic Coding Assistant',\n purpose: 'Base agent that orchestrates the full response.',\n } as const,\n base_lite: {\n displayName: 'Buffy the Enthusiastic Coding Assistant',\n purpose: 'Base agent that orchestrates the full response.',\n } as const,\n base_max: {\n displayName: 'Buffy the Enthusiastic Coding Assistant',\n purpose: 'Base agent that orchestrates the full response.',\n } as const,\n base_experimental: {\n displayName: 'Buffy the Enthusiastic Coding Assistant',\n purpose: 'Base agent that orchestrates the full response.',\n } as const,\n claude4_gemini_thinking: {\n displayName: 'Buffy the Enthusiastic Coding Assistant',\n purpose: 'Base agent that orchestrates the full response.',\n } as const,\n\n base_agent_builder: {\n displayName: 'Buffy the Enthusiastic Agent Builder',\n purpose:\n 'Enhanced base agent that can create custom agents and handle all coding tasks',\n } as const,\n\n superagent: {\n displayName: 'Superagent',\n purpose:\n 'Superagent that can spawn multiple code editing agents to complete a task.',\n } as const,\n\n // Ask mode\n ask: {\n displayName: 'Buffy the Enthusiastic Coding Assistant',\n purpose: 'Base ask-mode agent that orchestrates the full response.',\n } as const,\n\n // Specialized agents\n thinker: {\n displayName: 'Theo the Theorizer',\n purpose:\n 'Does deep thinking given the current messages and a specific prompt to focus on. Use this to help you solve a specific problem.',\n } as const,\n file_explorer: {\n displayName: 'Dora The File Explorer',\n purpose: 'Expert at exploring a codebase and finding relevant files.',\n } as const,\n file_picker: {\n displayName: 'Fletcher the File Fetcher',\n purpose: 'Expert at finding relevant files in a codebase.',\n } as const,\n researcher: {\n displayName: 'Reid Searcher the Researcher',\n purpose: 'Expert at researching topics using web search and documentation.',\n } as const,\n planner: {\n displayName: 'Peter Plan the Planner',\n purpose: 'Agent that formulates a comprehensive plan to a prompt.',\n hidden: true,\n } as const,\n dry_run: {\n displayName: 'Sketch the Dry Runner',\n purpose: 'Agent that takes a plan and try to implement it in a dry run.',\n hidden: true,\n } as const,\n reviewer: {\n displayName: 'Nit Pick Nick the Reviewer',\n purpose:\n 'Reviews file changes and responds with critical feedback. Use this after making any significant change to the codebase.',\n } as const,\n agent_builder: {\n displayName: 'Bob the Agent Builder',\n purpose: 'Creates new agent templates for the codebuff mult-agent system',\n hidden: false,\n } as const,\n} as const satisfies Partial<\n Record<\n keyof typeof AgentTemplateTypes,\n { displayName: string; purpose: string; hidden?: boolean }\n >\n>\n\n// Agent IDs list from AGENT_PERSONAS keys\nexport const AGENT_IDS = Object.keys(\n AGENT_PERSONAS,\n) as (keyof typeof AGENT_PERSONAS)[]\n\n// Agent ID prefix constant\nexport const AGENT_ID_PREFIX = 'CodebuffAI/'\n\n// Agent names for client-side reference\nexport const AGENT_NAMES = Object.fromEntries(\n Object.entries(AGENT_PERSONAS).map(([agentType, persona]) => [\n agentType,\n persona.displayName,\n ]),\n) as Record\n\nexport type AgentName =\n (typeof AGENT_PERSONAS)[keyof typeof AGENT_PERSONAS]['displayName']\n\n// Get unique agent names for UI display\nexport const UNIQUE_AGENT_NAMES = Array.from(\n new Set(\n Object.values(AGENT_PERSONAS)\n .filter((persona) => !('hidden' in persona) || !persona.hidden)\n .map((persona) => persona.displayName),\n ),\n)\n\n// Map from display name back to agent types (for parsing user input)\nexport const AGENT_NAME_TO_TYPES = Object.entries(AGENT_NAMES).reduce(\n (acc, [type, name]) => {\n if (!acc[name]) acc[name] = []\n acc[name].push(type)\n return acc\n },\n {} as Record,\n)\n", - "referencedBy": {} - } - ] - } - ], - "parentAgentId": "D-OfY_tExks" - }, - { - "type": "text", - "agentId": "D-OfaYSx8-Q", - "text": "Okay, here's a concise report on the locations in the codebase that could be helpful for creating a custom agent from a starter template, or understanding the existing `git-committer` agent:\n\n* `.agents/git-committer.ts`: This is the definition of the `git-committer` agent. It shows the structure of an agent definition, including its `id`, `inputSchema`, `systemPrompt`, `instructionsPrompt`, and `handleSteps`. Crucially it shows the tools and steps this agent uses.\n* `backend/src/templates/agents/base.ts`: This file provides the base template for creating agents. It defines the core structure, including the input schema, output mode, and available tools.\n* `backend/src/templates/agent-list.ts`: This file defines a list of available static agentTemplates providing a way to reference existing, simple (non-dynamic) agents.\n* `common/src/types/agent-template.ts`: This file defines the `AgentTemplate` type, which is the structure that all agent definitions must adhere to. It specifies the required and optional properties of an agent.\n* `npm-app/src/cli-handlers/agents.ts`: This file contains the logic for displaying and selecting agents within the CLI. You likely do not require this information.\n" - }, - { - "type": "subagent_finish", - "agentId": "D-OfaYSx8-Q", - "agentType": "file-picker", - "displayName": "Fletcher the File Fetcher", - "onlyChild": false, - "parentAgentId": "main-agent", - "prompt": "", - "params": { - "prompt": "your-custom-agent starter template or git-committer agent" - } - }, - { - "type": "text", - "agentId": "D-OfY8_NY2s", - "text": "Here's a short report of the locations in the codebase that could be helpful, focusing on the most relevant files:\n\n* **`backend/src/templates/agents/agent-builder.ts`**: This file contains the `agentBuilder` function, which is responsible for creating new agent templates. It reads agent template types, tool definitions, and example agent files, providing a good starting point for understanding the agent creation process.\n* **`backend/src/templates/agent-registry.ts`**: This file manages the agent registry, fetching agents from the database and assembling local agent templates. It is useful for understanding how agents are stored and retrieved.\n* **`npm-app/src/cli-handlers/agent-creation-chat.ts`**: This file contains the `startAgentCreationChat` function, which guides users through the agent creation process via a CLI chat interface. It showcases how agent requirements are collected and used to create agent templates.\n* **`web/src/content/agents/creating-new-agents.mdx`**: This file provides documentation on creating new agents, including examples and best practices. It offers insights into the structure and required fields of agent templates.\n* **`common/src/types/dynamic-agent-template.ts`**: This file defines the schema for dynamic agent templates, outlining the structure and properties of custom Codebuff agents.\n" - }, - { - "type": "subagent_finish", - "agentId": "D-OfY8_NY2s", - "agentType": "file-picker", - "displayName": "Fletcher the File Fetcher", - "onlyChild": false, - "parentAgentId": "main-agent", - "prompt": "", - "params": { - "prompt": "agent builder, agent creation, scaffolding custom agents, agent templates" - } - }, - { - "type": "text", - "agentId": "D-OfY_tExks", - "text": "Here's a concise report on diff-reviewer agent examples and configurations:\n\n* `.agents/examples/diff-reviewer-1.ts`, `.agents/examples/diff-reviewer-2.ts`, `.agents/examples/diff-reviewer-3.ts`, `common/src/util/examples/diff-reviewer-1.ts`, `common/src/util/examples/diff-reviewer-2.ts`, `common/src/util/examples/diff-reviewer-3.ts`: These files provide example definitions for diff-reviewer agents at different levels (1-3), showcasing variations in input schema, tools used, and step handling.\n\n* `backend/src/templates/agents/reviewer.ts`: This file defines the reviewer agent template, including its persona, instructions, and tool usage, focusing on providing feedback on code changes.\n\n* `backend/src/system-prompt/agent-instructions.md`: This file dictates the system prompt and instructions for the diff reviewer, shaping its behavior and emphasizing clarity, conciseness, and adherence to code style.\n\nThese files offer insights into the agent's configuration, behavior, and usage within the codebase.\n" - }, - { - "type": "subagent_finish", - "agentId": "D-OfY_tExks", - "agentType": "file-picker", - "displayName": "Fletcher the File Fetcher", - "onlyChild": false, - "parentAgentId": "main-agent", - "prompt": "", - "params": { - "prompt": "diff-reviewer agent examples and configurations" - } - }, - { - "type": "text", - "agentId": "D-OfaehVPQw", - "text": "backend/src/templates/agents/file-explorer.ts\nbackend/src/tools/definitions/tool/spawn-agents.ts\nbackend/src/tools/handlers/tool/spawn-agents.ts\nbackend/src/templates/agent-registry.ts\ncommon/src/templates/agent-list.ts\ncommon/src/constants/agents.ts\nbackend/src/system-prompt/prompts.ts\nbackend/src/main-prompt.ts\nnpm-app/src/agents/load-agents.ts\nnpm-app/src/cli-handlers/agents.ts\nbackend/src/templates/base.ts\nbackend/src/tools/definitions/tool/spawn-agent-inline.ts" - }, - { - "type": "subagent_finish", - "agentId": "D-OgWSwaG9Q", - "agentType": "file-lister", - "displayName": "Liszt the File Lister", - "onlyChild": true, - "parentAgentId": "D-OfaehVPQw", - "prompt": "", - "params": { - "prompt": "file-explorer agent definition and spawn target" - } - }, - { - "type": "tool_result", - "toolCallId": "b8a5729e-8e1d-4629-9a40-03ed7cd2ac40", - "toolName": "spawn_agents", - "output": [ - { - "type": "json", - "value": [ - { - "agentName": "Liszt the File Lister", - "agentType": "file-lister", - "value": { - "type": "lastMessage", - "value": [ - { - "role": "assistant", - "content": [ - { - "type": "text", - "text": "backend/src/templates/agents/file-explorer.ts\nbackend/src/tools/definitions/tool/spawn-agents.ts\nbackend/src/tools/handlers/tool/spawn-agents.ts\nbackend/src/templates/agent-registry.ts\ncommon/src/templates/agent-list.ts\ncommon/src/constants/agents.ts\nbackend/src/system-prompt/prompts.ts\nbackend/src/main-prompt.ts\nnpm-app/src/agents/load-agents.ts\nnpm-app/src/cli-handlers/agents.ts\nbackend/src/templates/base.ts\nbackend/src/tools/definitions/tool/spawn-agent-inline.ts" - } - ] - } - ] - } - } - ] - } - ], - "parentAgentId": "D-OfaehVPQw" - }, - { - "type": "tool_call", - "toolCallId": "3aa0ab7d-9afc-4330-929f-c01e72330ad1", - "toolName": "read_files", - "input": { - "paths": [ - "backend/src/templates/agents/file-explorer.ts", - "backend/src/tools/definitions/tool/spawn-agents.ts", - "backend/src/tools/handlers/tool/spawn-agents.ts", - "backend/src/templates/agent-registry.ts", - "common/src/templates/agent-list.ts", - "common/src/constants/agents.ts", - "backend/src/system-prompt/prompts.ts", - "backend/src/main-prompt.ts", - "npm-app/src/agents/load-agents.ts", - "npm-app/src/cli-handlers/agents.ts", - "backend/src/templates/base.ts", - "backend/src/tools/definitions/tool/spawn-agent-inline.ts" - ] - }, - "agentId": "D-OfaehVPQw", - "parentAgentId": "main-agent", - "includeToolCall": true - }, - { - "type": "tool_result", - "toolCallId": "3aa0ab7d-9afc-4330-929f-c01e72330ad1", - "toolName": "read_files", - "output": [ - { - "type": "json", - "value": [ - { - "path": "backend/src/templates/agents/file-explorer.ts", - "content": "import { AgentTemplateTypes } from '@codebuff/common/types/session-state'\nimport { z } from 'zod/v4'\n\nimport type { AgentTemplate } from '../types'\n\nconst paramsSchema = z.object({\n prompts: z\n .array(z.string())\n .describe(\n 'List of 1-4 different parts of the codebase that could be useful to explore',\n ),\n})\n\nexport const fileExplorer = {\n id: AgentTemplateTypes.file_explorer,\n displayName: 'Dora the File Explorer',\n spawnPurposePrompt:\n 'Spawns multiple file picker agents in parallel to comprehensively explore the codebase from different perspectives',\n model: 'anthropic/claude-4-sonnet-20250522',\n outputMode: 'structured_output',\n includeMessageHistory: false,\n toolNames: ['spawn_agents', 'set_output'],\n spawnableAgents: ['file-picker'],\n inputSchema: {\n prompt: z\n .string()\n .describe('What you need to accomplish by exploring the codebase'),\n params: paramsSchema,\n },\n systemPrompt:\n 'You are a file explorer agent that spawns multiple file picker agents in parallel to comprehensively explore the codebase.',\n instructionsPrompt: '',\n stepPrompt: '',\n\n handleSteps: function* ({ prompt, params }) {\n const filePickerPrompts = params.prompts.map(\n (focusPrompt) =>\n `Based on the overall goal \"${prompt}\", find files related to this specific area: ${focusPrompt}`,\n )\n\n // Spawn all file pickers in parallel\n const { toolResult: spawnResult } = yield {\n toolName: 'spawn_agents' as const,\n args: {\n agents: filePickerPrompts.map((promptText) => ({\n agent_type: 'file-picker' as const,\n prompt: promptText,\n })),\n },\n }\n\n // Set output with aggregated results\n yield {\n toolName: 'set_output' as const,\n args: {\n results: spawnResult,\n },\n }\n },\n} satisfies AgentTemplate>\n", - "referencedBy": {} - }, - { - "path": "backend/src/tools/definitions/tool/spawn-agents.ts", - "content": "import { getToolCallString } from '@codebuff/common/tools/utils'\n\nimport type { ToolDescription } from '../tool-def-type'\n\nconst toolName = 'spawn_agents'\nexport const spawnAgentsTool = {\n toolName,\n description: `\nUse this tool to spawn agents to help you complete the user request. Each agent has specific requirements for prompt and params based on their inputSchema.\n\nThe prompt field is a simple string, while params is a JSON object that gets validated against the agent's schema.\n\nExample:\n${getToolCallString(toolName, {\n agents: [\n {\n agent_type: 'planner',\n prompt: 'Create a plan for implementing user authentication',\n params: { filePaths: ['src/auth.ts', 'src/user.ts'] },\n },\n ],\n})}\n `.trim(),\n} satisfies ToolDescription\n", - "referencedBy": {} - }, - { - "path": "backend/src/tools/handlers/tool/spawn-agents.ts", - "content": "import { generateCompactId } from '@codebuff/common/util/string'\n\nimport { getAgentTemplate } from '../../../templates/agent-registry'\nimport { logger } from '../../../util/logger'\n\nimport type { CodebuffToolCall } from '../../constants'\nimport type { CodebuffToolHandlerFunction } from '../handler-function-type'\nimport type { AgentTemplate } from '@codebuff/common/types/agent-template'\nimport type { CodebuffMessage } from '@codebuff/common/types/message'\nimport type { PrintModeEvent } from '@codebuff/common/types/print-mode'\nimport type {\n AgentState,\n AgentTemplateType,\n} from '@codebuff/common/types/session-state'\nimport type { ProjectFileContext } from '@codebuff/common/util/file'\nimport type { WebSocket } from 'ws'\n\nexport type SendSubagentChunk = (data: {\n userInputId: string\n agentId: string\n agentType: string\n chunk: string\n prompt?: string\n}) => void\n\nexport const handleSpawnAgents = ((params: {\n previousToolCallFinished: Promise\n toolCall: CodebuffToolCall<'spawn_agents'>\n\n fileContext: ProjectFileContext\n clientSessionId: string\n userInputId: string\n\n getLatestState: () => { messages: CodebuffMessage[] }\n state: {\n ws?: WebSocket\n fingerprintId?: string\n userId?: string\n agentTemplate?: AgentTemplate\n localAgentTemplates?: Record\n sendSubagentChunk?: SendSubagentChunk\n messages?: CodebuffMessage[]\n agentState?: AgentState\n }\n}): { result: Promise; state: {} } => {\n const {\n previousToolCallFinished,\n toolCall,\n\n fileContext,\n clientSessionId,\n userInputId,\n getLatestState,\n state,\n } = params\n const { agents } = toolCall.args\n const {\n ws,\n fingerprintId,\n userId,\n agentTemplate: parentAgentTemplate,\n localAgentTemplates,\n sendSubagentChunk,\n messages,\n } = state\n let { agentState } = state\n\n if (!ws) {\n throw new Error(\n 'Internal error for spawn_agents: Missing WebSocket in state',\n )\n }\n if (!fingerprintId) {\n throw new Error(\n 'Internal error for spawn_agents: Missing fingerprintId in state',\n )\n }\n if (!parentAgentTemplate) {\n throw new Error(\n 'Internal error for spawn_agents: Missing agentTemplate in state',\n )\n }\n if (!sendSubagentChunk) {\n throw new Error(\n 'Internal error for spawn_agents: Missing sendSubagentChunk in state',\n )\n }\n if (!messages) {\n throw new Error(\n 'Internal error for spawn_agents: Missing messages in state',\n )\n }\n if (!agentState) {\n throw new Error(\n 'Internal error for spawn_agents: Missing agentState in state',\n )\n }\n if (!localAgentTemplates) {\n throw new Error(\n 'Internal error for spawn_agents: Missing localAgentTemplates in state',\n )\n }\n\n const triggerSpawnAgents = async () => {\n const conversationHistoryMessage: CodebuffMessage = {\n role: 'user',\n content: `For context, the following is the conversation history between the user and an assistant:\\n\\n${JSON.stringify(\n getLatestState().messages,\n null,\n 2,\n )}`,\n }\n const results = await Promise.allSettled(\n agents.map(async ({ agent_type: agentTypeStr, prompt, params }) => {\n const agentType = agentTypeStr as AgentTemplateType\n const agentTemplate = await getAgentTemplate(\n agentType,\n localAgentTemplates,\n )\n\n if (!agentTemplate) {\n throw new Error(`Agent type ${agentTypeStr} not found.`)\n }\n\n if (!parentAgentTemplate.spawnableAgents.includes(agentType)) {\n throw new Error(\n `Agent type ${parentAgentTemplate.id} is not allowed to spawn child agent type ${agentType}.`,\n )\n }\n\n // Validate prompt and params against agent's schema\n const { inputSchema } = agentTemplate\n\n // Validate prompt requirement\n if (inputSchema.prompt) {\n const result = inputSchema.prompt.safeParse(prompt)\n if (!result.success) {\n throw new Error(\n `Invalid prompt for agent ${agentType}: ${JSON.stringify(result.error.issues, null, 2)}`,\n )\n }\n }\n\n // Validate params if schema exists\n if (inputSchema.params) {\n const result = inputSchema.params.safeParse(params)\n if (!result.success) {\n throw new Error(\n `Invalid params for agent ${agentType}: ${JSON.stringify(result.error.issues, null, 2)}`,\n )\n }\n }\n\n const agentId = generateCompactId()\n const subAgentMessages: CodebuffMessage[] = []\n if (agentTemplate.includeMessageHistory) {\n subAgentMessages.push(conversationHistoryMessage)\n }\n\n const subAgentState: AgentState = {\n agentId,\n agentType,\n agentContext: {},\n subagents: [],\n messageHistory: subAgentMessages,\n stepsRemaining: 20, // MAX_AGENT_STEPS\n output: undefined,\n parentId: agentState!.agentId,\n }\n\n logger.debug(\n {\n agentTemplate,\n prompt,\n params,\n agentId,\n parentId: subAgentState.parentId,\n },\n `Spawning agent — ${agentType} (${agentId})`,\n )\n\n // Import loopAgentSteps dynamically to avoid circular dependency\n const { loopAgentSteps } = await import('../../../run-agent-step')\n\n const result = await loopAgentSteps(ws, {\n userInputId: `${userInputId}-${agentType}${agentId}`,\n prompt: prompt || '',\n params,\n agentType: agentTemplate.id,\n agentState: subAgentState,\n fingerprintId,\n fileContext,\n localAgentTemplates,\n toolResults: [],\n userId,\n clientSessionId,\n onResponseChunk: (chunk: string | PrintModeEvent) => {\n if (typeof chunk !== 'string') {\n return\n }\n // Send subagent streaming chunks to client\n sendSubagentChunk({\n userInputId,\n agentId,\n agentType,\n chunk,\n prompt,\n })\n },\n })\n\n return {\n ...result,\n agentType,\n agentName: agentTemplate.displayName,\n }\n }),\n )\n\n const reports = await Promise.all(\n results.map(async (result, index) => {\n const agentInfo = agents[index]\n const agentTypeStr = agentInfo.agent_type\n\n if (result.status === 'fulfilled') {\n const { agentState, agentName } = result.value\n const agentTemplate = await getAgentTemplate(\n agentState.agentType!,\n localAgentTemplates,\n )\n if (!agentTemplate) {\n return `**Agent (${agentTypeStr}):**\\nError: Could not find agent template for ${agentState.agentType!}`\n }\n let report = ''\n\n if (agentTemplate.outputMode === 'structured_output') {\n report = JSON.stringify(result.value.agentState.output, null, 2)\n } else if (agentTemplate.outputMode === 'last_message') {\n const { agentState } = result.value\n const assistantMessages = agentState.messageHistory.filter(\n (message) => message.role === 'assistant',\n )\n const lastAssistantMessage =\n assistantMessages[assistantMessages.length - 1]\n if (!lastAssistantMessage) {\n report = 'No response from agent'\n } else if (typeof lastAssistantMessage.content === 'string') {\n report = lastAssistantMessage.content\n } else {\n report = JSON.stringify(lastAssistantMessage.content, null, 2)\n }\n } else if (agentTemplate.outputMode === 'all_messages') {\n const { agentState } = result.value\n // Remove the first message, which includes the previous conversation history.\n const agentMessages = agentState.messageHistory.slice(1)\n report = `Agent messages:\\n\\n${JSON.stringify(agentMessages, null, 2)}`\n } else {\n throw new Error(\n `Unknown output mode: ${'outputMode' in agentTemplate ? agentTemplate.outputMode : 'undefined'}`,\n )\n }\n\n return `**${agentName}:**\\n${report}`\n } else {\n return `**Agent (${agentTypeStr}):**\\nError spawning agent: ${result.reason}`\n }\n }),\n )\n return reports\n .map((report: string) => `${report}`)\n .join('\\n')\n }\n\n return {\n result: previousToolCallFinished.then(triggerSpawnAgents),\n state: {},\n }\n}) satisfies CodebuffToolHandlerFunction<'spawn_agents'>\n", - "referencedBy": {} - }, - { - "path": "backend/src/templates/agent-registry.ts", - "content": "import type { AgentTemplate } from '@codebuff/common/types/agent-template'\nimport db from '@codebuff/common/db'\nimport * as schema from '@codebuff/common/db/schema'\nimport { and, desc, eq } from 'drizzle-orm'\n\nimport { ProjectFileContext } from '@codebuff/common/util/file'\nimport { logger } from '../util/logger'\nimport { agentTemplates as staticTemplates } from './agent-list'\nimport {\n DynamicAgentValidationError,\n validateAgents,\n validateSingleAgent,\n} from '@codebuff/common/templates/agent-validation'\nimport { DynamicAgentTemplate } from '@codebuff/common/types/dynamic-agent-template'\n\nexport type AgentRegistry = Record\n\n// Global database cache - only state in the system\nconst databaseAgentCache = new Map()\n\n/**\n * Parse agent ID to extract publisher, agent name, and version\n */\nfunction parseAgentId(fullAgentId: string): {\n publisherId: string\n agentId: string\n version?: string\n} | null {\n // Check if it's in the publisher/agent-id[@version] format\n const parts = fullAgentId.split('/')\n if (parts.length !== 2) {\n return null\n }\n\n const [publisherId, agentNameWithVersion] = parts\n\n // Check for version suffix\n const versionMatch = agentNameWithVersion.match(/^(.+)@(.+)$/)\n if (versionMatch) {\n const [, agentId, version] = versionMatch\n return { publisherId, agentId, version }\n }\n\n return { publisherId, agentId: agentNameWithVersion }\n}\n\n/**\n * Fetch an agent from the database by publisher/agent-id[@version] format\n */\nasync function fetchAgentFromDatabase(parsedAgentId: {\n publisherId: string\n agentId: string\n version?: string\n}): Promise {\n const { publisherId, agentId, version } = parsedAgentId\n\n try {\n let agentConfig\n\n if (version && version !== 'latest') {\n // Query for specific version\n agentConfig = await db\n .select()\n .from(schema.agentConfig)\n .where(\n and(\n eq(schema.agentConfig.id, agentId),\n eq(schema.agentConfig.publisher_id, publisherId),\n eq(schema.agentConfig.version, version),\n ),\n )\n .then((rows) => rows[0])\n } else {\n // Query for latest version\n agentConfig = await db\n .select()\n .from(schema.agentConfig)\n .where(\n and(\n eq(schema.agentConfig.id, agentId),\n eq(schema.agentConfig.publisher_id, publisherId),\n ),\n )\n .orderBy(\n desc(schema.agentConfig.major),\n desc(schema.agentConfig.minor),\n desc(schema.agentConfig.patch),\n )\n .limit(1)\n .then((rows) => rows[0])\n }\n\n if (!agentConfig) {\n logger.debug(\n { publisherId, agentId, version },\n 'fetchAgentFromDatabase: Agent not found in database',\n )\n return null\n }\n\n const rawAgentData = agentConfig.data as DynamicAgentTemplate\n\n // Validate the raw agent data with the original agentId (not full identifier)\n const validationResult = validateSingleAgent(\n { ...rawAgentData, id: agentId },\n {\n filePath: `${publisherId}/${agentId}@${agentConfig.version}`,\n skipSubagentValidation: true,\n },\n )\n\n if (!validationResult.success) {\n logger.error(\n {\n publisherId,\n agentId,\n version: agentConfig.version,\n error: validationResult.error,\n },\n 'fetchAgentFromDatabase: Agent validation failed',\n )\n return null\n }\n\n // Set the correct full agent ID for the final template\n const agentTemplate = {\n ...validationResult.agentTemplate!,\n id: `${publisherId}/${agentId}@${agentConfig.version}`,\n }\n\n logger.debug(\n {\n publisherId,\n agentId,\n version: agentConfig.version,\n fullAgentId: agentTemplate.id,\n },\n 'fetchAgentFromDatabase: Successfully loaded and validated agent from database',\n )\n\n return agentTemplate\n } catch (error) {\n logger.error(\n { publisherId, agentId, version, error },\n 'fetchAgentFromDatabase: Error fetching agent from database',\n )\n return null\n }\n}\n\n/**\n * Single function to look up an agent template with clear priority order:\n * 1. localAgentTemplates (dynamic agents + static templates)\n * 2. Database cache\n * 3. Database query\n */\nexport async function getAgentTemplate(\n agentId: string,\n localAgentTemplates: Record,\n): Promise {\n // 1. Check localAgentTemplates first (dynamic agents + static templates)\n if (localAgentTemplates[agentId]) {\n return localAgentTemplates[agentId]\n }\n // 2. Check database cache\n const cacheKey = agentId\n if (databaseAgentCache.has(cacheKey)) {\n return databaseAgentCache.get(cacheKey) || null\n }\n\n const parsed = parseAgentId(agentId)\n if (!parsed) {\n logger.debug({ agentId }, 'getAgentTemplate: Failed to parse agent ID')\n return null\n }\n\n // 3. Query database (only for publisher/agent-id format)\n const dbAgent = await fetchAgentFromDatabase(parsed)\n if (dbAgent && parsed.version && parsed.version !== 'latest') {\n // Cache only specific versions to avoid stale 'latest' results\n databaseAgentCache.set(cacheKey, dbAgent)\n }\n return dbAgent\n}\n\n/**\n * Assemble local agent templates from fileContext + static templates\n */\nexport function assembleLocalAgentTemplates(fileContext: ProjectFileContext): {\n agentTemplates: Record\n validationErrors: DynamicAgentValidationError[]\n} {\n // Load dynamic agents using the service\n const { templates: dynamicTemplates, validationErrors } = validateAgents(\n fileContext.agentTemplates || {},\n )\n\n // Combine static and dynamic templates\n const agentTemplates = { ...staticTemplates, ...dynamicTemplates }\n\n return { agentTemplates, validationErrors }\n}\n\n/**\n * Clear the database agent cache (useful for testing)\n */\nexport function clearDatabaseCache(): void {\n databaseAgentCache.clear()\n}\n", - "referencedBy": {} - }, - { - "path": "common/src/templates/agent-list.ts", - "content": "[FILE_DOES_NOT_EXIST]", - "referencedBy": {} - }, - { - "path": "common/src/constants/agents.ts", - "content": "import type { AgentTemplateTypes } from '../types/session-state'\n\n// Define agent personas with their shared characteristics\nexport const AGENT_PERSONAS = {\n // Base agents - all use Buffy persona\n base: {\n displayName: 'Buffy the Enthusiastic Coding Assistant',\n purpose: 'Base agent that orchestrates the full response.',\n } as const,\n base_lite: {\n displayName: 'Buffy the Enthusiastic Coding Assistant',\n purpose: 'Base agent that orchestrates the full response.',\n } as const,\n base_max: {\n displayName: 'Buffy the Enthusiastic Coding Assistant',\n purpose: 'Base agent that orchestrates the full response.',\n } as const,\n base_experimental: {\n displayName: 'Buffy the Enthusiastic Coding Assistant',\n purpose: 'Base agent that orchestrates the full response.',\n } as const,\n claude4_gemini_thinking: {\n displayName: 'Buffy the Enthusiastic Coding Assistant',\n purpose: 'Base agent that orchestrates the full response.',\n } as const,\n\n base_agent_builder: {\n displayName: 'Buffy the Enthusiastic Agent Builder',\n purpose:\n 'Enhanced base agent that can create custom agents and handle all coding tasks',\n } as const,\n\n superagent: {\n displayName: 'Superagent',\n purpose:\n 'Superagent that can spawn multiple code editing agents to complete a task.',\n } as const,\n\n // Ask mode\n ask: {\n displayName: 'Buffy the Enthusiastic Coding Assistant',\n purpose: 'Base ask-mode agent that orchestrates the full response.',\n } as const,\n\n // Specialized agents\n thinker: {\n displayName: 'Theo the Theorizer',\n purpose:\n 'Does deep thinking given the current messages and a specific prompt to focus on. Use this to help you solve a specific problem.',\n } as const,\n file_explorer: {\n displayName: 'Dora The File Explorer',\n purpose: 'Expert at exploring a codebase and finding relevant files.',\n } as const,\n file_picker: {\n displayName: 'Fletcher the File Fetcher',\n purpose: 'Expert at finding relevant files in a codebase.',\n } as const,\n researcher: {\n displayName: 'Reid Searcher the Researcher',\n purpose: 'Expert at researching topics using web search and documentation.',\n } as const,\n planner: {\n displayName: 'Peter Plan the Planner',\n purpose: 'Agent that formulates a comprehensive plan to a prompt.',\n hidden: true,\n } as const,\n dry_run: {\n displayName: 'Sketch the Dry Runner',\n purpose: 'Agent that takes a plan and try to implement it in a dry run.',\n hidden: true,\n } as const,\n reviewer: {\n displayName: 'Nit Pick Nick the Reviewer',\n purpose:\n 'Reviews file changes and responds with critical feedback. Use this after making any significant change to the codebase.',\n } as const,\n agent_builder: {\n displayName: 'Bob the Agent Builder',\n purpose: 'Creates new agent templates for the codebuff mult-agent system',\n hidden: false,\n } as const,\n} as const satisfies Partial<\n Record<\n keyof typeof AgentTemplateTypes,\n { displayName: string; purpose: string; hidden?: boolean }\n >\n>\n\n// Agent IDs list from AGENT_PERSONAS keys\nexport const AGENT_IDS = Object.keys(\n AGENT_PERSONAS,\n) as (keyof typeof AGENT_PERSONAS)[]\n\n// Agent ID prefix constant\nexport const AGENT_ID_PREFIX = 'CodebuffAI/'\n\n// Agent names for client-side reference\nexport const AGENT_NAMES = Object.fromEntries(\n Object.entries(AGENT_PERSONAS).map(([agentType, persona]) => [\n agentType,\n persona.displayName,\n ]),\n) as Record\n\nexport type AgentName =\n (typeof AGENT_PERSONAS)[keyof typeof AGENT_PERSONAS]['displayName']\n\n// Get unique agent names for UI display\nexport const UNIQUE_AGENT_NAMES = Array.from(\n new Set(\n Object.values(AGENT_PERSONAS)\n .filter((persona) => !('hidden' in persona) || !persona.hidden)\n .map((persona) => persona.displayName),\n ),\n)\n\n// Map from display name back to agent types (for parsing user input)\nexport const AGENT_NAME_TO_TYPES = Object.entries(AGENT_NAMES).reduce(\n (acc, [type, name]) => {\n if (!acc[name]) acc[name] = []\n acc[name].push(type)\n return acc\n },\n {} as Record,\n)\n", - "referencedBy": {} - }, - { - "path": "backend/src/system-prompt/prompts.ts", - "content": "import { STOP_MARKER } from '@codebuff/common/constants'\nimport {\n codebuffConfigFile,\n CodebuffConfigSchema,\n} from '@codebuff/common/json-config/constants'\nimport { stringifySchema } from '@codebuff/common/json-config/stringify-schema'\nimport {\n flattenTree,\n getLastReadFilePaths,\n} from '@codebuff/common/project-file-tree'\nimport { createMarkdownFileBlock } from '@codebuff/common/util/file'\nimport { truncateString } from '@codebuff/common/util/string'\nimport { closeXml } from '@codebuff/common/util/xml'\n\nimport { truncateFileTreeBasedOnTokenBudget } from './truncate-file-tree'\n\nimport type { ProjectFileContext } from '@codebuff/common/util/file'\n\nexport const configSchemaPrompt = `\n# Codebuff Configuration (${codebuffConfigFile})\n\n## Schema\n\nThe following describes the structure of the \\`./${codebuffConfigFile}\\` configuration file that users might have in their project root. You can use this to understand user settings if they mention them.\n\n${stringifySchema(CodebuffConfigSchema)}\n\n## Background Processes\n\nThe user does not have access to these outputs. Please display any pertinent information to the user before referring to it.\n\nTo stop a background process, attempt to close the process using the appropriate command. If you deem that command to be \\`kill\\`, **make sure** to kill the **ENTIRE PROCESS GROUP** (Mac/Linux) or tree (Windows).\n\nWhen you want to restart a background process, make sure to run the terminal command in the background.\n`.trim()\n\nexport const knowledgeFilesPrompt = `\n# Knowledge files\n\nKnowledge files are your guide to the project. Knowledge files (files ending in \"knowledge.md\" or \"CLAUDE.md\") within a directory capture knowledge about that portion of the codebase. They are another way to take notes in this \"Memento\"-style environment.\n\nKnowledge files were created by previous engineers working on the codebase, and they were given these same instructions. They contain key concepts or helpful tips that are not obvious from the code. e.g., let's say I want to use a package manager aside from the default. That is hard to find in the codebase and would therefore be an appropriate piece of information to add to a knowledge file.\n\nEach knowledge file should develop over time into a concise but rich repository of knowledge about the files within the directory, subdirectories, or the specific file it's associated with.\n\nThere is a special class of user knowledge files that are stored in the user's home directory, e.g. \\`~/.knowledge.md\\`. These files are available to be read, but you cannot edit them because they are outside of the project directory. Do not try to edit them.\n\nWhen should you update a knowledge file?\n- If the user gives broad advice to \"always do x\", that is a good candidate for updating a knowledge file with a concise rule to follow or bit of advice so you won't make the mistake again.\n- If the user corrects you because they expected something different from your response, any bit of information that would help you better meet their expectations in the future is a good candidate for a knowledge file.\n\nWhat to include in knowledge files:\n- The mission of the project. Goals, purpose, and a high-level overview of the project.\n- Explanations of how different parts of the codebase work or interact.\n- Examples of how to do common tasks with a short explanation.\n- Anti-examples of what should be avoided.\n- Anything the user has said to do.\n- Anything you can infer that the user wants you to do going forward.\n- Tips and tricks.\n- Style preferences for the codebase.\n- Technical goals that are in progress. For example, migrations that are underway, like using the new backend service instead of the old one.\n- Links to reference pages that are helpful. For example, the url of documentation for an api you are using.\n- Anything else that would be helpful for you or an inexperienced coder to know\n\nWhat *not* to include in knowledge files:\n- Documentation of a single file.\n- Restated code or interfaces in natural language.\n- Anything obvious from reading the codebase.\n- Lots of detail about a minor change.\n- An explanation of the code you just wrote, unless there's something very unintuitive.\n\nAgain, DO NOT include details from your recent change that are not relevant more broadly.\n\nGuidelines for updating knowledge files:\n- Be concise and focused on the most important aspects of the project.\n- Integrate new knowledge into existing sections when possible.\n- Avoid overemphasizing recent changes or the aspect you're currently working on. Your current change is less important than you think.\n- Remove as many words as possible while keeping the meaning. Use command verbs. Use sentence fragments.\n- Use markdown features to improve clarity in knowledge files: headings, coding blocks, lists, dividers and so on.\n\nOnce again: BE CONCISE!\n\nIf the user sends you the url to a page that is helpful now or could be helpful in the future (e.g. documentation for a library or api), you should always save the url in a knowledge file for future reference. Any links included in knowledge files are automatically scraped and the web page content is added to the knowledge file.\n`.trim()\n\nconst initPrompt = `\nUser has typed \"init\". Trigger initialization flow:\n\nFirst, read knowldge.md and ${codebuffConfigFile} top level directory.\n\nKnowledge file:\n- If it does not exist, create a new one with updated information.\n- If it does, do nothing.\n\nConfig file (probably already exists):\n- Do not edit the description field.\n- If it looks already populated, do nothing.\n- If it is just a template without any configurations set (empty arrays), determine whether background processes are necessary for development. If they are, populate the fields to according to the project. Additionally:\n - Do provide:\n - startupProcesses.item.stdoutFile: \"logs/{name}.log\"\n - Do not provide:\n - startupProcesses.item.stderrFile\n - startupProcesses.item.enabled\n - Provide startupProcesses.item.cwd only if it is not '.'\n\nAfter populating the config file (if necessary), simply respond to the user with:\n\n✅ Created ${codebuffConfigFile}\n\nThe CLI will automatically show additional tips and start any configured background processes after this response completes.\n`.trim()\n\nconst compactPrompt = `\nUser has typed \"compact\". Summarize the current conversation and prepare it to replace the existing message history.\n\n1. Summarize the entire conversation up to this point (excluding this 'compact' command).\n2. The summary should be detailed and must capture the key decisions, analysis, changes, and outcomes.\n`.trim()\n\nconst exportPrompt = `\nUser has typed \"export\". Export the current conversation. (It's ok to proceed even if in \"Ask\" mode because of user change to \"Export\" mode).\n\n1. Summarize the entire conversation up to this point from the message history (excluding this 'export' command) into a new file.\n2. The summary MUST be in Markdown format.\n3. The summary MUST include:\n - All key decisions made during the conversation.\n - All significant file changes. If you have access to write_file blocks from our history, reproduce their paths and content accurately. If you only have diffs or descriptions of changes, summarize those.\n - The reasoning behind those decisions and changes.\n4. Use the 'write_file' tool to save this Markdown summary to a new file with a generated name starting with the prefix 'codebuff-export-' like 'codebuff-export-topic-of-conversation.md' in the project root directory.\n\nWrite file tool format:\n\n\ncodebuff-export-file-name.md${closeXml('path')}\n\n[Insert markdown content here]\n${closeXml('content')}\n${closeXml('write_file')}\n`.trim()\n\nexport const additionalSystemPrompts = {\n '/init': initPrompt,\n init: initPrompt,\n '/export': exportPrompt,\n export: exportPrompt,\n '/compact': compactPrompt,\n compact: compactPrompt,\n} as const\n\nexport const getProjectFileTreePrompt = (\n fileContext: ProjectFileContext,\n fileTreeTokenBudget: number,\n mode: 'search' | 'agent',\n) => {\n const { projectRoot } = fileContext\n const { printedTree, truncationLevel } = truncateFileTreeBasedOnTokenBudget(\n fileContext,\n Math.max(0, fileTreeTokenBudget),\n )\n\n const truncationNote =\n truncationLevel === 'none'\n ? ''\n : truncationLevel === 'unimportant-files'\n ? '\\nNote: Unimportant files (like build artifacts and cache files) have been removed from the file tree.'\n : truncationLevel === 'tokens'\n ? '\\nNote: Selected function, class, and variable names in source files have been removed from the file tree to fit within token limits.'\n : '\\nNote: The file tree has been truncated to show a subset of files to fit within token limits.'\n\n return `\n# Project file tree\n\nAs Buffy, you have access to all the files in the project.\n\nThe following is the path to the project on the user's computer. It is also the current working directory for terminal commands:\n\n${projectRoot}\n${closeXml('project_path')}\n\nWithin this project directory, here is the file tree.\nNote that the file tree:\n- Is cached from the start of this conversation. Files created after the start of this conversation will not appear.\n- Excludes files that are .gitignored.\n${\n mode === 'agent'\n ? `\\nThe project file tree below can be ignored unless you need to know what files are in the project.\\n`\n : ''\n}\n\n${printedTree}\n${closeXml('project_file_tree')}\n${truncationNote}\n`.trim()\n}\n\nconst windowsNote = `\nNote: many commands in the terminal are different on Windows.\nFor example, the mkdir command is \\`mkdir\\` instead of \\`mkdir -p\\`. Instead of grep, use \\`findstr\\`. Instead of \\`ls\\` use \\`dir\\` to list files. Instead of \\`mv\\` use \\`move\\`. Instead of \\`rm\\` use \\`del\\`. Instead of \\`cp\\` use \\`copy\\`. Unless the user is in Powershell, in which case you should use the Powershell commands instead.\n`.trim()\n\nexport const getSystemInfoPrompt = (fileContext: ProjectFileContext) => {\n const { fileTree, shellConfigFiles, systemInfo } = fileContext\n const flattenedNodes = flattenTree(fileTree)\n const lastReadFilePaths = getLastReadFilePaths(flattenedNodes, 20)\n\n return `\n# System Info\n\nOperating System: ${systemInfo.platform}\n${systemInfo.platform === 'win32' ? windowsNote + '\\n' : ''}\nShell: ${systemInfo.shell}\n\n\n${Object.entries(shellConfigFiles)\n .map(([path, content]) => createMarkdownFileBlock(path, content))\n .join('\\n')}\n${closeXml('user_shell_config_files')}\n\nThe following are the most recently read files according to the OS atime. This is cached from the start of this conversation:\n\n${lastReadFilePaths.join('\\n')}\n${closeXml('recently_read_file_paths_most_recent_first')}\n`.trim()\n}\n\nexport const getGitChangesPrompt = (fileContext: ProjectFileContext) => {\n const { gitChanges } = fileContext\n if (!gitChanges) {\n return ''\n }\n const maxLength = 30_000\n return `\nCurrent Git Changes:\n\n${truncateString(gitChanges.status, maxLength / 10)}\n${closeXml('git_status')}\n\n\n${truncateString(gitChanges.diff, maxLength)}\n${closeXml('git_diff')}\n\n\n${truncateString(gitChanges.diffCached, maxLength)}\n${closeXml('git_diff_cached')}\n\n\n${truncateString(gitChanges.lastCommitMessages, maxLength / 10)}\n${closeXml('git_commit_messages_most_recent_first')}\n`.trim()\n}\n\nexport const gitCommitGuidePrompt = `\n### Using git to commit changes\n\nWhen the user requests a new git commit, please follow these steps closely:\n\n1. **Run two run_terminal_command tool calls:**\n - Run \\`git diff\\` to review both staged and unstaged modifications.\n - Run \\`git log\\` to check recent commit messages, ensuring consistency with this repository's style.\n\n2. **Select relevant files to include in the commit:**\n Use the git context established at the start of this conversation to decide which files are pertinent to the changes. Stage any new untracked files that are relevant, but avoid committing previously modified files (from the beginning of the conversation) unless they directly relate to this commit.\n\n3. **Analyze the staged changes and compose a commit message:**\n Enclose your analysis in tags. Within these tags, you should:\n - Note which files have been altered or added.\n - Categorize the nature of the changes (e.g., new feature, fix, refactor, documentation, etc.).\n - Consider the purpose or motivation behind the alterations.\n - Refrain from using tools to inspect code beyond what is presented in the git context.\n - Evaluate the overall impact on the project.\n - Check for sensitive details that should not be committed.\n - Draft a concise, one- to two-sentence commit message focusing on the “why” rather than the “what.”\n - Use precise, straightforward language that accurately represents the changes.\n - Ensure the message provides clarity—avoid generic or vague terms like “Update” or “Fix” without context.\n - Revisit your draft to confirm it truly reflects the changes and their intention.\n\n4. **Create the commit, ending with this specific footer:**\n \\`\\`\\`\n Generated with Codebuff 🤖\n Co-Authored-By: Codebuff \n \\`\\`\\`\n To maintain proper formatting, always place the commit message in a HEREDOC. For instance:\n \\`\\`\\`\n git commit -m \"$(cat <<'EOF'\n Your commit message here.\n\n 🤖 Generated with Codebuff\n Co-Authored-By: Codebuff \n EOF\n )\"\n \\`\\`\\`\n (Make sure to end each line with ^ on Windows:)\n \\`\\`\\`\n git commit -m \"Your commit message here.^\n ^\n 🤖 Generated with Codebuff^\n Co-Authored-By: Codebuff \"\n \\`\\`\\`\n\n**Important details**\n\n- When feasible, use a single \\`git commit -am\\` command to add and commit together, but do not accidentally stage unrelated files.\n- Never alter the git config.\n- Do not push to the remote repository.\n- Avoid using interactive flags (e.g., \\`-i\\`) that require unsupported interactive input.\n- Do not create an empty commit if there are no changes.\n- Make sure your commit message is concise yet descriptive, focusing on the intention behind the changes rather than merely describing them.\n`\n\n// NOTE: Deprecated prompts below.\n\nconst introPrompt = `\nYou are Buffy, an expert programmer assistant with extensive knowledge across backend and frontend technologies. You are a strong technical writer that communicates with clarity. You are concise. You produce opinions and code that are as simple as possible while accomplishing their purpose.\n\nAs Buffy, you are friendly, professional, and always eager to help users improve their code and understanding of programming concepts.\n\nYou are assisting the user with one particular coding project to which you have full access. You can see the file tree of all the files in the project. You can edit files. You can request to read any set of files to see their full content. You can run terminal commands on the user's computer within the project directory to compile code, run tests, install packages, and search for relevant code. You will be called on again and again for advice and for direct code changes and other changes to files in this project.\n\nIf you are unsure about the answer to a user's question, you should say \"I don't have enough information to confidently answer your question.\" If the scope of the change the user is requesting is too large to implement all at once (e.g. requires greater than 750 lines of code), you can tell the user the scope is too big and ask which sub-problem to focus on first.\n`.trim()\n\nconst toolsPrompt = `\n# Tools\n\nYou have access to the following tools:\n- [DESCRIPTION_OF_FILES]${closeXml('tool_call')}: Find files given a brief natural language description of the files or the name of a function or class you are looking for.\n- [LIST_OF_FILE_PATHS]${closeXml('tool_call')}: Provide a list of file paths to read, separated by newlines. The file paths must be relative to the project root directory. Prefer using this tool over find_files when you know the exact file(s) you want to read.\n- [PATTERN]${closeXml('tool_call')}: Search for the given pattern in the project directory. Use this tool to search for code in the project, like function names, class names, variable names, types, where a function is called from, where it is defined, etc.\n- ${closeXml('tool_call')}: Think through a complex change to the codebase, like implementing a new feature or refactoring some code. Don't pass any arguments to this tool. Use this tool to think on a user request that requires planning. Only use this if the user asks you to plan.\n- [YOUR COMMAND HERE]${closeXml('tool_call')}')}: Execute a command in the terminal and return the result.\n- [URL HERE]${closeXml('tool_call')}')}: Scrape the web page at the given url and return the content.\n- [BROWSER_ACTION_XML_HERE]${closeXml('tool_call')}')}: Navigate to a url, take screenshots, and view console.log output or errors for a web page. Use this tool to debug a web app or improve its visual style.\n\nImportant notes:\n- Immediately after you finish writing the closing tag of a tool call, you should write ${STOP_MARKER}, and end your response. Do not write out any other text. A tool call is a delgation -- do not write any other analysis or commentary.\n- Do not write out a tool call within another tool call block.\n- Do not write out a nested tool call within an block. If you want to read a file before editing it, write the first. Similarly, do not write a tool call to run a terminal command within an block.\n- You can freely explain what tools you have available, but do not write out \" unless you are actually intending to call the tool, otherwise you will accidentally be calling the tool when explaining it.\n\n## Finding files\n\nUse the ...${closeXml('tool_call')}')} tool to read more files beyond what is provided in the initial set of files.\n\nPurpose: Better fulfill the user request by reading files which could contain information relevant to the user's request.\n\nUse cases:\n- If you are calling a function or creating a class and want to know how it works, go get the implementation with a tool call to find_files. E.g. \"The implementation of function foo${closeXml('tool_call')}\".\n- If you want to modify a file, but don't currently have it in context. Be sure to call find_files before writing out an block, or I will be very upset.\n- If you need to understand a section of the codebase, read more files in that directory or subdirectories.\n- Some requests require a broad understanding of multiple parts of the codebase. Consider using find_files to gain more context before making changes.\n\nHowever, use this tool sparingly. DO NOT USE \"find_files\" WHEN:\n- You are creating a new file\n- You want to edit a file that you already have in context. Double check that the file is not listed in the block already before calling find_files.\n- You already called it recently. Multiple calls in a row are not productive.\n- You are inside an block.\n\n## Reading files\n\nUse the ...${closeXml('tool_call')}')} tool to read files you don't already have in context.\n\nFeel free to use this tool as much as needed to read files that would be relevant to the user's request.\n\nHowever, do not use this tool to read files that you already have in context. Do not repeat reading calls that you have already read.\n\nMake sure the file paths are relative to the project root directory, not absolute paths like \"C:\\\\Users\\\\my-project\\\\example.ts\". Also ensure that the path includes all intermediate directories to the file.\n\n## Code search\n\nUse the ...${closeXml('tool_call')}')} tool to search for string patterns in the project's files. This tool uses ripgrep (rg), a fast line-oriented search tool.\n\nPurpose: Search through code files to find files with specific text patterns, function names, variable names, and more.\n\nExamples:\nfoo${closeXml('tool_call')}')}\nimport.*foo${closeXml('tool_call')}')}\n\nNote: quotes will be automatically added around your code search pattern. You might need to escape special characters like '-' or '.' or '\\' if you want to search for them.\n\nUse cases:\n1. Finding all references to a function, class, or variable name across the codebase\n2. Searching for specific code patterns or implementations\n3. Looking up where certain strings or text appear\n4. Finding files that contain specific imports or dependencies\n5. Locating configuration settings or environment variables\n\nThe pattern supports regular expressions and will search recursively through all files in the project by default. Some tips:\n- Be as constraining in the pattern as possible to limit the number of files returned, e.g. if searching for the definition of a function, use \"(function foo|const foo)\" or \"def foo\" instead of merely \"foo\".\n- Use word boundaries (\\b) to match whole words only\n- Searches file content and filenames\n- Automatically ignores binary files, hidden files, and files in .gitignore\n- Case-sensitive by default. Use -i to make it case insensitive.\n- Constrain the search to specific file types using -t , e.g. -t ts or -t py.\n\nDo not use code_search when:\n- You already know the exact file location\n- You want to load the contents of files (use find_files instead)\n- You're inside an block\n\n## Think deeply\n\nWhen the user asks you to create a plan, use the think_deeply tool. This tool leverages deep reasoning capabilities to break down difficult problems into clear implementation steps.\n\nDo not use this tool more than once in a conversation.\n\nUse cases:\n1. Planning new features\n2. Planning refactoring operations\n3. Making architectural decisions\n4. Breaking down difficult problems into steps\n5. When you seem to be stuck and need to get unstuck\n\nBest practices:\n- Use for complex changes that need careful planning\n- Don't use for simple changes or quick decisions\n\nIt's a good idea to ask the user to suggest modifications to the plan, which you can make, or if they want to proceed with the current plan.\n\n## Running terminal commands\n\nYou can write out [YOUR COMMAND HERE]${closeXml('tool_call')}')} to execute shell commands in the user's terminal.\n\nPurpose: Better fulfill the user request by running terminal commands in the user's terminal and reading the standard output.\n\nWarning: Use this tool sparingly. You should only use it when you are sure it is the best way to accomplish the user's request. Do not run more commands than the user has asked for. Especially be careful with commands that could have permanent effects.\n\nIf you just want to show the user a terminal command without immediately running it, you can write out a markdown \\`\\`\\` command block instead:\n\\`\\`\\`bash\n# ... command to show the user ...\n\\`\\`\\`\n\nStick to these use cases:\n1. Compiling the project or running build (e.g., \"npm run build\"). Reading the output can help you edit code to fix build errors. If possible, use an option that performs checks but doesn't emit files, e.g. \\`tsc --noEmit\\`.\n2. Running tests (e.g., \"npm test\"). Reading the output can help you edit code to fix failing tests. Or, you could write new unit tests and then run them.\n3. Moving, renaming, or deleting files and directories. These actions can be vital for refactoring requests. Use commands like \\`mv\\`/\\`move\\` or \\`rm\\`/\\`del\\`.\n\nMost likely, you should ask for permission for any other type of command you want to run. If asking for permission, show the user the command you want to run using \\`\\`\\` tags.\n\nWhen using this tool, please adhere to the following rules:\n\n1. Do not run commands that can modify files outside of the project directory, install packages globally, install virtual environments, or have significant side effects outside of the project directory, unless you have explicit permission from the user. Treat anything outside of the project directory as read-only.\n2. Do not run \\`git push\\` because it can break production (!) if the user was not expecting it. Don't run \\`git commit\\`, \\`git rebase\\`, or related commands unless you get explicit permission. If a user asks to commit changes, you can do so, but you should not invoke any further git commands beyond the git commit command.\n3. Do not run scripts without asking. Especially don't run scripts that could run against the production environment or have permanent effects without explicit permission from the user. Don't run scripts with side effects without permission from the user unless they don't have much effect or are simple.\n4. Be careful with any command that has big or irreversible effects. Anything that touches a production environment, servers, the database, or other systems that could be affected by a command should be run with explicit permission from the user.\n4. Don't run too many commands in a row without pausing to check in with what the user wants to do next.\n5. Don't run long-running commands, e.g. \\`npm run dev\\` or \\`npm start\\`, that start a server and do not exit. Only run commands that will complete within 30 seconds, because longer commands will be killed. Instead, ask the user to manually run long-running commands.\n6. Do not use the run_terminal_command tool to create or edit files. Do not use \\`cat\\` or \\`echo\\` to create or edit files. You should instead write out blocks for for editing or creating files as detailed above in the block.\n7. Do not install packages without asking, unless it is within a small, new-ish project. Users working on a larger project will want to manage packages themselves, so ask first.\n8. Do not use the wrong package manager for the project. For example, if the project uses \\`pnpm\\` or \\`bun\\` or \\`yarn\\`, you should not use \\`npm\\`. Similarly not everyone uses \\`pip\\` for python, etc.\n\nNotes:\n- The current working directory will always reset to project root directory for each command you run. You can only access files within this directory (or sub-directories).\n- Commands can succeed without giving any output, e.g. if no type errors were found. So you may not always see output for successful executions.\n\n## Web scraping\n\nScrape any url that could help address the user's request.\n\nYou will receive the content transformed into a simplified markdown file that contains the main content of the page.\n\nUse this tool to:\n- Read the content of documentation pages\n- Read the content of other web pages that are helpful to the user's request\n\n## Browser Action\n\nLoad and view web pages to test functionality, diagnose issues, or improve visual design of a user's web app.\n\nPurpose: Use this tool to navigate to a web page, take screenshots, and check the output of console.log or errors.\n\nIMPORTANT: Assume the user's development server is ALREADY running and active, unless you see logs indicating otherwise. Never start the user's development server for them. Instead, give them instructions to spin it up themselves in a new terminal.\nNever offer to interact with the website aside from reading them (see available actions below). The user will manipulate the website themselves and bring you to the UI they want you to interact with.\n\n### Critical Limitations\n- IMPORTANT: NO clicking on any elements, don't even try.\n- NO form submissions\n- NO button interactions\n- NO drag and drop\n- NO hover actions\n\n### Available Actions (Read Only):\n\n1. Navigate:\n - Load a new URL in the current browser window and get the logs after page load.\n - Required: , navigate${closeXml('type')}')}\n - Optional: ('load', 'domcontentloaded', 'networkidle0')\n - example: navigate${closeXml('type')}')}localhost:3000${closeXml('url')}')}domcontentloaded${closeXml('waitUntil')}')}${closeXml('tool_call')}')}\n\n2. Scroll:\n - Scroll the page up or down by one viewport height\n - Required: ('up', 'down'), scroll${closeXml('type')}')}\n - example: scroll${closeXml('type')}')}down${closeXml('direction')}')}${closeXml('tool_call')}')}\n\n3. Screenshot:\n - Capture the current page state\n - Required: screenshot${closeXml('type')}')}\n - Optional: , , , , , \n - example: screenshot${closeXml('type')}')}80${closeXml('quality')}')}${closeXml('tool_call')}')}\n\nIMPORTANT: make absolutely totally sure that you're using the XML tags as shown in the examples. Don't use JSON or any other formatting, only XML tags.\n\n### Response Analysis\n\nAfter each action, you'll receive:\n1. Success/failure status\n2. New console logs since last action\n3. Network requests and responses\n4. JavaScript errors with stack traces\n6. Screenshot of the website\n\nUse this data to:\n- Verify expected behavior\n- Debug issues\n- Guide next actions\n- Make informed decisions about fixes\n- Improve visual design\n\n### Best Practices\n\n**Workflow**\n- Navigate to the user's website, probably on localhost, but you can compare with the production site if you want.\n- Scroll to the relevant section\n- Take screenshots and analyze confirm changes\n- Check network requests for anomalies\n\n**Debugging Flow**\n- Start with minimal reproduction steps\n- Collect data at each step\n- Analyze results before next action\n- Take screenshots to track your changes after each UI change you make\n`.trim()\n", - "referencedBy": {} - }, - { - "path": "backend/src/main-prompt.ts", - "content": "import { renderToolResults } from '@codebuff/common/tools/utils'\nimport { AgentTemplateTypes } from '@codebuff/common/types/session-state'\nimport { uniq } from 'lodash'\n\nimport { checkTerminalCommand } from './check-terminal-command'\nimport { loopAgentSteps } from './run-agent-step'\nimport { getAgentTemplate } from './templates/agent-registry'\nimport { logger } from './util/logger'\nimport { expireMessages } from './util/messages'\nimport { requestToolCall } from './websockets/websocket-action'\n\nimport type { AgentTemplate } from './templates/types'\nimport type { ClientToolCall } from './tools/constants'\nimport type { ClientAction } from '@codebuff/common/actions'\nimport type { CostMode } from '@codebuff/common/constants'\nimport type { PrintModeEvent } from '@codebuff/common/types/print-mode'\nimport type {\n SessionState,\n ToolResult,\n AgentTemplateType,\n} from '@codebuff/common/types/session-state'\nimport type { WebSocket } from 'ws'\n\nexport interface MainPromptOptions {\n userId: string | undefined\n clientSessionId: string\n onResponseChunk: (chunk: string | PrintModeEvent) => void\n localAgentTemplates: Record\n}\n\nexport const mainPrompt = async (\n ws: WebSocket,\n action: ClientAction<'prompt'>,\n options: MainPromptOptions,\n): Promise<{\n sessionState: SessionState\n toolCalls: Array\n toolResults: Array\n}> => {\n const { userId, clientSessionId, onResponseChunk, localAgentTemplates } =\n options\n\n const {\n prompt,\n sessionState: sessionState,\n fingerprintId,\n costMode,\n promptId,\n agentId,\n promptParams,\n } = action\n const { fileContext, mainAgentState } = sessionState\n\n if (prompt) {\n // Check if this is a direct terminal command\n const startTime = Date.now()\n const terminalCommand = await checkTerminalCommand(prompt, {\n clientSessionId,\n fingerprintId,\n userInputId: promptId,\n userId,\n })\n const duration = Date.now() - startTime\n\n if (terminalCommand) {\n logger.debug(\n {\n duration,\n prompt,\n },\n `Detected terminal command in ${duration}ms, executing directly: ${prompt}`,\n )\n\n const response = await requestToolCall(\n ws,\n promptId,\n 'run_terminal_command',\n {\n command: terminalCommand,\n mode: 'user',\n process_type: 'SYNC',\n timeout_seconds: -1,\n },\n )\n\n const toolResult = response.success ? response.result : response.error\n if (response.success) {\n mainAgentState.messageHistory.push({\n role: 'user',\n content: renderToolResults([toolResult]),\n })\n }\n\n const newSessionState = {\n ...sessionState,\n messageHistory: expireMessages(\n mainAgentState.messageHistory,\n 'userPrompt',\n ),\n }\n\n return {\n sessionState: newSessionState,\n toolCalls: [],\n toolResults: [],\n }\n }\n }\n\n const availableAgents = Object.keys(localAgentTemplates)\n\n // Determine agent type - prioritize CLI agent selection, then config base agent, then cost mode\n let agentType: AgentTemplateType\n\n if (agentId) {\n if (!(await getAgentTemplate(agentId, localAgentTemplates))) {\n throw new Error(\n `Invalid agent ID: \"${agentId}\". Available agents: ${availableAgents.join(', ')}`,\n )\n }\n\n agentType = agentId\n logger.info(\n {\n agentId,\n promptParams,\n prompt: prompt?.slice(0, 50),\n },\n `Using CLI-specified agent: ${agentId}`,\n )\n } else {\n // Check for base agent in config\n const configBaseAgent = fileContext.codebuffConfig?.baseAgent\n if (configBaseAgent) {\n if (!(await getAgentTemplate(configBaseAgent, localAgentTemplates))) {\n throw new Error(\n `Invalid base agent in config: \"${configBaseAgent}\". Available agents: ${availableAgents.join(', ')}`,\n )\n }\n agentType = configBaseAgent\n logger.info(\n {\n configBaseAgent,\n promptParams,\n prompt: prompt?.slice(0, 50),\n },\n `Using config-specified base agent: ${configBaseAgent}`,\n )\n } else {\n // Fall back to cost mode mapping\n agentType = (\n {\n ask: AgentTemplateTypes.ask,\n lite: AgentTemplateTypes.base_lite,\n normal: AgentTemplateTypes.base,\n max: AgentTemplateTypes.base_max,\n experimental: AgentTemplateTypes.base_experimental,\n } satisfies Record\n )[costMode]\n }\n }\n\n mainAgentState.agentType = agentType\n\n let mainAgentTemplate = await getAgentTemplate(agentType, localAgentTemplates)\n if (!mainAgentTemplate) {\n throw new Error(`Agent template not found for type: ${agentType}`)\n }\n\n let updatedSubagents = mainAgentTemplate.spawnableAgents\n if (!agentId) {\n // If --agent is not specified, use the spawnableAgents from the codebuff config or add all local agents\n updatedSubagents =\n fileContext.codebuffConfig?.spawnableAgents ??\n uniq([...mainAgentTemplate.spawnableAgents, ...availableAgents])\n }\n mainAgentTemplate.spawnableAgents = updatedSubagents\n localAgentTemplates[agentType] = mainAgentTemplate\n\n const { agentState } = await loopAgentSteps(ws, {\n userInputId: promptId,\n prompt,\n params: promptParams,\n agentType,\n agentState: mainAgentState,\n fingerprintId,\n fileContext,\n toolResults: [],\n userId,\n clientSessionId,\n onResponseChunk,\n localAgentTemplates,\n })\n\n return {\n sessionState: {\n fileContext,\n mainAgentState: agentState,\n },\n toolCalls: [],\n toolResults: [],\n }\n}\n", - "referencedBy": {} - }, - { - "path": "npm-app/src/agents/load-agents.ts", - "content": "import * as fs from 'fs'\nimport * as path from 'path'\n\nimport { cyan, green } from 'picocolors'\n\nimport { getAllTsFiles, getAgentsDirectory } from './agent-utils'\n\nimport type { CodebuffConfig } from '@codebuff/common/json-config/constants'\n\nexport let loadedAgents: Record = {}\nexport async function loadLocalAgents({\n verbose = false,\n}: {\n verbose?: boolean\n}): Promise {\n loadedAgents = {}\n\n const agentsDir = getAgentsDirectory()\n\n if (!fs.existsSync(agentsDir)) {\n return loadedAgents\n }\n\n try {\n const tsFiles = getAllTsFiles(agentsDir)\n\n for (const fullPath of tsFiles) {\n const relativePath = path.relative(agentsDir, fullPath)\n const fileName = relativePath.replace(/\\.ts$/, '').replace(/[/\\\\]/g, '-')\n\n let agentDefinition: any\n let agentModule: any\n try {\n agentModule = await require(fullPath)\n } catch (error: any) {\n if (verbose) {\n console.error('Error importing agent:', error)\n }\n continue\n }\n delete require.cache[fullPath]\n\n try {\n agentDefinition = agentModule.default\n } catch (error: any) {\n console.error('Error loading agent from file:', fullPath, error)\n continue\n }\n\n if (!agentDefinition) continue\n\n // Convert handleSteps function to string if present\n let processedAgentDefinition = { ...agentDefinition }\n\n if (agentDefinition.handleSteps) {\n processedAgentDefinition.handleSteps =\n agentDefinition.handleSteps.toString()\n }\n\n loadedAgents[fileName] = processedAgentDefinition\n }\n } catch (error) {}\n return loadedAgents\n}\n\nexport function getLoadedAgentNames(): Record {\n return Object.fromEntries(\n Object.entries(loadedAgents).map(([agentType, agentConfig]) => {\n return [agentType, agentConfig.displayName]\n }),\n )\n}\n\n/**\n * Display loaded agents to the user\n */\nexport function displayLoadedAgents(codebuffConfig: CodebuffConfig) {\n const baseAgent = codebuffConfig.baseAgent\n if (baseAgent) {\n console.log(`\\n${green('Configured base agent:')} ${cyan(baseAgent)}`)\n }\n\n const spawnableAgents = codebuffConfig.spawnableAgents\n if (spawnableAgents) {\n console.log(\n `${green('Configured spawnable agents:')} ${spawnableAgents\n .map((name) => cyan(name))\n .join(', ')}\\n`,\n )\n } else if (Object.keys(loadedAgents).length > 0) {\n const loadedAgentNames = Object.values(getLoadedAgentNames())\n console.log(\n `\\n${green('Found custom agents:')} ${loadedAgentNames\n .map((name) => cyan(name))\n .join(', ')}\\n`,\n )\n } else if (baseAgent) {\n // One more new line.\n console.log()\n }\n}\n", - "referencedBy": {} - }, - { - "path": "npm-app/src/cli-handlers/agents.ts", - "content": "import * as fs from 'fs'\nimport * as path from 'path'\n\nimport { AGENT_TEMPLATES_DIR } from '@codebuff/common/constants'\nimport { AgentTemplateTypes } from '@codebuff/common/types/session-state'\nimport {\n filterCustomAgentFiles,\n extractAgentIdFromFileName,\n} from '@codebuff/common/util/agent-file-utils'\nimport { green, yellow, cyan, magenta, bold, gray, red } from 'picocolors'\n\nimport { loadLocalAgents, getLoadedAgentNames } from '../agents/load-agents'\nimport { CLI } from '../cli'\nimport { getProjectRoot } from '../project-files'\nimport { Spinner } from '../utils/spinner'\nimport {\n ENTER_ALT_BUFFER,\n EXIT_ALT_BUFFER,\n CLEAR_SCREEN,\n HIDE_CURSOR,\n SHOW_CURSOR,\n} from '../utils/terminal'\n\nlet isInAgentsBuffer = false\nlet originalKeyHandlers: ((str: string, key: any) => void)[] = []\nlet selectedIndex = 0\nlet scrollOffset = 0\nlet allContentLines: string[] = []\nlet agentLinePositions: number[] = []\nlet agentList: Array<{\n id: string\n name: string\n description?: string\n isBuiltIn: boolean\n filePath?: string\n isCreateNew?: boolean\n isEditAgent?: boolean\n isSeparator?: boolean\n isPlaceholder?: boolean\n isSectionHeader?: boolean\n}> = []\n\nexport function isInAgentsMode(): boolean {\n return isInAgentsBuffer\n}\n\nexport async function enterAgentsBuffer(rl: any, onExit: () => void) {\n if (isInAgentsBuffer) {\n console.log(yellow('Already in agents mode!'))\n return\n }\n\n // Load local agents\n await loadLocalAgents({ verbose: false })\n const localAgents = getLoadedAgentNames()\n\n // Build management actions section with header\n const actions: typeof agentList = [\n {\n id: '__header__',\n name: bold(cyan('Actions')),\n description: '',\n isBuiltIn: false,\n isSectionHeader: true,\n },\n {\n id: '__create_new__',\n name: '+ Create New Agent',\n description: 'Create a new custom agent template',\n isBuiltIn: false,\n isCreateNew: true,\n },\n ]\n\n // Get custom agent files for display purposes\n const agentsDir = path.join(getProjectRoot(), AGENT_TEMPLATES_DIR)\n let customAgentFiles: string[] = []\n if (fs.existsSync(agentsDir)) {\n const files = fs.readdirSync(agentsDir)\n customAgentFiles = filterCustomAgentFiles(files)\n }\n\n // Add agents section header\n actions.push({\n id: '__agents_header__',\n name:\n bold(cyan('Custom Agents')) +\n gray(` • ${customAgentFiles.length} in ${AGENT_TEMPLATES_DIR}`),\n description: '',\n isBuiltIn: false,\n isSectionHeader: true,\n })\n\n // Build agent list starting with management actions\n agentList = [...actions]\n\n // Add custom agents from .agents/templates\n if (customAgentFiles.length > 0) {\n for (const file of customAgentFiles) {\n const agentId = extractAgentIdFromFileName(file)\n const agentName = localAgents[agentId] || agentId\n agentList.push({\n id: agentId,\n name: agentName,\n description: 'Custom user-defined agent',\n isBuiltIn: false,\n filePath: path.join(agentsDir, file),\n })\n }\n } else {\n // If no custom agents, add a helpful message\n agentList.push({\n id: '__no_agents__',\n name: gray('No custom agents found'),\n description: 'Use \"Create New Agent\" above to get started',\n isBuiltIn: false,\n isPlaceholder: true,\n })\n }\n\n // No need for special handling here since we now have a proper placeholder\n\n // Initialize selection to first selectable item\n selectedIndex = 0\n // Find first selectable item (skip section headers, separators, placeholders)\n while (\n selectedIndex < agentList.length &&\n (agentList[selectedIndex]?.isSectionHeader ||\n agentList[selectedIndex]?.isSeparator ||\n agentList[selectedIndex]?.isPlaceholder)\n ) {\n selectedIndex++\n }\n // If no selectable items found, default to 0\n if (selectedIndex >= agentList.length) {\n selectedIndex = 0\n }\n scrollOffset = 0\n\n // Enter alternate screen buffer\n process.stdout.write(ENTER_ALT_BUFFER)\n process.stdout.write(CLEAR_SCREEN)\n process.stdout.write(HIDE_CURSOR)\n\n isInAgentsBuffer = true\n\n // Build content and render\n buildAllContentLines()\n centerSelectedItem()\n renderAgentsList()\n\n // Set up key handler\n setupAgentsKeyHandler(rl, onExit)\n}\n\nexport function exitAgentsBuffer(rl: any) {\n if (!isInAgentsBuffer) {\n return\n }\n\n // Reset state\n selectedIndex = 0\n scrollOffset = 0\n allContentLines = []\n agentLinePositions = []\n agentList = []\n\n // Restore all original key handlers\n if (originalKeyHandlers.length > 0) {\n process.stdin.removeAllListeners('keypress')\n originalKeyHandlers.forEach((handler) => {\n process.stdin.on('keypress', handler)\n })\n originalKeyHandlers = []\n }\n\n // Exit alternate screen buffer\n process.stdout.write(SHOW_CURSOR)\n process.stdout.write(EXIT_ALT_BUFFER)\n\n isInAgentsBuffer = false\n}\n\nfunction centerSelectedItem() {\n if (selectedIndex < 0 || selectedIndex >= agentLinePositions.length) {\n return\n }\n\n const terminalHeight = process.stdout.rows || 24\n const terminalWidth = process.stdout.columns || 80\n const headerHeight = getHeaderLines(terminalWidth).length\n const maxScrollableLines = terminalHeight - headerHeight - 2\n const selectedLineIndex = agentLinePositions[selectedIndex]\n const maxScrollOffset = Math.max(\n 0,\n allContentLines.length - maxScrollableLines,\n )\n\n // Center item in the scrollable viewport\n const centerOffset = selectedLineIndex - Math.floor(maxScrollableLines / 2)\n scrollOffset = Math.max(0, Math.min(maxScrollOffset, centerOffset))\n}\n\nconst getHeaderLines = (terminalWidth: number) => [\n // No header - sections will be labeled inline\n]\n\nfunction buildAllContentLines() {\n const terminalWidth = process.stdout.columns || 80\n const lines: string[] = []\n agentLinePositions = []\n\n if (agentList.length === 0) {\n lines.push(yellow('No agents found.'))\n } else {\n for (let i = 0; i < agentList.length; i++) {\n agentLinePositions.push(lines.length)\n const agent = agentList[i]\n const isSelected = i === selectedIndex\n\n // Handle section headers\n if (agent.isSectionHeader) {\n const cleanName = agent.name.replace(/\\u001b\\[[0-9;]*m/g, '')\n const cleanDescription = agent.description\n ? agent.description.replace(/\\u001b\\[[0-9;]*m/g, '')\n : ''\n const availableWidth = terminalWidth - 4 // Account for padding\n\n if (isSelected) {\n const headerWidth = Math.min(terminalWidth - 6, 60)\n lines.push(` ${cyan('┌' + '─'.repeat(headerWidth + 2) + '┐')}`)\n\n // Right-aligned title with separator line\n const titlePadding = Math.max(0, headerWidth - cleanName.length - 4)\n const separatorLine = '─'.repeat(titlePadding)\n lines.push(\n ` ${cyan('│')} ${gray(separatorLine)} ${agent.name} ${cyan('│')}`,\n )\n\n if (agent.description) {\n const descPadding = Math.max(\n 0,\n headerWidth - cleanDescription.length,\n )\n lines.push(\n ` ${cyan('│')} ${agent.description}${' '.repeat(descPadding)} ${cyan('│')}`,\n )\n }\n lines.push(` ${cyan('└' + '─'.repeat(headerWidth + 2) + '┘')}`)\n } else {\n // Right-aligned title with separator line for unselected\n const titlePadding = Math.max(\n 0,\n availableWidth - cleanName.length - 4,\n )\n const separatorLine = gray('─'.repeat(titlePadding))\n lines.push(` ${separatorLine} ${agent.name}`)\n\n if (agent.description) {\n lines.push(` ${agent.description}`)\n }\n }\n if (i < agentList.length - 1) {\n lines.push('') // Empty line after section header\n }\n continue\n }\n\n // Handle separator (keep for backwards compatibility)\n if (agent.isSeparator) {\n if (isSelected) {\n lines.push(` ${cyan('┌' + '─'.repeat(52) + '┐')}`)\n lines.push(` ${cyan('│')} ${gray(agent.name)} ${cyan('│')}`)\n lines.push(` ${cyan('└' + '─'.repeat(52) + '┘')}`)\n } else {\n lines.push(` ${gray(agent.name)}`)\n }\n if (i < agentList.length - 1) {\n lines.push('') // Empty line after separator\n }\n continue\n }\n\n // Handle placeholder\n if (agent.isPlaceholder) {\n if (isSelected) {\n const boxWidth = Math.min(terminalWidth - 6, 50)\n lines.push(` ${cyan('┌' + '─'.repeat(boxWidth + 2) + '┐')}`)\n lines.push(\n ` ${cyan('│')} ${agent.name} ${' '.repeat(Math.max(0, boxWidth - agent.name.replace(/\\u001b\\[[0-9;]*m/g, '').length))} ${cyan('│')}`,\n )\n lines.push(\n ` ${cyan('│')} ${gray(agent.description || '')} ${' '.repeat(Math.max(0, boxWidth - (agent.description || '').length))} ${cyan('│')}`,\n )\n lines.push(` ${cyan('└' + '─'.repeat(boxWidth + 2) + '┘')}`)\n } else {\n lines.push(` ${agent.name}`)\n lines.push(` ${gray(agent.description || '')}`)\n }\n if (i < agentList.length - 1) {\n lines.push('') // Empty line between items\n }\n continue\n }\n\n // Regular agent items\n const agentInfo =\n agent.isCreateNew || agent.isEditAgent\n ? `${agent.isCreateNew ? green(agent.name) : magenta(agent.name)}`\n : `${bold(agent.name)} ${gray(`(${agent.id})`)}`\n const description = agent.description || 'No description'\n const filePath = agent.filePath\n ? gray(`File: ${path.relative(getProjectRoot(), agent.filePath)}`)\n : ''\n\n const contentForBox = [\n agentInfo,\n gray(description),\n ...(filePath ? [filePath] : []),\n ]\n\n if (isSelected) {\n // Calculate box width based on content\n const maxContentWidth = Math.max(\n ...contentForBox.map(\n (line) => line.replace(/\\u001b\\[[0-9;]*m/g, '').length,\n ),\n )\n const boxWidth = Math.min(terminalWidth - 6, maxContentWidth)\n\n // Add top border\n lines.push(` ${cyan('┌' + '─'.repeat(boxWidth + 2) + '┐')}`)\n\n // Add content lines with proper padding - keep same indentation as unselected\n contentForBox.forEach((line) => {\n const cleanLine = line.replace(/\\u001b\\[[0-9;]*m/g, '')\n const padding = ' '.repeat(Math.max(0, boxWidth - cleanLine.length))\n lines.push(` ${cyan('│')} ${line}${padding} ${cyan('│')}`)\n })\n\n // Add bottom border\n lines.push(` ${cyan('└' + '─'.repeat(boxWidth + 2) + '┘')}`)\n } else {\n // Non-selected items - use same base indentation as selected content\n lines.push(` ${agentInfo}`) // 4 spaces to match selected content position\n lines.push(` ${gray(description)}`)\n if (filePath) {\n lines.push(` ${filePath}`)\n }\n }\n\n if (i < agentList.length - 1) {\n lines.push('') // Empty line between items\n }\n }\n }\n\n allContentLines = lines\n}\n\nfunction renderAgentsList() {\n // Build all content if not already built\n buildAllContentLines()\n\n // Clear screen and move cursor to top\n process.stdout.write(CLEAR_SCREEN)\n\n const terminalHeight = process.stdout.rows || 24\n const terminalWidth = process.stdout.columns || 80\n\n // Render fixed header\n const headerLines = getHeaderLines(terminalWidth)\n process.stdout.write(headerLines.join('\\n'))\n process.stdout.write('\\n')\n\n // Render scrollable content\n const maxScrollableLines = terminalHeight - headerLines.length - 2\n const visibleLines = allContentLines.slice(\n scrollOffset,\n scrollOffset + maxScrollableLines,\n )\n\n // Display scrollable content\n process.stdout.write(visibleLines.join('\\n'))\n\n // Add padding to fill remaining space\n const remainingLines = maxScrollableLines - visibleLines.length\n if (remainingLines > 0) {\n process.stdout.write('\\n'.repeat(remainingLines))\n }\n\n // Display status line at bottom\n const statusLine = `\\n${gray(`Use ↑/↓/j/k to navigate, Enter to select, ESC to go back`)}`\n\n process.stdout.write(statusLine)\n process.stdout.write(HIDE_CURSOR)\n}\n\nfunction setupAgentsKeyHandler(rl: any, onExit: () => void) {\n // Store all original key handlers\n const listeners = process.stdin.listeners('keypress')\n originalKeyHandlers = listeners as ((str: string, key: any) => void)[]\n\n // Remove existing keypress listeners\n process.stdin.removeAllListeners('keypress')\n\n // Add our custom handler\n process.stdin.on('keypress', (str: string, key: any) => {\n if (key && key.name === 'escape') {\n exitAgentsBuffer(rl)\n onExit()\n return\n }\n\n // Handle Ctrl+C - exit to main screen\n if (key && key.ctrl && key.name === 'c') {\n exitAgentsBuffer(rl)\n onExit()\n return\n }\n\n // Handle Enter - switch to selected agent, create new, or edit\n if (key && key.name === 'return') {\n if (agentList.length > 0 && selectedIndex < agentList.length) {\n const selectedAgent = agentList[selectedIndex]\n\n // Skip separators, placeholders, and section headers\n if (\n selectedAgent.isSeparator ||\n selectedAgent.isPlaceholder ||\n selectedAgent.isSectionHeader\n ) {\n return\n }\n\n if (selectedAgent.isCreateNew) {\n exitAgentsBuffer(rl)\n startDirectAgentCreation(onExit)\n } else {\n exitAgentsBuffer(rl)\n // Start spinner for agent switching\n Spinner.get().start(`Switching to agent: ${selectedAgent.name}...`)\n\n // Use resetAgent to switch to the selected agent\n const cliInstance = CLI.getInstance()\n cliInstance\n .resetAgent(selectedAgent.id)\n .then(() => {\n cliInstance.freshPrompt()\n })\n .catch((error) => {\n Spinner.get().stop()\n console.error(red('Error switching to agent:'), error)\n onExit()\n })\n }\n }\n return\n }\n\n // Handle navigation - skip separators, placeholders, and section headers\n if (key && (key.name === 'up' || key.name === 'k')) {\n let newIndex = selectedIndex - 1\n while (\n newIndex >= 0 &&\n (agentList[newIndex]?.isSeparator ||\n agentList[newIndex]?.isPlaceholder ||\n agentList[newIndex]?.isSectionHeader)\n ) {\n newIndex--\n }\n if (newIndex >= 0) {\n selectedIndex = newIndex\n centerSelectedItem()\n }\n\n renderAgentsList()\n return\n }\n if (key && (key.name === 'down' || key.name === 'j')) {\n let newIndex = selectedIndex + 1\n while (\n newIndex < agentList.length &&\n (agentList[newIndex]?.isSeparator ||\n agentList[newIndex]?.isPlaceholder ||\n agentList[newIndex]?.isSectionHeader)\n ) {\n newIndex++\n }\n if (newIndex < agentList.length) {\n selectedIndex = newIndex\n centerSelectedItem()\n renderAgentsList()\n }\n return\n }\n\n if (key && key.name === 'pageup') {\n const newIndex = Math.max(0, selectedIndex - 5)\n if (newIndex !== selectedIndex) {\n selectedIndex = newIndex\n centerSelectedItem()\n renderAgentsList()\n }\n return\n }\n\n if (key && key.name === 'pagedown') {\n const newIndex = Math.min(agentList.length - 1, selectedIndex + 5)\n if (newIndex !== selectedIndex) {\n selectedIndex = newIndex\n centerSelectedItem()\n renderAgentsList()\n }\n return\n }\n\n if (key && key.name === 'home') {\n if (selectedIndex !== 0) {\n selectedIndex = 0\n centerSelectedItem()\n renderAgentsList()\n }\n return\n }\n\n if (key && key.name === 'end') {\n if (selectedIndex !== agentList.length - 1) {\n selectedIndex = agentList.length - 1\n centerSelectedItem()\n renderAgentsList()\n }\n return\n }\n })\n\n // Ensure raw mode for immediate key detection\n if (process.stdin.isTTY) {\n process.stdin.setRawMode(true)\n }\n}\n\nasync function startDirectAgentCreation(onExit: () => void) {\n // Switch to agent-builder which automatically spawns Bob the Agent Builder for agent creation\n const prompt = `Create a new custom agent template for me. Please ask me what kind of agent I'd like to create and help me build it.`\n\n console.log(\n green(\n '\\n🤖 Starting agent creation with Buffy the Enthusiastic Agent Builder...',\n ),\n )\n console.log(\n gray(\n 'Buffy will connect you with Bob the Agent Builder to create your custom agent.',\n ),\n )\n\n try {\n const cliInstance = CLI.getInstance()\n // Switch to agent-builder which automatically spawns the agent builder for agent creation\n await cliInstance.resetAgent(\n AgentTemplateTypes.agent_builder,\n undefined,\n prompt,\n )\n cliInstance.freshPrompt()\n } catch (error) {\n console.error(red('Error starting agent creation:'), error)\n }\n\n onExit()\n}\n\n// Cleanup function\nexport function cleanupAgentsBuffer() {\n if (isInAgentsBuffer) {\n process.stdout.write(SHOW_CURSOR)\n process.stdout.write(EXIT_ALT_BUFFER)\n isInAgentsBuffer = false\n }\n\n // Restore normal terminal mode\n if (process.stdin.isTTY) {\n process.stdin.setRawMode(false)\n }\n // Register cleanup on process exit\n process.on('exit', cleanupAgentsBuffer)\n process.on('SIGINT', cleanupAgentsBuffer)\n process.on('SIGTERM', cleanupAgentsBuffer)\n}\n", - "referencedBy": {} - }, - { - "path": "backend/src/templates/base.ts", - "content": "[FILE_DOES_NOT_EXIST]", - "referencedBy": {} - }, - { - "path": "backend/src/tools/definitions/tool/spawn-agent-inline.ts", - "content": "import { getToolCallString } from '@codebuff/common/tools/utils'\n\nimport type { ToolDescription } from '../tool-def-type'\n\nconst toolName = 'spawn_agent_inline'\nexport const spawnAgentInlineTool = {\n toolName,\n description: `\nSpawn a single agent that runs within the current message history. \nThe spawned agent sees all previous messages and any messages it adds \nare preserved when control returns to you.\n\nThis is useful for:\n- Delegating specific tasks while maintaining context\n- Having specialized agents process information inline\n- Managing message history (e.g., summarization)\nThe agent will run until it calls end_turn, then control returns to you. There is no tool result for this tool.\nExample:\n${getToolCallString(toolName, {\n agent_type: 'file-picker',\n prompt: 'Find files related to authentication',\n params: { paths: ['src/auth.ts', 'src/user.ts'] },\n})}\n `.trim(),\n} satisfies ToolDescription", - "referencedBy": {} - } - ] - } - ], - "parentAgentId": "D-OfaehVPQw" - }, - { - "type": "text", - "agentId": "D-OfaehVPQw", - "text": "Okay, here's a concise report of locations in the codebase relevant to the `file-explorer` agent:\n\n* **`backend/src/templates/agents/file-explorer.ts`**: This file contains the core definition of the `file-explorer` agent. It defines the agent's purpose, input schema, system prompt, and the `handleSteps` function that orchestrates the agent's behavior, specifically spawning multiple `file-picker` agents.\n* **`backend/src/tools/definitions/tool/spawn-agents.ts`**: This file defines the `spawn_agents` tool, which is used by the `file-explorer` agent to spawn the underlying `file-picker` agents.\n* **`backend/src/tools/handlers/tool/spawn-agents.ts`**: This file contains the handler logic for the `spawn_agents` tool, which is responsible for actually creating and running the spawned agents.\n* **`common/src/constants/agents.ts`**: This defines high-level details about the agent, including its display name and purpose.\n* **`npm-app/src/cli-handlers/agents.ts`**: This seems like it could be helpful for understanding how agents are managed in the CLI application.\n\nThese files should give you a good understanding of the `file-explorer` agent's definition and target.\n" - }, - { - "type": "subagent_finish", - "agentId": "D-OfaehVPQw", - "agentType": "file-picker", - "displayName": "Fletcher the File Fetcher", - "onlyChild": false, - "parentAgentId": "main-agent", - "prompt": "", - "params": { - "prompt": "file-explorer agent definition and spawn target" - } - }, - { - "type": "tool_result", - "toolCallId": "D-Oe9G8zl9M", - "toolName": "spawn_agents", - "output": [ - { - "type": "json", - "value": [ - { - "agentType": "read_subtree", - "agentName": "read_subtree", - "value": { - "errorMessage": "Error spawning agent: Error: Agent type read_subtree not found." - } - }, - { - "agentType": "read_subtree", - "agentName": "read_subtree", - "value": { - "errorMessage": "Error spawning agent: Error: Agent type read_subtree not found." - } - }, - { - "agentName": "Fletcher the File Fetcher", - "agentType": "file-picker", - "value": { - "type": "lastMessage", - "value": [ - { - "role": "assistant", - "content": [ - { - "type": "text", - "text": "Here's a short report of the locations in the codebase that could be helpful, focusing on the most relevant files:\n\n* **`backend/src/templates/agents/agent-builder.ts`**: This file contains the `agentBuilder` function, which is responsible for creating new agent templates. It reads agent template types, tool definitions, and example agent files, providing a good starting point for understanding the agent creation process.\n* **`backend/src/templates/agent-registry.ts`**: This file manages the agent registry, fetching agents from the database and assembling local agent templates. It is useful for understanding how agents are stored and retrieved.\n* **`npm-app/src/cli-handlers/agent-creation-chat.ts`**: This file contains the `startAgentCreationChat` function, which guides users through the agent creation process via a CLI chat interface. It showcases how agent requirements are collected and used to create agent templates.\n* **`web/src/content/agents/creating-new-agents.mdx`**: This file provides documentation on creating new agents, including examples and best practices. It offers insights into the structure and required fields of agent templates.\n* **`common/src/types/dynamic-agent-template.ts`**: This file defines the schema for dynamic agent templates, outlining the structure and properties of custom Codebuff agents.\n" - } - ] - } - ] - } - }, - { - "agentName": "Fletcher the File Fetcher", - "agentType": "file-picker", - "value": { - "type": "lastMessage", - "value": [ - { - "role": "assistant", - "content": [ - { - "type": "text", - "text": "Here's a concise report on diff-reviewer agent examples and configurations:\n\n* `.agents/examples/diff-reviewer-1.ts`, `.agents/examples/diff-reviewer-2.ts`, `.agents/examples/diff-reviewer-3.ts`, `common/src/util/examples/diff-reviewer-1.ts`, `common/src/util/examples/diff-reviewer-2.ts`, `common/src/util/examples/diff-reviewer-3.ts`: These files provide example definitions for diff-reviewer agents at different levels (1-3), showcasing variations in input schema, tools used, and step handling.\n\n* `backend/src/templates/agents/reviewer.ts`: This file defines the reviewer agent template, including its persona, instructions, and tool usage, focusing on providing feedback on code changes.\n\n* `backend/src/system-prompt/agent-instructions.md`: This file dictates the system prompt and instructions for the diff reviewer, shaping its behavior and emphasizing clarity, conciseness, and adherence to code style.\n\nThese files offer insights into the agent's configuration, behavior, and usage within the codebase.\n" - } - ] - } - ] - } - }, - { - "agentName": "Fletcher the File Fetcher", - "agentType": "file-picker", - "value": { - "type": "lastMessage", - "value": [ - { - "role": "assistant", - "content": [ - { - "type": "text", - "text": "Okay, here's a concise report on the locations in the codebase that could be helpful for creating a custom agent from a starter template, or understanding the existing `git-committer` agent:\n\n* `.agents/git-committer.ts`: This is the definition of the `git-committer` agent. It shows the structure of an agent definition, including its `id`, `inputSchema`, `systemPrompt`, `instructionsPrompt`, and `handleSteps`. Crucially it shows the tools and steps this agent uses.\n* `backend/src/templates/agents/base.ts`: This file provides the base template for creating agents. It defines the core structure, including the input schema, output mode, and available tools.\n* `backend/src/templates/agent-list.ts`: This file defines a list of available static agentTemplates providing a way to reference existing, simple (non-dynamic) agents.\n* `common/src/types/agent-template.ts`: This file defines the `AgentTemplate` type, which is the structure that all agent definitions must adhere to. It specifies the required and optional properties of an agent.\n* `npm-app/src/cli-handlers/agents.ts`: This file contains the logic for displaying and selecting agents within the CLI. You likely do not require this information.\n" - } - ] - } - ] - } - }, - { - "agentName": "Fletcher the File Fetcher", - "agentType": "file-picker", - "value": { - "type": "lastMessage", - "value": [ - { - "role": "assistant", - "content": [ - { - "type": "text", - "text": "Here's a concise report of the locations in the codebase that define agent personalities or types:\n\n* `.agents/brainstormer.ts`, `.agents/planner.ts`, `.agents/researcher.ts`, `.agents/reviewer.ts`, `.agents/thinker.ts`, `.agents/superagent.ts`: These files define the persona, instructions, and capabilities of different agent types. They are useful as a central location for understanding specific agent behaviors.\n* `common/src/constants/agents.ts`: This file contains the `AGENT_PERSONAS` constant, which provides display names and purposes for different base and specialized agents. It's helpful for understanding the high-level categorization and naming of agents.\n* `common/src/types/agent-template.ts`: This file defines the `AgentTemplate` type, which outlines the structure of agent definitions, including fields like `displayName`, `systemPrompt`, `inputSchema`, and `toolNames`.\n* `npm-app/src/agents/load-agents.ts`: This file is responsible for loading local agent definitions, and could be useful for understanding how agents are managed.\n* `web/src/content/agents/overview.mdx`: Documentation summarizing agent design and purpose.\n" - } - ] - } - ] - } - }, - { - "agentName": "Fletcher the File Fetcher", - "agentType": "file-picker", - "value": { - "type": "lastMessage", - "value": [ - { - "role": "assistant", - "content": [ - { - "type": "text", - "text": "Okay, here's a concise report of locations in the codebase relevant to the `file-explorer` agent:\n\n* **`backend/src/templates/agents/file-explorer.ts`**: This file contains the core definition of the `file-explorer` agent. It defines the agent's purpose, input schema, system prompt, and the `handleSteps` function that orchestrates the agent's behavior, specifically spawning multiple `file-picker` agents.\n* **`backend/src/tools/definitions/tool/spawn-agents.ts`**: This file defines the `spawn_agents` tool, which is used by the `file-explorer` agent to spawn the underlying `file-picker` agents.\n* **`backend/src/tools/handlers/tool/spawn-agents.ts`**: This file contains the handler logic for the `spawn_agents` tool, which is responsible for actually creating and running the spawned agents.\n* **`common/src/constants/agents.ts`**: This defines high-level details about the agent, including its display name and purpose.\n* **`npm-app/src/cli-handlers/agents.ts`**: This seems like it could be helpful for understanding how agents are managed in the CLI application.\n\nThese files should give you a good understanding of the `file-explorer` agent's definition and target.\n" - } - ] - } - ] - } - }, - { - "agentName": "Code Searcher", - "agentType": "code-searcher", - "value": { - "type": "structuredOutput", - "value": { - "results": [ - { - "stdout": ".agents/examples/diff-reviewer-1.ts:\n4: id: 'diff-reviewer-1',\n\n.agents/examples/diff-reviewer-2.ts:\n7: id: 'diff-reviewer-2',\n\n.agents/examples/diff-reviewer-3.ts:\n7: id: 'diff-reviewer-3',\n\n./backend/src/templates/agents/agent-builder.ts:\n67: (file) => file.endsWith('.ts') && file.startsWith('diff-reviewer'),\n\n./common/src/util/examples/diff-reviewer-1.ts:\n4: id: 'diff-reviewer-1',\n\n./common/src/util/examples/diff-reviewer-2.ts:\n7: id: 'diff-reviewer-2',\n\n./common/src/util/examples/diff-reviewer-3.ts:\n7: id: 'diff-reviewer-3',", - "message": "Exit code: 0" - }, - { - "stdout": "No results", - "message": "Exit code: 1" - }, - { - "stdout": "./npm-app/src/client.ts:\n1354: // Mark any spawnable agents as inactive when the main response completes\n\n./npm-app/src/subagent-storage.ts:\n214: * Get recent spawnable agents (sorted by last activity)\n223: * Get spawnable agents in chronological order (oldest first)\n\n./backend/knowledge.md:\n7:Users can now reference spawnable agents without org prefixes in their agent templates. For example:\n77: spawnableAgents?: { // Modify spawnable agents list\n\n./npm-app/src/agents/load-agents.ts:\n86: `${green('Configured spawnable agents:')} ${spawnableAgents\n\n./npm-app/src/cli.ts:\n949: // Give control back to user when no spawnable agents exist\n\n./backend/src/tools/definitions/tool/spawn-agents-async.ts:\n6:export const spawnAgentsAsyncTool = {\n\n./backend/src/tools/definitions/tool/spawn-agents.ts:\n6:export const spawnAgentsTool = {\n\n./backend/src/tools/definitions/list.ts:\n16:import { spawnAgentsTool } from './tool/spawn-agents'\n17:import { spawnAgentsAsyncTool } from './tool/spawn-agents-async'\n43: spawn_agents: spawnAgentsTool,\n44: spawn_agents_async: spawnAgentsAsyncTool,\n\n./common/src/templates/agent-validation.ts:\n199: // Validate spawnable agents (skip if requested, e.g., for database agents)\n\n./web/src/app/api/agents/publish/route.ts:\n222: // Verify that all spawnable agents are either published or part of this request\n\n./common/src/__tests__/agent-validation.test.ts:\n116: test.skip('should validate spawnable agents', async () => {\n141: 'Invalid spawnable agents: nonexistent_agent',\n274: it('should validate spawnable agents including dynamic agents from first pass', async () => {\n287: spawnableAgents: [], // No spawnable agents\n\n./common/src/__tests__/dynamic-agent-template-schema.test.ts:\n336: const spawnAgentsError = result.error.issues.find((issue) =>\n341: expect(spawnAgentsError).toBeDefined()\n342: expect(spawnAgentsError?.message).toContain(\n\n./web/src/content/agents/troubleshooting-agent-customization.mdx:\n204:2. Limit spawnable agents:\n\n./common/src/util/agent-name-normalization.ts:\n6: * 2. Try with DEFAULT_ORG_PREFIX for spawnable agents\n10: * and handles the common case where users reference spawnable agents\n27: // Try with DEFAULT_ORG_PREFIX for spawnable agents\n\n./common/src/tools/list.ts:\n14:import { spawnAgentsParams } from './params/tool/spawn-agents'\n15:import { spawnAgentsAsyncParams } from './params/tool/spawn-agents-async'\n39: spawn_agents: spawnAgentsParams,\n40: spawn_agents_async: spawnAgentsAsyncParams,\n\n./common/src/types/dynamic-agent-template.ts:\n98: // Tools and spawnable agents\n\n./common/src/json-config/constants.ts:\n91: .describe('Specify complete list of spawnable agents for the base agent'),\n\n./common/src/util/agent-template-validation.ts:\n9: * Centralized validation for spawnable agents.\n10: * Validates that all spawnable agents reference valid agent types.\n35: * Formats a validation error message for spawnable agents\n41: let message = `Invalid spawnable agents: ${invalidAgents.join(', ')}. Double check the id, including the org prefix if applicable.`\n\n./common/src/json-config/__tests__/__snapshots__/stringify-schema.test.ts.snap:\n85: // (optional): Specify complete list of spawnable agents for the base agent\n\n./common/src/tools/params/tool/spawn-agents.ts:\n7:export const spawnAgentsParams = {\n\n./common/src/tools/params/tool/spawn-agents-async.ts:\n7:export const spawnAgentsAsyncParams = {", - "message": "Exit code: 0" - }, - { - "stdout": "./npm-app/src/cli-handlers/agent-creation-chat.ts:\n77: // Create a simple prompt for the agent builder with the requirements\n88: // Use the resetAgent helper to properly switch to agent-builder which automatically spawns the agent builder\n\n./npm-app/src/cli-handlers/agents.ts:\n560: // Switch to agent-builder which automatically spawns the agent builder for agent creation\n\n./backend/src/templates/agents/agent-builder.ts:\n30:export const agentBuilder = (\n135: 'You are an expert agent builder specialized in creating new agent templates for the codebuff system. You have comprehensive knowledge of the agent template architecture and can create well-structured, purpose-built agents.',\n224:The agent builder is focused on creating new agent templates based on user specifications.\n\n./backend/src/templates/agent-list.ts:\n18:import { agentBuilder } from './agents/agent-builder'\n77: ...agentBuilder(models.openrouter_claude_sonnet_4),", - "message": "Exit code: 0" - }, - { - "stdout": "./common/src/constants/agents.ts:\n3:// Define agent personas with their shared characteristics", - "message": "Exit code: 0" - } - ] - } - } - } - ] - } - ] - }, - { - "type": "tool_call", - "toolCallId": "48ed86af-18ff-4566-b132-69ffec605226", - "toolName": "spawn_agent_inline", - "input": { - "agent_type": "context-pruner", - "params": {} - }, - "agentId": "main-agent", - "includeToolCall": false - }, - { - "type": "tool_result", - "toolCallId": "48ed86af-18ff-4566-b132-69ffec605226", - "toolName": "spawn_agent_inline", - "output": [ - { - "type": "json", - "value": { - "message": "Agent spawned." - } - } - ] - }, - { - "type": "tool_call", - "toolCallId": "D-QVk6nxfQw", - "toolName": "read_files", - "input": { - "paths": [ - "backend/src/templates/agents/agent-builder.ts", - "common/src/constants/agents.ts", - ".agents/examples/diff-reviewer-1.ts", - ".agents/examples/diff-reviewer-2.ts", - ".agents/examples/diff-reviewer-3.ts", - ".agents/git-committer.ts", - "common/src/util/examples/diff-reviewer-1.ts", - "common/src/util/examples/diff-reviewer-2.ts", - "common/src/util/examples/diff-reviewer-3.ts", - "backend/src/templates/agents/file-explorer.ts" - ] - }, - "agentId": "main-agent", - "includeToolCall": true - }, - { - "type": "tool_call", - "toolCallId": "D-QYc2ZPpX8", - "toolName": "spawn_agents", - "input": { - "agents": [ - { - "agent_type": "file-picker", - "prompt": "package.json scripts for testing, linting, typechecking" - }, - { - "agent_type": "code-searcher", - "params": { - "searchQueries": [ - { - "pattern": "bun run typecheck|lint|test" - }, - { - "pattern": "AGENT_PERSONAS", - "flags": "-g *.ts" - } - ] - } - } - ] - }, - "agentId": "main-agent", - "includeToolCall": true - }, - { - "type": "tool_result", - "toolCallId": "D-QVk6nxfQw", - "toolName": "read_files", - "output": [ - { - "type": "json", - "value": [ - { - "path": "backend/src/templates/agents/agent-builder.ts", - "content": "import * as fs from 'fs'\nimport * as path from 'path'\n\nimport {\n AGENT_TEMPLATES_DIR,\n openrouterModels,\n AGENT_DEFINITION_FILE,\n} from '@codebuff/common/constants'\nimport { AgentTemplateTypes } from '@codebuff/common/types/session-state'\nimport z from 'zod/v4'\n\nimport type { AgentTemplate } from '../types'\nimport type { Model } from '@codebuff/common/constants'\nimport type { ToolName } from '@codebuff/common/tools/constants'\n\nconst COMMON_UTIL_PATH = '../../../../common/src/util'\nconst TEMPLATE_RELATIVE_PATH =\n `${COMMON_UTIL_PATH}/types/${AGENT_DEFINITION_FILE}` as const\n// Import to validate path exists at compile time\nimport(TEMPLATE_RELATIVE_PATH)\n\nconst TEMPLATE_PATH = path.join(__dirname, TEMPLATE_RELATIVE_PATH)\nconst DEFAULT_MODEL = openrouterModels.openrouter_claude_sonnet_4\nconst TYPES_DIR = path.join(AGENT_TEMPLATES_DIR, 'types')\nconst EXAMPLES_DIR = path.join(AGENT_TEMPLATES_DIR, 'examples')\nconst TEMPLATE_TYPES_PATH = path.join(TYPES_DIR, AGENT_DEFINITION_FILE)\nconst TOOL_DEFINITIONS_FILE = 'tools.d.ts'\nconst TOOL_DEFINITIONS_PATH = path.join(TYPES_DIR, TOOL_DEFINITIONS_FILE)\n\nexport const agentBuilder = (\n model: Model,\n allAvailableAgents?: string[],\n): Omit => {\n // Read the AGENT_CONFIG_FILE content dynamically\n // The import above ensures this path exists at compile time\n let agentTemplateContent = ''\n try {\n agentTemplateContent = fs.readFileSync(TEMPLATE_PATH, 'utf8')\n } catch (error) {\n console.warn(`Could not read ${AGENT_DEFINITION_FILE}:`, error)\n agentTemplateContent = '// Agent template types not available'\n }\n // Read the tools.d.ts content from common package\n let toolDefinitionsContent = ''\n try {\n const toolsPath = path.join(\n __dirname,\n `${COMMON_UTIL_PATH}/types/tools.d.ts`,\n )\n toolDefinitionsContent = fs.readFileSync(toolsPath, 'utf8')\n } catch (error) {\n console.warn(`Could not read tools.d.ts from common:`, error)\n toolDefinitionsContent = '// Tool definitions not available'\n }\n\n // Read example agent files from common package\n const exampleAgentContents: Record = {}\n\n try {\n const exampleAgentsDir = path.join(__dirname, `${COMMON_UTIL_PATH}`)\n // Check if directory exists before trying to read it\n if (fs.existsSync(exampleAgentsDir)) {\n const files = fs.readdirSync(exampleAgentsDir)\n\n files\n .filter(\n (file) => file.endsWith('.ts') && file.startsWith('diff-reviewer'),\n )\n .forEach((filename) => {\n try {\n const fullPath = path.join(exampleAgentsDir, filename)\n const content = fs.readFileSync(fullPath, 'utf8')\n exampleAgentContents[filename] = content\n } catch (error) {\n console.warn(`Could not read example agent ${filename}:`, error)\n }\n })\n } else {\n console.warn(\n `Example agents directory does not exist: ${exampleAgentsDir}`,\n )\n }\n } catch (error) {\n console.warn('Could not read example agents directory:', error)\n }\n\n return {\n model,\n displayName: 'Bob the Agent Builder',\n spawnPurposePrompt:\n 'Enhanced base agent that can create custom agents and handle all coding tasks with deterministic agent creation behavior',\n inputSchema: {\n prompt: z\n .string()\n .optional()\n .describe(\n 'What agent type you would like to create or edit. Include as many details as possible.',\n ),\n params: z\n .object({\n name: z.string().optional(),\n purpose: z.string().optional(),\n specialty: z.string().optional(),\n model: z.string().optional(),\n })\n .passthrough()\n .optional(),\n },\n outputMode: 'structured_output',\n includeMessageHistory: false,\n toolNames: [\n 'write_file',\n 'str_replace',\n 'run_terminal_command',\n 'read_files',\n 'code_search',\n 'spawn_agents',\n 'add_message',\n 'set_output',\n 'end_turn',\n ] satisfies ToolName[],\n spawnableAgents: allAvailableAgents\n ? (allAvailableAgents as any[])\n : [\n AgentTemplateTypes.file_picker,\n AgentTemplateTypes.researcher,\n AgentTemplateTypes.thinker,\n AgentTemplateTypes.reviewer,\n AgentTemplateTypes.agent_builder,\n ],\n\n systemPrompt: [\n '# Bob the Agent Builder',\n '',\n 'You are an expert agent builder specialized in creating new agent templates for the codebuff system. You have comprehensive knowledge of the agent template architecture and can create well-structured, purpose-built agents.',\n '',\n '## Environment Setup Complete',\n '',\n 'Your environment has been automatically prepared with:',\n '- Agent template type definitions in `.agents/types/agent-definition.d.ts`',\n '- Tool type definitions in `.agents/types/tools.d.ts`',\n '- Example agent files copied to `.agents/` directory for reference',\n '',\n 'All necessary files are now available in your working directory.',\n '',\n '## Complete Agent Template Type Definitions',\n '',\n 'Here are the complete TypeScript type definitions for creating custom Codebuff agents:',\n '```typescript',\n agentTemplateContent,\n '```',\n '',\n '## Available Tools Type Definitions',\n '',\n 'Here are the complete TypeScript type definitions for all available tools:',\n '',\n '```typescript',\n toolDefinitionsContent,\n '```',\n '',\n '## Agent Template Patterns:',\n '',\n '1. **Base Agent Pattern**: Full-featured agents with comprehensive tool access',\n '2. **Specialized Agent Pattern**: Focused agents with limited tool sets',\n '3. **Thinking Agent Pattern**: Agents that spawn thinker sub-agents',\n '4. **Research Agent Pattern**: Agents that start with web search',\n '',\n '## Best Practices:',\n '',\n '1. **Use as few fields as possible**: Leave out fields that are not needed to reduce complexity',\n '2. **Minimal Tools**: Only include tools the agent actually needs',\n '3. **Clear and Concise Prompts**: Write clear, specific prompts that have no unnecessary words',\n '4. **Consistent Naming**: Follow naming conventions (kebab-case for IDs)',\n '5. **Appropriate Model**: Choose the right model for the task complexity. Default is claude-4-sonnet-20250522 for medium-high complexity tasks, and openai/gpt-5 for all other tasks.',\n '',\n '## Your Task:',\n 'When asked to create an agent template, you should:',\n \"1. Understand the requested agent's purpose and capabilities\",\n \"2. Choose appropriate tools for the agent's function\",\n '3. Write a comprehensive system prompt',\n `4. Create the complete agent template file in ${AGENT_TEMPLATES_DIR}`,\n '5. Ensure the template follows all conventions and best practices',\n '6. Use the AgentDefinition interface for the configuration',\n '7. Start the file with: import type { AgentDefinition } from \"./types/agent-definition.d.ts\"',\n '',\n 'Create agent templates that are focused, efficient, and well-documented. Always import the AgentDefinition type and export a default configuration object.',\n ].join('\\n'),\n instructionsPrompt: `You are helping to create or edit an agent template. The user will describe what kind of agent they want to create or how they want to modify an existing agent.\n\n## Environment Ready\n\nYour environment has been automatically set up with:\n- Type definitions in \\`.agents/types/\\`\n- Example agent files in \\`.agents/\\` directory\n- All necessary scaffolding complete\n\nYou can now proceed directly to agent creation or editing.\n\n## Example Agents Available\n\nThree example agents are now available in your \\`.agents/\\` directory which are all diff reviewers of increasing complexity. These can serve as examples of well-made agents at different stages of complexity.\n\n**IMPORTANT**: Examine these examples to find connections and patterns that relate to the user's request. Look for:\n- Similar tool combinations\n- Comparable complexity levels\n- Related functionality patterns\n- Appropriate model choices\n- Relevant prompt structures\n\nUse these examples as inspiration and starting points, adapting their patterns to fit the user's specific needs.\n\n## For New Agents\n\nAnalyze their request and create a complete agent template that:\n- Has a clear purpose and appropriate capabilities\n- Leaves out fields that are not needed\n- Uses only the tools it needs\n- Follows naming conventions\n- Is properly structured\n- Draws inspiration from relevant example agents\n\n## For Creating New Agents\n\nThe agent builder is focused on creating new agent templates based on user specifications.\n\nIMPORTANT: Always end your response with the end_turn tool when you have completed the agent creation or editing task.`,\n stepPrompt: '',\n\n handleSteps: function* ({ agentState, prompt, params }) {\n // Step 1: Create directory structure\n yield {\n toolName: 'run_terminal_command',\n args: {\n command: `mkdir -p ${TYPES_DIR} && mkdir -p ${EXAMPLES_DIR}`,\n process_type: 'SYNC',\n timeout_seconds: 10,\n },\n }\n\n // Step 2: Write the AGENT_DEFINITION_FILE with the template content\n yield {\n toolName: 'write_file',\n args: {\n path: TEMPLATE_TYPES_PATH,\n instructions: 'Create agent template type definitions file',\n content: agentTemplateContent,\n },\n }\n\n // Step 3: Write the tool definitions file (copy from existing tools.d.ts)\n yield {\n toolName: 'write_file',\n args: {\n path: TOOL_DEFINITIONS_PATH,\n instructions: 'Create tools type file',\n content: toolDefinitionsContent,\n },\n }\n\n // Step 4: Add message about reading example files and then read them\n yield {\n toolName: 'add_message',\n args: {\n role: 'assistant',\n content:\n \"I'll read the example agent files to understand the patterns and then help you create your agent.\",\n },\n }\n\n // Step 5: Copy example agent files to .agents/ directory\n for (const [filename, content] of Object.entries(exampleAgentContents)) {\n if (content) {\n yield {\n toolName: 'write_file',\n args: {\n path: `${EXAMPLES_DIR}/${filename}`,\n instructions: `Copy example agent file ${filename}`,\n content: content,\n },\n }\n }\n }\n\n // Step 6: Complete agent creation process\n yield 'STEP_ALL'\n },\n }\n}\n", - "referencedBy": {} - }, - { - "path": "common/src/constants/agents.ts", - "content": "import type { AgentTemplateTypes } from '../types/session-state'\n\n// Define agent personas with their shared characteristics\nexport const AGENT_PERSONAS = {\n // Base agents - all use Buffy persona\n base: {\n displayName: 'Buffy the Enthusiastic Coding Assistant',\n purpose: 'Base agent that orchestrates the full response.',\n } as const,\n base_lite: {\n displayName: 'Buffy the Enthusiastic Coding Assistant',\n purpose: 'Base agent that orchestrates the full response.',\n } as const,\n base_max: {\n displayName: 'Buffy the Enthusiastic Coding Assistant',\n purpose: 'Base agent that orchestrates the full response.',\n } as const,\n base_experimental: {\n displayName: 'Buffy the Enthusiastic Coding Assistant',\n purpose: 'Base agent that orchestrates the full response.',\n } as const,\n claude4_gemini_thinking: {\n displayName: 'Buffy the Enthusiastic Coding Assistant',\n purpose: 'Base agent that orchestrates the full response.',\n } as const,\n\n base_agent_builder: {\n displayName: 'Buffy the Enthusiastic Agent Builder',\n purpose:\n 'Enhanced base agent that can create custom agents and handle all coding tasks',\n } as const,\n\n superagent: {\n displayName: 'Superagent',\n purpose:\n 'Superagent that can spawn multiple code editing agents to complete a task.',\n } as const,\n\n // Ask mode\n ask: {\n displayName: 'Buffy the Enthusiastic Coding Assistant',\n purpose: 'Base ask-mode agent that orchestrates the full response.',\n } as const,\n\n // Specialized agents\n thinker: {\n displayName: 'Theo the Theorizer',\n purpose:\n 'Does deep thinking given the current messages and a specific prompt to focus on. Use this to help you solve a specific problem.',\n } as const,\n file_explorer: {\n displayName: 'Dora The File Explorer',\n purpose: 'Expert at exploring a codebase and finding relevant files.',\n } as const,\n file_picker: {\n displayName: 'Fletcher the File Fetcher',\n purpose: 'Expert at finding relevant files in a codebase.',\n } as const,\n researcher: {\n displayName: 'Reid Searcher the Researcher',\n purpose: 'Expert at researching topics using web search and documentation.',\n } as const,\n planner: {\n displayName: 'Peter Plan the Planner',\n purpose: 'Agent that formulates a comprehensive plan to a prompt.',\n hidden: true,\n } as const,\n dry_run: {\n displayName: 'Sketch the Dry Runner',\n purpose: 'Agent that takes a plan and try to implement it in a dry run.',\n hidden: true,\n } as const,\n reviewer: {\n displayName: 'Nit Pick Nick the Reviewer',\n purpose:\n 'Reviews file changes and responds with critical feedback. Use this after making any significant change to the codebase.',\n } as const,\n agent_builder: {\n displayName: 'Bob the Agent Builder',\n purpose: 'Creates new agent templates for the codebuff mult-agent system',\n hidden: false,\n } as const,\n} as const satisfies Partial<\n Record<\n keyof typeof AgentTemplateTypes,\n { displayName: string; purpose: string; hidden?: boolean }\n >\n>\n\n// Agent IDs list from AGENT_PERSONAS keys\nexport const AGENT_IDS = Object.keys(\n AGENT_PERSONAS,\n) as (keyof typeof AGENT_PERSONAS)[]\n\n// Agent ID prefix constant\nexport const AGENT_ID_PREFIX = 'CodebuffAI/'\n\n// Agent names for client-side reference\nexport const AGENT_NAMES = Object.fromEntries(\n Object.entries(AGENT_PERSONAS).map(([agentType, persona]) => [\n agentType,\n persona.displayName,\n ]),\n) as Record\n\nexport type AgentName =\n (typeof AGENT_PERSONAS)[keyof typeof AGENT_PERSONAS]['displayName']\n\n// Get unique agent names for UI display\nexport const UNIQUE_AGENT_NAMES = Array.from(\n new Set(\n Object.values(AGENT_PERSONAS)\n .filter((persona) => !('hidden' in persona) || !persona.hidden)\n .map((persona) => persona.displayName),\n ),\n)\n\n// Map from display name back to agent types (for parsing user input)\nexport const AGENT_NAME_TO_TYPES = Object.entries(AGENT_NAMES).reduce(\n (acc, [type, name]) => {\n if (!acc[name]) acc[name] = []\n acc[name].push(type)\n return acc\n },\n {} as Record,\n)\n", - "referencedBy": {} - }, - { - "path": ".agents/examples/diff-reviewer-1.ts", - "content": "import type { AgentDefinition } from '../types/agent-definition'\n\nconst definition: AgentDefinition = {\n id: 'diff-reviewer-1',\n\n displayName: 'Diff Reviewer (Level 1)',\n model: 'openai/gpt-5',\n toolNames: ['read_files', 'run_terminal_command'],\n\n spawnPurposePrompt:\n 'Spawn when you need to review code changes in the git diff',\n\n instructionsPrompt: `Execute the following steps:\n1. Run git diff\n2. Read the files that have changed\n3. Review the changes and suggest improvements`,\n}\n\nexport default definition\n", - "referencedBy": {} - }, - { - "path": ".agents/examples/diff-reviewer-2.ts", - "content": "import type {\n AgentDefinition,\n AgentStepContext,\n} from '../types/agent-definition'\n\nconst definition: AgentDefinition = {\n id: 'diff-reviewer-2',\n displayName: 'Diff Reviewer (Level 2)',\n model: 'openai/gpt-5',\n\n inputSchema: {\n prompt: {\n type: 'string',\n description:\n 'Please provide a short description of the changes you want to review',\n },\n },\n toolNames: ['read_files', 'run_terminal_command'],\n\n spawnPurposePrompt:\n 'Spawn when you need to review code changes in the git diff',\n\n systemPrompt:\n 'You are an expert software developer. Your job is to review code changes and provide helpful feedback.',\n\n instructionsPrompt: `Execute the following steps:\n1. Run git diff\n2. Read the files that have changed\n3. Review the changes and suggest improvements\n\nUse the following guidelines while reviewing the changes:\n- Find ways to simplify the code\n- Reuse existing code as much as possible instead of writing new code\n- Preserve as much behavior as possible in the existing code\n- Prefer changing as few lines of code as possible\n- Look for opportunities to improve the code's readability\n- Look for logical errors in the code\n- Look for missed cases in the code\n- Look for any other bugs`,\n\n handleSteps: function* ({ agentState, prompt, params }: AgentStepContext) {\n // Step 1: Run git diff immediately. Saves the agent a step, lowering cost and latency!\n yield {\n toolName: 'run_terminal_command',\n args: {\n command: 'git diff',\n },\n }\n\n // Step 2: Let AI run the rest of the steps!\n yield 'STEP_ALL'\n },\n}\n\nexport default definition\n", - "referencedBy": {} - }, - { - "path": ".agents/examples/diff-reviewer-3.ts", - "content": "import type {\n AgentDefinition,\n AgentStepContext,\n} from '../types/agent-definition'\n\nconst definition: AgentDefinition = {\n id: 'diff-reviewer-3',\n\n displayName: 'Diff Reviewer (Level 3)',\n model: 'openai/gpt-5',\n inputSchema: {\n prompt: {\n type: 'string',\n description:\n 'Please provide a short description of the changes you want to review',\n },\n },\n outputMode: 'last_message',\n\n toolNames: ['read_files', 'run_terminal_command', 'spawn_agents'],\n spawnableAgents: ['james/file-explorer@0.1.3'],\n\n spawnPurposePrompt:\n 'Spawn when you need to review code changes in the git diff',\n\n systemPrompt:\n 'You are an expert software developer. Your job is to review code changes and provide helpful feedback.',\n\n instructionsPrompt: `Review the changes and suggest improvements.\n\nUse the following guidelines while reviewing the changes:\n- Find ways to simplify the code\n- Reuse existing code as much as possible instead of writing new code\n- Preserve as much behavior as possible in the existing code\n- Prefer changing as few lines of code as possible\n- Look for opportunities to improve the code's readability\n- Look for logical errors in the code\n- Look for missed cases in the code\n- Look for any other bugs`,\n\n handleSteps: function* ({ agentState, prompt, params }: AgentStepContext) {\n // Step 1: Get list of changed files from git diff --name-only\n const { toolResult: gitDiffFilesResult } = yield {\n toolName: 'run_terminal_command',\n args: {\n command: 'git diff --name-only',\n },\n }\n\n // Then, extract file paths from the result\n const changedFiles = (gitDiffFilesResult || '')\n .split('\\n')\n .map((line) => line.trim())\n .filter((line) => line && !line.startsWith('??') && !line.includes('OSC'))\n\n // Step 2: Read the files\n if (changedFiles.length > 0) {\n yield {\n toolName: 'read_files',\n args: {\n paths: changedFiles,\n },\n }\n }\n\n // Step 3: Run full git diff to see the actual changes\n yield {\n toolName: 'run_terminal_command',\n args: {\n command: 'git diff',\n },\n }\n\n // Step 4: Put words in the AI's mouth to get it to spawn the file explorer.\n yield {\n toolName: 'add_message',\n args: {\n role: 'assistant',\n content:\n 'Now I will spawn a file explorer to find any missing codebase context.',\n },\n }\n\n yield 'STEP'\n\n // Step 5: Put words in the AI's mouth to review the changes.\n yield {\n toolName: 'add_message',\n args: {\n role: 'assistant',\n content: 'Here is my comprehensive review of the changes.',\n },\n }\n\n // Step 6: Let AI review the changes in a final step. (The last message is also the agent's output.)\n yield 'STEP'\n },\n}\n\nexport default definition\n", - "referencedBy": {} - }, - { - "path": ".agents/git-committer.ts", - "content": "import { publisher, version } from './constants'\n\nimport type {\n AgentDefinition,\n AgentStepContext,\n} from './types/agent-definition'\n\nconst definition: AgentDefinition = {\n id: 'git-committer',\n version,\n publisher,\n displayName: 'Git Committer',\n model: 'anthropic/claude-4-sonnet-20250522',\n toolNames: ['read_files', 'run_terminal_command', 'add_message', 'end_turn'],\n\n inputSchema: {\n prompt: {\n type: 'string',\n description: 'What changes to commit',\n },\n },\n\n includeMessageHistory: false,\n outputMode: 'last_message',\n\n spawnPurposePrompt:\n 'Spawn when you need to commit code changes to git with an appropriate commit message',\n\n systemPrompt:\n 'You are an expert software developer. Your job is to create a git commit with a really good commit message.',\n\n instructionsPrompt:\n 'Follow the steps to create a good commit: analyze changes with git diff and git log, read relevant files for context, stage appropriate files, analyze changes, and create a commit with proper formatting including the Codebuff footer.',\n\n handleSteps: function* ({ agentState, prompt, params }: AgentStepContext) {\n // Step 1: Run git diff and git log to analyze changes\n yield {\n toolName: 'run_terminal_command',\n args: {\n command: 'git diff',\n process_type: 'SYNC',\n timeout_seconds: 30,\n },\n }\n\n yield {\n toolName: 'run_terminal_command',\n args: {\n command: 'git log --oneline -10',\n process_type: 'SYNC',\n timeout_seconds: 30,\n },\n }\n\n // Step 2: Let AI analyze the changes and read relevant files for context\n yield {\n toolName: 'add_message',\n args: {\n role: 'assistant',\n content:\n \"I've analyzed the git diff and recent commit history. Now I'll read any relevant files to better understand the context of these changes.\",\n },\n }\n\n // Step 3: Let AI decide which files to read and stage\n yield 'STEP'\n\n // Step 4: Let AI analyze staged changes and compose commit message\n yield {\n toolName: 'add_message',\n args: {\n role: 'assistant',\n content:\n \"Now I'll analyze the staged changes and create a commit with the proper Codebuff footer format.\",\n },\n }\n\n yield 'STEP_ALL'\n },\n}\n\nexport default definition\n", - "referencedBy": {} - }, - { - "path": "common/src/util/examples/diff-reviewer-1.ts", - "content": "import type { AgentDefinition } from '../types/agent-definition'\n\nconst definition: AgentDefinition = {\n id: 'diff-reviewer-1',\n\n displayName: 'Diff Reviewer (Level 1)',\n model: 'openai/gpt-5',\n toolNames: ['read_files', 'run_terminal_command'],\n\n spawnPurposePrompt:\n 'Spawn when you need to review code changes in the git diff',\n\n instructionsPrompt: `Execute the following steps:\n1. Run git diff\n2. Read the files that have changed\n3. Review the changes and suggest improvements`,\n}\n\nexport default definition\n", - "referencedBy": {} - }, - { - "path": "common/src/util/examples/diff-reviewer-2.ts", - "content": "import type {\n AgentDefinition,\n AgentStepContext,\n} from '../types/agent-definition'\n\nconst definition: AgentDefinition = {\n id: 'diff-reviewer-2',\n displayName: 'Diff Reviewer (Level 2)',\n model: 'openai/gpt-5',\n\n inputSchema: {\n prompt: {\n type: 'string',\n description:\n 'Please provide a short description of the changes you want to review',\n },\n },\n toolNames: ['read_files', 'run_terminal_command'],\n\n spawnPurposePrompt:\n 'Spawn when you need to review code changes in the git diff',\n\n systemPrompt:\n 'You are an expert software developer. Your job is to review code changes and provide helpful feedback.',\n\n instructionsPrompt: `Execute the following steps:\n1. Run git diff\n2. Read the files that have changed\n3. Review the changes and suggest improvements\n\nUse the following guidelines while reviewing the changes:\n- Find ways to simplify the code\n- Reuse existing code as much as possible instead of writing new code\n- Preserve as much behavior as possible in the existing code\n- Prefer changing as few lines of code as possible\n- Look for opportunities to improve the code's readability\n- Look for logical errors in the code\n- Look for missed cases in the code\n- Look for any other bugs`,\n\n handleSteps: function* ({ agentState, prompt, params }: AgentStepContext) {\n // Step 1: Run git diff immediately. Saves the agent a step, lowering cost and latency!\n yield {\n toolName: 'run_terminal_command',\n args: {\n command: 'git diff',\n },\n }\n\n // Step 2: Let AI run the rest of the steps!\n yield 'STEP_ALL'\n },\n}\n\nexport default definition\n", - "referencedBy": {} - }, - { - "path": "common/src/util/examples/diff-reviewer-3.ts", - "content": "import type {\n AgentDefinition,\n AgentStepContext,\n} from '../types/agent-definition'\n\nconst definition: AgentDefinition = {\n id: 'diff-reviewer-3',\n\n displayName: 'Diff Reviewer (Level 3)',\n model: 'openai/gpt-5',\n inputSchema: {\n prompt: {\n type: 'string',\n description:\n 'Please provide a short description of the changes you want to review',\n },\n },\n outputMode: 'last_message',\n\n toolNames: ['read_files', 'run_terminal_command', 'spawn_agents'],\n spawnableAgents: ['james/file-explorer@0.1.3'],\n\n spawnPurposePrompt:\n 'Spawn when you need to review code changes in the git diff',\n\n systemPrompt:\n 'You are an expert software developer. Your job is to review code changes and provide helpful feedback.',\n\n instructionsPrompt: `Review the changes and suggest improvements.\n\nUse the following guidelines while reviewing the changes:\n- Find ways to simplify the code\n- Reuse existing code as much as possible instead of writing new code\n- Preserve as much behavior as possible in the existing code\n- Prefer changing as few lines of code as possible\n- Look for opportunities to improve the code's readability\n- Look for logical errors in the code\n- Look for missed cases in the code\n- Look for any other bugs`,\n\n handleSteps: function* ({ agentState, prompt, params }: AgentStepContext) {\n // Step 1: Get list of changed files from git diff --name-only\n const { toolResult: gitDiffFilesResult } = yield {\n toolName: 'run_terminal_command',\n args: {\n command: 'git diff --name-only',\n },\n }\n\n // Then, extract file paths from the result\n const changedFiles = (gitDiffFilesResult || '')\n .split('\\n')\n .map((line) => line.trim())\n .filter((line) => line && !line.startsWith('??') && !line.includes('OSC'))\n\n // Step 2: Read the files\n if (changedFiles.length > 0) {\n yield {\n toolName: 'read_files',\n args: {\n paths: changedFiles,\n },\n }\n }\n\n // Step 3: Run full git diff to see the actual changes\n yield {\n toolName: 'run_terminal_command',\n args: {\n command: 'git diff',\n },\n }\n\n // Step 4: Put words in the AI's mouth to get it to spawn the file explorer.\n yield {\n toolName: 'add_message',\n args: {\n role: 'assistant',\n content:\n 'Now I will spawn a file explorer to find any missing codebase context.',\n },\n }\n\n yield 'STEP'\n\n // Step 5: Put words in the AI's mouth to review the changes.\n yield {\n toolName: 'add_message',\n args: {\n role: 'assistant',\n content: 'Here is my comprehensive review of the changes.',\n },\n }\n\n // Step 6: Let AI review the changes in a final step. (The last message is also the agent's output.)\n yield 'STEP'\n },\n}\n\nexport default definition\n", - "referencedBy": {} - }, - { - "path": "backend/src/templates/agents/file-explorer.ts", - "content": "import { AgentTemplateTypes } from '@codebuff/common/types/session-state'\nimport { z } from 'zod/v4'\n\nimport type { AgentTemplate } from '../types'\n\nconst paramsSchema = z.object({\n prompts: z\n .array(z.string())\n .describe(\n 'List of 1-4 different parts of the codebase that could be useful to explore',\n ),\n})\n\nexport const fileExplorer = {\n id: AgentTemplateTypes.file_explorer,\n displayName: 'Dora the File Explorer',\n spawnPurposePrompt:\n 'Spawns multiple file picker agents in parallel to comprehensively explore the codebase from different perspectives',\n model: 'anthropic/claude-4-sonnet-20250522',\n outputMode: 'structured_output',\n includeMessageHistory: false,\n toolNames: ['spawn_agents', 'set_output'],\n spawnableAgents: ['file-picker'],\n inputSchema: {\n prompt: z\n .string()\n .describe('What you need to accomplish by exploring the codebase'),\n params: paramsSchema,\n },\n systemPrompt:\n 'You are a file explorer agent that spawns multiple file picker agents in parallel to comprehensively explore the codebase.',\n instructionsPrompt: '',\n stepPrompt: '',\n\n handleSteps: function* ({ prompt, params }) {\n const filePickerPrompts = params.prompts.map(\n (focusPrompt) =>\n `Based on the overall goal \"${prompt}\", find files related to this specific area: ${focusPrompt}`,\n )\n\n // Spawn all file pickers in parallel\n const { toolResult: spawnResult } = yield {\n toolName: 'spawn_agents' as const,\n args: {\n agents: filePickerPrompts.map((promptText) => ({\n agent_type: 'file-picker' as const,\n prompt: promptText,\n })),\n },\n }\n\n // Set output with aggregated results\n yield {\n toolName: 'set_output' as const,\n args: {\n results: spawnResult,\n },\n }\n },\n} satisfies AgentTemplate>\n", - "referencedBy": {} - } - ] - } - ] - }, - { - "type": "subagent_start", - "agentId": "D-QYfz6Uj58", - "agentType": "file-picker", - "displayName": "Fletcher the File Fetcher", - "onlyChild": false, - "parentAgentId": "main-agent", - "prompt": "package.json scripts for testing, linting, typechecking" - }, - { - "type": "subagent_start", - "agentId": "D-QYgBIs_zY", - "agentType": "code-searcher", - "displayName": "Code Searcher", - "onlyChild": false, - "parentAgentId": "main-agent", - "prompt": "", - "params": { - "searchQueries": [ - { - "pattern": "bun run typecheck|lint|test" - }, - { - "pattern": "AGENT_PERSONAS", - "flags": "-g *.ts" - } - ] - } - }, - { - "type": "tool_call", - "toolCallId": "b5cf7c6b-266d-4758-8e9e-069117fc61ec", - "toolName": "spawn_agents", - "input": { - "agents": [ - { - "agent_type": "file-lister", - "prompt": "package.json scripts for testing, linting, typechecking", - "params": {} - } - ] - }, - "agentId": "D-QYfz6Uj58", - "parentAgentId": "main-agent", - "includeToolCall": true - }, - { - "type": "subagent_start", - "agentId": "D-QYpeR_n1U", - "agentType": "file-lister", - "displayName": "Liszt the File Lister", - "onlyChild": true, - "parentAgentId": "D-QYfz6Uj58", - "prompt": "package.json scripts for testing, linting, typechecking", - "params": {} - }, - { - "type": "tool_call", - "toolCallId": "80170260-0f51-4267-aef7-85b48109a7cc", - "toolName": "code_search", - "input": { - "pattern": "bun run typecheck|lint|test" - }, - "agentId": "D-QYgBIs_zY", - "parentAgentId": "main-agent", - "includeToolCall": true - }, - { - "type": "tool_call", - "toolCallId": "df164364-63c0-4ef7-aac6-03342cfbf19c", - "toolName": "read_subtree", - "input": { - "paths": [], - "maxTokens": 500000 - }, - "agentId": "D-QYpeR_n1U", - "parentAgentId": "D-QYfz6Uj58", - "includeToolCall": true - }, - { - "type": "tool_result", - "toolCallId": "df164364-63c0-4ef7-aac6-03342cfbf19c", - "toolName": "read_subtree", - "output": [ - { - "type": "json", - "value": [ - { - "path": ".", - "type": "directory", - "printedTree": ".agents/\n examples/\n diff-reviewer-1.ts\n diff-reviewer-2.ts\n diff-reviewer-3.ts\n opensource/\n base.ts\n coder.ts\n file-picker.ts\n researcher.ts\n reviewer.ts\n thinker.ts\n ask.ts\n base-experimental.ts\n base-lite.ts\n base-max.ts\n base.ts\n brainstormer.ts\n changes-reviewer.ts\n charles.ts\n claude4-gemini-thinking.ts\n constants.ts\n file-explorer.ts\n file-picker.ts\n git-committer.ts\n knowledge-keeper.ts\n planner.ts\n researcher.ts\n reviewer.ts\n superagent.ts\n thinker.ts\n.bin/\n bun\n.github/\n workflows/\n ci.yml\n evals.yml\n nightly-evals.yml\n npm-app-release-build.yml\n npm-app-release-prod.yml\n npm-app-release-staging.yml\n .gitignore\n CODEOWNERS\n knowledge.md\n.vscode/\n settings.json\nbackend/\n src/\n __tests__/\n test-data/\n dex-go/\n edit-snippet.go\n expected.go\n original.go\n agent-id-resolution.test.ts\n agent-registry.test.ts\n auto-topup.test.ts\n credit-conversion.test.ts\n fast-rewrite.test.ts\n generate-diffs-prompt.test.ts\n get-custom-file-picker-config.test.ts\n live-user-inputs.test.ts\n loop-agent-steps.test.ts\n main-prompt.integration.test.ts\n main-prompt.test.ts\n process-file-block.test.ts\n process-str-replace.test.ts\n read-docs-tool.test.ts\n request-files-prompt.test.ts\n run-agent-step-tools.test.ts\n run-programmatic-step.test.ts\n sandbox-generator.test.ts\n subagent-streaming.test.ts\n test-utils.ts\n tool-call-schema.test.ts\n usage-calculation.test.ts\n web-search-tool.test.ts\n xml-stream-parser.test.ts\n admin/\n grade-runs.ts\n relabelRuns.ts\n api/\n org.ts\n usage.ts\n context/\n app-context.ts\n find-files/\n check-new-files-necessary.ts\n custom-file-picker-config.ts\n request-files-prompt.ts\n llm-apis/\n __tests__/\n linkup-api.test.ts\n vercel-ai-sdk/\n ai-sdk.ts\n openrouter.ts\n vertex-finetuned.ts\n claude.ts\n context7-api.ts\n gemini-with-fallbacks.ts\n knowledge.md\n linkup-api.ts\n message-cost-tracker.ts\n openai-api.ts\n openrouter.ts\n relace-api.ts\n system-prompt/\n agent-instructions.md\n prompts.ts\n save-agent-request.ts\n search-system-prompt.ts\n truncate-file-tree.ts\n templates/\n agents/\n archive/\n dry-run.ts\n agent-builder.ts\n ask.ts\n base.ts\n file-explorer.ts\n file-picker.ts\n planner.ts\n researcher.ts\n reviewer.ts\n superagent.ts\n thinker.ts\n thinking-base.ts\n agent-list.ts\n agent-registry.ts\n ask-prompts.ts\n base-prompts.ts\n prompts.ts\n README.md\n strings.ts\n types.ts\n tools/\n definitions/\n tool/\n add-message.ts\n add-subgoal.ts\n browser-logs.ts\n code-search.ts\n create-plan.ts\n end-turn.ts\n find-files.ts\n read-docs.ts\n read-files.ts\n run-file-change-hooks.ts\n run-terminal-command.ts\n set-messages.ts\n set-output.ts\n spawn-agent-inline.ts\n spawn-agents-async.ts\n spawn-agents.ts\n str-replace.ts\n think-deeply.ts\n update-subgoal.ts\n web-search.ts\n write-file.ts\n list.ts\n tool-def-type.ts\n handlers/\n tool/\n add-message.ts\n add-subgoal.ts\n browser-logs.ts\n code-search.ts\n create-plan.ts\n end-turn.ts\n find-files.ts\n read-docs.ts\n read-files.ts\n run-file-change-hooks.ts\n run-terminal-command.ts\n set-messages.ts\n set-output.ts\n spawn-agent-inline.ts\n spawn-agents-async.ts\n spawn-agents.ts\n str-replace.ts\n think-deeply.ts\n update-subgoal.ts\n web-search.ts\n write-file.ts\n handler-function-type.ts\n list.ts\n constants.ts\n prompts.ts\n stream-parser.ts\n tool-executor.ts\n util/\n __tests__/\n messages.test.ts\n object.test.ts\n parse-tool-call-xml.test.ts\n simplify-tool-results.test.ts\n split-data.test.ts\n check-auth.ts\n debug.ts\n file-resolver.ts\n logger.ts\n messages.ts\n object.ts\n parse-tool-call-xml.ts\n quickjs-sandbox.ts\n simplify-tool-results.ts\n split-data.ts\n token-counter.ts\n websockets/\n auth.ts\n middleware.ts\n request-context.ts\n server.ts\n switchboard.ts\n websocket-action.ts\n async-agent-manager.ts\n check-terminal-command.ts\n fast-rewrite.ts\n generate-diffs-prompt.ts\n get-documentation-for-query.ts\n get-file-reading-updates.ts\n index.ts\n live-user-inputs.ts\n loop-main-prompt.ts\n main-prompt.ts\n process-file-block.ts\n process-str-replace.ts\n prompt-agent-stream.ts\n run-agent-step.ts\n run-programmatic-step.ts\n xml-stream-parser.ts\n .gitignore\n knowledge.md\n package.json\n README.md\n tsconfig.json\ncommon/\n src/\n __tests__/\n agent-validation.test.ts\n dynamic-agent-template-schema.test.ts\n handlesteps-parsing.test.ts\n api-keys/\n constants.ts\n crypto.ts\n constants/\n agents.ts\n analytics-events.ts\n grant-priorities.ts\n db/\n migrations/\n meta/\n _journal.json\n 0000_snapshot.json\n 0001_snapshot.json\n 0002_snapshot.json\n 0003_snapshot.json\n 0004_snapshot.json\n 0005_snapshot.json\n 0006_snapshot.json\n 0007_snapshot.json\n 0008_snapshot.json\n 0009_snapshot.json\n 0010_snapshot.json\n 0011_snapshot.json\n 0012_snapshot.json\n 0013_snapshot.json\n 0014_snapshot.json\n 0015_snapshot.json\n 0016_snapshot.json\n 0017_snapshot.json\n 0018_snapshot.json\n 0019_snapshot.json\n 0020_snapshot.json\n 0021_snapshot.json\n 0026_snapshot.json\n 0027_snapshot.json\n 0028_snapshot.json\n 0000_overjoyed_thing.sql\n 0001_fuzzy_typhoid_mary.sql\n 0002_sticky_dormammu.sql\n 0003_military_owl.sql\n 0004_neat_pet_avengers.sql\n 0005_minor_the_professor.sql\n 0006_first_quasimodo.sql\n 0007_equal_warlock.sql\n 0008_puzzling_carnage.sql\n 0009_bitter_rumiko_fujikawa.sql\n 0010_overjoyed_red_skull.sql\n 0011_familiar_ezekiel_stane.sql\n 0012_fluffy_naoko.sql\n 0013_famous_risque.sql\n 0014_wakeful_sinister_six.sql\n 0015_stormy_zuras.sql\n 0016_clear_hairball.sql\n 0017_tricky_randall_flagg.sql\n 0018_stale_human_robot.sql\n 0019_amused_nebula.sql\n 0020_young_sleeper.sql\n 0021_tiny_marauders.sql\n 0026_chilly_mockingbird.sql\n 0027_sloppy_quasar.sql\n 0028_lush_johnny_blaze.sql\n docker-compose.yml\n drizzle.config.ts\n index.ts\n schema.knowledge.md\n schema.ts\n transaction.ts\n json-config/\n __tests__/\n __snapshots__/\n stringify-schema.test.ts.snap\n constants.test.ts\n stringify-schema.test.ts\n constants.ts\n default.ts\n stringify-schema.ts\n templates/\n agent-validation.ts\n dynamic-agent-functions.ts\n testing/\n mock-modules.ts\n tools/\n params/\n tool/\n add-message.ts\n add-subgoal.ts\n browser-logs.ts\n code-search.ts\n create-plan.ts\n end-turn.ts\n find-files.ts\n read-docs.ts\n read-files.ts\n run-file-change-hooks.ts\n run-terminal-command.ts\n set-messages.ts\n set-output.ts\n spawn-agent-inline.ts\n spawn-agents-async.ts\n spawn-agents.ts\n str-replace.ts\n think-deeply.ts\n update-subgoal.ts\n web-search.ts\n write-file.ts\n compile-tool-definitions.ts\n constants.ts\n list.ts\n utils.ts\n types/\n __tests__/\n dynamic-agent-template.test.ts\n api/\n agents/\n publish.ts\n agent-template.ts\n dynamic-agent-template.ts\n grant.ts\n message.ts\n organization.ts\n print-mode.ts\n publisher.ts\n referral.ts\n session-state.ts\n usage.ts\n util/\n __tests__/\n messages.test.ts\n partial-json-delta.test.ts\n saxy.test.ts\n string.test.ts\n examples/\n diff-reviewer-1.ts\n diff-reviewer-2.ts\n diff-reviewer-3.ts\n agent-file-utils.ts\n agent-name-normalization.ts\n agent-name-resolver.ts\n agent-template-validation.ts\n array.ts\n changes.ts\n credentials.ts\n currency.ts\n dates.ts\n error.ts\n file.ts\n git.ts\n logger.ts\n lru-cache.ts\n messages.ts\n min-heap.ts\n model-utils.ts\n object.ts\n partial-json-delta.ts\n patch.ts\n promise.ts\n random.ts\n referral.ts\n saxy.ts\n string.knowledge.md\n string.ts\n stripe.ts\n sync-failure.ts\n xml.ts\n zod-schema.ts\n websockets/\n websocket-client.ts\n websocket-schema.ts\n actions.ts\n analytics.ts\n browser-actions.ts\n constants.ts\n project-file-tree.ts\n knowledge.md\n package.json\n tsconfig.json\nevals/\n git-evals/\n email-eval-results.ts\n eval-codebuff.json\n eval-manifold.json\n eval-result-codebuff-mock.json\n gen-evals.ts\n judge-git-eval.ts\n post-eval-analysis.ts\n run-eval-set.ts\n run-git-evals.ts\n run-single-eval-process.ts\n run-single-eval.ts\n setup-test-repo.ts\n types.ts\n .gitignore\n bun.lock\n constants.ts\n e2e-cat-app-script.ts\n knowledge.md\n package.json\n scaffolding.ts\n swe-bench-eval.ts\n swe-bench-ids.ts\n swe-bench.test.ts\n test-repos.json\n test-setup.ts\n tsconfig.json\nnpm-app/\n release/\n index.js\n package.json\n README.md\n release-staging/\n index.js\n package.json\n README.md\n scripts/\n build-binary.js\n generate-github-token.ts\n patch-web-tree-sitter.ts\n release.js\n twitch-plays-codebuff.sh\n src/\n __tests__/\n display.test.ts\n tool-handlers.test.ts\n agents/\n agent-utils.ts\n load-agents.ts\n checkpoints/\n checkpoint-manager.ts\n file-manager.ts\n cli-handlers/\n agent-creation-chat.ts\n agents.ts\n api-key.ts\n checkpoint.ts\n diff.ts\n easter-egg.ts\n inititalization-flow.ts\n mini-chat.ts\n publish.ts\n subagent-list.ts\n subagent.ts\n display/\n overrides.ts\n print-mode.ts\n squash-newlines.ts\n json-config/\n hooks.ts\n parser.ts\n native/\n ripgrep.ts\n terminal/\n background.ts\n run-command.ts\n utils/\n __tests__/\n __snapshots__/\n background-process-manager.test.ts.snap\n frustration-detector.test.ts.snap\n rage-detector.test.ts.snap\n xml-stream-parser.test.ts.snap\n background-process-manager.test.ts\n rage-detector.test.ts\n response-example-4-files.txt\n tool-renderers.test.ts\n xml-stream-parser.test.ts\n agent-validation.ts\n analytics.ts\n detect-shell.ts\n git.ts\n logger.ts\n rage-detector.ts\n spinner.ts\n suppress-console.ts\n system-info.ts\n terminal.ts\n tool-renderers.ts\n with-hang-detection.ts\n xml-stream-parser.ts\n workers/\n checkpoint-worker.ts\n project-context.ts\n background-process-manager.ts\n browser-runner.ts\n chat-storage.ts\n cli-definitions.ts\n cli.ts\n client.ts\n config.ts\n create-template-project.ts\n credentials.ts\n dev-process-manager.ts\n diff-manager.ts\n fingerprint.ts\n index.ts\n menu.ts\n project-files.ts\n rage-detectors.ts\n startup-process-handler.ts\n subagent-storage.ts\n tool-handlers.ts\n types.ts\n web-scraper.ts\n .gitignore\n bunfig.toml\n package.json\n tsconfig.json\npackages/\n bigquery/\n src/\n client.ts\n index.ts\n schema.ts\n knowledge.md\n package.json\n tsconfig.json\n billing/\n src/\n __tests__/\n credit-delegation.test.ts\n extract-owner-repo.test.ts\n org-billing.test.ts\n auto-topup.ts\n balance-calculator.ts\n billing.knowledge.md\n conversion.ts\n credit-delegation.ts\n grant-credits.knowledge.md\n grant-credits.ts\n index.ts\n org-billing.ts\n org-monitoring.ts\n usage-service.ts\n utils.ts\n knowledge.md\n package.json\n project.json\n tsconfig.json\n build-tools/\n executors/\n infisical-run/\n executor.ts\n schema.json\n executors.json\n package.json\n project.json\n tsconfig.json\n code-map/\n __tests__/\n test-langs/\n test.c\n test.cpp\n test.cs\n test.go\n test.java\n test.js\n test.php\n test.py\n test.rb\n test.rs\n test.ts\n languages.test.ts\n parse.test.ts\n src/\n tree-sitter-queries/\n readme.md\n tree-sitter-c_sharp-tags.scm\n tree-sitter-c-tags.scm\n tree-sitter-cpp-tags.scm\n tree-sitter-go-tags.scm\n tree-sitter-java-tags.scm\n tree-sitter-javascript-tags.scm\n tree-sitter-php-tags.scm\n tree-sitter-python-tags.scm\n tree-sitter-ruby-tags.scm\n tree-sitter-rust-tags.scm\n tree-sitter-typescript-tags.scm\n index.ts\n languages.ts\n parse.ts\n package.json\n tsconfig.json\n internal/\n src/\n loops/\n client.ts\n index.ts\n types.ts\n openrouter-ai-sdk/\n internal/\n index.ts\n schemas/\n reasoning-details.ts\n types/\n index.ts\n openrouter-chat-completions-input.ts\n openrouter-chat-settings.ts\n .gitignore\n convert-to-openrouter-chat-messages.test.ts\n convert-to-openrouter-chat-messages.ts\n convert-to-openrouter-completion-prompt.ts\n index.ts\n map-openrouter-chat-logprobs.ts\n map-openrouter-completion-logprobs.ts\n map-openrouter-finish-reason.ts\n openrouter-chat-language-model.test.ts\n openrouter-chat-language-model.ts\n openrouter-completion-language-model.test.ts\n openrouter-completion-language-model.ts\n openrouter-completion-settings.ts\n openrouter-error.ts\n openrouter-facade.ts\n openrouter-provider-options.test.ts\n openrouter-provider.ts\n openrouter-stream-usage-accounting.test.ts\n openrouter-usage-accounting.test.ts\n utils/\n __tests__/\n version-utils.test.ts\n auth.ts\n version-utils.ts\n xml-parser.ts\n env.ts\n index.ts\n knowledge.md\n package.json\n tsconfig.json\npython-app/\n src/\n codebuff/\n __init__.py\n .gitignore\n knowledge.md\n LICENSE\n pyproject.toml\n README.md\nscripts/\n changelog/\n 2025-05-18-version-10283-release-enhanced-assistant-experience-system-stability.mdx\n 2025-05-25-version-10295-enhanced-ai-models-and-user-experience-improvements.mdx\n 2025-06-01-version-10305-release-enhanced-ai-models-new-commands-and-performance-improvements.mdx\n docs.json\n ft-file-selection/\n .gitignore\n collect-tuning-data.ts\n grade-traces.ts\n print-recent-relabels.ts\n print-recent-traces.ts\n README.md\n relabel-for-offline-scoring.ts\n relabel-traces-with-context.ts\n relabel-traces.ts\n .gitignore\n analyze-edit-blocks.ts\n analyze-model-usage.ts\n apply-credit-migration.ts\n calculate-average-spend.ts\n calculate-dau.ts\n calculate-monthly-usage.ts\n calculate-mrr.ts\n calculate-weekly-usage.ts\n cleanup-worktree.sh\n convert-escaped-newlines.ts\n count-edit-file.ts\n debug-log-subset.ts\n dev.sh\n export-user-emails.ts\n generate-ci-env.js\n generate-tool-definitions.ts\n get-changelog.ts\n init-worktree.ts\n package.json\n tsconfig.json\n update-stripe-subscriptions.ts\nsdk/\n scripts/\n publish.js\n src/\n tools/\n change-file.ts\n read-files.ts\n types/\n agent-definition.ts\n tools.ts\n client.ts\n constants.ts\n index.ts\n process-stream.ts\n websocket-client.ts\n .npmignore\n CHANGELOG.md\n package.json\n PUBLISHING.md\n README.md\n tsconfig.json\nweb/\n public/\n codebuff-intro1.webm\n scripts/\n discord/\n index.ts\n register-commands.ts\n src/\n __tests__/\n e2e/\n home.spec.ts\n unit/\n home.spec.tsx\n actions/\n hello-action.ts\n app/\n [sponsee]/\n page.tsx\n admin/\n file-picker/\n page.tsx\n orgs/\n page.tsx\n traces/\n components/\n chat-message.tsx\n client-session-viewer.tsx\n empty-state.tsx\n error-boundary.tsx\n loading-skeletons.tsx\n timeline-chart.module.css\n timeline-chart.tsx\n trace-viewer.tsx\n utils/\n __tests__/\n trace-processing.test.ts\n trace-processing.ts\n page.tsx\n layout.tsx\n affiliates/\n actions.ts\n page.tsx\n agents/\n page.tsx\n api/\n admin/\n orgs/\n [orgId]/\n features/\n [feature]/\n route.ts\n export/\n route.ts\n route.ts\n relabel-for-user/\n route.ts\n traces/\n [clientRequestId]/\n messages/\n route.ts\n timeline/\n route.ts\n client/\n [clientId]/\n sessions/\n route.ts\n admin-auth.ts\n agents/\n [publisherId]/\n [agentId]/\n [version]/\n route.ts\n latest/\n route.ts\n publish/\n route.ts\n validate/\n route.ts\n route.ts\n api-keys/\n route.ts\n auth/\n [...nextauth]/\n auth-options.ts\n route.ts\n cli/\n code/\n route.ts\n logout/\n route.ts\n status/\n route.ts\n feed/\n route.ts\n git-evals/\n visibility/\n route.ts\n route.ts\n healthz/\n route.ts\n invites/\n [token]/\n route.ts\n orgs/\n [orgId]/\n alerts/\n [alertId]/\n dismiss/\n route.ts\n route.ts\n analytics/\n export/\n route.ts\n route.ts\n billing/\n setup/\n route.ts\n status/\n route.ts\n subscription/\n route.ts\n credits/\n route.ts\n invitations/\n [email]/\n resend/\n route.ts\n route.ts\n bulk/\n route.ts\n route.ts\n members/\n [userId]/\n route.ts\n route.ts\n monitoring/\n route.ts\n publishers/\n route.ts\n repos/\n [repoId]/\n route.ts\n route.ts\n settings/\n route.ts\n usage/\n export/\n route.ts\n route.ts\n route.ts\n slug/\n [slug]/\n route.ts\n route.ts\n publishers/\n [id]/\n organization/\n route.ts\n validate/\n route.ts\n route.ts\n referrals/\n [code]/\n route.ts\n helpers.ts\n route.ts\n stripe/\n buy-credits/\n route.ts\n webhook/\n route.ts\n upload/\n avatar/\n route.ts\n user/\n auto-topup/\n route.ts\n profile/\n route.ts\n usage/\n route.ts\n config/\n page.tsx\n docs/\n [category]/\n layout.tsx\n metadata.ts\n page.tsx\n layout.tsx\n page.tsx\n evals/\n evals-table.tsx\n page.tsx\n invites/\n [token]/\n page.tsx\n login/\n page.tsx\n onboard/\n page.tsx\n orgs/\n [slug]/\n analytics/\n page.tsx\n billing/\n purchase/\n page.tsx\n setup/\n page.tsx\n repositories/\n page.tsx\n settings/\n page.tsx\n team/\n page.tsx\n usage/\n page.tsx\n page.tsx\n new/\n page.tsx\n page.tsx\n payment-success/\n page.tsx\n pricing/\n page.tsx\n privacy-policy/\n page.tsx\n publishers/\n [id]/\n agents/\n [agentId]/\n [version]/\n page.tsx\n page.tsx\n new/\n page.tsx\n page.tsx\n referrals/\n [code]/\n metadata.ts\n page.tsx\n layout.tsx\n page.tsx\n terms-of-service/\n page.tsx\n usage/\n layout.tsx\n page.tsx\n usage-display.tsx\n analytics.knowledge.md\n layout.tsx\n page.tsx\n robots.ts\n sitemap.ts\n components/\n agent/\n json-viewer.tsx\n auto-topup/\n AutoTopupSettings.tsx\n AutoTopupSettingsForm.tsx\n AutoTopupSwitch.tsx\n BaseAutoTopupSettings.tsx\n BaseAutoTopupSettingsForm.tsx\n BaseAutoTopupSwitch.tsx\n constants.ts\n OrgAutoTopupSettings.tsx\n OrgAutoTopupSettingsForm.tsx\n OrgAutoTopupSwitch.tsx\n types.ts\n credits/\n CreditManagementSection.tsx\n CreditPurchaseSection.tsx\n docs/\n mdx/\n code-demo.tsx\n custom-link.tsx\n markdown-table.tsx\n mdx-components.tsx\n mermaid-diagram.tsx\n schema-display.tsx\n copy-heading.tsx\n doc-sidebar.tsx\n docs.knowledge.md\n toc.tsx\n login/\n login-card.tsx\n login-client-wrapper.tsx\n navbar/\n navbar.tsx\n user-dropdown.tsx\n organization/\n advanced-monitor.tsx\n billing-alerts.tsx\n billing-reports.tsx\n billing-status.tsx\n credit-monitor.tsx\n model-config-sheet.tsx\n organization-success-modal.tsx\n repository-management.tsx\n team-management.tsx\n providers/\n query-client-provider.tsx\n publisher/\n basic-info-step.tsx\n ownership-step.tsx\n profile-details-step.tsx\n step-template.tsx\n sign-in/\n sign-in-button.tsx\n sign-in-card-footer.tsx\n ui/\n landing/\n competition/\n claude-code.tsx\n cline.tsx\n cursor.tsx\n github-copilot.tsx\n index.tsx\n tabs.tsx\n feature/\n browser-comparison.tsx\n chart-illustration.tsx\n code-illustration.tsx\n highlight-text.tsx\n index.tsx\n workflow-illustration.tsx\n animated-element.tsx\n constants.ts\n cta-section.tsx\n demo-code-display.tsx\n testimonials-section.tsx\n types.ts\n terminal/\n index.tsx\n style.css\n terminal-input.tsx\n terminal-output.tsx\n avatar-upload.tsx\n background-beams.tsx\n badge.tsx\n banner.tsx\n button.tsx\n card.tsx\n collapsible.tsx\n credit-confetti.tsx\n decorative-blocks.tsx\n dialog.tsx\n dropdown-menu.tsx\n enhanced-copy-button.tsx\n footer.tsx\n hero-buttons.tsx\n hero.tsx\n input.tsx\n install-dialog.tsx\n label.tsx\n neon-gradient-button.tsx\n progress.tsx\n radio-group.tsx\n section.tsx\n select.tsx\n separator.tsx\n sheet.tsx\n sidebar.tsx\n skeleton-loading.tsx\n skeleton.tsx\n slider.tsx\n switch.tsx\n table.tsx\n tabs.tsx\n textarea.tsx\n toast.tsx\n toaster.tsx\n tooltip.tsx\n use-toast.ts\n BrowserPreview.tsx\n card-with-beams.tsx\n CookieConsentCard.tsx\n footer.tsx\n icons.tsx\n IDEDemo.tsx\n layout-wrapper.tsx\n TerminalDemo.tsx\n theme-provider.tsx\n theme-switcher.tsx\n content/\n advanced/\n claude-code-comparison.mdx\n config.mdx\n how-does-it-work.mdx\n large-projects.mdx\n troubleshooting.mdx\n what-models.mdx\n agents/\n agent-reference.mdx\n creating-new-agents.mdx\n customizing-agents.mdx\n overview.mdx\n troubleshooting-agent-customization.mdx\n case-studies/\n _cta.mdx\n benjamin-bryant.mdx\n oliver-lukesch.mdx\n help/\n faq.mdx\n getting-started.mdx\n tips/\n best-practices.mdx\n keyboard-shortcuts.mdx\n knowledge-files.mdx\n other-use-cases.mdx\n version-control.mdx\n where-codebuff-shines.mdx\n discord/\n client.ts\n rate-limiter.ts\n hooks/\n use-auto-topup.ts\n use-install-dialog.ts\n use-mobile.tsx\n use-model-config.ts\n use-org-auto-topup.ts\n use-organization-data.ts\n use-user-profile.ts\n lib/\n server/\n referral.ts\n validators/\n publisher.ts\n admin-auth.ts\n constant.ts\n currency.ts\n docs.ts\n fonts.ts\n organization-permissions.ts\n PostHogProvider.tsx\n publisher-permissions.ts\n remark-code-to-codedemo.ts\n server-init.ts\n SessionProvider.tsx\n stripe-utils.ts\n testimonials.ts\n trackConversions.ts\n utils.ts\n styles/\n globals.css\n types/\n docs.ts\n user.ts\n util/\n logger.ts\n .eslintignore\n .eslintrc.js\n .gitignore\n .prettierignore\n .prettierrc.js\n commitlint.config.js\n components.json\n contentlayer.config.ts\n jest.config.js\n jest.setup.js\n knowledge.md\n next.config.mjs\n package.json\n playwright.config.ts\n postcss.config.cjs\n README.md\n tailwind.config.ts\n tsconfig.json\n.envrc\n.gitignore\n.infisical.json\n.prettierrc\nauthentication.knowledge.md\nbun.lock\nbunfig.toml\ncodebuff.json\neslint.config.js\nknowledge.md\npackage.json\nREADME.md\ntsconfig.base.json\ntsconfig.json\nWINDOWS.md\n", - "tokenCount": 9007, - "truncationLevel": "none" - } - ] - } - ], - "parentAgentId": "D-QYpeR_n1U" - }, - { - "type": "tool_result", - "toolCallId": "80170260-0f51-4267-aef7-85b48109a7cc", - "toolName": "code_search", - "output": [ - { - "type": "json", - "value": { - "stdout": ".github/workflows/ci.yml:\n1:# This workflow runs CI checks including building, typechecking, and testing the codebase\n18: runs-on: ubuntu-latest\n51: echo \"NEXT_PUBLIC_CB_ENVIRONMENT=test\" >> $GITHUB_ENV\n80: # Template for test jobs\n81: test:\n90: name: test-${{ matrix.package }}\n91: runs-on: ubuntu-latest\n124: echo \"NEXT_PUBLIC_CB_ENVIRONMENT=test\" >> $GITHUB_ENV\n128: - name: Run ${{ matrix.package }} tests\n133: command: cd ${{ matrix.package }} && find src -name '*.test.ts' ! -name '*.integration.test.ts' | sort | xargs -I {} bun test {}\n140: # Integration tests job\n141: test-integration:\n150: name: test-integration-${{ matrix.package }}\n151: runs-on: ubuntu-latest\n184: echo \"NEXT_PUBLIC_CB_ENVIRONMENT=test\" >> $GITHUB_ENV\n\n.agents/base-max.ts:\n70:- You are not the only one making changes to files. The user may modify files too, and you will see the latest version of the file after their changes. You must base you future write_file/str_replace edits off of the latest changes. You must try to accommodate the changes that the user has made and treat those as explicit instructions to follow. If they add lines of code or delete them, you should assume they want the file to remain modified that way unless otherwise noted.\n108:- **Package Management:** When adding new packages, use the run_terminal_command tool to install the package rather than editing the package.json file with a guess at the version number to use (or similar for other languages). This way, you will be sure to have the latest version of the package. Do not install packages globally unless asked by the user (e.g. Don\\'t run \\`npm install -g \\`). Always try to use the package manager associated with the project (e.g. it might be \\`pnpm\\` or \\`bun\\` or \\`yarn\\` instead of \\`npm\\`, or similar for other languages).\n110:- **Testing:** If you create a unit test, you should run it using \\`run_terminal_command\\` to see if it passes, and fix it if it doesn\\'t.\n149:Check the knowledge files to see if the user has specified a further protocol for what terminal commands should be run to verify edits. For example, a \\`knowledge.md\\` file could specify that after every change you should run the tests or linting or run the type checker. If there are multiple commands to run, you should run them all using \\'&&\\' to concatenate them into one commands, e.g. \\`npm run lint && npm run test\\`.\n310:If the user had knowledge files (or CLAUDE.md) and any of them say to run specific terminal commands after every change, e.g. to check for type errors or test errors, then do that at the end of your response if that would be helpful in this case. No need to run these checks for simple changes.\n\n./npm-app/src/cli-handlers/checkpoint.ts:\n189: const latestCheckpoint = checkpointManager.getLatestCheckpoint()\n190: await latestCheckpoint?.fileStateIdPromise\n198: 'Failed to wait for latest checkpoint file state',\n243: await checkpointManager.getLatestCheckpoint().fileStateIdPromise\n245: // No latest checkpoint available, previous checkpoint is guaranteed to be done.\n\n.github/workflows/nightly-evals.yml:\n11: runs-on: ubuntu-latest\n45: echo \"NEXT_PUBLIC_CB_ENVIRONMENT=test\" >> $GITHUB_ENV\n\n./npm-app/src/cli-handlers/agent-creation-chat.ts:\n108: 'Continue adjusting your agent here, or type \"/agents\" to switch agents and test it out.',\n\n.agents/base-experimental.ts:\n70:- You are not the only one making changes to files. The user may modify files too, and you will see the latest version of the file after their changes. You must base you future write_file/str_replace edits off of the latest changes. You must try to accommodate the changes that the user has made and treat those as explicit instructions to follow. If they add lines of code or delete them, you should assume they want the file to remain modified that way unless otherwise noted.\n108:- **Package Management:** When adding new packages, use the run_terminal_command tool to install the package rather than editing the package.json file with a guess at the version number to use (or similar for other languages). This way, you will be sure to have the latest version of the package. Do not install packages globally unless asked by the user (e.g. Don\\'t run \\`npm install -g \\`). Always try to use the package manager associated with the project (e.g. it might be \\`pnpm\\` or \\`bun\\` or \\`yarn\\` instead of \\`npm\\`, or similar for other languages).\n110:- **Testing:** If you create a unit test, you should run it using \\`run_terminal_command\\` to see if it passes, and fix it if it doesn\\'t.\n149:Check the knowledge files to see if the user has specified a further protocol for what terminal commands should be run to verify edits. For example, a \\`knowledge.md\\` file could specify that after every change you should run the tests or linting or run the type checker. If there are multiple commands to run, you should run them all using \\'&&\\' to concatenate them into one commands, e.g. \\`npm run lint && npm run test\\`.\n318:If the user had knowledge files (or CLAUDE.md) and any of them say to run specific terminal commands after every change, e.g. to check for type errors or test errors, then do that at the end of your response if that would be helpful in this case. No need to run these checks for simple changes.\n\n.agents/ask.ts:\n62:- You are not the only one making changes to files. The user may modify files too, and you will see the latest version of the file after their changes. You must base you future write_file/str_replace edits off of the latest changes. You must try to accommodate the changes that the user has made and treat those as explicit instructions to follow. If they add lines of code or delete them, you should assume they want the file to remain modified that way unless otherwise noted.\n123:Check the knowledge files to see if the user has specified a further protocol for what terminal commands should be run to verify edits. For example, a \\`knowledge.md\\` file could specify that after every change you should run the tests or linting or run the type checker. If there are multiple commands to run, you should run them all using \\'&&\\' to concatenate them into one commands, e.g. \\`npm run lint && npm run test\\`.\n\n.github/workflows/npm-app-release-build.yml:\n34: - os: ubuntu-latest\n39: - os: ubuntu-latest\n54: - os: windows-latest\n129: # Only test if we're building for the native architecture\n131: echo \"Skipping test for cross-compiled ARM64 binary\"\n\n./npm-app/src/cli-handlers/subagent-list.ts:\n197: const testLine =\n200: testLine.replace(/\\u001b\\[[0-9;]*m/g, '').length <=\n203: currentLine = testLine\n233: const testLine = `${currentLine} ${word}`\n235: testLine.replace(/\\u001b\\[[0-9;]*m/g, '').length <= maxLineLength\n237: currentLine = testLine\n\n.github/workflows/npm-app-release-staging.yml:\n18: runs-on: ubuntu-latest\n57: # Get latest beta version from npm to check if we need to increment\n58: echo \"Fetching latest beta version from npm...\"\n59: LATEST_BETA=$(npm view codecane@latest version 2>/dev/null || echo \"\")\n65: echo \"Latest beta version: $LATEST_BETA\"\n143: runs-on: ubuntu-latest\n228: \\\"body\\\": \\\"## Codecane v${{ needs.prepare-and-commit-staging.outputs.new_version }} (Staging)\\n\\n**⚠️ This is a staging/beta release for testing purposes.**\\n\\nBinary releases for all supported platforms.\\n\\n### Installation\\n\\`\\`\\`bash\\nnpm install -g codecane\\n\\`\\`\\`\\n\\n### Platform Binaries\\n- \\`codecane-linux-x64.tar.gz\\` - Linux x64\\n- \\`codecane-linux-arm64.tar.gz\\` - Linux ARM64\\n- \\`codecane-darwin-x64.tar.gz\\` - macOS Intel\\n- \\`codecane-darwin-arm64.tar.gz\\` - macOS Apple Silicon\\n- \\`codecane-win32-x64.tar.gz\\` - Windows x64\\\",\n258: runs-on: ubuntu-latest\n\n.github/workflows/evals.yml:\n9: runs-on: ubuntu-latest\n61: echo \"NEXT_PUBLIC_CB_ENVIRONMENT=test\" >> $GITHUB_ENV\n\n.github/workflows/npm-app-release-prod.yml:\n22: runs-on: ubuntu-latest\n105: runs-on: ubuntu-latest\n150: runs-on: ubuntu-latest\n\n./npm-app/src/menu.ts:\n400:${hasKnowledgeMd && !hasCodebuffJson ? `\\n${yellow(`${codebuffConfigFile} runs deployment scripts for you to test your code and runs configured checks for you by running your dev server.`)}` : ''}\n402:${!hasKnowledgeMd && !hasCodebuffJson ? `\\n${yellow('knowledge.md helps Codebuff understand your project structure and codebase better for better results.')}\\n${yellow(`${codebuffConfigFile} runs deployment scripts for you to test your code and runs configured checks for you by running your dev server.`)}` : ''}`\n422:${cyan(' • \"Create a unit test for the auth module\"')}\n\n.github/knowledge.md:\n8:2. **Test Job**: Runs tests for npm-app, backend, and common packages in parallel using matrix strategy\n27:Each test job:\n29:- Runs unit tests only (excludes integration tests)\n31:- Sets `CODEBUFF_GITHUB_ACTIONS=true` and `NEXT_PUBLIC_CB_ENVIRONMENT=test`\n37:- Test environment flags are set for proper test execution\n42:- Build job must complete before test jobs start (`needs: build`)\n87: bun act -j test-backend\n135:2. If tests fail with environment issues:\n153:6. Use the retry mechanism for flaky tests\n\n./npm-app/src/create-template-project.ts:\n20: if (!/^[a-zA-Z0-9-_]+$/.test(template)) {\n36: if (!/^[a-zA-Z0-9-_]+$/.test(projectName)) {\n\n./npm-app/src/client.ts:\n126: console.log('Make sure you are on the latest version of Codebuff!')\n1121: )}: Runs tests, linting, and type checking when you modify files\\n• ${bold(\n1373: checkpointAddendum = ` or \"checkpoint ${checkpointManager.getLatestCheckpoint().id}\" to revert`\n1375: // No latest checkpoint, don't show addendum\n1382: 'No latest checkpoint for addendum',\n\n.agents/base-lite.ts:\n70:- You are not the only one making changes to files. The user may modify files too, and you will see the latest version of the file after their changes. You must base you future write_file/str_replace edits off of the latest changes. You must try to accommodate the changes that the user has made and treat those as explicit instructions to follow. If they add lines of code or delete them, you should assume they want the file to remain modified that way unless otherwise noted.\n108:- **Package Management:** When adding new packages, use the run_terminal_command tool to install the package rather than editing the package.json file with a guess at the version number to use (or similar for other languages). This way, you will be sure to have the latest version of the package. Do not install packages globally unless asked by the user (e.g. Don\\'t run \\`npm install -g \\`). Always try to use the package manager associated with the project (e.g. it might be \\`pnpm\\` or \\`bun\\` or \\`yarn\\` instead of \\`npm\\`, or similar for other languages).\n110:- **Testing:** If you create a unit test, you should run it using \\`run_terminal_command\\` to see if it passes, and fix it if it doesn\\'t.\n149:Check the knowledge files to see if the user has specified a further protocol for what terminal commands should be run to verify edits. For example, a \\`knowledge.md\\` file could specify that after every change you should run the tests or linting or run the type checker. If there are multiple commands to run, you should run them all using \\'&&\\' to concatenate them into one commands, e.g. \\`npm run lint && npm run test\\`.\n312:If the user had knowledge files (or CLAUDE.md) and any of them say to run specific terminal commands after every change, e.g. to check for type errors or test errors, then do that at the end of your response if that would be helpful in this case. No need to run these checks for simple changes.\n\n.agents/claude4-gemini-thinking.ts:\n65:- You are not the only one making changes to files. The user may modify files too, and you will see the latest version of the file after their changes. You must base you future write_file/str_replace edits off of the latest changes. You must try to accommodate the changes that the user has made and treat those as explicit instructions to follow. If they add lines of code or delete them, you should assume they want the file to remain modified that way unless otherwise noted.\n103:- **Package Management:** When adding new packages, use the run_terminal_command tool to install the package rather than editing the package.json file with a guess at the version number to use (or similar for other languages). This way, you will be sure to have the latest version of the package. Do not install packages globally unless asked by the user (e.g. Don\\'t run \\`npm install -g \\`). Always try to use the package manager associated with the project (e.g. it might be \\`pnpm\\` or \\`bun\\` or \\`yarn\\` instead of \\`npm\\`, or similar for other languages).\n105:- **Testing:** If you create a unit test, you should run it using \\`run_terminal_command\\` to see if it passes, and fix it if it doesn\\'t.\n144:Check the knowledge files to see if the user has specified a further protocol for what terminal commands should be run to verify edits. For example, a \\`knowledge.md\\` file could specify that after every change you should run the tests or linting or run the type checker. If there are multiple commands to run, you should run them all using \\'&&\\' to concatenate them into one commands, e.g. \\`npm run lint && npm run test\\`.\n305:If the user had knowledge files (or CLAUDE.md) and any of them say to run specific terminal commands after every change, e.g. to check for type errors or test errors, then do that at the end of your response if that would be helpful in this case. No need to run these checks for simple changes.\n\n.agents/reviewer.ts:\n39:4. Always run hooks for TypeScript/JavaScript changes, test file changes, or when the changes could affect compilation/tests\n\n./npm-app/src/__tests__/display.test.ts:\n1:import { describe, expect, it } from 'bun:test'\n\n.agents/types/tools.d.ts:\n56: /** Optional ripgrep flags to customize the search (e.g., \"-i\" for case-insensitive, \"-t ts\" for TypeScript files only, \"-A 3\" for 3 lines after match, \"-B 2\" for 2 lines before match, \"--type-not test\" to exclude test files). */\n\n.agents/base.ts:\n70:- You are not the only one making changes to files. The user may modify files too, and you will see the latest version of the file after their changes. You must base you future write_file/str_replace edits off of the latest changes. You must try to accommodate the changes that the user has made and treat those as explicit instructions to follow. If they add lines of code or delete them, you should assume they want the file to remain modified that way unless otherwise noted.\n108:- **Package Management:** When adding new packages, use the run_terminal_command tool to install the package rather than editing the package.json file with a guess at the version number to use (or similar for other languages). This way, you will be sure to have the latest version of the package. Do not install packages globally unless asked by the user (e.g. Don\\'t run \\`npm install -g \\`). Always try to use the package manager associated with the project (e.g. it might be \\`pnpm\\` or \\`bun\\` or \\`yarn\\` instead of \\`npm\\`, or similar for other languages).\n110:- **Testing:** If you create a unit test, you should run it using \\`run_terminal_command\\` to see if it passes, and fix it if it doesn\\'t.\n149:Check the knowledge files to see if the user has specified a further protocol for what terminal commands should be run to verify edits. For example, a \\`knowledge.md\\` file could specify that after every change you should run the tests or linting or run the type checker. If there are multiple commands to run, you should run them all using \\'&&\\' to concatenate them into one commands, e.g. \\`npm run lint && npm run test\\`.\n310:If the user had knowledge files (or CLAUDE.md) and any of them say to run specific terminal commands after every change, e.g. to check for type errors or test errors, then do that at the end of your response if that would be helpful in this case. No need to run these checks for simple changes.\n\n./backend/src/live-user-inputs.ts:\n88:// For testing purposes - reset all state\n\n./backend/src/__tests__/live-user-inputs.test.ts:\n1:import { describe, it, expect, beforeEach, afterEach } from 'bun:test'\n15: // Clear any existing state before each test\n20: // Clean up any state after each test\n95: // For unit testing, we'll test the function directly\n105: // For unit testing, we'll test that endUserInput doesn't remove the input\n\n./backend/src/llm-apis/message-cost-tracker.ts:\n245: 'Skipping Stripe sync (no user or test user).',\n591: `Credits used by test user (${creditsUsed})`,\n\n./backend/src/__tests__/loop-agent-steps.test.ts:\n6:} from '@codebuff/common/testing/mock-modules'\n18:} from 'bun:test'\n22:import { mockFileContext, MockWebSocket } from './test-utils'\n66: // Mock live user inputs - will be overridden in individual tests\n68: checkLiveUserInput: () => false, // Default to false, override in tests\n136: processedRepoId: 'test-repo-id',\n\n[Output size limit reached.]", - "message": "Stopped early after 110 match(es)." - } - } - ], - "parentAgentId": "D-QYgBIs_zY" - }, - { - "type": "tool_call", - "toolCallId": "41c2f662-c174-4235-9585-75e3588576c6", - "toolName": "code_search", - "input": { - "pattern": "AGENT_PERSONAS", - "flags": "-g *.ts" - }, - "agentId": "D-QYgBIs_zY", - "parentAgentId": "main-agent", - "includeToolCall": true - }, - { - "type": "tool_result", - "toolCallId": "41c2f662-c174-4235-9585-75e3588576c6", - "toolName": "code_search", - "output": [ - { - "type": "json", - "value": { - "stdout": "./backend/src/templates/agents/planner.ts:\n1:import { AGENT_PERSONAS } from '@codebuff/common/constants/agents'\n12: displayName: AGENT_PERSONAS.planner.displayName,\n13: spawnPurposePrompt: AGENT_PERSONAS.planner.purpose,\n\n./backend/src/templates/agents/superagent.ts:\n1:import { AGENT_PERSONAS } from '@codebuff/common/constants/agents'\n15: displayName: AGENT_PERSONAS.superagent.displayName,\n16: spawnPurposePrompt: AGENT_PERSONAS.superagent.purpose,\n\n./backend/src/templates/agents/ask.ts:\n1:import { AGENT_PERSONAS } from '@codebuff/common/constants/agents'\n17: displayName: AGENT_PERSONAS.ask.displayName,\n\n./backend/src/templates/agents/thinking-base.ts:\n1:import { AGENT_PERSONAS } from '@codebuff/common/constants/agents'\n19: displayName: AGENT_PERSONAS.base_lite.displayName,\n20: spawnPurposePrompt: AGENT_PERSONAS.base_lite.purpose,\n\n./backend/src/templates/agents/reviewer.ts:\n1:import { AGENT_PERSONAS } from '@codebuff/common/constants/agents'\n12: displayName: AGENT_PERSONAS.reviewer.displayName,\n13: spawnPurposePrompt: AGENT_PERSONAS.reviewer.purpose,\n\n./backend/src/templates/agents/thinker.ts:\n1:import { AGENT_PERSONAS } from '@codebuff/common/constants/agents'\n12: displayName: AGENT_PERSONAS.thinker.displayName,\n13: spawnPurposePrompt: AGENT_PERSONAS.thinker.purpose,\n\n./backend/src/templates/agents/archive/dry-run.ts:\n1:import { AGENT_PERSONAS } from '@codebuff/common/constants/agents'\n11: displayName: AGENT_PERSONAS.dry_run.displayName,\n12: spawnPurposePrompt: AGENT_PERSONAS.dry_run.purpose,\n\n./backend/src/templates/agents/researcher.ts:\n1:import { AGENT_PERSONAS } from '@codebuff/common/constants/agents'\n12: displayName: AGENT_PERSONAS.researcher.displayName,\n13: spawnPurposePrompt: AGENT_PERSONAS.researcher.purpose,\n\n./backend/src/templates/agents/base.ts:\n1:import { AGENT_PERSONAS } from '@codebuff/common/constants/agents'\n19: displayName: AGENT_PERSONAS.base.displayName,\n20: spawnPurposePrompt: AGENT_PERSONAS.base.purpose,\n\n./backend/src/templates/agents/file-picker.ts:\n1:import { AGENT_PERSONAS } from '@codebuff/common/constants/agents'\n11: displayName: AGENT_PERSONAS.file_picker.displayName,\n12: spawnPurposePrompt: AGENT_PERSONAS.file_picker.purpose,\n\n./common/src/constants/agents.ts:\n4:export const AGENT_PERSONAS = {\n90:// Agent IDs list from AGENT_PERSONAS keys\n92: AGENT_PERSONAS,\n93:) as (keyof typeof AGENT_PERSONAS)[]\n100: Object.entries(AGENT_PERSONAS).map(([agentType, persona]) => [\n104:) as Record\n107: (typeof AGENT_PERSONAS)[keyof typeof AGENT_PERSONAS]['displayName']\n112: Object.values(AGENT_PERSONAS)\n\n./common/src/util/agent-name-resolver.ts:\n1:import { AGENT_PERSONAS } from '../constants/agents'\n14: return Object.entries(AGENT_PERSONAS)", - "message": "Exit code: 0" - } - } - ], - "parentAgentId": "D-QYgBIs_zY" - }, - { - "type": "tool_call", - "toolCallId": "47db3dd1-6ef0-43b2-b7c5-559c7354fb60", - "toolName": "set_output", - "input": { - "results": [ - { - "stdout": ".github/workflows/ci.yml:\n1:# This workflow runs CI checks including building, typechecking, and testing the codebase\n18: runs-on: ubuntu-latest\n51: echo \"NEXT_PUBLIC_CB_ENVIRONMENT=test\" >> $GITHUB_ENV\n80: # Template for test jobs\n81: test:\n90: name: test-${{ matrix.package }}\n91: runs-on: ubuntu-latest\n124: echo \"NEXT_PUBLIC_CB_ENVIRONMENT=test\" >> $GITHUB_ENV\n128: - name: Run ${{ matrix.package }} tests\n133: command: cd ${{ matrix.package }} && find src -name '*.test.ts' ! -name '*.integration.test.ts' | sort | xargs -I {} bun test {}\n140: # Integration tests job\n141: test-integration:\n150: name: test-integration-${{ matrix.package }}\n151: runs-on: ubuntu-latest\n184: echo \"NEXT_PUBLIC_CB_ENVIRONMENT=test\" >> $GITHUB_ENV\n\n.agents/base-max.ts:\n70:- You are not the only one making changes to files. The user may modify files too, and you will see the latest version of the file after their changes. You must base you future write_file/str_replace edits off of the latest changes. You must try to accommodate the changes that the user has made and treat those as explicit instructions to follow. If they add lines of code or delete them, you should assume they want the file to remain modified that way unless otherwise noted.\n108:- **Package Management:** When adding new packages, use the run_terminal_command tool to install the package rather than editing the package.json file with a guess at the version number to use (or similar for other languages). This way, you will be sure to have the latest version of the package. Do not install packages globally unless asked by the user (e.g. Don\\'t run \\`npm install -g \\`). Always try to use the package manager associated with the project (e.g. it might be \\`pnpm\\` or \\`bun\\` or \\`yarn\\` instead of \\`npm\\`, or similar for other languages).\n110:- **Testing:** If you create a unit test, you should run it using \\`run_terminal_command\\` to see if it passes, and fix it if it doesn\\'t.\n149:Check the knowledge files to see if the user has specified a further protocol for what terminal commands should be run to verify edits. For example, a \\`knowledge.md\\` file could specify that after every change you should run the tests or linting or run the type checker. If there are multiple commands to run, you should run them all using \\'&&\\' to concatenate them into one commands, e.g. \\`npm run lint && npm run test\\`.\n310:If the user had knowledge files (or CLAUDE.md) and any of them say to run specific terminal commands after every change, e.g. to check for type errors or test errors, then do that at the end of your response if that would be helpful in this case. No need to run these checks for simple changes.\n\n./npm-app/src/cli-handlers/checkpoint.ts:\n189: const latestCheckpoint = checkpointManager.getLatestCheckpoint()\n190: await latestCheckpoint?.fileStateIdPromise\n198: 'Failed to wait for latest checkpoint file state',\n243: await checkpointManager.getLatestCheckpoint().fileStateIdPromise\n245: // No latest checkpoint available, previous checkpoint is guaranteed to be done.\n\n.github/workflows/nightly-evals.yml:\n11: runs-on: ubuntu-latest\n45: echo \"NEXT_PUBLIC_CB_ENVIRONMENT=test\" >> $GITHUB_ENV\n\n./npm-app/src/cli-handlers/agent-creation-chat.ts:\n108: 'Continue adjusting your agent here, or type \"/agents\" to switch agents and test it out.',\n\n.agents/base-experimental.ts:\n70:- You are not the only one making changes to files. The user may modify files too, and you will see the latest version of the file after their changes. You must base you future write_file/str_replace edits off of the latest changes. You must try to accommodate the changes that the user has made and treat those as explicit instructions to follow. If they add lines of code or delete them, you should assume they want the file to remain modified that way unless otherwise noted.\n108:- **Package Management:** When adding new packages, use the run_terminal_command tool to install the package rather than editing the package.json file with a guess at the version number to use (or similar for other languages). This way, you will be sure to have the latest version of the package. Do not install packages globally unless asked by the user (e.g. Don\\'t run \\`npm install -g \\`). Always try to use the package manager associated with the project (e.g. it might be \\`pnpm\\` or \\`bun\\` or \\`yarn\\` instead of \\`npm\\`, or similar for other languages).\n110:- **Testing:** If you create a unit test, you should run it using \\`run_terminal_command\\` to see if it passes, and fix it if it doesn\\'t.\n149:Check the knowledge files to see if the user has specified a further protocol for what terminal commands should be run to verify edits. For example, a \\`knowledge.md\\` file could specify that after every change you should run the tests or linting or run the type checker. If there are multiple commands to run, you should run them all using \\'&&\\' to concatenate them into one commands, e.g. \\`npm run lint && npm run test\\`.\n318:If the user had knowledge files (or CLAUDE.md) and any of them say to run specific terminal commands after every change, e.g. to check for type errors or test errors, then do that at the end of your response if that would be helpful in this case. No need to run these checks for simple changes.\n\n.agents/ask.ts:\n62:- You are not the only one making changes to files. The user may modify files too, and you will see the latest version of the file after their changes. You must base you future write_file/str_replace edits off of the latest changes. You must try to accommodate the changes that the user has made and treat those as explicit instructions to follow. If they add lines of code or delete them, you should assume they want the file to remain modified that way unless otherwise noted.\n123:Check the knowledge files to see if the user has specified a further protocol for what terminal commands should be run to verify edits. For example, a \\`knowledge.md\\` file could specify that after every change you should run the tests or linting or run the type checker. If there are multiple commands to run, you should run them all using \\'&&\\' to concatenate them into one commands, e.g. \\`npm run lint && npm run test\\`.\n\n.github/workflows/npm-app-release-build.yml:\n34: - os: ubuntu-latest\n39: - os: ubuntu-latest\n54: - os: windows-latest\n129: # Only test if we're building for the native architecture\n131: echo \"Skipping test for cross-compiled ARM64 binary\"\n\n./npm-app/src/cli-handlers/subagent-list.ts:\n197: const testLine =\n200: testLine.replace(/\\u001b\\[[0-9;]*m/g, '').length <=\n203: currentLine = testLine\n233: const testLine = `${currentLine} ${word}`\n235: testLine.replace(/\\u001b\\[[0-9;]*m/g, '').length <= maxLineLength\n237: currentLine = testLine\n\n.github/workflows/npm-app-release-staging.yml:\n18: runs-on: ubuntu-latest\n57: # Get latest beta version from npm to check if we need to increment\n58: echo \"Fetching latest beta version from npm...\"\n59: LATEST_BETA=$(npm view codecane@latest version 2>/dev/null || echo \"\")\n65: echo \"Latest beta version: $LATEST_BETA\"\n143: runs-on: ubuntu-latest\n228: \\\"body\\\": \\\"## Codecane v${{ needs.prepare-and-commit-staging.outputs.new_version }} (Staging)\\n\\n**⚠️ This is a staging/beta release for testing purposes.**\\n\\nBinary releases for all supported platforms.\\n\\n### Installation\\n\\`\\`\\`bash\\nnpm install -g codecane\\n\\`\\`\\`\\n\\n### Platform Binaries\\n- \\`codecane-linux-x64.tar.gz\\` - Linux x64\\n- \\`codecane-linux-arm64.tar.gz\\` - Linux ARM64\\n- \\`codecane-darwin-x64.tar.gz\\` - macOS Intel\\n- \\`codecane-darwin-arm64.tar.gz\\` - macOS Apple Silicon\\n- \\`codecane-win32-x64.tar.gz\\` - Windows x64\\\",\n258: runs-on: ubuntu-latest\n\n.github/workflows/evals.yml:\n9: runs-on: ubuntu-latest\n61: echo \"NEXT_PUBLIC_CB_ENVIRONMENT=test\" >> $GITHUB_ENV\n\n.github/workflows/npm-app-release-prod.yml:\n22: runs-on: ubuntu-latest\n105: runs-on: ubuntu-latest\n150: runs-on: ubuntu-latest\n\n./npm-app/src/menu.ts:\n400:${hasKnowledgeMd && !hasCodebuffJson ? `\\n${yellow(`${codebuffConfigFile} runs deployment scripts for you to test your code and runs configured checks for you by running your dev server.`)}` : ''}\n402:${!hasKnowledgeMd && !hasCodebuffJson ? `\\n${yellow('knowledge.md helps Codebuff understand your project structure and codebase better for better results.')}\\n${yellow(`${codebuffConfigFile} runs deployment scripts for you to test your code and runs configured checks for you by running your dev server.`)}` : ''}`\n422:${cyan(' • \"Create a unit test for the auth module\"')}\n\n.github/knowledge.md:\n8:2. **Test Job**: Runs tests for npm-app, backend, and common packages in parallel using matrix strategy\n27:Each test job:\n29:- Runs unit tests only (excludes integration tests)\n31:- Sets `CODEBUFF_GITHUB_ACTIONS=true` and `NEXT_PUBLIC_CB_ENVIRONMENT=test`\n37:- Test environment flags are set for proper test execution\n42:- Build job must complete before test jobs start (`needs: build`)\n87: bun act -j test-backend\n135:2. If tests fail with environment issues:\n153:6. Use the retry mechanism for flaky tests\n\n./npm-app/src/create-template-project.ts:\n20: if (!/^[a-zA-Z0-9-_]+$/.test(template)) {\n36: if (!/^[a-zA-Z0-9-_]+$/.test(projectName)) {\n\n./npm-app/src/client.ts:\n126: console.log('Make sure you are on the latest version of Codebuff!')\n1121: )}: Runs tests, linting, and type checking when you modify files\\n• ${bold(\n1373: checkpointAddendum = ` or \"checkpoint ${checkpointManager.getLatestCheckpoint().id}\" to revert`\n1375: // No latest checkpoint, don't show addendum\n1382: 'No latest checkpoint for addendum',\n\n.agents/base-lite.ts:\n70:- You are not the only one making changes to files. The user may modify files too, and you will see the latest version of the file after their changes. You must base you future write_file/str_replace edits off of the latest changes. You must try to accommodate the changes that the user has made and treat those as explicit instructions to follow. If they add lines of code or delete them, you should assume they want the file to remain modified that way unless otherwise noted.\n108:- **Package Management:** When adding new packages, use the run_terminal_command tool to install the package rather than editing the package.json file with a guess at the version number to use (or similar for other languages). This way, you will be sure to have the latest version of the package. Do not install packages globally unless asked by the user (e.g. Don\\'t run \\`npm install -g \\`). Always try to use the package manager associated with the project (e.g. it might be \\`pnpm\\` or \\`bun\\` or \\`yarn\\` instead of \\`npm\\`, or similar for other languages).\n110:- **Testing:** If you create a unit test, you should run it using \\`run_terminal_command\\` to see if it passes, and fix it if it doesn\\'t.\n149:Check the knowledge files to see if the user has specified a further protocol for what terminal commands should be run to verify edits. For example, a \\`knowledge.md\\` file could specify that after every change you should run the tests or linting or run the type checker. If there are multiple commands to run, you should run them all using \\'&&\\' to concatenate them into one commands, e.g. \\`npm run lint && npm run test\\`.\n312:If the user had knowledge files (or CLAUDE.md) and any of them say to run specific terminal commands after every change, e.g. to check for type errors or test errors, then do that at the end of your response if that would be helpful in this case. No need to run these checks for simple changes.\n\n.agents/claude4-gemini-thinking.ts:\n65:- You are not the only one making changes to files. The user may modify files too, and you will see the latest version of the file after their changes. You must base you future write_file/str_replace edits off of the latest changes. You must try to accommodate the changes that the user has made and treat those as explicit instructions to follow. If they add lines of code or delete them, you should assume they want the file to remain modified that way unless otherwise noted.\n103:- **Package Management:** When adding new packages, use the run_terminal_command tool to install the package rather than editing the package.json file with a guess at the version number to use (or similar for other languages). This way, you will be sure to have the latest version of the package. Do not install packages globally unless asked by the user (e.g. Don\\'t run \\`npm install -g \\`). Always try to use the package manager associated with the project (e.g. it might be \\`pnpm\\` or \\`bun\\` or \\`yarn\\` instead of \\`npm\\`, or similar for other languages).\n105:- **Testing:** If you create a unit test, you should run it using \\`run_terminal_command\\` to see if it passes, and fix it if it doesn\\'t.\n144:Check the knowledge files to see if the user has specified a further protocol for what terminal commands should be run to verify edits. For example, a \\`knowledge.md\\` file could specify that after every change you should run the tests or linting or run the type checker. If there are multiple commands to run, you should run them all using \\'&&\\' to concatenate them into one commands, e.g. \\`npm run lint && npm run test\\`.\n305:If the user had knowledge files (or CLAUDE.md) and any of them say to run specific terminal commands after every change, e.g. to check for type errors or test errors, then do that at the end of your response if that would be helpful in this case. No need to run these checks for simple changes.\n\n.agents/reviewer.ts:\n39:4. Always run hooks for TypeScript/JavaScript changes, test file changes, or when the changes could affect compilation/tests\n\n./npm-app/src/__tests__/display.test.ts:\n1:import { describe, expect, it } from 'bun:test'\n\n.agents/types/tools.d.ts:\n56: /** Optional ripgrep flags to customize the search (e.g., \"-i\" for case-insensitive, \"-t ts\" for TypeScript files only, \"-A 3\" for 3 lines after match, \"-B 2\" for 2 lines before match, \"--type-not test\" to exclude test files). */\n\n.agents/base.ts:\n70:- You are not the only one making changes to files. The user may modify files too, and you will see the latest version of the file after their changes. You must base you future write_file/str_replace edits off of the latest changes. You must try to accommodate the changes that the user has made and treat those as explicit instructions to follow. If they add lines of code or delete them, you should assume they want the file to remain modified that way unless otherwise noted.\n108:- **Package Management:** When adding new packages, use the run_terminal_command tool to install the package rather than editing the package.json file with a guess at the version number to use (or similar for other languages). This way, you will be sure to have the latest version of the package. Do not install packages globally unless asked by the user (e.g. Don\\'t run \\`npm install -g \\`). Always try to use the package manager associated with the project (e.g. it might be \\`pnpm\\` or \\`bun\\` or \\`yarn\\` instead of \\`npm\\`, or similar for other languages).\n110:- **Testing:** If you create a unit test, you should run it using \\`run_terminal_command\\` to see if it passes, and fix it if it doesn\\'t.\n149:Check the knowledge files to see if the user has specified a further protocol for what terminal commands should be run to verify edits. For example, a \\`knowledge.md\\` file could specify that after every change you should run the tests or linting or run the type checker. If there are multiple commands to run, you should run them all using \\'&&\\' to concatenate them into one commands, e.g. \\`npm run lint && npm run test\\`.\n310:If the user had knowledge files (or CLAUDE.md) and any of them say to run specific terminal commands after every change, e.g. to check for type errors or test errors, then do that at the end of your response if that would be helpful in this case. No need to run these checks for simple changes.\n\n./backend/src/live-user-inputs.ts:\n88:// For testing purposes - reset all state\n\n./backend/src/__tests__/live-user-inputs.test.ts:\n1:import { describe, it, expect, beforeEach, afterEach } from 'bun:test'\n15: // Clear any existing state before each test\n20: // Clean up any state after each test\n95: // For unit testing, we'll test the function directly\n105: // For unit testing, we'll test that endUserInput doesn't remove the input\n\n./backend/src/llm-apis/message-cost-tracker.ts:\n245: 'Skipping Stripe sync (no user or test user).',\n591: `Credits used by test user (${creditsUsed})`,\n\n./backend/src/__tests__/loop-agent-steps.test.ts:\n6:} from '@codebuff/common/testing/mock-modules'\n18:} from 'bun:test'\n22:import { mockFileContext, MockWebSocket } from './test-utils'\n66: // Mock live user inputs - will be overridden in individual tests\n68: checkLiveUserInput: () => false, // Default to false, override in tests\n136: processedRepoId: 'test-repo-id',\n\n[Output size limit reached.]", - "message": "Stopped early after 110 match(es)." - }, - { - "stdout": "./backend/src/templates/agents/planner.ts:\n1:import { AGENT_PERSONAS } from '@codebuff/common/constants/agents'\n12: displayName: AGENT_PERSONAS.planner.displayName,\n13: spawnPurposePrompt: AGENT_PERSONAS.planner.purpose,\n\n./backend/src/templates/agents/superagent.ts:\n1:import { AGENT_PERSONAS } from '@codebuff/common/constants/agents'\n15: displayName: AGENT_PERSONAS.superagent.displayName,\n16: spawnPurposePrompt: AGENT_PERSONAS.superagent.purpose,\n\n./backend/src/templates/agents/ask.ts:\n1:import { AGENT_PERSONAS } from '@codebuff/common/constants/agents'\n17: displayName: AGENT_PERSONAS.ask.displayName,\n\n./backend/src/templates/agents/thinking-base.ts:\n1:import { AGENT_PERSONAS } from '@codebuff/common/constants/agents'\n19: displayName: AGENT_PERSONAS.base_lite.displayName,\n20: spawnPurposePrompt: AGENT_PERSONAS.base_lite.purpose,\n\n./backend/src/templates/agents/reviewer.ts:\n1:import { AGENT_PERSONAS } from '@codebuff/common/constants/agents'\n12: displayName: AGENT_PERSONAS.reviewer.displayName,\n13: spawnPurposePrompt: AGENT_PERSONAS.reviewer.purpose,\n\n./backend/src/templates/agents/thinker.ts:\n1:import { AGENT_PERSONAS } from '@codebuff/common/constants/agents'\n12: displayName: AGENT_PERSONAS.thinker.displayName,\n13: spawnPurposePrompt: AGENT_PERSONAS.thinker.purpose,\n\n./backend/src/templates/agents/archive/dry-run.ts:\n1:import { AGENT_PERSONAS } from '@codebuff/common/constants/agents'\n11: displayName: AGENT_PERSONAS.dry_run.displayName,\n12: spawnPurposePrompt: AGENT_PERSONAS.dry_run.purpose,\n\n./backend/src/templates/agents/researcher.ts:\n1:import { AGENT_PERSONAS } from '@codebuff/common/constants/agents'\n12: displayName: AGENT_PERSONAS.researcher.displayName,\n13: spawnPurposePrompt: AGENT_PERSONAS.researcher.purpose,\n\n./backend/src/templates/agents/base.ts:\n1:import { AGENT_PERSONAS } from '@codebuff/common/constants/agents'\n19: displayName: AGENT_PERSONAS.base.displayName,\n20: spawnPurposePrompt: AGENT_PERSONAS.base.purpose,\n\n./backend/src/templates/agents/file-picker.ts:\n1:import { AGENT_PERSONAS } from '@codebuff/common/constants/agents'\n11: displayName: AGENT_PERSONAS.file_picker.displayName,\n12: spawnPurposePrompt: AGENT_PERSONAS.file_picker.purpose,\n\n./common/src/constants/agents.ts:\n4:export const AGENT_PERSONAS = {\n90:// Agent IDs list from AGENT_PERSONAS keys\n92: AGENT_PERSONAS,\n93:) as (keyof typeof AGENT_PERSONAS)[]\n100: Object.entries(AGENT_PERSONAS).map(([agentType, persona]) => [\n104:) as Record\n107: (typeof AGENT_PERSONAS)[keyof typeof AGENT_PERSONAS]['displayName']\n112: Object.values(AGENT_PERSONAS)\n\n./common/src/util/agent-name-resolver.ts:\n1:import { AGENT_PERSONAS } from '../constants/agents'\n14: return Object.entries(AGENT_PERSONAS)", - "message": "Exit code: 0" - } - ] - }, - "agentId": "D-QYgBIs_zY", - "parentAgentId": "main-agent", - "includeToolCall": false - }, - { - "type": "tool_result", - "toolCallId": "47db3dd1-6ef0-43b2-b7c5-559c7354fb60", - "toolName": "set_output", - "output": [ - { - "type": "json", - "value": { - "message": "Output set" - } - } - ], - "parentAgentId": "D-QYgBIs_zY" - }, - { - "type": "subagent_finish", - "agentId": "D-QYgBIs_zY", - "agentType": "code-searcher", - "displayName": "Code Searcher", - "onlyChild": false, - "parentAgentId": "main-agent", - "prompt": "", - "params": { - "searchQueries": [ - { - "pattern": "bun run typecheck|lint|test" - }, - { - "pattern": "AGENT_PERSONAS", - "flags": "-g *.ts" - } - ] - } - }, - { - "type": "text", - "agentId": "D-QYfz6Uj58", - "text": "package.json\nbackend/package.json\ncommon/package.json\nevals/package.json\nnpm-app/package.json\npackages/bigquery/package.json\npackages/billing/package.json\npackages/build-tools/package.json\npackages/code-map/package.json\npackages/internal/package.json\nscripts/package.json\nsdk/package.json" - }, - { - "type": "subagent_finish", - "agentId": "D-QYpeR_n1U", - "agentType": "file-lister", - "displayName": "Liszt the File Lister", - "onlyChild": true, - "parentAgentId": "D-QYfz6Uj58", - "prompt": "package.json scripts for testing, linting, typechecking", - "params": {} - }, - { - "type": "tool_result", - "toolCallId": "b5cf7c6b-266d-4758-8e9e-069117fc61ec", - "toolName": "spawn_agents", - "output": [ - { - "type": "json", - "value": [ - { - "agentName": "Liszt the File Lister", - "agentType": "file-lister", - "value": { - "type": "lastMessage", - "value": [ - { - "role": "assistant", - "content": [ - { - "type": "text", - "text": "package.json\nbackend/package.json\ncommon/package.json\nevals/package.json\nnpm-app/package.json\npackages/bigquery/package.json\npackages/billing/package.json\npackages/build-tools/package.json\npackages/code-map/package.json\npackages/internal/package.json\nscripts/package.json\nsdk/package.json" - } - ] - } - ] - } - } - ] - } - ], - "parentAgentId": "D-QYfz6Uj58" - }, - { - "type": "tool_call", - "toolCallId": "5f37dfa7-6bd0-424d-8624-420665495612", - "toolName": "read_files", - "input": { - "paths": [ - "package.json", - "backend/package.json", - "common/package.json", - "evals/package.json", - "npm-app/package.json", - "packages/bigquery/package.json", - "packages/billing/package.json", - "packages/build-tools/package.json", - "packages/code-map/package.json", - "packages/internal/package.json", - "scripts/package.json", - "sdk/package.json" - ] - }, - "agentId": "D-QYfz6Uj58", - "parentAgentId": "main-agent", - "includeToolCall": true - }, - { - "type": "tool_result", - "toolCallId": "5f37dfa7-6bd0-424d-8624-420665495612", - "toolName": "read_files", - "output": [ - { - "type": "json", - "value": [ - { - "path": "package.json", - "content": "{\n \"name\": \"codebuff-project\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"license\": \"UNLICENSED\",\n \"type\": \"module\",\n \"workspaces\": [\n \"common\",\n \"backend\",\n \"npm-app\",\n \"web\",\n \"packages/*\",\n \"scripts\",\n \"evals\",\n \"sdk\"\n ],\n \"scripts\": {\n \"dev\": \"bash scripts/dev.sh\",\n \"start-db\": \"bun --cwd common db:start\",\n \"start-bin\": \"bun --cwd npm-app start-bin\",\n \"start-web\": \"bun start-db && bun --cwd web dev\",\n \"start-studio\": \"bun --cwd common db:studio\",\n \"start-server\": \"bun --cwd backend dev\",\n \"start-manifold\": \"bun --cwd npm-app start-manifold\",\n \"start-codebuff-test\": \"bun --cwd npm-app start --cwd ../../codebuff-test\",\n \"start-litestar\": \"bun --cwd npm-app start-litestar\",\n \"start-jpcsp\": \"bun --cwd npm-app start-jpcsp\",\n \"start-vscode\": \"bun --cwd npm-app start-vscode\",\n \"start-nushell\": \"bun --cwd npm-app start-nushell\",\n \"format\": \"prettier --write \\\"**/*.{ts,tsx,json,md}\\\"\",\n \"release:npm-app\": \"bun run --cwd npm-app release\",\n \"clean-ts\": \"find . -name '*.tsbuildinfo' -type f -delete && find . -name '.next' -type d -exec rm -rf {} + 2>/dev/null || true && find . -name 'node_modules' -type d -exec rm -rf {} + 2>/dev/null || true && bun install\",\n \"typecheck\": \"bun --filter='*' run typecheck && echo '✅ All type checks passed!'\",\n \"test\": \"bun --filter='{@codebuff/backend,@codebuff/common,@codebuff/npm-app}' run test\",\n \"init-worktree\": \"bun scripts/init-worktree.ts\",\n \"cleanup-worktree\": \"bash scripts/cleanup-worktree.sh\",\n \"generate-tool-definitions\": \"bun scripts/generate-tool-definitions.ts\"\n },\n \"dependencies\": {\n \"@t3-oss/env-nextjs\": \"^0.7.3\",\n \"zod\": \"3.25.67\"\n },\n \"overrides\": {\n \"zod\": \"3.25.67\"\n },\n \"devDependencies\": {\n \"@tanstack/react-query\": \"^5.59.16\",\n \"@types/bun\": \"^1.2.11\",\n \"@types/lodash\": \"4.17.7\",\n \"@types/node\": \"^22.9.0\",\n \"@types/node-fetch\": \"^2.6.12\",\n \"@types/parse-path\": \"^7.1.0\",\n \"@typescript-eslint/eslint-plugin\": \"^6.17\",\n \"bun-types\": \"^1.2.2\",\n \"eslint-config-prettier\": \"^9.1.0\",\n \"eslint-plugin-import\": \"^2.29.1\",\n \"eslint-plugin-unused-imports\": \"^4.1.4\",\n \"ignore\": \"^6.0.2\",\n \"lodash\": \"4.17.21\",\n \"prettier\": \"3.3.2\",\n \"ts-node\": \"^10.9.2\",\n \"ts-pattern\": \"^5.5.0\",\n \"tsc-alias\": \"1.7.0\",\n \"tsconfig-paths\": \"4.2.0\",\n \"types\": \"^0.1.1\",\n \"typescript\": \"5.5.4\",\n \"typescript-eslint\": \"^7.17.0\"\n },\n \"engines\": {\n \"node\": \">=20.0.0\"\n },\n \"packageManager\": \"yarn@1.22.22+sha512.a6b2f7906b721bba3d67d4aff083df04dad64c399707841b7acf00f6b133b7ac24255f2652fa22ae3534329dc6180534e98d17432037ff6fd140556e2bb3137e\"\n}\n", - "referencedBy": {} - }, - { - "path": "backend/package.json", - "content": "{\n \"name\": \"@codebuff/backend\",\n \"version\": \"1.0.0\",\n \"description\": \"Backend server for Codebuff\",\n \"private\": true,\n \"license\": \"UNLICENSED\",\n \"type\": \"module\",\n \"exports\": {\n \"./*\": {\n \"bun\": \"./src/*.ts\",\n \"import\": \"./src/*.ts\",\n \"types\": \"./src/*.ts\",\n \"default\": \"./src/*.ts\"\n }\n },\n \"scripts\": {\n \"start\": \"bun src/index.ts\",\n \"dev\": \"bun src/index.ts\",\n \"typecheck\": \"tsc --noEmit -p .\",\n \"test\": \"bun test\"\n },\n \"sideEffects\": false,\n \"engines\": {\n \"bun\": \">=1.2.11\"\n },\n \"dependencies\": {\n \"@ai-sdk/google-vertex\": \"2.2.24\",\n \"@ai-sdk/openai\": \"1.3.22\",\n \"@codebuff/billing\": \"workspace:*\",\n \"@codebuff/common\": \"workspace:*\",\n \"@codebuff/internal\": \"workspace:*\",\n \"@google-cloud/vertexai\": \"1.10.0\",\n \"@google/generative-ai\": \"0.24.1\",\n \"ai\": \"4.3.16\",\n \"cors\": \"^2.8.5\",\n \"diff\": \"5.2.0\",\n \"dotenv\": \"16.4.5\",\n \"express\": \"4.19.2\",\n \"gpt-tokenizer\": \"2.8.1\",\n \"ignore\": \"5.3.2\",\n \"@jitl/quickjs-wasmfile-release-sync\": \"0.31.0\",\n \"quickjs-emscripten-core\": \"0.31.0\",\n \"lodash\": \"*\",\n \"openai\": \"^4.78.1\",\n \"pino\": \"9.4.0\",\n \"postgres\": \"3.4.4\",\n \"posthog-node\": \"^4.14.0\",\n \"ts-pattern\": \"5.3.1\",\n \"ws\": \"8.18.0\",\n \"zod\": \"3.25.67\",\n \"zod-from-json-schema\": \"0.4.2\"\n },\n \"devDependencies\": {\n \"@types/cors\": \"^2.8.19\",\n \"@types/diff\": \"^5.0.3\",\n \"@types/express\": \"^4.17.13\",\n \"@types/ws\": \"^8.5.5\"\n }\n}\n", - "referencedBy": {} - }, - { - "path": "common/package.json", - "content": "{\n \"name\": \"@codebuff/common\",\n \"version\": \"1.0.0\",\n \"description\": \"Common utilities for Codebuff\",\n \"private\": true,\n \"license\": \"UNLICENSED\",\n \"type\": \"module\",\n \"exports\": {\n \"./db\": {\n \"bun\": \"./src/db/index.ts\",\n \"import\": \"./src/db/index.ts\",\n \"types\": \"./src/db/index.ts\",\n \"default\": \"./src/db/index.ts\"\n },\n \"./*\": {\n \"bun\": \"./src/*.ts\",\n \"import\": \"./src/*.ts\",\n \"types\": \"./src/*.ts\",\n \"default\": \"./src/*.ts\"\n }\n },\n \"scripts\": {\n \"typecheck\": \"tsc --noEmit -p .\",\n \"test\": \"bun test\",\n \"db:generate\": \"drizzle-kit generate --config=./src/db/drizzle.config.ts\",\n \"db:migrate\": \"drizzle-kit push --config=./src/db/drizzle.config.ts\",\n \"db:start\": \"docker compose -f ./src/db/docker-compose.yml up --wait && bun run db:generate && (timeout 1 || sleep 1) && bun run db:migrate\",\n \"db:studio\": \"drizzle-kit studio --config=./src/db/drizzle.config.ts\"\n },\n \"sideEffects\": false,\n \"engines\": {\n \"bun\": \">=1.2.11\"\n },\n \"dependencies\": {\n \"@auth/drizzle-adapter\": \"^1.5.0\",\n \"@types/pg\": \"^8.11.10\",\n \"@types/readable-stream\": \"^4.0.18\",\n \"@types/seedrandom\": \"^3.0.8\",\n \"ai\": \"4.3.16\",\n \"drizzle-kit\": \"0.28.1\",\n \"drizzle-orm\": \"0.36.4\",\n \"ignore\": \"5.3.2\",\n \"lodash\": \"*\",\n \"next-auth\": \"^4.24.7\",\n \"partial-json\": \"^0.1.7\",\n \"pg\": \"^8.14.1\",\n \"readable-stream\": \"^4.7.0\",\n \"seedrandom\": \"^3.0.5\",\n \"stripe\": \"^16.11.0\",\n \"zod\": \"3.25.67\"\n },\n \"devDependencies\": {\n \"@types/parse-path\": \"^7.1.0\"\n }\n}\n", - "referencedBy": {} - }, - { - "path": "evals/package.json", - "content": "{\n \"name\": \"@codebuff/evals\",\n \"version\": \"1.0.0\",\n \"description\": \"Evaluation scripts for Codebuff\",\n \"private\": true,\n \"license\": \"UNLICENSED\",\n \"type\": \"module\",\n \"exports\": {\n \".\": {\n \"bun\": \"./src/index.ts\",\n \"types\": \"./src/index.ts\"\n }\n },\n \"scripts\": {\n \"typecheck\": \"tsc --noEmit -p .\",\n \"test\": \"bun test\",\n \"test:manifold\": \"bun test manifold.test.ts\",\n \"test:pglite\": \"bun test pglite-demo.test.ts\",\n \"test:swe-bench\": \"bun test swe-bench.test.ts\",\n \"test:e2e-cat-app\": \"bun run e2e-cat-app-script.ts\",\n \"gen-git-evals\": \"bun run git-evals/gen-evals.ts\",\n \"run-single-eval\": \"bun run git-evals/run-single-eval.ts --eval-file git-evals/eval-manifold.json --commit-sha ebabf7796a92ce8ece8e2452b0f3f896a513ba0e\",\n \"run-git-evals\": \"bun run git-evals/run-git-evals.ts\",\n \"run-eval-set\": \"bun run git-evals/run-eval-set.ts\",\n \"setup-codebuff-repo\": \"bun run setup-codebuff-repo.ts\"\n },\n \"sideEffects\": false,\n \"engines\": {\n \"bun\": \">=1.2.11\"\n },\n \"dependencies\": {\n \"@codebuff/backend\": \"workspace:*\",\n \"@codebuff/code-map\": \"workspace:*\",\n \"@codebuff/common\": \"workspace:*\",\n \"@codebuff/internal\": \"workspace:*\",\n \"@codebuff/npm-app\": \"workspace:*\",\n \"@oclif/core\": \"^4.4.0\",\n \"@oclif/parser\": \"^3.8.17\",\n \"async\": \"^3.2.6\",\n \"lodash\": \"^4.17.21\",\n \"p-limit\": \"^6.2.0\",\n \"zod\": \"3.25.67\"\n },\n \"devDependencies\": {\n \"@types/async\": \"^3.2.24\"\n }\n}\n", - "referencedBy": {} - }, - { - "path": "npm-app/package.json", - "content": "{\n \"name\": \"@codebuff/npm-app\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"description\": \"cli for codebuff\",\n \"license\": \"MIT\",\n \"main\": \"dist/index.js\",\n \"types\": \"dist/index.d.ts\",\n \"type\": \"module\",\n \"exports\": {\n \"./*\": {\n \"bun\": \"./src/*.ts\",\n \"import\": \"./src/*.ts\",\n \"types\": \"./src/*.ts\",\n \"default\": \"./src/*.ts\"\n }\n },\n \"bin\": {\n \"codebuff\": \"dist/index.js\"\n },\n \"scripts\": {\n \"typecheck\": \"tsc --noEmit -p .\",\n \"build\": \"bun run scripts/build-binary.js codebuff $(node -p \\\"require('./release/package.json').version\\\")\",\n \"release\": \"bun run scripts/release.js\",\n \"start-bin\": \"bun run build && ./bin/codebuff\",\n \"start\": \"bun run src/index.ts --cwd ..\",\n \"format\": \"prettier --write \\\"**/*.{ts,tsx,json,md}\\\"\",\n \"postinstall\": \"bun scripts/patch-web-tree-sitter.ts\"\n },\n \"files\": [\n \"README.md\"\n ],\n \"engines\": {\n \"bun\": \">=1.2.11\"\n },\n \"dependencies\": {\n \"@codebuff/code-map\": \"workspace:*\",\n \"@codebuff/common\": \"workspace:*\",\n \"@types/diff\": \"5.2.1\",\n \"@types/micromatch\": \"^4.0.9\",\n \"@vscode/ripgrep\": \"1.15.9\",\n \"ai\": \"4.3.16\",\n \"axios\": \"1.7.4\",\n \"commander\": \"^13.1.0\",\n \"diff\": \"5.2.0\",\n \"git-url-parse\": \"^16.1.0\",\n \"ignore\": \"7.0.3\",\n \"isomorphic-git\": \"^1.29.0\",\n \"lodash\": \"*\",\n \"micromatch\": \"^4.0.8\",\n \"nanoid\": \"5.0.7\",\n \"onetime\": \"5.1.2\",\n \"picocolors\": \"1.1.0\",\n \"pino\": \"9.4.0\",\n \"posthog-node\": \"4.17.2\",\n \"puppeteer-core\": \"^24.2.0\",\n \"string-width\": \"^7.2.0\",\n \"systeminformation\": \"5.23.4\",\n \"ts-pattern\": \"5.3.1\",\n \"wrap-ansi\": \"^9.0.0\",\n \"ws\": \"8.18.0\",\n \"zod\": \"3.25.67\"\n }\n}\n", - "referencedBy": {} - }, - { - "path": "packages/bigquery/package.json", - "content": "{\n \"name\": \"@codebuff/bigquery\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"license\": \"UNLICENSED\",\n \"type\": \"module\",\n \"exports\": {\n \".\": {\n \"bun\": \"./src/index.ts\",\n \"import\": \"./src/index.ts\",\n \"types\": \"./src/index.ts\",\n \"default\": \"./src/index.ts\"\n },\n \"./*\": {\n \"bun\": \"./src/*.ts\",\n \"import\": \"./src/*.ts\",\n \"types\": \"./src/*.ts\",\n \"default\": \"./src/*.ts\"\n }\n },\n \"scripts\": {\n \"typecheck\": \"tsc --noEmit -p .\",\n \"test\": \"bun test\"\n },\n \"sideEffects\": false,\n \"engines\": {\n \"bun\": \">=1.2.11\"\n },\n \"dependencies\": {\n \"@google-cloud/bigquery\": \"^7.9.4\",\n \"@codebuff/common\": \"workspace:*\"\n },\n \"devDependencies\": {\n \"@types/node\": \"22\",\n \"@types/bun\": \"^1.2.11\"\n }\n}\n", - "referencedBy": {} - }, - { - "path": "packages/billing/package.json", - "content": "{\n \"name\": \"@codebuff/billing\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"license\": \"UNLICENSED\",\n \"type\": \"module\",\n \"exports\": {\n \".\": {\n \"bun\": \"./src/index.ts\",\n \"import\": \"./src/index.ts\",\n \"types\": \"./src/index.ts\",\n \"default\": \"./src/index.ts\"\n },\n \"./*\": {\n \"bun\": \"./src/*.ts\",\n \"import\": \"./src/*.ts\",\n \"types\": \"./src/*.ts\",\n \"default\": \"./src/*.ts\"\n }\n },\n \"scripts\": {\n \"typecheck\": \"tsc --noEmit -p .\",\n \"test\": \"bun test\"\n },\n \"sideEffects\": false,\n \"engines\": {\n \"bun\": \">=1.2.11\"\n },\n \"dependencies\": {\n \"@codebuff/common\": \"workspace:*\"\n },\n \"devDependencies\": {\n \"@types/node\": \"22\",\n \"@types/bun\": \"^1.2.11\"\n }\n}\n", - "referencedBy": {} - }, - { - "path": "packages/build-tools/package.json", - "content": "{\n \"name\": \"@codebuff/build-tools\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"main\": \"./dist/executors/infisical-run/executor.js\",\n \"executors\": \"./executors.json\",\n \"scripts\": {\n \"build\": \"tsc\",\n \"clean\": \"rm -rf dist && (rm tsconfig.tsbuildinfo || true)\"\n },\n \"devDependencies\": {\n \"@nx/devkit\": \"^20.8.1\",\n \"typescript\": \"5.5.4\"\n }\n}\n", - "referencedBy": {} - }, - { - "path": "packages/code-map/package.json", - "content": "{\n \"name\": \"@codebuff/code-map\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"license\": \"UNLICENSED\",\n \"type\": \"module\",\n \"exports\": {\n \".\": {\n \"bun\": \"./src/index.ts\",\n \"import\": \"./src/index.ts\",\n \"types\": \"./src/index.ts\",\n \"default\": \"./src/index.ts\"\n },\n \"./*\": {\n \"bun\": \"./src/*.ts\",\n \"import\": \"./src/*.ts\",\n \"types\": \"./src/*.ts\",\n \"default\": \"./src/*.ts\"\n }\n },\n \"scripts\": {\n \"typecheck\": \"tsc --noEmit -p .\",\n \"test\": \"bun test\"\n },\n \"sideEffects\": false,\n \"engines\": {\n \"bun\": \">=1.2.11\"\n },\n \"dependencies\": {\n \"@vscode/tree-sitter-wasm\": \"0.1.4\",\n \"web-tree-sitter\": \"0.25.6\"\n },\n \"devDependencies\": {\n \"@types/node\": \"22\",\n \"@types/bun\": \"^1.2.11\"\n }\n}\n", - "referencedBy": {} - }, - { - "path": "packages/internal/package.json", - "content": "{\n \"name\": \"@codebuff/internal\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"license\": \"UNLICENSED\",\n \"type\": \"module\",\n \"exports\": {\n \".\": {\n \"bun\": \"./src/index.ts\",\n \"import\": \"./src/index.ts\",\n \"types\": \"./src/index.ts\",\n \"default\": \"./src/index.ts\"\n },\n \"./loops\": {\n \"bun\": \"./src/loops/index.ts\",\n \"import\": \"./src/loops/index.ts\",\n \"types\": \"./src/loops/index.ts\",\n \"default\": \"./src/loops/index.ts\"\n },\n \"./openrouter-ai-sdk\": {\n \"bun\": \"./src/openrouter-ai-sdk/index.ts\",\n \"import\": \"./src/openrouter-ai-sdk/index.ts\",\n \"types\": \"./src/openrouter-ai-sdk/index.ts\",\n \"default\": \"./src/openrouter-ai-sdk/index.ts\"\n },\n \"./*\": {\n \"bun\": \"./src/*.ts\",\n \"import\": \"./src/*.ts\",\n \"types\": \"./src/*.ts\",\n \"default\": \"./src/*.ts\"\n }\n },\n \"scripts\": {\n \"typecheck\": \"tsc --noEmit -p .\",\n \"test\": \"bun test\"\n },\n \"sideEffects\": false,\n \"engines\": {\n \"bun\": \">=1.2.11\"\n },\n \"dependencies\": {\n \"@codebuff/common\": \"workspace:*\",\n \"drizzle-orm\": \"*\",\n \"loops\": \"^5.0.1\"\n },\n \"devDependencies\": {\n \"@types/node\": \"22\",\n \"@types/bun\": \"^1.2.11\"\n }\n}\n", - "referencedBy": {} - }, - { - "path": "scripts/package.json", - "content": "{\n \"name\": \"@codebuff/scripts\",\n \"version\": \"1.0.0\",\n \"description\": \"Scripts package for Codebuff\",\n \"private\": true,\n \"license\": \"UNLICENSED\",\n \"type\": \"module\",\n \"exports\": {\n \".\": {\n \"bun\": \"./src/index.ts\",\n \"types\": \"./src/index.ts\"\n }\n },\n \"scripts\": {\n \"typecheck\": \"tsc --noEmit -p .\",\n \"test\": \"bun test\",\n \"debug-log-subset\": \"bun run debug-log-subset.ts\",\n \"typecheck-all\": \"bun run typecheck-all.ts\"\n },\n \"sideEffects\": false,\n \"engines\": {\n \"bun\": \">=1.2.11\"\n },\n \"dependencies\": {\n \"@codebuff/bigquery\": \"workspace:*\",\n \"@codebuff/backend\": \"workspace:*\",\n \"@codebuff/common\": \"workspace:*\",\n \"lodash\": \"^4.17.21\"\n },\n \"devDependencies\": {\n \"@types/bun\": \"^1.2.11\",\n \"@types/lodash\": \"^4.14.195\",\n \"@types/node\": \"22\"\n }\n}\n", - "referencedBy": {} - }, - { - "path": "sdk/package.json", - "content": "{\n \"name\": \"@codebuff/sdk\",\n \"private\": false,\n \"access\": \"public\",\n \"version\": \"0.1.6\",\n \"description\": \"Official SDK for Codebuff — AI coding agent & framework\",\n \"license\": \"MIT\",\n \"type\": \"module\",\n \"main\": \"./dist/sdk/src/index.js\",\n \"types\": \"./dist/sdk/src/index.d.ts\",\n \"exports\": {\n \".\": {\n \"types\": \"./dist/sdk/src/index.d.ts\",\n \"import\": \"./dist/sdk/src/index.js\",\n \"default\": \"./dist/sdk/src/index.js\"\n }\n },\n \"files\": [\n \"dist\",\n \"README.md\",\n \"CHANGELOG.md\"\n ],\n \"scripts\": {\n \"build\": \"bun run copy-types && tsc\",\n \"copy-types\": \"mkdir -p src/types && cp ../common/src/util/types/agent-definition.d.ts src/types/agent-definition.ts && cp ../common/src/util/types/tools.d.ts src/types/tools.ts\",\n \"clean\": \"rm -rf dist\",\n \"prepare-dist\": \"node scripts/publish.js --dry-run\",\n \"publish-sdk\": \"node scripts/publish.js --public\",\n \"publish-dry-run\": \"node scripts/publish.js --dry-run\",\n \"prepublishOnly\": \"bun run clean && bun run build\",\n \"typecheck\": \"tsc --noEmit -p .\",\n \"test\": \"bun test\"\n },\n \"sideEffects\": false,\n \"engines\": {\n \"node\": \">=18.0.0\"\n },\n \"keywords\": [\n \"codebuff\",\n \"ai\",\n \"code-editing\",\n \"assistant\",\n \"sdk\",\n \"typescript\"\n ],\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/codebuff/codebuff.git\",\n \"directory\": \"sdk\"\n },\n \"homepage\": \"https://codebuff.com\",\n \"bugs\": {\n \"url\": \"https://github.com/codebuff/codebuff/issues\"\n },\n \"dependencies\": {\n \"ai\": \"4.3.16\",\n \"zod\": \"^3.23.8\"\n },\n \"devDependencies\": {\n \"@types/node\": \"22\",\n \"@types/bun\": \"^1.2.11\"\n }\n}\n", - "referencedBy": {} - } - ] - } - ], - "parentAgentId": "D-QYfz6Uj58" - }, - { - "type": "text", - "agentId": "D-QYfz6Uj58", - "text": "Here's a concise report on the locations of testing, linting, and typechecking scripts in the codebase:\n\n* **package.json**: Contains top-level scripts for the entire project, including `format`, `typecheck`, `test`, `init-worktree`, `cleanup-worktree`, and `generate-tool-definitions`. These scripts are central to managing the overall development process.\n* **backend/package.json**: Includes `start`, `dev`, `typecheck`, and `test` scripts specifically for the backend.\n* **common/package.json**: Contains scripts for `typecheck`, `test`, `db:generate`, `db:migrate`, and `db:studio`, focusing on common utilities and database management.\n* **evals/package.json**: Includes scripts for `typecheck`, `test`, `test:manifold`, `test:pglite`, `test:swe-bench`, `test:e2e-cat-app`, `gen-git-evals`, `run-single-eval`, `run-git-evals`, `run-eval-set`, and `setup-codebuff-repo`, targeting the evaluation and testing of AI models.\n* **npm-app/package.json**: Contains `typecheck`, `build`, `release`, `start-bin`, `start`, `format`, and `postinstall` scripts specifically for the npm application.\n* **packages/bigquery/package.json**: Includes `typecheck` and `test` scripts for the BigQuery package.\n* **packages/billing/package.json**: Includes `typecheck` and `test` scripts for the billing package.\n* **packages/build-tools/package.json**: Includes `build` and `clean` scripts, mainly for building and cleaning the build tools package.\n* **packages/code-map/package.json**: Includes `typecheck` and `test` scripts for the code map package.\n* **packages/internal/package.json**: Includes `typecheck` and `test` scripts for internal utilities.\n* **scripts/package.json**: Includes `typecheck`, `test`, and other utility scripts like `debug-log-subset` and `typecheck-all`.\n* **sdk/package.json**: Includes `build`, `copy-types`, `clean`, `prepare-dist`, `publish-sdk`, `publish-dry-run`, `prepublishOnly`, `typecheck`, and `test` scripts for the SDK.\n* **web/package.json**: (Not provided in the read\\_files output, but worth noting it exists) would likely contain scripts related to building, testing, and linting the web application.\n" - }, - { - "type": "subagent_finish", - "agentId": "D-QYfz6Uj58", - "agentType": "file-picker", - "displayName": "Fletcher the File Fetcher", - "onlyChild": false, - "parentAgentId": "main-agent", - "prompt": "package.json scripts for testing, linting, typechecking" - }, - { - "type": "tool_result", - "toolCallId": "D-QYc2ZPpX8", - "toolName": "spawn_agents", - "output": [ - { - "type": "json", - "value": [ - { - "agentName": "Fletcher the File Fetcher", - "agentType": "file-picker", - "value": { - "type": "lastMessage", - "value": [ - { - "role": "assistant", - "content": [ - { - "type": "text", - "text": "Here's a concise report on the locations of testing, linting, and typechecking scripts in the codebase:\n\n* **package.json**: Contains top-level scripts for the entire project, including `format`, `typecheck`, `test`, `init-worktree`, `cleanup-worktree`, and `generate-tool-definitions`. These scripts are central to managing the overall development process.\n* **backend/package.json**: Includes `start`, `dev`, `typecheck`, and `test` scripts specifically for the backend.\n* **common/package.json**: Contains scripts for `typecheck`, `test`, `db:generate`, `db:migrate`, and `db:studio`, focusing on common utilities and database management.\n* **evals/package.json**: Includes scripts for `typecheck`, `test`, `test:manifold`, `test:pglite`, `test:swe-bench`, `test:e2e-cat-app`, `gen-git-evals`, `run-single-eval`, `run-git-evals`, `run-eval-set`, and `setup-codebuff-repo`, targeting the evaluation and testing of AI models.\n* **npm-app/package.json**: Contains `typecheck`, `build`, `release`, `start-bin`, `start`, `format`, and `postinstall` scripts specifically for the npm application.\n* **packages/bigquery/package.json**: Includes `typecheck` and `test` scripts for the BigQuery package.\n* **packages/billing/package.json**: Includes `typecheck` and `test` scripts for the billing package.\n* **packages/build-tools/package.json**: Includes `build` and `clean` scripts, mainly for building and cleaning the build tools package.\n* **packages/code-map/package.json**: Includes `typecheck` and `test` scripts for the code map package.\n* **packages/internal/package.json**: Includes `typecheck` and `test` scripts for internal utilities.\n* **scripts/package.json**: Includes `typecheck`, `test`, and other utility scripts like `debug-log-subset` and `typecheck-all`.\n* **sdk/package.json**: Includes `build`, `copy-types`, `clean`, `prepare-dist`, `publish-sdk`, `publish-dry-run`, `prepublishOnly`, `typecheck`, and `test` scripts for the SDK.\n* **web/package.json**: (Not provided in the read\\_files output, but worth noting it exists) would likely contain scripts related to building, testing, and linting the web application.\n" - } - ] - } - ] - } - }, - { - "agentName": "Code Searcher", - "agentType": "code-searcher", - "value": { - "type": "structuredOutput", - "value": { - "results": [ - { - "stdout": ".github/workflows/ci.yml:\n1:# This workflow runs CI checks including building, typechecking, and testing the codebase\n18: runs-on: ubuntu-latest\n51: echo \"NEXT_PUBLIC_CB_ENVIRONMENT=test\" >> $GITHUB_ENV\n80: # Template for test jobs\n81: test:\n90: name: test-${{ matrix.package }}\n91: runs-on: ubuntu-latest\n124: echo \"NEXT_PUBLIC_CB_ENVIRONMENT=test\" >> $GITHUB_ENV\n128: - name: Run ${{ matrix.package }} tests\n133: command: cd ${{ matrix.package }} && find src -name '*.test.ts' ! -name '*.integration.test.ts' | sort | xargs -I {} bun test {}\n140: # Integration tests job\n141: test-integration:\n150: name: test-integration-${{ matrix.package }}\n151: runs-on: ubuntu-latest\n184: echo \"NEXT_PUBLIC_CB_ENVIRONMENT=test\" >> $GITHUB_ENV\n\n.agents/base-max.ts:\n70:- You are not the only one making changes to files. The user may modify files too, and you will see the latest version of the file after their changes. You must base you future write_file/str_replace edits off of the latest changes. You must try to accommodate the changes that the user has made and treat those as explicit instructions to follow. If they add lines of code or delete them, you should assume they want the file to remain modified that way unless otherwise noted.\n108:- **Package Management:** When adding new packages, use the run_terminal_command tool to install the package rather than editing the package.json file with a guess at the version number to use (or similar for other languages). This way, you will be sure to have the latest version of the package. Do not install packages globally unless asked by the user (e.g. Don\\'t run \\`npm install -g \\`). Always try to use the package manager associated with the project (e.g. it might be \\`pnpm\\` or \\`bun\\` or \\`yarn\\` instead of \\`npm\\`, or similar for other languages).\n110:- **Testing:** If you create a unit test, you should run it using \\`run_terminal_command\\` to see if it passes, and fix it if it doesn\\'t.\n149:Check the knowledge files to see if the user has specified a further protocol for what terminal commands should be run to verify edits. For example, a \\`knowledge.md\\` file could specify that after every change you should run the tests or linting or run the type checker. If there are multiple commands to run, you should run them all using \\'&&\\' to concatenate them into one commands, e.g. \\`npm run lint && npm run test\\`.\n310:If the user had knowledge files (or CLAUDE.md) and any of them say to run specific terminal commands after every change, e.g. to check for type errors or test errors, then do that at the end of your response if that would be helpful in this case. No need to run these checks for simple changes.\n\n./npm-app/src/cli-handlers/checkpoint.ts:\n189: const latestCheckpoint = checkpointManager.getLatestCheckpoint()\n190: await latestCheckpoint?.fileStateIdPromise\n198: 'Failed to wait for latest checkpoint file state',\n243: await checkpointManager.getLatestCheckpoint().fileStateIdPromise\n245: // No latest checkpoint available, previous checkpoint is guaranteed to be done.\n\n.github/workflows/nightly-evals.yml:\n11: runs-on: ubuntu-latest\n45: echo \"NEXT_PUBLIC_CB_ENVIRONMENT=test\" >> $GITHUB_ENV\n\n./npm-app/src/cli-handlers/agent-creation-chat.ts:\n108: 'Continue adjusting your agent here, or type \"/agents\" to switch agents and test it out.',\n\n.agents/base-experimental.ts:\n70:- You are not the only one making changes to files. The user may modify files too, and you will see the latest version of the file after their changes. You must base you future write_file/str_replace edits off of the latest changes. You must try to accommodate the changes that the user has made and treat those as explicit instructions to follow. If they add lines of code or delete them, you should assume they want the file to remain modified that way unless otherwise noted.\n108:- **Package Management:** When adding new packages, use the run_terminal_command tool to install the package rather than editing the package.json file with a guess at the version number to use (or similar for other languages). This way, you will be sure to have the latest version of the package. Do not install packages globally unless asked by the user (e.g. Don\\'t run \\`npm install -g \\`). Always try to use the package manager associated with the project (e.g. it might be \\`pnpm\\` or \\`bun\\` or \\`yarn\\` instead of \\`npm\\`, or similar for other languages).\n110:- **Testing:** If you create a unit test, you should run it using \\`run_terminal_command\\` to see if it passes, and fix it if it doesn\\'t.\n149:Check the knowledge files to see if the user has specified a further protocol for what terminal commands should be run to verify edits. For example, a \\`knowledge.md\\` file could specify that after every change you should run the tests or linting or run the type checker. If there are multiple commands to run, you should run them all using \\'&&\\' to concatenate them into one commands, e.g. \\`npm run lint && npm run test\\`.\n318:If the user had knowledge files (or CLAUDE.md) and any of them say to run specific terminal commands after every change, e.g. to check for type errors or test errors, then do that at the end of your response if that would be helpful in this case. No need to run these checks for simple changes.\n\n.agents/ask.ts:\n62:- You are not the only one making changes to files. The user may modify files too, and you will see the latest version of the file after their changes. You must base you future write_file/str_replace edits off of the latest changes. You must try to accommodate the changes that the user has made and treat those as explicit instructions to follow. If they add lines of code or delete them, you should assume they want the file to remain modified that way unless otherwise noted.\n123:Check the knowledge files to see if the user has specified a further protocol for what terminal commands should be run to verify edits. For example, a \\`knowledge.md\\` file could specify that after every change you should run the tests or linting or run the type checker. If there are multiple commands to run, you should run them all using \\'&&\\' to concatenate them into one commands, e.g. \\`npm run lint && npm run test\\`.\n\n.github/workflows/npm-app-release-build.yml:\n34: - os: ubuntu-latest\n39: - os: ubuntu-latest\n54: - os: windows-latest\n129: # Only test if we're building for the native architecture\n131: echo \"Skipping test for cross-compiled ARM64 binary\"\n\n./npm-app/src/cli-handlers/subagent-list.ts:\n197: const testLine =\n200: testLine.replace(/\\u001b\\[[0-9;]*m/g, '').length <=\n203: currentLine = testLine\n233: const testLine = `${currentLine} ${word}`\n235: testLine.replace(/\\u001b\\[[0-9;]*m/g, '').length <= maxLineLength\n237: currentLine = testLine\n\n.github/workflows/npm-app-release-staging.yml:\n18: runs-on: ubuntu-latest\n57: # Get latest beta version from npm to check if we need to increment\n58: echo \"Fetching latest beta version from npm...\"\n59: LATEST_BETA=$(npm view codecane@latest version 2>/dev/null || echo \"\")\n65: echo \"Latest beta version: $LATEST_BETA\"\n143: runs-on: ubuntu-latest\n228: \\\"body\\\": \\\"## Codecane v${{ needs.prepare-and-commit-staging.outputs.new_version }} (Staging)\\n\\n**⚠️ This is a staging/beta release for testing purposes.**\\n\\nBinary releases for all supported platforms.\\n\\n### Installation\\n\\`\\`\\`bash\\nnpm install -g codecane\\n\\`\\`\\`\\n\\n### Platform Binaries\\n- \\`codecane-linux-x64.tar.gz\\` - Linux x64\\n- \\`codecane-linux-arm64.tar.gz\\` - Linux ARM64\\n- \\`codecane-darwin-x64.tar.gz\\` - macOS Intel\\n- \\`codecane-darwin-arm64.tar.gz\\` - macOS Apple Silicon\\n- \\`codecane-win32-x64.tar.gz\\` - Windows x64\\\",\n258: runs-on: ubuntu-latest\n\n.github/workflows/evals.yml:\n9: runs-on: ubuntu-latest\n61: echo \"NEXT_PUBLIC_CB_ENVIRONMENT=test\" >> $GITHUB_ENV\n\n.github/workflows/npm-app-release-prod.yml:\n22: runs-on: ubuntu-latest\n105: runs-on: ubuntu-latest\n150: runs-on: ubuntu-latest\n\n./npm-app/src/menu.ts:\n400:${hasKnowledgeMd && !hasCodebuffJson ? `\\n${yellow(`${codebuffConfigFile} runs deployment scripts for you to test your code and runs configured checks for you by running your dev server.`)}` : ''}\n402:${!hasKnowledgeMd && !hasCodebuffJson ? `\\n${yellow('knowledge.md helps Codebuff understand your project structure and codebase better for better results.')}\\n${yellow(`${codebuffConfigFile} runs deployment scripts for you to test your code and runs configured checks for you by running your dev server.`)}` : ''}`\n422:${cyan(' • \"Create a unit test for the auth module\"')}\n\n.github/knowledge.md:\n8:2. **Test Job**: Runs tests for npm-app, backend, and common packages in parallel using matrix strategy\n27:Each test job:\n29:- Runs unit tests only (excludes integration tests)\n31:- Sets `CODEBUFF_GITHUB_ACTIONS=true` and `NEXT_PUBLIC_CB_ENVIRONMENT=test`\n37:- Test environment flags are set for proper test execution\n42:- Build job must complete before test jobs start (`needs: build`)\n87: bun act -j test-backend\n135:2. If tests fail with environment issues:\n153:6. Use the retry mechanism for flaky tests\n\n./npm-app/src/create-template-project.ts:\n20: if (!/^[a-zA-Z0-9-_]+$/.test(template)) {\n36: if (!/^[a-zA-Z0-9-_]+$/.test(projectName)) {\n\n./npm-app/src/client.ts:\n126: console.log('Make sure you are on the latest version of Codebuff!')\n1121: )}: Runs tests, linting, and type checking when you modify files\\n• ${bold(\n1373: checkpointAddendum = ` or \"checkpoint ${checkpointManager.getLatestCheckpoint().id}\" to revert`\n1375: // No latest checkpoint, don't show addendum\n1382: 'No latest checkpoint for addendum',\n\n.agents/base-lite.ts:\n70:- You are not the only one making changes to files. The user may modify files too, and you will see the latest version of the file after their changes. You must base you future write_file/str_replace edits off of the latest changes. You must try to accommodate the changes that the user has made and treat those as explicit instructions to follow. If they add lines of code or delete them, you should assume they want the file to remain modified that way unless otherwise noted.\n108:- **Package Management:** When adding new packages, use the run_terminal_command tool to install the package rather than editing the package.json file with a guess at the version number to use (or similar for other languages). This way, you will be sure to have the latest version of the package. Do not install packages globally unless asked by the user (e.g. Don\\'t run \\`npm install -g \\`). Always try to use the package manager associated with the project (e.g. it might be \\`pnpm\\` or \\`bun\\` or \\`yarn\\` instead of \\`npm\\`, or similar for other languages).\n110:- **Testing:** If you create a unit test, you should run it using \\`run_terminal_command\\` to see if it passes, and fix it if it doesn\\'t.\n149:Check the knowledge files to see if the user has specified a further protocol for what terminal commands should be run to verify edits. For example, a \\`knowledge.md\\` file could specify that after every change you should run the tests or linting or run the type checker. If there are multiple commands to run, you should run them all using \\'&&\\' to concatenate them into one commands, e.g. \\`npm run lint && npm run test\\`.\n312:If the user had knowledge files (or CLAUDE.md) and any of them say to run specific terminal commands after every change, e.g. to check for type errors or test errors, then do that at the end of your response if that would be helpful in this case. No need to run these checks for simple changes.\n\n.agents/claude4-gemini-thinking.ts:\n65:- You are not the only one making changes to files. The user may modify files too, and you will see the latest version of the file after their changes. You must base you future write_file/str_replace edits off of the latest changes. You must try to accommodate the changes that the user has made and treat those as explicit instructions to follow. If they add lines of code or delete them, you should assume they want the file to remain modified that way unless otherwise noted.\n103:- **Package Management:** When adding new packages, use the run_terminal_command tool to install the package rather than editing the package.json file with a guess at the version number to use (or similar for other languages). This way, you will be sure to have the latest version of the package. Do not install packages globally unless asked by the user (e.g. Don\\'t run \\`npm install -g \\`). Always try to use the package manager associated with the project (e.g. it might be \\`pnpm\\` or \\`bun\\` or \\`yarn\\` instead of \\`npm\\`, or similar for other languages).\n105:- **Testing:** If you create a unit test, you should run it using \\`run_terminal_command\\` to see if it passes, and fix it if it doesn\\'t.\n144:Check the knowledge files to see if the user has specified a further protocol for what terminal commands should be run to verify edits. For example, a \\`knowledge.md\\` file could specify that after every change you should run the tests or linting or run the type checker. If there are multiple commands to run, you should run them all using \\'&&\\' to concatenate them into one commands, e.g. \\`npm run lint && npm run test\\`.\n305:If the user had knowledge files (or CLAUDE.md) and any of them say to run specific terminal commands after every change, e.g. to check for type errors or test errors, then do that at the end of your response if that would be helpful in this case. No need to run these checks for simple changes.\n\n.agents/reviewer.ts:\n39:4. Always run hooks for TypeScript/JavaScript changes, test file changes, or when the changes could affect compilation/tests\n\n./npm-app/src/__tests__/display.test.ts:\n1:import { describe, expect, it } from 'bun:test'\n\n.agents/types/tools.d.ts:\n56: /** Optional ripgrep flags to customize the search (e.g., \"-i\" for case-insensitive, \"-t ts\" for TypeScript files only, \"-A 3\" for 3 lines after match, \"-B 2\" for 2 lines before match, \"--type-not test\" to exclude test files). */\n\n.agents/base.ts:\n70:- You are not the only one making changes to files. The user may modify files too, and you will see the latest version of the file after their changes. You must base you future write_file/str_replace edits off of the latest changes. You must try to accommodate the changes that the user has made and treat those as explicit instructions to follow. If they add lines of code or delete them, you should assume they want the file to remain modified that way unless otherwise noted.\n108:- **Package Management:** When adding new packages, use the run_terminal_command tool to install the package rather than editing the package.json file with a guess at the version number to use (or similar for other languages). This way, you will be sure to have the latest version of the package. Do not install packages globally unless asked by the user (e.g. Don\\'t run \\`npm install -g \\`). Always try to use the package manager associated with the project (e.g. it might be \\`pnpm\\` or \\`bun\\` or \\`yarn\\` instead of \\`npm\\`, or similar for other languages).\n110:- **Testing:** If you create a unit test, you should run it using \\`run_terminal_command\\` to see if it passes, and fix it if it doesn\\'t.\n149:Check the knowledge files to see if the user has specified a further protocol for what terminal commands should be run to verify edits. For example, a \\`knowledge.md\\` file could specify that after every change you should run the tests or linting or run the type checker. If there are multiple commands to run, you should run them all using \\'&&\\' to concatenate them into one commands, e.g. \\`npm run lint && npm run test\\`.\n310:If the user had knowledge files (or CLAUDE.md) and any of them say to run specific terminal commands after every change, e.g. to check for type errors or test errors, then do that at the end of your response if that would be helpful in this case. No need to run these checks for simple changes.\n\n./backend/src/live-user-inputs.ts:\n88:// For testing purposes - reset all state\n\n./backend/src/__tests__/live-user-inputs.test.ts:\n1:import { describe, it, expect, beforeEach, afterEach } from 'bun:test'\n15: // Clear any existing state before each test\n20: // Clean up any state after each test\n95: // For unit testing, we'll test the function directly\n105: // For unit testing, we'll test that endUserInput doesn't remove the input\n\n./backend/src/llm-apis/message-cost-tracker.ts:\n245: 'Skipping Stripe sync (no user or test user).',\n591: `Credits used by test user (${creditsUsed})`,\n\n./backend/src/__tests__/loop-agent-steps.test.ts:\n6:} from '@codebuff/common/testing/mock-modules'\n18:} from 'bun:test'\n22:import { mockFileContext, MockWebSocket } from './test-utils'\n66: // Mock live user inputs - will be overridden in individual tests\n68: checkLiveUserInput: () => false, // Default to false, override in tests\n136: processedRepoId: 'test-repo-id',\n\n[Output size limit reached.]", - "message": "Stopped early after 110 match(es)." - }, - { - "stdout": "./backend/src/templates/agents/planner.ts:\n1:import { AGENT_PERSONAS } from '@codebuff/common/constants/agents'\n12: displayName: AGENT_PERSONAS.planner.displayName,\n13: spawnPurposePrompt: AGENT_PERSONAS.planner.purpose,\n\n./backend/src/templates/agents/superagent.ts:\n1:import { AGENT_PERSONAS } from '@codebuff/common/constants/agents'\n15: displayName: AGENT_PERSONAS.superagent.displayName,\n16: spawnPurposePrompt: AGENT_PERSONAS.superagent.purpose,\n\n./backend/src/templates/agents/ask.ts:\n1:import { AGENT_PERSONAS } from '@codebuff/common/constants/agents'\n17: displayName: AGENT_PERSONAS.ask.displayName,\n\n./backend/src/templates/agents/thinking-base.ts:\n1:import { AGENT_PERSONAS } from '@codebuff/common/constants/agents'\n19: displayName: AGENT_PERSONAS.base_lite.displayName,\n20: spawnPurposePrompt: AGENT_PERSONAS.base_lite.purpose,\n\n./backend/src/templates/agents/reviewer.ts:\n1:import { AGENT_PERSONAS } from '@codebuff/common/constants/agents'\n12: displayName: AGENT_PERSONAS.reviewer.displayName,\n13: spawnPurposePrompt: AGENT_PERSONAS.reviewer.purpose,\n\n./backend/src/templates/agents/thinker.ts:\n1:import { AGENT_PERSONAS } from '@codebuff/common/constants/agents'\n12: displayName: AGENT_PERSONAS.thinker.displayName,\n13: spawnPurposePrompt: AGENT_PERSONAS.thinker.purpose,\n\n./backend/src/templates/agents/archive/dry-run.ts:\n1:import { AGENT_PERSONAS } from '@codebuff/common/constants/agents'\n11: displayName: AGENT_PERSONAS.dry_run.displayName,\n12: spawnPurposePrompt: AGENT_PERSONAS.dry_run.purpose,\n\n./backend/src/templates/agents/researcher.ts:\n1:import { AGENT_PERSONAS } from '@codebuff/common/constants/agents'\n12: displayName: AGENT_PERSONAS.researcher.displayName,\n13: spawnPurposePrompt: AGENT_PERSONAS.researcher.purpose,\n\n./backend/src/templates/agents/base.ts:\n1:import { AGENT_PERSONAS } from '@codebuff/common/constants/agents'\n19: displayName: AGENT_PERSONAS.base.displayName,\n20: spawnPurposePrompt: AGENT_PERSONAS.base.purpose,\n\n./backend/src/templates/agents/file-picker.ts:\n1:import { AGENT_PERSONAS } from '@codebuff/common/constants/agents'\n11: displayName: AGENT_PERSONAS.file_picker.displayName,\n12: spawnPurposePrompt: AGENT_PERSONAS.file_picker.purpose,\n\n./common/src/constants/agents.ts:\n4:export const AGENT_PERSONAS = {\n90:// Agent IDs list from AGENT_PERSONAS keys\n92: AGENT_PERSONAS,\n93:) as (keyof typeof AGENT_PERSONAS)[]\n100: Object.entries(AGENT_PERSONAS).map(([agentType, persona]) => [\n104:) as Record\n107: (typeof AGENT_PERSONAS)[keyof typeof AGENT_PERSONAS]['displayName']\n112: Object.values(AGENT_PERSONAS)\n\n./common/src/util/agent-name-resolver.ts:\n1:import { AGENT_PERSONAS } from '../constants/agents'\n14: return Object.entries(AGENT_PERSONAS)", - "message": "Exit code: 0" - } - ] - } - } - } - ] - } - ] - }, - { - "type": "tool_call", - "toolCallId": "b1bb925b-9e8a-4bc1-82ae-59241e1a7ae2", - "toolName": "spawn_agent_inline", - "input": { - "agent_type": "context-pruner", - "params": {} - }, - "agentId": "main-agent", - "includeToolCall": false - }, - { - "type": "tool_result", - "toolCallId": "b1bb925b-9e8a-4bc1-82ae-59241e1a7ae2", - "toolName": "spawn_agent_inline", - "output": [ - { - "type": "json", - "value": { - "message": "Agent spawned." - } - } - ] - }, - { - "type": "tool_call", - "toolCallId": "D-R04gDrkuM", - "toolName": "spawn_agents", - "input": { - "agents": [ - { - "agent_type": "editor-gpt-5" - } - ] - }, - "agentId": "main-agent", - "includeToolCall": true - }, - { - "type": "subagent_start", - "agentId": "D-R1CTaJRmk", - "agentType": "editor-gpt-5", - "displayName": "Code Editor", - "onlyChild": true, - "parentAgentId": "main-agent", - "prompt": "" - }, - { - "type": "tool_call", - "toolCallId": "D-d15YQvrg4", - "toolName": "write_file", - "input": { - "path": "backend/src/templates/agents/agent-builder.ts", - "instructions": "Update agent builder to copy diff-reviewer examples to .agents/examples and a new your-custom-agent starter template to .agents root; remove spawnableAgents; fix example gathering paths and prompt text.", - "content": "import * as fs from 'fs'\nimport * as path from 'path'\n\nimport {\n AGENT_TEMPLATES_DIR,\n openrouterModels,\n AGENT_DEFINITION_FILE,\n} from '@codebuff/common/constants'\nimport { AgentTemplateTypes } from '@codebuff/common/types/session-state'\nimport z from 'zod/v4'\n\nimport type { AgentTemplate } from '../types'\nimport type { Model } from '@codebuff/common/constants'\nimport type { ToolName } from '@codebuff/common/tools/constants'\n\nconst COMMON_UTIL_PATH = '../../../../common/src/util'\nconst TEMPLATE_RELATIVE_PATH =\n `${COMMON_UTIL_PATH}/types/${AGENT_DEFINITION_FILE}` as const\n// Import to validate path exists at compile time\nimport(TEMPLATE_RELATIVE_PATH)\n\nconst TEMPLATE_PATH = path.join(__dirname, TEMPLATE_RELATIVE_PATH)\nconst DEFAULT_MODEL = openrouterModels.openrouter_claude_sonnet_4\nconst TYPES_DIR = path.join(AGENT_TEMPLATES_DIR, 'types')\nconst EXAMPLES_DIR = path.join(AGENT_TEMPLATES_DIR, 'examples')\nconst TEMPLATE_TYPES_PATH = path.join(TYPES_DIR, AGENT_DEFINITION_FILE)\nconst TOOL_DEFINITIONS_FILE = 'tools.d.ts'\nconst TOOL_DEFINITIONS_PATH = path.join(TYPES_DIR, TOOL_DEFINITIONS_FILE)\n\nconst EXAMPLES_SOURCE_DIR = path.join(__dirname, `${COMMON_UTIL_PATH}/examples`)\nconst STARTER_TEMPLATE_SOURCE_FILE = 'your-custom-agent.ts.txt'\nconst STARTER_TEMPLATE_DEST_FILE = 'your-custom-agent.ts'\n\nexport const agentBuilder = (\n model: Model,\n allAvailableAgents?: string[],\n): Omit => {\n // Read the AGENT_CONFIG_FILE content dynamically\n // The import above ensures this path exists at compile time\n let agentTemplateContent = ''\n try {\n agentTemplateContent = fs.readFileSync(TEMPLATE_PATH, 'utf8')\n } catch (error) {\n console.warn(`Could not read ${AGENT_DEFINITION_FILE}:`, error)\n agentTemplateContent = '// Agent template types not available'\n }\n\n // Read the tools.d.ts content from common package\n let toolDefinitionsContent = ''\n try {\n const toolsPath = path.join(\n __dirname,\n `${COMMON_UTIL_PATH}/types/tools.d.ts`,\n )\n toolDefinitionsContent = fs.readFileSync(toolsPath, 'utf8')\n } catch (error) {\n console.warn(`Could not read tools.d.ts from common:`, error)\n toolDefinitionsContent = '// Tool definitions not available'\n }\n\n // Read example agent files from common package\n const exampleAgentContents: Record = {}\n let starterTemplateContent = ''\n\n try {\n if (fs.existsSync(EXAMPLES_SOURCE_DIR)) {\n const files = fs.readdirSync(EXAMPLES_SOURCE_DIR)\n\n files\n .filter(\n (file) => file.endsWith('.ts') && file.startsWith('diff-reviewer-'),\n )\n .forEach((filename) => {\n const fullPath = path.join(EXAMPLES_SOURCE_DIR, filename)\n const content = fs.readFileSync(fullPath, 'utf8')\n exampleAgentContents[filename] = content\n })\n\n const starterTemplatePath = path.join(\n EXAMPLES_SOURCE_DIR,\n STARTER_TEMPLATE_SOURCE_FILE,\n )\n if (fs.existsSync(starterTemplatePath)) {\n starterTemplateContent = fs.readFileSync(starterTemplatePath, 'utf8')\n }\n } else {\n console.warn(\n `Example agents directory does not exist: ${EXAMPLES_SOURCE_DIR}`,\n )\n }\n } catch (error) {\n console.warn('Could not read example agents:', error)\n }\n\n return {\n model,\n displayName: 'Bob the Agent Builder',\n spawnPurposePrompt:\n 'Enhanced base agent that can create custom agents and handle all coding tasks with deterministic agent creation behavior',\n inputSchema: {\n prompt: z\n .string()\n .optional()\n .describe(\n 'What agent type you would like to create or edit. Include as many details as possible.',\n ),\n params: z\n .object({\n name: z.string().optional(),\n purpose: z.string().optional(),\n specialty: z.string().optional(),\n model: z.string().optional(),\n })\n .passthrough()\n .optional(),\n },\n outputMode: 'structured_output',\n includeMessageHistory: false,\n toolNames: [\n 'write_file',\n 'str_replace',\n 'run_terminal_command',\n 'read_files',\n 'code_search',\n 'spawn_agents',\n 'add_message',\n 'set_output',\n 'end_turn',\n ] satisfies ToolName[],\n\n systemPrompt: [\n '# Bob the Agent Builder',\n '',\n 'You are an expert agent builder specialized in creating new agent templates for the codebuff system. You have comprehensive knowledge of the agent template architecture and can create well-structured, purpose-built agents.',\n '',\n '## Environment Setup Complete',\n '',\n 'Your environment has been automatically prepared with:',\n '- Agent template type definitions in `.agents/types/agent-definition.d.ts`',\n '- Tool type definitions in `.agents/types/tools.d.ts`',\n '- Diff-reviewer examples in `.agents/examples/` for reference',\n '- A starter custom agent template at `.agents/your-custom-agent.ts`',\n '',\n 'All necessary files are now available in your working directory.',\n '',\n '## Complete Agent Template Type Definitions',\n '',\n 'Here are the complete TypeScript type definitions for creating custom Codebuff agents:',\n '```typescript',\n agentTemplateContent,\n '```',\n '',\n '## Available Tools Type Definitions',\n '',\n 'Here are the complete TypeScript type definitions for all available tools:',\n '',\n '```typescript',\n toolDefinitionsContent,\n '```',\n '',\n '## Agent Template Patterns:',\n '',\n '1. **Base Agent Pattern**: Full-featured agents with comprehensive tool access',\n '2. **Specialized Agent Pattern**: Focused agents with limited tool sets',\n '3. **Thinking Agent Pattern**: Agents that spawn thinker sub-agents',\n '4. **Research Agent Pattern**: Agents that start with web search',\n '',\n '## Best Practices:',\n '',\n '1. **Use as few fields as possible**: Leave out fields that are not needed to reduce complexity',\n '2. **Minimal Tools**: Only include tools the agent actually needs',\n '3. **Clear and Concise Prompts**: Write clear, specific prompts that have no unnecessary words',\n '4. **Consistent Naming**: Follow naming conventions (kebab-case for IDs)',\n '5. **Appropriate Model**: Choose the right model for the task complexity. Default is claude-4-sonnet-20250522 for medium-high complexity tasks, and openai/gpt-5 for all other tasks.',\n '',\n '## Your Task:',\n 'When asked to create an agent template, you should:',\n \"1. Understand the requested agent's purpose and capabilities\",\n \"2. Choose appropriate tools for the agent's function\",\n '3. Write a comprehensive system prompt',\n `4. Create the complete agent template file in ${AGENT_TEMPLATES_DIR}`,\n '5. Ensure the template follows all conventions and best practices',\n '6. Use the AgentDefinition interface for the configuration',\n '7. Start the file with: import type { AgentDefinition } from \"./types/agent-definition.d.ts\"',\n '',\n 'Create agent templates that are focused, efficient, and well-documented. Always import the AgentDefinition type and export a default configuration object.',\n ].join('\\n'),\n instructionsPrompt: `You are helping to create or edit an agent template. The user will describe what kind of agent they want to create or how they want to modify an existing agent.\n\n## Environment Ready\n\nYour environment has been automatically set up with:\n- Type definitions in \\`.agents/types/\\`\n- Diff-reviewer examples in \\`.agents/examples/\\`\n- A starter custom agent template at \\`.agents/your-custom-agent.ts\\`\n\nYou can now proceed directly to agent creation or editing.\n\n## Example Agents Available\n\nThree diff-reviewer examples are available in \\`.agents/examples/\\`. These can serve as examples of well-made agents at different stages of complexity.\n\n**IMPORTANT**: Examine these examples to find connections and patterns that relate to the user's request. Look for:\n- Similar tool combinations\n- Comparable complexity levels\n- Related functionality patterns\n- Appropriate model choices\n- Relevant prompt structures\n\nUse these examples as inspiration and starting points, adapting their patterns to fit the user's specific needs.\n\n## Starter Template Available\n\nA starter custom agent file is available at \\`.agents/your-custom-agent.ts\\`. You can either modify this file directly or use it as a reference for creating a new agent.\n\n## For New Agents\n\nAnalyze their request and create a complete agent template that:\n- Has a clear purpose and appropriate capabilities\n- Leaves out fields that are not needed\n- Uses only the tools it needs\n- Follows naming conventions\n- Is properly structured\n- Draws inspiration from relevant example agents\n\n## For Creating New Agents\n\nThe agent builder is focused on creating new agent templates based on user specifications.\n\nIMPORTANT: Always end your response with the end_turn tool when you have completed the agent creation or editing task.`,\n stepPrompt: '',\n\n handleSteps: function* ({ agentState, prompt, params }) {\n // Step 1: Create directory structure\n yield {\n toolName: 'run_terminal_command',\n args: {\n command: `mkdir -p ${TYPES_DIR} && mkdir -p ${EXAMPLES_DIR}`,\n process_type: 'SYNC',\n timeout_seconds: 10,\n },\n }\n\n // Step 2: Write the AGENT_DEFINITION_FILE with the template content\n yield {\n toolName: 'write_file',\n args: {\n path: TEMPLATE_TYPES_PATH,\n instructions: 'Create agent template type definitions file',\n content: agentTemplateContent,\n },\n }\n\n // Step 3: Write the tool definitions file (copy from existing tools.d.ts)\n yield {\n toolName: 'write_file',\n args: {\n path: TOOL_DEFINITIONS_PATH,\n instructions: 'Create tools type file',\n content: toolDefinitionsContent,\n },\n }\n\n // Step 4: Add message about reading example files and then read them\n yield {\n toolName: 'add_message',\n args: {\n role: 'assistant',\n content:\n \"I'll review the starter template and diff-reviewer examples, then help you create your agent.\",\n },\n }\n\n // Step 5: Copy example agent files to .agents/examples/\n for (const [filename, content] of Object.entries(exampleAgentContents)) {\n if (content) {\n yield {\n toolName: 'write_file',\n args: {\n path: `${EXAMPLES_DIR}/${filename}`,\n instructions: `Copy example agent file ${filename}`,\n content: content,\n },\n }\n }\n }\n\n // Step 6: Copy starter template directly to .agents/\n if (starterTemplateContent) {\n yield {\n toolName: 'write_file',\n args: {\n path: `${AGENT_TEMPLATES_DIR}/${STARTER_TEMPLATE_DEST_FILE}`,\n instructions: `Copy starter custom agent template ${STARTER_TEMPLATE_DEST_FILE}`,\n content: starterTemplateContent,\n },\n }\n }\n\n // Step 7: Complete agent creation process\n yield 'STEP_ALL'\n },\n }\n}\n" - }, - "agentId": "D-R1CTaJRmk", - "parentAgentId": "main-agent", - "includeToolCall": true - }, - { - "type": "tool_result", - "toolCallId": "D-d15YQvrg4", - "toolName": "write_file", - "output": [ - { - "type": "json", - "value": { - "file": "backend/src/templates/agents/agent-builder.ts", - "message": "Updated file", - "unifiedDiff": "@@ -26,8 +26,12 @@\n const TEMPLATE_TYPES_PATH = path.join(TYPES_DIR, AGENT_DEFINITION_FILE)\n const TOOL_DEFINITIONS_FILE = 'tools.d.ts'\n const TOOL_DEFINITIONS_PATH = path.join(TYPES_DIR, TOOL_DEFINITIONS_FILE)\n \n+const EXAMPLES_SOURCE_DIR = path.join(__dirname, `${COMMON_UTIL_PATH}/examples`)\n+const STARTER_TEMPLATE_SOURCE_FILE = 'your-custom-agent.ts.txt'\n+const STARTER_TEMPLATE_DEST_FILE = 'your-custom-agent.ts'\n+\n export const agentBuilder = (\n model: Model,\n allAvailableAgents?: string[],\n ): Omit => {\n@@ -39,8 +43,9 @@\n } catch (error) {\n console.warn(`Could not read ${AGENT_DEFINITION_FILE}:`, error)\n agentTemplateContent = '// Agent template types not available'\n }\n+\n // Read the tools.d.ts content from common package\n let toolDefinitionsContent = ''\n try {\n const toolsPath = path.join(\n@@ -54,35 +59,38 @@\n }\n \n // Read example agent files from common package\n const exampleAgentContents: Record = {}\n+ let starterTemplateContent = ''\n \n try {\n- const exampleAgentsDir = path.join(__dirname, `${COMMON_UTIL_PATH}`)\n- // Check if directory exists before trying to read it\n- if (fs.existsSync(exampleAgentsDir)) {\n- const files = fs.readdirSync(exampleAgentsDir)\n+ if (fs.existsSync(EXAMPLES_SOURCE_DIR)) {\n+ const files = fs.readdirSync(EXAMPLES_SOURCE_DIR)\n \n files\n .filter(\n- (file) => file.endsWith('.ts') && file.startsWith('diff-reviewer'),\n+ (file) => file.endsWith('.ts') && file.startsWith('diff-reviewer-'),\n )\n .forEach((filename) => {\n- try {\n- const fullPath = path.join(exampleAgentsDir, filename)\n- const content = fs.readFileSync(fullPath, 'utf8')\n- exampleAgentContents[filename] = content\n- } catch (error) {\n- console.warn(`Could not read example agent ${filename}:`, error)\n- }\n+ const fullPath = path.join(EXAMPLES_SOURCE_DIR, filename)\n+ const content = fs.readFileSync(fullPath, 'utf8')\n+ exampleAgentContents[filename] = content\n })\n+\n+ const starterTemplatePath = path.join(\n+ EXAMPLES_SOURCE_DIR,\n+ STARTER_TEMPLATE_SOURCE_FILE,\n+ )\n+ if (fs.existsSync(starterTemplatePath)) {\n+ starterTemplateContent = fs.readFileSync(starterTemplatePath, 'utf8')\n+ }\n } else {\n console.warn(\n- `Example agents directory does not exist: ${exampleAgentsDir}`,\n+ `Example agents directory does not exist: ${EXAMPLES_SOURCE_DIR}`,\n )\n }\n } catch (error) {\n- console.warn('Could not read example agents directory:', error)\n+ console.warn('Could not read example agents:', error)\n }\n \n return {\n model,\n@@ -138,9 +146,10 @@\n '',\n 'Your environment has been automatically prepared with:',\n '- Agent template type definitions in `.agents/types/agent-definition.d.ts`',\n '- Tool type definitions in `.agents/types/tools.d.ts`',\n- '- Example agent files copied to `.agents/` directory for reference',\n+ '- Diff-reviewer examples in `.agents/examples/` for reference',\n+ '- A starter custom agent template at `.agents/your-custom-agent.ts`',\n '',\n 'All necessary files are now available in your working directory.',\n '',\n '## Complete Agent Template Type Definitions',\n@@ -190,16 +199,16 @@\n ## Environment Ready\n \n Your environment has been automatically set up with:\n - Type definitions in \\`.agents/types/\\`\n-- Example agent files in \\`.agents/\\` directory\n-- All necessary scaffolding complete\n+- Diff-reviewer examples in \\`.agents/examples/\\`\n+- A starter custom agent template at \\`.agents/your-custom-agent.ts\\`\n \n You can now proceed directly to agent creation or editing.\n \n ## Example Agents Available\n \n-Three example agents are now available in your \\`.agents/\\` directory which are all diff reviewers of increasing complexity. These can serve as examples of well-made agents at different stages of complexity.\n+Three diff-reviewer examples are available in \\`.agents/examples/\\`. These can serve as examples of well-made agents at different stages of complexity.\n \n **IMPORTANT**: Examine these examples to find connections and patterns that relate to the user's request. Look for:\n - Similar tool combinations\n - Comparable complexity levels\n@@ -208,8 +217,12 @@\n - Relevant prompt structures\n \n Use these examples as inspiration and starting points, adapting their patterns to fit the user's specific needs.\n \n+## Starter Template Available\n+\n+A starter custom agent file is available at \\`.agents/your-custom-agent.ts\\`. You can either modify this file directly or use it as a reference for creating a new agent.\n+\n ## For New Agents\n \n Analyze their request and create a complete agent template that:\n - Has a clear purpose and appropriate capabilities\n@@ -262,13 +275,13 @@\n toolName: 'add_message',\n args: {\n role: 'assistant',\n content:\n- \"I'll read the example agent files to understand the patterns and then help you create your agent.\",\n+ \"I'll review the starter template and diff-reviewer examples, then help you create your agent.\",\n },\n }\n \n- // Step 5: Copy example agent files to .agents/ directory\n+ // Step 5: Copy example agent files to .agents/examples/\n for (const [filename, content] of Object.entries(exampleAgentContents)) {\n if (content) {\n yield {\n toolName: 'write_file',\n@@ -280,9 +293,21 @@\n }\n }\n }\n \n- // Step 6: Complete agent creation process\n+ // Step 6: Copy starter template directly to .agents/\n+ if (starterTemplateContent) {\n+ yield {\n+ toolName: 'write_file',\n+ args: {\n+ path: `${AGENT_TEMPLATES_DIR}/${STARTER_TEMPLATE_DEST_FILE}`,\n+ instructions: `Copy starter custom agent template ${STARTER_TEMPLATE_DEST_FILE}`,\n+ content: starterTemplateContent,\n+ },\n+ }\n+ }\n+\n+ // Step 7: Complete agent creation process\n yield 'STEP_ALL'\n },\n }\n }\n" - } - } - ], - "parentAgentId": "D-R1CTaJRmk" - }, - { - "type": "tool_call", - "toolCallId": "9cfbe4a6-f0b9-4f64-93d8-74c25ed6af43", - "toolName": "set_output", - "input": { - "output": { - "message": "", - "toolResults": [ - { - "file": "backend/src/templates/agents/agent-builder.ts", - "message": "Updated file", - "unifiedDiff": "@@ -26,8 +26,12 @@\n const TEMPLATE_TYPES_PATH = path.join(TYPES_DIR, AGENT_DEFINITION_FILE)\n const TOOL_DEFINITIONS_FILE = 'tools.d.ts'\n const TOOL_DEFINITIONS_PATH = path.join(TYPES_DIR, TOOL_DEFINITIONS_FILE)\n \n+const EXAMPLES_SOURCE_DIR = path.join(__dirname, `${COMMON_UTIL_PATH}/examples`)\n+const STARTER_TEMPLATE_SOURCE_FILE = 'your-custom-agent.ts.txt'\n+const STARTER_TEMPLATE_DEST_FILE = 'your-custom-agent.ts'\n+\n export const agentBuilder = (\n model: Model,\n allAvailableAgents?: string[],\n ): Omit => {\n@@ -39,8 +43,9 @@\n } catch (error) {\n console.warn(`Could not read ${AGENT_DEFINITION_FILE}:`, error)\n agentTemplateContent = '// Agent template types not available'\n }\n+\n // Read the tools.d.ts content from common package\n let toolDefinitionsContent = ''\n try {\n const toolsPath = path.join(\n@@ -54,35 +59,38 @@\n }\n \n // Read example agent files from common package\n const exampleAgentContents: Record = {}\n+ let starterTemplateContent = ''\n \n try {\n- const exampleAgentsDir = path.join(__dirname, `${COMMON_UTIL_PATH}`)\n- // Check if directory exists before trying to read it\n- if (fs.existsSync(exampleAgentsDir)) {\n- const files = fs.readdirSync(exampleAgentsDir)\n+ if (fs.existsSync(EXAMPLES_SOURCE_DIR)) {\n+ const files = fs.readdirSync(EXAMPLES_SOURCE_DIR)\n \n files\n .filter(\n- (file) => file.endsWith('.ts') && file.startsWith('diff-reviewer'),\n+ (file) => file.endsWith('.ts') && file.startsWith('diff-reviewer-'),\n )\n .forEach((filename) => {\n- try {\n- const fullPath = path.join(exampleAgentsDir, filename)\n- const content = fs.readFileSync(fullPath, 'utf8')\n- exampleAgentContents[filename] = content\n- } catch (error) {\n- console.warn(`Could not read example agent ${filename}:`, error)\n- }\n+ const fullPath = path.join(EXAMPLES_SOURCE_DIR, filename)\n+ const content = fs.readFileSync(fullPath, 'utf8')\n+ exampleAgentContents[filename] = content\n })\n+\n+ const starterTemplatePath = path.join(\n+ EXAMPLES_SOURCE_DIR,\n+ STARTER_TEMPLATE_SOURCE_FILE,\n+ )\n+ if (fs.existsSync(starterTemplatePath)) {\n+ starterTemplateContent = fs.readFileSync(starterTemplatePath, 'utf8')\n+ }\n } else {\n console.warn(\n- `Example agents directory does not exist: ${exampleAgentsDir}`,\n+ `Example agents directory does not exist: ${EXAMPLES_SOURCE_DIR}`,\n )\n }\n } catch (error) {\n- console.warn('Could not read example agents directory:', error)\n+ console.warn('Could not read example agents:', error)\n }\n \n return {\n model,\n@@ -138,9 +146,10 @@\n '',\n 'Your environment has been automatically prepared with:',\n '- Agent template type definitions in `.agents/types/agent-definition.d.ts`',\n '- Tool type definitions in `.agents/types/tools.d.ts`',\n- '- Example agent files copied to `.agents/` directory for reference',\n+ '- Diff-reviewer examples in `.agents/examples/` for reference',\n+ '- A starter custom agent template at `.agents/your-custom-agent.ts`',\n '',\n 'All necessary files are now available in your working directory.',\n '',\n '## Complete Agent Template Type Definitions',\n@@ -190,16 +199,16 @@\n ## Environment Ready\n \n Your environment has been automatically set up with:\n - Type definitions in \\`.agents/types/\\`\n-- Example agent files in \\`.agents/\\` directory\n-- All necessary scaffolding complete\n+- Diff-reviewer examples in \\`.agents/examples/\\`\n+- A starter custom agent template at \\`.agents/your-custom-agent.ts\\`\n \n You can now proceed directly to agent creation or editing.\n \n ## Example Agents Available\n \n-Three example agents are now available in your \\`.agents/\\` directory which are all diff reviewers of increasing complexity. These can serve as examples of well-made agents at different stages of complexity.\n+Three diff-reviewer examples are available in \\`.agents/examples/\\`. These can serve as examples of well-made agents at different stages of complexity.\n \n **IMPORTANT**: Examine these examples to find connections and patterns that relate to the user's request. Look for:\n - Similar tool combinations\n - Comparable complexity levels\n@@ -208,8 +217,12 @@\n - Relevant prompt structures\n \n Use these examples as inspiration and starting points, adapting their patterns to fit the user's specific needs.\n \n+## Starter Template Available\n+\n+A starter custom agent file is available at \\`.agents/your-custom-agent.ts\\`. You can either modify this file directly or use it as a reference for creating a new agent.\n+\n ## For New Agents\n \n Analyze their request and create a complete agent template that:\n - Has a clear purpose and appropriate capabilities\n@@ -262,13 +275,13 @@\n toolName: 'add_message',\n args: {\n role: 'assistant',\n content:\n- \"I'll read the example agent files to understand the patterns and then help you create your agent.\",\n+ \"I'll review the starter template and diff-reviewer examples, then help you create your agent.\",\n },\n }\n \n- // Step 5: Copy example agent files to .agents/ directory\n+ // Step 5: Copy example agent files to .agents/examples/\n for (const [filename, content] of Object.entries(exampleAgentContents)) {\n if (content) {\n yield {\n toolName: 'write_file',\n@@ -280,9 +293,21 @@\n }\n }\n }\n \n- // Step 6: Complete agent creation process\n+ // Step 6: Copy starter template directly to .agents/\n+ if (starterTemplateContent) {\n+ yield {\n+ toolName: 'write_file',\n+ args: {\n+ path: `${AGENT_TEMPLATES_DIR}/${STARTER_TEMPLATE_DEST_FILE}`,\n+ instructions: `Copy starter custom agent template ${STARTER_TEMPLATE_DEST_FILE}`,\n+ content: starterTemplateContent,\n+ },\n+ }\n+ }\n+\n+ // Step 7: Complete agent creation process\n yield 'STEP_ALL'\n },\n }\n }\n" - } - ] - } - }, - "agentId": "D-R1CTaJRmk", - "parentAgentId": "main-agent", - "includeToolCall": false - }, - { - "type": "tool_result", - "toolCallId": "9cfbe4a6-f0b9-4f64-93d8-74c25ed6af43", - "toolName": "set_output", - "output": [ - { - "type": "json", - "value": { - "message": "Output set" - } - } - ], - "parentAgentId": "D-R1CTaJRmk" - }, - { - "type": "subagent_finish", - "agentId": "D-R1CTaJRmk", - "agentType": "editor-gpt-5", - "displayName": "Code Editor", - "onlyChild": true, - "parentAgentId": "main-agent", - "prompt": "" - }, - { - "type": "tool_result", - "toolCallId": "D-R04gDrkuM", - "toolName": "spawn_agents", - "output": [ - { - "type": "json", - "value": [ - { - "agentName": "Code Editor", - "agentType": "editor-gpt-5", - "value": { - "type": "structuredOutput", - "value": { - "output": { - "message": "", - "toolResults": [ - { - "file": "backend/src/templates/agents/agent-builder.ts", - "message": "Updated file", - "unifiedDiff": "@@ -26,8 +26,12 @@\n const TEMPLATE_TYPES_PATH = path.join(TYPES_DIR, AGENT_DEFINITION_FILE)\n const TOOL_DEFINITIONS_FILE = 'tools.d.ts'\n const TOOL_DEFINITIONS_PATH = path.join(TYPES_DIR, TOOL_DEFINITIONS_FILE)\n \n+const EXAMPLES_SOURCE_DIR = path.join(__dirname, `${COMMON_UTIL_PATH}/examples`)\n+const STARTER_TEMPLATE_SOURCE_FILE = 'your-custom-agent.ts.txt'\n+const STARTER_TEMPLATE_DEST_FILE = 'your-custom-agent.ts'\n+\n export const agentBuilder = (\n model: Model,\n allAvailableAgents?: string[],\n ): Omit => {\n@@ -39,8 +43,9 @@\n } catch (error) {\n console.warn(`Could not read ${AGENT_DEFINITION_FILE}:`, error)\n agentTemplateContent = '// Agent template types not available'\n }\n+\n // Read the tools.d.ts content from common package\n let toolDefinitionsContent = ''\n try {\n const toolsPath = path.join(\n@@ -54,35 +59,38 @@\n }\n \n // Read example agent files from common package\n const exampleAgentContents: Record = {}\n+ let starterTemplateContent = ''\n \n try {\n- const exampleAgentsDir = path.join(__dirname, `${COMMON_UTIL_PATH}`)\n- // Check if directory exists before trying to read it\n- if (fs.existsSync(exampleAgentsDir)) {\n- const files = fs.readdirSync(exampleAgentsDir)\n+ if (fs.existsSync(EXAMPLES_SOURCE_DIR)) {\n+ const files = fs.readdirSync(EXAMPLES_SOURCE_DIR)\n \n files\n .filter(\n- (file) => file.endsWith('.ts') && file.startsWith('diff-reviewer'),\n+ (file) => file.endsWith('.ts') && file.startsWith('diff-reviewer-'),\n )\n .forEach((filename) => {\n- try {\n- const fullPath = path.join(exampleAgentsDir, filename)\n- const content = fs.readFileSync(fullPath, 'utf8')\n- exampleAgentContents[filename] = content\n- } catch (error) {\n- console.warn(`Could not read example agent ${filename}:`, error)\n- }\n+ const fullPath = path.join(EXAMPLES_SOURCE_DIR, filename)\n+ const content = fs.readFileSync(fullPath, 'utf8')\n+ exampleAgentContents[filename] = content\n })\n+\n+ const starterTemplatePath = path.join(\n+ EXAMPLES_SOURCE_DIR,\n+ STARTER_TEMPLATE_SOURCE_FILE,\n+ )\n+ if (fs.existsSync(starterTemplatePath)) {\n+ starterTemplateContent = fs.readFileSync(starterTemplatePath, 'utf8')\n+ }\n } else {\n console.warn(\n- `Example agents directory does not exist: ${exampleAgentsDir}`,\n+ `Example agents directory does not exist: ${EXAMPLES_SOURCE_DIR}`,\n )\n }\n } catch (error) {\n- console.warn('Could not read example agents directory:', error)\n+ console.warn('Could not read example agents:', error)\n }\n \n return {\n model,\n@@ -138,9 +146,10 @@\n '',\n 'Your environment has been automatically prepared with:',\n '- Agent template type definitions in `.agents/types/agent-definition.d.ts`',\n '- Tool type definitions in `.agents/types/tools.d.ts`',\n- '- Example agent files copied to `.agents/` directory for reference',\n+ '- Diff-reviewer examples in `.agents/examples/` for reference',\n+ '- A starter custom agent template at `.agents/your-custom-agent.ts`',\n '',\n 'All necessary files are now available in your working directory.',\n '',\n '## Complete Agent Template Type Definitions',\n@@ -190,16 +199,16 @@\n ## Environment Ready\n \n Your environment has been automatically set up with:\n - Type definitions in \\`.agents/types/\\`\n-- Example agent files in \\`.agents/\\` directory\n-- All necessary scaffolding complete\n+- Diff-reviewer examples in \\`.agents/examples/\\`\n+- A starter custom agent template at \\`.agents/your-custom-agent.ts\\`\n \n You can now proceed directly to agent creation or editing.\n \n ## Example Agents Available\n \n-Three example agents are now available in your \\`.agents/\\` directory which are all diff reviewers of increasing complexity. These can serve as examples of well-made agents at different stages of complexity.\n+Three diff-reviewer examples are available in \\`.agents/examples/\\`. These can serve as examples of well-made agents at different stages of complexity.\n \n **IMPORTANT**: Examine these examples to find connections and patterns that relate to the user's request. Look for:\n - Similar tool combinations\n - Comparable complexity levels\n@@ -208,8 +217,12 @@\n - Relevant prompt structures\n \n Use these examples as inspiration and starting points, adapting their patterns to fit the user's specific needs.\n \n+## Starter Template Available\n+\n+A starter custom agent file is available at \\`.agents/your-custom-agent.ts\\`. You can either modify this file directly or use it as a reference for creating a new agent.\n+\n ## For New Agents\n \n Analyze their request and create a complete agent template that:\n - Has a clear purpose and appropriate capabilities\n@@ -262,13 +275,13 @@\n toolName: 'add_message',\n args: {\n role: 'assistant',\n content:\n- \"I'll read the example agent files to understand the patterns and then help you create your agent.\",\n+ \"I'll review the starter template and diff-reviewer examples, then help you create your agent.\",\n },\n }\n \n- // Step 5: Copy example agent files to .agents/ directory\n+ // Step 5: Copy example agent files to .agents/examples/\n for (const [filename, content] of Object.entries(exampleAgentContents)) {\n if (content) {\n yield {\n toolName: 'write_file',\n@@ -280,9 +293,21 @@\n }\n }\n }\n \n- // Step 6: Complete agent creation process\n+ // Step 6: Copy starter template directly to .agents/\n+ if (starterTemplateContent) {\n+ yield {\n+ toolName: 'write_file',\n+ args: {\n+ path: `${AGENT_TEMPLATES_DIR}/${STARTER_TEMPLATE_DEST_FILE}`,\n+ instructions: `Copy starter custom agent template ${STARTER_TEMPLATE_DEST_FILE}`,\n+ content: starterTemplateContent,\n+ },\n+ }\n+ }\n+\n+ // Step 7: Complete agent creation process\n yield 'STEP_ALL'\n },\n }\n }\n" - } - ] - } - } - } - } - ] - } - ] - }, - { - "type": "tool_call", - "toolCallId": "55caccf4-2925-4acb-8edc-bddc857a35d4", - "toolName": "spawn_agent_inline", - "input": { - "agent_type": "context-pruner", - "params": {} - }, - "agentId": "main-agent", - "includeToolCall": false - }, - { - "type": "tool_result", - "toolCallId": "55caccf4-2925-4acb-8edc-bddc857a35d4", - "toolName": "spawn_agent_inline", - "output": [ - { - "type": "json", - "value": { - "message": "Agent spawned." - } - } - ] - }, - { - "type": "tool_call", - "toolCallId": "D-gXircIAUI", - "toolName": "spawn_agents", - "input": { - "agents": [ - { - "agent_type": "editor-gpt-5" - }, - { - "agent_type": "code-searcher", - "params": { - "searchQueries": [ - { - "pattern": "your-custom-agent|git-committer", - "flags": "-g common/src/util/examples" - }, - { - "pattern": "file-explorer spawn", - "flags": "-g *.ts" - } - ] - } - }, - { - "agent_type": "file-picker", - "prompt": "common/src/util/examples directory contents and related files" - }, - { - "agent_type": "commander-lite", - "prompt": "What are the package.json scripts for typecheck, lint, test, format in the root and relevant packages?", - "params": { - "command": "cat package.json scripts/package.json backend/package.json common/package.json | grep -E 'typecheck|lint|test|format' -A5" - } - } - ] - }, - "agentId": "main-agent", - "includeToolCall": true - }, - { - "type": "subagent_start", - "agentId": "D-gXwZERcWA", - "agentType": "editor-gpt-5", - "displayName": "Code Editor", - "onlyChild": false, - "parentAgentId": "main-agent", - "prompt": "" - }, - { - "type": "subagent_start", - "agentId": "D-gXwl0iLRI", - "agentType": "code-searcher", - "displayName": "Code Searcher", - "onlyChild": false, - "parentAgentId": "main-agent", - "prompt": "", - "params": { - "searchQueries": [ - { - "pattern": "your-custom-agent|git-committer", - "flags": "-g common/src/util/examples" - }, - { - "pattern": "file-explorer spawn", - "flags": "-g *.ts" - } - ] - } - }, - { - "type": "subagent_start", - "agentId": "D-gXwryrlBs", - "agentType": "file-picker", - "displayName": "Fletcher the File Fetcher", - "onlyChild": false, - "parentAgentId": "main-agent", - "prompt": "common/src/util/examples directory contents and related files" - }, - { - "type": "subagent_start", - "agentId": "D-gXwlFcRHk", - "agentType": "commander-lite", - "displayName": "Commander Lite", - "onlyChild": false, - "parentAgentId": "main-agent", - "prompt": "What are the package.json scripts for typecheck, lint, test, format in the root and relevant packages?", - "params": { - "command": "cat package.json scripts/package.json backend/package.json common/package.json | grep -E 'typecheck|lint|test|format' -A5" - } - }, - { - "type": "tool_call", - "toolCallId": "7452f59a-29c2-4003-9d1e-7efd0b614f3b", - "toolName": "spawn_agents", - "input": { - "agents": [ - { - "agent_type": "file-lister", - "prompt": "common/src/util/examples directory contents and related files", - "params": {} - } - ] - }, - "agentId": "D-gXwryrlBs", - "parentAgentId": "main-agent", - "includeToolCall": true - }, - { - "type": "subagent_start", - "agentId": "D-gYCDTSHSY", - "agentType": "file-lister", - "displayName": "Liszt the File Lister", - "onlyChild": true, - "parentAgentId": "D-gXwryrlBs", - "prompt": "common/src/util/examples directory contents and related files", - "params": {} - }, - { - "type": "tool_call", - "toolCallId": "ab5ce625-a859-4743-acee-dc28c1cd81d3", - "toolName": "code_search", - "input": { - "pattern": "your-custom-agent|git-committer", - "flags": "-g common/src/util/examples" - }, - "agentId": "D-gXwl0iLRI", - "parentAgentId": "main-agent", - "includeToolCall": true - }, - { - "type": "tool_call", - "toolCallId": "1ad7baa2-ff78-4573-9ba8-96171d5fdd73", - "toolName": "run_terminal_command", - "input": { - "command": "cat package.json scripts/package.json backend/package.json common/package.json | grep -E 'typecheck|lint|test|format' -A5" - }, - "agentId": "D-gXwlFcRHk", - "parentAgentId": "main-agent", - "includeToolCall": true - }, - { - "type": "tool_call", - "toolCallId": "d7eb4f35-0c13-4d6f-b0e6-a03afc3da49c", - "toolName": "read_subtree", - "input": { - "paths": [], - "maxTokens": 500000 - }, - "agentId": "D-gYCDTSHSY", - "parentAgentId": "D-gXwryrlBs", - "includeToolCall": true - }, - { - "type": "tool_result", - "toolCallId": "d7eb4f35-0c13-4d6f-b0e6-a03afc3da49c", - "toolName": "read_subtree", - "output": [ - { - "type": "json", - "value": [ - { - "path": ".", - "type": "directory", - "printedTree": ".agents/\n examples/\n diff-reviewer-1.ts\n diff-reviewer-2.ts\n diff-reviewer-3.ts\n opensource/\n base.ts\n coder.ts\n file-picker.ts\n researcher.ts\n reviewer.ts\n thinker.ts\n ask.ts\n base-experimental.ts\n base-lite.ts\n base-max.ts\n base.ts\n brainstormer.ts\n changes-reviewer.ts\n charles.ts\n claude4-gemini-thinking.ts\n constants.ts\n file-explorer.ts\n file-picker.ts\n git-committer.ts\n knowledge-keeper.ts\n planner.ts\n researcher.ts\n reviewer.ts\n superagent.ts\n thinker.ts\n.bin/\n bun\n.github/\n workflows/\n ci.yml\n evals.yml\n nightly-evals.yml\n npm-app-release-build.yml\n npm-app-release-prod.yml\n npm-app-release-staging.yml\n .gitignore\n CODEOWNERS\n knowledge.md\n.vscode/\n settings.json\nbackend/\n src/\n __tests__/\n test-data/\n dex-go/\n edit-snippet.go\n expected.go\n original.go\n agent-id-resolution.test.ts\n agent-registry.test.ts\n auto-topup.test.ts\n credit-conversion.test.ts\n fast-rewrite.test.ts\n generate-diffs-prompt.test.ts\n get-custom-file-picker-config.test.ts\n live-user-inputs.test.ts\n loop-agent-steps.test.ts\n main-prompt.integration.test.ts\n main-prompt.test.ts\n process-file-block.test.ts\n process-str-replace.test.ts\n read-docs-tool.test.ts\n request-files-prompt.test.ts\n run-agent-step-tools.test.ts\n run-programmatic-step.test.ts\n sandbox-generator.test.ts\n subagent-streaming.test.ts\n test-utils.ts\n tool-call-schema.test.ts\n usage-calculation.test.ts\n web-search-tool.test.ts\n xml-stream-parser.test.ts\n admin/\n grade-runs.ts\n relabelRuns.ts\n api/\n org.ts\n usage.ts\n context/\n app-context.ts\n find-files/\n check-new-files-necessary.ts\n custom-file-picker-config.ts\n request-files-prompt.ts\n llm-apis/\n __tests__/\n linkup-api.test.ts\n vercel-ai-sdk/\n ai-sdk.ts\n openrouter.ts\n vertex-finetuned.ts\n claude.ts\n context7-api.ts\n gemini-with-fallbacks.ts\n knowledge.md\n linkup-api.ts\n message-cost-tracker.ts\n openai-api.ts\n openrouter.ts\n relace-api.ts\n system-prompt/\n agent-instructions.md\n prompts.ts\n save-agent-request.ts\n search-system-prompt.ts\n truncate-file-tree.ts\n templates/\n agents/\n archive/\n dry-run.ts\n agent-builder.ts\n ask.ts\n base.ts\n file-explorer.ts\n file-picker.ts\n planner.ts\n researcher.ts\n reviewer.ts\n superagent.ts\n thinker.ts\n thinking-base.ts\n agent-list.ts\n agent-registry.ts\n ask-prompts.ts\n base-prompts.ts\n prompts.ts\n README.md\n strings.ts\n types.ts\n tools/\n definitions/\n tool/\n add-message.ts\n add-subgoal.ts\n browser-logs.ts\n code-search.ts\n create-plan.ts\n end-turn.ts\n find-files.ts\n read-docs.ts\n read-files.ts\n run-file-change-hooks.ts\n run-terminal-command.ts\n set-messages.ts\n set-output.ts\n spawn-agent-inline.ts\n spawn-agents-async.ts\n spawn-agents.ts\n str-replace.ts\n think-deeply.ts\n update-subgoal.ts\n web-search.ts\n write-file.ts\n list.ts\n tool-def-type.ts\n handlers/\n tool/\n add-message.ts\n add-subgoal.ts\n browser-logs.ts\n code-search.ts\n create-plan.ts\n end-turn.ts\n find-files.ts\n read-docs.ts\n read-files.ts\n run-file-change-hooks.ts\n run-terminal-command.ts\n set-messages.ts\n set-output.ts\n spawn-agent-inline.ts\n spawn-agents-async.ts\n spawn-agents.ts\n str-replace.ts\n think-deeply.ts\n update-subgoal.ts\n web-search.ts\n write-file.ts\n handler-function-type.ts\n list.ts\n constants.ts\n prompts.ts\n stream-parser.ts\n tool-executor.ts\n util/\n __tests__/\n messages.test.ts\n object.test.ts\n parse-tool-call-xml.test.ts\n simplify-tool-results.test.ts\n split-data.test.ts\n check-auth.ts\n debug.ts\n file-resolver.ts\n logger.ts\n messages.ts\n object.ts\n parse-tool-call-xml.ts\n quickjs-sandbox.ts\n simplify-tool-results.ts\n split-data.ts\n token-counter.ts\n websockets/\n auth.ts\n middleware.ts\n request-context.ts\n server.ts\n switchboard.ts\n websocket-action.ts\n async-agent-manager.ts\n check-terminal-command.ts\n fast-rewrite.ts\n generate-diffs-prompt.ts\n get-documentation-for-query.ts\n get-file-reading-updates.ts\n index.ts\n live-user-inputs.ts\n loop-main-prompt.ts\n main-prompt.ts\n process-file-block.ts\n process-str-replace.ts\n prompt-agent-stream.ts\n run-agent-step.ts\n run-programmatic-step.ts\n xml-stream-parser.ts\n .gitignore\n knowledge.md\n package.json\n README.md\n tsconfig.json\ncommon/\n src/\n __tests__/\n agent-validation.test.ts\n dynamic-agent-template-schema.test.ts\n handlesteps-parsing.test.ts\n api-keys/\n constants.ts\n crypto.ts\n constants/\n agents.ts\n analytics-events.ts\n grant-priorities.ts\n db/\n migrations/\n meta/\n _journal.json\n 0000_snapshot.json\n 0001_snapshot.json\n 0002_snapshot.json\n 0003_snapshot.json\n 0004_snapshot.json\n 0005_snapshot.json\n 0006_snapshot.json\n 0007_snapshot.json\n 0008_snapshot.json\n 0009_snapshot.json\n 0010_snapshot.json\n 0011_snapshot.json\n 0012_snapshot.json\n 0013_snapshot.json\n 0014_snapshot.json\n 0015_snapshot.json\n 0016_snapshot.json\n 0017_snapshot.json\n 0018_snapshot.json\n 0019_snapshot.json\n 0020_snapshot.json\n 0021_snapshot.json\n 0026_snapshot.json\n 0027_snapshot.json\n 0028_snapshot.json\n 0000_overjoyed_thing.sql\n 0001_fuzzy_typhoid_mary.sql\n 0002_sticky_dormammu.sql\n 0003_military_owl.sql\n 0004_neat_pet_avengers.sql\n 0005_minor_the_professor.sql\n 0006_first_quasimodo.sql\n 0007_equal_warlock.sql\n 0008_puzzling_carnage.sql\n 0009_bitter_rumiko_fujikawa.sql\n 0010_overjoyed_red_skull.sql\n 0011_familiar_ezekiel_stane.sql\n 0012_fluffy_naoko.sql\n 0013_famous_risque.sql\n 0014_wakeful_sinister_six.sql\n 0015_stormy_zuras.sql\n 0016_clear_hairball.sql\n 0017_tricky_randall_flagg.sql\n 0018_stale_human_robot.sql\n 0019_amused_nebula.sql\n 0020_young_sleeper.sql\n 0021_tiny_marauders.sql\n 0026_chilly_mockingbird.sql\n 0027_sloppy_quasar.sql\n 0028_lush_johnny_blaze.sql\n docker-compose.yml\n drizzle.config.ts\n index.ts\n schema.knowledge.md\n schema.ts\n transaction.ts\n json-config/\n __tests__/\n __snapshots__/\n stringify-schema.test.ts.snap\n constants.test.ts\n stringify-schema.test.ts\n constants.ts\n default.ts\n stringify-schema.ts\n templates/\n agent-validation.ts\n dynamic-agent-functions.ts\n testing/\n mock-modules.ts\n tools/\n params/\n tool/\n add-message.ts\n add-subgoal.ts\n browser-logs.ts\n code-search.ts\n create-plan.ts\n end-turn.ts\n find-files.ts\n read-docs.ts\n read-files.ts\n run-file-change-hooks.ts\n run-terminal-command.ts\n set-messages.ts\n set-output.ts\n spawn-agent-inline.ts\n spawn-agents-async.ts\n spawn-agents.ts\n str-replace.ts\n think-deeply.ts\n update-subgoal.ts\n web-search.ts\n write-file.ts\n compile-tool-definitions.ts\n constants.ts\n list.ts\n utils.ts\n types/\n __tests__/\n dynamic-agent-template.test.ts\n api/\n agents/\n publish.ts\n agent-template.ts\n dynamic-agent-template.ts\n grant.ts\n message.ts\n organization.ts\n print-mode.ts\n publisher.ts\n referral.ts\n session-state.ts\n usage.ts\n util/\n __tests__/\n messages.test.ts\n partial-json-delta.test.ts\n saxy.test.ts\n string.test.ts\n examples/\n diff-reviewer-1.ts\n diff-reviewer-2.ts\n diff-reviewer-3.ts\n agent-file-utils.ts\n agent-name-normalization.ts\n agent-name-resolver.ts\n agent-template-validation.ts\n array.ts\n changes.ts\n credentials.ts\n currency.ts\n dates.ts\n error.ts\n file.ts\n git.ts\n logger.ts\n lru-cache.ts\n messages.ts\n min-heap.ts\n model-utils.ts\n object.ts\n partial-json-delta.ts\n patch.ts\n promise.ts\n random.ts\n referral.ts\n saxy.ts\n string.knowledge.md\n string.ts\n stripe.ts\n sync-failure.ts\n xml.ts\n zod-schema.ts\n websockets/\n websocket-client.ts\n websocket-schema.ts\n actions.ts\n analytics.ts\n browser-actions.ts\n constants.ts\n project-file-tree.ts\n knowledge.md\n package.json\n tsconfig.json\nevals/\n git-evals/\n email-eval-results.ts\n eval-codebuff.json\n eval-manifold.json\n eval-result-codebuff-mock.json\n gen-evals.ts\n judge-git-eval.ts\n post-eval-analysis.ts\n run-eval-set.ts\n run-git-evals.ts\n run-single-eval-process.ts\n run-single-eval.ts\n setup-test-repo.ts\n types.ts\n .gitignore\n bun.lock\n constants.ts\n e2e-cat-app-script.ts\n knowledge.md\n package.json\n scaffolding.ts\n swe-bench-eval.ts\n swe-bench-ids.ts\n swe-bench.test.ts\n test-repos.json\n test-setup.ts\n tsconfig.json\nnpm-app/\n release/\n index.js\n package.json\n README.md\n release-staging/\n index.js\n package.json\n README.md\n scripts/\n build-binary.js\n generate-github-token.ts\n patch-web-tree-sitter.ts\n release.js\n twitch-plays-codebuff.sh\n src/\n __tests__/\n display.test.ts\n tool-handlers.test.ts\n agents/\n agent-utils.ts\n load-agents.ts\n checkpoints/\n checkpoint-manager.ts\n file-manager.ts\n cli-handlers/\n agent-creation-chat.ts\n agents.ts\n api-key.ts\n checkpoint.ts\n diff.ts\n easter-egg.ts\n inititalization-flow.ts\n mini-chat.ts\n publish.ts\n subagent-list.ts\n subagent.ts\n display/\n overrides.ts\n print-mode.ts\n squash-newlines.ts\n json-config/\n hooks.ts\n parser.ts\n native/\n ripgrep.ts\n terminal/\n background.ts\n run-command.ts\n utils/\n __tests__/\n __snapshots__/\n background-process-manager.test.ts.snap\n frustration-detector.test.ts.snap\n rage-detector.test.ts.snap\n xml-stream-parser.test.ts.snap\n background-process-manager.test.ts\n rage-detector.test.ts\n response-example-4-files.txt\n tool-renderers.test.ts\n xml-stream-parser.test.ts\n agent-validation.ts\n analytics.ts\n detect-shell.ts\n git.ts\n logger.ts\n rage-detector.ts\n spinner.ts\n suppress-console.ts\n system-info.ts\n terminal.ts\n tool-renderers.ts\n with-hang-detection.ts\n xml-stream-parser.ts\n workers/\n checkpoint-worker.ts\n project-context.ts\n background-process-manager.ts\n browser-runner.ts\n chat-storage.ts\n cli-definitions.ts\n cli.ts\n client.ts\n config.ts\n create-template-project.ts\n credentials.ts\n dev-process-manager.ts\n diff-manager.ts\n fingerprint.ts\n index.ts\n menu.ts\n project-files.ts\n rage-detectors.ts\n startup-process-handler.ts\n subagent-storage.ts\n tool-handlers.ts\n types.ts\n web-scraper.ts\n .gitignore\n bunfig.toml\n package.json\n tsconfig.json\npackages/\n bigquery/\n src/\n client.ts\n index.ts\n schema.ts\n knowledge.md\n package.json\n tsconfig.json\n billing/\n src/\n __tests__/\n credit-delegation.test.ts\n extract-owner-repo.test.ts\n org-billing.test.ts\n auto-topup.ts\n balance-calculator.ts\n billing.knowledge.md\n conversion.ts\n credit-delegation.ts\n grant-credits.knowledge.md\n grant-credits.ts\n index.ts\n org-billing.ts\n org-monitoring.ts\n usage-service.ts\n utils.ts\n knowledge.md\n package.json\n project.json\n tsconfig.json\n build-tools/\n executors/\n infisical-run/\n executor.ts\n schema.json\n executors.json\n package.json\n project.json\n tsconfig.json\n code-map/\n __tests__/\n test-langs/\n test.c\n test.cpp\n test.cs\n test.go\n test.java\n test.js\n test.php\n test.py\n test.rb\n test.rs\n test.ts\n languages.test.ts\n parse.test.ts\n src/\n tree-sitter-queries/\n readme.md\n tree-sitter-c_sharp-tags.scm\n tree-sitter-c-tags.scm\n tree-sitter-cpp-tags.scm\n tree-sitter-go-tags.scm\n tree-sitter-java-tags.scm\n tree-sitter-javascript-tags.scm\n tree-sitter-php-tags.scm\n tree-sitter-python-tags.scm\n tree-sitter-ruby-tags.scm\n tree-sitter-rust-tags.scm\n tree-sitter-typescript-tags.scm\n index.ts\n languages.ts\n parse.ts\n package.json\n tsconfig.json\n internal/\n src/\n loops/\n client.ts\n index.ts\n types.ts\n openrouter-ai-sdk/\n internal/\n index.ts\n schemas/\n reasoning-details.ts\n types/\n index.ts\n openrouter-chat-completions-input.ts\n openrouter-chat-settings.ts\n .gitignore\n convert-to-openrouter-chat-messages.test.ts\n convert-to-openrouter-chat-messages.ts\n convert-to-openrouter-completion-prompt.ts\n index.ts\n map-openrouter-chat-logprobs.ts\n map-openrouter-completion-logprobs.ts\n map-openrouter-finish-reason.ts\n openrouter-chat-language-model.test.ts\n openrouter-chat-language-model.ts\n openrouter-completion-language-model.test.ts\n openrouter-completion-language-model.ts\n openrouter-completion-settings.ts\n openrouter-error.ts\n openrouter-facade.ts\n openrouter-provider-options.test.ts\n openrouter-provider.ts\n openrouter-stream-usage-accounting.test.ts\n openrouter-usage-accounting.test.ts\n utils/\n __tests__/\n version-utils.test.ts\n auth.ts\n version-utils.ts\n xml-parser.ts\n env.ts\n index.ts\n knowledge.md\n package.json\n tsconfig.json\npython-app/\n src/\n codebuff/\n __init__.py\n .gitignore\n knowledge.md\n LICENSE\n pyproject.toml\n README.md\nscripts/\n changelog/\n 2025-05-18-version-10283-release-enhanced-assistant-experience-system-stability.mdx\n 2025-05-25-version-10295-enhanced-ai-models-and-user-experience-improvements.mdx\n 2025-06-01-version-10305-release-enhanced-ai-models-new-commands-and-performance-improvements.mdx\n docs.json\n ft-file-selection/\n .gitignore\n collect-tuning-data.ts\n grade-traces.ts\n print-recent-relabels.ts\n print-recent-traces.ts\n README.md\n relabel-for-offline-scoring.ts\n relabel-traces-with-context.ts\n relabel-traces.ts\n .gitignore\n analyze-edit-blocks.ts\n analyze-model-usage.ts\n apply-credit-migration.ts\n calculate-average-spend.ts\n calculate-dau.ts\n calculate-monthly-usage.ts\n calculate-mrr.ts\n calculate-weekly-usage.ts\n cleanup-worktree.sh\n convert-escaped-newlines.ts\n count-edit-file.ts\n debug-log-subset.ts\n dev.sh\n export-user-emails.ts\n generate-ci-env.js\n generate-tool-definitions.ts\n get-changelog.ts\n init-worktree.ts\n package.json\n tsconfig.json\n update-stripe-subscriptions.ts\nsdk/\n scripts/\n publish.js\n src/\n tools/\n change-file.ts\n read-files.ts\n types/\n agent-definition.ts\n tools.ts\n client.ts\n constants.ts\n index.ts\n process-stream.ts\n websocket-client.ts\n .npmignore\n CHANGELOG.md\n package.json\n PUBLISHING.md\n README.md\n tsconfig.json\nweb/\n public/\n codebuff-intro1.webm\n scripts/\n discord/\n index.ts\n register-commands.ts\n src/\n __tests__/\n e2e/\n home.spec.ts\n unit/\n home.spec.tsx\n actions/\n hello-action.ts\n app/\n [sponsee]/\n page.tsx\n admin/\n file-picker/\n page.tsx\n orgs/\n page.tsx\n traces/\n components/\n chat-message.tsx\n client-session-viewer.tsx\n empty-state.tsx\n error-boundary.tsx\n loading-skeletons.tsx\n timeline-chart.module.css\n timeline-chart.tsx\n trace-viewer.tsx\n utils/\n __tests__/\n trace-processing.test.ts\n trace-processing.ts\n page.tsx\n layout.tsx\n affiliates/\n actions.ts\n page.tsx\n agents/\n page.tsx\n api/\n admin/\n orgs/\n [orgId]/\n features/\n [feature]/\n route.ts\n export/\n route.ts\n route.ts\n relabel-for-user/\n route.ts\n traces/\n [clientRequestId]/\n messages/\n route.ts\n timeline/\n route.ts\n client/\n [clientId]/\n sessions/\n route.ts\n admin-auth.ts\n agents/\n [publisherId]/\n [agentId]/\n [version]/\n route.ts\n latest/\n route.ts\n publish/\n route.ts\n validate/\n route.ts\n route.ts\n api-keys/\n route.ts\n auth/\n [...nextauth]/\n auth-options.ts\n route.ts\n cli/\n code/\n route.ts\n logout/\n route.ts\n status/\n route.ts\n feed/\n route.ts\n git-evals/\n visibility/\n route.ts\n route.ts\n healthz/\n route.ts\n invites/\n [token]/\n route.ts\n orgs/\n [orgId]/\n alerts/\n [alertId]/\n dismiss/\n route.ts\n route.ts\n analytics/\n export/\n route.ts\n route.ts\n billing/\n setup/\n route.ts\n status/\n route.ts\n subscription/\n route.ts\n credits/\n route.ts\n invitations/\n [email]/\n resend/\n route.ts\n route.ts\n bulk/\n route.ts\n route.ts\n members/\n [userId]/\n route.ts\n route.ts\n monitoring/\n route.ts\n publishers/\n route.ts\n repos/\n [repoId]/\n route.ts\n route.ts\n settings/\n route.ts\n usage/\n export/\n route.ts\n route.ts\n route.ts\n slug/\n [slug]/\n route.ts\n route.ts\n publishers/\n [id]/\n organization/\n route.ts\n validate/\n route.ts\n route.ts\n referrals/\n [code]/\n route.ts\n helpers.ts\n route.ts\n stripe/\n buy-credits/\n route.ts\n webhook/\n route.ts\n upload/\n avatar/\n route.ts\n user/\n auto-topup/\n route.ts\n profile/\n route.ts\n usage/\n route.ts\n config/\n page.tsx\n docs/\n [category]/\n layout.tsx\n metadata.ts\n page.tsx\n layout.tsx\n page.tsx\n evals/\n evals-table.tsx\n page.tsx\n invites/\n [token]/\n page.tsx\n login/\n page.tsx\n onboard/\n page.tsx\n orgs/\n [slug]/\n analytics/\n page.tsx\n billing/\n purchase/\n page.tsx\n setup/\n page.tsx\n repositories/\n page.tsx\n settings/\n page.tsx\n team/\n page.tsx\n usage/\n page.tsx\n page.tsx\n new/\n page.tsx\n page.tsx\n payment-success/\n page.tsx\n pricing/\n page.tsx\n privacy-policy/\n page.tsx\n publishers/\n [id]/\n agents/\n [agentId]/\n [version]/\n page.tsx\n page.tsx\n new/\n page.tsx\n page.tsx\n referrals/\n [code]/\n metadata.ts\n page.tsx\n layout.tsx\n page.tsx\n terms-of-service/\n page.tsx\n usage/\n layout.tsx\n page.tsx\n usage-display.tsx\n analytics.knowledge.md\n layout.tsx\n page.tsx\n robots.ts\n sitemap.ts\n components/\n agent/\n json-viewer.tsx\n auto-topup/\n AutoTopupSettings.tsx\n AutoTopupSettingsForm.tsx\n AutoTopupSwitch.tsx\n BaseAutoTopupSettings.tsx\n BaseAutoTopupSettingsForm.tsx\n BaseAutoTopupSwitch.tsx\n constants.ts\n OrgAutoTopupSettings.tsx\n OrgAutoTopupSettingsForm.tsx\n OrgAutoTopupSwitch.tsx\n types.ts\n credits/\n CreditManagementSection.tsx\n CreditPurchaseSection.tsx\n docs/\n mdx/\n code-demo.tsx\n custom-link.tsx\n markdown-table.tsx\n mdx-components.tsx\n mermaid-diagram.tsx\n schema-display.tsx\n copy-heading.tsx\n doc-sidebar.tsx\n docs.knowledge.md\n toc.tsx\n login/\n login-card.tsx\n login-client-wrapper.tsx\n navbar/\n navbar.tsx\n user-dropdown.tsx\n organization/\n advanced-monitor.tsx\n billing-alerts.tsx\n billing-reports.tsx\n billing-status.tsx\n credit-monitor.tsx\n model-config-sheet.tsx\n organization-success-modal.tsx\n repository-management.tsx\n team-management.tsx\n providers/\n query-client-provider.tsx\n publisher/\n basic-info-step.tsx\n ownership-step.tsx\n profile-details-step.tsx\n step-template.tsx\n sign-in/\n sign-in-button.tsx\n sign-in-card-footer.tsx\n ui/\n landing/\n competition/\n claude-code.tsx\n cline.tsx\n cursor.tsx\n github-copilot.tsx\n index.tsx\n tabs.tsx\n feature/\n browser-comparison.tsx\n chart-illustration.tsx\n code-illustration.tsx\n highlight-text.tsx\n index.tsx\n workflow-illustration.tsx\n animated-element.tsx\n constants.ts\n cta-section.tsx\n demo-code-display.tsx\n testimonials-section.tsx\n types.ts\n terminal/\n index.tsx\n style.css\n terminal-input.tsx\n terminal-output.tsx\n avatar-upload.tsx\n background-beams.tsx\n badge.tsx\n banner.tsx\n button.tsx\n card.tsx\n collapsible.tsx\n credit-confetti.tsx\n decorative-blocks.tsx\n dialog.tsx\n dropdown-menu.tsx\n enhanced-copy-button.tsx\n footer.tsx\n hero-buttons.tsx\n hero.tsx\n input.tsx\n install-dialog.tsx\n label.tsx\n neon-gradient-button.tsx\n progress.tsx\n radio-group.tsx\n section.tsx\n select.tsx\n separator.tsx\n sheet.tsx\n sidebar.tsx\n skeleton-loading.tsx\n skeleton.tsx\n slider.tsx\n switch.tsx\n table.tsx\n tabs.tsx\n textarea.tsx\n toast.tsx\n toaster.tsx\n tooltip.tsx\n use-toast.ts\n BrowserPreview.tsx\n card-with-beams.tsx\n CookieConsentCard.tsx\n footer.tsx\n icons.tsx\n IDEDemo.tsx\n layout-wrapper.tsx\n TerminalDemo.tsx\n theme-provider.tsx\n theme-switcher.tsx\n content/\n advanced/\n claude-code-comparison.mdx\n config.mdx\n how-does-it-work.mdx\n large-projects.mdx\n troubleshooting.mdx\n what-models.mdx\n agents/\n agent-reference.mdx\n creating-new-agents.mdx\n customizing-agents.mdx\n overview.mdx\n troubleshooting-agent-customization.mdx\n case-studies/\n _cta.mdx\n benjamin-bryant.mdx\n oliver-lukesch.mdx\n help/\n faq.mdx\n getting-started.mdx\n tips/\n best-practices.mdx\n keyboard-shortcuts.mdx\n knowledge-files.mdx\n other-use-cases.mdx\n version-control.mdx\n where-codebuff-shines.mdx\n discord/\n client.ts\n rate-limiter.ts\n hooks/\n use-auto-topup.ts\n use-install-dialog.ts\n use-mobile.tsx\n use-model-config.ts\n use-org-auto-topup.ts\n use-organization-data.ts\n use-user-profile.ts\n lib/\n server/\n referral.ts\n validators/\n publisher.ts\n admin-auth.ts\n constant.ts\n currency.ts\n docs.ts\n fonts.ts\n organization-permissions.ts\n PostHogProvider.tsx\n publisher-permissions.ts\n remark-code-to-codedemo.ts\n server-init.ts\n SessionProvider.tsx\n stripe-utils.ts\n testimonials.ts\n trackConversions.ts\n utils.ts\n styles/\n globals.css\n types/\n docs.ts\n user.ts\n util/\n logger.ts\n .eslintignore\n .eslintrc.js\n .gitignore\n .prettierignore\n .prettierrc.js\n commitlint.config.js\n components.json\n contentlayer.config.ts\n jest.config.js\n jest.setup.js\n knowledge.md\n next.config.mjs\n package.json\n playwright.config.ts\n postcss.config.cjs\n README.md\n tailwind.config.ts\n tsconfig.json\n.envrc\n.gitignore\n.infisical.json\n.prettierrc\nauthentication.knowledge.md\nbun.lock\nbunfig.toml\ncodebuff.json\neslint.config.js\nknowledge.md\npackage.json\nREADME.md\ntsconfig.base.json\ntsconfig.json\nWINDOWS.md\n", - "tokenCount": 9007, - "truncationLevel": "none" - } - ] - } - ], - "parentAgentId": "D-gYCDTSHSY" - }, - { - "type": "tool_result", - "toolCallId": "ab5ce625-a859-4743-acee-dc28c1cd81d3", - "toolName": "code_search", - "output": [ - { - "type": "json", - "value": { - "stdout": "No results", - "message": "Exit code: 1" - } - } - ], - "parentAgentId": "D-gXwl0iLRI" - }, - { - "type": "tool_result", - "toolCallId": "1ad7baa2-ff78-4573-9ba8-96171d5fdd73", - "toolName": "run_terminal_command", - "output": [ - { - "type": "json", - "value": { - "command": "cat package.json scripts/package.json backend/package.json common/package.json | grep -E 'typecheck|lint|test|format' -A5", - "stdout": " \"start-codebuff-test\": \"bun --cwd npm-app start --cwd ../../codebuff-test\",\n \"start-litestar\": \"bun --cwd npm-app start-litestar\",\n \"start-jpcsp\": \"bun --cwd npm-app start-jpcsp\",\n \"start-vscode\": \"bun --cwd npm-app start-vscode\",\n \"start-nushell\": \"bun --cwd npm-app start-nushell\",\n \"format\": \"prettier --write \\\"**/*.{ts,tsx,json,md}\\\"\",\n \"release:npm-app\": \"bun run --cwd npm-app release\",\n \"clean-ts\": \"find . -name '*.tsbuildinfo' -type f -delete && find . -name '.next' -type d -exec rm -rf {} + 2>/dev/null || true && find . -name 'node_modules' -type d -exec rm -rf {} + 2>/dev/null || true && bun install\",\n \"typecheck\": \"bun --filter='*' run typecheck && echo '✅ All type checks passed!'\",\n \"test\": \"bun --filter='{@codebuff/backend,@codebuff/common,@codebuff/npm-app}' run test\",\n \"init-worktree\": \"bun scripts/init-worktree.ts\",\n \"cleanup-worktree\": \"bash scripts/cleanup-worktree.sh\",\n \"generate-tool-definitions\": \"bun scripts/generate-tool-definitions.ts\"\n },\n \"dependencies\": {\n--\n \"@typescript-eslint/eslint-plugin\": \"^6.17\",\n \"bun-types\": \"^1.2.2\",\n \"eslint-config-prettier\": \"^9.1.0\",\n \"eslint-plugin-import\": \"^2.29.1\",\n \"eslint-plugin-unused-imports\": \"^4.1.4\",\n \"ignore\": \"^6.0.2\",\n \"lodash\": \"4.17.21\",\n \"prettier\": \"3.3.2\",\n \"ts-node\": \"^10.9.2\",\n \"ts-pattern\": \"^5.5.0\",\n--\n \"typescript-eslint\": \"^7.17.0\"\n },\n \"engines\": {\n \"node\": \">=20.0.0\"\n },\n \"packageManager\": \"yarn@1.22.22+sha512.a6b2f7906b721bba3d67d4aff083df04dad64c399707841b7acf00f6b133b7ac24255f2652fa22ae3534329dc6180534e98d17432037ff6fd140556e2bb3137e\"\n--\n \"typecheck\": \"tsc --noEmit -p .\",\n \"test\": \"bun test\",\n \"debug-log-subset\": \"bun run debug-log-subset.ts\",\n \"typecheck-all\": \"bun run typecheck-all.ts\"\n },\n \"sideEffects\": false,\n \"engines\": {\n \"bun\": \">=1.2.11\"\n },\n--\n \"typecheck\": \"tsc --noEmit -p .\",\n \"test\": \"bun test\"\n },\n \"sideEffects\": false,\n \"engines\": {\n \"bun\": \">=1.2.11\"\n },\n--\n \"typecheck\": \"tsc --noEmit -p .\",\n \"test\": \"bun test\",\n \"db:generate\": \"drizzle-kit generate --config=./src/db/drizzle.config.ts\",\n \"db:migrate\": \"drizzle-kit push --config=./src/db/drizzle.config.ts\",\n \"db:start\": \"docker compose -f ./src/db/docker-compose.yml up --wait && bun run db:generate && (timeout 1 || sleep 1) && bun run db:migrate\",\n \"db:studio\": \"drizzle-kit studio --config=./src/db/drizzle.config.ts\"\n },\n", - "exitCode": 0 - } - } - ], - "parentAgentId": "D-gXwlFcRHk" - }, - { - "type": "tool_call", - "toolCallId": "aae79609-2956-4fc1-a52c-03ee02d9a417", - "toolName": "code_search", - "input": { - "pattern": "file-explorer spawn", - "flags": "-g *.ts" - }, - "agentId": "D-gXwl0iLRI", - "parentAgentId": "main-agent", - "includeToolCall": true - }, - { - "type": "tool_result", - "toolCallId": "aae79609-2956-4fc1-a52c-03ee02d9a417", - "toolName": "code_search", - "output": [ - { - "type": "json", - "value": { - "stdout": "No results", - "message": "Exit code: 1" - } - } - ], - "parentAgentId": "D-gXwl0iLRI" - }, - { - "type": "tool_call", - "toolCallId": "accf2fd3-8e3d-4962-b693-b9a57d7abf73", - "toolName": "set_output", - "input": { - "results": [ - { - "stdout": "No results", - "message": "Exit code: 1" - }, - { - "stdout": "No results", - "message": "Exit code: 1" - } - ] - }, - "agentId": "D-gXwl0iLRI", - "parentAgentId": "main-agent", - "includeToolCall": false - }, - { - "type": "tool_result", - "toolCallId": "accf2fd3-8e3d-4962-b693-b9a57d7abf73", - "toolName": "set_output", - "output": [ - { - "type": "json", - "value": { - "message": "Output set" - } - } - ], - "parentAgentId": "D-gXwl0iLRI" - }, - { - "type": "subagent_finish", - "agentId": "D-gXwl0iLRI", - "agentType": "code-searcher", - "displayName": "Code Searcher", - "onlyChild": false, - "parentAgentId": "main-agent", - "prompt": "", - "params": { - "searchQueries": [ - { - "pattern": "your-custom-agent|git-committer", - "flags": "-g common/src/util/examples" - }, - { - "pattern": "file-explorer spawn", - "flags": "-g *.ts" - } - ] - } - }, - { - "type": "text", - "agentId": "D-gXwlFcRHk", - "text": "### Root `package.json`\n- **format**: `\"prettier --write \\\"**/*.{ts,tsx,json,md}\\\"\"`\n- **typecheck**: `\"bun --filter='*' run typecheck && echo '✅ All type checks passed!'\"`\n- **test**: `\"bun --filter='{@codebuff/backend,@codebuff/common,@codebuff/npm-app}' run test\"`\n- No `lint` script.\n\n### `scripts/package.json`\n- **typecheck**: `\"tsc --noEmit -p .\"`\n- **test**: `\"bun test\"`\n- No `lint` or `format` scripts.\n\n### `backend/package.json`\n- **typecheck**: `\"tsc --noEmit -p .\"`\n- **test**: `\"bun test\"`\n- No `lint` or `format` scripts.\n\n### `common/package.json`\n- **typecheck**: `\"tsc --noEmit -p .\"`\n- **test**: `\"bun test\"`\n- No `lint` or `format` scripts." - }, - { - "type": "text", - "agentId": "D-gXwryrlBs", - "text": "common/src/util/examples/diff-reviewer-1.ts\ncommon/src/util/examples/diff-reviewer-2.ts\ncommon/src/util/examples/diff-reviewer-3.ts\ncommon/src/util/changes.ts\ncommon/src/util/file.ts\ncommon/src/util/git.ts\ncommon/src/util/string.ts\ncommon/src/util/logger.ts\ncommon/src/util/messages.ts\ncommon/src/util/object.ts\ncommon/src/util/error.ts\ncommon/src/util/__tests__/string.test.ts" - }, - { - "type": "subagent_finish", - "agentId": "D-gXwlFcRHk", - "agentType": "commander-lite", - "displayName": "Commander Lite", - "onlyChild": false, - "parentAgentId": "main-agent", - "prompt": "What are the package.json scripts for typecheck, lint, test, format in the root and relevant packages?", - "params": { - "command": "cat package.json scripts/package.json backend/package.json common/package.json | grep -E 'typecheck|lint|test|format' -A5" - } - }, - { - "type": "subagent_finish", - "agentId": "D-gYCDTSHSY", - "agentType": "file-lister", - "displayName": "Liszt the File Lister", - "onlyChild": true, - "parentAgentId": "D-gXwryrlBs", - "prompt": "common/src/util/examples directory contents and related files", - "params": {} - }, - { - "type": "tool_result", - "toolCallId": "7452f59a-29c2-4003-9d1e-7efd0b614f3b", - "toolName": "spawn_agents", - "output": [ - { - "type": "json", - "value": [ - { - "agentName": "Liszt the File Lister", - "agentType": "file-lister", - "value": { - "type": "lastMessage", - "value": [ - { - "role": "assistant", - "content": [ - { - "type": "text", - "text": "common/src/util/examples/diff-reviewer-1.ts\ncommon/src/util/examples/diff-reviewer-2.ts\ncommon/src/util/examples/diff-reviewer-3.ts\ncommon/src/util/changes.ts\ncommon/src/util/file.ts\ncommon/src/util/git.ts\ncommon/src/util/string.ts\ncommon/src/util/logger.ts\ncommon/src/util/messages.ts\ncommon/src/util/object.ts\ncommon/src/util/error.ts\ncommon/src/util/__tests__/string.test.ts" - } - ] - } - ] - } - } - ] - } - ], - "parentAgentId": "D-gXwryrlBs" - }, - { - "type": "tool_call", - "toolCallId": "9e737d3d-c653-4d42-ae83-1eeb21b0884c", - "toolName": "read_files", - "input": { - "paths": [ - "common/src/util/examples/diff-reviewer-1.ts", - "common/src/util/examples/diff-reviewer-2.ts", - "common/src/util/examples/diff-reviewer-3.ts", - "common/src/util/changes.ts", - "common/src/util/file.ts", - "common/src/util/git.ts", - "common/src/util/string.ts", - "common/src/util/logger.ts", - "common/src/util/messages.ts", - "common/src/util/object.ts", - "common/src/util/error.ts", - "common/src/util/__tests__/string.test.ts" - ] - }, - "agentId": "D-gXwryrlBs", - "parentAgentId": "main-agent", - "includeToolCall": true - }, - { - "type": "tool_result", - "toolCallId": "9e737d3d-c653-4d42-ae83-1eeb21b0884c", - "toolName": "read_files", - "output": [ - { - "type": "json", - "value": [ - { - "path": "common/src/util/examples/diff-reviewer-1.ts", - "content": "import type { AgentDefinition } from '../types/agent-definition'\n\nconst definition: AgentDefinition = {\n id: 'diff-reviewer-1',\n\n displayName: 'Diff Reviewer (Level 1)',\n model: 'openai/gpt-5',\n toolNames: ['read_files', 'run_terminal_command'],\n\n spawnPurposePrompt:\n 'Spawn when you need to review code changes in the git diff',\n\n instructionsPrompt: `Execute the following steps:\n1. Run git diff\n2. Read the files that have changed\n3. Review the changes and suggest improvements`,\n}\n\nexport default definition\n", - "referencedBy": {} - }, - { - "path": "common/src/util/examples/diff-reviewer-2.ts", - "content": "import type {\n AgentDefinition,\n AgentStepContext,\n} from '../types/agent-definition'\n\nconst definition: AgentDefinition = {\n id: 'diff-reviewer-2',\n displayName: 'Diff Reviewer (Level 2)',\n model: 'openai/gpt-5',\n\n inputSchema: {\n prompt: {\n type: 'string',\n description:\n 'Please provide a short description of the changes you want to review',\n },\n },\n toolNames: ['read_files', 'run_terminal_command'],\n\n spawnPurposePrompt:\n 'Spawn when you need to review code changes in the git diff',\n\n systemPrompt:\n 'You are an expert software developer. Your job is to review code changes and provide helpful feedback.',\n\n instructionsPrompt: `Execute the following steps:\n1. Run git diff\n2. Read the files that have changed\n3. Review the changes and suggest improvements\n\nUse the following guidelines while reviewing the changes:\n- Find ways to simplify the code\n- Reuse existing code as much as possible instead of writing new code\n- Preserve as much behavior as possible in the existing code\n- Prefer changing as few lines of code as possible\n- Look for opportunities to improve the code's readability\n- Look for logical errors in the code\n- Look for missed cases in the code\n- Look for any other bugs`,\n\n handleSteps: function* ({ agentState, prompt, params }: AgentStepContext) {\n // Step 1: Run git diff immediately. Saves the agent a step, lowering cost and latency!\n yield {\n toolName: 'run_terminal_command',\n args: {\n command: 'git diff',\n },\n }\n\n // Step 2: Let AI run the rest of the steps!\n yield 'STEP_ALL'\n },\n}\n\nexport default definition\n", - "referencedBy": {} - }, - { - "path": "common/src/util/examples/diff-reviewer-3.ts", - "content": "import type {\n AgentDefinition,\n AgentStepContext,\n} from '../types/agent-definition'\n\nconst definition: AgentDefinition = {\n id: 'diff-reviewer-3',\n\n displayName: 'Diff Reviewer (Level 3)',\n model: 'openai/gpt-5',\n inputSchema: {\n prompt: {\n type: 'string',\n description:\n 'Please provide a short description of the changes you want to review',\n },\n },\n outputMode: 'last_message',\n\n toolNames: ['read_files', 'run_terminal_command', 'spawn_agents'],\n spawnableAgents: ['james/file-explorer@0.1.3'],\n\n spawnPurposePrompt:\n 'Spawn when you need to review code changes in the git diff',\n\n systemPrompt:\n 'You are an expert software developer. Your job is to review code changes and provide helpful feedback.',\n\n instructionsPrompt: `Review the changes and suggest improvements.\n\nUse the following guidelines while reviewing the changes:\n- Find ways to simplify the code\n- Reuse existing code as much as possible instead of writing new code\n- Preserve as much behavior as possible in the existing code\n- Prefer changing as few lines of code as possible\n- Look for opportunities to improve the code's readability\n- Look for logical errors in the code\n- Look for missed cases in the code\n- Look for any other bugs`,\n\n handleSteps: function* ({ agentState, prompt, params }: AgentStepContext) {\n // Step 1: Get list of changed files from git diff --name-only\n const { toolResult: gitDiffFilesResult } = yield {\n toolName: 'run_terminal_command',\n args: {\n command: 'git diff --name-only',\n },\n }\n\n // Then, extract file paths from the result\n const changedFiles = (gitDiffFilesResult || '')\n .split('\\n')\n .map((line) => line.trim())\n .filter((line) => line && !line.startsWith('??') && !line.includes('OSC'))\n\n // Step 2: Read the files\n if (changedFiles.length > 0) {\n yield {\n toolName: 'read_files',\n args: {\n paths: changedFiles,\n },\n }\n }\n\n // Step 3: Run full git diff to see the actual changes\n yield {\n toolName: 'run_terminal_command',\n args: {\n command: 'git diff',\n },\n }\n\n // Step 4: Put words in the AI's mouth to get it to spawn the file explorer.\n yield {\n toolName: 'add_message',\n args: {\n role: 'assistant',\n content:\n 'Now I will spawn a file explorer to find any missing codebase context.',\n },\n }\n\n yield 'STEP'\n\n // Step 5: Put words in the AI's mouth to review the changes.\n yield {\n toolName: 'add_message',\n args: {\n role: 'assistant',\n content: 'Here is my comprehensive review of the changes.',\n },\n }\n\n // Step 6: Let AI review the changes in a final step. (The last message is also the agent's output.)\n yield 'STEP'\n },\n}\n\nexport default definition\n", - "referencedBy": {} - }, - { - "path": "common/src/util/changes.ts", - "content": "import fs from 'fs'\nimport path from 'path'\n\nimport { isFileIgnored } from '../project-file-tree'\nimport { applyPatch } from './patch'\n\nimport type { FileChanges } from '../actions'\n\nexport function applyChanges(projectRoot: string, changes: FileChanges) {\n const created: string[] = []\n const modified: string[] = []\n const ignored: string[] = []\n const invalid: string[] = []\n\n for (const change of changes) {\n const { path: filePath, content, type } = change\n try {\n if (isFileIgnored(filePath, projectRoot)) {\n ignored.push(filePath)\n continue\n }\n } catch {\n // File path caused an error.\n invalid.push(filePath)\n continue\n }\n try {\n const fullPath = path.join(projectRoot, filePath)\n const fileExists = fs.existsSync(fullPath)\n if (!fileExists) {\n // Create directories in the path if they don't exist\n const dirPath = path.dirname(fullPath)\n fs.mkdirSync(dirPath, { recursive: true })\n }\n\n if (type === 'file') {\n fs.writeFileSync(fullPath, content)\n } else {\n const oldContent = fs.readFileSync(fullPath, 'utf-8')\n const newContent = applyPatch(oldContent, content)\n fs.writeFileSync(fullPath, newContent)\n }\n if (fileExists) {\n modified.push(filePath)\n } else {\n created.push(filePath)\n }\n } catch (error) {\n console.error(`Failed to apply patch to ${filePath}:`, error, content)\n invalid.push(filePath)\n }\n }\n\n return { created, modified, ignored, invalid }\n}\n\nexport async function applyAndRevertChanges(\n projectRoot: string,\n changes: FileChanges,\n onApply: () => Promise,\n) {\n const filesChanged = changes.map((change) => change.path)\n const files = Object.fromEntries(\n filesChanged.map((filePath) => {\n const fullPath = path.join(projectRoot, filePath)\n const oldContent = fs.existsSync(fullPath)\n ? fs.readFileSync(fullPath, 'utf-8')\n : '[DOES_NOT_EXIST]'\n return [filePath, oldContent]\n }),\n )\n applyChanges(projectRoot, changes)\n try {\n await onApply()\n } catch (error) {\n console.error(`Failed to apply changes:`, error)\n }\n for (const [filePath, oldContent] of Object.entries(files)) {\n if (oldContent === '[DOES_NOT_EXIST]') {\n if (fs.existsSync(path.join(projectRoot, filePath))) {\n fs.unlinkSync(path.join(projectRoot, filePath))\n }\n } else {\n fs.writeFileSync(path.join(projectRoot, filePath), oldContent)\n }\n }\n}\n", - "referencedBy": {} - }, - { - "path": "common/src/util/file.ts", - "content": "import * as fs from 'fs'\nimport * as os from 'os'\nimport * as path from 'path'\n\nimport { z } from 'zod'\n\nimport { CodebuffConfigSchema } from '../json-config/constants'\nimport { DynamicAgentTemplateSchema } from '../types/dynamic-agent-template'\n\nexport const FileTreeNodeSchema: z.ZodType = z.object({\n name: z.string(),\n type: z.enum(['file', 'directory']),\n children: z.lazy(() => z.array(FileTreeNodeSchema).optional()),\n filePath: z.string(),\n})\n\nexport interface FileTreeNode {\n name: string\n type: 'file' | 'directory'\n filePath: string\n lastReadTime?: number\n children?: FileTreeNode[]\n}\n\nexport interface DirectoryNode extends FileTreeNode {\n type: 'directory'\n children: FileTreeNode[]\n}\n\nexport interface FileNode extends FileTreeNode {\n type: 'file'\n lastReadTime: number\n}\n\nexport const FileVersionSchema = z.object({\n path: z.string(),\n content: z.string(),\n})\n\nexport type FileVersion = z.infer\n\nexport const ProjectFileContextSchema = z.object({\n projectRoot: z.string(),\n cwd: z.string(),\n fileTree: z.array(z.custom()),\n fileTokenScores: z.record(z.string(), z.record(z.string(), z.number())),\n tokenCallers: z\n .record(z.string(), z.record(z.string(), z.array(z.string())))\n .optional(),\n knowledgeFiles: z.record(z.string(), z.string()),\n userKnowledgeFiles: z.record(z.string(), z.string()).optional(),\n agentTemplates: z.record(z.string(), z.any()).default({}),\n codebuffConfig: CodebuffConfigSchema.optional(),\n gitChanges: z.object({\n status: z.string(),\n diff: z.string(),\n diffCached: z.string(),\n lastCommitMessages: z.string(),\n }),\n changesSinceLastChat: z.record(z.string(), z.string()),\n shellConfigFiles: z.record(z.string(), z.string()),\n systemInfo: z.object({\n platform: z.string(),\n shell: z.string(),\n nodeVersion: z.string(),\n arch: z.string(),\n homedir: z.string(),\n cpus: z.number(),\n }),\n fileVersions: z.array(z.array(FileVersionSchema)).optional(), // Keep temporarily for migration\n})\n\nexport type ProjectFileContext = z.infer\n\nexport const fileRegex =\n /\\s*([^<]+)<\\/path>\\s*([\\s\\S]*?)<\\/content>\\s*<\\/write_file>/g\nexport const fileWithNoPathRegex = /([\\s\\S]*?)<\\/write_file>/g\n\nexport const parseFileBlocks = (fileBlocks: string) => {\n let fileMatch\n const files: Record = {}\n while ((fileMatch = fileRegex.exec(fileBlocks)) !== null) {\n const [, filePath, fileContent] = fileMatch\n files[filePath] = fileContent.startsWith('\\n')\n ? fileContent.slice(1)\n : fileContent\n }\n return files\n}\n\nexport const getStubProjectFileContext = (): ProjectFileContext => ({\n projectRoot: '',\n cwd: '',\n fileTree: [],\n fileTokenScores: {},\n knowledgeFiles: {},\n userKnowledgeFiles: {},\n agentTemplates: {},\n codebuffConfig: undefined,\n gitChanges: {\n status: '',\n diff: '',\n diffCached: '',\n lastCommitMessages: '',\n },\n changesSinceLastChat: {},\n shellConfigFiles: {},\n systemInfo: {\n platform: '',\n shell: '',\n nodeVersion: '',\n arch: '',\n homedir: '',\n cpus: 0,\n },\n})\n\nexport const createMarkdownFileBlock = (filePath: string, content: string) => {\n return `\\`\\`\\`${filePath}\\n${content}\\n\\`\\`\\``\n}\n\nexport const parseMarkdownCodeBlock = (content: string) => {\n const match = content.match(/^```(?:[a-zA-Z]+)?\\n([\\s\\S]*)\\n```$/)\n if (match) {\n return match[1] + '\\n'\n }\n return content\n}\n\nexport const createSearchReplaceBlock = (search: string, replace: string) => {\n return `<<<<<<< SEARCH\\n${search}\\n=======\\n${replace}\\n>>>>>>> REPLACE`\n}\n\nexport function printFileTree(\n nodes: FileTreeNode[],\n depth: number = 0,\n): string {\n let result = ''\n const indentation = ' '.repeat(depth)\n for (const node of nodes) {\n result += `${indentation}${node.name}${node.type === 'directory' ? '/' : ''}\\n`\n if (node.type === 'directory' && node.children) {\n result += printFileTree(node.children, depth + 1)\n }\n }\n return result\n}\n\nexport function printFileTreeWithTokens(\n nodes: FileTreeNode[],\n fileTokenScores: Record>,\n path: string[] = [],\n): string {\n let result = ''\n const depth = path.length\n const indentToken = ' '\n const indentation = indentToken.repeat(depth)\n const indentationWithFile = indentToken.repeat(depth + 1)\n for (const node of nodes) {\n if (\n node.type === 'directory' &&\n (!node.children || node.children.length === 0)\n ) {\n // Skip empty directories\n continue\n }\n result += `${indentation}${node.name}${node.type === 'directory' ? '/' : ''}`\n path.push(node.name)\n const filePath = path.join('/')\n const tokenScores = fileTokenScores[filePath]\n if (node.type === 'file' && tokenScores) {\n const tokens = Object.keys(tokenScores)\n if (tokens.length > 0) {\n result += `\\n${indentationWithFile}${tokens.join(' ')}`\n }\n }\n result += '\\n'\n if (node.type === 'directory' && node.children) {\n result += printFileTreeWithTokens(node.children, fileTokenScores, path)\n }\n path.pop()\n }\n return result\n}\n\n/**\n * Ensures the given file contents ends with a newline character.\n * @param contents - The file contents\n * @returns the file contents with a newline character.\n */\nexport const ensureEndsWithNewline = (\n contents: string | null,\n): string | null => {\n if (contents === null || contents === '') {\n // Leave empty file as is\n return contents\n }\n if (contents.endsWith('\\n')) {\n return contents\n }\n return contents + '\\n'\n}\n\nexport const ensureDirectoryExists = (baseDir: string) => {\n if (!fs.existsSync(baseDir)) {\n fs.mkdirSync(baseDir, { recursive: true })\n }\n}\n\n/**\n * Removes markdown code block syntax if present, including any language tag\n */\nexport const cleanMarkdownCodeBlock = (content: string): string => {\n const cleanResponse = content.match(/^```(?:[a-zA-Z]+)?\\n([\\s\\S]*)\\n```$/)\n ? content.replace(/^```(?:[a-zA-Z]+)?\\n/, '').replace(/\\n```$/, '')\n : content\n return cleanResponse\n}\n\nexport function isValidFilePath(path: string) {\n if (!path) return false\n\n // Check for whitespace\n if (/\\s/.test(path)) return false\n\n // Check for invalid characters\n const invalidChars = /[<>:\"|?*\\x00-\\x1F]/g\n if (invalidChars.test(path)) return false\n\n return true\n}\n\nexport function isDir(p: string): boolean {\n try {\n return fs.statSync(p).isDirectory()\n } catch {\n return false\n }\n}\n\n/**\n * Returns true if the `toPath` is a subdirectory of `fromPath`.\n */\nexport function isSubdir(fromPath: string, toPath: string) {\n const resolvedFrom = path.resolve(fromPath)\n const resolvedTo = path.resolve(toPath)\n\n if (process.platform === 'win32') {\n const fromDrive = path.parse(resolvedFrom).root.toLowerCase()\n const toDrive = path.parse(resolvedTo).root.toLowerCase()\n if (fromDrive !== toDrive) {\n return false\n }\n }\n\n return !path.relative(resolvedFrom, resolvedTo).startsWith('..')\n}\n\nexport function isValidProjectRoot(dir: string): boolean {\n return !isSubdir(dir, os.homedir())\n}\n", - "referencedBy": {} - }, - { - "path": "common/src/util/git.ts", - "content": "import { execSync } from 'child_process'\nimport * as fs from 'fs'\nimport * as path from 'path'\n\nimport type { FileChanges } from '../actions'\n\nconst maxBuffer = 50 * 1024 * 1024 // 50 MB\n\nexport function hasStagedChanges(): boolean {\n try {\n execSync('git diff --staged --quiet', { stdio: 'ignore', maxBuffer })\n return false\n } catch {\n return true\n }\n}\n\nexport function getStagedChanges(): string {\n try {\n return execSync('git diff --staged', { maxBuffer }).toString()\n } catch (error) {\n return ''\n }\n}\n\nexport function commitChanges(commitMessage: string) {\n try {\n execSync(`git commit -m \"${commitMessage}\"`, { stdio: 'ignore', maxBuffer })\n } catch (error) {}\n}\n\nexport function stageAllChanges(): boolean {\n try {\n execSync('git add -A', { stdio: 'pipe', maxBuffer })\n return hasStagedChanges()\n } catch (error) {\n return false\n }\n}\n\nexport function stagePatches(dir: string, changes: FileChanges): boolean {\n try {\n const fileNames = changes.map((change) => change.path)\n const existingFileNames = fileNames.filter((filePath) =>\n fs.existsSync(path.join(dir, filePath)),\n )\n\n if (existingFileNames.length === 0) {\n return false\n }\n\n execSync(`git add ${existingFileNames.join(' ')}`, { cwd: dir, maxBuffer })\n return hasStagedChanges()\n } catch (error) {\n console.error('Error in stagePatches:', error)\n return false\n }\n}\n", - "referencedBy": {} - }, - { - "path": "common/src/util/string.ts", - "content": "import { sumBy } from 'lodash'\n\nexport const truncateString = (str: string, maxLength: number) => {\n if (str.length <= maxLength) {\n return str\n }\n return str.slice(0, maxLength) + '...'\n}\n\nexport const truncateStringWithMessage = ({\n str,\n maxLength,\n message = 'TRUNCATED DUE TO LENGTH',\n remove = 'END',\n}: {\n str: string\n maxLength: number\n message?: string\n remove?: 'END' | 'START' | 'MIDDLE'\n}) => {\n if (str.length <= maxLength) {\n return str\n }\n\n if (remove === 'END') {\n const suffix = `\\n[${message}...]`\n return str.slice(0, maxLength - suffix.length) + suffix\n }\n if (remove === 'START') {\n const prefix = `[...${message}]\\n`\n return prefix + str.slice(str.length - maxLength + prefix.length)\n }\n\n const middle = `\\n[...${message}...]\\n`\n const length = Math.floor((maxLength - middle.length) / 2)\n return str.slice(0, length) + middle + str.slice(-length)\n}\n\n/**\n * Check if a character is a whitespace character according\n * to the XML spec (space, carriage return, line feed or tab)\n *\n * @param character Character to check\n * @return Whether the character is whitespace or not\n */\nexport const isWhitespace = (character: string) => /\\s/.test(character)\n\nexport const replaceNonStandardPlaceholderComments = (\n content: string,\n replacement: string,\n): string => {\n const commentPatterns = [\n // JSX comments (match this first)\n {\n regex:\n /{\\s*\\/\\*\\s*\\.{3}.*(?:rest|unchanged|keep|file|existing|some).*(?:\\s*\\.{3})?\\s*\\*\\/\\s*}/gi,\n placeholder: replacement,\n },\n // C-style comments (C, C++, Java, JavaScript, TypeScript, etc.)\n {\n regex:\n /\\/\\/\\s*\\.{3}.*(?:rest|unchanged|keep|file|existing|some).*(?:\\s*\\.{3})?/gi,\n placeholder: replacement,\n },\n {\n regex:\n /\\/\\*\\s*\\.{3}.*(?:rest|unchanged|keep|file|existing|some).*(?:\\s*\\.{3})?\\s*\\*\\//gi,\n placeholder: replacement,\n },\n // Python, Ruby, R comments\n {\n regex:\n /#\\s*\\.{3}.*(?:rest|unchanged|keep|file|existing|some).*(?:\\s*\\.{3})?/gi,\n placeholder: replacement,\n },\n // HTML-style comments\n {\n regex:\n //gi,\n placeholder: replacement,\n },\n // SQL, Haskell, Lua comments\n {\n regex:\n /--\\s*\\.{3}.*(?:rest|unchanged|keep|file|existing|some).*(?:\\s*\\.{3})?/gi,\n placeholder: replacement,\n },\n // MATLAB comments\n {\n regex:\n /%\\s*\\.{3}.*(?:rest|unchanged|keep|file|existing|some).*(?:\\s*\\.{3})?/gi,\n placeholder: replacement,\n },\n ]\n\n let updatedContent = content\n\n for (const { regex, placeholder } of commentPatterns) {\n updatedContent = updatedContent.replaceAll(regex, placeholder)\n }\n\n return updatedContent\n}\n\nexport const randBoolFromStr = (str: string) => {\n return sumBy(str.split(''), (char) => char.charCodeAt(0)) % 2 === 0\n}\n\nexport const pluralize = (count: number, word: string) => {\n if (count === 1) return `${count} ${word}`\n\n // Handle words ending in f/fe first (before other rules)\n if (word.endsWith('f')) {\n return `${count} ${word.slice(0, -1) + 'ves'}`\n }\n if (word.endsWith('fe')) {\n return `${count} ${word.slice(0, -2) + 'ves'}`\n }\n\n // Handle words ending in 'y' (unless preceded by a vowel)\n if (word.endsWith('y') && !word.match(/[aeiou]y$/)) {\n return `${count} ${word.slice(0, -1) + 'ies'}`\n }\n\n // Handle words ending in s, sh, ch, x, z, o\n if (word.match(/[sxz]$/) || word.match(/[cs]h$/) || word.match(/o$/)) {\n return `${count} ${word + 'es'}`\n }\n\n return `${count} ${word + 's'}`\n}\n\n/**\n * Safely replaces all occurrences of a search string with a replacement string,\n * escaping special replacement patterns (like $) in the replacement string.\n */\nexport const capitalize = (str: string): string => {\n if (!str) return str\n return str.charAt(0).toUpperCase() + str.slice(1).toLowerCase()\n}\n\n/**\n * Converts a snake_case string to Title Case\n * Example: \"add_subgoal\" -> \"Add Subgoal\"\n */\nexport const snakeToTitleCase = (str: string): string => {\n return str\n .split('_')\n .map((word) => capitalize(word))\n .join(' ')\n}\n\n/**\n * Ensures a URL has the appropriate protocol (http:// or https://)\n * Uses http:// for localhost and local IPs, https:// for all other domains\n */\nexport const ensureUrlProtocol = (url: string): string => {\n if (\n url.startsWith('http://') ||\n url.startsWith('https://') ||\n url.startsWith('file://')\n ) {\n return url\n }\n\n if (url.startsWith('localhost') || url.match(/^127\\.\\d+\\.\\d+\\.\\d+/)) {\n return `http://${url}`\n }\n\n if (url.startsWith('/')) {\n return `file://${url}`\n }\n\n return `https://${url}`\n}\n\nexport const safeReplace = (\n content: string,\n searchStr: string,\n replaceStr: string,\n): string => {\n const escapedReplaceStr = replaceStr.replace(/\\$/g, '$$$$')\n return content.replace(searchStr, escapedReplaceStr)\n}\n\nexport const hasLazyEdit = (content: string) => {\n const cleanedContent = content.toLowerCase().trim()\n return (\n cleanedContent.includes('... existing code ...') ||\n cleanedContent.includes('// rest of the') ||\n cleanedContent.includes('# rest of the') ||\n // Match various comment styles with ellipsis and specific words\n /\\/\\/\\s*\\.{3}.*(?:rest|unchanged|keep|file|existing|some).*(?:\\.{3})?/.test(\n cleanedContent,\n ) || // C-style single line\n /\\/\\*\\s*\\.{3}.*(?:rest|unchanged|keep|file|existing|some).*(?:\\.{3})?\\s*\\*\\//.test(\n cleanedContent,\n ) || // C-style multi-line\n /#\\s*\\.{3}.*(?:rest|unchanged|keep|file|existing|some).*(?:\\.{3})?/.test(\n cleanedContent,\n ) || // Python/Ruby style\n //.test(\n cleanedContent,\n ) || // HTML style\n /--\\s*\\.{3}.*(?:rest|unchanged|keep|file|existing|some).*(?:\\.{3})?/.test(\n cleanedContent,\n ) || // SQL/Haskell style\n /%\\s*\\.{3}.*(?:rest|unchanged|keep|file|existing|some).*(?:\\.{3})?/.test(\n cleanedContent,\n ) || // MATLAB style\n /{\\s*\\/\\*\\s*\\.{3}.*(?:rest|unchanged|keep|file|existing|some).*(?:\\.{3})?\\s*\\*\\/\\s*}/.test(\n cleanedContent,\n ) // JSX style\n )\n}\n\n/**\n * Extracts a JSON field from a string, transforms it, and puts it back.\n * Handles both array and object JSON values.\n * @param content The string containing JSON-like content\n * @param field The field name to find and transform\n * @param transform Function to transform the parsed JSON value\n * @param fallback String to use if parsing fails\n * @returns The content string with the transformed JSON field\n */\nexport function transformJsonInString(\n content: string,\n field: string,\n transform: (json: T) => unknown,\n fallback: string,\n): string {\n // Use a non-greedy match for objects/arrays to prevent over-matching\n const pattern = new RegExp(`\"${field}\"\\\\s*:\\\\s*(\\\\{[^}]*?\\\\}|\\\\[[^\\\\]]*?\\\\])`)\n const match = content.match(pattern)\n\n if (!match) {\n return content\n }\n\n try {\n const json = JSON.parse(match[1])\n const transformed = transform(json)\n\n // Important: Only replace the exact matched portion to prevent duplicates\n return content.replace(\n match[0],\n `\"${field}\":${JSON.stringify(transformed)}`,\n )\n } catch (error) {\n // Only replace the exact matched portion even in error case\n return content.replace(match[0], `\"${field}\":${fallback}`)\n }\n}\n\n/**\n * Generates a compact unique identifier by combining timestamp bits with random bits.\n * Uses 40 bits of timestamp (enough for ~34 years) and 24 random bits for exactly 64 total bits.\n * Encodes in base64url for compact, URL-safe strings (~11 chars).\n * @param prefix Optional prefix to add to the ID\n * @returns A unique string ID\n * @example\n * generateCompactId() // => \"1a2b3c4d5e6\"\n * generateCompactId('msg-') // => \"msg-1a2b3c4d5e6\"\n */\nexport const generateCompactId = (prefix?: string): string => {\n // Get the last 32 bits of the timestamp\n const timestamp = (Date.now() & 0xffffffff) >>> 0\n // Generate a 32-bit random number\n const random = Math.floor(Math.random() * 0x100000000) >>> 0\n\n // Combine them into a 64-bit representation as two 32-bit numbers\n const high = timestamp\n const low = random\n\n // Convert to a hex string, pad if necessary, and combine\n const highHex = high.toString(16).padStart(8, '0')\n const lowHex = low.toString(16).padStart(8, '0')\n\n const combinedHex = highHex + lowHex\n\n // Convert hex to a Buffer and then to base64url\n const bytes = Buffer.from(combinedHex, 'hex')\n const str = bytes.toString('base64url').replace(/=/g, '')\n\n return prefix ? `${prefix}${str}` : str\n}\n\n/**\n * Removes null characters from a string\n */\nexport const stripNullChars = (str: string): string => {\n return str.replace(/\\u0000/g, '')\n}\n\nconst ansiColorsRegex = /\\x1B\\[[0-9;]*m/g\nexport function stripColors(str: string): string {\n return str.replace(ansiColorsRegex, '')\n}\n\nconst ansiRegex = /\\x1B(?:[@-Z\\\\-_]|\\[[0-?]*[ -/]*[@-~]|\\][^\\x1B]*\\x1B\\\\?)/g\nexport function stripAnsi(str: string): string {\n return str.replace(ansiRegex, '')\n}\n\nexport function includesMatch(\n array: (string | RegExp)[],\n value: string,\n): boolean {\n return array.some((p) => {\n if (typeof p === 'string') {\n return p === value\n }\n return p.test(value)\n })\n}\n\n/**\n * Finds the longest substring that is **both** a suffix of `source`\n * **and** a prefix of `next`.\n * Useful when concatenating strings while avoiding duplicate overlap.\n *\n * @example\n * ```ts\n * suffixPrefixOverlap('foobar', 'barbaz'); // ➜ 'bar'\n * suffixPrefixOverlap('abc', 'def'); // ➜ ''\n * ```\n *\n * @param source The string whose **suffix** is inspected.\n * @param next The string whose **prefix** is inspected.\n * @returns The longest overlapping edge, or an empty string if none exists.\n */\nexport function suffixPrefixOverlap(source: string, next: string): string {\n for (let len = next.length; len >= 0; len--) {\n const prefix = next.slice(0, len)\n if (source.endsWith(prefix)) {\n return prefix\n }\n }\n\n return ''\n}\n\nexport const escapeString = (str: string) => {\n return JSON.stringify(str).slice(1, -1)\n}\n", - "referencedBy": {} - }, - { - "path": "common/src/util/logger.ts", - "content": "import path from 'path'\n\nimport { env } from '@codebuff/internal'\nimport pino from 'pino'\n\nimport type { AsyncLocalStorage as NodeAsyncLocalStorage } from 'async_hooks'\n\nlet AsyncLocalStorageImpl: typeof import('async_hooks').AsyncLocalStorage | null\ntry {\n // Load AsyncLocalStorage via require\n AsyncLocalStorageImpl = require('async_hooks').AsyncLocalStorage\n} catch {\n AsyncLocalStorageImpl = null\n}\n\n// Create a no‑op shim when AsyncLocalStorage isn't present\nconst loggerAsyncStorage =\n AsyncLocalStorageImpl !== null\n ? new AsyncLocalStorageImpl()\n : {\n // run() just executes fn without context tracking\n run: (_: any, fn: (...args: A) => R, ...args: A) =>\n fn(...args),\n getStore: () => undefined,\n }\n\nexport interface LoggerContext {\n userId?: string\n userEmail?: string\n clientSessionId?: string\n [key: string]: any // Allow for future extensions\n}\n\nexport const withLoggerContext = (\n additionalContext: Partial,\n fn: () => Promise,\n) => {\n const store = (loggerAsyncStorage.getStore?.() ?? {}) as LoggerContext\n // Cast to Node's AsyncLocalStorage to resolve overload mismatch\n return (loggerAsyncStorage as NodeAsyncLocalStorage).run(\n { ...store, ...additionalContext },\n fn,\n )\n}\n\n// Only use file transport when not running in Edge/browser‑like env\nconst runningInEdge = process.env.NEXT_RUNTIME === 'edge'\nconst fileTransport =\n !runningInEdge && env.NEXT_PUBLIC_CB_ENVIRONMENT !== 'prod'\n ? pino.transport({\n target: 'pino/file',\n options: { destination: path.join(__dirname, '..', 'debug.log') },\n level: 'debug',\n })\n : undefined\n\nexport const logger = pino(\n {\n level: 'debug',\n mixin() {\n // If AsyncLocalStorage isn't available, return undefined\n return { logTrace: loggerAsyncStorage.getStore?.() }\n },\n formatters: {\n level: (label) => ({ level: label.toUpperCase() }),\n },\n timestamp: () => `,\"timestamp\":\"${new Date().toISOString()}\"`,\n },\n fileTransport,\n)\n", - "referencedBy": {} - }, - { - "path": "common/src/util/messages.ts", - "content": "import type { CodebuffMessage, Message } from '../types/message'\nimport type { CoreMessage } from 'ai'\n\ninterface ScreenshotRef {\n msgIdx: number\n contentIdx: number\n}\n\n/**\n * Limits the total number of screenshots across all messages to maxCount,\n * keeping only the most recent ones.\n */\nexport function limitScreenshots(\n messages: Message[],\n maxCount: number,\n): Message[] {\n const screenshots = messages.flatMap((msg, msgIdx) =>\n Array.isArray(msg.content)\n ? msg.content\n .map((item, contentIdx) =>\n item.type === 'image' ? { msgIdx, contentIdx } : null,\n )\n .filter((ref): ref is ScreenshotRef => ref !== null)\n : [],\n )\n\n if (screenshots.length <= maxCount) return messages\n\n const keepRefs = new Set(\n screenshots\n .slice(-maxCount)\n .map((ref) => `${ref.msgIdx}-${ref.contentIdx}`),\n )\n\n return messages.map((msg, msgIdx) =>\n Array.isArray(msg.content)\n ? {\n ...msg,\n content: msg.content.filter(\n (item, contentIdx) =>\n item.type !== 'image' || keepRefs.has(`${msgIdx}-${contentIdx}`),\n ),\n }\n : msg,\n )\n}\n\nexport function toContentString(msg: CoreMessage): string {\n const { content } = msg\n if (typeof content === 'string') return content\n return content.map((item) => (item as any)?.text ?? '').join('\\n')\n}\n\nexport function withCacheControlCore(msg: CodebuffMessage): CodebuffMessage {\n const message = { ...msg }\n if (!message.providerOptions) {\n message.providerOptions = {}\n }\n if (!message.providerOptions.anthropic) {\n message.providerOptions.anthropic = {}\n }\n message.providerOptions.anthropic.cacheControl = { type: 'ephemeral' }\n if (!message.providerOptions.openrouter) {\n message.providerOptions.openrouter = {}\n }\n message.providerOptions.openrouter.cacheControl = { type: 'ephemeral' }\n return message\n}\n\nexport function withCacheControl(msg: Message): Message {\n if (typeof msg.content === 'string') {\n return {\n ...msg,\n content: [\n {\n type: 'text',\n text: msg.content,\n cache_control: { type: 'ephemeral' as const },\n },\n ],\n }\n } else {\n return {\n ...msg,\n content: msg.content.map((item, i) =>\n i === msg.content.length - 1\n ? { ...item, cache_control: { type: 'ephemeral' as const } }\n : item,\n ),\n }\n }\n}\n\nexport function removeCache(messages: Message[]): Message[] {\n return messages.map((msg) => {\n if (typeof msg.content === 'object' && Array.isArray(msg.content)) {\n return {\n ...msg,\n content: msg.content.map((item) => {\n const { cache_control, ...rest } = item\n return rest\n }),\n }\n }\n return msg\n })\n}\n", - "referencedBy": {} - }, - { - "path": "common/src/util/object.ts", - "content": "import { isEqual, mapValues, union } from 'lodash'\n\nexport const removeUndefinedProps = (obj: T): T => {\n const newObj: any = {}\n\n for (const key of Object.keys(obj)) {\n if ((obj as any)[key] !== undefined) newObj[key] = (obj as any)[key]\n }\n\n return newObj\n}\n\nexport const removeNullOrUndefinedProps = (\n obj: T,\n exceptions?: string[],\n): T => {\n const newObj: any = {}\n\n for (const key of Object.keys(obj)) {\n if (\n ((obj as any)[key] !== undefined && (obj as any)[key] !== null) ||\n (exceptions ?? []).includes(key)\n )\n newObj[key] = (obj as any)[key]\n }\n return newObj\n}\n\nexport const addObjects = (\n obj1: T,\n obj2: T,\n) => {\n const keys = union(Object.keys(obj1), Object.keys(obj2))\n const newObj = {} as any\n\n for (const key of keys) {\n newObj[key] = (obj1[key] ?? 0) + (obj2[key] ?? 0)\n }\n\n return newObj as T\n}\n\nexport const subtractObjects = (\n obj1: T,\n obj2: T,\n) => {\n const keys = union(Object.keys(obj1), Object.keys(obj2))\n const newObj = {} as any\n\n for (const key of keys) {\n newObj[key] = (obj1[key] ?? 0) - (obj2[key] ?? 0)\n }\n\n return newObj as T\n}\n\nexport const hasChanges = (obj: T, partial: Partial) => {\n const currValues = mapValues(partial, (_, key: keyof T) => obj[key])\n return !isEqual(currValues, partial)\n}\n\nexport const hasSignificantDeepChanges = (\n obj: T,\n partial: Partial,\n epsilonForNumbers: number,\n): boolean => {\n const compareValues = (currValue: any, partialValue: any): boolean => {\n if (typeof currValue === 'number' && typeof partialValue === 'number') {\n return Math.abs(currValue - partialValue) > epsilonForNumbers\n }\n if (typeof currValue === 'object' && typeof partialValue === 'object') {\n return hasSignificantDeepChanges(\n currValue,\n partialValue,\n epsilonForNumbers,\n )\n }\n return !isEqual(currValue, partialValue)\n }\n\n for (const key in partial) {\n if (Object.prototype.hasOwnProperty.call(partial, key)) {\n if (compareValues(obj[key], partial[key])) {\n return true\n }\n }\n }\n\n return false\n}\n\nexport const filterObject = (\n obj: T,\n predicate: (value: any, key: keyof T) => boolean,\n): { [P in keyof T]: T[P] } => {\n const result = {} as { [P in keyof T]: T[P] }\n for (const key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n if (predicate(obj[key], key)) {\n result[key] = obj[key]\n }\n }\n }\n return result\n}\n\n/**\n * Asserts that a condition is true. If the condition is false, it throws an error with the provided message.\n * @param condition The condition to check\n * @param message The error message to display if the condition is false\n * @throws {Error} If the condition is false\n */\nexport function assert(condition: boolean, message: string): asserts condition {\n if (!condition) {\n throw new Error(`Assertion failed: ${message}`)\n }\n}\n\nexport function errorToObject(value: any) {\n if (value instanceof Error) {\n // Copy *all* own props, including non-enumerables\n return Object.getOwnPropertyNames(value).reduce>(\n (acc, key) => {\n acc[key] = (value as any)[key]\n return acc\n },\n {},\n )\n }\n return value\n}\n", - "referencedBy": {} - }, - { - "path": "common/src/util/error.ts", - "content": "export function getErrorObject(error: any) {\n return {\n message: error.message,\n stack: error.stack,\n name: error.name,\n }\n}", - "referencedBy": {} - }, - { - "path": "common/src/util/__tests__/string.test.ts", - "content": "import { describe, expect, it } from 'bun:test'\n\nimport { EXISTING_CODE_MARKER } from '../../constants'\nimport { pluralize, replaceNonStandardPlaceholderComments } from '../string'\n\ndescribe('pluralize', () => {\n it('should handle singular and plural cases correctly', () => {\n expect(pluralize(1, 'test')).toBe('1 test')\n expect(pluralize(0, 'test')).toBe('0 tests')\n expect(pluralize(2, 'test')).toBe('2 tests')\n })\n\n it('should handle words ending in y', () => {\n expect(pluralize(1, 'city')).toBe('1 city')\n expect(pluralize(2, 'city')).toBe('2 cities')\n expect(pluralize(3, 'repository')).toBe('3 repositories')\n })\n\n it('should handle words ending in f/fe', () => {\n expect(pluralize(1, 'leaf')).toBe('1 leaf')\n expect(pluralize(2, 'leaf')).toBe('2 leaves')\n expect(pluralize(1, 'knife')).toBe('1 knife')\n expect(pluralize(2, 'knife')).toBe('2 knives')\n expect(pluralize(1, 'life')).toBe('1 life')\n expect(pluralize(3, 'life')).toBe('3 lives')\n })\n\n it('should handle words ending in s, sh, ch, x, z, o', () => {\n expect(pluralize(2, 'bus')).toBe('2 buses')\n expect(pluralize(2, 'box')).toBe('2 boxes')\n expect(pluralize(2, 'church')).toBe('2 churches')\n expect(pluralize(2, 'dish')).toBe('2 dishes')\n })\n\n it('should handle regular plurals', () => {\n expect(pluralize(1, 'agent')).toBe('1 agent')\n expect(pluralize(0, 'agent')).toBe('0 agents')\n expect(pluralize(5, 'member')).toBe('5 members')\n expect(pluralize(10, 'invitation')).toBe('10 invitations')\n })\n})\n\ndescribe('replaceNonStandardPlaceholderComments', () => {\n it('should replace C-style comments', () => {\n const input = `\nfunction example() {\n // ... some code ...\n console.log('Hello');\n // ... rest of the function ...\n}\n`\n const expected = `\nfunction example() {\n ${EXISTING_CODE_MARKER}\n console.log('Hello');\n ${EXISTING_CODE_MARKER}\n}\n`\n expect(\n replaceNonStandardPlaceholderComments(input, EXISTING_CODE_MARKER),\n ).toBe(expected)\n })\n\n it('should replace multi-line C-style comments', () => {\n const input = `\nfunction example() {\n /* ... some code ... */\n console.log('Hello');\n /* ... rest of the function ... */\n}\n`\n const expected = `\nfunction example() {\n ${EXISTING_CODE_MARKER}\n console.log('Hello');\n ${EXISTING_CODE_MARKER}\n}\n`\n expect(\n replaceNonStandardPlaceholderComments(input, EXISTING_CODE_MARKER),\n ).toBe(expected)\n })\n\n it('should replace Python-style comments', () => {\n const input = `\ndef example():\n # ... some code ...\n print('Hello')\n # ... rest of the function ...\n`\n const expected = `\ndef example():\n ${EXISTING_CODE_MARKER}\n print('Hello')\n ${EXISTING_CODE_MARKER}\n`\n expect(\n replaceNonStandardPlaceholderComments(input, EXISTING_CODE_MARKER),\n ).toBe(expected)\n })\n\n it('should replace JSX comments', () => {\n const input = `\nfunction Example() {\n return (\n

\n {/* ... existing code ... */}\n

Hello, World!

\n {/* ...rest of component... */}\n
\n );\n}\n`\n const expected = `\nfunction Example() {\n return (\n
\n ${EXISTING_CODE_MARKER}\n

Hello, World!

\n ${EXISTING_CODE_MARKER}\n
\n );\n}\n`\n expect(\n replaceNonStandardPlaceholderComments(input, EXISTING_CODE_MARKER),\n ).toBe(expected)\n })\n})\n", - "referencedBy": {} - } - ] - } - ], - "parentAgentId": "D-gXwryrlBs" - }, - { - "type": "text", - "agentId": "D-gXwryrlBs", - "text": "Here's a brief summary of potentially useful files:\n\n* `common/src/util/examples/diff-reviewer-*.ts`: Example agent definitions for reviewing code diffs. Useful for understanding how to define agents that interact with `git diff` and the file system.\n* `common/src/util/changes.ts`: Functions for applying file changes (creations, modifications) to the file system, including applying patches.\n* `common/src/util/file.ts`: Functions for interacting with the file system, such as creating file trees, parsing file blocks, and validating file paths.\n* `common/src/util/git.ts`: Functions for executing Git commands, such as staging changes and committing.\n* `common/src/util/string.ts`: String manipulation functions.\n* `common/src/util/logger.ts`: Logging utilities with context.\n* `common/src/util/messages.ts`: Utilities for working with messages.\n* `common/src/util/object.ts`: Utilities for manipulating objects, e.g. removing undefined properties, comparing objects, adding objects, asserting conditions.\n\nThe files in `common/src/util/examples` provide concrete examples, while the other files offer utility functions that could be useful when working with files and Git.\n" - }, - { - "type": "subagent_finish", - "agentId": "D-gXwryrlBs", - "agentType": "file-picker", - "displayName": "Fletcher the File Fetcher", - "onlyChild": false, - "parentAgentId": "main-agent", - "prompt": "common/src/util/examples directory contents and related files" - }, - { - "type": "tool_call", - "toolCallId": "D-nFpuBEiW4", - "toolName": "str_replace", - "input": { - "path": "backend/src/templates/agents/agent-builder.ts", - "replacements": [ - { - "old": " spawnableAgents: allAvailableAgents\n ? (allAvailableAgents as any[])\n : [\n AgentTemplateTypes.file_picker,\n AgentTemplateTypes.researcher,\n AgentTemplateTypes.thinker,\n AgentTemplateTypes.reviewer,\n AgentTemplateTypes.agent_builder,\n ],\n", - "new": "", - "allowMultiple": false - } - ] - }, - "agentId": "D-gXwZERcWA", - "parentAgentId": "main-agent", - "includeToolCall": true - }, - { - "type": "tool_result", - "toolCallId": "D-nFpuBEiW4", - "toolName": "str_replace", - "output": [ - { - "type": "json", - "value": { - "file": "backend/src/templates/agents/agent-builder.ts", - "message": "Updated file", - "unifiedDiff": "@@ -126,17 +126,8 @@\n 'add_message',\n 'set_output',\n 'end_turn',\n ] satisfies ToolName[],\n- spawnableAgents: allAvailableAgents\n- ? (allAvailableAgents as any[])\n- : [\n- AgentTemplateTypes.file_picker,\n- AgentTemplateTypes.researcher,\n- AgentTemplateTypes.thinker,\n- AgentTemplateTypes.reviewer,\n- AgentTemplateTypes.agent_builder,\n- ],\n \n systemPrompt: [\n '# Bob the Agent Builder',\n '',\n" - } - } - ], - "parentAgentId": "D-gXwZERcWA" - }, - { - "type": "tool_call", - "toolCallId": "683b9ed2-e716-4808-949e-46be1b0d5c8b", - "toolName": "set_output", - "input": { - "output": { - "message": "", - "toolResults": [ - { - "file": "backend/src/templates/agents/agent-builder.ts", - "message": "Updated file", - "unifiedDiff": "@@ -126,17 +126,8 @@\n 'add_message',\n 'set_output',\n 'end_turn',\n ] satisfies ToolName[],\n- spawnableAgents: allAvailableAgents\n- ? (allAvailableAgents as any[])\n- : [\n- AgentTemplateTypes.file_picker,\n- AgentTemplateTypes.researcher,\n- AgentTemplateTypes.thinker,\n- AgentTemplateTypes.reviewer,\n- AgentTemplateTypes.agent_builder,\n- ],\n \n systemPrompt: [\n '# Bob the Agent Builder',\n '',\n" - } - ] - } - }, - "agentId": "D-gXwZERcWA", - "parentAgentId": "main-agent", - "includeToolCall": false - }, - { - "type": "tool_result", - "toolCallId": "683b9ed2-e716-4808-949e-46be1b0d5c8b", - "toolName": "set_output", - "output": [ - { - "type": "json", - "value": { - "message": "Output set" - } - } - ], - "parentAgentId": "D-gXwZERcWA" - }, - { - "type": "subagent_finish", - "agentId": "D-gXwZERcWA", - "agentType": "editor-gpt-5", - "displayName": "Code Editor", - "onlyChild": false, - "parentAgentId": "main-agent", - "prompt": "" - }, - { - "type": "tool_result", - "toolCallId": "D-gXircIAUI", - "toolName": "spawn_agents", - "output": [ - { - "type": "json", - "value": [ - { - "agentName": "Code Editor", - "agentType": "editor-gpt-5", - "value": { - "type": "structuredOutput", - "value": { - "output": { - "message": "", - "toolResults": [ - { - "file": "backend/src/templates/agents/agent-builder.ts", - "message": "Updated file", - "unifiedDiff": "@@ -126,17 +126,8 @@\n 'add_message',\n 'set_output',\n 'end_turn',\n ] satisfies ToolName[],\n- spawnableAgents: allAvailableAgents\n- ? (allAvailableAgents as any[])\n- : [\n- AgentTemplateTypes.file_picker,\n- AgentTemplateTypes.researcher,\n- AgentTemplateTypes.thinker,\n- AgentTemplateTypes.reviewer,\n- AgentTemplateTypes.agent_builder,\n- ],\n \n systemPrompt: [\n '# Bob the Agent Builder',\n '',\n" - } - ] - } - } - } - }, - { - "agentName": "Code Searcher", - "agentType": "code-searcher", - "value": { - "type": "structuredOutput", - "value": { - "results": [ - { - "stdout": "No results", - "message": "Exit code: 1" - }, - { - "stdout": "No results", - "message": "Exit code: 1" - } - ] - } - } - }, - { - "agentName": "Fletcher the File Fetcher", - "agentType": "file-picker", - "value": { - "type": "lastMessage", - "value": [ - { - "role": "assistant", - "content": [ - { - "type": "text", - "text": "Here's a brief summary of potentially useful files:\n\n* `common/src/util/examples/diff-reviewer-*.ts`: Example agent definitions for reviewing code diffs. Useful for understanding how to define agents that interact with `git diff` and the file system.\n* `common/src/util/changes.ts`: Functions for applying file changes (creations, modifications) to the file system, including applying patches.\n* `common/src/util/file.ts`: Functions for interacting with the file system, such as creating file trees, parsing file blocks, and validating file paths.\n* `common/src/util/git.ts`: Functions for executing Git commands, such as staging changes and committing.\n* `common/src/util/string.ts`: String manipulation functions.\n* `common/src/util/logger.ts`: Logging utilities with context.\n* `common/src/util/messages.ts`: Utilities for working with messages.\n* `common/src/util/object.ts`: Utilities for manipulating objects, e.g. removing undefined properties, comparing objects, adding objects, asserting conditions.\n\nThe files in `common/src/util/examples` provide concrete examples, while the other files offer utility functions that could be useful when working with files and Git.\n" - } - ] - } - ] - } - }, - { - "agentName": "Commander Lite", - "agentType": "commander-lite", - "value": { - "type": "lastMessage", - "value": [ - { - "role": "assistant", - "content": [ - { - "type": "text", - "text": "### Root `package.json`\n- **format**: `\"prettier --write \\\"**/*.{ts,tsx,json,md}\\\"\"`\n- **typecheck**: `\"bun --filter='*' run typecheck && echo '✅ All type checks passed!'\"`\n- **test**: `\"bun --filter='{@codebuff/backend,@codebuff/common,@codebuff/npm-app}' run test\"`\n- No `lint` script.\n\n### `scripts/package.json`\n- **typecheck**: `\"tsc --noEmit -p .\"`\n- **test**: `\"bun test\"`\n- No `lint` or `format` scripts.\n\n### `backend/package.json`\n- **typecheck**: `\"tsc --noEmit -p .\"`\n- **test**: `\"bun test\"`\n- No `lint` or `format` scripts.\n\n### `common/package.json`\n- **typecheck**: `\"tsc --noEmit -p .\"`\n- **test**: `\"bun test\"`\n- No `lint` or `format` scripts." - } - ] - } - ] - } - } - ] - } - ] - }, - { - "type": "tool_call", - "toolCallId": "c0b8970e-2255-4ee7-8066-89f0c00d5803", - "toolName": "spawn_agent_inline", - "input": { - "agent_type": "context-pruner", - "params": {} - }, - "agentId": "main-agent", - "includeToolCall": false - }, - { - "type": "tool_result", - "toolCallId": "c0b8970e-2255-4ee7-8066-89f0c00d5803", - "toolName": "spawn_agent_inline", - "output": [ - { - "type": "json", - "value": { - "message": "Agent spawned." - } - } - ] - }, - { - "type": "tool_call", - "toolCallId": "D-oWnvQd5aA", - "toolName": "spawn_agents", - "input": { - "agents": [ - { - "agent_type": "editor-gpt-5" - } - ] - }, - "agentId": "main-agent", - "includeToolCall": true - }, - { - "type": "tool_call", - "toolCallId": "D-oYtCzzjlw", - "toolName": "spawn_agents", - "input": { - "agents": [ - { - "agent_type": "commander-lite", - "prompt": "Run root typecheck to validate TypeScript changes.", - "params": { - "command": "bun run typecheck", - "timeout_seconds": 120 - } - }, - { - "agent_type": "commander-lite", - "prompt": "Run relevant package tests if any affected.", - "params": { - "command": "bun run test", - "timeout_seconds": 120 - } - }, - { - "agent_type": "commander-lite", - "prompt": "Check if any formatting issues.", - "params": { - "command": "bun run format --check", - "timeout_seconds": 60 - } - } - ] - }, - "agentId": "main-agent", - "includeToolCall": true - }, - { - "type": "subagent_start", - "agentId": "D-oY2QIts4E", - "agentType": "editor-gpt-5", - "displayName": "Code Editor", - "onlyChild": true, - "parentAgentId": "main-agent", - "prompt": "" - }, - { - "type": "text", - "agentId": "D-oY2QIts4E", - "text": "\n{\n \"cb_tool_name\": \"write_file\",\n \"path\": \"backend/src/templates/agents/agent-builder.ts\",\n \"instructions\": \"Update agent builder to gather diff-reviewer examples plus a new starter template, keep examples under .agents/examples, copy starter into .agents root, and stop advertising spawnable agents.\",\n \"content\": \"import * as fs from 'fs'\\nimport * as path from 'path'\\n\\nimport { AGENT_TEMPLATES_DIR, AGENT_DEFINITION_FILE } from '@codebuff/common/constants'\\nimport { AgentTemplateTypes } from '@codebuff/common/types/session-state'\\nimport z from 'zod/v4'\\n\\nimport type { AgentTemplate } from '../types'\\nimport type { Model } from '@codebuff/common/constants'\\nimport type { ToolName } from '@codebuff/common/tools/constants'\\n\\nconst COMMON_UTIL_PATH = '../../../../common/src/util'\\nconst TEMPLATE_RELATIVE_PATH =\\n `${COMMON_UTIL_PATH}/types/${AGENT_DEFINITION_FILE}` as const\\n// Import to validate path exists at compile time\\nimport(TEMPLATE_RELATIVE_PATH)\\n\\nconst TEMPLATE_PATH = path.join(__dirname, TEMPLATE_RELATIVE_PATH)\\nconst TYPES_DIR = path.join(AGENT_TEMPLATES_DIR, 'types')\\nconst EXAMPLES_DIR = path.join(AGENT_TEMPLATES_DIR, 'examples')\\nconst TEMPLATE_TYPES_PATH = path.join(TYPES_DIR, AGENT_DEFINITION_FILE)\\nconst TOOL_DEFINITIONS_FILE = 'tools.d.ts'\\nconst TOOL_DEFINITIONS_PATH = path.join(TYPES_DIR, TOOL_DEFINITIONS_FILE)\\n\\nconst EXAMPLES_SOURCE_DIR = path.join(__dirname, `${COMMON_UTIL_PATH}/examples`)\\nconst STARTER_TEMPLATE_SOURCE_FILE = 'your-custom-agent.ts.txt'\\nconst STARTER_TEMPLATE_DEST_FILE = 'your-custom-agent.ts'\\n\\nexport const agentBuilder = (\\n model: Model,\\n _allAvailableAgents?: string[],\\n): Omit => {\\n // Read the AGENT_CONFIG_FILE content dynamically\\n // The import above ensures this path exists at compile time\\n let agentTemplateContent = ''\\n try {\\n agentTemplateContent = fs.readFileSync(TEMPLATE_PATH, 'utf8')\\n } catch (error) {\\n console.warn(`Could not read ${AGENT_DEFINITION_FILE}:`, error)\\n agentTemplateContent = '// Agent template types not available'\\n }\\n\\n // Read the tools.d.ts content from common package\\n let toolDefinitionsContent = ''\\n try {\\n const toolsPath = path.join(\\n __dirname,\\n `${COMMON_UTIL_PATH}/types/tools.d.ts`,\\n )\\n toolDefinitionsContent = fs.readFileSync(toolsPath, 'utf8')\\n } catch (error) {\\n console.warn(`Could not read tools.d.ts from common:`, error)\\n toolDefinitionsContent = '// Tool definitions not available'\\n }\\n\\n // Read example agent files + starter template from common package\\n const exampleAgentContents: Record = {}\\n let starterTemplateContent = ''\\n\\n try {\\n if (fs.existsSync(EXAMPLES_SOURCE_DIR)) {\\n const files = fs.readdirSync(EXAMPLES_SOURCE_DIR)\\n\\n files\\n .filter(\\n (file) => file.endsWith('.ts') && file.startsWith('diff-reviewer-'),\\n )\\n .forEach((filename) => {\\n const fullPath = path.join(EXAMPLES_SOURCE_DIR, filename)\\n const content = fs.readFileSync(fullPath, 'utf8')\\n exampleAgentContents[filename] = content\\n })\\n\\n const starterTemplatePath = path.join(\\n EXAMPLES_SOURCE_DIR,\\n STARTER_TEMPLATE_SOURCE_FILE,\\n )\\n if (fs.existsSync(starterTemplatePath)) {\\n starterTemplateContent = fs.readFileSync(starterTemplatePath, 'utf8')\\n }\\n } else {\\n console.warn(\\n `Example agents directory does not exist: ${EXAMPLES_SOURCE_DIR}`,\\n )\\n }\\n } catch (error) {\\n console.warn('Could not read example agents:', error)\\n }\\n\\n return {\\n model,\\n displayName: 'Bob the Agent Builder',\\n spawnPurposePrompt:\\n 'Enhanced base agent that can create custom agents and handle all coding tasks with deterministic agent creation behavior',\\n inputSchema: {\\n prompt: z\\n .string()\\n .optional()\\n .describe(\\n 'What agent type you would like to create or edit. Include as many details as possible.',\\n ),\\n params: z\\n .object({\\n name: z.string().optional(),\\n purpose: z.string().optional(),\\n specialty: z.string().optional(),\\n model: z.string().optional(),\\n })\\n .passthrough()\\n .optional(),\\n },\\n outputMode: 'structured_output',\\n includeMessageHistory: false,\\n toolNames: [\\n 'write_file',\\n 'str_replace',\\n 'run_terminal_command',\\n 'read_files',\\n 'code_search',\\n 'spawn_agents',\\n 'add_message',\\n 'set_output',\\n 'end_turn',\\n ] satisfies ToolName[],\\n\\n systemPrompt: [\\n '# Bob the Agent Builder',\\n '',\\n 'You are an expert agent builder specialized in creating new agent templates for the codebuff system. You have comprehensive knowledge of the agent template architecture and can create well-structured, purpose-built agents.',\\n '',\\n '## Environment Setup Complete',\\n '',\\n 'Your environment has been automatically prepared with:',\\n '- Agent template type definitions in `.agents/types/agent-definition.d.ts`',\\n '- Tool type definitions in `.agents/types/tools.d.ts`',\\n '- Diff-reviewer examples in `.agents/examples/` for reference',\\n '- A starter custom agent template at `.agents/your-custom-agent.ts`',\\n '',\\n 'All necessary files are now available in your working directory.',\\n '',\\n '## Complete Agent Template Type Definitions',\\n '',\\n 'Here are the complete TypeScript type definitions for creating custom Codebuff agents:',\\n '```typescript',\\n agentTemplateContent,\\n '```',\\n '',\\n '## Available Tools Type Definitions',\\n '',\\n 'Here are the complete TypeScript type definitions for all available tools:',\\n '',\\n '```typescript',\\n toolDefinitionsContent,\\n '```',\\n '',\\n '## Agent Template Patterns:',\\n '',\\n '1. **Base Agent Pattern**: Full-featured agents with comprehensive tool access',\\n '2. **Specialized Agent Pattern**: Focused agents with limited tool sets',\\n '3. **Thinking Agent Pattern**: Agents that spawn thinker sub-agents',\\n '4. **Research Agent Pattern**: Agents that start with web search',\\n '',\\n '## Best Practices:',\\n '',\\n '1. **Use as few fields as possible**: Leave out fields that are not needed to reduce complexity',\\n '2. **Minimal Tools**: Only include tools the agent actually needs',\\n '3. **Clear and Concise Prompts**: Write clear, specific prompts that have no unnecessary words',\\n '4. **Consistent Naming**: Follow naming conventions (kebab-case for IDs)',\\n '5. **Appropriate Model**: Choose the right model for the task complexity. Default is claude-4-sonnet-20250522 for medium-high complexity tasks, and openai/gpt-5 for all other tasks.',\\n '',\\n '## Your Task:',\\n 'When asked to create an agent template, you should:',\\n \\\"1. Understand the requested agent's purpose and capabilities\\\",\\n \\\"2. Choose appropriate tools for the agent's function\\\",\\n '3. Write a comprehensive system prompt',\\n `4. Create the complete agent template file in ${AGENT_TEMPLATES_DIR}`,\\n '5. Ensure the template follows all conventions and best practices',\\n '6. Use the AgentDefinition interface for the configuration',\\n '7. Start the file with: import type { AgentDefinition } from \\\"./types/agent-definition.d.ts\\\"',\\n '',\\n 'Create agent templates that are focused, efficient, and well-documented. Always import the AgentDefinition type and export a default configuration object.',\\n ].join('\\\\n'),\\n instructionsPrompt: `You are helping to create or edit an agent template. The user will describe what kind of agent they want to create or how they want to modify an existing agent.\\n\\n## Environment Ready\\n\\nYour environment has been automatically set up with:\\n- Type definitions in \\\\`.agents/types/\\\\`\\n- Diff-reviewer examples in \\\\`.agents/examples/\\\\`\\n- A starter custom agent template at \\\\`.agents/your-custom-agent.ts\\\\`\\n\\nYou can now proceed directly to agent creation or editing.\\n\\n## Example Agents Available\\n\\nThree diff-reviewer examples are available in \\\\`.agents/examples/\\\\`. These can serve as examples of well-made agents at different stages of complexity.\\n\\n**IMPORTANT**: Examine these examples to find connections and patterns that relate to the user's request. Look for:\\n- Similar tool combinations\\n- Comparable complexity levels\\n- Related functionality patterns\\n- Appropriate model choices\\n- Relevant prompt structures\\n\\nUse these examples as inspiration and starting points, adapting their patterns to fit the user's specific needs.\\n\\n## Starter Template Available\\n\\nA starter custom agent file is available at \\\\`.agents/your-custom-agent.ts\\\\`. You can either modify this file directly or use it as a reference for creating a new agent.\\n\\n## For New Agents\\n\\nAnalyze their request and create a complete agent template that:\\n- Has a clear purpose and appropriate capabilities\\n- Leaves out fields that are not needed\\n- Uses only the tools it needs\\n- Follows naming conventions\\n- Is properly structured\\n- Draws inspiration from relevant example agents\\n\\n## For Creating New Agents\\n\\nThe agent builder is focused on creating new agent templates based on user specifications.\\n\\nIMPORTANT: Always end your response with the end_turn tool when you have completed the agent creation or editing task.`,\\n stepPrompt: '',\\n\\n handleSteps: function* () {\\n // Step 1: Create directory structure\\n yield {\\n toolName: 'run_terminal_command',\\n args: {\\n command: `mkdir -p ${TYPES_DIR} && mkdir -p ${EXAMPLES_DIR}`,\\n process_type: 'SYNC',\\n timeout_seconds: 10,\\n },\\n }\\n\\n // Step 2: Write the AGENT_DEFINITION_FILE with the template content\\n yield {\\n toolName: 'write_file',\\n args: {\\n path: TEMPLATE_TYPES_PATH,\\n instructions: 'Create agent template type definitions file',\\n content: agentTemplateContent,\\n },\\n }\\n\\n // Step 3: Write the tool definitions file (copy from existing tools.d.ts)\\n yield {\\n toolName: 'write_file',\\n args: {\\n path: TOOL_DEFINITIONS_PATH,\\n instructions: 'Create tools type file',\\n content: toolDefinitionsContent,\\n },\\n }\\n\\n // Step 4: Add message about reading example files and then read them\\n yield {\\n toolName: 'add_message',\\n args: {\\n role: 'assistant',\\n content:\\n \\\"I'll review the starter template and diff-reviewer examples, then help you create your agent.\\\",\\n },\\n }\\n\\n // Step 5: Copy example agent files to .agents/examples/\\n for (const [filename, content] of Object.entries(exampleAgentContents)) {\\n if (content) {\\n yield {\\n toolName: 'write_file',\\n args: {\\n path: `${EXAMPLES_DIR}/${filename}`,\\n instructions: `Copy example agent file ${filename}`,\\n content: content,\\n },\\n }\\n }\\n }\\n\\n // Step 6: Copy starter template directly to .agents/\\n if (starterTemplateContent) {\\n yield {\\n toolName: 'write_file',\\n args: {\\n path: `${AGENT_TEMPLATES_DIR}/${STARTER_TEMPLATE_DEST_FILE}`,\\n instructions: `Copy starter custom agent template ${STARTER_TEMPLATE_DEST_FILE}`,\\n content: starterTemplateContent,\\n },\\n }\\n }\\n\\n // Step 7: Complete agent creation process\\n yield 'STEP_ALL'\\n },\\n }\\n}\\n\"\n}\n\n\n\n{\n \"cb_tool_name\": \"str_replace\",\n \"path\": \"common/src/constants/agents.ts\",\n \"replacements\": [\n {\n \"old\": \" dry_run: {\\n displayName: 'Sketch the Dry Runner',\\n purpose: 'Agent that takes a plan and try to implement it in a dry run.',\\n hidden: true,\\n } as const,\\n\",\n \"new\": \"\"\n },\n {\n \"old\": \" agent_builder: {\\n displayName: 'Bob the Agent Builder',\\n purpose: 'Creates new agent templates for the codebuff mult-agent system',\\n hidden: false,\\n } as const,\\n\",\n \"new\": \" agent_builder: {\\n displayName: 'Bob the Agent Builder',\\n purpose: 'Creates new agent templates for the codebuff multi-agent system',\\n hidden: false,\\n } as const,\\n\"\n }\n ]\n}\n\n\n\n{\n \"cb_tool_name\": \"write_file\",\n \"path\": \".agents/examples/diff-reviewer-1.ts\",\n \"instructions\": \"Refresh diff-reviewer-1 example to use current Anthropic model.\",\n \"content\": \"import type { AgentDefinition } from '../types/agent-definition'\\n\\nconst definition: AgentDefinition = {\\n id: 'diff-reviewer-1',\\n\\n displayName: 'Diff Reviewer (Level 1)',\\n model: 'anthropic/claude-4-sonnet-20250522',\\n toolNames: ['read_files', 'run_terminal_command'],\\n\\n spawnPurposePrompt:\\n 'Spawn when you need to review code changes in the git diff',\\n\\n instructionsPrompt: `Execute the following steps:\\n1. Run git diff\\n2. Read the files that have changed\\n3. Review the changes and suggest improvements`,\\n}\\n\\nexport default definition\\n\"\n}\n\n\n\n{\n \"cb_tool_name\": \"write_file\",\n \"path\": \".agents/examples/diff-reviewer-2.ts\",\n \"instructions\": \"Refresh diff-reviewer-2 example to use current Anthropic model.\",\n \"content\": \"import type {\\n AgentDefinition,\\n AgentStepContext,\\n} from '../types/agent-definition'\\n\\nconst definition: AgentDefinition = {\\n id: 'diff-reviewer-2',\\n displayName: 'Diff Reviewer (Level 2)',\\n model: 'anthropic/claude-4-sonnet-20250522',\\n\\n inputSchema: {\\n prompt: {\\n type: 'string',\\n description:\\n 'Please provide a short description of the changes you want to review',\\n },\\n },\\n toolNames: ['read_files', 'run_terminal_command'],\\n\\n spawnPurposePrompt:\\n 'Spawn when you need to review code changes in the git diff',\\n\\n systemPrompt:\\n 'You are an expert software developer. Your job is to review code changes and provide helpful feedback.',\\n\\n instructionsPrompt: `Execute the following steps:\\n1. Run git diff\\n2. Read the files that have changed\\n3. Review the changes and suggest improvements\\n\\nUse the following guidelines while reviewing the changes:\\n- Find ways to simplify the code\\n- Reuse existing code as much as possible instead of writing new code\\n- Preserve as much behavior as possible in the existing code\\n- Prefer changing as few lines of code as possible\\n- Look for opportunities to improve the code's readability\\n- Look for logical errors in the code\\n- Look for missed cases in the code\\n- Look for any other bugs`,\\n\\n handleSteps: function* ({ prompt }: AgentStepContext) {\\n // Step 1: Run git diff immediately. Saves the agent a step, lowering cost and latency!\\n yield {\\n toolName: 'run_terminal_command',\\n args: {\\n command: 'git diff',\\n },\\n }\\n\\n // Step 2: Let AI run the rest of the steps!\\n yield 'STEP_ALL'\\n },\\n}\\n\\nexport default definition\\n\"\n}\n\n\n\n{\n \"cb_tool_name\": \"write_file\",\n \"path\": \".agents/examples/diff-reviewer-3.ts\",\n \"instructions\": \"Refresh diff-reviewer-3 example to use current Anthropic model, correct file-explorer spawn target, and streamline final step behavior.\",\n \"content\": \"import type {\\n AgentDefinition,\\n AgentStepContext,\\n} from '../types/agent-definition'\\n\\nconst definition: AgentDefinition = {\\n id: 'diff-reviewer-3',\\n\\n displayName: 'Diff Reviewer (Level 3)',\\n model: 'anthropic/claude-4-sonnet-20250522',\\n inputSchema: {\\n prompt: {\\n type: 'string',\\n description:\\n 'Please provide a short description of the changes you want to review',\\n },\\n },\\n outputMode: 'last_message',\\n\\n toolNames: ['read_files', 'run_terminal_command', 'spawn_agents'],\\n spawnableAgents: ['file-explorer'],\\n\\n spawnPurposePrompt:\\n 'Spawn when you need to review code changes in the git diff',\\n\\n systemPrompt:\\n 'You are an expert software developer. Your job is to review code changes and provide helpful feedback.',\\n\\n instructionsPrompt: `Review the changes and suggest improvements.\\n\\nUse the following guidelines while reviewing the changes:\\n- Find ways to simplify the code\\n- Reuse existing code as much as possible instead of writing new code\\n- Preserve as much behavior as possible in the existing code\\n- Prefer changing as few lines of code as possible\\n- Look for opportunities to improve the code's readability\\n- Look for logical errors in the code\\n- Look for missed cases in the code\\n- Look for any other bugs`,\\n\\n handleSteps: function* ({ prompt }: AgentStepContext) {\\n // Step 1: Get list of changed files from git diff --name-only\\n const { toolResult: gitDiffFilesResult } = yield {\\n toolName: 'run_terminal_command',\\n args: {\\n command: 'git diff --name-only',\\n },\\n }\\n\\n const changedFiles = (gitDiffFilesResult || '')\\n .split('\\\\n')\\n .map((line) => line.trim())\\n .filter((line) => line && !line.startsWith('??') && !line.includes('OSC'))\\n\\n // Step 2: Read changed files\\n if (changedFiles.length > 0) {\\n yield {\\n toolName: 'read_files',\\n args: {\\n paths: changedFiles,\\n },\\n }\\n }\\n\\n // Step 3: Run full git diff to see the actual changes\\n yield {\\n toolName: 'run_terminal_command',\\n args: {\\n command: 'git diff',\\n },\\n }\\n\\n // Step 4: Spawn file explorer for broader context if needed\\n yield {\\n toolName: 'spawn_agents',\\n args: {\\n agents: [\\n {\\n agent_type: 'file-explorer',\\n prompt: `Find any additional codebase context needed to review these changes. Review focus: ${prompt || ''}`,\\n params: {\\n prompts: [\\n 'Any modules/classes/functions referenced by the diff',\\n 'Relevant tests or test helpers for the changed code',\\n 'Related config or shared utilities that might be impacted',\\n ],\\n },\\n },\\n ],\\n },\\n }\\n\\n // Step 5: Let the AI produce the final review in a single final step\\n yield 'STEP_ALL'\\n },\\n}\\n\\nexport default definition\\n\"\n}\n\n\n\n{\n \"cb_tool_name\": \"write_file\",\n \"path\": \"common/src/util/examples/diff-reviewer-1.ts\",\n \"instructions\": \"Refresh common diff-reviewer-1 example to use current Anthropic model.\",\n \"content\": \"import type { AgentDefinition } from '../types/agent-definition'\\n\\nconst definition: AgentDefinition = {\\n id: 'diff-reviewer-1',\\n\\n displayName: 'Diff Reviewer (Level 1)',\\n model: 'anthropic/claude-4-sonnet-20250522',\\n toolNames: ['read_files', 'run_terminal_command'],\\n\\n spawnPurposePrompt:\\n 'Spawn when you need to review code changes in the git diff',\\n\\n instructionsPrompt: `Execute the following steps:\\n1. Run git diff\\n2. Read the files that have changed\\n3. Review the changes and suggest improvements`,\\n}\\n\\nexport default definition\\n\"\n}\n\n\n\n{\n \"cb_tool_name\": \"write_file\",\n \"path\": \"common/src/util/examples/diff-reviewer-2.ts\",\n \"instructions\": \"Refresh common diff-reviewer-2 example to use current Anthropic model.\",\n \"content\": \"import type {\\n AgentDefinition,\\n AgentStepContext,\\n} from '../types/agent-definition'\\n\\nconst definition: AgentDefinition = {\\n id: 'diff-reviewer-2',\\n displayName: 'Diff Reviewer (Level 2)',\\n model: 'anthropic/claude-4-sonnet-20250522',\\n\\n inputSchema: {\\n prompt: {\\n type: 'string',\\n description:\\n 'Please provide a short description of the changes you want to review',\\n },\\n },\\n toolNames: ['read_files', 'run_terminal_command'],\\n\\n spawnPurposePrompt:\\n 'Spawn when you need to review code changes in the git diff',\\n\\n systemPrompt:\\n 'You are an expert software developer. Your job is to review code changes and provide helpful feedback.',\\n\\n instructionsPrompt: `Execute the following steps:\\n1. Run git diff\\n2. Read the files that have changed\\n3. Review the changes and suggest improvements\\n\\nUse the following guidelines while reviewing the changes:\\n- Find ways to simplify the code\\n- Reuse existing code as much as possible instead of writing new code\\n- Preserve as much behavior as possible in the existing code\\n- Prefer changing as few lines of code as possible\\n- Look for opportunities to improve the code's readability\\n- Look for logical errors in the code\\n- Look for missed cases in the code\\n- Look for any other bugs`,\\n\\n handleSteps: function* ({ prompt }: AgentStepContext) {\\n // Step 1: Run git diff immediately. Saves the agent a step, lowering cost and latency!\\n yield {\\n toolName: 'run_terminal_command',\\n args: {\\n command: 'git diff',\\n },\\n }\\n\\n // Step 2: Let AI run the rest of the steps!\\n yield 'STEP_ALL'\\n },\\n}\\n\\nexport default definition\\n\"\n}\n\n\n\n{\n \"cb_tool_name\": \"write_file\",\n \"path\": \"common/src/util/examples/diff-reviewer-3.ts\",\n \"instructions\": \"Refresh common diff-reviewer-3 example to use current Anthropic model, correct file-explorer spawn target, and streamline final step behavior.\",\n \"content\": \"import type {\\n AgentDefinition,\\n AgentStepContext,\\n} from '../types/agent-definition'\\n\\nconst definition: AgentDefinition = {\\n id: 'diff-reviewer-3',\\n\\n displayName: 'Diff Reviewer (Level 3)',\\n model: 'anthropic/claude-4-sonnet-20250522',\\n inputSchema: {\\n prompt: {\\n type: 'string',\\n description:\\n 'Please provide a short description of the changes you want to review',\\n },\\n },\\n outputMode: 'last_message',\\n\\n toolNames: ['read_files', 'run_terminal_command', 'spawn_agents'],\\n spawnableAgents: ['file-explorer'],\\n\\n spawnPurposePrompt:\\n 'Spawn when you need to review code changes in the git diff',\\n\\n systemPrompt:\\n 'You are an expert software developer. Your job is to review code changes and provide helpful feedback.',\\n\\n instructionsPrompt: `Review the changes and suggest improvements.\\n\\nUse the following guidelines while reviewing the changes:\\n- Find ways to simplify the code\\n- Reuse existing code as much as possible instead of writing new code\\n- Preserve as much behavior as possible in the existing code\\n- Prefer changing as few lines of code as possible\\n- Look for opportunities to improve the code's readability\\n- Look for logical errors in the code\\n- Look for missed cases in the code\\n- Look for any other bugs`,\\n\\n handleSteps: function* ({ prompt }: AgentStepContext) {\\n // Step 1: Get list of changed files from git diff --name-only\\n const { toolResult: gitDiffFilesResult } = yield {\\n toolName: 'run_terminal_command',\\n args: {\\n command: 'git diff --name-only',\\n },\\n }\\n\\n const changedFiles = (gitDiffFilesResult || '')\\n .split('\\\\n')\\n .map((line) => line.trim())\\n .filter((line) => line && !line.startsWith('??') && !line.includes('OSC'))\\n\\n // Step 2: Read changed files\\n if (changedFiles.length > 0) {\\n yield {\\n toolName: 'read_files',\\n args: {\\n paths: changedFiles,\\n },\\n }\\n }\\n\\n // Step 3: Run full git diff to see the actual changes\\n yield {\\n toolName: 'run_terminal_command',\\n args: {\\n command: 'git diff',\\n },\\n }\\n\\n // Step 4: Spawn file explorer for broader context if needed\\n yield {\\n toolName: 'spawn_agents',\\n args: {\\n agents: [\\n {\\n agent_type: 'file-explorer',\\n prompt: `Find any additional codebase context needed to review these changes. Review focus: ${prompt || ''}`,\\n params: {\\n prompts: [\\n 'Any modules/classes/functions referenced by the diff',\\n 'Relevant tests or test helpers for the changed code',\\n 'Related config or shared utilities that might be impacted',\\n ],\\n },\\n },\\n ],\\n },\\n }\\n\\n // Step 5: Let the AI produce the final review in a single final step\\n yield 'STEP_ALL'\\n },\\n}\\n\\nexport default definition\\n\"\n}\n\n\n\n{\n \"cb_tool_name\": \"write_file\",\n \"path\": \".agents/your-custom-agent.ts\",\n \"instructions\": \"Add a new starter custom agent (Git Committer scaffold) in the top-level .agents directory, ready to run and publish.\",\n \"content\": \"import { publisher, version } from './constants'\\n\\nimport type {\\n AgentDefinition,\\n AgentStepContext,\\n} from './types/agent-definition'\\n\\nconst definition: AgentDefinition = {\\n id: 'your-custom-agent',\\n version,\\n publisher,\\n\\n displayName: 'Your Custom Agent (Git Committer)',\\n model: 'anthropic/claude-4-sonnet-20250522',\\n toolNames: ['read_files', 'run_terminal_command', 'add_message', 'end_turn'],\\n\\n inputSchema: {\\n prompt: {\\n type: 'string',\\n description: 'What changes to commit',\\n },\\n },\\n\\n includeMessageHistory: false,\\n outputMode: 'last_message',\\n\\n spawnPurposePrompt:\\n 'Spawn when you need to commit code changes to git with an appropriate commit message',\\n\\n systemPrompt:\\n 'You are an expert software developer. Your job is to create a git commit with a really good commit message.',\\n\\n instructionsPrompt:\\n 'Follow the steps to create a good commit: analyze changes with git diff and git log, read relevant files for context, stage appropriate files, and create a commit with proper formatting including the Codebuff footer.',\\n\\n handleSteps: function* ({ prompt }: AgentStepContext) {\\n // Step 1: Analyze the changes\\n yield {\\n toolName: 'run_terminal_command',\\n args: {\\n command: 'git diff',\\n process_type: 'SYNC',\\n timeout_seconds: 30,\\n },\\n }\\n\\n yield {\\n toolName: 'run_terminal_command',\\n args: {\\n command: 'git log --oneline -10',\\n process_type: 'SYNC',\\n timeout_seconds: 30,\\n },\\n }\\n\\n // Step 2: Let the AI decide what to read + what to stage based on the user's intent\\n yield {\\n toolName: 'add_message',\\n args: {\\n role: 'assistant',\\n content: `Goal: ${prompt}\\\\n\\\\nI'll read any relevant files and stage the right changes next.`,\\n },\\n }\\n\\n yield 'STEP'\\n\\n // Step 3: Let the AI create the commit with proper formatting\\n yield {\\n toolName: 'add_message',\\n args: {\\n role: 'assistant',\\n content:\\n \\\"Now I'll create the commit with a high-quality message and the proper Codebuff footer format.\\\",\\n },\\n }\\n\\n yield 'STEP_ALL'\\n },\\n}\\n\\nexport default definition\\n\"\n}\n\n\n\n{\n \"cb_tool_name\": \"write_file\",\n \"path\": \"common/src/util/examples/your-custom-agent.ts.txt\",\n \"instructions\": \"Add starter custom agent template content for the agent builder to copy into .agents/your-custom-agent.ts.\",\n \"content\": \"import { publisher, version } from './constants'\\n\\nimport type {\\n AgentDefinition,\\n AgentStepContext,\\n} from './types/agent-definition'\\n\\nconst definition: AgentDefinition = {\\n id: 'your-custom-agent',\\n version,\\n publisher,\\n\\n displayName: 'Your Custom Agent (Git Committer)',\\n model: 'anthropic/claude-4-sonnet-20250522',\\n toolNames: ['read_files', 'run_terminal_command', 'add_message', 'end_turn'],\\n\\n inputSchema: {\\n prompt: {\\n type: 'string',\\n description: 'What changes to commit',\\n },\\n },\\n\\n includeMessageHistory: false,\\n outputMode: 'last_message',\\n\\n spawnPurposePrompt:\\n 'Spawn when you need to commit code changes to git with an appropriate commit message',\\n\\n systemPrompt:\\n 'You are an expert software developer. Your job is to create a git commit with a really good commit message.',\\n\\n instructionsPrompt:\\n 'Follow the steps to create a good commit: analyze changes with git diff and git log, read relevant files for context, stage appropriate files, and create a commit with proper formatting including the Codebuff footer.',\\n\\n handleSteps: function* ({ prompt }: AgentStepContext) {\\n // Step 1: Analyze the changes\\n yield {\\n toolName: 'run_terminal_command',\\n args: {\\n command: 'git diff',\\n process_type: 'SYNC',\\n timeout_seconds: 30,\\n },\\n }\\n\\n yield {\\n toolName: 'run_terminal_command',\\n args: {\\n command: 'git log --oneline -10',\\n process_type: 'SYNC',\\n timeout_seconds: 30,\\n },\\n }\\n\\n // Step 2: Let the AI decide what to read + what to stage based on the user's intent\\n yield {\\n toolName: 'add_message',\\n args: {\\n role: 'assistant',\\n content: `Goal: ${prompt}\\\\n\\\\nI'll read any relevant files and stage the right changes next.`,\\n },\\n }\\n\\n yield 'STEP'\\n\\n // Step 3: Let the AI create the commit with proper formatting\\n yield {\\n toolName: 'add_message',\\n args: {\\n role: 'assistant',\\n content:\\n \\\"Now I'll create the commit with a high-quality message and the proper Codebuff footer format.\\\",\\n },\\n }\\n\\n yield 'STEP_ALL'\\n },\\n}\\n\\nexport default definition\\n\"\n}\n" - }, - { - "type": "tool_call", - "toolCallId": "236eaf27-5781-488d-bcb0-48431ca62da1", - "toolName": "write_file", - "input": { - "path": "backend/src/templates/agents/agent-builder.ts", - "instructions": "Update agent builder to gather diff-reviewer examples plus a new starter template, keep examples under .agents/examples, copy starter into .agents root, and stop advertising spawnable agents.", - "content": "import * as fs from 'fs'\nimport * as path from 'path'\n\nimport { AGENT_TEMPLATES_DIR, AGENT_DEFINITION_FILE } from '@codebuff/common/constants'\nimport { AgentTemplateTypes } from '@codebuff/common/types/session-state'\nimport z from 'zod/v4'\n\nimport type { AgentTemplate } from '../types'\nimport type { Model } from '@codebuff/common/constants'\nimport type { ToolName } from '@codebuff/common/tools/constants'\n\nconst COMMON_UTIL_PATH = '../../../../common/src/util'\nconst TEMPLATE_RELATIVE_PATH =\n `${COMMON_UTIL_PATH}/types/${AGENT_DEFINITION_FILE}` as const\n// Import to validate path exists at compile time\nimport(TEMPLATE_RELATIVE_PATH)\n\nconst TEMPLATE_PATH = path.join(__dirname, TEMPLATE_RELATIVE_PATH)\nconst TYPES_DIR = path.join(AGENT_TEMPLATES_DIR, 'types')\nconst EXAMPLES_DIR = path.join(AGENT_TEMPLATES_DIR, 'examples')\nconst TEMPLATE_TYPES_PATH = path.join(TYPES_DIR, AGENT_DEFINITION_FILE)\nconst TOOL_DEFINITIONS_FILE = 'tools.d.ts'\nconst TOOL_DEFINITIONS_PATH = path.join(TYPES_DIR, TOOL_DEFINITIONS_FILE)\n\nconst EXAMPLES_SOURCE_DIR = path.join(__dirname, `${COMMON_UTIL_PATH}/examples`)\nconst STARTER_TEMPLATE_SOURCE_FILE = 'your-custom-agent.ts.txt'\nconst STARTER_TEMPLATE_DEST_FILE = 'your-custom-agent.ts'\n\nexport const agentBuilder = (\n model: Model,\n _allAvailableAgents?: string[],\n): Omit => {\n // Read the AGENT_CONFIG_FILE content dynamically\n // The import above ensures this path exists at compile time\n let agentTemplateContent = ''\n try {\n agentTemplateContent = fs.readFileSync(TEMPLATE_PATH, 'utf8')\n } catch (error) {\n console.warn(`Could not read ${AGENT_DEFINITION_FILE}:`, error)\n agentTemplateContent = '// Agent template types not available'\n }\n\n // Read the tools.d.ts content from common package\n let toolDefinitionsContent = ''\n try {\n const toolsPath = path.join(\n __dirname,\n `${COMMON_UTIL_PATH}/types/tools.d.ts`,\n )\n toolDefinitionsContent = fs.readFileSync(toolsPath, 'utf8')\n } catch (error) {\n console.warn(`Could not read tools.d.ts from common:`, error)\n toolDefinitionsContent = '// Tool definitions not available'\n }\n\n // Read example agent files + starter template from common package\n const exampleAgentContents: Record = {}\n let starterTemplateContent = ''\n\n try {\n if (fs.existsSync(EXAMPLES_SOURCE_DIR)) {\n const files = fs.readdirSync(EXAMPLES_SOURCE_DIR)\n\n files\n .filter(\n (file) => file.endsWith('.ts') && file.startsWith('diff-reviewer-'),\n )\n .forEach((filename) => {\n const fullPath = path.join(EXAMPLES_SOURCE_DIR, filename)\n const content = fs.readFileSync(fullPath, 'utf8')\n exampleAgentContents[filename] = content\n })\n\n const starterTemplatePath = path.join(\n EXAMPLES_SOURCE_DIR,\n STARTER_TEMPLATE_SOURCE_FILE,\n )\n if (fs.existsSync(starterTemplatePath)) {\n starterTemplateContent = fs.readFileSync(starterTemplatePath, 'utf8')\n }\n } else {\n console.warn(\n `Example agents directory does not exist: ${EXAMPLES_SOURCE_DIR}`,\n )\n }\n } catch (error) {\n console.warn('Could not read example agents:', error)\n }\n\n return {\n model,\n displayName: 'Bob the Agent Builder',\n spawnPurposePrompt:\n 'Enhanced base agent that can create custom agents and handle all coding tasks with deterministic agent creation behavior',\n inputSchema: {\n prompt: z\n .string()\n .optional()\n .describe(\n 'What agent type you would like to create or edit. Include as many details as possible.',\n ),\n params: z\n .object({\n name: z.string().optional(),\n purpose: z.string().optional(),\n specialty: z.string().optional(),\n model: z.string().optional(),\n })\n .passthrough()\n .optional(),\n },\n outputMode: 'structured_output',\n includeMessageHistory: false,\n toolNames: [\n 'write_file',\n 'str_replace',\n 'run_terminal_command',\n 'read_files',\n 'code_search',\n 'spawn_agents',\n 'add_message',\n 'set_output',\n 'end_turn',\n ] satisfies ToolName[],\n\n systemPrompt: [\n '# Bob the Agent Builder',\n '',\n 'You are an expert agent builder specialized in creating new agent templates for the codebuff system. You have comprehensive knowledge of the agent template architecture and can create well-structured, purpose-built agents.',\n '',\n '## Environment Setup Complete',\n '',\n 'Your environment has been automatically prepared with:',\n '- Agent template type definitions in `.agents/types/agent-definition.d.ts`',\n '- Tool type definitions in `.agents/types/tools.d.ts`',\n '- Diff-reviewer examples in `.agents/examples/` for reference',\n '- A starter custom agent template at `.agents/your-custom-agent.ts`',\n '',\n 'All necessary files are now available in your working directory.',\n '',\n '## Complete Agent Template Type Definitions',\n '',\n 'Here are the complete TypeScript type definitions for creating custom Codebuff agents:',\n '```typescript',\n agentTemplateContent,\n '```',\n '',\n '## Available Tools Type Definitions',\n '',\n 'Here are the complete TypeScript type definitions for all available tools:',\n '',\n '```typescript',\n toolDefinitionsContent,\n '```',\n '',\n '## Agent Template Patterns:',\n '',\n '1. **Base Agent Pattern**: Full-featured agents with comprehensive tool access',\n '2. **Specialized Agent Pattern**: Focused agents with limited tool sets',\n '3. **Thinking Agent Pattern**: Agents that spawn thinker sub-agents',\n '4. **Research Agent Pattern**: Agents that start with web search',\n '',\n '## Best Practices:',\n '',\n '1. **Use as few fields as possible**: Leave out fields that are not needed to reduce complexity',\n '2. **Minimal Tools**: Only include tools the agent actually needs',\n '3. **Clear and Concise Prompts**: Write clear, specific prompts that have no unnecessary words',\n '4. **Consistent Naming**: Follow naming conventions (kebab-case for IDs)',\n '5. **Appropriate Model**: Choose the right model for the task complexity. Default is claude-4-sonnet-20250522 for medium-high complexity tasks, and openai/gpt-5 for all other tasks.',\n '',\n '## Your Task:',\n 'When asked to create an agent template, you should:',\n \"1. Understand the requested agent's purpose and capabilities\",\n \"2. Choose appropriate tools for the agent's function\",\n '3. Write a comprehensive system prompt',\n `4. Create the complete agent template file in ${AGENT_TEMPLATES_DIR}`,\n '5. Ensure the template follows all conventions and best practices',\n '6. Use the AgentDefinition interface for the configuration',\n '7. Start the file with: import type { AgentDefinition } from \"./types/agent-definition.d.ts\"',\n '',\n 'Create agent templates that are focused, efficient, and well-documented. Always import the AgentDefinition type and export a default configuration object.',\n ].join('\\n'),\n instructionsPrompt: `You are helping to create or edit an agent template. The user will describe what kind of agent they want to create or how they want to modify an existing agent.\n\n## Environment Ready\n\nYour environment has been automatically set up with:\n- Type definitions in \\`.agents/types/\\`\n- Diff-reviewer examples in \\`.agents/examples/\\`\n- A starter custom agent template at \\`.agents/your-custom-agent.ts\\`\n\nYou can now proceed directly to agent creation or editing.\n\n## Example Agents Available\n\nThree diff-reviewer examples are available in \\`.agents/examples/\\`. These can serve as examples of well-made agents at different stages of complexity.\n\n**IMPORTANT**: Examine these examples to find connections and patterns that relate to the user's request. Look for:\n- Similar tool combinations\n- Comparable complexity levels\n- Related functionality patterns\n- Appropriate model choices\n- Relevant prompt structures\n\nUse these examples as inspiration and starting points, adapting their patterns to fit the user's specific needs.\n\n## Starter Template Available\n\nA starter custom agent file is available at \\`.agents/your-custom-agent.ts\\`. You can either modify this file directly or use it as a reference for creating a new agent.\n\n## For New Agents\n\nAnalyze their request and create a complete agent template that:\n- Has a clear purpose and appropriate capabilities\n- Leaves out fields that are not needed\n- Uses only the tools it needs\n- Follows naming conventions\n- Is properly structured\n- Draws inspiration from relevant example agents\n\n## For Creating New Agents\n\nThe agent builder is focused on creating new agent templates based on user specifications.\n\nIMPORTANT: Always end your response with the end_turn tool when you have completed the agent creation or editing task.`,\n stepPrompt: '',\n\n handleSteps: function* () {\n // Step 1: Create directory structure\n yield {\n toolName: 'run_terminal_command',\n args: {\n command: `mkdir -p ${TYPES_DIR} && mkdir -p ${EXAMPLES_DIR}`,\n process_type: 'SYNC',\n timeout_seconds: 10,\n },\n }\n\n // Step 2: Write the AGENT_DEFINITION_FILE with the template content\n yield {\n toolName: 'write_file',\n args: {\n path: TEMPLATE_TYPES_PATH,\n instructions: 'Create agent template type definitions file',\n content: agentTemplateContent,\n },\n }\n\n // Step 3: Write the tool definitions file (copy from existing tools.d.ts)\n yield {\n toolName: 'write_file',\n args: {\n path: TOOL_DEFINITIONS_PATH,\n instructions: 'Create tools type file',\n content: toolDefinitionsContent,\n },\n }\n\n // Step 4: Add message about reading example files and then read them\n yield {\n toolName: 'add_message',\n args: {\n role: 'assistant',\n content:\n \"I'll review the starter template and diff-reviewer examples, then help you create your agent.\",\n },\n }\n\n // Step 5: Copy example agent files to .agents/examples/\n for (const [filename, content] of Object.entries(exampleAgentContents)) {\n if (content) {\n yield {\n toolName: 'write_file',\n args: {\n path: `${EXAMPLES_DIR}/${filename}`,\n instructions: `Copy example agent file ${filename}`,\n content: content,\n },\n }\n }\n }\n\n // Step 6: Copy starter template directly to .agents/\n if (starterTemplateContent) {\n yield {\n toolName: 'write_file',\n args: {\n path: `${AGENT_TEMPLATES_DIR}/${STARTER_TEMPLATE_DEST_FILE}`,\n instructions: `Copy starter custom agent template ${STARTER_TEMPLATE_DEST_FILE}`,\n content: starterTemplateContent,\n },\n }\n }\n\n // Step 7: Complete agent creation process\n yield 'STEP_ALL'\n },\n }\n}\n" - }, - "agentId": "D-oY2QIts4E", - "parentAgentId": "main-agent", - "includeToolCall": true - }, - { - "type": "tool_result", - "toolCallId": "236eaf27-5781-488d-bcb0-48431ca62da1", - "toolName": "write_file", - "output": [ - { - "type": "json", - "value": { - "file": "backend/src/templates/agents/agent-builder.ts", - "message": "Updated file", - "unifiedDiff": "@@ -1,12 +1,8 @@\n import * as fs from 'fs'\n import * as path from 'path'\n \n-import {\n- AGENT_TEMPLATES_DIR,\n- openrouterModels,\n- AGENT_DEFINITION_FILE,\n-} from '@codebuff/common/constants'\n+import { AGENT_TEMPLATES_DIR, AGENT_DEFINITION_FILE } from '@codebuff/common/constants'\n import { AgentTemplateTypes } from '@codebuff/common/types/session-state'\n import z from 'zod/v4'\n \n import type { AgentTemplate } from '../types'\n@@ -19,9 +15,8 @@\n // Import to validate path exists at compile time\n import(TEMPLATE_RELATIVE_PATH)\n \n const TEMPLATE_PATH = path.join(__dirname, TEMPLATE_RELATIVE_PATH)\n-const DEFAULT_MODEL = openrouterModels.openrouter_claude_sonnet_4\n const TYPES_DIR = path.join(AGENT_TEMPLATES_DIR, 'types')\n const EXAMPLES_DIR = path.join(AGENT_TEMPLATES_DIR, 'examples')\n const TEMPLATE_TYPES_PATH = path.join(TYPES_DIR, AGENT_DEFINITION_FILE)\n const TOOL_DEFINITIONS_FILE = 'tools.d.ts'\n@@ -32,9 +27,9 @@\n const STARTER_TEMPLATE_DEST_FILE = 'your-custom-agent.ts'\n \n export const agentBuilder = (\n model: Model,\n- allAvailableAgents?: string[],\n+ _allAvailableAgents?: string[],\n ): Omit => {\n // Read the AGENT_CONFIG_FILE content dynamically\n // The import above ensures this path exists at compile time\n let agentTemplateContent = ''\n@@ -57,9 +52,9 @@\n console.warn(`Could not read tools.d.ts from common:`, error)\n toolDefinitionsContent = '// Tool definitions not available'\n }\n \n- // Read example agent files from common package\n+ // Read example agent files + starter template from common package\n const exampleAgentContents: Record = {}\n let starterTemplateContent = ''\n \n try {\n@@ -229,9 +224,9 @@\n \n IMPORTANT: Always end your response with the end_turn tool when you have completed the agent creation or editing task.`,\n stepPrompt: '',\n \n- handleSteps: function* ({ agentState, prompt, params }) {\n+ handleSteps: function* () {\n // Step 1: Create directory structure\n yield {\n toolName: 'run_terminal_command',\n args: {\n" - } - } - ], - "parentAgentId": "D-oY2QIts4E" - }, - { - "type": "tool_call", - "toolCallId": "f89a12af-70bc-4922-a9f3-ff7a854526cd", - "toolName": "str_replace", - "input": { - "path": "common/src/constants/agents.ts", - "replacements": [ - { - "old": " dry_run: {\n displayName: 'Sketch the Dry Runner',\n purpose: 'Agent that takes a plan and try to implement it in a dry run.',\n hidden: true,\n } as const,\n", - "new": "" - }, - { - "old": " agent_builder: {\n displayName: 'Bob the Agent Builder',\n purpose: 'Creates new agent templates for the codebuff mult-agent system',\n hidden: false,\n } as const,\n", - "new": " agent_builder: {\n displayName: 'Bob the Agent Builder',\n purpose: 'Creates new agent templates for the codebuff multi-agent system',\n hidden: false,\n } as const,\n" - } - ] - }, - "agentId": "D-oY2QIts4E", - "parentAgentId": "main-agent", - "includeToolCall": true - }, - { - "type": "tool_result", - "toolCallId": "f89a12af-70bc-4922-a9f3-ff7a854526cd", - "toolName": "str_replace", - "output": [ - { - "type": "json", - "value": { - "file": "common/src/constants/agents.ts", - "message": "Updated file", - "unifiedDiff": "@@ -64,21 +64,16 @@\n displayName: 'Peter Plan the Planner',\n purpose: 'Agent that formulates a comprehensive plan to a prompt.',\n hidden: true,\n } as const,\n- dry_run: {\n- displayName: 'Sketch the Dry Runner',\n- purpose: 'Agent that takes a plan and try to implement it in a dry run.',\n- hidden: true,\n- } as const,\n reviewer: {\n displayName: 'Nit Pick Nick the Reviewer',\n purpose:\n 'Reviews file changes and responds with critical feedback. Use this after making any significant change to the codebase.',\n } as const,\n agent_builder: {\n displayName: 'Bob the Agent Builder',\n- purpose: 'Creates new agent templates for the codebuff mult-agent system',\n+ purpose: 'Creates new agent templates for the codebuff multi-agent system',\n hidden: false,\n } as const,\n } as const satisfies Partial<\n Record<\n" - } - } - ], - "parentAgentId": "D-oY2QIts4E" - }, - { - "type": "tool_call", - "toolCallId": "65fada28-f7b9-49f3-baec-e21b68f486e1", - "toolName": "write_file", - "input": { - "path": ".agents/examples/diff-reviewer-1.ts", - "instructions": "Refresh diff-reviewer-1 example to use current Anthropic model.", - "content": "import type { AgentDefinition } from '../types/agent-definition'\n\nconst definition: AgentDefinition = {\n id: 'diff-reviewer-1',\n\n displayName: 'Diff Reviewer (Level 1)',\n model: 'anthropic/claude-4-sonnet-20250522',\n toolNames: ['read_files', 'run_terminal_command'],\n\n spawnPurposePrompt:\n 'Spawn when you need to review code changes in the git diff',\n\n instructionsPrompt: `Execute the following steps:\n1. Run git diff\n2. Read the files that have changed\n3. Review the changes and suggest improvements`,\n}\n\nexport default definition\n" - }, - "agentId": "D-oY2QIts4E", - "parentAgentId": "main-agent", - "includeToolCall": true - }, - { - "type": "tool_result", - "toolCallId": "65fada28-f7b9-49f3-baec-e21b68f486e1", - "toolName": "write_file", - "output": [ - { - "type": "json", - "value": { - "file": ".agents/examples/diff-reviewer-1.ts", - "message": "Updated file", - "unifiedDiff": "@@ -3,9 +3,9 @@\n const definition: AgentDefinition = {\n id: 'diff-reviewer-1',\n \n displayName: 'Diff Reviewer (Level 1)',\n- model: 'openai/gpt-5',\n+ model: 'anthropic/claude-4-sonnet-20250522',\n toolNames: ['read_files', 'run_terminal_command'],\n \n spawnPurposePrompt:\n 'Spawn when you need to review code changes in the git diff',\n" - } - } - ], - "parentAgentId": "D-oY2QIts4E" - }, - { - "type": "tool_call", - "toolCallId": "c0b7155d-f1c0-4c3e-a53d-7bcb681e9c03", - "toolName": "write_file", - "input": { - "path": ".agents/examples/diff-reviewer-2.ts", - "instructions": "Refresh diff-reviewer-2 example to use current Anthropic model.", - "content": "import type {\n AgentDefinition,\n AgentStepContext,\n} from '../types/agent-definition'\n\nconst definition: AgentDefinition = {\n id: 'diff-reviewer-2',\n displayName: 'Diff Reviewer (Level 2)',\n model: 'anthropic/claude-4-sonnet-20250522',\n\n inputSchema: {\n prompt: {\n type: 'string',\n description:\n 'Please provide a short description of the changes you want to review',\n },\n },\n toolNames: ['read_files', 'run_terminal_command'],\n\n spawnPurposePrompt:\n 'Spawn when you need to review code changes in the git diff',\n\n systemPrompt:\n 'You are an expert software developer. Your job is to review code changes and provide helpful feedback.',\n\n instructionsPrompt: `Execute the following steps:\n1. Run git diff\n2. Read the files that have changed\n3. Review the changes and suggest improvements\n\nUse the following guidelines while reviewing the changes:\n- Find ways to simplify the code\n- Reuse existing code as much as possible instead of writing new code\n- Preserve as much behavior as possible in the existing code\n- Prefer changing as few lines of code as possible\n- Look for opportunities to improve the code's readability\n- Look for logical errors in the code\n- Look for missed cases in the code\n- Look for any other bugs`,\n\n handleSteps: function* ({ prompt }: AgentStepContext) {\n // Step 1: Run git diff immediately. Saves the agent a step, lowering cost and latency!\n yield {\n toolName: 'run_terminal_command',\n args: {\n command: 'git diff',\n },\n }\n\n // Step 2: Let AI run the rest of the steps!\n yield 'STEP_ALL'\n },\n}\n\nexport default definition\n" - }, - "agentId": "D-oY2QIts4E", - "parentAgentId": "main-agent", - "includeToolCall": true - }, - { - "type": "tool_result", - "toolCallId": "c0b7155d-f1c0-4c3e-a53d-7bcb681e9c03", - "toolName": "write_file", - "output": [ - { - "type": "json", - "value": { - "file": ".agents/examples/diff-reviewer-2.ts", - "message": "Updated file", - "unifiedDiff": "@@ -5,9 +5,9 @@\n \n const definition: AgentDefinition = {\n id: 'diff-reviewer-2',\n displayName: 'Diff Reviewer (Level 2)',\n- model: 'openai/gpt-5',\n+ model: 'anthropic/claude-4-sonnet-20250522',\n \n inputSchema: {\n prompt: {\n type: 'string',\n@@ -37,9 +37,9 @@\n - Look for logical errors in the code\n - Look for missed cases in the code\n - Look for any other bugs`,\n \n- handleSteps: function* ({ agentState, prompt, params }: AgentStepContext) {\n+ handleSteps: function* ({ prompt }: AgentStepContext) {\n // Step 1: Run git diff immediately. Saves the agent a step, lowering cost and latency!\n yield {\n toolName: 'run_terminal_command',\n args: {\n" - } - } - ], - "parentAgentId": "D-oY2QIts4E" - }, - { - "type": "tool_call", - "toolCallId": "1f7ddb30-5253-40c0-8c05-71c3c54a8a93", - "toolName": "write_file", - "input": { - "path": ".agents/examples/diff-reviewer-3.ts", - "instructions": "Refresh diff-reviewer-3 example to use current Anthropic model, correct file-explorer spawn target, and streamline final step behavior.", - "content": "import type {\n AgentDefinition,\n AgentStepContext,\n} from '../types/agent-definition'\n\nconst definition: AgentDefinition = {\n id: 'diff-reviewer-3',\n\n displayName: 'Diff Reviewer (Level 3)',\n model: 'anthropic/claude-4-sonnet-20250522',\n inputSchema: {\n prompt: {\n type: 'string',\n description:\n 'Please provide a short description of the changes you want to review',\n },\n },\n outputMode: 'last_message',\n\n toolNames: ['read_files', 'run_terminal_command', 'spawn_agents'],\n spawnableAgents: ['file-explorer'],\n\n spawnPurposePrompt:\n 'Spawn when you need to review code changes in the git diff',\n\n systemPrompt:\n 'You are an expert software developer. Your job is to review code changes and provide helpful feedback.',\n\n instructionsPrompt: `Review the changes and suggest improvements.\n\nUse the following guidelines while reviewing the changes:\n- Find ways to simplify the code\n- Reuse existing code as much as possible instead of writing new code\n- Preserve as much behavior as possible in the existing code\n- Prefer changing as few lines of code as possible\n- Look for opportunities to improve the code's readability\n- Look for logical errors in the code\n- Look for missed cases in the code\n- Look for any other bugs`,\n\n handleSteps: function* ({ prompt }: AgentStepContext) {\n // Step 1: Get list of changed files from git diff --name-only\n const { toolResult: gitDiffFilesResult } = yield {\n toolName: 'run_terminal_command',\n args: {\n command: 'git diff --name-only',\n },\n }\n\n const changedFiles = (gitDiffFilesResult || '')\n .split('\\n')\n .map((line) => line.trim())\n .filter((line) => line && !line.startsWith('??') && !line.includes('OSC'))\n\n // Step 2: Read changed files\n if (changedFiles.length > 0) {\n yield {\n toolName: 'read_files',\n args: {\n paths: changedFiles,\n },\n }\n }\n\n // Step 3: Run full git diff to see the actual changes\n yield {\n toolName: 'run_terminal_command',\n args: {\n command: 'git diff',\n },\n }\n\n // Step 4: Spawn file explorer for broader context if needed\n yield {\n toolName: 'spawn_agents',\n args: {\n agents: [\n {\n agent_type: 'file-explorer',\n prompt: `Find any additional codebase context needed to review these changes. Review focus: ${prompt || ''}`,\n params: {\n prompts: [\n 'Any modules/classes/functions referenced by the diff',\n 'Relevant tests or test helpers for the changed code',\n 'Related config or shared utilities that might be impacted',\n ],\n },\n },\n ],\n },\n }\n\n // Step 5: Let the AI produce the final review in a single final step\n yield 'STEP_ALL'\n },\n}\n\nexport default definition\n" - }, - "agentId": "D-oY2QIts4E", - "parentAgentId": "main-agent", - "includeToolCall": true - }, - { - "type": "tool_result", - "toolCallId": "1f7ddb30-5253-40c0-8c05-71c3c54a8a93", - "toolName": "write_file", - "output": [ - { - "type": "json", - "value": { - "file": ".agents/examples/diff-reviewer-3.ts", - "message": "Updated file", - "unifiedDiff": "@@ -6,9 +6,9 @@\n const definition: AgentDefinition = {\n id: 'diff-reviewer-3',\n \n displayName: 'Diff Reviewer (Level 3)',\n- model: 'openai/gpt-5',\n+ model: 'anthropic/claude-4-sonnet-20250522',\n inputSchema: {\n prompt: {\n type: 'string',\n description:\n@@ -17,9 +17,9 @@\n },\n outputMode: 'last_message',\n \n toolNames: ['read_files', 'run_terminal_command', 'spawn_agents'],\n- spawnableAgents: ['james/file-explorer@0.1.3'],\n+ spawnableAgents: ['file-explorer'],\n \n spawnPurposePrompt:\n 'Spawn when you need to review code changes in the git diff',\n \n@@ -37,24 +37,23 @@\n - Look for logical errors in the code\n - Look for missed cases in the code\n - Look for any other bugs`,\n \n- handleSteps: function* ({ agentState, prompt, params }: AgentStepContext) {\n+ handleSteps: function* ({ prompt }: AgentStepContext) {\n // Step 1: Get list of changed files from git diff --name-only\n const { toolResult: gitDiffFilesResult } = yield {\n toolName: 'run_terminal_command',\n args: {\n command: 'git diff --name-only',\n },\n }\n \n- // Then, extract file paths from the result\n const changedFiles = (gitDiffFilesResult || '')\n .split('\\n')\n .map((line) => line.trim())\n .filter((line) => line && !line.startsWith('??') && !line.includes('OSC'))\n \n- // Step 2: Read the files\n+ // Step 2: Read changed files\n if (changedFiles.length > 0) {\n yield {\n toolName: 'read_files',\n args: {\n@@ -70,31 +69,30 @@\n command: 'git diff',\n },\n }\n \n- // Step 4: Put words in the AI's mouth to get it to spawn the file explorer.\n+ // Step 4: Spawn file explorer for broader context if needed\n yield {\n- toolName: 'add_message',\n+ toolName: 'spawn_agents',\n args: {\n- role: 'assistant',\n- content:\n- 'Now I will spawn a file explorer to find any missing codebase context.',\n+ agents: [\n+ {\n+ agent_type: 'file-explorer',\n+ prompt: `Find any additional codebase context needed to review these changes. Review focus: ${prompt || ''}`,\n+ params: {\n+ prompts: [\n+ 'Any modules/classes/functions referenced by the diff',\n+ 'Relevant tests or test helpers for the changed code',\n+ 'Related config or shared utilities that might be impacted',\n+ ],\n+ },\n+ },\n+ ],\n },\n }\n \n- yield 'STEP'\n-\n- // Step 5: Put words in the AI's mouth to review the changes.\n- yield {\n- toolName: 'add_message',\n- args: {\n- role: 'assistant',\n- content: 'Here is my comprehensive review of the changes.',\n- },\n- }\n-\n- // Step 6: Let AI review the changes in a final step. (The last message is also the agent's output.)\n- yield 'STEP'\n+ // Step 5: Let the AI produce the final review in a single final step\n+ yield 'STEP_ALL'\n },\n }\n \n export default definition\n" - } - } - ], - "parentAgentId": "D-oY2QIts4E" - }, - { - "type": "tool_call", - "toolCallId": "35900739-e50e-4d7a-bd04-a1b14358fc80", - "toolName": "write_file", - "input": { - "path": "common/src/util/examples/diff-reviewer-1.ts", - "instructions": "Refresh common diff-reviewer-1 example to use current Anthropic model.", - "content": "import type { AgentDefinition } from '../types/agent-definition'\n\nconst definition: AgentDefinition = {\n id: 'diff-reviewer-1',\n\n displayName: 'Diff Reviewer (Level 1)',\n model: 'anthropic/claude-4-sonnet-20250522',\n toolNames: ['read_files', 'run_terminal_command'],\n\n spawnPurposePrompt:\n 'Spawn when you need to review code changes in the git diff',\n\n instructionsPrompt: `Execute the following steps:\n1. Run git diff\n2. Read the files that have changed\n3. Review the changes and suggest improvements`,\n}\n\nexport default definition\n" - }, - "agentId": "D-oY2QIts4E", - "parentAgentId": "main-agent", - "includeToolCall": true - }, - { - "type": "tool_result", - "toolCallId": "35900739-e50e-4d7a-bd04-a1b14358fc80", - "toolName": "write_file", - "output": [ - { - "type": "json", - "value": { - "file": "common/src/util/examples/diff-reviewer-1.ts", - "message": "Updated file", - "unifiedDiff": "@@ -3,9 +3,9 @@\n const definition: AgentDefinition = {\n id: 'diff-reviewer-1',\n \n displayName: 'Diff Reviewer (Level 1)',\n- model: 'openai/gpt-5',\n+ model: 'anthropic/claude-4-sonnet-20250522',\n toolNames: ['read_files', 'run_terminal_command'],\n \n spawnPurposePrompt:\n 'Spawn when you need to review code changes in the git diff',\n" - } - } - ], - "parentAgentId": "D-oY2QIts4E" - }, - { - "type": "tool_call", - "toolCallId": "f92ff527-8c2f-44f4-9c51-c80823a0eccd", - "toolName": "write_file", - "input": { - "path": "common/src/util/examples/diff-reviewer-2.ts", - "instructions": "Refresh common diff-reviewer-2 example to use current Anthropic model.", - "content": "import type {\n AgentDefinition,\n AgentStepContext,\n} from '../types/agent-definition'\n\nconst definition: AgentDefinition = {\n id: 'diff-reviewer-2',\n displayName: 'Diff Reviewer (Level 2)',\n model: 'anthropic/claude-4-sonnet-20250522',\n\n inputSchema: {\n prompt: {\n type: 'string',\n description:\n 'Please provide a short description of the changes you want to review',\n },\n },\n toolNames: ['read_files', 'run_terminal_command'],\n\n spawnPurposePrompt:\n 'Spawn when you need to review code changes in the git diff',\n\n systemPrompt:\n 'You are an expert software developer. Your job is to review code changes and provide helpful feedback.',\n\n instructionsPrompt: `Execute the following steps:\n1. Run git diff\n2. Read the files that have changed\n3. Review the changes and suggest improvements\n\nUse the following guidelines while reviewing the changes:\n- Find ways to simplify the code\n- Reuse existing code as much as possible instead of writing new code\n- Preserve as much behavior as possible in the existing code\n- Prefer changing as few lines of code as possible\n- Look for opportunities to improve the code's readability\n- Look for logical errors in the code\n- Look for missed cases in the code\n- Look for any other bugs`,\n\n handleSteps: function* ({ prompt }: AgentStepContext) {\n // Step 1: Run git diff immediately. Saves the agent a step, lowering cost and latency!\n yield {\n toolName: 'run_terminal_command',\n args: {\n command: 'git diff',\n },\n }\n\n // Step 2: Let AI run the rest of the steps!\n yield 'STEP_ALL'\n },\n}\n\nexport default definition\n" - }, - "agentId": "D-oY2QIts4E", - "parentAgentId": "main-agent", - "includeToolCall": true - }, - { - "type": "tool_result", - "toolCallId": "f92ff527-8c2f-44f4-9c51-c80823a0eccd", - "toolName": "write_file", - "output": [ - { - "type": "json", - "value": { - "file": "common/src/util/examples/diff-reviewer-2.ts", - "message": "Updated file", - "unifiedDiff": "@@ -5,9 +5,9 @@\n \n const definition: AgentDefinition = {\n id: 'diff-reviewer-2',\n displayName: 'Diff Reviewer (Level 2)',\n- model: 'openai/gpt-5',\n+ model: 'anthropic/claude-4-sonnet-20250522',\n \n inputSchema: {\n prompt: {\n type: 'string',\n@@ -37,9 +37,9 @@\n - Look for logical errors in the code\n - Look for missed cases in the code\n - Look for any other bugs`,\n \n- handleSteps: function* ({ agentState, prompt, params }: AgentStepContext) {\n+ handleSteps: function* ({ prompt }: AgentStepContext) {\n // Step 1: Run git diff immediately. Saves the agent a step, lowering cost and latency!\n yield {\n toolName: 'run_terminal_command',\n args: {\n" - } - } - ], - "parentAgentId": "D-oY2QIts4E" - }, - { - "type": "tool_call", - "toolCallId": "35d48f21-73b4-4629-bfde-eab0b9251e99", - "toolName": "write_file", - "input": { - "path": "common/src/util/examples/diff-reviewer-3.ts", - "instructions": "Refresh common diff-reviewer-3 example to use current Anthropic model, correct file-explorer spawn target, and streamline final step behavior.", - "content": "import type {\n AgentDefinition,\n AgentStepContext,\n} from '../types/agent-definition'\n\nconst definition: AgentDefinition = {\n id: 'diff-reviewer-3',\n\n displayName: 'Diff Reviewer (Level 3)',\n model: 'anthropic/claude-4-sonnet-20250522',\n inputSchema: {\n prompt: {\n type: 'string',\n description:\n 'Please provide a short description of the changes you want to review',\n },\n },\n outputMode: 'last_message',\n\n toolNames: ['read_files', 'run_terminal_command', 'spawn_agents'],\n spawnableAgents: ['file-explorer'],\n\n spawnPurposePrompt:\n 'Spawn when you need to review code changes in the git diff',\n\n systemPrompt:\n 'You are an expert software developer. Your job is to review code changes and provide helpful feedback.',\n\n instructionsPrompt: `Review the changes and suggest improvements.\n\nUse the following guidelines while reviewing the changes:\n- Find ways to simplify the code\n- Reuse existing code as much as possible instead of writing new code\n- Preserve as much behavior as possible in the existing code\n- Prefer changing as few lines of code as possible\n- Look for opportunities to improve the code's readability\n- Look for logical errors in the code\n- Look for missed cases in the code\n- Look for any other bugs`,\n\n handleSteps: function* ({ prompt }: AgentStepContext) {\n // Step 1: Get list of changed files from git diff --name-only\n const { toolResult: gitDiffFilesResult } = yield {\n toolName: 'run_terminal_command',\n args: {\n command: 'git diff --name-only',\n },\n }\n\n const changedFiles = (gitDiffFilesResult || '')\n .split('\\n')\n .map((line) => line.trim())\n .filter((line) => line && !line.startsWith('??') && !line.includes('OSC'))\n\n // Step 2: Read changed files\n if (changedFiles.length > 0) {\n yield {\n toolName: 'read_files',\n args: {\n paths: changedFiles,\n },\n }\n }\n\n // Step 3: Run full git diff to see the actual changes\n yield {\n toolName: 'run_terminal_command',\n args: {\n command: 'git diff',\n },\n }\n\n // Step 4: Spawn file explorer for broader context if needed\n yield {\n toolName: 'spawn_agents',\n args: {\n agents: [\n {\n agent_type: 'file-explorer',\n prompt: `Find any additional codebase context needed to review these changes. Review focus: ${prompt || ''}`,\n params: {\n prompts: [\n 'Any modules/classes/functions referenced by the diff',\n 'Relevant tests or test helpers for the changed code',\n 'Related config or shared utilities that might be impacted',\n ],\n },\n },\n ],\n },\n }\n\n // Step 5: Let the AI produce the final review in a single final step\n yield 'STEP_ALL'\n },\n}\n\nexport default definition\n" - }, - "agentId": "D-oY2QIts4E", - "parentAgentId": "main-agent", - "includeToolCall": true - }, - { - "type": "tool_result", - "toolCallId": "35d48f21-73b4-4629-bfde-eab0b9251e99", - "toolName": "write_file", - "output": [ - { - "type": "json", - "value": { - "file": "common/src/util/examples/diff-reviewer-3.ts", - "message": "Updated file", - "unifiedDiff": "@@ -6,9 +6,9 @@\n const definition: AgentDefinition = {\n id: 'diff-reviewer-3',\n \n displayName: 'Diff Reviewer (Level 3)',\n- model: 'openai/gpt-5',\n+ model: 'anthropic/claude-4-sonnet-20250522',\n inputSchema: {\n prompt: {\n type: 'string',\n description:\n@@ -17,9 +17,9 @@\n },\n outputMode: 'last_message',\n \n toolNames: ['read_files', 'run_terminal_command', 'spawn_agents'],\n- spawnableAgents: ['james/file-explorer@0.1.3'],\n+ spawnableAgents: ['file-explorer'],\n \n spawnPurposePrompt:\n 'Spawn when you need to review code changes in the git diff',\n \n@@ -37,24 +37,23 @@\n - Look for logical errors in the code\n - Look for missed cases in the code\n - Look for any other bugs`,\n \n- handleSteps: function* ({ agentState, prompt, params }: AgentStepContext) {\n+ handleSteps: function* ({ prompt }: AgentStepContext) {\n // Step 1: Get list of changed files from git diff --name-only\n const { toolResult: gitDiffFilesResult } = yield {\n toolName: 'run_terminal_command',\n args: {\n command: 'git diff --name-only',\n },\n }\n \n- // Then, extract file paths from the result\n const changedFiles = (gitDiffFilesResult || '')\n .split('\\n')\n .map((line) => line.trim())\n .filter((line) => line && !line.startsWith('??') && !line.includes('OSC'))\n \n- // Step 2: Read the files\n+ // Step 2: Read changed files\n if (changedFiles.length > 0) {\n yield {\n toolName: 'read_files',\n args: {\n@@ -70,31 +69,30 @@\n command: 'git diff',\n },\n }\n \n- // Step 4: Put words in the AI's mouth to get it to spawn the file explorer.\n+ // Step 4: Spawn file explorer for broader context if needed\n yield {\n- toolName: 'add_message',\n+ toolName: 'spawn_agents',\n args: {\n- role: 'assistant',\n- content:\n- 'Now I will spawn a file explorer to find any missing codebase context.',\n+ agents: [\n+ {\n+ agent_type: 'file-explorer',\n+ prompt: `Find any additional codebase context needed to review these changes. Review focus: ${prompt || ''}`,\n+ params: {\n+ prompts: [\n+ 'Any modules/classes/functions referenced by the diff',\n+ 'Relevant tests or test helpers for the changed code',\n+ 'Related config or shared utilities that might be impacted',\n+ ],\n+ },\n+ },\n+ ],\n },\n }\n \n- yield 'STEP'\n-\n- // Step 5: Put words in the AI's mouth to review the changes.\n- yield {\n- toolName: 'add_message',\n- args: {\n- role: 'assistant',\n- content: 'Here is my comprehensive review of the changes.',\n- },\n- }\n-\n- // Step 6: Let AI review the changes in a final step. (The last message is also the agent's output.)\n- yield 'STEP'\n+ // Step 5: Let the AI produce the final review in a single final step\n+ yield 'STEP_ALL'\n },\n }\n \n export default definition\n" - } - } - ], - "parentAgentId": "D-oY2QIts4E" - }, - { - "type": "tool_call", - "toolCallId": "e9652d7f-e25d-4335-a72e-469560bbdadd", - "toolName": "write_file", - "input": { - "path": ".agents/your-custom-agent.ts", - "instructions": "Add a new starter custom agent (Git Committer scaffold) in the top-level .agents directory, ready to run and publish.", - "content": "import { publisher, version } from './constants'\n\nimport type {\n AgentDefinition,\n AgentStepContext,\n} from './types/agent-definition'\n\nconst definition: AgentDefinition = {\n id: 'your-custom-agent',\n version,\n publisher,\n\n displayName: 'Your Custom Agent (Git Committer)',\n model: 'anthropic/claude-4-sonnet-20250522',\n toolNames: ['read_files', 'run_terminal_command', 'add_message', 'end_turn'],\n\n inputSchema: {\n prompt: {\n type: 'string',\n description: 'What changes to commit',\n },\n },\n\n includeMessageHistory: false,\n outputMode: 'last_message',\n\n spawnPurposePrompt:\n 'Spawn when you need to commit code changes to git with an appropriate commit message',\n\n systemPrompt:\n 'You are an expert software developer. Your job is to create a git commit with a really good commit message.',\n\n instructionsPrompt:\n 'Follow the steps to create a good commit: analyze changes with git diff and git log, read relevant files for context, stage appropriate files, and create a commit with proper formatting including the Codebuff footer.',\n\n handleSteps: function* ({ prompt }: AgentStepContext) {\n // Step 1: Analyze the changes\n yield {\n toolName: 'run_terminal_command',\n args: {\n command: 'git diff',\n process_type: 'SYNC',\n timeout_seconds: 30,\n },\n }\n\n yield {\n toolName: 'run_terminal_command',\n args: {\n command: 'git log --oneline -10',\n process_type: 'SYNC',\n timeout_seconds: 30,\n },\n }\n\n // Step 2: Let the AI decide what to read + what to stage based on the user's intent\n yield {\n toolName: 'add_message',\n args: {\n role: 'assistant',\n content: `Goal: ${prompt}\\n\\nI'll read any relevant files and stage the right changes next.`,\n },\n }\n\n yield 'STEP'\n\n // Step 3: Let the AI create the commit with proper formatting\n yield {\n toolName: 'add_message',\n args: {\n role: 'assistant',\n content:\n \"Now I'll create the commit with a high-quality message and the proper Codebuff footer format.\",\n },\n }\n\n yield 'STEP_ALL'\n },\n}\n\nexport default definition\n" - }, - "agentId": "D-oY2QIts4E", - "parentAgentId": "main-agent", - "includeToolCall": true - }, - { - "type": "tool_result", - "toolCallId": "e9652d7f-e25d-4335-a72e-469560bbdadd", - "toolName": "write_file", - "output": [ - { - "type": "json", - "value": { - "file": ".agents/your-custom-agent.ts", - "message": "Created new file", - "unifiedDiff": "import { publisher, version } from './constants'\n\nimport type {\n AgentDefinition,\n AgentStepContext,\n} from './types/agent-definition'\n\nconst definition: AgentDefinition = {\n id: 'your-custom-agent',\n version,\n publisher,\n\n displayName: 'Your Custom Agent (Git Committer)',\n model: 'anthropic/claude-4-sonnet-20250522',\n toolNames: ['read_files', 'run_terminal_command', 'add_message', 'end_turn'],\n\n inputSchema: {\n prompt: {\n type: 'string',\n description: 'What changes to commit',\n },\n },\n\n includeMessageHistory: false,\n outputMode: 'last_message',\n\n spawnPurposePrompt:\n 'Spawn when you need to commit code changes to git with an appropriate commit message',\n\n systemPrompt:\n 'You are an expert software developer. Your job is to create a git commit with a really good commit message.',\n\n instructionsPrompt:\n 'Follow the steps to create a good commit: analyze changes with git diff and git log, read relevant files for context, stage appropriate files, and create a commit with proper formatting including the Codebuff footer.',\n\n handleSteps: function* ({ prompt }: AgentStepContext) {\n // Step 1: Analyze the changes\n yield {\n toolName: 'run_terminal_command',\n args: {\n command: 'git diff',\n process_type: 'SYNC',\n timeout_seconds: 30,\n },\n }\n\n yield {\n toolName: 'run_terminal_command',\n args: {\n command: 'git log --oneline -10',\n process_type: 'SYNC',\n timeout_seconds: 30,\n },\n }\n\n // Step 2: Let the AI decide what to read + what to stage based on the user's intent\n yield {\n toolName: 'add_message',\n args: {\n role: 'assistant',\n content: `Goal: ${prompt}\\n\\nI'll read any relevant files and stage the right changes next.`,\n },\n }\n\n yield 'STEP'\n\n // Step 3: Let the AI create the commit with proper formatting\n yield {\n toolName: 'add_message',\n args: {\n role: 'assistant',\n content:\n \"Now I'll create the commit with a high-quality message and the proper Codebuff footer format.\",\n },\n }\n\n yield 'STEP_ALL'\n },\n}\n\nexport default definition\n" - } - } - ], - "parentAgentId": "D-oY2QIts4E" - }, - { - "type": "tool_call", - "toolCallId": "322d55c0-598c-4165-97c8-e9caa5ebb457", - "toolName": "write_file", - "input": { - "path": "common/src/util/examples/your-custom-agent.ts.txt", - "instructions": "Add starter custom agent template content for the agent builder to copy into .agents/your-custom-agent.ts.", - "content": "import { publisher, version } from './constants'\n\nimport type {\n AgentDefinition,\n AgentStepContext,\n} from './types/agent-definition'\n\nconst definition: AgentDefinition = {\n id: 'your-custom-agent',\n version,\n publisher,\n\n displayName: 'Your Custom Agent (Git Committer)',\n model: 'anthropic/claude-4-sonnet-20250522',\n toolNames: ['read_files', 'run_terminal_command', 'add_message', 'end_turn'],\n\n inputSchema: {\n prompt: {\n type: 'string',\n description: 'What changes to commit',\n },\n },\n\n includeMessageHistory: false,\n outputMode: 'last_message',\n\n spawnPurposePrompt:\n 'Spawn when you need to commit code changes to git with an appropriate commit message',\n\n systemPrompt:\n 'You are an expert software developer. Your job is to create a git commit with a really good commit message.',\n\n instructionsPrompt:\n 'Follow the steps to create a good commit: analyze changes with git diff and git log, read relevant files for context, stage appropriate files, and create a commit with proper formatting including the Codebuff footer.',\n\n handleSteps: function* ({ prompt }: AgentStepContext) {\n // Step 1: Analyze the changes\n yield {\n toolName: 'run_terminal_command',\n args: {\n command: 'git diff',\n process_type: 'SYNC',\n timeout_seconds: 30,\n },\n }\n\n yield {\n toolName: 'run_terminal_command',\n args: {\n command: 'git log --oneline -10',\n process_type: 'SYNC',\n timeout_seconds: 30,\n },\n }\n\n // Step 2: Let the AI decide what to read + what to stage based on the user's intent\n yield {\n toolName: 'add_message',\n args: {\n role: 'assistant',\n content: `Goal: ${prompt}\\n\\nI'll read any relevant files and stage the right changes next.`,\n },\n }\n\n yield 'STEP'\n\n // Step 3: Let the AI create the commit with proper formatting\n yield {\n toolName: 'add_message',\n args: {\n role: 'assistant',\n content:\n \"Now I'll create the commit with a high-quality message and the proper Codebuff footer format.\",\n },\n }\n\n yield 'STEP_ALL'\n },\n}\n\nexport default definition\n" - }, - "agentId": "D-oY2QIts4E", - "parentAgentId": "main-agent", - "includeToolCall": true - }, - { - "type": "tool_result", - "toolCallId": "322d55c0-598c-4165-97c8-e9caa5ebb457", - "toolName": "write_file", - "output": [ - { - "type": "json", - "value": { - "file": "common/src/util/examples/your-custom-agent.ts.txt", - "message": "Created new file", - "unifiedDiff": "import { publisher, version } from './constants'\n\nimport type {\n AgentDefinition,\n AgentStepContext,\n} from './types/agent-definition'\n\nconst definition: AgentDefinition = {\n id: 'your-custom-agent',\n version,\n publisher,\n\n displayName: 'Your Custom Agent (Git Committer)',\n model: 'anthropic/claude-4-sonnet-20250522',\n toolNames: ['read_files', 'run_terminal_command', 'add_message', 'end_turn'],\n\n inputSchema: {\n prompt: {\n type: 'string',\n description: 'What changes to commit',\n },\n },\n\n includeMessageHistory: false,\n outputMode: 'last_message',\n\n spawnPurposePrompt:\n 'Spawn when you need to commit code changes to git with an appropriate commit message',\n\n systemPrompt:\n 'You are an expert software developer. Your job is to create a git commit with a really good commit message.',\n\n instructionsPrompt:\n 'Follow the steps to create a good commit: analyze changes with git diff and git log, read relevant files for context, stage appropriate files, and create a commit with proper formatting including the Codebuff footer.',\n\n handleSteps: function* ({ prompt }: AgentStepContext) {\n // Step 1: Analyze the changes\n yield {\n toolName: 'run_terminal_command',\n args: {\n command: 'git diff',\n process_type: 'SYNC',\n timeout_seconds: 30,\n },\n }\n\n yield {\n toolName: 'run_terminal_command',\n args: {\n command: 'git log --oneline -10',\n process_type: 'SYNC',\n timeout_seconds: 30,\n },\n }\n\n // Step 2: Let the AI decide what to read + what to stage based on the user's intent\n yield {\n toolName: 'add_message',\n args: {\n role: 'assistant',\n content: `Goal: ${prompt}\\n\\nI'll read any relevant files and stage the right changes next.`,\n },\n }\n\n yield 'STEP'\n\n // Step 3: Let the AI create the commit with proper formatting\n yield {\n toolName: 'add_message',\n args: {\n role: 'assistant',\n content:\n \"Now I'll create the commit with a high-quality message and the proper Codebuff footer format.\",\n },\n }\n\n yield 'STEP_ALL'\n },\n}\n\nexport default definition\n" - } - } - ], - "parentAgentId": "D-oY2QIts4E" - }, - { - "type": "tool_call", - "toolCallId": "9cacab6f-eccb-4681-98bd-9855db807bb5", - "toolName": "set_output", - "input": { - "output": { - "message": "\n{\n \"cb_tool_name\": \"write_file\",\n \"path\": \"backend/src/templates/agents/agent-builder.ts\",\n \"instructions\": \"Update agent builder to gather diff-reviewer examples plus a new starter template, keep examples under .agents/examples, copy starter into .agents root, and stop advertising spawnable agents.\",\n \"content\": \"import * as fs from 'fs'\\nimport * as path from 'path'\\n\\nimport { AGENT_TEMPLATES_DIR, AGENT_DEFINITION_FILE } from '@codebuff/common/constants'\\nimport { AgentTemplateTypes } from '@codebuff/common/types/session-state'\\nimport z from 'zod/v4'\\n\\nimport type { AgentTemplate } from '../types'\\nimport type { Model } from '@codebuff/common/constants'\\nimport type { ToolName } from '@codebuff/common/tools/constants'\\n\\nconst COMMON_UTIL_PATH = '../../../../common/src/util'\\nconst TEMPLATE_RELATIVE_PATH =\\n `${COMMON_UTIL_PATH}/types/${AGENT_DEFINITION_FILE}` as const\\n// Import to validate path exists at compile time\\nimport(TEMPLATE_RELATIVE_PATH)\\n\\nconst TEMPLATE_PATH = path.join(__dirname, TEMPLATE_RELATIVE_PATH)\\nconst TYPES_DIR = path.join(AGENT_TEMPLATES_DIR, 'types')\\nconst EXAMPLES_DIR = path.join(AGENT_TEMPLATES_DIR, 'examples')\\nconst TEMPLATE_TYPES_PATH = path.join(TYPES_DIR, AGENT_DEFINITION_FILE)\\nconst TOOL_DEFINITIONS_FILE = 'tools.d.ts'\\nconst TOOL_DEFINITIONS_PATH = path.join(TYPES_DIR, TOOL_DEFINITIONS_FILE)\\n\\nconst EXAMPLES_SOURCE_DIR = path.join(__dirname, `${COMMON_UTIL_PATH}/examples`)\\nconst STARTER_TEMPLATE_SOURCE_FILE = 'your-custom-agent.ts.txt'\\nconst STARTER_TEMPLATE_DEST_FILE = 'your-custom-agent.ts'\\n\\nexport const agentBuilder = (\\n model: Model,\\n _allAvailableAgents?: string[],\\n): Omit => {\\n // Read the AGENT_CONFIG_FILE content dynamically\\n // The import above ensures this path exists at compile time\\n let agentTemplateContent = ''\\n try {\\n agentTemplateContent = fs.readFileSync(TEMPLATE_PATH, 'utf8')\\n } catch (error) {\\n console.warn(`Could not read ${AGENT_DEFINITION_FILE}:`, error)\\n agentTemplateContent = '// Agent template types not available'\\n }\\n\\n // Read the tools.d.ts content from common package\\n let toolDefinitionsContent = ''\\n try {\\n const toolsPath = path.join(\\n __dirname,\\n `${COMMON_UTIL_PATH}/types/tools.d.ts`,\\n )\\n toolDefinitionsContent = fs.readFileSync(toolsPath, 'utf8')\\n } catch (error) {\\n console.warn(`Could not read tools.d.ts from common:`, error)\\n toolDefinitionsContent = '// Tool definitions not available'\\n }\\n\\n // Read example agent files + starter template from common package\\n const exampleAgentContents: Record = {}\\n let starterTemplateContent = ''\\n\\n try {\\n if (fs.existsSync(EXAMPLES_SOURCE_DIR)) {\\n const files = fs.readdirSync(EXAMPLES_SOURCE_DIR)\\n\\n files\\n .filter(\\n (file) => file.endsWith('.ts') && file.startsWith('diff-reviewer-'),\\n )\\n .forEach((filename) => {\\n const fullPath = path.join(EXAMPLES_SOURCE_DIR, filename)\\n const content = fs.readFileSync(fullPath, 'utf8')\\n exampleAgentContents[filename] = content\\n })\\n\\n const starterTemplatePath = path.join(\\n EXAMPLES_SOURCE_DIR,\\n STARTER_TEMPLATE_SOURCE_FILE,\\n )\\n if (fs.existsSync(starterTemplatePath)) {\\n starterTemplateContent = fs.readFileSync(starterTemplatePath, 'utf8')\\n }\\n } else {\\n console.warn(\\n `Example agents directory does not exist: ${EXAMPLES_SOURCE_DIR}`,\\n )\\n }\\n } catch (error) {\\n console.warn('Could not read example agents:', error)\\n }\\n\\n return {\\n model,\\n displayName: 'Bob the Agent Builder',\\n spawnPurposePrompt:\\n 'Enhanced base agent that can create custom agents and handle all coding tasks with deterministic agent creation behavior',\\n inputSchema: {\\n prompt: z\\n .string()\\n .optional()\\n .describe(\\n 'What agent type you would like to create or edit. Include as many details as possible.',\\n ),\\n params: z\\n .object({\\n name: z.string().optional(),\\n purpose: z.string().optional(),\\n specialty: z.string().optional(),\\n model: z.string().optional(),\\n })\\n .passthrough()\\n .optional(),\\n },\\n outputMode: 'structured_output',\\n includeMessageHistory: false,\\n toolNames: [\\n 'write_file',\\n 'str_replace',\\n 'run_terminal_command',\\n 'read_files',\\n 'code_search',\\n 'spawn_agents',\\n 'add_message',\\n 'set_output',\\n 'end_turn',\\n ] satisfies ToolName[],\\n\\n systemPrompt: [\\n '# Bob the Agent Builder',\\n '',\\n 'You are an expert agent builder specialized in creating new agent templates for the codebuff system. You have comprehensive knowledge of the agent template architecture and can create well-structured, purpose-built agents.',\\n '',\\n '## Environment Setup Complete',\\n '',\\n 'Your environment has been automatically prepared with:',\\n '- Agent template type definitions in `.agents/types/agent-definition.d.ts`',\\n '- Tool type definitions in `.agents/types/tools.d.ts`',\\n '- Diff-reviewer examples in `.agents/examples/` for reference',\\n '- A starter custom agent template at `.agents/your-custom-agent.ts`',\\n '',\\n 'All necessary files are now available in your working directory.',\\n '',\\n '## Complete Agent Template Type Definitions',\\n '',\\n 'Here are the complete TypeScript type definitions for creating custom Codebuff agents:',\\n '```typescript',\\n agentTemplateContent,\\n '```',\\n '',\\n '## Available Tools Type Definitions',\\n '',\\n 'Here are the complete TypeScript type definitions for all available tools:',\\n '',\\n '```typescript',\\n toolDefinitionsContent,\\n '```',\\n '',\\n '## Agent Template Patterns:',\\n '',\\n '1. **Base Agent Pattern**: Full-featured agents with comprehensive tool access',\\n '2. **Specialized Agent Pattern**: Focused agents with limited tool sets',\\n '3. **Thinking Agent Pattern**: Agents that spawn thinker sub-agents',\\n '4. **Research Agent Pattern**: Agents that start with web search',\\n '',\\n '## Best Practices:',\\n '',\\n '1. **Use as few fields as possible**: Leave out fields that are not needed to reduce complexity',\\n '2. **Minimal Tools**: Only include tools the agent actually needs',\\n '3. **Clear and Concise Prompts**: Write clear, specific prompts that have no unnecessary words',\\n '4. **Consistent Naming**: Follow naming conventions (kebab-case for IDs)',\\n '5. **Appropriate Model**: Choose the right model for the task complexity. Default is claude-4-sonnet-20250522 for medium-high complexity tasks, and openai/gpt-5 for all other tasks.',\\n '',\\n '## Your Task:',\\n 'When asked to create an agent template, you should:',\\n \\\"1. Understand the requested agent's purpose and capabilities\\\",\\n \\\"2. Choose appropriate tools for the agent's function\\\",\\n '3. Write a comprehensive system prompt',\\n `4. Create the complete agent template file in ${AGENT_TEMPLATES_DIR}`,\\n '5. Ensure the template follows all conventions and best practices',\\n '6. Use the AgentDefinition interface for the configuration',\\n '7. Start the file with: import type { AgentDefinition } from \\\"./types/agent-definition.d.ts\\\"',\\n '',\\n 'Create agent templates that are focused, efficient, and well-documented. Always import the AgentDefinition type and export a default configuration object.',\\n ].join('\\\\n'),\\n instructionsPrompt: `You are helping to create or edit an agent template. The user will describe what kind of agent they want to create or how they want to modify an existing agent.\\n\\n## Environment Ready\\n\\nYour environment has been automatically set up with:\\n- Type definitions in \\\\`.agents/types/\\\\`\\n- Diff-reviewer examples in \\\\`.agents/examples/\\\\`\\n- A starter custom agent template at \\\\`.agents/your-custom-agent.ts\\\\`\\n\\nYou can now proceed directly to agent creation or editing.\\n\\n## Example Agents Available\\n\\nThree diff-reviewer examples are available in \\\\`.agents/examples/\\\\`. These can serve as examples of well-made agents at different stages of complexity.\\n\\n**IMPORTANT**: Examine these examples to find connections and patterns that relate to the user's request. Look for:\\n- Similar tool combinations\\n- Comparable complexity levels\\n- Related functionality patterns\\n- Appropriate model choices\\n- Relevant prompt structures\\n\\nUse these examples as inspiration and starting points, adapting their patterns to fit the user's specific needs.\\n\\n## Starter Template Available\\n\\nA starter custom agent file is available at \\\\`.agents/your-custom-agent.ts\\\\`. You can either modify this file directly or use it as a reference for creating a new agent.\\n\\n## For New Agents\\n\\nAnalyze their request and create a complete agent template that:\\n- Has a clear purpose and appropriate capabilities\\n- Leaves out fields that are not needed\\n- Uses only the tools it needs\\n- Follows naming conventions\\n- Is properly structured\\n- Draws inspiration from relevant example agents\\n\\n## For Creating New Agents\\n\\nThe agent builder is focused on creating new agent templates based on user specifications.\\n\\nIMPORTANT: Always end your response with the end_turn tool when you have completed the agent creation or editing task.`,\\n stepPrompt: '',\\n\\n handleSteps: function* () {\\n // Step 1: Create directory structure\\n yield {\\n toolName: 'run_terminal_command',\\n args: {\\n command: `mkdir -p ${TYPES_DIR} && mkdir -p ${EXAMPLES_DIR}`,\\n process_type: 'SYNC',\\n timeout_seconds: 10,\\n },\\n }\\n\\n // Step 2: Write the AGENT_DEFINITION_FILE with the template content\\n yield {\\n toolName: 'write_file',\\n args: {\\n path: TEMPLATE_TYPES_PATH,\\n instructions: 'Create agent template type definitions file',\\n content: agentTemplateContent,\\n },\\n }\\n\\n // Step 3: Write the tool definitions file (copy from existing tools.d.ts)\\n yield {\\n toolName: 'write_file',\\n args: {\\n path: TOOL_DEFINITIONS_PATH,\\n instructions: 'Create tools type file',\\n content: toolDefinitionsContent,\\n },\\n }\\n\\n // Step 4: Add message about reading example files and then read them\\n yield {\\n toolName: 'add_message',\\n args: {\\n role: 'assistant',\\n content:\\n \\\"I'll review the starter template and diff-reviewer examples, then help you create your agent.\\\",\\n },\\n }\\n\\n // Step 5: Copy example agent files to .agents/examples/\\n for (const [filename, content] of Object.entries(exampleAgentContents)) {\\n if (content) {\\n yield {\\n toolName: 'write_file',\\n args: {\\n path: `${EXAMPLES_DIR}/${filename}`,\\n instructions: `Copy example agent file ${filename}`,\\n content: content,\\n },\\n }\\n }\\n }\\n\\n // Step 6: Copy starter template directly to .agents/\\n if (starterTemplateContent) {\\n yield {\\n toolName: 'write_file',\\n args: {\\n path: `${AGENT_TEMPLATES_DIR}/${STARTER_TEMPLATE_DEST_FILE}`,\\n instructions: `Copy starter custom agent template ${STARTER_TEMPLATE_DEST_FILE}`,\\n content: starterTemplateContent,\\n },\\n }\\n }\\n\\n // Step 7: Complete agent creation process\\n yield 'STEP_ALL'\\n },\\n }\\n}\\n\"\n}\n\n\n{\n \"cb_tool_name\": \"str_replace\",\n \"path\": \"common/src/constants/agents.ts\",\n \"replacements\": [\n {\n \"old\": \" dry_run: {\\n displayName: 'Sketch the Dry Runner',\\n purpose: 'Agent that takes a plan and try to implement it in a dry run.',\\n hidden: true,\\n } as const,\\n\",\n \"new\": \"\"\n },\n {\n \"old\": \" agent_builder: {\\n displayName: 'Bob the Agent Builder',\\n purpose: 'Creates new agent templates for the codebuff mult-agent system',\\n hidden: false,\\n } as const,\\n\",\n \"new\": \" agent_builder: {\\n displayName: 'Bob the Agent Builder',\\n purpose: 'Creates new agent templates for the codebuff multi-agent system',\\n hidden: false,\\n } as const,\\n\"\n }\n ]\n}\n\n\n{\n \"cb_tool_name\": \"write_file\",\n \"path\": \".agents/examples/diff-reviewer-1.ts\",\n \"instructions\": \"Refresh diff-reviewer-1 example to use current Anthropic model.\",\n \"content\": \"import type { AgentDefinition } from '../types/agent-definition'\\n\\nconst definition: AgentDefinition = {\\n id: 'diff-reviewer-1',\\n\\n displayName: 'Diff Reviewer (Level 1)',\\n model: 'anthropic/claude-4-sonnet-20250522',\\n toolNames: ['read_files', 'run_terminal_command'],\\n\\n spawnPurposePrompt:\\n 'Spawn when you need to review code changes in the git diff',\\n\\n instructionsPrompt: `Execute the following steps:\\n1. Run git diff\\n2. Read the files that have changed\\n3. Review the changes and suggest improvements`,\\n}\\n\\nexport default definition\\n\"\n}\n\n\n{\n \"cb_tool_name\": \"write_file\",\n \"path\": \".agents/examples/diff-reviewer-2.ts\",\n \"instructions\": \"Refresh diff-reviewer-2 example to use current Anthropic model.\",\n \"content\": \"import type {\\n AgentDefinition,\\n AgentStepContext,\\n} from '../types/agent-definition'\\n\\nconst definition: AgentDefinition = {\\n id: 'diff-reviewer-2',\\n displayName: 'Diff Reviewer (Level 2)',\\n model: 'anthropic/claude-4-sonnet-20250522',\\n\\n inputSchema: {\\n prompt: {\\n type: 'string',\\n description:\\n 'Please provide a short description of the changes you want to review',\\n },\\n },\\n toolNames: ['read_files', 'run_terminal_command'],\\n\\n spawnPurposePrompt:\\n 'Spawn when you need to review code changes in the git diff',\\n\\n systemPrompt:\\n 'You are an expert software developer. Your job is to review code changes and provide helpful feedback.',\\n\\n instructionsPrompt: `Execute the following steps:\\n1. Run git diff\\n2. Read the files that have changed\\n3. Review the changes and suggest improvements\\n\\nUse the following guidelines while reviewing the changes:\\n- Find ways to simplify the code\\n- Reuse existing code as much as possible instead of writing new code\\n- Preserve as much behavior as possible in the existing code\\n- Prefer changing as few lines of code as possible\\n- Look for opportunities to improve the code's readability\\n- Look for logical errors in the code\\n- Look for missed cases in the code\\n- Look for any other bugs`,\\n\\n handleSteps: function* ({ prompt }: AgentStepContext) {\\n // Step 1: Run git diff immediately. Saves the agent a step, lowering cost and latency!\\n yield {\\n toolName: 'run_terminal_command',\\n args: {\\n command: 'git diff',\\n },\\n }\\n\\n // Step 2: Let AI run the rest of the steps!\\n yield 'STEP_ALL'\\n },\\n}\\n\\nexport default definition\\n\"\n}\n\n\n{\n \"cb_tool_name\": \"write_file\",\n \"path\": \".agents/examples/diff-reviewer-3.ts\",\n \"instructions\": \"Refresh diff-reviewer-3 example to use current Anthropic model, correct file-explorer spawn target, and streamline final step behavior.\",\n \"content\": \"import type {\\n AgentDefinition,\\n AgentStepContext,\\n} from '../types/agent-definition'\\n\\nconst definition: AgentDefinition = {\\n id: 'diff-reviewer-3',\\n\\n displayName: 'Diff Reviewer (Level 3)',\\n model: 'anthropic/claude-4-sonnet-20250522',\\n inputSchema: {\\n prompt: {\\n type: 'string',\\n description:\\n 'Please provide a short description of the changes you want to review',\\n },\\n },\\n outputMode: 'last_message',\\n\\n toolNames: ['read_files', 'run_terminal_command', 'spawn_agents'],\\n spawnableAgents: ['file-explorer'],\\n\\n spawnPurposePrompt:\\n 'Spawn when you need to review code changes in the git diff',\\n\\n systemPrompt:\\n 'You are an expert software developer. Your job is to review code changes and provide helpful feedback.',\\n\\n instructionsPrompt: `Review the changes and suggest improvements.\\n\\nUse the following guidelines while reviewing the changes:\\n- Find ways to simplify the code\\n- Reuse existing code as much as possible instead of writing new code\\n- Preserve as much behavior as possible in the existing code\\n- Prefer changing as few lines of code as possible\\n- Look for opportunities to improve the code's readability\\n- Look for logical errors in the code\\n- Look for missed cases in the code\\n- Look for any other bugs`,\\n\\n handleSteps: function* ({ prompt }: AgentStepContext) {\\n // Step 1: Get list of changed files from git diff --name-only\\n const { toolResult: gitDiffFilesResult } = yield {\\n toolName: 'run_terminal_command',\\n args: {\\n command: 'git diff --name-only',\\n },\\n }\\n\\n const changedFiles = (gitDiffFilesResult || '')\\n .split('\\\\n')\\n .map((line) => line.trim())\\n .filter((line) => line && !line.startsWith('??') && !line.includes('OSC'))\\n\\n // Step 2: Read changed files\\n if (changedFiles.length > 0) {\\n yield {\\n toolName: 'read_files',\\n args: {\\n paths: changedFiles,\\n },\\n }\\n }\\n\\n // Step 3: Run full git diff to see the actual changes\\n yield {\\n toolName: 'run_terminal_command',\\n args: {\\n command: 'git diff',\\n },\\n }\\n\\n // Step 4: Spawn file explorer for broader context if needed\\n yield {\\n toolName: 'spawn_agents',\\n args: {\\n agents: [\\n {\\n agent_type: 'file-explorer',\\n prompt: `Find any additional codebase context needed to review these changes. Review focus: ${prompt || ''}`,\\n params: {\\n prompts: [\\n 'Any modules/classes/functions referenced by the diff',\\n 'Relevant tests or test helpers for the changed code',\\n 'Related config or shared utilities that might be impacted',\\n ],\\n },\\n },\\n ],\\n },\\n }\\n\\n // Step 5: Let the AI produce the final review in a single final step\\n yield 'STEP_ALL'\\n },\\n}\\n\\nexport default definition\\n\"\n}\n\n\n{\n \"cb_tool_name\": \"write_file\",\n \"path\": \"common/src/util/examples/diff-reviewer-1.ts\",\n \"instructions\": \"Refresh common diff-reviewer-1 example to use current Anthropic model.\",\n \"content\": \"import type { AgentDefinition } from '../types/agent-definition'\\n\\nconst definition: AgentDefinition = {\\n id: 'diff-reviewer-1',\\n\\n displayName: 'Diff Reviewer (Level 1)',\\n model: 'anthropic/claude-4-sonnet-20250522',\\n toolNames: ['read_files', 'run_terminal_command'],\\n\\n spawnPurposePrompt:\\n 'Spawn when you need to review code changes in the git diff',\\n\\n instructionsPrompt: `Execute the following steps:\\n1. Run git diff\\n2. Read the files that have changed\\n3. Review the changes and suggest improvements`,\\n}\\n\\nexport default definition\\n\"\n}\n\n\n{\n \"cb_tool_name\": \"write_file\",\n \"path\": \"common/src/util/examples/diff-reviewer-2.ts\",\n \"instructions\": \"Refresh common diff-reviewer-2 example to use current Anthropic model.\",\n \"content\": \"import type {\\n AgentDefinition,\\n AgentStepContext,\\n} from '../types/agent-definition'\\n\\nconst definition: AgentDefinition = {\\n id: 'diff-reviewer-2',\\n displayName: 'Diff Reviewer (Level 2)',\\n model: 'anthropic/claude-4-sonnet-20250522',\\n\\n inputSchema: {\\n prompt: {\\n type: 'string',\\n description:\\n 'Please provide a short description of the changes you want to review',\\n },\\n },\\n toolNames: ['read_files', 'run_terminal_command'],\\n\\n spawnPurposePrompt:\\n 'Spawn when you need to review code changes in the git diff',\\n\\n systemPrompt:\\n 'You are an expert software developer. Your job is to review code changes and provide helpful feedback.',\\n\\n instructionsPrompt: `Execute the following steps:\\n1. Run git diff\\n2. Read the files that have changed\\n3. Review the changes and suggest improvements\\n\\nUse the following guidelines while reviewing the changes:\\n- Find ways to simplify the code\\n- Reuse existing code as much as possible instead of writing new code\\n- Preserve as much behavior as possible in the existing code\\n- Prefer changing as few lines of code as possible\\n- Look for opportunities to improve the code's readability\\n- Look for logical errors in the code\\n- Look for missed cases in the code\\n- Look for any other bugs`,\\n\\n handleSteps: function* ({ prompt }: AgentStepContext) {\\n // Step 1: Run git diff immediately. Saves the agent a step, lowering cost and latency!\\n yield {\\n toolName: 'run_terminal_command',\\n args: {\\n command: 'git diff',\\n },\\n }\\n\\n // Step 2: Let AI run the rest of the steps!\\n yield 'STEP_ALL'\\n },\\n}\\n\\nexport default definition\\n\"\n}\n\n\n{\n \"cb_tool_name\": \"write_file\",\n \"path\": \"common/src/util/examples/diff-reviewer-3.ts\",\n \"instructions\": \"Refresh common diff-reviewer-3 example to use current Anthropic model, correct file-explorer spawn target, and streamline final step behavior.\",\n \"content\": \"import type {\\n AgentDefinition,\\n AgentStepContext,\\n} from '../types/agent-definition'\\n\\nconst definition: AgentDefinition = {\\n id: 'diff-reviewer-3',\\n\\n displayName: 'Diff Reviewer (Level 3)',\\n model: 'anthropic/claude-4-sonnet-20250522',\\n inputSchema: {\\n prompt: {\\n type: 'string',\\n description:\\n 'Please provide a short description of the changes you want to review',\\n },\\n },\\n outputMode: 'last_message',\\n\\n toolNames: ['read_files', 'run_terminal_command', 'spawn_agents'],\\n spawnableAgents: ['file-explorer'],\\n\\n spawnPurposePrompt:\\n 'Spawn when you need to review code changes in the git diff',\\n\\n systemPrompt:\\n 'You are an expert software developer. Your job is to review code changes and provide helpful feedback.',\\n\\n instructionsPrompt: `Review the changes and suggest improvements.\\n\\nUse the following guidelines while reviewing the changes:\\n- Find ways to simplify the code\\n- Reuse existing code as much as possible instead of writing new code\\n- Preserve as much behavior as possible in the existing code\\n- Prefer changing as few lines of code as possible\\n- Look for opportunities to improve the code's readability\\n- Look for logical errors in the code\\n- Look for missed cases in the code\\n- Look for any other bugs`,\\n\\n handleSteps: function* ({ prompt }: AgentStepContext) {\\n // Step 1: Get list of changed files from git diff --name-only\\n const { toolResult: gitDiffFilesResult } = yield {\\n toolName: 'run_terminal_command',\\n args: {\\n command: 'git diff --name-only',\\n },\\n }\\n\\n const changedFiles = (gitDiffFilesResult || '')\\n .split('\\\\n')\\n .map((line) => line.trim())\\n .filter((line) => line && !line.startsWith('??') && !line.includes('OSC'))\\n\\n // Step 2: Read changed files\\n if (changedFiles.length > 0) {\\n yield {\\n toolName: 'read_files',\\n args: {\\n paths: changedFiles,\\n },\\n }\\n }\\n\\n // Step 3: Run full git diff to see the actual changes\\n yield {\\n toolName: 'run_terminal_command',\\n args: {\\n command: 'git diff',\\n },\\n }\\n\\n // Step 4: Spawn file explorer for broader context if needed\\n yield {\\n toolName: 'spawn_agents',\\n args: {\\n agents: [\\n {\\n agent_type: 'file-explorer',\\n prompt: `Find any additional codebase context needed to review these changes. Review focus: ${prompt || ''}`,\\n params: {\\n prompts: [\\n 'Any modules/classes/functions referenced by the diff',\\n 'Relevant tests or test helpers for the changed code',\\n 'Related config or shared utilities that might be impacted',\\n ],\\n },\\n },\\n ],\\n },\\n }\\n\\n // Step 5: Let the AI produce the final review in a single final step\\n yield 'STEP_ALL'\\n },\\n}\\n\\nexport default definition\\n\"\n}\n\n\n{\n \"cb_tool_name\": \"write_file\",\n \"path\": \".agents/your-custom-agent.ts\",\n \"instructions\": \"Add a new starter custom agent (Git Committer scaffold) in the top-level .agents directory, ready to run and publish.\",\n \"content\": \"import { publisher, version } from './constants'\\n\\nimport type {\\n AgentDefinition,\\n AgentStepContext,\\n} from './types/agent-definition'\\n\\nconst definition: AgentDefinition = {\\n id: 'your-custom-agent',\\n version,\\n publisher,\\n\\n displayName: 'Your Custom Agent (Git Committer)',\\n model: 'anthropic/claude-4-sonnet-20250522',\\n toolNames: ['read_files', 'run_terminal_command', 'add_message', 'end_turn'],\\n\\n inputSchema: {\\n prompt: {\\n type: 'string',\\n description: 'What changes to commit',\\n },\\n },\\n\\n includeMessageHistory: false,\\n outputMode: 'last_message',\\n\\n spawnPurposePrompt:\\n 'Spawn when you need to commit code changes to git with an appropriate commit message',\\n\\n systemPrompt:\\n 'You are an expert software developer. Your job is to create a git commit with a really good commit message.',\\n\\n instructionsPrompt:\\n 'Follow the steps to create a good commit: analyze changes with git diff and git log, read relevant files for context, stage appropriate files, and create a commit with proper formatting including the Codebuff footer.',\\n\\n handleSteps: function* ({ prompt }: AgentStepContext) {\\n // Step 1: Analyze the changes\\n yield {\\n toolName: 'run_terminal_command',\\n args: {\\n command: 'git diff',\\n process_type: 'SYNC',\\n timeout_seconds: 30,\\n },\\n }\\n\\n yield {\\n toolName: 'run_terminal_command',\\n args: {\\n command: 'git log --oneline -10',\\n process_type: 'SYNC',\\n timeout_seconds: 30,\\n },\\n }\\n\\n // Step 2: Let the AI decide what to read + what to stage based on the user's intent\\n yield {\\n toolName: 'add_message',\\n args: {\\n role: 'assistant',\\n content: `Goal: ${prompt}\\\\n\\\\nI'll read any relevant files and stage the right changes next.`,\\n },\\n }\\n\\n yield 'STEP'\\n\\n // Step 3: Let the AI create the commit with proper formatting\\n yield {\\n toolName: 'add_message',\\n args: {\\n role: 'assistant',\\n content:\\n \\\"Now I'll create the commit with a high-quality message and the proper Codebuff footer format.\\\",\\n },\\n }\\n\\n yield 'STEP_ALL'\\n },\\n}\\n\\nexport default definition\\n\"\n}\n\n\n{\n \"cb_tool_name\": \"write_file\",\n \"path\": \"common/src/util/examples/your-custom-agent.ts.txt\",\n \"instructions\": \"Add starter custom agent template content for the agent builder to copy into .agents/your-custom-agent.ts.\",\n \"content\": \"import { publisher, version } from './constants'\\n\\nimport type {\\n AgentDefinition,\\n AgentStepContext,\\n} from './types/agent-definition'\\n\\nconst definition: AgentDefinition = {\\n id: 'your-custom-agent',\\n version,\\n publisher,\\n\\n displayName: 'Your Custom Agent (Git Committer)',\\n model: 'anthropic/claude-4-sonnet-20250522',\\n toolNames: ['read_files', 'run_terminal_command', 'add_message', 'end_turn'],\\n\\n inputSchema: {\\n prompt: {\\n type: 'string',\\n description: 'What changes to commit',\\n },\\n },\\n\\n includeMessageHistory: false,\\n outputMode: 'last_message',\\n\\n spawnPurposePrompt:\\n 'Spawn when you need to commit code changes to git with an appropriate commit message',\\n\\n systemPrompt:\\n 'You are an expert software developer. Your job is to create a git commit with a really good commit message.',\\n\\n instructionsPrompt:\\n 'Follow the steps to create a good commit: analyze changes with git diff and git log, read relevant files for context, stage appropriate files, and create a commit with proper formatting including the Codebuff footer.',\\n\\n handleSteps: function* ({ prompt }: AgentStepContext) {\\n // Step 1: Analyze the changes\\n yield {\\n toolName: 'run_terminal_command',\\n args: {\\n command: 'git diff',\\n process_type: 'SYNC',\\n timeout_seconds: 30,\\n },\\n }\\n\\n yield {\\n toolName: 'run_terminal_command',\\n args: {\\n command: 'git log --oneline -10',\\n process_type: 'SYNC',\\n timeout_seconds: 30,\\n },\\n }\\n\\n // Step 2: Let the AI decide what to read + what to stage based on the user's intent\\n yield {\\n toolName: 'add_message',\\n args: {\\n role: 'assistant',\\n content: `Goal: ${prompt}\\\\n\\\\nI'll read any relevant files and stage the right changes next.`,\\n },\\n }\\n\\n yield 'STEP'\\n\\n // Step 3: Let the AI create the commit with proper formatting\\n yield {\\n toolName: 'add_message',\\n args: {\\n role: 'assistant',\\n content:\\n \\\"Now I'll create the commit with a high-quality message and the proper Codebuff footer format.\\\",\\n },\\n }\\n\\n yield 'STEP_ALL'\\n },\\n}\\n\\nexport default definition\\n\"\n}\n", - "toolResults": [ - { - "file": "backend/src/templates/agents/agent-builder.ts", - "message": "Updated file", - "unifiedDiff": "@@ -1,12 +1,8 @@\n import * as fs from 'fs'\n import * as path from 'path'\n \n-import {\n- AGENT_TEMPLATES_DIR,\n- openrouterModels,\n- AGENT_DEFINITION_FILE,\n-} from '@codebuff/common/constants'\n+import { AGENT_TEMPLATES_DIR, AGENT_DEFINITION_FILE } from '@codebuff/common/constants'\n import { AgentTemplateTypes } from '@codebuff/common/types/session-state'\n import z from 'zod/v4'\n \n import type { AgentTemplate } from '../types'\n@@ -19,9 +15,8 @@\n // Import to validate path exists at compile time\n import(TEMPLATE_RELATIVE_PATH)\n \n const TEMPLATE_PATH = path.join(__dirname, TEMPLATE_RELATIVE_PATH)\n-const DEFAULT_MODEL = openrouterModels.openrouter_claude_sonnet_4\n const TYPES_DIR = path.join(AGENT_TEMPLATES_DIR, 'types')\n const EXAMPLES_DIR = path.join(AGENT_TEMPLATES_DIR, 'examples')\n const TEMPLATE_TYPES_PATH = path.join(TYPES_DIR, AGENT_DEFINITION_FILE)\n const TOOL_DEFINITIONS_FILE = 'tools.d.ts'\n@@ -32,9 +27,9 @@\n const STARTER_TEMPLATE_DEST_FILE = 'your-custom-agent.ts'\n \n export const agentBuilder = (\n model: Model,\n- allAvailableAgents?: string[],\n+ _allAvailableAgents?: string[],\n ): Omit => {\n // Read the AGENT_CONFIG_FILE content dynamically\n // The import above ensures this path exists at compile time\n let agentTemplateContent = ''\n@@ -57,9 +52,9 @@\n console.warn(`Could not read tools.d.ts from common:`, error)\n toolDefinitionsContent = '// Tool definitions not available'\n }\n \n- // Read example agent files from common package\n+ // Read example agent files + starter template from common package\n const exampleAgentContents: Record = {}\n let starterTemplateContent = ''\n \n try {\n@@ -229,9 +224,9 @@\n \n IMPORTANT: Always end your response with the end_turn tool when you have completed the agent creation or editing task.`,\n stepPrompt: '',\n \n- handleSteps: function* ({ agentState, prompt, params }) {\n+ handleSteps: function* () {\n // Step 1: Create directory structure\n yield {\n toolName: 'run_terminal_command',\n args: {\n" - }, - { - "file": "common/src/constants/agents.ts", - "message": "Updated file", - "unifiedDiff": "@@ -64,21 +64,16 @@\n displayName: 'Peter Plan the Planner',\n purpose: 'Agent that formulates a comprehensive plan to a prompt.',\n hidden: true,\n } as const,\n- dry_run: {\n- displayName: 'Sketch the Dry Runner',\n- purpose: 'Agent that takes a plan and try to implement it in a dry run.',\n- hidden: true,\n- } as const,\n reviewer: {\n displayName: 'Nit Pick Nick the Reviewer',\n purpose:\n 'Reviews file changes and responds with critical feedback. Use this after making any significant change to the codebase.',\n } as const,\n agent_builder: {\n displayName: 'Bob the Agent Builder',\n- purpose: 'Creates new agent templates for the codebuff mult-agent system',\n+ purpose: 'Creates new agent templates for the codebuff multi-agent system',\n hidden: false,\n } as const,\n } as const satisfies Partial<\n Record<\n" - }, - { - "file": ".agents/examples/diff-reviewer-1.ts", - "message": "Updated file", - "unifiedDiff": "@@ -3,9 +3,9 @@\n const definition: AgentDefinition = {\n id: 'diff-reviewer-1',\n \n displayName: 'Diff Reviewer (Level 1)',\n- model: 'openai/gpt-5',\n+ model: 'anthropic/claude-4-sonnet-20250522',\n toolNames: ['read_files', 'run_terminal_command'],\n \n spawnPurposePrompt:\n 'Spawn when you need to review code changes in the git diff',\n" - }, - { - "file": ".agents/examples/diff-reviewer-2.ts", - "message": "Updated file", - "unifiedDiff": "@@ -5,9 +5,9 @@\n \n const definition: AgentDefinition = {\n id: 'diff-reviewer-2',\n displayName: 'Diff Reviewer (Level 2)',\n- model: 'openai/gpt-5',\n+ model: 'anthropic/claude-4-sonnet-20250522',\n \n inputSchema: {\n prompt: {\n type: 'string',\n@@ -37,9 +37,9 @@\n - Look for logical errors in the code\n - Look for missed cases in the code\n - Look for any other bugs`,\n \n- handleSteps: function* ({ agentState, prompt, params }: AgentStepContext) {\n+ handleSteps: function* ({ prompt }: AgentStepContext) {\n // Step 1: Run git diff immediately. Saves the agent a step, lowering cost and latency!\n yield {\n toolName: 'run_terminal_command',\n args: {\n" - }, - { - "file": ".agents/examples/diff-reviewer-3.ts", - "message": "Updated file", - "unifiedDiff": "@@ -6,9 +6,9 @@\n const definition: AgentDefinition = {\n id: 'diff-reviewer-3',\n \n displayName: 'Diff Reviewer (Level 3)',\n- model: 'openai/gpt-5',\n+ model: 'anthropic/claude-4-sonnet-20250522',\n inputSchema: {\n prompt: {\n type: 'string',\n description:\n@@ -17,9 +17,9 @@\n },\n outputMode: 'last_message',\n \n toolNames: ['read_files', 'run_terminal_command', 'spawn_agents'],\n- spawnableAgents: ['james/file-explorer@0.1.3'],\n+ spawnableAgents: ['file-explorer'],\n \n spawnPurposePrompt:\n 'Spawn when you need to review code changes in the git diff',\n \n@@ -37,24 +37,23 @@\n - Look for logical errors in the code\n - Look for missed cases in the code\n - Look for any other bugs`,\n \n- handleSteps: function* ({ agentState, prompt, params }: AgentStepContext) {\n+ handleSteps: function* ({ prompt }: AgentStepContext) {\n // Step 1: Get list of changed files from git diff --name-only\n const { toolResult: gitDiffFilesResult } = yield {\n toolName: 'run_terminal_command',\n args: {\n command: 'git diff --name-only',\n },\n }\n \n- // Then, extract file paths from the result\n const changedFiles = (gitDiffFilesResult || '')\n .split('\\n')\n .map((line) => line.trim())\n .filter((line) => line && !line.startsWith('??') && !line.includes('OSC'))\n \n- // Step 2: Read the files\n+ // Step 2: Read changed files\n if (changedFiles.length > 0) {\n yield {\n toolName: 'read_files',\n args: {\n@@ -70,31 +69,30 @@\n command: 'git diff',\n },\n }\n \n- // Step 4: Put words in the AI's mouth to get it to spawn the file explorer.\n+ // Step 4: Spawn file explorer for broader context if needed\n yield {\n- toolName: 'add_message',\n+ toolName: 'spawn_agents',\n args: {\n- role: 'assistant',\n- content:\n- 'Now I will spawn a file explorer to find any missing codebase context.',\n+ agents: [\n+ {\n+ agent_type: 'file-explorer',\n+ prompt: `Find any additional codebase context needed to review these changes. Review focus: ${prompt || ''}`,\n+ params: {\n+ prompts: [\n+ 'Any modules/classes/functions referenced by the diff',\n+ 'Relevant tests or test helpers for the changed code',\n+ 'Related config or shared utilities that might be impacted',\n+ ],\n+ },\n+ },\n+ ],\n },\n }\n \n- yield 'STEP'\n-\n- // Step 5: Put words in the AI's mouth to review the changes.\n- yield {\n- toolName: 'add_message',\n- args: {\n- role: 'assistant',\n- content: 'Here is my comprehensive review of the changes.',\n- },\n- }\n-\n- // Step 6: Let AI review the changes in a final step. (The last message is also the agent's output.)\n- yield 'STEP'\n+ // Step 5: Let the AI produce the final review in a single final step\n+ yield 'STEP_ALL'\n },\n }\n \n export default definition\n" - }, - { - "file": "common/src/util/examples/diff-reviewer-1.ts", - "message": "Updated file", - "unifiedDiff": "@@ -3,9 +3,9 @@\n const definition: AgentDefinition = {\n id: 'diff-reviewer-1',\n \n displayName: 'Diff Reviewer (Level 1)',\n- model: 'openai/gpt-5',\n+ model: 'anthropic/claude-4-sonnet-20250522',\n toolNames: ['read_files', 'run_terminal_command'],\n \n spawnPurposePrompt:\n 'Spawn when you need to review code changes in the git diff',\n" - }, - { - "file": "common/src/util/examples/diff-reviewer-2.ts", - "message": "Updated file", - "unifiedDiff": "@@ -5,9 +5,9 @@\n \n const definition: AgentDefinition = {\n id: 'diff-reviewer-2',\n displayName: 'Diff Reviewer (Level 2)',\n- model: 'openai/gpt-5',\n+ model: 'anthropic/claude-4-sonnet-20250522',\n \n inputSchema: {\n prompt: {\n type: 'string',\n@@ -37,9 +37,9 @@\n - Look for logical errors in the code\n - Look for missed cases in the code\n - Look for any other bugs`,\n \n- handleSteps: function* ({ agentState, prompt, params }: AgentStepContext) {\n+ handleSteps: function* ({ prompt }: AgentStepContext) {\n // Step 1: Run git diff immediately. Saves the agent a step, lowering cost and latency!\n yield {\n toolName: 'run_terminal_command',\n args: {\n" - }, - { - "file": "common/src/util/examples/diff-reviewer-3.ts", - "message": "Updated file", - "unifiedDiff": "@@ -6,9 +6,9 @@\n const definition: AgentDefinition = {\n id: 'diff-reviewer-3',\n \n displayName: 'Diff Reviewer (Level 3)',\n- model: 'openai/gpt-5',\n+ model: 'anthropic/claude-4-sonnet-20250522',\n inputSchema: {\n prompt: {\n type: 'string',\n description:\n@@ -17,9 +17,9 @@\n },\n outputMode: 'last_message',\n \n toolNames: ['read_files', 'run_terminal_command', 'spawn_agents'],\n- spawnableAgents: ['james/file-explorer@0.1.3'],\n+ spawnableAgents: ['file-explorer'],\n \n spawnPurposePrompt:\n 'Spawn when you need to review code changes in the git diff',\n \n@@ -37,24 +37,23 @@\n - Look for logical errors in the code\n - Look for missed cases in the code\n - Look for any other bugs`,\n \n- handleSteps: function* ({ agentState, prompt, params }: AgentStepContext) {\n+ handleSteps: function* ({ prompt }: AgentStepContext) {\n // Step 1: Get list of changed files from git diff --name-only\n const { toolResult: gitDiffFilesResult } = yield {\n toolName: 'run_terminal_command',\n args: {\n command: 'git diff --name-only',\n },\n }\n \n- // Then, extract file paths from the result\n const changedFiles = (gitDiffFilesResult || '')\n .split('\\n')\n .map((line) => line.trim())\n .filter((line) => line && !line.startsWith('??') && !line.includes('OSC'))\n \n- // Step 2: Read the files\n+ // Step 2: Read changed files\n if (changedFiles.length > 0) {\n yield {\n toolName: 'read_files',\n args: {\n@@ -70,31 +69,30 @@\n command: 'git diff',\n },\n }\n \n- // Step 4: Put words in the AI's mouth to get it to spawn the file explorer.\n+ // Step 4: Spawn file explorer for broader context if needed\n yield {\n- toolName: 'add_message',\n+ toolName: 'spawn_agents',\n args: {\n- role: 'assistant',\n- content:\n- 'Now I will spawn a file explorer to find any missing codebase context.',\n+ agents: [\n+ {\n+ agent_type: 'file-explorer',\n+ prompt: `Find any additional codebase context needed to review these changes. Review focus: ${prompt || ''}`,\n+ params: {\n+ prompts: [\n+ 'Any modules/classes/functions referenced by the diff',\n+ 'Relevant tests or test helpers for the changed code',\n+ 'Related config or shared utilities that might be impacted',\n+ ],\n+ },\n+ },\n+ ],\n },\n }\n \n- yield 'STEP'\n-\n- // Step 5: Put words in the AI's mouth to review the changes.\n- yield {\n- toolName: 'add_message',\n- args: {\n- role: 'assistant',\n- content: 'Here is my comprehensive review of the changes.',\n- },\n- }\n-\n- // Step 6: Let AI review the changes in a final step. (The last message is also the agent's output.)\n- yield 'STEP'\n+ // Step 5: Let the AI produce the final review in a single final step\n+ yield 'STEP_ALL'\n },\n }\n \n export default definition\n" - }, - { - "file": ".agents/your-custom-agent.ts", - "message": "Created new file", - "unifiedDiff": "import { publisher, version } from './constants'\n\nimport type {\n AgentDefinition,\n AgentStepContext,\n} from './types/agent-definition'\n\nconst definition: AgentDefinition = {\n id: 'your-custom-agent',\n version,\n publisher,\n\n displayName: 'Your Custom Agent (Git Committer)',\n model: 'anthropic/claude-4-sonnet-20250522',\n toolNames: ['read_files', 'run_terminal_command', 'add_message', 'end_turn'],\n\n inputSchema: {\n prompt: {\n type: 'string',\n description: 'What changes to commit',\n },\n },\n\n includeMessageHistory: false,\n outputMode: 'last_message',\n\n spawnPurposePrompt:\n 'Spawn when you need to commit code changes to git with an appropriate commit message',\n\n systemPrompt:\n 'You are an expert software developer. Your job is to create a git commit with a really good commit message.',\n\n instructionsPrompt:\n 'Follow the steps to create a good commit: analyze changes with git diff and git log, read relevant files for context, stage appropriate files, and create a commit with proper formatting including the Codebuff footer.',\n\n handleSteps: function* ({ prompt }: AgentStepContext) {\n // Step 1: Analyze the changes\n yield {\n toolName: 'run_terminal_command',\n args: {\n command: 'git diff',\n process_type: 'SYNC',\n timeout_seconds: 30,\n },\n }\n\n yield {\n toolName: 'run_terminal_command',\n args: {\n command: 'git log --oneline -10',\n process_type: 'SYNC',\n timeout_seconds: 30,\n },\n }\n\n // Step 2: Let the AI decide what to read + what to stage based on the user's intent\n yield {\n toolName: 'add_message',\n args: {\n role: 'assistant',\n content: `Goal: ${prompt}\\n\\nI'll read any relevant files and stage the right changes next.`,\n },\n }\n\n yield 'STEP'\n\n // Step 3: Let the AI create the commit with proper formatting\n yield {\n toolName: 'add_message',\n args: {\n role: 'assistant',\n content:\n \"Now I'll create the commit with a high-quality message and the proper Codebuff footer format.\",\n },\n }\n\n yield 'STEP_ALL'\n },\n}\n\nexport default definition\n" - }, - { - "file": "common/src/util/examples/your-custom-agent.ts.txt", - "message": "Created new file", - "unifiedDiff": "import { publisher, version } from './constants'\n\nimport type {\n AgentDefinition,\n AgentStepContext,\n} from './types/agent-definition'\n\nconst definition: AgentDefinition = {\n id: 'your-custom-agent',\n version,\n publisher,\n\n displayName: 'Your Custom Agent (Git Committer)',\n model: 'anthropic/claude-4-sonnet-20250522',\n toolNames: ['read_files', 'run_terminal_command', 'add_message', 'end_turn'],\n\n inputSchema: {\n prompt: {\n type: 'string',\n description: 'What changes to commit',\n },\n },\n\n includeMessageHistory: false,\n outputMode: 'last_message',\n\n spawnPurposePrompt:\n 'Spawn when you need to commit code changes to git with an appropriate commit message',\n\n systemPrompt:\n 'You are an expert software developer. Your job is to create a git commit with a really good commit message.',\n\n instructionsPrompt:\n 'Follow the steps to create a good commit: analyze changes with git diff and git log, read relevant files for context, stage appropriate files, and create a commit with proper formatting including the Codebuff footer.',\n\n handleSteps: function* ({ prompt }: AgentStepContext) {\n // Step 1: Analyze the changes\n yield {\n toolName: 'run_terminal_command',\n args: {\n command: 'git diff',\n process_type: 'SYNC',\n timeout_seconds: 30,\n },\n }\n\n yield {\n toolName: 'run_terminal_command',\n args: {\n command: 'git log --oneline -10',\n process_type: 'SYNC',\n timeout_seconds: 30,\n },\n }\n\n // Step 2: Let the AI decide what to read + what to stage based on the user's intent\n yield {\n toolName: 'add_message',\n args: {\n role: 'assistant',\n content: `Goal: ${prompt}\\n\\nI'll read any relevant files and stage the right changes next.`,\n },\n }\n\n yield 'STEP'\n\n // Step 3: Let the AI create the commit with proper formatting\n yield {\n toolName: 'add_message',\n args: {\n role: 'assistant',\n content:\n \"Now I'll create the commit with a high-quality message and the proper Codebuff footer format.\",\n },\n }\n\n yield 'STEP_ALL'\n },\n}\n\nexport default definition\n" - } - ] - } - }, - "agentId": "D-oY2QIts4E", - "parentAgentId": "main-agent", - "includeToolCall": false - }, - { - "type": "tool_result", - "toolCallId": "9cacab6f-eccb-4681-98bd-9855db807bb5", - "toolName": "set_output", - "output": [ - { - "type": "json", - "value": { - "message": "Output set" - } - } - ], - "parentAgentId": "D-oY2QIts4E" - }, - { - "type": "subagent_finish", - "agentId": "D-oY2QIts4E", - "agentType": "editor-gpt-5", - "displayName": "Code Editor", - "onlyChild": true, - "parentAgentId": "main-agent", - "prompt": "" - }, - { - "type": "tool_result", - "toolCallId": "D-oWnvQd5aA", - "toolName": "spawn_agents", - "output": [ - { - "type": "json", - "value": [ - { - "agentName": "Code Editor", - "agentType": "editor-gpt-5", - "value": { - "type": "structuredOutput", - "value": { - "output": { - "message": "\n{\n \"cb_tool_name\": \"write_file\",\n \"path\": \"backend/src/templates/agents/agent-builder.ts\",\n \"instructions\": \"Update agent builder to gather diff-reviewer examples plus a new starter template, keep examples under .agents/examples, copy starter into .agents root, and stop advertising spawnable agents.\",\n \"content\": \"import * as fs from 'fs'\\nimport * as path from 'path'\\n\\nimport { AGENT_TEMPLATES_DIR, AGENT_DEFINITION_FILE } from '@codebuff/common/constants'\\nimport { AgentTemplateTypes } from '@codebuff/common/types/session-state'\\nimport z from 'zod/v4'\\n\\nimport type { AgentTemplate } from '../types'\\nimport type { Model } from '@codebuff/common/constants'\\nimport type { ToolName } from '@codebuff/common/tools/constants'\\n\\nconst COMMON_UTIL_PATH = '../../../../common/src/util'\\nconst TEMPLATE_RELATIVE_PATH =\\n `${COMMON_UTIL_PATH}/types/${AGENT_DEFINITION_FILE}` as const\\n// Import to validate path exists at compile time\\nimport(TEMPLATE_RELATIVE_PATH)\\n\\nconst TEMPLATE_PATH = path.join(__dirname, TEMPLATE_RELATIVE_PATH)\\nconst TYPES_DIR = path.join(AGENT_TEMPLATES_DIR, 'types')\\nconst EXAMPLES_DIR = path.join(AGENT_TEMPLATES_DIR, 'examples')\\nconst TEMPLATE_TYPES_PATH = path.join(TYPES_DIR, AGENT_DEFINITION_FILE)\\nconst TOOL_DEFINITIONS_FILE = 'tools.d.ts'\\nconst TOOL_DEFINITIONS_PATH = path.join(TYPES_DIR, TOOL_DEFINITIONS_FILE)\\n\\nconst EXAMPLES_SOURCE_DIR = path.join(__dirname, `${COMMON_UTIL_PATH}/examples`)\\nconst STARTER_TEMPLATE_SOURCE_FILE = 'your-custom-agent.ts.txt'\\nconst STARTER_TEMPLATE_DEST_FILE = 'your-custom-agent.ts'\\n\\nexport const agentBuilder = (\\n model: Model,\\n _allAvailableAgents?: string[],\\n): Omit => {\\n // Read the AGENT_CONFIG_FILE content dynamically\\n // The import above ensures this path exists at compile time\\n let agentTemplateContent = ''\\n try {\\n agentTemplateContent = fs.readFileSync(TEMPLATE_PATH, 'utf8')\\n } catch (error) {\\n console.warn(`Could not read ${AGENT_DEFINITION_FILE}:`, error)\\n agentTemplateContent = '// Agent template types not available'\\n }\\n\\n // Read the tools.d.ts content from common package\\n let toolDefinitionsContent = ''\\n try {\\n const toolsPath = path.join(\\n __dirname,\\n `${COMMON_UTIL_PATH}/types/tools.d.ts`,\\n )\\n toolDefinitionsContent = fs.readFileSync(toolsPath, 'utf8')\\n } catch (error) {\\n console.warn(`Could not read tools.d.ts from common:`, error)\\n toolDefinitionsContent = '// Tool definitions not available'\\n }\\n\\n // Read example agent files + starter template from common package\\n const exampleAgentContents: Record = {}\\n let starterTemplateContent = ''\\n\\n try {\\n if (fs.existsSync(EXAMPLES_SOURCE_DIR)) {\\n const files = fs.readdirSync(EXAMPLES_SOURCE_DIR)\\n\\n files\\n .filter(\\n (file) => file.endsWith('.ts') && file.startsWith('diff-reviewer-'),\\n )\\n .forEach((filename) => {\\n const fullPath = path.join(EXAMPLES_SOURCE_DIR, filename)\\n const content = fs.readFileSync(fullPath, 'utf8')\\n exampleAgentContents[filename] = content\\n })\\n\\n const starterTemplatePath = path.join(\\n EXAMPLES_SOURCE_DIR,\\n STARTER_TEMPLATE_SOURCE_FILE,\\n )\\n if (fs.existsSync(starterTemplatePath)) {\\n starterTemplateContent = fs.readFileSync(starterTemplatePath, 'utf8')\\n }\\n } else {\\n console.warn(\\n `Example agents directory does not exist: ${EXAMPLES_SOURCE_DIR}`,\\n )\\n }\\n } catch (error) {\\n console.warn('Could not read example agents:', error)\\n }\\n\\n return {\\n model,\\n displayName: 'Bob the Agent Builder',\\n spawnPurposePrompt:\\n 'Enhanced base agent that can create custom agents and handle all coding tasks with deterministic agent creation behavior',\\n inputSchema: {\\n prompt: z\\n .string()\\n .optional()\\n .describe(\\n 'What agent type you would like to create or edit. Include as many details as possible.',\\n ),\\n params: z\\n .object({\\n name: z.string().optional(),\\n purpose: z.string().optional(),\\n specialty: z.string().optional(),\\n model: z.string().optional(),\\n })\\n .passthrough()\\n .optional(),\\n },\\n outputMode: 'structured_output',\\n includeMessageHistory: false,\\n toolNames: [\\n 'write_file',\\n 'str_replace',\\n 'run_terminal_command',\\n 'read_files',\\n 'code_search',\\n 'spawn_agents',\\n 'add_message',\\n 'set_output',\\n 'end_turn',\\n ] satisfies ToolName[],\\n\\n systemPrompt: [\\n '# Bob the Agent Builder',\\n '',\\n 'You are an expert agent builder specialized in creating new agent templates for the codebuff system. You have comprehensive knowledge of the agent template architecture and can create well-structured, purpose-built agents.',\\n '',\\n '## Environment Setup Complete',\\n '',\\n 'Your environment has been automatically prepared with:',\\n '- Agent template type definitions in `.agents/types/agent-definition.d.ts`',\\n '- Tool type definitions in `.agents/types/tools.d.ts`',\\n '- Diff-reviewer examples in `.agents/examples/` for reference',\\n '- A starter custom agent template at `.agents/your-custom-agent.ts`',\\n '',\\n 'All necessary files are now available in your working directory.',\\n '',\\n '## Complete Agent Template Type Definitions',\\n '',\\n 'Here are the complete TypeScript type definitions for creating custom Codebuff agents:',\\n '```typescript',\\n agentTemplateContent,\\n '```',\\n '',\\n '## Available Tools Type Definitions',\\n '',\\n 'Here are the complete TypeScript type definitions for all available tools:',\\n '',\\n '```typescript',\\n toolDefinitionsContent,\\n '```',\\n '',\\n '## Agent Template Patterns:',\\n '',\\n '1. **Base Agent Pattern**: Full-featured agents with comprehensive tool access',\\n '2. **Specialized Agent Pattern**: Focused agents with limited tool sets',\\n '3. **Thinking Agent Pattern**: Agents that spawn thinker sub-agents',\\n '4. **Research Agent Pattern**: Agents that start with web search',\\n '',\\n '## Best Practices:',\\n '',\\n '1. **Use as few fields as possible**: Leave out fields that are not needed to reduce complexity',\\n '2. **Minimal Tools**: Only include tools the agent actually needs',\\n '3. **Clear and Concise Prompts**: Write clear, specific prompts that have no unnecessary words',\\n '4. **Consistent Naming**: Follow naming conventions (kebab-case for IDs)',\\n '5. **Appropriate Model**: Choose the right model for the task complexity. Default is claude-4-sonnet-20250522 for medium-high complexity tasks, and openai/gpt-5 for all other tasks.',\\n '',\\n '## Your Task:',\\n 'When asked to create an agent template, you should:',\\n \\\"1. Understand the requested agent's purpose and capabilities\\\",\\n \\\"2. Choose appropriate tools for the agent's function\\\",\\n '3. Write a comprehensive system prompt',\\n `4. Create the complete agent template file in ${AGENT_TEMPLATES_DIR}`,\\n '5. Ensure the template follows all conventions and best practices',\\n '6. Use the AgentDefinition interface for the configuration',\\n '7. Start the file with: import type { AgentDefinition } from \\\"./types/agent-definition.d.ts\\\"',\\n '',\\n 'Create agent templates that are focused, efficient, and well-documented. Always import the AgentDefinition type and export a default configuration object.',\\n ].join('\\\\n'),\\n instructionsPrompt: `You are helping to create or edit an agent template. The user will describe what kind of agent they want to create or how they want to modify an existing agent.\\n\\n## Environment Ready\\n\\nYour environment has been automatically set up with:\\n- Type definitions in \\\\`.agents/types/\\\\`\\n- Diff-reviewer examples in \\\\`.agents/examples/\\\\`\\n- A starter custom agent template at \\\\`.agents/your-custom-agent.ts\\\\`\\n\\nYou can now proceed directly to agent creation or editing.\\n\\n## Example Agents Available\\n\\nThree diff-reviewer examples are available in \\\\`.agents/examples/\\\\`. These can serve as examples of well-made agents at different stages of complexity.\\n\\n**IMPORTANT**: Examine these examples to find connections and patterns that relate to the user's request. Look for:\\n- Similar tool combinations\\n- Comparable complexity levels\\n- Related functionality patterns\\n- Appropriate model choices\\n- Relevant prompt structures\\n\\nUse these examples as inspiration and starting points, adapting their patterns to fit the user's specific needs.\\n\\n## Starter Template Available\\n\\nA starter custom agent file is available at \\\\`.agents/your-custom-agent.ts\\\\`. You can either modify this file directly or use it as a reference for creating a new agent.\\n\\n## For New Agents\\n\\nAnalyze their request and create a complete agent template that:\\n- Has a clear purpose and appropriate capabilities\\n- Leaves out fields that are not needed\\n- Uses only the tools it needs\\n- Follows naming conventions\\n- Is properly structured\\n- Draws inspiration from relevant example agents\\n\\n## For Creating New Agents\\n\\nThe agent builder is focused on creating new agent templates based on user specifications.\\n\\nIMPORTANT: Always end your response with the end_turn tool when you have completed the agent creation or editing task.`,\\n stepPrompt: '',\\n\\n handleSteps: function* () {\\n // Step 1: Create directory structure\\n yield {\\n toolName: 'run_terminal_command',\\n args: {\\n command: `mkdir -p ${TYPES_DIR} && mkdir -p ${EXAMPLES_DIR}`,\\n process_type: 'SYNC',\\n timeout_seconds: 10,\\n },\\n }\\n\\n // Step 2: Write the AGENT_DEFINITION_FILE with the template content\\n yield {\\n toolName: 'write_file',\\n args: {\\n path: TEMPLATE_TYPES_PATH,\\n instructions: 'Create agent template type definitions file',\\n content: agentTemplateContent,\\n },\\n }\\n\\n // Step 3: Write the tool definitions file (copy from existing tools.d.ts)\\n yield {\\n toolName: 'write_file',\\n args: {\\n path: TOOL_DEFINITIONS_PATH,\\n instructions: 'Create tools type file',\\n content: toolDefinitionsContent,\\n },\\n }\\n\\n // Step 4: Add message about reading example files and then read them\\n yield {\\n toolName: 'add_message',\\n args: {\\n role: 'assistant',\\n content:\\n \\\"I'll review the starter template and diff-reviewer examples, then help you create your agent.\\\",\\n },\\n }\\n\\n // Step 5: Copy example agent files to .agents/examples/\\n for (const [filename, content] of Object.entries(exampleAgentContents)) {\\n if (content) {\\n yield {\\n toolName: 'write_file',\\n args: {\\n path: `${EXAMPLES_DIR}/${filename}`,\\n instructions: `Copy example agent file ${filename}`,\\n content: content,\\n },\\n }\\n }\\n }\\n\\n // Step 6: Copy starter template directly to .agents/\\n if (starterTemplateContent) {\\n yield {\\n toolName: 'write_file',\\n args: {\\n path: `${AGENT_TEMPLATES_DIR}/${STARTER_TEMPLATE_DEST_FILE}`,\\n instructions: `Copy starter custom agent template ${STARTER_TEMPLATE_DEST_FILE}`,\\n content: starterTemplateContent,\\n },\\n }\\n }\\n\\n // Step 7: Complete agent creation process\\n yield 'STEP_ALL'\\n },\\n }\\n}\\n\"\n}\n\n\n{\n \"cb_tool_name\": \"str_replace\",\n \"path\": \"common/src/constants/agents.ts\",\n \"replacements\": [\n {\n \"old\": \" dry_run: {\\n displayName: 'Sketch the Dry Runner',\\n purpose: 'Agent that takes a plan and try to implement it in a dry run.',\\n hidden: true,\\n } as const,\\n\",\n \"new\": \"\"\n },\n {\n \"old\": \" agent_builder: {\\n displayName: 'Bob the Agent Builder',\\n purpose: 'Creates new agent templates for the codebuff mult-agent system',\\n hidden: false,\\n } as const,\\n\",\n \"new\": \" agent_builder: {\\n displayName: 'Bob the Agent Builder',\\n purpose: 'Creates new agent templates for the codebuff multi-agent system',\\n hidden: false,\\n } as const,\\n\"\n }\n ]\n}\n\n\n{\n \"cb_tool_name\": \"write_file\",\n \"path\": \".agents/examples/diff-reviewer-1.ts\",\n \"instructions\": \"Refresh diff-reviewer-1 example to use current Anthropic model.\",\n \"content\": \"import type { AgentDefinition } from '../types/agent-definition'\\n\\nconst definition: AgentDefinition = {\\n id: 'diff-reviewer-1',\\n\\n displayName: 'Diff Reviewer (Level 1)',\\n model: 'anthropic/claude-4-sonnet-20250522',\\n toolNames: ['read_files', 'run_terminal_command'],\\n\\n spawnPurposePrompt:\\n 'Spawn when you need to review code changes in the git diff',\\n\\n instructionsPrompt: `Execute the following steps:\\n1. Run git diff\\n2. Read the files that have changed\\n3. Review the changes and suggest improvements`,\\n}\\n\\nexport default definition\\n\"\n}\n\n\n{\n \"cb_tool_name\": \"write_file\",\n \"path\": \".agents/examples/diff-reviewer-2.ts\",\n \"instructions\": \"Refresh diff-reviewer-2 example to use current Anthropic model.\",\n \"content\": \"import type {\\n AgentDefinition,\\n AgentStepContext,\\n} from '../types/agent-definition'\\n\\nconst definition: AgentDefinition = {\\n id: 'diff-reviewer-2',\\n displayName: 'Diff Reviewer (Level 2)',\\n model: 'anthropic/claude-4-sonnet-20250522',\\n\\n inputSchema: {\\n prompt: {\\n type: 'string',\\n description:\\n 'Please provide a short description of the changes you want to review',\\n },\\n },\\n toolNames: ['read_files', 'run_terminal_command'],\\n\\n spawnPurposePrompt:\\n 'Spawn when you need to review code changes in the git diff',\\n\\n systemPrompt:\\n 'You are an expert software developer. Your job is to review code changes and provide helpful feedback.',\\n\\n instructionsPrompt: `Execute the following steps:\\n1. Run git diff\\n2. Read the files that have changed\\n3. Review the changes and suggest improvements\\n\\nUse the following guidelines while reviewing the changes:\\n- Find ways to simplify the code\\n- Reuse existing code as much as possible instead of writing new code\\n- Preserve as much behavior as possible in the existing code\\n- Prefer changing as few lines of code as possible\\n- Look for opportunities to improve the code's readability\\n- Look for logical errors in the code\\n- Look for missed cases in the code\\n- Look for any other bugs`,\\n\\n handleSteps: function* ({ prompt }: AgentStepContext) {\\n // Step 1: Run git diff immediately. Saves the agent a step, lowering cost and latency!\\n yield {\\n toolName: 'run_terminal_command',\\n args: {\\n command: 'git diff',\\n },\\n }\\n\\n // Step 2: Let AI run the rest of the steps!\\n yield 'STEP_ALL'\\n },\\n}\\n\\nexport default definition\\n\"\n}\n\n\n{\n \"cb_tool_name\": \"write_file\",\n \"path\": \".agents/examples/diff-reviewer-3.ts\",\n \"instructions\": \"Refresh diff-reviewer-3 example to use current Anthropic model, correct file-explorer spawn target, and streamline final step behavior.\",\n \"content\": \"import type {\\n AgentDefinition,\\n AgentStepContext,\\n} from '../types/agent-definition'\\n\\nconst definition: AgentDefinition = {\\n id: 'diff-reviewer-3',\\n\\n displayName: 'Diff Reviewer (Level 3)',\\n model: 'anthropic/claude-4-sonnet-20250522',\\n inputSchema: {\\n prompt: {\\n type: 'string',\\n description:\\n 'Please provide a short description of the changes you want to review',\\n },\\n },\\n outputMode: 'last_message',\\n\\n toolNames: ['read_files', 'run_terminal_command', 'spawn_agents'],\\n spawnableAgents: ['file-explorer'],\\n\\n spawnPurposePrompt:\\n 'Spawn when you need to review code changes in the git diff',\\n\\n systemPrompt:\\n 'You are an expert software developer. Your job is to review code changes and provide helpful feedback.',\\n\\n instructionsPrompt: `Review the changes and suggest improvements.\\n\\nUse the following guidelines while reviewing the changes:\\n- Find ways to simplify the code\\n- Reuse existing code as much as possible instead of writing new code\\n- Preserve as much behavior as possible in the existing code\\n- Prefer changing as few lines of code as possible\\n- Look for opportunities to improve the code's readability\\n- Look for logical errors in the code\\n- Look for missed cases in the code\\n- Look for any other bugs`,\\n\\n handleSteps: function* ({ prompt }: AgentStepContext) {\\n // Step 1: Get list of changed files from git diff --name-only\\n const { toolResult: gitDiffFilesResult } = yield {\\n toolName: 'run_terminal_command',\\n args: {\\n command: 'git diff --name-only',\\n },\\n }\\n\\n const changedFiles = (gitDiffFilesResult || '')\\n .split('\\\\n')\\n .map((line) => line.trim())\\n .filter((line) => line && !line.startsWith('??') && !line.includes('OSC'))\\n\\n // Step 2: Read changed files\\n if (changedFiles.length > 0) {\\n yield {\\n toolName: 'read_files',\\n args: {\\n paths: changedFiles,\\n },\\n }\\n }\\n\\n // Step 3: Run full git diff to see the actual changes\\n yield {\\n toolName: 'run_terminal_command',\\n args: {\\n command: 'git diff',\\n },\\n }\\n\\n // Step 4: Spawn file explorer for broader context if needed\\n yield {\\n toolName: 'spawn_agents',\\n args: {\\n agents: [\\n {\\n agent_type: 'file-explorer',\\n prompt: `Find any additional codebase context needed to review these changes. Review focus: ${prompt || ''}`,\\n params: {\\n prompts: [\\n 'Any modules/classes/functions referenced by the diff',\\n 'Relevant tests or test helpers for the changed code',\\n 'Related config or shared utilities that might be impacted',\\n ],\\n },\\n },\\n ],\\n },\\n }\\n\\n // Step 5: Let the AI produce the final review in a single final step\\n yield 'STEP_ALL'\\n },\\n}\\n\\nexport default definition\\n\"\n}\n\n\n{\n \"cb_tool_name\": \"write_file\",\n \"path\": \"common/src/util/examples/diff-reviewer-1.ts\",\n \"instructions\": \"Refresh common diff-reviewer-1 example to use current Anthropic model.\",\n \"content\": \"import type { AgentDefinition } from '../types/agent-definition'\\n\\nconst definition: AgentDefinition = {\\n id: 'diff-reviewer-1',\\n\\n displayName: 'Diff Reviewer (Level 1)',\\n model: 'anthropic/claude-4-sonnet-20250522',\\n toolNames: ['read_files', 'run_terminal_command'],\\n\\n spawnPurposePrompt:\\n 'Spawn when you need to review code changes in the git diff',\\n\\n instructionsPrompt: `Execute the following steps:\\n1. Run git diff\\n2. Read the files that have changed\\n3. Review the changes and suggest improvements`,\\n}\\n\\nexport default definition\\n\"\n}\n\n\n{\n \"cb_tool_name\": \"write_file\",\n \"path\": \"common/src/util/examples/diff-reviewer-2.ts\",\n \"instructions\": \"Refresh common diff-reviewer-2 example to use current Anthropic model.\",\n \"content\": \"import type {\\n AgentDefinition,\\n AgentStepContext,\\n} from '../types/agent-definition'\\n\\nconst definition: AgentDefinition = {\\n id: 'diff-reviewer-2',\\n displayName: 'Diff Reviewer (Level 2)',\\n model: 'anthropic/claude-4-sonnet-20250522',\\n\\n inputSchema: {\\n prompt: {\\n type: 'string',\\n description:\\n 'Please provide a short description of the changes you want to review',\\n },\\n },\\n toolNames: ['read_files', 'run_terminal_command'],\\n\\n spawnPurposePrompt:\\n 'Spawn when you need to review code changes in the git diff',\\n\\n systemPrompt:\\n 'You are an expert software developer. Your job is to review code changes and provide helpful feedback.',\\n\\n instructionsPrompt: `Execute the following steps:\\n1. Run git diff\\n2. Read the files that have changed\\n3. Review the changes and suggest improvements\\n\\nUse the following guidelines while reviewing the changes:\\n- Find ways to simplify the code\\n- Reuse existing code as much as possible instead of writing new code\\n- Preserve as much behavior as possible in the existing code\\n- Prefer changing as few lines of code as possible\\n- Look for opportunities to improve the code's readability\\n- Look for logical errors in the code\\n- Look for missed cases in the code\\n- Look for any other bugs`,\\n\\n handleSteps: function* ({ prompt }: AgentStepContext) {\\n // Step 1: Run git diff immediately. Saves the agent a step, lowering cost and latency!\\n yield {\\n toolName: 'run_terminal_command',\\n args: {\\n command: 'git diff',\\n },\\n }\\n\\n // Step 2: Let AI run the rest of the steps!\\n yield 'STEP_ALL'\\n },\\n}\\n\\nexport default definition\\n\"\n}\n\n\n{\n \"cb_tool_name\": \"write_file\",\n \"path\": \"common/src/util/examples/diff-reviewer-3.ts\",\n \"instructions\": \"Refresh common diff-reviewer-3 example to use current Anthropic model, correct file-explorer spawn target, and streamline final step behavior.\",\n \"content\": \"import type {\\n AgentDefinition,\\n AgentStepContext,\\n} from '../types/agent-definition'\\n\\nconst definition: AgentDefinition = {\\n id: 'diff-reviewer-3',\\n\\n displayName: 'Diff Reviewer (Level 3)',\\n model: 'anthropic/claude-4-sonnet-20250522',\\n inputSchema: {\\n prompt: {\\n type: 'string',\\n description:\\n 'Please provide a short description of the changes you want to review',\\n },\\n },\\n outputMode: 'last_message',\\n\\n toolNames: ['read_files', 'run_terminal_command', 'spawn_agents'],\\n spawnableAgents: ['file-explorer'],\\n\\n spawnPurposePrompt:\\n 'Spawn when you need to review code changes in the git diff',\\n\\n systemPrompt:\\n 'You are an expert software developer. Your job is to review code changes and provide helpful feedback.',\\n\\n instructionsPrompt: `Review the changes and suggest improvements.\\n\\nUse the following guidelines while reviewing the changes:\\n- Find ways to simplify the code\\n- Reuse existing code as much as possible instead of writing new code\\n- Preserve as much behavior as possible in the existing code\\n- Prefer changing as few lines of code as possible\\n- Look for opportunities to improve the code's readability\\n- Look for logical errors in the code\\n- Look for missed cases in the code\\n- Look for any other bugs`,\\n\\n handleSteps: function* ({ prompt }: AgentStepContext) {\\n // Step 1: Get list of changed files from git diff --name-only\\n const { toolResult: gitDiffFilesResult } = yield {\\n toolName: 'run_terminal_command',\\n args: {\\n command: 'git diff --name-only',\\n },\\n }\\n\\n const changedFiles = (gitDiffFilesResult || '')\\n .split('\\\\n')\\n .map((line) => line.trim())\\n .filter((line) => line && !line.startsWith('??') && !line.includes('OSC'))\\n\\n // Step 2: Read changed files\\n if (changedFiles.length > 0) {\\n yield {\\n toolName: 'read_files',\\n args: {\\n paths: changedFiles,\\n },\\n }\\n }\\n\\n // Step 3: Run full git diff to see the actual changes\\n yield {\\n toolName: 'run_terminal_command',\\n args: {\\n command: 'git diff',\\n },\\n }\\n\\n // Step 4: Spawn file explorer for broader context if needed\\n yield {\\n toolName: 'spawn_agents',\\n args: {\\n agents: [\\n {\\n agent_type: 'file-explorer',\\n prompt: `Find any additional codebase context needed to review these changes. Review focus: ${prompt || ''}`,\\n params: {\\n prompts: [\\n 'Any modules/classes/functions referenced by the diff',\\n 'Relevant tests or test helpers for the changed code',\\n 'Related config or shared utilities that might be impacted',\\n ],\\n },\\n },\\n ],\\n },\\n }\\n\\n // Step 5: Let the AI produce the final review in a single final step\\n yield 'STEP_ALL'\\n },\\n}\\n\\nexport default definition\\n\"\n}\n\n\n{\n \"cb_tool_name\": \"write_file\",\n \"path\": \".agents/your-custom-agent.ts\",\n \"instructions\": \"Add a new starter custom agent (Git Committer scaffold) in the top-level .agents directory, ready to run and publish.\",\n \"content\": \"import { publisher, version } from './constants'\\n\\nimport type {\\n AgentDefinition,\\n AgentStepContext,\\n} from './types/agent-definition'\\n\\nconst definition: AgentDefinition = {\\n id: 'your-custom-agent',\\n version,\\n publisher,\\n\\n displayName: 'Your Custom Agent (Git Committer)',\\n model: 'anthropic/claude-4-sonnet-20250522',\\n toolNames: ['read_files', 'run_terminal_command', 'add_message', 'end_turn'],\\n\\n inputSchema: {\\n prompt: {\\n type: 'string',\\n description: 'What changes to commit',\\n },\\n },\\n\\n includeMessageHistory: false,\\n outputMode: 'last_message',\\n\\n spawnPurposePrompt:\\n 'Spawn when you need to commit code changes to git with an appropriate commit message',\\n\\n systemPrompt:\\n 'You are an expert software developer. Your job is to create a git commit with a really good commit message.',\\n\\n instructionsPrompt:\\n 'Follow the steps to create a good commit: analyze changes with git diff and git log, read relevant files for context, stage appropriate files, and create a commit with proper formatting including the Codebuff footer.',\\n\\n handleSteps: function* ({ prompt }: AgentStepContext) {\\n // Step 1: Analyze the changes\\n yield {\\n toolName: 'run_terminal_command',\\n args: {\\n command: 'git diff',\\n process_type: 'SYNC',\\n timeout_seconds: 30,\\n },\\n }\\n\\n yield {\\n toolName: 'run_terminal_command',\\n args: {\\n command: 'git log --oneline -10',\\n process_type: 'SYNC',\\n timeout_seconds: 30,\\n },\\n }\\n\\n // Step 2: Let the AI decide what to read + what to stage based on the user's intent\\n yield {\\n toolName: 'add_message',\\n args: {\\n role: 'assistant',\\n content: `Goal: ${prompt}\\\\n\\\\nI'll read any relevant files and stage the right changes next.`,\\n },\\n }\\n\\n yield 'STEP'\\n\\n // Step 3: Let the AI create the commit with proper formatting\\n yield {\\n toolName: 'add_message',\\n args: {\\n role: 'assistant',\\n content:\\n \\\"Now I'll create the commit with a high-quality message and the proper Codebuff footer format.\\\",\\n },\\n }\\n\\n yield 'STEP_ALL'\\n },\\n}\\n\\nexport default definition\\n\"\n}\n\n\n{\n \"cb_tool_name\": \"write_file\",\n \"path\": \"common/src/util/examples/your-custom-agent.ts.txt\",\n \"instructions\": \"Add starter custom agent template content for the agent builder to copy into .agents/your-custom-agent.ts.\",\n \"content\": \"import { publisher, version } from './constants'\\n\\nimport type {\\n AgentDefinition,\\n AgentStepContext,\\n} from './types/agent-definition'\\n\\nconst definition: AgentDefinition = {\\n id: 'your-custom-agent',\\n version,\\n publisher,\\n\\n displayName: 'Your Custom Agent (Git Committer)',\\n model: 'anthropic/claude-4-sonnet-20250522',\\n toolNames: ['read_files', 'run_terminal_command', 'add_message', 'end_turn'],\\n\\n inputSchema: {\\n prompt: {\\n type: 'string',\\n description: 'What changes to commit',\\n },\\n },\\n\\n includeMessageHistory: false,\\n outputMode: 'last_message',\\n\\n spawnPurposePrompt:\\n 'Spawn when you need to commit code changes to git with an appropriate commit message',\\n\\n systemPrompt:\\n 'You are an expert software developer. Your job is to create a git commit with a really good commit message.',\\n\\n instructionsPrompt:\\n 'Follow the steps to create a good commit: analyze changes with git diff and git log, read relevant files for context, stage appropriate files, and create a commit with proper formatting including the Codebuff footer.',\\n\\n handleSteps: function* ({ prompt }: AgentStepContext) {\\n // Step 1: Analyze the changes\\n yield {\\n toolName: 'run_terminal_command',\\n args: {\\n command: 'git diff',\\n process_type: 'SYNC',\\n timeout_seconds: 30,\\n },\\n }\\n\\n yield {\\n toolName: 'run_terminal_command',\\n args: {\\n command: 'git log --oneline -10',\\n process_type: 'SYNC',\\n timeout_seconds: 30,\\n },\\n }\\n\\n // Step 2: Let the AI decide what to read + what to stage based on the user's intent\\n yield {\\n toolName: 'add_message',\\n args: {\\n role: 'assistant',\\n content: `Goal: ${prompt}\\\\n\\\\nI'll read any relevant files and stage the right changes next.`,\\n },\\n }\\n\\n yield 'STEP'\\n\\n // Step 3: Let the AI create the commit with proper formatting\\n yield {\\n toolName: 'add_message',\\n args: {\\n role: 'assistant',\\n content:\\n \\\"Now I'll create the commit with a high-quality message and the proper Codebuff footer format.\\\",\\n },\\n }\\n\\n yield 'STEP_ALL'\\n },\\n}\\n\\nexport default definition\\n\"\n}\n", - "toolResults": [ - { - "file": "backend/src/templates/agents/agent-builder.ts", - "message": "Updated file", - "unifiedDiff": "@@ -1,12 +1,8 @@\n import * as fs from 'fs'\n import * as path from 'path'\n \n-import {\n- AGENT_TEMPLATES_DIR,\n- openrouterModels,\n- AGENT_DEFINITION_FILE,\n-} from '@codebuff/common/constants'\n+import { AGENT_TEMPLATES_DIR, AGENT_DEFINITION_FILE } from '@codebuff/common/constants'\n import { AgentTemplateTypes } from '@codebuff/common/types/session-state'\n import z from 'zod/v4'\n \n import type { AgentTemplate } from '../types'\n@@ -19,9 +15,8 @@\n // Import to validate path exists at compile time\n import(TEMPLATE_RELATIVE_PATH)\n \n const TEMPLATE_PATH = path.join(__dirname, TEMPLATE_RELATIVE_PATH)\n-const DEFAULT_MODEL = openrouterModels.openrouter_claude_sonnet_4\n const TYPES_DIR = path.join(AGENT_TEMPLATES_DIR, 'types')\n const EXAMPLES_DIR = path.join(AGENT_TEMPLATES_DIR, 'examples')\n const TEMPLATE_TYPES_PATH = path.join(TYPES_DIR, AGENT_DEFINITION_FILE)\n const TOOL_DEFINITIONS_FILE = 'tools.d.ts'\n@@ -32,9 +27,9 @@\n const STARTER_TEMPLATE_DEST_FILE = 'your-custom-agent.ts'\n \n export const agentBuilder = (\n model: Model,\n- allAvailableAgents?: string[],\n+ _allAvailableAgents?: string[],\n ): Omit => {\n // Read the AGENT_CONFIG_FILE content dynamically\n // The import above ensures this path exists at compile time\n let agentTemplateContent = ''\n@@ -57,9 +52,9 @@\n console.warn(`Could not read tools.d.ts from common:`, error)\n toolDefinitionsContent = '// Tool definitions not available'\n }\n \n- // Read example agent files from common package\n+ // Read example agent files + starter template from common package\n const exampleAgentContents: Record = {}\n let starterTemplateContent = ''\n \n try {\n@@ -229,9 +224,9 @@\n \n IMPORTANT: Always end your response with the end_turn tool when you have completed the agent creation or editing task.`,\n stepPrompt: '',\n \n- handleSteps: function* ({ agentState, prompt, params }) {\n+ handleSteps: function* () {\n // Step 1: Create directory structure\n yield {\n toolName: 'run_terminal_command',\n args: {\n" - }, - { - "file": "common/src/constants/agents.ts", - "message": "Updated file", - "unifiedDiff": "@@ -64,21 +64,16 @@\n displayName: 'Peter Plan the Planner',\n purpose: 'Agent that formulates a comprehensive plan to a prompt.',\n hidden: true,\n } as const,\n- dry_run: {\n- displayName: 'Sketch the Dry Runner',\n- purpose: 'Agent that takes a plan and try to implement it in a dry run.',\n- hidden: true,\n- } as const,\n reviewer: {\n displayName: 'Nit Pick Nick the Reviewer',\n purpose:\n 'Reviews file changes and responds with critical feedback. Use this after making any significant change to the codebase.',\n } as const,\n agent_builder: {\n displayName: 'Bob the Agent Builder',\n- purpose: 'Creates new agent templates for the codebuff mult-agent system',\n+ purpose: 'Creates new agent templates for the codebuff multi-agent system',\n hidden: false,\n } as const,\n } as const satisfies Partial<\n Record<\n" - }, - { - "file": ".agents/examples/diff-reviewer-1.ts", - "message": "Updated file", - "unifiedDiff": "@@ -3,9 +3,9 @@\n const definition: AgentDefinition = {\n id: 'diff-reviewer-1',\n \n displayName: 'Diff Reviewer (Level 1)',\n- model: 'openai/gpt-5',\n+ model: 'anthropic/claude-4-sonnet-20250522',\n toolNames: ['read_files', 'run_terminal_command'],\n \n spawnPurposePrompt:\n 'Spawn when you need to review code changes in the git diff',\n" - }, - { - "file": ".agents/examples/diff-reviewer-2.ts", - "message": "Updated file", - "unifiedDiff": "@@ -5,9 +5,9 @@\n \n const definition: AgentDefinition = {\n id: 'diff-reviewer-2',\n displayName: 'Diff Reviewer (Level 2)',\n- model: 'openai/gpt-5',\n+ model: 'anthropic/claude-4-sonnet-20250522',\n \n inputSchema: {\n prompt: {\n type: 'string',\n@@ -37,9 +37,9 @@\n - Look for logical errors in the code\n - Look for missed cases in the code\n - Look for any other bugs`,\n \n- handleSteps: function* ({ agentState, prompt, params }: AgentStepContext) {\n+ handleSteps: function* ({ prompt }: AgentStepContext) {\n // Step 1: Run git diff immediately. Saves the agent a step, lowering cost and latency!\n yield {\n toolName: 'run_terminal_command',\n args: {\n" - }, - { - "file": ".agents/examples/diff-reviewer-3.ts", - "message": "Updated file", - "unifiedDiff": "@@ -6,9 +6,9 @@\n const definition: AgentDefinition = {\n id: 'diff-reviewer-3',\n \n displayName: 'Diff Reviewer (Level 3)',\n- model: 'openai/gpt-5',\n+ model: 'anthropic/claude-4-sonnet-20250522',\n inputSchema: {\n prompt: {\n type: 'string',\n description:\n@@ -17,9 +17,9 @@\n },\n outputMode: 'last_message',\n \n toolNames: ['read_files', 'run_terminal_command', 'spawn_agents'],\n- spawnableAgents: ['james/file-explorer@0.1.3'],\n+ spawnableAgents: ['file-explorer'],\n \n spawnPurposePrompt:\n 'Spawn when you need to review code changes in the git diff',\n \n@@ -37,24 +37,23 @@\n - Look for logical errors in the code\n - Look for missed cases in the code\n - Look for any other bugs`,\n \n- handleSteps: function* ({ agentState, prompt, params }: AgentStepContext) {\n+ handleSteps: function* ({ prompt }: AgentStepContext) {\n // Step 1: Get list of changed files from git diff --name-only\n const { toolResult: gitDiffFilesResult } = yield {\n toolName: 'run_terminal_command',\n args: {\n command: 'git diff --name-only',\n },\n }\n \n- // Then, extract file paths from the result\n const changedFiles = (gitDiffFilesResult || '')\n .split('\\n')\n .map((line) => line.trim())\n .filter((line) => line && !line.startsWith('??') && !line.includes('OSC'))\n \n- // Step 2: Read the files\n+ // Step 2: Read changed files\n if (changedFiles.length > 0) {\n yield {\n toolName: 'read_files',\n args: {\n@@ -70,31 +69,30 @@\n command: 'git diff',\n },\n }\n \n- // Step 4: Put words in the AI's mouth to get it to spawn the file explorer.\n+ // Step 4: Spawn file explorer for broader context if needed\n yield {\n- toolName: 'add_message',\n+ toolName: 'spawn_agents',\n args: {\n- role: 'assistant',\n- content:\n- 'Now I will spawn a file explorer to find any missing codebase context.',\n+ agents: [\n+ {\n+ agent_type: 'file-explorer',\n+ prompt: `Find any additional codebase context needed to review these changes. Review focus: ${prompt || ''}`,\n+ params: {\n+ prompts: [\n+ 'Any modules/classes/functions referenced by the diff',\n+ 'Relevant tests or test helpers for the changed code',\n+ 'Related config or shared utilities that might be impacted',\n+ ],\n+ },\n+ },\n+ ],\n },\n }\n \n- yield 'STEP'\n-\n- // Step 5: Put words in the AI's mouth to review the changes.\n- yield {\n- toolName: 'add_message',\n- args: {\n- role: 'assistant',\n- content: 'Here is my comprehensive review of the changes.',\n- },\n- }\n-\n- // Step 6: Let AI review the changes in a final step. (The last message is also the agent's output.)\n- yield 'STEP'\n+ // Step 5: Let the AI produce the final review in a single final step\n+ yield 'STEP_ALL'\n },\n }\n \n export default definition\n" - }, - { - "file": "common/src/util/examples/diff-reviewer-1.ts", - "message": "Updated file", - "unifiedDiff": "@@ -3,9 +3,9 @@\n const definition: AgentDefinition = {\n id: 'diff-reviewer-1',\n \n displayName: 'Diff Reviewer (Level 1)',\n- model: 'openai/gpt-5',\n+ model: 'anthropic/claude-4-sonnet-20250522',\n toolNames: ['read_files', 'run_terminal_command'],\n \n spawnPurposePrompt:\n 'Spawn when you need to review code changes in the git diff',\n" - }, - { - "file": "common/src/util/examples/diff-reviewer-2.ts", - "message": "Updated file", - "unifiedDiff": "@@ -5,9 +5,9 @@\n \n const definition: AgentDefinition = {\n id: 'diff-reviewer-2',\n displayName: 'Diff Reviewer (Level 2)',\n- model: 'openai/gpt-5',\n+ model: 'anthropic/claude-4-sonnet-20250522',\n \n inputSchema: {\n prompt: {\n type: 'string',\n@@ -37,9 +37,9 @@\n - Look for logical errors in the code\n - Look for missed cases in the code\n - Look for any other bugs`,\n \n- handleSteps: function* ({ agentState, prompt, params }: AgentStepContext) {\n+ handleSteps: function* ({ prompt }: AgentStepContext) {\n // Step 1: Run git diff immediately. Saves the agent a step, lowering cost and latency!\n yield {\n toolName: 'run_terminal_command',\n args: {\n" - }, - { - "file": "common/src/util/examples/diff-reviewer-3.ts", - "message": "Updated file", - "unifiedDiff": "@@ -6,9 +6,9 @@\n const definition: AgentDefinition = {\n id: 'diff-reviewer-3',\n \n displayName: 'Diff Reviewer (Level 3)',\n- model: 'openai/gpt-5',\n+ model: 'anthropic/claude-4-sonnet-20250522',\n inputSchema: {\n prompt: {\n type: 'string',\n description:\n@@ -17,9 +17,9 @@\n },\n outputMode: 'last_message',\n \n toolNames: ['read_files', 'run_terminal_command', 'spawn_agents'],\n- spawnableAgents: ['james/file-explorer@0.1.3'],\n+ spawnableAgents: ['file-explorer'],\n \n spawnPurposePrompt:\n 'Spawn when you need to review code changes in the git diff',\n \n@@ -37,24 +37,23 @@\n - Look for logical errors in the code\n - Look for missed cases in the code\n - Look for any other bugs`,\n \n- handleSteps: function* ({ agentState, prompt, params }: AgentStepContext) {\n+ handleSteps: function* ({ prompt }: AgentStepContext) {\n // Step 1: Get list of changed files from git diff --name-only\n const { toolResult: gitDiffFilesResult } = yield {\n toolName: 'run_terminal_command',\n args: {\n command: 'git diff --name-only',\n },\n }\n \n- // Then, extract file paths from the result\n const changedFiles = (gitDiffFilesResult || '')\n .split('\\n')\n .map((line) => line.trim())\n .filter((line) => line && !line.startsWith('??') && !line.includes('OSC'))\n \n- // Step 2: Read the files\n+ // Step 2: Read changed files\n if (changedFiles.length > 0) {\n yield {\n toolName: 'read_files',\n args: {\n@@ -70,31 +69,30 @@\n command: 'git diff',\n },\n }\n \n- // Step 4: Put words in the AI's mouth to get it to spawn the file explorer.\n+ // Step 4: Spawn file explorer for broader context if needed\n yield {\n- toolName: 'add_message',\n+ toolName: 'spawn_agents',\n args: {\n- role: 'assistant',\n- content:\n- 'Now I will spawn a file explorer to find any missing codebase context.',\n+ agents: [\n+ {\n+ agent_type: 'file-explorer',\n+ prompt: `Find any additional codebase context needed to review these changes. Review focus: ${prompt || ''}`,\n+ params: {\n+ prompts: [\n+ 'Any modules/classes/functions referenced by the diff',\n+ 'Relevant tests or test helpers for the changed code',\n+ 'Related config or shared utilities that might be impacted',\n+ ],\n+ },\n+ },\n+ ],\n },\n }\n \n- yield 'STEP'\n-\n- // Step 5: Put words in the AI's mouth to review the changes.\n- yield {\n- toolName: 'add_message',\n- args: {\n- role: 'assistant',\n- content: 'Here is my comprehensive review of the changes.',\n- },\n- }\n-\n- // Step 6: Let AI review the changes in a final step. (The last message is also the agent's output.)\n- yield 'STEP'\n+ // Step 5: Let the AI produce the final review in a single final step\n+ yield 'STEP_ALL'\n },\n }\n \n export default definition\n" - }, - { - "file": ".agents/your-custom-agent.ts", - "message": "Created new file", - "unifiedDiff": "import { publisher, version } from './constants'\n\nimport type {\n AgentDefinition,\n AgentStepContext,\n} from './types/agent-definition'\n\nconst definition: AgentDefinition = {\n id: 'your-custom-agent',\n version,\n publisher,\n\n displayName: 'Your Custom Agent (Git Committer)',\n model: 'anthropic/claude-4-sonnet-20250522',\n toolNames: ['read_files', 'run_terminal_command', 'add_message', 'end_turn'],\n\n inputSchema: {\n prompt: {\n type: 'string',\n description: 'What changes to commit',\n },\n },\n\n includeMessageHistory: false,\n outputMode: 'last_message',\n\n spawnPurposePrompt:\n 'Spawn when you need to commit code changes to git with an appropriate commit message',\n\n systemPrompt:\n 'You are an expert software developer. Your job is to create a git commit with a really good commit message.',\n\n instructionsPrompt:\n 'Follow the steps to create a good commit: analyze changes with git diff and git log, read relevant files for context, stage appropriate files, and create a commit with proper formatting including the Codebuff footer.',\n\n handleSteps: function* ({ prompt }: AgentStepContext) {\n // Step 1: Analyze the changes\n yield {\n toolName: 'run_terminal_command',\n args: {\n command: 'git diff',\n process_type: 'SYNC',\n timeout_seconds: 30,\n },\n }\n\n yield {\n toolName: 'run_terminal_command',\n args: {\n command: 'git log --oneline -10',\n process_type: 'SYNC',\n timeout_seconds: 30,\n },\n }\n\n // Step 2: Let the AI decide what to read + what to stage based on the user's intent\n yield {\n toolName: 'add_message',\n args: {\n role: 'assistant',\n content: `Goal: ${prompt}\\n\\nI'll read any relevant files and stage the right changes next.`,\n },\n }\n\n yield 'STEP'\n\n // Step 3: Let the AI create the commit with proper formatting\n yield {\n toolName: 'add_message',\n args: {\n role: 'assistant',\n content:\n \"Now I'll create the commit with a high-quality message and the proper Codebuff footer format.\",\n },\n }\n\n yield 'STEP_ALL'\n },\n}\n\nexport default definition\n" - }, - { - "file": "common/src/util/examples/your-custom-agent.ts.txt", - "message": "Created new file", - "unifiedDiff": "import { publisher, version } from './constants'\n\nimport type {\n AgentDefinition,\n AgentStepContext,\n} from './types/agent-definition'\n\nconst definition: AgentDefinition = {\n id: 'your-custom-agent',\n version,\n publisher,\n\n displayName: 'Your Custom Agent (Git Committer)',\n model: 'anthropic/claude-4-sonnet-20250522',\n toolNames: ['read_files', 'run_terminal_command', 'add_message', 'end_turn'],\n\n inputSchema: {\n prompt: {\n type: 'string',\n description: 'What changes to commit',\n },\n },\n\n includeMessageHistory: false,\n outputMode: 'last_message',\n\n spawnPurposePrompt:\n 'Spawn when you need to commit code changes to git with an appropriate commit message',\n\n systemPrompt:\n 'You are an expert software developer. Your job is to create a git commit with a really good commit message.',\n\n instructionsPrompt:\n 'Follow the steps to create a good commit: analyze changes with git diff and git log, read relevant files for context, stage appropriate files, and create a commit with proper formatting including the Codebuff footer.',\n\n handleSteps: function* ({ prompt }: AgentStepContext) {\n // Step 1: Analyze the changes\n yield {\n toolName: 'run_terminal_command',\n args: {\n command: 'git diff',\n process_type: 'SYNC',\n timeout_seconds: 30,\n },\n }\n\n yield {\n toolName: 'run_terminal_command',\n args: {\n command: 'git log --oneline -10',\n process_type: 'SYNC',\n timeout_seconds: 30,\n },\n }\n\n // Step 2: Let the AI decide what to read + what to stage based on the user's intent\n yield {\n toolName: 'add_message',\n args: {\n role: 'assistant',\n content: `Goal: ${prompt}\\n\\nI'll read any relevant files and stage the right changes next.`,\n },\n }\n\n yield 'STEP'\n\n // Step 3: Let the AI create the commit with proper formatting\n yield {\n toolName: 'add_message',\n args: {\n role: 'assistant',\n content:\n \"Now I'll create the commit with a high-quality message and the proper Codebuff footer format.\",\n },\n }\n\n yield 'STEP_ALL'\n },\n}\n\nexport default definition\n" - } - ] - } - } - } - } - ] - } - ] - }, - { - "type": "subagent_start", - "agentId": "D-1-F5QYws4", - "agentType": "commander-lite", - "displayName": "Commander Lite", - "onlyChild": false, - "parentAgentId": "main-agent", - "prompt": "Run root typecheck to validate TypeScript changes.", - "params": { - "command": "bun run typecheck", - "timeout_seconds": 120 - } - }, - { - "type": "subagent_start", - "agentId": "D-1-F0_olPY", - "agentType": "commander-lite", - "displayName": "Commander Lite", - "onlyChild": false, - "parentAgentId": "main-agent", - "prompt": "Run relevant package tests if any affected.", - "params": { - "command": "bun run test", - "timeout_seconds": 120 - } - }, - { - "type": "subagent_start", - "agentId": "D-1-F9QrDRM", - "agentType": "commander-lite", - "displayName": "Commander Lite", - "onlyChild": false, - "parentAgentId": "main-agent", - "prompt": "Check if any formatting issues.", - "params": { - "command": "bun run format --check", - "timeout_seconds": 60 - } - }, - { - "type": "tool_call", - "toolCallId": "7406ef13-feaa-4621-8d92-44c6500769ca", - "toolName": "run_terminal_command", - "input": { - "command": "bun run typecheck", - "timeout_seconds": 120 - }, - "agentId": "D-1-F5QYws4", - "parentAgentId": "main-agent", - "includeToolCall": true - }, - { - "type": "tool_call", - "toolCallId": "0c636b39-7349-4e7a-85b2-477c2680fda3", - "toolName": "run_terminal_command", - "input": { - "command": "bun run format --check", - "timeout_seconds": 60 - }, - "agentId": "D-1-F9QrDRM", - "parentAgentId": "main-agent", - "includeToolCall": true - }, - { - "type": "tool_call", - "toolCallId": "ffeb7cdc-f4a2-4b93-ae3f-46a22f0796f7", - "toolName": "run_terminal_command", - "input": { - "command": "bun run test", - "timeout_seconds": 120 - }, - "agentId": "D-1-F0_olPY", - "parentAgentId": "main-agent", - "includeToolCall": true - }, - { - "type": "tool_result", - "toolCallId": "ffeb7cdc-f4a2-4b93-ae3f-46a22f0796f7", - "toolName": "run_terminal_command", - "output": [ - { - "type": "json", - "value": { - "command": "bun run test", - "stdout": "@codebuff/common test: bun test v1.2.23 (cf136713)\n@codebuff/backend test: bun test v1.2.23 (cf136713)\n@codebuff/common test: \n@codebuff/common test: src/__tests__/handlesteps-parsing.test.ts:\n@codebuff/backend test: \n@codebuff/backend test: src/__tests__/web-search-tool.test.ts:\n@codebuff/common test: Using environment: dev\n@codebuff/common test: (pass) handleSteps Parsing Tests > should validate agent config with handleSteps function [19.41ms]\n@codebuff/common test: (pass) handleSteps Parsing Tests > should convert handleSteps function to string [0.64ms]\n@codebuff/common test: (pass) handleSteps Parsing Tests > should require set_output tool for handleSteps with json output mode [7.64ms]\n@codebuff/common test: (pass) handleSteps Parsing Tests > should validate that handleSteps is a generator function [1.38ms]\n@codebuff/common test: (pass) handleSteps Parsing Tests > should verify loaded template handleSteps matches original function toString [1.38ms]\n@codebuff/common test: \n@codebuff/common test: src/__tests__/dynamic-agent-template-schema.test.ts:\n@codebuff/common test: (pass) DynamicAgentDefinitionSchema > Valid Templates > should validate minimal valid template [0.15ms]\n@codebuff/common test: (pass) DynamicAgentDefinitionSchema > Valid Templates > should validate template with inputSchema [0.10ms]\n@codebuff/common test: (pass) DynamicAgentDefinitionSchema > Valid Templates > should validate template with paramsSchema [1.65ms]\n@codebuff/common test: (pass) DynamicAgentDefinitionSchema > Valid Templates > should validate template with both schemas [0.87ms]\n@codebuff/common test: (pass) DynamicAgentDefinitionSchema > Valid Templates > should validate template with complex nested schemas [0.62ms]\n@codebuff/common test: (pass) DynamicAgentDefinitionSchema > Valid Templates > should apply default values [0.32ms]\n@codebuff/common test: (pass) DynamicAgentDefinitionSchema > Valid Templates > should validate template with parentInstructions [0.06ms]\n@codebuff/common test: (pass) DynamicAgentDefinitionSchema > Invalid Templates > should reject template with missing required fields [0.05ms]\n@codebuff/common test: (pass) DynamicAgentDefinitionSchema > Invalid Templates > should reject template with invalid outputMode [0.04ms]\n@codebuff/common test: (pass) DynamicAgentDefinitionSchema > Invalid Templates > should reject template with invalid inputSchema type [0.06ms]\n@codebuff/common test: (pass) DynamicAgentDefinitionSchema > Invalid Templates > should reject template with invalid paramsSchema type [0.06ms]\n@codebuff/common test: (pass) DynamicAgentDefinitionSchema > Invalid Templates > should reject template with null schemas [0.09ms]\n@codebuff/common test: (pass) DynamicAgentDefinitionSchema > Invalid Templates > should reject template with invalid prompt field structure\n@codebuff/common test: (pass) DynamicAgentDefinitionSchema > Invalid Templates > should reject template with invalid agent ID format\n@codebuff/common test: (pass) DynamicAgentDefinitionSchema > Invalid Templates > should accept template with valid agent ID format [0.28ms]\n@codebuff/common test: (pass) DynamicAgentDefinitionSchema > Invalid Templates > should reject template with outputMode structured_output but missing set_output tool [0.47ms]\n@codebuff/common test: (pass) DynamicAgentDefinitionSchema > Invalid Templates > should accept template with outputMode structured_output and set_output tool [0.10ms]\n@codebuff/common test: (pass) DynamicAgentDefinitionSchema > Invalid Templates > should reject template with set_output tool but non-structured_output outputMode [0.04ms]\n@codebuff/common test: (pass) DynamicAgentDefinitionSchema > Invalid Templates > should reject template with set_output tool and all_messages outputMode [0.02ms]\n@codebuff/common test: (pass) DynamicAgentDefinitionSchema > Invalid Templates > should reject template with non-empty spawnableAgents but missing spawn_agents tool\n@codebuff/common test: (pass) DynamicAgentDefinitionSchema > Invalid Templates > should accept template with non-empty spawnableAgents and spawn_agents tool\n@codebuff/common test: (pass) DynamicAgentDefinitionSchema > Invalid Templates > should accept template with empty spawnableAgents and no spawn_agents tool\n@codebuff/common test: (pass) DynamicAgentDefinitionSchema > Edge Cases > should handle empty schemas\n@codebuff/common test: (pass) DynamicAgentDefinitionSchema > Edge Cases > should handle schemas with additional properties [0.18ms]\n@codebuff/common test: (pass) DynamicAgentDefinitionSchema > Edge Cases > should handle very long schema definitions [7.76ms]\n@codebuff/common test: \n@codebuff/common test: src/__tests__/agent-validation.test.ts:\n@codebuff/common test: (pass) Agent Validation > Dynamic Agent Loading > should load valid dynamic agent template [0.38ms]\n@codebuff/common test: (skip) Agent Validation > Dynamic Agent Loading > should validate spawnable agents\n@codebuff/common test: (pass) Agent Validation > Dynamic Agent Loading > should merge static and dynamic templates\n@codebuff/common test: (pass) Agent Validation > Dynamic Agent Loading > should handle agents with JSON schemas [2.41ms]\n@codebuff/common test: (pass) Agent Validation > Dynamic Agent Loading > should return validation errors for invalid schemas [0.25ms]\n@codebuff/common test: (pass) Agent Validation > Dynamic Agent Loading > should handle missing override field as non-override template [0.09ms]\n@codebuff/common test: (pass) Agent Validation > Dynamic Agent Loading > should validate spawnable agents including dynamic agents from first pass [0.10ms]\n@codebuff/common test: (pass) Agent Validation > Schema Validation > Default Schema Behavior > should have no prompt schema when no inputSchema provided [0.06ms]\n@codebuff/common test: (pass) Agent Validation > Schema Validation > Default Schema Behavior > should not have params schema when no paramsSchema provided [0.05ms]\n@codebuff/common test: (pass) Agent Validation > Schema Validation > Complex Schema Scenarios > should handle both inputSchema prompt and params together [2.00ms]\n@codebuff/common test: (pass) Agent Validation > Schema Validation > Complex Schema Scenarios > should handle schema with nested objects and arrays [1.29ms]\n@codebuff/common test: (pass) Agent Validation > Schema Validation > Error Message Quality > should include file path in error messages [0.10ms]\n@codebuff/common test: (pass) Agent Validation > Schema Validation > Edge Cases > should handle git-committer agent schema correctly [0.62ms]\n@codebuff/common test: (pass) Agent Validation > Schema Validation > Edge Cases > should handle empty inputSchema object [0.06ms]\n@codebuff/common test: (pass) Agent Validation > HandleSteps Parsing > should validate agent config with handleSteps function [0.05ms]\n@codebuff/common test: (pass) Agent Validation > HandleSteps Parsing > should convert handleSteps function to string [0.07ms]\n@codebuff/common test: (pass) Agent Validation > HandleSteps Parsing > should require set_output tool for handleSteps with json output mode [0.05ms]\n@codebuff/common test: (pass) Agent Validation > HandleSteps Parsing > should reject set_output tool without json output mode [0.06ms]\n@codebuff/common test: (pass) Agent Validation > HandleSteps Parsing > should validate that handleSteps is a generator function [0.06ms]\n@codebuff/common test: (pass) Agent Validation > HandleSteps Parsing > should verify loaded template handleSteps matches original function toString [0.04ms]\n@codebuff/common test: \n@codebuff/common test: src/types/__tests__/dynamic-agent-template.test.ts:\n@codebuff/common test: \n@codebuff/common test: src/util/__tests__/messages.test.ts:\n@codebuff/common test: (pass) limitScreenshots > should return messages unchanged when no screenshots present [0.19ms]\n@codebuff/common test: (pass) limitScreenshots > should return messages unchanged when screenshots under limit [0.09ms]\n@codebuff/common test: (pass) limitScreenshots > should keep only most recent screenshots when over limit\n@codebuff/common test: (pass) limitScreenshots > should preserve non-image content when filtering\n@codebuff/common test: \n@codebuff/common test: src/util/__tests__/saxy.test.ts:\n@codebuff/common test: (pass) Saxy XML Parser > Schema Validation with Text Conversion > should convert invalid top-level tags to text nodes [2.22ms]\n@codebuff/common test: (pass) Saxy XML Parser > Schema Validation with Text Conversion > should convert invalid nested tags to text nodes [0.02ms]\n@codebuff/common test: (pass) Saxy XML Parser > Schema Validation with Text Conversion > should handle valid nested tags according to schema [0.18ms]\n@codebuff/common test: (pass) Saxy XML Parser > Schema Validation with Text Conversion > should convert closing tags to text when parent is invalid\n@codebuff/common test: (pass) Saxy XML Parser > Schema Validation with Text Conversion > should handle tags starting with whitespace as text\n@codebuff/common test: (pass) Saxy XML Parser > Edge Cases > should handle self-closing invalid tags\n@codebuff/common test: (pass) Saxy XML Parser > Edge Cases > should handle nested invalid tags [0.01ms]\n@codebuff/common test: (pass) Saxy XML Parser > Edge Cases > should preserve attributes in converted text nodes [0.06ms]\n@codebuff/common test: (pass) Saxy XML Parser > should handle text that looks like invalid XML tags [0.29ms]\n@codebuff/common test: (pass) Saxy XML Parser > should handle text with angle brackets but no valid tag names [0.25ms]\n@codebuff/common test: (pass) Saxy XML Parser > should correctly parse mixed valid and invalid XML-like content [0.23ms]\n@codebuff/common test: (pass) Saxy XML Parser > should handle edge cases with special characters after < [0.15ms]\n@codebuff/common test: (pass) Saxy XML Parser > Text Node Handling > should preserve whitespace in text nodes [0.18ms]\n@codebuff/common test: (pass) Saxy XML Parser > Text Node Handling > should handle HTML entities in text content\n@codebuff/common test: (pass) Saxy XML Parser > Text Node Handling > should handle split XML entities in text content [0.54ms]\n@codebuff/common test: (pass) Saxy XML Parser > Text Node Handling > should preserve whitespace between tags [0.39ms]\n@codebuff/common test: (pass) Saxy XML Parser > Text Node Handling > should handle multiple HTML entities in the same text node [0.13ms]\n@codebuff/common test: (pass) Saxy XML Parser > Text Node Handling > should preserve newlines in text content\n@codebuff/common test: (pass) Saxy XML Parser > Text Node Handling > should handle split XML entities across chunks [0.20ms]\n@codebuff/common test: (pass) Saxy XML Parser > Text Node Handling > should handle multiple split entities in sequence [0.44ms]\n@codebuff/common test: (pass) Saxy XML Parser > Text Node Handling > should handle literal ampersand split across chunks [0.18ms]\n@codebuff/common test: (pass) Saxy XML Parser > Text Node Handling > should not treat standalone ampersand as pending entity [0.08ms]\n@codebuff/common test: (pass) Saxy XML Parser > Text Node Handling > should handle text split across chunks without entities or tags [0.10ms]\n@codebuff/common test: (pass) Saxy XML Parser > Text Node Handling > should output closing tag as text if not matching [0.08ms]\n@codebuff/common test: (pass) Saxy XML Parser > shouldParseEntities = false > should not parse HTML entities in text content when shouldParseEntities is false [0.03ms]\n@codebuff/common test: (pass) Saxy XML Parser > shouldParseEntities = false > should not parse HTML entities split across chunks when shouldParseEntities is false [0.21ms]\n@codebuff/common test: (pass) Saxy XML Parser > shouldParseEntities = false > should handle text nodes correctly in _final when shouldParseEntities is false [0.17ms]\n@codebuff/common test: (pass) Saxy XML Parser > Real World Examples > should handle && ( < [0.24ms]\n@codebuff/common test: (pass) Saxy XML Parser > Real World Examples > should handle entity at end of content [0.22ms]\n@codebuff/common test: \n@codebuff/common test: src/util/__tests__/string.test.ts:\n@codebuff/common test: (pass) pluralize > should handle singular and plural cases correctly [0.26ms]\n@codebuff/common test: (pass) pluralize > should handle words ending in y [0.03ms]\n@codebuff/common test: (pass) pluralize > should handle words ending in f/fe [0.04ms]\n@codebuff/common test: (pass) pluralize > should handle words ending in s, sh, ch, x, z, o [0.02ms]\n@codebuff/common test: (pass) pluralize > should handle regular plurals [0.02ms]\n@codebuff/common test: (pass) replaceNonStandardPlaceholderComments > should replace C-style comments [0.03ms]\n@codebuff/common test: (pass) replaceNonStandardPlaceholderComments > should replace multi-line C-style comments [0.15ms]\n@codebuff/common test: (pass) replaceNonStandardPlaceholderComments > should replace Python-style comments [0.03ms]\n@codebuff/common test: (pass) replaceNonStandardPlaceholderComments > should replace JSX comments [0.02ms]\n@codebuff/common test: \n@codebuff/common test: src/util/__tests__/partial-json-delta.test.ts:\n@codebuff/common test: (pass) parsePartialJsonObjectSingle > complete valid JSON > should parse complete valid JSON [0.18ms]\n@codebuff/common test: (pass) parsePartialJsonObjectSingle > complete valid JSON > should parse empty object [0.05ms]\n@codebuff/common test: (pass) parsePartialJsonObjectSingle > complete valid JSON > should parse nested objects [0.05ms]\n@codebuff/common test: (pass) parsePartialJsonObjectSingle > complete valid JSON > should parse arrays [0.04ms]\n@codebuff/common test: (pass) parsePartialJsonObjectSingle > incomplete JSON - missing closing brace > should parse object missing final closing brace [0.14ms]\n@codebuff/common test: (pass) parsePartialJsonObjectSingle > incomplete JSON - missing closing brace > should parse nested object missing final closing brace [0.10ms]\n@codebuff/common test: (pass) parsePartialJsonObjectSingle > incomplete JSON - missing closing brace > should parse object with incomplete string value [0.04ms]\n@codebuff/common test: (pass) parsePartialJsonObjectSingle > incomplete JSON - trailing comma handling > should handle trailing comma by removing last property [0.02ms]\n@codebuff/common test: (pass) parsePartialJsonObjectSingle > incomplete JSON - trailing comma handling > should handle multiple trailing commas\n@codebuff/common test: (pass) parsePartialJsonObjectSingle > incomplete JSON - trailing comma handling > should handle nested object with trailing comma\n@codebuff/common test: (pass) parsePartialJsonObjectSingle > incomplete JSON - trailing comma handling > should handle array with trailing comma [0.08ms]\n@codebuff/common test: (pass) parsePartialJsonObjectSingle > edge cases > should return empty object for empty string\n@codebuff/common test: (pass) parsePartialJsonObjectSingle > edge cases > should return empty object for invalid JSON\n@codebuff/common test: (pass) parsePartialJsonObjectSingle > edge cases > should return empty object for malformed JSON [0.14ms]\n@codebuff/common test: (pass) parsePartialJsonObjectSingle > edge cases > should handle JSON with only opening brace [0.06ms]\n@codebuff/common test: (pass) parsePartialJsonObjectSingle > edge cases > should handle JSON with whitespace [0.02ms]\n@codebuff/common test: (pass) parsePartialJsonObjectSingle > edge cases > should handle complex nested incomplete JSON [0.06ms]\n@codebuff/common test: (pass) parsePartialJsonObjectSingle > real-world streaming scenarios > should handle partial JSON from streaming response [0.05ms]\n@codebuff/common test: (pass) parsePartialJsonObjectSingle > real-world streaming scenarios > should handle JSON with boolean and null values [0.03ms]\n@codebuff/common test: (pass) parsePartialJsonObjectSingle > real-world streaming scenarios > should handle JSON with numbers [0.03ms]\n@codebuff/common test: (pass) getPartialJsonDelta > input validation > should throw error when content does not start with previous [0.17ms]\n@codebuff/common test: (pass) getPartialJsonDelta > input validation > should work when content starts with previous [0.10ms]\n@codebuff/common test: (pass) getPartialJsonDelta > basic delta detection from streaming JSON > should detect new properties added to empty object [0.04ms]\n@codebuff/common test: (pass) getPartialJsonDelta > basic delta detection from streaming JSON > should detect completion of partial string value [0.04ms]\n@codebuff/common test: (pass) getPartialJsonDelta > basic delta detection from streaming JSON > should return empty delta when no changes detected [0.02ms]\n@codebuff/common test: (pass) getPartialJsonDelta > basic delta detection from streaming JSON > should detect new property being added [0.02ms]\n@codebuff/common test: (pass) getPartialJsonDelta > string delta handling > should return string slice for partial string updates [0.02ms]\n@codebuff/common test: (pass) getPartialJsonDelta > string delta handling > should handle empty string to non-empty string [0.02ms]\n@codebuff/common test: (pass) getPartialJsonDelta > string delta handling > should handle new string property [0.02ms]\n@codebuff/common test: (pass) getPartialJsonDelta > string delta handling > should handle multi-line string streaming [0.02ms]\n@codebuff/common test: (pass) getPartialJsonDelta > non-string value changes > should return full value for non-string changes [0.01ms]\n@codebuff/common test: (pass) getPartialJsonDelta > non-string value changes > should handle boolean values [0.01ms]\n@codebuff/common test: (pass) getPartialJsonDelta > non-string value changes > should handle null values [0.02ms]\n@codebuff/common test: (pass) getPartialJsonDelta > non-string value changes > should handle array values [0.01ms]\n@codebuff/common test: (pass) getPartialJsonDelta > non-string value changes > should handle nested object values [0.01ms]\n@codebuff/common test: (pass) getPartialJsonDelta > realistic streaming scenarios > should handle progressive JSON building [0.03ms]\n@codebuff/common test: (pass) getPartialJsonDelta > realistic streaming scenarios > should handle streaming text completion\n@codebuff/common test: (pass) getPartialJsonDelta > realistic streaming scenarios > should handle incomplete JSON with trailing comma [0.04ms]\n@codebuff/common test: (pass) getPartialJsonDelta > lastParam tracking > should track last parameter key and completion status [0.01ms]\n@codebuff/common test: (pass) getPartialJsonDelta > lastParam tracking > should indicate incomplete last parameter\n@codebuff/common test: (pass) getPartialJsonDelta > lastParam tracking > should handle undefined key for empty object [0.04ms]\n@codebuff/common test: (pass) getPartialJsonDelta > edge cases > should handle empty previous string [0.03ms]\n@codebuff/common test: (pass) getPartialJsonDelta > edge cases > should handle identical content and previous [0.01ms]\n@codebuff/common test: (pass) getPartialJsonDelta > edge cases > should handle malformed JSON gracefully\n@codebuff/common test: (pass) getPartialJsonDelta > edge cases > should handle escaped quotes in strings [0.01ms]\n@codebuff/common test: \n@codebuff/common test: src/json-config/__tests__/stringify-schema.test.ts:\n@codebuff/common test: (pass) stringifySchema > should correctly stringify StartupProcessSchema [0.75ms]\n@codebuff/common test: (pass) stringifySchema > should correctly stringify CodebuffConfigSchema [0.19ms]\n@codebuff/common test: (pass) stringifySchema > should handle a more complex schema [0.31ms]\n@codebuff/common test: (pass) stringifySchema > should handle an empty object schema [0.03ms]\n@codebuff/common test: (pass) stringifySchema > should handle schema with only optional fields [0.05ms]\n@codebuff/common test: (pass) stringifySchema > should handle schema with default values [0.09ms]\n@codebuff/common test: \n@codebuff/common test: src/json-config/__tests__/constants.test.ts:\n@codebuff/common test: (pass) constants > codebuffConfigFile and codebuffConfigFileBackup > should have correct file names\n@codebuff/common test: (pass) constants > StartupProcessSchema > should validate a minimal startup process [0.35ms]\n@codebuff/common test: (pass) constants > StartupProcessSchema > should validate a complete startup process\n@codebuff/common test: (pass) constants > StartupProcessSchema > should reject startup process with empty name [0.10ms]\n@codebuff/common test: (pass) constants > StartupProcessSchema > should reject startup process with empty command [0.07ms]\n@codebuff/common test: (pass) constants > StartupProcessSchema > should apply default enabled value [0.03ms]\n@codebuff/common test: (pass) constants > FileChangeHook > should validate a minimal file change hook [0.05ms]\n@codebuff/common test: (pass) constants > FileChangeHook > should validate a complete file change hook [0.10ms]\n@codebuff/common test: (pass) constants > FileChangeHook > should reject hook with empty name [0.09ms]\n@codebuff/common test: (pass) constants > FileChangeHook > should reject hook with empty command [0.13ms]\n@codebuff/common test: (pass) constants > CodebuffConfigSchema > should validate an empty object as a valid config [0.07ms]\n@codebuff/common test: (pass) constants > CodebuffConfigSchema > should validate a minimal config with description only [0.07ms]\n@codebuff/common test: (pass) constants > CodebuffConfigSchema > should validate a complete config [0.05ms]\n@codebuff/common test: (pass) constants > CodebuffConfigSchema > should accept any type for description field [0.15ms]\n@codebuff/common test: (pass) constants > CodebuffConfigSchema > should apply default maxAgentSteps value [0.07ms]\n@codebuff/common test: (pass) constants > CodebuffConfigSchema > should allow custom maxAgentSteps value [0.03ms]\n@codebuff/common test: (pass) constants > CodebuffConfigSchema > should reject invalid startup process in array [0.08ms]\n@codebuff/common test: (pass) constants > CodebuffConfigSchema > should reject invalid file change hook in array [0.08ms]\n@codebuff/common test: (pass) constants > CodebuffConfigSchema > should reject non-number maxAgentSteps [0.02ms]\n@codebuff/common test: (pass) constants > CodebuffConfigSchema > should reject non-array startupProcesses [0.08ms]\n@codebuff/common test: (pass) constants > CodebuffConfigSchema > should reject non-array fileChangeHooks\n@codebuff/common test: (pass) constants > TypeScript types > should have correct TypeScript types\n@codebuff/common test: \n@codebuff/common test: 1 tests skipped:\n@codebuff/common test: (skip) Agent Validation > Dynamic Agent Loading > should validate spawnable agents\n@codebuff/common test: \n@codebuff/common test: 164 pass\n@codebuff/common test: 1 skip\n@codebuff/common test: 0 fail\n@codebuff/common test: 6 snapshots, 337 expect() calls\n@codebuff/common test: Ran 165 tests across 10 files. [517.00ms]\n@codebuff/common test: Exited with code 0\n@codebuff/backend test: Using environment: dev\n@codebuff/backend test: \n@codebuff/backend test: # Unhandled error between tests\n@codebuff/backend test: -------------------------------\n@codebuff/backend test: 6 | import type { AgentTemplate } from '../../types'\n@codebuff/backend test: 7 | import type { Model } from '@codebuff/common/constants'\n@codebuff/backend test: 8 | \n@codebuff/backend test: 9 | export const dryRun = (model: Model): Omit => ({\n@codebuff/backend test: 10 | model,\n@codebuff/backend test: 11 | displayName: AGENT_PERSONAS.dry_run.displayName,\n@codebuff/backend test: ^\n@codebuff/backend test: TypeError: undefined is not an object (evaluating 'AGENT_PERSONAS.dry_run.displayName')\n@codebuff/backend test: at dryRun (/private/var/folders/k7/h0vthckj46s24j_xs1lp33g80000gn/T/codebuff-eval-U1Rxqp/repo/backend/src/templates/agents/archive/dry-run.ts:11:31)\n@codebuff/backend test: at /private/var/folders/k7/h0vthckj46s24j_xs1lp33g80000gn/T/codebuff-eval-U1Rxqp/repo/backend/src/templates/agent-list.ts:69:10\n@codebuff/backend test: -------------------------------\n@codebuff/backend test: \n@codebuff/backend test: \n@codebuff/backend test: src/__tests__/generate-diffs-prompt.test.ts:\n@codebuff/backend test: {\"result\":{\"diffBlocks\":[{\"searchContent\":\"function test() {\\n return true;\\n}\\n\",\"replaceContent\":\"function test() {\\n if (!condition) return false;\\n return true;\\n}\\n\"}],\"diffBlocksThatDidntMatch\":[]}}\n@codebuff/backend test: (pass) parseAndGetDiffBlocksSingleFile > should parse diff blocks with newline before closing marker [17.55ms]\n@codebuff/backend test: (pass) parseAndGetDiffBlocksSingleFile > should parse diff blocks without newline before closing marker [0.08ms]\n@codebuff/backend test: (pass) parseAndGetDiffBlocksSingleFile > should handle multiple diff blocks with mixed newline patterns [0.02ms]\n@codebuff/backend test: (pass) parseAndGetDiffBlocksSingleFile > should handle empty replace content (with just one newline) [0.02ms]\n@codebuff/backend test: \n@codebuff/backend test: src/__tests__/usage-calculation.test.ts:\n@codebuff/backend test: (pass) Usage Calculation System \n[...TRUNCATED DUE TO LENGTH...]\nkend test: (pass) Backend Tool Call Schema > should validate tool call response structure [0.03ms]\n@codebuff/backend test: (pass) Backend Tool Call Schema > should handle tool call timeout scenarios [0.01ms]\n@codebuff/backend test: (pass) Backend Tool Call Schema > should validate different tool types [0.09ms]\n@codebuff/backend test: (pass) Backend Tool Call Schema > should handle request ID generation [0.02ms]\n@codebuff/backend test: (pass) Backend Tool Call Schema > should generate mock project structure analysis [0.27ms]\n@codebuff/backend test: (pass) Backend Tool Call Schema > should generate mock dependency analysis [0.17ms]\n@codebuff/backend test: (pass) Backend Tool Call Schema > should handle error scenarios in mock generators [0.10ms]\n@codebuff/backend test: \n@codebuff/backend test: src/__tests__/sandbox-generator.test.ts:\n@codebuff/backend test: 87 | mockParams.template = mockTemplate\n@codebuff/backend test: 88 | mockParams.localAgentTemplates = { 'test-vm-agent': mockTemplate }\n@codebuff/backend test: 89 | \n@codebuff/backend test: 90 | const result = await runProgrammaticStep(mockAgentState, mockParams)\n@codebuff/backend test: 91 | \n@codebuff/backend test: 92 | expect(result.agentState.output).toEqual({\n@codebuff/backend test: ^\n@codebuff/backend test: error: expect(received).toEqual(expected)\n@codebuff/backend test: \n@codebuff/backend test: {\n@codebuff/backend test: - \"agentId\": \"test-agent-123\",\n@codebuff/backend test: - \"message\": \"Hello from QuickJS sandbox!\",\n@codebuff/backend test: - \"prompt\": \"Test prompt\",\n@codebuff/backend test: + \"error\": \"Error executing handleSteps for agent test-vm-agent: Cannot access 'sendMessage' before initialization.\",\n@codebuff/backend test: }\n@codebuff/backend test: \n@codebuff/backend test: - Expected - 3\n@codebuff/backend test: + Received + 1\n@codebuff/backend test: \n@codebuff/backend test: at (/private/var/folders/k7/h0vthckj46s24j_xs1lp33g80000gn/T/codebuff-eval-U1Rxqp/repo/backend/src/__tests__/sandbox-generator.test.ts:92:38)\n@codebuff/backend test: (fail) QuickJS Sandbox Generator > should execute string-based generator in QuickJS sandbox [29.84ms]\n@codebuff/backend test: (pass) QuickJS Sandbox Generator > should handle QuickJS sandbox errors gracefully [4.80ms]\n@codebuff/backend test: \n@codebuff/backend test: src/__tests__/auto-topup.test.ts:\n@codebuff/backend test: (pass) Auto Top-up System > checkAndTriggerAutoTopup > should trigger top-up when balance below threshold [9.03ms]\n@codebuff/backend test: (pass) Auto Top-up System > checkAndTriggerAutoTopup > should not trigger top-up when balance above threshold [0.24ms]\n@codebuff/backend test: (pass) Auto Top-up System > checkAndTriggerAutoTopup > should handle debt by topping up max(debt, configured amount) [0.15ms]\n@codebuff/backend test: (pass) Auto Top-up System > checkAndTriggerAutoTopup > should disable auto-topup when validation fails [1.19ms]\n@codebuff/backend test: \n@codebuff/backend test: src/__tests__/loop-agent-steps.test.ts:\n@codebuff/backend test: \n@codebuff/backend test: # Unhandled error between tests\n@codebuff/backend test: -------------------------------\n@codebuff/backend test: 15 | */\n@codebuff/backend test: 16 | export const mockModule = async (\n@codebuff/backend test: 17 | modulePath: string,\n@codebuff/backend test: 18 | renderMocks: () => Record,\n@codebuff/backend test: 19 | ): Promise => {\n@codebuff/backend test: 20 | let original = originalModuleCache[modulePath] ?? {\n@codebuff/backend test: ^\n@codebuff/backend test: ReferenceError: Cannot access 'AsyncAgentManager' before initialization.\n@codebuff/backend test: at (/private/var/folders/k7/h0vthckj46s24j_xs1lp33g80000gn/T/codebuff-eval-U1Rxqp/repo/common/src/testing/mock-modules.ts:20:53)\n@codebuff/backend test: -------------------------------\n@codebuff/backend test: \n@codebuff/backend test: 194 | \n@codebuff/backend test: 195 | const hasPrompt = Boolean(prompt || params)\n@codebuff/backend test: 196 | \n@codebuff/backend test: 197 | if (ASYNC_AGENTS_ENABLED) {\n@codebuff/backend test: 198 | // Register this agent in the async manager so it can receive messages\n@codebuff/backend test: 199 | const isRegistered = asyncAgentManager.getAgent(agentState.agentId)\n@codebuff/backend test: ^\n@codebuff/backend test: ReferenceError: Cannot access 'asyncAgentManager' before initialization.\n@codebuff/backend test: at (/private/var/folders/k7/h0vthckj46s24j_xs1lp33g80000gn/T/codebuff-eval-U1Rxqp/repo/backend/src/run-agent-step.ts:199:26)\n@codebuff/backend test: at async (/private/var/folders/k7/h0vthckj46s24j_xs1lp33g80000gn/T/codebuff-eval-U1Rxqp/repo/backend/src/run-agent-step.ts:529:15)\n@codebuff/backend test: at async (/private/var/folders/k7/h0vthckj46s24j_xs1lp33g80000gn/T/codebuff-eval-U1Rxqp/repo/backend/src/__tests__/loop-agent-steps.test.ts:225:26)\n@codebuff/backend test: (fail) loopAgentSteps STEP behavior > should verify correct STEP behavior - LLM called once after STEP [1.16ms]\n@codebuff/backend test: (pass) loopAgentSteps STEP behavior > should demonstrate correct behavior when programmatic agent completes without STEP [0.11ms]\n@codebuff/backend test: \n@codebuff/backend test: src/__tests__/live-user-inputs.test.ts:\n@codebuff/backend test: (pass) live-user-inputs > startUserInput > should start a new user input [0.20ms]\n@codebuff/backend test: (pass) live-user-inputs > startUserInput > should handle multiple user inputs for same user [0.03ms]\n@codebuff/backend test: (pass) live-user-inputs > startUserInput > should handle user inputs for different users [0.03ms]\n@codebuff/backend test: (pass) live-user-inputs > cancelUserInput > should cancel a specific user input [0.11ms]\n@codebuff/backend test: (pass) live-user-inputs > cancelUserInput > should remove user from tracking when all inputs cancelled [0.03ms]\n@codebuff/backend test: (pass) live-user-inputs > cancelUserInput > should handle cancelling non-existent input gracefully [0.07ms]\n@codebuff/backend test: (pass) live-user-inputs > cancelUserInput > should handle cancelling for non-existent user gracefully [0.02ms]\n@codebuff/backend test: (pass) live-user-inputs > endUserInput > should end user input when async agents disabled [0.04ms]\n@codebuff/backend test: (pass) live-user-inputs > endUserInput > should keep user input when async agents enabled [0.02ms]\n@codebuff/backend test: (pass) live-user-inputs > checkLiveUserInput > should return true for valid live user input [0.10ms]\n@codebuff/backend test: (pass) live-user-inputs > checkLiveUserInput > should return true for user input with matching prefix [0.03ms]\n@codebuff/backend test: (pass) live-user-inputs > checkLiveUserInput > should return false for non-existent user [0.05ms]\n@codebuff/backend test: (pass) live-user-inputs > checkLiveUserInput > should return false for undefined user [0.01ms]\n@codebuff/backend test: (pass) live-user-inputs > checkLiveUserInput > should return false for disconnected session [0.03ms]\n@codebuff/backend test: (pass) live-user-inputs > checkLiveUserInput > should return false for non-matching user input [0.04ms]\n@codebuff/backend test: (pass) live-user-inputs > checkLiveUserInput > should return true when live user input check is disabled [0.03ms]\n@codebuff/backend test: (pass) live-user-inputs > setSessionConnected > should set session as connected [0.05ms]\n@codebuff/backend test: (pass) live-user-inputs > setSessionConnected > should set session as disconnected [0.08ms]\n@codebuff/backend test: (pass) live-user-inputs > setSessionConnected > should handle multiple sessions independently [0.07ms]\n@codebuff/backend test: (pass) live-user-inputs > getLiveUserInputIds > should return undefined for user with no inputs [0.05ms]\n@codebuff/backend test: (pass) live-user-inputs > getLiveUserInputIds > should return undefined for undefined user [0.04ms]\n@codebuff/backend test: (pass) live-user-inputs > getLiveUserInputIds > should return array of input IDs for user with inputs [0.05ms]\n@codebuff/backend test: (pass) live-user-inputs > integration scenarios > should handle complete user input lifecycle [0.21ms]\n@codebuff/backend test: (pass) live-user-inputs > integration scenarios > should handle session disconnect during active input [0.09ms]\n@codebuff/backend test: (pass) live-user-inputs > integration scenarios > should handle multiple concurrent inputs for same user [0.05ms]\n@codebuff/backend test: \n@codebuff/backend test: src/util/__tests__/simplify-tool-results.test.ts:\n@codebuff/backend test: (pass) simplifyToolResultsInMessages > should simplify read_files results while preserving others [0.66ms]\n@codebuff/backend test: (pass) simplifyToolResultsInMessages > should handle array message content format [0.07ms]\n@codebuff/backend test: (pass) simplifyToolResultsInMessages > should return original content if no tool results present [0.06ms]\n@codebuff/backend test: (pass) simplifyToolResultsInMessages > should handle empty content [0.02ms]\n@codebuff/backend test: (pass) simplifyToolResultsInMessages > should handle array message content with no text property [0.02ms]\n@codebuff/backend test: (pass) simplifyToolResultsInMessages > should handle array message content with undefined text property [0.02ms]\n@codebuff/backend test: (pass) simplifyToolResultsInMessages > should handle multiple read_files results [0.06ms]\n@codebuff/backend test: (pass) simplifyToolResultsInMessages > should handle malformed read_files result [0.03ms]\n@codebuff/backend test: (pass) simplifyTerminalCommandResultsInMessages > should simplify long terminal command output [0.11ms]\n@codebuff/backend test: (pass) simplifyTerminalCommandResultsInMessages > should preserve short terminal command output [0.02ms]\n@codebuff/backend test: (pass) simplifyTerminalCommandResultsInMessages > should preserve other tool results [0.04ms]\n@codebuff/backend test: (pass) simplifyTerminalCommandResultsInMessages > should handle multiple terminal command results [0.09ms]\n@codebuff/backend test: (pass) simplifyTerminalCommandResultsInMessages > should handle mixed short and long terminal outputs [0.07ms]\n@codebuff/backend test: (pass) simplifyTerminalCommandResultsInMessages > should handle malformed terminal command result [0.05ms]\n@codebuff/backend test: (pass) simplifyReadFileToolResult > should extract file paths from read_files result [0.04ms]\n@codebuff/backend test: (pass) simplifyReadFileToolResult > should handle single file result [0.03ms]\n@codebuff/backend test: (pass) simplifyReadFileToolResult > should handle empty read_files result [0.02ms]\n@codebuff/backend test: (pass) simplifyReadFileToolResult > should handle malformed read_file tags [0.02ms]\n@codebuff/backend test: (pass) simplifyReadFileToolResult > should handle read_file tags with empty path [0.02ms]\n@codebuff/backend test: (pass) simplifyTerminalCommandResult > should shorten long terminal output [0.02ms]\n@codebuff/backend test: (pass) simplifyTerminalCommandResult > should preserve short terminal output [0.02ms]\n@codebuff/backend test: (pass) simplifyTerminalCommandResult > should handle empty terminal output [0.01ms]\n@codebuff/backend test: (pass) simplifyTerminalCommandResult > should handle output exactly matching omitted message length [0.02ms]\n@codebuff/backend test: (pass) simplifyTerminalCommandResult > should handle output one character longer than omitted message [0.01ms]\n@codebuff/backend test: (pass) simplifyTerminalCommandResult > should handle output one character shorter than omitted message\n@codebuff/backend test: \n@codebuff/backend test: src/util/__tests__/split-data.test.ts:\n@codebuff/backend test: (pass) splitData - base cases > returns primitive as-is in an array [2.02ms]\n@codebuff/backend test: (pass) splitData - base cases > returns non-plain objects as-is [0.11ms]\n@codebuff/backend test: (pass) splitData - base cases > splits short strings when maxChunkSize is small [0.15ms]\n@codebuff/backend test: (pass) splitData - base cases > splits deeply nested strings with small maxChunkSize [0.07ms]\n@codebuff/backend test: (pass) splitData - base cases > handles arrays with long values [0.10ms]\n@codebuff/backend test: (pass) splitData - base cases > preserves numbers and booleans [0.07ms]\n@codebuff/backend test: (pass) splitData - base cases > splits multiple string fields independently [0.04ms]\n@codebuff/backend test: (pass) splitData - array and string-specific splitting > splits long strings into smaller string chunks [0.03ms]\n@codebuff/backend test: (pass) splitData - array and string-specific splitting > splits arrays into smaller arrays with sliced strings [0.03ms]\n@codebuff/backend test: (pass) splitData - array and string-specific splitting > splits plain objects with long strings into smaller objects [0.04ms]\n@codebuff/backend test: (pass) splitData - array and string-specific splitting > preserves numbers and booleans in split arrays [0.06ms]\n@codebuff/backend test: (pass) splitData - array and string-specific splitting > splits hybrid nested array/object structures within size limits [0.08ms]\n@codebuff/backend test: (pass) splitData - array and string-specific splitting > efficiently combines array elements while respecting maxSize [0.04ms]\n@codebuff/backend test: (pass) splitData - array and string-specific splitting > efficiently combines object properties while respecting maxSize [0.08ms]\n@codebuff/backend test: (pass) splitData - array and string-specific splitting > handles escaped characters at split points [0.03ms]\n@codebuff/backend test: (pass) splitData - nested object splitting > maintains object structure when splitting nested long strings [0.02ms]\n@codebuff/backend test: \n@codebuff/backend test: src/util/__tests__/messages.test.ts:\n@codebuff/backend test: (pass) messagesWithSystem > prepends system message to array [0.09ms]\n@codebuff/backend test: (pass) trimMessagesToFitTokenLimit > handles all features working together correctly [0.94ms]\n@codebuff/backend test: (pass) trimMessagesToFitTokenLimit > subtracts system tokens from total tokens [0.77ms]\n@codebuff/backend test: (pass) trimMessagesToFitTokenLimit > does not simplify if under token limit [0.27ms]\n@codebuff/backend test: (pass) trimMessagesToFitTokenLimit > handles empty messages array [0.08ms]\n@codebuff/backend test: (pass) trimMessagesToFitTokenLimit > keepDuringTruncation functionality > preserves messages marked with keepDuringTruncation=true [0.48ms]\n@codebuff/backend test: (pass) trimMessagesToFitTokenLimit > keepDuringTruncation functionality > does not add replacement message when no messages are removed [0.06ms]\n@codebuff/backend test: (pass) trimMessagesToFitTokenLimit > keepDuringTruncation functionality > handles consecutive replacement messages correctly [0.10ms]\n@codebuff/backend test: (pass) trimMessagesToFitTokenLimit > keepDuringTruncation functionality > calculates token removal correctly with keepDuringTruncation [0.05ms]\n@codebuff/backend test: (pass) trimMessagesToFitTokenLimit > keepDuringTruncation functionality > handles mixed keepDuringTruncation and regular messages [0.04ms]\n@codebuff/backend test: \n@codebuff/backend test: src/util/__tests__/parse-tool-call-xml.test.ts:\n@codebuff/backend test: (pass) parseToolCallXml > should parse basic key-value pairs [0.21ms]\n@codebuff/backend test: (pass) parseToolCallXml > should handle empty content\n@codebuff/backend test: (pass) parseToolCallXml > should handle whitespace around values\n@codebuff/backend test: (pass) parseToolCallXml > should handle internal whitespace [0.05ms]\n@codebuff/backend test: (pass) parseToolCallXml > should return an empty object for empty or whitespace-only input\n@codebuff/backend test: (pass) parseToolCallXml > should handle special XML characters within values\n@codebuff/backend test: (pass) parseToolCallXml > should parse numbers as strings\n@codebuff/backend test: (pass) parseToolCallXml > should parse booleans as strings [0.01ms]\n@codebuff/backend test: (pass) parseToolCallXml > should parse nested range tags as raw string content [0.01ms]\n@codebuff/backend test: (pass) parseToolCallXml > should parse mixed types as strings [0.02ms]\n@codebuff/backend test: (pass) parseToolCallXml > should handle complex example with various types (all as strings) [0.03ms]\n@codebuff/backend test: (pass) parseToolCallXml > should convert boolean values\n@codebuff/backend test: (pass) parseToolCallXml > should convert numeric values [0.02ms]\n@codebuff/backend test: (pass) parseToolCallXml > should handle complex browser action example [0.01ms]\n@codebuff/backend test: (pass) parseToolCallXml > should handle multiline content with whitespace [0.03ms]\n@codebuff/backend test: (pass) parseToolCallXml > should handle diagnostic step example [0.02ms]\n@codebuff/backend test: (pass) parseToolCallXml > should handle empty tags [0.01ms]\n@codebuff/backend test: \n@codebuff/backend test: src/util/__tests__/object.test.ts:\n@codebuff/backend test: (pass) stripNullCharsFromObject > should remove null characters from strings in a simple object [0.18ms]\n@codebuff/backend test: (pass) stripNullCharsFromObject > should remove null characters from strings in a nested object [0.03ms]\n@codebuff/backend test: (pass) stripNullCharsFromObject > should remove null characters from strings within an array [0.02ms]\n@codebuff/backend test: (pass) stripNullCharsFromObject > should remove null characters from strings within objects in an array [0.03ms]\n@codebuff/backend test: (pass) stripNullCharsFromObject > should handle mixed data types correctly [0.04ms]\n@codebuff/backend test: (pass) stripNullCharsFromObject > should handle empty objects and arrays [0.01ms]\n@codebuff/backend test: (pass) stripNullCharsFromObject > should handle a string input directly\n@codebuff/backend test: (pass) stripNullCharsFromObject > should handle non-string, non-object, non-array inputs [0.02ms]\n@codebuff/backend test: (pass) stripNullCharsFromObject > should handle complex nested structures [0.04ms]\n@codebuff/backend test: \n@codebuff/backend test: src/llm-apis/__tests__/linkup-api.test.ts:\n@codebuff/backend test: (pass) Linkup API > should successfully search with basic query [0.49ms]\n@codebuff/backend test: (pass) Linkup API > should handle custom depth [0.22ms]\n@codebuff/backend test: (pass) Linkup API > should handle API errors gracefully [0.22ms]\n@codebuff/backend test: (pass) Linkup API > should handle network errors [0.28ms]\n@codebuff/backend test: (pass) Linkup API > should handle invalid response format [0.17ms]\n@codebuff/backend test: (pass) Linkup API > should handle missing answer field [0.09ms]\n@codebuff/backend test: (pass) Linkup API > should handle empty answer [0.08ms]\n@codebuff/backend test: (pass) Linkup API > should use default options when none provided [0.09ms]\n@codebuff/backend test: (pass) Linkup API > should handle malformed JSON response [0.11ms]\n@codebuff/backend test: (pass) Linkup API > should log detailed error information for 404 responses [0.15ms]\n@codebuff/backend test: \n@codebuff/backend test: 7 tests skipped:\n@codebuff/backend test: (skip) read_docs tool with researcher agent > should successfully fetch documentation with basic query\n@codebuff/backend test: (skip) read_docs tool with researcher agent > should fetch documentation with topic and max_tokens\n@codebuff/backend test: (skip) mainPrompt (Integration) > should delete a specified function while preserving other code\n@codebuff/backend test: (skip) mainPrompt (Integration) > Real world example > should specify deletion comment while deleting single character\n@codebuff/backend test: (skip) rewriteWithOpenAI > (unnamed)\n@codebuff/backend test: (skip) rewriteWithOpenAI > should correctly integrate edit snippet changes while preserving formatting\n@codebuff/backend test: (skip) rewriteWithOpenAI > (unnamed)\n@codebuff/backend test: \n@codebuff/backend test: \n@codebuff/backend test: 38 tests failed:\n@codebuff/backend test: (fail) runAgentStep - set_output tool > should set output with simple key-value pair [0.25ms]\n@codebuff/backend test: (fail) runAgentStep - set_output tool > should set output with complex data [0.04ms]\n@codebuff/backend test: (fail) runAgentStep - set_output tool > should replace existing output data [0.03ms]\n@codebuff/backend test: (fail) runAgentStep - set_output tool > should handle empty output parameter\n@codebuff/backend test: (fail) runAgentStep - set_output tool > should handle handleSteps with one tool call and STEP_ALL [0.05ms]\n@codebuff/backend test: (fail) runAgentStep - set_output tool > should spawn agent inline that deletes last two assistant messages\n@codebuff/backend test: (fail) mainPrompt > should add file updates to tool results in message history [0.60ms]\n@codebuff/backend test: (fail) mainPrompt > should handle direct terminal command [0.25ms]\n@codebuff/backend test: (fail) mainPrompt > should handle write_file tool call\n@codebuff/backend test: (fail) mainPrompt > should force end of response after MAX_CONSECUTIVE_ASSISTANT_MESSAGES [0.19ms]\n@codebuff/backend test: (fail) mainPrompt > should update consecutiveAssistantMessages when new prompt is received\n@codebuff/backend test: (fail) mainPrompt > should increment consecutiveAssistantMessages when no new prompt\n@codebuff/backend test: (fail) mainPrompt > should return no tool calls when LLM response is empty [0.22ms]\n@codebuff/backend test: (fail) mainPrompt > should unescape ampersands in run_terminal_command tool calls [0.42ms]\n@codebuff/backend test: (fail) read_docs tool with researcher agent > should handle case when no documentation is found [0.31ms]\n@codebuff/backend test: (fail) read_docs tool with researcher agent > should handle API errors gracefully [0.06ms]\n@codebuff/backend test: (fail) read_docs tool with researcher agent > should include topic in error message when specified [0.05ms]\n@codebuff/backend test: (fail) read_docs tool with researcher agent > should handle non-Error exceptions [0.05ms]\n@codebuff/backend test: (fail) processFileBlockModule > processFileBlock > should handle Windows line endings with multi-line changes [317.18ms]\n@codebuff/backend test: (fail) processFileBlockModule > processFileBlock > should handle multiple diff blocks in a single file [380.38ms]\n@codebuff/backend test: (fail) processFileBlockModule > processFileBlock > should preserve Windows line endings in patch and content [489.82ms]\n@codebuff/backend test: (fail) runProgrammaticStep > tool execution > should execute single tool call [0.31ms]\n@codebuff/backend test: (fail) runProgrammaticStep > tool execution > should add find_files tool result to messageHistory [1.32ms]\n@codebuff/backend test: (fail) runProgrammaticStep > tool execution > should execute multiple tool calls in sequence [0.21ms]\n@codebuff/backend test: (fail) runProgrammaticStep > tool execution > should comprehensively test STEP_ALL functionality with multiple tools and state management [0.33ms]\n@codebuff/backend test: (fail) runProgrammaticStep > tool execution > should pass tool results back to generator [0.15ms]\n@codebuff/backend test: (fail) runProgrammaticStep > generator control flow > should handle STEP value to break execution [0.10ms]\n@codebuff/backend test: (fail) runProgrammaticStep > generator control flow > should end turn when end_turn tool is called [0.12ms]\n@codebuff/backend test: (fail) runProgrammaticStep > state management > should preserve agent state changes [0.07ms]\n@codebuff/backend test: (fail) runProgrammaticStep > state management > should preserve message history [0.10ms]\n@codebuff/backend test: (fail) runProgrammaticStep > error handling > should handle tool execution errors [0.13ms]\n@codebuff/backend test: (fail) runProgrammaticStep > output schema validation > should validate output against outputSchema when using setOutput [0.20ms]\n@codebuff/backend test: (fail) runProgrammaticStep > output schema validation > should work with agents that have no outputSchema [0.17ms]\n@codebuff/backend test: (fail) runProgrammaticStep > output schema validation > should work with outputMode structured_output but no outputSchema defined [0.15ms]\n@codebuff/backend test: (fail) runProgrammaticStep > logging and context > should generate unique agent step ID [0.11ms]\n@codebuff/backend test: (fail) QuickJS Sandbox Generator > should execute string-based generator in QuickJS sandbox [29.84ms]\n@codebuff/backend test: (fail) loopAgentSteps STEP behavior > should verify correct STEP behavior - LLM called once after STEP [1.16ms]\n@codebuff/backend test: \n@codebuff/backend test: 211 pass\n@codebuff/backend test: 7 skip\n@codebuff/backend test: 38 fail\n@codebuff/backend test: 4 errors\n@codebuff/backend test: 518 expect() calls\n@codebuff/backend test: Ran 256 tests across 29 files. [5.14s]\n@codebuff/backend test: Exited with code 1\n", - "stderr": "$ bun --filter='{@codebuff/backend,@codebuff/common,@codebuff/npm-app}' run test\nerror: script \"test\" exited with code 1\n", - "exitCode": 1 - } - } - ], - "parentAgentId": "D-1-F0_olPY" - }, - { - "type": "text", - "agentId": "D-1-F0_olPY", - "text": "**@codebuff/common tests:** 164 passed, 1 skipped, 0 failed. Ran 165 tests across 10 files in 517ms. Exited with code 0.\n\n**@codebuff/backend tests:** 211 passed, 7 skipped, **38 failed**, 4 errors. Ran 256 tests across 29 files in 5.14s. Exited with code 1.\n\n**Key failures/errors:**\n- `sandbox-generator.test.ts`: QuickJS Sandbox Generator > should execute string-based generator in QuickJS sandbox (expect mismatch on agentState.output; received error: \"Cannot access 'sendMessage' before initialization\").\n- `loop-agent-steps.test.ts`: loopAgentSteps STEP behavior > should verify correct STEP behavior (ReferenceError: Cannot access 'asyncAgentManager' before initialization).\n- Unhandled errors: TypeError in `dry-run.ts` (AGENT_PERSONAS.dry_run undefined); ReferenceError in `mock-modules.ts` and `run-agent-step.ts`.\n- 38 total fails including: runAgentStep (set_output tool cases), mainPrompt (file updates, terminal commands, etc.), processFileBlockModule (Windows line endings, multi-line changes), runProgrammaticStep (tool execution, STEP_ALL, errors).\n\nOverall exit code: 1 (due to backend failures)." - }, - { - "type": "subagent_finish", - "agentId": "D-1-F0_olPY", - "agentType": "commander-lite", - "displayName": "Commander Lite", - "onlyChild": false, - "parentAgentId": "main-agent", - "prompt": "Run relevant package tests if any affected.", - "params": { - "command": "bun run test", - "timeout_seconds": 120 - } - }, - { - "type": "tool_result", - "toolCallId": "0c636b39-7349-4e7a-85b2-477c2680fda3", - "toolName": "run_terminal_command", - "output": [ - { - "type": "json", - "value": { - "command": "bun run format --check", - "stdout": "Checking formatting...\n", - "stderr": "$ prettier --write \"**/*.{ts,tsx,json,md}\" --check\n[warn] backend/src/templates/agents/agent-builder.ts\n[warn] backend/src/tools/definitions/tool/spawn-agent-inline.ts\n[warn] backend/src/util/messages.ts\n[warn] common/src/db/migrations/meta/_journal.json\n[warn] common/src/db/migrations/meta/0027_snapshot.json\n[warn] common/src/db/migrations/meta/0028_snapshot.json\n[warn] common/src/tools/params/tool/spawn-agent-inline.ts\n[warn] common/src/util/error.ts\n[warn] scripts/convert-escaped-newlines.ts\n[warn] sdk/CHANGELOG.md\n[warn] sdk/PUBLISHING.md\n[warn] sdk/src/tools/read-files.ts\n[warn] web/src/app/api/agents/route.ts\n[warn] web/src/app/api/orgs/[orgId]/publishers/route.ts\n[warn] web/src/app/api/publishers/[id]/organization/route.ts\n[warn] web/src/components/publisher/basic-info-step.tsx\n[warn] web/src/components/publisher/step-template.tsx\n[warn] web/src/hooks/use-user-profile.ts\n[warn] web/src/lib/publisher-permissions.ts\n[warn] Code style issues fixed in 19 files.\n", - "exitCode": 0 - } - } - ], - "parentAgentId": "D-1-F9QrDRM" - }, - { - "type": "tool_result", - "toolCallId": "7406ef13-feaa-4621-8d92-44c6500769ca", - "toolName": "run_terminal_command", - "output": [ - { - "type": "json", - "value": { - "command": "bun run typecheck", - "stdout": "@codebuff/code-map typecheck: Exited with code 0\n@codebuff/bigquery typecheck: Exited with code 0\n@codebuff/sdk typecheck: Exited with code 0\n@codebuff/internal typecheck: Exited with code 0\n@codebuff/billing typecheck: Exited with code 0\n@codebuff/npm-app typecheck: Exited with code 0\n@codebuff/common typecheck: Exited with code 0\n@codebuff/scripts typecheck: ../backend/src/templates/agents/agent-builder.ts(90,3): error TS2741: Property 'spawnableAgents' is missing in type '{ model: Model; displayName: string; spawnPurposePrompt: string; inputSchema: { prompt: ZodOptional; params: ZodOptional; purpose: ZodOptional<...>; specialty: ZodOptional<...>; model: ZodOptional<...>; }, $loose>>; }; ... 6 more ...; handleSteps: () => Generator<....' but required in type 'Omit'.\n@codebuff/scripts typecheck: ../backend/src/templates/agents/archive/dry-run.ts(11,31): error TS2339: Property 'dry_run' does not exist on type '{ readonly base: { readonly displayName: \"Buffy the Enthusiastic Coding Assistant\"; readonly purpose: \"Base agent that orchestrates the full response.\"; }; readonly base_lite: { readonly displayName: \"Buffy the Enthusiastic Coding Assistant\"; readonly purpose: \"Base agent that orchestrates the full response.\"; }; .....'.\n@codebuff/scripts typecheck: ../backend/src/templates/agents/archive/dry-run.ts(12,38): error TS2339: Property 'dry_run' does not exist on type '{ readonly base: { readonly displayName: \"Buffy the Enthusiastic Coding Assistant\"; readonly purpose: \"Base agent that orchestrates the full response.\"; }; readonly base_lite: { readonly displayName: \"Buffy the Enthusiastic Coding Assistant\"; readonly purpose: \"Base agent that orchestrates the full response.\"; }; .....'.\n@codebuff/scripts typecheck: Exited with code 2\n@codebuff/backend typecheck: src/templates/agents/agent-builder.ts(90,3): error TS2741: Property 'spawnableAgents' is missing in type '{ model: Model; displayName: string; spawnPurposePrompt: string; inputSchema: { prompt: ZodOptional; params: ZodOptional; purpose: ZodOptional<...>; specialty: ZodOptional<...>; model: ZodOptional<...>; }, $loose>>; }; ... 6 more ...; handleSteps: () => Generator<....' but required in type 'Omit'.\n@codebuff/backend typecheck: src/templates/agents/archive/dry-run.ts(11,31): error TS2339: Property 'dry_run' does not exist on type '{ readonly base: { readonly displayName: \"Buffy the Enthusiastic Coding Assistant\"; readonly purpose: \"Base agent that orchestrates the full response.\"; }; readonly base_lite: { readonly displayName: \"Buffy the Enthusiastic Coding Assistant\"; readonly purpose: \"Base agent that orchestrates the full response.\"; }; .....'.\n@codebuff/backend typecheck: src/templates/agents/archive/dry-run.ts(12,38): error TS2339: Property 'dry_run' does not exist on type '{ readonly base: { readonly displayName: \"Buffy the Enthusiastic Coding Assistant\"; readonly purpose: \"Base agent that orchestrates the full response.\"; }; readonly base_lite: { readonly displayName: \"Buffy the Enthusiastic Coding Assistant\"; readonly purpose: \"Base agent that orchestrates the full response.\"; }; .....'.\n@codebuff/backend typecheck: Exited with code 2\n@codebuff/evals typecheck: ../backend/src/templates/agents/agent-builder.ts(90,3): error TS2741: Property 'spawnableAgents' is missing in type '{ model: Model; displayName: string; spawnPurposePrompt: string; inputSchema: { prompt: ZodOptional; params: ZodOptional; purpose: ZodOptional<...>; specialty: ZodOptional<...>; model: ZodOptional<...>; }, $loose>>; }; ... 6 more ...; handleSteps: () => Generator<....' but required in type 'Omit'.\n@codebuff/evals typecheck: ../backend/src/templates/agents/archive/dry-run.ts(11,31): error TS2339: Property 'dry_run' does not exist on type '{ readonly base: { readonly displayName: \"Buffy the Enthusiastic Coding Assistant\"; readonly purpose: \"Base agent that orchestrates the full response.\"; }; readonly base_lite: { readonly displayName: \"Buffy the Enthusiastic Coding Assistant\"; readonly purpose: \"Base agent that orchestrates the full response.\"; }; .....'.\n@codebuff/evals typecheck: ../backend/src/templates/agents/archive/dry-run.ts(12,38): error TS2339: Property 'dry_run' does not exist on type '{ readonly base: { readonly displayName: \"Buffy the Enthusiastic Coding Assistant\"; readonly purpose: \"Base agent that orchestrates the full response.\"; }; readonly base_lite: { readonly displayName: \"Buffy the Enthusiastic Coding Assistant\"; readonly purpose: \"Base agent that orchestrates the full response.\"; }; .....'.\n@codebuff/evals typecheck: Exited with code 2\n@codebuff/web typecheck: Exited with code 0\n", - "stderr": "$ bun --filter='*' run typecheck && echo '✅ All type checks passed!'\n", - "exitCode": 2 - } - } - ], - "parentAgentId": "D-1-F5QYws4" - }, - { - "type": "text", - "agentId": "D-1-F9QrDRM", - "text": "**Formatting check results:** Issues detected in 19 files (listed with [warn]):\n\n- `backend/src/templates/agents/agent-builder.ts`\n- `backend/src/tools/definitions/tool/spawn-agent-inline.ts`\n- `backend/src/util/messages.ts`\n- `common/src/db/migrations/meta/_journal.json`\n- `common/src/db/migrations/meta/0027_snapshot.json`\n- `common/src/db/migrations/meta/0028_snapshot.json`\n- `common/src/tools/params/tool/spawn-agent-inline.ts`\n- `common/src/util/error.ts`\n- `scripts/convert-escaped-newlines.ts`\n- `sdk/CHANGELOG.md`\n- `sdk/PUBLISHING.md`\n- `sdk/src/tools/read-files.ts`\n- `web/src/app/api/agents/route.ts`\n- `web/src/app/api/orgs/[orgId]/publishers/route.ts`\n- `web/src/app/api/publishers/[id]/organization/route.ts`\n- `web/src/components/publisher/basic-info-step.tsx`\n- `web/src/components/publisher/step-template.tsx`\n- `web/src/hooks/use-user-profile.ts`\n- `web/src/lib/publisher-permissions.ts`\n\nOutput notes: \"Code style issues fixed in 19 files.\" (exit code: 0)" - }, - { - "type": "subagent_finish", - "agentId": "D-1-F9QrDRM", - "agentType": "commander-lite", - "displayName": "Commander Lite", - "onlyChild": false, - "parentAgentId": "main-agent", - "prompt": "Check if any formatting issues.", - "params": { - "command": "bun run format --check", - "timeout_seconds": 60 - } - }, - { - "type": "text", - "agentId": "D-1-F5QYws4", - "text": "Typecheck failed with overall exit code 2.\n\n**Packages that passed (exit code 0):**\n- @codebuff/code-map\n- @codebuff/bigquery\n- @codebuff/sdk\n- @codebuff/internal\n- @codebuff/billing\n- @codebuff/npm-app\n- @codebuff/common\n- @codebuff/web\n\n**Packages that failed (exit code 2):**\n- @codebuff/scripts\n- @codebuff/backend\n- @codebuff/evals\n\n**Errors (repeated across failed packages):**\n- `../backend/src/templates/agents/agent-builder.ts(90,3): error TS2741: Property 'spawnableAgents' is missing in type '{ model: Model; displayName: string; ... }' but required in type 'Omit'`\n- `../backend/src/templates/agents/archive/dry-run.ts(11,31): error TS2339: Property 'dry_run' does not exist on type '{ readonly base: { ... }; ... }'`\n- `../backend/src/templates/agents/archive/dry-run.ts(12,38): error TS2339: Property 'dry_run' does not exist on type '{ readonly base: { ... }; ... }'`" - }, - { - "type": "subagent_finish", - "agentId": "D-1-F5QYws4", - "agentType": "commander-lite", - "displayName": "Commander Lite", - "onlyChild": false, - "parentAgentId": "main-agent", - "prompt": "Run root typecheck to validate TypeScript changes.", - "params": { - "command": "bun run typecheck", - "timeout_seconds": 120 - } - }, - { - "type": "tool_result", - "toolCallId": "D-oYtCzzjlw", - "toolName": "spawn_agents", - "output": [ - { - "type": "json", - "value": [ - { - "agentName": "Commander Lite", - "agentType": "commander-lite", - "value": { - "type": "lastMessage", - "value": [ - { - "role": "assistant", - "content": [ - { - "type": "text", - "text": "Typecheck failed with overall exit code 2.\n\n**Packages that passed (exit code 0):**\n- @codebuff/code-map\n- @codebuff/bigquery\n- @codebuff/sdk\n- @codebuff/internal\n- @codebuff/billing\n- @codebuff/npm-app\n- @codebuff/common\n- @codebuff/web\n\n**Packages that failed (exit code 2):**\n- @codebuff/scripts\n- @codebuff/backend\n- @codebuff/evals\n\n**Errors (repeated across failed packages):**\n- `../backend/src/templates/agents/agent-builder.ts(90,3): error TS2741: Property 'spawnableAgents' is missing in type '{ model: Model; displayName: string; ... }' but required in type 'Omit'`\n- `../backend/src/templates/agents/archive/dry-run.ts(11,31): error TS2339: Property 'dry_run' does not exist on type '{ readonly base: { ... }; ... }'`\n- `../backend/src/templates/agents/archive/dry-run.ts(12,38): error TS2339: Property 'dry_run' does not exist on type '{ readonly base: { ... }; ... }'`" - } - ] - } - ] - } - }, - { - "agentName": "Commander Lite", - "agentType": "commander-lite", - "value": { - "type": "lastMessage", - "value": [ - { - "role": "assistant", - "content": [ - { - "type": "text", - "text": "**@codebuff/common tests:** 164 passed, 1 skipped, 0 failed. Ran 165 tests across 10 files in 517ms. Exited with code 0.\n\n**@codebuff/backend tests:** 211 passed, 7 skipped, **38 failed**, 4 errors. Ran 256 tests across 29 files in 5.14s. Exited with code 1.\n\n**Key failures/errors:**\n- `sandbox-generator.test.ts`: QuickJS Sandbox Generator > should execute string-based generator in QuickJS sandbox (expect mismatch on agentState.output; received error: \"Cannot access 'sendMessage' before initialization\").\n- `loop-agent-steps.test.ts`: loopAgentSteps STEP behavior > should verify correct STEP behavior (ReferenceError: Cannot access 'asyncAgentManager' before initialization).\n- Unhandled errors: TypeError in `dry-run.ts` (AGENT_PERSONAS.dry_run undefined); ReferenceError in `mock-modules.ts` and `run-agent-step.ts`.\n- 38 total fails including: runAgentStep (set_output tool cases), mainPrompt (file updates, terminal commands, etc.), processFileBlockModule (Windows line endings, multi-line changes), runProgrammaticStep (tool execution, STEP_ALL, errors).\n\nOverall exit code: 1 (due to backend failures)." - } - ] - } - ] - } - }, - { - "agentName": "Commander Lite", - "agentType": "commander-lite", - "value": { - "type": "lastMessage", - "value": [ - { - "role": "assistant", - "content": [ - { - "type": "text", - "text": "**Formatting check results:** Issues detected in 19 files (listed with [warn]):\n\n- `backend/src/templates/agents/agent-builder.ts`\n- `backend/src/tools/definitions/tool/spawn-agent-inline.ts`\n- `backend/src/util/messages.ts`\n- `common/src/db/migrations/meta/_journal.json`\n- `common/src/db/migrations/meta/0027_snapshot.json`\n- `common/src/db/migrations/meta/0028_snapshot.json`\n- `common/src/tools/params/tool/spawn-agent-inline.ts`\n- `common/src/util/error.ts`\n- `scripts/convert-escaped-newlines.ts`\n- `sdk/CHANGELOG.md`\n- `sdk/PUBLISHING.md`\n- `sdk/src/tools/read-files.ts`\n- `web/src/app/api/agents/route.ts`\n- `web/src/app/api/orgs/[orgId]/publishers/route.ts`\n- `web/src/app/api/publishers/[id]/organization/route.ts`\n- `web/src/components/publisher/basic-info-step.tsx`\n- `web/src/components/publisher/step-template.tsx`\n- `web/src/hooks/use-user-profile.ts`\n- `web/src/lib/publisher-permissions.ts`\n\nOutput notes: \"Code style issues fixed in 19 files.\" (exit code: 0)" - } - ] - } - ] - } - } - ] - } - ] - }, - { - "type": "tool_call", - "toolCallId": "cf7df9fe-7f13-407b-8128-c85e3a1790d8", - "toolName": "spawn_agent_inline", - "input": { - "agent_type": "context-pruner", - "params": {} - }, - "agentId": "main-agent", - "includeToolCall": false - }, - { - "type": "tool_result", - "toolCallId": "cf7df9fe-7f13-407b-8128-c85e3a1790d8", - "toolName": "spawn_agent_inline", - "output": [ - { - "type": "json", - "value": { - "message": "Agent spawned." - } - } - ] - }, - { - "type": "tool_call", - "toolCallId": "D-4BkL8ykig", - "toolName": "spawn_agents", - "input": { - "agents": [ - { - "agent_type": "editor-gpt-5" - } - ] - }, - "agentId": "main-agent", - "includeToolCall": true - }, - { - "type": "tool_call", - "toolCallId": "D-4DhNpiT3A", - "toolName": "spawn_agents", - "input": { - "agents": [ - { - "agent_type": "commander-lite", - "prompt": "Run root typecheck after fixes.", - "params": { - "command": "bun run typecheck", - "timeout_seconds": 120 - } - }, - { - "agent_type": "commander-lite", - "prompt": "Format all files.", - "params": { - "command": "bun run format", - "timeout_seconds": 60 - } - } - ] - }, - "agentId": "main-agent", - "includeToolCall": true - }, - { - "type": "subagent_start", - "agentId": "D-4DyHWn7Os", - "agentType": "editor-gpt-5", - "displayName": "Code Editor", - "onlyChild": true, - "parentAgentId": "main-agent", - "prompt": "" - } - ] -} \ No newline at end of file diff --git a/evals/buffbench/update-sdk-types-base2-lite-error-p956.json b/evals/buffbench/update-sdk-types-base2-lite-error-p956.json deleted file mode 100644 index 95173e6046..0000000000 --- a/evals/buffbench/update-sdk-types-base2-lite-error-p956.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "type": "error", - "message": "Failed to start agent run", - "trace": [ - { - "type": "start", - "messageHistoryLength": 0 - } - ] -} \ No newline at end of file diff --git a/packages/agent-runtime/src/__tests__/run-agent-step-prefill.test.ts b/packages/agent-runtime/src/__tests__/run-agent-step-prefill.test.ts new file mode 100644 index 0000000000..168e2324ba --- /dev/null +++ b/packages/agent-runtime/src/__tests__/run-agent-step-prefill.test.ts @@ -0,0 +1,160 @@ +import * as analytics from '@codebuff/common/analytics' +import { TEST_USER_ID } from '@codebuff/common/old-constants' +import { TEST_AGENT_RUNTIME_IMPL } from '@codebuff/common/testing/impl/agent-runtime' +import { + createMockDbOperations, + setupDbSpies, +} from '@codebuff/common/testing/mocks/database' +import { getInitialSessionState } from '@codebuff/common/types/session-state' +import { promptSuccess } from '@codebuff/common/util/error' +import { assistantMessage } from '@codebuff/common/util/messages' +import { + afterEach, + beforeEach, + describe, + expect, + it, + mock, + spyOn, +} from 'bun:test' + +import { runAgentStep } from '../run-agent-step' + +import type { AgentTemplate } from '../templates/types' +import type { DbSpies } from '@codebuff/common/testing/mocks/database' +import type { + AgentRuntimeDeps, + AgentRuntimeScopedDeps, +} from '@codebuff/common/types/contracts/agent-runtime' +import type { Message } from '@codebuff/common/types/messages/codebuff-message' +import type { ParamsExcluding } from '@codebuff/common/types/function-params' +import type { ProjectFileContext } from '@codebuff/common/util/file' + +const mockFileContext: ProjectFileContext = { + projectRoot: '/test', + cwd: '/test', + fileTree: [], + fileTokenScores: {}, + knowledgeFiles: {}, + gitChanges: { + status: '', + diff: '', + diffCached: '', + lastCommitMessages: '', + }, + changesSinceLastChat: {}, + shellConfigFiles: {}, + systemInfo: { + platform: 'test', + shell: 'test', + nodeVersion: 'test', + arch: 'test', + homedir: '/home/test', + cpus: 1, + chromeAvailable: false, + }, + agentTemplates: {}, + customToolDefinitions: {}, +} + +describe('runAgentStep - assistant prefill', () => { + let agentRuntimeImpl: AgentRuntimeDeps & AgentRuntimeScopedDeps + let runAgentStepBaseParams: ParamsExcluding< + typeof runAgentStep, + | 'agentType' + | 'prompt' + | 'localAgentTemplates' + | 'agentState' + | 'agentTemplate' + > + let dbSpies: DbSpies + let capturedMessages: Message[] + + const makeAgent = (model: string): AgentTemplate => ({ + id: 'test-prefill-agent', + displayName: 'Test Prefill Agent', + spawnerPrompt: 'Testing assistant prefill handling', + model, + inputSchema: {}, + outputMode: 'last_message' as const, + includeMessageHistory: true, + inheritParentSystemPrompt: false, + mcpServers: {}, + toolNames: [], + spawnableAgents: [], + systemPrompt: 'Test system prompt', + instructionsPrompt: '', + stepPrompt: '', + }) + + beforeEach(() => { + agentRuntimeImpl = { ...TEST_AGENT_RUNTIME_IMPL, sendAction: () => {} } + dbSpies = setupDbSpies(createMockDbOperations()) + spyOn(analytics, 'trackEvent').mockImplementation(() => {}) + + capturedMessages = [] + runAgentStepBaseParams = { + ...agentRuntimeImpl, + + additionalToolDefinitions: () => Promise.resolve({}), + ancestorRunIds: [], + clientSessionId: 'test-session', + fileContext: mockFileContext, + fingerprintId: 'test-fingerprint', + onResponseChunk: () => {}, + repoId: undefined, + repoUrl: undefined, + runId: 'test-run-id', + signal: new AbortController().signal, + spawnParams: undefined, + system: 'Test system prompt', + tools: {}, + userId: TEST_USER_ID, + userInputId: 'test-input', + promptAiSdkStream: async function* ({ messages }) { + capturedMessages = messages + yield { type: 'text' as const, text: 'response text' } + return promptSuccess('mock-message-id') + }, + } + }) + + afterEach(() => { + dbSpies.restore() + mock.restore() + }) + + const runWithTrailingAssistantMessage = async (model: string) => { + const agent = makeAgent(model) + const sessionState = getInitialSessionState(mockFileContext) + const agentState = sessionState.mainAgentState + agentState.messageHistory = [assistantMessage('partial thought')] + + await runAgentStep({ + ...runAgentStepBaseParams, + agentType: agent.id, + localAgentTemplates: { [agent.id]: agent }, + agentTemplate: agent, + agentState, + prompt: undefined, + }) + } + + it('appends a user message when history ends with assistant on Claude 4.6+', async () => { + await runWithTrailingAssistantMessage('anthropic/claude-opus-4.7') + + // Skip the system message prepended by getAgentStreamFromTemplate + const last = capturedMessages[capturedMessages.length - 1] + expect(last.role).toBe('user') + expect(JSON.stringify(last.content)).toContain( + 'Continue from where you left off.', + ) + }) + + it('keeps trailing assistant message for models that support prefill', async () => { + await runWithTrailingAssistantMessage('anthropic/claude-sonnet-4.5') + + const last = capturedMessages[capturedMessages.length - 1] + expect(last.role).toBe('assistant') + }) +}) diff --git a/packages/agent-runtime/src/run-agent-step.ts b/packages/agent-runtime/src/run-agent-step.ts index 3184d7ca63..b82997c39f 100644 --- a/packages/agent-runtime/src/run-agent-step.ts +++ b/packages/agent-runtime/src/run-agent-step.ts @@ -1,6 +1,9 @@ import { AnalyticsEvent } from '@codebuff/common/constants/analytics-events' import { shouldUseLocalTokenCountForFreebuffDeepseekFlash } from '@codebuff/common/constants/free-agents' -import { supportsCacheControl } from '@codebuff/common/old-constants' +import { + supportsAssistantPrefill, + supportsCacheControl, +} from '@codebuff/common/old-constants' import { TOOLS_WHICH_WONT_FORCE_NEXT_STEP } from '@codebuff/common/tools/constants' import { buildArray } from '@codebuff/common/util/array' import { @@ -258,6 +261,23 @@ export const runAgentStep = async ( const { model } = agentTemplate + // A step can start with the history ending on an assistant message — e.g. a + // continuation after a think-only response for an agent with no stepPrompt. + // Claude 4.6+ rejects such requests as unsupported assistant prefill, so end + // the conversation with a user message instead. + const lastMessage = + agentState.messageHistory[agentState.messageHistory.length - 1] + if (lastMessage?.role === 'assistant' && !supportsAssistantPrefill(model)) { + agentState.messageHistory = [ + ...agentState.messageHistory, + userMessage({ + content: withSystemTags('Continue from where you left off.'), + timeToLive: 'agentStep' as const, + keepDuringTruncation: true, + }), + ] + } + let stepCreditsUsed = 0 const onCostCalculated = async (credits: number) => { From f2c7de26476351e3553a0557a6a89e9ee36657af Mon Sep 17 00:00:00 2001 From: codebuff public sync bot <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 11 Jun 2026 03:42:52 +0000 Subject: [PATCH 56/96] Sync public snapshot from freebuff-private Source: CodebuffAI/freebuff-private@fa45638f472a84aa4b2155a366df89bbce5c9449 --- agents/base2/base2.ts | 4 +++- agents/types/agent-definition.ts | 2 ++ bun.lock | 2 -- common/src/constants/anthropic.ts | 4 ++++ .../templates/initial-agents-dir/types/agent-definition.ts | 2 ++ 5 files changed, 11 insertions(+), 3 deletions(-) diff --git a/agents/base2/base2.ts b/agents/base2/base2.ts index c021b722c9..5a4fde1635 100644 --- a/agents/base2/base2.ts +++ b/agents/base2/base2.ts @@ -56,7 +56,9 @@ export function createBase2( ? deepseekModels.deepseekV4Flash : mode === 'free' ? FREEBUFF_MINIMAX_MODEL_ID - : 'anthropic/claude-opus-4.7') + : isMax + ? 'anthropic/claude-fable-5' + : 'anthropic/claude-opus-4.8') // Smart freebuff model variants (Kimi, DeepSeek) can offload deeper // reasoning. Fast MiniMax omits the extra round trip by construction. const hasFreeGeminiThinker = diff --git a/agents/types/agent-definition.ts b/agents/types/agent-definition.ts index 39f8ec9bad..9355667dfd 100644 --- a/agents/types/agent-definition.ts +++ b/agents/types/agent-definition.ts @@ -379,7 +379,9 @@ export type ModelName = | 'openai/gpt-5-nano' // Anthropic + | 'anthropic/claude-fable-5' | 'anthropic/claude-sonnet-4.6' + | 'anthropic/claude-opus-4.8' | 'anthropic/claude-opus-4.7' | 'anthropic/claude-opus-4.6' | 'anthropic/claude-opus-4.5' diff --git a/bun.lock b/bun.lock index 93665ce75c..3e972925d1 100644 --- a/bun.lock +++ b/bun.lock @@ -1657,8 +1657,6 @@ "@opentui/core/strip-ansi": ["strip-ansi@7.1.2", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA=="], - "@types/diff/diff": ["diff@9.0.0", "", {}, "sha512-svtcdpS8CgJyqAjEQIXdb3OjhFVVYjzGAPO8WGCmRbrml64SPw/jJD4GoE98aR7r25A0XcgrK3F02yw9R/vhQw=="], - "@typescript-eslint/eslint-plugin/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], "@typescript-eslint/parser/@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@7.18.0", "", { "dependencies": { "@typescript-eslint/types": "7.18.0", "@typescript-eslint/visitor-keys": "7.18.0" } }, "sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA=="], diff --git a/common/src/constants/anthropic.ts b/common/src/constants/anthropic.ts index 8ad7deb6bb..ac171ec916 100644 --- a/common/src/constants/anthropic.ts +++ b/common/src/constants/anthropic.ts @@ -33,7 +33,11 @@ const OPENROUTER_TO_ANTHROPIC_MODEL_MAP: Record = { 'anthropic/claude-4-sonnet-20250522': 'claude-sonnet-4-20250514', 'anthropic/claude-4-sonnet': 'claude-sonnet-4-20250514', + // Claude 5.x models + 'anthropic/claude-fable-5': 'claude-fable-5', + // Claude 4.x Opus models + 'anthropic/claude-opus-4.8': 'claude-opus-4-8', 'anthropic/claude-opus-4.7': 'claude-opus-4-7', 'anthropic/claude-opus-4.6': 'claude-opus-4-6', 'anthropic/claude-opus-4.5': 'claude-opus-4-5-20251101', diff --git a/common/src/templates/initial-agents-dir/types/agent-definition.ts b/common/src/templates/initial-agents-dir/types/agent-definition.ts index 39f8ec9bad..9355667dfd 100644 --- a/common/src/templates/initial-agents-dir/types/agent-definition.ts +++ b/common/src/templates/initial-agents-dir/types/agent-definition.ts @@ -379,7 +379,9 @@ export type ModelName = | 'openai/gpt-5-nano' // Anthropic + | 'anthropic/claude-fable-5' | 'anthropic/claude-sonnet-4.6' + | 'anthropic/claude-opus-4.8' | 'anthropic/claude-opus-4.7' | 'anthropic/claude-opus-4.6' | 'anthropic/claude-opus-4.5' From 1ba76cd363752bbde727e533cc27df8eb1291e26 Mon Sep 17 00:00:00 2001 From: codebuff public sync bot <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 11 Jun 2026 05:11:52 +0000 Subject: [PATCH 57/96] Sync public snapshot from freebuff-private Source: CodebuffAI/freebuff-private@dd0ced9a7d41fd3cb5adfd924b70297efbb3aa45 --- .gitignore | 1 + agents/base-chat.ts | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 34 insertions(+) create mode 100644 agents/base-chat.ts diff --git a/.gitignore b/.gitignore index c7176c9f79..991a4c08fa 100644 --- a/.gitignore +++ b/.gitignore @@ -33,6 +33,7 @@ docs/bot-detection.md # Infisical config (user-specific) .infisical.json +.gstack/ # Buffbench DEBUG_ERROR dumps evals/buffbench/*-error-*.json diff --git a/agents/base-chat.ts b/agents/base-chat.ts new file mode 100644 index 0000000000..d1a33ad1d9 --- /dev/null +++ b/agents/base-chat.ts @@ -0,0 +1,33 @@ +import { FREEBUFF_DEEPSEEK_V4_FLASH_MODEL_ID } from '@codebuff/common/constants/freebuff-models' + +import { publisher } from './constants' + +import type { SecretAgentDefinition } from './types/secret-agent-definition' + +/** + * Conversational agent behind freebuff.com/chat. Runs with no filesystem and + * no tools for now; subagents (e.g. researcher-web) will be added in a + * follow-up. The chat server may override `model` per request (DeepSeek + * Flash vs Pro for full-access users). + */ +const definition: SecretAgentDefinition = { + id: 'base-chat', + publisher, + model: FREEBUFF_DEEPSEEK_V4_FLASH_MODEL_ID, + displayName: 'Freebuff Chat', + spawnerPrompt: 'General-purpose chat assistant for freebuff.com/chat.', + inputSchema: { + prompt: { + type: 'string', + description: 'The user message to respond to.', + }, + }, + outputMode: 'last_message', + toolNames: [], + spawnableAgents: [], + + systemPrompt: `You are Freebuff Chat, a friendly, sharp assistant made by Freebuff (freebuff.com), the home of free AI coding tools. You are chatting with a user in a web interface that renders markdown.`, + instructionsPrompt: `Be direct and helpful. Use markdown when it improves clarity (code blocks, lists, tables), and keep answers as short as they can be while fully answering the question. You do not have access to tools, the user's files, or the internet — if asked to do something that requires those, say so briefly and help with what you know instead.`, +} + +export default definition From 5abe3bad5becdea115bfab307ae58498d6e0f2f1 Mon Sep 17 00:00:00 2001 From: codebuff public sync bot <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 11 Jun 2026 05:52:11 +0000 Subject: [PATCH 58/96] Sync public snapshot from freebuff-private Source: CodebuffAI/freebuff-private@c355854b7b3547c27ceee4a2bd525a81cc83dff2 --- cli/src/hooks/use-send-message.ts | 19 +- cli/src/index.tsx | 6 + cli/src/types/env.ts | 1 + cli/src/utils/__tests__/trace-writer.test.ts | 178 ++++++++++++++++++ .../utils/__tests__/trim-chat-logs.test.ts | 84 +++++++++ cli/src/utils/chat-history.ts | 44 ++++- cli/src/utils/codebuff-client.ts | 2 + cli/src/utils/env.ts | 1 + cli/src/utils/logger.ts | 10 +- cli/src/utils/trace-writer.ts | 134 +++++++++++++ common/src/types/contracts/agent-runtime.ts | 3 + common/src/types/contracts/trace.ts | 21 +++ .../src/__tests__/loop-agent-steps.test.ts | 28 +++ packages/agent-runtime/src/main-prompt.ts | 13 +- packages/agent-runtime/src/run-agent-step.ts | 45 +++-- sdk/src/impl/agent-runtime.ts | 4 + sdk/src/index.ts | 1 + sdk/src/run.ts | 7 + 18 files changed, 584 insertions(+), 17 deletions(-) create mode 100644 cli/src/utils/__tests__/trace-writer.test.ts create mode 100644 cli/src/utils/__tests__/trim-chat-logs.test.ts create mode 100644 cli/src/utils/trace-writer.ts create mode 100644 common/src/types/contracts/trace.ts diff --git a/cli/src/hooks/use-send-message.ts b/cli/src/hooks/use-send-message.ts index b66e046fa0..4dd3ece226 100644 --- a/cli/src/hooks/use-send-message.ts +++ b/cli/src/hooks/use-send-message.ts @@ -467,8 +467,25 @@ export const useSendMessage = ({ : undefined, }) + // Log a summary only: the full run config contains the entire + // conversation history and attachments, which bloats log.jsonl. logger.info( - { runConfig }, + { + runConfig: { + agent: + typeof resolvedAgent === 'string' + ? resolvedAgent + : resolvedAgent.id, + promptLength: effectivePrompt.length, + contentBlockCount: messageContent?.length ?? 0, + previousMessageCount: + previousRunStateRef.current?.sessionState?.mainAgentState + .messageHistory.length ?? 0, + agentDefinitionCount: agentDefinitions.length, + costMode: runConfig.costMode, + maxAgentSteps: runConfig.maxAgentSteps, + }, + }, '[send-message] Sending message with sdk run config', ) const runState = await client.run(runConfig) diff --git a/cli/src/index.tsx b/cli/src/index.tsx index 8350900c46..4291cc02e0 100644 --- a/cli/src/index.tsx +++ b/cli/src/index.tsx @@ -35,6 +35,7 @@ import { resetCodebuffClient } from './utils/codebuff-client' import { setApiClientAuthToken } from './utils/codebuff-api' import { IS_FREEBUFF } from './utils/constants' import { initializeAgentRegistry } from './utils/local-agent-registry' +import { trimOversizedChatLogs } from './utils/chat-history' import { clearLogFile, logger } from './utils/logger' import { shouldShowProjectPicker } from './utils/project-picker' import { saveRecentProject } from './utils/recent-projects' @@ -245,6 +246,11 @@ async function main(): Promise { clearLogFile() } + // Reclaim disk from oversized debug logs left by older versions that logged + // the full conversation to log.jsonl. Deferred to keep the stat sweep over + // chat directories off the startup path. + setTimeout(trimOversizedChatLogs, 0) + const queryClient = createQueryClient() const AppWithAsyncAuth = () => { diff --git a/cli/src/types/env.ts b/cli/src/types/env.ts index 74ea34966d..1d45aeb0fb 100644 --- a/cli/src/types/env.ts +++ b/cli/src/types/env.ts @@ -74,6 +74,7 @@ export type CliEnv = BaseEnv & { CODEBUFF_RG_PATH?: string CODEBUFF_SCROLL_MULTIPLIER?: string CODEBUFF_PERF_TEST?: string + CODEBUFF_TRACE?: string FREEBUFF_MODE?: string } diff --git a/cli/src/utils/__tests__/trace-writer.test.ts b/cli/src/utils/__tests__/trace-writer.test.ts new file mode 100644 index 0000000000..21467bf3c9 --- /dev/null +++ b/cli/src/utils/__tests__/trace-writer.test.ts @@ -0,0 +1,178 @@ +import { describe, test, expect, beforeEach, afterEach, mock } from 'bun:test' +import * as fs from 'fs' +import * as os from 'os' +import * as path from 'path' + +let tempDir = '' + +mock.module('../../project-files', () => ({ + getProjectRoot: () => tempDir, + getCurrentChatDir: () => path.join(tempDir, 'chats', 'current'), +})) + +// Force tracing on and pin the dev path so the test is deterministic +mock.module('@codebuff/common/env', () => ({ + IS_DEV: true, +})) + +import { createTraceWriter } from '../trace-writer' + +import type { Message } from '@codebuff/common/types/messages/codebuff-message' + +function readTraceLines(): any[] { + const tracePath = path.join(tempDir, 'debug', 'trace.jsonl') + if (!fs.existsSync(tracePath)) return [] + return fs + .readFileSync(tracePath, 'utf8') + .trim() + .split('\n') + .map((line) => JSON.parse(line)) +} + +const userMessage = (text: string): Message => ({ + role: 'user', + content: [{ type: 'text', text }], +}) +const assistantMessage = (text: string): Message => ({ + role: 'assistant', + content: [{ type: 'text', text }], +}) + +const baseParams = { + agentId: 'agent-1', + agentType: 'base', + runId: 'run-1', + userInputId: 'input-1', + system: undefined, +} + +describe('createTraceWriter', () => { + beforeEach(() => { + tempDir = fs.mkdtempSync(path.join(os.tmpdir(), 'codebuff-trace-')) + }) + + afterEach(() => { + fs.rmSync(tempDir, { recursive: true, force: true }) + }) + + test('writes each message exactly once across steps', () => { + const writer = createTraceWriter()! + const history = [userMessage('hello')] + + writer.recordStep({ ...baseParams, step: 1, messages: history }) + history.push(assistantMessage('hi there')) + writer.recordStep({ ...baseParams, step: 1, messages: history }) + // Re-recording the same history adds nothing + writer.recordStep({ ...baseParams, step: 2, messages: history }) + + const lines = readTraceLines() + expect(lines).toHaveLength(2) + expect(lines.map((l) => l.message.role)).toEqual(['user', 'assistant']) + expect(lines.map((l) => l.index)).toEqual([0, 1]) + }) + + test('records system prompt once and again only when it changes', () => { + const writer = createTraceWriter()! + + writer.recordStep({ + ...baseParams, + step: 1, + system: 'be helpful', + messages: [userMessage('hello')], + }) + writer.recordStep({ + ...baseParams, + step: 2, + system: 'be helpful', + messages: [userMessage('hello'), assistantMessage('hi')], + }) + writer.recordStep({ + ...baseParams, + step: 3, + system: 'be terse', + messages: [ + userMessage('hello'), + assistantMessage('hi'), + userMessage('more'), + ], + }) + + const systemLines = readTraceLines().filter((l) => l.type === 'system') + expect(systemLines.map((l) => l.system)).toEqual([ + 'be helpful', + 'be terse', + ]) + }) + + test('detects history rewrites and re-dumps the new history', () => { + const writer = createTraceWriter()! + + writer.recordStep({ + ...baseParams, + step: 1, + messages: [ + userMessage('a'), + assistantMessage('b'), + userMessage('c'), + ], + }) + // Compaction: history replaced with a shorter one + writer.recordStep({ + ...baseParams, + step: 2, + messages: [userMessage('summary of earlier conversation')], + }) + + const lines = readTraceLines() + const marker = lines.find((l) => l.type === 'history_rewritten') + expect(marker).toBeDefined() + expect(marker.previousMessageCount).toBe(3) + expect(marker.messageCount).toBe(1) + // 3 original + 1 re-dumped after the marker + expect(lines.filter((l) => l.type === 'message')).toHaveLength(4) + }) + + test('tracks agents independently', () => { + const writer = createTraceWriter()! + + writer.recordStep({ + ...baseParams, + step: 1, + messages: [userMessage('main')], + }) + writer.recordStep({ + ...baseParams, + agentId: 'agent-2', + agentType: 'researcher', + step: 1, + messages: [userMessage('sub')], + }) + + const lines = readTraceLines() + expect(lines.filter((l) => l.type === 'history_rewritten')).toHaveLength(0) + expect(lines.map((l) => l.agentId)).toEqual(['agent-1', 'agent-2']) + }) + + test('writes base64 image data in full', () => { + const base64 = 'a'.repeat(10_000) + const writer = createTraceWriter()! + + writer.recordStep({ + ...baseParams, + step: 1, + messages: [ + { + role: 'user', + content: [ + { type: 'text', text: 'look at this' }, + { type: 'image', image: base64, mediaType: 'image/png' }, + ], + } as Message, + ], + }) + + const lines = readTraceLines() + expect(lines).toHaveLength(1) + expect(lines[0].message.content[1].image).toBe(base64) + }) +}) diff --git a/cli/src/utils/__tests__/trim-chat-logs.test.ts b/cli/src/utils/__tests__/trim-chat-logs.test.ts new file mode 100644 index 0000000000..a93d633dcc --- /dev/null +++ b/cli/src/utils/__tests__/trim-chat-logs.test.ts @@ -0,0 +1,84 @@ +import { describe, test, expect, beforeEach, afterEach, mock } from 'bun:test' +import * as fs from 'fs' +import * as os from 'os' +import * as path from 'path' + +let tempDataDir = '' + +mock.module('../../project-files', () => ({ + getProjectDataDir: () => tempDataDir, + getProjectRoot: () => tempDataDir, + getCurrentChatDir: () => path.join(tempDataDir, 'chats', 'current'), +})) + +mock.module('../logger', () => ({ + CHAT_LOG_FILENAME: 'log.jsonl', + logger: { + debug: () => {}, + info: () => {}, + warn: () => {}, + error: () => {}, + fatal: () => {}, + }, +})) + +import { trimOversizedChatLogs } from '../chat-history' + +function writeLog( + chatId: string, + sizeBytes: number, + { ageDays = 0 }: { ageDays?: number } = {}, +) { + const chatDir = path.join(tempDataDir, 'chats', chatId) + fs.mkdirSync(chatDir, { recursive: true }) + const logFile = path.join(chatDir, 'log.jsonl') + fs.writeFileSync(logFile, Buffer.alloc(sizeBytes, 'a')) + if (ageDays > 0) { + const mtime = new Date(Date.now() - ageDays * 24 * 60 * 60 * 1000) + fs.utimesSync(logFile, mtime, mtime) + } + return logFile +} + +describe('trimOversizedChatLogs', () => { + beforeEach(() => { + tempDataDir = fs.mkdtempSync(path.join(os.tmpdir(), 'codebuff-logs-')) + }) + + afterEach(() => { + fs.rmSync(tempDataDir, { recursive: true, force: true }) + }) + + test('deletes oversized old log files and keeps small ones', () => { + const bigOldLog = writeLog('chat-big', 11 * 1024 * 1024, { ageDays: 15 }) + const smallOldLog = writeLog('chat-small', 1024, { ageDays: 15 }) + const messagesFile = path.join( + tempDataDir, + 'chats', + 'chat-big', + 'chat-messages.json', + ) + fs.writeFileSync(messagesFile, '[]') + + trimOversizedChatLogs() + + expect(fs.existsSync(bigOldLog)).toBe(false) + expect(fs.existsSync(smallOldLog)).toBe(true) + // Chat history files are never touched + expect(fs.existsSync(messagesFile)).toBe(true) + }) + + test('keeps oversized log files from recent chats', () => { + const bigRecentLog = writeLog('chat-recent', 11 * 1024 * 1024, { + ageDays: 5, + }) + + trimOversizedChatLogs() + + expect(fs.existsSync(bigRecentLog)).toBe(true) + }) + + test('does nothing when chats directory does not exist', () => { + expect(() => trimOversizedChatLogs()).not.toThrow() + }) +}) diff --git a/cli/src/utils/chat-history.ts b/cli/src/utils/chat-history.ts index 2a4a51612c..8108d26efb 100644 --- a/cli/src/utils/chat-history.ts +++ b/cli/src/utils/chat-history.ts @@ -1,8 +1,8 @@ import * as fs from 'fs' import path from 'path' +import { CHAT_LOG_FILENAME, logger } from './logger' import { getProjectDataDir } from '../project-files' -import { logger } from './logger' import type { ChatMessage } from '../types/chat' @@ -123,6 +123,48 @@ export function getAllChats(maxChats: number = 500): ChatHistoryEntry[] { } } +// Older CLI versions logged the full conversation (including attachments) to +// log.jsonl on every step, leaving multi-GB files in chat directories. Delete +// any log file over this cap; with summary-only logging, healthy logs stay +// far below it. +const MAX_LOG_FILE_BYTES = 10 * 1024 * 1024 +// Only delete logs from chats untouched for this long, so debug logs for +// recent chats stay available. +const MIN_LOG_AGE_MS = 14 * 24 * 60 * 60 * 1000 + +/** + * Delete oversized log.jsonl files from chat directories that haven't been + * touched in 14+ days. Only debug logs are removed — chat history files are + * untouched. + */ +export function trimOversizedChatLogs(): void { + let chatsDir: string + let chatIds: string[] + try { + chatsDir = getChatsDir() + chatIds = fs.readdirSync(chatsDir) + } catch { + return // No project root set or no chats directory yet + } + + const deleteBefore = Date.now() - MIN_LOG_AGE_MS + for (const chatId of chatIds) { + const logFile = path.join(chatsDir, chatId, CHAT_LOG_FILENAME) + try { + const stats = fs.statSync(logFile, { throwIfNoEntry: false }) + if ( + stats && + stats.size > MAX_LOG_FILE_BYTES && + stats.mtimeMs < deleteBefore + ) { + fs.unlinkSync(logFile) + } + } catch { + // Ignore errors for individual files + } + } +} + /** * Delete a saved chat session from local history. */ diff --git a/cli/src/utils/codebuff-client.ts b/cli/src/utils/codebuff-client.ts index d06e6811f1..620560246c 100644 --- a/cli/src/utils/codebuff-client.ts +++ b/cli/src/utils/codebuff-client.ts @@ -6,6 +6,7 @@ import { getAuthTokenDetails } from './auth' import { getCliEnv, getSystemProcessEnv } from './env' import { loadAgentDefinitions } from './local-agent-registry' import { logger } from './logger' +import { createTraceWriter } from './trace-writer' import { getRgPath } from '../native/ripgrep' import { getProjectRoot } from '../project-files' @@ -77,6 +78,7 @@ export async function getCodebuffClient(): Promise { cwd: projectRoot, agentDefinitions, logger, + traceWriter: createTraceWriter(), overrideTools: { ask_user: async (input: ClientToolCall<'ask_user'>['input']) => { const askUserResponse = await AskUserBridge.request( diff --git a/cli/src/utils/env.ts b/cli/src/utils/env.ts index 69b8480dab..70e61d7495 100644 --- a/cli/src/utils/env.ts +++ b/cli/src/utils/env.ts @@ -74,6 +74,7 @@ export const getCliEnv = (): CliEnv => ({ CODEBUFF_RG_PATH: process.env.CODEBUFF_RG_PATH, CODEBUFF_SCROLL_MULTIPLIER: process.env.CODEBUFF_SCROLL_MULTIPLIER, CODEBUFF_PERF_TEST: process.env.CODEBUFF_PERF_TEST, + CODEBUFF_TRACE: process.env.CODEBUFF_TRACE, FREEBUFF_MODE: process.env.FREEBUFF_MODE, }) diff --git a/cli/src/utils/logger.ts b/cli/src/utils/logger.ts index 98a5410420..552915df5c 100644 --- a/cli/src/utils/logger.ts +++ b/cli/src/utils/logger.ts @@ -21,6 +21,9 @@ import { } from './analytics' import { getCurrentChatDir, getProjectRoot } from '../project-files' +/** Name of the per-chat debug log file written in production builds */ +export const CHAT_LOG_FILENAME = 'log.jsonl' + export interface LoggerContext { userId?: string userEmail?: string @@ -97,13 +100,14 @@ function setLogPath(p: string): void { export function clearLogFile(): void { const projectRoot = getProjectRoot() - const defaultLog = path.join(projectRoot, 'debug', 'cli.jsonl') + const debugDir = path.join(projectRoot, 'debug') const targets = new Set() if (logPath) { targets.add(logPath) } - targets.add(defaultLog) + targets.add(path.join(debugDir, 'cli.jsonl')) + targets.add(path.join(debugDir, 'trace.jsonl')) for (const target of targets) { try { @@ -136,7 +140,7 @@ function sendAnalyticsAndLog( const logTarget = IS_DEV ? path.join(projectRoot, 'debug', 'cli.jsonl') - : path.join(getCurrentChatDir(), 'log.jsonl') + : path.join(getCurrentChatDir(), CHAT_LOG_FILENAME) setLogPath(logTarget) } diff --git a/cli/src/utils/trace-writer.ts b/cli/src/utils/trace-writer.ts new file mode 100644 index 0000000000..db02fa07eb --- /dev/null +++ b/cli/src/utils/trace-writer.ts @@ -0,0 +1,134 @@ +import { appendFileSync, mkdirSync } from 'fs' +import path, { dirname } from 'path' + +import { IS_DEV } from '@codebuff/common/env' + +import { getCliEnv } from './env' +import { getCurrentChatDir, getProjectRoot } from '../project-files' + +import type { TraceWriter } from '@codebuff/common/types/contracts/trace' +import type { Message } from '@codebuff/common/types/messages/codebuff-message' + +const TRACE_FILENAME = 'trace.jsonl' + +type AgentTraceState = { + /** Roles of messages already written, in order. Used to detect history + * rewrites (compaction/expiry) without holding onto message objects. */ + writtenRoles: string[] + system: string | undefined +} + +/** + * Returns whether trace writing is enabled: always in dev, opt-in via + * CODEBUFF_TRACE=1 in production builds (so users don't pay disk for a second + * copy of their conversation by default). + */ +export function isTraceEnabled(): boolean { + if (IS_DEV) return true + // Same accepted values as CODEBUFF_FULL_TELEMETRY (see analytics-sampling) + const flag = getCliEnv().CODEBUFF_TRACE + return flag === '1' || flag === 'true' || flag === 'yes' +} + +function getTraceFilePath(): string | null { + try { + return IS_DEV + ? path.join(getProjectRoot(), 'debug', TRACE_FILENAME) + : path.join(getCurrentChatDir(), TRACE_FILENAME) + } catch { + return null // No project root set yet + } +} + +/** + * Create a TraceWriter that appends agent message histories to trace.jsonl — + * one message per line, each written exactly once. + * + * In dev the trace goes to /debug/trace.jsonl (next to + * cli.jsonl); otherwise to the current chat directory. Returns undefined when + * tracing is disabled. + * + * History rewrites (compaction, message expiry) are detected by comparing the + * role sequence of the incoming history against what was already written; on + * mismatch a `history_rewritten` marker line is appended followed by the new + * history. Content-only edits that preserve the role sequence are not + * re-traced — acceptable for a debug trace. + */ +export function createTraceWriter(): TraceWriter | undefined { + if (!isTraceEnabled()) { + return undefined + } + + const agentStates = new Map() + let ensuredDir: string | undefined + + return { + recordStep: ({ + agentId, + agentType, + runId, + userInputId, + step, + system, + messages, + }) => { + const state = agentStates.get(agentId) ?? { + writtenRoles: [], + system: undefined, + } + const base = { agentId, agentType, runId, userInputId, step } + const timestamp = new Date().toISOString() + const lines: string[] = [] + const appendLine = (record: Record): void => { + lines.push(JSON.stringify({ timestamp, ...record })) + } + + const rewritten = + messages.length < state.writtenRoles.length || + state.writtenRoles.some((role, i) => messages[i]?.role !== role) + if (rewritten) { + appendLine({ + ...base, + type: 'history_rewritten', + previousMessageCount: state.writtenRoles.length, + messageCount: messages.length, + }) + state.writtenRoles = [] + } + + if (system !== undefined && system !== state.system) { + appendLine({ ...base, type: 'system', system }) + state.system = system + } + + for (let i = state.writtenRoles.length; i < messages.length; i++) { + const message = messages[i] as Message + appendLine({ + ...base, + type: 'message', + index: i, + message, + }) + } + + state.writtenRoles = messages.map((m) => m.role) + agentStates.set(agentId, state) + + if (lines.length === 0) return + // Resolve the path per step (not cached for the writer's lifetime: the + // current chat directory changes when the user starts a new chat). + const filePath = getTraceFilePath() + if (!filePath) return + try { + const dir = dirname(filePath) + if (ensuredDir !== dir) { + mkdirSync(dir, { recursive: true }) + ensuredDir = dir + } + appendFileSync(filePath, lines.join('\n') + '\n') + } catch { + // Tracing must never break the run + } + }, + } +} diff --git a/common/src/types/contracts/agent-runtime.ts b/common/src/types/contracts/agent-runtime.ts index 1cffe133dd..ee43c338aa 100644 --- a/common/src/types/contracts/agent-runtime.ts +++ b/common/src/types/contracts/agent-runtime.ts @@ -24,6 +24,7 @@ import type { PromptAiSdkStructuredFn, } from './llm' import type { Logger } from './logger' +import type { TraceWriter } from './trace' /** Shared dependencies */ export type AgentRuntimeDeps = { @@ -54,6 +55,8 @@ export type AgentRuntimeDeps = { // Other logger: Logger + /** Optional debug trace of agent message histories (see TraceWriter) */ + traceWriter?: TraceWriter fetch: typeof globalThis.fetch } diff --git a/common/src/types/contracts/trace.ts b/common/src/types/contracts/trace.ts new file mode 100644 index 0000000000..30b927378e --- /dev/null +++ b/common/src/types/contracts/trace.ts @@ -0,0 +1,21 @@ +import type { Message } from '../messages/codebuff-message' + +/** + * Records agent message histories for debugging (e.g. to a trace.jsonl file). + * + * Callers pass the agent's full message history at each step boundary; + * implementations are expected to persist each message only once (appending + * the delta since the previous call for the same agentId), so calling this + * every step does not grow storage quadratically. + */ +export type TraceWriter = { + recordStep: (params: { + agentId: string + agentType: string + runId: string | undefined + userInputId: string + step: number + system: string | undefined + messages: Message[] + }) => void +} diff --git a/packages/agent-runtime/src/__tests__/loop-agent-steps.test.ts b/packages/agent-runtime/src/__tests__/loop-agent-steps.test.ts index 1b2768dfd2..ac563f9eb6 100644 --- a/packages/agent-runtime/src/__tests__/loop-agent-steps.test.ts +++ b/packages/agent-runtime/src/__tests__/loop-agent-steps.test.ts @@ -347,6 +347,34 @@ describe('loopAgentSteps - runAgentStep vs runProgrammaticStep behavior', () => expect(result.agentState).toBeDefined() }) + it('should pass the full message history to the traceWriter when provided', async () => { + const recordedSteps: Array<{ agentId: string; messages: unknown[] }> = [] + const traceWriter = { + recordStep: (params: { agentId: string; messages: unknown[] }) => { + recordedSteps.push(params) + }, + } + + const result = await loopAgentSteps({ + ...loopAgentStepsBaseParams, + traceWriter, + agentType: 'test-agent', + localAgentTemplates: { + 'test-agent': { ...mockTemplate, handleSteps: undefined }, + }, + }) + + expect(result.agentState).toBeDefined() + // Called at least at the start and end of the step + expect(recordedSteps.length).toBeGreaterThanOrEqual(2) + expect(recordedSteps[0]!.agentId).toBe('test-agent-id') + // End-of-step call sees the assistant response appended to the history + const lastMessages = recordedSteps[recordedSteps.length - 1]!.messages + expect(lastMessages.length).toBeGreaterThan( + recordedSteps[0]!.messages.length, + ) + }) + it('should handle programmatic agent error and still call LLM', async () => { // Test error handling in programmatic step - should still allow LLM to run diff --git a/packages/agent-runtime/src/main-prompt.ts b/packages/agent-runtime/src/main-prompt.ts index 5248923f18..60fddd7fba 100644 --- a/packages/agent-runtime/src/main-prompt.ts +++ b/packages/agent-runtime/src/main-prompt.ts @@ -139,7 +139,18 @@ export async function mainPrompt( costMode, }) - logger.debug({ output }, 'Main prompt finished') + // Log a summary only: output can contain the full conversation + // (type 'allMessages'), which bloats log files on long chats. + logger.debug( + { + outputType: output?.type, + messageCount: + output && 'value' in output && Array.isArray(output.value) + ? output.value.length + : undefined, + }, + 'Main prompt finished', + ) return { sessionState: { diff --git a/packages/agent-runtime/src/run-agent-step.ts b/packages/agent-runtime/src/run-agent-step.ts index b82997c39f..cd843751f1 100644 --- a/packages/agent-runtime/src/run-agent-step.ts +++ b/packages/agent-runtime/src/run-agent-step.ts @@ -54,6 +54,7 @@ import type { PromptAiSdkFn, } from '@codebuff/common/types/contracts/llm' import type { Logger } from '@codebuff/common/types/contracts/logger' +import type { TraceWriter } from '@codebuff/common/types/contracts/trace' import type { ParamsExcluding } from '@codebuff/common/types/function-params' import type { Message, @@ -123,6 +124,7 @@ export const runAgentStep = async ( trackEvent: TrackEventFn promptAiSdk: PromptAiSdkFn + traceWriter?: TraceWriter } & ParamsExcluding< typeof processStream, | 'agentContext' @@ -351,6 +353,21 @@ export const runAgentStep = async ( } : undefined + // Full message histories go to the trace writer, which appends each message + // exactly once (see TraceWriter). + params.traceWriter?.recordStep({ + agentId: agentState.agentId, + agentType: String(agentType), + runId: agentState.runId, + userInputId, + step: iterationNum, + system, + messages: agentState.messageHistory, + }) + + // Log a summary only: the full message history, system prompt, and agent + // template are large and logging them every step bloats log files + // quadratically over the course of a chat. logger.debug( { iteration: iterationNum, @@ -358,14 +375,12 @@ export const runAgentStep = async ( model, duration: Date.now() - startTime, contextTokenCount: agentState.contextTokenCount, - agentMessages: agentState.messageHistory.concat().reverse(), - system, + messageCount: agentState.messageHistory.length, prompt, params: spawnParams, - agentContext, systemTokens, - agentTemplate, - tools: params.tools, + agentTemplateId: agentTemplate.id, + toolNames: params.tools ? Object.keys(params.tools) : undefined, }, `Start agent ${agentType} step ${iterationNum} (${userInputId}${prompt ? ` - Prompt: ${prompt.slice(0, 20)}` : ''})`, ) @@ -446,7 +461,6 @@ export const runAgentStep = async ( const { fullResponse: fullResponseAfterStream, - fullResponseChunks, hadToolCallError, messageId, toolCalls, @@ -535,6 +549,17 @@ export const runAgentStep = async ( agentContext, } + // Capture the assistant response and tool results added during this step + params.traceWriter?.recordStep({ + agentId: agentState.agentId, + agentType: String(agentType), + runId: agentState.runId, + userInputId, + step: iterationNum, + system, + messages: agentState.messageHistory, + }) + logger.debug( { iteration: iterationNum, @@ -544,13 +569,11 @@ export const runAgentStep = async ( shouldEndTurn, duration: Date.now() - startTime, fullResponse, - finalMessageHistoryWithToolResults: agentState.messageHistory - .concat() - .reverse(), + // Summarize instead of logging the full message history: logging it + // every step bloats log files quadratically over the course of a chat. + messageCount: agentState.messageHistory.length, toolCalls, toolResults, - agentContext, - fullResponseChunks, stepCreditsUsed, }, `End agent ${agentType} step ${iterationNum} (${userInputId}${prompt ? ` - Prompt: ${prompt.slice(0, 20)}` : ''})`, diff --git a/sdk/src/impl/agent-runtime.ts b/sdk/src/impl/agent-runtime.ts index 17858d8196..97d8b5d632 100644 --- a/sdk/src/impl/agent-runtime.ts +++ b/sdk/src/impl/agent-runtime.ts @@ -20,6 +20,7 @@ import type { import type { DatabaseAgentCache } from '@codebuff/common/types/contracts/database' import type { ClientEnv } from '@codebuff/common/types/contracts/env' import type { Logger } from '@codebuff/common/types/contracts/logger' +import type { TraceWriter } from '@codebuff/common/types/contracts/trace' import type { TrackEventFn } from '@codebuff/common/types/contracts/analytics' const databaseAgentCache: DatabaseAgentCache = new Map() @@ -27,6 +28,7 @@ const databaseAgentCache: DatabaseAgentCache = new Map() export function getAgentRuntimeImpl( params: { logger?: Logger + traceWriter?: TraceWriter apiKey: string clientEnv?: ClientEnv } & Pick< @@ -42,6 +44,7 @@ export function getAgentRuntimeImpl( ): AgentRuntimeDeps & AgentRuntimeScopedDeps { const { logger, + traceWriter, apiKey, clientEnv = clientEnvDefault, handleStepsLogChunk, @@ -99,6 +102,7 @@ export function getAgentRuntimeImpl( // Other logger: logger ?? noopLogger, + traceWriter, fetch: globalThis.fetch, // Client (WebSocket) diff --git a/sdk/src/index.ts b/sdk/src/index.ts index 4b04f03af4..c18b0982bb 100644 --- a/sdk/src/index.ts +++ b/sdk/src/index.ts @@ -16,6 +16,7 @@ export type { TextContent, ImageContent, } from './run' +export type { TraceWriter } from '@codebuff/common/types/contracts/trace' export { buildUserMessageContent } from '@codebuff/agent-runtime/util/messages' // Agent type exports export type { AgentDefinition } from '@codebuff/common/templates/initial-agents-dir/types/agent-definition' diff --git a/sdk/src/run.ts b/sdk/src/run.ts index 173c1516bc..0059d6c183 100644 --- a/sdk/src/run.ts +++ b/sdk/src/run.ts @@ -45,6 +45,7 @@ import type { AgentDefinition } from '@codebuff/common/templates/initial-agents- import type { ToolName } from '@codebuff/common/tools/constants' import type { PublishedClientToolName } from '@codebuff/common/tools/list' import type { Logger } from '@codebuff/common/types/contracts/logger' +import type { TraceWriter } from '@codebuff/common/types/contracts/trace' import type { CodebuffFileSystem } from '@codebuff/common/types/filesystem' import type { ToolMessage } from '@codebuff/common/types/messages/codebuff-message' import type { @@ -130,6 +131,10 @@ export type CodebuffClientOptions = { fsSource?: Source spawnSource?: Source logger?: Logger + /** Optional debug trace of agent message histories. Called with the full + * history at each agent step boundary; implementations should append each + * message once (see TraceWriter). */ + traceWriter?: TraceWriter } export type ImageContent = { @@ -218,6 +223,7 @@ async function runOnce({ fsSource = () => require('fs').promises, spawnSource, logger, + traceWriter, agent, prompt, @@ -391,6 +397,7 @@ async function runOnce({ const agentRuntimeImpl = getAgentRuntimeImpl({ logger, + traceWriter, apiKey, handleStepsLogChunk: () => { // Does nothing for now From 350d05453db3ffd566acc938be5a258ab680331a Mon Sep 17 00:00:00 2001 From: codebuff public sync bot <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 11 Jun 2026 06:06:57 +0000 Subject: [PATCH 59/96] Sync public snapshot from freebuff-private Source: CodebuffAI/freebuff-private@60ca3c31aa42b6212ca77290e7a75c8c34318872 --- agents/base-chat.ts | 14 +++++++++----- agents/researcher/researcher-web.ts | 2 +- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/agents/base-chat.ts b/agents/base-chat.ts index d1a33ad1d9..10a46e934d 100644 --- a/agents/base-chat.ts +++ b/agents/base-chat.ts @@ -6,8 +6,8 @@ import type { SecretAgentDefinition } from './types/secret-agent-definition' /** * Conversational agent behind freebuff.com/chat. Runs with no filesystem and - * no tools for now; subagents (e.g. researcher-web) will be added in a - * follow-up. The chat server may override `model` per request (DeepSeek + * no direct tools, but can spawn researcher-web to look things up on the + * live internet. The chat server may override `model` per request (DeepSeek * Flash vs Pro for full-access users). */ const definition: SecretAgentDefinition = { @@ -23,11 +23,15 @@ const definition: SecretAgentDefinition = { }, }, outputMode: 'last_message', - toolNames: [], - spawnableAgents: [], + toolNames: ['spawn_agents'], + spawnableAgents: ['researcher-web'], systemPrompt: `You are Freebuff Chat, a friendly, sharp assistant made by Freebuff (freebuff.com), the home of free AI coding tools. You are chatting with a user in a web interface that renders markdown.`, - instructionsPrompt: `Be direct and helpful. Use markdown when it improves clarity (code blocks, lists, tables), and keep answers as short as they can be while fully answering the question. You do not have access to tools, the user's files, or the internet — if asked to do something that requires those, say so briefly and help with what you know instead.`, + instructionsPrompt: `Be direct and helpful. Use markdown when it improves clarity (code blocks, lists, tables), and keep answers as short as they can be while fully answering the question. + +You can search the live internet by spawning the researcher-web agent. Spawn it whenever the answer depends on current or recent information (news, prices, releases, versions, schedules, scores, docs), whenever the user asks you to look something up, or whenever you are not confident in your knowledge. Give it a focused question; you can spawn several in parallel for independent questions. After it reports back, answer the user in your own words and cite source URLs when useful. Don't spawn it for questions you can already answer well (general knowledge, coding help, writing, math). + +You do not have access to the user's files or a filesystem — if asked to do something that requires those, say so briefly and help with what you can instead.`, } export default definition diff --git a/agents/researcher/researcher-web.ts b/agents/researcher/researcher-web.ts index 3be3071928..fdd2a5928c 100644 --- a/agents/researcher/researcher-web.ts +++ b/agents/researcher/researcher-web.ts @@ -6,7 +6,7 @@ const definition: SecretAgentDefinition = { id: 'researcher-web', publisher, model: 'google/gemini-3.1-flash-lite-preview', - displayName: 'Weeb', + displayName: 'Web Researcher', spawnerPrompt: `Browses the web to find relevant information.`, inputSchema: { prompt: { From d22310a06ed8f196f27d908de5416b538b990d12 Mon Sep 17 00:00:00 2001 From: codebuff public sync bot <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 11 Jun 2026 06:17:42 +0000 Subject: [PATCH 60/96] Sync public snapshot from freebuff-private Source: CodebuffAI/freebuff-private@0dde4a8d9864ecc6f020f485541577c1abaf6371 --- bun.lock | 2 ++ 1 file changed, 2 insertions(+) diff --git a/bun.lock b/bun.lock index 3e972925d1..93665ce75c 100644 --- a/bun.lock +++ b/bun.lock @@ -1657,6 +1657,8 @@ "@opentui/core/strip-ansi": ["strip-ansi@7.1.2", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA=="], + "@types/diff/diff": ["diff@9.0.0", "", {}, "sha512-svtcdpS8CgJyqAjEQIXdb3OjhFVVYjzGAPO8WGCmRbrml64SPw/jJD4GoE98aR7r25A0XcgrK3F02yw9R/vhQw=="], + "@typescript-eslint/eslint-plugin/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], "@typescript-eslint/parser/@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@7.18.0", "", { "dependencies": { "@typescript-eslint/types": "7.18.0", "@typescript-eslint/visitor-keys": "7.18.0" } }, "sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA=="], From 950259b8573bf5e6448cf7cf0b4f68db10a3cb1d Mon Sep 17 00:00:00 2001 From: codebuff public sync bot <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 11 Jun 2026 06:30:12 +0000 Subject: [PATCH 61/96] Sync public snapshot from freebuff-private Source: CodebuffAI/freebuff-private@d92284195b06d1d0889f8f5852bd72f4041402b7 --- bun.lock | 2 -- 1 file changed, 2 deletions(-) diff --git a/bun.lock b/bun.lock index 93665ce75c..3e972925d1 100644 --- a/bun.lock +++ b/bun.lock @@ -1657,8 +1657,6 @@ "@opentui/core/strip-ansi": ["strip-ansi@7.1.2", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA=="], - "@types/diff/diff": ["diff@9.0.0", "", {}, "sha512-svtcdpS8CgJyqAjEQIXdb3OjhFVVYjzGAPO8WGCmRbrml64SPw/jJD4GoE98aR7r25A0XcgrK3F02yw9R/vhQw=="], - "@typescript-eslint/eslint-plugin/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], "@typescript-eslint/parser/@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@7.18.0", "", { "dependencies": { "@typescript-eslint/types": "7.18.0", "@typescript-eslint/visitor-keys": "7.18.0" } }, "sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA=="], From ab51d9f49ba8abe29ba7a5f94f349d98d6cbf145 Mon Sep 17 00:00:00 2001 From: codebuff public sync bot <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 11 Jun 2026 07:07:48 +0000 Subject: [PATCH 62/96] Sync public snapshot from freebuff-private Source: CodebuffAI/freebuff-private@f8ef6fca998684ac5b162225830d31ae410ea21f --- agents/base-chat.ts | 4 ++-- bun.lock | 12 ++++++------ common/src/constants/freebuff-models.ts | 6 ++++++ 3 files changed, 14 insertions(+), 8 deletions(-) diff --git a/agents/base-chat.ts b/agents/base-chat.ts index 10a46e934d..da429cdf21 100644 --- a/agents/base-chat.ts +++ b/agents/base-chat.ts @@ -1,4 +1,4 @@ -import { FREEBUFF_DEEPSEEK_V4_FLASH_MODEL_ID } from '@codebuff/common/constants/freebuff-models' +import { FREEBUFF_DEEPSEEK_V4_FLASH_FIREWORKS_MODEL_ID } from '@codebuff/common/constants/freebuff-models' import { publisher } from './constants' @@ -13,7 +13,7 @@ import type { SecretAgentDefinition } from './types/secret-agent-definition' const definition: SecretAgentDefinition = { id: 'base-chat', publisher, - model: FREEBUFF_DEEPSEEK_V4_FLASH_MODEL_ID, + model: FREEBUFF_DEEPSEEK_V4_FLASH_FIREWORKS_MODEL_ID, displayName: 'Freebuff Chat', spawnerPrompt: 'General-purpose chat assistant for freebuff.com/chat.', inputSchema: { diff --git a/bun.lock b/bun.lock index 3e972925d1..5a382e0ebb 100644 --- a/bun.lock +++ b/bun.lock @@ -427,9 +427,9 @@ "@pinojs/redact": ["@pinojs/redact@0.4.0", "", {}, "sha512-k2ENnmBugE/rzQfEcdWHcCY+/FM3VLzH9cYEsbdsoqrvzAKRhUZeRNhAZvB8OitQJ1TBed3yqWtdjzS6wJKBwg=="], - "@posthog/core": ["@posthog/core@1.32.1", "", { "dependencies": { "@posthog/types": "1.386.1" } }, "sha512-ELq0TQ/MCCj1bY/oFsX53HV6GjRgtzcixhvcPG3Rv+0tU+NaS5Seg1f4cRpfFDTQlIN0Fu+r9oHnFcnXrg7Eew=="], + "@posthog/core": ["@posthog/core@1.32.2", "", { "dependencies": { "@posthog/types": "1.386.2" } }, "sha512-TfJ7fbPCKOkJX4E/KAnTBKoyHHxz9j9soOxlKvcTEQwO9Dq6BNHacuV/QerneyOaud29vSXj+4VDyAddXqZuPg=="], - "@posthog/types": ["@posthog/types@1.386.1", "", {}, "sha512-dsv3xOpKdJIIzcHLzSQ2SZtOvoN2zQMs2thrppTC5e3IVkJUxey+6bY9zOt8FoWHCwQ6jJbNtOp0lVanfbPNeA=="], + "@posthog/types": ["@posthog/types@1.386.2", "", {}, "sha512-IhWyxrCs0MEHarNlWB/Y4GPMDpEsSFAbE8j9tYSbmkxpYQTnLkYHaO1HmVqGJDw0QeiSl5CjY+GHX7x/uWSvaw=="], "@rtsao/scc": ["@rtsao/scc@1.1.0", "", {}, "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g=="], @@ -1307,9 +1307,9 @@ "postgres-interval": ["postgres-interval@1.2.0", "", { "dependencies": { "xtend": "^4.0.0" } }, "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ=="], - "posthog-node": ["posthog-node@5.36.15", "", { "dependencies": { "@posthog/core": "1.32.1" }, "peerDependencies": { "rxjs": "^7.0.0" }, "optionalPeers": ["rxjs"] }, "sha512-rEy0HWxJCPo06UkAv5vgo0VkFsQdQa6yX74LhBRYUjG1QFEAm39PcVzSmiX4YH2x6+OJzZ0UZ17g+wU1fzvmZQ=="], + "posthog-node": ["posthog-node@5.36.16", "", { "dependencies": { "@posthog/core": "1.32.2" }, "peerDependencies": { "rxjs": "^7.0.0" }, "optionalPeers": ["rxjs"] }, "sha512-Pvy09Rb4ghP6TweplI5Vg3aqApbAs9QgPumv/QN980CTsM0bcAYQn80hsMq8RTDrzpqUaHt+MVWnIUTNN9gntg=="], - "preact": ["preact@10.29.2", "", {}, "sha512-7tNmwg/7mzzAoB/8kSg6Hl37JraAZw3Z3A0JSY7VXlZwo82Xn0G7wKbNNs2qoF4ZEEsQGTwDAroNdqKs1ofJxQ=="], + "preact": ["preact@10.24.3", "", {}, "sha512-Z2dPnBnMUfyQfSQ+GBdsGa16hz35YmLmtTLhM169uW944hYL6xzTYkJjC07j+Wosz733pMWx0fgON3JNw1jJQA=="], "preact-render-to-string": ["preact-render-to-string@5.2.6", "", { "dependencies": { "pretty-format": "^3.8.0" }, "peerDependencies": { "preact": ">=10" } }, "sha512-JyhErpYOvBV1hEPwIxc/fHWXPfnEGdRKxc8gFdAZ7XV4tlzyzG847XAyEZqoDnynP88akM4eaHcSOzNcLWFguw=="], @@ -1639,8 +1639,6 @@ "zwitch": ["zwitch@2.0.4", "", {}, "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A=="], - "@auth/core/preact": ["preact@10.24.3", "", {}, "sha512-Z2dPnBnMUfyQfSQ+GBdsGa16hz35YmLmtTLhM169uW944hYL6xzTYkJjC07j+Wosz733pMWx0fgON3JNw1jJQA=="], - "@auth/core/preact-render-to-string": ["preact-render-to-string@6.5.11", "", { "peerDependencies": { "preact": ">=10" } }, "sha512-ubnauqoGczeGISiOh6RjX0/cdaF8v/oDXIjO85XALCQjwQP+SB4RDXXtvZ6yTYSjG+PC1QRP2AhPgCEsM2EvUw=="], "@codebuff/common/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], @@ -1657,6 +1655,8 @@ "@opentui/core/strip-ansi": ["strip-ansi@7.1.2", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA=="], + "@types/diff/diff": ["diff@9.0.0", "", {}, "sha512-svtcdpS8CgJyqAjEQIXdb3OjhFVVYjzGAPO8WGCmRbrml64SPw/jJD4GoE98aR7r25A0XcgrK3F02yw9R/vhQw=="], + "@typescript-eslint/eslint-plugin/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], "@typescript-eslint/parser/@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@7.18.0", "", { "dependencies": { "@typescript-eslint/types": "7.18.0", "@typescript-eslint/visitor-keys": "7.18.0" } }, "sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA=="], diff --git a/common/src/constants/freebuff-models.ts b/common/src/constants/freebuff-models.ts index 22621bc812..e6881d008c 100644 --- a/common/src/constants/freebuff-models.ts +++ b/common/src/constants/freebuff-models.ts @@ -44,6 +44,12 @@ export const FREEBUFF_DEPLOYMENT_HOURS_LABEL = '9am ET-5pm PT every day' export const FREEBUFF_GEMINI_PRO_MODEL_ID = 'google/gemini-3.1-pro-preview' export const FREEBUFF_DEEPSEEK_V4_PRO_MODEL_ID = 'deepseek/deepseek-v4-pro' export const FREEBUFF_DEEPSEEK_V4_FLASH_MODEL_ID = 'deepseek/deepseek-v4-flash' +/** DeepSeek V4 Flash served by Fireworks instead of DeepSeek's direct API. + * Used only by freebuff.com/chat, where Fireworks' faster inference is worth + * a slightly less capable serving stack. Not in SUPPORTED_FREEBUFF_MODELS or + * the free-mode allowlists — the CLI and web builder keep DeepSeek direct. */ +export const FREEBUFF_DEEPSEEK_V4_FLASH_FIREWORKS_MODEL_ID = + 'fireworks/deepseek-v4-flash' export const FREEBUFF_KIMI_MODEL_ID = 'moonshotai/kimi-k2.6' /** Legacy: removed from the pickers on 2026-06-09 in favor of MiniMax M3, but * still server-supported so old clients keep working. Drop from From ca2263bf62d0032b729922fa7e4b9eeb75176489 Mon Sep 17 00:00:00 2001 From: codebuff public sync bot <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 11 Jun 2026 07:14:32 +0000 Subject: [PATCH 63/96] Sync public snapshot from freebuff-private Source: CodebuffAI/freebuff-private@c1828f20ee53520d69bd23d4b7502859cc164eeb --- agents/__tests__/editor.test.ts | 4 ++-- agents/__tests__/thinker.test.ts | 2 +- agents/base2/base2.ts | 4 ++-- agents/context-pruner.ts | 1 + .../editor/best-of-n/best-of-n-selector2.ts | 19 ++++++++++------ ...or-opus.ts => editor-implementor-fable.ts} | 4 ++-- agents/editor/best-of-n/editor-implementor.ts | 15 ++++++++----- .../editor/best-of-n/editor-multi-prompt.ts | 8 +++---- agents/editor/editor.ts | 2 +- agents/general-agent/general-agent.ts | 2 +- agents/reviewer/code-reviewer-fable.ts | 15 +++++++++++++ agents/reviewer/code-reviewer.ts | 2 +- .../code-reviewer-multi-prompt.ts | 6 ++--- ...f-n-opus.ts => thinker-best-of-n-fable.ts} | 4 ++-- agents/thinker/best-of-n/thinker-best-of-n.ts | 22 +++++++++---------- ...ctor-opus.ts => thinker-selector-fable.ts} | 4 ++-- agents/thinker/best-of-n/thinker-selector.ts | 14 ++++++------ agents/thinker/thinker.ts | 2 +- bun.lock | 4 +++- .../__tests__/implementor-helpers.test.ts | 4 ++++ cli/src/utils/implementor-helpers.ts | 5 ++++- 21 files changed, 88 insertions(+), 55 deletions(-) rename agents/editor/best-of-n/{editor-implementor-opus.ts => editor-implementor-fable.ts} (57%) create mode 100644 agents/reviewer/code-reviewer-fable.ts rename agents/thinker/best-of-n/{thinker-best-of-n-opus.ts => thinker-best-of-n-fable.ts} (61%) rename agents/thinker/best-of-n/{thinker-selector-opus.ts => thinker-selector-fable.ts} (61%) diff --git a/agents/__tests__/editor.test.ts b/agents/__tests__/editor.test.ts index ff72e103c1..f4ed457d1b 100644 --- a/agents/__tests__/editor.test.ts +++ b/agents/__tests__/editor.test.ts @@ -26,7 +26,7 @@ describe('editor agent', () => { }) test('uses opus model by default', () => { - expect(editor.model).toBe('anthropic/claude-opus-4.7') + expect(editor.model).toBe('anthropic/claude-opus-4.8') }) test('has output mode set to structured_output', () => { @@ -52,7 +52,7 @@ describe('editor agent', () => { describe('createCodeEditor', () => { test('creates opus editor by default', () => { const opusEditor = createCodeEditor({ model: 'opus' }) - expect(opusEditor.model).toBe('anthropic/claude-opus-4.7') + expect(opusEditor.model).toBe('anthropic/claude-opus-4.8') }) test('creates gpt-5 editor', () => { diff --git a/agents/__tests__/thinker.test.ts b/agents/__tests__/thinker.test.ts index 0e44a9743e..3852a1de6f 100644 --- a/agents/__tests__/thinker.test.ts +++ b/agents/__tests__/thinker.test.ts @@ -29,7 +29,7 @@ describe('thinker agent', () => { }) test('uses opus model', () => { - expect(thinker.model).toBe('anthropic/claude-opus-4.7') + expect(thinker.model).toBe('anthropic/claude-opus-4.8') }) test('has output mode set to structured_output', () => { diff --git a/agents/base2/base2.ts b/agents/base2/base2.ts index 5a4fde1635..63bbd6de80 100644 --- a/agents/base2/base2.ts +++ b/agents/base2/base2.ts @@ -128,7 +128,7 @@ export function createBase2( 'basher', isDefault && 'thinker', (isDefault || isMax) && ['opus-agent', 'gpt-5-agent'], - isMax && 'thinker-best-of-n-opus', + isMax && 'thinker-best-of-n-fable', isDefault && 'editor', isMax && 'editor-multi-prompt', 'tmux-cli', @@ -206,7 +206,7 @@ Use the spawn_agents tool to spawn specialized agents to help you complete the u isDefault && '- Spawn the editor agent to implement the changes after you have gathered all the context you need.', (isDefault || isMax) && - `- Spawn the ${isDefault ? 'thinker' : 'thinker-best-of-n-opus'} after gathering context to solve complex problems or when the user asks you to think about a problem. (gpt-5-agent is a last resort for complex problems)`, + `- Spawn the ${isDefault ? 'thinker' : 'thinker-best-of-n-fable'} after gathering context to solve complex problems or when the user asks you to think about a problem. (gpt-5-agent is a last resort for complex problems)`, isMax && `- IMPORTANT: You must spawn the editor-multi-prompt agent to implement the changes after you have gathered all the context you need. You must spawn this agent for non-trivial changes, since it writes much better code than you would with the str_replace or write_file tools. Don't spawn the editor in parallel with context-gathering agents.`, isFree && diff --git a/agents/context-pruner.ts b/agents/context-pruner.ts index 1a333a8f09..6b87d55c23 100644 --- a/agents/context-pruner.ts +++ b/agents/context-pruner.ts @@ -54,6 +54,7 @@ const definition: AgentDefinition = { 'researcher-docs', 'basher', 'code-reviewer', + 'code-reviewer-fable', 'code-reviewer-multi-prompt', 'librarian', 'tmux-cli', diff --git a/agents/editor/best-of-n/best-of-n-selector2.ts b/agents/editor/best-of-n/best-of-n-selector2.ts index cc28b24116..4aaf5a4e94 100644 --- a/agents/editor/best-of-n/best-of-n-selector2.ts +++ b/agents/editor/best-of-n/best-of-n-selector2.ts @@ -5,25 +5,28 @@ import { } from '../../types/secret-agent-definition' export const createBestOfNSelector2 = (options: { - model: 'sonnet' | 'opus' | 'gpt-5' + model: 'sonnet' | 'opus' | 'fable' | 'gpt-5' }): Omit => { const { model } = options const isSonnet = model === 'sonnet' const isOpus = model === 'opus' + const isFable = model === 'fable' const isGpt5 = model === 'gpt-5' return { publisher, model: isSonnet ? 'anthropic/claude-sonnet-4.5' : isOpus - ? 'anthropic/claude-opus-4.7' - : 'openai/gpt-5.4', + ? 'anthropic/claude-opus-4.8' + : isFable + ? 'anthropic/claude-fable-5' + : 'openai/gpt-5.4', ...(isGpt5 && { reasoningOptions: { effort: 'high', }, }), - ...(isOpus && { + ...((isOpus || isFable) && { providerOptions: { only: ['amazon-bedrock'], }, @@ -32,7 +35,9 @@ export const createBestOfNSelector2 = (options: { ? 'Best-of-N GPT-5 Diff Selector' : isOpus ? 'Best-of-N Opus Diff Selector' - : 'Best-of-N Sonnet Diff Selector', + : isFable + ? 'Best-of-N Fable Diff Selector' + : 'Best-of-N Sonnet Diff Selector', spawnerPrompt: 'Analyzes multiple implementation proposals (as unified diffs) and selects the best one', @@ -131,7 +136,7 @@ Try to select an implementation that fulfills all the requirements in the user's ## Response Format -${isSonnet || isOpus +${isSonnet || isOpus || isFable ? `Use tags to write out your thoughts about the implementations as needed to pick the best implementation. IMPORTANT: You should think really really hard to make sure you pick the absolute best implementation! Also analyze the non-chosen implementations for any valuable techniques or approaches that could improve the selected one. Then, do not write any other explanations AT ALL. You should directly output a single tool call to set_output with the selected implementationId, short reason, and suggestedImprovements array.` @@ -141,7 +146,7 @@ Then, do not write any other explanations AT ALL. You should directly output a s } const definition: SecretAgentDefinition = { - ...createBestOfNSelector2({ model: 'opus' }), + ...createBestOfNSelector2({ model: 'fable' }), id: 'best-of-n-selector2', } diff --git a/agents/editor/best-of-n/editor-implementor-opus.ts b/agents/editor/best-of-n/editor-implementor-fable.ts similarity index 57% rename from agents/editor/best-of-n/editor-implementor-opus.ts rename to agents/editor/best-of-n/editor-implementor-fable.ts index e5d1c09649..a3f6973ee9 100644 --- a/agents/editor/best-of-n/editor-implementor-opus.ts +++ b/agents/editor/best-of-n/editor-implementor-fable.ts @@ -1,7 +1,7 @@ import { createBestOfNImplementor } from './editor-implementor' const definition = { - ...createBestOfNImplementor({ model: 'opus' }), - id: 'editor-implementor-opus', + ...createBestOfNImplementor({ model: 'fable' }), + id: 'editor-implementor-fable', } export default definition diff --git a/agents/editor/best-of-n/editor-implementor.ts b/agents/editor/best-of-n/editor-implementor.ts index 2afc66d68e..27cc3ebc01 100644 --- a/agents/editor/best-of-n/editor-implementor.ts +++ b/agents/editor/best-of-n/editor-implementor.ts @@ -3,11 +3,12 @@ import { publisher } from '../../constants' import type { SecretAgentDefinition } from '../../types/secret-agent-definition' export const createBestOfNImplementor = (options: { - model: 'sonnet' | 'opus' | 'gpt-5' | 'gemini' + model: 'sonnet' | 'opus' | 'fable' | 'gpt-5' | 'gemini' }): Omit => { const { model } = options const isSonnet = model === 'sonnet' const isOpus = model === 'opus' + const isFable = model === 'fable' const isGpt5 = model === 'gpt-5' const isGemini = model === 'gemini' @@ -16,11 +17,13 @@ export const createBestOfNImplementor = (options: { model: isSonnet ? 'anthropic/claude-sonnet-4.5' : isOpus - ? 'anthropic/claude-opus-4.7' - : isGemini - ? 'google/gemini-3-pro-preview' - : 'openai/gpt-5.1', - ...(isOpus && { + ? 'anthropic/claude-opus-4.8' + : isFable + ? 'anthropic/claude-fable-5' + : isGemini + ? 'google/gemini-3-pro-preview' + : 'openai/gpt-5.1', + ...((isOpus || isFable) && { providerOptions: { only: ['amazon-bedrock'], }, diff --git a/agents/editor/best-of-n/editor-multi-prompt.ts b/agents/editor/best-of-n/editor-multi-prompt.ts index 922fb43f22..607380d3d6 100644 --- a/agents/editor/best-of-n/editor-multi-prompt.ts +++ b/agents/editor/best-of-n/editor-multi-prompt.ts @@ -11,7 +11,7 @@ import type { SecretAgentDefinition } from '../../types/secret-agent-definition' export function createMultiPromptEditor(): Omit { return { publisher, - model: 'anthropic/claude-opus-4.7', + model: 'anthropic/claude-fable-5', providerOptions: { only: ['amazon-bedrock'], }, @@ -31,7 +31,7 @@ export function createMultiPromptEditor(): Omit { ], spawnableAgents: [ 'best-of-n-selector2', - 'editor-implementor-opus', + 'editor-implementor-fable', 'editor-implementor-gpt-5', ], @@ -94,10 +94,10 @@ function* handleStepsMultiPrompt({ includeToolCall: false, } satisfies ToolCall<'set_messages'> - // Spawn one opus implementor per prompt + // Spawn one fable implementor per prompt const implementorAgents: { agent_type: string; prompt?: string }[] = prompts.map((prompt) => ({ - agent_type: 'editor-implementor-opus', + agent_type: 'editor-implementor-fable', prompt: `Strategy: ${prompt}`, })) diff --git a/agents/editor/editor.ts b/agents/editor/editor.ts index a0cac064c6..60b649a210 100644 --- a/agents/editor/editor.ts +++ b/agents/editor/editor.ts @@ -12,7 +12,7 @@ type CodeEditorVariant = const EDITOR_MODEL_BY_VARIANT: Record = { 'gpt-5': 'openai/gpt-5.1', - opus: 'anthropic/claude-opus-4.7', + opus: 'anthropic/claude-opus-4.8', glm: 'z-ai/glm-5.1', kimi: 'moonshotai/kimi-k2.6', deepseek: 'deepseek/deepseek-v4-pro', diff --git a/agents/general-agent/general-agent.ts b/agents/general-agent/general-agent.ts index 14d12e440d..f025f5a67e 100644 --- a/agents/general-agent/general-agent.ts +++ b/agents/general-agent/general-agent.ts @@ -12,7 +12,7 @@ export const createGeneralAgent = (options: { return { publisher, - model: isGpt5 ? 'openai/gpt-5.4' : 'anthropic/claude-opus-4.7', + model: isGpt5 ? 'openai/gpt-5.4' : 'anthropic/claude-opus-4.8', ...(!isGpt5 && { providerOptions: { only: ['amazon-bedrock'], diff --git a/agents/reviewer/code-reviewer-fable.ts b/agents/reviewer/code-reviewer-fable.ts new file mode 100644 index 0000000000..b828e3f568 --- /dev/null +++ b/agents/reviewer/code-reviewer-fable.ts @@ -0,0 +1,15 @@ +import { createReviewer } from './code-reviewer' +import { publisher } from '../constants' + +import type { SecretAgentDefinition } from '../types/secret-agent-definition' + +const definition: SecretAgentDefinition = { + id: 'code-reviewer-fable', + publisher, + ...createReviewer('anthropic/claude-fable-5'), + providerOptions: { + only: ['amazon-bedrock'], + }, +} + +export default definition diff --git a/agents/reviewer/code-reviewer.ts b/agents/reviewer/code-reviewer.ts index 31b261d992..8b6363ff8e 100644 --- a/agents/reviewer/code-reviewer.ts +++ b/agents/reviewer/code-reviewer.ts @@ -64,7 +64,7 @@ Be extremely concise.`, const definition: SecretAgentDefinition = { id: 'code-reviewer', publisher, - ...createReviewer('anthropic/claude-opus-4.7'), + ...createReviewer('anthropic/claude-opus-4.8'), providerOptions: { only: ['amazon-bedrock'], }, diff --git a/agents/reviewer/multi-prompt/code-reviewer-multi-prompt.ts b/agents/reviewer/multi-prompt/code-reviewer-multi-prompt.ts index e7bac906eb..773755163b 100644 --- a/agents/reviewer/multi-prompt/code-reviewer-multi-prompt.ts +++ b/agents/reviewer/multi-prompt/code-reviewer-multi-prompt.ts @@ -14,7 +14,7 @@ export function createCodeReviewerMultiPrompt(): Omit< > { return { publisher, - model: 'anthropic/claude-opus-4.7', + model: 'anthropic/claude-fable-5', providerOptions: { only: ['amazon-bedrock'], }, @@ -26,7 +26,7 @@ export function createCodeReviewerMultiPrompt(): Omit< inheritParentSystemPrompt: true, toolNames: ['spawn_agents', 'set_output'], - spawnableAgents: ['code-reviewer'], + spawnableAgents: ['code-reviewer-fable'], inputSchema: { params: { @@ -88,7 +88,7 @@ function* handleStepsMultiPrompt({ // Spawn one code-reviewer per prompt const reviewerAgents: { agent_type: string; prompt: string }[] = prompts.map( (prompt) => ({ - agent_type: 'code-reviewer', + agent_type: 'code-reviewer-fable', prompt: `Review the above code changes with the following focus: ${prompt}`, }), ) diff --git a/agents/thinker/best-of-n/thinker-best-of-n-opus.ts b/agents/thinker/best-of-n/thinker-best-of-n-fable.ts similarity index 61% rename from agents/thinker/best-of-n/thinker-best-of-n-opus.ts rename to agents/thinker/best-of-n/thinker-best-of-n-fable.ts index 811d702b73..b6f8760688 100644 --- a/agents/thinker/best-of-n/thinker-best-of-n-opus.ts +++ b/agents/thinker/best-of-n/thinker-best-of-n-fable.ts @@ -1,7 +1,7 @@ import { createThinkerBestOfN } from './thinker-best-of-n' const definition = { - ...createThinkerBestOfN('opus'), - id: 'thinker-best-of-n-opus', + ...createThinkerBestOfN('fable'), + id: 'thinker-best-of-n-fable', } export default definition diff --git a/agents/thinker/best-of-n/thinker-best-of-n.ts b/agents/thinker/best-of-n/thinker-best-of-n.ts index 5c09fae840..6b95914415 100644 --- a/agents/thinker/best-of-n/thinker-best-of-n.ts +++ b/agents/thinker/best-of-n/thinker-best-of-n.ts @@ -8,27 +8,27 @@ import type { import type { SecretAgentDefinition } from '../../types/secret-agent-definition' export function createThinkerBestOfN( - model: 'sonnet' | 'gpt-5' | 'opus', + model: 'sonnet' | 'gpt-5' | 'fable', ): Omit { const isGpt5 = model === 'gpt-5' - const isOpus = model === 'opus' + const isFable = model === 'fable' return { publisher, model: isGpt5 ? 'openai/gpt-5.1' - : isOpus - ? 'anthropic/claude-opus-4.7' + : isFable + ? 'anthropic/claude-fable-5' : 'anthropic/claude-sonnet-4.5', - ...(isOpus && { + ...(isFable && { providerOptions: { only: ['amazon-bedrock'], }, }), displayName: isGpt5 ? 'Best-of-N GPT-5 Thinker' - : isOpus - ? 'Best-of-N Opus Thinker' + : isFable + ? 'Best-of-N Fable Thinker' : 'Best-of-N Thinker', spawnerPrompt: 'Generates deep thinking by orchestrating multiple thinker agents, selects the best thinking output. Use this to help solve a hard problem. You must first gather all the relevant context *BEFORE* spawning this agent, as it can only think.', @@ -37,7 +37,7 @@ export function createThinkerBestOfN( inheritParentSystemPrompt: true, toolNames: ['spawn_agents'], - spawnableAgents: [isOpus ? 'thinker-selector-opus' : 'thinker-selector'], + spawnableAgents: [isFable ? 'thinker-selector-fable' : 'thinker-selector'], inputSchema: { prompt: { @@ -64,7 +64,7 @@ Use the tag to think deeply about the user request. When satisfied, write out a brief response to the user's request. The parent agent will see your response -- no need to call any tools. In particular, do not use the spawn_agents tool or the set_output tool or any tools at all! `, - handleSteps: isOpus ? handleStepsOpus : handleStepsDefault, + handleSteps: isFable ? handleStepsFable : handleStepsDefault, } } function* handleStepsDefault({ @@ -152,14 +152,14 @@ function* handleStepsDefault({ } } -function* handleStepsOpus({ +function* handleStepsFable({ agentState, prompt, params, }: AgentStepContext): ReturnType< NonNullable > { - const selectorAgentType = 'thinker-selector-opus' + const selectorAgentType = 'thinker-selector-fable' const n = Math.min(10, Math.max(1, (params?.n as number | undefined) ?? 3)) // Use GENERATE_N to generate n thinking outputs diff --git a/agents/thinker/best-of-n/thinker-selector-opus.ts b/agents/thinker/best-of-n/thinker-selector-fable.ts similarity index 61% rename from agents/thinker/best-of-n/thinker-selector-opus.ts rename to agents/thinker/best-of-n/thinker-selector-fable.ts index dfa99a57b7..011bb50867 100644 --- a/agents/thinker/best-of-n/thinker-selector-opus.ts +++ b/agents/thinker/best-of-n/thinker-selector-fable.ts @@ -1,8 +1,8 @@ import { createThinkerSelector } from './thinker-selector' const definition = { - ...createThinkerSelector('opus'), - id: 'thinker-selector-opus', + ...createThinkerSelector('fable'), + id: 'thinker-selector-fable', } export default definition diff --git a/agents/thinker/best-of-n/thinker-selector.ts b/agents/thinker/best-of-n/thinker-selector.ts index 62bf834208..9e5c34b8d0 100644 --- a/agents/thinker/best-of-n/thinker-selector.ts +++ b/agents/thinker/best-of-n/thinker-selector.ts @@ -2,22 +2,22 @@ import { publisher } from '../../constants' import { type SecretAgentDefinition } from '../../types/secret-agent-definition' export function createThinkerSelector( - model: 'sonnet' | 'opus', + model: 'sonnet' | 'fable', ): Omit { - const isOpus = model === 'opus' + const isFable = model === 'fable' return { publisher, - model: isOpus - ? 'anthropic/claude-opus-4.7' + model: isFable + ? 'anthropic/claude-fable-5' : 'anthropic/claude-sonnet-4.5', - ...(isOpus && { + ...(isFable && { providerOptions: { only: ['amazon-bedrock'], }, }), - displayName: isOpus - ? 'Opus Thinker Output Selector' + displayName: isFable + ? 'Fable Thinker Output Selector' : 'Thinker Output Selector', spawnerPrompt: 'Analyzes multiple thinking outputs and selects the best one', diff --git a/agents/thinker/thinker.ts b/agents/thinker/thinker.ts index 6a9f7d808d..a81297ea44 100644 --- a/agents/thinker/thinker.ts +++ b/agents/thinker/thinker.ts @@ -5,7 +5,7 @@ import type { SecretAgentDefinition } from '../types/secret-agent-definition' const definition: SecretAgentDefinition = { id: 'thinker', publisher, - model: 'anthropic/claude-opus-4.7', + model: 'anthropic/claude-opus-4.8', providerOptions: { only: ['amazon-bedrock'], }, diff --git a/bun.lock b/bun.lock index 5a382e0ebb..f7d7c25cf7 100644 --- a/bun.lock +++ b/bun.lock @@ -1309,7 +1309,7 @@ "posthog-node": ["posthog-node@5.36.16", "", { "dependencies": { "@posthog/core": "1.32.2" }, "peerDependencies": { "rxjs": "^7.0.0" }, "optionalPeers": ["rxjs"] }, "sha512-Pvy09Rb4ghP6TweplI5Vg3aqApbAs9QgPumv/QN980CTsM0bcAYQn80hsMq8RTDrzpqUaHt+MVWnIUTNN9gntg=="], - "preact": ["preact@10.24.3", "", {}, "sha512-Z2dPnBnMUfyQfSQ+GBdsGa16hz35YmLmtTLhM169uW944hYL6xzTYkJjC07j+Wosz733pMWx0fgON3JNw1jJQA=="], + "preact": ["preact@10.29.2", "", {}, "sha512-7tNmwg/7mzzAoB/8kSg6Hl37JraAZw3Z3A0JSY7VXlZwo82Xn0G7wKbNNs2qoF4ZEEsQGTwDAroNdqKs1ofJxQ=="], "preact-render-to-string": ["preact-render-to-string@5.2.6", "", { "dependencies": { "pretty-format": "^3.8.0" }, "peerDependencies": { "preact": ">=10" } }, "sha512-JyhErpYOvBV1hEPwIxc/fHWXPfnEGdRKxc8gFdAZ7XV4tlzyzG847XAyEZqoDnynP88akM4eaHcSOzNcLWFguw=="], @@ -1639,6 +1639,8 @@ "zwitch": ["zwitch@2.0.4", "", {}, "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A=="], + "@auth/core/preact": ["preact@10.24.3", "", {}, "sha512-Z2dPnBnMUfyQfSQ+GBdsGa16hz35YmLmtTLhM169uW944hYL6xzTYkJjC07j+Wosz733pMWx0fgON3JNw1jJQA=="], + "@auth/core/preact-render-to-string": ["preact-render-to-string@6.5.11", "", { "peerDependencies": { "preact": ">=10" } }, "sha512-ubnauqoGczeGISiOh6RjX0/cdaF8v/oDXIjO85XALCQjwQP+SB4RDXXtvZ6yTYSjG+PC1QRP2AhPgCEsM2EvUw=="], "@codebuff/common/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], diff --git a/cli/src/utils/__tests__/implementor-helpers.test.ts b/cli/src/utils/__tests__/implementor-helpers.test.ts index 44793c4086..30e79854d6 100644 --- a/cli/src/utils/__tests__/implementor-helpers.test.ts +++ b/cli/src/utils/__tests__/implementor-helpers.test.ts @@ -600,6 +600,9 @@ describe('isImplementorAgent', () => { expect( isImplementorAgent({ agentType: 'editor-implementor-opus', blocks: [] }), ).toBe(true) + expect( + isImplementorAgent({ agentType: 'editor-implementor-fable', blocks: [] }), + ).toBe(true) expect( isImplementorAgent({ agentType: 'editor-implementor-gpt-5', blocks: [] }), ).toBe(true) @@ -625,6 +628,7 @@ describe('getImplementorDisplayName', () => { test('returns model names', () => { expect(getImplementorDisplayName('editor-implementor')).toBe('Sonnet') expect(getImplementorDisplayName('editor-implementor-opus')).toBe('Opus') + expect(getImplementorDisplayName('editor-implementor-fable')).toBe('Fable') expect(getImplementorDisplayName('editor-implementor-gpt-5')).toBe('GPT-5') expect(getImplementorDisplayName('editor-implementor-gemini')).toBe( 'Gemini', diff --git a/cli/src/utils/implementor-helpers.ts b/cli/src/utils/implementor-helpers.ts index ccb92c5c14..a5dab2c0ce 100644 --- a/cli/src/utils/implementor-helpers.ts +++ b/cli/src/utils/implementor-helpers.ts @@ -7,6 +7,7 @@ import type { export const IMPLEMENTOR_AGENT_IDS = [ 'editor-implementor', 'editor-implementor-opus', + 'editor-implementor-fable', 'editor-implementor-gemini', 'editor-implementor-gpt-5', ] as const @@ -67,7 +68,9 @@ export const getImplementorDisplayName = ( index?: number, ): string => { let baseName = 'Implementor' - if (agentType.includes('editor-implementor-opus')) { + if (agentType.includes('editor-implementor-fable')) { + baseName = 'Fable' + } else if (agentType.includes('editor-implementor-opus')) { baseName = 'Opus' } else if (agentType.includes('editor-implementor-gemini')) { baseName = 'Gemini' From 2d740ec4a27fcff9c1908c4314f513fa4732db81 Mon Sep 17 00:00:00 2001 From: codebuff public sync bot <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 11 Jun 2026 07:18:50 +0000 Subject: [PATCH 64/96] Sync public snapshot from freebuff-private Source: CodebuffAI/freebuff-private@b324815ea7819424a5b2a20b9f19b91b8584517e --- bun.lock | 2 -- 1 file changed, 2 deletions(-) diff --git a/bun.lock b/bun.lock index f7d7c25cf7..e9d4acfa85 100644 --- a/bun.lock +++ b/bun.lock @@ -1657,8 +1657,6 @@ "@opentui/core/strip-ansi": ["strip-ansi@7.1.2", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA=="], - "@types/diff/diff": ["diff@9.0.0", "", {}, "sha512-svtcdpS8CgJyqAjEQIXdb3OjhFVVYjzGAPO8WGCmRbrml64SPw/jJD4GoE98aR7r25A0XcgrK3F02yw9R/vhQw=="], - "@typescript-eslint/eslint-plugin/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], "@typescript-eslint/parser/@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@7.18.0", "", { "dependencies": { "@typescript-eslint/types": "7.18.0", "@typescript-eslint/visitor-keys": "7.18.0" } }, "sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA=="], From 0f3feaf989874ace9ca0ab6f3803584fd022ba0e Mon Sep 17 00:00:00 2001 From: codebuff public sync bot <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 11 Jun 2026 07:34:17 +0000 Subject: [PATCH 65/96] Sync public snapshot from freebuff-private Source: CodebuffAI/freebuff-private@30b1315cdb0486af431d4b9b6673ebd2b00efb8c --- bun.lock | 107 +++++++++++++-------- sdk/package.json | 1 + sdk/src/__tests__/read-url.test.ts | 143 +++++++++++++++++++++++++++++ sdk/src/tools/read-url.ts | 82 +++++++++++++---- sdk/src/tools/ssrf.ts | 120 ++++++++++++++++++++++++ 5 files changed, 396 insertions(+), 57 deletions(-) create mode 100644 sdk/src/tools/ssrf.ts diff --git a/bun.lock b/bun.lock index e9d4acfa85..80c4c067cb 100644 --- a/bun.lock +++ b/bun.lock @@ -166,6 +166,7 @@ "diff": "8.0.3", "gray-matter": "^4.0.3", "ignore": "7.0.5", + "ipaddr.js": "^1.9.1", "micromatch": "^4.0.8", "web-tree-sitter": "0.25.10", "ws": "^8.18.0", @@ -239,29 +240,19 @@ "@eslint-community/regexpp": ["@eslint-community/regexpp@4.12.2", "", {}, "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew=="], - "@eslint/config-array": ["@eslint/config-array@0.23.5", "", { "dependencies": { "@eslint/object-schema": "^3.0.5", "debug": "^4.3.1", "minimatch": "^10.2.4" } }, "sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA=="], + "@eslint/eslintrc": ["@eslint/eslintrc@2.1.4", "", { "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", "espree": "^9.6.0", "globals": "^13.19.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", "minimatch": "^3.1.2", "strip-json-comments": "^3.1.1" } }, "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ=="], - "@eslint/config-helpers": ["@eslint/config-helpers@0.6.0", "", { "dependencies": { "@eslint/core": "^1.2.1" } }, "sha512-ii6Bw9jJ2zi2cWA2Z+9/QZ/+3DX6kwaV5Q986D/CdP3Lap3w/pgQZ373FV7byY/i7L4IRH/G43I5dz1ClsCbpA=="], - - "@eslint/core": ["@eslint/core@1.2.1", "", { "dependencies": { "@types/json-schema": "^7.0.15" } }, "sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ=="], - - "@eslint/object-schema": ["@eslint/object-schema@3.0.5", "", {}, "sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw=="], - - "@eslint/plugin-kit": ["@eslint/plugin-kit@0.7.2", "", { "dependencies": { "@eslint/core": "^1.2.1", "levn": "^0.4.1" } }, "sha512-+CNAzxglkrpNf/kKywqQfk74QjtceuOE7Qm+AF8miRvPF/wmmK5+OJOgVh3AVTT3RP2mH3+FOaxlE5v72owk0A=="], + "@eslint/js": ["@eslint/js@8.57.1", "", {}, "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q=="], "@gravity-ai/api": ["@gravity-ai/api@0.1.2", "", { "dependencies": { "axios": "^1.13.2" } }, "sha512-txsAhyzvwB/TNrj5R8DoNqw8afM3JY2ahl7aaeaD5ZsxP+7rxff7C7keGI7+gU2KT3d2Mcw4QB1nHhbTSCJYHw=="], "@hono/node-server": ["@hono/node-server@1.19.14", "", { "peerDependencies": { "hono": "^4" } }, "sha512-GwtvgtXxnWsucXvbQXkRgqksiH2Qed37H9xHZocE5sA3N8O8O8/8FA3uclQXxXVzc9XBZuEOMK7+r02FmSpHtw=="], - "@humanfs/core": ["@humanfs/core@0.19.2", "", { "dependencies": { "@humanfs/types": "^0.15.0" } }, "sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA=="], - - "@humanfs/node": ["@humanfs/node@0.16.8", "", { "dependencies": { "@humanfs/core": "^0.19.2", "@humanfs/types": "^0.15.0", "@humanwhocodes/retry": "^0.4.0" } }, "sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ=="], - - "@humanfs/types": ["@humanfs/types@0.15.0", "", {}, "sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q=="], + "@humanwhocodes/config-array": ["@humanwhocodes/config-array@0.13.0", "", { "dependencies": { "@humanwhocodes/object-schema": "^2.0.3", "debug": "^4.3.1", "minimatch": "^3.0.5" } }, "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw=="], "@humanwhocodes/module-importer": ["@humanwhocodes/module-importer@1.0.1", "", {}, "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA=="], - "@humanwhocodes/retry": ["@humanwhocodes/retry@0.4.3", "", {}, "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ=="], + "@humanwhocodes/object-schema": ["@humanwhocodes/object-schema@2.0.3", "", {}, "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA=="], "@img/colour": ["@img/colour@1.1.0", "", {}, "sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ=="], @@ -463,10 +454,6 @@ "@types/diff": ["@types/diff@8.0.0", "", { "dependencies": { "diff": "*" } }, "sha512-o7jqJM04gfaYrdCecCVMbZhNdG6T1MHg/oQoRFdERLV+4d+V7FijhiEAbFu0Usww84Yijk9yH58U4Jk4HbtzZw=="], - "@types/esrecurse": ["@types/esrecurse@4.3.1", "", {}, "sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw=="], - - "@types/estree": ["@types/estree@1.0.9", "", {}, "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg=="], - "@types/js-yaml": ["@types/js-yaml@4.0.9", "", {}, "sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg=="], "@types/json-schema": ["@types/json-schema@7.0.15", "", {}, "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA=="], @@ -517,6 +504,8 @@ "@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@6.21.0", "", { "dependencies": { "@typescript-eslint/types": "6.21.0", "eslint-visitor-keys": "^3.4.1" } }, "sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A=="], + "@ungap/structured-clone": ["@ungap/structured-clone@1.3.1", "", {}, "sha512-mUFwbeTqrVgDQxFveS+df2yfap6iuP20NAKAsBt5jDEoOTDew+zwLAOilHCeQJOVSvmgCX4ogqIrA0mnyr08yQ=="], + "@vercel/oidc": ["@vercel/oidc@3.1.0", "", {}, "sha512-Fw28YZpRnA3cAHHDlkt7xQHiJ0fcL+NRcIqsocZQUSmbzeIKRpwttJjik5ZGanXP+vlA4SbTg+AbA3bP363l+w=="], "@vscode/tree-sitter-wasm": ["@vscode/tree-sitter-wasm@0.1.4", "", {}, "sha512-kQVVg/CamCYDM+/XYCZuNTQyixjZd8ts/Gf84UzjEY0eRnbg6kiy5I9z2/2i3XdqwhI87iG07rkMR2KwhqcSbA=="], @@ -547,7 +536,7 @@ "ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="], - "ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], + "ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], "any-base": ["any-base@1.1.0", "", {}, "sha512-uMgjozySS8adZZYePpaWs8cxB9/kdzmpX6SgJZ+wbz1K5eYk5QMYDVJaZKhxyIHUdnnJkfR7SVgStgH7LkGUyg=="], @@ -623,6 +612,8 @@ "call-bound": ["call-bound@1.0.4", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "get-intrinsic": "^1.3.0" } }, "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg=="], + "callsites": ["callsites@3.1.0", "", {}, "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="], + "caniuse-lite": ["caniuse-lite@1.0.30001797", "", {}, "sha512-l8xKG+gwAIExZGl9FrF7KUwuOmk6wbEPC9Xoy/RtnWv1XG0Q4LFlagaLpUv3Kiza3W/wm27zy0yWJEieYKAP6w=="], "canvas": ["canvas@3.2.3", "", { "dependencies": { "node-addon-api": "^7.0.0", "prebuild-install": "^7.1.3" } }, "sha512-PzE5nJZPz72YUAfo8oTp0u3fqqY7IzlTubneAihqDYAUcBk7ryeCmBbdJBEdaH0bptSOe2VT2Zwcb3UaFyaSWw=="], @@ -747,7 +738,7 @@ "escape-string-regexp": ["escape-string-regexp@4.0.0", "", {}, "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="], - "eslint": ["eslint@10.4.1", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.2", "@eslint/config-array": "^0.23.5", "@eslint/config-helpers": "^0.6.0", "@eslint/core": "^1.2.1", "@eslint/plugin-kit": "^0.7.2", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "ajv": "^6.14.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^9.1.2", "eslint-visitor-keys": "^5.0.1", "espree": "^11.2.0", "esquery": "^1.7.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "minimatch": "^10.2.4", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, "peerDependencies": { "jiti": "*" }, "optionalPeers": ["jiti"], "bin": { "eslint": "bin/eslint.js" } }, "sha512-AyIKhnOBuOAdueD7RB3xB+YeAWScb9jHsJBgH2Hcde8InP5JYhqrRR6iTMHyTEwgENK54Cp44e4v8BwNhsuHuw=="], + "eslint": ["eslint@8.57.1", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", "@eslint/eslintrc": "^2.1.4", "@eslint/js": "8.57.1", "@humanwhocodes/config-array": "^0.13.0", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", "@ungap/structured-clone": "^1.2.0", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", "debug": "^4.3.2", "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", "eslint-scope": "^7.2.2", "eslint-visitor-keys": "^3.4.3", "espree": "^9.6.1", "esquery": "^1.4.2", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^6.0.1", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "globals": "^13.19.0", "graphemer": "^1.4.0", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "is-path-inside": "^3.0.3", "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.4.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", "optionator": "^0.9.3", "strip-ansi": "^6.0.1", "text-table": "^0.2.0" }, "bin": { "eslint": "bin/eslint.js" } }, "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA=="], "eslint-config-prettier": ["eslint-config-prettier@9.1.2", "", { "peerDependencies": { "eslint": ">=7.0.0" }, "bin": { "eslint-config-prettier": "bin/cli.js" } }, "sha512-iI1f+D2ViGn+uvv5HuHVUamg8ll4tN+JRHGc6IJi4TP9Kl976C57fzPXgseXNs8v0iA8aSJpHsTWjDb9QJamGQ=="], @@ -759,11 +750,11 @@ "eslint-plugin-unused-imports": ["eslint-plugin-unused-imports@4.4.1", "", { "peerDependencies": { "@typescript-eslint/eslint-plugin": "^8.0.0-0 || ^7.0.0 || ^6.0.0 || ^5.0.0", "eslint": "^10.0.0 || ^9.0.0 || ^8.0.0" }, "optionalPeers": ["@typescript-eslint/eslint-plugin"] }, "sha512-oZGYUz1X3sRMGUB+0cZyK2VcvRX5lm/vB56PgNNcU+7ficUCKm66oZWKUubXWnOuPjQ8PvmXtCViXBMONPe7tQ=="], - "eslint-scope": ["eslint-scope@9.1.2", "", { "dependencies": { "@types/esrecurse": "^4.3.1", "@types/estree": "^1.0.8", "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ=="], + "eslint-scope": ["eslint-scope@7.2.2", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg=="], "eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="], - "espree": ["espree@11.2.0", "", { "dependencies": { "acorn": "^8.16.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^5.0.1" } }, "sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw=="], + "espree": ["espree@9.6.1", "", { "dependencies": { "acorn": "^8.9.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^3.4.1" } }, "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ=="], "esprima": ["esprima@4.0.1", "", { "bin": { "esparse": "./bin/esparse.js", "esvalidate": "./bin/esvalidate.js" } }, "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="], @@ -815,7 +806,7 @@ "fetch-blob": ["fetch-blob@3.2.0", "", { "dependencies": { "node-domexception": "^1.0.0", "web-streams-polyfill": "^3.0.3" } }, "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ=="], - "file-entry-cache": ["file-entry-cache@8.0.0", "", { "dependencies": { "flat-cache": "^4.0.0" } }, "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ=="], + "file-entry-cache": ["file-entry-cache@6.0.1", "", { "dependencies": { "flat-cache": "^3.0.4" } }, "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg=="], "file-type": ["file-type@21.3.4", "", { "dependencies": { "@tokenizer/inflate": "^0.4.1", "strtok3": "^10.3.4", "token-types": "^6.1.1", "uint8array-extras": "^1.4.0" } }, "sha512-Ievi/yy8DS3ygGvT47PjSfdFoX+2isQueoYP1cntFW1JLYAuS4GD7NUPGg4zv2iZfV52uDyk5w5Z0TdpRS6Q1g=="], @@ -825,7 +816,7 @@ "find-up": ["find-up@5.0.0", "", { "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" } }, "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng=="], - "flat-cache": ["flat-cache@4.0.1", "", { "dependencies": { "flatted": "^3.2.9", "keyv": "^4.5.4" } }, "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw=="], + "flat-cache": ["flat-cache@3.2.0", "", { "dependencies": { "flatted": "^3.2.9", "keyv": "^4.5.3", "rimraf": "^3.0.2" } }, "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw=="], "flatted": ["flatted@3.4.2", "", {}, "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA=="], @@ -843,6 +834,8 @@ "fs-constants": ["fs-constants@1.0.0", "", {}, "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow=="], + "fs.realpath": ["fs.realpath@1.0.0", "", {}, "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw=="], + "fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="], "function-bind": ["function-bind@1.1.2", "", {}, "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="], @@ -873,8 +866,12 @@ "github-from-package": ["github-from-package@0.0.0", "", {}, "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw=="], + "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=="], + "glob-parent": ["glob-parent@6.0.2", "", { "dependencies": { "is-glob": "^4.0.3" } }, "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A=="], + "globals": ["globals@13.24.0", "", { "dependencies": { "type-fest": "^0.20.2" } }, "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ=="], + "globalthis": ["globalthis@1.0.4", "", { "dependencies": { "define-properties": "^1.2.1", "gopd": "^1.0.1" } }, "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ=="], "globby": ["globby@11.1.0", "", { "dependencies": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", "fast-glob": "^3.2.9", "ignore": "^5.2.0", "merge2": "^1.4.1", "slash": "^3.0.0" } }, "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g=="], @@ -889,6 +886,8 @@ "has-bigints": ["has-bigints@1.1.0", "", {}, "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg=="], + "has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], + "has-property-descriptors": ["has-property-descriptors@1.0.2", "", { "dependencies": { "es-define-property": "^1.0.0" } }, "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg=="], "has-proto": ["has-proto@1.2.0", "", { "dependencies": { "dunder-proto": "^1.0.0" } }, "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ=="], @@ -919,8 +918,12 @@ "immer": ["immer@10.2.0", "", {}, "sha512-d/+XTN3zfODyjr89gM3mPq1WNX2B8pYsu7eORitdwyA2sBubnTl3laYlBk4sXY5FUa5qTZGBDPJICVbvqzjlbw=="], + "import-fresh": ["import-fresh@3.3.1", "", { "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" } }, "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ=="], + "imurmurhash": ["imurmurhash@0.1.4", "", {}, "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA=="], + "inflight": ["inflight@1.0.6", "", { "dependencies": { "once": "^1.3.0", "wrappy": "1" } }, "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA=="], + "inherits": ["inherits@2.0.4", "", {}, "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="], "ini": ["ini@1.3.8", "", {}, "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew=="], @@ -973,6 +976,8 @@ "is-number-object": ["is-number-object@1.1.1", "", { "dependencies": { "call-bound": "^1.0.3", "has-tostringtag": "^1.0.2" } }, "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw=="], + "is-path-inside": ["is-path-inside@3.0.3", "", {}, "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ=="], + "is-plain-obj": ["is-plain-obj@4.1.0", "", {}, "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg=="], "is-promise": ["is-promise@4.0.0", "", {}, "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ=="], @@ -1035,6 +1040,8 @@ "lodash": ["lodash@4.17.23", "", {}, "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w=="], + "lodash.merge": ["lodash.merge@4.6.2", "", {}, "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ=="], + "log-update": ["log-update@8.0.0", "", { "dependencies": { "ansi-escapes": "^7.3.0", "cli-cursor": "^5.0.0", "slice-ansi": "^9.0.0", "string-width": "^8.2.0", "strip-ansi": "^7.2.0", "wrap-ansi": "^10.0.0" } }, "sha512-lddSgOt3bPASrylL54ZSpy8nBHns+vBVSoILlVOx+dei300pnLRN958rj/EdlVLKuWlSESU3qdnDZdAI7FXYGg=="], "longest-streak": ["longest-streak@3.1.0", "", {}, "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g=="], @@ -1237,6 +1244,8 @@ "pako": ["pako@1.0.11", "", {}, "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw=="], + "parent-module": ["parent-module@1.0.1", "", { "dependencies": { "callsites": "^3.0.0" } }, "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g=="], + "parse-bmfont-ascii": ["parse-bmfont-ascii@1.0.6", "", {}, "sha512-U4RrVsUFCleIOBsIGYOMKjn9PavsGOXxbvYGtMOEfnId0SVNsgehXh1DxUdVPLoxd5mvcEtvmKs2Mmf0Mpa1ZA=="], "parse-bmfont-binary": ["parse-bmfont-binary@1.0.6", "", {}, "sha512-GxmsRea0wdGdYthjuUeWTMWPqm2+FAd4GI8vCvhgJsFnoGhTrLhXDDupwTo7rXVAgaLIGoVHDZS9p/5XbSqeWA=="], @@ -1251,6 +1260,8 @@ "path-exists": ["path-exists@4.0.0", "", {}, "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w=="], + "path-is-absolute": ["path-is-absolute@1.0.1", "", {}, "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg=="], + "path-key": ["path-key@3.1.1", "", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="], "path-parse": ["path-parse@1.0.7", "", {}, "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="], @@ -1381,12 +1392,16 @@ "resolve": ["resolve@2.0.0-next.7", "", { "dependencies": { "es-errors": "^1.3.0", "is-core-module": "^2.16.2", "node-exports-info": "^1.6.0", "object-keys": "^1.1.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-tqt+NBWwyaMgw3zDsnygx4CByWjQEJHOPMdslYhppaQSJUtL/D4JO9CcBBlhPoI8lz9oJIDXkwXfhF4aWqP8xQ=="], + "resolve-from": ["resolve-from@4.0.0", "", {}, "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="], + "resolve-pkg-maps": ["resolve-pkg-maps@1.0.0", "", {}, "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw=="], "restore-cursor": ["restore-cursor@5.1.0", "", { "dependencies": { "onetime": "^7.0.0", "signal-exit": "^4.1.0" } }, "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA=="], "reusify": ["reusify@1.1.0", "", {}, "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw=="], + "rimraf": ["rimraf@3.0.2", "", { "dependencies": { "glob": "^7.1.3" }, "bin": { "rimraf": "bin.js" } }, "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA=="], + "router": ["router@2.2.0", "", { "dependencies": { "debug": "^4.4.0", "depd": "^2.0.0", "is-promise": "^4.0.0", "parseurl": "^1.3.3", "path-to-regexp": "^8.0.0" } }, "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ=="], "run-applescript": ["run-applescript@7.1.0", "", {}, "sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q=="], @@ -1485,7 +1500,7 @@ "strip-final-newline": ["strip-final-newline@2.0.0", "", {}, "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA=="], - "strip-json-comments": ["strip-json-comments@2.0.1", "", {}, "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ=="], + "strip-json-comments": ["strip-json-comments@3.1.1", "", {}, "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig=="], "stripe": ["stripe@16.12.0", "", { "dependencies": { "@types/node": ">=8.1.0", "qs": "^6.11.0" } }, "sha512-H7eFVLDxeTNNSn4JTRfL2//LzCbDrMSZ+2q1c7CanVWgK2qIW5TwS+0V7N9KcKZZNpYh/uCqK0PyZh/2UsaAtQ=="], @@ -1493,6 +1508,8 @@ "styled-jsx": ["styled-jsx@5.1.6", "", { "dependencies": { "client-only": "0.0.1" }, "peerDependencies": { "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0" } }, "sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA=="], + "supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], + "supports-preserve-symlinks-flag": ["supports-preserve-symlinks-flag@1.0.0", "", {}, "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w=="], "supports-terminal-graphics": ["supports-terminal-graphics@0.1.0", "", {}, "sha512-+KdfozhS0Fw8y5Sghw8kkZNGT8nWYzJ1EzcoIvVjxhl+26TJTs26y02yfBgvc1jh5AS/c8jcI3xtahhR95KRyQ=="], @@ -1507,6 +1524,8 @@ "terminal-image": ["terminal-image@4.3.0", "", { "dependencies": { "chalk": "^5.6.2", "image-dimensions": "^2.5.0", "jimp": "^1.6.1", "log-update": "^8.0.0", "omggif": "^1.0.10", "supports-terminal-graphics": "^0.1.0", "term-img": "^7.0.0" } }, "sha512-P4bCi7Ich17LgN/P2zM9sYbeleYNgu1Skk3q/uc15Ol9zWSiCldrCcIJ1Pd6dpgRGDmWhGVTgWHjV+ZMk1m/5g=="], + "text-table": ["text-table@0.2.0", "", {}, "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw=="], + "thread-stream": ["thread-stream@3.2.0", "", { "dependencies": { "real-require": "^0.2.0" } }, "sha512-zLBvqpwr4Esa0kRjcrzGU6zL25lePWaCLMx0RQFrmteozIfeNdaMLpG5U7PeHzvlFkAWaRKA9/KVW4F60iB+qw=="], "tinycolor2": ["tinycolor2@1.6.0", "", {}, "sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw=="], @@ -1535,6 +1554,8 @@ "type-check": ["type-check@0.4.0", "", { "dependencies": { "prelude-ls": "^1.2.1" } }, "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew=="], + "type-fest": ["type-fest@0.20.2", "", {}, "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ=="], + "type-is": ["type-is@2.1.0", "", { "dependencies": { "content-type": "^2.0.0", "media-typer": "^1.1.0", "mime-types": "^3.0.0" } }, "sha512-faYHw0anBbc/kWF3zFTEnxSFOAGUX9GFbOBthvDdLsIlEoWOFOtS0zgCiQYwIskL9iGXZL3kAXD8OoZ4GmMATA=="], "typed-array-buffer": ["typed-array-buffer@1.0.3", "", { "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", "is-typed-array": "^1.1.14" } }, "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw=="], @@ -1651,7 +1672,11 @@ "@codebuff/sdk/ignore": ["ignore@7.0.5", "", {}, "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg=="], - "@eslint/config-array/minimatch": ["minimatch@10.2.5", "", { "dependencies": { "brace-expansion": "^5.0.5" } }, "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg=="], + "@eslint/eslintrc/ajv": ["ajv@6.15.0", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw=="], + + "@eslint/eslintrc/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], + + "@eslint/eslintrc/js-yaml": ["js-yaml@4.2.0", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-ePWsvanv0DWuDRsW8dnt+R4jQ31SCRCQ7hhNcPXZPsoBZiemuZNYGf7adZdqX2D86j6rvKp3RpCxVTSb8WQlOw=="], "@opentui/core/diff": ["diff@9.0.0", "", {}, "sha512-svtcdpS8CgJyqAjEQIXdb3OjhFVVYjzGAPO8WGCmRbrml64SPw/jJD4GoE98aR7r25A0XcgrK3F02yw9R/vhQw=="], @@ -1685,11 +1710,15 @@ "eslint/ajv": ["ajv@6.15.0", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw=="], - "eslint/eslint-visitor-keys": ["eslint-visitor-keys@5.0.1", "", {}, "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA=="], + "eslint/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], + + "eslint/doctrine": ["doctrine@3.0.0", "", { "dependencies": { "esutils": "^2.0.2" } }, "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w=="], "eslint/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], - "eslint/minimatch": ["minimatch@10.2.5", "", { "dependencies": { "brace-expansion": "^5.0.5" } }, "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg=="], + "eslint/js-yaml": ["js-yaml@4.2.0", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-ePWsvanv0DWuDRsW8dnt+R4jQ31SCRCQ7hhNcPXZPsoBZiemuZNYGf7adZdqX2D86j6rvKp3RpCxVTSb8WQlOw=="], + + "eslint/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], "eslint-import-resolver-node/debug": ["debug@3.2.7", "", { "dependencies": { "ms": "^2.1.1" } }, "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ=="], @@ -1701,8 +1730,6 @@ "eslint-plugin-import/tsconfig-paths": ["tsconfig-paths@3.15.0", "", { "dependencies": { "@types/json5": "^0.0.29", "json5": "^1.0.2", "minimist": "^1.2.6", "strip-bom": "^3.0.0" } }, "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg=="], - "espree/eslint-visitor-keys": ["eslint-visitor-keys@5.0.1", "", {}, "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA=="], - "execa/onetime": ["onetime@5.1.2", "", { "dependencies": { "mimic-fn": "^2.1.0" } }, "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg=="], "express/mime-types": ["mime-types@3.0.2", "", { "dependencies": { "mime-db": "^1.54.0" } }, "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A=="], @@ -1729,12 +1756,16 @@ "plist/xmlbuilder": ["xmlbuilder@15.1.1", "", {}, "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg=="], + "rc/strip-json-comments": ["strip-json-comments@2.0.1", "", {}, "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ=="], + "react-devtools-core/ws": ["ws@7.5.11", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": "^5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-zS54Oen9bITtp7kp2XM3AydrCIq1D+HwJOuH+c+e4LfpL/lotP5osijd+UoMnxwAam1GN8R4KtLAyIrIcBNpiA=="], "react-reconciler/scheduler": ["scheduler@0.26.0", "", {}, "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA=="], "send/mime-types": ["mime-types@3.0.2", "", { "dependencies": { "mime-db": "^1.54.0" } }, "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A=="], + "slice-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], + "tar-stream/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=="], "ts-node/diff": ["diff@4.0.4", "", {}, "sha512-X07nttJQkwkfKfvTPG/KSnE2OMdcUCao6+eXF3wmnIQRn2aPAHH3VxDbDOdegkd6JbPsXqShpvEOHfAT+nCNwQ=="], @@ -1749,6 +1780,8 @@ "typescript-eslint/@typescript-eslint/utils": ["@typescript-eslint/utils@7.18.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@typescript-eslint/scope-manager": "7.18.0", "@typescript-eslint/types": "7.18.0", "@typescript-eslint/typescript-estree": "7.18.0" }, "peerDependencies": { "eslint": "^8.56.0" } }, "sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw=="], + "wrap-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], + "wrap-ansi/string-width": ["string-width@8.2.1", "", { "dependencies": { "get-east-asian-width": "^1.5.0", "strip-ansi": "^7.1.2" } }, "sha512-IIaP0g3iy9Cyy18w3M9YcaDudujEAVHKt3a3QJg1+sr/oX96TbaGUubG0hJyCjCBThFH+tFpcIyoUHUn1ogaLA=="], "yargs/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], @@ -1757,7 +1790,9 @@ "@codebuff/evals/pino/process-warning": ["process-warning@5.0.0", "", {}, "sha512-a39t9ApHNx2L4+HBnQKqxxHNs1r7KF+Intd8Q/g1bUh6q0WIp9voPXJ/x0j+ZL45KF1pJd9+q2jLIRMfvEshkA=="], - "@eslint/config-array/minimatch/brace-expansion": ["brace-expansion@5.0.6", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g=="], + "@eslint/eslintrc/ajv/json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], + + "@eslint/eslintrc/js-yaml/argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="], "@typescript-eslint/parser/@typescript-eslint/typescript-estree/minimatch": ["minimatch@9.0.9", "", { "dependencies": { "brace-expansion": "^2.0.2" } }, "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg=="], @@ -1771,13 +1806,13 @@ "cliui/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], - "cliui/wrap-ansi/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], - "eslint-plugin-import/tsconfig-paths/json5": ["json5@1.0.2", "", { "dependencies": { "minimist": "^1.2.0" }, "bin": { "json5": "lib/cli.js" } }, "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA=="], "eslint/ajv/json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], - "eslint/minimatch/brace-expansion": ["brace-expansion@5.0.6", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g=="], + "eslint/js-yaml/argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="], + + "eslint/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], "express/mime-types/mime-db": ["mime-db@1.54.0", "", {}, "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ=="], @@ -1807,12 +1842,8 @@ "yargs/string-width/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], - "@eslint/config-array/minimatch/brace-expansion/balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="], - "@typescript-eslint/parser/@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.1.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-WR1cURNjuvBLMZBMbqM0UoE+WAfdUcEV1ccD8PVBVOI+Z3ND4+SZbN8RsfT2bMuG1qwz5RFvPukSZm5fF2D5eA=="], - "eslint/minimatch/brace-expansion/balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="], - "typescript-eslint/@typescript-eslint/eslint-plugin/@typescript-eslint/scope-manager/@typescript-eslint/types": ["@typescript-eslint/types@7.18.0", "", {}, "sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ=="], "typescript-eslint/@typescript-eslint/eslint-plugin/@typescript-eslint/type-utils/@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@7.18.0", "", { "dependencies": { "@typescript-eslint/types": "7.18.0", "@typescript-eslint/visitor-keys": "7.18.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", "minimatch": "^9.0.4", "semver": "^7.6.0", "ts-api-utils": "^1.3.0" } }, "sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA=="], diff --git a/sdk/package.json b/sdk/package.json index d6d12b535e..179440822b 100644 --- a/sdk/package.json +++ b/sdk/package.json @@ -65,6 +65,7 @@ "diff": "8.0.3", "gray-matter": "^4.0.3", "ignore": "7.0.5", + "ipaddr.js": "^1.9.1", "micromatch": "^4.0.8", "web-tree-sitter": "0.25.10", "ws": "^8.18.0", diff --git a/sdk/src/__tests__/read-url.test.ts b/sdk/src/__tests__/read-url.test.ts index 4f86aff24f..902d47c45a 100644 --- a/sdk/src/__tests__/read-url.test.ts +++ b/sdk/src/__tests__/read-url.test.ts @@ -3,6 +3,7 @@ import { describe, expect, it } from 'bun:test' import { clientToolCallSchema } from '@codebuff/common/tools/list' import { readUrl } from '../tools/read-url' +import { isBlockedAddress } from '../tools/ssrf' const successValue = async ( html: string, @@ -227,3 +228,145 @@ describe('readUrl', () => { expect(result.text).toBe('# Body') }) }) + +describe('readUrl SSRF protection', () => { + it('classifies private, reserved, and public addresses', () => { + for (const ip of [ + '127.0.0.1', + '10.1.2.3', + '172.16.0.1', + '192.168.0.1', + '169.254.169.254', + '100.64.0.1', + '0.0.0.0', + '::1', + 'fc00::1', + 'fe80::1', + '::ffff:127.0.0.1', + 'not-an-ip', + ]) { + expect(isBlockedAddress(ip)).toBe(true) + } + for (const ip of ['8.8.8.8', '93.184.216.34', '2606:2800:220:1::1']) { + expect(isBlockedAddress(ip)).toBe(false) + } + }) + + it('rejects IP-literal private hosts without fetching', async () => { + let fetched = false + const result = await readUrl({ + url: 'http://169.254.169.254/latest/meta-data/', + fetch: async () => { + fetched = true + throw new Error('fetch should not be called') + }, + }) + + expect(fetched).toBe(false) + expect(result[0].value).toEqual({ + url: 'http://169.254.169.254/latest/meta-data/', + errorMessage: + 'Refusing to fetch private or reserved address: 169.254.169.254', + }) + }) + + it('rejects hostnames that resolve to a private address', async () => { + const result = await readUrl({ + url: 'http://intranet.example.com/secrets', + resolveDns: true, + lookupHost: async () => ['10.0.0.5'], + fetch: async () => { + throw new Error('fetch should not be called') + }, + }) + + expect(result[0].value).toEqual({ + url: 'http://intranet.example.com/secrets', + errorMessage: + 'Host "intranet.example.com" resolves to a private or reserved address (10.0.0.5)', + }) + }) + + it('allows hostnames that resolve to a public address', async () => { + const result = await readUrl({ + url: 'https://example.com/page', + resolveDns: true, + lookupHost: async () => ['93.184.216.34'], + fetch: async () => + new Response('

Public content

', { + status: 200, + headers: { 'content-type': 'text/html' }, + }), + }) + const value = result[0].value + + expect('errorMessage' in value).toBe(false) + if ('errorMessage' in value) return + expect(value.text).toContain('Public content') + }) + + it('blocks a redirect that points at an internal address', async () => { + const calls: string[] = [] + const result = await readUrl({ + url: 'https://public.example.com/start', + resolveDns: true, + lookupHost: async () => ['93.184.216.34'], + fetch: async (input) => { + calls.push(String(input)) + return new Response(null, { + status: 302, + headers: { location: 'http://169.254.169.254/latest/meta-data/' }, + }) + }, + }) + + // First hop fetched and 302'd; redirect target rejected before a 2nd fetch. + expect(calls).toEqual(['https://public.example.com/start']) + expect(result[0].value).toEqual({ + url: 'https://public.example.com/start', + errorMessage: + 'Refusing to fetch private or reserved address: 169.254.169.254', + }) + }) + + it('stops after too many redirects', async () => { + let calls = 0 + const result = await readUrl({ + url: 'https://example.com/loop', + resolveDns: true, + lookupHost: async () => ['93.184.216.34'], + fetch: async () => { + calls++ + return new Response(null, { + status: 302, + headers: { location: 'https://example.com/loop' }, + }) + }, + }) + + // Initial request + 5 redirect follows, then bail out. + expect(calls).toBe(6) + expect(result[0].value).toEqual({ + url: 'https://example.com/loop', + errorMessage: 'Too many redirects (>5)', + }) + }) + + it('rejects a malformed redirect location', async () => { + const result = await readUrl({ + url: 'https://example.com/start', + resolveDns: true, + lookupHost: async () => ['93.184.216.34'], + fetch: async () => + new Response(null, { + status: 302, + headers: { location: 'http://' }, + }), + }) + + expect(result[0].value).toEqual({ + url: 'https://example.com/start', + errorMessage: 'Invalid redirect location: http://', + }) + }) +}) diff --git a/sdk/src/tools/read-url.ts b/sdk/src/tools/read-url.ts index 9bd5c89f86..37706ee40a 100644 --- a/sdk/src/tools/read-url.ts +++ b/sdk/src/tools/read-url.ts @@ -1,8 +1,12 @@ +import { assertUrlAllowed, type HostLookup } from './ssrf' + import type { CodebuffToolOutput } from '../../../common/src/tools/list' const DEFAULT_MAX_CHARS = 20_000 const MAX_RESPONSE_BYTES = 2_000_000 const FETCH_TIMEOUT_MS = 20_000 +const MAX_REDIRECTS = 5 +const REDIRECT_STATUSES = new Set([301, 302, 303, 307, 308]) const USER_AGENT = 'Mozilla/5.0 (compatible; CodebuffResearchBot/1.0; +https://codebuff.com)' @@ -19,10 +23,6 @@ function errorResult( return [{ type: 'json', value: { ...(url ? { url } : {}), errorMessage } }] } -function isAllowedUrl(url: URL): boolean { - return url.protocol === 'http:' || url.protocol === 'https:' -} - function getHeader(headers: Headers, name: string): string | undefined { return headers.get(name) ?? undefined } @@ -326,10 +326,20 @@ export async function readUrl({ url, max_chars = DEFAULT_MAX_CHARS, fetch: fetchImpl = globalThis.fetch, + lookupHost, + resolveDns = fetchImpl === globalThis.fetch, }: { url: string max_chars?: number fetch?: FetchLike + /** Override hostname resolution (defaults to node:dns). */ + lookupHost?: HostLookup + /** + * Whether to DNS-resolve hostnames for SSRF checks. Defaults to true only + * when using the real global fetch; a caller-supplied fetch (e.g. a test + * stub) skips resolution but IP-literal hosts are still rejected. + */ + resolveDns?: boolean }): Promise { let parsedUrl: URL try { @@ -338,24 +348,58 @@ export async function readUrl({ return errorResult(url, 'Invalid URL') } - if (!isAllowedUrl(parsedUrl)) { - return errorResult(url, 'Only http:// and https:// URLs are supported') - } - const controller = new AbortController() const timeout = setTimeout(() => controller.abort(), FETCH_TIMEOUT_MS) try { - const response = await fetchImpl(parsedUrl.toString(), { - redirect: 'follow', - signal: controller.signal, - headers: { - accept: - 'text/html,application/xhtml+xml,application/json,text/plain;q=0.9,*/*;q=0.8', - 'accept-language': 'en-US,en;q=0.9', - 'user-agent': USER_AGENT, - }, - }) + // Follow redirects manually so every hop is re-validated against the SSRF + // policy — a public URL must not be able to 30x its way to an internal one. + let currentUrl = parsedUrl + let response: Response + for (let redirects = 0; ; redirects++) { + try { + // NOTE: this resolves the hostname for validation; `fetch` resolves it + // again independently, so a short-TTL attacker domain could rebind + // between the two (DNS-rebinding TOCTOU). Fully closing that needs + // IP-pinning (an undici dispatcher), which Bun's fetch ignores, so it's + // an accepted residual gap — the common literal/internal-host vectors + // are still blocked. + await assertUrlAllowed(currentUrl, { lookupHost, resolveDns }) + } catch (error) { + return errorResult( + url, + error instanceof Error ? error.message : 'Blocked URL', + ) + } + + response = await fetchImpl(currentUrl.toString(), { + redirect: 'manual', + signal: controller.signal, + headers: { + accept: + 'text/html,application/xhtml+xml,application/json,text/plain;q=0.9,*/*;q=0.8', + 'accept-language': 'en-US,en;q=0.9', + 'user-agent': USER_AGENT, + }, + }) + + if (!REDIRECT_STATUSES.has(response.status)) { + break + } + + const location = getHeader(response.headers, 'location') + if (!location) { + break + } + if (redirects >= MAX_REDIRECTS) { + return errorResult(url, `Too many redirects (>${MAX_REDIRECTS})`) + } + try { + currentUrl = new URL(location, currentUrl) + } catch { + return errorResult(url, `Invalid redirect location: ${location}`) + } + } if (!response.ok) { return errorResult( @@ -385,7 +429,7 @@ export async function readUrl({ type: 'json', value: { url, - finalUrl: response.url || parsedUrl.toString(), + finalUrl: response.url || currentUrl.toString(), status: response.status, ...(contentType ? { contentType } : {}), ...(extracted.title ? { title: extracted.title } : {}), diff --git a/sdk/src/tools/ssrf.ts b/sdk/src/tools/ssrf.ts new file mode 100644 index 0000000000..2e65dbfb8e --- /dev/null +++ b/sdk/src/tools/ssrf.ts @@ -0,0 +1,120 @@ +import dns from 'node:dns' +import net from 'node:net' +import { promisify } from 'node:util' + +import ipaddr from 'ipaddr.js' + +/** + * Resolves a hostname to one or more IP addresses. Injectable so callers (and + * tests) can supply a deterministic resolver instead of hitting real DNS. + */ +export type HostLookup = (hostname: string) => Promise + +/** Error thrown when a URL is rejected for SSRF reasons. */ +export class SsrfError extends Error { + constructor(message: string) { + super(message) + this.name = 'SsrfError' + } +} + +const lookupAsync = promisify(dns.lookup) + +const defaultLookup: HostLookup = async (hostname) => { + const results = await lookupAsync(hostname, { all: true, verbatim: true }) + return results.map((result) => result.address) +} + +/** + * Returns true if an IP address is anything other than a globally-routable + * public unicast address (i.e. loopback, private, link-local, unique-local, + * carrier-grade NAT, multicast, reserved, unspecified, etc.). Unparseable + * input is treated as blocked. + */ +export function isBlockedAddress(ip: string): boolean { + let addr: ipaddr.IPv4 | ipaddr.IPv6 + try { + addr = ipaddr.parse(ip) + } catch { + return true + } + + // Normalize IPv4-mapped IPv6 addresses (e.g. ::ffff:127.0.0.1) so they are + // classified by their embedded IPv4 range rather than as generic IPv6. + if (addr.kind() === 'ipv6') { + const v6 = addr as ipaddr.IPv6 + if (v6.isIPv4MappedAddress()) { + addr = v6.toIPv4Address() + } + } + + return addr.range() !== 'unicast' +} + +/** + * Strips IPv6 brackets that `URL.hostname` keeps (e.g. "[::1]" -> "::1"). + */ +function unwrapHost(hostname: string): string { + if (hostname.startsWith('[') && hostname.endsWith(']')) { + return hostname.slice(1, -1) + } + return hostname +} + +/** + * Throws an {@link SsrfError} if the URL is not safe to fetch from the server: + * non-http(s) schemes, IP literals in a private/reserved range, or hostnames + * that resolve to such a range. + * + * IP literals are always checked synchronously (no DNS needed). Hostname + * resolution is performed via `lookupHost` unless `resolveDns` is false — this + * lets callers that supply their own `fetch` (e.g. unit tests with stubbed + * responses) skip the network lookup while still rejecting literal addresses. + */ +export async function assertUrlAllowed( + url: URL, + opts: { lookupHost?: HostLookup; resolveDns?: boolean } = {}, +): Promise { + if (url.protocol !== 'http:' && url.protocol !== 'https:') { + throw new SsrfError('Only http:// and https:// URLs are supported') + } + + const host = unwrapHost(url.hostname) + + if (net.isIP(host) !== 0) { + if (isBlockedAddress(host)) { + throw new SsrfError( + `Refusing to fetch private or reserved address: ${host}`, + ) + } + return + } + + if (opts.resolveDns === false) { + return + } + + const lookupHost = opts.lookupHost ?? defaultLookup + let addresses: string[] + try { + addresses = await lookupHost(host) + } catch (error) { + throw new SsrfError( + `Could not resolve host "${host}": ${ + error instanceof Error ? error.message : 'unknown error' + }`, + ) + } + + if (addresses.length === 0) { + throw new SsrfError(`Could not resolve host "${host}"`) + } + + for (const ip of addresses) { + if (isBlockedAddress(ip)) { + throw new SsrfError( + `Host "${host}" resolves to a private or reserved address (${ip})`, + ) + } + } +} From ac1a9c31afc4773ead57235083da4ed760770239 Mon Sep 17 00:00:00 2001 From: codebuff public sync bot <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 11 Jun 2026 07:48:08 +0000 Subject: [PATCH 66/96] Sync public snapshot from freebuff-private Source: CodebuffAI/freebuff-private@8d1ad538c832e8968218c3e750f00c41ddb6a890 --- bun.lock | 68 ++++++++++++++---------------- cli/src/components/login-modal.tsx | 28 +++++++++--- 2 files changed, 53 insertions(+), 43 deletions(-) diff --git a/bun.lock b/bun.lock index 80c4c067cb..dc742a9852 100644 --- a/bun.lock +++ b/bun.lock @@ -240,19 +240,33 @@ "@eslint-community/regexpp": ["@eslint-community/regexpp@4.12.2", "", {}, "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew=="], - "@eslint/eslintrc": ["@eslint/eslintrc@2.1.4", "", { "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", "espree": "^9.6.0", "globals": "^13.19.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", "minimatch": "^3.1.2", "strip-json-comments": "^3.1.1" } }, "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ=="], + "@eslint/config-array": ["@eslint/config-array@0.21.2", "", { "dependencies": { "@eslint/object-schema": "^2.1.7", "debug": "^4.3.1", "minimatch": "^3.1.5" } }, "sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw=="], - "@eslint/js": ["@eslint/js@8.57.1", "", {}, "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q=="], + "@eslint/config-helpers": ["@eslint/config-helpers@0.4.2", "", { "dependencies": { "@eslint/core": "^0.17.0" } }, "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw=="], + + "@eslint/core": ["@eslint/core@0.17.0", "", { "dependencies": { "@types/json-schema": "^7.0.15" } }, "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ=="], + + "@eslint/eslintrc": ["@eslint/eslintrc@3.3.5", "", { "dependencies": { "ajv": "^6.14.0", "debug": "^4.3.2", "espree": "^10.0.1", "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.1", "minimatch": "^3.1.5", "strip-json-comments": "^3.1.1" } }, "sha512-4IlJx0X0qftVsN5E+/vGujTRIFtwuLbNsVUe7TO6zYPDR1O6nFwvwhIKEKSrl6dZchmYBITazxKoUYOjdtjlRg=="], + + "@eslint/js": ["@eslint/js@9.39.4", "", {}, "sha512-nE7DEIchvtiFTwBw4Lfbu59PG+kCofhjsKaCWzxTpt4lfRjRMqG6uMBzKXuEcyXhOHoUp9riAm7/aWYGhXZ9cw=="], + + "@eslint/object-schema": ["@eslint/object-schema@2.1.7", "", {}, "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA=="], + + "@eslint/plugin-kit": ["@eslint/plugin-kit@0.4.1", "", { "dependencies": { "@eslint/core": "^0.17.0", "levn": "^0.4.1" } }, "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA=="], "@gravity-ai/api": ["@gravity-ai/api@0.1.2", "", { "dependencies": { "axios": "^1.13.2" } }, "sha512-txsAhyzvwB/TNrj5R8DoNqw8afM3JY2ahl7aaeaD5ZsxP+7rxff7C7keGI7+gU2KT3d2Mcw4QB1nHhbTSCJYHw=="], "@hono/node-server": ["@hono/node-server@1.19.14", "", { "peerDependencies": { "hono": "^4" } }, "sha512-GwtvgtXxnWsucXvbQXkRgqksiH2Qed37H9xHZocE5sA3N8O8O8/8FA3uclQXxXVzc9XBZuEOMK7+r02FmSpHtw=="], - "@humanwhocodes/config-array": ["@humanwhocodes/config-array@0.13.0", "", { "dependencies": { "@humanwhocodes/object-schema": "^2.0.3", "debug": "^4.3.1", "minimatch": "^3.0.5" } }, "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw=="], + "@humanfs/core": ["@humanfs/core@0.19.2", "", { "dependencies": { "@humanfs/types": "^0.15.0" } }, "sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA=="], + + "@humanfs/node": ["@humanfs/node@0.16.8", "", { "dependencies": { "@humanfs/core": "^0.19.2", "@humanfs/types": "^0.15.0", "@humanwhocodes/retry": "^0.4.0" } }, "sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ=="], + + "@humanfs/types": ["@humanfs/types@0.15.0", "", {}, "sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q=="], "@humanwhocodes/module-importer": ["@humanwhocodes/module-importer@1.0.1", "", {}, "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA=="], - "@humanwhocodes/object-schema": ["@humanwhocodes/object-schema@2.0.3", "", {}, "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA=="], + "@humanwhocodes/retry": ["@humanwhocodes/retry@0.4.3", "", {}, "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ=="], "@img/colour": ["@img/colour@1.1.0", "", {}, "sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ=="], @@ -454,6 +468,8 @@ "@types/diff": ["@types/diff@8.0.0", "", { "dependencies": { "diff": "*" } }, "sha512-o7jqJM04gfaYrdCecCVMbZhNdG6T1MHg/oQoRFdERLV+4d+V7FijhiEAbFu0Usww84Yijk9yH58U4Jk4HbtzZw=="], + "@types/estree": ["@types/estree@1.0.9", "", {}, "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg=="], + "@types/js-yaml": ["@types/js-yaml@4.0.9", "", {}, "sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg=="], "@types/json-schema": ["@types/json-schema@7.0.15", "", {}, "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA=="], @@ -504,8 +520,6 @@ "@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@6.21.0", "", { "dependencies": { "@typescript-eslint/types": "6.21.0", "eslint-visitor-keys": "^3.4.1" } }, "sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A=="], - "@ungap/structured-clone": ["@ungap/structured-clone@1.3.1", "", {}, "sha512-mUFwbeTqrVgDQxFveS+df2yfap6iuP20NAKAsBt5jDEoOTDew+zwLAOilHCeQJOVSvmgCX4ogqIrA0mnyr08yQ=="], - "@vercel/oidc": ["@vercel/oidc@3.1.0", "", {}, "sha512-Fw28YZpRnA3cAHHDlkt7xQHiJ0fcL+NRcIqsocZQUSmbzeIKRpwttJjik5ZGanXP+vlA4SbTg+AbA3bP363l+w=="], "@vscode/tree-sitter-wasm": ["@vscode/tree-sitter-wasm@0.1.4", "", {}, "sha512-kQVVg/CamCYDM+/XYCZuNTQyixjZd8ts/Gf84UzjEY0eRnbg6kiy5I9z2/2i3XdqwhI87iG07rkMR2KwhqcSbA=="], @@ -738,7 +752,7 @@ "escape-string-regexp": ["escape-string-regexp@4.0.0", "", {}, "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="], - "eslint": ["eslint@8.57.1", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", "@eslint/eslintrc": "^2.1.4", "@eslint/js": "8.57.1", "@humanwhocodes/config-array": "^0.13.0", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", "@ungap/structured-clone": "^1.2.0", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", "debug": "^4.3.2", "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", "eslint-scope": "^7.2.2", "eslint-visitor-keys": "^3.4.3", "espree": "^9.6.1", "esquery": "^1.4.2", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^6.0.1", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "globals": "^13.19.0", "graphemer": "^1.4.0", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "is-path-inside": "^3.0.3", "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.4.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", "optionator": "^0.9.3", "strip-ansi": "^6.0.1", "text-table": "^0.2.0" }, "bin": { "eslint": "bin/eslint.js" } }, "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA=="], + "eslint": ["eslint@9.39.4", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", "@eslint/config-array": "^0.21.2", "@eslint/config-helpers": "^0.4.2", "@eslint/core": "^0.17.0", "@eslint/eslintrc": "^3.3.5", "@eslint/js": "9.39.4", "@eslint/plugin-kit": "^0.4.1", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "ajv": "^6.14.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^8.4.0", "eslint-visitor-keys": "^4.2.1", "espree": "^10.4.0", "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.5", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, "peerDependencies": { "jiti": "*" }, "optionalPeers": ["jiti"], "bin": { "eslint": "bin/eslint.js" } }, "sha512-XoMjdBOwe/esVgEvLmNsD3IRHkm7fbKIUGvrleloJXUZgDHig2IPWNniv+GwjyJXzuNqVjlr5+4yVUZjycJwfQ=="], "eslint-config-prettier": ["eslint-config-prettier@9.1.2", "", { "peerDependencies": { "eslint": ">=7.0.0" }, "bin": { "eslint-config-prettier": "bin/cli.js" } }, "sha512-iI1f+D2ViGn+uvv5HuHVUamg8ll4tN+JRHGc6IJi4TP9Kl976C57fzPXgseXNs8v0iA8aSJpHsTWjDb9QJamGQ=="], @@ -750,11 +764,11 @@ "eslint-plugin-unused-imports": ["eslint-plugin-unused-imports@4.4.1", "", { "peerDependencies": { "@typescript-eslint/eslint-plugin": "^8.0.0-0 || ^7.0.0 || ^6.0.0 || ^5.0.0", "eslint": "^10.0.0 || ^9.0.0 || ^8.0.0" }, "optionalPeers": ["@typescript-eslint/eslint-plugin"] }, "sha512-oZGYUz1X3sRMGUB+0cZyK2VcvRX5lm/vB56PgNNcU+7ficUCKm66oZWKUubXWnOuPjQ8PvmXtCViXBMONPe7tQ=="], - "eslint-scope": ["eslint-scope@7.2.2", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg=="], + "eslint-scope": ["eslint-scope@8.4.0", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg=="], "eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="], - "espree": ["espree@9.6.1", "", { "dependencies": { "acorn": "^8.9.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^3.4.1" } }, "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ=="], + "espree": ["espree@10.4.0", "", { "dependencies": { "acorn": "^8.15.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^4.2.1" } }, "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ=="], "esprima": ["esprima@4.0.1", "", { "bin": { "esparse": "./bin/esparse.js", "esvalidate": "./bin/esvalidate.js" } }, "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="], @@ -806,7 +820,7 @@ "fetch-blob": ["fetch-blob@3.2.0", "", { "dependencies": { "node-domexception": "^1.0.0", "web-streams-polyfill": "^3.0.3" } }, "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ=="], - "file-entry-cache": ["file-entry-cache@6.0.1", "", { "dependencies": { "flat-cache": "^3.0.4" } }, "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg=="], + "file-entry-cache": ["file-entry-cache@8.0.0", "", { "dependencies": { "flat-cache": "^4.0.0" } }, "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ=="], "file-type": ["file-type@21.3.4", "", { "dependencies": { "@tokenizer/inflate": "^0.4.1", "strtok3": "^10.3.4", "token-types": "^6.1.1", "uint8array-extras": "^1.4.0" } }, "sha512-Ievi/yy8DS3ygGvT47PjSfdFoX+2isQueoYP1cntFW1JLYAuS4GD7NUPGg4zv2iZfV52uDyk5w5Z0TdpRS6Q1g=="], @@ -816,7 +830,7 @@ "find-up": ["find-up@5.0.0", "", { "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" } }, "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng=="], - "flat-cache": ["flat-cache@3.2.0", "", { "dependencies": { "flatted": "^3.2.9", "keyv": "^4.5.3", "rimraf": "^3.0.2" } }, "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw=="], + "flat-cache": ["flat-cache@4.0.1", "", { "dependencies": { "flatted": "^3.2.9", "keyv": "^4.5.4" } }, "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw=="], "flatted": ["flatted@3.4.2", "", {}, "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA=="], @@ -834,8 +848,6 @@ "fs-constants": ["fs-constants@1.0.0", "", {}, "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow=="], - "fs.realpath": ["fs.realpath@1.0.0", "", {}, "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw=="], - "fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="], "function-bind": ["function-bind@1.1.2", "", {}, "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="], @@ -866,11 +878,9 @@ "github-from-package": ["github-from-package@0.0.0", "", {}, "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw=="], - "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=="], - "glob-parent": ["glob-parent@6.0.2", "", { "dependencies": { "is-glob": "^4.0.3" } }, "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A=="], - "globals": ["globals@13.24.0", "", { "dependencies": { "type-fest": "^0.20.2" } }, "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ=="], + "globals": ["globals@14.0.0", "", {}, "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ=="], "globalthis": ["globalthis@1.0.4", "", { "dependencies": { "define-properties": "^1.2.1", "gopd": "^1.0.1" } }, "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ=="], @@ -922,8 +932,6 @@ "imurmurhash": ["imurmurhash@0.1.4", "", {}, "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA=="], - "inflight": ["inflight@1.0.6", "", { "dependencies": { "once": "^1.3.0", "wrappy": "1" } }, "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA=="], - "inherits": ["inherits@2.0.4", "", {}, "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="], "ini": ["ini@1.3.8", "", {}, "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew=="], @@ -976,8 +984,6 @@ "is-number-object": ["is-number-object@1.1.1", "", { "dependencies": { "call-bound": "^1.0.3", "has-tostringtag": "^1.0.2" } }, "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw=="], - "is-path-inside": ["is-path-inside@3.0.3", "", {}, "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ=="], - "is-plain-obj": ["is-plain-obj@4.1.0", "", {}, "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg=="], "is-promise": ["is-promise@4.0.0", "", {}, "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ=="], @@ -1260,8 +1266,6 @@ "path-exists": ["path-exists@4.0.0", "", {}, "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w=="], - "path-is-absolute": ["path-is-absolute@1.0.1", "", {}, "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg=="], - "path-key": ["path-key@3.1.1", "", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="], "path-parse": ["path-parse@1.0.7", "", {}, "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="], @@ -1400,8 +1404,6 @@ "reusify": ["reusify@1.1.0", "", {}, "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw=="], - "rimraf": ["rimraf@3.0.2", "", { "dependencies": { "glob": "^7.1.3" }, "bin": { "rimraf": "bin.js" } }, "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA=="], - "router": ["router@2.2.0", "", { "dependencies": { "debug": "^4.4.0", "depd": "^2.0.0", "is-promise": "^4.0.0", "parseurl": "^1.3.3", "path-to-regexp": "^8.0.0" } }, "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ=="], "run-applescript": ["run-applescript@7.1.0", "", {}, "sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q=="], @@ -1524,8 +1526,6 @@ "terminal-image": ["terminal-image@4.3.0", "", { "dependencies": { "chalk": "^5.6.2", "image-dimensions": "^2.5.0", "jimp": "^1.6.1", "log-update": "^8.0.0", "omggif": "^1.0.10", "supports-terminal-graphics": "^0.1.0", "term-img": "^7.0.0" } }, "sha512-P4bCi7Ich17LgN/P2zM9sYbeleYNgu1Skk3q/uc15Ol9zWSiCldrCcIJ1Pd6dpgRGDmWhGVTgWHjV+ZMk1m/5g=="], - "text-table": ["text-table@0.2.0", "", {}, "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw=="], - "thread-stream": ["thread-stream@3.2.0", "", { "dependencies": { "real-require": "^0.2.0" } }, "sha512-zLBvqpwr4Esa0kRjcrzGU6zL25lePWaCLMx0RQFrmteozIfeNdaMLpG5U7PeHzvlFkAWaRKA9/KVW4F60iB+qw=="], "tinycolor2": ["tinycolor2@1.6.0", "", {}, "sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw=="], @@ -1554,8 +1554,6 @@ "type-check": ["type-check@0.4.0", "", { "dependencies": { "prelude-ls": "^1.2.1" } }, "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew=="], - "type-fest": ["type-fest@0.20.2", "", {}, "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ=="], - "type-is": ["type-is@2.1.0", "", { "dependencies": { "content-type": "^2.0.0", "media-typer": "^1.1.0", "mime-types": "^3.0.0" } }, "sha512-faYHw0anBbc/kWF3zFTEnxSFOAGUX9GFbOBthvDdLsIlEoWOFOtS0zgCiQYwIskL9iGXZL3kAXD8OoZ4GmMATA=="], "typed-array-buffer": ["typed-array-buffer@1.0.3", "", { "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", "is-typed-array": "^1.1.14" } }, "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw=="], @@ -1682,6 +1680,8 @@ "@opentui/core/strip-ansi": ["strip-ansi@7.1.2", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA=="], + "@types/diff/diff": ["diff@9.0.0", "", {}, "sha512-svtcdpS8CgJyqAjEQIXdb3OjhFVVYjzGAPO8WGCmRbrml64SPw/jJD4GoE98aR7r25A0XcgrK3F02yw9R/vhQw=="], + "@typescript-eslint/eslint-plugin/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], "@typescript-eslint/parser/@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@7.18.0", "", { "dependencies": { "@typescript-eslint/types": "7.18.0", "@typescript-eslint/visitor-keys": "7.18.0" } }, "sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA=="], @@ -1712,14 +1712,10 @@ "eslint/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], - "eslint/doctrine": ["doctrine@3.0.0", "", { "dependencies": { "esutils": "^2.0.2" } }, "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w=="], + "eslint/eslint-visitor-keys": ["eslint-visitor-keys@4.2.1", "", {}, "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ=="], "eslint/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], - "eslint/js-yaml": ["js-yaml@4.2.0", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-ePWsvanv0DWuDRsW8dnt+R4jQ31SCRCQ7hhNcPXZPsoBZiemuZNYGf7adZdqX2D86j6rvKp3RpCxVTSb8WQlOw=="], - - "eslint/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], - "eslint-import-resolver-node/debug": ["debug@3.2.7", "", { "dependencies": { "ms": "^2.1.1" } }, "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ=="], "eslint-module-utils/debug": ["debug@3.2.7", "", { "dependencies": { "ms": "^2.1.1" } }, "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ=="], @@ -1730,6 +1726,8 @@ "eslint-plugin-import/tsconfig-paths": ["tsconfig-paths@3.15.0", "", { "dependencies": { "@types/json5": "^0.0.29", "json5": "^1.0.2", "minimist": "^1.2.6", "strip-bom": "^3.0.0" } }, "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg=="], + "espree/eslint-visitor-keys": ["eslint-visitor-keys@4.2.1", "", {}, "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ=="], + "execa/onetime": ["onetime@5.1.2", "", { "dependencies": { "mimic-fn": "^2.1.0" } }, "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg=="], "express/mime-types": ["mime-types@3.0.2", "", { "dependencies": { "mime-db": "^1.54.0" } }, "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A=="], @@ -1810,10 +1808,6 @@ "eslint/ajv/json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], - "eslint/js-yaml/argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="], - - "eslint/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], - "express/mime-types/mime-db": ["mime-db@1.54.0", "", {}, "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ=="], "p-locate/p-limit/yocto-queue": ["yocto-queue@0.1.0", "", {}, "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="], diff --git a/cli/src/components/login-modal.tsx b/cli/src/components/login-modal.tsx index aa0a9f7b89..a03716985b 100644 --- a/cli/src/components/login-modal.tsx +++ b/cli/src/components/login-modal.tsx @@ -1,5 +1,11 @@ import { useRenderer } from '@opentui/react' -import React, { useCallback, useEffect, useRef, useState } from 'react' +import React, { + useCallback, + useEffect, + useMemo, + useRef, + useState, +} from 'react' import { Button } from './button' import { useLoginMutation } from '../hooks/use-auth-query' @@ -209,11 +215,13 @@ export const LoginModal = ({ maxUrlWidth, } = calculateResponsiveLayout(terminalWidth, terminalHeight) - // Format login URL lines - const formatLoginUrlLines = useCallback( - (text: string, width?: number) => formatUrl(text, width ?? maxUrlWidth), - [maxUrlWidth], + const loginUrlLines = useMemo( + () => (loginUrl ? formatUrl(loginUrl, maxUrlWidth) : []), + [loginUrl, maxUrlWidth], ) + // A wrapped URL is a trap: terminal link detection and drag-select only + // capture the first row, so the auth code arrives truncated. + const loginUrlWrapped = loginUrlLines.length > 1 // Use custom hook for sheen animation const blockColor = getLogoBlockColor(theme.name) @@ -381,7 +389,7 @@ export const LoginModal = ({ alignItems: 'flex-start', }} > - {formatLoginUrlLines(loginUrl, maxUrlWidth).map((line, index) => ( + {loginUrlLines.map((line, index) => ( ))} + {loginUrlWrapped && ( + + + ⚠ The link wraps across lines — clicking it will cut it off. + Press c to copy the full link instead. + + + )} Date: Thu, 11 Jun 2026 07:48:46 +0000 Subject: [PATCH 67/96] Sync public snapshot from freebuff-private Source: CodebuffAI/freebuff-private@c5e4147c79707204309a6ad24e5438e43d5625d1 --- agents/researcher/researcher-web.ts | 11 +++-- bun.lock | 74 ++++++++++------------------- 2 files changed, 33 insertions(+), 52 deletions(-) diff --git a/agents/researcher/researcher-web.ts b/agents/researcher/researcher-web.ts index fdd2a5928c..851b862241 100644 --- a/agents/researcher/researcher-web.ts +++ b/agents/researcher/researcher-web.ts @@ -19,16 +19,19 @@ const definition: SecretAgentDefinition = { toolNames: ['web_search', 'read_url'], spawnableAgents: [], - systemPrompt: `You are an expert researcher who can search the web to find relevant information. Your goal is to answer the user's question from current search results and useful source pages. Use web_search to get Serper JSON search results. Use read_url to fetch and extract readable text from pages that would help answer the user's question.`, + systemPrompt: `You are an expert researcher who can search the web to find relevant information. Your goal is to answer the user's question from current search results and useful source pages. Use web_search to get Serper JSON search results. Use read_url to fetch and extract readable text from pages that would help answer the user's question. Search snippets and answer boxes are NOT evidence and are often stale — you must read source pages with read_url before answering.`, instructionsPrompt: `Provide comprehensive research on the user's prompt. -Use web_search to find current information. The tool returns JSON search results, so inspect the titles, links, snippets, answer boxes, and related results before deciding what to fetch next. - -Use read_url to fetch any web page that would help answer the user's question. Prefer targeted, relevant pages from the search results, especially official or primary sources. Avoid fetching pages that are unlikely to add useful evidence. +Research iteratively, in multiple rounds: +1. Start with 1-2 web_search calls. Inspect the titles, links, snippets, answer boxes, and related results. +2. Call read_url on the most promising results, especially official or primary sources. Call read_url on several pages at once, in parallel. +3. After reading, check what is still missing, uncertain, or worth verifying. Run follow-up searches with refined queries (using new terms you learned from the pages) and read more pages until the question is well covered from multiple sources. If read_url cannot handle a source, choose a different result or explain the limitation. Then, write up a concise answer that includes key findings for the user's prompt and cites source URLs when useful. + +HARD RULE: You may not write your final answer until you have successfully fetched at least 3 pages with read_url — for multi-part or comparative questions, fetch 5 or more. Search results alone are never sufficient, no matter how complete they look. If you are about to answer and have fewer than 3 read_url fetches, call read_url instead. `.trim(), } diff --git a/bun.lock b/bun.lock index dc742a9852..6eb2a9c379 100644 --- a/bun.lock +++ b/bun.lock @@ -240,19 +240,15 @@ "@eslint-community/regexpp": ["@eslint-community/regexpp@4.12.2", "", {}, "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew=="], - "@eslint/config-array": ["@eslint/config-array@0.21.2", "", { "dependencies": { "@eslint/object-schema": "^2.1.7", "debug": "^4.3.1", "minimatch": "^3.1.5" } }, "sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw=="], + "@eslint/config-array": ["@eslint/config-array@0.23.5", "", { "dependencies": { "@eslint/object-schema": "^3.0.5", "debug": "^4.3.1", "minimatch": "^10.2.4" } }, "sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA=="], - "@eslint/config-helpers": ["@eslint/config-helpers@0.4.2", "", { "dependencies": { "@eslint/core": "^0.17.0" } }, "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw=="], + "@eslint/config-helpers": ["@eslint/config-helpers@0.6.0", "", { "dependencies": { "@eslint/core": "^1.2.1" } }, "sha512-ii6Bw9jJ2zi2cWA2Z+9/QZ/+3DX6kwaV5Q986D/CdP3Lap3w/pgQZ373FV7byY/i7L4IRH/G43I5dz1ClsCbpA=="], - "@eslint/core": ["@eslint/core@0.17.0", "", { "dependencies": { "@types/json-schema": "^7.0.15" } }, "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ=="], + "@eslint/core": ["@eslint/core@1.2.1", "", { "dependencies": { "@types/json-schema": "^7.0.15" } }, "sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ=="], - "@eslint/eslintrc": ["@eslint/eslintrc@3.3.5", "", { "dependencies": { "ajv": "^6.14.0", "debug": "^4.3.2", "espree": "^10.0.1", "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.1", "minimatch": "^3.1.5", "strip-json-comments": "^3.1.1" } }, "sha512-4IlJx0X0qftVsN5E+/vGujTRIFtwuLbNsVUe7TO6zYPDR1O6nFwvwhIKEKSrl6dZchmYBITazxKoUYOjdtjlRg=="], + "@eslint/object-schema": ["@eslint/object-schema@3.0.5", "", {}, "sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw=="], - "@eslint/js": ["@eslint/js@9.39.4", "", {}, "sha512-nE7DEIchvtiFTwBw4Lfbu59PG+kCofhjsKaCWzxTpt4lfRjRMqG6uMBzKXuEcyXhOHoUp9riAm7/aWYGhXZ9cw=="], - - "@eslint/object-schema": ["@eslint/object-schema@2.1.7", "", {}, "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA=="], - - "@eslint/plugin-kit": ["@eslint/plugin-kit@0.4.1", "", { "dependencies": { "@eslint/core": "^0.17.0", "levn": "^0.4.1" } }, "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA=="], + "@eslint/plugin-kit": ["@eslint/plugin-kit@0.7.2", "", { "dependencies": { "@eslint/core": "^1.2.1", "levn": "^0.4.1" } }, "sha512-+CNAzxglkrpNf/kKywqQfk74QjtceuOE7Qm+AF8miRvPF/wmmK5+OJOgVh3AVTT3RP2mH3+FOaxlE5v72owk0A=="], "@gravity-ai/api": ["@gravity-ai/api@0.1.2", "", { "dependencies": { "axios": "^1.13.2" } }, "sha512-txsAhyzvwB/TNrj5R8DoNqw8afM3JY2ahl7aaeaD5ZsxP+7rxff7C7keGI7+gU2KT3d2Mcw4QB1nHhbTSCJYHw=="], @@ -468,6 +464,8 @@ "@types/diff": ["@types/diff@8.0.0", "", { "dependencies": { "diff": "*" } }, "sha512-o7jqJM04gfaYrdCecCVMbZhNdG6T1MHg/oQoRFdERLV+4d+V7FijhiEAbFu0Usww84Yijk9yH58U4Jk4HbtzZw=="], + "@types/esrecurse": ["@types/esrecurse@4.3.1", "", {}, "sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw=="], + "@types/estree": ["@types/estree@1.0.9", "", {}, "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg=="], "@types/js-yaml": ["@types/js-yaml@4.0.9", "", {}, "sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg=="], @@ -550,7 +548,7 @@ "ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="], - "ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + "ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], "any-base": ["any-base@1.1.0", "", {}, "sha512-uMgjozySS8adZZYePpaWs8cxB9/kdzmpX6SgJZ+wbz1K5eYk5QMYDVJaZKhxyIHUdnnJkfR7SVgStgH7LkGUyg=="], @@ -626,8 +624,6 @@ "call-bound": ["call-bound@1.0.4", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "get-intrinsic": "^1.3.0" } }, "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg=="], - "callsites": ["callsites@3.1.0", "", {}, "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="], - "caniuse-lite": ["caniuse-lite@1.0.30001797", "", {}, "sha512-l8xKG+gwAIExZGl9FrF7KUwuOmk6wbEPC9Xoy/RtnWv1XG0Q4LFlagaLpUv3Kiza3W/wm27zy0yWJEieYKAP6w=="], "canvas": ["canvas@3.2.3", "", { "dependencies": { "node-addon-api": "^7.0.0", "prebuild-install": "^7.1.3" } }, "sha512-PzE5nJZPz72YUAfo8oTp0u3fqqY7IzlTubneAihqDYAUcBk7ryeCmBbdJBEdaH0bptSOe2VT2Zwcb3UaFyaSWw=="], @@ -752,7 +748,7 @@ "escape-string-regexp": ["escape-string-regexp@4.0.0", "", {}, "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="], - "eslint": ["eslint@9.39.4", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", "@eslint/config-array": "^0.21.2", "@eslint/config-helpers": "^0.4.2", "@eslint/core": "^0.17.0", "@eslint/eslintrc": "^3.3.5", "@eslint/js": "9.39.4", "@eslint/plugin-kit": "^0.4.1", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "ajv": "^6.14.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^8.4.0", "eslint-visitor-keys": "^4.2.1", "espree": "^10.4.0", "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.5", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, "peerDependencies": { "jiti": "*" }, "optionalPeers": ["jiti"], "bin": { "eslint": "bin/eslint.js" } }, "sha512-XoMjdBOwe/esVgEvLmNsD3IRHkm7fbKIUGvrleloJXUZgDHig2IPWNniv+GwjyJXzuNqVjlr5+4yVUZjycJwfQ=="], + "eslint": ["eslint@10.4.1", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.2", "@eslint/config-array": "^0.23.5", "@eslint/config-helpers": "^0.6.0", "@eslint/core": "^1.2.1", "@eslint/plugin-kit": "^0.7.2", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "ajv": "^6.14.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^9.1.2", "eslint-visitor-keys": "^5.0.1", "espree": "^11.2.0", "esquery": "^1.7.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "minimatch": "^10.2.4", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, "peerDependencies": { "jiti": "*" }, "optionalPeers": ["jiti"], "bin": { "eslint": "bin/eslint.js" } }, "sha512-AyIKhnOBuOAdueD7RB3xB+YeAWScb9jHsJBgH2Hcde8InP5JYhqrRR6iTMHyTEwgENK54Cp44e4v8BwNhsuHuw=="], "eslint-config-prettier": ["eslint-config-prettier@9.1.2", "", { "peerDependencies": { "eslint": ">=7.0.0" }, "bin": { "eslint-config-prettier": "bin/cli.js" } }, "sha512-iI1f+D2ViGn+uvv5HuHVUamg8ll4tN+JRHGc6IJi4TP9Kl976C57fzPXgseXNs8v0iA8aSJpHsTWjDb9QJamGQ=="], @@ -764,11 +760,11 @@ "eslint-plugin-unused-imports": ["eslint-plugin-unused-imports@4.4.1", "", { "peerDependencies": { "@typescript-eslint/eslint-plugin": "^8.0.0-0 || ^7.0.0 || ^6.0.0 || ^5.0.0", "eslint": "^10.0.0 || ^9.0.0 || ^8.0.0" }, "optionalPeers": ["@typescript-eslint/eslint-plugin"] }, "sha512-oZGYUz1X3sRMGUB+0cZyK2VcvRX5lm/vB56PgNNcU+7ficUCKm66oZWKUubXWnOuPjQ8PvmXtCViXBMONPe7tQ=="], - "eslint-scope": ["eslint-scope@8.4.0", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg=="], + "eslint-scope": ["eslint-scope@9.1.2", "", { "dependencies": { "@types/esrecurse": "^4.3.1", "@types/estree": "^1.0.8", "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ=="], "eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="], - "espree": ["espree@10.4.0", "", { "dependencies": { "acorn": "^8.15.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^4.2.1" } }, "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ=="], + "espree": ["espree@11.2.0", "", { "dependencies": { "acorn": "^8.16.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^5.0.1" } }, "sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw=="], "esprima": ["esprima@4.0.1", "", { "bin": { "esparse": "./bin/esparse.js", "esvalidate": "./bin/esvalidate.js" } }, "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="], @@ -880,8 +876,6 @@ "glob-parent": ["glob-parent@6.0.2", "", { "dependencies": { "is-glob": "^4.0.3" } }, "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A=="], - "globals": ["globals@14.0.0", "", {}, "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ=="], - "globalthis": ["globalthis@1.0.4", "", { "dependencies": { "define-properties": "^1.2.1", "gopd": "^1.0.1" } }, "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ=="], "globby": ["globby@11.1.0", "", { "dependencies": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", "fast-glob": "^3.2.9", "ignore": "^5.2.0", "merge2": "^1.4.1", "slash": "^3.0.0" } }, "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g=="], @@ -896,8 +890,6 @@ "has-bigints": ["has-bigints@1.1.0", "", {}, "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg=="], - "has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], - "has-property-descriptors": ["has-property-descriptors@1.0.2", "", { "dependencies": { "es-define-property": "^1.0.0" } }, "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg=="], "has-proto": ["has-proto@1.2.0", "", { "dependencies": { "dunder-proto": "^1.0.0" } }, "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ=="], @@ -928,8 +920,6 @@ "immer": ["immer@10.2.0", "", {}, "sha512-d/+XTN3zfODyjr89gM3mPq1WNX2B8pYsu7eORitdwyA2sBubnTl3laYlBk4sXY5FUa5qTZGBDPJICVbvqzjlbw=="], - "import-fresh": ["import-fresh@3.3.1", "", { "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" } }, "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ=="], - "imurmurhash": ["imurmurhash@0.1.4", "", {}, "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA=="], "inherits": ["inherits@2.0.4", "", {}, "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="], @@ -1046,8 +1036,6 @@ "lodash": ["lodash@4.17.23", "", {}, "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w=="], - "lodash.merge": ["lodash.merge@4.6.2", "", {}, "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ=="], - "log-update": ["log-update@8.0.0", "", { "dependencies": { "ansi-escapes": "^7.3.0", "cli-cursor": "^5.0.0", "slice-ansi": "^9.0.0", "string-width": "^8.2.0", "strip-ansi": "^7.2.0", "wrap-ansi": "^10.0.0" } }, "sha512-lddSgOt3bPASrylL54ZSpy8nBHns+vBVSoILlVOx+dei300pnLRN958rj/EdlVLKuWlSESU3qdnDZdAI7FXYGg=="], "longest-streak": ["longest-streak@3.1.0", "", {}, "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g=="], @@ -1250,8 +1238,6 @@ "pako": ["pako@1.0.11", "", {}, "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw=="], - "parent-module": ["parent-module@1.0.1", "", { "dependencies": { "callsites": "^3.0.0" } }, "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g=="], - "parse-bmfont-ascii": ["parse-bmfont-ascii@1.0.6", "", {}, "sha512-U4RrVsUFCleIOBsIGYOMKjn9PavsGOXxbvYGtMOEfnId0SVNsgehXh1DxUdVPLoxd5mvcEtvmKs2Mmf0Mpa1ZA=="], "parse-bmfont-binary": ["parse-bmfont-binary@1.0.6", "", {}, "sha512-GxmsRea0wdGdYthjuUeWTMWPqm2+FAd4GI8vCvhgJsFnoGhTrLhXDDupwTo7rXVAgaLIGoVHDZS9p/5XbSqeWA=="], @@ -1396,8 +1382,6 @@ "resolve": ["resolve@2.0.0-next.7", "", { "dependencies": { "es-errors": "^1.3.0", "is-core-module": "^2.16.2", "node-exports-info": "^1.6.0", "object-keys": "^1.1.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-tqt+NBWwyaMgw3zDsnygx4CByWjQEJHOPMdslYhppaQSJUtL/D4JO9CcBBlhPoI8lz9oJIDXkwXfhF4aWqP8xQ=="], - "resolve-from": ["resolve-from@4.0.0", "", {}, "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="], - "resolve-pkg-maps": ["resolve-pkg-maps@1.0.0", "", {}, "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw=="], "restore-cursor": ["restore-cursor@5.1.0", "", { "dependencies": { "onetime": "^7.0.0", "signal-exit": "^4.1.0" } }, "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA=="], @@ -1502,7 +1486,7 @@ "strip-final-newline": ["strip-final-newline@2.0.0", "", {}, "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA=="], - "strip-json-comments": ["strip-json-comments@3.1.1", "", {}, "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig=="], + "strip-json-comments": ["strip-json-comments@2.0.1", "", {}, "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ=="], "stripe": ["stripe@16.12.0", "", { "dependencies": { "@types/node": ">=8.1.0", "qs": "^6.11.0" } }, "sha512-H7eFVLDxeTNNSn4JTRfL2//LzCbDrMSZ+2q1c7CanVWgK2qIW5TwS+0V7N9KcKZZNpYh/uCqK0PyZh/2UsaAtQ=="], @@ -1510,8 +1494,6 @@ "styled-jsx": ["styled-jsx@5.1.6", "", { "dependencies": { "client-only": "0.0.1" }, "peerDependencies": { "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0" } }, "sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA=="], - "supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], - "supports-preserve-symlinks-flag": ["supports-preserve-symlinks-flag@1.0.0", "", {}, "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w=="], "supports-terminal-graphics": ["supports-terminal-graphics@0.1.0", "", {}, "sha512-+KdfozhS0Fw8y5Sghw8kkZNGT8nWYzJ1EzcoIvVjxhl+26TJTs26y02yfBgvc1jh5AS/c8jcI3xtahhR95KRyQ=="], @@ -1670,11 +1652,7 @@ "@codebuff/sdk/ignore": ["ignore@7.0.5", "", {}, "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg=="], - "@eslint/eslintrc/ajv": ["ajv@6.15.0", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw=="], - - "@eslint/eslintrc/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], - - "@eslint/eslintrc/js-yaml": ["js-yaml@4.2.0", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-ePWsvanv0DWuDRsW8dnt+R4jQ31SCRCQ7hhNcPXZPsoBZiemuZNYGf7adZdqX2D86j6rvKp3RpCxVTSb8WQlOw=="], + "@eslint/config-array/minimatch": ["minimatch@10.2.5", "", { "dependencies": { "brace-expansion": "^5.0.5" } }, "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg=="], "@opentui/core/diff": ["diff@9.0.0", "", {}, "sha512-svtcdpS8CgJyqAjEQIXdb3OjhFVVYjzGAPO8WGCmRbrml64SPw/jJD4GoE98aR7r25A0XcgrK3F02yw9R/vhQw=="], @@ -1710,12 +1688,12 @@ "eslint/ajv": ["ajv@6.15.0", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw=="], - "eslint/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], - - "eslint/eslint-visitor-keys": ["eslint-visitor-keys@4.2.1", "", {}, "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ=="], + "eslint/eslint-visitor-keys": ["eslint-visitor-keys@5.0.1", "", {}, "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA=="], "eslint/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], + "eslint/minimatch": ["minimatch@10.2.5", "", { "dependencies": { "brace-expansion": "^5.0.5" } }, "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg=="], + "eslint-import-resolver-node/debug": ["debug@3.2.7", "", { "dependencies": { "ms": "^2.1.1" } }, "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ=="], "eslint-module-utils/debug": ["debug@3.2.7", "", { "dependencies": { "ms": "^2.1.1" } }, "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ=="], @@ -1726,7 +1704,7 @@ "eslint-plugin-import/tsconfig-paths": ["tsconfig-paths@3.15.0", "", { "dependencies": { "@types/json5": "^0.0.29", "json5": "^1.0.2", "minimist": "^1.2.6", "strip-bom": "^3.0.0" } }, "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg=="], - "espree/eslint-visitor-keys": ["eslint-visitor-keys@4.2.1", "", {}, "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ=="], + "espree/eslint-visitor-keys": ["eslint-visitor-keys@5.0.1", "", {}, "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA=="], "execa/onetime": ["onetime@5.1.2", "", { "dependencies": { "mimic-fn": "^2.1.0" } }, "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg=="], @@ -1754,16 +1732,12 @@ "plist/xmlbuilder": ["xmlbuilder@15.1.1", "", {}, "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg=="], - "rc/strip-json-comments": ["strip-json-comments@2.0.1", "", {}, "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ=="], - "react-devtools-core/ws": ["ws@7.5.11", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": "^5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-zS54Oen9bITtp7kp2XM3AydrCIq1D+HwJOuH+c+e4LfpL/lotP5osijd+UoMnxwAam1GN8R4KtLAyIrIcBNpiA=="], "react-reconciler/scheduler": ["scheduler@0.26.0", "", {}, "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA=="], "send/mime-types": ["mime-types@3.0.2", "", { "dependencies": { "mime-db": "^1.54.0" } }, "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A=="], - "slice-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], - "tar-stream/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=="], "ts-node/diff": ["diff@4.0.4", "", {}, "sha512-X07nttJQkwkfKfvTPG/KSnE2OMdcUCao6+eXF3wmnIQRn2aPAHH3VxDbDOdegkd6JbPsXqShpvEOHfAT+nCNwQ=="], @@ -1778,8 +1752,6 @@ "typescript-eslint/@typescript-eslint/utils": ["@typescript-eslint/utils@7.18.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@typescript-eslint/scope-manager": "7.18.0", "@typescript-eslint/types": "7.18.0", "@typescript-eslint/typescript-estree": "7.18.0" }, "peerDependencies": { "eslint": "^8.56.0" } }, "sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw=="], - "wrap-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], - "wrap-ansi/string-width": ["string-width@8.2.1", "", { "dependencies": { "get-east-asian-width": "^1.5.0", "strip-ansi": "^7.1.2" } }, "sha512-IIaP0g3iy9Cyy18w3M9YcaDudujEAVHKt3a3QJg1+sr/oX96TbaGUubG0hJyCjCBThFH+tFpcIyoUHUn1ogaLA=="], "yargs/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], @@ -1788,9 +1760,7 @@ "@codebuff/evals/pino/process-warning": ["process-warning@5.0.0", "", {}, "sha512-a39t9ApHNx2L4+HBnQKqxxHNs1r7KF+Intd8Q/g1bUh6q0WIp9voPXJ/x0j+ZL45KF1pJd9+q2jLIRMfvEshkA=="], - "@eslint/eslintrc/ajv/json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], - - "@eslint/eslintrc/js-yaml/argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="], + "@eslint/config-array/minimatch/brace-expansion": ["brace-expansion@5.0.6", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g=="], "@typescript-eslint/parser/@typescript-eslint/typescript-estree/minimatch": ["minimatch@9.0.9", "", { "dependencies": { "brace-expansion": "^2.0.2" } }, "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg=="], @@ -1804,10 +1774,14 @@ "cliui/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], + "cliui/wrap-ansi/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + "eslint-plugin-import/tsconfig-paths/json5": ["json5@1.0.2", "", { "dependencies": { "minimist": "^1.2.0" }, "bin": { "json5": "lib/cli.js" } }, "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA=="], "eslint/ajv/json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], + "eslint/minimatch/brace-expansion": ["brace-expansion@5.0.6", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g=="], + "express/mime-types/mime-db": ["mime-db@1.54.0", "", {}, "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ=="], "p-locate/p-limit/yocto-queue": ["yocto-queue@0.1.0", "", {}, "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="], @@ -1836,8 +1810,12 @@ "yargs/string-width/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + "@eslint/config-array/minimatch/brace-expansion/balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="], + "@typescript-eslint/parser/@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.1.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-WR1cURNjuvBLMZBMbqM0UoE+WAfdUcEV1ccD8PVBVOI+Z3ND4+SZbN8RsfT2bMuG1qwz5RFvPukSZm5fF2D5eA=="], + "eslint/minimatch/brace-expansion/balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="], + "typescript-eslint/@typescript-eslint/eslint-plugin/@typescript-eslint/scope-manager/@typescript-eslint/types": ["@typescript-eslint/types@7.18.0", "", {}, "sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ=="], "typescript-eslint/@typescript-eslint/eslint-plugin/@typescript-eslint/type-utils/@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@7.18.0", "", { "dependencies": { "@typescript-eslint/types": "7.18.0", "@typescript-eslint/visitor-keys": "7.18.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", "minimatch": "^9.0.4", "semver": "^7.6.0", "ts-api-utils": "^1.3.0" } }, "sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA=="], From 731bbd9c006334016a30a038af2d68425e7d886e Mon Sep 17 00:00:00 2001 From: codebuff public sync bot <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 11 Jun 2026 08:11:41 +0000 Subject: [PATCH 68/96] Sync public snapshot from freebuff-private Source: CodebuffAI/freebuff-private@5332b216f94839860708509af0897d28ebe3000b --- bun.lock | 74 ++++++++++++++++++++++++++++++++++++-------------------- 1 file changed, 48 insertions(+), 26 deletions(-) diff --git a/bun.lock b/bun.lock index 6eb2a9c379..dc742a9852 100644 --- a/bun.lock +++ b/bun.lock @@ -240,15 +240,19 @@ "@eslint-community/regexpp": ["@eslint-community/regexpp@4.12.2", "", {}, "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew=="], - "@eslint/config-array": ["@eslint/config-array@0.23.5", "", { "dependencies": { "@eslint/object-schema": "^3.0.5", "debug": "^4.3.1", "minimatch": "^10.2.4" } }, "sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA=="], + "@eslint/config-array": ["@eslint/config-array@0.21.2", "", { "dependencies": { "@eslint/object-schema": "^2.1.7", "debug": "^4.3.1", "minimatch": "^3.1.5" } }, "sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw=="], - "@eslint/config-helpers": ["@eslint/config-helpers@0.6.0", "", { "dependencies": { "@eslint/core": "^1.2.1" } }, "sha512-ii6Bw9jJ2zi2cWA2Z+9/QZ/+3DX6kwaV5Q986D/CdP3Lap3w/pgQZ373FV7byY/i7L4IRH/G43I5dz1ClsCbpA=="], + "@eslint/config-helpers": ["@eslint/config-helpers@0.4.2", "", { "dependencies": { "@eslint/core": "^0.17.0" } }, "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw=="], - "@eslint/core": ["@eslint/core@1.2.1", "", { "dependencies": { "@types/json-schema": "^7.0.15" } }, "sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ=="], + "@eslint/core": ["@eslint/core@0.17.0", "", { "dependencies": { "@types/json-schema": "^7.0.15" } }, "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ=="], - "@eslint/object-schema": ["@eslint/object-schema@3.0.5", "", {}, "sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw=="], + "@eslint/eslintrc": ["@eslint/eslintrc@3.3.5", "", { "dependencies": { "ajv": "^6.14.0", "debug": "^4.3.2", "espree": "^10.0.1", "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.1", "minimatch": "^3.1.5", "strip-json-comments": "^3.1.1" } }, "sha512-4IlJx0X0qftVsN5E+/vGujTRIFtwuLbNsVUe7TO6zYPDR1O6nFwvwhIKEKSrl6dZchmYBITazxKoUYOjdtjlRg=="], - "@eslint/plugin-kit": ["@eslint/plugin-kit@0.7.2", "", { "dependencies": { "@eslint/core": "^1.2.1", "levn": "^0.4.1" } }, "sha512-+CNAzxglkrpNf/kKywqQfk74QjtceuOE7Qm+AF8miRvPF/wmmK5+OJOgVh3AVTT3RP2mH3+FOaxlE5v72owk0A=="], + "@eslint/js": ["@eslint/js@9.39.4", "", {}, "sha512-nE7DEIchvtiFTwBw4Lfbu59PG+kCofhjsKaCWzxTpt4lfRjRMqG6uMBzKXuEcyXhOHoUp9riAm7/aWYGhXZ9cw=="], + + "@eslint/object-schema": ["@eslint/object-schema@2.1.7", "", {}, "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA=="], + + "@eslint/plugin-kit": ["@eslint/plugin-kit@0.4.1", "", { "dependencies": { "@eslint/core": "^0.17.0", "levn": "^0.4.1" } }, "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA=="], "@gravity-ai/api": ["@gravity-ai/api@0.1.2", "", { "dependencies": { "axios": "^1.13.2" } }, "sha512-txsAhyzvwB/TNrj5R8DoNqw8afM3JY2ahl7aaeaD5ZsxP+7rxff7C7keGI7+gU2KT3d2Mcw4QB1nHhbTSCJYHw=="], @@ -464,8 +468,6 @@ "@types/diff": ["@types/diff@8.0.0", "", { "dependencies": { "diff": "*" } }, "sha512-o7jqJM04gfaYrdCecCVMbZhNdG6T1MHg/oQoRFdERLV+4d+V7FijhiEAbFu0Usww84Yijk9yH58U4Jk4HbtzZw=="], - "@types/esrecurse": ["@types/esrecurse@4.3.1", "", {}, "sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw=="], - "@types/estree": ["@types/estree@1.0.9", "", {}, "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg=="], "@types/js-yaml": ["@types/js-yaml@4.0.9", "", {}, "sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg=="], @@ -548,7 +550,7 @@ "ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="], - "ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], + "ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], "any-base": ["any-base@1.1.0", "", {}, "sha512-uMgjozySS8adZZYePpaWs8cxB9/kdzmpX6SgJZ+wbz1K5eYk5QMYDVJaZKhxyIHUdnnJkfR7SVgStgH7LkGUyg=="], @@ -624,6 +626,8 @@ "call-bound": ["call-bound@1.0.4", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "get-intrinsic": "^1.3.0" } }, "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg=="], + "callsites": ["callsites@3.1.0", "", {}, "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="], + "caniuse-lite": ["caniuse-lite@1.0.30001797", "", {}, "sha512-l8xKG+gwAIExZGl9FrF7KUwuOmk6wbEPC9Xoy/RtnWv1XG0Q4LFlagaLpUv3Kiza3W/wm27zy0yWJEieYKAP6w=="], "canvas": ["canvas@3.2.3", "", { "dependencies": { "node-addon-api": "^7.0.0", "prebuild-install": "^7.1.3" } }, "sha512-PzE5nJZPz72YUAfo8oTp0u3fqqY7IzlTubneAihqDYAUcBk7ryeCmBbdJBEdaH0bptSOe2VT2Zwcb3UaFyaSWw=="], @@ -748,7 +752,7 @@ "escape-string-regexp": ["escape-string-regexp@4.0.0", "", {}, "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="], - "eslint": ["eslint@10.4.1", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.2", "@eslint/config-array": "^0.23.5", "@eslint/config-helpers": "^0.6.0", "@eslint/core": "^1.2.1", "@eslint/plugin-kit": "^0.7.2", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "ajv": "^6.14.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^9.1.2", "eslint-visitor-keys": "^5.0.1", "espree": "^11.2.0", "esquery": "^1.7.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "minimatch": "^10.2.4", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, "peerDependencies": { "jiti": "*" }, "optionalPeers": ["jiti"], "bin": { "eslint": "bin/eslint.js" } }, "sha512-AyIKhnOBuOAdueD7RB3xB+YeAWScb9jHsJBgH2Hcde8InP5JYhqrRR6iTMHyTEwgENK54Cp44e4v8BwNhsuHuw=="], + "eslint": ["eslint@9.39.4", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", "@eslint/config-array": "^0.21.2", "@eslint/config-helpers": "^0.4.2", "@eslint/core": "^0.17.0", "@eslint/eslintrc": "^3.3.5", "@eslint/js": "9.39.4", "@eslint/plugin-kit": "^0.4.1", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "ajv": "^6.14.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^8.4.0", "eslint-visitor-keys": "^4.2.1", "espree": "^10.4.0", "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.5", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, "peerDependencies": { "jiti": "*" }, "optionalPeers": ["jiti"], "bin": { "eslint": "bin/eslint.js" } }, "sha512-XoMjdBOwe/esVgEvLmNsD3IRHkm7fbKIUGvrleloJXUZgDHig2IPWNniv+GwjyJXzuNqVjlr5+4yVUZjycJwfQ=="], "eslint-config-prettier": ["eslint-config-prettier@9.1.2", "", { "peerDependencies": { "eslint": ">=7.0.0" }, "bin": { "eslint-config-prettier": "bin/cli.js" } }, "sha512-iI1f+D2ViGn+uvv5HuHVUamg8ll4tN+JRHGc6IJi4TP9Kl976C57fzPXgseXNs8v0iA8aSJpHsTWjDb9QJamGQ=="], @@ -760,11 +764,11 @@ "eslint-plugin-unused-imports": ["eslint-plugin-unused-imports@4.4.1", "", { "peerDependencies": { "@typescript-eslint/eslint-plugin": "^8.0.0-0 || ^7.0.0 || ^6.0.0 || ^5.0.0", "eslint": "^10.0.0 || ^9.0.0 || ^8.0.0" }, "optionalPeers": ["@typescript-eslint/eslint-plugin"] }, "sha512-oZGYUz1X3sRMGUB+0cZyK2VcvRX5lm/vB56PgNNcU+7ficUCKm66oZWKUubXWnOuPjQ8PvmXtCViXBMONPe7tQ=="], - "eslint-scope": ["eslint-scope@9.1.2", "", { "dependencies": { "@types/esrecurse": "^4.3.1", "@types/estree": "^1.0.8", "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ=="], + "eslint-scope": ["eslint-scope@8.4.0", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg=="], "eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="], - "espree": ["espree@11.2.0", "", { "dependencies": { "acorn": "^8.16.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^5.0.1" } }, "sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw=="], + "espree": ["espree@10.4.0", "", { "dependencies": { "acorn": "^8.15.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^4.2.1" } }, "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ=="], "esprima": ["esprima@4.0.1", "", { "bin": { "esparse": "./bin/esparse.js", "esvalidate": "./bin/esvalidate.js" } }, "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="], @@ -876,6 +880,8 @@ "glob-parent": ["glob-parent@6.0.2", "", { "dependencies": { "is-glob": "^4.0.3" } }, "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A=="], + "globals": ["globals@14.0.0", "", {}, "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ=="], + "globalthis": ["globalthis@1.0.4", "", { "dependencies": { "define-properties": "^1.2.1", "gopd": "^1.0.1" } }, "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ=="], "globby": ["globby@11.1.0", "", { "dependencies": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", "fast-glob": "^3.2.9", "ignore": "^5.2.0", "merge2": "^1.4.1", "slash": "^3.0.0" } }, "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g=="], @@ -890,6 +896,8 @@ "has-bigints": ["has-bigints@1.1.0", "", {}, "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg=="], + "has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], + "has-property-descriptors": ["has-property-descriptors@1.0.2", "", { "dependencies": { "es-define-property": "^1.0.0" } }, "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg=="], "has-proto": ["has-proto@1.2.0", "", { "dependencies": { "dunder-proto": "^1.0.0" } }, "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ=="], @@ -920,6 +928,8 @@ "immer": ["immer@10.2.0", "", {}, "sha512-d/+XTN3zfODyjr89gM3mPq1WNX2B8pYsu7eORitdwyA2sBubnTl3laYlBk4sXY5FUa5qTZGBDPJICVbvqzjlbw=="], + "import-fresh": ["import-fresh@3.3.1", "", { "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" } }, "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ=="], + "imurmurhash": ["imurmurhash@0.1.4", "", {}, "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA=="], "inherits": ["inherits@2.0.4", "", {}, "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="], @@ -1036,6 +1046,8 @@ "lodash": ["lodash@4.17.23", "", {}, "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w=="], + "lodash.merge": ["lodash.merge@4.6.2", "", {}, "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ=="], + "log-update": ["log-update@8.0.0", "", { "dependencies": { "ansi-escapes": "^7.3.0", "cli-cursor": "^5.0.0", "slice-ansi": "^9.0.0", "string-width": "^8.2.0", "strip-ansi": "^7.2.0", "wrap-ansi": "^10.0.0" } }, "sha512-lddSgOt3bPASrylL54ZSpy8nBHns+vBVSoILlVOx+dei300pnLRN958rj/EdlVLKuWlSESU3qdnDZdAI7FXYGg=="], "longest-streak": ["longest-streak@3.1.0", "", {}, "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g=="], @@ -1238,6 +1250,8 @@ "pako": ["pako@1.0.11", "", {}, "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw=="], + "parent-module": ["parent-module@1.0.1", "", { "dependencies": { "callsites": "^3.0.0" } }, "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g=="], + "parse-bmfont-ascii": ["parse-bmfont-ascii@1.0.6", "", {}, "sha512-U4RrVsUFCleIOBsIGYOMKjn9PavsGOXxbvYGtMOEfnId0SVNsgehXh1DxUdVPLoxd5mvcEtvmKs2Mmf0Mpa1ZA=="], "parse-bmfont-binary": ["parse-bmfont-binary@1.0.6", "", {}, "sha512-GxmsRea0wdGdYthjuUeWTMWPqm2+FAd4GI8vCvhgJsFnoGhTrLhXDDupwTo7rXVAgaLIGoVHDZS9p/5XbSqeWA=="], @@ -1382,6 +1396,8 @@ "resolve": ["resolve@2.0.0-next.7", "", { "dependencies": { "es-errors": "^1.3.0", "is-core-module": "^2.16.2", "node-exports-info": "^1.6.0", "object-keys": "^1.1.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-tqt+NBWwyaMgw3zDsnygx4CByWjQEJHOPMdslYhppaQSJUtL/D4JO9CcBBlhPoI8lz9oJIDXkwXfhF4aWqP8xQ=="], + "resolve-from": ["resolve-from@4.0.0", "", {}, "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="], + "resolve-pkg-maps": ["resolve-pkg-maps@1.0.0", "", {}, "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw=="], "restore-cursor": ["restore-cursor@5.1.0", "", { "dependencies": { "onetime": "^7.0.0", "signal-exit": "^4.1.0" } }, "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA=="], @@ -1486,7 +1502,7 @@ "strip-final-newline": ["strip-final-newline@2.0.0", "", {}, "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA=="], - "strip-json-comments": ["strip-json-comments@2.0.1", "", {}, "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ=="], + "strip-json-comments": ["strip-json-comments@3.1.1", "", {}, "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig=="], "stripe": ["stripe@16.12.0", "", { "dependencies": { "@types/node": ">=8.1.0", "qs": "^6.11.0" } }, "sha512-H7eFVLDxeTNNSn4JTRfL2//LzCbDrMSZ+2q1c7CanVWgK2qIW5TwS+0V7N9KcKZZNpYh/uCqK0PyZh/2UsaAtQ=="], @@ -1494,6 +1510,8 @@ "styled-jsx": ["styled-jsx@5.1.6", "", { "dependencies": { "client-only": "0.0.1" }, "peerDependencies": { "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0" } }, "sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA=="], + "supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], + "supports-preserve-symlinks-flag": ["supports-preserve-symlinks-flag@1.0.0", "", {}, "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w=="], "supports-terminal-graphics": ["supports-terminal-graphics@0.1.0", "", {}, "sha512-+KdfozhS0Fw8y5Sghw8kkZNGT8nWYzJ1EzcoIvVjxhl+26TJTs26y02yfBgvc1jh5AS/c8jcI3xtahhR95KRyQ=="], @@ -1652,7 +1670,11 @@ "@codebuff/sdk/ignore": ["ignore@7.0.5", "", {}, "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg=="], - "@eslint/config-array/minimatch": ["minimatch@10.2.5", "", { "dependencies": { "brace-expansion": "^5.0.5" } }, "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg=="], + "@eslint/eslintrc/ajv": ["ajv@6.15.0", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw=="], + + "@eslint/eslintrc/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], + + "@eslint/eslintrc/js-yaml": ["js-yaml@4.2.0", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-ePWsvanv0DWuDRsW8dnt+R4jQ31SCRCQ7hhNcPXZPsoBZiemuZNYGf7adZdqX2D86j6rvKp3RpCxVTSb8WQlOw=="], "@opentui/core/diff": ["diff@9.0.0", "", {}, "sha512-svtcdpS8CgJyqAjEQIXdb3OjhFVVYjzGAPO8WGCmRbrml64SPw/jJD4GoE98aR7r25A0XcgrK3F02yw9R/vhQw=="], @@ -1688,11 +1710,11 @@ "eslint/ajv": ["ajv@6.15.0", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw=="], - "eslint/eslint-visitor-keys": ["eslint-visitor-keys@5.0.1", "", {}, "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA=="], + "eslint/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], - "eslint/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], + "eslint/eslint-visitor-keys": ["eslint-visitor-keys@4.2.1", "", {}, "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ=="], - "eslint/minimatch": ["minimatch@10.2.5", "", { "dependencies": { "brace-expansion": "^5.0.5" } }, "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg=="], + "eslint/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], "eslint-import-resolver-node/debug": ["debug@3.2.7", "", { "dependencies": { "ms": "^2.1.1" } }, "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ=="], @@ -1704,7 +1726,7 @@ "eslint-plugin-import/tsconfig-paths": ["tsconfig-paths@3.15.0", "", { "dependencies": { "@types/json5": "^0.0.29", "json5": "^1.0.2", "minimist": "^1.2.6", "strip-bom": "^3.0.0" } }, "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg=="], - "espree/eslint-visitor-keys": ["eslint-visitor-keys@5.0.1", "", {}, "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA=="], + "espree/eslint-visitor-keys": ["eslint-visitor-keys@4.2.1", "", {}, "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ=="], "execa/onetime": ["onetime@5.1.2", "", { "dependencies": { "mimic-fn": "^2.1.0" } }, "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg=="], @@ -1732,12 +1754,16 @@ "plist/xmlbuilder": ["xmlbuilder@15.1.1", "", {}, "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg=="], + "rc/strip-json-comments": ["strip-json-comments@2.0.1", "", {}, "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ=="], + "react-devtools-core/ws": ["ws@7.5.11", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": "^5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-zS54Oen9bITtp7kp2XM3AydrCIq1D+HwJOuH+c+e4LfpL/lotP5osijd+UoMnxwAam1GN8R4KtLAyIrIcBNpiA=="], "react-reconciler/scheduler": ["scheduler@0.26.0", "", {}, "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA=="], "send/mime-types": ["mime-types@3.0.2", "", { "dependencies": { "mime-db": "^1.54.0" } }, "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A=="], + "slice-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], + "tar-stream/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=="], "ts-node/diff": ["diff@4.0.4", "", {}, "sha512-X07nttJQkwkfKfvTPG/KSnE2OMdcUCao6+eXF3wmnIQRn2aPAHH3VxDbDOdegkd6JbPsXqShpvEOHfAT+nCNwQ=="], @@ -1752,6 +1778,8 @@ "typescript-eslint/@typescript-eslint/utils": ["@typescript-eslint/utils@7.18.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@typescript-eslint/scope-manager": "7.18.0", "@typescript-eslint/types": "7.18.0", "@typescript-eslint/typescript-estree": "7.18.0" }, "peerDependencies": { "eslint": "^8.56.0" } }, "sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw=="], + "wrap-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], + "wrap-ansi/string-width": ["string-width@8.2.1", "", { "dependencies": { "get-east-asian-width": "^1.5.0", "strip-ansi": "^7.1.2" } }, "sha512-IIaP0g3iy9Cyy18w3M9YcaDudujEAVHKt3a3QJg1+sr/oX96TbaGUubG0hJyCjCBThFH+tFpcIyoUHUn1ogaLA=="], "yargs/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], @@ -1760,7 +1788,9 @@ "@codebuff/evals/pino/process-warning": ["process-warning@5.0.0", "", {}, "sha512-a39t9ApHNx2L4+HBnQKqxxHNs1r7KF+Intd8Q/g1bUh6q0WIp9voPXJ/x0j+ZL45KF1pJd9+q2jLIRMfvEshkA=="], - "@eslint/config-array/minimatch/brace-expansion": ["brace-expansion@5.0.6", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g=="], + "@eslint/eslintrc/ajv/json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], + + "@eslint/eslintrc/js-yaml/argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="], "@typescript-eslint/parser/@typescript-eslint/typescript-estree/minimatch": ["minimatch@9.0.9", "", { "dependencies": { "brace-expansion": "^2.0.2" } }, "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg=="], @@ -1774,14 +1804,10 @@ "cliui/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], - "cliui/wrap-ansi/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], - "eslint-plugin-import/tsconfig-paths/json5": ["json5@1.0.2", "", { "dependencies": { "minimist": "^1.2.0" }, "bin": { "json5": "lib/cli.js" } }, "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA=="], "eslint/ajv/json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], - "eslint/minimatch/brace-expansion": ["brace-expansion@5.0.6", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g=="], - "express/mime-types/mime-db": ["mime-db@1.54.0", "", {}, "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ=="], "p-locate/p-limit/yocto-queue": ["yocto-queue@0.1.0", "", {}, "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="], @@ -1810,12 +1836,8 @@ "yargs/string-width/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], - "@eslint/config-array/minimatch/brace-expansion/balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="], - "@typescript-eslint/parser/@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.1.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-WR1cURNjuvBLMZBMbqM0UoE+WAfdUcEV1ccD8PVBVOI+Z3ND4+SZbN8RsfT2bMuG1qwz5RFvPukSZm5fF2D5eA=="], - "eslint/minimatch/brace-expansion/balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="], - "typescript-eslint/@typescript-eslint/eslint-plugin/@typescript-eslint/scope-manager/@typescript-eslint/types": ["@typescript-eslint/types@7.18.0", "", {}, "sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ=="], "typescript-eslint/@typescript-eslint/eslint-plugin/@typescript-eslint/type-utils/@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@7.18.0", "", { "dependencies": { "@typescript-eslint/types": "7.18.0", "@typescript-eslint/visitor-keys": "7.18.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", "minimatch": "^9.0.4", "semver": "^7.6.0", "ts-api-utils": "^1.3.0" } }, "sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA=="], From f1534a6a6c6997e534a73ebc244d5f3e5e9591a1 Mon Sep 17 00:00:00 2001 From: codebuff public sync bot <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 11 Jun 2026 09:44:34 +0000 Subject: [PATCH 69/96] Sync public snapshot from freebuff-private Source: CodebuffAI/freebuff-private@4503ca11051cfea8255e26f3e4ae84f52288c6cb --- bun.lock | 80 ++++++++++++++++++++------------------------------------ 1 file changed, 29 insertions(+), 51 deletions(-) diff --git a/bun.lock b/bun.lock index dc742a9852..4a79944a4f 100644 --- a/bun.lock +++ b/bun.lock @@ -240,19 +240,15 @@ "@eslint-community/regexpp": ["@eslint-community/regexpp@4.12.2", "", {}, "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew=="], - "@eslint/config-array": ["@eslint/config-array@0.21.2", "", { "dependencies": { "@eslint/object-schema": "^2.1.7", "debug": "^4.3.1", "minimatch": "^3.1.5" } }, "sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw=="], + "@eslint/config-array": ["@eslint/config-array@0.23.5", "", { "dependencies": { "@eslint/object-schema": "^3.0.5", "debug": "^4.3.1", "minimatch": "^10.2.4" } }, "sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA=="], - "@eslint/config-helpers": ["@eslint/config-helpers@0.4.2", "", { "dependencies": { "@eslint/core": "^0.17.0" } }, "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw=="], + "@eslint/config-helpers": ["@eslint/config-helpers@0.6.0", "", { "dependencies": { "@eslint/core": "^1.2.1" } }, "sha512-ii6Bw9jJ2zi2cWA2Z+9/QZ/+3DX6kwaV5Q986D/CdP3Lap3w/pgQZ373FV7byY/i7L4IRH/G43I5dz1ClsCbpA=="], - "@eslint/core": ["@eslint/core@0.17.0", "", { "dependencies": { "@types/json-schema": "^7.0.15" } }, "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ=="], + "@eslint/core": ["@eslint/core@1.2.1", "", { "dependencies": { "@types/json-schema": "^7.0.15" } }, "sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ=="], - "@eslint/eslintrc": ["@eslint/eslintrc@3.3.5", "", { "dependencies": { "ajv": "^6.14.0", "debug": "^4.3.2", "espree": "^10.0.1", "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.1", "minimatch": "^3.1.5", "strip-json-comments": "^3.1.1" } }, "sha512-4IlJx0X0qftVsN5E+/vGujTRIFtwuLbNsVUe7TO6zYPDR1O6nFwvwhIKEKSrl6dZchmYBITazxKoUYOjdtjlRg=="], + "@eslint/object-schema": ["@eslint/object-schema@3.0.5", "", {}, "sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw=="], - "@eslint/js": ["@eslint/js@9.39.4", "", {}, "sha512-nE7DEIchvtiFTwBw4Lfbu59PG+kCofhjsKaCWzxTpt4lfRjRMqG6uMBzKXuEcyXhOHoUp9riAm7/aWYGhXZ9cw=="], - - "@eslint/object-schema": ["@eslint/object-schema@2.1.7", "", {}, "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA=="], - - "@eslint/plugin-kit": ["@eslint/plugin-kit@0.4.1", "", { "dependencies": { "@eslint/core": "^0.17.0", "levn": "^0.4.1" } }, "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA=="], + "@eslint/plugin-kit": ["@eslint/plugin-kit@0.7.2", "", { "dependencies": { "@eslint/core": "^1.2.1", "levn": "^0.4.1" } }, "sha512-+CNAzxglkrpNf/kKywqQfk74QjtceuOE7Qm+AF8miRvPF/wmmK5+OJOgVh3AVTT3RP2mH3+FOaxlE5v72owk0A=="], "@gravity-ai/api": ["@gravity-ai/api@0.1.2", "", { "dependencies": { "axios": "^1.13.2" } }, "sha512-txsAhyzvwB/TNrj5R8DoNqw8afM3JY2ahl7aaeaD5ZsxP+7rxff7C7keGI7+gU2KT3d2Mcw4QB1nHhbTSCJYHw=="], @@ -432,9 +428,9 @@ "@pinojs/redact": ["@pinojs/redact@0.4.0", "", {}, "sha512-k2ENnmBugE/rzQfEcdWHcCY+/FM3VLzH9cYEsbdsoqrvzAKRhUZeRNhAZvB8OitQJ1TBed3yqWtdjzS6wJKBwg=="], - "@posthog/core": ["@posthog/core@1.32.2", "", { "dependencies": { "@posthog/types": "1.386.2" } }, "sha512-TfJ7fbPCKOkJX4E/KAnTBKoyHHxz9j9soOxlKvcTEQwO9Dq6BNHacuV/QerneyOaud29vSXj+4VDyAddXqZuPg=="], + "@posthog/core": ["@posthog/core@1.32.3", "", { "dependencies": { "@posthog/types": "1.386.3" } }, "sha512-vwOEMfZvGv5XxNWV7p9I52NSmvFNMhyW2IHpIoUHW5jLkgUrknzJW1H/qxVGSIrNNVQkfsoaDFzDhJdg10pgrA=="], - "@posthog/types": ["@posthog/types@1.386.2", "", {}, "sha512-IhWyxrCs0MEHarNlWB/Y4GPMDpEsSFAbE8j9tYSbmkxpYQTnLkYHaO1HmVqGJDw0QeiSl5CjY+GHX7x/uWSvaw=="], + "@posthog/types": ["@posthog/types@1.386.3", "", {}, "sha512-LqJoiQi2eyWn7rCUgnn+D+F3Efp6+04o72bjSX6kWHx0nFaYNC/nJuAIRliDTY/X7GPIUAaHAcSjbMI/9wfX1Q=="], "@rtsao/scc": ["@rtsao/scc@1.1.0", "", {}, "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g=="], @@ -468,6 +464,8 @@ "@types/diff": ["@types/diff@8.0.0", "", { "dependencies": { "diff": "*" } }, "sha512-o7jqJM04gfaYrdCecCVMbZhNdG6T1MHg/oQoRFdERLV+4d+V7FijhiEAbFu0Usww84Yijk9yH58U4Jk4HbtzZw=="], + "@types/esrecurse": ["@types/esrecurse@4.3.1", "", {}, "sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw=="], + "@types/estree": ["@types/estree@1.0.9", "", {}, "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg=="], "@types/js-yaml": ["@types/js-yaml@4.0.9", "", {}, "sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg=="], @@ -550,7 +548,7 @@ "ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="], - "ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + "ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], "any-base": ["any-base@1.1.0", "", {}, "sha512-uMgjozySS8adZZYePpaWs8cxB9/kdzmpX6SgJZ+wbz1K5eYk5QMYDVJaZKhxyIHUdnnJkfR7SVgStgH7LkGUyg=="], @@ -626,8 +624,6 @@ "call-bound": ["call-bound@1.0.4", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "get-intrinsic": "^1.3.0" } }, "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg=="], - "callsites": ["callsites@3.1.0", "", {}, "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="], - "caniuse-lite": ["caniuse-lite@1.0.30001797", "", {}, "sha512-l8xKG+gwAIExZGl9FrF7KUwuOmk6wbEPC9Xoy/RtnWv1XG0Q4LFlagaLpUv3Kiza3W/wm27zy0yWJEieYKAP6w=="], "canvas": ["canvas@3.2.3", "", { "dependencies": { "node-addon-api": "^7.0.0", "prebuild-install": "^7.1.3" } }, "sha512-PzE5nJZPz72YUAfo8oTp0u3fqqY7IzlTubneAihqDYAUcBk7ryeCmBbdJBEdaH0bptSOe2VT2Zwcb3UaFyaSWw=="], @@ -752,7 +748,7 @@ "escape-string-regexp": ["escape-string-regexp@4.0.0", "", {}, "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="], - "eslint": ["eslint@9.39.4", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", "@eslint/config-array": "^0.21.2", "@eslint/config-helpers": "^0.4.2", "@eslint/core": "^0.17.0", "@eslint/eslintrc": "^3.3.5", "@eslint/js": "9.39.4", "@eslint/plugin-kit": "^0.4.1", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "ajv": "^6.14.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^8.4.0", "eslint-visitor-keys": "^4.2.1", "espree": "^10.4.0", "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.5", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, "peerDependencies": { "jiti": "*" }, "optionalPeers": ["jiti"], "bin": { "eslint": "bin/eslint.js" } }, "sha512-XoMjdBOwe/esVgEvLmNsD3IRHkm7fbKIUGvrleloJXUZgDHig2IPWNniv+GwjyJXzuNqVjlr5+4yVUZjycJwfQ=="], + "eslint": ["eslint@10.4.1", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.2", "@eslint/config-array": "^0.23.5", "@eslint/config-helpers": "^0.6.0", "@eslint/core": "^1.2.1", "@eslint/plugin-kit": "^0.7.2", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "ajv": "^6.14.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^9.1.2", "eslint-visitor-keys": "^5.0.1", "espree": "^11.2.0", "esquery": "^1.7.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "minimatch": "^10.2.4", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, "peerDependencies": { "jiti": "*" }, "optionalPeers": ["jiti"], "bin": { "eslint": "bin/eslint.js" } }, "sha512-AyIKhnOBuOAdueD7RB3xB+YeAWScb9jHsJBgH2Hcde8InP5JYhqrRR6iTMHyTEwgENK54Cp44e4v8BwNhsuHuw=="], "eslint-config-prettier": ["eslint-config-prettier@9.1.2", "", { "peerDependencies": { "eslint": ">=7.0.0" }, "bin": { "eslint-config-prettier": "bin/cli.js" } }, "sha512-iI1f+D2ViGn+uvv5HuHVUamg8ll4tN+JRHGc6IJi4TP9Kl976C57fzPXgseXNs8v0iA8aSJpHsTWjDb9QJamGQ=="], @@ -764,11 +760,11 @@ "eslint-plugin-unused-imports": ["eslint-plugin-unused-imports@4.4.1", "", { "peerDependencies": { "@typescript-eslint/eslint-plugin": "^8.0.0-0 || ^7.0.0 || ^6.0.0 || ^5.0.0", "eslint": "^10.0.0 || ^9.0.0 || ^8.0.0" }, "optionalPeers": ["@typescript-eslint/eslint-plugin"] }, "sha512-oZGYUz1X3sRMGUB+0cZyK2VcvRX5lm/vB56PgNNcU+7ficUCKm66oZWKUubXWnOuPjQ8PvmXtCViXBMONPe7tQ=="], - "eslint-scope": ["eslint-scope@8.4.0", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg=="], + "eslint-scope": ["eslint-scope@9.1.2", "", { "dependencies": { "@types/esrecurse": "^4.3.1", "@types/estree": "^1.0.8", "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ=="], "eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="], - "espree": ["espree@10.4.0", "", { "dependencies": { "acorn": "^8.15.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^4.2.1" } }, "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ=="], + "espree": ["espree@11.2.0", "", { "dependencies": { "acorn": "^8.16.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^5.0.1" } }, "sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw=="], "esprima": ["esprima@4.0.1", "", { "bin": { "esparse": "./bin/esparse.js", "esvalidate": "./bin/esvalidate.js" } }, "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="], @@ -880,8 +876,6 @@ "glob-parent": ["glob-parent@6.0.2", "", { "dependencies": { "is-glob": "^4.0.3" } }, "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A=="], - "globals": ["globals@14.0.0", "", {}, "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ=="], - "globalthis": ["globalthis@1.0.4", "", { "dependencies": { "define-properties": "^1.2.1", "gopd": "^1.0.1" } }, "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ=="], "globby": ["globby@11.1.0", "", { "dependencies": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", "fast-glob": "^3.2.9", "ignore": "^5.2.0", "merge2": "^1.4.1", "slash": "^3.0.0" } }, "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g=="], @@ -896,8 +890,6 @@ "has-bigints": ["has-bigints@1.1.0", "", {}, "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg=="], - "has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], - "has-property-descriptors": ["has-property-descriptors@1.0.2", "", { "dependencies": { "es-define-property": "^1.0.0" } }, "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg=="], "has-proto": ["has-proto@1.2.0", "", { "dependencies": { "dunder-proto": "^1.0.0" } }, "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ=="], @@ -928,8 +920,6 @@ "immer": ["immer@10.2.0", "", {}, "sha512-d/+XTN3zfODyjr89gM3mPq1WNX2B8pYsu7eORitdwyA2sBubnTl3laYlBk4sXY5FUa5qTZGBDPJICVbvqzjlbw=="], - "import-fresh": ["import-fresh@3.3.1", "", { "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" } }, "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ=="], - "imurmurhash": ["imurmurhash@0.1.4", "", {}, "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA=="], "inherits": ["inherits@2.0.4", "", {}, "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="], @@ -1046,8 +1036,6 @@ "lodash": ["lodash@4.17.23", "", {}, "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w=="], - "lodash.merge": ["lodash.merge@4.6.2", "", {}, "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ=="], - "log-update": ["log-update@8.0.0", "", { "dependencies": { "ansi-escapes": "^7.3.0", "cli-cursor": "^5.0.0", "slice-ansi": "^9.0.0", "string-width": "^8.2.0", "strip-ansi": "^7.2.0", "wrap-ansi": "^10.0.0" } }, "sha512-lddSgOt3bPASrylL54ZSpy8nBHns+vBVSoILlVOx+dei300pnLRN958rj/EdlVLKuWlSESU3qdnDZdAI7FXYGg=="], "longest-streak": ["longest-streak@3.1.0", "", {}, "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g=="], @@ -1250,8 +1238,6 @@ "pako": ["pako@1.0.11", "", {}, "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw=="], - "parent-module": ["parent-module@1.0.1", "", { "dependencies": { "callsites": "^3.0.0" } }, "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g=="], - "parse-bmfont-ascii": ["parse-bmfont-ascii@1.0.6", "", {}, "sha512-U4RrVsUFCleIOBsIGYOMKjn9PavsGOXxbvYGtMOEfnId0SVNsgehXh1DxUdVPLoxd5mvcEtvmKs2Mmf0Mpa1ZA=="], "parse-bmfont-binary": ["parse-bmfont-binary@1.0.6", "", {}, "sha512-GxmsRea0wdGdYthjuUeWTMWPqm2+FAd4GI8vCvhgJsFnoGhTrLhXDDupwTo7rXVAgaLIGoVHDZS9p/5XbSqeWA=="], @@ -1322,7 +1308,7 @@ "postgres-interval": ["postgres-interval@1.2.0", "", { "dependencies": { "xtend": "^4.0.0" } }, "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ=="], - "posthog-node": ["posthog-node@5.36.16", "", { "dependencies": { "@posthog/core": "1.32.2" }, "peerDependencies": { "rxjs": "^7.0.0" }, "optionalPeers": ["rxjs"] }, "sha512-Pvy09Rb4ghP6TweplI5Vg3aqApbAs9QgPumv/QN980CTsM0bcAYQn80hsMq8RTDrzpqUaHt+MVWnIUTNN9gntg=="], + "posthog-node": ["posthog-node@5.36.17", "", { "dependencies": { "@posthog/core": "1.32.3" }, "peerDependencies": { "rxjs": "^7.0.0" }, "optionalPeers": ["rxjs"] }, "sha512-ed1LT4a9hhiFJizB6XX7dkYYLVPAFHfUpkQSns7BRxoUyhFnvMq15QENKeAOUEKQgPmnaq2I+xNLdAHN0o9eAA=="], "preact": ["preact@10.29.2", "", {}, "sha512-7tNmwg/7mzzAoB/8kSg6Hl37JraAZw3Z3A0JSY7VXlZwo82Xn0G7wKbNNs2qoF4ZEEsQGTwDAroNdqKs1ofJxQ=="], @@ -1396,8 +1382,6 @@ "resolve": ["resolve@2.0.0-next.7", "", { "dependencies": { "es-errors": "^1.3.0", "is-core-module": "^2.16.2", "node-exports-info": "^1.6.0", "object-keys": "^1.1.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-tqt+NBWwyaMgw3zDsnygx4CByWjQEJHOPMdslYhppaQSJUtL/D4JO9CcBBlhPoI8lz9oJIDXkwXfhF4aWqP8xQ=="], - "resolve-from": ["resolve-from@4.0.0", "", {}, "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="], - "resolve-pkg-maps": ["resolve-pkg-maps@1.0.0", "", {}, "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw=="], "restore-cursor": ["restore-cursor@5.1.0", "", { "dependencies": { "onetime": "^7.0.0", "signal-exit": "^4.1.0" } }, "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA=="], @@ -1502,7 +1486,7 @@ "strip-final-newline": ["strip-final-newline@2.0.0", "", {}, "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA=="], - "strip-json-comments": ["strip-json-comments@3.1.1", "", {}, "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig=="], + "strip-json-comments": ["strip-json-comments@2.0.1", "", {}, "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ=="], "stripe": ["stripe@16.12.0", "", { "dependencies": { "@types/node": ">=8.1.0", "qs": "^6.11.0" } }, "sha512-H7eFVLDxeTNNSn4JTRfL2//LzCbDrMSZ+2q1c7CanVWgK2qIW5TwS+0V7N9KcKZZNpYh/uCqK0PyZh/2UsaAtQ=="], @@ -1510,8 +1494,6 @@ "styled-jsx": ["styled-jsx@5.1.6", "", { "dependencies": { "client-only": "0.0.1" }, "peerDependencies": { "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0" } }, "sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA=="], - "supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], - "supports-preserve-symlinks-flag": ["supports-preserve-symlinks-flag@1.0.0", "", {}, "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w=="], "supports-terminal-graphics": ["supports-terminal-graphics@0.1.0", "", {}, "sha512-+KdfozhS0Fw8y5Sghw8kkZNGT8nWYzJ1EzcoIvVjxhl+26TJTs26y02yfBgvc1jh5AS/c8jcI3xtahhR95KRyQ=="], @@ -1670,11 +1652,7 @@ "@codebuff/sdk/ignore": ["ignore@7.0.5", "", {}, "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg=="], - "@eslint/eslintrc/ajv": ["ajv@6.15.0", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw=="], - - "@eslint/eslintrc/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], - - "@eslint/eslintrc/js-yaml": ["js-yaml@4.2.0", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-ePWsvanv0DWuDRsW8dnt+R4jQ31SCRCQ7hhNcPXZPsoBZiemuZNYGf7adZdqX2D86j6rvKp3RpCxVTSb8WQlOw=="], + "@eslint/config-array/minimatch": ["minimatch@10.2.5", "", { "dependencies": { "brace-expansion": "^5.0.5" } }, "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg=="], "@opentui/core/diff": ["diff@9.0.0", "", {}, "sha512-svtcdpS8CgJyqAjEQIXdb3OjhFVVYjzGAPO8WGCmRbrml64SPw/jJD4GoE98aR7r25A0XcgrK3F02yw9R/vhQw=="], @@ -1710,12 +1688,12 @@ "eslint/ajv": ["ajv@6.15.0", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw=="], - "eslint/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], - - "eslint/eslint-visitor-keys": ["eslint-visitor-keys@4.2.1", "", {}, "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ=="], + "eslint/eslint-visitor-keys": ["eslint-visitor-keys@5.0.1", "", {}, "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA=="], "eslint/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], + "eslint/minimatch": ["minimatch@10.2.5", "", { "dependencies": { "brace-expansion": "^5.0.5" } }, "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg=="], + "eslint-import-resolver-node/debug": ["debug@3.2.7", "", { "dependencies": { "ms": "^2.1.1" } }, "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ=="], "eslint-module-utils/debug": ["debug@3.2.7", "", { "dependencies": { "ms": "^2.1.1" } }, "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ=="], @@ -1726,7 +1704,7 @@ "eslint-plugin-import/tsconfig-paths": ["tsconfig-paths@3.15.0", "", { "dependencies": { "@types/json5": "^0.0.29", "json5": "^1.0.2", "minimist": "^1.2.6", "strip-bom": "^3.0.0" } }, "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg=="], - "espree/eslint-visitor-keys": ["eslint-visitor-keys@4.2.1", "", {}, "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ=="], + "espree/eslint-visitor-keys": ["eslint-visitor-keys@5.0.1", "", {}, "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA=="], "execa/onetime": ["onetime@5.1.2", "", { "dependencies": { "mimic-fn": "^2.1.0" } }, "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg=="], @@ -1754,16 +1732,12 @@ "plist/xmlbuilder": ["xmlbuilder@15.1.1", "", {}, "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg=="], - "rc/strip-json-comments": ["strip-json-comments@2.0.1", "", {}, "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ=="], - "react-devtools-core/ws": ["ws@7.5.11", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": "^5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-zS54Oen9bITtp7kp2XM3AydrCIq1D+HwJOuH+c+e4LfpL/lotP5osijd+UoMnxwAam1GN8R4KtLAyIrIcBNpiA=="], "react-reconciler/scheduler": ["scheduler@0.26.0", "", {}, "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA=="], "send/mime-types": ["mime-types@3.0.2", "", { "dependencies": { "mime-db": "^1.54.0" } }, "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A=="], - "slice-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], - "tar-stream/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=="], "ts-node/diff": ["diff@4.0.4", "", {}, "sha512-X07nttJQkwkfKfvTPG/KSnE2OMdcUCao6+eXF3wmnIQRn2aPAHH3VxDbDOdegkd6JbPsXqShpvEOHfAT+nCNwQ=="], @@ -1778,8 +1752,6 @@ "typescript-eslint/@typescript-eslint/utils": ["@typescript-eslint/utils@7.18.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@typescript-eslint/scope-manager": "7.18.0", "@typescript-eslint/types": "7.18.0", "@typescript-eslint/typescript-estree": "7.18.0" }, "peerDependencies": { "eslint": "^8.56.0" } }, "sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw=="], - "wrap-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], - "wrap-ansi/string-width": ["string-width@8.2.1", "", { "dependencies": { "get-east-asian-width": "^1.5.0", "strip-ansi": "^7.1.2" } }, "sha512-IIaP0g3iy9Cyy18w3M9YcaDudujEAVHKt3a3QJg1+sr/oX96TbaGUubG0hJyCjCBThFH+tFpcIyoUHUn1ogaLA=="], "yargs/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], @@ -1788,9 +1760,7 @@ "@codebuff/evals/pino/process-warning": ["process-warning@5.0.0", "", {}, "sha512-a39t9ApHNx2L4+HBnQKqxxHNs1r7KF+Intd8Q/g1bUh6q0WIp9voPXJ/x0j+ZL45KF1pJd9+q2jLIRMfvEshkA=="], - "@eslint/eslintrc/ajv/json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], - - "@eslint/eslintrc/js-yaml/argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="], + "@eslint/config-array/minimatch/brace-expansion": ["brace-expansion@5.0.6", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g=="], "@typescript-eslint/parser/@typescript-eslint/typescript-estree/minimatch": ["minimatch@9.0.9", "", { "dependencies": { "brace-expansion": "^2.0.2" } }, "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg=="], @@ -1804,10 +1774,14 @@ "cliui/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], + "cliui/wrap-ansi/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + "eslint-plugin-import/tsconfig-paths/json5": ["json5@1.0.2", "", { "dependencies": { "minimist": "^1.2.0" }, "bin": { "json5": "lib/cli.js" } }, "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA=="], "eslint/ajv/json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], + "eslint/minimatch/brace-expansion": ["brace-expansion@5.0.6", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g=="], + "express/mime-types/mime-db": ["mime-db@1.54.0", "", {}, "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ=="], "p-locate/p-limit/yocto-queue": ["yocto-queue@0.1.0", "", {}, "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="], @@ -1836,8 +1810,12 @@ "yargs/string-width/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + "@eslint/config-array/minimatch/brace-expansion/balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="], + "@typescript-eslint/parser/@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.1.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-WR1cURNjuvBLMZBMbqM0UoE+WAfdUcEV1ccD8PVBVOI+Z3ND4+SZbN8RsfT2bMuG1qwz5RFvPukSZm5fF2D5eA=="], + "eslint/minimatch/brace-expansion/balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="], + "typescript-eslint/@typescript-eslint/eslint-plugin/@typescript-eslint/scope-manager/@typescript-eslint/types": ["@typescript-eslint/types@7.18.0", "", {}, "sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ=="], "typescript-eslint/@typescript-eslint/eslint-plugin/@typescript-eslint/type-utils/@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@7.18.0", "", { "dependencies": { "@typescript-eslint/types": "7.18.0", "@typescript-eslint/visitor-keys": "7.18.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", "minimatch": "^9.0.4", "semver": "^7.6.0", "ts-api-utils": "^1.3.0" } }, "sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA=="], From 58fb890c7c8b88ad80c8a08f60d201432f83ff8c Mon Sep 17 00:00:00 2001 From: codebuff public sync bot <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 11 Jun 2026 17:21:21 +0000 Subject: [PATCH 70/96] Sync public snapshot from freebuff-private Source: CodebuffAI/freebuff-private@d58ceef855bde12a09bdc0abd544491c29634648 --- bun.lock | 6 ++---- cli/release/index.js | 30 ++++++++++++++++++++---------- freebuff/cli/release/index.js | 30 ++++++++++++++++++++---------- 3 files changed, 42 insertions(+), 24 deletions(-) diff --git a/bun.lock b/bun.lock index 4a79944a4f..cda204cd5f 100644 --- a/bun.lock +++ b/bun.lock @@ -528,7 +528,7 @@ "accepts": ["accepts@2.0.0", "", { "dependencies": { "mime-types": "^3.0.0", "negotiator": "^1.0.0" } }, "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng=="], - "acorn": ["acorn@8.16.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw=="], + "acorn": ["acorn@8.17.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-xRQbDb9BnwDafYNn6Vwl839DYVjqXYb1XVGtWAZ1kcDc6iwAL4hg3B1dZlRiuENFeO2H53gFG3in621AdERVAg=="], "acorn-jsx": ["acorn-jsx@5.3.2", "", { "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ=="], @@ -624,7 +624,7 @@ "call-bound": ["call-bound@1.0.4", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "get-intrinsic": "^1.3.0" } }, "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg=="], - "caniuse-lite": ["caniuse-lite@1.0.30001797", "", {}, "sha512-l8xKG+gwAIExZGl9FrF7KUwuOmk6wbEPC9Xoy/RtnWv1XG0Q4LFlagaLpUv3Kiza3W/wm27zy0yWJEieYKAP6w=="], + "caniuse-lite": ["caniuse-lite@1.0.30001799", "", {}, "sha512-hG1bReV+OUU+MOqK4t/ZWI0tZOyz3rqS9XuhOUz1cIcbwBKjOyJEJuw9ER5JuNyqxNk8u/JUVbGibBOL1yrjFw=="], "canvas": ["canvas@3.2.3", "", { "dependencies": { "node-addon-api": "^7.0.0", "prebuild-install": "^7.1.3" } }, "sha512-PzE5nJZPz72YUAfo8oTp0u3fqqY7IzlTubneAihqDYAUcBk7ryeCmBbdJBEdaH0bptSOe2VT2Zwcb3UaFyaSWw=="], @@ -1658,8 +1658,6 @@ "@opentui/core/strip-ansi": ["strip-ansi@7.1.2", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA=="], - "@types/diff/diff": ["diff@9.0.0", "", {}, "sha512-svtcdpS8CgJyqAjEQIXdb3OjhFVVYjzGAPO8WGCmRbrml64SPw/jJD4GoE98aR7r25A0XcgrK3F02yw9R/vhQw=="], - "@typescript-eslint/eslint-plugin/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], "@typescript-eslint/parser/@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@7.18.0", "", { "dependencies": { "@typescript-eslint/types": "7.18.0", "@typescript-eslint/visitor-keys": "7.18.0" } }, "sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA=="], diff --git a/cli/release/index.js b/cli/release/index.js index f751a07807..13eb3d6773 100644 --- a/cli/release/index.js +++ b/cli/release/index.js @@ -718,6 +718,11 @@ function printSpawnFailure(err) { console.error('') } +function exitOnSpawnFailure(err) { + printSpawnFailure(err) + process.exit(1) +} + function spawnInstalledBinary(options = {}) { if (!fs.existsSync(CONFIG.binaryPath)) { try { @@ -729,19 +734,24 @@ function spawnInstalledBinary(options = {}) { `downloaded binary is missing at ${CONFIG.binaryPath}`, ) error.code = 'BINARY_MISSING' - printSpawnFailure(error) - process.exit(1) + exitOnSpawnFailure(error) } - const child = spawn(CONFIG.binaryPath, process.argv.slice(2), { - stdio: 'inherit', - ...options, - }) + // spawn() only emits 'error' asynchronously for a few errno values + // (EACCES, EAGAIN, EMFILE, ENFILE, ENOENT); everything else — notably + // UNKNOWN on Windows when antivirus or Smart App Control blocks the + // exe or the download is corrupt — is thrown synchronously. + let child + try { + child = spawn(CONFIG.binaryPath, process.argv.slice(2), { + stdio: 'inherit', + ...options, + }) + } catch (err) { + exitOnSpawnFailure(err) + } - child.on('error', (err) => { - printSpawnFailure(err) - process.exit(1) - }) + child.on('error', exitOnSpawnFailure) return child } diff --git a/freebuff/cli/release/index.js b/freebuff/cli/release/index.js index cd658d853b..e6a07cf488 100644 --- a/freebuff/cli/release/index.js +++ b/freebuff/cli/release/index.js @@ -705,6 +705,11 @@ function printSpawnFailure(err) { console.error('') } +function exitOnSpawnFailure(err) { + printSpawnFailure(err) + process.exit(1) +} + function spawnInstalledBinary(options = {}) { if (!fs.existsSync(CONFIG.binaryPath)) { try { @@ -716,19 +721,24 @@ function spawnInstalledBinary(options = {}) { `downloaded binary is missing at ${CONFIG.binaryPath}`, ) error.code = 'BINARY_MISSING' - printSpawnFailure(error) - process.exit(1) + exitOnSpawnFailure(error) } - const child = spawn(CONFIG.binaryPath, process.argv.slice(2), { - stdio: 'inherit', - ...options, - }) + // spawn() only emits 'error' asynchronously for a few errno values + // (EACCES, EAGAIN, EMFILE, ENFILE, ENOENT); everything else — notably + // UNKNOWN on Windows when antivirus or Smart App Control blocks the + // exe or the download is corrupt — is thrown synchronously. + let child + try { + child = spawn(CONFIG.binaryPath, process.argv.slice(2), { + stdio: 'inherit', + ...options, + }) + } catch (err) { + exitOnSpawnFailure(err) + } - child.on('error', (err) => { - printSpawnFailure(err) - process.exit(1) - }) + child.on('error', exitOnSpawnFailure) return child } From 2164eeba44ec88a3be3f6a8ab2f04f7bd4f685bb Mon Sep 17 00:00:00 2001 From: codebuff public sync bot <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 11 Jun 2026 17:56:26 +0000 Subject: [PATCH 71/96] Sync public snapshot from freebuff-private Source: CodebuffAI/freebuff-private@d0db178471059b91b999e092e9ed3b4fb780c169 --- bun.lock | 2 +- cli/release/package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/bun.lock b/bun.lock index cda204cd5f..e748e841b2 100644 --- a/bun.lock +++ b/bun.lock @@ -594,7 +594,7 @@ "base64-js": ["base64-js@1.5.1", "", {}, "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="], - "baseline-browser-mapping": ["baseline-browser-mapping@2.10.35", "", { "bin": { "baseline-browser-mapping": "dist/cli.cjs" } }, "sha512-honAfLBde0HAFLdNyBEfuuENkF6zR+ozxqxa/2zJKHBe1qzLqyTSeRKpdPEHAP03rlDGyQOPnCSxnVpVqQo9Mg=="], + "baseline-browser-mapping": ["baseline-browser-mapping@2.10.36", "", { "bin": { "baseline-browser-mapping": "dist/cli.cjs" } }, "sha512-lVq/Df7LXlO79MVaaUHztSwWiG9oXoWHlgvNS51v8Dpd4+G4/VIy6qYePTw31nAVls33nUtnfezYeLkYAak9dg=="], "binary-extensions": ["binary-extensions@2.3.0", "", {}, "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw=="], diff --git a/cli/release/package.json b/cli/release/package.json index 67cae0188e..f899e9c756 100644 --- a/cli/release/package.json +++ b/cli/release/package.json @@ -1,6 +1,6 @@ { "name": "codebuff", - "version": "1.0.680", + "version": "1.0.681", "description": "AI coding agent", "license": "MIT", "bin": { From aaabd7cf4f161e2aa0af9c4793fdfe8aeca7a48c Mon Sep 17 00:00:00 2001 From: codebuff public sync bot <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 11 Jun 2026 19:00:43 +0000 Subject: [PATCH 72/96] Sync public snapshot from freebuff-private Source: CodebuffAI/freebuff-private@eb558d5958816dd352a14fb393cb6a363b08bdd2 --- packages/agent-runtime/src/run-agent-step.ts | 10 ++++++++- .../src/run-programmatic-step.ts | 18 +++++++++++++--- sdk/src/impl/agent-runtime.ts | 21 ++++++++++++++++++- 3 files changed, 44 insertions(+), 5 deletions(-) diff --git a/packages/agent-runtime/src/run-agent-step.ts b/packages/agent-runtime/src/run-agent-step.ts index cd843751f1..ed07067063 100644 --- a/packages/agent-runtime/src/run-agent-step.ts +++ b/packages/agent-runtime/src/run-agent-step.ts @@ -21,7 +21,10 @@ import { CACHE_DEBUG_FULL_LOGGING } from './constants' import { callTokenCountAPI } from './llm-api/codebuff-web-api' import { getMCPToolData } from './mcp' import { getAgentStreamFromTemplate } from './prompt-agent-stream' -import { runProgrammaticStep } from './run-programmatic-step' +import { + clearProgrammaticRunState, + runProgrammaticStep, +} from './run-programmatic-step' import { additionalSystemPrompts } from './system-prompt/prompts' import { getAgentTemplate } from './templates/agent-registry' import { buildAgentToolSet } from './templates/prompts' @@ -1209,6 +1212,11 @@ export async function loopAgentSteps( }), }, } + } finally { + // The endTurn path inside runProgrammaticStep handles normal completion, + // but abort/error exits (e.g. chat SSE disconnects) would otherwise leak + // the run's generator, STEP_ALL flag, and proposed file content forever. + clearProgrammaticRunState(runId) } } diff --git a/packages/agent-runtime/src/run-programmatic-step.ts b/packages/agent-runtime/src/run-programmatic-step.ts index 64addd4103..ff9e7ca3c2 100644 --- a/packages/agent-runtime/src/run-programmatic-step.ts +++ b/packages/agent-runtime/src/run-programmatic-step.ts @@ -44,6 +44,20 @@ export function clearAgentGeneratorCache(params: { logger: Logger }) { runIdToStepAll.clear() } +/** + * Release all module-level state held for a run: the handleSteps generator + * (whose closure retains the full agent state and message history), the + * STEP_ALL flag, and any proposed file content. Safe to call for runs with + * no programmatic state. Must run whenever a run's loop exits — including + * abort and error paths, not just endTurn — or the state leaks for the + * lifetime of the process. + */ +export function clearProgrammaticRunState(runId: string): void { + delete runIdToGenerator[runId] + runIdToStepAll.delete(runId) + clearProposedContentForRun(runId) +} + // Function to handle programmatic agents export async function runProgrammaticStep( params: { @@ -376,9 +390,7 @@ export async function runProgrammaticStep( } } finally { if (endTurn) { - delete runIdToGenerator[agentState.runId] - runIdToStepAll.delete(agentState.runId) - clearProposedContentForRun(agentState.runId) + clearProgrammaticRunState(agentState.runId) } } } diff --git a/sdk/src/impl/agent-runtime.ts b/sdk/src/impl/agent-runtime.ts index 97d8b5d632..83525a7bbd 100644 --- a/sdk/src/impl/agent-runtime.ts +++ b/sdk/src/impl/agent-runtime.ts @@ -17,13 +17,32 @@ import type { AgentRuntimeDeps, AgentRuntimeScopedDeps, } from '@codebuff/common/types/contracts/agent-runtime' +import type { AgentTemplate } from '@codebuff/common/types/agent-template' import type { DatabaseAgentCache } from '@codebuff/common/types/contracts/database' import type { ClientEnv } from '@codebuff/common/types/contracts/env' import type { Logger } from '@codebuff/common/types/contracts/logger' import type { TraceWriter } from '@codebuff/common/types/contracts/trace' import type { TrackEventFn } from '@codebuff/common/types/contracts/analytics' -const databaseAgentCache: DatabaseAgentCache = new Map() +const DATABASE_AGENT_CACHE_MAX_ENTRIES = 200 + +/** Insertion-order (FIFO) eviction so the cache can't grow without bound in + * long-lived processes (e.g. the freebuff chat server, which runs the agent + * runtime in-process). Templates are large — prompts plus handleSteps source. */ +class BoundedAgentCache extends Map { + override set(key: string, value: AgentTemplate | null): this { + if (!this.has(key)) { + while (this.size >= DATABASE_AGENT_CACHE_MAX_ENTRIES) { + const oldestKey = this.keys().next().value + if (oldestKey === undefined) break + this.delete(oldestKey) + } + } + return super.set(key, value) + } +} + +const databaseAgentCache: DatabaseAgentCache = new BoundedAgentCache() export function getAgentRuntimeImpl( params: { From 4fd0acd55feb4b90e584ab2204c16eb4c876c132 Mon Sep 17 00:00:00 2001 From: codebuff public sync bot <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 11 Jun 2026 19:17:15 +0000 Subject: [PATCH 73/96] Sync public snapshot from freebuff-private Source: CodebuffAI/freebuff-private@638710e21523da25e73c0b47dff29530487c96da --- bun.lock | 76 +++++++++++++++++++++++++++++++++++++------------------- 1 file changed, 50 insertions(+), 26 deletions(-) diff --git a/bun.lock b/bun.lock index e748e841b2..9b30d0f9fd 100644 --- a/bun.lock +++ b/bun.lock @@ -240,15 +240,19 @@ "@eslint-community/regexpp": ["@eslint-community/regexpp@4.12.2", "", {}, "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew=="], - "@eslint/config-array": ["@eslint/config-array@0.23.5", "", { "dependencies": { "@eslint/object-schema": "^3.0.5", "debug": "^4.3.1", "minimatch": "^10.2.4" } }, "sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA=="], + "@eslint/config-array": ["@eslint/config-array@0.21.2", "", { "dependencies": { "@eslint/object-schema": "^2.1.7", "debug": "^4.3.1", "minimatch": "^3.1.5" } }, "sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw=="], - "@eslint/config-helpers": ["@eslint/config-helpers@0.6.0", "", { "dependencies": { "@eslint/core": "^1.2.1" } }, "sha512-ii6Bw9jJ2zi2cWA2Z+9/QZ/+3DX6kwaV5Q986D/CdP3Lap3w/pgQZ373FV7byY/i7L4IRH/G43I5dz1ClsCbpA=="], + "@eslint/config-helpers": ["@eslint/config-helpers@0.4.2", "", { "dependencies": { "@eslint/core": "^0.17.0" } }, "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw=="], - "@eslint/core": ["@eslint/core@1.2.1", "", { "dependencies": { "@types/json-schema": "^7.0.15" } }, "sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ=="], + "@eslint/core": ["@eslint/core@0.17.0", "", { "dependencies": { "@types/json-schema": "^7.0.15" } }, "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ=="], - "@eslint/object-schema": ["@eslint/object-schema@3.0.5", "", {}, "sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw=="], + "@eslint/eslintrc": ["@eslint/eslintrc@3.3.5", "", { "dependencies": { "ajv": "^6.14.0", "debug": "^4.3.2", "espree": "^10.0.1", "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.1", "minimatch": "^3.1.5", "strip-json-comments": "^3.1.1" } }, "sha512-4IlJx0X0qftVsN5E+/vGujTRIFtwuLbNsVUe7TO6zYPDR1O6nFwvwhIKEKSrl6dZchmYBITazxKoUYOjdtjlRg=="], - "@eslint/plugin-kit": ["@eslint/plugin-kit@0.7.2", "", { "dependencies": { "@eslint/core": "^1.2.1", "levn": "^0.4.1" } }, "sha512-+CNAzxglkrpNf/kKywqQfk74QjtceuOE7Qm+AF8miRvPF/wmmK5+OJOgVh3AVTT3RP2mH3+FOaxlE5v72owk0A=="], + "@eslint/js": ["@eslint/js@9.39.4", "", {}, "sha512-nE7DEIchvtiFTwBw4Lfbu59PG+kCofhjsKaCWzxTpt4lfRjRMqG6uMBzKXuEcyXhOHoUp9riAm7/aWYGhXZ9cw=="], + + "@eslint/object-schema": ["@eslint/object-schema@2.1.7", "", {}, "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA=="], + + "@eslint/plugin-kit": ["@eslint/plugin-kit@0.4.1", "", { "dependencies": { "@eslint/core": "^0.17.0", "levn": "^0.4.1" } }, "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA=="], "@gravity-ai/api": ["@gravity-ai/api@0.1.2", "", { "dependencies": { "axios": "^1.13.2" } }, "sha512-txsAhyzvwB/TNrj5R8DoNqw8afM3JY2ahl7aaeaD5ZsxP+7rxff7C7keGI7+gU2KT3d2Mcw4QB1nHhbTSCJYHw=="], @@ -464,8 +468,6 @@ "@types/diff": ["@types/diff@8.0.0", "", { "dependencies": { "diff": "*" } }, "sha512-o7jqJM04gfaYrdCecCVMbZhNdG6T1MHg/oQoRFdERLV+4d+V7FijhiEAbFu0Usww84Yijk9yH58U4Jk4HbtzZw=="], - "@types/esrecurse": ["@types/esrecurse@4.3.1", "", {}, "sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw=="], - "@types/estree": ["@types/estree@1.0.9", "", {}, "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg=="], "@types/js-yaml": ["@types/js-yaml@4.0.9", "", {}, "sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg=="], @@ -548,7 +550,7 @@ "ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="], - "ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], + "ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], "any-base": ["any-base@1.1.0", "", {}, "sha512-uMgjozySS8adZZYePpaWs8cxB9/kdzmpX6SgJZ+wbz1K5eYk5QMYDVJaZKhxyIHUdnnJkfR7SVgStgH7LkGUyg=="], @@ -624,6 +626,8 @@ "call-bound": ["call-bound@1.0.4", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "get-intrinsic": "^1.3.0" } }, "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg=="], + "callsites": ["callsites@3.1.0", "", {}, "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="], + "caniuse-lite": ["caniuse-lite@1.0.30001799", "", {}, "sha512-hG1bReV+OUU+MOqK4t/ZWI0tZOyz3rqS9XuhOUz1cIcbwBKjOyJEJuw9ER5JuNyqxNk8u/JUVbGibBOL1yrjFw=="], "canvas": ["canvas@3.2.3", "", { "dependencies": { "node-addon-api": "^7.0.0", "prebuild-install": "^7.1.3" } }, "sha512-PzE5nJZPz72YUAfo8oTp0u3fqqY7IzlTubneAihqDYAUcBk7ryeCmBbdJBEdaH0bptSOe2VT2Zwcb3UaFyaSWw=="], @@ -748,7 +752,7 @@ "escape-string-regexp": ["escape-string-regexp@4.0.0", "", {}, "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="], - "eslint": ["eslint@10.4.1", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.2", "@eslint/config-array": "^0.23.5", "@eslint/config-helpers": "^0.6.0", "@eslint/core": "^1.2.1", "@eslint/plugin-kit": "^0.7.2", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "ajv": "^6.14.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^9.1.2", "eslint-visitor-keys": "^5.0.1", "espree": "^11.2.0", "esquery": "^1.7.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "minimatch": "^10.2.4", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, "peerDependencies": { "jiti": "*" }, "optionalPeers": ["jiti"], "bin": { "eslint": "bin/eslint.js" } }, "sha512-AyIKhnOBuOAdueD7RB3xB+YeAWScb9jHsJBgH2Hcde8InP5JYhqrRR6iTMHyTEwgENK54Cp44e4v8BwNhsuHuw=="], + "eslint": ["eslint@9.39.4", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", "@eslint/config-array": "^0.21.2", "@eslint/config-helpers": "^0.4.2", "@eslint/core": "^0.17.0", "@eslint/eslintrc": "^3.3.5", "@eslint/js": "9.39.4", "@eslint/plugin-kit": "^0.4.1", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "ajv": "^6.14.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^8.4.0", "eslint-visitor-keys": "^4.2.1", "espree": "^10.4.0", "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.5", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, "peerDependencies": { "jiti": "*" }, "optionalPeers": ["jiti"], "bin": { "eslint": "bin/eslint.js" } }, "sha512-XoMjdBOwe/esVgEvLmNsD3IRHkm7fbKIUGvrleloJXUZgDHig2IPWNniv+GwjyJXzuNqVjlr5+4yVUZjycJwfQ=="], "eslint-config-prettier": ["eslint-config-prettier@9.1.2", "", { "peerDependencies": { "eslint": ">=7.0.0" }, "bin": { "eslint-config-prettier": "bin/cli.js" } }, "sha512-iI1f+D2ViGn+uvv5HuHVUamg8ll4tN+JRHGc6IJi4TP9Kl976C57fzPXgseXNs8v0iA8aSJpHsTWjDb9QJamGQ=="], @@ -760,11 +764,11 @@ "eslint-plugin-unused-imports": ["eslint-plugin-unused-imports@4.4.1", "", { "peerDependencies": { "@typescript-eslint/eslint-plugin": "^8.0.0-0 || ^7.0.0 || ^6.0.0 || ^5.0.0", "eslint": "^10.0.0 || ^9.0.0 || ^8.0.0" }, "optionalPeers": ["@typescript-eslint/eslint-plugin"] }, "sha512-oZGYUz1X3sRMGUB+0cZyK2VcvRX5lm/vB56PgNNcU+7ficUCKm66oZWKUubXWnOuPjQ8PvmXtCViXBMONPe7tQ=="], - "eslint-scope": ["eslint-scope@9.1.2", "", { "dependencies": { "@types/esrecurse": "^4.3.1", "@types/estree": "^1.0.8", "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ=="], + "eslint-scope": ["eslint-scope@8.4.0", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg=="], "eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="], - "espree": ["espree@11.2.0", "", { "dependencies": { "acorn": "^8.16.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^5.0.1" } }, "sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw=="], + "espree": ["espree@10.4.0", "", { "dependencies": { "acorn": "^8.15.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^4.2.1" } }, "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ=="], "esprima": ["esprima@4.0.1", "", { "bin": { "esparse": "./bin/esparse.js", "esvalidate": "./bin/esvalidate.js" } }, "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="], @@ -876,6 +880,8 @@ "glob-parent": ["glob-parent@6.0.2", "", { "dependencies": { "is-glob": "^4.0.3" } }, "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A=="], + "globals": ["globals@14.0.0", "", {}, "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ=="], + "globalthis": ["globalthis@1.0.4", "", { "dependencies": { "define-properties": "^1.2.1", "gopd": "^1.0.1" } }, "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ=="], "globby": ["globby@11.1.0", "", { "dependencies": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", "fast-glob": "^3.2.9", "ignore": "^5.2.0", "merge2": "^1.4.1", "slash": "^3.0.0" } }, "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g=="], @@ -890,6 +896,8 @@ "has-bigints": ["has-bigints@1.1.0", "", {}, "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg=="], + "has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], + "has-property-descriptors": ["has-property-descriptors@1.0.2", "", { "dependencies": { "es-define-property": "^1.0.0" } }, "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg=="], "has-proto": ["has-proto@1.2.0", "", { "dependencies": { "dunder-proto": "^1.0.0" } }, "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ=="], @@ -920,6 +928,8 @@ "immer": ["immer@10.2.0", "", {}, "sha512-d/+XTN3zfODyjr89gM3mPq1WNX2B8pYsu7eORitdwyA2sBubnTl3laYlBk4sXY5FUa5qTZGBDPJICVbvqzjlbw=="], + "import-fresh": ["import-fresh@3.3.1", "", { "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" } }, "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ=="], + "imurmurhash": ["imurmurhash@0.1.4", "", {}, "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA=="], "inherits": ["inherits@2.0.4", "", {}, "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="], @@ -1036,6 +1046,8 @@ "lodash": ["lodash@4.17.23", "", {}, "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w=="], + "lodash.merge": ["lodash.merge@4.6.2", "", {}, "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ=="], + "log-update": ["log-update@8.0.0", "", { "dependencies": { "ansi-escapes": "^7.3.0", "cli-cursor": "^5.0.0", "slice-ansi": "^9.0.0", "string-width": "^8.2.0", "strip-ansi": "^7.2.0", "wrap-ansi": "^10.0.0" } }, "sha512-lddSgOt3bPASrylL54ZSpy8nBHns+vBVSoILlVOx+dei300pnLRN958rj/EdlVLKuWlSESU3qdnDZdAI7FXYGg=="], "longest-streak": ["longest-streak@3.1.0", "", {}, "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g=="], @@ -1238,6 +1250,8 @@ "pako": ["pako@1.0.11", "", {}, "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw=="], + "parent-module": ["parent-module@1.0.1", "", { "dependencies": { "callsites": "^3.0.0" } }, "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g=="], + "parse-bmfont-ascii": ["parse-bmfont-ascii@1.0.6", "", {}, "sha512-U4RrVsUFCleIOBsIGYOMKjn9PavsGOXxbvYGtMOEfnId0SVNsgehXh1DxUdVPLoxd5mvcEtvmKs2Mmf0Mpa1ZA=="], "parse-bmfont-binary": ["parse-bmfont-binary@1.0.6", "", {}, "sha512-GxmsRea0wdGdYthjuUeWTMWPqm2+FAd4GI8vCvhgJsFnoGhTrLhXDDupwTo7rXVAgaLIGoVHDZS9p/5XbSqeWA=="], @@ -1382,6 +1396,8 @@ "resolve": ["resolve@2.0.0-next.7", "", { "dependencies": { "es-errors": "^1.3.0", "is-core-module": "^2.16.2", "node-exports-info": "^1.6.0", "object-keys": "^1.1.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-tqt+NBWwyaMgw3zDsnygx4CByWjQEJHOPMdslYhppaQSJUtL/D4JO9CcBBlhPoI8lz9oJIDXkwXfhF4aWqP8xQ=="], + "resolve-from": ["resolve-from@4.0.0", "", {}, "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="], + "resolve-pkg-maps": ["resolve-pkg-maps@1.0.0", "", {}, "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw=="], "restore-cursor": ["restore-cursor@5.1.0", "", { "dependencies": { "onetime": "^7.0.0", "signal-exit": "^4.1.0" } }, "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA=="], @@ -1486,7 +1502,7 @@ "strip-final-newline": ["strip-final-newline@2.0.0", "", {}, "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA=="], - "strip-json-comments": ["strip-json-comments@2.0.1", "", {}, "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ=="], + "strip-json-comments": ["strip-json-comments@3.1.1", "", {}, "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig=="], "stripe": ["stripe@16.12.0", "", { "dependencies": { "@types/node": ">=8.1.0", "qs": "^6.11.0" } }, "sha512-H7eFVLDxeTNNSn4JTRfL2//LzCbDrMSZ+2q1c7CanVWgK2qIW5TwS+0V7N9KcKZZNpYh/uCqK0PyZh/2UsaAtQ=="], @@ -1494,6 +1510,8 @@ "styled-jsx": ["styled-jsx@5.1.6", "", { "dependencies": { "client-only": "0.0.1" }, "peerDependencies": { "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0" } }, "sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA=="], + "supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], + "supports-preserve-symlinks-flag": ["supports-preserve-symlinks-flag@1.0.0", "", {}, "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w=="], "supports-terminal-graphics": ["supports-terminal-graphics@0.1.0", "", {}, "sha512-+KdfozhS0Fw8y5Sghw8kkZNGT8nWYzJ1EzcoIvVjxhl+26TJTs26y02yfBgvc1jh5AS/c8jcI3xtahhR95KRyQ=="], @@ -1652,12 +1670,18 @@ "@codebuff/sdk/ignore": ["ignore@7.0.5", "", {}, "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg=="], - "@eslint/config-array/minimatch": ["minimatch@10.2.5", "", { "dependencies": { "brace-expansion": "^5.0.5" } }, "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg=="], + "@eslint/eslintrc/ajv": ["ajv@6.15.0", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw=="], + + "@eslint/eslintrc/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], + + "@eslint/eslintrc/js-yaml": ["js-yaml@4.2.0", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-ePWsvanv0DWuDRsW8dnt+R4jQ31SCRCQ7hhNcPXZPsoBZiemuZNYGf7adZdqX2D86j6rvKp3RpCxVTSb8WQlOw=="], "@opentui/core/diff": ["diff@9.0.0", "", {}, "sha512-svtcdpS8CgJyqAjEQIXdb3OjhFVVYjzGAPO8WGCmRbrml64SPw/jJD4GoE98aR7r25A0XcgrK3F02yw9R/vhQw=="], "@opentui/core/strip-ansi": ["strip-ansi@7.1.2", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA=="], + "@types/diff/diff": ["diff@9.0.0", "", {}, "sha512-svtcdpS8CgJyqAjEQIXdb3OjhFVVYjzGAPO8WGCmRbrml64SPw/jJD4GoE98aR7r25A0XcgrK3F02yw9R/vhQw=="], + "@typescript-eslint/eslint-plugin/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], "@typescript-eslint/parser/@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@7.18.0", "", { "dependencies": { "@typescript-eslint/types": "7.18.0", "@typescript-eslint/visitor-keys": "7.18.0" } }, "sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA=="], @@ -1686,11 +1710,11 @@ "eslint/ajv": ["ajv@6.15.0", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw=="], - "eslint/eslint-visitor-keys": ["eslint-visitor-keys@5.0.1", "", {}, "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA=="], + "eslint/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], - "eslint/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], + "eslint/eslint-visitor-keys": ["eslint-visitor-keys@4.2.1", "", {}, "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ=="], - "eslint/minimatch": ["minimatch@10.2.5", "", { "dependencies": { "brace-expansion": "^5.0.5" } }, "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg=="], + "eslint/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], "eslint-import-resolver-node/debug": ["debug@3.2.7", "", { "dependencies": { "ms": "^2.1.1" } }, "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ=="], @@ -1702,7 +1726,7 @@ "eslint-plugin-import/tsconfig-paths": ["tsconfig-paths@3.15.0", "", { "dependencies": { "@types/json5": "^0.0.29", "json5": "^1.0.2", "minimist": "^1.2.6", "strip-bom": "^3.0.0" } }, "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg=="], - "espree/eslint-visitor-keys": ["eslint-visitor-keys@5.0.1", "", {}, "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA=="], + "espree/eslint-visitor-keys": ["eslint-visitor-keys@4.2.1", "", {}, "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ=="], "execa/onetime": ["onetime@5.1.2", "", { "dependencies": { "mimic-fn": "^2.1.0" } }, "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg=="], @@ -1730,12 +1754,16 @@ "plist/xmlbuilder": ["xmlbuilder@15.1.1", "", {}, "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg=="], + "rc/strip-json-comments": ["strip-json-comments@2.0.1", "", {}, "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ=="], + "react-devtools-core/ws": ["ws@7.5.11", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": "^5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-zS54Oen9bITtp7kp2XM3AydrCIq1D+HwJOuH+c+e4LfpL/lotP5osijd+UoMnxwAam1GN8R4KtLAyIrIcBNpiA=="], "react-reconciler/scheduler": ["scheduler@0.26.0", "", {}, "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA=="], "send/mime-types": ["mime-types@3.0.2", "", { "dependencies": { "mime-db": "^1.54.0" } }, "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A=="], + "slice-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], + "tar-stream/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=="], "ts-node/diff": ["diff@4.0.4", "", {}, "sha512-X07nttJQkwkfKfvTPG/KSnE2OMdcUCao6+eXF3wmnIQRn2aPAHH3VxDbDOdegkd6JbPsXqShpvEOHfAT+nCNwQ=="], @@ -1750,6 +1778,8 @@ "typescript-eslint/@typescript-eslint/utils": ["@typescript-eslint/utils@7.18.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@typescript-eslint/scope-manager": "7.18.0", "@typescript-eslint/types": "7.18.0", "@typescript-eslint/typescript-estree": "7.18.0" }, "peerDependencies": { "eslint": "^8.56.0" } }, "sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw=="], + "wrap-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], + "wrap-ansi/string-width": ["string-width@8.2.1", "", { "dependencies": { "get-east-asian-width": "^1.5.0", "strip-ansi": "^7.1.2" } }, "sha512-IIaP0g3iy9Cyy18w3M9YcaDudujEAVHKt3a3QJg1+sr/oX96TbaGUubG0hJyCjCBThFH+tFpcIyoUHUn1ogaLA=="], "yargs/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], @@ -1758,7 +1788,9 @@ "@codebuff/evals/pino/process-warning": ["process-warning@5.0.0", "", {}, "sha512-a39t9ApHNx2L4+HBnQKqxxHNs1r7KF+Intd8Q/g1bUh6q0WIp9voPXJ/x0j+ZL45KF1pJd9+q2jLIRMfvEshkA=="], - "@eslint/config-array/minimatch/brace-expansion": ["brace-expansion@5.0.6", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g=="], + "@eslint/eslintrc/ajv/json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], + + "@eslint/eslintrc/js-yaml/argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="], "@typescript-eslint/parser/@typescript-eslint/typescript-estree/minimatch": ["minimatch@9.0.9", "", { "dependencies": { "brace-expansion": "^2.0.2" } }, "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg=="], @@ -1772,14 +1804,10 @@ "cliui/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], - "cliui/wrap-ansi/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], - "eslint-plugin-import/tsconfig-paths/json5": ["json5@1.0.2", "", { "dependencies": { "minimist": "^1.2.0" }, "bin": { "json5": "lib/cli.js" } }, "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA=="], "eslint/ajv/json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], - "eslint/minimatch/brace-expansion": ["brace-expansion@5.0.6", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g=="], - "express/mime-types/mime-db": ["mime-db@1.54.0", "", {}, "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ=="], "p-locate/p-limit/yocto-queue": ["yocto-queue@0.1.0", "", {}, "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="], @@ -1808,12 +1836,8 @@ "yargs/string-width/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], - "@eslint/config-array/minimatch/brace-expansion/balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="], - "@typescript-eslint/parser/@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.1.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-WR1cURNjuvBLMZBMbqM0UoE+WAfdUcEV1ccD8PVBVOI+Z3ND4+SZbN8RsfT2bMuG1qwz5RFvPukSZm5fF2D5eA=="], - "eslint/minimatch/brace-expansion/balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="], - "typescript-eslint/@typescript-eslint/eslint-plugin/@typescript-eslint/scope-manager/@typescript-eslint/types": ["@typescript-eslint/types@7.18.0", "", {}, "sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ=="], "typescript-eslint/@typescript-eslint/eslint-plugin/@typescript-eslint/type-utils/@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@7.18.0", "", { "dependencies": { "@typescript-eslint/types": "7.18.0", "@typescript-eslint/visitor-keys": "7.18.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", "minimatch": "^9.0.4", "semver": "^7.6.0", "ts-api-utils": "^1.3.0" } }, "sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA=="], From 911d086a851ce036e18c5800a65af8b0a30313a6 Mon Sep 17 00:00:00 2001 From: codebuff public sync bot <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 11 Jun 2026 20:27:24 +0000 Subject: [PATCH 74/96] Sync public snapshot from freebuff-private Source: CodebuffAI/freebuff-private@06ffc8a6f30162b1a277df53d12f3362902b79ea --- bun.lock | 2 -- 1 file changed, 2 deletions(-) diff --git a/bun.lock b/bun.lock index 9b30d0f9fd..74aa75b250 100644 --- a/bun.lock +++ b/bun.lock @@ -1680,8 +1680,6 @@ "@opentui/core/strip-ansi": ["strip-ansi@7.1.2", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA=="], - "@types/diff/diff": ["diff@9.0.0", "", {}, "sha512-svtcdpS8CgJyqAjEQIXdb3OjhFVVYjzGAPO8WGCmRbrml64SPw/jJD4GoE98aR7r25A0XcgrK3F02yw9R/vhQw=="], - "@typescript-eslint/eslint-plugin/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], "@typescript-eslint/parser/@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@7.18.0", "", { "dependencies": { "@typescript-eslint/types": "7.18.0", "@typescript-eslint/visitor-keys": "7.18.0" } }, "sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA=="], From a0e7f5d3e7d883af6f28b1c16274bc2207c87324 Mon Sep 17 00:00:00 2001 From: codebuff public sync bot <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 11 Jun 2026 20:27:50 +0000 Subject: [PATCH 75/96] Sync public snapshot from freebuff-private Source: CodebuffAI/freebuff-private@432523bc76af6c27244529cb7b93d8b0bd295e2a --- bun.lock | 78 ++++++++++++++++++++------------------------------------ 1 file changed, 27 insertions(+), 51 deletions(-) diff --git a/bun.lock b/bun.lock index 74aa75b250..e91492b646 100644 --- a/bun.lock +++ b/bun.lock @@ -240,19 +240,15 @@ "@eslint-community/regexpp": ["@eslint-community/regexpp@4.12.2", "", {}, "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew=="], - "@eslint/config-array": ["@eslint/config-array@0.21.2", "", { "dependencies": { "@eslint/object-schema": "^2.1.7", "debug": "^4.3.1", "minimatch": "^3.1.5" } }, "sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw=="], + "@eslint/config-array": ["@eslint/config-array@0.23.5", "", { "dependencies": { "@eslint/object-schema": "^3.0.5", "debug": "^4.3.1", "minimatch": "^10.2.4" } }, "sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA=="], - "@eslint/config-helpers": ["@eslint/config-helpers@0.4.2", "", { "dependencies": { "@eslint/core": "^0.17.0" } }, "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw=="], + "@eslint/config-helpers": ["@eslint/config-helpers@0.6.0", "", { "dependencies": { "@eslint/core": "^1.2.1" } }, "sha512-ii6Bw9jJ2zi2cWA2Z+9/QZ/+3DX6kwaV5Q986D/CdP3Lap3w/pgQZ373FV7byY/i7L4IRH/G43I5dz1ClsCbpA=="], - "@eslint/core": ["@eslint/core@0.17.0", "", { "dependencies": { "@types/json-schema": "^7.0.15" } }, "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ=="], + "@eslint/core": ["@eslint/core@1.2.1", "", { "dependencies": { "@types/json-schema": "^7.0.15" } }, "sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ=="], - "@eslint/eslintrc": ["@eslint/eslintrc@3.3.5", "", { "dependencies": { "ajv": "^6.14.0", "debug": "^4.3.2", "espree": "^10.0.1", "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.1", "minimatch": "^3.1.5", "strip-json-comments": "^3.1.1" } }, "sha512-4IlJx0X0qftVsN5E+/vGujTRIFtwuLbNsVUe7TO6zYPDR1O6nFwvwhIKEKSrl6dZchmYBITazxKoUYOjdtjlRg=="], + "@eslint/object-schema": ["@eslint/object-schema@3.0.5", "", {}, "sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw=="], - "@eslint/js": ["@eslint/js@9.39.4", "", {}, "sha512-nE7DEIchvtiFTwBw4Lfbu59PG+kCofhjsKaCWzxTpt4lfRjRMqG6uMBzKXuEcyXhOHoUp9riAm7/aWYGhXZ9cw=="], - - "@eslint/object-schema": ["@eslint/object-schema@2.1.7", "", {}, "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA=="], - - "@eslint/plugin-kit": ["@eslint/plugin-kit@0.4.1", "", { "dependencies": { "@eslint/core": "^0.17.0", "levn": "^0.4.1" } }, "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA=="], + "@eslint/plugin-kit": ["@eslint/plugin-kit@0.7.2", "", { "dependencies": { "@eslint/core": "^1.2.1", "levn": "^0.4.1" } }, "sha512-+CNAzxglkrpNf/kKywqQfk74QjtceuOE7Qm+AF8miRvPF/wmmK5+OJOgVh3AVTT3RP2mH3+FOaxlE5v72owk0A=="], "@gravity-ai/api": ["@gravity-ai/api@0.1.2", "", { "dependencies": { "axios": "^1.13.2" } }, "sha512-txsAhyzvwB/TNrj5R8DoNqw8afM3JY2ahl7aaeaD5ZsxP+7rxff7C7keGI7+gU2KT3d2Mcw4QB1nHhbTSCJYHw=="], @@ -468,6 +464,8 @@ "@types/diff": ["@types/diff@8.0.0", "", { "dependencies": { "diff": "*" } }, "sha512-o7jqJM04gfaYrdCecCVMbZhNdG6T1MHg/oQoRFdERLV+4d+V7FijhiEAbFu0Usww84Yijk9yH58U4Jk4HbtzZw=="], + "@types/esrecurse": ["@types/esrecurse@4.3.1", "", {}, "sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw=="], + "@types/estree": ["@types/estree@1.0.9", "", {}, "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg=="], "@types/js-yaml": ["@types/js-yaml@4.0.9", "", {}, "sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg=="], @@ -550,7 +548,7 @@ "ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="], - "ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + "ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], "any-base": ["any-base@1.1.0", "", {}, "sha512-uMgjozySS8adZZYePpaWs8cxB9/kdzmpX6SgJZ+wbz1K5eYk5QMYDVJaZKhxyIHUdnnJkfR7SVgStgH7LkGUyg=="], @@ -626,8 +624,6 @@ "call-bound": ["call-bound@1.0.4", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "get-intrinsic": "^1.3.0" } }, "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg=="], - "callsites": ["callsites@3.1.0", "", {}, "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="], - "caniuse-lite": ["caniuse-lite@1.0.30001799", "", {}, "sha512-hG1bReV+OUU+MOqK4t/ZWI0tZOyz3rqS9XuhOUz1cIcbwBKjOyJEJuw9ER5JuNyqxNk8u/JUVbGibBOL1yrjFw=="], "canvas": ["canvas@3.2.3", "", { "dependencies": { "node-addon-api": "^7.0.0", "prebuild-install": "^7.1.3" } }, "sha512-PzE5nJZPz72YUAfo8oTp0u3fqqY7IzlTubneAihqDYAUcBk7ryeCmBbdJBEdaH0bptSOe2VT2Zwcb3UaFyaSWw=="], @@ -752,7 +748,7 @@ "escape-string-regexp": ["escape-string-regexp@4.0.0", "", {}, "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="], - "eslint": ["eslint@9.39.4", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", "@eslint/config-array": "^0.21.2", "@eslint/config-helpers": "^0.4.2", "@eslint/core": "^0.17.0", "@eslint/eslintrc": "^3.3.5", "@eslint/js": "9.39.4", "@eslint/plugin-kit": "^0.4.1", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "ajv": "^6.14.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^8.4.0", "eslint-visitor-keys": "^4.2.1", "espree": "^10.4.0", "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.5", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, "peerDependencies": { "jiti": "*" }, "optionalPeers": ["jiti"], "bin": { "eslint": "bin/eslint.js" } }, "sha512-XoMjdBOwe/esVgEvLmNsD3IRHkm7fbKIUGvrleloJXUZgDHig2IPWNniv+GwjyJXzuNqVjlr5+4yVUZjycJwfQ=="], + "eslint": ["eslint@10.4.1", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.2", "@eslint/config-array": "^0.23.5", "@eslint/config-helpers": "^0.6.0", "@eslint/core": "^1.2.1", "@eslint/plugin-kit": "^0.7.2", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "ajv": "^6.14.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^9.1.2", "eslint-visitor-keys": "^5.0.1", "espree": "^11.2.0", "esquery": "^1.7.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "minimatch": "^10.2.4", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, "peerDependencies": { "jiti": "*" }, "optionalPeers": ["jiti"], "bin": { "eslint": "bin/eslint.js" } }, "sha512-AyIKhnOBuOAdueD7RB3xB+YeAWScb9jHsJBgH2Hcde8InP5JYhqrRR6iTMHyTEwgENK54Cp44e4v8BwNhsuHuw=="], "eslint-config-prettier": ["eslint-config-prettier@9.1.2", "", { "peerDependencies": { "eslint": ">=7.0.0" }, "bin": { "eslint-config-prettier": "bin/cli.js" } }, "sha512-iI1f+D2ViGn+uvv5HuHVUamg8ll4tN+JRHGc6IJi4TP9Kl976C57fzPXgseXNs8v0iA8aSJpHsTWjDb9QJamGQ=="], @@ -764,11 +760,11 @@ "eslint-plugin-unused-imports": ["eslint-plugin-unused-imports@4.4.1", "", { "peerDependencies": { "@typescript-eslint/eslint-plugin": "^8.0.0-0 || ^7.0.0 || ^6.0.0 || ^5.0.0", "eslint": "^10.0.0 || ^9.0.0 || ^8.0.0" }, "optionalPeers": ["@typescript-eslint/eslint-plugin"] }, "sha512-oZGYUz1X3sRMGUB+0cZyK2VcvRX5lm/vB56PgNNcU+7ficUCKm66oZWKUubXWnOuPjQ8PvmXtCViXBMONPe7tQ=="], - "eslint-scope": ["eslint-scope@8.4.0", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg=="], + "eslint-scope": ["eslint-scope@9.1.2", "", { "dependencies": { "@types/esrecurse": "^4.3.1", "@types/estree": "^1.0.8", "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ=="], "eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="], - "espree": ["espree@10.4.0", "", { "dependencies": { "acorn": "^8.15.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^4.2.1" } }, "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ=="], + "espree": ["espree@11.2.0", "", { "dependencies": { "acorn": "^8.16.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^5.0.1" } }, "sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw=="], "esprima": ["esprima@4.0.1", "", { "bin": { "esparse": "./bin/esparse.js", "esvalidate": "./bin/esvalidate.js" } }, "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="], @@ -880,8 +876,6 @@ "glob-parent": ["glob-parent@6.0.2", "", { "dependencies": { "is-glob": "^4.0.3" } }, "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A=="], - "globals": ["globals@14.0.0", "", {}, "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ=="], - "globalthis": ["globalthis@1.0.4", "", { "dependencies": { "define-properties": "^1.2.1", "gopd": "^1.0.1" } }, "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ=="], "globby": ["globby@11.1.0", "", { "dependencies": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", "fast-glob": "^3.2.9", "ignore": "^5.2.0", "merge2": "^1.4.1", "slash": "^3.0.0" } }, "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g=="], @@ -896,8 +890,6 @@ "has-bigints": ["has-bigints@1.1.0", "", {}, "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg=="], - "has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], - "has-property-descriptors": ["has-property-descriptors@1.0.2", "", { "dependencies": { "es-define-property": "^1.0.0" } }, "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg=="], "has-proto": ["has-proto@1.2.0", "", { "dependencies": { "dunder-proto": "^1.0.0" } }, "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ=="], @@ -928,8 +920,6 @@ "immer": ["immer@10.2.0", "", {}, "sha512-d/+XTN3zfODyjr89gM3mPq1WNX2B8pYsu7eORitdwyA2sBubnTl3laYlBk4sXY5FUa5qTZGBDPJICVbvqzjlbw=="], - "import-fresh": ["import-fresh@3.3.1", "", { "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" } }, "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ=="], - "imurmurhash": ["imurmurhash@0.1.4", "", {}, "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA=="], "inherits": ["inherits@2.0.4", "", {}, "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="], @@ -1046,8 +1036,6 @@ "lodash": ["lodash@4.17.23", "", {}, "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w=="], - "lodash.merge": ["lodash.merge@4.6.2", "", {}, "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ=="], - "log-update": ["log-update@8.0.0", "", { "dependencies": { "ansi-escapes": "^7.3.0", "cli-cursor": "^5.0.0", "slice-ansi": "^9.0.0", "string-width": "^8.2.0", "strip-ansi": "^7.2.0", "wrap-ansi": "^10.0.0" } }, "sha512-lddSgOt3bPASrylL54ZSpy8nBHns+vBVSoILlVOx+dei300pnLRN958rj/EdlVLKuWlSESU3qdnDZdAI7FXYGg=="], "longest-streak": ["longest-streak@3.1.0", "", {}, "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g=="], @@ -1250,8 +1238,6 @@ "pako": ["pako@1.0.11", "", {}, "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw=="], - "parent-module": ["parent-module@1.0.1", "", { "dependencies": { "callsites": "^3.0.0" } }, "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g=="], - "parse-bmfont-ascii": ["parse-bmfont-ascii@1.0.6", "", {}, "sha512-U4RrVsUFCleIOBsIGYOMKjn9PavsGOXxbvYGtMOEfnId0SVNsgehXh1DxUdVPLoxd5mvcEtvmKs2Mmf0Mpa1ZA=="], "parse-bmfont-binary": ["parse-bmfont-binary@1.0.6", "", {}, "sha512-GxmsRea0wdGdYthjuUeWTMWPqm2+FAd4GI8vCvhgJsFnoGhTrLhXDDupwTo7rXVAgaLIGoVHDZS9p/5XbSqeWA=="], @@ -1324,7 +1310,7 @@ "posthog-node": ["posthog-node@5.36.17", "", { "dependencies": { "@posthog/core": "1.32.3" }, "peerDependencies": { "rxjs": "^7.0.0" }, "optionalPeers": ["rxjs"] }, "sha512-ed1LT4a9hhiFJizB6XX7dkYYLVPAFHfUpkQSns7BRxoUyhFnvMq15QENKeAOUEKQgPmnaq2I+xNLdAHN0o9eAA=="], - "preact": ["preact@10.29.2", "", {}, "sha512-7tNmwg/7mzzAoB/8kSg6Hl37JraAZw3Z3A0JSY7VXlZwo82Xn0G7wKbNNs2qoF4ZEEsQGTwDAroNdqKs1ofJxQ=="], + "preact": ["preact@10.24.3", "", {}, "sha512-Z2dPnBnMUfyQfSQ+GBdsGa16hz35YmLmtTLhM169uW944hYL6xzTYkJjC07j+Wosz733pMWx0fgON3JNw1jJQA=="], "preact-render-to-string": ["preact-render-to-string@5.2.6", "", { "dependencies": { "pretty-format": "^3.8.0" }, "peerDependencies": { "preact": ">=10" } }, "sha512-JyhErpYOvBV1hEPwIxc/fHWXPfnEGdRKxc8gFdAZ7XV4tlzyzG847XAyEZqoDnynP88akM4eaHcSOzNcLWFguw=="], @@ -1396,8 +1382,6 @@ "resolve": ["resolve@2.0.0-next.7", "", { "dependencies": { "es-errors": "^1.3.0", "is-core-module": "^2.16.2", "node-exports-info": "^1.6.0", "object-keys": "^1.1.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-tqt+NBWwyaMgw3zDsnygx4CByWjQEJHOPMdslYhppaQSJUtL/D4JO9CcBBlhPoI8lz9oJIDXkwXfhF4aWqP8xQ=="], - "resolve-from": ["resolve-from@4.0.0", "", {}, "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="], - "resolve-pkg-maps": ["resolve-pkg-maps@1.0.0", "", {}, "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw=="], "restore-cursor": ["restore-cursor@5.1.0", "", { "dependencies": { "onetime": "^7.0.0", "signal-exit": "^4.1.0" } }, "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA=="], @@ -1502,7 +1486,7 @@ "strip-final-newline": ["strip-final-newline@2.0.0", "", {}, "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA=="], - "strip-json-comments": ["strip-json-comments@3.1.1", "", {}, "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig=="], + "strip-json-comments": ["strip-json-comments@2.0.1", "", {}, "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ=="], "stripe": ["stripe@16.12.0", "", { "dependencies": { "@types/node": ">=8.1.0", "qs": "^6.11.0" } }, "sha512-H7eFVLDxeTNNSn4JTRfL2//LzCbDrMSZ+2q1c7CanVWgK2qIW5TwS+0V7N9KcKZZNpYh/uCqK0PyZh/2UsaAtQ=="], @@ -1510,8 +1494,6 @@ "styled-jsx": ["styled-jsx@5.1.6", "", { "dependencies": { "client-only": "0.0.1" }, "peerDependencies": { "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0" } }, "sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA=="], - "supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], - "supports-preserve-symlinks-flag": ["supports-preserve-symlinks-flag@1.0.0", "", {}, "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w=="], "supports-terminal-graphics": ["supports-terminal-graphics@0.1.0", "", {}, "sha512-+KdfozhS0Fw8y5Sghw8kkZNGT8nWYzJ1EzcoIvVjxhl+26TJTs26y02yfBgvc1jh5AS/c8jcI3xtahhR95KRyQ=="], @@ -1658,8 +1640,6 @@ "zwitch": ["zwitch@2.0.4", "", {}, "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A=="], - "@auth/core/preact": ["preact@10.24.3", "", {}, "sha512-Z2dPnBnMUfyQfSQ+GBdsGa16hz35YmLmtTLhM169uW944hYL6xzTYkJjC07j+Wosz733pMWx0fgON3JNw1jJQA=="], - "@auth/core/preact-render-to-string": ["preact-render-to-string@6.5.11", "", { "peerDependencies": { "preact": ">=10" } }, "sha512-ubnauqoGczeGISiOh6RjX0/cdaF8v/oDXIjO85XALCQjwQP+SB4RDXXtvZ6yTYSjG+PC1QRP2AhPgCEsM2EvUw=="], "@codebuff/common/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], @@ -1670,11 +1650,7 @@ "@codebuff/sdk/ignore": ["ignore@7.0.5", "", {}, "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg=="], - "@eslint/eslintrc/ajv": ["ajv@6.15.0", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw=="], - - "@eslint/eslintrc/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], - - "@eslint/eslintrc/js-yaml": ["js-yaml@4.2.0", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-ePWsvanv0DWuDRsW8dnt+R4jQ31SCRCQ7hhNcPXZPsoBZiemuZNYGf7adZdqX2D86j6rvKp3RpCxVTSb8WQlOw=="], + "@eslint/config-array/minimatch": ["minimatch@10.2.5", "", { "dependencies": { "brace-expansion": "^5.0.5" } }, "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg=="], "@opentui/core/diff": ["diff@9.0.0", "", {}, "sha512-svtcdpS8CgJyqAjEQIXdb3OjhFVVYjzGAPO8WGCmRbrml64SPw/jJD4GoE98aR7r25A0XcgrK3F02yw9R/vhQw=="], @@ -1708,12 +1684,12 @@ "eslint/ajv": ["ajv@6.15.0", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw=="], - "eslint/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], - - "eslint/eslint-visitor-keys": ["eslint-visitor-keys@4.2.1", "", {}, "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ=="], + "eslint/eslint-visitor-keys": ["eslint-visitor-keys@5.0.1", "", {}, "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA=="], "eslint/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], + "eslint/minimatch": ["minimatch@10.2.5", "", { "dependencies": { "brace-expansion": "^5.0.5" } }, "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg=="], + "eslint-import-resolver-node/debug": ["debug@3.2.7", "", { "dependencies": { "ms": "^2.1.1" } }, "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ=="], "eslint-module-utils/debug": ["debug@3.2.7", "", { "dependencies": { "ms": "^2.1.1" } }, "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ=="], @@ -1724,7 +1700,7 @@ "eslint-plugin-import/tsconfig-paths": ["tsconfig-paths@3.15.0", "", { "dependencies": { "@types/json5": "^0.0.29", "json5": "^1.0.2", "minimist": "^1.2.6", "strip-bom": "^3.0.0" } }, "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg=="], - "espree/eslint-visitor-keys": ["eslint-visitor-keys@4.2.1", "", {}, "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ=="], + "espree/eslint-visitor-keys": ["eslint-visitor-keys@5.0.1", "", {}, "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA=="], "execa/onetime": ["onetime@5.1.2", "", { "dependencies": { "mimic-fn": "^2.1.0" } }, "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg=="], @@ -1752,16 +1728,12 @@ "plist/xmlbuilder": ["xmlbuilder@15.1.1", "", {}, "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg=="], - "rc/strip-json-comments": ["strip-json-comments@2.0.1", "", {}, "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ=="], - "react-devtools-core/ws": ["ws@7.5.11", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": "^5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-zS54Oen9bITtp7kp2XM3AydrCIq1D+HwJOuH+c+e4LfpL/lotP5osijd+UoMnxwAam1GN8R4KtLAyIrIcBNpiA=="], "react-reconciler/scheduler": ["scheduler@0.26.0", "", {}, "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA=="], "send/mime-types": ["mime-types@3.0.2", "", { "dependencies": { "mime-db": "^1.54.0" } }, "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A=="], - "slice-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], - "tar-stream/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=="], "ts-node/diff": ["diff@4.0.4", "", {}, "sha512-X07nttJQkwkfKfvTPG/KSnE2OMdcUCao6+eXF3wmnIQRn2aPAHH3VxDbDOdegkd6JbPsXqShpvEOHfAT+nCNwQ=="], @@ -1776,8 +1748,6 @@ "typescript-eslint/@typescript-eslint/utils": ["@typescript-eslint/utils@7.18.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@typescript-eslint/scope-manager": "7.18.0", "@typescript-eslint/types": "7.18.0", "@typescript-eslint/typescript-estree": "7.18.0" }, "peerDependencies": { "eslint": "^8.56.0" } }, "sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw=="], - "wrap-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], - "wrap-ansi/string-width": ["string-width@8.2.1", "", { "dependencies": { "get-east-asian-width": "^1.5.0", "strip-ansi": "^7.1.2" } }, "sha512-IIaP0g3iy9Cyy18w3M9YcaDudujEAVHKt3a3QJg1+sr/oX96TbaGUubG0hJyCjCBThFH+tFpcIyoUHUn1ogaLA=="], "yargs/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], @@ -1786,9 +1756,7 @@ "@codebuff/evals/pino/process-warning": ["process-warning@5.0.0", "", {}, "sha512-a39t9ApHNx2L4+HBnQKqxxHNs1r7KF+Intd8Q/g1bUh6q0WIp9voPXJ/x0j+ZL45KF1pJd9+q2jLIRMfvEshkA=="], - "@eslint/eslintrc/ajv/json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], - - "@eslint/eslintrc/js-yaml/argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="], + "@eslint/config-array/minimatch/brace-expansion": ["brace-expansion@5.0.6", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g=="], "@typescript-eslint/parser/@typescript-eslint/typescript-estree/minimatch": ["minimatch@9.0.9", "", { "dependencies": { "brace-expansion": "^2.0.2" } }, "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg=="], @@ -1802,10 +1770,14 @@ "cliui/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], + "cliui/wrap-ansi/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + "eslint-plugin-import/tsconfig-paths/json5": ["json5@1.0.2", "", { "dependencies": { "minimist": "^1.2.0" }, "bin": { "json5": "lib/cli.js" } }, "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA=="], "eslint/ajv/json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], + "eslint/minimatch/brace-expansion": ["brace-expansion@5.0.6", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g=="], + "express/mime-types/mime-db": ["mime-db@1.54.0", "", {}, "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ=="], "p-locate/p-limit/yocto-queue": ["yocto-queue@0.1.0", "", {}, "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="], @@ -1834,8 +1806,12 @@ "yargs/string-width/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + "@eslint/config-array/minimatch/brace-expansion/balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="], + "@typescript-eslint/parser/@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.1.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-WR1cURNjuvBLMZBMbqM0UoE+WAfdUcEV1ccD8PVBVOI+Z3ND4+SZbN8RsfT2bMuG1qwz5RFvPukSZm5fF2D5eA=="], + "eslint/minimatch/brace-expansion/balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="], + "typescript-eslint/@typescript-eslint/eslint-plugin/@typescript-eslint/scope-manager/@typescript-eslint/types": ["@typescript-eslint/types@7.18.0", "", {}, "sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ=="], "typescript-eslint/@typescript-eslint/eslint-plugin/@typescript-eslint/type-utils/@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@7.18.0", "", { "dependencies": { "@typescript-eslint/types": "7.18.0", "@typescript-eslint/visitor-keys": "7.18.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", "minimatch": "^9.0.4", "semver": "^7.6.0", "ts-api-utils": "^1.3.0" } }, "sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA=="], From 0d8dfcbe209f75ebf0dabcb073a7d6e727c37f2b Mon Sep 17 00:00:00 2001 From: codebuff public sync bot <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 11 Jun 2026 20:50:44 +0000 Subject: [PATCH 76/96] Sync public snapshot from freebuff-private Source: CodebuffAI/freebuff-private@ae8be53371d5dfed3a3f534b1b3a992656e2e8be --- bun.lock | 80 +++++++++++++++++++++++++++++++++++++------------------- 1 file changed, 53 insertions(+), 27 deletions(-) diff --git a/bun.lock b/bun.lock index e91492b646..9b30d0f9fd 100644 --- a/bun.lock +++ b/bun.lock @@ -240,15 +240,19 @@ "@eslint-community/regexpp": ["@eslint-community/regexpp@4.12.2", "", {}, "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew=="], - "@eslint/config-array": ["@eslint/config-array@0.23.5", "", { "dependencies": { "@eslint/object-schema": "^3.0.5", "debug": "^4.3.1", "minimatch": "^10.2.4" } }, "sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA=="], + "@eslint/config-array": ["@eslint/config-array@0.21.2", "", { "dependencies": { "@eslint/object-schema": "^2.1.7", "debug": "^4.3.1", "minimatch": "^3.1.5" } }, "sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw=="], - "@eslint/config-helpers": ["@eslint/config-helpers@0.6.0", "", { "dependencies": { "@eslint/core": "^1.2.1" } }, "sha512-ii6Bw9jJ2zi2cWA2Z+9/QZ/+3DX6kwaV5Q986D/CdP3Lap3w/pgQZ373FV7byY/i7L4IRH/G43I5dz1ClsCbpA=="], + "@eslint/config-helpers": ["@eslint/config-helpers@0.4.2", "", { "dependencies": { "@eslint/core": "^0.17.0" } }, "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw=="], - "@eslint/core": ["@eslint/core@1.2.1", "", { "dependencies": { "@types/json-schema": "^7.0.15" } }, "sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ=="], + "@eslint/core": ["@eslint/core@0.17.0", "", { "dependencies": { "@types/json-schema": "^7.0.15" } }, "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ=="], - "@eslint/object-schema": ["@eslint/object-schema@3.0.5", "", {}, "sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw=="], + "@eslint/eslintrc": ["@eslint/eslintrc@3.3.5", "", { "dependencies": { "ajv": "^6.14.0", "debug": "^4.3.2", "espree": "^10.0.1", "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.1", "minimatch": "^3.1.5", "strip-json-comments": "^3.1.1" } }, "sha512-4IlJx0X0qftVsN5E+/vGujTRIFtwuLbNsVUe7TO6zYPDR1O6nFwvwhIKEKSrl6dZchmYBITazxKoUYOjdtjlRg=="], - "@eslint/plugin-kit": ["@eslint/plugin-kit@0.7.2", "", { "dependencies": { "@eslint/core": "^1.2.1", "levn": "^0.4.1" } }, "sha512-+CNAzxglkrpNf/kKywqQfk74QjtceuOE7Qm+AF8miRvPF/wmmK5+OJOgVh3AVTT3RP2mH3+FOaxlE5v72owk0A=="], + "@eslint/js": ["@eslint/js@9.39.4", "", {}, "sha512-nE7DEIchvtiFTwBw4Lfbu59PG+kCofhjsKaCWzxTpt4lfRjRMqG6uMBzKXuEcyXhOHoUp9riAm7/aWYGhXZ9cw=="], + + "@eslint/object-schema": ["@eslint/object-schema@2.1.7", "", {}, "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA=="], + + "@eslint/plugin-kit": ["@eslint/plugin-kit@0.4.1", "", { "dependencies": { "@eslint/core": "^0.17.0", "levn": "^0.4.1" } }, "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA=="], "@gravity-ai/api": ["@gravity-ai/api@0.1.2", "", { "dependencies": { "axios": "^1.13.2" } }, "sha512-txsAhyzvwB/TNrj5R8DoNqw8afM3JY2ahl7aaeaD5ZsxP+7rxff7C7keGI7+gU2KT3d2Mcw4QB1nHhbTSCJYHw=="], @@ -464,8 +468,6 @@ "@types/diff": ["@types/diff@8.0.0", "", { "dependencies": { "diff": "*" } }, "sha512-o7jqJM04gfaYrdCecCVMbZhNdG6T1MHg/oQoRFdERLV+4d+V7FijhiEAbFu0Usww84Yijk9yH58U4Jk4HbtzZw=="], - "@types/esrecurse": ["@types/esrecurse@4.3.1", "", {}, "sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw=="], - "@types/estree": ["@types/estree@1.0.9", "", {}, "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg=="], "@types/js-yaml": ["@types/js-yaml@4.0.9", "", {}, "sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg=="], @@ -548,7 +550,7 @@ "ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="], - "ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], + "ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], "any-base": ["any-base@1.1.0", "", {}, "sha512-uMgjozySS8adZZYePpaWs8cxB9/kdzmpX6SgJZ+wbz1K5eYk5QMYDVJaZKhxyIHUdnnJkfR7SVgStgH7LkGUyg=="], @@ -624,6 +626,8 @@ "call-bound": ["call-bound@1.0.4", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "get-intrinsic": "^1.3.0" } }, "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg=="], + "callsites": ["callsites@3.1.0", "", {}, "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="], + "caniuse-lite": ["caniuse-lite@1.0.30001799", "", {}, "sha512-hG1bReV+OUU+MOqK4t/ZWI0tZOyz3rqS9XuhOUz1cIcbwBKjOyJEJuw9ER5JuNyqxNk8u/JUVbGibBOL1yrjFw=="], "canvas": ["canvas@3.2.3", "", { "dependencies": { "node-addon-api": "^7.0.0", "prebuild-install": "^7.1.3" } }, "sha512-PzE5nJZPz72YUAfo8oTp0u3fqqY7IzlTubneAihqDYAUcBk7ryeCmBbdJBEdaH0bptSOe2VT2Zwcb3UaFyaSWw=="], @@ -748,7 +752,7 @@ "escape-string-regexp": ["escape-string-regexp@4.0.0", "", {}, "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="], - "eslint": ["eslint@10.4.1", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.2", "@eslint/config-array": "^0.23.5", "@eslint/config-helpers": "^0.6.0", "@eslint/core": "^1.2.1", "@eslint/plugin-kit": "^0.7.2", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "ajv": "^6.14.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^9.1.2", "eslint-visitor-keys": "^5.0.1", "espree": "^11.2.0", "esquery": "^1.7.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "minimatch": "^10.2.4", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, "peerDependencies": { "jiti": "*" }, "optionalPeers": ["jiti"], "bin": { "eslint": "bin/eslint.js" } }, "sha512-AyIKhnOBuOAdueD7RB3xB+YeAWScb9jHsJBgH2Hcde8InP5JYhqrRR6iTMHyTEwgENK54Cp44e4v8BwNhsuHuw=="], + "eslint": ["eslint@9.39.4", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", "@eslint/config-array": "^0.21.2", "@eslint/config-helpers": "^0.4.2", "@eslint/core": "^0.17.0", "@eslint/eslintrc": "^3.3.5", "@eslint/js": "9.39.4", "@eslint/plugin-kit": "^0.4.1", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "ajv": "^6.14.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^8.4.0", "eslint-visitor-keys": "^4.2.1", "espree": "^10.4.0", "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.5", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, "peerDependencies": { "jiti": "*" }, "optionalPeers": ["jiti"], "bin": { "eslint": "bin/eslint.js" } }, "sha512-XoMjdBOwe/esVgEvLmNsD3IRHkm7fbKIUGvrleloJXUZgDHig2IPWNniv+GwjyJXzuNqVjlr5+4yVUZjycJwfQ=="], "eslint-config-prettier": ["eslint-config-prettier@9.1.2", "", { "peerDependencies": { "eslint": ">=7.0.0" }, "bin": { "eslint-config-prettier": "bin/cli.js" } }, "sha512-iI1f+D2ViGn+uvv5HuHVUamg8ll4tN+JRHGc6IJi4TP9Kl976C57fzPXgseXNs8v0iA8aSJpHsTWjDb9QJamGQ=="], @@ -760,11 +764,11 @@ "eslint-plugin-unused-imports": ["eslint-plugin-unused-imports@4.4.1", "", { "peerDependencies": { "@typescript-eslint/eslint-plugin": "^8.0.0-0 || ^7.0.0 || ^6.0.0 || ^5.0.0", "eslint": "^10.0.0 || ^9.0.0 || ^8.0.0" }, "optionalPeers": ["@typescript-eslint/eslint-plugin"] }, "sha512-oZGYUz1X3sRMGUB+0cZyK2VcvRX5lm/vB56PgNNcU+7ficUCKm66oZWKUubXWnOuPjQ8PvmXtCViXBMONPe7tQ=="], - "eslint-scope": ["eslint-scope@9.1.2", "", { "dependencies": { "@types/esrecurse": "^4.3.1", "@types/estree": "^1.0.8", "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ=="], + "eslint-scope": ["eslint-scope@8.4.0", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg=="], "eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="], - "espree": ["espree@11.2.0", "", { "dependencies": { "acorn": "^8.16.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^5.0.1" } }, "sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw=="], + "espree": ["espree@10.4.0", "", { "dependencies": { "acorn": "^8.15.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^4.2.1" } }, "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ=="], "esprima": ["esprima@4.0.1", "", { "bin": { "esparse": "./bin/esparse.js", "esvalidate": "./bin/esvalidate.js" } }, "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="], @@ -876,6 +880,8 @@ "glob-parent": ["glob-parent@6.0.2", "", { "dependencies": { "is-glob": "^4.0.3" } }, "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A=="], + "globals": ["globals@14.0.0", "", {}, "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ=="], + "globalthis": ["globalthis@1.0.4", "", { "dependencies": { "define-properties": "^1.2.1", "gopd": "^1.0.1" } }, "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ=="], "globby": ["globby@11.1.0", "", { "dependencies": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", "fast-glob": "^3.2.9", "ignore": "^5.2.0", "merge2": "^1.4.1", "slash": "^3.0.0" } }, "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g=="], @@ -890,6 +896,8 @@ "has-bigints": ["has-bigints@1.1.0", "", {}, "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg=="], + "has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], + "has-property-descriptors": ["has-property-descriptors@1.0.2", "", { "dependencies": { "es-define-property": "^1.0.0" } }, "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg=="], "has-proto": ["has-proto@1.2.0", "", { "dependencies": { "dunder-proto": "^1.0.0" } }, "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ=="], @@ -920,6 +928,8 @@ "immer": ["immer@10.2.0", "", {}, "sha512-d/+XTN3zfODyjr89gM3mPq1WNX2B8pYsu7eORitdwyA2sBubnTl3laYlBk4sXY5FUa5qTZGBDPJICVbvqzjlbw=="], + "import-fresh": ["import-fresh@3.3.1", "", { "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" } }, "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ=="], + "imurmurhash": ["imurmurhash@0.1.4", "", {}, "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA=="], "inherits": ["inherits@2.0.4", "", {}, "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="], @@ -1036,6 +1046,8 @@ "lodash": ["lodash@4.17.23", "", {}, "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w=="], + "lodash.merge": ["lodash.merge@4.6.2", "", {}, "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ=="], + "log-update": ["log-update@8.0.0", "", { "dependencies": { "ansi-escapes": "^7.3.0", "cli-cursor": "^5.0.0", "slice-ansi": "^9.0.0", "string-width": "^8.2.0", "strip-ansi": "^7.2.0", "wrap-ansi": "^10.0.0" } }, "sha512-lddSgOt3bPASrylL54ZSpy8nBHns+vBVSoILlVOx+dei300pnLRN958rj/EdlVLKuWlSESU3qdnDZdAI7FXYGg=="], "longest-streak": ["longest-streak@3.1.0", "", {}, "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g=="], @@ -1238,6 +1250,8 @@ "pako": ["pako@1.0.11", "", {}, "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw=="], + "parent-module": ["parent-module@1.0.1", "", { "dependencies": { "callsites": "^3.0.0" } }, "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g=="], + "parse-bmfont-ascii": ["parse-bmfont-ascii@1.0.6", "", {}, "sha512-U4RrVsUFCleIOBsIGYOMKjn9PavsGOXxbvYGtMOEfnId0SVNsgehXh1DxUdVPLoxd5mvcEtvmKs2Mmf0Mpa1ZA=="], "parse-bmfont-binary": ["parse-bmfont-binary@1.0.6", "", {}, "sha512-GxmsRea0wdGdYthjuUeWTMWPqm2+FAd4GI8vCvhgJsFnoGhTrLhXDDupwTo7rXVAgaLIGoVHDZS9p/5XbSqeWA=="], @@ -1310,7 +1324,7 @@ "posthog-node": ["posthog-node@5.36.17", "", { "dependencies": { "@posthog/core": "1.32.3" }, "peerDependencies": { "rxjs": "^7.0.0" }, "optionalPeers": ["rxjs"] }, "sha512-ed1LT4a9hhiFJizB6XX7dkYYLVPAFHfUpkQSns7BRxoUyhFnvMq15QENKeAOUEKQgPmnaq2I+xNLdAHN0o9eAA=="], - "preact": ["preact@10.24.3", "", {}, "sha512-Z2dPnBnMUfyQfSQ+GBdsGa16hz35YmLmtTLhM169uW944hYL6xzTYkJjC07j+Wosz733pMWx0fgON3JNw1jJQA=="], + "preact": ["preact@10.29.2", "", {}, "sha512-7tNmwg/7mzzAoB/8kSg6Hl37JraAZw3Z3A0JSY7VXlZwo82Xn0G7wKbNNs2qoF4ZEEsQGTwDAroNdqKs1ofJxQ=="], "preact-render-to-string": ["preact-render-to-string@5.2.6", "", { "dependencies": { "pretty-format": "^3.8.0" }, "peerDependencies": { "preact": ">=10" } }, "sha512-JyhErpYOvBV1hEPwIxc/fHWXPfnEGdRKxc8gFdAZ7XV4tlzyzG847XAyEZqoDnynP88akM4eaHcSOzNcLWFguw=="], @@ -1382,6 +1396,8 @@ "resolve": ["resolve@2.0.0-next.7", "", { "dependencies": { "es-errors": "^1.3.0", "is-core-module": "^2.16.2", "node-exports-info": "^1.6.0", "object-keys": "^1.1.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-tqt+NBWwyaMgw3zDsnygx4CByWjQEJHOPMdslYhppaQSJUtL/D4JO9CcBBlhPoI8lz9oJIDXkwXfhF4aWqP8xQ=="], + "resolve-from": ["resolve-from@4.0.0", "", {}, "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="], + "resolve-pkg-maps": ["resolve-pkg-maps@1.0.0", "", {}, "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw=="], "restore-cursor": ["restore-cursor@5.1.0", "", { "dependencies": { "onetime": "^7.0.0", "signal-exit": "^4.1.0" } }, "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA=="], @@ -1486,7 +1502,7 @@ "strip-final-newline": ["strip-final-newline@2.0.0", "", {}, "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA=="], - "strip-json-comments": ["strip-json-comments@2.0.1", "", {}, "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ=="], + "strip-json-comments": ["strip-json-comments@3.1.1", "", {}, "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig=="], "stripe": ["stripe@16.12.0", "", { "dependencies": { "@types/node": ">=8.1.0", "qs": "^6.11.0" } }, "sha512-H7eFVLDxeTNNSn4JTRfL2//LzCbDrMSZ+2q1c7CanVWgK2qIW5TwS+0V7N9KcKZZNpYh/uCqK0PyZh/2UsaAtQ=="], @@ -1494,6 +1510,8 @@ "styled-jsx": ["styled-jsx@5.1.6", "", { "dependencies": { "client-only": "0.0.1" }, "peerDependencies": { "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0" } }, "sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA=="], + "supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], + "supports-preserve-symlinks-flag": ["supports-preserve-symlinks-flag@1.0.0", "", {}, "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w=="], "supports-terminal-graphics": ["supports-terminal-graphics@0.1.0", "", {}, "sha512-+KdfozhS0Fw8y5Sghw8kkZNGT8nWYzJ1EzcoIvVjxhl+26TJTs26y02yfBgvc1jh5AS/c8jcI3xtahhR95KRyQ=="], @@ -1640,6 +1658,8 @@ "zwitch": ["zwitch@2.0.4", "", {}, "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A=="], + "@auth/core/preact": ["preact@10.24.3", "", {}, "sha512-Z2dPnBnMUfyQfSQ+GBdsGa16hz35YmLmtTLhM169uW944hYL6xzTYkJjC07j+Wosz733pMWx0fgON3JNw1jJQA=="], + "@auth/core/preact-render-to-string": ["preact-render-to-string@6.5.11", "", { "peerDependencies": { "preact": ">=10" } }, "sha512-ubnauqoGczeGISiOh6RjX0/cdaF8v/oDXIjO85XALCQjwQP+SB4RDXXtvZ6yTYSjG+PC1QRP2AhPgCEsM2EvUw=="], "@codebuff/common/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], @@ -1650,12 +1670,18 @@ "@codebuff/sdk/ignore": ["ignore@7.0.5", "", {}, "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg=="], - "@eslint/config-array/minimatch": ["minimatch@10.2.5", "", { "dependencies": { "brace-expansion": "^5.0.5" } }, "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg=="], + "@eslint/eslintrc/ajv": ["ajv@6.15.0", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw=="], + + "@eslint/eslintrc/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], + + "@eslint/eslintrc/js-yaml": ["js-yaml@4.2.0", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-ePWsvanv0DWuDRsW8dnt+R4jQ31SCRCQ7hhNcPXZPsoBZiemuZNYGf7adZdqX2D86j6rvKp3RpCxVTSb8WQlOw=="], "@opentui/core/diff": ["diff@9.0.0", "", {}, "sha512-svtcdpS8CgJyqAjEQIXdb3OjhFVVYjzGAPO8WGCmRbrml64SPw/jJD4GoE98aR7r25A0XcgrK3F02yw9R/vhQw=="], "@opentui/core/strip-ansi": ["strip-ansi@7.1.2", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA=="], + "@types/diff/diff": ["diff@9.0.0", "", {}, "sha512-svtcdpS8CgJyqAjEQIXdb3OjhFVVYjzGAPO8WGCmRbrml64SPw/jJD4GoE98aR7r25A0XcgrK3F02yw9R/vhQw=="], + "@typescript-eslint/eslint-plugin/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], "@typescript-eslint/parser/@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@7.18.0", "", { "dependencies": { "@typescript-eslint/types": "7.18.0", "@typescript-eslint/visitor-keys": "7.18.0" } }, "sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA=="], @@ -1684,11 +1710,11 @@ "eslint/ajv": ["ajv@6.15.0", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw=="], - "eslint/eslint-visitor-keys": ["eslint-visitor-keys@5.0.1", "", {}, "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA=="], + "eslint/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], - "eslint/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], + "eslint/eslint-visitor-keys": ["eslint-visitor-keys@4.2.1", "", {}, "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ=="], - "eslint/minimatch": ["minimatch@10.2.5", "", { "dependencies": { "brace-expansion": "^5.0.5" } }, "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg=="], + "eslint/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], "eslint-import-resolver-node/debug": ["debug@3.2.7", "", { "dependencies": { "ms": "^2.1.1" } }, "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ=="], @@ -1700,7 +1726,7 @@ "eslint-plugin-import/tsconfig-paths": ["tsconfig-paths@3.15.0", "", { "dependencies": { "@types/json5": "^0.0.29", "json5": "^1.0.2", "minimist": "^1.2.6", "strip-bom": "^3.0.0" } }, "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg=="], - "espree/eslint-visitor-keys": ["eslint-visitor-keys@5.0.1", "", {}, "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA=="], + "espree/eslint-visitor-keys": ["eslint-visitor-keys@4.2.1", "", {}, "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ=="], "execa/onetime": ["onetime@5.1.2", "", { "dependencies": { "mimic-fn": "^2.1.0" } }, "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg=="], @@ -1728,12 +1754,16 @@ "plist/xmlbuilder": ["xmlbuilder@15.1.1", "", {}, "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg=="], + "rc/strip-json-comments": ["strip-json-comments@2.0.1", "", {}, "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ=="], + "react-devtools-core/ws": ["ws@7.5.11", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": "^5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-zS54Oen9bITtp7kp2XM3AydrCIq1D+HwJOuH+c+e4LfpL/lotP5osijd+UoMnxwAam1GN8R4KtLAyIrIcBNpiA=="], "react-reconciler/scheduler": ["scheduler@0.26.0", "", {}, "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA=="], "send/mime-types": ["mime-types@3.0.2", "", { "dependencies": { "mime-db": "^1.54.0" } }, "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A=="], + "slice-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], + "tar-stream/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=="], "ts-node/diff": ["diff@4.0.4", "", {}, "sha512-X07nttJQkwkfKfvTPG/KSnE2OMdcUCao6+eXF3wmnIQRn2aPAHH3VxDbDOdegkd6JbPsXqShpvEOHfAT+nCNwQ=="], @@ -1748,6 +1778,8 @@ "typescript-eslint/@typescript-eslint/utils": ["@typescript-eslint/utils@7.18.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@typescript-eslint/scope-manager": "7.18.0", "@typescript-eslint/types": "7.18.0", "@typescript-eslint/typescript-estree": "7.18.0" }, "peerDependencies": { "eslint": "^8.56.0" } }, "sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw=="], + "wrap-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], + "wrap-ansi/string-width": ["string-width@8.2.1", "", { "dependencies": { "get-east-asian-width": "^1.5.0", "strip-ansi": "^7.1.2" } }, "sha512-IIaP0g3iy9Cyy18w3M9YcaDudujEAVHKt3a3QJg1+sr/oX96TbaGUubG0hJyCjCBThFH+tFpcIyoUHUn1ogaLA=="], "yargs/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], @@ -1756,7 +1788,9 @@ "@codebuff/evals/pino/process-warning": ["process-warning@5.0.0", "", {}, "sha512-a39t9ApHNx2L4+HBnQKqxxHNs1r7KF+Intd8Q/g1bUh6q0WIp9voPXJ/x0j+ZL45KF1pJd9+q2jLIRMfvEshkA=="], - "@eslint/config-array/minimatch/brace-expansion": ["brace-expansion@5.0.6", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g=="], + "@eslint/eslintrc/ajv/json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], + + "@eslint/eslintrc/js-yaml/argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="], "@typescript-eslint/parser/@typescript-eslint/typescript-estree/minimatch": ["minimatch@9.0.9", "", { "dependencies": { "brace-expansion": "^2.0.2" } }, "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg=="], @@ -1770,14 +1804,10 @@ "cliui/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], - "cliui/wrap-ansi/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], - "eslint-plugin-import/tsconfig-paths/json5": ["json5@1.0.2", "", { "dependencies": { "minimist": "^1.2.0" }, "bin": { "json5": "lib/cli.js" } }, "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA=="], "eslint/ajv/json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], - "eslint/minimatch/brace-expansion": ["brace-expansion@5.0.6", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g=="], - "express/mime-types/mime-db": ["mime-db@1.54.0", "", {}, "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ=="], "p-locate/p-limit/yocto-queue": ["yocto-queue@0.1.0", "", {}, "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="], @@ -1806,12 +1836,8 @@ "yargs/string-width/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], - "@eslint/config-array/minimatch/brace-expansion/balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="], - "@typescript-eslint/parser/@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.1.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-WR1cURNjuvBLMZBMbqM0UoE+WAfdUcEV1ccD8PVBVOI+Z3ND4+SZbN8RsfT2bMuG1qwz5RFvPukSZm5fF2D5eA=="], - "eslint/minimatch/brace-expansion/balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="], - "typescript-eslint/@typescript-eslint/eslint-plugin/@typescript-eslint/scope-manager/@typescript-eslint/types": ["@typescript-eslint/types@7.18.0", "", {}, "sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ=="], "typescript-eslint/@typescript-eslint/eslint-plugin/@typescript-eslint/type-utils/@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@7.18.0", "", { "dependencies": { "@typescript-eslint/types": "7.18.0", "@typescript-eslint/visitor-keys": "7.18.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", "minimatch": "^9.0.4", "semver": "^7.6.0", "ts-api-utils": "^1.3.0" } }, "sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA=="], From a066750bce962d24dbb0a7991b551c8ad7dbeb0b Mon Sep 17 00:00:00 2001 From: codebuff public sync bot <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 11 Jun 2026 20:56:24 +0000 Subject: [PATCH 77/96] Sync public snapshot from freebuff-private Source: CodebuffAI/freebuff-private@00a6b34b57ccec45ec27709c4c61b177d90be2c8 --- bun.lock | 74 ++++++++++++++++++++------------------------------------ 1 file changed, 26 insertions(+), 48 deletions(-) diff --git a/bun.lock b/bun.lock index 9b30d0f9fd..f66d2e33de 100644 --- a/bun.lock +++ b/bun.lock @@ -240,19 +240,15 @@ "@eslint-community/regexpp": ["@eslint-community/regexpp@4.12.2", "", {}, "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew=="], - "@eslint/config-array": ["@eslint/config-array@0.21.2", "", { "dependencies": { "@eslint/object-schema": "^2.1.7", "debug": "^4.3.1", "minimatch": "^3.1.5" } }, "sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw=="], + "@eslint/config-array": ["@eslint/config-array@0.23.5", "", { "dependencies": { "@eslint/object-schema": "^3.0.5", "debug": "^4.3.1", "minimatch": "^10.2.4" } }, "sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA=="], - "@eslint/config-helpers": ["@eslint/config-helpers@0.4.2", "", { "dependencies": { "@eslint/core": "^0.17.0" } }, "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw=="], + "@eslint/config-helpers": ["@eslint/config-helpers@0.6.0", "", { "dependencies": { "@eslint/core": "^1.2.1" } }, "sha512-ii6Bw9jJ2zi2cWA2Z+9/QZ/+3DX6kwaV5Q986D/CdP3Lap3w/pgQZ373FV7byY/i7L4IRH/G43I5dz1ClsCbpA=="], - "@eslint/core": ["@eslint/core@0.17.0", "", { "dependencies": { "@types/json-schema": "^7.0.15" } }, "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ=="], + "@eslint/core": ["@eslint/core@1.2.1", "", { "dependencies": { "@types/json-schema": "^7.0.15" } }, "sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ=="], - "@eslint/eslintrc": ["@eslint/eslintrc@3.3.5", "", { "dependencies": { "ajv": "^6.14.0", "debug": "^4.3.2", "espree": "^10.0.1", "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.1", "minimatch": "^3.1.5", "strip-json-comments": "^3.1.1" } }, "sha512-4IlJx0X0qftVsN5E+/vGujTRIFtwuLbNsVUe7TO6zYPDR1O6nFwvwhIKEKSrl6dZchmYBITazxKoUYOjdtjlRg=="], + "@eslint/object-schema": ["@eslint/object-schema@3.0.5", "", {}, "sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw=="], - "@eslint/js": ["@eslint/js@9.39.4", "", {}, "sha512-nE7DEIchvtiFTwBw4Lfbu59PG+kCofhjsKaCWzxTpt4lfRjRMqG6uMBzKXuEcyXhOHoUp9riAm7/aWYGhXZ9cw=="], - - "@eslint/object-schema": ["@eslint/object-schema@2.1.7", "", {}, "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA=="], - - "@eslint/plugin-kit": ["@eslint/plugin-kit@0.4.1", "", { "dependencies": { "@eslint/core": "^0.17.0", "levn": "^0.4.1" } }, "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA=="], + "@eslint/plugin-kit": ["@eslint/plugin-kit@0.7.2", "", { "dependencies": { "@eslint/core": "^1.2.1", "levn": "^0.4.1" } }, "sha512-+CNAzxglkrpNf/kKywqQfk74QjtceuOE7Qm+AF8miRvPF/wmmK5+OJOgVh3AVTT3RP2mH3+FOaxlE5v72owk0A=="], "@gravity-ai/api": ["@gravity-ai/api@0.1.2", "", { "dependencies": { "axios": "^1.13.2" } }, "sha512-txsAhyzvwB/TNrj5R8DoNqw8afM3JY2ahl7aaeaD5ZsxP+7rxff7C7keGI7+gU2KT3d2Mcw4QB1nHhbTSCJYHw=="], @@ -468,6 +464,8 @@ "@types/diff": ["@types/diff@8.0.0", "", { "dependencies": { "diff": "*" } }, "sha512-o7jqJM04gfaYrdCecCVMbZhNdG6T1MHg/oQoRFdERLV+4d+V7FijhiEAbFu0Usww84Yijk9yH58U4Jk4HbtzZw=="], + "@types/esrecurse": ["@types/esrecurse@4.3.1", "", {}, "sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw=="], + "@types/estree": ["@types/estree@1.0.9", "", {}, "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg=="], "@types/js-yaml": ["@types/js-yaml@4.0.9", "", {}, "sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg=="], @@ -550,7 +548,7 @@ "ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="], - "ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + "ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], "any-base": ["any-base@1.1.0", "", {}, "sha512-uMgjozySS8adZZYePpaWs8cxB9/kdzmpX6SgJZ+wbz1K5eYk5QMYDVJaZKhxyIHUdnnJkfR7SVgStgH7LkGUyg=="], @@ -626,8 +624,6 @@ "call-bound": ["call-bound@1.0.4", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "get-intrinsic": "^1.3.0" } }, "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg=="], - "callsites": ["callsites@3.1.0", "", {}, "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="], - "caniuse-lite": ["caniuse-lite@1.0.30001799", "", {}, "sha512-hG1bReV+OUU+MOqK4t/ZWI0tZOyz3rqS9XuhOUz1cIcbwBKjOyJEJuw9ER5JuNyqxNk8u/JUVbGibBOL1yrjFw=="], "canvas": ["canvas@3.2.3", "", { "dependencies": { "node-addon-api": "^7.0.0", "prebuild-install": "^7.1.3" } }, "sha512-PzE5nJZPz72YUAfo8oTp0u3fqqY7IzlTubneAihqDYAUcBk7ryeCmBbdJBEdaH0bptSOe2VT2Zwcb3UaFyaSWw=="], @@ -752,7 +748,7 @@ "escape-string-regexp": ["escape-string-regexp@4.0.0", "", {}, "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="], - "eslint": ["eslint@9.39.4", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", "@eslint/config-array": "^0.21.2", "@eslint/config-helpers": "^0.4.2", "@eslint/core": "^0.17.0", "@eslint/eslintrc": "^3.3.5", "@eslint/js": "9.39.4", "@eslint/plugin-kit": "^0.4.1", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "ajv": "^6.14.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^8.4.0", "eslint-visitor-keys": "^4.2.1", "espree": "^10.4.0", "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.5", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, "peerDependencies": { "jiti": "*" }, "optionalPeers": ["jiti"], "bin": { "eslint": "bin/eslint.js" } }, "sha512-XoMjdBOwe/esVgEvLmNsD3IRHkm7fbKIUGvrleloJXUZgDHig2IPWNniv+GwjyJXzuNqVjlr5+4yVUZjycJwfQ=="], + "eslint": ["eslint@10.4.1", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.2", "@eslint/config-array": "^0.23.5", "@eslint/config-helpers": "^0.6.0", "@eslint/core": "^1.2.1", "@eslint/plugin-kit": "^0.7.2", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "ajv": "^6.14.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^9.1.2", "eslint-visitor-keys": "^5.0.1", "espree": "^11.2.0", "esquery": "^1.7.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "minimatch": "^10.2.4", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, "peerDependencies": { "jiti": "*" }, "optionalPeers": ["jiti"], "bin": { "eslint": "bin/eslint.js" } }, "sha512-AyIKhnOBuOAdueD7RB3xB+YeAWScb9jHsJBgH2Hcde8InP5JYhqrRR6iTMHyTEwgENK54Cp44e4v8BwNhsuHuw=="], "eslint-config-prettier": ["eslint-config-prettier@9.1.2", "", { "peerDependencies": { "eslint": ">=7.0.0" }, "bin": { "eslint-config-prettier": "bin/cli.js" } }, "sha512-iI1f+D2ViGn+uvv5HuHVUamg8ll4tN+JRHGc6IJi4TP9Kl976C57fzPXgseXNs8v0iA8aSJpHsTWjDb9QJamGQ=="], @@ -764,11 +760,11 @@ "eslint-plugin-unused-imports": ["eslint-plugin-unused-imports@4.4.1", "", { "peerDependencies": { "@typescript-eslint/eslint-plugin": "^8.0.0-0 || ^7.0.0 || ^6.0.0 || ^5.0.0", "eslint": "^10.0.0 || ^9.0.0 || ^8.0.0" }, "optionalPeers": ["@typescript-eslint/eslint-plugin"] }, "sha512-oZGYUz1X3sRMGUB+0cZyK2VcvRX5lm/vB56PgNNcU+7ficUCKm66oZWKUubXWnOuPjQ8PvmXtCViXBMONPe7tQ=="], - "eslint-scope": ["eslint-scope@8.4.0", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg=="], + "eslint-scope": ["eslint-scope@9.1.2", "", { "dependencies": { "@types/esrecurse": "^4.3.1", "@types/estree": "^1.0.8", "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ=="], "eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="], - "espree": ["espree@10.4.0", "", { "dependencies": { "acorn": "^8.15.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^4.2.1" } }, "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ=="], + "espree": ["espree@11.2.0", "", { "dependencies": { "acorn": "^8.16.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^5.0.1" } }, "sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw=="], "esprima": ["esprima@4.0.1", "", { "bin": { "esparse": "./bin/esparse.js", "esvalidate": "./bin/esvalidate.js" } }, "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="], @@ -880,8 +876,6 @@ "glob-parent": ["glob-parent@6.0.2", "", { "dependencies": { "is-glob": "^4.0.3" } }, "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A=="], - "globals": ["globals@14.0.0", "", {}, "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ=="], - "globalthis": ["globalthis@1.0.4", "", { "dependencies": { "define-properties": "^1.2.1", "gopd": "^1.0.1" } }, "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ=="], "globby": ["globby@11.1.0", "", { "dependencies": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", "fast-glob": "^3.2.9", "ignore": "^5.2.0", "merge2": "^1.4.1", "slash": "^3.0.0" } }, "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g=="], @@ -896,8 +890,6 @@ "has-bigints": ["has-bigints@1.1.0", "", {}, "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg=="], - "has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], - "has-property-descriptors": ["has-property-descriptors@1.0.2", "", { "dependencies": { "es-define-property": "^1.0.0" } }, "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg=="], "has-proto": ["has-proto@1.2.0", "", { "dependencies": { "dunder-proto": "^1.0.0" } }, "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ=="], @@ -928,8 +920,6 @@ "immer": ["immer@10.2.0", "", {}, "sha512-d/+XTN3zfODyjr89gM3mPq1WNX2B8pYsu7eORitdwyA2sBubnTl3laYlBk4sXY5FUa5qTZGBDPJICVbvqzjlbw=="], - "import-fresh": ["import-fresh@3.3.1", "", { "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" } }, "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ=="], - "imurmurhash": ["imurmurhash@0.1.4", "", {}, "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA=="], "inherits": ["inherits@2.0.4", "", {}, "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="], @@ -1046,8 +1036,6 @@ "lodash": ["lodash@4.17.23", "", {}, "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w=="], - "lodash.merge": ["lodash.merge@4.6.2", "", {}, "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ=="], - "log-update": ["log-update@8.0.0", "", { "dependencies": { "ansi-escapes": "^7.3.0", "cli-cursor": "^5.0.0", "slice-ansi": "^9.0.0", "string-width": "^8.2.0", "strip-ansi": "^7.2.0", "wrap-ansi": "^10.0.0" } }, "sha512-lddSgOt3bPASrylL54ZSpy8nBHns+vBVSoILlVOx+dei300pnLRN958rj/EdlVLKuWlSESU3qdnDZdAI7FXYGg=="], "longest-streak": ["longest-streak@3.1.0", "", {}, "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g=="], @@ -1250,8 +1238,6 @@ "pako": ["pako@1.0.11", "", {}, "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw=="], - "parent-module": ["parent-module@1.0.1", "", { "dependencies": { "callsites": "^3.0.0" } }, "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g=="], - "parse-bmfont-ascii": ["parse-bmfont-ascii@1.0.6", "", {}, "sha512-U4RrVsUFCleIOBsIGYOMKjn9PavsGOXxbvYGtMOEfnId0SVNsgehXh1DxUdVPLoxd5mvcEtvmKs2Mmf0Mpa1ZA=="], "parse-bmfont-binary": ["parse-bmfont-binary@1.0.6", "", {}, "sha512-GxmsRea0wdGdYthjuUeWTMWPqm2+FAd4GI8vCvhgJsFnoGhTrLhXDDupwTo7rXVAgaLIGoVHDZS9p/5XbSqeWA=="], @@ -1396,8 +1382,6 @@ "resolve": ["resolve@2.0.0-next.7", "", { "dependencies": { "es-errors": "^1.3.0", "is-core-module": "^2.16.2", "node-exports-info": "^1.6.0", "object-keys": "^1.1.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-tqt+NBWwyaMgw3zDsnygx4CByWjQEJHOPMdslYhppaQSJUtL/D4JO9CcBBlhPoI8lz9oJIDXkwXfhF4aWqP8xQ=="], - "resolve-from": ["resolve-from@4.0.0", "", {}, "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="], - "resolve-pkg-maps": ["resolve-pkg-maps@1.0.0", "", {}, "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw=="], "restore-cursor": ["restore-cursor@5.1.0", "", { "dependencies": { "onetime": "^7.0.0", "signal-exit": "^4.1.0" } }, "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA=="], @@ -1502,7 +1486,7 @@ "strip-final-newline": ["strip-final-newline@2.0.0", "", {}, "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA=="], - "strip-json-comments": ["strip-json-comments@3.1.1", "", {}, "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig=="], + "strip-json-comments": ["strip-json-comments@2.0.1", "", {}, "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ=="], "stripe": ["stripe@16.12.0", "", { "dependencies": { "@types/node": ">=8.1.0", "qs": "^6.11.0" } }, "sha512-H7eFVLDxeTNNSn4JTRfL2//LzCbDrMSZ+2q1c7CanVWgK2qIW5TwS+0V7N9KcKZZNpYh/uCqK0PyZh/2UsaAtQ=="], @@ -1510,8 +1494,6 @@ "styled-jsx": ["styled-jsx@5.1.6", "", { "dependencies": { "client-only": "0.0.1" }, "peerDependencies": { "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0" } }, "sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA=="], - "supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], - "supports-preserve-symlinks-flag": ["supports-preserve-symlinks-flag@1.0.0", "", {}, "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w=="], "supports-terminal-graphics": ["supports-terminal-graphics@0.1.0", "", {}, "sha512-+KdfozhS0Fw8y5Sghw8kkZNGT8nWYzJ1EzcoIvVjxhl+26TJTs26y02yfBgvc1jh5AS/c8jcI3xtahhR95KRyQ=="], @@ -1670,11 +1652,7 @@ "@codebuff/sdk/ignore": ["ignore@7.0.5", "", {}, "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg=="], - "@eslint/eslintrc/ajv": ["ajv@6.15.0", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw=="], - - "@eslint/eslintrc/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], - - "@eslint/eslintrc/js-yaml": ["js-yaml@4.2.0", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-ePWsvanv0DWuDRsW8dnt+R4jQ31SCRCQ7hhNcPXZPsoBZiemuZNYGf7adZdqX2D86j6rvKp3RpCxVTSb8WQlOw=="], + "@eslint/config-array/minimatch": ["minimatch@10.2.5", "", { "dependencies": { "brace-expansion": "^5.0.5" } }, "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg=="], "@opentui/core/diff": ["diff@9.0.0", "", {}, "sha512-svtcdpS8CgJyqAjEQIXdb3OjhFVVYjzGAPO8WGCmRbrml64SPw/jJD4GoE98aR7r25A0XcgrK3F02yw9R/vhQw=="], @@ -1710,12 +1688,12 @@ "eslint/ajv": ["ajv@6.15.0", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw=="], - "eslint/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], - - "eslint/eslint-visitor-keys": ["eslint-visitor-keys@4.2.1", "", {}, "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ=="], + "eslint/eslint-visitor-keys": ["eslint-visitor-keys@5.0.1", "", {}, "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA=="], "eslint/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], + "eslint/minimatch": ["minimatch@10.2.5", "", { "dependencies": { "brace-expansion": "^5.0.5" } }, "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg=="], + "eslint-import-resolver-node/debug": ["debug@3.2.7", "", { "dependencies": { "ms": "^2.1.1" } }, "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ=="], "eslint-module-utils/debug": ["debug@3.2.7", "", { "dependencies": { "ms": "^2.1.1" } }, "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ=="], @@ -1726,7 +1704,7 @@ "eslint-plugin-import/tsconfig-paths": ["tsconfig-paths@3.15.0", "", { "dependencies": { "@types/json5": "^0.0.29", "json5": "^1.0.2", "minimist": "^1.2.6", "strip-bom": "^3.0.0" } }, "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg=="], - "espree/eslint-visitor-keys": ["eslint-visitor-keys@4.2.1", "", {}, "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ=="], + "espree/eslint-visitor-keys": ["eslint-visitor-keys@5.0.1", "", {}, "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA=="], "execa/onetime": ["onetime@5.1.2", "", { "dependencies": { "mimic-fn": "^2.1.0" } }, "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg=="], @@ -1754,16 +1732,12 @@ "plist/xmlbuilder": ["xmlbuilder@15.1.1", "", {}, "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg=="], - "rc/strip-json-comments": ["strip-json-comments@2.0.1", "", {}, "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ=="], - "react-devtools-core/ws": ["ws@7.5.11", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": "^5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-zS54Oen9bITtp7kp2XM3AydrCIq1D+HwJOuH+c+e4LfpL/lotP5osijd+UoMnxwAam1GN8R4KtLAyIrIcBNpiA=="], "react-reconciler/scheduler": ["scheduler@0.26.0", "", {}, "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA=="], "send/mime-types": ["mime-types@3.0.2", "", { "dependencies": { "mime-db": "^1.54.0" } }, "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A=="], - "slice-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], - "tar-stream/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=="], "ts-node/diff": ["diff@4.0.4", "", {}, "sha512-X07nttJQkwkfKfvTPG/KSnE2OMdcUCao6+eXF3wmnIQRn2aPAHH3VxDbDOdegkd6JbPsXqShpvEOHfAT+nCNwQ=="], @@ -1778,8 +1752,6 @@ "typescript-eslint/@typescript-eslint/utils": ["@typescript-eslint/utils@7.18.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@typescript-eslint/scope-manager": "7.18.0", "@typescript-eslint/types": "7.18.0", "@typescript-eslint/typescript-estree": "7.18.0" }, "peerDependencies": { "eslint": "^8.56.0" } }, "sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw=="], - "wrap-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], - "wrap-ansi/string-width": ["string-width@8.2.1", "", { "dependencies": { "get-east-asian-width": "^1.5.0", "strip-ansi": "^7.1.2" } }, "sha512-IIaP0g3iy9Cyy18w3M9YcaDudujEAVHKt3a3QJg1+sr/oX96TbaGUubG0hJyCjCBThFH+tFpcIyoUHUn1ogaLA=="], "yargs/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], @@ -1788,9 +1760,7 @@ "@codebuff/evals/pino/process-warning": ["process-warning@5.0.0", "", {}, "sha512-a39t9ApHNx2L4+HBnQKqxxHNs1r7KF+Intd8Q/g1bUh6q0WIp9voPXJ/x0j+ZL45KF1pJd9+q2jLIRMfvEshkA=="], - "@eslint/eslintrc/ajv/json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], - - "@eslint/eslintrc/js-yaml/argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="], + "@eslint/config-array/minimatch/brace-expansion": ["brace-expansion@5.0.6", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g=="], "@typescript-eslint/parser/@typescript-eslint/typescript-estree/minimatch": ["minimatch@9.0.9", "", { "dependencies": { "brace-expansion": "^2.0.2" } }, "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg=="], @@ -1804,10 +1774,14 @@ "cliui/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], + "cliui/wrap-ansi/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + "eslint-plugin-import/tsconfig-paths/json5": ["json5@1.0.2", "", { "dependencies": { "minimist": "^1.2.0" }, "bin": { "json5": "lib/cli.js" } }, "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA=="], "eslint/ajv/json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], + "eslint/minimatch/brace-expansion": ["brace-expansion@5.0.6", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g=="], + "express/mime-types/mime-db": ["mime-db@1.54.0", "", {}, "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ=="], "p-locate/p-limit/yocto-queue": ["yocto-queue@0.1.0", "", {}, "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="], @@ -1836,8 +1810,12 @@ "yargs/string-width/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + "@eslint/config-array/minimatch/brace-expansion/balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="], + "@typescript-eslint/parser/@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.1.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-WR1cURNjuvBLMZBMbqM0UoE+WAfdUcEV1ccD8PVBVOI+Z3ND4+SZbN8RsfT2bMuG1qwz5RFvPukSZm5fF2D5eA=="], + "eslint/minimatch/brace-expansion/balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="], + "typescript-eslint/@typescript-eslint/eslint-plugin/@typescript-eslint/scope-manager/@typescript-eslint/types": ["@typescript-eslint/types@7.18.0", "", {}, "sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ=="], "typescript-eslint/@typescript-eslint/eslint-plugin/@typescript-eslint/type-utils/@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@7.18.0", "", { "dependencies": { "@typescript-eslint/types": "7.18.0", "@typescript-eslint/visitor-keys": "7.18.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", "minimatch": "^9.0.4", "semver": "^7.6.0", "ts-api-utils": "^1.3.0" } }, "sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA=="], From 1efdae36956f76f24d9c77a9770d90f26c58d87e Mon Sep 17 00:00:00 2001 From: codebuff public sync bot <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 11 Jun 2026 21:25:57 +0000 Subject: [PATCH 78/96] Sync public snapshot from freebuff-private Source: CodebuffAI/freebuff-private@b829c65508118e396486d3e8effd2c5921f87044 --- bun.lock | 74 ++++++++++++++++++++++++++++++++++++-------------------- 1 file changed, 48 insertions(+), 26 deletions(-) diff --git a/bun.lock b/bun.lock index f66d2e33de..9b30d0f9fd 100644 --- a/bun.lock +++ b/bun.lock @@ -240,15 +240,19 @@ "@eslint-community/regexpp": ["@eslint-community/regexpp@4.12.2", "", {}, "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew=="], - "@eslint/config-array": ["@eslint/config-array@0.23.5", "", { "dependencies": { "@eslint/object-schema": "^3.0.5", "debug": "^4.3.1", "minimatch": "^10.2.4" } }, "sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA=="], + "@eslint/config-array": ["@eslint/config-array@0.21.2", "", { "dependencies": { "@eslint/object-schema": "^2.1.7", "debug": "^4.3.1", "minimatch": "^3.1.5" } }, "sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw=="], - "@eslint/config-helpers": ["@eslint/config-helpers@0.6.0", "", { "dependencies": { "@eslint/core": "^1.2.1" } }, "sha512-ii6Bw9jJ2zi2cWA2Z+9/QZ/+3DX6kwaV5Q986D/CdP3Lap3w/pgQZ373FV7byY/i7L4IRH/G43I5dz1ClsCbpA=="], + "@eslint/config-helpers": ["@eslint/config-helpers@0.4.2", "", { "dependencies": { "@eslint/core": "^0.17.0" } }, "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw=="], - "@eslint/core": ["@eslint/core@1.2.1", "", { "dependencies": { "@types/json-schema": "^7.0.15" } }, "sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ=="], + "@eslint/core": ["@eslint/core@0.17.0", "", { "dependencies": { "@types/json-schema": "^7.0.15" } }, "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ=="], - "@eslint/object-schema": ["@eslint/object-schema@3.0.5", "", {}, "sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw=="], + "@eslint/eslintrc": ["@eslint/eslintrc@3.3.5", "", { "dependencies": { "ajv": "^6.14.0", "debug": "^4.3.2", "espree": "^10.0.1", "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.1", "minimatch": "^3.1.5", "strip-json-comments": "^3.1.1" } }, "sha512-4IlJx0X0qftVsN5E+/vGujTRIFtwuLbNsVUe7TO6zYPDR1O6nFwvwhIKEKSrl6dZchmYBITazxKoUYOjdtjlRg=="], - "@eslint/plugin-kit": ["@eslint/plugin-kit@0.7.2", "", { "dependencies": { "@eslint/core": "^1.2.1", "levn": "^0.4.1" } }, "sha512-+CNAzxglkrpNf/kKywqQfk74QjtceuOE7Qm+AF8miRvPF/wmmK5+OJOgVh3AVTT3RP2mH3+FOaxlE5v72owk0A=="], + "@eslint/js": ["@eslint/js@9.39.4", "", {}, "sha512-nE7DEIchvtiFTwBw4Lfbu59PG+kCofhjsKaCWzxTpt4lfRjRMqG6uMBzKXuEcyXhOHoUp9riAm7/aWYGhXZ9cw=="], + + "@eslint/object-schema": ["@eslint/object-schema@2.1.7", "", {}, "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA=="], + + "@eslint/plugin-kit": ["@eslint/plugin-kit@0.4.1", "", { "dependencies": { "@eslint/core": "^0.17.0", "levn": "^0.4.1" } }, "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA=="], "@gravity-ai/api": ["@gravity-ai/api@0.1.2", "", { "dependencies": { "axios": "^1.13.2" } }, "sha512-txsAhyzvwB/TNrj5R8DoNqw8afM3JY2ahl7aaeaD5ZsxP+7rxff7C7keGI7+gU2KT3d2Mcw4QB1nHhbTSCJYHw=="], @@ -464,8 +468,6 @@ "@types/diff": ["@types/diff@8.0.0", "", { "dependencies": { "diff": "*" } }, "sha512-o7jqJM04gfaYrdCecCVMbZhNdG6T1MHg/oQoRFdERLV+4d+V7FijhiEAbFu0Usww84Yijk9yH58U4Jk4HbtzZw=="], - "@types/esrecurse": ["@types/esrecurse@4.3.1", "", {}, "sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw=="], - "@types/estree": ["@types/estree@1.0.9", "", {}, "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg=="], "@types/js-yaml": ["@types/js-yaml@4.0.9", "", {}, "sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg=="], @@ -548,7 +550,7 @@ "ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="], - "ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], + "ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], "any-base": ["any-base@1.1.0", "", {}, "sha512-uMgjozySS8adZZYePpaWs8cxB9/kdzmpX6SgJZ+wbz1K5eYk5QMYDVJaZKhxyIHUdnnJkfR7SVgStgH7LkGUyg=="], @@ -624,6 +626,8 @@ "call-bound": ["call-bound@1.0.4", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "get-intrinsic": "^1.3.0" } }, "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg=="], + "callsites": ["callsites@3.1.0", "", {}, "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="], + "caniuse-lite": ["caniuse-lite@1.0.30001799", "", {}, "sha512-hG1bReV+OUU+MOqK4t/ZWI0tZOyz3rqS9XuhOUz1cIcbwBKjOyJEJuw9ER5JuNyqxNk8u/JUVbGibBOL1yrjFw=="], "canvas": ["canvas@3.2.3", "", { "dependencies": { "node-addon-api": "^7.0.0", "prebuild-install": "^7.1.3" } }, "sha512-PzE5nJZPz72YUAfo8oTp0u3fqqY7IzlTubneAihqDYAUcBk7ryeCmBbdJBEdaH0bptSOe2VT2Zwcb3UaFyaSWw=="], @@ -748,7 +752,7 @@ "escape-string-regexp": ["escape-string-regexp@4.0.0", "", {}, "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="], - "eslint": ["eslint@10.4.1", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.2", "@eslint/config-array": "^0.23.5", "@eslint/config-helpers": "^0.6.0", "@eslint/core": "^1.2.1", "@eslint/plugin-kit": "^0.7.2", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "ajv": "^6.14.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^9.1.2", "eslint-visitor-keys": "^5.0.1", "espree": "^11.2.0", "esquery": "^1.7.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "minimatch": "^10.2.4", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, "peerDependencies": { "jiti": "*" }, "optionalPeers": ["jiti"], "bin": { "eslint": "bin/eslint.js" } }, "sha512-AyIKhnOBuOAdueD7RB3xB+YeAWScb9jHsJBgH2Hcde8InP5JYhqrRR6iTMHyTEwgENK54Cp44e4v8BwNhsuHuw=="], + "eslint": ["eslint@9.39.4", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", "@eslint/config-array": "^0.21.2", "@eslint/config-helpers": "^0.4.2", "@eslint/core": "^0.17.0", "@eslint/eslintrc": "^3.3.5", "@eslint/js": "9.39.4", "@eslint/plugin-kit": "^0.4.1", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "ajv": "^6.14.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^8.4.0", "eslint-visitor-keys": "^4.2.1", "espree": "^10.4.0", "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.5", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, "peerDependencies": { "jiti": "*" }, "optionalPeers": ["jiti"], "bin": { "eslint": "bin/eslint.js" } }, "sha512-XoMjdBOwe/esVgEvLmNsD3IRHkm7fbKIUGvrleloJXUZgDHig2IPWNniv+GwjyJXzuNqVjlr5+4yVUZjycJwfQ=="], "eslint-config-prettier": ["eslint-config-prettier@9.1.2", "", { "peerDependencies": { "eslint": ">=7.0.0" }, "bin": { "eslint-config-prettier": "bin/cli.js" } }, "sha512-iI1f+D2ViGn+uvv5HuHVUamg8ll4tN+JRHGc6IJi4TP9Kl976C57fzPXgseXNs8v0iA8aSJpHsTWjDb9QJamGQ=="], @@ -760,11 +764,11 @@ "eslint-plugin-unused-imports": ["eslint-plugin-unused-imports@4.4.1", "", { "peerDependencies": { "@typescript-eslint/eslint-plugin": "^8.0.0-0 || ^7.0.0 || ^6.0.0 || ^5.0.0", "eslint": "^10.0.0 || ^9.0.0 || ^8.0.0" }, "optionalPeers": ["@typescript-eslint/eslint-plugin"] }, "sha512-oZGYUz1X3sRMGUB+0cZyK2VcvRX5lm/vB56PgNNcU+7ficUCKm66oZWKUubXWnOuPjQ8PvmXtCViXBMONPe7tQ=="], - "eslint-scope": ["eslint-scope@9.1.2", "", { "dependencies": { "@types/esrecurse": "^4.3.1", "@types/estree": "^1.0.8", "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ=="], + "eslint-scope": ["eslint-scope@8.4.0", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg=="], "eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="], - "espree": ["espree@11.2.0", "", { "dependencies": { "acorn": "^8.16.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^5.0.1" } }, "sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw=="], + "espree": ["espree@10.4.0", "", { "dependencies": { "acorn": "^8.15.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^4.2.1" } }, "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ=="], "esprima": ["esprima@4.0.1", "", { "bin": { "esparse": "./bin/esparse.js", "esvalidate": "./bin/esvalidate.js" } }, "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="], @@ -876,6 +880,8 @@ "glob-parent": ["glob-parent@6.0.2", "", { "dependencies": { "is-glob": "^4.0.3" } }, "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A=="], + "globals": ["globals@14.0.0", "", {}, "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ=="], + "globalthis": ["globalthis@1.0.4", "", { "dependencies": { "define-properties": "^1.2.1", "gopd": "^1.0.1" } }, "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ=="], "globby": ["globby@11.1.0", "", { "dependencies": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", "fast-glob": "^3.2.9", "ignore": "^5.2.0", "merge2": "^1.4.1", "slash": "^3.0.0" } }, "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g=="], @@ -890,6 +896,8 @@ "has-bigints": ["has-bigints@1.1.0", "", {}, "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg=="], + "has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], + "has-property-descriptors": ["has-property-descriptors@1.0.2", "", { "dependencies": { "es-define-property": "^1.0.0" } }, "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg=="], "has-proto": ["has-proto@1.2.0", "", { "dependencies": { "dunder-proto": "^1.0.0" } }, "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ=="], @@ -920,6 +928,8 @@ "immer": ["immer@10.2.0", "", {}, "sha512-d/+XTN3zfODyjr89gM3mPq1WNX2B8pYsu7eORitdwyA2sBubnTl3laYlBk4sXY5FUa5qTZGBDPJICVbvqzjlbw=="], + "import-fresh": ["import-fresh@3.3.1", "", { "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" } }, "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ=="], + "imurmurhash": ["imurmurhash@0.1.4", "", {}, "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA=="], "inherits": ["inherits@2.0.4", "", {}, "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="], @@ -1036,6 +1046,8 @@ "lodash": ["lodash@4.17.23", "", {}, "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w=="], + "lodash.merge": ["lodash.merge@4.6.2", "", {}, "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ=="], + "log-update": ["log-update@8.0.0", "", { "dependencies": { "ansi-escapes": "^7.3.0", "cli-cursor": "^5.0.0", "slice-ansi": "^9.0.0", "string-width": "^8.2.0", "strip-ansi": "^7.2.0", "wrap-ansi": "^10.0.0" } }, "sha512-lddSgOt3bPASrylL54ZSpy8nBHns+vBVSoILlVOx+dei300pnLRN958rj/EdlVLKuWlSESU3qdnDZdAI7FXYGg=="], "longest-streak": ["longest-streak@3.1.0", "", {}, "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g=="], @@ -1238,6 +1250,8 @@ "pako": ["pako@1.0.11", "", {}, "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw=="], + "parent-module": ["parent-module@1.0.1", "", { "dependencies": { "callsites": "^3.0.0" } }, "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g=="], + "parse-bmfont-ascii": ["parse-bmfont-ascii@1.0.6", "", {}, "sha512-U4RrVsUFCleIOBsIGYOMKjn9PavsGOXxbvYGtMOEfnId0SVNsgehXh1DxUdVPLoxd5mvcEtvmKs2Mmf0Mpa1ZA=="], "parse-bmfont-binary": ["parse-bmfont-binary@1.0.6", "", {}, "sha512-GxmsRea0wdGdYthjuUeWTMWPqm2+FAd4GI8vCvhgJsFnoGhTrLhXDDupwTo7rXVAgaLIGoVHDZS9p/5XbSqeWA=="], @@ -1382,6 +1396,8 @@ "resolve": ["resolve@2.0.0-next.7", "", { "dependencies": { "es-errors": "^1.3.0", "is-core-module": "^2.16.2", "node-exports-info": "^1.6.0", "object-keys": "^1.1.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-tqt+NBWwyaMgw3zDsnygx4CByWjQEJHOPMdslYhppaQSJUtL/D4JO9CcBBlhPoI8lz9oJIDXkwXfhF4aWqP8xQ=="], + "resolve-from": ["resolve-from@4.0.0", "", {}, "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="], + "resolve-pkg-maps": ["resolve-pkg-maps@1.0.0", "", {}, "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw=="], "restore-cursor": ["restore-cursor@5.1.0", "", { "dependencies": { "onetime": "^7.0.0", "signal-exit": "^4.1.0" } }, "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA=="], @@ -1486,7 +1502,7 @@ "strip-final-newline": ["strip-final-newline@2.0.0", "", {}, "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA=="], - "strip-json-comments": ["strip-json-comments@2.0.1", "", {}, "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ=="], + "strip-json-comments": ["strip-json-comments@3.1.1", "", {}, "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig=="], "stripe": ["stripe@16.12.0", "", { "dependencies": { "@types/node": ">=8.1.0", "qs": "^6.11.0" } }, "sha512-H7eFVLDxeTNNSn4JTRfL2//LzCbDrMSZ+2q1c7CanVWgK2qIW5TwS+0V7N9KcKZZNpYh/uCqK0PyZh/2UsaAtQ=="], @@ -1494,6 +1510,8 @@ "styled-jsx": ["styled-jsx@5.1.6", "", { "dependencies": { "client-only": "0.0.1" }, "peerDependencies": { "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0" } }, "sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA=="], + "supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], + "supports-preserve-symlinks-flag": ["supports-preserve-symlinks-flag@1.0.0", "", {}, "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w=="], "supports-terminal-graphics": ["supports-terminal-graphics@0.1.0", "", {}, "sha512-+KdfozhS0Fw8y5Sghw8kkZNGT8nWYzJ1EzcoIvVjxhl+26TJTs26y02yfBgvc1jh5AS/c8jcI3xtahhR95KRyQ=="], @@ -1652,7 +1670,11 @@ "@codebuff/sdk/ignore": ["ignore@7.0.5", "", {}, "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg=="], - "@eslint/config-array/minimatch": ["minimatch@10.2.5", "", { "dependencies": { "brace-expansion": "^5.0.5" } }, "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg=="], + "@eslint/eslintrc/ajv": ["ajv@6.15.0", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw=="], + + "@eslint/eslintrc/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], + + "@eslint/eslintrc/js-yaml": ["js-yaml@4.2.0", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-ePWsvanv0DWuDRsW8dnt+R4jQ31SCRCQ7hhNcPXZPsoBZiemuZNYGf7adZdqX2D86j6rvKp3RpCxVTSb8WQlOw=="], "@opentui/core/diff": ["diff@9.0.0", "", {}, "sha512-svtcdpS8CgJyqAjEQIXdb3OjhFVVYjzGAPO8WGCmRbrml64SPw/jJD4GoE98aR7r25A0XcgrK3F02yw9R/vhQw=="], @@ -1688,11 +1710,11 @@ "eslint/ajv": ["ajv@6.15.0", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw=="], - "eslint/eslint-visitor-keys": ["eslint-visitor-keys@5.0.1", "", {}, "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA=="], + "eslint/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], - "eslint/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], + "eslint/eslint-visitor-keys": ["eslint-visitor-keys@4.2.1", "", {}, "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ=="], - "eslint/minimatch": ["minimatch@10.2.5", "", { "dependencies": { "brace-expansion": "^5.0.5" } }, "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg=="], + "eslint/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], "eslint-import-resolver-node/debug": ["debug@3.2.7", "", { "dependencies": { "ms": "^2.1.1" } }, "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ=="], @@ -1704,7 +1726,7 @@ "eslint-plugin-import/tsconfig-paths": ["tsconfig-paths@3.15.0", "", { "dependencies": { "@types/json5": "^0.0.29", "json5": "^1.0.2", "minimist": "^1.2.6", "strip-bom": "^3.0.0" } }, "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg=="], - "espree/eslint-visitor-keys": ["eslint-visitor-keys@5.0.1", "", {}, "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA=="], + "espree/eslint-visitor-keys": ["eslint-visitor-keys@4.2.1", "", {}, "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ=="], "execa/onetime": ["onetime@5.1.2", "", { "dependencies": { "mimic-fn": "^2.1.0" } }, "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg=="], @@ -1732,12 +1754,16 @@ "plist/xmlbuilder": ["xmlbuilder@15.1.1", "", {}, "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg=="], + "rc/strip-json-comments": ["strip-json-comments@2.0.1", "", {}, "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ=="], + "react-devtools-core/ws": ["ws@7.5.11", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": "^5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-zS54Oen9bITtp7kp2XM3AydrCIq1D+HwJOuH+c+e4LfpL/lotP5osijd+UoMnxwAam1GN8R4KtLAyIrIcBNpiA=="], "react-reconciler/scheduler": ["scheduler@0.26.0", "", {}, "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA=="], "send/mime-types": ["mime-types@3.0.2", "", { "dependencies": { "mime-db": "^1.54.0" } }, "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A=="], + "slice-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], + "tar-stream/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=="], "ts-node/diff": ["diff@4.0.4", "", {}, "sha512-X07nttJQkwkfKfvTPG/KSnE2OMdcUCao6+eXF3wmnIQRn2aPAHH3VxDbDOdegkd6JbPsXqShpvEOHfAT+nCNwQ=="], @@ -1752,6 +1778,8 @@ "typescript-eslint/@typescript-eslint/utils": ["@typescript-eslint/utils@7.18.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@typescript-eslint/scope-manager": "7.18.0", "@typescript-eslint/types": "7.18.0", "@typescript-eslint/typescript-estree": "7.18.0" }, "peerDependencies": { "eslint": "^8.56.0" } }, "sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw=="], + "wrap-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], + "wrap-ansi/string-width": ["string-width@8.2.1", "", { "dependencies": { "get-east-asian-width": "^1.5.0", "strip-ansi": "^7.1.2" } }, "sha512-IIaP0g3iy9Cyy18w3M9YcaDudujEAVHKt3a3QJg1+sr/oX96TbaGUubG0hJyCjCBThFH+tFpcIyoUHUn1ogaLA=="], "yargs/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], @@ -1760,7 +1788,9 @@ "@codebuff/evals/pino/process-warning": ["process-warning@5.0.0", "", {}, "sha512-a39t9ApHNx2L4+HBnQKqxxHNs1r7KF+Intd8Q/g1bUh6q0WIp9voPXJ/x0j+ZL45KF1pJd9+q2jLIRMfvEshkA=="], - "@eslint/config-array/minimatch/brace-expansion": ["brace-expansion@5.0.6", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g=="], + "@eslint/eslintrc/ajv/json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], + + "@eslint/eslintrc/js-yaml/argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="], "@typescript-eslint/parser/@typescript-eslint/typescript-estree/minimatch": ["minimatch@9.0.9", "", { "dependencies": { "brace-expansion": "^2.0.2" } }, "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg=="], @@ -1774,14 +1804,10 @@ "cliui/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], - "cliui/wrap-ansi/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], - "eslint-plugin-import/tsconfig-paths/json5": ["json5@1.0.2", "", { "dependencies": { "minimist": "^1.2.0" }, "bin": { "json5": "lib/cli.js" } }, "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA=="], "eslint/ajv/json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], - "eslint/minimatch/brace-expansion": ["brace-expansion@5.0.6", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g=="], - "express/mime-types/mime-db": ["mime-db@1.54.0", "", {}, "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ=="], "p-locate/p-limit/yocto-queue": ["yocto-queue@0.1.0", "", {}, "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="], @@ -1810,12 +1836,8 @@ "yargs/string-width/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], - "@eslint/config-array/minimatch/brace-expansion/balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="], - "@typescript-eslint/parser/@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.1.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-WR1cURNjuvBLMZBMbqM0UoE+WAfdUcEV1ccD8PVBVOI+Z3ND4+SZbN8RsfT2bMuG1qwz5RFvPukSZm5fF2D5eA=="], - "eslint/minimatch/brace-expansion/balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="], - "typescript-eslint/@typescript-eslint/eslint-plugin/@typescript-eslint/scope-manager/@typescript-eslint/types": ["@typescript-eslint/types@7.18.0", "", {}, "sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ=="], "typescript-eslint/@typescript-eslint/eslint-plugin/@typescript-eslint/type-utils/@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@7.18.0", "", { "dependencies": { "@typescript-eslint/types": "7.18.0", "@typescript-eslint/visitor-keys": "7.18.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", "minimatch": "^9.0.4", "semver": "^7.6.0", "ts-api-utils": "^1.3.0" } }, "sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA=="], From 98f1081689c48792cb8586eb4c230e7540e47565 Mon Sep 17 00:00:00 2001 From: codebuff public sync bot <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 11 Jun 2026 21:37:57 +0000 Subject: [PATCH 79/96] Sync public snapshot from freebuff-private Source: CodebuffAI/freebuff-private@8c3bb436e574205843d72ee0c211a8520b999d89 --- bun.lock | 2 -- .../util/__tests__/error-api-details.test.ts | 34 ++++++++++++++++++- common/src/util/error.ts | 33 ++++++++++++++++++ .../src/__tests__/loop-agent-steps.test.ts | 34 +++++++++++++++++++ packages/agent-runtime/src/run-agent-step.ts | 28 +++++++++------ sdk/src/impl/database.ts | 7 ++++ sdk/src/run.ts | 13 +++++-- 7 files changed, 135 insertions(+), 16 deletions(-) diff --git a/bun.lock b/bun.lock index 9b30d0f9fd..74aa75b250 100644 --- a/bun.lock +++ b/bun.lock @@ -1680,8 +1680,6 @@ "@opentui/core/strip-ansi": ["strip-ansi@7.1.2", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA=="], - "@types/diff/diff": ["diff@9.0.0", "", {}, "sha512-svtcdpS8CgJyqAjEQIXdb3OjhFVVYjzGAPO8WGCmRbrml64SPw/jJD4GoE98aR7r25A0XcgrK3F02yw9R/vhQw=="], - "@typescript-eslint/eslint-plugin/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], "@typescript-eslint/parser/@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@7.18.0", "", { "dependencies": { "@typescript-eslint/types": "7.18.0", "@typescript-eslint/visitor-keys": "7.18.0" } }, "sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA=="], diff --git a/common/src/util/__tests__/error-api-details.test.ts b/common/src/util/__tests__/error-api-details.test.ts index 23dcde8c80..29a1742a81 100644 --- a/common/src/util/__tests__/error-api-details.test.ts +++ b/common/src/util/__tests__/error-api-details.test.ts @@ -1,6 +1,6 @@ import { describe, expect, it } from 'bun:test' -import { extractApiErrorDetails } from '../error' +import { extractApiErrorDetails, isFetchIdleTimeoutError } from '../error' describe('extractApiErrorDetails', () => { it('extracts structured details from nested retry errors', () => { @@ -93,3 +93,35 @@ describe('extractApiErrorDetails', () => { }) }) }) + +describe('isFetchIdleTimeoutError', () => { + it('detects a DOMException-style TimeoutError by name', () => { + const error = new Error('The operation timed out.') + error.name = 'TimeoutError' + expect(isFetchIdleTimeoutError(error)).toBe(true) + }) + + it('detects the Bun timeout message without the TimeoutError name', () => { + expect(isFetchIdleTimeoutError(new Error('The operation timed out.'))).toBe( + true, + ) + }) + + it('detects a timeout nested inside an AI SDK RetryError wrapper', () => { + const timeoutError = new Error('The operation timed out.') + timeoutError.name = 'TimeoutError' + const retryError = new Error( + 'Failed after 3 attempts.', + ) as Error & { errors: unknown[] } + retryError.errors = [timeoutError] + expect(isFetchIdleTimeoutError(retryError)).toBe(true) + }) + + it('returns false for unrelated errors', () => { + expect(isFetchIdleTimeoutError(new Error('Internal Server Error'))).toBe( + false, + ) + expect(isFetchIdleTimeoutError(undefined)).toBe(false) + expect(isFetchIdleTimeoutError('The operation timed out.')).toBe(false) + }) +}) diff --git a/common/src/util/error.ts b/common/src/util/error.ts index 5436e68bea..32700911cd 100644 --- a/common/src/util/error.ts +++ b/common/src/util/error.ts @@ -361,6 +361,39 @@ export function extractApiErrorDetails(error: unknown): ApiErrorDetails { return {} } +/** + * Detects the runtime's fetch inactivity timeout (a DOMException named + * "TimeoutError"). Bun hardcodes this to fire after 5 minutes without + * receiving any bytes on a fetch response — there is no way to see it as + * anything but a dead connection, since the server heartbeats every 30s + * during streaming. Walks AI SDK RetryError wrappers and cause chains. + */ +export function isFetchIdleTimeoutError(error: unknown): boolean { + for (const candidate of getApiErrorCandidates(error)) { + if (!candidate || typeof candidate !== 'object') continue + const { name, message } = candidate as { name?: unknown; message?: unknown } + if ( + name === 'TimeoutError' || + (typeof message === 'string' && + message.toLowerCase().includes('the operation timed out')) + ) { + return true + } + } + return false +} + +/** + * User-facing explanation for the fetch idle timeout. The raw runtime message + * ("The operation timed out.") reads like a server failure; in practice it + * means no bytes reached this machine for 5 minutes, which points at the + * network path, since the server heartbeats every 30 seconds. + */ +export const FETCH_IDLE_TIMEOUT_USER_MESSAGE = + 'Connection timed out: no data was received from the server for 5 minutes, so the request was aborted.\n\n' + + 'The server sends a heartbeat every 30 seconds while responses stream, so this usually means the connection was silently dropped in transit (VPN, proxy, firewall, or flaky network) rather than a server outage.\n\n' + + 'Things to try: retry your message, check your network/VPN/proxy, or switch networks if it keeps happening.' + // Extended error properties that various libraries add to Error objects interface ExtendedErrorProperties { status?: number diff --git a/packages/agent-runtime/src/__tests__/loop-agent-steps.test.ts b/packages/agent-runtime/src/__tests__/loop-agent-steps.test.ts index ac563f9eb6..7e173177a8 100644 --- a/packages/agent-runtime/src/__tests__/loop-agent-steps.test.ts +++ b/packages/agent-runtime/src/__tests__/loop-agent-steps.test.ts @@ -1102,5 +1102,39 @@ describe('loopAgentSteps - runAgentStep vs runProgrammaticStep behavior', () => expect(result.output.statusCode).toBe(409) } }) + + it('should explain fetch idle timeouts instead of showing the raw runtime message', async () => { + const llmOnlyTemplate = { + ...mockTemplate, + handleSteps: undefined, + } + + const localAgentTemplates = { + 'test-agent': llmOnlyTemplate, + } + + // Bun aborts a fetch after 5 minutes without receiving bytes, throwing a + // DOMException named TimeoutError with this exact message. + loopAgentStepsBaseParams.promptAiSdkStream = async function* () { + const timeoutError = new Error('The operation timed out.') + timeoutError.name = 'TimeoutError' + throw timeoutError + } + + const result = await loopAgentSteps({ + ...loopAgentStepsBaseParams, + agentType: 'test-agent', + localAgentTemplates, + }) + + expect(result.output.type).toBe('error') + if (result.output.type === 'error') { + expect(result.output.message).toContain( + 'no data was received from the server for 5 minutes', + ) + expect(result.output.message).not.toContain('Agent run error:') + expect(result.output.message).not.toBe('The operation timed out.') + } + }) }) }) diff --git a/packages/agent-runtime/src/run-agent-step.ts b/packages/agent-runtime/src/run-agent-step.ts index ed07067063..b769a491b0 100644 --- a/packages/agent-runtime/src/run-agent-step.ts +++ b/packages/agent-runtime/src/run-agent-step.ts @@ -8,9 +8,11 @@ import { TOOLS_WHICH_WONT_FORCE_NEXT_STEP } from '@codebuff/common/tools/constan import { buildArray } from '@codebuff/common/util/array' import { AbortError, + FETCH_IDLE_TIMEOUT_USER_MESSAGE, extractApiErrorDetails, getErrorObject, isAbortError, + isFetchIdleTimeoutError, } from '@codebuff/common/util/error' import { serializeCacheDebugCorrelation } from '@codebuff/common/util/cache-debug' import { systemMessage, userMessage } from '@codebuff/common/util/messages' @@ -1163,14 +1165,19 @@ export async function loopAgentSteps( ) const apiErrorDetails = extractApiErrorDetails(error) + const isIdleTimeout = isFetchIdleTimeoutError(error) const hasServerMessage = apiErrorDetails.message !== undefined - const fallbackMessage = - error instanceof Error - ? error.message + - (apiErrorDetails.statusCode === undefined && error.stack - ? `\n\n${error.stack}` - : '') - : String(error) + let fallbackMessage: string + if (isIdleTimeout) { + fallbackMessage = FETCH_IDLE_TIMEOUT_USER_MESSAGE + } else if (error instanceof Error) { + const includeStack = + apiErrorDetails.statusCode === undefined && error.stack + fallbackMessage = + error.message + (includeStack ? `\n\n${error.stack}` : '') + } else { + fallbackMessage = String(error) + } const errorMessage = apiErrorDetails.message ?? fallbackMessage const statusCode = apiErrorDetails.statusCode @@ -1194,9 +1201,10 @@ export async function loopAgentSteps( agentState: currentAgentState, output: { type: 'error', - message: hasServerMessage - ? errorMessage - : 'Agent run error: ' + errorMessage, + message: + hasServerMessage || isIdleTimeout + ? errorMessage + : 'Agent run error: ' + errorMessage, ...(statusCode !== undefined && { statusCode }), ...(apiErrorDetails.errorCode !== undefined && { error: apiErrorDetails.errorCode, diff --git a/sdk/src/impl/database.ts b/sdk/src/impl/database.ts index 93c2355fe4..3a8e79572a 100644 --- a/sdk/src/impl/database.ts +++ b/sdk/src/impl/database.ts @@ -1,6 +1,7 @@ import { validateSingleAgent } from '@codebuff/common/templates/agent-validation' import { DynamicAgentTemplateSchema } from '@codebuff/common/types/dynamic-agent-template' import { getErrorObject } from '@codebuff/common/util/error' +import { truncateString } from '@codebuff/common/util/string' import z from 'zod/v4' import { WEBSITE_URL } from '../constants' @@ -355,6 +356,7 @@ export async function finishAgentRun( totalSteps, directCredits, totalCredits, + errorMessage, logger, } = params @@ -375,6 +377,11 @@ export async function finishAgentRun( totalSteps, directCredits, totalCredits, + // Truncate: errorMessage can include a full stack trace + errorMessage: + errorMessage === undefined + ? undefined + : truncateString(errorMessage, 5000), }), }, logger, diff --git a/sdk/src/run.ts b/sdk/src/run.ts index 0059d6c183..9cf942b4bb 100644 --- a/sdk/src/run.ts +++ b/sdk/src/run.ts @@ -19,7 +19,11 @@ import { import { toolNames } from '@codebuff/common/tools/constants' import { clientToolCallSchema } from '@codebuff/common/tools/list' import { AgentOutputSchema } from '@codebuff/common/types/session-state' -import { extractApiErrorDetails } from '@codebuff/common/util/error' +import { + FETCH_IDLE_TIMEOUT_USER_MESSAGE, + extractApiErrorDetails, + isFetchIdleTimeoutError, +} from '@codebuff/common/util/error' import { cloneDeep } from 'lodash' import { executeComposioToolViaServer } from './composio' @@ -561,8 +565,11 @@ async function runOnce({ }, signal: signal ?? new AbortController().signal, }).catch((error) => { - let errorMessage = - error instanceof Error ? error.message : String(error ?? '') + let errorMessage = isFetchIdleTimeoutError(error) + ? FETCH_IDLE_TIMEOUT_USER_MESSAGE + : error instanceof Error + ? error.message + : String(error ?? '') const apiErrorDetails = extractApiErrorDetails(error) const statusCode = apiErrorDetails.statusCode ?? getErrorStatusCode(error) const { From 8a4eab2f880d667f7427b9d6b48383946d39ddaa Mon Sep 17 00:00:00 2001 From: codebuff public sync bot <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 11 Jun 2026 21:48:25 +0000 Subject: [PATCH 80/96] Sync public snapshot from freebuff-private Source: CodebuffAI/freebuff-private@f52317951bc57a3b4bc163bdd2dcef2de413c902 --- bun.lock | 4 +- common/src/constants/freebuff-models.ts | 54 +++++++++++++++++++++++++ 2 files changed, 55 insertions(+), 3 deletions(-) diff --git a/bun.lock b/bun.lock index 74aa75b250..6bfe24d616 100644 --- a/bun.lock +++ b/bun.lock @@ -1324,7 +1324,7 @@ "posthog-node": ["posthog-node@5.36.17", "", { "dependencies": { "@posthog/core": "1.32.3" }, "peerDependencies": { "rxjs": "^7.0.0" }, "optionalPeers": ["rxjs"] }, "sha512-ed1LT4a9hhiFJizB6XX7dkYYLVPAFHfUpkQSns7BRxoUyhFnvMq15QENKeAOUEKQgPmnaq2I+xNLdAHN0o9eAA=="], - "preact": ["preact@10.29.2", "", {}, "sha512-7tNmwg/7mzzAoB/8kSg6Hl37JraAZw3Z3A0JSY7VXlZwo82Xn0G7wKbNNs2qoF4ZEEsQGTwDAroNdqKs1ofJxQ=="], + "preact": ["preact@10.24.3", "", {}, "sha512-Z2dPnBnMUfyQfSQ+GBdsGa16hz35YmLmtTLhM169uW944hYL6xzTYkJjC07j+Wosz733pMWx0fgON3JNw1jJQA=="], "preact-render-to-string": ["preact-render-to-string@5.2.6", "", { "dependencies": { "pretty-format": "^3.8.0" }, "peerDependencies": { "preact": ">=10" } }, "sha512-JyhErpYOvBV1hEPwIxc/fHWXPfnEGdRKxc8gFdAZ7XV4tlzyzG847XAyEZqoDnynP88akM4eaHcSOzNcLWFguw=="], @@ -1658,8 +1658,6 @@ "zwitch": ["zwitch@2.0.4", "", {}, "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A=="], - "@auth/core/preact": ["preact@10.24.3", "", {}, "sha512-Z2dPnBnMUfyQfSQ+GBdsGa16hz35YmLmtTLhM169uW944hYL6xzTYkJjC07j+Wosz733pMWx0fgON3JNw1jJQA=="], - "@auth/core/preact-render-to-string": ["preact-render-to-string@6.5.11", "", { "peerDependencies": { "preact": ">=10" } }, "sha512-ubnauqoGczeGISiOh6RjX0/cdaF8v/oDXIjO85XALCQjwQP+SB4RDXXtvZ6yTYSjG+PC1QRP2AhPgCEsM2EvUw=="], "@codebuff/common/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], diff --git a/common/src/constants/freebuff-models.ts b/common/src/constants/freebuff-models.ts index e6881d008c..971096f964 100644 --- a/common/src/constants/freebuff-models.ts +++ b/common/src/constants/freebuff-models.ts @@ -236,6 +236,60 @@ export const LIMITED_FREEBUFF_MODELS = LIMITED_FREEBUFF_MODEL_IDS.map( export type FreebuffAccessTier = 'full' | 'limited' +/** Access tier carried in the Freebuff Web Convex JWT. Extends the CLI tier + * with 'blocked' (Tor / corroborated anonymous network): the app still + * loads, but every agent send is rejected server-side. */ +export type FreebuffWebAccessTier = FreebuffAccessTier | 'blocked' + +/** Freebuff Web limited-tier session pool. Deliberately separate from the + * CLI's Postgres-backed session pool — enforced entirely in Convex. */ +export const FREEBUFF_WEB_LIMITED_SESSION_LIMIT = 5 +export const FREEBUFF_WEB_LIMITED_SESSION_LENGTH_MS = 60 * 60 * 1000 + +/** Models exempt from Freebuff Web geo limits: geo-limited users can run + * these without consuming limited sessions. Matches the shared limited + * model set (DeepSeek V4 Flash, MiMo 2.5); every other model stays + * geo-gated. Web-only — the CLI's limited pool is unaffected. */ +export const FREEBUFF_WEB_GEO_EXEMPT_MODEL_IDS = [ + FREEBUFF_DEEPSEEK_V4_FLASH_MODEL_ID, + FREEBUFF_MIMO_V25_MODEL_ID, +] as const + +export function isFreebuffWebGeoExemptModelId( + id: string | null | undefined, +): boolean { + if (!id) return false + return FREEBUFF_WEB_GEO_EXEMPT_MODEL_IDS.some((modelId) => modelId === id) +} + +/** Models a limited-tier Freebuff Web user may select: the geo-exempt models + * (unlimited) plus the shared limited set (session-gated). */ +export const FREEBUFF_WEB_LIMITED_MODEL_IDS = [ + ...new Set([ + ...FREEBUFF_WEB_GEO_EXEMPT_MODEL_IDS, + ...LIMITED_FREEBUFF_MODEL_IDS, + ]), +] + +export function isFreebuffWebModelAllowedForLimitedTier( + id: string | null | undefined, +): boolean { + if (!id) return false + return FREEBUFF_WEB_LIMITED_MODEL_IDS.some((modelId) => modelId === id) +} + +/** Coerce a limited-tier Freebuff Web selection (premium ids, stale + * localStorage values) to an allowed model. Falls back to the limited + * default (DeepSeek V4 Flash), which is geo-exempt, so limited users land + * on unlimited usage. */ +export function resolveFreebuffWebModelForLimitedTier( + id: string | null | undefined, +): string { + return isFreebuffWebModelAllowedForLimitedTier(id) + ? (id as string) + : LIMITED_FREEBUFF_MODEL_ID +} + export function getFreebuffModelsForAccessTier( accessTier: FreebuffAccessTier | null | undefined, ): readonly FreebuffModelOption[] { From 1556c67564a24180c30811b9c4275c2ad3b80580 Mon Sep 17 00:00:00 2001 From: codebuff public sync bot <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 11 Jun 2026 22:02:30 +0000 Subject: [PATCH 81/96] Sync public snapshot from freebuff-private Source: CodebuffAI/freebuff-private@9f8dcd1952c0386c4999052ad957c1a7748a05eb --- bun.lock | 4 +- cli/src/components/chat-input-bar.tsx | 13 ++++ cli/src/components/suggestion-menu.tsx | 8 ++ cli/src/project-files.ts | 4 + .../src/__tests__/project-file-tree.test.ts | 74 +++++++++++++++++++ common/src/project-file-tree.ts | 46 +++++++++--- 6 files changed, 139 insertions(+), 10 deletions(-) create mode 100644 common/src/__tests__/project-file-tree.test.ts diff --git a/bun.lock b/bun.lock index 6bfe24d616..74aa75b250 100644 --- a/bun.lock +++ b/bun.lock @@ -1324,7 +1324,7 @@ "posthog-node": ["posthog-node@5.36.17", "", { "dependencies": { "@posthog/core": "1.32.3" }, "peerDependencies": { "rxjs": "^7.0.0" }, "optionalPeers": ["rxjs"] }, "sha512-ed1LT4a9hhiFJizB6XX7dkYYLVPAFHfUpkQSns7BRxoUyhFnvMq15QENKeAOUEKQgPmnaq2I+xNLdAHN0o9eAA=="], - "preact": ["preact@10.24.3", "", {}, "sha512-Z2dPnBnMUfyQfSQ+GBdsGa16hz35YmLmtTLhM169uW944hYL6xzTYkJjC07j+Wosz733pMWx0fgON3JNw1jJQA=="], + "preact": ["preact@10.29.2", "", {}, "sha512-7tNmwg/7mzzAoB/8kSg6Hl37JraAZw3Z3A0JSY7VXlZwo82Xn0G7wKbNNs2qoF4ZEEsQGTwDAroNdqKs1ofJxQ=="], "preact-render-to-string": ["preact-render-to-string@5.2.6", "", { "dependencies": { "pretty-format": "^3.8.0" }, "peerDependencies": { "preact": ">=10" } }, "sha512-JyhErpYOvBV1hEPwIxc/fHWXPfnEGdRKxc8gFdAZ7XV4tlzyzG847XAyEZqoDnynP88akM4eaHcSOzNcLWFguw=="], @@ -1658,6 +1658,8 @@ "zwitch": ["zwitch@2.0.4", "", {}, "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A=="], + "@auth/core/preact": ["preact@10.24.3", "", {}, "sha512-Z2dPnBnMUfyQfSQ+GBdsGa16hz35YmLmtTLhM169uW944hYL6xzTYkJjC07j+Wosz733pMWx0fgON3JNw1jJQA=="], + "@auth/core/preact-render-to-string": ["preact-render-to-string@6.5.11", "", { "peerDependencies": { "preact": ">=10" } }, "sha512-ubnauqoGczeGISiOh6RjX0/cdaF8v/oDXIjO85XALCQjwQP+SB4RDXXtvZ6yTYSjG+PC1QRP2AhPgCEsM2EvUw=="], "@codebuff/common/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], diff --git a/cli/src/components/chat-input-bar.tsx b/cli/src/components/chat-input-bar.tsx index a95b8cbfb4..8f49844f36 100644 --- a/cli/src/components/chat-input-bar.tsx +++ b/cli/src/components/chat-input-bar.tsx @@ -1,3 +1,7 @@ +import { + isShallowScanRoot, + SHALLOW_SCAN_MAX_DEPTH, +} from '@codebuff/common/project-file-tree' import React from 'react' import { AgentModeToggle } from './agent-mode-toggle' @@ -10,6 +14,7 @@ import { PublishContainer } from './publish-container' import { SuggestionMenu, type SuggestionItem } from './suggestion-menu' import { useAskUserBridge } from '../hooks/use-ask-user-bridge' import { useEvent } from '../hooks/use-event' +import { tryGetProjectRoot } from '../project-files' import { useChatStore } from '../state/chat-store' import { shouldInterceptChatInputKey } from '../utils/chat-input-key-intercept' import { getInputModeConfig } from '../utils/input-modes' @@ -118,6 +123,12 @@ export const ChatInputBar = ({ const askUserState = useChatStore((state) => state.askUserState) const hasAnyPreview = hasSuggestionMenu + // In the home directory (or an ancestor) the file tree is only scanned a few + // levels deep, so tell the user why deeper files don't show up. + const mentionMenuFooter = isShallowScanRoot(tryGetProjectRoot()) + ? `Files shown up to ${SHALLOW_SCAN_MAX_DEPTH} levels deep — open a project folder for full results` + : undefined + // Increase menu size on larger screen heights const normalModeMaxVisible = terminalHeight > 35 ? 15 : 10 const { submitAnswers, skip } = useAskUserBridge() @@ -311,6 +322,7 @@ export const ChatInputBar = ({ maxVisible={5} prefix="@" onItemClick={onMentionItemClick} + footer={mentionMenuFooter} /> ) : null} ) : null} void + /** Muted hint line rendered below the suggestions */ + footer?: string } export const SuggestionMenu = ({ @@ -27,6 +29,7 @@ export const SuggestionMenu = ({ maxVisible, prefix = '/', onItemClick, + footer, }: SuggestionMenuProps) => { const theme = useTheme() const { terminalWidth } = useTerminalDimensions() @@ -202,6 +205,11 @@ export const SuggestionMenu = ({ onMouseOut={() => setHoveredIndex(null)} > {visibleItems.map(renderSuggestionItem)} + {footer ? ( + + {footer} + + ) : null} ) } diff --git a/cli/src/project-files.ts b/cli/src/project-files.ts index 6429fd97e8..99ffa73705 100644 --- a/cli/src/project-files.ts +++ b/cli/src/project-files.ts @@ -22,6 +22,10 @@ export function getProjectRoot() { return projectRoot } +export function tryGetProjectRoot() { + return projectRoot +} + export function getCurrentChatId() { if (!currentChatId) { currentChatId = new Date().toISOString().replace(/:/g, '-') diff --git a/common/src/__tests__/project-file-tree.test.ts b/common/src/__tests__/project-file-tree.test.ts new file mode 100644 index 0000000000..c0cd596482 --- /dev/null +++ b/common/src/__tests__/project-file-tree.test.ts @@ -0,0 +1,74 @@ +import os from 'os' +import path from 'path' + +import { describe, expect, it } from 'bun:test' + +import { + getAllPathsWithDirectories, + getProjectFileTree, +} from '../project-file-tree' +import { createMockFs } from '../testing/mocks/filesystem' + +/** + * Builds a mock fs from relative file paths under `root`, inferring + * intermediate directories. + */ +function createFsWithFiles(root: string, files: string[]) { + const fileRecords: Record = {} + const dirChildren: Record> = { [root]: new Set() } + for (const file of files) { + fileRecords[path.join(root, file)] = '' + let child = path.join(root, file) + let dir = path.dirname(child) + while (true) { + ;(dirChildren[dir] ??= new Set()).add(path.basename(child)) + if (dir === root) break + child = dir + dir = path.dirname(dir) + } + } + return createMockFs({ + files: fileRecords, + directories: Object.fromEntries( + Object.entries(dirChildren).map(([dir, names]) => [dir, [...names]]), + ), + }) +} + +describe('getProjectFileTree', () => { + it('scans the home directory shallowly instead of returning nothing', async () => { + const home = os.homedir() + const fs = createFsWithFiles(home, [ + 'top-level.txt', + 'proj/README.md', + 'proj/docs/guide.md', + 'proj/docs/deep/too-deep.md', + '.hidden/secret.txt', + ]) + + const tree = await getProjectFileTree({ projectRoot: home, fs }) + const paths = getAllPathsWithDirectories(tree).map((p) => p.path) + + // Files up to 3 levels deep are included + expect(paths).toContain('top-level.txt') + expect(paths).toContain(path.join('proj', 'README.md')) + expect(paths).toContain(path.join('proj', 'docs', 'guide.md')) + // The depth-3 directory shows up as a node, but its contents do not + expect(paths).toContain(path.join('proj', 'docs', 'deep')) + expect(paths).not.toContain( + path.join('proj', 'docs', 'deep', 'too-deep.md'), + ) + // Dotfiles are still excluded + expect(paths.some((p) => p.includes('.hidden'))).toBe(false) + }) + + it('scans regular project roots without a depth limit', async () => { + const root = '/repo' + const fs = createFsWithFiles(root, ['a/b/c/d/e.txt']) + + const tree = await getProjectFileTree({ projectRoot: root, fs }) + const paths = getAllPathsWithDirectories(tree).map((p) => p.path) + + expect(paths).toContain(path.join('a', 'b', 'c', 'd', 'e.txt')) + }) +}) diff --git a/common/src/project-file-tree.ts b/common/src/project-file-tree.ts index 20a2ddd017..bbd3e71cd0 100644 --- a/common/src/project-file-tree.ts +++ b/common/src/project-file-tree.ts @@ -40,6 +40,21 @@ function logFileTreeError( export const DEFAULT_MAX_FILES = 10_000 +// When the project root is the home directory (or an ancestor), a full scan +// could crawl the user's entire disk. Instead of disabling the file tree +// entirely, do a shallow capped scan so @ mentions still surface +// `project/docs/file.md`-style paths. +export const SHALLOW_SCAN_MAX_DEPTH = 3 +const SHALLOW_SCAN_MAX_FILES = 2_000 +const SHALLOW_SCAN_MAX_DIRS = 500 + +/** Whether `getProjectFileTree` will shallow-scan this root (see above). */ +export function isShallowScanRoot( + projectRoot: string | undefined, +): projectRoot is string { + return !!projectRoot && !isValidProjectRoot(projectRoot) +} + export async function getProjectFileTree(params: { projectRoot: string maxFiles?: number @@ -48,6 +63,8 @@ export async function getProjectFileTree(params: { const withDefaults = { maxFiles: DEFAULT_MAX_FILES, ...params } const { projectRoot, fs } = withDefaults let { maxFiles } = withDefaults + let maxDepth = Infinity + let maxDirs = Infinity const _start = Date.now() const defaultIgnore = ignore.default() @@ -55,9 +72,11 @@ export async function getProjectFileTree(params: { defaultIgnore.add(pattern) } - if (!isValidProjectRoot(projectRoot)) { + if (isShallowScanRoot(projectRoot)) { defaultIgnore.add('.*') - maxFiles = 0 + maxDepth = SHALLOW_SCAN_MAX_DEPTH + maxFiles = Math.min(maxFiles, SHALLOW_SCAN_MAX_FILES) + maxDirs = SHALLOW_SCAN_MAX_DIRS } const root: DirectoryNode = { @@ -70,17 +89,21 @@ export async function getProjectFileTree(params: { node: DirectoryNode fullPath: string ignore: ignore.Ignore + depth: number }[] = [ { node: root, fullPath: projectRoot, ignore: defaultIgnore, + depth: 0, }, ] let totalFiles = 0 + let dirsScanned = 0 - while (queue.length > 0 && totalFiles < maxFiles) { - const { node, fullPath, ignore: currentIgnore } = queue.shift()! + while (queue.length > 0 && totalFiles < maxFiles && dirsScanned < maxDirs) { + const { node, fullPath, ignore: currentIgnore, depth } = queue.shift()! + dirsScanned++ const parsedIgnore = await parseGitignore({ fullDirPath: fullPath, projectRoot, @@ -111,11 +134,16 @@ export async function getProjectFileTree(params: { filePath: relativeFilePath, } node.children.push(childNode) - queue.push({ - node: childNode, - fullPath: filePath, - ignore: mergedIgnore, - }) + // Past maxDepth the directory still shows up as a node above, but + // its contents are not scanned. + if (depth + 1 < maxDepth) { + queue.push({ + node: childNode, + fullPath: filePath, + ignore: mergedIgnore, + depth: depth + 1, + }) + } } else { const lastReadTime = stats.atimeMs node.children.push({ From 8f718da403f6d8dca208a1d8e1307c759418a35a Mon Sep 17 00:00:00 2001 From: codebuff public sync bot <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 11 Jun 2026 22:25:47 +0000 Subject: [PATCH 82/96] Sync public snapshot from freebuff-private Source: CodebuffAI/freebuff-private@341d1f7d39f92358c84f22036f6fd2aa25275672 --- bun.lock | 78 +++++++++++++++++++++----------------------------------- 1 file changed, 29 insertions(+), 49 deletions(-) diff --git a/bun.lock b/bun.lock index 74aa75b250..b4843b2987 100644 --- a/bun.lock +++ b/bun.lock @@ -240,19 +240,15 @@ "@eslint-community/regexpp": ["@eslint-community/regexpp@4.12.2", "", {}, "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew=="], - "@eslint/config-array": ["@eslint/config-array@0.21.2", "", { "dependencies": { "@eslint/object-schema": "^2.1.7", "debug": "^4.3.1", "minimatch": "^3.1.5" } }, "sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw=="], + "@eslint/config-array": ["@eslint/config-array@0.23.5", "", { "dependencies": { "@eslint/object-schema": "^3.0.5", "debug": "^4.3.1", "minimatch": "^10.2.4" } }, "sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA=="], - "@eslint/config-helpers": ["@eslint/config-helpers@0.4.2", "", { "dependencies": { "@eslint/core": "^0.17.0" } }, "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw=="], + "@eslint/config-helpers": ["@eslint/config-helpers@0.6.0", "", { "dependencies": { "@eslint/core": "^1.2.1" } }, "sha512-ii6Bw9jJ2zi2cWA2Z+9/QZ/+3DX6kwaV5Q986D/CdP3Lap3w/pgQZ373FV7byY/i7L4IRH/G43I5dz1ClsCbpA=="], - "@eslint/core": ["@eslint/core@0.17.0", "", { "dependencies": { "@types/json-schema": "^7.0.15" } }, "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ=="], + "@eslint/core": ["@eslint/core@1.2.1", "", { "dependencies": { "@types/json-schema": "^7.0.15" } }, "sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ=="], - "@eslint/eslintrc": ["@eslint/eslintrc@3.3.5", "", { "dependencies": { "ajv": "^6.14.0", "debug": "^4.3.2", "espree": "^10.0.1", "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.1", "minimatch": "^3.1.5", "strip-json-comments": "^3.1.1" } }, "sha512-4IlJx0X0qftVsN5E+/vGujTRIFtwuLbNsVUe7TO6zYPDR1O6nFwvwhIKEKSrl6dZchmYBITazxKoUYOjdtjlRg=="], + "@eslint/object-schema": ["@eslint/object-schema@3.0.5", "", {}, "sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw=="], - "@eslint/js": ["@eslint/js@9.39.4", "", {}, "sha512-nE7DEIchvtiFTwBw4Lfbu59PG+kCofhjsKaCWzxTpt4lfRjRMqG6uMBzKXuEcyXhOHoUp9riAm7/aWYGhXZ9cw=="], - - "@eslint/object-schema": ["@eslint/object-schema@2.1.7", "", {}, "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA=="], - - "@eslint/plugin-kit": ["@eslint/plugin-kit@0.4.1", "", { "dependencies": { "@eslint/core": "^0.17.0", "levn": "^0.4.1" } }, "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA=="], + "@eslint/plugin-kit": ["@eslint/plugin-kit@0.7.2", "", { "dependencies": { "@eslint/core": "^1.2.1", "levn": "^0.4.1" } }, "sha512-+CNAzxglkrpNf/kKywqQfk74QjtceuOE7Qm+AF8miRvPF/wmmK5+OJOgVh3AVTT3RP2mH3+FOaxlE5v72owk0A=="], "@gravity-ai/api": ["@gravity-ai/api@0.1.2", "", { "dependencies": { "axios": "^1.13.2" } }, "sha512-txsAhyzvwB/TNrj5R8DoNqw8afM3JY2ahl7aaeaD5ZsxP+7rxff7C7keGI7+gU2KT3d2Mcw4QB1nHhbTSCJYHw=="], @@ -468,6 +464,8 @@ "@types/diff": ["@types/diff@8.0.0", "", { "dependencies": { "diff": "*" } }, "sha512-o7jqJM04gfaYrdCecCVMbZhNdG6T1MHg/oQoRFdERLV+4d+V7FijhiEAbFu0Usww84Yijk9yH58U4Jk4HbtzZw=="], + "@types/esrecurse": ["@types/esrecurse@4.3.1", "", {}, "sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw=="], + "@types/estree": ["@types/estree@1.0.9", "", {}, "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg=="], "@types/js-yaml": ["@types/js-yaml@4.0.9", "", {}, "sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg=="], @@ -550,7 +548,7 @@ "ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="], - "ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + "ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], "any-base": ["any-base@1.1.0", "", {}, "sha512-uMgjozySS8adZZYePpaWs8cxB9/kdzmpX6SgJZ+wbz1K5eYk5QMYDVJaZKhxyIHUdnnJkfR7SVgStgH7LkGUyg=="], @@ -626,8 +624,6 @@ "call-bound": ["call-bound@1.0.4", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "get-intrinsic": "^1.3.0" } }, "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg=="], - "callsites": ["callsites@3.1.0", "", {}, "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="], - "caniuse-lite": ["caniuse-lite@1.0.30001799", "", {}, "sha512-hG1bReV+OUU+MOqK4t/ZWI0tZOyz3rqS9XuhOUz1cIcbwBKjOyJEJuw9ER5JuNyqxNk8u/JUVbGibBOL1yrjFw=="], "canvas": ["canvas@3.2.3", "", { "dependencies": { "node-addon-api": "^7.0.0", "prebuild-install": "^7.1.3" } }, "sha512-PzE5nJZPz72YUAfo8oTp0u3fqqY7IzlTubneAihqDYAUcBk7ryeCmBbdJBEdaH0bptSOe2VT2Zwcb3UaFyaSWw=="], @@ -752,7 +748,7 @@ "escape-string-regexp": ["escape-string-regexp@4.0.0", "", {}, "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="], - "eslint": ["eslint@9.39.4", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", "@eslint/config-array": "^0.21.2", "@eslint/config-helpers": "^0.4.2", "@eslint/core": "^0.17.0", "@eslint/eslintrc": "^3.3.5", "@eslint/js": "9.39.4", "@eslint/plugin-kit": "^0.4.1", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "ajv": "^6.14.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^8.4.0", "eslint-visitor-keys": "^4.2.1", "espree": "^10.4.0", "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.5", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, "peerDependencies": { "jiti": "*" }, "optionalPeers": ["jiti"], "bin": { "eslint": "bin/eslint.js" } }, "sha512-XoMjdBOwe/esVgEvLmNsD3IRHkm7fbKIUGvrleloJXUZgDHig2IPWNniv+GwjyJXzuNqVjlr5+4yVUZjycJwfQ=="], + "eslint": ["eslint@10.4.1", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.2", "@eslint/config-array": "^0.23.5", "@eslint/config-helpers": "^0.6.0", "@eslint/core": "^1.2.1", "@eslint/plugin-kit": "^0.7.2", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "ajv": "^6.14.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^9.1.2", "eslint-visitor-keys": "^5.0.1", "espree": "^11.2.0", "esquery": "^1.7.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "minimatch": "^10.2.4", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, "peerDependencies": { "jiti": "*" }, "optionalPeers": ["jiti"], "bin": { "eslint": "bin/eslint.js" } }, "sha512-AyIKhnOBuOAdueD7RB3xB+YeAWScb9jHsJBgH2Hcde8InP5JYhqrRR6iTMHyTEwgENK54Cp44e4v8BwNhsuHuw=="], "eslint-config-prettier": ["eslint-config-prettier@9.1.2", "", { "peerDependencies": { "eslint": ">=7.0.0" }, "bin": { "eslint-config-prettier": "bin/cli.js" } }, "sha512-iI1f+D2ViGn+uvv5HuHVUamg8ll4tN+JRHGc6IJi4TP9Kl976C57fzPXgseXNs8v0iA8aSJpHsTWjDb9QJamGQ=="], @@ -764,11 +760,11 @@ "eslint-plugin-unused-imports": ["eslint-plugin-unused-imports@4.4.1", "", { "peerDependencies": { "@typescript-eslint/eslint-plugin": "^8.0.0-0 || ^7.0.0 || ^6.0.0 || ^5.0.0", "eslint": "^10.0.0 || ^9.0.0 || ^8.0.0" }, "optionalPeers": ["@typescript-eslint/eslint-plugin"] }, "sha512-oZGYUz1X3sRMGUB+0cZyK2VcvRX5lm/vB56PgNNcU+7ficUCKm66oZWKUubXWnOuPjQ8PvmXtCViXBMONPe7tQ=="], - "eslint-scope": ["eslint-scope@8.4.0", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg=="], + "eslint-scope": ["eslint-scope@9.1.2", "", { "dependencies": { "@types/esrecurse": "^4.3.1", "@types/estree": "^1.0.8", "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ=="], "eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="], - "espree": ["espree@10.4.0", "", { "dependencies": { "acorn": "^8.15.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^4.2.1" } }, "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ=="], + "espree": ["espree@11.2.0", "", { "dependencies": { "acorn": "^8.16.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^5.0.1" } }, "sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw=="], "esprima": ["esprima@4.0.1", "", { "bin": { "esparse": "./bin/esparse.js", "esvalidate": "./bin/esvalidate.js" } }, "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="], @@ -852,7 +848,7 @@ "function-bind": ["function-bind@1.1.2", "", {}, "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="], - "function.prototype.name": ["function.prototype.name@1.1.8", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "define-properties": "^1.2.1", "functions-have-names": "^1.2.3", "hasown": "^2.0.2", "is-callable": "^1.2.7" } }, "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q=="], + "function.prototype.name": ["function.prototype.name@1.2.0", "", { "dependencies": { "call-bind": "^1.0.9", "call-bound": "^1.0.4", "es-define-property": "^1.0.1", "es-errors": "^1.3.0", "functions-have-names": "^1.2.3", "has-property-descriptors": "^1.0.2", "hasown": "^2.0.4", "is-callable": "^1.2.7", "is-document.all": "^1.0.0" } }, "sha512-jObKIik1P2QjPHP5nz5BaOtUlfgS0fWo8IUByNXkM+o+02sJOi94em77GwJKQSJ3gfPHdgzLNrHc1uokV4P/ew=="], "functions-have-names": ["functions-have-names@1.2.3", "", {}, "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ=="], @@ -880,8 +876,6 @@ "glob-parent": ["glob-parent@6.0.2", "", { "dependencies": { "is-glob": "^4.0.3" } }, "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A=="], - "globals": ["globals@14.0.0", "", {}, "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ=="], - "globalthis": ["globalthis@1.0.4", "", { "dependencies": { "define-properties": "^1.2.1", "gopd": "^1.0.1" } }, "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ=="], "globby": ["globby@11.1.0", "", { "dependencies": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", "fast-glob": "^3.2.9", "ignore": "^5.2.0", "merge2": "^1.4.1", "slash": "^3.0.0" } }, "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g=="], @@ -896,8 +890,6 @@ "has-bigints": ["has-bigints@1.1.0", "", {}, "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg=="], - "has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], - "has-property-descriptors": ["has-property-descriptors@1.0.2", "", { "dependencies": { "es-define-property": "^1.0.0" } }, "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg=="], "has-proto": ["has-proto@1.2.0", "", { "dependencies": { "dunder-proto": "^1.0.0" } }, "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ=="], @@ -928,8 +920,6 @@ "immer": ["immer@10.2.0", "", {}, "sha512-d/+XTN3zfODyjr89gM3mPq1WNX2B8pYsu7eORitdwyA2sBubnTl3laYlBk4sXY5FUa5qTZGBDPJICVbvqzjlbw=="], - "import-fresh": ["import-fresh@3.3.1", "", { "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" } }, "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ=="], - "imurmurhash": ["imurmurhash@0.1.4", "", {}, "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA=="], "inherits": ["inherits@2.0.4", "", {}, "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="], @@ -962,6 +952,8 @@ "is-docker": ["is-docker@3.0.0", "", { "bin": { "is-docker": "cli.js" } }, "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ=="], + "is-document.all": ["is-document.all@1.0.0", "", { "dependencies": { "call-bound": "^1.0.4" } }, "sha512-+XSoyS05OdBbhFuELhgTCpFNHkpBOJqtsZfUFFpe5QTw+9Sjbh8zitxhQkYAo6wV7e1Vb8cAPvpCk9jGam/82g=="], + "is-extendable": ["is-extendable@0.1.1", "", {}, "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw=="], "is-extglob": ["is-extglob@2.1.1", "", {}, "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ=="], @@ -1046,8 +1038,6 @@ "lodash": ["lodash@4.17.23", "", {}, "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w=="], - "lodash.merge": ["lodash.merge@4.6.2", "", {}, "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ=="], - "log-update": ["log-update@8.0.0", "", { "dependencies": { "ansi-escapes": "^7.3.0", "cli-cursor": "^5.0.0", "slice-ansi": "^9.0.0", "string-width": "^8.2.0", "strip-ansi": "^7.2.0", "wrap-ansi": "^10.0.0" } }, "sha512-lddSgOt3bPASrylL54ZSpy8nBHns+vBVSoILlVOx+dei300pnLRN958rj/EdlVLKuWlSESU3qdnDZdAI7FXYGg=="], "longest-streak": ["longest-streak@3.1.0", "", {}, "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g=="], @@ -1250,8 +1240,6 @@ "pako": ["pako@1.0.11", "", {}, "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw=="], - "parent-module": ["parent-module@1.0.1", "", { "dependencies": { "callsites": "^3.0.0" } }, "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g=="], - "parse-bmfont-ascii": ["parse-bmfont-ascii@1.0.6", "", {}, "sha512-U4RrVsUFCleIOBsIGYOMKjn9PavsGOXxbvYGtMOEfnId0SVNsgehXh1DxUdVPLoxd5mvcEtvmKs2Mmf0Mpa1ZA=="], "parse-bmfont-binary": ["parse-bmfont-binary@1.0.6", "", {}, "sha512-GxmsRea0wdGdYthjuUeWTMWPqm2+FAd4GI8vCvhgJsFnoGhTrLhXDDupwTo7rXVAgaLIGoVHDZS9p/5XbSqeWA=="], @@ -1396,8 +1384,6 @@ "resolve": ["resolve@2.0.0-next.7", "", { "dependencies": { "es-errors": "^1.3.0", "is-core-module": "^2.16.2", "node-exports-info": "^1.6.0", "object-keys": "^1.1.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-tqt+NBWwyaMgw3zDsnygx4CByWjQEJHOPMdslYhppaQSJUtL/D4JO9CcBBlhPoI8lz9oJIDXkwXfhF4aWqP8xQ=="], - "resolve-from": ["resolve-from@4.0.0", "", {}, "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="], - "resolve-pkg-maps": ["resolve-pkg-maps@1.0.0", "", {}, "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw=="], "restore-cursor": ["restore-cursor@5.1.0", "", { "dependencies": { "onetime": "^7.0.0", "signal-exit": "^4.1.0" } }, "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA=="], @@ -1502,7 +1488,7 @@ "strip-final-newline": ["strip-final-newline@2.0.0", "", {}, "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA=="], - "strip-json-comments": ["strip-json-comments@3.1.1", "", {}, "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig=="], + "strip-json-comments": ["strip-json-comments@2.0.1", "", {}, "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ=="], "stripe": ["stripe@16.12.0", "", { "dependencies": { "@types/node": ">=8.1.0", "qs": "^6.11.0" } }, "sha512-H7eFVLDxeTNNSn4JTRfL2//LzCbDrMSZ+2q1c7CanVWgK2qIW5TwS+0V7N9KcKZZNpYh/uCqK0PyZh/2UsaAtQ=="], @@ -1510,8 +1496,6 @@ "styled-jsx": ["styled-jsx@5.1.6", "", { "dependencies": { "client-only": "0.0.1" }, "peerDependencies": { "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0" } }, "sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA=="], - "supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], - "supports-preserve-symlinks-flag": ["supports-preserve-symlinks-flag@1.0.0", "", {}, "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w=="], "supports-terminal-graphics": ["supports-terminal-graphics@0.1.0", "", {}, "sha512-+KdfozhS0Fw8y5Sghw8kkZNGT8nWYzJ1EzcoIvVjxhl+26TJTs26y02yfBgvc1jh5AS/c8jcI3xtahhR95KRyQ=="], @@ -1670,11 +1654,7 @@ "@codebuff/sdk/ignore": ["ignore@7.0.5", "", {}, "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg=="], - "@eslint/eslintrc/ajv": ["ajv@6.15.0", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw=="], - - "@eslint/eslintrc/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], - - "@eslint/eslintrc/js-yaml": ["js-yaml@4.2.0", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-ePWsvanv0DWuDRsW8dnt+R4jQ31SCRCQ7hhNcPXZPsoBZiemuZNYGf7adZdqX2D86j6rvKp3RpCxVTSb8WQlOw=="], + "@eslint/config-array/minimatch": ["minimatch@10.2.5", "", { "dependencies": { "brace-expansion": "^5.0.5" } }, "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg=="], "@opentui/core/diff": ["diff@9.0.0", "", {}, "sha512-svtcdpS8CgJyqAjEQIXdb3OjhFVVYjzGAPO8WGCmRbrml64SPw/jJD4GoE98aR7r25A0XcgrK3F02yw9R/vhQw=="], @@ -1708,12 +1688,12 @@ "eslint/ajv": ["ajv@6.15.0", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw=="], - "eslint/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], - - "eslint/eslint-visitor-keys": ["eslint-visitor-keys@4.2.1", "", {}, "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ=="], + "eslint/eslint-visitor-keys": ["eslint-visitor-keys@5.0.1", "", {}, "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA=="], "eslint/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], + "eslint/minimatch": ["minimatch@10.2.5", "", { "dependencies": { "brace-expansion": "^5.0.5" } }, "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg=="], + "eslint-import-resolver-node/debug": ["debug@3.2.7", "", { "dependencies": { "ms": "^2.1.1" } }, "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ=="], "eslint-module-utils/debug": ["debug@3.2.7", "", { "dependencies": { "ms": "^2.1.1" } }, "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ=="], @@ -1724,7 +1704,7 @@ "eslint-plugin-import/tsconfig-paths": ["tsconfig-paths@3.15.0", "", { "dependencies": { "@types/json5": "^0.0.29", "json5": "^1.0.2", "minimist": "^1.2.6", "strip-bom": "^3.0.0" } }, "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg=="], - "espree/eslint-visitor-keys": ["eslint-visitor-keys@4.2.1", "", {}, "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ=="], + "espree/eslint-visitor-keys": ["eslint-visitor-keys@5.0.1", "", {}, "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA=="], "execa/onetime": ["onetime@5.1.2", "", { "dependencies": { "mimic-fn": "^2.1.0" } }, "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg=="], @@ -1752,16 +1732,12 @@ "plist/xmlbuilder": ["xmlbuilder@15.1.1", "", {}, "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg=="], - "rc/strip-json-comments": ["strip-json-comments@2.0.1", "", {}, "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ=="], - "react-devtools-core/ws": ["ws@7.5.11", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": "^5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-zS54Oen9bITtp7kp2XM3AydrCIq1D+HwJOuH+c+e4LfpL/lotP5osijd+UoMnxwAam1GN8R4KtLAyIrIcBNpiA=="], "react-reconciler/scheduler": ["scheduler@0.26.0", "", {}, "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA=="], "send/mime-types": ["mime-types@3.0.2", "", { "dependencies": { "mime-db": "^1.54.0" } }, "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A=="], - "slice-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], - "tar-stream/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=="], "ts-node/diff": ["diff@4.0.4", "", {}, "sha512-X07nttJQkwkfKfvTPG/KSnE2OMdcUCao6+eXF3wmnIQRn2aPAHH3VxDbDOdegkd6JbPsXqShpvEOHfAT+nCNwQ=="], @@ -1776,8 +1752,6 @@ "typescript-eslint/@typescript-eslint/utils": ["@typescript-eslint/utils@7.18.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@typescript-eslint/scope-manager": "7.18.0", "@typescript-eslint/types": "7.18.0", "@typescript-eslint/typescript-estree": "7.18.0" }, "peerDependencies": { "eslint": "^8.56.0" } }, "sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw=="], - "wrap-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], - "wrap-ansi/string-width": ["string-width@8.2.1", "", { "dependencies": { "get-east-asian-width": "^1.5.0", "strip-ansi": "^7.1.2" } }, "sha512-IIaP0g3iy9Cyy18w3M9YcaDudujEAVHKt3a3QJg1+sr/oX96TbaGUubG0hJyCjCBThFH+tFpcIyoUHUn1ogaLA=="], "yargs/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], @@ -1786,9 +1760,7 @@ "@codebuff/evals/pino/process-warning": ["process-warning@5.0.0", "", {}, "sha512-a39t9ApHNx2L4+HBnQKqxxHNs1r7KF+Intd8Q/g1bUh6q0WIp9voPXJ/x0j+ZL45KF1pJd9+q2jLIRMfvEshkA=="], - "@eslint/eslintrc/ajv/json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], - - "@eslint/eslintrc/js-yaml/argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="], + "@eslint/config-array/minimatch/brace-expansion": ["brace-expansion@5.0.6", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g=="], "@typescript-eslint/parser/@typescript-eslint/typescript-estree/minimatch": ["minimatch@9.0.9", "", { "dependencies": { "brace-expansion": "^2.0.2" } }, "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg=="], @@ -1802,10 +1774,14 @@ "cliui/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], + "cliui/wrap-ansi/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + "eslint-plugin-import/tsconfig-paths/json5": ["json5@1.0.2", "", { "dependencies": { "minimist": "^1.2.0" }, "bin": { "json5": "lib/cli.js" } }, "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA=="], "eslint/ajv/json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], + "eslint/minimatch/brace-expansion": ["brace-expansion@5.0.6", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g=="], + "express/mime-types/mime-db": ["mime-db@1.54.0", "", {}, "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ=="], "p-locate/p-limit/yocto-queue": ["yocto-queue@0.1.0", "", {}, "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="], @@ -1834,8 +1810,12 @@ "yargs/string-width/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + "@eslint/config-array/minimatch/brace-expansion/balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="], + "@typescript-eslint/parser/@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.1.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-WR1cURNjuvBLMZBMbqM0UoE+WAfdUcEV1ccD8PVBVOI+Z3ND4+SZbN8RsfT2bMuG1qwz5RFvPukSZm5fF2D5eA=="], + "eslint/minimatch/brace-expansion/balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="], + "typescript-eslint/@typescript-eslint/eslint-plugin/@typescript-eslint/scope-manager/@typescript-eslint/types": ["@typescript-eslint/types@7.18.0", "", {}, "sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ=="], "typescript-eslint/@typescript-eslint/eslint-plugin/@typescript-eslint/type-utils/@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@7.18.0", "", { "dependencies": { "@typescript-eslint/types": "7.18.0", "@typescript-eslint/visitor-keys": "7.18.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", "minimatch": "^9.0.4", "semver": "^7.6.0", "ts-api-utils": "^1.3.0" } }, "sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA=="], From e465ae1162773c18ff74e53eb7de79d21fd76589 Mon Sep 17 00:00:00 2001 From: codebuff public sync bot <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 11 Jun 2026 22:39:18 +0000 Subject: [PATCH 83/96] Sync public snapshot from freebuff-private Source: CodebuffAI/freebuff-private@0ddf40b6cd22f378b538e14508bdb2ae5e952a7e --- bun.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/bun.lock b/bun.lock index b4843b2987..5b0517a30e 100644 --- a/bun.lock +++ b/bun.lock @@ -1312,7 +1312,7 @@ "posthog-node": ["posthog-node@5.36.17", "", { "dependencies": { "@posthog/core": "1.32.3" }, "peerDependencies": { "rxjs": "^7.0.0" }, "optionalPeers": ["rxjs"] }, "sha512-ed1LT4a9hhiFJizB6XX7dkYYLVPAFHfUpkQSns7BRxoUyhFnvMq15QENKeAOUEKQgPmnaq2I+xNLdAHN0o9eAA=="], - "preact": ["preact@10.29.2", "", {}, "sha512-7tNmwg/7mzzAoB/8kSg6Hl37JraAZw3Z3A0JSY7VXlZwo82Xn0G7wKbNNs2qoF4ZEEsQGTwDAroNdqKs1ofJxQ=="], + "preact": ["preact@10.24.3", "", {}, "sha512-Z2dPnBnMUfyQfSQ+GBdsGa16hz35YmLmtTLhM169uW944hYL6xzTYkJjC07j+Wosz733pMWx0fgON3JNw1jJQA=="], "preact-render-to-string": ["preact-render-to-string@5.2.6", "", { "dependencies": { "pretty-format": "^3.8.0" }, "peerDependencies": { "preact": ">=10" } }, "sha512-JyhErpYOvBV1hEPwIxc/fHWXPfnEGdRKxc8gFdAZ7XV4tlzyzG847XAyEZqoDnynP88akM4eaHcSOzNcLWFguw=="], @@ -1642,8 +1642,6 @@ "zwitch": ["zwitch@2.0.4", "", {}, "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A=="], - "@auth/core/preact": ["preact@10.24.3", "", {}, "sha512-Z2dPnBnMUfyQfSQ+GBdsGa16hz35YmLmtTLhM169uW944hYL6xzTYkJjC07j+Wosz733pMWx0fgON3JNw1jJQA=="], - "@auth/core/preact-render-to-string": ["preact-render-to-string@6.5.11", "", { "peerDependencies": { "preact": ">=10" } }, "sha512-ubnauqoGczeGISiOh6RjX0/cdaF8v/oDXIjO85XALCQjwQP+SB4RDXXtvZ6yTYSjG+PC1QRP2AhPgCEsM2EvUw=="], "@codebuff/common/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], @@ -1660,6 +1658,8 @@ "@opentui/core/strip-ansi": ["strip-ansi@7.1.2", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA=="], + "@types/diff/diff": ["diff@9.0.0", "", {}, "sha512-svtcdpS8CgJyqAjEQIXdb3OjhFVVYjzGAPO8WGCmRbrml64SPw/jJD4GoE98aR7r25A0XcgrK3F02yw9R/vhQw=="], + "@typescript-eslint/eslint-plugin/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], "@typescript-eslint/parser/@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@7.18.0", "", { "dependencies": { "@typescript-eslint/types": "7.18.0", "@typescript-eslint/visitor-keys": "7.18.0" } }, "sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA=="], From e19e6d482b0494cf00df4fc95da7e70c6aaadb78 Mon Sep 17 00:00:00 2001 From: codebuff public sync bot <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 11 Jun 2026 22:48:08 +0000 Subject: [PATCH 84/96] Sync public snapshot from freebuff-private Source: CodebuffAI/freebuff-private@c1d67ed30dae2a3919143012ad0fc42506eb3557 --- agents/base2/base2.ts | 2 ++ bun.lock | 6 +++--- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/agents/base2/base2.ts b/agents/base2/base2.ts index 63bbd6de80..f4e68b9d76 100644 --- a/agents/base2/base2.ts +++ b/agents/base2/base2.ts @@ -603,6 +603,8 @@ function buildImplementationStepPrompt({ isFree && !noReview && `You must spawn a ${freeCodeReviewerAgentId} to review the changes after you have implemented the changes and in parallel with typechecking or testing.`, + (isDefault || isMax || (isFree && !noReview)) && + `Don't spawn a code reviewer if you haven't made code changes, e.g. when you only wrote a plan or answered a question.`, `When the user request is complete, summarize your changes in a sentence${isFast ? '' : ' or a few short bullet points'}.${isSonnet ? " Don't create any summary markdown files or example documentation files, unless asked by the user." : ''}.`, !noAskUser && `At the end of your turn, you must use the suggest_followups tool to suggest around 3 next steps the user might want to take even if the user just asks a question.`, diff --git a/bun.lock b/bun.lock index 5b0517a30e..b4843b2987 100644 --- a/bun.lock +++ b/bun.lock @@ -1312,7 +1312,7 @@ "posthog-node": ["posthog-node@5.36.17", "", { "dependencies": { "@posthog/core": "1.32.3" }, "peerDependencies": { "rxjs": "^7.0.0" }, "optionalPeers": ["rxjs"] }, "sha512-ed1LT4a9hhiFJizB6XX7dkYYLVPAFHfUpkQSns7BRxoUyhFnvMq15QENKeAOUEKQgPmnaq2I+xNLdAHN0o9eAA=="], - "preact": ["preact@10.24.3", "", {}, "sha512-Z2dPnBnMUfyQfSQ+GBdsGa16hz35YmLmtTLhM169uW944hYL6xzTYkJjC07j+Wosz733pMWx0fgON3JNw1jJQA=="], + "preact": ["preact@10.29.2", "", {}, "sha512-7tNmwg/7mzzAoB/8kSg6Hl37JraAZw3Z3A0JSY7VXlZwo82Xn0G7wKbNNs2qoF4ZEEsQGTwDAroNdqKs1ofJxQ=="], "preact-render-to-string": ["preact-render-to-string@5.2.6", "", { "dependencies": { "pretty-format": "^3.8.0" }, "peerDependencies": { "preact": ">=10" } }, "sha512-JyhErpYOvBV1hEPwIxc/fHWXPfnEGdRKxc8gFdAZ7XV4tlzyzG847XAyEZqoDnynP88akM4eaHcSOzNcLWFguw=="], @@ -1642,6 +1642,8 @@ "zwitch": ["zwitch@2.0.4", "", {}, "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A=="], + "@auth/core/preact": ["preact@10.24.3", "", {}, "sha512-Z2dPnBnMUfyQfSQ+GBdsGa16hz35YmLmtTLhM169uW944hYL6xzTYkJjC07j+Wosz733pMWx0fgON3JNw1jJQA=="], + "@auth/core/preact-render-to-string": ["preact-render-to-string@6.5.11", "", { "peerDependencies": { "preact": ">=10" } }, "sha512-ubnauqoGczeGISiOh6RjX0/cdaF8v/oDXIjO85XALCQjwQP+SB4RDXXtvZ6yTYSjG+PC1QRP2AhPgCEsM2EvUw=="], "@codebuff/common/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], @@ -1658,8 +1660,6 @@ "@opentui/core/strip-ansi": ["strip-ansi@7.1.2", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA=="], - "@types/diff/diff": ["diff@9.0.0", "", {}, "sha512-svtcdpS8CgJyqAjEQIXdb3OjhFVVYjzGAPO8WGCmRbrml64SPw/jJD4GoE98aR7r25A0XcgrK3F02yw9R/vhQw=="], - "@typescript-eslint/eslint-plugin/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], "@typescript-eslint/parser/@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@7.18.0", "", { "dependencies": { "@typescript-eslint/types": "7.18.0", "@typescript-eslint/visitor-keys": "7.18.0" } }, "sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA=="], From 654ef717644537e067bc45783bce819788a5ff7a Mon Sep 17 00:00:00 2001 From: codebuff public sync bot <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 11 Jun 2026 23:00:22 +0000 Subject: [PATCH 85/96] Sync public snapshot from freebuff-private Source: CodebuffAI/freebuff-private@15cb1ec9a6c680d981325868ce8211025697b637 --- agents/base-chat.ts | 13 +++-- .../src/__tests__/gravity-index-tool.test.ts | 54 +++++++++++++++++++ .../src/tools/handlers/tool/gravity-index.ts | 10 +++- 3 files changed, 71 insertions(+), 6 deletions(-) diff --git a/agents/base-chat.ts b/agents/base-chat.ts index da429cdf21..c8a14c7492 100644 --- a/agents/base-chat.ts +++ b/agents/base-chat.ts @@ -5,10 +5,11 @@ import { publisher } from './constants' import type { SecretAgentDefinition } from './types/secret-agent-definition' /** - * Conversational agent behind freebuff.com/chat. Runs with no filesystem and - * no direct tools, but can spawn researcher-web to look things up on the - * live internet. The chat server may override `model` per request (DeepSeek - * Flash vs Pro for full-access users). + * Conversational agent behind freebuff.com/chat. Runs with no filesystem, but + * can spawn researcher-web to look things up on the live internet and call + * gravity_index to recommend third-party developer services. The chat server + * may override `model` per request (DeepSeek Flash vs Pro for full-access + * users). */ const definition: SecretAgentDefinition = { id: 'base-chat', @@ -23,12 +24,14 @@ const definition: SecretAgentDefinition = { }, }, outputMode: 'last_message', - toolNames: ['spawn_agents'], + toolNames: ['spawn_agents', 'gravity_index'], spawnableAgents: ['researcher-web'], systemPrompt: `You are Freebuff Chat, a friendly, sharp assistant made by Freebuff (freebuff.com), the home of free AI coding tools. You are chatting with a user in a web interface that renders markdown.`, instructionsPrompt: `Be direct and helpful. Use markdown when it improves clarity (code blocks, lists, tables), and keep answers as short as they can be while fully answering the question. +When the user is choosing a third-party developer service (database, auth, payments, hosting, email, monitoring, analytics, AI APIs, storage, CMS, search, etc.) or asks what provider to use for something, use the gravity_index tool instead of answering from memory: \`search\` with a query that includes their stack and constraints when they want a recommendation, or \`browse\`/\`list_categories\`/\`get_service\` to explore options. Ground your answer in the result. When a search result includes a tracked setup link (\`credential_request.setup_url\` or \`click_url\`), present that exact URL prominently as a markdown link like "Get your {service} API key" — never swap in the vendor homepage for it. Since you can't edit the user's files, share the relevant setup steps and env vars in chat instead of trying to install anything. + You can search the live internet by spawning the researcher-web agent. Spawn it whenever the answer depends on current or recent information (news, prices, releases, versions, schedules, scores, docs), whenever the user asks you to look something up, or whenever you are not confident in your knowledge. Give it a focused question; you can spawn several in parallel for independent questions. After it reports back, answer the user in your own words and cite source URLs when useful. Don't spawn it for questions you can already answer well (general knowledge, coding help, writing, math). You do not have access to the user's files or a filesystem — if asked to do something that requires those, say so briefly and help with what you can instead.`, diff --git a/packages/agent-runtime/src/__tests__/gravity-index-tool.test.ts b/packages/agent-runtime/src/__tests__/gravity-index-tool.test.ts index 48ffa51e3c..3f96efaa8c 100644 --- a/packages/agent-runtime/src/__tests__/gravity-index-tool.test.ts +++ b/packages/agent-runtime/src/__tests__/gravity-index-tool.test.ts @@ -148,6 +148,60 @@ describe('gravity_index tool', () => { ) }) + test('tags base-chat traffic with the freebuff_chat surface', async () => { + const spy = spyOn(webApi, 'callGravityIndexAPI').mockResolvedValue({ + result: { search_id: 'search-1' }, + }) + + mockAgentStream([ + createToolCallChunk('gravity_index', { + action: 'search', + query: 'transactional email for Next.js', + }), + createToolCallChunk('end_turn', {}), + ]) + + const fileContext = { + ...mockFileContext, + agentTemplates: { + 'base-chat': { + ...gravityTestAgent, + id: 'base-chat', + displayName: 'Freebuff Chat', + }, + }, + } + const sessionState = getInitialSessionState(fileContext) + const agentState = { + ...sessionState.mainAgentState, + agentType: 'base-chat', + } + const { agentTemplates } = assembleLocalAgentTemplates({ + ...agentRuntimeImpl, + fileContext, + }) + + await runAgentStep({ + ...runAgentStepBaseParams, + agentType: 'base-chat', + fileContext, + localAgentTemplates: agentTemplates, + agentTemplate: agentTemplates['base-chat'], + agentState, + prompt: 'Find an email provider', + }) + + expect(spy).toHaveBeenCalledWith( + expect.objectContaining({ + input: expect.objectContaining({ + metadata: expect.objectContaining({ + surface: 'freebuff_chat', + }), + }), + }), + ) + }) + test('stores recommendation and setup URL in tool output', async () => { spyOn(webApi, 'callGravityIndexAPI').mockResolvedValue({ result: { diff --git a/packages/agent-runtime/src/tools/handlers/tool/gravity-index.ts b/packages/agent-runtime/src/tools/handlers/tool/gravity-index.ts index 45e7d36990..1e38b18769 100644 --- a/packages/agent-runtime/src/tools/handlers/tool/gravity-index.ts +++ b/packages/agent-runtime/src/tools/handlers/tool/gravity-index.ts @@ -7,6 +7,7 @@ import type { CodebuffToolCall, CodebuffToolOutput, } from '@codebuff/common/tools/list' +import type { AgentTemplate } from '@codebuff/common/types/agent-template' import type { ClientEnv, CiEnv } from '@codebuff/common/types/contracts/env' import type { JSONObject, JSONValue } from '@codebuff/common/types/json' import type { Logger } from '@codebuff/common/types/contracts/logger' @@ -24,9 +25,15 @@ const omitUndefined = (value: Record) => { const isJSONObject = (value: JSONValue | undefined): value is JSONObject => !!value && typeof value === 'object' && !Array.isArray(value) +/** Gravity attribution surface, so clicks/conversions are attributable to the + * product the request came from rather than all reading as CLI traffic. */ +const gravitySurface = (agentTemplate: { id: string }): string => + agentTemplate.id === 'base-chat' ? 'freebuff_chat' : 'codebuff_cli' + export const handleGravityIndex = (async (params: { previousToolCallFinished: Promise toolCall: CodebuffToolCall<'gravity_index'> + agentTemplate: AgentTemplate logger: Logger apiKey: string @@ -47,6 +54,7 @@ export const handleGravityIndex = (async (params: { const { previousToolCallFinished, toolCall, + agentTemplate, agentStepId, apiKey, clientSessionId, @@ -84,7 +92,7 @@ export const handleGravityIndex = (async (params: { const metadata = { ...existingMetadata, ...omitUndefined({ - surface: 'codebuff_cli', + surface: gravitySurface(agentTemplate), tool_call_id: toolCall.toolCallId, agent_step_id: agentStepId, fingerprint_id: fingerprintId, From 3a8d294ea5bc4ee1420f52f16c2c691d0ecedbae Mon Sep 17 00:00:00 2001 From: codebuff public sync bot <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 11 Jun 2026 23:11:37 +0000 Subject: [PATCH 86/96] Sync public snapshot from freebuff-private Source: CodebuffAI/freebuff-private@0f6b78d4f22b3151ee2e614292ee81901aa9dcf9 --- bun.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/bun.lock b/bun.lock index b4843b2987..5b0517a30e 100644 --- a/bun.lock +++ b/bun.lock @@ -1312,7 +1312,7 @@ "posthog-node": ["posthog-node@5.36.17", "", { "dependencies": { "@posthog/core": "1.32.3" }, "peerDependencies": { "rxjs": "^7.0.0" }, "optionalPeers": ["rxjs"] }, "sha512-ed1LT4a9hhiFJizB6XX7dkYYLVPAFHfUpkQSns7BRxoUyhFnvMq15QENKeAOUEKQgPmnaq2I+xNLdAHN0o9eAA=="], - "preact": ["preact@10.29.2", "", {}, "sha512-7tNmwg/7mzzAoB/8kSg6Hl37JraAZw3Z3A0JSY7VXlZwo82Xn0G7wKbNNs2qoF4ZEEsQGTwDAroNdqKs1ofJxQ=="], + "preact": ["preact@10.24.3", "", {}, "sha512-Z2dPnBnMUfyQfSQ+GBdsGa16hz35YmLmtTLhM169uW944hYL6xzTYkJjC07j+Wosz733pMWx0fgON3JNw1jJQA=="], "preact-render-to-string": ["preact-render-to-string@5.2.6", "", { "dependencies": { "pretty-format": "^3.8.0" }, "peerDependencies": { "preact": ">=10" } }, "sha512-JyhErpYOvBV1hEPwIxc/fHWXPfnEGdRKxc8gFdAZ7XV4tlzyzG847XAyEZqoDnynP88akM4eaHcSOzNcLWFguw=="], @@ -1642,8 +1642,6 @@ "zwitch": ["zwitch@2.0.4", "", {}, "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A=="], - "@auth/core/preact": ["preact@10.24.3", "", {}, "sha512-Z2dPnBnMUfyQfSQ+GBdsGa16hz35YmLmtTLhM169uW944hYL6xzTYkJjC07j+Wosz733pMWx0fgON3JNw1jJQA=="], - "@auth/core/preact-render-to-string": ["preact-render-to-string@6.5.11", "", { "peerDependencies": { "preact": ">=10" } }, "sha512-ubnauqoGczeGISiOh6RjX0/cdaF8v/oDXIjO85XALCQjwQP+SB4RDXXtvZ6yTYSjG+PC1QRP2AhPgCEsM2EvUw=="], "@codebuff/common/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], @@ -1660,6 +1658,8 @@ "@opentui/core/strip-ansi": ["strip-ansi@7.1.2", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA=="], + "@types/diff/diff": ["diff@9.0.0", "", {}, "sha512-svtcdpS8CgJyqAjEQIXdb3OjhFVVYjzGAPO8WGCmRbrml64SPw/jJD4GoE98aR7r25A0XcgrK3F02yw9R/vhQw=="], + "@typescript-eslint/eslint-plugin/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], "@typescript-eslint/parser/@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@7.18.0", "", { "dependencies": { "@typescript-eslint/types": "7.18.0", "@typescript-eslint/visitor-keys": "7.18.0" } }, "sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA=="], From 723b68797672984b1b8f3ddcf8e4544e41794993 Mon Sep 17 00:00:00 2001 From: codebuff public sync bot <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 12 Jun 2026 00:19:42 +0000 Subject: [PATCH 87/96] Sync public snapshot from freebuff-private Source: CodebuffAI/freebuff-private@fdace2e259edc724e584ed22389e388fa4cf0597 --- bun.lock | 1 + cli/package.json | 1 + cli/src/utils/open-url.ts | 32 +++++++++++++++++++++++++++++--- 3 files changed, 31 insertions(+), 3 deletions(-) diff --git a/bun.lock b/bun.lock index 5b0517a30e..76e855b545 100644 --- a/bun.lock +++ b/bun.lock @@ -66,6 +66,7 @@ "terminal-image": "^4.1.0", "ts-pattern": "^5.9.0", "unified": "^11.0.0", + "wsl-utils": "^0.1.0", "yoga-layout": "^3.2.1", "zod": "^4.2.1", "zustand": "^5.0.8", diff --git a/cli/package.json b/cli/package.json index ba2373d5e4..82ecda523f 100644 --- a/cli/package.json +++ b/cli/package.json @@ -52,6 +52,7 @@ "terminal-image": "^4.1.0", "ts-pattern": "^5.9.0", "unified": "^11.0.0", + "wsl-utils": "^0.1.0", "yoga-layout": "^3.2.1", "zod": "^4.2.1", "zustand": "^5.0.8" diff --git a/cli/src/utils/open-url.ts b/cli/src/utils/open-url.ts index 1dffeaac06..84c8850c41 100644 --- a/cli/src/utils/open-url.ts +++ b/cli/src/utils/open-url.ts @@ -1,6 +1,8 @@ +import fs from 'fs' import os from 'os' import open from 'open' +import { isWsl, powerShellPathFromWsl } from 'wsl-utils' import { getCliEnv } from './env' import { logger } from './logger' @@ -11,12 +13,30 @@ import { logger } from './logger' * On headless Linux (no DISPLAY or WAYLAND_DISPLAY), calling `open()` spawns * `xdg-open` which can crash the entire process — even inside a try/catch — * because the child process may trigger fatal signals. This wrapper detects - * headless environments and skips the call entirely. + * headless environments and skips the call entirely. WSL is exempt: there + * `open()` goes through powershell.exe, which needs no display. + * + * On WSL, `open()` spawns powershell.exe from the Windows mount. If Windows + * interop is disabled (no access to /mnt/c), that spawn fails with ENOENT. + * Under Bun the failure is delivered before the `open()` promise resolves and + * cannot be caught from here — not by try/catch, and not by an 'error' + * listener attached afterward — so the only reliable defense is checking that + * powershell.exe exists before calling `open()`. `wsl-utils` is what `open` + * itself uses to build the path, so the check matches its behavior exactly. * * @returns `true` if the browser was (likely) opened, `false` if skipped. */ export async function safeOpen(url: string): Promise { - if (os.platform() === 'linux') { + if (isWsl) { + const powershellPath = await powerShellPathFromWsl() + if (!fs.existsSync(powershellPath)) { + logger.warn( + { powershellPath }, + 'WSL detected but powershell.exe is not accessible (Windows interop disabled?). Skipping browser open.', + ) + return false + } + } else if (os.platform() === 'linux') { const env = getCliEnv() const hasDisplay = Boolean(env.DISPLAY || env.WAYLAND_DISPLAY) if (!hasDisplay) { @@ -28,7 +48,13 @@ export async function safeOpen(url: string): Promise { } try { - await open(url) + const subprocess = await open(url) + // With the default `wait: false`, spawn failures can surface on the + // child's 'error' event after the promise resolves; without a listener + // they become uncaught exceptions that kill the process. + subprocess.once('error', (err) => { + logger.error(err, 'Failed to open browser') + }) return true } catch (err) { logger.error(err, 'Failed to open browser') From fca01d3dcc3f53039517223a8efbcff17d0ab144 Mon Sep 17 00:00:00 2001 From: codebuff public sync bot <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 12 Jun 2026 06:35:17 +0000 Subject: [PATCH 88/96] Sync public snapshot from freebuff-private Source: CodebuffAI/freebuff-private@821a29764d698b78e1017bb69dd733b1979165fa --- bun.lock | 76 +++++++++------ .../components/freebuff-model-selector.tsx | 52 ++++++++-- cli/src/components/waiting-room-screen.tsx | 94 ++++++++++++------- 3 files changed, 154 insertions(+), 68 deletions(-) diff --git a/bun.lock b/bun.lock index 76e855b545..3d50fb578c 100644 --- a/bun.lock +++ b/bun.lock @@ -241,15 +241,19 @@ "@eslint-community/regexpp": ["@eslint-community/regexpp@4.12.2", "", {}, "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew=="], - "@eslint/config-array": ["@eslint/config-array@0.23.5", "", { "dependencies": { "@eslint/object-schema": "^3.0.5", "debug": "^4.3.1", "minimatch": "^10.2.4" } }, "sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA=="], + "@eslint/config-array": ["@eslint/config-array@0.21.2", "", { "dependencies": { "@eslint/object-schema": "^2.1.7", "debug": "^4.3.1", "minimatch": "^3.1.5" } }, "sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw=="], - "@eslint/config-helpers": ["@eslint/config-helpers@0.6.0", "", { "dependencies": { "@eslint/core": "^1.2.1" } }, "sha512-ii6Bw9jJ2zi2cWA2Z+9/QZ/+3DX6kwaV5Q986D/CdP3Lap3w/pgQZ373FV7byY/i7L4IRH/G43I5dz1ClsCbpA=="], + "@eslint/config-helpers": ["@eslint/config-helpers@0.4.2", "", { "dependencies": { "@eslint/core": "^0.17.0" } }, "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw=="], - "@eslint/core": ["@eslint/core@1.2.1", "", { "dependencies": { "@types/json-schema": "^7.0.15" } }, "sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ=="], + "@eslint/core": ["@eslint/core@0.17.0", "", { "dependencies": { "@types/json-schema": "^7.0.15" } }, "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ=="], - "@eslint/object-schema": ["@eslint/object-schema@3.0.5", "", {}, "sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw=="], + "@eslint/eslintrc": ["@eslint/eslintrc@3.3.5", "", { "dependencies": { "ajv": "^6.14.0", "debug": "^4.3.2", "espree": "^10.0.1", "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.1", "minimatch": "^3.1.5", "strip-json-comments": "^3.1.1" } }, "sha512-4IlJx0X0qftVsN5E+/vGujTRIFtwuLbNsVUe7TO6zYPDR1O6nFwvwhIKEKSrl6dZchmYBITazxKoUYOjdtjlRg=="], - "@eslint/plugin-kit": ["@eslint/plugin-kit@0.7.2", "", { "dependencies": { "@eslint/core": "^1.2.1", "levn": "^0.4.1" } }, "sha512-+CNAzxglkrpNf/kKywqQfk74QjtceuOE7Qm+AF8miRvPF/wmmK5+OJOgVh3AVTT3RP2mH3+FOaxlE5v72owk0A=="], + "@eslint/js": ["@eslint/js@9.39.4", "", {}, "sha512-nE7DEIchvtiFTwBw4Lfbu59PG+kCofhjsKaCWzxTpt4lfRjRMqG6uMBzKXuEcyXhOHoUp9riAm7/aWYGhXZ9cw=="], + + "@eslint/object-schema": ["@eslint/object-schema@2.1.7", "", {}, "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA=="], + + "@eslint/plugin-kit": ["@eslint/plugin-kit@0.4.1", "", { "dependencies": { "@eslint/core": "^0.17.0", "levn": "^0.4.1" } }, "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA=="], "@gravity-ai/api": ["@gravity-ai/api@0.1.2", "", { "dependencies": { "axios": "^1.13.2" } }, "sha512-txsAhyzvwB/TNrj5R8DoNqw8afM3JY2ahl7aaeaD5ZsxP+7rxff7C7keGI7+gU2KT3d2Mcw4QB1nHhbTSCJYHw=="], @@ -465,8 +469,6 @@ "@types/diff": ["@types/diff@8.0.0", "", { "dependencies": { "diff": "*" } }, "sha512-o7jqJM04gfaYrdCecCVMbZhNdG6T1MHg/oQoRFdERLV+4d+V7FijhiEAbFu0Usww84Yijk9yH58U4Jk4HbtzZw=="], - "@types/esrecurse": ["@types/esrecurse@4.3.1", "", {}, "sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw=="], - "@types/estree": ["@types/estree@1.0.9", "", {}, "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg=="], "@types/js-yaml": ["@types/js-yaml@4.0.9", "", {}, "sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg=="], @@ -549,7 +551,7 @@ "ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="], - "ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], + "ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], "any-base": ["any-base@1.1.0", "", {}, "sha512-uMgjozySS8adZZYePpaWs8cxB9/kdzmpX6SgJZ+wbz1K5eYk5QMYDVJaZKhxyIHUdnnJkfR7SVgStgH7LkGUyg=="], @@ -625,6 +627,8 @@ "call-bound": ["call-bound@1.0.4", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "get-intrinsic": "^1.3.0" } }, "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg=="], + "callsites": ["callsites@3.1.0", "", {}, "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="], + "caniuse-lite": ["caniuse-lite@1.0.30001799", "", {}, "sha512-hG1bReV+OUU+MOqK4t/ZWI0tZOyz3rqS9XuhOUz1cIcbwBKjOyJEJuw9ER5JuNyqxNk8u/JUVbGibBOL1yrjFw=="], "canvas": ["canvas@3.2.3", "", { "dependencies": { "node-addon-api": "^7.0.0", "prebuild-install": "^7.1.3" } }, "sha512-PzE5nJZPz72YUAfo8oTp0u3fqqY7IzlTubneAihqDYAUcBk7ryeCmBbdJBEdaH0bptSOe2VT2Zwcb3UaFyaSWw=="], @@ -749,7 +753,7 @@ "escape-string-regexp": ["escape-string-regexp@4.0.0", "", {}, "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="], - "eslint": ["eslint@10.4.1", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.2", "@eslint/config-array": "^0.23.5", "@eslint/config-helpers": "^0.6.0", "@eslint/core": "^1.2.1", "@eslint/plugin-kit": "^0.7.2", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "ajv": "^6.14.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^9.1.2", "eslint-visitor-keys": "^5.0.1", "espree": "^11.2.0", "esquery": "^1.7.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "minimatch": "^10.2.4", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, "peerDependencies": { "jiti": "*" }, "optionalPeers": ["jiti"], "bin": { "eslint": "bin/eslint.js" } }, "sha512-AyIKhnOBuOAdueD7RB3xB+YeAWScb9jHsJBgH2Hcde8InP5JYhqrRR6iTMHyTEwgENK54Cp44e4v8BwNhsuHuw=="], + "eslint": ["eslint@9.39.4", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", "@eslint/config-array": "^0.21.2", "@eslint/config-helpers": "^0.4.2", "@eslint/core": "^0.17.0", "@eslint/eslintrc": "^3.3.5", "@eslint/js": "9.39.4", "@eslint/plugin-kit": "^0.4.1", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "ajv": "^6.14.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^8.4.0", "eslint-visitor-keys": "^4.2.1", "espree": "^10.4.0", "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.5", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, "peerDependencies": { "jiti": "*" }, "optionalPeers": ["jiti"], "bin": { "eslint": "bin/eslint.js" } }, "sha512-XoMjdBOwe/esVgEvLmNsD3IRHkm7fbKIUGvrleloJXUZgDHig2IPWNniv+GwjyJXzuNqVjlr5+4yVUZjycJwfQ=="], "eslint-config-prettier": ["eslint-config-prettier@9.1.2", "", { "peerDependencies": { "eslint": ">=7.0.0" }, "bin": { "eslint-config-prettier": "bin/cli.js" } }, "sha512-iI1f+D2ViGn+uvv5HuHVUamg8ll4tN+JRHGc6IJi4TP9Kl976C57fzPXgseXNs8v0iA8aSJpHsTWjDb9QJamGQ=="], @@ -761,11 +765,11 @@ "eslint-plugin-unused-imports": ["eslint-plugin-unused-imports@4.4.1", "", { "peerDependencies": { "@typescript-eslint/eslint-plugin": "^8.0.0-0 || ^7.0.0 || ^6.0.0 || ^5.0.0", "eslint": "^10.0.0 || ^9.0.0 || ^8.0.0" }, "optionalPeers": ["@typescript-eslint/eslint-plugin"] }, "sha512-oZGYUz1X3sRMGUB+0cZyK2VcvRX5lm/vB56PgNNcU+7ficUCKm66oZWKUubXWnOuPjQ8PvmXtCViXBMONPe7tQ=="], - "eslint-scope": ["eslint-scope@9.1.2", "", { "dependencies": { "@types/esrecurse": "^4.3.1", "@types/estree": "^1.0.8", "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ=="], + "eslint-scope": ["eslint-scope@8.4.0", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg=="], "eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="], - "espree": ["espree@11.2.0", "", { "dependencies": { "acorn": "^8.16.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^5.0.1" } }, "sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw=="], + "espree": ["espree@10.4.0", "", { "dependencies": { "acorn": "^8.15.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^4.2.1" } }, "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ=="], "esprima": ["esprima@4.0.1", "", { "bin": { "esparse": "./bin/esparse.js", "esvalidate": "./bin/esvalidate.js" } }, "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="], @@ -877,6 +881,8 @@ "glob-parent": ["glob-parent@6.0.2", "", { "dependencies": { "is-glob": "^4.0.3" } }, "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A=="], + "globals": ["globals@14.0.0", "", {}, "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ=="], + "globalthis": ["globalthis@1.0.4", "", { "dependencies": { "define-properties": "^1.2.1", "gopd": "^1.0.1" } }, "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ=="], "globby": ["globby@11.1.0", "", { "dependencies": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", "fast-glob": "^3.2.9", "ignore": "^5.2.0", "merge2": "^1.4.1", "slash": "^3.0.0" } }, "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g=="], @@ -891,6 +897,8 @@ "has-bigints": ["has-bigints@1.1.0", "", {}, "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg=="], + "has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], + "has-property-descriptors": ["has-property-descriptors@1.0.2", "", { "dependencies": { "es-define-property": "^1.0.0" } }, "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg=="], "has-proto": ["has-proto@1.2.0", "", { "dependencies": { "dunder-proto": "^1.0.0" } }, "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ=="], @@ -921,6 +929,8 @@ "immer": ["immer@10.2.0", "", {}, "sha512-d/+XTN3zfODyjr89gM3mPq1WNX2B8pYsu7eORitdwyA2sBubnTl3laYlBk4sXY5FUa5qTZGBDPJICVbvqzjlbw=="], + "import-fresh": ["import-fresh@3.3.1", "", { "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" } }, "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ=="], + "imurmurhash": ["imurmurhash@0.1.4", "", {}, "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA=="], "inherits": ["inherits@2.0.4", "", {}, "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="], @@ -1039,6 +1049,8 @@ "lodash": ["lodash@4.17.23", "", {}, "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w=="], + "lodash.merge": ["lodash.merge@4.6.2", "", {}, "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ=="], + "log-update": ["log-update@8.0.0", "", { "dependencies": { "ansi-escapes": "^7.3.0", "cli-cursor": "^5.0.0", "slice-ansi": "^9.0.0", "string-width": "^8.2.0", "strip-ansi": "^7.2.0", "wrap-ansi": "^10.0.0" } }, "sha512-lddSgOt3bPASrylL54ZSpy8nBHns+vBVSoILlVOx+dei300pnLRN958rj/EdlVLKuWlSESU3qdnDZdAI7FXYGg=="], "longest-streak": ["longest-streak@3.1.0", "", {}, "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g=="], @@ -1241,6 +1253,8 @@ "pako": ["pako@1.0.11", "", {}, "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw=="], + "parent-module": ["parent-module@1.0.1", "", { "dependencies": { "callsites": "^3.0.0" } }, "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g=="], + "parse-bmfont-ascii": ["parse-bmfont-ascii@1.0.6", "", {}, "sha512-U4RrVsUFCleIOBsIGYOMKjn9PavsGOXxbvYGtMOEfnId0SVNsgehXh1DxUdVPLoxd5mvcEtvmKs2Mmf0Mpa1ZA=="], "parse-bmfont-binary": ["parse-bmfont-binary@1.0.6", "", {}, "sha512-GxmsRea0wdGdYthjuUeWTMWPqm2+FAd4GI8vCvhgJsFnoGhTrLhXDDupwTo7rXVAgaLIGoVHDZS9p/5XbSqeWA=="], @@ -1385,6 +1399,8 @@ "resolve": ["resolve@2.0.0-next.7", "", { "dependencies": { "es-errors": "^1.3.0", "is-core-module": "^2.16.2", "node-exports-info": "^1.6.0", "object-keys": "^1.1.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-tqt+NBWwyaMgw3zDsnygx4CByWjQEJHOPMdslYhppaQSJUtL/D4JO9CcBBlhPoI8lz9oJIDXkwXfhF4aWqP8xQ=="], + "resolve-from": ["resolve-from@4.0.0", "", {}, "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="], + "resolve-pkg-maps": ["resolve-pkg-maps@1.0.0", "", {}, "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw=="], "restore-cursor": ["restore-cursor@5.1.0", "", { "dependencies": { "onetime": "^7.0.0", "signal-exit": "^4.1.0" } }, "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA=="], @@ -1489,7 +1505,7 @@ "strip-final-newline": ["strip-final-newline@2.0.0", "", {}, "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA=="], - "strip-json-comments": ["strip-json-comments@2.0.1", "", {}, "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ=="], + "strip-json-comments": ["strip-json-comments@3.1.1", "", {}, "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig=="], "stripe": ["stripe@16.12.0", "", { "dependencies": { "@types/node": ">=8.1.0", "qs": "^6.11.0" } }, "sha512-H7eFVLDxeTNNSn4JTRfL2//LzCbDrMSZ+2q1c7CanVWgK2qIW5TwS+0V7N9KcKZZNpYh/uCqK0PyZh/2UsaAtQ=="], @@ -1497,6 +1513,8 @@ "styled-jsx": ["styled-jsx@5.1.6", "", { "dependencies": { "client-only": "0.0.1" }, "peerDependencies": { "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0" } }, "sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA=="], + "supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], + "supports-preserve-symlinks-flag": ["supports-preserve-symlinks-flag@1.0.0", "", {}, "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w=="], "supports-terminal-graphics": ["supports-terminal-graphics@0.1.0", "", {}, "sha512-+KdfozhS0Fw8y5Sghw8kkZNGT8nWYzJ1EzcoIvVjxhl+26TJTs26y02yfBgvc1jh5AS/c8jcI3xtahhR95KRyQ=="], @@ -1653,14 +1671,16 @@ "@codebuff/sdk/ignore": ["ignore@7.0.5", "", {}, "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg=="], - "@eslint/config-array/minimatch": ["minimatch@10.2.5", "", { "dependencies": { "brace-expansion": "^5.0.5" } }, "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg=="], + "@eslint/eslintrc/ajv": ["ajv@6.15.0", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw=="], + + "@eslint/eslintrc/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], + + "@eslint/eslintrc/js-yaml": ["js-yaml@4.2.0", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-ePWsvanv0DWuDRsW8dnt+R4jQ31SCRCQ7hhNcPXZPsoBZiemuZNYGf7adZdqX2D86j6rvKp3RpCxVTSb8WQlOw=="], "@opentui/core/diff": ["diff@9.0.0", "", {}, "sha512-svtcdpS8CgJyqAjEQIXdb3OjhFVVYjzGAPO8WGCmRbrml64SPw/jJD4GoE98aR7r25A0XcgrK3F02yw9R/vhQw=="], "@opentui/core/strip-ansi": ["strip-ansi@7.1.2", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA=="], - "@types/diff/diff": ["diff@9.0.0", "", {}, "sha512-svtcdpS8CgJyqAjEQIXdb3OjhFVVYjzGAPO8WGCmRbrml64SPw/jJD4GoE98aR7r25A0XcgrK3F02yw9R/vhQw=="], - "@typescript-eslint/eslint-plugin/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], "@typescript-eslint/parser/@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@7.18.0", "", { "dependencies": { "@typescript-eslint/types": "7.18.0", "@typescript-eslint/visitor-keys": "7.18.0" } }, "sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA=="], @@ -1689,11 +1709,11 @@ "eslint/ajv": ["ajv@6.15.0", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw=="], - "eslint/eslint-visitor-keys": ["eslint-visitor-keys@5.0.1", "", {}, "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA=="], + "eslint/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], - "eslint/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], + "eslint/eslint-visitor-keys": ["eslint-visitor-keys@4.2.1", "", {}, "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ=="], - "eslint/minimatch": ["minimatch@10.2.5", "", { "dependencies": { "brace-expansion": "^5.0.5" } }, "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg=="], + "eslint/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], "eslint-import-resolver-node/debug": ["debug@3.2.7", "", { "dependencies": { "ms": "^2.1.1" } }, "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ=="], @@ -1705,7 +1725,7 @@ "eslint-plugin-import/tsconfig-paths": ["tsconfig-paths@3.15.0", "", { "dependencies": { "@types/json5": "^0.0.29", "json5": "^1.0.2", "minimist": "^1.2.6", "strip-bom": "^3.0.0" } }, "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg=="], - "espree/eslint-visitor-keys": ["eslint-visitor-keys@5.0.1", "", {}, "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA=="], + "espree/eslint-visitor-keys": ["eslint-visitor-keys@4.2.1", "", {}, "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ=="], "execa/onetime": ["onetime@5.1.2", "", { "dependencies": { "mimic-fn": "^2.1.0" } }, "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg=="], @@ -1733,12 +1753,16 @@ "plist/xmlbuilder": ["xmlbuilder@15.1.1", "", {}, "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg=="], + "rc/strip-json-comments": ["strip-json-comments@2.0.1", "", {}, "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ=="], + "react-devtools-core/ws": ["ws@7.5.11", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": "^5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-zS54Oen9bITtp7kp2XM3AydrCIq1D+HwJOuH+c+e4LfpL/lotP5osijd+UoMnxwAam1GN8R4KtLAyIrIcBNpiA=="], "react-reconciler/scheduler": ["scheduler@0.26.0", "", {}, "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA=="], "send/mime-types": ["mime-types@3.0.2", "", { "dependencies": { "mime-db": "^1.54.0" } }, "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A=="], + "slice-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], + "tar-stream/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=="], "ts-node/diff": ["diff@4.0.4", "", {}, "sha512-X07nttJQkwkfKfvTPG/KSnE2OMdcUCao6+eXF3wmnIQRn2aPAHH3VxDbDOdegkd6JbPsXqShpvEOHfAT+nCNwQ=="], @@ -1753,6 +1777,8 @@ "typescript-eslint/@typescript-eslint/utils": ["@typescript-eslint/utils@7.18.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@typescript-eslint/scope-manager": "7.18.0", "@typescript-eslint/types": "7.18.0", "@typescript-eslint/typescript-estree": "7.18.0" }, "peerDependencies": { "eslint": "^8.56.0" } }, "sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw=="], + "wrap-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], + "wrap-ansi/string-width": ["string-width@8.2.1", "", { "dependencies": { "get-east-asian-width": "^1.5.0", "strip-ansi": "^7.1.2" } }, "sha512-IIaP0g3iy9Cyy18w3M9YcaDudujEAVHKt3a3QJg1+sr/oX96TbaGUubG0hJyCjCBThFH+tFpcIyoUHUn1ogaLA=="], "yargs/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], @@ -1761,7 +1787,9 @@ "@codebuff/evals/pino/process-warning": ["process-warning@5.0.0", "", {}, "sha512-a39t9ApHNx2L4+HBnQKqxxHNs1r7KF+Intd8Q/g1bUh6q0WIp9voPXJ/x0j+ZL45KF1pJd9+q2jLIRMfvEshkA=="], - "@eslint/config-array/minimatch/brace-expansion": ["brace-expansion@5.0.6", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g=="], + "@eslint/eslintrc/ajv/json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], + + "@eslint/eslintrc/js-yaml/argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="], "@typescript-eslint/parser/@typescript-eslint/typescript-estree/minimatch": ["minimatch@9.0.9", "", { "dependencies": { "brace-expansion": "^2.0.2" } }, "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg=="], @@ -1775,14 +1803,10 @@ "cliui/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], - "cliui/wrap-ansi/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], - "eslint-plugin-import/tsconfig-paths/json5": ["json5@1.0.2", "", { "dependencies": { "minimist": "^1.2.0" }, "bin": { "json5": "lib/cli.js" } }, "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA=="], "eslint/ajv/json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], - "eslint/minimatch/brace-expansion": ["brace-expansion@5.0.6", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g=="], - "express/mime-types/mime-db": ["mime-db@1.54.0", "", {}, "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ=="], "p-locate/p-limit/yocto-queue": ["yocto-queue@0.1.0", "", {}, "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="], @@ -1811,12 +1835,8 @@ "yargs/string-width/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], - "@eslint/config-array/minimatch/brace-expansion/balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="], - "@typescript-eslint/parser/@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.1.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-WR1cURNjuvBLMZBMbqM0UoE+WAfdUcEV1ccD8PVBVOI+Z3ND4+SZbN8RsfT2bMuG1qwz5RFvPukSZm5fF2D5eA=="], - "eslint/minimatch/brace-expansion/balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="], - "typescript-eslint/@typescript-eslint/eslint-plugin/@typescript-eslint/scope-manager/@typescript-eslint/types": ["@typescript-eslint/types@7.18.0", "", {}, "sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ=="], "typescript-eslint/@typescript-eslint/eslint-plugin/@typescript-eslint/type-utils/@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@7.18.0", "", { "dependencies": { "@typescript-eslint/types": "7.18.0", "@typescript-eslint/visitor-keys": "7.18.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", "minimatch": "^9.0.4", "semver": "^7.6.0", "ts-api-utils": "^1.3.0" } }, "sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA=="], diff --git a/cli/src/components/freebuff-model-selector.tsx b/cli/src/components/freebuff-model-selector.tsx index 0f944ad5a3..b063a58094 100644 --- a/cli/src/components/freebuff-model-selector.tsx +++ b/cli/src/components/freebuff-model-selector.tsx @@ -11,6 +11,7 @@ import React, { import { Button } from './button' import { FALLBACK_FREEBUFF_MODEL_ID, + FREEBUFF_PREMIUM_SESSION_LIMIT, getFreebuffDeploymentAvailabilityLabel, getFreebuffModelsForAccessTier, isFreebuffModelAvailable, @@ -28,6 +29,10 @@ import { freebuffModelNavigationDirectionForKey, nextFreebuffModelId, } from '../utils/freebuff-model-navigation' +import { + formatFreebuffPremiumResetCountdown, + getFreebuffPremiumResetAt, +} from '../utils/freebuff-premium-reset' import { isPlainEnterKey } from '../utils/terminal-enter-detection' import type { FreebuffModelOption } from '@codebuff/common/constants/freebuff-models' @@ -36,10 +41,12 @@ import type { KeyEvent, ScrollBoxRenderable } from '@opentui/core' // Section grouping: model rows keep their product/availability tiers, but all // selectable Freebuff models share the same daily session quota. // Putting the tier on a section header lets each row drop its redundant -// "Premium"/"Unlimited" chip. The shared 0/5 counter lives in the page title -// (rendered by the parent), not the section header — this picker is purely a -// list of choices grouped by tier. Empty sections are filtered so a model set -// with no premium (or no unlimited) entries doesn't render an orphan header. +// "Premium"/"Unlimited" chip. The shared 0/5 counter renders below the picker +// (by the parent, landing only); headers carry only what the counter can't: +// "no daily limit" on UNLIMITED, and a reset countdown on PREMIUM once the +// quota is exhausted (the moment its rows grey out). Empty sections are +// filtered so a model set with no premium (or no unlimited) entries doesn't +// render an orphan header. // // `label` may be empty: limited-tier users only see the constrained model set, // so the "LIMITED" header would just leak the internal tier name without @@ -62,8 +69,8 @@ type Section = { * Space) commits the focused row. Mouse click commits in one step. * * Layout: rows are grouped into PREMIUM / UNLIMITED sections so the tier is - * visible without a per-row chip; the shared 0/5 counter sits inside the - * PREMIUM section header. Names align in a column so taglines line up across + * visible without a per-row chip; the shared 0/5 counter renders below the + * picker (by the parent). Names align in a column so taglines line up across * rows. On narrow terminals the secondary details (warning / deployment * hours) drop onto an indented second line under the row. * @@ -170,6 +177,23 @@ export const FreebuffModelSelector: React.FC = ({ const committedModelId = session?.status === 'queued' ? session.model : null const rateLimitsByModel = getRateLimitsByModel(session) + // PREMIUM-header reset countdown, shown only once the shared quota is + // exhausted — that's when the premium rows grey out, and (in the queued + // state) the only place that explains why. All premium models share one + // pool; the server replicates the same snapshot under every model id, so + // any entry has the right count. + const sharedRateLimit = rateLimitsByModel + ? Object.values(rateLimitsByModel)[0] + : undefined + const premiumExhausted = + (sharedRateLimit?.recentCount ?? 0) >= FREEBUFF_PREMIUM_SESSION_LIMIT + const premiumResetCountdown = premiumExhausted + ? formatFreebuffPremiumResetCountdown( + getFreebuffPremiumResetAt({ rateLimitsByModel, nowMs: now }), + now, + ) + : null + const BUTTON_CHROME = 4 // 2 border + 2 padding const NAME_GAP = 2 // spaces between name column and details column @@ -455,8 +479,22 @@ export const FreebuffModelSelector: React.FC = ({ marginTop: sectionIdx === 0 ? 0 : SECTION_GAP, }} > + {/* wrapMode 'none' pins headers to one row — the offset math above + assumes exactly 1 row per header, so a wrap would desync the + focused-row auto-scroll. */} {section.label && ( - {section.label} + + {section.label} + {section.key === 'premium' && premiumResetCountdown && ( + + {' '} + · resets in {premiumResetCountdown} + + )} + {section.key === 'unlimited' && ( + · no daily limit + )} + )} {section.models.map(renderModelButton)} diff --git a/cli/src/components/waiting-room-screen.tsx b/cli/src/components/waiting-room-screen.tsx index fd4e179941..b3569cf1fa 100644 --- a/cli/src/components/waiting-room-screen.tsx +++ b/cli/src/components/waiting-room-screen.tsx @@ -107,12 +107,26 @@ const formatPrivacySignalList = ( return `${labels.slice(0, -1).join(', ')}, or ${labels[labels.length - 1]}` } +/** "BR" → "Brazil". Falls back to the raw code when the runtime can't + * resolve it (malformed code, missing ICU data). */ +const formatCountryName = (countryCode: string): string => { + try { + return ( + new Intl.DisplayNames(['en'], { type: 'region' }).of(countryCode) ?? + countryCode + ) + } catch { + return countryCode + } +} + // Tone matters here: this is shown to users who, through no fault of their // own, get the smaller model set. Frame it as model *availability* ("aren't // available in BR yet"), never as restricted *access* ("limited mode", // "blocked") — clear enough to answer "why these models?" for someone who // goes looking, quiet enough to ignore for someone who doesn't. The VPN case -// is the one the user can act on, so it leads with the action. +// is the one the user can act on, so it leads with the action. Rendered +// directly under the model list — that's where "why these models?" gets asked. const getLimitedModeNotice = ( session: FreebuffSessionResponse | null, ): string | null => { @@ -133,7 +147,9 @@ const getLimitedModeNotice = ( session.ipPrivacySignals ?? undefined, )}? More models are available on a direct connection` case 'country_not_allowed': - return `Some models aren't available in ${countryCode ?? 'your region'} yet` + return `Some models aren't available in ${ + countryCode ? formatCountryName(countryCode) : 'your region' + } yet` case 'anonymized_or_unknown_country': case 'missing_client_ip': case 'unresolved_client_ip': @@ -266,19 +282,19 @@ const TakeoverPrompt: React.FC = () => { * doesn't jump once they earn their first day. */ const StreakInlineLine: React.FC<{ streak: number - marginBottom: number -}> = ({ streak, marginBottom }) => { + marginTop: number +}> = ({ streak, marginTop }) => { const theme = useTheme() if (streak <= 0) { - return + return } return ( = ({ const isQueued = session?.status === 'queued' const accessTier = session && 'accessTier' in session ? session.accessTier : 'full' + // Hidden in compact terminals: the notice is nice-to-have context, and + // below 22 rows every line competes with the picker itself. const limitedModeNotice = - accessTier === 'limited' ? getLimitedModeNotice(session) : null + accessTier === 'limited' && !compact ? getLimitedModeNotice(session) : null // 'none' = user hasn't joined any queue yet. We're in the pre-chat landing // state: show the picker with live N-in-line hints and a prompt. Picking a // model triggers joinFreebuffQueue, which POSTs and transitions us to @@ -429,18 +447,22 @@ export const WaitingRoomScreen: React.FC = ({ : logoLines + 1 /* marginBottom */ + (logoMode === 'full' ? 1 : 0) const mainPaddingRows = (logoMode === 'text' ? 1 : 0) + 1 const adRows = showAds ? AD_CARD_HEIGHT : 0 - // Streak is rendered inline as a one-line row directly under the counter - // (landing) or title (queued), with the same bottom margin as its neighbor - // so the picker still sits flush below it. - const streakLandingRows = reserveStreakSlot ? 1 + textMarginBottom : 0 - const streakQueuedRows = reserveStreakSlot ? 1 + 1 : 0 + // Status lines render below the picker, each with marginTop 1: the session + // counter (landing only), then the limited-mode notice, then the streak. + // They still eat into the picker's height budget regardless of being above + // or below it. + const streakRows = reserveStreakSlot ? 1 + 1 : 0 + const noticeRows = limitedModeNotice + ? 1 /* marginTop */ + wrappedRows(limitedModeNotice) + : 0 + const belowPickerRows = streakRows + noticeRows + const counterRows = 1 /* marginTop */ + wrappedRows(counterText) const reservedChrome = 2 + adRows + mainPaddingRows + logoBlockRows const landingTextRows = wrappedRows('Pick a model to start') + textMarginBottom + - wrappedRows(counterText) + - textMarginBottom + - streakLandingRows + counterRows + + belowPickerRows const queuedTitleText = session?.status === 'queued' && session.position === 1 ? "You're next in line" @@ -449,7 +471,7 @@ export const WaitingRoomScreen: React.FC = ({ wrappedRows(queuedTitleText) + 1 + 4 /* position panel */ + - streakQueuedRows + belowPickerRows const selectorMaxHeight = Math.max( 3, terminalHeight - @@ -491,13 +513,9 @@ export const WaitingRoomScreen: React.FC = ({ flexShrink: 0, }} > - - {limitedModeNotice && ( - - {limitedModeNotice} - - )} - + {/* Empty spacer: justifyContent space-between needs a left sibling to + keep the ✕ pushed to the right. */} +