@cat-factory/worker 0.129.0 → 0.131.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +13 -1
- package/dist/index.js.map +1 -1
- package/dist/infrastructure/container-assembly.d.ts.map +1 -1
- package/dist/infrastructure/container-assembly.js +43 -28
- package/dist/infrastructure/container-assembly.js.map +1 -1
- package/dist/infrastructure/container-shared-services.d.ts +49 -0
- package/dist/infrastructure/container-shared-services.d.ts.map +1 -0
- package/dist/infrastructure/container-shared-services.js +130 -0
- package/dist/infrastructure/container-shared-services.js.map +1 -0
- package/dist/infrastructure/container.d.ts +60 -3
- package/dist/infrastructure/container.d.ts.map +1 -1
- package/dist/infrastructure/container.js +53 -117
- package/dist/infrastructure/container.js.map +1 -1
- package/dist/infrastructure/repositories/D1FoundationalServiceRepository.d.ts +38 -0
- package/dist/infrastructure/repositories/D1FoundationalServiceRepository.d.ts.map +1 -0
- package/dist/infrastructure/repositories/D1FoundationalServiceRepository.js +280 -0
- package/dist/infrastructure/repositories/D1FoundationalServiceRepository.js.map +1 -0
- package/dist/infrastructure/repositories/D1WorkspaceSettingsRepository.d.ts.map +1 -1
- package/dist/infrastructure/repositories/D1WorkspaceSettingsRepository.js +9 -4
- package/dist/infrastructure/repositories/D1WorkspaceSettingsRepository.js.map +1 -1
- package/dist/infrastructure/workflows/ExecutionWorkflow.d.ts.map +1 -1
- package/dist/infrastructure/workflows/ExecutionWorkflow.js +110 -84
- package/dist/infrastructure/workflows/ExecutionWorkflow.js.map +1 -1
- package/migrations/0073_foundational_services.sql +84 -0
- package/migrations/0073_workspace_metadata.sql +9 -0
- package/package.json +18 -18
|
@@ -0,0 +1,280 @@
|
|
|
1
|
+
// D1-backed stores for the foundational-services catalog (migration 0073). The Drizzle mirrors
|
|
2
|
+
// live in `runtimes/node/src/repositories/foundationalServices.ts`; the two are kept honest by
|
|
3
|
+
// the conformance suite's foundational-services assertions.
|
|
4
|
+
/**
|
|
5
|
+
* How many service ids ride ONE `IN (…)` of the lazy contract read. D1 binds parameters
|
|
6
|
+
* positionally with a per-statement ceiling, so a design that declared many services is chunked
|
|
7
|
+
* rather than issued as a query per id (which is the banned N+1) or as one over-long statement.
|
|
8
|
+
*/
|
|
9
|
+
const ID_CHUNK = 50;
|
|
10
|
+
function toServiceRecord(row) {
|
|
11
|
+
return {
|
|
12
|
+
serviceId: row.service_id,
|
|
13
|
+
ownerKind: row.owner_kind,
|
|
14
|
+
ownerId: row.owner_id,
|
|
15
|
+
name: row.name,
|
|
16
|
+
summary: row.summary,
|
|
17
|
+
description: row.description,
|
|
18
|
+
capabilities: parseStringArray(row.capabilities),
|
|
19
|
+
sourceId: row.source_id,
|
|
20
|
+
sourcePath: row.source_path,
|
|
21
|
+
pinnedCommit: row.pinned_commit,
|
|
22
|
+
createdAt: row.created_at,
|
|
23
|
+
updatedAt: row.updated_at,
|
|
24
|
+
deletedAt: row.deleted_at,
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* A JSON `string[]` column, read LENIENTLY. A malformed value degrades to `[]` rather than
|
|
29
|
+
* throwing: these columns are written only by our own repos, so a bad value means a hand edit or
|
|
30
|
+
* a partially-applied migration, and failing the whole catalog read over one row's tags would
|
|
31
|
+
* take down every design dispatch in the workspace.
|
|
32
|
+
*/
|
|
33
|
+
function parseStringArray(value) {
|
|
34
|
+
if (!value)
|
|
35
|
+
return [];
|
|
36
|
+
try {
|
|
37
|
+
const parsed = JSON.parse(value);
|
|
38
|
+
return Array.isArray(parsed) ? parsed.filter((v) => typeof v === 'string') : [];
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
// silent-catch-ok: see the note above — a malformed tag list reads as no tags, and the row
|
|
42
|
+
// it belongs to is still served.
|
|
43
|
+
return [];
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
export class D1FoundationalServiceRepository {
|
|
47
|
+
db;
|
|
48
|
+
constructor({ db }) {
|
|
49
|
+
this.db = db;
|
|
50
|
+
}
|
|
51
|
+
async listByOwner(ownerKind, ownerId, includeDeleted = false) {
|
|
52
|
+
const where = includeDeleted ? '' : ' AND deleted_at IS NULL';
|
|
53
|
+
const { results } = await this.db
|
|
54
|
+
.prepare(`SELECT * FROM foundational_services WHERE owner_kind = ? AND owner_id = ?${where} ORDER BY service_id`)
|
|
55
|
+
.bind(ownerKind, ownerId)
|
|
56
|
+
.all();
|
|
57
|
+
return results.map(toServiceRecord);
|
|
58
|
+
}
|
|
59
|
+
async get(ownerKind, ownerId, serviceId) {
|
|
60
|
+
const row = await this.db
|
|
61
|
+
.prepare('SELECT * FROM foundational_services WHERE owner_kind = ? AND owner_id = ? AND service_id = ?')
|
|
62
|
+
.bind(ownerKind, ownerId, serviceId)
|
|
63
|
+
.first();
|
|
64
|
+
return row ? toServiceRecord(row) : null;
|
|
65
|
+
}
|
|
66
|
+
async upsert(record) {
|
|
67
|
+
await this.db
|
|
68
|
+
.prepare(`INSERT INTO foundational_services
|
|
69
|
+
(service_id, owner_kind, owner_id, name, summary, description, capabilities,
|
|
70
|
+
source_id, source_path, pinned_commit, created_at, updated_at, deleted_at)
|
|
71
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
72
|
+
ON CONFLICT (owner_kind, owner_id, service_id) DO UPDATE SET
|
|
73
|
+
name = excluded.name,
|
|
74
|
+
summary = excluded.summary,
|
|
75
|
+
description = excluded.description,
|
|
76
|
+
capabilities = excluded.capabilities,
|
|
77
|
+
source_id = excluded.source_id,
|
|
78
|
+
source_path = excluded.source_path,
|
|
79
|
+
pinned_commit = excluded.pinned_commit,
|
|
80
|
+
updated_at = excluded.updated_at,
|
|
81
|
+
deleted_at = excluded.deleted_at`)
|
|
82
|
+
.bind(record.serviceId, record.ownerKind, record.ownerId, record.name, record.summary, record.description, JSON.stringify(record.capabilities), record.sourceId, record.sourcePath, record.pinnedCommit, record.createdAt, record.updatedAt, record.deletedAt)
|
|
83
|
+
.run();
|
|
84
|
+
}
|
|
85
|
+
async softDelete(ownerKind, ownerId, serviceId, at) {
|
|
86
|
+
await this.db
|
|
87
|
+
.prepare('UPDATE foundational_services SET deleted_at = ?, updated_at = ? WHERE owner_kind = ? AND owner_id = ? AND service_id = ?')
|
|
88
|
+
.bind(at, at, ownerKind, ownerId, serviceId)
|
|
89
|
+
.run();
|
|
90
|
+
}
|
|
91
|
+
async listBySource(sourceId) {
|
|
92
|
+
const { results } = await this.db
|
|
93
|
+
.prepare('SELECT * FROM foundational_services WHERE source_id = ? AND deleted_at IS NULL ORDER BY service_id')
|
|
94
|
+
.bind(sourceId)
|
|
95
|
+
.all();
|
|
96
|
+
return results.map(toServiceRecord);
|
|
97
|
+
}
|
|
98
|
+
async softDeleteBySource(sourceId, at) {
|
|
99
|
+
await this.db
|
|
100
|
+
.prepare('UPDATE foundational_services SET deleted_at = ?, updated_at = ? WHERE source_id = ? AND deleted_at IS NULL')
|
|
101
|
+
.bind(at, at, sourceId)
|
|
102
|
+
.run();
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
export class D1ApiContractRepository {
|
|
106
|
+
db;
|
|
107
|
+
constructor({ db }) {
|
|
108
|
+
this.db = db;
|
|
109
|
+
}
|
|
110
|
+
async listManifestByOwner(ownerKind, ownerId) {
|
|
111
|
+
// `length(body)` rather than `body`: the whole point of the manifest is that a catalog read
|
|
112
|
+
// never transfers a document. SQLite's `length()` on TEXT counts characters, which is what
|
|
113
|
+
// the size is compared against everywhere else (`body.length` in JS).
|
|
114
|
+
const { results } = await this.db
|
|
115
|
+
.prepare(`SELECT service_id, contract_id, format, title, length(body) AS size,
|
|
116
|
+
operations, omitted_operations, source_path
|
|
117
|
+
FROM api_contracts
|
|
118
|
+
WHERE owner_kind = ? AND owner_id = ?
|
|
119
|
+
ORDER BY service_id, contract_id`)
|
|
120
|
+
.bind(ownerKind, ownerId)
|
|
121
|
+
.all();
|
|
122
|
+
return results.map((row) => ({
|
|
123
|
+
serviceId: row.service_id,
|
|
124
|
+
contractId: row.contract_id,
|
|
125
|
+
format: row.format,
|
|
126
|
+
title: row.title,
|
|
127
|
+
size: row.size,
|
|
128
|
+
operations: parseStringArray(row.operations),
|
|
129
|
+
omittedOperations: row.omitted_operations,
|
|
130
|
+
sourcePath: row.source_path,
|
|
131
|
+
}));
|
|
132
|
+
}
|
|
133
|
+
async listByServiceIds(ownerKind, ownerId, serviceIds) {
|
|
134
|
+
const ids = [...new Set(serviceIds)].filter(Boolean);
|
|
135
|
+
if (ids.length === 0)
|
|
136
|
+
return [];
|
|
137
|
+
const out = [];
|
|
138
|
+
for (let i = 0; i < ids.length; i += ID_CHUNK) {
|
|
139
|
+
const chunk = ids.slice(i, i + ID_CHUNK);
|
|
140
|
+
const placeholders = chunk.map(() => '?').join(', ');
|
|
141
|
+
const { results } = await this.db
|
|
142
|
+
.prepare(`SELECT * FROM api_contracts
|
|
143
|
+
WHERE owner_kind = ? AND owner_id = ? AND service_id IN (${placeholders})
|
|
144
|
+
ORDER BY service_id, contract_id`)
|
|
145
|
+
.bind(ownerKind, ownerId, ...chunk)
|
|
146
|
+
.all();
|
|
147
|
+
for (const row of results)
|
|
148
|
+
out.push(toContractRecord(row));
|
|
149
|
+
}
|
|
150
|
+
return out;
|
|
151
|
+
}
|
|
152
|
+
async replaceForService(ownerKind, ownerId, serviceId, contracts) {
|
|
153
|
+
// One BATCH so the delete and the inserts land together: a reader between the two would
|
|
154
|
+
// otherwise see a service whose contracts had vanished, which the catalog renders as a
|
|
155
|
+
// service with no interface rather than as a write in progress.
|
|
156
|
+
const statements = [
|
|
157
|
+
this.db
|
|
158
|
+
.prepare('DELETE FROM api_contracts WHERE owner_kind = ? AND owner_id = ? AND service_id = ?')
|
|
159
|
+
.bind(ownerKind, ownerId, serviceId),
|
|
160
|
+
...contracts.map((contract) => this.db
|
|
161
|
+
.prepare(`INSERT INTO api_contracts
|
|
162
|
+
(owner_kind, owner_id, service_id, contract_id, format, title, body,
|
|
163
|
+
operations, omitted_operations, source_path, source_sha, created_at, updated_at)
|
|
164
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`)
|
|
165
|
+
.bind(ownerKind, ownerId, serviceId, contract.contractId, contract.format, contract.title, contract.body, JSON.stringify(contract.operations), contract.omittedOperations, contract.sourcePath, contract.sourceSha, contract.createdAt, contract.updatedAt)),
|
|
166
|
+
];
|
|
167
|
+
await this.db.batch(statements);
|
|
168
|
+
}
|
|
169
|
+
async deleteForService(ownerKind, ownerId, serviceId) {
|
|
170
|
+
await this.db
|
|
171
|
+
.prepare('DELETE FROM api_contracts WHERE owner_kind = ? AND owner_id = ? AND service_id = ?')
|
|
172
|
+
.bind(ownerKind, ownerId, serviceId)
|
|
173
|
+
.run();
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
function toContractRecord(row) {
|
|
177
|
+
return {
|
|
178
|
+
ownerKind: row.owner_kind,
|
|
179
|
+
ownerId: row.owner_id,
|
|
180
|
+
serviceId: row.service_id,
|
|
181
|
+
contractId: row.contract_id,
|
|
182
|
+
format: row.format,
|
|
183
|
+
title: row.title,
|
|
184
|
+
body: row.body,
|
|
185
|
+
operations: parseStringArray(row.operations),
|
|
186
|
+
omittedOperations: row.omitted_operations,
|
|
187
|
+
sourcePath: row.source_path,
|
|
188
|
+
sourceSha: row.source_sha,
|
|
189
|
+
createdAt: row.created_at,
|
|
190
|
+
updatedAt: row.updated_at,
|
|
191
|
+
};
|
|
192
|
+
}
|
|
193
|
+
function toSourceRecord(row) {
|
|
194
|
+
return {
|
|
195
|
+
id: row.id,
|
|
196
|
+
ownerKind: row.owner_kind,
|
|
197
|
+
ownerId: row.owner_id,
|
|
198
|
+
repoOwner: row.repo_owner,
|
|
199
|
+
repoName: row.repo_name,
|
|
200
|
+
gitRef: row.git_ref,
|
|
201
|
+
mode: row.mode,
|
|
202
|
+
dirPath: row.dir_path,
|
|
203
|
+
filePaths: parseStringArray(row.file_paths),
|
|
204
|
+
serviceId: row.service_id,
|
|
205
|
+
serviceName: row.service_name,
|
|
206
|
+
serviceSummary: row.service_summary,
|
|
207
|
+
lastSyncedCommit: row.last_synced_commit,
|
|
208
|
+
lastSyncedAt: row.last_synced_at,
|
|
209
|
+
createdAt: row.created_at,
|
|
210
|
+
deletedAt: row.deleted_at,
|
|
211
|
+
};
|
|
212
|
+
}
|
|
213
|
+
export class D1FoundationalServiceSourceRepository {
|
|
214
|
+
db;
|
|
215
|
+
constructor({ db }) {
|
|
216
|
+
this.db = db;
|
|
217
|
+
}
|
|
218
|
+
async listByOwner(ownerKind, ownerId) {
|
|
219
|
+
const { results } = await this.db
|
|
220
|
+
.prepare('SELECT * FROM foundational_service_sources WHERE owner_kind = ? AND owner_id = ? AND deleted_at IS NULL ORDER BY created_at DESC')
|
|
221
|
+
.bind(ownerKind, ownerId)
|
|
222
|
+
.all();
|
|
223
|
+
return results.map(toSourceRecord);
|
|
224
|
+
}
|
|
225
|
+
async get(id) {
|
|
226
|
+
const row = await this.db
|
|
227
|
+
.prepare('SELECT * FROM foundational_service_sources WHERE id = ?')
|
|
228
|
+
.bind(id)
|
|
229
|
+
.first();
|
|
230
|
+
return row ? toSourceRecord(row) : null;
|
|
231
|
+
}
|
|
232
|
+
async upsert(record) {
|
|
233
|
+
await this.db
|
|
234
|
+
.prepare(`INSERT INTO foundational_service_sources
|
|
235
|
+
(id, owner_kind, owner_id, repo_owner, repo_name, git_ref, mode, dir_path, file_paths,
|
|
236
|
+
service_id, service_name, service_summary, last_synced_commit, last_synced_at,
|
|
237
|
+
created_at, deleted_at)
|
|
238
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
239
|
+
ON CONFLICT (id) DO UPDATE SET
|
|
240
|
+
repo_owner = excluded.repo_owner,
|
|
241
|
+
repo_name = excluded.repo_name,
|
|
242
|
+
git_ref = excluded.git_ref,
|
|
243
|
+
mode = excluded.mode,
|
|
244
|
+
dir_path = excluded.dir_path,
|
|
245
|
+
file_paths = excluded.file_paths,
|
|
246
|
+
service_id = excluded.service_id,
|
|
247
|
+
service_name = excluded.service_name,
|
|
248
|
+
service_summary = excluded.service_summary,
|
|
249
|
+
last_synced_commit = excluded.last_synced_commit,
|
|
250
|
+
last_synced_at = excluded.last_synced_at,
|
|
251
|
+
deleted_at = excluded.deleted_at`)
|
|
252
|
+
.bind(record.id, record.ownerKind, record.ownerId, record.repoOwner, record.repoName, record.gitRef, record.mode, record.dirPath, JSON.stringify(record.filePaths), record.serviceId, record.serviceName, record.serviceSummary, record.lastSyncedCommit, record.lastSyncedAt, record.createdAt, record.deletedAt)
|
|
253
|
+
.run();
|
|
254
|
+
}
|
|
255
|
+
async updateSyncState(id, lastSyncedCommit, lastSyncedAt) {
|
|
256
|
+
await this.db
|
|
257
|
+
.prepare('UPDATE foundational_service_sources SET last_synced_commit = ?, last_synced_at = ? WHERE id = ?')
|
|
258
|
+
.bind(lastSyncedCommit, lastSyncedAt, id)
|
|
259
|
+
.run();
|
|
260
|
+
}
|
|
261
|
+
async softDelete(id, at) {
|
|
262
|
+
await this.db
|
|
263
|
+
.prepare('UPDATE foundational_service_sources SET deleted_at = ? WHERE id = ?')
|
|
264
|
+
.bind(at, id)
|
|
265
|
+
.run();
|
|
266
|
+
}
|
|
267
|
+
async listStale(staleBefore, limit) {
|
|
268
|
+
// `last_synced_at IS NULL` first: a source linked but never synced is the stalest thing there
|
|
269
|
+
// is, and ordering by a nullable column alone would sort it unpredictably across engines.
|
|
270
|
+
const { results } = await this.db
|
|
271
|
+
.prepare(`SELECT * FROM foundational_service_sources
|
|
272
|
+
WHERE deleted_at IS NULL AND (last_synced_at IS NULL OR last_synced_at < ?)
|
|
273
|
+
ORDER BY (last_synced_at IS NULL) DESC, last_synced_at ASC
|
|
274
|
+
LIMIT ?`)
|
|
275
|
+
.bind(staleBefore, limit)
|
|
276
|
+
.all();
|
|
277
|
+
return results.map(toSourceRecord);
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
//# sourceMappingURL=D1FoundationalServiceRepository.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"D1FoundationalServiceRepository.js","sourceRoot":"","sources":["../../../src/infrastructure/repositories/D1FoundationalServiceRepository.ts"],"names":[],"mappings":"AAgBA,+FAA+F;AAC/F,+FAA+F;AAC/F,4DAA4D;AAE5D;;;;GAIG;AACH,MAAM,QAAQ,GAAG,EAAE,CAAA;AAkBnB,SAAS,eAAe,CAAC,GAAe;IACtC,OAAO;QACL,SAAS,EAAE,GAAG,CAAC,UAAU;QACzB,SAAS,EAAE,GAAG,CAAC,UAA0C;QACzD,OAAO,EAAE,GAAG,CAAC,QAAQ;QACrB,IAAI,EAAE,GAAG,CAAC,IAAI;QACd,OAAO,EAAE,GAAG,CAAC,OAAO;QACpB,WAAW,EAAE,GAAG,CAAC,WAAW;QAC5B,YAAY,EAAE,gBAAgB,CAAC,GAAG,CAAC,YAAY,CAAC;QAChD,QAAQ,EAAE,GAAG,CAAC,SAAS;QACvB,UAAU,EAAE,GAAG,CAAC,WAAW;QAC3B,YAAY,EAAE,GAAG,CAAC,aAAa;QAC/B,SAAS,EAAE,GAAG,CAAC,UAAU;QACzB,SAAS,EAAE,GAAG,CAAC,UAAU;QACzB,SAAS,EAAE,GAAG,CAAC,UAAU;KAC1B,CAAA;AACH,CAAC;AAED;;;;;GAKG;AACH,SAAS,gBAAgB,CAAC,KAAoB;IAC5C,IAAI,CAAC,KAAK;QAAE,OAAO,EAAE,CAAA;IACrB,IAAI,CAAC;QACH,MAAM,MAAM,GAAY,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;QACzC,OAAO,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;IAC9F,CAAC;IAAC,MAAM,CAAC;QACP,2FAA2F;QAC3F,iCAAiC;QACjC,OAAO,EAAE,CAAA;IACX,CAAC;AACH,CAAC;AAED,MAAM,OAAO,+BAA+B;IACzB,EAAE,CAAY;IAE/B,YAAY,EAAE,EAAE,EAAsB;QACpC,IAAI,CAAC,EAAE,GAAG,EAAE,CAAA;IACd,CAAC;IAED,KAAK,CAAC,WAAW,CACf,SAAuC,EACvC,OAAe,EACf,cAAc,GAAG,KAAK;QAEtB,MAAM,KAAK,GAAG,cAAc,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,yBAAyB,CAAA;QAC7D,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,IAAI,CAAC,EAAE;aAC9B,OAAO,CACN,4EAA4E,KAAK,sBAAsB,CACxG;aACA,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC;aACxB,GAAG,EAAc,CAAA;QACpB,OAAO,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAA;IACrC,CAAC;IAED,KAAK,CAAC,GAAG,CACP,SAAuC,EACvC,OAAe,EACf,SAAiB;QAEjB,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,EAAE;aACtB,OAAO,CACN,8FAA8F,CAC/F;aACA,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE,SAAS,CAAC;aACnC,KAAK,EAAc,CAAA;QACtB,OAAO,GAAG,CAAC,CAAC,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;IAC1C,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,MAAiC;QAC5C,MAAM,IAAI,CAAC,EAAE;aACV,OAAO,CACN;;;;;;;;;;;;;4CAaoC,CACrC;aACA,IAAI,CACH,MAAM,CAAC,SAAS,EAChB,MAAM,CAAC,SAAS,EAChB,MAAM,CAAC,OAAO,EACd,MAAM,CAAC,IAAI,EACX,MAAM,CAAC,OAAO,EACd,MAAM,CAAC,WAAW,EAClB,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,YAAY,CAAC,EACnC,MAAM,CAAC,QAAQ,EACf,MAAM,CAAC,UAAU,EACjB,MAAM,CAAC,YAAY,EACnB,MAAM,CAAC,SAAS,EAChB,MAAM,CAAC,SAAS,EAChB,MAAM,CAAC,SAAS,CACjB;aACA,GAAG,EAAE,CAAA;IACV,CAAC;IAED,KAAK,CAAC,UAAU,CACd,SAAuC,EACvC,OAAe,EACf,SAAiB,EACjB,EAAU;QAEV,MAAM,IAAI,CAAC,EAAE;aACV,OAAO,CACN,0HAA0H,CAC3H;aACA,IAAI,CAAC,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,CAAC;aAC3C,GAAG,EAAE,CAAA;IACV,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,QAAgB;QACjC,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,IAAI,CAAC,EAAE;aAC9B,OAAO,CACN,oGAAoG,CACrG;aACA,IAAI,CAAC,QAAQ,CAAC;aACd,GAAG,EAAc,CAAA;QACpB,OAAO,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAA;IACrC,CAAC;IAED,KAAK,CAAC,kBAAkB,CAAC,QAAgB,EAAE,EAAU;QACnD,MAAM,IAAI,CAAC,EAAE;aACV,OAAO,CACN,4GAA4G,CAC7G;aACA,IAAI,CAAC,EAAE,EAAE,EAAE,EAAE,QAAQ,CAAC;aACtB,GAAG,EAAE,CAAA;IACV,CAAC;CACF;AAkBD,MAAM,OAAO,uBAAuB;IACjB,EAAE,CAAY;IAE/B,YAAY,EAAE,EAAE,EAAsB;QACpC,IAAI,CAAC,EAAE,GAAG,EAAE,CAAA;IACd,CAAC;IAED,KAAK,CAAC,mBAAmB,CACvB,SAAuC,EACvC,OAAe;QAEf,4FAA4F;QAC5F,2FAA2F;QAC3F,sEAAsE;QACtE,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,IAAI,CAAC,EAAE;aAC9B,OAAO,CACN;;;;2CAImC,CACpC;aACA,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC;aACxB,GAAG,EASA,CAAA;QACN,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YAC3B,SAAS,EAAE,GAAG,CAAC,UAAU;YACzB,UAAU,EAAE,GAAG,CAAC,WAAW;YAC3B,MAAM,EAAE,GAAG,CAAC,MAA2B;YACvC,KAAK,EAAE,GAAG,CAAC,KAAK;YAChB,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,UAAU,EAAE,gBAAgB,CAAC,GAAG,CAAC,UAAU,CAAC;YAC5C,iBAAiB,EAAE,GAAG,CAAC,kBAAkB;YACzC,UAAU,EAAE,GAAG,CAAC,WAAW;SAC5B,CAAC,CAAC,CAAA;IACL,CAAC;IAED,KAAK,CAAC,gBAAgB,CACpB,SAAuC,EACvC,OAAe,EACf,UAAoB;QAEpB,MAAM,GAAG,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;QACpD,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,CAAA;QAC/B,MAAM,GAAG,GAAwB,EAAE,CAAA;QACnC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,IAAI,QAAQ,EAAE,CAAC;YAC9C,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,CAAA;YACxC,MAAM,YAAY,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YACpD,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,IAAI,CAAC,EAAE;iBAC9B,OAAO,CACN;uEAC6D,YAAY;6CACtC,CACpC;iBACA,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE,GAAG,KAAK,CAAC;iBAClC,GAAG,EAAe,CAAA;YACrB,KAAK,MAAM,GAAG,IAAI,OAAO;gBAAE,GAAG,CAAC,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAA;QAC5D,CAAC;QACD,OAAO,GAAG,CAAA;IACZ,CAAC;IAED,KAAK,CAAC,iBAAiB,CACrB,SAAuC,EACvC,OAAe,EACf,SAAiB,EACjB,SAA8B;QAE9B,wFAAwF;QACxF,uFAAuF;QACvF,gEAAgE;QAChE,MAAM,UAAU,GAAG;YACjB,IAAI,CAAC,EAAE;iBACJ,OAAO,CACN,oFAAoF,CACrF;iBACA,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE,SAAS,CAAC;YACtC,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAC5B,IAAI,CAAC,EAAE;iBACJ,OAAO,CACN;;;4DAGgD,CACjD;iBACA,IAAI,CACH,SAAS,EACT,OAAO,EACP,SAAS,EACT,QAAQ,CAAC,UAAU,EACnB,QAAQ,CAAC,MAAM,EACf,QAAQ,CAAC,KAAK,EACd,QAAQ,CAAC,IAAI,EACb,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,UAAU,CAAC,EACnC,QAAQ,CAAC,iBAAiB,EAC1B,QAAQ,CAAC,UAAU,EACnB,QAAQ,CAAC,SAAS,EAClB,QAAQ,CAAC,SAAS,EAClB,QAAQ,CAAC,SAAS,CACnB,CACJ;SACF,CAAA;QACD,MAAM,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,CAAA;IACjC,CAAC;IAED,KAAK,CAAC,gBAAgB,CACpB,SAAuC,EACvC,OAAe,EACf,SAAiB;QAEjB,MAAM,IAAI,CAAC,EAAE;aACV,OAAO,CAAC,oFAAoF,CAAC;aAC7F,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE,SAAS,CAAC;aACnC,GAAG,EAAE,CAAA;IACV,CAAC;CACF;AAED,SAAS,gBAAgB,CAAC,GAAgB;IACxC,OAAO;QACL,SAAS,EAAE,GAAG,CAAC,UAA0C;QACzD,OAAO,EAAE,GAAG,CAAC,QAAQ;QACrB,SAAS,EAAE,GAAG,CAAC,UAAU;QACzB,UAAU,EAAE,GAAG,CAAC,WAAW;QAC3B,MAAM,EAAE,GAAG,CAAC,MAA2B;QACvC,KAAK,EAAE,GAAG,CAAC,KAAK;QAChB,IAAI,EAAE,GAAG,CAAC,IAAI;QACd,UAAU,EAAE,gBAAgB,CAAC,GAAG,CAAC,UAAU,CAAC;QAC5C,iBAAiB,EAAE,GAAG,CAAC,kBAAkB;QACzC,UAAU,EAAE,GAAG,CAAC,WAAW;QAC3B,SAAS,EAAE,GAAG,CAAC,UAAU;QACzB,SAAS,EAAE,GAAG,CAAC,UAAU;QACzB,SAAS,EAAE,GAAG,CAAC,UAAU;KAC1B,CAAA;AACH,CAAC;AAqBD,SAAS,cAAc,CAAC,GAAc;IACpC,OAAO;QACL,EAAE,EAAE,GAAG,CAAC,EAAE;QACV,SAAS,EAAE,GAAG,CAAC,UAA0C;QACzD,OAAO,EAAE,GAAG,CAAC,QAAQ;QACrB,SAAS,EAAE,GAAG,CAAC,UAAU;QACzB,QAAQ,EAAE,GAAG,CAAC,SAAS;QACvB,MAAM,EAAE,GAAG,CAAC,OAAO;QACnB,IAAI,EAAE,GAAG,CAAC,IAAqC;QAC/C,OAAO,EAAE,GAAG,CAAC,QAAQ;QACrB,SAAS,EAAE,gBAAgB,CAAC,GAAG,CAAC,UAAU,CAAC;QAC3C,SAAS,EAAE,GAAG,CAAC,UAAU;QACzB,WAAW,EAAE,GAAG,CAAC,YAAY;QAC7B,cAAc,EAAE,GAAG,CAAC,eAAe;QACnC,gBAAgB,EAAE,GAAG,CAAC,kBAAkB;QACxC,YAAY,EAAE,GAAG,CAAC,cAAc;QAChC,SAAS,EAAE,GAAG,CAAC,UAAU;QACzB,SAAS,EAAE,GAAG,CAAC,UAAU;KAC1B,CAAA;AACH,CAAC;AAED,MAAM,OAAO,qCAAqC;IAC/B,EAAE,CAAY;IAE/B,YAAY,EAAE,EAAE,EAAsB;QACpC,IAAI,CAAC,EAAE,GAAG,EAAE,CAAA;IACd,CAAC;IAED,KAAK,CAAC,WAAW,CACf,SAAuC,EACvC,OAAe;QAEf,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,IAAI,CAAC,EAAE;aAC9B,OAAO,CACN,kIAAkI,CACnI;aACA,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC;aACxB,GAAG,EAAa,CAAA;QACnB,OAAO,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAA;IACpC,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,EAAU;QAClB,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,EAAE;aACtB,OAAO,CAAC,yDAAyD,CAAC;aAClE,IAAI,CAAC,EAAE,CAAC;aACR,KAAK,EAAa,CAAA;QACrB,OAAO,GAAG,CAAC,CAAC,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;IACzC,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,MAAuC;QAClD,MAAM,IAAI,CAAC,EAAE;aACV,OAAO,CACN;;;;;;;;;;;;;;;;;4CAiBoC,CACrC;aACA,IAAI,CACH,MAAM,CAAC,EAAE,EACT,MAAM,CAAC,SAAS,EAChB,MAAM,CAAC,OAAO,EACd,MAAM,CAAC,SAAS,EAChB,MAAM,CAAC,QAAQ,EACf,MAAM,CAAC,MAAM,EACb,MAAM,CAAC,IAAI,EACX,MAAM,CAAC,OAAO,EACd,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,SAAS,CAAC,EAChC,MAAM,CAAC,SAAS,EAChB,MAAM,CAAC,WAAW,EAClB,MAAM,CAAC,cAAc,EACrB,MAAM,CAAC,gBAAgB,EACvB,MAAM,CAAC,YAAY,EACnB,MAAM,CAAC,SAAS,EAChB,MAAM,CAAC,SAAS,CACjB;aACA,GAAG,EAAE,CAAA;IACV,CAAC;IAED,KAAK,CAAC,eAAe,CACnB,EAAU,EACV,gBAA+B,EAC/B,YAAoB;QAEpB,MAAM,IAAI,CAAC,EAAE;aACV,OAAO,CACN,iGAAiG,CAClG;aACA,IAAI,CAAC,gBAAgB,EAAE,YAAY,EAAE,EAAE,CAAC;aACxC,GAAG,EAAE,CAAA;IACV,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,EAAU,EAAE,EAAU;QACrC,MAAM,IAAI,CAAC,EAAE;aACV,OAAO,CAAC,qEAAqE,CAAC;aAC9E,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC;aACZ,GAAG,EAAE,CAAA;IACV,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,WAAmB,EAAE,KAAa;QAChD,8FAA8F;QAC9F,0FAA0F;QAC1F,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,IAAI,CAAC,EAAE;aAC9B,OAAO,CACN;;;kBAGU,CACX;aACA,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC;aACxB,GAAG,EAAa,CAAA;QACnB,OAAO,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAA;IACpC,CAAC;CACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"D1WorkspaceSettingsRepository.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/repositories/D1WorkspaceSettingsRepository.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,qBAAqB,CAAA;AACtE,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"D1WorkspaceSettingsRepository.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/repositories/D1WorkspaceSettingsRepository.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,qBAAqB,CAAA;AACtE,OAAO,KAAK,EAMV,iBAAiB,EAClB,MAAM,wBAAwB,CAAA;AAC/B,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAA;AA2D3D;;;;GAIG;AACH,qBAAa,6BAA8B,YAAW,2BAA2B;IAC/E,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAY;IAE/B,YAAY,EAAE,EAAE,EAAE,EAAE;QAAE,EAAE,EAAE,UAAU,CAAA;KAAE,EAErC;IAEK,GAAG,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC,CAMhE;IAEK,kBAAkB,CAAC,YAAY,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC,CAaxF;IAEK,MAAM,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAsD5E;CACF"}
|
|
@@ -28,6 +28,9 @@ function rowToSettings(row) {
|
|
|
28
28
|
spendMonthlyLimit: row.spend_monthly_limit,
|
|
29
29
|
defaultProvisionType: row.default_provision_type ?? null,
|
|
30
30
|
defaultProvisionManifestId: row.default_provision_manifest_id,
|
|
31
|
+
// An absent (or unparseable) blob reads as "nothing filled in", never as a missing key
|
|
32
|
+
// the settings object would have to be nullable for.
|
|
33
|
+
metadata: parseJson(row.metadata) ?? {},
|
|
31
34
|
};
|
|
32
35
|
}
|
|
33
36
|
/**
|
|
@@ -71,8 +74,9 @@ export class D1WorkspaceSettingsRepository {
|
|
|
71
74
|
artifact_retention_days, kaizen_enabled,
|
|
72
75
|
delegate_agents_to_runner_pool, review_friction_mode, review_friction_warn_count,
|
|
73
76
|
review_friction_block_count, review_friction_block_stuck_minutes, spend_currency,
|
|
74
|
-
spend_monthly_limit, default_provision_type, default_provision_manifest_id
|
|
75
|
-
|
|
77
|
+
spend_monthly_limit, default_provision_type, default_provision_manifest_id,
|
|
78
|
+
metadata)
|
|
79
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
76
80
|
ON CONFLICT (workspace_id) DO UPDATE SET
|
|
77
81
|
waiting_escalation_minutes = excluded.waiting_escalation_minutes,
|
|
78
82
|
task_limit_mode = excluded.task_limit_mode,
|
|
@@ -90,8 +94,9 @@ export class D1WorkspaceSettingsRepository {
|
|
|
90
94
|
spend_currency = excluded.spend_currency,
|
|
91
95
|
spend_monthly_limit = excluded.spend_monthly_limit,
|
|
92
96
|
default_provision_type = excluded.default_provision_type,
|
|
93
|
-
default_provision_manifest_id = excluded.default_provision_manifest_id
|
|
94
|
-
|
|
97
|
+
default_provision_manifest_id = excluded.default_provision_manifest_id,
|
|
98
|
+
metadata = excluded.metadata`)
|
|
99
|
+
.bind(workspaceId, settings.waitingEscalationMinutes, settings.taskLimitMode, settings.taskLimitShared, settings.taskLimitPerType ? JSON.stringify(settings.taskLimitPerType) : null, settings.storeAgentContext ? 1 : 0, settings.publishPrVerificationReport ? 1 : 0, settings.artifactRetentionDays, settings.kaizenEnabled ? 1 : 0, settings.delegateAgentsToRunnerPool ? 1 : 0, settings.reviewFrictionMode, settings.reviewFrictionWarnCount, settings.reviewFrictionBlockCount, settings.reviewFrictionBlockStuckMinutes, settings.spendCurrency, settings.spendMonthlyLimit, settings.defaultProvisionType, settings.defaultProvisionManifestId, JSON.stringify(settings.metadata))
|
|
95
100
|
.run();
|
|
96
101
|
}
|
|
97
102
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"D1WorkspaceSettingsRepository.js","sourceRoot":"","sources":["../../../src/infrastructure/repositories/D1WorkspaceSettingsRepository.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"D1WorkspaceSettingsRepository.js","sourceRoot":"","sources":["../../../src/infrastructure/repositories/D1WorkspaceSettingsRepository.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AAwBpC,SAAS,SAAS,CAAI,GAAkB;IACtC,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,CAAA;IACrB,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAM,CAAA;IAC7B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAA;IACb,CAAC;AACH,CAAC;AAED,SAAS,aAAa,CAAC,GAAyB;IAC9C,OAAO;QACL,wBAAwB,EAAE,GAAG,CAAC,0BAA0B;QACxD,aAAa,EAAE,GAAG,CAAC,eAAgC;QACnD,eAAe,EAAE,GAAG,CAAC,iBAAiB;QACtC,gBAAgB,EAAE,SAAS,CAAmB,GAAG,CAAC,mBAAmB,CAAC;QACtE,iBAAiB,EAAE,GAAG,CAAC,mBAAmB,KAAK,CAAC;QAChD,2BAA2B,EAAE,GAAG,CAAC,8BAA8B,KAAK,CAAC;QACrE,qBAAqB,EAAE,GAAG,CAAC,uBAAuB;QAClD,aAAa,EAAE,GAAG,CAAC,cAAc,KAAK,CAAC;QACvC,0BAA0B,EAAE,GAAG,CAAC,8BAA8B,KAAK,CAAC;QACpE,kBAAkB,EAAE,GAAG,CAAC,oBAA0C;QAClE,uBAAuB,EAAE,GAAG,CAAC,0BAA0B;QACvD,wBAAwB,EAAE,GAAG,CAAC,2BAA2B;QACzD,+BAA+B,EAAE,GAAG,CAAC,mCAAmC;QACxE,aAAa,EAAE,GAAG,CAAC,cAAc;QACjC,iBAAiB,EAAE,GAAG,CAAC,mBAAmB;QAC1C,oBAAoB,EAAG,GAAG,CAAC,sBAA+C,IAAI,IAAI;QAClF,0BAA0B,EAAE,GAAG,CAAC,6BAA6B;QAC7D,uFAAuF;QACvF,qDAAqD;QACrD,QAAQ,EAAE,SAAS,CAAoB,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE;KAC3D,CAAA;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,OAAO,6BAA6B;IACvB,EAAE,CAAY;IAE/B,YAAY,EAAE,EAAE,EAAsB;QACpC,IAAI,CAAC,EAAE,GAAG,EAAE,CAAA;IACd,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,WAAmB;QAC3B,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,EAAE;aACtB,OAAO,CAAC,yDAAyD,CAAC;aAClE,IAAI,CAAC,WAAW,CAAC;aACjB,KAAK,EAAwB,CAAA;QAChC,OAAO,GAAG,CAAC,CAAC,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;IACxC,CAAC;IAED,KAAK,CAAC,kBAAkB,CAAC,YAAsB;QAC7C,MAAM,GAAG,GAAG,IAAI,GAAG,EAA6B,CAAA;QAChD,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,GAAG,CAAA;QACzC,8DAA8D;QAC9D,KAAK,MAAM,KAAK,IAAI,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;YAC7C,MAAM,YAAY,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YACpD,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,IAAI,CAAC,EAAE;iBAC9B,OAAO,CAAC,2DAA2D,YAAY,GAAG,CAAC;iBACnF,IAAI,CAAC,GAAG,KAAK,CAAC;iBACd,GAAG,EAAwB,CAAA;YAC9B,KAAK,MAAM,GAAG,IAAI,OAAO,IAAI,EAAE;gBAAE,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,YAAY,EAAE,aAAa,CAAC,GAAG,CAAC,CAAC,CAAA;QAChF,CAAC;QACD,OAAO,GAAG,CAAA;IACZ,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,WAAmB,EAAE,QAA2B;QAC3D,MAAM,IAAI,CAAC,EAAE;aACV,OAAO,CACN;;;;;;;;;;;;;;;;;;;;;;;;;;;wCA2BgC,CACjC;aACA,IAAI,CACH,WAAW,EACX,QAAQ,CAAC,wBAAwB,EACjC,QAAQ,CAAC,aAAa,EACtB,QAAQ,CAAC,eAAe,EACxB,QAAQ,CAAC,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,IAAI,EAC5E,QAAQ,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAClC,QAAQ,CAAC,2BAA2B,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAC5C,QAAQ,CAAC,qBAAqB,EAC9B,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAC9B,QAAQ,CAAC,0BAA0B,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAC3C,QAAQ,CAAC,kBAAkB,EAC3B,QAAQ,CAAC,uBAAuB,EAChC,QAAQ,CAAC,wBAAwB,EACjC,QAAQ,CAAC,+BAA+B,EACxC,QAAQ,CAAC,aAAa,EACtB,QAAQ,CAAC,iBAAiB,EAC1B,QAAQ,CAAC,oBAAoB,EAC7B,QAAQ,CAAC,0BAA0B,EACnC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAClC;aACA,GAAG,EAAE,CAAA;IACV,CAAC;CACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ExecutionWorkflow.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/workflows/ExecutionWorkflow.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAClB,KAAK,aAAa,EAElB,KAAK,YAAY,EAElB,MAAM,oBAAoB,CAAA;AAQ3B,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,QAAQ,CAAA;AAKjC,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAA;
|
|
1
|
+
{"version":3,"file":"ExecutionWorkflow.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/workflows/ExecutionWorkflow.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAClB,KAAK,aAAa,EAElB,KAAK,YAAY,EAElB,MAAM,oBAAoB,CAAA;AAQ3B,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,QAAQ,CAAA;AAKjC,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAA;AAoJpE;;;;;;;GAOG;AACH,qBAAa,iBAAkB,SAAQ,kBAAkB,CAAC,GAAG,EAAE,uBAAuB,CAAC;IACtE,GAAG,CAChB,KAAK,EAAE,aAAa,CAAC,uBAAuB,CAAC,EAC7C,IAAI,EAAE,YAAY,GACjB,OAAO,CAAC,IAAI,CAAC,CAwMf;CACF"}
|
|
@@ -10,6 +10,96 @@ const STEP_CONFIG = {
|
|
|
10
10
|
retries: { limit: 3, delay: '5 seconds', backoff: 'exponential' },
|
|
11
11
|
timeout: '5 minutes',
|
|
12
12
|
};
|
|
13
|
+
/**
|
|
14
|
+
* Poll a dispatched async job (a container coding step) for step `i` between durable
|
|
15
|
+
* sleeps until it finishes. A thrown poll error is always transient, so tolerate a
|
|
16
|
+
* bounded run of them (reset on any good poll) and only fail the run once the tolerance
|
|
17
|
+
* is spent or the budget runs out. Returns the settled result, or `null` once it has
|
|
18
|
+
* already failed the run (the caller returns).
|
|
19
|
+
*/
|
|
20
|
+
async function drivePollLoop(deps, i, initial) {
|
|
21
|
+
const { step, log, maxPolls, failureTolerance, pollInterval, pollOnce, failRun, poll } = deps;
|
|
22
|
+
let result = initial;
|
|
23
|
+
let polled = false;
|
|
24
|
+
let pollReadFailures = 0;
|
|
25
|
+
for (let p = 0; p < maxPolls; p++) {
|
|
26
|
+
// Poll-first: the job was dispatched instants ago by `advance-${i}`, so the first
|
|
27
|
+
// status read runs immediately — a leading sleep would be a full poll interval of
|
|
28
|
+
// dead air. Later iterations sleep between polls.
|
|
29
|
+
if (p > 0)
|
|
30
|
+
await step.sleep(`poll-wait-${i}-${p}`, pollInterval);
|
|
31
|
+
const attempt = await pollOnce(`poll-${i}-${p}`, poll);
|
|
32
|
+
if (attempt.kind === 'read_failed') {
|
|
33
|
+
pollReadFailures += 1;
|
|
34
|
+
log.warn('poll could not read job status; treating as still running and retrying', {
|
|
35
|
+
step: i,
|
|
36
|
+
poll: p,
|
|
37
|
+
pollReadFailures,
|
|
38
|
+
err: attempt.message,
|
|
39
|
+
});
|
|
40
|
+
if (pollReadFailures < failureTolerance)
|
|
41
|
+
continue;
|
|
42
|
+
await failRun(i, failureFromDriver(`Job status was unreadable for ${pollReadFailures} consecutive polls; ` +
|
|
43
|
+
`the container appears unreachable (last error: ${attempt.message})`, 'timeout'));
|
|
44
|
+
return null;
|
|
45
|
+
}
|
|
46
|
+
pollReadFailures = 0;
|
|
47
|
+
result = attempt.result;
|
|
48
|
+
if (result.kind !== 'awaiting_job') {
|
|
49
|
+
polled = true;
|
|
50
|
+
break;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
if (!polled && result.kind === 'awaiting_job') {
|
|
54
|
+
await failRun(i, failureFromDriver('Implementation job did not finish within its polling budget', 'timeout'));
|
|
55
|
+
return null;
|
|
56
|
+
}
|
|
57
|
+
return result;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Drive a polling gate (`ci` / `conflicts` / post-release-health) for step `i` between
|
|
61
|
+
* durable sleeps until its precheck yields something terminal. A passing precheck
|
|
62
|
+
* returns `continue`, a dispatched helper agent returns `awaiting_job`, and a spent
|
|
63
|
+
* budget resolves through the gate's own exhaustion policy. Read failures are tolerated
|
|
64
|
+
* exactly like the job loop. Returns the updated result, or `null` once it failed the run.
|
|
65
|
+
*/
|
|
66
|
+
async function driveGatePollLoop(deps, i, initial) {
|
|
67
|
+
const { step, log, maxPolls, failureTolerance, pollInterval, pollOnce, failRun, poll } = deps;
|
|
68
|
+
let result = initial;
|
|
69
|
+
let settled = false;
|
|
70
|
+
let pollReadFailures = 0;
|
|
71
|
+
for (let p = 0; p < maxPolls; p++) {
|
|
72
|
+
await step.sleep(`gate-wait-${i}-${p}`, pollInterval);
|
|
73
|
+
const attempt = await pollOnce(`gate-poll-${i}-${p}`, poll);
|
|
74
|
+
if (attempt.kind === 'read_failed') {
|
|
75
|
+
pollReadFailures += 1;
|
|
76
|
+
log.warn('gate poll could not read its precheck; treating as still pending and retrying', {
|
|
77
|
+
step: i,
|
|
78
|
+
poll: p,
|
|
79
|
+
pollReadFailures,
|
|
80
|
+
err: attempt.message,
|
|
81
|
+
});
|
|
82
|
+
if (pollReadFailures < failureTolerance)
|
|
83
|
+
continue;
|
|
84
|
+
await failRun(i, failureFromDriver(`Gate precheck was unreadable for ${pollReadFailures} consecutive polls ` +
|
|
85
|
+
`(last error: ${attempt.message})`, 'timeout'));
|
|
86
|
+
return null;
|
|
87
|
+
}
|
|
88
|
+
pollReadFailures = 0;
|
|
89
|
+
result = attempt.result;
|
|
90
|
+
if (result.kind !== 'awaiting_gate') {
|
|
91
|
+
settled = true;
|
|
92
|
+
break;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
if (!settled && result.kind === 'awaiting_gate') {
|
|
96
|
+
// Poll budget spent. Let the gate decide: a time-windowed watch gate
|
|
97
|
+
// (post-release-health) PASSES, while CI/conflicts resolve to a `job_failed`
|
|
98
|
+
// timeout the checks below funnel through `failRun`. One policy, both runtimes.
|
|
99
|
+
result = (await step.do(`gate-exhausted-${i}`, STEP_CONFIG, deps.resolveExhaustion));
|
|
100
|
+
}
|
|
101
|
+
return result;
|
|
102
|
+
}
|
|
13
103
|
/**
|
|
14
104
|
* Durable driver for one pipeline run. It contains NO business logic — every
|
|
15
105
|
* decision lives in core's ExecutionService. Each loop iteration advances the
|
|
@@ -72,89 +162,25 @@ export class ExecutionWorkflow extends WorkflowEntrypoint {
|
|
|
72
162
|
return { kind: 'read_failed', message: redactSecrets(raw) ?? '' };
|
|
73
163
|
}
|
|
74
164
|
};
|
|
75
|
-
//
|
|
76
|
-
//
|
|
77
|
-
//
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
// dead air. Later iterations sleep between polls.
|
|
88
|
-
if (p > 0)
|
|
89
|
-
await step.sleep(`poll-wait-${i}-${p}`, jobPollInterval);
|
|
90
|
-
const attempt = await pollOnce(`poll-${i}-${p}`, () => container.executionService.pollAgentJob(workspaceId, executionId));
|
|
91
|
-
if (attempt.kind === 'read_failed') {
|
|
92
|
-
pollReadFailures += 1;
|
|
93
|
-
log.warn('poll could not read job status; treating as still running and retrying', {
|
|
94
|
-
step: i,
|
|
95
|
-
poll: p,
|
|
96
|
-
pollReadFailures,
|
|
97
|
-
err: attempt.message,
|
|
98
|
-
});
|
|
99
|
-
if (pollReadFailures < execConfig.jobPollFailureTolerance)
|
|
100
|
-
continue;
|
|
101
|
-
await failRun(i, failureFromDriver(`Job status was unreadable for ${pollReadFailures} consecutive polls; ` +
|
|
102
|
-
`the container appears unreachable (last error: ${attempt.message})`, 'timeout'));
|
|
103
|
-
return null;
|
|
104
|
-
}
|
|
105
|
-
pollReadFailures = 0;
|
|
106
|
-
result = attempt.result;
|
|
107
|
-
if (result.kind !== 'awaiting_job') {
|
|
108
|
-
polled = true;
|
|
109
|
-
break;
|
|
110
|
-
}
|
|
111
|
-
}
|
|
112
|
-
if (!polled && result.kind === 'awaiting_job') {
|
|
113
|
-
await failRun(i, failureFromDriver('Implementation job did not finish within its polling budget', 'timeout'));
|
|
114
|
-
return null;
|
|
115
|
-
}
|
|
116
|
-
return result;
|
|
165
|
+
// The two durable poll loops are module-level (see `drivePollLoop` / `driveGatePollLoop`),
|
|
166
|
+
// taking the run-scoped closures above as bound deps so this driver stays within the
|
|
167
|
+
// per-function line budget.
|
|
168
|
+
const jobPollDeps = {
|
|
169
|
+
step,
|
|
170
|
+
log,
|
|
171
|
+
maxPolls: execConfig.jobMaxPolls,
|
|
172
|
+
failureTolerance: execConfig.jobPollFailureTolerance,
|
|
173
|
+
pollInterval: jobPollInterval,
|
|
174
|
+
pollOnce,
|
|
175
|
+
failRun,
|
|
176
|
+
poll: () => container.executionService.pollAgentJob(workspaceId, executionId),
|
|
117
177
|
};
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
let result = initial;
|
|
125
|
-
let settled = false;
|
|
126
|
-
let pollReadFailures = 0;
|
|
127
|
-
for (let p = 0; p < execConfig.ciMaxPolls; p++) {
|
|
128
|
-
await step.sleep(`gate-wait-${i}-${p}`, ciPollInterval);
|
|
129
|
-
const attempt = await pollOnce(`gate-poll-${i}-${p}`, () => container.executionService.pollGate(workspaceId, executionId));
|
|
130
|
-
if (attempt.kind === 'read_failed') {
|
|
131
|
-
pollReadFailures += 1;
|
|
132
|
-
log.warn('gate poll could not read its precheck; treating as still pending and retrying', {
|
|
133
|
-
step: i,
|
|
134
|
-
poll: p,
|
|
135
|
-
pollReadFailures,
|
|
136
|
-
err: attempt.message,
|
|
137
|
-
});
|
|
138
|
-
if (pollReadFailures < execConfig.jobPollFailureTolerance)
|
|
139
|
-
continue;
|
|
140
|
-
await failRun(i, failureFromDriver(`Gate precheck was unreadable for ${pollReadFailures} consecutive polls ` +
|
|
141
|
-
`(last error: ${attempt.message})`, 'timeout'));
|
|
142
|
-
return null;
|
|
143
|
-
}
|
|
144
|
-
pollReadFailures = 0;
|
|
145
|
-
result = attempt.result;
|
|
146
|
-
if (result.kind !== 'awaiting_gate') {
|
|
147
|
-
settled = true;
|
|
148
|
-
break;
|
|
149
|
-
}
|
|
150
|
-
}
|
|
151
|
-
if (!settled && result.kind === 'awaiting_gate') {
|
|
152
|
-
// Poll budget spent. Let the gate decide: a time-windowed watch gate
|
|
153
|
-
// (post-release-health) PASSES, while CI/conflicts resolve to a `job_failed`
|
|
154
|
-
// timeout the checks below funnel through `failRun`. One policy, both runtimes.
|
|
155
|
-
result = (await step.do(`gate-exhausted-${i}`, STEP_CONFIG, () => container.executionService.resolveGatePollExhaustion(workspaceId, executionId)));
|
|
156
|
-
}
|
|
157
|
-
return result;
|
|
178
|
+
const gatePollDeps = {
|
|
179
|
+
...jobPollDeps,
|
|
180
|
+
maxPolls: execConfig.ciMaxPolls,
|
|
181
|
+
pollInterval: ciPollInterval,
|
|
182
|
+
poll: () => container.executionService.pollGate(workspaceId, executionId),
|
|
183
|
+
resolveExhaustion: () => container.executionService.resolveGatePollExhaustion(workspaceId, executionId),
|
|
158
184
|
};
|
|
159
185
|
for (let i = 0;; i++) {
|
|
160
186
|
let result;
|
|
@@ -179,7 +205,7 @@ export class ExecutionWorkflow extends WorkflowEntrypoint {
|
|
|
179
205
|
// max-duration watchdogs); `jobMaxPolls` is only a backstop. `null` means the loop
|
|
180
206
|
// already failed the run.
|
|
181
207
|
if (result.kind === 'awaiting_job') {
|
|
182
|
-
const polledResult = await drivePollLoop(i, result);
|
|
208
|
+
const polledResult = await drivePollLoop(jobPollDeps, i, result);
|
|
183
209
|
if (polledResult === null)
|
|
184
210
|
return;
|
|
185
211
|
result = polledResult;
|
|
@@ -189,7 +215,7 @@ export class ExecutionWorkflow extends WorkflowEntrypoint {
|
|
|
189
215
|
// something terminal (see `driveGatePollLoop`). One loop drives every gate kind, since
|
|
190
216
|
// which gate is resolved inside `pollGate` from the current step.
|
|
191
217
|
if (result.kind === 'awaiting_gate') {
|
|
192
|
-
const gatedResult = await driveGatePollLoop(i, result);
|
|
218
|
+
const gatedResult = await driveGatePollLoop(gatePollDeps, i, result);
|
|
193
219
|
if (gatedResult === null)
|
|
194
220
|
return;
|
|
195
221
|
result = gatedResult;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ExecutionWorkflow.js","sourceRoot":"","sources":["../../../src/infrastructure/workflows/ExecutionWorkflow.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,GAKnB,MAAM,oBAAoB,CAAA;AAC3B,OAAO,
|
|
1
|
+
{"version":3,"file":"ExecutionWorkflow.js","sourceRoot":"","sources":["../../../src/infrastructure/workflows/ExecutionWorkflow.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,GAKnB,MAAM,oBAAoB,CAAA;AAC3B,OAAO,EAAe,aAAa,EAAE,MAAM,qBAAqB,CAAA;AAEhE,OAAO,EACL,uBAAuB,EACvB,iBAAiB,EACjB,iBAAiB,GAClB,MAAM,4BAA4B,CAAA;AAEnC,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAA;AACtC,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAA;AAChD,OAAO,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAA;AAGhD,kFAAkF;AAClF,MAAM,WAAW,GAAG;IAClB,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,aAAa,EAAE;IACjE,OAAO,EAAE,WAAW;CACQ,CAAA;AA0B9B;;;;;;GAMG;AACH,KAAK,UAAU,aAAa,CAC1B,IAAkB,EAClB,CAAS,EACT,OAAsB;IAEtB,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,gBAAgB,EAAE,YAAY,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,IAAI,CAAA;IAC7F,IAAI,MAAM,GAAG,OAAO,CAAA;IACpB,IAAI,MAAM,GAAG,KAAK,CAAA;IAClB,IAAI,gBAAgB,GAAG,CAAC,CAAA;IACxB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,EAAE,CAAC,EAAE,EAAE,CAAC;QAClC,kFAAkF;QAClF,kFAAkF;QAClF,kDAAkD;QAClD,IAAI,CAAC,GAAG,CAAC;YAAE,MAAM,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,EAAE,YAAY,CAAC,CAAA;QAChE,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,CAAA;QACtD,IAAI,OAAO,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;YACnC,gBAAgB,IAAI,CAAC,CAAA;YACrB,GAAG,CAAC,IAAI,CAAC,wEAAwE,EAAE;gBACjF,IAAI,EAAE,CAAC;gBACP,IAAI,EAAE,CAAC;gBACP,gBAAgB;gBAChB,GAAG,EAAE,OAAO,CAAC,OAAO;aACrB,CAAC,CAAA;YACF,IAAI,gBAAgB,GAAG,gBAAgB;gBAAE,SAAQ;YACjD,MAAM,OAAO,CACX,CAAC,EACD,iBAAiB,CACf,iCAAiC,gBAAgB,sBAAsB;gBACrE,kDAAkD,OAAO,CAAC,OAAO,GAAG,EACtE,SAAS,CACV,CACF,CAAA;YACD,OAAO,IAAI,CAAA;QACb,CAAC;QACD,gBAAgB,GAAG,CAAC,CAAA;QACpB,MAAM,GAAG,OAAO,CAAC,MAAM,CAAA;QACvB,IAAI,MAAM,CAAC,IAAI,KAAK,cAAc,EAAE,CAAC;YACnC,MAAM,GAAG,IAAI,CAAA;YACb,MAAK;QACP,CAAC;IACH,CAAC;IACD,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,IAAI,KAAK,cAAc,EAAE,CAAC;QAC9C,MAAM,OAAO,CACX,CAAC,EACD,iBAAiB,CAAC,6DAA6D,EAAE,SAAS,CAAC,CAC5F,CAAA;QACD,OAAO,IAAI,CAAA;IACb,CAAC;IACD,OAAO,MAAM,CAAA;AACf,CAAC;AAED;;;;;;GAMG;AACH,KAAK,UAAU,iBAAiB,CAC9B,IAAwE,EACxE,CAAS,EACT,OAAsB;IAEtB,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,gBAAgB,EAAE,YAAY,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,IAAI,CAAA;IAC7F,IAAI,MAAM,GAAG,OAAO,CAAA;IACpB,IAAI,OAAO,GAAG,KAAK,CAAA;IACnB,IAAI,gBAAgB,GAAG,CAAC,CAAA;IACxB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,EAAE,CAAC,EAAE,EAAE,CAAC;QAClC,MAAM,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,EAAE,YAAY,CAAC,CAAA;QACrD,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,CAAA;QAC3D,IAAI,OAAO,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;YACnC,gBAAgB,IAAI,CAAC,CAAA;YACrB,GAAG,CAAC,IAAI,CAAC,+EAA+E,EAAE;gBACxF,IAAI,EAAE,CAAC;gBACP,IAAI,EAAE,CAAC;gBACP,gBAAgB;gBAChB,GAAG,EAAE,OAAO,CAAC,OAAO;aACrB,CAAC,CAAA;YACF,IAAI,gBAAgB,GAAG,gBAAgB;gBAAE,SAAQ;YACjD,MAAM,OAAO,CACX,CAAC,EACD,iBAAiB,CACf,oCAAoC,gBAAgB,qBAAqB;gBACvE,gBAAgB,OAAO,CAAC,OAAO,GAAG,EACpC,SAAS,CACV,CACF,CAAA;YACD,OAAO,IAAI,CAAA;QACb,CAAC;QACD,gBAAgB,GAAG,CAAC,CAAA;QACpB,MAAM,GAAG,OAAO,CAAC,MAAM,CAAA;QACvB,IAAI,MAAM,CAAC,IAAI,KAAK,eAAe,EAAE,CAAC;YACpC,OAAO,GAAG,IAAI,CAAA;YACd,MAAK;QACP,CAAC;IACH,CAAC;IACD,IAAI,CAAC,OAAO,IAAI,MAAM,CAAC,IAAI,KAAK,eAAe,EAAE,CAAC;QAChD,qEAAqE;QACrE,6EAA6E;QAC7E,gFAAgF;QAChF,MAAM,GAAG,CAAC,MAAM,IAAI,CAAC,EAAE,CACrB,kBAAkB,CAAC,EAAE,EACrB,WAAW,EACX,IAAI,CAAC,iBAAiB,CACvB,CAAkB,CAAA;IACrB,CAAC;IACD,OAAO,MAAM,CAAA;AACf,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,OAAO,iBAAkB,SAAQ,kBAAgD;IAC5E,KAAK,CAAC,GAAG,CAChB,KAA6C,EAC7C,IAAkB;QAElB,MAAM,EAAE,WAAW,EAAE,WAAW,EAAE,GAAG,KAAK,CAAC,OAAO,CAAA;QAClD,yFAAyF;QACzF,0FAA0F;QAC1F,mFAAmF;QACnF,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,EAAE,WAAW,EAAE,WAAW,EAAE,QAAQ,EAAE,WAAW,EAAE,CAAC,CAAA;QAC7E,iFAAiF;QACjF,kFAAkF;QAClF,+EAA+E;QAC/E,wFAAwF;QACxF,oFAAoF;QACpF,qCAAqC;QACrC,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,GAAG,MAAM,oBAAoB,CAC1D,GAAG,EAAE,CAAC,CAAC,EAAE,SAAS,EAAE,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,UAAU,EAAE,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,CAAC,EAC3F,IAAI,EACJ,MAAM,CACP,CAAA;QACD,MAAM,eAAe,GAAG,UAAU,CAAC,eAAwC,CAAA;QAC3E,MAAM,eAAe,GAAG,UAAU,CAAC,eAAwC,CAAA;QAC3E,MAAM,cAAc,GAAG,UAAU,CAAC,cAAuC,CAAA;QACzE,yFAAyF;QACzF,2FAA2F;QAC3F,0FAA0F;QAC1F,0FAA0F;QAC1F,wFAAwF;QACxF,sFAAsF;QACtF,MAAM,mBAAmB,GAAG,eAAe,CAAA;QAE3C,uFAAuF;QACvF,4FAA4F;QAC5F,oFAAoF;QACpF,6FAA6F;QAC7F,2FAA2F;QAC3F,2FAA2F;QAC3F,8DAA8D;QAC9D,MAAM,OAAO,GAAG,KAAK,EAAE,CAAS,EAAE,OAAmB,EAAiB,EAAE;YACtE,GAAG,CAAC,IAAI,CAAC,gBAAgB,OAAO,CAAC,OAAO,EAAE,EAAE;gBAC1C,IAAI,EAAE,CAAC;gBACP,WAAW,EAAE,OAAO,CAAC,IAAI;gBACzB,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aACtD,CAAC,CAAA;YACF,MAAM,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,EAAE,GAAG,EAAE,CAC9B,SAAS,CAAC,gBAAgB,CAAC,OAAO,CAChC,WAAW,EACX,WAAW,EACX,OAAO,CAAC,OAAO,EACf,OAAO,CAAC,IAAI,EACZ,OAAO,CAAC,MAAM,EACd,OAAO,CAAC,MAAM,CACf,CACF,CAAA;QACH,CAAC,CAAA;QAED,mFAAmF;QACnF,qFAAqF;QACrF,sFAAsF;QACtF,MAAM,QAAQ,GAAG,KAAK,EACpB,KAAa,EACb,IAAkC,EACZ,EAAE;YACxB,IAAI,CAAC;gBACH,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,WAAW,EAAE,IAAI,CAAC,CAAkB,EAAE,CAAA;YAC3F,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,qFAAqF;gBACrF,sFAAsF;gBACtF,8EAA8E;gBAC9E,MAAM,GAAG,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;gBAClE,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,aAAa,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAA;YACnE,CAAC;QACH,CAAC,CAAA;QAED,2FAA2F;QAC3F,qFAAqF;QACrF,4BAA4B;QAC5B,MAAM,WAAW,GAAiB;YAChC,IAAI;YACJ,GAAG;YACH,QAAQ,EAAE,UAAU,CAAC,WAAW;YAChC,gBAAgB,EAAE,UAAU,CAAC,uBAAuB;YACpD,YAAY,EAAE,eAAe;YAC7B,QAAQ;YACR,OAAO;YACP,IAAI,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,gBAAgB,CAAC,YAAY,CAAC,WAAW,EAAE,WAAW,CAAC;SAC9E,CAAA;QACD,MAAM,YAAY,GAAG;YACnB,GAAG,WAAW;YACd,QAAQ,EAAE,UAAU,CAAC,UAAU;YAC/B,YAAY,EAAE,cAAc;YAC5B,IAAI,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,gBAAgB,CAAC,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC;YACzE,iBAAiB,EAAE,GAAG,EAAE,CACtB,SAAS,CAAC,gBAAgB,CAAC,yBAAyB,CAAC,WAAW,EAAE,WAAW,CAAC;SACjF,CAAA;QAED,KAAK,IAAI,CAAC,GAAG,CAAC,GAAI,CAAC,EAAE,EAAE,CAAC;YACtB,IAAI,MAAqB,CAAA;YACzB,IAAI,CAAC;gBACH,MAAM,GAAG,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC,WAAW,CAAC,EAAE,EAAE,WAAW,EAAE,GAAG,EAAE,CACxD,SAAS,CAAC,gBAAgB,CAAC,eAAe,CAAC,WAAW,EAAE,WAAW,EAAE;oBACnE,kBAAkB,EAAE,IAAI;iBACzB,CAAC,CACH,CAAkB,CAAA;YACrB,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,iFAAiF;gBACjF,sEAAsE;gBACtE,oFAAoF;gBACpF,mFAAmF;gBACnF,+DAA+D;gBAC/D,MAAM,OAAO,CAAC,CAAC,EAAE,uBAAuB,CAAC,KAAK,CAAC,CAAC,CAAA;gBAChD,OAAM;YACR,CAAC;YAED,gFAAgF;YAChF,oFAAoF;YACpF,sFAAsF;YACtF,8EAA8E;YAC9E,mFAAmF;YACnF,0BAA0B;YAC1B,IAAI,MAAM,CAAC,IAAI,KAAK,cAAc,EAAE,CAAC;gBACnC,MAAM,YAAY,GAAG,MAAM,aAAa,CAAC,WAAW,EAAE,CAAC,EAAE,MAAM,CAAC,CAAA;gBAChE,IAAI,YAAY,KAAK,IAAI;oBAAE,OAAM;gBACjC,MAAM,GAAG,YAAY,CAAA;YACvB,CAAC;YAED,qFAAqF;YACrF,iFAAiF;YACjF,uFAAuF;YACvF,kEAAkE;YAClE,IAAI,MAAM,CAAC,IAAI,KAAK,eAAe,EAAE,CAAC;gBACpC,MAAM,WAAW,GAAG,MAAM,iBAAiB,CAAC,YAAY,EAAE,CAAC,EAAE,MAAM,CAAC,CAAA;gBACpE,IAAI,WAAW,KAAK,IAAI;oBAAE,OAAM;gBAChC,MAAM,GAAG,WAAW,CAAA;gBACpB,2EAA2E;gBAC3E,gFAAgF;YAClF,CAAC;YAED,IAAI,MAAM,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;gBACjC,4EAA4E;gBAC5E,6EAA6E;gBAC7E,0EAA0E;gBAC1E,MAAM,OAAO,CAAC,CAAC,EAAE,iBAAiB,CAAC,MAAM,CAAC,CAAC,CAAA;gBAC3C,OAAM;YACR,CAAC;YAED,6EAA6E;YAC7E,4EAA4E;YAC5E,gFAAgF;YAChF,IAAI,MAAM,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;gBAClC,oFAAoF;gBACpF,mFAAmF;gBACnF,iFAAiF;gBACjF,iCAAiC;gBACjC,MAAM,OAAO,CAAC,CAAC,EAAE,iBAAiB,CAAC,MAAM,CAAC,CAAC,CAAA;gBAC3C,OAAM;YACR,CAAC;YAED,IAAI,MAAM,CAAC,IAAI,KAAK,MAAM,IAAI,MAAM,CAAC,IAAI,KAAK,MAAM;gBAAE,OAAM;YAE5D,oFAAoF;YACpF,uFAAuF;YACvF,qFAAqF;YACrF,uFAAuF;YACvF,oFAAoF;YACpF,yFAAyF;YACzF,qFAAqF;YACrF,wFAAwF;YACxF,wFAAwF;YACxF,4CAA4C;YAC5C,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBAC7B,IAAI,CAAC;oBACH,MAAM,IAAI,CAAC,YAAY,CAAC,gBAAgB,CAAC,EAAE,EAAE;wBAC3C,IAAI,EAAE,cAAc;wBACpB,OAAO,EAAE,mBAAmB;qBAC7B,CAAC,CAAA;gBACJ,CAAC;gBAAC,MAAM,CAAC;oBACP,uFAAuF;gBACzF,CAAC;gBACD,SAAQ;YACV,CAAC;YAED,IAAI,MAAM,CAAC,IAAI,KAAK,mBAAmB,EAAE,CAAC;gBACxC,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,CAAA;gBACpC,gFAAgF;gBAChF,gFAAgF;gBAChF,0EAA0E;gBAC1E,iFAAiF;gBACjF,6EAA6E;gBAC7E,iFAAiF;gBACjF,6EAA6E;gBAC7E,iFAAiF;gBACjF,IAAI,CAAC;oBACH,MAAM,IAAI,CAAC,YAAY,CAAC,SAAS,UAAU,IAAI,CAAC,EAAE,EAAE;wBAClD,IAAI,EAAE,YAAY,UAAU,EAAE;wBAC9B,OAAO,EAAE,eAAe;qBACzB,CAAC,CAAA;gBACJ,CAAC;gBAAC,MAAM,CAAC;oBACP,+EAA+E;gBACjF,CAAC;YACH,CAAC;YACD,+EAA+E;QACjF,CAAC;IACH,CAAC;CACF"}
|