@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.
- package/README.md +20 -0
- package/dist/auth/bootstrap.d.ts +89 -0
- package/dist/auth/bootstrap.d.ts.map +1 -0
- package/dist/auth/bootstrap.js +222 -0
- package/dist/auth/bootstrap.js.map +1 -0
- package/dist/auth/hashing.d.ts +4 -0
- package/dist/auth/hashing.d.ts.map +1 -0
- package/dist/auth/hashing.js +27 -0
- package/dist/auth/hashing.js.map +1 -0
- package/dist/auth/middleware.d.ts +3 -0
- package/dist/auth/middleware.d.ts.map +1 -0
- package/dist/auth/middleware.js +17 -0
- package/dist/auth/middleware.js.map +1 -0
- package/dist/auth/tokens.d.ts +45 -0
- package/dist/auth/tokens.d.ts.map +1 -0
- package/dist/auth/tokens.js +186 -0
- package/dist/auth/tokens.js.map +1 -0
- package/dist/builtin-adapters.d.ts +17 -0
- package/dist/builtin-adapters.d.ts.map +1 -0
- package/dist/builtin-adapters.js +119 -0
- package/dist/builtin-adapters.js.map +1 -0
- package/dist/config.d.ts +37 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +97 -0
- package/dist/config.js.map +1 -0
- package/dist/fanout/client-conn.d.ts +20 -0
- package/dist/fanout/client-conn.d.ts.map +1 -0
- package/dist/fanout/client-conn.js +53 -0
- package/dist/fanout/client-conn.js.map +1 -0
- package/dist/fanout/subscriber.d.ts +12 -0
- package/dist/fanout/subscriber.d.ts.map +1 -0
- package/dist/fanout/subscriber.js +40 -0
- package/dist/fanout/subscriber.js.map +1 -0
- package/dist/index.d.ts +30 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +52 -0
- package/dist/index.js.map +1 -0
- package/dist/kanban/lib/config-loader.d.ts +29 -0
- package/dist/kanban/lib/config-loader.d.ts.map +1 -0
- package/dist/kanban/lib/config-loader.js +166 -0
- package/dist/kanban/lib/config-loader.js.map +1 -0
- package/dist/kanban/lib/config.d.ts +3 -0
- package/dist/kanban/lib/config.d.ts.map +1 -0
- package/dist/kanban/lib/config.js +6 -0
- package/dist/kanban/lib/config.js.map +1 -0
- package/dist/kanban/lib/create-global-registry.d.ts +28 -0
- package/dist/kanban/lib/create-global-registry.d.ts.map +1 -0
- package/dist/kanban/lib/create-global-registry.js +53 -0
- package/dist/kanban/lib/create-global-registry.js.map +1 -0
- package/dist/kanban/lib/dispatch-context-audit.d.ts +12 -0
- package/dist/kanban/lib/dispatch-context-audit.d.ts.map +1 -0
- package/dist/kanban/lib/dispatch-context-audit.js +44 -0
- package/dist/kanban/lib/dispatch-context-audit.js.map +1 -0
- package/dist/kanban/lib/error-handler.d.ts +28 -0
- package/dist/kanban/lib/error-handler.d.ts.map +1 -0
- package/dist/kanban/lib/error-handler.js +61 -0
- package/dist/kanban/lib/error-handler.js.map +1 -0
- package/dist/kanban/lib/global-registry.d.ts +49 -0
- package/dist/kanban/lib/global-registry.d.ts.map +1 -0
- package/dist/kanban/lib/global-registry.js +18 -0
- package/dist/kanban/lib/global-registry.js.map +1 -0
- package/dist/kanban/lib/parser.d.ts +36 -0
- package/dist/kanban/lib/parser.d.ts.map +1 -0
- package/dist/kanban/lib/parser.js +585 -0
- package/dist/kanban/lib/parser.js.map +1 -0
- package/dist/kanban/lib/path-resolver.d.ts +2 -0
- package/dist/kanban/lib/path-resolver.d.ts.map +1 -0
- package/dist/kanban/lib/path-resolver.js +16 -0
- package/dist/kanban/lib/path-resolver.js.map +1 -0
- package/dist/kanban/lib/review-service.d.ts +63 -0
- package/dist/kanban/lib/review-service.d.ts.map +1 -0
- package/dist/kanban/lib/review-service.js +571 -0
- package/dist/kanban/lib/review-service.js.map +1 -0
- package/dist/kanban/lib/run-cache.d.ts +36 -0
- package/dist/kanban/lib/run-cache.d.ts.map +1 -0
- package/dist/kanban/lib/run-cache.js +313 -0
- package/dist/kanban/lib/run-cache.js.map +1 -0
- package/dist/kanban/lib/server-init.d.ts +26 -0
- package/dist/kanban/lib/server-init.d.ts.map +1 -0
- package/dist/kanban/lib/server-init.js +179 -0
- package/dist/kanban/lib/server-init.js.map +1 -0
- package/dist/kanban/lib/services/automation-rule-service.d.ts +97 -0
- package/dist/kanban/lib/services/automation-rule-service.d.ts.map +1 -0
- package/dist/kanban/lib/services/automation-rule-service.js +806 -0
- package/dist/kanban/lib/services/automation-rule-service.js.map +1 -0
- package/dist/kanban/lib/services/automation-webhook-service.d.ts +44 -0
- package/dist/kanban/lib/services/automation-webhook-service.d.ts.map +1 -0
- package/dist/kanban/lib/services/automation-webhook-service.js +405 -0
- package/dist/kanban/lib/services/automation-webhook-service.js.map +1 -0
- package/dist/kanban/lib/services/backlog-query-service.d.ts +130 -0
- package/dist/kanban/lib/services/backlog-query-service.d.ts.map +1 -0
- package/dist/kanban/lib/services/backlog-query-service.js +1972 -0
- package/dist/kanban/lib/services/backlog-query-service.js.map +1 -0
- package/dist/kanban/lib/services/dispatch-context-label-service.d.ts +39 -0
- package/dist/kanban/lib/services/dispatch-context-label-service.d.ts.map +1 -0
- package/dist/kanban/lib/services/dispatch-context-label-service.js +160 -0
- package/dist/kanban/lib/services/dispatch-context-label-service.js.map +1 -0
- package/dist/kanban/lib/services/kanban-storage.d.ts +36 -0
- package/dist/kanban/lib/services/kanban-storage.d.ts.map +1 -0
- package/dist/kanban/lib/services/kanban-storage.js +26 -0
- package/dist/kanban/lib/services/kanban-storage.js.map +1 -0
- package/dist/kanban/lib/services/run-query-service.d.ts +79 -0
- package/dist/kanban/lib/services/run-query-service.d.ts.map +1 -0
- package/dist/kanban/lib/services/run-query-service.js +202 -0
- package/dist/kanban/lib/services/run-query-service.js.map +1 -0
- package/dist/kanban/lib/services/task-tag-service.d.ts +39 -0
- package/dist/kanban/lib/services/task-tag-service.d.ts.map +1 -0
- package/dist/kanban/lib/services/task-tag-service.js +145 -0
- package/dist/kanban/lib/services/task-tag-service.js.map +1 -0
- package/dist/kanban/lib/settings-section-storage.d.ts +13 -0
- package/dist/kanban/lib/settings-section-storage.d.ts.map +1 -0
- package/dist/kanban/lib/settings-section-storage.js +38 -0
- package/dist/kanban/lib/settings-section-storage.js.map +1 -0
- package/dist/kanban/lib/source-discovery.d.ts +10 -0
- package/dist/kanban/lib/source-discovery.d.ts.map +1 -0
- package/dist/kanban/lib/source-discovery.js +201 -0
- package/dist/kanban/lib/source-discovery.js.map +1 -0
- package/dist/kanban/lib/utils.d.ts +8 -0
- package/dist/kanban/lib/utils.d.ts.map +1 -0
- package/dist/kanban/lib/utils.js +116 -0
- package/dist/kanban/lib/utils.js.map +1 -0
- package/dist/kanban/lib/watcher.d.ts +14 -0
- package/dist/kanban/lib/watcher.d.ts.map +1 -0
- package/dist/kanban/lib/watcher.js +221 -0
- package/dist/kanban/lib/watcher.js.map +1 -0
- package/dist/kanban/lib/workspace-lifecycle.d.ts +68 -0
- package/dist/kanban/lib/workspace-lifecycle.d.ts.map +1 -0
- package/dist/kanban/lib/workspace-lifecycle.js +1085 -0
- package/dist/kanban/lib/workspace-lifecycle.js.map +1 -0
- package/dist/kanban/routes.d.ts +2 -0
- package/dist/kanban/routes.d.ts.map +1 -0
- package/dist/kanban/routes.js +1358 -0
- package/dist/kanban/routes.js.map +1 -0
- package/dist/kanban/types/breakpoint.d.ts +13 -0
- package/dist/kanban/types/breakpoint.d.ts.map +1 -0
- package/dist/kanban/types/breakpoint.js +3 -0
- package/dist/kanban/types/breakpoint.js.map +1 -0
- package/dist/kanban/types/index.d.ts +173 -0
- package/dist/kanban/types/index.d.ts.map +1 -0
- package/dist/kanban/types/index.js +3 -0
- package/dist/kanban/types/index.js.map +1 -0
- package/dist/logging.d.ts +7 -0
- package/dist/logging.d.ts.map +1 -0
- package/dist/logging.js +22 -0
- package/dist/logging.js.map +1 -0
- package/dist/notifications/types.d.ts +18 -0
- package/dist/notifications/types.d.ts.map +1 -0
- package/dist/notifications/types.js +2 -0
- package/dist/notifications/types.js.map +1 -0
- package/dist/notifications/webhook-out.d.ts +3 -0
- package/dist/notifications/webhook-out.d.ts.map +1 -0
- package/dist/notifications/webhook-out.js +55 -0
- package/dist/notifications/webhook-out.js.map +1 -0
- package/dist/pairing/short-code.d.ts +20 -0
- package/dist/pairing/short-code.d.ts.map +1 -0
- package/dist/pairing/short-code.js +50 -0
- package/dist/pairing/short-code.js.map +1 -0
- package/dist/protocol/errors.d.ts +10 -0
- package/dist/protocol/errors.d.ts.map +1 -0
- package/dist/protocol/errors.js +15 -0
- package/dist/protocol/errors.js.map +1 -0
- package/dist/protocol/frames.d.ts +107 -0
- package/dist/protocol/frames.d.ts.map +1 -0
- package/dist/protocol/frames.js +146 -0
- package/dist/protocol/frames.js.map +1 -0
- package/dist/protocol/v1.d.ts +111 -0
- package/dist/protocol/v1.d.ts.map +1 -0
- package/dist/protocol/v1.js +2 -0
- package/dist/protocol/v1.js.map +1 -0
- package/dist/runs/event-log-index.d.ts +29 -0
- package/dist/runs/event-log-index.d.ts.map +1 -0
- package/dist/runs/event-log-index.js +210 -0
- package/dist/runs/event-log-index.js.map +1 -0
- package/dist/runs/event-log.d.ts +25 -0
- package/dist/runs/event-log.d.ts.map +1 -0
- package/dist/runs/event-log.js +104 -0
- package/dist/runs/event-log.js.map +1 -0
- package/dist/runs/hook-broker.d.ts +18 -0
- package/dist/runs/hook-broker.d.ts.map +1 -0
- package/dist/runs/hook-broker.js +110 -0
- package/dist/runs/hook-broker.js.map +1 -0
- package/dist/runs/manager.d.ts +57 -0
- package/dist/runs/manager.d.ts.map +1 -0
- package/dist/runs/manager.js +757 -0
- package/dist/runs/manager.js.map +1 -0
- package/dist/runs/session-runtime.d.ts +8 -0
- package/dist/runs/session-runtime.d.ts.map +1 -0
- package/dist/runs/session-runtime.js +291 -0
- package/dist/runs/session-runtime.js.map +1 -0
- package/dist/runs/types.d.ts +55 -0
- package/dist/runs/types.d.ts.map +1 -0
- package/dist/runs/types.js +2 -0
- package/dist/runs/types.js.map +1 -0
- package/dist/server.d.ts +15 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +702 -0
- package/dist/server.js.map +1 -0
- package/dist/static/webui-server.d.ts +2 -0
- package/dist/static/webui-server.d.ts.map +1 -0
- package/dist/static/webui-server.js +97 -0
- package/dist/static/webui-server.js.map +1 -0
- 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 @@
|
|
|
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"}
|