@a5c-ai/adapters-gateway 5.1.1-staging.52898ebfc24f

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 (202) hide show
  1. package/README.md +20 -0
  2. package/dist/auth/bootstrap.d.ts +89 -0
  3. package/dist/auth/bootstrap.d.ts.map +1 -0
  4. package/dist/auth/bootstrap.js +222 -0
  5. package/dist/auth/bootstrap.js.map +1 -0
  6. package/dist/auth/hashing.d.ts +4 -0
  7. package/dist/auth/hashing.d.ts.map +1 -0
  8. package/dist/auth/hashing.js +27 -0
  9. package/dist/auth/hashing.js.map +1 -0
  10. package/dist/auth/middleware.d.ts +3 -0
  11. package/dist/auth/middleware.d.ts.map +1 -0
  12. package/dist/auth/middleware.js +17 -0
  13. package/dist/auth/middleware.js.map +1 -0
  14. package/dist/auth/tokens.d.ts +45 -0
  15. package/dist/auth/tokens.d.ts.map +1 -0
  16. package/dist/auth/tokens.js +186 -0
  17. package/dist/auth/tokens.js.map +1 -0
  18. package/dist/builtin-adapters.d.ts +17 -0
  19. package/dist/builtin-adapters.d.ts.map +1 -0
  20. package/dist/builtin-adapters.js +119 -0
  21. package/dist/builtin-adapters.js.map +1 -0
  22. package/dist/config.d.ts +37 -0
  23. package/dist/config.d.ts.map +1 -0
  24. package/dist/config.js +97 -0
  25. package/dist/config.js.map +1 -0
  26. package/dist/fanout/client-conn.d.ts +20 -0
  27. package/dist/fanout/client-conn.d.ts.map +1 -0
  28. package/dist/fanout/client-conn.js +53 -0
  29. package/dist/fanout/client-conn.js.map +1 -0
  30. package/dist/fanout/subscriber.d.ts +12 -0
  31. package/dist/fanout/subscriber.d.ts.map +1 -0
  32. package/dist/fanout/subscriber.js +40 -0
  33. package/dist/fanout/subscriber.js.map +1 -0
  34. package/dist/index.d.ts +30 -0
  35. package/dist/index.d.ts.map +1 -0
  36. package/dist/index.js +52 -0
  37. package/dist/index.js.map +1 -0
  38. package/dist/kanban/lib/config-loader.d.ts +29 -0
  39. package/dist/kanban/lib/config-loader.d.ts.map +1 -0
  40. package/dist/kanban/lib/config-loader.js +166 -0
  41. package/dist/kanban/lib/config-loader.js.map +1 -0
  42. package/dist/kanban/lib/config.d.ts +3 -0
  43. package/dist/kanban/lib/config.d.ts.map +1 -0
  44. package/dist/kanban/lib/config.js +6 -0
  45. package/dist/kanban/lib/config.js.map +1 -0
  46. package/dist/kanban/lib/create-global-registry.d.ts +28 -0
  47. package/dist/kanban/lib/create-global-registry.d.ts.map +1 -0
  48. package/dist/kanban/lib/create-global-registry.js +53 -0
  49. package/dist/kanban/lib/create-global-registry.js.map +1 -0
  50. package/dist/kanban/lib/dispatch-context-audit.d.ts +12 -0
  51. package/dist/kanban/lib/dispatch-context-audit.d.ts.map +1 -0
  52. package/dist/kanban/lib/dispatch-context-audit.js +44 -0
  53. package/dist/kanban/lib/dispatch-context-audit.js.map +1 -0
  54. package/dist/kanban/lib/error-handler.d.ts +28 -0
  55. package/dist/kanban/lib/error-handler.d.ts.map +1 -0
  56. package/dist/kanban/lib/error-handler.js +61 -0
  57. package/dist/kanban/lib/error-handler.js.map +1 -0
  58. package/dist/kanban/lib/global-registry.d.ts +49 -0
  59. package/dist/kanban/lib/global-registry.d.ts.map +1 -0
  60. package/dist/kanban/lib/global-registry.js +18 -0
  61. package/dist/kanban/lib/global-registry.js.map +1 -0
  62. package/dist/kanban/lib/parser.d.ts +36 -0
  63. package/dist/kanban/lib/parser.d.ts.map +1 -0
  64. package/dist/kanban/lib/parser.js +585 -0
  65. package/dist/kanban/lib/parser.js.map +1 -0
  66. package/dist/kanban/lib/path-resolver.d.ts +2 -0
  67. package/dist/kanban/lib/path-resolver.d.ts.map +1 -0
  68. package/dist/kanban/lib/path-resolver.js +16 -0
  69. package/dist/kanban/lib/path-resolver.js.map +1 -0
  70. package/dist/kanban/lib/review-service.d.ts +63 -0
  71. package/dist/kanban/lib/review-service.d.ts.map +1 -0
  72. package/dist/kanban/lib/review-service.js +571 -0
  73. package/dist/kanban/lib/review-service.js.map +1 -0
  74. package/dist/kanban/lib/run-cache.d.ts +36 -0
  75. package/dist/kanban/lib/run-cache.d.ts.map +1 -0
  76. package/dist/kanban/lib/run-cache.js +313 -0
  77. package/dist/kanban/lib/run-cache.js.map +1 -0
  78. package/dist/kanban/lib/server-init.d.ts +26 -0
  79. package/dist/kanban/lib/server-init.d.ts.map +1 -0
  80. package/dist/kanban/lib/server-init.js +179 -0
  81. package/dist/kanban/lib/server-init.js.map +1 -0
  82. package/dist/kanban/lib/services/automation-rule-service.d.ts +97 -0
  83. package/dist/kanban/lib/services/automation-rule-service.d.ts.map +1 -0
  84. package/dist/kanban/lib/services/automation-rule-service.js +806 -0
  85. package/dist/kanban/lib/services/automation-rule-service.js.map +1 -0
  86. package/dist/kanban/lib/services/automation-webhook-service.d.ts +44 -0
  87. package/dist/kanban/lib/services/automation-webhook-service.d.ts.map +1 -0
  88. package/dist/kanban/lib/services/automation-webhook-service.js +405 -0
  89. package/dist/kanban/lib/services/automation-webhook-service.js.map +1 -0
  90. package/dist/kanban/lib/services/backlog-query-service.d.ts +130 -0
  91. package/dist/kanban/lib/services/backlog-query-service.d.ts.map +1 -0
  92. package/dist/kanban/lib/services/backlog-query-service.js +1972 -0
  93. package/dist/kanban/lib/services/backlog-query-service.js.map +1 -0
  94. package/dist/kanban/lib/services/dispatch-context-label-service.d.ts +39 -0
  95. package/dist/kanban/lib/services/dispatch-context-label-service.d.ts.map +1 -0
  96. package/dist/kanban/lib/services/dispatch-context-label-service.js +160 -0
  97. package/dist/kanban/lib/services/dispatch-context-label-service.js.map +1 -0
  98. package/dist/kanban/lib/services/kanban-storage.d.ts +36 -0
  99. package/dist/kanban/lib/services/kanban-storage.d.ts.map +1 -0
  100. package/dist/kanban/lib/services/kanban-storage.js +26 -0
  101. package/dist/kanban/lib/services/kanban-storage.js.map +1 -0
  102. package/dist/kanban/lib/services/run-query-service.d.ts +79 -0
  103. package/dist/kanban/lib/services/run-query-service.d.ts.map +1 -0
  104. package/dist/kanban/lib/services/run-query-service.js +202 -0
  105. package/dist/kanban/lib/services/run-query-service.js.map +1 -0
  106. package/dist/kanban/lib/services/task-tag-service.d.ts +39 -0
  107. package/dist/kanban/lib/services/task-tag-service.d.ts.map +1 -0
  108. package/dist/kanban/lib/services/task-tag-service.js +145 -0
  109. package/dist/kanban/lib/services/task-tag-service.js.map +1 -0
  110. package/dist/kanban/lib/settings-section-storage.d.ts +13 -0
  111. package/dist/kanban/lib/settings-section-storage.d.ts.map +1 -0
  112. package/dist/kanban/lib/settings-section-storage.js +38 -0
  113. package/dist/kanban/lib/settings-section-storage.js.map +1 -0
  114. package/dist/kanban/lib/source-discovery.d.ts +10 -0
  115. package/dist/kanban/lib/source-discovery.d.ts.map +1 -0
  116. package/dist/kanban/lib/source-discovery.js +201 -0
  117. package/dist/kanban/lib/source-discovery.js.map +1 -0
  118. package/dist/kanban/lib/utils.d.ts +8 -0
  119. package/dist/kanban/lib/utils.d.ts.map +1 -0
  120. package/dist/kanban/lib/utils.js +116 -0
  121. package/dist/kanban/lib/utils.js.map +1 -0
  122. package/dist/kanban/lib/watcher.d.ts +14 -0
  123. package/dist/kanban/lib/watcher.d.ts.map +1 -0
  124. package/dist/kanban/lib/watcher.js +221 -0
  125. package/dist/kanban/lib/watcher.js.map +1 -0
  126. package/dist/kanban/lib/workspace-lifecycle.d.ts +68 -0
  127. package/dist/kanban/lib/workspace-lifecycle.d.ts.map +1 -0
  128. package/dist/kanban/lib/workspace-lifecycle.js +1085 -0
  129. package/dist/kanban/lib/workspace-lifecycle.js.map +1 -0
  130. package/dist/kanban/routes.d.ts +2 -0
  131. package/dist/kanban/routes.d.ts.map +1 -0
  132. package/dist/kanban/routes.js +1358 -0
  133. package/dist/kanban/routes.js.map +1 -0
  134. package/dist/kanban/types/breakpoint.d.ts +13 -0
  135. package/dist/kanban/types/breakpoint.d.ts.map +1 -0
  136. package/dist/kanban/types/breakpoint.js +3 -0
  137. package/dist/kanban/types/breakpoint.js.map +1 -0
  138. package/dist/kanban/types/index.d.ts +173 -0
  139. package/dist/kanban/types/index.d.ts.map +1 -0
  140. package/dist/kanban/types/index.js +3 -0
  141. package/dist/kanban/types/index.js.map +1 -0
  142. package/dist/logging.d.ts +7 -0
  143. package/dist/logging.d.ts.map +1 -0
  144. package/dist/logging.js +22 -0
  145. package/dist/logging.js.map +1 -0
  146. package/dist/notifications/types.d.ts +18 -0
  147. package/dist/notifications/types.d.ts.map +1 -0
  148. package/dist/notifications/types.js +2 -0
  149. package/dist/notifications/types.js.map +1 -0
  150. package/dist/notifications/webhook-out.d.ts +3 -0
  151. package/dist/notifications/webhook-out.d.ts.map +1 -0
  152. package/dist/notifications/webhook-out.js +55 -0
  153. package/dist/notifications/webhook-out.js.map +1 -0
  154. package/dist/pairing/short-code.d.ts +20 -0
  155. package/dist/pairing/short-code.d.ts.map +1 -0
  156. package/dist/pairing/short-code.js +50 -0
  157. package/dist/pairing/short-code.js.map +1 -0
  158. package/dist/protocol/errors.d.ts +10 -0
  159. package/dist/protocol/errors.d.ts.map +1 -0
  160. package/dist/protocol/errors.js +15 -0
  161. package/dist/protocol/errors.js.map +1 -0
  162. package/dist/protocol/frames.d.ts +107 -0
  163. package/dist/protocol/frames.d.ts.map +1 -0
  164. package/dist/protocol/frames.js +146 -0
  165. package/dist/protocol/frames.js.map +1 -0
  166. package/dist/protocol/v1.d.ts +111 -0
  167. package/dist/protocol/v1.d.ts.map +1 -0
  168. package/dist/protocol/v1.js +2 -0
  169. package/dist/protocol/v1.js.map +1 -0
  170. package/dist/runs/event-log-index.d.ts +29 -0
  171. package/dist/runs/event-log-index.d.ts.map +1 -0
  172. package/dist/runs/event-log-index.js +210 -0
  173. package/dist/runs/event-log-index.js.map +1 -0
  174. package/dist/runs/event-log.d.ts +25 -0
  175. package/dist/runs/event-log.d.ts.map +1 -0
  176. package/dist/runs/event-log.js +104 -0
  177. package/dist/runs/event-log.js.map +1 -0
  178. package/dist/runs/hook-broker.d.ts +18 -0
  179. package/dist/runs/hook-broker.d.ts.map +1 -0
  180. package/dist/runs/hook-broker.js +110 -0
  181. package/dist/runs/hook-broker.js.map +1 -0
  182. package/dist/runs/manager.d.ts +57 -0
  183. package/dist/runs/manager.d.ts.map +1 -0
  184. package/dist/runs/manager.js +757 -0
  185. package/dist/runs/manager.js.map +1 -0
  186. package/dist/runs/session-runtime.d.ts +8 -0
  187. package/dist/runs/session-runtime.d.ts.map +1 -0
  188. package/dist/runs/session-runtime.js +291 -0
  189. package/dist/runs/session-runtime.js.map +1 -0
  190. package/dist/runs/types.d.ts +55 -0
  191. package/dist/runs/types.d.ts.map +1 -0
  192. package/dist/runs/types.js +2 -0
  193. package/dist/runs/types.js.map +1 -0
  194. package/dist/server.d.ts +15 -0
  195. package/dist/server.d.ts.map +1 -0
  196. package/dist/server.js +702 -0
  197. package/dist/server.js.map +1 -0
  198. package/dist/static/webui-server.d.ts +2 -0
  199. package/dist/static/webui-server.d.ts.map +1 -0
  200. package/dist/static/webui-server.js +97 -0
  201. package/dist/static/webui-server.js.map +1 -0
  202. package/package.json +68 -0
