rewire daemon services on project open
test / unit + widget + golden + a11y (push) Failing after 27s
test / integration_test (xvfb) (push) Has been skipped
test / bundle smoke (xvfb 5s) (push) Has been skipped
test / daemon subprocess + web WASM smoke (push) Has been skipped

The daemon dispatcher (pql, git, files, editor) was built once at
boot against cwd and never updated. Opening a project from the
welcome screen or directory picker had no effect on the daemon
services — pql couldn't find its index, git operated on the wrong
repo.

Now onProjectOpen rebuilds the full dispatcher against the new
workspace root and swaps it into the InProcessClient. The IPC
client's dispatcher field is no longer final.

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
2026-05-03 22:29:03 +02:00
co-authored by Claude
parent a5221792ba
commit 7b30748bf5
3 changed files with 138 additions and 118 deletions
+100 -100
View File
@@ -1,5 +1,5 @@
{
"exported_at": "2026-05-03T20:22:23Z",
"exported_at": "2026-05-03T20:29:03Z",
"decisions": [
{
"id": "D-1",
@@ -9,7 +9,7 @@
"status": "active",
"date": "2026-04-20",
"file_path": "decisions/architecture.md",
"synced_at": "2026-05-03 20:21:27"
"synced_at": "2026-05-03 20:28:13"
},
{
"id": "D-3",
@@ -19,7 +19,7 @@
"status": "active",
"date": "2026-04-20",
"file_path": "decisions/architecture.md",
"synced_at": "2026-05-03 20:21:27"
"synced_at": "2026-05-03 20:28:13"
},
{
"id": "D-4",
@@ -29,7 +29,7 @@
"status": "active",
"date": "2026-04-20",
"file_path": "decisions/architecture.md",
"synced_at": "2026-05-03 20:21:27"
"synced_at": "2026-05-03 20:28:13"
},
{
"id": "D-5",
@@ -39,7 +39,7 @@
"status": "active",
"date": "2026-04-20",
"file_path": "decisions/architecture.md",
"synced_at": "2026-05-03 20:21:27"
"synced_at": "2026-05-03 20:28:13"
},
{
"id": "D-6",
@@ -49,7 +49,7 @@
"status": "active",
"date": "2026-04-20",
"file_path": "decisions/architecture.md",
"synced_at": "2026-05-03 20:21:27"
"synced_at": "2026-05-03 20:28:13"
},
{
"id": "D-7",
@@ -59,7 +59,7 @@
"status": "active",
"date": "2026-04-21",
"file_path": "decisions/architecture.md",
"synced_at": "2026-05-03 20:21:27"
"synced_at": "2026-05-03 20:28:13"
},
{
"id": "D-8",
@@ -69,7 +69,7 @@
"status": "active",
"date": "2026-04-21",
"file_path": "decisions/architecture.md",
"synced_at": "2026-05-03 20:21:27"
"synced_at": "2026-05-03 20:28:13"
},
{
"id": "D-9",
@@ -79,7 +79,7 @@
"status": "active",
"date": "2026-04-21",
"file_path": "decisions/architecture.md",
"synced_at": "2026-05-03 20:21:27"
"synced_at": "2026-05-03 20:28:13"
},
{
"id": "D-10",
@@ -89,7 +89,7 @@
"status": "active",
"date": "2026-04-21",
"file_path": "decisions/architecture.md",
"synced_at": "2026-05-03 20:21:27"
"synced_at": "2026-05-03 20:28:13"
},
{
"id": "D-11",
@@ -99,7 +99,7 @@
"status": "active",
"date": "2026-04-21",
"file_path": "decisions/architecture.md",
"synced_at": "2026-05-03 20:21:27"
"synced_at": "2026-05-03 20:28:13"
},
{
"id": "D-12",
@@ -109,7 +109,7 @@
"status": "active",
"date": "2026-04-21",
"file_path": "decisions/architecture.md",
"synced_at": "2026-05-03 20:21:27"
"synced_at": "2026-05-03 20:28:13"
},
{
"id": "D-13",
@@ -119,7 +119,7 @@
"status": "active",
"date": "2026-04-21",
"file_path": "decisions/architecture.md",
"synced_at": "2026-05-03 20:21:27"
"synced_at": "2026-05-03 20:28:13"
},
{
"id": "D-14",
@@ -129,7 +129,7 @@
"status": "active",
"date": "2026-04-21",
"file_path": "decisions/architecture.md",
"synced_at": "2026-05-03 20:21:27"
"synced_at": "2026-05-03 20:28:13"
},
{
"id": "D-15",
@@ -139,7 +139,7 @@
"status": "active",
"date": "2026-04-21",
"file_path": "decisions/extensions.md",
"synced_at": "2026-05-03 20:21:27"
"synced_at": "2026-05-03 20:28:13"
},
{
"id": "D-16",
@@ -149,7 +149,7 @@
"status": "active",
"date": "2026-04-21",
"file_path": "decisions/extensions.md",
"synced_at": "2026-05-03 20:21:27"
"synced_at": "2026-05-03 20:28:13"
},
{
"id": "D-17",
@@ -159,7 +159,7 @@
"status": "active",
"date": "2026-04-21",
"file_path": "decisions/extensions.md",
"synced_at": "2026-05-03 20:21:27"
"synced_at": "2026-05-03 20:28:13"
},
{
"id": "D-18",
@@ -169,7 +169,7 @@
"status": "active",
"date": "2026-04-21",
"file_path": "decisions/extensions.md",
"synced_at": "2026-05-03 20:21:27"
"synced_at": "2026-05-03 20:28:13"
},
{
"id": "D-19",
@@ -179,7 +179,7 @@
"status": "active",
"date": "2026-04-21",
"file_path": "decisions/extensions.md",
"synced_at": "2026-05-03 20:21:27"
"synced_at": "2026-05-03 20:28:13"
},
{
"id": "D-20",
@@ -189,7 +189,7 @@
"status": "active",
"date": "2026-04-21",
"file_path": "decisions/accessibility.md",
"synced_at": "2026-05-03 20:21:27"
"synced_at": "2026-05-03 20:28:13"
},
{
"id": "D-21",
@@ -199,7 +199,7 @@
"status": "active",
"date": "2026-04-21",
"file_path": "decisions/accessibility.md",
"synced_at": "2026-05-03 20:21:27"
"synced_at": "2026-05-03 20:28:13"
},
{
"id": "D-22",
@@ -209,7 +209,7 @@
"status": "active",
"date": "2026-04-21",
"file_path": "decisions/accessibility.md",
"synced_at": "2026-05-03 20:21:27"
"synced_at": "2026-05-03 20:28:13"
},
{
"id": "D-23",
@@ -219,7 +219,7 @@
"status": "active",
"date": "2026-04-21",
"file_path": "decisions/testing.md",
"synced_at": "2026-05-03 20:21:27"
"synced_at": "2026-05-03 20:28:13"
},
{
"id": "D-24",
@@ -229,7 +229,7 @@
"status": "active",
"date": "2026-04-21",
"file_path": "decisions/testing.md",
"synced_at": "2026-05-03 20:21:27"
"synced_at": "2026-05-03 20:28:13"
},
{
"id": "D-25",
@@ -239,7 +239,7 @@
"status": "active",
"date": "2026-04-21",
"file_path": "decisions/testing.md",
"synced_at": "2026-05-03 20:21:27"
"synced_at": "2026-05-03 20:28:13"
},
{
"id": "D-26",
@@ -249,7 +249,7 @@
"status": "active",
"date": "2026-04-21",
"file_path": "decisions/testing.md",
"synced_at": "2026-05-03 20:21:27"
"synced_at": "2026-05-03 20:28:13"
},
{
"id": "D-27",
@@ -259,7 +259,7 @@
"status": "active",
"date": "2026-04-21",
"file_path": "decisions/testing.md",
"synced_at": "2026-05-03 20:21:27"
"synced_at": "2026-05-03 20:28:13"
},
{
"id": "D-28",
@@ -269,7 +269,7 @@
"status": "active",
"date": "2026-04-21",
"file_path": "decisions/testing.md",
"synced_at": "2026-05-03 20:21:27"
"synced_at": "2026-05-03 20:28:13"
},
{
"id": "D-29",
@@ -279,7 +279,7 @@
"status": "active",
"date": "2026-04-21",
"file_path": "decisions/testing.md",
"synced_at": "2026-05-03 20:21:27"
"synced_at": "2026-05-03 20:28:13"
},
{
"id": "D-30",
@@ -289,7 +289,7 @@
"status": "active",
"date": "2026-04-21",
"file_path": "decisions/testing.md",
"synced_at": "2026-05-03 20:21:27"
"synced_at": "2026-05-03 20:28:13"
},
{
"id": "D-31",
@@ -299,7 +299,7 @@
"status": "active",
"date": "2026-04-21",
"file_path": "decisions/tooling.md",
"synced_at": "2026-05-03 20:21:27"
"synced_at": "2026-05-03 20:28:13"
},
{
"id": "D-32",
@@ -309,7 +309,7 @@
"status": "active",
"date": "2026-04-21",
"file_path": "decisions/tooling.md",
"synced_at": "2026-05-03 20:21:27"
"synced_at": "2026-05-03 20:28:13"
},
{
"id": "D-33",
@@ -319,7 +319,7 @@
"status": "active",
"date": "2026-04-21",
"file_path": "decisions/tooling.md",
"synced_at": "2026-05-03 20:21:27"
"synced_at": "2026-05-03 20:28:13"
},
{
"id": "D-34",
@@ -329,7 +329,7 @@
"status": "active",
"date": "2026-04-21",
"file_path": "decisions/process.md",
"synced_at": "2026-05-03 20:21:27"
"synced_at": "2026-05-03 20:28:13"
},
{
"id": "D-35",
@@ -339,7 +339,7 @@
"status": "active",
"date": "2026-04-21",
"file_path": "decisions/process.md",
"synced_at": "2026-05-03 20:21:27"
"synced_at": "2026-05-03 20:28:13"
},
{
"id": "D-36",
@@ -349,7 +349,7 @@
"status": "active",
"date": "2026-04-21",
"file_path": "decisions/process.md",
"synced_at": "2026-05-03 20:21:27"
"synced_at": "2026-05-03 20:28:13"
},
{
"id": "D-37",
@@ -359,7 +359,7 @@
"status": "active",
"date": "2026-04-21",
"file_path": "decisions/process.md",
"synced_at": "2026-05-03 20:21:27"
"synced_at": "2026-05-03 20:28:13"
},
{
"id": "D-38",
@@ -369,7 +369,7 @@
"status": "active",
"date": "2026-04-21",
"file_path": "decisions/process.md",
"synced_at": "2026-05-03 20:21:27"
"synced_at": "2026-05-03 20:28:13"
},
{
"id": "D-39",
@@ -379,7 +379,7 @@
"status": "active",
"date": "2026-04-21",
"file_path": "decisions/process.md",
"synced_at": "2026-05-03 20:21:27"
"synced_at": "2026-05-03 20:28:13"
},
{
"id": "D-40",
@@ -389,7 +389,7 @@
"status": "active",
"date": "2026-04-21",
"file_path": "decisions/process.md",
"synced_at": "2026-05-03 20:21:27"
"synced_at": "2026-05-03 20:28:13"
},
{
"id": "D-41",
@@ -399,7 +399,7 @@
"status": "active",
"date": "2026-04-22",
"file_path": "decisions/architecture.md",
"synced_at": "2026-05-03 20:21:27"
"synced_at": "2026-05-03 20:28:13"
},
{
"id": "D-42",
@@ -409,7 +409,7 @@
"status": "active",
"date": "2026-04-22",
"file_path": "decisions/tooling.md",
"synced_at": "2026-05-03 20:21:27"
"synced_at": "2026-05-03 20:28:13"
},
{
"id": "D-43",
@@ -419,7 +419,7 @@
"status": "active",
"date": "2026-04-22",
"file_path": "decisions/architecture.md",
"synced_at": "2026-05-03 20:21:27"
"synced_at": "2026-05-03 20:28:13"
},
{
"id": "D-44",
@@ -429,7 +429,7 @@
"status": "active",
"date": "2026-04-22",
"file_path": "decisions/architecture.md",
"synced_at": "2026-05-03 20:21:27"
"synced_at": "2026-05-03 20:28:13"
},
{
"id": "D-45",
@@ -439,7 +439,7 @@
"status": "active",
"date": "2026-04-22",
"file_path": "decisions/architecture.md",
"synced_at": "2026-05-03 20:21:27"
"synced_at": "2026-05-03 20:28:13"
},
{
"id": "D-46",
@@ -449,7 +449,7 @@
"status": "active",
"date": "2026-04-22",
"file_path": "decisions/extensions.md",
"synced_at": "2026-05-03 20:21:27"
"synced_at": "2026-05-03 20:28:13"
},
{
"id": "D-47",
@@ -459,7 +459,7 @@
"status": "active",
"date": "2026-04-22",
"file_path": "decisions/architecture.md",
"synced_at": "2026-05-03 20:21:27"
"synced_at": "2026-05-03 20:28:13"
},
{
"id": "D-48",
@@ -469,7 +469,7 @@
"status": "active",
"date": "2026-04-22",
"file_path": "decisions/architecture.md",
"synced_at": "2026-05-03 20:21:27"
"synced_at": "2026-05-03 20:28:13"
},
{
"id": "D-49",
@@ -479,7 +479,7 @@
"status": "active",
"date": "2026-04-22",
"file_path": "decisions/architecture.md",
"synced_at": "2026-05-03 20:21:27"
"synced_at": "2026-05-03 20:28:13"
},
{
"id": "D-50",
@@ -489,7 +489,7 @@
"status": "active",
"date": "2026-04-22",
"file_path": "decisions/architecture.md",
"synced_at": "2026-05-03 20:21:27"
"synced_at": "2026-05-03 20:28:13"
},
{
"id": "D-51",
@@ -499,7 +499,7 @@
"status": "active",
"date": "2026-04-22",
"file_path": "decisions/architecture.md",
"synced_at": "2026-05-03 20:21:27"
"synced_at": "2026-05-03 20:28:13"
},
{
"id": "D-52",
@@ -509,7 +509,7 @@
"status": "active",
"date": "2026-04-22",
"file_path": "decisions/architecture.md",
"synced_at": "2026-05-03 20:21:27"
"synced_at": "2026-05-03 20:28:13"
},
{
"id": "D-53",
@@ -519,7 +519,7 @@
"status": "active",
"date": "2026-04-22",
"file_path": "decisions/architecture.md",
"synced_at": "2026-05-03 20:21:27"
"synced_at": "2026-05-03 20:28:13"
},
{
"id": "D-54",
@@ -529,7 +529,7 @@
"status": "active",
"date": "2026-04-22",
"file_path": "decisions/architecture.md",
"synced_at": "2026-05-03 20:21:27"
"synced_at": "2026-05-03 20:28:13"
},
{
"id": "D-55",
@@ -539,7 +539,7 @@
"status": "active",
"date": "2026-04-23",
"file_path": "decisions/architecture.md",
"synced_at": "2026-05-03 20:21:27"
"synced_at": "2026-05-03 20:28:13"
},
{
"id": "D-56",
@@ -549,7 +549,7 @@
"status": "active",
"date": "2026-04-23",
"file_path": "decisions/architecture.md",
"synced_at": "2026-05-03 20:21:27"
"synced_at": "2026-05-03 20:28:13"
},
{
"id": "D-57",
@@ -559,7 +559,7 @@
"status": "active",
"date": "2026-04-23",
"file_path": "decisions/architecture.md",
"synced_at": "2026-05-03 20:21:27"
"synced_at": "2026-05-03 20:28:13"
},
{
"id": "D-58",
@@ -569,7 +569,7 @@
"status": "active",
"date": "2026-04-23",
"file_path": "decisions/tooling.md",
"synced_at": "2026-05-03 20:21:27"
"synced_at": "2026-05-03 20:28:13"
},
{
"id": "D-59",
@@ -579,7 +579,7 @@
"status": "active",
"date": "2026-04-25",
"file_path": "decisions/tooling.md",
"synced_at": "2026-05-03 20:21:27"
"synced_at": "2026-05-03 20:28:13"
},
{
"id": "Q-1",
@@ -588,7 +588,7 @@
"title": "Authorisation granularity on the IPC socket",
"status": "open",
"file_path": "decisions/questions-architecture.md",
"synced_at": "2026-05-03 20:21:27"
"synced_at": "2026-05-03 20:28:13"
},
{
"id": "Q-2",
@@ -597,7 +597,7 @@
"title": "Back-pressure on event streams",
"status": "open",
"file_path": "decisions/questions-architecture.md",
"synced_at": "2026-05-03 20:21:27"
"synced_at": "2026-05-03 20:28:13"
},
{
"id": "Q-3",
@@ -606,7 +606,7 @@
"title": "Event persistence + audit/undo",
"status": "open",
"file_path": "decisions/questions-architecture.md",
"synced_at": "2026-05-03 20:21:27"
"synced_at": "2026-05-03 20:28:13"
},
{
"id": "Q-4",
@@ -615,7 +615,7 @@
"title": "`.canvas` schema compatibility with Obsidian",
"status": "open",
"file_path": "decisions/questions-architecture.md",
"synced_at": "2026-05-03 20:21:27"
"synced_at": "2026-05-03 20:28:13"
},
{
"id": "Q-5",
@@ -624,7 +624,7 @@
"title": "IPC wire-format stability + `schema_version:`",
"status": "open",
"file_path": "decisions/questions-architecture.md",
"synced_at": "2026-05-03 20:21:27"
"synced_at": "2026-05-03 20:28:13"
},
{
"id": "Q-6",
@@ -633,7 +633,7 @@
"title": "Window chrome — native frame vs frameless custom",
"status": "resolved",
"file_path": "decisions/questions-architecture.md",
"synced_at": "2026-05-03 20:21:27"
"synced_at": "2026-05-03 20:28:13"
},
{
"id": "Q-7",
@@ -642,7 +642,7 @@
"title": "macOS app bundle signing / notarisation",
"status": "open",
"file_path": "decisions/questions-architecture.md",
"synced_at": "2026-05-03 20:21:27"
"synced_at": "2026-05-03 20:28:13"
},
{
"id": "Q-8",
@@ -651,7 +651,7 @@
"title": "Extension API shape — widgets, subcommands, both?",
"status": "open",
"file_path": "decisions/questions-extensions.md",
"synced_at": "2026-05-03 20:21:27"
"synced_at": "2026-05-03 20:28:13"
},
{
"id": "Q-9",
@@ -660,7 +660,7 @@
"title": "Lua runtime vendoring",
"status": "open",
"file_path": "decisions/questions-extensions.md",
"synced_at": "2026-05-03 20:21:27"
"synced_at": "2026-05-03 20:28:13"
},
{
"id": "Q-10",
@@ -669,7 +669,7 @@
"title": "Extension manifest `schema_version:`",
"status": "open",
"file_path": "decisions/questions-extensions.md",
"synced_at": "2026-05-03 20:21:27"
"synced_at": "2026-05-03 20:28:13"
},
{
"id": "Q-11",
@@ -678,7 +678,7 @@
"title": "Coverage gates — hard thresholds vs soft reporting",
"status": "open",
"file_path": "decisions/questions-testing.md",
"synced_at": "2026-05-03 20:21:27"
"synced_at": "2026-05-03 20:28:13"
},
{
"id": "Q-12",
@@ -687,7 +687,7 @@
"title": "Screen-reader automation (axe-core via Playwright)",
"status": "open",
"file_path": "decisions/questions-testing.md",
"synced_at": "2026-05-03 20:21:27"
"synced_at": "2026-05-03 20:28:13"
},
{
"id": "Q-13",
@@ -696,7 +696,7 @@
"title": "Web production-mode a11y",
"status": "open",
"file_path": "decisions/questions-accessibility.md",
"synced_at": "2026-05-03 20:21:27"
"synced_at": "2026-05-03 20:28:13"
},
{
"id": "Q-14",
@@ -705,7 +705,7 @@
"title": "i18n plurals / gender / date-format tooling",
"status": "open",
"file_path": "decisions/questions-accessibility.md",
"synced_at": "2026-05-03 20:21:27"
"synced_at": "2026-05-03 20:28:13"
},
{
"id": "Q-15",
@@ -714,7 +714,7 @@
"title": "Editor tab — full LSP vs tree-sitter-only highlight",
"status": "open",
"file_path": "decisions/questions-process.md",
"synced_at": "2026-05-03 20:21:27"
"synced_at": "2026-05-03 20:28:13"
},
{
"id": "Q-16",
@@ -723,7 +723,7 @@
"title": "`tree-sitter-dart` grammar maintenance",
"status": "open",
"file_path": "decisions/questions-process.md",
"synced_at": "2026-05-03 20:21:27"
"synced_at": "2026-05-03 20:28:13"
},
{
"id": "Q-17",
@@ -732,7 +732,7 @@
"title": "Icon set growth",
"status": "open",
"file_path": "decisions/questions-process.md",
"synced_at": "2026-05-03 20:21:27"
"synced_at": "2026-05-03 20:28:13"
},
{
"id": "Q-18",
@@ -741,7 +741,7 @@
"title": "Theme hot-reload in release builds",
"status": "open",
"file_path": "decisions/questions-process.md",
"synced_at": "2026-05-03 20:21:27"
"synced_at": "2026-05-03 20:28:13"
},
{
"id": "Q-19",
@@ -750,7 +750,7 @@
"title": "(withdrawn)",
"status": "resolved",
"file_path": "decisions/questions-process.md",
"synced_at": "2026-05-03 20:21:27"
"synced_at": "2026-05-03 20:28:13"
},
{
"id": "Q-20",
@@ -759,7 +759,7 @@
"title": "Kernel DB service — namespaced SQL access?",
"status": "open",
"file_path": "decisions/questions-process.md",
"synced_at": "2026-05-03 20:21:27"
"synced_at": "2026-05-03 20:28:13"
},
{
"id": "Q-21",
@@ -768,7 +768,7 @@
"title": "Pql absorbs planning vs keeps separate",
"status": "open",
"file_path": "decisions/questions-architecture.md",
"synced_at": "2026-05-03 20:21:27"
"synced_at": "2026-05-03 20:28:13"
},
{
"id": "Q-22",
@@ -777,7 +777,7 @@
"title": "Ticket persistence strategy",
"status": "open",
"file_path": "decisions/questions-architecture.md",
"synced_at": "2026-05-03 20:21:27"
"synced_at": "2026-05-03 20:28:13"
},
{
"id": "Q-23",
@@ -786,7 +786,7 @@
"title": "SSH-remote development — run clide against a remote workspace",
"status": "open",
"file_path": "decisions/questions-architecture.md",
"synced_at": "2026-05-03 20:21:27"
"synced_at": "2026-05-03 20:28:13"
},
{
"id": "Q-25",
@@ -795,7 +795,7 @@
"title": "Body text face — mono everywhere vs Josefin Sans UI + mono code",
"status": "open",
"file_path": "decisions/questions-architecture.md",
"synced_at": "2026-05-03 20:21:27"
"synced_at": "2026-05-03 20:28:13"
},
{
"id": "Q-26",
@@ -804,7 +804,7 @@
"title": "Small screen layout (\u003c 1000px)",
"status": "open",
"file_path": "decisions/questions-architecture.md",
"synced_at": "2026-05-03 20:21:27"
"synced_at": "2026-05-03 20:28:13"
},
{
"id": "Q-27",
@@ -813,7 +813,7 @@
"title": "Two-editor split",
"status": "open",
"file_path": "decisions/questions-architecture.md",
"synced_at": "2026-05-03 20:21:27"
"synced_at": "2026-05-03 20:28:13"
},
{
"id": "Q-28",
@@ -822,7 +822,7 @@
"title": "Terminal strip scope — shell only or logs/errors/tests",
"status": "open",
"file_path": "decisions/questions-architecture.md",
"synced_at": "2026-05-03 20:21:27"
"synced_at": "2026-05-03 20:28:13"
},
{
"id": "Q-29",
@@ -831,7 +831,7 @@
"title": "Branch picker location",
"status": "open",
"file_path": "decisions/questions-architecture.md",
"synced_at": "2026-05-03 20:21:27"
"synced_at": "2026-05-03 20:28:13"
},
{
"id": "Q-30",
@@ -840,7 +840,7 @@
"title": "Focus behavior when editor is dirty and viewer is peeked",
"status": "open",
"file_path": "decisions/questions-architecture.md",
"synced_at": "2026-05-03 20:21:27"
"synced_at": "2026-05-03 20:28:13"
},
{
"id": "Q-31",
@@ -849,7 +849,7 @@
"title": "XWayland fallback for frameless — proper Wayland protocol needed",
"status": "open",
"file_path": "decisions/questions-architecture.md",
"synced_at": "2026-05-03 20:21:27"
"synced_at": "2026-05-03 20:28:13"
},
{
"id": "R-2",
@@ -859,7 +859,7 @@
"status": "active",
"date": "2026-04-20",
"file_path": "decisions/rejected.md",
"synced_at": "2026-05-03 20:21:27"
"synced_at": "2026-05-03 20:28:13"
},
{
"id": "R-3",
@@ -869,7 +869,7 @@
"status": "active",
"date": "2026-04-21",
"file_path": "decisions/rejected.md",
"synced_at": "2026-05-03 20:21:27"
"synced_at": "2026-05-03 20:28:13"
},
{
"id": "R-4",
@@ -879,7 +879,7 @@
"status": "active",
"date": "2026-04-21",
"file_path": "decisions/rejected.md",
"synced_at": "2026-05-03 20:21:27"
"synced_at": "2026-05-03 20:28:13"
},
{
"id": "R-5",
@@ -889,7 +889,7 @@
"status": "active",
"date": "2026-04-21",
"file_path": "decisions/rejected.md",
"synced_at": "2026-05-03 20:21:27"
"synced_at": "2026-05-03 20:28:13"
},
{
"id": "R-6",
@@ -899,7 +899,7 @@
"status": "active",
"date": "2026-04-21",
"file_path": "decisions/rejected.md",
"synced_at": "2026-05-03 20:21:27"
"synced_at": "2026-05-03 20:28:13"
},
{
"id": "R-7",
@@ -909,7 +909,7 @@
"status": "active",
"date": "2026-04-21",
"file_path": "decisions/rejected.md",
"synced_at": "2026-05-03 20:21:27"
"synced_at": "2026-05-03 20:28:13"
},
{
"id": "R-8",
@@ -919,7 +919,7 @@
"status": "active",
"date": "2026-04-21",
"file_path": "decisions/rejected.md",
"synced_at": "2026-05-03 20:21:27"
"synced_at": "2026-05-03 20:28:13"
},
{
"id": "R-9",
@@ -929,7 +929,7 @@
"status": "active",
"date": "2026-04-21",
"file_path": "decisions/rejected.md",
"synced_at": "2026-05-03 20:21:27"
"synced_at": "2026-05-03 20:28:13"
},
{
"id": "R-10",
@@ -939,7 +939,7 @@
"status": "active",
"date": "2026-04-21",
"file_path": "decisions/rejected.md",
"synced_at": "2026-05-03 20:21:27"
"synced_at": "2026-05-03 20:28:13"
},
{
"id": "R-11",
@@ -949,7 +949,7 @@
"status": "active",
"date": "2026-04-21",
"file_path": "decisions/rejected.md",
"synced_at": "2026-05-03 20:21:27"
"synced_at": "2026-05-03 20:28:13"
},
{
"id": "R-12",
@@ -959,7 +959,7 @@
"status": "active",
"date": "2026-04-22",
"file_path": "decisions/rejected.md",
"synced_at": "2026-05-03 20:21:27"
"synced_at": "2026-05-03 20:28:13"
}
],
"decision_refs": [
+8 -4
View File
@@ -8,10 +8,14 @@ class InProcessClient extends DaemonClient {
InProcessClient({
required Logger log,
required DaemonBus events,
required this.dispatcher,
}) : super(socketPath: '', log: log, events: events);
required DaemonDispatcher dispatcher,
}) : _dispatcher = dispatcher,
super(socketPath: '', log: log, events: events);
final DaemonDispatcher dispatcher;
DaemonDispatcher _dispatcher;
DaemonDispatcher get dispatcher => _dispatcher;
set dispatcher(DaemonDispatcher d) => _dispatcher = d;
int _nextReqId = 0;
@override
@@ -27,6 +31,6 @@ class InProcessClient extends DaemonClient {
Future<IpcResponse> request(String cmd, {Map<String, Object?> args = const {}}) {
final id = '${_nextReqId++}';
final req = IpcRequest(id: id, cmd: cmd, args: args);
return dispatcher.dispatch(req);
return _dispatcher.dispatch(req);
}
}
+30 -14
View File
@@ -71,6 +71,25 @@ Future<void> main() async {
toolchain.applyResolved(resolveToolchainPaths(root));
}
InProcessClient? ipcClient;
DaemonBus? daemonBus;
DaemonDispatcher _buildDispatcher(DaemonBus events, Toolchain tc, Directory workRoot) {
final dispatcher = DaemonDispatcher();
final eventSink = _BusEventSink(events);
final paneRegistry = PaneRegistry(events: eventSink);
registerPaneCommands(dispatcher, paneRegistry);
final filesService = FilesService(root: workRoot, events: eventSink);
registerFilesCommands(dispatcher, filesService);
final editorRegistry = EditorRegistry(events: eventSink, workspaceRoot: workRoot);
registerEditorCommands(dispatcher, editorRegistry);
final gitClient = GitClient(toolchain: tc, workDir: workRoot);
registerGitCommands(dispatcher, gitClient, eventSink);
final pql = PqlClient(workDir: workRoot, toolchain: tc);
registerPqlCommands(dispatcher, pql);
return dispatcher;
}
final services = await KernelServices.boot(
appDir: appDir,
bundledThemes: themes,
@@ -81,20 +100,17 @@ Future<void> main() async {
daemonClientFactory: kIsWeb
? null
: (log, events) {
final dispatcher = DaemonDispatcher();
final eventSink = _BusEventSink(events);
final filesService = FilesService.atCwd(events: eventSink);
final workRoot = filesService.root;
final paneRegistry = PaneRegistry(events: eventSink);
registerPaneCommands(dispatcher, paneRegistry);
registerFilesCommands(dispatcher, filesService);
final editorRegistry = EditorRegistry(events: eventSink, workspaceRoot: workRoot);
registerEditorCommands(dispatcher, editorRegistry);
final gitClient = GitClient(toolchain: toolchain, workDir: workRoot);
registerGitCommands(dispatcher, gitClient, eventSink);
final pql = PqlClient(workDir: workRoot, toolchain: toolchain);
registerPqlCommands(dispatcher, pql);
return InProcessClient(log: log, events: events, dispatcher: dispatcher);
daemonBus = events;
final workRoot = FilesService.atCwd(events: _BusEventSink(events)).root;
final dispatcher = _buildDispatcher(events, toolchain, workRoot);
ipcClient = InProcessClient(log: log, events: events, dispatcher: dispatcher);
return ipcClient!;
},
onProjectOpen: kIsWeb
? null
: (path) async {
if (ipcClient == null || daemonBus == null) return;
ipcClient!.dispatcher = _buildDispatcher(daemonBus!, toolchain, Directory(path));
},
);