myaiforone 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +113 -0
- package/agents/_template/CLAUDE.md +18 -0
- package/agents/_template/agent.json +7 -0
- package/agents/platform/agentcreator/CLAUDE.md +300 -0
- package/agents/platform/appcreator/CLAUDE.md +158 -0
- package/agents/platform/gym/CLAUDE.md +486 -0
- package/agents/platform/gym/agent.json +40 -0
- package/agents/platform/gym/programs/agent-building/program.json +160 -0
- package/agents/platform/gym/programs/automations-mastery/program.json +129 -0
- package/agents/platform/gym/programs/getting-started/program.json +124 -0
- package/agents/platform/gym/programs/mcp-integrations/program.json +116 -0
- package/agents/platform/gym/programs/multi-model-strategy/program.json +115 -0
- package/agents/platform/gym/programs/prompt-engineering/program.json +136 -0
- package/agents/platform/gym/souls/alex.md +12 -0
- package/agents/platform/gym/souls/jordan.md +12 -0
- package/agents/platform/gym/souls/morgan.md +12 -0
- package/agents/platform/gym/souls/riley.md +12 -0
- package/agents/platform/gym/souls/sam.md +12 -0
- package/agents/platform/hub/CLAUDE.md +372 -0
- package/agents/platform/promptcreator/CLAUDE.md +130 -0
- package/agents/platform/skillcreator/CLAUDE.md +163 -0
- package/bin/cli.js +566 -0
- package/config.example.json +310 -0
- package/dist/agent-registry.d.ts +32 -0
- package/dist/agent-registry.d.ts.map +1 -0
- package/dist/agent-registry.js +144 -0
- package/dist/agent-registry.js.map +1 -0
- package/dist/channels/discord.d.ts +17 -0
- package/dist/channels/discord.d.ts.map +1 -0
- package/dist/channels/discord.js +114 -0
- package/dist/channels/discord.js.map +1 -0
- package/dist/channels/imessage.d.ts +23 -0
- package/dist/channels/imessage.d.ts.map +1 -0
- package/dist/channels/imessage.js +214 -0
- package/dist/channels/imessage.js.map +1 -0
- package/dist/channels/slack.d.ts +19 -0
- package/dist/channels/slack.d.ts.map +1 -0
- package/dist/channels/slack.js +167 -0
- package/dist/channels/slack.js.map +1 -0
- package/dist/channels/telegram.d.ts +19 -0
- package/dist/channels/telegram.d.ts.map +1 -0
- package/dist/channels/telegram.js +274 -0
- package/dist/channels/telegram.js.map +1 -0
- package/dist/channels/types.d.ts +44 -0
- package/dist/channels/types.d.ts.map +1 -0
- package/dist/channels/types.js +18 -0
- package/dist/channels/types.js.map +1 -0
- package/dist/channels/whatsapp.d.ts +23 -0
- package/dist/channels/whatsapp.d.ts.map +1 -0
- package/dist/channels/whatsapp.js +189 -0
- package/dist/channels/whatsapp.js.map +1 -0
- package/dist/config.d.ts +134 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +127 -0
- package/dist/config.js.map +1 -0
- package/dist/cron.d.ts +8 -0
- package/dist/cron.d.ts.map +1 -0
- package/dist/cron.js +35 -0
- package/dist/cron.js.map +1 -0
- package/dist/decrypt-keys.d.ts +7 -0
- package/dist/decrypt-keys.d.ts.map +1 -0
- package/dist/decrypt-keys.js +53 -0
- package/dist/decrypt-keys.js.map +1 -0
- package/dist/encrypt-keys.d.ts +8 -0
- package/dist/encrypt-keys.d.ts.map +1 -0
- package/dist/encrypt-keys.js +62 -0
- package/dist/encrypt-keys.js.map +1 -0
- package/dist/executor.d.ts +31 -0
- package/dist/executor.d.ts.map +1 -0
- package/dist/executor.js +2009 -0
- package/dist/executor.js.map +1 -0
- package/dist/gemini-executor.d.ts +27 -0
- package/dist/gemini-executor.d.ts.map +1 -0
- package/dist/gemini-executor.js +160 -0
- package/dist/gemini-executor.js.map +1 -0
- package/dist/goals.d.ts +24 -0
- package/dist/goals.d.ts.map +1 -0
- package/dist/goals.js +189 -0
- package/dist/goals.js.map +1 -0
- package/dist/gym/activity-digest.d.ts +30 -0
- package/dist/gym/activity-digest.d.ts.map +1 -0
- package/dist/gym/activity-digest.js +506 -0
- package/dist/gym/activity-digest.js.map +1 -0
- package/dist/gym/dimension-scorer.d.ts +76 -0
- package/dist/gym/dimension-scorer.d.ts.map +1 -0
- package/dist/gym/dimension-scorer.js +236 -0
- package/dist/gym/dimension-scorer.js.map +1 -0
- package/dist/gym/gym-router.d.ts +7 -0
- package/dist/gym/gym-router.d.ts.map +1 -0
- package/dist/gym/gym-router.js +718 -0
- package/dist/gym/gym-router.js.map +1 -0
- package/dist/gym/index.d.ts +11 -0
- package/dist/gym/index.d.ts.map +1 -0
- package/dist/gym/index.js +11 -0
- package/dist/gym/index.js.map +1 -0
- package/dist/heartbeat.d.ts +21 -0
- package/dist/heartbeat.d.ts.map +1 -0
- package/dist/heartbeat.js +163 -0
- package/dist/heartbeat.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +254 -0
- package/dist/index.js.map +1 -0
- package/dist/keystore.d.ts +22 -0
- package/dist/keystore.d.ts.map +1 -0
- package/dist/keystore.js +178 -0
- package/dist/keystore.js.map +1 -0
- package/dist/logger.d.ts +9 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +45 -0
- package/dist/logger.js.map +1 -0
- package/dist/memory/daily.d.ts +22 -0
- package/dist/memory/daily.d.ts.map +1 -0
- package/dist/memory/daily.js +82 -0
- package/dist/memory/daily.js.map +1 -0
- package/dist/memory/embeddings.d.ts +15 -0
- package/dist/memory/embeddings.d.ts.map +1 -0
- package/dist/memory/embeddings.js +154 -0
- package/dist/memory/embeddings.js.map +1 -0
- package/dist/memory/index.d.ts +32 -0
- package/dist/memory/index.d.ts.map +1 -0
- package/dist/memory/index.js +159 -0
- package/dist/memory/index.js.map +1 -0
- package/dist/memory/search.d.ts +21 -0
- package/dist/memory/search.d.ts.map +1 -0
- package/dist/memory/search.js +77 -0
- package/dist/memory/search.js.map +1 -0
- package/dist/memory/store.d.ts +23 -0
- package/dist/memory/store.d.ts.map +1 -0
- package/dist/memory/store.js +144 -0
- package/dist/memory/store.js.map +1 -0
- package/dist/ollama-executor.d.ts +17 -0
- package/dist/ollama-executor.d.ts.map +1 -0
- package/dist/ollama-executor.js +112 -0
- package/dist/ollama-executor.js.map +1 -0
- package/dist/openai-executor.d.ts +38 -0
- package/dist/openai-executor.d.ts.map +1 -0
- package/dist/openai-executor.js +197 -0
- package/dist/openai-executor.js.map +1 -0
- package/dist/router.d.ts +11 -0
- package/dist/router.d.ts.map +1 -0
- package/dist/router.js +185 -0
- package/dist/router.js.map +1 -0
- package/dist/test-message.d.ts +2 -0
- package/dist/test-message.d.ts.map +1 -0
- package/dist/test-message.js +60 -0
- package/dist/test-message.js.map +1 -0
- package/dist/utils/imsg-db-reader.d.ts +24 -0
- package/dist/utils/imsg-db-reader.d.ts.map +1 -0
- package/dist/utils/imsg-db-reader.js +92 -0
- package/dist/utils/imsg-db-reader.js.map +1 -0
- package/dist/utils/imsg-rpc.d.ts +25 -0
- package/dist/utils/imsg-rpc.d.ts.map +1 -0
- package/dist/utils/imsg-rpc.js +149 -0
- package/dist/utils/imsg-rpc.js.map +1 -0
- package/dist/utils/message-formatter.d.ts +3 -0
- package/dist/utils/message-formatter.d.ts.map +1 -0
- package/dist/utils/message-formatter.js +69 -0
- package/dist/utils/message-formatter.js.map +1 -0
- package/dist/web-ui.d.ts +12 -0
- package/dist/web-ui.d.ts.map +1 -0
- package/dist/web-ui.js +5784 -0
- package/dist/web-ui.js.map +1 -0
- package/dist/whatsapp-chats.d.ts +2 -0
- package/dist/whatsapp-chats.d.ts.map +1 -0
- package/dist/whatsapp-chats.js +76 -0
- package/dist/whatsapp-chats.js.map +1 -0
- package/dist/whatsapp-login.d.ts +2 -0
- package/dist/whatsapp-login.d.ts.map +1 -0
- package/dist/whatsapp-login.js +90 -0
- package/dist/whatsapp-login.js.map +1 -0
- package/dist/wiki-sync.d.ts +21 -0
- package/dist/wiki-sync.d.ts.map +1 -0
- package/dist/wiki-sync.js +147 -0
- package/dist/wiki-sync.js.map +1 -0
- package/docs/AddNewAgentGuide.md +100 -0
- package/docs/AddNewMcpGuide.md +72 -0
- package/docs/Architecture.md +795 -0
- package/docs/CLAUDE-AI-SETUP.md +166 -0
- package/docs/Setup.md +297 -0
- package/docs/ai-gym-architecture.md +1040 -0
- package/docs/ai-gym-build-plan.md +343 -0
- package/docs/ai-gym-onboarding.md +122 -0
- package/docs/appcreator_plan.md +348 -0
- package/docs/platform-mcp-audit.md +320 -0
- package/docs/server-deployment-plan.md +503 -0
- package/docs/superpowers/plans/2026-03-25-marketplace.md +1281 -0
- package/docs/superpowers/specs/2026-03-25-marketplace-design.md +287 -0
- package/docs/user-guide.md +2016 -0
- package/mcp-catalog.json +628 -0
- package/package.json +63 -0
- package/public/MyAIforOne-logomark-512.svg +16 -0
- package/public/MyAIforOne-logomark-transparent.svg +15 -0
- package/public/activity.html +314 -0
- package/public/admin.html +1674 -0
- package/public/agent-dashboard.html +670 -0
- package/public/api-docs.html +1106 -0
- package/public/automations.html +722 -0
- package/public/canvas.css +223 -0
- package/public/canvas.js +588 -0
- package/public/changelog.html +231 -0
- package/public/gym.html +2766 -0
- package/public/home.html +1930 -0
- package/public/index.html +2809 -0
- package/public/lab.html +1643 -0
- package/public/library.html +1442 -0
- package/public/marketplace.html +1101 -0
- package/public/mcp-docs.html +441 -0
- package/public/mini.html +390 -0
- package/public/monitor.html +584 -0
- package/public/org.html +4304 -0
- package/public/projects.html +734 -0
- package/public/settings.html +645 -0
- package/public/tasks.html +932 -0
- package/public/trainers/alex.svg +12 -0
- package/public/trainers/jordan.svg +12 -0
- package/public/trainers/morgan.svg +12 -0
- package/public/trainers/riley.svg +12 -0
- package/public/trainers/sam.svg +12 -0
- package/public/user-guide.html +218 -0
- package/registry/agents.json +3 -0
- package/registry/apps.json +20 -0
- package/registry/installed-drafts.json +3 -0
- package/registry/mcps.json +1084 -0
- package/registry/prompts/personal/mcp-test-prompt.md +6 -0
- package/registry/prompts/personal/memory-recall.md +6 -0
- package/registry/prompts/platform/brainstorm.md +15 -0
- package/registry/prompts/platform/code-review.md +16 -0
- package/registry/prompts/platform/explain.md +16 -0
- package/registry/prompts.json +58 -0
- package/registry/skills/external/brainstorming.md +5 -0
- package/registry/skills/external/code-review.md +40 -0
- package/registry/skills/external/frontend-patterns.md +642 -0
- package/registry/skills/external/frontend-slides.md +184 -0
- package/registry/skills/external/systematic-debugging.md +5 -0
- package/registry/skills/external/tdd.md +328 -0
- package/registry/skills/external/verification-before-completion.md +5 -0
- package/registry/skills/external/writing-plans.md +5 -0
- package/registry/skills/platform/ai41_app_build.md +930 -0
- package/registry/skills/platform/ai41_app_deploy.md +168 -0
- package/registry/skills/platform/ai41_app_orchestrator.md +239 -0
- package/registry/skills/platform/ai41_app_patterns.md +359 -0
- package/registry/skills/platform/ai41_app_register.md +85 -0
- package/registry/skills/platform/ai41_app_scaffold.md +421 -0
- package/registry/skills/platform/ai41_app_verify.md +107 -0
- package/registry/skills/platform/opProjectCreate.md +239 -0
- package/registry/skills/platform/op_devbrowser.md +136 -0
- package/registry/skills/platform/sop_brandguidelines.md +103 -0
- package/registry/skills/platform/sop_docx.md +117 -0
- package/registry/skills/platform/sop_frontenddesign.md +44 -0
- package/registry/skills/platform/sop_frontenddesign_v2.md +659 -0
- package/registry/skills/platform/sop_mcpbuilder.md +133 -0
- package/registry/skills/platform/sop_pdf.md +172 -0
- package/registry/skills/platform/sop_pptx.md +133 -0
- package/registry/skills/platform/sop_skillcreator.md +104 -0
- package/registry/skills/platform/sop_themefactory.md +128 -0
- package/registry/skills/platform/sop_webapptesting.md +75 -0
- package/registry/skills/platform/sop_webartifactsbuilder.md +97 -0
- package/registry/skills/platform/sop_xlsx.md +134 -0
- package/registry/skills.json +1055 -0
- package/scripts/discover-chats.sh +11 -0
- package/scripts/install-service-windows.ps1 +87 -0
- package/scripts/install-service.sh +52 -0
- package/scripts/seed-registry.ts +195 -0
- package/scripts/test-send.sh +5 -0
- package/scripts/tray-indicator.ps1 +35 -0
- package/scripts/uninstall-service-windows.ps1 +23 -0
- package/scripts/uninstall-service.sh +15 -0
- package/scripts/xbar-myagent.5s.sh +32 -0
- package/server/mcp-server/dist/index.d.ts +11 -0
- package/server/mcp-server/dist/index.js +1332 -0
- package/server/mcp-server/dist/lib/api-client.d.ts +165 -0
- package/server/mcp-server/dist/lib/api-client.js +241 -0
- package/server/mcp-server/index.ts +1545 -0
- package/server/mcp-server/lib/api-client.ts +366 -0
- package/server/mcp-server/tsconfig.json +14 -0
- package/src/agent-registry.ts +180 -0
- package/src/channels/discord.ts +129 -0
- package/src/channels/imessage.ts +261 -0
- package/src/channels/slack.ts +208 -0
- package/src/channels/telegram.ts +307 -0
- package/src/channels/types.ts +62 -0
- package/src/channels/whatsapp.ts +227 -0
- package/src/config.ts +281 -0
- package/src/cron.ts +43 -0
- package/src/decrypt-keys.ts +60 -0
- package/src/encrypt-keys.ts +70 -0
- package/src/executor.ts +2190 -0
- package/src/gemini-executor.ts +212 -0
- package/src/goals.ts +240 -0
- package/src/gym/activity-digest.ts +546 -0
- package/src/gym/dimension-scorer.ts +297 -0
- package/src/gym/gym-router.ts +801 -0
- package/src/gym/index.ts +19 -0
- package/src/heartbeat.ts +220 -0
- package/src/index.ts +275 -0
- package/src/keystore.ts +190 -0
- package/src/logger.ts +51 -0
- package/src/memory/daily.ts +101 -0
- package/src/memory/embeddings.ts +185 -0
- package/src/memory/index.ts +218 -0
- package/src/memory/search.ts +124 -0
- package/src/memory/store.ts +189 -0
- package/src/ollama-executor.ts +126 -0
- package/src/openai-executor.ts +259 -0
- package/src/router.ts +230 -0
- package/src/test-message.ts +72 -0
- package/src/utils/imsg-db-reader.ts +109 -0
- package/src/utils/imsg-rpc.ts +178 -0
- package/src/utils/message-formatter.ts +90 -0
- package/src/web-ui.ts +5778 -0
- package/src/whatsapp-chats.ts +91 -0
- package/src/whatsapp-login.ts +110 -0
- package/src/wiki-sync.ts +199 -0
- package/tsconfig.json +19 -0
|
@@ -0,0 +1,503 @@
|
|
|
1
|
+
# MyAgent SaaS — Deployment Plan
|
|
2
|
+
|
|
3
|
+
## Vision
|
|
4
|
+
|
|
5
|
+
A **separate application** (separate repo) that takes the MyAgent concept and rebuilds the backend for multi-tenant, server-hosted deployment. Teams access it via Slack and Web UI — no local install needed. Power users with the local app can push/pull agents to/from any SaaS instance.
|
|
6
|
+
|
|
7
|
+
**Two completely independent applications:**
|
|
8
|
+
|
|
9
|
+
| | MyAgent Local | MyAgent SaaS |
|
|
10
|
+
|---|---|---|
|
|
11
|
+
| **Repo** | `channelToAgentToClaude` | `myagent-saas` (new) |
|
|
12
|
+
| **Storage** | File-based (JSON, JSONL, markdown) | PostgreSQL + pgvector |
|
|
13
|
+
| **Users** | Single user, no auth | Multi-tenant, auth + roles |
|
|
14
|
+
| **Executor** | `claude -p` (CLI, personal sub) | Anthropic Messages API (API key) |
|
|
15
|
+
| **Channels** | iMessage, Slack, Telegram, Discord, WhatsApp, Web | Slack, Telegram, Discord, WhatsApp, Web (no iMessage) |
|
|
16
|
+
| **Agents** | Personal, file-based config | Per-tenant, database-stored |
|
|
17
|
+
| **Memory** | File-based (JSONL, markdown) | PostgreSQL + vector embeddings |
|
|
18
|
+
| **Deploy** | Local Mac/Windows | Railway / any cloud |
|
|
19
|
+
|
|
20
|
+
---
|
|
21
|
+
|
|
22
|
+
## Architecture
|
|
23
|
+
|
|
24
|
+
```
|
|
25
|
+
LOCAL APP (existing, unchanged)
|
|
26
|
+
├── File-based storage
|
|
27
|
+
├── CLI executor (claude -p)
|
|
28
|
+
├── Personal agents
|
|
29
|
+
├── iMessage + all channels
|
|
30
|
+
├── Push/pull to SaaS instances ← (new feature, added later)
|
|
31
|
+
│
|
|
32
|
+
│ push/pull via REST API
|
|
33
|
+
│ ▼
|
|
34
|
+
SAAS APP (new repo: myagent-saas)
|
|
35
|
+
├── PostgreSQL + pgvector
|
|
36
|
+
├── API executor (Anthropic Messages API)
|
|
37
|
+
├── Multi-tenant (org → users → agents)
|
|
38
|
+
├── Auth (invite code → session)
|
|
39
|
+
├── Slack, Telegram, Discord, WhatsApp, Web
|
|
40
|
+
├── Web UI (same look and feel, different backend)
|
|
41
|
+
├── REST API for everything
|
|
42
|
+
└── Import/export endpoints for push/pull
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
---
|
|
46
|
+
|
|
47
|
+
## Repo Setup
|
|
48
|
+
|
|
49
|
+
### Step 0: Clone and Rename
|
|
50
|
+
|
|
51
|
+
- [ ] **0.1** Clone `channelToAgentToClaude` → `myagent-saas`
|
|
52
|
+
- [ ] **0.2** Remove: iMessage channel driver, CLI executor, file-based config loading, launchd scripts, Windows service scripts
|
|
53
|
+
- [ ] **0.3** Keep: Web UI (all HTML pages), Slack/Telegram/Discord/WhatsApp drivers, router logic, MCP hub, skill/prompt system, cron/goals system
|
|
54
|
+
- [ ] **0.4** Update `package.json` — new name, add Postgres dependencies (`pg`, `@prisma/client`, `pgvector`)
|
|
55
|
+
- [ ] **0.5** Add Prisma ORM with PostgreSQL provider
|
|
56
|
+
- [ ] **0.6** Create `.env.example` with: `DATABASE_URL`, `ANTHROPIC_API_KEY`, `SESSION_SECRET`, `PORT`
|
|
57
|
+
- [ ] **0.7** Update `CLAUDE.md` for the new repo — document the SaaS architecture, not the local app
|
|
58
|
+
|
|
59
|
+
---
|
|
60
|
+
|
|
61
|
+
## Phase 1: Database Layer (PostgreSQL + pgvector)
|
|
62
|
+
|
|
63
|
+
Replace all file-based storage with PostgreSQL. Use Prisma ORM. Enable pgvector for semantic memory search.
|
|
64
|
+
|
|
65
|
+
### Schema Design
|
|
66
|
+
|
|
67
|
+
- [ ] **1.1 Core tenant model**
|
|
68
|
+
```prisma
|
|
69
|
+
model Tenant {
|
|
70
|
+
id String @id @default(cuid())
|
|
71
|
+
name String
|
|
72
|
+
slug String @unique
|
|
73
|
+
createdAt DateTime @default(now())
|
|
74
|
+
users User[]
|
|
75
|
+
agents Agent[]
|
|
76
|
+
skills Skill[]
|
|
77
|
+
prompts Prompt[]
|
|
78
|
+
apps App[]
|
|
79
|
+
mcpConfigs McpConfig[]
|
|
80
|
+
}
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
- [ ] **1.2 User model**
|
|
84
|
+
```prisma
|
|
85
|
+
model User {
|
|
86
|
+
id String @id @default(cuid())
|
|
87
|
+
email String
|
|
88
|
+
name String
|
|
89
|
+
role Role @default(USER)
|
|
90
|
+
tenantId String
|
|
91
|
+
tenant Tenant @relation(fields: [tenantId], references: [id])
|
|
92
|
+
sessions Session[]
|
|
93
|
+
messages Message[]
|
|
94
|
+
createdAt DateTime @default(now())
|
|
95
|
+
@@unique([email, tenantId])
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
enum Role {
|
|
99
|
+
ADMIN
|
|
100
|
+
USER
|
|
101
|
+
}
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
- [ ] **1.3 Agent model**
|
|
105
|
+
```prisma
|
|
106
|
+
model Agent {
|
|
107
|
+
id String @id @default(cuid())
|
|
108
|
+
agentId String
|
|
109
|
+
tenantId String
|
|
110
|
+
tenant Tenant @relation(fields: [tenantId], references: [id])
|
|
111
|
+
name String
|
|
112
|
+
description String?
|
|
113
|
+
claudeMd String @db.Text
|
|
114
|
+
workspace String?
|
|
115
|
+
persistent Boolean @default(true)
|
|
116
|
+
streaming Boolean @default(true)
|
|
117
|
+
advancedMemory Boolean @default(false)
|
|
118
|
+
agentClass String @default("standard")
|
|
119
|
+
allowedTools String[]
|
|
120
|
+
skills String[]
|
|
121
|
+
mcps String[]
|
|
122
|
+
mentionAliases String[]
|
|
123
|
+
timeout Int @default(14400000)
|
|
124
|
+
model String?
|
|
125
|
+
org Json?
|
|
126
|
+
cron Json?
|
|
127
|
+
goals Json?
|
|
128
|
+
routes Json?
|
|
129
|
+
messages Message[]
|
|
130
|
+
sessions AgentSession[]
|
|
131
|
+
memories Memory[]
|
|
132
|
+
createdAt DateTime @default(now())
|
|
133
|
+
updatedAt DateTime @updatedAt
|
|
134
|
+
@@unique([agentId, tenantId])
|
|
135
|
+
}
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
- [ ] **1.4 Message / conversation model**
|
|
139
|
+
```prisma
|
|
140
|
+
model Message {
|
|
141
|
+
id String @id @default(cuid())
|
|
142
|
+
agentId String
|
|
143
|
+
agent Agent @relation(fields: [agentId], references: [id])
|
|
144
|
+
userId String
|
|
145
|
+
user User @relation(fields: [userId], references: [id])
|
|
146
|
+
role String // "user" | "agent"
|
|
147
|
+
text String @db.Text
|
|
148
|
+
channel String
|
|
149
|
+
tools Json?
|
|
150
|
+
cost Float?
|
|
151
|
+
createdAt DateTime @default(now())
|
|
152
|
+
@@index([agentId, userId, createdAt])
|
|
153
|
+
}
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
- [ ] **1.5 Agent session model (for API executor conversation state)**
|
|
157
|
+
```prisma
|
|
158
|
+
model AgentSession {
|
|
159
|
+
id String @id @default(cuid())
|
|
160
|
+
agentId String
|
|
161
|
+
agent Agent @relation(fields: [agentId], references: [id])
|
|
162
|
+
userId String
|
|
163
|
+
messages Json @db.JsonB // Anthropic message format array
|
|
164
|
+
createdAt DateTime @default(now())
|
|
165
|
+
updatedAt DateTime @updatedAt
|
|
166
|
+
@@unique([agentId, userId])
|
|
167
|
+
}
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
- [ ] **1.6 Vector memory model (pgvector)**
|
|
171
|
+
```prisma
|
|
172
|
+
model Memory {
|
|
173
|
+
id String @id @default(cuid())
|
|
174
|
+
agentId String
|
|
175
|
+
agent Agent @relation(fields: [agentId], references: [id])
|
|
176
|
+
content String @db.Text
|
|
177
|
+
embedding Unsupported("vector(1536)")
|
|
178
|
+
metadata Json?
|
|
179
|
+
createdAt DateTime @default(now())
|
|
180
|
+
@@index([agentId])
|
|
181
|
+
}
|
|
182
|
+
```
|
|
183
|
+
- Raw SQL for vector similarity search: `ORDER BY embedding <=> $1 LIMIT $2`
|
|
184
|
+
- Embedding generation via Anthropic or OpenAI embeddings API
|
|
185
|
+
|
|
186
|
+
- [ ] **1.7 Skill, Prompt, App, McpConfig models**
|
|
187
|
+
```prisma
|
|
188
|
+
model Skill {
|
|
189
|
+
id String @id @default(cuid())
|
|
190
|
+
tenantId String
|
|
191
|
+
tenant Tenant @relation(fields: [tenantId], references: [id])
|
|
192
|
+
name String
|
|
193
|
+
description String?
|
|
194
|
+
content String @db.Text
|
|
195
|
+
category String?
|
|
196
|
+
isDefault Boolean @default(false)
|
|
197
|
+
createdAt DateTime @default(now())
|
|
198
|
+
@@unique([name, tenantId])
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
model Prompt {
|
|
202
|
+
id String @id @default(cuid())
|
|
203
|
+
tenantId String
|
|
204
|
+
tenant Tenant @relation(fields: [tenantId], references: [id])
|
|
205
|
+
name String
|
|
206
|
+
description String?
|
|
207
|
+
content String @db.Text
|
|
208
|
+
trigger String @default("!")
|
|
209
|
+
createdAt DateTime @default(now())
|
|
210
|
+
@@unique([name, tenantId])
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
model App {
|
|
214
|
+
id String @id @default(cuid())
|
|
215
|
+
tenantId String
|
|
216
|
+
tenant Tenant @relation(fields: [tenantId], references: [id])
|
|
217
|
+
name String
|
|
218
|
+
description String?
|
|
219
|
+
url String?
|
|
220
|
+
status String @default("draft")
|
|
221
|
+
category String?
|
|
222
|
+
agentDeveloper String?
|
|
223
|
+
githubRepo String?
|
|
224
|
+
deployPlatform String?
|
|
225
|
+
healthStatus String @default("unknown")
|
|
226
|
+
createdAt DateTime @default(now())
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
model McpConfig {
|
|
230
|
+
id String @id @default(cuid())
|
|
231
|
+
tenantId String
|
|
232
|
+
tenant Tenant @relation(fields: [tenantId], references: [id])
|
|
233
|
+
name String
|
|
234
|
+
type String // "http" | "stdio"
|
|
235
|
+
url String?
|
|
236
|
+
command String?
|
|
237
|
+
args String[]
|
|
238
|
+
headers Json?
|
|
239
|
+
env Json?
|
|
240
|
+
@@unique([name, tenantId])
|
|
241
|
+
}
|
|
242
|
+
```
|
|
243
|
+
|
|
244
|
+
- [ ] **1.8 Session model (auth sessions)**
|
|
245
|
+
```prisma
|
|
246
|
+
model Session {
|
|
247
|
+
id String @id @default(cuid())
|
|
248
|
+
userId String
|
|
249
|
+
user User @relation(fields: [userId], references: [id])
|
|
250
|
+
token String @unique
|
|
251
|
+
expiresAt DateTime
|
|
252
|
+
createdAt DateTime @default(now())
|
|
253
|
+
}
|
|
254
|
+
```
|
|
255
|
+
|
|
256
|
+
- [ ] **1.9 Prisma migration — initial schema**
|
|
257
|
+
- `npx prisma migrate dev --name init`
|
|
258
|
+
- Enable pgvector extension: `CREATE EXTENSION IF NOT EXISTS vector;`
|
|
259
|
+
|
|
260
|
+
- [ ] **1.10 Seed script**
|
|
261
|
+
- Create default tenant
|
|
262
|
+
- Create admin user
|
|
263
|
+
- Seed platform agents (agentcreator, skillcreator, appcreator, promptcreator)
|
|
264
|
+
- Seed default skills
|
|
265
|
+
|
|
266
|
+
---
|
|
267
|
+
|
|
268
|
+
## Phase 2: API Executor
|
|
269
|
+
|
|
270
|
+
Replace `claude -p` CLI executor with direct Anthropic Messages API calls.
|
|
271
|
+
|
|
272
|
+
- [ ] **2.1 Executor interface**
|
|
273
|
+
- Define `executeAgent(route, message, context)` and `executeAgentStreaming(route, message, context)` interfaces
|
|
274
|
+
- Both take: system prompt, user message, tools, conversation history
|
|
275
|
+
- Sync returns: response text
|
|
276
|
+
- Streaming returns: `AsyncGenerator<StreamEvent>`
|
|
277
|
+
|
|
278
|
+
- [ ] **2.2 Anthropic API client**
|
|
279
|
+
- New file: `src/executor-api.ts`
|
|
280
|
+
- Use `@anthropic-ai/sdk` package
|
|
281
|
+
- Call `client.messages.create()` with system prompt, messages, tools
|
|
282
|
+
- Support streaming via `client.messages.stream()`
|
|
283
|
+
- Model selection: per-agent or global default
|
|
284
|
+
- Config: `ANTHROPIC_API_KEY` env var
|
|
285
|
+
|
|
286
|
+
- [ ] **2.3 Tool execution**
|
|
287
|
+
- When model returns `tool_use` block, execute the tool server-side
|
|
288
|
+
- Tool handlers for: Read, Write, Edit, Glob, Grep, Bash, WebFetch, WebSearch
|
|
289
|
+
- Bash: sandboxed with timeout, scoped to agent workspace
|
|
290
|
+
- File tools: scoped to tenant workspace directories
|
|
291
|
+
- MCP tools: proxy to configured MCP servers
|
|
292
|
+
- Return tool results, continue conversation loop
|
|
293
|
+
|
|
294
|
+
- [ ] **2.4 Conversation state**
|
|
295
|
+
- Load/save conversation history from `AgentSession` table
|
|
296
|
+
- Per-user, per-agent sessions
|
|
297
|
+
- Context window management: truncate or summarize when approaching limit
|
|
298
|
+
- Session reset: clear `AgentSession` record
|
|
299
|
+
|
|
300
|
+
- [ ] **2.5 Streaming integration**
|
|
301
|
+
- Wire streaming executor into existing SSE/streaming endpoints
|
|
302
|
+
- Emit same `StreamEvent` types as current CLI executor
|
|
303
|
+
- Web UI streaming should work without frontend changes
|
|
304
|
+
|
|
305
|
+
- [ ] **2.6 Cost tracking**
|
|
306
|
+
- Parse `usage` from Anthropic API response (input_tokens, output_tokens)
|
|
307
|
+
- Store per-message cost in `Message.cost` field
|
|
308
|
+
- Aggregate per-user, per-agent, per-tenant for billing/reporting
|
|
309
|
+
|
|
310
|
+
---
|
|
311
|
+
|
|
312
|
+
## Phase 3: Authentication & Multi-Tenancy
|
|
313
|
+
|
|
314
|
+
- [ ] **3.1 Auth middleware**
|
|
315
|
+
- Session-based auth via `Session` table
|
|
316
|
+
- Login endpoint: `POST /api/auth/login` (email + invite code)
|
|
317
|
+
- Logout: `POST /api/auth/logout`
|
|
318
|
+
- Session cookie: `HttpOnly`, `SameSite=Strict`
|
|
319
|
+
- All API routes protected except: `/health`, `/login`, `/api/auth/*`
|
|
320
|
+
- Attach `req.user` and `req.tenant` to authenticated requests
|
|
321
|
+
|
|
322
|
+
- [ ] **3.2 Tenant isolation**
|
|
323
|
+
- Every database query scoped by `tenantId`
|
|
324
|
+
- Prisma middleware or helper: `withTenant(tenantId)`
|
|
325
|
+
- Agents, skills, prompts, apps, MCPs — all tenant-scoped
|
|
326
|
+
- Users belong to exactly one tenant
|
|
327
|
+
- No cross-tenant data leakage
|
|
328
|
+
|
|
329
|
+
- [ ] **3.3 Invite system**
|
|
330
|
+
- Admin generates invite codes: `POST /api/admin/invites`
|
|
331
|
+
- User redeems invite: `POST /api/auth/register` (email, name, invite code)
|
|
332
|
+
- Invite tied to tenant — registering with it joins that tenant
|
|
333
|
+
- Invite can be single-use or multi-use (configurable)
|
|
334
|
+
|
|
335
|
+
- [ ] **3.4 User identity in messages**
|
|
336
|
+
- Web UI: attach authenticated user to chat messages
|
|
337
|
+
- Slack: map Slack user ID to platform user (auto-create on first message if invite allows)
|
|
338
|
+
- Telegram: map Telegram user ID to platform user
|
|
339
|
+
- Per-user conversation isolation by default
|
|
340
|
+
|
|
341
|
+
- [ ] **3.5 Role-based access**
|
|
342
|
+
- `ADMIN`: create/edit/delete agents, manage users, generate invites, access all settings
|
|
343
|
+
- `USER`: chat with agents, browse registry, use Lab (if allowed)
|
|
344
|
+
- Agent creation in Lab: admin-only by default, configurable per tenant
|
|
345
|
+
|
|
346
|
+
- [ ] **3.6 Login page**
|
|
347
|
+
- `GET /login` — clean login page matching existing design language
|
|
348
|
+
- Email + invite code (first time) or email + session (returning)
|
|
349
|
+
- Redirect to `/ui` after login
|
|
350
|
+
|
|
351
|
+
- [ ] **3.7 Admin panel**
|
|
352
|
+
- `/admin` — admin-only page
|
|
353
|
+
- Manage users: list, invite, deactivate, change roles
|
|
354
|
+
- Tenant settings: name, default model, allowed channels
|
|
355
|
+
- Usage dashboard: token counts, costs per user/agent
|
|
356
|
+
- Add to existing settings page or standalone
|
|
357
|
+
|
|
358
|
+
---
|
|
359
|
+
|
|
360
|
+
## Phase 4: Adapt Web UI & Routes
|
|
361
|
+
|
|
362
|
+
The frontend HTML pages stay the same (same design), but backend API calls now hit the database instead of the filesystem.
|
|
363
|
+
|
|
364
|
+
- [ ] **4.1 Rewrite API layer**
|
|
365
|
+
- All `readFileSync`/`writeFileSync` config.json operations → Prisma queries
|
|
366
|
+
- `GET /api/dashboard` → query `Agent`, `Message` tables
|
|
367
|
+
- `GET /api/agents` → query `Agent` table with tenant filter
|
|
368
|
+
- `POST /api/agents` → insert into `Agent` table
|
|
369
|
+
- `PUT /api/agents/:id` → update `Agent` table
|
|
370
|
+
- `DELETE /api/agents/:id` → delete from `Agent` table
|
|
371
|
+
- Same for skills, prompts, apps, MCPs
|
|
372
|
+
|
|
373
|
+
- [ ] **4.2 Chat endpoints**
|
|
374
|
+
- `POST /api/chat/:agentId` → load agent from DB, run API executor
|
|
375
|
+
- `POST /api/chat/:agentId/stream` → same but streaming
|
|
376
|
+
- Conversation history from `AgentSession` table
|
|
377
|
+
- Messages logged to `Message` table
|
|
378
|
+
|
|
379
|
+
- [ ] **4.3 Marketplace/Registry endpoints**
|
|
380
|
+
- Same API shape, backed by database instead of JSON files
|
|
381
|
+
- `GET /api/marketplace/:type` → query appropriate table
|
|
382
|
+
- Browse, search, filter — all database queries
|
|
383
|
+
|
|
384
|
+
- [ ] **4.4 File uploads**
|
|
385
|
+
- Upload to server filesystem or S3/R2
|
|
386
|
+
- Path stored in database
|
|
387
|
+
- Scoped to tenant
|
|
388
|
+
|
|
389
|
+
- [ ] **4.5 Web UI updates**
|
|
390
|
+
- Add login redirect if not authenticated
|
|
391
|
+
- Show logged-in user name in topbar
|
|
392
|
+
- Hide admin-only features for regular users
|
|
393
|
+
- Everything else stays the same — same pages, same design
|
|
394
|
+
|
|
395
|
+
---
|
|
396
|
+
|
|
397
|
+
## Phase 5: Push/Pull (Import/Export API)
|
|
398
|
+
|
|
399
|
+
Enable local MyAgent instances to push agents/skills/prompts to and pull from any SaaS instance.
|
|
400
|
+
|
|
401
|
+
- [ ] **5.1 Export endpoint (SaaS-side)**
|
|
402
|
+
- `GET /api/export/:type/:id` — export agent, skill, prompt, or app as JSON package
|
|
403
|
+
- Package includes: config, CLAUDE.md content, associated skills content
|
|
404
|
+
- Strips: tenant info, user data, conversation history
|
|
405
|
+
- Auth: requires API key or user session
|
|
406
|
+
|
|
407
|
+
- [ ] **5.2 Import endpoint (SaaS-side)**
|
|
408
|
+
- `POST /api/import` — import an agent/skill/prompt package
|
|
409
|
+
- Validates package, creates records in database
|
|
410
|
+
- Generates default web route for imported agent
|
|
411
|
+
- Auth: requires admin role
|
|
412
|
+
|
|
413
|
+
- [ ] **5.3 Push command (local-side — added to local app later)**
|
|
414
|
+
- `/push @agent-name to remote-name`
|
|
415
|
+
- Config: `remotes` section in local `config.json`
|
|
416
|
+
- Packages agent config + CLAUDE.md + skills → POST to remote `/api/import`
|
|
417
|
+
- Not part of this repo — tracked separately
|
|
418
|
+
|
|
419
|
+
- [ ] **5.4 Pull command (local-side — added to local app later)**
|
|
420
|
+
- `/pull @agent-name from remote-name`
|
|
421
|
+
- GET from remote `/api/export/agent/:id` → install locally
|
|
422
|
+
- Not part of this repo — tracked separately
|
|
423
|
+
|
|
424
|
+
- [ ] **5.5 API key auth for push/pull**
|
|
425
|
+
- Tenant-level API keys for programmatic access
|
|
426
|
+
- `POST /api/admin/api-keys` — generate API key
|
|
427
|
+
- API key scoped to tenant, attached to requests via `Authorization: Bearer` header
|
|
428
|
+
|
|
429
|
+
---
|
|
430
|
+
|
|
431
|
+
## Phase 6: Deployment
|
|
432
|
+
|
|
433
|
+
- [ ] **6.1 Dockerfile**
|
|
434
|
+
```dockerfile
|
|
435
|
+
FROM node:22-alpine
|
|
436
|
+
WORKDIR /app
|
|
437
|
+
COPY package*.json ./
|
|
438
|
+
RUN npm ci --production
|
|
439
|
+
COPY dist/ ./dist/
|
|
440
|
+
COPY public/ ./public/
|
|
441
|
+
COPY prisma/ ./prisma/
|
|
442
|
+
RUN npx prisma generate
|
|
443
|
+
EXPOSE 4888
|
|
444
|
+
CMD ["node", "dist/index.js"]
|
|
445
|
+
```
|
|
446
|
+
|
|
447
|
+
- [ ] **6.2 Railway config**
|
|
448
|
+
- PostgreSQL add-on with pgvector extension
|
|
449
|
+
- Environment variables: `DATABASE_URL`, `ANTHROPIC_API_KEY`, `SESSION_SECRET`, `PORT`
|
|
450
|
+
- Health check: `GET /health`
|
|
451
|
+
- Auto-deploy from GitHub
|
|
452
|
+
|
|
453
|
+
- [ ] **6.3 Database migrations on deploy**
|
|
454
|
+
- `npx prisma migrate deploy` as part of build/start
|
|
455
|
+
- Seed script for first deploy
|
|
456
|
+
|
|
457
|
+
- [ ] **6.4 First tenant setup**
|
|
458
|
+
- CLI command or setup endpoint: creates first tenant + admin user
|
|
459
|
+
- `npm run setup -- --tenant "Finance Team" --admin "admin@company.com"`
|
|
460
|
+
|
|
461
|
+
- [ ] **6.5 Verify deployment**
|
|
462
|
+
- Web UI accessible
|
|
463
|
+
- Auth working
|
|
464
|
+
- Slack bot connecting
|
|
465
|
+
- Agent execution via API
|
|
466
|
+
- Conversation persistence
|
|
467
|
+
- Vector memory search
|
|
468
|
+
|
|
469
|
+
---
|
|
470
|
+
|
|
471
|
+
## Build Order
|
|
472
|
+
|
|
473
|
+
```
|
|
474
|
+
Phase 0: Clone repo, clean up ← Day 1
|
|
475
|
+
Phase 1: Database schema + Prisma ← Day 1-2
|
|
476
|
+
Phase 2: API executor ← Day 2-3
|
|
477
|
+
Phase 3: Auth + multi-tenancy ← Day 3-4
|
|
478
|
+
Phase 4: Rewrite API layer ← Day 4-5
|
|
479
|
+
Phase 5: Push/pull endpoints ← Day 5
|
|
480
|
+
Phase 6: Deploy to Railway ← Day 5-6
|
|
481
|
+
|
|
482
|
+
Total: ~1 week to MVP
|
|
483
|
+
```
|
|
484
|
+
|
|
485
|
+
**MVP = Phases 0-4 + 6:** Team can sign in, chat with agents via Web UI and Slack, browse registry. Push/pull is a fast-follow.
|
|
486
|
+
|
|
487
|
+
---
|
|
488
|
+
|
|
489
|
+
## Open Questions
|
|
490
|
+
|
|
491
|
+
1. **Embedding model** — Use Anthropic's embeddings API or OpenAI's `text-embedding-3-small` for pgvector? OpenAI is cheaper and more common for embeddings.
|
|
492
|
+
|
|
493
|
+
2. **File tool sandboxing** — On the server, agents can't have free filesystem access. Options: (a) Docker containers per execution, (b) scoped to `/data/{tenantId}/{agentId}/` directory, (c) disable file tools entirely and rely on MCP for data access.
|
|
494
|
+
|
|
495
|
+
3. **Workspace concept** — Locally, workspace = directory on disk. On server, workspace = what? A mounted volume? A Git repo clone? Needs definition.
|
|
496
|
+
|
|
497
|
+
4. **Slack multi-tenant** — One Slack app per tenant, or one shared Slack app with tenant routing? Per-tenant is cleaner but requires each tenant to install their own app.
|
|
498
|
+
|
|
499
|
+
5. **Rate limiting** — Anthropic API has rate limits. Need queue/throttle for concurrent executions. Per-tenant rate limits too?
|
|
500
|
+
|
|
501
|
+
6. **Billing** — Track token usage per tenant for cost recovery? Not MVP but schema should support it (already has `Message.cost`).
|
|
502
|
+
|
|
503
|
+
7. **Background jobs** — Cron/goals on the server need a job scheduler. Use node-cron (already exists) or a proper queue (Bull/BullMQ with Redis)?
|