@coralai/sps-cli 0.48.1 → 0.49.1

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 (147) hide show
  1. package/dist/console-assets/assets/{index-BR3iEolY.js → index-Co0H5e5_.js} +85 -85
  2. package/dist/console-assets/assets/{index-lsG7ZrzD.css → index-DNKOkgDj.css} +1 -1
  3. package/dist/console-assets/index.html +2 -2
  4. package/dist/console-server/routes/system.d.ts.map +1 -1
  5. package/dist/console-server/routes/system.js +30 -0
  6. package/dist/console-server/routes/system.js.map +1 -1
  7. package/package.json +4 -1
  8. package/dist/commands/cardMarkComplete.test.d.ts +0 -2
  9. package/dist/commands/cardMarkComplete.test.d.ts.map +0 -1
  10. package/dist/commands/cardMarkComplete.test.js +0 -142
  11. package/dist/commands/cardMarkComplete.test.js.map +0 -1
  12. package/dist/commands/cardMarkStarted.test.d.ts +0 -2
  13. package/dist/commands/cardMarkStarted.test.d.ts.map +0 -1
  14. package/dist/commands/cardMarkStarted.test.js +0 -98
  15. package/dist/commands/cardMarkStarted.test.js.map +0 -1
  16. package/dist/commands/projectInit.test.d.ts +0 -2
  17. package/dist/commands/projectInit.test.d.ts.map +0 -1
  18. package/dist/commands/projectInit.test.js +0 -126
  19. package/dist/commands/projectInit.test.js.map +0 -1
  20. package/dist/commands/tick-heartbeat.test.d.ts +0 -2
  21. package/dist/commands/tick-heartbeat.test.d.ts.map +0 -1
  22. package/dist/commands/tick-heartbeat.test.js +0 -89
  23. package/dist/commands/tick-heartbeat.test.js.map +0 -1
  24. package/dist/core/checklist.test.d.ts +0 -2
  25. package/dist/core/checklist.test.d.ts.map +0 -1
  26. package/dist/core/checklist.test.js +0 -74
  27. package/dist/core/checklist.test.js.map +0 -1
  28. package/dist/core/config.test.d.ts +0 -2
  29. package/dist/core/config.test.d.ts.map +0 -1
  30. package/dist/core/config.test.js +0 -352
  31. package/dist/core/config.test.js.map +0 -1
  32. package/dist/core/lock.test.d.ts +0 -2
  33. package/dist/core/lock.test.d.ts.map +0 -1
  34. package/dist/core/lock.test.js +0 -118
  35. package/dist/core/lock.test.js.map +0 -1
  36. package/dist/core/markerFile.test.d.ts +0 -2
  37. package/dist/core/markerFile.test.d.ts.map +0 -1
  38. package/dist/core/markerFile.test.js +0 -111
  39. package/dist/core/markerFile.test.js.map +0 -1
  40. package/dist/core/queue.test.d.ts +0 -2
  41. package/dist/core/queue.test.d.ts.map +0 -1
  42. package/dist/core/queue.test.js +0 -114
  43. package/dist/core/queue.test.js.map +0 -1
  44. package/dist/core/sessionCleanup.test.d.ts +0 -2
  45. package/dist/core/sessionCleanup.test.d.ts.map +0 -1
  46. package/dist/core/sessionCleanup.test.js +0 -158
  47. package/dist/core/sessionCleanup.test.js.map +0 -1
  48. package/dist/core/shellEnv.test.d.ts +0 -2
  49. package/dist/core/shellEnv.test.d.ts.map +0 -1
  50. package/dist/core/shellEnv.test.js +0 -116
  51. package/dist/core/shellEnv.test.js.map +0 -1
  52. package/dist/core/skillStore.test.d.ts +0 -2
  53. package/dist/core/skillStore.test.d.ts.map +0 -1
  54. package/dist/core/skillStore.test.js +0 -203
  55. package/dist/core/skillStore.test.js.map +0 -1
  56. package/dist/core/state.test.d.ts +0 -2
  57. package/dist/core/state.test.d.ts.map +0 -1
  58. package/dist/core/state.test.js +0 -336
  59. package/dist/core/state.test.js.map +0 -1
  60. package/dist/engines/CloseoutEngine.d.ts +0 -72
  61. package/dist/engines/CloseoutEngine.d.ts.map +0 -1
  62. package/dist/engines/CloseoutEngine.js +0 -648
  63. package/dist/engines/CloseoutEngine.js.map +0 -1
  64. package/dist/engines/EventHandler.test.d.ts +0 -2
  65. package/dist/engines/EventHandler.test.d.ts.map +0 -1
  66. package/dist/engines/EventHandler.test.js +0 -169
  67. package/dist/engines/EventHandler.test.js.map +0 -1
  68. package/dist/engines/ExecutionEngine.d.ts +0 -125
  69. package/dist/engines/ExecutionEngine.d.ts.map +0 -1
  70. package/dist/engines/ExecutionEngine.js +0 -766
  71. package/dist/engines/ExecutionEngine.js.map +0 -1
  72. package/dist/engines/MonitorEngine.test.d.ts +0 -2
  73. package/dist/engines/MonitorEngine.test.d.ts.map +0 -1
  74. package/dist/engines/MonitorEngine.test.js +0 -355
  75. package/dist/engines/MonitorEngine.test.js.map +0 -1
  76. package/dist/engines/engine-pipeline-adapter.test.d.ts +0 -17
  77. package/dist/engines/engine-pipeline-adapter.test.d.ts.map +0 -1
  78. package/dist/engines/engine-pipeline-adapter.test.js +0 -707
  79. package/dist/engines/engine-pipeline-adapter.test.js.map +0 -1
  80. package/dist/interfaces/HookProvider.d.ts +0 -9
  81. package/dist/interfaces/HookProvider.d.ts.map +0 -1
  82. package/dist/interfaces/HookProvider.js +0 -2
  83. package/dist/interfaces/HookProvider.js.map +0 -1
  84. package/dist/manager/completion-judge.test.d.ts +0 -17
  85. package/dist/manager/completion-judge.test.d.ts.map +0 -1
  86. package/dist/manager/completion-judge.test.js +0 -233
  87. package/dist/manager/completion-judge.test.js.map +0 -1
  88. package/dist/manager/integration-queue.d.ts +0 -71
  89. package/dist/manager/integration-queue.d.ts.map +0 -1
  90. package/dist/manager/integration-queue.js +0 -137
  91. package/dist/manager/integration-queue.js.map +0 -1
  92. package/dist/manager/integration-queue.test.d.ts +0 -17
  93. package/dist/manager/integration-queue.test.d.ts.map +0 -1
  94. package/dist/manager/integration-queue.test.js +0 -210
  95. package/dist/manager/integration-queue.test.js.map +0 -1
  96. package/dist/manager/pm-client.d.ts +0 -10
  97. package/dist/manager/pm-client.d.ts.map +0 -1
  98. package/dist/manager/pm-client.js +0 -260
  99. package/dist/manager/pm-client.js.map +0 -1
  100. package/dist/manager/resource-limiter.d.ts +0 -56
  101. package/dist/manager/resource-limiter.d.ts.map +0 -1
  102. package/dist/manager/resource-limiter.js +0 -116
  103. package/dist/manager/resource-limiter.js.map +0 -1
  104. package/dist/manager/resource-limiter.test.d.ts +0 -17
  105. package/dist/manager/resource-limiter.test.d.ts.map +0 -1
  106. package/dist/manager/resource-limiter.test.js +0 -118
  107. package/dist/manager/resource-limiter.test.js.map +0 -1
  108. package/dist/manager/supervisor.test.d.ts +0 -17
  109. package/dist/manager/supervisor.test.d.ts.map +0 -1
  110. package/dist/manager/supervisor.test.js +0 -216
  111. package/dist/manager/supervisor.test.js.map +0 -1
  112. package/dist/manager/worker-manager-impl.test.d.ts +0 -17
  113. package/dist/manager/worker-manager-impl.test.d.ts.map +0 -1
  114. package/dist/manager/worker-manager-impl.test.js +0 -446
  115. package/dist/manager/worker-manager-impl.test.js.map +0 -1
  116. package/dist/providers/PlaneTaskBackend.d.ts +0 -83
  117. package/dist/providers/PlaneTaskBackend.d.ts.map +0 -1
  118. package/dist/providers/PlaneTaskBackend.js +0 -461
  119. package/dist/providers/PlaneTaskBackend.js.map +0 -1
  120. package/dist/providers/TrelloTaskBackend.d.ts +0 -64
  121. package/dist/providers/TrelloTaskBackend.d.ts.map +0 -1
  122. package/dist/providers/TrelloTaskBackend.js +0 -298
  123. package/dist/providers/TrelloTaskBackend.js.map +0 -1
  124. package/dist/providers/adapters/acp-fs-handlers.test.d.ts +0 -2
  125. package/dist/providers/adapters/acp-fs-handlers.test.d.ts.map +0 -1
  126. package/dist/providers/adapters/acp-fs-handlers.test.js +0 -80
  127. package/dist/providers/adapters/acp-fs-handlers.test.js.map +0 -1
  128. package/dist/providers/adapters/acp-permissions.test.d.ts +0 -2
  129. package/dist/providers/adapters/acp-permissions.test.d.ts.map +0 -1
  130. package/dist/providers/adapters/acp-permissions.test.js +0 -103
  131. package/dist/providers/adapters/acp-permissions.test.js.map +0 -1
  132. package/dist/providers/adapters/acp-session-accumulator.test.d.ts +0 -2
  133. package/dist/providers/adapters/acp-session-accumulator.test.d.ts.map +0 -1
  134. package/dist/providers/adapters/acp-session-accumulator.test.js +0 -88
  135. package/dist/providers/adapters/acp-session-accumulator.test.js.map +0 -1
  136. package/dist/providers/adapters/acp-terminal-manager.test.d.ts +0 -2
  137. package/dist/providers/adapters/acp-terminal-manager.test.d.ts.map +0 -1
  138. package/dist/providers/adapters/acp-terminal-manager.test.js +0 -86
  139. package/dist/providers/adapters/acp-terminal-manager.test.js.map +0 -1
  140. package/dist/providers/outputParser.test.d.ts +0 -2
  141. package/dist/providers/outputParser.test.d.ts.map +0 -1
  142. package/dist/providers/outputParser.test.js +0 -185
  143. package/dist/providers/outputParser.test.js.map +0 -1
  144. package/dist/test-setup.d.ts +0 -2
  145. package/dist/test-setup.d.ts.map +0 -1
  146. package/dist/test-setup.js +0 -27
  147. package/dist/test-setup.js.map +0 -1
