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.
Files changed (315) hide show
  1. package/README.md +113 -0
  2. package/agents/_template/CLAUDE.md +18 -0
  3. package/agents/_template/agent.json +7 -0
  4. package/agents/platform/agentcreator/CLAUDE.md +300 -0
  5. package/agents/platform/appcreator/CLAUDE.md +158 -0
  6. package/agents/platform/gym/CLAUDE.md +486 -0
  7. package/agents/platform/gym/agent.json +40 -0
  8. package/agents/platform/gym/programs/agent-building/program.json +160 -0
  9. package/agents/platform/gym/programs/automations-mastery/program.json +129 -0
  10. package/agents/platform/gym/programs/getting-started/program.json +124 -0
  11. package/agents/platform/gym/programs/mcp-integrations/program.json +116 -0
  12. package/agents/platform/gym/programs/multi-model-strategy/program.json +115 -0
  13. package/agents/platform/gym/programs/prompt-engineering/program.json +136 -0
  14. package/agents/platform/gym/souls/alex.md +12 -0
  15. package/agents/platform/gym/souls/jordan.md +12 -0
  16. package/agents/platform/gym/souls/morgan.md +12 -0
  17. package/agents/platform/gym/souls/riley.md +12 -0
  18. package/agents/platform/gym/souls/sam.md +12 -0
  19. package/agents/platform/hub/CLAUDE.md +372 -0
  20. package/agents/platform/promptcreator/CLAUDE.md +130 -0
  21. package/agents/platform/skillcreator/CLAUDE.md +163 -0
  22. package/bin/cli.js +566 -0
  23. package/config.example.json +310 -0
  24. package/dist/agent-registry.d.ts +32 -0
  25. package/dist/agent-registry.d.ts.map +1 -0
  26. package/dist/agent-registry.js +144 -0
  27. package/dist/agent-registry.js.map +1 -0
  28. package/dist/channels/discord.d.ts +17 -0
  29. package/dist/channels/discord.d.ts.map +1 -0
  30. package/dist/channels/discord.js +114 -0
  31. package/dist/channels/discord.js.map +1 -0
  32. package/dist/channels/imessage.d.ts +23 -0
  33. package/dist/channels/imessage.d.ts.map +1 -0
  34. package/dist/channels/imessage.js +214 -0
  35. package/dist/channels/imessage.js.map +1 -0
  36. package/dist/channels/slack.d.ts +19 -0
  37. package/dist/channels/slack.d.ts.map +1 -0
  38. package/dist/channels/slack.js +167 -0
  39. package/dist/channels/slack.js.map +1 -0
  40. package/dist/channels/telegram.d.ts +19 -0
  41. package/dist/channels/telegram.d.ts.map +1 -0
  42. package/dist/channels/telegram.js +274 -0
  43. package/dist/channels/telegram.js.map +1 -0
  44. package/dist/channels/types.d.ts +44 -0
  45. package/dist/channels/types.d.ts.map +1 -0
  46. package/dist/channels/types.js +18 -0
  47. package/dist/channels/types.js.map +1 -0
  48. package/dist/channels/whatsapp.d.ts +23 -0
  49. package/dist/channels/whatsapp.d.ts.map +1 -0
  50. package/dist/channels/whatsapp.js +189 -0
  51. package/dist/channels/whatsapp.js.map +1 -0
  52. package/dist/config.d.ts +134 -0
  53. package/dist/config.d.ts.map +1 -0
  54. package/dist/config.js +127 -0
  55. package/dist/config.js.map +1 -0
  56. package/dist/cron.d.ts +8 -0
  57. package/dist/cron.d.ts.map +1 -0
  58. package/dist/cron.js +35 -0
  59. package/dist/cron.js.map +1 -0
  60. package/dist/decrypt-keys.d.ts +7 -0
  61. package/dist/decrypt-keys.d.ts.map +1 -0
  62. package/dist/decrypt-keys.js +53 -0
  63. package/dist/decrypt-keys.js.map +1 -0
  64. package/dist/encrypt-keys.d.ts +8 -0
  65. package/dist/encrypt-keys.d.ts.map +1 -0
  66. package/dist/encrypt-keys.js +62 -0
  67. package/dist/encrypt-keys.js.map +1 -0
  68. package/dist/executor.d.ts +31 -0
  69. package/dist/executor.d.ts.map +1 -0
  70. package/dist/executor.js +2009 -0
  71. package/dist/executor.js.map +1 -0
  72. package/dist/gemini-executor.d.ts +27 -0
  73. package/dist/gemini-executor.d.ts.map +1 -0
  74. package/dist/gemini-executor.js +160 -0
  75. package/dist/gemini-executor.js.map +1 -0
  76. package/dist/goals.d.ts +24 -0
  77. package/dist/goals.d.ts.map +1 -0
  78. package/dist/goals.js +189 -0
  79. package/dist/goals.js.map +1 -0
  80. package/dist/gym/activity-digest.d.ts +30 -0
  81. package/dist/gym/activity-digest.d.ts.map +1 -0
  82. package/dist/gym/activity-digest.js +506 -0
  83. package/dist/gym/activity-digest.js.map +1 -0
  84. package/dist/gym/dimension-scorer.d.ts +76 -0
  85. package/dist/gym/dimension-scorer.d.ts.map +1 -0
  86. package/dist/gym/dimension-scorer.js +236 -0
  87. package/dist/gym/dimension-scorer.js.map +1 -0
  88. package/dist/gym/gym-router.d.ts +7 -0
  89. package/dist/gym/gym-router.d.ts.map +1 -0
  90. package/dist/gym/gym-router.js +718 -0
  91. package/dist/gym/gym-router.js.map +1 -0
  92. package/dist/gym/index.d.ts +11 -0
  93. package/dist/gym/index.d.ts.map +1 -0
  94. package/dist/gym/index.js +11 -0
  95. package/dist/gym/index.js.map +1 -0
  96. package/dist/heartbeat.d.ts +21 -0
  97. package/dist/heartbeat.d.ts.map +1 -0
  98. package/dist/heartbeat.js +163 -0
  99. package/dist/heartbeat.js.map +1 -0
  100. package/dist/index.d.ts +2 -0
  101. package/dist/index.d.ts.map +1 -0
  102. package/dist/index.js +254 -0
  103. package/dist/index.js.map +1 -0
  104. package/dist/keystore.d.ts +22 -0
  105. package/dist/keystore.d.ts.map +1 -0
  106. package/dist/keystore.js +178 -0
  107. package/dist/keystore.js.map +1 -0
  108. package/dist/logger.d.ts +9 -0
  109. package/dist/logger.d.ts.map +1 -0
  110. package/dist/logger.js +45 -0
  111. package/dist/logger.js.map +1 -0
  112. package/dist/memory/daily.d.ts +22 -0
  113. package/dist/memory/daily.d.ts.map +1 -0
  114. package/dist/memory/daily.js +82 -0
  115. package/dist/memory/daily.js.map +1 -0
  116. package/dist/memory/embeddings.d.ts +15 -0
  117. package/dist/memory/embeddings.d.ts.map +1 -0
  118. package/dist/memory/embeddings.js +154 -0
  119. package/dist/memory/embeddings.js.map +1 -0
  120. package/dist/memory/index.d.ts +32 -0
  121. package/dist/memory/index.d.ts.map +1 -0
  122. package/dist/memory/index.js +159 -0
  123. package/dist/memory/index.js.map +1 -0
  124. package/dist/memory/search.d.ts +21 -0
  125. package/dist/memory/search.d.ts.map +1 -0
  126. package/dist/memory/search.js +77 -0
  127. package/dist/memory/search.js.map +1 -0
  128. package/dist/memory/store.d.ts +23 -0
  129. package/dist/memory/store.d.ts.map +1 -0
  130. package/dist/memory/store.js +144 -0
  131. package/dist/memory/store.js.map +1 -0
  132. package/dist/ollama-executor.d.ts +17 -0
  133. package/dist/ollama-executor.d.ts.map +1 -0
  134. package/dist/ollama-executor.js +112 -0
  135. package/dist/ollama-executor.js.map +1 -0
  136. package/dist/openai-executor.d.ts +38 -0
  137. package/dist/openai-executor.d.ts.map +1 -0
  138. package/dist/openai-executor.js +197 -0
  139. package/dist/openai-executor.js.map +1 -0
  140. package/dist/router.d.ts +11 -0
  141. package/dist/router.d.ts.map +1 -0
  142. package/dist/router.js +185 -0
  143. package/dist/router.js.map +1 -0
  144. package/dist/test-message.d.ts +2 -0
  145. package/dist/test-message.d.ts.map +1 -0
  146. package/dist/test-message.js +60 -0
  147. package/dist/test-message.js.map +1 -0
  148. package/dist/utils/imsg-db-reader.d.ts +24 -0
  149. package/dist/utils/imsg-db-reader.d.ts.map +1 -0
  150. package/dist/utils/imsg-db-reader.js +92 -0
  151. package/dist/utils/imsg-db-reader.js.map +1 -0
  152. package/dist/utils/imsg-rpc.d.ts +25 -0
  153. package/dist/utils/imsg-rpc.d.ts.map +1 -0
  154. package/dist/utils/imsg-rpc.js +149 -0
  155. package/dist/utils/imsg-rpc.js.map +1 -0
  156. package/dist/utils/message-formatter.d.ts +3 -0
  157. package/dist/utils/message-formatter.d.ts.map +1 -0
  158. package/dist/utils/message-formatter.js +69 -0
  159. package/dist/utils/message-formatter.js.map +1 -0
  160. package/dist/web-ui.d.ts +12 -0
  161. package/dist/web-ui.d.ts.map +1 -0
  162. package/dist/web-ui.js +5784 -0
  163. package/dist/web-ui.js.map +1 -0
  164. package/dist/whatsapp-chats.d.ts +2 -0
  165. package/dist/whatsapp-chats.d.ts.map +1 -0
  166. package/dist/whatsapp-chats.js +76 -0
  167. package/dist/whatsapp-chats.js.map +1 -0
  168. package/dist/whatsapp-login.d.ts +2 -0
  169. package/dist/whatsapp-login.d.ts.map +1 -0
  170. package/dist/whatsapp-login.js +90 -0
  171. package/dist/whatsapp-login.js.map +1 -0
  172. package/dist/wiki-sync.d.ts +21 -0
  173. package/dist/wiki-sync.d.ts.map +1 -0
  174. package/dist/wiki-sync.js +147 -0
  175. package/dist/wiki-sync.js.map +1 -0
  176. package/docs/AddNewAgentGuide.md +100 -0
  177. package/docs/AddNewMcpGuide.md +72 -0
  178. package/docs/Architecture.md +795 -0
  179. package/docs/CLAUDE-AI-SETUP.md +166 -0
  180. package/docs/Setup.md +297 -0
  181. package/docs/ai-gym-architecture.md +1040 -0
  182. package/docs/ai-gym-build-plan.md +343 -0
  183. package/docs/ai-gym-onboarding.md +122 -0
  184. package/docs/appcreator_plan.md +348 -0
  185. package/docs/platform-mcp-audit.md +320 -0
  186. package/docs/server-deployment-plan.md +503 -0
  187. package/docs/superpowers/plans/2026-03-25-marketplace.md +1281 -0
  188. package/docs/superpowers/specs/2026-03-25-marketplace-design.md +287 -0
  189. package/docs/user-guide.md +2016 -0
  190. package/mcp-catalog.json +628 -0
  191. package/package.json +63 -0
  192. package/public/MyAIforOne-logomark-512.svg +16 -0
  193. package/public/MyAIforOne-logomark-transparent.svg +15 -0
  194. package/public/activity.html +314 -0
  195. package/public/admin.html +1674 -0
  196. package/public/agent-dashboard.html +670 -0
  197. package/public/api-docs.html +1106 -0
  198. package/public/automations.html +722 -0
  199. package/public/canvas.css +223 -0
  200. package/public/canvas.js +588 -0
  201. package/public/changelog.html +231 -0
  202. package/public/gym.html +2766 -0
  203. package/public/home.html +1930 -0
  204. package/public/index.html +2809 -0
  205. package/public/lab.html +1643 -0
  206. package/public/library.html +1442 -0
  207. package/public/marketplace.html +1101 -0
  208. package/public/mcp-docs.html +441 -0
  209. package/public/mini.html +390 -0
  210. package/public/monitor.html +584 -0
  211. package/public/org.html +4304 -0
  212. package/public/projects.html +734 -0
  213. package/public/settings.html +645 -0
  214. package/public/tasks.html +932 -0
  215. package/public/trainers/alex.svg +12 -0
  216. package/public/trainers/jordan.svg +12 -0
  217. package/public/trainers/morgan.svg +12 -0
  218. package/public/trainers/riley.svg +12 -0
  219. package/public/trainers/sam.svg +12 -0
  220. package/public/user-guide.html +218 -0
  221. package/registry/agents.json +3 -0
  222. package/registry/apps.json +20 -0
  223. package/registry/installed-drafts.json +3 -0
  224. package/registry/mcps.json +1084 -0
  225. package/registry/prompts/personal/mcp-test-prompt.md +6 -0
  226. package/registry/prompts/personal/memory-recall.md +6 -0
  227. package/registry/prompts/platform/brainstorm.md +15 -0
  228. package/registry/prompts/platform/code-review.md +16 -0
  229. package/registry/prompts/platform/explain.md +16 -0
  230. package/registry/prompts.json +58 -0
  231. package/registry/skills/external/brainstorming.md +5 -0
  232. package/registry/skills/external/code-review.md +40 -0
  233. package/registry/skills/external/frontend-patterns.md +642 -0
  234. package/registry/skills/external/frontend-slides.md +184 -0
  235. package/registry/skills/external/systematic-debugging.md +5 -0
  236. package/registry/skills/external/tdd.md +328 -0
  237. package/registry/skills/external/verification-before-completion.md +5 -0
  238. package/registry/skills/external/writing-plans.md +5 -0
  239. package/registry/skills/platform/ai41_app_build.md +930 -0
  240. package/registry/skills/platform/ai41_app_deploy.md +168 -0
  241. package/registry/skills/platform/ai41_app_orchestrator.md +239 -0
  242. package/registry/skills/platform/ai41_app_patterns.md +359 -0
  243. package/registry/skills/platform/ai41_app_register.md +85 -0
  244. package/registry/skills/platform/ai41_app_scaffold.md +421 -0
  245. package/registry/skills/platform/ai41_app_verify.md +107 -0
  246. package/registry/skills/platform/opProjectCreate.md +239 -0
  247. package/registry/skills/platform/op_devbrowser.md +136 -0
  248. package/registry/skills/platform/sop_brandguidelines.md +103 -0
  249. package/registry/skills/platform/sop_docx.md +117 -0
  250. package/registry/skills/platform/sop_frontenddesign.md +44 -0
  251. package/registry/skills/platform/sop_frontenddesign_v2.md +659 -0
  252. package/registry/skills/platform/sop_mcpbuilder.md +133 -0
  253. package/registry/skills/platform/sop_pdf.md +172 -0
  254. package/registry/skills/platform/sop_pptx.md +133 -0
  255. package/registry/skills/platform/sop_skillcreator.md +104 -0
  256. package/registry/skills/platform/sop_themefactory.md +128 -0
  257. package/registry/skills/platform/sop_webapptesting.md +75 -0
  258. package/registry/skills/platform/sop_webartifactsbuilder.md +97 -0
  259. package/registry/skills/platform/sop_xlsx.md +134 -0
  260. package/registry/skills.json +1055 -0
  261. package/scripts/discover-chats.sh +11 -0
  262. package/scripts/install-service-windows.ps1 +87 -0
  263. package/scripts/install-service.sh +52 -0
  264. package/scripts/seed-registry.ts +195 -0
  265. package/scripts/test-send.sh +5 -0
  266. package/scripts/tray-indicator.ps1 +35 -0
  267. package/scripts/uninstall-service-windows.ps1 +23 -0
  268. package/scripts/uninstall-service.sh +15 -0
  269. package/scripts/xbar-myagent.5s.sh +32 -0
  270. package/server/mcp-server/dist/index.d.ts +11 -0
  271. package/server/mcp-server/dist/index.js +1332 -0
  272. package/server/mcp-server/dist/lib/api-client.d.ts +165 -0
  273. package/server/mcp-server/dist/lib/api-client.js +241 -0
  274. package/server/mcp-server/index.ts +1545 -0
  275. package/server/mcp-server/lib/api-client.ts +366 -0
  276. package/server/mcp-server/tsconfig.json +14 -0
  277. package/src/agent-registry.ts +180 -0
  278. package/src/channels/discord.ts +129 -0
  279. package/src/channels/imessage.ts +261 -0
  280. package/src/channels/slack.ts +208 -0
  281. package/src/channels/telegram.ts +307 -0
  282. package/src/channels/types.ts +62 -0
  283. package/src/channels/whatsapp.ts +227 -0
  284. package/src/config.ts +281 -0
  285. package/src/cron.ts +43 -0
  286. package/src/decrypt-keys.ts +60 -0
  287. package/src/encrypt-keys.ts +70 -0
  288. package/src/executor.ts +2190 -0
  289. package/src/gemini-executor.ts +212 -0
  290. package/src/goals.ts +240 -0
  291. package/src/gym/activity-digest.ts +546 -0
  292. package/src/gym/dimension-scorer.ts +297 -0
  293. package/src/gym/gym-router.ts +801 -0
  294. package/src/gym/index.ts +19 -0
  295. package/src/heartbeat.ts +220 -0
  296. package/src/index.ts +275 -0
  297. package/src/keystore.ts +190 -0
  298. package/src/logger.ts +51 -0
  299. package/src/memory/daily.ts +101 -0
  300. package/src/memory/embeddings.ts +185 -0
  301. package/src/memory/index.ts +218 -0
  302. package/src/memory/search.ts +124 -0
  303. package/src/memory/store.ts +189 -0
  304. package/src/ollama-executor.ts +126 -0
  305. package/src/openai-executor.ts +259 -0
  306. package/src/router.ts +230 -0
  307. package/src/test-message.ts +72 -0
  308. package/src/utils/imsg-db-reader.ts +109 -0
  309. package/src/utils/imsg-rpc.ts +178 -0
  310. package/src/utils/message-formatter.ts +90 -0
  311. package/src/web-ui.ts +5778 -0
  312. package/src/whatsapp-chats.ts +91 -0
  313. package/src/whatsapp-login.ts +110 -0
  314. package/src/wiki-sync.ts +199 -0
  315. 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)?