@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,166 @@
1
+ import { promises as fs } from "fs";
2
+ import path from "path";
3
+ import os from "os";
4
+ /** Return true when err represents a "file/directory not found" filesystem error. */
5
+ export function isNotFoundError(err) {
6
+ if (!(err instanceof Error))
7
+ return false;
8
+ const code = err.code;
9
+ return code === "ENOENT" || code === "ENOTDIR" || err.message.includes("ENOENT");
10
+ }
11
+ const DEFAULT_REGISTRY_PATH = path.join(os.homedir(), ".a5c", "kanban.json");
12
+ function getRegistryPath() {
13
+ if (process.env.KANBAN_REGISTRY) {
14
+ return process.env.KANBAN_REGISTRY;
15
+ }
16
+ return DEFAULT_REGISTRY_PATH;
17
+ }
18
+ async function loadRegistryFile(filePath) {
19
+ try {
20
+ const content = await fs.readFile(filePath, "utf-8");
21
+ const parsed = JSON.parse(content);
22
+ const sources = Array.isArray(parsed.sources)
23
+ ? parsed.sources.map((s) => ({
24
+ path: String(s.path || ""),
25
+ depth: typeof s.depth === "number" ? s.depth : 2,
26
+ label: s.label ? String(s.label) : undefined,
27
+ }))
28
+ : [];
29
+ return {
30
+ sources,
31
+ pollInterval: typeof parsed.pollInterval === "number" ? parsed.pollInterval : undefined,
32
+ theme: parsed.theme === "dark" || parsed.theme === "light" ? parsed.theme : undefined,
33
+ staleThresholdMs: typeof parsed.staleThresholdMs === "number" ? parsed.staleThresholdMs : undefined,
34
+ recentCompletionWindowMs: typeof parsed.recentCompletionWindowMs === "number" ? parsed.recentCompletionWindowMs : undefined,
35
+ retentionDays: typeof parsed.retentionDays === "number" ? parsed.retentionDays : undefined,
36
+ hiddenProjects: Array.isArray(parsed.hiddenProjects) ? parsed.hiddenProjects.filter((s) => typeof s === "string") : undefined,
37
+ };
38
+ }
39
+ catch (err) {
40
+ if (isNotFoundError(err)) {
41
+ return null;
42
+ }
43
+ throw err;
44
+ }
45
+ }
46
+ let cachedConfig = null;
47
+ let cacheTime = 0;
48
+ const CACHE_TTL = 10000; // 10s
49
+ // Invalidate the config cache (called after POST /api/config writes new values)
50
+ export function invalidateConfigCache() {
51
+ cachedConfig = null;
52
+ cacheTime = 0;
53
+ }
54
+ // Write config to the kanban registry file (~/.a5c/kanban.json by default).
55
+ export async function writeConfig(data) {
56
+ const registryPath = getRegistryPath();
57
+ const dir = path.dirname(registryPath);
58
+ await fs.mkdir(dir, { recursive: true });
59
+ // Read existing file to preserve any extra fields
60
+ let existing = {};
61
+ try {
62
+ const content = await fs.readFile(registryPath, "utf-8");
63
+ existing = JSON.parse(content);
64
+ }
65
+ catch (err) {
66
+ // Expected when writing config for the first time; warn if the file exists but is unreadable
67
+ if (!isNotFoundError(err)) {
68
+ console.warn(`[config] Failed to read existing config at ${registryPath} before merge:`, err);
69
+ }
70
+ }
71
+ const merged = {
72
+ ...existing,
73
+ sources: data.sources,
74
+ ...(data.pollInterval !== undefined ? { pollInterval: data.pollInterval } : {}),
75
+ ...(data.theme !== undefined ? { theme: data.theme } : {}),
76
+ ...(data.staleThresholdMs !== undefined ? { staleThresholdMs: data.staleThresholdMs } : {}),
77
+ ...(data.recentCompletionWindowMs !== undefined ? { recentCompletionWindowMs: data.recentCompletionWindowMs } : {}),
78
+ ...(data.retentionDays !== undefined ? { retentionDays: data.retentionDays } : {}),
79
+ ...(data.hiddenProjects !== undefined ? { hiddenProjects: data.hiddenProjects } : {}),
80
+ };
81
+ await fs.writeFile(registryPath, JSON.stringify(merged, null, 2) + "\n", "utf-8");
82
+ }
83
+ async function loadRegistry() {
84
+ try {
85
+ const registryPath = getRegistryPath();
86
+ const primary = await loadRegistryFile(registryPath);
87
+ if (primary) {
88
+ return primary;
89
+ }
90
+ return { sources: [] };
91
+ }
92
+ catch (err) {
93
+ if (!isNotFoundError(err)) {
94
+ console.warn(`[config] Failed to load registry from ${getRegistryPath()} — using defaults:`, err);
95
+ }
96
+ return { sources: [] };
97
+ }
98
+ }
99
+ function getDefaultSources() {
100
+ const sources = [];
101
+ // CLI flag via KANBAN_WATCH_DIR (set by src/cli.ts — defaults to user's cwd)
102
+ const cliWatchDir = process.env.KANBAN_WATCH_DIR;
103
+ if (cliWatchDir) {
104
+ sources.push({ path: cliWatchDir, depth: 3, label: "cli" });
105
+ }
106
+ // WATCH_DIR env (backwards-compatible single dir)
107
+ if (process.env.WATCH_DIR) {
108
+ sources.push({ path: process.env.WATCH_DIR, depth: 0, label: "env" });
109
+ }
110
+ // WATCH_DIRS env (comma-separated)
111
+ if (process.env.WATCH_DIRS) {
112
+ for (const dir of process.env.WATCH_DIRS.split(",")) {
113
+ const trimmed = dir.trim();
114
+ if (trimmed)
115
+ sources.push({ path: trimmed, depth: 2 });
116
+ }
117
+ }
118
+ // Default: parent of cwd — users typically run from inside a project dir
119
+ // but want to observe ALL sibling projects in the parent folder
120
+ if (sources.length === 0) {
121
+ sources.push({
122
+ path: path.resolve(process.cwd(), ".."),
123
+ depth: 3,
124
+ label: "parent",
125
+ });
126
+ }
127
+ return sources;
128
+ }
129
+ export async function getConfig() {
130
+ const now = Date.now();
131
+ if (cachedConfig && now - cacheTime < CACHE_TTL) {
132
+ return cachedConfig;
133
+ }
134
+ const registry = await loadRegistry();
135
+ const defaultSources = getDefaultSources();
136
+ // Merge: registry sources take priority, defaults as fallback
137
+ // Deduplicate sources by normalized path to prevent duplicate discovery
138
+ const rawSources = registry.sources.length > 0 ? registry.sources : defaultSources;
139
+ const seen = new Set();
140
+ const sources = rawSources.filter((s) => {
141
+ const normalized = path.resolve(s.path);
142
+ if (seen.has(normalized))
143
+ return false;
144
+ seen.add(normalized);
145
+ return true;
146
+ });
147
+ // Priority: registry file > env vars > defaults
148
+ const envPollInterval = process.env.KANBAN_POLL_INTERVAL || process.env.POLL_INTERVAL;
149
+ const envTheme = process.env.KANBAN_DEFAULT_THEME || process.env.THEME;
150
+ const envStaleThreshold = process.env.KANBAN_STALE_THRESHOLD_MS;
151
+ const envRecentWindow = process.env.KANBAN_RECENT_WINDOW_MS;
152
+ const envRetentionDays = process.env.KANBAN_RETENTION_DAYS;
153
+ cachedConfig = {
154
+ sources,
155
+ port: parseInt(process.env.KANBAN_PORT || process.env.PORT || "4800", 10),
156
+ pollInterval: registry.pollInterval ?? (envPollInterval ? parseInt(envPollInterval, 10) : 2000),
157
+ theme: registry.theme ?? (envTheme === "dark" || envTheme === "light" ? envTheme : "dark"),
158
+ staleThresholdMs: registry.staleThresholdMs ?? (envStaleThreshold ? parseInt(envStaleThreshold, 10) : 3600000),
159
+ recentCompletionWindowMs: registry.recentCompletionWindowMs ?? (envRecentWindow ? parseInt(envRecentWindow, 10) : 14400000),
160
+ retentionDays: registry.retentionDays ?? (envRetentionDays ? parseInt(envRetentionDays, 10) : 30),
161
+ hiddenProjects: registry.hiddenProjects ?? [],
162
+ };
163
+ cacheTime = now;
164
+ return cachedConfig;
165
+ }
166
+ //# sourceMappingURL=config-loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-loader.js","sourceRoot":"","sources":["../../../src/kanban/lib/config-loader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export { isNotFoundError, type WatchSource, type KanbanConfig, type ObserverConfig, invalidateConfigCache, writeConfig, getConfig, } from "./config-loader.js";
2
+ export { type DiscoveredRun, invalidateDiscoveryCache, discoverAllRunDirs, discoverAllRunsParentDirs, } from "./source-discovery.js";
3
+ export { findRunDir } from "./path-resolver.js";
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/kanban/lib/config.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,eAAe,EACf,KAAK,WAAW,EAChB,KAAK,YAAY,EACjB,KAAK,cAAc,EACnB,qBAAqB,EACrB,WAAW,EACX,SAAS,GACV,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EACL,KAAK,aAAa,EAClB,wBAAwB,EACxB,kBAAkB,EAClB,yBAAyB,GAC1B,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC"}
@@ -0,0 +1,6 @@
1
+ // Thin re-export facade — preserves backward compatibility for all existing
2
+ // import sites while the actual logic lives in focused modules.
3
+ export { isNotFoundError, invalidateConfigCache, writeConfig, getConfig, } from "./config-loader.js";
4
+ export { invalidateDiscoveryCache, discoverAllRunDirs, discoverAllRunsParentDirs, } from "./source-discovery.js";
5
+ export { findRunDir } from "./path-resolver.js";
6
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/kanban/lib/config.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAC5E,gEAAgE;AAEhE,OAAO,EACL,eAAe,EAIf,qBAAqB,EACrB,WAAW,EACX,SAAS,GACV,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EAEL,wBAAwB,EACxB,kBAAkB,EAClB,yBAAyB,GAC1B,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Generic globalThis registry factory.
3
+ *
4
+ * Provides type-safe, HMR-resilient accessors for global state. Each caller
5
+ * supplies its own registry-map interface and namespace key so multiple
6
+ * registries (kanban, observer, etc.) can coexist without collision.
7
+ *
8
+ * CANONICAL SOURCE: packages/adapters/webui/src/lib/create-global-registry.ts
9
+ * Keep this copy in sync.
10
+ */
11
+ /**
12
+ * Create a set of typed accessors for a `globalThis`-backed registry.
13
+ *
14
+ * @typeParam TMap - Interface mapping string keys to their concrete types.
15
+ * @param namespaceKey - The key on `globalThis` used to store the registry
16
+ * (e.g. `"__kanban_registry__"` or `"__observer_registry__"`).
17
+ */
18
+ export declare function createGlobalRegistry<TMap extends object>(namespaceKey: string): {
19
+ /**
20
+ * Return an HMR-safe global value, lazily initialising it via `factory`
21
+ * on first access.
22
+ */
23
+ getGlobal<K extends keyof TMap & string>(key: K, factory: () => TMap[K]): TMap[K];
24
+ /** Clear a single key from the global registry. */
25
+ clearGlobal<K extends keyof TMap & string>(key: K): void;
26
+ /** Clear the entire global registry. */
27
+ clearAllGlobals(): void;
28
+ };
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-global-registry.d.ts","sourceRoot":"","sources":["../../../src/kanban/lib/create-global-registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,SAAS,MAAM,EACtD,YAAY,EAAE,MAAM;IAalB;;;OAGG;cACO,CAAC,SAAS,MAAM,IAAI,GAAG,MAAM,OAChC,CAAC,WACG,MAAM,IAAI,CAAC,CAAC,CAAC,GACrB,IAAI,CAAC,CAAC,CAAC;IAQV,mDAAmD;gBACvC,CAAC,SAAS,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,GAAG,IAAI;IAQxD,wCAAwC;uBACrB,IAAI;EAK1B"}
@@ -0,0 +1,53 @@
1
+ /**
2
+ * Generic globalThis registry factory.
3
+ *
4
+ * Provides type-safe, HMR-resilient accessors for global state. Each caller
5
+ * supplies its own registry-map interface and namespace key so multiple
6
+ * registries (kanban, observer, etc.) can coexist without collision.
7
+ *
8
+ * CANONICAL SOURCE: packages/adapters/webui/src/lib/create-global-registry.ts
9
+ * Keep this copy in sync.
10
+ */
11
+ /**
12
+ * Create a set of typed accessors for a `globalThis`-backed registry.
13
+ *
14
+ * @typeParam TMap - Interface mapping string keys to their concrete types.
15
+ * @param namespaceKey - The key on `globalThis` used to store the registry
16
+ * (e.g. `"__kanban_registry__"` or `"__observer_registry__"`).
17
+ */
18
+ export function createGlobalRegistry(namespaceKey) {
19
+ function registryRef() {
20
+ const g = globalThis;
21
+ if (!g[namespaceKey]) {
22
+ g[namespaceKey] = {};
23
+ }
24
+ return g[namespaceKey];
25
+ }
26
+ return {
27
+ /**
28
+ * Return an HMR-safe global value, lazily initialising it via `factory`
29
+ * on first access.
30
+ */
31
+ getGlobal(key, factory) {
32
+ const registry = registryRef();
33
+ if (registry[key] === undefined) {
34
+ registry[key] = factory();
35
+ }
36
+ return registry[key];
37
+ },
38
+ /** Clear a single key from the global registry. */
39
+ clearGlobal(key) {
40
+ const g = globalThis;
41
+ const registry = g[namespaceKey];
42
+ if (registry) {
43
+ delete registry[key];
44
+ }
45
+ },
46
+ /** Clear the entire global registry. */
47
+ clearAllGlobals() {
48
+ const g = globalThis;
49
+ g[namespaceKey] = undefined;
50
+ },
51
+ };
52
+ }
53
+ //# sourceMappingURL=create-global-registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-global-registry.js","sourceRoot":"","sources":["../../../src/kanban/lib/create-global-registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH;;;;;;GAMG;AACH,MAAM,UAAU,oBAAoB,CAClC,YAAoB;IAIpB,SAAS,WAAW;QAClB,MAAM,CAAC,GAAG,UAAqC,CAAC;QAChD,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,EAAE,CAAC;YACrB,CAAC,CAAC,YAAY,CAAC,GAAG,EAAgB,CAAC;QACrC,CAAC;QACD,OAAO,CAAC,CAAC,YAAY,CAAe,CAAC;IACvC,CAAC;IAED,OAAO;QACL;;;WAGG;QACH,SAAS,CACP,GAAM,EACN,OAAsB;YAEtB,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;YAC/B,IAAI,QAAQ,CAAC,GAAG,CAAC,KAAK,SAAS,EAAE,CAAC;gBAChC,QAAQ,CAAC,GAAG,CAAC,GAAG,OAAO,EAAE,CAAC;YAC5B,CAAC;YACD,OAAO,QAAQ,CAAC,GAAG,CAAY,CAAC;QAClC,CAAC;QAED,mDAAmD;QACnD,WAAW,CAAgC,GAAM;YAC/C,MAAM,CAAC,GAAG,UAAqC,CAAC;YAChD,MAAM,QAAQ,GAAG,CAAC,CAAC,YAAY,CAA2B,CAAC;YAC3D,IAAI,QAAQ,EAAE,CAAC;gBACb,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC;YACvB,CAAC;QACH,CAAC;QAED,wCAAwC;QACxC,eAAe;YACb,MAAM,CAAC,GAAG,UAAqC,CAAC;YAChD,CAAC,CAAC,YAAY,CAAC,GAAG,SAAS,CAAC;QAC9B,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,12 @@
1
+ import type { KanbanBacklogSnapshot, KanbanDispatchContextExecutionEnvelope } from "@a5c-ai/comm-adapter/kanban";
2
+ export interface DispatchContextAuditRecord {
3
+ readonly issueId: string;
4
+ readonly issueKey: string;
5
+ readonly issueTitle: string;
6
+ readonly runIds: readonly string[];
7
+ readonly sessionIds: readonly string[];
8
+ readonly lastDispatchedAt?: string;
9
+ readonly executionContext: KanbanDispatchContextExecutionEnvelope;
10
+ }
11
+ export declare function findDispatchContextAuditsByRunId(snapshot: KanbanBacklogSnapshot | null | undefined, runId: string): DispatchContextAuditRecord[];
12
+ export declare function findDispatchContextAuditsBySessionId(snapshot: KanbanBacklogSnapshot | null | undefined, sessionId: string): DispatchContextAuditRecord[];
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dispatch-context-audit.d.ts","sourceRoot":"","sources":["../../../src/kanban/lib/dispatch-context-audit.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,qBAAqB,EACrB,sCAAsC,EAEvC,MAAM,6BAA6B,CAAC;AAErC,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,QAAQ,CAAC,UAAU,EAAE,SAAS,MAAM,EAAE,CAAC;IACvC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,gBAAgB,EAAE,sCAAsC,CAAC;CACnE;AA4BD,wBAAgB,gCAAgC,CAC9C,QAAQ,EAAE,qBAAqB,GAAG,IAAI,GAAG,SAAS,EAClD,KAAK,EAAE,MAAM,GACZ,0BAA0B,EAAE,CAW9B;AAED,wBAAgB,oCAAoC,CAClD,QAAQ,EAAE,qBAAqB,GAAG,IAAI,GAAG,SAAS,EAClD,SAAS,EAAE,MAAM,GAChB,0BAA0B,EAAE,CAW9B"}
@@ -0,0 +1,44 @@
1
+ function compareAuditRecords(left, right) {
2
+ const leftTimestamp = Date.parse(left.lastDispatchedAt ?? "");
3
+ const rightTimestamp = Date.parse(right.lastDispatchedAt ?? "");
4
+ return ((Number.isFinite(rightTimestamp) ? rightTimestamp : 0) - (Number.isFinite(leftTimestamp) ? leftTimestamp : 0) ||
5
+ right.runIds.length - left.runIds.length ||
6
+ left.issueKey.localeCompare(right.issueKey));
7
+ }
8
+ function toAuditRecord(issue) {
9
+ if (!issue.dispatch.executionContext) {
10
+ return null;
11
+ }
12
+ return {
13
+ issueId: issue.id,
14
+ issueKey: issue.key,
15
+ issueTitle: issue.title,
16
+ runIds: issue.dispatch.runIds,
17
+ sessionIds: issue.dispatch.sessionIds,
18
+ lastDispatchedAt: issue.dispatch.lastDispatchedAt,
19
+ executionContext: issue.dispatch.executionContext,
20
+ };
21
+ }
22
+ export function findDispatchContextAuditsByRunId(snapshot, runId) {
23
+ if (!snapshot || !runId) {
24
+ return [];
25
+ }
26
+ return snapshot.issues
27
+ .flatMap((issue) => {
28
+ const audit = toAuditRecord(issue);
29
+ return audit && audit.runIds.includes(runId) ? [audit] : [];
30
+ })
31
+ .sort(compareAuditRecords);
32
+ }
33
+ export function findDispatchContextAuditsBySessionId(snapshot, sessionId) {
34
+ if (!snapshot || !sessionId) {
35
+ return [];
36
+ }
37
+ return snapshot.issues
38
+ .flatMap((issue) => {
39
+ const audit = toAuditRecord(issue);
40
+ return audit && audit.sessionIds.includes(sessionId) ? [audit] : [];
41
+ })
42
+ .sort(compareAuditRecords);
43
+ }
44
+ //# sourceMappingURL=dispatch-context-audit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dispatch-context-audit.js","sourceRoot":"","sources":["../../../src/kanban/lib/dispatch-context-audit.ts"],"names":[],"mappings":"AAgBA,SAAS,mBAAmB,CAAC,IAAgC,EAAE,KAAiC;IAC9F,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,gBAAgB,IAAI,EAAE,CAAC,CAAC;IAC9D,MAAM,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,gBAAgB,IAAI,EAAE,CAAC,CAAC;IAChE,OAAO,CACL,CAAC,MAAM,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7G,KAAK,CAAC,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM;QACxC,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,QAAQ,CAAC,CAC5C,CAAC;AACJ,CAAC;AAED,SAAS,aAAa,CAAC,KAAkB;IACvC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,gBAAgB,EAAE,CAAC;QACrC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO;QACL,OAAO,EAAE,KAAK,CAAC,EAAE;QACjB,QAAQ,EAAE,KAAK,CAAC,GAAG;QACnB,UAAU,EAAE,KAAK,CAAC,KAAK;QACvB,MAAM,EAAE,KAAK,CAAC,QAAQ,CAAC,MAAM;QAC7B,UAAU,EAAE,KAAK,CAAC,QAAQ,CAAC,UAAU;QACrC,gBAAgB,EAAE,KAAK,CAAC,QAAQ,CAAC,gBAAgB;QACjD,gBAAgB,EAAE,KAAK,CAAC,QAAQ,CAAC,gBAAgB;KAClD,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,gCAAgC,CAC9C,QAAkD,EAClD,KAAa;IAEb,IAAI,CAAC,QAAQ,IAAI,CAAC,KAAK,EAAE,CAAC;QACxB,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,OAAO,QAAQ,CAAC,MAAM;SACnB,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;QACjB,MAAM,KAAK,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;QACnC,OAAO,KAAK,IAAI,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC9D,CAAC,CAAC;SACD,IAAI,CAAC,mBAAmB,CAAC,CAAC;AAC/B,CAAC;AAED,MAAM,UAAU,oCAAoC,CAClD,QAAkD,EAClD,SAAiB;IAEjB,IAAI,CAAC,QAAQ,IAAI,CAAC,SAAS,EAAE,CAAC;QAC5B,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,OAAO,QAAQ,CAAC,MAAM;SACnB,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;QACjB,MAAM,KAAK,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;QACnC,OAAO,KAAK,IAAI,KAAK,CAAC,UAAU,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACtE,CAAC,CAAC;SACD,IAAI,CAAC,mBAAmB,CAAC,CAAC;AAC/B,CAAC"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Centralized error handling utilities.
3
+ *
4
+ * - `AppError` – typed error with HTTP status and machine-readable code.
5
+ * - `normalizeError` – converts any thrown value (Error, string, object,
6
+ * undefined, etc.) into a consistent `{ message, code, status }` shape
7
+ * safe for API responses (never leaks stack traces).
8
+ */
9
+ export declare class AppError extends Error {
10
+ readonly code: string;
11
+ readonly status: number;
12
+ constructor(message: string, code: string, status: number);
13
+ }
14
+ export interface NormalizedError {
15
+ message: string;
16
+ code: string;
17
+ status: number;
18
+ }
19
+ /**
20
+ * Convert any thrown value into a consistent error shape.
21
+ *
22
+ * - `AppError` → preserves code & status.
23
+ * - Standard `Error` → maps common system errors (ENOENT, EACCES, ENOTDIR)
24
+ * to appropriate HTTP status codes; defaults to 500.
25
+ * - `string` → wraps as 500 internal error.
26
+ * - Anything else (null, undefined, number, object) → generic 500.
27
+ */
28
+ export declare function normalizeError(err: unknown): NormalizedError;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"error-handler.d.ts","sourceRoot":"","sources":["../../../src/kanban/lib/error-handler.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,qBAAa,QAAS,SAAQ,KAAK;IACjC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;gBAEZ,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;CAS1D;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,OAAO,GAAG,eAAe,CAoC5D"}
@@ -0,0 +1,61 @@
1
+ /**
2
+ * Centralized error handling utilities.
3
+ *
4
+ * - `AppError` – typed error with HTTP status and machine-readable code.
5
+ * - `normalizeError` – converts any thrown value (Error, string, object,
6
+ * undefined, etc.) into a consistent `{ message, code, status }` shape
7
+ * safe for API responses (never leaks stack traces).
8
+ */
9
+ export class AppError extends Error {
10
+ code;
11
+ status;
12
+ constructor(message, code, status) {
13
+ super(message);
14
+ this.name = "AppError";
15
+ this.code = code;
16
+ this.status = status;
17
+ // Fix prototype chain for instanceof checks (TS class extending Error)
18
+ Object.setPrototypeOf(this, AppError.prototype);
19
+ }
20
+ }
21
+ /**
22
+ * Convert any thrown value into a consistent error shape.
23
+ *
24
+ * - `AppError` → preserves code & status.
25
+ * - Standard `Error` → maps common system errors (ENOENT, EACCES, ENOTDIR)
26
+ * to appropriate HTTP status codes; defaults to 500.
27
+ * - `string` → wraps as 500 internal error.
28
+ * - Anything else (null, undefined, number, object) → generic 500.
29
+ */
30
+ export function normalizeError(err) {
31
+ // Already a well-typed AppError
32
+ if (err instanceof AppError) {
33
+ return { message: err.message, code: err.code, status: err.status };
34
+ }
35
+ // Standard Error (or subclass)
36
+ if (err instanceof Error) {
37
+ const nodeErr = err;
38
+ // Map common Node.js filesystem error codes
39
+ if (nodeErr.code === "ENOENT") {
40
+ return { message: "Resource not found", code: "NOT_FOUND", status: 404 };
41
+ }
42
+ if (nodeErr.code === "EACCES" || nodeErr.code === "EPERM") {
43
+ return { message: "Permission denied", code: "PERMISSION_DENIED", status: 403 };
44
+ }
45
+ if (nodeErr.code === "ENOTDIR" || nodeErr.code === "EISDIR") {
46
+ return { message: "Invalid resource path", code: "INVALID_PATH", status: 400 };
47
+ }
48
+ // SyntaxError from JSON.parse
49
+ if (err instanceof SyntaxError) {
50
+ return { message: "Failed to parse data", code: "PARSE_ERROR", status: 400 };
51
+ }
52
+ return { message: err.message || "Internal server error", code: "INTERNAL_ERROR", status: 500 };
53
+ }
54
+ // Plain string throw
55
+ if (typeof err === "string") {
56
+ return { message: err, code: "INTERNAL_ERROR", status: 500 };
57
+ }
58
+ // Anything else (null, undefined, number, object without Error prototype)
59
+ return { message: "An unexpected error occurred", code: "UNKNOWN_ERROR", status: 500 };
60
+ }
61
+ //# sourceMappingURL=error-handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"error-handler.js","sourceRoot":"","sources":["../../../src/kanban/lib/error-handler.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,MAAM,OAAO,QAAS,SAAQ,KAAK;IACxB,IAAI,CAAS;IACb,MAAM,CAAS;IAExB,YAAY,OAAe,EAAE,IAAY,EAAE,MAAc;QACvD,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC;QACvB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QAErB,uEAAuE;QACvE,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,QAAQ,CAAC,SAAS,CAAC,CAAC;IAClD,CAAC;CACF;AAQD;;;;;;;;GAQG;AACH,MAAM,UAAU,cAAc,CAAC,GAAY;IACzC,gCAAgC;IAChC,IAAI,GAAG,YAAY,QAAQ,EAAE,CAAC;QAC5B,OAAO,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC;IACtE,CAAC;IAED,+BAA+B;IAC/B,IAAI,GAAG,YAAY,KAAK,EAAE,CAAC;QACzB,MAAM,OAAO,GAAG,GAA4B,CAAC;QAE7C,4CAA4C;QAC5C,IAAI,OAAO,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC9B,OAAO,EAAE,OAAO,EAAE,oBAAoB,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;QAC3E,CAAC;QACD,IAAI,OAAO,CAAC,IAAI,KAAK,QAAQ,IAAI,OAAO,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YAC1D,OAAO,EAAE,OAAO,EAAE,mBAAmB,EAAE,IAAI,EAAE,mBAAmB,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;QAClF,CAAC;QACD,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS,IAAI,OAAO,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC5D,OAAO,EAAE,OAAO,EAAE,uBAAuB,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;QACjF,CAAC;QAED,8BAA8B;QAC9B,IAAI,GAAG,YAAY,WAAW,EAAE,CAAC;YAC/B,OAAO,EAAE,OAAO,EAAE,sBAAsB,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;QAC/E,CAAC;QAED,OAAO,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,IAAI,uBAAuB,EAAE,IAAI,EAAE,gBAAgB,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;IAClG,CAAC;IAED,qBAAqB;IACrB,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QAC5B,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,gBAAgB,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;IAC/D,CAAC;IAED,0EAA0E;IAC1E,OAAO,EAAE,OAAO,EAAE,8BAA8B,EAAE,IAAI,EAAE,eAAe,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;AACzF,CAAC"}
@@ -0,0 +1,49 @@
1
+ /**
2
+ * Typed GlobalRegistry for the kanban (adapters gateway) namespace.
3
+ *
4
+ * Built on the generic {@link createGlobalRegistry} factory to avoid
5
+ * duplicating accessor logic across packages.
6
+ *
7
+ * CANONICAL REGISTRY MAP: packages/adapters/webui/src/lib/global-registry.ts
8
+ * This file mirrors the same GlobalRegistryMap and namespace key.
9
+ */
10
+ import type { EventEmitter } from "events";
11
+ import type { FSWatcher } from "fs";
12
+ /**
13
+ * Maps each globalThis key to its concrete runtime type.
14
+ *
15
+ * Every module that needs HMR-safe global state registers its key + type here
16
+ * so the accessor can enforce type safety without `any` casts.
17
+ */
18
+ export interface GlobalRegistryMap {
19
+ /** run-cache.ts — Map of runDir to CacheEntry */
20
+ __kanban_run_cache__: Map<string, unknown>;
21
+ /** watcher.ts — shared EventEmitter for watcher change events */
22
+ __kanban_watcher_events__: EventEmitter;
23
+ /** watcher.ts — active FSWatcher instances + debounce timers */
24
+ __kanban_watchers__: {
25
+ activeWatchers: Map<string, FSWatcher>;
26
+ debounceTimers: Map<string, NodeJS.Timeout>;
27
+ rescanTimer: NodeJS.Timeout | null;
28
+ };
29
+ /** server-init.ts — shared EventEmitter for SSE server events */
30
+ __kanban_server_events__: EventEmitter;
31
+ /** server-init.ts — leading-edge debounce state for SSE broadcasts */
32
+ __kanban_sse_debounce__: {
33
+ pendingRunDirs: Set<string>;
34
+ timer: ReturnType<typeof setTimeout> | null;
35
+ windowOpen: boolean;
36
+ };
37
+ /** server-init.ts — initialization state (singleton guard) */
38
+ __kanban_init__: {
39
+ initialized: boolean;
40
+ initPromise: Promise<void> | null;
41
+ cleanup: (() => void) | null;
42
+ };
43
+ }
44
+ declare global {
45
+ var __kanban_registry__: Partial<GlobalRegistryMap> | undefined;
46
+ }
47
+ export declare const getGlobal: <K extends "__kanban_run_cache__" | "__kanban_watcher_events__" | "__kanban_watchers__" | "__kanban_server_events__" | "__kanban_sse_debounce__" | "__kanban_init__">(key: K, factory: () => GlobalRegistryMap[K]) => GlobalRegistryMap[K];
48
+ export declare const clearGlobal: <K extends "__kanban_run_cache__" | "__kanban_watcher_events__" | "__kanban_watchers__" | "__kanban_server_events__" | "__kanban_sse_debounce__" | "__kanban_init__">(key: K) => void;
49
+ export declare const clearAllGlobals: () => void;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"global-registry.d.ts","sourceRoot":"","sources":["../../../src/kanban/lib/global-registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAC3C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AAQpC;;;;;GAKG;AACH,MAAM,WAAW,iBAAiB;IAChC,iDAAiD;IACjD,oBAAoB,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAE3C,iEAAiE;IACjE,yBAAyB,EAAE,YAAY,CAAC;IAExC,gEAAgE;IAChE,mBAAmB,EAAE;QACnB,cAAc,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;QACvC,cAAc,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;QAC5C,WAAW,EAAE,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC;KACpC,CAAC;IAEF,iEAAiE;IACjE,wBAAwB,EAAE,YAAY,CAAC;IAEvC,sEAAsE;IACtE,uBAAuB,EAAE;QACvB,cAAc,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;QAC5B,KAAK,EAAE,UAAU,CAAC,OAAO,UAAU,CAAC,GAAG,IAAI,CAAC;QAC5C,UAAU,EAAE,OAAO,CAAC;KACrB,CAAC;IAEF,8DAA8D;IAC9D,eAAe,EAAE;QACf,WAAW,EAAE,OAAO,CAAC;QACrB,WAAW,EAAE,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;QAClC,OAAO,EAAE,CAAC,MAAM,IAAI,CAAC,GAAG,IAAI,CAAC;KAC9B,CAAC;CACH;AAMD,OAAO,CAAC,MAAM,CAAC;IAEb,IAAI,mBAAmB,EAAE,OAAO,CAAC,iBAAiB,CAAC,GAAG,SAAS,CAAC;CACjE;AAQD,eAAO,MAAM,SAAS,4OAAqB,CAAC;AAC5C,eAAO,MAAM,WAAW,uLAAuB,CAAC;AAChD,eAAO,MAAM,eAAe,YAA2B,CAAC"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Typed GlobalRegistry for the kanban (adapters gateway) namespace.
3
+ *
4
+ * Built on the generic {@link createGlobalRegistry} factory to avoid
5
+ * duplicating accessor logic across packages.
6
+ *
7
+ * CANONICAL REGISTRY MAP: packages/adapters/webui/src/lib/global-registry.ts
8
+ * This file mirrors the same GlobalRegistryMap and namespace key.
9
+ */
10
+ import { createGlobalRegistry } from "./create-global-registry.js";
11
+ // ---------------------------------------------------------------------------
12
+ // 3. Typed accessors — the only public API.
13
+ // ---------------------------------------------------------------------------
14
+ const registry = createGlobalRegistry("__kanban_registry__");
15
+ export const getGlobal = registry.getGlobal;
16
+ export const clearGlobal = registry.clearGlobal;
17
+ export const clearAllGlobals = registry.clearAllGlobals;
18
+ //# sourceMappingURL=global-registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"global-registry.js","sourceRoot":"","sources":["../../../src/kanban/lib/global-registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AAsDnE,8EAA8E;AAC9E,4CAA4C;AAC5C,8EAA8E;AAE9E,MAAM,QAAQ,GAAG,oBAAoB,CAAoB,qBAAqB,CAAC,CAAC;AAEhF,MAAM,CAAC,MAAM,SAAS,GAAG,QAAQ,CAAC,SAAS,CAAC;AAC5C,MAAM,CAAC,MAAM,WAAW,GAAG,QAAQ,CAAC,WAAW,CAAC;AAChD,MAAM,CAAC,MAAM,eAAe,GAAG,QAAQ,CAAC,eAAe,CAAC"}
@@ -0,0 +1,36 @@
1
+ import type { Run, JournalEvent, TaskDetail, RunDigest } from "../types/index.js";
2
+ /** Result of an incremental journal parse. */
3
+ export interface IncrementalJournalResult {
4
+ events: JournalEvent[];
5
+ /** Number of JSON files in the journal directory after this parse. */
6
+ fileCount: number;
7
+ }
8
+ export declare function parseJournalDir(journalPath: string): Promise<JournalEvent[]>;
9
+ /**
10
+ * Incrementally parse a journal directory.
11
+ *
12
+ * When `previousEvents` and `previousFileCount` are supplied the function
13
+ * skips files that were already parsed in a previous call. If the
14
+ * directory now has *fewer* files than `previousFileCount` (truncation /
15
+ * rotation) the journal is re-read from scratch.
16
+ *
17
+ * @param journalPath Path to the journal directory.
18
+ * @param previousEvents Events returned by a prior call (used as base for merge).
19
+ * @param previousFileCount Number of JSON files that existed during the prior call.
20
+ * @returns Merged events array (sorted by seq) and the current file count.
21
+ */
22
+ export declare function parseJournalDirIncremental(journalPath: string, previousEvents?: JournalEvent[], previousFileCount?: number): Promise<IncrementalJournalResult>;
23
+ /** Options for incremental run parsing. */
24
+ export interface IncrementalRunOptions {
25
+ previousEvents?: JournalEvent[];
26
+ previousFileCount?: number;
27
+ }
28
+ /** Extended Run result that includes the journal file count for caching. */
29
+ export interface ParseRunResult extends Run {
30
+ /** Number of journal files parsed — used by the cache layer for incremental reads. */
31
+ _journalFileCount: number;
32
+ }
33
+ export declare function parseRunDir(runPath: string, incremental?: IncrementalRunOptions): Promise<ParseRunResult>;
34
+ export declare function parseTaskDetail(runPath: string, effectId: string): Promise<TaskDetail | null>;
35
+ export declare function getRunDigest(runPath: string): Promise<RunDigest>;
36
+ export declare function getRunIds(runsPath: string): Promise<string[]>;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../../../src/kanban/lib/parser.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EACV,GAAG,EAEH,YAAY,EAEZ,UAAU,EAEV,SAAS,EAIV,MAAM,mBAAmB,CAAC;AA+F3B,8CAA8C;AAC9C,MAAM,WAAW,wBAAwB;IACvC,MAAM,EAAE,YAAY,EAAE,CAAC;IACvB,sEAAsE;IACtE,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,wBAAsB,eAAe,CACnC,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,YAAY,EAAE,CAAC,CAGzB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,0BAA0B,CAC9C,WAAW,EAAE,MAAM,EACnB,cAAc,CAAC,EAAE,YAAY,EAAE,EAC/B,iBAAiB,CAAC,EAAE,MAAM,GACzB,OAAO,CAAC,wBAAwB,CAAC,CAmEnC;AAED,2CAA2C;AAC3C,MAAM,WAAW,qBAAqB;IACpC,cAAc,CAAC,EAAE,YAAY,EAAE,CAAC;IAChC,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,4EAA4E;AAC5E,MAAM,WAAW,cAAe,SAAQ,GAAG;IACzC,sFAAsF;IACtF,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAED,wBAAsB,WAAW,CAC/B,OAAO,EAAE,MAAM,EACf,WAAW,CAAC,EAAE,qBAAqB,GAClC,OAAO,CAAC,cAAc,CAAC,CA6NzB;AAED,wBAAsB,eAAe,CACnC,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAqG5B;AAED,wBAAsB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAmKtE;AAED,wBAAsB,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAQnE"}