You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Commit 8ddf7e4
Browse filesBrowse the repository at this point in the historyBrowse files
Embed a URL that stands alone on its line in rich text (#927)
* Embed a URL that stands alone on its line in rich text
An agent writing a card, comment, message, document, to-do or schedule
entry had no way to embed a video or a Dash chart: a URL stayed a link,
where a person pasting it in the editor gets an embed. Now, in Markdown
content, a URL alone on its line becomes an embed when Basecamp can embed
it. A titled link, a URL inside a sentence, list, quote, table or code,
and anything sent with --format html are left as written.
The CLI creates every embed first, then waits for them together, polling
as the editor does, and inserts only the ones that are ready. A URL
Basecamp can't embed stays a link quietly; a refusal, a rate limit, or a
provider with nothing to embed or too slow to answer stays a link with a
warning. Nothing fails the post.
embeds create and embeds show cover the new SDK methods, and are how to
embed with --format html. The MCP catalog serves them in the files
domain. The skill, --format help, API coverage, surface snapshot and a
smoke test say so.
* Bound the embed step, poll embeds together, and leave HTML and references alone
One ten-second budget now covers every embed request, not just the
waiting, so a hung request can't hold the post. Pending embeds are polled
together, so one slow provider no longer stops the others being seen. The
first failure that isn't a refusal ends the embed step, leaving the rest
as links, so a struggling server costs the post one request, not one per
URL, and can't trip the circuit breaker the post goes through.
A paragraph holding inline HTML is left as written, since splitting it
would break the HTML, and so is a URL with a character reference, which
would reach Basecamp undecoded.
* End the embed step at a create failure too, and skip HTML nested in a paragraph
A create failure stopped further creates but still polled the embeds
created before it; now it ends the step. Inline HTML inside emphasis or a
link also keeps its paragraph as written.
* Read a standalone URL's scheme in any case
* Bump the SDK to treat the embed limit's 429 as a verdict
CreateEmbed no longer retries on 429 and its hooks name the operation
CreateEmbed, so a headerless 429 from the hourly new-embed limit sets no
CLI-wide block that would hold back the post it was for.
* Update the Nix vendorHash for the SDK bump
* Pin the SDK at its Embeds pull request's head
* Pin the SDK at its Embeds pull request's new head
* Sanitize embed warnings, and say the attachment tag is in --json
URLs and server error text in the embed warnings go through
SanitizeSingleLine, so a control character or a newline can't restyle
the terminal or forge a line. The styled renderer turns any HTML into a
placeholder, so the help says the attachment tag comes in --json's
attachment field.
* Pin the SDK at its Embeds pull request's converged head
* Stop asking for embeds quietly where Basecamp doesn't serve them
A 404 from create means the endpoint isn't there, as before the server
change deploys, so asking again for each URL only spends the budget.
* Run the embeds smoke test, and accept a URL-only body in its eval
make smoke lists its files, and smoke_embeds.bats wasn't among them. The
eval also takes the chart URL as the whole positional body, which the CLI
embeds the same way.
* Pin the SDK at its Embeds pull request's rebased head
* Pin the SDK at its v0.27.0 release
Copy file name to clipboardExpand all lines: API-COVERAGE.md
+6-3Lines changed: 6 additions & 3 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -6,12 +6,14 @@ Coverage of Basecamp 3 API endpoints. Source: [bc3-api/sections](https://github.
6
6
7
7
| Status | Sections | Endpoints |
8
8
|--------|----------|-----------|
9
-
| ✅ Implemented |53|207|
9
+
| ✅ Implemented |54|209|
10
10
| ⚠️ Blocked | 0 | 0 |
11
11
| ⏭️ Out of scope | 4 | 12 |
12
-
|**Total tracked**|**57**|**219**|
12
+
|**Total tracked**|**58**|**221**|
13
13
14
-
**207 of 207 tracked in-scope endpoints.** The three Pings endpoints bc3#13943
14
+
**209 of 209 tracked in-scope endpoints.** The two embed endpoints bc3 documents
15
+
in `embeds.md` — `POST /embeds.json` and `GET /embeds/:sgid.json` — land as
16
+
`embeds`. The three Pings endpoints bc3#13943
15
17
documented — `GET /circles.json`, `GET /circles/:id.json` and `POST
16
18
/circles.json` — land as `pings`. Moving a document, upload or folder
17
19
between folders (`POST /recordings/:id/filing.json`, documented by bc3#13644 and
@@ -238,6 +240,7 @@ cannot faithfully cover at least one endpoint for a reason outside the CLI. A
238
240
| vaults (move) | 1 |`files move`| ✅ | BC5 | - |`POST /recordings/:id/filing.json`: moves a document, upload or folder into another folder in the same project, in place (same id and comments). `--to` takes a folder ID or URL; `--position` is 1-indexed. Flat route, so no `--in`|
| attachments | 1 |`uploads`, `attachments`| ✅ | BC4 | - | Upload via `attach`; list embedded attachments via `attachments list` (parses `<bc-attachment>` from content) |
243
+
| embeds | 2 |`embeds`| ✅ | BC5 | - | create, show. Rich-text commands also embed a URL that stands alone on its line in Markdown content, through the same create |
241
244
|**Schedule**|
242
245
| calendars | 2 |`calendars`| ✅ | BC5 | - | show, update (color only). No index endpoint, so there is no `calendars list` — address one by id or pasted URL. The eleven colors are validated client-side for an immediate answer that names the alternatives; since v0.13.0 the SDK also carries the server's field-keyed 422 message |
0 commit comments