@planweave-ai/runtime 0.1.4 → 0.1.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (207) hide show
  1. package/dist/autoRun/claudeCodeIntegration.d.ts.map +1 -1
  2. package/dist/autoRun/claudeCodeIntegration.js +4 -2
  3. package/dist/autoRun/claudeCodeIntegration.js.map +1 -1
  4. package/dist/autoRun/codexExecutor.d.ts +2 -0
  5. package/dist/autoRun/codexExecutor.d.ts.map +1 -1
  6. package/dist/autoRun/codexExecutor.js +10 -2
  7. package/dist/autoRun/codexExecutor.js.map +1 -1
  8. package/dist/autoRun/codexIntegration.d.ts.map +1 -1
  9. package/dist/autoRun/codexIntegration.js +4 -2
  10. package/dist/autoRun/codexIntegration.js.map +1 -1
  11. package/dist/autoRun/executorIntegration.d.ts +1 -0
  12. package/dist/autoRun/executorIntegration.d.ts.map +1 -1
  13. package/dist/autoRun/executorIntegration.js.map +1 -1
  14. package/dist/autoRun/localReviewExecutor.d.ts +2 -0
  15. package/dist/autoRun/localReviewExecutor.d.ts.map +1 -1
  16. package/dist/autoRun/localReviewExecutor.js +9 -2
  17. package/dist/autoRun/localReviewExecutor.js.map +1 -1
  18. package/dist/autoRun/localReviewIntegration.d.ts.map +1 -1
  19. package/dist/autoRun/localReviewIntegration.js +4 -2
  20. package/dist/autoRun/localReviewIntegration.js.map +1 -1
  21. package/dist/autoRun/opencodeExecutor.d.ts +2 -0
  22. package/dist/autoRun/opencodeExecutor.d.ts.map +1 -1
  23. package/dist/autoRun/opencodeExecutor.js +9 -2
  24. package/dist/autoRun/opencodeExecutor.js.map +1 -1
  25. package/dist/autoRun/opencodeIntegration.d.ts.map +1 -1
  26. package/dist/autoRun/opencodeIntegration.js +4 -2
  27. package/dist/autoRun/opencodeIntegration.js.map +1 -1
  28. package/dist/autoRun/piIntegration.d.ts.map +1 -1
  29. package/dist/autoRun/piIntegration.js +4 -2
  30. package/dist/autoRun/piIntegration.js.map +1 -1
  31. package/dist/autoRun/terminalAgentExecutor.d.ts +2 -0
  32. package/dist/autoRun/terminalAgentExecutor.d.ts.map +1 -1
  33. package/dist/autoRun/terminalAgentExecutor.js +9 -2
  34. package/dist/autoRun/terminalAgentExecutor.js.map +1 -1
  35. package/dist/autoRun/tmuxExecutor.d.ts +3 -0
  36. package/dist/autoRun/tmuxExecutor.d.ts.map +1 -1
  37. package/dist/autoRun/tmuxExecutor.js +19 -3
  38. package/dist/autoRun/tmuxExecutor.js.map +1 -1
  39. package/dist/desktop/canvasApi.d.ts.map +1 -1
  40. package/dist/desktop/canvasApi.js +45 -22
  41. package/dist/desktop/canvasApi.js.map +1 -1
  42. package/dist/desktop/canvasGraphApi.d.ts.map +1 -1
  43. package/dist/desktop/canvasGraphApi.js +24 -33
  44. package/dist/desktop/canvasGraphApi.js.map +1 -1
  45. package/dist/desktop/canvasSelectionApi.d.ts +2 -0
  46. package/dist/desktop/canvasSelectionApi.d.ts.map +1 -0
  47. package/dist/desktop/canvasSelectionApi.js +18 -0
  48. package/dist/desktop/canvasSelectionApi.js.map +1 -0
  49. package/dist/desktop/canvasSelectionStore.d.ts +6 -0
  50. package/dist/desktop/canvasSelectionStore.d.ts.map +1 -0
  51. package/dist/desktop/canvasSelectionStore.js +88 -0
  52. package/dist/desktop/canvasSelectionStore.js.map +1 -0
  53. package/dist/desktop/fileSyncApi.d.ts.map +1 -1
  54. package/dist/desktop/fileSyncApi.js +45 -6
  55. package/dist/desktop/fileSyncApi.js.map +1 -1
  56. package/dist/desktop/graph/editModel.d.ts +8 -5
  57. package/dist/desktop/graph/editModel.d.ts.map +1 -1
  58. package/dist/desktop/graph/editModel.js +151 -72
  59. package/dist/desktop/graph/editModel.js.map +1 -1
  60. package/dist/desktop/graph/projectProjectionModel.d.ts.map +1 -1
  61. package/dist/desktop/graph/projectProjectionModel.js +255 -77
  62. package/dist/desktop/graph/projectProjectionModel.js.map +1 -1
  63. package/dist/desktop/graph/readModel.d.ts.map +1 -1
  64. package/dist/desktop/graph/readModel.js +33 -59
  65. package/dist/desktop/graph/readModel.js.map +1 -1
  66. package/dist/desktop/graph/resultsFileIndex.d.ts +6 -0
  67. package/dist/desktop/graph/resultsFileIndex.d.ts.map +1 -1
  68. package/dist/desktop/graph/resultsFileIndex.js +11 -2
  69. package/dist/desktop/graph/resultsFileIndex.js.map +1 -1
  70. package/dist/desktop/graph/searchIndexModel.d.ts +10 -1
  71. package/dist/desktop/graph/searchIndexModel.d.ts.map +1 -1
  72. package/dist/desktop/graph/searchIndexModel.js +95 -77
  73. package/dist/desktop/graph/searchIndexModel.js.map +1 -1
  74. package/dist/desktop/graph/statisticsIndexModel.d.ts.map +1 -1
  75. package/dist/desktop/graph/statisticsIndexModel.js +35 -103
  76. package/dist/desktop/graph/statisticsIndexModel.js.map +1 -1
  77. package/dist/desktop/graph/todoModel.d.ts +6 -17
  78. package/dist/desktop/graph/todoModel.d.ts.map +1 -1
  79. package/dist/desktop/graph/todoModel.js +30 -102
  80. package/dist/desktop/graph/todoModel.js.map +1 -1
  81. package/dist/desktop/graphApi.d.ts +1 -1
  82. package/dist/desktop/graphApi.d.ts.map +1 -1
  83. package/dist/desktop/graphApi.js +1 -1
  84. package/dist/desktop/graphApi.js.map +1 -1
  85. package/dist/desktop/index.d.ts +2 -1
  86. package/dist/desktop/index.d.ts.map +1 -1
  87. package/dist/desktop/index.js +2 -1
  88. package/dist/desktop/index.js.map +1 -1
  89. package/dist/desktop/layoutApi.d.ts +3 -2
  90. package/dist/desktop/layoutApi.d.ts.map +1 -1
  91. package/dist/desktop/layoutApi.js +29 -122
  92. package/dist/desktop/layoutApi.js.map +1 -1
  93. package/dist/desktop/layoutStore.d.ts +10 -0
  94. package/dist/desktop/layoutStore.d.ts.map +1 -0
  95. package/dist/desktop/layoutStore.js +158 -0
  96. package/dist/desktop/layoutStore.js.map +1 -0
  97. package/dist/desktop/projectGraphEditApi.d.ts.map +1 -1
  98. package/dist/desktop/projectGraphEditApi.js +13 -46
  99. package/dist/desktop/projectGraphEditApi.js.map +1 -1
  100. package/dist/desktop/reviewPipelineApi.d.ts.map +1 -1
  101. package/dist/desktop/reviewPipelineApi.js +28 -28
  102. package/dist/desktop/reviewPipelineApi.js.map +1 -1
  103. package/dist/desktop/runApi.d.ts.map +1 -1
  104. package/dist/desktop/runApi.js +4 -3
  105. package/dist/desktop/runApi.js.map +1 -1
  106. package/dist/desktop/types/bridgeTypes.d.ts +12 -4
  107. package/dist/desktop/types/bridgeTypes.d.ts.map +1 -1
  108. package/dist/desktop/types/graphTypes.d.ts +11 -0
  109. package/dist/desktop/types/graphTypes.d.ts.map +1 -1
  110. package/dist/index.d.ts +3 -1
  111. package/dist/index.d.ts.map +1 -1
  112. package/dist/index.js +2 -1
  113. package/dist/index.js.map +1 -1
  114. package/dist/package/manifestEdit.d.ts.map +1 -1
  115. package/dist/package/manifestEdit.js +112 -33
  116. package/dist/package/manifestEdit.js.map +1 -1
  117. package/dist/plangraph/adapters.d.ts +3 -0
  118. package/dist/plangraph/adapters.d.ts.map +1 -0
  119. package/dist/plangraph/adapters.js +13 -0
  120. package/dist/plangraph/adapters.js.map +1 -0
  121. package/dist/plangraph/commands.d.ts +191 -0
  122. package/dist/plangraph/commands.d.ts.map +1 -0
  123. package/dist/plangraph/commands.js +4 -0
  124. package/dist/plangraph/commands.js.map +1 -0
  125. package/dist/plangraph/domain/buildPlanGraph.d.ts +14 -0
  126. package/dist/plangraph/domain/buildPlanGraph.d.ts.map +1 -0
  127. package/dist/plangraph/domain/buildPlanGraph.js +91 -0
  128. package/dist/plangraph/domain/buildPlanGraph.js.map +1 -0
  129. package/dist/plangraph/domain/selectors.d.ts +11 -0
  130. package/dist/plangraph/domain/selectors.d.ts.map +1 -0
  131. package/dist/plangraph/domain/selectors.js +54 -0
  132. package/dist/plangraph/domain/selectors.js.map +1 -0
  133. package/dist/plangraph/domain/types.d.ts +56 -0
  134. package/dist/plangraph/domain/types.d.ts.map +1 -0
  135. package/dist/plangraph/domain/types.js +2 -0
  136. package/dist/plangraph/domain/types.js.map +1 -0
  137. package/dist/plangraph/executeCommand.d.ts +19 -0
  138. package/dist/plangraph/executeCommand.d.ts.map +1 -0
  139. package/dist/plangraph/executeCommand.js +809 -0
  140. package/dist/plangraph/executeCommand.js.map +1 -0
  141. package/dist/plangraph/hash.d.ts +4 -0
  142. package/dist/plangraph/hash.d.ts.map +1 -0
  143. package/dist/plangraph/hash.js +21 -0
  144. package/dist/plangraph/hash.js.map +1 -0
  145. package/dist/plangraph/index.d.ts +15 -0
  146. package/dist/plangraph/index.d.ts.map +1 -0
  147. package/dist/plangraph/index.js +9 -0
  148. package/dist/plangraph/index.js.map +1 -0
  149. package/dist/plangraph/packageRepository.d.ts +19 -0
  150. package/dist/plangraph/packageRepository.d.ts.map +1 -0
  151. package/dist/plangraph/packageRepository.js +114 -0
  152. package/dist/plangraph/packageRepository.js.map +1 -0
  153. package/dist/plangraph/ports.d.ts +73 -0
  154. package/dist/plangraph/ports.d.ts.map +1 -0
  155. package/dist/plangraph/ports.js +2 -0
  156. package/dist/plangraph/ports.js.map +1 -0
  157. package/dist/plangraph/projectGraphCommand.d.ts +16 -0
  158. package/dist/plangraph/projectGraphCommand.d.ts.map +1 -0
  159. package/dist/plangraph/projectGraphCommand.js +203 -0
  160. package/dist/plangraph/projectGraphCommand.js.map +1 -0
  161. package/dist/plangraph/projections/agentContextProjection.d.ts +8 -0
  162. package/dist/plangraph/projections/agentContextProjection.d.ts.map +1 -0
  163. package/dist/plangraph/projections/agentContextProjection.js +50 -0
  164. package/dist/plangraph/projections/agentContextProjection.js.map +1 -0
  165. package/dist/plangraph/projections/canvasMapProjection.d.ts +13 -0
  166. package/dist/plangraph/projections/canvasMapProjection.d.ts.map +1 -0
  167. package/dist/plangraph/projections/canvasMapProjection.js +40 -0
  168. package/dist/plangraph/projections/canvasMapProjection.js.map +1 -0
  169. package/dist/plangraph/projections/graphViewProjection.d.ts +16 -0
  170. package/dist/plangraph/projections/graphViewProjection.d.ts.map +1 -0
  171. package/dist/plangraph/projections/graphViewProjection.js +125 -0
  172. package/dist/plangraph/projections/graphViewProjection.js.map +1 -0
  173. package/dist/plangraph/projections/index.d.ts +10 -0
  174. package/dist/plangraph/projections/index.d.ts.map +1 -0
  175. package/dist/plangraph/projections/index.js +6 -0
  176. package/dist/plangraph/projections/index.js.map +1 -0
  177. package/dist/plangraph/projections/reviewProjection.d.ts +25 -0
  178. package/dist/plangraph/projections/reviewProjection.d.ts.map +1 -0
  179. package/dist/plangraph/projections/reviewProjection.js +27 -0
  180. package/dist/plangraph/projections/reviewProjection.js.map +1 -0
  181. package/dist/plangraph/projections/statisticsProjection.d.ts +15 -0
  182. package/dist/plangraph/projections/statisticsProjection.d.ts.map +1 -0
  183. package/dist/plangraph/projections/statisticsProjection.js +113 -0
  184. package/dist/plangraph/projections/statisticsProjection.js.map +1 -0
  185. package/dist/plangraph/projections/todoProjection.d.ts +43 -0
  186. package/dist/plangraph/projections/todoProjection.d.ts.map +1 -0
  187. package/dist/plangraph/projections/todoProjection.js +97 -0
  188. package/dist/plangraph/projections/todoProjection.js.map +1 -0
  189. package/dist/plangraph/sqliteIndex.d.ts +11 -0
  190. package/dist/plangraph/sqliteIndex.d.ts.map +1 -0
  191. package/dist/plangraph/sqliteIndex.js +655 -0
  192. package/dist/plangraph/sqliteIndex.js.map +1 -0
  193. package/dist/projectGraph/canvasWorkspaceRecovery.d.ts +40 -0
  194. package/dist/projectGraph/canvasWorkspaceRecovery.d.ts.map +1 -0
  195. package/dist/projectGraph/canvasWorkspaceRecovery.js +213 -0
  196. package/dist/projectGraph/canvasWorkspaceRecovery.js.map +1 -0
  197. package/dist/taskManager/autoRun.d.ts +1 -0
  198. package/dist/taskManager/autoRun.d.ts.map +1 -1
  199. package/dist/taskManager/autoRun.js +2 -2
  200. package/dist/taskManager/autoRun.js.map +1 -1
  201. package/dist/taskManager/projectDoctor.d.ts.map +1 -1
  202. package/dist/taskManager/projectDoctor.js +87 -3
  203. package/dist/taskManager/projectDoctor.js.map +1 -1
  204. package/dist/taskManager/promptRenderer.d.ts.map +1 -1
  205. package/dist/taskManager/promptRenderer.js +10 -0
  206. package/dist/taskManager/promptRenderer.js.map +1 -1
  207. package/package.json +2 -2
