@wjarka/cezarion 0.14.9-dev.898 → 0.14.9-dev.911
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/README.md +13 -0
- package/dist/ci-wait/controller.d.ts +12 -12
- package/dist/contract/index.js +50 -5
- package/dist/contract/projects.d.ts +40 -0
- package/dist/contract/runs.d.ts +43 -0
- package/dist/contract/skills.d.ts +5 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -1
- package/dist/runs/store.d.ts +12 -0
- package/dist/runs/store.js +5 -0
- package/dist/runs/store.js.map +1 -1
- package/dist/runs/webhook.d.ts +125 -0
- package/dist/runs/webhook.js +256 -0
- package/dist/runs/webhook.js.map +1 -0
- package/dist/server/server.d.ts +3647 -2416
- package/dist/server/server.js +131 -7
- package/dist/server/server.js.map +1 -1
- package/dist/skills-remote.d.ts +30 -5
- package/dist/skills-remote.js +122 -32
- package/dist/skills-remote.js.map +1 -1
- package/dist/task-cli/cli.js +51 -4
- package/dist/task-cli/cli.js.map +1 -1
- package/dist/task-cli/discovery.js +6 -5
- package/dist/task-cli/discovery.js.map +1 -1
- package/dist/task-cli/http.d.ts +3 -0
- package/dist/task-cli/http.js.map +1 -1
- package/dist/workflows/run.d.ts +2 -0
- package/dist/workflows/run.js +1 -0
- package/dist/workflows/run.js.map +1 -1
- package/dist/workspace/config.d.ts +9 -0
- package/dist/workspace/config.js +13 -1
- package/dist/workspace/config.js.map +1 -1
- package/dist/workspace/projects.d.ts +24 -1
- package/dist/workspace/projects.js +14 -1
- package/dist/workspace/projects.js.map +1 -1
- package/package.json +3 -3
- package/web/dist/assets/agent-accounts-Bh1l3ZSb.js +1 -0
- package/web/dist/assets/centered-state-kOb8j_BL.js +43 -0
- package/web/dist/assets/{collapsible-D3Lh_nlG.js → collapsible-KSKVv9J9.js} +1 -1
- package/web/dist/assets/{commit-list-CgoIXaVd.js → commit-list-na9G1rHG.js} +1 -1
- package/web/dist/assets/{compare-variants-2AnPP6ez.js → compare-variants-CG8saweC.js} +1 -1
- package/web/dist/assets/{diff-CZcD4D1r2.js → diff-Jd8igxRb2.js} +2 -2
- package/web/dist/assets/{diff-controls-BCazakYu.js → diff-controls-D_kgpdoa.js} +1 -1
- package/web/dist/assets/{diff-stat-Cn7rzy1H.js → diff-stat-C3Id3W_C.js} +1 -1
- package/web/dist/assets/{diff-view-C46nHiP2.js → diff-view-BK1wJX0D.js} +1 -1
- package/web/dist/assets/{dropdown-menu-CyFz8H2A.js → dropdown-menu-78Ug-7x2.js} +1 -1
- package/web/dist/assets/{git-toolbar-DT4Q02mZ.js → git-toolbar-DFC6bS8a.js} +1 -1
- package/web/dist/assets/github-BiUjSaov.js +1 -0
- package/web/dist/assets/{image-preview-B618kDBH.js → image-preview-BEOsw8qX.js} +1 -1
- package/web/dist/assets/index-D-m3edXI.js +7 -0
- package/web/dist/assets/index-D5NkwqY7.css +1 -0
- package/web/dist/assets/{markdown-0VE-LMFx.js → markdown-DlvW2wEx.js} +1 -1
- package/web/dist/assets/pill-0JHCf1v8.js +1 -0
- package/web/dist/assets/{project-router-EEnXzYjj.js → project-router-CS_oeLqi.js} +1 -1
- package/web/dist/assets/{prompt-templates-D8lCwJds.js → prompt-templates-BgXzCOlY.js} +3 -3
- package/web/dist/assets/repo-git-CMFUWUJo.js +1 -0
- package/web/dist/assets/{run-diff-C-Ij6Y04.js → run-diff-xym-7QHm.js} +2 -2
- package/web/dist/assets/run-header-BSKELRnz.js +1 -0
- package/web/dist/assets/skills-7nEXnFFc.js +1 -0
- package/web/dist/assets/{tab-link-CQc65wEy.js → tab-link-D6eAdJez.js} +1 -1
- package/web/dist/assets/{task-changes-CEi-l2GZ.js → task-changes-CjsEtUjh.js} +1 -1
- package/web/dist/assets/{task-commits-BYdWmsx1.js → task-commits-CeALoVuD.js} +1 -1
- package/web/dist/assets/{task-files-DHUEF1Fh.js → task-files-Csb6CCIr.js} +2 -2
- package/web/dist/assets/task-thread-B-e9ZDoy.js +9 -0
- package/web/dist/assets/{textarea-BOXhPgVD.js → textarea-D2Gx4GDI.js} +1 -1
- package/web/dist/assets/thread-loading-hVlcCLdm.js +1 -0
- package/web/dist/assets/{token-metrics-DJeOZ5n-.js → token-metrics-BQvw6Yoj.js} +1 -1
- package/web/dist/assets/{utils-DKheTxGD.js → utils-BW1-Ibnd.js} +1 -1
- package/web/dist/assets/workflows-CGbU1HdX.js +11 -0
- package/web/dist/assets/{zoomable-image-YW3Qdrr_.js → zoomable-image-DVvXID3t.js} +1 -1
- package/web/dist/index.html +14 -14
- package/web/dist/assets/agent-accounts-tNk0wiKj.js +0 -1
- package/web/dist/assets/centered-state-DXxIJA15.js +0 -43
- package/web/dist/assets/github-vwoJvCTz.js +0 -1
- package/web/dist/assets/index-1YNk4P3I.js +0 -7
- package/web/dist/assets/index-D0WAgmTQ.css +0 -1
- package/web/dist/assets/pill-BU5y1CTd.js +0 -1
- package/web/dist/assets/repo-git-CYDGngEk.js +0 -1
- package/web/dist/assets/run-header-DYiqx0qE.js +0 -1
- package/web/dist/assets/skills-CH6TkMy9.js +0 -1
- package/web/dist/assets/task-thread-DAxvkDvr.js +0 -9
- package/web/dist/assets/thread-loading-D9dDLmql.js +0 -1
- package/web/dist/assets/workflows-CpHaJbUe.js +0 -11
|
@@ -0,0 +1,256 @@
|
|
|
1
|
+
import { randomUUID } from 'node:crypto';
|
|
2
|
+
import { realpath } from 'node:fs/promises';
|
|
3
|
+
import { join } from 'node:path';
|
|
4
|
+
import { projectStatus } from '../task-cli/projections.js';
|
|
5
|
+
import { loadWorkspaceConfig } from '../workspace/config.js';
|
|
6
|
+
import { deriveRunContextEvents } from './event-history.js';
|
|
7
|
+
export const WEBHOOK_TIMEOUT_MS = 10_000;
|
|
8
|
+
export const WEBHOOK_ATTEMPTS = 3;
|
|
9
|
+
/** Wait before attempt 2 and attempt 3. */
|
|
10
|
+
export const WEBHOOK_BACKOFF_MS = [1_000, 4_000];
|
|
11
|
+
/** One POST, no retries. Shared by the queue and `POST /projects/:id/webhook/test`. */
|
|
12
|
+
export async function deliverOnce(target, payload, options = {}) {
|
|
13
|
+
try {
|
|
14
|
+
const response = await (options.fetch ?? fetch)(target.url, {
|
|
15
|
+
method: 'POST',
|
|
16
|
+
// A redirect would carry the Bearer token to a URL nobody configured.
|
|
17
|
+
redirect: 'error',
|
|
18
|
+
headers: {
|
|
19
|
+
'content-type': 'application/json',
|
|
20
|
+
'user-agent': 'cezar-task-webhook',
|
|
21
|
+
...(target.token ? { authorization: `Bearer ${target.token}` } : {}),
|
|
22
|
+
},
|
|
23
|
+
body: JSON.stringify(payload),
|
|
24
|
+
signal: AbortSignal.timeout(options.timeoutMs ?? WEBHOOK_TIMEOUT_MS),
|
|
25
|
+
});
|
|
26
|
+
await response.body?.cancel().catch(() => undefined);
|
|
27
|
+
return response.ok
|
|
28
|
+
? { ok: true, status: response.status }
|
|
29
|
+
: { ok: false, status: response.status, error: `HTTP ${response.status}` };
|
|
30
|
+
}
|
|
31
|
+
catch (error) {
|
|
32
|
+
const name = error instanceof Error ? error.name : '';
|
|
33
|
+
if (name === 'TimeoutError' || name === 'AbortError')
|
|
34
|
+
return { ok: false, error: 'timed out' };
|
|
35
|
+
const cause = error instanceof Error && error.cause instanceof Error ? `: ${error.cause.message}` : '';
|
|
36
|
+
return { ok: false, error: `${error instanceof Error ? error.message : String(error)}${cause}`.slice(0, 500) };
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
/** A 4xx other than 408/429 is the endpoint's answer, not a transient failure. */
|
|
40
|
+
function retryable(result) {
|
|
41
|
+
if (result.status === undefined)
|
|
42
|
+
return true;
|
|
43
|
+
return result.status >= 500 || result.status === 408 || result.status === 429;
|
|
44
|
+
}
|
|
45
|
+
const seenOf = (run) => ({
|
|
46
|
+
status: run.status,
|
|
47
|
+
activity: run.activity ?? null,
|
|
48
|
+
ask: run.hasPendingHumanAsk === true,
|
|
49
|
+
});
|
|
50
|
+
export class TaskWebhook {
|
|
51
|
+
store;
|
|
52
|
+
options;
|
|
53
|
+
seen = new Map();
|
|
54
|
+
queues = new Map();
|
|
55
|
+
seqs = new Map();
|
|
56
|
+
onRun = (run) => this.observe(run);
|
|
57
|
+
onDeleted = (id) => this.seen.delete(id);
|
|
58
|
+
disposed = false;
|
|
59
|
+
constructor(store, options) {
|
|
60
|
+
this.store = store;
|
|
61
|
+
this.options = options;
|
|
62
|
+
// Seed from what the store already holds, so a context built after a restart does not
|
|
63
|
+
// report every existing run as a fresh transition.
|
|
64
|
+
for (const run of store.listRuns())
|
|
65
|
+
this.seen.set(run.id, seenOf(run));
|
|
66
|
+
store.on('run', this.onRun);
|
|
67
|
+
store.on('deleted', this.onDeleted);
|
|
68
|
+
}
|
|
69
|
+
dispose() {
|
|
70
|
+
this.disposed = true;
|
|
71
|
+
this.store.off('run', this.onRun);
|
|
72
|
+
this.store.off('deleted', this.onDeleted);
|
|
73
|
+
}
|
|
74
|
+
/** The hand-off delivery (`POST /runs/:id/notify` turning notify on). A run created with
|
|
75
|
+
* `notify: true` gets the same delivery from `observe`. */
|
|
76
|
+
subscribed(runId, message) {
|
|
77
|
+
const run = this.store.getRun(runId);
|
|
78
|
+
if (!run)
|
|
79
|
+
return;
|
|
80
|
+
this.enqueue({ event: 'task.subscribed', run, previousStatus: null, occurredAt: new Date().toISOString(), message });
|
|
81
|
+
}
|
|
82
|
+
/** Resolves once every delivery queued so far has settled (tests, shutdown). */
|
|
83
|
+
async idle() {
|
|
84
|
+
while (this.queues.size > 0)
|
|
85
|
+
await Promise.all([...this.queues.values()]);
|
|
86
|
+
}
|
|
87
|
+
observe(run) {
|
|
88
|
+
const before = this.seen.get(run.id);
|
|
89
|
+
const now = seenOf(run);
|
|
90
|
+
this.seen.set(run.id, now);
|
|
91
|
+
if (!run.notify || this.disposed)
|
|
92
|
+
return;
|
|
93
|
+
const occurredAt = new Date().toISOString();
|
|
94
|
+
// A run created opted in (the New task toggle, `cez task start`) announces itself once, as
|
|
95
|
+
// `POST /runs/:id/notify` does, so the bot learns the id and link while the run is queued.
|
|
96
|
+
if (!before) {
|
|
97
|
+
this.enqueue({ event: 'task.subscribed', run, previousStatus: null, occurredAt });
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
if (before.status !== now.status) {
|
|
101
|
+
this.enqueue({ event: 'task.status', run, previousStatus: before.status, occurredAt });
|
|
102
|
+
}
|
|
103
|
+
if (before.activity !== now.activity) {
|
|
104
|
+
this.enqueue({ event: 'task.activity', run, previousStatus: null, occurredAt });
|
|
105
|
+
}
|
|
106
|
+
if (!before.ask && now.ask) {
|
|
107
|
+
this.enqueue({ event: 'task.question', run, previousStatus: null, occurredAt });
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
enqueue(pending) {
|
|
111
|
+
const runId = pending.run.id;
|
|
112
|
+
// Snapshot now: the record object is live and will have moved on by the time this sends.
|
|
113
|
+
const snapshot = { ...pending, run: { ...pending.run } };
|
|
114
|
+
const previous = this.queues.get(runId) ?? Promise.resolve();
|
|
115
|
+
const next = previous
|
|
116
|
+
.then(() => this.deliver(snapshot))
|
|
117
|
+
.catch(() => undefined)
|
|
118
|
+
.finally(() => {
|
|
119
|
+
if (this.queues.get(runId) === next)
|
|
120
|
+
this.queues.delete(runId);
|
|
121
|
+
});
|
|
122
|
+
this.queues.set(runId, next);
|
|
123
|
+
}
|
|
124
|
+
async payload(pending, projectId) {
|
|
125
|
+
const { run } = pending;
|
|
126
|
+
const seq = (this.seqs.get(run.id) ?? 0) + 1;
|
|
127
|
+
this.seqs.set(run.id, seq);
|
|
128
|
+
const origin = this.options.origin() ?? '';
|
|
129
|
+
const url = `${origin}/p/${encodeURIComponent(projectId)}/tasks/${encodeURIComponent(run.id)}`;
|
|
130
|
+
const question = run.hasPendingHumanAsk ? await this.pendingQuestion(run.id) : undefined;
|
|
131
|
+
return {
|
|
132
|
+
event: pending.event,
|
|
133
|
+
deliveryId: randomUUID(),
|
|
134
|
+
seq,
|
|
135
|
+
projectId,
|
|
136
|
+
runId: run.id,
|
|
137
|
+
url,
|
|
138
|
+
status: run.status,
|
|
139
|
+
previousStatus: pending.previousStatus,
|
|
140
|
+
activity: run.activity ?? null,
|
|
141
|
+
occurredAt: pending.occurredAt,
|
|
142
|
+
...(pending.message === undefined ? {} : { message: pending.message }),
|
|
143
|
+
// The same slim projection `cez task status` prints, so a bot parses one shape.
|
|
144
|
+
task: { ...projectStatus(run, url, question), notify: run.notify === true },
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
async pendingQuestion(runId) {
|
|
148
|
+
try {
|
|
149
|
+
const context = await deriveRunContextEvents(join(this.options.dataDir, 'runs', `${runId}.ndjson`));
|
|
150
|
+
return [...context.contextEvents].reverse().find((event) => event.type === 'ask.requested')?.questions;
|
|
151
|
+
}
|
|
152
|
+
catch {
|
|
153
|
+
return undefined;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
async deliver(pending) {
|
|
157
|
+
await this.options.ready?.();
|
|
158
|
+
const project = await this.options.resolveProject().catch(() => undefined);
|
|
159
|
+
// Removed since the run opted in: nothing to send to, and nobody to tell.
|
|
160
|
+
if (!project?.webhook)
|
|
161
|
+
return;
|
|
162
|
+
const payload = await this.payload(pending, project.id);
|
|
163
|
+
const runId = pending.run.id;
|
|
164
|
+
if (this.options.dryRun ?? process.env.CEZ_DRY_RUN === '1') {
|
|
165
|
+
this.store.appendEvent(runId, { type: 'webhook.dry-run', event: payload.event, payload });
|
|
166
|
+
this.store.updateRun(runId, { webhook: { lastDeliveredAt: new Date().toISOString() } });
|
|
167
|
+
return;
|
|
168
|
+
}
|
|
169
|
+
const sleep = this.options.sleep ?? ((ms) => new Promise((done) => setTimeout(done, ms)));
|
|
170
|
+
let result = { ok: false, error: 'not attempted' };
|
|
171
|
+
let attempts = 0;
|
|
172
|
+
while (attempts < WEBHOOK_ATTEMPTS) {
|
|
173
|
+
if (attempts > 0)
|
|
174
|
+
await sleep(WEBHOOK_BACKOFF_MS[attempts - 1] ?? 0);
|
|
175
|
+
attempts += 1;
|
|
176
|
+
result = await deliverOnce(project.webhook, payload, {
|
|
177
|
+
fetch: this.options.fetch,
|
|
178
|
+
timeoutMs: this.options.timeoutMs,
|
|
179
|
+
});
|
|
180
|
+
if (result.ok || !retryable(result))
|
|
181
|
+
break;
|
|
182
|
+
}
|
|
183
|
+
const previous = this.store.getRun(runId)?.webhook;
|
|
184
|
+
if (result.ok) {
|
|
185
|
+
this.store.updateRun(runId, { webhook: { lastDeliveredAt: new Date().toISOString() } });
|
|
186
|
+
return;
|
|
187
|
+
}
|
|
188
|
+
const error = (result.error ?? 'delivery failed').slice(0, 500);
|
|
189
|
+
this.store.updateRun(runId, {
|
|
190
|
+
webhook: { ...(previous?.lastDeliveredAt ? { lastDeliveredAt: previous.lastDeliveredAt } : {}), lastError: error },
|
|
191
|
+
});
|
|
192
|
+
this.store.appendEvent(runId, {
|
|
193
|
+
type: 'webhook.failed',
|
|
194
|
+
event: payload.event,
|
|
195
|
+
deliveryId: payload.deliveryId,
|
|
196
|
+
attempts,
|
|
197
|
+
error,
|
|
198
|
+
...(result.status === undefined ? {} : { status: result.status }),
|
|
199
|
+
});
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* Every project's `TaskWebhook`, keyed by store (#589). It exists so the subscriber can be
|
|
204
|
+
* attached BEFORE `manager.recover()`: recovery re-queues, resumes or fails the runs that were
|
|
205
|
+
* live when the last process exited, and a subscriber attached after it would seed those new
|
|
206
|
+
* statuses as the starting state and never report them. `index.ts` attaches the boot project
|
|
207
|
+
* right after opening its store; every lazily built project attaches through
|
|
208
|
+
* `ProjectContexts`' `prepareManager` hook, which runs before that project's recovery.
|
|
209
|
+
*
|
|
210
|
+
* Deliveries wait for `setOrigin`, which `startServer` calls once it knows its port.
|
|
211
|
+
*/
|
|
212
|
+
export class TaskWebhooks {
|
|
213
|
+
options;
|
|
214
|
+
hooks = new WeakMap();
|
|
215
|
+
origin;
|
|
216
|
+
markReady;
|
|
217
|
+
ready = new Promise((done) => { this.markReady = done; });
|
|
218
|
+
constructor(options = {}) {
|
|
219
|
+
this.options = options;
|
|
220
|
+
if (options.origin !== undefined)
|
|
221
|
+
this.setOrigin(options.origin);
|
|
222
|
+
}
|
|
223
|
+
setOrigin(origin) {
|
|
224
|
+
this.origin = origin;
|
|
225
|
+
this.markReady();
|
|
226
|
+
}
|
|
227
|
+
/** Idempotent: a store already attached keeps its subscriber and its queue. `id` may be the
|
|
228
|
+
* reserved `default` alias, which resolves to the registry entry holding `root`. */
|
|
229
|
+
attach(project) {
|
|
230
|
+
const existing = this.hooks.get(project.store);
|
|
231
|
+
if (existing)
|
|
232
|
+
return existing;
|
|
233
|
+
const hook = new TaskWebhook(project.store, {
|
|
234
|
+
resolveProject: () => registryWebhook(project.id, project.root),
|
|
235
|
+
origin: () => this.origin,
|
|
236
|
+
ready: () => this.ready,
|
|
237
|
+
dataDir: join(project.root, '.ai/cezar'),
|
|
238
|
+
fetch: this.options.fetch,
|
|
239
|
+
});
|
|
240
|
+
this.hooks.set(project.store, hook);
|
|
241
|
+
return hook;
|
|
242
|
+
}
|
|
243
|
+
get(store) {
|
|
244
|
+
return this.hooks.get(store);
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
/** The registry entry this project is, read per delivery so a settings change applies at once. */
|
|
248
|
+
async function registryWebhook(id, root) {
|
|
249
|
+
const projects = (await loadWorkspaceConfig()).projects;
|
|
250
|
+
const real = id === 'default' ? await realpath(root).catch(() => root) : root;
|
|
251
|
+
const entry = id === 'default'
|
|
252
|
+
? projects.find((project) => project.root === real || project.root === root)
|
|
253
|
+
: projects.find((project) => project.id === id);
|
|
254
|
+
return entry ? { id: entry.id, ...(entry.webhook ? { webhook: entry.webhook } : {}) } : undefined;
|
|
255
|
+
}
|
|
256
|
+
//# sourceMappingURL=webhook.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webhook.js","sourceRoot":"","sources":["../../src/runs/webhook.ts"],"names":[],"mappings":"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"}
|