@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,202 @@
1
+ import { getConfig as defaultGetConfig } from "../config-loader.js";
2
+ import { discoverAllRunDirs as defaultDiscoverAllRunDirs } from "../source-discovery.js";
3
+ import { getProjectSummaries as defaultGetProjectSummaries, getRunCached as defaultGetRunCached, discoverAndCacheAll as defaultDiscoverAndCacheAll, } from "../run-cache.js";
4
+ // ---------------------------------------------------------------------------
5
+ // Shared utilities
6
+ // ---------------------------------------------------------------------------
7
+ /**
8
+ * Returns a numeric sort priority for a run:
9
+ * 0 = Active non-stale (waiting/pending where !isStale)
10
+ * 1 = Stale runs (isStale === true)
11
+ * 2 = Failed runs
12
+ * 3 = Completed runs
13
+ */
14
+ export function runSortPriority(run) {
15
+ const isActive = run.status === "waiting" || run.status === "pending";
16
+ if (isActive && !run.isStale)
17
+ return 0;
18
+ if (run.isStale)
19
+ return 1;
20
+ if (run.status === "failed")
21
+ return 2;
22
+ return 3;
23
+ }
24
+ /** Sort runs in-place based on the chosen sort mode.
25
+ *
26
+ * Uses runId as a final tiebreaker to guarantee deterministic ordering
27
+ * even when multiple runs share the same priority and updatedAt timestamp.
28
+ * This prevents list items from visually jumping positions during rapid
29
+ * updates (the "morning chaos" scenario).
30
+ */
31
+ export function sortRuns(runs, sort) {
32
+ if (sort === "activity") {
33
+ // Simple updatedAt DESC -- most recent activity first, no tier grouping.
34
+ // runId tiebreaker ensures stable order for runs with identical timestamps.
35
+ runs.sort((a, b) => {
36
+ const cmp = (b.updatedAt || "").localeCompare(a.updatedAt || "");
37
+ if (cmp !== 0)
38
+ return cmp;
39
+ return a.runId.localeCompare(b.runId);
40
+ });
41
+ }
42
+ else {
43
+ // Default: sort by priority tier, then by updatedAt DESC within tier,
44
+ // with runId as a final tiebreaker for deterministic ordering.
45
+ runs.sort((a, b) => {
46
+ const pa = runSortPriority(a);
47
+ const pb = runSortPriority(b);
48
+ if (pa !== pb)
49
+ return pa - pb;
50
+ const cmp = (b.updatedAt || "").localeCompare(a.updatedAt || "");
51
+ if (cmp !== 0)
52
+ return cmp;
53
+ return a.runId.localeCompare(b.runId);
54
+ });
55
+ }
56
+ }
57
+ /** Apply search filter -- returns a new array. */
58
+ export function filterBySearch(runs, search) {
59
+ if (!search)
60
+ return runs;
61
+ const searchLower = search.toLowerCase();
62
+ return runs.filter((r) => r.runId.toLowerCase().includes(searchLower) ||
63
+ r.processId.toLowerCase().includes(searchLower) ||
64
+ (r.projectName || "").toLowerCase().includes(searchLower) ||
65
+ r.status.toLowerCase().includes(searchLower) ||
66
+ r.tasks.some((t) => t.title.toLowerCase().includes(searchLower) ||
67
+ t.label.toLowerCase().includes(searchLower) ||
68
+ (t.error?.message || "").toLowerCase().includes(searchLower) ||
69
+ (t.error?.name || "").toLowerCase().includes(searchLower)));
70
+ }
71
+ /** Apply status filter -- returns a new array. */
72
+ export function filterByStatus(runs, status) {
73
+ if (!status)
74
+ return runs;
75
+ return runs.filter((r) => {
76
+ if (status === "waiting")
77
+ return r.status === "waiting" || r.status === "pending";
78
+ return r.status === status;
79
+ });
80
+ }
81
+ /** Apply retention filter -- keeps active/stale runs regardless of age. */
82
+ export function filterByRetention(runs, retentionDays) {
83
+ const retentionCutoff = Date.now() - retentionDays * 24 * 60 * 60 * 1000;
84
+ return runs.filter((r) => {
85
+ const isActive = r.status === "waiting" || r.status === "pending" || r.isStale;
86
+ if (isActive)
87
+ return true;
88
+ return new Date(r.updatedAt || "").getTime() >= retentionCutoff;
89
+ });
90
+ }
91
+ /** Paginate an array: returns a new slice. */
92
+ export function paginate(items, offset, limit) {
93
+ if (limit > 0) {
94
+ return items.slice(offset, offset + limit);
95
+ }
96
+ return items;
97
+ }
98
+ /** Strip events from runs to reduce payload. */
99
+ export function toLightRuns(runs) {
100
+ return runs.map(({ events, ...rest }) => ({
101
+ ...rest,
102
+ events: [],
103
+ totalEvents: events.length,
104
+ }));
105
+ }
106
+ const defaultDeps = {
107
+ getConfig: defaultGetConfig,
108
+ discoverAllRunDirs: defaultDiscoverAllRunDirs,
109
+ getProjectSummaries: defaultGetProjectSummaries,
110
+ getRunCached: defaultGetRunCached,
111
+ discoverAndCacheAll: defaultDiscoverAndCacheAll,
112
+ };
113
+ // ---------------------------------------------------------------------------
114
+ // RunQueryService
115
+ // ---------------------------------------------------------------------------
116
+ export class RunQueryService {
117
+ deps;
118
+ constructor(deps) {
119
+ this.deps = { ...defaultDeps, ...deps };
120
+ }
121
+ /**
122
+ * Mode: "projects" -- return lightweight project summaries.
123
+ * Always re-discovers to ensure all projects appear (debounced internally).
124
+ */
125
+ async listProjects(_params) {
126
+ await this.deps.discoverAndCacheAll();
127
+ const config = await this.deps.getConfig();
128
+ const projects = this.deps.getProjectSummaries();
129
+ // Filter out hidden projects
130
+ const hiddenSet = new Set(config.hiddenProjects);
131
+ const visibleProjects = projects.filter((p) => !hiddenSet.has(p.projectName));
132
+ // Apply retention filter: exclude projects whose latest update is older than retentionDays
133
+ const retentionCutoff = Date.now() - config.retentionDays * 24 * 60 * 60 * 1000;
134
+ const retainedProjects = visibleProjects.filter((p) =>
135
+ // Always keep projects with active or stale runs regardless of age
136
+ p.activeRuns > 0 ||
137
+ p.staleRuns > 0 ||
138
+ new Date(p.latestUpdate).getTime() >= retentionCutoff);
139
+ // Sort projects: active runs first, then by latest update, with
140
+ // projectName tiebreaker for deterministic ordering during rapid updates.
141
+ retainedProjects.sort((a, b) => {
142
+ if (a.activeRuns > 0 && b.activeRuns === 0)
143
+ return -1;
144
+ if (a.activeRuns === 0 && b.activeRuns > 0)
145
+ return 1;
146
+ const cmp = b.latestUpdate.localeCompare(a.latestUpdate);
147
+ if (cmp !== 0)
148
+ return cmp;
149
+ return a.projectName.localeCompare(b.projectName);
150
+ });
151
+ return {
152
+ projects: retainedProjects,
153
+ recentCompletionWindowMs: config.recentCompletionWindowMs,
154
+ };
155
+ }
156
+ /**
157
+ * Mode: "project" -- return paginated runs for a specific project.
158
+ */
159
+ async listProjectRuns(params) {
160
+ const { project, sort, status, search, limit, offset } = params;
161
+ const config = await this.deps.getConfig();
162
+ const allRuns = await this.deps.discoverAllRunDirs();
163
+ // Use cached runs for better performance
164
+ const runs = await Promise.all(allRuns
165
+ .filter((r) => r.projectName === project)
166
+ .map(async ({ runDir, source, projectName }) => {
167
+ return await this.deps.getRunCached(runDir, source, projectName);
168
+ }));
169
+ // Apply retention, sort, status filter, search, paginate
170
+ let filtered = filterByRetention(runs, config.retentionDays);
171
+ sortRuns(filtered, sort);
172
+ filtered = filterByStatus(filtered, status);
173
+ filtered = filterBySearch(filtered, search);
174
+ const totalCount = filtered.length;
175
+ const page = paginate(filtered, offset, limit);
176
+ return {
177
+ runs: toLightRuns(page),
178
+ totalCount,
179
+ project,
180
+ };
181
+ }
182
+ /**
183
+ * Default mode -- return all runs with totalCount.
184
+ */
185
+ async listAllRuns(params) {
186
+ const { sort, search, limit, offset } = params;
187
+ const allRuns = await this.deps.discoverAllRunDirs();
188
+ const runs = await Promise.all(allRuns.map(async ({ runDir, source, projectName }) => {
189
+ return await this.deps.getRunCached(runDir, source, projectName);
190
+ }));
191
+ // Sort, search, paginate (no retention filter on "all runs" -- matches original)
192
+ sortRuns(runs, sort);
193
+ let filtered = filterBySearch(runs, search);
194
+ const totalCount = filtered.length;
195
+ filtered = paginate(filtered, offset, limit);
196
+ return {
197
+ runs: toLightRuns(filtered),
198
+ totalCount,
199
+ };
200
+ }
201
+ }
202
+ //# sourceMappingURL=run-query-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-query-service.js","sourceRoot":"","sources":["../../../../src/kanban/lib/services/run-query-service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ import { type KanbanTaskTag } from "@a5c-ai/comm-adapter/kanban";
2
+ import { type KanbanStorageDeps } from "./kanban-storage.js";
3
+ export interface CreateTaskTagInput {
4
+ readonly key: string;
5
+ readonly label: string;
6
+ readonly content: string;
7
+ readonly description?: string;
8
+ readonly order?: number;
9
+ }
10
+ export interface UpdateTaskTagInput {
11
+ readonly key?: string;
12
+ readonly label?: string;
13
+ readonly content?: string;
14
+ readonly description?: string;
15
+ readonly order?: number;
16
+ }
17
+ export interface TaskTagMutationResult {
18
+ readonly taskTag: KanbanTaskTag;
19
+ readonly taskTags: readonly KanbanTaskTag[];
20
+ }
21
+ export interface TaskTagDeleteResult {
22
+ readonly taskTags: readonly KanbanTaskTag[];
23
+ }
24
+ interface TaskTagServiceDeps extends KanbanStorageDeps {
25
+ readonly now: () => string;
26
+ readonly createId: () => string;
27
+ }
28
+ export declare class TaskTagService {
29
+ private readonly deps;
30
+ constructor(overrides?: Partial<TaskTagServiceDeps>);
31
+ private readStorage;
32
+ private writeStorage;
33
+ private assertUniqueKey;
34
+ listTaskTags(): Promise<readonly KanbanTaskTag[]>;
35
+ createTaskTag(input: CreateTaskTagInput): Promise<TaskTagMutationResult>;
36
+ updateTaskTag(taskTagId: string, input: UpdateTaskTagInput): Promise<TaskTagMutationResult>;
37
+ deleteTaskTag(taskTagId: string): Promise<TaskTagDeleteResult>;
38
+ }
39
+ export {};
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-tag-service.d.ts","sourceRoot":"","sources":["../../../../src/kanban/lib/services/task-tag-service.ts"],"names":[],"mappings":"AAEA,OAAO,EAIL,KAAK,aAAa,EACnB,MAAM,6BAA6B,CAAC;AAGrC,OAAO,EAIL,KAAK,iBAAiB,EAEvB,MAAM,qBAAqB,CAAC;AAE7B,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC;IAChC,QAAQ,CAAC,QAAQ,EAAE,SAAS,aAAa,EAAE,CAAC;CAC7C;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,QAAQ,EAAE,SAAS,aAAa,EAAE,CAAC;CAC7C;AAED,UAAU,kBAAmB,SAAQ,iBAAiB;IACpD,QAAQ,CAAC,GAAG,EAAE,MAAM,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE,MAAM,MAAM,CAAC;CACjC;AA6DD,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAqB;gBAE9B,SAAS,GAAE,OAAO,CAAC,kBAAkB,CAAM;YAIzC,WAAW;YAWX,YAAY;IAY1B,OAAO,CAAC,eAAe;IAcjB,YAAY,IAAI,OAAO,CAAC,SAAS,aAAa,EAAE,CAAC;IAKjD,aAAa,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,qBAAqB,CAAC;IAyBxE,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,qBAAqB,CAAC;IA4C3F,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC;CAcrE"}
@@ -0,0 +1,145 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { normalizeKanbanTaskTag, normalizeKanbanTaskTagKey, normalizeKanbanTaskTags, } from "@a5c-ai/comm-adapter/kanban";
3
+ import { AppError } from "../error-handler.js";
4
+ import { defaultKanbanStorageDeps, readKanbanStorageFile, writeKanbanStorageFile, } from "./kanban-storage.js";
5
+ const defaultDeps = {
6
+ ...defaultKanbanStorageDeps,
7
+ now: () => new Date().toISOString(),
8
+ createId: () => `task-tag-${randomUUID()}`,
9
+ };
10
+ function requireString(value, fieldName) {
11
+ if (typeof value !== "string") {
12
+ throw new AppError(`${fieldName} is required.`, "BAD_REQUEST", 400);
13
+ }
14
+ const normalized = value.trim();
15
+ if (!normalized) {
16
+ throw new AppError(`${fieldName} is required.`, "BAD_REQUEST", 400);
17
+ }
18
+ return normalized;
19
+ }
20
+ function normalizeDescription(value) {
21
+ if (value === undefined) {
22
+ return undefined;
23
+ }
24
+ if (typeof value !== "string") {
25
+ throw new AppError("description must be a string when provided.", "BAD_REQUEST", 400);
26
+ }
27
+ const normalized = value.trim();
28
+ return normalized || undefined;
29
+ }
30
+ function normalizeOrder(value, fallbackOrder) {
31
+ if (value === undefined) {
32
+ return fallbackOrder;
33
+ }
34
+ if (typeof value !== "number" || !Number.isFinite(value)) {
35
+ throw new AppError("order must be a finite number when provided.", "BAD_REQUEST", 400);
36
+ }
37
+ return Math.max(0, Math.floor(value));
38
+ }
39
+ function normalizeKey(value) {
40
+ const trimmed = requireString(value, "key");
41
+ const normalized = normalizeKanbanTaskTagKey(trimmed);
42
+ if (!normalized || normalized !== trimmed) {
43
+ throw new AppError("key must be lowercase snake_case.", "BAD_REQUEST", 400);
44
+ }
45
+ return normalized;
46
+ }
47
+ function nextOrder(taskTags) {
48
+ if (taskTags.length === 0) {
49
+ return 0;
50
+ }
51
+ return Math.max(...taskTags.map((taskTag) => taskTag.order)) + 1;
52
+ }
53
+ export class TaskTagService {
54
+ deps;
55
+ constructor(overrides = {}) {
56
+ this.deps = { ...defaultDeps, ...overrides };
57
+ }
58
+ async readStorage() {
59
+ const storage = (await readKanbanStorageFile(this.deps)) ?? {};
60
+ return {
61
+ storage,
62
+ taskTags: normalizeKanbanTaskTags(storage.taskTags ?? []),
63
+ };
64
+ }
65
+ async writeStorage(storage, taskTags) {
66
+ const normalizedTaskTags = normalizeKanbanTaskTags(taskTags);
67
+ await writeKanbanStorageFile(this.deps, {
68
+ ...storage,
69
+ taskTags: normalizedTaskTags,
70
+ });
71
+ return normalizedTaskTags;
72
+ }
73
+ assertUniqueKey(taskTags, key, excludeTaskTagId) {
74
+ const existing = taskTags.find((taskTag) => taskTag.key === key && taskTag.id !== excludeTaskTagId);
75
+ if (existing) {
76
+ throw new AppError(`Task Tag key ${key} already exists.`, "CONFLICT", 409);
77
+ }
78
+ }
79
+ async listTaskTags() {
80
+ const { taskTags } = await this.readStorage();
81
+ return taskTags;
82
+ }
83
+ async createTaskTag(input) {
84
+ const { storage, taskTags } = await this.readStorage();
85
+ const now = this.deps.now();
86
+ const key = normalizeKey(input.key);
87
+ this.assertUniqueKey(taskTags, key);
88
+ const createdTaskTag = normalizeKanbanTaskTag({
89
+ id: this.deps.createId(),
90
+ key,
91
+ label: requireString(input.label, "label"),
92
+ content: requireString(input.content, "content"),
93
+ description: normalizeDescription(input.description),
94
+ order: normalizeOrder(input.order, nextOrder(taskTags)),
95
+ createdAt: now,
96
+ updatedAt: now,
97
+ });
98
+ const nextTaskTags = await this.writeStorage(storage, [...taskTags, createdTaskTag]);
99
+ return {
100
+ taskTag: nextTaskTags.find((taskTag) => taskTag.id === createdTaskTag.id) ?? createdTaskTag,
101
+ taskTags: nextTaskTags,
102
+ };
103
+ }
104
+ async updateTaskTag(taskTagId, input) {
105
+ const { storage, taskTags } = await this.readStorage();
106
+ const currentTaskTag = taskTags.find((taskTag) => taskTag.id === taskTagId);
107
+ if (!currentTaskTag) {
108
+ throw new AppError(`Task Tag ${taskTagId} not found.`, "NOT_FOUND", 404);
109
+ }
110
+ const nextKey = input.key === undefined ? currentTaskTag.key : normalizeKey(input.key);
111
+ this.assertUniqueKey(taskTags, nextKey, taskTagId);
112
+ const nextTaskTag = normalizeKanbanTaskTag({
113
+ ...currentTaskTag,
114
+ key: nextKey,
115
+ label: input.label === undefined
116
+ ? currentTaskTag.label
117
+ : requireString(input.label, "label"),
118
+ content: input.content === undefined
119
+ ? currentTaskTag.content
120
+ : requireString(input.content, "content"),
121
+ description: input.description === undefined
122
+ ? currentTaskTag.description
123
+ : normalizeDescription(input.description),
124
+ order: input.order === undefined
125
+ ? currentTaskTag.order
126
+ : normalizeOrder(input.order, currentTaskTag.order),
127
+ updatedAt: this.deps.now(),
128
+ });
129
+ const nextTaskTags = await this.writeStorage(storage, taskTags.map((taskTag) => (taskTag.id === taskTagId ? nextTaskTag : taskTag)));
130
+ return {
131
+ taskTag: nextTaskTags.find((taskTag) => taskTag.id === taskTagId) ?? nextTaskTag,
132
+ taskTags: nextTaskTags,
133
+ };
134
+ }
135
+ async deleteTaskTag(taskTagId) {
136
+ const { storage, taskTags } = await this.readStorage();
137
+ if (!taskTags.some((taskTag) => taskTag.id === taskTagId)) {
138
+ throw new AppError(`Task Tag ${taskTagId} not found.`, "NOT_FOUND", 404);
139
+ }
140
+ return {
141
+ taskTags: await this.writeStorage(storage, taskTags.filter((taskTag) => taskTag.id !== taskTagId)),
142
+ };
143
+ }
144
+ }
145
+ //# sourceMappingURL=task-tag-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-tag-service.js","sourceRoot":"","sources":["../../../../src/kanban/lib/services/task-tag-service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import type { McpServerConfig } from "@a5c-ai/comm-adapter";
2
+ export interface StoredAgentConfiguration {
3
+ model?: string;
4
+ provider?: string;
5
+ approvalMode?: "yolo" | "prompt" | "deny";
6
+ maxTokens?: number;
7
+ }
8
+ export interface SettingsSectionStorage {
9
+ agentConfiguration: Record<string, StoredAgentConfiguration>;
10
+ mcpServers: Record<string, McpServerConfig[]>;
11
+ }
12
+ export declare function loadSettingsSectionStorage(): Promise<SettingsSectionStorage>;
13
+ export declare function writeSettingsSectionStorage(data: SettingsSectionStorage): Promise<void>;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"settings-section-storage.d.ts","sourceRoot":"","sources":["../../../src/kanban/lib/settings-section-storage.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAE5D,MAAM,WAAW,wBAAwB;IACvC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,MAAM,CAAC;IAC1C,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,sBAAsB;IACrC,kBAAkB,EAAE,MAAM,CAAC,MAAM,EAAE,wBAAwB,CAAC,CAAC;IAC7D,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,EAAE,CAAC,CAAC;CAC/C;AA6BD,wBAAsB,0BAA0B,IAAI,OAAO,CAAC,sBAAsB,CAAC,CAOlF;AAED,wBAAsB,2BAA2B,CAC/C,IAAI,EAAE,sBAAsB,GAC3B,OAAO,CAAC,IAAI,CAAC,CAIf"}
@@ -0,0 +1,38 @@
1
+ import { promises as fs } from "node:fs";
2
+ import os from "node:os";
3
+ import path from "node:path";
4
+ const DEFAULT_STORAGE_PATH = path.join(os.homedir(), ".a5c", "kanban-settings-sections.json");
5
+ function getStoragePath() {
6
+ return process.env.KANBAN_SETTINGS_SECTION_STORE || DEFAULT_STORAGE_PATH;
7
+ }
8
+ async function readStorageFile() {
9
+ try {
10
+ const content = await fs.readFile(getStoragePath(), "utf8");
11
+ const parsed = JSON.parse(content);
12
+ return {
13
+ agentConfiguration: parsed.agentConfiguration && typeof parsed.agentConfiguration === "object"
14
+ ? parsed.agentConfiguration
15
+ : {},
16
+ mcpServers: parsed.mcpServers && typeof parsed.mcpServers === "object" ? parsed.mcpServers : {},
17
+ };
18
+ }
19
+ catch (error) {
20
+ const code = error.code;
21
+ if (code === "ENOENT" || code === "ENOTDIR") {
22
+ return null;
23
+ }
24
+ throw error;
25
+ }
26
+ }
27
+ export async function loadSettingsSectionStorage() {
28
+ return ((await readStorageFile()) ?? {
29
+ agentConfiguration: {},
30
+ mcpServers: {},
31
+ });
32
+ }
33
+ export async function writeSettingsSectionStorage(data) {
34
+ const filePath = getStoragePath();
35
+ await fs.mkdir(path.dirname(filePath), { recursive: true });
36
+ await fs.writeFile(filePath, JSON.stringify(data, null, 2) + "\n", "utf8");
37
+ }
38
+ //# sourceMappingURL=settings-section-storage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"settings-section-storage.js","sourceRoot":"","sources":["../../../src/kanban/lib/settings-section-storage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAgB7B,MAAM,oBAAoB,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,+BAA+B,CAAC,CAAC;AAE9F,SAAS,cAAc;IACrB,OAAO,OAAO,CAAC,GAAG,CAAC,6BAA6B,IAAI,oBAAoB,CAAC;AAC3E,CAAC;AAED,KAAK,UAAU,eAAe;IAC5B,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,cAAc,EAAE,EAAE,MAAM,CAAC,CAAC;QAC5D,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAoC,CAAC;QACtE,OAAO;YACL,kBAAkB,EAChB,MAAM,CAAC,kBAAkB,IAAI,OAAO,MAAM,CAAC,kBAAkB,KAAK,QAAQ;gBACxE,CAAC,CAAC,MAAM,CAAC,kBAAkB;gBAC3B,CAAC,CAAC,EAAE;YACR,UAAU,EACR,MAAM,CAAC,UAAU,IAAI,OAAO,MAAM,CAAC,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE;SACtF,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,GAAI,KAA+B,CAAC,IAAI,CAAC;QACnD,IAAI,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YAC5C,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,0BAA0B;IAC9C,OAAO,CACL,CAAC,MAAM,eAAe,EAAE,CAAC,IAAI;QAC3B,kBAAkB,EAAE,EAAE;QACtB,UAAU,EAAE,EAAE;KACf,CACF,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,2BAA2B,CAC/C,IAA4B;IAE5B,MAAM,QAAQ,GAAG,cAAc,EAAE,CAAC;IAClC,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5D,MAAM,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,MAAM,CAAC,CAAC;AAC7E,CAAC"}
@@ -0,0 +1,10 @@
1
+ import { type WatchSource } from "./config-loader.js";
2
+ export interface DiscoveredRun {
3
+ runDir: string;
4
+ source: WatchSource;
5
+ projectName: string;
6
+ projectPath: string;
7
+ }
8
+ export declare function invalidateDiscoveryCache(): void;
9
+ export declare function discoverAllRunDirs(): Promise<DiscoveredRun[]>;
10
+ export declare function discoverAllRunsParentDirs(): Promise<string[]>;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"source-discovery.d.ts","sourceRoot":"","sources":["../../../src/kanban/lib/source-discovery.ts"],"names":[],"mappings":"AAEA,OAAO,EAA8B,KAAK,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAElF,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,WAAW,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;CACrB;AAgFD,wBAAgB,wBAAwB,IAAI,IAAI,CAG/C;AAGD,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC,CA+FnE;AAKD,wBAAsB,yBAAyB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAoBnE"}