@@ -0,0 +1,655 @@
1
+ import { mkdir } from "node:fs/promises";
2
+ import { createRequire } from "node:module";
3
+ import { dirname, join } from "node:path";
4
+ import { loadPackage } from "../package/loadPackage.js";
5
+ import { resolveProjectWorkspace } from "../project.js";
6
+ import { loadPlanGraphPackage } from "./packageRepository.js";
7
+ const nodeRequire = createRequire(import.meta.url);
8
+ function isRecord(value) {
9
+ return value !== null && typeof value === "object" && !Array.isArray(value);
10
+ }
11
+ function isSqliteModule(value) {
12
+ return isRecord(value) && typeof value.DatabaseSync === "function";
13
+ }
14
+ function loadSqliteModule() {
15
+ const moduleValue = nodeRequire("node:sqlite");
16
+ if (!isSqliteModule(moduleValue)) {
17
+ throw new Error("node:sqlite module did not expose DatabaseSync.");
18
+ }
19
+ return moduleValue;
20
+ }
21
+ export function defaultPlanGraphIndexPath(workspace) {
22
+ return join(workspace.workspaceRoot, "cache", "plangraph.sqlite");
23
+ }
24
+ async function resolveIndexPath(projectRoot, indexPath) {
25
+ const { workspace } = await loadPackage(projectRoot);
26
+ const projectWorkspace = await resolveProjectWorkspace(workspace.rootPath);
27
+ return { workspace, indexPath: indexPath ?? defaultPlanGraphIndexPath(projectWorkspace) };
28
+ }
29
+ async function openDatabase(indexPath) {
30
+ await mkdir(dirname(indexPath), { recursive: true });
31
+ const sqlite = loadSqliteModule();
32
+ const db = new sqlite.DatabaseSync(indexPath);
33
+ db.exec("PRAGMA foreign_keys = ON");
34
+ ensureSchema(db);
35
+ return db;
36
+ }
37
+ function ensureSchema(db) {
38
+ const projectionVersionsTable = db.prepare("SELECT name FROM sqlite_master WHERE type = 'table' AND name = 'projection_versions'").get();
39
+ if (projectionVersionsTable) {
40
+ const columns = db.prepare("PRAGMA table_info(projection_versions)").all();
41
+ const cacheKeyColumn = columns.find((column) => isRecord(column) && column.name === "cache_key");
42
+ const cacheKeyPrimaryKeyPosition = isRecord(cacheKeyColumn) ? cacheKeyColumn.pk : null;
43
+ if (cacheKeyPrimaryKeyPosition !== 3) {
44
+ db.exec("DROP TABLE projection_versions");
45
+ }
46
+ }
47
+ db.exec(`
48
+ CREATE TABLE IF NOT EXISTS graph_meta (
49
+ project_root TEXT PRIMARY KEY,
50
+ package_fingerprint TEXT NOT NULL,
51
+ graph_version TEXT NOT NULL,
52
+ project_json TEXT NOT NULL,
53
+ diagnostics_json TEXT NOT NULL,
54
+ indexed_at TEXT NOT NULL
55
+ );
56
+
57
+ CREATE TABLE IF NOT EXISTS tasks (
58
+ project_root TEXT NOT NULL,
59
+ task_id TEXT NOT NULL,
60
+ canvas_id TEXT,
61
+ title TEXT NOT NULL,
62
+ prompt_path TEXT NOT NULL,
63
+ prompt_hash TEXT NOT NULL,
64
+ prompt_preview TEXT NOT NULL,
65
+ executor TEXT,
66
+ acceptance_json TEXT NOT NULL,
67
+ block_refs_json TEXT NOT NULL,
68
+ PRIMARY KEY (project_root, task_id)
69
+ );
70
+
71
+ CREATE TABLE IF NOT EXISTS blocks (
72
+ project_root TEXT NOT NULL,
73
+ block_ref TEXT NOT NULL,
74
+ task_id TEXT NOT NULL,
75
+ block_id TEXT NOT NULL,
76
+ type TEXT NOT NULL,
77
+ title TEXT NOT NULL,
78
+ prompt_path TEXT NOT NULL,
79
+ prompt_hash TEXT NOT NULL,
80
+ prompt_preview TEXT NOT NULL,
81
+ executor TEXT,
82
+ depends_on_json TEXT NOT NULL,
83
+ PRIMARY KEY (project_root, block_ref)
84
+ );
85
+
86
+ CREATE TABLE IF NOT EXISTS edges (
87
+ project_root TEXT NOT NULL,
88
+ edge_type TEXT NOT NULL,
89
+ from_ref TEXT NOT NULL,
90
+ to_ref TEXT NOT NULL
91
+ );
92
+
93
+ CREATE TABLE IF NOT EXISTS prompt_index (
94
+ project_root TEXT NOT NULL,
95
+ owner_kind TEXT NOT NULL,
96
+ owner_ref TEXT NOT NULL,
97
+ path TEXT NOT NULL,
98
+ content_hash TEXT NOT NULL,
99
+ preview TEXT NOT NULL,
100
+ indexed_at TEXT NOT NULL,
101
+ PRIMARY KEY (project_root, owner_ref)
102
+ );
103
+
104
+ CREATE TABLE IF NOT EXISTS operation_log (
105
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
106
+ project_root TEXT NOT NULL,
107
+ graph_version_before TEXT NOT NULL,
108
+ graph_version_after TEXT NOT NULL,
109
+ command_json TEXT NOT NULL,
110
+ inverse_json TEXT NOT NULL,
111
+ affected_json TEXT NOT NULL,
112
+ created_at TEXT NOT NULL,
113
+ undone_at TEXT
114
+ );
115
+
116
+ CREATE TABLE IF NOT EXISTS projection_versions (
117
+ project_root TEXT NOT NULL,
118
+ projection_name TEXT NOT NULL,
119
+ graph_version TEXT NOT NULL,
120
+ projection_version TEXT NOT NULL,
121
+ cache_key TEXT NOT NULL,
122
+ updated_at TEXT NOT NULL,
123
+ PRIMARY KEY (project_root, projection_name, cache_key)
124
+ );
125
+ `);
126
+ const operationLogColumns = db.prepare("PRAGMA table_info(operation_log)").all();
127
+ if (!operationLogColumns.some((column) => isRecord(column) && column.name === "workspace_ref_json")) {
128
+ db.exec("ALTER TABLE operation_log ADD COLUMN workspace_ref_json TEXT");
129
+ }
130
+ }
131
+ function jsonString(value) {
132
+ return JSON.stringify(value);
133
+ }
134
+ function parseJsonRecord(value, label) {
135
+ const parsed = JSON.parse(value);
136
+ if (!isRecord(parsed)) {
137
+ throw new Error(`${label} must be a JSON object.`);
138
+ }
139
+ return parsed;
140
+ }
141
+ function parseJsonArray(value, label) {
142
+ const parsed = JSON.parse(value);
143
+ if (!Array.isArray(parsed)) {
144
+ throw new Error(`${label} must be a JSON array.`);
145
+ }
146
+ return parsed;
147
+ }
148
+ function stringColumn(row, key) {
149
+ const value = row[key];
150
+ if (typeof value !== "string") {
151
+ throw new Error(`SQLite column '${key}' must be a string.`);
152
+ }
153
+ return value;
154
+ }
155
+ function nullableStringColumn(row, key) {
156
+ const value = row[key];
157
+ if (value === null || value === undefined) {
158
+ return null;
159
+ }
160
+ if (typeof value !== "string") {
161
+ throw new Error(`SQLite column '${key}' must be a string or null.`);
162
+ }
163
+ return value;
164
+ }
165
+ function numberColumn(row, key) {
166
+ const value = row[key];
167
+ if (typeof value === "number") {
168
+ return value;
169
+ }
170
+ if (typeof value === "bigint") {
171
+ return Number(value);
172
+ }
173
+ throw new Error(`SQLite column '${key}' must be numeric.`);
174
+ }
175
+ function stringArrayColumn(row, key) {
176
+ const values = parseJsonArray(stringColumn(row, key), key);
177
+ if (!values.every((value) => typeof value === "string")) {
178
+ throw new Error(`SQLite column '${key}' must contain a string array.`);
179
+ }
180
+ return values;
181
+ }
182
+ function writeGraphIndex(db, projectRoot, graph) {
183
+ const indexedAt = new Date().toISOString();
184
+ db.exec("BEGIN");
185
+ try {
186
+ db.prepare("DELETE FROM graph_meta WHERE project_root = ?").run(projectRoot);
187
+ db.prepare("DELETE FROM tasks WHERE project_root = ?").run(projectRoot);
188
+ db.prepare("DELETE FROM blocks WHERE project_root = ?").run(projectRoot);
189
+ db.prepare("DELETE FROM edges WHERE project_root = ?").run(projectRoot);
190
+ db.prepare("DELETE FROM prompt_index WHERE project_root = ?").run(projectRoot);
191
+ db.prepare(`INSERT INTO graph_meta (project_root, package_fingerprint, graph_version, project_json, diagnostics_json, indexed_at)
192
+ VALUES (?, ?, ?, ?, ?, ?)`).run(projectRoot, graph.packageFingerprint, graph.graphVersion, jsonString(graph.project), jsonString(graph.diagnostics), indexedAt);
193
+ const insertTask = db.prepare(`INSERT INTO tasks
194
+ (project_root, task_id, canvas_id, title, prompt_path, prompt_hash, prompt_preview, executor, acceptance_json, block_refs_json)
195
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`);
196
+ for (const task of graph.tasks.values()) {
197
+ insertTask.run(projectRoot, task.taskId, task.canvasId, task.title, task.promptRef.path, task.promptRef.contentHash, task.promptRef.preview, task.executor, jsonString(task.acceptance), jsonString(task.blockRefs));
198
+ }
199
+ const insertBlock = db.prepare(`INSERT INTO blocks
200
+ (project_root, block_ref, task_id, block_id, type, title, prompt_path, prompt_hash, prompt_preview, executor, depends_on_json)
201
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`);
202
+ for (const block of graph.blocks.values()) {
203
+ insertBlock.run(projectRoot, block.ref, block.taskId, block.blockId, block.type, block.title, block.promptRef.path, block.promptRef.contentHash, block.promptRef.preview, block.executor, jsonString(block.dependsOn));
204
+ }
205
+ const insertEdge = db.prepare("INSERT INTO edges (project_root, edge_type, from_ref, to_ref) VALUES (?, ?, ?, ?)");
206
+ for (const edge of graph.edges) {
207
+ if (edge.type === "taskDependsOn") {
208
+ insertEdge.run(projectRoot, edge.type, edge.fromTaskId, edge.toTaskId);
209
+ }
210
+ else {
211
+ insertEdge.run(projectRoot, edge.type, edge.fromBlockRef, edge.toBlockRef);
212
+ }
213
+ }
214
+ const insertPrompt = db.prepare(`INSERT INTO prompt_index (project_root, owner_kind, owner_ref, path, content_hash, preview, indexed_at)
215
+ VALUES (?, ?, ?, ?, ?, ?, ?)`);
216
+ for (const prompt of graph.promptRefs.values()) {
217
+ insertPrompt.run(projectRoot, prompt.ownerKind, prompt.ownerRef, prompt.path, prompt.contentHash, prompt.preview, indexedAt);
218
+ }
219
+ db.exec("COMMIT");
220
+ }
221
+ catch (error) {
222
+ db.exec("ROLLBACK");
223
+ throw error;
224
+ }
225
+ }
226
+ function deleteTaskRows(db, projectRoot, taskId) {
227
+ db.prepare("DELETE FROM tasks WHERE project_root = ? AND task_id = ?").run(projectRoot, taskId);
228
+ db.prepare("DELETE FROM prompt_index WHERE project_root = ? AND owner_ref = ?").run(projectRoot, taskId);
229
+ }
230
+ function deleteBlockRows(db, projectRoot, blockRef) {
231
+ db.prepare("DELETE FROM blocks WHERE project_root = ? AND block_ref = ?").run(projectRoot, blockRef);
232
+ db.prepare("DELETE FROM prompt_index WHERE project_root = ? AND owner_ref = ?").run(projectRoot, blockRef);
233
+ }
234
+ function upsertTaskRow(db, projectRoot, task) {
235
+ db.prepare(`INSERT OR REPLACE INTO tasks
236
+ (project_root, task_id, canvas_id, title, prompt_path, prompt_hash, prompt_preview, executor, acceptance_json, block_refs_json)
237
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(projectRoot, task.taskId, task.canvasId, task.title, task.promptRef.path, task.promptRef.contentHash, task.promptRef.preview, task.executor, jsonString(task.acceptance), jsonString(task.blockRefs));
238
+ }
239
+ function upsertBlockRow(db, projectRoot, block) {
240
+ db.prepare(`INSERT OR REPLACE INTO blocks
241
+ (project_root, block_ref, task_id, block_id, type, title, prompt_path, prompt_hash, prompt_preview, executor, depends_on_json)
242
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(projectRoot, block.ref, block.taskId, block.blockId, block.type, block.title, block.promptRef.path, block.promptRef.contentHash, block.promptRef.preview, block.executor, jsonString(block.dependsOn));
243
+ }
244
+ function upsertPromptRow(db, projectRoot, prompt, indexedAt) {
245
+ db.prepare(`INSERT OR REPLACE INTO prompt_index (project_root, owner_kind, owner_ref, path, content_hash, preview, indexed_at)
246
+ VALUES (?, ?, ?, ?, ?, ?, ?)`).run(projectRoot, prompt.ownerKind, prompt.ownerRef, prompt.path, prompt.contentHash, prompt.preview, indexedAt);
247
+ }
248
+ function writeGraphMeta(db, projectRoot, graph, indexedAt) {
249
+ db.prepare("DELETE FROM graph_meta WHERE project_root = ?").run(projectRoot);
250
+ db.prepare(`INSERT INTO graph_meta (project_root, package_fingerprint, graph_version, project_json, diagnostics_json, indexed_at)
251
+ VALUES (?, ?, ?, ?, ?, ?)`).run(projectRoot, graph.packageFingerprint, graph.graphVersion, jsonString(graph.project), jsonString(graph.diagnostics), indexedAt);
252
+ }
253
+ function changedPromptOwnerRefs(graph, paths) {
254
+ const normalized = new Set(paths.map(normalizePackagePath).filter((path) => path !== null));
255
+ return [...graph.promptRefs.values()].filter((prompt) => normalized.has(prompt.path)).map((prompt) => prompt.ownerRef);
256
+ }
257
+ function normalizePackagePath(path) {
258
+ const normalized = path.split("\\").join("/");
259
+ if (normalized === "manifest.json" || normalized === "package/manifest.json") {
260
+ return "manifest.json";
261
+ }
262
+ const packageNodesPrefix = "package/nodes/";
263
+ if (normalized.startsWith(packageNodesPrefix)) {
264
+ return normalized.slice("package/".length);
265
+ }
266
+ const nodesIndex = normalized.indexOf("/nodes/");
267
+ if (nodesIndex >= 0) {
268
+ return normalized.slice(nodesIndex + 1);
269
+ }
270
+ if (normalized.startsWith("nodes/")) {
271
+ return normalized;
272
+ }
273
+ return null;
274
+ }
275
+ function shouldFullRebuildChangedPaths(paths) {
276
+ if (paths.length === 0) {
277
+ return false;
278
+ }
279
+ return paths.some((path) => {
280
+ const normalized = normalizePackagePath(path);
281
+ return normalized === null || normalized === "manifest.json";
282
+ });
283
+ }
284
+ function writeChangedPromptIndex(db, projectRoot, graph, paths) {
285
+ const ownerRefs = changedPromptOwnerRefs(graph, paths);
286
+ const indexedAt = new Date().toISOString();
287
+ db.exec("BEGIN");
288
+ try {
289
+ writeGraphMeta(db, projectRoot, graph, indexedAt);
290
+ db.prepare("DELETE FROM edges WHERE project_root = ?").run(projectRoot);
291
+ const insertEdge = db.prepare("INSERT INTO edges (project_root, edge_type, from_ref, to_ref) VALUES (?, ?, ?, ?)");
292
+ for (const edge of graph.edges) {
293
+ if (edge.type === "taskDependsOn") {
294
+ insertEdge.run(projectRoot, edge.type, edge.fromTaskId, edge.toTaskId);
295
+ }
296
+ else {
297
+ insertEdge.run(projectRoot, edge.type, edge.fromBlockRef, edge.toBlockRef);
298
+ }
299
+ }
300
+ for (const ownerRef of ownerRefs) {
301
+ const prompt = graph.promptRefs.get(ownerRef);
302
+ if (!prompt) {
303
+ continue;
304
+ }
305
+ upsertPromptRow(db, projectRoot, prompt, indexedAt);
306
+ if (prompt.ownerKind === "task") {
307
+ const task = graph.tasks.get(ownerRef);
308
+ if (task) {
309
+ upsertTaskRow(db, projectRoot, task);
310
+ }
311
+ else {
312
+ deleteTaskRows(db, projectRoot, ownerRef);
313
+ }
314
+ }
315
+ else {
316
+ const block = graph.blocks.get(ownerRef);
317
+ if (block) {
318
+ upsertBlockRow(db, projectRoot, block);
319
+ }
320
+ else {
321
+ deleteBlockRows(db, projectRoot, ownerRef);
322
+ }
323
+ }
324
+ }
325
+ db.exec("COMMIT");
326
+ }
327
+ catch (error) {
328
+ db.exec("ROLLBACK");
329
+ throw error;
330
+ }
331
+ }
332
+ function readGraphIndex(db, projectRoot) {
333
+ const meta = db.prepare("SELECT * FROM graph_meta WHERE project_root = ?").get(projectRoot);
334
+ if (!meta) {
335
+ return null;
336
+ }
337
+ const promptRefs = new Map();
338
+ for (const row of db.prepare("SELECT * FROM prompt_index WHERE project_root = ? ORDER BY owner_ref").all(projectRoot)) {
339
+ const prompt = {
340
+ ownerKind: stringColumn(row, "owner_kind") === "task" ? "task" : "block",
341
+ ownerRef: stringColumn(row, "owner_ref"),
342
+ path: stringColumn(row, "path"),
343
+ contentHash: stringColumn(row, "content_hash"),
344
+ preview: stringColumn(row, "preview")
345
+ };
346
+ promptRefs.set(prompt.ownerRef, prompt);
347
+ }
348
+ const tasks = new Map();
349
+ for (const row of db.prepare("SELECT * FROM tasks WHERE project_root = ? ORDER BY task_id").all(projectRoot)) {
350
+ const taskId = stringColumn(row, "task_id");
351
+ const promptRef = promptRefs.get(taskId);
352
+ if (!promptRef) {
353
+ throw new Error(`SQLite index missing task prompt '${taskId}'.`);
354
+ }
355
+ tasks.set(taskId, {
356
+ taskId,
357
+ canvasId: nullableStringColumn(row, "canvas_id"),
358
+ title: stringColumn(row, "title"),
359
+ promptRef,
360
+ acceptance: stringArrayColumn(row, "acceptance_json"),
361
+ executor: nullableStringColumn(row, "executor"),
362
+ blockRefs: stringArrayColumn(row, "block_refs_json")
363
+ });
364
+ }
365
+ const blocks = new Map();
366
+ for (const row of db.prepare("SELECT * FROM blocks WHERE project_root = ? ORDER BY block_ref").all(projectRoot)) {
367
+ const ref = stringColumn(row, "block_ref");
368
+ const promptRef = promptRefs.get(ref);
369
+ if (!promptRef) {
370
+ throw new Error(`SQLite index missing block prompt '${ref}'.`);
371
+ }
372
+ const type = stringColumn(row, "type");
373
+ if (type !== "implementation" && type !== "review") {
374
+ throw new Error(`SQLite index contains unsupported block type '${type}'.`);
375
+ }
376
+ blocks.set(ref, {
377
+ ref,
378
+ taskId: stringColumn(row, "task_id"),
379
+ blockId: stringColumn(row, "block_id"),
380
+ type,
381
+ title: stringColumn(row, "title"),
382
+ promptRef,
383
+ executor: nullableStringColumn(row, "executor"),
384
+ dependsOn: stringArrayColumn(row, "depends_on_json")
385
+ });
386
+ }
387
+ const edges = db.prepare("SELECT * FROM edges WHERE project_root = ? ORDER BY edge_type, from_ref, to_ref").all(projectRoot).map((row) => {
388
+ const type = stringColumn(row, "edge_type");
389
+ if (type === "taskDependsOn") {
390
+ return { type, fromTaskId: stringColumn(row, "from_ref"), toTaskId: stringColumn(row, "to_ref") };
391
+ }
392
+ if (type === "blockDependsOn") {
393
+ return { type, fromBlockRef: stringColumn(row, "from_ref"), toBlockRef: stringColumn(row, "to_ref") };
394
+ }
395
+ throw new Error(`SQLite index contains unsupported edge type '${type}'.`);
396
+ });
397
+ return {
398
+ graphVersion: stringColumn(meta, "graph_version"),
399
+ packageFingerprint: stringColumn(meta, "package_fingerprint"),
400
+ project: parseJsonRecord(stringColumn(meta, "project_json"), "project_json"),
401
+ diagnostics: parseJsonArray(stringColumn(meta, "diagnostics_json"), "diagnostics_json"),
402
+ tasks,
403
+ blocks,
404
+ edges,
405
+ promptRefs
406
+ };
407
+ }
408
+ function parseCommand(value) {
409
+ return parseJsonRecord(value, "command_json");
410
+ }
411
+ function parseWorkspaceRef(value, fallbackProjectRoot) {
412
+ if (typeof value !== "string" || !value.trim()) {
413
+ return fallbackProjectRoot;
414
+ }
415
+ const parsed = JSON.parse(value);
416
+ if (typeof parsed === "string") {
417
+ return parsed;
418
+ }
419
+ if (isRecord(parsed)) {
420
+ return parsed;
421
+ }
422
+ return fallbackProjectRoot;
423
+ }
424
+ function parseAffected(value) {
425
+ return parseJsonRecord(value, "affected_json");
426
+ }
427
+ function operationLogEntry(row, projectRoot) {
428
+ return {
429
+ id: numberColumn(row, "id"),
430
+ workspaceRef: parseWorkspaceRef(row.workspace_ref_json, projectRoot),
431
+ graphVersionBefore: stringColumn(row, "graph_version_before"),
432
+ graphVersionAfter: stringColumn(row, "graph_version_after"),
433
+ command: parseCommand(stringColumn(row, "command_json")),
434
+ inverse: JSON.parse(stringColumn(row, "inverse_json")),
435
+ affected: parseAffected(stringColumn(row, "affected_json")),
436
+ createdAt: stringColumn(row, "created_at"),
437
+ undoneAt: nullableStringColumn(row, "undone_at")
438
+ };
439
+ }
440
+ function promptHistoryTarget(command) {
441
+ if (command.type === "updateTaskPrompt") {
442
+ return `task:${command.taskId}`;
443
+ }
444
+ if (command.type === "updateBlockPrompt") {
445
+ return `block:${command.blockRef}`;
446
+ }
447
+ if (command.type === "updateTaskFields" &&
448
+ command.fields.promptMarkdown !== undefined &&
449
+ command.fields.title === undefined &&
450
+ command.fields.executor === undefined &&
451
+ command.fields.acceptance === undefined) {
452
+ return `task:${command.taskId}`;
453
+ }
454
+ if (command.type === "updateBlockFields" &&
455
+ command.fields.promptMarkdown !== undefined &&
456
+ command.fields.title === undefined &&
457
+ command.fields.executor === undefined &&
458
+ command.fields.dependsOn === undefined &&
459
+ command.fields.parallelSafe === undefined &&
460
+ command.fields.parallelLocks === undefined &&
461
+ command.fields.reviewRequired === undefined &&
462
+ command.fields.maxFeedbackCycles === undefined &&
463
+ command.fields.reviewHook === undefined) {
464
+ return `block:${command.blockRef}`;
465
+ }
466
+ return null;
467
+ }
468
+ function mergeAffectedRefs(left, right) {
469
+ return {
470
+ canvases: [...new Set([...left.canvases, ...right.canvases])],
471
+ tasks: [...new Set([...left.tasks, ...right.tasks])],
472
+ blocks: [...new Set([...left.blocks, ...right.blocks])],
473
+ prompts: [...new Set([...left.prompts, ...right.prompts])],
474
+ packageFiles: [...new Set([...left.packageFiles, ...right.packageFiles])]
475
+ };
476
+ }
477
+ function sameWorkspaceRef(left, right) {
478
+ return jsonString(left) === jsonString(right);
479
+ }
480
+ function projectionVersion(row) {
481
+ return {
482
+ projectionName: stringColumn(row, "projection_name"),
483
+ graphVersion: stringColumn(row, "graph_version"),
484
+ projectionVersion: stringColumn(row, "projection_version"),
485
+ cacheKey: stringColumn(row, "cache_key"),
486
+ updatedAt: stringColumn(row, "updated_at")
487
+ };
488
+ }
489
+ export async function createSqlitePlanGraphStore(options) {
490
+ const { workspace, indexPath } = await resolveIndexPath(options.projectRoot, options.indexPath);
491
+ const graphKey = workspace.workspaceRoot;
492
+ const historyKey = workspace.rootPath;
493
+ const rebuild = async (rebuildOptions = {}) => {
494
+ const db = await openDatabase(indexPath);
495
+ try {
496
+ const loaded = await loadPlanGraphPackage(options.projectRoot);
497
+ writeGraphIndex(db, graphKey, loaded.graph);
498
+ if (rebuildOptions.clearHistory) {
499
+ db.prepare("DELETE FROM operation_log WHERE project_root = ?").run(historyKey);
500
+ }
501
+ db.prepare("DELETE FROM projection_versions WHERE project_root = ?").run(graphKey);
502
+ return loaded.graph;
503
+ }
504
+ finally {
505
+ db.close();
506
+ }
507
+ };
508
+ return {
509
+ indexPath,
510
+ rebuild,
511
+ async indexChangedPaths(paths, rebuildOptions = {}) {
512
+ if (shouldFullRebuildChangedPaths(paths)) {
513
+ return rebuild(rebuildOptions);
514
+ }
515
+ const db = await openDatabase(indexPath);
516
+ try {
517
+ const loaded = await loadPlanGraphPackage(options.projectRoot);
518
+ writeChangedPromptIndex(db, graphKey, loaded.graph, paths);
519
+ if (rebuildOptions.clearHistory) {
520
+ db.prepare("DELETE FROM operation_log WHERE project_root = ?").run(historyKey);
521
+ }
522
+ db.prepare("DELETE FROM projection_versions WHERE project_root = ?").run(graphKey);
523
+ return loaded.graph;
524
+ }
525
+ finally {
526
+ db.close();
527
+ }
528
+ },
529
+ async load() {
530
+ const db = await openDatabase(indexPath);
531
+ try {
532
+ return readGraphIndex(db, graphKey);
533
+ }
534
+ finally {
535
+ db.close();
536
+ }
537
+ },
538
+ async getProjectionVersion(projectionName, cacheKey) {
539
+ const db = await openDatabase(indexPath);
540
+ try {
541
+ const row = db
542
+ .prepare("SELECT * FROM projection_versions WHERE project_root = ? AND projection_name = ? AND cache_key = ?")
543
+ .get(graphKey, projectionName, cacheKey);
544
+ return row ? projectionVersion(row) : null;
545
+ }
546
+ finally {
547
+ db.close();
548
+ }
549
+ },
550
+ async setProjectionVersion(projection) {
551
+ const db = await openDatabase(indexPath);
552
+ try {
553
+ db.prepare(`INSERT OR REPLACE INTO projection_versions
554
+ (project_root, projection_name, graph_version, projection_version, cache_key, updated_at)
555
+ VALUES (?, ?, ?, ?, ?, ?)`).run(graphKey, projection.projectionName, projection.graphVersion, projection.projectionVersion, projection.cacheKey, projection.updatedAt);
556
+ }
557
+ finally {
558
+ db.close();
559
+ }
560
+ },
561
+ async clearProjectionVersions() {
562
+ const db = await openDatabase(indexPath);
563
+ try {
564
+ db.prepare("DELETE FROM projection_versions WHERE project_root = ?").run(graphKey);
565
+ }
566
+ finally {
567
+ db.close();
568
+ }
569
+ },
570
+ log: {
571
+ async append(entry) {
572
+ const db = await openDatabase(indexPath);
573
+ try {
574
+ db.prepare("DELETE FROM operation_log WHERE project_root = ? AND undone_at IS NOT NULL").run(historyKey);
575
+ const promptTarget = promptHistoryTarget(entry.command);
576
+ if (promptTarget) {
577
+ const latest = db
578
+ .prepare("SELECT * FROM operation_log WHERE project_root = ? AND undone_at IS NULL ORDER BY id DESC LIMIT 1")
579
+ .get(historyKey);
580
+ if (latest) {
581
+ const latestEntry = operationLogEntry(latest, historyKey);
582
+ if (promptHistoryTarget(latestEntry.command) === promptTarget && sameWorkspaceRef(latestEntry.workspaceRef, entry.workspaceRef)) {
583
+ db.prepare(`UPDATE operation_log
584
+ SET graph_version_after = ?, command_json = ?, affected_json = ?
585
+ WHERE id = ? AND project_root = ?`).run(entry.graphVersionAfter, jsonString(entry.command), jsonString(mergeAffectedRefs(latestEntry.affected, entry.affected)), latestEntry.id, historyKey);
586
+ return latestEntry.id;
587
+ }
588
+ }
589
+ }
590
+ const result = db
591
+ .prepare(`INSERT INTO operation_log
592
+ (project_root, workspace_ref_json, graph_version_before, graph_version_after, command_json, inverse_json, affected_json, created_at)
593
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?)`)
594
+ .run(historyKey, jsonString(entry.workspaceRef), entry.graphVersionBefore, entry.graphVersionAfter, jsonString(entry.command), jsonString(entry.inverse), jsonString(entry.affected), new Date().toISOString());
595
+ return Number(result.lastInsertRowid);
596
+ }
597
+ finally {
598
+ db.close();
599
+ }
600
+ },
601
+ async latestUndoable() {
602
+ const db = await openDatabase(indexPath);
603
+ try {
604
+ const row = db
605
+ .prepare("SELECT * FROM operation_log WHERE project_root = ? AND undone_at IS NULL ORDER BY id DESC LIMIT 1")
606
+ .get(historyKey);
607
+ return row ? operationLogEntry(row, historyKey) : null;
608
+ }
609
+ finally {
610
+ db.close();
611
+ }
612
+ },
613
+ async latestRedoable() {
614
+ const db = await openDatabase(indexPath);
615
+ try {
616
+ const row = db
617
+ .prepare("SELECT * FROM operation_log WHERE project_root = ? AND undone_at IS NOT NULL ORDER BY undone_at DESC, id ASC LIMIT 1")
618
+ .get(historyKey);
619
+ return row ? operationLogEntry(row, historyKey) : null;
620
+ }
621
+ finally {
622
+ db.close();
623
+ }
624
+ },
625
+ async markUndone(id) {
626
+ const db = await openDatabase(indexPath);
627
+ try {
628
+ db.prepare("UPDATE operation_log SET undone_at = ? WHERE id = ? AND project_root = ?").run(new Date().toISOString(), id, historyKey);
629
+ }
630
+ finally {
631
+ db.close();
632
+ }
633
+ },
634
+ async markRedone(id) {
635
+ const db = await openDatabase(indexPath);
636
+ try {
637
+ db.prepare("UPDATE operation_log SET undone_at = NULL WHERE id = ? AND project_root = ?").run(id, historyKey);
638
+ }
639
+ finally {
640
+ db.close();
641
+ }
642
+ },
643
+ async clear() {
644
+ const db = await openDatabase(indexPath);
645
+ try {
646
+ db.prepare("DELETE FROM operation_log WHERE project_root = ?").run(historyKey);
647
+ }
648
+ finally {
649
+ db.close();
650
+ }
651
+ }
652
+ }
653
+ };
654
+ }
655
+ //# sourceMappingURL=sqliteIndex.js.map