nomoreide 0.1.77 → 0.1.78
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/core/workflow-triggers.d.ts +41 -7
- package/dist/core/workflow-triggers.js +65 -6
- package/dist/core/workflow-triggers.js.map +1 -1
- package/dist/web/client/assets/{code-editor-JM7t6elV.js → code-editor-BNnBWxdS.js} +1 -1
- package/dist/web/client/assets/index-BQhhJGr0.js +219 -0
- package/dist/web/client/assets/index-GEJPKMXv.css +1 -0
- package/dist/web/client/index.html +2 -2
- package/dist/web/routes/github-context.d.ts +8 -0
- package/dist/web/routes/github-context.js +30 -0
- package/dist/web/routes/github-context.js.map +1 -1
- package/dist/web/server.js +5 -1
- package/dist/web/server.js.map +1 -1
- package/package.json +1 -1
- package/dist/web/client/assets/index-DVWv40o8.css +0 -1
- package/dist/web/client/assets/index-DiiwGRJ1.js +0 -219
|
@@ -12,18 +12,32 @@ import type { TimelineStore } from "./timeline-store.js";
|
|
|
12
12
|
* existing client runner. Pending runs survive until a browser claims them, so
|
|
13
13
|
* an event detected while no tab is open isn't lost.
|
|
14
14
|
*
|
|
15
|
-
*
|
|
16
|
-
* - `error-incident` — {@link ErrorInbox} surfaces a new/repeated incident.
|
|
15
|
+
* Event sources:
|
|
16
|
+
* - `error-incident` — {@link ErrorInbox} surfaces a new/repeated incident (push).
|
|
17
17
|
* - `service-crash` — {@link TimelineStore} records a `service.lifecycle`
|
|
18
|
-
* event with `severity: "error"` (non-zero exit not initiated by the user).
|
|
18
|
+
* event with `severity: "error"` (non-zero exit not initiated by the user) (push).
|
|
19
|
+
* - `ci-failure` — the only **polled** source: an optional `ciSource`
|
|
20
|
+
* reports the current branch's failing CI on an interval. It fires at most
|
|
21
|
+
* once per commit sha (a failing run isn't re-enqueued every poll).
|
|
19
22
|
*/
|
|
20
|
-
export declare const triggerEventSchema: z.ZodEnum<["error-incident", "service-crash"]>;
|
|
23
|
+
export declare const triggerEventSchema: z.ZodEnum<["error-incident", "service-crash", "ci-failure"]>;
|
|
21
24
|
export type TriggerEvent = z.infer<typeof triggerEventSchema>;
|
|
25
|
+
/**
|
|
26
|
+
* A non-null result means the current branch's CI is failing on `sha`. The
|
|
27
|
+
* source returns `null` whenever CI is green, still running, or GitHub is
|
|
28
|
+
* unavailable (no token / remote) — i.e. "nothing to fire".
|
|
29
|
+
*/
|
|
30
|
+
export interface CiFailureSnapshot {
|
|
31
|
+
sha: string;
|
|
32
|
+
branch: string;
|
|
33
|
+
/** Names of the checks / workflow runs that failed. */
|
|
34
|
+
failingChecks: string[];
|
|
35
|
+
}
|
|
22
36
|
export declare const workflowTriggerSchema: z.ZodObject<{
|
|
23
37
|
id: z.ZodString;
|
|
24
38
|
/** The workflow (built-in or user-saved) to run when this fires. */
|
|
25
39
|
workflowId: z.ZodString;
|
|
26
|
-
event: z.ZodEnum<["error-incident", "service-crash"]>;
|
|
40
|
+
event: z.ZodEnum<["error-incident", "service-crash", "ci-failure"]>;
|
|
27
41
|
/** Disabled triggers stay configured but never fire. */
|
|
28
42
|
enabled: z.ZodDefault<z.ZodBoolean>;
|
|
29
43
|
/**
|
|
@@ -39,14 +53,14 @@ export declare const workflowTriggerSchema: z.ZodObject<{
|
|
|
39
53
|
}, "strip", z.ZodTypeAny, {
|
|
40
54
|
id: string;
|
|
41
55
|
workflowId: string;
|
|
42
|
-
event: "error-incident" | "service-crash";
|
|
56
|
+
event: "error-incident" | "service-crash" | "ci-failure";
|
|
43
57
|
enabled: boolean;
|
|
44
58
|
autoRun: boolean;
|
|
45
59
|
filter?: string | undefined;
|
|
46
60
|
}, {
|
|
47
61
|
id: string;
|
|
48
62
|
workflowId: string;
|
|
49
|
-
event: "error-incident" | "service-crash";
|
|
63
|
+
event: "error-incident" | "service-crash" | "ci-failure";
|
|
50
64
|
filter?: string | undefined;
|
|
51
65
|
enabled?: boolean | undefined;
|
|
52
66
|
autoRun?: boolean | undefined;
|
|
@@ -69,6 +83,16 @@ interface WorkflowTriggerManagerOptions {
|
|
|
69
83
|
configStore: ConfigStore;
|
|
70
84
|
errorInbox: ErrorInbox;
|
|
71
85
|
timelineStore: TimelineStore;
|
|
86
|
+
/**
|
|
87
|
+
* Polled CI source for `ci-failure` triggers. Omit to disable the source
|
|
88
|
+
* (e.g. tests that don't exercise CI, or when GitHub is never configured).
|
|
89
|
+
*/
|
|
90
|
+
ciSource?: () => Promise<CiFailureSnapshot | null>;
|
|
91
|
+
/**
|
|
92
|
+
* How often {@link ciSource} is polled. `0` disables the internal timer —
|
|
93
|
+
* tests drive {@link WorkflowTriggerManager.pollCiOnce} by hand instead.
|
|
94
|
+
*/
|
|
95
|
+
ciPollIntervalMs?: number;
|
|
72
96
|
/** Max pending runs kept; older ones drop off the front. */
|
|
73
97
|
capacity?: number;
|
|
74
98
|
/** A repeat of the same signature within this window is ignored. */
|
|
@@ -80,6 +104,8 @@ export declare class WorkflowTriggerManager {
|
|
|
80
104
|
private readonly configStore;
|
|
81
105
|
private readonly errorInbox;
|
|
82
106
|
private readonly timelineStore;
|
|
107
|
+
private readonly ciSource?;
|
|
108
|
+
private readonly ciPollIntervalMs;
|
|
83
109
|
private readonly capacity;
|
|
84
110
|
private readonly dedupeWindowMs;
|
|
85
111
|
private readonly now;
|
|
@@ -87,6 +113,7 @@ export declare class WorkflowTriggerManager {
|
|
|
87
113
|
private readonly lastFiredAt;
|
|
88
114
|
private readonly listeners;
|
|
89
115
|
private readonly unsubscribers;
|
|
116
|
+
private ciTimer?;
|
|
90
117
|
private started;
|
|
91
118
|
constructor(options: WorkflowTriggerManagerOptions);
|
|
92
119
|
/** Subscribe to the live event sources. Idempotent. */
|
|
@@ -99,6 +126,13 @@ export declare class WorkflowTriggerManager {
|
|
|
99
126
|
ackPending(id: string): boolean;
|
|
100
127
|
private onIncident;
|
|
101
128
|
private onTimelineEvent;
|
|
129
|
+
/**
|
|
130
|
+
* Poll the CI source once and enqueue a run per matching `ci-failure`
|
|
131
|
+
* trigger. Public so tests can drive it without timers; a no-op when no CI
|
|
132
|
+
* source is wired or no `ci-failure` trigger is enabled (skips the network
|
|
133
|
+
* call entirely in that case).
|
|
134
|
+
*/
|
|
135
|
+
pollCiOnce(): Promise<void>;
|
|
102
136
|
private triggersFor;
|
|
103
137
|
private enqueue;
|
|
104
138
|
}
|
|
@@ -10,12 +10,19 @@ import { z } from "zod";
|
|
|
10
10
|
* existing client runner. Pending runs survive until a browser claims them, so
|
|
11
11
|
* an event detected while no tab is open isn't lost.
|
|
12
12
|
*
|
|
13
|
-
*
|
|
14
|
-
* - `error-incident` — {@link ErrorInbox} surfaces a new/repeated incident.
|
|
13
|
+
* Event sources:
|
|
14
|
+
* - `error-incident` — {@link ErrorInbox} surfaces a new/repeated incident (push).
|
|
15
15
|
* - `service-crash` — {@link TimelineStore} records a `service.lifecycle`
|
|
16
|
-
* event with `severity: "error"` (non-zero exit not initiated by the user).
|
|
16
|
+
* event with `severity: "error"` (non-zero exit not initiated by the user) (push).
|
|
17
|
+
* - `ci-failure` — the only **polled** source: an optional `ciSource`
|
|
18
|
+
* reports the current branch's failing CI on an interval. It fires at most
|
|
19
|
+
* once per commit sha (a failing run isn't re-enqueued every poll).
|
|
17
20
|
*/
|
|
18
|
-
export const triggerEventSchema = z.enum([
|
|
21
|
+
export const triggerEventSchema = z.enum([
|
|
22
|
+
"error-incident",
|
|
23
|
+
"service-crash",
|
|
24
|
+
"ci-failure",
|
|
25
|
+
]);
|
|
19
26
|
export const workflowTriggerSchema = z.object({
|
|
20
27
|
id: z.string().min(1),
|
|
21
28
|
/** The workflow (built-in or user-saved) to run when this fires. */
|
|
@@ -38,6 +45,8 @@ export class WorkflowTriggerManager {
|
|
|
38
45
|
configStore;
|
|
39
46
|
errorInbox;
|
|
40
47
|
timelineStore;
|
|
48
|
+
ciSource;
|
|
49
|
+
ciPollIntervalMs;
|
|
41
50
|
capacity;
|
|
42
51
|
dedupeWindowMs;
|
|
43
52
|
now;
|
|
@@ -45,11 +54,14 @@ export class WorkflowTriggerManager {
|
|
|
45
54
|
lastFiredAt = new Map();
|
|
46
55
|
listeners = new Set();
|
|
47
56
|
unsubscribers = [];
|
|
57
|
+
ciTimer;
|
|
48
58
|
started = false;
|
|
49
59
|
constructor(options) {
|
|
50
60
|
this.configStore = options.configStore;
|
|
51
61
|
this.errorInbox = options.errorInbox;
|
|
52
62
|
this.timelineStore = options.timelineStore;
|
|
63
|
+
this.ciSource = options.ciSource;
|
|
64
|
+
this.ciPollIntervalMs = options.ciPollIntervalMs ?? 60_000;
|
|
53
65
|
this.capacity = options.capacity ?? 50;
|
|
54
66
|
this.dedupeWindowMs = options.dedupeWindowMs ?? 30_000;
|
|
55
67
|
this.now = options.now ?? Date.now;
|
|
@@ -65,10 +77,21 @@ export class WorkflowTriggerManager {
|
|
|
65
77
|
this.unsubscribers.push(this.timelineStore.subscribe((event) => {
|
|
66
78
|
void this.onTimelineEvent(event);
|
|
67
79
|
}));
|
|
80
|
+
if (this.ciSource && this.ciPollIntervalMs > 0) {
|
|
81
|
+
this.ciTimer = setInterval(() => {
|
|
82
|
+
void this.pollCiOnce();
|
|
83
|
+
}, this.ciPollIntervalMs);
|
|
84
|
+
// Don't keep the process alive just for CI polling.
|
|
85
|
+
this.ciTimer.unref?.();
|
|
86
|
+
}
|
|
68
87
|
}
|
|
69
88
|
stop() {
|
|
70
89
|
for (const off of this.unsubscribers.splice(0))
|
|
71
90
|
off();
|
|
91
|
+
if (this.ciTimer) {
|
|
92
|
+
clearInterval(this.ciTimer);
|
|
93
|
+
this.ciTimer = undefined;
|
|
94
|
+
}
|
|
72
95
|
this.started = false;
|
|
73
96
|
}
|
|
74
97
|
subscribe(listener) {
|
|
@@ -113,6 +136,36 @@ export class WorkflowTriggerManager {
|
|
|
113
136
|
});
|
|
114
137
|
}
|
|
115
138
|
}
|
|
139
|
+
/**
|
|
140
|
+
* Poll the CI source once and enqueue a run per matching `ci-failure`
|
|
141
|
+
* trigger. Public so tests can drive it without timers; a no-op when no CI
|
|
142
|
+
* source is wired or no `ci-failure` trigger is enabled (skips the network
|
|
143
|
+
* call entirely in that case).
|
|
144
|
+
*/
|
|
145
|
+
async pollCiOnce() {
|
|
146
|
+
if (!this.ciSource)
|
|
147
|
+
return;
|
|
148
|
+
const triggers = await this.triggersFor("ci-failure");
|
|
149
|
+
if (triggers.length === 0)
|
|
150
|
+
return;
|
|
151
|
+
const snapshot = await this.ciSource().catch(() => null);
|
|
152
|
+
if (!snapshot)
|
|
153
|
+
return;
|
|
154
|
+
const haystack = `${snapshot.branch} ${snapshot.failingChecks.join(" ")}`;
|
|
155
|
+
for (const trigger of triggers) {
|
|
156
|
+
if (!matchesFilter(trigger.filter, haystack))
|
|
157
|
+
continue;
|
|
158
|
+
const checks = snapshot.failingChecks.length
|
|
159
|
+
? `: ${snapshot.failingChecks.join(", ")}`
|
|
160
|
+
: "";
|
|
161
|
+
this.enqueue(trigger, {
|
|
162
|
+
// Fire at most once per failing commit, not every poll.
|
|
163
|
+
signatureCause: `ci:${snapshot.sha}`,
|
|
164
|
+
summary: `CI failed on ${snapshot.branch}${checks}`,
|
|
165
|
+
once: true,
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
}
|
|
116
169
|
async triggersFor(event) {
|
|
117
170
|
const config = await this.configStore.load();
|
|
118
171
|
return config.workflowTriggers.filter((trigger) => trigger.enabled && trigger.event === event);
|
|
@@ -121,8 +174,14 @@ export class WorkflowTriggerManager {
|
|
|
121
174
|
const signature = `${trigger.id}:${cause.signatureCause}`;
|
|
122
175
|
const at = this.now();
|
|
123
176
|
const previous = this.lastFiredAt.get(signature);
|
|
124
|
-
if (previous !== undefined
|
|
125
|
-
|
|
177
|
+
if (previous !== undefined) {
|
|
178
|
+
// `once` signatures (e.g. a CI failure on a given sha) never re-fire;
|
|
179
|
+
// the rest are debounced by the dedupe window.
|
|
180
|
+
if (cause.once)
|
|
181
|
+
return;
|
|
182
|
+
if (at - previous < this.dedupeWindowMs)
|
|
183
|
+
return;
|
|
184
|
+
}
|
|
126
185
|
this.lastFiredAt.set(signature, at);
|
|
127
186
|
const run = {
|
|
128
187
|
id: randomUUID(),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workflow-triggers.js","sourceRoot":"","sources":["../../src/core/workflow-triggers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAMxB
|
|
1
|
+
{"version":3,"file":"workflow-triggers.js","sourceRoot":"","sources":["../../src/core/workflow-triggers.ts"],"names":[],"mappings":"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"}
|