feat: agent gateway

This commit is contained in:
Acbox
2026-01-28 14:00:28 +08:00
parent bb5482b982
commit 0711b1f086
22 changed files with 715 additions and 402 deletions
-336
View File
@@ -1,336 +0,0 @@
# Agent Prompts 初步迁移
## 概述
本文档记录了从 TypeScript agent (`@packages/agent`) 到 Go chat 服务的初步迁移工作。
## 完成的工作
### 1. 删除 Config 中的 Memory 配置
由于现在使用数据库中的模型配置,不再需要配置文件中的 memory 配置。
**变更文件**:
-`config.toml.example` - 删除 `[memory]` 配置段
-`internal/config/config.go` - 删除 `MemoryConfig` 结构
-`cmd/agent/main.go` - 移除对 `cfg.Memory` 的引用
**影响**:
- Memory 服务现在完全依赖数据库中配置的模型
- 如果数据库中没有配置模型,服务会启动失败并提示用户配置
- 更清晰的配置管理,避免配置分散
### 2. 迁移 Agent Prompts 到 Chat 包
从 TypeScript 的 `packages/agent/src/prompts/` 迁移到 Go 的 `internal/chat/prompts.go`
**迁移的内容**:
#### System Prompt (系统提示词)
- ✅ 基础系统提示词
- ✅ 日期时间格式化
- ✅ 语言设置
- ✅ 平台信息(available-platforms, current-platform
- ✅ 上下文加载时间配置
- ✅ 响应指南
#### Schedule Prompt (定时任务提示词)
- ✅ 定时任务触发提示
- ✅ 任务信息(名称、描述、ID、最大调用次数、Cron 模式)
- ✅ 命令内容
#### 辅助函数
-`FormatTime()` - 时间格式化
-`Quote()` - Markdown 代码格式化
-`Block()` - 代码块格式化
**暂未迁移(后续工作)**:
- ⏸️ Memory 工具说明
- ⏸️ Schedule 工具说明
- ⏸️ Message 工具说明
- ⏸️ MCP 工具集成
- ⏸️ 工具调用逻辑
## 新的 Prompt 结构
### SystemPrompt
```go
type PromptParams struct {
Date time.Time
Locale string
Language string
MaxContextLoadTime int // 上下文加载时间(分钟)
Platforms []string // 可用平台列表
CurrentPlatform string // 当前平台
}
func SystemPrompt(params PromptParams) string
```
**示例**:
```go
prompt := chat.SystemPrompt(chat.PromptParams{
Date: time.Now(),
Locale: "zh-CN",
Language: "Chinese",
MaxContextLoadTime: 24 * 60,
Platforms: []string{"telegram", "wechat"},
CurrentPlatform: "telegram",
})
```
### SchedulePrompt
```go
type SchedulePromptParams struct {
Date time.Time
Locale string
ScheduleName string
ScheduleDescription string
ScheduleID string
MaxCalls *int // nil 表示无限次
CronPattern string
Command string
}
func SchedulePrompt(params SchedulePromptParams) string
```
**示例**:
```go
maxCalls := 1
prompt := chat.SchedulePrompt(chat.SchedulePromptParams{
Date: time.Now(),
Locale: "zh-CN",
ScheduleName: "早餐提醒",
ScheduleDescription: "每天早上 7 点提醒吃早餐",
ScheduleID: "schedule-123",
MaxCalls: &maxCalls,
CronPattern: "0 7 * * *",
Command: "提醒用户吃早餐,推荐健康食谱",
})
```
## 使用方式
### Chat Resolver 中的使用
Chat Resolver 会自动为每个请求添加系统提示词:
```go
// 在 resolver.go 中
systemPrompt := SystemPrompt(PromptParams{
Date: time.Now(),
Locale: "en-US",
Language: "Same as user input",
MaxContextLoadTime: 24 * 60,
Platforms: []string{},
CurrentPlatform: "api",
})
```
### 自定义 Prompt 参数
未来可以通过以下方式自定义:
1. **从数据库加载平台列表**:
```go
platforms, _ := platformService.GetActivePlatforms(ctx)
platformNames := make([]string, len(platforms))
for i, p := range platforms {
platformNames[i] = p.Name
}
```
2. **从用户设置加载语言偏好**:
```go
userSettings, _ := settingsService.GetUserSettings(ctx, userID)
language := userSettings.Language
```
3. **从会话上下文获取当前平台**:
```go
currentPlatform := "telegram" // 从请求头或会话中获取
```
## 对比 TypeScript 版本
### TypeScript (原始)
```typescript
export const system = ({ date, locale, language, maxContextLoadTime, platforms, currentPlatform }: SystemParams) => {
return `
---
${time({ date, locale })}
language: ${language}
available-platforms:
${platforms.map(platform => ` - ${platform.name}`).join('\n')}
current-platform: ${currentPlatform}
---
You are a personal housekeeper assistant...
`.trim()
}
```
### Go (迁移后)
```go
func SystemPrompt(params PromptParams) string {
timeStr := FormatTime(params.Date, params.Locale)
platformsList := buildPlatformsList(params.Platforms)
return fmt.Sprintf(`---
%s
language: %s
available-platforms:
%s
current-platform: %s
---
You are a personal housekeeper assistant...`,
timeStr, params.Language, platformsList, params.CurrentPlatform)
}
```
## 配置迁移指南
### 旧配置 (config.toml)
```toml
[memory]
base_url = "https://api.openai.com/v1"
api_key = "sk-..."
model = "gpt-4.1-nano"
timeout_seconds = 10
```
### 新配置 (数据库)
```sql
-- 1. 创建 LLM Provider
INSERT INTO llm_providers (name, client_type, base_url, api_key)
VALUES ('OpenAI', 'openai', 'https://api.openai.com/v1', 'sk-...');
-- 2. 创建 Chat 模型(用于 memory
INSERT INTO models (model_id, name, llm_provider_id, type, enable_as)
VALUES ('gpt-4-turbo', 'GPT-4 Turbo', '<provider-uuid>', 'chat', 'memory');
-- 或使用现有的 chat 模型
UPDATE models SET enable_as = 'memory' WHERE model_id = 'gpt-4-turbo';
```
## 测试建议
### 1. 测试系统提示词
```bash
# 发起聊天请求
curl -X POST http://localhost:8080/api/chat \
-H "Authorization: Bearer $TOKEN" \
-d '{
"messages": [
{"role": "user", "content": "你好"}
]
}'
```
检查响应中是否:
- 使用了正确的语言
- AI 理解自己是个人管家助手
- 响应风格友好且有帮助
### 2. 验证配置迁移
```bash
# 启动服务,检查日志
# 应该看到:
# Using memory model: gpt-4-turbo (provider: openai)
# 不应该看到:
# WARNING: No memory model configured, using fallback LLMClient
```
### 3. 测试 Memory 操作
```bash
# 添加记忆
curl -X POST http://localhost:8080/api/memory/add \
-H "Authorization: Bearer $TOKEN" \
-d '{
"messages": [
{"role": "user", "content": "我喜欢吃披萨"}
],
"user_id": "user-123"
}'
# 搜索记忆
curl -X POST http://localhost:8080/api/memory/search \
-H "Authorization: Bearer $TOKEN" \
-d '{
"query": "我喜欢什么食物?",
"user_id": "user-123"
}'
```
## 后续工作
### 短期(工具集成)
- [ ] 添加 Memory 工具说明到系统提示词
- [ ] 添加 Schedule 工具说明到系统提示词
- [ ] 添加 Message 工具说明到系统提示词
- [ ] 实现工具调用功能
- [ ] 添加工具参数验证
### 中期(MCP 集成)
- [ ] MCP 连接管理
- [ ] MCP 工具动态加载
- [ ] MCP stdio/http/sse 传输支持
- [ ] 容器环境中的 MCP 执行
### 长期(功能完善)
- [ ] 多语言本地化支持
- [ ] 用户自定义系统提示词
- [ ] Prompt 模板系统
- [ ] A/B 测试不同 Prompt 版本
- [ ] Prompt 性能监控
## 文件清单
### 删除/清理
-`config.toml.example` - 删除 `[memory]`
-`internal/config/config.go` - 删除 `MemoryConfig`
-`cmd/agent/main.go` - 删除 `cfg.Memory` 引用
### 修改
-`internal/chat/prompts.go` - 完全重写,添加完整的 prompt 系统
-`internal/chat/resolver.go` - 使用新的 `SystemPrompt` 函数
### 新增
-`AGENT_MIGRATION.md` - 本文档
## 注意事项
1. **必须配置数据库模型**: 由于删除了配置文件中的回退配置,必须在数据库中配置至少一个 chat 模型
2. **Prompt 参数**: 当前使用硬编码的默认值,未来应该从用户设置或请求上下文中获取
3. **多语言支持**: `FormatTime()` 当前使用标准格式,未来应该使用 i18n 库进行本地化
4. **工具说明**: 当前 prompt 中提到了工具能力,但实际的工具说明还未添加,需要后续实现
5. **向后兼容**: 删除了配置文件中的 memory 配置,如果有旧的部署需要迁移
## 迁移检查清单
- [x] 删除 config.toml 中的 memory 配置
- [x] 删除 Config 结构中的 MemoryConfig
- [x] 更新 main.go 移除 cfg.Memory 引用
- [x] 迁移系统提示词
- [x] 迁移定时任务提示词
- [x] 迁移辅助函数
- [x] 更新 resolver 使用新的 prompt
- [x] 通过 linter 检查
- [x] 编写迁移文档
- [ ] 测试 chat 功能
- [ ] 测试 memory 功能
- [ ] 更新部署文档
## 相关文档
- [Provider 重构总结](./REFACTORING_SUMMARY.md)
- [Chat 架构文档](./internal/chat/ARCHITECTURE.md)
- [TypeScript Agent 源码](./packages/agent/src/)
+44
View File
@@ -0,0 +1,44 @@
# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
# dependencies
/node_modules
/.pnp
.pnp.js
# testing
/coverage
# next.js
/.next/
/out/
# production
/build
# misc
.DS_Store
*.pem
# debug
npm-debug.log*
yarn-debug.log*
yarn-error.log*
# local env files
.env.local
.env.development.local
.env.test.local
.env.production.local
# vercel
.vercel
**/*.trace
**/*.zip
**/*.tar.gz
**/*.tgz
**/*.log
package-lock.json
**/*.bun
dist/
+15
View File
@@ -0,0 +1,15 @@
# Elysia with Bun runtime
## Getting Started
To get started with this template, simply paste this command into your terminal:
```bash
bun create elysia ./elysia-example
```
## Development
To start the development server run:
```bash
bun run dev
```
Open http://localhost:3000/ with your browser to see the result.
+56
View File
@@ -0,0 +1,56 @@
{
"lockfileVersion": 1,
"configVersion": 1,
"workspaces": {
"": {
"name": "agent",
"dependencies": {
"elysia": "latest",
},
"devDependencies": {
"bun-types": "latest",
},
},
},
"packages": {
"@borewit/text-codec": ["@borewit/text-codec@0.2.1", "https://registry.npmmirror.com/@borewit/text-codec/-/text-codec-0.2.1.tgz", {}, "sha512-k7vvKPbf7J2fZ5klGRD9AeKfUvojuZIQ3BT5u7Jfv+puwXkUBUT5PVyMDfJZpy30CBDXGMgw7fguK/lpOMBvgw=="],
"@sinclair/typebox": ["@sinclair/typebox@0.34.48", "https://registry.npmmirror.com/@sinclair/typebox/-/typebox-0.34.48.tgz", {}, "sha512-kKJTNuK3AQOrgjjotVxMrCn1sUJwM76wMszfq1kdU4uYVJjvEWuFQ6HgvLt4Xz3fSmZlTOxJ/Ie13KnIcWQXFA=="],
"@tokenizer/inflate": ["@tokenizer/inflate@0.4.1", "https://registry.npmmirror.com/@tokenizer/inflate/-/inflate-0.4.1.tgz", { "dependencies": { "debug": "^4.4.3", "token-types": "^6.1.1" } }, "sha512-2mAv+8pkG6GIZiF1kNg1jAjh27IDxEPKwdGul3snfztFerfPGI1LjDezZp3i7BElXompqEtPmoPx6c2wgtWsOA=="],
"@tokenizer/token": ["@tokenizer/token@0.3.0", "https://registry.npmmirror.com/@tokenizer/token/-/token-0.3.0.tgz", {}, "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A=="],
"@types/node": ["@types/node@25.0.10", "https://registry.npmmirror.com/@types/node/-/node-25.0.10.tgz", { "dependencies": { "undici-types": "~7.16.0" } }, "sha512-zWW5KPngR/yvakJgGOmZ5vTBemDoSqF3AcV/LrO5u5wTWyEAVVh+IT39G4gtyAkh3CtTZs8aX/yRM82OfzHJRg=="],
"bun-types": ["bun-types@1.3.7", "https://registry.npmmirror.com/bun-types/-/bun-types-1.3.7.tgz", { "dependencies": { "@types/node": "*" } }, "sha512-qyschsA03Qz+gou+apt6HNl6HnI+sJJLL4wLDke4iugsE6584CMupOtTY1n+2YC9nGVrEKUlTs99jjRLKgWnjQ=="],
"cookie": ["cookie@1.1.1", "https://registry.npmmirror.com/cookie/-/cookie-1.1.1.tgz", {}, "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ=="],
"debug": ["debug@4.4.3", "https://registry.npmmirror.com/debug/-/debug-4.4.3.tgz", { "dependencies": { "ms": "^2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="],
"elysia": ["elysia@1.4.22", "https://registry.npmmirror.com/elysia/-/elysia-1.4.22.tgz", { "dependencies": { "cookie": "^1.1.1", "exact-mirror": "^0.2.6", "fast-decode-uri-component": "^1.0.1", "memoirist": "^0.4.0" }, "peerDependencies": { "@sinclair/typebox": ">= 0.34.0 < 1", "@types/bun": ">= 1.2.0", "file-type": ">= 20.0.0", "openapi-types": ">= 12.0.0", "typescript": ">= 5.0.0" }, "optionalPeers": ["@types/bun", "typescript"] }, "sha512-Q90VCb1RVFxnFaRV0FDoSylESQQLWgLHFmWciQJdX9h3b2cSasji9KWEUvaJuy/L9ciAGg4RAhUVfsXHg5K2RQ=="],
"exact-mirror": ["exact-mirror@0.2.6", "https://registry.npmmirror.com/exact-mirror/-/exact-mirror-0.2.6.tgz", { "peerDependencies": { "@sinclair/typebox": "^0.34.15" }, "optionalPeers": ["@sinclair/typebox"] }, "sha512-7s059UIx9/tnOKSySzUk5cPGkoILhTE4p6ncf6uIPaQ+9aRBQzQjc9+q85l51+oZ+P6aBxh084pD0CzBQPcFUA=="],
"fast-decode-uri-component": ["fast-decode-uri-component@1.0.1", "https://registry.npmmirror.com/fast-decode-uri-component/-/fast-decode-uri-component-1.0.1.tgz", {}, "sha512-WKgKWg5eUxvRZGwW8FvfbaH7AXSh2cL+3j5fMGzUMCxWBJ3dV3a7Wz8y2f/uQ0e3B6WmodD3oS54jTQ9HVTIIg=="],
"file-type": ["file-type@21.3.0", "https://registry.npmmirror.com/file-type/-/file-type-21.3.0.tgz", { "dependencies": { "@tokenizer/inflate": "^0.4.1", "strtok3": "^10.3.4", "token-types": "^6.1.1", "uint8array-extras": "^1.4.0" } }, "sha512-8kPJMIGz1Yt/aPEwOsrR97ZyZaD1Iqm8PClb1nYFclUCkBi0Ma5IsYNQzvSFS9ib51lWyIw5mIT9rWzI/xjpzA=="],
"ieee754": ["ieee754@1.2.1", "https://registry.npmmirror.com/ieee754/-/ieee754-1.2.1.tgz", {}, "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA=="],
"memoirist": ["memoirist@0.4.0", "https://registry.npmmirror.com/memoirist/-/memoirist-0.4.0.tgz", {}, "sha512-zxTgA0mSYELa66DimuNQDvyLq36AwDlTuVRbnQtB+VuTcKWm5Qc4z3WkSpgsFWHNhexqkIooqpv4hdcqrX5Nmg=="],
"ms": ["ms@2.1.3", "https://registry.npmmirror.com/ms/-/ms-2.1.3.tgz", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="],
"openapi-types": ["openapi-types@12.1.3", "https://registry.npmmirror.com/openapi-types/-/openapi-types-12.1.3.tgz", {}, "sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw=="],
"strtok3": ["strtok3@10.3.4", "https://registry.npmmirror.com/strtok3/-/strtok3-10.3.4.tgz", { "dependencies": { "@tokenizer/token": "^0.3.0" } }, "sha512-KIy5nylvC5le1OdaaoCJ07L+8iQzJHGH6pWDuzS+d07Cu7n1MZ2x26P8ZKIWfbK02+XIL8Mp4RkWeqdUCrDMfg=="],
"token-types": ["token-types@6.1.2", "https://registry.npmmirror.com/token-types/-/token-types-6.1.2.tgz", { "dependencies": { "@borewit/text-codec": "^0.2.1", "@tokenizer/token": "^0.3.0", "ieee754": "^1.2.1" } }, "sha512-dRXchy+C0IgK8WPC6xvCHFRIWYUbqqdEIKPaKo/AcTUNzwLTK6AH7RjdLWsEZcAN/TBdtfUw3PYEgPr5VPr6ww=="],
"uint8array-extras": ["uint8array-extras@1.5.0", "https://registry.npmmirror.com/uint8array-extras/-/uint8array-extras-1.5.0.tgz", {}, "sha512-rvKSBiC5zqCCiDZ9kAOszZcDvdAHwwIKJG33Ykj43OKcWsnmcBRL09YTU4nOeHZ8Y2a7l1MgTd08SBe9A8Qj6A=="],
"undici-types": ["undici-types@7.16.0", "https://registry.npmmirror.com/undici-types/-/undici-types-7.16.0.tgz", {}, "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw=="],
}
}
+24
View File
@@ -0,0 +1,24 @@
{
"name": "@memoh/agent-gateway",
"version": "1.0.0",
"scripts": {
"dev": "bun run --watch src/index.ts",
"build": "bun build src/index.ts --outfile dist/index.js --target bun --minify",
"start": "bun run dist/index.js"
},
"dependencies": {
"@ai-sdk/anthropic": "^3.0.9",
"@ai-sdk/google": "^3.0.6",
"@ai-sdk/mcp": "^1.0.6",
"@ai-sdk/openai": "^3.0.7",
"@elysiajs/cors": "^1.4.1",
"@modelcontextprotocol/sdk": "^1.25.2",
"ai": "^6.0.25",
"elysia": "latest",
"zod": "^4.3.5"
},
"devDependencies": {
"bun-types": "latest"
},
"module": "src/index.js"
}
+109
View File
@@ -0,0 +1,109 @@
import { generateText, ModelMessage, stepCountIs, streamText, TextStreamPart, ToolSet } from 'ai'
import { createChatGateway } from './gateway'
import { ClientType, Schedule } from './types'
import { system, schedule } from './prompts'
export interface AgentParams {
apiKey: string
baseUrl: string
model: string
clientType: ClientType
locale?: Intl.LocalesArgument
language?: string
maxSteps?: number
maxContextLoadTime: number
platforms?: string[]
currentPlatform?: string
}
export interface AgentInput {
messages: ModelMessage[]
query: string
}
export interface AgentResult {
messages: ModelMessage[]
}
export const createAgent = (params: AgentParams) => {
const gateway = createChatGateway(params.clientType)
const messages: ModelMessage[] = []
const maxSteps = params.maxSteps ?? 50
const generateSystem = () => {
return system({
date: new Date(),
locale: params.locale,
language: params.language,
maxContextLoadTime: params.maxContextLoadTime,
platforms: params.platforms ?? [],
currentPlatform: params.currentPlatform,
})
}
const ask = async (input: AgentInput): Promise<AgentResult> => {
messages.push(...input.messages)
messages.push({
role: 'user',
content: input.query,
})
const { response } = await generateText({
model: gateway({
apiKey: params.apiKey,
baseURL: params.baseUrl,
})(params.model),
system: generateSystem(),
stopWhen: stepCountIs(maxSteps),
messages,
})
return {
messages: response.messages,
}
}
async function* stream(input: AgentInput): AsyncGenerator<TextStreamPart<ToolSet>, AgentResult> {
messages.push(...input.messages)
messages.push({
role: 'user',
content: input.query,
})
const { response, fullStream } = streamText({
model: gateway({
apiKey: params.apiKey,
baseURL: params.baseUrl,
})(params.model),
system: generateSystem(),
stopWhen: stepCountIs(maxSteps),
messages,
})
for await (const event of fullStream) {
yield event
}
return {
messages: (await response).messages,
}
}
const triggerSchedule = async (
input: AgentInput,
scheduleData: Schedule
) => {
messages.push(...input.messages)
messages.push({
role: 'user',
content: schedule({
schedule: scheduleData,
locale: params.locale,
date: new Date(),
}),
})
return await ask(input)
}
return {
ask,
stream,
triggerSchedule,
}
}
+14
View File
@@ -0,0 +1,14 @@
import { createGateway as createAiGateway } from 'ai'
import { createOpenAI } from '@ai-sdk/openai'
import { createAnthropic } from '@ai-sdk/anthropic'
import { createGoogleGenerativeAI } from '@ai-sdk/google'
import { ClientType } from './types'
export const createChatGateway = (clientType: ClientType) => {
const clients = {
[ClientType.OPENAI]: createOpenAI,
[ClientType.ANTHROPIC]: createAnthropic,
[ClientType.GOOGLE]: createGoogleGenerativeAI,
}
return (clients[clientType] ?? createAiGateway)
}
+14
View File
@@ -0,0 +1,14 @@
import { Elysia } from 'elysia'
import { chatModule } from './modules/chat'
import { corsMiddleware } from './middlewares/cors'
import { errorMiddleware } from './middlewares/error'
const app = new Elysia()
.use(corsMiddleware)
.use(errorMiddleware)
.use(chatModule)
.listen(8081)
console.log(
`Agent Gateway is running at ${app.server?.hostname}:${app.server?.port}`
)
+9
View File
@@ -0,0 +1,9 @@
import cors from '@elysiajs/cors'
export const corsMiddleware = cors({
origin: '*',
methods: ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS'],
allowedHeaders: ['Content-Type', 'Authorization'],
exposeHeaders: ['Content-Type', 'Authorization'],
credentials: true,
})
+109
View File
@@ -0,0 +1,109 @@
import { Elysia } from 'elysia'
export interface ErrorResponse {
success: false
error: string
code?: string
details?: unknown
}
export const errorMiddleware = new Elysia({ name: 'error' })
.onError(({ code, error, set }) => {
console.error('[Error]', code, error)
switch (code) {
case 'VALIDATION':
set.status = 400
return {
success: false,
error: 'Validation failed',
code: 'VALIDATION_ERROR',
details: error.message,
} satisfies ErrorResponse
case 'NOT_FOUND':
set.status = 404
return {
success: false,
error: 'Resource not found',
code: 'NOT_FOUND',
} satisfies ErrorResponse
case 'PARSE':
set.status = 400
return {
success: false,
error: 'Invalid request format',
code: 'PARSE_ERROR',
details: error.message,
} satisfies ErrorResponse
case 'INTERNAL_SERVER_ERROR':
set.status = 500
return {
success: false,
error: 'Internal server error',
code: 'INTERNAL_SERVER_ERROR',
} satisfies ErrorResponse
case 'UNKNOWN':
default:
if (error instanceof Error) {
const message = error.message
if (
message.includes('No bearer token') ||
message.includes('Invalid or expired token')
) {
set.status = 401
return {
success: false,
error: message,
code: 'UNAUTHORIZED',
} satisfies ErrorResponse
}
if (message.includes('Forbidden') || message.includes('Admin access required')) {
set.status = 403
return {
success: false,
error: message,
code: 'FORBIDDEN',
} satisfies ErrorResponse
}
if (message.includes('already exists')) {
set.status = 409
return {
success: false,
error: message,
code: 'CONFLICT',
} satisfies ErrorResponse
}
if (message.includes('not found')) {
set.status = 404
return {
success: false,
error: message,
code: 'NOT_FOUND',
} satisfies ErrorResponse
}
set.status = 500
return {
success: false,
error: message,
code: 'ERROR',
} satisfies ErrorResponse
}
set.status = 500
return {
success: false,
error: 'An unexpected error occurred',
code: 'UNKNOWN_ERROR',
} satisfies ErrorResponse
}
})
+112
View File
@@ -0,0 +1,112 @@
import { Elysia, sse } from 'elysia'
import z from 'zod'
import { createAgent } from '../agent'
import { ClientType } from '../types'
import { ModelMessage } from 'ai'
const ChatBody = z.object({
apiKey: z.string().min(1, 'API key is required'),
baseUrl: z.string().min(1, 'Base URL is required'),
model: z.string().min(1, 'Model is required'),
clientType: z.enum([
'openai',
'anthropic',
'google',
]),
locale: z.string().optional(),
language: z.string().optional(),
maxSteps: z.number().optional(),
maxContextLoadTime: z.number().min(1, 'Max context load time is required'),
platforms: z.array(z.string()).optional(),
currentPlatform: z.string().optional(),
messages: z.array(z.object()),
query: z.string().min(1, 'Query is required'),
})
const ScheduleBody = z.object({
schedule: z.object({
id: z.string().min(1, 'Schedule ID is required'),
name: z.string().min(1, 'Schedule name is required'),
description: z.string().min(1, 'Schedule description is required'),
pattern: z.string().min(1, 'Schedule pattern is required'),
maxCalls: z.number().optional(),
command: z.string().min(1, 'Schedule command is required'),
}),
}).and(ChatBody)
export const chatModule = new Elysia({ prefix: '/chat' })
.post('/', async ({ body }) => {
const { ask } = createAgent({
apiKey: body.apiKey,
baseUrl: body.baseUrl,
model: body.model,
clientType: body.clientType as ClientType,
locale: body.locale,
language: body.language,
maxSteps: body.maxSteps,
maxContextLoadTime: body.maxContextLoadTime,
platforms: body.platforms,
currentPlatform: body.currentPlatform,
})
return await ask({
messages: body.messages as unknown as ModelMessage[],
query: body.query,
})
}, {
body: ChatBody,
})
.post('/stream', async function* ({ body }) {
const { stream } = createAgent({
apiKey: body.apiKey,
baseUrl: body.baseUrl,
model: body.model,
clientType: body.clientType as ClientType,
locale: body.locale,
language: body.language,
maxSteps: body.maxSteps,
maxContextLoadTime: body.maxContextLoadTime,
platforms: body.platforms,
currentPlatform: body.currentPlatform,
})
const streanGenerator = stream({
messages: body.messages as unknown as ModelMessage[],
query: body.query,
})
while (true) {
const chunk = await streanGenerator.next()
if (chunk.done) {
yield sse({
type: 'done',
data: chunk.value,
})
break
}
yield sse({
type: 'delta',
data: chunk.value
})
}
}, {
body: ChatBody,
})
.post('/schedule', async ({ body }) => {
const { triggerSchedule } = createAgent({
apiKey: body.apiKey,
baseUrl: body.baseUrl,
model: body.model,
clientType: body.clientType as ClientType,
locale: body.locale,
language: body.language,
maxSteps: body.maxSteps,
maxContextLoadTime: body.maxContextLoadTime,
platforms: body.platforms,
currentPlatform: body.currentPlatform,
})
return await triggerSchedule({
messages: body.messages as unknown as ModelMessage[],
query: body.query,
}, body.schedule)
}, {
body: ScheduleBody,
})
@@ -1,4 +1,4 @@
import { Schedule } from '@memoh/shared'
import { Schedule } from '../types'
import { time } from './shared'
export interface ScheduleParams {
@@ -1,24 +1,23 @@
import { Platform } from '@memoh/shared'
import { time } from './shared'
import { quote } from './utils'
export interface SystemParams {
date: Date
locale?: Intl.LocalesArgument
language: string
language?: string
maxContextLoadTime: number
platforms: Platform[]
currentPlatform: string
platforms: string[]
currentPlatform?: string
}
export const system = ({ date, locale, language, maxContextLoadTime, platforms, currentPlatform }: SystemParams) => {
return `
---
${time({ date, locale })}
language: ${language}
language: ${language ?? 'Same as user input'}
available-platforms:
${platforms.map(platform => ` - ${platform.name}`).join('\n')}
current-platform: ${currentPlatform}
${platforms.map(platform => ` - ${platform}`).join('\n')}
current-platform: ${currentPlatform ?? 'Unknown Platform'}
---
You are a personal housekeeper assistant, which able to manage the master's daily affairs.
+14
View File
@@ -0,0 +1,14 @@
export enum ClientType {
OPENAI = 'openai',
ANTHROPIC = 'anthropic',
GOOGLE = 'google',
}
export interface Schedule {
id: string
name: string
description: string
pattern: string
maxCalls?: number
command: string
}
+103
View File
@@ -0,0 +1,103 @@
{
"compilerOptions": {
/* Visit https://aka.ms/tsconfig to read more about this file */
/* Projects */
// "incremental": true, /* Save .tsbuildinfo files to allow for incremental compilation of projects. */
// "composite": true, /* Enable constraints that allow a TypeScript project to be used with project references. */
// "tsBuildInfoFile": "./.tsbuildinfo", /* Specify the path to .tsbuildinfo incremental compilation file. */
// "disableSourceOfProjectReferenceRedirect": true, /* Disable preferring source files instead of declaration files when referencing composite projects. */
// "disableSolutionSearching": true, /* Opt a project out of multi-project reference checking when editing. */
// "disableReferencedProjectLoad": true, /* Reduce the number of projects loaded automatically by TypeScript. */
/* Language and Environment */
"target": "ES2021", /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */
// "lib": [], /* Specify a set of bundled library declaration files that describe the target runtime environment. */
// "jsx": "preserve", /* Specify what JSX code is generated. */
// "experimentalDecorators": true, /* Enable experimental support for TC39 stage 2 draft decorators. */
// "emitDecoratorMetadata": true, /* Emit design-type metadata for decorated declarations in source files. */
// "jsxFactory": "", /* Specify the JSX factory function used when targeting React JSX emit, e.g. 'React.createElement' or 'h'. */
// "jsxFragmentFactory": "", /* Specify the JSX Fragment reference used for fragments when targeting React JSX emit e.g. 'React.Fragment' or 'Fragment'. */
// "jsxImportSource": "", /* Specify module specifier used to import the JSX factory functions when using 'jsx: react-jsx*'. */
// "reactNamespace": "", /* Specify the object invoked for 'createElement'. This only applies when targeting 'react' JSX emit. */
// "noLib": true, /* Disable including any library files, including the default lib.d.ts. */
// "useDefineForClassFields": true, /* Emit ECMAScript-standard-compliant class fields. */
// "moduleDetection": "auto", /* Control what method is used to detect module-format JS files. */
/* Modules */
"module": "ES2022", /* Specify what module code is generated. */
// "rootDir": "./", /* Specify the root folder within your source files. */
"moduleResolution": "node", /* Specify how TypeScript looks up a file from a given module specifier. */
// "baseUrl": "./", /* Specify the base directory to resolve non-relative module names. */
// "paths": {}, /* Specify a set of entries that re-map imports to additional lookup locations. */
// "rootDirs": [], /* Allow multiple folders to be treated as one when resolving modules. */
// "typeRoots": [], /* Specify multiple folders that act like './node_modules/@types'. */
"types": ["bun-types"], /* Specify type package names to be included without being referenced in a source file. */
// "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */
// "moduleSuffixes": [], /* List of file name suffixes to search when resolving a module. */
// "resolveJsonModule": true, /* Enable importing .json files. */
// "noResolve": true, /* Disallow 'import's, 'require's or '<reference>'s from expanding the number of files TypeScript should add to a project. */
/* JavaScript Support */
// "allowJs": true, /* Allow JavaScript files to be a part of your program. Use the 'checkJS' option to get errors from these files. */
// "checkJs": true, /* Enable error reporting in type-checked JavaScript files. */
// "maxNodeModuleJsDepth": 1, /* Specify the maximum folder depth used for checking JavaScript files from 'node_modules'. Only applicable with 'allowJs'. */
/* Emit */
// "declaration": true, /* Generate .d.ts files from TypeScript and JavaScript files in your project. */
// "declarationMap": true, /* Create sourcemaps for d.ts files. */
// "emitDeclarationOnly": true, /* Only output d.ts files and not JavaScript files. */
// "sourceMap": true, /* Create source map files for emitted JavaScript files. */
// "outFile": "./", /* Specify a file that bundles all outputs into one JavaScript file. If 'declaration' is true, also designates a file that bundles all .d.ts output. */
// "outDir": "./", /* Specify an output folder for all emitted files. */
// "removeComments": true, /* Disable emitting comments. */
// "noEmit": true, /* Disable emitting files from a compilation. */
// "importHelpers": true, /* Allow importing helper functions from tslib once per project, instead of including them per-file. */
// "importsNotUsedAsValues": "remove", /* Specify emit/checking behavior for imports that are only used for types. */
// "downlevelIteration": true, /* Emit more compliant, but verbose and less performant JavaScript for iteration. */
// "sourceRoot": "", /* Specify the root path for debuggers to find the reference source code. */
// "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */
// "inlineSourceMap": true, /* Include sourcemap files inside the emitted JavaScript. */
// "inlineSources": true, /* Include source code in the sourcemaps inside the emitted JavaScript. */
// "emitBOM": true, /* Emit a UTF-8 Byte Order Mark (BOM) in the beginning of output files. */
// "newLine": "crlf", /* Set the newline character for emitting files. */
// "stripInternal": true, /* Disable emitting declarations that have '@internal' in their JSDoc comments. */
// "noEmitHelpers": true, /* Disable generating custom helper functions like '__extends' in compiled output. */
// "noEmitOnError": true, /* Disable emitting files if any type checking errors are reported. */
// "preserveConstEnums": true, /* Disable erasing 'const enum' declarations in generated code. */
// "declarationDir": "./", /* Specify the output directory for generated declaration files. */
// "preserveValueImports": true, /* Preserve unused imported values in the JavaScript output that would otherwise be removed. */
/* Interop Constraints */
// "isolatedModules": true, /* Ensure that each file can be safely transpiled without relying on other imports. */
// "allowSyntheticDefaultImports": true, /* Allow 'import x from y' when a module doesn't have a default export. */
"esModuleInterop": true, /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */
// "preserveSymlinks": true, /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */
"forceConsistentCasingInFileNames": true, /* Ensure that casing is correct in imports. */
/* Type Checking */
"strict": true, /* Enable all strict type-checking options. */
// "noImplicitAny": true, /* Enable error reporting for expressions and declarations with an implied 'any' type. */
// "strictNullChecks": true, /* When type checking, take into account 'null' and 'undefined'. */
// "strictFunctionTypes": true, /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */
// "strictBindCallApply": true, /* Check that the arguments for 'bind', 'call', and 'apply' methods match the original function. */
// "strictPropertyInitialization": true, /* Check for class properties that are declared but not set in the constructor. */
// "noImplicitThis": true, /* Enable error reporting when 'this' is given the type 'any'. */
// "useUnknownInCatchVariables": true, /* Default catch clause variables as 'unknown' instead of 'any'. */
// "alwaysStrict": true, /* Ensure 'use strict' is always emitted. */
// "noUnusedLocals": true, /* Enable error reporting when local variables aren't read. */
// "noUnusedParameters": true, /* Raise an error when a function parameter isn't read. */
// "exactOptionalPropertyTypes": true, /* Interpret optional property types as written, rather than adding 'undefined'. */
// "noImplicitReturns": true, /* Enable error reporting for codepaths that do not explicitly return in a function. */
// "noFallthroughCasesInSwitch": true, /* Enable error reporting for fallthrough cases in switch statements. */
// "noUncheckedIndexedAccess": true, /* Add 'undefined' to a type when accessed using an index. */
// "noImplicitOverride": true, /* Ensure overriding members in derived classes are marked with an override modifier. */
// "noPropertyAccessFromIndexSignature": true, /* Enforces using indexed accessors for keys declared using an indexed type. */
// "allowUnusedLabels": true, /* Disable error reporting for unused labels. */
// "allowUnreachableCode": true, /* Disable error reporting for unreachable code. */
/* Completeness */
// "skipDefaultLibCheck": true, /* Skip type checking .d.ts files that are included with TypeScript. */
"skipLibCheck": true /* Skip type checking all .d.ts files. */
}
}
+2 -2
View File
@@ -8,7 +8,7 @@ export default [
...vue.configs['flat/recommended'],
{ ignores: ['**/node_modules/**', '**/dist/**'] },
{
files: ['packages/**/*.{js,jsx,ts,tsx}'],
files: ['packages/**/*.{js,jsx,ts,tsx}', 'agent/**/*.{js,jsx,ts,tsx}'],
languageOptions: {
parserOptions: {
ecmaVersion: 2022,
@@ -22,7 +22,7 @@ export default [
},
},
{
files: ['packages/**/*.vue'],
files: ['packages/**/*.vue', 'agent/**/*.vue'],
languageOptions: {
parser: vueParser,
parserOptions: {
+3 -11
View File
@@ -3,23 +3,15 @@
"private": true,
"version": "1.0.0",
"scripts": {
"dev": "pnpm --parallel --filter @memoh/* dev",
"build": "pnpm --parallel --filter @memoh/* build",
"start": "pnpm --parallel --filter @memoh/* start",
"api:dev": "pnpm --filter @memoh/api dev",
"api:build": "pnpm --filter @memoh/api build",
"api:start": "pnpm --filter @memoh/api start",
"web:dev": "pnpm --filter @memoh/web dev",
"web:build": "pnpm --filter @memoh/web build",
"web:start": "pnpm --filter @memoh/web start",
"db:push": "pnpm --filter @memoh/db push",
"db:migrate": "pnpm --filter @memoh/db migrate",
"db:generate": "pnpm --filter @memoh/db generate",
"db:studio": "pnpm --filter @memoh/db studio",
"cli": "pnpm --filter @memoh/client start",
"docs:dev": "pnpm --filter @memoh/docs dev",
"docs:build": "pnpm --filter @memoh/docs build",
"docs:preview": "pnpm --filter @memoh/docs preview",
"agent:dev": "pnpm --filter @memoh/agent-gateway dev",
"agent:build": "pnpm --filter @memoh/agent-gateway build",
"agent:start": "pnpm --filter @memoh/agent-gateway start",
"lint": "eslint .",
"lint:fix": "eslint . --fix",
"test": "vitest"
+79 -45
View File
@@ -37,6 +37,40 @@ importers:
specifier: ^10.2.0
version: 10.2.0(eslint@9.39.2(jiti@2.6.1))
agent:
dependencies:
'@ai-sdk/anthropic':
specifier: ^3.0.9
version: 3.0.9(zod@4.3.5)
'@ai-sdk/google':
specifier: ^3.0.6
version: 3.0.6(zod@4.3.5)
'@ai-sdk/mcp':
specifier: ^1.0.6
version: 1.0.6(zod@4.3.5)
'@ai-sdk/openai':
specifier: ^3.0.7
version: 3.0.7(zod@4.3.5)
'@elysiajs/cors':
specifier: ^1.4.1
version: 1.4.1(elysia@1.4.22(@sinclair/typebox@0.34.47)(@types/bun@1.3.7)(exact-mirror@0.2.6(@sinclair/typebox@0.34.47))(file-type@21.3.0)(openapi-types@12.1.3)(typescript@5.9.3))
'@modelcontextprotocol/sdk':
specifier: ^1.25.2
version: 1.25.2(@cfworker/json-schema@4.1.1)(hono@4.11.4)(zod@4.3.5)
ai:
specifier: ^6.0.25
version: 6.0.25(zod@4.3.5)
elysia:
specifier: latest
version: 1.4.22(@sinclair/typebox@0.34.47)(@types/bun@1.3.7)(exact-mirror@0.2.6(@sinclair/typebox@0.34.47))(file-type@21.3.0)(openapi-types@12.1.3)(typescript@5.9.3)
zod:
specifier: ^4.3.5
version: 4.3.5
devDependencies:
bun-types:
specifier: latest
version: 1.3.7
docs:
devDependencies:
vitepress:
@@ -110,22 +144,22 @@ importers:
dependencies:
'@elysiajs/bearer':
specifier: ^1.1.4
version: 1.4.2(elysia@1.4.22(@sinclair/typebox@0.34.47)(@types/bun@1.3.6)(exact-mirror@0.2.6(@sinclair/typebox@0.34.47))(file-type@21.3.0)(openapi-types@12.1.3)(typescript@5.9.3))
version: 1.4.2(elysia@1.4.22(@sinclair/typebox@0.34.47)(@types/bun@1.3.7)(exact-mirror@0.2.6(@sinclair/typebox@0.34.47))(file-type@21.3.0)(openapi-types@12.1.3)(typescript@5.9.3))
'@elysiajs/cors':
specifier: ^1.4.1
version: 1.4.1(elysia@1.4.22(@sinclair/typebox@0.34.47)(@types/bun@1.3.6)(exact-mirror@0.2.6(@sinclair/typebox@0.34.47))(file-type@21.3.0)(openapi-types@12.1.3)(typescript@5.9.3))
version: 1.4.1(elysia@1.4.22(@sinclair/typebox@0.34.47)(@types/bun@1.3.7)(exact-mirror@0.2.6(@sinclair/typebox@0.34.47))(file-type@21.3.0)(openapi-types@12.1.3)(typescript@5.9.3))
'@elysiajs/cron':
specifier: ^1.4.1
version: 1.4.1(elysia@1.4.22(@sinclair/typebox@0.34.47)(@types/bun@1.3.6)(exact-mirror@0.2.6(@sinclair/typebox@0.34.47))(file-type@21.3.0)(openapi-types@12.1.3)(typescript@5.9.3))
version: 1.4.1(elysia@1.4.22(@sinclair/typebox@0.34.47)(@types/bun@1.3.7)(exact-mirror@0.2.6(@sinclair/typebox@0.34.47))(file-type@21.3.0)(openapi-types@12.1.3)(typescript@5.9.3))
'@elysiajs/eden':
specifier: ^1.4.6
version: 1.4.6(elysia@1.4.22(@sinclair/typebox@0.34.47)(@types/bun@1.3.6)(exact-mirror@0.2.6(@sinclair/typebox@0.34.47))(file-type@21.3.0)(openapi-types@12.1.3)(typescript@5.9.3))
version: 1.4.6(elysia@1.4.22(@sinclair/typebox@0.34.47)(@types/bun@1.3.7)(exact-mirror@0.2.6(@sinclair/typebox@0.34.47))(file-type@21.3.0)(openapi-types@12.1.3)(typescript@5.9.3))
'@elysiajs/jwt':
specifier: ^1.2.0
version: 1.4.0(elysia@1.4.22(@sinclair/typebox@0.34.47)(@types/bun@1.3.6)(exact-mirror@0.2.6(@sinclair/typebox@0.34.47))(file-type@21.3.0)(openapi-types@12.1.3)(typescript@5.9.3))
version: 1.4.0(elysia@1.4.22(@sinclair/typebox@0.34.47)(@types/bun@1.3.7)(exact-mirror@0.2.6(@sinclair/typebox@0.34.47))(file-type@21.3.0)(openapi-types@12.1.3)(typescript@5.9.3))
'@elysiajs/openapi':
specifier: ^1.4.13
version: 1.4.13(elysia@1.4.22(@sinclair/typebox@0.34.47)(@types/bun@1.3.6)(exact-mirror@0.2.6(@sinclair/typebox@0.34.47))(file-type@21.3.0)(openapi-types@12.1.3)(typescript@5.9.3))
version: 1.4.13(elysia@1.4.22(@sinclair/typebox@0.34.47)(@types/bun@1.3.7)(exact-mirror@0.2.6(@sinclair/typebox@0.34.47))(file-type@21.3.0)(openapi-types@12.1.3)(typescript@5.9.3))
'@memoh/agent':
specifier: workspace:*
version: link:../agent
@@ -149,10 +183,10 @@ importers:
version: link:../shared
drizzle-orm:
specifier: ^0.45.1
version: 0.45.1(@cloudflare/workers-types@4.20260109.0)(@opentelemetry/api@1.9.0)(@types/pg@8.16.0)(bun-types@1.3.6)(pg@8.16.3)(sqlite3@5.1.7)
version: 0.45.1(@cloudflare/workers-types@4.20260109.0)(@opentelemetry/api@1.9.0)(@types/pg@8.16.0)(bun-types@1.3.7)(pg@8.16.3)(sqlite3@5.1.7)
elysia:
specifier: latest
version: 1.4.22(@sinclair/typebox@0.34.47)(@types/bun@1.3.6)(exact-mirror@0.2.6(@sinclair/typebox@0.34.47))(file-type@21.3.0)(openapi-types@12.1.3)(typescript@5.9.3)
version: 1.4.22(@sinclair/typebox@0.34.47)(@types/bun@1.3.7)(exact-mirror@0.2.6(@sinclair/typebox@0.34.47))(file-type@21.3.0)(openapi-types@12.1.3)(typescript@5.9.3)
node-cron:
specifier: ^4.2.1
version: 4.2.1
@@ -162,13 +196,13 @@ importers:
devDependencies:
bun-types:
specifier: latest
version: 1.3.6
version: 1.3.7
packages/cli:
dependencies:
'@elysiajs/eden':
specifier: ^1.4.6
version: 1.4.6(elysia@1.4.22(@sinclair/typebox@0.34.47)(@types/bun@1.3.6)(exact-mirror@0.2.6(@sinclair/typebox@0.34.47))(file-type@21.3.0)(openapi-types@12.1.3)(typescript@5.9.3))
version: 1.4.6(elysia@1.4.22(@sinclair/typebox@0.34.47)(@types/bun@1.3.7)(exact-mirror@0.2.6(@sinclair/typebox@0.34.47))(file-type@21.3.0)(openapi-types@12.1.3)(typescript@5.9.3))
'@memoh/api':
specifier: workspace:*
version: link:../api
@@ -183,7 +217,7 @@ importers:
version: 12.1.0
elysia:
specifier: latest
version: 1.4.22(@sinclair/typebox@0.34.47)(@types/bun@1.3.6)(exact-mirror@0.2.6(@sinclair/typebox@0.34.47))(file-type@21.3.0)(openapi-types@12.1.3)(typescript@5.9.3)
version: 1.4.22(@sinclair/typebox@0.34.47)(@types/bun@1.3.7)(exact-mirror@0.2.6(@sinclair/typebox@0.34.47))(file-type@21.3.0)(openapi-types@12.1.3)(typescript@5.9.3)
inquirer:
specifier: ^12.3.0
version: 12.11.1(@types/node@22.19.5)
@@ -202,13 +236,13 @@ importers:
devDependencies:
'@types/bun':
specifier: latest
version: 1.3.6
version: 1.3.7
'@types/node':
specifier: ^22.10.5
version: 22.19.5
bun-types:
specifier: latest
version: 1.3.6
version: 1.3.7
packages/container:
dependencies:
@@ -233,7 +267,7 @@ importers:
version: 17.2.3
drizzle-orm:
specifier: ^0.45.1
version: 0.45.1(@cloudflare/workers-types@4.20260109.0)(@opentelemetry/api@1.9.0)(@types/pg@8.16.0)(bun-types@1.3.6)(pg@8.16.3)(sqlite3@5.1.7)
version: 0.45.1(@cloudflare/workers-types@4.20260109.0)(@opentelemetry/api@1.9.0)(@types/pg@8.16.0)(bun-types@1.3.7)(pg@8.16.3)(sqlite3@5.1.7)
pg:
specifier: ^8.16.3
version: 8.16.3
@@ -267,7 +301,7 @@ importers:
version: 6.0.25(zod@4.3.5)
drizzle-orm:
specifier: ^0.45.1
version: 0.45.1(@cloudflare/workers-types@4.20260109.0)(@opentelemetry/api@1.9.0)(@types/pg@8.16.0)(bun-types@1.3.6)(pg@8.16.3)(sqlite3@5.1.7)
version: 0.45.1(@cloudflare/workers-types@4.20260109.0)(@opentelemetry/api@1.9.0)(@types/pg@8.16.0)(bun-types@1.3.7)(pg@8.16.3)(sqlite3@5.1.7)
mem0ai:
specifier: ^2.2.0
version: 2.2.0(@anthropic-ai/sdk@0.40.1(encoding@0.1.13))(@azure/identity@4.13.0)(@azure/search-documents@12.2.0)(@cloudflare/workers-types@4.20260109.0)(@google/genai@1.35.0(@modelcontextprotocol/sdk@1.25.2(@cfworker/json-schema@4.1.1)(hono@4.11.4)(zod@4.3.5)))(@langchain/core@0.3.80(@opentelemetry/api@1.9.0)(openai@4.104.0(encoding@0.1.13)(ws@8.19.0)(zod@4.3.5)))(@mistralai/mistralai@1.11.0)(@qdrant/js-client-rest@1.13.0(typescript@5.9.3))(@supabase/supabase-js@2.90.1)(@types/jest@29.5.14)(@types/pg@8.16.0)(@types/sqlite3@3.1.11)(cloudflare@4.5.0(encoding@0.1.13))(encoding@0.1.13)(groq-sdk@0.3.0(encoding@0.1.13))(neo4j-driver@5.28.2)(ollama@0.5.18)(pg@8.16.3)(redis@4.7.1)(sqlite3@5.1.7)(ws@8.19.0)
@@ -279,10 +313,10 @@ importers:
dependencies:
'@elysiajs/cors':
specifier: ^1.4.1
version: 1.4.1(elysia@1.4.21(@sinclair/typebox@0.34.47)(@types/bun@1.3.6)(exact-mirror@0.2.6(@sinclair/typebox@0.34.47))(file-type@21.3.0)(openapi-types@12.1.3)(typescript@5.9.3))
version: 1.4.1(elysia@1.4.21(@sinclair/typebox@0.34.47)(@types/bun@1.3.7)(exact-mirror@0.2.6(@sinclair/typebox@0.34.47))(file-type@21.3.0)(openapi-types@12.1.3)(typescript@5.9.3))
elysia:
specifier: ^1.4.21
version: 1.4.21(@sinclair/typebox@0.34.47)(@types/bun@1.3.6)(exact-mirror@0.2.6(@sinclair/typebox@0.34.47))(file-type@21.3.0)(openapi-types@12.1.3)(typescript@5.9.3)
version: 1.4.21(@sinclair/typebox@0.34.47)(@types/bun@1.3.7)(exact-mirror@0.2.6(@sinclair/typebox@0.34.47))(file-type@21.3.0)(openapi-types@12.1.3)(typescript@5.9.3)
zod:
specifier: ^4.3.5
version: 4.3.5
@@ -2155,8 +2189,8 @@ packages:
'@types/argparse@1.0.38':
resolution: {integrity: sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==}
'@types/bun@1.3.6':
resolution: {integrity: sha512-uWCv6FO/8LcpREhenN1d1b6fcspAB+cefwD7uti8C8VffIv0Um08TKMn98FynpTiU38+y2dUO55T11NgDt8VAA==}
'@types/bun@1.3.7':
resolution: {integrity: sha512-lmNuMda+Z9b7tmhA0tohwy8ZWFSnmQm1UDWXtH5r9F7wZCfkeO3Jx7wKQ1EOiKq43yHts7ky6r8SDJQWRNupkA==}
'@types/chai@5.2.3':
resolution: {integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==}
@@ -2762,8 +2796,8 @@ packages:
buffer@6.0.3:
resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==}
bun-types@1.3.6:
resolution: {integrity: sha512-OlFwHcnNV99r//9v5IIOgQ9Uk37gZqrNMCcqEaExdkVq3Avwqok1bJFmvGMCkCE0FqzdY8VMOZpfpR3lwI+CsQ==}
bun-types@1.3.7:
resolution: {integrity: sha512-qyschsA03Qz+gou+apt6HNl6HnI+sJJLL4wLDke4iugsE6584CMupOtTY1n+2YC9nGVrEKUlTs99jjRLKgWnjQ==}
bundle-name@4.1.0:
resolution: {integrity: sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==}
@@ -6094,35 +6128,35 @@ snapshots:
'@drizzle-team/brocli@0.10.2': {}
'@elysiajs/bearer@1.4.2(elysia@1.4.22(@sinclair/typebox@0.34.47)(@types/bun@1.3.6)(exact-mirror@0.2.6(@sinclair/typebox@0.34.47))(file-type@21.3.0)(openapi-types@12.1.3)(typescript@5.9.3))':
'@elysiajs/bearer@1.4.2(elysia@1.4.22(@sinclair/typebox@0.34.47)(@types/bun@1.3.7)(exact-mirror@0.2.6(@sinclair/typebox@0.34.47))(file-type@21.3.0)(openapi-types@12.1.3)(typescript@5.9.3))':
dependencies:
elysia: 1.4.22(@sinclair/typebox@0.34.47)(@types/bun@1.3.6)(exact-mirror@0.2.6(@sinclair/typebox@0.34.47))(file-type@21.3.0)(openapi-types@12.1.3)(typescript@5.9.3)
elysia: 1.4.22(@sinclair/typebox@0.34.47)(@types/bun@1.3.7)(exact-mirror@0.2.6(@sinclair/typebox@0.34.47))(file-type@21.3.0)(openapi-types@12.1.3)(typescript@5.9.3)
'@elysiajs/cors@1.4.1(elysia@1.4.21(@sinclair/typebox@0.34.47)(@types/bun@1.3.6)(exact-mirror@0.2.6(@sinclair/typebox@0.34.47))(file-type@21.3.0)(openapi-types@12.1.3)(typescript@5.9.3))':
'@elysiajs/cors@1.4.1(elysia@1.4.21(@sinclair/typebox@0.34.47)(@types/bun@1.3.7)(exact-mirror@0.2.6(@sinclair/typebox@0.34.47))(file-type@21.3.0)(openapi-types@12.1.3)(typescript@5.9.3))':
dependencies:
elysia: 1.4.21(@sinclair/typebox@0.34.47)(@types/bun@1.3.6)(exact-mirror@0.2.6(@sinclair/typebox@0.34.47))(file-type@21.3.0)(openapi-types@12.1.3)(typescript@5.9.3)
elysia: 1.4.21(@sinclair/typebox@0.34.47)(@types/bun@1.3.7)(exact-mirror@0.2.6(@sinclair/typebox@0.34.47))(file-type@21.3.0)(openapi-types@12.1.3)(typescript@5.9.3)
'@elysiajs/cors@1.4.1(elysia@1.4.22(@sinclair/typebox@0.34.47)(@types/bun@1.3.6)(exact-mirror@0.2.6(@sinclair/typebox@0.34.47))(file-type@21.3.0)(openapi-types@12.1.3)(typescript@5.9.3))':
'@elysiajs/cors@1.4.1(elysia@1.4.22(@sinclair/typebox@0.34.47)(@types/bun@1.3.7)(exact-mirror@0.2.6(@sinclair/typebox@0.34.47))(file-type@21.3.0)(openapi-types@12.1.3)(typescript@5.9.3))':
dependencies:
elysia: 1.4.22(@sinclair/typebox@0.34.47)(@types/bun@1.3.6)(exact-mirror@0.2.6(@sinclair/typebox@0.34.47))(file-type@21.3.0)(openapi-types@12.1.3)(typescript@5.9.3)
elysia: 1.4.22(@sinclair/typebox@0.34.47)(@types/bun@1.3.7)(exact-mirror@0.2.6(@sinclair/typebox@0.34.47))(file-type@21.3.0)(openapi-types@12.1.3)(typescript@5.9.3)
'@elysiajs/cron@1.4.1(elysia@1.4.22(@sinclair/typebox@0.34.47)(@types/bun@1.3.6)(exact-mirror@0.2.6(@sinclair/typebox@0.34.47))(file-type@21.3.0)(openapi-types@12.1.3)(typescript@5.9.3))':
'@elysiajs/cron@1.4.1(elysia@1.4.22(@sinclair/typebox@0.34.47)(@types/bun@1.3.7)(exact-mirror@0.2.6(@sinclair/typebox@0.34.47))(file-type@21.3.0)(openapi-types@12.1.3)(typescript@5.9.3))':
dependencies:
croner: 6.0.7
elysia: 1.4.22(@sinclair/typebox@0.34.47)(@types/bun@1.3.6)(exact-mirror@0.2.6(@sinclair/typebox@0.34.47))(file-type@21.3.0)(openapi-types@12.1.3)(typescript@5.9.3)
elysia: 1.4.22(@sinclair/typebox@0.34.47)(@types/bun@1.3.7)(exact-mirror@0.2.6(@sinclair/typebox@0.34.47))(file-type@21.3.0)(openapi-types@12.1.3)(typescript@5.9.3)
'@elysiajs/eden@1.4.6(elysia@1.4.22(@sinclair/typebox@0.34.47)(@types/bun@1.3.6)(exact-mirror@0.2.6(@sinclair/typebox@0.34.47))(file-type@21.3.0)(openapi-types@12.1.3)(typescript@5.9.3))':
'@elysiajs/eden@1.4.6(elysia@1.4.22(@sinclair/typebox@0.34.47)(@types/bun@1.3.7)(exact-mirror@0.2.6(@sinclair/typebox@0.34.47))(file-type@21.3.0)(openapi-types@12.1.3)(typescript@5.9.3))':
dependencies:
elysia: 1.4.22(@sinclair/typebox@0.34.47)(@types/bun@1.3.6)(exact-mirror@0.2.6(@sinclair/typebox@0.34.47))(file-type@21.3.0)(openapi-types@12.1.3)(typescript@5.9.3)
elysia: 1.4.22(@sinclair/typebox@0.34.47)(@types/bun@1.3.7)(exact-mirror@0.2.6(@sinclair/typebox@0.34.47))(file-type@21.3.0)(openapi-types@12.1.3)(typescript@5.9.3)
'@elysiajs/jwt@1.4.0(elysia@1.4.22(@sinclair/typebox@0.34.47)(@types/bun@1.3.6)(exact-mirror@0.2.6(@sinclair/typebox@0.34.47))(file-type@21.3.0)(openapi-types@12.1.3)(typescript@5.9.3))':
'@elysiajs/jwt@1.4.0(elysia@1.4.22(@sinclair/typebox@0.34.47)(@types/bun@1.3.7)(exact-mirror@0.2.6(@sinclair/typebox@0.34.47))(file-type@21.3.0)(openapi-types@12.1.3)(typescript@5.9.3))':
dependencies:
elysia: 1.4.22(@sinclair/typebox@0.34.47)(@types/bun@1.3.6)(exact-mirror@0.2.6(@sinclair/typebox@0.34.47))(file-type@21.3.0)(openapi-types@12.1.3)(typescript@5.9.3)
elysia: 1.4.22(@sinclair/typebox@0.34.47)(@types/bun@1.3.7)(exact-mirror@0.2.6(@sinclair/typebox@0.34.47))(file-type@21.3.0)(openapi-types@12.1.3)(typescript@5.9.3)
jose: 6.1.3
'@elysiajs/openapi@1.4.13(elysia@1.4.22(@sinclair/typebox@0.34.47)(@types/bun@1.3.6)(exact-mirror@0.2.6(@sinclair/typebox@0.34.47))(file-type@21.3.0)(openapi-types@12.1.3)(typescript@5.9.3))':
'@elysiajs/openapi@1.4.13(elysia@1.4.22(@sinclair/typebox@0.34.47)(@types/bun@1.3.7)(exact-mirror@0.2.6(@sinclair/typebox@0.34.47))(file-type@21.3.0)(openapi-types@12.1.3)(typescript@5.9.3))':
dependencies:
elysia: 1.4.22(@sinclair/typebox@0.34.47)(@types/bun@1.3.6)(exact-mirror@0.2.6(@sinclair/typebox@0.34.47))(file-type@21.3.0)(openapi-types@12.1.3)(typescript@5.9.3)
elysia: 1.4.22(@sinclair/typebox@0.34.47)(@types/bun@1.3.7)(exact-mirror@0.2.6(@sinclair/typebox@0.34.47))(file-type@21.3.0)(openapi-types@12.1.3)(typescript@5.9.3)
'@esbuild-kit/core-utils@3.3.2':
dependencies:
@@ -7167,9 +7201,9 @@ snapshots:
'@types/argparse@1.0.38': {}
'@types/bun@1.3.6':
'@types/bun@1.3.7':
dependencies:
bun-types: 1.3.6
bun-types: 1.3.7
'@types/chai@5.2.3':
dependencies:
@@ -7935,9 +7969,9 @@ snapshots:
base64-js: 1.5.1
ieee754: 1.2.1
bun-types@1.3.6:
bun-types@1.3.7:
dependencies:
'@types/node': 25.0.3
'@types/node': 24.10.4
bundle-name@4.1.0:
dependencies:
@@ -8174,12 +8208,12 @@ snapshots:
transitivePeerDependencies:
- supports-color
drizzle-orm@0.45.1(@cloudflare/workers-types@4.20260109.0)(@opentelemetry/api@1.9.0)(@types/pg@8.16.0)(bun-types@1.3.6)(pg@8.16.3)(sqlite3@5.1.7):
drizzle-orm@0.45.1(@cloudflare/workers-types@4.20260109.0)(@opentelemetry/api@1.9.0)(@types/pg@8.16.0)(bun-types@1.3.7)(pg@8.16.3)(sqlite3@5.1.7):
optionalDependencies:
'@cloudflare/workers-types': 4.20260109.0
'@opentelemetry/api': 1.9.0
'@types/pg': 8.16.0
bun-types: 1.3.6
bun-types: 1.3.7
pg: 8.16.3
sqlite3: 5.1.7
@@ -8199,7 +8233,7 @@ snapshots:
electron-to-chromium@1.5.267: {}
elysia@1.4.21(@sinclair/typebox@0.34.47)(@types/bun@1.3.6)(exact-mirror@0.2.6(@sinclair/typebox@0.34.47))(file-type@21.3.0)(openapi-types@12.1.3)(typescript@5.9.3):
elysia@1.4.21(@sinclair/typebox@0.34.47)(@types/bun@1.3.7)(exact-mirror@0.2.6(@sinclair/typebox@0.34.47))(file-type@21.3.0)(openapi-types@12.1.3)(typescript@5.9.3):
dependencies:
'@sinclair/typebox': 0.34.47
cookie: 1.1.1
@@ -8209,10 +8243,10 @@ snapshots:
memoirist: 0.4.0
openapi-types: 12.1.3
optionalDependencies:
'@types/bun': 1.3.6
'@types/bun': 1.3.7
typescript: 5.9.3
elysia@1.4.22(@sinclair/typebox@0.34.47)(@types/bun@1.3.6)(exact-mirror@0.2.6(@sinclair/typebox@0.34.47))(file-type@21.3.0)(openapi-types@12.1.3)(typescript@5.9.3):
elysia@1.4.22(@sinclair/typebox@0.34.47)(@types/bun@1.3.7)(exact-mirror@0.2.6(@sinclair/typebox@0.34.47))(file-type@21.3.0)(openapi-types@12.1.3)(typescript@5.9.3):
dependencies:
'@sinclair/typebox': 0.34.47
cookie: 1.1.1
@@ -8222,7 +8256,7 @@ snapshots:
memoirist: 0.4.0
openapi-types: 12.1.3
optionalDependencies:
'@types/bun': 1.3.6
'@types/bun': 1.3.7
typescript: 5.9.3
emoji-regex-xs@1.0.0: {}
+1
View File
@@ -1,6 +1,7 @@
packages:
- 'packages/*'
- 'docs'
- 'agent'
onlyBuiltDependencies:
- sqlite3