Commit Graph
17 Commits
Author SHA1 Message Date
Patrick Erichsen dfca6f5d9d feat: add disposable Vercel and Convex PR previews (#3017)
Adds isolated Convex-backed Vercel PR previews with shared local/preview seeding, preview-safe routing, and production guards.
2026-07-08 20:54:09 -07:00
Jason (Json)andClaude Fable 5 2651570578 feat: promotions — runtime-fetchable promotional offers (#2961)
* feat: add promotions — runtime-fetchable promotional offers

Adds a standalone promotions entity so time-boxed promotional offers
can be created, activated, and expired at runtime without shipping a
CLI release.

- promotions table: slug, display fields, draft/active/ended status,
  time window, and a declarative CLI activation payload (provider,
  authChoiceId, plugin names, model refs, signup/docs/launch URLs)
- public API: GET /api/v1/promotions (active, in-window only, cached)
  and GET /api/v1/promotions/{slug} (hides drafts and pre-launch
  activations; serves ended state)
- homepage: active promotions render as cards via a public
  promotions.listActive query; section hidden when none are live
- admin writes via HTTP (POST create / {slug}/update / {slug}/status)
  and Convex mutations, both admin-gated with audit log entries
- management dashboard: Promotions page (admin-only) to create, edit,
  and activate/end promotions
- clawhub-admin CLI: promotions list/create/update/set-status

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* fix: rebuild promotions form with proper labeled field grid

Replace the management search-row markup with Input/Textarea/Label UI
components in a dedicated responsive form grid (custom classes — the
legacy global .grid rule collides with Tailwind's grid utility).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* fix: reject slug changes on non-draft promotions

Activated promotion slugs are referenced by external links and CLI
claim provenance; renaming them would break both. Drafts can still be
renamed freely.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* fix: refresh promotions at lifecycle boundaries

* fix: preserve published promotion history

* fix: align promotion visibility boundaries

* fix: preserve promotion timestamp integrity

* fix: harden promotion editor rendering

* fix: vary promotion queries by current time

* fix: paginate promotion history safely

* fix: keep ended promotions terminal

* fix: share promotion discovery cache

* fix: bound active promotion reads

* fix: align active promotion limits

* feat: publish promotions as a hosted feed (clawhub-promotions)

Adds a third hosted feed so OpenClaw clients can discover active
promotions through the same immutable-snapshot pipeline as the plugin
and skills catalogs (ETag/304 revalidation, CDN cache headers), with a
client cache fully separate from update checks.

- packages/schema: promotionsFeed wire contract (schemaVersion 1,
  deterministic serialization, window validation)
- convex/promotionsFeed.ts: publishInternal builds the snapshot from
  active, launched promotions (same visibility rule as the public API)
  and upserts the catalogFeedPublications row
- event-driven republication: promotions.update/setStatus schedule an
  immediate republish plus runAt jobs at future window edges, so
  activation, kill-switch, launch, and expiry all land without waiting
  for a periodic publish
- GET /api/v1/feeds/promotions served through the shared feed handler;
  vercel rewrites for /v1/feeds/promotions and /feeds/promotions

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* fix: hide pre-launch promotions on the slug endpoint regardless of status

A promotion activated and then killed before startsAt was publicly
readable by slug. Hide all non-draft promotions before their window
opens; ended promotions that did launch stay visible.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* fix: publish promotions after expiry boundary

* fix: keep promotions feed publications fresh

* fix: initialize promotions feed safely

* fix: use deployable promotions function name

* fix: keep categorize dialog open while dismissing the categories dropdown

The categories dropdown was modal, which disables pointer events on the
rest of the page while open. The click that dismisses the dropdown then
targets <body>, which the parent Dialog treats as an outside interaction
and closes too — discarding unsaved category selections. Render the
dropdown non-modal so only it dismisses and Save keeps working.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* feat: let plugin owners edit categories and topics after they are set

The categorize entry point vanished once metadata existed, leaving
owners no way to change categories or topics. Keep a compact owner-only
Edit control in the taxonomy row that reopens the categorize dialog.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* chore: remove unrelated taxonomy changes

* fix: keep canceled promotions private

* fix: reject expired promotion launches

* fix: harden promotion input boundaries

* feat: enforce CLI authoring contracts on promotion writes

The OpenClaw consumer rejects promotions whose modelRef, provider, or
authChoiceId violate its shell-safe identifier grammars, skips aliases
that are not typed identifiers, and refuses model refs outside the
declared provider prefix — so a promotion authored with, say, a spaced
alias published cleanly and then silently degraded at claim time.

Validate all of it at the write path instead: shell-safe modelRef and
identifier grammars, typed-identifier aliases, <provider>/ model-ref
prefix when a provider is declared, and npm-safe plugin names via the
registry's canonical grammar (scoped @scope/name allowed). Update the
management form hint/placeholder to teach the alias contract.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* style: format promotions test

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-07-06 10:02:52 -07:00
Jesse Merhi 088339b5d2 fix: harden API rate limits (#2783) 2026-06-25 16:22:00 +10:00
Vincent Koc 6aab4f9437 feat(catalog): publish verified organization skills feed 2026-06-23 17:04:26 +08:00
Vincent Koc 94f2f532c3 fix(catalog): version and harden hosted plugin feed (#2806) 2026-06-23 16:11:40 +08:00
Vincent Koc 72c5cdd864 feat(catalog): publish hosted OpenClaw plugin feed (#2805)
* feat(schema): define hosted catalog feed contract

* feat(catalog): publish cached hosted plugin feed

* feat(catalog): add feed publication and edge delivery

* fix(catalog): recheck live official publisher state

* fix(workflow): require main for catalog publication

* fix(catalog): harden publication inputs

* docs(catalog): document consumer rollout boundary
2026-06-23 15:41:24 +08:00
Jason (Json) fc07846839 fix: make catalog metadata publisher-owned (#2757)
* fix: make catalog topics canonical

* fix: make catalog metadata publisher-owned
2026-06-19 17:14:03 -07:00
Patrick Erichsen d8f82b7379 chore: remove catalog classification rollout migrations (#2735)
* chore: remove catalog classification rollout migrations

* chore: keep static audit gate green
2026-06-18 15:52:46 -07:00
Patrick Erichsen f92ccfd488 fix: remove reply-to from transactional emails (#2725) 2026-06-17 21:07:25 -07:00
Jason (Json)andPatrick Erichsen 4bc58e4939 feat: add catalog classification backfill (#2719)
* feat: add controlled catalog taxonomy and topics

* refactor: limit taxonomy input to publish surfaces

* fix: omit inactive official-first filter

* fix: preserve unsaved catalog metadata edits

* fix: enforce catalog taxonomy invariants

* fix: close catalog taxonomy review gaps

* fix: tolerate retired stored skill categories

* fix: bound catalog metadata filter scans

* fix: preserve comma-containing topic labels

* fix: tolerate retired stored plugin categories

* fix: ignore empty secret integration metadata

* fix: honor explicit categories in related skills

* fix: harden taxonomy rollout migration

* fix: harden taxonomy browse pagination

* fix: preserve skill topic recommendation fallback

* fix: scale curated skill category browse

* fix: preserve legacy plugin category filters

* fix: preserve taxonomy compatibility semantics

* fix: preserve legacy catalog browse links

* feat: make catalog metadata editing explicit

* test: update plugin manage context contract

* fix: address taxonomy review findings

* fix: preserve empty category publish flags

* fix: preserve catalog search and publish metadata

* chore: keep taxonomy migration operator-run

* docs: keep taxonomy migrations operator-run

* fix: reject inherited category aliases

* fix: preserve normalized topic search behavior

* test: cover full topic pagination cursors

* feat: add catalog classification backfill

---------

Co-authored-by: Patrick Erichsen <patrick.a.erichsen@gmail.com>
2026-06-17 17:58:26 -07:00
Jason (Json)andPatrick Erichsen 04ec212100 feat: add controlled catalog taxonomy and topics (#2699)
* feat: add controlled catalog taxonomy and topics

* refactor: limit taxonomy input to publish surfaces

* fix: omit inactive official-first filter

* fix: preserve unsaved catalog metadata edits

* fix: enforce catalog taxonomy invariants

* fix: close catalog taxonomy review gaps

* fix: tolerate retired stored skill categories

* fix: bound catalog metadata filter scans

* fix: preserve comma-containing topic labels

* fix: tolerate retired stored plugin categories

* fix: ignore empty secret integration metadata

* fix: honor explicit categories in related skills

* fix: harden taxonomy rollout migration

* fix: harden taxonomy browse pagination

* fix: preserve skill topic recommendation fallback

* fix: scale curated skill category browse

* fix: preserve legacy plugin category filters

* fix: preserve taxonomy compatibility semantics

* fix: preserve legacy catalog browse links

* feat: make catalog metadata editing explicit

* test: update plugin manage context contract

* fix: address taxonomy review findings

* fix: preserve empty category publish flags

* fix: preserve catalog search and publish metadata

* chore: keep taxonomy migration operator-run

* docs: keep taxonomy migrations operator-run

* fix: reject inherited category aliases

* fix: preserve normalized topic search behavior

* test: cover full topic pagination cursors

* fix: tolerate invalid stored topics

---------

Co-authored-by: Patrick Erichsen <patrick.a.erichsen@gmail.com>
2026-06-17 18:20:54 -06:00
Patrick Erichsen 4b3c2bb630 Back up registry artifacts and add migration backup gate (#2600)
* fix: retarget registry backup gate

* feat: mirror package registry artifacts

* fix: keep package backup latest on newest release

* fix: bound registry backup health checks

* fix: harden package artifact backup paths

* fix: report package backup sync progress

* fix: type package backup sync result

* fix: require migration backup before dry run

* fix: simplify registry backup roots

* feat: back up registry artifacts to R2
2026-06-12 16:31:58 -07:00
Patrick Erichsen 2e7f3e752e fix: use no-reply sender for staff emails (#2602) 2026-06-11 16:58:38 -07:00
Patrick Erichsen 8e1bad4ac1 feat: improve account appeal notifications (#2520)
* feat: improve account appeal notifications

Adds Resend-backed account-action emails for bans/restores, public-safe ban reason summaries, scanner-triggered appeal scan guidance, and inline banned-account sign-in appeal messaging.

Autoreview findings addressed:

- [P2] Wire restored-account email into unban flow

- [P2] Add the scan upload test to the CI selection

* feat: quarantine malicious artifact uploads

* fix: warn on repeated malicious rejections

* fix: route banned sign-ins to appeal page

* feat: add stored scan report downloads

* chore: bump clawhub cli to 0.20.0

* test: cover malicious skill ban journey

* test: align deletion cleanup expectations after merge

* fix: hide deleted account packages before cleanup

* fix: finalize appeals moderation flow
2026-06-06 16:55:23 -07:00
Patrick Erichsen 953358a322 fix: use GitHub App auth for GitHub account lookups
* fix: use GitHub App auth for GitHub account lookups

* style: format GitHub account age backfill
2026-06-03 00:24:23 -07:00
Patrick Erichsen d67583f075 chore(release): automate cli github releases (#2331) 2026-05-19 17:05:42 -07:00
Patrick Erichsen 86898837fb docs: split ClawHub public docs from specs (#2095)
* docs: split clawhub docs source

* docs: make clawhub docs product-facing

* docs: refine public clawhub docs routes
2026-05-07 18:54:47 -07:00