Skip to content

Commit ca32330

Browse files
committed
Release v0.2.26
1 parent ac9bc49 commit ca32330

271 files changed

Lines changed: 14847 additions & 6152 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

‎.github/workflows/ci.yml‎

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,9 @@ jobs:
1313
runs-on: ubuntu-latest
1414
steps:
1515
- uses: actions/checkout@v4
16-
- uses: pnpm/action-setup@v4
16+
- uses: pnpm/action-setup@v6.1.0
1717
with:
18-
version: 9.15.0
18+
version: 12.14.0
1919
- uses: actions/setup-node@v4
2020
with:
2121
node-version: 22.19.0
@@ -24,6 +24,8 @@ jobs:
2424
- run: pnpm format:check
2525
- run: pnpm lint
2626
- run: pnpm typecheck
27+
# Web's React tests run in this Chromium.
28+
- run: pnpm --filter @dx/web exec playwright install --with-deps chromium-headless-shell
2729
- run: pnpm test:unit
2830
- run: pnpm test:dxd
2931
- run: pnpm build

‎.github/workflows/deploy.yml‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,9 +66,9 @@ jobs:
6666
printf '%s\n' "$SELFHOST_CREDENTIALS" > ".dx/alchemy/selfhost-$name/credentials.json"
6767
fi
6868
echo "domain=$(jq -r '.domain // empty' .dx/deploy.selfhost.json)" >> "$GITHUB_OUTPUT"
69-
- uses: pnpm/action-setup@v4
69+
- uses: pnpm/action-setup@v6.1.0
7070
with:
71-
version: 9.15.0
71+
version: 12.14.0
7272
- uses: actions/setup-node@v4
7373
with:
7474
node-version: 22.19.0

‎README.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ accounts you control.
66

77
## Deploy
88

9-
Node.js 22.19 or newer, pnpm 9, a Cloudflare account, and at least one Orb
9+
Node.js 22.19 or newer, pnpm 12, a Cloudflare account, and at least one Orb
1010
provider are required: an E2B API key, or Cloudflare Containers (Workers Paid
1111
plan and Docker on the deploying machine).
1212

‎RELEASE.json‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,18 @@
11
{
2-
"version": "0.2.25",
2+
"version": "0.2.26",
33
"license": "FSL-1.1-ALv2",
44
"baselineSha256": "7847f65a9b20b366a60d52d19ca3cd6bdd1bb09b8cb506659a270f27a21d8877",
55
"e2b": {
66
"recipeSha256": "761809ee2efa2b6c750451ace29283cbb8e55b6ce3b5b14c2bb4509df71df801",
77
"profileSha256": "414dbecee2d47de36016ea05c736e2edff3a0deb298babf923887ea184a01c10"
88
},
99
"dxd": {
10-
"url": "https://github.com/dxcode-dev/dxcode/releases/download/v0.2.25/dxd-linux-x64",
10+
"url": "https://github.com/dxcode-dev/dxcode/releases/download/v0.2.26/dxd-linux-x64",
1111
"sha256": "76f424e6253874df89ceeb8f42d2f2a67ff3024d4116639cec5d04624ab4f345"
1212
},
1313
"toolchain": {
1414
"node": ">=22.19.0",
15-
"pnpm": "9.15.0",
15+
"pnpm": "12.14.0",
1616
"rust": "1.89.0"
1717
}
1818
}

‎THIRD_PARTY_NOTICES.md‎

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,28 @@
22

33
## Alchemy Cloudflare state-store selection
44

5-
`third-party/alchemy/alchemy@2.0.0-beta.74.patch` modifies Alchemy's Cloudflare
5+
`third-party/alchemy/alchemy@2.0.0-beta.83.patch` modifies Alchemy's Cloudflare
66
state-store login to select the Secrets Store containing Alchemy's token rather
7-
than an unrelated account store.
7+
than an unrelated account store, and adds the scopes named in
8+
`ALCHEMY_CLOUDFLARE_OAUTH_EXTRA_SCOPES` to its Basic and Custom OAuth scope
9+
choices.
810

911
- Source: <https://github.com/alchemy-run/alchemy>
1012
- License: Apache-2.0
1113
- License text: <https://github.com/alchemy-run/alchemy/blob/main/LICENSE>
1214

15+
## Ghostty Web rendering
16+
17+
`third-party/ghostty-web/ghostty-web@0.4.0.patch` modifies Ghostty Web's
18+
renderer to read the terminal viewport once per frame, its resize to
19+
allocate the canvas once, its Terminal to draw only when something changed
20+
and not while hidden, and its WebAssembly loader to fetch the module by URL
21+
without a second, embedded copy.
22+
23+
- Source: <https://github.com/coder/ghostty-web>
24+
- License: MIT
25+
- License text: <https://github.com/coder/ghostty-web/blob/main/LICENSE>
26+
1327
## ElevenLabs UI waveform
1428

