@wjarka/cezarion 0.14.9-dev.888 → 0.14.9-dev.901

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (82) hide show
  1. package/README.md +12 -0
  2. package/dist/contract/index.js +50 -5
  3. package/dist/contract/projects.d.ts +40 -0
  4. package/dist/contract/runs.d.ts +43 -0
  5. package/dist/contract/skills.d.ts +5 -0
  6. package/dist/core/cursor-acp-runner.js +43 -0
  7. package/dist/core/cursor-acp-runner.js.map +1 -1
  8. package/dist/index.js +6 -0
  9. package/dist/index.js.map +1 -1
  10. package/dist/runs/store.d.ts +12 -0
  11. package/dist/runs/store.js +5 -0
  12. package/dist/runs/store.js.map +1 -1
  13. package/dist/runs/webhook.d.ts +125 -0
  14. package/dist/runs/webhook.js +256 -0
  15. package/dist/runs/webhook.js.map +1 -0
  16. package/dist/server/server.d.ts +2634 -1403
  17. package/dist/server/server.js +131 -7
  18. package/dist/server/server.js.map +1 -1
  19. package/dist/task-cli/cli.js +51 -4
  20. package/dist/task-cli/cli.js.map +1 -1
  21. package/dist/task-cli/discovery.js +6 -5
  22. package/dist/task-cli/discovery.js.map +1 -1
  23. package/dist/task-cli/http.d.ts +3 -0
  24. package/dist/task-cli/http.js.map +1 -1
  25. package/dist/workflows/run.d.ts +2 -0
  26. package/dist/workflows/run.js +1 -0
  27. package/dist/workflows/run.js.map +1 -1
  28. package/dist/workspace/config.d.ts +9 -0
  29. package/dist/workspace/config.js +13 -1
  30. package/dist/workspace/config.js.map +1 -1
  31. package/dist/workspace/projects.d.ts +24 -1
  32. package/dist/workspace/projects.js +14 -1
  33. package/dist/workspace/projects.js.map +1 -1
  34. package/package.json +3 -3
  35. package/scripts/mock-cursor-hang-stdin-late.mjs +35 -0
  36. package/scripts/mock-cursor-hang-stdin.mjs +19 -5
  37. package/web/dist/assets/agent-accounts-DOFEs7OK.js +1 -0
  38. package/web/dist/assets/centered-state-BrRPODjj.js +43 -0
  39. package/web/dist/assets/{collapsible-D3Lh_nlG.js → collapsible-CH3UzMt8.js} +1 -1
  40. package/web/dist/assets/{commit-list-CgoIXaVd.js → commit-list-BF4myGkq.js} +1 -1
  41. package/web/dist/assets/{compare-variants-2AnPP6ez.js → compare-variants-DNX6SniB.js} +1 -1
  42. package/web/dist/assets/{diff-CZcD4D1r2.js → diff-Jd8igxRb2.js} +2 -2
  43. package/web/dist/assets/{diff-controls-BCazakYu.js → diff-controls-1iZN3L9z.js} +1 -1
  44. package/web/dist/assets/{diff-stat-Cn7rzy1H.js → diff-stat-C3Id3W_C.js} +1 -1
  45. package/web/dist/assets/{diff-view-C46nHiP2.js → diff-view-BK1wJX0D.js} +1 -1
  46. package/web/dist/assets/{dropdown-menu-CyFz8H2A.js → dropdown-menu-JK2oEKtU.js} +1 -1
  47. package/web/dist/assets/{git-toolbar-DT4Q02mZ.js → git-toolbar-Czc2eDts.js} +1 -1
  48. package/web/dist/assets/github-BOYBHSuU.js +1 -0
  49. package/web/dist/assets/{image-preview-B618kDBH.js → image-preview-BEOsw8qX.js} +1 -1
  50. package/web/dist/assets/index-CaQiR7tg.js +7 -0
  51. package/web/dist/assets/index-Cp146nCD.css +1 -0
  52. package/web/dist/assets/{markdown-0VE-LMFx.js → markdown-CbMH76QP.js} +1 -1
  53. package/web/dist/assets/pill-i0LDDqPl.js +1 -0
  54. package/web/dist/assets/{project-router-EEnXzYjj.js → project-router-5lOBnHn-.js} +1 -1
  55. package/web/dist/assets/{prompt-templates-D8lCwJds.js → prompt-templates-CinGNbS4.js} +3 -3
  56. package/web/dist/assets/repo-git-CwEH2IXE.js +1 -0
  57. package/web/dist/assets/{run-diff-C-Ij6Y04.js → run-diff-3peOAX9l.js} +2 -2
  58. package/web/dist/assets/run-header-DDuQGG2F.js +1 -0
  59. package/web/dist/assets/{skills-CH6TkMy9.js → skills-Cd35zfc2.js} +1 -1
  60. package/web/dist/assets/{tab-link-CQc65wEy.js → tab-link-KwnZekGX.js} +1 -1
  61. package/web/dist/assets/task-changes-BRAnOBnv.js +1 -0
  62. package/web/dist/assets/{task-commits-BYdWmsx1.js → task-commits-CLHTP-nL.js} +1 -1
  63. package/web/dist/assets/{task-files-DHUEF1Fh.js → task-files-BbQ3zTG5.js} +2 -2
  64. package/web/dist/assets/task-thread-BzPJy_YC.js +9 -0
  65. package/web/dist/assets/{textarea-BOXhPgVD.js → textarea-CP5yQwcP.js} +1 -1
  66. package/web/dist/assets/thread-loading-DRqt03Zs.js +1 -0
  67. package/web/dist/assets/{token-metrics-DJeOZ5n-.js → token-metrics-BjlJ1WUf.js} +1 -1
  68. package/web/dist/assets/{utils-DKheTxGD.js → utils-BW1-Ibnd.js} +1 -1
  69. package/web/dist/assets/{workflows-CpHaJbUe.js → workflows-BPYflHS1.js} +4 -4
  70. package/web/dist/assets/{zoomable-image-YW3Qdrr_.js → zoomable-image-DVvXID3t.js} +1 -1
  71. package/web/dist/index.html +14 -14
  72. package/web/dist/assets/agent-accounts-tNk0wiKj.js +0 -1
  73. package/web/dist/assets/centered-state-DXxIJA15.js +0 -43
  74. package/web/dist/assets/github-vwoJvCTz.js +0 -1
  75. package/web/dist/assets/index-1YNk4P3I.js +0 -7
  76. package/web/dist/assets/index-D0WAgmTQ.css +0 -1
  77. package/web/dist/assets/pill-BU5y1CTd.js +0 -1
  78. package/web/dist/assets/repo-git-CYDGngEk.js +0 -1
  79. package/web/dist/assets/run-header-DYiqx0qE.js +0 -1
  80. package/web/dist/assets/task-changes-CEi-l2GZ.js +0 -1
  81. package/web/dist/assets/task-thread-DAxvkDvr.js +0 -9
  82. package/web/dist/assets/thread-loading-D9dDLmql.js +0 -1
