@a5c-ai/adapters-gateway 5.1.1-staging.00ceebd28cf2
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 +753 -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 @@
|
|
|
1
|
+
{"version":3,"file":"review-service.js","sourceRoot":"","sources":["../../../src/kanban/lib/review-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import type { WatchSource } from "./config-loader.js";
|
|
2
|
+
import type { RunDigest, Run, ProjectSummary } from "../types/index.js";
|
|
3
|
+
export interface CachedRunDigest extends RunDigest {
|
|
4
|
+
processId: string;
|
|
5
|
+
sourceLabel?: string;
|
|
6
|
+
projectName?: string;
|
|
7
|
+
}
|
|
8
|
+
export declare function getDigestCached(runDir: string, source: WatchSource, projectName: string): Promise<CachedRunDigest>;
|
|
9
|
+
export declare function getRunCached(runDir: string, source: WatchSource, projectName: string): Promise<Run>;
|
|
10
|
+
export declare function invalidateRun(runDir: string): void;
|
|
11
|
+
/**
|
|
12
|
+
* Force-invalidate all cached entries that have pending breakpoints.
|
|
13
|
+
*
|
|
14
|
+
* Design note: this intentionally checks only `pendingBreakpoints > 0` without
|
|
15
|
+
* also requiring `waitingKind === "breakpoint"`. The broader condition is safer
|
|
16
|
+
* because it ensures *any* entry that might represent a breakpoint — even one
|
|
17
|
+
* whose waitingKind was not yet set by the parser — is evicted and refetched.
|
|
18
|
+
* `getProjectSummaries()` applies the stricter `waitingKind === "breakpoint"`
|
|
19
|
+
* filter when *counting* breakpoints for display, so the worst case of a
|
|
20
|
+
* broader eviction here is an extra cache miss, not a false positive in the UI.
|
|
21
|
+
*/
|
|
22
|
+
export declare function forceRefreshBreakpointRuns(): void;
|
|
23
|
+
export declare function invalidateAll(): void;
|
|
24
|
+
export declare function getProjectSummaries(): ProjectSummary[];
|
|
25
|
+
export declare function requestDiscovery(): void;
|
|
26
|
+
export declare function discoverAndCacheAll(): Promise<void>;
|
|
27
|
+
export declare function getAllCachedDigests(): CachedRunDigest[];
|
|
28
|
+
export declare function getCacheStats(): {
|
|
29
|
+
size: number;
|
|
30
|
+
entries: {
|
|
31
|
+
runDir: string;
|
|
32
|
+
status: import("../types/index.js").RunStatus;
|
|
33
|
+
cachedAt: number;
|
|
34
|
+
hasFullRun: boolean;
|
|
35
|
+
}[];
|
|
36
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-cache.d.ts","sourceRoot":"","sources":["../../../src/kanban/lib/run-cache.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAaxE,MAAM,WAAW,eAAgB,SAAQ,SAAS;IAChD,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAiFD,wBAAsB,eAAe,CACnC,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,WAAW,EACnB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,eAAe,CAAC,CAmC1B;AAED,wBAAsB,YAAY,CAChC,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,WAAW,EACnB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,GAAG,CAAC,CAoDd;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAElD;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,0BAA0B,IAAI,IAAI,CAOjD;AAED,wBAAgB,aAAa,IAAI,IAAI,CAIpC;AAED,wBAAgB,mBAAmB,IAAI,cAAc,EAAE,CAgFtD;AAQD,wBAAgB,gBAAgB,IAAI,IAAI,CAEvC;AAED,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC,CAuDzD;AAID,wBAAgB,mBAAmB,IAAI,eAAe,EAAE,CAOvD;AAGD,wBAAgB,aAAa;;;;;;;;EAW5B"}
|
|
@@ -0,0 +1,313 @@
|
|
|
1
|
+
import { getRunDigest, parseRunDir } from "./parser.js";
|
|
2
|
+
import { discoverAllRunDirs } from "./source-discovery.js";
|
|
3
|
+
import { promises as fs } from "fs";
|
|
4
|
+
import path from "path";
|
|
5
|
+
import { getGlobal } from "./global-registry.js";
|
|
6
|
+
/** Return true when err represents a "file/directory not found" filesystem error. */
|
|
7
|
+
function isNotFoundError(err) {
|
|
8
|
+
if (!(err instanceof Error))
|
|
9
|
+
return false;
|
|
10
|
+
const code = err.code;
|
|
11
|
+
return code === "ENOENT" || code === "ENOTDIR" || err.message.includes("ENOENT");
|
|
12
|
+
}
|
|
13
|
+
// Persist cache across HMR reloads via typed global registry
|
|
14
|
+
function getCache() {
|
|
15
|
+
return getGlobal('__kanban_run_cache__', () => new Map());
|
|
16
|
+
}
|
|
17
|
+
// Cache size limit to prevent unbounded memory growth
|
|
18
|
+
const MAX_CACHE_SIZE = 1000;
|
|
19
|
+
// TTL constants
|
|
20
|
+
const TTL_COMPLETED = 30000; // 30s for completed runs
|
|
21
|
+
const TTL_ACTIVE = 5000; // 5s for active runs (waiting/pending)
|
|
22
|
+
// Note: TTL_BREAKPOINT was removed in v0.12.3 — the aggressive 3s eviction
|
|
23
|
+
// in getProjectSummaries() caused breakpoint banner flickering during active
|
|
24
|
+
// orchestration (race condition with forceRefreshBreakpointRuns + discovery
|
|
25
|
+
// debounce). The normal TTL_ACTIVE (5s) is sufficient for timely updates.
|
|
26
|
+
function getTTL(status) {
|
|
27
|
+
return status === "waiting" || status === "pending" ? TTL_ACTIVE : TTL_COMPLETED;
|
|
28
|
+
}
|
|
29
|
+
function isCacheValid(entry) {
|
|
30
|
+
const now = Date.now();
|
|
31
|
+
const ttl = getTTL(entry.digest.status);
|
|
32
|
+
return now - entry.cachedAt < ttl;
|
|
33
|
+
}
|
|
34
|
+
// Evict oldest entries when cache exceeds MAX_CACHE_SIZE.
|
|
35
|
+
// Evicts expired entries first, then oldest by cachedAt if still over limit.
|
|
36
|
+
function evictIfNeeded() {
|
|
37
|
+
const cache = getCache();
|
|
38
|
+
if (cache.size <= MAX_CACHE_SIZE)
|
|
39
|
+
return;
|
|
40
|
+
// First pass: remove expired entries
|
|
41
|
+
const now = Date.now();
|
|
42
|
+
for (const [key, entry] of cache) {
|
|
43
|
+
if (now - entry.cachedAt >= getTTL(entry.digest.status)) {
|
|
44
|
+
cache.delete(key);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
if (cache.size <= MAX_CACHE_SIZE)
|
|
48
|
+
return;
|
|
49
|
+
// Second pass: evict oldest entries until under limit
|
|
50
|
+
const entries = Array.from(cache.entries()).sort(([, a], [, b]) => a.cachedAt - b.cachedAt);
|
|
51
|
+
const toRemove = cache.size - MAX_CACHE_SIZE;
|
|
52
|
+
for (let i = 0; i < toRemove; i++) {
|
|
53
|
+
cache.delete(entries[i][0]);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
// Read processId and optional projectName from run.json
|
|
57
|
+
async function getRunJsonMeta(runDir) {
|
|
58
|
+
try {
|
|
59
|
+
const runJsonPath = path.join(runDir, "run.json");
|
|
60
|
+
const content = await fs.readFile(runJsonPath, "utf-8");
|
|
61
|
+
const json = JSON.parse(content);
|
|
62
|
+
return {
|
|
63
|
+
processId: json.processId || "unknown",
|
|
64
|
+
projectName: json.projectName || undefined,
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
catch (err) {
|
|
68
|
+
// ENOENT is expected for runs that haven't written run.json yet; warn on corruption or permission errors
|
|
69
|
+
if (!isNotFoundError(err)) {
|
|
70
|
+
console.warn(`[run-cache] Failed to read run.json metadata from ${runDir}:`, err);
|
|
71
|
+
}
|
|
72
|
+
return { processId: "unknown" };
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
export async function getDigestCached(runDir, source, projectName) {
|
|
76
|
+
const cache = getCache();
|
|
77
|
+
const entry = cache.get(runDir);
|
|
78
|
+
// Return cached if valid
|
|
79
|
+
if (entry && isCacheValid(entry)) {
|
|
80
|
+
return entry.digest;
|
|
81
|
+
}
|
|
82
|
+
// Cache miss — fetch fresh digest
|
|
83
|
+
const digest = await getRunDigest(runDir);
|
|
84
|
+
const meta = await getRunJsonMeta(runDir);
|
|
85
|
+
// Prefer projectName from run.json over discovery-provided name
|
|
86
|
+
const effectiveProjectName = meta.projectName || projectName;
|
|
87
|
+
const cachedDigest = {
|
|
88
|
+
...digest,
|
|
89
|
+
processId: meta.processId,
|
|
90
|
+
sourceLabel: source.label,
|
|
91
|
+
projectName: effectiveProjectName,
|
|
92
|
+
};
|
|
93
|
+
// Update cache
|
|
94
|
+
cache.set(runDir, {
|
|
95
|
+
digest: cachedDigest,
|
|
96
|
+
cachedAt: Date.now(),
|
|
97
|
+
runDir,
|
|
98
|
+
fullRun: entry?.fullRun, // Preserve full run if present
|
|
99
|
+
journalFileCount: entry?.journalFileCount, // Preserve for incremental parsing
|
|
100
|
+
});
|
|
101
|
+
evictIfNeeded();
|
|
102
|
+
return cachedDigest;
|
|
103
|
+
}
|
|
104
|
+
export async function getRunCached(runDir, source, projectName) {
|
|
105
|
+
const cache = getCache();
|
|
106
|
+
const entry = cache.get(runDir);
|
|
107
|
+
// Return cached full run if valid and present
|
|
108
|
+
if (entry && isCacheValid(entry) && entry.fullRun) {
|
|
109
|
+
return entry.fullRun;
|
|
110
|
+
}
|
|
111
|
+
// Build incremental options from previous cache entry (if available).
|
|
112
|
+
// This avoids re-parsing all journal files when only new events have
|
|
113
|
+
// been appended since the last read.
|
|
114
|
+
const incremental = entry?.fullRun && entry.journalFileCount !== undefined
|
|
115
|
+
? {
|
|
116
|
+
previousEvents: entry.fullRun.events,
|
|
117
|
+
previousFileCount: entry.journalFileCount,
|
|
118
|
+
}
|
|
119
|
+
: undefined;
|
|
120
|
+
// Fetch full run (incrementally when possible)
|
|
121
|
+
const run = await parseRunDir(runDir, incremental);
|
|
122
|
+
// Extract the journal file count before stripping it from the Run object
|
|
123
|
+
const journalFileCount = run._journalFileCount;
|
|
124
|
+
// Read run.json meta for accurate projectName
|
|
125
|
+
const meta = await getRunJsonMeta(runDir);
|
|
126
|
+
const effectiveProjectName = meta.projectName || projectName;
|
|
127
|
+
// Enrich with metadata
|
|
128
|
+
const enrichedRun = {
|
|
129
|
+
...run,
|
|
130
|
+
sourceLabel: source.label,
|
|
131
|
+
projectName: effectiveProjectName,
|
|
132
|
+
};
|
|
133
|
+
// Remove internal field from the exposed Run object
|
|
134
|
+
delete enrichedRun._journalFileCount;
|
|
135
|
+
// Update cache with full run
|
|
136
|
+
const digest = await getDigestCached(runDir, source, projectName);
|
|
137
|
+
cache.set(runDir, {
|
|
138
|
+
digest,
|
|
139
|
+
cachedAt: Date.now(),
|
|
140
|
+
runDir,
|
|
141
|
+
fullRun: enrichedRun,
|
|
142
|
+
journalFileCount,
|
|
143
|
+
});
|
|
144
|
+
evictIfNeeded();
|
|
145
|
+
return enrichedRun;
|
|
146
|
+
}
|
|
147
|
+
export function invalidateRun(runDir) {
|
|
148
|
+
getCache().delete(runDir);
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Force-invalidate all cached entries that have pending breakpoints.
|
|
152
|
+
*
|
|
153
|
+
* Design note: this intentionally checks only `pendingBreakpoints > 0` without
|
|
154
|
+
* also requiring `waitingKind === "breakpoint"`. The broader condition is safer
|
|
155
|
+
* because it ensures *any* entry that might represent a breakpoint — even one
|
|
156
|
+
* whose waitingKind was not yet set by the parser — is evicted and refetched.
|
|
157
|
+
* `getProjectSummaries()` applies the stricter `waitingKind === "breakpoint"`
|
|
158
|
+
* filter when *counting* breakpoints for display, so the worst case of a
|
|
159
|
+
* broader eviction here is an extra cache miss, not a false positive in the UI.
|
|
160
|
+
*/
|
|
161
|
+
export function forceRefreshBreakpointRuns() {
|
|
162
|
+
const cache = getCache();
|
|
163
|
+
for (const [runDir, entry] of cache) {
|
|
164
|
+
if (entry.digest.pendingBreakpoints && entry.digest.pendingBreakpoints > 0) {
|
|
165
|
+
cache.delete(runDir);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
export function invalidateAll() {
|
|
170
|
+
getCache().clear();
|
|
171
|
+
lastDiscoveryTime = 0;
|
|
172
|
+
discoveryNeeded = true; // Force re-discovery on next request
|
|
173
|
+
}
|
|
174
|
+
export function getProjectSummaries() {
|
|
175
|
+
const cache = getCache();
|
|
176
|
+
// Build project summaries from cache entries.
|
|
177
|
+
// Breakpoint entries are only included when isCacheValid() passes (TTL_ACTIVE = 5s),
|
|
178
|
+
// which ensures stale breakpoint data is not displayed without destructively
|
|
179
|
+
// deleting cache entries (which caused flickering — see v0.12.3 fix).
|
|
180
|
+
const projectMap = new Map();
|
|
181
|
+
for (const entry of cache.values()) {
|
|
182
|
+
const projectName = entry.digest.projectName || "Unknown";
|
|
183
|
+
const existing = projectMap.get(projectName) || {
|
|
184
|
+
totalRuns: 0,
|
|
185
|
+
activeRuns: 0,
|
|
186
|
+
completedRuns: 0,
|
|
187
|
+
failedRuns: 0,
|
|
188
|
+
staleRuns: 0,
|
|
189
|
+
totalTasks: 0,
|
|
190
|
+
completedTasksAggregate: 0,
|
|
191
|
+
latestUpdate: "",
|
|
192
|
+
pendingBreakpoints: 0,
|
|
193
|
+
breakpointRuns: [],
|
|
194
|
+
};
|
|
195
|
+
existing.totalRuns++;
|
|
196
|
+
existing.totalTasks += entry.digest.taskCount || 0;
|
|
197
|
+
existing.completedTasksAggregate += entry.digest.completedTasks || 0;
|
|
198
|
+
if ((entry.digest.status === "waiting" || entry.digest.status === "pending") && !entry.digest.isStale) {
|
|
199
|
+
existing.activeRuns++;
|
|
200
|
+
}
|
|
201
|
+
else if (entry.digest.status === "completed") {
|
|
202
|
+
existing.completedRuns++;
|
|
203
|
+
}
|
|
204
|
+
else if (entry.digest.status === "failed") {
|
|
205
|
+
existing.failedRuns++;
|
|
206
|
+
}
|
|
207
|
+
if (entry.digest.isStale) {
|
|
208
|
+
existing.staleRuns++;
|
|
209
|
+
}
|
|
210
|
+
// Track pending breakpoints. Breakpoint state only changes when explicitly
|
|
211
|
+
// approved (which calls invalidateRun), so we always count cached breakpoints
|
|
212
|
+
// regardless of cache TTL — the TTL controls when to re-fetch data from disk,
|
|
213
|
+
// not whether the data is valid for display. Removing the isCacheValid check
|
|
214
|
+
// prevents breakpoint banner flickering when discovery is debounced. (v0.12.3)
|
|
215
|
+
if (entry.digest.pendingBreakpoints && entry.digest.pendingBreakpoints > 0 &&
|
|
216
|
+
entry.digest.waitingKind === "breakpoint") {
|
|
217
|
+
existing.pendingBreakpoints += entry.digest.pendingBreakpoints;
|
|
218
|
+
existing.breakpointRuns.push({
|
|
219
|
+
runId: entry.digest.runId,
|
|
220
|
+
effectId: entry.digest.breakpointEffectId || "",
|
|
221
|
+
projectName,
|
|
222
|
+
processId: entry.digest.processId || "unknown",
|
|
223
|
+
breakpointQuestion: entry.digest.breakpointQuestion || "Approval required",
|
|
224
|
+
});
|
|
225
|
+
}
|
|
226
|
+
// Track latest update
|
|
227
|
+
if (!existing.latestUpdate || entry.digest.updatedAt > existing.latestUpdate) {
|
|
228
|
+
existing.latestUpdate = entry.digest.updatedAt;
|
|
229
|
+
}
|
|
230
|
+
projectMap.set(projectName, existing);
|
|
231
|
+
}
|
|
232
|
+
return Array.from(projectMap.entries()).map(([projectName, stats]) => ({
|
|
233
|
+
projectName,
|
|
234
|
+
...stats,
|
|
235
|
+
}));
|
|
236
|
+
}
|
|
237
|
+
// Debounce discovery to avoid scanning filesystem on every poll
|
|
238
|
+
let lastDiscoveryTime = 0;
|
|
239
|
+
const DISCOVERY_DEBOUNCE_MS = 10000; // 10s — reduced from 60s to ensure new runs appear quickly
|
|
240
|
+
let discoveryNeeded = true; // Flag set by watcher when new runs detected
|
|
241
|
+
// Signal that new runs may exist (called by watcher)
|
|
242
|
+
export function requestDiscovery() {
|
|
243
|
+
discoveryNeeded = true;
|
|
244
|
+
}
|
|
245
|
+
export async function discoverAndCacheAll() {
|
|
246
|
+
const cache = getCache();
|
|
247
|
+
const now = Date.now();
|
|
248
|
+
// If cache is populated and no new runs detected, skip expensive filesystem scan
|
|
249
|
+
if (cache.size > 0 && !discoveryNeeded && now - lastDiscoveryTime < DISCOVERY_DEBOUNCE_MS) {
|
|
250
|
+
return;
|
|
251
|
+
}
|
|
252
|
+
lastDiscoveryTime = now;
|
|
253
|
+
discoveryNeeded = false;
|
|
254
|
+
const discovered = await discoverAllRunDirs();
|
|
255
|
+
// Deduplicate by run ID (basename) — discoverAllRunDirs already deduplicates
|
|
256
|
+
// by run ID preferring directories with run.json, but guard here too in case
|
|
257
|
+
// the same run ID somehow appears from different sources.
|
|
258
|
+
const seen = new Set();
|
|
259
|
+
const unique = discovered.filter((d) => {
|
|
260
|
+
const runId = path.basename(d.runDir);
|
|
261
|
+
if (seen.has(runId))
|
|
262
|
+
return false;
|
|
263
|
+
seen.add(runId);
|
|
264
|
+
return true;
|
|
265
|
+
});
|
|
266
|
+
// Build the set of valid runDir paths from discovery
|
|
267
|
+
const validRunDirs = new Set(unique.map((d) => d.runDir));
|
|
268
|
+
// Prune cache entries whose runDir is no longer in the discovered set.
|
|
269
|
+
// This removes ghost entries that were cached before dedup was applied
|
|
270
|
+
// (e.g. a duplicate run discovered at a different path).
|
|
271
|
+
for (const [runDir] of cache) {
|
|
272
|
+
if (!validRunDirs.has(runDir)) {
|
|
273
|
+
cache.delete(runDir);
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
// Pre-populate cache with digests in batches to avoid overwhelming filesystem
|
|
277
|
+
const BATCH_SIZE = 10;
|
|
278
|
+
for (let i = 0; i < unique.length; i += BATCH_SIZE) {
|
|
279
|
+
const batch = unique.slice(i, i + BATCH_SIZE);
|
|
280
|
+
await Promise.all(batch.map(async (discoveredRun) => {
|
|
281
|
+
try {
|
|
282
|
+
await getDigestCached(discoveredRun.runDir, discoveredRun.source, discoveredRun.projectName);
|
|
283
|
+
}
|
|
284
|
+
catch (err) {
|
|
285
|
+
console.error(`Failed to cache run ${discoveredRun.runDir}:`, err);
|
|
286
|
+
}
|
|
287
|
+
}));
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
// Return all cached digests without filesystem scanning.
|
|
291
|
+
// Used by the digest API for fast, non-blocking responses.
|
|
292
|
+
export function getAllCachedDigests() {
|
|
293
|
+
const cache = getCache();
|
|
294
|
+
const digests = [];
|
|
295
|
+
for (const entry of cache.values()) {
|
|
296
|
+
digests.push(entry.digest);
|
|
297
|
+
}
|
|
298
|
+
return digests;
|
|
299
|
+
}
|
|
300
|
+
// Export cache for debugging
|
|
301
|
+
export function getCacheStats() {
|
|
302
|
+
const cache = getCache();
|
|
303
|
+
return {
|
|
304
|
+
size: cache.size,
|
|
305
|
+
entries: Array.from(cache.entries()).map(([runDir, entry]) => ({
|
|
306
|
+
runDir,
|
|
307
|
+
status: entry.digest.status,
|
|
308
|
+
cachedAt: entry.cachedAt,
|
|
309
|
+
hasFullRun: !!entry.fullRun,
|
|
310
|
+
})),
|
|
311
|
+
};
|
|
312
|
+
}
|
|
313
|
+
//# sourceMappingURL=run-cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-cache.js","sourceRoot":"","sources":["../../../src/kanban/lib/run-cache.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { EventEmitter } from "events";
|
|
2
|
+
import { type WatcherEvent } from "./watcher.js";
|
|
3
|
+
export declare const serverEvents: EventEmitter<[never]>;
|
|
4
|
+
export declare const SSE_DEBOUNCE_MS = 500;
|
|
5
|
+
export interface BatchedRunChangedEvent {
|
|
6
|
+
type: "run-changed";
|
|
7
|
+
runIds: string[];
|
|
8
|
+
runDirs: string[];
|
|
9
|
+
}
|
|
10
|
+
export declare function resetDebounceState(): void;
|
|
11
|
+
/**
|
|
12
|
+
* Enqueue a run-changed event into the leading-edge debounce.
|
|
13
|
+
*
|
|
14
|
+
* Behaviour:
|
|
15
|
+
* 1. If no window is open, emit immediately (leading edge) and open window.
|
|
16
|
+
* 2. If window is already open, collect the runDir and reset the 500ms timer
|
|
17
|
+
* (trailing flush).
|
|
18
|
+
*/
|
|
19
|
+
export declare function enqueueRunChanged(event: WatcherEvent): void;
|
|
20
|
+
export declare function ensureInitialized(): Promise<void>;
|
|
21
|
+
export declare function shutdownServer(): Promise<void>;
|
|
22
|
+
export declare function getInitStatus(): {
|
|
23
|
+
initialized: boolean;
|
|
24
|
+
hasCleanup: boolean;
|
|
25
|
+
serverEventListeners: number;
|
|
26
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server-init.d.ts","sourceRoot":"","sources":["../../../src/kanban/lib/server-init.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EAA8B,KAAK,YAAY,EAAE,MAAM,cAAc,CAAC;AAS7E,eAAO,MAAM,YAAY,uBAAoB,CAAC;AAW9C,eAAO,MAAM,eAAe,MAAM,CAAC;AAEnC,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,aAAa,CAAC;IACpB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAkBD,wBAAgB,kBAAkB,IAAI,IAAI,CAMzC;AAoBD;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,YAAY,GAAG,IAAI,CA8B3D;AAiBD,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC,CAmEvD;AAGD,wBAAsB,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CAkBpD;AAGD,wBAAgB,aAAa;;;;EAO5B"}
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
import path from "path";
|
|
2
|
+
import { EventEmitter } from "events";
|
|
3
|
+
import { initWatcher, watcherEvents } from "./watcher.js";
|
|
4
|
+
import { discoverAndCacheAll } from "./run-cache.js";
|
|
5
|
+
import { getGlobal } from "./global-registry.js";
|
|
6
|
+
// Shared event bus for SSE endpoints — persist across HMR via typed global registry
|
|
7
|
+
function getServerEvents() {
|
|
8
|
+
return getGlobal('__kanban_server_events__', () => new EventEmitter());
|
|
9
|
+
}
|
|
10
|
+
export const serverEvents = getServerEvents();
|
|
11
|
+
// ---------------------------------------------------------------------------
|
|
12
|
+
// Leading-edge debounce for SSE broadcasts
|
|
13
|
+
// ---------------------------------------------------------------------------
|
|
14
|
+
// N clients x M rapid file changes = N*M redundant API requests. This
|
|
15
|
+
// debounce fires immediately on the *first* run-changed event (leading edge),
|
|
16
|
+
// then collects any subsequent events within a 500ms window and emits a
|
|
17
|
+
// single batched notification containing all affected runIds.
|
|
18
|
+
// ---------------------------------------------------------------------------
|
|
19
|
+
export const SSE_DEBOUNCE_MS = 500;
|
|
20
|
+
function getDebounceState() {
|
|
21
|
+
return getGlobal('__kanban_sse_debounce__', () => ({
|
|
22
|
+
pendingRunDirs: new Set(),
|
|
23
|
+
timer: null,
|
|
24
|
+
windowOpen: false,
|
|
25
|
+
}));
|
|
26
|
+
}
|
|
27
|
+
export function resetDebounceState() {
|
|
28
|
+
const ds = getDebounceState();
|
|
29
|
+
if (ds.timer)
|
|
30
|
+
clearTimeout(ds.timer);
|
|
31
|
+
ds.timer = null;
|
|
32
|
+
ds.pendingRunDirs.clear();
|
|
33
|
+
ds.windowOpen = false;
|
|
34
|
+
}
|
|
35
|
+
/** Flush the batch — emit a single event with all collected runIds. */
|
|
36
|
+
function flushBatch() {
|
|
37
|
+
const ds = getDebounceState();
|
|
38
|
+
const runDirs = Array.from(ds.pendingRunDirs);
|
|
39
|
+
ds.pendingRunDirs.clear();
|
|
40
|
+
ds.timer = null;
|
|
41
|
+
ds.windowOpen = false;
|
|
42
|
+
if (runDirs.length === 0)
|
|
43
|
+
return;
|
|
44
|
+
const runIds = runDirs.map((d) => path.basename(d));
|
|
45
|
+
serverEvents.emit("run-changed", {
|
|
46
|
+
type: "run-changed",
|
|
47
|
+
runIds,
|
|
48
|
+
runDirs,
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Enqueue a run-changed event into the leading-edge debounce.
|
|
53
|
+
*
|
|
54
|
+
* Behaviour:
|
|
55
|
+
* 1. If no window is open, emit immediately (leading edge) and open window.
|
|
56
|
+
* 2. If window is already open, collect the runDir and reset the 500ms timer
|
|
57
|
+
* (trailing flush).
|
|
58
|
+
*/
|
|
59
|
+
export function enqueueRunChanged(event) {
|
|
60
|
+
const ds = getDebounceState();
|
|
61
|
+
// Note: forceRefreshBreakpointRuns() was previously called here on every
|
|
62
|
+
// watcher event, but it deleted ALL breakpoint cache entries globally —
|
|
63
|
+
// causing banner flickering during active orchestration. The specific run
|
|
64
|
+
// is already invalidated by invalidateRun(runDir) in the watcher handlers,
|
|
65
|
+
// so broad cache clearing is unnecessary. (v0.12.3 fix)
|
|
66
|
+
if (!ds.windowOpen) {
|
|
67
|
+
// --- Leading edge: fire immediately for this single runDir ---
|
|
68
|
+
ds.windowOpen = true;
|
|
69
|
+
const runId = path.basename(event.runDir);
|
|
70
|
+
serverEvents.emit("run-changed", {
|
|
71
|
+
type: "run-changed",
|
|
72
|
+
runIds: [runId],
|
|
73
|
+
runDirs: [event.runDir],
|
|
74
|
+
});
|
|
75
|
+
// Open a 500ms collection window for subsequent events
|
|
76
|
+
ds.timer = setTimeout(flushBatch, SSE_DEBOUNCE_MS);
|
|
77
|
+
}
|
|
78
|
+
else {
|
|
79
|
+
// --- Inside window: collect and reset timer ---
|
|
80
|
+
ds.pendingRunDirs.add(event.runDir);
|
|
81
|
+
// Reset the trailing-edge timer so the window extends on each new event
|
|
82
|
+
if (ds.timer)
|
|
83
|
+
clearTimeout(ds.timer);
|
|
84
|
+
ds.timer = setTimeout(flushBatch, SSE_DEBOUNCE_MS);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
function getInitState() {
|
|
88
|
+
return getGlobal('__kanban_init__', () => ({
|
|
89
|
+
initialized: false,
|
|
90
|
+
initPromise: null,
|
|
91
|
+
cleanup: null,
|
|
92
|
+
}));
|
|
93
|
+
}
|
|
94
|
+
export async function ensureInitialized() {
|
|
95
|
+
const state = getInitState();
|
|
96
|
+
// Already initialized
|
|
97
|
+
if (state.initialized) {
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
// Initialization in progress
|
|
101
|
+
if (state.initPromise) {
|
|
102
|
+
return state.initPromise;
|
|
103
|
+
}
|
|
104
|
+
// Start initialization
|
|
105
|
+
state.initPromise = (async () => {
|
|
106
|
+
try {
|
|
107
|
+
console.log("Starting server initialization...");
|
|
108
|
+
// Step 1: Initialize watcher
|
|
109
|
+
console.log("Setting up filesystem watcher...");
|
|
110
|
+
state.cleanup = await initWatcher();
|
|
111
|
+
// Step 2: Initial cache population
|
|
112
|
+
console.log("Populating cache with discovered runs...");
|
|
113
|
+
await discoverAndCacheAll();
|
|
114
|
+
// Step 3: Listen to watcher events and broadcast via leading-edge debounce
|
|
115
|
+
// Watcher already invalidates the specific run cache in handleJournalChange.
|
|
116
|
+
// Additionally, when a journal change is detected, force-refresh all breakpoint
|
|
117
|
+
// cache entries. This ensures that EFFECT_RESOLVED events for breakpoints
|
|
118
|
+
// immediately clear stale breakpoint data across all cached runs — not just
|
|
119
|
+
// the specific run that changed.
|
|
120
|
+
//
|
|
121
|
+
// run-changed events are routed through enqueueRunChanged() which implements
|
|
122
|
+
// a 500ms leading-edge debounce: the first event fires immediately, then
|
|
123
|
+
// subsequent events within the window are batched and flushed once.
|
|
124
|
+
// Dedup window for transient watcher errors — suppress duplicates within 5s
|
|
125
|
+
// to prevent cascading SSE error events that trigger client-side flash
|
|
126
|
+
let lastWatcherErrorTime = 0;
|
|
127
|
+
const WATCHER_ERROR_DEDUP_MS = 5000;
|
|
128
|
+
watcherEvents.on("change", (event) => {
|
|
129
|
+
if (event.type === "run-changed") {
|
|
130
|
+
enqueueRunChanged(event);
|
|
131
|
+
}
|
|
132
|
+
else if (event.type === "new-run") {
|
|
133
|
+
serverEvents.emit("new-run", event);
|
|
134
|
+
}
|
|
135
|
+
else if (event.type === "error") {
|
|
136
|
+
// Suppress transient watcher errors within dedup window
|
|
137
|
+
const now = Date.now();
|
|
138
|
+
if (now - lastWatcherErrorTime >= WATCHER_ERROR_DEDUP_MS) {
|
|
139
|
+
lastWatcherErrorTime = now;
|
|
140
|
+
serverEvents.emit("watcher-error", event);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
});
|
|
144
|
+
state.initialized = true;
|
|
145
|
+
console.log("Server initialization complete");
|
|
146
|
+
}
|
|
147
|
+
catch (err) {
|
|
148
|
+
console.error("Server initialization failed:", err);
|
|
149
|
+
state.initPromise = null;
|
|
150
|
+
throw err;
|
|
151
|
+
}
|
|
152
|
+
})();
|
|
153
|
+
return state.initPromise;
|
|
154
|
+
}
|
|
155
|
+
// Cleanup function for graceful shutdown
|
|
156
|
+
export async function shutdownServer() {
|
|
157
|
+
const state = getInitState();
|
|
158
|
+
if (state.cleanup) {
|
|
159
|
+
state.cleanup();
|
|
160
|
+
state.cleanup = null;
|
|
161
|
+
}
|
|
162
|
+
state.initialized = false;
|
|
163
|
+
state.initPromise = null;
|
|
164
|
+
// Clear SSE debounce timers
|
|
165
|
+
resetDebounceState();
|
|
166
|
+
// Remove all event listeners
|
|
167
|
+
serverEvents.removeAllListeners();
|
|
168
|
+
console.log("Server shutdown complete");
|
|
169
|
+
}
|
|
170
|
+
// Get initialization status for debugging
|
|
171
|
+
export function getInitStatus() {
|
|
172
|
+
const state = getInitState();
|
|
173
|
+
return {
|
|
174
|
+
initialized: state.initialized,
|
|
175
|
+
hasCleanup: !!state.cleanup,
|
|
176
|
+
serverEventListeners: serverEvents.eventNames().length,
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
//# sourceMappingURL=server-init.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server-init.js","sourceRoot":"","sources":["../../../src/kanban/lib/server-init.ts"],"names":[],"mappings":"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"}
|