Skip to content

Commit 0a2ed7a

Browse files
committed
Release v0.2.10
1 parent a757cc4 commit 0a2ed7a

363 files changed

Lines changed: 6465 additions & 18569 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.

‎RELEASE.json‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
{
2-
"version": "0.2.9",
2+
"version": "0.2.10",
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.9/dxd-linux-x64",
10+
"url": "https://github.com/dxcode-dev/dxcode/releases/download/v0.2.10/dxd-linux-x64",
1111
"sha256": "b793f9d2c7032e5fe3e233e40fc906b12648c3dd53969b5b7ef44d2d075d219b"
1212
},
1313
"toolchain": {

‎apps/core/migration-manifest.json‎

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,11 @@
4242
"filename": "0006_release_v0.2.9.sql",
4343
"sha256": "9cf3af97e5c00f011e0a3db2032b67ec743b1708625c937fecbbc7d51e83087c",
4444
"classification": "non-destructive"
45+
},
46+
{
47+
"filename": "0007_release_v0.2.10.sql",
48+
"sha256": "a0310674d04d2e3adc19ffece43630a8b9e045d8961a8234839dc33d8fb0bce9",
49+
"classification": "non-destructive"
4550
}
4651
],
4752
"durableObjects": [
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
-- A Thread's color, chosen by its owner from the sidebar or Thread menu. NULL
2+
-- means auto: clients derive an orb color from the Thread id and leave the
3+
-- title uncolored. A chosen color tints both the orb and the title.
4+
ALTER TABLE threads ADD COLUMN color TEXT
5+
CHECK (color IS NULL OR color IN (
6+
'gray', 'blue', 'purple', 'pink', 'red', 'orange', 'yellow', 'green', 'cyan'
7+
));
8+
9+
-- Child Threads (0.2.10). A Thread the agent started with create_thread
10+
-- records the Thread it was started from. Children never nest: a child that
11+
-- starts another Thread gives it its own parent, so the new Thread is a
12+
-- sibling. The sidebar lists a child under its parent while both are in the
13+
-- same lifecycle state. Deleting the parent keeps the child as a top-level
14+
-- Thread.
15+
ALTER TABLE threads ADD COLUMN parent_thread_id TEXT
16+
REFERENCES threads (id) ON DELETE SET NULL;
17+
18+
CREATE INDEX threads_parent_idx ON threads (parent_thread_id, lifecycle_state)
19+
WHERE parent_thread_id IS NOT NULL;
20+
21+
-- The Thread whose agent sent a submission with a Thread tool (0.2.10).
22+
-- Set only for a message sent while this Thread was working: Flue shows it
23+
-- only once it joins the running turn, so clients show that a message from
24+
-- this source is on its way until Flue's history holds the submission. The
25+
-- message itself stays in Flue.
26+
ALTER TABLE thread_activity_submission ADD COLUMN source_thread_id TEXT
27+
CHECK (source_thread_id IS NULL OR length(source_thread_id) BETWEEN 1 AND 128);
28+
29+
-- better-auth 1.7.7 finds an account by (providerId, accountId), as
30+
-- Cloudflare Access sign-in does on every exchange. Only (issuer,
31+
-- accountId) and userId were indexed, so each lookup scanned the table.
32+
-- Not unique: uniqueness stays on (issuer, accountId).
33+
CREATE INDEX "account_providerId_accountId_idx"
34+
ON "account" ("providerId", "accountId");

‎apps/core/package.json‎

Lines changed: 5 additions & 5 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.9",
4+
"version": "0.2.10",
55
"license": "FSL-1.1-ALv2",
66
"type": "module",
77
"scripts": {
@@ -14,8 +14,8 @@
1414
"validate:cloudflare": "node scripts/validate-cloudflare-build.mjs && wrangler deploy --dry-run"
1515
},
1616
"dependencies": {
17-
"@better-auth/api-key": "1.7.1",
18-
"@better-auth/core": "1.7.1",
17+
"@better-auth/api-key": "1.7.7",
18+
"@better-auth/core": "1.7.7",
1919
"@better-auth/utils": "0.4.2",
2020
"@dx/api": "workspace:^",
2121
"@dx/domain": "workspace:^",
@@ -25,7 +25,7 @@
2525
"@logtape/logtape": "2.3.1",
2626
"@modelcontextprotocol/client": "2.0.0",
2727
"@opentelemetry/api": "1.9.0",
28-
"better-auth": "1.7.1",
28+
"better-auth": "1.7.7",
2929
"diff": "9.0.0",
3030
"e2b": "2.44.0",
3131
"effect": "4.0.0-rc.110",
@@ -34,7 +34,7 @@
3434
"quickjs-emscripten-core": "0.32.0",
3535
"sarvamai": "1.1.10",
3636
"valibot": "1.4.2",
37-
"zod": "4.3.6"
37+
"zod": "4.6.5"
3838
},
3939
"devDependencies": {
4040
"@cloudflare/vite-plugin": "1.53.0",

‎apps/core/scripts/startup-baseline-contract.test.ts‎

Lines changed: 0 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,6 @@
11
import { describe, expect, it } from "vitest";
22
import {
3-
percentageChange,
43
type StartupEventRow,
5-
startupBaselineOptions,
6-
startupBaselineQuery,
74
startupMetricReport,
85
} from "./startup-baseline-contract.js";
96

@@ -25,23 +22,6 @@ const row = (
2522
});
2623

2724
describe("startup baseline report", () => {
28-
it("accepts pnpm's forwarded argument separator", () => {
29-
expect(
30-
startupBaselineOptions([
31-
"--",
32-
"--since",
33-
"2026-09-17T00:00:00.000Z",
34-
"--classification",
35-
"cold",
36-
]),
37-
).toEqual(
38-
new Map([
39-
["since", "2026-09-17T00:00:00.000Z"],
40-
["classification", "cold"],
41-
]),
42-
);
43-
});
44-
4525
it("reports source-backed raw samples, nearest-rank percentiles, and failures", () => {
4626
const rows = [
4727
row("a", "request_admitted", 1, "2026-09-17T00:00:00.000Z"),
@@ -82,25 +62,6 @@ describe("startup baseline report", () => {
8262
});
8363
});
8464

85-
it("bounds correlations before joining every phase and classifies against prior history", () => {
86-
const cold = startupBaselineQuery("2026-09-17T00:00:00.000Z", "cold", 7);
87-
const warm = startupBaselineQuery("2026-09-17T00:00:00.000Z", "warm", 7);
88-
89-
expect(cold).toContain("AND NOT EXISTS (");
90-
expect(warm).toContain("AND EXISTS (");
91-
expect(cold).toContain("prior.occurred_at < opening.occurred_at");
92-
expect(cold).toContain("LIMIT 7");
93-
expect(cold).toContain("JOIN selected");
94-
expect(cold).toContain("classification_history");
95-
expect(cold).toContain("SELECT MIN(first.occurred_at)");
96-
expect(cold.trimEnd()).not.toMatch(/LIMIT 7$/);
97-
});
98-
99-
it("computes signed percentage change and rejects a zero baseline", () => {
100-
expect(percentageChange(200, 150)).toBe(-25);
101-
expect(percentageChange(0, 10)).toBeUndefined();
102-
});
103-
10465
it("classifies the first submission per Thread as cold and repeats as warm", () => {
10566
const rows = [
10667
row("first", "request_admitted", 1, "2026-09-17T00:00:00.000Z"),

‎apps/core/src/agents/agent-registration.test.ts‎

Lines changed: 0 additions & 54 deletions
This file was deleted.

‎apps/core/src/agents/dx-agent-prompt.test.ts‎

Lines changed: 0 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -2,33 +2,6 @@ import { describe, expect, it } from "vitest";
22
import { composeDxAgentPrompt, dxAgentPrompt } from "./dx-agent-prompt.js";
33

44
describe("dx agent prompt v1", () => {
5-
it.each([
6-
"software development assistant",
7-
"reading the relevant code",
8-
"When tools are available, use them",
9-
"Preserve unrelated user work",
10-
"Report tool, command, and model failures honestly",
11-
"Do not perform destructive or shared external actions without explicit authorization",
12-
"Never expose credentials or secret values",
13-
"Run relevant validation when practical",
14-
"remaining limitations accurately",
15-
])("contains the required behavior: %s", (requirement) => {
16-
expect(dxAgentPrompt).toContain(requirement);
17-
});
18-
19-
it("directs pull requests to gh and names no unregistered tool", () => {
20-
expect(dxAgentPrompt).toContain(
21-
"Use gh to read, create, or update a pull request",
22-
);
23-
expect(dxAgentPrompt).not.toContain("pull_request");
24-
});
25-
26-
it("is deterministic dx-authored text without volatile interpolation", () => {
27-
expect(dxAgentPrompt).not.toMatch(
28-
/Date\(|Date\.now|new Date|Math\.random|randomUUID|requestId|timestamp/i,
29-
);
30-
});
31-
325
it("composes empty content as the unchanged baseline and nonempty content once", () => {
336
expect(composeDxAgentPrompt("")).toBe(dxAgentPrompt);
347
const instruction = "ONE-OWNER-INSTRUCTION";
@@ -40,30 +13,4 @@ describe("dx agent prompt v1", () => {
4013
"delegated agents, specialized agents, or system tasks",
4114
);
4215
});
43-
44-
it("applies each resolved immutable skill exactly once at the top-level boundary", () => {
45-
const instruction = "ONE-IMMUTABLE-SKILL-INSTRUCTION";
46-
const composed = composeDxAgentPrompt("", [
47-
{
48-
id: "skl_00000000-0000-4000-8000-000000000044",
49-
version: 2,
50-
name: "review-guidelines",
51-
scope: "workspace",
52-
integrity: "a".repeat(64),
53-
description: "Review guidance.",
54-
instructions: instruction,
55-
resources: [{ path: "resources/checklist.md" }],
56-
},
57-
]);
58-
59-
expect(composed.split(instruction)).toHaveLength(2);
60-
expect(composed).toContain(
61-
'<skill-instructions id="skl_00000000-0000-4000-8000-000000000044" version="2">',
62-
);
63-
expect(composed).toContain("read_dx_skill_resource");
64-
expect(composed).toContain("resources/checklist.md");
65-
expect(composed).toContain(
66-
"do not automatically apply to delegated agents",
67-
);
68-
});
6916
});

‎apps/core/src/agents/dx-agent-prompt.ts‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ Use ordinary Git through shell_command: inspect with status/diff, stage with add
1111
1212
The Project's repository is checked out in the working directory. A Project's additional repositories are cloned beside it under ~/workspace/repos/<name>; before working in one, read its AGENTS.md or CLAUDE.md when present.
1313
14+
You can start child Threads with create_thread, message the owner's other Threads with send_thread_message, check on them with get_thread_status, wait for them with wait_for_threads, and rename, recolor, pin, or archive them with update_thread. Each child Thread has its own Orb, which create_thread can pick by provider and size, and starts from the project's repository; files do not move between Threads, so give a child everything it needs in its prompt. A child Thread belongs to this Thread's owner and is private to them. A message another Thread's agent sent carries source_thread on its <dx_message_author> tag: answer it as a request from that Thread, and use send_thread_message to reply there when it asks for a reply.
15+
1416
Run relevant validation when practical. Summarize completed work, actual validation results, and remaining limitations accurately.
1517
1618
Several people in a workspace can write in one Thread. Each user message starts with a <dx_message_author> tag: role is "owner" for the person who created the Thread or "contributor" for a workspace member, identifier is their name, and handle is their username. Address the sender of the message you are answering. To tag someone, write @ followed by their handle, for example @ada; use only handles that appear in a tag's handle or mentions attribute.

0 commit comments

Comments
 (0)