@cat-factory/worker 0.128.2 → 0.130.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 +3 -1
- package/dist/infrastructure/container-assembly.d.ts.map +1 -1
- package/dist/infrastructure/container-assembly.js +48 -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 +57 -117
- package/dist/infrastructure/container.js.map +1 -1
- package/dist/infrastructure/repositories/D1AgentContextSnapshotRepository.d.ts +2 -0
- package/dist/infrastructure/repositories/D1AgentContextSnapshotRepository.d.ts.map +1 -1
- package/dist/infrastructure/repositories/D1AgentContextSnapshotRepository.js +20 -4
- package/dist/infrastructure/repositories/D1AgentContextSnapshotRepository.js.map +1 -1
- package/dist/infrastructure/repositories/D1AgentSearchQueryRepository.d.ts +2 -0
- package/dist/infrastructure/repositories/D1AgentSearchQueryRepository.d.ts.map +1 -1
- package/dist/infrastructure/repositories/D1AgentSearchQueryRepository.js +22 -4
- package/dist/infrastructure/repositories/D1AgentSearchQueryRepository.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/D1LlmCallMetricRepository.d.ts +2 -0
- package/dist/infrastructure/repositories/D1LlmCallMetricRepository.d.ts.map +1 -1
- package/dist/infrastructure/repositories/D1LlmCallMetricRepository.js +21 -3
- package/dist/infrastructure/repositories/D1LlmCallMetricRepository.js.map +1 -1
- package/dist/infrastructure/repositories/D1NotificationWebhookRepository.d.ts +5 -1
- package/dist/infrastructure/repositories/D1NotificationWebhookRepository.d.ts.map +1 -1
- package/dist/infrastructure/repositories/D1NotificationWebhookRepository.js +11 -5
- package/dist/infrastructure/repositories/D1NotificationWebhookRepository.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/0072_webhook_run_events.sql +11 -0
- package/migrations/0073_foundational_services.sql +84 -0
- package/package.json +18 -18
|
@@ -1,5 +1,9 @@
|
|
|
1
|
-
import { parseNotificationWebhookTypes } from '@cat-factory/server';
|
|
2
|
-
/**
|
|
1
|
+
import { parseNotificationWebhookTypes, parseRunLifecycleEvents } from '@cat-factory/server';
|
|
2
|
+
/**
|
|
3
|
+
* A workspace's outbound webhook, one row per workspace (migration 0061; `run_events` added in
|
|
4
|
+
* 0072). Both JSON filter columns are decoded through the SHARED parsers the Drizzle repo uses,
|
|
5
|
+
* so the columns can't drift between runtimes.
|
|
6
|
+
*/
|
|
3
7
|
export class D1NotificationWebhookRepository {
|
|
4
8
|
db;
|
|
5
9
|
constructor({ db }) {
|
|
@@ -16,6 +20,7 @@ export class D1NotificationWebhookRepository {
|
|
|
16
20
|
workspaceId: row.workspace_id,
|
|
17
21
|
url: row.url,
|
|
18
22
|
types: parseNotificationWebhookTypes(row.types),
|
|
23
|
+
runEvents: parseRunLifecycleEvents(row.run_events),
|
|
19
24
|
enabled: row.enabled === 1,
|
|
20
25
|
secretSealed: row.secret_sealed,
|
|
21
26
|
updatedAt: row.updated_at,
|
|
@@ -24,15 +29,16 @@ export class D1NotificationWebhookRepository {
|
|
|
24
29
|
async put(record) {
|
|
25
30
|
await this.db
|
|
26
31
|
.prepare(`INSERT INTO notification_webhooks
|
|
27
|
-
(workspace_id, url, types, enabled, secret_sealed, updated_at)
|
|
28
|
-
VALUES (?, ?, ?, ?, ?, ?)
|
|
32
|
+
(workspace_id, url, types, run_events, enabled, secret_sealed, updated_at)
|
|
33
|
+
VALUES (?, ?, ?, ?, ?, ?, ?)
|
|
29
34
|
ON CONFLICT (workspace_id) DO UPDATE SET
|
|
30
35
|
url = excluded.url,
|
|
31
36
|
types = excluded.types,
|
|
37
|
+
run_events = excluded.run_events,
|
|
32
38
|
enabled = excluded.enabled,
|
|
33
39
|
secret_sealed = excluded.secret_sealed,
|
|
34
40
|
updated_at = excluded.updated_at`)
|
|
35
|
-
.bind(record.workspaceId, record.url, JSON.stringify(record.types), record.enabled ? 1 : 0, record.secretSealed, record.updatedAt)
|
|
41
|
+
.bind(record.workspaceId, record.url, JSON.stringify(record.types), JSON.stringify(record.runEvents), record.enabled ? 1 : 0, record.secretSealed, record.updatedAt)
|
|
36
42
|
.run();
|
|
37
43
|
}
|
|
38
44
|
async delete(workspaceId) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"D1NotificationWebhookRepository.js","sourceRoot":"","sources":["../../../src/infrastructure/repositories/D1NotificationWebhookRepository.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,6BAA6B,EAAE,MAAM,qBAAqB,CAAA;
|
|
1
|
+
{"version":3,"file":"D1NotificationWebhookRepository.js","sourceRoot":"","sources":["../../../src/infrastructure/repositories/D1NotificationWebhookRepository.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,6BAA6B,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAA;AAY5F;;;;GAIG;AACH,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,GAAG,CAAC,WAAmB;QAC3B,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,EAAE;aACtB,OAAO,CAAC,4DAA4D,CAAC;aACrE,IAAI,CAAC,WAAW,CAAC;aACjB,KAAK,EAA0B,CAAA;QAClC,IAAI,CAAC,GAAG;YAAE,OAAO,IAAI,CAAA;QACrB,OAAO;YACL,WAAW,EAAE,GAAG,CAAC,YAAY;YAC7B,GAAG,EAAE,GAAG,CAAC,GAAG;YACZ,KAAK,EAAE,6BAA6B,CAAC,GAAG,CAAC,KAAK,CAAC;YAC/C,SAAS,EAAE,uBAAuB,CAAC,GAAG,CAAC,UAAU,CAAC;YAClD,OAAO,EAAE,GAAG,CAAC,OAAO,KAAK,CAAC;YAC1B,YAAY,EAAE,GAAG,CAAC,aAAa;YAC/B,SAAS,EAAE,GAAG,CAAC,UAAU;SAC1B,CAAA;IACH,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,MAAiC;QACzC,MAAM,IAAI,CAAC,EAAE;aACV,OAAO,CACN;;;;;;;;;4CASoC,CACrC;aACA,IAAI,CACH,MAAM,CAAC,WAAW,EAClB,MAAM,CAAC,GAAG,EACV,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,EAC5B,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,SAAS,CAAC,EAChC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EACtB,MAAM,CAAC,YAAY,EACnB,MAAM,CAAC,SAAS,CACjB;aACA,GAAG,EAAE,CAAA;IACV,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,WAAmB;QAC9B,MAAM,IAAI,CAAC,EAAE;aACV,OAAO,CAAC,0DAA0D,CAAC;aACnE,IAAI,CAAC,WAAW,CAAC;aACjB,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":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
-- Run-lifecycle events on the workspace's outbound webhook (migration 0061). The endpoint that
|
|
2
|
+
-- already receives notification cards can now also receive the lifecycle of the work itself —
|
|
3
|
+
-- `run.started` / `run.completed` / `run.failed` — which raises no notification at all on the
|
|
4
|
+
-- happy path (a pipeline with a `merger` merges its own PR and settles with an empty inbox), so
|
|
5
|
+
-- a headless integration could previously only learn that its task finished by polling.
|
|
6
|
+
--
|
|
7
|
+
-- `run_events` is a JSON array, and EMPTY means NONE — the opposite of the sibling `types`
|
|
8
|
+
-- column, deliberately: every existing row defaults to '[]' and therefore keeps byte-for-byte its
|
|
9
|
+
-- current behaviour, rather than an endpoint registered for parked decisions suddenly receiving
|
|
10
|
+
-- an event per run.
|
|
11
|
+
ALTER TABLE notification_webhooks ADD COLUMN run_events TEXT NOT NULL DEFAULT '[]';
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
-- Foundational services (docs/initiatives/foundational-services.md).
|
|
2
|
+
-- A tiered catalog of shared capabilities (file storage, notifications, audit …) that a
|
|
3
|
+
-- designed system is expected to CONSUME rather than rebuild. Rows are scoped by an
|
|
4
|
+
-- (owner_kind, owner_id) pair — an account id or a workspace id — exactly like the
|
|
5
|
+
-- prompt-fragment library, so one table backs both tenancy tiers and a workspace tombstone
|
|
6
|
+
-- can suppress an inherited account service.
|
|
7
|
+
--
|
|
8
|
+
-- Identity and DOCUMENTS are deliberately separate tables. The Architect's catalog read runs
|
|
9
|
+
-- on every design dispatch and must never load a contract body (an OpenAPI document routinely
|
|
10
|
+
-- runs to hundreds of kilobytes, one per service); only the consumer steps, for only the
|
|
11
|
+
-- services the design declared, read `api_contracts.body`. Keeping them apart makes that a
|
|
12
|
+
-- property of the schema rather than a discipline every caller has to remember.
|
|
13
|
+
|
|
14
|
+
CREATE TABLE foundational_services (
|
|
15
|
+
service_id TEXT NOT NULL, -- the slug an Architect names in its design
|
|
16
|
+
owner_kind TEXT NOT NULL, -- 'account' | 'workspace'
|
|
17
|
+
owner_id TEXT NOT NULL,
|
|
18
|
+
name TEXT NOT NULL,
|
|
19
|
+
summary TEXT NOT NULL, -- one line; the catalog's relevance signal
|
|
20
|
+
description TEXT NOT NULL DEFAULT '', -- what it does, when to use it, what it does NOT cover
|
|
21
|
+
capabilities TEXT NOT NULL DEFAULT '[]', -- JSON string[] of capability tags
|
|
22
|
+
source_id TEXT, -- → foundational_service_sources.id (repo-sourced)
|
|
23
|
+
source_path TEXT,
|
|
24
|
+
pinned_commit TEXT, -- head commit the service dir was synced at
|
|
25
|
+
created_at INTEGER NOT NULL,
|
|
26
|
+
updated_at INTEGER NOT NULL,
|
|
27
|
+
deleted_at INTEGER, -- tombstone (removed upstream / suppressed by tier)
|
|
28
|
+
PRIMARY KEY (owner_kind, owner_id, service_id)
|
|
29
|
+
);
|
|
30
|
+
CREATE INDEX idx_foundational_services_owner
|
|
31
|
+
ON foundational_services (owner_kind, owner_id) WHERE deleted_at IS NULL;
|
|
32
|
+
CREATE INDEX idx_foundational_services_source
|
|
33
|
+
ON foundational_services (source_id) WHERE deleted_at IS NULL;
|
|
34
|
+
|
|
35
|
+
CREATE TABLE api_contracts (
|
|
36
|
+
owner_kind TEXT NOT NULL,
|
|
37
|
+
owner_id TEXT NOT NULL,
|
|
38
|
+
service_id TEXT NOT NULL,
|
|
39
|
+
contract_id TEXT NOT NULL, -- slug within the service (the file basename)
|
|
40
|
+
format TEXT NOT NULL, -- 'openapi' | 'toad-contract' | 'lokalise-api-contract'
|
|
41
|
+
title TEXT NOT NULL,
|
|
42
|
+
body TEXT NOT NULL, -- the document verbatim (never read by the catalog)
|
|
43
|
+
-- Operations indexed ONCE at write time, so the catalog can show an agent what the interface
|
|
44
|
+
-- offers without loading a body. JSON string[]; empty for the TypeScript formats.
|
|
45
|
+
operations TEXT NOT NULL DEFAULT '[]',
|
|
46
|
+
omitted_operations INTEGER NOT NULL DEFAULT 0,
|
|
47
|
+
source_path TEXT, -- repo provenance; null for a direct upload
|
|
48
|
+
source_sha TEXT,
|
|
49
|
+
created_at INTEGER NOT NULL,
|
|
50
|
+
updated_at INTEGER NOT NULL,
|
|
51
|
+
PRIMARY KEY (owner_kind, owner_id, service_id, contract_id)
|
|
52
|
+
);
|
|
53
|
+
-- The catalog's manifest read (whole tier, no bodies) and the lazy read (a set of service ids)
|
|
54
|
+
-- both ride this index.
|
|
55
|
+
CREATE INDEX idx_api_contracts_owner
|
|
56
|
+
ON api_contracts (owner_kind, owner_id, service_id);
|
|
57
|
+
|
|
58
|
+
CREATE TABLE foundational_service_sources (
|
|
59
|
+
id TEXT NOT NULL PRIMARY KEY,
|
|
60
|
+
owner_kind TEXT NOT NULL,
|
|
61
|
+
owner_id TEXT NOT NULL,
|
|
62
|
+
repo_owner TEXT NOT NULL,
|
|
63
|
+
repo_name TEXT NOT NULL,
|
|
64
|
+
git_ref TEXT NOT NULL DEFAULT 'HEAD',
|
|
65
|
+
-- 'directory' scans <dir_path>/<service>/; 'files' reads an explicit path list for ONE service.
|
|
66
|
+
mode TEXT NOT NULL DEFAULT 'directory',
|
|
67
|
+
-- The scanned subtree ('directory'), or the linked files' deepest common directory ('files').
|
|
68
|
+
-- Either way it is what the single head-commit staleness probe anchors on.
|
|
69
|
+
dir_path TEXT NOT NULL DEFAULT '',
|
|
70
|
+
file_paths TEXT NOT NULL DEFAULT '[]', -- JSON string[]; 'files' mode only
|
|
71
|
+
service_id TEXT, -- 'files' mode only: the service they describe
|
|
72
|
+
service_name TEXT,
|
|
73
|
+
service_summary TEXT,
|
|
74
|
+
last_synced_commit TEXT,
|
|
75
|
+
last_synced_at INTEGER,
|
|
76
|
+
created_at INTEGER NOT NULL,
|
|
77
|
+
deleted_at INTEGER,
|
|
78
|
+
UNIQUE (owner_kind, owner_id, repo_owner, repo_name, git_ref, dir_path)
|
|
79
|
+
);
|
|
80
|
+
CREATE INDEX idx_foundational_sources_owner
|
|
81
|
+
ON foundational_service_sources (owner_kind, owner_id) WHERE deleted_at IS NULL;
|
|
82
|
+
-- The autorefresh sweep drains the oldest-synced live sources in bounded batches.
|
|
83
|
+
CREATE INDEX idx_foundational_sources_stale
|
|
84
|
+
ON foundational_service_sources (last_synced_at) WHERE deleted_at IS NULL;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cat-factory/worker",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.130.0",
|
|
4
4
|
"description": "Reusable Cloudflare Worker library (Hono + D1) exposing the Agent Architecture Board core: the `createApp()` Hono factory, the default fetch/scheduled/queue handler, and the Durable Object + Workflow classes. Deployments (see deploy/backend) supply the wrangler.toml + config and re-export these.",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -42,22 +42,22 @@
|
|
|
42
42
|
"pino": "^10.3.1",
|
|
43
43
|
"valibot": "^1.4.2",
|
|
44
44
|
"workers-ai-provider": "^4.0.0",
|
|
45
|
-
"@cat-factory/agents": "0.
|
|
46
|
-
"@cat-factory/caching": "0.
|
|
47
|
-
"@cat-factory/consensus": "0.13.
|
|
48
|
-
"@cat-factory/contracts": "0.
|
|
49
|
-
"@cat-factory/eks": "0.1.
|
|
50
|
-
"@cat-factory/gates": "0.8.
|
|
51
|
-
"@cat-factory/
|
|
52
|
-
"@cat-factory/
|
|
53
|
-
"@cat-factory/
|
|
54
|
-
"@cat-factory/
|
|
55
|
-
"@cat-factory/
|
|
56
|
-
"@cat-factory/
|
|
57
|
-
"@cat-factory/
|
|
58
|
-
"@cat-factory/
|
|
59
|
-
"@cat-factory/
|
|
60
|
-
"@cat-factory/
|
|
45
|
+
"@cat-factory/agents": "0.96.0",
|
|
46
|
+
"@cat-factory/caching": "0.12.0",
|
|
47
|
+
"@cat-factory/consensus": "0.13.13",
|
|
48
|
+
"@cat-factory/contracts": "0.204.0",
|
|
49
|
+
"@cat-factory/eks": "0.1.187",
|
|
50
|
+
"@cat-factory/gates": "0.8.33",
|
|
51
|
+
"@cat-factory/integrations": "0.113.8",
|
|
52
|
+
"@cat-factory/gitlab": "0.14.16",
|
|
53
|
+
"@cat-factory/observability-langfuse": "0.9.30",
|
|
54
|
+
"@cat-factory/kernel": "0.203.0",
|
|
55
|
+
"@cat-factory/prompt-fragments": "0.15.27",
|
|
56
|
+
"@cat-factory/observability-otel": "0.4.30",
|
|
57
|
+
"@cat-factory/provider-cloudflare": "0.7.339",
|
|
58
|
+
"@cat-factory/server": "0.188.0",
|
|
59
|
+
"@cat-factory/spend": "0.12.134",
|
|
60
|
+
"@cat-factory/orchestration": "0.179.0"
|
|
61
61
|
},
|
|
62
62
|
"devDependencies": {
|
|
63
63
|
"@cloudflare/vitest-pool-workers": "^0.18.8",
|
|
@@ -65,7 +65,7 @@
|
|
|
65
65
|
"typescript": "7.0.2",
|
|
66
66
|
"vitest": "^4.1.10",
|
|
67
67
|
"wrangler": "^4.114.0",
|
|
68
|
-
"@cat-factory/conformance": "0.
|
|
68
|
+
"@cat-factory/conformance": "0.17.0"
|
|
69
69
|
},
|
|
70
70
|
"scripts": {
|
|
71
71
|
"build": "tsc -b tsconfig.build.json",
|