1529
`apps/web/src/shared/ui/waveform.tsx` adapts the base canvas waveform from

‎alchemy.run.ts‎

Lines changed: 50 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -250,134 +250,134 @@ export default Alchemy.Stack(
250250
Effect.gen(function* () {
251251
const stack = yield* Stack;
252252
const configuration = yield* Config.all({
253-
environment: Config.string("DX_DEPLOYMENT_ENVIRONMENT"),
254-
deploymentTarget: Config.string("DX_DEPLOYMENT_TARGET"),
255-
deploymentLabel: Config.string("DX_DEPLOYMENT_LABEL"),
253+
environment: Config.String("DX_DEPLOYMENT_ENVIRONMENT"),
254+
deploymentTarget: Config.String("DX_DEPLOYMENT_TARGET"),
255+
deploymentLabel: Config.String("DX_DEPLOYMENT_LABEL"),
256256
deploymentName: Config.option(
257-
Config.nonEmptyString("DX_DEPLOYMENT_NAME"),
257+
Config.NonEmptyString("DX_DEPLOYMENT_NAME"),
258258
),
259-
adminEmail: Config.option(Config.nonEmptyString("DX_ADMIN_EMAIL")),
260-
adminPassword: Config.option(Config.redacted("DX_ADMIN_PASSWORD")),
259+
adminEmail: Config.option(Config.NonEmptyString("DX_ADMIN_EMAIL")),
260+
adminPassword: Config.option(Config.Redacted("DX_ADMIN_PASSWORD")),
261261
adminPasswordReset: Config.withDefault(
262-
Config.boolean("DX_ADMIN_PASSWORD_RESET"),
262+
Config.Boolean("DX_ADMIN_PASSWORD_RESET"),
263263
false,
264264
),
265265
integrations: Config.withDefault(
266-
Config.string("DX_DEPLOYMENT_INTEGRATIONS"),
266+
Config.String("DX_DEPLOYMENT_INTEGRATIONS"),
267267
"",
268268
),
269-
origin: Config.string("DX_DEPLOYMENT_ORIGIN"),
269+
origin: Config.String("DX_DEPLOYMENT_ORIGIN"),
270270
authEmailFrom: Config.option(
271-
Config.nonEmptyString("DX_DEPLOYMENT_AUTH_EMAIL_FROM"),
271+
Config.NonEmptyString("DX_DEPLOYMENT_AUTH_EMAIL_FROM"),
272272
),
273-
revision: Config.string("DX_DEPLOYMENT_REVISION"),
274-
workerName: Config.string("DX_DEPLOYMENT_WORKER_NAME"),
275-
databaseName: Config.string("DX_DEPLOYMENT_DATABASE_NAME"),
276-
bucketName: Config.string("DX_DEPLOYMENT_BUCKET_NAME"),
277-
credentialsFile: Config.string("DX_DEPLOYMENT_CREDENTIALS_FILE"),
273+
revision: Config.String("DX_DEPLOYMENT_REVISION"),
274+
workerName: Config.String("DX_DEPLOYMENT_WORKER_NAME"),
275+
databaseName: Config.String("DX_DEPLOYMENT_DATABASE_NAME"),
276+
bucketName: Config.String("DX_DEPLOYMENT_BUCKET_NAME"),
277+
credentialsFile: Config.String("DX_DEPLOYMENT_CREDENTIALS_FILE"),
278278
bootstrapRepository: Config.withDefault(
279-
Config.string("DX_DEPLOYMENT_BOOTSTRAP_REPOSITORY"),
279+
Config.String("DX_DEPLOYMENT_BOOTSTRAP_REPOSITORY"),
280280
"",
281281
),
282-
packageDirectory: Config.string("DX_DEPLOYMENT_PACKAGE_DIR"),
283-
e2bTemplate: Config.string("DX_DEPLOYMENT_E2B_TEMPLATE"),
284-
e2bTemplateBuildId: Config.string("DX_DEPLOYMENT_E2B_TEMPLATE_BUILD_ID"),
285-
dxdChecksum: Config.string("DX_DEPLOYMENT_DXD_CHECKSUM"),
286-
dxdReleaseUrl: Config.string("DX_DEPLOYMENT_DXD_RELEASE_URL"),
282+
packageDirectory: Config.String("DX_DEPLOYMENT_PACKAGE_DIR"),
283+
e2bTemplate: Config.String("DX_DEPLOYMENT_E2B_TEMPLATE"),
284+
e2bTemplateBuildId: Config.String("DX_DEPLOYMENT_E2B_TEMPLATE_BUILD_ID"),
285+
dxdChecksum: Config.String("DX_DEPLOYMENT_DXD_CHECKSUM"),
286+
dxdReleaseUrl: Config.String("DX_DEPLOYMENT_DXD_RELEASE_URL"),
287287
sourceShallowClone: Config.withDefault(
288-
Config.boolean("DX_DEPLOYMENT_SOURCE_SHALLOW_CLONE"),
288+
Config.Boolean("DX_DEPLOYMENT_SOURCE_SHALLOW_CLONE"),
289289
true,
290290
),
291291
workspaceInactivityMs: Config.option(
292-
Config.number("DX_DEPLOYMENT_WORKSPACE_INACTIVITY_MS"),
292+
Config.Number("DX_DEPLOYMENT_WORKSPACE_INACTIVITY_MS"),
293293
),
294294
turnstileTestKeys: Config.withDefault(
295-
Config.boolean("DX_DEPLOYMENT_TURNSTILE_TEST_KEYS"),
295+
Config.Boolean("DX_DEPLOYMENT_TURNSTILE_TEST_KEYS"),
296296
false,
297297
),
298298
// Self-host only: whether magic link needs a Turnstile widget. Hosted
299299
// targets derive it from their sender.
300-
turnstile: Config.option(Config.boolean("DX_DEPLOYMENT_TURNSTILE")),
301-
e2bApiKey: Config.option(Config.redacted("E2B_API_KEY")),
302-
githubApp: Config.option(Config.redacted("DX_INTEGRATION_GITHUB_APP")),
303-
sarvamApiKey: Config.option(Config.redacted("SARVAM_API_KEY")),
300+
turnstile: Config.option(Config.Boolean("DX_DEPLOYMENT_TURNSTILE")),
301+
e2bApiKey: Config.option(Config.Redacted("E2B_API_KEY")),
302+
githubApp: Config.option(Config.Redacted("DX_INTEGRATION_GITHUB_APP")),
303+
sarvamApiKey: Config.option(Config.Redacted("SARVAM_API_KEY")),
304304
// How attachment bytes move: "token" deployments mint a bucket-scoped
305305
// R2 token Core signs direct URLs with; "core" deployments (Alchemy
306306
// OAuth, which cannot create tokens) carry the bytes through Core.
307307
attachmentSigning: Config.withDefault(
308-
Config.literals(
308+
Config.Literals(
309309
["token", "core"] as const,
310310
"DX_DEPLOYMENT_ATTACHMENT_SIGNING",
311311
),
312312
"token",
313313
),
314314
cloudflareAccountId: Config.option(
315-
Config.nonEmptyString("CLOUDFLARE_ACCOUNT_ID"),
315+
Config.NonEmptyString("CLOUDFLARE_ACCOUNT_ID"),
316316
),
317-
exaApiKey: Config.option(Config.redacted("EXA_API_KEY")),
317+
exaApiKey: Config.option(Config.Redacted("EXA_API_KEY")),
318318
// Self-host sign-in providers and admission, validated by the runner.
319-
signIn: Config.option(Config.nonEmptyString("DX_DEPLOYMENT_SIGN_IN")),
319+
signIn: Config.option(Config.NonEmptyString("DX_DEPLOYMENT_SIGN_IN")),
320320
googleClientSecret: Config.option(
321-
Config.redacted("DX_GOOGLE_CLIENT_SECRET"),
321+
Config.Redacted("DX_GOOGLE_CLIENT_SECRET"),
322322
),
323-
plugins: Config.withDefault(Config.string("DX_DEPLOYMENT_PLUGINS"), ""),
323+
plugins: Config.withDefault(Config.String("DX_DEPLOYMENT_PLUGINS"), ""),
324324
// Orb providers the deployment installs: e2b, cloudflare, or both.
325325
orbProviders: Config.withDefault(
326-
Config.string("DX_DEPLOYMENT_ORB_PROVIDERS"),
326+
Config.String("DX_DEPLOYMENT_ORB_PROVIDERS"),
327327
"e2b",
328328
),
329329
orbWorkerName: Config.option(
330-
Config.nonEmptyString("DX_DEPLOYMENT_ORB_WORKER_NAME"),
330+
Config.NonEmptyString("DX_DEPLOYMENT_ORB_WORKER_NAME"),
331331
),
332332
workloadIdentitySigningKeys: Config.option(
333-
Config.redacted("DX_WORKLOAD_IDENTITY_SIGNING_KEYS"),
333+
Config.Redacted("DX_WORKLOAD_IDENTITY_SIGNING_KEYS"),
334334
),
335335
bitbucketOAuth: Config.option(
336-
Config.redacted("DX_INTEGRATION_BITBUCKET_OAUTH"),
336+
Config.Redacted("DX_INTEGRATION_BITBUCKET_OAUTH"),
337337
),
338338
deploymentZone: Config.option(
339-
Config.nonEmptyString("DX_DEPLOYMENT_ZONE"),
339+
Config.NonEmptyString("DX_DEPLOYMENT_ZONE"),
340340
),
341341
workersDevSubdomain: Config.option(
342-
Config.nonEmptyString("DX_DEPLOYMENT_WORKERS_DEV_SUBDOMAIN"),
342+
Config.NonEmptyString("DX_DEPLOYMENT_WORKERS_DEV_SUBDOMAIN"),
343343
),
344344
daemonIngressName: Config.withDefault(
345-
Config.nonEmptyString("DX_DEPLOYMENT_DAEMON_INGRESS_NAME"),
345+
Config.NonEmptyString("DX_DEPLOYMENT_DAEMON_INGRESS_NAME"),
346346
"dx-dxd",
347347
),
348348
signupEnabled: Config.withDefault(
349-
Config.boolean("DX_SIGNUP_ENABLED"),
349+
Config.Boolean("DX_SIGNUP_ENABLED"),
350350
false,
351351
),
352352
githubCopilotClientId: Config.option(
353-
Config.nonEmptyString("DX_GITHUB_COPILOT_CLIENT_ID"),
353+
Config.NonEmptyString("DX_GITHUB_COPILOT_CLIENT_ID"),
354354
),
355355
modelDeploymentProviders: Config.option(
356-
Config.nonEmptyString("DX_MODEL_DEPLOYMENT_PROVIDERS"),
356+
Config.NonEmptyString("DX_MODEL_DEPLOYMENT_PROVIDERS"),
357357
),
358358
modelEndpointAllowlist: Config.option(
359-
Config.nonEmptyString("DX_MODEL_ENDPOINT_ALLOWLIST"),
359+
Config.NonEmptyString("DX_MODEL_ENDPOINT_ALLOWLIST"),
360360
),
361361
workersAiEnabled: Config.withDefault(
362-
Config.boolean("DX_MODEL_WORKERS_AI_ENABLED"),
362+
Config.Boolean("DX_MODEL_WORKERS_AI_ENABLED"),
363363
true,
364364
),
365365
workerTraces: Config.withDefault(
366-
Config.boolean("DX_DEPLOYMENT_WORKER_TRACES"),
366+
Config.Boolean("DX_DEPLOYMENT_WORKER_TRACES"),
367367
false,
368368
),
369369
// Portals: a dedicated zone (never the app's registrable domain) whose
370370
// first-level labels `t-<uuid>-p<port>` serve guest ports. Universal
371371
// SSL covers one wildcard level, so the domain is the zone apex.
372372
portalDomain: Config.option(
373-
Config.nonEmptyString("DX_DEPLOYMENT_PORTAL_DOMAIN"),
373+
Config.NonEmptyString("DX_DEPLOYMENT_PORTAL_DOMAIN"),
374374
),
375375
portalZoneId: Config.option(
376-
Config.nonEmptyString("DX_DEPLOYMENT_PORTAL_ZONE_ID"),
376+
Config.NonEmptyString("DX_DEPLOYMENT_PORTAL_ZONE_ID"),
377377
),
378378
// The deployment runner names it within the 63-character script limit.
379379
portalWorkerName: Config.option(
380-
Config.nonEmptyString("DX_DEPLOYMENT_PORTAL_WORKER_NAME"),
380+
Config.NonEmptyString("DX_DEPLOYMENT_PORTAL_WORKER_NAME"),
381381
),
382382
});
383383

‎apps/core/package.json‎

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"name": "@dx/core",
33
"private": true,
4-
"version": "0.2.25",
4+
"version": "0.2.26",
55
"license": "FSL-1.1-ALv2",
66
"type": "module",
77
"scripts": {
@@ -19,8 +19,8 @@
1919
"@better-auth/utils": "0.4.2",
2020
"@dx/api": "workspace:^",
2121
"@dx/domain": "workspace:^",
22-
"@effect/sql-d1": "4.0.0-rc.110",
23-
"@flue/runtime": "file:../../third-party/flue/runtime-56db2a40ca0e69d97adc53098874ea33c5b617c9.tgz",
22+
"@effect/sql-d1": "4.0.5",
23+
"@flue/runtime": "file:../../third-party/flue/runtime-e7bef20be3c74f4ffdeeed83b1fe161a1fb5f0c8.tgz",
2424
"@jitl/quickjs-wasmfile-release-sync": "0.32.0",
2525
"@logtape/logtape": "2.3.1",
2626
"@modelcontextprotocol/client": "2.0.0",
@@ -29,7 +29,7 @@
2929
"better-auth": "1.7.7",
3030
"diff": "9.0.0",
3131
"e2b": "2.44.0",
32-
"effect": "4.0.0-rc.110",
32+
"effect": "4.0.5",
3333
"hono": "4.12.32",
3434
"jose": "6.2.3",
3535
"quickjs-emscripten-core": "0.32.0",
@@ -43,8 +43,8 @@
4343
"@cloudflare/vitest-plugin": "1.0.0",
4444
"@cloudflare/workers-types": "5.20260820.1",
4545
"@earendil-works/pi-ai": "0.85.1",
46-
"@flue/sdk": "file:../../third-party/flue/sdk-56db2a40ca0e69d97adc53098874ea33c5b617c9.tgz",
47-
"@flue/vite": "file:../../third-party/flue/vite-56db2a40ca0e69d97adc53098874ea33c5b617c9.tgz",
46+
"@flue/sdk": "file:../../third-party/flue/sdk-e7bef20be3c74f4ffdeeed83b1fe161a1fb5f0c8.tgz",
47+
"@flue/vite": "file:../../third-party/flue/vite-e7bef20be3c74f4ffdeeed83b1fe161a1fb5f0c8.tgz",
4848
"@msw/cloudflare": "^0.0.1",
4949
"@types/ws": "8.18.1",
5050
"@valibot/to-json-schema": "1.7.1",

‎apps/core/src/auth/requirements.ts‎

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,10 @@ const parseUrl = (value: string, reason: AuthenticationConfigurationReason) =>
2525
Effect.try({ try: () => new URL(value), catch: () => fail(reason) });
2626

2727
const configuration = Config.all({
28-
environment: Config.nonEmptyString("DX_ENV"),
29-
authUrl: Config.nonEmptyString("DX_AUTH_URL"),
30-
trustedOrigins: Config.nonEmptyString("DX_AUTH_TRUSTED_ORIGINS"),
31-
secret: Config.redacted("BETTER_AUTH_SECRET"),
28+
environment: Config.NonEmptyString("DX_ENV"),
29+
authUrl: Config.NonEmptyString("DX_AUTH_URL"),
30+
trustedOrigins: Config.NonEmptyString("DX_AUTH_TRUSTED_ORIGINS"),
31+
secret: Config.Redacted("BETTER_AUTH_SECRET"),
3232
});
3333

3434
export interface AuthenticationRequirements {

‎apps/core/src/dev/reference-lifecycle/config.ts‎

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,10 @@ export interface ReferenceLifecycleConfig {
2424
}
2525

2626
const configuration = Config.all({
27-
baseUrl: Config.string("DX_BASE_URL"),
28-
apiToken: Config.redacted("DX_TEMP_API_TOKEN"),
29-
projectName: Config.option(Config.string("DX_REFERENCE_PROJECT_NAME")),
30-
projectId: Config.option(Config.string("DX_REFERENCE_PROJECT_ID")),
27+
baseUrl: Config.String("DX_BASE_URL"),
28+
apiToken: Config.Redacted("DX_TEMP_API_TOKEN"),
29+
projectName: Config.option(Config.String("DX_REFERENCE_PROJECT_NAME")),
30+
projectId: Config.option(Config.String("DX_REFERENCE_PROJECT_ID")),
3131
});
3232

3333
const decodeBaseUrl = Effect.fn("decodeReferenceBaseUrl")(function* (

‎apps/core/src/execution/cloudflare/provider.ts‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ const InactivityMs = Schema.Finite.check(
5353

5454
const inactivityMs = (bindings: Bindings) =>
5555
Effect.runPromise(
56-
Config.number("DX_WORKSPACE_INACTIVITY_MS")
56+
Config.Number("DX_WORKSPACE_INACTIVITY_MS")
5757
.pipe(Config.withDefault(DEFAULT_WORKSPACE_INACTIVITY_MS))
5858
.parse(ConfigProvider.fromUnknown(bindings))
5959
.pipe(

0 commit comments

Comments
 (0)