@@ -1,298 +0,0 @@
1
- const ALL_STATES = ['Planning', 'Backlog', 'Todo', 'Inprogress', 'QA', 'Done'];
2
- export class TrelloTaskBackend {
3
- apiBase = 'https://api.trello.com/1';
4
- apiKey;
5
- apiToken;
6
- boardId;
7
- /** CardState → Trello list ID */
8
- listMap;
9
- /** Trello list ID → CardState */
10
- reverseListMap;
11
- /** Cache: label name → label ID */
12
- labelCache = null;
13
- constructor(config) {
14
- const raw = config.raw;
15
- this.apiKey = required(raw, 'TRELLO_API_KEY');
16
- this.apiToken = required(raw, 'TRELLO_TOKEN');
17
- this.boardId = required(raw, 'TRELLO_BOARD_ID');
18
- this.listMap = {
19
- Planning: required(raw, 'TRELLO_LIST_PLANNING'),
20
- Backlog: required(raw, 'TRELLO_LIST_BACKLOG'),
21
- Todo: required(raw, 'TRELLO_LIST_TODO'),
22
- Inprogress: required(raw, 'TRELLO_LIST_INPROGRESS'),
23
- QA: required(raw, 'TRELLO_LIST_QA'),
24
- Done: required(raw, 'TRELLO_LIST_DONE'),
25
- };
26
- this.reverseListMap = new Map();
27
- for (const state of ALL_STATES) {
28
- this.reverseListMap.set(this.listMap[state], state);
29
- }
30
- }
31
- get authParams() {
32
- return `key=${this.apiKey}&token=${this.apiToken}`;
33
- }
34
- // ─── API helpers ──────────────────────────────────────────────
35
- async get(path, params = '') {
36
- const sep = path.includes('?') ? '&' : '?';
37
- const url = `${this.apiBase}${path}${sep}${this.authParams}${params ? '&' + params : ''}`;
38
- const res = await fetch(url);
39
- if (!res.ok) {
40
- const text = await res.text().catch(() => '');
41
- throw new Error(`Trello GET ${path} failed (${res.status}): ${text}`);
42
- }
43
- return (await res.json());
44
- }
45
- async post(path, body = {}) {
46
- const url = `${this.apiBase}${path}?${this.authParams}`;
47
- const res = await fetch(url, {
48
- method: 'POST',
49
- headers: { 'Content-Type': 'application/json' },
50
- body: JSON.stringify(body),
51
- });
52
- if (!res.ok) {
53
- const text = await res.text().catch(() => '');
54
- throw new Error(`Trello POST ${path} failed (${res.status}): ${text}`);
55
- }
56
- return (await res.json());
57
- }
58
- async put(path, body = {}) {
59
- const url = `${this.apiBase}${path}?${this.authParams}`;
60
- const res = await fetch(url, {
61
- method: 'PUT',
62
- headers: { 'Content-Type': 'application/json' },
63
- body: JSON.stringify(body),
64
- });
65
- if (!res.ok) {
66
- const text = await res.text().catch(() => '');
67
- throw new Error(`Trello PUT ${path} failed (${res.status}): ${text}`);
68
- }
69
- return (await res.json());
70
- }
71
- async del(path) {
72
- const url = `${this.apiBase}${path}?${this.authParams}`;
73
- const res = await fetch(url, { method: 'DELETE' });
74
- if (!res.ok) {
75
- const text = await res.text().catch(() => '');
76
- throw new Error(`Trello DELETE ${path} failed (${res.status}): ${text}`);
77
- }
78
- }
79
- // ─── Card mapping ─────────────────────────────────────────────
80
- cardToCard(tc) {
81
- const state = this.reverseListMap.get(tc.idList) ?? 'Backlog';
82
- return {
83
- id: tc.id,
84
- seq: String(tc.idShort),
85
- name: tc.name,
86
- desc: tc.desc || '',
87
- state,
88
- labels: (tc.labels || []).map((l) => l.name),
89
- meta: {},
90
- };
91
- }
92
- // ─── TaskBackend implementation ───────────────────────────────
93
- async incrementRetryCount(_seq) { return 0; /* Trello: not implemented */ }
94
- async resetRetryCount(_seq) { }
95
- async bootstrap() {
96
- // Verify board access
97
- await this.get(`/boards/${this.boardId}`, 'fields=id');
98
- // Ensure standard labels exist
99
- for (const name of ['AI-PIPELINE', 'CLAIMED', 'BLOCKED', 'NEEDS-FIX', 'CONFLICT']) {
100
- await this.ensureLabel(name);
101
- }
102
- }
103
- async listByState(state) {
104
- const listId = this.listMap[state];
105
- if (!listId)
106
- throw new Error(`No Trello list mapping for ${state}`);
107
- const cards = await this.get(`/lists/${listId}/cards`, 'fields=id,idShort,name,desc,idList,labels');
108
- return cards.map((c) => this.cardToCard(c));
109
- }
110
- async listAll() {
111
- const cards = await this.get(`/boards/${this.boardId}/cards`, 'fields=id,idShort,name,desc,idList,labels');
112
- return cards.map((card) => this.cardToCard(card));
113
- }
114
- async getBySeq(seq) {
115
- // Trello doesn't have a direct idShort lookup API.
116
- // Search all lists for the card.
117
- for (const state of ALL_STATES) {
118
- const cards = await this.listByState(state);
119
- const match = cards.find((c) => c.seq === seq);
120
- if (match)
121
- return match;
122
- }
123
- return null;
124
- }
125
- async move(seq, targetState) {
126
- const card = await this.requireCard(seq);
127
- const listId = this.listMap[targetState];
128
- await this.put(`/cards/${card.id}`, { idList: listId });
129
- }
130
- async addLabel(seq, label) {
131
- const card = await this.requireCard(seq);
132
- const labelId = await this.ensureLabel(label);
133
- // Check if already has this label
134
- const existing = await this.get(`/cards/${card.id}`, 'fields=labels');
135
- if ((existing.labels || []).some((l) => l.id === labelId))
136
- return;
137
- await this.post(`/cards/${card.id}/idLabels`, { value: labelId });
138
- }
139
- async removeLabel(seq, label) {
140
- const card = await this.requireCard(seq);
141
- const labelId = await this.findLabelId(label);
142
- if (!labelId)
143
- return;
144
- try {
145
- await this.del(`/cards/${card.id}/idLabels/${labelId}`);
146
- }
147
- catch {
148
- // Label might not be on card — ignore
149
- }
150
- }
151
- async claim(seq, workerSlot) {
152
- // Trello claim: write JARVIS-META comment + add CLAIMED label
153
- await this.metaWrite(seq, {
154
- status: 'CLAIMED',
155
- worker: workerSlot,
156
- claimedAt: new Date().toISOString(),
157
- });
158
- await this.addLabel(seq, 'CLAIMED');
159
- }
160
- async releaseClaim(seq) {
161
- const existing = await this.metaRead(seq);
162
- await this.metaWrite(seq, {
163
- ...existing,
164
- status: 'RELEASED',
165
- releasedAt: new Date().toISOString(),
166
- });
167
- await this.removeLabel(seq, 'CLAIMED');
168
- }
169
- async comment(seq, text) {
170
- const card = await this.requireCard(seq);
171
- await this.post(`/cards/${card.id}/actions/comments`, { text });
172
- }
173
- async create(name, desc, state) {
174
- const listId = this.listMap[state];
175
- const tc = await this.post('/cards', {
176
- name,
177
- desc,
178
- idList: listId,
179
- });
180
- return this.cardToCard(tc);
181
- }
182
- // ─── Checklist ────────────────────────────────────────────────
183
- async checklistCreate(seq, items) {
184
- const card = await this.requireCard(seq);
185
- // Create a new checklist on the card
186
- const checklist = await this.post(`/cards/${card.id}/checklists`, { name: 'Tasks' });
187
- for (const item of items) {
188
- await this.post(`/checklists/${checklist.id}/checkItems`, { name: item });
189
- }
190
- }
191
- async checklistList(seq) {
192
- const card = await this.requireCard(seq);
193
- const checklists = await this.get(`/cards/${card.id}/checklists`);
194
- const items = [];
195
- for (const cl of checklists) {
196
- for (const ci of cl.checkItems || []) {
197
- items.push({
198
- id: ci.id,
199
- text: ci.name,
200
- checked: ci.state === 'complete',
201
- });
202
- }
203
- }
204
- return items;
205
- }
206
- async checklistCheck(seq, itemId) {
207
- const card = await this.requireCard(seq);
208
- // Find which checklist owns this item
209
- const checklists = await this.get(`/cards/${card.id}/checklists`);
210
- for (const cl of checklists) {
211
- const item = (cl.checkItems || []).find((ci) => ci.id === itemId);
212
- if (item) {
213
- await this.put(`/cards/${card.id}/checkItem/${itemId}`, { state: 'complete' });
214
- return;
215
- }
216
- }
217
- throw new Error(`Checklist item ${itemId} not found`);
218
- }
219
- async checklistUncheck(seq, itemId) {
220
- const card = await this.requireCard(seq);
221
- const checklists = await this.get(`/cards/${card.id}/checklists`);
222
- for (const cl of checklists) {
223
- const item = (cl.checkItems || []).find((ci) => ci.id === itemId);
224
- if (item) {
225
- await this.put(`/cards/${card.id}/checkItem/${itemId}`, { state: 'incomplete' });
226
- return;
227
- }
228
- }
229
- throw new Error(`Checklist item ${itemId} not found`);
230
- }
231
- // ─── Meta (via [JARVIS-META] comment) ─────────────────────────
232
- async metaRead(seq) {
233
- const card = await this.requireCard(seq);
234
- const actions = await this.get(`/cards/${card.id}/actions`, 'filter=commentCard');
235
- // Find the most recent [JARVIS-META] comment
236
- for (const action of actions) {
237
- const text = action.data?.text || '';
238
- if (text.startsWith('[JARVIS-META]')) {
239
- try {
240
- return JSON.parse(text.replace('[JARVIS-META]', '').trim());
241
- }
242
- catch {
243
- }
244
- }
245
- }
246
- return {};
247
- }
248
- async metaWrite(seq, data) {
249
- const card = await this.requireCard(seq);
250
- const text = `[JARVIS-META] ${JSON.stringify(data)}`;
251
- // Delete old meta comments, add new one
252
- const actions = await this.get(`/cards/${card.id}/actions`, 'filter=commentCard');
253
- for (const action of actions) {
254
- if ((action.data?.text || '').startsWith('[JARVIS-META]')) {
255
- try {
256
- await this.del(`/cards/${card.id}/actions/${action.id}/comments`);
257
- }
258
- catch {
259
- // Old comment deletion may fail — non-fatal
260
- }
261
- }
262
- }
263
- await this.post(`/cards/${card.id}/actions/comments`, { text });
264
- }
265
- // ─── Helpers ──────────────────────────────────────────────────
266
- async requireCard(seq) {
267
- const card = await this.getBySeq(seq);
268
- if (!card)
269
- throw new Error(`Trello card with idShort ${seq} not found`);
270
- return card;
271
- }
272
- async ensureLabel(name) {
273
- const existing = await this.findLabelId(name);
274
- if (existing)
275
- return existing;
276
- const label = await this.post(`/boards/${this.boardId}/labels`, { name, color: 'green' });
277
- this.labelCache = null; // invalidate
278
- return label.id;
279
- }
280
- async findLabelId(name) {
281
- if (!this.labelCache) {
282
- const labels = await this.get(`/boards/${this.boardId}/labels`);
283
- this.labelCache = new Map();
284
- for (const l of labels) {
285
- if (l.name)
286
- this.labelCache.set(l.name, l.id);
287
- }
288
- }
289
- return this.labelCache.get(name) ?? null;
290
- }
291
- }
292
- function required(raw, key) {
293
- const val = raw[key];
294
- if (!val)
295
- throw new Error(`Missing required config field: ${key}`);
296
- return val;
297
- }
298
- //# sourceMappingURL=TrelloTaskBackend.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"TrelloTaskBackend.js","sourceRoot":"","sources":["../../src/providers/TrelloTaskBackend.ts"],"names":[],"mappings":"AAmBA,MAAM,UAAU,GAAgB,CAAC,UAAU,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;AAC5F,MAAM,OAAO,iBAAiB;IACX,OAAO,GAAG,0BAA0B,CAAC;IACrC,MAAM,CAAS;IACf,QAAQ,CAAS;IACjB,OAAO,CAAS;IAEjC,iCAAiC;IAChB,OAAO,CAA4B;IACpD,iCAAiC;IAChB,cAAc,CAAyB;IAExD,mCAAmC;IAC3B,UAAU,GAA+B,IAAI,CAAC;IAEtD,YAAY,MAAqB;QAC/B,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC;QACvB,IAAI,CAAC,MAAM,GAAG,QAAQ,CAAC,GAAG,EAAE,gBAAgB,CAAC,CAAC;QAC9C,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;QAC9C,IAAI,CAAC,OAAO,GAAG,QAAQ,CAAC,GAAG,EAAE,iBAAiB,CAAC,CAAC;QAEhD,IAAI,CAAC,OAAO,GAAG;YACb,QAAQ,EAAE,QAAQ,CAAC,GAAG,EAAE,sBAAsB,CAAC;YAC/C,OAAO,EAAE,QAAQ,CAAC,GAAG,EAAE,qBAAqB,CAAC;YAC7C,IAAI,EAAE,QAAQ,CAAC,GAAG,EAAE,kBAAkB,CAAC;YACvC,UAAU,EAAE,QAAQ,CAAC,GAAG,EAAE,wBAAwB,CAAC;YACnD,EAAE,EAAE,QAAQ,CAAC,GAAG,EAAE,gBAAgB,CAAC;YACnC,IAAI,EAAE,QAAQ,CAAC,GAAG,EAAE,kBAAkB,CAAC;SACxC,CAAC;QAEF,IAAI,CAAC,cAAc,GAAG,IAAI,GAAG,EAAqB,CAAC;QACnD,KAAK,MAAM,KAAK,IAAI,UAAU,EAAE,CAAC;YAC/B,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,CAAC;QACtD,CAAC;IACH,CAAC;IAED,IAAY,UAAU;QACpB,OAAO,OAAO,IAAI,CAAC,MAAM,UAAU,IAAI,CAAC,QAAQ,EAAE,CAAC;IACrD,CAAC;IAED,iEAAiE;IAEzD,KAAK,CAAC,GAAG,CAAI,IAAY,EAAE,MAAM,GAAG,EAAE;QAC5C,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;QAC3C,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,OAAO,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;QAC1F,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;QAC7B,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;YAC9C,MAAM,IAAI,KAAK,CAAC,cAAc,IAAI,YAAY,GAAG,CAAC,MAAM,MAAM,IAAI,EAAE,CAAC,CAAC;QACxE,CAAC;QACD,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAM,CAAC;IACjC,CAAC;IAEO,KAAK,CAAC,IAAI,CAAI,IAAY,EAAE,OAA+B,EAAE;QACnE,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,OAAO,GAAG,IAAI,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;QACxD,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YAC3B,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;SAC3B,CAAC,CAAC;QACH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;YAC9C,MAAM,IAAI,KAAK,CAAC,eAAe,IAAI,YAAY,GAAG,CAAC,MAAM,MAAM,IAAI,EAAE,CAAC,CAAC;QACzE,CAAC;QACD,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAM,CAAC;IACjC,CAAC;IAEO,KAAK,CAAC,GAAG,CAAI,IAAY,EAAE,OAA+B,EAAE;QAClE,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,OAAO,GAAG,IAAI,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;QACxD,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YAC3B,MAAM,EAAE,KAAK;YACb,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;SAC3B,CAAC,CAAC;QACH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;YAC9C,MAAM,IAAI,KAAK,CAAC,cAAc,IAAI,YAAY,GAAG,CAAC,MAAM,MAAM,IAAI,EAAE,CAAC,CAAC;QACxE,CAAC;QACD,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAM,CAAC;IACjC,CAAC;IAEO,KAAK,CAAC,GAAG,CAAC,IAAY;QAC5B,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,OAAO,GAAG,IAAI,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;QACxD,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;QACnD,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;YAC9C,MAAM,IAAI,KAAK,CAAC,iBAAiB,IAAI,YAAY,GAAG,CAAC,MAAM,MAAM,IAAI,EAAE,CAAC,CAAC;QAC3E,CAAC;IACH,CAAC;IAED,iEAAiE;IAEzD,UAAU,CAAC,EAAc;QAC/B,MAAM,KAAK,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,SAAS,CAAC;QAC9D,OAAO;YACL,EAAE,EAAE,EAAE,CAAC,EAAE;YACT,GAAG,EAAE,MAAM,CAAC,EAAE,CAAC,OAAO,CAAC;YACvB,IAAI,EAAE,EAAE,CAAC,IAAI;YACb,IAAI,EAAE,EAAE,CAAC,IAAI,IAAI,EAAE;YACnB,KAAK;YACL,MAAM,EAAE,CAAC,EAAE,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;YAC5C,IAAI,EAAE,EAAE;SACT,CAAC;IACJ,CAAC;IAED,iEAAiE;IAEjE,KAAK,CAAC,mBAAmB,CAAC,IAAY,IAAqB,OAAO,CAAC,CAAC,CAAC,6BAA6B,CAAC,CAAC;IACpG,KAAK,CAAC,eAAe,CAAC,IAAY,IAAiD,CAAC;IAEpF,KAAK,CAAC,SAAS;QACb,sBAAsB;QACtB,MAAM,IAAI,CAAC,GAAG,CAAiB,WAAW,IAAI,CAAC,OAAO,EAAE,EAAE,WAAW,CAAC,CAAC;QACvE,+BAA+B;QAC/B,KAAK,MAAM,IAAI,IAAI,CAAC,aAAa,EAAE,SAAS,EAAE,SAAS,EAAE,WAAW,EAAE,UAAU,CAAC,EAAE,CAAC;YAClF,MAAM,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QAC/B,CAAC;IACH,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,KAAgB;QAChC,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QACnC,IAAI,CAAC,MAAM;YAAE,MAAM,IAAI,KAAK,CAAC,8BAA8B,KAAK,EAAE,CAAC,CAAC;QACpE,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,GAAG,CAC1B,UAAU,MAAM,QAAQ,EACxB,2CAA2C,CAC5C,CAAC;QACF,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9C,CAAC;IAED,KAAK,CAAC,OAAO;QACX,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,GAAG,CAC1B,WAAW,IAAI,CAAC,OAAO,QAAQ,EAC/B,2CAA2C,CAC5C,CAAC;QACF,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;IACpD,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,GAAW;QACxB,mDAAmD;QACnD,iCAAiC;QACjC,KAAK,MAAM,KAAK,IAAI,UAAU,EAAE,CAAC;YAC/B,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;YAC5C,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC;YAC/C,IAAI,KAAK;gBAAE,OAAO,KAAK,CAAC;QAC1B,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,GAAW,EAAE,WAAsB;QAC5C,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QACzC,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;QACzC,MAAM,IAAI,CAAC,GAAG,CAAC,UAAU,IAAI,CAAC,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IAC1D,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,GAAW,EAAE,KAAa;QACvC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QACzC,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QAC9C,kCAAkC;QAClC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,GAAG,CAAa,UAAU,IAAI,CAAC,EAAE,EAAE,EAAE,eAAe,CAAC,CAAC;QAClF,IAAI,CAAC,QAAQ,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,OAAO,CAAC;YAAE,OAAO;QAClE,MAAM,IAAI,CAAC,IAAI,CAAC,UAAU,IAAI,CAAC,EAAE,WAAW,EAAE,EAAE,KAAK,EAAE,OAAO,EAAuC,CAAC,CAAC;IACzG,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,GAAW,EAAE,KAAa;QAC1C,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QACzC,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QAC9C,IAAI,CAAC,OAAO;YAAE,OAAO;QACrB,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,GAAG,CAAC,UAAU,IAAI,CAAC,EAAE,aAAa,OAAO,EAAE,CAAC,CAAC;QAC1D,CAAC;QAAC,MAAM,CAAC;YACP,sCAAsC;QACxC,CAAC;IACH,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,GAAW,EAAE,UAAkB;QACzC,8DAA8D;QAC9D,MAAM,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE;YACxB,MAAM,EAAE,SAAS;YACjB,MAAM,EAAE,UAAU;YAClB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACpC,CAAC,CAAC;QACH,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;IACtC,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,GAAW;QAC5B,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QAC1C,MAAM,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE;YACxB,GAAG,QAAQ;YACX,MAAM,EAAE,UAAU;YAClB,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACrC,CAAC,CAAC;QACH,MAAM,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;IACzC,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,GAAW,EAAE,IAAY;QACrC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QACzC,MAAM,IAAI,CAAC,IAAI,CAAC,UAAU,IAAI,CAAC,EAAE,mBAAmB,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;IAClE,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,IAAY,EAAE,IAAY,EAAE,KAAgB;QACvD,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QACnC,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,IAAI,CAAa,QAAQ,EAAE;YAC/C,IAAI;YACJ,IAAI;YACJ,MAAM,EAAE,MAAM;SACf,CAAC,CAAC;QACH,OAAO,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;IAC7B,CAAC;IAED,iEAAiE;IAEjE,KAAK,CAAC,eAAe,CAAC,GAAW,EAAE,KAAe;QAChD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QACzC,qCAAqC;QACrC,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,IAAI,CAAiB,UAAU,IAAI,CAAC,EAAE,aAAa,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;QACrG,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,IAAI,CAAC,IAAI,CAAC,eAAe,SAAS,CAAC,EAAE,aAAa,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QAC5E,CAAC;IACH,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,GAAW;QAC7B,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QACzC,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,GAAG,CAAoB,UAAU,IAAI,CAAC,EAAE,aAAa,CAAC,CAAC;QACrF,MAAM,KAAK,GAAqD,EAAE,CAAC;QACnE,KAAK,MAAM,EAAE,IAAI,UAAU,EAAE,CAAC;YAC5B,KAAK,MAAM,EAAE,IAAI,EAAE,CAAC,UAAU,IAAI,EAAE,EAAE,CAAC;gBACrC,KAAK,CAAC,IAAI,CAAC;oBACT,EAAE,EAAE,EAAE,CAAC,EAAE;oBACT,IAAI,EAAE,EAAE,CAAC,IAAI;oBACb,OAAO,EAAE,EAAE,CAAC,KAAK,KAAK,UAAU;iBACjC,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,GAAW,EAAE,MAAc;QAC9C,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QACzC,sCAAsC;QACtC,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,GAAG,CAAoB,UAAU,IAAI,CAAC,EAAE,aAAa,CAAC,CAAC;QACrF,KAAK,MAAM,EAAE,IAAI,UAAU,EAAE,CAAC;YAC5B,MAAM,IAAI,GAAG,CAAC,EAAE,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,MAAM,CAAC,CAAC;YAClE,IAAI,IAAI,EAAE,CAAC;gBACT,MAAM,IAAI,CAAC,GAAG,CAAC,UAAU,IAAI,CAAC,EAAE,cAAc,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,CAAC;gBAC/E,OAAO;YACT,CAAC;QACH,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,kBAAkB,MAAM,YAAY,CAAC,CAAC;IACxD,CAAC;IAED,KAAK,CAAC,gBAAgB,CAAC,GAAW,EAAE,MAAc;QAChD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QACzC,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,GAAG,CAAoB,UAAU,IAAI,CAAC,EAAE,aAAa,CAAC,CAAC;QACrF,KAAK,MAAM,EAAE,IAAI,UAAU,EAAE,CAAC;YAC5B,MAAM,IAAI,GAAG,CAAC,EAAE,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,MAAM,CAAC,CAAC;YAClE,IAAI,IAAI,EAAE,CAAC;gBACT,MAAM,IAAI,CAAC,GAAG,CAAC,UAAU,IAAI,CAAC,EAAE,cAAc,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC,CAAC;gBACjF,OAAO;YACT,CAAC;QACH,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,kBAAkB,MAAM,YAAY,CAAC,CAAC;IACxD,CAAC;IAED,iEAAiE;IAEjE,KAAK,CAAC,QAAQ,CAAC,GAAW;QACxB,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QACzC,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,GAAG,CAC5B,UAAU,IAAI,CAAC,EAAE,UAAU,EAC3B,oBAAoB,CACrB,CAAC;QACF,6CAA6C;QAC7C,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,EAAE,IAAI,IAAI,EAAE,CAAC;YACrC,IAAI,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC;gBACrC,IAAI,CAAC;oBACH,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;gBAC9D,CAAC;gBAAC,MAAM,CAAC;gBACT,CAAC;YACH,CAAC;QACH,CAAC;QACD,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,GAAW,EAAE,IAA6B;QACxD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QACzC,MAAM,IAAI,GAAG,iBAAiB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;QAErD,wCAAwC;QACxC,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,GAAG,CAC5B,UAAU,IAAI,CAAC,EAAE,UAAU,EAC3B,oBAAoB,CACrB,CAAC;QACF,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC;gBAC1D,IAAI,CAAC;oBACH,MAAM,IAAI,CAAC,GAAG,CAAC,UAAU,IAAI,CAAC,EAAE,YAAY,MAAM,CAAC,EAAE,WAAW,CAAC,CAAC;gBACpE,CAAC;gBAAC,MAAM,CAAC;oBACP,4CAA4C;gBAC9C,CAAC;YACH,CAAC;QACH,CAAC;QAED,MAAM,IAAI,CAAC,IAAI,CAAC,UAAU,IAAI,CAAC,EAAE,mBAAmB,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;IAClE,CAAC;IAED,iEAAiE;IAEzD,KAAK,CAAC,WAAW,CAAC,GAAW;QACnC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QACtC,IAAI,CAAC,IAAI;YAAE,MAAM,IAAI,KAAK,CAAC,4BAA4B,GAAG,YAAY,CAAC,CAAC;QACxE,OAAO,IAAI,CAAC;IACd,CAAC;IAEO,KAAK,CAAC,WAAW,CAAC,IAAY;QACpC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QAC9C,IAAI,QAAQ;YAAE,OAAO,QAAQ,CAAC;QAC9B,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,IAAI,CAC3B,WAAW,IAAI,CAAC,OAAO,SAAS,EAChC,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,CACzB,CAAC;QACF,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC,aAAa;QACrC,OAAO,KAAK,CAAC,EAAE,CAAC;IAClB,CAAC;IAEO,KAAK,CAAC,WAAW,CAAC,IAAY;QACpC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;YACrB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,GAAG,CAC3B,WAAW,IAAI,CAAC,OAAO,SAAS,CACjC,CAAC;YACF,IAAI,CAAC,UAAU,GAAG,IAAI,GAAG,EAAE,CAAC;YAC5B,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;gBACvB,IAAI,CAAC,CAAC,IAAI;oBAAE,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;YAChD,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC;IAC3C,CAAC;CACF;AAuBD,SAAS,QAAQ,CAAC,GAA2B,EAAE,GAAW;IACxD,MAAM,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;IACrB,IAAI,CAAC,GAAG;QAAE,MAAM,IAAI,KAAK,CAAC,kCAAkC,GAAG,EAAE,CAAC,CAAC;IACnE,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=acp-fs-handlers.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"acp-fs-handlers.test.d.ts","sourceRoot":"","sources":["../../../src/providers/adapters/acp-fs-handlers.test.ts"],"names":[],"mappings":""}
@@ -1,80 +0,0 @@
1
- /**
2
- * @module acp-fs-handlers.test
3
- * @description ACP 文件系统处理器的单元测试
4
- *
5
- * @author eddy
6
- * @organization wykj
7
- * @ownership wykj/eddy
8
- *
9
- * @created 2026-03-31
10
- * @updated 2026-04-03
11
- *
12
- * @role test-setup
13
- * @layer provider
14
- * @boundedContext acp
15
- */
16
- import { mkdirSync, readFileSync, rmSync, writeFileSync } from 'node:fs';
17
- import { join } from 'node:path';
18
- import { afterEach, beforeEach, describe, expect, it } from 'vitest';
19
- import { FileSystemHandlers } from './acp-fs-handlers.js';
20
- const TEST_DIR = '/tmp/sps-acp-fs-test';
21
- beforeEach(() => {
22
- mkdirSync(TEST_DIR, { recursive: true });
23
- writeFileSync(join(TEST_DIR, 'hello.txt'), 'line1\nline2\nline3\nline4\nline5\n');
24
- });
25
- afterEach(() => {
26
- rmSync(TEST_DIR, { recursive: true, force: true });
27
- });
28
- describe('FileSystemHandlers', () => {
29
- describe('readTextFile', () => {
30
- it('reads entire file', async () => {
31
- const fs = new FileSystemHandlers({ cwd: TEST_DIR, permissionMode: 'approve-all' });
32
- const result = await fs.readTextFile({ path: join(TEST_DIR, 'hello.txt') });
33
- expect(result.content).toBe('line1\nline2\nline3\nline4\nline5\n');
34
- });
35
- it('slices by line and limit', async () => {
36
- const fs = new FileSystemHandlers({ cwd: TEST_DIR, permissionMode: 'approve-all' });
37
- const result = await fs.readTextFile({ path: join(TEST_DIR, 'hello.txt'), line: 2, limit: 2 });
38
- expect(result.content).toBe('line2\nline3');
39
- });
40
- it('slices from line without limit', async () => {
41
- const fs = new FileSystemHandlers({ cwd: TEST_DIR, permissionMode: 'approve-all' });
42
- const result = await fs.readTextFile({ path: join(TEST_DIR, 'hello.txt'), line: 4 });
43
- expect(result.content).toBe('line4\nline5\n');
44
- });
45
- it('rejects path outside cwd', async () => {
46
- const fs = new FileSystemHandlers({ cwd: TEST_DIR, permissionMode: 'approve-all' });
47
- await expect(fs.readTextFile({ path: '/etc/passwd' })).rejects.toThrow('outside');
48
- });
49
- it('rejects relative path', async () => {
50
- const fs = new FileSystemHandlers({ cwd: TEST_DIR, permissionMode: 'approve-all' });
51
- await expect(fs.readTextFile({ path: 'hello.txt' })).rejects.toThrow('absolute');
52
- });
53
- it('denies in deny-all mode', async () => {
54
- const fs = new FileSystemHandlers({ cwd: TEST_DIR, permissionMode: 'deny-all' });
55
- await expect(fs.readTextFile({ path: join(TEST_DIR, 'hello.txt') })).rejects.toThrow('denied');
56
- });
57
- });
58
- describe('writeTextFile', () => {
59
- it('writes file', async () => {
60
- const fs = new FileSystemHandlers({ cwd: TEST_DIR, permissionMode: 'approve-all' });
61
- await fs.writeTextFile({ path: join(TEST_DIR, 'out.txt'), content: 'hello' });
62
- expect(readFileSync(join(TEST_DIR, 'out.txt'), 'utf-8')).toBe('hello');
63
- });
64
- it('creates parent directories', async () => {
65
- const fs = new FileSystemHandlers({ cwd: TEST_DIR, permissionMode: 'approve-all' });
66
- const nested = join(TEST_DIR, 'sub', 'dir', 'file.txt');
67
- await fs.writeTextFile({ path: nested, content: 'nested' });
68
- expect(readFileSync(nested, 'utf-8')).toBe('nested');
69
- });
70
- it('rejects path outside cwd', async () => {
71
- const fs = new FileSystemHandlers({ cwd: TEST_DIR, permissionMode: 'approve-all' });
72
- await expect(fs.writeTextFile({ path: '/tmp/outside.txt', content: 'x' })).rejects.toThrow('outside');
73
- });
74
- it('denies in deny-all mode', async () => {
75
- const fs = new FileSystemHandlers({ cwd: TEST_DIR, permissionMode: 'deny-all' });
76
- await expect(fs.writeTextFile({ path: join(TEST_DIR, 'x.txt'), content: 'x' })).rejects.toThrow('denied');
77
- });
78
- });
79
- });
80
- //# sourceMappingURL=acp-fs-handlers.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"acp-fs-handlers.test.js","sourceRoot":"","sources":["../../../src/providers/adapters/acp-fs-handlers.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=acp-permissions.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"acp-permissions.test.d.ts","sourceRoot":"","sources":["../../../src/providers/adapters/acp-permissions.test.ts"],"names":[],"mappings":""}
@@ -1,103 +0,0 @@
1
- /**
2
- * @module acp-permissions.test
3
- * @description ACP 权限解析器的单元测试
4
- *
5
- * @author eddy
6
- * @organization wykj
7
- * @ownership wykj/eddy
8
- *
9
- * @created 2026-03-31
10
- * @updated 2026-04-03
11
- *
12
- * @role test-setup
13
- * @layer provider
14
- * @boundedContext acp
15
- */
16
- import { describe, expect, it } from 'vitest';
17
- import { inferToolKind, resolvePermission } from './acp-permissions.js';
18
- function makeParams(kind, title, options) {
19
- return {
20
- sessionId: 'test-session',
21
- toolCall: {
22
- toolCallId: 'tc-1',
23
- title: title ?? 'Test tool',
24
- kind: kind ?? undefined,
25
- status: 'pending',
26
- },
27
- options: options ?? [
28
- { optionId: 'allow', kind: 'allow_once', name: 'Allow' },
29
- { optionId: 'reject', kind: 'reject_once', name: 'Reject' },
30
- ],
31
- };
32
- }
33
- describe('resolvePermission', () => {
34
- it('approve-all: selects allow_once', () => {
35
- const result = resolvePermission(makeParams('edit'), 'approve-all');
36
- expect(result.outcome).toEqual({ outcome: 'selected', optionId: 'allow' });
37
- });
38
- it('approve-all: selects first option if no allow_once', () => {
39
- const params = makeParams('edit', 'Test', [
40
- { optionId: 'custom', kind: 'reject_once', name: 'Custom' },
41
- ]);
42
- const result = resolvePermission(params, 'approve-all');
43
- expect(result.outcome).toEqual({ outcome: 'selected', optionId: 'custom' });
44
- });
45
- it('deny-all: selects reject_once', () => {
46
- const result = resolvePermission(makeParams('edit'), 'deny-all');
47
- expect(result.outcome).toEqual({ outcome: 'selected', optionId: 'reject' });
48
- });
49
- it('deny-all: cancels if no reject option', () => {
50
- const params = makeParams('edit', 'Test', [
51
- { optionId: 'allow', kind: 'allow_once', name: 'Allow' },
52
- ]);
53
- const result = resolvePermission(params, 'deny-all');
54
- expect(result.outcome).toEqual({ outcome: 'cancelled' });
55
- });
56
- it('approve-reads: auto-approves read kind', () => {
57
- const result = resolvePermission(makeParams('read'), 'approve-reads');
58
- expect(result.outcome).toEqual({ outcome: 'selected', optionId: 'allow' });
59
- });
60
- it('approve-reads: auto-approves search kind', () => {
61
- const result = resolvePermission(makeParams('search'), 'approve-reads');
62
- expect(result.outcome).toEqual({ outcome: 'selected', optionId: 'allow' });
63
- });
64
- it('approve-reads: auto-approves non-read kind (SPS unattended)', () => {
65
- const result = resolvePermission(makeParams('edit'), 'approve-reads');
66
- expect(result.outcome).toEqual({ outcome: 'selected', optionId: 'allow' });
67
- });
68
- it('cancels when options array is empty', () => {
69
- const params = makeParams('edit', 'Test', []);
70
- const result = resolvePermission(params, 'approve-all');
71
- expect(result.outcome).toEqual({ outcome: 'cancelled' });
72
- });
73
- });
74
- describe('inferToolKind', () => {
75
- it('returns toolCall.kind when set', () => {
76
- expect(inferToolKind({ toolCall: { kind: 'edit' } })).toBe('edit');
77
- });
78
- it('infers read from title', () => {
79
- expect(inferToolKind({ toolCall: { title: 'Read src/main.ts' } })).toBe('read');
80
- });
81
- it('infers search from grep', () => {
82
- expect(inferToolKind({ toolCall: { title: 'grep -i "pattern"' } })).toBe('search');
83
- });
84
- it('infers edit from write', () => {
85
- expect(inferToolKind({ toolCall: { title: 'Write result.txt' } })).toBe('edit');
86
- });
87
- it('infers execute from bash/run', () => {
88
- expect(inferToolKind({ toolCall: { title: 'Run npm test' } })).toBe('execute');
89
- });
90
- it('infers delete from remove', () => {
91
- expect(inferToolKind({ toolCall: { title: 'Remove old files' } })).toBe('delete');
92
- });
93
- it('infers fetch from http', () => {
94
- expect(inferToolKind({ toolCall: { title: 'fetch https://api.com' } })).toBe('fetch');
95
- });
96
- it('returns other for unknown title', () => {
97
- expect(inferToolKind({ toolCall: { title: 'Do something' } })).toBe('other');
98
- });
99
- it('returns undefined when no kind and no title', () => {
100
- expect(inferToolKind({ toolCall: {} })).toBeUndefined();
101
- });
102
- });
103
- //# sourceMappingURL=acp-permissions.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"acp-permissions.test.js","sourceRoot":"","sources":["../../../src/providers/adapters/acp-permissions.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=acp-session-accumulator.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"acp-session-accumulator.test.d.ts","sourceRoot":"","sources":["../../../src/providers/adapters/acp-session-accumulator.test.ts"],"names":[],"mappings":""}
@@ -1,88 +0,0 @@
1
- /**
2
- * @module acp-session-accumulator.test
3
- * @description ACP 会话更新累加器的单元测试
4
- *
5
- * @author eddy
6
- * @organization wykj
7
- * @ownership wykj/eddy
8
- *
9
- * @created 2026-03-31
10
- * @updated 2026-04-03
11
- *
12
- * @role test-setup
13
- * @layer provider
14
- * @boundedContext acp
15
- */
16
- import { describe, expect, it } from 'vitest';
17
- import { SessionUpdateAccumulator } from './acp-session-accumulator.js';
18
- describe('SessionUpdateAccumulator', () => {
19
- it('accumulates agent_message_chunk text', () => {
20
- const acc = new SessionUpdateAccumulator();
21
- acc.handleUpdate({ sessionUpdate: 'agent_message_chunk', content: { type: 'text', text: 'Hello ' } });
22
- acc.handleUpdate({ sessionUpdate: 'agent_message_chunk', content: { type: 'text', text: 'World' } });
23
- expect(acc.getRecentText()).toBe('Hello World');
24
- });
25
- it('tracks tool_call lifecycle', () => {
26
- const acc = new SessionUpdateAccumulator();
27
- acc.handleUpdate({
28
- sessionUpdate: 'tool_call',
29
- toolCallId: 'tc-1',
30
- title: 'Read file',
31
- kind: 'read',
32
- status: 'pending',
33
- });
34
- expect(acc.activeToolCalls).toBe(1);
35
- acc.handleUpdate({
36
- sessionUpdate: 'tool_call_update',
37
- toolCallId: 'tc-1',
38
- status: 'completed',
39
- });
40
- expect(acc.activeToolCalls).toBe(0);
41
- });
42
- it('tracks multiple tool calls', () => {
43
- const acc = new SessionUpdateAccumulator();
44
- acc.handleUpdate({ sessionUpdate: 'tool_call', toolCallId: 'tc-1', title: 'A', kind: 'read', status: 'pending' });
45
- acc.handleUpdate({ sessionUpdate: 'tool_call', toolCallId: 'tc-2', title: 'B', kind: 'edit', status: 'pending' });
46
- expect(acc.activeToolCalls).toBe(2);
47
- acc.handleUpdate({ sessionUpdate: 'tool_call_update', toolCallId: 'tc-1', status: 'completed' });
48
- expect(acc.activeToolCalls).toBe(1);
49
- acc.handleUpdate({ sessionUpdate: 'tool_call_update', toolCallId: 'tc-2', status: 'failed' });
50
- expect(acc.activeToolCalls).toBe(0);
51
- });
52
- it('truncates getRecentText to maxChars', () => {
53
- const acc = new SessionUpdateAccumulator();
54
- acc.handleUpdate({ sessionUpdate: 'agent_message_chunk', content: { type: 'text', text: 'A'.repeat(5000) } });
55
- expect(acc.getRecentText(100).length).toBe(100);
56
- });
57
- it('updates lastUpdateAt on every event', () => {
58
- const acc = new SessionUpdateAccumulator();
59
- expect(acc.lastUpdateAt).toBeNull();
60
- acc.handleUpdate({ sessionUpdate: 'agent_message_chunk', content: { type: 'text', text: 'hi' } });
61
- expect(acc.lastUpdateAt).toBeDefined();
62
- expect(typeof acc.lastUpdateAt).toBe('string');
63
- });
64
- it('reset clears all state', () => {
65
- const acc = new SessionUpdateAccumulator();
66
- acc.handleUpdate({ sessionUpdate: 'agent_message_chunk', content: { type: 'text', text: 'hi' } });
67
- acc.handleUpdate({ sessionUpdate: 'tool_call', toolCallId: 'tc-1', title: 'X', kind: 'read', status: 'pending' });
68
- acc.stopReason = 'end_turn';
69
- acc.hasPendingPermission = true;
70
- acc.reset();
71
- expect(acc.getRecentText()).toBe('');
72
- expect(acc.activeToolCalls).toBe(0);
73
- expect(acc.stopReason).toBeNull();
74
- expect(acc.hasPendingPermission).toBe(false);
75
- expect(acc.lastUpdateAt).toBeNull();
76
- });
77
- it('ignores non-text content in agent_message_chunk', () => {
78
- const acc = new SessionUpdateAccumulator();
79
- acc.handleUpdate({ sessionUpdate: 'agent_message_chunk', content: { type: 'image', source: {} } });
80
- expect(acc.getRecentText()).toBe('');
81
- });
82
- it('handles unknown sessionUpdate types gracefully', () => {
83
- const acc = new SessionUpdateAccumulator();
84
- acc.handleUpdate({ sessionUpdate: 'usage_update', used: 100, size: 200000 });
85
- expect(acc.lastUpdateAt).toBeDefined(); // still updates timestamp
86
- });
87
- });
88
- //# sourceMappingURL=acp-session-accumulator.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"acp-session-accumulator.test.js","sourceRoot":"","sources":["../../../src/providers/adapters/acp-session-accumulator.test.ts"],"names":[],"mappings":"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"}