@rubytech/create-realagent 1.0.429 → 1.0.430

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 (37) hide show
  1. package/package.json +3 -3
  2. package/payload/maxy/package.json +1 -1
  3. package/payload/maxy/public/brand/demo-9pm-enquiry.svg +95 -0
  4. package/payload/maxy/public/brand/demo-create-agent.svg +110 -0
  5. package/payload/maxy/public/brand/demo-morning-briefing.svg +83 -0
  6. package/payload/maxy/public/brand/demo-post-viewing.svg +107 -0
  7. package/payload/maxy/public/brand/how-it-works.svg +152 -0
  8. package/payload/maxy/public/brand/realagent-favicon-dark-32.png +0 -0
  9. package/payload/maxy/public/brand/realagent-icon-dark-round-web.png +0 -0
  10. package/payload/maxy/public/brand/realagent-icon-dark-web.png +0 -0
  11. package/payload/maxy/public/brand/realagent-icon-web.png +0 -0
  12. package/payload/maxy/public/brand-constants.json +6 -6
  13. package/payload/maxy/public/brand-defaults.css +5 -5
  14. package/payload/maxy/public/index.html +1 -1
  15. package/payload/maxy/public/public.html +1 -1
  16. package/payload/platform/config/brand.json +22 -20
  17. package/payload/platform/scripts/vnc.sh +5 -0
  18. package/payload/maxy/public/brand/favicon.ico +0 -0
  19. package/payload/platform/plugins/telegram/PLUGIN.md +0 -34
  20. package/payload/platform/plugins/telegram/mcp/dist/index.d.ts +0 -2
  21. package/payload/platform/plugins/telegram/mcp/dist/index.d.ts.map +0 -1
  22. package/payload/platform/plugins/telegram/mcp/dist/index.js +0 -101
  23. package/payload/platform/plugins/telegram/mcp/dist/index.js.map +0 -1
  24. package/payload/platform/plugins/telegram/mcp/dist/lib/telegram.d.ts +0 -27
  25. package/payload/platform/plugins/telegram/mcp/dist/lib/telegram.d.ts.map +0 -1
  26. package/payload/platform/plugins/telegram/mcp/dist/lib/telegram.js +0 -41
  27. package/payload/platform/plugins/telegram/mcp/dist/lib/telegram.js.map +0 -1
  28. package/payload/platform/plugins/telegram/mcp/dist/tools/message-history.d.ts +0 -16
  29. package/payload/platform/plugins/telegram/mcp/dist/tools/message-history.d.ts.map +0 -1
  30. package/payload/platform/plugins/telegram/mcp/dist/tools/message-history.js +0 -62
  31. package/payload/platform/plugins/telegram/mcp/dist/tools/message-history.js.map +0 -1
  32. package/payload/platform/plugins/telegram/mcp/dist/tools/message.d.ts +0 -20
  33. package/payload/platform/plugins/telegram/mcp/dist/tools/message.d.ts.map +0 -1
  34. package/payload/platform/plugins/telegram/mcp/dist/tools/message.js +0 -34
  35. package/payload/platform/plugins/telegram/mcp/dist/tools/message.js.map +0 -1
  36. package/payload/platform/plugins/telegram/mcp/package.json +0 -19
  37. package/payload/platform/plugins/telegram/references/setup-guide.md +0 -50
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@rubytech/create-realagent",
3
- "version": "1.0.429",
4
- "description": "Install MaxyAI for Productive People",
3
+ "version": "1.0.430",
4
+ "description": "Install Real Agent Built for agents. By agents.",
5
5
  "bin": {
6
6
  "create-realagent": "./dist/index.js"
7
7
  },
@@ -16,7 +16,7 @@
16
16
  "payload"
17
17
  ],
