@rubytech/create-maxy 1.0.739 → 1.0.741
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +130 -79
- package/package.json +1 -1
- package/payload/platform/lib/brand-templating/dist/index.d.ts +18 -0
- package/payload/platform/lib/brand-templating/dist/index.d.ts.map +1 -0
- package/payload/platform/lib/brand-templating/dist/index.js +69 -0
- package/payload/platform/lib/brand-templating/dist/index.js.map +1 -0
- package/payload/platform/lib/brand-templating/src/index.ts +76 -0
- package/payload/platform/lib/brand-templating/tsconfig.json +8 -0
- package/payload/platform/lib/graph-write/dist/index.d.ts.map +1 -1
- package/payload/platform/lib/graph-write/dist/index.js +23 -1
- package/payload/platform/lib/graph-write/dist/index.js.map +1 -1
- package/payload/platform/lib/graph-write/src/index.ts +27 -4
- package/payload/platform/neo4j/schema.cypher +5 -2
- package/payload/platform/package.json +2 -2
- package/payload/platform/plugins/admin/mcp/dist/index.js +6 -1
- package/payload/platform/plugins/admin/mcp/dist/index.js.map +1 -1
- package/payload/platform/plugins/admin/skills/onboarding/SKILL.md +7 -7
- package/payload/platform/plugins/admin/skills/plugin-management/SKILL.md +1 -1
- package/payload/platform/plugins/anthropic/skills/get-api-key/SKILL.md +2 -2
- package/payload/platform/plugins/cloudflare/skills/setup-tunnel/SKILL.md +1 -1
- package/payload/platform/plugins/docs/references/access-control.md +10 -10
- package/payload/platform/plugins/docs/references/contacts-guide.md +11 -11
- package/payload/platform/plugins/docs/references/deployment.md +14 -13
- package/payload/platform/plugins/docs/references/getting-started.md +19 -19
- package/payload/platform/plugins/docs/references/internals.md +4 -4
- package/payload/platform/plugins/docs/references/memory-guide.md +21 -21
- package/payload/platform/plugins/docs/references/migration-guide.md +5 -5
- package/payload/platform/plugins/docs/references/platform.md +9 -9
- package/payload/platform/plugins/docs/references/plugins-guide.md +20 -12
- package/payload/platform/plugins/docs/references/projects-guide.md +10 -10
- package/payload/platform/plugins/docs/references/settings.md +13 -13
- package/payload/platform/plugins/docs/references/telegram-guide.md +14 -14
- package/payload/platform/plugins/docs/references/troubleshooting.md +23 -23
- package/payload/platform/plugins/linkedin-import/skills/linkedin-import/SKILL.md +6 -6
- package/payload/platform/plugins/linkedin-import/skills/linkedin-import/references/profile.md +2 -2
- package/payload/platform/plugins/whatsapp/skills/connect-whatsapp/SKILL.md +2 -2
- package/payload/platform/plugins/workflows/mcp/test-workflows.sh +5 -1
- package/payload/platform/scripts/dedupe-userprofile-ghosts.sh +388 -0
- package/payload/platform/scripts/embed-backfill.sh +8 -1
- package/payload/platform/scripts/migrate-import.sh +42 -1
- package/payload/platform/scripts/seed-neo4j.sh +8 -1
- package/payload/server/chunk-PQ6LDXZ4.js +2997 -0
- package/payload/server/chunk-W6ZUNLLS.js +9446 -0
- package/payload/server/client-pool-DQBHSKAF.js +28 -0
- package/payload/server/maxy-edge.js +2 -2
- package/payload/server/server.js +41 -3
|
@@ -2,15 +2,15 @@
|
|
|
2
2
|
|
|
3
3
|
## What a Plugin Is
|
|
4
4
|
|
|
5
|
-
A plugin extends what
|
|
5
|
+
A plugin extends what {{productName}} can do. Each plugin adds a focused capability — contacts management, Telegram messaging, scheduling, email, research. Plugins are modular: you enable only what you need.
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
{{productName}}'s own capabilities are plugins too. Marketplace plugins (like Stripe) work the same way — {{productName}} manages all of them through conversation.
|
|
8
8
|
|
|
9
9
|
## Plugin Groups
|
|
10
10
|
|
|
11
11
|
### Core (always active)
|
|
12
12
|
|
|
13
|
-
These are part of
|
|
13
|
+
These are part of {{productName}}'s foundation and cannot be disabled:
|
|
14
14
|
|
|
15
15
|
| Plugin | What it does |
|
|
16
16
|
|--------|-------------|
|
|
@@ -25,7 +25,7 @@ These are part of Maxy's foundation and cannot be disabled:
|
|
|
25
25
|
| `workflows` | Persistent named workflows — reusable instruction sets |
|
|
26
26
|
| `contacts` | CRM contact management — create, lookup, update, list |
|
|
27
27
|
|
|
28
|
-
###
|
|
28
|
+
### {{productName}} Plugins (user-selectable)
|
|
29
29
|
|
|
30
30
|
These are enabled during onboarding and can be added or removed at any time. Some plugins enhance a specific specialist role — when enabled, that specialist gains additional capabilities.
|
|
31
31
|
|
|
@@ -51,7 +51,7 @@ Third-party plugins from the Claude marketplace:
|
|
|
51
51
|
|
|
52
52
|
### Premium Plugins
|
|
53
53
|
|
|
54
|
-
Premium plugins are one-off purchases that grant permanent ownership. They are not part of the standard install — once purchased,
|
|
54
|
+
Premium plugins are one-off purchases that grant permanent ownership. They are not part of the standard install — once purchased, {{productName}} delivers them automatically.
|
|
55
55
|
|
|
56
56
|
| Plugin | Type | What it does | Public agent |
|
|
57
57
|
|--------|------|-------------|-------------|
|
|
@@ -59,35 +59,43 @@ Premium plugins are one-off purchases that grant permanent ownership. They are n
|
|
|
59
59
|
| `real-agency` | Bundle (11 sub-plugins) | UK estate agency skills — sales, listings, brochures, vendor management, buyer management, lead generation, coaching, business operations, onboarding, teaching, and Loop CRM. 2 specialist roles (negotiator, valuer) | 4 sub-plugins (estate-sales, buyers, estate-coaching, estate-onboarding) |
|
|
60
60
|
| `writer-craft` | Skills + Agent | Manuscript review and writing craft — story architecture, reader engagement, prose craft, editorial practice, and multi-level review | No — writing craft serves the author |
|
|
61
61
|
|
|
62
|
-
**How it works:** When you purchase a premium plugin, it's delivered to your
|
|
62
|
+
**How it works:** When you purchase a premium plugin, it's delivered to your {{productName}} via conversation. Tell {{productName}} "Enable the teaching plugin" and it handles the rest. Premium plugins are yours permanently — they survive updates and reinstalls.
|
|
63
63
|
|
|
64
64
|
Some premium plugins are **bundles** — a single purchase that delivers multiple sub-plugins, each independently activatable. For example, Real Agency delivers 11 sub-plugins covering different aspects of estate agency work. You can enable all of them or just the ones you need (e.g., "Enable estate-sales" for just the sales skills). Enabling or disabling individual sub-plugins does not affect the others.
|
|
65
65
|
|
|
66
66
|
**Public agent embedding:** Premium plugins marked as public-eligible have their full content (skills and reference knowledge) embedded in public agent prompts. This means a public agent for a Real Agency member can handle buyer enquiries, book viewings, deliver coaching content, and onboard new applicants — all powered by the premium plugin's domain knowledge. Plugins marked admin-only (listings, vendors, leads, business) are only available to the account owner's admin agent.
|
|
67
67
|
|
|
68
|
-
Some premium plugins include specialist helpers that
|
|
68
|
+
Some premium plugins include specialist helpers that {{productName}} can dispatch for specific tasks (e.g. the writer-craft plugin includes a manuscript reviewer). These are activated automatically when the plugin is enabled.
|
|
69
69
|
|
|
70
|
-
Some premium plugins include pre-built public agent templates — ready-made configurations for customer-facing agents. When you enable the plugin,
|
|
70
|
+
Some premium plugins include pre-built public agent templates — ready-made configurations for customer-facing agents. When you enable the plugin, {{productName}} shows you what templates are available and offers to create agents from them. You review and approve every file before the agent is created. The template is a starting point — you can edit the identity, personality, plugins, and settings to make it yours. The result is a standard public agent, indistinguishable from one you created from scratch.
|
|
71
71
|
|
|
72
72
|
Some premium plugins ship pre-built workflows that are created when the plugin is enabled. These workflows are fully yours — you can inspect, edit, run, and manage them through conversation, exactly like workflows you create yourself. The plugin provides the starting point; you own the result.
|
|
73
73
|
|
|
74
74
|
## Choosing Plugins
|
|
75
75
|
|
|
76
|
-
During first-time setup,
|
|
76
|
+
During first-time setup, {{productName}} presents a plugin selection screen where you choose which plugins to activate. Core plugins are pre-selected and locked. Recommended plugins are pre-selected but optional. You can change your mind later.
|
|
77
77
|
|
|
78
78
|
## Adding or Removing Plugins
|
|
79
79
|
|
|
80
|
-
Tell
|
|
80
|
+
Tell {{productName}}:
|
|
81
81
|
|
|
82
82
|
- "Enable the Telegram plugin"
|
|
83
83
|
- "Add the Stripe plugin"
|
|
84
84
|
- "Disable the waitlist plugin"
|
|
85
85
|
|
|
86
|
-
|
|
86
|
+
{{productName}} handles the installation or removal. If the plugin requires any setup (API keys, bot tokens, configuration), {{productName}} will walk you through it.
|
|
87
87
|
|
|
88
88
|
## Viewing Your Plugins
|
|
89
89
|
|
|
90
|
-
Ask
|
|
90
|
+
Ask {{productName}}: "What plugins do I have?" or "List my plugins."
|
|
91
|
+
|
|
92
|
+
## Brand Templating (for plugin and skill authors)
|
|
93
|
+
|
|
94
|
+
Skill content, plugin manifests, agent templates, and reference files reference the operator-visible brand name only via the literal `{{productName}}` placeholder. The platform substitutes from `brand.json.productName` at read time — Maxy installs render `Maxy`, Real Agent installs render `Real Agent`, all from the same source content.
|
|
95
|
+
|
|
96
|
+
**Author rule:** never write the literal string `Maxy` (or any brand name) in shipped skill, plugin, or template content. Use `{{productName}}` whenever the operator should see the brand name. The audit grep `grep -rn "\bMaxy\b" platform/plugins/admin/skills/ platform/plugins/*/skills/ platform/templates/agents/` must return zero matches; a literal brand name is a defect, not a stylistic choice.
|
|
97
|
+
|
|
98
|
+
The runtime substitution happens at the read sites that flow content into a system prompt or operator-visible UI (admin agent's `plugin-read` tool, public agent's recursive plugin assembly, IDENTITY/SOUL/AGENTS/KNOWLEDGE markdown reads). Missing or empty `productName` hard-fails — there is no fallback to a default brand string. See [.docs/agents.md](../../.docs/agents.md) § "Brand templating" for the full contract.
|
|
91
99
|
|
|
92
100
|
## MCP Plugin Observability (for plugin authors)
|
|
93
101
|
|
|
@@ -8,13 +8,13 @@ Projects are ideal when the user has work involving multiple people, sequential
|
|
|
8
8
|
|
|
9
9
|
## Creating a Project
|
|
10
10
|
|
|
11
|
-
Tell
|
|
11
|
+
Tell {{productName}} naturally:
|
|
12
12
|
|
|
13
13
|
- "Create a project for Mrs. Chen's kitchen refit — strip the old kitchen, plumbing first fix, electrical first fix, install units, then tiling and finishing"
|
|
14
14
|
- "Set up a project for the bathroom renovation, standard tier, due by end of June"
|
|
15
15
|
- "Start a project: boiler install for Sarah Thompson, quick job, just order parts, install, and test"
|
|
16
16
|
|
|
17
|
-
|
|
17
|
+
{{productName}} creates the project and all work items in one step. Dependencies between steps (e.g., "install units after plumbing and electrical") are set up automatically based on the order and relationships you describe.
|
|
18
18
|
|
|
19
19
|
Each project has a tier that reflects its complexity:
|
|
20
20
|
- **Quick** — straightforward, few steps (e.g., boiler install)
|
|
@@ -30,32 +30,32 @@ Ask naturally:
|
|
|
30
30
|
- "Show me the Davies bathroom project"
|
|
31
31
|
- "What should I focus on?"
|
|
32
32
|
|
|
33
|
-
|
|
33
|
+
{{productName}} shows project health at a glance:
|
|
34
34
|
- **Green** — on track, no issues
|
|
35
35
|
- **Amber** — warning signs (overdue task or blocker)
|
|
36
36
|
- **Red** — at risk (multiple overdue, critical blocker, or stale)
|
|
37
37
|
|
|
38
|
-
When you start a new conversation,
|
|
38
|
+
When you start a new conversation, {{productName}} automatically shows active project summaries so you know where things stand without asking.
|
|
39
39
|
|
|
40
40
|
## Updating a Project
|
|
41
41
|
|
|
42
|
-
Tell
|
|
42
|
+
Tell {{productName}} when things change:
|
|
43
43
|
|
|
44
44
|
- "Move the kitchen refit to the active phase"
|
|
45
45
|
- "The materials for the kitchen refit are delayed by a week"
|
|
46
46
|
- "Update the Davies bathroom target date to July 15th"
|
|
47
47
|
- "Change the boiler install to a standard tier — it's more complex than we thought"
|
|
48
48
|
|
|
49
|
-
|
|
49
|
+
{{productName}} records phase changes and issues as part of the project's history, creating an audit trail.
|
|
50
50
|
|
|
51
51
|
## Completing a Project
|
|
52
52
|
|
|
53
|
-
Tell
|
|
53
|
+
Tell {{productName}}:
|
|
54
54
|
|
|
55
55
|
- "Mark the boiler install as done"
|
|
56
56
|
- "Complete the kitchen refit project"
|
|
57
57
|
|
|
58
|
-
If any work items are still pending,
|
|
58
|
+
If any work items are still pending, {{productName}} will let you know and ask how to handle them — cancel, defer, or keep working on them.
|
|
59
59
|
|
|
60
60
|
## Abandoning a Project
|
|
61
61
|
|
|
@@ -64,10 +64,10 @@ If a project is no longer needed:
|
|
|
64
64
|
- "Abandon the Davies bathroom — client cancelled"
|
|
65
65
|
- "Stop the kitchen refit project"
|
|
66
66
|
|
|
67
|
-
|
|
67
|
+
{{productName}} records the reason and marks the project as abandoned.
|
|
68
68
|
|
|
69
69
|
## Projects vs. Tasks
|
|
70
70
|
|
|
71
71
|
Use a **task** for standalone work — a single action, a reminder, a follow-up. Use a **project** when the work has multiple steps that depend on each other, a client or stakeholder, and a lifecycle that progresses through phases.
|
|
72
72
|
|
|
73
|
-
When you describe multi-step work,
|
|
73
|
+
When you describe multi-step work, {{productName}} will ask if you'd like to structure it as a project. Over time, it learns your preference and stops asking.
|
|
@@ -2,36 +2,36 @@
|
|
|
2
2
|
|
|
3
3
|
## Output Style
|
|
4
4
|
|
|
5
|
-
Controls how
|
|
5
|
+
Controls how {{productName}} communicates with you.
|
|
6
6
|
|
|
7
7
|
| Style | Behaviour |
|
|
8
8
|
|-------|-----------|
|
|
9
9
|
| `default` | Concise, direct responses — gets to the point |
|
|
10
10
|
| `explanatory` | More detailed responses with educational context — explains reasoning and trade-offs |
|
|
11
11
|
|
|
12
|
-
**Changing output style:** Tell
|
|
12
|
+
**Changing output style:** Tell {{productName}} "Switch to explanatory mode" or "Use default output style."
|
|
13
13
|
|
|
14
14
|
Changes take effect on the next session. The current session continues with the existing style.
|
|
15
15
|
|
|
16
16
|
## Effort Level
|
|
17
17
|
|
|
18
|
-
Controls how much work
|
|
18
|
+
Controls how much work {{productName}} puts into each task — specifically, how many steps it takes before stopping and checking with you.
|
|
19
19
|
|
|
20
20
|
| Level | Max turns | Use when |
|
|
21
21
|
|-------|-----------|----------|
|
|
22
22
|
| `low` | 5 | Quick questions, simple lookups |
|
|
23
23
|
| `medium` | 10 | Standard tasks — most daily use |
|
|
24
24
|
| `high` | 20 | Complex multi-step tasks |
|
|
25
|
-
| `auto` | 20 | Let
|
|
25
|
+
| `auto` | 20 | Let {{productName}} decide (same ceiling as high) |
|
|
26
26
|
| `max` | 40 | Long autonomous workflows |
|
|
27
27
|
|
|
28
|
-
**Changing effort level:** Tell
|
|
28
|
+
**Changing effort level:** Tell {{productName}} "Set effort to high" or "Use low effort mode."
|
|
29
29
|
|
|
30
30
|
Changes take effect on the next session.
|
|
31
31
|
|
|
32
32
|
## Thinking View
|
|
33
33
|
|
|
34
|
-
Controls how
|
|
34
|
+
Controls how {{productName}}'s thinking process is displayed in the chat.
|
|
35
35
|
|
|
36
36
|
| Mode | Behaviour |
|
|
37
37
|
|------|-----------|
|
|
@@ -39,25 +39,25 @@ Controls how Maxy's thinking process is displayed in the chat.
|
|
|
39
39
|
| `expanded` | Everything shown expanded — thinking, tool use, and results |
|
|
40
40
|
| `collapsed` | Everything collapsed — compact view, expand on tap |
|
|
41
41
|
|
|
42
|
-
**Changing thinking view:** Tell
|
|
42
|
+
**Changing thinking view:** Tell {{productName}} "Show thinking by default", "Show everything expanded", or "Hide thinking."
|
|
43
43
|
|
|
44
44
|
Changes take effect on the next session.
|
|
45
45
|
|
|
46
46
|
## Viewing Current Settings
|
|
47
47
|
|
|
48
|
-
Ask
|
|
48
|
+
Ask {{productName}}: "What are my current settings?" or "What output style am I using?"
|
|
49
49
|
|
|
50
50
|
## Default Agent
|
|
51
51
|
|
|
52
52
|
Controls which public agent serves the root URL (`/`). Visitors who go to your public site without specifying an agent slug see this agent.
|
|
53
53
|
|
|
54
|
-
**Changing the default agent:** Tell
|
|
54
|
+
**Changing the default agent:** Tell {{productName}} "Make sales the default agent" or "Set the default to support."
|
|
55
55
|
|
|
56
56
|
The change takes effect on the next page load. The previous default agent remains accessible at its `/{slug}` URL.
|
|
57
57
|
|
|
58
58
|
## Account Preferences
|
|
59
59
|
|
|
60
|
-
You can ask
|
|
60
|
+
You can ask {{productName}} to show or change any of the following:
|
|
61
61
|
|
|
62
62
|
- Default agent (which public agent serves the root URL)
|
|
63
63
|
- Admin model (which Claude model powers the admin agent)
|
|
@@ -67,10 +67,10 @@ You can ask Maxy to show or change any of the following:
|
|
|
67
67
|
- Context mode
|
|
68
68
|
- Enabled plugins
|
|
69
69
|
|
|
70
|
-
Tell
|
|
70
|
+
Tell {{productName}} what you want to change and it handles the rest.
|
|
71
71
|
|
|
72
72
|
## PIN
|
|
73
73
|
|
|
74
|
-
Your admin PIN is set during initial setup. To change it, ask
|
|
74
|
+
Your admin PIN is set during initial setup. To change it, ask {{productName}}: "Change my admin PIN."
|
|
75
75
|
|
|
76
|
-
|
|
76
|
+
{{productName}} will ask for your current PIN to verify, then set the new one.
|
|
@@ -2,11 +2,11 @@
|
|
|
2
2
|
|
|
3
3
|
## What the Telegram Plugin Does
|
|
4
4
|
|
|
5
|
-
The Telegram plugin connects
|
|
5
|
+
The Telegram plugin connects {{productName}} to a Telegram bot. Once set up, you can:
|
|
6
6
|
|
|
7
|
-
- Send messages to individuals or groups via
|
|
8
|
-
- Receive messages from your Telegram bot and have
|
|
9
|
-
- Use Telegram as a channel for
|
|
7
|
+
- Send messages to individuals or groups via {{productName}} ("Send a message to the team: standup in 10 minutes")
|
|
8
|
+
- Receive messages from your Telegram bot and have {{productName}} respond
|
|
9
|
+
- Use Telegram as a channel for {{productName}} notifications and alerts
|
|
10
10
|
|
|
11
11
|
## Setup
|
|
12
12
|
|
|
@@ -19,39 +19,39 @@ The Telegram plugin connects Maxy to a Telegram bot. Once set up, you can:
|
|
|
19
19
|
|
|
20
20
|
### Step 2: Connect the plugin
|
|
21
21
|
|
|
22
|
-
Tell
|
|
22
|
+
Tell {{productName}}: "Set up Telegram" or "Configure the Telegram bot."
|
|
23
23
|
|
|
24
|
-
|
|
24
|
+
{{productName}} will ask for your bot token, then save it and activate the plugin. The bot is now connected.
|
|
25
25
|
|
|
26
26
|
### Step 3: Start the bot
|
|
27
27
|
|
|
28
28
|
In Telegram, open your bot and send `/start`. The bot is now active and listening.
|
|
29
29
|
|
|
30
|
-
## Sending Messages via
|
|
30
|
+
## Sending Messages via {{productName}}
|
|
31
31
|
|
|
32
|
-
Once connected, tell
|
|
32
|
+
Once connected, tell {{productName}} to send messages on your behalf:
|
|
33
33
|
|
|
34
34
|
- "Send a Telegram message to John: I'll be 10 minutes late"
|
|
35
35
|
- "Message the team channel: server maintenance at 11pm"
|
|
36
36
|
- "Tell Sarah via Telegram that the proposal is ready"
|
|
37
37
|
|
|
38
|
-
|
|
38
|
+
{{productName}} needs a chat ID or username to target a specific person or group. For groups, you'll need to add the bot to the group first.
|
|
39
39
|
|
|
40
40
|
## Getting a Chat ID
|
|
41
41
|
|
|
42
|
-
To message a specific person or group,
|
|
42
|
+
To message a specific person or group, {{productName}} needs their chat ID. The easiest way:
|
|
43
43
|
|
|
44
44
|
1. Have the person (or yourself) send any message to your bot
|
|
45
|
-
2. Ask
|
|
46
|
-
3.
|
|
45
|
+
2. Ask {{productName}}: "What chat IDs have messaged the bot recently?"
|
|
46
|
+
3. {{productName}} will look up the message history and show you the IDs
|
|
47
47
|
|
|
48
48
|
## Message History
|
|
49
49
|
|
|
50
|
-
Ask
|
|
50
|
+
Ask {{productName}}: "What messages has the bot received?" or "Show recent Telegram activity."
|
|
51
51
|
|
|
52
52
|
## Troubleshooting
|
|
53
53
|
|
|
54
|
-
**Bot not responding:** Check that the bot token is correct — ask
|
|
54
|
+
**Bot not responding:** Check that the bot token is correct — ask {{productName}} "What's my Telegram bot token configured as?" and verify it matches BotFather.
|
|
55
55
|
|
|
56
56
|
**Can't send to a group:** The bot must be a member of the group. Add it via the group settings in Telegram, then try again.
|
|
57
57
|
|
|
@@ -33,8 +33,8 @@ tail -200 ~/.maxy/logs/maxy-ui.log | rg '\[remote-auth\].*resolvedKind='
|
|
|
33
33
|
**Symptom:** You send a message and nothing comes back, or the response never arrives.
|
|
34
34
|
|
|
35
35
|
**Check:**
|
|
36
|
-
1. Ask
|
|
37
|
-
2. Check the platform logs: ask
|
|
36
|
+
1. Ask {{productName}}: "Check system status" — the `system-status` tool will report whether all services are running
|
|
37
|
+
2. Check the platform logs: ask {{productName}} "Show me the recent logs"
|
|
38
38
|
3. If the admin agent itself won't start: restart the platform (see below)
|
|
39
39
|
|
|
40
40
|
**Common causes:**
|
|
@@ -46,15 +46,15 @@ tail -200 ~/.maxy/logs/maxy-ui.log | rg '\[remote-auth\].*resolvedKind='
|
|
|
46
46
|
|
|
47
47
|
## Memory Not Working
|
|
48
48
|
|
|
49
|
-
**Symptom:**
|
|
49
|
+
**Symptom:** {{productName}} doesn't remember things you've told it, or search returns nothing.
|
|
50
50
|
|
|
51
51
|
**Check:**
|
|
52
|
-
1. Ask
|
|
53
|
-
2. Ask
|
|
52
|
+
1. Ask {{productName}}: "Check the Neo4j connection"
|
|
53
|
+
2. Ask {{productName}}: "Search memory for [something you know was stored]"
|
|
54
54
|
|
|
55
55
|
**Common causes:**
|
|
56
56
|
- Neo4j service stopped — restart the platform, which restarts Neo4j
|
|
57
|
-
- Memory index is stale — ask
|
|
57
|
+
- Memory index is stale — ask {{productName}}: "Reindex memory"
|
|
58
58
|
|
|
59
59
|
---
|
|
60
60
|
|
|
@@ -63,12 +63,12 @@ tail -200 ~/.maxy/logs/maxy-ui.log | rg '\[remote-auth\].*resolvedKind='
|
|
|
63
63
|
**Symptom:** You send a message to the bot and nothing happens.
|
|
64
64
|
|
|
65
65
|
**Check:**
|
|
66
|
-
1. Confirm the bot token is correct: ask
|
|
66
|
+
1. Confirm the bot token is correct: ask {{productName}} "What Telegram bot token is configured?"
|
|
67
67
|
2. Verify the bot is running: send `/start` to the bot in Telegram
|
|
68
|
-
3. Check the MCP server logs: ask
|
|
68
|
+
3. Check the MCP server logs: ask {{productName}} "Show Telegram plugin logs"
|
|
69
69
|
|
|
70
70
|
**Common causes:**
|
|
71
|
-
- Bot token changed (if you regenerated it in BotFather) — update it by telling
|
|
71
|
+
- Bot token changed (if you regenerated it in BotFather) — update it by telling {{productName}} "Update my Telegram bot token"
|
|
72
72
|
- Webhook not connected — restart the platform
|
|
73
73
|
|
|
74
74
|
---
|
|
@@ -78,46 +78,46 @@ tail -200 ~/.maxy/logs/maxy-ui.log | rg '\[remote-auth\].*resolvedKind='
|
|
|
78
78
|
**Symptom:** A tool fails with an error, or a plugin says it can't connect.
|
|
79
79
|
|
|
80
80
|
**Check:**
|
|
81
|
-
1. Ask
|
|
82
|
-
2. Ask
|
|
81
|
+
1. Ask {{productName}}: "Show me recent errors"
|
|
82
|
+
2. Ask {{productName}}: "Restart the [plugin name] plugin"
|
|
83
83
|
|
|
84
84
|
**Common causes:**
|
|
85
|
-
- Missing environment variable (API key, token) — the error message will name it; ask
|
|
85
|
+
- Missing environment variable (API key, token) — the error message will name it; ask {{productName}} to help configure it
|
|
86
86
|
- MCP server crashed — restarting the platform restarts all MCP servers
|
|
87
87
|
|
|
88
88
|
---
|
|
89
89
|
|
|
90
90
|
## Restarting the Platform
|
|
91
91
|
|
|
92
|
-
From the admin interface, ask
|
|
92
|
+
From the admin interface, ask {{productName}}: "Restart the platform."
|
|
93
93
|
|
|
94
|
-
If
|
|
94
|
+
If {{productName}} itself isn't responding (the page loads but the agent won't connect), try refreshing the browser. If the page itself won't load, the platform process may have stopped — power-cycle the Raspberry Pi by unplugging and reconnecting power, then wait a minute for services to restart automatically.
|
|
95
95
|
|
|
96
96
|
---
|
|
97
97
|
|
|
98
98
|
## Checking Logs
|
|
99
99
|
|
|
100
|
-
Ask
|
|
100
|
+
Ask {{productName}}: "Show me the logs" or "Show errors from the last hour."
|
|
101
101
|
|
|
102
102
|
For specific plugin logs: "Show Telegram logs" or "Show contacts plugin logs."
|
|
103
103
|
|
|
104
|
-
|
|
104
|
+
{{productName}} has access to all platform logs and can filter them for you.
|
|
105
105
|
|
|
106
106
|
---
|
|
107
107
|
|
|
108
108
|
## Cloudflare Tunnel Down (Remote Access Broken)
|
|
109
109
|
|
|
110
|
-
**Symptom:** You can reach
|
|
110
|
+
**Symptom:** You can reach {{productName}} on your local network but not via your public domain.
|
|
111
111
|
|
|
112
|
-
**Check:** Ask
|
|
112
|
+
**Check:** Ask {{productName}} "Check the Cloudflare tunnel status."
|
|
113
113
|
|
|
114
|
-
**Fix:** Ask
|
|
114
|
+
**Fix:** Ask {{productName}} "Restart the Cloudflare tunnel."
|
|
115
115
|
|
|
116
|
-
If the tunnel won't reconnect, re-run the Cloudflare setup: ask
|
|
116
|
+
If the tunnel won't reconnect, re-run the Cloudflare setup: ask {{productName}} "Reconnect Cloudflare."
|
|
117
117
|
|
|
118
|
-
If the initial Cloudflare login fails during setup,
|
|
118
|
+
If the initial Cloudflare login fails during setup, {{productName}} will fall back to asking you for a connection key. You can create one in the Cloudflare dashboard ({{productName}} will guide you through this in the browser).
|
|
119
119
|
|
|
120
|
-
**If you switched Cloudflare accounts or are stuck on the wrong one:** ask
|
|
120
|
+
**If you switched Cloudflare accounts or are stuck on the wrong one:** ask {{productName}} "Reset my Cloudflare login and start over." This is a clean reset — {{productName}} clears every stored credential, then opens a fresh browser sign-in. The next sign-in binds to whichever Cloudflare account you choose, with no risk of the previous account's stored credentials silently coming back.
|
|
121
121
|
|
|
122
122
|
---
|
|
123
123
|
|
|
@@ -269,7 +269,7 @@ Most common failures and fixes:
|
|
|
269
269
|
|
|
270
270
|
## Terminal fails after upgrade — `Invalid response` or `window absent from target display`
|
|
271
271
|
|
|
272
|
-
**Symptom:** You upgraded a
|
|
272
|
+
**Symptom:** You upgraded a {{productName}} device and the header-menu **Terminal** click now fails — overlay shows `Invalid response`, or `terminal-launch.log` shows `[terminal-launch] failed err="window absent from target display after spawn" pid=<N> display=:99 observed_windows=0 transport=vnc cmd="/usr/bin/xterm "`. The terminal worked on the previous version and the upgrade reported success.
|
|
273
273
|
|
|
274
274
|
**What it means:** The installer declared a new apt dep between versions (e.g. `xdotool` in 1.0.667), but on your device the installer's apt step was silently skipped because `sudo` requires a password and the installer could not escalate non-interactively. The declared dep was never installed, and `vnc.sh check_window_on_display` then either failed to find the binary (exit 127 — Task 634 now surfaces this as a distinct `failed err="xdotool not installed — re-run installer to repair"` line) or reached the `window absent` path because its preflight tool was missing. See `.docs/deployment.md` ("sudo interactivity contract") for the full mechanism.
|
|
275
275
|
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: linkedin-import
|
|
3
|
-
description: Import a LinkedIn Basic Data Export into a
|
|
3
|
+
description: Import a LinkedIn Basic Data Export into a {{productName}} Neo4j graph. Triggers when the user asks to import a LinkedIn archive, ingest LinkedIn connections/messages/positions into the graph, or mentions a `Basic_LinkedInDataExport_*.zip` folder. One reference per CSV under `references/`; edges come from what each CSV naturally encodes, never from synthetic "anchor" patterns.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# LinkedIn Import
|
|
7
7
|
|
|
8
|
-
Ingests a LinkedIn Basic Data Export (unzipped directory of CSVs + subdirs) into a
|
|
8
|
+
Ingests a LinkedIn Basic Data Export (unzipped directory of CSVs + subdirs) into a {{productName}} Neo4j graph. Every edge written corresponds to a real relationship expressed by the data — not a convenience anchor.
|
|
9
9
|
|
|
10
10
|
## Archive-owner confirmation (mandatory first step)
|
|
11
11
|
|
|
@@ -17,7 +17,7 @@ The confirmation flow:
|
|
|
17
17
|
|
|
18
18
|
1. List every `:AdminUser` in the graph and display each as `{userId, name, createdAt, accountId(s) via ADMIN_OF}`.
|
|
19
19
|
2. Ask the operator to name the archive owner. Accept one of:
|
|
20
|
-
- An existing AdminUser userId from the list (typical — Joel's own archive, or a partner who is already a
|
|
20
|
+
- An existing AdminUser userId from the list (typical — Joel's own archive, or a partner who is already a {{productName}} operator).
|
|
21
21
|
- A new external Person identity (not-yet-an-AdminUser) — create a fresh `:Person` with `givenName`, `familyName`, `email`/`telephone` (at least one) and use its `elementId` as the owner anchor. This path covers ingesting a non-operator's archive for reference.
|
|
22
22
|
3. Echo the chosen owner back verbatim (`userId=<id> name=<name>`) and require explicit yes/no confirmation before any CSV is touched.
|
|
23
23
|
4. Persist the confirmed owner as `$ownerUserId` (for AdminUser-type owners) or `$ownerPersonId` (for external Person owners) — this parameter flows into every reference.
|
|
@@ -32,7 +32,7 @@ When the owner is an AdminUser (the common case):
|
|
|
32
32
|
(:AdminUser {userId: $ownerUserId}) -[:HAS_PROFILE]-> (:UserProfile {accountId, userId})
|
|
33
33
|
```
|
|
34
34
|
|
|
35
|
-
Both nodes already exist for any
|
|
35
|
+
Both nodes already exist for any {{productName}} operator — the HAS_PROFILE edge is MERGEd by [`platform/ui/app/lib/neo4j-store.ts`](../../../../ui/app/lib/neo4j-store.ts) at session start. The LinkedIn import updates these existing nodes; it does not create parallel operator identities.
|
|
36
36
|
|
|
37
37
|
- **Identity + account-scoped behaviour** → `:AdminUser` and `:UserProfile` (existing, unchanged).
|
|
38
38
|
- **LinkedIn profile enrichment** (headline, summary, websites, industry, geoLocation) → property updates on `:UserProfile`.
|
|
@@ -45,14 +45,14 @@ When the owner is an external Person (non-operator archive), the anchor is the c
|
|
|
45
45
|
1. **Schema first.** The LinkedIn additions (`person_linkedin_url` index, `:Credential` constraint) live in [`platform/neo4j/schema.cypher`](../../../../neo4j/schema.cypher) and are applied by `platform/scripts/seed-neo4j.sh` on every install / upgrade. The skill assumes the schema has been seeded; it does not bootstrap schema itself. If a constraint or index is missing, the operator re-runs `seed-neo4j.sh` from the installer — schema-bootstrap is installer-side, never agent-side.
|
|
46
46
|
2. **Owner confirmed first.** No reference runs until `$ownerUserId` (or `$ownerPersonId`) is persisted and echo-confirmed. The reference set is parameterised — no hard-coded owner.
|
|
47
47
|
3. **Natural edges only.** Every edge written is one the CSV actually expresses. `Connections.csv` encodes "I am connected on LinkedIn to this person" — that becomes `CONNECTED_ON_LINKEDIN`. No synthetic attach-to-owner pattern bolted onto rows that don't describe a relationship to the owner.
|
|
48
|
-
4. **Reuse
|
|
48
|
+
4. **Reuse {{productName}} labels.** Schema-extension is last resort. The LinkedIn set maps onto existing labels wherever semantics align:
|
|
49
49
|
- LinkedIn companies → `:Organization` (existing, memory-write registered).
|
|
50
50
|
- LinkedIn schools → `:Organization` with `organizationCategory: 'educational'`.
|
|
51
51
|
- LinkedIn skills → `:DefinedTerm` with `category: 'linkedin-skill'`.
|
|
52
52
|
- LinkedIn articles → `:CreativeWork` with `category: 'linkedin-article'`.
|
|
53
53
|
- LinkedIn recommendations → `:Review`.
|
|
54
54
|
- LinkedIn DMs → `:Message:LinkedInMessage` + `:Conversation:LinkedInConversation` (sublabels on the existing labels, per Task 633 pattern).
|
|
55
|
-
- Certifications → `:Credential` (genuinely new — no existing
|
|
55
|
+
- Certifications → `:Credential` (genuinely new — no existing {{productName}} label fits `schema:EducationalOccupationalCredential`).
|
|
56
56
|
5. **Schema-base property names.** `givenName` / `familyName` / `telephone` / `dateSent` — not `firstName` / `phone` / `sentAt`. See [`platform/plugins/memory/references/schema-base.md`](../../../../plugins/memory/references/schema-base.md).
|
|
57
57
|
6. **Schema-base edge names.** `(:Person)-[:WORKS_FOR]->(:Organization)` for positions. Custom LinkedIn edges (`CONNECTED_ON_LINKEDIN`, `ENDORSED`) only where schema-base has no canonical name.
|
|
58
58
|
7. **Provenance stamp.** Every new node: `createdByAgent='linkedin-import'`, `createdBySource='linkedin-import'`, `createdBySession=$sessionId` (UUID per skill run), `createdAt=datetime()`, plus `source='linkedin'` as the data-origin marker.
|
package/payload/platform/plugins/linkedin-import/skills/linkedin-import/references/profile.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Reference: Profile.csv
|
|
2
2
|
|
|
3
|
-
Enriches the confirmed archive owner's `:UserProfile` with the LinkedIn profile fields. No new nodes, no new edges — `:AdminUser` and `:UserProfile` already exist for any
|
|
3
|
+
Enriches the confirmed archive owner's `:UserProfile` with the LinkedIn profile fields. No new nodes, no new edges — `:AdminUser` and `:UserProfile` already exist for any {{productName}} operator and are linked by `[:HAS_PROFILE]` at session start (neo4j-store handles that on session boot, not this skill).
|
|
4
4
|
|
|
5
5
|
Runs before every other reference because later files display LinkedIn profile fields (headline, summary) on the owner node they search.
|
|
6
6
|
|
|
@@ -46,7 +46,7 @@ This reference invokes `mcp__memory__memory-update` once with the parsed row's p
|
|
|
46
46
|
"address": null,
|
|
47
47
|
"birthDate": null,
|
|
48
48
|
"headline": "Founder, Rubytech",
|
|
49
|
-
"description": "Building
|
|
49
|
+
"description": "Building {{productName}} …",
|
|
50
50
|
"industry": "Software",
|
|
51
51
|
"postalCode": null,
|
|
52
52
|
"addressLocality": "London, UK",
|
|
@@ -5,7 +5,7 @@ description: Guide the user through connecting WhatsApp via QR code pairing, reg
|
|
|
5
5
|
|
|
6
6
|
# Connect WhatsApp
|
|
7
7
|
|
|
8
|
-
Conversational flow for linking a WhatsApp account to
|
|
8
|
+
Conversational flow for linking a WhatsApp account to {{productName}} via Baileys QR pairing, followed by admin phone registration and public agent selection. All three phases are required for a correctly configured WhatsApp channel.
|
|
9
9
|
|
|
10
10
|
## When to activate
|
|
11
11
|
|
|
@@ -25,7 +25,7 @@ Call `whatsapp-status` first to check the current state. If already connected, t
|
|
|
25
25
|
|
|
26
26
|
3. **Wait for scan** — call `whatsapp-login-wait`. This polls for up to 60 seconds. While waiting, tell the user you're watching for the scan.
|
|
27
27
|
|
|
28
|
-
4. **Confirm connection** — when pairing completes, the tool returns the linked phone number (the *self phone* — the WhatsApp account
|
|
28
|
+
4. **Confirm connection** — when pairing completes, the tool returns the linked phone number (the *self phone* — the WhatsApp account {{productName}} now controls). The platform automatically registers this phone as an admin phone and creates the WhatsApp config in `account.json`. Confirm: "WhatsApp connected as {phone}. Your phone is registered as admin."
|
|
29
29
|
|
|
30
30
|
5. **Verify** — call `whatsapp-status` to confirm the connection is live.
|
|
31
31
|
|
|
@@ -28,7 +28,11 @@ echo ""
|
|
|
28
28
|
|
|
29
29
|
# Neo4j connectivity check
|
|
30
30
|
echo -n "Checking Neo4j... "
|
|
31
|
-
NEO4J_URI
|
|
31
|
+
# NEO4J_URI is hard-required (Task 788). No default — set explicitly before running tests.
|
|
32
|
+
if [ -z "${NEO4J_URI:-}" ]; then
|
|
33
|
+
echo "Error: NEO4J_URI required (no default — see Task 788)" >&2
|
|
34
|
+
exit 1
|
|
35
|
+
fi
|
|
32
36
|
if ! nc -z "$(echo "$NEO4J_URI" | sed 's|.*://||;s|:.*||')" "$(echo "$NEO4J_URI" | sed 's|.*:||')" 2>/dev/null; then
|
|
33
37
|
echo "SKIP — Neo4j not reachable at $NEO4J_URI"
|
|
34
38
|
echo "Tests require Neo4j. Run on the Pi or start Neo4j locally."
|