@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
@@ -1,12 +1,17 @@
1
- import { join, resolve } from "node:path";
2
1
  import { stat } from "node:fs/promises";
3
- import { resolveProjectWorkspace } from "../../project.js";
2
+ import { performance } from "node:perf_hooks";
3
+ import { join, resolve } from "node:path";
4
4
  import { createPackageFileSnapshot } from "../../package/fileChanges.js";
5
+ import { resolveProjectWorkspace } from "../../project.js";
5
6
  import { projectGraphPath } from "../../projectGraph/index.js";
6
- import { buildResultsFileIndex, sameResultsFileFingerprintSnapshot, snapshotResultsFileFingerprints } from "./resultsFileIndex.js";
7
- import { buildSearchIndexFromProjectTodoContext } from "./searchIndexModel.js";
7
+ import { loadRuntime } from "../../taskManager/runtimeContext.js";
8
+ import { appendDesktopDiagnostic, desktopDiagnostic, errorMessage } from "./desktopDiagnostics.js";
9
+ import { loadProjectCanvasAggregation, runtimeSnapshotFromGraphState } from "./projectCanvasAggregation.js";
10
+ import { buildResultsFileIndexFromFingerprintSnapshot, sameResultsFileFingerprintSnapshot, snapshotResultsFileFingerprints } from "./resultsFileIndex.js";
11
+ import { buildSearchIndexForCanvas, buildSearchIndexFromCanvasIndexes } from "./searchIndexModel.js";
8
12
  import { buildStatisticsProjectionFromIndexes } from "./statisticsIndexModel.js";
9
- import { loadProjectTodoContext } from "./todoModel.js";
13
+ import { buildCanvasExecutionSnapshot, failedCanvasExecutionSnapshot } from "./todoModel.js";
14
+ const desktopProjectProjectionCacheVersion = 2;
10
15
  const projectProjectionCache = new Map();
11
16
  function projectProjectionKey(projectRoot) {
12
17
  return resolve(typeof projectRoot === "string" ? projectRoot : projectRoot.rootPath);
@@ -18,25 +23,6 @@ export function invalidateDesktopProjectProjection(projectRoot) {
18
23
  }
19
24
  projectProjectionCache.delete(projectProjectionKey(projectRoot));
20
25
  }
