@awesomate/hosting-mcp 0.142.0 → 0.151.1

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 CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@awesomate/hosting-mcp",
3
- "version": "0.142.0",
3
+ "version": "0.151.1",
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",
@@ -19,7 +19,7 @@
19
19
  "scripts": {
20
20
  "build": "esbuild src/index.ts --bundle --platform=node --target=node18 --format=esm --outfile=dist/index.js --banner:js='#!/usr/bin/env node\nimport { createRequire as __awmCreateRequire } from \"node:module\"; const require = __awmCreateRequire(import.meta.url);' --external:node:*",
21
21
  "typecheck": "tsc --noEmit",
22
- "test": "npm run build && esbuild src/config.ts --bundle --platform=node --target=node18 --format=esm --outfile=test/.build/config.mjs --external:node:* && esbuild src/knowledge.ts --bundle --platform=node --target=node18 --format=esm --outfile=test/.build/knowledge.mjs --banner:js='import { createRequire as __awmCreateRequire } from \"node:module\"; const require = __awmCreateRequire(import.meta.url);' --external:node:* && esbuild src/skills.ts --bundle --platform=node --target=node18 --format=esm --outfile=test/.build/skills.mjs --external:node:* && esbuild src/features.ts --bundle --platform=node --target=node18 --format=esm --outfile=test/.build/features.mjs --external:node:* && esbuild src/scopes.ts --bundle --platform=node --target=node18 --format=esm --outfile=test/.build/scopes.mjs --external:node:* && esbuild src/http.ts --bundle --platform=node --target=node18 --format=esm --outfile=test/.build/http.mjs --banner:js='import { createRequire as __awmCreateRequire } from \"node:module\"; const require = __awmCreateRequire(import.meta.url);' --external:node:* && esbuild src/files.ts --bundle --platform=node --target=node18 --format=esm --outfile=test/.build/files.mjs --banner:js='import { createRequire as __awmCreateRequire } from \"node:module\"; const require = __awmCreateRequire(import.meta.url);' --external:node:* && node --test test/*.test.mjs",
22
+ "test": "npm run build && esbuild src/config.ts --bundle --platform=node --target=node18 --format=esm --outfile=test/.build/config.mjs --external:node:* && esbuild src/knowledge.ts --bundle --platform=node --target=node18 --format=esm --outfile=test/.build/knowledge.mjs --banner:js='import { createRequire as __awmCreateRequire } from \"node:module\"; const require = __awmCreateRequire(import.meta.url);' --external:node:* && esbuild src/skills.ts --bundle --platform=node --target=node18 --format=esm --outfile=test/.build/skills.mjs --external:node:* && esbuild src/features.ts --bundle --platform=node --target=node18 --format=esm --outfile=test/.build/features.mjs --external:node:* && esbuild src/scopes.ts --bundle --platform=node --target=node18 --format=esm --outfile=test/.build/scopes.mjs --external:node:* && esbuild src/http.ts --bundle --platform=node --target=node18 --format=esm --outfile=test/.build/http.mjs --banner:js='import { createRequire as __awmCreateRequire } from \"node:module\"; const require = __awmCreateRequire(import.meta.url);' --external:node:* && esbuild src/files.ts --bundle --platform=node --target=node18 --format=esm --outfile=test/.build/files.mjs --banner:js='import { createRequire as __awmCreateRequire } from \"node:module\"; const require = __awmCreateRequire(import.meta.url);' --external:node:* && esbuild test/registrar.entry.ts --bundle --platform=node --target=node18 --format=esm --outfile=test/.build/registrar.mjs --banner:js='import { createRequire as __awmCreateRequire } from \"node:module\"; const require = __awmCreateRequire(import.meta.url);' --external:node:* && node --test test/*.test.mjs",
23
23
  "prepublishOnly": "npm run typecheck && npm run test"
24
24
  },
