@rubytech/create-maxy 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 (181) hide show
  1. package/dist/index.js +428 -0
  2. package/package.json +31 -0
  3. package/payload/maxy/.env.example +12 -0
  4. package/payload/maxy/app/admin/components/ActivityTimeline.tsx +348 -0
  5. package/payload/maxy/app/admin/components/MarkdownMessage.tsx +40 -0
  6. package/payload/maxy/app/api/admin/chat/route.ts +72 -0
  7. package/payload/maxy/app/api/admin/logs/route.ts +40 -0
  8. package/payload/maxy/app/api/admin/session/route.ts +74 -0
  9. package/payload/maxy/app/api/chat/route.ts +72 -0
  10. package/payload/maxy/app/api/health/route.ts +26 -0
  11. package/payload/maxy/app/api/onboarding/claude-auth/route.ts +216 -0
  12. package/payload/maxy/app/api/onboarding/set-pin/route.ts +44 -0
  13. package/payload/maxy/app/api/session/route.ts +51 -0
  14. package/payload/maxy/app/api/telegram/webhook/route.ts +107 -0
  15. package/payload/maxy/app/apple-icon.png +0 -0
  16. package/payload/maxy/app/bot/page.tsx +373 -0
  17. package/payload/maxy/app/favicon.ico +0 -0
  18. package/payload/maxy/app/globals.css +1681 -0
  19. package/payload/maxy/app/layout.tsx +58 -0
  20. package/payload/maxy/app/lib/claude-agent.ts +503 -0
  21. package/payload/maxy/app/og/layout.tsx +15 -0
  22. package/payload/maxy/app/og/page.tsx +252 -0
  23. package/payload/maxy/app/page.tsx +594 -0
  24. package/payload/maxy/app/privacy/page.tsx +72 -0
  25. package/payload/maxy/app/public/page.tsx +266 -0
  26. package/payload/maxy/next.config.mjs +26 -0
  27. package/payload/maxy/package-lock.json +2198 -0
  28. package/payload/maxy/package.json +25 -0
  29. package/payload/maxy/proxy.ts +41 -0
  30. package/payload/maxy/public/brand/claude.png +0 -0
  31. package/payload/maxy/public/brand/maxy-black.png +0 -0
  32. package/payload/maxy/public/brand/maxy.png +0 -0
  33. package/payload/maxy/public/favicon.ico +0 -0
  34. package/payload/maxy/public/og-landscape.png +0 -0
  35. package/payload/maxy/public/og-portrait.png +0 -0
  36. package/payload/maxy/public/og-square.png +0 -0
  37. package/payload/maxy/public/pi-5.jpg +0 -0
  38. package/payload/maxy/public/robots.txt +5 -0
  39. package/payload/maxy/tsconfig.json +41 -0
  40. package/payload/maxy/tsconfig.tsbuildinfo +1 -0
  41. package/payload/maxy/ui.md +28 -0
  42. package/payload/platform/config/cloudflared.yml +17 -0
  43. package/payload/platform/knowledge/maxy.md +161 -0
  44. package/payload/platform/neo4j/schema.cypher +108 -0
  45. package/payload/platform/package-lock.json +1835 -0
  46. package/payload/platform/package.json +17 -0
  47. package/payload/platform/plugins/admin/PLUGIN.md +24 -0
  48. package/payload/platform/plugins/admin/hooks/pre-tool-use.sh +56 -0
  49. package/payload/platform/plugins/admin/hooks/session-start.sh +20 -0
  50. package/payload/platform/plugins/admin/mcp/dist/index.d.ts +2 -0
  51. package/payload/platform/plugins/admin/mcp/dist/index.d.ts.map +1 -0
  52. package/payload/platform/plugins/admin/mcp/dist/index.js +149 -0
  53. package/payload/platform/plugins/admin/mcp/dist/index.js.map +1 -0
  54. package/payload/platform/plugins/admin/mcp/package.json +18 -0
  55. package/payload/platform/plugins/anthropic/PLUGIN.md +30 -0
  56. package/payload/platform/plugins/anthropic/references/setup-guide.md +146 -0
  57. package/payload/platform/plugins/business-assistant/PLUGIN.md +46 -0
  58. package/payload/platform/plugins/business-assistant/references/crm.md +112 -0
  59. package/payload/platform/plugins/business-assistant/references/document-management.md +96 -0
  60. package/payload/platform/plugins/business-assistant/references/escalation.md +126 -0
  61. package/payload/platform/plugins/business-assistant/references/invoicing.md +163 -0
  62. package/payload/platform/plugins/business-assistant/references/quoting.md +56 -0
  63. package/payload/platform/plugins/business-assistant/references/scheduling.md +127 -0
  64. package/payload/platform/plugins/cloudflare/PLUGIN.md +31 -0
  65. package/payload/platform/plugins/cloudflare/mcp/dist/index.d.ts +2 -0
  66. package/payload/platform/plugins/cloudflare/mcp/dist/index.d.ts.map +1 -0
  67. package/payload/platform/plugins/cloudflare/mcp/dist/index.js +174 -0
  68. package/payload/platform/plugins/cloudflare/mcp/dist/index.js.map +1 -0
  69. package/payload/platform/plugins/cloudflare/mcp/dist/lib/cloudflared.d.ts +45 -0
  70. package/payload/platform/plugins/cloudflare/mcp/dist/lib/cloudflared.d.ts.map +1 -0
  71. package/payload/platform/plugins/cloudflare/mcp/dist/lib/cloudflared.js +256 -0
  72. package/payload/platform/plugins/cloudflare/mcp/dist/lib/cloudflared.js.map +1 -0
  73. package/payload/platform/plugins/cloudflare/mcp/package.json +18 -0
  74. package/payload/platform/plugins/cloudflare/references/setup-guide.md +110 -0
  75. package/payload/platform/plugins/contacts/PLUGIN.md +18 -0
  76. package/payload/platform/plugins/contacts/mcp/dist/index.d.ts +2 -0
  77. package/payload/platform/plugins/contacts/mcp/dist/index.d.ts.map +1 -0
  78. package/payload/platform/plugins/contacts/mcp/dist/index.js +182 -0
  79. package/payload/platform/plugins/contacts/mcp/dist/index.js.map +1 -0
  80. package/payload/platform/plugins/contacts/mcp/dist/lib/neo4j.d.ts +5 -0
  81. package/payload/platform/plugins/contacts/mcp/dist/lib/neo4j.d.ts.map +1 -0
  82. package/payload/platform/plugins/contacts/mcp/dist/lib/neo4j.js +34 -0
  83. package/payload/platform/plugins/contacts/mcp/dist/lib/neo4j.js.map +1 -0
  84. package/payload/platform/plugins/contacts/mcp/dist/tools/contact-create.d.ts +19 -0
  85. package/payload/platform/plugins/contacts/mcp/dist/tools/contact-create.d.ts.map +1 -0
  86. package/payload/platform/plugins/contacts/mcp/dist/tools/contact-create.js +68 -0
  87. package/payload/platform/plugins/contacts/mcp/dist/tools/contact-create.js.map +1 -0
  88. package/payload/platform/plugins/contacts/mcp/dist/tools/contact-list.d.ts +22 -0
  89. package/payload/platform/plugins/contacts/mcp/dist/tools/contact-list.d.ts.map +1 -0
  90. package/payload/platform/plugins/contacts/mcp/dist/tools/contact-list.js +46 -0
  91. package/payload/platform/plugins/contacts/mcp/dist/tools/contact-list.js.map +1 -0
  92. package/payload/platform/plugins/contacts/mcp/dist/tools/contact-lookup.d.ts +20 -0
  93. package/payload/platform/plugins/contacts/mcp/dist/tools/contact-lookup.d.ts.map +1 -0
  94. package/payload/platform/plugins/contacts/mcp/dist/tools/contact-lookup.js +56 -0
  95. package/payload/platform/plugins/contacts/mcp/dist/tools/contact-lookup.js.map +1 -0
  96. package/payload/platform/plugins/contacts/mcp/dist/tools/contact-update.d.ts +13 -0
  97. package/payload/platform/plugins/contacts/mcp/dist/tools/contact-update.d.ts.map +1 -0
  98. package/payload/platform/plugins/contacts/mcp/dist/tools/contact-update.js +54 -0
  99. package/payload/platform/plugins/contacts/mcp/dist/tools/contact-update.js.map +1 -0
  100. package/payload/platform/plugins/contacts/mcp/package.json +19 -0
  101. package/payload/platform/plugins/documents/PLUGIN.md +12 -0
  102. package/payload/platform/plugins/documents/mcp/dist/index.d.ts +2 -0
  103. package/payload/platform/plugins/documents/mcp/dist/index.d.ts.map +1 -0
  104. package/payload/platform/plugins/documents/mcp/dist/index.js +82 -0
  105. package/payload/platform/plugins/documents/mcp/dist/index.js.map +1 -0
  106. package/payload/platform/plugins/documents/mcp/package.json +20 -0
  107. package/payload/platform/plugins/memory/PLUGIN.md +17 -0
  108. package/payload/platform/plugins/memory/mcp/dist/index.d.ts +2 -0
  109. package/payload/platform/plugins/memory/mcp/dist/index.d.ts.map +1 -0
  110. package/payload/platform/plugins/memory/mcp/dist/index.js +164 -0
  111. package/payload/platform/plugins/memory/mcp/dist/index.js.map +1 -0
  112. package/payload/platform/plugins/memory/mcp/dist/lib/embeddings.d.ts +3 -0
  113. package/payload/platform/plugins/memory/mcp/dist/lib/embeddings.d.ts.map +1 -0
  114. package/payload/platform/plugins/memory/mcp/dist/lib/embeddings.js +29 -0
  115. package/payload/platform/plugins/memory/mcp/dist/lib/embeddings.js.map +1 -0
  116. package/payload/platform/plugins/memory/mcp/dist/lib/neo4j.d.ts +5 -0
  117. package/payload/platform/plugins/memory/mcp/dist/lib/neo4j.d.ts.map +1 -0
  118. package/payload/platform/plugins/memory/mcp/dist/lib/neo4j.js +34 -0
  119. package/payload/platform/plugins/memory/mcp/dist/lib/neo4j.js.map +1 -0
  120. package/payload/platform/plugins/memory/mcp/dist/tools/memory-reindex.d.ts +8 -0
  121. package/payload/platform/plugins/memory/mcp/dist/tools/memory-reindex.d.ts.map +1 -0
  122. package/payload/platform/plugins/memory/mcp/dist/tools/memory-reindex.js +71 -0
  123. package/payload/platform/plugins/memory/mcp/dist/tools/memory-reindex.js.map +1 -0
  124. package/payload/platform/plugins/memory/mcp/dist/tools/memory-search.d.ts +24 -0
  125. package/payload/platform/plugins/memory/mcp/dist/tools/memory-search.d.ts.map +1 -0
  126. package/payload/platform/plugins/memory/mcp/dist/tools/memory-search.js +125 -0
  127. package/payload/platform/plugins/memory/mcp/dist/tools/memory-search.js.map +1 -0
  128. package/payload/platform/plugins/memory/mcp/dist/tools/memory-write.d.ts +18 -0
  129. package/payload/platform/plugins/memory/mcp/dist/tools/memory-write.d.ts.map +1 -0
  130. package/payload/platform/plugins/memory/mcp/dist/tools/memory-write.js +56 -0
  131. package/payload/platform/plugins/memory/mcp/dist/tools/memory-write.js.map +1 -0
  132. package/payload/platform/plugins/memory/mcp/package.json +19 -0
  133. package/payload/platform/plugins/sales/PLUGIN.md +65 -0
  134. package/payload/platform/plugins/sales/references/close-tracking.md +76 -0
  135. package/payload/platform/plugins/sales/references/closing-framework.md +108 -0
  136. package/payload/platform/plugins/sales/references/comparisons.md +99 -0
  137. package/payload/platform/plugins/sales/references/competitive-positioning.md +51 -0
  138. package/payload/platform/plugins/sales/references/faq.md +62 -0
  139. package/payload/platform/plugins/sales/references/objection-handling.md +157 -0
  140. package/payload/platform/plugins/sales/references/pricing.md +71 -0
  141. package/payload/platform/plugins/sales/references/waitlist.md +23 -0
  142. package/payload/platform/plugins/scheduling/PLUGIN.md +12 -0
  143. package/payload/platform/plugins/scheduling/mcp/dist/index.d.ts +2 -0
  144. package/payload/platform/plugins/scheduling/mcp/dist/index.d.ts.map +1 -0
  145. package/payload/platform/plugins/scheduling/mcp/dist/index.js +13 -0
  146. package/payload/platform/plugins/scheduling/mcp/dist/index.js.map +1 -0
  147. package/payload/platform/plugins/scheduling/mcp/package.json +18 -0
  148. package/payload/platform/plugins/telegram/PLUGIN.md +31 -0
  149. package/payload/platform/plugins/telegram/mcp/dist/index.d.ts +2 -0
  150. package/payload/platform/plugins/telegram/mcp/dist/index.d.ts.map +1 -0
  151. package/payload/platform/plugins/telegram/mcp/dist/index.js +101 -0
  152. package/payload/platform/plugins/telegram/mcp/dist/index.js.map +1 -0
  153. package/payload/platform/plugins/telegram/mcp/dist/lib/telegram.d.ts +27 -0
  154. package/payload/platform/plugins/telegram/mcp/dist/lib/telegram.d.ts.map +1 -0
  155. package/payload/platform/plugins/telegram/mcp/dist/lib/telegram.js +41 -0
  156. package/payload/platform/plugins/telegram/mcp/dist/lib/telegram.js.map +1 -0
  157. package/payload/platform/plugins/telegram/mcp/dist/tools/message-history.d.ts +16 -0
  158. package/payload/platform/plugins/telegram/mcp/dist/tools/message-history.d.ts.map +1 -0
  159. package/payload/platform/plugins/telegram/mcp/dist/tools/message-history.js +62 -0
  160. package/payload/platform/plugins/telegram/mcp/dist/tools/message-history.js.map +1 -0
  161. package/payload/platform/plugins/telegram/mcp/dist/tools/message.d.ts +20 -0
  162. package/payload/platform/plugins/telegram/mcp/dist/tools/message.d.ts.map +1 -0
  163. package/payload/platform/plugins/telegram/mcp/dist/tools/message.js +34 -0
  164. package/payload/platform/plugins/telegram/mcp/dist/tools/message.js.map +1 -0
  165. package/payload/platform/plugins/telegram/mcp/package.json +19 -0
  166. package/payload/platform/plugins/telegram/references/setup-guide.md +50 -0
  167. package/payload/platform/plugins/web/PLUGIN.md +12 -0
  168. package/payload/platform/plugins/web/mcp/dist/index.d.ts +2 -0
  169. package/payload/platform/plugins/web/mcp/dist/index.d.ts.map +1 -0
  170. package/payload/platform/plugins/web/mcp/dist/index.js +12 -0
  171. package/payload/platform/plugins/web/mcp/dist/index.js.map +1 -0
  172. package/payload/platform/plugins/web/mcp/package.json +18 -0
  173. package/payload/platform/scripts/seed-neo4j.sh +73 -0
  174. package/payload/platform/scripts/setup.sh +177 -0
  175. package/payload/platform/scripts/start.sh +62 -0
  176. package/payload/platform/templates/account.json +4 -0
  177. package/payload/platform/templates/agents/admin/IDENTITY.md +28 -0
  178. package/payload/platform/templates/agents/admin/SOUL.md +1 -0
  179. package/payload/platform/templates/agents/public/IDENTITY.md +21 -0
  180. package/payload/platform/templates/agents/public/SOUL.md +1 -0
  181. package/payload/platform/tsconfig.base.json +18 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message.d.ts","sourceRoot":"","sources":["../../src/tools/message.ts"],"names":[],"mappings":"AAEA,UAAU,aAAa;IACrB,OAAO,EAAE,UAAU,CAAC;IACpB,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,GAAG,UAAU,GAAG,YAAY,CAAC;IAC/C,cAAc,CAAC,EAAE,KAAK,CACpB,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,YAAY,CAAC,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAC7D,CAAC;CACH;AAED,UAAU,aAAa;IACrB,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAsB,OAAO,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC,CAoC3E"}