21
- async function buildDesktopProjectProjection(projectRoot) {
22
- const todoContext = await loadProjectTodoContext(projectRoot);
23
- const diagnostics = [...todoContext.diagnostics];
24
- const resultsByCanvas = new Map();
25
- for (const canvasId of todoContext.aggregation.orderedCanvasIds) {
26
- const canvas = todoContext.aggregation.canvasesById.get(canvasId);
27
- if (!canvas) {
28
- continue;
29
- }
30
- const resultIndex = await buildResultsFileIndex(canvas.workspace);
31
- resultsByCanvas.set(canvasId, resultIndex);
32
- }
33
- return {
34
- projectRoot,
35
- todoContext,
36
- resultsByCanvas,
37
- diagnostics
38
- };
39
- }
40
26
  async function optionalFileStatFingerprint(path) {
41
27
  try {
42
28
  const metadata = await stat(path);
@@ -51,11 +37,26 @@ async function optionalFileStatFingerprint(path) {
51
37
  }
52
38
  }
53
39
  async function packageInputFingerprint(projectRoot) {
40
+ const snapshot = await createPackageFileSnapshot(projectRoot);
41
+ return {
42
+ manifestFile: snapshot.manifestFile,
43
+ promptFiles: snapshot.promptFiles
44
+ };
45
+ }
46
+ function workspaceFingerprint(workspace) {
47
+ return {
48
+ rootPath: resolve(workspace.rootPath),
49
+ packageDir: resolve(workspace.packageDir),
50
+ stateFile: resolve(workspace.stateFile),
51
+ resultsDir: resolve(workspace.resultsDir)
52
+ };
53
+ }
54
+ async function canvasRuntimeInputFingerprint(workspace) {
54
55
  try {
55
- const snapshot = await createPackageFileSnapshot(projectRoot);
56
56
  return {
57
- manifestFile: snapshot.manifestFile,
58
- promptFiles: snapshot.promptFiles
57
+ workspace: workspaceFingerprint(workspace),
58
+ packageFiles: await packageInputFingerprint(workspace),
59
+ stateFile: await optionalFileStatFingerprint(workspace.stateFile)
59
60
  };
60
61
  }
61
62
  catch {
@@ -70,24 +71,6 @@ async function buildProjectInputFingerprint(projectRoot) {
70
71
  legacyCanvasRegistryFile: await optionalFileStatFingerprint(join(workspace.workspaceRoot, "desktop", "canvases.json"))
71
72
  };
72
73
  }
73
- async function buildDesktopProjectProjectionFingerprints(projectRoot, projection) {
74
- const canvases = new Map();
75
- for (const canvasId of projection.todoContext.aggregation.orderedCanvasIds) {
76
- const canvas = projection.todoContext.aggregation.canvasesById.get(canvasId);
77
- if (!canvas) {
78
- continue;
79
- }
80
- canvases.set(canvasId, {
81
- packageFiles: await packageInputFingerprint(canvas.workspace),
82
- stateFile: await optionalFileStatFingerprint(canvas.workspace.stateFile),
83
- results: await snapshotResultsFileFingerprints(canvas.workspace)
84
- });
85
- }
86
- return {
87
- project: await buildProjectInputFingerprint(projectRoot),
88
- canvases
89
- };
90
- }
91
74
  function sameFileStatFingerprint(left, right) {
92
75
  return left?.path === right?.path && left?.mtimeMs === right?.mtimeMs && left?.size === right?.size;
93
76
  }
@@ -104,9 +87,6 @@ function samePromptFileFingerprints(left, right) {
104
87
  return true;
105
88
  }
106
89
  function samePackageInputFingerprint(left, right) {
107
- if (left === null || right === null) {
108
- return left === right;
109
- }
110
90
  return sameFileFingerprint(left.manifestFile, right.manifestFile) && samePromptFileFingerprints(left.promptFiles, right.promptFiles);
111
91
  }
112
92
  function sameProjectInputFingerprint(left, right) {
@@ -114,47 +94,235 @@ function sameProjectInputFingerprint(left, right) {
114
94
  && sameFileStatFingerprint(left.projectGraphFile, right.projectGraphFile)
115
95
  && sameFileStatFingerprint(left.legacyCanvasRegistryFile, right.legacyCanvasRegistryFile);
116
96
  }
97
+ function sameWorkspaceFingerprint(left, right) {
98
+ return left.rootPath === right.rootPath
99
+ && left.packageDir === right.packageDir
100
+ && left.stateFile === right.stateFile
101
+ && left.resultsDir === right.resultsDir;
102
+ }
103
+ function sameCanvasRuntimeInputFingerprint(left, right) {
104
+ return sameWorkspaceFingerprint(left.workspace, right.workspace)
105
+ && samePackageInputFingerprint(left.packageFiles, right.packageFiles)
106
+ && sameFileStatFingerprint(left.stateFile, right.stateFile);
107
+ }
108
+ function sameCanvasBlockerFingerprint(left, right) {
109
+ return left.canvasDependencies.length === right.canvasDependencies.length
110
+ && left.canvasDependencies.every((dependency, index) => {
111
+ const next = right.canvasDependencies[index];
112
+ return dependency.canvasId === next?.canvasId && dependency.complete === next.complete;
113
+ })
114
+ && left.crossTaskDependencies.length === right.crossTaskDependencies.length
115
+ && left.crossTaskDependencies.every((dependency, index) => {
116
+ const next = right.crossTaskDependencies[index];
117
+ return dependency.canvasId === next?.canvasId
118
+ && dependency.taskId === next.taskId
119
+ && dependency.dependsOnCanvasId === next.dependsOnCanvasId
120
+ && dependency.dependsOnTaskId === next.dependsOnTaskId
121
+ && dependency.status === next.status;
122
+ });
123
+ }
117
124
  function sameCanvasProjectionFingerprint(left, right) {
118
- return samePackageInputFingerprint(left.packageFiles, right.packageFiles)
119
- && sameFileStatFingerprint(left.stateFile, right.stateFile)
120
- && sameResultsFileFingerprintSnapshot(left.results, right.results);
125
+ return sameCanvasRuntimeInputFingerprint(left, right)
126
+ && sameResultsFileFingerprintSnapshot(left.results, right.results)
127
+ && sameCanvasBlockerFingerprint(left.blockers, right.blockers);
128
+ }
129
+ function slowDiagnosticThresholdMs() {
130
+ const raw = process.env.PLANWEAVE_DESKTOP_PROJECTION_SLOW_DIAGNOSTICS_MS;
131
+ if (raw === undefined || raw === "") {
132
+ return null;
133
+ }
134
+ const threshold = Number(raw);
135
+ return Number.isFinite(threshold) && threshold >= 0 ? threshold : null;
121
136
  }
122
- async function cachedProjectionIsFresh(cached) {
123
- let current;
137
+ async function captureProjectionPart(diagnostics, label, path, action) {
138
+ const threshold = slowDiagnosticThresholdMs();
139
+ if (threshold === null) {
140
+ return action();
141
+ }
142
+ const startedAt = performance.now();
124
143
  try {
125
- current = await buildDesktopProjectProjectionFingerprints(cached.projection.projectRoot, cached.projection);
144
+ return await action();
126
145
  }
127
- catch {
128
- return false;
146
+ finally {
147
+ const elapsedMs = performance.now() - startedAt;
148
+ if (elapsedMs >= threshold) {
149
+ appendDesktopDiagnostic(diagnostics, desktopDiagnostic("desktop_projection_slow_part", `Desktop projection ${label} took ${Math.round(elapsedMs)} ms.`, path));
150
+ }
129
151
  }
130
- if (!sameProjectInputFingerprint(cached.fingerprints.project, current.project)) {
131
- return false;
152
+ }
153
+ function canvasBlockerFingerprint(aggregation, canvasId) {
154
+ const canvasDependencies = (aggregation.graph.canvasDependenciesByCanvas.get(canvasId) ?? [])
155
+ .map((dependencyCanvasId) => ({
156
+ canvasId: dependencyCanvasId,
157
+ complete: aggregation.runtimeSnapshotsByCanvas.get(dependencyCanvasId)?.complete ?? false
158
+ }))
159
+ .sort((left, right) => left.canvasId.localeCompare(right.canvasId));
160
+ const taskIds = Array.from(aggregation.runtimeSnapshotsByCanvas.get(canvasId)?.taskStatusById.keys() ?? []);
161
+ const crossTaskDependencies = taskIds.flatMap((taskId) => aggregation.graph
162
+ .crossTaskDependencies({ canvasId, taskId })
163
+ .filter((dependency) => dependency.canvasId !== canvasId)
164
+ .map((dependency) => ({
165
+ canvasId,
166
+ taskId,
167
+ dependsOnCanvasId: dependency.canvasId,
168
+ dependsOnTaskId: dependency.taskId,
169
+ status: aggregation.runtimeSnapshotsByCanvas.get(dependency.canvasId)?.taskStatusById.get(dependency.taskId) ?? null
170
+ })))
171
+ .sort((left, right) => {
172
+ const leftKey = `${left.canvasId}:${left.taskId}:${left.dependsOnCanvasId}:${left.dependsOnTaskId}`;
173
+ const rightKey = `${right.canvasId}:${right.taskId}:${right.dependsOnCanvasId}:${right.dependsOnTaskId}`;
174
+ return leftKey.localeCompare(rightKey);
175
+ });
176
+ return { canvasDependencies, crossTaskDependencies };
177
+ }
178
+ async function loadCanvasRuntimeSnapshot(workspace, canvasId, cached, runtimeInputFingerprintsByCanvas, runtimesByCanvas) {
179
+ const currentFingerprint = await canvasRuntimeInputFingerprint(workspace);
180
+ runtimeInputFingerprintsByCanvas.set(canvasId, currentFingerprint);
181
+ const cachedEntry = cached?.canvases.get(canvasId);
182
+ if (currentFingerprint
183
+ && cachedEntry?.version === desktopProjectProjectionCacheVersion
184
+ && cachedEntry.fingerprint
185
+ && sameCanvasRuntimeInputFingerprint(cachedEntry.fingerprint, currentFingerprint)) {
186
+ return cachedEntry.runtimeSnapshot;
132
187
  }
133
- if (current.canvases.size !== cached.fingerprints.canvases.size) {
134
- return false;
188
+ const runtime = await loadRuntime({ projectRoot: workspace });
189
+ runtimesByCanvas.set(canvasId, runtime);
190
+ runtimeInputFingerprintsByCanvas.set(canvasId, await canvasRuntimeInputFingerprint(workspace));
191
+ return runtimeSnapshotFromGraphState(runtime.graph, runtime.state);
192
+ }
193
+ function cachedCanvasEntryIsReusable(cachedEntry, currentFingerprint, projectInputsChanged) {
194
+ return !projectInputsChanged
195
+ && currentFingerprint !== null
196
+ && cachedEntry?.version === desktopProjectProjectionCacheVersion
197
+ && cachedEntry.fingerprint !== null
198
+ && sameCanvasProjectionFingerprint(cachedEntry.fingerprint, currentFingerprint);
199
+ }
200
+ function missingRuntimeSnapshot() {
201
+ return {
202
+ taskCount: 0,
203
+ taskStatusById: new Map(),
204
+ complete: false
205
+ };
206
+ }
207
+ function appendCanvasExecutionSnapshotDiagnostics(diagnostics, canvasId, snapshot) {
208
+ if (!snapshot.error) {
209
+ return;
135
210
  }
136
- for (const [canvasId, fingerprint] of cached.fingerprints.canvases) {
137
- const next = current.canvases.get(canvasId);
138
- if (!next || !sameCanvasProjectionFingerprint(fingerprint, next)) {
139
- return false;
211
+ appendDesktopDiagnostic(diagnostics, desktopDiagnostic("desktop_canvas_execution_snapshot_failed", errorMessage(snapshot.error), canvasId));
212
+ }
213
+ function appendProjectProjectionDiagnostic(diagnostics, diagnostic) {
214
+ if (diagnostic.code !== "desktop_canvas_execution_snapshot_failed") {
215
+ appendDesktopDiagnostic(diagnostics, diagnostic);
216
+ return;
217
+ }
218
+ for (let index = diagnostics.length - 1; index >= 0; index -= 1) {
219
+ const current = diagnostics[index];
220
+ if (current.code === diagnostic.code && current.path === diagnostic.path) {
221
+ diagnostics.splice(index, 1);
140
222
  }
141
223
  }
142
- return true;
224
+ diagnostics.push(diagnostic);
143
225
  }
144
- export async function readDesktopProjectProjection(projectRoot) {
145
- const key = projectProjectionKey(projectRoot);
146
- const cached = projectProjectionCache.get(key);
147
- if (cached && await cachedProjectionIsFresh(cached)) {
148
- return cached.projection;
226
+ async function buildCanvasCacheEntry(input) {
227
+ const canvas = input.aggregation.canvasesById.get(input.canvasId);
228
+ if (!canvas) {
229
+ throw new Error(`Project canvas '${input.canvasId}' is missing from aggregation.`);
230
+ }
231
+ const resultsIndex = await captureProjectionPart(input.diagnostics, "per-canvas results index", input.canvasId, () => buildResultsFileIndexFromFingerprintSnapshot(canvas.workspace, input.resultsFingerprint));
232
+ let snapshot;
233
+ try {
234
+ snapshot = await captureProjectionPart(input.diagnostics, "per-canvas snapshot", input.canvasId, () => buildCanvasExecutionSnapshot(input.aggregation, input.canvasId, input.runtime ?? input.cachedEntry?.snapshot.runtime ?? undefined));
149
235
  }
150
- const projection = await buildDesktopProjectProjection(projectRoot);
151
- projectProjectionCache.set(key, {
236
+ catch (caught) {
237
+ appendDesktopDiagnostic(input.diagnostics, desktopDiagnostic("desktop_canvas_execution_snapshot_failed", errorMessage(caught), input.canvasId));
238
+ snapshot = failedCanvasExecutionSnapshot(canvas.canvas.taskCount, caught);
239
+ }
240
+ const searchIndex = await captureProjectionPart(input.diagnostics, "search index construction", input.canvasId, () => buildSearchIndexForCanvas({
241
+ aggregation: input.aggregation,
242
+ canvasId: input.canvasId,
243
+ snapshot,
244
+ resultIndex: resultsIndex
245
+ }));
246
+ return {
247
+ version: desktopProjectProjectionCacheVersion,
248
+ fingerprint: input.fingerprint,
249
+ runtimeSnapshot: input.aggregation.runtimeSnapshotsByCanvas.get(input.canvasId) ?? missingRuntimeSnapshot(),
250
+ snapshot,
251
+ resultsIndex,
252
+ searchIndex
253
+ };
254
+ }
255
+ async function buildDesktopProjectProjection(projectRoot, cached) {
256
+ const diagnostics = [];
257
+ const runtimeInputFingerprintsByCanvas = new Map();
258
+ const runtimesByCanvas = new Map();
259
+ const aggregation = await captureProjectionPart(diagnostics, "project aggregation", projectRoot, () => loadProjectCanvasAggregation(projectRoot, {
260
+ loadRuntimeSnapshot: (workspace, canvasId) => loadCanvasRuntimeSnapshot(workspace, canvasId, cached, runtimeInputFingerprintsByCanvas, runtimesByCanvas)
261
+ }));
262
+ const projectFingerprint = await buildProjectInputFingerprint(projectRoot);
263
+ const projectInputsChanged = !cached
264
+ || cached.version !== desktopProjectProjectionCacheVersion
265
+ || !sameProjectInputFingerprint(cached.projectFingerprint, projectFingerprint);
266
+ const canvases = new Map();
267
+ const snapshotsByCanvas = new Map();
268
+ const resultsByCanvas = new Map();
269
+ for (const canvasId of aggregation.orderedCanvasIds) {
270
+ const canvas = aggregation.canvasesById.get(canvasId);
271
+ if (!canvas) {
272
+ continue;
273
+ }
274
+ const runtimeInputFingerprint = runtimeInputFingerprintsByCanvas.get(canvasId) ?? await canvasRuntimeInputFingerprint(canvas.workspace);
275
+ const resultsFingerprint = await captureProjectionPart(diagnostics, "per-canvas results fingerprint", canvasId, () => snapshotResultsFileFingerprints(canvas.workspace));
276
+ const currentFingerprint = runtimeInputFingerprint
277
+ ? {
278
+ ...runtimeInputFingerprint,
279
+ results: resultsFingerprint,
280
+ blockers: canvasBlockerFingerprint(aggregation, canvasId)
281
+ }
282
+ : null;
283
+ const cachedEntry = cached?.canvases.get(canvasId);
284
+ const entry = cachedCanvasEntryIsReusable(cachedEntry, currentFingerprint, projectInputsChanged)
285
+ ? cachedEntry
286
+ : await buildCanvasCacheEntry({
287
+ aggregation,
288
+ canvasId,
289
+ fingerprint: currentFingerprint,
290
+ resultsFingerprint,
291
+ cachedEntry,
292
+ runtime: runtimesByCanvas.get(canvasId),
293
+ diagnostics
294
+ });
295
+ canvases.set(canvasId, entry);
296
+ snapshotsByCanvas.set(canvasId, entry.snapshot);
297
+ resultsByCanvas.set(canvasId, entry.resultsIndex);
298
+ appendCanvasExecutionSnapshotDiagnostics(diagnostics, canvasId, entry.snapshot);
299
+ }
300
+ const todoContext = {
301
+ aggregation,
302
+ snapshotsByCanvas,
303
+ diagnostics
304
+ };
305
+ const projection = {
306
+ projectRoot,
307
+ todoContext,
308
+ resultsByCanvas,
309
+ diagnostics
310
+ };
311
+ return {
312
+ version: desktopProjectProjectionCacheVersion,
152
313
  projection,
153
- fingerprints: await buildDesktopProjectProjectionFingerprints(projectRoot, projection),
314
+ projectFingerprint,
315
+ canvases,
154
316
  searchIndex: null,
155
317
  statisticsProjection: null
156
- });
157
- return projection;
318
+ };
319
+ }
320
+ export async function readDesktopProjectProjection(projectRoot) {
321
+ const key = projectProjectionKey(projectRoot);
322
+ const cached = projectProjectionCache.get(key);
323
+ const next = await buildDesktopProjectProjection(projectRoot, cached);
324
+ projectProjectionCache.set(key, next);
325
+ return next.projection;
158
326
  }
159
327
  export async function readDesktopProjectSearchIndex(projectRoot) {
160
328
  const key = projectProjectionKey(projectRoot);
@@ -163,7 +331,13 @@ export async function readDesktopProjectSearchIndex(projectRoot) {
163
331
  if (cached?.searchIndex) {
164
332
  return cached.searchIndex;
165
333
  }
166
- const searchIndex = await buildSearchIndexFromProjectTodoContext(projection.todoContext, projection.resultsByCanvas);
334
+ const diagnostics = [...projection.diagnostics];
335
+ const searchIndex = await captureProjectionPart(diagnostics, "search index construction", projectRoot, async () => buildSearchIndexFromCanvasIndexes(projection.todoContext.aggregation.orderedCanvasIds
336
+ .map((canvasId) => cached?.canvases.get(canvasId)?.searchIndex)
337
+ .filter((index) => index !== undefined)));
338
+ for (const diagnostic of diagnostics) {
339
+ appendProjectProjectionDiagnostic(searchIndex.diagnostics, diagnostic);
340
+ }
167
341
  if (cached) {
168
342
  cached.searchIndex = searchIndex;
169
343
  }
@@ -176,7 +350,11 @@ export async function readDesktopProjectStatisticsProjection(projectRoot) {
176
350
  if (cached?.statisticsProjection) {
177
351
  return cached.statisticsProjection;
178
352
  }
179
- const statisticsProjection = buildStatisticsProjectionFromIndexes(projection.todoContext, projection.resultsByCanvas);
353
+ const diagnostics = [...projection.diagnostics];
354
+ const statisticsProjection = await captureProjectionPart(diagnostics, "statistics projection", projectRoot, async () => buildStatisticsProjectionFromIndexes(projection.todoContext, projection.resultsByCanvas));
355
+ for (const diagnostic of diagnostics) {
356
+ appendProjectProjectionDiagnostic(statisticsProjection.diagnostics, diagnostic);
357
+ }
180
358
  if (cached) {
181
359
  cached.statisticsProjection = statisticsProjection;
182
360
  }
@@ -1 +1 @@
1
- {"version":3,"file":"projectProjectionModel.js","sourceRoot":"","sources":["../../../src/desktop/graph/projectProjectionModel.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"projectProjectionModel.js","sourceRoot":"","sources":["../../../src/desktop/graph/projectProjectionModel.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"readModel.d.ts","sourceRoot":"","sources":["../../../src/desktop/graph/readModel.ts"],"names":[],"mappings":"AAKA,OAAO,EAAwB,KAAK,eAAe,EAAE,MAAM,sCAAsC,CAAC;AAClG,OAAO,EAAe,KAAK,cAAc,EAAE,MAAM,qCAAqC,CAAC;AAEvF,OAAO,KAAK,EAAE,mBAAmB,EAAmB,MAAM,gBAAgB,CAAC;AAC3E,OAAO,KAAK,EAAE,kBAAkB,EAAuB,qBAAqB,EAAE,iBAAiB,EAAwB,yBAAyB,EAAE,MAAM,aAAa,CAAC;AAGtK,MAAM,MAAM,4BAA4B,GAAG,cAAc,GAAG;IAC1D,MAAM,EAAE,eAAe,CAAC;IACxB,eAAe,EAAE,MAAM,EAAE,CAAC;CAC3B,CAAC;AAYF,wBAAsB,gCAAgC,CAAC,WAAW,EAAE,mBAAmB,GAAG,OAAO,CAAC,4BAA4B,CAAC,CAG9H;AAED,wBAAgB,iCAAiC,CAAC,OAAO,EAAE,cAAc,EAAE,MAAM,EAAE,eAAe,GAAG,4BAA4B,CAMhI;AAED,wBAAsB,mBAAmB,CAAC,OAAO,EAAE,4BAA4B,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAyE/G;AAED,wBAAsB,iBAAiB,CAAC,WAAW,EAAE,mBAAmB,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAExG;AAED,wBAAsB,aAAa,CAAC,WAAW,EAAE,mBAAmB,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAgBhH;AAED,wBAAsB,qBAAqB,CAAC,WAAW,EAAE,mBAAmB,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,yBAAyB,CAAC,CAQhI;AAED,wBAAsB,cAAc,CAAC,WAAW,EAAE,mBAAmB,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAmC/G"}
1
+ {"version":3,"file":"readModel.d.ts","sourceRoot":"","sources":["../../../src/desktop/graph/readModel.ts"],"names":[],"mappings":"AAKA,OAAO,EAAwB,KAAK,eAAe,EAAE,MAAM,sCAAsC,CAAC;AAClG,OAAO,EAAe,KAAK,cAAc,EAAE,MAAM,qCAAqC,CAAC;AAGvF,OAAO,KAAK,EAAE,mBAAmB,EAAmB,MAAM,gBAAgB,CAAC;AAC3E,OAAO,KAAK,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,yBAAyB,EAAE,MAAM,aAAa,CAAC;AAG3H,MAAM,MAAM,4BAA4B,GAAG,cAAc,GAAG;IAC1D,MAAM,EAAE,eAAe,CAAC;IACxB,eAAe,EAAE,MAAM,EAAE,CAAC;CAC3B,CAAC;AAYF,wBAAsB,gCAAgC,CAAC,WAAW,EAAE,mBAAmB,GAAG,OAAO,CAAC,4BAA4B,CAAC,CAG9H;AAED,wBAAgB,iCAAiC,CAAC,OAAO,EAAE,cAAc,EAAE,MAAM,EAAE,eAAe,GAAG,4BAA4B,CAMhI;AAED,wBAAsB,mBAAmB,CAAC,OAAO,EAAE,4BAA4B,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAqC/G;AAED,wBAAsB,iBAAiB,CAAC,WAAW,EAAE,mBAAmB,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAExG;AAED,wBAAsB,aAAa,CAAC,WAAW,EAAE,mBAAmB,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAmBhH;AAED,wBAAsB,qBAAqB,CAAC,WAAW,EAAE,mBAAmB,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,yBAAyB,CAAC,CAQhI;AAED,wBAAsB,cAAc,CAAC,WAAW,EAAE,mBAAmB,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAsC/G"}
@@ -6,7 +6,8 @@ import { getExecutionStatus, renderPromptSurface } from "../../taskManager/index
6
6
  import { buildExecutionStatus } from "../../taskManager/executionStatus.js";
7
7
  import { loadRuntime } from "../../taskManager/runtimeContext.js";
8
8
  import { listExecutorProfilesForManifest } from "../../autoRun/executors.js";
9
- import { exceptionForBlock, executorLabel, getBlock, getTask, promptPreview, readOptionalFile, sortBlockRefsForTask } from "./graphHelpers.js";
9
+ import { buildPlanGraphViewProjection, loadPlanGraphPackage } from "../../plangraph/index.js";
10
+ import { getBlock, getTask, readOptionalFile, sortBlockRefsForTask } from "./graphHelpers.js";
10
11
  function appendDiagnostic(diagnostics, diagnostic) {
11
12
  if (!diagnostic) {
12
13
  return;
@@ -28,71 +29,38 @@ export function buildDesktopGraphViewModelContext(runtime, status) {
28
29
  };
29
30
  }
30
31
  export async function buildGraphViewModel(context) {
31
- const { workspace, manifest, graph, state, status, executorOptions } = context;
32
- const statusByBlock = new Map(status.blocks.map((block) => [block.ref, block]));
32
+ const { workspace, status, executorOptions } = context;
33
+ const planGraphPackage = await loadPlanGraphPackage(workspace);
33
34
  const dirtyPromptRefs = new Set();
34
- const diagnostics = [...graph.diagnostics.errors];
35
- const tasks = await Promise.all(graph.taskNodesInManifestOrder.map(async (taskId) => {
36
- const task = getTask(graph, taskId);
37
- const taskStatus = status.tasks.find((item) => item.taskId === taskId)?.status ?? "planned";
38
- const taskPrompt = await readOptionalFile(await resolvePackagePath(workspace.packageDir, task.prompt), task.prompt);
35
+ const diagnostics = [...planGraphPackage.graph.diagnostics];
36
+ const taskPromptMarkdownById = new Map();
37
+ for (const task of planGraphPackage.graph.tasks.values()) {
38
+ const taskPrompt = await readOptionalFile(await resolvePackagePath(workspace.packageDir, task.promptRef.path), task.promptRef.path);
39
39
  appendDiagnostic(diagnostics, taskPrompt.diagnostic);
40
- const orderedRefs = sortBlockRefsForTask(graph, taskId);
41
- const blocks = await Promise.all(orderedRefs.map(async (ref) => {
42
- const block = getBlock(graph, ref);
43
- const blockStatus = statusByBlock.get(ref);
44
- const blockPrompt = await readOptionalFile(await resolvePackagePath(workspace.packageDir, block.prompt), block.prompt);
45
- appendDiagnostic(diagnostics, blockPrompt.diagnostic);
46
- return {
47
- ref,
48
- blockId: parseBlockRef(ref).blockId,
49
- type: block.type,
50
- title: block.title,
51
- status: blockStatus?.status ?? "planned",
52
- executor: block.executor ?? task.executor ?? manifest.execution.defaultExecutor ?? null,
53
- promptMissing: blockPrompt.missing,
54
- exceptionReason: blockStatus?.reason ?? null
55
- };
56
- }));
57
- const blockPreview = blocks.slice(0, 4);
58
- const exceptions = orderedRefs
59
- .map((ref) => {
60
- const blockStatus = statusByBlock.get(ref);
61
- if (!blockStatus) {
62
- return null;
40
+ taskPromptMarkdownById.set(task.taskId, taskPrompt.markdown);
41
+ for (const blockRef of task.blockRefs) {
42
+ const block = planGraphPackage.graph.blocks.get(blockRef);
43
+ if (!block) {
44
+ continue;
63
45
  }
64
- return exceptionForBlock(ref, blockStatus.status, blockStatus.reason);
65
- })
66
- .filter((item) => item !== null);
67
- if ((state.tasks[taskId]?.openFeedbackCount ?? 0) > 0) {
68
- exceptions.push({
69
- ref: taskId,
70
- source: "feedback",
71
- reason: `${state.tasks[taskId].openFeedbackCount} unresolved feedback item(s).`
72
- });
46
+ const blockPrompt = await readOptionalFile(await resolvePackagePath(workspace.packageDir, block.promptRef.path), block.promptRef.path);
47
+ appendDiagnostic(diagnostics, blockPrompt.diagnostic);
73
48
  }
74
- return {
75
- taskId,
76
- title: task.title,
77
- status: taskStatus,
78
- executor: task.executor ?? null,
79
- executorLabel: executorLabel(task),
80
- promptMarkdown: taskPrompt.markdown,
81
- promptMissing: taskPrompt.missing,
82
- promptPreview: promptPreview(taskPrompt.markdown),
83
- blocks,
84
- blockPreview,
85
- hiddenBlockRefs: orderedRefs.slice(blockPreview.length),
86
- overflowBlockCount: Math.max(0, orderedRefs.length - blockPreview.length),
87
- exceptions
88
- };
89
- }));
49
+ }
50
+ const projection = buildPlanGraphViewProjection({
51
+ graph: planGraphPackage.graph,
52
+ runtime: context,
53
+ status,
54
+ taskPromptMarkdownById
55
+ });
90
56
  return {
91
57
  projectId: workspace.id,
92
- projectTitle: manifest.project.title,
58
+ projectTitle: planGraphPackage.graph.project.title,
59
+ graphVersion: planGraphPackage.graph.graphVersion,
60
+ packageFingerprint: planGraphPackage.graph.packageFingerprint,
93
61
  executorOptions,
94
- tasks,
95
- edges: manifest.edges.map((edge) => ({ from: edge.from, to: edge.to, type: edge.type })),
62
+ tasks: projection.tasks,
63
+ edges: projection.edges,
96
64
  diagnostics,
97
65
  dirtyPromptRefs: [...dirtyPromptRefs]
98
66
  };
@@ -103,15 +71,18 @@ export async function getGraphViewModel(projectRoot) {
103
71
  export async function getTaskDetail(projectRoot, taskId) {
104
72
  const { workspace, manifest } = await loadPackage(projectRoot);
105
73
  const graph = compileTaskGraph(manifest);
74
+ const planGraphPackage = await loadPlanGraphPackage(workspace);
106
75
  const task = getTask(graph, taskId);
107
76
  const status = await getExecutionStatus({ projectRoot });
108
77
  const prompt = await readOptionalFile(await resolvePackagePath(workspace.packageDir, task.prompt), task.prompt);
109
78
  return {
110
79
  taskId,
80
+ graphVersion: planGraphPackage.graph.graphVersion,
111
81
  title: task.title,
112
82
  status: status.tasks.find((item) => item.taskId === taskId)?.status ?? "planned",
113
83
  executor: task.executor ?? null,
114
84
  promptMarkdown: prompt.markdown,
85
+ promptHash: planGraphPackage.graph.tasks.get(taskId)?.promptRef.contentHash ?? "",
115
86
  promptMissing: prompt.missing,
116
87
  acceptance: task.acceptance,
117
88
  blockOrder: sortBlockRefsForTask(graph, taskId)
@@ -129,6 +100,7 @@ export async function getTaskExecutionOrder(projectRoot, taskId) {
129
100
  export async function getBlockDetail(projectRoot, ref) {
130
101
  const { workspace, manifest } = await loadPackage(projectRoot);
131
102
  const graph = compileTaskGraph(manifest);
103
+ const planGraphPackage = await loadPlanGraphPackage(workspace);
132
104
  const { taskId, blockId } = parseBlockRef(ref);
133
105
  const task = getTask(graph, taskId);
134
106
  const block = getBlock(graph, ref);
@@ -143,6 +115,7 @@ export async function getBlockDetail(projectRoot, ref) {
143
115
  });
144
116
  return {
145
117
  ref,
118
+ graphVersion: planGraphPackage.graph.graphVersion,
146
119
  taskId,
147
120
  blockId,
148
121
  type: block.type,
@@ -151,6 +124,7 @@ export async function getBlockDetail(projectRoot, ref) {
151
124
  executor: block.executor ?? null,
152
125
  effectiveExecutor: block.executor ?? task.executor ?? manifest.execution.defaultExecutor ?? null,
153
126
  promptMarkdown: prompt.markdown,
127
+ promptHash: planGraphPackage.graph.blocks.get(ref)?.promptRef.contentHash ?? "",
154
128
  promptMissing: prompt.missing,
155
129
  promptSurfaceMarkdown: promptSurface.markdown,
156
130
  promptSources: promptSurface.sources,