@rubytech/create-maxy 1.0.740 → 1.0.742
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/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 +13 -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/memory/mcp/dist/lib/__tests__/llm-classifier.test.js +44 -5
- package/payload/platform/plugins/memory/mcp/dist/lib/__tests__/llm-classifier.test.js.map +1 -1
- package/payload/platform/plugins/memory/mcp/dist/lib/document-hierarchy.d.ts.map +1 -1
- package/payload/platform/plugins/memory/mcp/dist/lib/document-hierarchy.js +26 -5
- package/payload/platform/plugins/memory/mcp/dist/lib/document-hierarchy.js.map +1 -1
- package/payload/platform/plugins/memory/mcp/dist/lib/llm-classifier.d.ts.map +1 -1
- package/payload/platform/plugins/memory/mcp/dist/lib/llm-classifier.js +6 -1
- package/payload/platform/plugins/memory/mcp/dist/lib/llm-classifier.js.map +1 -1
- package/payload/platform/plugins/memory/mcp/dist/tools/memory-ingest.d.ts.map +1 -1
- package/payload/platform/plugins/memory/mcp/dist/tools/memory-ingest.js +4 -1
- package/payload/platform/plugins/memory/mcp/dist/tools/memory-ingest.js.map +1 -1
- package/payload/platform/plugins/memory/references/schema-base.md +7 -1
- package/payload/platform/plugins/memory/skills/document-ingest/SKILL.md +77 -19
- 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 +1 -0
- package/payload/platform/templates/specialists/agents/database-operator.md +27 -5
- 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",
|
|
@@ -1,7 +1,13 @@
|
|
|
1
1
|
import test from "node:test";
|
|
2
2
|
import assert from "node:assert/strict";
|
|
3
3
|
import { readFileSync, statSync } from "node:fs";
|
|
4
|
-
import { resolve } from "node:path";
|
|
4
|
+
import { dirname, resolve } from "node:path";
|
|
5
|
+
import { fileURLToPath } from "node:url";
|
|
6
|
+
// ESM equivalents of CommonJS __filename / __dirname — package.json carries
|
|
7
|
+
// "type": "module" so .js files compile to ESM and the CommonJS globals are
|
|
8
|
+
// not defined at runtime.
|
|
9
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
10
|
+
const __dirname = dirname(__filename);
|
|
5
11
|
// Regression coverage for Task 781 — memory-classify Haiku timeout cliff.
|
|
6
12
|
//
|
|
7
13
|
// The 60_000 ms default in `oauth-llm` fits short admin classifiers
|
|
@@ -16,10 +22,15 @@ import { resolve } from "node:path";
|
|
|
16
22
|
// verification step is literally `grep -n "timeoutMs" llm-classifier.ts
|
|
17
23
|
// returns 180_000`; this file formalises that grep so a future refactor
|
|
18
24
|
// that drops the override re-fails the test on `main` pre-fix.
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
25
|
+
// Tests read source files via grep, so paths must resolve to source whether
|
|
26
|
+
// the test runs from `src/lib/__tests__/` (tsx) or `dist/lib/__tests__/`
|
|
27
|
+
// (compiled). `__dirname` points to one or the other; walking up three levels
|
|
28
|
+
// reaches the memory MCP package root in either case.
|
|
29
|
+
const PACKAGE_ROOT = resolve(__dirname, "..", "..", "..");
|
|
30
|
+
const CLASSIFIER_PATH = resolve(PACKAGE_ROOT, "src/lib/llm-classifier.ts");
|
|
31
|
+
const OAUTH_LLM_PATH = resolve(PACKAGE_ROOT, "../../../lib/oauth-llm/src/index.ts");
|
|
32
|
+
const SKILL_MD_PATH = resolve(PACKAGE_ROOT, "../skills/document-ingest/SKILL.md");
|
|
33
|
+
const FIXTURE_PATH = resolve(PACKAGE_ROOT, "../../../../.docs/maxy_investor_thesis.md");
|
|
23
34
|
function readClassifier() {
|
|
24
35
|
return readFileSync(CLASSIFIER_PATH, "utf-8");
|
|
25
36
|
}
|
|
@@ -48,6 +59,34 @@ test("document-ingest SKILL.md Step 1 carries the chars→latency estimate", ()
|
|
|
48
59
|
// turnaround or a 90–180s one.
|
|
49
60
|
assert.match(source, /<5K[\s\S]*?5K.{0,10}10K[\s\S]*?10K.{0,10}20K[\s\S]*?>20K/, "SKILL.md Step 1 must declare the chars→latency estimate so the operator narrative names the expected wait window");
|
|
50
61
|
});
|
|
62
|
+
// ---------------------------------------------------------------------------
|
|
63
|
+
// Task 790 — classifier prompt must broaden documentEdges beyond contracts.
|
|
64
|
+
//
|
|
65
|
+
// Pre-Task 790, the prompt at line ~254 said: "Currently used for contracts:
|
|
66
|
+
// when a Parties section is detected, emit one or more { type: 'PARTY', … }
|
|
67
|
+
// entries." That gating made every multi-party document (meetings, calls,
|
|
68
|
+
// emails, voice-notes) ingest as an island anchored to one node, with no
|
|
69
|
+
// KD-level edge to the Persons/Organizations involved. The fix expands the
|
|
70
|
+
// prompt to a per-document-shape table naming all five edge types the writer
|
|
71
|
+
// now accepts (PARTY/PARTICIPANT/FROM/TO/CC/SPEAKER) so the classifier emits
|
|
72
|
+
// them on the right shape of document.
|
|
73
|
+
// ---------------------------------------------------------------------------
|
|
74
|
+
test("Task 790: classifier prompt no longer says 'Currently used for contracts'", () => {
|
|
75
|
+
const source = readClassifier();
|
|
76
|
+
assert.doesNotMatch(source, /Currently used for contracts/, "documentEdges instruction must not gate to contracts only — meetings/calls/emails/voice-notes need KD-level edges too");
|
|
77
|
+
});
|
|
78
|
+
test("Task 790: classifier prompt names every supported KD-level edge type", () => {
|
|
79
|
+
const source = readClassifier();
|
|
80
|
+
for (const edgeType of ["PARTY", "PARTICIPANT", "FROM", "TO", "CC", "SPEAKER"]) {
|
|
81
|
+
assert.match(source, new RegExp(`'${edgeType}'`), `documentEdges instruction must name '${edgeType}' so the classifier emits it on the matching document shape`);
|
|
82
|
+
}
|
|
83
|
+
});
|
|
84
|
+
test("Task 790: classifier prompt names every supported document shape", () => {
|
|
85
|
+
const source = readClassifier();
|
|
86
|
+
for (const shape of ["contract", "meeting", "email", "voice-note"]) {
|
|
87
|
+
assert.match(source, new RegExp(shape, "i"), `documentEdges instruction must name '${shape}' so the classifier picks the right edge type per shape`);
|
|
88
|
+
}
|
|
89
|
+
});
|
|
51
90
|
test("Task 781 fixture is still >=10K chars (regression anchor)", () => {
|
|
52
91
|
// The fixture is named in the brief so the same evidence shape can be
|
|
53
92
|
// re-run on demand. If it ever shrinks below 10K, this test fails loud
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"llm-classifier.test.js","sourceRoot":"","sources":["../../../src/lib/__tests__/llm-classifier.test.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACjD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"llm-classifier.test.js","sourceRoot":"","sources":["../../../src/lib/__tests__/llm-classifier.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"document-hierarchy.d.ts","sourceRoot":"","sources":["../../src/lib/document-hierarchy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"document-hierarchy.d.ts","sourceRoot":"","sources":["../../src/lib/document-hierarchy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAoC5C,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,wBAAsB,sBAAsB,CAC1C,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,OAAO,GACf,OAAO,CAAC,aAAa,CAAC,CAuExB"}
|