@open-mercato/cezar 0.9.1 → 0.9.2
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 +19 -11
- package/dist/agent-config/catalog.d.ts +1 -1
- package/dist/agent-config/files.d.ts +1 -1
- package/dist/agent-config/service.d.ts +1 -1
- package/dist/agent-config/validate.d.ts +1 -1
- package/dist/automations/coordinator.d.ts +26 -0
- package/dist/automations/coordinator.js +66 -0
- package/dist/automations/coordinator.js.map +1 -0
- package/dist/automations/github-poller.d.ts +74 -0
- package/dist/automations/github-poller.js +234 -0
- package/dist/automations/github-poller.js.map +1 -0
- package/dist/automations/scheduler.d.ts +42 -0
- package/dist/automations/scheduler.js +192 -0
- package/dist/automations/scheduler.js.map +1 -0
- package/dist/automations/store.d.ts +65 -0
- package/dist/automations/store.js +298 -0
- package/dist/automations/store.js.map +1 -0
- package/dist/automations/task-template.d.ts +18 -0
- package/dist/automations/task-template.js +95 -0
- package/dist/automations/task-template.js.map +1 -0
- package/dist/automations/types.d.ts +251 -0
- package/dist/automations/types.js +158 -0
- package/dist/automations/types.js.map +1 -0
- package/dist/config.d.ts +9 -111
- package/dist/contract/agent-config.d.ts +151 -0
- package/dist/contract/automations.d.ts +911 -0
- package/dist/contract/events.d.ts +45 -0
- package/dist/contract/github.d.ts +467 -0
- package/dist/contract/health.d.ts +96 -0
- package/dist/contract/index.d.ts +15 -0
- package/dist/contract/index.js +1421 -0
- package/dist/contract/projects.d.ts +182 -0
- package/dist/contract/repo.d.ts +234 -0
- package/dist/contract/runs.d.ts +1226 -0
- package/dist/contract/skills.d.ts +225 -0
- package/dist/contract/workflows.d.ts +212 -0
- package/dist/contract/workspace.d.ts +442 -0
- package/dist/core/agent-env.d.ts +1 -1
- package/dist/core/agent-runner.d.ts +12 -1
- package/dist/core/agent-runner.js +13 -0
- package/dist/core/agent-runner.js.map +1 -1
- package/dist/core/ask.d.ts +45 -124
- package/dist/core/ask.js +103 -13
- package/dist/core/ask.js.map +1 -1
- package/dist/core/claude-cli-runner.d.ts +2 -2
- package/dist/core/claude-cli-runner.js +52 -9
- package/dist/core/claude-cli-runner.js.map +1 -1
- package/dist/core/claude-ui-mapper.d.ts +1 -1
- package/dist/core/codex-app-server-runner.d.ts +1 -1
- package/dist/core/codex-app-server-runner.js +55 -3
- package/dist/core/codex-app-server-runner.js.map +1 -1
- package/dist/core/codex-app-server-transport.d.ts +6 -1
- package/dist/core/codex-app-server-transport.js +12 -3
- package/dist/core/codex-app-server-transport.js.map +1 -1
- package/dist/core/codex-model-catalog.d.ts +1 -1
- package/dist/core/codex-ui-mapper.d.ts +5 -1
- package/dist/core/codex-ui-mapper.js +74 -17
- package/dist/core/codex-ui-mapper.js.map +1 -1
- package/dist/core/model-identity.d.ts +1 -1
- package/dist/core/model-presets.d.ts +2 -2
- package/dist/core/model-presets.js +1 -1
- package/dist/core/opencode-server-runner.d.ts +2 -2
- package/dist/core/opencode-ui-mapper.d.ts +4 -1
- package/dist/core/opencode-ui-mapper.js +45 -7
- package/dist/core/opencode-ui-mapper.js.map +1 -1
- package/dist/core/provider-auth.d.ts +62 -0
- package/dist/core/provider-auth.js +290 -0
- package/dist/core/provider-auth.js.map +1 -0
- package/dist/core/provider-availability.d.ts +3 -0
- package/dist/core/provider-availability.js +13 -0
- package/dist/core/provider-availability.js.map +1 -0
- package/dist/core/runner-factory.d.ts +1 -1
- package/dist/core/runner-model-catalog.d.ts +1 -1
- package/dist/core/tool-display.d.ts +1 -1
- package/dist/core/ui-events.d.ts +1 -1
- package/dist/core/ui-events.js +1 -1
- package/dist/git-diff-base.d.ts +60 -0
- package/dist/git-diff-base.js +54 -0
- package/dist/git-diff-base.js.map +1 -0
- package/dist/git-worktree.d.ts +37 -6
- package/dist/git-worktree.js +39 -9
- package/dist/git-worktree.js.map +1 -1
- package/dist/handoff.d.ts +2 -2
- package/dist/handoff.js +1 -1
- package/dist/index.js +65 -8
- package/dist/index.js.map +1 -1
- package/dist/paths.d.ts +16 -1
- package/dist/paths.js +24 -1
- package/dist/paths.js.map +1 -1
- package/dist/planner.d.ts +2 -2
- package/dist/planner.js +1 -1
- package/dist/planner.js.map +1 -1
- package/dist/release/manifests.d.ts +81 -0
- package/dist/release/manifests.js +74 -0
- package/dist/release/manifests.js.map +1 -0
- package/dist/release/snapshot.d.ts +9 -23
- package/dist/release/snapshot.js +9 -22
- package/dist/release/snapshot.js.map +1 -1
- package/dist/release/stable.d.ts +15 -29
- package/dist/release/stable.js +14 -27
- package/dist/release/stable.js.map +1 -1
- package/dist/runs/auto-name.d.ts +1 -1
- package/dist/runs/retention.d.ts +1 -1
- package/dist/runs/store.d.ts +142 -336
- package/dist/runs/store.js +136 -9
- package/dist/runs/store.js.map +1 -1
- package/dist/runs/ui-event-sink.d.ts +1 -1
- package/dist/server/app-type.d.ts +21 -0
- package/dist/server/app-type.js +2 -0
- package/dist/server/app-type.js.map +1 -0
- package/dist/server/capabilities.d.ts +6 -5
- package/dist/server/capabilities.js +11 -0
- package/dist/server/capabilities.js.map +1 -1
- package/dist/server/forge/github.d.ts +58 -151
- package/dist/server/forge/github.js +530 -6
- package/dist/server/forge/github.js.map +1 -1
- package/dist/server/forge/index.d.ts +10 -3
- package/dist/server/forge/index.js +14 -1
- package/dist/server/forge/index.js.map +1 -1
- package/dist/server/forge/types.d.ts +86 -1
- package/dist/server/git-changes.d.ts +8 -8
- package/dist/server/git-changes.js +14 -17
- package/dist/server/git-changes.js.map +1 -1
- package/dist/server/git.d.ts +2 -0
- package/dist/server/git.js +9 -0
- package/dist/server/git.js.map +1 -1
- package/dist/server/github.d.ts +3 -3
- package/dist/server/github.js +1 -1
- package/dist/server/github.js.map +1 -1
- package/dist/server/pr.d.ts +2 -2
- package/dist/server/project-context.d.ts +20 -3
- package/dist/server/project-context.js +30 -1
- package/dist/server/project-context.js.map +1 -1
- package/dist/server/provider-action-gate.d.ts +8 -0
- package/dist/server/provider-action-gate.js +54 -0
- package/dist/server/provider-action-gate.js.map +1 -0
- package/dist/server/provider-auth-runtime.d.ts +21 -0
- package/dist/server/provider-auth-runtime.js +66 -0
- package/dist/server/provider-auth-runtime.js.map +1 -0
- package/dist/server/server.d.ts +11142 -47
- package/dist/server/server.js +1714 -806
- package/dist/server/server.js.map +1 -1
- package/dist/server/validators.d.ts +97 -0
- package/dist/server/validators.js +86 -0
- package/dist/server/validators.js.map +1 -0
- package/dist/server/ws.d.ts +2 -2
- package/dist/server/ws.js +2 -2
- package/dist/server/ws.js.map +1 -1
- package/dist/server-install/engine.d.ts +1 -1
- package/dist/server-install/platforms/macosx-ngrok.d.ts +1 -1
- package/dist/server-install/platforms/ubuntu-vps.d.ts +16 -1
- package/dist/server-install/platforms/ubuntu-vps.js +83 -1
- package/dist/server-install/platforms/ubuntu-vps.js.map +1 -1
- package/dist/server-install/state.d.ts +1 -1
- package/dist/server-install/steps.d.ts +2 -2
- package/dist/server-install/strategies.d.ts +1 -1
- package/dist/server-install/types.d.ts +38 -424
- package/dist/server-install/ui.d.ts +1 -1
- package/dist/skills-banner.d.ts +7 -6
- package/dist/skills-banner.js +7 -6
- package/dist/skills-banner.js.map +1 -1
- package/dist/skills-remote.d.ts +2 -2
- package/dist/skills-update.d.ts +88 -0
- package/dist/skills-update.js +392 -0
- package/dist/skills-update.js.map +1 -0
- package/dist/skills.d.ts +2 -0
- package/dist/skills.js +3 -2
- package/dist/skills.js.map +1 -1
- package/dist/todos.d.ts +2 -28
- package/dist/todos.js +1 -1
- package/dist/ui-state.d.ts +16 -2
- package/dist/ui-state.js +14 -1
- package/dist/ui-state.js.map +1 -1
- package/dist/workflows/load.d.ts +1 -1
- package/dist/workflows/run.d.ts +53 -12
- package/dist/workflows/run.js +436 -64
- package/dist/workflows/run.js.map +1 -1
- package/dist/workflows/types.d.ts +59 -224
- package/dist/workflows/types.js +14 -0
- package/dist/workflows/types.js.map +1 -1
- package/dist/workspace/config.d.ts +68 -206
- package/dist/workspace/config.js +145 -14
- package/dist/workspace/config.js.map +1 -1
- package/dist/workspace/migrations.d.ts +1 -1
- package/dist/workspace/migrations.js +19 -4
- package/dist/workspace/migrations.js.map +1 -1
- package/dist/workspace/projects.d.ts +8 -2
- package/dist/workspace/projects.js +9 -3
- package/dist/workspace/projects.js.map +1 -1
- package/dist/workspace/semaphore.d.ts +6 -0
- package/dist/workspace/semaphore.js +14 -1
- package/dist/workspace/semaphore.js.map +1 -1
- package/dist/workspace/ui-state.d.ts +13 -3
- package/dist/workspace/ui-state.js +15 -5
- package/dist/workspace/ui-state.js.map +1 -1
- package/package.json +17 -39
- package/scripts/inline-contract.mjs +112 -0
- package/scripts/mock-claude.mjs +39 -1
- package/scripts/sync-readme.mjs +20 -0
- package/web/dist/assets/alert-dialog-ghffK6g9.js +1 -0
- package/web/dist/assets/arrow-down-Cz8qb71e.js +1 -0
- package/web/dist/assets/arrow-left-wcYKQXI_.js +1 -0
- package/web/dist/assets/bundle-mjs-BT31bpU6.js +1 -0
- package/web/dist/assets/centered-state-ZtnFHA-n.js +43 -0
- package/web/dist/assets/chevron-right-G4caF2QV.js +1 -0
- package/web/dist/assets/{chunk-BO2N2NFS-DtrdTCWa.js → chunk-BO2N2NFS-DE6qKn3r.js} +8 -8
- package/web/dist/assets/circle-check--KvBxXWp.js +1 -0
- package/web/dist/assets/circle-x-C3EFZ3xf.js +1 -0
- package/web/dist/assets/collapsible-B0JVzd0B.js +1 -0
- package/web/dist/assets/commit-list-wm6DPHNs.js +1 -0
- package/web/dist/assets/compare-variants-DbdP4Y5T.js +1 -0
- package/web/dist/assets/{core-DePtBHcl.js → core-BCsw8oQw.js} +1 -1
- package/web/dist/assets/diff-Bizc96qe.js +3 -0
- package/web/dist/assets/diff-stat-Dyfg3ltF.js +1 -0
- package/web/dist/assets/{diff-view-DCeSegKk.js → diff-view-CG8ek6tC.js} +4 -4
- package/web/dist/assets/dropdown-menu-C1Dlf35P.js +1 -0
- package/web/dist/assets/editable-title-5rC_QRBZ.js +1 -0
- package/web/dist/assets/{ellipsis-vertical-CNnSLn5a.js → ellipsis-vertical-DpGTRqC2.js} +1 -1
- package/web/dist/assets/{file-D4GBh1ao.js → file-DlUGpUlb.js} +1 -1
- package/web/dist/assets/folder-BAY6Vddy.js +1 -0
- package/web/dist/assets/{git-pull-request-DnR8Xh4_.js → git-pull-request-agOG0iGM.js} +1 -1
- package/web/dist/assets/git-toolbar-DGiNMmtY.js +1 -0
- package/web/dist/assets/github-Vp7lxYGQ.js +1 -0
- package/web/dist/assets/highlighted-body-OFNGDK62-BL-MfFgl.js +1 -0
- package/web/dist/assets/highlighter-CdHqIwFr.js +3 -0
- package/web/dist/assets/image-preview-BWGk5fPX.js +1 -0
- package/web/dist/assets/index-DSxyJpuK.css +2 -0
- package/web/dist/assets/index-DiawI6RX.js +6 -0
- package/web/dist/assets/lib-BQXq3kEf.js +1 -0
- package/web/dist/assets/lib-BxQXEXDF.js +1 -0
- package/web/dist/assets/markdown-BGBOGCA_.js +2 -0
- package/web/dist/assets/mermaid-GHXKKRXX-C4jxqUUb.js +1 -0
- package/web/dist/assets/new-task-form-BpAw_Dks.js +1 -0
- package/web/dist/assets/pill-Dvs-P0xy.js +1 -0
- package/web/dist/assets/project-router-Cx8NPoqn.js +1 -0
- package/web/dist/assets/prompt-templates-CSBYBR1I.js +15 -0
- package/web/dist/assets/react-runtime-CCIEwYL0.js +9 -0
- package/web/dist/assets/{refresh-cw-BT8E96Tm.js → refresh-cw-BoGdAykg.js} +1 -1
- package/web/dist/assets/repo-git-PmX-BNMo.js +1 -0
- package/web/dist/assets/rolldown-runtime-QTnfLwEv.js +1 -0
- package/web/dist/assets/run-diff-EcOkf3ti.js +3 -0
- package/web/dist/assets/run-header-BGiv6_qX.js +1 -0
- package/web/dist/assets/{search-x-BDjaMrzG.js → search-x-X3EpVhgs.js} +1 -1
- package/web/dist/assets/skill-empty-hint-CZLALx6l.js +1 -0
- package/web/dist/assets/skills-BiWfHmCR.js +1 -0
- package/web/dist/assets/skills-CC91ouGH.js +1 -0
- package/web/dist/assets/sparkles-Dt4q7pbG.js +1 -0
- package/web/dist/assets/{square-terminal-Ckjjn0vb.js → square-terminal-hwBL8XsC.js} +1 -1
- package/web/dist/assets/tab-link-DIlR5T07.js +1 -0
- package/web/dist/assets/task-changes-XkHDxzQA.js +1 -0
- package/web/dist/assets/task-commits-BTTA5k5T.js +1 -0
- package/web/dist/assets/task-files-Da8_4C9g.js +2 -0
- package/web/dist/assets/task-thread-DoNXUsHr.js +9 -0
- package/web/dist/assets/textarea-CUdokhkv.js +1 -0
- package/web/dist/assets/thread-loading-B8q8ukXJ.js +1 -0
- package/web/dist/assets/{trash-2-DAyZ0VSi.js → trash-2-DhVIdWv8.js} +1 -1
- package/web/dist/assets/{triangle-alert-Uy8rokUh.js → triangle-alert-XYT0DGCI.js} +1 -1
- package/web/dist/assets/{upload-CDdyPPo_.js → upload-BKjN59-1.js} +1 -1
- package/web/dist/assets/use-desktop-Bf5LS_P4.js +1 -0
- package/web/dist/assets/use-submit-shortcut-CzVyoAMd.js +1 -0
- package/web/dist/assets/utils-DsLuRXwV.js +64 -0
- package/web/dist/assets/workflows-o2QU_pvU.js +11 -0
- package/web/dist/assets/zoomable-image-7WyUiaVD.js +1 -0
- package/web/dist/index.html +32 -13
- package/scripts/dev.mjs +0 -74
- package/scripts/release-snapshot.mjs +0 -130
- package/scripts/release.mjs +0 -119
- package/web/dist/assets/arrow-left-CnSdp92h.js +0 -1
- package/web/dist/assets/bundle-mjs-BegPhL5c.js +0 -1
- package/web/dist/assets/centered-state-DOsTcJZF.js +0 -43
- package/web/dist/assets/commit-list-BrxBEzRK.js +0 -1
- package/web/dist/assets/compare-variants-Bv2c9ORF.js +0 -1
- package/web/dist/assets/dist-B6XQOhgM.js +0 -1
- package/web/dist/assets/git-toolbar-pIC1ubPM.js +0 -1
- package/web/dist/assets/github-DTTSG0ht.js +0 -1
- package/web/dist/assets/highlighted-body-OFNGDK62-BuFJwunK.js +0 -1
- package/web/dist/assets/image-preview-DEhW0TFz.js +0 -1
- package/web/dist/assets/index-Cijmlz7q.js +0 -30
- package/web/dist/assets/index-DzroxqBG.css +0 -2
- package/web/dist/assets/lib-DPEZDBUN.js +0 -1
- package/web/dist/assets/lib-uHpeUPzK.js +0 -1
- package/web/dist/assets/mermaid-GHXKKRXX-CN2zQue0.js +0 -1
- package/web/dist/assets/open-mercato-toBr6SOa.svg +0 -11
- package/web/dist/assets/project-router-BMx4e8m-.js +0 -1
- package/web/dist/assets/repo-git-BusYfa3t.js +0 -1
- package/web/dist/assets/run-diff-wOJ3odA-.js +0 -3
- package/web/dist/assets/run-header-Cg5incil.js +0 -1
- package/web/dist/assets/skill-empty-hint-DTUSp6Vl.js +0 -1
- package/web/dist/assets/skills-PpP2owbM.js +0 -1
- package/web/dist/assets/tab-link-F3uQrdm2.js +0 -1
- package/web/dist/assets/task-changes-iD9kS79I.js +0 -1
- package/web/dist/assets/task-commits-COkLaUri.js +0 -1
- package/web/dist/assets/task-files-Ckttz7XH.js +0 -2
- package/web/dist/assets/task-thread-CQD91VPt.js +0 -9
- package/web/dist/assets/textarea-Bj_LCreg.js +0 -1
- package/web/dist/assets/use-desktop-DUh0STzq.js +0 -3
- package/web/dist/assets/utils-B8s5qIcK.js +0 -1
- package/web/dist/assets/workflows-BFk8C0co.js +0 -11
- package/web/dist/assets/zoomable-image-PEDOqyLQ.js +0 -1
- /package/web/{open-mercato.svg → dist/open-mercato.svg} +0 -0
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
/** One request chain process-wide. The promise tail also prevents a failed request from
|
|
2
|
+
* poisoning later projects. */
|
|
3
|
+
class GithubRequestArbiter {
|
|
4
|
+
tail = Promise.resolve();
|
|
5
|
+
run(operation) {
|
|
6
|
+
const current = this.tail.then(operation, operation);
|
|
7
|
+
this.tail = current.catch(() => undefined);
|
|
8
|
+
return current;
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
const githubRequests = new GithubRequestArbiter();
|
|
12
|
+
export class ProjectAutomationScheduler {
|
|
13
|
+
handle;
|
|
14
|
+
constructor(handle) {
|
|
15
|
+
this.handle = handle;
|
|
16
|
+
}
|
|
17
|
+
async check(definition, mode = 'execute') {
|
|
18
|
+
const detectionOnly = mode === 'execute' && !this.handle.launch;
|
|
19
|
+
if (detectionOnly)
|
|
20
|
+
mode = 'preview';
|
|
21
|
+
const { store } = this.handle;
|
|
22
|
+
const lease = store.acquireLease();
|
|
23
|
+
if (!lease)
|
|
24
|
+
throw new Error('automation polling lease is held by another process');
|
|
25
|
+
const started = Date.now();
|
|
26
|
+
let completion;
|
|
27
|
+
try {
|
|
28
|
+
const state = store.state(definition.id) ?? {};
|
|
29
|
+
if (state.backoffUntil && Date.parse(state.backoffUntil) > Date.now()) {
|
|
30
|
+
throw new Error(`automation is backed off until ${state.backoffUntil}`);
|
|
31
|
+
}
|
|
32
|
+
const since = state.cursor?.timestamp ?? state.baselineAt;
|
|
33
|
+
const overlapSince = since
|
|
34
|
+
? new Date(Date.parse(since) - 120_000).toISOString()
|
|
35
|
+
: undefined;
|
|
36
|
+
const result = await githubRequests.run(() => this.handle.poller.poll(this.handle.owner, this.handle.repo, definition, { since: overlapSince }));
|
|
37
|
+
const eligible = result.candidates.filter((candidate) => {
|
|
38
|
+
if (state.baselineAt && candidate.timestamp <= state.baselineAt)
|
|
39
|
+
return false;
|
|
40
|
+
if (!state.cursor)
|
|
41
|
+
return true;
|
|
42
|
+
const overlap = Date.parse(state.cursor.timestamp) - 120_000;
|
|
43
|
+
return Date.parse(candidate.timestamp) >= overlap;
|
|
44
|
+
});
|
|
45
|
+
if (mode === 'execute' && this.handle.launch) {
|
|
46
|
+
for (const candidate of eligible)
|
|
47
|
+
await this.launch(definition, candidate);
|
|
48
|
+
}
|
|
49
|
+
if (mode === 'execute') {
|
|
50
|
+
const now = new Date().toISOString();
|
|
51
|
+
const cursor = laterCursor(state.cursor, result.cursor);
|
|
52
|
+
store.setState(definition.id, {
|
|
53
|
+
...state,
|
|
54
|
+
revision: definition.revision,
|
|
55
|
+
cursor,
|
|
56
|
+
frozenHighWatermark: result.truncated && cursor?.tieBreaker
|
|
57
|
+
? { timestamp: cursor.timestamp, tieBreaker: cursor.tieBreaker }
|
|
58
|
+
: undefined,
|
|
59
|
+
lastSuccessAt: now,
|
|
60
|
+
nextCheckAt: new Date(Date.now() + definition.intervalSeconds * 1_000).toISOString(),
|
|
61
|
+
consecutiveFailures: 0,
|
|
62
|
+
backoffUntil: undefined,
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
else if (detectionOnly) {
|
|
66
|
+
store.setState(definition.id, {
|
|
67
|
+
...state,
|
|
68
|
+
revision: definition.revision,
|
|
69
|
+
nextCheckAt: new Date(Date.now() + definition.intervalSeconds * 1_000).toISOString(),
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
this.handle.onChange?.(definition.id, definition.revision);
|
|
73
|
+
completion = mode === 'preview'
|
|
74
|
+
? { result: 'preview', reason: `Bounded preview found ${eligible.length} match${eligible.length === 1 ? '' : 'es'}; no tasks were launched.` }
|
|
75
|
+
: { result: 'no-match', reason: 'Scheduled check completed.' };
|
|
76
|
+
return { ...result, candidates: eligible };
|
|
77
|
+
}
|
|
78
|
+
catch (error) {
|
|
79
|
+
if (mode === 'execute')
|
|
80
|
+
this.recordFailure(definition, error);
|
|
81
|
+
else
|
|
82
|
+
store.appendLog({ automationId: definition.id, revision: definition.revision, result: 'error', reason: error instanceof Error ? error.message : String(error) });
|
|
83
|
+
throw error;
|
|
84
|
+
}
|
|
85
|
+
finally {
|
|
86
|
+
if (completion)
|
|
87
|
+
store.appendLog({ automationId: definition.id, revision: definition.revision, ...completion, durationMs: Date.now() - started });
|
|
88
|
+
try {
|
|
89
|
+
store.maybeCompact();
|
|
90
|
+
}
|
|
91
|
+
catch { /* append-only state remains readable; next check retries */ }
|
|
92
|
+
lease.release();
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
async launch(definition, candidate) {
|
|
96
|
+
const receipt = this.handle.store.reserveReceipt({ automationId: definition.id, revision: definition.revision, eventId: candidate.eventId, candidate });
|
|
97
|
+
if (!receipt) {
|
|
98
|
+
this.handle.store.appendLog({ automationId: definition.id, revision: definition.revision, event: candidate.event, result: 'duplicate', reason: 'A durable receipt already exists for this automation and event.', githubNumber: candidate.number, githubTitle: candidate.title, githubUrl: candidate.url });
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
try {
|
|
102
|
+
const launched = await this.handle.launch(definition, candidate, receipt.receiptId);
|
|
103
|
+
this.handle.store.appendReceipt({ ...receipt, status: 'launched', runId: launched.runId, updatedAt: new Date().toISOString() });
|
|
104
|
+
this.handle.store.appendLog({ automationId: definition.id, revision: definition.revision, event: candidate.event, result: 'launched', receiptId: receipt.receiptId, runId: launched.runId, githubNumber: candidate.number, githubTitle: candidate.title, githubUrl: candidate.url });
|
|
105
|
+
}
|
|
106
|
+
catch (error) {
|
|
107
|
+
this.handle.store.appendReceipt({ ...receipt, status: 'launch-error', error: error instanceof Error ? error.message : String(error), updatedAt: new Date().toISOString() });
|
|
108
|
+
throw error;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
recordFailure(definition, error) {
|
|
112
|
+
const state = this.handle.store.state(definition.id) ?? {};
|
|
113
|
+
const failures = (state.consecutiveFailures ?? 0) + 1;
|
|
114
|
+
const delay = Math.min(6 * 60 * 60_000, 60_000 * 2 ** (failures - 1));
|
|
115
|
+
this.handle.store.setState(definition.id, {
|
|
116
|
+
...state,
|
|
117
|
+
consecutiveFailures: failures,
|
|
118
|
+
backoffUntil: new Date(Date.now() + delay).toISOString(),
|
|
119
|
+
nextCheckAt: new Date(Date.now() + delay).toISOString(),
|
|
120
|
+
});
|
|
121
|
+
this.handle.store.appendLog({ automationId: definition.id, revision: definition.revision, result: 'error', reason: error instanceof Error ? error.message : String(error) });
|
|
122
|
+
this.handle.onChange?.(definition.id, definition.revision);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
function laterCursor(current, observed) {
|
|
126
|
+
if (!observed)
|
|
127
|
+
return current;
|
|
128
|
+
if (!current)
|
|
129
|
+
return observed;
|
|
130
|
+
const order = observed.timestamp.localeCompare(current.timestamp)
|
|
131
|
+
|| observed.tieBreaker.localeCompare(current.tieBreaker ?? '');
|
|
132
|
+
return order > 0 ? observed : current;
|
|
133
|
+
}
|
|
134
|
+
/** One workspace timer, created only while at least one enabled definition exists. */
|
|
135
|
+
export class WorkspaceAutomationScheduler {
|
|
136
|
+
options;
|
|
137
|
+
timer;
|
|
138
|
+
stopped = true;
|
|
139
|
+
scheduleGeneration = 0;
|
|
140
|
+
constructor(options) {
|
|
141
|
+
this.options = options;
|
|
142
|
+
}
|
|
143
|
+
async start() {
|
|
144
|
+
this.stopped = false;
|
|
145
|
+
await this.reschedule();
|
|
146
|
+
}
|
|
147
|
+
async reschedule() {
|
|
148
|
+
if (this.stopped)
|
|
149
|
+
return;
|
|
150
|
+
const generation = ++this.scheduleGeneration;
|
|
151
|
+
if (this.timer)
|
|
152
|
+
clearTimeout(this.timer);
|
|
153
|
+
this.timer = undefined;
|
|
154
|
+
await this.options.coordinator.refresh();
|
|
155
|
+
if (this.stopped || generation !== this.scheduleGeneration)
|
|
156
|
+
return;
|
|
157
|
+
this.schedule();
|
|
158
|
+
}
|
|
159
|
+
stop() {
|
|
160
|
+
this.stopped = true;
|
|
161
|
+
this.scheduleGeneration += 1;
|
|
162
|
+
if (this.timer)
|
|
163
|
+
clearTimeout(this.timer);
|
|
164
|
+
this.timer = undefined;
|
|
165
|
+
}
|
|
166
|
+
hasTimer() { return this.timer !== undefined; }
|
|
167
|
+
schedule() {
|
|
168
|
+
if (this.stopped)
|
|
169
|
+
return;
|
|
170
|
+
const due = [];
|
|
171
|
+
for (const projectId of this.options.coordinator.enabledProjectIds()) {
|
|
172
|
+
const store = this.options.coordinator.store(projectId);
|
|
173
|
+
if (!store)
|
|
174
|
+
continue;
|
|
175
|
+
const handle = this.options.handle(projectId, store);
|
|
176
|
+
if (!handle)
|
|
177
|
+
continue;
|
|
178
|
+
for (const definition of store.list().filter((item) => item.enabled)) {
|
|
179
|
+
due.push({ at: Date.parse(store.state(definition.id)?.nextCheckAt ?? new Date().toISOString()), definition, scheduler: new ProjectAutomationScheduler(handle) });
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
if (!due.length)
|
|
183
|
+
return;
|
|
184
|
+
due.sort((a, b) => a.at - b.at);
|
|
185
|
+
const next = due[0];
|
|
186
|
+
this.timer = setTimeout(() => {
|
|
187
|
+
this.timer = undefined;
|
|
188
|
+
void next.scheduler.check(next.definition).catch(() => undefined).finally(() => this.schedule());
|
|
189
|
+
}, Math.max(0, next.at - (this.options.now?.() ?? Date.now())));
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
//# sourceMappingURL=scheduler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scheduler.js","sourceRoot":"","sources":["../../src/automations/scheduler.ts"],"names":[],"mappings":"AAsBA;+BAC+B;AAC/B,MAAM,oBAAoB;IAChB,IAAI,GAAqB,OAAO,CAAC,OAAO,EAAE,CAAC;IACnD,GAAG,CAAI,SAA2B;QAChC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;QACrD,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QAC3C,OAAO,OAAO,CAAC;IACjB,CAAC;CACF;AACD,MAAM,cAAc,GAAG,IAAI,oBAAoB,EAAE,CAAC;AAElD,MAAM,OAAO,0BAA0B;IACR,MAAM;IAAnC,YAA6B,MAA+B;sBAA/B,MAAM;IAA4B,CAAC;IAEhE,KAAK,CAAC,KAAK,CAAC,UAAgC,EAAE,IAAI,GAA0B,SAAS;QACnF,MAAM,aAAa,GAAG,IAAI,KAAK,SAAS,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;QAChE,IAAI,aAAa;YAAE,IAAI,GAAG,SAAS,CAAC;QACpC,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC;QAC9B,MAAM,KAAK,GAAG,KAAK,CAAC,YAAY,EAAE,CAAC;QACnC,IAAI,CAAC,KAAK;YAAE,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAC;QACnF,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC3B,IAAI,UAA0E,CAAC;QAC/E,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC;YAC/C,IAAI,KAAK,CAAC,YAAY,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,YAAY,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;gBACtE,MAAM,IAAI,KAAK,CAAC,kCAAkC,KAAK,CAAC,YAAY,EAAE,CAAC,CAAC;YAC1E,CAAC;YACD,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,SAAS,IAAI,KAAK,CAAC,UAAU,CAAC;YAC1D,MAAM,YAAY,GAAG,KAAK;gBACxB,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC,CAAC,WAAW,EAAE;gBACrD,CAAC,CAAC,SAAS,CAAC;YACd,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CACnE,IAAI,CAAC,MAAM,CAAC,KAAK,EACjB,IAAI,CAAC,MAAM,CAAC,IAAI,EAChB,UAAU,EACV,EAAE,KAAK,EAAE,YAAY,EAAE,CACxB,CAAC,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,SAAS,EAAE,EAAE;gBACtD,IAAI,KAAK,CAAC,UAAU,IAAI,SAAS,CAAC,SAAS,IAAI,KAAK,CAAC,UAAU;oBAAE,OAAO,KAAK,CAAC;gBAC9E,IAAI,CAAC,KAAK,CAAC,MAAM;oBAAE,OAAO,IAAI,CAAC;gBAC/B,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,OAAO,CAAC;gBAC7D,OAAO,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,OAAO,CAAC;YACpD,CAAC,CAAC,CAAC;YACH,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;gBAC7C,KAAK,MAAM,SAAS,IAAI,QAAQ;oBAAE,MAAM,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;YAC7E,CAAC;YACD,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;gBACvB,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;gBACrC,MAAM,MAAM,GAAG,WAAW,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;gBACxD,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,EAAE;oBAC5B,GAAG,KAAK;oBACR,QAAQ,EAAE,UAAU,CAAC,QAAQ;oBAC7B,MAAM;oBACN,mBAAmB,EAAE,MAAM,CAAC,SAAS,IAAI,MAAM,EAAE,UAAU;wBACzD,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE;wBAChE,CAAC,CAAC,SAAS;oBACb,aAAa,EAAE,GAAG;oBAClB,WAAW,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,UAAU,CAAC,eAAe,GAAG,KAAK,CAAC,CAAC,WAAW,EAAE;oBACpF,mBAAmB,EAAE,CAAC;oBACtB,YAAY,EAAE,SAAS;iBACxB,CAAC,CAAC;YACL,CAAC;iBAAM,IAAI,aAAa,EAAE,CAAC;gBACzB,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,EAAE;oBAC5B,GAAG,KAAK;oBACR,QAAQ,EAAE,UAAU,CAAC,QAAQ;oBAC7B,WAAW,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,UAAU,CAAC,eAAe,GAAG,KAAK,CAAC,CAAC,WAAW,EAAE;iBACrF,CAAC,CAAC;YACL,CAAC;YACD,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,UAAU,CAAC,EAAE,EAAE,UAAU,CAAC,QAAQ,CAAC,CAAC;YAC3D,UAAU,GAAG,IAAI,KAAK,SAAS;gBAC7B,CAAC,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,yBAAyB,QAAQ,CAAC,MAAM,SAAS,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,2BAA2B,EAAE;gBAC9I,CAAC,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,4BAA4B,EAAE,CAAC;YACjE,OAAO,EAAE,GAAG,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC;QAC7C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,IAAI,KAAK,SAAS;gBAAE,IAAI,CAAC,aAAa,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;;gBACzD,KAAK,CAAC,SAAS,CAAC,EAAE,YAAY,EAAE,UAAU,CAAC,EAAE,EAAE,QAAQ,EAAE,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YACtK,MAAM,KAAK,CAAC;QACd,CAAC;gBAAS,CAAC;YACT,IAAI,UAAU;gBAAE,KAAK,CAAC,SAAS,CAAC,EAAE,YAAY,EAAE,UAAU,CAAC,EAAE,EAAE,QAAQ,EAAE,UAAU,CAAC,QAAQ,EAAE,GAAG,UAAU,EAAE,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC;YACjJ,IAAI,CAAC;gBAAC,KAAK,CAAC,YAAY,EAAE,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC,CAAC,4DAA4D,CAAC,CAAC;YACpG,KAAK,CAAC,OAAO,EAAE,CAAC;QAClB,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,MAAM,CAAC,UAAgC,EAAE,SAA0B;QAC/E,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,EAAE,YAAY,EAAE,UAAU,CAAC,EAAE,EAAE,QAAQ,EAAE,UAAU,CAAC,QAAQ,EAAE,OAAO,EAAE,SAAS,CAAC,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC;QACxJ,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,YAAY,EAAE,UAAU,CAAC,EAAE,EAAE,QAAQ,EAAE,UAAU,CAAC,QAAQ,EAAE,KAAK,EAAE,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,iEAAiE,EAAE,YAAY,EAAE,SAAS,CAAC,MAAM,EAAE,WAAW,EAAE,SAAS,CAAC,KAAK,EAAE,SAAS,EAAE,SAAS,CAAC,GAAG,EAAE,CAAC,CAAC;YAC5S,OAAO;QACT,CAAC;QACD,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,MAAO,CAAC,UAAU,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC;YACrF,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,EAAE,GAAG,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,QAAQ,CAAC,KAAK,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;YAChI,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,YAAY,EAAE,UAAU,CAAC,EAAE,EAAE,QAAQ,EAAE,UAAU,CAAC,QAAQ,EAAE,KAAK,EAAE,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,KAAK,EAAE,QAAQ,CAAC,KAAK,EAAE,YAAY,EAAE,SAAS,CAAC,MAAM,EAAE,WAAW,EAAE,SAAS,CAAC,KAAK,EAAE,SAAS,EAAE,SAAS,CAAC,GAAG,EAAE,CAAC,CAAC;QACvR,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,EAAE,GAAG,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;YAC5K,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAEO,aAAa,CAAC,UAAgC,EAAE,KAAc;QACpE,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC;QAC3D,MAAM,QAAQ,GAAG,CAAC,KAAK,CAAC,mBAAmB,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QACtD,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,MAAM,EAAE,MAAM,GAAG,CAAC,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC;QACtE,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,EAAE;YACxC,GAAG,KAAK;YACR,mBAAmB,EAAE,QAAQ;YAC7B,YAAY,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,CAAC,WAAW,EAAE;YACxD,WAAW,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,CAAC,WAAW,EAAE;SACxD,CAAC,CAAC;QACH,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,YAAY,EAAE,UAAU,CAAC,EAAE,EAAE,QAAQ,EAAE,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC7K,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,UAAU,CAAC,EAAE,EAAE,UAAU,CAAC,QAAQ,CAAC,CAAC;IAC7D,CAAC;CACF;AAED,SAAS,WAAW,CAClB,OAA+D,EAC/D,QAA+D;IAE/D,IAAI,CAAC,QAAQ;QAAE,OAAO,OAAO,CAAC;IAC9B,IAAI,CAAC,OAAO;QAAE,OAAO,QAAQ,CAAC;IAC9B,MAAM,KAAK,GAAG,QAAQ,CAAC,SAAS,CAAC,aAAa,CAAC,OAAO,CAAC,SAAS,CAAC;WAC5D,QAAQ,CAAC,UAAU,CAAC,aAAa,CAAC,OAAO,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC;IACjE,OAAO,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC;AACxC,CAAC;AAQD,sFAAsF;AACtF,MAAM,OAAO,4BAA4B;IAIV,OAAO;IAH5B,KAAK,CAAiC;IACtC,OAAO,GAAG,IAAI,CAAC;IACf,kBAAkB,GAAG,CAAC,CAAC;IAC/B,YAA6B,OAA4C;uBAA5C,OAAO;IAAwC,CAAC;IAE7E,KAAK,CAAC,KAAK;QACT,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;QACrB,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;IAC1B,CAAC;IAED,KAAK,CAAC,UAAU;QACd,IAAI,IAAI,CAAC,OAAO;YAAE,OAAO;QACzB,MAAM,UAAU,GAAG,EAAE,IAAI,CAAC,kBAAkB,CAAC;QAC7C,IAAI,IAAI,CAAC,KAAK;YAAE,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACzC,IAAI,CAAC,KAAK,GAAG,SAAS,CAAC;QACvB,MAAM,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC;QACzC,IAAI,IAAI,CAAC,OAAO,IAAI,UAAU,KAAK,IAAI,CAAC,kBAAkB;YAAE,OAAO;QACnE,IAAI,CAAC,QAAQ,EAAE,CAAC;IAClB,CAAC;IAED,IAAI;QACF,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACpB,IAAI,CAAC,kBAAkB,IAAI,CAAC,CAAC;QAC7B,IAAI,IAAI,CAAC,KAAK;YAAE,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACzC,IAAI,CAAC,KAAK,GAAG,SAAS,CAAC;IACzB,CAAC;IAED,QAAQ,KAAc,OAAO,IAAI,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC;IAEhD,QAAQ;QACd,IAAI,IAAI,CAAC,OAAO;YAAE,OAAO;QACzB,MAAM,GAAG,GAAmG,EAAE,CAAC;QAC/G,KAAK,MAAM,SAAS,IAAI,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,iBAAiB,EAAE,EAAE,CAAC;YACrE,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;YACxD,IAAI,CAAC,KAAK;gBAAE,SAAS;YACrB,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;YACrD,IAAI,CAAC,MAAM;gBAAE,SAAS;YACtB,KAAK,MAAM,UAAU,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;gBACrE,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC,EAAE,WAAW,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,EAAE,UAAU,EAAE,SAAS,EAAE,IAAI,0BAA0B,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YACnK,CAAC;QACH,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,MAAM;YAAE,OAAO;QACxB,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC;QAChC,MAAM,IAAI,GAAG,GAAG,CAAC,CAAC,CAAE,CAAC;QACrB,IAAI,CAAC,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;YAC3B,IAAI,CAAC,KAAK,GAAG,SAAS,CAAC;YACvB,KAAK,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;QACnG,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;IAClE,CAAC;CACF"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { type AutomationDefinition, type AutomationLogRecord, type AutomationReceipt, type AutomationRuntimeState } from './types.ts';
|
|
2
|
+
import type { GithubCandidate } from './github-poller.ts';
|
|
3
|
+
export interface AutomationStoreOptions {
|
|
4
|
+
warn?: (message: string) => void;
|
|
5
|
+
now?: () => Date;
|
|
6
|
+
}
|
|
7
|
+
export declare class AutomationStore {
|
|
8
|
+
readonly dataDir: string;
|
|
9
|
+
private readonly options;
|
|
10
|
+
private definitionsFile;
|
|
11
|
+
private stateFile;
|
|
12
|
+
private definitions;
|
|
13
|
+
private warned;
|
|
14
|
+
private logSeq;
|
|
15
|
+
private readonly now;
|
|
16
|
+
private readonly secrets;
|
|
17
|
+
static open(dataDir: string, options?: AutomationStoreOptions): AutomationStore;
|
|
18
|
+
private constructor();
|
|
19
|
+
list(): AutomationDefinition[];
|
|
20
|
+
get(id: string): AutomationDefinition | undefined;
|
|
21
|
+
create(input: Omit<AutomationDefinition, 'id' | 'revision' | 'createdAt' | 'updatedAt'>, id?: string): AutomationDefinition;
|
|
22
|
+
update(id: string, expectedRevision: number, input: Omit<AutomationDefinition, 'id' | 'revision' | 'createdAt' | 'updatedAt'>): AutomationDefinition;
|
|
23
|
+
delete(id: string): boolean;
|
|
24
|
+
state(id: string): AutomationRuntimeState | undefined;
|
|
25
|
+
setState(id: string, state: AutomationRuntimeState): void;
|
|
26
|
+
receipts(): AutomationReceipt[];
|
|
27
|
+
latestReceipts(): Map<string, AutomationReceipt>;
|
|
28
|
+
appendReceipt(receipt: AutomationReceipt): void;
|
|
29
|
+
reserveReceipt(input: {
|
|
30
|
+
automationId: string;
|
|
31
|
+
revision: number;
|
|
32
|
+
eventId: string;
|
|
33
|
+
candidate?: GithubCandidate;
|
|
34
|
+
}): AutomationReceipt | undefined;
|
|
35
|
+
appendLog(record: Omit<AutomationLogRecord, 'seq' | 'ts'> & Partial<Pick<AutomationLogRecord, 'ts'>>): AutomationLogRecord;
|
|
36
|
+
logs(options?: {
|
|
37
|
+
automationId?: string;
|
|
38
|
+
result?: AutomationLogRecord['result'];
|
|
39
|
+
event?: AutomationLogRecord['event'];
|
|
40
|
+
since?: string;
|
|
41
|
+
cursor?: number;
|
|
42
|
+
limit?: number;
|
|
43
|
+
}): AutomationLogRecord[];
|
|
44
|
+
compact(): void;
|
|
45
|
+
maybeCompact(): void;
|
|
46
|
+
acquireLease(staleAfterMs?: number): AutomationLease | undefined;
|
|
47
|
+
private load;
|
|
48
|
+
private loadDefinitions;
|
|
49
|
+
private persistDefinitions;
|
|
50
|
+
private isTombstoned;
|
|
51
|
+
private pruneTombstones;
|
|
52
|
+
private readJson;
|
|
53
|
+
private readNdjson;
|
|
54
|
+
private atomicJson;
|
|
55
|
+
private appendNdjson;
|
|
56
|
+
private rewriteNdjson;
|
|
57
|
+
private warnOnce;
|
|
58
|
+
}
|
|
59
|
+
export declare class AutomationLease {
|
|
60
|
+
private readonly path;
|
|
61
|
+
private readonly fd;
|
|
62
|
+
private released;
|
|
63
|
+
constructor(path: string, fd: number);
|
|
64
|
+
release(): void;
|
|
65
|
+
}
|
|
@@ -0,0 +1,298 @@
|
|
|
1
|
+
import { closeSync, existsSync, mkdirSync, openSync, readFileSync, renameSync, statSync, unlinkSync, writeFileSync, } from 'node:fs';
|
|
2
|
+
import { randomUUID } from 'node:crypto';
|
|
3
|
+
import { collectSecretValues, redactDeep } from '../core/secret-redaction.js';
|
|
4
|
+
import { join } from 'node:path';
|
|
5
|
+
import { automationDefinitionSchema, automationDefinitionsFileSchema, automationLogRecordSchema, automationReceiptSchema, automationStateFileSchema, } from './types.js';
|
|
6
|
+
const DEFINITIONS = 'automations.json';
|
|
7
|
+
const STATE = 'automation-state.json';
|
|
8
|
+
const RECEIPTS = 'automation-receipts.ndjson';
|
|
9
|
+
const LOG = 'automation-log.ndjson';
|
|
10
|
+
const POLL_LOCK = 'automation-poll.lock';
|
|
11
|
+
const RETENTION_MS = 90 * 24 * 60 * 60 * 1_000;
|
|
12
|
+
export class AutomationStore {
|
|
13
|
+
dataDir;
|
|
14
|
+
options;
|
|
15
|
+
definitionsFile = { version: 1, automations: [] };
|
|
16
|
+
stateFile = { version: 1, states: {} };
|
|
17
|
+
definitions = new Map();
|
|
18
|
+
warned = new Set();
|
|
19
|
+
logSeq = 0;
|
|
20
|
+
now;
|
|
21
|
+
secrets = collectSecretValues();
|
|
22
|
+
static open(dataDir, options = {}) {
|
|
23
|
+
const store = new AutomationStore(dataDir, options);
|
|
24
|
+
store.load();
|
|
25
|
+
return store;
|
|
26
|
+
}
|
|
27
|
+
constructor(dataDir, options) {
|
|
28
|
+
this.dataDir = dataDir;
|
|
29
|
+
this.options = options;
|
|
30
|
+
this.now = options.now ?? (() => new Date());
|
|
31
|
+
}
|
|
32
|
+
list() {
|
|
33
|
+
return [...this.definitions.values()].sort((a, b) => a.name.localeCompare(b.name));
|
|
34
|
+
}
|
|
35
|
+
get(id) {
|
|
36
|
+
return this.definitions.get(id);
|
|
37
|
+
}
|
|
38
|
+
create(input, id = randomUUID()) {
|
|
39
|
+
if (this.definitions.has(id) || this.isTombstoned(id))
|
|
40
|
+
throw new Error('automation id unavailable');
|
|
41
|
+
const now = this.now().toISOString();
|
|
42
|
+
const definition = automationDefinitionSchema.parse({
|
|
43
|
+
...input,
|
|
44
|
+
id,
|
|
45
|
+
revision: 1,
|
|
46
|
+
createdAt: now,
|
|
47
|
+
updatedAt: now,
|
|
48
|
+
});
|
|
49
|
+
this.definitions.set(id, definition);
|
|
50
|
+
this.persistDefinitions();
|
|
51
|
+
return definition;
|
|
52
|
+
}
|
|
53
|
+
update(id, expectedRevision, input) {
|
|
54
|
+
const current = this.definitions.get(id);
|
|
55
|
+
if (!current)
|
|
56
|
+
throw new Error('automation not found');
|
|
57
|
+
if (current.revision !== expectedRevision)
|
|
58
|
+
throw new Error('automation revision conflict');
|
|
59
|
+
const definition = automationDefinitionSchema.parse({
|
|
60
|
+
...current,
|
|
61
|
+
...input,
|
|
62
|
+
id,
|
|
63
|
+
revision: current.revision + 1,
|
|
64
|
+
createdAt: current.createdAt,
|
|
65
|
+
updatedAt: this.now().toISOString(),
|
|
66
|
+
});
|
|
67
|
+
this.definitions.set(id, definition);
|
|
68
|
+
const state = this.state(id);
|
|
69
|
+
if (state)
|
|
70
|
+
this.setState(id, { ...state, revision: definition.revision });
|
|
71
|
+
this.persistDefinitions();
|
|
72
|
+
return definition;
|
|
73
|
+
}
|
|
74
|
+
delete(id) {
|
|
75
|
+
if (!this.definitions.delete(id))
|
|
76
|
+
return false;
|
|
77
|
+
this.definitionsFile.tombstones = {
|
|
78
|
+
...this.definitionsFile.tombstones,
|
|
79
|
+
[id]: this.now().toISOString(),
|
|
80
|
+
};
|
|
81
|
+
this.persistDefinitions();
|
|
82
|
+
return true;
|
|
83
|
+
}
|
|
84
|
+
state(id) {
|
|
85
|
+
return this.stateFile.states[id];
|
|
86
|
+
}
|
|
87
|
+
setState(id, state) {
|
|
88
|
+
this.stateFile.states = { ...this.stateFile.states, [id]: state };
|
|
89
|
+
this.atomicJson(STATE, this.stateFile);
|
|
90
|
+
}
|
|
91
|
+
receipts() {
|
|
92
|
+
return this.readNdjson(RECEIPTS, automationReceiptSchema);
|
|
93
|
+
}
|
|
94
|
+
latestReceipts() {
|
|
95
|
+
const latest = new Map();
|
|
96
|
+
for (const row of this.receipts())
|
|
97
|
+
latest.set(row.receiptKey, row);
|
|
98
|
+
return latest;
|
|
99
|
+
}
|
|
100
|
+
appendReceipt(receipt) {
|
|
101
|
+
this.appendNdjson(RECEIPTS, redactDeep(automationReceiptSchema.parse(receipt), this.secrets));
|
|
102
|
+
}
|
|
103
|
+
reserveReceipt(input) {
|
|
104
|
+
const receiptKey = `${input.automationId}:${input.eventId}`;
|
|
105
|
+
if (this.latestReceipts().has(receiptKey))
|
|
106
|
+
return undefined;
|
|
107
|
+
const now = this.now().toISOString();
|
|
108
|
+
const receipt = automationReceiptSchema.parse({
|
|
109
|
+
...input,
|
|
110
|
+
receiptKey,
|
|
111
|
+
receiptId: randomUUID(),
|
|
112
|
+
status: 'reserved',
|
|
113
|
+
observedAt: now,
|
|
114
|
+
updatedAt: now,
|
|
115
|
+
});
|
|
116
|
+
this.appendReceipt(receipt);
|
|
117
|
+
return receipt;
|
|
118
|
+
}
|
|
119
|
+
appendLog(record) {
|
|
120
|
+
const parsed = automationLogRecordSchema.parse({
|
|
121
|
+
...record,
|
|
122
|
+
seq: ++this.logSeq,
|
|
123
|
+
ts: record.ts ?? this.now().toISOString(),
|
|
124
|
+
});
|
|
125
|
+
this.appendNdjson(LOG, redactDeep(parsed, this.secrets));
|
|
126
|
+
return parsed;
|
|
127
|
+
}
|
|
128
|
+
logs(options = {}) {
|
|
129
|
+
const limit = Math.min(Math.max(options.limit ?? 100, 1), 100);
|
|
130
|
+
return this.readNdjson(LOG, automationLogRecordSchema)
|
|
131
|
+
.filter((row) => !options.automationId || row.automationId === options.automationId)
|
|
132
|
+
.filter((row) => !options.result || row.result === options.result)
|
|
133
|
+
.filter((row) => !options.event || row.event === options.event)
|
|
134
|
+
.filter((row) => !options.since || row.ts >= options.since)
|
|
135
|
+
.filter((row) => !options.cursor || row.seq < options.cursor)
|
|
136
|
+
.slice(-limit)
|
|
137
|
+
.reverse();
|
|
138
|
+
}
|
|
139
|
+
compact() {
|
|
140
|
+
const cutoff = this.now().getTime() - RETENTION_MS;
|
|
141
|
+
const latest = [...this.latestReceipts().values()].filter((row) => Date.parse(row.updatedAt) >= cutoff);
|
|
142
|
+
this.rewriteNdjson(RECEIPTS, latest);
|
|
143
|
+
const logs = this.readNdjson(LOG, automationLogRecordSchema);
|
|
144
|
+
this.rewriteNdjson(LOG, logs.slice(-10_000));
|
|
145
|
+
}
|
|
146
|
+
maybeCompact() {
|
|
147
|
+
if (this.receipts().length > 20_000 || this.readNdjson(LOG, automationLogRecordSchema).length > 10_500) {
|
|
148
|
+
this.compact();
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
acquireLease(staleAfterMs = 10 * 60_000) {
|
|
152
|
+
mkdirSync(this.dataDir, { recursive: true });
|
|
153
|
+
const path = join(this.dataDir, POLL_LOCK);
|
|
154
|
+
try {
|
|
155
|
+
const fd = openSync(path, 'wx', 0o600);
|
|
156
|
+
writeFileSync(fd, JSON.stringify({ pid: process.pid, startedAt: this.now().toISOString() }));
|
|
157
|
+
return new AutomationLease(path, fd);
|
|
158
|
+
}
|
|
159
|
+
catch {
|
|
160
|
+
try {
|
|
161
|
+
if (this.now().getTime() - statSync(path).mtimeMs > staleAfterMs) {
|
|
162
|
+
unlinkSync(path);
|
|
163
|
+
return this.acquireLease(staleAfterMs);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
catch {
|
|
167
|
+
// A contender removed the lock or the directory is read-only.
|
|
168
|
+
}
|
|
169
|
+
return undefined;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
load() {
|
|
173
|
+
mkdirSync(this.dataDir, { recursive: true });
|
|
174
|
+
this.loadDefinitions();
|
|
175
|
+
this.stateFile = this.readJson(STATE, automationStateFileSchema, {
|
|
176
|
+
version: 1,
|
|
177
|
+
states: {},
|
|
178
|
+
});
|
|
179
|
+
const logs = this.readNdjson(LOG, automationLogRecordSchema);
|
|
180
|
+
this.logSeq = logs.at(-1)?.seq ?? 0;
|
|
181
|
+
}
|
|
182
|
+
loadDefinitions() {
|
|
183
|
+
this.definitionsFile = this.readJson(DEFINITIONS, automationDefinitionsFileSchema, {
|
|
184
|
+
version: 1,
|
|
185
|
+
automations: [],
|
|
186
|
+
});
|
|
187
|
+
for (const raw of this.definitionsFile.automations) {
|
|
188
|
+
const parsed = automationDefinitionSchema.safeParse(raw);
|
|
189
|
+
if (parsed.success)
|
|
190
|
+
this.definitions.set(parsed.data.id, parsed.data);
|
|
191
|
+
else
|
|
192
|
+
this.warnOnce('definitions', 'Ignored an invalid GitHub automation definition.');
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
persistDefinitions() {
|
|
196
|
+
this.pruneTombstones();
|
|
197
|
+
this.definitionsFile.automations = [...this.definitions.values()];
|
|
198
|
+
this.atomicJson(DEFINITIONS, this.definitionsFile);
|
|
199
|
+
}
|
|
200
|
+
isTombstoned(id) {
|
|
201
|
+
const deletedAt = this.definitionsFile.tombstones?.[id];
|
|
202
|
+
return Boolean(deletedAt && Date.parse(deletedAt) >= this.now().getTime() - RETENTION_MS);
|
|
203
|
+
}
|
|
204
|
+
pruneTombstones() {
|
|
205
|
+
const cutoff = this.now().getTime() - RETENTION_MS;
|
|
206
|
+
this.definitionsFile.tombstones = Object.fromEntries(Object.entries(this.definitionsFile.tombstones ?? {}).filter(([, timestamp]) => Date.parse(timestamp) >= cutoff));
|
|
207
|
+
}
|
|
208
|
+
readJson(filename, schema, fallback) {
|
|
209
|
+
const path = join(this.dataDir, filename);
|
|
210
|
+
if (!existsSync(path))
|
|
211
|
+
return fallback;
|
|
212
|
+
try {
|
|
213
|
+
const parsed = schema.safeParse(JSON.parse(readFileSync(path, 'utf8')));
|
|
214
|
+
if (parsed.success)
|
|
215
|
+
return parsed.data;
|
|
216
|
+
}
|
|
217
|
+
catch {
|
|
218
|
+
// Warn once below.
|
|
219
|
+
}
|
|
220
|
+
this.warnOnce(filename, `Ignored corrupt automation state in ${filename}.`);
|
|
221
|
+
return fallback;
|
|
222
|
+
}
|
|
223
|
+
readNdjson(filename, schema) {
|
|
224
|
+
const path = join(this.dataDir, filename);
|
|
225
|
+
if (!existsSync(path))
|
|
226
|
+
return [];
|
|
227
|
+
const rows = [];
|
|
228
|
+
for (const line of readFileSync(path, 'utf8').split('\n')) {
|
|
229
|
+
if (!line)
|
|
230
|
+
continue;
|
|
231
|
+
try {
|
|
232
|
+
const parsed = schema.safeParse(JSON.parse(line));
|
|
233
|
+
if (parsed.success)
|
|
234
|
+
rows.push(parsed.data);
|
|
235
|
+
else
|
|
236
|
+
this.warnOnce(filename, `Skipped a malformed row in ${filename}.`);
|
|
237
|
+
}
|
|
238
|
+
catch {
|
|
239
|
+
this.warnOnce(filename, `Skipped a malformed row in ${filename}.`);
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
return rows;
|
|
243
|
+
}
|
|
244
|
+
atomicJson(filename, value) {
|
|
245
|
+
mkdirSync(this.dataDir, { recursive: true });
|
|
246
|
+
const path = join(this.dataDir, filename);
|
|
247
|
+
const temporary = `${path}.tmp`;
|
|
248
|
+
writeFileSync(temporary, `${JSON.stringify(value, null, 2)}\n`, { mode: 0o600 });
|
|
249
|
+
renameSync(temporary, path);
|
|
250
|
+
}
|
|
251
|
+
appendNdjson(filename, value) {
|
|
252
|
+
mkdirSync(this.dataDir, { recursive: true });
|
|
253
|
+
const path = join(this.dataDir, filename);
|
|
254
|
+
const fd = openSync(path, 'a', 0o600);
|
|
255
|
+
try {
|
|
256
|
+
writeFileSync(fd, `${JSON.stringify(value)}\n`);
|
|
257
|
+
}
|
|
258
|
+
finally {
|
|
259
|
+
closeSync(fd);
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
rewriteNdjson(filename, rows) {
|
|
263
|
+
const path = join(this.dataDir, filename);
|
|
264
|
+
const temporary = `${path}.tmp`;
|
|
265
|
+
writeFileSync(temporary, rows.map((row) => JSON.stringify(row)).join('\n') + (rows.length ? '\n' : ''), {
|
|
266
|
+
mode: 0o600,
|
|
267
|
+
});
|
|
268
|
+
renameSync(temporary, path);
|
|
269
|
+
}
|
|
270
|
+
warnOnce(key, message) {
|
|
271
|
+
if (this.warned.has(key))
|
|
272
|
+
return;
|
|
273
|
+
this.warned.add(key);
|
|
274
|
+
this.options.warn?.(message);
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
export class AutomationLease {
|
|
278
|
+
path;
|
|
279
|
+
fd;
|
|
280
|
+
released = false;
|
|
281
|
+
constructor(path, fd) {
|
|
282
|
+
this.path = path;
|
|
283
|
+
this.fd = fd;
|
|
284
|
+
}
|
|
285
|
+
release() {
|
|
286
|
+
if (this.released)
|
|
287
|
+
return;
|
|
288
|
+
this.released = true;
|
|
289
|
+
closeSync(this.fd);
|
|
290
|
+
try {
|
|
291
|
+
unlinkSync(this.path);
|
|
292
|
+
}
|
|
293
|
+
catch {
|
|
294
|
+
// Already removed during shutdown cleanup.
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
//# sourceMappingURL=store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/automations/store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { RunStore } from '../runs/store.ts';
|
|
2
|
+
import type { RunManager } from '../workflows/run.ts';
|
|
3
|
+
import type { GithubCandidate } from './github-poller.ts';
|
|
4
|
+
import type { AutomationDefinition } from './types.ts';
|
|
5
|
+
export declare function validateAutomationPrompt(prompt: string): string | null;
|
|
6
|
+
export declare function renderAutomationTask(definition: AutomationDefinition, candidate: GithubCandidate): string;
|
|
7
|
+
export declare function launchAutomationRun(options: {
|
|
8
|
+
root: string;
|
|
9
|
+
manager: RunManager;
|
|
10
|
+
store: RunStore;
|
|
11
|
+
definition: AutomationDefinition;
|
|
12
|
+
candidate: GithubCandidate;
|
|
13
|
+
receiptId: string;
|
|
14
|
+
}): Promise<{
|
|
15
|
+
runId: string;
|
|
16
|
+
}>;
|
|
17
|
+
/** Reserved receipts are reconciled against additive run provenance after restart. */
|
|
18
|
+
export declare function reconcileAutomationReceipts(automationStore: import('./store.js').AutomationStore, runStore: RunStore): number;
|