feat(broker): add claude-powered telegram bot with tool calling
Some checks failed
CI / Lint (push) Has been cancelled
CI / Typecheck (push) Has been cancelled
CI / Broker tests (Postgres) (push) Has been cancelled
CI / Docker build (linux/amd64) (push) Has been cancelled

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Alejandro Gutiérrez
2026-04-13 20:40:16 +01:00
parent 4561076904
commit f4881b21b0
5 changed files with 616 additions and 36 deletions

153
pnpm-lock.yaml generated
View File

@@ -110,6 +110,9 @@ importers:
apps/broker:
dependencies:
'@anthropic-ai/sdk':
specifier: 0.71.2
version: 0.71.2(zod@4.1.13)
'@qdrant/js-client-rest':
specifier: 1.17.0
version: 1.17.0(typescript@5.9.3)
@@ -121,7 +124,7 @@ importers:
version: link:../../packages/shared
drizzle-orm:
specifier: 0.44.7
version: 0.44.7(@libsql/client@0.14.0)(@opentelemetry/api@1.9.0)(@types/pg@8.16.0)(better-sqlite3@12.4.1)(kysely@0.28.5)(pg@8.16.3)(postgres@3.4.7)
version: 0.44.7(@libsql/client@0.14.0)(@opentelemetry/api@1.9.0)(@types/pg@8.16.0)(better-sqlite3@12.4.1)(bun-types@1.3.12)(kysely@0.28.5)(pg@8.16.3)(postgres@3.4.7)
grammy:
specifier: ^1.35.0
version: 1.42.0(encoding@0.1.13)
@@ -221,6 +224,55 @@ importers:
specifier: 'catalog:'
version: 4.0.14(@opentelemetry/api@1.9.0)(@types/node@24.0.13)(@vitest/ui@4.0.14)(happy-dom@20.8.9)(jiti@2.6.1)(jsdom@26.0.0)(lightningcss@1.30.2)(sass@1.77.4)(terser@5.43.1)(tsx@4.21.0)(yaml@2.8.0)
apps/cli-v2:
dependencies:
'@modelcontextprotocol/sdk':
specifier: 1.27.1
version: 1.27.1(zod@4.1.13)
citty:
specifier: 0.2.2
version: 0.2.2
libsodium-wrappers:
specifier: 0.7.15
version: 0.7.15
ws:
specifier: 8.20.0
version: 8.20.0
zod:
specifier: 4.1.13
version: 4.1.13
devDependencies:
'@turbostarter/eslint-config':
specifier: workspace:*
version: link:../../tooling/eslint
'@turbostarter/prettier-config':
specifier: workspace:*
version: link:../../tooling/prettier
'@turbostarter/tsconfig':
specifier: workspace:*
version: link:../../tooling/typescript
'@turbostarter/vitest-config':
specifier: workspace:*
version: link:../../tooling/vitest
'@types/libsodium-wrappers':
specifier: 0.7.14
version: 0.7.14
'@types/ws':
specifier: 8.5.13
version: 8.5.13
eslint:
specifier: 'catalog:'
version: 9.39.0(jiti@2.6.1)
prettier:
specifier: 'catalog:'
version: 3.6.2
typescript:
specifier: 'catalog:'
version: 5.9.3
vitest:
specifier: 'catalog:'
version: 4.0.14(@opentelemetry/api@1.9.0)(@types/node@24.0.13)(@vitest/ui@4.0.14)(happy-dom@20.8.9)(jiti@2.6.1)(jsdom@26.0.0)(lightningcss@1.30.2)(sass@1.77.4)(terser@5.43.1)(tsx@4.21.0)(yaml@2.8.0)
apps/telegram:
dependencies:
grammy:
@@ -268,10 +320,10 @@ importers:
version: 0.5.10(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
'@payloadcms/db-postgres':
specifier: 3.81.0
version: 3.81.0(@libsql/client@0.14.0)(@opentelemetry/api@1.9.0)(better-sqlite3@12.4.1)(kysely@0.28.5)(payload@3.81.0(graphql@16.13.2)(typescript@5.9.3))(postgres@3.4.7)
version: 3.81.0(@libsql/client@0.14.0)(@opentelemetry/api@1.9.0)(better-sqlite3@12.4.1)(bun-types@1.3.12)(kysely@0.28.5)(payload@3.81.0(graphql@16.13.2)(typescript@5.9.3))(postgres@3.4.7)
'@payloadcms/db-sqlite':
specifier: ^3.81.0
version: 3.81.0(@opentelemetry/api@1.9.0)(@types/pg@8.10.2)(better-sqlite3@12.4.1)(kysely@0.28.5)(payload@3.81.0(graphql@16.13.2)(typescript@5.9.3))(pg@8.16.3)(postgres@3.4.7)
version: 3.81.0(@opentelemetry/api@1.9.0)(@types/pg@8.10.2)(better-sqlite3@12.4.1)(bun-types@1.3.12)(kysely@0.28.5)(payload@3.81.0(graphql@16.13.2)(typescript@5.9.3))(pg@8.16.3)(postgres@3.4.7)
'@payloadcms/next':
specifier: ^3.81.0
version: 3.81.0(@types/react@19.1.14)(graphql@16.13.2)(monaco-editor@0.55.1)(next@16.2.2(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.57.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(sass@1.77.4))(payload@3.81.0(graphql@16.13.2)(typescript@5.9.3))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.9.3)
@@ -801,10 +853,10 @@ importers:
version: link:../shared
drizzle-orm:
specifier: 0.44.7
version: 0.44.7(@libsql/client@0.14.0)(@opentelemetry/api@1.9.0)(@types/pg@8.16.0)(better-sqlite3@12.4.1)(kysely@0.28.5)(pg@8.16.3)(postgres@3.4.7)
version: 0.44.7(@libsql/client@0.14.0)(@opentelemetry/api@1.9.0)(@types/pg@8.16.0)(better-sqlite3@12.4.1)(bun-types@1.3.12)(kysely@0.28.5)(pg@8.16.3)(postgres@3.4.7)
drizzle-zod:
specifier: 0.8.3
version: 0.8.3(drizzle-orm@0.44.7(@libsql/client@0.14.0)(@opentelemetry/api@1.9.0)(@types/pg@8.16.0)(better-sqlite3@12.4.1)(kysely@0.28.5)(pg@8.16.3)(postgres@3.4.7))(zod@4.1.13)
version: 0.8.3(drizzle-orm@0.44.7(@libsql/client@0.14.0)(@opentelemetry/api@1.9.0)(@types/pg@8.16.0)(better-sqlite3@12.4.1)(bun-types@1.3.12)(kysely@0.28.5)(pg@8.16.3)(postgres@3.4.7))(zod@4.1.13)
envin:
specifier: 'catalog:'
version: 1.1.10(arktype@2.1.20)(typescript@5.9.3)(zod@4.1.13)
@@ -829,7 +881,7 @@ importers:
version: 0.31.7
drizzle-seed:
specifier: 0.3.1
version: 0.3.1(drizzle-orm@0.44.7(@libsql/client@0.14.0)(@opentelemetry/api@1.9.0)(@types/pg@8.16.0)(better-sqlite3@12.4.1)(kysely@0.28.5)(pg@8.16.3)(postgres@3.4.7))
version: 0.3.1(drizzle-orm@0.44.7(@libsql/client@0.14.0)(@opentelemetry/api@1.9.0)(@types/pg@8.16.0)(better-sqlite3@12.4.1)(bun-types@1.3.12)(kysely@0.28.5)(pg@8.16.3)(postgres@3.4.7))
eslint:
specifier: 'catalog:'
version: 9.39.0(jiti@2.6.1)
@@ -8241,6 +8293,9 @@ packages:
buffer@6.0.3:
resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==}
bun-types@1.3.12:
resolution: {integrity: sha512-HqOLj5PoFajAQciOMRiIZGNoKxDJSr6qigAttOX40vJuSp6DN/CxWp9s3C1Xwm4oH7ybueITwiaOcWXoYVoRkA==}
busboy@1.6.0:
resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==}
engines: {node: '>=10.16.0'}
@@ -18253,13 +18308,13 @@ snapshots:
'@opentelemetry/api': 1.9.0
'@opentelemetry/core': 2.2.0(@opentelemetry/api@1.9.0)
'@payloadcms/db-postgres@3.81.0(@libsql/client@0.14.0)(@opentelemetry/api@1.9.0)(better-sqlite3@12.4.1)(kysely@0.28.5)(payload@3.81.0(graphql@16.13.2)(typescript@5.9.3))(postgres@3.4.7)':
'@payloadcms/db-postgres@3.81.0(@libsql/client@0.14.0)(@opentelemetry/api@1.9.0)(better-sqlite3@12.4.1)(bun-types@1.3.12)(kysely@0.28.5)(payload@3.81.0(graphql@16.13.2)(typescript@5.9.3))(postgres@3.4.7)':
dependencies:
'@payloadcms/drizzle': 3.81.0(@libsql/client@0.14.0)(@opentelemetry/api@1.9.0)(@types/pg@8.10.2)(better-sqlite3@12.4.1)(kysely@0.28.5)(payload@3.81.0(graphql@16.13.2)(typescript@5.9.3))(pg@8.16.3)(postgres@3.4.7)
'@payloadcms/drizzle': 3.81.0(@libsql/client@0.14.0)(@opentelemetry/api@1.9.0)(@types/pg@8.10.2)(better-sqlite3@12.4.1)(bun-types@1.3.12)(kysely@0.28.5)(payload@3.81.0(graphql@16.13.2)(typescript@5.9.3))(pg@8.16.3)(postgres@3.4.7)
'@types/pg': 8.10.2
console-table-printer: 2.12.1
drizzle-kit: 0.31.7
drizzle-orm: 0.44.7(@libsql/client@0.14.0)(@opentelemetry/api@1.9.0)(@types/pg@8.10.2)(better-sqlite3@12.4.1)(kysely@0.28.5)(pg@8.16.3)(postgres@3.4.7)
drizzle-orm: 0.44.7(@libsql/client@0.14.0)(@opentelemetry/api@1.9.0)(@types/pg@8.10.2)(better-sqlite3@12.4.1)(bun-types@1.3.12)(kysely@0.28.5)(pg@8.16.3)(postgres@3.4.7)
payload: 3.81.0(graphql@16.13.2)(typescript@5.9.3)
pg: 8.16.3
prompts: 2.4.2
@@ -18296,13 +18351,13 @@ snapshots:
- sqlite3
- supports-color
'@payloadcms/db-sqlite@3.81.0(@opentelemetry/api@1.9.0)(@types/pg@8.10.2)(better-sqlite3@12.4.1)(kysely@0.28.5)(payload@3.81.0(graphql@16.13.2)(typescript@5.9.3))(pg@8.16.3)(postgres@3.4.7)':
'@payloadcms/db-sqlite@3.81.0(@opentelemetry/api@1.9.0)(@types/pg@8.10.2)(better-sqlite3@12.4.1)(bun-types@1.3.12)(kysely@0.28.5)(payload@3.81.0(graphql@16.13.2)(typescript@5.9.3))(pg@8.16.3)(postgres@3.4.7)':
dependencies:
'@libsql/client': 0.14.0
'@payloadcms/drizzle': 3.81.0(@libsql/client@0.14.0)(@opentelemetry/api@1.9.0)(@types/pg@8.10.2)(better-sqlite3@12.4.1)(kysely@0.28.5)(payload@3.81.0(graphql@16.13.2)(typescript@5.9.3))(pg@8.16.3)(postgres@3.4.7)
'@payloadcms/drizzle': 3.81.0(@libsql/client@0.14.0)(@opentelemetry/api@1.9.0)(@types/pg@8.10.2)(better-sqlite3@12.4.1)(bun-types@1.3.12)(kysely@0.28.5)(payload@3.81.0(graphql@16.13.2)(typescript@5.9.3))(pg@8.16.3)(postgres@3.4.7)
console-table-printer: 2.12.1
drizzle-kit: 0.31.7
drizzle-orm: 0.44.7(@libsql/client@0.14.0)(@opentelemetry/api@1.9.0)(@types/pg@8.10.2)(better-sqlite3@12.4.1)(kysely@0.28.5)(pg@8.16.3)(postgres@3.4.7)
drizzle-orm: 0.44.7(@libsql/client@0.14.0)(@opentelemetry/api@1.9.0)(@types/pg@8.10.2)(better-sqlite3@12.4.1)(bun-types@1.3.12)(kysely@0.28.5)(pg@8.16.3)(postgres@3.4.7)
payload: 3.81.0(graphql@16.13.2)(typescript@5.9.3)
prompts: 2.4.2
to-snake-case: 1.0.0
@@ -18340,11 +18395,11 @@ snapshots:
- supports-color
- utf-8-validate
'@payloadcms/drizzle@3.81.0(@libsql/client@0.14.0)(@opentelemetry/api@1.9.0)(@types/pg@8.10.2)(better-sqlite3@12.4.1)(kysely@0.28.5)(payload@3.81.0(graphql@16.13.2)(typescript@5.9.3))(pg@8.16.3)(postgres@3.4.7)':
'@payloadcms/drizzle@3.81.0(@libsql/client@0.14.0)(@opentelemetry/api@1.9.0)(@types/pg@8.10.2)(better-sqlite3@12.4.1)(bun-types@1.3.12)(kysely@0.28.5)(payload@3.81.0(graphql@16.13.2)(typescript@5.9.3))(pg@8.16.3)(postgres@3.4.7)':
dependencies:
console-table-printer: 2.12.1
dequal: 2.0.3
drizzle-orm: 0.44.7(@libsql/client@0.14.0)(@opentelemetry/api@1.9.0)(@types/pg@8.10.2)(better-sqlite3@12.4.1)(kysely@0.28.5)(pg@8.16.3)(postgres@3.4.7)
drizzle-orm: 0.44.7(@libsql/client@0.14.0)(@opentelemetry/api@1.9.0)(@types/pg@8.10.2)(better-sqlite3@12.4.1)(bun-types@1.3.12)(kysely@0.28.5)(pg@8.16.3)(postgres@3.4.7)
payload: 3.81.0(graphql@16.13.2)(typescript@5.9.3)
prompts: 2.4.2
to-snake-case: 1.0.0
@@ -21154,7 +21209,7 @@ snapshots:
'@sentry/bundler-plugin-core': 4.6.1(encoding@0.1.13)
unplugin: 1.0.1
uuid: 9.0.1
webpack: 5.100.2(esbuild@0.25.0)
webpack: 5.100.2
transitivePeerDependencies:
- encoding
- supports-color
@@ -23137,6 +23192,11 @@ snapshots:
base64-js: 1.5.1
ieee754: 1.2.1
bun-types@1.3.12:
dependencies:
'@types/node': 24.0.13
optional: true
busboy@1.6.0:
dependencies:
streamsearch: 1.1.0
@@ -23869,35 +23929,37 @@ snapshots:
transitivePeerDependencies:
- supports-color
drizzle-orm@0.44.7(@libsql/client@0.14.0)(@opentelemetry/api@1.9.0)(@types/pg@8.10.2)(better-sqlite3@12.4.1)(kysely@0.28.5)(pg@8.16.3)(postgres@3.4.7):
drizzle-orm@0.44.7(@libsql/client@0.14.0)(@opentelemetry/api@1.9.0)(@types/pg@8.10.2)(better-sqlite3@12.4.1)(bun-types@1.3.12)(kysely@0.28.5)(pg@8.16.3)(postgres@3.4.7):
optionalDependencies:
'@libsql/client': 0.14.0
'@opentelemetry/api': 1.9.0
'@types/pg': 8.10.2
better-sqlite3: 12.4.1
bun-types: 1.3.12
kysely: 0.28.5
pg: 8.16.3
postgres: 3.4.7
drizzle-orm@0.44.7(@libsql/client@0.14.0)(@opentelemetry/api@1.9.0)(@types/pg@8.16.0)(better-sqlite3@12.4.1)(kysely@0.28.5)(pg@8.16.3)(postgres@3.4.7):
drizzle-orm@0.44.7(@libsql/client@0.14.0)(@opentelemetry/api@1.9.0)(@types/pg@8.16.0)(better-sqlite3@12.4.1)(bun-types@1.3.12)(kysely@0.28.5)(pg@8.16.3)(postgres@3.4.7):
optionalDependencies:
'@libsql/client': 0.14.0
'@opentelemetry/api': 1.9.0
'@types/pg': 8.16.0
better-sqlite3: 12.4.1
bun-types: 1.3.12
kysely: 0.28.5
pg: 8.16.3
postgres: 3.4.7
drizzle-seed@0.3.1(drizzle-orm@0.44.7(@libsql/client@0.14.0)(@opentelemetry/api@1.9.0)(@types/pg@8.16.0)(better-sqlite3@12.4.1)(kysely@0.28.5)(pg@8.16.3)(postgres@3.4.7)):
drizzle-seed@0.3.1(drizzle-orm@0.44.7(@libsql/client@0.14.0)(@opentelemetry/api@1.9.0)(@types/pg@8.16.0)(better-sqlite3@12.4.1)(bun-types@1.3.12)(kysely@0.28.5)(pg@8.16.3)(postgres@3.4.7)):
dependencies:
pure-rand: 6.1.0
optionalDependencies:
drizzle-orm: 0.44.7(@libsql/client@0.14.0)(@opentelemetry/api@1.9.0)(@types/pg@8.16.0)(better-sqlite3@12.4.1)(kysely@0.28.5)(pg@8.16.3)(postgres@3.4.7)
drizzle-orm: 0.44.7(@libsql/client@0.14.0)(@opentelemetry/api@1.9.0)(@types/pg@8.16.0)(better-sqlite3@12.4.1)(bun-types@1.3.12)(kysely@0.28.5)(pg@8.16.3)(postgres@3.4.7)
drizzle-zod@0.8.3(drizzle-orm@0.44.7(@libsql/client@0.14.0)(@opentelemetry/api@1.9.0)(@types/pg@8.16.0)(better-sqlite3@12.4.1)(kysely@0.28.5)(pg@8.16.3)(postgres@3.4.7))(zod@4.1.13):
drizzle-zod@0.8.3(drizzle-orm@0.44.7(@libsql/client@0.14.0)(@opentelemetry/api@1.9.0)(@types/pg@8.16.0)(better-sqlite3@12.4.1)(bun-types@1.3.12)(kysely@0.28.5)(pg@8.16.3)(postgres@3.4.7))(zod@4.1.13):
dependencies:
drizzle-orm: 0.44.7(@libsql/client@0.14.0)(@opentelemetry/api@1.9.0)(@types/pg@8.16.0)(better-sqlite3@12.4.1)(kysely@0.28.5)(pg@8.16.3)(postgres@3.4.7)
drizzle-orm: 0.44.7(@libsql/client@0.14.0)(@opentelemetry/api@1.9.0)(@types/pg@8.16.0)(better-sqlite3@12.4.1)(bun-types@1.3.12)(kysely@0.28.5)(pg@8.16.3)(postgres@3.4.7)
zod: 4.1.13
dunder-proto@1.0.1:
@@ -27217,7 +27279,7 @@ snapshots:
postcss: 8.4.31
react: 19.2.3
react-dom: 19.2.3(react@19.2.3)
styled-jsx: 5.1.6(@babel/core@7.28.5)(react@19.2.3)
styled-jsx: 5.1.6(react@19.2.3)
optionalDependencies:
'@next/swc-darwin-arm64': 16.2.2
'@next/swc-darwin-x64': 16.2.2
@@ -29759,6 +29821,12 @@ snapshots:
react: 19.2.3
optionalDependencies:
'@babel/core': 7.28.5
optional: true
styled-jsx@5.1.6(react@19.2.3):
dependencies:
client-only: 0.0.1
react: 19.2.3
styleq@0.1.3:
optional: true
@@ -29916,6 +29984,15 @@ snapshots:
optionalDependencies:
esbuild: 0.25.0
terser-webpack-plugin@5.3.14(webpack@5.100.2):
dependencies:
'@jridgewell/trace-mapping': 0.3.31
jest-worker: 27.5.1
schema-utils: 4.3.2
serialize-javascript: 6.0.2
terser: 5.43.1
webpack: 5.100.2
terser@5.43.1:
dependencies:
'@jridgewell/source-map': 0.3.10
@@ -30628,6 +30705,38 @@ snapshots:
webpack-virtual-modules@0.5.0: {}
webpack@5.100.2:
dependencies:
'@types/eslint-scope': 3.7.7
'@types/estree': 1.0.8
'@types/json-schema': 7.0.15
'@webassemblyjs/ast': 1.14.1
'@webassemblyjs/wasm-edit': 1.14.1
'@webassemblyjs/wasm-parser': 1.14.1
acorn: 8.16.0
acorn-import-phases: 1.0.4(acorn@8.16.0)
browserslist: 4.25.1
chrome-trace-event: 1.0.4
enhanced-resolve: 5.18.3
es-module-lexer: 1.7.0
eslint-scope: 5.1.1
events: 3.3.0
glob-to-regexp: 0.4.1
graceful-fs: 4.2.11
json-parse-even-better-errors: 2.3.1
loader-runner: 4.3.0
mime-types: 2.1.35
neo-async: 2.6.2
schema-utils: 4.3.2
tapable: 2.2.2
terser-webpack-plugin: 5.3.14(webpack@5.100.2)
watchpack: 2.4.4
webpack-sources: 3.3.3
transitivePeerDependencies:
- '@swc/core'
- esbuild
- uglify-js
webpack@5.100.2(esbuild@0.25.0):
dependencies:
'@types/eslint-scope': 3.7.7