@@ -0,0 +1,125 @@
1
+ import type { RunActivity, RunStatus } from '../contract/index.js';
2
+ import type { RunStore } from './store.ts';
3
+ /**
4
+ * The task webhook (#589, spec 2026-09-25-task-webhook-handoff): a run that opted in with
5
+ * `notify: true` POSTs its status changes to the project's webhook with a Bearer token.
6
+ *
7
+ * One subscriber per project store, on the store's `'run'` emission. That emission is the single
8
+ * choke point every status change passes through — both turn-end handlers in `workflows/run.ts`,
9
+ * both `ActiveRun` construction sites, recovery and the routes — so nothing upstream is edited
10
+ * to feed it. The subscriber diffs each record against the last one it saw and queues a delivery
11
+ * for what changed.
12
+ *
13
+ * A record created opted in sends `task.subscribed` once; a record created without it sends
14
+ * nothing until `POST /runs/:id/notify` opts it in.
15
+ *
16
+ * Delivery is best-effort and never touches the run's lifecycle: one in-order queue per run, a
17
+ * 10 s timeout, 3 attempts with backoff, and the outcome written to `run.webhook` plus a
18
+ * `webhook.failed` thread event when every attempt failed. The queue is in memory; a restart
19
+ * drops what was pending (out of scope in #589).
20
+ */
21
+ export type TaskWebhookEvent = 'task.status' | 'task.question' | 'task.activity' | 'task.subscribed' | 'task.test';
22
+ export interface TaskWebhookTarget {
23
+ url: string;
24
+ token?: string;
25
+ }
26
+ export interface TaskWebhookPayload {
27
+ event: TaskWebhookEvent;
28
+ deliveryId: string;
29
+ seq: number;
30
+ projectId: string;
31
+ runId: string;
32
+ url: string;
33
+ status: RunStatus;
34
+ previousStatus: RunStatus | null;
35
+ activity: RunActivity | null;
36
+ occurredAt: string;
37
+ message?: string;
38
+ task: Record<string, unknown>;
39
+ }
40
+ export interface DeliveryResult {
41
+ ok: boolean;
42
+ status?: number;
43
+ error?: string;
44
+ }
45
+ export declare const WEBHOOK_TIMEOUT_MS = 10000;
46
+ export declare const WEBHOOK_ATTEMPTS = 3;
47
+ /** Wait before attempt 2 and attempt 3. */
48
+ export declare const WEBHOOK_BACKOFF_MS: readonly number[];
49
+ export interface TaskWebhookOptions {
50
+ /** This project's registry id and current webhook, read per delivery so a settings change
51
+ * applies without a restart and a removed webhook stops deliveries at once. */
52
+ resolveProject: () => Promise<{
53
+ id: string;
54
+ webhook?: TaskWebhookTarget;
55
+ } | undefined>;
56
+ /** The cockpit origin (`http://127.0.0.1:4321`) for the thread link; unknown before listen. */
57
+ origin: () => string | undefined;
58
+ /** Resolves once the origin is known. Recovery runs before the server listens, and its
59
+ * transitions queue behind this rather than going out with a path-only link. */
60
+ ready?: () => Promise<void>;
61
+ /** Where the run's NDJSON lives, for the pending question. */
62
+ dataDir: string;
63
+ /** `CEZ_DRY_RUN=1` by default: log the payload as a run event, send nothing. */
64
+ dryRun?: boolean;
65
+ fetch?: typeof fetch;
66
+ sleep?: (ms: number) => Promise<void>;
67
+ timeoutMs?: number;
68
+ }
69
+ /** One POST, no retries. Shared by the queue and `POST /projects/:id/webhook/test`. */
70
+ export declare function deliverOnce(target: TaskWebhookTarget, payload: unknown, options?: {
71
+ fetch?: typeof fetch;
72
+ timeoutMs?: number;
73
+ }): Promise<DeliveryResult>;
74
+ export declare class TaskWebhook {
75
+ private readonly store;
76
+ private readonly options;
77
+ private readonly seen;
78
+ private readonly queues;
79
+ private readonly seqs;
80
+ private readonly onRun;
81
+ private readonly onDeleted;
82
+ private disposed;
83
+ constructor(store: RunStore, options: TaskWebhookOptions);
84
+ dispose(): void;
85
+ /** The hand-off delivery (`POST /runs/:id/notify` turning notify on). A run created with
86
+ * `notify: true` gets the same delivery from `observe`. */
87
+ subscribed(runId: string, message?: string): void;
88
+ /** Resolves once every delivery queued so far has settled (tests, shutdown). */
89
+ idle(): Promise<void>;
90
+ private observe;
91
+ private enqueue;
92
+ private payload;
93
+ private pendingQuestion;
94
+ private deliver;
95
+ }
96
+ /**
97
+ * Every project's `TaskWebhook`, keyed by store (#589). It exists so the subscriber can be
98
+ * attached BEFORE `manager.recover()`: recovery re-queues, resumes or fails the runs that were
99
+ * live when the last process exited, and a subscriber attached after it would seed those new
100
+ * statuses as the starting state and never report them. `index.ts` attaches the boot project
101
+ * right after opening its store; every lazily built project attaches through
102
+ * `ProjectContexts`' `prepareManager` hook, which runs before that project's recovery.
103
+ *
104
+ * Deliveries wait for `setOrigin`, which `startServer` calls once it knows its port.
105
+ */
106
+ export declare class TaskWebhooks {
107
+ private readonly options;
108
+ private readonly hooks;
109
+ private origin;
110
+ private markReady;
111
+ private readonly ready;
112
+ constructor(options?: {
113
+ fetch?: typeof fetch;
114
+ origin?: string;
115
+ });
116
+ setOrigin(origin: string): void;
117
+ /** Idempotent: a store already attached keeps its subscriber and its queue. `id` may be the
118
+ * reserved `default` alias, which resolves to the registry entry holding `root`. */
119
+ attach(project: {
120
+ id: string;
121
+ root: string;
122
+ store: RunStore;
123
+ }): TaskWebhook;
124
+ get(store: RunStore): TaskWebhook | undefined;
125
+ }
@@ -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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"}