@@ -0,0 +1,34 @@
1
+ import { sendMessage } from "../lib/telegram.js";
2
+ export async function message(params) {
3
+ const botToken = process.env.TELEGRAM_PUBLIC_BOT_TOKEN;
4
+ if (!botToken) {
5
+ return {
6
+ sent: false,
7
+ channel: params.channel,
8
+ error: "TELEGRAM_PUBLIC_BOT_TOKEN not configured",
9
+ };
10
+ }
11
+ let replyMarkup;
12
+ if (params.inlineKeyboard) {
13
+ replyMarkup = {
14
+ inline_keyboard: params.inlineKeyboard.map((row) => row.map((btn) => ({
15
+ text: btn.text,
16
+ callback_data: btn.callbackData,
17
+ url: btn.url,
18
+ }))),
19
+ };
20
+ }
21
+ const result = await sendMessage(botToken, {
22
+ chatId: params.chatId,
23
+ text: params.text,
24
+ parseMode: params.parseMode,
25
+ replyMarkup,
26
+ });
27
+ return {
28
+ sent: result.ok,
29
+ channel: "telegram",
30
+ messageId: result.messageId,
31
+ error: result.error,
32
+ };
33
+ }
34
+ //# sourceMappingURL=message.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message.js","sourceRoot":"","sources":["../../src/tools/message.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAA+B,MAAM,oBAAoB,CAAC;AAmB9E,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,MAAqB;IACjD,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC;IACvD,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO;YACL,IAAI,EAAE,KAAK;YACX,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,KAAK,EAAE,0CAA0C;SAClD,CAAC;IACJ,CAAC;IAED,IAAI,WAA+C,CAAC;IACpD,IAAI,MAAM,CAAC,cAAc,EAAE,CAAC;QAC1B,WAAW,GAAG;YACZ,eAAe,EAAE,MAAM,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CACjD,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;gBAChB,IAAI,EAAE,GAAG,CAAC,IAAI;gBACd,aAAa,EAAE,GAAG,CAAC,YAAY;gBAC/B,GAAG,EAAE,GAAG,CAAC,GAAG;aACb,CAAC,CAAC,CACJ;SACF,CAAC;IACJ,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,QAAQ,EAAE;QACzC,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,WAAW;KACZ,CAAC,CAAC;IAEH,OAAO;QACL,IAAI,EAAE,MAAM,CAAC,EAAE;QACf,OAAO,EAAE,UAAU;QACnB,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,KAAK,EAAE,MAAM,CAAC,KAAK;KACpB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,19 @@
1
+ {
2
+ "name": "@maxy/messaging",
3
+ "version": "0.1.0",
4
+ "private": true,
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "scripts": {
8
+ "build": "tsc",
9
+ "start": "node dist/index.js"
10
+ },
11
+ "dependencies": {
12
+ "@modelcontextprotocol/sdk": "^1.12.1",
13
+ "neo4j-driver": "^5.28.1"
14
+ },
15
+ "devDependencies": {
16
+ "typescript": "^5.7.0",
17
+ "@types/node": "^22.0.0"
18
+ }
19
+ }
@@ -0,0 +1,50 @@
1
+ # Telegram Setup Guide
2
+
3
+ ## Creating a Bot
4
+
5
+ 1. Open Telegram and search for **@BotFather**
6
+ 2. Start a chat and send `/newbot`
7
+ 3. Follow the prompts — choose a display name and a username (must end in `bot`)
8
+ 4. BotFather replies with a **bot token** (a long string like `123456:ABC-DEF...`)
9
+ 5. Copy the token — you'll paste it into Taskmaster's Setup page
10
+
11
+ ## Connecting the Bot to Taskmaster
12
+
13
+ 1. Open the Taskmaster control panel (Setup page)
14
+ 2. Find the **Telegram** row and click **Connect** (or open settings if already connected)
15
+ 3. Paste the bot token from BotFather
16
+ 4. The system probes the token to verify it — you'll see the bot's username confirmed
17
+ 5. Choose whether this is an **admin bot** or a **public bot** (see below)
18
+ 6. If it's a public bot, choose a DM policy (who can message it)
19
+ 7. Click **Save & Connect**
20
+
21
+ ## Admin Bot vs Public Bot
22
+
23
+ Each Telegram bot has an **Admin routing** toggle:
24
+
25
+ - **Admin bot** (toggle ON): Only users with admin bindings can message this bot. Everyone else is silently denied. Messages route to the admin agent. No DM policy applies — it's admin-only by design.
26
+ - **Public bot** (toggle OFF): DM policy applies to everyone equally, including admins. Messages route to the public agent. Use this for customer-facing bots.
27
+
28
+ A common setup is two bots: one admin bot for the business owner, one public bot for customers.
29
+
30
+ ## Finding Your Telegram User ID
31
+
32
+ Admin bindings require your **numeric Telegram user ID** — not your username. Usernames can be changed or claimed by someone else, so they are not safe for admin access.
33
+
34
+ To find your user ID:
35
+
36
+ 1. Open Telegram and search for **@userinfobot**
37
+ 2. Start the chat and send `/start`
38
+ 3. The bot instantly replies with your numeric ID (e.g. `123456789`), plus your name and language
39
+ 4. Use this numeric ID when setting up admin bindings
40
+
41
+ ## DM Policy Options (Public Bots Only)
42
+
43
+ | Policy | Behaviour |
44
+ |--------|-----------|
45
+ | **Respond to everyone** | Any Telegram user can message the bot and get a response |
46
+ | **Require approval** | Unknown senders receive a pairing code; an admin must approve them |
47
+ | **Whitelist only** | Only users in the allowlist can message the bot |
48
+ | **Disabled** | The bot ignores all DMs |
49
+
50
+ "Require approval" (pairing) is the default and recommended for most setups — it lets you control who talks to the bot without pre-configuring an allowlist.
@@ -0,0 +1,12 @@
1
+ ---
2
+ name: web
3
+ description: "Web plugin. Provides web search and browsing tools. Phase 1 — stub implementation."
4
+ icon: 🌐
5
+ tools: []
6
+ always: false
7
+ embed: false
8
+ ---
9
+
10
+ # Web
11
+
12
+ Web search and browsing. Phase 1 stub — not yet implemented.
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
@@ -0,0 +1,12 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
3
+ import { z } from "zod";
4
+ const server = new McpServer({
5
+ name: "maxy-web",
6
+ version: "0.1.0",
7
+ });
8
+ server.tool("web-search", "Search the web using multiple providers (Tavily, Brave, Perplexity)", { query: z.string(), provider: z.enum(["tavily", "brave", "perplexity"]).optional() }, async () => ({ content: [{ type: "text", text: "Web search is not available in Phase 0. This capability will be added in Phase 1." }] }));
9
+ server.tool("web-fetch", "Fetch and extract content from a URL", { url: z.string() }, async () => ({ content: [{ type: "text", text: "Web fetching is not available in Phase 0. This capability will be added in Phase 1." }] }));
10
+ const transport = new StdioServerTransport();
11
+ await server.connect(transport);
12
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;IAC3B,IAAI,EAAE,UAAU;IAChB,OAAO,EAAE,OAAO;CACjB,CAAC,CAAC;AAEH,MAAM,CAAC,IAAI,CACT,YAAY,EACZ,qEAAqE,EACrE,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC,QAAQ,EAAE,EAAE,EACrF,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,mFAAmF,EAAE,CAAC,EAAE,CAAC,CAClJ,CAAC;AAEF,MAAM,CAAC,IAAI,CACT,WAAW,EACX,sCAAsC,EACtC,EAAE,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,EACnB,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,qFAAqF,EAAE,CAAC,EAAE,CAAC,CACpJ,CAAC;AAEF,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;AAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC"}
@@ -0,0 +1,18 @@
1
+ {
2
+ "name": "@maxy/web",
3
+ "version": "0.1.0",
4
+ "private": true,
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "scripts": {
8
+ "build": "tsc",
9
+ "start": "node dist/index.js"
10
+ },
11
+ "dependencies": {
12
+ "@modelcontextprotocol/sdk": "^1.12.1"
13
+ },
14
+ "devDependencies": {
15
+ "typescript": "^5.7.0",
16
+ "@types/node": "^22.0.0"
17
+ }
18
+ }
@@ -0,0 +1,73 @@
1
+ #!/usr/bin/env bash
2
+ # ============================================================
3
+ # seed-neo4j.sh — Phase 0 setup
4
+ # Creates the account from templates and applies Neo4j schema.
5
+ # Product knowledge is ingested post-installation via the admin
6
+ # agent, not seeded as cypher.
7
+ # ============================================================
8
+
9
+ set -euo pipefail
10
+
11
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
12
+ PROJECT_DIR="$(dirname "$SCRIPT_DIR")"
13
+ TEMPLATES_DIR="$PROJECT_DIR/templates"
14
+ ACCOUNTS_DIR="$PROJECT_DIR/config/accounts"
15
+ NEO4J_DIR="$PROJECT_DIR/neo4j"
16
+
17
+ NEO4J_URI="${NEO4J_URI:-bolt://localhost:7687}"
18
+ NEO4J_USER="${NEO4J_USER:-neo4j}"
19
+
20
+ # Read password from the file created during setup
21
+ NEO4J_PASSWORD_FILE="$PROJECT_DIR/config/.neo4j-password"
22
+ if [ -n "${NEO4J_PASSWORD:-}" ]; then
23
+ : # Explicit env var takes precedence
24
+ elif [ -f "$NEO4J_PASSWORD_FILE" ]; then
25
+ NEO4J_PASSWORD=$(cat "$NEO4J_PASSWORD_FILE")
26
+ else
27
+ echo "Error: Neo4j password not found."
28
+ echo " Expected at: $NEO4J_PASSWORD_FILE"
29
+ echo " Or set NEO4J_PASSWORD environment variable."
30
+ exit 1
31
+ fi
32
+
33
+ CYPHER_SHELL="cypher-shell"
34
+
35
+ # ------------------------------------------------------------------
36
+ # 1. Create Phase 0 account from templates
37
+ # ------------------------------------------------------------------
38
+ ACCOUNT_ID="phase0-maxy"
39
+ ACCOUNT_DIR="$ACCOUNTS_DIR/$ACCOUNT_ID"
40
+
41
+ # Create account directory if it doesn't exist
42
+ mkdir -p "$ACCOUNT_DIR/agents/admin" "$ACCOUNT_DIR/agents/public"
43
+
44
+ # Always overwrite IDENTITY.md — Rubytech-controlled, pure behaviour.
45
+ cp "$TEMPLATES_DIR/agents/admin/IDENTITY.md" "$ACCOUNT_DIR/agents/admin/IDENTITY.md"
46
+ cp "$TEMPLATES_DIR/agents/public/IDENTITY.md" "$ACCOUNT_DIR/agents/public/IDENTITY.md"
47
+
48
+ # SOUL.md — user-controlled personalisation. Only create if missing. Never overwrite.
49
+ [ -f "$ACCOUNT_DIR/agents/admin/SOUL.md" ] || cp "$TEMPLATES_DIR/agents/admin/SOUL.md" "$ACCOUNT_DIR/agents/admin/SOUL.md"
50
+ [ -f "$ACCOUNT_DIR/agents/public/SOUL.md" ] || cp "$TEMPLATES_DIR/agents/public/SOUL.md" "$ACCOUNT_DIR/agents/public/SOUL.md"
51
+
52
+ # Create account.json only if it doesn't exist (business config is in the graph)
53
+ if [ ! -f "$ACCOUNT_DIR/account.json" ]; then
54
+ echo '{"accountId":"phase0-maxy","tier":"solo"}' > "$ACCOUNT_DIR/account.json"
55
+ fi
56
+
57
+ echo " Account at $ACCOUNT_DIR"
58
+
59
+ # ------------------------------------------------------------------
60
+ # 2. Apply Neo4j schema (constraints + indexes only)
61
+ # ------------------------------------------------------------------
62
+ if ! command -v "$CYPHER_SHELL" &> /dev/null; then
63
+ echo "Error: cypher-shell not found. Install Neo4j or add cypher-shell to PATH."
64
+ exit 1
65
+ fi
66
+
67
+ echo "==> Connecting to Neo4j at $NEO4J_URI as $NEO4J_USER"
68
+
69
+ echo "==> Applying schema (constraints, indexes, vector indexes)..."
70
+ "$CYPHER_SHELL" -u "$NEO4J_USER" -p "$NEO4J_PASSWORD" -a "$NEO4J_URI" \
71
+ -f "$NEO4J_DIR/schema.cypher"
72
+
73
+ echo " Done."
@@ -0,0 +1,177 @@
1
+ #!/usr/bin/env bash
2
+ # Maxy Phase 0 — Pi Setup Script
3
+ # Run on a fresh Raspberry Pi 5 (16GB) with Raspberry Pi OS (64-bit)
4
+ #
5
+ # Usage: curl -fsSL https://raw.githubusercontent.com/aeon-neo/getmaxy/main/platform/scripts/setup.sh | bash
6
+ # or: git clone git@github.com:aeon-neo/getmaxy.git && cd getmaxy && bash platform/scripts/setup.sh
7
+
8
+ set -euo pipefail
9
+
10
+ REPO_URL="https://github.com/aeon-neo/getmaxy.git"
11
+ INSTALL_DIR="$HOME/maxy"
12
+
13
+ echo "================================================================"
14
+ echo " Maxy Phase 0 — Setup"
15
+ echo " AI for Productive People."
16
+ echo "================================================================"
17
+ echo ""
18
+
19
+ # ------------------------------------------------------------------
20
+ # 1. System dependencies + hostname + Avahi (mDNS)
21
+ # ------------------------------------------------------------------
22
+ echo "[1/8] Updating system packages and configuring network..."
23
+ sudo apt-get update -qq
24
+ sudo apt-get install -y -qq curl git unzip avahi-daemon avahi-utils
25
+
26
+ # Set hostname to 'maxy' so device is reachable at maxy.local
27
+ CURRENT_HOSTNAME=$(hostname)
28
+ if [ "$CURRENT_HOSTNAME" != "maxy" ]; then
29
+ echo " Setting hostname to 'maxy' (was '$CURRENT_HOSTNAME')..."
30
+ sudo hostnamectl set-hostname maxy
31
+ # Update /etc/hosts
32
+ sudo sed -i "s/127\.0\.1\.1.*$/127.0.1.1\tmaxy/" /etc/hosts
33
+ fi
34
+
35
+ # Create Avahi service file for LAN discovery
36
+ sudo tee /etc/avahi/services/maxy.service > /dev/null <<AVAHI
37
+ <?xml version="1.0" standalone='no'?>
38
+ <!DOCTYPE service-group SYSTEM "avahi-service.dtd">
39
+ <service-group>
40
+ <name replace-wildcards="yes">Maxy on %h</name>
41
+ <service>
42
+ <type>_http._tcp</type>
43
+ <port>19200</port>
44
+ <txt-record>role=maxy</txt-record>
45
+ <txt-record>path=/</txt-record>
46
+ </service>
47
+ </service-group>
48
+ AVAHI
49
+
50
+ # Ensure Avahi is running
51
+ sudo systemctl enable avahi-daemon
52
+ sudo systemctl restart avahi-daemon
53
+ echo " Device reachable at http://maxy.local:19200"
54
+
55
+ # ------------------------------------------------------------------
56
+ # 2. Node.js 20+
57
+ # ------------------------------------------------------------------
58
+ if command -v node &>/dev/null && [[ "$(node -v | cut -d. -f1 | tr -d v)" -ge 20 ]]; then
59
+ echo "[2/8] Node.js $(node -v) already installed."
60
+ else
61
+ echo "[2/8] Installing Node.js 22..."
62
+ curl -fsSL https://deb.nodesource.com/setup_22.x | sudo -E bash -
63
+ sudo apt-get install -y -qq nodejs
64
+ fi
65
+
66
+ # ------------------------------------------------------------------
67
+ # 3. Neo4j Community Edition 5.x
68
+ # ------------------------------------------------------------------
69
+ if command -v neo4j &>/dev/null; then
70
+ echo "[3/8] Neo4j already installed."
71
+ else
72
+ echo "[3/8] Installing Neo4j Community Edition 5..."
73
+
74
+ # Neo4j 5.x requires Java 17+
75
+ if ! java -version 2>&1 | grep -q '"17\.\|"21\.\|"22\.\|"23\.'; then
76
+ echo " Installing OpenJDK 17..."
77
+ sudo apt-get install -y -qq openjdk-17-jre-headless
78
+ fi
79
+
80
+ # Add Neo4j repository
81
+ curl -fsSL https://debian.neo4j.com/neotechnology.gpg.key | sudo gpg --yes --dearmor -o /usr/share/keyrings/neo4j.gpg 2>/dev/null
82
+ echo "deb [signed-by=/usr/share/keyrings/neo4j.gpg] https://debian.neo4j.com stable 5" | sudo tee /etc/apt/sources.list.d/neo4j.list
83
+ sudo apt-get update -qq
84
+ sudo apt-get install -y -qq neo4j
85
+
86
+ # Configure Neo4j for local use
87
+ sudo sed -i 's/#server.default_listen_address=0.0.0.0/server.default_listen_address=127.0.0.1/' /etc/neo4j/neo4j.conf
88
+
89
+ # Generate a strong random password and store it
90
+ NEO4J_GENERATED_PASSWORD=$(openssl rand -base64 32 | tr -d '/+=' | head -c 32)
91
+ mkdir -p "$INSTALL_DIR/platform/config"
92
+ echo "$NEO4J_GENERATED_PASSWORD" > "$INSTALL_DIR/platform/config/.neo4j-password"
93
+ chmod 600 "$INSTALL_DIR/platform/config/.neo4j-password"
94
+ sudo neo4j-admin dbms set-initial-password "$NEO4J_GENERATED_PASSWORD"
95
+
96
+ # Start and enable
97
+ sudo systemctl enable neo4j
98
+ sudo systemctl start neo4j
99
+ echo " Neo4j started. Password stored in platform/config/.neo4j-password"
100
+ fi
101
+
102
+ # ------------------------------------------------------------------
103
+ # 4. Ollama (local embeddings)
104
+ # ------------------------------------------------------------------
105
+ if command -v ollama &>/dev/null; then
106
+ echo "[4/8] Ollama already installed."
107
+ else
108
+ echo "[4/8] Installing Ollama..."
109
+ curl -fsSL https://ollama.ai/install.sh | sh
110
+ fi
111
+
112
+ # Pull the embedding model
113
+ echo " Pulling nomic-embed-text model (~300MB)..."
114
+ ollama pull nomic-embed-text
115
+
116
+ # ------------------------------------------------------------------
117
+ # 5. Cloudflared (Cloudflare Tunnel)
118
+ # ------------------------------------------------------------------
119
+ if command -v cloudflared &>/dev/null; then
120
+ echo "[5/8] Cloudflared already installed."
121
+ else
122
+ echo "[5/8] Installing cloudflared..."
123
+ curl -fsSL https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-arm64.deb -o /tmp/cloudflared.deb
124
+ sudo dpkg -i /tmp/cloudflared.deb
125
+ rm /tmp/cloudflared.deb
126
+ fi
127
+
128
+ # ------------------------------------------------------------------
129
+ # 6. Clone or update Maxy
130
+ # ------------------------------------------------------------------
131
+ if [ -d "$INSTALL_DIR/.git" ]; then
132
+ echo "[6/8] Updating Maxy..."
133
+ cd "$INSTALL_DIR"
134
+ git pull --ff-only
135
+ else
136
+ echo "[6/8] Cloning Maxy..."
137
+ git clone "$REPO_URL" "$INSTALL_DIR"
138
+ cd "$INSTALL_DIR"
139
+ fi
140
+
141
+ # ------------------------------------------------------------------
142
+ # 7. Install dependencies and build
143
+ # ------------------------------------------------------------------
144
+ echo "[7/8] Installing dependencies and building..."
145
+
146
+ # Platform MCP servers
147
+ cd "$INSTALL_DIR/platform"
148
+ npm install --quiet
149
+ npm run build
150
+
151
+ # Web app
152
+ cd "$INSTALL_DIR/maxy"
153
+ npm install --quiet
154
+ npm run build
155
+
156
+ # ------------------------------------------------------------------
157
+ # 8. Create account and apply schema
158
+ # ------------------------------------------------------------------
159
+ cd "$INSTALL_DIR"
160
+ if [ ! -f "$INSTALL_DIR/.seeded" ]; then
161
+ echo "[8/8] Creating account and applying schema..."
162
+ bash platform/scripts/seed-neo4j.sh
163
+ touch "$INSTALL_DIR/.seeded"
164
+ fi
165
+
166
+ # ------------------------------------------------------------------
167
+ # Done
168
+ # ------------------------------------------------------------------
169
+ echo ""
170
+ echo "================================================================"
171
+ echo " Maxy is installed."
172
+ echo ""
173
+ echo " Open in your browser:"
174
+ echo " http://maxy.local:19200"
175
+ echo ""
176
+ echo " Everything from here happens through conversation."
177
+ echo "================================================================"
@@ -0,0 +1,62 @@
1
+ #!/usr/bin/env bash
2
+ # Maxy Phase 0 — Start all services
3
+ # Usage: bash platform/scripts/start.sh
4
+
5
+ set -euo pipefail
6
+
7
+ INSTALL_DIR="$(cd "$(dirname "$0")/../.." && pwd)"
8
+
9
+ echo "Starting Maxy..."
10
+
11
+ # ------------------------------------------------------------------
12
+ # 1. Check Neo4j
13
+ # ------------------------------------------------------------------
14
+ if systemctl is-active --quiet neo4j 2>/dev/null; then
15
+ echo " Neo4j: running"
16
+ else
17
+ echo " Neo4j: starting..."
18
+ sudo systemctl start neo4j
19
+ sleep 3
20
+ fi
21
+
22
+ # ------------------------------------------------------------------
23
+ # 2. Check Ollama
24
+ # ------------------------------------------------------------------
25
+ if curl -sf http://localhost:11434/api/tags >/dev/null 2>&1; then
26
+ echo " Ollama: running"
27
+ else
28
+ echo " Ollama: starting..."
29
+ ollama serve &
30
+ sleep 2
31
+ fi
32
+
33
+ # ------------------------------------------------------------------
34
+ # 3. Start the web app on 0.0.0.0:19200
35
+ # ------------------------------------------------------------------
36
+ echo " Web app: starting on port 19200..."
37
+ cd "$INSTALL_DIR/maxy"
38
+
39
+ if [ -f .env.local ]; then
40
+ set -a
41
+ . .env.local
42
+ set +a
43
+ fi
44
+
45
+ npm start &
46
+ WEB_PID=$!
47
+
48
+ # ------------------------------------------------------------------
49
+ # Ready
50
+ # ------------------------------------------------------------------
51
+ echo ""
52
+ echo "Maxy is running."
53
+ echo " Local: http://maxy.local:19200"
54
+ echo ""
55
+ echo " Everything from here happens through conversation."
56
+ echo " Cloudflare Tunnel, Telegram, and all configuration"
57
+ echo " are set up via the admin agent."
58
+ echo ""
59
+ echo "Press Ctrl+C to stop."
60
+
61
+ trap "kill $WEB_PID 2>/dev/null; exit 0" INT TERM
62
+ wait $WEB_PID
@@ -0,0 +1,4 @@
1
+ {
2
+ "accountId": "",
3
+ "tier": ""
4
+ }
@@ -0,0 +1,28 @@
1
+ # Head of Operations
2
+
3
+ You are the head of operations. Not an assistant waiting for instructions — a proactive operator who drives the business forward.
4
+
5
+ At the start of every session, check the graph for business context. Your goal is to populate the graph efficiently and comprehensively to maximise value from business intelligence.
6
+
7
+ Your personalisation is in SOUL.md. Read it and apply it.
8
+
9
+ ## Boundaries
10
+
11
+ - You are an AI. State this clearly if asked. Never impersonate a human.
12
+ - You have full access to all platform tools and systems.
13
+ - Professional, direct, action-oriented. Concise and precise. British English unless SOUL.md specifies otherwise.
14
+ - Do not use emoji characters in any response. Plain text and punctuation only.
15
+
16
+ ## Behaviour
17
+
18
+ - Be proactive. Identify what needs doing and do it. Don't wait to be asked.
19
+ - On session start, assess the state of the business from the graph and report what needs attention.
20
+ - On first setup (incomplete business data in graph), immediately begin onboarding: learn the business, understand the stage, gather customer details, build a comprehensive picture so you can drive operations forward - one step at a time.
21
+ - Write personalisation to your own SOUL.md. Also write the public agent's personalisation to agents/public/SOUL.md.
22
+ - Think strategically. Help with planning, not just tasks.
23
+ - Surface problems before they become urgent. Recommend actions based on what you know.
24
+ - Store everything you learn about the business in the graph — not in files.
25
+
26
+ ## Plugins
27
+
28
+ Your behaviour is defined by your loaded plugins. Follow them.
@@ -0,0 +1,21 @@
1
+ # Public Agent
2
+
3
+ You are a public-facing agent. Check the graph for business context at the start of every session.
4
+
5
+ Your personalisation is in SOUL.md. Read it and apply it.
6
+ SOUL.md is written and maintained by the admin agent. You cannot write it.
7
+
8
+ ## Boundaries
9
+
10
+ - You are an AI assistant. State this clearly if asked. Never impersonate a human.
11
+ - You are completely read-only. You cannot create, modify, or delete any data.
12
+ - Your tools are memory-search and plugin-read. Use memory-search before every response.
13
+ - You answer ONLY from memory-search results. If the answer is not in the results, say you don't know.
14
+ - You must NEVER use your training data to answer questions. No general knowledge. No improvising.
15
+ - You must NEVER speak about topics outside your explicit scope. Decline all other requests.
16
+ - You cannot spawn subagents, access files, run commands, or browse the web.
17
+ - British English unless SOUL.md specifies otherwise. Conversational tone.
18
+
19
+ ## Plugins
20
+
21
+ Your behaviour is defined by your loaded plugins. Follow them.
@@ -0,0 +1,18 @@
1
+ {
2
+ "compilerOptions": {
3
+ "target": "ES2022",
4
+ "module": "Node16",
5
+ "moduleResolution": "Node16",
6
+ "lib": ["ES2022"],
7
+ "outDir": "dist",
8
+ "rootDir": "src",
9
+ "strict": true,
10
+ "esModuleInterop": true,
11
+ "skipLibCheck": true,
12
+ "forceConsistentCasingInFileNames": true,
13
+ "resolveJsonModule": true,
14
+ "declaration": true,
15
+ "declarationMap": true,
16
+ "sourceMap": true
17
+ }
18
+ }