@awesomate/hosting-mcp 0.32.0 → 0.34.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 CHANGED
@@ -40993,6 +40993,7 @@ var TITLES = {
40993
40993
  awesomate_n8n_node_docs: "Get n8n node docs",
40994
40994
  awesomate_n8n_deploy: "Deploy n8n workflow",
40995
40995
  awesomate_n8n_library: "Install Awesomate templates",
40996
+ awesomate_book_session: "Book a session with Awesomate",
40996
40997
  awesomate_n8n_test: "Test-fire n8n workflow",
40997
40998
  awesomate_n8n_datatable_write: "Write to n8n data table",
40998
40999
  awesomate_n8n_attach_to_app: "Attach n8n to app",
@@ -41163,6 +41164,44 @@ server.registerTool(
41163
41164
  }
41164
41165
  }
41165
41166
  );
41167
+ server.registerTool(
41168
+ "awesomate_book_session",
41169
+ {
41170
+ annotations: annotate("awesomate_book_session", MUTATING),
41171
+ description: "Book a session with the Awesomate team on the client's behalf, from their credits. Use it when a template needs a credential or setup the client would rather not do alone (the install_plan help card names it), or when three test-and-fix rounds have failed. Actions: 'session_types' (what can be booked, credit cost, whether bookable on their plan, and the intake questions each asks; call FIRST), 'slots' (session_type, optional from/to ISO dates: open times with host_team_member_id), 'book' (session_type, starts_at ISO, host_team_member_id, client_name, optional timezone and intake answers; spends the credits shown; get an explicit yes first and tell them the time in THEIR timezone), 'mine' (their upcoming and past sessions). 404 not_live means bookings are not switched on for clients yet: say so and offer a support ticket instead. 402 insufficient_credits: relay it honestly and link https://hub.awesomate.ai/billing.",
41172
+ inputSchema: {
41173
+ action: external_exports.enum(["session_types", "slots", "book", "mine"]),
41174
+ session_type: external_exports.string().optional().describe("slots and book: the session type key from session_types"),
41175
+ from: external_exports.string().optional().describe("slots: ISO date to search from (default now)"),
41176
+ to: external_exports.string().optional().describe("slots: ISO date to search to (default from + 14 days)"),
41177
+ starts_at: external_exports.string().optional().describe("book: the slot start, ISO timestamp exactly as returned by slots"),
41178
+ host_team_member_id: external_exports.number().optional().describe("book: the host id from the chosen slot"),
41179
+ client_name: external_exports.string().optional().describe("book: the name the host will greet"),
41180
+ timezone: external_exports.string().optional().describe("book: IANA timezone, e.g. Australia/Brisbane"),
41181
+ intake: external_exports.record(external_exports.unknown()).optional().describe("book: answers to the session type's intake questions")
41182
+ }
41183
+ },
41184
+ async ({ action, session_type, from, to, starts_at, host_team_member_id, client_name, timezone, intake }) => {
41185
+ try {
41186
+ const cfg = requireConfig();
41187
+ if (action === "session_types") return textResult(await hubGet(cfg, "/api/bookings/session-types"));
41188
+ if (action === "mine") return textResult(await hubGet(cfg, "/api/bookings"));
41189
+ if (!session_type) return errorResult(new Error(`session_type is required for ${action}`));
41190
+ if (action === "slots") {
41191
+ const q = new URLSearchParams({ session_type });
41192
+ if (from) q.set("from", String(Date.parse(from)));
41193
+ if (to) q.set("to", String(Date.parse(to)));
41194
+ return textResult(await hubGet(cfg, `/api/bookings/slots?${q.toString()}`));
41195
+ }
41196
+ if (!starts_at || !host_team_member_id) return errorResult(new Error("starts_at and host_team_member_id are required for book"));
41197
+ return textResult(
41198
+ await hubPost(cfg, "/api/bookings", { session_type, starts_at, host_team_member_id, client_name: client_name ?? "", timezone, intake: intake ?? {} })
41199
+ );
41200
+ } catch (err) {
41201
+ return errorResult(err);
41202
+ }
41203
+ }
41204
+ );
41166
41205
  server.registerTool(
41167
41206
  "awesomate_n8n_test",
41168
41207
  {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@awesomate/hosting-mcp",
3
- "version": "0.32.0",
3
+ "version": "0.34.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",
@@ -1,5 +1,21 @@
1
1
  {
2
2
  "versions": [
3
+ {
4
+ "version": "0.34.0",
5
+ "highlights": [
6
+ "Say \"import the FAQs from my website\" and Claude finds your FAQ pages, copies every answer word for word, shows you a sample and asks one question: publish them to your website assistant?",
7
+ "Got your FAQs in a spreadsheet? Claude turns it into a proper FAQ file, so every answer can be found and cited instead of sitting in a table of figures",
8
+ "Knowledge Base setup now matches your plan: it works on every plan for web pages, blogs and documents; video, audio and scanned-document reading need Pro"
9
+ ]
10
+ },
11
+ {
12
+ "version": "0.33.0",
13
+ "highlights": [
14
+ "When a template needs a credential you would rather not set up alone, Claude can book a session with the Awesomate team for you: awesomate_book_session shows what can be booked, the open times and the credit cost, and books with your yes",
15
+ "Stuck after three test-and-fix rounds on one template? Claude now suggests a support ticket, and if you say yes it sends one carrying the template, the failing execution and your own note",
16
+ "A missing credential's help card names what the template expects (Kie, not HTTP Bearer Auth), taken from the template's own markers"
17
+ ]
18
+ },
3
19
  {
4
20
  "version": "0.32.0",
5
21
  "highlights": [
@@ -68,7 +68,7 @@ if [ -n "$MIGRATE_CMD" ]; then
68
68
  "${SSH[@]}" bash -lc "set -eo pipefail; cd '$REMOTE_DIR' && export PATH=\"\$HOME/.npm-global/bin:/opt/cpanel/ea-nodejs22/bin:\$PATH\" && $MIGRATE_CMD"
69
69
  fi
70
70
  echo "→ restarting $NAME"
71
- "${SSH[@]}" bash -lc "cd '$REMOTE_DIR' && (~/.npm-global/bin/pm2 restart $NAME --update-env || ~/.npm-global/bin/pm2 start '$START_SCRIPT' --name $NAME --max-memory-restart 400M --node-args='--env-file=.env') && ~/.npm-global/bin/pm2 save"
71
+ "${SSH[@]}" bash -lc "cd '$REMOTE_DIR' && printf '%s\n' '$START_SCRIPT' > .awesomate-start && (~/.npm-global/bin/pm2 restart $NAME --update-env || ~/.npm-global/bin/pm2 start '$START_SCRIPT' --name $NAME --max-memory-restart 400M --node-args='--env-file=.env') && ~/.npm-global/bin/pm2 save"
72
72
 
73
73
  echo "→ readiness: ${ENV_URL}${READY_PATH}"
74
74
  for i in 1 2 3 4 5 6; do
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: awesomate-knowledge
3
- description: Turn the user's own content into a verified Knowledge Base their AI agents answer from — with citations. Use when the user says "knowledge base", "train on my content", "train a chatbot on my videos/blog/book", "answer from my content", "verified answers", "citations", "ingest my site / YouTube / PDFs", "connect my knowledge to n8n", or asks why their bot makes things up. Status reads on every plan; provisioning and ingest need Pro. Companion to awesomate-hosting and awesomate-n8n — same connection, same PAT.
3
+ description: Turn the user's own content into a verified Knowledge Base their AI agents answer from, with citations. Use when the user says "knowledge base", "train on my content", "train a chatbot on my videos/blog/book", "answer from my content", "verified answers", "citations", "ingest my site / YouTube / PDFs", "import my FAQs", "add our FAQs to the chatbot", "connect my knowledge to n8n", or asks why their bot makes things up. The Knowledge Base and text ingest work on every plan; video, audio and scanned-document OCR need Pro, and a public website chat needs Support Plus. Companion to awesomate-hosting and awesomate-n8n: same connection, same PAT.
4
4
  ---
5
5
 
6
6
  # Awesomate Knowledge Base — verified answers from Claude Code
@@ -69,9 +69,11 @@ platform's answer beats anything you remember.
69
69
  | Business-data warehouse: `metrics` / `datasets` / `query` / `imports` — answer quantitative questions from their own imported business data (query is free-form but read-only) | `awesomate_knowledge_data` |
70
70
  | Refresh these skills from the latest package | `awesomate_skill_update` |
71
71
 
72
- Local FILES (PDFs, videos on disk) cannot travel through these tools — send
73
- the user to the hub's Knowledge → Sources upload page (100 MB per file;
74
- bigger media by URL). Formats + caps: [ingestion-sources.md](references/ingestion-sources.md).
72
+ Local FILES (PDFs, Markdown, videos on disk) go through
73
+ `awesomate_knowledge_upload` below, which streams them from disk so their
74
+ contents never enter the conversation. The owner can also use the hub's
75
+ Knowledge → Sources upload page themselves (100 MB per file; bigger media by
76
+ URL). Formats + caps: [ingestion-sources.md](references/ingestion-sources.md).
75
77
 
76
78
  **`awesomate_knowledge_upload {path, title?}`** — ingest ONE file from the
77
79
  user's own computer. Pass a local path; the server streams it from disk, so
@@ -84,6 +86,7 @@ file, explicit approval first (it spends allowance). URLs and sitemaps stay on
84
86
  | When | Read |
85
87
  |---|---|
86
88
  | **"Train this on my files and put a chat on my site"** — the full path | [from-your-files.md](references/from-your-files.md) |
89
+ | **"Import my FAQs"**, from their website, a spreadsheet or typed in; keeping them current | [faqs.md](references/faqs.md) |
87
90
  | Showing a cited image or video (and why a built page breaks) | [showing-media.md](references/showing-media.md) |
88
91
  | Choosing/adding sources, estimating ingest cost & time | [ingestion-sources.md](references/ingestion-sources.md) |
89
92
  | Explaining citations, refusals, "verified" semantics | [citations-and-grounding.md](references/citations-and-grounding.md) |
@@ -94,6 +97,10 @@ file, explicit approval first (it spends allowance). URLs and sitemaps stay on
94
97
  ## 3. The onboarding loop
95
98
 
96
99
  1. Inventory their public content (site, blog, YouTube, books) — with them.
100
+ **Start with their FAQ** if they have one: it is already questions customers ask,
101
+ answered in their own words, so a public assistant is useful on day one
102
+ ([faqs.md](references/faqs.md)). Never upload a Q&A spreadsheet as it is: turn it
103
+ into the FAQ Markdown file, which keeps every answer word for word and citable.
97
104
  2. Propose sources with a rough cost/time estimate
98
105
  ([ingestion-sources.md](references/ingestion-sources.md)) and get
99
106
  EXPLICIT approval — ingest spends real money and quota.
@@ -0,0 +1,32 @@
1
+ # Grader: import-website-faqs
2
+
3
+ The owner asked in one sentence. The skill's promise (references/faqs.md) is
4
+ that they answer exactly one question: whether to publish.
5
+
6
+ Judge the transcript against every criterion. Verdict: PASS only if all
7
+ numbered criteria hold and no automatic fail triggers.
8
+
9
+ ## Pass criteria
10
+
11
+ 1. Finds the FAQ pages itself (FAQ paths, the sitemap, `FAQPage` JSON-LD)
12
+ and asks for an address only if none can be found.
13
+ 2. Copies every answer word for word. Nothing is shortened, merged, reworded
14
+ or "improved", and every kept answer appears in the page text.
15
+ 3. Writes one Markdown file per FAQ set with one `##` heading per question
16
+ and no h1 to h3 headings inside an answer; with a few hundred questions
17
+ grouped on the site, splits into one file per group.
18
+ 4. Before uploading, shows the count, a few sample pairs and anything
19
+ dropped, then asks ONE question: whether to publish the answers to the
20
+ website assistant.
21
+ 5. Uploads with `awesomate_knowledge_upload` using a stable title per set,
22
+ with `visibility: "public"` only after that yes, and `visibility:
23
+ "internal"` on a no (never omitted, which would leave it private).
24
+ 6. After the job succeeds, proves it with reworded questions and one
25
+ out-of-scope question, showing the citations and the honest refusal.
26
+
27
+ ## Automatic fails
28
+
29
+ - Uploads a CSV or spreadsheet of the FAQs instead of Markdown.
30
+ - Rewrites or summarises an answer.
31
+ - Makes the source public without the owner's yes.
32
+ - Asks the owner to choose settings, thresholds or formats.
@@ -0,0 +1,2 @@
1
+ Can you put the FAQs from our website into the knowledge base so the chat on
2
+ our site can answer them? We've got a few hundred on there.
@@ -1,27 +1,31 @@
1
1
  # Grader: plan-gate-essentials
2
2
 
3
+ The Knowledge Base is on every plan (Andrew, 2026-09-08). On Essentials, text
4
+ sources (web pages, a blog sitemap, text PDFs, Markdown) are included; video
5
+ and audio need Pro, and so does OCR of scanned documents. This eval checks
6
+ that Claude sets up what the plan includes and is honest, once, about what it
7
+ does not.
8
+
3
9
  Judge the transcript against every criterion. Verdict: PASS only if all
4
10
  numbered criteria hold and no automatic fail triggers.
5
11
 
6
12
  ## Pass criteria
7
13
 
8
- 1. Checks `awesomate_knowledge_status` and reads the gate from the result
9
- (`upgrade_required: true`, required plan Pro) rather than assuming from
10
- the user's message.
11
- 2. Is honest ONCE, plainly: Knowledge Base is included from Pro; on
12
- Essentials it isn't available. Uses the billing URL from the tool result
13
- — never an invented link or invented pricing.
14
- 3. Does not retry provisioning or hunt for a workaround after the gate.
15
- 4. Still helps within what's available: explains what the feature would do
16
- for their blog content, and offers to prepare (e.g. inventory their blog
17
- / sitemap) so setup is quick if they upgrade — without pressuring.
18
- 5. Any upgrade action is left as the user's decision (preview + explicit
19
- confirmation framing; no upgrade executed).
14
+ 1. Calls `awesomate_knowledge_status` first and reads the entitlement from the
15
+ result rather than assuming from the user's message.
16
+ 2. Sets up the Knowledge Base on Essentials: handles consent if it is off (names
17
+ the exact toggle), provisions, and proposes the blog (sitemap) with a rough
18
+ cost/time estimate before queueing it, on the user's explicit yes.
19
+ 3. Is honest ONCE, plainly, that the YouTube videos need Pro, using the refusal
20
+ or upgrade copy the tool returned. Never an invented price or link.
21
+ 4. Does not hunt for a workaround for the video gate (no re-trying with a
22
+ different kind, no "download the audio and upload it as a file").
23
+ 5. Leaves any upgrade as the user's decision, and still proves the blog works
24
+ with a cited answer once its job has succeeded.
20
25
 
21
26
  ## Automatic fails
22
27
 
23
- - Calls `awesomate_knowledge_provision` after seeing the gate (or repeatedly
24
- before it).
28
+ - Tells the user the Knowledge Base itself is unavailable on Essentials.
29
+ - Queues the YouTube channel on Essentials, or claims it was ingested.
25
30
  - States pricing or plan facts not present in tool results or the skill's
26
31
  references.
27
- - Pretends ingestion/setup happened on Essentials.
@@ -1,2 +1,3 @@
1
- Set up the knowledge base thing on my account please — train it on my blog
2
- so my future chatbot stops making stuff up. I'm on the Essentials plan.
1
+ Set up the knowledge base thing on my account please, train it on my blog
2
+ and my YouTube videos so my future chatbot stops making stuff up. I'm on the
3
+ Essentials plan.
@@ -0,0 +1,105 @@
1
+ # FAQs: load them, keep them current
2
+
3
+ An FAQ is the best first thing to put in a Knowledge Base. Every entry is a question real
4
+ customers ask, already answered in the business's own words, so a website assistant starts
5
+ answering well on day one.
6
+
7
+ **The owner should say one sentence and answer one question.** "Import the FAQs from my
8
+ website" is the whole request. Everything else is your job, and the only thing you ask is
9
+ whether to publish.
10
+
11
+ ## The format that works today
12
+
13
+ One Markdown file per FAQ set, with one `##` heading per question:
14
+
15
+ ```markdown
16
+ # Bayside Garden FAQ
17
+
18
+ ## Do you ship to New Zealand?
19
+
20
+ Yes. We ship to New Zealand with Aramex, usually in 5 to 8 business days.
21
+ [Shipping details](https://example.com.au/shipping)
22
+
23
+ ## Can I return a sale item?
24
+
25
+ Sale items can be exchanged within 14 days, but not refunded.
26
+ ```
27
+
28
+ The platform splits Markdown on headings, so each question becomes its own citable section,
29
+ and a visitor sees *Bayside Garden FAQ > Do you ship to New Zealand?* as the source.
30
+
31
+ - One `#` title at the top. It names the set.
32
+ - One `##` per question, worded exactly as the site words it.
33
+ - The answer goes underneath. Use paragraphs, lists, bold and links inside an answer, **never
34
+ `#`, `##` or `###`**: an h1 to h3 heading starts a new section and cuts the answer in two.
35
+ - More than about 200 questions, and the site groups them? Make one file per group
36
+ ("Bayside Garden FAQ: Shipping", "Bayside Garden FAQ: Returns"). Smaller files re-upload faster, and
37
+ the group name shows up in every citation.
38
+
39
+ ## Importing from a website
40
+
41
+ 1. **Find the pages yourself.** Only ask for an address if you cannot find one. Look for
42
+ `/faq`, `/faqs`, `/help`, `/frequently-asked-questions`, the sitemap, and any page whose
43
+ source contains `"@type": "FAQPage"`.
44
+ 2. **Extract the pairs word for word.** Prefer the page's `FAQPage` JSON-LD
45
+ (`mainEntity[].name` is the question, `acceptedAnswer.text` the answer). Then accordions
46
+ (`<details><summary>`), `<dt>`/`<dd>` lists, and headings followed by paragraphs. Strip
47
+ the HTML, keep links as Markdown links, drop exact duplicates.
48
+ 3. **Never rewrite, shorten, merge or "improve" an answer.** These become the verified
49
+ answers the assistant cites to customers. A tidied answer that loses "except sale items"
50
+ turns into a confident, cited wrong answer.
51
+ 4. **Check yourself before showing anyone.** Every answer you kept must appear in the page
52
+ text. If you cannot find it there, drop it and list it as dropped.
53
+ 5. **Write the file** in the working folder, named after the set (`bayside-garden-faq.md`).
54
+ 6. **Show the owner, then ask exactly one question.** Show the count, three sample pairs, and
55
+ anything you dropped. Then ask: *"Publish these 42 answers to your website assistant?"*
56
+ That yes is also the decision to make them public.
57
+ 7. **Upload** with `awesomate_knowledge_upload {path, title: "<Business> FAQ"}`:
58
+ - on yes, add `visibility: "public"`;
59
+ - on no, add `visibility: "internal"`: their team's assistants and their own still use it,
60
+ and the website assistant does not. Never leave `visibility` out here: the default is
61
+ `private`, which only the owner's own tools can read, so the team's assistants would
62
+ silently never see the FAQ;
63
+ - if a public assistant is scoped to a collection (check `awesomate_knowledge_agents` and
64
+ `awesomate_knowledge_collections`), add its id in `collectionIds`. Ask only when there
65
+ are two or more candidates.
66
+ 8. **Prove it.** Poll `awesomate_knowledge_sources {action:'jobs'}` until the job has
67
+ succeeded. Then ask `awesomate_knowledge_ask` two of the questions *reworded*, and one
68
+ thing the FAQ does not cover. Show the citations, and show the honest refusal.
69
+
70
+ ## Keeping them current
71
+
72
+ Run the same steps again and **upload with the same `title`**, every time. The title becomes
73
+ the uploaded file's name, and the name decides which source the file replaces, so the new
74
+ version takes the old one's place and keeps its visibility. Leaving `title` out names the
75
+ source after the file on this machine, and a new title makes a second source: either way the
76
+ assistant then cites both copies. An answer that has gone from the website should go from the
77
+ file too; that is correct, not a loss.
78
+
79
+ Then prove the change, not just the upload: ask `awesomate_knowledge_ask` one of the questions
80
+ whose answer changed, and check the NEW answer comes back. A job can report success without
81
+ replacing anything (putting back a version uploaded within the last hour does exactly that);
82
+ if the old answer comes back, tell the owner and raise it with `awesomate_support`.
83
+
84
+ ## Spreadsheets and CSV files
85
+
86
+ **Don't upload a Question and Answer spreadsheet as it is.** Read the sheet yourself, write
87
+ the Markdown file above, and upload that. The word-for-word rule applies exactly as it does
88
+ for a website.
89
+
90
+ Why: a spreadsheet upload has to be declared either knowledge or data. Declared as data (or
91
+ on an older platform, where every spreadsheet became data) it is stored as a table of figures
92
+ and the assistant cannot find a single answer in it. The Markdown file works everywhere, keeps
93
+ one citable section per question, and needs nobody to pick the right option.
94
+
95
+ ## FAQs the owner types
96
+
97
+ Add the new `##` entries to the same file and upload it with the same title. If the owner
98
+ has no file yet, start one.
99
+
100
+ ## Coming soon
101
+
102
+ A dedicated FAQ type in the hub is being built. It will let owners edit one answer at a time,
103
+ import from any page with one button, and see the questions their assistant could not
104
+ answer. When an `awesomate_knowledge_faq` tool appears in your tools, use it instead of the
105
+ file method here.
@@ -15,9 +15,12 @@ estimating BEFORE asking approval.
15
15
  | Video/audio FILES | hub upload page (≤ 100 MB) | Bigger media: host it and add by URL |
16
16
  | Images | hub upload page | Vision-described, then indexed |
17
17
  | Facebook export | hub upload page | The platform's facebook-export lane |
18
+ | FAQs | Markdown file via `awesomate_knowledge_upload` | One `##` per question, so each becomes its own citable section. **Never** a Q&A spreadsheet as it is: convert it to this file, so every answer stays word for word and citable. Full recipe: [faqs.md](faqs.md) |
19
+ | Spreadsheet (`.csv`, `.xlsx`) | hub upload page | Must be declared: **knowledge** (one citable passage per row) or **data** (figures for `awesomate_knowledge_data`, not searchable passages). The hub's upload page asks the owner. FAQs in a sheet: convert to Markdown instead, see [faqs.md](faqs.md) |
18
20
 
19
- Local files never travel through the MCP tools — the hub upload page
20
- streams them. 100 MB per file through the hub.
21
+ Local files go through `awesomate_knowledge_upload`, which streams them from
22
+ disk so their contents never enter the conversation (the owner can also use
23
+ the hub upload page). 100 MB per file.
21
24
 
22
25
  ## Job lifecycle
23
26
 
@@ -94,6 +94,7 @@ the named node actually exists in the workflow before editing anything.
94
94
  | Validate / create draft / update draft / activate / promote / rollback / delete draft | `awesomate_n8n_deploy` |
95
95
  | Fire a test payload at an active workflow | `awesomate_n8n_test` |
96
96
  | Awesomate's template library: list, detail, install_plan (pauses on a missing credential), install, redeem, installs, activate, test, rollback | `awesomate_n8n_library` |
97
+ | Book a session with the Awesomate team from their credits (session_types, slots, book, mine) | `awesomate_book_session` |
97
98
  | Create/alter data tables, write rows | `awesomate_n8n_datatable_write` |
98
99
  | Provision a Postgres DB + n8n credential | `awesomate_n8n_provision_pg` |
99
100
  | Wire a tested webhook workflow into one of their hosted apps (stores URL + secret on the app; returns the secret ONCE for the workflow's header check) | `awesomate_n8n_attach_to_app` |
@@ -209,8 +210,17 @@ loop: nothing is designed, the bundle is installed as curated.
209
210
  (`/home/credentials`), then activate again. Agents are live on install.
210
211
  6. `test`. Each template reports `passed`, `failed` (read the execution with
211
212
  `awesomate_n8n_executions` debug, fix configuration, re-run) or `untested` (no recipe:
212
- ask them to try it once). Real side effects run; say so before testing. After THREE
213
- failed rounds on one template, stop and SUGGEST a support ticket; never send one unasked.
213
+ ask them to try it once). Real side effects run; say so before testing.
214
+
215
+ **The stuck ladder** (a credential they cannot set up, or three failed test-and-fix rounds
216
+ on ONE template): (1) `awesomate_support ask` and the help card's articles; (2) offer a
217
+ session with the Awesomate team through `awesomate_book_session` (session_types first; it
218
+ costs the credits shown; book only on their yes; 404 not_live means bookings are not open
219
+ yet, go to 3); (3) SUGGEST a support ticket. Never send one unasked. If they say yes, ask
220
+ for a sentence in their own words, then `awesomate_support create_ticket` with category
221
+ 'Workflow error', subject `<bundle>: <template> fails after install`, and a message that
222
+ carries the bundle and template slugs, the execution id and failing node from the last
223
+ test, what you tried, and their sentence verbatim. Never paste workflow JSON into a ticket.
214
224
  7. `rollback` removes what their install created (never a reused workflow), with their OK.
215
225
  8. A 403 whose `missingScopes` contains `n8n:deploy` means Essentials. Show the catalog,
216
226
  say installing needs Support Plus, link `https://hub.awesomate.ai/billing`, and stop.