25
25
  "dependencies": {
@@ -1,5 +1,91 @@
1
1
  {
2
2
  "versions": [
3
+ {
4
+ "version": "0.151.1",
5
+ "highlights": [
6
+ "No change in what Claude can do: the Knowledge Base and Files tools moved into their own file in the MCP's source, ready for the Claude chat connector. Every tool keeps its name, description and inputs."
7
+ ]
8
+ },
9
+ {
10
+ "version": "0.151.0",
11
+ "highlights": [
12
+ "awesomate_crm_email can throw a draft away when you ask ({action:'discard', id}). A draft only: an approved, sending or sent email is refused and stays, and stopping one is the owner's, in the hub. Nothing is deleted: the draft drops off the list of emails, and a person can bring its words back from the hub. Thrown-away drafts are left out of 'list'"
13
+ ]
14
+ },
15
+ {
16
+ "version": "0.150.1",
17
+ "highlights": [
18
+ "Claude can look through a connected Vimeo or Wistia library with you (awesomate_knowledge_sources, video_library): its folders with counts, hours and sizes, and its videos by folder, part of a name or upload date, newest, oldest, by name or longest first, each with its length, size and whether it has captions. Read only: choosing videos, the quote, Start and asking our team to bring a big library in stay in the hub at Knowledge, Video library.",
19
+ "video_imports for one import now says where it is in one sentence (progress_words, including why it is waiting), what was chosen (choice), and the videos that can't come in grouped by reason (problems)."
20
+ ]
21
+ },
22
+ {
23
+ "version": "0.150.0",
24
+ "highlights": [
25
+ "awesomate_crm_email can ask the account's own writing agent for an email (action brief): it writes in the business's voice from its details, lists and past results, may ask a question or two first, and saves a draft for a person to approve in the hub. brief_status picks up a draft that takes longer."
26
+ ]
27
+ },
28
+ {
29
+ "version": "0.149.0",
30
+ "highlights": [
31
+ "awesomate_crm_series choices: what a series' four answers can pick from, by name (forms, lists, tags people have with counts only, the four stages, and the events something sends), so a change to who a series is for uses real names"
32
+ ]
33
+ },
34
+ {
35
+ "version": "0.148.1",
36
+ "highlights": [
37
+ "No change in what Claude can do: the n8n automation tools moved into their own file inside the package, the next step to offering the same tools in Claude and ChatGPT chat."
38
+ ]
39
+ },
40
+ {
41
+ "version": "0.148.0",
42
+ "highlights": [
43
+ "awesomate_crm_series draft takes form: Welcome new subscribers or the lead magnet follow-up, started from one of the business's sign-up forms (its id or slug). It starts when someone who sent the form joins one of its lists (their own yes, so double opt-in starts on their click), and the lead magnet follow-up sends two emails and no second copy of the file, since the form's own email already sent it. A form with no list can start only a service series. Series now read forms by name (\"They sent the Ski week guide form\"), and templates says which ones take a form (takesForm)",
44
+ "awesomate-funnels and awesomate-email: the form follow-up recipe uses form on the template instead of rewriting the lead magnet series by hand"
45
+ ]
46
+ },
47
+ {
48
+ "version": "0.147.1",
49
+ "highlights": [
50
+ "No change in what Claude can do: the website, hosting and app tools moved into their own files inside the package, the next step to offering the same tools in Claude and ChatGPT chat."
51
+ ]
52
+ },
53
+ {
54
+ "version": "0.147.0",
55
+ "highlights": [
56
+ "New awesomate_numbers_sql: Claude queries the business's own numbers with one read-only SQLite SELECT over the tables awesomate_numbers_tables lists, and gets plain rows back for a chart or a Claude Dashboard: contacts by month, KPIs by light, leads per 100 visits week by week. Totals only, refreshed at most every 5 minutes, and a team member's key sees only their own KPIs. Needs Your numbers in Claude (numbers_query)."
57
+ ]
58
+ },
59
+ {
60
+ "version": "0.146.1",
61
+ "highlights": [
62
+ "No change in what Claude can do: the account, plan, business, task and notification tools moved into their own file inside the package, the first step to offering the same tools in Claude and ChatGPT chat."
63
+ ]
64
+ },
65
+ {
66
+ "version": "0.146.0",
67
+ "highlights": [
68
+ "awesomate_knowledge_sources has a new refresh action: Claude reads one web page in your Knowledge Base again so it holds the page's current text, keeping its visibility, tags and collections, and tells you whether anything changed. A file is brought up to date by uploading it again. Adding a page that is already there no longer claims it became private: it keeps its own visibility unless you choose one."
69
+ ]
70
+ },
71
+ {
72
+ "version": "0.145.0",
73
+ "highlights": [
74
+ "awesomate_numbers_tables lists many more of the business's numbers to chart: Contacts counts by month, day and tag, each kind of record by month and day (bookings and support tickets among them), website visits and leads, Google search, Shopify sales, automation runs and errors by day, and to-dos week by week. Totals only, and a team member gets business-wide tables only when their access covers the whole business."
75
+ ]
76
+ },
77
+ {
78
+ "version": "0.144.0",
79
+ "highlights": [
80
+ "New awesomate_numbers_tables: Claude lists the business's own numbers it can chart or put on a dashboard (KPIs with their lights and targets, each KPI's recent periods, the business's figures), with stable table and column names, and says why any other table is not there. Read only, totals only, and a team member's key gets only their own KPIs. Needs Your numbers in Claude (numbers_query)."
81
+ ]
82
+ },
83
+ {
84
+ "version": "0.143.0",
85
+ "highlights": [
86
+ "A public website chat and the questions it couldn't answer (the Questions inbox, its daily email and the visitor test) are on every plan, Essentials included; answers still count against the month's Knowledge answers. Claude no longer tells an Essentials owner these need Support Plus."
87
+ ]
88
+ },
3
89
  {
4
90
  "version": "0.142.0",
5
91
  "highlights": [
@@ -239,7 +239,17 @@ to a booking, pricing or upgrade page.
239
239
 
240
240
  ## 5. Draft it, and hand it to the owner to approve
241
241
 
242
- With `awesomate_crm_email`:
242
+ When the account has its own writing agent, ask it first rather than writing
243
+ the doc yourself: `{action:'brief', brief, topic}` (or `id` to write over a
244
+ draft). Its words are the business's own voice. If it answers `questions`, put
245
+ them to the user in plain words and call `brief` again with the same `brief`,
246
+ its `session_id` and `answers: [{q, a}]`. A `pending` answer means call
247
+ `brief_status {job_id}` in about 20 seconds. You then review its draft with
248
+ the user like any other (steps 2 and 3 below); a person still approves it in
249
+ the hub. `409 no_copywriter` means there is no writing agent: say the owner
250
+ can add one in the hub (Contacts, Emails), and write the doc yourself.
251
+
252
+ Otherwise, with `awesomate_crm_email`:
243
253
 
244
254
  1. `{action:'draft', topic, doc}`, where `topic` is a list key from `lists`.
245
255
  The answer has the email's `id`, its `checks`, who it would reach, the
@@ -256,6 +266,12 @@ With `awesomate_crm_email`:
256
266
  sending, but copies already sent can't be recalled.
257
267
  5. Once someone has approved an email you can't change it (`409
258
268
  not_a_draft`). Any change after that is the owner's, in the hub.
269
+ 6. If the owner asks you to throw a draft away, `{action:'discard', id}`.
270
+ Only a draft: an approved, sending or sent email answers `409
271
+ not_a_draft` (its `reason` says which), and stopping one is the owner's,
272
+ in the hub. Nothing is deleted: the draft drops off the list of emails,
273
+ and the owner can bring its words back from the hub. Never throw a draft
274
+ away unless they asked.
259
275
 
260
276
  If the draft answers `409 sending_not_set_up`, sending isn't set up for this
261
277
  account yet and nothing was saved. Give the owner the email as text, and
@@ -305,7 +321,9 @@ because you drafted it.
305
321
  yes it relies on). Its emails hold gaps in [square brackets] that block
306
322
  approval: write each one with the owner in their voice (section 4), then
307
323
  `{action:'update', id, email, doc}` one at a time. Write your own with
308
- `{action:'draft', spec, emails}` when nothing fits.
324
+ `{action:'draft', spec, emails}` when nothing fits. To follow up one of
325
+ the business's sign-up forms, pass `form` (its id) with `welcome` or
326
+ `lead-magnet`: the awesomate-funnels skill covers it.
309
327
  3. Say the series back in the owner's words before handing it over. `get`
310
328
  answers `in_words`: what starts it, who it is for, when people come off,
311
329
  each step. Fix everything in `problems` and every email's
@@ -321,6 +339,8 @@ What starts a series, in plain words:
321
339
  a guide downloaded): an event, from the owner's automations or
322
340
  `awesomate_crm_write {action:'event'}`. Agree the event's name with the
323
341
  owner; it must match what their automations send.
342
+ - **Someone sends one of the business's forms** and joins its list (with
343
+ `form` on a template), or, for a service series, just sends it.
324
344
  - **They're tagged**, or **they become** new, a customer, a regular or quiet.
325
345
 
326
346
  Every series needs its way out: under `comes_off_when`, stop people who
@@ -142,15 +142,18 @@ Drafts only, with `awesomate_crm_series` (Support Plus and above; relay `upgrade
142
142
  comes). Offer one, not several:
143
143
 
144
144
  - **A sign-up form, or a lead magnet whose owner just wants a warm hello:**
145
- `{action:'draft', template:'welcome', list:'<the form's list>'}`. It starts when someone joins
146
- the list (their own yes), so it works with single and double opt-in. Use it as it comes.
145
+ `{action:'draft', template:'welcome', form:<the form's id>}`. It starts when someone who sent the
146
+ form joins its list (their own yes), so it works with single and double opt-in.
147
147
  - **A lead magnet with follow-ups about the guide's topic:**
148
- `{action:'draft', template:'lead-magnet', list:'<the form's list>'}`, then change it before the
149
- owner sees it, with `update {id, spec, emails}`: start it on joining the list
150
- (`starts_when: {type:'joins_list', list}`) with `only_for: [{type:'did', event:'<the form's event>', label:'Downloaded <title>', since:'ever'}]`,
151
- and remove its first email (`the-file`) and that step: the form's own email already sent the
152
- guide. Left on the template's `downloaded` event it would never start for people who confirm
153
- by email, and a second copy of the guide would go to everyone else.
148
+ `{action:'draft', template:'lead-magnet', form:<the form's id>}`. With the form it starts on the
149
+ form's list, only for people who sent it, and has no file email: the form's own email already
150
+ sent the guide. Two emails follow (a tip, then an offer). Never draft `lead-magnet` without the
151
+ form for a hub form: it would wait for a `downloaded` event nothing sends.
152
+
153
+ A form that offers several lists takes `list` too (one of the form's). A form with no list can start
154
+ only a service series; say so, and offer to add a list to the form. Someone already on the list when
155
+ they send the form gets the download but no series: that is the consent rule, and the form's page
156
+ says so.
154
157
 
155
158
  Write each email with the owner (gaps in [square brackets] block approval until written), then
156
159
  give them `reviewUrl`: nobody gets anything until an approver approves it and switches it on.
@@ -131,7 +131,9 @@ Once the page is published, `awesomate_site_audit` on it and fix what it flags (
131
131
 
132
132
  ## 9. The follow-up
133
133
 
134
- Offer one series, as SKILL.md section 7 says: `welcome` on the form's list as it comes, or
135
- `lead-magnet` changed to start on joining the list with the form's event as `only_for`, and its
136
- `the-file` email removed. Write the emails with the owner, then give them the series' `reviewUrl`:
137
- nobody gets anything until they approve it and switch it on in the hub.
134
+ Offer one series, as SKILL.md section 7 says: `{action:'draft', template:'welcome', form}` or
135
+ `{action:'draft', template:'lead-magnet', form}`, with the form's id. With the form, the lead magnet
136
+ follow-up starts on the form's list, only for people who sent it, and sends no second copy of the
137
+ file. Write the emails with the owner, then give them the series' `reviewUrl`: nobody gets anything
138
+ until they approve it and switch it on in the hub. The form's page in the hub lists it under
139
+ **Follow up with an email series**.
@@ -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", "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.
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; a public website chat is on every plan. 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
@@ -163,8 +163,8 @@ confirm:true}`, both after the owner's yes.
163
163
  | Business-data warehouse (what `awesomate_knowledge_data` calls: metrics, datasets, `dataset`, `dataset_update`, imports, `import`, `import_action`, query) | `GET /api/knowledge/data/{metrics,datasets,datasets/:id,imports,imports/:id}` · `PATCH /api/knowledge/data/datasets/:id` · `POST /api/knowledge/data/imports/:id/:action` · `POST /api/knowledge/data/query` (read-only SQL) |
164
164
  | Agent builder (what `awesomate_knowledge_agents` calls) | `GET\|POST /api/knowledge/agents` · `GET\|PATCH\|DELETE /api/knowledge/agents/:agent_id` · `POST /api/knowledge/agents/:agent_id/{publish,suspend,resume}` · `GET /api/knowledge/agents/{logs,answer-rates,where-used}` · `GET\|POST /api/knowledge/agents/policies` · `GET\|PATCH\|DELETE /api/knowledge/agents/policies/:policy_id` · `POST /api/knowledge/agents/policies/:policy_id/{suspend,resume}` |
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
- | **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
- | **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. |
166
+ | **Ask the PUBLISHED agent as a visitor** (`action:'visitor_test'`) | `POST /api/knowledge/agents/:agent_id/visitor-chat` `{message (max 2000), session_id?}`. Every plan; an unanswered question lands in the Questions inbox. |
167
+ | **Website chat key** (`action:'website_key'`, `website_keys`, `revoke_website_key`; owner only, every plan) | `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
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`). |
169
169
  | Entity layer probe (`available` false = not enabled yet, stop) | `GET /api/knowledge/entities` |
170
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**. |
@@ -144,7 +144,7 @@ Fixing one answer later is `list {setId, q: "<words from the question>"}` to fin
144
144
  `update {entryId, answer}` (a live public answer needs the owner's yes again). `archive` takes
145
145
  an entry out of every answer without deleting it.
146
146
 
147
- ## Questions the assistant couldn't answer (Support Plus and above)
147
+ ## Questions the assistant couldn't answer (every plan)
148
148
 
149
149
  A public assistant keeps the questions it could not answer, grouped so every way of asking
150
150
  shows as one. Clearing them is the fastest way to make the assistant better, and it is the
@@ -148,8 +148,8 @@ audience, so a public-audience draft can quote internal or private sources
148
148
  password). After publishing a customer-facing agent, ask the same awkward
149
149
  questions with `{action:'visitor_test', agentId, message}`: it runs the
150
150
  PUBLISHED agent through the real public visitor path, which is what a website
151
- visitor actually gets (the published agent refused the door code). It needs
152
- the plan the public widget ships with, and a question it cannot answer lands
151
+ visitor actually gets (the published agent refused the door code). It works on
152
+ every plan, and a question it cannot answer lands
153
153
  in the owner's Questions inbox, so say so before using it.
154
154
 
155
155
  Access policies (the customer groups an agent narrows to: a policy named
@@ -11,7 +11,7 @@ estimating BEFORE asking approval.
11
11
  | Web page / blog post | `add {url}` | One page per URL. A page that can't be reached, or has under 200 characters of readable text, fails the job with the reason (`error_code` `page_unreachable` or `page_unreadable`) rather than succeeding empty |
12
12
  | Whole site / blog | `add {sitemap, since?}` | A `sitemap.xml`, or a sitemap index that points to other sitemaps. Only pages on the sitemap's own site are read. Up to 500 pages per job: a sitemap listing more adds the first 500 and carries on in a follow-on job (`result_summary.remaining` and `continued_as`), so nothing is cut off silently. The one exception: when the workspace's allowance has run out (`paused: "credit_exhausted"`), no follow-on job is made and nothing resumes by itself; say how many pages were not read, and add the sitemap again after a top-up (pages already in are skipped as unchanged). `since` skips entries whose `<lastmod>` is older; when every entry is older, the job succeeds having added nothing. A sitemap that lists no pages to read fails with a plain reason: the address is a web page rather than a sitemap, it lists no page addresses, its pages are all on another site, or the sitemaps it points to couldn't be opened |
13
13
  | Link to one Vimeo or Wistia video | `add {url}` | **Copied and transcribed**, with playback, when that provider's library is connected (hub, Knowledge, Video library) and the plan includes audio and video (Pro and above, within the month's media hours): the job's `kind` is `video-link`. Not connected yet, or a channel, showcase or folder rather than one video: read as a web page, which often has too little text and fails (`page_unreadable`); once the library is connected, add the link again. Below Pro, or in a trial, it is refused (403 `upgrade_required`, `capability: "media_ingest"`) |
14
- | A whole Vimeo or Wistia library | hub, Knowledge, Video library | Pro and above. Anyone with full access connects the account with a token that can read the videos, not only the account (Vimeo: a personal access token with Private and Video Files; Wistia: a token with "Read all folder and media data"). The hub lists the library and shows what bringing it in involves before anything is copied or charged: videos with captions come in free, the rest are transcribed at A$15 per 10 hours or brought in without transcription. Only the account owner starts an import. Read progress with `awesomate_knowledge_sources {action:'video_imports'}`; connecting, starting, pausing and stopping stay in the hub |
14
+ | A whole Vimeo or Wistia library | hub, Knowledge, Video library | Pro and above. Anyone with full access connects the account with a token that can read the videos, not only the account (Vimeo: a personal access token with Private and Video Files; Wistia: a token with "Read all folder and media data"). The hub lists the library and shows what bringing it in involves before anything is copied or charged: videos with captions come in free, the rest are transcribed at A$15 per 10 hours or brought in without transcription. Only the account owner starts an import. Where the account has the video picker, the owner chooses part of the library instead (one video to try first, a folder, the newest few) and is quoted for just that; a library too big to do alone has "Have our team bring it in" in the hub, which raises a ticket and charges nothing. Read progress with `awesomate_knowledge_sources {action:'video_imports'}` (it carries `progress_words`, the `choice` and the `problems` grouped by reason) and browse with `{action:'video_library', importId, view:'folders'|'videos', folderId?, q?, from?, to?}`; connecting, choosing, the quote, starting, pausing, stopping and asking our team stay in the hub, so never say a video is chosen or coming in from what you read |
15
15
  | YouTube link | `add {url}` | Refused on every plan (400): "YouTube links are not supported yet". No upgrade changes that, so never offer one for it. Uploading the business's own video files works on Pro and above, or add the page that embeds the video |
16
16
  | Any other link to a recording (Loom, podcast audio, a file address) | `add {url}` | **Not transcribed.** Read as a web page, which gives at most its title and description; a link straight to an audio or video file has no page to read and fails (`page_unreadable`). Pro and above; below Pro, or in a trial, it is refused (403 `upgrade_required`, `capability: "media_ingest"`). To transcribe the recording, upload the file |
17
17
  | PDF / book / document / markdown | hub upload page | Text layer used; scanned pages OCR'd automatically (`auto` mode, capped at 300 OCR pages per job — over that the job fails BEFORE any vision spend) |
@@ -38,6 +38,8 @@ media are skipped by content hash (`unchanged` / `transcript_cached` in the
38
38
  job summary). Typical time-to-searchable: minutes for pages; media takes
39
39
  longer (roughly the media's own duration as a worst case).
40
40
 
41
+ To bring a web page up to date, use `refresh` {sourceId}, or `add` the same address again: both update it in place (same source, visibility, tags and collections kept; without `visibility`, an existing source keeps its own). A refresh job's `summary_text` reads "Read again: updated" or "Read again: no change since <date>"; a plain re-add reads as an add ("1 already up to date"). A video or recording link is refused by `refresh`: sent again it would come in as the video. `refresh` on anything but a web page answers `not_a_web_page`: upload the file again instead.
42
+
41
43
  ## Cost expectations (for the approval conversation)
42
44
 
43
45
  - Text (pages, posts, books): cents to a few dollars for a typical corpus.
@@ -15,7 +15,7 @@ from `awesomate_get_plan_features` for another plan.
15
15
  | What it is for | Trying it out: your FAQs and an agent that answers from them | Day-to-day use | Everything, at the highest usage |
16
16
  | FAQs | Yes | Yes | Yes |
17
17
  | Documents, spreadsheets, web pages, pasted text | A small allowance | More | The most |
18
- | Website chat widget, unanswered-questions inbox | No | Yes | Yes |
18
+ | Website chat widget, unanswered-questions inbox | Yes | Yes | Yes |
19
19
  | Audio and video, scanned documents and images | No | No | Yes |
20
20
  | Ingestion Packs (below) | No: the answer is an upgrade | Yes | Yes |
21
21