Releases: alepha-dev/alepha
Releases · alepha-dev/alepha
Release list
0.27.0
Features
- cli: replace Biome with oxlint and oxfmt (
7a0d7c85) - api/users: show when a session was last used, not just when it started (
a12f9c7f) - ui: draw mermaid flowchart fences as themed diagrams (
5d416321) - orm: bound D1 queries and support the Sessions API (
3522e858) - ui: let AlephaTable take static data (
bc02a7c5) - ui: let AppShell style its scrolling main (
3bcb86f1) - ui: give AlephaTable a page-size picker and a sortable-column affordance (
d029589d) - ui: give Badge a tint variant and a tone axis (
8fe26380) - ui: bring the epics list and the questline dialog onto the quests table's shape (
761424b9) - devtools: run Try It as the session, and keep logs across a restart (
a9c7e923) - ui/admin: park the built-in nav in a 1000+ band, add a dashboard at /admin (
70160b7c) - react/head: let a meta tag carry a media query (
dcb7dcf5) - react/router: answer browser navigations with HTML error pages (
5e12817e) - cli: add dev.port, bind it strictly, and fix dev with CSS modules (
c497b37c) - cli: flag secrets pushed before the last env edit, and say a deploy is needed (
079940b0) - platform: write placeholder blobs on
db export(6f3c1d39) - platform: honour
secret: falsewhen pushing Cloudflare bindings (18efd6dd) - react: give every page its own canonical URL, og:url and twitter:url (
267eae33)
Bug Fixes
- api/workflows: publish a step's AbortController before the row says running (
febcafe7) - orm: sqlite could not introspect its own case-insensitive index (
448bf6a3) - ui: account cards were shaved by their own scroll column (
bc89c8d5) - ui: the settings rail's active entry matched nothing (
93455af8) - ui: settings cards had drifted into four different edges (
1b6af5f5) - cli: report database command failures without a stack trace (
ac7d1424) - cli: a stray word on a leaf command was silently ignored (
f1735bd8) - react: static assets were cached for 3.6 seconds, not an hour (
5b178010) - ui: settings cards drew a doubled edge next to the form card (
5aa7dbf6) - orm: sqlite schema push was silently applying nothing (
02fa1661) - cli: stop the linter from rewriting the project's dependencies (
47ac5c75) - devtools: render structured values as JSON, not [object Object] (
fe1c8108) - react: stop rebuilding accumulators inside loops (
8b3b9f3c) - websocket: decode fragmented frames instead of stringifying the list (
94b63d4f) - react: keep parameterized pages out of sitemap.xml (
a26b464f) - cli: make a freshly scaffolded project work under yarn and pnpm (
842de36c) - core: read an empty env string as an absent structured value (
1e84a7af) - platform: let the deploy name the artifact it packs (
7c534a1c) - ui: give tooltips a classic open delay (
802d97ea) - ui: return a stable singleton from useToast (
fdb2b2a1) - orm,mcp: make a failed relational read diagnosable (
18d70991) - react/router: restore scroll on back instead of jumping to the top (
b95e4e12) - react/form: replace the literal NUL byte in useFormQuerySync with \u0000 (
c7e0902c) - cli: frame the init wizard's questions and trim its sign-off (
ac52fd6f) - react: show the auth slide in GettingStarted again (
0daa9e51) - cli: honour an absolute path in
alepha init(47f88c9e) - api/users: refuse a realm that needs codes it cannot send (
74f67e98) - parameters: skip the ready preload under multi-tenancy (
c8ce8209) - orm: stop paginate leaking an unhandled rejection when count scoping throws (
aac3ef2f)
0.26.0
Features
- ui: mount the account area, and fix what the back office exposed (
88340abf) - payments: make sweep cadences configurable, default to */15 (
1fa582e1) - ui,api: finish AutoForm's settings-card layout, and fix what adopting it exposed (
356bbd0c) - cli: wire create-alepha to ask.choice/ask.confirm, drop dead Asker injection (
302d3023) - command: add ask.multiChoice and the selection parser to Asker (
88646ed8)
Bug Fixes
- cli: rewrite workerd chunks through the AST, not a regex (
dc6047d7) - ui: stop Segmented's thumb sitting one border-width off its segment (
33d2b206) - devtools: stop an unrepresentable atom schema breaking the whole UI [BREAKING] (
3c81eaba) - cli: make pnpm scaffolds hoist the bundled toolchain (
19ef91bb) - ui: make the account area work inside a clipped app shell (
ee539e99) - core,orm,cli: close the five defects a 0.25.2 release rehearsal turned up (
a5d3c636) - orm: refuse to boot in production when entities have no migrations (
3fb97ae7) - cli: generate a baseline migration for ORM presets at init (
4cf4a445) - cli,react,server,ui: close the gaps a two-preset init audit turned up (
6e09a2f7)
0.25.2
Features
- core,server: read env vars from aliases, and SERVER_PORT from PORT (
fe81013a) - api/workflows,ui: context propagation, repeat steps, cancelByKey, startEach, WorkflowTestKit (
64ac6685) - ui: share one header-actions cluster, and give the account area a header (
00b2a536) - cli: add --preset=saas to init (
065ef43c) - api/workflows,ui,api/payments: resurrect the durable workflow engine, dogfooded end to end [BREAKING] (
3eb1f942) - ui,api/users: add the account module, a user-facing counterpart to admin [BREAKING] (
28bba646) - system: attach files to a folio and export it as a zip [BREAKING] (
c2462e72) - ui/admin,api: name users on admin pages instead of bare UUIDs (
00855755) - ui: address projects by slug at the URL root [BREAKING] (
8222c09e) - analytics,ui: fold analytics into alepha/api/analytics with an admin explorer [BREAKING] (
2436b61b) - ui/admin: "Add API key" toolbar action with one-time token reveal (
718e0bb4) - ui/admin: open three host-page seams on the admin shell (
ed797a08) - orm,crypto: default primary key is an app-generated UUIDv7 [BREAKING] (
e241b37d) - ui: give every table filter select a leading icon (
47986a2b) - system: provider parity, structured shell results, memory-default tests [BREAKING] (
405f20af) - ui/admin: add adminPage() helper, migrate shop onto it (
173ed2fe) - mcp: close out the module review — templates, streaming, stdio [BREAKING] (
3ebcb93e) - ui/admin: add AdminRouter mounting the whole /admin surface (
1c188417) - ui: add AdminLayout shell for AdminRouter (
6730e02b) - ui/admin: add AdminRouter boot-time options atom (
26cc4802) - ui/admin: add default export to admin-payments component (
42fd23c2) - ui: a dropdown menu sizes to its content, not to its trigger (
fc631ede) - platform: auto-provision Cloudflare Analytics Engine through platform up (
3dbb3b96) - ui: one select for every list, and the count only gates the search (
65baeac5) - ui: weld AlephaTable's pagination row into the table panel (
eeb02a84) - analytics: the hourly rollup and prune sweep (
2647e45b) - analytics: the Analytics Engine provider and the workerd entry (
0b62aa7c) - analytics: the $analytics primitive and its module (
a3fc9bef) - analytics: relational provider with raw and rolled tiers (
4435d8e8) - analytics: derive raw and rolled tables from a dataset descriptor (
53d92e14) - analytics: the provider seam, query types and the memory provider (
e1b68681) - analytics: hour and day bucket arithmetic (
e9db15ea) - analytics: package scaffold and the Analytics Engine slot map (
31c3cb2a) - orm: upsertMany, and vitals stop losing samples to a read-modify-write (
f3673f1a) - react/router: a guarded page defaults to CSR, and guards refuse the same way on both sides (
11d7c601)
Bug Fixes
- system: drop node:path from MemoryFileSystemProvider (
e1a496e3) - api/workflows: never complete a workflow while a step is still running (
9b77cea4) - orm: emit domain events after the outermost transaction commits (
4090a7d7) - ui/table: tooltip on the column picker, and chrome that reads in light mode (
bbd12bd9) - ui: make light-mode interaction states surface-relative (
8385499a) - ui/auth: let password reset satisfy the captcha it is gated on (
90ac2498) - core: harden the kernel — parseEnv escaping, DI failure paths, env truthiness [BREAKING] (
c8b7f558) - datetime,scheduler: keep cron ticks anchored and clamp 32-bit timers (
14bee4e5) - ui/admin: point AdminRouter's doc at adminPage instead of duplicating it (
da8e1a16) - ui: close six review findings on AdminRouter (
a8d0f002) - ui/admin: the user form demanded fields the realm never collects (
76e503ac) - ui/admin: rename admin-router-options to .tsx, revert exports hack (
84a1dbae) - ui/admin: type AdminRouter's action gate instead of stringly-naming it (
43b0b43d) - ui/admin: gate nav entries on action names, not permission alone (
53990594) - core: stop reporting a boot duration workerd cannot measure (
1c602359) - files: bound the public-file edge cache at a week, not a year (
728c4b31) - cookies: the browser and the server disagreed on every shared cookie name (
db5d10c2) - react/router: apply the SSR payload before the first start hook (
807e0d4b) - analytics: GROUP BY takes a column name, not the expression (
f16d8750) - analytics: count() takes no arguments on Analytics Engine (
f922de31) - analytics: declare the prune-floor table on every runtime, not just workerd (
19402864) - analytics: look the binding up by its own name, and expose the dataset at runtime (
b85fe8db) - analytics: rename the read token and quote the dataset name in FROM (
31577f73) - analytics: scope the prune-floor table to WaeAnalyticsProvider only (
f9fedea1) - analytics: give WaeAnalyticsProvider a durable prune floor (
dfaa30c0) - analytics: numeric dimensions on WAE, drop count aggregate, close validation gaps (
0245b5c0) - ui: a collapsed sidebar's nav group is a dropdown, not a dead button (
c035c1a9) - analytics: rollup() had the identical raw-name splice as readOne, and the conformance suite's single-word fixture let both ship (
97aa548f) - analytics: resolve dimension/measure names to real columns in OrmAnalyticsProvider.readOne (
ea9d75bc) - analytics: merge Analytics Engine and cold on the read side (
df50d060) - analytics: warn on unwired retention, reject cold<hot, isolate sweep failures (
5f290e65) - analytics: forward Analytics Engine rows into cold before folding them (
333afb2b) - analytics: make WaeAnalyticsProvider DI-constructible so it can be auto-selected (
264987d1) - analytics: replace a stray NUL byte with a space in FakeAnalyticsEngine (
7d78e569) - analytics: validate the dataset name in $analytics, pin registration ordering (
cdf4e0d4) - analytics: eager dataset registration, reserve day/hour dimension names (
d442dda6) - analytics: reserve time_bucket instead of bucket, guard column collisions (
83a3a202) - analytics: drop min/max, fix prune's tier scope, sharpen conformance suite (
a403a4e9) - analytics: escape composite grouping keys, cover count/min/max, fix JSDoc style (
5bc7a5e4) - analytics: type imports, tsconfig, error messages, and measures cap test (
15a47935) - ui: a clearable Control keeps its clear label in full contrast (
44bff3dc) - react/router: stop importing a CSR page's component on the server (
ffa6521f) - security: $secure checks permissions in the browser, and a denied page stops rendering (
04f9e864)
0.25.1
Features
- cli: secrets ride the deploy, so an app never boots without them (
dfbcd5ac) - cli: deploy to Bay over ssh instead of an admin panel (
03ab985f) - cli: add host to the platform environment config (
3001a040) - system: pipe stdin into argv shell commands (
9c6262f1) - protobuf: publish @alepha/protobuf (
72e238da) - protobuf: restore @alepha/protobuf, on zod (
c59711f1) - cli: tell the agent about the devtools API (
c9230e7a) - cli: platform push, and --tag on up and deploy (
57aa558a) - mqtt,ui: publish @alepha/mqtt and @alepha/ui to npm (
a871f0de) - cli: LoreAdapter deploys a tag, and reuses a pinned one rather than rebuilding it (
cfb01bd4) - cli: ship a static site the framework did not render, and let Lore deploy one (
4ccc08ca) - bucket: Bay hands apps a bucket, and owns APP_NAME (
bd30b2ec)
Bug Fixes
- ui: a searchable select could be set, but never cleared (
ac624fe1) - cli: an answered prompt kept stdin open, so the command never exited (
92ee7abe) - oauth: the refresh_token grant authenticated nobody (
8e688b55) - api/users: the login lockout was disabled on Workers, and fail-open besides (
2655ec3c) - cli: Bay could not take a secret from CI, where there is no .env file (
f7cd6ca0) - cli: BayAdapter pushed no secrets at all, and said nothing about it (
3f13f434) - cli: four review follow-ups from the outpost-purge / sigil-apps plan (
e45e2fa0) - cli: make the Bay pre-flight actually reach the control socket (
2dcce305) - cli: fix control-socket misdiagnosis, add --control-socket support (
e8a4f4cb) - ui: make the shadcn sync actually write files, and refresh the primitives (
afdd0cb6) - api: stop racing the wall clock in the parameter TTL test (
e93de2ef) - cli: stop reporting a domain the deploy did not choose (
280d8a5c) - server: drop the body on null-body statuses, and centre the error page (
d8c6f2af) - cli,command: a mistyped subcommand exited 0, and openapi refused to run without $swagger (
34f72a12)
0.25.0
Features
- cli: the changelog publishes an allowlist, not whatever was not denied (
6a49fa53) - files: la route d'upload prend les octets en vol (
c6f5dbee) - bucket: R2 et S3 televersent un flux, prouve sur workerd (
8ce40ed6) - bucket: S3 televerse un flux dont la taille est inconnue (
3c1172d8) - server: z.stream() rend les octets au handler, en vol (
145d7e97) - command: stdout pour ce que produit une commande, le logger pour ce qu'elle raconte [BREAKING] (
2c748fdb) - files: le bucket vise decide le budget de la requete (
fc623115) - server: le plafond multipart se decide par requete, et le parseur remplace formData() (
aa1405dd) - server: alepha/server/multipart, un parseur qui ne retient rien (
aee7b577) - cli: un nouveau projet ne pose plus de question et naît lint-clean (
24ce501c) - core: z.custom, l'echappatoire du passthrough type (
8586916d) - cli: adapter lore, qui ne rend la main que quand l'app sert (
89ed7a74) - security: l'application declare si elle est multi-tenant [BREAKING] (
8c58731e) - users: le reset de mot de passe demande un captcha, et l'ancien flux s'en va [BREAKING] (
a456d5c1) - logger: per-context log buffer, and breadcrumbs on the errors that need them (
27246e84) - server: /health is part of AlephaServer, not an opt-in module [BREAKING] (
de473344) - platform: alepha platform auth login|logout (
67ef88aa) - cli: wire $room apps into the cloudflare build (
f5c6ea4c) - oauth: device authorization grant (RFC 8628) (
6c248482) - cli: deploy to Bay with
alepha platform up(62a14c8c) - cli: emit dist/manifest.json for every build target (
80353bdd) - websocket: configurable maxPayload on the node ws server (
3ca9e032) - websocket: authenticate ws upgrades from the session cookie (
b89c02e5) - websocket: surface the URL query on room connections and serve ws upgrades in vite dev (
348029ad) - orm: filter a query by a relation's columns (
f53f7c18) - orm: let a relational read ask for soft-deleted rows (
d21733a9) - orm: run $relations on Drizzle's relational query builder (
99949f09) - orm: object-shaped writes, full delegation, $repositories (
f0a299b0) - orm: complete the $relations feature set (
7121765b) - orm: $relations proof of concept with a fully inferred include (
de3f3fa8) - cli: wire D1 baseline-mark reset into
alepha platform db baseline mark(46d6127a) - cli: add d1MigrationsBaseline for the wrangler bookkeeping path (
d514a1ef) - orm,cli: add 'alepha db baseline mark' (
247d994d) - cli: add 'alepha db baseline create' (
d89b3419) - orm: upgrade drizzle-orm and drizzle-kit to 1.0.0-rc.4 (
e4617c46) - server: answer 403 for actions pruned by permissions (
e5a35ea1) - devtools: match the v3 design across every screen (
43c712ae) - files,bucket: replace $bucket with $storage; one bucket, prefixed containers [BREAKING] (
b32fa197) - devtools: v1 — dark instrument panel, JSON Schema metadata, jobs [BREAKING] (
04bd5596) - queue,scheduler: delete $queue, $consumer and $scheduler; $job is the only background primitive [BREAKING] (
1107f0c4) - cli: one project shape for alepha init, PM detected from invoker [BREAKING] (
9b9a23a0) - users,email,cli: close registration enumeration, CF email REST, devtools by default (
f36f01f7) - orm,security,react: portable SQL, $owns, keyed query cache (
cca4ef7f) - api/parameters: document a parameter, and let apps own a field (
179d9cbd) - api/parameters: resolve the version in force at a given instant (
6f6450cc) - websocket: add $room and RoomEngine for stateful WebSocket rooms (
6c7ec940) - payments-stripe: embedded Connect onboarding support (
3dfcc4e1) - websocket: Cloudflare alarm() watchdog — recover a ticking room after isolate reset (
639c6bef) - websocket: host the RoomEngine inside the Cloudflare Durable Object (
3fd6aa32) - websocket: $room primitive + Node hosting (tick rooms + headless coordinators) (
895fa085) - websocket: runtime-neutral RoomEngine (state + tick loop + per-recipient send + lifecycle) (
5aeadae6) - websocket: revive module + Cloudflare Durable Object provider (
222fd03e) - cli: export AlephaWebSocketDurableObject through the workerd server bundle (
9d6985ef) - cli: worker entry routes ws upgrades to room DO + exports DO class (
851bf2f8) - cli: emit Durable Object binding + migration for websocket apps (
81f496b4) - websocket: Cloudflare Durable Object provider + workerd module (
f7ca171b) - websocket: AlephaWebSocketDurableObject (hibernatable room object) (
52bb4c37) - websocket: finish handshake auth + multi-room dev warning (node) (
426f8a58) - websocket: shared handshake auth resolver + getEndpoint contract (
20eec9ee)
Bug Fixes
- orm,core: give each transaction its own context, not one shared slot (
c6274f5b) - security: revert the hook reorder — resolvers need the cookies [BREAKING] (
29c26068) - security: resolve who is calling before the body is read (
4d2f64fc) - bucket: a refusal keeps its status, and both providers give the same one (
43ea7ba9) - api/files: a suffix is not an identity, and a default nobody honoured (
05dbad3d) - server: the message budget bounds reading, and the walk gets closed (
3fc89782) - server: the sender does not get to pick which field its part lands in (
465a409c) - server: one reading of "is this multipart", not two [BREAKING] (
5c7ef03f) - server: un champ fichier optionnel reste du multipart (
cfb68951) - server: une route qui streame est multipart, elle aussi (
3e34c07a) - react: la langue résolue par le serveur arrive enfin au client (
ebedbacb) - core: une contrainte d'ordre de hook qui ne fait rien vaut moins que pas de contrainte (
5890952b) - react: un $page peut répondre 404, $secure prévient, et @alepha/ui parle français (
00cbf437) - cli: le CLI est teste tel que npm le livre, et huit bugs tombent avec [BREAKING] (
7cd8924e) - cli: --hints carries a JSON document, not a 255-char label (
358f07a2) - orm,security,server: ten defects, each reproduced before it was fixed (
7b709588) - cli: npm needs npx, not
npm run(1e4234ff) - cli: the Bay adapter assumed yarn (
116d40c2) - cli: three fixes that were living only in a vendored copy (
623d5ec4) - server: only warn about /metrics when it is actually reachable (
5f414a56) - websocket: expose the upgrade query on cloudflare room connections (
81a810fb) - oauth: close the three P0s in the authorization server (
5df5fd9e) - core: resolve substituted services when injecting by name (
6d2c9348) - websocket: keep the ws Node provider out of the workerd entry graph (
53ae02d2) - cli: stub import.meta.url in workerd server chunks so module-scope asset URLs survive validation (
8284179a) - cli: neutralize createRequire(import.meta.url) banners in workerd server chunks (
f3ce3583) - platform: keep the refresh token, or a Bay login dies in 15 minutes (
7d3b757d) - cli: honor the app vite config's publicDir in client builds (
f701fd29) - cli: refuse to pack a database app with no migrations (
9e121045) - react: survive a Redirection thrown by the very first render's loader (
ead9fbb8) - bucket,email: let the host place blobs and scratch data outside the bundle (
c638828d) - orm: let a generated column stay optional on a raw insert (
7225a52e) - orm: make nested create atomic, and classify relational read errors (
82a1cbe1) - orm: make SchemaToTableConfig carry column value types (
fd8e03b4) - orm: match driver errors through drizzle rc.4's cause chain (
53de81a6) - orm: give downstream un-baselined projects an actionable migrate error (
05a88691) - cli: archive drizzle-kit v1 migration folders, not just flat .sql (
ad92ef49) - cli: close the D1 anti-silence guard hole and drop dead configPath (
10f9daa6) - cli: close the v1-layout blind spot in the DROP TABLE guard + strip (
549486a7) - cli: teach D1 migration discovery drizzle-kit v1's folder layout (
5ddd60ed) - cli: archive into a real directory, and check drizzle-kit v1 migrations (
27de99de) - cli,orm: stop the D1 baseline-mark Postgres guard reading process.env (
dbc69cf5) - orm: reset NodeSqliteProvider's connection state in close() (
052e4428) - orm,cli: connect providers before baseline mark; correct D1 error text (
481516ba) - orm: convert pre-rc.4 snapshots and guard the sqlite insertDefaultValues gap (
5c2befed) - cli: let an explicit R2_BUCKET_NAME declare object storage (
bb1ae42c) - cli: apply D1 migrations without wrangler's transaction (
ae5484bc) - react,orm,cli: the high-value P3s, plus a dead-code sweep (
14beebc6) - orm: stop table rebuilds from cascading child rows away (
da276e3b) - server,orm,cli: quieter 4xx logs, bare-Error warning, contract docs (
a710ebc7) - orm: distinct+joins guard, upsert empty SET, FK message direction (
a6444133) - websocket: room connections in the registry, tick reentrancy, nits (
b287a338) - core: array-of-objects decode corruption, and clear five review findings (
30c26569) - devtools: show server-only atom values, and stop the form icons overlapping (
d56e512c) - orm,cache: the four Cloudflare-runtime P2s (
8c371742) - react/form,core: nested initial values, union arrays, schema docs (
2b1b09e5) - orm: audit pass over every closed finding — one was half-applied (
69958c89) - react: close every open react P2 (form, router, head, i18n, core) (
b2300d27) - cli,system,datetime,mcp: seven findings (
8c5e6060) - orm: five query, schema and migration bugs (
37f6f78f) - server: nine findings across core, static, proxy and ...
0.24.0
Features
- core,react,server,devtools: $atom feature pack (
fd60624e) - core,devtools: add atom reset/watch, serverOnly guard, mutation log (
3df5f09b) - core,react: add $computed primitive + useComputed hook (
a6e6ff33) - core,server: add persist adapters for $atom (cookie, localStorage, sessionStorage) (
43802902) - react: add useSelector hook + shallowEqual utility (
20be7cc4) - bucket: scope file storage keys by tenant when one is active (
e67ca3a1) - cli: gate sub-process output on log level (>= DEBUG) (
e6fe66a6) - ui: rebuild ControlSelect combobox on Base UI with multi-select pills (
215231cf) - api/notifications: org-scope the admin notification list (
73a0fd8c) - audits: implement audit retention policy with scheduled cleanup (
55bc57fb) - ui: extract TurnstileWidget — reusable Turnstile captcha component (
9dda983c) - ui: translatable parameter labels in the admin parameters editor (
a77f3fcc) - users: MySessionController — self-service session management (
be9af87c) - payments: connected-account refunds + checkout email pre-fill (
f46498f5) - payments: connected-accounts webhook support (
4968e01d) - api/notifications: lang-aware notifications — request-language capture + translations resolution (+ fr security emails) (
50212d3c) - security: $issuer access tokens compose name from first/last + mint given_name/family_name (
8b7b5f3a) - payments: redesign the dev mock checkout page as a hosted-checkout-style card (
5c6baa1f) - auth: first/last name in registration + OIDC profile claims in id_token (
1db9a343) - logger: add CliFormatterProvider for compact CLI output format, remove prettyprint [BREAKING] (
14f261cf) - ui/auth: rename post-auth redirect query param r → redirect (
e5f16fcb) - cli/cloudflare: derive the wildcard Worker-route zone from the domain (
a003e3be) - oauth: trusted (first-party) clients skip the consent screen (
4015403e) - security: ephemeral EdDSA key fallback in setSigningKey (dev/test, empty privateKey) (
2b60324e) - oauth: id_token issuance + openid-configuration + /oauth/jwks + confidential token auth (Plan 0 Task 6) (
cb163eef) - oauth: authorize prompt=none (login_required + silent SSO) + nonce round-trip (Plan 0 Task 5) (
325be5f7) - oauth: confidential client secret + bounded wildcard redirect (Plan 0 Tasks 3+4) (
9bbe5f93) - security: realm/issuer 'signing' config -> asymmetric tokens + JWKS (
5f0c3372) - security: JwtProvider asymmetric signing + getJwks (HS256 default kept) (
8777c007)
Bug Fixes
- docs,test: migrate guide examples t→z, de-flake crud updatedAt test (
d8bf1ce2) - core,server,devtools: close cross-feature $atom review findings (
77d411fc) - devtools: close serverOnly leak in atom log + metadata routes (
39a8bb89) - core,devtools: close task-5 atom review findings (
adbcc406) - core,react: close task-4 $computed review findings (
581e2d3d) - core,server: close task-3 atom-persistence review findings (
ea61f555) - core,react,devtools: address review findings on atom validation (task 2) (
8e68e1d4) - core,react,devtools: enforce atom schema validation on writes + hydration decode (
dedfae5e) - security,api,ui: close Phase 0 hotfixes + payments/jobs/ui remediation (
6af79d19) - react: correct useStore reactivity, error-boundary reset, action supersession, hash-strip (
0c89bf94) - cli: scope Cloudflare waitUntil per invocation, add queue DLQ, guard destructive migrations (
00f63e8d) - orm: keep paginate's next-page sentinel when size comes from query.limit (
d772cc6e) - scheduler: treat lock contention as a dedup skip, not an error (
89131817) - core: allow scoped injection after start() (
7e5f9a5a) - api/users: scope admin actions to the caller's realm (
869c6d67) - api/verifications: stop returning the verification code over HTTP (
17081a47) - devtools: never mount devtools endpoints in production (
e652bd3c) - lock: generate the lock id per invocation, not per composition (
3b98fd69) - redis/bun: return the SET reply so lock protocol works under Bun (
6c185d9e) - cli/db: check all providers for migration drift, not just the first (
b14f20a4) - crypto: fail closed on default APP_SECRET in production (
c3cf7c45) - api/parameters: emit parameter schema as JSON Schema, not raw ZodObject (
b9dccf45) - orm/sqlite: map array-of-enum columns to JSON (
5933dff6) - orm: stop SchemaValidator cache from growing unboundedly (
faf2e65e) - ui/segmented: match Button height pixel-for-pixel per size token (
3b59b701) - oauth: re-mint id_token on the refresh_token grant (
038f286f) - sigil: enforce excludedPaths on the petition button; fix profile avatar crop (
2042f98c) - ui: AutoForm i18nPrefix — skip description when the dict key is missing (
bed242ca) - parameters: serverless cache revalidation TTL (cross-isolate staleness) (
7054d52e) - payments: capture checkout-session webhooks on connected accounts (
3832f5eb) - payments-stripe: create Connect v2 accounts via account token (FR/PSD2) (
0fbf5377) - ui/app-shell: fill-mode sidebar anchors to the wrapper, not the viewport (
765f9600) - orm: or/and where keys AND-combine with sibling conditions instead of short-circuiting (
ed8b1dbd) - ui/auth: login + reset links propagate ?redirect= alongside realm (
91085cc0) - react/form: useForm keeps submit/lifecycle callbacks fresh across renders (
5e428a50) - server/auth: /_auth/userinfo returns the request's RESOLVED user, not a raw-token re-derivation (
ea8a7884) - ui: ControlSelect combobox trigger surface matches native SelectTrigger (bg-transparent, not bg-background) (
e97a6013) - parameters: org-scope the parameters table + provider caches (multi-tenant isolation) [BREAKING] (
44cf49c7) - api/oauth: hand login page return URL as redirect, not redirect_uri (
a9011515) - ci: repair green pipeline — oauth migration, playground e2e, table refresh (
74a67368) - auth: OIDC discovery is always lazy (never a boot dependency for a relying party) (
2ae2bcc9)
0.23.0
Features
- sitemap: runtime $sitemap primitive + static-route prerendering (
05dbebe8) - mcp: resolve + forward-to-quest blights from the Lore MCP (
e3e56053) - quests: set quest dependencies from the UI (
9885315f) - quests: make the quest description optional (
36a96eaa) - cli/i18n: resolve lazily-imported per-language dictionary files (
ec3e40d7) - mcp: link quests to petitions from the Lore MCP (
f3f9b9b0) - sigil: capture host-page context on petition submissions (
7c7d2bde) - mcp: view petition attachments inline via the Lore MCP (
0ff00fa8) - ui: federated provider buttons link to the auth broker (
2e569bc1) - auth: $realm identities.federated wiring + realm-config exposure (
8c486d33) - auth: $authFederationClient (verify assertion -> link -> session) (
0741de42) - auth: $authFederationBroker (OIDC broker emitting signed assertion) (
a4924d6c) - auth: on-demand Apple ES256 client-secret signer (
e1256d73) - auth: federation assertion sign/verify (EdDSA) (
f5af450a) - react/router: URL path-prefix i18n routing for SEO (
216037e7) - payments-stripe: add setup-mode checkout + inline subscription price_data (
445ba268) - sigil: close the petition popup on submit + thank-you on the button (
b726814f) - sigil: center the petition popup on the current monitor (
868d0be3) - react/i18n: autodetect language from Accept-Language header (
f7ce001b) - sigil: integrate SIGIL_ID into environment configuration (
287a90cc) - sigil: assemble AlephaSigil module (
d79105e0) - sigil: feedback button + annotated petition dialog (
3c0b2d85) - sigil: port ScreenshotEditor + styles (
dba6caf8) - sigil: browser telemetry bootstrap (
99150293) - sigil: web-vitals collector (
f1d8fff6) - sigil: telemetry batching queue (
ff210865) - sigil: forward server:onError to blights (
8f3ab026) - sigil: petition proxy forwards optional reporterEmail (
a5aa7238) - sigil: proxy controller (ingest + petition) (
6c4b9007) - stripe: update to Accounts v2 API for connected account creation (
8f8df71f) - sigil: SigilForwardProvider with activation rule (
66e458d2) - sigil: shared ingest/petition/vitals schemas (
081c7b22) - sigil: env schema (
b8a17e68) - react: export RootComponentsProvider (
12496a91) - react: render rootComponents slot in ReactPageProvider.root (
acce0f2e) - react: add RootComponentsProvider slot (
b01aa7c9)
Bug Fixes
- payments-stripe: edge-safe webhook signature verification (
acdc0c29) - ui: AlephaTable treats
fetchas a latest-wins data source (38b4aba9) - blights: stop the inbox infinite render loop at its source (
6c43b11f) - quest: remove spurious scrollbar on the quest view (
5e563edf) - home: render the campaign 'updated' time client-only (React #418) (
58ee31a1) - petitions: Cancel on the request form no longer 403s into the error page (
554b4a57) - i18n: exempt dynamic language.* keys from the unused-key check (
7770f34b) - ui: forward the ?r= redirect from register to the sign-in link (
2e504874) - platform: R2 teardown deletes buckets reliably on
down(efc67af7) - sigil: resolve + forward in-process for Lore's own sigil (
70e043c3) - sigil: serve petition redirect at root /sigil/request, not /api (
b8008911) - react/form: submit buttons no longer stick in loading state (
f7f8ddb3) - cli: emit send_email binding in prebuilt/manifest cloudflare deploys (
045e09fb) - react: avoid react/router self-import in RootComponentsProvider test (build circular dep) (
39253d71)
0.22.0
Features
- react/i18n: add (alias ) for reactive key translation (
2d08a203) - jobs: default sweepCron to every 15 minutes (
c8ac0afc) - cli: global --verbose flag (debug + pretty plain logs) (
55a6074c) - platform: auto-detect worker secrets from the build manifest (
2f334bba) - platform: secrets.keys allowlist — deliver worker secrets from process.env (
cf150624) - platform:
alepha platform db export+ group migrate underdb(3008cfde) - bucket: add list() to FileStorageProvider and $bucket (
fdef603b) - platform: multi-tenant deploys via tenancy + --tenant (
54b253b1) - cli/build: accept 'cf' as alias for '--target cloudflare' (
1f1995fa) - payments-stripe: store Stripe customer cache in SQL via DatabaseCacheProvider (
dd7f3ceb) - audits: add SessionAudits to alepha configuration (
b6879c68) - jobs: cron jobs keep their last successful run by default (
ae16d223) - admin-ui/jobs: open executions drawer on row click + fix priority schema (
9c63cca1) - admin-ui/parameters: confirm factory reset with a diff preview (
c9d6da5a) - admin-ui/audits: link Resource column to its admin page (
2a746f11) - users/sessions: record + show login country (
4c1d3f0b) - admin-ui/audits: source the Action filter from getAuditActions (
666c0763) - admin-ui/audits: link Actor column to the user detail page (
6ed4bb6e) - background: alepha/background module — defer() for fire-and-forget work (
5c37e8ed) - ui/auth: brand icons, OTP reset code, conditional login autofocus (
13f63791) - email/cloudflare: support display-name sender in EMAIL_FROM (
3cc69538) - ui: data-driven nav registry — $page.nav, NavShell, Spotlight (
52d83c96) - admin: global action-error toast, useQuery/useAction ports, permission gating (
9bfa0efe) - ui: brand-icon set, select leading icon, brighter dark destructive (
4fb64ab9) - react: implement useQueryParams format/push, fix useQuery initial loading (
22d9cd43) - admin/parameters: history accordion, scheduling, live creator join, audit (
be6faeb1) - admin: parameter history cards + file creator join (
9f6fc617) - admin/files: upload action, uploader column, bucket filter, image preview (
2bb3f6ec) - ui: AutoForm card mode + admin parameters editor (
cf56286e) - admin: parameters editor + lore.campaign.limits (
38922e38) - admin/users: AdminUserDetail page + clickable email column (
84a2e07a) - security: admin setUserPassword + uniqueness + auto-unverify (
6bb57178) - ui/control-select: hide search for short lists + per-option disabled (
ddacca67) - ui/alepha-table: merge filter toolbar and table seamlessly (
63954b1f) - admin: embed slim user on session rows + EN/FR translations (
4355ae60) - security: track users.lastLoginAt + surface in admin (
2a895060) - ui/alepha-table: inline action icons, tooltips, refresh spin (
cbad8f0f) - orm: findById/getById accept
with, allow readonlyontuples (b18daaee) - admin: split user table columns + sidebar brand row (
c349087f) - cli/init: default to my-app/ when run in a non-project dir (
8d8124e6) - cli/vendor: add 'vendor link' for live dev against a local checkout (
abc5053b) - admin: role picker + status filter + sticky-body table layout (
58721a1c) - ui: polish admin-users + AlephaTable floating bar (
da05b2a5) - ui/alepha-table: sticky thead + Linear-style floating bulk bar + Settings icon for table actions (
540f45ba) - ui: migrate shadcn stack to base-nova (Base UI primitives) (
0168735a) - ui/alepha-table: built-in toolbar with filters, column picker, refresh/reset, persistence (
cee49c69) - ui/alepha-table: add defaultSort + onSortChange for sort persistence (
f0ad564f) - container: make rocket-worker → CF Container → example-ssr e2e green (
d09d5ca4) - rocket-worker: example CF Worker fronting Rocket via $container (
d8f19cd8) - build,platform,bin: manifest captures envConfig — drop alepha.config.ts from artifact (
6184203d) - build,platform,rocket: manifest-driven prebuilt deploys (
5815d03f) - cli,rocket:
alepha packcommand + workspace slugify + extract-by-name (1c8b19c5) - build/docker: skip
RUN npm installwhen dist/package.json has no deps (77420472)
Bug Fixes
- bucket: read upload body once and clean up the file upload chain (
957d4db8) - command: parseEnv JSON-decodes double-quoted values (symmetric with stringify writers) (
dd8abb5f) - platform: push per-deploy .env..local keys, not just declared env (
36037311) - core: dump() must force-instantiate the graph before reading env (
b8bdd6f6) - bucket: export S3FileStorageProvider from the workerd entrypoint (
e3b3a8f0) - env: expose PUBLIC_URL at runtime on Cloudflare for absolute email links (
491e39d7) - subscription: update gracePeriodSweep cron time to 3 AM (
1ceaefe1) - ui/dropdown-menu: size action menus to content, not trigger width (
4423a538) - audits: failed login records Failed; add distinct-actions endpoint (
4522d611) - react: useAction — release the concurrency guard on unmount (
0385b616) - cli/cloudflare: don't set send_email destination_address from EMAIL_FROM (
182bc369) - email/cloudflare: use 'email' key in from object, not 'address' (
322320a7) - vite: improve SSR module invalidation for workspace-linked sources (
79442917) - ui/command: only highlight the active CommandItem (
46e23a88) - cli/vendor: resolve link source via node:path, not via shell (
dab2236a) - ui: use Base UI Checkbox indeterminate prop in AlephaTable (
1a9af18d) - api/jobs: register sweep+trim crons in constructor, not in onStart (
ac5a2dc4) - email/cloudflare: gate EmailProvider substitution on isServerless() (
c919c905) - email/cloudflare: make EMAIL_FROM env optional, re-check in send() (
433409c8) - cli/cloudflare: look up CloudflareEmailProvider by name string (
a9831388) - email/cloudflare: boot inert off-Workers instead of throwing (
7fe44067)
0.21.2
Features
- rocket: support
downop + add end-to-end smoke test (a17e67d9) - rocket: parse
alepha platform --jsonoutput instead of regex (2ab87f77) - platform: emit JSON on --json for up/down/migrate (
fb3abc61) - rocket: DeployRunner spawns
alepha platform --prebuilt(4618cdc1) - build,platform: --prebuilt skips bundle, keeps deploy-config gen (
f2e3584c) - rocket: wire S3 artifact fetch + Docker target with global tools (
be087dff) - containers: add $container primitive for typed RPC to ephemeral containers (
f8f6756d) - apps/rocket: Docker image scaffold for the Rocket runner (
c6b5c1df) - @alepha/rocket: scaffold remote alepha platform runner lib (
7e6999a8) - platform: graduate alepha/platform out of alepha/cli/platform (
7a5e62cb) - cli/platform: default PUBLIC_URL to https://<production.domain> when unset (
c9509399) - email/cloudflare: add CloudflareEmailProvider using Workers binding (
1becab6a) - ui/alepha-table: add defaultSort + onSortChange for sort persistence (
46b671d1) - api/files: add /public/files/:id route and avoid duplicate DB lookup on stream (
2a23568b) - react/form: add useFormQuerySync — two-way bind useForm to URL query params (
eadacddc) - ui: add ContextMenu component (Radix wrapper, matches DropdownMenu shape) (
8bac85bf) - ui: useToast returns a lib-agnostic Toast interface (
96e84222) - ui: polish Segmented styling and add playground demo (
baac276b)
Bug Fixes
- rocket: unblock e2e — schema log/error caps + better failure output (
5a9b0b50) - react/form: setInitialValues emits form:change for cleared keys (
310c98a0) - react/form: useFormQuerySync preserves initial form values on first mount (
f853e5a3) - react/form: useFormQuerySync preserves initial form values when URL is empty (
2be05b8a) - react/form: treat null/undefined input as unset in FormModel.getValueFromInput (
5a3a49c4) - react/router: popstate re-renders on query-only URL changes (
e236d824) - ui: make markdown links visibly distinct from body text (
006cc5d5) - orm: include table name in Repository PK-not-found error (
0a4497aa) - verifications: scope verification cooldown to a purpose bucket (
12afd379)
0.21.1
Features
- react/router: redirect to login on a denied page guard (
5cc742ce)
Bug Fixes
- ui-registry: remove the AlephaTable toolbar refresh button (
04107657) - cli: auth layout no longer double-wraps the full-page auth blocks (
d7fbfb29) - server: never leak 5xx error internals to the client in production (
dc1e00cb) - cli: scaffold admin emails into .env, not hard-coded source (
2c72dd5e) - core: detect production in the browser via import.meta.env.PROD (
b902a586) - react/router: enforce $page use middleware on client navigation (
45745e40) - cli: run embedded drizzle-kit with global exec (regression) (
b074ea24)