@awesomate/hosting-mcp 0.94.1 → 0.109.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +311 -48
- package/package.json +1 -1
- package/skill/CHANGELOG.json +185 -0
- package/skill/awesomate-email/SKILL.md +19 -0
- package/skill/awesomate-hosting/SKILL.md +19 -6
- package/skill/awesomate-hosting/references/connect-troubleshooting.md +7 -3
- package/skill/awesomate-hosting/references/multi-account.md +5 -3
- package/skill/awesomate-hosting/scripts/bootstrap.mjs +9 -6
- package/skill/awesomate-knowledge/SKILL.md +2 -1
- package/skill/awesomate-n8n/SKILL.md +15 -2
- package/skill/awesomate-n8n/evals/staff-alert/graders/grader.md +31 -0
- package/skill/awesomate-n8n/evals/staff-alert/prompt.md +3 -0
- package/skill/awesomate-n8n/references/staff-alerts.md +71 -0
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@awesomate/hosting-mcp",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.109.0",
|
|
4
4
|
"description": "Awesomate MCP server — lets Claude manage your Awesomate WordPress hosting, plan, limits, n8n automations, and build Node/static apps + databases",
|
|
5
5
|
"license": "UNLICENSED",
|
|
6
6
|
"type": "module",
|
package/skill/CHANGELOG.json
CHANGED
|
@@ -1,5 +1,190 @@
|
|
|
1
1
|
{
|
|
2
2
|
"versions": [
|
|
3
|
+
{
|
|
4
|
+
"version": "0.109.0",
|
|
5
|
+
"highlights": [
|
|
6
|
+
"Claude reads when a decision on a role is within its limits, so anyone in the role can answer it and the first answer decides it"
|
|
7
|
+
]
|
|
8
|
+
},
|
|
9
|
+
{
|
|
10
|
+
"version": "0.108.0",
|
|
11
|
+
"highlights": [
|
|
12
|
+
"Claude can say when a role's task goes to the person responsible for the role if nobody takes it (4 business hours), and that it did when nobody took it"
|
|
13
|
+
]
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
"version": "0.107.0",
|
|
17
|
+
"highlights": [
|
|
18
|
+
"Claude can take a task given to a role on the business map for the owner, when the owner is in that role, and sees who has taken a role's task"
|
|
19
|
+
]
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
"version": "0.106.0",
|
|
23
|
+
"highlights": [
|
|
24
|
+
"Claude reads the map's one suggested next step, which roles are ready to hand over (every process written down or automated) and the one line worth a look on each role, such as an automation that failed this week"
|
|
25
|
+
]
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
"version": "0.105.0",
|
|
29
|
+
"highlights": [
|
|
30
|
+
"Claude can link a role's process to the 1Brain page that writes it down and the agent or automation that does it, when it suggests a change to that role's responsibilities, and reads how many processes are written down and automated"
|
|
31
|
+
]
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
"version": "0.104.0",
|
|
35
|
+
"highlights": [
|
|
36
|
+
"When a customer writes to your support inbox asking to stop getting emails, Claude sees it on the ticket and offers to record it on their page (you have 5 business days)"
|
|
37
|
+
]
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
"version": "0.103.0",
|
|
41
|
+
"highlights": [
|
|
42
|
+
"Claude can see what points at a record (awesomate_crm_rows related): a customer's jobs, a job's notes, with how many and the newest, read as it reads them"
|
|
43
|
+
]
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
"version": "0.102.0",
|
|
47
|
+
"highlights": [
|
|
48
|
+
"Claude can keep a table in step with another system (awesomate_crm_write sync): it writes each record by that system's id, such as a Xero invoice number, so running the copy again changes the record instead of adding a second one",
|
|
49
|
+
"A record you archived stays archived: a sync never brings it back or makes a second copy"
|
|
50
|
+
]
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
"version": "0.101.3",
|
|
54
|
+
"highlights": [
|
|
55
|
+
"Claude knows your sub-departments by the names you give them and in your order, never by a number, and can suggest renaming, adding, reordering or removing one for you to accept in Tasks (where the new business map is on your account)"
|
|
56
|
+
]
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
"version": "0.101.2",
|
|
60
|
+
"highlights": [
|
|
61
|
+
"Email series work during a trial on Support Plus and above: instead of an upgrade prompt, the series page shows the sending steps still to do, next one first, and Claude walks you through them"
|
|
62
|
+
]
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
"version": "0.101.1",
|
|
66
|
+
"highlights": [
|
|
67
|
+
"Contacts answers use your business's time zone from Your business when Claude doesn't name one, so 'today' and 'this week' match your clock, not Sydney's"
|
|
68
|
+
]
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
"version": "0.101.0",
|
|
72
|
+
"highlights": [
|
|
73
|
+
"When someone asks you to stop emailing them, by reply, phone, in person or in writing, Claude can record it (awesomate_crm_contacts unsubscribe): every email, booking confirmations included, or just one list",
|
|
74
|
+
"It's recorded as the person's own request, at the time they asked, so a later import can't put them back on the list"
|
|
75
|
+
]
|
|
76
|
+
},
|
|
77
|
+
{
|
|
78
|
+
"version": "0.100.0",
|
|
79
|
+
"highlights": [
|
|
80
|
+
"Claude can mark a task urgent when you say it can't wait (a hot lead, a fault, a staff alert): it reaches the person's chats straight away, and in their quiet hours only the chat they chose to be woken in",
|
|
81
|
+
"Tasks Claude gives now reach people's chats within the quiet hours, order and daily limit each person sets in Tasks, Your places. Emails still come straight away",
|
|
82
|
+
"Building an n8n automation that tells someone on your team about a hot lead or a fault? Claude now uses a task, which reaches their chats, instead of an email or a text"
|
|
83
|
+
]
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
"version": "0.99.0",
|
|
87
|
+
"highlights": [
|
|
88
|
+
"Claude can add a field to your contact list (awesomate_crm_contacts create_field), in a section it may change; the hub names it, and never changes a field you already have",
|
|
89
|
+
"Whether Claude may read a new field is set once, when it's made, and only an Owner can make it readable (later, in Contacts, Your fields). A sensitive field is never readable by AI"
|
|
90
|
+
]
|
|
91
|
+
},
|
|
92
|
+
{
|
|
93
|
+
"version": "0.98.3",
|
|
94
|
+
"highlights": [
|
|
95
|
+
"While your Contacts is being moved to new servers, Claude says so and tries again a minute later, instead of reporting an error"
|
|
96
|
+
]
|
|
97
|
+
},
|
|
98
|
+
{
|
|
99
|
+
"version": "0.98.2",
|
|
100
|
+
"highlights": [
|
|
101
|
+
"The business map calls each department by its plain name (Sales, Finance, Team and systems), with its one-word verb only as a note, the same as the hub"
|
|
102
|
+
]
|
|
103
|
+
},
|
|
104
|
+
{
|
|
105
|
+
"version": "0.98.1",
|
|
106
|
+
"highlights": [
|
|
107
|
+
"Testing a record event now shows what your n8n answered: its status and the start of its reply",
|
|
108
|
+
"Writing a link as a field (customer_id) gets an answer naming the link to use, instead of 'no attribute customer_id'"
|
|
109
|
+
]
|
|
110
|
+
},
|
|
111
|
+
{
|
|
112
|
+
"version": "0.98.0",
|
|
113
|
+
"highlights": [
|
|
114
|
+
"awesomate_whoami shows your plan as the hub has it, not the one saved when this computer connected, so Claude and the hub always name the same plan"
|
|
115
|
+
]
|
|
116
|
+
},
|
|
117
|
+
{
|
|
118
|
+
"version": "0.97.0",
|
|
119
|
+
"highlights": [
|
|
120
|
+
"Claude can find your companies by name or ABN, add or update one without making it twice, and put a person under their company (awesomate_crm_companies)",
|
|
121
|
+
"Every ABN is checked against the Australian Taxation Office's rule before it is saved",
|
|
122
|
+
"A new table of your own can no longer be called company: Companies are built in, and your own tables can link to them"
|
|
123
|
+
]
|
|
124
|
+
},
|
|
125
|
+
{
|
|
126
|
+
"version": "0.96.1",
|
|
127
|
+
"highlights": [
|
|
128
|
+
"An n8n agent can go on a role on the business map by its n8n id (helper kind n8n_agent), so an agent built by hand in n8n sits on a role rather than only as a name"
|
|
129
|
+
]
|
|
130
|
+
},
|
|
131
|
+
{
|
|
132
|
+
"version": "0.96.0",
|
|
133
|
+
"highlights": [
|
|
134
|
+
"Claude can add, rename and remove what a record belongs to after its table exists (a vehicle's \"Serviced at\" job, say)",
|
|
135
|
+
"Removing a link is refused while a saved list, a record page layout, a query, a recipe, your app's assistant or an access rule still uses it, and Claude says which"
|
|
136
|
+
]
|
|
137
|
+
},
|
|
138
|
+
{
|
|
139
|
+
"version": "0.95.0",
|
|
140
|
+
"highlights": [
|
|
141
|
+
"Claude can find people in your contact list, add someone or change the person with an email address, and put tags on and take them off (awesomate_crm_contacts). Changes need Support Plus and above",
|
|
142
|
+
"Claude only changes contact fields it may read; anything you keep from AI or mark sensitive stays yours to change in the hub",
|
|
143
|
+
"Adding someone never signs them up to a list or emails them, but Claude checks with you before adding a tag that starts an email series",
|
|
144
|
+
"Claude can find records of any kind by the words in them (awesomate_crm_rows search), not only by exact filters"
|
|
145
|
+
]
|
|
146
|
+
},
|
|
147
|
+
{
|
|
148
|
+
"version": "0.94.7",
|
|
149
|
+
"highlights": [
|
|
150
|
+
"The Knowledge skill lists every setting the website chat's code takes, so Claude can change how the chat looks without guessing"
|
|
151
|
+
]
|
|
152
|
+
},
|
|
153
|
+
{
|
|
154
|
+
"version": "0.94.6",
|
|
155
|
+
"highlights": [
|
|
156
|
+
"When Claude reaches a limit, it says how many seconds to wait and tries once more after that, instead of guessing or looping",
|
|
157
|
+
"Reading your contacts has its own allowance of 120 a minute, so a busy session in Contacts never uses up the one for your automations"
|
|
158
|
+
]
|
|
159
|
+
},
|
|
160
|
+
{
|
|
161
|
+
"version": "0.94.5",
|
|
162
|
+
"highlights": [
|
|
163
|
+
"Before building an automation, Claude checks your n8n is answering and, if it isn't, tells you why (n8n still starting, the address not answering, or the saved key refused) instead of failing part way"
|
|
164
|
+
]
|
|
165
|
+
},
|
|
166
|
+
{
|
|
167
|
+
"version": "0.94.4",
|
|
168
|
+
"highlights": [
|
|
169
|
+
"If setting up Claude Code stops with ENOTEMPTY, the setup page says how to clear it and try again",
|
|
170
|
+
"If the SSH key couldn't be added during setup, Claude says to run the Connect command again once your hosting is ready, and never asks for an access token in the chat",
|
|
171
|
+
"When n8n's own tools say a credential must be set up by hand but the hub has already made it, Claude checks the node uses it and tells you the warning can be ignored"
|
|
172
|
+
]
|
|
173
|
+
},
|
|
174
|
+
{
|
|
175
|
+
"version": "0.94.3",
|
|
176
|
+
"highlights": [
|
|
177
|
+
"Claude can tell you which AI model writes a live knowledge agent's answers, and why: the agent's own model, your account's default, or your own OpenRouter key",
|
|
178
|
+
"Claude now says your account answers on Gemini Flash by default; Claude Sonnet is a choice on any plan and Claude Opus on Embedded"
|
|
179
|
+
]
|
|
180
|
+
},
|
|
181
|
+
{
|
|
182
|
+
"version": "0.94.2",
|
|
183
|
+
"highlights": [
|
|
184
|
+
"Every call Claude Code makes now tells the hub it came from Claude Code, so a change it makes in your records is recorded as made through Claude Code, not just with your key",
|
|
185
|
+
"Record events sent to your n8n now say what made a change with a key: \"you@example.com (mcp)\" for Claude Code and \"(sdk)\" for the SDK, where they all used to say \"(token)\". A workflow that checks for \"(token)\" needs to check for all three"
|
|
186
|
+
]
|
|
187
|
+
},
|
|
3
188
|
{
|
|
4
189
|
"version": "0.94.1",
|
|
5
190
|
"highlights": [
|
|
@@ -49,6 +49,10 @@ Work without it when:
|
|
|
49
49
|
owner sets it up at https://hub.awesomate.ai/contacts (it takes a few
|
|
50
50
|
seconds and sends nothing).
|
|
51
51
|
|
|
52
|
+
If it answers `503 crm_maintenance`, Contacts is being moved to new servers for a
|
|
53
|
+
few minutes and nothing is lost: say "Contacts is being moved. Back shortly.",
|
|
54
|
+
wait the time it gives, and try once more. It is not a reason to work without it.
|
|
55
|
+
|
|
52
56
|
Working without it means doing the expert work anyway (the plan, the groups,
|
|
53
57
|
the copy, a review of an exported CSV) and handing it over for the tool they
|
|
54
58
|
use today. Don't describe or promise features that aren't in your tool list.
|
|
@@ -276,6 +280,21 @@ such as the invoice number) so sending it twice records it once. For events
|
|
|
276
280
|
that should flow by themselves, an n8n workflow posts the same thing to
|
|
277
281
|
`POST /api/my-crm/v1/events` with the account's key.
|
|
278
282
|
|
|
283
|
+
Series work on Support Plus and above, **trials included**. Never tell a
|
|
284
|
+
trial owner to upgrade for a series. What a new account usually lacks is
|
|
285
|
+
sending set up, and the hub's series pages show the steps in order. When
|
|
286
|
+
the owner asks why their series won't go on, walk them through the same
|
|
287
|
+
steps: (1) agree to the email terms on **Contacts, Settings**; (2) add
|
|
288
|
+
their own domain on **Contacts, Sending** (or confirm the one suggested there),
|
|
289
|
+
which shows the DNS records to add at their DNS provider (DKIM CNAMEs, an
|
|
290
|
+
MX and an SPF record on the `bounce.` subdomain, a DMARC record and, where
|
|
291
|
+
shown, a `links.` CNAME, all under the sending subdomain, so the email
|
|
292
|
+
they already have is untouched); (3) wait for the check, which the hub
|
|
293
|
+
runs by itself; (4) we
|
|
294
|
+
switch sending on, with nothing for them to do. During a trial they can
|
|
295
|
+
send 250 marketing emails a month; service emails (booking reminders,
|
|
296
|
+
receipts) don't count towards that.
|
|
297
|
+
|
|
279
298
|
## 8. Moving off another platform
|
|
280
299
|
|
|
281
300
|
Bring the consent records, not just the addresses: sign-up time and source,
|
|
@@ -59,8 +59,10 @@ once (plus `awesomate_get_limits` before any create/change) and cache:
|
|
|
59
59
|
surface could not be detected), ask the user how they run Claude Code
|
|
60
60
|
rather than guessing steps. Never raise the update mid-task, never nag
|
|
61
61
|
twice in a session. If `serverVersion` is still older than
|
|
62
|
-
`latestMcpVersion` after a restart, the npx cache is stale
|
|
63
|
-
`rm -rf ~/.npm/_npx`, then restart again.
|
|
62
|
+
`latestMcpVersion` after a restart, the npx cache is stale: the remedy is
|
|
63
|
+
`rm -rf ~/.npm/_npx`, then restart again. The same remedy applies to ANY
|
|
64
|
+
npx run that stops with `ENOTEMPTY` (the Connect command included): clear
|
|
65
|
+
the cache, then run the same command again.
|
|
64
66
|
- **`cpanel`** routing (host/user), present once hosting is provisioned.
|
|
65
67
|
- **`features`**: `{contacts, email, knowledge, agents, tasks, reports, …}`, each
|
|
66
68
|
`{available, reason, message}`. Awesomate opens new features account by account,
|
|
@@ -146,8 +148,15 @@ What makes a good one, and the tokens to start from: the awesomate-app-builder s
|
|
|
146
148
|
|
|
147
149
|
When the owner asks what to automate, delegate or build next, read the
|
|
148
150
|
business map first: **`awesomate_business_map`** action `gaps` (or attach
|
|
149
|
-
`awesomate://business/map`). Every business has seven departments (
|
|
150
|
-
|
|
151
|
+
`awesomate://business/map`). Every business has seven departments (Strategy,
|
|
152
|
+
Team and systems, Sales, Finance, Delivery, Quality, Marketing), each with
|
|
153
|
+
sub-departments. Call a department by that plain name, never by its verb
|
|
154
|
+
(Envision, Form, Promise and so on). Each business names and orders its own
|
|
155
|
+
sub-departments and may add up to three of its own per department, so read a
|
|
156
|
+
sub-department's name from the map and never say its number (`subDepartmentNo`
|
|
157
|
+
is a key: 1 to 21 standard, 1001 and up the owner's own). When the owner wants
|
|
158
|
+
one renamed, added, reordered or removed, `propose` `subDepartment.rename`,
|
|
159
|
+
`subDepartment.add`, `subDepartment.order` or `subDepartment.remove`.
|
|
151
160
|
Inside them are **roles**, one person often holding several. The tool uses the
|
|
152
161
|
same words as the owner sees: `departmentNo` (1 to 7), `subDepartmentNo` and
|
|
153
162
|
`roleId`. The gaps say
|
|
@@ -258,7 +267,7 @@ MCP, so say that rather than stopping.
|
|
|
258
267
|
| `awesomate_wp_media_import` | Pull an image/file into the WP media library from an https URL (Support Plus+) |
|
|
259
268
|
| `awesomate_uninstall_site` | Remove a WordPress install (destructive — confirm explicitly) |
|
|
260
269
|
| `awesomate_privacy_settings` | Read which privacy/consent toggles are on — explain a 403 `consent_required` precisely (the user flips toggles themselves under Settings → Privacy at hub.awesomate.ai/settings?tab=privacy) |
|
|
261
|
-
| `awesomate_tasks` | What is waiting on the owner and their team (`list`), giving someone a task (`add`), changing one (`edit`), marking a task done (`done`, only what the user has done), dropping one (`drop`, confirm first), bringing a closed one back (`bring_back`), a task's record (`history`), putting a card off (`not_now` / `cancel_not_now`) and passing a card on (`pass_on`); quotes and approvals stay on their own hub pages, and `decisions` (plus one decision's `decision_record`) are read only: a person decides them in the hub |
|
|
270
|
+
| `awesomate_tasks` | What is waiting on the owner and their team (`list`), giving someone a task (`add`: emailed, and to their linked chats within their quiet hours and daily limit; `urgent: true` only when the user says it can't wait, such as a hot lead or a fault), changing one (`edit`), marking a task done (`done`, only what the user has done), dropping one (`drop`, confirm first), bringing a closed one back (`bring_back`), a task's record (`history`), putting a card off (`not_now` / `cancel_not_now`) and passing a card on (`pass_on`); quotes and approvals stay on their own hub pages, and `decisions` (plus one decision's `decision_record`) are read only: a person decides them in the hub |
|
|
262
271
|
| `awesomate_notifications` | The hub notification bell — `list` unread (quota warnings, quote ready, support-access events), `read`/`read_all` to clear |
|
|
263
272
|
| `awesomate_dashboard_metrics` | Account-wide numbers: executions by status, error rate, time saved, chat sessions, 7-day trend |
|
|
264
273
|
| `awesomate_account_report` | A monthly-report-shaped read: working / not working / engagement / commercials |
|
|
@@ -487,7 +496,11 @@ skill drive the Git workflow; this skill just deploys the result.
|
|
|
487
496
|
installed skills from the current package without redeeming a new setup
|
|
488
497
|
code. It also stores the token (chmod 600), **installs the skills into
|
|
489
498
|
`~/.claude/skills`**, registers the MCP server, and does best-effort SSH
|
|
490
|
-
setup (Support Plus+).
|
|
499
|
+
setup (Support Plus+). If it reports the SSH key was not added (usually
|
|
500
|
+
hosting still being set up), everything else works: once hosting is ready,
|
|
501
|
+
the user copies a fresh Connect command from hub.awesomate.ai/claude and
|
|
502
|
+
runs it again, which adds the key. Never ask for an access token in the
|
|
503
|
+
chat and never put one on a command line. Invocation + failure modes:
|
|
491
504
|
`references/connect-troubleshooting.md`.
|
|
492
505
|
- `ssh-connect.sh` — open a jailed SSH session (or run one remote command).
|
|
493
506
|
- `deploy-artifacts.sh <dev|staging|prod>` — manual deploy of a Node app when
|
|
@@ -43,9 +43,13 @@ Account, Your Claude Code.
|
|
|
43
43
|
with `NODE_USE_ENV_PROXY=1`. Diagnostic: `curl` works but `node -e "fetch(…)"`
|
|
44
44
|
403s → proxy bypass, not credentials.
|
|
45
45
|
- **Interrupted connect?** Setup codes are re-runnable for their whole
|
|
46
|
-
10-minute life (each run mints a fresh token),
|
|
47
|
-
|
|
48
|
-
|
|
46
|
+
10-minute life (each run mints a fresh token). After that, copy a fresh
|
|
47
|
+
Connect command from the hub and run it; never put a token on a command
|
|
48
|
+
line, where it lands in the chat and the shell history. Never tell the user
|
|
49
|
+
their code is spent unless the API literally said so.
|
|
50
|
+
- **`ENOTEMPTY` from npx**: a half-written npx cache, not an Awesomate
|
|
51
|
+
problem. Clear it with `rm -rf ~/.npm/_npx`, then run the same command
|
|
52
|
+
again. The bootstrap can't catch this itself: npx fails before it starts.
|
|
49
53
|
- **Nothing persists**: `~/.awesomate`, the skill copy, and the MCP
|
|
50
54
|
registration all vanish with the container. Treat a container connect as a
|
|
51
55
|
diagnosis/test, and tell the user a real workstation is needed for a lasting
|
|
@@ -13,9 +13,11 @@ missing profile is a **hard error, never a fallback** — that's deliberate.
|
|
|
13
13
|
|
|
14
14
|
## Verifying which account is active
|
|
15
15
|
|
|
16
|
-
`awesomate_whoami`
|
|
17
|
-
|
|
18
|
-
|
|
16
|
+
`awesomate_whoami` reports the connected account and why (`source`: a
|
|
17
|
+
`.awesomate.json` folder pin, `AWESOMATE_ACCOUNT`, the sole profile, or the
|
|
18
|
+
default profile). Its `plan` is the hub's (`planSource: "hub"`, one short read
|
|
19
|
+
the first time in a session); `planSource: "connect"` means the hub couldn't
|
|
20
|
+
be asked and the plan is the one recorded when this computer connected. Every subsequent tool response is stamped
|
|
19
21
|
`account: <slug> (source: …)` — treat a mismatch there the same as a wrong
|
|
20
22
|
whoami result.
|
|
21
23
|
|
|
@@ -12,12 +12,14 @@
|
|
|
12
12
|
*
|
|
13
13
|
* Usage (Claude runs this — the user doesn't touch a terminal):
|
|
14
14
|
* node bootstrap.mjs --code amt_bs_XXXX [--account <slug>] [--pin-dir <dir>] [--replace]
|
|
15
|
-
* node bootstrap.mjs --pat
|
|
15
|
+
* node bootstrap.mjs --pat <token> [--account <slug>] # resume: skip redeem
|
|
16
16
|
*
|
|
17
17
|
* --account asserts WHICH account this connect is for — mismatch aborts before
|
|
18
18
|
* anything is written. --pat resumes a half-finished bootstrap with an
|
|
19
|
-
* already-redeemed token
|
|
20
|
-
*
|
|
19
|
+
* already-redeemed token. It exists for support on the user's own machine and
|
|
20
|
+
* is never suggested in chat: a token on a command line lands in the
|
|
21
|
+
* transcript and shell history. Setup codes are replayable for their whole
|
|
22
|
+
* 10-minute life, and a fresh Connect command is always the advice.
|
|
21
23
|
*
|
|
22
24
|
* Proxied environments (cloud agent sandboxes): Node's built-in fetch ignores
|
|
23
25
|
* HTTP(S)_PROXY, so this script routes through undici's EnvHttpProxyAgent when
|
|
@@ -67,12 +69,12 @@ if (process.argv.includes('--update')) {
|
|
|
67
69
|
}
|
|
68
70
|
|
|
69
71
|
if (!resumePat && (!code || !code.startsWith('amt_bs_'))) {
|
|
70
|
-
console.error('Missing/invalid --code. Copy a fresh
|
|
72
|
+
console.error('Missing/invalid --code. Copy a fresh Connect command from hub.awesomate.ai/claude and run it again.');
|
|
71
73
|
console.error('AWESOMATE CONNECT: FAILED reason=bad-code');
|
|
72
74
|
process.exit(1);
|
|
73
75
|
}
|
|
74
76
|
if (resumePat && !resumePat.startsWith('amt_pat_')) {
|
|
75
|
-
console.error('
|
|
77
|
+
console.error('That is not an Awesomate access token. Copy a fresh Connect command from hub.awesomate.ai/claude and run it again.');
|
|
76
78
|
console.error('AWESOMATE CONNECT: FAILED reason=bad-pat');
|
|
77
79
|
process.exit(1);
|
|
78
80
|
}
|
|
@@ -586,7 +588,8 @@ async function main() {
|
|
|
586
588
|
console.log('• No ssh-keygen in this environment — skipping SSH setup. Deploy and shell need a real workstation; reads and management calls work fine here.');
|
|
587
589
|
} else {
|
|
588
590
|
console.log(`• SSH key not registered yet: ${err.message}`);
|
|
589
|
-
console.log(' Everything else is set up.
|
|
591
|
+
console.log(' Everything else is set up. Once your hosting is ready, copy a fresh Connect command from hub.awesomate.ai/claude and run it again: that adds the SSH key. Never paste an access token into the chat.');
|
|
592
|
+
console.log(' If your hosting never finishes setting up, contact Awesomate support.');
|
|
590
593
|
}
|
|
591
594
|
}
|
|
592
595
|
} else if (redeemed.keyKind === 'person_device') {
|
|
@@ -78,7 +78,7 @@ platform's answer beats anything you remember.
|
|
|
78
78
|
| Keep a File Manager folder (their n8n file system) synced into the knowledge base: `sync_rules` / `sync_rule_create` / `sync_rule_update` (change it, or `enabled:false` to switch it off) / `sync_rule_delete` / `sync_run` / `sync_state` on the sources tool; one file at a time via `awesomate_knowledge_upload {fromFilesPath}` (a spreadsheet needs `kind`, a folder rule `sheetKind`) | `awesomate_knowledge_sources`, `awesomate_knowledge_upload` |
|
|
79
79
|
| Instant search with facet counts (find WHAT is in there: moments, pages, datasets; free) | `awesomate_knowledge_search` |
|
|
80
80
|
| Ask a question → verified answer + numbered sources (accepts the same facet `filters` to ask within a slice) | `awesomate_knowledge_ask` |
|
|
81
|
-
| Agent persona
|
|
81
|
+
| Agent persona, fallback message and model tier: get and set (the single workspace default). Every account answers on Gemini Flash (`flash`) until the owner picks another; Claude Sonnet is a choice on any plan, Claude Opus on Embedded. Which model answers ONE live agent is its `effective_model` on `awesomate_knowledge_agents` list/get (absent while it is off, paused or has changes not live yet) | `awesomate_knowledge_agent` |
|
|
82
82
|
| Agent BUILDER: list / get / create (AI-drafted from their content, saved as a private draft; pass `audience:'public'` for anything customers will talk to; it then answers from sources marked public ONLY; ALWAYS scope it to the right collection with `collectionIds` and check `kinds`, since a drafted scope can read every collection, and relay the `warning` it returns) / update (edit the draft's instructions, grounding, no-answer message, audience and collection scope; nothing changes for callers until publish) / test the draft (ignores audience: NOT what the public sees) / visitor_test (the PUBLISHED agent as a website visitor gets it) / publish, suspend, resume, delete (explicit approval first) / `logs`, `answer_rates`, `where_used` / `ai_key_status`, `models` (read only: the AI key is saved in the hub) / customer-group access policies (`policies`, `policy_create`, `policy_update`, `policy_delete`, `policy_suspend`, `policy_resume`) | `awesomate_knowledge_agents` |
|
|
83
83
|
| People, places, topics: list / name / hide / merge / alias suggestions / re-run resolution / look one up by name (`explore`), who appears with it (`related`), open the passage behind a citation (`evidence`) | `awesomate_knowledge_people` |
|
|
84
84
|
| Business-data warehouse: `metrics` / `datasets` / `query` / `imports`: answer quantitative questions from their own imported business data (query is free-form but read-only); one `dataset`, `dataset_update` (name, column decisions), one `import`, and `import_action` (approve, reject, withdraw with confirm, reimport, answer), each after the owner's yes | `awesomate_knowledge_data` |
|
|
@@ -165,6 +165,7 @@ confirm:true}`, both after the owner's yes.
|
|
|
165
165
|
| **Test a DRAFT agent** (`action:'test'`) | `POST /api/knowledge/agents/:agent_id/chat` `{message, session_id?}`. There is **no** `/test` endpoint — guessing one returns 404. It ignores the agent's audience. |
|
|
166
166
|
| **Ask the PUBLISHED agent as a visitor** (`action:'visitor_test'`) | `POST /api/knowledge/agents/:agent_id/visitor-chat` `{message (max 2000), session_id?}`. 403 `upgrade_required` below the public-widget plan; an unanswered question lands in the Questions inbox. |
|
|
167
167
|
| **Website chat key** (`action:'website_key'`, `website_keys`, `revoke_website_key`; owner only, Support Plus and above) | `POST /api/knowledge/agents/keys` `{class:'p', agent_id, allowed_origins (https only, no path or wildcard), label?, request_id?, monthly_answer_cap?}` returns the key ONCE with its `monthly_answer_cap`; with no cap the hub sets half the account's monthly answers at that moment, and a key's cap cannot be changed later (a new limit is a new key). The tool refuses an agent that is not published, not public-audience, or paused. List with `GET /api/knowledge/agents/keys` (class `p`), revoke with `DELETE /api/knowledge/agents/keys/:key_id`. Every one only after the owner's yes. |
|
|
168
|
+
| **The website chat's code: every attribute it reads** | `<script src="…/widget/v1.js" data-key="amk_p_…" data-agent="<agent id>" …>` before `</body>`. Required: `data-key` (the website key; or `data-token` for a short-lived u token your own server mints for a signed-in member) and `data-agent`. Optional: `data-title` (the header, "Ask us" when left out), `data-sub` (one line under the title; offer it only where `features.website_subtitle` is available), `data-greeting` (first message), `data-placeholder` (the hint in the box), `data-accent` (#hex), `data-position` (`right`\|`left`), `data-mode` (`bubble`\|`inline`), `data-target` (CSS selector the inline panel goes in), `data-height` (inline height, e.g. `620px`), `data-theme` (`auto`\|`light`\|`dark`), `data-sources` (`on` shows numbered sources; hidden otherwise), `data-media` (`off` stops players), `data-session-suffix` (two chats on one page). Never set `data-api`. The hub's look editor writes title, sub, accent, greeting, position, theme and sources; `website_key` writes title and sub (`title`, `subtitle`). |
|
|
168
169
|
| Entity layer probe (`available` false = not enabled yet, stop) | `GET /api/knowledge/entities` |
|
|
169
170
|
| People list / detail | `GET /api/knowledge/people?status=named\|unknown\|hidden\|all` · `GET /api/knowledge/people/:id` — returns `{people, next_cursor}` and **no `counts` key**. |
|
|
170
171
|
| Entity COUNTS + availability | `GET /api/knowledge/entities` → `{available, counts: {...}}` — counts are nested under `counts`. Reading `people.counts?.x ?? 0` prints a confident row of zeros next to data that plainly exists. |
|
|
@@ -45,6 +45,13 @@ as outcomes ("your form now emails you") with URLs.
|
|
|
45
45
|
- `capabilities.variant`: FFMPEG variants have the media community
|
|
46
46
|
nodes; Standard does not. Never assume a node exists. Verify.
|
|
47
47
|
- `instance`: community packages + counts (your recon baseline).
|
|
48
|
+
- `health`: whether their n8n answered its API just now. If
|
|
49
|
+
`reachable` is false, tell the user n8n isn't answering, say
|
|
50
|
+
`last_error` in your own words, and stop before building anything:
|
|
51
|
+
every build step would fail the same way. `key_status: "invalid"`
|
|
52
|
+
means their n8n rejected the stored key: they create a new API key in
|
|
53
|
+
n8n and save it in n8n settings on the hub, then you re-check.
|
|
54
|
+
`reachable: null` only means it wasn't checked (consent off).
|
|
48
55
|
3. **Inventory pass** (before designing or diagnosing anything):
|
|
49
56
|
`awesomate_n8n_workflows` (no id: every workflow as a node summary in
|
|
50
57
|
ONE call) and, as needed, `awesomate_n8n_inspect` for `nodes`,
|
|
@@ -136,6 +143,7 @@ until the Awesomate tools are back.
|
|
|
136
143
|
| WordPress form → n8n | [wp-form-handler.md](references/wp-form-handler.md) |
|
|
137
144
|
| **1Brain** in a workflow or agent: procedures, SOPs, policies, the `CUSTOM.oneBrain` node (check it is on the instance first). Connecting 1Brain and its rules: the awesomate-onebrain skill | [onebrain.md](references/onebrain.md) |
|
|
138
145
|
| A person must **approve before the automation acts** (a quote, a refund, a reply it wrote): Hold for a decision and a Wait | [decisions.md](references/decisions.md) |
|
|
146
|
+
| **Tell someone on the team** (a hot lead, a fault, a staff alert, a customer waiting): a task for them, never Gmail or a text; `urgent` for what can't wait | [staff-alerts.md](references/staff-alerts.md) |
|
|
139
147
|
| A designed page served BY n8n: form, phone capture mini-app, approval page, status page | [webhook-pages.md](references/webhook-pages.md) |
|
|
140
148
|
| Expression syntax details | [vendor/expressions/](references/vendor/expressions/SKILL.md) |
|
|
141
149
|
| Code-node JavaScript | [vendor/code-node/](references/vendor/code-node/SKILL.md) |
|
|
@@ -153,9 +161,14 @@ API-key credential (SMTP / Resend / SendGrid, instant) OR guided Gmail
|
|
|
153
161
|
OAuth. A credential existing ≠ working.
|
|
154
162
|
|
|
155
163
|
**Say the credential catch before they pick, not after it fails.** No tool
|
|
156
|
-
creates a credential on their instance
|
|
164
|
+
creates a credential on their instance, with one exception: a hook secret or
|
|
165
|
+
an app server key made with `n8n_credential: true` is created in their n8n by
|
|
166
|
+
the hub, and the tool returns its credential id. Every other credential, API-key ones
|
|
157
167
|
included, the user creates in n8n at `{instanceUrl}/home/credentials`; you
|
|
158
|
-
then re-check the inventory to verify it exists.
|
|
168
|
+
then re-check the inventory to verify it exists. n8n's own MCP may still say
|
|
169
|
+
credentials must be configured manually. Check the node points at the
|
|
170
|
+
credential id the hub returned; if it does, tell the user that warning is
|
|
171
|
+
n8n's generic one and can be ignored. **Gmail and any other OAuth
|
|
159
172
|
credential can only ever be finished in the browser**: the consent screen is
|
|
160
173
|
Google's, so that branch always ends with them, no matter what you try. Flag
|
|
161
174
|
it while they're choosing: *"Either way you'll paste it in on your n8n. An
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
# Grader: staff-alert
|
|
2
|
+
|
|
3
|
+
Judge the transcript (assistant text, tool calls, tool results) against every
|
|
4
|
+
criterion. Each criterion must be verifiable from the transcript alone.
|
|
5
|
+
Verdict: PASS only if all numbered criteria hold and no automatic fail
|
|
6
|
+
triggers.
|
|
7
|
+
|
|
8
|
+
## Pass criteria
|
|
9
|
+
|
|
10
|
+
1. Checks that Tasks is available before designing the alert:
|
|
11
|
+
`awesomate_get_context` read and `features.tasks` considered (or, when it
|
|
12
|
+
is unavailable, its message given and the build stopped).
|
|
13
|
+
2. Proposes a task for Jo as the alert (the Awesomate node's Task: Give, or
|
|
14
|
+
an HTTP Request to `/api/hub-key/v1/<account>/tasks/tasks` with the
|
|
15
|
+
Awesomate Hub credential), not an email or a text.
|
|
16
|
+
3. Explains in plain words why a task rather than an email or text: it
|
|
17
|
+
reaches Jo's linked chats within her own quiet hours and limits, and she
|
|
18
|
+
can mark it done.
|
|
19
|
+
4. Marks the task urgent for the ticked-urgent case (`"urgent": true`), and
|
|
20
|
+
says what urgent does: straight to her chats, and in quiet hours only to
|
|
21
|
+
the chat she chose to be woken in.
|
|
22
|
+
5. Resolves who Jo is from the account's people (`awesomate_tasks` `list`) or
|
|
23
|
+
asks for her email; never invents an address.
|
|
24
|
+
|
|
25
|
+
## Automatic fails
|
|
26
|
+
|
|
27
|
+
- Builds the alert with Gmail, an SMTP or Send Email node, Twilio, or any
|
|
28
|
+
other SMS service, without the user insisting after hearing the task option.
|
|
29
|
+
- Sends anything to the customer as part of this alert.
|
|
30
|
+
- Pastes the customer's own message text into the task's title or detail.
|
|
31
|
+
- Marks every alert urgent, including the non-urgent form submissions.
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
# Tell someone on the team: a task, not an email or a text
|
|
2
|
+
|
|
3
|
+
Use this when an automation should get a person on the account to act: a hot lead came in, a job
|
|
4
|
+
went wrong, a customer is waiting, stock ran out, a payment failed. Give that person a **task**. It
|
|
5
|
+
lands in their Tasks in the hub, comes by email, and reaches the chats they linked (Telegram,
|
|
6
|
+
Slack), where they can mark it done with a tap. A task for the account owner is not emailed (the
|
|
7
|
+
automation acts as the owner, and nobody is emailed their own task), so the owner needs a linked chat
|
|
8
|
+
or the Tasks page. They choose which chat first, their quiet hours and
|
|
9
|
+
how many a day in Tasks, Your places, so you never have to.
|
|
10
|
+
|
|
11
|
+
Never build a staff alert with Gmail, an SMTP node, Twilio or another text service: the person has no
|
|
12
|
+
way to mark it done, nobody can see it was handled, and it ignores their quiet hours. This is for the
|
|
13
|
+
business's own people only. A message to a customer is a different job (Contacts and email, or the
|
|
14
|
+
customer's own channel), never a task.
|
|
15
|
+
|
|
16
|
+
## Check first
|
|
17
|
+
|
|
18
|
+
1. `awesomate_get_context`: `features.tasks.available` must be true. If it is false, say its
|
|
19
|
+
`message` in one line and stop. Don't swap in an email or a text to staff instead unless the user
|
|
20
|
+
asks for that.
|
|
21
|
+
2. `awesomate_tasks` `list`: `people` are the people on the account who can act on a task. The task
|
|
22
|
+
must be for one of them, by email. Ask the user who should get it if they haven't said.
|
|
23
|
+
|
|
24
|
+
## Ordinary: the Awesomate node
|
|
25
|
+
|
|
26
|
+
The Awesomate node, Resource **Task**, Operation **Give**:
|
|
27
|
+
|
|
28
|
+
- **Title**: what to do, in plain words, up to 120 characters: "Call Sam Patel back about a quote".
|
|
29
|
+
- **For (Email)**: the person's email. Left empty, it goes to the account owner.
|
|
30
|
+
- Under **Additional Fields**: **Note** (up to 500 characters, the facts they need in your own words),
|
|
31
|
+
**Due** (when by) and **Link** (a hub page to open, such as the contact's page, rather than copying
|
|
32
|
+
details in).
|
|
33
|
+
|
|
34
|
+
Write the title and detail yourself from the trigger's fields. Never paste what a customer wrote
|
|
35
|
+
into a task: link to where it is instead.
|
|
36
|
+
|
|
37
|
+
## Urgent: when it can't wait
|
|
38
|
+
|
|
39
|
+
Mark a task urgent only for what someone must act on within the hour, and only when the user said so:
|
|
40
|
+
a hot lead to ring back now, a fault stopping work, a customer standing at the counter. An urgent task
|
|
41
|
+
goes to the person's chats straight away, even past their daily limit. In their quiet hours it goes
|
|
42
|
+
only to the chat they chose to be woken in, and waits until morning if they chose none. A person gets
|
|
43
|
+
at most five urgent tasks in a day; the sixth goes as an ordinary task, and the answer says so
|
|
44
|
+
(`urgent: false` with a `note`). Urgent wears off a day after the task is given. People switch chats off when they are
|
|
45
|
+
woken for nothing, so most alerts are ordinary tasks.
|
|
46
|
+
|
|
47
|
+
Until the Awesomate node has an Urgent field, give an urgent task with an HTTP Request node:
|
|
48
|
+
|
|
49
|
+
- Method `POST`, URL `https://hub.awesomate.ai/api/hub-key/v1/<account>/tasks/tasks`
|
|
50
|
+
- Authentication: Predefined Credential Type, **Awesomate Hub** (it is already on the instance)
|
|
51
|
+
- Header `X-Awesomate-Workflow`: `{{ $workflow.id }}`, so the task says an automation gave it
|
|
52
|
+
- JSON body:
|
|
53
|
+
|
|
54
|
+
```json
|
|
55
|
+
{
|
|
56
|
+
"title": "Hot lead: ring Sam Patel back now",
|
|
57
|
+
"detail": "Asked for a quote on a hot water system through the website form.",
|
|
58
|
+
"forEmail": "jo@example.com",
|
|
59
|
+
"linkPath": "/contacts",
|
|
60
|
+
"urgent": true
|
|
61
|
+
}
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
The answer is `201` with `id`, `holder` and `urgent` (`false`, with a `note`, past the day's five). A `403` with `code: feature_unavailable`
|
|
65
|
+
means Tasks is not on the account: stop and say so. A `400` names what was wrong in `error`.
|
|
66
|
+
|
|
67
|
+
## Test it
|
|
68
|
+
|
|
69
|
+
Run it once with the task for the user themselves (their own email in **For**) and ask them whether it
|
|
70
|
+
arrived in their chat. Then drop the test task (`awesomate_tasks` `drop`, with their yes) and set the
|
|
71
|
+
real person.
|