From 7b30748bf573752a1f79ebd7d6a78e046436966f Mon Sep 17 00:00:00 2001 From: Jeroen Schweitzer Date: Sun, 3 May 2026 22:29:03 +0200 Subject: [PATCH] rewire daemon services on project open MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 --- .pql/pql-plan.json | 200 ++++++++++++++--------------- lib/kernel/src/ipc/in_process.dart | 12 +- lib/main.dart | 44 +++++-- 3 files changed, 138 insertions(+), 118 deletions(-) diff --git a/.pql/pql-plan.json b/.pql/pql-plan.json index 3b6076f4..45f7b862 100644 --- a/.pql/pql-plan.json +++ b/.pql/pql-plan.json @@ -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": [ diff --git a/lib/kernel/src/ipc/in_process.dart b/lib/kernel/src/ipc/in_process.dart index 8459e80e..96397442 100644 --- a/lib/kernel/src/ipc/in_process.dart +++ b/lib/kernel/src/ipc/in_process.dart @@ -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 request(String cmd, {Map args = const {}}) { final id = '${_nextReqId++}'; final req = IpcRequest(id: id, cmd: cmd, args: args); - return dispatcher.dispatch(req); + return _dispatcher.dispatch(req); } } diff --git a/lib/main.dart b/lib/main.dart index 1132d4b5..0c892581 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -71,6 +71,25 @@ Future 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 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)); }, );