18
18
  "keywords": [
19
- "maxy",
19
+ "realagent",
20
20
  "ai",
21
21
  "assistant",
22
22
  "raspberry-pi",
@@ -1,5 +1,5 @@
1
1
  {
2
- "name": "maxy-server-deps",
2
+ "name": "realagent-server-deps",
3
3
  "private": true,
4
4
  "type": "module",
5
5
  "dependencies": {
@@ -0,0 +1,95 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 800 460">
2
+ <defs>
3
+ <style>
4
+ .bg { fill: #FAFAF8; }
5
+ .title { font-family: 'Georgia', 'Times New Roman', serif; font-size: 20px; font-weight: 700; fill: #2A2F2B; }
6
+ .scene-label { font-family: Inter, -apple-system, BlinkMacSystemFont, Helvetica, Arial, sans-serif; font-size: 10px; font-weight: 600; fill: #B87333; letter-spacing: 1px; }
7
+ .time { font-family: Inter, -apple-system, BlinkMacSystemFont, Helvetica, Arial, sans-serif; font-size: 28px; font-weight: 700; fill: #2A2F2B; }
8
+ .body { font-family: Inter, -apple-system, BlinkMacSystemFont, Helvetica, Arial, sans-serif; font-size: 12px; fill: #3A3E3B; line-height: 1.5; }
9
+ .body-muted { font-family: Inter, -apple-system, BlinkMacSystemFont, Helvetica, Arial, sans-serif; font-size: 11px; fill: #8B8A85; }
10
+ .body-bold { font-family: Inter, -apple-system, BlinkMacSystemFont, Helvetica, Arial, sans-serif; font-size: 12px; font-weight: 600; fill: #2A2F2B; }
11
+ .chat-agent { font-family: Inter, -apple-system, BlinkMacSystemFont, Helvetica, Arial, sans-serif; font-size: 11px; fill: #3A3E3B; }
12
+ .chat-label { font-family: Inter, -apple-system, BlinkMacSystemFont, Helvetica, Arial, sans-serif; font-size: 9px; font-weight: 600; fill: #7C8C72; }
13
+ .outcome-text { font-family: 'Georgia', 'Times New Roman', serif; font-size: 14px; font-weight: 700; fill: #5A6B52; }
14
+ .footer { font-family: Inter, -apple-system, BlinkMacSystemFont, Helvetica, Arial, sans-serif; font-size: 10px; fill: #B0A9A1; }
15
+ </style>
16
+ </defs>
17
+
18
+ <rect class="bg" width="800" height="460" rx="12"/>
19
+
20
+ <!-- Header -->
21
+ <text class="scene-label" x="400" y="28" text-anchor="middle">REAL AGENT IN ACTION</text>
22
+ <text class="title" x="400" y="54" text-anchor="middle">The 9pm Enquiry</text>
23
+ <line x1="340" y1="64" x2="460" y2="64" stroke="#B87333" stroke-width="2"/>
24
+
25
+ <!-- Three-panel layout -->
26
+
27
+ <!-- Panel 1: Before (the problem) -->
28
+ <rect x="30" y="86" width="230" height="300" rx="10" fill="#FFF5F5" stroke="#E8DDD3" stroke-width="1"/>
29
+ <text class="scene-label" x="145" y="108" text-anchor="middle" fill="#CC6666">WITHOUT REAL AGENT</text>
30
+ <text class="time" x="145" y="148" text-anchor="middle">9:14 pm</text>
31
+ <text class="body" x="145" y="172" text-anchor="middle">A buyer enquiry arrives</text>
32
+ <text class="body" x="145" y="188" text-anchor="middle">from Rightmove.</text>
33
+
34
+ <!-- Phone icon (sleeping — Lucide Moon) -->
35
+ <rect x="108" y="206" width="74" height="44" rx="8" fill="#E8DDD3"/>
36
+ <g transform="translate(133,216) scale(0.75)" fill="none" stroke="#8B8A85" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M12 3a6 6 0 0 0 9 9 9 9 0 1 1-9-9Z"/></g>
37
+
38
+ <text class="body-muted" x="145" y="272" text-anchor="middle">You don't see it until</text>
39
+ <text class="body-muted" x="145" y="286" text-anchor="middle">8am the next morning.</text>
40
+
41
+ <text class="body-bold" x="145" y="316" text-anchor="middle" fill="#CC6666">By then, they've called</text>
42
+ <text class="body-bold" x="145" y="332" text-anchor="middle" fill="#CC6666">your competitor.</text>
43
+
44
+ <!-- Panel 2: Real Agent acts -->
45
+ <rect x="280" y="86" width="230" height="300" rx="10" fill="#F5F8F4" stroke="#7C8C72" stroke-width="1.5"/>
46
+ <text class="scene-label" x="395" y="108" text-anchor="middle">REAL AGENT RESPONDS</text>
47
+ <text class="time" x="395" y="148" text-anchor="middle">9:14 pm</text>
48
+ <text class="body" x="395" y="172" text-anchor="middle">Same enquiry arrives.</text>
49
+ <text class="body" x="395" y="188" text-anchor="middle">Real Agent is awake.</text>
50
+
51
+ <!-- Chat simulation -->
52
+ <rect x="300" y="204" width="190" height="28" rx="6" fill="#7C8C72" opacity="0.12"/>
53
+ <text class="chat-label" x="310" y="215">REAL AGENT</text>
54
+ <text class="chat-agent" x="310" y="226">Hi Sarah, thanks for your</text>
55
+
56
+ <rect x="300" y="238" width="190" height="28" rx="6" fill="#7C8C72" opacity="0.12"/>
57
+ <text class="chat-agent" x="310" y="249">enquiry on 14 Elm Street.</text>
58
+ <text class="chat-agent" x="310" y="260">When suits you for a viewing?</text>
59
+
60
+ <rect x="300" y="272" width="190" height="28" rx="6" fill="#F3EDE5"/>
61
+ <text class="chat-label" x="310" y="283" fill="#B87333">SARAH</text>
62
+ <text class="chat-agent" x="310" y="294">Saturday 10am would be great</text>
63
+
64
+ <rect x="300" y="306" width="190" height="28" rx="6" fill="#7C8C72" opacity="0.12"/>
65
+ <text class="chat-label" x="310" y="317">REAL AGENT</text>
66
+ <text class="chat-agent" x="310" y="328">Booked. Confirmation sent.</text>
67
+
68
+ <text class="body-muted" x="395" y="358" text-anchor="middle">Qualified, confirmed,</text>
69
+ <text class="body-muted" x="395" y="372" text-anchor="middle">booked — in 4 minutes.</text>
70
+
71
+ <!-- Panel 3: Outcome (next morning) -->
72
+ <rect x="530" y="86" width="230" height="300" rx="10" fill="#FEFEFE" stroke="#E8DDD3" stroke-width="1"/>
73
+ <text class="scene-label" x="645" y="108" text-anchor="middle">NEXT MORNING, 8AM</text>
74
+ <text class="time" x="645" y="148" text-anchor="middle">8:00 am</text>
75
+ <text class="body" x="645" y="172" text-anchor="middle">Your morning briefing</text>
76
+ <text class="body" x="645" y="188" text-anchor="middle">is already waiting:</text>
77
+
78
+ <!-- Briefing card -->
79
+ <rect x="555" y="204" width="180" height="112" rx="8" fill="#F3EDE5"/>
80
+ <text x="565" y="222" font-family="Inter, sans-serif" font-size="10" font-weight="600" fill="#7C8C72">BRIEFING</text>
81
+ <text x="565" y="240" font-family="Inter, sans-serif" font-size="10.5" fill="#3A3E3B">&#x2713; Sarah booked for 14 Elm</text>
82
+ <text x="575" y="254" font-family="Inter, sans-serif" font-size="10.5" fill="#3A3E3B">Street, Sat 10am</text>
83
+ <text x="565" y="272" font-family="Inter, sans-serif" font-size="10.5" fill="#3A3E3B">&#x2713; 2 more viewings today</text>
84
+ <text x="565" y="290" font-family="Inter, sans-serif" font-size="10.5" fill="#3A3E3B">&#x2713; Vendor report for Oak</text>
85
+ <text x="575" y="304" font-family="Inter, sans-serif" font-size="10.5" fill="#3A3E3B">Lane ready to review</text>
86
+
87
+ <text class="body-bold" x="645" y="340" text-anchor="middle" fill="#5A6B52">You attend a warm</text>
88
+ <text class="body-bold" x="645" y="356" text-anchor="middle" fill="#5A6B52">appointment on Saturday.</text>
89
+
90
+ <!-- Bottom bar -->
91
+ <rect x="30" y="400" width="740" height="36" rx="8" fill="#7C8C72" opacity="0.08"/>
92
+ <text class="outcome-text" x="400" y="423" text-anchor="middle">Real Agent works while you sleep. You never miss a lead.</text>
93
+
94
+ <text class="footer" x="400" y="452" text-anchor="middle">Real Agent — Built for agents. By agents.</text>
95
+ </svg>
@@ -0,0 +1,110 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 800 500">
2
+ <defs>
3
+ <style>
4
+ .bg { fill: #FAFAF8; }
5
+ .title { font-family: 'Georgia', 'Times New Roman', serif; font-size: 20px; font-weight: 700; fill: #2A2F2B; }
6
+ .scene-label { font-family: Inter, -apple-system, BlinkMacSystemFont, Helvetica, Arial, sans-serif; font-size: 10px; font-weight: 600; fill: #B87333; letter-spacing: 1px; }
7
+ .body { font-family: Inter, -apple-system, BlinkMacSystemFont, Helvetica, Arial, sans-serif; font-size: 12px; fill: #3A3E3B; }
8
+ .body-muted { font-family: Inter, -apple-system, BlinkMacSystemFont, Helvetica, Arial, sans-serif; font-size: 11px; fill: #8B8A85; }
9
+ .body-bold { font-family: Inter, -apple-system, BlinkMacSystemFont, Helvetica, Arial, sans-serif; font-size: 12px; font-weight: 600; fill: #2A2F2B; }
10
+ .chat-bubble-user { fill: #F3EDE5; }
11
+ .chat-bubble-agent { fill: #7C8C72; opacity: 0.12; }
12
+ .chat-text { font-family: Inter, -apple-system, BlinkMacSystemFont, Helvetica, Arial, sans-serif; font-size: 11px; fill: #3A3E3B; }
13
+ .chat-label-user { font-family: Inter, -apple-system, BlinkMacSystemFont, Helvetica, Arial, sans-serif; font-size: 9px; font-weight: 600; fill: #B87333; }
14
+ .chat-label-agent { font-family: Inter, -apple-system, BlinkMacSystemFont, Helvetica, Arial, sans-serif; font-size: 9px; font-weight: 600; fill: #7C8C72; }
15
+ .agent-card-title { font-family: Inter, -apple-system, BlinkMacSystemFont, Helvetica, Arial, sans-serif; font-size: 11px; font-weight: 600; fill: #2A2F2B; }
16
+ .agent-card-detail { font-family: Inter, -apple-system, BlinkMacSystemFont, Helvetica, Arial, sans-serif; font-size: 10px; fill: #8B8A85; }
17
+ .agent-card-tag { font-family: Inter, -apple-system, BlinkMacSystemFont, Helvetica, Arial, sans-serif; font-size: 9px; font-weight: 600; }
18
+ .outcome-text { font-family: 'Georgia', 'Times New Roman', serif; font-size: 14px; font-weight: 700; fill: #5A6B52; }
19
+ .footer { font-family: Inter, -apple-system, BlinkMacSystemFont, Helvetica, Arial, sans-serif; font-size: 10px; fill: #B0A9A1; }
20
+ </style>
21
+ </defs>
22
+
23
+ <rect class="bg" width="800" height="500" rx="12"/>
24
+
25
+ <!-- Header -->
26
+ <text class="scene-label" x="400" y="28" text-anchor="middle">REAL AGENT IN ACTION</text>
27
+ <text class="title" x="400" y="54" text-anchor="middle">Creating a Specialist Agent</text>
28
+ <line x1="300" y1="64" x2="500" y2="64" stroke="#B87333" stroke-width="2"/>
29
+ <text class="body-muted" x="400" y="82" text-anchor="middle">One conversation with your admin agent. No technical setup. No code.</text>
30
+
31
+ <!-- Left side: Conversation -->
32
+ <rect x="40" y="100" width="380" height="340" rx="10" fill="#FEFEFE" stroke="#E8DDD3" stroke-width="1"/>
33
+ <text class="scene-label" x="230" y="122" text-anchor="middle">THE CONVERSATION</text>
34
+
35
+ <!-- Chat message 1: User -->
36
+ <rect x="60" y="136" width="280" height="32" rx="6" class="chat-bubble-user"/>
37
+ <text class="chat-label-user" x="72" y="149">YOU</text>
38
+ <text class="chat-text" x="72" y="162">I need a sales progression agent for the</text>
39
+
40
+ <rect x="60" y="172" width="280" height="20" rx="6" class="chat-bubble-user"/>
41
+ <text class="chat-text" x="72" y="186">Harrison deal. Buyer, seller, both solicitors.</text>
42
+
43
+ <!-- Chat message 2: Agent -->
44
+ <rect x="60" y="200" width="340" height="32" rx="6" fill="#7C8C72" opacity="0.1"/>
45
+ <text class="chat-label-agent" x="72" y="213">REAL AGENT</text>
46
+ <text class="chat-text" x="72" y="226">I'll create a gated agent for the Harrison chain.</text>
47
+
48
+ <rect x="60" y="236" width="340" height="32" rx="6" fill="#7C8C72" opacity="0.1"/>
49
+ <text class="chat-text" x="72" y="249">Access for: buyer, seller, both solicitors.</text>
50
+ <text class="chat-text" x="72" y="262">It'll know the full chain status and chase weekly.</text>
51
+
52
+ <!-- Chat message 3: Agent confirms -->
53
+ <rect x="60" y="276" width="340" height="44" rx="6" fill="#7C8C72" opacity="0.1"/>
54
+ <text class="chat-label-agent" x="72" y="289">REAL AGENT</text>
55
+ <text class="chat-text" x="72" y="302">Done. "Harrison Sale Progression" is live.</text>
56
+ <text class="chat-text" x="72" y="314">Invitations sent. Each party has their own login.</text>
57
+
58
+ <!-- Chat message 4: User -->
59
+ <rect x="60" y="328" width="280" height="20" rx="6" class="chat-bubble-user"/>
60
+ <text class="chat-label-user" x="72" y="341">YOU</text>
61
+
62
+ <rect x="60" y="352" width="280" height="20" rx="6" class="chat-bubble-user"/>
63
+ <text class="chat-text" x="72" y="366">What can they ask it?</text>
64
+
65
+ <!-- Chat message 5: Agent -->
66
+ <rect x="60" y="380" width="340" height="44" rx="6" fill="#7C8C72" opacity="0.1"/>
67
+ <text class="chat-label-agent" x="72" y="393">REAL AGENT</text>
68
+ <text class="chat-text" x="72" y="406">Chain status, completion timeline, next steps,</text>
69
+ <text class="chat-text" x="72" y="418">outstanding actions. 24/7. No phone tag.</text>
70
+
71
+ <!-- Right side: What was created -->
72
+ <rect x="440" y="100" width="320" height="340" rx="10" fill="#F5F8F4" stroke="#7C8C72" stroke-width="1"/>
73
+ <text class="scene-label" x="600" y="122" text-anchor="middle">WHAT WAS CREATED</text>
74
+
75
+ <!-- Agent card -->
76
+ <rect x="460" y="140" width="280" height="80" rx="8" fill="#FEFEFE" stroke="#E8DDD3" stroke-width="1"/>
77
+ <circle cx="486" cy="168" r="14" fill="#7C8C72"/>
78
+ <text x="486" y="173" text-anchor="middle" font-family="Inter, sans-serif" font-size="12" fill="#FEFEFE" font-weight="700">H</text>
79
+ <text class="agent-card-title" x="508" y="164">Harrison Sale Progression</text>
80
+ <text class="agent-card-detail" x="508" y="178">Specialist public agent</text>
81
+ <!-- Tags -->
82
+ <rect x="508" y="190" width="52" height="18" rx="4" fill="#7C8C72" opacity="0.12"/>
83
+ <text class="agent-card-tag" x="534" y="202" text-anchor="middle" fill="#5A6B52">GATED</text>
84
+ <rect x="566" y="190" width="42" height="18" rx="4" fill="#B87333" opacity="0.12"/>
85
+ <text class="agent-card-tag" x="587" y="202" text-anchor="middle" fill="#B87333">LIVE</text>
86
+
87
+ <!-- Access list -->
88
+ <text x="460" y="244" font-family="Inter, sans-serif" font-size="10" font-weight="600" fill="#7C8C72">ACCESS GRANTED TO</text>
89
+ <text class="agent-card-detail" x="460" y="262">&#x2713; James Harrison (buyer)</text>
90
+ <text class="agent-card-detail" x="460" y="278">&#x2713; Margaret Ellis (seller)</text>
91
+ <text class="agent-card-detail" x="460" y="294">&#x2713; Taylor &amp; Co Solicitors (buyer)</text>
92
+ <text class="agent-card-detail" x="460" y="310">&#x2713; Marsh Legal (seller)</text>
93
+
94
+ <!-- Capabilities -->
95
+ <text x="460" y="336" font-family="Inter, sans-serif" font-size="10" font-weight="600" fill="#7C8C72">KNOWS</text>
96
+ <text class="agent-card-detail" x="460" y="354">Full chain status, agreed price, survey dates,</text>
97
+ <text class="agent-card-detail" x="460" y="368">solicitor contacts, outstanding actions.</text>
98
+ <text class="agent-card-detail" x="460" y="386">Chases solicitors weekly by email.</text>
99
+ <text class="agent-card-detail" x="460" y="400">Answers questions from any party, 24/7.</text>
100
+
101
+ <!-- Other examples -->
102
+ <text x="460" y="422" font-family="Inter, sans-serif" font-size="9" fill="#B0A9A1">Other agents you could create: lead response,</text>
103
+ <text x="460" y="434" font-family="Inter, sans-serif" font-size="9" fill="#B0A9A1">viewing booking, vendor updates, lettings...</text>
104
+
105
+ <!-- Bottom bar -->
106
+ <rect x="40" y="452" width="720" height="18" rx="4" fill="#7C8C72" opacity="0.08"/>
107
+ <text class="outcome-text" x="400" y="465" text-anchor="middle" font-size="12">Not one chatbot. An AI team you deploy wherever they create value.</text>
108
+
109
+ <text class="footer" x="400" y="492" text-anchor="middle">Real Agent — Built for agents. By agents.</text>
110
+ </svg>
@@ -0,0 +1,83 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 800 480">
2
+ <defs>
3
+ <style>
4
+ .bg { fill: #FAFAF8; }
5
+ .title { font-family: 'Georgia', 'Times New Roman', serif; font-size: 20px; font-weight: 700; fill: #2A2F2B; }
6
+ .scene-label { font-family: Inter, -apple-system, BlinkMacSystemFont, Helvetica, Arial, sans-serif; font-size: 10px; font-weight: 600; fill: #B87333; letter-spacing: 1px; }
7
+ .time { font-family: Inter, -apple-system, BlinkMacSystemFont, Helvetica, Arial, sans-serif; font-size: 24px; font-weight: 700; fill: #2A2F2B; }
8
+ .body { font-family: Inter, -apple-system, BlinkMacSystemFont, Helvetica, Arial, sans-serif; font-size: 12px; fill: #3A3E3B; }
9
+ .body-muted { font-family: Inter, -apple-system, BlinkMacSystemFont, Helvetica, Arial, sans-serif; font-size: 11px; fill: #8B8A85; }
10
+ .body-bold { font-family: Inter, -apple-system, BlinkMacSystemFont, Helvetica, Arial, sans-serif; font-size: 12px; font-weight: 600; fill: #2A2F2B; }
11
+ .card-title { font-family: Inter, -apple-system, BlinkMacSystemFont, Helvetica, Arial, sans-serif; font-size: 10px; font-weight: 600; fill: #7C8C72; letter-spacing: 0.5px; }
12
+ .card-item { font-family: Inter, -apple-system, BlinkMacSystemFont, Helvetica, Arial, sans-serif; font-size: 11px; fill: #3A3E3B; }
13
+ .card-detail { font-family: Inter, -apple-system, BlinkMacSystemFont, Helvetica, Arial, sans-serif; font-size: 10px; fill: #8B8A85; }
14
+ .outcome-text { font-family: 'Georgia', 'Times New Roman', serif; font-size: 14px; font-weight: 700; fill: #5A6B52; }
15
+ .footer { font-family: Inter, -apple-system, BlinkMacSystemFont, Helvetica, Arial, sans-serif; font-size: 10px; fill: #B0A9A1; }
16
+ .check { fill: #7C8C72; font-size: 11px; }
17
+ .priority { fill: #B87333; font-size: 10px; font-weight: 600; }
18
+ </style>
19
+ </defs>
20
+
21
+ <rect class="bg" width="800" height="480" rx="12"/>
22
+
23
+ <!-- Header -->
24
+ <text class="scene-label" x="400" y="28" text-anchor="middle">REAL AGENT IN ACTION</text>
25
+ <text class="title" x="400" y="54" text-anchor="middle">The Morning Briefing</text>
26
+ <line x1="330" y1="64" x2="470" y2="64" stroke="#B87333" stroke-width="2"/>
27
+
28
+ <!-- Time + intro -->
29
+ <text class="time" x="400" y="100" text-anchor="middle">8:00 am — You open your laptop</text>
30
+ <text class="body-muted" x="400" y="118" text-anchor="middle">Everything is already prepared. You focus on decisions, not assembly.</text>
31
+
32
+ <!-- Card grid: 2x2 -->
33
+
34
+ <!-- Card 1: Today's Schedule -->
35
+ <rect x="40" y="140" width="350" height="120" rx="10" fill="#F5F8F4" stroke="#7C8C72" stroke-width="1"/>
36
+ <text class="card-title" x="56" y="162">TODAY'S SCHEDULE</text>
37
+ <text class="check" x="56" y="182">&#x2713;</text>
38
+ <text class="card-item" x="72" y="182">3 viewings — all confirmations sent</text>
39
+ <text class="check" x="56" y="200">&#x2713;</text>
40
+ <text class="card-item" x="72" y="200">1 valuation at 1pm — pack ready</text>
41
+ <text class="card-detail" x="80" y="214">Comparables, market analysis, pricing recommendation</text>
42
+ <text class="check" x="56" y="232">&#x2713;</text>
43
+ <text class="card-item" x="72" y="232">2pm vendor meeting — report pre-built</text>
44
+ <text class="card-detail" x="80" y="246">Portal stats, feedback summary, pricing context</text>
45
+
46
+ <!-- Card 2: Overnight Activity -->
47
+ <rect x="410" y="140" width="350" height="120" rx="10" fill="#FFF9F3" stroke="#D4A06A" stroke-width="1"/>
48
+ <text class="card-title" x="426" y="162" fill="#B87333">OVERNIGHT ACTIVITY</text>
49
+ <text class="priority" x="426" y="182">&#x25CF;</text>
50
+ <text class="card-item" x="440" y="182">Sarah enquired at 9:14pm — viewing booked</text>
51
+ <text class="card-detail" x="448" y="196">14 Elm Street, Saturday 10am. Qualified: mortgage agreed.</text>
52
+ <text class="priority" x="426" y="214">&#x25CF;</text>
53
+ <text class="card-item" x="440" y="214">Offer received on 7 Oak Lane — details below</text>
54
+ <text class="card-detail" x="448" y="228">Buyer: James P. Offer: 425k (asking: 450k). Chain-free.</text>
55
+ <text class="card-item" x="440" y="248" fill="#8B8A85">3 portal enquiries handled, 1 callback scheduled</text>
56
+
57
+ <!-- Card 3: Prospecting Call List -->
58
+ <rect x="40" y="276" width="350" height="110" rx="10" fill="#FEFEFE" stroke="#E8DDD3" stroke-width="1"/>
59
+ <text class="card-title" x="56" y="298">PROSPECTING — RANKED WITH REASONING</text>
60
+ <text class="card-item" x="56" y="318">1. Sarah Williams — viewed twice, positive feedback,</text>
61
+ <text class="card-detail" x="68" y="332">solicitor search suggests ready to move. Call first.</text>
62
+ <text class="card-item" x="56" y="352">2. The Petersons — 3 comparable sales this month avg.</text>
63
+ <text class="card-detail" x="68" y="366">8% above their original valuation. Good re-approach.</text>
64
+ <text class="card-item" x="56" y="378" fill="#8B8A85">3. David Chen — tenancy ends 8 weeks. Worth a call.</text>
65
+
66
+ <!-- Card 4: Already Done -->
67
+ <rect x="410" y="276" width="350" height="110" rx="10" fill="#F3EDE5" stroke="#E8DDD3" stroke-width="1"/>
68
+ <text class="card-title" x="426" y="298">ALREADY DONE FOR YOU</text>
69
+ <text class="check" x="426" y="318">&#x2713;</text>
70
+ <text class="card-item" x="442" y="318">Vendor reports pre-generated (Sunday evening)</text>
71
+ <text class="check" x="426" y="338">&#x2713;</text>
72
+ <text class="card-item" x="442" y="338">Solicitor chases sent (sales progression)</text>
73
+ <text class="check" x="426" y="358">&#x2713;</text>
74
+ <text class="card-item" x="442" y="358">CRM updated from Friday's conversations</text>
75
+ <text class="check" x="426" y="378">&#x2713;</text>
76
+ <text class="card-item" x="442" y="378">Prospect letters drafted and ready to send</text>
77
+
78
+ <!-- Bottom bar -->
79
+ <rect x="40" y="402" width="720" height="36" rx="8" fill="#7C8C72" opacity="0.08"/>
80
+ <text class="outcome-text" x="400" y="425" text-anchor="middle">Monday morning: hot prospects, not admin. You start selling at 8:01.</text>
81
+
82
+ <text class="footer" x="400" y="468" text-anchor="middle">Real Agent — Built for agents. By agents.</text>
83
+ </svg>
@@ -0,0 +1,107 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 800 500">
2
+ <defs>
3
+ <style>
4
+ .bg { fill: #FAFAF8; }
5
+ .title { font-family: 'Georgia', 'Times New Roman', serif; font-size: 20px; font-weight: 700; fill: #2A2F2B; }
6
+ .scene-label { font-family: Inter, -apple-system, BlinkMacSystemFont, Helvetica, Arial, sans-serif; font-size: 10px; font-weight: 600; fill: #B87333; letter-spacing: 1px; }
7
+ .body { font-family: Inter, -apple-system, BlinkMacSystemFont, Helvetica, Arial, sans-serif; font-size: 12px; fill: #3A3E3B; }
8
+ .body-muted { font-family: Inter, -apple-system, BlinkMacSystemFont, Helvetica, Arial, sans-serif; font-size: 11px; fill: #8B8A85; }
9
+ .body-bold { font-family: Inter, -apple-system, BlinkMacSystemFont, Helvetica, Arial, sans-serif; font-size: 12px; font-weight: 600; fill: #2A2F2B; }
10
+ .step-num { font-family: Inter, -apple-system, BlinkMacSystemFont, Helvetica, Arial, sans-serif; font-size: 12px; font-weight: 700; fill: #FEFEFE; }
11
+ .step-title { font-family: Inter, -apple-system, BlinkMacSystemFont, Helvetica, Arial, sans-serif; font-size: 12px; font-weight: 600; fill: #2A2F2B; }
12
+ .step-body { font-family: Inter, -apple-system, BlinkMacSystemFont, Helvetica, Arial, sans-serif; font-size: 10.5px; fill: #3A3E3B; }
13
+ .step-detail { font-family: Inter, -apple-system, BlinkMacSystemFont, Helvetica, Arial, sans-serif; font-size: 10px; fill: #8B8A85; }
14
+ .branch-label { font-family: Inter, -apple-system, BlinkMacSystemFont, Helvetica, Arial, sans-serif; font-size: 10px; font-weight: 600; fill: #7C8C72; }
15
+ .outcome-text { font-family: 'Georgia', 'Times New Roman', serif; font-size: 14px; font-weight: 700; fill: #5A6B52; }
16
+ .footer { font-family: Inter, -apple-system, BlinkMacSystemFont, Helvetica, Arial, sans-serif; font-size: 10px; fill: #B0A9A1; }
17
+ </style>
18
+ <marker id="arr" markerWidth="8" markerHeight="6" refX="7" refY="3" orient="auto">
19
+ <polygon points="0 0, 8 3, 0 6" fill="#B87333"/>
20
+ </marker>
21
+ <marker id="arr-sage" markerWidth="8" markerHeight="6" refX="7" refY="3" orient="auto">
22
+ <polygon points="0 0, 8 3, 0 6" fill="#7C8C72"/>
23
+ </marker>
24
+ </defs>
25
+
26
+ <rect class="bg" width="800" height="500" rx="12"/>
27
+
28
+ <!-- Header -->
29
+ <text class="scene-label" x="400" y="28" text-anchor="middle">REAL AGENT IN ACTION</text>
30
+ <text class="title" x="400" y="54" text-anchor="middle">Post-Viewing Feedback Workflow</text>
31
+ <line x1="290" y1="64" x2="510" y2="64" stroke="#B87333" stroke-width="2"/>
32
+ <text class="body-muted" x="400" y="82" text-anchor="middle">Saturday's viewings are done. The automated follow-up chain begins Sunday morning.</text>
33
+
34
+ <!-- Step 1: Prep -->
35
+ <circle cx="120" cy="128" r="16" fill="#7C8C72"/>
36
+ <text class="step-num" x="120" y="133" text-anchor="middle">1</text>
37
+ <text class="step-title" x="120" y="160" text-anchor="middle">AI Preps Your Brief</text>
38
+ <text class="step-detail" x="120" y="174" text-anchor="middle">Property details, buyer history,</text>
39
+ <text class="step-detail" x="120" y="186" text-anchor="middle">previous feedback compiled.</text>
40
+
41
+ <!-- Arrow 1→2 -->
42
+ <line x1="155" y1="128" x2="248" y2="128" stroke="#B87333" stroke-width="1.5" marker-end="url(#arr)"/>
43
+
44
+ <!-- Step 2: You call -->
45
+ <circle cx="290" cy="128" r="16" fill="#B87333"/>
46
+ <text class="step-num" x="290" y="133" text-anchor="middle">2</text>
47
+ <text class="step-title" x="290" y="160" text-anchor="middle">You Make the Call</text>
48
+ <text class="step-detail" x="290" y="174" text-anchor="middle">Personal, high-value work.</text>
49
+ <text class="step-detail" x="290" y="186" text-anchor="middle">This is what you do best.</text>
50
+
51
+ <!-- Arrow 2→branch -->
52
+ <line x1="325" y1="128" x2="418" y2="128" stroke="#B87333" stroke-width="1.5" marker-end="url(#arr)"/>
53
+
54
+ <!-- Step 3: Branch point -->
55
+ <circle cx="460" cy="128" r="16" fill="#7C8C72"/>
56
+ <text class="step-num" x="460" y="133" text-anchor="middle">3</text>
57
+ <text class="step-title" x="460" y="160" text-anchor="middle">AI Handles the Rest</text>
58
+ <text class="step-detail" x="460" y="174" text-anchor="middle">Based on what you heard,</text>
59
+ <text class="step-detail" x="460" y="186" text-anchor="middle">Real Agent takes over.</text>
60
+
61
+ <!-- Branch lines -->
62
+ <!-- Positive -->
63
+ <line x1="460" y1="200" x2="460" y2="224" stroke="#7C8C72" stroke-width="1.5"/>
64
+ <line x1="460" y1="224" x2="180" y2="224" stroke="#7C8C72" stroke-width="1.5"/>
65
+ <line x1="180" y1="224" x2="180" y2="244" stroke="#7C8C72" stroke-width="1.5" marker-end="url(#arr-sage)"/>
66
+
67
+ <!-- Negative -->
68
+ <line x1="460" y1="224" x2="460" y2="244" stroke="#7C8C72" stroke-width="1.5" marker-end="url(#arr-sage)"/>
69
+
70
+ <!-- No answer -->
71
+ <line x1="460" y1="224" x2="660" y2="224" stroke="#7C8C72" stroke-width="1.5"/>
72
+ <line x1="660" y1="224" x2="660" y2="244" stroke="#7C8C72" stroke-width="1.5" marker-end="url(#arr-sage)"/>
73
+
74
+ <!-- Branch A: Positive feedback -->
75
+ <rect x="60" y="248" width="240" height="110" rx="8" fill="#F0F7EE" stroke="#7C8C72" stroke-width="1"/>
76
+ <text class="branch-label" x="76" y="268">IF POSITIVE</text>
77
+ <text class="step-body" x="76" y="288">&#x2713; Vendor update drafted and sent</text>
78
+ <text class="step-body" x="76" y="306">&#x2713; Second viewing offered to buyer</text>
79
+ <text class="step-body" x="76" y="324">&#x2713; Offer invitation prepared</text>
80
+ <text class="step-detail" x="76" y="344">Pipeline status updated automatically.</text>
81
+
82
+ <!-- Branch B: Negative feedback -->
83
+ <rect x="320" y="248" width="240" height="110" rx="8" fill="#FFF9F3" stroke="#D4A06A" stroke-width="1"/>
84
+ <text class="branch-label" x="336" y="268" fill="#B87333">IF NEGATIVE</text>
85
+ <text class="step-body" x="336" y="288">&#x2713; Buyer requirements re-checked</text>
86
+ <text class="step-body" x="336" y="306">&#x2713; Alternative properties matched</text>
87
+ <text class="step-body" x="336" y="324">&#x2713; Alternatives sent to buyer</text>
88
+ <text class="step-detail" x="336" y="344">Vendor updated with honest feedback.</text>
89
+
90
+ <!-- Branch C: No answer -->
91
+ <rect x="580" y="248" width="180" height="110" rx="8" fill="#F3EDE5" stroke="#E8DDD3" stroke-width="1"/>
92
+ <text class="branch-label" x="596" y="268" fill="#8B8A85">IF NO ANSWER</text>
93
+ <text class="step-body" x="596" y="288">&#x2713; Email sent immediately</text>
94
+ <text class="step-body" x="596" y="306">&#x2713; Vendor notified: attempted</text>
95
+ <text class="step-body" x="596" y="324">&#x2713; Daily callback until contact</text>
96
+ <text class="step-detail" x="596" y="344">Feedback enforced before next</text>
97
+
98
+ <!-- Rule callout -->
99
+ <rect x="160" y="374" width="480" height="36" rx="6" fill="#B87333" opacity="0.08"/>
100
+ <text x="400" y="396" text-anchor="middle" font-family="Inter, sans-serif" font-size="11" font-weight="600" fill="#B87333">Rule: If that buyer books a new viewing, they must provide feedback on the last one first.</text>
101
+
102
+ <!-- Bottom bar -->
103
+ <rect x="40" y="424" width="720" height="36" rx="8" fill="#7C8C72" opacity="0.08"/>
104
+ <text class="outcome-text" x="400" y="447" text-anchor="middle">You make the phone call. Real Agent handles everything around it.</text>
105
+
106
+ <text class="footer" x="400" y="488" text-anchor="middle">Real Agent — Built for agents. By agents.</text>
107
+ </svg>
@@ -0,0 +1,152 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 800 540">
2
+ <defs>
3
+ <style>
4
+ .bg { fill: #FAFAF8; }
5
+ .title { font-family: 'Georgia', 'Times New Roman', serif; font-size: 22px; font-weight: 700; fill: #2A2F2B; }
6
+ .subtitle { font-family: Inter, -apple-system, BlinkMacSystemFont, Helvetica, Arial, sans-serif; font-size: 12px; fill: #8B8A85; letter-spacing: 0.5px; }
7
+ .step-num { font-family: Inter, -apple-system, BlinkMacSystemFont, Helvetica, Arial, sans-serif; font-size: 13px; font-weight: 700; fill: #FEFEFE; }
8
+ .step-label { font-family: Inter, -apple-system, BlinkMacSystemFont, Helvetica, Arial, sans-serif; font-size: 12.5px; font-weight: 600; fill: #2A2F2B; }
9
+ .step-desc { font-family: Inter, -apple-system, BlinkMacSystemFont, Helvetica, Arial, sans-serif; font-size: 10.5px; fill: #8B8A85; }
10
+ .ext-label { font-family: Inter, -apple-system, BlinkMacSystemFont, Helvetica, Arial, sans-serif; font-size: 11px; font-weight: 500; fill: #5A6B52; }
11
+ .ext-desc { font-family: Inter, -apple-system, BlinkMacSystemFont, Helvetica, Arial, sans-serif; font-size: 9.5px; fill: #8B8A85; }
12
+ .section-label { font-family: Inter, -apple-system, BlinkMacSystemFont, Helvetica, Arial, sans-serif; font-size: 10px; font-weight: 600; fill: #B87333; letter-spacing: 1px; text-transform: uppercase; }
13
+ .footer { font-family: Inter, -apple-system, BlinkMacSystemFont, Helvetica, Arial, sans-serif; font-size: 10px; fill: #B0A9A1; }
14
+ .sage { fill: #7C8C72; }
15
+ .sage-light { fill: #9AAD8F; }
16
+ .copper { fill: #B87333; }
17
+ .copper-light { fill: rgba(184, 115, 51, 0.12); }
18
+ .arrow { stroke: #B87333; stroke-width: 2; fill: none; marker-end: url(#arrowhead); }
19
+ .connector { stroke: #D4C9BC; stroke-width: 1.5; stroke-dasharray: 4 3; fill: none; }
20
+ </style>
21
+ <marker id="arrowhead" markerWidth="8" markerHeight="6" refX="7" refY="3" orient="auto">
22
+ <polygon points="0 0, 8 3, 0 6" fill="#B87333"/>
23
+ </marker>
24
+ </defs>
25
+
26
+ <!-- Background -->
27
+ <rect class="bg" width="800" height="540" rx="12"/>
28
+
29
+ <!-- Header -->
30
+ <text class="subtitle" x="400" y="32" text-anchor="middle">REAL AGENT</text>
31
+ <text class="title" x="400" y="58" text-anchor="middle">How It Works</text>
32
+ <line x1="360" y1="68" x2="440" y2="68" stroke="#B87333" stroke-width="2"/>
33
+
34
+ <!-- Section label: Core loop -->
35
+ <text class="section-label" x="40" y="100">THE CORE LOOP</text>
36
+
37
+ <!-- Step 1: Lead comes in -->
38
+ <circle cx="95" cy="150" r="18" class="sage"/>
39
+ <text class="step-num" x="95" y="155" text-anchor="middle">1</text>
40
+ <text class="step-label" x="95" y="185" text-anchor="middle">Lead Arrives</text>
41
+ <text class="step-desc" x="95" y="198" text-anchor="middle">Portal, website,</text>
42
+ <text class="step-desc" x="95" y="210" text-anchor="middle">WhatsApp, social</text>
43
+
44
+ <!-- Arrow 1→2 -->
45
+ <path class="arrow" d="M 118 150 L 178 150"/>
46
+
47
+ <!-- Step 2: AI responds -->
48
+ <circle cx="235" cy="150" r="18" class="sage"/>
49
+ <text class="step-num" x="235" y="155" text-anchor="middle">2</text>
50
+ <text class="step-label" x="235" y="185" text-anchor="middle">AI Responds</text>
51
+ <text class="step-desc" x="235" y="198" text-anchor="middle">Instantly, 24/7.</text>
52
+ <text class="step-desc" x="235" y="210" text-anchor="middle">Even at 9pm.</text>
53
+
54
+ <!-- Arrow 2→3 -->
55
+ <path class="arrow" d="M 258 150 L 318 150"/>
56
+
57
+ <!-- Step 3: AI follows up -->
58
+ <circle cx="375" cy="150" r="18" class="sage"/>
59
+ <text class="step-num" x="375" y="155" text-anchor="middle">3</text>
60
+ <text class="step-label" x="375" y="185" text-anchor="middle">AI Follows Up</text>
61
+ <text class="step-desc" x="375" y="198" text-anchor="middle">Automatically.</text>
62
+ <text class="step-desc" x="375" y="210" text-anchor="middle">Never forgets.</text>
63
+
64
+ <!-- Arrow 3→4 -->
65
+ <path class="arrow" d="M 398 150 L 458 150"/>
66
+
67
+ <!-- Step 4: Books appointments -->
68
+ <circle cx="515" cy="150" r="18" class="sage"/>
69
+ <text class="step-num" x="515" y="155" text-anchor="middle">4</text>
70
+ <text class="step-label" x="515" y="185" text-anchor="middle">Books Viewings</text>
71
+ <text class="step-desc" x="515" y="198" text-anchor="middle">Schedules, confirms,</text>
72
+ <text class="step-desc" x="515" y="210" text-anchor="middle">groups efficiently.</text>
73
+
74
+ <!-- Arrow 4→5 -->
75
+ <path class="arrow" d="M 538 150 L 598 150"/>
76
+
77
+ <!-- Step 5: Agent closes -->
78
+ <circle cx="660" cy="150" r="18" class="copper"/>
79
+ <text class="step-num" x="660" y="155" text-anchor="middle">5</text>
80
+ <text class="step-label" x="660" y="185" text-anchor="middle">You Close</text>
81
+ <text class="step-desc" x="660" y="198" text-anchor="middle">Attend a warm</text>
82
+ <text class="step-desc" x="660" y="210" text-anchor="middle">appointment.</text>
83
+
84
+ <!-- Divider -->
85
+ <line x1="40" y1="240" x2="760" y2="240" stroke="#E8DDD3" stroke-width="1"/>
86
+
87
+ <!-- Section label: Extended capabilities -->
88
+ <text class="section-label" x="40" y="268">BEYOND THE CORE</text>
89
+ <text class="step-desc" x="215" y="268">Real Agent handles your entire operation — not just leads.</text>
90
+
91
+ <!-- Extended capability cards -->
92
+ <!-- Row 1 -->
93
+ <!-- Card 1: Database Prospecting -->
94
+ <rect x="40" y="286" width="218" height="56" rx="8" fill="#F3EDE5"/>
95
+ <circle cx="66" cy="314" r="12" fill="#7C8C72" opacity="0.15"/>
96
+ <g transform="translate(57,305) scale(0.75)" fill="none" stroke="#7C8C72" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="11" cy="11" r="8"/><line x1="21" y1="21" x2="16.65" y2="16.65"/></g>
97
+ <text class="ext-label" x="86" y="308">Database Prospecting</text>
98
+ <text class="ext-desc" x="86" y="322">Work through 20,000+ contacts.</text>
99
+ <text class="ext-desc" x="86" y="334">Surface re-approach candidates.</text>
100
+
101
+ <!-- Card 2: Organisation -->
102
+ <rect x="270" y="286" width="218" height="56" rx="8" fill="#F3EDE5"/>
103
+ <circle cx="296" cy="314" r="12" fill="#7C8C72" opacity="0.15"/>
104
+ <g transform="translate(287,305) scale(0.75)" fill="none" stroke="#7C8C72" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="8" y="2" width="8" height="4" rx="1" ry="1"/><path d="M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2"/><path d="M12 11h4"/><path d="M12 16h4"/><path d="M8 11h.01"/><path d="M8 16h.01"/></g>
105
+ <text class="ext-label" x="316" y="308">Organisation &amp; Tasks</text>
106
+ <text class="ext-desc" x="316" y="322">CRM updates, pipeline tracking,</text>
107
+ <text class="ext-desc" x="316" y="334">vendor reports — all automatic.</text>
108
+
109
+ <!-- Card 3: Marketing -->
110
+ <rect x="500" y="286" width="218" height="56" rx="8" fill="#F3EDE5"/>
111
+ <circle cx="526" cy="314" r="12" fill="#7C8C72" opacity="0.15"/>
112
+ <g transform="translate(517,305) scale(0.75)" fill="none" stroke="#7C8C72" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="m3 11 18-5v12L3 13v-2z"/><path d="M11.6 16.8a3 3 0 1 1-5.8-1.6"/></g>
113
+ <text class="ext-label" x="546" y="308">Marketing &amp; Content</text>
114
+ <text class="ext-desc" x="546" y="322">Social posts, prospect letters,</text>
115
+ <text class="ext-desc" x="546" y="334">email campaigns — from activity.</text>
116
+
117
+ <!-- Row 2 -->
118
+ <!-- Card 4: Reporting -->
119
+ <rect x="40" y="354" width="218" height="56" rx="8" fill="#F3EDE5"/>
120
+ <circle cx="66" cy="382" r="12" fill="#7C8C72" opacity="0.15"/>
121
+ <g transform="translate(57,373) scale(0.75)" fill="none" stroke="#7C8C72" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M3 3v18h18"/><path d="M18 17V9"/><path d="M13 17V5"/><path d="M8 17v-3"/></g>
122
+ <text class="ext-label" x="86" y="376">Reporting &amp; Targets</text>
123
+ <text class="ext-desc" x="86" y="390">Weekly vendor reports pre-built.</text>
124
+ <text class="ext-desc" x="86" y="402">Pipeline insights surfaced daily.</text>
125
+
126
+ <!-- Card 5: Coaching -->
127
+ <rect x="270" y="354" width="218" height="56" rx="8" fill="#F3EDE5"/>
128
+ <circle cx="296" cy="382" r="12" fill="#7C8C72" opacity="0.15"/>
129
+ <g transform="translate(287,373) scale(0.75)" fill="none" stroke="#7C8C72" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M22 10v6M2 10l10-5 10 5-10 5z"/><path d="M6 12v5c0 2 4 4 6 4s6-2 6-4v-5"/></g>
130
+ <text class="ext-label" x="316" y="376">Coaching &amp; Development</text>
131
+ <text class="ext-desc" x="316" y="390">Adapts to each person's level.</text>
132
+ <text class="ext-desc" x="316" y="402">Builds capability, not dependence.</text>
133
+
134
+ <!-- Card 6: Privacy -->
135
+ <rect x="500" y="354" width="218" height="56" rx="8" fill="#F3EDE5"/>
136
+ <circle cx="526" cy="382" r="12" fill="#7C8C72" opacity="0.15"/>
137
+ <g transform="translate(517,373) scale(0.75)" fill="none" stroke="#7C8C72" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect width="18" height="11" x="3" y="11" rx="2" ry="2"/><path d="M7 11V7a5 5 0 0 1 10 0v4"/></g>
138
+ <text class="ext-label" x="546" y="376">Your Data, Your Premises</text>
139
+ <text class="ext-desc" x="546" y="390">Runs on a device in your office.</text>
140
+ <text class="ext-desc" x="546" y="402">Nothing leaves. GDPR by design.</text>
141
+
142
+ <!-- Divider -->
143
+ <line x1="40" y1="430" x2="760" y2="430" stroke="#E8DDD3" stroke-width="1"/>
144
+
145
+ <!-- Bottom bar: key message -->
146
+ <rect x="40" y="446" width="720" height="48" rx="8" fill="#7C8C72" opacity="0.08"/>
147
+ <text x="400" y="467" text-anchor="middle" font-family="Georgia, serif" font-size="14" font-weight="700" fill="#5A6B52">AI handles the middle. You handle the relationships.</text>
148
+ <text x="400" y="484" text-anchor="middle" font-family="Inter, -apple-system, Helvetica, Arial, sans-serif" font-size="11" fill="#8B8A85">17 tasks fully automated. 10 AI-assisted. One conversation to run it all.</text>
149
+
150
+ <!-- Footer -->
151
+ <text class="footer" x="400" y="524" text-anchor="middle">Real Agent — Built for agents. By agents.</text>
152
+ </svg>
@@ -1,8 +1,8 @@
1
1
  {
2
- "productName": "Maxy",
3
- "tagline": "AI for Productive People",
4
- "domain": "getmaxy.com",
5
- "hostname": "maxy",
6
- "logo": "/brand/maxy-monochrome.png",
7
- "favicon": "/brand/favicon.ico"
2
+ "productName": "Real Agent",
3
+ "tagline": "Built for agents. By agents.",
4
+ "domain": "realagency.network",
5
+ "hostname": "realagent",
6
+ "logo": "/brand/realagent-icon-web.png",
7
+ "favicon": "/brand/realagent-favicon-dark-32.png"
8
8
  }
@@ -1,12 +1,12 @@
1
1
  :root {
2
- /* Brand defaults — generated by bundle.js from brands/maxy/brand.json */
2
+ /* Brand defaults — generated by bundle.js from brands/realagent/brand.json */
3
3
  --sage: #7C8C72;
4
4
  --sage-hover: #6A7A62;
5
5
  --sage-subtle: rgba(124, 140, 114, 0.08);
6
6
  --sage-glow: rgba(124, 140, 114, 0.15);
7
- --visitor-bubble: #E8ECF0;
7
+ --visitor-bubble: #C5A572;
8
8
  --bg: #FAFAF8;
9
- --maxy-bubble: #F5F2ED;
10
- --font-display: 'Cormorant', Georgia, serif;
11
- --font-body: 'DM Sans', -apple-system, BlinkMacSystemFont, sans-serif;
9
+ --maxy-bubble: #F0EDE8;
10
+ --font-display: 'Playfair Display', Georgia, serif;
11
+ --font-body: 'Inter', -apple-system, BlinkMacSystemFont, sans-serif;
12
12
  }
@@ -3,7 +3,7 @@
3
3
  <head>
4
4
  <meta charset="UTF-8">
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
- <title>Maxy</title>
6
+ <title>Real Agent</title>
7
7
  <link rel="icon" href="/favicon.ico">
8
8
  <script type="module" crossorigin src="/assets/admin-CvVTy3NI.js"></script>
9
9
  <link rel="modulepreload" crossorigin href="/assets/ChatInput-Bkvp46jn.js">
@@ -3,7 +3,7 @@
3
3
  <head>
4
4
  <meta charset="UTF-8">
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
- <title>Maxy</title>
6
+ <title>Real Agent</title>
7
7
  <link rel="icon" href="/favicon.ico">
8
8
  <script type="module" crossorigin src="/assets/public-CJdTPrH1.js"></script>
9
9
  <link rel="modulepreload" crossorigin href="/assets/ChatInput-Bkvp46jn.js">
@@ -1,43 +1,45 @@
1
1
  {
2
- "productName": "Maxy",
3
- "hostname": "maxy",
4
- "serviceName": "maxy.service",
5
- "installDir": "maxy",
6
- "configDir": ".maxy",
7
- "tagline": "AI for Productive People",
8
- "strapline": "Convenience as standard.",
9
- "domain": "getmaxy.com",
2
+ "productName": "Real Agent",
3
+ "hostname": "realagent",
4
+ "serviceName": "realagent.service",
5
+ "installDir": "realagent",
6
+ "configDir": ".realagent",
7
+ "tagline": "Built for agents. By agents.",
8
+ "port": 19300,
9
+ "domain": "realagency.network",
10
10
 
11
11
  "defaultColors": {
12
12
  "primary": "#7C8C72",
13
13
  "primaryHover": "#6A7A62",
14
14
  "primarySubtle": "rgba(124, 140, 114, 0.08)",
15
15
  "primaryGlow": "rgba(124, 140, 114, 0.15)",
16
- "accent": "#E8ECF0",
16
+ "accent": "#C5A572",
17
17
  "background": "#FAFAF8",
18
- "agentBubble": "#F5F2ED"
18
+ "agentBubble": "#F0EDE8"
19
19
  },
20
20
 
21
21
  "defaultFonts": {
22
- "display": "'Cormorant', Georgia, serif",
23
- "body": "'DM Sans', -apple-system, BlinkMacSystemFont, sans-serif"
22
+ "display": "'Playfair Display', Georgia, serif",
23
+ "body": "'Inter', -apple-system, BlinkMacSystemFont, sans-serif"
24
24
  },
25
25
 
26
26
  "assets": {
27
- "logo": "maxy-monochrome.png",
28
- "favicon": "favicon.ico"
27
+ "logo": "realagent-icon-web.png",
28
+ "logoMonochrome": "realagent-icon-web.png",
29
+ "logoRound": "realagent-icon-dark-round-web.png",
30
+ "favicon": "realagent-favicon-dark-32.png"
29
31
  },
30
32
 
31
33
  "npm": {
32
- "packageName": "@rubytech/create-maxy",
33
- "binName": "create-maxy",
34
+ "packageName": "@rubytech/create-realagent",
35
+ "binName": "create-realagent",
34
36
  "author": "Rubytech LLC"
35
37
  },
36
38
 
37
39
  "plugins": {
38
- "core": ["admin", "memory", "docs", "cloudflare", "anthropic", "workflows", "tasks"],
39
- "defaultEnabled": ["business-assistant", "sales", "contacts", "email", "scheduling", "projects"],
40
- "available": ["telegram", "waitlist", "deep-research"],
41
- "excluded": []
40
+ "core": ["admin", "memory", "docs", "cloudflare", "anthropic", "workflows", "tasks", "business-assistant", "contacts", "scheduling"],
41
+ "defaultEnabled": ["email", "sales"],
42
+ "available": ["deep-research","waitlist", "projects"],
43
+ "excluded": ["telegram"]
42
44
  }
43
45
  }
@@ -37,6 +37,11 @@ kill_stale() {
37
37
  pkill -f 'Xtigervnc :99' 2>/dev/null || true
38
38
  pkill -f 'websockify.*6080' 2>/dev/null || true
39
39
  rm -f /tmp/.X99-lock /tmp/.X11-unix/X99
40
+ # Clear Chromium profile locks left by unclean shutdown — without this,
41
+ # Chromium refuses to start after a service restart or power loss.
42
+ rm -f "${HOME}/.config/chromium/SingletonLock" \
43
+ "${HOME}/.config/chromium/SingletonCookie" \
44
+ "${HOME}/.config/chromium/SingletonSocket" 2>/dev/null || true
40
45
  sleep 0.3
41
46
  }
42
47
 
@@ -1,34 +0,0 @@
1
- ---
2
- name: telegram
3
- description: Guide users through connecting a Telegram bot — creating a bot via BotFather, finding user IDs, and configuring admin vs public bots.
4
- metadata: {"taskmaster":{"optional":true}}
5
- tools:
6
- - message
7
- - message-history
8
- ---
9
-
10
- # Telegram Setup
11
-
12
- Walks users through connecting Telegram bots to Taskmaster. Covers bot creation, token configuration, finding numeric user IDs, and choosing between admin and public bot roles.
13
-
14
- ## When to activate
15
-
16
- - User asks how to connect Telegram or set up a Telegram bot
17
- - User asks about BotFather, bot tokens, or Telegram integration
18
- - User needs to find their Telegram user ID for admin binding
19
- - User asks about admin vs public bot configuration
20
- - User is on the Setup page and asks about the Telegram section
21
-
22
- ## What it unlocks
23
-
24
- - Telegram as a messaging channel — DMs and group conversations routed to the AI assistant
25
- - Multi-bot support — separate admin and public bots with different access policies
26
- - Admin routing — restrict a bot to admin-only access via numeric user ID bindings
27
-
28
- ## References
29
-
30
- | Task | When to use | Reference |
31
- |------|-------------|-----------|
32
- | Guided setup | User wants help connecting Telegram | `references/setup-guide.md` |
33
-
34
- Load the reference and follow its instructions.
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
@@ -1,101 +0,0 @@
1
- import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
- import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
3
- import { z } from "zod";
4
- import { message } from "./tools/message.js";
5
- import { messageHistory } from "./tools/message-history.js";
6
- const server = new McpServer({
7
- name: "maxy-messaging",
8
- version: "0.1.0",
9
- });
10
- server.tool("message", "Send a message via Telegram. Supports text with HTML formatting and inline keyboards for interactive choices.", {
11
- channel: z.literal("telegram").describe("Delivery channel"),
12
- chatId: z
13
- .union([z.string(), z.number()])
14
- .describe("Telegram chat ID to send to"),
15
- text: z.string().describe("Message text (HTML formatting supported)"),
16
- parseMode: z
17
- .enum(["HTML", "Markdown", "MarkdownV2"])
18
- .optional()
19
- .describe("Parse mode (default: HTML)"),
20
- inlineKeyboard: z
21
- .array(z.array(z.object({
22
- text: z.string().describe("Button label"),
23
- callbackData: z
24
- .string()
25
- .optional()
26
- .describe("Callback data for button press"),
27
- url: z.string().optional().describe("URL to open on button press"),
28
- })))
29
- .optional()
30
- .describe("Inline keyboard rows for interactive buttons"),
31
- }, async (params) => {
32
- try {
33
- const result = await message(params);
34
- if (!result.sent) {
35
- return {
36
- content: [
37
- {
38
- type: "text",
39
- text: `Message failed: ${result.error}`,
40
- },
41
- ],
42
- isError: true,
43
- };
44
- }
45
- return {
46
- content: [
47
- {
48
- type: "text",
49
- text: `Message sent via ${result.channel} (ID: ${result.messageId})`,
50
- },
51
- ],
52
- };
53
- }
54
- catch (err) {
55
- return {
56
- content: [
57
- {
58
- type: "text",
59
- text: `Send failed: ${err instanceof Error ? err.message : String(err)}`,
60
- },
61
- ],
62
- isError: true,
63
- };
64
- }
65
- });
66
- server.tool("message-history", "Query conversation history from the message log.", {
67
- channel: z.string().optional().describe("Filter by channel (telegram)"),
68
- chatId: z.string().optional().describe("Filter by chat ID"),
69
- limit: z.number().optional().describe("Max messages to return (default 20)"),
70
- }, async ({ channel, chatId, limit }) => {
71
- try {
72
- const history = await messageHistory({ channel, chatId, limit });
73
- if (history.length === 0) {
74
- return {
75
- content: [
76
- { type: "text", text: "No message history found." },
77
- ],
78
- };
79
- }
80
- const formatted = history
81
- .map((h) => `[${h.timestamp}] ${h.channel}/${h.chatId} (${h.role}): ${h.content.slice(0, 200)}${h.content.length > 200 ? "..." : ""}`)
82
- .join("\n");
83
- return {
84
- content: [{ type: "text", text: formatted }],
85
- };
86
- }
87
- catch (err) {
88
- return {
89
- content: [
90
- {
91
- type: "text",
92
- text: `History query failed: ${err instanceof Error ? err.message : String(err)}`,
93
- },
94
- ],
95
- isError: true,
96
- };
97
- }
98
- });
99
- const transport = new StdioServerTransport();
100
- await server.connect(transport);
101
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -1,27 +0,0 @@
1
- export interface TelegramSendOptions {
2
- chatId: string | number;
3
- text: string;
4
- parseMode?: "HTML" | "Markdown" | "MarkdownV2";
5
- replyMarkup?: TelegramInlineKeyboard;
6
- }
7
- export interface TelegramInlineKeyboard {
8
- inline_keyboard: Array<Array<{
9
- text: string;
10
- callback_data?: string;
11
- url?: string;
12
- }>>;
13
- }
14
- export declare function sendMessage(botToken: string, options: TelegramSendOptions): Promise<{
15
- ok: boolean;
16
- messageId?: number;
17
- error?: string;
18
- }>;
19
- export declare function setWebhook(botToken: string, webhookUrl: string): Promise<{
20
- ok: boolean;
21
- error?: string;
22
- }>;
23
- export declare function getWebhookInfo(botToken: string): Promise<{
24
- url: string;
25
- pendingUpdateCount: number;
26
- }>;
27
- //# sourceMappingURL=telegram.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"telegram.d.ts","sourceRoot":"","sources":["../../src/lib/telegram.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,GAAG,UAAU,GAAG,YAAY,CAAC;IAC/C,WAAW,CAAC,EAAE,sBAAsB,CAAC;CACtC;AAED,MAAM,WAAW,sBAAsB;IACrC,eAAe,EAAE,KAAK,CACpB,KAAK,CAAC;QACJ,IAAI,EAAE,MAAM,CAAC;QACb,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,GAAG,CAAC,EAAE,MAAM,CAAC;KACd,CAAC,CACH,CAAC;CACH;AAED,wBAAsB,WAAW,CAC/B,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC;IAAE,EAAE,EAAE,OAAO,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAyB9D;AAED,wBAAsB,UAAU,CAC9B,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC;IAAE,EAAE,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAiB1C;AAED,wBAAsB,cAAc,CAClC,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,kBAAkB,EAAE,MAAM,CAAA;CAAE,CAAC,CAWtD"}
@@ -1,41 +0,0 @@
1
- const TELEGRAM_API = "https://api.telegram.org";
2
- export async function sendMessage(botToken, options) {
3
- const res = await fetch(`${TELEGRAM_API}/bot${botToken}/sendMessage`, {
4
- method: "POST",
5
- headers: { "Content-Type": "application/json" },
6
- body: JSON.stringify({
7
- chat_id: options.chatId,
8
- text: options.text,
9
- parse_mode: options.parseMode ?? "HTML",
10
- reply_markup: options.replyMarkup
11
- ? JSON.stringify(options.replyMarkup)
12
- : undefined,
13
- }),
14
- });
15
- const data = (await res.json());
16
- if (!data.ok) {
17
- return { ok: false, error: data.description ?? "Unknown Telegram error" };
18
- }
19
- return { ok: true, messageId: data.result?.message_id };
20
- }
21
- export async function setWebhook(botToken, webhookUrl) {
22
- const res = await fetch(`${TELEGRAM_API}/bot${botToken}/setWebhook`, {
23
- method: "POST",
24
- headers: { "Content-Type": "application/json" },
25
- body: JSON.stringify({ url: webhookUrl }),
26
- });
27
- const data = (await res.json());
28
- if (!data.ok) {
29
- return { ok: false, error: data.description ?? "Failed to set webhook" };
30
- }
31
- return { ok: true };
32
- }
33
- export async function getWebhookInfo(botToken) {
34
- const res = await fetch(`${TELEGRAM_API}/bot${botToken}/getWebhookInfo`);
35
- const data = (await res.json());
36
- return {
37
- url: data.result.url,
38
- pendingUpdateCount: data.result.pending_update_count,
39
- };
40
- }
41
- //# sourceMappingURL=telegram.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"telegram.js","sourceRoot":"","sources":["../../src/lib/telegram.ts"],"names":[],"mappings":"AAAA,MAAM,YAAY,GAAG,0BAA0B,CAAC;AAmBhD,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,QAAgB,EAChB,OAA4B;IAE5B,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,YAAY,OAAO,QAAQ,cAAc,EAAE;QACpE,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;QAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;YACnB,OAAO,EAAE,OAAO,CAAC,MAAM;YACvB,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,UAAU,EAAE,OAAO,CAAC,SAAS,IAAI,MAAM;YACvC,YAAY,EAAE,OAAO,CAAC,WAAW;gBAC/B,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,WAAW,CAAC;gBACrC,CAAC,CAAC,SAAS;SACd,CAAC;KACH,CAAC,CAAC;IAEH,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAI7B,CAAC;IAEF,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;QACb,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,WAAW,IAAI,wBAAwB,EAAE,CAAC;IAC5E,CAAC;IAED,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,CAAC,MAAM,EAAE,UAAU,EAAE,CAAC;AAC1D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,QAAgB,EAChB,UAAkB;IAElB,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,YAAY,OAAO,QAAQ,aAAa,EAAE;QACnE,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;QAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,EAAE,UAAU,EAAE,CAAC;KAC1C,CAAC,CAAC;IAEH,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAG7B,CAAC;IAEF,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;QACb,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,WAAW,IAAI,uBAAuB,EAAE,CAAC;IAC3E,CAAC;IAED,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;AACtB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,QAAgB;IAEhB,MAAM,GAAG,GAAG,MAAM,KAAK,CACrB,GAAG,YAAY,OAAO,QAAQ,iBAAiB,CAChD,CAAC;IACF,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAE7B,CAAC;IACF,OAAO;QACL,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG;QACpB,kBAAkB,EAAE,IAAI,CAAC,MAAM,CAAC,oBAAoB;KACrD,CAAC;AACJ,CAAC"}
@@ -1,16 +0,0 @@
1
- interface HistoryParams {
2
- channel?: string;
3
- chatId?: string;
4
- accountId?: string;
5
- limit?: number;
6
- }
7
- interface HistoryEntry {
8
- channel: string;
9
- chatId: string;
10
- role: string;
11
- content: string;
12
- timestamp: string;
13
- }
14
- export declare function messageHistory(params: HistoryParams): Promise<HistoryEntry[]>;
15
- export {};
16
- //# sourceMappingURL=message-history.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"message-history.d.ts","sourceRoot":"","sources":["../../src/tools/message-history.ts"],"names":[],"mappings":"AAiCA,UAAU,aAAa;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,UAAU,YAAY;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,wBAAsB,cAAc,CAClC,MAAM,EAAE,aAAa,GACpB,OAAO,CAAC,YAAY,EAAE,CAAC,CAyCzB"}
@@ -1,62 +0,0 @@
1
- import neo4j from "neo4j-driver";
2
- import { readFileSync } from "node:fs";
3
- import { resolve } from "node:path";
4
- let driver = null;
5
- function readPassword() {
6
- if (process.env.NEO4J_PASSWORD)
7
- return process.env.NEO4J_PASSWORD;
8
- const passwordFile = resolve(process.env.PLATFORM_ROOT ?? resolve(import.meta.dirname, "../../../.."), "config/.neo4j-password");
9
- try {
10
- return readFileSync(passwordFile, "utf-8").trim();
11
- }
12
- catch {
13
- throw new Error(`Neo4j password not found. Expected at ${passwordFile} or in NEO4J_PASSWORD env var.`);
14
- }
15
- }
16
- function getSession() {
17
- if (!driver) {
18
- const uri = process.env.NEO4J_URI ?? "bolt://localhost:7687";
19
- const user = process.env.NEO4J_USER ?? "neo4j";
20
- const password = readPassword();
21
- driver = neo4j.driver(uri, neo4j.auth.basic(user, password));
22
- }
23
- return driver.session();
24
- }
25
- export async function messageHistory(params) {
26
- const { channel, chatId, accountId, limit = 20 } = params;
27
- const session = getSession();
28
- try {
29
- const conditions = ["m.accountId = $accountId"];
30
- const queryParams = { accountId, limit };
31
- if (channel) {
32
- conditions.push("m.channel = $channel");
33
- queryParams.channel = channel;
34
- }
35
- if (chatId) {
36
- conditions.push("m.chatId = $chatId");
37
- queryParams.chatId = chatId;
38
- }
39
- const query = `
40
- MATCH (m:Communication)
41
- WHERE ${conditions.join(" AND ")}
42
- RETURN m
43
- ORDER BY m.dateSent DESC
44
- LIMIT $limit
45
- `;
46
- const result = await session.run(query, queryParams);
47
- return result.records.map((record) => {
48
- const m = record.get("m").properties;
49
- return {
50
- channel: m.channel,
51
- chatId: m.chatId,
52
- role: m.role,
53
- content: m.content,
54
- timestamp: m.dateSent,
55
- };
56
- });
57
- }
58
- finally {
59
- await session.close();
60
- }
61
- }
62
- //# sourceMappingURL=message-history.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"message-history.js","sourceRoot":"","sources":["../../src/tools/message-history.ts"],"names":[],"mappings":"AAAA,OAAO,KAAoC,MAAM,cAAc,CAAC;AAChE,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,IAAI,MAAM,GAAkB,IAAI,CAAC;AAEjC,SAAS,YAAY;IACnB,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc;QAAE,OAAO,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;IAElE,MAAM,YAAY,GAAG,OAAO,CAC1B,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,aAAa,CAAC,EACxE,wBAAwB,CACzB,CAAC;IAEF,IAAI,CAAC;QACH,OAAO,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;IACpD,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CACb,yCAAyC,YAAY,gCAAgC,CACtF,CAAC;IACJ,CAAC;AACH,CAAC;AAED,SAAS,UAAU;IACjB,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,uBAAuB,CAAC;QAC7D,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,OAAO,CAAC;QAC/C,MAAM,QAAQ,GAAG,YAAY,EAAE,CAAC;QAChC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC;IAC/D,CAAC;IACD,OAAO,MAAM,CAAC,OAAO,EAAE,CAAC;AAC1B,CAAC;AAiBD,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,MAAqB;IAErB,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,GAAG,EAAE,EAAE,GAAG,MAAM,CAAC;IAE1D,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;IAE7B,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,CAAC,0BAA0B,CAAC,CAAC;QAChD,MAAM,WAAW,GAA4B,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;QAElE,IAAI,OAAO,EAAE,CAAC;YACZ,UAAU,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;YACxC,WAAW,CAAC,OAAO,GAAG,OAAO,CAAC;QAChC,CAAC;QACD,IAAI,MAAM,EAAE,CAAC;YACX,UAAU,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;YACtC,WAAW,CAAC,MAAM,GAAG,MAAM,CAAC;QAC9B,CAAC;QAED,MAAM,KAAK,GAAG;;cAEJ,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC;;;;KAIjC,CAAC;QAEF,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;QAErD,OAAO,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE;YACnC,MAAM,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,UAAU,CAAC;YACrC,OAAO;gBACL,OAAO,EAAE,CAAC,CAAC,OAAiB;gBAC5B,MAAM,EAAE,CAAC,CAAC,MAAgB;gBAC1B,IAAI,EAAE,CAAC,CAAC,IAAc;gBACtB,OAAO,EAAE,CAAC,CAAC,OAAiB;gBAC5B,SAAS,EAAE,CAAC,CAAC,QAAkB;aAChC,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC;YAAS,CAAC;QACT,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;IACxB,CAAC;AACH,CAAC"}
@@ -1,20 +0,0 @@
1
- interface MessageParams {
2
- channel: "telegram";
3
- chatId: string | number;
4
- text: string;
5
- parseMode?: "HTML" | "Markdown" | "MarkdownV2";
6
- inlineKeyboard?: Array<Array<{
7
- text: string;
8
- callbackData?: string;
9
- url?: string;
10
- }>>;
11
- }
12
- interface MessageResult {
13
- sent: boolean;
14
- channel: string;
15
- messageId?: number;
16
- error?: string;
17
- }
18
- export declare function message(params: MessageParams): Promise<MessageResult>;
19
- export {};
20
- //# sourceMappingURL=message.d.ts.map
@@ -1 +0,0 @@
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"}
@@ -1,34 +0,0 @@
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
@@ -1 +0,0 @@
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"}
@@ -1,19 +0,0 @@
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
- }
@@ -1,50 +0,0 @@
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.