@@ -0,0 +1,585 @@
1
+ import { promises as fs } from "fs";
2
+ import path from "path";
3
+ /** Return true when err represents a "file/directory not found" filesystem error. */
4
+ function isNotFoundError(err) {
5
+ if (!(err instanceof Error))
6
+ return false;
7
+ const code = err.code;
8
+ return code === "ENOENT" || code === "ENOTDIR" || err.message.includes("ENOENT");
9
+ }
10
+ import { getConfig } from "./config-loader.js";
11
+ async function fileExists(filePath) {
12
+ try {
13
+ await fs.access(filePath);
14
+ return true;
15
+ }
16
+ catch (err) {
17
+ // ENOENT is expected for non-existent paths; warn on permission or other errors
18
+ if (!isNotFoundError(err)) {
19
+ console.warn(`[parser] Unexpected error checking existence of ${filePath}:`, err);
20
+ }
21
+ return false;
22
+ }
23
+ }
24
+ async function readJsonSafe(filePath, fallback) {
25
+ try {
26
+ const content = await fs.readFile(filePath, "utf-8");
27
+ return JSON.parse(content);
28
+ }
29
+ catch (err) {
30
+ // ENOENT is expected for optional files; warn on parse errors or permission issues
31
+ if (!isNotFoundError(err)) {
32
+ console.warn(`[parser] Failed to read/parse JSON from ${filePath}:`, err);
33
+ }
34
+ return fallback;
35
+ }
36
+ }
37
+ async function readTextSafe(filePath) {
38
+ try {
39
+ return await fs.readFile(filePath, "utf-8");
40
+ }
41
+ catch (err) {
42
+ // ENOENT is expected for optional log files; warn on permission or other errors
43
+ if (!isNotFoundError(err)) {
44
+ console.warn(`[parser] Failed to read text file ${filePath}:`, err);
45
+ }
46
+ return undefined;
47
+ }
48
+ }
49
+ /** Maximum concurrent filesystem operations to prevent file descriptor exhaustion. */
50
+ const BATCH_CONCURRENCY_LIMIT = 50;
51
+ /**
52
+ * Execute an array of async factory functions with a concurrency limit.
53
+ * Returns results in the same order as the input, using Promise.allSettled
54
+ * semantics so that individual failures don't crash the batch.
55
+ */
56
+ async function batchAllSettled(factories, limit = BATCH_CONCURRENCY_LIMIT) {
57
+ const results = new Array(factories.length);
58
+ let nextIndex = 0;
59
+ async function worker() {
60
+ while (nextIndex < factories.length) {
61
+ const idx = nextIndex++;
62
+ try {
63
+ const value = await factories[idx]();
64
+ results[idx] = { status: "fulfilled", value };
65
+ }
66
+ catch (reason) {
67
+ results[idx] = { status: "rejected", reason };
68
+ }
69
+ }
70
+ }
71
+ const workerCount = Math.min(limit, factories.length);
72
+ const workers = [];
73
+ for (let i = 0; i < workerCount; i++) {
74
+ workers.push(worker());
75
+ }
76
+ await Promise.all(workers);
77
+ return results;
78
+ }
79
+ // Normalize raw journal entry (which uses `data` and `recordedAt`) into our JournalEvent type
80
+ function normalizeJournalEvent(raw, filename) {
81
+ if (!raw || !raw.type)
82
+ return null;
83
+ // Parse seq and id from filename: "000001.ULID.json"
84
+ const parts = filename.replace(/\.json$/, "").split(".");
85
+ const seq = parseInt(parts[0], 10) || 0;
86
+ const id = parts[1] || "";
87
+ return {
88
+ seq,
89
+ id,
90
+ ts: raw.recordedAt || raw.ts || "",
91
+ type: raw.type,
92
+ payload: raw.data || raw.payload || {},
93
+ };
94
+ }
95
+ export async function parseJournalDir(journalPath) {
96
+ const result = await parseJournalDirIncremental(journalPath);
97
+ return result.events;
98
+ }
99
+ /**
100
+ * Incrementally parse a journal directory.
101
+ *
102
+ * When `previousEvents` and `previousFileCount` are supplied the function
103
+ * skips files that were already parsed in a previous call. If the
104
+ * directory now has *fewer* files than `previousFileCount` (truncation /
105
+ * rotation) the journal is re-read from scratch.
106
+ *
107
+ * @param journalPath Path to the journal directory.
108
+ * @param previousEvents Events returned by a prior call (used as base for merge).
109
+ * @param previousFileCount Number of JSON files that existed during the prior call.
110
+ * @returns Merged events array (sorted by seq) and the current file count.
111
+ */
112
+ export async function parseJournalDirIncremental(journalPath, previousEvents, previousFileCount) {
113
+ if (!(await fileExists(journalPath)))
114
+ return { events: [], fileCount: 0 };
115
+ const files = await fs.readdir(journalPath);
116
+ const jsonFiles = files.filter((f) => f.endsWith(".json")).sort();
117
+ const currentFileCount = jsonFiles.length;
118
+ // Determine whether we can do an incremental read.
119
+ // Incremental is possible when we have cached state AND the file count
120
+ // has not shrunk (truncation / rotation guard).
121
+ const canIncremental = previousEvents !== undefined &&
122
+ previousFileCount !== undefined &&
123
+ previousFileCount >= 0 &&
124
+ currentFileCount >= previousFileCount;
125
+ if (canIncremental) {
126
+ const newFilesStartIdx = previousFileCount;
127
+ // No new files — return the previous result as-is.
128
+ if (newFilesStartIdx >= currentFileCount) {
129
+ return { events: previousEvents, fileCount: currentFileCount };
130
+ }
131
+ const newFiles = jsonFiles.slice(newFilesStartIdx);
132
+ // Batch-read only the new files
133
+ const readFactories = newFiles.map((file) => () => readJsonSafe(path.join(journalPath, file), null));
134
+ const settled = await batchAllSettled(readFactories);
135
+ const newEvents = [];
136
+ for (let i = 0; i < newFiles.length; i++) {
137
+ const result = settled[i];
138
+ const raw = result.status === "fulfilled" ? result.value : null;
139
+ if (raw) {
140
+ const event = normalizeJournalEvent(raw, newFiles[i]);
141
+ if (event)
142
+ newEvents.push(event);
143
+ }
144
+ }
145
+ // Merge: previousEvents is already sorted; new events are appended and
146
+ // the full array is re-sorted to guarantee correctness.
147
+ const merged = [...previousEvents, ...newEvents].sort((a, b) => a.seq - b.seq);
148
+ return { events: merged, fileCount: currentFileCount };
149
+ }
150
+ // Full re-read (first call, or truncation detected).
151
+ const readFactories = jsonFiles.map((file) => () => readJsonSafe(path.join(journalPath, file), null));
152
+ const settled = await batchAllSettled(readFactories);
153
+ const events = [];
154
+ for (let i = 0; i < jsonFiles.length; i++) {
155
+ const result = settled[i];
156
+ const raw = result.status === "fulfilled" ? result.value : null;
157
+ if (raw) {
158
+ const event = normalizeJournalEvent(raw, jsonFiles[i]);
159
+ if (event)
160
+ events.push(event);
161
+ }
162
+ }
163
+ return { events: events.sort((a, b) => a.seq - b.seq), fileCount: currentFileCount };
164
+ }
165
+ export async function parseRunDir(runPath, incremental) {
166
+ const runJson = await readJsonSafe(path.join(runPath, "run.json"), {});
167
+ const journalResult = await parseJournalDirIncremental(path.join(runPath, "journal"), incremental?.previousEvents, incremental?.previousFileCount);
168
+ const events = journalResult.events;
169
+ // Extract run info from events
170
+ const runCreated = events.find((e) => e.type === "RUN_CREATED");
171
+ const runCompleted = events.find((e) => e.type === "RUN_COMPLETED");
172
+ const runFailed = events.find((e) => e.type === "RUN_FAILED");
173
+ const createdPayload = (runCreated?.payload ||
174
+ {});
175
+ // Build task map from events — first pass: collect all requested/resolved info
176
+ const taskMap = new Map();
177
+ const requestedPayloads = [];
178
+ for (const event of events) {
179
+ if (event.type === "EFFECT_REQUESTED") {
180
+ const p = event.payload;
181
+ requestedPayloads.push(p);
182
+ taskMap.set(p.effectId, {
183
+ effectId: p.effectId,
184
+ kind: p.kind,
185
+ title: p.label || p.taskId,
186
+ label: p.label || p.taskId,
187
+ status: "requested",
188
+ invocationKey: p.invocationKey,
189
+ stepId: p.stepId,
190
+ taskId: p.taskId,
191
+ requestedAt: event.ts,
192
+ });
193
+ }
194
+ if (event.type === "EFFECT_RESOLVED") {
195
+ const p = event.payload;
196
+ const task = taskMap.get(p.effectId);
197
+ if (task) {
198
+ task.status = p.status === "ok" ? "resolved" : "error";
199
+ task.resolvedAt = event.ts;
200
+ task.startedAt = p.startedAt;
201
+ task.finishedAt = p.finishedAt;
202
+ if (p.startedAt && p.finishedAt) {
203
+ task.duration =
204
+ new Date(p.finishedAt).getTime() -
205
+ new Date(p.startedAt).getTime();
206
+ }
207
+ if (p.error) {
208
+ task.error = {
209
+ name: p.error.name,
210
+ message: p.error.message,
211
+ stack: p.error.stack,
212
+ };
213
+ }
214
+ }
215
+ }
216
+ }
217
+ // Batch-read all task.json files in parallel for EFFECT_REQUESTED tasks
218
+ if (requestedPayloads.length > 0) {
219
+ const taskDefFactories = requestedPayloads.map((p) => () => readJsonSafe(path.join(runPath, "tasks", p.effectId, "task.json"), null));
220
+ const taskDefResults = await batchAllSettled(taskDefFactories);
221
+ for (let i = 0; i < requestedPayloads.length; i++) {
222
+ const p = requestedPayloads[i];
223
+ const result = taskDefResults[i];
224
+ const taskDef = result.status === "fulfilled" ? result.value : null;
225
+ if (taskDef) {
226
+ const task = taskMap.get(p.effectId);
227
+ task.title = taskDef.title || task.title;
228
+ if (taskDef.agent && typeof taskDef.agent === "object") {
229
+ const agentDef = taskDef.agent;
230
+ task.agent = {
231
+ name: agentDef.name || "unknown",
232
+ prompt: agentDef.prompt,
233
+ };
234
+ }
235
+ // Extract breakpoint question from inputs for breakpoint tasks
236
+ if (p.kind === "breakpoint") {
237
+ const inputs = taskDef.inputs;
238
+ if (inputs && typeof inputs.question === "string") {
239
+ task.breakpointQuestion = inputs.question;
240
+ }
241
+ }
242
+ }
243
+ }
244
+ }
245
+ const tasks = Array.from(taskMap.values());
246
+ const completedTasks = tasks.filter((t) => t.status === "resolved").length;
247
+ const failedTasks = tasks.filter((t) => t.status === "error").length;
248
+ // Task 1.2: Extract failed step name from the first task that resolved with error
249
+ const firstFailedTask = tasks.find((t) => t.status === "error");
250
+ const failedStep = firstFailedTask
251
+ ? firstFailedTask.title || firstFailedTask.label || firstFailedTask.stepId
252
+ : undefined;
253
+ // Extract failure details from RUN_FAILED event or last failed EFFECT_RESOLVED
254
+ let failureError;
255
+ let failureMessage;
256
+ if (runFailed) {
257
+ const failPayload = runFailed.payload;
258
+ const runError = failPayload.error;
259
+ if (runError) {
260
+ failureError = runError.name || "Error";
261
+ failureMessage = runError.message || runError.stack || undefined;
262
+ }
263
+ }
264
+ // If we still don't have a message, look at the last EFFECT_RESOLVED with error status
265
+ if (!failureMessage) {
266
+ const lastFailedEffect = [...events]
267
+ .reverse()
268
+ .find((e) => e.type === "EFFECT_RESOLVED" && e.payload.status === "error");
269
+ if (lastFailedEffect) {
270
+ const effectPayload = lastFailedEffect.payload;
271
+ const effectError = effectPayload.error;
272
+ if (effectError) {
273
+ failureError = failureError || effectError.name || "Error";
274
+ failureMessage = effectError.message || effectError.stack || undefined;
275
+ }
276
+ }
277
+ }
278
+ let status = "pending";
279
+ if (runCompleted)
280
+ status = "completed";
281
+ else if (runFailed)
282
+ status = "failed";
283
+ else if (tasks.some((t) => t.status === "requested"))
284
+ status = "waiting";
285
+ // Task 1.3: Extract breakpoint question from pending breakpoint tasks
286
+ let breakpointQuestion;
287
+ if (status === "waiting") {
288
+ const pendingBreakpoint = tasks.find((t) => t.kind === "breakpoint" && t.status === "requested");
289
+ if (pendingBreakpoint?.breakpointQuestion) {
290
+ breakpointQuestion = pendingBreakpoint.breakpointQuestion;
291
+ }
292
+ }
293
+ // Determine waitingKind: check the last requested (pending) task
294
+ let waitingKind;
295
+ if (status === "waiting") {
296
+ const requestedTasks = tasks.filter((t) => t.status === "requested");
297
+ const lastRequested = requestedTasks[requestedTasks.length - 1];
298
+ if (lastRequested) {
299
+ waitingKind = lastRequested.kind === "breakpoint" ? "breakpoint" : "task";
300
+ }
301
+ }
302
+ const createdAt = runCreated?.ts || "";
303
+ const lastEvent = events[events.length - 1];
304
+ let duration;
305
+ if (createdAt && (runCompleted || runFailed)) {
306
+ const endTs = (runCompleted || runFailed).ts;
307
+ duration = new Date(endTs).getTime() - new Date(createdAt).getTime();
308
+ }
309
+ else if (createdAt && lastEvent) {
310
+ duration =
311
+ new Date(lastEvent.ts).getTime() - new Date(createdAt).getTime();
312
+ }
313
+ // Detect staleness for waiting or pending runs
314
+ let isStale;
315
+ if (status === "waiting" || status === "pending") {
316
+ const updatedAtTs = lastEvent?.ts || createdAt;
317
+ if (updatedAtTs) {
318
+ const config = await getConfig();
319
+ const timeSinceUpdate = Date.now() - new Date(updatedAtTs).getTime();
320
+ if (timeSinceUpdate > config.staleThresholdMs) {
321
+ isStale = true;
322
+ }
323
+ }
324
+ }
325
+ // Detect orphaned runs: all tasks resolved but no terminal event
326
+ // (process likely crashed before writing RUN_COMPLETED)
327
+ if (status === "pending" && tasks.length > 0 && !tasks.some((t) => t.status === "requested")) {
328
+ isStale = true;
329
+ }
330
+ return {
331
+ runId: createdPayload.runId || path.basename(runPath),
332
+ processId: createdPayload.processId ||
333
+ runJson?.processId ||
334
+ "unknown",
335
+ status,
336
+ createdAt,
337
+ updatedAt: lastEvent?.ts || createdAt,
338
+ completedAt: (runCompleted || runFailed)?.ts,
339
+ tasks,
340
+ events,
341
+ totalTasks: tasks.length,
342
+ completedTasks,
343
+ failedTasks,
344
+ duration,
345
+ failedStep,
346
+ failureError,
347
+ failureMessage,
348
+ breakpointQuestion,
349
+ isStale,
350
+ waitingKind,
351
+ _journalFileCount: journalResult.fileCount,
352
+ };
353
+ }
354
+ export async function parseTaskDetail(runPath, effectId) {
355
+ const taskDir = path.join(runPath, "tasks", effectId);
356
+ if (!(await fileExists(taskDir)))
357
+ return null;
358
+ // Read all 5 task files + journal in parallel with Promise.allSettled
359
+ const [taskDefResult, inputResult, resultResult, stdoutResult, stderrResult, journalEventsResult,] = await Promise.allSettled([
360
+ readJsonSafe(path.join(taskDir, "task.json"), null),
361
+ readJsonSafe(path.join(taskDir, "input.json"), undefined),
362
+ readJsonSafe(path.join(taskDir, "result.json"), undefined),
363
+ readTextSafe(path.join(taskDir, "stdout.log")),
364
+ readTextSafe(path.join(taskDir, "stderr.log")),
365
+ parseJournalDir(path.join(runPath, "journal")),
366
+ ]);
367
+ const taskDef = taskDefResult.status === "fulfilled" ? taskDefResult.value : null;
368
+ const input = inputResult.status === "fulfilled" ? inputResult.value : undefined;
369
+ const result = resultResult.status === "fulfilled" ? resultResult.value : undefined;
370
+ const stdout = stdoutResult.status === "fulfilled" ? stdoutResult.value : undefined;
371
+ const stderr = stderrResult.status === "fulfilled" ? stderrResult.value : undefined;
372
+ const journalEvents = journalEventsResult.status === "fulfilled" ? journalEventsResult.value : [];
373
+ // Extract timing from result.json
374
+ const resultStartedAt = result?.startedAt;
375
+ const resultFinishedAt = result?.finishedAt;
376
+ const requestedEvent = journalEvents.find((e) => e.type === "EFFECT_REQUESTED" && e.payload.effectId === effectId);
377
+ const resolvedEvent = journalEvents.find((e) => e.type === "EFFECT_RESOLVED" && e.payload.effectId === effectId);
378
+ const requestedAt = requestedEvent?.ts || "";
379
+ const resolvedAt = resolvedEvent?.ts;
380
+ // Compute duration: prefer wall-clock time (requestedAt → resolvedAt) over
381
+ // startedAt/finishedAt which are often identical when set by task:post
382
+ let duration;
383
+ if (resultStartedAt && resultFinishedAt) {
384
+ const resultDuration = new Date(resultFinishedAt).getTime() - new Date(resultStartedAt).getTime();
385
+ // If result timestamps differ, use them; otherwise fall back to journal wall-clock
386
+ if (resultDuration > 0) {
387
+ duration = resultDuration;
388
+ }
389
+ else if (requestedAt && resolvedAt) {
390
+ duration = new Date(resolvedAt).getTime() - new Date(requestedAt).getTime();
391
+ }
392
+ else {
393
+ duration = 0;
394
+ }
395
+ }
396
+ else if (requestedAt && resolvedAt) {
397
+ duration = new Date(resolvedAt).getTime() - new Date(requestedAt).getTime();
398
+ }
399
+ // Use inputs from task.json if separate input.json doesn't exist
400
+ const resolvedInput = input ?? taskDef?.inputs;
401
+ // Extract breakpoint payload for breakpoint tasks
402
+ const kind = taskDef?.kind || "agent";
403
+ let breakpointPayload;
404
+ if (kind === "breakpoint" && resolvedInput) {
405
+ breakpointPayload = {
406
+ question: resolvedInput.question || "Approval required",
407
+ title: resolvedInput.title || taskDef?.title || "Breakpoint",
408
+ options: Array.isArray(resolvedInput.options) ? resolvedInput.options : undefined,
409
+ context: resolvedInput.context,
410
+ };
411
+ }
412
+ // Determine error status from result or journal
413
+ const resolvedPayload = resolvedEvent?.payload;
414
+ const isError = result
415
+ ? (result.status === "error")
416
+ : (resolvedPayload?.status === "error");
417
+ return {
418
+ effectId,
419
+ kind,
420
+ title: taskDef?.title || effectId,
421
+ label: taskDef?.title || effectId,
422
+ status: resolvedEvent ? (isError ? "error" : "resolved") : "requested",
423
+ invocationKey: taskDef?.invocationKey || "",
424
+ stepId: taskDef?.stepId || "",
425
+ taskId: taskDef?.taskId || "",
426
+ requestedAt,
427
+ resolvedAt,
428
+ startedAt: resultStartedAt,
429
+ finishedAt: resultFinishedAt,
430
+ duration,
431
+ input: resolvedInput,
432
+ result: result ?? undefined,
433
+ stdout,
434
+ stderr,
435
+ taskDef: taskDef ?? undefined,
436
+ breakpoint: breakpointPayload,
437
+ breakpointQuestion: breakpointPayload?.question,
438
+ };
439
+ }
440
+ export async function getRunDigest(runPath) {
441
+ const journalPath = path.join(runPath, "journal");
442
+ let latestSeq = 0;
443
+ let status = "pending";
444
+ let taskCount = 0;
445
+ let completedTasks = 0;
446
+ let updatedAt = "";
447
+ const requestedBreakpoints = new Set();
448
+ const resolvedEffects = new Set();
449
+ const breakpointEffectIds = new Set();
450
+ // Track requested effects and their kinds for waitingKind determination
451
+ const requestedEffects = [];
452
+ if (await fileExists(journalPath)) {
453
+ const files = await fs.readdir(journalPath);
454
+ const jsonFiles = files.filter((f) => f.endsWith(".json")).sort();
455
+ latestSeq = jsonFiles.length;
456
+ // Batch-read all journal files in parallel with concurrency limit
457
+ const readFactories = jsonFiles.map((file) => () => readJsonSafe(path.join(journalPath, file), null));
458
+ const settled = await batchAllSettled(readFactories);
459
+ // Process results sequentially to maintain event ordering for updatedAt
460
+ for (let i = 0; i < jsonFiles.length; i++) {
461
+ const result = settled[i];
462
+ const raw = result.status === "fulfilled" ? result.value : null;
463
+ if (!raw)
464
+ continue;
465
+ const event = normalizeJournalEvent(raw, jsonFiles[i]);
466
+ if (!event)
467
+ continue;
468
+ updatedAt = event.ts;
469
+ if (event.type === "EFFECT_REQUESTED") {
470
+ taskCount++;
471
+ const data = event.payload;
472
+ const effectId = data.effectId;
473
+ const kind = data.kind || "agent";
474
+ requestedEffects.push({ effectId, kind });
475
+ if (data.kind === "breakpoint") {
476
+ requestedBreakpoints.add(effectId);
477
+ breakpointEffectIds.add(effectId);
478
+ }
479
+ }
480
+ if (event.type === "EFFECT_RESOLVED") {
481
+ completedTasks++;
482
+ const data = event.payload;
483
+ resolvedEffects.add(data.effectId);
484
+ }
485
+ if (event.type === "RUN_COMPLETED")
486
+ status = "completed";
487
+ if (event.type === "RUN_FAILED")
488
+ status = "failed";
489
+ }
490
+ if (status === "pending" && taskCount > 0)
491
+ status = "waiting";
492
+ }
493
+ // Count pending breakpoints (requested but not yet resolved).
494
+ // Also check result.json — the dashboard writes it on approve but can't
495
+ // write journal events, so the journal alone may lag behind.
496
+ let pendingBreakpoints = 0;
497
+ if (requestedBreakpoints.size > 0) {
498
+ const unresolvedBps = [...requestedBreakpoints].filter((id) => !resolvedEffects.has(id));
499
+ if (unresolvedBps.length > 0) {
500
+ const resultChecks = await Promise.all(unresolvedBps.map((id) => readJsonSafe(path.join(runPath, "tasks", id, "result.json"), null)));
501
+ for (let i = 0; i < unresolvedBps.length; i++) {
502
+ if (resultChecks[i] && resultChecks[i].status === "ok") {
503
+ resolvedEffects.add(unresolvedBps[i]);
504
+ }
505
+ else {
506
+ pendingBreakpoints++;
507
+ }
508
+ }
509
+ }
510
+ }
511
+ // Extract breakpoint question and effectId from pending breakpoint tasks — batch-read all at once
512
+ let breakpointQuestion;
513
+ let breakpointEffectId;
514
+ if (status === "waiting" && breakpointEffectIds.size > 0) {
515
+ const pendingBpIds = [...breakpointEffectIds].filter((id) => !resolvedEffects.has(id));
516
+ if (pendingBpIds.length > 0) {
517
+ // Store the first pending breakpoint effectId regardless of question
518
+ breakpointEffectId = pendingBpIds[0];
519
+ const bpFactories = pendingBpIds.map((effectId) => () => readJsonSafe(path.join(runPath, "tasks", effectId, "task.json"), null));
520
+ const bpResults = await batchAllSettled(bpFactories);
521
+ // Use the first pending breakpoint question found
522
+ for (let i = 0; i < pendingBpIds.length; i++) {
523
+ const result = bpResults[i];
524
+ const taskDef = result.status === "fulfilled" ? result.value : null;
525
+ if (taskDef) {
526
+ const inputs = taskDef.inputs;
527
+ if (inputs && typeof inputs.question === "string") {
528
+ breakpointQuestion = inputs.question;
529
+ breakpointEffectId = pendingBpIds[i];
530
+ break;
531
+ }
532
+ }
533
+ }
534
+ }
535
+ }
536
+ // Determine waitingKind from the last requested (pending) effect
537
+ let waitingKind;
538
+ if (status === "waiting") {
539
+ // Find the last requested effect that hasn't been resolved
540
+ const pendingEffects = requestedEffects.filter((e) => !resolvedEffects.has(e.effectId));
541
+ const lastPending = pendingEffects[pendingEffects.length - 1];
542
+ if (lastPending) {
543
+ waitingKind = lastPending.kind === "breakpoint" ? "breakpoint" : "task";
544
+ }
545
+ }
546
+ // Detect staleness for waiting or pending runs
547
+ let isStale;
548
+ if (status === "waiting" || status === "pending") {
549
+ if (updatedAt) {
550
+ const config = await getConfig();
551
+ const timeSinceUpdate = Date.now() - new Date(updatedAt).getTime();
552
+ if (timeSinceUpdate > config.staleThresholdMs) {
553
+ isStale = true;
554
+ }
555
+ }
556
+ }
557
+ // Detect orphaned runs: all effects resolved but no terminal event
558
+ if (status === "waiting" && taskCount > 0 && completedTasks >= taskCount) {
559
+ isStale = true;
560
+ }
561
+ return {
562
+ runId: path.basename(runPath),
563
+ latestSeq,
564
+ status,
565
+ taskCount,
566
+ completedTasks,
567
+ updatedAt,
568
+ pendingBreakpoints,
569
+ breakpointQuestion,
570
+ breakpointEffectId,
571
+ isStale,
572
+ waitingKind,
573
+ };
574
+ }
575
+ export async function getRunIds(runsPath) {
576
+ if (!(await fileExists(runsPath)))
577
+ return [];
578
+ const entries = await fs.readdir(runsPath, { withFileTypes: true });
579
+ return entries
580
+ .filter((e) => e.isDirectory())
581
+ .map((e) => e.name)
582
+ .sort()
583
+ .reverse();
584
+ }
585
+ //# sourceMappingURL=parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parser.js","sourceRoot":"","sources":["../../../src/kanban/lib/parser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { type DiscoveredRun } from "./source-discovery.js";
2
+ export declare function findRunDir(runId: string): Promise<DiscoveredRun | null>;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"path-resolver.d.ts","sourceRoot":"","sources":["../../../src/kanban/lib/path-resolver.ts"],"names":[],"mappings":"AACA,OAAO,EAAgD,KAAK,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAKzG,wBAAsB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAS7E"}
@@ -0,0 +1,16 @@
1
+ import path from "path";
2
+ import { discoverAllRunDirs, invalidateDiscoveryCache } from "./source-discovery.js";
3
+ // Find a specific run directory by runId across all sources.
4
+ // On cache miss, invalidates the discovery cache and retries once
5
+ // to handle runs created after the last cache refresh.
6
+ export async function findRunDir(runId) {
7
+ const allRuns = await discoverAllRunDirs();
8
+ const found = allRuns.find((r) => path.basename(r.runDir) === runId);
9
+ if (found)
10
+ return found;
11
+ // Cache may be stale — force re-discovery and retry
12
+ invalidateDiscoveryCache();
13
+ const fresh = await discoverAllRunDirs();
14
+ return fresh.find((r) => path.basename(r.runDir) === runId) || null;
15
+ }
16
+ //# sourceMappingURL=path-resolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"path-resolver.js","sourceRoot":"","sources":["../../../src/kanban/lib/path-resolver.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,kBAAkB,EAAE,wBAAwB,EAAsB,MAAM,uBAAuB,CAAC;AAEzG,6DAA6D;AAC7D,kEAAkE;AAClE,uDAAuD;AACvD,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,KAAa;IAC5C,MAAM,OAAO,GAAG,MAAM,kBAAkB,EAAE,CAAC;IAC3C,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,KAAK,CAAC,CAAC;IACrE,IAAI,KAAK;QAAE,OAAO,KAAK,CAAC;IAExB,oDAAoD;IACpD,wBAAwB,EAAE,CAAC;IAC3B,MAAM,KAAK,GAAG,MAAM,kBAAkB,EAAE,CAAC;IACzC,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,KAAK,CAAC,IAAI,IAAI,CAAC;AACtE,CAAC"}